From 632f9751af8d2c6b60945f575e005590d1f1ae85 Mon Sep 17 00:00:00 2001 From: Gael <Gael@WL20-0067.corp.pasteur.fr> Date: Fri, 8 Oct 2021 13:28:24 +0200 Subject: [PATCH] v10.8.3 release --- README.md | 5 + cute_little_R_functions.R | 8853 +++++++++++++++++----------------- cute_little_R_functions.docx | Bin 493524 -> 493745 bytes 3 files changed, 4434 insertions(+), 4424 deletions(-) diff --git a/README.md b/README.md index b4acd9a..28f1782 100644 --- a/README.md +++ b/README.md @@ -170,6 +170,11 @@ Gitlab developers ## WHAT'S NEW IN +### v10.8.3 + +1) fun.test() and fun.slide() debbuged for cute.path + + ### v10.8.2 1) forgot to add fun_gg_scatter() and fun_gg_boxplot() to v10.8.1. Now ok diff --git a/cute_little_R_functions.R b/cute_little_R_functions.R index 1d08a27..91196fa 100644 --- a/cute_little_R_functions.R +++ b/cute_little_R_functions.R @@ -2057,11 +2057,13 @@ fun_test <- function( tempo <- fun_check(data = cute.path, class = "vector", typeof = "character", length = 1, fun.name = function.name) ; eval(ee) if(tempo$problem == FALSE){ if(grepl(x = cute.path, pattern = "^http")){ - tempo.try1 <- any(grepl(x = fun_get_message("source(cute.path)"), pattern = "^[Ee]rror")) + tempo.error1 <- any(grepl(x = fun_get_message("source(cute.path)"), pattern = "^[Ee]rror")) + tempo.error2 <- FALSE }else{ - tempo.try2 <- ! file.exists(cute.path) + tempo.error1 <- FALSE + tempo.error2 <- ! file.exists(cute.path) } - if(tempo.try1 | tempo.try2){ + if(tempo.error1 | tempo.error2){ tempo.cat <- paste0("ERROR IN ", function.name, ": ", ifelse(grepl(x = cute.path, pattern = "^http"), "URL", "FILE"), " PATH INDICATED IN THE cute.path PARAMETER DOES NOT EXISTS:\n", cute.path) text.check <- c(text.check, tempo.cat) arg.check <- c(arg.check, TRUE) @@ -3952,11 +3954,13 @@ fun_slide <- function( tempo <- fun_check(data = cute.path, class = "vector", typeof = "character", length = 1, fun.name = function.name) ; eval(ee) if(tempo$problem == FALSE){ if(grepl(x = cute.path, pattern = "^http")){ - tempo.try1 <- any(grepl(x = fun_get_message("source(cute.path)"), pattern = "^[Ee]rror")) + tempo.error1 <- any(grepl(x = fun_get_message("source(cute.path)"), pattern = "^[Ee]rror")) + tempo.error2 <- FALSE }else{ - tempo.try2 <- ! file.exists(cute.path) + tempo.error1 <- FALSE + tempo.error2 <- ! file.exists(cute.path) } - if(tempo.try1 | tempo.try2){ + if(tempo.error1 | tempo.error2){ tempo.cat <- paste0("ERROR IN ", function.name, ": ", ifelse(grepl(x = cute.path, pattern = "^http"), "URL", "FILE"), " PATH INDICATED IN THE cute.path PARAMETER DOES NOT EXISTS:\n", cute.path) text.check <- c(text.check, tempo.cat) arg.check <- c(arg.check, TRUE) @@ -9043,4261 +9047,4262 @@ fun_get_message <- function( # add horizontal argument and deal any conflict with vertical argument. Start with horizontal = NULL as default. If ! is.null() -> convert vertical if required fun_gg_boxplot <- function( -data1, -y, -categ, -categ.class.order = NULL, -categ.color = NULL, -box.legend.name = NULL, -box.fill = FALSE, -box.width = 0.5, -box.space = 0.1, -box.line.size = 0.75, -box.notch = FALSE, -box.alpha = 1, -box.mean = TRUE, -box.whisker.kind = "std", -box.whisker.width = 0, -dot.color = grey(0.25), -dot.categ = NULL, -dot.categ.class.order = NULL, -dot.legend.name = NULL, -dot.tidy = FALSE, -dot.tidy.bin.nb = 50, -dot.jitter = 0.5, -dot.seed = 2, -dot.size = 3, -dot.alpha = 0.5, -dot.border.size = 0.5, -dot.border.color = NULL, -x.lab = NULL, -x.angle = 0, -y.lab = NULL, -y.lim = NULL, -y.log = "no", -y.tick.nb = NULL, -y.second.tick.nb = 1, -y.include.zero = FALSE, -y.top.extra.margin = 0.05, -y.bottom.extra.margin = 0.05, -stat.pos = "top", -stat.mean = FALSE, -stat.size = 4, -stat.dist = 5, -stat.angle = 0, -vertical = TRUE, -text.size = 12, -title = "", -title.text.size = 8, -legend.show = TRUE, -legend.width = 0.5, -article = TRUE, -grid = FALSE, -add = NULL, -return = FALSE, -return.ggplot = FALSE, -return.gtable = TRUE, -plot = TRUE, -warn.print = FALSE, -lib.path = NULL + data1, + y, + categ, + categ.class.order = NULL, + categ.color = NULL, + box.legend.name = NULL, + box.fill = FALSE, + box.width = 0.5, + box.space = 0.1, + box.line.size = 0.75, + box.notch = FALSE, + box.alpha = 1, + box.mean = TRUE, + box.whisker.kind = "std", + box.whisker.width = 0, + dot.color = grey(0.25), + dot.categ = NULL, + dot.categ.class.order = NULL, + dot.legend.name = NULL, + dot.tidy = FALSE, + dot.tidy.bin.nb = 50, + dot.jitter = 0.5, + dot.seed = 2, + dot.size = 3, + dot.alpha = 0.5, + dot.border.size = 0.5, + dot.border.color = NULL, + x.lab = NULL, + x.angle = 0, + y.lab = NULL, + y.lim = NULL, + y.log = "no", + y.tick.nb = NULL, + y.second.tick.nb = 1, + y.include.zero = FALSE, + y.top.extra.margin = 0.05, + y.bottom.extra.margin = 0.05, + stat.pos = "top", + stat.mean = FALSE, + stat.size = 4, + stat.dist = 5, + stat.angle = 0, + vertical = TRUE, + text.size = 12, + title = "", + title.text.size = 8, + legend.show = TRUE, + legend.width = 0.5, + article = TRUE, + grid = FALSE, + add = NULL, + return = FALSE, + return.ggplot = FALSE, + return.gtable = TRUE, + plot = TRUE, + warn.print = FALSE, + lib.path = NULL ){ -# AIM -# Plot ggplot2 boxplots + dots + means -# For ggplot2 specifications, see: https://ggplot2.tidyverse.org/articles/ggplot2-specs.html -# WARNINGS -# Rows containing NA in data1[, c(y, categ)] will be removed before processing, with a warning (see below) -# Hinges are not computed like in the classical boxplot() function of R. See https://ggplot2.tidyverse.org/reference/geom_boxplot.html -# To have a single box, please create a factor column with a single class and specify the name of this column in the categ argument. For a single set of grouped boxes, create a factor column with a single class and specify this column in categ argument as first element (i.e., as categ1, knowing that categ2 must also be specified in this situation). See categ argument below -# The dot.alpha argument can alter the display of the color boxes when using pdf output -# Size arguments (box.line.size, dot.size, dot.border.size, stat.size, text.size and title.text.size) are in mm. See Hadley comment in https://stackoverflow.com/questions/17311917/ggplot2-the-unit-of-size. See also http://sape.inf.usi.ch/quick-reference/ggplot2/size). Unit object are not accepted, but conversion can be used (e.g., grid::convertUnit(grid::unit(0.2, "inches"), "mm", valueOnly = TRUE)) -# Display seems to be done twice on Windows devices (like a blink). However, no double plots on pdf devices. Thus, the blink remains mysterious -# To remove boxes and have only dots, use box.alpha = 0 -# ARGUMENTS -# data1: data frame containing one column of quantitative values (see the y argument below) and one or two columns of categories (see the categ argument below). Duplicated column names are not allowed -# y: character string of the data1 column name for y-axis (column containing numeric values). Numeric values will be split according to the classes of the column names indicated in the categ argument to generate the boxes and will also be used to plot the dots -# categ: vector of character strings of the data1 column name for categories (column of characters or factors). Must be either one or two column names. If a single column name (further referred to as categ1), then one box per class of categ1. If two column names (further referred to as categ1 and categ2), then one box per class of categ2, which form a group of boxes in each class of categ1. WARNING: no empty classes allowed. To have a single box, create a factor column with a single class and specify the name of this column in the categ argument (here, no categ2 in categ argument). For a single set of grouped boxes, create a factor column with a single class and specify this column in categ argument as first element (i.e., as categ1), in addition to the already used category (as categ2 in this situation) -# categ.class.order: list indicating the order of the classes of categ1 and categ2 represented on the boxplot (the first compartment for categ1 and and the second for categ2). If categ.class.order == NULL, classes are represented according to the alphabetical order. Some compartments can be NULL and others not. See the categ argument for categ1 and categ2 description -# categ.color: vector of color character string for box frames (see the categ argument for categ1 and categ2 description) -# If categ.color == NULL, default colors of ggplot2, whatever categ1 and categ2 -# If categ.color is non-null and only categ1 in categ argument, categ.color can be either: -# (1) a single color string. All the boxes will have this color, whatever the number of classes of categ1 -# (2) a vector of string colors, one for each class of categ1. Each color will be associated according to categ.class.order of categ1 -# (3) a vector or factor of string colors, like if it was one of the column of data1 data frame. WARNING: a single color per class of categ1 and a single class of categ1 per color must be respected -# Color functions, like grey(), hsv(), etc., are also accepted -# Positive integers are also accepted instead of character strings, as long as above rules about length are respected. Integers will be processed by fun_gg_palette() using the maximal integer value among all the integers in categ.color (see fun_gg_palette()) -# If categ.color is non-null and categ1 and categ2 are specified, all the rules described above will apply to categ2 instead of categ1 (colors will be determined for boxes inside a group of boxes) -# box.legend.name: character string of the legend title. If box.legend.name is NULL, then box.legend.name <- categ1 if only categ1 is present, and box.legend.name <- categ2 if categ1 and categ2 are present in the categ argument. Write "" if no legend required. See the categ argument for categ1 and categ2 description -# box.fill: logical. Fill the box? If TRUE, the categ.color argument will be used to generate filled boxplots (the box frames being black) as well as filled outlier dots (the dot border being controlled by the dot.border.color argument). If all the dots are plotted (argument dot.color other than NULL), they will be over the boxes. If FALSE, the categ.color argument will be used to color the box frames and the outlier dot borders. If all the dots are plotted, they will be beneath the boxes -# box.width: single numeric value (from 0 to 1) of width of either boxes or group of boxes -# When categ argument has a single categ1 element (i.e., separate boxes. See the categ argument for categ1 and categ2 description), then each class of categ1 is represented by a single box. In that case, box.width argument defines each box width, from 0 (no box width) to 1 (max box width), but also the space between boxes (the code uses 1 - box.width for the box spaces). Of note, xmin and xmax of the fun_gg_boxplot() output report the box boundaries (around x-axis unit 1, 2, 3, etc., for each box) -# When categ argument has a two categ1 and categ2 elements (i.e., grouped boxes), box.width argument defines the width allocated for each set of grouped boxes, from 0 (no group width) to 1 (max group width), but also the space between grouped boxes (the code uses 1 - box.width for the spaces). Of note, xmin and xmax of the fun_gg_boxplot() output report the box boundaries (around x-axis unit 1, 2, 3, etc., for each set of grouped box) -# box.space: single numeric value (from 0 to 1) indicating the box separation inside grouped boxes, when categ argument has a two categ1 and categ2 elements. 0 means no space and 1 means boxes shrunk to a vertical line. Ignored if categ argument has a single categ1 element -# box.line.size: single numeric value of line width of boxes and whiskers in mm -# box.notch: logical. Notched boxplot? It TRUE, display notched boxplot, notches corresponding approximately to the 95% confidence interval of the median (the notch interval is exactly 1.58 x Inter Quartile Range (IQR) / sqrt(n), with n the number of values that made the box). If notch intervals between two boxes do not overlap, it can be interpreted as significant median differences -# box.alpha: single numeric value (from 0 to 1) of box transparency (full transparent to full opaque, respectively). To remove boxplots, use box.alpha = 0 -# box.mean: logical. Add mean value? If TRUE, a diamond-shaped dot, with the horizontal diagonal corresponding to the mean value, is displayed over each boxplot -# box.whisker.kind: range of the whiskers. Either "no" (no whiskers), or "std" (length of each whisker equal to 1.5 x Inter Quartile Range (IQR)), or "max" (length of the whiskers up or down to the most distant dot) -# box.whisker.width: single numeric value (from 0 to 1) of the whisker width, with 0 meaning no whiskers and 1 meaning a width equal to the box width -# dot.color: vector of color character string ruling the dot colors and the dot display. See the example section below for easier understanding of the rules described here -# If NULL, no dots plotted -# If "same", the dots will have the same colors as the respective boxplots -# Otherwise, as in the rule (1), (2) or (3) described in the categ.color argument, except that in the possibility (3), the rule "a single color per class of categ and a single class of categ per color", does not have to be respected (for instance, each dot can have a different color). Colors will also depend on the dot.categ argument. If dot.categ is NULL, then colors will be applied to each class of the last column name specified in categ. If dot.categ is non-NULL, colors will be applied to each class of the column name specified in dot.categ. See examples -# dot.categ: optional single character string of a column name (further referred to as categ3) of the data1 argument. This column of data1 will be used to generate a legend for dots, in addition to the legend for boxes. See the dot.color argument for details about the way the legend is built using the two dot.categ and dot.color arguments. If NULL, no legend created and the colors of dots will depend on dot.color and categ arguments (as explained in the dot.color argument) -# dot.categ.class.order: optional vector of character strings indicating the order of the classes of categ3 (see the dot.categ argument). If dot.categ is non-NULL and dot.categ.class.order is NULL, classes are displayed in the legend according to the alphabetical order. Ignored if dot.categ is NULL -# dot.legend.name: optional character string of the legend title for categ3 (see the dot.categ argument). If dot.legend.name == NULL, dot.categ value is used (name of the column in data1). Write "" if no legend required. Ignored if dot.categ is NULL -# dot.tidy: logical. Nice dot spreading? If TRUE, use the geom_dotplot() function for a nice representation. WARNING: change the true quantitative coordinates of dots (i.e., y-axis values for vertical display) because of binning. Thus, the gain in aestheticism is associated with a loss in precision that can be very important. If FALSE, dots are randomly spread on the qualitative axis, using the dot.jitter argument (see below) keeping the true quantitative coordinates -# dot.tidy.bin.nb: positive integer indicating the number of bins (i.e., nb of separations) of the y.lim range. Each dot will then be put in one of the bin, with a diameter of the width of the bin. In other words, increase the number of bins to have smaller dots. Not considered if dot.tidy is FALSE -# dot.jitter: numeric value (from 0 to 1) of random dot horizontal dispersion (for vertical display), with 0 meaning no dispersion and 1 meaning dispersion in the corresponding box width interval. Not considered if dot.tidy is TRUE -# dot.seed: integer value that set the random seed. Using the same number will generate the same dot jittering. Write NULL to have different jittering each time the same instruction is run. Ignored if dot.tidy is TRUE -# dot.size: numeric value of dot diameter in mm. Not considered if dot.tidy is TRUE -# dot.alpha: numeric value (from 0 to 1) of dot transparency (full transparent to full opaque, respectively) -# dot.border.size: numeric value of border dot width in mm. Write zero for no dot border. If dot.tidy is TRUE, value 0 remove the border and other values leave the border without size control (geom_doplot() feature) -# dot.border.color: single character color string defining the color of the dot border (same color for all the dots, whatever their categories). If dot.border.color == NULL, the border color will be the same as the dot color. A single integer is also accepted instead of a character string, that will be processed by fun_gg_palette() -# x.lab: a character string or expression for x-axis legend. If NULL, character string of categ1 (see the categ argument for categ1 and categ2 description) -# x.angle: integer value of the text angle for the x-axis numbers, using the same rules as in ggplot2. Positive values for counterclockwise rotation: 0 for horizontal, 90 for vertical, 180 for upside down etc. Negative values for clockwise rotation: 0 for horizontal, -90 for vertical, -180 for upside down etc. -# y.lab: a character string or expression for y-axis legend. If NULL, character string of the y argument -# y.lim: 2 numeric values indicating the range of the y-axis. Order matters (for inverted axis). If NULL, the range of the x column name of data1 will be used. -# y.log: either "no", "log2" (values in the y argument column of the data1 data frame will be log2 transformed and y-axis will be log2 scaled) or "log10" (values in the y argument column of the data1 data frame will be log10 transformed and y-axis will be log10 scaled). WARNING: not possible to have horizontal boxes with a log axis, due to a bug in ggplot2 (see https://github.com/tidyverse/ggplot2/issues/881) -# y.tick.nb: approximate number of desired values labeling the y-axis (i.e., main ticks, see the n argument of the the cute::fun_scale() function). If NULL and if y.log is "no", then the number of labeling values is set by ggplot2. If NULL and if y.log is "log2" or "log10", then the number of labeling values corresponds to all the exposant integers in the y.lim range (e.g., 10^1, 10^2 and 10^3, meaning 3 main ticks for y.lim = c(9, 1200)). WARNING: if non-NULL and if y.log is "log2" or "log10", labeling can be difficult to read (e.g., ..., 10^2, 10^2.5, 10^3, ...) -# y.second.tick.nb: number of desired secondary ticks between main ticks. Ignored if y.log is other than "no" (log scale plotted). Use argument return = TRUE and see $plot$y.second.tick.values to have the values associated to secondary ticks. IF NULL, no secondary ticks -# y.include.zero: logical. Does y.lim range include 0? Ignored if y.log is "log2" or "log10" -# y.top.extra.margin: single proportion (between 0 and 1) indicating if extra margins must be added to y.lim. If different from 0, add the range of the axis multiplied by y.top.extra.margin (e.g., abs(y.lim[2] - y.lim[1]) * y.top.extra.margin) to the top of y-axis -# y.bottom.extra.margin: idem as y.top.extra.margin but to the bottom of y-axis -# stat.pos: add the median number above the corresponding box. Either NULL (no number shown), "top" (at the top of the plot region) or "above" (above each box) -# stat.mean: logical. Display mean numbers instead of median numbers? Ignored if stat.pos is NULL -# stat.size: numeric value of the stat font size in mm. Ignored if stat.pos is NULL -# stat.dist: numeric value of the stat distance in percentage of the y-axis range (stat.dist = 5 means move the number displayed at 5% of the y-axis range). Ignored if stat.pos is NULL or "top" -# stat.angle: integer value of the angle of stat, using the same rules as in ggplot2. Positive values for counterclockwise rotation: 0 for horizontal, 90 for vertical, 180 for upside down etc. Negative values for clockwise rotation: 0 for horizontal, -90 for vertical, -180 for upside down etc. -# vertical: logical. Vertical boxes? WARNING: will be automatically set to TRUE if y.log argument is other than "no". Indeed, not possible to have horizontal boxes with a log axis, due to a bug in ggplot2 (see https://github.com/tidyverse/ggplot2/issues/881) -# text.size: numeric value of the font size of the (1) axis numbers, (2) axis labels and (3) texts in the graphic legend (in mm) -# title: character string of the graph title -# title.text.size: numeric value of the title font size in mm -# legend.show: logical. Show legend? Not considered if categ argument is NULL, because this already generate no legend, excepted if legend.width argument is non-NULL. In that specific case (categ is NULL, legend.show is TRUE and legend.width is non-NULL), an empty legend space is created. This can be useful when desiring graphs of exactly the same width, whatever they have legends or not -# legend.width: single proportion (between 0 and 1) indicating the relative width of the legend sector (on the right of the plot) relative to the width of the plot. Value 1 means that the window device width is split in 2, half for the plot and half for the legend. Value 0 means no room for the legend, which will overlay the plot region. Write NULL to inactivate the legend sector. In such case, ggplot2 will manage the room required for the legend display, meaning that the width of the plotting region can vary between graphs, depending on the text in the legend -# article: logical. If TRUE, use an article theme (article like). If FALSE, use a classic related ggplot theme. Use the add argument (e.g., add = "+ggplot2::theme_classic()" for the exact classic ggplot theme -# grid: logical. Draw lines in the background to better read the box values? Not considered if article == FALSE (grid systematically present) -# add: character string allowing to add more ggplot2 features (dots, lines, themes, facet, etc.). Ignored if NULL -# WARNING: (1) the string must start with "+", (2) the string must finish with ")" and (3) each function must be preceded by "ggplot2::". Example: "+ ggplot2::coord_flip() + ggplot2::theme_bw()" -# If the character string contains the "ggplot2::theme" string, then the article argument of fun_gg_boxplot() (see above) is ignored with a warning -# Handle the add argument with caution since added functions can create conflicts with the preexisting internal ggplot2 functions -# WARNING: the call of objects inside the quotes of add can lead to an error if the name of these objects are some of the fun_gg_boxplot() arguments. Indeed, the function will use the internal argument instead of the global environment object. Example article <- "a" in the working environment and add = '+ ggplot2::ggtitle(article)'. The risk here is to have TRUE as title. To solve this, use add = '+ ggplot2::ggtitle(get("article", envir = .GlobalEnv))' -# return: logical. Return the graph parameters? -# return.ggplot: logical. Return the ggplot object in the output list? Ignored if return argument is FALSE. WARNING: always assign the fun_gg_boxplot() function (e.g., a <- fun_gg_boxplot()) if return.ggplot argument is TRUE, otherwise, double plotting is performed. See $ggplot in the RETURN section below for more details -# return.gtable: logical. Return the ggplot object as gtable of grobs in the output list? Ignored if plot argument is FALSE. Indeed, the graph must be plotted to get the grobs dispositions. See $gtable in the RETURN section below for more details -# plot: logical. Plot the graphic? If FALSE and return argument is TRUE, graphical parameters and associated warnings are provided without plotting -# warn.print: logical. Print warnings at the end of the execution? ? If FALSE, warning messages are never printed, but can still be recovered in the returned list. Some of the warning messages (those delivered by the internal ggplot2 functions) are not apparent when using the argument plot = FALSE -# lib.path: character string indicating the absolute path of the required packages (see below). if NULL, the function will use the R library default folders -# RETURN -# A boxplot if plot argument is TRUE -# A list of the graph info if return argument is TRUE: -# $data: the initial data with graphic information added -# $stat: the graphic statistics (mostly equivalent to ggplot_build()$data[[2]]) -# $removed.row.nb: which rows have been removed due to NA/Inf detection in y and categ columns (NULL if no row removed) -# $removed.rows: removed rows (NULL if no row removed) -# $plot: the graphic box and dot coordinates -# $dots: dot coordinates -# $main.box: coordinates of boxes -# $median: median coordinates -# $sup.whisker: coordinates of top whiskers (y for base and y.end for extremities) -# $inf.whisker: coordinates of bottom whiskers (y for base and y.end for extremities) -# $sup.whisker.edge: coordinates of top whisker edges (x and xend) -# $inf.whisker.edge: coordinates of bottom whisker edges(x and xend) -# $mean: diamond mean coordinates (only if box.mean argument is TRUE) -# $stat.pos: coordinates of stat numbers (only if stat.pos argument is not NULL) -# y.second.tick.positions: coordinates of secondary ticks (only if y.second.tick.nb argument is non-NULL or if y.log argument is different from "no") -# y.second.tick.values: values of secondary ticks. NULL except if y.second.tick.nb argument is non-NULL or if y.log argument is different from "no") -# $panel: the variable names used for the panels (NULL if no panels). WARNING: NA can be present according to ggplot2 upgrade to v3.3.0 -# $axes: the x-axis and y-axis info -# $warn: the warning messages. Use cat() for proper display. NULL if no warning. WARNING: warning messages delivered by the internal ggplot2 functions are not apparent when using the argument plot = FALSE -# $ggplot: ggplot object that can be used for reprint (use print(...$ggplot) or update (use ...$ggplot + ggplot2::...). NULL if return.ggplot argument is FALSE. Of note, a non-NULL $ggplot in the output list is sometimes annoying as the manipulation of this list prints the plot -# $gtable: gtable object that can be used for reprint (use gridExtra::grid.arrange(...$ggplot) or with additionnal grobs (see the grob decomposition in the examples). NULL if return.ggplot argument is FALSE. Contrary to $ggplot, a non-NULL $gtable in the output list is not annoying as the manipulation of this list does not print the plot -# REQUIRED PACKAGES -# ggplot2 -# gridExtra -# lemon (in case of use in the add argument) -# scales -# REQUIRED FUNCTIONS FROM THE cute PACKAGE -# fun_check() -# fun_comp_1d() -# fun_comp_2d() -# fun_gg_just() -# fun_gg_palette() -# fun_inter_ticks() -# fun_name_change() -# fun_pack() -# fun_round() -# fun_scale() -# EXAMPLE -# set.seed(1) ; obs1 <- data.frame(Time = c(rnorm(20, 100, 10), rnorm(20, 200, 50), rnorm(20, 500, 60), rnorm(20, 100, 50)), Categ1 = rep(c("CAT", "DOG"), times = 40), Categ2 = rep(c("A", "B", "C", "D"), each = 20), Color1 = rep(c("coral", "lightblue"), times = 40), Color2 = rep(c("#9F2108", "#306100", "#007479", "#8500C0"), each = 20), stringsAsFactors = TRUE) ; set.seed(NULL) ; fun_gg_boxplot(data1 = obs1, y = "Time", categ = "Categ1") -# see http -# DEBUGGING -# set.seed(1) ; obs1 <- data.frame(Time = c(rnorm(10), rnorm(10) + 2), Categ1 = rep(c("G", "H"), each = 10), stringsAsFactors = TRUE) ; set.seed(NULL) ; obs1$Time[1:10] <- NA ; data1 = obs1 ; y = "Time" ; categ = c("Categ1") ; categ.class.order = NULL ; categ.color = NULL ; box.legend.name = NULL ; box.fill = FALSE ; box.width = 0.5 ; box.space = 0.1 ; box.line.size = 0.75 ; box.notch = FALSE ; box.alpha = 1 ; box.mean = TRUE ; box.whisker.kind = "std" ; box.whisker.width = 0 ; dot.color = grey(0.25) ; dot.categ = NULL ; dot.categ.class.order = NULL ; dot.legend.name = NULL ; dot.tidy = FALSE ; dot.tidy.bin.nb = 50 ; dot.jitter = 0.5 ; dot.seed = 2 ; dot.size = 3 ; dot.alpha = 0.5 ; dot.border.size = 0.5 ; dot.border.color = NULL ; x.lab = NULL ; x.angle = 0 ; y.lab = NULL ; y.lim = NULL ; y.log = "no" ; y.tick.nb = NULL ; y.second.tick.nb = 1 ; y.include.zero = FALSE ; y.top.extra.margin = 0.05 ; y.bottom.extra.margin = 0.05 ; stat.pos = "top" ; stat.mean = FALSE ; stat.size = 4 ; stat.dist = 5 ; stat.angle = 0 ; vertical = TRUE ; text.size = 12 ; title = "" ; title.text.size = 8 ; legend.show = TRUE ; legend.width = 0.5 ; article = TRUE ; grid = FALSE ; add = NULL ; return = FALSE ; return.ggplot = FALSE ; return.gtable = TRUE ; plot = TRUE ; warn.print = FALSE ; lib.path = NULL -# function name -function.name <- paste0(as.list(match.call(expand.dots = FALSE))[[1]], "()") -arg.names <- names(formals(fun = sys.function(sys.parent(n = 2)))) # names of all the arguments -arg.user.setting <- as.list(match.call(expand.dots = FALSE))[-1] # list of the argument settings (excluding default values not provided by the user) -# end function name -# required function checking -req.function <- c( -"fun_comp_2d", -"fun_gg_just", -"fun_gg_palette", -"fun_name_change", -"fun_pack", -"fun_check", -"fun_round", -"fun_scale", -"fun_inter_ticks" -) -tempo <- NULL -for(i1 in req.function){ -if(length(find(i1, mode = "function")) == 0L){ -tempo <- c(tempo, i1) -} -} -if( ! is.null(tempo)){ -tempo.cat <- paste0("ERROR IN ", function.name, "\nREQUIRED cute FUNCTION", ifelse(length(tempo) > 1, "S ARE", " IS"), " MISSING IN THE R ENVIRONMENT:\n", paste0(tempo, collapse = "()\n")) -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n"), call. = FALSE) # == in stop() to be able to add several messages between == -} -# end required function checking -# reserved words to avoid bugs (names of dataframe columns used in this function) -reserved.words <- c("categ.check", "categ.color", "dot.color", "dot.categ", "dot.max", "dot.min", "group", "PANEL", "group.check", "MEAN", "tempo.categ1", "tempo.categ2", "text.max.pos", "text.min.pos", "x", "x.y", "y", "y.check", "y_from.dot.max", "ymax", "tidy_group", "binwidth") -# end reserved words to avoid bugs (used in this function) -# arg with no default values -mandat.args <- c( -"data1", -"y", -"categ" -) -tempo <- eval(parse(text = paste0("missing(", paste0(mandat.args, collapse = ") | missing("), ")"))) -if(any(tempo)){ # normally no NA for missing() output -tempo.cat <- paste0("ERROR IN ", function.name, "\nFOLLOWING ARGUMENT", ifelse(length(mandat.args) > 1, "S HAVE", "HAS"), " NO DEFAULT VALUE AND REQUIRE ONE:\n", paste0(mandat.args, collapse = "\n")) -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n"), call. = FALSE) # == in stop() to be able to add several messages between == -} -# end arg with no default values -# argument primary checking -arg.check <- NULL # -text.check <- NULL # -checked.arg.names <- NULL # for function debbuging: used by r_debugging_tools -ee <- expression(arg.check <- c(arg.check, tempo$problem) , text.check <- c(text.check, tempo$text) , checked.arg.names <- c(checked.arg.names, tempo$object.name)) -tempo <- fun_check(data = data1, class = "data.frame", na.contain = TRUE, fun.name = function.name) ; eval(ee) -tempo <- fun_check(data = y, class = "vector", mode = "character", length = 1, fun.name = function.name) ; eval(ee) -tempo <- fun_check(data = categ, class = "vector", mode = "character", fun.name = function.name) ; eval(ee) -if( ! is.null(categ.class.order)){ -tempo <- fun_check(data = categ.class.order, class = "list", fun.name = function.name) ; eval(ee) -}else{ -# no fun_check test here, it is just for checked.arg.names -tempo <- fun_check(data = categ.class.order, class = "vector") -checked.arg.names <- c(checked.arg.names, tempo$object.name) -} -if( ! is.null(box.legend.name)){ -tempo <- fun_check(data = box.legend.name, class = "vector", mode = "character", fun.name = function.name) ; eval(ee) -}else{ -# no fun_check test here, it is just for checked.arg.names -tempo <- fun_check(data = box.legend.name, class = "vector") -checked.arg.names <- c(checked.arg.names, tempo$object.name) -} -if( ! is.null(categ.color)){ -tempo1 <- fun_check(data = categ.color, class = "vector", mode = "character", na.contain = TRUE, fun.name = function.name) -tempo2 <- fun_check(data = categ.color, class = "factor", na.contain = TRUE, fun.name = function.name) -checked.arg.names <- c(checked.arg.names, tempo2$object.name) -if(tempo1$problem == TRUE & tempo2$problem == TRUE){ -tempo.check.color <- fun_check(data = categ.color, class = "integer", double.as.integer.allowed = TRUE, na.contain = TRUE, neg.values = FALSE, fun.name = function.name)$problem -if(tempo.check.color == TRUE){ -tempo.cat <- paste0("ERROR IN ", function.name, "\ncateg.color ARGUMENT MUST BE A FACTOR OR CHARACTER VECTOR OR POSITVE INTEGER VECTOR") # integer possible because dealt above -text.check <- c(text.check, tempo.cat) -arg.check <- c(arg.check, TRUE) -}else if(any(categ.color == 0L, na.rm = TRUE)){ -tempo.cat <- paste0("ERROR IN ", function.name, "\ncateg.color ARGUMENT MUST BE A FACTOR OR CHARACTER VECTOR OR POSITVE INTEGER VECTOR") # integer possible because dealt above -text.check <- c(text.check, tempo.cat) -arg.check <- c(arg.check, TRUE) -} -} -}else{ -# no fun_check test here, it is just for checked.arg.names -tempo <- fun_check(data = categ.color, class = "vector") -checked.arg.names <- c(checked.arg.names, tempo$object.name) -} -tempo <- fun_check(data = box.fill, class = "vector", mode = "logical", length = 1, fun.name = function.name) ; eval(ee) -tempo <- fun_check(data = box.width, prop = TRUE, length = 1, fun.name = function.name) ; eval(ee) -tempo <- fun_check(data = box.space, prop = TRUE, length = 1, fun.name = function.name) ; eval(ee) -tempo <- fun_check(data = box.line.size, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) -tempo <- fun_check(data = box.notch, class = "vector", mode = "logical", length = 1, fun.name = function.name) ; eval(ee) -tempo <- fun_check(data = box.alpha, prop = TRUE, length = 1, fun.name = function.name) ; eval(ee) -tempo <- fun_check(data = box.mean, class = "vector", mode = "logical", length = 1, fun.name = function.name) ; eval(ee) -tempo <- fun_check(data = box.whisker.kind, options = c("no", "std", "max"), length = 1, fun.name = function.name) ; eval(ee) -tempo <- fun_check(data = box.whisker.width, prop = TRUE, length = 1, fun.name = function.name) ; eval(ee) -if( ! is.null(dot.color)){ -tempo1 <- fun_check(data = dot.color, class = "vector", mode = "character", na.contain = TRUE, fun.name = function.name) -tempo2 <- fun_check(data = dot.color, class = "factor", na.contain = TRUE, fun.name = function.name) -checked.arg.names <- c(checked.arg.names, tempo2$object.name) -if(tempo1$problem == TRUE & tempo2$problem == TRUE){ -tempo.check.color <- fun_check(data = dot.color, class = "integer", double.as.integer.allowed = TRUE, na.contain = TRUE, neg.values = FALSE, fun.name = function.name)$problem -if(tempo.check.color == TRUE){ -tempo.cat <- paste0("ERROR IN ", function.name, "\ndot.color MUST BE A FACTOR OR CHARACTER VECTOR OR POSITVE INTEGER VECTOR") # integer possible because dealt above -text.check <- c(text.check, tempo.cat) -arg.check <- c(arg.check, TRUE) -}else if(any(dot.color == 0L, na.rm = TRUE)){ -tempo.cat <- paste0("ERROR IN ", function.name, "\ndot.color ARGUMENT MUST BE A FACTOR OR CHARACTER VECTOR OR POSITVE INTEGER VECTOR") # integer possible because dealt above -text.check <- c(text.check, tempo.cat) -arg.check <- c(arg.check, TRUE) -} -} -}else{ -# no fun_check test here, it is just for checked.arg.names -tempo <- fun_check(data = dot.color, class = "vector") -checked.arg.names <- c(checked.arg.names, tempo$object.name) -} -if( ! is.null(dot.categ)){ -tempo <- fun_check(data = dot.categ, class = "vector", mode = "character", length = 1, fun.name = function.name) ; eval(ee) -}else{ -# no fun_check test here, it is just for checked.arg.names -tempo <- fun_check(data = dot.categ, class = "vector") -checked.arg.names <- c(checked.arg.names, tempo$object.name) -} -if( ! is.null(dot.categ.class.order)){ -tempo <- fun_check(data = dot.categ.class.order, class = "vector", mode = "character", fun.name = function.name) ; eval(ee) -}else{ -# no fun_check test here, it is just for checked.arg.names -tempo <- fun_check(data = dot.categ.class.order, class = "vector") -checked.arg.names <- c(checked.arg.names, tempo$object.name) -} -if( ! is.null(dot.legend.name)){ -tempo <- fun_check(data = dot.legend.name, class = "vector", mode = "character", length = 1, fun.name = function.name) ; eval(ee) -}else{ -# no fun_check test here, it is just for checked.arg.names -tempo <- fun_check(data = dot.legend.name, class = "vector") -checked.arg.names <- c(checked.arg.names, tempo$object.name) -} -tempo <- fun_check(data = dot.tidy, class = "vector", mode = "logical", length = 1, fun.name = function.name) ; eval(ee) -tempo <- fun_check(data = dot.tidy.bin.nb, class = "vector", typeof = "integer", length = 1, double.as.integer.allowed = TRUE, neg.values = FALSE, fun.name = function.name) ; eval(ee) -if(tempo$problem == FALSE){ -if(dot.tidy.bin.nb == 0L){ # length and NA checked above -tempo.cat <- paste0("ERROR IN ", function.name, "\ndot.tidy.bin.nb ARGUMENT MUST BE A NON-NULL AND POSITVE INTEGER VALUE") # integer possible because dealt above -text.check <- c(text.check, tempo.cat) -arg.check <- c(arg.check, TRUE) -} -} -tempo <- fun_check(data = dot.jitter, prop = TRUE, length = 1, fun.name = function.name) ; eval(ee) -if( ! is.null(dot.seed)){ -tempo <- fun_check(data = dot.seed, class = "vector", typeof = "integer", length = 1, double.as.integer.allowed = TRUE, neg.values = TRUE, fun.name = function.name) ; eval(ee) -}else{ -# no fun_check test here, it is just for checked.arg.names -tempo <- fun_check(data = dot.seed, class = "vector") -checked.arg.names <- c(checked.arg.names, tempo$object.name) -} -tempo <- fun_check(data = dot.size, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) -tempo <- fun_check(data = dot.alpha, prop = TRUE, length = 1, fun.name = function.name) ; eval(ee) -tempo <- fun_check(data = dot.border.size, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) -if( ! is.null(dot.border.color)){ -tempo1 <- fun_check(data = dot.border.color, class = "vector", mode = "character", length = 1, fun.name = function.name) -tempo2 <- fun_check(data = dot.border.color, class = "vector", typeof = "integer", double.as.integer.allowed = TRUE, length = 1, fun.name = function.name) -checked.arg.names <- c(checked.arg.names, tempo2$object.name) -if(tempo1$problem == TRUE & tempo2$problem == TRUE){ -tempo.cat <- paste0("ERROR IN ", function.name, "\ndot.border.color ARGUMENT MUST BE (1) A HEXADECIMAL COLOR STRING STARTING BY #, OR (2) A COLOR NAME GIVEN BY colors(), OR (3) AN INTEGER VALUE") -text.check <- c(text.check, tempo.cat) -arg.check <- c(arg.check, TRUE) -}else if(tempo1$problem == FALSE & tempo2$problem == TRUE){ -if( ! all(dot.border.color %in% colors() | grepl(pattern = "^#", dot.border.color), na.rm = TRUE)){ -tempo.cat <- paste0("ERROR IN ", function.name, "\ndot.border.color ARGUMENT MUST BE (1) A HEXADECIMAL COLOR STRING STARTING BY #, OR (2) A COLOR NAME GIVEN BY colors(), OR (3) AN INTEGER VALUE") -text.check <- c(text.check, tempo.cat) -arg.check <- c(arg.check, TRUE) -} -} -}else{ -# no fun_check test here, it is just for checked.arg.names -tempo <- fun_check(data = dot.border.color, class = "vector") -checked.arg.names <- c(checked.arg.names, tempo$object.name) -} -if( ! is.null(x.lab)){ -tempo1 <- fun_check(data = x.lab, class = "expression", length = 1, fun.name = function.name) -tempo2 <- fun_check(data = x.lab, class = "vector", mode = "character", length = 1, fun.name = function.name) -checked.arg.names <- c(checked.arg.names, tempo2$object.name) -if(tempo1$problem == TRUE & tempo2$problem == TRUE){ -tempo.cat <- paste0("ERROR IN ", function.name, "\nx.lab ARGUMENT MUST BE A SINGLE CHARACTER STRING OR EXPRESSION") -text.check <- c(text.check, tempo.cat) -arg.check <- c(arg.check, TRUE) -} -}else{ -# no fun_check test here, it is just for checked.arg.names -tempo <- fun_check(data = x.lab, class = "vector") -checked.arg.names <- c(checked.arg.names, tempo$object.name) -} -tempo <- fun_check(data = x.angle, class = "vector", typeof = "integer", double.as.integer.allowed = TRUE, length = 1, neg.values = TRUE, fun.name = function.name) ; eval(ee) -if( ! is.null(y.lab)){ -tempo1 <- fun_check(data = y.lab, class = "expression", length = 1, fun.name = function.name) -tempo2 <- fun_check(data = y.lab, class = "vector", mode = "character", length = 1, fun.name = function.name) -checked.arg.names <- c(checked.arg.names, tempo2$object.name) -if(tempo1$problem == TRUE & tempo2$problem == TRUE){ -tempo.cat <- paste0("ERROR IN ", function.name, "\ny.lab ARGUMENT MUST BE A SINGLE CHARACTER STRING OR EXPRESSION") -text.check <- c(text.check, tempo.cat) -arg.check <- c(arg.check, TRUE) -} -}else{ -# no fun_check test here, it is just for checked.arg.names -tempo <- fun_check(data = y.lab, class = "vector") -checked.arg.names <- c(checked.arg.names, tempo$object.name) -} -if( ! is.null(y.lim)){ -tempo <- fun_check(data = y.lim, class = "vector", mode = "numeric", length = 2, fun.name = function.name) ; eval(ee) -if(tempo$problem == FALSE){ -if(any(is.infinite(y.lim))){ # normally no NA for is.infinite() output -tempo.cat <- paste0("ERROR IN ", function.name, "\ny.lim ARGUMENT CANNOT CONTAIN -Inf OR Inf VALUES") -text.check <- c(text.check, tempo.cat) -arg.check <- c(arg.check, TRUE) -} -} -}else{ -# no fun_check test here, it is just for checked.arg.names -tempo <- fun_check(data = y.lim, class = "vector") -checked.arg.names <- c(checked.arg.names, tempo$object.name) -} -tempo <- fun_check(data = y.log, options = c("no", "log2", "log10"), length = 1, fun.name = function.name) ; eval(ee) -if( ! is.null(y.tick.nb)){ -tempo <- fun_check(data = y.tick.nb, class = "vector", typeof = "integer", length = 1, double.as.integer.allowed = TRUE, fun.name = function.name) ; eval(ee) -if(tempo$problem == FALSE){ -if(y.tick.nb < 0){ -tempo.cat <- paste0("ERROR IN ", function.name, "\ny.tick.nb ARGUMENT MUST BE A NON NULL POSITIVE INTEGER") -text.check <- c(text.check, tempo.cat) -arg.check <- c(arg.check, TRUE) -} -} -}else{ -# no fun_check test here, it is just for checked.arg.names -tempo <- fun_check(data = y.tick.nb, class = "vector") -checked.arg.names <- c(checked.arg.names, tempo$object.name) -} -if( ! is.null(y.second.tick.nb)){ -tempo <- fun_check(data = y.second.tick.nb, class = "vector", typeof = "integer", length = 1, double.as.integer.allowed = TRUE, fun.name = function.name) ; eval(ee) -if(tempo$problem == FALSE){ -if(y.second.tick.nb <= 0){ -tempo.cat <- paste0("ERROR IN ", function.name, "\ny.second.tick.nb ARGUMENT MUST BE A NON NULL POSITIVE INTEGER") -text.check <- c(text.check, tempo.cat) -arg.check <- c(arg.check, TRUE) -} -} -}else{ -# no fun_check test here, it is just for checked.arg.names -tempo <- fun_check(data = y.second.tick.nb, class = "vector") -checked.arg.names <- c(checked.arg.names, tempo$object.name) -} -tempo <- fun_check(data = y.include.zero, class = "vector", mode = "logical", length = 1, fun.name = function.name) ; eval(ee) -tempo <- fun_check(data = y.top.extra.margin, prop = TRUE, length = 1, fun.name = function.name) ; eval(ee) -tempo <- fun_check(data = y.bottom.extra.margin, prop = TRUE, length = 1, fun.name = function.name) ; eval(ee) -if( ! is.null(stat.pos)){ -tempo <- fun_check(data = stat.pos, options = c("top", "above"), length = 1, fun.name = function.name) ; eval(ee) -}else{ -# no fun_check test here, it is just for checked.arg.names -tempo <- fun_check(data = stat.pos, class = "vector") -checked.arg.names <- c(checked.arg.names, tempo$object.name) -} -tempo <- fun_check(data = stat.mean, class = "logical", length = 1, fun.name = function.name) ; eval(ee) -tempo <- fun_check(data = stat.size, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) -tempo <- fun_check(data = stat.dist, class = "vector", mode = "numeric", length = 1, fun.name = function.name) ; eval(ee) -tempo <- fun_check(data = stat.angle, class = "vector", typeof = "integer", double.as.integer.allowed = TRUE, length = 1, neg.values = TRUE, fun.name = function.name) ; eval(ee) -tempo <- fun_check(data = vertical, class = "vector", mode = "logical", length = 1, fun.name = function.name) ; eval(ee) -tempo <- fun_check(data = text.size, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) -tempo <- fun_check(data = title, class = "vector", mode = "character", length = 1, fun.name = function.name) ; eval(ee) -tempo <- fun_check(data = title.text.size, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) -tempo <- fun_check(data = legend.show, class = "logical", length = 1, fun.name = function.name) ; eval(ee) -if( ! is.null(legend.width)){ -tempo <- fun_check(data = legend.width, prop = TRUE, length = 1, fun.name = function.name) ; eval(ee) -}else{ -# no fun_check test here, it is just for checked.arg.names -tempo <- fun_check(data = legend.width, class = "vector") -checked.arg.names <- c(checked.arg.names, tempo$object.name) -} -tempo <- fun_check(data = article, class = "logical", length = 1, fun.name = function.name) ; eval(ee) -tempo <- fun_check(data = grid, class = "logical", length = 1, fun.name = function.name) ; eval(ee) -if( ! is.null(add)){ -tempo <- fun_check(data = add, class = "vector", mode = "character", length = 1, fun.name = function.name) ; eval(ee) -}else{ -# no fun_check test here, it is just for checked.arg.names -tempo <- fun_check(data = add, class = "vector") -checked.arg.names <- c(checked.arg.names, tempo$object.name) -} -tempo <- fun_check(data = return, class = "logical", length = 1, fun.name = function.name) ; eval(ee) -tempo <- fun_check(data = return.ggplot, class = "logical", length = 1, fun.name = function.name) ; eval(ee) -tempo <- fun_check(data = return.gtable, class = "logical", length = 1, fun.name = function.name) ; eval(ee) -tempo <- fun_check(data = plot, class = "logical", length = 1, fun.name = function.name) ; eval(ee) -tempo <- fun_check(data = warn.print, class = "logical", length = 1, fun.name = function.name) ; eval(ee) -if( ! is.null(lib.path)){ -tempo <- fun_check(data = lib.path, class = "vector", mode = "character", fun.name = function.name) ; eval(ee) -if(tempo$problem == FALSE){ -if( ! all(dir.exists(lib.path), na.rm = TRUE)){ # separation to avoid the problem of tempo$problem == FALSE and lib.path == NA -tempo.cat <- paste0("ERROR IN ", function.name, "\nDIRECTORY PATH INDICATED IN THE lib.path ARGUMENT DOES NOT EXISTS:\n", paste(lib.path, collapse = "\n")) -text.check <- c(text.check, tempo.cat) -arg.check <- c(arg.check, TRUE) -} -} -}else{ -# no fun_check test here, it is just for checked.arg.names -tempo <- fun_check(data = lib.path, class = "vector") -checked.arg.names <- c(checked.arg.names, tempo$object.name) -} -if(any(arg.check) == TRUE){ # normally no NA -stop(paste0("\n\n================\n\n", paste(text.check[arg.check], collapse = "\n"), "\n\n================\n\n"), call. = FALSE) # == in stop() to be able to add several messages between == # -} -# source("C:/Users/Gael/Documents/Git_versions_to_use/debugging_tools_for_r_dev-v1.7/r_debugging_tools-v1.7.R") ; eval(parse(text = str_basic_arg_check_dev)) ; eval(parse(text = str_arg_check_with_fun_check_dev)) # activate this line and use the function (with no arguments left as NULL) to check arguments status and if they have been checked using fun_check() -# end argument primary checking -# second round of checking and data preparation -# management of NA arguments -tempo.arg <- names(arg.user.setting) # values provided by the user -tempo.log <- suppressWarnings(sapply(lapply(lapply(tempo.arg, FUN = get, env = sys.nframe(), inherit = FALSE), FUN = is.na), FUN = any)) & lapply(lapply(tempo.arg, FUN = get, env = sys.nframe(), inherit = FALSE), FUN = length) == 1L # no argument provided by the user can be just NA -if(any(tempo.log) == TRUE){ # normally no NA because is.na() used here -tempo.cat <- paste0("ERROR IN ", function.name, ":\n", ifelse(sum(tempo.log, na.rm = TRUE) > 1, "THESE ARGUMENTS\n", "THIS ARGUMENT\n"), paste0(tempo.arg[tempo.log], collapse = "\n"),"\nCANNOT JUST BE NA") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n"), call. = FALSE) # == in stop() to be able to add several messages between == -} -# end management of NA arguments -# management of NULL arguments -tempo.arg <-c( -"data1", -"y", -"categ", -"box.fill", -"box.width", -"box.space", -"box.line.size", -"box.notch", -"box.alpha", -"box.mean", -"box.whisker.kind", -"box.whisker.width", -# "dot.color", # inactivated because can be null -"dot.tidy", -"dot.tidy.bin.nb", -"dot.jitter", -# "dot.seed", # inactivated because can be null -"dot.size", -"dot.alpha", -"dot.border.size", -"x.angle", -"y.log", -# "y.second.tick.nb", # inactivated because can be null -"y.include.zero", -"y.top.extra.margin", -"y.bottom.extra.margin", -# "stat.pos", # inactivated because can be null -"stat.mean", -"stat.size", -"stat.dist", -"stat.angle", -"vertical", -"text.size", -"title", -"title.text.size", -"legend.show", -# "legend.width", # inactivated because can be null -"article", -"grid", -"return", -"return.ggplot", -"return.gtable", -"plot", -"warn.print" -) -tempo.log <- sapply(lapply(tempo.arg, FUN = get, env = sys.nframe(), inherit = FALSE), FUN = is.null) -if(any(tempo.log) == TRUE){# normally no NA with is.null() -tempo.cat <- paste0("ERROR IN ", function.name, ":\n", ifelse(sum(tempo.log, na.rm = TRUE) > 1, "THESE ARGUMENTS\n", "THIS ARGUMENT\n"), paste0(tempo.arg[tempo.log], collapse = "\n"),"\nCANNOT BE NULL") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n"), call. = FALSE) # == in stop() to be able to add several messages between == -} -# end management of NULL arguments -# code that protects set.seed() in the global environment -# see also Protocol 100-rev0 Parallelization in R.docx -if(exists(".Random.seed", envir = .GlobalEnv)){ # if .Random.seed does not exists, it means that no random operation has been performed yet in any R environment -tempo.random.seed <- .Random.seed -on.exit(assign(".Random.seed", tempo.random.seed, env = .GlobalEnv)) -}else{ -on.exit(set.seed(NULL)) # inactivate seeding -> return to complete randomness -} -set.seed(dot.seed) -# end code that protects set.seed() in the global environment -# warning initiation -ini.warning.length <- options()$warning.length -options(warning.length = 8170) -warn <- NULL -warn.count <- 0 -# end warning initiation -# other checkings -if(any(duplicated(names(data1)), na.rm = TRUE)){ -tempo.cat <- paste0("ERROR IN ", function.name, "\nDUPLICATED COLUMN NAMES OF data1 ARGUMENT NOT ALLOWED:\n", paste(names(data1)[duplicated(names(data1))], collapse = " ")) -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == -} -if( ! (y %in% names(data1))){ -tempo.cat <- paste0("ERROR IN ", function.name, "\ny ARGUMENT MUST BE A COLUMN NAME OF data1") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == -}else{ -tempo <- fun_check(data = data1[, y], data.name = "y COLUMN OF data1", class = "vector", mode = "numeric", na.contain = TRUE, fun.name = function.name) -if(tempo$problem == TRUE){ -tempo.cat <- paste0("ERROR IN ", function.name, "\ny ARGUMENT MUST BE NUMERIC COLUMN IN data1") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == -} -} -if(length(categ) > 2){ -tempo.cat <- paste0("ERROR IN ", function.name, "\ncateg ARGUMENT CANNOT HAVE MORE THAN 2 COLUMN NAMES OF data1") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == -}else if( ! all(categ %in% names(data1))){ # all() without na.rm -> ok because categ cannot be NA (tested above) -tempo.cat <- paste0("ERROR IN ", function.name, "\ncateg ARGUMENT MUST BE COLUMN NAMES OF data1. HERE IT IS:\n", paste(categ, collapse = " ")) -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == -} -if(length(dot.categ) > 1){ -tempo.cat <- paste0("ERROR IN ", function.name, "\ndot.categ ARGUMENT CANNOT HAVE MORE THAN 1 COLUMN NAMES OF data1") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == -}else if( ! all(dot.categ %in% names(data1))){ # all() without na.rm -> ok because dot.categ cannot be NA (tested above) -tempo.cat <- paste0("ERROR IN ", function.name, "\ndot.categ ARGUMENT MUST BE COLUMN NAMES OF data1. HERE IT IS:\n", paste(dot.categ, collapse = " ")) -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == -} -# reserved word checking -if(any(names(data1) %in% reserved.words, na.rm = TRUE)){ -if(any(duplicated(names(data1)), na.rm = TRUE)){ -tempo.cat <- paste0("ERROR IN ", function.name, "\nDUPLICATED COLUMN NAMES OF data1 ARGUMENT NOT ALLOWED:\n", paste(names(data1)[duplicated(names(data1))], collapse = " ")) -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == -} -if( ! is.null(dot.categ)){ -if(dot.categ %in% categ){ -reserved.words <- c(reserved.words, paste0(dot.categ, "_DOT")) # paste0(dot.categ, "_DOT") is added to the reserved words because in such situation, a new column will be added to data1 that is named paste0(dot.categ, "_DOT") -} -} -tempo.output <- fun_name_change(names(data1), reserved.words) -for(i2 in 1:length(tempo.output$ini)){ # a loop to be sure to take the good ones -names(data1)[names(data1) == tempo.output$ini[i2]] <- tempo.output$post[i2] -if(any(y == tempo.output$ini[i2])){ # any() without na.rm -> ok because y cannot be NA (tested above) -y[y == tempo.output$ini[i2]] <- tempo.output$post[i2] -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") IN y ARGUMENT (COLUMN NAMES OF data1 ARGUMENT),\n", tempo.output$ini[i2], " HAS BEEN REPLACED BY ", tempo.output$post[i2], "\nBECAUSE RISK OF BUG AS SOME NAMES IN y ARGUMENT ARE RESERVED WORD USED BY THE ", function.name, " FUNCTION") -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -} -# WARNING: names of y argument potentially replaced -if(any(categ == tempo.output$ini[i2])){ # any() without na.rm -> ok because categ cannot be NA (tested above) -categ[categ == tempo.output$ini[i2]] <- tempo.output$post[i2] -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") IN categ ARGUMENT (COLUMN NAMES OF data1 ARGUMENT),\n", tempo.output$ini[i2], " HAS BEEN REPLACED BY ", tempo.output$post[i2], "\nBECAUSE RISK OF BUG AS SOME NAMES IN categ ARGUMENT ARE RESERVED WORD USED BY THE ", function.name, " FUNCTION") -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -} -# WARNING: names of categ argument potentially replaced -if( ! is.null(dot.categ)){ -if(any(dot.categ == tempo.output$ini[i2])){ # any() without na.rm -> ok because dot.categ cannot be NA (tested above) -dot.categ[dot.categ == tempo.output$ini[i2]] <- tempo.output$post[i2] -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") IN dot.categ ARGUMENT (COLUMN NAMES OF data1 ARGUMENT),\n", tempo.output$ini[i2], " HAS BEEN REPLACED BY ", tempo.output$post[i2], "\nBECAUSE RISK OF BUG AS SOME NAMES IN dot.categ ARGUMENT ARE RESERVED WORD USED BY THE ", function.name, " FUNCTION") -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -} -} -# WARNING: names of dot.categ argument potentially replaced -} -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") REGARDING COLUMN NAMES REPLACEMENT, THE NAMES\n", paste(tempo.output$ini, collapse = " "), "\nHAVE BEEN REPLACED BY\n", paste(tempo.output$post, collapse = " ")) -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -if( ! (is.null(add) | is.null(tempo.output$ini))){ -if(grepl(x = add, pattern = paste(tempo.output$ini, collapse = "|"))){ -tempo.cat <- paste0("ERROR IN ", function.name, "\nDETECTION OF COLUMN NAMES OF data1 IN THE add ARGUMENT STRING, THAT CORRESPOND TO RESERVED STRINGS FOR ", function.name, "\nCOLUMN NAMES HAVE TO BE CHANGED\nTHE PROBLEMATIC COLUMN NAMES ARE SOME OF THESE NAMES:\n", paste(tempo.output$ini, collapse = " "), "\nIN THE DATA FRAME OF data1 AND IN THE STRING OF add ARGUMENT, TRY TO REPLACE NAMES BY:\n", paste(tempo.output$post, collapse = " "), "\n\nFOR INFORMATION, THE RESERVED WORDS ARE:\n", paste(reserved.words, collapse = "\n")) -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == -} -} -} -if( ! (is.null(add))){ -if(any(sapply(X = arg.names, FUN = grepl, x = add), na.rm = TRUE)){ -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") NAMES OF ", function.name, " ARGUMENTS DETECTED IN THE add STRING:\n", paste(arg.names[sapply(X = arg.names, FUN = grepl, x = add)], collapse = "\n"), "\nRISK OF WRONG OBJECT USAGE INSIDE ", function.name) -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -} -} -# end reserved word checking -# verif of add -if( ! is.null(add)){ -if( ! grepl(pattern = "^\\s*\\+", add)){ # check that the add string start by + -tempo.cat <- paste0("ERROR IN ", function.name, "\nadd ARGUMENT MUST START WITH \"+\": ", paste(unique(add), collapse = " ")) -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == -}else if( ! grepl(pattern = "(ggplot2|lemon)\\s*::", add)){ # -tempo.cat <- paste0("ERROR IN ", function.name, "\nFOR EASIER FUNCTION DETECTION, add ARGUMENT MUST CONTAIN \"ggplot2::\" OR \"lemon::\" IN FRONT OF EACH GGPLOT2 FUNCTION: ", paste(unique(add), collapse = " ")) -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == -}else if( ! grepl(pattern = ")\\s*$", add)){ # check that the add string finished by ) -tempo.cat <- paste0("ERROR IN ", function.name, "\nadd ARGUMENT MUST FINISH BY \")\": ", paste(unique(add), collapse = " ")) -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == -} -} -# end verif of add -# management of add containing facet -facet.categ <- NULL -if( ! is.null(add)){ -facet.check <- TRUE -tempo <- unlist(strsplit(x = add, split = "\\s*\\+\\s*(ggplot2|lemon)\\s*::\\s*")) # -tempo <- sub(x = tempo, pattern = "^facet_wrap", replacement = "ggplot2::facet_wrap") -tempo <- sub(x = tempo, pattern = "^facet_grid", replacement = "ggplot2::facet_grid") -tempo <- sub(x = tempo, pattern = "^facet_rep", replacement = "lemon::facet_rep") -if(any(grepl(x = tempo, pattern = "ggplot2::facet_wrap|lemon::facet_rep_wrap"), na.rm = TRUE)){ -tempo1 <- suppressWarnings(eval(parse(text = tempo[grepl(x = tempo, pattern = "ggplot2::facet_wrap|lemon::facet_rep_wrap")]))) -facet.categ <- names(tempo1$params$facets) -tempo.text <- "facet_wrap OR facet_rep_wrap" -facet.check <- FALSE -}else if(grepl(x = add, pattern = "ggplot2::facet_grid|lemon::facet_rep_grid")){ -tempo1 <- suppressWarnings(eval(parse(text = tempo[grepl(x = tempo, pattern = "ggplot2::facet_grid|lemon::facet_rep_grid")]))) -facet.categ <- c(names(tempo1$params$rows), names(tempo1$params$cols)) -tempo.text <- "facet_grid OR facet_rep_grid" -facet.check <- FALSE -} -if(facet.check == FALSE & ! all(facet.categ %in% names(data1))){ # WARNING: all(facet.categ %in% names(data1)) is TRUE when facet.categ is NULL # all() without na.rm -> ok because facet.categ cannot be NA (tested above) -tempo.cat <- paste0("ERROR IN ", function.name, "\nDETECTION OF \"", tempo.text, "\" STRING IN THE add ARGUMENT BUT PROBLEM OF VARIABLE DETECTION (COLUMN NAMES OF data1)\nTHE DETECTED VARIABLES ARE:\n", paste(facet.categ, collapse = " "), "\nTHE data1 COLUMN NAMES ARE:\n", paste(names(data1), collapse = " "), "\nPLEASE REWRITE THE add STRING AND RERUN") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == -} -} -# end management of add containing facet -# conversion of categ columns in data1 into factors -for(i1 in 1:length(categ)){ -tempo1 <- fun_check(data = data1[, categ[i1]], data.name = paste0("categ NUMBER ", i1, " OF data1"), class = "vector", mode = "character", na.contain = TRUE, fun.name = function.name) -tempo2 <- fun_check(data = data1[, categ[i1]], data.name = paste0("categ NUMBER ", i1, " OF data1"), class = "factor", na.contain = TRUE, fun.name = function.name) -if(tempo1$problem == TRUE & tempo2$problem == TRUE){ -tempo.cat <- paste0("ERROR IN ", function.name, "\n", paste0("categ NUMBER ", i1, " OF data1"), " MUST BE A FACTOR OR CHARACTER VECTOR") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == -}else if(tempo1$problem == FALSE){ # character vector -if(box.alpha != 0){ -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") IN categ NUMBER ", i1, " IN data1, THE CHARACTER COLUMN HAS BEEN CONVERTED TO FACTOR, WITH LEVELS ACCORDING TO THE ALPHABETICAL ORDER") -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -} -} -data1[, categ[i1]] <- factor(data1[, categ[i1]]) # if already a factor, change nothing, if characters, levels according to alphabetical order -} -# OK: all the categ columns of data1 are factors from here -# end conversion of categ columns in data1 into factors - - - -# management of log scale and Inf removal -if(any(( ! is.finite(data1[, y])) & ( ! is.na(data1[, y])))){ # is.finite also detects NA: ( ! is.finite(data1[, y])) & ( ! is.na(data1[, y])) detects only Inf # normally no NA with is.finite0() and is.na() -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") PRESENCE OF -Inf OR Inf VALUES IN THE ", y, " COLUMN OF THE data1 ARGUMENT AND CORRESPONDING ROWS REMOVED (SEE $removed.row.nb AND $removed.rows)") -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -} -data1.ini <- data1 # strictly identical to data1 except that in data1 y is log converted if and only if y.log != "no" -if(y.log != "no"){ -tempo1 <- ! is.finite(data1[, y]) # where are initial NA and Inf -data1[, y] <- suppressWarnings(get(y.log)(data1[, y]))# no env = sys.nframe(), inherit = FALSE in get() because look for function in the classical scope -if(any( ! (tempo1 | is.finite(data1[, y])))){ # normally no NA with is.finite -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") LOG CONVERSION INTRODUCED -Inf OR Inf OR NaN VALUES IN THE ", y, " COLUMN OF THE data1 ARGUMENT AND CORRESPONDING ROWS REMOVED (SEE $removed.row.nb AND $removed.rows)") -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -} -} -# Inf removal -if(any(( ! is.finite(data1[, y])) & ( ! is.na(data1[, y])))){ # is.finite also detects NA: ( ! is.finite(data1[, y])) & ( ! is.na(data1[, y])) detects only Inf # normally no NA with is.finite -removed.row.nb <- which(( ! is.finite(data1[, y])) & ( ! is.na(data1[, y]))) -removed.rows <- data1.ini[removed.row.nb, ] # here data1.ini used to have the y = O rows that will be removed because of Inf creation after log transformation -data1 <- data1[-removed.row.nb, ] # -data1.ini <- data1.ini[-removed.row.nb, ] # -}else{ -removed.row.nb <- NULL -removed.rows <- data.frame(stringsAsFactors = FALSE) -} -# From here, data1 and data.ini have no more Inf -# end Inf removal -if(y.log != "no" & ! is.null(y.lim)){ -if(any(y.lim <= 0)){ # any() without na.rm -> ok because y.lim cannot be NA (tested above) -tempo.cat <- paste0("ERROR IN ", function.name, "\ny.lim ARGUMENT CANNOT HAVE ZERO OR NEGATIVE VALUES WITH THE y.log ARGUMENT SET TO ", y.log, ":\n", paste(y.lim, collapse = " ")) -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == -}else if(any( ! is.finite(if(y.log == "log10"){log10(y.lim)}else{log2(y.lim)}))){ # normally no NA with is.finite -tempo.cat <- paste0("ERROR IN ", function.name, "\ny.lim ARGUMENT RETURNS INF/NA WITH THE y.log ARGUMENT SET TO ", y.log, "\nAS SCALE COMPUTATION IS ", ifelse(y.log == "log10", "log10", "log2"), ":\n", paste(if(y.log == "log10"){log10(y.lim)}else{log2(y.lim)}, collapse = " ")) -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == -} -} -if(y.log != "no" & y.include.zero == TRUE){ -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") y.log ARGUMENT SET TO ", y.log, " AND y.include.zero ARGUMENT SET TO TRUE -> y.include.zero ARGUMENT RESET TO FALSE BECAUSE 0 VALUE CANNOT BE REPRESENTED IN LOG SCALE") -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -y.include.zero <- FALSE -} -if(y.log != "no" & vertical == FALSE){ -vertical <- TRUE -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") BECAUSE OF A BUG IN ggplot2, CANNOT FLIP BOXES HORIZONTALLY WITH A Y.LOG SCALE -> vertical ARGUMENT RESET TO TRUE") -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -} -# end management of log scale and Inf removal -# na detection and removal (done now to be sure of the correct length of categ) -column.check <- unique(c(y, categ, if( ! is.null(dot.color) & ! is.null(dot.categ)){dot.categ}, if( ! is.null(facet.categ)){facet.categ})) # dot.categ because can be a 3rd column of data1, categ.color and dot.color will be tested later -if(any(is.na(data1[, column.check]))){ # data1 used here instead of data1.ini in case of new NaN created by log conversion (neg values) # normally no NA with is.na -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") NA DETECTED IN COLUMNS OF data1 AND CORRESPONDING ROWS REMOVED (SEE $removed.row.nb AND $removed.rows)") -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -for(i2 in 1:length(column.check)){ -if(any(is.na(data1[, column.check[i2]]))){ # normally no NA with is.na -tempo.warn <- paste0("NA REMOVAL DUE TO COLUMN ", column.check[i2], " OF data1") -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n", tempo.warn))) -} -} -tempo <- unique(unlist(lapply(lapply(c(data1[column.check]), FUN = is.na), FUN = which))) -removed.row.nb <- c(removed.row.nb, tempo) # removed.row.nb created to remove Inf -removed.rows <- rbind(removed.rows, data1.ini[tempo, ], stringsAsFactors = FALSE) # here data1.ini used to have the non NA rows that will be removed because of NAN creation after log transformation (neg values for instance) -column.check <- column.check[ ! column.check == y] # remove y to keep quali columns -if(length(tempo) != 0){ -data1 <- data1[-tempo, ] # WARNING tempo here and not removed.row.nb because the latter contain more numbers thant the former -data1.ini <- data1.ini[-tempo, ] # WARNING tempo here and not removed.row.nb because the latter contain more numbers than the former -for(i3 in 1:length(column.check)){ -if(any( ! unique(removed.rows[, column.check[i3]]) %in% unique(data1[, column.check[i3]]), na.rm = TRUE)){ -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") IN COLUMN ", column.check[i3], " OF data1, THE FOLLOWING CLASSES HAVE DISAPPEARED AFTER NA/Inf REMOVAL (IF COLUMN USED IN THE PLOT, THIS CLASS WILL NOT BE DISPLAYED):\n", paste(unique(removed.rows[, column.check[i3]])[ ! unique(removed.rows[, column.check[i3]]) %in% unique(data1[, column.check[i3]])], collapse = " ")) -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -} -} -} -count.categ <- 0 -for(i2 in 1:length(column.check)){ -if(column.check[i2] %in% categ){ -count.categ <- count.categ + 1 -} -if(column.check[i2] == categ[count.categ]){ -categ.class.order[count.categ] <- list(levels(data1[, column.check[i2]])[levels(data1[, column.check[i2]]) %in% unique(data1[, column.check[i2]])]) # remove the absent color in the character vector -data1[, column.check[i2]] <- factor(as.character(data1[, column.check[i2]]), levels = unique(categ.class.order[[count.categ]])) -} -if( ! is.null(dot.color) & ! is.null(dot.categ)){ # reminder : dot.categ cannot be a column name of categ anymore (because in that case dot.categ name is changed into "..._DOT" -if(column.check[i2] == dot.categ){ -dot.categ.class.order <- levels(data1[, column.check[i2]])[levels(data1[, column.check[i2]]) %in% unique(data1[, column.check[i2]])] # remove the absent color in the character vector -data1[, column.check[i2]] <- factor(as.character(data1[, column.check[i2]]), levels = unique(dot.categ.class.order)) -} -} -if(column.check[i2] %in% facet.categ){ # works if facet.categ == NULL this method should keep the order of levels when removing some levels -tempo.levels <- levels(data1[, column.check[i2]])[levels(data1[, column.check[i2]]) %in% unique(as.character(data1[, column.check[i2]]))] -data1[, column.check[i2]] <- factor(as.character(data1[, column.check[i2]]), levels = tempo.levels) -} -} -} -# end na detection and removal (done now to be sure of the correct length of categ) -# From here, data1 and data.ini have no more NA or NaN in y, categ, dot.categ (if dot.color != NULL) and facet.categ - - - -if( ! is.null(categ.class.order)){ -if(length(categ.class.order) != length(categ)){ -tempo.cat <- paste0("ERROR IN ", function.name, "\ncateg.class.order ARGUMENT MUST BE A LIST OF LENGTH EQUAL TO LENGTH OF categ\nHERE IT IS LENGTH: ", length(categ.class.order), " VERSUS ", length(categ)) -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == -}else{ -for(i3 in 1:length(categ.class.order)){ -if(is.null(categ.class.order[[i3]])){ -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") THE categ.class.order COMPARTMENT ", i3, " IS NULL. ALPHABETICAL ORDER WILL BE APPLIED") -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -data1[, categ[i3]] <- factor(as.character(data1[, categ[i3]])) # if already a factor, change nothing, if characters, levels according to alphabetical order -categ.class.order[[i3]] <- levels(data1[, categ[i3]]) # character vector that will be used later -}else{ -tempo <- fun_check(data = categ.class.order[[i3]], data.name = paste0("COMPARTMENT ", i3 , " OF categ.class.order ARGUMENT"), class = "vector", mode = "character", length = length(levels(data1[, categ[i3]])), fun.name = function.name) # length(data1[, categ[i1]) -> if data1[, categ[i1] was initially character vector, then conversion as factor after the NA removal, thus class number ok. If data1[, categ[i1] was initially factor, no modification after the NA removal, thus class number ok -if(tempo$problem == TRUE){ -stop(paste0("\n\n================\n\n", tempo$text, "\n\n================\n\n"), call. = FALSE) # == in stop() to be able to add several messages between == -} -} -if(any(duplicated(categ.class.order[[i3]]), na.rm = TRUE)){ -tempo.cat <- paste0("ERROR IN ", function.name, "\nCOMPARTMENT ", i3, " OF categ.class.order ARGUMENT CANNOT HAVE DUPLICATED CLASSES: ", paste(categ.class.order[[i3]], collapse = " ")) -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == -}else if( ! (all(categ.class.order[[i3]] %in% unique(data1[, categ[i3]]), na.rm = TRUE) & all(unique(data1[, categ[i3]]) %in% categ.class.order[[i3]], na.rm = TRUE))){ -tempo.cat <- paste0("ERROR IN ", function.name, "\nCOMPARTMENT ", i3, " OF categ.class.order ARGUMENT MUST BE CLASSES OF ELEMENT ", i3, " OF categ ARGUMENT\nHERE IT IS:\n", paste(categ.class.order[[i3]], collapse = " "), "\nFOR COMPARTMENT ", i3, " OF categ.class.order AND IT IS:\n", paste(unique(data1[, categ[i3]]), collapse = " "), "\nFOR COLUMN ", categ[i3], " OF data1") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == -}else{ -data1[, categ[i3]] <- factor(data1[, categ[i3]], levels = categ.class.order[[i3]]) # reorder the factor - -} -names(categ.class.order)[i3] <- categ[i3] -} -} -}else{ -categ.class.order <- vector("list", length = length(categ)) -tempo.categ.class.order <- NULL -for(i2 in 1:length(categ.class.order)){ -categ.class.order[[i2]] <- levels(data1[, categ[i2]]) -names(categ.class.order)[i2] <- categ[i2] -tempo.categ.class.order <- c(tempo.categ.class.order, ifelse(i2 != 1, "\n", ""), categ.class.order[[i2]]) -} -if(box.alpha != 0){ -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") THE categ.class.order SETTING IS NULL. ALPHABETICAL ORDER WILL BE APPLIED FOR BOX ORDERING:\n", paste(tempo.categ.class.order, collapse = " ")) -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -} -} -# categ.class.order not NULL anymore (list) -if(is.null(box.legend.name) & box.alpha != 0){ -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") THE box.legend.name SETTING IS NULL. NAMES OF categ WILL BE USED: ", paste(categ, collapse = " ")) -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -box.legend.name <- categ[length(categ)] # if only categ1, then legend name of categ1, if length(categ) == 2L, then legend name of categ2 -} -# box.legend.name not NULL anymore (character string) -# management of categ.color -if( ! is.null(categ.color)){ -# check the nature of color -# integer colors into gg_palette -tempo.check.color <- fun_check(data = categ.color, class = "integer", double.as.integer.allowed = TRUE, na.contain = TRUE, fun.name = function.name)$problem -if(tempo.check.color == FALSE){ -# convert integers into colors -categ.color <- fun_gg_palette(max(categ.color, na.rm = TRUE))[categ.color] -} -# end integer colors into gg_palette -if( ! (all(categ.color %in% colors() | grepl(pattern = "^#", categ.color)))){ # check that all strings of low.color start by #, # all() without na.rm -> ok because categ.color cannot be NA (tested above) -tempo.cat <- paste0("ERROR IN ", function.name, "\ncateg.color ARGUMENT MUST BE A HEXADECIMAL COLOR VECTOR STARTING BY # AND/OR COLOR NAMES GIVEN BY colors(): ", paste(unique(categ.color), collapse = " ")) -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == -} -if(any(is.na(categ.color)) & box.alpha != 0){ # normally no NA with is.na -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") categ.color ARGUMENT CONTAINS NA") -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -} -# end check the nature of color -# check the length of color -categ.len <- length(categ) # if only categ1, then colors for classes of categ1, if length(categ) == 2L, then colors for classes of categ2 -if(length(data1[, categ[categ.len]]) == length(levels(data1[, categ[categ.len]])) & length(categ.color) == length(data1[, categ[categ.len]])){ -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") THE NUMBER OF CLASSES OF THE COLUMN ", categ[categ.len], " THE NUMBER OF ROWS OF THIS COLUMN AND THE NUMBER OF COLORS OF THE categ.color ARGUMENT ARE ALL EQUAL. BOX COLORS WILL BE ATTRIBUTED ACCORDING THE LEVELS OF ", categ[categ.len], ", NOT ACCORDING TO THE ROWS OF ", categ[categ.len]) -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -} -if(length(categ.color) == length(levels(data1[, categ[categ.len]]))){ # here length(categ.color) is equal to the different number of categ -# data1[, categ[categ.len]] <- factor(data1[, categ[categ.len]]) # not required because sure that is is a factor -data1 <- data.frame(data1, categ.color = data1[, categ[categ.len]], stringsAsFactors = TRUE) # no need stringsAsFactors here for stat.nolog as factors remain factors -data1$categ.color <- factor(data1$categ.color, labels = categ.color) # replace the characters of data1[, categ[categ.len]] put in the categ.color column by the categ.color (can be write like this because categ.color is length of levels of data1[, categ[categ.len]]) -if(box.alpha != 0){ -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") IN ", categ[categ.len], " OF categ ARGUMENT, THE FOLLOWING COLORS:\n", paste(categ.color, collapse = " "), "\nHAVE BEEN ATTRIBUTED TO THESE CLASSES:\n", paste(levels(factor(data1[, categ[categ.len]])), collapse = " ")) -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -} -}else if(length(categ.color) == length(data1[, categ[categ.len]])){# here length(categ.color) is equal to nrow(data1) -> Modif to have length(categ.color) equal to the different number of categ (length(categ.color) == length(levels(data1[, categ[categ.len]]))) -data1 <- data.frame(data1, categ.color = categ.color, stringsAsFactors = TRUE) -tempo.check <- unique(data1[ , c(categ[categ.len], "categ.color")]) -if( ! (nrow(tempo.check) == length(unique(categ.color)) & nrow(tempo.check) == length(unique(data1[ , categ[categ.len]])))){ -tempo.cat <- paste0("ERROR IN ", function.name, "\ncateg.color ARGUMENT HAS THE LENGTH OF data1 ROW NUMBER\nBUT IS INCORRECTLY ASSOCIATED TO EACH CLASS OF categ ", categ[categ.len], ":\n", paste(unique(mapply(FUN = "paste", data1[ ,categ[categ.len]], data1[ ,"categ.color"])), collapse = "\n")) -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == -}else{ -# data1[, categ[categ.len]] <- factor(data1[, categ[categ.len]]) # not required because sure that is is a factor -categ.color <- unique(data1$categ.color[order(data1[, categ[categ.len]])]) # Modif to have length(categ.color) equal to the different number of categ (length(categ.color) == length(levels(data1[, categ[categ.len]]))) -if(box.alpha != 0){ -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") categ.color ARGUMENT HAS THE LENGTH OF data1 ROW NUMBER\nCOLORS HAVE BEEN RESPECTIVELY ASSOCIATED TO EACH CLASS OF categ ", categ[categ.len], " AS:\n", paste(levels(factor(data1[, categ[categ.len]])), collapse = " "), "\n", paste(categ.color, collapse = " ")) -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -} -} -}else if(length(categ.color) == 1L){ -# data1[, categ[categ.len]] <- factor(data1[, categ[categ.len]]) # not required because sure that is is a factor -data1 <- data.frame(data1, categ.color = categ.color, stringsAsFactors = TRUE) -categ.color <- rep(categ.color, length(levels(data1[, categ[categ.len]]))) -if(box.alpha != 0){ -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") categ.color ARGUMENT HAS LENGTH 1, MEANING THAT ALL THE DIFFERENT CLASSES OF ", categ[categ.len], "\n", paste(levels(factor(data1[, categ[categ.len]])), collapse = " "), "\nWILL HAVE THE SAME COLOR\n", paste(categ.color, collapse = " ")) -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -} -}else{ -tempo.cat <- paste0("ERROR IN ", function.name, "\ncateg.color ARGUMENT MUST BE (1) LENGTH 1, OR (2) THE LENGTH OF data1 NROWS AFTER NA/Inf REMOVAL, OR (3) THE LENGTH OF THE CLASSES IN THE categ ", categ[categ.len], " COLUMN. HERE IT IS COLOR LENGTH ", length(categ.color), " VERSUS CATEG LENGTH ", length(data1[, categ[categ.len]]), " AND CATEG CLASS LENGTH ", length(unique(data1[, categ[categ.len]])), "\nPRESENCE OF NA/Inf COULD BE THE PROBLEM") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == -} -}else{ -categ.len <- length(categ) # if only categ1, then colors for classes of categ1, if length(categ) == 2L, then colors for classes of categ2 -# data1[, categ[categ.len]] <- factor(data1[, categ[categ.len]]) # not required because sure that is is a factor -categ.color <- fun_gg_palette(length(levels(data1[, categ[categ.len]]))) -data1 <- data.frame(data1, categ.color = data1[, categ[categ.len]], stringsAsFactors = TRUE) -data1$categ.color <- factor(data1$categ.color, labels = categ.color) # replace the characters of data1[, categ[categ.len]] put in the categ.color column by the categ.color (can be write like this because categ.color is length of levels of data1[, categ[categ.len]]) -if(box.alpha != 0){ -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") NULL categ.color ARGUMENT -> COLORS RESPECTIVELY ATTRIBUTED TO EACH CLASS OF ", categ[categ.len], " IN data1:\n", paste(categ.color, collapse = " "), "\n", paste(levels(data1[, categ[categ.len]]), collapse = " ")) -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -} -} -# categ.color not NULL anymore -categ.color <- as.character(categ.color) -# categ.color is a character string representing the diff classes -data1$categ.color <- factor(data1$categ.color, levels = unique(categ.color)) # ok because if categ.color is a character string, the order make class 1, class 2, etc. unique() because no duplicates allowed -# data1$categ.color is a factor with order of levels -> categ.color -# end management of categ.color -# management of dot.color -if( ! is.null(dot.color)){ -# optional legend of dot colors -if( ! is.null(dot.categ)){ -ini.dot.categ <- dot.categ -if( ! dot.categ %in% names(data1)){ # no need to use all() because length(dot.categ) = 1 -tempo.cat <- paste0("ERROR IN ", function.name, "\ndot.categ ARGUMENT MUST BE A COLUMN NAME OF data1. HERE IT IS:\n", dot.categ) -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == -}else if(dot.categ %in% categ){ # no need to use all() because length(dot.categ) = 1. Do not use dot.categ %in% categ[length(categ)] -> error -# management of dot legend if dot.categ %in% categ (because legends with the same name are joined in ggplot2) -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") THE COLUMN NAME OF data1 INDICATED IN THE dot.categ ARGUMENT (", dot.categ, ") HAS BEEN REPLACED BY ", paste0(dot.categ, "_DOT"), " TO AVOID MERGED LEGEND BY GGPLOT2") -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -data1 <- data.frame(data1, dot.categ = data1[, dot.categ], stringsAsFactors = TRUE) # dot.categ is not a column name of data1 (checked above with reserved words) -dot.categ <- paste0(dot.categ, "_DOT") -names(data1)[names(data1) == "dot.categ"] <- dot.categ # paste0(dot.categ, "_DOT") is not a column name of data1 (checked above with reserved words) -# tempo.cat <- paste0("ERROR IN ", function.name, "\ndot.categ ARGUMENT CANNOT BE A COLUMN NAME OF data1 ALREADY SPECIFIED IN THE categ ARGUMENT:\n", dot.categ, "\nINDEED, dot.categ ARGUMENT IS MADE TO HAVE MULTIPLE DOT COLORS NOT RELATED TO THE BOXPLOT CATEGORIES") -# stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n"), call. = FALSE) # == in stop() to be able to add several messages between == -} -tempo1 <- fun_check(data = data1[, dot.categ], data.name = paste0(dot.categ, " COLUMN OF data1"), class = "vector", mode = "character", na.contain = TRUE, fun.name = function.name) -tempo2 <- fun_check(data = data1[, dot.categ], data.name = paste0(dot.categ, " COLUMN OF data1"), class = "factor", na.contain = TRUE, fun.name = function.name) -if(tempo1$problem == TRUE & tempo2$problem == TRUE){ -tempo.cat <- paste0("ERROR IN ", function.name, "\ndot.categ COLUMN MUST BE A FACTOR OR CHARACTER VECTOR") # -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == -} -data1[, dot.categ] <- factor(data1[, dot.categ]) # if already a factor, change nothing, if characters, levels according to alphabetical order -# dot.categ column of data1 is factor from here -if( ! is.null(dot.categ.class.order)){ -if(any(duplicated(dot.categ.class.order), na.rm = TRUE)){ -tempo.cat <- paste0("ERROR IN ", function.name, "\ndot.categ.class.order ARGUMENT CANNOT HAVE DUPLICATED CLASSES: ", paste(dot.categ.class.order, collapse = " ")) -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == -}else if( ! (all(dot.categ.class.order %in% levels(data1[, dot.categ])) & all(levels(data1[, dot.categ]) %in% dot.categ.class.order, na.rm = TRUE))){ -tempo.cat <- paste0("ERROR IN ", function.name, "\ndot.categ.class.order ARGUMENT MUST BE CLASSES OF dot.categ ARGUMENT\nHERE IT IS:\n", paste(dot.categ.class.order, collapse = " "), "\nFOR dot.categ.class.order AND IT IS:\n", paste(levels(data1[, dot.categ]), collapse = " "), "\nFOR dot.categ COLUMN (", ini.dot.categ, ") OF data1") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == -}else{ -data1[, dot.categ] <- factor(data1[, dot.categ], levels = dot.categ.class.order) # reorder the factor -} -}else{ -if(all(dot.color == "same") & length(dot.color)== 1L){ # all() without na.rm -> ok because dot.color cannot be NA (tested above) -dot.categ.class.order <- unlist(categ.class.order[length(categ)]) -data1[, dot.categ] <- factor(data1[, dot.categ], levels = dot.categ.class.order) # reorder the factor -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") THE dot.categ.class.order SETTING IS NULL AND dot.color IS \"same\". ORDER OF categ.class.order WILL BE APPLIED FOR LEGEND DISPLAY: ", paste(dot.categ.class.order, collapse = " ")) -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -}else{ -dot.categ.class.order <- sort(levels(data1[, dot.categ])) -data1[, dot.categ] <- factor(data1[, dot.categ], levels = dot.categ.class.order) # reorder the factor -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") THE dot.categ.class.order SETTING IS NULL. ALPHABETICAL ORDER WILL BE APPLIED FOR LEGEND DISPLAY: ", paste(dot.categ.class.order, collapse = " ")) -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -} -} -# dot.categ.class.order not NULL anymore (character string) if dot.categ is not NULL -if(all(dot.color == "same") & length(dot.color)== 1L){ # all() without na.rm -> ok because dot.color cannot be NA (tested above) -if( ! identical(ini.dot.categ, categ[length(categ)])){ -tempo.cat <- paste0("ERROR IN ", function.name, "\nWHEN dot.color ARGUMENT IS \"same\", THE COLUMN NAME IN dot.categ ARGUMENT MUST BE IDENTICAL TO THE LAST COLUMN NAME IN categ ARGUMENT. HERE IT IS:\ndot.categ: ", paste(ini.dot.categ, collapse = " "), "\ncateg: ", paste(categ, collapse = " ")) -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == -}else if( ! fun_comp_1d(unlist(categ.class.order[length(categ)]), dot.categ.class.order)$identical.content){ -tempo.cat <- paste0("ERROR IN ", function.name, "\nWHEN dot.color ARGUMENT IS \"same\",\nLAST COMPARTMENT OF categ.class.order ARGUMENT AND dot.categ.class.order ARGUMENT CANNOT BE DIFFERENT:\nLAST COMPARTMENT OF categ.class.order: ", paste(unlist(categ.class.order[length(categ)]), collapse = " "), "\ndot.categ.class.order: ", paste(dot.categ.class.order, collapse = " ")) -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == -} -} -for(i3 in 1:length(categ)){ -if(identical(categ[i3], ini.dot.categ) & ! identical(unlist(categ.class.order[i3]), dot.categ.class.order) & identical(sort(unlist(categ.class.order[i3])), sort(dot.categ.class.order))){ -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") THE dot.categ ARGUMENT SETTING IS PRESENT IN THE categ ARGUMENT SETTING, BUT ORDER OF THE CLASSES IS NOT THE SAME:\ncateg.class.order: ", paste(unlist(categ.class.order[i3]), collapse = " "), "\ndot.categ.class.order: ", paste(dot.categ.class.order, collapse = " "), "\nNOTE THAT ORDER OF categ.class.order IS THE ONE USED FOR THE AXIS REPRESENTATION") -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -} -} -if(is.null(dot.legend.name)){ -dot.legend.name <- if(ini.dot.categ %in% categ[length(categ)]){dot.categ}else{ini.dot.categ} # -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") THE dot.legend.name SETTING IS NULL -> ", dot.legend.name, " WILL BE USED AS LEGEND TITLE OF DOTS") -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -} -# dot.legend.name not NULL anymore (character string) -}else{ -if( ! is.null(dot.categ.class.order)){ -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") THE dot.categ.class.order ARGUMENT IS NOT NULL, BUT IS THE dot.categ ARGUMENT\n-> dot.categ.class.order NOT CONSIDERED AS NO LEGEND WILL BE DRAWN") -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -} -# But dot.categ.class.order will be converted to NULL below (not now) -} -# end optional legend of dot colors -# check the nature of color -# integer colors into gg_palette -tempo.check.color <- fun_check(data = dot.color, class = "integer", double.as.integer.allowed = TRUE, na.contain = TRUE, fun.name = function.name)$problem -if(tempo.check.color == FALSE){ -# convert integers into colors -dot.color <- fun_gg_palette(max(dot.color, na.rm = TRUE))[dot.color] -} -# end integer colors into gg_palette -if(all(dot.color == "same") & length(dot.color)== 1L){# all() without na.rm -> ok because dot.color cannot be NA (tested above) -dot.color <- categ.color # same color of the dots as the corresponding box color -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") dot.color ARGUMENT HAS BEEN SET TO \"same\"\nTHUS, DOTS WILL HAVE THE SAME COLORS AS THE CORRESPONDING BOXPLOT") -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -}else if( ! (all(dot.color %in% colors() | grepl(pattern = "^#", dot.color)))){ # check that all strings of low.color start by #, # all() without na.rm -> ok because dot.color cannot be NA (tested above) -tempo.cat <- paste0("ERROR IN ", function.name, "\ndot.color ARGUMENT MUST BE (1) A HEXADECIMAL COLOR VECTOR STARTING BY #, OR (2) COLOR NAMES GIVEN BY colors(), OR (3) INTEGERS, OR THE STRING \"same\"\nHERE IT IS: ", paste(unique(dot.color), collapse = " ")) -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == -} -if(any(is.na(dot.color))){ # normally no NA with is.finite -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") dot.color ARGUMENT CONTAINS NA") -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -} -# end check the nature of color -# check the length of color -if( ! is.null(dot.categ)){ -# optional legend of dot colors -if(length(data1[, dot.categ]) == length(levels(data1[, dot.categ])) & length(dot.color) == length(data1[, dot.categ])){ -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") THE NUMBER OF CLASSES OF THE COLUMN ", dot.categ, " THE NUMBER OF ROWS OF THIS COLUMN AND THE NUMBER OF COLORS OF THE dot.color ARGUMENT ARE ALL EQUAL. DOT COLORS WILL BE ATTRIBUTED ACCORDING THE LEVELS OF ", dot.categ, ", NOT ACCORDING TO THE ROWS OF ", dot.categ) -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -} -if(length(dot.color) > 1 & ! (length(dot.color) == length(unique(data1[, dot.categ])) | length(dot.color) == length(data1[, dot.categ]))){ -tempo.cat <- paste0("ERROR IN ", function.name, "\nWHEN LENGTH OF THE dot.color ARGUMENT IS MORE THAN 1, IT MUST BE EQUAL TO THE NUMBER OF 1) ROWS OR 2) LEVELS OF dot.categ COLUMN (", dot.categ, "):\ndot.color: ", paste(dot.color, collapse = " "), "\ndot.categ LEVELS: ", paste(levels(data1[, dot.categ]), collapse = " ")) -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == -}else if(length(dot.color) > 1 & length(dot.color) == length(unique(data1[, dot.categ]))){ -data1 <- data.frame(data1, dot.color = data1[, dot.categ], stringsAsFactors = TRUE) -data1$dot.color <- factor(data1$dot.color, labels = dot.color) # do not use labels = unique(dot.color). Otherwise, we can have green1 green2 when dot.color is c("green", "green") -}else if(length(dot.color) > 1 & length(dot.color) == length(data1[, dot.categ])){ -data1 <- data.frame(data1, dot.color = dot.color, stringsAsFactors = TRUE) -}else if(length(dot.color)== 1L & length(dot.categ.class.order) > 1){ # to deal with single color -data1 <- data.frame(data1, dot.color = dot.color, stringsAsFactors = TRUE) -} -dot.color <- as.character(unique(data1$dot.color[order(data1[, dot.categ])])) # reorder the dot.color character vector -if(length(dot.color)== 1L & length(dot.categ.class.order) > 1){ # to deal with single color -dot.color <- rep(dot.color, length(dot.categ.class.order)) -} -tempo.check <- unique(data1[ , c(dot.categ, "dot.color")]) -if(length(unique(data1[ , "dot.color"])) > 1 & ( ! (nrow(tempo.check) == length(unique(data1[ , "dot.color"])) & nrow(tempo.check) == length(unique(data1[ , dot.categ]))))){ # length(unique(data1[ , "dot.color"])) > 1 because if only one color, can be attributed to each class of dot.categ -tempo.cat <- paste0("ERROR IN ", function.name, "\ndot.color ARGUMENT IS INCORRECTLY ASSOCIATED TO EACH CLASS OF dot.categ (", dot.categ, ") COLUMN:\n", paste(unique(mapply(FUN = "paste", data1[ , dot.categ], data1[ ,"dot.color"])), collapse = "\n")) -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == -}else{ -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") IN dot.categ ARGUMENT (", ini.dot.categ, "), THE FOLLOWING COLORS OF DOTS:\n", paste(dot.color, collapse = " "), "\nHAVE BEEN ATTRIBUTED TO THESE CLASSES:\n", paste(levels(data1[, dot.categ]), collapse = " ")) -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -} -# dot.color is a character string representing the diff classes of dot.categ -# data1$dot.color is a factor with order of levels -> dot.categ -# end optional legend of dot colors -}else{ -categ.len <- length(categ) # if only categ1, then colors for classes of categ1, if length(categ) == 2L, then colors for classes of categ2 -if(length(dot.color) == length(levels(data1[, categ[categ.len]]))){ # here length(dot.color) is equal to the different number of categ -# data1[, categ[categ.len]] <- factor(data1[, categ[categ.len]]) # not required because sure that is is a factor -data1 <- data.frame(data1, dot.color = data1[, categ[categ.len]], stringsAsFactors = TRUE) -data1$dot.color <- factor(data1$dot.color, labels = dot.color) -if(box.alpha != 0){ -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") IN ", categ[categ.len], " OF categ ARGUMENT, THE FOLLOWING COLORS:\n", paste(dot.color, collapse = " "), "\nHAVE BEEN ATTRIBUTED TO THESE CLASSES:\n", paste(levels(factor(data1[, categ[categ.len]])), collapse = " ")) -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -} -}else if(length(dot.color) == length(data1[, categ[categ.len]])){# here length(dot.color) is equal to nrow(data1) -> Modif to have length(dot.color) equal to the different number of categ (length(dot.color) == length(levels(data1[, categ[categ.len]]))) -data1 <- data.frame(data1, dot.color = dot.color, stringsAsFactors = TRUE) -}else if(length(dot.color)== 1L & ! all(dot.color == "same")){ # all() without na.rm -> ok because dot.color cannot be NA (tested above) -# data1[, categ[categ.len]] <- factor(data1[, categ[categ.len]]) # not required because sure that is is a factor -data1 <- data.frame(data1, dot.color = dot.color, stringsAsFactors = TRUE) -dot.color <- rep(dot.color, length(levels(data1[, categ[categ.len]]))) -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") dot.color ARGUMENT HAS LENGTH 1, MEANING THAT ALL THE DIFFERENT CLASSES OF ", categ[categ.len], "\n", paste(levels(factor(data1[, categ[categ.len]])), collapse = " "), "\nWILL HAVE THE SAME COLOR\n", paste(dot.color, collapse = " ")) -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -}else{ -tempo.cat <- paste0("ERROR IN ", function.name, "\ndot.color ARGUMENT MUST BE (1) LENGTH 1, OR (2) THE LENGTH OF data1 NROWS AFTER NA/Inf REMOVAL, OR (3) THE LENGTH OF THE CLASSES IN THE categ ", categ[categ.len], " COLUMN. HERE IT IS COLOR LENGTH ", length(dot.color), " VERSUS CATEG LENGTH ", length(data1[, categ[categ.len]]), " AND CATEG CLASS LENGTH ", length(unique(data1[, categ[categ.len]])), "\nPRESENCE OF NA/Inf COULD BE THE PROBLEM") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == -} -# end check the length of color -dot.color <- as.character(dot.color) -# dot.color is a character string representing the diff classes -data1$dot.color <- factor(data1$dot.color, levels = unique(dot.color)) # ok because if dot.color is a character string, the order make class 1, class 2, etc. If dot.color is a column of data1, then levels will be created, without incidence, except if dot.categ specified (see below). unique() because no duplicates allowed -# data1$dot.color is a factor with order of levels -> dot.color -} -# end optional legend of dot colors -}else if(is.null(dot.color) & ! (is.null(dot.categ) & is.null(dot.categ.class.order) & is.null(dot.legend.name))){ -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") dot.categ OR dot.categ.class.order OR dot.legend.name ARGUMENT HAS BEEN SPECIFIED BUT dot.color ARGUMENT IS NULL (NO DOT PLOTTED)") -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -} -# dot.color either NULL (no dot plotted) or character string (potentially representing the diff classes of dot.categ) -# data1$dot.color is either NA or a factor (with order of levels -> depending on dot.categ or categ[length(categ)], or other -if(is.null(dot.categ)){ -dot.categ.class.order <- NULL # because not used anyway -} -# dot.categ.class.order either NULL if dot.categ is NULL (no legend displayed) or character string (potentially representing the diff classes of dot.categ) -# end management of dot.color -if(is.null(dot.color) & box.fill == FALSE & dot.alpha <= 0.025){ -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") THE FOLLOWING ARGUMENTS WERE SET AS:\ndot.color = NULL (NOT ALL DOTS BUT ONLY POTENTIAL OUTLIER DOTS DISPLAYED)\nbox.fill = FALSE (NO FILLING COLOR FOR BOTH BOXES AND POTENTIAL OUTLIER DOTS)\ndot.alpha = ", fun_round(dot.alpha, 4), "\n-> POTENTIAL OUTLIER DOTS MIGHT NOT BE VISIBLE BECAUSE ALMOST TRANSPARENT") -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -} -if(is.null(dot.color) & box.fill == FALSE & dot.border.size == 0){ -tempo.cat <- paste0("ERROR IN ", function.name, "\nTHE FOLLOWING ARGUMENTS WERE SET AS:\ndot.color = NULL (NOT ALL DOTS BUT ONLY POTENTIAL OUTLIER DOTS DISPLAYED)\nbox.fill = FALSE (NO FILLING COLOR FOR BOTH BOXES AND POTENTIAL OUTLIER DOTS)\ndot.border.size = 0 (NO BORDER FOR POTENTIAL OUTLIER DOTS)\n-> THESE SETTINGS ARE NOT ALLOWED BECAUSE THE POTENTIAL OUTLIER DOTS WILL NOT BE VISIBLE") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == -} -# integer dot.border.color into gg_palette -if( ! is.null(dot.border.color)){ -tempo <- fun_check(data = dot.border.color, class = "vector", typeof = "integer", double.as.integer.allowed = TRUE, length = 1, fun.name = function.name) -if(tempo$problem == FALSE){ # convert integers into colors -dot.border.color <- fun_gg_palette(max(dot.border.color, na.rm = TRUE))[dot.border.color] -} -} -# end integer dot.border.color into gg_palette -# na detection and removal (done now to be sure of the correct length of categ) -column.check <- c("categ.color", if( ! is.null(dot.color)){"dot.color"}) # -if(any(is.na(data1[, column.check]))){ # data1 used here instead of data1.ini in case of new NaN created by log conversion (neg values) # normally no NA with is.na -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") NA DETECTED IN COLUMNS ", paste(column.check, collapse = " "), " OF data1 AND CORRESPONDING ROWS REMOVED (SEE $removed.row.nb AND $removed.rows)") -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -for(i2 in 1:length(column.check)){ -if(any(is.na(data1[, column.check[i2]]))){ # normally no NA with is.na -tempo.warn <- paste0("NA REMOVAL DUE TO COLUMN ", column.check[i2], " OF data1") -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n", tempo.warn))) -} -} -tempo <- unique(unlist(lapply(lapply(c(data1[column.check]), FUN = is.na), FUN = which))) -removed.row.nb <- c(removed.row.nb, tempo) -removed.rows <- rbind(removed.rows, data1[tempo, ], stringsAsFactors = FALSE) # here data1 used because categorical columns tested -if(length(tempo) != 0){ -data1 <- data1[-tempo, ] # WARNING tempo here and not removed.row.nb because the latter contain more numbers thant the former -data1.ini <- data1.ini[-tempo, ] # WARNING tempo here and not removed.row.nb because the latter contain more numbers thant the former -for(i3 in 1:length(column.check)){ -if(any( ! unique(removed.rows[, column.check[i3]]) %in% unique(data1[, column.check[i3]]), na.rm = TRUE)){ -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") IN COLUMN ", column.check[i3], " OF data1, THE FOLLOWING CLASSES HAVE DISAPPEARED AFTER NA/Inf REMOVAL (IF COLUMN USED IN THE PLOT, THIS CLASS WILL NOT BE DISPLAYED):\n", paste(unique(removed.rows[, column.check[i3]])[ ! unique(removed.rows[, column.check[i3]]) %in% unique(data1[, column.check[i3]])], collapse = " ")) -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -} -} -} -for(i2 in 1:length(column.check)){ -if(column.check[i2] == "categ.color"){ -categ.color <- levels(data1[, column.check[i2]])[levels(data1[, column.check[i2]]) %in% unique(data1[, column.check[i2]])] # remove the absent color in the character vector -if(length(categ.color)== 1L & length(unlist(categ.class.order[length(categ)])) > 1){ # to deal with single color -categ.color <- rep(categ.color, length(unlist(categ.class.order[length(categ)]))) -} -data1[, column.check[i2]] <- factor(as.character(data1[, column.check[i2]]), levels = unique(categ.color)) -} -if(column.check[i2] == "dot.color"){ -dot.color <- levels(data1[, column.check[i2]])[levels(data1[, column.check[i2]]) %in% unique(data1[, column.check[i2]])] # remove the absent color in the character vector -if(length(dot.color)== 1L & length(dot.categ.class.order) > 1){ # to deal with single color. If dot.categ.class.order == NULL (which is systematically the case if dot.categ == NULL), no rep(dot.color, length(dot.categ.class.order) -dot.color <- rep(dot.color, length(dot.categ.class.order)) -} -data1[, column.check[i2]] <- factor(as.character(data1[, column.check[i2]]), levels = unique(dot.color)) -} -} -} -# end na detection and removal (done now to be sure of the correct length of categ) -# From here, data1 and data.ini have no more NA or NaN -# end other checkings -# reserved word checking -#already done above -# end reserved word checking -# end second round of checking and data preparation - - -# package checking -fun_pack(req.package = c( -"ggplot2", -"gridExtra", -"lemon", -"scales" -), lib.path = lib.path) -# end package checking - - - - - -# main code -# y coordinates recovery (create ini.box.coord, dot.coord and modify data1) -if(length(categ)== 1L){ -# width commputations -box.width2 <- box.width -box.space <- 0 # to inactivate the shrink that add space between grouped boxes, because no grouped boxes here -# end width commputations -# data1 check categ order for dots coordinates recovery -data1 <- data.frame(data1, categ.check = data1[, categ[1]], stringsAsFactors = TRUE) -data1$categ.check <- as.integer(data1$categ.check) # to check that data1[, categ[1]] and dot.coord$group are similar, during merging -# end data1 check categ order for dots coordinates recovery -# per box dots coordinates recovery -tempo.gg.name <- "gg.indiv.plot." -tempo.gg.count <- 0 -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), eval(parse(text = paste0("ggplot2::ggplot()", if(is.null(add)){""}else{add})))) # add added here to have the facets -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_point(data = data1, mapping = ggplot2::aes_string(x = categ[1], y = y, color = categ[1]), stroke = dot.border.size, size = dot.size, alpha = dot.alpha, shape = 21)) -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::scale_discrete_manual(aesthetics = "color", name = box.legend.name, values = if(is.null(categ.color)){rep(NA, length(unique(data1[, categ[1]])))}else if(length(categ.color)== 1L){rep(categ.color, length(unique(data1[, categ[1]])))}else{categ.color})) # categ.color used for dot colors because at that stage, we do not care about colors -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_boxplot(data = data1, mapping = ggplot2::aes_string(x = categ[1], y = y, fill = categ[1]), coef = if(box.whisker.kind == "no"){0}else if(box.whisker.kind == "std"){1.5}else if(box.whisker.kind == "max"){Inf})) # fill because this is what is used with geom_box # to easily have the equivalent of the grouped boxes -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::scale_discrete_manual(aesthetics = "fill", name = box.legend.name, values = if(length(categ.color)== 1L){rep(categ.color, length(unique(data1[, categ[1]])))}else{categ.color})) -# end per box dots coordinates recovery -}else if(length(categ) == 2L){ -# width commputations -box.width2 <- box.width / length(unique(data1[, categ[length(categ)]])) # real width of each box in x-axis unit, among the set of grouped box. Not relevant if no grouped boxes length(categ)== 1L -# end width commputations -# data1 check categ order for dots coordinates recovery -tempo.factor <- paste0(data1[order(data1[, categ[2]], data1[, categ[1]]), categ[2]], "_", data1[order(data1[, categ[2]], data1[, categ[1]]), categ[1]]) -data1 <- data.frame(data1[order(data1[, categ[2]], data1[, categ[1]]), ], categ.check = factor(tempo.factor, levels = unique(tempo.factor)), stringsAsFactors = TRUE) -data1$categ.check <- as.integer(data1$categ.check) -# end data1 check categ order for dots coordinates recovery -# per box dots coordinates recovery -tempo.gg.name <- "gg.indiv.plot." -tempo.gg.count <- 0 -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), eval(parse(text = paste0("ggplot2::ggplot()", if(is.null(add)){""}else{add})))) # add added here to have the facets -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_point(data = data1, mapping = ggplot2::aes_string(x = categ[1], y = y, color = categ[2]), stroke = dot.border.size, size = dot.size, alpha = dot.alpha, shape = 21)) -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::scale_discrete_manual(aesthetics = "color", name = box.legend.name, values = if(is.null(categ.color)){rep(NA, length(unique(data1[, categ[2]])))}else if(length(categ.color)== 1L){rep(categ.color, length(unique(data1[, categ[2]])))}else{categ.color})) # categ.color used for dot colors because at that stage, we do not care about colors -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_boxplot(data = data1, mapping = ggplot2::aes_string(x = categ[1], y = y, fill = categ[2]), coef = if(box.whisker.kind == "no"){0}else if(box.whisker.kind == "std"){1.5}else if(box.whisker.kind == "max"){Inf})) # fill because this is what is used with geom_box # to easily have the equivalent of the grouped boxes -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::scale_discrete_manual(aesthetics = "fill", name = box.legend.name, values = if(length(categ.color)== 1L){rep(categ.color, length(unique(data1[, categ[2]])))}else{categ.color})) -# end per box dots coordinates recovery -}else{ -tempo.cat <- paste0("INTERNAL CODE ERROR IN ", function.name, "\nCODE INCONSISTENCY 1") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == -} -if( ! is.null(stat.pos)){ -stat.just <- fun_gg_just( -angle = stat.angle, -pos = ifelse( -vertical == TRUE, -ifelse(stat.pos == "top", "bottom", "top"), # "bottom" because we want justification for text that are below the ref point which is the top of the graph. The opposite for "above" -ifelse(stat.pos == "top", "left", "right") # "left" because we want justification for text that are on the left of the ref point which is the right border of the graph. The opposite for "above" -), -kind = "text" -) -} -# has in fact no interest because ggplot2 does not create room for geom_text() -tempo.data.max <- data1[which.max(data1[, y]), ] -tempo.data.max <- data.frame(tempo.data.max, label = formatC(tempo.data.max[, y], digit = 2, drop0trailing = TRUE, format = "f"), stringsAsFactors = TRUE) -# end has in fact no interest because ggplot2 does not create room for geom_text() -tempo.graph.info.ini <- ggplot2::ggplot_build(eval(parse(text = paste(paste(paste0(tempo.gg.name, 1:tempo.gg.count), collapse = " + "), if( ! is.null(stat.pos)){' + ggplot2::geom_text(data = tempo.data.max, mapping = ggplot2::aes_string(x = 1, y = y, label = "label"), size = stat.size, color = "black", angle = stat.angle, hjust = stat.just$hjust, vjust = stat.just$vjust)'})))) # added here to have room for annotation -dot.coord <- tempo.graph.info.ini$data[[1]] -dot.coord$x <- as.numeric(dot.coord$x) # because weird class -dot.coord$PANEL <- as.numeric(dot.coord$PANEL) # because numbers as levels. But may be a problem is facet are reordered ? -tempo.mean <- aggregate(x = dot.coord$y, by = list(dot.coord$group, dot.coord$PANEL), FUN = mean, na.rm = TRUE) -names(tempo.mean)[names(tempo.mean) == "x"] <- "MEAN" -names(tempo.mean)[names(tempo.mean) == "Group.1"] <- "BOX" -names(tempo.mean)[names(tempo.mean) == "Group.2"] <- "PANEL" -dot.coord <- data.frame( -dot.coord[order(dot.coord$group, dot.coord$y), ], # dot.coord$PANEL deals below -y.check = as.double(data1[order(data1$categ.check, data1[, y]), y]), -categ.check = data1[order(data1$categ.check, data1[, y]), "categ.check"], -dot.color = if(is.null(dot.color)){NA}else{data1[order(data1$categ.check, data1[, y]), "dot.color"]}, -data1[order(data1$categ.check, data1[, y]), ][categ], # avoid the renaming below -stringsAsFactors = TRUE -) # y.check to be sure that the order is the same between the y of data1 and the y of dot.coord -# names(dot.coord)[names(dot.coord) == "tempo.categ1"] <- categ[1] -if( ! is.null(dot.categ)){ -dot.coord <- data.frame(dot.coord, data1[order(data1$categ.check, data1[, y]), ][dot.categ], stringsAsFactors = TRUE) # avoid the renaming -} -if( ! is.null(facet.categ)){ -dot.coord <- data.frame(dot.coord, data1[order(data1$categ.check, data1[, y]), ][facet.categ], stringsAsFactors = TRUE) # for facet panels -tempo.test <- NULL -for(i2 in 1:length(facet.categ)){ -tempo.test <- paste0(tempo.test, ".", formatC(as.numeric(dot.coord[, facet.categ[i2]]), width = nchar(max(as.numeric(dot.coord[, facet.categ[i2]]), na.rm = TRUE)), flag = "0")) # convert factor into numeric with leading zero for proper ranking # merge the formatC() to create a new factor. The convertion to integer should recreate the correct group number. Here as.numeric is used and not as.integer in case of numeric in facet.categ (because comes from add and not checked by fun_check, contrary to categ) -} -tempo.test <- as.integer(factor(tempo.test)) -if( ! identical(as.integer(dot.coord$PANEL), tempo.test)){ -tempo.cat <- paste0("INTERNAL CODE ERROR IN ", function.name, "\nas.integer(dot.coord$PANEL) AND tempo.test MUST BE IDENTICAL. CODE HAS TO BE MODIFIED") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == -} -} -if(dot.tidy == TRUE){ -if( ! is.null(dot.categ)){ -dot.coord <- data.frame(dot.coord, tidy_group = data1[order(data1$categ.check, data1[, y]), ][, dot.categ], stringsAsFactors = TRUE) # avoid the renaming -# tidy_group_coord is to be able to fuse table when creating the table for dot coordinates -if(dot.categ %in% categ){ -dot.coord <- data.frame(dot.coord, tidy_group_coord = dot.coord$group, stringsAsFactors = TRUE) -}else{ -dot.coord <- data.frame(dot.coord, tidy_group_coord = as.integer(factor(paste0( -formatC(as.integer(dot.coord[, categ[1]]), width = nchar(max(as.integer(dot.coord[, categ[1]]), na.rm = TRUE)), flag = "0"), # convert factor into numeric with leading zero for proper ranking -".", -if(length(categ) == 2L){formatC(as.integer(dot.coord[, categ[2]]), width = nchar(max(as.integer(dot.coord[, categ[2]]), na.rm = TRUE)), flag = "0")}, # convert factor into numeric with leading zero for proper ranking -if(length(categ) == 2L){"."}, -formatC(as.integer(dot.coord[, dot.categ]), width = nchar(max(as.integer(dot.coord[, dot.categ]), na.rm = TRUE)), flag = "0") # convert factor into numeric with leading zero for proper ranking -)), stringsAsFactors = TRUE) # merge the 2 or 3 formatC() to create a new factor. The convertion to integer should recreate the correct group number -) # for tidy dot plots -} -}else{ -dot.coord <- data.frame(dot.coord, tidy_group = if(length(categ)== 1L){ -dot.coord[, categ]}else{as.integer(factor(paste0( -formatC(as.integer(dot.coord[, categ[1]]), width = nchar(max(as.integer(dot.coord[, categ[1]]), na.rm = TRUE)), flag = "0"), # convert factor into numeric with leading zero for proper ranking -".", -formatC(as.integer(dot.coord[, categ[2]]), width = nchar(max(as.integer(dot.coord[, categ[2]]), na.rm = TRUE)), flag = "0")# convert factor into numeric with leading zero for proper ranking -)), stringsAsFactors = TRUE) # merge the 2 formatC() to create a new factor. The convertion to integer should recreate the correct group number -}) # for tidy dot plots -# tidy_group_coord is to be able to fuse table when creating the table for dot coordinates -dot.coord <- data.frame(dot.coord, tidy_group_coord = dot.coord$group, stringsAsFactors = TRUE) -} -} -if( ! (identical(dot.coord$y, dot.coord$y.check) & identical(dot.coord$group, dot.coord$categ.check))){ -tempo.cat <- paste0("INTERNAL CODE ERROR IN ", function.name, "\n(dot.coord$y AND dot.coord$y.check) AS WELL AS (dot.coord$group AND dot.coord$categ.check) MUST BE IDENTICAL. CODE HAS TO BE MODIFIED") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == -}else{ -if( ! identical(tempo.mean[order(tempo.mean$BOX, tempo.mean$PANEL), ]$BOX, unique(dot.coord[order(dot.coord$group, dot.coord$PANEL), c("group", "PANEL")])$group)){ -tempo.cat <- paste0("INTERNAL CODE ERROR IN ", function.name, "\n(tempo.mean$BOX, tempo.mean$PANEL) AND (dot.coord$group, dot.coord$PANEL) MUST BE IDENTICAL. CODE HAS TO BE MODIFIED") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == -}else{ -tempo <- unique(dot.coord[order(dot.coord$group, dot.coord$PANEL), c(categ, if( ! is.null(dot.color) & ! is.null(dot.categ)){if(dot.categ != ini.dot.categ){dot.categ}}, if( ! is.null(facet.categ)){facet.categ}), drop = FALSE]) -# names(tempo) <- paste0(names(tempo), ".mean") -tempo.mean <- data.frame(tempo.mean[order(tempo.mean$BOX, tempo.mean$PANEL), ], tempo, stringsAsFactors = TRUE) -} -} -# at that stage, categ color and dot color are correctly attributed in data1, box.coord and dot.coord -# end y dot coordinates recovery (create ini.box.coord, dot.coord and modify data1) -# ylim range -if(is.null(y.lim)){ -y.lim <- tempo.graph.info.ini$layout$panel_params[[1]]$y.range # finite = TRUE removes all the -Inf and Inf except if only this. In that case, whatever the -Inf and/or Inf present, output -Inf;Inf range. Idem with NA only -if(any(( ! is.finite(y.lim)) | is.na(y.lim)) | length(y.lim) != 2){ # kept but normally no more Inf in data1 # normally no NA with is.finite, etc. -tempo.cat <- paste0("INTERNAL CODE ERROR IN ", function.name, "\ntempo.graph.info.ini$layout$panel_params[[1]]$y.range[1] CONTAINS NA OR Inf OR HAS LENGTH 1") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == -} -}else if(y.log != "no"){ -y.lim <- get(y.log)(y.lim) # no env = sys.nframe(), inherit = FALSE in get() because look for function in the classical scope -} -if(y.log != "no"){ -# normally this control is not necessary anymore -if(any( ! is.finite(y.lim))){ # normally no NA with is.finite -tempo.cat <- paste0("ERROR IN ", function.name, "\ny.lim ARGUMENT CANNOT HAVE ZERO OR NEGATIVE VALUES WITH THE y.log ARGUMENT SET TO ", y.log, ":\n", paste(y.lim, collapse = " "), "\nPLEASE, CHECK DATA VALUES (PRESENCE OF ZERO OR INF VALUES)") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == -} -} -if(suppressWarnings(all(y.lim %in% c(Inf, -Inf)))){ # all() without na.rm -> ok because y.lim cannot be NA (tested above) -# normally this control is not necessary anymore -tempo.cat <- paste0("ERROR IN ", function.name, " y.lim CONTAINS Inf VALUES, MAYBE BECAUSE VALUES FROM data1 ARGUMENTS ARE NA OR Inf ONLY OR BECAUSE OF LOG SCALE REQUIREMENT") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == -} -if(suppressWarnings(any(is.na(y.lim)))){ # normally no NA with is.na -# normally this control is not necessary anymore -tempo.cat <- paste0("ERROR IN ", function.name, " y.lim CONTAINS NA OR NaN VALUES, MAYBE BECAUSE VALUES FROM data1 ARGUMENTS ARE NA OR Inf ONLY OR BECAUSE OF LOG SCALE REQUIREMENT") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == -} -y.lim.order <- order(y.lim) # to deal with inverse axis -y.lim <- sort(y.lim) -y.lim[1] <- y.lim[1] - abs(y.lim[2] - y.lim[1]) * ifelse(diff(y.lim.order) > 0, y.bottom.extra.margin, y.top.extra.margin) # diff(y.lim.order) > 0 medians not inversed axis -y.lim[2] <- y.lim[2] + abs(y.lim[2] - y.lim[1]) * ifelse(diff(y.lim.order) > 0, y.top.extra.margin, y.bottom.extra.margin) # diff(y.lim.order) > 0 medians not inversed axis -if(y.include.zero == TRUE){ # no need to check y.log != "no" because done before -y.lim <- range(c(y.lim, 0), na.rm = TRUE, finite = TRUE) # finite = TRUE removes all the -Inf and Inf except if only this. In that case, whatever the -Inf and/or Inf present, output -Inf;Inf range. Idem with NA only -} -y.lim <- y.lim[y.lim.order] -if(any(is.na(y.lim))){ # normally no NA with is.na -tempo.cat <- paste0("INTERNAL CODE ERROR IN ", function.name, "\nCODE INCONSISTENCY 2") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == -} -# end ylim range - - - - - - -# drawing -# constant part -tempo.gg.name <- "gg.indiv.plot." -tempo.gg.count <- 0 -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), eval(parse(text = paste0("ggplot2::ggplot()", if(is.null(add)){""}else{add})))) # add is directly put here to deal with additional variable of data, like when using facet_grid. No problem if add is a theme, will be dealt below -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::xlab(if(is.null(x.lab)){categ[1]}else{x.lab})) -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::ylab(if(is.null(y.lab)){y}else{y.lab})) -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::ggtitle(title)) -# text angle management -axis.just <- fun_gg_just(angle = x.angle, pos = ifelse(vertical == TRUE, "bottom", "left"), kind = "axis") -# end text angle management -add.check <- TRUE -if( ! is.null(add)){ # if add is NULL, then = 0 -if(grepl(pattern = "ggplot2\\s*::\\s*theme", add) == TRUE){ -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") \"ggplot2::theme\" STRING DETECTED IN THE add ARGUMENT\n-> INTERNAL GGPLOT2 THEME FUNCTIONS theme() AND theme_classic() HAVE BEEN INACTIVATED, TO BE USED BY THE USER\n-> article ARGUMENT WILL BE IGNORED") -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -add.check <- FALSE -} -} -if(add.check == TRUE & article == TRUE){ -# WARNING: not possible to add theme()several times. NO message but the last one overwrites the others -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::theme_classic(base_size = text.size)) -if(grid == TRUE){ -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), m.gg <- ggplot2::theme( -text = ggplot2::element_text(size = text.size), -plot.title = ggplot2::element_text(size = title.text.size), # stronger than text -line = ggplot2::element_line(size = 0.5), -legend.key = ggplot2::element_rect(color = "white", size = 1.5), # size of the frame of the legend -axis.line.y.left = ggplot2::element_line(colour = "black"), # draw lines for the y axis -axis.line.x.bottom = ggplot2::element_line(colour = "black"), # draw lines for the x axis -panel.grid.major.x = if(vertical == TRUE){NULL}else{ggplot2::element_line(colour = "grey85", size = 0.75)}, -panel.grid.major.y = if(vertical == TRUE){ggplot2::element_line(colour = "grey85", size = 0.75)}else{NULL}, -panel.grid.minor.y = if(vertical == TRUE){ggplot2::element_line(colour = "grey90", size = 0.25)}else{NULL}, -axis.text.x = if(vertical == TRUE){ggplot2::element_text(angle = axis.just$angle, hjust = axis.just$hjust, vjust = axis.just$vjust)}else{NULL}, -axis.text.y = if(vertical == TRUE){NULL}else{ggplot2::element_text(angle = axis.just$angle, hjust = axis.just$hjust, vjust = axis.just$vjust)}, -strip.background = ggplot2::element_rect(fill = NA, colour = NA) # for facet background -)) -}else{ -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), m.gg <- ggplot2::theme( -text = ggplot2::element_text(size = text.size), -plot.title = ggplot2::element_text(size = title.text.size), # stronger than text -line = ggplot2::element_line(size = 0.5), -legend.key = ggplot2::element_rect(color = "white", size = 1.5), # size of the frame of the legend -axis.line.y.left = ggplot2::element_line(colour = "black"), -axis.line.x.bottom = ggplot2::element_line(colour = "black"), -axis.text.x = if(vertical == TRUE){ggplot2::element_text(angle = axis.just$angle, hjust = axis.just$hjust, vjust = axis.just$vjust)}else{NULL}, -axis.text.y = if(vertical == TRUE){NULL}else{ggplot2::element_text(angle = axis.just$angle, hjust = axis.just$hjust, vjust = axis.just$vjust)}, -strip.background = ggplot2::element_rect(fill = NA, colour = NA) -)) -} -}else if(add.check == TRUE & article == FALSE){ -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), m.gg <- ggplot2::theme( -text = ggplot2::element_text(size = text.size), -plot.title = ggplot2::element_text(size = title.text.size), # stronger than text -line = ggplot2::element_line(size = 0.5), -legend.key = ggplot2::element_rect(color = "white", size = 1.5), # size of the frame of the legend -panel.background = ggplot2::element_rect(fill = "grey95"), -axis.line.y.left = ggplot2::element_line(colour = "black"), -axis.line.x.bottom = ggplot2::element_line(colour = "black"), -panel.grid.major.x = ggplot2::element_line(colour = "grey85", size = 0.75), -panel.grid.major.y = ggplot2::element_line(colour = "grey85", size = 0.75), -panel.grid.minor.x = ggplot2::element_blank(), -panel.grid.minor.y = ggplot2::element_line(colour = "grey90", size = 0.25), -strip.background = ggplot2::element_rect(fill = NA, colour = NA), -axis.text.x = if(vertical == TRUE){ggplot2::element_text(angle = axis.just$angle, hjust = axis.just$hjust, vjust = axis.just$vjust)}else{NULL}, -axis.text.y = if(vertical == TRUE){NULL}else{ggplot2::element_text(angle = axis.just$angle, hjust = axis.just$hjust, vjust = axis.just$vjust)} -)) -} -# Contrary to fun_gg_bar(), cannot plot the boxplot right now, because I need the dots plotted first -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_boxplot(data = data1, mapping = ggplot2::aes_string(x = categ[1], y = y, group = categ[length(categ)]), position = ggplot2::position_dodge(width = NULL), color = NA, width = box.width, fill = NA)) # this is to set the graph (i.e., a blanck boxplot to be able to use x coordinates to plot dots before boxes) -# end constant part - - - - -# graphic info recovery (including means) -tempo.graph.info <- ggplot2::ggplot_build(eval(parse(text = paste0(paste(paste0(tempo.gg.name, 1:tempo.gg.count), collapse = " + "), ' + ggplot2::geom_boxplot(data = data1, mapping = ggplot2::aes_string(x = categ[1], y = y, fill = categ[length(categ)]), position = ggplot2::position_dodge(width = NULL), width = box.width, notch = box.notch, coef = if(box.whisker.kind == "no"){0}else if(box.whisker.kind == "std"){1.5}else if(box.whisker.kind == "max"){Inf}) + ggplot2::scale_discrete_manual(aesthetics = "fill", name = box.legend.name, values = if(length(categ.color)== 1L){rep(categ.color, length(unique(data1[, categ[length(categ)]])))}else{categ.color})')))) # will be recovered later again, when ylim will be considered -tempo.yx.ratio <- (tempo.graph.info$layout$panel_params[[1]]$y.range[2] - tempo.graph.info$layout$panel_params[[1]]$y.range[1]) / (tempo.graph.info$layout$panel_params[[1]]$x.range[2] - tempo.graph.info$layout$panel_params[[1]]$x.range[1]) -box.coord <- tempo.graph.info$data[[2]] # to have the summary statistics of the plot. Contrary to ini.box.plot, now integrates ylim Here because can be required for stat.pos when just box are plotted -box.coord$x <- as.numeric(box.coord$x) # because x is of special class that block comparison of values using identical -box.coord$PANEL <- as.numeric(box.coord$PANEL) # because numbers as levels. But may be a problem is facet are reordered ? -box.coord <- box.coord[order(box.coord$group, box.coord$PANEL), ] -if( ! (identical(tempo.mean$BOX, box.coord$group) & identical(tempo.mean$PANEL, box.coord$PANEL))){ -tempo.cat <- paste0("INTERNAL CODE ERROR IN ", function.name, "\nidentical(tempo.mean$BOX, box.coord$group) & identical(tempo.mean$PANEL, box.coord$PANEL) DO NOT HAVE THE SAME VALUE ORDER") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == -}else{ -# tempo <- c(categ, if( ! is.null(dot.color) & ! is.null(dot.categ)){if(dot.categ != ini.dot.categ){dot.categ}}, if( ! is.null(facet.categ)){facet.categ}) -if(any(names(tempo.mean) %in% names(box.coord), na.rm = TRUE)){ -names(tempo.mean)[names(tempo.mean) %in% names(box.coord)] <- paste0(names(tempo.mean)[names(tempo.mean) %in% names(box.coord)], ".mean") -} -box.coord <- data.frame(box.coord, tempo.mean, stringsAsFactors = TRUE) -} -# end graphic info recovery (including means) - - - -# stat output (will also serve for boxplot and mean display) -# x not added know to do not have them in stat.nolog -stat <- data.frame( -MIN = box.coord$ymin_final, -QUART1 = box.coord$lower, -MEDIAN = box.coord$middle, -MEAN = box.coord$MEAN, -QUART3 = box.coord$upper, -MAX = box.coord$ymax_final, -WHISK_INF = box.coord$ymin, -BOX_INF = box.coord$lower, -NOTCH_INF = box.coord$notchlower, -NOTCH_SUP = box.coord$notchupper, -BOX_SUP = box.coord$upper, -WHISK_SUP = box.coord$ymax, -OUTLIERS = box.coord["outliers"], -tempo.mean[colnames(tempo.mean) != "MEAN"], -COLOR = box.coord$fill, -stringsAsFactors = TRUE -) # box.coord["outliers"] written like this because it is a list. X coordinates not put now because several features to set -names(stat)[names(stat) == "outliers"] <- "OUTLIERS" -stat.nolog <- stat # stat.nolog ini will serve for outputs -if(y.log != "no"){ -stat.nolog[c("MIN", "QUART1", "MEDIAN", "MEAN", "QUART3", "MAX", "WHISK_INF", "BOX_INF", "NOTCH_INF", "NOTCH_SUP", "BOX_SUP", "WHISK_SUP")] <- ifelse(y.log == "log2", 2, 10)^(stat.nolog[c("MIN", "QUART1", "MEDIAN", "MEAN", "QUART3", "MAX", "WHISK_INF", "BOX_INF", "NOTCH_INF", "NOTCH_SUP", "BOX_SUP", "WHISK_SUP")]) -stat.nolog$OUTLIERS <- lapply(stat.nolog$OUTLIERS, FUN = function(X){ifelse(y.log == "log2", 2, 10)^X}) -} -# end stat output (will also serve for boxplot and mean display) - - - - - - -# x coordinates management (for random plotting and for stat display) -# width commputations -width.ini <- c(box.coord$xmax - box.coord$xmin)[1] # all the box widths are equal here. Only the first one taken -width.correct <- width.ini * box.space / 2 -if( ! (identical(stat$BOX, box.coord$group) & identical(stat$PANEL, box.coord$PANEL))){ -tempo.cat <- paste0("INTERNAL CODE ERROR IN ", function.name, "\nidentical(stat$BOX, box.coord$group) & identical(stat$PANEL, box.coord$PANEL) MUST BE IDENTICAL. CODE HAS TO BE MODIFIED") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == -}else{ -stat <- data.frame( -stat, -X = box.coord$x, -X_BOX_INF = box.coord$xmin + width.correct, -X_BOX_SUP = box.coord$xmax - width.correct, -X_NOTCH_INF = box.coord$x - (box.coord$x - (box.coord$xmin + width.correct)) / 2, -X_NOTCH_SUP = box.coord$x + (box.coord$x - (box.coord$xmin + width.correct)) / 2, -X_WHISK_INF = box.coord$x - (box.coord$x - (box.coord$xmin + width.correct)) * box.whisker.width, -X_WHISK_SUP = box.coord$x + (box.coord$x - (box.coord$xmin + width.correct)) * box.whisker.width, -# tempo.mean[colnames(tempo.mean) != "MEAN"], # already added above -stringsAsFactors = TRUE -) -stat$COLOR <- factor(stat$COLOR, levels = unique(categ.color)) -if( ! all(stat$NOTCH_SUP < stat$BOX_SUP & stat$NOTCH_INF > stat$BOX_INF, na.rm = TRUE) & box.notch == TRUE){ -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") SOME NOTCHES ARE BEYOND BOX HINGES. TRY ARGUMENT box.notch = FALSE") -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -} -} -dot.jitter <- c((box.coord$xmax - width.correct) - (box.coord$xmin + width.correct))[1] * dot.jitter # real dot.jitter. (box.coord$xmin + width.correct) - (box.coord$xmax - width.correct))[1] is the width of the box. Is equivalent to (box.coord$x - (box.coord$xmin + width.correct))[1] * 2 -# end width commputations -if( ! is.null(dot.color)){ -# random dots -if(dot.tidy == FALSE){ -dot.coord.rd1 <- merge(dot.coord, box.coord[c("fill", "PANEL", "group", "x")], by = c("PANEL", "group"), sort = FALSE) # rd for random. Send the coord of the boxes into the coord data.frame of the dots (in the column x.y). WARNING: by = c("PANEL", "group") without fill column because PANEL & group columns are enough as only one value of x column per group number in box.coord. Thus, no need to consider fill column -if(nrow(dot.coord.rd1) != nrow(dot.coord)){ -tempo.cat <- paste0("INTERNAL CODE ERROR IN ", function.name, "\nTHE merge() FUNCTION DID NOT RETURN A CORRECT dot.coord.rd1 DATA FRAME. CODE HAS TO BE MODIFIED") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == -} -sampled.dot.jitter <- if(nrow(dot.coord.rd1)== 1L){runif(n = nrow(dot.coord.rd1), min = - dot.jitter / 2, max = dot.jitter / 2)}else{sample(x = runif(n = nrow(dot.coord.rd1), min = - dot.jitter / 2, max = dot.jitter / 2), size = nrow(dot.coord.rd1), replace = FALSE)} -dot.coord.rd2 <- data.frame(dot.coord.rd1, dot.x = dot.coord.rd1$x.y + sampled.dot.jitter, stringsAsFactors = TRUE) # set the dot.jitter thanks to runif and dot.jitter range. Then, send the coord of the boxes into the coord data.frame of the dots (in the column x.y) -if(length(categ)== 1L){ -tempo.data1 <- unique(data.frame(data1[categ[1]], group = as.integer(data1[, categ[1]]), stringsAsFactors = TRUE)) # categ[1] is factor -names(tempo.data1)[names(tempo.data1) == categ[1]] <- paste0(categ[1], ".check") -verif <- paste0(categ[1], ".check") -}else if(length(categ) == 2L){ -tempo.data1 <- unique( -data.frame( -data1[c(categ[1], categ[2])], -group = as.integer(factor(paste0( -formatC(as.integer(data1[, categ[2]]), width = nchar(max(as.integer(data1[, categ[2]]), na.rm = TRUE)), flag = "0"), # convert factor into numeric with leading zero for proper ranking -".", -formatC(as.integer(data1[, categ[1]]), width = nchar(max(as.integer(data1[, categ[1]]), na.rm = TRUE)), flag = "0")# convert factor into numeric with leading zero for proper ranking -)), stringsAsFactors = TRUE) # merge the 2 formatC() to create a new factor. The convertion to integer should recreate the correct group number -) -) # categ[2] first if categ[2] is used to make the categories in ggplot and categ[1] is used to make the x-axis -names(tempo.data1)[names(tempo.data1) == categ[1]] <- paste0(categ[1], ".check") -names(tempo.data1)[names(tempo.data1) == categ[2]] <- paste0(categ[2], ".check") -verif <- c(paste0(categ[1], ".check"), paste0(categ[2], ".check")) -}else{ -tempo.cat <- paste0("INTERNAL CODE ERROR IN ", function.name, "\nCODE INCONSISTENCY 3") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == -} -dot.coord.rd3 <- merge(dot.coord.rd2, tempo.data1, by = intersect("group", "group"), sort = FALSE) # send the factors of data1 into coord. WARNING: I have replaced by = "group" by intersect("group", "group") because of an error due to wrong group group merging in dot.coord.rd3 -if(nrow(dot.coord.rd3) != nrow(dot.coord) | ( ! fun_comp_2d(dot.coord.rd3[categ], dot.coord.rd3[verif])$identical.content)){ -tempo.cat <- paste0("INTERNAL CODE ERROR IN ", function.name, "\nTHE merge() FUNCTION DID NOT RETURN A CORRECT dot.coord.rd3 DATA FRAME. CODE HAS TO BE MODIFIED") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == -} -# end random dots -} -# tidy dots -# coordinates are recovered during plotting (see dot.coord.tidy1 below) -# end tidy dots -} -# end x coordinates management (for random plotting and for stat display) - - - - - -# boxplot display before dot display if box.fill = TRUE -coord.names <- NULL -# creation of the data frame for (main box + legend) and data frame for means -if(box.notch == FALSE){ -for(i3 in 1:length(categ)){ -if(i3== 1L){ -tempo.polygon <- data.frame(GROUPX = c(t(stat[, rep(categ[i3], 5)])), stringsAsFactors = TRUE) -}else{ -tempo.polygon <- cbind(tempo.polygon, c(t(stat[, rep(categ[i3], 5)])), stringsAsFactors = TRUE) -} -} -names(tempo.polygon) <- categ -tempo.polygon <- data.frame(X = c(t(stat[, c("X_BOX_INF", "X_BOX_SUP", "X_BOX_SUP", "X_BOX_INF", "X_BOX_INF")])), Y = c(t(stat[, c("BOX_INF", "BOX_INF", "BOX_SUP", "BOX_SUP", "BOX_INF")])), COLOR = c(t(stat[, c("COLOR", "COLOR", "COLOR", "COLOR", "COLOR")])), BOX = as.character(c(t(stat[, c("BOX", "BOX", "BOX", "BOX", "BOX")]))), tempo.polygon, stringsAsFactors = TRUE) -if( ! is.null(facet.categ)){ -for(i4 in 1:length(facet.categ)){ -tempo.polygon <- data.frame(tempo.polygon, c(t(stat[, c(facet.categ[i4], facet.categ[i4], facet.categ[i4], facet.categ[i4], facet.categ[i4])])), stringsAsFactors = TRUE) -names(tempo.polygon)[length(names(tempo.polygon))] <- facet.categ[i4] -} -} -}else{ -for(i3 in 1:length(categ)){ -if(i3== 1L){ -tempo.polygon <- data.frame(GROUPX = c(t(stat[, rep(categ[i3], 11)])), stringsAsFactors = TRUE) -}else{ -tempo.polygon <- cbind(tempo.polygon, c(t(stat[, rep(categ[i3], 11)])), stringsAsFactors = TRUE) -} -} -names(tempo.polygon) <- categ -tempo.polygon <- data.frame(X = c(t(stat[, c("X_BOX_INF", "X_BOX_SUP", "X_BOX_SUP", "X_NOTCH_SUP", "X_BOX_SUP", "X_BOX_SUP", "X_BOX_INF", "X_BOX_INF", "X_NOTCH_INF", "X_BOX_INF", "X_BOX_INF")])), Y = c(t(stat[, c("BOX_INF", "BOX_INF", "NOTCH_INF", "MEDIAN", "NOTCH_SUP", "BOX_SUP", "BOX_SUP", "NOTCH_SUP", "MEDIAN", "NOTCH_INF", "BOX_INF")])), COLOR = c(t(stat[, c("COLOR", "COLOR", "COLOR", "COLOR", "COLOR", "COLOR", "COLOR", "COLOR", "COLOR", "COLOR", "COLOR")])), BOX = as.character(c(t(stat[, c("BOX", "BOX", "BOX", "BOX", "BOX", "BOX", "BOX", "BOX", "BOX", "BOX", "BOX")]))), tempo.polygon, stringsAsFactors = TRUE) -if( ! is.null(facet.categ)){ -for(i4 in 1:length(facet.categ)){ -tempo.polygon <- data.frame(tempo.polygon, c(t(stat[, c(facet.categ[i4], facet.categ[i4], facet.categ[i4], facet.categ[i4], facet.categ[i4], facet.categ[i4], facet.categ[i4], facet.categ[i4], facet.categ[i4], facet.categ[i4], facet.categ[i4])])), stringsAsFactors = TRUE) -names(tempo.polygon)[length(names(tempo.polygon))] <- facet.categ[i4] -} -} -} -tempo.polygon$COLOR <- factor(tempo.polygon$COLOR, levels = unique(categ.color)) -if( ! is.null(categ.class.order)){ -for(i3 in 1:length(categ)){ -tempo.polygon[, categ[i3]] <- factor(tempo.polygon[, categ[i3]], levels = categ.class.order[[i3]]) -} -} -# modified name of dot.categ column (e.g., "Categ1_DOT") must be included for boxplot using ridy dots -if( ! is.null(dot.color) & ! is.null(dot.categ)){ -if(dot.categ != ini.dot.categ){ -tempo.polygon <- data.frame(tempo.polygon, GROUPX = tempo.polygon[, ini.dot.categ], stringsAsFactors = TRUE) -names(tempo.polygon)[names(tempo.polygon) == "GROUPX"] <- dot.categ - -} -} -tempo.diamon.mean <- data.frame(X = c(t(stat[, c("X", "X_NOTCH_INF", "X", "X_NOTCH_SUP", "X")])), Y = c(t(cbind(stat["MEAN"] - (stat[, "X"] - stat[, "X_NOTCH_INF"]) * tempo.yx.ratio, stat["MEAN"], stat["MEAN"] + (stat[, "X"] - stat[, "X_NOTCH_INF"]) * tempo.yx.ratio, stat["MEAN"], stat["MEAN"] - (stat[, "X"] - stat[, "X_NOTCH_INF"]) * tempo.yx.ratio, stringsAsFactors = TRUE))), COLOR = c(t(stat[, c("COLOR", "COLOR", "COLOR", "COLOR", "COLOR")])), GROUP = c(t(stat[, c("BOX", "BOX", "BOX", "BOX", "BOX")])), stringsAsFactors = TRUE) # stringsAsFactors = TRUE for cbind() because stat["MEAN"] is a data frame. Otherwise, stringsAsFactors is not an argument for cbind() on vectors -if( ! is.null(facet.categ)){ -for(i3 in 1:length(facet.categ)){ -tempo.diamon.mean <- data.frame(tempo.diamon.mean, c(t(stat[, c(facet.categ[i3], facet.categ[i3], facet.categ[i3], facet.categ[i3], facet.categ[i3])])), stringsAsFactors = TRUE) -names(tempo.diamon.mean)[length(names(tempo.diamon.mean))] <- facet.categ[i3] -} -} -tempo.diamon.mean$COLOR <- factor(tempo.diamon.mean$COLOR, levels = unique(categ.color)) -# end creation of the data frame for (main box + legend) and data frame for means -if(box.fill == TRUE){ -# assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_boxplot(data = data1, mapping = ggplot2::aes_string(x = categ[1], y = y, color = categ[length(categ)], fill = categ[length(categ)]), position = ggplot2::position_dodge(width = NULL), width = box.width, size = box.line.size, notch = box.notch, coef = if(box.whisker.kind == "no"){0}else if(box.whisker.kind == "std"){1.5}else if(box.whisker.kind == "max"){Inf}, alpha = box.alpha, outlier.shape = if( ! is.null(dot.color)){NA}else{21}, outlier.color = if( ! is.null(dot.color)){NA}else{dot.border.color}, outlier.fill = if( ! is.null(dot.color)){NA}else{NULL}, outlier.size = if( ! is.null(dot.color)){NA}else{dot.size}, outlier.stroke = if( ! is.null(dot.color)){NA}else{dot.border.size}, outlier.alpha = if( ! is.null(dot.color)){NA}else{dot.alpha})) # the color, size, etc. of the outliers are dealt here. outlier.color = NA to do not plot outliers when dots are already plotted. Finally, boxplot redrawn (see below) -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_polygon( -data = tempo.polygon, -mapping = ggplot2::aes_string(x = "X", y = "Y", group = "BOX", fill = categ[length(categ)], color = categ[length(categ)]), -size = box.line.size, -alpha = box.alpha # works only for fill, not for color -)) -coord.names <- c(coord.names, "main.box") -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_segment(data = stat, mapping = ggplot2::aes(x = X, xend = X, y = BOX_SUP, yend = WHISK_SUP, group = categ[length(categ)]), color = "black", size = box.line.size, alpha = box.alpha)) # -coord.names <- c(coord.names, "sup.whisker") -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_segment(data = stat, mapping = ggplot2::aes(x = X, xend = X, y = BOX_INF, yend = WHISK_INF, group = categ[length(categ)]), color = "black", size = box.line.size, alpha = box.alpha)) # -coord.names <- c(coord.names, "inf.whisker") -if(box.whisker.width > 0){ -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_segment(data = stat, mapping = ggplot2::aes(x = X_WHISK_INF, xend = X_WHISK_SUP, y = WHISK_SUP, yend = WHISK_SUP, group = categ[length(categ)]), color = "black", size = box.line.size, alpha = box.alpha, lineend = "round")) # -coord.names <- c(coord.names, "sup.whisker.edge") -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_segment(data = stat, mapping = ggplot2::aes(x = X_WHISK_INF, xend = X_WHISK_SUP, y = WHISK_INF, yend = WHISK_INF, group = categ[length(categ)]), color = "black", size = box.line.size, alpha = box.alpha, lineend = "round")) # -coord.names <- c(coord.names, "inf.whisker.edge") -} -if(box.mean == TRUE){ -# assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_point(data = stat, mapping = ggplot2::aes_string(x = "X", y = "MEAN", group = categ[length(categ)]), shape = 23, stroke = box.line.size * 2, fill = stat$COLOR, size = box.mean.size, color = "black", alpha = box.alpha)) # group used in aesthetic to do not have it in the legend -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_polygon( -data = tempo.diamon.mean, -mapping = ggplot2::aes(x = X, y = Y, group = GROUP), -fill = tempo.diamon.mean[, "COLOR"], -color = hsv(0, 0, 0, alpha = box.alpha), # outline of the polygon in black but with alpha -size = box.line.size, -alpha = box.alpha -)) -coord.names <- c(coord.names, "mean") -} -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_segment(data = stat, mapping = ggplot2::aes(x = if(box.notch == FALSE){X_BOX_INF}else{X_NOTCH_INF}, xend = if(box.notch == FALSE){X_BOX_SUP}else{X_NOTCH_SUP}, y = MEDIAN, yend = MEDIAN, group = categ[length(categ)]), color = "black", size = box.line.size * 2, alpha = box.alpha)) # -coord.names <- c(coord.names, "median") -} -# end boxplot display before dot display if box.fill = TRUE - - - - - - -# dot display -if( ! is.null(dot.color)){ -if(dot.tidy == FALSE){ -if(is.null(dot.categ)){ -if(dot.border.size == 0){ -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_point( -data = dot.coord.rd3, -mapping = ggplot2::aes_string(x = "dot.x", y = "y", group = categ[length(categ)]), -size = dot.size, -shape = 19, -color = dot.coord.rd3$dot.color, -alpha = dot.alpha -)) # group used in aesthetic to do not have it in the legend. Here ggplot2::scale_discrete_manual() cannot be used because of the group easthetic -}else{ -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_point( -data = dot.coord.rd3, -mapping = ggplot2::aes_string(x = "dot.x", y = "y", group = categ[length(categ)]), -shape = 21, -stroke = dot.border.size, -color = if(is.null(dot.border.color)){dot.coord.rd3$dot.color}else{rep(dot.border.color, nrow(dot.coord.rd3))}, -size = dot.size, -fill = dot.coord.rd3$dot.color, -alpha = dot.alpha -)) # group used in aesthetic to do not have it in the legend. Here ggplot2::scale_discrete_manual() cannot be used because of the group easthetic -} -}else{ -if(dot.border.size == 0){ -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_point( -data = dot.coord.rd3, -mapping = ggplot2::aes_string(x = "dot.x", y = "y", alpha = dot.categ), -size = dot.size, -shape = 19, -color = dot.coord.rd3$dot.color -)) # group used in aesthetic to do not have it in the legend. Here ggplot2::scale_discrete_manual() cannot be used because of the group easthetic -}else{ -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_point( -data = dot.coord.rd3, -mapping = ggplot2::aes_string(x = "dot.x", y = "y", alpha = dot.categ), -size = dot.size, -shape = 21, -stroke = dot.border.size, -color = if(is.null(dot.border.color)){dot.coord.rd3$dot.color}else{rep(dot.border.color, nrow(dot.coord.rd3))}, -fill = dot.coord.rd3$dot.color -)) # group used in aesthetic to do not have it in the legend. Here ggplot2::scale_discrete_manual() cannot be used because of the group easthetic -} -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::scale_discrete_manual(aesthetics = "alpha", name = dot.legend.name, values = rep(dot.alpha, length(dot.categ.class.order)), guide = ggplot2::guide_legend(override.aes = list(fill = dot.color, color = if(is.null(dot.border.color)){dot.color}else{dot.border.color}, stroke = dot.border.size, alpha = dot.alpha)))) # values are the values of color (which is the border color in geom_box. WARNING: values = categ.color takes the numbers to make the colors if categ.color is a factor -} -coord.names <- c(coord.names, "dots") -}else if(dot.tidy == TRUE){ -# here plot using group -> no scale -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_dotplot( -data = dot.coord, -mapping = ggplot2::aes_string(x = categ[1], y = "y", group = "group"), # not dot.categ here because the classes of dot.categ create new separations -position = ggplot2::position_dodge(width = box.width), -binpositions = "all", -binaxis = "y", -stackdir = "center", -alpha = dot.alpha, -fill = dot.coord$dot.color, -stroke = dot.border.size, -color = if(is.null(dot.border.color)){dot.coord$dot.color}else{rep(dot.border.color, nrow(dot.coord))}, -show.legend = FALSE, # WARNING: do not use show.legend = TRUE because it uses the arguments outside aes() as aesthetics (here color and fill). Thus I must find a way using ggplot2::scale_discrete_manual() -binwidth = (y.lim[2] - y.lim[1]) / dot.tidy.bin.nb -)) # geom_dotplot ggplot2 v3.3.0: I had to remove rev() in fill and color # very weird behavior of geom_dotplot ggplot2 v3.2.1, (1) because with aes group = (to avoid legend), the dot plotting is not good in term of coordinates, and (2) because data1 seems reorderer according to x = categ[1] before plotting. Thus, I have to use fill = dot.coord[rev(order(dot.coord[, categ[1]], decreasing = TRUE)), "dot.color"] to have the good corresponding colors # show.legend option do not remove the legend, only the aesthetic of the legend (dot, line, etc.) -coord.names <- c(coord.names, "dots") -if( ! is.null(dot.categ)){ -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_dotplot( -data = dot.coord, -mapping = ggplot2::aes_string(x = categ[1], y = "y", alpha = dot.categ), # not dot.categ here because the classes of dot.categ create new separations -position = ggplot2::position_dodge(width = box.width), -binpositions = "all", -binaxis = "y", -stackdir = "center", -fill = NA, -stroke = NA, -color = NA, -# WARNING: do not use show.legend = TRUE because it uses the arguments outside aes() as aesthetics (here color and fill). Thus I must find a way using ggplot2::scale_discrete_manual() -binwidth = (y.lim[2] - y.lim[1]) / dot.tidy.bin.nb -)) # geom_dotplot ggplot2 v3.3.0: I had to remove rev() in fill and color # very weird behavior of geom_dotplot ggplot2 v3.2.1, (1) because with aes group = (to avoid legend), the dot plotting is not good in term of coordinates, and (2) because data1 seems reorderer according to x = categ[1] before plotting. Thus, I have to use fill = dot.coord[rev(order(dot.coord[, categ[1]], decreasing = TRUE)), "dot.color"] to have the good corresponding colors # show.legend option do not remove the legend, only the aesthetic of the legend (dot, line, etc.) -# assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::scale_discrete_manual(aesthetics = "linetype", name = dot.legend.name, values = rep(1, length(categ.color)))) # values = rep("black", length(categ.color)) are the values of color (which is the border color of dots), and this modify the border color on the plot. WARNING: values = categ.color takes the numbers to make the colors if categ.color is a factor -coord.names <- c(coord.names, "bad_remove") -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::scale_discrete_manual(aesthetics = "alpha", name = dot.legend.name, values = rep(dot.alpha, length(dot.categ.class.order)), labels = dot.categ.class.order, guide = ggplot2::guide_legend(title = if(ini.dot.categ == categ[length(categ)]){dot.categ}else{ini.dot.categ}, override.aes = list(fill = levels(dot.coord$dot.color), color = if(is.null(dot.border.color)){levels(dot.coord$dot.color)}else{dot.border.color}, stroke = dot.border.size, alpha = dot.alpha)))) # values are the values of color (which is the border color in geom_box. WARNING: values = categ.color takes the numbers to make the colors if categ.color is a factor -} -# coordinates of tidy dots -tempo.coord <- ggplot2::ggplot_build(eval(parse(text = paste(paste0(tempo.gg.name, 1:tempo.gg.count), collapse = " + "))))$data # to have the tidy dot coordinates -if(length(which(sapply(X = tempo.coord, FUN = function(X){any(names(X) == "binwidth", na.rm = TRUE)}))) != 1){ # detect the compartment of tempo.coord which is the binned data frame -# if(length(which(sapply(tempo.coord, FUN = nrow) == nrow(data1))) > if(is.null(dot.categ)){1}else{2}){ # this does not work if only one dot per class, thus replaced by above # if(is.null(dot.categ)){1}else{2} because 1 dotplot if dot.categ is NULL and 2 dotplots if not, with the second being a blank dotplot with wrong coordinates. Thus take the first in that situation -tempo.cat <- paste0("INTERNAL CODE ERROR IN ", function.name, "\nEITHER MORE THAN 1 OR NO COMPARTMENT HAVING A DATA FRAME WITH binwidth AS COLUMN NAME IN THE tempo.coord LIST (FOR TIDY DOT COORDINATES). CODE HAS TO BE MODIFIED") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == -}else{ -# dot.coord.tidy1 <- tempo.coord[[which(sapply(tempo.coord, FUN = nrow) == nrow(data1))[1]]] # this does not work if only one dot per class, thus replaced by above # the second being a blank dotplot with wrong coordinates. Thus take the first whatever situation -dot.coord.tidy1 <- tempo.coord[[which(sapply(X = tempo.coord, FUN = function(X){any(names(X) == "binwidth", na.rm = TRUE)}))]] # detect the compartment of tempo.coord which is the binned data frame -dot.coord.tidy1$x <- as.numeric(dot.coord.tidy1$x) # because weird class -dot.coord.tidy1$PANEL <- as.numeric(dot.coord.tidy1$PANEL) # because numbers as levels. But may be a problem is facet are reordered ? -} -# tempo.box.coord <- merge(box.coord, unique(dot.coord[, c("PANEL", "group", categ)]), by = c("PANEL", "group"), sort = FALSE) # not required anymore because box.coord already contains categ do not add dot.categ and tidy_group_coord here because the coordinates are for stats. Add the categ in box.coord. WARNING: by = c("PANEL", "group") without fill column because PANEL & group columns are enough as only one value of x column per group number in box.coord. Thus, no need to consider fill column -# below inactivated because not true when dealing with dot.categ different from categ -# if(nrow(tempo.box.coord) != nrow(box.coord)){ -# tempo.cat <- paste0("INTERNAL CODE ERROR IN ", function.name, "\nTHE merge() FUNCTION DID NOT RETURN A CORRECT tempo.box.coord DATA FRAME. CODE HAS TO BE MODIFIED") -# stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n"), call. = FALSE) # == in stop() to be able to add several messages between == -# } -dot.coord.tidy2 <- merge(dot.coord.tidy1, box.coord[c("fill", "PANEL", "group", "x", categ)], by = c("PANEL", "group"), sort = FALSE) # send the coord of the boxes into the coord data.frame of the dots (in the column x.y).WARNING: by = c("PANEL", "group") without fill column because PANEL & group columns are enough as only one value of x column per group number in tempo.box.coord. Thus, no need to consider fill colum # DANGER: from here the fill.y and x.y (from tempo.box.coord) are not good in dot.coord.tidy2. It is ok because Categ1 Categ2 from tempo.box.coord are ok with the group column from dot.coord.tidy1. This is due to the fact that dot.coord.tidy resulting from geom_dotplot does not make the same groups as the other functions -if(nrow(dot.coord.tidy2) != nrow(dot.coord)){ -tempo.cat <- paste0("INTERNAL CODE ERROR IN ", function.name, "\nTHE merge() FUNCTION DID NOT RETURN A CORRECT dot.coord.tidy2 DATA FRAME. CODE HAS TO BE MODIFIED") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == -} -# From here, check for dot.coord.tidy3 which wil be important for stat over the plot. WARNING: dot.categ has nothing to do here for stat coordinates. Thus, not in tempo.data1 -if(length(categ)== 1L){ -tempo.data1 <- unique(data.frame(data1[categ[1]], group = as.integer(data1[, categ[1]]), stringsAsFactors = TRUE)) # categ[1] is factor -names(tempo.data1)[names(tempo.data1) == categ[1]] <- paste0(categ[1], ".check") -verif <- paste0(categ[1], ".check") -}else if(length(categ) == 2L){ -tempo.data1 <- unique( -data.frame( -data1[c(categ[1], categ[2])], -group = as.integer(factor(paste0( -formatC(as.integer(data1[, categ[2]]), width = nchar(max(as.integer(data1[, categ[2]]), na.rm = TRUE)), flag = "0"), # convert factor into numeric with leading zero for proper ranking -".", -formatC(as.integer(data1[, categ[1]]), width = nchar(max(as.integer(data1[, categ[1]]), na.rm = TRUE)), flag = "0")# convert factor into numeric with leading zero for proper ranking -)), stringsAsFactors = TRUE) # merge the 2 formatC() to create a new factor. The convertion to integer should recreate the correct group number -) -) # categ[2] first if categ[2] is used to make the categories in ggplot and categ[1] is used to make the x-axis -names(tempo.data1)[names(tempo.data1) == categ[1]] <- paste0(categ[1], ".check") -names(tempo.data1)[names(tempo.data1) == categ[2]] <- paste0(categ[2], ".check") -verif <- c(paste0(categ[1], ".check"), paste0(categ[2], ".check")) -}else{ -tempo.cat <- paste0("INTERNAL CODE ERROR IN ", function.name, "\nCODE INCONSISTENCY 4") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == -} -dot.coord.tidy3 <- merge(dot.coord.tidy2, tempo.data1, by = intersect("group", "group"), sort = FALSE) # send the factors of data1 into coord. WARNING: I have tested intersect("group", "group") instead of by = "group". May be come back to by = "group" in case of error. But I did this because of an error in dot.coord.rd3 above -if(nrow(dot.coord.tidy3) != nrow(dot.coord) | ( ! fun_comp_2d(dot.coord.tidy3[categ], dot.coord.tidy3[verif])$identical.content)){ -tempo.cat <- paste0("INTERNAL CODE ERROR IN ", function.name, "\nTHE merge() FUNCTION DID NOT RETURN A CORRECT dot.coord.tidy3 DATA FRAME. CODE HAS TO BE MODIFIED") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == -} -# end coordinates of tidy dots -} -} -# end dot display - - - -# boxplot display (if box.fill = FALSE, otherwise, already plotted above) -if(box.fill == TRUE){ -# overcome "work only for the filling of boxes, not for the frame. See https://github.com/tidyverse/ggplot2/issues/252" -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::scale_discrete_manual(aesthetics = "fill", name = box.legend.name, values = if(length(categ.color)== 1L){rep(categ.color, length(unique(data1[, categ[length(categ)]])))}else{categ.color}, guide = ggplot2::guide_legend(order = 1))) #, guide = ggplot2::guide_legend(override.aes = list(fill = levels(tempo.polygon$COLOR), color = "black")))) # values are the values of color (which is the border color in geom_box. WARNING: values = categ.color takes the numbers to make the colors if categ.color is a factor -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::scale_discrete_manual(aesthetics = "color", name = box.legend.name, values = rep(hsv(0, 0, 0, alpha = box.alpha), length(unique(data1[, categ[length(categ)]]))), guide = ggplot2::guide_legend(order = 1))) # , guide = ggplot2::guide_legend(override.aes = list(color = "black", alpha = box.alpha)))) # values are the values of color (which is the border color in geom_box. WARNING: values = categ.color takes the numbers to make the colors if categ.color is a factor # outline of the polygon in black but with alpha -}else{ -# assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_boxplot(data = data1, mapping = ggplot2::aes_string(x = categ[1], y = y, color = categ[length(categ)], fill = categ[length(categ)]), position = ggplot2::position_dodge(width = NULL), width = box.width, size = box.line.size, notch = box.notch, alpha = box.alpha, coef = if(box.whisker.kind == "no"){0}else if(box.whisker.kind == "std"){1.5}else if(box.whisker.kind == "max"){Inf}, outlier.shape = if( ! is.null(dot.color)){NA}else{21}, outlier.color = if( ! is.null(dot.color)){NA}else{if(dot.border.size == 0){NA}else{dot.border.color}}, outlier.fill = if( ! is.null(dot.color)){NA}else{NULL}, outlier.size = if( ! is.null(dot.color)){NA}else{dot.size}, outlier.stroke = if( ! is.null(dot.color)){NA}else{dot.border.size}, outlier.alpha = if( ! is.null(dot.color)){NA}else{dot.alpha})) # the color, size, etc. of the outliers are dealt here. outlier.color = NA to do not plot outliers when dots are already plotted -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_path( -data = tempo.polygon, -mapping = ggplot2::aes_string(x = "X", y = "Y", group = "BOX", color = categ[length(categ)]), -size = box.line.size, -alpha = box.alpha, -lineend = "round", -linejoin = "round" -)) -coord.names <- c(coord.names, "main.box") -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_segment(data = stat, mapping = ggplot2::aes(x = if(box.notch == FALSE){X_BOX_INF}else{X_NOTCH_INF}, xend = if(box.notch == FALSE){X_BOX_SUP}else{X_NOTCH_SUP}, y = MEDIAN, yend = MEDIAN, group = categ[length(categ)]), color = stat$COLOR, size = box.line.size * 2, alpha = box.alpha)) # -coord.names <- c(coord.names, "median") -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_segment(data = stat, mapping = ggplot2::aes(x = X, xend = X, y = BOX_SUP, yend = WHISK_SUP, group = categ[length(categ)]), color = stat$COLOR, size = box.line.size, alpha = box.alpha)) # -coord.names <- c(coord.names, "sup.whisker") -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_segment(data = stat, mapping = ggplot2::aes(x = X, xend = X, y = BOX_INF, yend = WHISK_INF, group = categ[length(categ)]), color = stat$COLOR, size = box.line.size, alpha = box.alpha)) # -coord.names <- c(coord.names, "inf.whisker") -if(box.whisker.width > 0){ -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_segment(data = stat, mapping = ggplot2::aes(x = X_WHISK_INF, xend = X_WHISK_SUP, y = WHISK_SUP, yend = WHISK_SUP, group = categ[length(categ)]), color = stat$COLOR, size = box.line.size, alpha = box.alpha, lineend = "round")) # -coord.names <- c(coord.names, "sup.whisker.edge") -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_segment(data = stat, mapping = ggplot2::aes(x = X_WHISK_INF, xend = X_WHISK_SUP, y = WHISK_INF, yend = WHISK_INF, group = categ[length(categ)]), color = stat$COLOR, size = box.line.size, alpha = box.alpha, lineend = "round")) # -coord.names <- c(coord.names, "inf.whisker.edge") -} -if(box.mean == TRUE){ -# assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_point(data = stat, mapping = ggplot2::aes_string(x = "X", y = "MEAN", group = categ[length(categ)]), shape = 23, stroke = box.line.size * 2, color = stat$COLOR, size = box.mean.size, fill = NA, alpha = box.alpha)) # group used in aesthetic to do not have it in the legend. Here ggplot2::scale_discrete_manual() cannot be used because of the group easthetic -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_path( -data = tempo.diamon.mean, -mapping = ggplot2::aes(x = X, y = Y, group = GROUP), -color = tempo.diamon.mean[, "COLOR"], -size = box.line.size, -alpha = box.alpha, -lineend = "round", -linejoin = "round" -)) -coord.names <- c(coord.names, "mean") -} -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::scale_discrete_manual(aesthetics = "fill", name = box.legend.name, values = rep(NA, length(unique(data1[, categ[length(categ)]]))))) #, guide = ggplot2::guide_legend(override.aes = list(color = categ.color)))) # values are the values of color (which is the border color in geom_box. WARNING: values = categ.color takes the numbers to make the colors if categ.color is a factor -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::scale_discrete_manual(aesthetics = "color", name = box.legend.name, values = if(length(categ.color)== 1L){rep(categ.color, length(unique(data1[, categ[length(categ)]])))}else{categ.color}, guide = ggplot2::guide_legend(override.aes = list(alpha = if(plot == TRUE & ((length(dev.list()) > 0 & names(dev.cur()) == "windows") | (length(dev.list()) == 0L & Sys.info()["sysname"] == "Windows"))){1}else{box.alpha})))) # , guide = ggplot2::guide_legend(override.aes = list(color = as.character(categ.color))))) # values are the values of color (which is the border color in geom_box. WARNING: values = categ.color takes the numbers to make the colors if categ.color is a factor -if(plot == TRUE & ((length(dev.list()) > 0 & names(dev.cur()) == "windows") | (length(dev.list()) == 0L & Sys.info()["sysname"] == "Windows"))){ # if any Graph device already open and this device is "windows", or if no Graph device opened yet and we are on windows system -> prevention of alpha legend bug on windows using value 1 -# to avoid a bug on windows: if alpha argument is different from 1 for lines (transparency), then lines are not correctly displayed in the legend when using the R GUI (bug https://github.com/tidyverse/ggplot2/issues/2452). No bug when using a pdf -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") GRAPHIC DEVICE USED ON A WINDOWS SYSTEM ->\nTRANSPARENCY OF THE LINES IS INACTIVATED IN THE LEGEND TO PREVENT A WINDOWS DEPENDENT BUG (SEE https://github.com/tidyverse/ggplot2/issues/2452)\nTO OVERCOME THIS ON WINDOWS, USE ANOTHER DEVICE (pdf() FOR INSTANCE)") -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -} -} -if(box.alpha == 0){ # remove box legend because no boxes drawn -# add this after the scale_xxx_manual() for boxplots -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::guides(fill = FALSE, color = FALSE)) # inactivate the legend -} -# end boxplot display (if box.fill = FALSE, otherwise, already plotted above) - - - - -# stat display -# layer after dots but ok, behind dots on the plot -if( ! is.null(stat.pos)){ -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") NUMBERS DISPLAYED ARE ", ifelse(stat.mean == FALSE, "MEDIANS", "MEANS")) -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -if(stat.pos == "top"){ -tempo.stat <- data.frame(stat, Y = y.lim[2], stringsAsFactors = TRUE) # I had to create a data frame for geom_tex() so that facet is taken into account, (ggplot2::annotate() does not deal with facet because no data and mapping arguments). Of note, facet.categ is in tempo.stat, via tempo.mean, via dot.coord -if(stat.mean == FALSE){tempo.stat$MEDIAN <- formatC(stat.nolog$MEDIAN, digit = 2, drop0trailing = TRUE, format = "f")}else{tempo.stat$MEAN <- formatC(stat.nolog$MEAN, digit = 2, drop0trailing = TRUE, format = "f")} -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_text( -data = tempo.stat, -mapping = ggplot2::aes_string(x = "X", y = "Y", label = ifelse(stat.mean == FALSE, "MEDIAN", "MEAN")), -size = stat.size, -color = "black", -angle = stat.angle, -hjust = stat.just$hjust, -vjust = stat.just$vjust -)) # stat$X used here because identical to stat.nolog but has the X. WARNING: no need of order() for labels because box.coord$x set the order. For justification, see https://stackoverflow.com/questions/7263849/what-do-hjust-and-vjust-do-when-making-a-plot-using-ggplot -coord.names <- c(coord.names, "stat.pos") -}else if(stat.pos == "above"){ -# stat coordinates -if( ! is.null(dot.color)){ # for text just above max dot -if(dot.tidy == FALSE){ -tempo.stat.ini <- dot.coord.rd3 -}else if(dot.tidy == TRUE){ -tempo.stat.ini <- dot.coord.tidy3 -tempo.stat.ini$x.y <- tempo.stat.ini$x.x # this is just to be able to use tempo.stat.ini$x.y for untidy or tidy dots (remember that dot.coord.tidy3$x.y is not good, see above) -} -stat.coord1 <- aggregate(x = tempo.stat.ini["y"], by = {x.env <- if(length(categ)== 1L){list(tempo.stat.ini$group, tempo.stat.ini$PANEL, tempo.stat.ini$x.y, tempo.stat.ini[, categ[1]])}else if(length(categ) == 2L){list(tempo.stat.ini$group, tempo.stat.ini$PANEL, tempo.stat.ini$x.y, tempo.stat.ini[, categ[1]], tempo.stat.ini[, categ[2]])} ; names(x.env) <- if(length(categ)== 1L){c("group", "PANEL", "x.y", categ[1])}else if(length(categ) == 2L){c("group", "PANEL", "x.y", categ[1], categ[2])} ; x.env}, FUN = min, na.rm = TRUE) -names(stat.coord1)[names(stat.coord1) == "y"] <- "dot.min" -stat.coord2 <- aggregate(x = tempo.stat.ini["y"], by = {x.env <- if(length(categ)== 1L){list(tempo.stat.ini$group, tempo.stat.ini$PANEL, tempo.stat.ini$x.y, tempo.stat.ini[, categ[1]])}else if(length(categ) == 2L){list(tempo.stat.ini$group, tempo.stat.ini$PANEL, tempo.stat.ini$x.y, tempo.stat.ini[, categ[1]], tempo.stat.ini[, categ[2]])} ; names(x.env) <- if(length(categ)== 1L){c("group", "PANEL", "x.y", categ[1])}else if(length(categ) == 2L){c("group", "PANEL", "x.y", categ[1], categ[2])} ; x.env}, FUN = max, na.rm = TRUE) -names(stat.coord2) <- paste0(names(stat.coord2), "_from.dot.max") -names(stat.coord2)[names(stat.coord2) == "y_from.dot.max"] <- "dot.max" -stat.coord3 <- cbind(box.coord[order(box.coord$group, box.coord$PANEL), ], stat.coord1[order(stat.coord1$group, stat.coord1$x.y), ], stat.coord2[order(stat.coord2$group, stat.coord2$x.y), ], stringsAsFactors = TRUE) # -if( ! all(identical(round(stat.coord3$x, 9), round(as.numeric(stat.coord3$x.y), 9)), na.rm = TRUE)){ # as.numeric() because stat.coord3$x is class "mapped_discrete" "numeric" -tempo.cat <- paste0("INTERNAL CODE ERROR IN ", function.name, "\nFUSION OF box.coord, stat.coord1 AND stat.coord2 ACCORDING TO box.coord$x, stat.coord1$x.y AND stat.coord2$x.y IS NOT CORRECT. CODE HAS TO BE MODIFIED") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == -} -# text.coord <- stat.coord3[, c("x", "group", "dot.min", "dot.max")] -# names(text.coord)[names(text.coord) == "dot.min"] <- "text.min.pos" -#names(text.coord)[names(text.coord) == "dot.max"] <- "text.max.pos" -box.coord <- box.coord[order(box.coord$x, box.coord$group, box.coord$PANEL), ] -# text.coord <- text.coord[order(text.coord$x), ] # to be sure to have the two objects in the same order for x. WARNING: cannot add identical(as.integer(text.coord$group), as.integer(box.coord$group)) because with error, the correspondence between x and group is not the same -stat.coord3 <- stat.coord3[order(stat.coord3$x, stat.coord3$group, stat.coord3$PANEL), ] # to be sure to have the two objects in the same order for x. WARNING: cannot add identical(as.integer(text.coord$group), as.integer(box.coord$group)) because with error, the correspondence between x and group is not the same -if( ! (identical(box.coord$x, stat.coord3$x) & identical(box.coord$group, stat.coord3$group) & identical(box.coord$PANEL, stat.coord3$PANEL))){ -tempo.cat <- paste0("INTERNAL CODE ERROR IN ", function.name, "\ntext.coord AND box.coord DO NOT HAVE THE SAME x, group AND PANEL COLUMN CONTENT") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == -} -}else{ -stat.coord3 <- box.coord -} -stat.coord3 <- data.frame( -stat.coord3, -Y = stat.coord3[, ifelse( -is.null(dot.color), -ifelse(diff(y.lim) > 0, "ymax", "ymin"), -ifelse(diff(y.lim) > 0, "ymax_final", "ymin_final") -)], -stringsAsFactors = TRUE -) # ymax is top whisker, ymax_final is top dot -# stat.coord3 <- data.frame(stat.coord3, Y = vector("numeric", length = nrow(stat.coord3)), stringsAsFactors = TRUE) -# check.Y <- as.logical(stat.coord3$Y) # convert everything in Y into FALSE (because Y is full of zero) -# end stat coordinates -# stat display -# performed twice: first for y values >=0, then y values < 0, because only a single value allowed for hjust anf vjust -if(stat.mean == FALSE){ -tempo.center.ref <- "middle" -}else{ -tempo.center.ref <- "MEAN" -} -# if(is.null(dot.color)){ -# tempo.low.ref <- "ymin" -# tempo.high.ref <- "ymax" -# }else{ -# tempo.low.ref <- "ymin_final" -# tempo.high.ref <- "ymax_final" -# } -# tempo.log.high <- if(diff(y.lim) > 0){stat.coord3[, tempo.center.ref] >= 0}else{stat.coord3[, tempo.center.ref] < 0} -# tempo.log.low <- if(diff(y.lim) > 0){stat.coord3[, tempo.center.ref] < 0}else{stat.coord3[, tempo.center.ref] >= 0} -# stat.coord3$Y[tempo.log.high] <- stat.coord3[tempo.log.high, tempo.high.ref] -# stat.coord3$Y[tempo.log.low] <- stat.coord3[tempo.log.low, tempo.low.ref] -# add distance -stat.coord3$Y <- stat.coord3$Y + diff(y.lim) * stat.dist / 100 -# end add distance -# correct median or mean text format -if(y.log != "no"){ -stat.coord3[, tempo.center.ref] <- ifelse(y.log == "log2", 2, 10)^(stat.coord3[, tempo.center.ref]) -} -stat.coord3[, tempo.center.ref] <- formatC(stat.coord3[, tempo.center.ref], digit = 2, drop0trailing = TRUE, format = "f") -# end correct median or mean text format -# if(any(tempo.log.high) == TRUE){ -# tempo.stat <- stat.coord3[tempo.log.high,] -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_text( -data = stat.coord3, -mapping = ggplot2::aes_string(x = "x", y = "Y", label = tempo.center.ref), -size = stat.size, -color = "black", -angle = stat.angle, -hjust = stat.just$hjust, -vjust = stat.just$vjust -)) # WARNING: no need of order() for labels because box.coord$x set the order -coord.names <- c(coord.names, "stat.pos") -# } -# if(any(tempo.log.low) == TRUE){ -# tempo.stat <- stat.coord3[tempo.log.low,] -# assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_text( -# data = tempo.stat, -# mapping = ggplot2::aes_string(x = "x", y = "Y", label = tempo.center.ref), -# size = stat.size, -# color = "black", -# hjust = ifelse(vertical == TRUE, 0.5, 0.5 + stat.dist), -# vjust = ifelse(vertical == TRUE, 0.5 + stat.dist, 0.5) -# )) # WARNING: no need of order() for labels because box.coord$x set the order -# coord.names <- c(coord.names, "stat.pos.negative") -# } -# end stat display -}else{ -tempo.cat <- paste0("INTERNAL CODE ERROR IN ", function.name, "\nCODE INCONSISTENCY 5") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == -} -} -# end stat display -# legend management -if(legend.show == FALSE){ # must be here because must be before bef.final.plot <- -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::guides(fill = FALSE, color = FALSE, alpha = FALSE)) # inactivate the initial legend -} -# end legend management - - - -# y scale management (cannot be before dot plot management) -# the rescaling aspect is complicated and not intuitive. See: -# explaination: https://github.com/tidyverse/ggplot2/issues/3948 -# the oob argument of scale_y_continuous() https://ggplot2.tidyverse.org/reference/scale_continuous.html -# see also https://github.com/rstudio/cheatsheets/blob/master/data-visualization-2.1.pdf -# secondary ticks -bef.final.plot <- ggplot2::ggplot_build(eval(parse(text = paste(paste(paste0(tempo.gg.name, 1:tempo.gg.count), collapse = " + "), ' + if(vertical == TRUE){ggplot2::scale_y_continuous(expand = c(0, 0), limits = sort(y.lim), oob = scales::rescale_none)}else{ggplot2::coord_flip(ylim = y.lim)}')))) # here I do not need the x-axis and y-axis orientation, I just need the number of main ticks and the legend. I DI NOT UNDERSTAND THE COMMENT HERE BECAUSE WE NEED COORD_FLiP -tempo.coord <- bef.final.plot$layout$panel_params[[1]] -# y.second.tick.positions: coordinates of secondary ticks (only if y.second.tick.nb argument is non NULL or if y.log argument is different from "no") -if(y.log != "no"){ # integer main ticks for log2 and log10 -tempo.scale <- (as.integer(min(y.lim, na.rm = TRUE)) - 1):(as.integer(max(y.lim, na.rm = TRUE)) + 1) -}else{ -tempo <- if(is.null(attributes(tempo.coord$y$breaks))){tempo.coord$y$breaks}else{unlist(attributes(tempo.coord$y$breaks))} -if(all(is.na(tempo))){# all() without na.rm -> ok because is.na() cannot be NA -tempo.cat <- paste0("INTERNAL CODE ERROR IN ", function.name, "\nONLY NA IN tempo.coord$y$breaks") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == -} -tempo.scale <- fun_scale(lim = y.lim, n = ifelse(is.null(y.tick.nb), length(tempo[ ! is.na(tempo)]), y.tick.nb)) # in ggplot 3.3.0, tempo.coord$y.major_source replaced by tempo.coord$y$breaks. If fact: n = ifelse(is.null(y.tick.nb), length(tempo[ ! is.na(tempo)]), y.tick.nb)) replaced by n = ifelse(is.null(y.tick.nb), 4, y.tick.nb)) -} -y.second.tick.values <- NULL -y.second.tick.pos <- NULL -if(y.log != "no"){ -tempo <- fun_inter_ticks(lim = y.lim, log = y.log) -y.second.tick.values <- tempo$values -y.second.tick.pos <- tempo$coordinates -# if(vertical == TRUE){ # do not remove in case the bug is fixed -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::annotate(geom = "segment", y = y.second.tick.pos, yend = y.second.tick.pos, x = tempo.coord$x.range[1], xend = tempo.coord$x.range[1] + diff(tempo.coord$x.range) / 80)) -# }else{ # not working because of the ggplot2 bug -# assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::annotate(geom = "segment", x = y.second.tick.pos, xend = y.second.tick.pos, y = tempo.coord$y.range[1], yend = tempo.coord$y.range[1] + diff(tempo.coord$y.range) / 80)) -# } -coord.names <- c(coord.names, "y.second.tick.positions") -}else if(( ! is.null(y.second.tick.nb)) & y.log == "no"){ -# if(y.second.tick.nb > 0){ #inactivated because already checked before -if(length(tempo.scale) < 2){ -tempo.cat1 <- c("y.tick.nb", "y.second.tick.nb") -tempo.cat2 <- sapply(list(y.tick.nb, y.second.tick.nb), FUN = paste0, collapse = " ") -tempo.sep <- sapply(mapply(" ", max(nchar(tempo.cat1)) - nchar(tempo.cat1) + 3, FUN = rep, SIMPLIFY = FALSE), FUN = paste0, collapse = "") -tempo.cat <- paste0("ERROR IN ", function.name, "\nTHE NUMBER OF GENERATED TICKS FOR THE Y-AXIS IS NOT CORRECT: ", length(tempo.scale), "\nUSING THESE ARGUMENT SETTINGS (NO DISPLAY MEANS NULL VALUE):\n", paste0(tempo.cat1, tempo.sep, tempo.cat2, collapse = "\n"), "\nPLEASE, TEST OTHER VALUES") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == -}else{ -tempo <- fun_inter_ticks(lim = y.lim, log = y.log, breaks = tempo.scale, n = y.second.tick.nb) -} -y.second.tick.values <- tempo$values -y.second.tick.pos <- tempo$coordinates -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::annotate( -geom = "segment", -y = y.second.tick.pos, -yend = y.second.tick.pos, -x = if(vertical == TRUE){tempo.coord$x.range[1]}else{tempo.coord$y.range[1]}, -xend = if(vertical == TRUE){tempo.coord$x.range[1] + diff(tempo.coord$x.range) / 80}else{tempo.coord$y.range[1] + diff(tempo.coord$y.range) / 80} -)) -coord.names <- c(coord.names, "y.second.tick.positions") -} -# end y.second.tick.positions -# for the ggplot2 bug with y.log, this does not work: eval(parse(text = ifelse(vertical == FALSE & y.log == "log10", "ggplot2::scale_x_continuous", "ggplot2::scale_y_continuous"))) -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::scale_y_continuous( -breaks = tempo.scale, -minor_breaks = y.second.tick.pos, -labels = if(y.log == "log10"){scales::trans_format("identity", scales::math_format(10^.x))}else if(y.log == "log2"){scales::trans_format("identity", scales::math_format(2^.x))}else if(y.log == "no"){ggplot2::waiver()}else{tempo.cat <- paste0("INTERNAL CODE ERROR IN ", function.name, "\nCODE INCONSISTENCY 6") ; stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE)}, # == in stop() to be able to add several messages between == -expand = c(0, 0), # remove space after after axis limits -limits = sort(y.lim), # NA indicate that limits must correspond to data limits but ylim() already used -oob = scales::rescale_none, -trans = ifelse(diff(y.lim) < 0, "reverse", "identity") # equivalent to ggplot2::scale_y_reverse() but create the problem of y-axis label disappearance with y.lim decreasing. Thus, do not use. Use ylim() below and after this -)) -if(vertical == TRUE){ -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::coord_cartesian(ylim = y.lim)) # problem of ggplot2::ylim() is that it redraws new breaks # coord_cartesian(ylim = y.lim)) not used because bug -> y-axis label disappearance with y.lim decreasing I DO NOT UNDERSTAND THIS MESSAGE WHILE I USE COORD_CARTESIAN # clip = "off" to have secondary ticks outside plot region does not work -}else{ -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::coord_flip(ylim = y.lim)) # clip = "off" to have secondary ticks outside plot region does not work # create the problem of y-axis label disappearance with y.lim decreasing. IDEM ABOVE - -} -# end y scale management (cannot be before dot plot management) - - -# legend management -if( ! is.null(legend.width)){ -legend.final <- fun_gg_get_legend(ggplot_built = bef.final.plot, fun.name = function.name, lib.path = lib.path) # get legend -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::guides(fill = FALSE, color = FALSE, alpha = FALSE)) # inactivate the initial legend -if(is.null(legend.final) & plot == TRUE){ # even if any(unlist(legend.disp)) is TRUE -legend.final <- ggplot2::ggplot()+ggplot2::theme_void() # empty graph instead of legend -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") LEGEND REQUESTED (NON NULL categ ARGUMENT OR legend.show ARGUMENT SET TO TRUE)\nBUT IT SEEMS THAT THE PLOT HAS NO LEGEND -> EMPTY LEGEND SPACE CREATED BECAUSE OF THE NON NULL legend.width ARGUMENT\n") -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -} -} -# end legend management - - -# drawing -fin.plot <- suppressMessages(suppressWarnings(eval(parse(text = paste(paste0(tempo.gg.name, 1:tempo.gg.count), collapse = " + "))))) -grob.save <- NULL -if(plot == TRUE){ -# following lines inactivated because of problem in warn.recov and message.recov -# assign("env_fun_get_message", new.env()) -# assign("tempo.gg.name", tempo.gg.name, envir = env_fun_get_message) -# assign("tempo.gg.count", tempo.gg.count, envir = env_fun_get_message) -# assign("add", add, envir = env_fun_get_message) -# two next line: for the moment, I cannot prevent the warning printing -# warn.recov <- fun_get_message(paste(paste(paste0(tempo.gg.name, 1:tempo.gg.count), collapse = " + "), if(is.null(add)){NULL}else{add}), kind = "warning", header = FALSE, print.no = FALSE, env = env_fun_get_message) # for recovering warnings printed by ggplot() functions -# message.recov <- fun_get_message('print(eval(parse(text = paste(paste(paste0(tempo.gg.name, 1:tempo.gg.count), collapse = " + "), if(is.null(add)){NULL}else{add}))))', kind = "message", header = FALSE, print.no = FALSE, env = env_fun_get_message) # for recovering messages printed by ggplot() functions -# if( ! (return == TRUE & return.ggplot == TRUE)){ # because return() plots when return.ggplot is TRUE # finally not used -> see return.ggplot description -if(is.null(legend.width)){ -grob.save <- suppressMessages(suppressWarnings(gridExtra::grid.arrange(fin.plot))) -}else{ -grob.save <-suppressMessages(suppressWarnings(gridExtra::grid.arrange(fin.plot, legend.final, ncol=2, widths=c(1, legend.width)))) -} -# } -# suppressMessages(suppressWarnings(print(eval(parse(text = paste(paste(paste0(tempo.gg.name, 1:tempo.gg.count), collapse = " + "), if(is.null(add)){NULL}else{add})))))) -}else{ -# following lines inactivated because of problem in warn.recov and message.recov -# message.recov <- NULL -# warn.recov <- NULL -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") PLOT NOT SHOWN AS REQUESTED") -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -} -# end drawing - - - -# output -# following lines inactivated because of problem in warn.recov and message.recov -# if( ! (is.null(warn) & is.null(warn.recov) & is.null(message.recov))){ -# warn <- paste0(warn, "\n\n", if(length(warn.recov) > 0 | length(message.recov) > 0){paste0(paste0("MESSAGES FROM ggplot2 FUNCTIONS: ", ifelse( ! is.null(warn.recov), unique(message.recov), ""), ifelse( ! is.null(message.recov), unique(message.recov), ""), collapse = "\n\n"), "\n\n")}) -# }else if( ! (is.null(warn) & is.null(warn.recov)) & is.null(message.recov)){ -# warn <- paste0(warn, "\n\n", if(length(warn.recov) > 0){paste0(paste0("MESSAGES FROM ggplot2 FUNCTIONS: ", unique(warn.recov), collapse = "\n\n"), "\n\n")}) -# }else if( ! (is.null(warn) & is.null(message.recov)) & is.null(warn.recov)){ -# warn <- paste0(warn, "\n\n", if(length(message.recov) > 0){paste0(paste0("MESSAGES FROM ggplot2 FUNCTIONS: ", unique(message.recov), collapse = "\n\n"), "\n\n")}) -# } -if(warn.print == TRUE & ! is.null(warn)){ -on.exit(warning(paste0("FROM ", function.name, ":\n\n", warn), call. = FALSE)) -} -on.exit(exp = options(warning.length = ini.warning.length), add = TRUE) -if(return == TRUE){ -tempo.output <- ggplot2::ggplot_build(fin.plot) -tempo.output$data <- tempo.output$data[-1] # remove the first data because corresponds to the initial empty boxplot -if(length(tempo.output$data) != length(coord.names)){ -tempo.cat <- paste0("INTERNAL CODE ERROR IN ", function.name, "\nlength(tempo.output$data) AND length(coord.names) MUST BE IDENTICAL. CODE HAS TO BE MODIFIED") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == -}else{ -names(tempo.output$data) <- coord.names -tempo.output$data <- tempo.output$data[coord.names != "bad_remove"] -} -tempo <- tempo.output$layout$panel_params[[1]] -output <- list( -data = data1.ini, -stat = stat.nolog, -removed.row.nb = removed.row.nb, -removed.rows = removed.rows, -plot = c(tempo.output$data, y.second.tick.values = list(y.second.tick.values)), -panel = facet.categ, -axes = list( -x.range = tempo$x.range, -x.labels = if(is.null(attributes(tempo$x$breaks))){tempo$x$breaks}else{tempo$x$scale$get_labels()}, # is.null(attributes(tempo$x$breaks)) test if it is number (TRUE) or character (FALSE) -x.positions = if(is.null(attributes(tempo$x$breaks))){tempo$x$breaks}else{unlist(attributes(tempo$x$breaks))}, -y.range = tempo$y.range, -y.labels = if(is.null(attributes(tempo$y$breaks))){tempo$y$breaks}else{tempo$y$scale$get_labels()}, -y.positions = if(is.null(attributes(tempo$y$breaks))){tempo$y$breaks}else{unlist(attributes(tempo$y$breaks))} -), -warn = paste0("\n", warn, "\n\n"), -ggplot = if(return.ggplot == TRUE){fin.plot}else{NULL}, # fin.plot plots the graph if return == TRUE -gtable = if(return.gtable == TRUE){grob.save}else{NULL} -) -return(output) # this plots the graph if return.ggplot is TRUE and if no assignment -} -# end output -# end main code -} - - - - - -# add density -# rasterise all kind: https://cran.r-project.org/web/packages/ggrastr/vignettes/Raster_geoms.html -# log not good: do not convert as in boxplot - -fun_gg_scatter <- function( -data1, -x, -y, -categ = NULL, -categ.class.order = NULL, -color = NULL, -geom = "geom_point", -geom.step.dir = "hv", -geom.stick.base = NULL, -alpha = 0.5, -dot.size = 2, -dot.shape = 21, -dot.border.size = 0.5, -dot.border.color = NULL, -line.size = 0.5, -line.type = "solid", -x.lim = NULL, -x.lab = NULL, -x.log = "no", -x.tick.nb = NULL, -x.second.tick.nb = NULL, -x.include.zero = FALSE, -x.left.extra.margin = 0.05, -x.right.extra.margin = 0.05, -x.text.angle = 0, -y.lim = NULL, -y.lab = NULL, -y.log = "no", -y.tick.nb = NULL, -y.second.tick.nb = NULL, -y.include.zero = FALSE, -y.top.extra.margin = 0.05, -y.bottom.extra.margin = 0.05, -y.text.angle = 0, -raster = FALSE, -raster.ratio = 1, -raster.threshold = NULL, -text.size = 12, -title = "", -title.text.size = 12, -legend.show = TRUE, -legend.width = 0.5, -legend.name = NULL, -article = TRUE, -grid = FALSE, -add = NULL, -return = FALSE, -return.ggplot = FALSE, -return.gtable = TRUE, -plot = TRUE, -warn.print = FALSE, -lib.path = NULL -){ -# AIM -# Plot ggplot2 scatterplot with the possibility to overlay dots from up to 3 different data frames (-> three different legends) and lines from up to 3 different data frames (-> three different legends) -> up to 6 overlays totally -# For ggplot2 specifications, see: https://ggplot2.tidyverse.org/articles/ggplot2-specs.html -# WARNINGS -# Rows containing NA in data1[, c(x, y, categ)] will be removed before processing, with a warning (see below) -# Size arguments (dot.size, dot.border.size, line.size, text.size and title.text.size) are in mm. See Hadley comment in https://stackoverflow.com/questions/17311917/ggplot2-the-unit-of-size. See also http://sape.inf.usi.ch/quick-reference/ggplot2/size). Unit object are not accepted, but conversion can be used (e.g., grid::convertUnit(grid::unit(0.2, "inches"), "mm", valueOnly = TRUE)) -# ARGUMENTS -# data1: a dataframe compatible with ggplot2, or a list of data frames. Order matters for the order of the legend and for the layer staking (starting from below to top) -# x: single character string of the data1 column name for x-axis coordinates. If data1 is a list, then x must be a list of single character strings, of same size as data1, with compartment 1 related to compartment 1 of data1, etc. Write NULL for each "geom_hline" in geom argument -# y: single character string of the data1 column name for y-axis coordinates. If data1 is a list, then y must be a list of single character strings, of same size as data1, with compartment 1 related to compartment 1 of data1, etc. Write NULL for each "geom_vline" in geom argument -# categ: either NULL or a single character string or a list of single character strings, indicating the data1 column names to use for categories which creates legend display -# If categ == NULL, no categories -> no legend displayed -# If data1 is a data frame, categ must be a single character string of the data1 column name for categories -# If data1 is a list, then categ must be a list of single character strings, of same size as data1, with compartment 1 related to compartment 1 of data1, etc. Some of the list compartments can be NULL (no legend display for these compartments), and other not -# categ.class.order: either (1) NULL or (2) a vector of character strings or (3) a list of these vectors, setting the order of the classes of categ in the legend display -# If categ.class.order is NULL, classes are represented according to the alphabetical order -# If data1 is a data frame, categ.class.order must be a vector of character strings specifying the different classes in the categ column name of data1 -# If data1 is a list, then categ.class.order must be a list of vector of character strings, of same size as data1, with compartment 1 related to compartment 1 of data1, etc. Some of the list compartments can be NULL (alphabetical order for these compartments), and other not -# color: either (1) NULL, or (2) a vector of character strings or integers, or (3) a list of vectors of character strings or integers -# If color is NULL, default colors of ggplot2 -# If data1 is a data frame, color argument can be either: -# (1) a single color string. All the dots of the corresponding data1 will have this color, whatever the categ value (NULL or not) -# (2) if categ is non-null, a vector of string colors, one for each class of categ. Each color will be associated according to the categ.class.order argument if specified, or to the alphabetical order of categ classes otherwise -# (3) if categ is non-null, a vector or factor of string colors, like if it was one of the column of data1 data frame. WARNING: a single color per class of categ and a single class of categ per color must be respected -# Positive integers are also accepted instead of character strings, as long as above rules about length are respected. Integers will be processed by fun_gg_palette() using the max integer value among all the integers in color (see fun_gg_palette()) -# If data1 is a list, then color argument must be either: -# (1) a list of character strings or integers, of same size as data1, with compartment 1 related to compartment 1 of data1, etc. -# (2) a single character string or a single integer -# With a list (first possibility), the rules described for when data1 is a data frame apply to each compartment of the list. Some of the compartments can be NULL. In that case, a different grey color will be used for each NULL compartment. With a single value (second possibility), the same color will be used for all the dots and lines, whatever the data1 list -# geom: single character string of the kind of plot, or a list of single character strings -# Either: -# "geom_point" (scatterplot) -# "geom_line" (coordinates plotted then line connection, from the lowest to highest x coordinates first and from the lowest to highest y coordinates thenafter) -# "geom_path" (coordinates plotted then line connection respecting the row order in data1) -# "geom_step" coordinates plotted then line connection respecting the row order in data1 but drawn in steps). See the geom.step.dir argument -# "geom_hline" (horizontal line, no x value provided) -# "geom_vline" (vertical line, no y value provided) -# "geom_stick" (dots as vertical bars) -# If data1 is a list, then geom must be either: -# (1) a list of single character strings, of same size as data1, with compartment 1 related to compartment 1 of data1, etc. -# (2) a single character string. In that case the same kind of plot will apply for the different compartments of the data1 list -# WARNING concerning "geom_hline" or "geom_vline": -# (1) x or y argument must be NULL, respectively -# (2) x.lim or y.lim argument must NOT be NULL, respectively, if only these kind of lines are drawn (if other geom present, then x.lim = NULL and y.lim = NULL will generate x.lim and y.lim defined by these other geom, which is not possible with "geom_hline" or "geom_vline" alone) -# (3) the function will draw n lines for n values in the x argument column name of the data1 data frame. If several colors required, the categ argument must be specified and the corresponding categ column name must exist in the data1 data frame with a different class name for each row -# geom.step.dir: single character string indicating the direction when using "geom_step" of the geom argument, or a list of single character strings -# Either: -# "vh" (vertical then horizontal) -# "hv" (horizontal then vertical) -# "mid" (step half-way between adjacent x-values) -# See https://ggplot2.tidyverse.org/reference/geom_path.html -# If data1 is a list, then geom.step.dir must be either: -# (1) a list of single character strings, of same size as data1, with compartment 1 related to compartment 1 of data1, etc. The value in compartments related to other geom values than "geom_step" will be ignored -# (2) a single character string, which will be used for all the "geom_step" values of the geom argument, whatever the data1 list -# geom.stick.base: either (1) NULL or (2) a single numeric value or (3) a list of single numeric values, setting the base of the sticks when using "geom_stick" of the geom argument -# If geom.stick.base is NULL, the bottom limit of the y-axis is taken as the base -# If data1 is a list, then geom.stick.base must be either (1) a list of single numeric values, of same size as data1, with compartment 1 related to compartment 1 of data1, etc., or (2) a single numeric value. With a list (former possibility), the values in compartments related to other geom values than "geom_stick" will be ignored. With a single value (latter possibility), the same base will be used for all the sticks, whatever the data1 list -# Warning: the y-axis limits are not modified by the value of geom.stick.base, meaning that this value can be outside of the range of y.lim. Add the value of geom.stick.base also in the y.lim argument if required -# Warning: if geom.stick.base is NULL, the bottom limit of the y-axis is taken as the base. Thus, be careful with inverted y-axis -# alpha: single numeric value (from 0 to 1) of transparency. If data1 is a list, then alpha must be either (1) a list of single numeric values, of same size as data1, with compartment 1 related to compartment 1 of data1, etc., or (2) a single numeric value. In that case the same transparency will apply for the different compartments of the data1 list -# dot.size: single numeric value of dot shape radius? in mm. If data1 is a list, then dot.size must be either (1) a list of single numeric values, of same size as data1, with compartment 1 related to compartment 1 of data1, etc., or (2) a single numeric value. With a list (former possibility), the value in compartments related to lines will be ignored. With a single value (latter possibility), the same dot.size will be used for all the dots, whatever the data1 list -# dot.shape: value indicating the shape of the dots (see https://ggplot2.tidyverse.org/articles/ggplot2-specs.html) If data1 is a list, then dot.shape must be either (1) a list of single shape values, of same size as data1, with compartment 1 related to compartment 1 of data1, etc., or (2) a single shape value. With a list (former possibility), the value in compartments related to lines will be ignored. With a single value (latter possibility), the same dot.shape will be used for all the dots, whatever the data1 list -# dot.border.size: single numeric value of border dot width in mm. Write zero for no dot border. If data1 is a list, then dot.border.size must be either (1) a list of single numeric values, of same size as data1, with compartment 1 related to compartment 1 of data1, etc., or (2) a single numeric value. With a list (former possibility), the value in compartments related to lines will be ignored. With a single value (latter possibility), the same dot.border.size will be used for all the dots, whatever the data1 list -# dot.border.color: single character color string defining the color of the dot border (same border color for all the dots, whatever their categories). If dot.border.color == NULL, the border color will be the same as the dot color. A single integer is also accepted instead of a character string, that will be processed by fun_gg_palette() -# line.size: single numeric value of line width in mm. If data1 is a list, then line.size must be either (1) a list of single numeric values, of same size as data1, with compartment 1 related to compartment 1 of data1, etc., or (2) a single numeric value. With a list (former possibility), the value in compartments related to dots will be ignored. With a single value (latter possibility), the same line.size will be used for all the lines, whatever the data1 list -# line.type: value indicating the kind of lines (see https://ggplot2.tidyverse.org/articles/ggplot2-specs.html) If data1 is a list, then line.type must be either (1) a list of single line kind values, of same size as data1, with compartment 1 related to compartment 1 of data1, etc., or (2) a single line kind value. With a list (former possibility), the value in compartments related to dots will be ignored. With a single value (latter possibility), the same line.type will be used for all the lines, whatever the data1 list -# x.lim: 2 numeric values setting the x-axis range. Order of the 2 values matters (for inverted axis). If NULL, the range of the x column name of data1 will be used -# x.lab: a character string or expression for x-axis label. If NULL, will use the first value of x (x column name of the first data frame in data1). Warning message if the elements in x are different between data frames in data1 -# x.log: either "no", "log2" (values in the x column name of the data1 data frame will be log2 transformed and x-axis will be log2 scaled) or "log10" (values in the x column name of the data1 data frame will be log10 transformed and x-axis will be log10 scaled) -# x.tick.nb: approximate number of desired values labeling the x-axis (i.e., main ticks, see the n argument of the the cute::fun_scale() function). If NULL and if x.log is "no", then the number of labeling values is set by ggplot2. If NULL and if x.log is "log2" or "log10", then the number of labeling values corresponds to all the exposant integers in the x.lim range (e.g., 10^1, 10^2 and 10^3, meaning 3 main ticks for x.lim = c(9, 1200)). WARNING: if non-NULL and if x.log is "log2" or "log10", labeling can be difficult to read (e.g., ..., 10^2, 10^2.5, 10^3, ...) -# x.second.tick.nb: number of desired secondary ticks between main ticks. Ignored if x.log is other than "no" (log scale plotted). Use argument return = TRUE and see $plot$x.second.tick.values to have the values associated to secondary ticks. IF NULL, no secondary ticks -# x.include.zero: logical. Does x.lim range include 0? Ignored if x.log is "log2" or "log10" -# x.left.extra.margin: single proportion (between 0 and 1) indicating if extra margins must be added to x.lim. If different from 0, add the range of the axis multiplied by x.left.extra.margin (e.g., abs(x.lim[2] - x.lim[1]) * x.left.extra.margin) to the left of x-axis -# x.right.extra.margin: idem as x.left.extra.margin but to the right of x-axis -# x.text.angle: integer value of the text angle for the x-axis labeling values, using the same rules as in ggplot2. Use positive value for clockwise rotation: 0 for horizontal, 90 for vertical, 180 for upside down etc. Use negative values for counterclockwise rotation: 0 for horizontal, -90 for vertical, -180 for upside down etc. -# y.lim: 2 numeric values setting the y-axis range. Order of the 2 values matters (for inverted axis). If NULL, the range of the y column name of data1 will be used -# y.lab: a character string or expression for y-axis label. If NULL, will use the first value of y (y column name of the first data frame in data1). Warning message if the elements in y are different between data frames in data1 -# y.log: either "no", "log2" (values in the y column name of the data1 data frame will be log2 transformed and y-axis will be log2 scaled) or "log10" (values in the y column name of the data1 data frame will be log10 transformed and y-axis will be log10 scaled) -# y.tick.nb: approximate number of desired values labeling the y-axis (i.e., main ticks, see the n argument of the the cute::fun_scale() function). If NULL and if y.log is "no", then the number of labeling values is set by ggplot2. If NULL and if y.log is "log2" or "log10", then the number of labeling values corresponds to all the exposant integers in the y.lim range (e.g., 10^1, 10^2 and 10^3, meaning 3 main ticks for y.lim = c(9, 1200)). WARNING: if non-NULL and if y.log is "log2" or "log10", labeling can be difficult to read (e.g., ..., 10^2, 10^2.5, 10^3, ...) -# y.second.tick.nb: number of desired secondary ticks between main ticks. Ignored if y.log is other than "no" (log scale plotted). Use argument return = TRUE and see $plot$y.second.tick.values to have the values associated to secondary ticks. IF NULL, no secondary ticks -# y.include.zero: logical. Does y.lim range include 0? Ignored if y.log is "log2" or "log10" -# y.top.extra.margin: single proportion (between 0 and 1) indicating if extra margins must be added to y.lim. If different from 0, add the range of the axis multiplied by y.top.extra.margin (e.g., abs(y.lim[2] - y.lim[1]) * y.top.extra.margin) to the top of y-axis -# y.bottom.extra.margin: idem as y.top.extra.margin but to the bottom of y-axis -# y.text.angle: integer value of the text angle for the y-axis labeling values, using the same rules as in ggplot2. Use positive value for clockwise rotation: 0 for horizontal, 90 for vertical, 180 for upside down etc. Use negative values for counterclockwise rotation: 0 for horizontal, -90 for vertical, -180 for upside down etc. -# raster: logical. Dots in raster mode? If FALSE, dots from each "geom_point" from geom argument are plotted in vectorial mode (bigger pdf and long to display if lots of dots). If TRUE, dots from each "geom_point" from geom argument are plotted in matricial mode (smaller pdf and easy display if lots of dots, but it takes time to generate the layer). If TRUE, the raster.ratio argument is used to avoid an ellipsoid representation of the dots. If TRUE, solve the transparency problem with some GUI. Overriden by the non-NULL raster.threshold argument -# raster.ratio: single numeric value indicating the height / width ratio of the graphic device used (for instance provided by the $dim compartment in the output of the fun_open() function). The default value is 1 because by default R opens a square graphic device. But this argument has to be set when using other device dimensions. Ignored if raster == FALSE -# raster.threshold: positive integer value indicating the limit of the dot number above which "geom_point" layers from the geom argument switch from vectorial mode to matricial mode (see the raster argument). If any layer is matricial, then the raster.ratio argument is used to avoid an ellipsoid representation of the dots. If non-NULL, it overrides the raster argument -# text.size: numeric value of the font size of the (1) axis numbers and axis legends and (2) texts in the graphic legend (in mm) -# title: character string of the graph title -# title.text.size: numeric value of the title font size in mm -# legend.show: logical. Show legend? Not considered if categ argument is NULL, because this already generate no legend, excepted if legend.width argument is non-NULL. In that specific case (categ is NULL, legend.show is TRUE and legend.width is non-NULL), an empty legend space is created. This can be useful when desiring graphs of exactly the same width, whatever they have legends or not -# legend.width: single proportion (between 0 and 1) indicating the relative width of the legend sector (on the right of the plot) relative to the width of the plot. Value 1 means that the window device width is split in 2, half for the plot and half for the legend. Value 0 means no room for the legend, which will overlay the plot region. Write NULL to inactivate the legend sector. In such case, ggplot2 will manage the room required for the legend display, meaning that the width of the plotting region can vary between graphs, depending on the text in the legend -# legend.name: character string of the legend title. If legend.name is NULL and categ argument is not NULL, then legend.name <- categ. If data1 is a list, then legend.name must be a list of character strings, of same size as data1, with compartment 1 related to compartment 1 of data1, etc. Some of the list compartments can be NULL, and other not -# article: logical. If TRUE, use an article theme (article like). If FALSE, use a classic related ggplot theme. Use the add argument (e.g., add = "+ggplot2::theme_classic()" for the exact classic ggplot theme -# grid: logical. Draw lines in the background to better read the box values? Not considered if article == FALSE (grid systematically present) -# add: character string allowing to add more ggplot2 features (dots, lines, themes, facet, etc.). Ignored if NULL -# WARNING: (1) the string must start with "+", (2) the string must finish with ")" and (3) each function must be preceded by "ggplot2::". Example: "+ ggplot2::coord_flip() + ggplot2::theme_bw()" -# If the character string contains the "ggplot2::theme" string, then the article argument of fun_gg_scatter() (see above) is ignored with a warning -# Handle the add argument with caution since added functions can create conflicts with the preexisting internal ggplot2 functions -# WARNING: the call of objects inside the quotes of add can lead to an error if the name of these objects are some of the fun_gg_scatter() arguments. Indeed, the function will use the internal argument instead of the global environment object. Example article <- "a" in the working environment and add = '+ ggplot2::ggtitle(article)'. The risk here is to have TRUE as title. To solve this, use add = '+ ggplot2::ggtitle(get("article", envir = .GlobalEnv))' -# return: logical. Return the graph parameters? -# return.ggplot: logical. Return the ggplot object in the output list? Ignored if return argument is FALSE. WARNING: always assign the fun_gg_scatter() function (e.g., a <- fun_gg_scatter()) if return.ggplot argument is TRUE, otherwise, double plotting is performed. See $ggplot in the RETURN section below for more details -# return.gtable: logical. Return the ggplot object as gtable of grobs in the output list? Ignored if plot argument is FALSE. Indeed, the graph must be plotted to get the grobs dispositions. See $gtable in the RETURN section below for more details -# plot: logical. Plot the graphic? If FALSE and return argument is TRUE, graphical parameters and associated warnings are provided without plotting -# warn.print: logical. Print warnings at the end of the execution? ? If FALSE, warning messages are never printed, but can still be recovered in the returned list. Some of the warning messages (those delivered by the internal ggplot2 functions) are not apparent when using the argument plot = FALSE -# lib.path: character string indicating the absolute path of the required packages (see below). if NULL, the function will use the R library default folders -# RETURN -# a scatter plot if plot argument is TRUE -# a list of the graph info if return argument is TRUE: -# $data: the initial data with graphic information added. WARNING: if the x.log or y.log argument is not "no", x or y argument column of the data1 data frame are log2 or log10 converted in $data, respectively. Use 2^values or 10^$values to recover the initial values -# $removed.row.nb: a list of the removed rows numbers in data frames (because of NA). NULL if no row removed -# $removed.rows: a list of the removed rows in data frames (because of NA). NULL if no row removed -# $plot: the graphic box and dot coordinates -# $dots: dot coordinates -# y.second.tick.positions: coordinates of secondary ticks (only if y.second.tick.nb argument is non-null or if y.log argument is different from "no") -# y.second.tick.values: values of secondary ticks. NULL except if y.second.tick.nb argument is non-null or if y.log argument is different from "no") -# $panel: the variable names used for the panels (NULL if no panels). WARNING: NA can be present according to ggplot2 upgrade to v3.3.0 -# $axes: the x-axis and y-axis info -# $warn: the warning messages. Use cat() for proper display. NULL if no warning. WARNING: warning messages delivered by the internal ggplot2 functions are not apparent when using the argument plot = FALSE -# $ggplot: ggplot object that can be used for reprint (use print($ggplot) or update (use $ggplot + ggplot2::...). NULL if return.ggplot argument is FALSE. Of note, a non-null $ggplot in the output list is sometimes annoying as the manipulation of this list prints the plot -# $gtable: gtable object that can be used for reprint (use gridExtra::grid.arrange(...$ggplot) or with additionnal grobs (see the grob decomposition in the examples). NULL if return.ggplot argument is FALSE. Contrary to $ggplot, a non-NULL $gtable in the output list is not annoying as the manipulation of this list does not print the plot -# REQUIRED PACKAGES -# ggplot2 -# gridExtra -# lemon (in case of use in the add argument) -# scales -# if raster plots are drawn (see the raster and raster.threshold arguments): -# Cairo -# grid -# REQUIRED FUNCTIONS FROM THE cute PACKAGE -# fun_gg_empty_graph() -# fun_gg_palette() -# fun_gg_point_rast() -# fun_pack() -# fun_check() -# fun_round() -# fun_scale() -# fun_inter_ticks() -# EXAMPLES -# set.seed(1) ; obs1 <- data.frame(Km = c(2, 1, 6, 5, 4, 7), Time = c(2, 1, 6, 5, 4, 7)^2, Car = c("TUUT", "TUUT", "TUUT", "WIIM", "WIIM", "WIIM"), Color1 = rep(c("coral", "lightblue"), each = 3), stringsAsFactors = TRUE) ; fun_gg_scatter(data1 = obs1, x = "Km", y = "Time") -# DEBUGGING -# set.seed(1) ; obs1 <- data.frame(km = rnorm(1000, 10, 3), time = rnorm(1000, 10, 3), group1 = rep(c("A1", "A2"), 500), stringsAsFactors = TRUE) ; obs2 <-data.frame(km = rnorm(1000, 15, 3), time = rnorm(1000, 15, 3), group2 = rep(c("G1", "G2"), 500), stringsAsFactors = TRUE) ; set.seed(NULL) ; obs1$km[2:3] <- NA ; data1 = list(L1 = obs1, L2 = obs2) ; x = list(L1 = "km", L2 = "km") ; y = list(L1 = "time", L2 = "time") ; categ = list(L1 = "group1", L2 = "group2") ; categ = NULL ; categ.class.order = NULL ; color = NULL ; geom = "geom_point" ; geom.step.dir = "hv" ; geom.stick.base = NULL, alpha = 0.5 ; dot.size = 2 ; dot.shape = 21 ; dot.border.size = 0.5 ; dot.border.color = NULL ; line.size = 0.5 ; line.type = "solid" ; x.lim = NULL ; x.lab = NULL ; x.log = "no" ; x.tick.nb = NULL ; x.second.tick.nb = NULL ; x.include.zero = FALSE ; x.left.extra.margin = 0.05 ; x.right.extra.margin = 0.05 ; x.text.angle = 0 ; y.lim = NULL ; y.lab = NULL ; y.log = "no" ; y.tick.nb = NULL ; y.second.tick.nb = NULL ; y.include.zero = FALSE ; y.top.extra.margin = 0.05 ; y.bottom.extra.margin = 0.05 ; y.text.angle = 0 ; raster = FALSE ; raster.ratio = 1 ; raster.threshold = NULL ; text.size = 12 ; title = "" ; title.text.size = 12 ; legend.show = TRUE ; legend.width = 0.5 ; legend.name = NULL ; article = TRUE ; grid = FALSE ; add = NULL ; return = FALSE ; return.ggplot = FALSE ; return.gtable = TRUE ; plot = TRUE ; warn.print = FALSE ; lib.path = NULL -# function name -function.name <- paste0(as.list(match.call(expand.dots=FALSE))[[1]], "()") -arg.names <- names(formals(fun = sys.function(sys.parent(n = 2)))) # names of all the arguments -arg.user.setting <- as.list(match.call(expand.dots=FALSE))[-1] # list of the argument settings (excluding default values not provided by the user) -# end function name -# required function checking -req.function <- c( -"fun_check", -"fun_gg_just", -"fun_gg_empty_graph", -"fun_gg_palette", -"fun_gg_point_rast", -"fun_round", -"fun_pack", -"fun_scale", -"fun_inter_ticks" -) -tempo <- NULL -for(i1 in req.function){ -if(length(find(i1, mode = "function"))== 0L){ -tempo <- c(tempo, i1) -} -} -if( ! is.null(tempo)){ -tempo.cat <- paste0("ERROR IN ", function.name, "\nREQUIRED cute FUNCTION", ifelse(length(tempo) > 1, "S ARE", " IS"), " MISSING IN THE R ENVIRONMENT:\n", paste0(tempo, collapse = "()\n")) -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n"), call. = FALSE) # == in stop() to be able to add several messages between == -} -# end required function checking -# reserved words to avoid bugs (used in this function) -reserved.words <- c("fake_x", "fake_y", "fake_categ") -# end reserved words to avoid bugs (used in this function) -# arg with no default values -mandat.args <- c( -"data1", -"x", -"y" -) -tempo <- eval(parse(text = paste0("missing(", paste0(mandat.args, collapse = ") | missing("), ")"))) -if(any(tempo)){ -tempo.cat <- paste0("ERROR IN ", function.name, "\nFOLLOWING ARGUMENT", ifelse(length(mandat.args) > 1, "S HAVE", "HAS"), " NO DEFAULT VALUE AND REQUIRE ONE:\n", paste0(mandat.args, collapse = "\n")) -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n"), call. = FALSE) # == in stop() to be able to add several messages between == -} -# end arg with no default values -# argument primary checking -arg.check <- NULL # -text.check <- NULL # -checked.arg.names <- NULL # for function debbuging: used by r_debugging_tools -ee <- expression(arg.check <- c(arg.check, tempo$problem) , text.check <- c(text.check, tempo$text) , checked.arg.names <- c(checked.arg.names, tempo$object.name)) -tempo1 <- fun_check(data = data1, class = "data.frame", na.contain = TRUE, fun.name = function.name) -tempo2 <- fun_check(data = data1, class = "list", na.contain = TRUE, fun.name = function.name) -checked.arg.names <- c(checked.arg.names, tempo2$object.name) -if(tempo1$problem == TRUE & tempo2$problem == TRUE){ -tempo.cat <- paste0("ERROR IN ", function.name, ": data1 ARGUMENT MUST BE A DATA FRAME OR A LIST OF DATA FRAMES") -text.check <- c(text.check, tempo.cat) -arg.check <- c(arg.check, TRUE) -} -if( ! is.null(x)){ -tempo1 <- fun_check(data = x, class = "vector", mode = "character", na.contain = TRUE, length = 1, fun.name = function.name) -tempo2 <- fun_check(data = x, class = "list", na.contain = TRUE, fun.name = function.name) -checked.arg.names <- c(checked.arg.names, tempo2$object.name) -if(tempo1$problem == TRUE & tempo2$problem == TRUE){ -tempo.cat <- paste0("ERROR IN ", function.name, ": x ARGUMENT MUST BE A SINGLE CHARACTER STRING OR A LIST OF CHARACTER STRINGS") -text.check <- c(text.check, tempo.cat) -arg.check <- c(arg.check, TRUE) -} -}else{ -# no fun_check test here, it is just for checked.arg.names -tempo <- fun_check(data = x, class = "vector") -checked.arg.names <- c(checked.arg.names, tempo$object.name) -} -if( ! is.null(y)){ -tempo1 <- fun_check(data = y, class = "vector", mode = "character", na.contain = TRUE, length = 1, fun.name = function.name) -tempo2 <- fun_check(data = y, class = "list", na.contain = TRUE, fun.name = function.name) -checked.arg.names <- c(checked.arg.names, tempo2$object.name) -if(tempo1$problem == TRUE & tempo2$problem == TRUE){ -tempo.cat <- paste0("ERROR IN ", function.name, ": y ARGUMENT MUST BE A SINGLE CHARACTER STRING OR A LIST OF CHARACTER STRINGS") -text.check <- c(text.check, tempo.cat) -arg.check <- c(arg.check, TRUE) -} -}else{ -# no fun_check test here, it is just for checked.arg.names -tempo <- fun_check(data = y, class = "vector") -checked.arg.names <- c(checked.arg.names, tempo$object.name) -} -if( ! is.null(categ)){ -tempo1 <- fun_check(data = categ, class = "vector", mode = "character", length = 1, fun.name = function.name) -tempo2 <- fun_check(data = categ, class = "list", na.contain = TRUE, fun.name = function.name) -checked.arg.names <- c(checked.arg.names, tempo2$object.name) -if(tempo1$problem == TRUE & tempo2$problem == TRUE){ -tempo.cat <- paste0("ERROR IN ", function.name, ": categ ARGUMENT MUST BE A SINGLE CHARACTER STRING OR A LIST OF CHARACTER STRINGS") -text.check <- c(text.check, tempo.cat) -arg.check <- c(arg.check, TRUE) -} -}else{ -# no fun_check test here, it is just for checked.arg.names -tempo <- fun_check(data = categ, class = "vector") -checked.arg.names <- c(checked.arg.names, tempo$object.name) -} -if( ! is.null(categ.class.order)){ -if(is.null(categ)){ -tempo.cat <- paste0("ERROR IN ", function.name, ": categ.class.order ARGUMENT IS NOT NULL, BUT categ IS") -text.check <- c(text.check, tempo.cat) -arg.check <- c(arg.check, TRUE) -} -tempo1 <- fun_check(data = categ.class.order, class = "vector", mode = "character", fun.name = function.name) -tempo2 <- fun_check(data = categ.class.order, class = "list", na.contain = TRUE, fun.name = function.name) -checked.arg.names <- c(checked.arg.names, tempo2$object.name) -if(tempo1$problem == TRUE & tempo2$problem == TRUE){ -tempo.cat <- paste0("ERROR IN ", function.name, ": categ.class.order ARGUMENT MUST BE A VECTOR OF CHARACTER STRINGS OR A LIST OF VECTOR OF CHARACTER STRINGS") -text.check <- c(text.check, tempo.cat) -arg.check <- c(arg.check, TRUE) -} -}else{ -# no fun_check test here, it is just for checked.arg.names -tempo <- fun_check(data = categ.class.order, class = "vector") -checked.arg.names <- c(checked.arg.names, tempo$object.name) -} -if( ! is.null(legend.name)){ -tempo1 <- fun_check(data = legend.name, class = "vector", mode = "character", na.contain = TRUE, length = 1, fun.name = function.name) -tempo2 <- fun_check(data = legend.name, class = "list", na.contain = TRUE, fun.name = function.name) -checked.arg.names <- c(checked.arg.names, tempo2$object.name) -if(tempo1$problem == TRUE & tempo2$problem == TRUE){ -tempo.cat <- paste0("ERROR IN ", function.name, ": legend.name ARGUMENT MUST BE A SINGLE CHARACTER STRING OR A LIST OF CHARACTER STRINGS") -text.check <- c(text.check, tempo.cat) -arg.check <- c(arg.check, TRUE) -} -}else{ -# no fun_check test here, it is just for checked.arg.names -tempo <- fun_check(data = legend.name, class = "vector") -checked.arg.names <- c(checked.arg.names, tempo$object.name) -} -if( ! is.null(color)){ -tempo1 <- fun_check(data = color, class = "vector", mode = "character", na.contain = TRUE, fun.name = function.name) -tempo2 <- fun_check(data = color, class = "factor", na.contain = TRUE, fun.name = function.name) -tempo3 <- fun_check(data = color, class = "integer", double.as.integer.allowed = TRUE, na.contain = TRUE, fun.name = function.name) -tempo4 <- fun_check(data = color, class = "list", na.contain = TRUE, fun.name = function.name) -checked.arg.names <- c(checked.arg.names, tempo4$object.name) -if(tempo1$problem == TRUE & tempo2$problem == TRUE & tempo3$problem == TRUE & tempo4$problem == TRUE){ -tempo.cat <- paste0("ERROR IN ", function.name, ": color ARGUMENT MUST BE A VECTOR (OF CHARACTER STRINGS OR INTEGERS) OR A FACTOR OR A LIST OF THESE POSSIBILITIES") -text.check <- c(text.check, tempo.cat) -arg.check <- c(arg.check, TRUE) -} -}else{ -# no fun_check test here, it is just for checked.arg.names -tempo <- fun_check(data = color, class = "vector") -checked.arg.names <- c(checked.arg.names, tempo$object.name) -} -tempo1 <- fun_check(data = geom, class = "vector", mode = "character", na.contain = FALSE, length = 1, fun.name = function.name) -tempo2 <- fun_check(data = geom, class = "list", na.contain = TRUE, fun.name = function.name) -checked.arg.names <- c(checked.arg.names, tempo2$object.name) -if(tempo1$problem == TRUE & tempo2$problem == TRUE){ -tempo.cat <- paste0("ERROR IN ", function.name, ": geom ARGUMENT MUST BE A SINGLE CHARACTER STRING OR A LIST OF CHARACTER STRINGS") -text.check <- c(text.check, tempo.cat) -arg.check <- c(arg.check, TRUE) -} -tempo1 <- fun_check(data = geom.step.dir, options = c("vh", "hv", "mid"), na.contain = FALSE, length = 1, fun.name = function.name) -tempo2 <- fun_check(data = geom.step.dir, class = "list", na.contain = TRUE, fun.name = function.name) -checked.arg.names <- c(checked.arg.names, tempo2$object.name) -if(tempo1$problem == TRUE & tempo2$problem == TRUE){ -tempo.cat <- paste0("ERROR IN ", function.name, ": geom.step.dir ARGUMENT MUST BE A SINGLE CHARACTER STRING (\"vh\" OR \"hv\" OR \"mid\") OR A LIST OF THESE CHARACTER STRINGS") -text.check <- c(text.check, tempo.cat) -arg.check <- c(arg.check, TRUE) -} -if( ! is.null(geom.stick.base)){ -tempo1 <- fun_check(data = geom.stick.base, class = "vector", mode = "numeric", na.contain = FALSE, length = 1, fun.name = function.name) -tempo2 <- fun_check(data = color, class = "list", na.contain = TRUE, fun.name = function.name) -checked.arg.names <- c(checked.arg.names, tempo2$object.name) -if(tempo1$problem == TRUE & tempo2$problem == TRUE){ -tempo.cat <- paste0("ERROR IN ", function.name, ": geom.stick.base ARGUMENT MUST BE A SINGLE NUMERIC VALUE OR A LIST OF SINGLE NUMERIC VALUES") -text.check <- c(text.check, tempo.cat) -arg.check <- c(arg.check, TRUE) -} -}else{ -# no fun_check test here, it is just for checked.arg.names -tempo <- fun_check(data = geom.stick.base, class = "vector") -checked.arg.names <- c(checked.arg.names, tempo$object.name) -} -tempo1 <- fun_check(data = alpha, prop = TRUE, length = 1, fun.name = function.name) -tempo2 <- fun_check(data = alpha, class = "list", na.contain = TRUE, fun.name = function.name) -checked.arg.names <- c(checked.arg.names, tempo2$object.name) -if(tempo1$problem == TRUE & tempo2$problem == TRUE){ -tempo.cat <- paste0("ERROR IN ", function.name, ": alpha ARGUMENT MUST BE A SINGLE NUMERIC VALUE BETWEEN 0 AND 1 OR A LIST OF SUCH VALUES") -text.check <- c(text.check, tempo.cat) -arg.check <- c(arg.check, TRUE) -} -tempo1 <- fun_check(data = dot.size, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) -tempo2 <- fun_check(data = dot.size, class = "list", na.contain = TRUE, fun.name = function.name) -checked.arg.names <- c(checked.arg.names, tempo2$object.name) -if(tempo1$problem == TRUE & tempo2$problem == TRUE){ -tempo.cat <- paste0("ERROR IN ", function.name, ": dot.size ARGUMENT MUST BE A SINGLE NUMERIC VALUE OR A LIST OF SINGLE NUMERIC VALUES") -text.check <- c(text.check, tempo.cat) -arg.check <- c(arg.check, TRUE) -} -tempo1 <- fun_check(data = dot.shape, class = "vector", length = 1, fun.name = function.name) -tempo2 <- fun_check(data = dot.shape, class = "list", na.contain = TRUE, fun.name = function.name) -checked.arg.names <- c(checked.arg.names, tempo2$object.name) -if(tempo1$problem == TRUE & tempo2$problem == TRUE){ -tempo.cat <- paste0("ERROR IN ", function.name, ": dot.shape ARGUMENT MUST BE A SINGLE SHAPE VALUE OR A LIST OF SINGLE SHAPE VALUES (SEE https://ggplot2.tidyverse.org/articles/ggplot2-specs.html)") -text.check <- c(text.check, tempo.cat) -arg.check <- c(arg.check, TRUE) -} -tempo1 <- fun_check(data = dot.border.size, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) -tempo2 <- fun_check(data = dot.border.size, class = "list", na.contain = TRUE, fun.name = function.name) -checked.arg.names <- c(checked.arg.names, tempo2$object.name) -if(tempo1$problem == TRUE & tempo2$problem == TRUE){ -tempo.cat <- paste0("ERROR IN ", function.name, ": dot.border.size ARGUMENT MUST BE A SINGLE NUMERIC VALUE OR A LIST OF SINGLE NUMERIC VALUES") -text.check <- c(text.check, tempo.cat) -arg.check <- c(arg.check, TRUE) -} -if( ! is.null(dot.border.color)){ -tempo1 <- fun_check(data = dot.border.color, class = "vector", mode = "character", length = 1, fun.name = function.name) -tempo2 <- fun_check(data = dot.border.color, class = "vector", typeof = "integer", double.as.integer.allowed = TRUE, length = 1, fun.name = function.name) -checked.arg.names <- c(checked.arg.names, tempo2$object.name) -if(tempo1$problem == TRUE & tempo2$problem == TRUE){ -# integer colors -> gg_palette -tempo.cat <- paste0("ERROR IN ", function.name, ": dot.border.color MUST BE A SINGLE CHARACTER STRING OF COLOR OR A SINGLE INTEGER VALUE") -text.check <- c(text.check, tempo.cat) -arg.check <- c(arg.check, TRUE) -} -}else{ -# no fun_check test here, it is just for checked.arg.names -tempo <- fun_check(data = dot.border.color, class = "vector") -checked.arg.names <- c(checked.arg.names, tempo$object.name) -} -tempo1 <- fun_check(data = line.size, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) -tempo2 <- fun_check(data = line.size, class = "list", na.contain = TRUE, fun.name = function.name) -checked.arg.names <- c(checked.arg.names, tempo2$object.name) -if(tempo1$problem == TRUE & tempo2$problem == TRUE){ -tempo.cat <- paste0("ERROR IN ", function.name, ": line.size ARGUMENT MUST BE A SINGLE NUMERIC VALUE OR A LIST OF SINGLE NUMERIC VALUES") -text.check <- c(text.check, tempo.cat) -arg.check <- c(arg.check, TRUE) -} -tempo1 <- fun_check(data = line.type, class = "vector", typeof = "integer", double.as.integer.allowed = FALSE, length = 1, fun.name = function.name) -tempo2 <- fun_check(data = line.type, class = "vector", mode = "character", length = 1, fun.name = function.name) -tempo3 <- fun_check(data = line.type, class = "list", na.contain = TRUE, fun.name = function.name) -checked.arg.names <- c(checked.arg.names, tempo3$object.name) -if(tempo1$problem == TRUE & tempo2$problem == TRUE & tempo3$problem == TRUE){ -tempo.cat <- paste0("ERROR IN ", function.name, ": line.type ARGUMENT MUST BE A SINGLE LINE KIND VALUE OR A LIST OF SINGLE LINE KIND VALUES (SEE https://ggplot2.tidyverse.org/articles/ggplot2-specs.html)") -text.check <- c(text.check, tempo.cat) -arg.check <- c(arg.check, TRUE) -} -if( ! is.null(x.lim)){ -tempo <- fun_check(data = x.lim, class = "vector", mode = "numeric", length = 2, fun.name = function.name) ; eval(ee) -if(tempo$problem == FALSE & any(x.lim %in% c(Inf, -Inf))){ -tempo.cat <- paste0("ERROR IN ", function.name, ": x.lim ARGUMENT CANNOT CONTAIN -Inf OR Inf VALUES") -text.check <- c(text.check, tempo.cat) -arg.check <- c(arg.check, TRUE) -} -}else{ -# no fun_check test here, it is just for checked.arg.names -tempo <- fun_check(data = x.lim, class = "vector") -checked.arg.names <- c(checked.arg.names, tempo$object.name) -} -if( ! is.null(x.lab)){ -if(all(class(x.lab) %in% "expression")){ # to deal with math symbols -tempo <- fun_check(data = x.lab, class = "expression", length = 1, fun.name = function.name) ; eval(ee) -}else{ -tempo <- fun_check(data = x.lab, class = "vector", mode = "character", length = 1, fun.name = function.name) ; eval(ee) -} -}else{ -# no fun_check test here, it is just for checked.arg.names -tempo <- fun_check(data = x.lab, class = "vector") -checked.arg.names <- c(checked.arg.names, tempo$object.name) -} -tempo <- fun_check(data = x.log, options = c("no", "log2", "log10"), length = 1, fun.name = function.name) ; eval(ee) -if( ! is.null(x.tick.nb)){ -tempo <- fun_check(data = x.tick.nb, class = "vector", typeof = "integer", length = 1, double.as.integer.allowed = TRUE, fun.name = function.name) ; eval(ee) -if(tempo$problem == FALSE & x.tick.nb < 0){ -tempo.cat <- paste0("ERROR IN ", function.name, ": x.tick.nb ARGUMENT MUST BE A NON-NULL POSITIVE INTEGER") -text.check <- c(text.check, tempo.cat) -arg.check <- c(arg.check, TRUE) -} -}else{ -# no fun_check test here, it is just for checked.arg.names -tempo <- fun_check(data = x.tick.nb, class = "vector") -checked.arg.names <- c(checked.arg.names, tempo$object.name) -} -if( ! is.null(x.second.tick.nb)){ -tempo <- fun_check(data = x.second.tick.nb, class = "vector", typeof = "integer", length = 1, double.as.integer.allowed = TRUE, fun.name = function.name) ; eval(ee) -if(tempo$problem == FALSE & x.second.tick.nb <= 0){ -tempo.cat <- paste0("ERROR IN ", function.name, ": x.second.tick.nb ARGUMENT MUST BE A NON-NULL POSITIVE INTEGER") -text.check <- c(text.check, tempo.cat) -arg.check <- c(arg.check, TRUE) -} -}else{ -# no fun_check test here, it is just for checked.arg.names -tempo <- fun_check(data = x.second.tick.nb, class = "vector") -checked.arg.names <- c(checked.arg.names, tempo$object.name) -} -tempo <- fun_check(data = x.include.zero, class = "vector", mode = "logical", length = 1, fun.name = function.name) ; eval(ee) -tempo <- fun_check(data = x.left.extra.margin, prop = TRUE, length = 1, fun.name = function.name) ; eval(ee) -tempo <- fun_check(data = x.right.extra.margin, prop = TRUE, length = 1, fun.name = function.name) ; eval(ee) -tempo <- fun_check(data = x.text.angle, class = "vector", typeof = "integer", double.as.integer.allowed = TRUE, length = 1, neg.values = TRUE, fun.name = function.name) ; eval(ee) -if( ! is.null(y.lim)){ -tempo <- fun_check(data = y.lim, class = "vector", mode = "numeric", length = 2, fun.name = function.name) ; eval(ee) -if(tempo$problem == FALSE & any(y.lim %in% c(Inf, -Inf))){ -tempo.cat <- paste0("ERROR IN ", function.name, ": y.lim ARGUMENT CANNOT CONTAIN -Inf OR Inf VALUES") -text.check <- c(text.check, tempo.cat) -arg.check <- c(arg.check, TRUE) -} -}else{ -# no fun_check test here, it is just for checked.arg.names -tempo <- fun_check(data = y.lim, class = "vector") -checked.arg.names <- c(checked.arg.names, tempo$object.name) -} -if( ! is.null(y.lab)){ -if(all(class(y.lab) %in% "expression")){ # to deal with math symbols -tempo <- fun_check(data = y.lab, class = "expression", length = 1, fun.name = function.name) ; eval(ee) -}else{ -tempo <- fun_check(data = y.lab, class = "vector", mode = "character", length = 1, fun.name = function.name) ; eval(ee) -} -}else{ -# no fun_check test here, it is just for checked.arg.names -tempo <- fun_check(data = y.lab, class = "vector") -checked.arg.names <- c(checked.arg.names, tempo$object.name) -} -tempo <- fun_check(data = y.log, options = c("no", "log2", "log10"), length = 1, fun.name = function.name) ; eval(ee) -if( ! is.null(y.tick.nb)){ -tempo <- fun_check(data = y.tick.nb, class = "vector", typeof = "integer", length = 1, double.as.integer.allowed = TRUE, fun.name = function.name) ; eval(ee) -if(tempo$problem == FALSE & y.tick.nb < 0){ -tempo.cat <- paste0("ERROR IN ", function.name, ": y.tick.nb ARGUMENT MUST BE A NON-NULL POSITIVE INTEGER") -text.check <- c(text.check, tempo.cat) -arg.check <- c(arg.check, TRUE) -} -}else{ -# no fun_check test here, it is just for checked.arg.names -tempo <- fun_check(data = y.tick.nb, class = "vector") -checked.arg.names <- c(checked.arg.names, tempo$object.name) -} -if( ! is.null(y.second.tick.nb)){ -tempo <- fun_check(data = y.second.tick.nb, class = "vector", typeof = "integer", length = 1, double.as.integer.allowed = TRUE, fun.name = function.name) ; eval(ee) -if(tempo$problem == FALSE & y.second.tick.nb <= 0){ -tempo.cat <- paste0("ERROR IN ", function.name, ": y.second.tick.nb ARGUMENT MUST BE A NON-NULL POSITIVE INTEGER") -text.check <- c(text.check, tempo.cat) -arg.check <- c(arg.check, TRUE) -} -}else{ -# no fun_check test here, it is just for checked.arg.names -tempo <- fun_check(data = y.second.tick.nb, class = "vector") -checked.arg.names <- c(checked.arg.names, tempo$object.name) -} -tempo <- fun_check(data = y.include.zero, class = "vector", mode = "logical", length = 1, fun.name = function.name) ; eval(ee) -tempo <- fun_check(data = y.top.extra.margin, prop = TRUE, length = 1, fun.name = function.name) ; eval(ee) -tempo <- fun_check(data = y.bottom.extra.margin, prop = TRUE, length = 1, fun.name = function.name) ; eval(ee) -tempo <- fun_check(data = y.text.angle, class = "vector", typeof = "integer", double.as.integer.allowed = TRUE, length = 1, neg.values = TRUE, fun.name = function.name) ; eval(ee) -tempo <- fun_check(data = raster, class = "logical", length = 1, fun.name = function.name) ; eval(ee) -tempo <- fun_check(data = raster.ratio, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) -if( ! is.null(raster.threshold)){ -tempo <- fun_check(data = raster.threshold, class = "vector", typeof = "integer", neg.values = FALSE, double.as.integer.allowed = TRUE, fun.name = function.name) ; eval(ee) -}else{ -# no fun_check test here, it is just for checked.arg.names -tempo <- fun_check(data = raster.threshold, class = "vector") -checked.arg.names <- c(checked.arg.names, tempo$object.name) -} -tempo <- fun_check(data = text.size, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) -tempo <- fun_check(data = title, class = "vector", mode = "character", length = 1, fun.name = function.name) ; eval(ee) -tempo <- fun_check(data = title.text.size, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) -tempo <- fun_check(data = legend.show, class = "logical", length = 1, fun.name = function.name) ; eval(ee) -if( ! is.null(legend.width)){ -tempo <- fun_check(data = legend.width, prop = TRUE, length = 1, fun.name = function.name) ; eval(ee) -}else{ -# no fun_check test here, it is just for checked.arg.names -tempo <- fun_check(data = legend.width, class = "vector") -checked.arg.names <- c(checked.arg.names, tempo$object.name) -} -tempo <- fun_check(data = article, class = "logical", length = 1, fun.name = function.name) ; eval(ee) -tempo <- fun_check(data = grid, class = "logical", length = 1, fun.name = function.name) ; eval(ee) -if( ! is.null(add)){ -tempo <- fun_check(data = add, class = "vector", mode = "character", length = 1, fun.name = function.name) ; eval(ee) -}else{ -# no fun_check test here, it is just for checked.arg.names -tempo <- fun_check(data = add, class = "vector") -checked.arg.names <- c(checked.arg.names, tempo$object.name) -} -tempo <- fun_check(data = return, class = "logical", length = 1, fun.name = function.name) ; eval(ee) -tempo <- fun_check(data = return.ggplot, class = "logical", length = 1, fun.name = function.name) ; eval(ee) -tempo <- fun_check(data = return.gtable, class = "logical", length = 1, fun.name = function.name) ; eval(ee) -tempo <- fun_check(data = plot, class = "logical", length = 1, fun.name = function.name) ; eval(ee) -tempo <- fun_check(data = warn.print, class = "logical", length = 1, fun.name = function.name) ; eval(ee) -if( ! is.null(lib.path)){ -tempo <- fun_check(data = lib.path, class = "vector", mode = "character", fun.name = function.name) ; eval(ee) -if(tempo$problem == FALSE){ -if( ! all(dir.exists(lib.path))){ # separation to avoid the problem of tempo$problem == FALSE and lib.path == NA -tempo.cat <- paste0("ERROR IN ", function.name, ": DIRECTORY PATH INDICATED IN THE lib.path ARGUMENT DOES NOT EXISTS:\n", paste(lib.path, collapse = "\n")) -text.check <- c(text.check, tempo.cat) -arg.check <- c(arg.check, TRUE) -} -} -}else{ -# no fun_check test here, it is just for checked.arg.names -tempo <- fun_check(data = lib.path, class = "vector") -checked.arg.names <- c(checked.arg.names, tempo$object.name) -} -if(any(arg.check) == TRUE){ -stop(paste0("\n\n================\n\n", paste(text.check[arg.check], collapse = "\n"), "\n\n================\n\n"), call. = FALSE) # -} -# source("C:/Users/Gael/Documents/Git_versions_to_use/debugging_tools_for_r_dev-v1.7/r_debugging_tools-v1.7.R") ; eval(parse(text = str_basic_arg_check_dev)) ; eval(parse(text = str_arg_check_with_fun_check_dev)) # activate this line and use the function (with no arguments left as NULL) to check arguments status and if they have been checked using fun_check() -# end argument primary checking - - -# second round of checking and data preparation -# management of NA arguments -tempo.arg <- names(arg.user.setting) # values provided by the user -tempo.log <- suppressWarnings(sapply(lapply(lapply(tempo.arg, FUN = get, env = sys.nframe(), inherit = FALSE), FUN = is.na), FUN = any)) & lapply(lapply(tempo.arg, FUN = get, env = sys.nframe(), inherit = FALSE), FUN = length)== 1L # no argument provided by the user can be just NA -if(any(tempo.log) == TRUE){ -tempo.cat <- paste0("ERROR IN ", function.name, ":\n", ifelse(sum(tempo.log, na.rm = TRUE) > 1, "THESE ARGUMENTS\n", "THIS ARGUMENT\n"), paste0(tempo.arg[tempo.log], collapse = "\n"),"\nCANNOT JUST BE NA") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n"), call. = FALSE) # == in stop() to be able to add several messages between == -} -# end management of NA arguments -# management of NULL arguments -tempo.arg <-c( -"data1", -# "x", # inactivated because of hline or vline -# "y", # inactivated because of hline or vline -"geom", -"geom.step.dir", -# "geom.stick.base", # inactivated because can be null -"alpha", -"dot.size", -"dot.shape", -"dot.border.size", -"line.size", -"line.type", -"x.log", -"x.include.zero", -"x.left.extra.margin", -"x.right.extra.margin", -"x.text.angle", -"y.log", -"y.include.zero", -"y.top.extra.margin", -"y.bottom.extra.margin", -"y.text.angle", -"raster", -"raster.ratio", -"text.size", -"title", -"title.text.size", -"legend.show", -# "legend.width", # inactivated because can be null -"article", -"grid", -"return", -"return.ggplot", -"return.gtable", -"plot", -"warn.print" -) -tempo.log <- sapply(lapply(tempo.arg, FUN = get, env = sys.nframe(), inherit = FALSE), FUN = is.null) -if(any(tempo.log) == TRUE){ -tempo.cat <- paste0("ERROR IN ", function.name, ":\n", ifelse(sum(tempo.log, na.rm = TRUE) > 1, "THESE ARGUMENTS\n", "THIS ARGUMENT\n"), paste0(tempo.arg[tempo.log], collapse = "\n"),"\nCANNOT BE NULL") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n"), call. = FALSE) # == in stop() to be able to add several messages between == -} -# end management of NULL arguments -# code that protects set.seed() in the global environment -# end code that protects set.seed() in the global environment -# warning initiation -ini.warning.length <- options()$warning.length -options(warning.length = 8170) -warn <- NULL -warn.count <- 0 -# end warning initiation -# other checkings -# check list lengths (and names of data1 compartments if present) -list.color <- NULL -list.geom <- NULL -list.geom.step.dir <- NULL -list.geom.stick.base <- NULL -list.alpha <- NULL -list.dot.size <- NULL -list.dot.shape <- NULL -list.dot.border.size <- NULL -list.dot.border.color <- NULL -list.line.size <- NULL -list.line.type <- NULL -if(all(class(data1) == "list")){ -if(length(data1) > 6){ -tempo.cat <- paste0("ERROR IN ", function.name, ": data1 ARGUMENT MUST BE A LIST OF 6 DATA FRAMES MAXIMUM (6 OVERLAYS MAX)") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -} -if(is.null(names(data1))){ -names(data1) <- paste0("L", 1:length(data1)) -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") NULL NAME COMPARTMENT OF data1 LIST -> NAMES RESPECTIVELY ATTRIBUTED TO EACH COMPARTMENT:\n", paste(names(data1), collapse = " ")) -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -} -if( ! is.null(x)){ -if( ! (all(class(x) == "list") & length(data1) == length(x))){ -tempo.cat <- paste0("ERROR IN ", function.name, ": x ARGUMENT MUST BE A LIST OF SAME LENGTH AS data1 IF data1 IS A LIST") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -} -}else{ -x <- vector("list", length(data1)) -} -if( ! is.null(y)){ -if( ! (all(class(y) == "list") & length(data1) == length(y))){ -tempo.cat <- paste0("ERROR IN ", function.name, ": y ARGUMENT MUST BE A LIST OF SAME LENGTH AS data1 IF data1 IS A LIST") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -} -}else{ -y <- vector("list", length(data1)) -} -if( ! is.null(categ)){ -if( ! (all(class(categ) == "list") & length(data1) == length(categ))){ -tempo.cat <- paste0("ERROR IN ", function.name, ": categ ARGUMENT MUST BE A LIST OF SAME LENGTH AS data1 IF data1 IS A LIST") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -} -} -if( ! is.null(categ.class.order)){ -if( ! (all(class(categ.class.order) == "list") & length(data1) == length(categ.class.order))){ -tempo.cat <- paste0("ERROR IN ", function.name, ": categ.class.order ARGUMENT MUST BE A LIST OF SAME LENGTH AS data1 IF data1 IS A LIST") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -} -} -if( ! is.null(color)){ -if( ! ((all(class(color) == "list") & length(data1) == length(color)) | ((all(mode(color) == "character") | all(mode(color) == "numeric")) & length(color)== 1L))){ # list of same length as data1 or single value -tempo.cat <- paste0("ERROR IN ", function.name, ": color ARGUMENT MUST BE A LIST OF SAME LENGTH AS data1 IF data1 IS A LIST, OR A SINGLE CHARACTER STRING OR INTEGER") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -}else if((all(mode(color) == "character") | all(mode(color) == "numeric")) & length(color)== 1L){ # convert the single value into a list of single value -list.color <- vector(mode = "list", length = length(data1)) -list.color[] <- color -} -} -if( ! ((all(class(geom) == "list") & length(data1) == length(geom)) | (all(mode(geom) == "character") & length(geom)== 1L))){ # list of same length as data1 or single value -tempo.cat <- paste0("ERROR IN ", function.name, ": geom ARGUMENT MUST BE A LIST OF SAME LENGTH AS data1 IF data1 IS A LIST, OR A SINGLE CHARACTER VALUE") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -}else if(all(mode(geom) == "character") & length(geom)== 1L){ # convert the single value into a list of single value -list.geom <- vector(mode = "list", length = length(data1)) -list.geom[] <- geom -} -if( ! ((all(class(geom.step.dir) == "list") & length(data1) == length(geom.step.dir)) | (all(mode(geom.step.dir) == "character") & length(geom.step.dir)== 1L))){ # list of same length as data1 or single value -tempo.cat <- paste0("ERROR IN ", function.name, ": geom.step.dir ARGUMENT MUST BE A LIST OF SAME LENGTH AS data1 IF data1 IS A LIST, OR A SINGLE CHARACTER VALUE") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -}else if(all(mode(geom.step.dir) == "character") & length(geom.step.dir)== 1L){ # convert the single value into a list of single value -list.geom.step.dir <- vector(mode = "list", length = length(data1)) -list.geom.step.dir[] <- geom.step.dir -} -if( ! is.null(geom.stick.base)){ -if( ! ((all(class(geom.stick.base) == "list") & length(data1) == length(geom.stick.base)) | (all(mode(geom.stick.base) == "numeric") & length(geom.stick.base)== 1L))){ # list of same length as data1 or single value -tempo.cat <- paste0("ERROR IN ", function.name, ": geom.stick.base ARGUMENT MUST BE A LIST OF SAME LENGTH AS data1 IF data1 IS A LIST, OR A SINGLE NUMERIC VALUE") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -}else if(all(mode(geom.stick.base) == "numeric") & length(geom.stick.base)== 1L){ # convert the single value into a list of single value -list.geom.stick.base <- vector(mode = "list", length = length(data1)) -list.geom.stick.base[] <- geom.stick.base -} -} -if( ! ((all(class(alpha) == "list") & length(data1) == length(alpha)) | (all(mode(alpha) == "numeric") & length(alpha)== 1L))){ # list of same length as data1 or single value -tempo.cat <- paste0("ERROR IN ", function.name, ": alpha ARGUMENT MUST BE A LIST OF SAME LENGTH AS data1 IF data1 IS A LIST, OR A SINGLE NUMERIC VALUE") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -}else if(all(mode(alpha) == "numeric") & length(alpha)== 1L){ # convert the single value into a list of single value -list.alpha <- vector(mode = "list", length = length(data1)) -list.alpha[] <- alpha -} -if( ! ((all(class(dot.size) == "list") & length(data1) == length(dot.size)) | (all(mode(dot.size) == "numeric") & length(dot.size)== 1L))){ # list of same length as data1 or single value -tempo.cat <- paste0("ERROR IN ", function.name, ": dot.size ARGUMENT MUST BE A LIST OF SAME LENGTH AS data1 IF data1 IS A LIST, OR A SINGLE NUMERIC VALUE") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -}else if(all(mode(dot.size) == "numeric") & length(dot.size)== 1L){ # convert the single value into a list of single value -list.dot.size <- vector(mode = "list", length = length(data1)) -list.dot.size[] <- dot.size -} -if( ! ((all(class(dot.shape) == "list") & length(data1) == length(dot.shape)) | (all(mode(dot.shape) != "list") & length(dot.shape)== 1L))){ # list of same length as data1 or single value -tempo.cat <- paste0("ERROR IN ", function.name, ": dot.shape ARGUMENT MUST BE A LIST OF SAME LENGTH AS data1 IF data1 IS A LIST, OR A SINGLE SHAPE VALUE") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -}else if(all(mode(dot.shape) != "list") & length(dot.shape)== 1L){ # convert the single value into a list of single value -list.dot.shape <- vector(mode = "list", length = length(data1)) -list.dot.shape[] <- dot.shape -} -if( ! ((all(class(dot.border.size) == "list") & length(data1) == length(dot.border.size)) | (all(mode(dot.border.size) == "numeric") & length(dot.border.size)== 1L))){ # list of same length as data1 or single value -tempo.cat <- paste0("ERROR IN ", function.name, ": dot.border.size ARGUMENT MUST BE A LIST OF SAME LENGTH AS data1 IF data1 IS A LIST, OR A SINGLE NUMERIC VALUE") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -}else if(all(mode(dot.border.size) == "numeric") & length(dot.border.size)== 1L){ # convert the single value into a list of single value -list.dot.border.size <- vector(mode = "list", length = length(data1)) -list.dot.border.size[] <- dot.border.size -} -if( ! is.null(dot.border.color)){ -if( ! ((all(class(dot.border.color) == "list") & length(data1) == length(dot.border.color)) | ((all(mode(dot.border.color) == "character") | all(mode(dot.border.color) == "numeric")) & length(dot.border.color)== 1L))){ # list of same length as data1 or single value -tempo.cat <- paste0("ERROR IN ", function.name, ": dot.border.color ARGUMENT MUST BE A LIST OF SAME LENGTH AS data1 IF data1 IS A LIST, OR A SINGLE CHARACTER STRING OR INTEGER") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -}else if((all(mode(dot.border.color) == "character") | all(mode(dot.border.color) == "numeric")) & length(dot.border.color)== 1L){ # convert the single value into a list of single value -list.dot.border.color <- vector(mode = "list", length = length(data1)) -list.dot.border.color[] <- dot.border.color -} -} -if( ! ((all(class(line.size) == "list") & length(data1) == length(line.size)) | (all(mode(line.size) == "numeric") & length(line.size)== 1L))){ # list of same length as data1 or single value -tempo.cat <- paste0("ERROR IN ", function.name, ": line.size ARGUMENT MUST BE A LIST OF SAME LENGTH AS data1 IF data1 IS A LIST, OR A SINGLE NUMERIC VALUE") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -}else if(all(mode(line.size) == "numeric") & length(line.size)== 1L){ # convert the single value into a list of single value -list.line.size <- vector(mode = "list", length = length(data1)) -list.line.size[] <- line.size -} -if( ! ((all(class(line.type) == "list") & length(data1) == length(line.type)) | (all(mode(line.type) != "list") & length(line.type)== 1L))){ # list of same length as data1 or single value -tempo.cat <- paste0("ERROR IN ", function.name, ": line.type ARGUMENT MUST BE A LIST OF SAME LENGTH AS data1 IF data1 IS A LIST, OR A SINGLE LINE KIND VALUE") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -}else if(all(mode(line.type) != "list") & length(line.type)== 1L){ # convert the single value into a list of single value -list.line.type <- vector(mode = "list", length = length(data1)) -list.line.type[] <- line.type -} -if( ! is.null(legend.name)){ -if( ! (all(class(legend.name) == "list") & length(data1) == length(legend.name))){ -tempo.cat <- paste0("ERROR IN ", function.name, ": legend.name ARGUMENT MUST BE A LIST OF SAME LENGTH AS data1 IF data1 IS A LIST") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -} -} -} -# end check list lengths (and names of data1 compartments if present) -# conversion into lists -if(all(is.data.frame(data1))){ -data1 <- list(L1 = data1) -if(all(class(x) == "list")){ -tempo.cat <- paste0("ERROR IN ", function.name, ": x ARGUMENT CANNOT BE A LIST IF data1 IS A DATA FRAME") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -}else{ -x <- list(L1 = x) -} -if(all(class(y) == "list")){ -tempo.cat <- paste0("ERROR IN ", function.name, ": y ARGUMENT CANNOT BE A LIST IF data1 IS A DATA FRAME") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -}else{ -y <- list(L1 = y) -} -if( ! is.null(categ)){ -if(all(class(categ) == "list")){ -tempo.cat <- paste0("ERROR IN ", function.name, ": categ ARGUMENT CANNOT BE A LIST IF data1 IS A DATA FRAME") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -}else{ -categ <- list(L1 = categ) -} -} -if( ! is.null(categ.class.order)){ -if(all(class(categ.class.order) == "list")){ -tempo.cat <- paste0("ERROR IN ", function.name, ": categ.class.order ARGUMENT CANNOT BE A LIST IF data1 IS A DATA FRAME") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -}else{ -categ.class.order <- list(L1 = categ.class.order) -} -} -if( ! is.null(color)){ -if(all(class(color) == "list")){ -tempo.cat <- paste0("ERROR IN ", function.name, ": color ARGUMENT CANNOT BE A LIST IF data1 IS A DATA FRAME") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -}else{ -color <- list(L1 = color) -} -} -if(all(class(geom) == "list")){ -tempo.cat <- paste0("ERROR IN ", function.name, ": geom ARGUMENT CANNOT BE A LIST IF data1 IS A DATA FRAME") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -}else{ -geom <- list(L1 = geom) -} -if(all(class(geom.step.dir) == "list")){ -tempo.cat <- paste0("ERROR IN ", function.name, ": geom.step.dir ARGUMENT CANNOT BE A LIST IF data1 IS A DATA FRAME") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -}else{ -geom.step.dir <- list(L1 = geom.step.dir) -} -if( ! is.null(geom.stick.base)){ -if(all(class(geom.stick.base) == "list")){ -tempo.cat <- paste0("ERROR IN ", function.name, ": geom.stick.base ARGUMENT CANNOT BE A LIST IF data1 IS A DATA FRAME") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -}else{ -geom.stick.base <- list(L1 = geom.stick.base) -} -} -if(all(class(alpha) == "list")){ -tempo.cat <- paste0("ERROR IN ", function.name, ": alpha ARGUMENT CANNOT BE A LIST IF data1 IS A DATA FRAME") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -}else{ -alpha <- list(L1 = alpha) -} -if(all(class(dot.size) == "list")){ -tempo.cat <- paste0("ERROR IN ", function.name, ": dot.size ARGUMENT CANNOT BE A LIST IF data1 IS A DATA FRAME") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -}else{ -dot.size <- list(L1 = dot.size) -} -if(all(class(dot.shape) == "list")){ -tempo.cat <- paste0("ERROR IN ", function.name, ": dot.shape ARGUMENT CANNOT BE A LIST IF data1 IS A DATA FRAME") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -}else{ -dot.shape <- list(L1 = dot.shape) -} -if(all(class(dot.border.size) == "list")){ -tempo.cat <- paste0("ERROR IN ", function.name, ": dot.border.size ARGUMENT CANNOT BE A LIST IF data1 IS A DATA FRAME") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -}else{ -dot.border.size <- list(L1 = dot.border.size) -} -if( ! is.null(dot.border.color)){ -if(all(class(dot.border.color) == "list")){ -tempo.cat <- paste0("ERROR IN ", function.name, ": dot.border.color ARGUMENT CANNOT BE A LIST IF data1 IS A DATA FRAME") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -}else{ -dot.border.color <- list(L1 = dot.border.color) -} -} -if(all(class(line.size) == "list")){ -tempo.cat <- paste0("ERROR IN ", function.name, ": line.size ARGUMENT CANNOT BE A LIST IF data1 IS A DATA FRAME") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -}else{ -line.size <- list(L1 = line.size) -} -if(all(class(line.type) == "list")){ -tempo.cat <- paste0("ERROR IN ", function.name, ": line.type ARGUMENT CANNOT BE A LIST IF data1 IS A DATA FRAME") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -}else{ -line.type <- list(L1 = line.type) -} -if( ! is.null(legend.name)){ -if(all(class(legend.name) == "list")){ -tempo.cat <- paste0("ERROR IN ", function.name, ": legend.name ARGUMENT CANNOT BE A LIST IF data1 IS A DATA FRAME") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -}else{ -legend.name <- list(L1 = legend.name) -} -} -}else if( ! all(sapply(data1, FUN = "class") == "data.frame")){ # if not a data frame, data1 can only be a list, as tested above -tempo.cat <- paste0("ERROR IN ", function.name, ": data1 ARGUMENT MUST BE A DATA FRAME OR A LIST OF DATA FRAMES") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -} -# single value converted into list now reattributed to the argument name -if( ! is.null(color)){ -if( ! is.null(list.color)){ -color <- list.color -} -} -if( ! is.null(list.geom)){ -geom <- list.geom -} -if( ! is.null(list.geom.step.dir)){ -geom.step.dir <- list.geom.step.dir -} -if( ! is.null(geom.stick.base)){ -if( ! is.null(list.geom.stick.base)){ -geom.stick.base <- list.geom.stick.base -} -} -if( ! is.null(list.alpha)){ -alpha <- list.alpha -} -if( ! is.null(list.dot.size)){ -dot.size <- list.dot.size -} -if( ! is.null(list.dot.shape)){ -dot.shape <- list.dot.shape -} -if( ! is.null(list.dot.border.size)){ -dot.border.size <- list.dot.border.size -} -if( ! is.null(dot.border.color)){ -if( ! is.null(list.dot.border.color)){ -dot.border.color <- list.dot.border.color -} -} -if( ! is.null(list.line.size)){ -line.size <- list.line.size -} -if( ! is.null(list.line.type)){ -line.type <- list.line.type -} -# end single value converted into list now reattributed to the argument name -# data, x, y, geom, alpha, dot.size, shape, dot.border.size, line.size, line.type, legend.name are list now -# if non-null, categ, categ.class.order, legend.name, color, dot.border.color are list now -# end conversion into lists -# verif of add -if( ! is.null(add)){ -if( ! grepl(pattern = "^\\s*\\+", add)){ # check that the add string start by + -tempo.cat <- paste0("ERROR IN ", function.name, ": add ARGUMENT MUST START WITH \"+\": ", paste(unique(add), collapse = " ")) -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) - -}else if( ! grepl(pattern = "(ggplot2|lemon)\\s*::", add)){ # -tempo.cat <- paste0("ERROR IN ", function.name, ": FOR EASIER FUNCTION DETECTION, add ARGUMENT MUST CONTAIN \"ggplot2::\" OR \"lemon::\" IN FRONT OF EACH GGPLOT2 FUNCTION: ", paste(unique(add), collapse = " ")) -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -}else if( ! grepl(pattern = ")\\s*$", add)){ # check that the add string finished by ) -tempo.cat <- paste0("ERROR IN ", function.name, ": add ARGUMENT MUST FINISH BY \")\": ", paste(unique(add), collapse = " ")) -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -} -} -# end verif of add -# management of add containing facet -facet.categ <- NULL -if( ! is.null(add)){ -facet.check <- TRUE -tempo <- unlist(strsplit(x = add, split = "\\s*\\+\\s*(ggplot2|lemon)\\s*::\\s*")) # -tempo <- sub(x = tempo, pattern = "^facet_wrap", replacement = "ggplot2::facet_wrap") -tempo <- sub(x = tempo, pattern = "^facet_grid", replacement = "ggplot2::facet_grid") -tempo <- sub(x = tempo, pattern = "^facet_rep", replacement = "lemon::facet_rep") -if(length(data1) > 1 & (any(grepl(x = tempo, pattern = "ggplot2::facet_wrap|lemon::facet_rep_wrap")) | grepl(x = add, pattern = "ggplot2::facet_grid|lemon::facet_rep_grid"))){ -tempo.cat <- paste0("ERROR IN ", function.name, "\nfacet PANELS CANNOT BE USED IF MORE THAN ONE DATA FRAME IN THE data1 ARGUMENT\nPLEASE REWRITE THE add STRING AND RERUN") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -}else{ -if(any(grepl(x = tempo, pattern = "ggplot2::facet_wrap|lemon::facet_rep_wrap"))){ -tempo1 <- suppressWarnings(eval(parse(text = tempo[grepl(x = tempo, pattern = "ggplot2::facet_wrap|lemon::facet_rep_wrap")]))) -facet.categ <- list(names(tempo1$params$facets)) # list of length 1 -tempo.text <- "facet_wrap OR facet_rep_wrap" -facet.check <- FALSE -}else if(grepl(x = add, pattern = "ggplot2::facet_grid|lemon::facet_rep_grid")){ -tempo1 <- suppressWarnings(eval(parse(text = tempo[grepl(x = tempo, pattern = "ggplot2::facet_grid|lemon::facet_rep_grid")]))) -facet.categ <- list(c(names(tempo1$params$rows), names(tempo1$params$cols))) # list of length 1 -tempo.text <- "facet_grid OR facet_rep_grid" -facet.check <- FALSE -} -if(facet.check == FALSE & ! all(facet.categ %in% names(data1[[1]]))){ # WARNING: all(facet.categ %in% names(data1)) is TRUE when facet.categ is NULL -tempo.cat <- paste0("ERROR IN ", function.name, "\nDETECTION OF \"", tempo.text, "\" STRING IN THE add ARGUMENT BUT PROBLEM OF VARIABLE DETECTION (COLUMN NAMES OF data1)\nTHE DETECTED VARIABLES ARE:\n", paste(facet.categ, collapse = " "), "\nTHE data1 COLUMN NAMES ARE:\n", paste(names(data1[[1]]), collapse = " "), "\nPLEASE REWRITE THE add STRING AND RERUN") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -} -} -} -# if facet.categ is not NULL, it is a list of length 1 now -# end management of add containing facet -# legend name filling -if(is.null(legend.name) & ! is.null(categ)){ -legend.name <- categ -}else if(is.null(legend.name) & is.null(categ)){ -legend.name <- vector("list", length(data1)) # null list -} -# legend.name not NULL anymore (list) -# end legend name filling -# ini categ for legend display -fin.lg.disp <- vector("list", 6) # will be used at the end to display or not legends -fin.lg.disp[] <- FALSE -legend.disp <- vector("list", length(data1)) -if(is.null(categ) | legend.show == FALSE){ -legend.disp[] <- FALSE -}else{ -for(i2 in 1:length(data1)){ -if(is.null(categ[[i2]])){ -legend.disp[[i2]] <- FALSE -}else{ -legend.disp[[i2]] <- TRUE -} -} -} -# end ini categ for legend display -# integer colors into gg_palette -tempo.check.color <- NULL -for(i1 in 1:length(data1)){ -if(any(is.na(color[[i1]]))){ -tempo.cat <- paste0("ERROR IN ", function.name, ": ", ifelse(length(color)== 1L, "color", paste0("ELEMENT NUMBER ", i1, " OF color ARGUMENT")), ": color ARGUMENT CANNOT CONTAIN NA") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -} -tempo.check.color <- c(tempo.check.color, fun_check(data = color[[i1]], data.name = ifelse(length(color)== 1L, "color", paste0("ELEMENT NUMBER ", i1, " OF color ARGUMENT")), class = "integer", double.as.integer.allowed = TRUE, na.contain = TRUE, fun.name = function.name)$problem) -} -tempo.check.color <- ! tempo.check.color # invert TRUE and FALSE because if integer, then problem = FALSE -if(any(tempo.check.color == TRUE)){ # convert integers into colors -tempo.integer <- unlist(color[tempo.check.color]) -tempo.color <- fun_gg_palette(max(tempo.integer, na.rm = TRUE)) -for(i1 in 1:length(data1)){ -if(tempo.check.color[i1] == TRUE){ -color[[i1]] <-tempo.color[color[[i1]]] -} -} -} -# end integer colors into gg_palette -# loop (checking inside list compartment) -compart.null.color <- 0 # will be used to attribute a color when color is non-null but a compartment of color is NULL -data1.ini <- data1 # to report NA removal -removed.row.nb <- vector("list", length = length(data1)) # to report NA removal. Contains NULL -removed.rows <- vector("list", length = length(data1)) # to report NA removal. Contains NULL -for(i1 in 1:length(data1)){ -tempo <- fun_check(data = data1[[i1]], data.name = ifelse(length(data1)== 1L, "data1 ARGUMENT", paste0("DATA FRAME NUMBER ", i1, " OF data1 ARGUMENT")), class = "data.frame", na.contain = TRUE, fun.name = function.name) -if(tempo$problem == TRUE){ -stop(paste0("\n\n================\n\n", tempo$text, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -} -# reserved word checking -if(any(names(data1[[i1]]) %in% reserved.words)){ # I do not use fun_name_change() because cannot control y before creating "fake_y". But ok because reserved are not that common -tempo.cat <- paste0("ERROR IN ", function.name, ": COLUMN NAMES OF ", ifelse(length(data1)== 1L, "data1 ARGUMENT", paste0("DATA FRAME NUMBER ", i1, " OF data1 ARGUMENT")), " ARGUMENT CANNOT BE ONE OF THESE WORDS\n", paste(reserved.words, collapse = " "), "\nTHESE ARE RESERVED FOR THE ", function.name, " FUNCTION") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -} -if( ! (is.null(add))){ -if(any(sapply(X = reserved.words, FUN = grepl, x = add))){ -tempo.cat <- paste0("ERROR IN ", function.name, "\nDETECTION OF COLUMN NAMES OF data1 IN THE add ARGUMENT STRING, THAT CORRESPOND TO RESERVED STRINGS FOR ", function.name, "\nFOLLOWING COLUMN NAMES HAVE TO BE CHANGED:\n", paste(arg.names[sapply(X = reserved.words, FUN = grepl, x = add)], collapse = "\n"), "\nFOR INFORMATION, THE RESERVED WORDS ARE:\n", paste(reserved.words, collapse = "\n")) -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -}else if(any(sapply(X = arg.names, FUN = grepl, x = add))){ -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") NAMES OF ", function.name, " ARGUMENTS DETECTED IN THE add STRING:\n", paste(arg.names[sapply(X = arg.names, FUN = grepl, x = add)], collapse = "\n"), "\nRISK OF WRONG OBJECT USAGE INSIDE ", function.name) -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -} -} -# end reserved word checking -# check of geom now because required for y argument -tempo <- fun_check(data = geom[[i1]], data.name = ifelse(length(geom)== 1L, "geom", paste0("geom NUMBER ", i1)), options = c("geom_point", "geom_line", "geom_path", "geom_step", "geom_hline", "geom_vline", "geom_stick"), length = 1, fun.name = function.name) -if(tempo$problem == TRUE){ -stop(paste0("\n\n================\n\n", tempo$text, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -} -if(geom[[i1]] == "geom_step" & is.null(geom.step.dir[[i1]])){ -tempo.cat <- paste0("ERROR IN ", function.name, ": ", ifelse(length(geom.step.dir)== 1L, "geom.step.dir", paste0("ELEMENT ", i1, " OF geom.step.dir ARGUMENT")), ": geom.step.dir ARGUMENT CANNOT BE NULL IF ", ifelse(length(geom)== 1L, "geom", paste0("ELEMENT ", i1, " OF geom")), " ARGUMENT IS \"geom_step\"\nHERE geom.step.dir ARGUMENT IS: ", paste(geom.step.dir[[i1]], collapse = " ")) -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -}else if(geom[[i1]] == "geom_step" & ! is.null(geom.step.dir[[i1]])){ -tempo <- fun_check(data = geom.step.dir[[i1]], data.name = ifelse(length(geom.step.dir)== 1L, "geom.step.dir", paste0("geom.step.dir NUMBER ", i1)), options = c("vh", "hv", "mid"), length = 1, fun.name = function.name) -if(tempo$problem == TRUE){ -stop(paste0("\n\n================\n\n", tempo$text, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -} -} -if( ! (is.null(geom.stick.base))){ -if(geom[[i1]] == "geom_stick" & ! is.null(geom.stick.base[[i1]])){ -tempo <- fun_check(data = geom.stick.base[[i1]], data.name = ifelse(length(geom.stick.base)== 1L, "geom.stick.base", paste0("geom.stick.base NUMBER ", i1)), mode = "numeric", length = 1, na.contain = FALSE, fun.name = function.name) -if(tempo$problem == TRUE){ -stop(paste0("\n\n================\n\n", tempo$text, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -} -} -} -# end check of geom now because required for y argument -if(is.null(x[[i1]])){ -if(all(geom[[i1]] != "geom_hline")){ -tempo.cat <- paste0("ERROR IN ", function.name, ": ", ifelse(length(x)== 1L, "x", paste0("ELEMENT ", i1, " OF x ARGUMENT")), " IN ", ifelse(length(data1)== 1L, "data1 ARGUMENT", paste0("DATA FRAME NUMBER ", i1, " OF data1 ARGUMENT")), ": x ARGUMENT CANNOT BE NULL EXCEPT IF ", ifelse(length(geom)== 1L, "x", paste0("geom NUMBER ", i1)), " ARGUMENT IS \"geom_hline\"\nHERE geom ARGUMENT IS: ", paste(geom[[i1]], collapse = " ")) -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -}else{ -x[[i1]] <- "fake_x" -data1[[i1]] <- cbind(data1[[i1]], fake_x = NA, stringsAsFactors = TRUE) -data1[[i1]][, "fake_x"] <- as.numeric(data1[[i1]][, "fake_x"]) -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") NULL ", ifelse(length(x)== 1L, "x", paste0("ELEMENT ", i1, " OF x")), " ARGUMENT ASSOCIATED TO ", ifelse(length(geom)== 1L, "geom", paste0("geom NUMBER ", i1)), " ARGUMENT ", geom[[i1]], " -> FAKE COLUMN ADDED TO DATA FRAME ", ifelse(length(data1)== 1L, "data1 ARGUMENT", paste0("DATA FRAME NUMBER ", i1, " OF data1 ARGUMENT")), ", NAMED \"fake_x\" FOR FINAL DRAWING") -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -} -}else{ -if(all(geom[[i1]] == "geom_hline")){ -tempo.cat <- paste0("ERROR IN ", function.name, ": ", ifelse(length(x)== 1L, "x", paste0("ELEMENT ", i1, " OF x ARGUMENT")), " IN ", ifelse(length(data1)== 1L, "data1 ARGUMENT", paste0("DATA FRAME NUMBER ", i1, " OF data1 ARGUMENT")), ": x ARGUMENT MUST BE NULL IF ", ifelse(length(geom)== 1L, "geom", paste0("geom NUMBER ", i1)), " ARGUMENT IS \"geom_hline\"") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -} -tempo <- fun_check(data = x[[i1]], data.name = ifelse(length(x)== 1L, "x", paste0("ELEMENT ", i1, " OF x ARGUMENT")), class = "vector", mode = "character", length = 1, fun.name = function.name) -if(tempo$problem == TRUE){ -stop(paste0("\n\n================\n\n", tempo$text, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -} -} -if(is.null(y[[i1]])){ -if(all(geom[[i1]] != "geom_vline")){ -tempo.cat <- paste0("ERROR IN ", function.name, ": ", ifelse(length(y)== 1L, "y", paste0("ELEMENT ", i1, " OF y ARGUMENT")), " IN ", ifelse(length(data1)== 1L, "data1 ARGUMENT", paste0("DATA FRAME NUMBER ", i1, " OF data1 ARGUMENT")), ": y ARGUMENT CANNOT BE NULL EXCEPT IF ", ifelse(length(geom)== 1L, "y", paste0("geom NUMBER ", i1)), " ARGUMENT IS \"geom_vline\"\nHERE geom ARGUMENT IS: ", paste(geom[[i1]], collapse = " ")) -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -}else{ -y[[i1]] <- "fake_y" -data1[[i1]] <- cbind(data1[[i1]], fake_y = NA, stringsAsFactors = TRUE) -data1[[i1]][, "fake_y"] <- as.numeric(data1[[i1]][, "fake_y"]) -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") NULL ", ifelse(length(y)== 1L, "y", paste0("ELEMENT ", i1, " OF y")), " ARGUMENT ASSOCIATED TO ", ifelse(length(geom)== 1L, "geom", paste0("geom NUMBER ", i1)), " ARGUMENT ", geom[[i1]], " -> FAKE COLUMN ADDED TO DATA FRAME ", ifelse(length(data1)== 1L, "data1 ARGUMENT", paste0("DATA FRAME NUMBER ", i1, " OF data1 ARGUMENT")), ", NAMED \"fake_y\" FOR FINAL DRAWING") -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -} -}else{ -if(all(geom[[i1]] == "geom_vline")){ -tempo.cat <- paste0("ERROR IN ", function.name, ": ", ifelse(length(y)== 1L, "y", paste0("ELEMENT ", i1, " OF y ARGUMENT")), " IN ", ifelse(length(data1)== 1L, "data1 ARGUMENT", paste0("DATA FRAME NUMBER ", i1, " OF data1 ARGUMENT")), ": y ARGUMENT MUST BE NULL IF ", ifelse(length(geom)== 1L, "geom", paste0("geom NUMBER ", i1)), " ARGUMENT IS \"geom_vline\"") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -} -tempo <- fun_check(data = y[[i1]], data.name = ifelse(length(y)== 1L, "y", paste0("ELEMENT ", i1, " OF y ARGUMENT")), class = "vector", mode = "character", length = 1, fun.name = function.name) -if(tempo$problem == TRUE){ -stop(paste0("\n\n================\n\n", tempo$text, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -} -} -# x[[i1]] and y[[i1]] not NULL anymore -if( ! (x[[i1]] %in% names(data1[[i1]]))){ -tempo.cat <- paste0("ERROR IN ", function.name, ": ", ifelse(length(x)== 1L, "x", paste0("ELEMENT ", i1, " OF x")), " ARGUMENT MUST BE A COLUMN NAME OF ", ifelse(length(data1)== 1L, "data1 ARGUMENT", paste0("DATA FRAME NUMBER ", i1, " OF data1 ARGUMENT\nHERE IT IS: ", paste(x[[i1]], collapse = " ")))) -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -} -if( ! (y[[i1]] %in% names(data1[[i1]]))){ -tempo.cat <- paste0("ERROR IN ", function.name, ": ", ifelse(length(y)== 1L, "y", paste0("ELEMENT ", i1, " OF y")), " ARGUMENT MUST BE A COLUMN NAME OF ", ifelse(length(data1)== 1L, "data1 ARGUMENT", paste0("DATA FRAME NUMBER ", i1, " OF data1 ARGUMENT\nHERE IT IS: ", paste(y[[i1]], collapse = " ")))) -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -} -tempo <- fun_check(data = data1[[i1]][, x[[i1]]], data.name = ifelse(length(x)== 1L, "x ARGUMENT (AS COLUMN NAME OF data1 DATA FRAME)", paste0("ELEMENT ", i1, " OF x ARGUMENT", " (AS COLUMN NAME OF data1 DATA FRAME NUMBER ", i1, ")")), class = "vector", mode = "numeric", na.contain = TRUE, fun.name = function.name) -if(tempo$problem == TRUE){ -stop(paste0("\n\n================\n\n", tempo$text, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -} -tempo <- fun_check(data = data1[[i1]][, y[[i1]]], data.name = ifelse(length(y)== 1L, "y ARGUMENT (AS COLUMN NAME OF data1 DATA FRAME)", paste0("ELEMENT ", i1, " OF y ARGUMENT", " (AS COLUMN NAME OF data1 DATA FRAME NUMBER ", i1, ")")), class = "vector", mode = "numeric", na.contain = TRUE, fun.name = function.name) -if(tempo$problem == TRUE){ -stop(paste0("\n\n================\n\n", tempo$text, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -} -if(x[[i1]] == "fake_x" & y[[i1]] == "fake_y"){ # because the code cannot accept to be both "fake_x" and "fake_y" at the same time -tempo.cat <- paste0("ERROR IN ", function.name, ": CODE INCONSISTENCY 2\nTHE CODE CANNOT ACCEPT x AND y TO BE \"fake_x\" AND \"fake_y\" IN THE SAME DATA FRAME ", i1, " ") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -} - -if(( ! is.null(categ)) & ( ! is.null(categ[[i1]]))){ # is.null(categ[[i1]]) works even if categ is NULL # is.null(categ[[i1]]) works even if categ is NULL # if categ[[i1]] = NULL, fake_categ will be created later on -tempo <- fun_check(data = categ[[i1]], data.name = ifelse(length(categ)== 1L, "categ", paste0("ELEMENT ", i1, " OF categ ARGUMENT")),, class = "vector", mode = "character", length = 1, fun.name = function.name) -if(tempo$problem == TRUE){ -stop(paste0("\n\n================\n\n", tempo$text, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -} -if( ! (categ[[i1]] %in% names(data1[[i1]]))){ -tempo.cat <- paste0("ERROR IN ", function.name, ": ", ifelse(length(categ)== 1L, "categ", paste0("ELEMENT ", i1, " OF categ")), " ARGUMENT MUST BE A COLUMN NAME OF ", ifelse(length(data1)== 1L, "data1 ARGUMENT", paste0("DATA FRAME NUMBER ", i1, " OF data1 ARGUMENT\nHERE IT IS: ", paste(categ[[i1]], collapse = " ")))) -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -} -tempo1 <- fun_check(data = data1[[i1]][, categ[[i1]]], data.name = ifelse(length(categ)== 1L, "categ OF data1 ARGUMENT", paste0("ELEMENT ", i1, " OF categ ARGUMENT IN DATA FRAME NUMBER ", i1, " OF data1 ARGUMENT")), class = "vector", mode = "character", na.contain = TRUE, fun.name = function.name) -tempo2 <- fun_check(data = data1[[i1]][, categ[[i1]]], data.name = ifelse(length(categ)== 1L, "categ OF data1 ARGUMENT", paste0("ELEMENT ", i1, " OF categ ARGUMENT IN DATA FRAME NUMBER ", i1, " OF data1 ARGUMENT")), class = "factor", na.contain = TRUE, fun.name = function.name) -if(tempo1$problem == TRUE & tempo2$problem == TRUE){ -tempo.cat <- paste0("ERROR IN ", function.name, ": ", ifelse(length(categ)== 1L, "categ OF data1 ARGUMENT", paste0("ELEMENT ", i1, " OF categ ARGUMENT IN DATA FRAME NUMBER ", i1, " OF data1 ARGUMENT")), " MUST BE A FACTOR OR CHARACTER VECTOR") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -}else if(tempo1$problem == FALSE){ -data1[[i1]][, categ[[i1]]] <- factor(data1[[i1]][, categ[[i1]]]) # if already a factor, change nothing, if characters, levels according to alphabetical order -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") IN ", ifelse(length(categ)== 1L, "categ", paste0("ELEMENT ", i1, " OF categ ARGUMENT")), " IN ", ifelse(length(data1)== 1L, "data1 ARGUMENT", paste0("DATA FRAME NUMBER ", i1, " OF data1 ARGUMENT")), ", THE CHARACTER COLUMN HAS BEEN CONVERTED TO FACTOR") -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) - -} -if(geom[[i1]] == "geom_vline" | geom[[i1]] == "geom_hline"){ -if(length(unique(data1[[i1]][, categ[[i1]]])) != nrow(data1[[i1]])){ -tempo.cat <- paste0("ERROR IN ", function.name, ": ", ifelse(length(geom)== 1L, "geom OF data1 ARGUMENT", paste0("geom NUMBER ", i1, " OF DATA FRAME NUMBER ", i1, " OF data1 ARGUMENT")), " ARGUMENT IS ", geom[[i1]], ", MEANING THAT ", ifelse(length(categ)== 1L, "categ OF data1 ARGUMENT", paste0("ELEMENT ", i1, " OF categ ARGUMENT IN DATA FRAME NUMBER ", i1, " OF data1 ARGUMENT")), " MUST HAVE A DIFFERENT CLASS PER LINE OF data1 (ONE x VALUE PER CLASS)") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -} -} -}else if(( ! is.null(categ)) & is.null(categ[[i1]])){ # is.null(categ[[i1]]) works even if categ is NULL # if categ[[i1]] = NULL, fake_categ will be created. WARNING: is.null(categ[[i1]]) means no legend display (see above), because categ has not been precised. This also means a single color for data1[[i1]] -if(length(color[[i1]]) > 1){ # 0 means is.null(color[[i1]]) or is.null(color) and 1 is ok -> single color for data1[[i1]] -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") NULL ", ifelse(length(categ)== 1L, "categ", paste0("ELEMENT ", i1, " OF categ")), " ARGUMENT BUT CORRESPONDING COLORS IN ", ifelse(length(color)== 1L, "color", paste0("ELEMENT NUMBER ", i1, " OF color ARGUMENT")), " HAS LENGTH OVER 1\n", paste(color[[i1]], collapse = " "), "\nWHICH IS NOT COMPATIBLE WITH NULL CATEG -> COLOR RESET TO A SINGLE COLOR") -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -color[i1] <- list(NULL) # will provide a single color below # Warning color[[i1]] <- NULL removes the compartment -} -categ[[i1]] <- "fake_categ" -data1[[i1]] <- cbind(data1[[i1]], fake_categ = "", stringsAsFactors = TRUE) -# inactivated because give a different color to different "Line_" categ while a single color for all the data1[[i1]] required. Thus, put back after the color management -# if(geom[[i1]] == "geom_hline" | geom[[i1]] == "geom_vline"){ -# data1[[i1]][, "fake_categ"] <- paste0("Line_", 1:nrow(data1[[i1]])) -# }else{ -data1[[i1]][, "fake_categ"] <- data1[[i1]][, "fake_categ"] # as.numeric("") create a vector of NA but class numeric -# } -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") NULL ", ifelse(length(categ)== 1L, "categ", paste0("ELEMENT ", i1, " OF categ")), " ARGUMENT -> FOR DATA FRAME ", ifelse(length(data1)== 1L, "data1 ARGUMENT:", paste0("NUMBER ", i1, " OF data1 ARGUMENT:")), "\n- FAKE \"fake_categ\" COLUMN ADDED FILLED WITH \"\"(OR WITH \"Line_...\" FOR LINES)\n- SINGLE COLOR USED FOR PLOTTING\n- NO LEGEND DISPLAYED") -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -} -# OK: if categ is not NULL, all the non-null categ columns of data1 are factors from here - -# management of log scale and Inf removal -if(x[[i1]] != "fake_x"){ -if(any(( ! is.finite(data1[[i1]][, x[[i1]]])) & ( ! is.na(data1[[i1]][, x[[i1]]])))){ # is.finite also detects NA: ( ! is.finite(data1[, y])) & ( ! is.na(data1[, y])) detects only Inf -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") PRESENCE OF -Inf OR Inf VALUES IN ", ifelse(length(categ)== 1L, "x", paste0("ELEMENT ", i1, " OF x ARGUMENT")), " IN ", ifelse(length(data1)== 1L, "data1 ARGUMENT", paste0("DATA FRAME NUMBER ", i1, " OF data1 ARGUMENT")), " AND CORRESPONDING ROWS REMOVED (SEE $removed.row.nb AND $removed.rows)") -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -} -} -if(y[[i1]] != "fake_y"){ -if(any(( ! is.finite(data1[[i1]][, y[[i1]]])) & ( ! is.na(data1[[i1]][, y[[i1]]])))){ # is.finite also detects NA: ( ! is.finite(data1[, y])) & ( ! is.na(data1[, y])) detects only Inf -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") PRESENCE OF -Inf OR Inf VALUES IN ", ifelse(length(categ)== 1L, "y", paste0("ELEMENT ", i1, " OF y ARGUMENT")), " IN ", ifelse(length(data1)== 1L, "data1 ARGUMENT", paste0("DATA FRAME NUMBER ", i1, " OF data1 ARGUMENT")), " AND CORRESPONDING ROWS REMOVED (SEE $removed.row.nb AND $removed.rows)") -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -} -} -# log conversion -if(x.log != "no"){ -tempo1 <- ! is.finite(data1[[i1]][, x[[i1]]]) # where are initial NA and Inf -data1[[i1]][, x[[i1]]] <- suppressWarnings(get(x.log)(data1[[i1]][, x[[i1]]]))# no env = sys.nframe(), inherit = FALSE in get() because look for function in the classical scope -if(any( ! (tempo1 | is.finite(data1[[i1]][, x[[i1]]])))){ -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") LOG CONVERSION INTRODUCED -Inf OR Inf OR NaN VALUES IN ", ifelse(length(categ)== 1L, "x", paste0("ELEMENT ", i1, " OF x ARGUMENT")), " IN ", ifelse(length(data1)== 1L, "data1 ARGUMENT", paste0("DATA FRAME NUMBER ", i1, " OF data1 ARGUMENT")), " AND CORRESPONDING ROWS REMOVED (SEE $removed.row.nb AND $removed.rows)") -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -} -} -if(y.log != "no"){ -tempo1 <- ! is.finite(data1[[i1]][, y[[i1]]]) # where are initial NA and Inf -data1[[i1]][, y[[i1]]] <- suppressWarnings(get(y.log)(data1[[i1]][, y[[i1]]]))# no env = sys.nframe(), inherit = FALSE in get() because look for function in the classical scope -if(any( ! (tempo1 | is.finite(data1[[i1]][, y[[i1]]])))){ -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") LOG CONVERSION INTRODUCED -Inf OR Inf OR NaN VALUES IN ", ifelse(length(categ)== 1L, "y", paste0("ELEMENT ", i1, " OF y ARGUMENT")), " IN ", ifelse(length(data1)== 1L, "data1 ARGUMENT", paste0("DATA FRAME NUMBER ", i1, " OF data1 ARGUMENT")), " AND CORRESPONDING ROWS REMOVED (SEE $removed.row.nb AND $removed.rows)") -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -} -} -# Inf removal -# removed.row.nb[[i1]] <- NULL # already NULL and Warning this removes the compartment -removed.rows[[i1]] <- data.frame(stringsAsFactors = FALSE) -if(any(( ! is.finite(data1[[i1]][, x[[i1]]])) & ( ! is.na(data1[[i1]][, x[[i1]]])))){ # is.finite also detects NA: ( ! is.finite(data1[[i1]][, x[[i1]]])) & ( ! is.na(data1[[i1]][, x[[i1]]])) detects only Inf -removed.row.nb[[i1]] <- c(removed.row.nb[[i1]], which(( ! is.finite(data1[[i1]][, x[[i1]]])) & ( ! is.na(data1[[i1]][, x[[i1]]])))) -} -if(any(( ! is.finite(data1[[i1]][, y[[i1]]])) & ( ! is.na(data1[[i1]][, y[[i1]]])))){ # is.finite also detects NA: ( ! is.finite(data1[[i1]][, y[[i1]]])) & ( ! is.na(data1[[i1]][, y[[i1]]])) detects only Inf -removed.row.nb[[i1]] <- c(removed.row.nb[[i1]], which(( ! is.finite(data1[[i1]][, y[[i1]]])) & ( ! is.na(data1[[i1]][, y[[i1]]])))) -} -if( ! is.null(removed.row.nb[[i1]])){ -removed.row.nb[[i1]] <- unique(removed.row.nb[[i1]]) # to remove the duplicated positions (NA in both x and y) -removed.rows[[i1]] <- rbind(removed.rows[[i1]], data1.ini[[i1]][removed.row.nb[[i1]], ]) # here data1.ini used to have the y = O rows that will be removed because of Inf creation after log transformation -data1[[i1]] <- data1[[i1]][-removed.row.nb[[i1]], ] -data1.ini[[i1]] <- data1.ini[[i1]][-removed.row.nb[[i1]], ] # -} -# From here, data1 and data.ini have no more Inf -# end Inf removal -# x.lim and y.lim dealt later on, after the end f the loop -# end management of log scale and Inf removal -# management of log scale -if(x.log != "no"){ -data1[[i1]][, x[[i1]]] <- suppressWarnings(get(x.log)(data1[[i1]][, x[[i1]]])) # no env = sys.nframe(), inherit = FALSE in get() because look for function in the classical scope -} -if(y.log != "no"){ -data1[[i1]][, y[[i1]]] <- suppressWarnings(get(y.log)(data1[[i1]][, y[[i1]]])) # no env = sys.nframe(), inherit = FALSE in get() because look for function in the classical scope -} -# end management of log scale -# na detection and removal -column.check <- unique(unlist(c( # unlist because creates a list -if(x[[i1]] == "fake_x"){NULL}else{x[[i1]]}, -if(y[[i1]] == "fake_y"){NULL}else{y[[i1]]}, -if( ! is.null(categ)){if(is.null(categ[[i1]])){NULL}else{categ[[i1]]}}, -if( ! is.null(facet.categ)){if(is.null(facet.categ[[i1]])){NULL}else{facet.categ[[i1]]}} -))) # dot.categ because can be a 3rd column of data1 -if(any(is.na(data1[[i1]][, column.check]))){ -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") NA DETECTED IN COLUMNS ", paste(column.check, collapse = " "), " OF ", ifelse(length(data1)== 1L, "data1 ARGUMENT", paste0("DATA FRAME NUMBER ", i1, " OF data1 ARGUMENT")), " AND CORRESPONDING ROWS REMOVED (SEE $removed.row.nb AND $removed.rows)") -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -for(i3 in 1:length(column.check)){ -if(any(is.na(data1[[i1]][, column.check[i3]]))){ -warn.count <- warn.count + 1 -tempo.warn <- paste0("NA REMOVAL DUE TO COLUMN ", column.check[i3], " OF ", ifelse(length(data1)== 1L, "data1 ARGUMENT", paste0("DATA FRAME NUMBER ", i1, " OF data1 ARGUMENT"))) -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -} -} -tempo <- unique(unlist(lapply(lapply(c(data1[[i1]][column.check]), FUN = is.na), FUN = which))) -removed.row.nb[[i1]] <- c(removed.row.nb[[i1]], tempo) -removed.rows[[i1]] <- rbind(removed.rows[[i1]], data1.ini[[i1]][tempo, ]) # # tempo used because removed.row.nb is not empty. Here data1.ini used to have the non NA rows that will be removed because of NAN creation after log transformation (neg values for instance) -column.check <- column.check[ ! (column.check == x[[i1]] | column.check == y[[i1]])] # remove x and y to keep quali columns -if(length(tempo) != 0){ -data1[[i1]] <- data1[[i1]][-tempo, ] # WARNING tempo here and not removed.row.nb because the latter contain more numbers thant the former -data1.ini[[i1]] <- data1.ini[[i1]][-tempo, ] # WARNING tempo here and not removed.row.nb because the latter contain more numbers than the former -for(i4 in 1:length(column.check)){ -if(any( ! unique(removed.rows[[i1]][, column.check[i4]]) %in% unique(data1[[i1]][, column.check[i4]]))){ -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") IN COLUMN ", column.check[i4], " OF ", ifelse(length(data1)== 1L, "data1 ARGUMENT", paste0("DATA FRAME NUMBER ", i1, " OF data1 ARGUMENT")), ", THE FOLLOWING CLASSES HAVE DISAPPEARED AFTER NA REMOVAL\n(IF COLUMN USED IN THE PLOT, THIS CLASS WILL NOT BE DISPLAYED):\n", paste(unique(removed.rows[[i1]][, column.check[i4]])[ ! unique(removed.rows[[i1]][, column.check[i4]]) %in% unique(data1[[i1]][, column.check[i4]])], collapse = " ")) -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -tempo.levels <- levels(data1[[i1]][, column.check[i4]])[levels(data1[[i1]][, column.check[i4]]) %in% unique(as.character(data1[[i1]][, column.check[i4]]))] -data1[[i1]][, column.check[i4]] <- factor(as.character(data1[[i1]][, column.check[i4]]), levels = tempo.levels) -if(column.check[i4] %in% categ[[i1]] & ! is.null(categ.class.order)){ -categ.class.order[[i1]] <- levels(data1[[i1]][, column.check[i4]])[levels(data1[[i1]][, column.check[i4]]) %in% unique(data1[[i1]][, column.check[i4]])] # remove the absent class in the categ.class.order vector -data1[[i1]][, column.check[i4]] <- factor(as.character(data1[[i1]][, column.check[i4]]), levels = unique(categ.class.order[[i1]])) -} -} -} -} -} -# end na detection and removal -# From here, data1 and data.ini have no more NA or NaN in x, y, categ (if categ != NULL) and facet.categ (if categ != NULL) -if( ! is.null(categ.class.order)){ -# the following check will be done several times but I prefer to keep it here, after the creation of categ -if(is.null(categ[[i1]]) & ! is.null(categ.class.order[[i1]])){ -tempo.cat <- paste0("ERROR IN ", function.name, "\nCOMPARTMENT ", i1, " OF categ ARGUMENT CANNOT BE NULL IF COMPARTMENT ", i1, " OF categ.class.order ARGUMENT IS NOT NULL: ", paste(categ.class.order, collapse = " ")) -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -}else{ -if(is.null(categ.class.order[[i1]])){ -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") THE categ.class.order COMPARTMENT ", i1, " IS NULL. ALPHABETICAL ORDER WILL BE APPLIED") -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -data1[[i1]][, categ[[i1]]] <- factor(as.character(data1[[i1]][, categ[[i1]]])) # if already a factor, change nothing, if characters, levels according to alphabetical order -categ.class.order[[i1]] <- levels(data1[[i1]][, categ[[i1]]]) # character vector that will be used later -}else{ -tempo <- fun_check(data = categ.class.order[[i1]], data.name = paste0("COMPARTMENT ", i1 , " OF categ.class.order ARGUMENT"), class = "vector", mode = "character", length = length(levels(data1[[i1]][, categ[[i1]]])), fun.name = function.name) # length(data1[, categ[i1]) -> if data1[, categ[i1] was initially character vector, then conversion as factor after the NA removal, thus class number ok. If data1[, categ[i1] was initially factor, no modification after the NA removal, thus class number ok -if(tempo$problem == TRUE){ -stop(paste0("\n\n================\n\n", tempo$text, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -} -} -if(any(duplicated(categ.class.order[[i1]]))){ -tempo.cat <- paste0("ERROR IN ", function.name, "\nCOMPARTMENT ", i1, " OF categ.class.order ARGUMENT CANNOT HAVE DUPLICATED CLASSES: ", paste(categ.class.order[[i1]], collapse = " ")) -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -}else if( ! (all(categ.class.order[[i1]] %in% unique(data1[[i1]][, categ[[i1]]])) & all(unique(data1[[i1]][, categ[[i1]]]) %in% categ.class.order[[i1]]))){ -tempo.cat <- paste0("ERROR IN ", function.name, "\nCOMPARTMENT ", i1, " OF categ.class.order ARGUMENT MUST BE CLASSES OF COMPARTMENT ", i1, " OF categ ARGUMENT\nHERE IT IS:\n", paste(categ.class.order[[i1]], collapse = " "), "\nFOR COMPARTMENT ", i1, " OF categ.class.order AND IT IS:\n", paste(unique(data1[[i1]][, categ[[i1]]]), collapse = " "), "\nFOR COLUMN ", categ[[i1]], " OF data1 NUMBER ", i1) -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -}else{ -data1[[i1]][, categ[[i1]]] <- factor(data1[[i1]][, categ[[i1]]], levels = categ.class.order[[i1]]) # reorder the factor -} -names(categ.class.order)[i1] <- categ[[i1]] -} -} -# OK: if categ.class.order is not NULL, all the NULL categ.class.order columns of data1 are character from here - -if( ! is.null(legend.name[[i1]])){ -tempo <- fun_check(data = legend.name[[i1]], data.name = ifelse(length(legend.name)== 1L, "legend.name", paste0("legend.name NUMBER ", i1)),, class = "vector", mode = "character", length = 1, fun.name = function.name) -if(tempo$problem == TRUE){ -stop(paste0("\n\n================\n\n", tempo$text, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -} -} -if( ! is.null(color)){ # if color is NULL, will be filled later on -# check the nature of color -if(is.null(color[[i1]])){ -compart.null.color <- compart.null.color + 1 -color[[i1]] <- grey(compart.null.color / 8) # cannot be more than 7 overlays. Thus 7 different greys. 8/8 is excluded because white dots -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") NULL COLOR IN ", ifelse(length(color)== 1L, "color", paste0("ELEMENT NUMBER ", i1, " OF color ARGUMENT")), " ASSOCIATED TO ", ifelse(length(data1)== 1L, "data1 ARGUMENT", paste0("DATA FRAME NUMBER ", i1, " OF data1 ARGUMENT")), ", SINGLE COLOR ", paste(color[[i1]], collapse = " "), " HAS BEEN ATTRIBUTED") -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -} -tempo1 <- fun_check(data = color[[i1]], data.name = ifelse(length(color)== 1L, "color", paste0("ELEMENT NUMBER ", i1, " OF color ARGUMENT")), class = "vector", mode = "character", na.contain = TRUE, fun.name = function.name) # na.contain = TRUE in case of colum of data1 -tempo2 <- fun_check(data = color[[i1]], data.name = ifelse(length(color)== 1L, "color", paste0("ELEMENT NUMBER ", i1, " OF color ARGUMENT")), class = "factor", na.contain = TRUE, fun.name = function.name) # idem -if(tempo1$problem == TRUE & tempo2$problem == TRUE){ -tempo.cat <- paste0("ERROR IN ", function.name, ": ", ifelse(length(color)== 1L, "color", paste0("ELEMENT NUMBER ", i1, " OF color ARGUMENT")), " MUST BE A FACTOR OR CHARACTER VECTOR OR INTEGER VECTOR") # integer possible because dealt above -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -}else if( ! (all(color[[i1]] %in% colors() | grepl(pattern = "^#", color[[i1]])))){ # check that all strings of low.color start by # -tempo.cat <- paste0("ERROR IN ", function.name, ": ", ifelse(length(color)== 1L, "color", paste0("ELEMENT NUMBER ", i1, " OF color ARGUMENT")), " MUST BE A HEXADECIMAL COLOR VECTOR STARTING BY # AND/OR COLOR NAMES GIVEN BY colors(): ", paste(unique(color[[i1]]), collapse = " ")) -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -} -if(any(is.na(color[[i1]]))){ -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") IN ", ifelse(length(color)== 1L, "color", paste0("ELEMENT NUMBER ", i1, " OF color ARGUMENT")), ", THE COLORS:\n", paste(unique(color[[i1]]), collapse = " "), "\nCONTAINS NA") -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -} -# end check the nature of color -# check the length of color -if(is.null(categ) & length(color[[i1]]) != 1){ -tempo.cat <- paste0("ERROR IN ", function.name, ": ", ifelse(length(color)== 1L, "color", paste0("ELEMENT NUMBER ", i1, " OF color ARGUMENT")), " MUST BE A SINGLE COLOR IF categ IS NULL") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -}else if( ! is.null(categ)){ -# No problem of NA management by ggplot2 because already removed -if(categ[[i1]] == "fake_categ" & length(color[[i1]]) != 1){ -tempo.cat <- paste0("ERROR IN ", function.name, ": ", ifelse(length(color)== 1L, "color", paste0("ELEMENT NUMBER ", i1, " OF color ARGUMENT")), " MUST BE A SINGLE COLOR IF ", ifelse(length(categ)== 1L, "categ", paste0("ELEMENT ", i1, " OF categ ARGUMENT")), " IS NULL") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -}else if(length(color[[i1]]) == length(unique(data1[[i1]][, categ[[i1]]]))){ # here length(color) is equal to the different number of categ -data1[[i1]][, categ[[i1]]] <- factor(data1[[i1]][, categ[[i1]]]) # if already a factor, change nothing, if characters, levels according to alphabetical order -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") IN ", ifelse(length(categ)== 1L, "categ", paste0("ELEMENT ", i1, " OF categ ARGUMENT")), " IN ", ifelse(length(data1)== 1L, "data1 ARGUMENT", paste0("DATA FRAME NUMBER ", i1, " OF data1 ARGUMENT")), ", THE FOLLOWING COLORS:\n", paste(color[[i1]], collapse = " "), "\nHAVE BEEN ATTRIBUTED TO THESE CLASSES:\n", paste(levels(factor(data1[[i1]][, categ[[i1]]])), collapse = " ")) -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -}else if(length(color[[i1]]) == length(data1[[i1]][, categ[[i1]]])){# here length(color) is equal to nrow(data1[[i1]]) -> Modif to have length(color) equal to the different number of categ (length(color) == length(levels(data1[[i1]][, categ[[i1]]]))) -data1[[i1]] <- cbind(data1[[i1]], color = color[[i1]], stringsAsFactors = TRUE) -tempo.check <- unique(data1[[i1]][ , c(categ[[i1]], "color")]) -if( ! (nrow(data1[[i1]]) == length(color[[i1]]) & nrow(tempo.check) == length(unique(data1[[i1]][ , categ[[i1]]])))){ -tempo.cat <- paste0("ERROR IN ", function.name, ": ", ifelse(length(color)== 1L, "color", paste0("ELEMENT NUMBER ", i1, " OF color")), " ARGUMENT HAS THE LENGTH OF ", ifelse(length(categ)== 1L, "categ", paste0("ELEMENT ", i1, " OF categ ARGUMENT")), " IN ", ifelse(length(data1)== 1L, "data1 ARGUMENT", paste0("DATA FRAME NUMBER ", i1, " OF data1 ARGUMENT")), "\nBUT IS INCORRECTLY ASSOCIATED TO EACH CLASS OF THIS categ:\n", paste(unique(mapply(FUN = "paste", data1[[i1]][ ,categ[[i1]]], data1[[i1]][ ,"color"])), collapse = "\n")) -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -}else{ -data1[[i1]][, categ[[i1]]] <- factor(data1[[i1]][, categ[[i1]]]) # if already a factor, change nothing, if characters, levels according to alphabetical order -color[[i1]] <- unique(color[[i1]][order(data1[[i1]][, categ[[i1]]])]) # Modif to have length(color) equal to the different number of categ (length(color) == length(levels(data1[[i1]][, categ[[i1]]]))) -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count, ") FROM FUNCTION ", function.name, ": ", ifelse(length(color)== 1L, "color", paste0("ELEMENT NUMBER ", i1, " OF color ARGUMENT")), " HAS THE LENGTH OF ", ifelse(length(categ)== 1L, "categ", paste0("ELEMENT ", i1, " OF categ ARGUMENT")), " IN ", ifelse(length(data1)== 1L, "data1 ARGUMENT", paste0("DATA FRAME NUMBER ", i1, " OF data1 ARGUMENT")), " COLUMN VALUES\nCOLORS HAVE BEEN RESPECTIVELY ASSOCIATED TO EACH CLASS OF categ AS:\n", paste(levels(factor(data1[[i1]][, categ[[i1]]])), collapse = " "), "\n", paste(color[[i1]], collapse = " ")) -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -} -}else if(length(color[[i1]])== 1L){ -data1[[i1]][, categ[[i1]]] <- factor(data1[[i1]][, categ[[i1]]]) # if already a factor, change nothing, if characters, levels according to alphabetical order -color[[i1]] <- rep(color[[i1]], length(levels(data1[[i1]][, categ[[i1]]]))) -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") IN ", ifelse(length(categ)== 1L, "categ", paste0("ELEMENT ", i1, " OF categ ARGUMENT")), " IN ", ifelse(length(data1)== 1L, "data1 ARGUMENT", paste0("DATA FRAME NUMBER ", i1, " OF data1 ARGUMENT")), ", COLOR HAS LENGTH 1 MEANING THAT ALL THE DIFFERENT CLASSES OF ", ifelse(length(categ)== 1L, "categ", paste0("ELEMENT ", i1, " OF categ ARGUMENT")), "\n", paste(levels(factor(data1[[i1]][, categ[[i1]]])), collapse = " "), "\nWILL HAVE THE SAME COLOR\n", paste(color[[i1]], collapse = " ")) -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -}else{ -tempo.cat <- paste0("ERROR IN ", function.name, ": ", ifelse(length(color)== 1L, "color", paste0("ELEMENT NUMBER ", i1, " OF color ARGUMENT")), " MUST BE\n(1) LENGTH 1\nOR (2) THE LENGTH OF ", ifelse(length(categ)== 1L, "categ", paste0("ELEMENT ", i1, " OF categ ARGUMENT")), " IN ", ifelse(length(data1)== 1L, "data1 ARGUMENT", paste0("DATA FRAME NUMBER ", i1, " OF data1 ARGUMENT")), " COLUMN VALUES\nOR (3) THE LENGTH OF THE CLASSES IN THIS COLUMN\nHERE IT IS COLOR LENGTH ", length(color[[i1]]), " VERSUS CATEG LENGTH ", length(data1[[i1]][, categ[[i1]]]), " AND CATEG CLASS LENGTH ", length(unique(data1[[i1]][, categ[[i1]]])), "\nPRESENCE OF NA IN THE COLUMN x, y OR categ OF data1 COULD BE THE PROBLEME") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -} -} -} -if((geom[[i1]] == "geom_hline" | geom[[i1]] == "geom_vline") & ! is.null(categ[[i1]])){ # add here after the color management, to deal with the different lines to plot inside any data[[i1]] -if(categ[[i1]] == "fake_categ"){ -data1[[i1]][, "fake_categ"] <- factor(paste0("Line_", formatC(1:nrow(data1[[i2]]), width = nchar(nrow(data1[[i2]])), flag = "0"))) -} -} -tempo <- fun_check(data = alpha[[i1]], data.name = ifelse(length(alpha)== 1L, "alpha", paste0("alpha NUMBER ", i1)), prop = TRUE, length = 1, fun.name = function.name) -if(tempo$problem == TRUE){ -stop(paste0("\n\n================\n\n", tempo$text, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -} -} -# end loop (checking inside list compartment) -if(length(data1) > 1){ -if(length(unique(unlist(x)[ ! x == "fake_x"])) > 1){ -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") THE x ARGUMENT DOES NOT CONTAIN IDENTICAL COLUMN NAMES:\n", paste(unlist(x), collapse = " "), "\nX-AXIS OVERLAYING DIFFERENT VARIABLES?") -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -} -} -if(length(data1) > 1){ -if(length(unique(unlist(y)[ ! y == "fake_y"])) > 1){ -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") THE y ARGUMENT DOES NOT CONTAIN IDENTICAL COLUMN NAMES:\n", paste(unlist(y), collapse = " "), "\nY-AXIS OVERLAYING DIFFERENT VARIABLES?") -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -} -} -if(sum(geom %in% "geom_point") > 3){ -tempo.cat <- paste0("ERROR IN ", function.name, ": geom ARGUMENT CANNOT HAVE MORE THAN THREE \"geom_point\" ELEMENTS") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -}else if(length(geom) - sum(geom %in% "geom_point") > 3){ -tempo.cat <- paste0("ERROR IN ", function.name, ": geom ARGUMENT CANNOT HAVE MORE THAN THREE LINE ELEMENTS") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -} -# x.lim management before transfo by x.log -if(x.log != "no" & ! is.null(x.lim)){ -if(any(x.lim <= 0)){ -tempo.cat <- paste0("ERROR IN ", function.name, "\nx.lim ARGUMENT CANNOT HAVE ZERO OR NEGATIVE VALUES WITH THE x.log ARGUMENT SET TO ", x.log, ":\n", paste(x.lim, collapse = " ")) -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -}else if(any( ! is.finite(if(x.log == "log10"){log10(x.lim)}else{log2(x.lim)}))){ -tempo.cat <- paste0("ERROR IN ", function.name, "\nx.lim ARGUMENT RETURNS INF/NA WITH THE x.log ARGUMENT SET TO ", x.log, "\nAS SCALE COMPUTATION IS ", ifelse(x.log == "log10", "log10", "log2"), ":\n", paste(if(x.log == "log10"){log10(x.lim)}else{log2(x.lim)}, collapse = " ")) -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -} -} -if(x.log != "no" & x.include.zero == TRUE){ -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") x.log ARGUMENT SET TO ", x.log, " AND x.include.zero ARGUMENT SET TO TRUE -> x.include.zero ARGUMENT RESET TO FALSE BECAUSE 0 VALUE CANNOT BE REPRESENTED IN LOG SCALE") -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -x.include.zero <- FALSE -} -# end x.lim management before transfo by x.log -# y.lim management before transfo by y.log -if(y.log != "no" & ! is.null(y.lim)){ -if(any(y.lim <= 0)){ -tempo.cat <- paste0("ERROR IN ", function.name, "\ny.lim ARGUMENT CANNOT HAVE ZERO OR NEGATIVE VALUES WITH THE y.log ARGUMENT SET TO ", y.log, ":\n", paste(y.lim, collapse = " ")) -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -}else if(any( ! is.finite(if(y.log == "log10"){log10(y.lim)}else{log2(y.lim)}))){ -tempo.cat <- paste0("ERROR IN ", function.name, "\ny.lim ARGUMENT RETURNS INF/NA WITH THE y.log ARGUMENT SET TO ", y.log, "\nAS SCALE COMPUTATION IS ", ifelse(y.log == "log10", "log10", "log2"), ":\n", paste(if(y.log == "log10"){log10(y.lim)}else{log2(y.lim)}, collapse = " ")) -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -} -} -if(y.log != "no" & y.include.zero == TRUE){ -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") y.log ARGUMENT SET TO ", y.log, " AND y.include.zero ARGUMENT SET TO TRUE -> y.include.zero ARGUMENT RESET TO FALSE BECAUSE 0 VALUE CANNOT BE REPRESENTED IN LOG SCALE") -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -y.include.zero <- FALSE -} -# end y.lim management before transfo by y.log -# end other checkings -# reserved word checking -#already done above -# end reserved word checking -# end second round of checking and data preparation - - -# package checking -fun_pack(req.package = c( -"gridExtra", -"ggplot2", -"lemon", -"scales" -), lib.path = lib.path) -# packages Cairo and grid tested by fun_gg_point_rast() -# end package checking - - - - -# main code -# axes management -if(is.null(x.lim)){ -if(any(unlist(mapply(FUN = "[[", data1, x, SIMPLIFY = FALSE)) %in% c(Inf, -Inf))){ -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") THE x COLUMN IN data1 CONTAINS -Inf OR Inf VALUES THAT WILL NOT BE CONSIDERED IN THE PLOT RANGE") -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -} -x.lim <- suppressWarnings(range(unlist(mapply(FUN = "[[", data1, x, SIMPLIFY = FALSE)), na.rm = TRUE, finite = TRUE)) # finite = TRUE removes all the -Inf and Inf except if only this. In that case, whatever the -Inf and/or Inf present, output -Inf;Inf range. Idem with NA only. y.lim added here. If NULL, ok if y argument has values -}else if(x.log != "no"){ -x.lim <- get(x.log)(x.lim) # no env = sys.nframe(), inherit = FALSE in get() because look for function in the classical scope -} -if(x.log != "no"){ -if(any( ! is.finite(x.lim))){ -tempo.cat <- paste0("ERROR IN ", function.name, "\nx.lim ARGUMENT CANNOT HAVE ZERO OR NEGATIVE VALUES WITH THE x.log ARGUMENT SET TO ", x.log, ":\n", paste(x.lim, collapse = " "), "\nPLEASE, CHECK DATA VALUES (PRESENCE OF ZERO OR INF VALUES)") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -} -} -if(suppressWarnings(all(x.lim %in% c(Inf, -Inf)))){ # happen when x is only NULL -if(all(unlist(geom) %in% c("geom_vline", "geom_stick"))){ -tempo.cat <- paste0("ERROR IN ", function.name, " NOT POSSIBLE TO DRAW geom_vline OR geom_stick KIND OF LINES ALONE IF x.lim ARGUMENT IS SET TO NULL, SINCE NO X-AXIS DEFINED (", ifelse(length(x)== 1L, "x", paste0("ELEMENT ", i1, " OF x")), " ARGUMENT MUST BE NULL FOR THESE KIND OF LINES)") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -}else{ -tempo.cat <- paste0("ERROR IN ", function.name, " x.lim ARGUMENT MADE OF NA, -Inf OR Inf ONLY: ", paste(x.lim, collapse = " ")) -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -} -} -x.lim.order <- order(x.lim) # to deal with inverse axis -# print(x.lim.order) -x.lim <- sort(x.lim) -x.lim[1] <- x.lim[1] - abs(x.lim[2] - x.lim[1]) * ifelse(diff(x.lim.order) > 0, x.right.extra.margin, x.left.extra.margin) # diff(x.lim.order) > 0 means not inversed axis -x.lim[2] <- x.lim[2] + abs(x.lim[2] - x.lim[1]) * ifelse(diff(x.lim.order) > 0, x.left.extra.margin, x.right.extra.margin) # diff(x.lim.order) > 0 means not inversed axis -if(x.include.zero == TRUE){ # no need to check x.log != "no" because done before -x.lim <- range(c(x.lim, 0), na.rm = TRUE, finite = TRUE) # finite = TRUE removes all the -Inf and Inf except if only this. In that case, whatever the -Inf and/or Inf present, output -Inf;Inf range. Idem with NA only -} -x.lim <- x.lim[x.lim.order] -if(any(is.na(x.lim))){ -tempo.cat <- paste0("ERROR IN ", function.name, ": CODE INCONSISTENCY 3") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -} -if(is.null(y.lim)){ -if(any(unlist(mapply(FUN = "[[", data1, y, SIMPLIFY = FALSE)) %in% c(Inf, -Inf))){ -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") THE y COLUMN IN data1 CONTAINS -Inf OR Inf VALUES THAT WILL NOT BE CONSIDERED IN THE PLOT RANGE") -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -} -y.lim <- suppressWarnings(range(unlist(mapply(FUN = "[[", data1, y, SIMPLIFY = FALSE)), na.rm = TRUE, finite = TRUE)) # finite = TRUE removes all the -Inf and Inf except if only this. In that case, whatever the -Inf and/or Inf present, output -Inf;Inf range. Idem with NA only. y.lim added here. If NULL, ok if y argument has values -}else if(y.log != "no"){ -y.lim <- get(y.log)(y.lim) # no env = sys.nframe(), inherit = FALSE in get() because look for function in the classical scope -} -if(y.log != "no"){ -if(any( ! is.finite(y.lim))){ -tempo.cat <- paste0("ERROR IN ", function.name, "\ny.lim ARGUMENT CANNOT HAVE ZERO OR NEGATIVE VALUES WITH THE y.log ARGUMENT SET TO ", y.log, ":\n", paste(y.lim, collapse = " "), "\nPLEASE, CHECK DATA VALUES (PRESENCE OF ZERO OR INF VALUES)") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -} -} -if(suppressWarnings(all(y.lim %in% c(Inf, -Inf)))){ # happen when y is only NULL -if(all(unlist(geom) == "geom_vline")){ -tempo.cat <- paste0("ERROR IN ", function.name, " NOT POSSIBLE TO DRAW geom_vline KIND OF LINES ALONE IF y.lim ARGUMENT IS SET TO NULL, SINCE NO Y-AXIS DEFINED (", ifelse(length(y)== 1L, "y", paste0("ELEMENT ", i1, " OF y")), " ARGUMENT MUST BE NULL FOR THESE KIND OF LINES)") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -}else{ -tempo.cat <- paste0("ERROR IN ", function.name, " y.lim ARGUMENT MADE OF NA, -Inf OR Inf ONLY: ", paste(y.lim, collapse = " ")) -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -} -} -y.lim.order <- order(y.lim) # to deal with inverse axis -y.lim <- sort(y.lim) -y.lim[1] <- y.lim[1] - abs(y.lim[2] - y.lim[1]) * ifelse(diff(y.lim.order) > 0, y.bottom.extra.margin, y.top.extra.margin) # diff(y.lim.order) > 0 means not inversed axis -y.lim[2] <- y.lim[2] + abs(y.lim[2] - y.lim[1]) * ifelse(diff(y.lim.order) > 0, y.top.extra.margin, y.bottom.extra.margin) # diff(y.lim.order) > 0 means not inversed axis -if(y.include.zero == TRUE){ # no need to check y.log != "no" because done before -y.lim <- range(c(y.lim, 0), na.rm = TRUE, finite = TRUE) # finite = TRUE removes all the -Inf and Inf except if only this. In that case, whatever the -Inf and/or Inf present, output -Inf;Inf range. Idem with NA only -} -y.lim <- y.lim[y.lim.order] -if(any(is.na(y.lim))){ -tempo.cat <- paste0("ERROR IN ", function.name, ": CODE INCONSISTENCY 4") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -} -# end axes management - - - - -# create a fake categ if NULL to deal with legend display -if(is.null(categ)){ -categ <- vector("list", length(data1)) -categ[] <- "fake_categ" -for(i2 in 1:length(data1)){ -data1[[i2]] <- cbind(data1[[i2]], fake_categ = "", stringsAsFactors = TRUE) -if(geom[[i2]] == "geom_hline" | geom[[i2]] == "geom_vline"){ -data1[[i2]][, "fake_categ"] <- factor(paste0("Line_", 1:nrow(data1[[i2]]))) -} -} -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") NULL categ ARGUMENT -> FAKE \"fake_categ\" COLUMN ADDED TO EACH DATA FRAME OF data1, AND FILLED WITH \"\"") -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -} -# categ is not NULL anymore -if(is.null(categ.class.order)){ -categ.class.order <- vector("list", length = length(data1)) -tempo.categ.class.order <- NULL -for(i2 in 1:length(categ.class.order)){ -categ.class.order[[i2]] <- levels(data1[[i2]][, categ[[i2]]]) -names(categ.class.order)[i2] <- categ[[i2]] -tempo.categ.class.order <- c(tempo.categ.class.order, ifelse(i2 != 1, "\n", ""), categ.class.order[[i2]]) -} -if(any(unlist(legend.disp))){ -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") THE categ.class.order SETTING IS NULL. ALPHABETICAL ORDER WILL BE APPLIED FOR CLASS ORDERING:\n", paste(tempo.categ.class.order, collapse = " ")) -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -} -} -# end create a fake categ if NULL to deal with legend display -# categ.class.order is not NULL anymore - - -# vector of color with length as in levels(categ) of data1 -if(is.null(color)){ -color <- vector("list", length(data1)) -length.categ.list <- lapply(lapply(mapply(FUN = "[[", data1, categ, SIMPLIFY = FALSE), FUN = unique), FUN = function(x){length(x[ ! is.na(x)])}) -length.categ.list[sapply(categ, FUN = "==", "fake_categ")] <- 1 # when is.null(color), a single color for all the dots or lines of data[[i1]] that contain "fake_categ" category -total.categ.length <- sum(unlist(length.categ.list), na.rm = TRUE) -tempo.color <- fun_gg_palette(total.categ.length) -tempo.count <- 0 -for(i2 in 1:length(data1)){ -color[[i2]] <- tempo.color[(1:length.categ.list[[i2]]) + tempo.count] -tempo.count <- tempo.count + length.categ.list[[i2]] -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") NULL color ARGUMENT -> COLORS RESPECTIVELY ATTRIBUTED TO EACH CLASS OF ", ifelse(length(categ)== 1L, "categ", paste0("ELEMENT ", i2, " OF categ ARGUMENT")), " (", categ[[i2]], ") IN ", ifelse(length(data1)== 1L, "data1 ARGUMENT", paste0("DATA FRAME NUMBER ", i2, " OF data1 ARGUMENT")), ":\n", paste(color[[i2]], collapse = " "), "\n", paste(if(all(levels(data1[[i2]][, categ[[i2]]]) == "")){'\"\"'}else{levels(data1[[i2]][, categ[[i2]]])}, collapse = " ")) -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -} -} -# end vector of color with length as in levels(categ) of data1 -# color is not NULL anymore - - - - - -# last check -for(i1 in 1:length(data1)){ -if(categ[[i1]] != "fake_categ" & length(color[[i1]]) != length(unique(data1[[i1]][, categ[[i1]]]))){ -tempo.cat <- paste0("ERROR IN ", function.name, " LAST CHECK: ", ifelse(length(color)== 1L, "color", paste0("ELEMENT NUMBER ", i1, " OF color ARGUMENT")), " MUST HAVE THE LENGTH OF LEVELS OF ", ifelse(length(categ)== 1L, "categ", paste0("ELEMENT ", i1, " OF categ ARGUMENT")), " IN ", ifelse(length(data1)== 1L, "data1 ARGUMENT", paste0("DATA FRAME NUMBER ", i1, " OF data1 ARGUMENT")), "\nHERE IT IS COLOR LENGTH ", length(color[[i1]]), " VERSUS CATEG LEVELS LENGTH ", length(unique(data1[[i1]][, categ[[i1]]])), "\nREMINDER: A SINGLE COLOR PER CLASS OF CATEG AND A SINGLE CLASS OF CATEG PER COLOR MUST BE RESPECTED") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -}else if(categ[[i1]] == "fake_categ" & length(color[[i1]]) != 1){ -tempo.cat <- paste0("ERROR IN ", function.name, " LAST CHECK: ", ifelse(length(color)== 1L, "color", paste0("ELEMENT NUMBER ", i1, " OF color ARGUMENT")), " MUST HAVE LENGTH 1 WHEN ", ifelse(length(categ)== 1L, "categ", paste0("ELEMENT ", i1, " OF categ ARGUMENT")), " IS NULL\nHERE IT IS COLOR LENGTH ", length(color[[i1]])) -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -} -} -# end last check - - - - - -# conversion of geom_hline and geom_vline -for(i1 in 1:length(data1)){ -if(geom[[i1]] == "geom_hline" | geom[[i1]] == "geom_vline"){ -final.data.frame <- data.frame() -for(i3 in 1:nrow(data1[[i1]])){ -tempo.data.frame <- rbind(data1[[i1]][i3, ], data1[[i1]][i3, ], stringsAsFactors = TRUE) -if(geom[[i1]] == "geom_hline"){ -tempo.data.frame[, x[[i1]]] <- x.lim -}else if(geom[[i1]] == "geom_vline"){ -tempo.data.frame[, y[[i1]]] <- y.lim -}else{ -tempo.cat <- paste0("ERROR IN ", function.name, ": CODE INCONSISTENCY 5") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -} -# 3 lines below inactivated because I put that above -# if(is.null(categ[[i1]])){ -# data1[, "fake_categ"] <- paste0("Line_", i3) -# } -final.data.frame <- rbind(final.data.frame, tempo.data.frame, stringsAsFactors = TRUE) -} -data1[[i1]] <- final.data.frame -geom[[i1]] <- "geom_line" -if(length(color[[i1]])== 1L){ -color[[i1]] <- rep(color[[i1]], length(unique(data1[[i1]][ , categ[[i1]]]))) -}else if(length(color[[i1]]) != length(unique(data1[[i1]][ , categ[[i1]]]))){ -tempo.cat <- paste0("ERROR IN ", function.name, " geom_hline AND geom_vline CONVERSION TO FIT THE XLIM AND YLIM LIMITS OF THE DATA: ", ifelse(length(color)== 1L, "color", paste0("ELEMENT NUMBER ", i1, " OF color ARGUMENT")), " MUST HAVE THE LENGTH OF LEVELS OF ", ifelse(length(categ)== 1L, "categ", paste0("ELEMENT ", i1, " OF categ ARGUMENT")), " IN ", ifelse(length(data1)== 1L, "data1 ARGUMENT", paste0("DATA FRAME NUMBER ", i1, " OF data1 ARGUMENT")), "\nHERE IT IS COLOR LENGTH ", length(color[[i1]]), " VERSUS CATEG LEVELS LENGTH ", length(unique(data1[[i1]][, categ[[i1]]]))) -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -} -} + # AIM + # Plot ggplot2 boxplots + dots + means + # For ggplot2 specifications, see: https://ggplot2.tidyverse.org/articles/ggplot2-specs.html + # WARNINGS + # Rows containing NA in data1[, c(y, categ)] will be removed before processing, with a warning (see below) + # Hinges are not computed like in the classical boxplot() function of R. See https://ggplot2.tidyverse.org/reference/geom_boxplot.html + # To have a single box, please create a factor column with a single class and specify the name of this column in the categ argument. For a single set of grouped boxes, create a factor column with a single class and specify this column in categ argument as first element (i.e., as categ1, knowing that categ2 must also be specified in this situation). See categ argument below + # The dot.alpha argument can alter the display of the color boxes when using pdf output + # Size arguments (box.line.size, dot.size, dot.border.size, stat.size, text.size and title.text.size) are in mm. See Hadley comment in https://stackoverflow.com/questions/17311917/ggplot2-the-unit-of-size. See also http://sape.inf.usi.ch/quick-reference/ggplot2/size). Unit object are not accepted, but conversion can be used (e.g., grid::convertUnit(grid::unit(0.2, "inches"), "mm", valueOnly = TRUE)) + # Display seems to be done twice on Windows devices (like a blink). However, no double plots on pdf devices. Thus, the blink remains mysterious + # To remove boxes and have only dots, use box.alpha = 0 + # ARGUMENTS + # data1: data frame containing one column of quantitative values (see the y argument below) and one or two columns of categories (see the categ argument below). Duplicated column names are not allowed + # y: character string of the data1 column name for y-axis (column containing numeric values). Numeric values will be split according to the classes of the column names indicated in the categ argument to generate the boxes and will also be used to plot the dots + # categ: vector of character strings of the data1 column name for categories (column of characters or factors). Must be either one or two column names. If a single column name (further referred to as categ1), then one box per class of categ1. If two column names (further referred to as categ1 and categ2), then one box per class of categ2, which form a group of boxes in each class of categ1. WARNING: no empty classes allowed. To have a single box, create a factor column with a single class and specify the name of this column in the categ argument (here, no categ2 in categ argument). For a single set of grouped boxes, create a factor column with a single class and specify this column in categ argument as first element (i.e., as categ1), in addition to the already used category (as categ2 in this situation) + # categ.class.order: list indicating the order of the classes of categ1 and categ2 represented on the boxplot (the first compartment for categ1 and and the second for categ2). If categ.class.order == NULL, classes are represented according to the alphabetical order. Some compartments can be NULL and others not. See the categ argument for categ1 and categ2 description + # categ.color: vector of color character string for box frames (see the categ argument for categ1 and categ2 description) + # If categ.color == NULL, default colors of ggplot2, whatever categ1 and categ2 + # If categ.color is non-null and only categ1 in categ argument, categ.color can be either: + # (1) a single color string. All the boxes will have this color, whatever the number of classes of categ1 + # (2) a vector of string colors, one for each class of categ1. Each color will be associated according to categ.class.order of categ1 + # (3) a vector or factor of string colors, like if it was one of the column of data1 data frame. WARNING: a single color per class of categ1 and a single class of categ1 per color must be respected + # Color functions, like grey(), hsv(), etc., are also accepted + # Positive integers are also accepted instead of character strings, as long as above rules about length are respected. Integers will be processed by fun_gg_palette() using the maximal integer value among all the integers in categ.color (see fun_gg_palette()) + # If categ.color is non-null and categ1 and categ2 are specified, all the rules described above will apply to categ2 instead of categ1 (colors will be determined for boxes inside a group of boxes) + # box.legend.name: character string of the legend title. If box.legend.name is NULL, then box.legend.name <- categ1 if only categ1 is present, and box.legend.name <- categ2 if categ1 and categ2 are present in the categ argument. Write "" if no legend required. See the categ argument for categ1 and categ2 description + # box.fill: logical. Fill the box? If TRUE, the categ.color argument will be used to generate filled boxplots (the box frames being black) as well as filled outlier dots (the dot border being controlled by the dot.border.color argument). If all the dots are plotted (argument dot.color other than NULL), they will be over the boxes. If FALSE, the categ.color argument will be used to color the box frames and the outlier dot borders. If all the dots are plotted, they will be beneath the boxes + # box.width: single numeric value (from 0 to 1) of width of either boxes or group of boxes + # When categ argument has a single categ1 element (i.e., separate boxes. See the categ argument for categ1 and categ2 description), then each class of categ1 is represented by a single box. In that case, box.width argument defines each box width, from 0 (no box width) to 1 (max box width), but also the space between boxes (the code uses 1 - box.width for the box spaces). Of note, xmin and xmax of the fun_gg_boxplot() output report the box boundaries (around x-axis unit 1, 2, 3, etc., for each box) + # When categ argument has a two categ1 and categ2 elements (i.e., grouped boxes), box.width argument defines the width allocated for each set of grouped boxes, from 0 (no group width) to 1 (max group width), but also the space between grouped boxes (the code uses 1 - box.width for the spaces). Of note, xmin and xmax of the fun_gg_boxplot() output report the box boundaries (around x-axis unit 1, 2, 3, etc., for each set of grouped box) + # box.space: single numeric value (from 0 to 1) indicating the box separation inside grouped boxes, when categ argument has a two categ1 and categ2 elements. 0 means no space and 1 means boxes shrunk to a vertical line. Ignored if categ argument has a single categ1 element + # box.line.size: single numeric value of line width of boxes and whiskers in mm + # box.notch: logical. Notched boxplot? It TRUE, display notched boxplot, notches corresponding approximately to the 95% confidence interval of the median (the notch interval is exactly 1.58 x Inter Quartile Range (IQR) / sqrt(n), with n the number of values that made the box). If notch intervals between two boxes do not overlap, it can be interpreted as significant median differences + # box.alpha: single numeric value (from 0 to 1) of box transparency (full transparent to full opaque, respectively). To remove boxplots, use box.alpha = 0 + # box.mean: logical. Add mean value? If TRUE, a diamond-shaped dot, with the horizontal diagonal corresponding to the mean value, is displayed over each boxplot + # box.whisker.kind: range of the whiskers. Either "no" (no whiskers), or "std" (length of each whisker equal to 1.5 x Inter Quartile Range (IQR)), or "max" (length of the whiskers up or down to the most distant dot) + # box.whisker.width: single numeric value (from 0 to 1) of the whisker width, with 0 meaning no whiskers and 1 meaning a width equal to the box width + # dot.color: vector of color character string ruling the dot colors and the dot display. See the example section below for easier understanding of the rules described here + # If NULL, no dots plotted + # If "same", the dots will have the same colors as the respective boxplots + # Otherwise, as in the rule (1), (2) or (3) described in the categ.color argument, except that in the possibility (3), the rule "a single color per class of categ and a single class of categ per color", does not have to be respected (for instance, each dot can have a different color). Colors will also depend on the dot.categ argument. If dot.categ is NULL, then colors will be applied to each class of the last column name specified in categ. If dot.categ is non-NULL, colors will be applied to each class of the column name specified in dot.categ. See examples + # dot.categ: optional single character string of a column name (further referred to as categ3) of the data1 argument. This column of data1 will be used to generate a legend for dots, in addition to the legend for boxes. See the dot.color argument for details about the way the legend is built using the two dot.categ and dot.color arguments. If NULL, no legend created and the colors of dots will depend on dot.color and categ arguments (as explained in the dot.color argument) + # dot.categ.class.order: optional vector of character strings indicating the order of the classes of categ3 (see the dot.categ argument). If dot.categ is non-NULL and dot.categ.class.order is NULL, classes are displayed in the legend according to the alphabetical order. Ignored if dot.categ is NULL + # dot.legend.name: optional character string of the legend title for categ3 (see the dot.categ argument). If dot.legend.name == NULL, dot.categ value is used (name of the column in data1). Write "" if no legend required. Ignored if dot.categ is NULL + # dot.tidy: logical. Nice dot spreading? If TRUE, use the geom_dotplot() function for a nice representation. WARNING: change the true quantitative coordinates of dots (i.e., y-axis values for vertical display) because of binning. Thus, the gain in aestheticism is associated with a loss in precision that can be very important. If FALSE, dots are randomly spread on the qualitative axis, using the dot.jitter argument (see below) keeping the true quantitative coordinates + # dot.tidy.bin.nb: positive integer indicating the number of bins (i.e., nb of separations) of the y.lim range. Each dot will then be put in one of the bin, with a diameter of the width of the bin. In other words, increase the number of bins to have smaller dots. Not considered if dot.tidy is FALSE + # dot.jitter: numeric value (from 0 to 1) of random dot horizontal dispersion (for vertical display), with 0 meaning no dispersion and 1 meaning dispersion in the corresponding box width interval. Not considered if dot.tidy is TRUE + # dot.seed: integer value that set the random seed. Using the same number will generate the same dot jittering. Write NULL to have different jittering each time the same instruction is run. Ignored if dot.tidy is TRUE + # dot.size: numeric value of dot diameter in mm. Not considered if dot.tidy is TRUE + # dot.alpha: numeric value (from 0 to 1) of dot transparency (full transparent to full opaque, respectively) + # dot.border.size: numeric value of border dot width in mm. Write zero for no dot border. If dot.tidy is TRUE, value 0 remove the border and other values leave the border without size control (geom_doplot() feature) + # dot.border.color: single character color string defining the color of the dot border (same color for all the dots, whatever their categories). If dot.border.color == NULL, the border color will be the same as the dot color. A single integer is also accepted instead of a character string, that will be processed by fun_gg_palette() + # x.lab: a character string or expression for x-axis legend. If NULL, character string of categ1 (see the categ argument for categ1 and categ2 description) + # x.angle: integer value of the text angle for the x-axis numbers, using the same rules as in ggplot2. Positive values for counterclockwise rotation: 0 for horizontal, 90 for vertical, 180 for upside down etc. Negative values for clockwise rotation: 0 for horizontal, -90 for vertical, -180 for upside down etc. + # y.lab: a character string or expression for y-axis legend. If NULL, character string of the y argument + # y.lim: 2 numeric values indicating the range of the y-axis. Order matters (for inverted axis). If NULL, the range of the x column name of data1 will be used. + # y.log: either "no", "log2" (values in the y argument column of the data1 data frame will be log2 transformed and y-axis will be log2 scaled) or "log10" (values in the y argument column of the data1 data frame will be log10 transformed and y-axis will be log10 scaled). WARNING: not possible to have horizontal boxes with a log axis, due to a bug in ggplot2 (see https://github.com/tidyverse/ggplot2/issues/881) + # y.tick.nb: approximate number of desired values labeling the y-axis (i.e., main ticks, see the n argument of the the cute::fun_scale() function). If NULL and if y.log is "no", then the number of labeling values is set by ggplot2. If NULL and if y.log is "log2" or "log10", then the number of labeling values corresponds to all the exposant integers in the y.lim range (e.g., 10^1, 10^2 and 10^3, meaning 3 main ticks for y.lim = c(9, 1200)). WARNING: if non-NULL and if y.log is "log2" or "log10", labeling can be difficult to read (e.g., ..., 10^2, 10^2.5, 10^3, ...) + # y.second.tick.nb: number of desired secondary ticks between main ticks. Ignored if y.log is other than "no" (log scale plotted). Use argument return = TRUE and see $plot$y.second.tick.values to have the values associated to secondary ticks. IF NULL, no secondary ticks + # y.include.zero: logical. Does y.lim range include 0? Ignored if y.log is "log2" or "log10" + # y.top.extra.margin: single proportion (between 0 and 1) indicating if extra margins must be added to y.lim. If different from 0, add the range of the axis multiplied by y.top.extra.margin (e.g., abs(y.lim[2] - y.lim[1]) * y.top.extra.margin) to the top of y-axis + # y.bottom.extra.margin: idem as y.top.extra.margin but to the bottom of y-axis + # stat.pos: add the median number above the corresponding box. Either NULL (no number shown), "top" (at the top of the plot region) or "above" (above each box) + # stat.mean: logical. Display mean numbers instead of median numbers? Ignored if stat.pos is NULL + # stat.size: numeric value of the stat font size in mm. Ignored if stat.pos is NULL + # stat.dist: numeric value of the stat distance in percentage of the y-axis range (stat.dist = 5 means move the number displayed at 5% of the y-axis range). Ignored if stat.pos is NULL or "top" + # stat.angle: integer value of the angle of stat, using the same rules as in ggplot2. Positive values for counterclockwise rotation: 0 for horizontal, 90 for vertical, 180 for upside down etc. Negative values for clockwise rotation: 0 for horizontal, -90 for vertical, -180 for upside down etc. + # vertical: logical. Vertical boxes? WARNING: will be automatically set to TRUE if y.log argument is other than "no". Indeed, not possible to have horizontal boxes with a log axis, due to a bug in ggplot2 (see https://github.com/tidyverse/ggplot2/issues/881) + # text.size: numeric value of the font size of the (1) axis numbers, (2) axis labels and (3) texts in the graphic legend (in mm) + # title: character string of the graph title + # title.text.size: numeric value of the title font size in mm + # legend.show: logical. Show legend? Not considered if categ argument is NULL, because this already generate no legend, excepted if legend.width argument is non-NULL. In that specific case (categ is NULL, legend.show is TRUE and legend.width is non-NULL), an empty legend space is created. This can be useful when desiring graphs of exactly the same width, whatever they have legends or not + # legend.width: single proportion (between 0 and 1) indicating the relative width of the legend sector (on the right of the plot) relative to the width of the plot. Value 1 means that the window device width is split in 2, half for the plot and half for the legend. Value 0 means no room for the legend, which will overlay the plot region. Write NULL to inactivate the legend sector. In such case, ggplot2 will manage the room required for the legend display, meaning that the width of the plotting region can vary between graphs, depending on the text in the legend + # article: logical. If TRUE, use an article theme (article like). If FALSE, use a classic related ggplot theme. Use the add argument (e.g., add = "+ggplot2::theme_classic()" for the exact classic ggplot theme + # grid: logical. Draw lines in the background to better read the box values? Not considered if article == FALSE (grid systematically present) + # add: character string allowing to add more ggplot2 features (dots, lines, themes, facet, etc.). Ignored if NULL + # WARNING: (1) the string must start with "+", (2) the string must finish with ")" and (3) each function must be preceded by "ggplot2::". Example: "+ ggplot2::coord_flip() + ggplot2::theme_bw()" + # If the character string contains the "ggplot2::theme" string, then the article argument of fun_gg_boxplot() (see above) is ignored with a warning + # Handle the add argument with caution since added functions can create conflicts with the preexisting internal ggplot2 functions + # WARNING: the call of objects inside the quotes of add can lead to an error if the name of these objects are some of the fun_gg_boxplot() arguments. Indeed, the function will use the internal argument instead of the global environment object. Example article <- "a" in the working environment and add = '+ ggplot2::ggtitle(article)'. The risk here is to have TRUE as title. To solve this, use add = '+ ggplot2::ggtitle(get("article", envir = .GlobalEnv))' + # return: logical. Return the graph parameters? + # return.ggplot: logical. Return the ggplot object in the output list? Ignored if return argument is FALSE. WARNING: always assign the fun_gg_boxplot() function (e.g., a <- fun_gg_boxplot()) if return.ggplot argument is TRUE, otherwise, double plotting is performed. See $ggplot in the RETURN section below for more details + # return.gtable: logical. Return the ggplot object as gtable of grobs in the output list? Ignored if plot argument is FALSE. Indeed, the graph must be plotted to get the grobs dispositions. See $gtable in the RETURN section below for more details + # plot: logical. Plot the graphic? If FALSE and return argument is TRUE, graphical parameters and associated warnings are provided without plotting + # warn.print: logical. Print warnings at the end of the execution? ? If FALSE, warning messages are never printed, but can still be recovered in the returned list. Some of the warning messages (those delivered by the internal ggplot2 functions) are not apparent when using the argument plot = FALSE + # lib.path: character string indicating the absolute path of the required packages (see below). if NULL, the function will use the R library default folders + # RETURN + # A boxplot if plot argument is TRUE + # A list of the graph info if return argument is TRUE: + # $data: the initial data with graphic information added + # $stat: the graphic statistics (mostly equivalent to ggplot_build()$data[[2]]) + # $removed.row.nb: which rows have been removed due to NA/Inf detection in y and categ columns (NULL if no row removed) + # $removed.rows: removed rows (NULL if no row removed) + # $plot: the graphic box and dot coordinates + # $dots: dot coordinates + # $main.box: coordinates of boxes + # $median: median coordinates + # $sup.whisker: coordinates of top whiskers (y for base and y.end for extremities) + # $inf.whisker: coordinates of bottom whiskers (y for base and y.end for extremities) + # $sup.whisker.edge: coordinates of top whisker edges (x and xend) + # $inf.whisker.edge: coordinates of bottom whisker edges(x and xend) + # $mean: diamond mean coordinates (only if box.mean argument is TRUE) + # $stat.pos: coordinates of stat numbers (only if stat.pos argument is not NULL) + # y.second.tick.positions: coordinates of secondary ticks (only if y.second.tick.nb argument is non-NULL or if y.log argument is different from "no") + # y.second.tick.values: values of secondary ticks. NULL except if y.second.tick.nb argument is non-NULL or if y.log argument is different from "no") + # $panel: the variable names used for the panels (NULL if no panels). WARNING: NA can be present according to ggplot2 upgrade to v3.3.0 + # $axes: the x-axis and y-axis info + # $warn: the warning messages. Use cat() for proper display. NULL if no warning. WARNING: warning messages delivered by the internal ggplot2 functions are not apparent when using the argument plot = FALSE + # $ggplot: ggplot object that can be used for reprint (use print(...$ggplot) or update (use ...$ggplot + ggplot2::...). NULL if return.ggplot argument is FALSE. Of note, a non-NULL $ggplot in the output list is sometimes annoying as the manipulation of this list prints the plot + # $gtable: gtable object that can be used for reprint (use gridExtra::grid.arrange(...$ggplot) or with additionnal grobs (see the grob decomposition in the examples). NULL if return.ggplot argument is FALSE. Contrary to $ggplot, a non-NULL $gtable in the output list is not annoying as the manipulation of this list does not print the plot + # REQUIRED PACKAGES + # ggplot2 + # gridExtra + # lemon (in case of use in the add argument) + # scales + # REQUIRED FUNCTIONS FROM THE cute PACKAGE + # fun_check() + # fun_comp_1d() + # fun_comp_2d() + # fun_gg_just() + # fun_gg_palette() + # fun_inter_ticks() + # fun_name_change() + # fun_pack() + # fun_round() + # fun_scale() + # EXAMPLE + # set.seed(1) ; obs1 <- data.frame(Time = c(rnorm(20, 100, 10), rnorm(20, 200, 50), rnorm(20, 500, 60), rnorm(20, 100, 50)), Categ1 = rep(c("CAT", "DOG"), times = 40), Categ2 = rep(c("A", "B", "C", "D"), each = 20), Color1 = rep(c("coral", "lightblue"), times = 40), Color2 = rep(c("#9F2108", "#306100", "#007479", "#8500C0"), each = 20), stringsAsFactors = TRUE) ; set.seed(NULL) ; fun_gg_boxplot(data1 = obs1, y = "Time", categ = "Categ1") + # see http + # DEBUGGING + # set.seed(1) ; obs1 <- data.frame(Time = c(rnorm(10), rnorm(10) + 2), Categ1 = rep(c("G", "H"), each = 10), stringsAsFactors = TRUE) ; set.seed(NULL) ; obs1$Time[1:10] <- NA ; data1 = obs1 ; y = "Time" ; categ = c("Categ1") ; categ.class.order = NULL ; categ.color = NULL ; box.legend.name = NULL ; box.fill = FALSE ; box.width = 0.5 ; box.space = 0.1 ; box.line.size = 0.75 ; box.notch = FALSE ; box.alpha = 1 ; box.mean = TRUE ; box.whisker.kind = "std" ; box.whisker.width = 0 ; dot.color = grey(0.25) ; dot.categ = NULL ; dot.categ.class.order = NULL ; dot.legend.name = NULL ; dot.tidy = FALSE ; dot.tidy.bin.nb = 50 ; dot.jitter = 0.5 ; dot.seed = 2 ; dot.size = 3 ; dot.alpha = 0.5 ; dot.border.size = 0.5 ; dot.border.color = NULL ; x.lab = NULL ; x.angle = 0 ; y.lab = NULL ; y.lim = NULL ; y.log = "no" ; y.tick.nb = NULL ; y.second.tick.nb = 1 ; y.include.zero = FALSE ; y.top.extra.margin = 0.05 ; y.bottom.extra.margin = 0.05 ; stat.pos = "top" ; stat.mean = FALSE ; stat.size = 4 ; stat.dist = 5 ; stat.angle = 0 ; vertical = TRUE ; text.size = 12 ; title = "" ; title.text.size = 8 ; legend.show = TRUE ; legend.width = 0.5 ; article = TRUE ; grid = FALSE ; add = NULL ; return = FALSE ; return.ggplot = FALSE ; return.gtable = TRUE ; plot = TRUE ; warn.print = FALSE ; lib.path = NULL + # function name + function.name <- paste0(as.list(match.call(expand.dots = FALSE))[[1]], "()") + arg.names <- names(formals(fun = sys.function(sys.parent(n = 2)))) # names of all the arguments + arg.user.setting <- as.list(match.call(expand.dots = FALSE))[-1] # list of the argument settings (excluding default values not provided by the user) + # end function name + # required function checking + req.function <- c( + "fun_comp_2d", + "fun_gg_just", + "fun_gg_palette", + "fun_name_change", + "fun_pack", + "fun_check", + "fun_round", + "fun_scale", + "fun_inter_ticks" + ) + tempo <- NULL + for(i1 in req.function){ + if(length(find(i1, mode = "function")) == 0L){ + tempo <- c(tempo, i1) + } + } + if( ! is.null(tempo)){ + tempo.cat <- paste0("ERROR IN ", function.name, "\nREQUIRED cute FUNCTION", ifelse(length(tempo) > 1, "S ARE", " IS"), " MISSING IN THE R ENVIRONMENT:\n", paste0(tempo, collapse = "()\n")) + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n"), call. = FALSE) # == in stop() to be able to add several messages between == + } + # end required function checking + # reserved words to avoid bugs (names of dataframe columns used in this function) + reserved.words <- c("categ.check", "categ.color", "dot.color", "dot.categ", "dot.max", "dot.min", "group", "PANEL", "group.check", "MEAN", "tempo.categ1", "tempo.categ2", "text.max.pos", "text.min.pos", "x", "x.y", "y", "y.check", "y_from.dot.max", "ymax", "tidy_group", "binwidth") + # end reserved words to avoid bugs (used in this function) + # arg with no default values + mandat.args <- c( + "data1", + "y", + "categ" + ) + tempo <- eval(parse(text = paste0("missing(", paste0(mandat.args, collapse = ") | missing("), ")"))) + if(any(tempo)){ # normally no NA for missing() output + tempo.cat <- paste0("ERROR IN ", function.name, "\nFOLLOWING ARGUMENT", ifelse(length(mandat.args) > 1, "S HAVE", "HAS"), " NO DEFAULT VALUE AND REQUIRE ONE:\n", paste0(mandat.args, collapse = "\n")) + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n"), call. = FALSE) # == in stop() to be able to add several messages between == + } + # end arg with no default values + # argument primary checking + arg.check <- NULL # + text.check <- NULL # + checked.arg.names <- NULL # for function debbuging: used by r_debugging_tools + ee <- expression(arg.check <- c(arg.check, tempo$problem) , text.check <- c(text.check, tempo$text) , checked.arg.names <- c(checked.arg.names, tempo$object.name)) + tempo <- fun_check(data = data1, class = "data.frame", na.contain = TRUE, fun.name = function.name) ; eval(ee) + tempo <- fun_check(data = y, class = "vector", mode = "character", length = 1, fun.name = function.name) ; eval(ee) + tempo <- fun_check(data = categ, class = "vector", mode = "character", fun.name = function.name) ; eval(ee) + if( ! is.null(categ.class.order)){ + tempo <- fun_check(data = categ.class.order, class = "list", fun.name = function.name) ; eval(ee) + }else{ + # no fun_check test here, it is just for checked.arg.names + tempo <- fun_check(data = categ.class.order, class = "vector") + checked.arg.names <- c(checked.arg.names, tempo$object.name) + } + if( ! is.null(box.legend.name)){ + tempo <- fun_check(data = box.legend.name, class = "vector", mode = "character", fun.name = function.name) ; eval(ee) + }else{ + # no fun_check test here, it is just for checked.arg.names + tempo <- fun_check(data = box.legend.name, class = "vector") + checked.arg.names <- c(checked.arg.names, tempo$object.name) + } + if( ! is.null(categ.color)){ + tempo1 <- fun_check(data = categ.color, class = "vector", mode = "character", na.contain = TRUE, fun.name = function.name) + tempo2 <- fun_check(data = categ.color, class = "factor", na.contain = TRUE, fun.name = function.name) + checked.arg.names <- c(checked.arg.names, tempo2$object.name) + if(tempo1$problem == TRUE & tempo2$problem == TRUE){ + tempo.check.color <- fun_check(data = categ.color, class = "integer", double.as.integer.allowed = TRUE, na.contain = TRUE, neg.values = FALSE, fun.name = function.name)$problem + if(tempo.check.color == TRUE){ + tempo.cat <- paste0("ERROR IN ", function.name, "\ncateg.color ARGUMENT MUST BE A FACTOR OR CHARACTER VECTOR OR POSITVE INTEGER VECTOR") # integer possible because dealt above + text.check <- c(text.check, tempo.cat) + arg.check <- c(arg.check, TRUE) + }else if(any(categ.color == 0L, na.rm = TRUE)){ + tempo.cat <- paste0("ERROR IN ", function.name, "\ncateg.color ARGUMENT MUST BE A FACTOR OR CHARACTER VECTOR OR POSITVE INTEGER VECTOR") # integer possible because dealt above + text.check <- c(text.check, tempo.cat) + arg.check <- c(arg.check, TRUE) + } + } + }else{ + # no fun_check test here, it is just for checked.arg.names + tempo <- fun_check(data = categ.color, class = "vector") + checked.arg.names <- c(checked.arg.names, tempo$object.name) + } + tempo <- fun_check(data = box.fill, class = "vector", mode = "logical", length = 1, fun.name = function.name) ; eval(ee) + tempo <- fun_check(data = box.width, prop = TRUE, length = 1, fun.name = function.name) ; eval(ee) + tempo <- fun_check(data = box.space, prop = TRUE, length = 1, fun.name = function.name) ; eval(ee) + tempo <- fun_check(data = box.line.size, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) + tempo <- fun_check(data = box.notch, class = "vector", mode = "logical", length = 1, fun.name = function.name) ; eval(ee) + tempo <- fun_check(data = box.alpha, prop = TRUE, length = 1, fun.name = function.name) ; eval(ee) + tempo <- fun_check(data = box.mean, class = "vector", mode = "logical", length = 1, fun.name = function.name) ; eval(ee) + tempo <- fun_check(data = box.whisker.kind, options = c("no", "std", "max"), length = 1, fun.name = function.name) ; eval(ee) + tempo <- fun_check(data = box.whisker.width, prop = TRUE, length = 1, fun.name = function.name) ; eval(ee) + if( ! is.null(dot.color)){ + tempo1 <- fun_check(data = dot.color, class = "vector", mode = "character", na.contain = TRUE, fun.name = function.name) + tempo2 <- fun_check(data = dot.color, class = "factor", na.contain = TRUE, fun.name = function.name) + checked.arg.names <- c(checked.arg.names, tempo2$object.name) + if(tempo1$problem == TRUE & tempo2$problem == TRUE){ + tempo.check.color <- fun_check(data = dot.color, class = "integer", double.as.integer.allowed = TRUE, na.contain = TRUE, neg.values = FALSE, fun.name = function.name)$problem + if(tempo.check.color == TRUE){ + tempo.cat <- paste0("ERROR IN ", function.name, "\ndot.color MUST BE A FACTOR OR CHARACTER VECTOR OR POSITVE INTEGER VECTOR") # integer possible because dealt above + text.check <- c(text.check, tempo.cat) + arg.check <- c(arg.check, TRUE) + }else if(any(dot.color == 0L, na.rm = TRUE)){ + tempo.cat <- paste0("ERROR IN ", function.name, "\ndot.color ARGUMENT MUST BE A FACTOR OR CHARACTER VECTOR OR POSITVE INTEGER VECTOR") # integer possible because dealt above + text.check <- c(text.check, tempo.cat) + arg.check <- c(arg.check, TRUE) + } + } + }else{ + # no fun_check test here, it is just for checked.arg.names + tempo <- fun_check(data = dot.color, class = "vector") + checked.arg.names <- c(checked.arg.names, tempo$object.name) + } + if( ! is.null(dot.categ)){ + tempo <- fun_check(data = dot.categ, class = "vector", mode = "character", length = 1, fun.name = function.name) ; eval(ee) + }else{ + # no fun_check test here, it is just for checked.arg.names + tempo <- fun_check(data = dot.categ, class = "vector") + checked.arg.names <- c(checked.arg.names, tempo$object.name) + } + if( ! is.null(dot.categ.class.order)){ + tempo <- fun_check(data = dot.categ.class.order, class = "vector", mode = "character", fun.name = function.name) ; eval(ee) + }else{ + # no fun_check test here, it is just for checked.arg.names + tempo <- fun_check(data = dot.categ.class.order, class = "vector") + checked.arg.names <- c(checked.arg.names, tempo$object.name) + } + if( ! is.null(dot.legend.name)){ + tempo <- fun_check(data = dot.legend.name, class = "vector", mode = "character", length = 1, fun.name = function.name) ; eval(ee) + }else{ + # no fun_check test here, it is just for checked.arg.names + tempo <- fun_check(data = dot.legend.name, class = "vector") + checked.arg.names <- c(checked.arg.names, tempo$object.name) + } + tempo <- fun_check(data = dot.tidy, class = "vector", mode = "logical", length = 1, fun.name = function.name) ; eval(ee) + tempo <- fun_check(data = dot.tidy.bin.nb, class = "vector", typeof = "integer", length = 1, double.as.integer.allowed = TRUE, neg.values = FALSE, fun.name = function.name) ; eval(ee) + if(tempo$problem == FALSE){ + if(dot.tidy.bin.nb == 0L){ # length and NA checked above + tempo.cat <- paste0("ERROR IN ", function.name, "\ndot.tidy.bin.nb ARGUMENT MUST BE A NON-NULL AND POSITVE INTEGER VALUE") # integer possible because dealt above + text.check <- c(text.check, tempo.cat) + arg.check <- c(arg.check, TRUE) + } + } + tempo <- fun_check(data = dot.jitter, prop = TRUE, length = 1, fun.name = function.name) ; eval(ee) + if( ! is.null(dot.seed)){ + tempo <- fun_check(data = dot.seed, class = "vector", typeof = "integer", length = 1, double.as.integer.allowed = TRUE, neg.values = TRUE, fun.name = function.name) ; eval(ee) + }else{ + # no fun_check test here, it is just for checked.arg.names + tempo <- fun_check(data = dot.seed, class = "vector") + checked.arg.names <- c(checked.arg.names, tempo$object.name) + } + tempo <- fun_check(data = dot.size, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) + tempo <- fun_check(data = dot.alpha, prop = TRUE, length = 1, fun.name = function.name) ; eval(ee) + tempo <- fun_check(data = dot.border.size, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) + if( ! is.null(dot.border.color)){ + tempo1 <- fun_check(data = dot.border.color, class = "vector", mode = "character", length = 1, fun.name = function.name) + tempo2 <- fun_check(data = dot.border.color, class = "vector", typeof = "integer", double.as.integer.allowed = TRUE, length = 1, fun.name = function.name) + checked.arg.names <- c(checked.arg.names, tempo2$object.name) + if(tempo1$problem == TRUE & tempo2$problem == TRUE){ + tempo.cat <- paste0("ERROR IN ", function.name, "\ndot.border.color ARGUMENT MUST BE (1) A HEXADECIMAL COLOR STRING STARTING BY #, OR (2) A COLOR NAME GIVEN BY colors(), OR (3) AN INTEGER VALUE") + text.check <- c(text.check, tempo.cat) + arg.check <- c(arg.check, TRUE) + }else if(tempo1$problem == FALSE & tempo2$problem == TRUE){ + if( ! all(dot.border.color %in% colors() | grepl(pattern = "^#", dot.border.color), na.rm = TRUE)){ + tempo.cat <- paste0("ERROR IN ", function.name, "\ndot.border.color ARGUMENT MUST BE (1) A HEXADECIMAL COLOR STRING STARTING BY #, OR (2) A COLOR NAME GIVEN BY colors(), OR (3) AN INTEGER VALUE") + text.check <- c(text.check, tempo.cat) + arg.check <- c(arg.check, TRUE) + } + } + }else{ + # no fun_check test here, it is just for checked.arg.names + tempo <- fun_check(data = dot.border.color, class = "vector") + checked.arg.names <- c(checked.arg.names, tempo$object.name) + } + if( ! is.null(x.lab)){ + tempo1 <- fun_check(data = x.lab, class = "expression", length = 1, fun.name = function.name) + tempo2 <- fun_check(data = x.lab, class = "vector", mode = "character", length = 1, fun.name = function.name) + checked.arg.names <- c(checked.arg.names, tempo2$object.name) + if(tempo1$problem == TRUE & tempo2$problem == TRUE){ + tempo.cat <- paste0("ERROR IN ", function.name, "\nx.lab ARGUMENT MUST BE A SINGLE CHARACTER STRING OR EXPRESSION") + text.check <- c(text.check, tempo.cat) + arg.check <- c(arg.check, TRUE) + } + }else{ + # no fun_check test here, it is just for checked.arg.names + tempo <- fun_check(data = x.lab, class = "vector") + checked.arg.names <- c(checked.arg.names, tempo$object.name) + } + tempo <- fun_check(data = x.angle, class = "vector", typeof = "integer", double.as.integer.allowed = TRUE, length = 1, neg.values = TRUE, fun.name = function.name) ; eval(ee) + if( ! is.null(y.lab)){ + tempo1 <- fun_check(data = y.lab, class = "expression", length = 1, fun.name = function.name) + tempo2 <- fun_check(data = y.lab, class = "vector", mode = "character", length = 1, fun.name = function.name) + checked.arg.names <- c(checked.arg.names, tempo2$object.name) + if(tempo1$problem == TRUE & tempo2$problem == TRUE){ + tempo.cat <- paste0("ERROR IN ", function.name, "\ny.lab ARGUMENT MUST BE A SINGLE CHARACTER STRING OR EXPRESSION") + text.check <- c(text.check, tempo.cat) + arg.check <- c(arg.check, TRUE) + } + }else{ + # no fun_check test here, it is just for checked.arg.names + tempo <- fun_check(data = y.lab, class = "vector") + checked.arg.names <- c(checked.arg.names, tempo$object.name) + } + if( ! is.null(y.lim)){ + tempo <- fun_check(data = y.lim, class = "vector", mode = "numeric", length = 2, fun.name = function.name) ; eval(ee) + if(tempo$problem == FALSE){ + if(any(is.infinite(y.lim))){ # normally no NA for is.infinite() output + tempo.cat <- paste0("ERROR IN ", function.name, "\ny.lim ARGUMENT CANNOT CONTAIN -Inf OR Inf VALUES") + text.check <- c(text.check, tempo.cat) + arg.check <- c(arg.check, TRUE) + } + } + }else{ + # no fun_check test here, it is just for checked.arg.names + tempo <- fun_check(data = y.lim, class = "vector") + checked.arg.names <- c(checked.arg.names, tempo$object.name) + } + tempo <- fun_check(data = y.log, options = c("no", "log2", "log10"), length = 1, fun.name = function.name) ; eval(ee) + if( ! is.null(y.tick.nb)){ + tempo <- fun_check(data = y.tick.nb, class = "vector", typeof = "integer", length = 1, double.as.integer.allowed = TRUE, fun.name = function.name) ; eval(ee) + if(tempo$problem == FALSE){ + if(y.tick.nb < 0){ + tempo.cat <- paste0("ERROR IN ", function.name, "\ny.tick.nb ARGUMENT MUST BE A NON NULL POSITIVE INTEGER") + text.check <- c(text.check, tempo.cat) + arg.check <- c(arg.check, TRUE) + } + } + }else{ + # no fun_check test here, it is just for checked.arg.names + tempo <- fun_check(data = y.tick.nb, class = "vector") + checked.arg.names <- c(checked.arg.names, tempo$object.name) + } + if( ! is.null(y.second.tick.nb)){ + tempo <- fun_check(data = y.second.tick.nb, class = "vector", typeof = "integer", length = 1, double.as.integer.allowed = TRUE, fun.name = function.name) ; eval(ee) + if(tempo$problem == FALSE){ + if(y.second.tick.nb <= 0){ + tempo.cat <- paste0("ERROR IN ", function.name, "\ny.second.tick.nb ARGUMENT MUST BE A NON NULL POSITIVE INTEGER") + text.check <- c(text.check, tempo.cat) + arg.check <- c(arg.check, TRUE) + } + } + }else{ + # no fun_check test here, it is just for checked.arg.names + tempo <- fun_check(data = y.second.tick.nb, class = "vector") + checked.arg.names <- c(checked.arg.names, tempo$object.name) + } + tempo <- fun_check(data = y.include.zero, class = "vector", mode = "logical", length = 1, fun.name = function.name) ; eval(ee) + tempo <- fun_check(data = y.top.extra.margin, prop = TRUE, length = 1, fun.name = function.name) ; eval(ee) + tempo <- fun_check(data = y.bottom.extra.margin, prop = TRUE, length = 1, fun.name = function.name) ; eval(ee) + if( ! is.null(stat.pos)){ + tempo <- fun_check(data = stat.pos, options = c("top", "above"), length = 1, fun.name = function.name) ; eval(ee) + }else{ + # no fun_check test here, it is just for checked.arg.names + tempo <- fun_check(data = stat.pos, class = "vector") + checked.arg.names <- c(checked.arg.names, tempo$object.name) + } + tempo <- fun_check(data = stat.mean, class = "logical", length = 1, fun.name = function.name) ; eval(ee) + tempo <- fun_check(data = stat.size, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) + tempo <- fun_check(data = stat.dist, class = "vector", mode = "numeric", length = 1, fun.name = function.name) ; eval(ee) + tempo <- fun_check(data = stat.angle, class = "vector", typeof = "integer", double.as.integer.allowed = TRUE, length = 1, neg.values = TRUE, fun.name = function.name) ; eval(ee) + tempo <- fun_check(data = vertical, class = "vector", mode = "logical", length = 1, fun.name = function.name) ; eval(ee) + tempo <- fun_check(data = text.size, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) + tempo <- fun_check(data = title, class = "vector", mode = "character", length = 1, fun.name = function.name) ; eval(ee) + tempo <- fun_check(data = title.text.size, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) + tempo <- fun_check(data = legend.show, class = "logical", length = 1, fun.name = function.name) ; eval(ee) + if( ! is.null(legend.width)){ + tempo <- fun_check(data = legend.width, prop = TRUE, length = 1, fun.name = function.name) ; eval(ee) + }else{ + # no fun_check test here, it is just for checked.arg.names + tempo <- fun_check(data = legend.width, class = "vector") + checked.arg.names <- c(checked.arg.names, tempo$object.name) + } + tempo <- fun_check(data = article, class = "logical", length = 1, fun.name = function.name) ; eval(ee) + tempo <- fun_check(data = grid, class = "logical", length = 1, fun.name = function.name) ; eval(ee) + if( ! is.null(add)){ + tempo <- fun_check(data = add, class = "vector", mode = "character", length = 1, fun.name = function.name) ; eval(ee) + }else{ + # no fun_check test here, it is just for checked.arg.names + tempo <- fun_check(data = add, class = "vector") + checked.arg.names <- c(checked.arg.names, tempo$object.name) + } + tempo <- fun_check(data = return, class = "logical", length = 1, fun.name = function.name) ; eval(ee) + tempo <- fun_check(data = return.ggplot, class = "logical", length = 1, fun.name = function.name) ; eval(ee) + tempo <- fun_check(data = return.gtable, class = "logical", length = 1, fun.name = function.name) ; eval(ee) + tempo <- fun_check(data = plot, class = "logical", length = 1, fun.name = function.name) ; eval(ee) + tempo <- fun_check(data = warn.print, class = "logical", length = 1, fun.name = function.name) ; eval(ee) + if( ! is.null(lib.path)){ + tempo <- fun_check(data = lib.path, class = "vector", mode = "character", fun.name = function.name) ; eval(ee) + if(tempo$problem == FALSE){ + if( ! all(dir.exists(lib.path), na.rm = TRUE)){ # separation to avoid the problem of tempo$problem == FALSE and lib.path == NA + tempo.cat <- paste0("ERROR IN ", function.name, "\nDIRECTORY PATH INDICATED IN THE lib.path ARGUMENT DOES NOT EXISTS:\n", paste(lib.path, collapse = "\n")) + text.check <- c(text.check, tempo.cat) + arg.check <- c(arg.check, TRUE) + } + } + }else{ + # no fun_check test here, it is just for checked.arg.names + tempo <- fun_check(data = lib.path, class = "vector") + checked.arg.names <- c(checked.arg.names, tempo$object.name) + } + if(any(arg.check) == TRUE){ # normally no NA + stop(paste0("\n\n================\n\n", paste(text.check[arg.check], collapse = "\n"), "\n\n================\n\n"), call. = FALSE) # == in stop() to be able to add several messages between == # + } + # source("C:/Users/Gael/Documents/Git_versions_to_use/debugging_tools_for_r_dev-v1.7/r_debugging_tools-v1.7.R") ; eval(parse(text = str_basic_arg_check_dev)) ; eval(parse(text = str_arg_check_with_fun_check_dev)) # activate this line and use the function (with no arguments left as NULL) to check arguments status and if they have been checked using fun_check() + # end argument primary checking + # second round of checking and data preparation + # management of NA arguments + tempo.arg <- names(arg.user.setting) # values provided by the user + tempo.log <- suppressWarnings(sapply(lapply(lapply(tempo.arg, FUN = get, env = sys.nframe(), inherit = FALSE), FUN = is.na), FUN = any)) & lapply(lapply(tempo.arg, FUN = get, env = sys.nframe(), inherit = FALSE), FUN = length) == 1L # no argument provided by the user can be just NA + if(any(tempo.log) == TRUE){ # normally no NA because is.na() used here + tempo.cat <- paste0("ERROR IN ", function.name, ":\n", ifelse(sum(tempo.log, na.rm = TRUE) > 1, "THESE ARGUMENTS\n", "THIS ARGUMENT\n"), paste0(tempo.arg[tempo.log], collapse = "\n"),"\nCANNOT JUST BE NA") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n"), call. = FALSE) # == in stop() to be able to add several messages between == + } + # end management of NA arguments + # management of NULL arguments + tempo.arg <-c( + "data1", + "y", + "categ", + "box.fill", + "box.width", + "box.space", + "box.line.size", + "box.notch", + "box.alpha", + "box.mean", + "box.whisker.kind", + "box.whisker.width", + # "dot.color", # inactivated because can be null + "dot.tidy", + "dot.tidy.bin.nb", + "dot.jitter", + # "dot.seed", # inactivated because can be null + "dot.size", + "dot.alpha", + "dot.border.size", + "x.angle", + "y.log", + # "y.second.tick.nb", # inactivated because can be null + "y.include.zero", + "y.top.extra.margin", + "y.bottom.extra.margin", + # "stat.pos", # inactivated because can be null + "stat.mean", + "stat.size", + "stat.dist", + "stat.angle", + "vertical", + "text.size", + "title", + "title.text.size", + "legend.show", + # "legend.width", # inactivated because can be null + "article", + "grid", + "return", + "return.ggplot", + "return.gtable", + "plot", + "warn.print" + ) + tempo.log <- sapply(lapply(tempo.arg, FUN = get, env = sys.nframe(), inherit = FALSE), FUN = is.null) + if(any(tempo.log) == TRUE){# normally no NA with is.null() + tempo.cat <- paste0("ERROR IN ", function.name, ":\n", ifelse(sum(tempo.log, na.rm = TRUE) > 1, "THESE ARGUMENTS\n", "THIS ARGUMENT\n"), paste0(tempo.arg[tempo.log], collapse = "\n"),"\nCANNOT BE NULL") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n"), call. = FALSE) # == in stop() to be able to add several messages between == + } + # end management of NULL arguments + # code that protects set.seed() in the global environment + # see also Protocol 100-rev0 Parallelization in R.docx + if(exists(".Random.seed", envir = .GlobalEnv)){ # if .Random.seed does not exists, it means that no random operation has been performed yet in any R environment + tempo.random.seed <- .Random.seed + on.exit(assign(".Random.seed", tempo.random.seed, env = .GlobalEnv)) + }else{ + on.exit(set.seed(NULL)) # inactivate seeding -> return to complete randomness + } + set.seed(dot.seed) + # end code that protects set.seed() in the global environment + # warning initiation + ini.warning.length <- options()$warning.length + options(warning.length = 8170) + warn <- NULL + warn.count <- 0 + # end warning initiation + # other checkings + if(any(duplicated(names(data1)), na.rm = TRUE)){ + tempo.cat <- paste0("ERROR IN ", function.name, "\nDUPLICATED COLUMN NAMES OF data1 ARGUMENT NOT ALLOWED:\n", paste(names(data1)[duplicated(names(data1))], collapse = " ")) + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == + } + if( ! (y %in% names(data1))){ + tempo.cat <- paste0("ERROR IN ", function.name, "\ny ARGUMENT MUST BE A COLUMN NAME OF data1") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == + }else{ + tempo <- fun_check(data = data1[, y], data.name = "y COLUMN OF data1", class = "vector", mode = "numeric", na.contain = TRUE, fun.name = function.name) + if(tempo$problem == TRUE){ + tempo.cat <- paste0("ERROR IN ", function.name, "\ny ARGUMENT MUST BE NUMERIC COLUMN IN data1") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == + } + } + if(length(categ) > 2){ + tempo.cat <- paste0("ERROR IN ", function.name, "\ncateg ARGUMENT CANNOT HAVE MORE THAN 2 COLUMN NAMES OF data1") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == + }else if( ! all(categ %in% names(data1))){ # all() without na.rm -> ok because categ cannot be NA (tested above) + tempo.cat <- paste0("ERROR IN ", function.name, "\ncateg ARGUMENT MUST BE COLUMN NAMES OF data1. HERE IT IS:\n", paste(categ, collapse = " ")) + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == + } + if(length(dot.categ) > 1){ + tempo.cat <- paste0("ERROR IN ", function.name, "\ndot.categ ARGUMENT CANNOT HAVE MORE THAN 1 COLUMN NAMES OF data1") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == + }else if( ! all(dot.categ %in% names(data1))){ # all() without na.rm -> ok because dot.categ cannot be NA (tested above) + tempo.cat <- paste0("ERROR IN ", function.name, "\ndot.categ ARGUMENT MUST BE COLUMN NAMES OF data1. HERE IT IS:\n", paste(dot.categ, collapse = " ")) + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == + } + # reserved word checking + if(any(names(data1) %in% reserved.words, na.rm = TRUE)){ + if(any(duplicated(names(data1)), na.rm = TRUE)){ + tempo.cat <- paste0("ERROR IN ", function.name, "\nDUPLICATED COLUMN NAMES OF data1 ARGUMENT NOT ALLOWED:\n", paste(names(data1)[duplicated(names(data1))], collapse = " ")) + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == + } + if( ! is.null(dot.categ)){ + if(dot.categ %in% categ){ + reserved.words <- c(reserved.words, paste0(dot.categ, "_DOT")) # paste0(dot.categ, "_DOT") is added to the reserved words because in such situation, a new column will be added to data1 that is named paste0(dot.categ, "_DOT") + } + } + tempo.output <- fun_name_change(names(data1), reserved.words) + for(i2 in 1:length(tempo.output$ini)){ # a loop to be sure to take the good ones + names(data1)[names(data1) == tempo.output$ini[i2]] <- tempo.output$post[i2] + if(any(y == tempo.output$ini[i2])){ # any() without na.rm -> ok because y cannot be NA (tested above) + y[y == tempo.output$ini[i2]] <- tempo.output$post[i2] + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") IN y ARGUMENT (COLUMN NAMES OF data1 ARGUMENT),\n", tempo.output$ini[i2], " HAS BEEN REPLACED BY ", tempo.output$post[i2], "\nBECAUSE RISK OF BUG AS SOME NAMES IN y ARGUMENT ARE RESERVED WORD USED BY THE ", function.name, " FUNCTION") + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + } + # WARNING: names of y argument potentially replaced + if(any(categ == tempo.output$ini[i2])){ # any() without na.rm -> ok because categ cannot be NA (tested above) + categ[categ == tempo.output$ini[i2]] <- tempo.output$post[i2] + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") IN categ ARGUMENT (COLUMN NAMES OF data1 ARGUMENT),\n", tempo.output$ini[i2], " HAS BEEN REPLACED BY ", tempo.output$post[i2], "\nBECAUSE RISK OF BUG AS SOME NAMES IN categ ARGUMENT ARE RESERVED WORD USED BY THE ", function.name, " FUNCTION") + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + } + # WARNING: names of categ argument potentially replaced + if( ! is.null(dot.categ)){ + if(any(dot.categ == tempo.output$ini[i2])){ # any() without na.rm -> ok because dot.categ cannot be NA (tested above) + dot.categ[dot.categ == tempo.output$ini[i2]] <- tempo.output$post[i2] + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") IN dot.categ ARGUMENT (COLUMN NAMES OF data1 ARGUMENT),\n", tempo.output$ini[i2], " HAS BEEN REPLACED BY ", tempo.output$post[i2], "\nBECAUSE RISK OF BUG AS SOME NAMES IN dot.categ ARGUMENT ARE RESERVED WORD USED BY THE ", function.name, " FUNCTION") + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + } + } + # WARNING: names of dot.categ argument potentially replaced + } + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") REGARDING COLUMN NAMES REPLACEMENT, THE NAMES\n", paste(tempo.output$ini, collapse = " "), "\nHAVE BEEN REPLACED BY\n", paste(tempo.output$post, collapse = " ")) + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + if( ! (is.null(add) | is.null(tempo.output$ini))){ + if(grepl(x = add, pattern = paste(tempo.output$ini, collapse = "|"))){ + tempo.cat <- paste0("ERROR IN ", function.name, "\nDETECTION OF COLUMN NAMES OF data1 IN THE add ARGUMENT STRING, THAT CORRESPOND TO RESERVED STRINGS FOR ", function.name, "\nCOLUMN NAMES HAVE TO BE CHANGED\nTHE PROBLEMATIC COLUMN NAMES ARE SOME OF THESE NAMES:\n", paste(tempo.output$ini, collapse = " "), "\nIN THE DATA FRAME OF data1 AND IN THE STRING OF add ARGUMENT, TRY TO REPLACE NAMES BY:\n", paste(tempo.output$post, collapse = " "), "\n\nFOR INFORMATION, THE RESERVED WORDS ARE:\n", paste(reserved.words, collapse = "\n")) + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == + } + } + } + if( ! (is.null(add))){ + if(any(sapply(X = arg.names, FUN = grepl, x = add), na.rm = TRUE)){ + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") NAMES OF ", function.name, " ARGUMENTS DETECTED IN THE add STRING:\n", paste(arg.names[sapply(X = arg.names, FUN = grepl, x = add)], collapse = "\n"), "\nRISK OF WRONG OBJECT USAGE INSIDE ", function.name) + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + } + } + # end reserved word checking + # verif of add + if( ! is.null(add)){ + if( ! grepl(pattern = "^\\s*\\+", add)){ # check that the add string start by + + tempo.cat <- paste0("ERROR IN ", function.name, "\nadd ARGUMENT MUST START WITH \"+\": ", paste(unique(add), collapse = " ")) + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == + }else if( ! grepl(pattern = "(ggplot2|lemon)\\s*::", add)){ # + tempo.cat <- paste0("ERROR IN ", function.name, "\nFOR EASIER FUNCTION DETECTION, add ARGUMENT MUST CONTAIN \"ggplot2::\" OR \"lemon::\" IN FRONT OF EACH GGPLOT2 FUNCTION: ", paste(unique(add), collapse = " ")) + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == + }else if( ! grepl(pattern = ")\\s*$", add)){ # check that the add string finished by ) + tempo.cat <- paste0("ERROR IN ", function.name, "\nadd ARGUMENT MUST FINISH BY \")\": ", paste(unique(add), collapse = " ")) + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == + } + } + # end verif of add + # management of add containing facet + facet.categ <- NULL + if( ! is.null(add)){ + facet.check <- TRUE + tempo <- unlist(strsplit(x = add, split = "\\s*\\+\\s*(ggplot2|lemon)\\s*::\\s*")) # + tempo <- sub(x = tempo, pattern = "^facet_wrap", replacement = "ggplot2::facet_wrap") + tempo <- sub(x = tempo, pattern = "^facet_grid", replacement = "ggplot2::facet_grid") + tempo <- sub(x = tempo, pattern = "^facet_rep", replacement = "lemon::facet_rep") + if(any(grepl(x = tempo, pattern = "ggplot2::facet_wrap|lemon::facet_rep_wrap"), na.rm = TRUE)){ + tempo1 <- suppressWarnings(eval(parse(text = tempo[grepl(x = tempo, pattern = "ggplot2::facet_wrap|lemon::facet_rep_wrap")]))) + facet.categ <- names(tempo1$params$facets) + tempo.text <- "facet_wrap OR facet_rep_wrap" + facet.check <- FALSE + }else if(grepl(x = add, pattern = "ggplot2::facet_grid|lemon::facet_rep_grid")){ + tempo1 <- suppressWarnings(eval(parse(text = tempo[grepl(x = tempo, pattern = "ggplot2::facet_grid|lemon::facet_rep_grid")]))) + facet.categ <- c(names(tempo1$params$rows), names(tempo1$params$cols)) + tempo.text <- "facet_grid OR facet_rep_grid" + facet.check <- FALSE + } + if(facet.check == FALSE & ! all(facet.categ %in% names(data1))){ # WARNING: all(facet.categ %in% names(data1)) is TRUE when facet.categ is NULL # all() without na.rm -> ok because facet.categ cannot be NA (tested above) + tempo.cat <- paste0("ERROR IN ", function.name, "\nDETECTION OF \"", tempo.text, "\" STRING IN THE add ARGUMENT BUT PROBLEM OF VARIABLE DETECTION (COLUMN NAMES OF data1)\nTHE DETECTED VARIABLES ARE:\n", paste(facet.categ, collapse = " "), "\nTHE data1 COLUMN NAMES ARE:\n", paste(names(data1), collapse = " "), "\nPLEASE REWRITE THE add STRING AND RERUN") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == + } + } + # end management of add containing facet + # conversion of categ columns in data1 into factors + for(i1 in 1:length(categ)){ + tempo1 <- fun_check(data = data1[, categ[i1]], data.name = paste0("categ NUMBER ", i1, " OF data1"), class = "vector", mode = "character", na.contain = TRUE, fun.name = function.name) + tempo2 <- fun_check(data = data1[, categ[i1]], data.name = paste0("categ NUMBER ", i1, " OF data1"), class = "factor", na.contain = TRUE, fun.name = function.name) + if(tempo1$problem == TRUE & tempo2$problem == TRUE){ + tempo.cat <- paste0("ERROR IN ", function.name, "\n", paste0("categ NUMBER ", i1, " OF data1"), " MUST BE A FACTOR OR CHARACTER VECTOR") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == + }else if(tempo1$problem == FALSE){ # character vector + if(box.alpha != 0){ + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") IN categ NUMBER ", i1, " IN data1, THE CHARACTER COLUMN HAS BEEN CONVERTED TO FACTOR, WITH LEVELS ACCORDING TO THE ALPHABETICAL ORDER") + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + } + } + data1[, categ[i1]] <- factor(data1[, categ[i1]]) # if already a factor, change nothing, if characters, levels according to alphabetical order + } + # OK: all the categ columns of data1 are factors from here + # end conversion of categ columns in data1 into factors + + + + # management of log scale and Inf removal + if(any(( ! is.finite(data1[, y])) & ( ! is.na(data1[, y])))){ # is.finite also detects NA: ( ! is.finite(data1[, y])) & ( ! is.na(data1[, y])) detects only Inf # normally no NA with is.finite0() and is.na() + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") PRESENCE OF -Inf OR Inf VALUES IN THE ", y, " COLUMN OF THE data1 ARGUMENT AND CORRESPONDING ROWS REMOVED (SEE $removed.row.nb AND $removed.rows)") + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + } + data1.ini <- data1 # strictly identical to data1 except that in data1 y is log converted if and only if y.log != "no" + if(y.log != "no"){ + tempo1 <- ! is.finite(data1[, y]) # where are initial NA and Inf + data1[, y] <- suppressWarnings(get(y.log)(data1[, y]))# no env = sys.nframe(), inherit = FALSE in get() because look for function in the classical scope + if(any( ! (tempo1 | is.finite(data1[, y])))){ # normally no NA with is.finite + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") LOG CONVERSION INTRODUCED -Inf OR Inf OR NaN VALUES IN THE ", y, " COLUMN OF THE data1 ARGUMENT AND CORRESPONDING ROWS REMOVED (SEE $removed.row.nb AND $removed.rows)") + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + } + } + # Inf removal + if(any(( ! is.finite(data1[, y])) & ( ! is.na(data1[, y])))){ # is.finite also detects NA: ( ! is.finite(data1[, y])) & ( ! is.na(data1[, y])) detects only Inf # normally no NA with is.finite + removed.row.nb <- which(( ! is.finite(data1[, y])) & ( ! is.na(data1[, y]))) + removed.rows <- data1.ini[removed.row.nb, ] # here data1.ini used to have the y = O rows that will be removed because of Inf creation after log transformation + data1 <- data1[-removed.row.nb, ] # + data1.ini <- data1.ini[-removed.row.nb, ] # + }else{ + removed.row.nb <- NULL + removed.rows <- data.frame(stringsAsFactors = FALSE) + } + # From here, data1 and data.ini have no more Inf + # end Inf removal + if(y.log != "no" & ! is.null(y.lim)){ + if(any(y.lim <= 0)){ # any() without na.rm -> ok because y.lim cannot be NA (tested above) + tempo.cat <- paste0("ERROR IN ", function.name, "\ny.lim ARGUMENT CANNOT HAVE ZERO OR NEGATIVE VALUES WITH THE y.log ARGUMENT SET TO ", y.log, ":\n", paste(y.lim, collapse = " ")) + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == + }else if(any( ! is.finite(if(y.log == "log10"){log10(y.lim)}else{log2(y.lim)}))){ # normally no NA with is.finite + tempo.cat <- paste0("ERROR IN ", function.name, "\ny.lim ARGUMENT RETURNS INF/NA WITH THE y.log ARGUMENT SET TO ", y.log, "\nAS SCALE COMPUTATION IS ", ifelse(y.log == "log10", "log10", "log2"), ":\n", paste(if(y.log == "log10"){log10(y.lim)}else{log2(y.lim)}, collapse = " ")) + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == + } + } + if(y.log != "no" & y.include.zero == TRUE){ + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") y.log ARGUMENT SET TO ", y.log, " AND y.include.zero ARGUMENT SET TO TRUE -> y.include.zero ARGUMENT RESET TO FALSE BECAUSE 0 VALUE CANNOT BE REPRESENTED IN LOG SCALE") + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + y.include.zero <- FALSE + } + if(y.log != "no" & vertical == FALSE){ + vertical <- TRUE + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") BECAUSE OF A BUG IN ggplot2, CANNOT FLIP BOXES HORIZONTALLY WITH A Y.LOG SCALE -> vertical ARGUMENT RESET TO TRUE") + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + } + # end management of log scale and Inf removal + # na detection and removal (done now to be sure of the correct length of categ) + column.check <- unique(c(y, categ, if( ! is.null(dot.color) & ! is.null(dot.categ)){dot.categ}, if( ! is.null(facet.categ)){facet.categ})) # dot.categ because can be a 3rd column of data1, categ.color and dot.color will be tested later + if(any(is.na(data1[, column.check]))){ # data1 used here instead of data1.ini in case of new NaN created by log conversion (neg values) # normally no NA with is.na + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") NA DETECTED IN COLUMNS OF data1 AND CORRESPONDING ROWS REMOVED (SEE $removed.row.nb AND $removed.rows)") + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + for(i2 in 1:length(column.check)){ + if(any(is.na(data1[, column.check[i2]]))){ # normally no NA with is.na + tempo.warn <- paste0("NA REMOVAL DUE TO COLUMN ", column.check[i2], " OF data1") + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n", tempo.warn))) + } + } + tempo <- unique(unlist(lapply(lapply(c(data1[column.check]), FUN = is.na), FUN = which))) + removed.row.nb <- c(removed.row.nb, tempo) # removed.row.nb created to remove Inf + removed.rows <- rbind(removed.rows, data1.ini[tempo, ], stringsAsFactors = FALSE) # here data1.ini used to have the non NA rows that will be removed because of NAN creation after log transformation (neg values for instance) + column.check <- column.check[ ! column.check == y] # remove y to keep quali columns + if(length(tempo) != 0){ + data1 <- data1[-tempo, ] # WARNING tempo here and not removed.row.nb because the latter contain more numbers thant the former + data1.ini <- data1.ini[-tempo, ] # WARNING tempo here and not removed.row.nb because the latter contain more numbers than the former + for(i3 in 1:length(column.check)){ + if(any( ! unique(removed.rows[, column.check[i3]]) %in% unique(data1[, column.check[i3]]), na.rm = TRUE)){ + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") IN COLUMN ", column.check[i3], " OF data1, THE FOLLOWING CLASSES HAVE DISAPPEARED AFTER NA/Inf REMOVAL (IF COLUMN USED IN THE PLOT, THIS CLASS WILL NOT BE DISPLAYED):\n", paste(unique(removed.rows[, column.check[i3]])[ ! unique(removed.rows[, column.check[i3]]) %in% unique(data1[, column.check[i3]])], collapse = " ")) + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + } + } + } + count.categ <- 0 + for(i2 in 1:length(column.check)){ + if(column.check[i2] %in% categ){ + count.categ <- count.categ + 1 + } + if(column.check[i2] == categ[count.categ]){ + categ.class.order[count.categ] <- list(levels(data1[, column.check[i2]])[levels(data1[, column.check[i2]]) %in% unique(data1[, column.check[i2]])]) # remove the absent color in the character vector + data1[, column.check[i2]] <- factor(as.character(data1[, column.check[i2]]), levels = unique(categ.class.order[[count.categ]])) + } + if( ! is.null(dot.color) & ! is.null(dot.categ)){ # reminder : dot.categ cannot be a column name of categ anymore (because in that case dot.categ name is changed into "..._DOT" + if(column.check[i2] == dot.categ){ + dot.categ.class.order <- levels(data1[, column.check[i2]])[levels(data1[, column.check[i2]]) %in% unique(data1[, column.check[i2]])] # remove the absent color in the character vector + data1[, column.check[i2]] <- factor(as.character(data1[, column.check[i2]]), levels = unique(dot.categ.class.order)) + } + } + if(column.check[i2] %in% facet.categ){ # works if facet.categ == NULL this method should keep the order of levels when removing some levels + tempo.levels <- levels(data1[, column.check[i2]])[levels(data1[, column.check[i2]]) %in% unique(as.character(data1[, column.check[i2]]))] + data1[, column.check[i2]] <- factor(as.character(data1[, column.check[i2]]), levels = tempo.levels) + } + } + } + # end na detection and removal (done now to be sure of the correct length of categ) + # From here, data1 and data.ini have no more NA or NaN in y, categ, dot.categ (if dot.color != NULL) and facet.categ + + + + if( ! is.null(categ.class.order)){ + if(length(categ.class.order) != length(categ)){ + tempo.cat <- paste0("ERROR IN ", function.name, "\ncateg.class.order ARGUMENT MUST BE A LIST OF LENGTH EQUAL TO LENGTH OF categ\nHERE IT IS LENGTH: ", length(categ.class.order), " VERSUS ", length(categ)) + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == + }else{ + for(i3 in 1:length(categ.class.order)){ + if(is.null(categ.class.order[[i3]])){ + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") THE categ.class.order COMPARTMENT ", i3, " IS NULL. ALPHABETICAL ORDER WILL BE APPLIED") + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + data1[, categ[i3]] <- factor(as.character(data1[, categ[i3]])) # if already a factor, change nothing, if characters, levels according to alphabetical order + categ.class.order[[i3]] <- levels(data1[, categ[i3]]) # character vector that will be used later + }else{ + tempo <- fun_check(data = categ.class.order[[i3]], data.name = paste0("COMPARTMENT ", i3 , " OF categ.class.order ARGUMENT"), class = "vector", mode = "character", length = length(levels(data1[, categ[i3]])), fun.name = function.name) # length(data1[, categ[i1]) -> if data1[, categ[i1] was initially character vector, then conversion as factor after the NA removal, thus class number ok. If data1[, categ[i1] was initially factor, no modification after the NA removal, thus class number ok + if(tempo$problem == TRUE){ + stop(paste0("\n\n================\n\n", tempo$text, "\n\n================\n\n"), call. = FALSE) # == in stop() to be able to add several messages between == + } + } + if(any(duplicated(categ.class.order[[i3]]), na.rm = TRUE)){ + tempo.cat <- paste0("ERROR IN ", function.name, "\nCOMPARTMENT ", i3, " OF categ.class.order ARGUMENT CANNOT HAVE DUPLICATED CLASSES: ", paste(categ.class.order[[i3]], collapse = " ")) + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == + }else if( ! (all(categ.class.order[[i3]] %in% unique(data1[, categ[i3]]), na.rm = TRUE) & all(unique(data1[, categ[i3]]) %in% categ.class.order[[i3]], na.rm = TRUE))){ + tempo.cat <- paste0("ERROR IN ", function.name, "\nCOMPARTMENT ", i3, " OF categ.class.order ARGUMENT MUST BE CLASSES OF ELEMENT ", i3, " OF categ ARGUMENT\nHERE IT IS:\n", paste(categ.class.order[[i3]], collapse = " "), "\nFOR COMPARTMENT ", i3, " OF categ.class.order AND IT IS:\n", paste(unique(data1[, categ[i3]]), collapse = " "), "\nFOR COLUMN ", categ[i3], " OF data1") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == + }else{ + data1[, categ[i3]] <- factor(data1[, categ[i3]], levels = categ.class.order[[i3]]) # reorder the factor + + } + names(categ.class.order)[i3] <- categ[i3] + } + } + }else{ + categ.class.order <- vector("list", length = length(categ)) + tempo.categ.class.order <- NULL + for(i2 in 1:length(categ.class.order)){ + categ.class.order[[i2]] <- levels(data1[, categ[i2]]) + names(categ.class.order)[i2] <- categ[i2] + tempo.categ.class.order <- c(tempo.categ.class.order, ifelse(i2 != 1, "\n", ""), categ.class.order[[i2]]) + } + if(box.alpha != 0){ + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") THE categ.class.order SETTING IS NULL. ALPHABETICAL ORDER WILL BE APPLIED FOR BOX ORDERING:\n", paste(tempo.categ.class.order, collapse = " ")) + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + } + } + # categ.class.order not NULL anymore (list) + if(is.null(box.legend.name) & box.alpha != 0){ + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") THE box.legend.name SETTING IS NULL. NAMES OF categ WILL BE USED: ", paste(categ, collapse = " ")) + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + box.legend.name <- categ[length(categ)] # if only categ1, then legend name of categ1, if length(categ) == 2L, then legend name of categ2 + } + # box.legend.name not NULL anymore (character string) + # management of categ.color + if( ! is.null(categ.color)){ + # check the nature of color + # integer colors into gg_palette + tempo.check.color <- fun_check(data = categ.color, class = "integer", double.as.integer.allowed = TRUE, na.contain = TRUE, fun.name = function.name)$problem + if(tempo.check.color == FALSE){ + # convert integers into colors + categ.color <- fun_gg_palette(max(categ.color, na.rm = TRUE))[categ.color] + } + # end integer colors into gg_palette + if( ! (all(categ.color %in% colors() | grepl(pattern = "^#", categ.color)))){ # check that all strings of low.color start by #, # all() without na.rm -> ok because categ.color cannot be NA (tested above) + tempo.cat <- paste0("ERROR IN ", function.name, "\ncateg.color ARGUMENT MUST BE A HEXADECIMAL COLOR VECTOR STARTING BY # AND/OR COLOR NAMES GIVEN BY colors(): ", paste(unique(categ.color), collapse = " ")) + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == + } + if(any(is.na(categ.color)) & box.alpha != 0){ # normally no NA with is.na + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") categ.color ARGUMENT CONTAINS NA") + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + } + # end check the nature of color + # check the length of color + categ.len <- length(categ) # if only categ1, then colors for classes of categ1, if length(categ) == 2L, then colors for classes of categ2 + if(length(data1[, categ[categ.len]]) == length(levels(data1[, categ[categ.len]])) & length(categ.color) == length(data1[, categ[categ.len]])){ + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") THE NUMBER OF CLASSES OF THE COLUMN ", categ[categ.len], " THE NUMBER OF ROWS OF THIS COLUMN AND THE NUMBER OF COLORS OF THE categ.color ARGUMENT ARE ALL EQUAL. BOX COLORS WILL BE ATTRIBUTED ACCORDING THE LEVELS OF ", categ[categ.len], ", NOT ACCORDING TO THE ROWS OF ", categ[categ.len]) + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + } + if(length(categ.color) == length(levels(data1[, categ[categ.len]]))){ # here length(categ.color) is equal to the different number of categ + # data1[, categ[categ.len]] <- factor(data1[, categ[categ.len]]) # not required because sure that is is a factor + data1 <- data.frame(data1, categ.color = data1[, categ[categ.len]], stringsAsFactors = TRUE) # no need stringsAsFactors here for stat.nolog as factors remain factors + data1$categ.color <- factor(data1$categ.color, labels = categ.color) # replace the characters of data1[, categ[categ.len]] put in the categ.color column by the categ.color (can be write like this because categ.color is length of levels of data1[, categ[categ.len]]) + if(box.alpha != 0){ + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") IN ", categ[categ.len], " OF categ ARGUMENT, THE FOLLOWING COLORS:\n", paste(categ.color, collapse = " "), "\nHAVE BEEN ATTRIBUTED TO THESE CLASSES:\n", paste(levels(factor(data1[, categ[categ.len]])), collapse = " ")) + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + } + }else if(length(categ.color) == length(data1[, categ[categ.len]])){# here length(categ.color) is equal to nrow(data1) -> Modif to have length(categ.color) equal to the different number of categ (length(categ.color) == length(levels(data1[, categ[categ.len]]))) + data1 <- data.frame(data1, categ.color = categ.color, stringsAsFactors = TRUE) + tempo.check <- unique(data1[ , c(categ[categ.len], "categ.color")]) + if( ! (nrow(tempo.check) == length(unique(categ.color)) & nrow(tempo.check) == length(unique(data1[ , categ[categ.len]])))){ + tempo.cat <- paste0("ERROR IN ", function.name, "\ncateg.color ARGUMENT HAS THE LENGTH OF data1 ROW NUMBER\nBUT IS INCORRECTLY ASSOCIATED TO EACH CLASS OF categ ", categ[categ.len], ":\n", paste(unique(mapply(FUN = "paste", data1[ ,categ[categ.len]], data1[ ,"categ.color"])), collapse = "\n")) + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == + }else{ + # data1[, categ[categ.len]] <- factor(data1[, categ[categ.len]]) # not required because sure that is is a factor + categ.color <- unique(data1$categ.color[order(data1[, categ[categ.len]])]) # Modif to have length(categ.color) equal to the different number of categ (length(categ.color) == length(levels(data1[, categ[categ.len]]))) + if(box.alpha != 0){ + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") categ.color ARGUMENT HAS THE LENGTH OF data1 ROW NUMBER\nCOLORS HAVE BEEN RESPECTIVELY ASSOCIATED TO EACH CLASS OF categ ", categ[categ.len], " AS:\n", paste(levels(factor(data1[, categ[categ.len]])), collapse = " "), "\n", paste(categ.color, collapse = " ")) + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + } + } + }else if(length(categ.color) == 1L){ + # data1[, categ[categ.len]] <- factor(data1[, categ[categ.len]]) # not required because sure that is is a factor + data1 <- data.frame(data1, categ.color = categ.color, stringsAsFactors = TRUE) + categ.color <- rep(categ.color, length(levels(data1[, categ[categ.len]]))) + if(box.alpha != 0){ + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") categ.color ARGUMENT HAS LENGTH 1, MEANING THAT ALL THE DIFFERENT CLASSES OF ", categ[categ.len], "\n", paste(levels(factor(data1[, categ[categ.len]])), collapse = " "), "\nWILL HAVE THE SAME COLOR\n", paste(categ.color, collapse = " ")) + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + } + }else{ + tempo.cat <- paste0("ERROR IN ", function.name, "\ncateg.color ARGUMENT MUST BE (1) LENGTH 1, OR (2) THE LENGTH OF data1 NROWS AFTER NA/Inf REMOVAL, OR (3) THE LENGTH OF THE CLASSES IN THE categ ", categ[categ.len], " COLUMN. HERE IT IS COLOR LENGTH ", length(categ.color), " VERSUS CATEG LENGTH ", length(data1[, categ[categ.len]]), " AND CATEG CLASS LENGTH ", length(unique(data1[, categ[categ.len]])), "\nPRESENCE OF NA/Inf COULD BE THE PROBLEM") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == + } + }else{ + categ.len <- length(categ) # if only categ1, then colors for classes of categ1, if length(categ) == 2L, then colors for classes of categ2 + # data1[, categ[categ.len]] <- factor(data1[, categ[categ.len]]) # not required because sure that is is a factor + categ.color <- fun_gg_palette(length(levels(data1[, categ[categ.len]]))) + data1 <- data.frame(data1, categ.color = data1[, categ[categ.len]], stringsAsFactors = TRUE) + data1$categ.color <- factor(data1$categ.color, labels = categ.color) # replace the characters of data1[, categ[categ.len]] put in the categ.color column by the categ.color (can be write like this because categ.color is length of levels of data1[, categ[categ.len]]) + if(box.alpha != 0){ + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") NULL categ.color ARGUMENT -> COLORS RESPECTIVELY ATTRIBUTED TO EACH CLASS OF ", categ[categ.len], " IN data1:\n", paste(categ.color, collapse = " "), "\n", paste(levels(data1[, categ[categ.len]]), collapse = " ")) + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + } + } + # categ.color not NULL anymore + categ.color <- as.character(categ.color) + # categ.color is a character string representing the diff classes + data1$categ.color <- factor(data1$categ.color, levels = unique(categ.color)) # ok because if categ.color is a character string, the order make class 1, class 2, etc. unique() because no duplicates allowed + # data1$categ.color is a factor with order of levels -> categ.color + # end management of categ.color + # management of dot.color + if( ! is.null(dot.color)){ + # optional legend of dot colors + if( ! is.null(dot.categ)){ + ini.dot.categ <- dot.categ + if( ! dot.categ %in% names(data1)){ # no need to use all() because length(dot.categ) = 1 + tempo.cat <- paste0("ERROR IN ", function.name, "\ndot.categ ARGUMENT MUST BE A COLUMN NAME OF data1. HERE IT IS:\n", dot.categ) + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == + }else if(dot.categ %in% categ){ # no need to use all() because length(dot.categ) = 1. Do not use dot.categ %in% categ[length(categ)] -> error + # management of dot legend if dot.categ %in% categ (because legends with the same name are joined in ggplot2) + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") THE COLUMN NAME OF data1 INDICATED IN THE dot.categ ARGUMENT (", dot.categ, ") HAS BEEN REPLACED BY ", paste0(dot.categ, "_DOT"), " TO AVOID MERGED LEGEND BY GGPLOT2") + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + data1 <- data.frame(data1, dot.categ = data1[, dot.categ], stringsAsFactors = TRUE) # dot.categ is not a column name of data1 (checked above with reserved words) + dot.categ <- paste0(dot.categ, "_DOT") + names(data1)[names(data1) == "dot.categ"] <- dot.categ # paste0(dot.categ, "_DOT") is not a column name of data1 (checked above with reserved words) + # tempo.cat <- paste0("ERROR IN ", function.name, "\ndot.categ ARGUMENT CANNOT BE A COLUMN NAME OF data1 ALREADY SPECIFIED IN THE categ ARGUMENT:\n", dot.categ, "\nINDEED, dot.categ ARGUMENT IS MADE TO HAVE MULTIPLE DOT COLORS NOT RELATED TO THE BOXPLOT CATEGORIES") + # stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n"), call. = FALSE) # == in stop() to be able to add several messages between == + } + tempo1 <- fun_check(data = data1[, dot.categ], data.name = paste0(dot.categ, " COLUMN OF data1"), class = "vector", mode = "character", na.contain = TRUE, fun.name = function.name) + tempo2 <- fun_check(data = data1[, dot.categ], data.name = paste0(dot.categ, " COLUMN OF data1"), class = "factor", na.contain = TRUE, fun.name = function.name) + if(tempo1$problem == TRUE & tempo2$problem == TRUE){ + tempo.cat <- paste0("ERROR IN ", function.name, "\ndot.categ COLUMN MUST BE A FACTOR OR CHARACTER VECTOR") # + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == + } + data1[, dot.categ] <- factor(data1[, dot.categ]) # if already a factor, change nothing, if characters, levels according to alphabetical order + # dot.categ column of data1 is factor from here + if( ! is.null(dot.categ.class.order)){ + if(any(duplicated(dot.categ.class.order), na.rm = TRUE)){ + tempo.cat <- paste0("ERROR IN ", function.name, "\ndot.categ.class.order ARGUMENT CANNOT HAVE DUPLICATED CLASSES: ", paste(dot.categ.class.order, collapse = " ")) + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == + }else if( ! (all(dot.categ.class.order %in% levels(data1[, dot.categ])) & all(levels(data1[, dot.categ]) %in% dot.categ.class.order, na.rm = TRUE))){ + tempo.cat <- paste0("ERROR IN ", function.name, "\ndot.categ.class.order ARGUMENT MUST BE CLASSES OF dot.categ ARGUMENT\nHERE IT IS:\n", paste(dot.categ.class.order, collapse = " "), "\nFOR dot.categ.class.order AND IT IS:\n", paste(levels(data1[, dot.categ]), collapse = " "), "\nFOR dot.categ COLUMN (", ini.dot.categ, ") OF data1") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == + }else{ + data1[, dot.categ] <- factor(data1[, dot.categ], levels = dot.categ.class.order) # reorder the factor + } + }else{ + if(all(dot.color == "same") & length(dot.color)== 1L){ # all() without na.rm -> ok because dot.color cannot be NA (tested above) + dot.categ.class.order <- unlist(categ.class.order[length(categ)]) + data1[, dot.categ] <- factor(data1[, dot.categ], levels = dot.categ.class.order) # reorder the factor + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") THE dot.categ.class.order SETTING IS NULL AND dot.color IS \"same\". ORDER OF categ.class.order WILL BE APPLIED FOR LEGEND DISPLAY: ", paste(dot.categ.class.order, collapse = " ")) + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + }else{ + dot.categ.class.order <- sort(levels(data1[, dot.categ])) + data1[, dot.categ] <- factor(data1[, dot.categ], levels = dot.categ.class.order) # reorder the factor + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") THE dot.categ.class.order SETTING IS NULL. ALPHABETICAL ORDER WILL BE APPLIED FOR LEGEND DISPLAY: ", paste(dot.categ.class.order, collapse = " ")) + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + } + } + # dot.categ.class.order not NULL anymore (character string) if dot.categ is not NULL + if(all(dot.color == "same") & length(dot.color)== 1L){ # all() without na.rm -> ok because dot.color cannot be NA (tested above) + if( ! identical(ini.dot.categ, categ[length(categ)])){ + tempo.cat <- paste0("ERROR IN ", function.name, "\nWHEN dot.color ARGUMENT IS \"same\", THE COLUMN NAME IN dot.categ ARGUMENT MUST BE IDENTICAL TO THE LAST COLUMN NAME IN categ ARGUMENT. HERE IT IS:\ndot.categ: ", paste(ini.dot.categ, collapse = " "), "\ncateg: ", paste(categ, collapse = " ")) + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == + }else if( ! fun_comp_1d(unlist(categ.class.order[length(categ)]), dot.categ.class.order)$identical.content){ + tempo.cat <- paste0("ERROR IN ", function.name, "\nWHEN dot.color ARGUMENT IS \"same\",\nLAST COMPARTMENT OF categ.class.order ARGUMENT AND dot.categ.class.order ARGUMENT CANNOT BE DIFFERENT:\nLAST COMPARTMENT OF categ.class.order: ", paste(unlist(categ.class.order[length(categ)]), collapse = " "), "\ndot.categ.class.order: ", paste(dot.categ.class.order, collapse = " ")) + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == + } + } + for(i3 in 1:length(categ)){ + if(identical(categ[i3], ini.dot.categ) & ! identical(unlist(categ.class.order[i3]), dot.categ.class.order) & identical(sort(unlist(categ.class.order[i3])), sort(dot.categ.class.order))){ + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") THE dot.categ ARGUMENT SETTING IS PRESENT IN THE categ ARGUMENT SETTING, BUT ORDER OF THE CLASSES IS NOT THE SAME:\ncateg.class.order: ", paste(unlist(categ.class.order[i3]), collapse = " "), "\ndot.categ.class.order: ", paste(dot.categ.class.order, collapse = " "), "\nNOTE THAT ORDER OF categ.class.order IS THE ONE USED FOR THE AXIS REPRESENTATION") + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + } + } + if(is.null(dot.legend.name)){ + dot.legend.name <- if(ini.dot.categ %in% categ[length(categ)]){dot.categ}else{ini.dot.categ} # + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") THE dot.legend.name SETTING IS NULL -> ", dot.legend.name, " WILL BE USED AS LEGEND TITLE OF DOTS") + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + } + # dot.legend.name not NULL anymore (character string) + }else{ + if( ! is.null(dot.categ.class.order)){ + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") THE dot.categ.class.order ARGUMENT IS NOT NULL, BUT IS THE dot.categ ARGUMENT\n-> dot.categ.class.order NOT CONSIDERED AS NO LEGEND WILL BE DRAWN") + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + } + # But dot.categ.class.order will be converted to NULL below (not now) + } + # end optional legend of dot colors + # check the nature of color + # integer colors into gg_palette + tempo.check.color <- fun_check(data = dot.color, class = "integer", double.as.integer.allowed = TRUE, na.contain = TRUE, fun.name = function.name)$problem + if(tempo.check.color == FALSE){ + # convert integers into colors + dot.color <- fun_gg_palette(max(dot.color, na.rm = TRUE))[dot.color] + } + # end integer colors into gg_palette + if(all(dot.color == "same") & length(dot.color)== 1L){# all() without na.rm -> ok because dot.color cannot be NA (tested above) + dot.color <- categ.color # same color of the dots as the corresponding box color + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") dot.color ARGUMENT HAS BEEN SET TO \"same\"\nTHUS, DOTS WILL HAVE THE SAME COLORS AS THE CORRESPONDING BOXPLOT") + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + }else if( ! (all(dot.color %in% colors() | grepl(pattern = "^#", dot.color)))){ # check that all strings of low.color start by #, # all() without na.rm -> ok because dot.color cannot be NA (tested above) + tempo.cat <- paste0("ERROR IN ", function.name, "\ndot.color ARGUMENT MUST BE (1) A HEXADECIMAL COLOR VECTOR STARTING BY #, OR (2) COLOR NAMES GIVEN BY colors(), OR (3) INTEGERS, OR THE STRING \"same\"\nHERE IT IS: ", paste(unique(dot.color), collapse = " ")) + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == + } + if(any(is.na(dot.color))){ # normally no NA with is.finite + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") dot.color ARGUMENT CONTAINS NA") + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + } + # end check the nature of color + # check the length of color + if( ! is.null(dot.categ)){ + # optional legend of dot colors + if(length(data1[, dot.categ]) == length(levels(data1[, dot.categ])) & length(dot.color) == length(data1[, dot.categ])){ + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") THE NUMBER OF CLASSES OF THE COLUMN ", dot.categ, " THE NUMBER OF ROWS OF THIS COLUMN AND THE NUMBER OF COLORS OF THE dot.color ARGUMENT ARE ALL EQUAL. DOT COLORS WILL BE ATTRIBUTED ACCORDING THE LEVELS OF ", dot.categ, ", NOT ACCORDING TO THE ROWS OF ", dot.categ) + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + } + if(length(dot.color) > 1 & ! (length(dot.color) == length(unique(data1[, dot.categ])) | length(dot.color) == length(data1[, dot.categ]))){ + tempo.cat <- paste0("ERROR IN ", function.name, "\nWHEN LENGTH OF THE dot.color ARGUMENT IS MORE THAN 1, IT MUST BE EQUAL TO THE NUMBER OF 1) ROWS OR 2) LEVELS OF dot.categ COLUMN (", dot.categ, "):\ndot.color: ", paste(dot.color, collapse = " "), "\ndot.categ LEVELS: ", paste(levels(data1[, dot.categ]), collapse = " ")) + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == + }else if(length(dot.color) > 1 & length(dot.color) == length(unique(data1[, dot.categ]))){ + data1 <- data.frame(data1, dot.color = data1[, dot.categ], stringsAsFactors = TRUE) + data1$dot.color <- factor(data1$dot.color, labels = dot.color) # do not use labels = unique(dot.color). Otherwise, we can have green1 green2 when dot.color is c("green", "green") + }else if(length(dot.color) > 1 & length(dot.color) == length(data1[, dot.categ])){ + data1 <- data.frame(data1, dot.color = dot.color, stringsAsFactors = TRUE) + }else if(length(dot.color)== 1L & length(dot.categ.class.order) > 1){ # to deal with single color + data1 <- data.frame(data1, dot.color = dot.color, stringsAsFactors = TRUE) + } + dot.color <- as.character(unique(data1$dot.color[order(data1[, dot.categ])])) # reorder the dot.color character vector + if(length(dot.color)== 1L & length(dot.categ.class.order) > 1){ # to deal with single color + dot.color <- rep(dot.color, length(dot.categ.class.order)) + } + tempo.check <- unique(data1[ , c(dot.categ, "dot.color")]) + if(length(unique(data1[ , "dot.color"])) > 1 & ( ! (nrow(tempo.check) == length(unique(data1[ , "dot.color"])) & nrow(tempo.check) == length(unique(data1[ , dot.categ]))))){ # length(unique(data1[ , "dot.color"])) > 1 because if only one color, can be attributed to each class of dot.categ + tempo.cat <- paste0("ERROR IN ", function.name, "\ndot.color ARGUMENT IS INCORRECTLY ASSOCIATED TO EACH CLASS OF dot.categ (", dot.categ, ") COLUMN:\n", paste(unique(mapply(FUN = "paste", data1[ , dot.categ], data1[ ,"dot.color"])), collapse = "\n")) + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == + }else{ + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") IN dot.categ ARGUMENT (", ini.dot.categ, "), THE FOLLOWING COLORS OF DOTS:\n", paste(dot.color, collapse = " "), "\nHAVE BEEN ATTRIBUTED TO THESE CLASSES:\n", paste(levels(data1[, dot.categ]), collapse = " ")) + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + } + # dot.color is a character string representing the diff classes of dot.categ + # data1$dot.color is a factor with order of levels -> dot.categ + # end optional legend of dot colors + }else{ + categ.len <- length(categ) # if only categ1, then colors for classes of categ1, if length(categ) == 2L, then colors for classes of categ2 + if(length(dot.color) == length(levels(data1[, categ[categ.len]]))){ # here length(dot.color) is equal to the different number of categ + # data1[, categ[categ.len]] <- factor(data1[, categ[categ.len]]) # not required because sure that is is a factor + data1 <- data.frame(data1, dot.color = data1[, categ[categ.len]], stringsAsFactors = TRUE) + data1$dot.color <- factor(data1$dot.color, labels = dot.color) + if(box.alpha != 0){ + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") IN ", categ[categ.len], " OF categ ARGUMENT, THE FOLLOWING COLORS:\n", paste(dot.color, collapse = " "), "\nHAVE BEEN ATTRIBUTED TO THESE CLASSES:\n", paste(levels(factor(data1[, categ[categ.len]])), collapse = " ")) + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + } + }else if(length(dot.color) == length(data1[, categ[categ.len]])){# here length(dot.color) is equal to nrow(data1) -> Modif to have length(dot.color) equal to the different number of categ (length(dot.color) == length(levels(data1[, categ[categ.len]]))) + data1 <- data.frame(data1, dot.color = dot.color, stringsAsFactors = TRUE) + }else if(length(dot.color)== 1L & ! all(dot.color == "same")){ # all() without na.rm -> ok because dot.color cannot be NA (tested above) + # data1[, categ[categ.len]] <- factor(data1[, categ[categ.len]]) # not required because sure that is is a factor + data1 <- data.frame(data1, dot.color = dot.color, stringsAsFactors = TRUE) + dot.color <- rep(dot.color, length(levels(data1[, categ[categ.len]]))) + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") dot.color ARGUMENT HAS LENGTH 1, MEANING THAT ALL THE DIFFERENT CLASSES OF ", categ[categ.len], "\n", paste(levels(factor(data1[, categ[categ.len]])), collapse = " "), "\nWILL HAVE THE SAME COLOR\n", paste(dot.color, collapse = " ")) + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + }else{ + tempo.cat <- paste0("ERROR IN ", function.name, "\ndot.color ARGUMENT MUST BE (1) LENGTH 1, OR (2) THE LENGTH OF data1 NROWS AFTER NA/Inf REMOVAL, OR (3) THE LENGTH OF THE CLASSES IN THE categ ", categ[categ.len], " COLUMN. HERE IT IS COLOR LENGTH ", length(dot.color), " VERSUS CATEG LENGTH ", length(data1[, categ[categ.len]]), " AND CATEG CLASS LENGTH ", length(unique(data1[, categ[categ.len]])), "\nPRESENCE OF NA/Inf COULD BE THE PROBLEM") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == + } + # end check the length of color + dot.color <- as.character(dot.color) + # dot.color is a character string representing the diff classes + data1$dot.color <- factor(data1$dot.color, levels = unique(dot.color)) # ok because if dot.color is a character string, the order make class 1, class 2, etc. If dot.color is a column of data1, then levels will be created, without incidence, except if dot.categ specified (see below). unique() because no duplicates allowed + # data1$dot.color is a factor with order of levels -> dot.color + } + # end optional legend of dot colors + }else if(is.null(dot.color) & ! (is.null(dot.categ) & is.null(dot.categ.class.order) & is.null(dot.legend.name))){ + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") dot.categ OR dot.categ.class.order OR dot.legend.name ARGUMENT HAS BEEN SPECIFIED BUT dot.color ARGUMENT IS NULL (NO DOT PLOTTED)") + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + } + # dot.color either NULL (no dot plotted) or character string (potentially representing the diff classes of dot.categ) + # data1$dot.color is either NA or a factor (with order of levels -> depending on dot.categ or categ[length(categ)], or other + if(is.null(dot.categ)){ + dot.categ.class.order <- NULL # because not used anyway + } + # dot.categ.class.order either NULL if dot.categ is NULL (no legend displayed) or character string (potentially representing the diff classes of dot.categ) + # end management of dot.color + if(is.null(dot.color) & box.fill == FALSE & dot.alpha <= 0.025){ + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") THE FOLLOWING ARGUMENTS WERE SET AS:\ndot.color = NULL (NOT ALL DOTS BUT ONLY POTENTIAL OUTLIER DOTS DISPLAYED)\nbox.fill = FALSE (NO FILLING COLOR FOR BOTH BOXES AND POTENTIAL OUTLIER DOTS)\ndot.alpha = ", fun_round(dot.alpha, 4), "\n-> POTENTIAL OUTLIER DOTS MIGHT NOT BE VISIBLE BECAUSE ALMOST TRANSPARENT") + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + } + if(is.null(dot.color) & box.fill == FALSE & dot.border.size == 0){ + tempo.cat <- paste0("ERROR IN ", function.name, "\nTHE FOLLOWING ARGUMENTS WERE SET AS:\ndot.color = NULL (NOT ALL DOTS BUT ONLY POTENTIAL OUTLIER DOTS DISPLAYED)\nbox.fill = FALSE (NO FILLING COLOR FOR BOTH BOXES AND POTENTIAL OUTLIER DOTS)\ndot.border.size = 0 (NO BORDER FOR POTENTIAL OUTLIER DOTS)\n-> THESE SETTINGS ARE NOT ALLOWED BECAUSE THE POTENTIAL OUTLIER DOTS WILL NOT BE VISIBLE") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == + } + # integer dot.border.color into gg_palette + if( ! is.null(dot.border.color)){ + tempo <- fun_check(data = dot.border.color, class = "vector", typeof = "integer", double.as.integer.allowed = TRUE, length = 1, fun.name = function.name) + if(tempo$problem == FALSE){ # convert integers into colors + dot.border.color <- fun_gg_palette(max(dot.border.color, na.rm = TRUE))[dot.border.color] + } + } + # end integer dot.border.color into gg_palette + # na detection and removal (done now to be sure of the correct length of categ) + column.check <- c("categ.color", if( ! is.null(dot.color)){"dot.color"}) # + if(any(is.na(data1[, column.check]))){ # data1 used here instead of data1.ini in case of new NaN created by log conversion (neg values) # normally no NA with is.na + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") NA DETECTED IN COLUMNS ", paste(column.check, collapse = " "), " OF data1 AND CORRESPONDING ROWS REMOVED (SEE $removed.row.nb AND $removed.rows)") + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + for(i2 in 1:length(column.check)){ + if(any(is.na(data1[, column.check[i2]]))){ # normally no NA with is.na + tempo.warn <- paste0("NA REMOVAL DUE TO COLUMN ", column.check[i2], " OF data1") + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n", tempo.warn))) + } + } + tempo <- unique(unlist(lapply(lapply(c(data1[column.check]), FUN = is.na), FUN = which))) + removed.row.nb <- c(removed.row.nb, tempo) + removed.rows <- rbind(removed.rows, data1[tempo, ], stringsAsFactors = FALSE) # here data1 used because categorical columns tested + if(length(tempo) != 0){ + data1 <- data1[-tempo, ] # WARNING tempo here and not removed.row.nb because the latter contain more numbers thant the former + data1.ini <- data1.ini[-tempo, ] # WARNING tempo here and not removed.row.nb because the latter contain more numbers thant the former + for(i3 in 1:length(column.check)){ + if(any( ! unique(removed.rows[, column.check[i3]]) %in% unique(data1[, column.check[i3]]), na.rm = TRUE)){ + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") IN COLUMN ", column.check[i3], " OF data1, THE FOLLOWING CLASSES HAVE DISAPPEARED AFTER NA/Inf REMOVAL (IF COLUMN USED IN THE PLOT, THIS CLASS WILL NOT BE DISPLAYED):\n", paste(unique(removed.rows[, column.check[i3]])[ ! unique(removed.rows[, column.check[i3]]) %in% unique(data1[, column.check[i3]])], collapse = " ")) + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + } + } + } + for(i2 in 1:length(column.check)){ + if(column.check[i2] == "categ.color"){ + categ.color <- levels(data1[, column.check[i2]])[levels(data1[, column.check[i2]]) %in% unique(data1[, column.check[i2]])] # remove the absent color in the character vector + if(length(categ.color)== 1L & length(unlist(categ.class.order[length(categ)])) > 1){ # to deal with single color + categ.color <- rep(categ.color, length(unlist(categ.class.order[length(categ)]))) + } + data1[, column.check[i2]] <- factor(as.character(data1[, column.check[i2]]), levels = unique(categ.color)) + } + if(column.check[i2] == "dot.color"){ + dot.color <- levels(data1[, column.check[i2]])[levels(data1[, column.check[i2]]) %in% unique(data1[, column.check[i2]])] # remove the absent color in the character vector + if(length(dot.color)== 1L & length(dot.categ.class.order) > 1){ # to deal with single color. If dot.categ.class.order == NULL (which is systematically the case if dot.categ == NULL), no rep(dot.color, length(dot.categ.class.order) + dot.color <- rep(dot.color, length(dot.categ.class.order)) + } + data1[, column.check[i2]] <- factor(as.character(data1[, column.check[i2]]), levels = unique(dot.color)) + } + } + } + # end na detection and removal (done now to be sure of the correct length of categ) + # From here, data1 and data.ini have no more NA or NaN + # end other checkings + # reserved word checking + #already done above + # end reserved word checking + # end second round of checking and data preparation + + + # package checking + fun_pack(req.package = c( + "ggplot2", + "gridExtra", + "lemon", + "scales" + ), lib.path = lib.path) + # end package checking + + + + + + # main code + # y coordinates recovery (create ini.box.coord, dot.coord and modify data1) + if(length(categ)== 1L){ + # width commputations + box.width2 <- box.width + box.space <- 0 # to inactivate the shrink that add space between grouped boxes, because no grouped boxes here + # end width commputations + # data1 check categ order for dots coordinates recovery + data1 <- data.frame(data1, categ.check = data1[, categ[1]], stringsAsFactors = TRUE) + data1$categ.check <- as.integer(data1$categ.check) # to check that data1[, categ[1]] and dot.coord$group are similar, during merging + # end data1 check categ order for dots coordinates recovery + # per box dots coordinates recovery + tempo.gg.name <- "gg.indiv.plot." + tempo.gg.count <- 0 + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), eval(parse(text = paste0("ggplot2::ggplot()", if(is.null(add)){""}else{add})))) # add added here to have the facets + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_point(data = data1, mapping = ggplot2::aes_string(x = categ[1], y = y, color = categ[1]), stroke = dot.border.size, size = dot.size, alpha = dot.alpha, shape = 21)) + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::scale_discrete_manual(aesthetics = "color", name = box.legend.name, values = if(is.null(categ.color)){rep(NA, length(unique(data1[, categ[1]])))}else if(length(categ.color)== 1L){rep(categ.color, length(unique(data1[, categ[1]])))}else{categ.color})) # categ.color used for dot colors because at that stage, we do not care about colors + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_boxplot(data = data1, mapping = ggplot2::aes_string(x = categ[1], y = y, fill = categ[1]), coef = if(box.whisker.kind == "no"){0}else if(box.whisker.kind == "std"){1.5}else if(box.whisker.kind == "max"){Inf})) # fill because this is what is used with geom_box # to easily have the equivalent of the grouped boxes + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::scale_discrete_manual(aesthetics = "fill", name = box.legend.name, values = if(length(categ.color)== 1L){rep(categ.color, length(unique(data1[, categ[1]])))}else{categ.color})) + # end per box dots coordinates recovery + }else if(length(categ) == 2L){ + # width commputations + box.width2 <- box.width / length(unique(data1[, categ[length(categ)]])) # real width of each box in x-axis unit, among the set of grouped box. Not relevant if no grouped boxes length(categ)== 1L + # end width commputations + # data1 check categ order for dots coordinates recovery + tempo.factor <- paste0(data1[order(data1[, categ[2]], data1[, categ[1]]), categ[2]], "_", data1[order(data1[, categ[2]], data1[, categ[1]]), categ[1]]) + data1 <- data.frame(data1[order(data1[, categ[2]], data1[, categ[1]]), ], categ.check = factor(tempo.factor, levels = unique(tempo.factor)), stringsAsFactors = TRUE) + data1$categ.check <- as.integer(data1$categ.check) + # end data1 check categ order for dots coordinates recovery + # per box dots coordinates recovery + tempo.gg.name <- "gg.indiv.plot." + tempo.gg.count <- 0 + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), eval(parse(text = paste0("ggplot2::ggplot()", if(is.null(add)){""}else{add})))) # add added here to have the facets + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_point(data = data1, mapping = ggplot2::aes_string(x = categ[1], y = y, color = categ[2]), stroke = dot.border.size, size = dot.size, alpha = dot.alpha, shape = 21)) + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::scale_discrete_manual(aesthetics = "color", name = box.legend.name, values = if(is.null(categ.color)){rep(NA, length(unique(data1[, categ[2]])))}else if(length(categ.color)== 1L){rep(categ.color, length(unique(data1[, categ[2]])))}else{categ.color})) # categ.color used for dot colors because at that stage, we do not care about colors + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_boxplot(data = data1, mapping = ggplot2::aes_string(x = categ[1], y = y, fill = categ[2]), coef = if(box.whisker.kind == "no"){0}else if(box.whisker.kind == "std"){1.5}else if(box.whisker.kind == "max"){Inf})) # fill because this is what is used with geom_box # to easily have the equivalent of the grouped boxes + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::scale_discrete_manual(aesthetics = "fill", name = box.legend.name, values = if(length(categ.color)== 1L){rep(categ.color, length(unique(data1[, categ[2]])))}else{categ.color})) + # end per box dots coordinates recovery + }else{ + tempo.cat <- paste0("INTERNAL CODE ERROR IN ", function.name, "\nCODE INCONSISTENCY 1") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == + } + if( ! is.null(stat.pos)){ + stat.just <- fun_gg_just( + angle = stat.angle, + pos = ifelse( + vertical == TRUE, + ifelse(stat.pos == "top", "bottom", "top"), # "bottom" because we want justification for text that are below the ref point which is the top of the graph. The opposite for "above" + ifelse(stat.pos == "top", "left", "right") # "left" because we want justification for text that are on the left of the ref point which is the right border of the graph. The opposite for "above" + ), + kind = "text" + ) + } + # has in fact no interest because ggplot2 does not create room for geom_text() + tempo.data.max <- data1[which.max(data1[, y]), ] + tempo.data.max <- data.frame(tempo.data.max, label = formatC(tempo.data.max[, y], digit = 2, drop0trailing = TRUE, format = "f"), stringsAsFactors = TRUE) + # end has in fact no interest because ggplot2 does not create room for geom_text() + tempo.graph.info.ini <- ggplot2::ggplot_build(eval(parse(text = paste(paste(paste0(tempo.gg.name, 1:tempo.gg.count), collapse = " + "), if( ! is.null(stat.pos)){' + ggplot2::geom_text(data = tempo.data.max, mapping = ggplot2::aes_string(x = 1, y = y, label = "label"), size = stat.size, color = "black", angle = stat.angle, hjust = stat.just$hjust, vjust = stat.just$vjust)'})))) # added here to have room for annotation + dot.coord <- tempo.graph.info.ini$data[[1]] + dot.coord$x <- as.numeric(dot.coord$x) # because weird class + dot.coord$PANEL <- as.numeric(dot.coord$PANEL) # because numbers as levels. But may be a problem is facet are reordered ? + tempo.mean <- aggregate(x = dot.coord$y, by = list(dot.coord$group, dot.coord$PANEL), FUN = mean, na.rm = TRUE) + names(tempo.mean)[names(tempo.mean) == "x"] <- "MEAN" + names(tempo.mean)[names(tempo.mean) == "Group.1"] <- "BOX" + names(tempo.mean)[names(tempo.mean) == "Group.2"] <- "PANEL" + dot.coord <- data.frame( + dot.coord[order(dot.coord$group, dot.coord$y), ], # dot.coord$PANEL deals below + y.check = as.double(data1[order(data1$categ.check, data1[, y]), y]), + categ.check = data1[order(data1$categ.check, data1[, y]), "categ.check"], + dot.color = if(is.null(dot.color)){NA}else{data1[order(data1$categ.check, data1[, y]), "dot.color"]}, + data1[order(data1$categ.check, data1[, y]), ][categ], # avoid the renaming below + stringsAsFactors = TRUE + ) # y.check to be sure that the order is the same between the y of data1 and the y of dot.coord + # names(dot.coord)[names(dot.coord) == "tempo.categ1"] <- categ[1] + if( ! is.null(dot.categ)){ + dot.coord <- data.frame(dot.coord, data1[order(data1$categ.check, data1[, y]), ][dot.categ], stringsAsFactors = TRUE) # avoid the renaming + } + if( ! is.null(facet.categ)){ + dot.coord <- data.frame(dot.coord, data1[order(data1$categ.check, data1[, y]), ][facet.categ], stringsAsFactors = TRUE) # for facet panels + tempo.test <- NULL + for(i2 in 1:length(facet.categ)){ + tempo.test <- paste0(tempo.test, ".", formatC(as.numeric(dot.coord[, facet.categ[i2]]), width = nchar(max(as.numeric(dot.coord[, facet.categ[i2]]), na.rm = TRUE)), flag = "0")) # convert factor into numeric with leading zero for proper ranking # merge the formatC() to create a new factor. The convertion to integer should recreate the correct group number. Here as.numeric is used and not as.integer in case of numeric in facet.categ (because comes from add and not checked by fun_check, contrary to categ) + } + tempo.test <- as.integer(factor(tempo.test)) + if( ! identical(as.integer(dot.coord$PANEL), tempo.test)){ + tempo.cat <- paste0("INTERNAL CODE ERROR IN ", function.name, "\nas.integer(dot.coord$PANEL) AND tempo.test MUST BE IDENTICAL. CODE HAS TO BE MODIFIED") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == + } + } + if(dot.tidy == TRUE){ + if( ! is.null(dot.categ)){ + dot.coord <- data.frame(dot.coord, tidy_group = data1[order(data1$categ.check, data1[, y]), ][, dot.categ], stringsAsFactors = TRUE) # avoid the renaming + # tidy_group_coord is to be able to fuse table when creating the table for dot coordinates + if(dot.categ %in% categ){ + dot.coord <- data.frame(dot.coord, tidy_group_coord = dot.coord$group, stringsAsFactors = TRUE) + }else{ + dot.coord <- data.frame(dot.coord, tidy_group_coord = as.integer(factor(paste0( + formatC(as.integer(dot.coord[, categ[1]]), width = nchar(max(as.integer(dot.coord[, categ[1]]), na.rm = TRUE)), flag = "0"), # convert factor into numeric with leading zero for proper ranking + ".", + if(length(categ) == 2L){formatC(as.integer(dot.coord[, categ[2]]), width = nchar(max(as.integer(dot.coord[, categ[2]]), na.rm = TRUE)), flag = "0")}, # convert factor into numeric with leading zero for proper ranking + if(length(categ) == 2L){"."}, + formatC(as.integer(dot.coord[, dot.categ]), width = nchar(max(as.integer(dot.coord[, dot.categ]), na.rm = TRUE)), flag = "0") # convert factor into numeric with leading zero for proper ranking + )), stringsAsFactors = TRUE) # merge the 2 or 3 formatC() to create a new factor. The convertion to integer should recreate the correct group number + ) # for tidy dot plots + } + }else{ + dot.coord <- data.frame(dot.coord, tidy_group = if(length(categ)== 1L){ + dot.coord[, categ]}else{as.integer(factor(paste0( + formatC(as.integer(dot.coord[, categ[1]]), width = nchar(max(as.integer(dot.coord[, categ[1]]), na.rm = TRUE)), flag = "0"), # convert factor into numeric with leading zero for proper ranking + ".", + formatC(as.integer(dot.coord[, categ[2]]), width = nchar(max(as.integer(dot.coord[, categ[2]]), na.rm = TRUE)), flag = "0")# convert factor into numeric with leading zero for proper ranking + )), stringsAsFactors = TRUE) # merge the 2 formatC() to create a new factor. The convertion to integer should recreate the correct group number + }) # for tidy dot plots + # tidy_group_coord is to be able to fuse table when creating the table for dot coordinates + dot.coord <- data.frame(dot.coord, tidy_group_coord = dot.coord$group, stringsAsFactors = TRUE) + } + } + if( ! (identical(dot.coord$y, dot.coord$y.check) & identical(dot.coord$group, dot.coord$categ.check))){ + tempo.cat <- paste0("INTERNAL CODE ERROR IN ", function.name, "\n(dot.coord$y AND dot.coord$y.check) AS WELL AS (dot.coord$group AND dot.coord$categ.check) MUST BE IDENTICAL. CODE HAS TO BE MODIFIED") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == + }else{ + if( ! identical(tempo.mean[order(tempo.mean$BOX, tempo.mean$PANEL), ]$BOX, unique(dot.coord[order(dot.coord$group, dot.coord$PANEL), c("group", "PANEL")])$group)){ + tempo.cat <- paste0("INTERNAL CODE ERROR IN ", function.name, "\n(tempo.mean$BOX, tempo.mean$PANEL) AND (dot.coord$group, dot.coord$PANEL) MUST BE IDENTICAL. CODE HAS TO BE MODIFIED") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == + }else{ + tempo <- unique(dot.coord[order(dot.coord$group, dot.coord$PANEL), c(categ, if( ! is.null(dot.color) & ! is.null(dot.categ)){if(dot.categ != ini.dot.categ){dot.categ}}, if( ! is.null(facet.categ)){facet.categ}), drop = FALSE]) + # names(tempo) <- paste0(names(tempo), ".mean") + tempo.mean <- data.frame(tempo.mean[order(tempo.mean$BOX, tempo.mean$PANEL), ], tempo, stringsAsFactors = TRUE) + } + } + # at that stage, categ color and dot color are correctly attributed in data1, box.coord and dot.coord + # end y dot coordinates recovery (create ini.box.coord, dot.coord and modify data1) + # ylim range + if(is.null(y.lim)){ + y.lim <- tempo.graph.info.ini$layout$panel_params[[1]]$y.range # finite = TRUE removes all the -Inf and Inf except if only this. In that case, whatever the -Inf and/or Inf present, output -Inf;Inf range. Idem with NA only + if(any(( ! is.finite(y.lim)) | is.na(y.lim)) | length(y.lim) != 2){ # kept but normally no more Inf in data1 # normally no NA with is.finite, etc. + tempo.cat <- paste0("INTERNAL CODE ERROR IN ", function.name, "\ntempo.graph.info.ini$layout$panel_params[[1]]$y.range[1] CONTAINS NA OR Inf OR HAS LENGTH 1") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == + } + }else if(y.log != "no"){ + y.lim <- get(y.log)(y.lim) # no env = sys.nframe(), inherit = FALSE in get() because look for function in the classical scope + } + if(y.log != "no"){ + # normally this control is not necessary anymore + if(any( ! is.finite(y.lim))){ # normally no NA with is.finite + tempo.cat <- paste0("ERROR IN ", function.name, "\ny.lim ARGUMENT CANNOT HAVE ZERO OR NEGATIVE VALUES WITH THE y.log ARGUMENT SET TO ", y.log, ":\n", paste(y.lim, collapse = " "), "\nPLEASE, CHECK DATA VALUES (PRESENCE OF ZERO OR INF VALUES)") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == + } + } + if(suppressWarnings(all(y.lim %in% c(Inf, -Inf)))){ # all() without na.rm -> ok because y.lim cannot be NA (tested above) + # normally this control is not necessary anymore + tempo.cat <- paste0("ERROR IN ", function.name, " y.lim CONTAINS Inf VALUES, MAYBE BECAUSE VALUES FROM data1 ARGUMENTS ARE NA OR Inf ONLY OR BECAUSE OF LOG SCALE REQUIREMENT") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == + } + if(suppressWarnings(any(is.na(y.lim)))){ # normally no NA with is.na + # normally this control is not necessary anymore + tempo.cat <- paste0("ERROR IN ", function.name, " y.lim CONTAINS NA OR NaN VALUES, MAYBE BECAUSE VALUES FROM data1 ARGUMENTS ARE NA OR Inf ONLY OR BECAUSE OF LOG SCALE REQUIREMENT") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == + } + y.lim.order <- order(y.lim) # to deal with inverse axis + y.lim <- sort(y.lim) + y.lim[1] <- y.lim[1] - abs(y.lim[2] - y.lim[1]) * ifelse(diff(y.lim.order) > 0, y.bottom.extra.margin, y.top.extra.margin) # diff(y.lim.order) > 0 medians not inversed axis + y.lim[2] <- y.lim[2] + abs(y.lim[2] - y.lim[1]) * ifelse(diff(y.lim.order) > 0, y.top.extra.margin, y.bottom.extra.margin) # diff(y.lim.order) > 0 medians not inversed axis + if(y.include.zero == TRUE){ # no need to check y.log != "no" because done before + y.lim <- range(c(y.lim, 0), na.rm = TRUE, finite = TRUE) # finite = TRUE removes all the -Inf and Inf except if only this. In that case, whatever the -Inf and/or Inf present, output -Inf;Inf range. Idem with NA only + } + y.lim <- y.lim[y.lim.order] + if(any(is.na(y.lim))){ # normally no NA with is.na + tempo.cat <- paste0("INTERNAL CODE ERROR IN ", function.name, "\nCODE INCONSISTENCY 2") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == + } + # end ylim range + + + + + + + # drawing + # constant part + tempo.gg.name <- "gg.indiv.plot." + tempo.gg.count <- 0 + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), eval(parse(text = paste0("ggplot2::ggplot()", if(is.null(add)){""}else{add})))) # add is directly put here to deal with additional variable of data, like when using facet_grid. No problem if add is a theme, will be dealt below + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::xlab(if(is.null(x.lab)){categ[1]}else{x.lab})) + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::ylab(if(is.null(y.lab)){y}else{y.lab})) + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::ggtitle(title)) + # text angle management + axis.just <- fun_gg_just(angle = x.angle, pos = ifelse(vertical == TRUE, "bottom", "left"), kind = "axis") + # end text angle management + add.check <- TRUE + if( ! is.null(add)){ # if add is NULL, then = 0 + if(grepl(pattern = "ggplot2\\s*::\\s*theme", add) == TRUE){ + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") \"ggplot2::theme\" STRING DETECTED IN THE add ARGUMENT\n-> INTERNAL GGPLOT2 THEME FUNCTIONS theme() AND theme_classic() HAVE BEEN INACTIVATED, TO BE USED BY THE USER\n-> article ARGUMENT WILL BE IGNORED") + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + add.check <- FALSE + } + } + if(add.check == TRUE & article == TRUE){ + # WARNING: not possible to add theme()several times. NO message but the last one overwrites the others + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::theme_classic(base_size = text.size)) + if(grid == TRUE){ + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), m.gg <- ggplot2::theme( + text = ggplot2::element_text(size = text.size), + plot.title = ggplot2::element_text(size = title.text.size), # stronger than text + line = ggplot2::element_line(size = 0.5), + legend.key = ggplot2::element_rect(color = "white", size = 1.5), # size of the frame of the legend + axis.line.y.left = ggplot2::element_line(colour = "black"), # draw lines for the y axis + axis.line.x.bottom = ggplot2::element_line(colour = "black"), # draw lines for the x axis + panel.grid.major.x = if(vertical == TRUE){NULL}else{ggplot2::element_line(colour = "grey85", size = 0.75)}, + panel.grid.major.y = if(vertical == TRUE){ggplot2::element_line(colour = "grey85", size = 0.75)}else{NULL}, + panel.grid.minor.y = if(vertical == TRUE){ggplot2::element_line(colour = "grey90", size = 0.25)}else{NULL}, + axis.text.x = if(vertical == TRUE){ggplot2::element_text(angle = axis.just$angle, hjust = axis.just$hjust, vjust = axis.just$vjust)}else{NULL}, + axis.text.y = if(vertical == TRUE){NULL}else{ggplot2::element_text(angle = axis.just$angle, hjust = axis.just$hjust, vjust = axis.just$vjust)}, + strip.background = ggplot2::element_rect(fill = NA, colour = NA) # for facet background + )) + }else{ + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), m.gg <- ggplot2::theme( + text = ggplot2::element_text(size = text.size), + plot.title = ggplot2::element_text(size = title.text.size), # stronger than text + line = ggplot2::element_line(size = 0.5), + legend.key = ggplot2::element_rect(color = "white", size = 1.5), # size of the frame of the legend + axis.line.y.left = ggplot2::element_line(colour = "black"), + axis.line.x.bottom = ggplot2::element_line(colour = "black"), + axis.text.x = if(vertical == TRUE){ggplot2::element_text(angle = axis.just$angle, hjust = axis.just$hjust, vjust = axis.just$vjust)}else{NULL}, + axis.text.y = if(vertical == TRUE){NULL}else{ggplot2::element_text(angle = axis.just$angle, hjust = axis.just$hjust, vjust = axis.just$vjust)}, + strip.background = ggplot2::element_rect(fill = NA, colour = NA) + )) + } + }else if(add.check == TRUE & article == FALSE){ + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), m.gg <- ggplot2::theme( + text = ggplot2::element_text(size = text.size), + plot.title = ggplot2::element_text(size = title.text.size), # stronger than text + line = ggplot2::element_line(size = 0.5), + legend.key = ggplot2::element_rect(color = "white", size = 1.5), # size of the frame of the legend + panel.background = ggplot2::element_rect(fill = "grey95"), + axis.line.y.left = ggplot2::element_line(colour = "black"), + axis.line.x.bottom = ggplot2::element_line(colour = "black"), + panel.grid.major.x = ggplot2::element_line(colour = "grey85", size = 0.75), + panel.grid.major.y = ggplot2::element_line(colour = "grey85", size = 0.75), + panel.grid.minor.x = ggplot2::element_blank(), + panel.grid.minor.y = ggplot2::element_line(colour = "grey90", size = 0.25), + strip.background = ggplot2::element_rect(fill = NA, colour = NA), + axis.text.x = if(vertical == TRUE){ggplot2::element_text(angle = axis.just$angle, hjust = axis.just$hjust, vjust = axis.just$vjust)}else{NULL}, + axis.text.y = if(vertical == TRUE){NULL}else{ggplot2::element_text(angle = axis.just$angle, hjust = axis.just$hjust, vjust = axis.just$vjust)} + )) + } + # Contrary to fun_gg_bar(), cannot plot the boxplot right now, because I need the dots plotted first + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_boxplot(data = data1, mapping = ggplot2::aes_string(x = categ[1], y = y, group = categ[length(categ)]), position = ggplot2::position_dodge(width = NULL), color = NA, width = box.width, fill = NA)) # this is to set the graph (i.e., a blanck boxplot to be able to use x coordinates to plot dots before boxes) + # end constant part + + + + + # graphic info recovery (including means) + tempo.graph.info <- ggplot2::ggplot_build(eval(parse(text = paste0(paste(paste0(tempo.gg.name, 1:tempo.gg.count), collapse = " + "), ' + ggplot2::geom_boxplot(data = data1, mapping = ggplot2::aes_string(x = categ[1], y = y, fill = categ[length(categ)]), position = ggplot2::position_dodge(width = NULL), width = box.width, notch = box.notch, coef = if(box.whisker.kind == "no"){0}else if(box.whisker.kind == "std"){1.5}else if(box.whisker.kind == "max"){Inf}) + ggplot2::scale_discrete_manual(aesthetics = "fill", name = box.legend.name, values = if(length(categ.color)== 1L){rep(categ.color, length(unique(data1[, categ[length(categ)]])))}else{categ.color})')))) # will be recovered later again, when ylim will be considered + tempo.yx.ratio <- (tempo.graph.info$layout$panel_params[[1]]$y.range[2] - tempo.graph.info$layout$panel_params[[1]]$y.range[1]) / (tempo.graph.info$layout$panel_params[[1]]$x.range[2] - tempo.graph.info$layout$panel_params[[1]]$x.range[1]) + box.coord <- tempo.graph.info$data[[2]] # to have the summary statistics of the plot. Contrary to ini.box.plot, now integrates ylim Here because can be required for stat.pos when just box are plotted + box.coord$x <- as.numeric(box.coord$x) # because x is of special class that block comparison of values using identical + box.coord$PANEL <- as.numeric(box.coord$PANEL) # because numbers as levels. But may be a problem is facet are reordered ? + box.coord <- box.coord[order(box.coord$group, box.coord$PANEL), ] + if( ! (identical(tempo.mean$BOX, box.coord$group) & identical(tempo.mean$PANEL, box.coord$PANEL))){ + tempo.cat <- paste0("INTERNAL CODE ERROR IN ", function.name, "\nidentical(tempo.mean$BOX, box.coord$group) & identical(tempo.mean$PANEL, box.coord$PANEL) DO NOT HAVE THE SAME VALUE ORDER") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == + }else{ + # tempo <- c(categ, if( ! is.null(dot.color) & ! is.null(dot.categ)){if(dot.categ != ini.dot.categ){dot.categ}}, if( ! is.null(facet.categ)){facet.categ}) + if(any(names(tempo.mean) %in% names(box.coord), na.rm = TRUE)){ + names(tempo.mean)[names(tempo.mean) %in% names(box.coord)] <- paste0(names(tempo.mean)[names(tempo.mean) %in% names(box.coord)], ".mean") + } + box.coord <- data.frame(box.coord, tempo.mean, stringsAsFactors = TRUE) + } + # end graphic info recovery (including means) + + + + # stat output (will also serve for boxplot and mean display) + # x not added know to do not have them in stat.nolog + stat <- data.frame( + MIN = box.coord$ymin_final, + QUART1 = box.coord$lower, + MEDIAN = box.coord$middle, + MEAN = box.coord$MEAN, + QUART3 = box.coord$upper, + MAX = box.coord$ymax_final, + WHISK_INF = box.coord$ymin, + BOX_INF = box.coord$lower, + NOTCH_INF = box.coord$notchlower, + NOTCH_SUP = box.coord$notchupper, + BOX_SUP = box.coord$upper, + WHISK_SUP = box.coord$ymax, + OUTLIERS = box.coord["outliers"], + tempo.mean[colnames(tempo.mean) != "MEAN"], + COLOR = box.coord$fill, + stringsAsFactors = TRUE + ) # box.coord["outliers"] written like this because it is a list. X coordinates not put now because several features to set + names(stat)[names(stat) == "outliers"] <- "OUTLIERS" + stat.nolog <- stat # stat.nolog ini will serve for outputs + if(y.log != "no"){ + stat.nolog[c("MIN", "QUART1", "MEDIAN", "MEAN", "QUART3", "MAX", "WHISK_INF", "BOX_INF", "NOTCH_INF", "NOTCH_SUP", "BOX_SUP", "WHISK_SUP")] <- ifelse(y.log == "log2", 2, 10)^(stat.nolog[c("MIN", "QUART1", "MEDIAN", "MEAN", "QUART3", "MAX", "WHISK_INF", "BOX_INF", "NOTCH_INF", "NOTCH_SUP", "BOX_SUP", "WHISK_SUP")]) + stat.nolog$OUTLIERS <- lapply(stat.nolog$OUTLIERS, FUN = function(X){ifelse(y.log == "log2", 2, 10)^X}) + } + # end stat output (will also serve for boxplot and mean display) + + + + + + + # x coordinates management (for random plotting and for stat display) + # width commputations + width.ini <- c(box.coord$xmax - box.coord$xmin)[1] # all the box widths are equal here. Only the first one taken + width.correct <- width.ini * box.space / 2 + if( ! (identical(stat$BOX, box.coord$group) & identical(stat$PANEL, box.coord$PANEL))){ + tempo.cat <- paste0("INTERNAL CODE ERROR IN ", function.name, "\nidentical(stat$BOX, box.coord$group) & identical(stat$PANEL, box.coord$PANEL) MUST BE IDENTICAL. CODE HAS TO BE MODIFIED") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == + }else{ + stat <- data.frame( + stat, + X = box.coord$x, + X_BOX_INF = box.coord$xmin + width.correct, + X_BOX_SUP = box.coord$xmax - width.correct, + X_NOTCH_INF = box.coord$x - (box.coord$x - (box.coord$xmin + width.correct)) / 2, + X_NOTCH_SUP = box.coord$x + (box.coord$x - (box.coord$xmin + width.correct)) / 2, + X_WHISK_INF = box.coord$x - (box.coord$x - (box.coord$xmin + width.correct)) * box.whisker.width, + X_WHISK_SUP = box.coord$x + (box.coord$x - (box.coord$xmin + width.correct)) * box.whisker.width, + # tempo.mean[colnames(tempo.mean) != "MEAN"], # already added above + stringsAsFactors = TRUE + ) + stat$COLOR <- factor(stat$COLOR, levels = unique(categ.color)) + if( ! all(stat$NOTCH_SUP < stat$BOX_SUP & stat$NOTCH_INF > stat$BOX_INF, na.rm = TRUE) & box.notch == TRUE){ + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") SOME NOTCHES ARE BEYOND BOX HINGES. TRY ARGUMENT box.notch = FALSE") + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + } + } + dot.jitter <- c((box.coord$xmax - width.correct) - (box.coord$xmin + width.correct))[1] * dot.jitter # real dot.jitter. (box.coord$xmin + width.correct) - (box.coord$xmax - width.correct))[1] is the width of the box. Is equivalent to (box.coord$x - (box.coord$xmin + width.correct))[1] * 2 + # end width commputations + if( ! is.null(dot.color)){ + # random dots + if(dot.tidy == FALSE){ + dot.coord.rd1 <- merge(dot.coord, box.coord[c("fill", "PANEL", "group", "x")], by = c("PANEL", "group"), sort = FALSE) # rd for random. Send the coord of the boxes into the coord data.frame of the dots (in the column x.y). WARNING: by = c("PANEL", "group") without fill column because PANEL & group columns are enough as only one value of x column per group number in box.coord. Thus, no need to consider fill column + if(nrow(dot.coord.rd1) != nrow(dot.coord)){ + tempo.cat <- paste0("INTERNAL CODE ERROR IN ", function.name, "\nTHE merge() FUNCTION DID NOT RETURN A CORRECT dot.coord.rd1 DATA FRAME. CODE HAS TO BE MODIFIED") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == + } + sampled.dot.jitter <- if(nrow(dot.coord.rd1)== 1L){runif(n = nrow(dot.coord.rd1), min = - dot.jitter / 2, max = dot.jitter / 2)}else{sample(x = runif(n = nrow(dot.coord.rd1), min = - dot.jitter / 2, max = dot.jitter / 2), size = nrow(dot.coord.rd1), replace = FALSE)} + dot.coord.rd2 <- data.frame(dot.coord.rd1, dot.x = dot.coord.rd1$x.y + sampled.dot.jitter, stringsAsFactors = TRUE) # set the dot.jitter thanks to runif and dot.jitter range. Then, send the coord of the boxes into the coord data.frame of the dots (in the column x.y) + if(length(categ)== 1L){ + tempo.data1 <- unique(data.frame(data1[categ[1]], group = as.integer(data1[, categ[1]]), stringsAsFactors = TRUE)) # categ[1] is factor + names(tempo.data1)[names(tempo.data1) == categ[1]] <- paste0(categ[1], ".check") + verif <- paste0(categ[1], ".check") + }else if(length(categ) == 2L){ + tempo.data1 <- unique( + data.frame( + data1[c(categ[1], categ[2])], + group = as.integer(factor(paste0( + formatC(as.integer(data1[, categ[2]]), width = nchar(max(as.integer(data1[, categ[2]]), na.rm = TRUE)), flag = "0"), # convert factor into numeric with leading zero for proper ranking + ".", + formatC(as.integer(data1[, categ[1]]), width = nchar(max(as.integer(data1[, categ[1]]), na.rm = TRUE)), flag = "0")# convert factor into numeric with leading zero for proper ranking + )), stringsAsFactors = TRUE) # merge the 2 formatC() to create a new factor. The convertion to integer should recreate the correct group number + ) + ) # categ[2] first if categ[2] is used to make the categories in ggplot and categ[1] is used to make the x-axis + names(tempo.data1)[names(tempo.data1) == categ[1]] <- paste0(categ[1], ".check") + names(tempo.data1)[names(tempo.data1) == categ[2]] <- paste0(categ[2], ".check") + verif <- c(paste0(categ[1], ".check"), paste0(categ[2], ".check")) + }else{ + tempo.cat <- paste0("INTERNAL CODE ERROR IN ", function.name, "\nCODE INCONSISTENCY 3") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == + } + dot.coord.rd3 <- merge(dot.coord.rd2, tempo.data1, by = intersect("group", "group"), sort = FALSE) # send the factors of data1 into coord. WARNING: I have replaced by = "group" by intersect("group", "group") because of an error due to wrong group group merging in dot.coord.rd3 + if(nrow(dot.coord.rd3) != nrow(dot.coord) | ( ! fun_comp_2d(dot.coord.rd3[categ], dot.coord.rd3[verif])$identical.content)){ + tempo.cat <- paste0("INTERNAL CODE ERROR IN ", function.name, "\nTHE merge() FUNCTION DID NOT RETURN A CORRECT dot.coord.rd3 DATA FRAME. CODE HAS TO BE MODIFIED") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == + } + # end random dots + } + # tidy dots + # coordinates are recovered during plotting (see dot.coord.tidy1 below) + # end tidy dots + } + # end x coordinates management (for random plotting and for stat display) + + + + + + # boxplot display before dot display if box.fill = TRUE + coord.names <- NULL + # creation of the data frame for (main box + legend) and data frame for means + if(box.notch == FALSE){ + for(i3 in 1:length(categ)){ + if(i3== 1L){ + tempo.polygon <- data.frame(GROUPX = c(t(stat[, rep(categ[i3], 5)])), stringsAsFactors = TRUE) + }else{ + tempo.polygon <- cbind(tempo.polygon, c(t(stat[, rep(categ[i3], 5)])), stringsAsFactors = TRUE) + } + } + names(tempo.polygon) <- categ + tempo.polygon <- data.frame(X = c(t(stat[, c("X_BOX_INF", "X_BOX_SUP", "X_BOX_SUP", "X_BOX_INF", "X_BOX_INF")])), Y = c(t(stat[, c("BOX_INF", "BOX_INF", "BOX_SUP", "BOX_SUP", "BOX_INF")])), COLOR = c(t(stat[, c("COLOR", "COLOR", "COLOR", "COLOR", "COLOR")])), BOX = as.character(c(t(stat[, c("BOX", "BOX", "BOX", "BOX", "BOX")]))), tempo.polygon, stringsAsFactors = TRUE) + if( ! is.null(facet.categ)){ + for(i4 in 1:length(facet.categ)){ + tempo.polygon <- data.frame(tempo.polygon, c(t(stat[, c(facet.categ[i4], facet.categ[i4], facet.categ[i4], facet.categ[i4], facet.categ[i4])])), stringsAsFactors = TRUE) + names(tempo.polygon)[length(names(tempo.polygon))] <- facet.categ[i4] + } + } + }else{ + for(i3 in 1:length(categ)){ + if(i3== 1L){ + tempo.polygon <- data.frame(GROUPX = c(t(stat[, rep(categ[i3], 11)])), stringsAsFactors = TRUE) + }else{ + tempo.polygon <- cbind(tempo.polygon, c(t(stat[, rep(categ[i3], 11)])), stringsAsFactors = TRUE) + } + } + names(tempo.polygon) <- categ + tempo.polygon <- data.frame(X = c(t(stat[, c("X_BOX_INF", "X_BOX_SUP", "X_BOX_SUP", "X_NOTCH_SUP", "X_BOX_SUP", "X_BOX_SUP", "X_BOX_INF", "X_BOX_INF", "X_NOTCH_INF", "X_BOX_INF", "X_BOX_INF")])), Y = c(t(stat[, c("BOX_INF", "BOX_INF", "NOTCH_INF", "MEDIAN", "NOTCH_SUP", "BOX_SUP", "BOX_SUP", "NOTCH_SUP", "MEDIAN", "NOTCH_INF", "BOX_INF")])), COLOR = c(t(stat[, c("COLOR", "COLOR", "COLOR", "COLOR", "COLOR", "COLOR", "COLOR", "COLOR", "COLOR", "COLOR", "COLOR")])), BOX = as.character(c(t(stat[, c("BOX", "BOX", "BOX", "BOX", "BOX", "BOX", "BOX", "BOX", "BOX", "BOX", "BOX")]))), tempo.polygon, stringsAsFactors = TRUE) + if( ! is.null(facet.categ)){ + for(i4 in 1:length(facet.categ)){ + tempo.polygon <- data.frame(tempo.polygon, c(t(stat[, c(facet.categ[i4], facet.categ[i4], facet.categ[i4], facet.categ[i4], facet.categ[i4], facet.categ[i4], facet.categ[i4], facet.categ[i4], facet.categ[i4], facet.categ[i4], facet.categ[i4])])), stringsAsFactors = TRUE) + names(tempo.polygon)[length(names(tempo.polygon))] <- facet.categ[i4] + } + } + } + tempo.polygon$COLOR <- factor(tempo.polygon$COLOR, levels = unique(categ.color)) + if( ! is.null(categ.class.order)){ + for(i3 in 1:length(categ)){ + tempo.polygon[, categ[i3]] <- factor(tempo.polygon[, categ[i3]], levels = categ.class.order[[i3]]) + } + } + # modified name of dot.categ column (e.g., "Categ1_DOT") must be included for boxplot using ridy dots + if( ! is.null(dot.color) & ! is.null(dot.categ)){ + if(dot.categ != ini.dot.categ){ + tempo.polygon <- data.frame(tempo.polygon, GROUPX = tempo.polygon[, ini.dot.categ], stringsAsFactors = TRUE) + names(tempo.polygon)[names(tempo.polygon) == "GROUPX"] <- dot.categ + + } + } + tempo.diamon.mean <- data.frame(X = c(t(stat[, c("X", "X_NOTCH_INF", "X", "X_NOTCH_SUP", "X")])), Y = c(t(cbind(stat["MEAN"] - (stat[, "X"] - stat[, "X_NOTCH_INF"]) * tempo.yx.ratio, stat["MEAN"], stat["MEAN"] + (stat[, "X"] - stat[, "X_NOTCH_INF"]) * tempo.yx.ratio, stat["MEAN"], stat["MEAN"] - (stat[, "X"] - stat[, "X_NOTCH_INF"]) * tempo.yx.ratio, stringsAsFactors = TRUE))), COLOR = c(t(stat[, c("COLOR", "COLOR", "COLOR", "COLOR", "COLOR")])), GROUP = c(t(stat[, c("BOX", "BOX", "BOX", "BOX", "BOX")])), stringsAsFactors = TRUE) # stringsAsFactors = TRUE for cbind() because stat["MEAN"] is a data frame. Otherwise, stringsAsFactors is not an argument for cbind() on vectors + if( ! is.null(facet.categ)){ + for(i3 in 1:length(facet.categ)){ + tempo.diamon.mean <- data.frame(tempo.diamon.mean, c(t(stat[, c(facet.categ[i3], facet.categ[i3], facet.categ[i3], facet.categ[i3], facet.categ[i3])])), stringsAsFactors = TRUE) + names(tempo.diamon.mean)[length(names(tempo.diamon.mean))] <- facet.categ[i3] + } + } + tempo.diamon.mean$COLOR <- factor(tempo.diamon.mean$COLOR, levels = unique(categ.color)) + # end creation of the data frame for (main box + legend) and data frame for means + if(box.fill == TRUE){ + # assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_boxplot(data = data1, mapping = ggplot2::aes_string(x = categ[1], y = y, color = categ[length(categ)], fill = categ[length(categ)]), position = ggplot2::position_dodge(width = NULL), width = box.width, size = box.line.size, notch = box.notch, coef = if(box.whisker.kind == "no"){0}else if(box.whisker.kind == "std"){1.5}else if(box.whisker.kind == "max"){Inf}, alpha = box.alpha, outlier.shape = if( ! is.null(dot.color)){NA}else{21}, outlier.color = if( ! is.null(dot.color)){NA}else{dot.border.color}, outlier.fill = if( ! is.null(dot.color)){NA}else{NULL}, outlier.size = if( ! is.null(dot.color)){NA}else{dot.size}, outlier.stroke = if( ! is.null(dot.color)){NA}else{dot.border.size}, outlier.alpha = if( ! is.null(dot.color)){NA}else{dot.alpha})) # the color, size, etc. of the outliers are dealt here. outlier.color = NA to do not plot outliers when dots are already plotted. Finally, boxplot redrawn (see below) + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_polygon( + data = tempo.polygon, + mapping = ggplot2::aes_string(x = "X", y = "Y", group = "BOX", fill = categ[length(categ)], color = categ[length(categ)]), + size = box.line.size, + alpha = box.alpha # works only for fill, not for color + )) + coord.names <- c(coord.names, "main.box") + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_segment(data = stat, mapping = ggplot2::aes(x = X, xend = X, y = BOX_SUP, yend = WHISK_SUP, group = categ[length(categ)]), color = "black", size = box.line.size, alpha = box.alpha)) # + coord.names <- c(coord.names, "sup.whisker") + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_segment(data = stat, mapping = ggplot2::aes(x = X, xend = X, y = BOX_INF, yend = WHISK_INF, group = categ[length(categ)]), color = "black", size = box.line.size, alpha = box.alpha)) # + coord.names <- c(coord.names, "inf.whisker") + if(box.whisker.width > 0){ + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_segment(data = stat, mapping = ggplot2::aes(x = X_WHISK_INF, xend = X_WHISK_SUP, y = WHISK_SUP, yend = WHISK_SUP, group = categ[length(categ)]), color = "black", size = box.line.size, alpha = box.alpha, lineend = "round")) # + coord.names <- c(coord.names, "sup.whisker.edge") + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_segment(data = stat, mapping = ggplot2::aes(x = X_WHISK_INF, xend = X_WHISK_SUP, y = WHISK_INF, yend = WHISK_INF, group = categ[length(categ)]), color = "black", size = box.line.size, alpha = box.alpha, lineend = "round")) # + coord.names <- c(coord.names, "inf.whisker.edge") + } + if(box.mean == TRUE){ + # assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_point(data = stat, mapping = ggplot2::aes_string(x = "X", y = "MEAN", group = categ[length(categ)]), shape = 23, stroke = box.line.size * 2, fill = stat$COLOR, size = box.mean.size, color = "black", alpha = box.alpha)) # group used in aesthetic to do not have it in the legend + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_polygon( + data = tempo.diamon.mean, + mapping = ggplot2::aes(x = X, y = Y, group = GROUP), + fill = tempo.diamon.mean[, "COLOR"], + color = hsv(0, 0, 0, alpha = box.alpha), # outline of the polygon in black but with alpha + size = box.line.size, + alpha = box.alpha + )) + coord.names <- c(coord.names, "mean") + } + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_segment(data = stat, mapping = ggplot2::aes(x = if(box.notch == FALSE){X_BOX_INF}else{X_NOTCH_INF}, xend = if(box.notch == FALSE){X_BOX_SUP}else{X_NOTCH_SUP}, y = MEDIAN, yend = MEDIAN, group = categ[length(categ)]), color = "black", size = box.line.size * 2, alpha = box.alpha)) # + coord.names <- c(coord.names, "median") + } + # end boxplot display before dot display if box.fill = TRUE + + + + + + + # dot display + if( ! is.null(dot.color)){ + if(dot.tidy == FALSE){ + if(is.null(dot.categ)){ + if(dot.border.size == 0){ + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_point( + data = dot.coord.rd3, + mapping = ggplot2::aes_string(x = "dot.x", y = "y", group = categ[length(categ)]), + size = dot.size, + shape = 19, + color = dot.coord.rd3$dot.color, + alpha = dot.alpha + )) # group used in aesthetic to do not have it in the legend. Here ggplot2::scale_discrete_manual() cannot be used because of the group easthetic + }else{ + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_point( + data = dot.coord.rd3, + mapping = ggplot2::aes_string(x = "dot.x", y = "y", group = categ[length(categ)]), + shape = 21, + stroke = dot.border.size, + color = if(is.null(dot.border.color)){dot.coord.rd3$dot.color}else{rep(dot.border.color, nrow(dot.coord.rd3))}, + size = dot.size, + fill = dot.coord.rd3$dot.color, + alpha = dot.alpha + )) # group used in aesthetic to do not have it in the legend. Here ggplot2::scale_discrete_manual() cannot be used because of the group easthetic + } + }else{ + if(dot.border.size == 0){ + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_point( + data = dot.coord.rd3, + mapping = ggplot2::aes_string(x = "dot.x", y = "y", alpha = dot.categ), + size = dot.size, + shape = 19, + color = dot.coord.rd3$dot.color + )) # group used in aesthetic to do not have it in the legend. Here ggplot2::scale_discrete_manual() cannot be used because of the group easthetic + }else{ + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_point( + data = dot.coord.rd3, + mapping = ggplot2::aes_string(x = "dot.x", y = "y", alpha = dot.categ), + size = dot.size, + shape = 21, + stroke = dot.border.size, + color = if(is.null(dot.border.color)){dot.coord.rd3$dot.color}else{rep(dot.border.color, nrow(dot.coord.rd3))}, + fill = dot.coord.rd3$dot.color + )) # group used in aesthetic to do not have it in the legend. Here ggplot2::scale_discrete_manual() cannot be used because of the group easthetic + } + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::scale_discrete_manual(aesthetics = "alpha", name = dot.legend.name, values = rep(dot.alpha, length(dot.categ.class.order)), guide = ggplot2::guide_legend(override.aes = list(fill = dot.color, color = if(is.null(dot.border.color)){dot.color}else{dot.border.color}, stroke = dot.border.size, alpha = dot.alpha)))) # values are the values of color (which is the border color in geom_box. WARNING: values = categ.color takes the numbers to make the colors if categ.color is a factor + } + coord.names <- c(coord.names, "dots") + }else if(dot.tidy == TRUE){ + # here plot using group -> no scale + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_dotplot( + data = dot.coord, + mapping = ggplot2::aes_string(x = categ[1], y = "y", group = "group"), # not dot.categ here because the classes of dot.categ create new separations + position = ggplot2::position_dodge(width = box.width), + binpositions = "all", + binaxis = "y", + stackdir = "center", + alpha = dot.alpha, + fill = dot.coord$dot.color, + stroke = dot.border.size, + color = if(is.null(dot.border.color)){dot.coord$dot.color}else{rep(dot.border.color, nrow(dot.coord))}, + show.legend = FALSE, # WARNING: do not use show.legend = TRUE because it uses the arguments outside aes() as aesthetics (here color and fill). Thus I must find a way using ggplot2::scale_discrete_manual() + binwidth = (y.lim[2] - y.lim[1]) / dot.tidy.bin.nb + )) # geom_dotplot ggplot2 v3.3.0: I had to remove rev() in fill and color # very weird behavior of geom_dotplot ggplot2 v3.2.1, (1) because with aes group = (to avoid legend), the dot plotting is not good in term of coordinates, and (2) because data1 seems reorderer according to x = categ[1] before plotting. Thus, I have to use fill = dot.coord[rev(order(dot.coord[, categ[1]], decreasing = TRUE)), "dot.color"] to have the good corresponding colors # show.legend option do not remove the legend, only the aesthetic of the legend (dot, line, etc.) + coord.names <- c(coord.names, "dots") + if( ! is.null(dot.categ)){ + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_dotplot( + data = dot.coord, + mapping = ggplot2::aes_string(x = categ[1], y = "y", alpha = dot.categ), # not dot.categ here because the classes of dot.categ create new separations + position = ggplot2::position_dodge(width = box.width), + binpositions = "all", + binaxis = "y", + stackdir = "center", + fill = NA, + stroke = NA, + color = NA, + # WARNING: do not use show.legend = TRUE because it uses the arguments outside aes() as aesthetics (here color and fill). Thus I must find a way using ggplot2::scale_discrete_manual() + binwidth = (y.lim[2] - y.lim[1]) / dot.tidy.bin.nb + )) # geom_dotplot ggplot2 v3.3.0: I had to remove rev() in fill and color # very weird behavior of geom_dotplot ggplot2 v3.2.1, (1) because with aes group = (to avoid legend), the dot plotting is not good in term of coordinates, and (2) because data1 seems reorderer according to x = categ[1] before plotting. Thus, I have to use fill = dot.coord[rev(order(dot.coord[, categ[1]], decreasing = TRUE)), "dot.color"] to have the good corresponding colors # show.legend option do not remove the legend, only the aesthetic of the legend (dot, line, etc.) + # assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::scale_discrete_manual(aesthetics = "linetype", name = dot.legend.name, values = rep(1, length(categ.color)))) # values = rep("black", length(categ.color)) are the values of color (which is the border color of dots), and this modify the border color on the plot. WARNING: values = categ.color takes the numbers to make the colors if categ.color is a factor + coord.names <- c(coord.names, "bad_remove") + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::scale_discrete_manual(aesthetics = "alpha", name = dot.legend.name, values = rep(dot.alpha, length(dot.categ.class.order)), labels = dot.categ.class.order, guide = ggplot2::guide_legend(title = if(ini.dot.categ == categ[length(categ)]){dot.categ}else{ini.dot.categ}, override.aes = list(fill = levels(dot.coord$dot.color), color = if(is.null(dot.border.color)){levels(dot.coord$dot.color)}else{dot.border.color}, stroke = dot.border.size, alpha = dot.alpha)))) # values are the values of color (which is the border color in geom_box. WARNING: values = categ.color takes the numbers to make the colors if categ.color is a factor + } + # coordinates of tidy dots + tempo.coord <- ggplot2::ggplot_build(eval(parse(text = paste(paste0(tempo.gg.name, 1:tempo.gg.count), collapse = " + "))))$data # to have the tidy dot coordinates + if(length(which(sapply(X = tempo.coord, FUN = function(X){any(names(X) == "binwidth", na.rm = TRUE)}))) != 1){ # detect the compartment of tempo.coord which is the binned data frame + # if(length(which(sapply(tempo.coord, FUN = nrow) == nrow(data1))) > if(is.null(dot.categ)){1}else{2}){ # this does not work if only one dot per class, thus replaced by above # if(is.null(dot.categ)){1}else{2} because 1 dotplot if dot.categ is NULL and 2 dotplots if not, with the second being a blank dotplot with wrong coordinates. Thus take the first in that situation + tempo.cat <- paste0("INTERNAL CODE ERROR IN ", function.name, "\nEITHER MORE THAN 1 OR NO COMPARTMENT HAVING A DATA FRAME WITH binwidth AS COLUMN NAME IN THE tempo.coord LIST (FOR TIDY DOT COORDINATES). CODE HAS TO BE MODIFIED") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == + }else{ + # dot.coord.tidy1 <- tempo.coord[[which(sapply(tempo.coord, FUN = nrow) == nrow(data1))[1]]] # this does not work if only one dot per class, thus replaced by above # the second being a blank dotplot with wrong coordinates. Thus take the first whatever situation + dot.coord.tidy1 <- tempo.coord[[which(sapply(X = tempo.coord, FUN = function(X){any(names(X) == "binwidth", na.rm = TRUE)}))]] # detect the compartment of tempo.coord which is the binned data frame + dot.coord.tidy1$x <- as.numeric(dot.coord.tidy1$x) # because weird class + dot.coord.tidy1$PANEL <- as.numeric(dot.coord.tidy1$PANEL) # because numbers as levels. But may be a problem is facet are reordered ? + } + # tempo.box.coord <- merge(box.coord, unique(dot.coord[, c("PANEL", "group", categ)]), by = c("PANEL", "group"), sort = FALSE) # not required anymore because box.coord already contains categ do not add dot.categ and tidy_group_coord here because the coordinates are for stats. Add the categ in box.coord. WARNING: by = c("PANEL", "group") without fill column because PANEL & group columns are enough as only one value of x column per group number in box.coord. Thus, no need to consider fill column + # below inactivated because not true when dealing with dot.categ different from categ + # if(nrow(tempo.box.coord) != nrow(box.coord)){ + # tempo.cat <- paste0("INTERNAL CODE ERROR IN ", function.name, "\nTHE merge() FUNCTION DID NOT RETURN A CORRECT tempo.box.coord DATA FRAME. CODE HAS TO BE MODIFIED") + # stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n"), call. = FALSE) # == in stop() to be able to add several messages between == + # } + dot.coord.tidy2 <- merge(dot.coord.tidy1, box.coord[c("fill", "PANEL", "group", "x", categ)], by = c("PANEL", "group"), sort = FALSE) # send the coord of the boxes into the coord data.frame of the dots (in the column x.y).WARNING: by = c("PANEL", "group") without fill column because PANEL & group columns are enough as only one value of x column per group number in tempo.box.coord. Thus, no need to consider fill colum # DANGER: from here the fill.y and x.y (from tempo.box.coord) are not good in dot.coord.tidy2. It is ok because Categ1 Categ2 from tempo.box.coord are ok with the group column from dot.coord.tidy1. This is due to the fact that dot.coord.tidy resulting from geom_dotplot does not make the same groups as the other functions + if(nrow(dot.coord.tidy2) != nrow(dot.coord)){ + tempo.cat <- paste0("INTERNAL CODE ERROR IN ", function.name, "\nTHE merge() FUNCTION DID NOT RETURN A CORRECT dot.coord.tidy2 DATA FRAME. CODE HAS TO BE MODIFIED") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == + } + # From here, check for dot.coord.tidy3 which wil be important for stat over the plot. WARNING: dot.categ has nothing to do here for stat coordinates. Thus, not in tempo.data1 + if(length(categ)== 1L){ + tempo.data1 <- unique(data.frame(data1[categ[1]], group = as.integer(data1[, categ[1]]), stringsAsFactors = TRUE)) # categ[1] is factor + names(tempo.data1)[names(tempo.data1) == categ[1]] <- paste0(categ[1], ".check") + verif <- paste0(categ[1], ".check") + }else if(length(categ) == 2L){ + tempo.data1 <- unique( + data.frame( + data1[c(categ[1], categ[2])], + group = as.integer(factor(paste0( + formatC(as.integer(data1[, categ[2]]), width = nchar(max(as.integer(data1[, categ[2]]), na.rm = TRUE)), flag = "0"), # convert factor into numeric with leading zero for proper ranking + ".", + formatC(as.integer(data1[, categ[1]]), width = nchar(max(as.integer(data1[, categ[1]]), na.rm = TRUE)), flag = "0")# convert factor into numeric with leading zero for proper ranking + )), stringsAsFactors = TRUE) # merge the 2 formatC() to create a new factor. The convertion to integer should recreate the correct group number + ) + ) # categ[2] first if categ[2] is used to make the categories in ggplot and categ[1] is used to make the x-axis + names(tempo.data1)[names(tempo.data1) == categ[1]] <- paste0(categ[1], ".check") + names(tempo.data1)[names(tempo.data1) == categ[2]] <- paste0(categ[2], ".check") + verif <- c(paste0(categ[1], ".check"), paste0(categ[2], ".check")) + }else{ + tempo.cat <- paste0("INTERNAL CODE ERROR IN ", function.name, "\nCODE INCONSISTENCY 4") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == + } + dot.coord.tidy3 <- merge(dot.coord.tidy2, tempo.data1, by = intersect("group", "group"), sort = FALSE) # send the factors of data1 into coord. WARNING: I have tested intersect("group", "group") instead of by = "group". May be come back to by = "group" in case of error. But I did this because of an error in dot.coord.rd3 above + if(nrow(dot.coord.tidy3) != nrow(dot.coord) | ( ! fun_comp_2d(dot.coord.tidy3[categ], dot.coord.tidy3[verif])$identical.content)){ + tempo.cat <- paste0("INTERNAL CODE ERROR IN ", function.name, "\nTHE merge() FUNCTION DID NOT RETURN A CORRECT dot.coord.tidy3 DATA FRAME. CODE HAS TO BE MODIFIED") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == + } + # end coordinates of tidy dots + } + } + # end dot display + + + + # boxplot display (if box.fill = FALSE, otherwise, already plotted above) + if(box.fill == TRUE){ + # overcome "work only for the filling of boxes, not for the frame. See https://github.com/tidyverse/ggplot2/issues/252" + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::scale_discrete_manual(aesthetics = "fill", name = box.legend.name, values = if(length(categ.color)== 1L){rep(categ.color, length(unique(data1[, categ[length(categ)]])))}else{categ.color}, guide = ggplot2::guide_legend(order = 1))) #, guide = ggplot2::guide_legend(override.aes = list(fill = levels(tempo.polygon$COLOR), color = "black")))) # values are the values of color (which is the border color in geom_box. WARNING: values = categ.color takes the numbers to make the colors if categ.color is a factor + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::scale_discrete_manual(aesthetics = "color", name = box.legend.name, values = rep(hsv(0, 0, 0, alpha = box.alpha), length(unique(data1[, categ[length(categ)]]))), guide = ggplot2::guide_legend(order = 1))) # , guide = ggplot2::guide_legend(override.aes = list(color = "black", alpha = box.alpha)))) # values are the values of color (which is the border color in geom_box. WARNING: values = categ.color takes the numbers to make the colors if categ.color is a factor # outline of the polygon in black but with alpha + }else{ + # assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_boxplot(data = data1, mapping = ggplot2::aes_string(x = categ[1], y = y, color = categ[length(categ)], fill = categ[length(categ)]), position = ggplot2::position_dodge(width = NULL), width = box.width, size = box.line.size, notch = box.notch, alpha = box.alpha, coef = if(box.whisker.kind == "no"){0}else if(box.whisker.kind == "std"){1.5}else if(box.whisker.kind == "max"){Inf}, outlier.shape = if( ! is.null(dot.color)){NA}else{21}, outlier.color = if( ! is.null(dot.color)){NA}else{if(dot.border.size == 0){NA}else{dot.border.color}}, outlier.fill = if( ! is.null(dot.color)){NA}else{NULL}, outlier.size = if( ! is.null(dot.color)){NA}else{dot.size}, outlier.stroke = if( ! is.null(dot.color)){NA}else{dot.border.size}, outlier.alpha = if( ! is.null(dot.color)){NA}else{dot.alpha})) # the color, size, etc. of the outliers are dealt here. outlier.color = NA to do not plot outliers when dots are already plotted + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_path( + data = tempo.polygon, + mapping = ggplot2::aes_string(x = "X", y = "Y", group = "BOX", color = categ[length(categ)]), + size = box.line.size, + alpha = box.alpha, + lineend = "round", + linejoin = "round" + )) + coord.names <- c(coord.names, "main.box") + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_segment(data = stat, mapping = ggplot2::aes(x = if(box.notch == FALSE){X_BOX_INF}else{X_NOTCH_INF}, xend = if(box.notch == FALSE){X_BOX_SUP}else{X_NOTCH_SUP}, y = MEDIAN, yend = MEDIAN, group = categ[length(categ)]), color = stat$COLOR, size = box.line.size * 2, alpha = box.alpha)) # + coord.names <- c(coord.names, "median") + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_segment(data = stat, mapping = ggplot2::aes(x = X, xend = X, y = BOX_SUP, yend = WHISK_SUP, group = categ[length(categ)]), color = stat$COLOR, size = box.line.size, alpha = box.alpha)) # + coord.names <- c(coord.names, "sup.whisker") + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_segment(data = stat, mapping = ggplot2::aes(x = X, xend = X, y = BOX_INF, yend = WHISK_INF, group = categ[length(categ)]), color = stat$COLOR, size = box.line.size, alpha = box.alpha)) # + coord.names <- c(coord.names, "inf.whisker") + if(box.whisker.width > 0){ + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_segment(data = stat, mapping = ggplot2::aes(x = X_WHISK_INF, xend = X_WHISK_SUP, y = WHISK_SUP, yend = WHISK_SUP, group = categ[length(categ)]), color = stat$COLOR, size = box.line.size, alpha = box.alpha, lineend = "round")) # + coord.names <- c(coord.names, "sup.whisker.edge") + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_segment(data = stat, mapping = ggplot2::aes(x = X_WHISK_INF, xend = X_WHISK_SUP, y = WHISK_INF, yend = WHISK_INF, group = categ[length(categ)]), color = stat$COLOR, size = box.line.size, alpha = box.alpha, lineend = "round")) # + coord.names <- c(coord.names, "inf.whisker.edge") + } + if(box.mean == TRUE){ + # assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_point(data = stat, mapping = ggplot2::aes_string(x = "X", y = "MEAN", group = categ[length(categ)]), shape = 23, stroke = box.line.size * 2, color = stat$COLOR, size = box.mean.size, fill = NA, alpha = box.alpha)) # group used in aesthetic to do not have it in the legend. Here ggplot2::scale_discrete_manual() cannot be used because of the group easthetic + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_path( + data = tempo.diamon.mean, + mapping = ggplot2::aes(x = X, y = Y, group = GROUP), + color = tempo.diamon.mean[, "COLOR"], + size = box.line.size, + alpha = box.alpha, + lineend = "round", + linejoin = "round" + )) + coord.names <- c(coord.names, "mean") + } + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::scale_discrete_manual(aesthetics = "fill", name = box.legend.name, values = rep(NA, length(unique(data1[, categ[length(categ)]]))))) #, guide = ggplot2::guide_legend(override.aes = list(color = categ.color)))) # values are the values of color (which is the border color in geom_box. WARNING: values = categ.color takes the numbers to make the colors if categ.color is a factor + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::scale_discrete_manual(aesthetics = "color", name = box.legend.name, values = if(length(categ.color)== 1L){rep(categ.color, length(unique(data1[, categ[length(categ)]])))}else{categ.color}, guide = ggplot2::guide_legend(override.aes = list(alpha = if(plot == TRUE & ((length(dev.list()) > 0 & names(dev.cur()) == "windows") | (length(dev.list()) == 0L & Sys.info()["sysname"] == "Windows"))){1}else{box.alpha})))) # , guide = ggplot2::guide_legend(override.aes = list(color = as.character(categ.color))))) # values are the values of color (which is the border color in geom_box. WARNING: values = categ.color takes the numbers to make the colors if categ.color is a factor + if(plot == TRUE & ((length(dev.list()) > 0 & names(dev.cur()) == "windows") | (length(dev.list()) == 0L & Sys.info()["sysname"] == "Windows"))){ # if any Graph device already open and this device is "windows", or if no Graph device opened yet and we are on windows system -> prevention of alpha legend bug on windows using value 1 + # to avoid a bug on windows: if alpha argument is different from 1 for lines (transparency), then lines are not correctly displayed in the legend when using the R GUI (bug https://github.com/tidyverse/ggplot2/issues/2452). No bug when using a pdf + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") GRAPHIC DEVICE USED ON A WINDOWS SYSTEM ->\nTRANSPARENCY OF THE LINES IS INACTIVATED IN THE LEGEND TO PREVENT A WINDOWS DEPENDENT BUG (SEE https://github.com/tidyverse/ggplot2/issues/2452)\nTO OVERCOME THIS ON WINDOWS, USE ANOTHER DEVICE (pdf() FOR INSTANCE)") + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + } + } + if(box.alpha == 0){ # remove box legend because no boxes drawn + # add this after the scale_xxx_manual() for boxplots + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::guides(fill = FALSE, color = FALSE)) # inactivate the legend + } + # end boxplot display (if box.fill = FALSE, otherwise, already plotted above) + + + + + # stat display + # layer after dots but ok, behind dots on the plot + if( ! is.null(stat.pos)){ + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") NUMBERS DISPLAYED ARE ", ifelse(stat.mean == FALSE, "MEDIANS", "MEANS")) + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + if(stat.pos == "top"){ + tempo.stat <- data.frame(stat, Y = y.lim[2], stringsAsFactors = TRUE) # I had to create a data frame for geom_tex() so that facet is taken into account, (ggplot2::annotate() does not deal with facet because no data and mapping arguments). Of note, facet.categ is in tempo.stat, via tempo.mean, via dot.coord + if(stat.mean == FALSE){tempo.stat$MEDIAN <- formatC(stat.nolog$MEDIAN, digit = 2, drop0trailing = TRUE, format = "f")}else{tempo.stat$MEAN <- formatC(stat.nolog$MEAN, digit = 2, drop0trailing = TRUE, format = "f")} + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_text( + data = tempo.stat, + mapping = ggplot2::aes_string(x = "X", y = "Y", label = ifelse(stat.mean == FALSE, "MEDIAN", "MEAN")), + size = stat.size, + color = "black", + angle = stat.angle, + hjust = stat.just$hjust, + vjust = stat.just$vjust + )) # stat$X used here because identical to stat.nolog but has the X. WARNING: no need of order() for labels because box.coord$x set the order. For justification, see https://stackoverflow.com/questions/7263849/what-do-hjust-and-vjust-do-when-making-a-plot-using-ggplot + coord.names <- c(coord.names, "stat.pos") + }else if(stat.pos == "above"){ + # stat coordinates + if( ! is.null(dot.color)){ # for text just above max dot + if(dot.tidy == FALSE){ + tempo.stat.ini <- dot.coord.rd3 + }else if(dot.tidy == TRUE){ + tempo.stat.ini <- dot.coord.tidy3 + tempo.stat.ini$x.y <- tempo.stat.ini$x.x # this is just to be able to use tempo.stat.ini$x.y for untidy or tidy dots (remember that dot.coord.tidy3$x.y is not good, see above) + } + stat.coord1 <- aggregate(x = tempo.stat.ini["y"], by = {x.env <- if(length(categ)== 1L){list(tempo.stat.ini$group, tempo.stat.ini$PANEL, tempo.stat.ini$x.y, tempo.stat.ini[, categ[1]])}else if(length(categ) == 2L){list(tempo.stat.ini$group, tempo.stat.ini$PANEL, tempo.stat.ini$x.y, tempo.stat.ini[, categ[1]], tempo.stat.ini[, categ[2]])} ; names(x.env) <- if(length(categ)== 1L){c("group", "PANEL", "x.y", categ[1])}else if(length(categ) == 2L){c("group", "PANEL", "x.y", categ[1], categ[2])} ; x.env}, FUN = min, na.rm = TRUE) + names(stat.coord1)[names(stat.coord1) == "y"] <- "dot.min" + stat.coord2 <- aggregate(x = tempo.stat.ini["y"], by = {x.env <- if(length(categ)== 1L){list(tempo.stat.ini$group, tempo.stat.ini$PANEL, tempo.stat.ini$x.y, tempo.stat.ini[, categ[1]])}else if(length(categ) == 2L){list(tempo.stat.ini$group, tempo.stat.ini$PANEL, tempo.stat.ini$x.y, tempo.stat.ini[, categ[1]], tempo.stat.ini[, categ[2]])} ; names(x.env) <- if(length(categ)== 1L){c("group", "PANEL", "x.y", categ[1])}else if(length(categ) == 2L){c("group", "PANEL", "x.y", categ[1], categ[2])} ; x.env}, FUN = max, na.rm = TRUE) + names(stat.coord2) <- paste0(names(stat.coord2), "_from.dot.max") + names(stat.coord2)[names(stat.coord2) == "y_from.dot.max"] <- "dot.max" + stat.coord3 <- cbind(box.coord[order(box.coord$group, box.coord$PANEL), ], stat.coord1[order(stat.coord1$group, stat.coord1$x.y), ], stat.coord2[order(stat.coord2$group, stat.coord2$x.y), ], stringsAsFactors = TRUE) # + if( ! all(identical(round(stat.coord3$x, 9), round(as.numeric(stat.coord3$x.y), 9)), na.rm = TRUE)){ # as.numeric() because stat.coord3$x is class "mapped_discrete" "numeric" + tempo.cat <- paste0("INTERNAL CODE ERROR IN ", function.name, "\nFUSION OF box.coord, stat.coord1 AND stat.coord2 ACCORDING TO box.coord$x, stat.coord1$x.y AND stat.coord2$x.y IS NOT CORRECT. CODE HAS TO BE MODIFIED") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == + } + # text.coord <- stat.coord3[, c("x", "group", "dot.min", "dot.max")] + # names(text.coord)[names(text.coord) == "dot.min"] <- "text.min.pos" + #names(text.coord)[names(text.coord) == "dot.max"] <- "text.max.pos" + box.coord <- box.coord[order(box.coord$x, box.coord$group, box.coord$PANEL), ] + # text.coord <- text.coord[order(text.coord$x), ] # to be sure to have the two objects in the same order for x. WARNING: cannot add identical(as.integer(text.coord$group), as.integer(box.coord$group)) because with error, the correspondence between x and group is not the same + stat.coord3 <- stat.coord3[order(stat.coord3$x, stat.coord3$group, stat.coord3$PANEL), ] # to be sure to have the two objects in the same order for x. WARNING: cannot add identical(as.integer(text.coord$group), as.integer(box.coord$group)) because with error, the correspondence between x and group is not the same + if( ! (identical(box.coord$x, stat.coord3$x) & identical(box.coord$group, stat.coord3$group) & identical(box.coord$PANEL, stat.coord3$PANEL))){ + tempo.cat <- paste0("INTERNAL CODE ERROR IN ", function.name, "\ntext.coord AND box.coord DO NOT HAVE THE SAME x, group AND PANEL COLUMN CONTENT") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == + } + }else{ + stat.coord3 <- box.coord + } + stat.coord3 <- data.frame( + stat.coord3, + Y = stat.coord3[, ifelse( + is.null(dot.color), + ifelse(diff(y.lim) > 0, "ymax", "ymin"), + ifelse(diff(y.lim) > 0, "ymax_final", "ymin_final") + )], + stringsAsFactors = TRUE + ) # ymax is top whisker, ymax_final is top dot + # stat.coord3 <- data.frame(stat.coord3, Y = vector("numeric", length = nrow(stat.coord3)), stringsAsFactors = TRUE) + # check.Y <- as.logical(stat.coord3$Y) # convert everything in Y into FALSE (because Y is full of zero) + # end stat coordinates + # stat display + # performed twice: first for y values >=0, then y values < 0, because only a single value allowed for hjust anf vjust + if(stat.mean == FALSE){ + tempo.center.ref <- "middle" + }else{ + tempo.center.ref <- "MEAN" + } + # if(is.null(dot.color)){ + # tempo.low.ref <- "ymin" + # tempo.high.ref <- "ymax" + # }else{ + # tempo.low.ref <- "ymin_final" + # tempo.high.ref <- "ymax_final" + # } + # tempo.log.high <- if(diff(y.lim) > 0){stat.coord3[, tempo.center.ref] >= 0}else{stat.coord3[, tempo.center.ref] < 0} + # tempo.log.low <- if(diff(y.lim) > 0){stat.coord3[, tempo.center.ref] < 0}else{stat.coord3[, tempo.center.ref] >= 0} + # stat.coord3$Y[tempo.log.high] <- stat.coord3[tempo.log.high, tempo.high.ref] + # stat.coord3$Y[tempo.log.low] <- stat.coord3[tempo.log.low, tempo.low.ref] + # add distance + stat.coord3$Y <- stat.coord3$Y + diff(y.lim) * stat.dist / 100 + # end add distance + # correct median or mean text format + if(y.log != "no"){ + stat.coord3[, tempo.center.ref] <- ifelse(y.log == "log2", 2, 10)^(stat.coord3[, tempo.center.ref]) + } + stat.coord3[, tempo.center.ref] <- formatC(stat.coord3[, tempo.center.ref], digit = 2, drop0trailing = TRUE, format = "f") + # end correct median or mean text format + # if(any(tempo.log.high) == TRUE){ + # tempo.stat <- stat.coord3[tempo.log.high,] + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_text( + data = stat.coord3, + mapping = ggplot2::aes_string(x = "x", y = "Y", label = tempo.center.ref), + size = stat.size, + color = "black", + angle = stat.angle, + hjust = stat.just$hjust, + vjust = stat.just$vjust + )) # WARNING: no need of order() for labels because box.coord$x set the order + coord.names <- c(coord.names, "stat.pos") + # } + # if(any(tempo.log.low) == TRUE){ + # tempo.stat <- stat.coord3[tempo.log.low,] + # assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::geom_text( + # data = tempo.stat, + # mapping = ggplot2::aes_string(x = "x", y = "Y", label = tempo.center.ref), + # size = stat.size, + # color = "black", + # hjust = ifelse(vertical == TRUE, 0.5, 0.5 + stat.dist), + # vjust = ifelse(vertical == TRUE, 0.5 + stat.dist, 0.5) + # )) # WARNING: no need of order() for labels because box.coord$x set the order + # coord.names <- c(coord.names, "stat.pos.negative") + # } + # end stat display + }else{ + tempo.cat <- paste0("INTERNAL CODE ERROR IN ", function.name, "\nCODE INCONSISTENCY 5") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == + } + } + # end stat display + # legend management + if(legend.show == FALSE){ # must be here because must be before bef.final.plot <- + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::guides(fill = FALSE, color = FALSE, alpha = FALSE)) # inactivate the initial legend + } + # end legend management + + + + # y scale management (cannot be before dot plot management) + # the rescaling aspect is complicated and not intuitive. See: + # explaination: https://github.com/tidyverse/ggplot2/issues/3948 + # the oob argument of scale_y_continuous() https://ggplot2.tidyverse.org/reference/scale_continuous.html + # see also https://github.com/rstudio/cheatsheets/blob/master/data-visualization-2.1.pdf + # secondary ticks + bef.final.plot <- ggplot2::ggplot_build(eval(parse(text = paste(paste(paste0(tempo.gg.name, 1:tempo.gg.count), collapse = " + "), ' + if(vertical == TRUE){ggplot2::scale_y_continuous(expand = c(0, 0), limits = sort(y.lim), oob = scales::rescale_none)}else{ggplot2::coord_flip(ylim = y.lim)}')))) # here I do not need the x-axis and y-axis orientation, I just need the number of main ticks and the legend. I DI NOT UNDERSTAND THE COMMENT HERE BECAUSE WE NEED COORD_FLiP + tempo.coord <- bef.final.plot$layout$panel_params[[1]] + # y.second.tick.positions: coordinates of secondary ticks (only if y.second.tick.nb argument is non NULL or if y.log argument is different from "no") + if(y.log != "no"){ # integer main ticks for log2 and log10 + tempo.scale <- (as.integer(min(y.lim, na.rm = TRUE)) - 1):(as.integer(max(y.lim, na.rm = TRUE)) + 1) + }else{ + tempo <- if(is.null(attributes(tempo.coord$y$breaks))){tempo.coord$y$breaks}else{unlist(attributes(tempo.coord$y$breaks))} + if(all(is.na(tempo))){# all() without na.rm -> ok because is.na() cannot be NA + tempo.cat <- paste0("INTERNAL CODE ERROR IN ", function.name, "\nONLY NA IN tempo.coord$y$breaks") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == + } + tempo.scale <- fun_scale(lim = y.lim, n = ifelse(is.null(y.tick.nb), length(tempo[ ! is.na(tempo)]), y.tick.nb)) # in ggplot 3.3.0, tempo.coord$y.major_source replaced by tempo.coord$y$breaks. If fact: n = ifelse(is.null(y.tick.nb), length(tempo[ ! is.na(tempo)]), y.tick.nb)) replaced by n = ifelse(is.null(y.tick.nb), 4, y.tick.nb)) + } + y.second.tick.values <- NULL + y.second.tick.pos <- NULL + if(y.log != "no"){ + tempo <- fun_inter_ticks(lim = y.lim, log = y.log) + y.second.tick.values <- tempo$values + y.second.tick.pos <- tempo$coordinates + # if(vertical == TRUE){ # do not remove in case the bug is fixed + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::annotate(geom = "segment", y = y.second.tick.pos, yend = y.second.tick.pos, x = tempo.coord$x.range[1], xend = tempo.coord$x.range[1] + diff(tempo.coord$x.range) / 80)) + # }else{ # not working because of the ggplot2 bug + # assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::annotate(geom = "segment", x = y.second.tick.pos, xend = y.second.tick.pos, y = tempo.coord$y.range[1], yend = tempo.coord$y.range[1] + diff(tempo.coord$y.range) / 80)) + # } + coord.names <- c(coord.names, "y.second.tick.positions") + }else if(( ! is.null(y.second.tick.nb)) & y.log == "no"){ + # if(y.second.tick.nb > 0){ #inactivated because already checked before + if(length(tempo.scale) < 2){ + tempo.cat1 <- c("y.tick.nb", "y.second.tick.nb") + tempo.cat2 <- sapply(list(y.tick.nb, y.second.tick.nb), FUN = paste0, collapse = " ") + tempo.sep <- sapply(mapply(" ", max(nchar(tempo.cat1)) - nchar(tempo.cat1) + 3, FUN = rep, SIMPLIFY = FALSE), FUN = paste0, collapse = "") + tempo.cat <- paste0("ERROR IN ", function.name, "\nTHE NUMBER OF GENERATED TICKS FOR THE Y-AXIS IS NOT CORRECT: ", length(tempo.scale), "\nUSING THESE ARGUMENT SETTINGS (NO DISPLAY MEANS NULL VALUE):\n", paste0(tempo.cat1, tempo.sep, tempo.cat2, collapse = "\n"), "\nPLEASE, TEST OTHER VALUES") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == + }else{ + tempo <- fun_inter_ticks(lim = y.lim, log = y.log, breaks = tempo.scale, n = y.second.tick.nb) + } + y.second.tick.values <- tempo$values + y.second.tick.pos <- tempo$coordinates + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::annotate( + geom = "segment", + y = y.second.tick.pos, + yend = y.second.tick.pos, + x = if(vertical == TRUE){tempo.coord$x.range[1]}else{tempo.coord$y.range[1]}, + xend = if(vertical == TRUE){tempo.coord$x.range[1] + diff(tempo.coord$x.range) / 80}else{tempo.coord$y.range[1] + diff(tempo.coord$y.range) / 80} + )) + coord.names <- c(coord.names, "y.second.tick.positions") + } + # end y.second.tick.positions + # for the ggplot2 bug with y.log, this does not work: eval(parse(text = ifelse(vertical == FALSE & y.log == "log10", "ggplot2::scale_x_continuous", "ggplot2::scale_y_continuous"))) + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::scale_y_continuous( + breaks = tempo.scale, + minor_breaks = y.second.tick.pos, + labels = if(y.log == "log10"){scales::trans_format("identity", scales::math_format(10^.x))}else if(y.log == "log2"){scales::trans_format("identity", scales::math_format(2^.x))}else if(y.log == "no"){ggplot2::waiver()}else{tempo.cat <- paste0("INTERNAL CODE ERROR IN ", function.name, "\nCODE INCONSISTENCY 6") ; stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE)}, # == in stop() to be able to add several messages between == + expand = c(0, 0), # remove space after after axis limits + limits = sort(y.lim), # NA indicate that limits must correspond to data limits but ylim() already used + oob = scales::rescale_none, + trans = ifelse(diff(y.lim) < 0, "reverse", "identity") # equivalent to ggplot2::scale_y_reverse() but create the problem of y-axis label disappearance with y.lim decreasing. Thus, do not use. Use ylim() below and after this + )) + if(vertical == TRUE){ + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::coord_cartesian(ylim = y.lim)) # problem of ggplot2::ylim() is that it redraws new breaks # coord_cartesian(ylim = y.lim)) not used because bug -> y-axis label disappearance with y.lim decreasing I DO NOT UNDERSTAND THIS MESSAGE WHILE I USE COORD_CARTESIAN # clip = "off" to have secondary ticks outside plot region does not work + }else{ + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::coord_flip(ylim = y.lim)) # clip = "off" to have secondary ticks outside plot region does not work # create the problem of y-axis label disappearance with y.lim decreasing. IDEM ABOVE + + } + # end y scale management (cannot be before dot plot management) + + + # legend management + if( ! is.null(legend.width)){ + legend.final <- fun_gg_get_legend(ggplot_built = bef.final.plot, fun.name = function.name, lib.path = lib.path) # get legend + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::guides(fill = FALSE, color = FALSE, alpha = FALSE)) # inactivate the initial legend + if(is.null(legend.final) & plot == TRUE){ # even if any(unlist(legend.disp)) is TRUE + legend.final <- ggplot2::ggplot()+ggplot2::theme_void() # empty graph instead of legend + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") LEGEND REQUESTED (NON NULL categ ARGUMENT OR legend.show ARGUMENT SET TO TRUE)\nBUT IT SEEMS THAT THE PLOT HAS NO LEGEND -> EMPTY LEGEND SPACE CREATED BECAUSE OF THE NON NULL legend.width ARGUMENT\n") + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + } + } + # end legend management + + + # drawing + fin.plot <- suppressMessages(suppressWarnings(eval(parse(text = paste(paste0(tempo.gg.name, 1:tempo.gg.count), collapse = " + "))))) + grob.save <- NULL + if(plot == TRUE){ + # following lines inactivated because of problem in warn.recov and message.recov + # assign("env_fun_get_message", new.env()) + # assign("tempo.gg.name", tempo.gg.name, envir = env_fun_get_message) + # assign("tempo.gg.count", tempo.gg.count, envir = env_fun_get_message) + # assign("add", add, envir = env_fun_get_message) + # two next line: for the moment, I cannot prevent the warning printing + # warn.recov <- fun_get_message(paste(paste(paste0(tempo.gg.name, 1:tempo.gg.count), collapse = " + "), if(is.null(add)){NULL}else{add}), kind = "warning", header = FALSE, print.no = FALSE, env = env_fun_get_message) # for recovering warnings printed by ggplot() functions + # message.recov <- fun_get_message('print(eval(parse(text = paste(paste(paste0(tempo.gg.name, 1:tempo.gg.count), collapse = " + "), if(is.null(add)){NULL}else{add}))))', kind = "message", header = FALSE, print.no = FALSE, env = env_fun_get_message) # for recovering messages printed by ggplot() functions + # if( ! (return == TRUE & return.ggplot == TRUE)){ # because return() plots when return.ggplot is TRUE # finally not used -> see return.ggplot description + if(is.null(legend.width)){ + grob.save <- suppressMessages(suppressWarnings(gridExtra::grid.arrange(fin.plot))) + }else{ + grob.save <-suppressMessages(suppressWarnings(gridExtra::grid.arrange(fin.plot, legend.final, ncol=2, widths=c(1, legend.width)))) + } + # } + # suppressMessages(suppressWarnings(print(eval(parse(text = paste(paste(paste0(tempo.gg.name, 1:tempo.gg.count), collapse = " + "), if(is.null(add)){NULL}else{add})))))) + }else{ + # following lines inactivated because of problem in warn.recov and message.recov + # message.recov <- NULL + # warn.recov <- NULL + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") PLOT NOT SHOWN AS REQUESTED") + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + } + # end drawing + + + + # output + # following lines inactivated because of problem in warn.recov and message.recov + # if( ! (is.null(warn) & is.null(warn.recov) & is.null(message.recov))){ + # warn <- paste0(warn, "\n\n", if(length(warn.recov) > 0 | length(message.recov) > 0){paste0(paste0("MESSAGES FROM ggplot2 FUNCTIONS: ", ifelse( ! is.null(warn.recov), unique(message.recov), ""), ifelse( ! is.null(message.recov), unique(message.recov), ""), collapse = "\n\n"), "\n\n")}) + # }else if( ! (is.null(warn) & is.null(warn.recov)) & is.null(message.recov)){ + # warn <- paste0(warn, "\n\n", if(length(warn.recov) > 0){paste0(paste0("MESSAGES FROM ggplot2 FUNCTIONS: ", unique(warn.recov), collapse = "\n\n"), "\n\n")}) + # }else if( ! (is.null(warn) & is.null(message.recov)) & is.null(warn.recov)){ + # warn <- paste0(warn, "\n\n", if(length(message.recov) > 0){paste0(paste0("MESSAGES FROM ggplot2 FUNCTIONS: ", unique(message.recov), collapse = "\n\n"), "\n\n")}) + # } + if(warn.print == TRUE & ! is.null(warn)){ + on.exit(warning(paste0("FROM ", function.name, ":\n\n", warn), call. = FALSE)) + } + on.exit(exp = options(warning.length = ini.warning.length), add = TRUE) + if(return == TRUE){ + tempo.output <- ggplot2::ggplot_build(fin.plot) + tempo.output$data <- tempo.output$data[-1] # remove the first data because corresponds to the initial empty boxplot + if(length(tempo.output$data) != length(coord.names)){ + tempo.cat <- paste0("INTERNAL CODE ERROR IN ", function.name, "\nlength(tempo.output$data) AND length(coord.names) MUST BE IDENTICAL. CODE HAS TO BE MODIFIED") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == + }else{ + names(tempo.output$data) <- coord.names + tempo.output$data <- tempo.output$data[coord.names != "bad_remove"] + } + tempo <- tempo.output$layout$panel_params[[1]] + output <- list( + data = data1.ini, + stat = stat.nolog, + removed.row.nb = removed.row.nb, + removed.rows = removed.rows, + plot = c(tempo.output$data, y.second.tick.values = list(y.second.tick.values)), + panel = facet.categ, + axes = list( + x.range = tempo$x.range, + x.labels = if(is.null(attributes(tempo$x$breaks))){tempo$x$breaks}else{tempo$x$scale$get_labels()}, # is.null(attributes(tempo$x$breaks)) test if it is number (TRUE) or character (FALSE) + x.positions = if(is.null(attributes(tempo$x$breaks))){tempo$x$breaks}else{unlist(attributes(tempo$x$breaks))}, + y.range = tempo$y.range, + y.labels = if(is.null(attributes(tempo$y$breaks))){tempo$y$breaks}else{tempo$y$scale$get_labels()}, + y.positions = if(is.null(attributes(tempo$y$breaks))){tempo$y$breaks}else{unlist(attributes(tempo$y$breaks))} + ), + warn = paste0("\n", warn, "\n\n"), + ggplot = if(return.ggplot == TRUE){fin.plot}else{NULL}, # fin.plot plots the graph if return == TRUE + gtable = if(return.gtable == TRUE){grob.save}else{NULL} + ) + return(output) # this plots the graph if return.ggplot is TRUE and if no assignment + } + # end output + # end main code } -# end conversion of geom_hline and geom_vline - - -# kind of geom_point (vectorial or raster) -scatter.kind <- vector("list", length = length(data1)) # list of same length as data1, that will be used to use either ggplot2::geom_point() (vectorial dot layer) or fun_gg_point_rast() (raster dot layer) -fix.ratio <- FALSE -if(is.null(raster.threshold)){ -if(raster == TRUE){ -scatter.kind[] <- "fun_gg_point_rast" # not important to fill everything: will be only used when geom == "geom_point" -fix.ratio <- TRUE -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") RASTER PLOT GENERATED -> ASPECT RATIO OF THE PLOT REGION SET BY THE raster.ratio ARGUMENT (", fun_round(raster.ratio, 2), ") TO AVOID A BUG OF ELLIPSOID DOT DRAWING") -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -}else{ -scatter.kind[] <- "ggplot2::geom_point" -} -}else{ -for(i2 in 1:length(data1)){ -if(geom[[i2]] == "geom_point"){ -if(nrow(data1[[i2]]) <= raster.threshold){ -scatter.kind[[i2]] <- "ggplot2::geom_point" -}else{ -scatter.kind[[i2]] <- "fun_gg_point_rast" -fix.ratio <- TRUE -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") ", ifelse(length(data1)== 1L, "data1 ARGUMENT", paste0("DATA FRAME NUMBER ", i2, " OF data1 ARGUMENT")), " LAYER AS RASTER (NOT VECTORIAL)") -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -} -} -} -if(any(unlist(scatter.kind) == "fun_gg_point_rast")){ -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") RASTER PLOT GENERATED -> ASPECT RATIO OF THE PLOT REGION SET BY THE raster.ratio ARGUMENT (", fun_round(raster.ratio, 2), ") TO AVOID A BUG OF ELLIPSOID DOT DRAWING") -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -} -} -# end kind of geom_point (vectorial or raster) - - - - -# no need loop part -coord.names <- NULL -tempo.gg.name <- "gg.indiv.plot." -tempo.gg.count <- 0 -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), eval(parse(text = paste0("ggplot2::ggplot()", if(is.null(add)){""}else{add})))) # add added here to have the facets -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::xlab(if(is.null(x.lab)){x[[1]]}else{x.lab})) -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::ylab(if(is.null(y.lab)){y[[1]]}else{y.lab})) -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::ggtitle(title)) -# text angle management -x.tempo.just <- fun_gg_just(angle = x.text.angle, pos = "bottom", kind = "axis") -y.tempo.just <- fun_gg_just(angle = y.text.angle, pos = "left", kind = "axis") -# end text angle management -add.check <- TRUE -if( ! is.null(add)){ # if add is NULL, then = 0 -if(grepl(pattern = "ggplot2::theme", add) == TRUE){ -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") \"ggplot2::theme\" STRING DETECTED IN THE add ARGUMENT\n-> INTERNAL GGPLOT2 THEME FUNCTIONS theme() AND theme_classic() HAVE BEEN INACTIVATED, TO BE USED BY THE USER\n-> article ARGUMENT WILL BE IGNORED\nIT IS RECOMMENDED TO USE \"+ theme(aspect.ratio = raster.ratio)\" IF RASTER MODE IS ACTIVATED") -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -add.check <- FALSE -} -} -if(add.check == TRUE & article == TRUE){ -# WARNING: not possible to add several times theme(). NO message but the last one overwrites the others -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::theme_classic(base_size = text.size)) -if(grid == TRUE){ -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), m.gg <- ggplot2::theme( -text = ggplot2::element_text(size = text.size), -plot.title = ggplot2::element_text(size = title.text.size), # stronger than text -legend.key = ggplot2::element_rect(color = "white", size = 1.5), # size of the frame of the legend -line = ggplot2::element_line(size = 0.5), -axis.line.y.left = ggplot2::element_line(colour = "black"), # draw lines for the y axis -axis.line.x.bottom = ggplot2::element_line(colour = "black"), # draw lines for the x axis -panel.grid.major.x = ggplot2::element_line(colour = "grey85", size = 0.75), -panel.grid.minor.x = ggplot2::element_line(colour = "grey90", size = 0.25), -panel.grid.major.y = ggplot2::element_line(colour = "grey85", size = 0.75), -panel.grid.minor.y = ggplot2::element_line(colour = "grey90", size = 0.25), -axis.text.x = ggplot2::element_text(angle = x.tempo.just$angle, hjust = x.tempo.just$hjust, vjust = x.tempo.just$vjust), -axis.text.y = ggplot2::element_text(angle = y.tempo.just$angle, hjust = y.tempo.just$hjust, vjust = y.tempo.just$vjust), -aspect.ratio = if(fix.ratio == TRUE){raster.ratio}else{NULL} # for raster -)) -}else{ -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), m.gg <- ggplot2::theme( -text = ggplot2::element_text(size = text.size), -plot.title = ggplot2::element_text(size = title.text.size), # stronger than text -line = ggplot2::element_line(size = 0.5), -legend.key = ggplot2::element_rect(color = "white", size = 1.5), # size of the frame of the legend -axis.line.y.left = ggplot2::element_line(colour = "black"), -axis.line.x.bottom = ggplot2::element_line(colour = "black"), -axis.text.x = ggplot2::element_text(angle = x.tempo.just$angle, hjust = x.tempo.just$hjust, vjust = x.tempo.just$vjust), -axis.text.y = ggplot2::element_text(angle = y.tempo.just$angle, hjust = y.tempo.just$hjust, vjust = y.tempo.just$vjust), -aspect.ratio = if(fix.ratio == TRUE){raster.ratio}else{NULL} # for raster -)) -} -}else if(add.check == TRUE & article == FALSE){ -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), m.gg <- ggplot2::theme( -text = ggplot2::element_text(size = text.size), -plot.title = ggplot2::element_text(size = title.text.size), # stronger than text -line = ggplot2::element_line(size = 0.5), -legend.key = ggplot2::element_rect(color = "white", size = 1.5), # size of the frame of the legend -panel.background = ggplot2::element_rect(fill = "grey95"), -axis.line.y.left = ggplot2::element_line(colour = "black"), -axis.line.x.bottom = ggplot2::element_line(colour = "black"), -panel.grid.major.x = ggplot2::element_line(colour = "grey85", size = 0.75), -panel.grid.minor.x = ggplot2::element_line(colour = "grey90", size = 0.25), -panel.grid.major.y = ggplot2::element_line(colour = "grey85", size = 0.75), -panel.grid.minor.y = ggplot2::element_line(colour = "grey90", size = 0.25), -strip.background = ggplot2::element_rect(fill = "white", colour = "black"), -axis.text.x = ggplot2::element_text(angle = x.tempo.just$angle, hjust = x.tempo.just$hjust, vjust = x.tempo.just$vjust), -axis.text.y = ggplot2::element_text(angle = y.tempo.just$angle, hjust = y.tempo.just$hjust, vjust = y.tempo.just$vjust), -aspect.ratio = if(fix.ratio == TRUE){raster.ratio}else{NULL} # for raster -# do not work -> legend.position = "none" # to remove the legend completely: https://www.datanovia.com/en/blog/how-to-remove-legend-from-a-ggplot/ -)) -} -# end no need loop part - - -# loop part -point.count <- 0 -line.count <- 0 -lg.order <- vector(mode = "list", length = 6) # order of the legend -lg.order <- lapply(lg.order, as.numeric) # order of the legend -lg.color <- vector(mode = "list", length = 6) # color of the legend -lg.dot.shape <- vector(mode = "list", length = 6) # etc. -lg.dot.size <- vector(mode = "list", length = 6) # etc. -lg.dot.size <- lapply(lg.dot.size, as.numeric) # etc. -lg.dot.border.size <- vector(mode = "list", length = 6) # etc. -lg.dot.border.size <- lapply(lg.dot.border.size, as.numeric) # etc. -lg.dot.border.color <- vector(mode = "list", length = 6) # etc. -lg.line.size <- vector(mode = "list", length = 6) # etc. -lg.line.size <- lapply(lg.line.size, as.numeric) # etc. -lg.line.type <- vector(mode = "list", length = 6) # etc. -lg.alpha <- vector(mode = "list", length = 6) # etc. -lg.alpha <- lapply(lg.alpha, as.numeric) # etc. -for(i1 in 1:length(data1)){ -if(geom[[i1]] == "geom_point"){ -point.count <- point.count + 1 -if(point.count== 1L){ -fin.lg.disp[[1]] <- legend.disp[[point.count + line.count]] -lg.order[[1]] <- point.count + line.count -lg.color[[1]] <- color[[i1]] # if color == NULL -> NULL -lg.dot.shape[[1]] <- dot.shape[[i1]] -lg.dot.size[[1]] <- dot.size[[i1]] -lg.dot.border.size[[1]] <- dot.border.size[[i1]] -lg.dot.border.color[[1]] <- dot.border.color[[i1]] # if dot.border.color == NULL -> NULL -if(plot == TRUE & fin.lg.disp[[1]] == TRUE & dot.shape[[1]] %in% 0:14 & ((length(dev.list()) > 0 & names(dev.cur()) == "windows") | (length(dev.list())== 0L & Sys.info()["sysname"] == "Windows"))){ # if any Graph device already open and this device is "windows", or if no Graph device opened yet and we are on windows system -> prevention of alpha legend bug on windows using value 1 -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") GRAPHIC DEVICE USED ON A WINDOWS SYSTEM ->\nTRANSPARENCY OF THE DOTS (DOT LAYER NUMBER ", point.count, ") IS INACTIVATED IN THE LEGEND TO PREVENT A WINDOWS DEPENDENT BUG (SEE https://github.com/tidyverse/ggplot2/issues/2452)\nTO OVERCOME THIS ON WINDOWS, USE ANOTHER DEVICE (pdf() FOR INSTANCE)") -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -lg.alpha[[1]] <- 1 # to avoid a bug on windows: if alpha argument is different from 1 for lines (transparency), then lines are not correctly displayed in the legend when using the R GUI (bug https://github.com/tidyverse/ggplot2/issues/2452). No bug when using a pdf -}else{ -lg.alpha[[1]] <- alpha[[i1]] -} -class.categ <- levels(factor(data1[[i1]][, categ[[i1]]])) -for(i5 in 1:length(color[[i1]])){ # or length(class.categ). It is the same because already checked that lengths are the same -tempo.data.frame <- data1[[i1]][data1[[i1]][, categ[[i1]]] == class.categ[i5], ] -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), eval(parse(text = scatter.kind[[i1]]))(data = tempo.data.frame, mapping = ggplot2::aes_string(x = x[[i1]], y = y[[i1]], fill = categ[[i1]]), shape = dot.shape[[i1]], size = dot.size[[i1]], stroke = dot.border.size[[i1]], color = if(dot.shape[[i1]] %in% 21:24 & ! is.null(dot.border.color)){dot.border.color[[i1]]}else{color[[i1]][i5]}, alpha = alpha[[i1]], show.legend = if(i5== 1L){TRUE}else{FALSE})) # WARNING: a single color allowed for color argument outside aesthetic, but here a single color for border --> loop could be inactivated but kept for commodity # legend.show option do not remove the legend, only the aesthetic of the legend (dot, line, etc.). Used here to avoid multiple layers of legend which corrupt transparency -coord.names <- c(coord.names, paste0(geom[[i1]], ".", class.categ[i5])) -} -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::scale_fill_manual(name = if(is.null(legend.name)){NULL}else{legend.name[[i1]]}, values = as.character(color[[i1]]), breaks = class.categ)) # values are the values of fill, breaks reorder the classes according to class.categ in the legend, order argument of guide_legend determines the order of the different aesthetics in the legend (not order of classes). See guide_legend settings of scale_..._manual below -} -if(point.count== 2L){ -fin.lg.disp[[2]] <- legend.disp[[point.count + line.count]] -lg.order[[2]] <- point.count + line.count -lg.color[[2]] <- color[[i1]] # if color == NULL -> NULL -lg.dot.shape[[2]] <- dot.shape[[i1]] -lg.dot.size[[2]] <- dot.size[[i1]] -lg.dot.border.size[[2]] <- dot.border.size[[i1]] -lg.dot.border.color[[2]] <- dot.border.color[[i1]] # if dot.border.color == NULL -> NULL -if(plot == TRUE & fin.lg.disp[[2]] == TRUE & dot.shape[[2]] %in% 0:14 & ((length(dev.list()) > 0 & names(dev.cur()) == "windows") | (length(dev.list())== 0L & Sys.info()["sysname"] == "Windows"))){ # if any Graph device already open and this device is "windows", or if no Graph device opened yet and we are on windows system -> prevention of alpha legend bug on windows using value 1 -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") GRAPHIC DEVICE USED ON A WINDOWS SYSTEM ->\nTRANSPARENCY OF THE DOTS (DOT LAYER NUMBER ", point.count, ") IS INACTIVATED IN THE LEGEND TO PREVENT A WINDOWS DEPENDENT BUG (SEE https://github.com/tidyverse/ggplot2/issues/2452)\nTO OVERCOME THIS ON WINDOWS, USE ANOTHER DEVICE (pdf() FOR INSTANCE)") -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -lg.alpha[[2]] <- 1 # to avoid a bug on windows: if alpha argument is different from 1 for lines (transparency), then lines are not correctly displayed in the legend when using the R GUI (bug https://github.com/tidyverse/ggplot2/issues/2452). No bug when using a pdf -}else{ -lg.alpha[[2]] <- alpha[[i1]] -} -class.categ <- levels(factor(data1[[i1]][, categ[[i1]]])) -for(i5 in 1:length(color[[i1]])){ # or length(class.categ). It is the same because already checked that lengths are the same -tempo.data.frame <- data1[[i1]][data1[[i1]][, categ[[i1]]] == class.categ[i5], ] -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), eval(parse(text = scatter.kind[[i1]]))(data = tempo.data.frame, mapping = ggplot2::aes_string(x = x[[i1]], y = y[[i1]], shape = categ[[i1]]), size = dot.size[[i1]], stroke = dot.border.size[[i1]], fill = color[[i1]][i5], color = if(dot.shape[[i1]] %in% 21:24 & ! is.null(dot.border.color)){dot.border.color[[i1]]}else{color[[i1]][i5]}, alpha = alpha[[i1]], show.legend = FALSE)) # WARNING: a single color allowed for fill argument outside aesthetic, hence the loop # legend.show option do not remove the legend, only the aesthetic of the legend (dot, line, etc.). Used here to avoid multiple layers of legend which corrupt transparency -coord.names <- c(coord.names, paste0(geom[[i1]], ".", class.categ[i5])) -} -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::scale_shape_manual(name = if(is.null(legend.name)){NULL}else{legend.name[[i1]]}, values = rep(dot.shape[[i1]], length(color[[i1]])), breaks = class.categ)) # values are the values of shape, breaks reorder the classes according to class.categ in the legend. See guide_legend settings of scale_..._manual below - -} -if(point.count== 3L){ -fin.lg.disp[[3]] <- legend.disp[[point.count + line.count]] -lg.order[[3]] <- point.count + line.count -lg.color[[3]] <- color[[i1]] # if color == NULL -> NULL -lg.dot.shape[[3]] <- dot.shape[[i1]] -lg.dot.size[[3]] <- dot.size[[i1]] -lg.dot.border.size[[3]] <- dot.border.size[[i1]] -lg.dot.border.color[[3]] <- dot.border.color[[i1]] # if dot.border.color == NULL -> NULL -if(plot == TRUE & fin.lg.disp[[3]] == TRUE & dot.shape[[3]] %in% 0:14 & ((length(dev.list()) > 0 & names(dev.cur()) == "windows") | (length(dev.list())== 0L & Sys.info()["sysname"] == "Windows"))){ # if any Graph device already open and this device is "windows", or if no Graph device opened yet and we are on windows system -> prevention of alpha legend bug on windows using value 1 -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") GRAPHIC DEVICE USED ON A WINDOWS SYSTEM ->\nTRANSPARENCY OF THE DOTS (DOT LAYER NUMBER ", point.count, ") IS INACTIVATED IN THE LEGEND TO PREVENT A WINDOWS DEPENDENT BUG (SEE https://github.com/tidyverse/ggplot2/issues/2452)\nTO OVERCOME THIS ON WINDOWS, USE ANOTHER DEVICE (pdf() FOR INSTANCE)") -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -lg.alpha[[3]] <- 1 # to avoid a bug on windows: if alpha argument is different from 1 for lines (transparency), then lines are not correctly displayed in the legend when using the R GUI (bug https://github.com/tidyverse/ggplot2/issues/2452). No bug when using a pdf -}else{ -lg.alpha[[3]] <- alpha[[i1]] -} -class.categ <- levels(factor(data1[[i1]][, categ[[i1]]])) -for(i5 in 1:length(color[[i1]])){ # or length(class.categ). It is the same because already checked that lengths are the same -tempo.data.frame <- data1[[i1]][data1[[i1]][, categ[[i1]]] == class.categ[i5], ] -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), eval(parse(text = scatter.kind[[i1]]))(data = tempo.data.frame, mapping = ggplot2::aes_string(x = x[[i1]], y = y[[i1]], stroke = categ[[i1]]), shape = dot.shape[[i1]], size = dot.size[[i1]], fill = color[[i1]][i5], stroke = dot.border.size[[i1]], color = if(dot.shape[[i1]] %in% 21:24 & ! is.null(dot.border.color)){dot.border.color[[i1]]}else{color[[i1]][i5]}, alpha = alpha[[i1]], show.legend = FALSE)) # WARNING: a single color allowed for color argument outside aesthetic, hence the loop # legend.show option do not remove the legend, only the aesthetic of the legend (dot, line, etc.). Used here to avoid multiple layers of legend which corrupt transparency -coord.names <- c(coord.names, paste0(geom[[i1]], ".", class.categ[i5])) -} -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::scale_discrete_manual(aesthetics = "stroke", name = if(is.null(legend.name)){NULL}else{legend.name[[i1]]}, values = rep(dot.border.size[[i1]], length(color[[i1]])), breaks = class.categ)) # values are the values of stroke, breaks reorder the classes according to class.categ in the legend. See guide_legend settings of scale_..._manual below -} -}else{ -line.count <- line.count + 1 -if(line.count== 1L){ -fin.lg.disp[[4]] <- legend.disp[[point.count + line.count]] -lg.order[[4]] <- point.count + line.count -lg.color[[4]] <- color[[i1]] # if color == NULL -> NULL -lg.line.size[[4]] <- line.size[[i1]] -lg.line.type[[4]] <- line.type[[i1]] -if(plot == TRUE & fin.lg.disp[[4]] == TRUE & ((length(dev.list()) > 0 & names(dev.cur()) == "windows") | (length(dev.list())== 0L & Sys.info()["sysname"] == "Windows"))){ # if any Graph device already open and this device is "windows", or if no Graph device opened yet and we are on windows system -> prevention of alpha legend bug on windows using value 1 -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") GRAPHIC DEVICE USED ON A WINDOWS SYSTEM ->\nTRANSPARENCY OF THE LINES (LINE LAYER NUMBER ", line.count, ") IS INACTIVATED IN THE LEGEND TO PREVENT A WINDOWS DEPENDENT BUG (SEE https://github.com/tidyverse/ggplot2/issues/2452)\nTO OVERCOME THIS ON WINDOWS, USE ANOTHER DEVICE (pdf() FOR INSTANCE)") -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -lg.alpha[[4]] <- 1 # to avoid a bug on windows: if alpha argument is different from 1 for lines (transparency), then lines are not correctly displayed in the legend when using the R GUI (bug https://github.com/tidyverse/ggplot2/issues/2452). No bug when using a pdf -}else{ -lg.alpha[[4]] <- alpha[[i1]] -} -class.categ <- levels(factor(data1[[i1]][, categ[[i1]]])) -for(i5 in 1:length(color[[i1]])){ # or length(class.categ). It is the same because already checked that lengths are the same -tempo.data.frame <- data1[[i1]][data1[[i1]][, categ[[i1]]] == class.categ[i5], ] -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), eval(parse(text = paste0("ggplot2::", # no CR here te0("ggpl -ifelse(geom[[i1]] == 'geom_stick', 'geom_segment', geom[[i1]]), # geom_segment because geom_stick converted to geom_segment for plotting -"(data = tempo.data.frame, mapping = ggplot2::aes(x = ", -x[[i1]], -ifelse(geom[[i1]] == 'geom_stick', ", yend = ", ", y = "), -y[[i1]], -if(geom[[i1]] == 'geom_stick'){paste0(', xend = ', x[[i1]], ', y = ', ifelse(is.null(geom.stick.base), y.lim[1], geom.stick.base[[i1]]))}, -", linetype = ", -categ[[i1]], -"), color = \"", -color[[i1]][i5], -"\", size = ", -line.size[[i1]], -ifelse(geom[[i1]] == 'geom_path', ', lineend = \"round\"', ''), -ifelse(geom[[i1]] == 'geom_step', paste0(', direction = \"', geom.step.dir[[i1]], '\"'), ''), -", alpha = ", -alpha[[i1]], -", show.legend = ", -ifelse(i5== 1L, TRUE, FALSE), -")" -)))) # WARNING: a single color allowed for color argument outside aesthetic, hence the loop # legend.show option do not remove the legend, only the aesthetic of the legend (dot, line, etc.). Used here to avoid multiple layers of legend which corrupt transparency -coord.names <- c(coord.names, paste0(geom[[i1]], ".", class.categ[i5])) -} -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::scale_discrete_manual(aesthetics = "linetype", name = if(is.null(legend.name)){NULL}else{legend.name[[i1]]}, values = rep(line.type[[i1]], length(color[[i1]])), breaks = class.categ)) # values are the values of linetype. 1 means solid. Regarding the alpha bug, I have tried different things without success: alpha in guide alone, in geom alone, in both, with different values, breaks reorder the classes according to class.categ in the legend -} -if(line.count== 2L){ -fin.lg.disp[[5]] <- legend.disp[[point.count + line.count]] -lg.order[[5]] <- point.count + line.count -lg.color[[5]] <- color[[i1]] # if color == NULL -> NULL -lg.line.size[[5]] <- line.size[[i1]] -lg.line.type[[5]] <- line.type[[i1]] -if(plot == TRUE & fin.lg.disp[[5]] == TRUE & ((length(dev.list()) > 0 & names(dev.cur()) == "windows") | (length(dev.list())== 0L & Sys.info()["sysname"] == "Windows"))){ # if any Graph device already open and this device is "windows", or if no Graph device opened yet and we are on windows system -> prevention of alpha legend bug on windows using value 1 -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") GRAPHIC DEVICE USED ON A WINDOWS SYSTEM ->\nTRANSPARENCY OF THE LINES (LINE LAYER NUMBER ", line.count, ") IS INACTIVATED IN THE LEGEND TO PREVENT A WINDOWS DEPENDENT BUG (SEE https://github.com/tidyverse/ggplot2/issues/2452)\nTO OVERCOME THIS ON WINDOWS, USE ANOTHER DEVICE (pdf() FOR INSTANCE)") -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -lg.alpha[[5]] <- 1 # to avoid a bug on windows: if alpha argument is different from 1 for lines (transparency), then lines are not correctly displayed in the legend when using the R GUI (bug https://github.com/tidyverse/ggplot2/issues/2452). No bug when using a pdf -}else{ -lg.alpha[[5]] <- alpha[[i1]] -} -class.categ <- levels(factor(data1[[i1]][, categ[[i1]]])) -for(i5 in 1:length(color[[i1]])){ # or length(class.categ). It is the same because already checked that lengths are the same -tempo.data.frame <- data1[[i1]][data1[[i1]][, categ[[i1]]] == class.categ[i5], ] -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), eval(parse(text = paste0("ggplot2::", # no CR here te0("ggpl -ifelse(geom[[i1]] == 'geom_stick', 'geom_segment', geom[[i1]]), # geom_segment because geom_stick converted to geom_segment for plotting -"(data = tempo.data.frame, mapping = ggplot2::aes(x = ", -x[[i1]], -ifelse(geom[[i1]] == 'geom_stick', ", yend = ", ", y = "), -y[[i1]], -if(geom[[i1]] == 'geom_stick'){paste0(', xend = ', x[[i1]], ', y = ', ifelse(is.null(geom.stick.base), y.lim[1], geom.stick.base[[i1]]))}, -", alpha = ", -categ[[i1]], -"), color = \"", -color[[i1]][i5], -"\", size = ", -line.size[[i1]], -", linetype = ", -ifelse(is.numeric(line.type[[i1]]), "", "\""), -line.type[[i1]], -ifelse(is.numeric(line.type[[i1]]), "", "\""), -ifelse(geom[[i1]] == 'geom_path', ', lineend = \"round\"', ''), -ifelse(geom[[i1]] == 'geom_step', paste0(', direction = \"', geom.step.dir[[i1]], '\"'), ''), -", show.legend = FALSE)" -)))) # WARNING: a single color allowed for color argument outside aesthetic, hence the loop # legend.show option do not remove the legend, only the aesthetic of the legend (dot, line, etc.). Used here to avoid multiple layers of legend which corrupt transparency -coord.names <- c(coord.names, paste0(geom[[i1]], ".", class.categ[i5])) -} -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::scale_discrete_manual(aesthetics = "alpha", name = if(is.null(legend.name)){NULL}else{legend.name[[i1]]}, values = rep(alpha[[i1]], length(color[[i1]])), breaks = class.categ)) # values are the values of linetype. 1 means solid. Regarding the alpha bug, I have tried different things without success: alpha in guide alone, in geom alone, in both, with different values, breaks reorder the classes according to class.categ in the legend -} -if(line.count== 3L){ -fin.lg.disp[[6]] <- legend.disp[[point.count + line.count]] -lg.order[[6]] <- point.count + line.count -lg.color[[6]] <- color[[i1]] # if color == NULL -> NULL -lg.line.size[[6]] <- line.size[[i1]] -lg.line.type[[6]] <- line.type[[i1]] -if(plot == TRUE & fin.lg.disp[[6]] == TRUE & ((length(dev.list()) > 0 & names(dev.cur()) == "windows") | (length(dev.list())== 0L & Sys.info()["sysname"] == "Windows"))){ # if any Graph device already open and this device is "windows", or if no Graph device opened yet and we are on windows system -> prevention of alpha legend bug on windows using value 1 -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") GRAPHIC DEVICE USED ON A WINDOWS SYSTEM ->\nTRANSPARENCY OF THE LINES (LINE LAYER NUMBER ", line.count, ") IS INACTIVATED IN THE LEGEND TO PREVENT A WINDOWS DEPENDENT BUG (SEE https://github.com/tidyverse/ggplot2/issues/2452)\nTO OVERCOME THIS ON WINDOWS, USE ANOTHER DEVICE (pdf() FOR INSTANCE)") -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -lg.alpha[[6]] <- 1 # to avoid a bug on windows: if alpha argument is different from 1 for lines (transparency), then lines are not correctly displayed in the legend when using the R GUI (bug https://github.com/tidyverse/ggplot2/issues/2452). No bug when using a pdf -}else{ -lg.alpha[[6]] <- alpha[[i1]] -} -class.categ <- levels(factor(data1[[i1]][, categ[[i1]]])) -for(i5 in 1:length(color[[i1]])){ # or length(class.categ). It is the same because already checked that lengths are the same -tempo.data.frame <- data1[[i1]][data1[[i1]][, categ[[i1]]] == class.categ[i5], ] -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), eval(parse(text = paste0("ggplot2::", # no CR here te0("ggpl -ifelse(geom[[i1]] == 'geom_stick', 'geom_segment', geom[[i1]]), # geom_segment because geom_stick converted to geom_segment for plotting -"(data = tempo.data.frame, mapping = ggplot2::aes(x = ", -x[[i1]], -ifelse(geom[[i1]] == 'geom_stick', ", yend = ", ", y = "), -y[[i1]], -if(geom[[i1]] == 'geom_stick'){paste0(', xend = ', x[[i1]], ', y = ', ifelse(is.null(geom.stick.base), y.lim[1], geom.stick.base[[i1]]))}, -", size = ", -categ[[i1]], -"), color = \"", -color[[i1]][i5], -"\", linetype = ", -ifelse(is.numeric(line.type[[i1]]), "", "\""), -line.type[[i1]], -ifelse(is.numeric(line.type[[i1]]), "", "\""), -ifelse(geom[[i1]] == 'geom_path', ', lineend = \"round\"', ''), -ifelse(geom[[i1]] == 'geom_step', paste0(', direction = \"', geom.step.dir[[i1]], '\"'), ''), -", alpha = ", -alpha[[i1]], -", show.legend = FALSE)" -)))) # WARNING: a single color allowed for color argument outside aesthetic, hence the loop # legend.show option do not remove the legend, only the aesthetic of the legend (dot, line, etc.). Used here to avoid multiple layers of legend which corrupt transparency -coord.names <- c(coord.names, paste0(geom[[i1]], ".", class.categ[i5])) -} -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::scale_discrete_manual(aesthetics = "size", name = if(is.null(legend.name)){NULL}else{legend.name[[i1]]}, values = rep(line.size[[i1]], length(color[[i1]])), breaks = class.categ)) # values are the values of linetype. 1 means solid. Regarding the alpha bug, I have tried different things without success: alpha in guide alone, in geom alone, in both, breaks reorder the classes according to class.categ in the legend -} -} -} -# end loop part +# add density +# rasterise all kind: https://cran.r-project.org/web/packages/ggrastr/vignettes/Raster_geoms.html +# log not good: do not convert as in boxplot -# legend display -tempo.legend.final <- 'ggplot2::guides( +fun_gg_scatter <- function( + data1, + x, + y, + categ = NULL, + categ.class.order = NULL, + color = NULL, + geom = "geom_point", + geom.step.dir = "hv", + geom.stick.base = NULL, + alpha = 0.5, + dot.size = 2, + dot.shape = 21, + dot.border.size = 0.5, + dot.border.color = NULL, + line.size = 0.5, + line.type = "solid", + x.lim = NULL, + x.lab = NULL, + x.log = "no", + x.tick.nb = NULL, + x.second.tick.nb = NULL, + x.include.zero = FALSE, + x.left.extra.margin = 0.05, + x.right.extra.margin = 0.05, + x.text.angle = 0, + y.lim = NULL, + y.lab = NULL, + y.log = "no", + y.tick.nb = NULL, + y.second.tick.nb = NULL, + y.include.zero = FALSE, + y.top.extra.margin = 0.05, + y.bottom.extra.margin = 0.05, + y.text.angle = 0, + raster = FALSE, + raster.ratio = 1, + raster.threshold = NULL, + text.size = 12, + title = "", + title.text.size = 12, + legend.show = TRUE, + legend.width = 0.5, + legend.name = NULL, + article = TRUE, + grid = FALSE, + add = NULL, + return = FALSE, + return.ggplot = FALSE, + return.gtable = TRUE, + plot = TRUE, + warn.print = FALSE, + lib.path = NULL +){ + # AIM + # Plot ggplot2 scatterplot with the possibility to overlay dots from up to 3 different data frames (-> three different legends) and lines from up to 3 different data frames (-> three different legends) -> up to 6 overlays totally + # For ggplot2 specifications, see: https://ggplot2.tidyverse.org/articles/ggplot2-specs.html + # WARNINGS + # Rows containing NA in data1[, c(x, y, categ)] will be removed before processing, with a warning (see below) + # Size arguments (dot.size, dot.border.size, line.size, text.size and title.text.size) are in mm. See Hadley comment in https://stackoverflow.com/questions/17311917/ggplot2-the-unit-of-size. See also http://sape.inf.usi.ch/quick-reference/ggplot2/size). Unit object are not accepted, but conversion can be used (e.g., grid::convertUnit(grid::unit(0.2, "inches"), "mm", valueOnly = TRUE)) + # ARGUMENTS + # data1: a dataframe compatible with ggplot2, or a list of data frames. Order matters for the order of the legend and for the layer staking (starting from below to top) + # x: single character string of the data1 column name for x-axis coordinates. If data1 is a list, then x must be a list of single character strings, of same size as data1, with compartment 1 related to compartment 1 of data1, etc. Write NULL for each "geom_hline" in geom argument + # y: single character string of the data1 column name for y-axis coordinates. If data1 is a list, then y must be a list of single character strings, of same size as data1, with compartment 1 related to compartment 1 of data1, etc. Write NULL for each "geom_vline" in geom argument + # categ: either NULL or a single character string or a list of single character strings, indicating the data1 column names to use for categories which creates legend display + # If categ == NULL, no categories -> no legend displayed + # If data1 is a data frame, categ must be a single character string of the data1 column name for categories + # If data1 is a list, then categ must be a list of single character strings, of same size as data1, with compartment 1 related to compartment 1 of data1, etc. Some of the list compartments can be NULL (no legend display for these compartments), and other not + # categ.class.order: either (1) NULL or (2) a vector of character strings or (3) a list of these vectors, setting the order of the classes of categ in the legend display + # If categ.class.order is NULL, classes are represented according to the alphabetical order + # If data1 is a data frame, categ.class.order must be a vector of character strings specifying the different classes in the categ column name of data1 + # If data1 is a list, then categ.class.order must be a list of vector of character strings, of same size as data1, with compartment 1 related to compartment 1 of data1, etc. Some of the list compartments can be NULL (alphabetical order for these compartments), and other not + # color: either (1) NULL, or (2) a vector of character strings or integers, or (3) a list of vectors of character strings or integers + # If color is NULL, default colors of ggplot2 + # If data1 is a data frame, color argument can be either: + # (1) a single color string. All the dots of the corresponding data1 will have this color, whatever the categ value (NULL or not) + # (2) if categ is non-null, a vector of string colors, one for each class of categ. Each color will be associated according to the categ.class.order argument if specified, or to the alphabetical order of categ classes otherwise + # (3) if categ is non-null, a vector or factor of string colors, like if it was one of the column of data1 data frame. WARNING: a single color per class of categ and a single class of categ per color must be respected + # Positive integers are also accepted instead of character strings, as long as above rules about length are respected. Integers will be processed by fun_gg_palette() using the max integer value among all the integers in color (see fun_gg_palette()) + # If data1 is a list, then color argument must be either: + # (1) a list of character strings or integers, of same size as data1, with compartment 1 related to compartment 1 of data1, etc. + # (2) a single character string or a single integer + # With a list (first possibility), the rules described for when data1 is a data frame apply to each compartment of the list. Some of the compartments can be NULL. In that case, a different grey color will be used for each NULL compartment. With a single value (second possibility), the same color will be used for all the dots and lines, whatever the data1 list + # geom: single character string of the kind of plot, or a list of single character strings + # Either: + # "geom_point" (scatterplot) + # "geom_line" (coordinates plotted then line connection, from the lowest to highest x coordinates first and from the lowest to highest y coordinates thenafter) + # "geom_path" (coordinates plotted then line connection respecting the row order in data1) + # "geom_step" coordinates plotted then line connection respecting the row order in data1 but drawn in steps). See the geom.step.dir argument + # "geom_hline" (horizontal line, no x value provided) + # "geom_vline" (vertical line, no y value provided) + # "geom_stick" (dots as vertical bars) + # If data1 is a list, then geom must be either: + # (1) a list of single character strings, of same size as data1, with compartment 1 related to compartment 1 of data1, etc. + # (2) a single character string. In that case the same kind of plot will apply for the different compartments of the data1 list + # WARNING concerning "geom_hline" or "geom_vline": + # (1) x or y argument must be NULL, respectively + # (2) x.lim or y.lim argument must NOT be NULL, respectively, if only these kind of lines are drawn (if other geom present, then x.lim = NULL and y.lim = NULL will generate x.lim and y.lim defined by these other geom, which is not possible with "geom_hline" or "geom_vline" alone) + # (3) the function will draw n lines for n values in the x argument column name of the data1 data frame. If several colors required, the categ argument must be specified and the corresponding categ column name must exist in the data1 data frame with a different class name for each row + # geom.step.dir: single character string indicating the direction when using "geom_step" of the geom argument, or a list of single character strings + # Either: + # "vh" (vertical then horizontal) + # "hv" (horizontal then vertical) + # "mid" (step half-way between adjacent x-values) + # See https://ggplot2.tidyverse.org/reference/geom_path.html + # If data1 is a list, then geom.step.dir must be either: + # (1) a list of single character strings, of same size as data1, with compartment 1 related to compartment 1 of data1, etc. The value in compartments related to other geom values than "geom_step" will be ignored + # (2) a single character string, which will be used for all the "geom_step" values of the geom argument, whatever the data1 list + # geom.stick.base: either (1) NULL or (2) a single numeric value or (3) a list of single numeric values, setting the base of the sticks when using "geom_stick" of the geom argument + # If geom.stick.base is NULL, the bottom limit of the y-axis is taken as the base + # If data1 is a list, then geom.stick.base must be either (1) a list of single numeric values, of same size as data1, with compartment 1 related to compartment 1 of data1, etc., or (2) a single numeric value. With a list (former possibility), the values in compartments related to other geom values than "geom_stick" will be ignored. With a single value (latter possibility), the same base will be used for all the sticks, whatever the data1 list + # Warning: the y-axis limits are not modified by the value of geom.stick.base, meaning that this value can be outside of the range of y.lim. Add the value of geom.stick.base also in the y.lim argument if required + # Warning: if geom.stick.base is NULL, the bottom limit of the y-axis is taken as the base. Thus, be careful with inverted y-axis + # alpha: single numeric value (from 0 to 1) of transparency. If data1 is a list, then alpha must be either (1) a list of single numeric values, of same size as data1, with compartment 1 related to compartment 1 of data1, etc., or (2) a single numeric value. In that case the same transparency will apply for the different compartments of the data1 list + # dot.size: single numeric value of dot shape radius? in mm. If data1 is a list, then dot.size must be either (1) a list of single numeric values, of same size as data1, with compartment 1 related to compartment 1 of data1, etc., or (2) a single numeric value. With a list (former possibility), the value in compartments related to lines will be ignored. With a single value (latter possibility), the same dot.size will be used for all the dots, whatever the data1 list + # dot.shape: value indicating the shape of the dots (see https://ggplot2.tidyverse.org/articles/ggplot2-specs.html) If data1 is a list, then dot.shape must be either (1) a list of single shape values, of same size as data1, with compartment 1 related to compartment 1 of data1, etc., or (2) a single shape value. With a list (former possibility), the value in compartments related to lines will be ignored. With a single value (latter possibility), the same dot.shape will be used for all the dots, whatever the data1 list + # dot.border.size: single numeric value of border dot width in mm. Write zero for no dot border. If data1 is a list, then dot.border.size must be either (1) a list of single numeric values, of same size as data1, with compartment 1 related to compartment 1 of data1, etc., or (2) a single numeric value. With a list (former possibility), the value in compartments related to lines will be ignored. With a single value (latter possibility), the same dot.border.size will be used for all the dots, whatever the data1 list + # dot.border.color: single character color string defining the color of the dot border (same border color for all the dots, whatever their categories). If dot.border.color == NULL, the border color will be the same as the dot color. A single integer is also accepted instead of a character string, that will be processed by fun_gg_palette() + # line.size: single numeric value of line width in mm. If data1 is a list, then line.size must be either (1) a list of single numeric values, of same size as data1, with compartment 1 related to compartment 1 of data1, etc., or (2) a single numeric value. With a list (former possibility), the value in compartments related to dots will be ignored. With a single value (latter possibility), the same line.size will be used for all the lines, whatever the data1 list + # line.type: value indicating the kind of lines (see https://ggplot2.tidyverse.org/articles/ggplot2-specs.html) If data1 is a list, then line.type must be either (1) a list of single line kind values, of same size as data1, with compartment 1 related to compartment 1 of data1, etc., or (2) a single line kind value. With a list (former possibility), the value in compartments related to dots will be ignored. With a single value (latter possibility), the same line.type will be used for all the lines, whatever the data1 list + # x.lim: 2 numeric values setting the x-axis range. Order of the 2 values matters (for inverted axis). If NULL, the range of the x column name of data1 will be used + # x.lab: a character string or expression for x-axis label. If NULL, will use the first value of x (x column name of the first data frame in data1). Warning message if the elements in x are different between data frames in data1 + # x.log: either "no", "log2" (values in the x column name of the data1 data frame will be log2 transformed and x-axis will be log2 scaled) or "log10" (values in the x column name of the data1 data frame will be log10 transformed and x-axis will be log10 scaled) + # x.tick.nb: approximate number of desired values labeling the x-axis (i.e., main ticks, see the n argument of the the cute::fun_scale() function). If NULL and if x.log is "no", then the number of labeling values is set by ggplot2. If NULL and if x.log is "log2" or "log10", then the number of labeling values corresponds to all the exposant integers in the x.lim range (e.g., 10^1, 10^2 and 10^3, meaning 3 main ticks for x.lim = c(9, 1200)). WARNING: if non-NULL and if x.log is "log2" or "log10", labeling can be difficult to read (e.g., ..., 10^2, 10^2.5, 10^3, ...) + # x.second.tick.nb: number of desired secondary ticks between main ticks. Ignored if x.log is other than "no" (log scale plotted). Use argument return = TRUE and see $plot$x.second.tick.values to have the values associated to secondary ticks. IF NULL, no secondary ticks + # x.include.zero: logical. Does x.lim range include 0? Ignored if x.log is "log2" or "log10" + # x.left.extra.margin: single proportion (between 0 and 1) indicating if extra margins must be added to x.lim. If different from 0, add the range of the axis multiplied by x.left.extra.margin (e.g., abs(x.lim[2] - x.lim[1]) * x.left.extra.margin) to the left of x-axis + # x.right.extra.margin: idem as x.left.extra.margin but to the right of x-axis + # x.text.angle: integer value of the text angle for the x-axis labeling values, using the same rules as in ggplot2. Use positive value for clockwise rotation: 0 for horizontal, 90 for vertical, 180 for upside down etc. Use negative values for counterclockwise rotation: 0 for horizontal, -90 for vertical, -180 for upside down etc. + # y.lim: 2 numeric values setting the y-axis range. Order of the 2 values matters (for inverted axis). If NULL, the range of the y column name of data1 will be used + # y.lab: a character string or expression for y-axis label. If NULL, will use the first value of y (y column name of the first data frame in data1). Warning message if the elements in y are different between data frames in data1 + # y.log: either "no", "log2" (values in the y column name of the data1 data frame will be log2 transformed and y-axis will be log2 scaled) or "log10" (values in the y column name of the data1 data frame will be log10 transformed and y-axis will be log10 scaled) + # y.tick.nb: approximate number of desired values labeling the y-axis (i.e., main ticks, see the n argument of the the cute::fun_scale() function). If NULL and if y.log is "no", then the number of labeling values is set by ggplot2. If NULL and if y.log is "log2" or "log10", then the number of labeling values corresponds to all the exposant integers in the y.lim range (e.g., 10^1, 10^2 and 10^3, meaning 3 main ticks for y.lim = c(9, 1200)). WARNING: if non-NULL and if y.log is "log2" or "log10", labeling can be difficult to read (e.g., ..., 10^2, 10^2.5, 10^3, ...) + # y.second.tick.nb: number of desired secondary ticks between main ticks. Ignored if y.log is other than "no" (log scale plotted). Use argument return = TRUE and see $plot$y.second.tick.values to have the values associated to secondary ticks. IF NULL, no secondary ticks + # y.include.zero: logical. Does y.lim range include 0? Ignored if y.log is "log2" or "log10" + # y.top.extra.margin: single proportion (between 0 and 1) indicating if extra margins must be added to y.lim. If different from 0, add the range of the axis multiplied by y.top.extra.margin (e.g., abs(y.lim[2] - y.lim[1]) * y.top.extra.margin) to the top of y-axis + # y.bottom.extra.margin: idem as y.top.extra.margin but to the bottom of y-axis + # y.text.angle: integer value of the text angle for the y-axis labeling values, using the same rules as in ggplot2. Use positive value for clockwise rotation: 0 for horizontal, 90 for vertical, 180 for upside down etc. Use negative values for counterclockwise rotation: 0 for horizontal, -90 for vertical, -180 for upside down etc. + # raster: logical. Dots in raster mode? If FALSE, dots from each "geom_point" from geom argument are plotted in vectorial mode (bigger pdf and long to display if lots of dots). If TRUE, dots from each "geom_point" from geom argument are plotted in matricial mode (smaller pdf and easy display if lots of dots, but it takes time to generate the layer). If TRUE, the raster.ratio argument is used to avoid an ellipsoid representation of the dots. If TRUE, solve the transparency problem with some GUI. Overriden by the non-NULL raster.threshold argument + # raster.ratio: single numeric value indicating the height / width ratio of the graphic device used (for instance provided by the $dim compartment in the output of the fun_open() function). The default value is 1 because by default R opens a square graphic device. But this argument has to be set when using other device dimensions. Ignored if raster == FALSE + # raster.threshold: positive integer value indicating the limit of the dot number above which "geom_point" layers from the geom argument switch from vectorial mode to matricial mode (see the raster argument). If any layer is matricial, then the raster.ratio argument is used to avoid an ellipsoid representation of the dots. If non-NULL, it overrides the raster argument + # text.size: numeric value of the font size of the (1) axis numbers and axis legends and (2) texts in the graphic legend (in mm) + # title: character string of the graph title + # title.text.size: numeric value of the title font size in mm + # legend.show: logical. Show legend? Not considered if categ argument is NULL, because this already generate no legend, excepted if legend.width argument is non-NULL. In that specific case (categ is NULL, legend.show is TRUE and legend.width is non-NULL), an empty legend space is created. This can be useful when desiring graphs of exactly the same width, whatever they have legends or not + # legend.width: single proportion (between 0 and 1) indicating the relative width of the legend sector (on the right of the plot) relative to the width of the plot. Value 1 means that the window device width is split in 2, half for the plot and half for the legend. Value 0 means no room for the legend, which will overlay the plot region. Write NULL to inactivate the legend sector. In such case, ggplot2 will manage the room required for the legend display, meaning that the width of the plotting region can vary between graphs, depending on the text in the legend + # legend.name: character string of the legend title. If legend.name is NULL and categ argument is not NULL, then legend.name <- categ. If data1 is a list, then legend.name must be a list of character strings, of same size as data1, with compartment 1 related to compartment 1 of data1, etc. Some of the list compartments can be NULL, and other not + # article: logical. If TRUE, use an article theme (article like). If FALSE, use a classic related ggplot theme. Use the add argument (e.g., add = "+ggplot2::theme_classic()" for the exact classic ggplot theme + # grid: logical. Draw lines in the background to better read the box values? Not considered if article == FALSE (grid systematically present) + # add: character string allowing to add more ggplot2 features (dots, lines, themes, facet, etc.). Ignored if NULL + # WARNING: (1) the string must start with "+", (2) the string must finish with ")" and (3) each function must be preceded by "ggplot2::". Example: "+ ggplot2::coord_flip() + ggplot2::theme_bw()" + # If the character string contains the "ggplot2::theme" string, then the article argument of fun_gg_scatter() (see above) is ignored with a warning + # Handle the add argument with caution since added functions can create conflicts with the preexisting internal ggplot2 functions + # WARNING: the call of objects inside the quotes of add can lead to an error if the name of these objects are some of the fun_gg_scatter() arguments. Indeed, the function will use the internal argument instead of the global environment object. Example article <- "a" in the working environment and add = '+ ggplot2::ggtitle(article)'. The risk here is to have TRUE as title. To solve this, use add = '+ ggplot2::ggtitle(get("article", envir = .GlobalEnv))' + # return: logical. Return the graph parameters? + # return.ggplot: logical. Return the ggplot object in the output list? Ignored if return argument is FALSE. WARNING: always assign the fun_gg_scatter() function (e.g., a <- fun_gg_scatter()) if return.ggplot argument is TRUE, otherwise, double plotting is performed. See $ggplot in the RETURN section below for more details + # return.gtable: logical. Return the ggplot object as gtable of grobs in the output list? Ignored if plot argument is FALSE. Indeed, the graph must be plotted to get the grobs dispositions. See $gtable in the RETURN section below for more details + # plot: logical. Plot the graphic? If FALSE and return argument is TRUE, graphical parameters and associated warnings are provided without plotting + # warn.print: logical. Print warnings at the end of the execution? ? If FALSE, warning messages are never printed, but can still be recovered in the returned list. Some of the warning messages (those delivered by the internal ggplot2 functions) are not apparent when using the argument plot = FALSE + # lib.path: character string indicating the absolute path of the required packages (see below). if NULL, the function will use the R library default folders + # RETURN + # a scatter plot if plot argument is TRUE + # a list of the graph info if return argument is TRUE: + # $data: the initial data with graphic information added. WARNING: if the x.log or y.log argument is not "no", x or y argument column of the data1 data frame are log2 or log10 converted in $data, respectively. Use 2^values or 10^$values to recover the initial values + # $removed.row.nb: a list of the removed rows numbers in data frames (because of NA). NULL if no row removed + # $removed.rows: a list of the removed rows in data frames (because of NA). NULL if no row removed + # $plot: the graphic box and dot coordinates + # $dots: dot coordinates + # y.second.tick.positions: coordinates of secondary ticks (only if y.second.tick.nb argument is non-null or if y.log argument is different from "no") + # y.second.tick.values: values of secondary ticks. NULL except if y.second.tick.nb argument is non-null or if y.log argument is different from "no") + # $panel: the variable names used for the panels (NULL if no panels). WARNING: NA can be present according to ggplot2 upgrade to v3.3.0 + # $axes: the x-axis and y-axis info + # $warn: the warning messages. Use cat() for proper display. NULL if no warning. WARNING: warning messages delivered by the internal ggplot2 functions are not apparent when using the argument plot = FALSE + # $ggplot: ggplot object that can be used for reprint (use print($ggplot) or update (use $ggplot + ggplot2::...). NULL if return.ggplot argument is FALSE. Of note, a non-null $ggplot in the output list is sometimes annoying as the manipulation of this list prints the plot + # $gtable: gtable object that can be used for reprint (use gridExtra::grid.arrange(...$ggplot) or with additionnal grobs (see the grob decomposition in the examples). NULL if return.ggplot argument is FALSE. Contrary to $ggplot, a non-NULL $gtable in the output list is not annoying as the manipulation of this list does not print the plot + # REQUIRED PACKAGES + # ggplot2 + # gridExtra + # lemon (in case of use in the add argument) + # scales + # if raster plots are drawn (see the raster and raster.threshold arguments): + # Cairo + # grid + # REQUIRED FUNCTIONS FROM THE cute PACKAGE + # fun_gg_empty_graph() + # fun_gg_palette() + # fun_gg_point_rast() + # fun_pack() + # fun_check() + # fun_round() + # fun_scale() + # fun_inter_ticks() + # EXAMPLES + # set.seed(1) ; obs1 <- data.frame(Km = c(2, 1, 6, 5, 4, 7), Time = c(2, 1, 6, 5, 4, 7)^2, Car = c("TUUT", "TUUT", "TUUT", "WIIM", "WIIM", "WIIM"), Color1 = rep(c("coral", "lightblue"), each = 3), stringsAsFactors = TRUE) ; fun_gg_scatter(data1 = obs1, x = "Km", y = "Time") + # DEBUGGING + # set.seed(1) ; obs1 <- data.frame(km = rnorm(1000, 10, 3), time = rnorm(1000, 10, 3), group1 = rep(c("A1", "A2"), 500), stringsAsFactors = TRUE) ; obs2 <-data.frame(km = rnorm(1000, 15, 3), time = rnorm(1000, 15, 3), group2 = rep(c("G1", "G2"), 500), stringsAsFactors = TRUE) ; set.seed(NULL) ; obs1$km[2:3] <- NA ; data1 = list(L1 = obs1, L2 = obs2) ; x = list(L1 = "km", L2 = "km") ; y = list(L1 = "time", L2 = "time") ; categ = list(L1 = "group1", L2 = "group2") ; categ = NULL ; categ.class.order = NULL ; color = NULL ; geom = "geom_point" ; geom.step.dir = "hv" ; geom.stick.base = NULL, alpha = 0.5 ; dot.size = 2 ; dot.shape = 21 ; dot.border.size = 0.5 ; dot.border.color = NULL ; line.size = 0.5 ; line.type = "solid" ; x.lim = NULL ; x.lab = NULL ; x.log = "no" ; x.tick.nb = NULL ; x.second.tick.nb = NULL ; x.include.zero = FALSE ; x.left.extra.margin = 0.05 ; x.right.extra.margin = 0.05 ; x.text.angle = 0 ; y.lim = NULL ; y.lab = NULL ; y.log = "no" ; y.tick.nb = NULL ; y.second.tick.nb = NULL ; y.include.zero = FALSE ; y.top.extra.margin = 0.05 ; y.bottom.extra.margin = 0.05 ; y.text.angle = 0 ; raster = FALSE ; raster.ratio = 1 ; raster.threshold = NULL ; text.size = 12 ; title = "" ; title.text.size = 12 ; legend.show = TRUE ; legend.width = 0.5 ; legend.name = NULL ; article = TRUE ; grid = FALSE ; add = NULL ; return = FALSE ; return.ggplot = FALSE ; return.gtable = TRUE ; plot = TRUE ; warn.print = FALSE ; lib.path = NULL + # function name + function.name <- paste0(as.list(match.call(expand.dots=FALSE))[[1]], "()") + arg.names <- names(formals(fun = sys.function(sys.parent(n = 2)))) # names of all the arguments + arg.user.setting <- as.list(match.call(expand.dots=FALSE))[-1] # list of the argument settings (excluding default values not provided by the user) + # end function name + # required function checking + req.function <- c( + "fun_check", + "fun_gg_just", + "fun_gg_empty_graph", + "fun_gg_palette", + "fun_gg_point_rast", + "fun_round", + "fun_pack", + "fun_scale", + "fun_inter_ticks" + ) + tempo <- NULL + for(i1 in req.function){ + if(length(find(i1, mode = "function"))== 0L){ + tempo <- c(tempo, i1) + } + } + if( ! is.null(tempo)){ + tempo.cat <- paste0("ERROR IN ", function.name, "\nREQUIRED cute FUNCTION", ifelse(length(tempo) > 1, "S ARE", " IS"), " MISSING IN THE R ENVIRONMENT:\n", paste0(tempo, collapse = "()\n")) + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n"), call. = FALSE) # == in stop() to be able to add several messages between == + } + # end required function checking + # reserved words to avoid bugs (used in this function) + reserved.words <- c("fake_x", "fake_y", "fake_categ") + # end reserved words to avoid bugs (used in this function) + # arg with no default values + mandat.args <- c( + "data1", + "x", + "y" + ) + tempo <- eval(parse(text = paste0("missing(", paste0(mandat.args, collapse = ") | missing("), ")"))) + if(any(tempo)){ + tempo.cat <- paste0("ERROR IN ", function.name, "\nFOLLOWING ARGUMENT", ifelse(length(mandat.args) > 1, "S HAVE", "HAS"), " NO DEFAULT VALUE AND REQUIRE ONE:\n", paste0(mandat.args, collapse = "\n")) + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n"), call. = FALSE) # == in stop() to be able to add several messages between == + } + # end arg with no default values + # argument primary checking + arg.check <- NULL # + text.check <- NULL # + checked.arg.names <- NULL # for function debbuging: used by r_debugging_tools + ee <- expression(arg.check <- c(arg.check, tempo$problem) , text.check <- c(text.check, tempo$text) , checked.arg.names <- c(checked.arg.names, tempo$object.name)) + tempo1 <- fun_check(data = data1, class = "data.frame", na.contain = TRUE, fun.name = function.name) + tempo2 <- fun_check(data = data1, class = "list", na.contain = TRUE, fun.name = function.name) + checked.arg.names <- c(checked.arg.names, tempo2$object.name) + if(tempo1$problem == TRUE & tempo2$problem == TRUE){ + tempo.cat <- paste0("ERROR IN ", function.name, ": data1 ARGUMENT MUST BE A DATA FRAME OR A LIST OF DATA FRAMES") + text.check <- c(text.check, tempo.cat) + arg.check <- c(arg.check, TRUE) + } + if( ! is.null(x)){ + tempo1 <- fun_check(data = x, class = "vector", mode = "character", na.contain = TRUE, length = 1, fun.name = function.name) + tempo2 <- fun_check(data = x, class = "list", na.contain = TRUE, fun.name = function.name) + checked.arg.names <- c(checked.arg.names, tempo2$object.name) + if(tempo1$problem == TRUE & tempo2$problem == TRUE){ + tempo.cat <- paste0("ERROR IN ", function.name, ": x ARGUMENT MUST BE A SINGLE CHARACTER STRING OR A LIST OF CHARACTER STRINGS") + text.check <- c(text.check, tempo.cat) + arg.check <- c(arg.check, TRUE) + } + }else{ + # no fun_check test here, it is just for checked.arg.names + tempo <- fun_check(data = x, class = "vector") + checked.arg.names <- c(checked.arg.names, tempo$object.name) + } + if( ! is.null(y)){ + tempo1 <- fun_check(data = y, class = "vector", mode = "character", na.contain = TRUE, length = 1, fun.name = function.name) + tempo2 <- fun_check(data = y, class = "list", na.contain = TRUE, fun.name = function.name) + checked.arg.names <- c(checked.arg.names, tempo2$object.name) + if(tempo1$problem == TRUE & tempo2$problem == TRUE){ + tempo.cat <- paste0("ERROR IN ", function.name, ": y ARGUMENT MUST BE A SINGLE CHARACTER STRING OR A LIST OF CHARACTER STRINGS") + text.check <- c(text.check, tempo.cat) + arg.check <- c(arg.check, TRUE) + } + }else{ + # no fun_check test here, it is just for checked.arg.names + tempo <- fun_check(data = y, class = "vector") + checked.arg.names <- c(checked.arg.names, tempo$object.name) + } + if( ! is.null(categ)){ + tempo1 <- fun_check(data = categ, class = "vector", mode = "character", length = 1, fun.name = function.name) + tempo2 <- fun_check(data = categ, class = "list", na.contain = TRUE, fun.name = function.name) + checked.arg.names <- c(checked.arg.names, tempo2$object.name) + if(tempo1$problem == TRUE & tempo2$problem == TRUE){ + tempo.cat <- paste0("ERROR IN ", function.name, ": categ ARGUMENT MUST BE A SINGLE CHARACTER STRING OR A LIST OF CHARACTER STRINGS") + text.check <- c(text.check, tempo.cat) + arg.check <- c(arg.check, TRUE) + } + }else{ + # no fun_check test here, it is just for checked.arg.names + tempo <- fun_check(data = categ, class = "vector") + checked.arg.names <- c(checked.arg.names, tempo$object.name) + } + if( ! is.null(categ.class.order)){ + if(is.null(categ)){ + tempo.cat <- paste0("ERROR IN ", function.name, ": categ.class.order ARGUMENT IS NOT NULL, BUT categ IS") + text.check <- c(text.check, tempo.cat) + arg.check <- c(arg.check, TRUE) + } + tempo1 <- fun_check(data = categ.class.order, class = "vector", mode = "character", fun.name = function.name) + tempo2 <- fun_check(data = categ.class.order, class = "list", na.contain = TRUE, fun.name = function.name) + checked.arg.names <- c(checked.arg.names, tempo2$object.name) + if(tempo1$problem == TRUE & tempo2$problem == TRUE){ + tempo.cat <- paste0("ERROR IN ", function.name, ": categ.class.order ARGUMENT MUST BE A VECTOR OF CHARACTER STRINGS OR A LIST OF VECTOR OF CHARACTER STRINGS") + text.check <- c(text.check, tempo.cat) + arg.check <- c(arg.check, TRUE) + } + }else{ + # no fun_check test here, it is just for checked.arg.names + tempo <- fun_check(data = categ.class.order, class = "vector") + checked.arg.names <- c(checked.arg.names, tempo$object.name) + } + if( ! is.null(legend.name)){ + tempo1 <- fun_check(data = legend.name, class = "vector", mode = "character", na.contain = TRUE, length = 1, fun.name = function.name) + tempo2 <- fun_check(data = legend.name, class = "list", na.contain = TRUE, fun.name = function.name) + checked.arg.names <- c(checked.arg.names, tempo2$object.name) + if(tempo1$problem == TRUE & tempo2$problem == TRUE){ + tempo.cat <- paste0("ERROR IN ", function.name, ": legend.name ARGUMENT MUST BE A SINGLE CHARACTER STRING OR A LIST OF CHARACTER STRINGS") + text.check <- c(text.check, tempo.cat) + arg.check <- c(arg.check, TRUE) + } + }else{ + # no fun_check test here, it is just for checked.arg.names + tempo <- fun_check(data = legend.name, class = "vector") + checked.arg.names <- c(checked.arg.names, tempo$object.name) + } + if( ! is.null(color)){ + tempo1 <- fun_check(data = color, class = "vector", mode = "character", na.contain = TRUE, fun.name = function.name) + tempo2 <- fun_check(data = color, class = "factor", na.contain = TRUE, fun.name = function.name) + tempo3 <- fun_check(data = color, class = "integer", double.as.integer.allowed = TRUE, na.contain = TRUE, fun.name = function.name) + tempo4 <- fun_check(data = color, class = "list", na.contain = TRUE, fun.name = function.name) + checked.arg.names <- c(checked.arg.names, tempo4$object.name) + if(tempo1$problem == TRUE & tempo2$problem == TRUE & tempo3$problem == TRUE & tempo4$problem == TRUE){ + tempo.cat <- paste0("ERROR IN ", function.name, ": color ARGUMENT MUST BE A VECTOR (OF CHARACTER STRINGS OR INTEGERS) OR A FACTOR OR A LIST OF THESE POSSIBILITIES") + text.check <- c(text.check, tempo.cat) + arg.check <- c(arg.check, TRUE) + } + }else{ + # no fun_check test here, it is just for checked.arg.names + tempo <- fun_check(data = color, class = "vector") + checked.arg.names <- c(checked.arg.names, tempo$object.name) + } + tempo1 <- fun_check(data = geom, class = "vector", mode = "character", na.contain = FALSE, length = 1, fun.name = function.name) + tempo2 <- fun_check(data = geom, class = "list", na.contain = TRUE, fun.name = function.name) + checked.arg.names <- c(checked.arg.names, tempo2$object.name) + if(tempo1$problem == TRUE & tempo2$problem == TRUE){ + tempo.cat <- paste0("ERROR IN ", function.name, ": geom ARGUMENT MUST BE A SINGLE CHARACTER STRING OR A LIST OF CHARACTER STRINGS") + text.check <- c(text.check, tempo.cat) + arg.check <- c(arg.check, TRUE) + } + tempo1 <- fun_check(data = geom.step.dir, options = c("vh", "hv", "mid"), na.contain = FALSE, length = 1, fun.name = function.name) + tempo2 <- fun_check(data = geom.step.dir, class = "list", na.contain = TRUE, fun.name = function.name) + checked.arg.names <- c(checked.arg.names, tempo2$object.name) + if(tempo1$problem == TRUE & tempo2$problem == TRUE){ + tempo.cat <- paste0("ERROR IN ", function.name, ": geom.step.dir ARGUMENT MUST BE A SINGLE CHARACTER STRING (\"vh\" OR \"hv\" OR \"mid\") OR A LIST OF THESE CHARACTER STRINGS") + text.check <- c(text.check, tempo.cat) + arg.check <- c(arg.check, TRUE) + } + if( ! is.null(geom.stick.base)){ + tempo1 <- fun_check(data = geom.stick.base, class = "vector", mode = "numeric", na.contain = FALSE, length = 1, fun.name = function.name) + tempo2 <- fun_check(data = color, class = "list", na.contain = TRUE, fun.name = function.name) + checked.arg.names <- c(checked.arg.names, tempo2$object.name) + if(tempo1$problem == TRUE & tempo2$problem == TRUE){ + tempo.cat <- paste0("ERROR IN ", function.name, ": geom.stick.base ARGUMENT MUST BE A SINGLE NUMERIC VALUE OR A LIST OF SINGLE NUMERIC VALUES") + text.check <- c(text.check, tempo.cat) + arg.check <- c(arg.check, TRUE) + } + }else{ + # no fun_check test here, it is just for checked.arg.names + tempo <- fun_check(data = geom.stick.base, class = "vector") + checked.arg.names <- c(checked.arg.names, tempo$object.name) + } + tempo1 <- fun_check(data = alpha, prop = TRUE, length = 1, fun.name = function.name) + tempo2 <- fun_check(data = alpha, class = "list", na.contain = TRUE, fun.name = function.name) + checked.arg.names <- c(checked.arg.names, tempo2$object.name) + if(tempo1$problem == TRUE & tempo2$problem == TRUE){ + tempo.cat <- paste0("ERROR IN ", function.name, ": alpha ARGUMENT MUST BE A SINGLE NUMERIC VALUE BETWEEN 0 AND 1 OR A LIST OF SUCH VALUES") + text.check <- c(text.check, tempo.cat) + arg.check <- c(arg.check, TRUE) + } + tempo1 <- fun_check(data = dot.size, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) + tempo2 <- fun_check(data = dot.size, class = "list", na.contain = TRUE, fun.name = function.name) + checked.arg.names <- c(checked.arg.names, tempo2$object.name) + if(tempo1$problem == TRUE & tempo2$problem == TRUE){ + tempo.cat <- paste0("ERROR IN ", function.name, ": dot.size ARGUMENT MUST BE A SINGLE NUMERIC VALUE OR A LIST OF SINGLE NUMERIC VALUES") + text.check <- c(text.check, tempo.cat) + arg.check <- c(arg.check, TRUE) + } + tempo1 <- fun_check(data = dot.shape, class = "vector", length = 1, fun.name = function.name) + tempo2 <- fun_check(data = dot.shape, class = "list", na.contain = TRUE, fun.name = function.name) + checked.arg.names <- c(checked.arg.names, tempo2$object.name) + if(tempo1$problem == TRUE & tempo2$problem == TRUE){ + tempo.cat <- paste0("ERROR IN ", function.name, ": dot.shape ARGUMENT MUST BE A SINGLE SHAPE VALUE OR A LIST OF SINGLE SHAPE VALUES (SEE https://ggplot2.tidyverse.org/articles/ggplot2-specs.html)") + text.check <- c(text.check, tempo.cat) + arg.check <- c(arg.check, TRUE) + } + tempo1 <- fun_check(data = dot.border.size, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) + tempo2 <- fun_check(data = dot.border.size, class = "list", na.contain = TRUE, fun.name = function.name) + checked.arg.names <- c(checked.arg.names, tempo2$object.name) + if(tempo1$problem == TRUE & tempo2$problem == TRUE){ + tempo.cat <- paste0("ERROR IN ", function.name, ": dot.border.size ARGUMENT MUST BE A SINGLE NUMERIC VALUE OR A LIST OF SINGLE NUMERIC VALUES") + text.check <- c(text.check, tempo.cat) + arg.check <- c(arg.check, TRUE) + } + if( ! is.null(dot.border.color)){ + tempo1 <- fun_check(data = dot.border.color, class = "vector", mode = "character", length = 1, fun.name = function.name) + tempo2 <- fun_check(data = dot.border.color, class = "vector", typeof = "integer", double.as.integer.allowed = TRUE, length = 1, fun.name = function.name) + checked.arg.names <- c(checked.arg.names, tempo2$object.name) + if(tempo1$problem == TRUE & tempo2$problem == TRUE){ + # integer colors -> gg_palette + tempo.cat <- paste0("ERROR IN ", function.name, ": dot.border.color MUST BE A SINGLE CHARACTER STRING OF COLOR OR A SINGLE INTEGER VALUE") + text.check <- c(text.check, tempo.cat) + arg.check <- c(arg.check, TRUE) + } + }else{ + # no fun_check test here, it is just for checked.arg.names + tempo <- fun_check(data = dot.border.color, class = "vector") + checked.arg.names <- c(checked.arg.names, tempo$object.name) + } + tempo1 <- fun_check(data = line.size, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) + tempo2 <- fun_check(data = line.size, class = "list", na.contain = TRUE, fun.name = function.name) + checked.arg.names <- c(checked.arg.names, tempo2$object.name) + if(tempo1$problem == TRUE & tempo2$problem == TRUE){ + tempo.cat <- paste0("ERROR IN ", function.name, ": line.size ARGUMENT MUST BE A SINGLE NUMERIC VALUE OR A LIST OF SINGLE NUMERIC VALUES") + text.check <- c(text.check, tempo.cat) + arg.check <- c(arg.check, TRUE) + } + tempo1 <- fun_check(data = line.type, class = "vector", typeof = "integer", double.as.integer.allowed = FALSE, length = 1, fun.name = function.name) + tempo2 <- fun_check(data = line.type, class = "vector", mode = "character", length = 1, fun.name = function.name) + tempo3 <- fun_check(data = line.type, class = "list", na.contain = TRUE, fun.name = function.name) + checked.arg.names <- c(checked.arg.names, tempo3$object.name) + if(tempo1$problem == TRUE & tempo2$problem == TRUE & tempo3$problem == TRUE){ + tempo.cat <- paste0("ERROR IN ", function.name, ": line.type ARGUMENT MUST BE A SINGLE LINE KIND VALUE OR A LIST OF SINGLE LINE KIND VALUES (SEE https://ggplot2.tidyverse.org/articles/ggplot2-specs.html)") + text.check <- c(text.check, tempo.cat) + arg.check <- c(arg.check, TRUE) + } + if( ! is.null(x.lim)){ + tempo <- fun_check(data = x.lim, class = "vector", mode = "numeric", length = 2, fun.name = function.name) ; eval(ee) + if(tempo$problem == FALSE & any(x.lim %in% c(Inf, -Inf))){ + tempo.cat <- paste0("ERROR IN ", function.name, ": x.lim ARGUMENT CANNOT CONTAIN -Inf OR Inf VALUES") + text.check <- c(text.check, tempo.cat) + arg.check <- c(arg.check, TRUE) + } + }else{ + # no fun_check test here, it is just for checked.arg.names + tempo <- fun_check(data = x.lim, class = "vector") + checked.arg.names <- c(checked.arg.names, tempo$object.name) + } + if( ! is.null(x.lab)){ + if(all(class(x.lab) %in% "expression")){ # to deal with math symbols + tempo <- fun_check(data = x.lab, class = "expression", length = 1, fun.name = function.name) ; eval(ee) + }else{ + tempo <- fun_check(data = x.lab, class = "vector", mode = "character", length = 1, fun.name = function.name) ; eval(ee) + } + }else{ + # no fun_check test here, it is just for checked.arg.names + tempo <- fun_check(data = x.lab, class = "vector") + checked.arg.names <- c(checked.arg.names, tempo$object.name) + } + tempo <- fun_check(data = x.log, options = c("no", "log2", "log10"), length = 1, fun.name = function.name) ; eval(ee) + if( ! is.null(x.tick.nb)){ + tempo <- fun_check(data = x.tick.nb, class = "vector", typeof = "integer", length = 1, double.as.integer.allowed = TRUE, fun.name = function.name) ; eval(ee) + if(tempo$problem == FALSE & x.tick.nb < 0){ + tempo.cat <- paste0("ERROR IN ", function.name, ": x.tick.nb ARGUMENT MUST BE A NON-NULL POSITIVE INTEGER") + text.check <- c(text.check, tempo.cat) + arg.check <- c(arg.check, TRUE) + } + }else{ + # no fun_check test here, it is just for checked.arg.names + tempo <- fun_check(data = x.tick.nb, class = "vector") + checked.arg.names <- c(checked.arg.names, tempo$object.name) + } + if( ! is.null(x.second.tick.nb)){ + tempo <- fun_check(data = x.second.tick.nb, class = "vector", typeof = "integer", length = 1, double.as.integer.allowed = TRUE, fun.name = function.name) ; eval(ee) + if(tempo$problem == FALSE & x.second.tick.nb <= 0){ + tempo.cat <- paste0("ERROR IN ", function.name, ": x.second.tick.nb ARGUMENT MUST BE A NON-NULL POSITIVE INTEGER") + text.check <- c(text.check, tempo.cat) + arg.check <- c(arg.check, TRUE) + } + }else{ + # no fun_check test here, it is just for checked.arg.names + tempo <- fun_check(data = x.second.tick.nb, class = "vector") + checked.arg.names <- c(checked.arg.names, tempo$object.name) + } + tempo <- fun_check(data = x.include.zero, class = "vector", mode = "logical", length = 1, fun.name = function.name) ; eval(ee) + tempo <- fun_check(data = x.left.extra.margin, prop = TRUE, length = 1, fun.name = function.name) ; eval(ee) + tempo <- fun_check(data = x.right.extra.margin, prop = TRUE, length = 1, fun.name = function.name) ; eval(ee) + tempo <- fun_check(data = x.text.angle, class = "vector", typeof = "integer", double.as.integer.allowed = TRUE, length = 1, neg.values = TRUE, fun.name = function.name) ; eval(ee) + if( ! is.null(y.lim)){ + tempo <- fun_check(data = y.lim, class = "vector", mode = "numeric", length = 2, fun.name = function.name) ; eval(ee) + if(tempo$problem == FALSE & any(y.lim %in% c(Inf, -Inf))){ + tempo.cat <- paste0("ERROR IN ", function.name, ": y.lim ARGUMENT CANNOT CONTAIN -Inf OR Inf VALUES") + text.check <- c(text.check, tempo.cat) + arg.check <- c(arg.check, TRUE) + } + }else{ + # no fun_check test here, it is just for checked.arg.names + tempo <- fun_check(data = y.lim, class = "vector") + checked.arg.names <- c(checked.arg.names, tempo$object.name) + } + if( ! is.null(y.lab)){ + if(all(class(y.lab) %in% "expression")){ # to deal with math symbols + tempo <- fun_check(data = y.lab, class = "expression", length = 1, fun.name = function.name) ; eval(ee) + }else{ + tempo <- fun_check(data = y.lab, class = "vector", mode = "character", length = 1, fun.name = function.name) ; eval(ee) + } + }else{ + # no fun_check test here, it is just for checked.arg.names + tempo <- fun_check(data = y.lab, class = "vector") + checked.arg.names <- c(checked.arg.names, tempo$object.name) + } + tempo <- fun_check(data = y.log, options = c("no", "log2", "log10"), length = 1, fun.name = function.name) ; eval(ee) + if( ! is.null(y.tick.nb)){ + tempo <- fun_check(data = y.tick.nb, class = "vector", typeof = "integer", length = 1, double.as.integer.allowed = TRUE, fun.name = function.name) ; eval(ee) + if(tempo$problem == FALSE & y.tick.nb < 0){ + tempo.cat <- paste0("ERROR IN ", function.name, ": y.tick.nb ARGUMENT MUST BE A NON-NULL POSITIVE INTEGER") + text.check <- c(text.check, tempo.cat) + arg.check <- c(arg.check, TRUE) + } + }else{ + # no fun_check test here, it is just for checked.arg.names + tempo <- fun_check(data = y.tick.nb, class = "vector") + checked.arg.names <- c(checked.arg.names, tempo$object.name) + } + if( ! is.null(y.second.tick.nb)){ + tempo <- fun_check(data = y.second.tick.nb, class = "vector", typeof = "integer", length = 1, double.as.integer.allowed = TRUE, fun.name = function.name) ; eval(ee) + if(tempo$problem == FALSE & y.second.tick.nb <= 0){ + tempo.cat <- paste0("ERROR IN ", function.name, ": y.second.tick.nb ARGUMENT MUST BE A NON-NULL POSITIVE INTEGER") + text.check <- c(text.check, tempo.cat) + arg.check <- c(arg.check, TRUE) + } + }else{ + # no fun_check test here, it is just for checked.arg.names + tempo <- fun_check(data = y.second.tick.nb, class = "vector") + checked.arg.names <- c(checked.arg.names, tempo$object.name) + } + tempo <- fun_check(data = y.include.zero, class = "vector", mode = "logical", length = 1, fun.name = function.name) ; eval(ee) + tempo <- fun_check(data = y.top.extra.margin, prop = TRUE, length = 1, fun.name = function.name) ; eval(ee) + tempo <- fun_check(data = y.bottom.extra.margin, prop = TRUE, length = 1, fun.name = function.name) ; eval(ee) + tempo <- fun_check(data = y.text.angle, class = "vector", typeof = "integer", double.as.integer.allowed = TRUE, length = 1, neg.values = TRUE, fun.name = function.name) ; eval(ee) + tempo <- fun_check(data = raster, class = "logical", length = 1, fun.name = function.name) ; eval(ee) + tempo <- fun_check(data = raster.ratio, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) + if( ! is.null(raster.threshold)){ + tempo <- fun_check(data = raster.threshold, class = "vector", typeof = "integer", neg.values = FALSE, double.as.integer.allowed = TRUE, fun.name = function.name) ; eval(ee) + }else{ + # no fun_check test here, it is just for checked.arg.names + tempo <- fun_check(data = raster.threshold, class = "vector") + checked.arg.names <- c(checked.arg.names, tempo$object.name) + } + tempo <- fun_check(data = text.size, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) + tempo <- fun_check(data = title, class = "vector", mode = "character", length = 1, fun.name = function.name) ; eval(ee) + tempo <- fun_check(data = title.text.size, class = "vector", mode = "numeric", length = 1, neg.values = FALSE, fun.name = function.name) ; eval(ee) + tempo <- fun_check(data = legend.show, class = "logical", length = 1, fun.name = function.name) ; eval(ee) + if( ! is.null(legend.width)){ + tempo <- fun_check(data = legend.width, prop = TRUE, length = 1, fun.name = function.name) ; eval(ee) + }else{ + # no fun_check test here, it is just for checked.arg.names + tempo <- fun_check(data = legend.width, class = "vector") + checked.arg.names <- c(checked.arg.names, tempo$object.name) + } + tempo <- fun_check(data = article, class = "logical", length = 1, fun.name = function.name) ; eval(ee) + tempo <- fun_check(data = grid, class = "logical", length = 1, fun.name = function.name) ; eval(ee) + if( ! is.null(add)){ + tempo <- fun_check(data = add, class = "vector", mode = "character", length = 1, fun.name = function.name) ; eval(ee) + }else{ + # no fun_check test here, it is just for checked.arg.names + tempo <- fun_check(data = add, class = "vector") + checked.arg.names <- c(checked.arg.names, tempo$object.name) + } + tempo <- fun_check(data = return, class = "logical", length = 1, fun.name = function.name) ; eval(ee) + tempo <- fun_check(data = return.ggplot, class = "logical", length = 1, fun.name = function.name) ; eval(ee) + tempo <- fun_check(data = return.gtable, class = "logical", length = 1, fun.name = function.name) ; eval(ee) + tempo <- fun_check(data = plot, class = "logical", length = 1, fun.name = function.name) ; eval(ee) + tempo <- fun_check(data = warn.print, class = "logical", length = 1, fun.name = function.name) ; eval(ee) + if( ! is.null(lib.path)){ + tempo <- fun_check(data = lib.path, class = "vector", mode = "character", fun.name = function.name) ; eval(ee) + if(tempo$problem == FALSE){ + if( ! all(dir.exists(lib.path))){ # separation to avoid the problem of tempo$problem == FALSE and lib.path == NA + tempo.cat <- paste0("ERROR IN ", function.name, ": DIRECTORY PATH INDICATED IN THE lib.path ARGUMENT DOES NOT EXISTS:\n", paste(lib.path, collapse = "\n")) + text.check <- c(text.check, tempo.cat) + arg.check <- c(arg.check, TRUE) + } + } + }else{ + # no fun_check test here, it is just for checked.arg.names + tempo <- fun_check(data = lib.path, class = "vector") + checked.arg.names <- c(checked.arg.names, tempo$object.name) + } + if(any(arg.check) == TRUE){ + stop(paste0("\n\n================\n\n", paste(text.check[arg.check], collapse = "\n"), "\n\n================\n\n"), call. = FALSE) # + } + # source("C:/Users/Gael/Documents/Git_versions_to_use/debugging_tools_for_r_dev-v1.7/r_debugging_tools-v1.7.R") ; eval(parse(text = str_basic_arg_check_dev)) ; eval(parse(text = str_arg_check_with_fun_check_dev)) # activate this line and use the function (with no arguments left as NULL) to check arguments status and if they have been checked using fun_check() + # end argument primary checking + + + # second round of checking and data preparation + # management of NA arguments + tempo.arg <- names(arg.user.setting) # values provided by the user + tempo.log <- suppressWarnings(sapply(lapply(lapply(tempo.arg, FUN = get, env = sys.nframe(), inherit = FALSE), FUN = is.na), FUN = any)) & lapply(lapply(tempo.arg, FUN = get, env = sys.nframe(), inherit = FALSE), FUN = length)== 1L # no argument provided by the user can be just NA + if(any(tempo.log) == TRUE){ + tempo.cat <- paste0("ERROR IN ", function.name, ":\n", ifelse(sum(tempo.log, na.rm = TRUE) > 1, "THESE ARGUMENTS\n", "THIS ARGUMENT\n"), paste0(tempo.arg[tempo.log], collapse = "\n"),"\nCANNOT JUST BE NA") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n"), call. = FALSE) # == in stop() to be able to add several messages between == + } + # end management of NA arguments + # management of NULL arguments + tempo.arg <-c( + "data1", + # "x", # inactivated because of hline or vline + # "y", # inactivated because of hline or vline + "geom", + "geom.step.dir", + # "geom.stick.base", # inactivated because can be null + "alpha", + "dot.size", + "dot.shape", + "dot.border.size", + "line.size", + "line.type", + "x.log", + "x.include.zero", + "x.left.extra.margin", + "x.right.extra.margin", + "x.text.angle", + "y.log", + "y.include.zero", + "y.top.extra.margin", + "y.bottom.extra.margin", + "y.text.angle", + "raster", + "raster.ratio", + "text.size", + "title", + "title.text.size", + "legend.show", + # "legend.width", # inactivated because can be null + "article", + "grid", + "return", + "return.ggplot", + "return.gtable", + "plot", + "warn.print" + ) + tempo.log <- sapply(lapply(tempo.arg, FUN = get, env = sys.nframe(), inherit = FALSE), FUN = is.null) + if(any(tempo.log) == TRUE){ + tempo.cat <- paste0("ERROR IN ", function.name, ":\n", ifelse(sum(tempo.log, na.rm = TRUE) > 1, "THESE ARGUMENTS\n", "THIS ARGUMENT\n"), paste0(tempo.arg[tempo.log], collapse = "\n"),"\nCANNOT BE NULL") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n"), call. = FALSE) # == in stop() to be able to add several messages between == + } + # end management of NULL arguments + # code that protects set.seed() in the global environment + # end code that protects set.seed() in the global environment + # warning initiation + ini.warning.length <- options()$warning.length + options(warning.length = 8170) + warn <- NULL + warn.count <- 0 + # end warning initiation + # other checkings + # check list lengths (and names of data1 compartments if present) + list.color <- NULL + list.geom <- NULL + list.geom.step.dir <- NULL + list.geom.stick.base <- NULL + list.alpha <- NULL + list.dot.size <- NULL + list.dot.shape <- NULL + list.dot.border.size <- NULL + list.dot.border.color <- NULL + list.line.size <- NULL + list.line.type <- NULL + if(all(class(data1) == "list")){ + if(length(data1) > 6){ + tempo.cat <- paste0("ERROR IN ", function.name, ": data1 ARGUMENT MUST BE A LIST OF 6 DATA FRAMES MAXIMUM (6 OVERLAYS MAX)") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + } + if(is.null(names(data1))){ + names(data1) <- paste0("L", 1:length(data1)) + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") NULL NAME COMPARTMENT OF data1 LIST -> NAMES RESPECTIVELY ATTRIBUTED TO EACH COMPARTMENT:\n", paste(names(data1), collapse = " ")) + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + } + if( ! is.null(x)){ + if( ! (all(class(x) == "list") & length(data1) == length(x))){ + tempo.cat <- paste0("ERROR IN ", function.name, ": x ARGUMENT MUST BE A LIST OF SAME LENGTH AS data1 IF data1 IS A LIST") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + } + }else{ + x <- vector("list", length(data1)) + } + if( ! is.null(y)){ + if( ! (all(class(y) == "list") & length(data1) == length(y))){ + tempo.cat <- paste0("ERROR IN ", function.name, ": y ARGUMENT MUST BE A LIST OF SAME LENGTH AS data1 IF data1 IS A LIST") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + } + }else{ + y <- vector("list", length(data1)) + } + if( ! is.null(categ)){ + if( ! (all(class(categ) == "list") & length(data1) == length(categ))){ + tempo.cat <- paste0("ERROR IN ", function.name, ": categ ARGUMENT MUST BE A LIST OF SAME LENGTH AS data1 IF data1 IS A LIST") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + } + } + if( ! is.null(categ.class.order)){ + if( ! (all(class(categ.class.order) == "list") & length(data1) == length(categ.class.order))){ + tempo.cat <- paste0("ERROR IN ", function.name, ": categ.class.order ARGUMENT MUST BE A LIST OF SAME LENGTH AS data1 IF data1 IS A LIST") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + } + } + if( ! is.null(color)){ + if( ! ((all(class(color) == "list") & length(data1) == length(color)) | ((all(mode(color) == "character") | all(mode(color) == "numeric")) & length(color)== 1L))){ # list of same length as data1 or single value + tempo.cat <- paste0("ERROR IN ", function.name, ": color ARGUMENT MUST BE A LIST OF SAME LENGTH AS data1 IF data1 IS A LIST, OR A SINGLE CHARACTER STRING OR INTEGER") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + }else if((all(mode(color) == "character") | all(mode(color) == "numeric")) & length(color)== 1L){ # convert the single value into a list of single value + list.color <- vector(mode = "list", length = length(data1)) + list.color[] <- color + } + } + if( ! ((all(class(geom) == "list") & length(data1) == length(geom)) | (all(mode(geom) == "character") & length(geom)== 1L))){ # list of same length as data1 or single value + tempo.cat <- paste0("ERROR IN ", function.name, ": geom ARGUMENT MUST BE A LIST OF SAME LENGTH AS data1 IF data1 IS A LIST, OR A SINGLE CHARACTER VALUE") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + }else if(all(mode(geom) == "character") & length(geom)== 1L){ # convert the single value into a list of single value + list.geom <- vector(mode = "list", length = length(data1)) + list.geom[] <- geom + } + if( ! ((all(class(geom.step.dir) == "list") & length(data1) == length(geom.step.dir)) | (all(mode(geom.step.dir) == "character") & length(geom.step.dir)== 1L))){ # list of same length as data1 or single value + tempo.cat <- paste0("ERROR IN ", function.name, ": geom.step.dir ARGUMENT MUST BE A LIST OF SAME LENGTH AS data1 IF data1 IS A LIST, OR A SINGLE CHARACTER VALUE") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + }else if(all(mode(geom.step.dir) == "character") & length(geom.step.dir)== 1L){ # convert the single value into a list of single value + list.geom.step.dir <- vector(mode = "list", length = length(data1)) + list.geom.step.dir[] <- geom.step.dir + } + if( ! is.null(geom.stick.base)){ + if( ! ((all(class(geom.stick.base) == "list") & length(data1) == length(geom.stick.base)) | (all(mode(geom.stick.base) == "numeric") & length(geom.stick.base)== 1L))){ # list of same length as data1 or single value + tempo.cat <- paste0("ERROR IN ", function.name, ": geom.stick.base ARGUMENT MUST BE A LIST OF SAME LENGTH AS data1 IF data1 IS A LIST, OR A SINGLE NUMERIC VALUE") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + }else if(all(mode(geom.stick.base) == "numeric") & length(geom.stick.base)== 1L){ # convert the single value into a list of single value + list.geom.stick.base <- vector(mode = "list", length = length(data1)) + list.geom.stick.base[] <- geom.stick.base + } + } + if( ! ((all(class(alpha) == "list") & length(data1) == length(alpha)) | (all(mode(alpha) == "numeric") & length(alpha)== 1L))){ # list of same length as data1 or single value + tempo.cat <- paste0("ERROR IN ", function.name, ": alpha ARGUMENT MUST BE A LIST OF SAME LENGTH AS data1 IF data1 IS A LIST, OR A SINGLE NUMERIC VALUE") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + }else if(all(mode(alpha) == "numeric") & length(alpha)== 1L){ # convert the single value into a list of single value + list.alpha <- vector(mode = "list", length = length(data1)) + list.alpha[] <- alpha + } + if( ! ((all(class(dot.size) == "list") & length(data1) == length(dot.size)) | (all(mode(dot.size) == "numeric") & length(dot.size)== 1L))){ # list of same length as data1 or single value + tempo.cat <- paste0("ERROR IN ", function.name, ": dot.size ARGUMENT MUST BE A LIST OF SAME LENGTH AS data1 IF data1 IS A LIST, OR A SINGLE NUMERIC VALUE") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + }else if(all(mode(dot.size) == "numeric") & length(dot.size)== 1L){ # convert the single value into a list of single value + list.dot.size <- vector(mode = "list", length = length(data1)) + list.dot.size[] <- dot.size + } + if( ! ((all(class(dot.shape) == "list") & length(data1) == length(dot.shape)) | (all(mode(dot.shape) != "list") & length(dot.shape)== 1L))){ # list of same length as data1 or single value + tempo.cat <- paste0("ERROR IN ", function.name, ": dot.shape ARGUMENT MUST BE A LIST OF SAME LENGTH AS data1 IF data1 IS A LIST, OR A SINGLE SHAPE VALUE") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + }else if(all(mode(dot.shape) != "list") & length(dot.shape)== 1L){ # convert the single value into a list of single value + list.dot.shape <- vector(mode = "list", length = length(data1)) + list.dot.shape[] <- dot.shape + } + if( ! ((all(class(dot.border.size) == "list") & length(data1) == length(dot.border.size)) | (all(mode(dot.border.size) == "numeric") & length(dot.border.size)== 1L))){ # list of same length as data1 or single value + tempo.cat <- paste0("ERROR IN ", function.name, ": dot.border.size ARGUMENT MUST BE A LIST OF SAME LENGTH AS data1 IF data1 IS A LIST, OR A SINGLE NUMERIC VALUE") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + }else if(all(mode(dot.border.size) == "numeric") & length(dot.border.size)== 1L){ # convert the single value into a list of single value + list.dot.border.size <- vector(mode = "list", length = length(data1)) + list.dot.border.size[] <- dot.border.size + } + if( ! is.null(dot.border.color)){ + if( ! ((all(class(dot.border.color) == "list") & length(data1) == length(dot.border.color)) | ((all(mode(dot.border.color) == "character") | all(mode(dot.border.color) == "numeric")) & length(dot.border.color)== 1L))){ # list of same length as data1 or single value + tempo.cat <- paste0("ERROR IN ", function.name, ": dot.border.color ARGUMENT MUST BE A LIST OF SAME LENGTH AS data1 IF data1 IS A LIST, OR A SINGLE CHARACTER STRING OR INTEGER") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + }else if((all(mode(dot.border.color) == "character") | all(mode(dot.border.color) == "numeric")) & length(dot.border.color)== 1L){ # convert the single value into a list of single value + list.dot.border.color <- vector(mode = "list", length = length(data1)) + list.dot.border.color[] <- dot.border.color + } + } + if( ! ((all(class(line.size) == "list") & length(data1) == length(line.size)) | (all(mode(line.size) == "numeric") & length(line.size)== 1L))){ # list of same length as data1 or single value + tempo.cat <- paste0("ERROR IN ", function.name, ": line.size ARGUMENT MUST BE A LIST OF SAME LENGTH AS data1 IF data1 IS A LIST, OR A SINGLE NUMERIC VALUE") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + }else if(all(mode(line.size) == "numeric") & length(line.size)== 1L){ # convert the single value into a list of single value + list.line.size <- vector(mode = "list", length = length(data1)) + list.line.size[] <- line.size + } + if( ! ((all(class(line.type) == "list") & length(data1) == length(line.type)) | (all(mode(line.type) != "list") & length(line.type)== 1L))){ # list of same length as data1 or single value + tempo.cat <- paste0("ERROR IN ", function.name, ": line.type ARGUMENT MUST BE A LIST OF SAME LENGTH AS data1 IF data1 IS A LIST, OR A SINGLE LINE KIND VALUE") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + }else if(all(mode(line.type) != "list") & length(line.type)== 1L){ # convert the single value into a list of single value + list.line.type <- vector(mode = "list", length = length(data1)) + list.line.type[] <- line.type + } + if( ! is.null(legend.name)){ + if( ! (all(class(legend.name) == "list") & length(data1) == length(legend.name))){ + tempo.cat <- paste0("ERROR IN ", function.name, ": legend.name ARGUMENT MUST BE A LIST OF SAME LENGTH AS data1 IF data1 IS A LIST") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + } + } + } + # end check list lengths (and names of data1 compartments if present) + # conversion into lists + if(all(is.data.frame(data1))){ + data1 <- list(L1 = data1) + if(all(class(x) == "list")){ + tempo.cat <- paste0("ERROR IN ", function.name, ": x ARGUMENT CANNOT BE A LIST IF data1 IS A DATA FRAME") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + }else{ + x <- list(L1 = x) + } + if(all(class(y) == "list")){ + tempo.cat <- paste0("ERROR IN ", function.name, ": y ARGUMENT CANNOT BE A LIST IF data1 IS A DATA FRAME") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + }else{ + y <- list(L1 = y) + } + if( ! is.null(categ)){ + if(all(class(categ) == "list")){ + tempo.cat <- paste0("ERROR IN ", function.name, ": categ ARGUMENT CANNOT BE A LIST IF data1 IS A DATA FRAME") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + }else{ + categ <- list(L1 = categ) + } + } + if( ! is.null(categ.class.order)){ + if(all(class(categ.class.order) == "list")){ + tempo.cat <- paste0("ERROR IN ", function.name, ": categ.class.order ARGUMENT CANNOT BE A LIST IF data1 IS A DATA FRAME") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + }else{ + categ.class.order <- list(L1 = categ.class.order) + } + } + if( ! is.null(color)){ + if(all(class(color) == "list")){ + tempo.cat <- paste0("ERROR IN ", function.name, ": color ARGUMENT CANNOT BE A LIST IF data1 IS A DATA FRAME") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + }else{ + color <- list(L1 = color) + } + } + if(all(class(geom) == "list")){ + tempo.cat <- paste0("ERROR IN ", function.name, ": geom ARGUMENT CANNOT BE A LIST IF data1 IS A DATA FRAME") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + }else{ + geom <- list(L1 = geom) + } + if(all(class(geom.step.dir) == "list")){ + tempo.cat <- paste0("ERROR IN ", function.name, ": geom.step.dir ARGUMENT CANNOT BE A LIST IF data1 IS A DATA FRAME") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + }else{ + geom.step.dir <- list(L1 = geom.step.dir) + } + if( ! is.null(geom.stick.base)){ + if(all(class(geom.stick.base) == "list")){ + tempo.cat <- paste0("ERROR IN ", function.name, ": geom.stick.base ARGUMENT CANNOT BE A LIST IF data1 IS A DATA FRAME") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + }else{ + geom.stick.base <- list(L1 = geom.stick.base) + } + } + if(all(class(alpha) == "list")){ + tempo.cat <- paste0("ERROR IN ", function.name, ": alpha ARGUMENT CANNOT BE A LIST IF data1 IS A DATA FRAME") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + }else{ + alpha <- list(L1 = alpha) + } + if(all(class(dot.size) == "list")){ + tempo.cat <- paste0("ERROR IN ", function.name, ": dot.size ARGUMENT CANNOT BE A LIST IF data1 IS A DATA FRAME") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + }else{ + dot.size <- list(L1 = dot.size) + } + if(all(class(dot.shape) == "list")){ + tempo.cat <- paste0("ERROR IN ", function.name, ": dot.shape ARGUMENT CANNOT BE A LIST IF data1 IS A DATA FRAME") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + }else{ + dot.shape <- list(L1 = dot.shape) + } + if(all(class(dot.border.size) == "list")){ + tempo.cat <- paste0("ERROR IN ", function.name, ": dot.border.size ARGUMENT CANNOT BE A LIST IF data1 IS A DATA FRAME") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + }else{ + dot.border.size <- list(L1 = dot.border.size) + } + if( ! is.null(dot.border.color)){ + if(all(class(dot.border.color) == "list")){ + tempo.cat <- paste0("ERROR IN ", function.name, ": dot.border.color ARGUMENT CANNOT BE A LIST IF data1 IS A DATA FRAME") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + }else{ + dot.border.color <- list(L1 = dot.border.color) + } + } + if(all(class(line.size) == "list")){ + tempo.cat <- paste0("ERROR IN ", function.name, ": line.size ARGUMENT CANNOT BE A LIST IF data1 IS A DATA FRAME") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + }else{ + line.size <- list(L1 = line.size) + } + if(all(class(line.type) == "list")){ + tempo.cat <- paste0("ERROR IN ", function.name, ": line.type ARGUMENT CANNOT BE A LIST IF data1 IS A DATA FRAME") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + }else{ + line.type <- list(L1 = line.type) + } + if( ! is.null(legend.name)){ + if(all(class(legend.name) == "list")){ + tempo.cat <- paste0("ERROR IN ", function.name, ": legend.name ARGUMENT CANNOT BE A LIST IF data1 IS A DATA FRAME") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + }else{ + legend.name <- list(L1 = legend.name) + } + } + }else if( ! all(sapply(data1, FUN = "class") == "data.frame")){ # if not a data frame, data1 can only be a list, as tested above + tempo.cat <- paste0("ERROR IN ", function.name, ": data1 ARGUMENT MUST BE A DATA FRAME OR A LIST OF DATA FRAMES") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + } + # single value converted into list now reattributed to the argument name + if( ! is.null(color)){ + if( ! is.null(list.color)){ + color <- list.color + } + } + if( ! is.null(list.geom)){ + geom <- list.geom + } + if( ! is.null(list.geom.step.dir)){ + geom.step.dir <- list.geom.step.dir + } + if( ! is.null(geom.stick.base)){ + if( ! is.null(list.geom.stick.base)){ + geom.stick.base <- list.geom.stick.base + } + } + if( ! is.null(list.alpha)){ + alpha <- list.alpha + } + if( ! is.null(list.dot.size)){ + dot.size <- list.dot.size + } + if( ! is.null(list.dot.shape)){ + dot.shape <- list.dot.shape + } + if( ! is.null(list.dot.border.size)){ + dot.border.size <- list.dot.border.size + } + if( ! is.null(dot.border.color)){ + if( ! is.null(list.dot.border.color)){ + dot.border.color <- list.dot.border.color + } + } + if( ! is.null(list.line.size)){ + line.size <- list.line.size + } + if( ! is.null(list.line.type)){ + line.type <- list.line.type + } + # end single value converted into list now reattributed to the argument name + # data, x, y, geom, alpha, dot.size, shape, dot.border.size, line.size, line.type, legend.name are list now + # if non-null, categ, categ.class.order, legend.name, color, dot.border.color are list now + # end conversion into lists + # verif of add + if( ! is.null(add)){ + if( ! grepl(pattern = "^\\s*\\+", add)){ # check that the add string start by + + tempo.cat <- paste0("ERROR IN ", function.name, ": add ARGUMENT MUST START WITH \"+\": ", paste(unique(add), collapse = " ")) + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + + }else if( ! grepl(pattern = "(ggplot2|lemon)\\s*::", add)){ # + tempo.cat <- paste0("ERROR IN ", function.name, ": FOR EASIER FUNCTION DETECTION, add ARGUMENT MUST CONTAIN \"ggplot2::\" OR \"lemon::\" IN FRONT OF EACH GGPLOT2 FUNCTION: ", paste(unique(add), collapse = " ")) + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + }else if( ! grepl(pattern = ")\\s*$", add)){ # check that the add string finished by ) + tempo.cat <- paste0("ERROR IN ", function.name, ": add ARGUMENT MUST FINISH BY \")\": ", paste(unique(add), collapse = " ")) + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + } + } + # end verif of add + # management of add containing facet + facet.categ <- NULL + if( ! is.null(add)){ + facet.check <- TRUE + tempo <- unlist(strsplit(x = add, split = "\\s*\\+\\s*(ggplot2|lemon)\\s*::\\s*")) # + tempo <- sub(x = tempo, pattern = "^facet_wrap", replacement = "ggplot2::facet_wrap") + tempo <- sub(x = tempo, pattern = "^facet_grid", replacement = "ggplot2::facet_grid") + tempo <- sub(x = tempo, pattern = "^facet_rep", replacement = "lemon::facet_rep") + if(length(data1) > 1 & (any(grepl(x = tempo, pattern = "ggplot2::facet_wrap|lemon::facet_rep_wrap")) | grepl(x = add, pattern = "ggplot2::facet_grid|lemon::facet_rep_grid"))){ + tempo.cat <- paste0("ERROR IN ", function.name, "\nfacet PANELS CANNOT BE USED IF MORE THAN ONE DATA FRAME IN THE data1 ARGUMENT\nPLEASE REWRITE THE add STRING AND RERUN") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + }else{ + if(any(grepl(x = tempo, pattern = "ggplot2::facet_wrap|lemon::facet_rep_wrap"))){ + tempo1 <- suppressWarnings(eval(parse(text = tempo[grepl(x = tempo, pattern = "ggplot2::facet_wrap|lemon::facet_rep_wrap")]))) + facet.categ <- list(names(tempo1$params$facets)) # list of length 1 + tempo.text <- "facet_wrap OR facet_rep_wrap" + facet.check <- FALSE + }else if(grepl(x = add, pattern = "ggplot2::facet_grid|lemon::facet_rep_grid")){ + tempo1 <- suppressWarnings(eval(parse(text = tempo[grepl(x = tempo, pattern = "ggplot2::facet_grid|lemon::facet_rep_grid")]))) + facet.categ <- list(c(names(tempo1$params$rows), names(tempo1$params$cols))) # list of length 1 + tempo.text <- "facet_grid OR facet_rep_grid" + facet.check <- FALSE + } + if(facet.check == FALSE & ! all(facet.categ %in% names(data1[[1]]))){ # WARNING: all(facet.categ %in% names(data1)) is TRUE when facet.categ is NULL + tempo.cat <- paste0("ERROR IN ", function.name, "\nDETECTION OF \"", tempo.text, "\" STRING IN THE add ARGUMENT BUT PROBLEM OF VARIABLE DETECTION (COLUMN NAMES OF data1)\nTHE DETECTED VARIABLES ARE:\n", paste(facet.categ, collapse = " "), "\nTHE data1 COLUMN NAMES ARE:\n", paste(names(data1[[1]]), collapse = " "), "\nPLEASE REWRITE THE add STRING AND RERUN") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + } + } + } + # if facet.categ is not NULL, it is a list of length 1 now + # end management of add containing facet + # legend name filling + if(is.null(legend.name) & ! is.null(categ)){ + legend.name <- categ + }else if(is.null(legend.name) & is.null(categ)){ + legend.name <- vector("list", length(data1)) # null list + } + # legend.name not NULL anymore (list) + # end legend name filling + # ini categ for legend display + fin.lg.disp <- vector("list", 6) # will be used at the end to display or not legends + fin.lg.disp[] <- FALSE + legend.disp <- vector("list", length(data1)) + if(is.null(categ) | legend.show == FALSE){ + legend.disp[] <- FALSE + }else{ + for(i2 in 1:length(data1)){ + if(is.null(categ[[i2]])){ + legend.disp[[i2]] <- FALSE + }else{ + legend.disp[[i2]] <- TRUE + } + } + } + # end ini categ for legend display + # integer colors into gg_palette + tempo.check.color <- NULL + for(i1 in 1:length(data1)){ + if(any(is.na(color[[i1]]))){ + tempo.cat <- paste0("ERROR IN ", function.name, ": ", ifelse(length(color)== 1L, "color", paste0("ELEMENT NUMBER ", i1, " OF color ARGUMENT")), ": color ARGUMENT CANNOT CONTAIN NA") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + } + tempo.check.color <- c(tempo.check.color, fun_check(data = color[[i1]], data.name = ifelse(length(color)== 1L, "color", paste0("ELEMENT NUMBER ", i1, " OF color ARGUMENT")), class = "integer", double.as.integer.allowed = TRUE, na.contain = TRUE, fun.name = function.name)$problem) + } + tempo.check.color <- ! tempo.check.color # invert TRUE and FALSE because if integer, then problem = FALSE + if(any(tempo.check.color == TRUE)){ # convert integers into colors + tempo.integer <- unlist(color[tempo.check.color]) + tempo.color <- fun_gg_palette(max(tempo.integer, na.rm = TRUE)) + for(i1 in 1:length(data1)){ + if(tempo.check.color[i1] == TRUE){ + color[[i1]] <-tempo.color[color[[i1]]] + } + } + } + # end integer colors into gg_palette + # loop (checking inside list compartment) + compart.null.color <- 0 # will be used to attribute a color when color is non-null but a compartment of color is NULL + data1.ini <- data1 # to report NA removal + removed.row.nb <- vector("list", length = length(data1)) # to report NA removal. Contains NULL + removed.rows <- vector("list", length = length(data1)) # to report NA removal. Contains NULL + for(i1 in 1:length(data1)){ + tempo <- fun_check(data = data1[[i1]], data.name = ifelse(length(data1)== 1L, "data1 ARGUMENT", paste0("DATA FRAME NUMBER ", i1, " OF data1 ARGUMENT")), class = "data.frame", na.contain = TRUE, fun.name = function.name) + if(tempo$problem == TRUE){ + stop(paste0("\n\n================\n\n", tempo$text, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + } + # reserved word checking + if(any(names(data1[[i1]]) %in% reserved.words)){ # I do not use fun_name_change() because cannot control y before creating "fake_y". But ok because reserved are not that common + tempo.cat <- paste0("ERROR IN ", function.name, ": COLUMN NAMES OF ", ifelse(length(data1)== 1L, "data1 ARGUMENT", paste0("DATA FRAME NUMBER ", i1, " OF data1 ARGUMENT")), " ARGUMENT CANNOT BE ONE OF THESE WORDS\n", paste(reserved.words, collapse = " "), "\nTHESE ARE RESERVED FOR THE ", function.name, " FUNCTION") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + } + if( ! (is.null(add))){ + if(any(sapply(X = reserved.words, FUN = grepl, x = add))){ + tempo.cat <- paste0("ERROR IN ", function.name, "\nDETECTION OF COLUMN NAMES OF data1 IN THE add ARGUMENT STRING, THAT CORRESPOND TO RESERVED STRINGS FOR ", function.name, "\nFOLLOWING COLUMN NAMES HAVE TO BE CHANGED:\n", paste(arg.names[sapply(X = reserved.words, FUN = grepl, x = add)], collapse = "\n"), "\nFOR INFORMATION, THE RESERVED WORDS ARE:\n", paste(reserved.words, collapse = "\n")) + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + }else if(any(sapply(X = arg.names, FUN = grepl, x = add))){ + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") NAMES OF ", function.name, " ARGUMENTS DETECTED IN THE add STRING:\n", paste(arg.names[sapply(X = arg.names, FUN = grepl, x = add)], collapse = "\n"), "\nRISK OF WRONG OBJECT USAGE INSIDE ", function.name) + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + } + } + # end reserved word checking + # check of geom now because required for y argument + tempo <- fun_check(data = geom[[i1]], data.name = ifelse(length(geom)== 1L, "geom", paste0("geom NUMBER ", i1)), options = c("geom_point", "geom_line", "geom_path", "geom_step", "geom_hline", "geom_vline", "geom_stick"), length = 1, fun.name = function.name) + if(tempo$problem == TRUE){ + stop(paste0("\n\n================\n\n", tempo$text, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + } + if(geom[[i1]] == "geom_step" & is.null(geom.step.dir[[i1]])){ + tempo.cat <- paste0("ERROR IN ", function.name, ": ", ifelse(length(geom.step.dir)== 1L, "geom.step.dir", paste0("ELEMENT ", i1, " OF geom.step.dir ARGUMENT")), ": geom.step.dir ARGUMENT CANNOT BE NULL IF ", ifelse(length(geom)== 1L, "geom", paste0("ELEMENT ", i1, " OF geom")), " ARGUMENT IS \"geom_step\"\nHERE geom.step.dir ARGUMENT IS: ", paste(geom.step.dir[[i1]], collapse = " ")) + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + }else if(geom[[i1]] == "geom_step" & ! is.null(geom.step.dir[[i1]])){ + tempo <- fun_check(data = geom.step.dir[[i1]], data.name = ifelse(length(geom.step.dir)== 1L, "geom.step.dir", paste0("geom.step.dir NUMBER ", i1)), options = c("vh", "hv", "mid"), length = 1, fun.name = function.name) + if(tempo$problem == TRUE){ + stop(paste0("\n\n================\n\n", tempo$text, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + } + } + if( ! (is.null(geom.stick.base))){ + if(geom[[i1]] == "geom_stick" & ! is.null(geom.stick.base[[i1]])){ + tempo <- fun_check(data = geom.stick.base[[i1]], data.name = ifelse(length(geom.stick.base)== 1L, "geom.stick.base", paste0("geom.stick.base NUMBER ", i1)), mode = "numeric", length = 1, na.contain = FALSE, fun.name = function.name) + if(tempo$problem == TRUE){ + stop(paste0("\n\n================\n\n", tempo$text, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + } + } + } + # end check of geom now because required for y argument + if(is.null(x[[i1]])){ + if(all(geom[[i1]] != "geom_hline")){ + tempo.cat <- paste0("ERROR IN ", function.name, ": ", ifelse(length(x)== 1L, "x", paste0("ELEMENT ", i1, " OF x ARGUMENT")), " IN ", ifelse(length(data1)== 1L, "data1 ARGUMENT", paste0("DATA FRAME NUMBER ", i1, " OF data1 ARGUMENT")), ": x ARGUMENT CANNOT BE NULL EXCEPT IF ", ifelse(length(geom)== 1L, "x", paste0("geom NUMBER ", i1)), " ARGUMENT IS \"geom_hline\"\nHERE geom ARGUMENT IS: ", paste(geom[[i1]], collapse = " ")) + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + }else{ + x[[i1]] <- "fake_x" + data1[[i1]] <- cbind(data1[[i1]], fake_x = NA, stringsAsFactors = TRUE) + data1[[i1]][, "fake_x"] <- as.numeric(data1[[i1]][, "fake_x"]) + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") NULL ", ifelse(length(x)== 1L, "x", paste0("ELEMENT ", i1, " OF x")), " ARGUMENT ASSOCIATED TO ", ifelse(length(geom)== 1L, "geom", paste0("geom NUMBER ", i1)), " ARGUMENT ", geom[[i1]], " -> FAKE COLUMN ADDED TO DATA FRAME ", ifelse(length(data1)== 1L, "data1 ARGUMENT", paste0("DATA FRAME NUMBER ", i1, " OF data1 ARGUMENT")), ", NAMED \"fake_x\" FOR FINAL DRAWING") + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + } + }else{ + if(all(geom[[i1]] == "geom_hline")){ + tempo.cat <- paste0("ERROR IN ", function.name, ": ", ifelse(length(x)== 1L, "x", paste0("ELEMENT ", i1, " OF x ARGUMENT")), " IN ", ifelse(length(data1)== 1L, "data1 ARGUMENT", paste0("DATA FRAME NUMBER ", i1, " OF data1 ARGUMENT")), ": x ARGUMENT MUST BE NULL IF ", ifelse(length(geom)== 1L, "geom", paste0("geom NUMBER ", i1)), " ARGUMENT IS \"geom_hline\"") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + } + tempo <- fun_check(data = x[[i1]], data.name = ifelse(length(x)== 1L, "x", paste0("ELEMENT ", i1, " OF x ARGUMENT")), class = "vector", mode = "character", length = 1, fun.name = function.name) + if(tempo$problem == TRUE){ + stop(paste0("\n\n================\n\n", tempo$text, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + } + } + if(is.null(y[[i1]])){ + if(all(geom[[i1]] != "geom_vline")){ + tempo.cat <- paste0("ERROR IN ", function.name, ": ", ifelse(length(y)== 1L, "y", paste0("ELEMENT ", i1, " OF y ARGUMENT")), " IN ", ifelse(length(data1)== 1L, "data1 ARGUMENT", paste0("DATA FRAME NUMBER ", i1, " OF data1 ARGUMENT")), ": y ARGUMENT CANNOT BE NULL EXCEPT IF ", ifelse(length(geom)== 1L, "y", paste0("geom NUMBER ", i1)), " ARGUMENT IS \"geom_vline\"\nHERE geom ARGUMENT IS: ", paste(geom[[i1]], collapse = " ")) + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + }else{ + y[[i1]] <- "fake_y" + data1[[i1]] <- cbind(data1[[i1]], fake_y = NA, stringsAsFactors = TRUE) + data1[[i1]][, "fake_y"] <- as.numeric(data1[[i1]][, "fake_y"]) + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") NULL ", ifelse(length(y)== 1L, "y", paste0("ELEMENT ", i1, " OF y")), " ARGUMENT ASSOCIATED TO ", ifelse(length(geom)== 1L, "geom", paste0("geom NUMBER ", i1)), " ARGUMENT ", geom[[i1]], " -> FAKE COLUMN ADDED TO DATA FRAME ", ifelse(length(data1)== 1L, "data1 ARGUMENT", paste0("DATA FRAME NUMBER ", i1, " OF data1 ARGUMENT")), ", NAMED \"fake_y\" FOR FINAL DRAWING") + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + } + }else{ + if(all(geom[[i1]] == "geom_vline")){ + tempo.cat <- paste0("ERROR IN ", function.name, ": ", ifelse(length(y)== 1L, "y", paste0("ELEMENT ", i1, " OF y ARGUMENT")), " IN ", ifelse(length(data1)== 1L, "data1 ARGUMENT", paste0("DATA FRAME NUMBER ", i1, " OF data1 ARGUMENT")), ": y ARGUMENT MUST BE NULL IF ", ifelse(length(geom)== 1L, "geom", paste0("geom NUMBER ", i1)), " ARGUMENT IS \"geom_vline\"") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + } + tempo <- fun_check(data = y[[i1]], data.name = ifelse(length(y)== 1L, "y", paste0("ELEMENT ", i1, " OF y ARGUMENT")), class = "vector", mode = "character", length = 1, fun.name = function.name) + if(tempo$problem == TRUE){ + stop(paste0("\n\n================\n\n", tempo$text, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + } + } + # x[[i1]] and y[[i1]] not NULL anymore + if( ! (x[[i1]] %in% names(data1[[i1]]))){ + tempo.cat <- paste0("ERROR IN ", function.name, ": ", ifelse(length(x)== 1L, "x", paste0("ELEMENT ", i1, " OF x")), " ARGUMENT MUST BE A COLUMN NAME OF ", ifelse(length(data1)== 1L, "data1 ARGUMENT", paste0("DATA FRAME NUMBER ", i1, " OF data1 ARGUMENT\nHERE IT IS: ", paste(x[[i1]], collapse = " ")))) + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + } + if( ! (y[[i1]] %in% names(data1[[i1]]))){ + tempo.cat <- paste0("ERROR IN ", function.name, ": ", ifelse(length(y)== 1L, "y", paste0("ELEMENT ", i1, " OF y")), " ARGUMENT MUST BE A COLUMN NAME OF ", ifelse(length(data1)== 1L, "data1 ARGUMENT", paste0("DATA FRAME NUMBER ", i1, " OF data1 ARGUMENT\nHERE IT IS: ", paste(y[[i1]], collapse = " ")))) + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + } + tempo <- fun_check(data = data1[[i1]][, x[[i1]]], data.name = ifelse(length(x)== 1L, "x ARGUMENT (AS COLUMN NAME OF data1 DATA FRAME)", paste0("ELEMENT ", i1, " OF x ARGUMENT", " (AS COLUMN NAME OF data1 DATA FRAME NUMBER ", i1, ")")), class = "vector", mode = "numeric", na.contain = TRUE, fun.name = function.name) + if(tempo$problem == TRUE){ + stop(paste0("\n\n================\n\n", tempo$text, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + } + tempo <- fun_check(data = data1[[i1]][, y[[i1]]], data.name = ifelse(length(y)== 1L, "y ARGUMENT (AS COLUMN NAME OF data1 DATA FRAME)", paste0("ELEMENT ", i1, " OF y ARGUMENT", " (AS COLUMN NAME OF data1 DATA FRAME NUMBER ", i1, ")")), class = "vector", mode = "numeric", na.contain = TRUE, fun.name = function.name) + if(tempo$problem == TRUE){ + stop(paste0("\n\n================\n\n", tempo$text, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + } + if(x[[i1]] == "fake_x" & y[[i1]] == "fake_y"){ # because the code cannot accept to be both "fake_x" and "fake_y" at the same time + tempo.cat <- paste0("ERROR IN ", function.name, ": CODE INCONSISTENCY 2\nTHE CODE CANNOT ACCEPT x AND y TO BE \"fake_x\" AND \"fake_y\" IN THE SAME DATA FRAME ", i1, " ") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + } + + if(( ! is.null(categ)) & ( ! is.null(categ[[i1]]))){ # is.null(categ[[i1]]) works even if categ is NULL # is.null(categ[[i1]]) works even if categ is NULL # if categ[[i1]] = NULL, fake_categ will be created later on + tempo <- fun_check(data = categ[[i1]], data.name = ifelse(length(categ)== 1L, "categ", paste0("ELEMENT ", i1, " OF categ ARGUMENT")),, class = "vector", mode = "character", length = 1, fun.name = function.name) + if(tempo$problem == TRUE){ + stop(paste0("\n\n================\n\n", tempo$text, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + } + if( ! (categ[[i1]] %in% names(data1[[i1]]))){ + tempo.cat <- paste0("ERROR IN ", function.name, ": ", ifelse(length(categ)== 1L, "categ", paste0("ELEMENT ", i1, " OF categ")), " ARGUMENT MUST BE A COLUMN NAME OF ", ifelse(length(data1)== 1L, "data1 ARGUMENT", paste0("DATA FRAME NUMBER ", i1, " OF data1 ARGUMENT\nHERE IT IS: ", paste(categ[[i1]], collapse = " ")))) + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + } + tempo1 <- fun_check(data = data1[[i1]][, categ[[i1]]], data.name = ifelse(length(categ)== 1L, "categ OF data1 ARGUMENT", paste0("ELEMENT ", i1, " OF categ ARGUMENT IN DATA FRAME NUMBER ", i1, " OF data1 ARGUMENT")), class = "vector", mode = "character", na.contain = TRUE, fun.name = function.name) + tempo2 <- fun_check(data = data1[[i1]][, categ[[i1]]], data.name = ifelse(length(categ)== 1L, "categ OF data1 ARGUMENT", paste0("ELEMENT ", i1, " OF categ ARGUMENT IN DATA FRAME NUMBER ", i1, " OF data1 ARGUMENT")), class = "factor", na.contain = TRUE, fun.name = function.name) + if(tempo1$problem == TRUE & tempo2$problem == TRUE){ + tempo.cat <- paste0("ERROR IN ", function.name, ": ", ifelse(length(categ)== 1L, "categ OF data1 ARGUMENT", paste0("ELEMENT ", i1, " OF categ ARGUMENT IN DATA FRAME NUMBER ", i1, " OF data1 ARGUMENT")), " MUST BE A FACTOR OR CHARACTER VECTOR") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + }else if(tempo1$problem == FALSE){ + data1[[i1]][, categ[[i1]]] <- factor(data1[[i1]][, categ[[i1]]]) # if already a factor, change nothing, if characters, levels according to alphabetical order + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") IN ", ifelse(length(categ)== 1L, "categ", paste0("ELEMENT ", i1, " OF categ ARGUMENT")), " IN ", ifelse(length(data1)== 1L, "data1 ARGUMENT", paste0("DATA FRAME NUMBER ", i1, " OF data1 ARGUMENT")), ", THE CHARACTER COLUMN HAS BEEN CONVERTED TO FACTOR") + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + + } + if(geom[[i1]] == "geom_vline" | geom[[i1]] == "geom_hline"){ + if(length(unique(data1[[i1]][, categ[[i1]]])) != nrow(data1[[i1]])){ + tempo.cat <- paste0("ERROR IN ", function.name, ": ", ifelse(length(geom)== 1L, "geom OF data1 ARGUMENT", paste0("geom NUMBER ", i1, " OF DATA FRAME NUMBER ", i1, " OF data1 ARGUMENT")), " ARGUMENT IS ", geom[[i1]], ", MEANING THAT ", ifelse(length(categ)== 1L, "categ OF data1 ARGUMENT", paste0("ELEMENT ", i1, " OF categ ARGUMENT IN DATA FRAME NUMBER ", i1, " OF data1 ARGUMENT")), " MUST HAVE A DIFFERENT CLASS PER LINE OF data1 (ONE x VALUE PER CLASS)") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + } + } + }else if(( ! is.null(categ)) & is.null(categ[[i1]])){ # is.null(categ[[i1]]) works even if categ is NULL # if categ[[i1]] = NULL, fake_categ will be created. WARNING: is.null(categ[[i1]]) means no legend display (see above), because categ has not been precised. This also means a single color for data1[[i1]] + if(length(color[[i1]]) > 1){ # 0 means is.null(color[[i1]]) or is.null(color) and 1 is ok -> single color for data1[[i1]] + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") NULL ", ifelse(length(categ)== 1L, "categ", paste0("ELEMENT ", i1, " OF categ")), " ARGUMENT BUT CORRESPONDING COLORS IN ", ifelse(length(color)== 1L, "color", paste0("ELEMENT NUMBER ", i1, " OF color ARGUMENT")), " HAS LENGTH OVER 1\n", paste(color[[i1]], collapse = " "), "\nWHICH IS NOT COMPATIBLE WITH NULL CATEG -> COLOR RESET TO A SINGLE COLOR") + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + color[i1] <- list(NULL) # will provide a single color below # Warning color[[i1]] <- NULL removes the compartment + } + categ[[i1]] <- "fake_categ" + data1[[i1]] <- cbind(data1[[i1]], fake_categ = "", stringsAsFactors = TRUE) + # inactivated because give a different color to different "Line_" categ while a single color for all the data1[[i1]] required. Thus, put back after the color management + # if(geom[[i1]] == "geom_hline" | geom[[i1]] == "geom_vline"){ + # data1[[i1]][, "fake_categ"] <- paste0("Line_", 1:nrow(data1[[i1]])) + # }else{ + data1[[i1]][, "fake_categ"] <- data1[[i1]][, "fake_categ"] # as.numeric("") create a vector of NA but class numeric + # } + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") NULL ", ifelse(length(categ)== 1L, "categ", paste0("ELEMENT ", i1, " OF categ")), " ARGUMENT -> FOR DATA FRAME ", ifelse(length(data1)== 1L, "data1 ARGUMENT:", paste0("NUMBER ", i1, " OF data1 ARGUMENT:")), "\n- FAKE \"fake_categ\" COLUMN ADDED FILLED WITH \"\"(OR WITH \"Line_...\" FOR LINES)\n- SINGLE COLOR USED FOR PLOTTING\n- NO LEGEND DISPLAYED") + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + } + # OK: if categ is not NULL, all the non-null categ columns of data1 are factors from here + + # management of log scale and Inf removal + if(x[[i1]] != "fake_x"){ + if(any(( ! is.finite(data1[[i1]][, x[[i1]]])) & ( ! is.na(data1[[i1]][, x[[i1]]])))){ # is.finite also detects NA: ( ! is.finite(data1[, y])) & ( ! is.na(data1[, y])) detects only Inf + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") PRESENCE OF -Inf OR Inf VALUES IN ", ifelse(length(categ)== 1L, "x", paste0("ELEMENT ", i1, " OF x ARGUMENT")), " IN ", ifelse(length(data1)== 1L, "data1 ARGUMENT", paste0("DATA FRAME NUMBER ", i1, " OF data1 ARGUMENT")), " AND CORRESPONDING ROWS REMOVED (SEE $removed.row.nb AND $removed.rows)") + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + } + } + if(y[[i1]] != "fake_y"){ + if(any(( ! is.finite(data1[[i1]][, y[[i1]]])) & ( ! is.na(data1[[i1]][, y[[i1]]])))){ # is.finite also detects NA: ( ! is.finite(data1[, y])) & ( ! is.na(data1[, y])) detects only Inf + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") PRESENCE OF -Inf OR Inf VALUES IN ", ifelse(length(categ)== 1L, "y", paste0("ELEMENT ", i1, " OF y ARGUMENT")), " IN ", ifelse(length(data1)== 1L, "data1 ARGUMENT", paste0("DATA FRAME NUMBER ", i1, " OF data1 ARGUMENT")), " AND CORRESPONDING ROWS REMOVED (SEE $removed.row.nb AND $removed.rows)") + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + } + } + # log conversion + if(x.log != "no"){ + tempo1 <- ! is.finite(data1[[i1]][, x[[i1]]]) # where are initial NA and Inf + data1[[i1]][, x[[i1]]] <- suppressWarnings(get(x.log)(data1[[i1]][, x[[i1]]]))# no env = sys.nframe(), inherit = FALSE in get() because look for function in the classical scope + if(any( ! (tempo1 | is.finite(data1[[i1]][, x[[i1]]])))){ + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") LOG CONVERSION INTRODUCED -Inf OR Inf OR NaN VALUES IN ", ifelse(length(categ)== 1L, "x", paste0("ELEMENT ", i1, " OF x ARGUMENT")), " IN ", ifelse(length(data1)== 1L, "data1 ARGUMENT", paste0("DATA FRAME NUMBER ", i1, " OF data1 ARGUMENT")), " AND CORRESPONDING ROWS REMOVED (SEE $removed.row.nb AND $removed.rows)") + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + } + } + if(y.log != "no"){ + tempo1 <- ! is.finite(data1[[i1]][, y[[i1]]]) # where are initial NA and Inf + data1[[i1]][, y[[i1]]] <- suppressWarnings(get(y.log)(data1[[i1]][, y[[i1]]]))# no env = sys.nframe(), inherit = FALSE in get() because look for function in the classical scope + if(any( ! (tempo1 | is.finite(data1[[i1]][, y[[i1]]])))){ + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") LOG CONVERSION INTRODUCED -Inf OR Inf OR NaN VALUES IN ", ifelse(length(categ)== 1L, "y", paste0("ELEMENT ", i1, " OF y ARGUMENT")), " IN ", ifelse(length(data1)== 1L, "data1 ARGUMENT", paste0("DATA FRAME NUMBER ", i1, " OF data1 ARGUMENT")), " AND CORRESPONDING ROWS REMOVED (SEE $removed.row.nb AND $removed.rows)") + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + } + } + # Inf removal + # removed.row.nb[[i1]] <- NULL # already NULL and Warning this removes the compartment + removed.rows[[i1]] <- data.frame(stringsAsFactors = FALSE) + if(any(( ! is.finite(data1[[i1]][, x[[i1]]])) & ( ! is.na(data1[[i1]][, x[[i1]]])))){ # is.finite also detects NA: ( ! is.finite(data1[[i1]][, x[[i1]]])) & ( ! is.na(data1[[i1]][, x[[i1]]])) detects only Inf + removed.row.nb[[i1]] <- c(removed.row.nb[[i1]], which(( ! is.finite(data1[[i1]][, x[[i1]]])) & ( ! is.na(data1[[i1]][, x[[i1]]])))) + } + if(any(( ! is.finite(data1[[i1]][, y[[i1]]])) & ( ! is.na(data1[[i1]][, y[[i1]]])))){ # is.finite also detects NA: ( ! is.finite(data1[[i1]][, y[[i1]]])) & ( ! is.na(data1[[i1]][, y[[i1]]])) detects only Inf + removed.row.nb[[i1]] <- c(removed.row.nb[[i1]], which(( ! is.finite(data1[[i1]][, y[[i1]]])) & ( ! is.na(data1[[i1]][, y[[i1]]])))) + } + if( ! is.null(removed.row.nb[[i1]])){ + removed.row.nb[[i1]] <- unique(removed.row.nb[[i1]]) # to remove the duplicated positions (NA in both x and y) + removed.rows[[i1]] <- rbind(removed.rows[[i1]], data1.ini[[i1]][removed.row.nb[[i1]], ]) # here data1.ini used to have the y = O rows that will be removed because of Inf creation after log transformation + data1[[i1]] <- data1[[i1]][-removed.row.nb[[i1]], ] + data1.ini[[i1]] <- data1.ini[[i1]][-removed.row.nb[[i1]], ] # + } + # From here, data1 and data.ini have no more Inf + # end Inf removal + # x.lim and y.lim dealt later on, after the end f the loop + # end management of log scale and Inf removal + # management of log scale + if(x.log != "no"){ + data1[[i1]][, x[[i1]]] <- suppressWarnings(get(x.log)(data1[[i1]][, x[[i1]]])) # no env = sys.nframe(), inherit = FALSE in get() because look for function in the classical scope + } + if(y.log != "no"){ + data1[[i1]][, y[[i1]]] <- suppressWarnings(get(y.log)(data1[[i1]][, y[[i1]]])) # no env = sys.nframe(), inherit = FALSE in get() because look for function in the classical scope + } + # end management of log scale + # na detection and removal + column.check <- unique(unlist(c( # unlist because creates a list + if(x[[i1]] == "fake_x"){NULL}else{x[[i1]]}, + if(y[[i1]] == "fake_y"){NULL}else{y[[i1]]}, + if( ! is.null(categ)){if(is.null(categ[[i1]])){NULL}else{categ[[i1]]}}, + if( ! is.null(facet.categ)){if(is.null(facet.categ[[i1]])){NULL}else{facet.categ[[i1]]}} + ))) # dot.categ because can be a 3rd column of data1 + if(any(is.na(data1[[i1]][, column.check]))){ + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") NA DETECTED IN COLUMNS ", paste(column.check, collapse = " "), " OF ", ifelse(length(data1)== 1L, "data1 ARGUMENT", paste0("DATA FRAME NUMBER ", i1, " OF data1 ARGUMENT")), " AND CORRESPONDING ROWS REMOVED (SEE $removed.row.nb AND $removed.rows)") + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + for(i3 in 1:length(column.check)){ + if(any(is.na(data1[[i1]][, column.check[i3]]))){ + warn.count <- warn.count + 1 + tempo.warn <- paste0("NA REMOVAL DUE TO COLUMN ", column.check[i3], " OF ", ifelse(length(data1)== 1L, "data1 ARGUMENT", paste0("DATA FRAME NUMBER ", i1, " OF data1 ARGUMENT"))) + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + } + } + tempo <- unique(unlist(lapply(lapply(c(data1[[i1]][column.check]), FUN = is.na), FUN = which))) + removed.row.nb[[i1]] <- c(removed.row.nb[[i1]], tempo) + removed.rows[[i1]] <- rbind(removed.rows[[i1]], data1.ini[[i1]][tempo, ]) # # tempo used because removed.row.nb is not empty. Here data1.ini used to have the non NA rows that will be removed because of NAN creation after log transformation (neg values for instance) + column.check <- column.check[ ! (column.check == x[[i1]] | column.check == y[[i1]])] # remove x and y to keep quali columns + if(length(tempo) != 0){ + data1[[i1]] <- data1[[i1]][-tempo, ] # WARNING tempo here and not removed.row.nb because the latter contain more numbers thant the former + data1.ini[[i1]] <- data1.ini[[i1]][-tempo, ] # WARNING tempo here and not removed.row.nb because the latter contain more numbers than the former + for(i4 in 1:length(column.check)){ + if(any( ! unique(removed.rows[[i1]][, column.check[i4]]) %in% unique(data1[[i1]][, column.check[i4]]))){ + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") IN COLUMN ", column.check[i4], " OF ", ifelse(length(data1)== 1L, "data1 ARGUMENT", paste0("DATA FRAME NUMBER ", i1, " OF data1 ARGUMENT")), ", THE FOLLOWING CLASSES HAVE DISAPPEARED AFTER NA REMOVAL\n(IF COLUMN USED IN THE PLOT, THIS CLASS WILL NOT BE DISPLAYED):\n", paste(unique(removed.rows[[i1]][, column.check[i4]])[ ! unique(removed.rows[[i1]][, column.check[i4]]) %in% unique(data1[[i1]][, column.check[i4]])], collapse = " ")) + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + tempo.levels <- levels(data1[[i1]][, column.check[i4]])[levels(data1[[i1]][, column.check[i4]]) %in% unique(as.character(data1[[i1]][, column.check[i4]]))] + data1[[i1]][, column.check[i4]] <- factor(as.character(data1[[i1]][, column.check[i4]]), levels = tempo.levels) + if(column.check[i4] %in% categ[[i1]] & ! is.null(categ.class.order)){ + categ.class.order[[i1]] <- levels(data1[[i1]][, column.check[i4]])[levels(data1[[i1]][, column.check[i4]]) %in% unique(data1[[i1]][, column.check[i4]])] # remove the absent class in the categ.class.order vector + data1[[i1]][, column.check[i4]] <- factor(as.character(data1[[i1]][, column.check[i4]]), levels = unique(categ.class.order[[i1]])) + } + } + } + } + } + # end na detection and removal + # From here, data1 and data.ini have no more NA or NaN in x, y, categ (if categ != NULL) and facet.categ (if categ != NULL) + if( ! is.null(categ.class.order)){ + # the following check will be done several times but I prefer to keep it here, after the creation of categ + if(is.null(categ[[i1]]) & ! is.null(categ.class.order[[i1]])){ + tempo.cat <- paste0("ERROR IN ", function.name, "\nCOMPARTMENT ", i1, " OF categ ARGUMENT CANNOT BE NULL IF COMPARTMENT ", i1, " OF categ.class.order ARGUMENT IS NOT NULL: ", paste(categ.class.order, collapse = " ")) + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + }else{ + if(is.null(categ.class.order[[i1]])){ + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") THE categ.class.order COMPARTMENT ", i1, " IS NULL. ALPHABETICAL ORDER WILL BE APPLIED") + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + data1[[i1]][, categ[[i1]]] <- factor(as.character(data1[[i1]][, categ[[i1]]])) # if already a factor, change nothing, if characters, levels according to alphabetical order + categ.class.order[[i1]] <- levels(data1[[i1]][, categ[[i1]]]) # character vector that will be used later + }else{ + tempo <- fun_check(data = categ.class.order[[i1]], data.name = paste0("COMPARTMENT ", i1 , " OF categ.class.order ARGUMENT"), class = "vector", mode = "character", length = length(levels(data1[[i1]][, categ[[i1]]])), fun.name = function.name) # length(data1[, categ[i1]) -> if data1[, categ[i1] was initially character vector, then conversion as factor after the NA removal, thus class number ok. If data1[, categ[i1] was initially factor, no modification after the NA removal, thus class number ok + if(tempo$problem == TRUE){ + stop(paste0("\n\n================\n\n", tempo$text, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + } + } + if(any(duplicated(categ.class.order[[i1]]))){ + tempo.cat <- paste0("ERROR IN ", function.name, "\nCOMPARTMENT ", i1, " OF categ.class.order ARGUMENT CANNOT HAVE DUPLICATED CLASSES: ", paste(categ.class.order[[i1]], collapse = " ")) + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + }else if( ! (all(categ.class.order[[i1]] %in% unique(data1[[i1]][, categ[[i1]]])) & all(unique(data1[[i1]][, categ[[i1]]]) %in% categ.class.order[[i1]]))){ + tempo.cat <- paste0("ERROR IN ", function.name, "\nCOMPARTMENT ", i1, " OF categ.class.order ARGUMENT MUST BE CLASSES OF COMPARTMENT ", i1, " OF categ ARGUMENT\nHERE IT IS:\n", paste(categ.class.order[[i1]], collapse = " "), "\nFOR COMPARTMENT ", i1, " OF categ.class.order AND IT IS:\n", paste(unique(data1[[i1]][, categ[[i1]]]), collapse = " "), "\nFOR COLUMN ", categ[[i1]], " OF data1 NUMBER ", i1) + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + }else{ + data1[[i1]][, categ[[i1]]] <- factor(data1[[i1]][, categ[[i1]]], levels = categ.class.order[[i1]]) # reorder the factor + } + names(categ.class.order)[i1] <- categ[[i1]] + } + } + # OK: if categ.class.order is not NULL, all the NULL categ.class.order columns of data1 are character from here + + if( ! is.null(legend.name[[i1]])){ + tempo <- fun_check(data = legend.name[[i1]], data.name = ifelse(length(legend.name)== 1L, "legend.name", paste0("legend.name NUMBER ", i1)),, class = "vector", mode = "character", length = 1, fun.name = function.name) + if(tempo$problem == TRUE){ + stop(paste0("\n\n================\n\n", tempo$text, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + } + } + if( ! is.null(color)){ # if color is NULL, will be filled later on + # check the nature of color + if(is.null(color[[i1]])){ + compart.null.color <- compart.null.color + 1 + color[[i1]] <- grey(compart.null.color / 8) # cannot be more than 7 overlays. Thus 7 different greys. 8/8 is excluded because white dots + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") NULL COLOR IN ", ifelse(length(color)== 1L, "color", paste0("ELEMENT NUMBER ", i1, " OF color ARGUMENT")), " ASSOCIATED TO ", ifelse(length(data1)== 1L, "data1 ARGUMENT", paste0("DATA FRAME NUMBER ", i1, " OF data1 ARGUMENT")), ", SINGLE COLOR ", paste(color[[i1]], collapse = " "), " HAS BEEN ATTRIBUTED") + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + } + tempo1 <- fun_check(data = color[[i1]], data.name = ifelse(length(color)== 1L, "color", paste0("ELEMENT NUMBER ", i1, " OF color ARGUMENT")), class = "vector", mode = "character", na.contain = TRUE, fun.name = function.name) # na.contain = TRUE in case of colum of data1 + tempo2 <- fun_check(data = color[[i1]], data.name = ifelse(length(color)== 1L, "color", paste0("ELEMENT NUMBER ", i1, " OF color ARGUMENT")), class = "factor", na.contain = TRUE, fun.name = function.name) # idem + if(tempo1$problem == TRUE & tempo2$problem == TRUE){ + tempo.cat <- paste0("ERROR IN ", function.name, ": ", ifelse(length(color)== 1L, "color", paste0("ELEMENT NUMBER ", i1, " OF color ARGUMENT")), " MUST BE A FACTOR OR CHARACTER VECTOR OR INTEGER VECTOR") # integer possible because dealt above + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + }else if( ! (all(color[[i1]] %in% colors() | grepl(pattern = "^#", color[[i1]])))){ # check that all strings of low.color start by # + tempo.cat <- paste0("ERROR IN ", function.name, ": ", ifelse(length(color)== 1L, "color", paste0("ELEMENT NUMBER ", i1, " OF color ARGUMENT")), " MUST BE A HEXADECIMAL COLOR VECTOR STARTING BY # AND/OR COLOR NAMES GIVEN BY colors(): ", paste(unique(color[[i1]]), collapse = " ")) + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + } + if(any(is.na(color[[i1]]))){ + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") IN ", ifelse(length(color)== 1L, "color", paste0("ELEMENT NUMBER ", i1, " OF color ARGUMENT")), ", THE COLORS:\n", paste(unique(color[[i1]]), collapse = " "), "\nCONTAINS NA") + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + } + # end check the nature of color + # check the length of color + if(is.null(categ) & length(color[[i1]]) != 1){ + tempo.cat <- paste0("ERROR IN ", function.name, ": ", ifelse(length(color)== 1L, "color", paste0("ELEMENT NUMBER ", i1, " OF color ARGUMENT")), " MUST BE A SINGLE COLOR IF categ IS NULL") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + }else if( ! is.null(categ)){ + # No problem of NA management by ggplot2 because already removed + if(categ[[i1]] == "fake_categ" & length(color[[i1]]) != 1){ + tempo.cat <- paste0("ERROR IN ", function.name, ": ", ifelse(length(color)== 1L, "color", paste0("ELEMENT NUMBER ", i1, " OF color ARGUMENT")), " MUST BE A SINGLE COLOR IF ", ifelse(length(categ)== 1L, "categ", paste0("ELEMENT ", i1, " OF categ ARGUMENT")), " IS NULL") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + }else if(length(color[[i1]]) == length(unique(data1[[i1]][, categ[[i1]]]))){ # here length(color) is equal to the different number of categ + data1[[i1]][, categ[[i1]]] <- factor(data1[[i1]][, categ[[i1]]]) # if already a factor, change nothing, if characters, levels according to alphabetical order + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") IN ", ifelse(length(categ)== 1L, "categ", paste0("ELEMENT ", i1, " OF categ ARGUMENT")), " IN ", ifelse(length(data1)== 1L, "data1 ARGUMENT", paste0("DATA FRAME NUMBER ", i1, " OF data1 ARGUMENT")), ", THE FOLLOWING COLORS:\n", paste(color[[i1]], collapse = " "), "\nHAVE BEEN ATTRIBUTED TO THESE CLASSES:\n", paste(levels(factor(data1[[i1]][, categ[[i1]]])), collapse = " ")) + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + }else if(length(color[[i1]]) == length(data1[[i1]][, categ[[i1]]])){# here length(color) is equal to nrow(data1[[i1]]) -> Modif to have length(color) equal to the different number of categ (length(color) == length(levels(data1[[i1]][, categ[[i1]]]))) + data1[[i1]] <- cbind(data1[[i1]], color = color[[i1]], stringsAsFactors = TRUE) + tempo.check <- unique(data1[[i1]][ , c(categ[[i1]], "color")]) + if( ! (nrow(data1[[i1]]) == length(color[[i1]]) & nrow(tempo.check) == length(unique(data1[[i1]][ , categ[[i1]]])))){ + tempo.cat <- paste0("ERROR IN ", function.name, ": ", ifelse(length(color)== 1L, "color", paste0("ELEMENT NUMBER ", i1, " OF color")), " ARGUMENT HAS THE LENGTH OF ", ifelse(length(categ)== 1L, "categ", paste0("ELEMENT ", i1, " OF categ ARGUMENT")), " IN ", ifelse(length(data1)== 1L, "data1 ARGUMENT", paste0("DATA FRAME NUMBER ", i1, " OF data1 ARGUMENT")), "\nBUT IS INCORRECTLY ASSOCIATED TO EACH CLASS OF THIS categ:\n", paste(unique(mapply(FUN = "paste", data1[[i1]][ ,categ[[i1]]], data1[[i1]][ ,"color"])), collapse = "\n")) + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + }else{ + data1[[i1]][, categ[[i1]]] <- factor(data1[[i1]][, categ[[i1]]]) # if already a factor, change nothing, if characters, levels according to alphabetical order + color[[i1]] <- unique(color[[i1]][order(data1[[i1]][, categ[[i1]]])]) # Modif to have length(color) equal to the different number of categ (length(color) == length(levels(data1[[i1]][, categ[[i1]]]))) + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count, ") FROM FUNCTION ", function.name, ": ", ifelse(length(color)== 1L, "color", paste0("ELEMENT NUMBER ", i1, " OF color ARGUMENT")), " HAS THE LENGTH OF ", ifelse(length(categ)== 1L, "categ", paste0("ELEMENT ", i1, " OF categ ARGUMENT")), " IN ", ifelse(length(data1)== 1L, "data1 ARGUMENT", paste0("DATA FRAME NUMBER ", i1, " OF data1 ARGUMENT")), " COLUMN VALUES\nCOLORS HAVE BEEN RESPECTIVELY ASSOCIATED TO EACH CLASS OF categ AS:\n", paste(levels(factor(data1[[i1]][, categ[[i1]]])), collapse = " "), "\n", paste(color[[i1]], collapse = " ")) + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + } + }else if(length(color[[i1]])== 1L){ + data1[[i1]][, categ[[i1]]] <- factor(data1[[i1]][, categ[[i1]]]) # if already a factor, change nothing, if characters, levels according to alphabetical order + color[[i1]] <- rep(color[[i1]], length(levels(data1[[i1]][, categ[[i1]]]))) + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") IN ", ifelse(length(categ)== 1L, "categ", paste0("ELEMENT ", i1, " OF categ ARGUMENT")), " IN ", ifelse(length(data1)== 1L, "data1 ARGUMENT", paste0("DATA FRAME NUMBER ", i1, " OF data1 ARGUMENT")), ", COLOR HAS LENGTH 1 MEANING THAT ALL THE DIFFERENT CLASSES OF ", ifelse(length(categ)== 1L, "categ", paste0("ELEMENT ", i1, " OF categ ARGUMENT")), "\n", paste(levels(factor(data1[[i1]][, categ[[i1]]])), collapse = " "), "\nWILL HAVE THE SAME COLOR\n", paste(color[[i1]], collapse = " ")) + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + }else{ + tempo.cat <- paste0("ERROR IN ", function.name, ": ", ifelse(length(color)== 1L, "color", paste0("ELEMENT NUMBER ", i1, " OF color ARGUMENT")), " MUST BE\n(1) LENGTH 1\nOR (2) THE LENGTH OF ", ifelse(length(categ)== 1L, "categ", paste0("ELEMENT ", i1, " OF categ ARGUMENT")), " IN ", ifelse(length(data1)== 1L, "data1 ARGUMENT", paste0("DATA FRAME NUMBER ", i1, " OF data1 ARGUMENT")), " COLUMN VALUES\nOR (3) THE LENGTH OF THE CLASSES IN THIS COLUMN\nHERE IT IS COLOR LENGTH ", length(color[[i1]]), " VERSUS CATEG LENGTH ", length(data1[[i1]][, categ[[i1]]]), " AND CATEG CLASS LENGTH ", length(unique(data1[[i1]][, categ[[i1]]])), "\nPRESENCE OF NA IN THE COLUMN x, y OR categ OF data1 COULD BE THE PROBLEME") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + } + } + } + if((geom[[i1]] == "geom_hline" | geom[[i1]] == "geom_vline") & ! is.null(categ[[i1]])){ # add here after the color management, to deal with the different lines to plot inside any data[[i1]] + if(categ[[i1]] == "fake_categ"){ + data1[[i1]][, "fake_categ"] <- factor(paste0("Line_", formatC(1:nrow(data1[[i2]]), width = nchar(nrow(data1[[i2]])), flag = "0"))) + } + } + tempo <- fun_check(data = alpha[[i1]], data.name = ifelse(length(alpha)== 1L, "alpha", paste0("alpha NUMBER ", i1)), prop = TRUE, length = 1, fun.name = function.name) + if(tempo$problem == TRUE){ + stop(paste0("\n\n================\n\n", tempo$text, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + } + } + # end loop (checking inside list compartment) + if(length(data1) > 1){ + if(length(unique(unlist(x)[ ! x == "fake_x"])) > 1){ + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") THE x ARGUMENT DOES NOT CONTAIN IDENTICAL COLUMN NAMES:\n", paste(unlist(x), collapse = " "), "\nX-AXIS OVERLAYING DIFFERENT VARIABLES?") + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + } + } + if(length(data1) > 1){ + if(length(unique(unlist(y)[ ! y == "fake_y"])) > 1){ + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") THE y ARGUMENT DOES NOT CONTAIN IDENTICAL COLUMN NAMES:\n", paste(unlist(y), collapse = " "), "\nY-AXIS OVERLAYING DIFFERENT VARIABLES?") + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + } + } + if(sum(geom %in% "geom_point") > 3){ + tempo.cat <- paste0("ERROR IN ", function.name, ": geom ARGUMENT CANNOT HAVE MORE THAN THREE \"geom_point\" ELEMENTS") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + }else if(length(geom) - sum(geom %in% "geom_point") > 3){ + tempo.cat <- paste0("ERROR IN ", function.name, ": geom ARGUMENT CANNOT HAVE MORE THAN THREE LINE ELEMENTS") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + } + # x.lim management before transfo by x.log + if(x.log != "no" & ! is.null(x.lim)){ + if(any(x.lim <= 0)){ + tempo.cat <- paste0("ERROR IN ", function.name, "\nx.lim ARGUMENT CANNOT HAVE ZERO OR NEGATIVE VALUES WITH THE x.log ARGUMENT SET TO ", x.log, ":\n", paste(x.lim, collapse = " ")) + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + }else if(any( ! is.finite(if(x.log == "log10"){log10(x.lim)}else{log2(x.lim)}))){ + tempo.cat <- paste0("ERROR IN ", function.name, "\nx.lim ARGUMENT RETURNS INF/NA WITH THE x.log ARGUMENT SET TO ", x.log, "\nAS SCALE COMPUTATION IS ", ifelse(x.log == "log10", "log10", "log2"), ":\n", paste(if(x.log == "log10"){log10(x.lim)}else{log2(x.lim)}, collapse = " ")) + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + } + } + if(x.log != "no" & x.include.zero == TRUE){ + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") x.log ARGUMENT SET TO ", x.log, " AND x.include.zero ARGUMENT SET TO TRUE -> x.include.zero ARGUMENT RESET TO FALSE BECAUSE 0 VALUE CANNOT BE REPRESENTED IN LOG SCALE") + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + x.include.zero <- FALSE + } + # end x.lim management before transfo by x.log + # y.lim management before transfo by y.log + if(y.log != "no" & ! is.null(y.lim)){ + if(any(y.lim <= 0)){ + tempo.cat <- paste0("ERROR IN ", function.name, "\ny.lim ARGUMENT CANNOT HAVE ZERO OR NEGATIVE VALUES WITH THE y.log ARGUMENT SET TO ", y.log, ":\n", paste(y.lim, collapse = " ")) + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + }else if(any( ! is.finite(if(y.log == "log10"){log10(y.lim)}else{log2(y.lim)}))){ + tempo.cat <- paste0("ERROR IN ", function.name, "\ny.lim ARGUMENT RETURNS INF/NA WITH THE y.log ARGUMENT SET TO ", y.log, "\nAS SCALE COMPUTATION IS ", ifelse(y.log == "log10", "log10", "log2"), ":\n", paste(if(y.log == "log10"){log10(y.lim)}else{log2(y.lim)}, collapse = " ")) + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + } + } + if(y.log != "no" & y.include.zero == TRUE){ + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") y.log ARGUMENT SET TO ", y.log, " AND y.include.zero ARGUMENT SET TO TRUE -> y.include.zero ARGUMENT RESET TO FALSE BECAUSE 0 VALUE CANNOT BE REPRESENTED IN LOG SCALE") + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + y.include.zero <- FALSE + } + # end y.lim management before transfo by y.log + # end other checkings + # reserved word checking + #already done above + # end reserved word checking + # end second round of checking and data preparation + + + # package checking + fun_pack(req.package = c( + "gridExtra", + "ggplot2", + "lemon", + "scales" + ), lib.path = lib.path) + # packages Cairo and grid tested by fun_gg_point_rast() + # end package checking + + + + + # main code + # axes management + if(is.null(x.lim)){ + if(any(unlist(mapply(FUN = "[[", data1, x, SIMPLIFY = FALSE)) %in% c(Inf, -Inf))){ + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") THE x COLUMN IN data1 CONTAINS -Inf OR Inf VALUES THAT WILL NOT BE CONSIDERED IN THE PLOT RANGE") + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + } + x.lim <- suppressWarnings(range(unlist(mapply(FUN = "[[", data1, x, SIMPLIFY = FALSE)), na.rm = TRUE, finite = TRUE)) # finite = TRUE removes all the -Inf and Inf except if only this. In that case, whatever the -Inf and/or Inf present, output -Inf;Inf range. Idem with NA only. y.lim added here. If NULL, ok if y argument has values + }else if(x.log != "no"){ + x.lim <- get(x.log)(x.lim) # no env = sys.nframe(), inherit = FALSE in get() because look for function in the classical scope + } + if(x.log != "no"){ + if(any( ! is.finite(x.lim))){ + tempo.cat <- paste0("ERROR IN ", function.name, "\nx.lim ARGUMENT CANNOT HAVE ZERO OR NEGATIVE VALUES WITH THE x.log ARGUMENT SET TO ", x.log, ":\n", paste(x.lim, collapse = " "), "\nPLEASE, CHECK DATA VALUES (PRESENCE OF ZERO OR INF VALUES)") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + } + } + if(suppressWarnings(all(x.lim %in% c(Inf, -Inf)))){ # happen when x is only NULL + if(all(unlist(geom) %in% c("geom_vline", "geom_stick"))){ + tempo.cat <- paste0("ERROR IN ", function.name, " NOT POSSIBLE TO DRAW geom_vline OR geom_stick KIND OF LINES ALONE IF x.lim ARGUMENT IS SET TO NULL, SINCE NO X-AXIS DEFINED (", ifelse(length(x)== 1L, "x", paste0("ELEMENT ", i1, " OF x")), " ARGUMENT MUST BE NULL FOR THESE KIND OF LINES)") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + }else{ + tempo.cat <- paste0("ERROR IN ", function.name, " x.lim ARGUMENT MADE OF NA, -Inf OR Inf ONLY: ", paste(x.lim, collapse = " ")) + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + } + } + x.lim.order <- order(x.lim) # to deal with inverse axis + # print(x.lim.order) + x.lim <- sort(x.lim) + x.lim[1] <- x.lim[1] - abs(x.lim[2] - x.lim[1]) * ifelse(diff(x.lim.order) > 0, x.right.extra.margin, x.left.extra.margin) # diff(x.lim.order) > 0 means not inversed axis + x.lim[2] <- x.lim[2] + abs(x.lim[2] - x.lim[1]) * ifelse(diff(x.lim.order) > 0, x.left.extra.margin, x.right.extra.margin) # diff(x.lim.order) > 0 means not inversed axis + if(x.include.zero == TRUE){ # no need to check x.log != "no" because done before + x.lim <- range(c(x.lim, 0), na.rm = TRUE, finite = TRUE) # finite = TRUE removes all the -Inf and Inf except if only this. In that case, whatever the -Inf and/or Inf present, output -Inf;Inf range. Idem with NA only + } + x.lim <- x.lim[x.lim.order] + if(any(is.na(x.lim))){ + tempo.cat <- paste0("ERROR IN ", function.name, ": CODE INCONSISTENCY 3") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + } + if(is.null(y.lim)){ + if(any(unlist(mapply(FUN = "[[", data1, y, SIMPLIFY = FALSE)) %in% c(Inf, -Inf))){ + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") THE y COLUMN IN data1 CONTAINS -Inf OR Inf VALUES THAT WILL NOT BE CONSIDERED IN THE PLOT RANGE") + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + } + y.lim <- suppressWarnings(range(unlist(mapply(FUN = "[[", data1, y, SIMPLIFY = FALSE)), na.rm = TRUE, finite = TRUE)) # finite = TRUE removes all the -Inf and Inf except if only this. In that case, whatever the -Inf and/or Inf present, output -Inf;Inf range. Idem with NA only. y.lim added here. If NULL, ok if y argument has values + }else if(y.log != "no"){ + y.lim <- get(y.log)(y.lim) # no env = sys.nframe(), inherit = FALSE in get() because look for function in the classical scope + } + if(y.log != "no"){ + if(any( ! is.finite(y.lim))){ + tempo.cat <- paste0("ERROR IN ", function.name, "\ny.lim ARGUMENT CANNOT HAVE ZERO OR NEGATIVE VALUES WITH THE y.log ARGUMENT SET TO ", y.log, ":\n", paste(y.lim, collapse = " "), "\nPLEASE, CHECK DATA VALUES (PRESENCE OF ZERO OR INF VALUES)") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + } + } + if(suppressWarnings(all(y.lim %in% c(Inf, -Inf)))){ # happen when y is only NULL + if(all(unlist(geom) == "geom_vline")){ + tempo.cat <- paste0("ERROR IN ", function.name, " NOT POSSIBLE TO DRAW geom_vline KIND OF LINES ALONE IF y.lim ARGUMENT IS SET TO NULL, SINCE NO Y-AXIS DEFINED (", ifelse(length(y)== 1L, "y", paste0("ELEMENT ", i1, " OF y")), " ARGUMENT MUST BE NULL FOR THESE KIND OF LINES)") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + }else{ + tempo.cat <- paste0("ERROR IN ", function.name, " y.lim ARGUMENT MADE OF NA, -Inf OR Inf ONLY: ", paste(y.lim, collapse = " ")) + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + } + } + y.lim.order <- order(y.lim) # to deal with inverse axis + y.lim <- sort(y.lim) + y.lim[1] <- y.lim[1] - abs(y.lim[2] - y.lim[1]) * ifelse(diff(y.lim.order) > 0, y.bottom.extra.margin, y.top.extra.margin) # diff(y.lim.order) > 0 means not inversed axis + y.lim[2] <- y.lim[2] + abs(y.lim[2] - y.lim[1]) * ifelse(diff(y.lim.order) > 0, y.top.extra.margin, y.bottom.extra.margin) # diff(y.lim.order) > 0 means not inversed axis + if(y.include.zero == TRUE){ # no need to check y.log != "no" because done before + y.lim <- range(c(y.lim, 0), na.rm = TRUE, finite = TRUE) # finite = TRUE removes all the -Inf and Inf except if only this. In that case, whatever the -Inf and/or Inf present, output -Inf;Inf range. Idem with NA only + } + y.lim <- y.lim[y.lim.order] + if(any(is.na(y.lim))){ + tempo.cat <- paste0("ERROR IN ", function.name, ": CODE INCONSISTENCY 4") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + } + # end axes management + + + + + # create a fake categ if NULL to deal with legend display + if(is.null(categ)){ + categ <- vector("list", length(data1)) + categ[] <- "fake_categ" + for(i2 in 1:length(data1)){ + data1[[i2]] <- cbind(data1[[i2]], fake_categ = "", stringsAsFactors = TRUE) + if(geom[[i2]] == "geom_hline" | geom[[i2]] == "geom_vline"){ + data1[[i2]][, "fake_categ"] <- factor(paste0("Line_", 1:nrow(data1[[i2]]))) + } + } + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") NULL categ ARGUMENT -> FAKE \"fake_categ\" COLUMN ADDED TO EACH DATA FRAME OF data1, AND FILLED WITH \"\"") + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + } + # categ is not NULL anymore + if(is.null(categ.class.order)){ + categ.class.order <- vector("list", length = length(data1)) + tempo.categ.class.order <- NULL + for(i2 in 1:length(categ.class.order)){ + categ.class.order[[i2]] <- levels(data1[[i2]][, categ[[i2]]]) + names(categ.class.order)[i2] <- categ[[i2]] + tempo.categ.class.order <- c(tempo.categ.class.order, ifelse(i2 != 1, "\n", ""), categ.class.order[[i2]]) + } + if(any(unlist(legend.disp))){ + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") THE categ.class.order SETTING IS NULL. ALPHABETICAL ORDER WILL BE APPLIED FOR CLASS ORDERING:\n", paste(tempo.categ.class.order, collapse = " ")) + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + } + } + # end create a fake categ if NULL to deal with legend display + # categ.class.order is not NULL anymore + + + # vector of color with length as in levels(categ) of data1 + if(is.null(color)){ + color <- vector("list", length(data1)) + length.categ.list <- lapply(lapply(mapply(FUN = "[[", data1, categ, SIMPLIFY = FALSE), FUN = unique), FUN = function(x){length(x[ ! is.na(x)])}) + length.categ.list[sapply(categ, FUN = "==", "fake_categ")] <- 1 # when is.null(color), a single color for all the dots or lines of data[[i1]] that contain "fake_categ" category + total.categ.length <- sum(unlist(length.categ.list), na.rm = TRUE) + tempo.color <- fun_gg_palette(total.categ.length) + tempo.count <- 0 + for(i2 in 1:length(data1)){ + color[[i2]] <- tempo.color[(1:length.categ.list[[i2]]) + tempo.count] + tempo.count <- tempo.count + length.categ.list[[i2]] + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") NULL color ARGUMENT -> COLORS RESPECTIVELY ATTRIBUTED TO EACH CLASS OF ", ifelse(length(categ)== 1L, "categ", paste0("ELEMENT ", i2, " OF categ ARGUMENT")), " (", categ[[i2]], ") IN ", ifelse(length(data1)== 1L, "data1 ARGUMENT", paste0("DATA FRAME NUMBER ", i2, " OF data1 ARGUMENT")), ":\n", paste(color[[i2]], collapse = " "), "\n", paste(if(all(levels(data1[[i2]][, categ[[i2]]]) == "")){'\"\"'}else{levels(data1[[i2]][, categ[[i2]]])}, collapse = " ")) + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + } + } + # end vector of color with length as in levels(categ) of data1 + # color is not NULL anymore + + + + + + # last check + for(i1 in 1:length(data1)){ + if(categ[[i1]] != "fake_categ" & length(color[[i1]]) != length(unique(data1[[i1]][, categ[[i1]]]))){ + tempo.cat <- paste0("ERROR IN ", function.name, " LAST CHECK: ", ifelse(length(color)== 1L, "color", paste0("ELEMENT NUMBER ", i1, " OF color ARGUMENT")), " MUST HAVE THE LENGTH OF LEVELS OF ", ifelse(length(categ)== 1L, "categ", paste0("ELEMENT ", i1, " OF categ ARGUMENT")), " IN ", ifelse(length(data1)== 1L, "data1 ARGUMENT", paste0("DATA FRAME NUMBER ", i1, " OF data1 ARGUMENT")), "\nHERE IT IS COLOR LENGTH ", length(color[[i1]]), " VERSUS CATEG LEVELS LENGTH ", length(unique(data1[[i1]][, categ[[i1]]])), "\nREMINDER: A SINGLE COLOR PER CLASS OF CATEG AND A SINGLE CLASS OF CATEG PER COLOR MUST BE RESPECTED") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + }else if(categ[[i1]] == "fake_categ" & length(color[[i1]]) != 1){ + tempo.cat <- paste0("ERROR IN ", function.name, " LAST CHECK: ", ifelse(length(color)== 1L, "color", paste0("ELEMENT NUMBER ", i1, " OF color ARGUMENT")), " MUST HAVE LENGTH 1 WHEN ", ifelse(length(categ)== 1L, "categ", paste0("ELEMENT ", i1, " OF categ ARGUMENT")), " IS NULL\nHERE IT IS COLOR LENGTH ", length(color[[i1]])) + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + } + } + # end last check + + + + + + # conversion of geom_hline and geom_vline + for(i1 in 1:length(data1)){ + if(geom[[i1]] == "geom_hline" | geom[[i1]] == "geom_vline"){ + final.data.frame <- data.frame() + for(i3 in 1:nrow(data1[[i1]])){ + tempo.data.frame <- rbind(data1[[i1]][i3, ], data1[[i1]][i3, ], stringsAsFactors = TRUE) + if(geom[[i1]] == "geom_hline"){ + tempo.data.frame[, x[[i1]]] <- x.lim + }else if(geom[[i1]] == "geom_vline"){ + tempo.data.frame[, y[[i1]]] <- y.lim + }else{ + tempo.cat <- paste0("ERROR IN ", function.name, ": CODE INCONSISTENCY 5") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + } + # 3 lines below inactivated because I put that above + # if(is.null(categ[[i1]])){ + # data1[, "fake_categ"] <- paste0("Line_", i3) + # } + final.data.frame <- rbind(final.data.frame, tempo.data.frame, stringsAsFactors = TRUE) + } + data1[[i1]] <- final.data.frame + geom[[i1]] <- "geom_line" + if(length(color[[i1]])== 1L){ + color[[i1]] <- rep(color[[i1]], length(unique(data1[[i1]][ , categ[[i1]]]))) + }else if(length(color[[i1]]) != length(unique(data1[[i1]][ , categ[[i1]]]))){ + tempo.cat <- paste0("ERROR IN ", function.name, " geom_hline AND geom_vline CONVERSION TO FIT THE XLIM AND YLIM LIMITS OF THE DATA: ", ifelse(length(color)== 1L, "color", paste0("ELEMENT NUMBER ", i1, " OF color ARGUMENT")), " MUST HAVE THE LENGTH OF LEVELS OF ", ifelse(length(categ)== 1L, "categ", paste0("ELEMENT ", i1, " OF categ ARGUMENT")), " IN ", ifelse(length(data1)== 1L, "data1 ARGUMENT", paste0("DATA FRAME NUMBER ", i1, " OF data1 ARGUMENT")), "\nHERE IT IS COLOR LENGTH ", length(color[[i1]]), " VERSUS CATEG LEVELS LENGTH ", length(unique(data1[[i1]][, categ[[i1]]]))) + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + } + } + } + # end conversion of geom_hline and geom_vline + + + + + # kind of geom_point (vectorial or raster) + scatter.kind <- vector("list", length = length(data1)) # list of same length as data1, that will be used to use either ggplot2::geom_point() (vectorial dot layer) or fun_gg_point_rast() (raster dot layer) + fix.ratio <- FALSE + if(is.null(raster.threshold)){ + if(raster == TRUE){ + scatter.kind[] <- "fun_gg_point_rast" # not important to fill everything: will be only used when geom == "geom_point" + fix.ratio <- TRUE + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") RASTER PLOT GENERATED -> ASPECT RATIO OF THE PLOT REGION SET BY THE raster.ratio ARGUMENT (", fun_round(raster.ratio, 2), ") TO AVOID A BUG OF ELLIPSOID DOT DRAWING") + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + }else{ + scatter.kind[] <- "ggplot2::geom_point" + } + }else{ + for(i2 in 1:length(data1)){ + if(geom[[i2]] == "geom_point"){ + if(nrow(data1[[i2]]) <= raster.threshold){ + scatter.kind[[i2]] <- "ggplot2::geom_point" + }else{ + scatter.kind[[i2]] <- "fun_gg_point_rast" + fix.ratio <- TRUE + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") ", ifelse(length(data1)== 1L, "data1 ARGUMENT", paste0("DATA FRAME NUMBER ", i2, " OF data1 ARGUMENT")), " LAYER AS RASTER (NOT VECTORIAL)") + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + } + } + } + if(any(unlist(scatter.kind) == "fun_gg_point_rast")){ + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") RASTER PLOT GENERATED -> ASPECT RATIO OF THE PLOT REGION SET BY THE raster.ratio ARGUMENT (", fun_round(raster.ratio, 2), ") TO AVOID A BUG OF ELLIPSOID DOT DRAWING") + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + } + } + # end kind of geom_point (vectorial or raster) + + + + + # no need loop part + coord.names <- NULL + tempo.gg.name <- "gg.indiv.plot." + tempo.gg.count <- 0 + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), eval(parse(text = paste0("ggplot2::ggplot()", if(is.null(add)){""}else{add})))) # add added here to have the facets + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::xlab(if(is.null(x.lab)){x[[1]]}else{x.lab})) + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::ylab(if(is.null(y.lab)){y[[1]]}else{y.lab})) + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::ggtitle(title)) + # text angle management + x.tempo.just <- fun_gg_just(angle = x.text.angle, pos = "bottom", kind = "axis") + y.tempo.just <- fun_gg_just(angle = y.text.angle, pos = "left", kind = "axis") + # end text angle management + add.check <- TRUE + if( ! is.null(add)){ # if add is NULL, then = 0 + if(grepl(pattern = "ggplot2::theme", add) == TRUE){ + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") \"ggplot2::theme\" STRING DETECTED IN THE add ARGUMENT\n-> INTERNAL GGPLOT2 THEME FUNCTIONS theme() AND theme_classic() HAVE BEEN INACTIVATED, TO BE USED BY THE USER\n-> article ARGUMENT WILL BE IGNORED\nIT IS RECOMMENDED TO USE \"+ theme(aspect.ratio = raster.ratio)\" IF RASTER MODE IS ACTIVATED") + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + add.check <- FALSE + } + } + if(add.check == TRUE & article == TRUE){ + # WARNING: not possible to add several times theme(). NO message but the last one overwrites the others + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::theme_classic(base_size = text.size)) + if(grid == TRUE){ + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), m.gg <- ggplot2::theme( + text = ggplot2::element_text(size = text.size), + plot.title = ggplot2::element_text(size = title.text.size), # stronger than text + legend.key = ggplot2::element_rect(color = "white", size = 1.5), # size of the frame of the legend + line = ggplot2::element_line(size = 0.5), + axis.line.y.left = ggplot2::element_line(colour = "black"), # draw lines for the y axis + axis.line.x.bottom = ggplot2::element_line(colour = "black"), # draw lines for the x axis + panel.grid.major.x = ggplot2::element_line(colour = "grey85", size = 0.75), + panel.grid.minor.x = ggplot2::element_line(colour = "grey90", size = 0.25), + panel.grid.major.y = ggplot2::element_line(colour = "grey85", size = 0.75), + panel.grid.minor.y = ggplot2::element_line(colour = "grey90", size = 0.25), + axis.text.x = ggplot2::element_text(angle = x.tempo.just$angle, hjust = x.tempo.just$hjust, vjust = x.tempo.just$vjust), + axis.text.y = ggplot2::element_text(angle = y.tempo.just$angle, hjust = y.tempo.just$hjust, vjust = y.tempo.just$vjust), + aspect.ratio = if(fix.ratio == TRUE){raster.ratio}else{NULL} # for raster + )) + }else{ + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), m.gg <- ggplot2::theme( + text = ggplot2::element_text(size = text.size), + plot.title = ggplot2::element_text(size = title.text.size), # stronger than text + line = ggplot2::element_line(size = 0.5), + legend.key = ggplot2::element_rect(color = "white", size = 1.5), # size of the frame of the legend + axis.line.y.left = ggplot2::element_line(colour = "black"), + axis.line.x.bottom = ggplot2::element_line(colour = "black"), + axis.text.x = ggplot2::element_text(angle = x.tempo.just$angle, hjust = x.tempo.just$hjust, vjust = x.tempo.just$vjust), + axis.text.y = ggplot2::element_text(angle = y.tempo.just$angle, hjust = y.tempo.just$hjust, vjust = y.tempo.just$vjust), + aspect.ratio = if(fix.ratio == TRUE){raster.ratio}else{NULL} # for raster + )) + } + }else if(add.check == TRUE & article == FALSE){ + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), m.gg <- ggplot2::theme( + text = ggplot2::element_text(size = text.size), + plot.title = ggplot2::element_text(size = title.text.size), # stronger than text + line = ggplot2::element_line(size = 0.5), + legend.key = ggplot2::element_rect(color = "white", size = 1.5), # size of the frame of the legend + panel.background = ggplot2::element_rect(fill = "grey95"), + axis.line.y.left = ggplot2::element_line(colour = "black"), + axis.line.x.bottom = ggplot2::element_line(colour = "black"), + panel.grid.major.x = ggplot2::element_line(colour = "grey85", size = 0.75), + panel.grid.minor.x = ggplot2::element_line(colour = "grey90", size = 0.25), + panel.grid.major.y = ggplot2::element_line(colour = "grey85", size = 0.75), + panel.grid.minor.y = ggplot2::element_line(colour = "grey90", size = 0.25), + strip.background = ggplot2::element_rect(fill = "white", colour = "black"), + axis.text.x = ggplot2::element_text(angle = x.tempo.just$angle, hjust = x.tempo.just$hjust, vjust = x.tempo.just$vjust), + axis.text.y = ggplot2::element_text(angle = y.tempo.just$angle, hjust = y.tempo.just$hjust, vjust = y.tempo.just$vjust), + aspect.ratio = if(fix.ratio == TRUE){raster.ratio}else{NULL} # for raster + # do not work -> legend.position = "none" # to remove the legend completely: https://www.datanovia.com/en/blog/how-to-remove-legend-from-a-ggplot/ + )) + } + # end no need loop part + + + # loop part + point.count <- 0 + line.count <- 0 + lg.order <- vector(mode = "list", length = 6) # order of the legend + lg.order <- lapply(lg.order, as.numeric) # order of the legend + lg.color <- vector(mode = "list", length = 6) # color of the legend + lg.dot.shape <- vector(mode = "list", length = 6) # etc. + lg.dot.size <- vector(mode = "list", length = 6) # etc. + lg.dot.size <- lapply(lg.dot.size, as.numeric) # etc. + lg.dot.border.size <- vector(mode = "list", length = 6) # etc. + lg.dot.border.size <- lapply(lg.dot.border.size, as.numeric) # etc. + lg.dot.border.color <- vector(mode = "list", length = 6) # etc. + lg.line.size <- vector(mode = "list", length = 6) # etc. + lg.line.size <- lapply(lg.line.size, as.numeric) # etc. + lg.line.type <- vector(mode = "list", length = 6) # etc. + lg.alpha <- vector(mode = "list", length = 6) # etc. + lg.alpha <- lapply(lg.alpha, as.numeric) # etc. + for(i1 in 1:length(data1)){ + if(geom[[i1]] == "geom_point"){ + point.count <- point.count + 1 + if(point.count== 1L){ + fin.lg.disp[[1]] <- legend.disp[[point.count + line.count]] + lg.order[[1]] <- point.count + line.count + lg.color[[1]] <- color[[i1]] # if color == NULL -> NULL + lg.dot.shape[[1]] <- dot.shape[[i1]] + lg.dot.size[[1]] <- dot.size[[i1]] + lg.dot.border.size[[1]] <- dot.border.size[[i1]] + lg.dot.border.color[[1]] <- dot.border.color[[i1]] # if dot.border.color == NULL -> NULL + if(plot == TRUE & fin.lg.disp[[1]] == TRUE & dot.shape[[1]] %in% 0:14 & ((length(dev.list()) > 0 & names(dev.cur()) == "windows") | (length(dev.list())== 0L & Sys.info()["sysname"] == "Windows"))){ # if any Graph device already open and this device is "windows", or if no Graph device opened yet and we are on windows system -> prevention of alpha legend bug on windows using value 1 + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") GRAPHIC DEVICE USED ON A WINDOWS SYSTEM ->\nTRANSPARENCY OF THE DOTS (DOT LAYER NUMBER ", point.count, ") IS INACTIVATED IN THE LEGEND TO PREVENT A WINDOWS DEPENDENT BUG (SEE https://github.com/tidyverse/ggplot2/issues/2452)\nTO OVERCOME THIS ON WINDOWS, USE ANOTHER DEVICE (pdf() FOR INSTANCE)") + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + lg.alpha[[1]] <- 1 # to avoid a bug on windows: if alpha argument is different from 1 for lines (transparency), then lines are not correctly displayed in the legend when using the R GUI (bug https://github.com/tidyverse/ggplot2/issues/2452). No bug when using a pdf + }else{ + lg.alpha[[1]] <- alpha[[i1]] + } + class.categ <- levels(factor(data1[[i1]][, categ[[i1]]])) + for(i5 in 1:length(color[[i1]])){ # or length(class.categ). It is the same because already checked that lengths are the same + tempo.data.frame <- data1[[i1]][data1[[i1]][, categ[[i1]]] == class.categ[i5], ] + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), eval(parse(text = scatter.kind[[i1]]))(data = tempo.data.frame, mapping = ggplot2::aes_string(x = x[[i1]], y = y[[i1]], fill = categ[[i1]]), shape = dot.shape[[i1]], size = dot.size[[i1]], stroke = dot.border.size[[i1]], color = if(dot.shape[[i1]] %in% 21:24 & ! is.null(dot.border.color)){dot.border.color[[i1]]}else{color[[i1]][i5]}, alpha = alpha[[i1]], show.legend = if(i5== 1L){TRUE}else{FALSE})) # WARNING: a single color allowed for color argument outside aesthetic, but here a single color for border --> loop could be inactivated but kept for commodity # legend.show option do not remove the legend, only the aesthetic of the legend (dot, line, etc.). Used here to avoid multiple layers of legend which corrupt transparency + coord.names <- c(coord.names, paste0(geom[[i1]], ".", class.categ[i5])) + } + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::scale_fill_manual(name = if(is.null(legend.name)){NULL}else{legend.name[[i1]]}, values = as.character(color[[i1]]), breaks = class.categ)) # values are the values of fill, breaks reorder the classes according to class.categ in the legend, order argument of guide_legend determines the order of the different aesthetics in the legend (not order of classes). See guide_legend settings of scale_..._manual below + } + if(point.count== 2L){ + fin.lg.disp[[2]] <- legend.disp[[point.count + line.count]] + lg.order[[2]] <- point.count + line.count + lg.color[[2]] <- color[[i1]] # if color == NULL -> NULL + lg.dot.shape[[2]] <- dot.shape[[i1]] + lg.dot.size[[2]] <- dot.size[[i1]] + lg.dot.border.size[[2]] <- dot.border.size[[i1]] + lg.dot.border.color[[2]] <- dot.border.color[[i1]] # if dot.border.color == NULL -> NULL + if(plot == TRUE & fin.lg.disp[[2]] == TRUE & dot.shape[[2]] %in% 0:14 & ((length(dev.list()) > 0 & names(dev.cur()) == "windows") | (length(dev.list())== 0L & Sys.info()["sysname"] == "Windows"))){ # if any Graph device already open and this device is "windows", or if no Graph device opened yet and we are on windows system -> prevention of alpha legend bug on windows using value 1 + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") GRAPHIC DEVICE USED ON A WINDOWS SYSTEM ->\nTRANSPARENCY OF THE DOTS (DOT LAYER NUMBER ", point.count, ") IS INACTIVATED IN THE LEGEND TO PREVENT A WINDOWS DEPENDENT BUG (SEE https://github.com/tidyverse/ggplot2/issues/2452)\nTO OVERCOME THIS ON WINDOWS, USE ANOTHER DEVICE (pdf() FOR INSTANCE)") + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + lg.alpha[[2]] <- 1 # to avoid a bug on windows: if alpha argument is different from 1 for lines (transparency), then lines are not correctly displayed in the legend when using the R GUI (bug https://github.com/tidyverse/ggplot2/issues/2452). No bug when using a pdf + }else{ + lg.alpha[[2]] <- alpha[[i1]] + } + class.categ <- levels(factor(data1[[i1]][, categ[[i1]]])) + for(i5 in 1:length(color[[i1]])){ # or length(class.categ). It is the same because already checked that lengths are the same + tempo.data.frame <- data1[[i1]][data1[[i1]][, categ[[i1]]] == class.categ[i5], ] + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), eval(parse(text = scatter.kind[[i1]]))(data = tempo.data.frame, mapping = ggplot2::aes_string(x = x[[i1]], y = y[[i1]], shape = categ[[i1]]), size = dot.size[[i1]], stroke = dot.border.size[[i1]], fill = color[[i1]][i5], color = if(dot.shape[[i1]] %in% 21:24 & ! is.null(dot.border.color)){dot.border.color[[i1]]}else{color[[i1]][i5]}, alpha = alpha[[i1]], show.legend = FALSE)) # WARNING: a single color allowed for fill argument outside aesthetic, hence the loop # legend.show option do not remove the legend, only the aesthetic of the legend (dot, line, etc.). Used here to avoid multiple layers of legend which corrupt transparency + coord.names <- c(coord.names, paste0(geom[[i1]], ".", class.categ[i5])) + } + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::scale_shape_manual(name = if(is.null(legend.name)){NULL}else{legend.name[[i1]]}, values = rep(dot.shape[[i1]], length(color[[i1]])), breaks = class.categ)) # values are the values of shape, breaks reorder the classes according to class.categ in the legend. See guide_legend settings of scale_..._manual below + + } + if(point.count== 3L){ + fin.lg.disp[[3]] <- legend.disp[[point.count + line.count]] + lg.order[[3]] <- point.count + line.count + lg.color[[3]] <- color[[i1]] # if color == NULL -> NULL + lg.dot.shape[[3]] <- dot.shape[[i1]] + lg.dot.size[[3]] <- dot.size[[i1]] + lg.dot.border.size[[3]] <- dot.border.size[[i1]] + lg.dot.border.color[[3]] <- dot.border.color[[i1]] # if dot.border.color == NULL -> NULL + if(plot == TRUE & fin.lg.disp[[3]] == TRUE & dot.shape[[3]] %in% 0:14 & ((length(dev.list()) > 0 & names(dev.cur()) == "windows") | (length(dev.list())== 0L & Sys.info()["sysname"] == "Windows"))){ # if any Graph device already open and this device is "windows", or if no Graph device opened yet and we are on windows system -> prevention of alpha legend bug on windows using value 1 + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") GRAPHIC DEVICE USED ON A WINDOWS SYSTEM ->\nTRANSPARENCY OF THE DOTS (DOT LAYER NUMBER ", point.count, ") IS INACTIVATED IN THE LEGEND TO PREVENT A WINDOWS DEPENDENT BUG (SEE https://github.com/tidyverse/ggplot2/issues/2452)\nTO OVERCOME THIS ON WINDOWS, USE ANOTHER DEVICE (pdf() FOR INSTANCE)") + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + lg.alpha[[3]] <- 1 # to avoid a bug on windows: if alpha argument is different from 1 for lines (transparency), then lines are not correctly displayed in the legend when using the R GUI (bug https://github.com/tidyverse/ggplot2/issues/2452). No bug when using a pdf + }else{ + lg.alpha[[3]] <- alpha[[i1]] + } + class.categ <- levels(factor(data1[[i1]][, categ[[i1]]])) + for(i5 in 1:length(color[[i1]])){ # or length(class.categ). It is the same because already checked that lengths are the same + tempo.data.frame <- data1[[i1]][data1[[i1]][, categ[[i1]]] == class.categ[i5], ] + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), eval(parse(text = scatter.kind[[i1]]))(data = tempo.data.frame, mapping = ggplot2::aes_string(x = x[[i1]], y = y[[i1]], stroke = categ[[i1]]), shape = dot.shape[[i1]], size = dot.size[[i1]], fill = color[[i1]][i5], stroke = dot.border.size[[i1]], color = if(dot.shape[[i1]] %in% 21:24 & ! is.null(dot.border.color)){dot.border.color[[i1]]}else{color[[i1]][i5]}, alpha = alpha[[i1]], show.legend = FALSE)) # WARNING: a single color allowed for color argument outside aesthetic, hence the loop # legend.show option do not remove the legend, only the aesthetic of the legend (dot, line, etc.). Used here to avoid multiple layers of legend which corrupt transparency + coord.names <- c(coord.names, paste0(geom[[i1]], ".", class.categ[i5])) + } + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::scale_discrete_manual(aesthetics = "stroke", name = if(is.null(legend.name)){NULL}else{legend.name[[i1]]}, values = rep(dot.border.size[[i1]], length(color[[i1]])), breaks = class.categ)) # values are the values of stroke, breaks reorder the classes according to class.categ in the legend. See guide_legend settings of scale_..._manual below + + } + }else{ + line.count <- line.count + 1 + if(line.count== 1L){ + fin.lg.disp[[4]] <- legend.disp[[point.count + line.count]] + lg.order[[4]] <- point.count + line.count + lg.color[[4]] <- color[[i1]] # if color == NULL -> NULL + lg.line.size[[4]] <- line.size[[i1]] + lg.line.type[[4]] <- line.type[[i1]] + if(plot == TRUE & fin.lg.disp[[4]] == TRUE & ((length(dev.list()) > 0 & names(dev.cur()) == "windows") | (length(dev.list())== 0L & Sys.info()["sysname"] == "Windows"))){ # if any Graph device already open and this device is "windows", or if no Graph device opened yet and we are on windows system -> prevention of alpha legend bug on windows using value 1 + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") GRAPHIC DEVICE USED ON A WINDOWS SYSTEM ->\nTRANSPARENCY OF THE LINES (LINE LAYER NUMBER ", line.count, ") IS INACTIVATED IN THE LEGEND TO PREVENT A WINDOWS DEPENDENT BUG (SEE https://github.com/tidyverse/ggplot2/issues/2452)\nTO OVERCOME THIS ON WINDOWS, USE ANOTHER DEVICE (pdf() FOR INSTANCE)") + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + lg.alpha[[4]] <- 1 # to avoid a bug on windows: if alpha argument is different from 1 for lines (transparency), then lines are not correctly displayed in the legend when using the R GUI (bug https://github.com/tidyverse/ggplot2/issues/2452). No bug when using a pdf + }else{ + lg.alpha[[4]] <- alpha[[i1]] + } + class.categ <- levels(factor(data1[[i1]][, categ[[i1]]])) + for(i5 in 1:length(color[[i1]])){ # or length(class.categ). It is the same because already checked that lengths are the same + tempo.data.frame <- data1[[i1]][data1[[i1]][, categ[[i1]]] == class.categ[i5], ] + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), eval(parse(text = paste0("ggplot2::", # no CR here te0("ggpl + ifelse(geom[[i1]] == 'geom_stick', 'geom_segment', geom[[i1]]), # geom_segment because geom_stick converted to geom_segment for plotting + "(data = tempo.data.frame, mapping = ggplot2::aes(x = ", + x[[i1]], + ifelse(geom[[i1]] == 'geom_stick', ", yend = ", ", y = "), + y[[i1]], + if(geom[[i1]] == 'geom_stick'){paste0(', xend = ', x[[i1]], ', y = ', ifelse(is.null(geom.stick.base), y.lim[1], geom.stick.base[[i1]]))}, + ", linetype = ", + categ[[i1]], + "), color = \"", + color[[i1]][i5], + "\", size = ", + line.size[[i1]], + ifelse(geom[[i1]] == 'geom_path', ', lineend = \"round\"', ''), + ifelse(geom[[i1]] == 'geom_step', paste0(', direction = \"', geom.step.dir[[i1]], '\"'), ''), + ", alpha = ", + alpha[[i1]], + ", show.legend = ", + ifelse(i5== 1L, TRUE, FALSE), + ")" + )))) # WARNING: a single color allowed for color argument outside aesthetic, hence the loop # legend.show option do not remove the legend, only the aesthetic of the legend (dot, line, etc.). Used here to avoid multiple layers of legend which corrupt transparency + coord.names <- c(coord.names, paste0(geom[[i1]], ".", class.categ[i5])) + } + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::scale_discrete_manual(aesthetics = "linetype", name = if(is.null(legend.name)){NULL}else{legend.name[[i1]]}, values = rep(line.type[[i1]], length(color[[i1]])), breaks = class.categ)) # values are the values of linetype. 1 means solid. Regarding the alpha bug, I have tried different things without success: alpha in guide alone, in geom alone, in both, with different values, breaks reorder the classes according to class.categ in the legend + } + if(line.count== 2L){ + fin.lg.disp[[5]] <- legend.disp[[point.count + line.count]] + lg.order[[5]] <- point.count + line.count + lg.color[[5]] <- color[[i1]] # if color == NULL -> NULL + lg.line.size[[5]] <- line.size[[i1]] + lg.line.type[[5]] <- line.type[[i1]] + if(plot == TRUE & fin.lg.disp[[5]] == TRUE & ((length(dev.list()) > 0 & names(dev.cur()) == "windows") | (length(dev.list())== 0L & Sys.info()["sysname"] == "Windows"))){ # if any Graph device already open and this device is "windows", or if no Graph device opened yet and we are on windows system -> prevention of alpha legend bug on windows using value 1 + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") GRAPHIC DEVICE USED ON A WINDOWS SYSTEM ->\nTRANSPARENCY OF THE LINES (LINE LAYER NUMBER ", line.count, ") IS INACTIVATED IN THE LEGEND TO PREVENT A WINDOWS DEPENDENT BUG (SEE https://github.com/tidyverse/ggplot2/issues/2452)\nTO OVERCOME THIS ON WINDOWS, USE ANOTHER DEVICE (pdf() FOR INSTANCE)") + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + lg.alpha[[5]] <- 1 # to avoid a bug on windows: if alpha argument is different from 1 for lines (transparency), then lines are not correctly displayed in the legend when using the R GUI (bug https://github.com/tidyverse/ggplot2/issues/2452). No bug when using a pdf + }else{ + lg.alpha[[5]] <- alpha[[i1]] + } + class.categ <- levels(factor(data1[[i1]][, categ[[i1]]])) + for(i5 in 1:length(color[[i1]])){ # or length(class.categ). It is the same because already checked that lengths are the same + tempo.data.frame <- data1[[i1]][data1[[i1]][, categ[[i1]]] == class.categ[i5], ] + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), eval(parse(text = paste0("ggplot2::", # no CR here te0("ggpl + ifelse(geom[[i1]] == 'geom_stick', 'geom_segment', geom[[i1]]), # geom_segment because geom_stick converted to geom_segment for plotting + "(data = tempo.data.frame, mapping = ggplot2::aes(x = ", + x[[i1]], + ifelse(geom[[i1]] == 'geom_stick', ", yend = ", ", y = "), + y[[i1]], + if(geom[[i1]] == 'geom_stick'){paste0(', xend = ', x[[i1]], ', y = ', ifelse(is.null(geom.stick.base), y.lim[1], geom.stick.base[[i1]]))}, + ", alpha = ", + categ[[i1]], + "), color = \"", + color[[i1]][i5], + "\", size = ", + line.size[[i1]], + ", linetype = ", + ifelse(is.numeric(line.type[[i1]]), "", "\""), + line.type[[i1]], + ifelse(is.numeric(line.type[[i1]]), "", "\""), + ifelse(geom[[i1]] == 'geom_path', ', lineend = \"round\"', ''), + ifelse(geom[[i1]] == 'geom_step', paste0(', direction = \"', geom.step.dir[[i1]], '\"'), ''), + ", show.legend = FALSE)" + )))) # WARNING: a single color allowed for color argument outside aesthetic, hence the loop # legend.show option do not remove the legend, only the aesthetic of the legend (dot, line, etc.). Used here to avoid multiple layers of legend which corrupt transparency + coord.names <- c(coord.names, paste0(geom[[i1]], ".", class.categ[i5])) + } + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::scale_discrete_manual(aesthetics = "alpha", name = if(is.null(legend.name)){NULL}else{legend.name[[i1]]}, values = rep(alpha[[i1]], length(color[[i1]])), breaks = class.categ)) # values are the values of linetype. 1 means solid. Regarding the alpha bug, I have tried different things without success: alpha in guide alone, in geom alone, in both, with different values, breaks reorder the classes according to class.categ in the legend + } + if(line.count== 3L){ + fin.lg.disp[[6]] <- legend.disp[[point.count + line.count]] + lg.order[[6]] <- point.count + line.count + lg.color[[6]] <- color[[i1]] # if color == NULL -> NULL + lg.line.size[[6]] <- line.size[[i1]] + lg.line.type[[6]] <- line.type[[i1]] + if(plot == TRUE & fin.lg.disp[[6]] == TRUE & ((length(dev.list()) > 0 & names(dev.cur()) == "windows") | (length(dev.list())== 0L & Sys.info()["sysname"] == "Windows"))){ # if any Graph device already open and this device is "windows", or if no Graph device opened yet and we are on windows system -> prevention of alpha legend bug on windows using value 1 + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") GRAPHIC DEVICE USED ON A WINDOWS SYSTEM ->\nTRANSPARENCY OF THE LINES (LINE LAYER NUMBER ", line.count, ") IS INACTIVATED IN THE LEGEND TO PREVENT A WINDOWS DEPENDENT BUG (SEE https://github.com/tidyverse/ggplot2/issues/2452)\nTO OVERCOME THIS ON WINDOWS, USE ANOTHER DEVICE (pdf() FOR INSTANCE)") + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + lg.alpha[[6]] <- 1 # to avoid a bug on windows: if alpha argument is different from 1 for lines (transparency), then lines are not correctly displayed in the legend when using the R GUI (bug https://github.com/tidyverse/ggplot2/issues/2452). No bug when using a pdf + }else{ + lg.alpha[[6]] <- alpha[[i1]] + } + class.categ <- levels(factor(data1[[i1]][, categ[[i1]]])) + for(i5 in 1:length(color[[i1]])){ # or length(class.categ). It is the same because already checked that lengths are the same + tempo.data.frame <- data1[[i1]][data1[[i1]][, categ[[i1]]] == class.categ[i5], ] + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), eval(parse(text = paste0("ggplot2::", # no CR here te0("ggpl + ifelse(geom[[i1]] == 'geom_stick', 'geom_segment', geom[[i1]]), # geom_segment because geom_stick converted to geom_segment for plotting + "(data = tempo.data.frame, mapping = ggplot2::aes(x = ", + x[[i1]], + ifelse(geom[[i1]] == 'geom_stick', ", yend = ", ", y = "), + y[[i1]], + if(geom[[i1]] == 'geom_stick'){paste0(', xend = ', x[[i1]], ', y = ', ifelse(is.null(geom.stick.base), y.lim[1], geom.stick.base[[i1]]))}, + ", size = ", + categ[[i1]], + "), color = \"", + color[[i1]][i5], + "\", linetype = ", + ifelse(is.numeric(line.type[[i1]]), "", "\""), + line.type[[i1]], + ifelse(is.numeric(line.type[[i1]]), "", "\""), + ifelse(geom[[i1]] == 'geom_path', ', lineend = \"round\"', ''), + ifelse(geom[[i1]] == 'geom_step', paste0(', direction = \"', geom.step.dir[[i1]], '\"'), ''), + ", alpha = ", + alpha[[i1]], + ", show.legend = FALSE)" + )))) # WARNING: a single color allowed for color argument outside aesthetic, hence the loop # legend.show option do not remove the legend, only the aesthetic of the legend (dot, line, etc.). Used here to avoid multiple layers of legend which corrupt transparency + coord.names <- c(coord.names, paste0(geom[[i1]], ".", class.categ[i5])) + } + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::scale_discrete_manual(aesthetics = "size", name = if(is.null(legend.name)){NULL}else{legend.name[[i1]]}, values = rep(line.size[[i1]], length(color[[i1]])), breaks = class.categ)) # values are the values of linetype. 1 means solid. Regarding the alpha bug, I have tried different things without success: alpha in guide alone, in geom alone, in both, breaks reorder the classes according to class.categ in the legend + } + } + } + # end loop part + + + + + # legend display + tempo.legend.final <- 'ggplot2::guides( fill = if(fin.lg.disp[[1]] == TRUE){ ggplot2::guide_legend( order = lg.order[[1]], @@ -13390,25 +13395,25 @@ FALSE } )' # clip = "off" to have secondary ticks outside plot region does not work if( ! is.null(legend.width)){ -if(any(unlist(legend.disp))){ # means some TRUE -tempo.graph.info <- suppressMessages(ggplot2::ggplot_build(eval(parse(text = paste0(paste(paste0(tempo.gg.name, 1:tempo.gg.count), collapse = " + "), ' + ', tempo.legend.final))))) # will be recovered later again, when ylim will be considered -legend.final <- fun_gg_get_legend(ggplot_built = tempo.graph.info, fun.name = function.name) # get legend -fin.lg.disp[] <- FALSE # remove all the legends. Must be done even if fin.lg.disp is not appearing in the code thenafter. Otherwise twice the legend -if(is.null(legend.final) & plot == TRUE){ # even if any(unlist(legend.disp)) is TRUE -legend.final <- fun_gg_empty_graph() # empty graph instead of legend -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") LEGEND REQUESTED (NON-NULL categ ARGUMENT OR legend.show ARGUMENT SET TO TRUE)\nBUT IT SEEMS THAT THE PLOT HAS NO LEGEND -> EMPTY LEGEND SPACE CREATED BECAUSE OF THE NON-NULL legend.width ARGUMENT\n") -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -} -}else if(plot == TRUE){ # means all FALSE -legend.final <- ggplot2::ggplot()+ggplot2::theme_void() # empty graph instead of legend -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") LEGEND REQUESTED (NON-NULL categ ARGUMENT OR legend.show ARGUMENT SET TO TRUE)\nBUT IT SEEMS THAT THE PLOT HAS NO LEGEND -> EMPTY LEGEND SPACE CREATED BECAUSE OF THE NON-NULL legend.width ARGUMENT\n") -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) -} + if(any(unlist(legend.disp))){ # means some TRUE + tempo.graph.info <- suppressMessages(ggplot2::ggplot_build(eval(parse(text = paste0(paste(paste0(tempo.gg.name, 1:tempo.gg.count), collapse = " + "), ' + ', tempo.legend.final))))) # will be recovered later again, when ylim will be considered + legend.final <- fun_gg_get_legend(ggplot_built = tempo.graph.info, fun.name = function.name) # get legend + fin.lg.disp[] <- FALSE # remove all the legends. Must be done even if fin.lg.disp is not appearing in the code thenafter. Otherwise twice the legend + if(is.null(legend.final) & plot == TRUE){ # even if any(unlist(legend.disp)) is TRUE + legend.final <- fun_gg_empty_graph() # empty graph instead of legend + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") LEGEND REQUESTED (NON-NULL categ ARGUMENT OR legend.show ARGUMENT SET TO TRUE)\nBUT IT SEEMS THAT THE PLOT HAS NO LEGEND -> EMPTY LEGEND SPACE CREATED BECAUSE OF THE NON-NULL legend.width ARGUMENT\n") + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + } + }else if(plot == TRUE){ # means all FALSE + legend.final <- ggplot2::ggplot()+ggplot2::theme_void() # empty graph instead of legend + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") LEGEND REQUESTED (NON-NULL categ ARGUMENT OR legend.show ARGUMENT SET TO TRUE)\nBUT IT SEEMS THAT THE PLOT HAS NO LEGEND -> EMPTY LEGEND SPACE CREATED BECAUSE OF THE NON-NULL legend.width ARGUMENT\n") + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + } } if( ! any(unlist(legend.disp))){ -fin.lg.disp[] <- FALSE # remove all the legends. Must be done even if fin.lg.disp is not appearing in the code thenafter. Otherwise twice the legend + fin.lg.disp[] <- FALSE # remove all the legends. Must be done even if fin.lg.disp is not appearing in the code thenafter. Otherwise twice the legend } assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), eval(parse(text = tempo.legend.final))) # end legend display @@ -13421,135 +13426,135 @@ assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), eval(parse(t tempo.coord <- suppressMessages(ggplot2::ggplot_build(eval(parse(text = paste(paste0(tempo.gg.name, 1:tempo.gg.count), collapse = " + ", ' + ggplot2::scale_x_continuous(expand = c(0, 0), limits = sort(x.lim), oob = scales::rescale_none) + ggplot2::scale_y_continuous(expand = c(0, 0), limits = sort(y.lim), oob = scales::rescale_none)'))))$layout$panel_params[[1]]) # here I do not need the x-axis and y-axis orientation, I just need the number of main ticks # x.second.tick.positions # coordinates of secondary ticks (only if x.second.tick.nb argument is non-null or if x.log argument is different from "no") if(x.log != "no"){ # integer main ticks for log2 and log10 -tempo.scale <- (as.integer(min(x.lim, na.rm = TRUE)) - 1):(as.integer(max(x.lim, na.rm = TRUE)) + 1) + tempo.scale <- (as.integer(min(x.lim, na.rm = TRUE)) - 1):(as.integer(max(x.lim, na.rm = TRUE)) + 1) }else{ -tempo <- if(is.null(attributes(tempo.coord$x$breaks))){tempo.coord$x$breaks}else{unlist(attributes(tempo.coord$x$breaks))} -if(all(is.na(tempo))){ -tempo.cat <- paste0("INTERNAL CODE ERROR IN ", function.name, "\nONLY NA IN tempo.coord$x$breaks") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -} -if(length(unique(x.lim)) <= 1){ -tempo.cat <- paste0("ERROR IN ", function.name, "\nIT SEEMS THAT X-AXIS VALUES HAVE A NULL RANGE: ", paste(x.lim, collapse = " "), "\nPLEASE, USE THE x.lim ARGUMENT WITH 2 DIFFERENT VALUES TO SOLVE THIS") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -}else{ -tempo.scale <- fun_scale(lim = x.lim, n = ifelse(is.null(x.tick.nb), length(tempo[ ! is.na(tempo)]), x.tick.nb)) # in ggplot 3.3.0, tempo.coord$x.major_source replaced by tempo.coord$x$breaks. If fact: n = ifelse(is.null(x.tick.nb), length(tempo[ ! is.na(tempo)]), x.tick.nb)) replaced by n = ifelse(is.null(x.tick.nb), 4, x.tick.nb)) -} + tempo <- if(is.null(attributes(tempo.coord$x$breaks))){tempo.coord$x$breaks}else{unlist(attributes(tempo.coord$x$breaks))} + if(all(is.na(tempo))){ + tempo.cat <- paste0("INTERNAL CODE ERROR IN ", function.name, "\nONLY NA IN tempo.coord$x$breaks") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + } + if(length(unique(x.lim)) <= 1){ + tempo.cat <- paste0("ERROR IN ", function.name, "\nIT SEEMS THAT X-AXIS VALUES HAVE A NULL RANGE: ", paste(x.lim, collapse = " "), "\nPLEASE, USE THE x.lim ARGUMENT WITH 2 DIFFERENT VALUES TO SOLVE THIS") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + }else{ + tempo.scale <- fun_scale(lim = x.lim, n = ifelse(is.null(x.tick.nb), length(tempo[ ! is.na(tempo)]), x.tick.nb)) # in ggplot 3.3.0, tempo.coord$x.major_source replaced by tempo.coord$x$breaks. If fact: n = ifelse(is.null(x.tick.nb), length(tempo[ ! is.na(tempo)]), x.tick.nb)) replaced by n = ifelse(is.null(x.tick.nb), 4, x.tick.nb)) + } } x.second.tick.values <- NULL x.second.tick.pos <- NULL if(x.log != "no"){ -tempo <- fun_inter_ticks(lim = x.lim, log = x.log) -x.second.tick.values <- tempo$values -x.second.tick.pos <- tempo$coordinates -# if(vertical == TRUE){ # do not remove in case the bug is fixed -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::annotate( -geom = "segment", x = x.second.tick.pos, -xend = x.second.tick.pos, -y = if(diff(y.lim) > 0){tempo.coord$y.range[1]}else{tempo.coord$y.range[2]}, -yend = if(diff(y.lim) > 0){tempo.coord$y.range[1] + abs(diff(tempo.coord$y.range)) / 80}else{tempo.coord$y.range[2] - abs(diff(tempo.coord$y.range)) / 80} -)) -# }else{ # not working because of the ggplot2 bug -# assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::annotate(geom = "segment", y = x.second.tick.pos, yend = x.second.tick.pos, x = tempo.coord$x.range[1], xend = tempo.coord$x.range[1] + diff(tempo.coord$x.range) / 80)) -# } -coord.names <- c(coord.names, "x.second.tick.positions") + tempo <- fun_inter_ticks(lim = x.lim, log = x.log) + x.second.tick.values <- tempo$values + x.second.tick.pos <- tempo$coordinates + # if(vertical == TRUE){ # do not remove in case the bug is fixed + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::annotate( + geom = "segment", x = x.second.tick.pos, + xend = x.second.tick.pos, + y = if(diff(y.lim) > 0){tempo.coord$y.range[1]}else{tempo.coord$y.range[2]}, + yend = if(diff(y.lim) > 0){tempo.coord$y.range[1] + abs(diff(tempo.coord$y.range)) / 80}else{tempo.coord$y.range[2] - abs(diff(tempo.coord$y.range)) / 80} + )) + # }else{ # not working because of the ggplot2 bug + # assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::annotate(geom = "segment", y = x.second.tick.pos, yend = x.second.tick.pos, x = tempo.coord$x.range[1], xend = tempo.coord$x.range[1] + diff(tempo.coord$x.range) / 80)) + # } + coord.names <- c(coord.names, "x.second.tick.positions") }else if(( ! is.null(x.second.tick.nb)) & x.log == "no"){ -# if(x.second.tick.nb > 0){ #inactivated because already checked before -if(length(tempo.scale) < 2){ -tempo.cat1 <- c("x.tick.nb", "x.second.tick.nb") -tempo.cat2 <- sapply(list(x.tick.nb, x.second.tick.nb), FUN = paste0, collapse = " ") -tempo.sep <- sapply(mapply(" ", max(nchar(tempo.cat1)) - nchar(tempo.cat1) + 3, FUN = rep, SIMPLIFY = FALSE), FUN = paste0, collapse = "") -tempo.cat <- paste0("ERROR IN ", function.name, "\nTHE NUMBER OF GENERATED TICKS FOR THE X-AXIS IS NOT CORRECT: ", length(tempo.scale), "\nUSING THESE ARGUMENT SETTINGS (NO DISPLAY MEANS NULL VALUE):\n", paste0(tempo.cat1, tempo.sep, tempo.cat2, collapse = "\n"), "\nPLEASE, TEST OTHER VALUES") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == -}else{ -tempo <- fun_inter_ticks(lim = x.lim, log = x.log, breaks = tempo.scale, n = x.second.tick.nb) -} -x.second.tick.values <- tempo$values -x.second.tick.pos <- tempo$coordinates -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::annotate( -geom = "segment", -x = x.second.tick.pos, -xend = x.second.tick.pos, -y = if(diff(y.lim) > 0){tempo.coord$y.range[1]}else{tempo.coord$y.range[2]}, -yend = if(diff(y.lim) > 0){tempo.coord$y.range[1] + abs(diff(tempo.coord$y.range)) / 80}else{tempo.coord$y.range[2] - abs(diff(tempo.coord$y.range)) / 80} -)) -coord.names <- c(coord.names, "x.second.tick.positions") + # if(x.second.tick.nb > 0){ #inactivated because already checked before + if(length(tempo.scale) < 2){ + tempo.cat1 <- c("x.tick.nb", "x.second.tick.nb") + tempo.cat2 <- sapply(list(x.tick.nb, x.second.tick.nb), FUN = paste0, collapse = " ") + tempo.sep <- sapply(mapply(" ", max(nchar(tempo.cat1)) - nchar(tempo.cat1) + 3, FUN = rep, SIMPLIFY = FALSE), FUN = paste0, collapse = "") + tempo.cat <- paste0("ERROR IN ", function.name, "\nTHE NUMBER OF GENERATED TICKS FOR THE X-AXIS IS NOT CORRECT: ", length(tempo.scale), "\nUSING THESE ARGUMENT SETTINGS (NO DISPLAY MEANS NULL VALUE):\n", paste0(tempo.cat1, tempo.sep, tempo.cat2, collapse = "\n"), "\nPLEASE, TEST OTHER VALUES") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == + }else{ + tempo <- fun_inter_ticks(lim = x.lim, log = x.log, breaks = tempo.scale, n = x.second.tick.nb) + } + x.second.tick.values <- tempo$values + x.second.tick.pos <- tempo$coordinates + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::annotate( + geom = "segment", + x = x.second.tick.pos, + xend = x.second.tick.pos, + y = if(diff(y.lim) > 0){tempo.coord$y.range[1]}else{tempo.coord$y.range[2]}, + yend = if(diff(y.lim) > 0){tempo.coord$y.range[1] + abs(diff(tempo.coord$y.range)) / 80}else{tempo.coord$y.range[2] - abs(diff(tempo.coord$y.range)) / 80} + )) + coord.names <- c(coord.names, "x.second.tick.positions") } # for the ggplot2 bug with x.log, this does not work: eval(parse(text = ifelse(vertical == FALSE & x.log == "log10", "ggplot2::scale_x_continuous", "ggplot2::scale_x_continuous"))) assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::scale_x_continuous( -breaks = tempo.scale, -minor_breaks = x.second.tick.pos, -labels = if(x.log == "log10"){scales::trans_format("identity", scales::math_format(10^.x))}else if(x.log == "log2"){scales::trans_format("identity", scales::math_format(2^.x))}else if(x.log == "no"){ggplot2::waiver()}else{tempo.cat <- paste0("INTERNAL CODE ERROR IN ", function.name, "\nCODE INCONSISTENCY 10") ; stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE)}, -expand = c(0, 0), # remove space after after axis limits -limits = sort(x.lim), # NA indicate that limits must correspond to data limits but xlim() already used -oob = scales::rescale_none, -trans = ifelse(diff(x.lim) < 0, "reverse", "identity") # equivalent to ggplot2::scale_x_reverse() but create the problem of x-axis label disappearance with x.lim decreasing. Thus, do not use. Use xlim() below and after this + breaks = tempo.scale, + minor_breaks = x.second.tick.pos, + labels = if(x.log == "log10"){scales::trans_format("identity", scales::math_format(10^.x))}else if(x.log == "log2"){scales::trans_format("identity", scales::math_format(2^.x))}else if(x.log == "no"){ggplot2::waiver()}else{tempo.cat <- paste0("INTERNAL CODE ERROR IN ", function.name, "\nCODE INCONSISTENCY 10") ; stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE)}, + expand = c(0, 0), # remove space after after axis limits + limits = sort(x.lim), # NA indicate that limits must correspond to data limits but xlim() already used + oob = scales::rescale_none, + trans = ifelse(diff(x.lim) < 0, "reverse", "identity") # equivalent to ggplot2::scale_x_reverse() but create the problem of x-axis label disappearance with x.lim decreasing. Thus, do not use. Use xlim() below and after this )) # end x.second.tick.positions # y.second.tick.positions # coordinates of secondary ticks (only if y.second.tick.nb argument is non-null or if y.log argument is different from "no") if(y.log != "no"){ # integer main ticks for log2 and log10 -tempo.scale <- (as.integer(min(y.lim, na.rm = TRUE)) - 1):(as.integer(max(y.lim, na.rm = TRUE)) + 1) + tempo.scale <- (as.integer(min(y.lim, na.rm = TRUE)) - 1):(as.integer(max(y.lim, na.rm = TRUE)) + 1) }else{ -tempo <- if(is.null(attributes(tempo.coord$y$breaks))){tempo.coord$y$breaks}else{unlist(attributes(tempo.coord$y$breaks))} -if(all(is.na(tempo))){ -tempo.cat <- paste0("INTERNAL CODE ERROR IN ", function.name, "\nONLY NA IN tempo.coord$y$breaks") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -} -if(length(unique(y.lim)) <= 1){ -tempo.cat <- paste0("ERROR IN ", function.name, "\nIT SEEMS THAT Y-AXIS VALUES HAVE A NULL RANGE: ", paste(y.lim, collapse = " "), "\nPLEASE, USE THE y.lim ARGUMENT WITH 2 DIFFERENT VALUES TO SOLVE THIS") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -}else{ -tempo.scale <- fun_scale(lim = y.lim, n = ifelse(is.null(y.tick.nb), length(tempo[ ! is.na(tempo)]), y.tick.nb)) # in ggplot 3.3.0, tempo.coord$y.major_source replaced by tempo.coord$y$breaks. If fact: n = ifelse(is.null(y.tick.nb), length(tempo[ ! is.na(tempo)]), y.tick.nb)) replaced by n = ifelse(is.null(y.tick.nb), 4, y.tick.nb)) -} + tempo <- if(is.null(attributes(tempo.coord$y$breaks))){tempo.coord$y$breaks}else{unlist(attributes(tempo.coord$y$breaks))} + if(all(is.na(tempo))){ + tempo.cat <- paste0("INTERNAL CODE ERROR IN ", function.name, "\nONLY NA IN tempo.coord$y$breaks") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + } + if(length(unique(y.lim)) <= 1){ + tempo.cat <- paste0("ERROR IN ", function.name, "\nIT SEEMS THAT Y-AXIS VALUES HAVE A NULL RANGE: ", paste(y.lim, collapse = " "), "\nPLEASE, USE THE y.lim ARGUMENT WITH 2 DIFFERENT VALUES TO SOLVE THIS") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + }else{ + tempo.scale <- fun_scale(lim = y.lim, n = ifelse(is.null(y.tick.nb), length(tempo[ ! is.na(tempo)]), y.tick.nb)) # in ggplot 3.3.0, tempo.coord$y.major_source replaced by tempo.coord$y$breaks. If fact: n = ifelse(is.null(y.tick.nb), length(tempo[ ! is.na(tempo)]), y.tick.nb)) replaced by n = ifelse(is.null(y.tick.nb), 4, y.tick.nb)) + } } y.second.tick.values <- NULL y.second.tick.pos <- NULL if(y.log != "no"){ -tempo <- fun_inter_ticks(lim = y.lim, log = y.log) -y.second.tick.values <- tempo$values -y.second.tick.pos <- tempo$coordinates -# if(vertical == TRUE){ # do not remove in case the bug is fixed -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::annotate( -geom = "segment", -y = y.second.tick.pos, -yend = y.second.tick.pos, -x = if(diff(x.lim) > 0){tempo.coord$x.range[1]}else{tempo.coord$x.range[2]}, -xend = if(diff(x.lim) > 0){tempo.coord$x.range[1] + abs(diff(tempo.coord$x.range)) / 80}else{tempo.coord$x.range[2] - abs(diff(tempo.coord$x.range)) / 80} -)) -# }else{ # not working because of the ggplot2 bug -# assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::annotate(geom = "segment", x = y.second.tick.pos, xend = y.second.tick.pos, y = tempo.coord$y.range[1], yend = tempo.coord$y.range[1] + diff(tempo.coord$y.range) / 80)) -# } -coord.names <- c(coord.names, "y.second.tick.positions") + tempo <- fun_inter_ticks(lim = y.lim, log = y.log) + y.second.tick.values <- tempo$values + y.second.tick.pos <- tempo$coordinates + # if(vertical == TRUE){ # do not remove in case the bug is fixed + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::annotate( + geom = "segment", + y = y.second.tick.pos, + yend = y.second.tick.pos, + x = if(diff(x.lim) > 0){tempo.coord$x.range[1]}else{tempo.coord$x.range[2]}, + xend = if(diff(x.lim) > 0){tempo.coord$x.range[1] + abs(diff(tempo.coord$x.range)) / 80}else{tempo.coord$x.range[2] - abs(diff(tempo.coord$x.range)) / 80} + )) + # }else{ # not working because of the ggplot2 bug + # assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::annotate(geom = "segment", x = y.second.tick.pos, xend = y.second.tick.pos, y = tempo.coord$y.range[1], yend = tempo.coord$y.range[1] + diff(tempo.coord$y.range) / 80)) + # } + coord.names <- c(coord.names, "y.second.tick.positions") }else if(( ! is.null(y.second.tick.nb)) & y.log == "no"){ -# if(y.second.tick.nb > 0){ #inactivated because already checked before -if(length(tempo.scale) < 2){ -tempo.cat1 <- c("y.tick.nb", "y.second.tick.nb") -tempo.cat2 <- sapply(list(y.tick.nb, y.second.tick.nb), FUN = paste0, collapse = " ") -tempo.sep <- sapply(mapply(" ", max(nchar(tempo.cat1)) - nchar(tempo.cat1) + 3, FUN = rep, SIMPLIFY = FALSE), FUN = paste0, collapse = "") -tempo.cat <- paste0("ERROR IN ", function.name, "\nTHE NUMBER OF GENERATED TICKS FOR THE Y-AXIS IS NOT CORRECT: ", length(tempo.scale), "\nUSING THESE ARGUMENT SETTINGS (NO DISPLAY MEANS NULL VALUE):\n", paste0(tempo.cat1, tempo.sep, tempo.cat2, collapse = "\n"), "\nPLEASE, TEST OTHER VALUES") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == -}else{ -tempo <- fun_inter_ticks(lim = y.lim, log = y.log, breaks = tempo.scale, n = y.second.tick.nb) -} -y.second.tick.values <- tempo$values -y.second.tick.pos <- tempo$coordinates -assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::annotate( -geom = "segment", -y = y.second.tick.pos, -yend = y.second.tick.pos, -x = if(diff(x.lim) > 0){tempo.coord$x.range[1]}else{tempo.coord$x.range[2]}, -xend = if(diff(x.lim) > 0){tempo.coord$x.range[1] + abs(diff(tempo.coord$x.range)) / 80}else{tempo.coord$x.range[2] - abs(diff(tempo.coord$x.range)) / 80} -)) -coord.names <- c(coord.names, "y.second.tick.positions") + # if(y.second.tick.nb > 0){ #inactivated because already checked before + if(length(tempo.scale) < 2){ + tempo.cat1 <- c("y.tick.nb", "y.second.tick.nb") + tempo.cat2 <- sapply(list(y.tick.nb, y.second.tick.nb), FUN = paste0, collapse = " ") + tempo.sep <- sapply(mapply(" ", max(nchar(tempo.cat1)) - nchar(tempo.cat1) + 3, FUN = rep, SIMPLIFY = FALSE), FUN = paste0, collapse = "") + tempo.cat <- paste0("ERROR IN ", function.name, "\nTHE NUMBER OF GENERATED TICKS FOR THE Y-AXIS IS NOT CORRECT: ", length(tempo.scale), "\nUSING THESE ARGUMENT SETTINGS (NO DISPLAY MEANS NULL VALUE):\n", paste0(tempo.cat1, tempo.sep, tempo.cat2, collapse = "\n"), "\nPLEASE, TEST OTHER VALUES") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) # == in stop() to be able to add several messages between == + }else{ + tempo <- fun_inter_ticks(lim = y.lim, log = y.log, breaks = tempo.scale, n = y.second.tick.nb) + } + y.second.tick.values <- tempo$values + y.second.tick.pos <- tempo$coordinates + assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::annotate( + geom = "segment", + y = y.second.tick.pos, + yend = y.second.tick.pos, + x = if(diff(x.lim) > 0){tempo.coord$x.range[1]}else{tempo.coord$x.range[2]}, + xend = if(diff(x.lim) > 0){tempo.coord$x.range[1] + abs(diff(tempo.coord$x.range)) / 80}else{tempo.coord$x.range[2] - abs(diff(tempo.coord$x.range)) / 80} + )) + coord.names <- c(coord.names, "y.second.tick.positions") } # for the ggplot2 bug with y.log, this does not work: eval(parse(text = ifelse(vertical == FALSE & y.log == "log10", "ggplot2::scale_x_continuous", "ggplot2::scale_y_continuous"))) assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::scale_y_continuous( -breaks = tempo.scale, -minor_breaks = y.second.tick.pos, -labels = if(y.log == "log10"){scales::trans_format("identity", scales::math_format(10^.x))}else if(y.log == "log2"){scales::trans_format("identity", scales::math_format(2^.x))}else if(y.log == "no"){ggplot2::waiver()}else{tempo.cat <- paste0("INTERNAL CODE ERROR IN ", function.name, "\nCODE INCONSISTENCY 10") ; stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE)}, -expand = c(0, 0), # remove space after axis limits -limits = sort(y.lim), # NA indicate that limits must correspond to data limits but ylim() already used -oob = scales::rescale_none, -trans = ifelse(diff(y.lim) < 0, "reverse", "identity") # equivalent to ggplot2::scale_y_reverse() but create the problem of y-axis label disappearance with y.lim decreasing. Thus, do not use. Use ylim() below and after this + breaks = tempo.scale, + minor_breaks = y.second.tick.pos, + labels = if(y.log == "log10"){scales::trans_format("identity", scales::math_format(10^.x))}else if(y.log == "log2"){scales::trans_format("identity", scales::math_format(2^.x))}else if(y.log == "no"){ggplot2::waiver()}else{tempo.cat <- paste0("INTERNAL CODE ERROR IN ", function.name, "\nCODE INCONSISTENCY 10") ; stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE)}, + expand = c(0, 0), # remove space after axis limits + limits = sort(y.lim), # NA indicate that limits must correspond to data limits but ylim() already used + oob = scales::rescale_none, + trans = ifelse(diff(y.lim) < 0, "reverse", "identity") # equivalent to ggplot2::scale_y_reverse() but create the problem of y-axis label disappearance with y.lim decreasing. Thus, do not use. Use ylim() below and after this )) # end y.second.tick.positions assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::coord_cartesian(xlim = x.lim, ylim = y.lim)) # clip = "off" to have secondary ticks outside plot region. The problem is that points out of bounds are also drawn outside the plot region. Thus, I cannot use it # at that stage, x.lim and y.lim not NULL anymore @@ -13562,15 +13567,15 @@ assign(paste0(tempo.gg.name, tempo.gg.count <- tempo.gg.count + 1), ggplot2::coo fin.plot <- eval(parse(text = paste(paste0(tempo.gg.name, 1:tempo.gg.count), collapse = " + "))) grob.save <- NULL if(plot == TRUE){ -if( ! is.null(legend.width)){ # any(unlist(legend.disp)) == TRUE removed to have empty legend space # not & any(unlist(fin.lg.disp)) == TRUE here because converted to FALSE -grob.save <- suppressMessages(suppressWarnings(gridExtra::grid.arrange(fin.plot, legend.final, ncol=2, widths=c(1, legend.width)))) -}else{ -grob.save <- suppressMessages(suppressWarnings(print(fin.plot))) -} + if( ! is.null(legend.width)){ # any(unlist(legend.disp)) == TRUE removed to have empty legend space # not & any(unlist(fin.lg.disp)) == TRUE here because converted to FALSE + grob.save <- suppressMessages(suppressWarnings(gridExtra::grid.arrange(fin.plot, legend.final, ncol=2, widths=c(1, legend.width)))) + }else{ + grob.save <- suppressMessages(suppressWarnings(print(fin.plot))) + } }else{ -warn.count <- warn.count + 1 -tempo.warn <- paste0("(", warn.count,") PLOT NOT SHOWN AS REQUESTED") -warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) + warn.count <- warn.count + 1 + tempo.warn <- paste0("(", warn.count,") PLOT NOT SHOWN AS REQUESTED") + warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn))) } # end drawing @@ -13578,49 +13583,49 @@ warn <- paste0(ifelse(is.null(warn), tempo.warn, paste0(warn, "\n\n", tempo.warn # output if(warn.print == TRUE & ! is.null(warn)){ -on.exit(warning(paste0("FROM ", function.name, ":\n\n", warn), call. = FALSE)) + on.exit(warning(paste0("FROM ", function.name, ":\n\n", warn), call. = FALSE)) } on.exit(exp = options(warning.length = ini.warning.length), add = TRUE) if(return == TRUE){ -output <- suppressMessages(ggplot2::ggplot_build(fin.plot)) -# output$data <- output$data[-1] # yes for boxplot but not for scatter # remove the first data because corresponds to the initial empty boxplot -if(length(output$data) != length(coord.names)){ -tempo.cat <- paste0("INTERNAL CODE ERROR IN ", function.name, ": length(output$data) AND length(coord.names) MUST BE IDENTICAL. CODE HAS TO BE MODIFIED") -stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) -}else{ -names(output$data) <- coord.names -} -if(is.null(unlist(removed.row.nb))){ -removed.row.nb <- NULL -removed.rows <- NULL -}else{ -for(i3 in 1:length(data1)){ -if( ! is.null(removed.row.nb[[i3]])){ -removed.row.nb[[i3]] <- sort(removed.row.nb[[i3]]) -removed.rows[[i3]] <- data1.ini[[i3]][removed.row.nb[[i3]], ] -} -} -} -tempo <- output$layout$panel_params[[1]] -output <- list( -data = data1, -removed.row.nb = removed.row.nb, -removed.rows = removed.rows, -plot = c(output$data, x.second.tick.values = list(x.second.tick.values), y.second.tick.values = list(y.second.tick.values)), -panel = facet.categ, -axes = list( -x.range = tempo$x.range, -x.labels = if(is.null(attributes(tempo$x$breaks))){tempo$x$breaks}else{tempo$x$scale$get_labels()}, # is.null(attributes(tempo$x$breaks)) test if it is number (TRUE) or character (FALSE) -x.positions = if(is.null(attributes(tempo$x$breaks))){tempo$x$breaks}else{unlist(attributes(tempo$x$breaks))}, -y.range = tempo$y.range, -y.labels = if(is.null(attributes(tempo$y$breaks))){tempo$y$breaks}else{tempo$y$scale$get_labels()}, -y.positions = if(is.null(attributes(tempo$y$breaks))){tempo$y$breaks}else{unlist(attributes(tempo$y$breaks))} -), -warn = paste0("\n", warn, "\n\n"), -ggplot = if(return.ggplot == TRUE){fin.plot}else{NULL}, # fin.plot plots the graph if return == TRUE -gtable = if(return.gtable == TRUE){grob.save}else{NULL} # -) -return(output) # this plots the graph if return.ggplot is TRUE and if no assignment + output <- suppressMessages(ggplot2::ggplot_build(fin.plot)) + # output$data <- output$data[-1] # yes for boxplot but not for scatter # remove the first data because corresponds to the initial empty boxplot + if(length(output$data) != length(coord.names)){ + tempo.cat <- paste0("INTERNAL CODE ERROR IN ", function.name, ": length(output$data) AND length(coord.names) MUST BE IDENTICAL. CODE HAS TO BE MODIFIED") + stop(paste0("\n\n================\n\n", tempo.cat, "\n\n================\n\n", ifelse(is.null(warn), "", paste0("IN ADDITION\nWARNING", ifelse(warn.count > 1, "S", ""), ":\n\n", warn))), call. = FALSE) + }else{ + names(output$data) <- coord.names + } + if(is.null(unlist(removed.row.nb))){ + removed.row.nb <- NULL + removed.rows <- NULL + }else{ + for(i3 in 1:length(data1)){ + if( ! is.null(removed.row.nb[[i3]])){ + removed.row.nb[[i3]] <- sort(removed.row.nb[[i3]]) + removed.rows[[i3]] <- data1.ini[[i3]][removed.row.nb[[i3]], ] + } + } + } + tempo <- output$layout$panel_params[[1]] + output <- list( + data = data1, + removed.row.nb = removed.row.nb, + removed.rows = removed.rows, + plot = c(output$data, x.second.tick.values = list(x.second.tick.values), y.second.tick.values = list(y.second.tick.values)), + panel = facet.categ, + axes = list( + x.range = tempo$x.range, + x.labels = if(is.null(attributes(tempo$x$breaks))){tempo$x$breaks}else{tempo$x$scale$get_labels()}, # is.null(attributes(tempo$x$breaks)) test if it is number (TRUE) or character (FALSE) + x.positions = if(is.null(attributes(tempo$x$breaks))){tempo$x$breaks}else{unlist(attributes(tempo$x$breaks))}, + y.range = tempo$y.range, + y.labels = if(is.null(attributes(tempo$y$breaks))){tempo$y$breaks}else{tempo$y$scale$get_labels()}, + y.positions = if(is.null(attributes(tempo$y$breaks))){tempo$y$breaks}else{unlist(attributes(tempo$y$breaks))} + ), + warn = paste0("\n", warn, "\n\n"), + ggplot = if(return.ggplot == TRUE){fin.plot}else{NULL}, # fin.plot plots the graph if return == TRUE + gtable = if(return.gtable == TRUE){grob.save}else{NULL} # + ) + return(output) # this plots the graph if return.ggplot is TRUE and if no assignment } # end output # end main code diff --git a/cute_little_R_functions.docx b/cute_little_R_functions.docx index d2fc4eb45df5d8c614ef67ac53bb4240c670f541..fb20dd5f9d11b6696c4aaaf72e18d0fc672e3997 100644 GIT binary patch delta 362942 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�gO#gSp<ZNqFdZ>B%opYA<UAw1_qHO;zRGD5r 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� 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≤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 PX=hhr>uO|YU|;|M5+3?v delta 362853 zcmdluQSM5=+=fe>TwKo&=1A^kWe^IPe23Gpev?jkW&i1QUzet<`OPgjprVrKBbYT| z(%P3Z%WtLMP>)t&@VatV{HE)rBrB_3Dj$>t{(N#yQ!@T2zu&gR)+oW~!6AE%5N&DJ zLpAO@?&QmhtXtoA-A=?qAn5+mc^_^%CZ1?Ilt2I9^Z!5kf7gav{MGyHyeRJ>`|t0z z&lg<aJbbVI-><3%B@xrvrs|b1;c(GjW3gzrUX<>;4PUDj?|!}IR_a{;%Jbm{g@FCn z7yN5rW39G+{;;yVSaol>_+j4d*XHs~Rjih{zxdaq**WXqudSc4FR=XEMVJ1cuM)gZ z=<!|+zZv&FsPg*zwJU#r%Q%t0^Z4O~yPh8NE0Hb?c;Q`t|6Wpk?iJA;Dfdf`{u7Q> zod0?Evq{Rot-k25^M1C{j>G=NhkF@5yHDTqm3`x4E@|^kpn0A6-17UY^Y-!yxIbIl zlmBDRyW8P6zxte)-=AFiSTdg_&v4fx%h(xz&aP08J@xk^zrLx-#)E6~_P=4<I#c=$ z%bV2gH@0n$;BULTG2_nnTkEUqPtRZa;`_1k$Ln|B?yNW8CH~<m_q)`KLhc10cAbkU z%kb|kx_;9>^S9HbX#cMsd#e}4$zRNGXqX~mr)joV^qs)Jw-bNY9zFK%sAFRC;~&nY z&kyG*W?3ca-uiy%rt<wH-(PC?RsI~V4WIj9<Fs8V)$a4}F06|#wyue9pS;8}T#mcm zp680BNx_aPPTq^t=Xe$!d-t`p)P6>8Y12uy+QZSG|GO>t&--uXIq3j@Up@IVA0N!; z{V})G%)eASEBW88uc{{NZ=YM+FL&aPezWYq8j1HG{?`3?`Fy6mh0LtUMt^lCH{1V@ zl>0rq!mpy7<Mns0*OdVZ>wh>GtTD1kxOIoW>Pmg!<{1A?4JR43T{<#j;!RI}{2KZA z)ssJOCizTGlwrIrzirl5<-bAqKNd?LQTO;||1VMQXZ7~Ux0{~3E<2Q&^H9D?ng78L zpPBBjL_bZfp2so2;m8mEgN<i4e&9dY_#om(`-2F@f(7mwf7&<HNv<jEm?pjG?Ax`! zE}q+?ILl^H`-yt9)SM2Phn$kOe?NX~`_=9C>g+K+$z?w$`Wr1%C@Lze`De0!4~OJW zk$Jsm=eqsPxF_H%=Xh2rd-F%8{n~~?Hx|orJ8$!6IwrO&cK^v6-F4>t|2W0coBw|O zYQ}H<H+rwi?Keg5PdBvdKHK?lSIp(+4QcF(4!$b&Ngphpz25rPx&ABnd;ZUV8(L-M zLY~Yzo?m+B<d^1spUvG@Oj7+j#YE)__mRtocK=?ut^AG*=laUS*3z@LE?!$HWLvpw zTE^`q@As^VdblK0O8D!}$KTG$zZXo(h>MvM|3-L%(xbxvD{p?>+jrdfsBX&Lc`GUw z`PO|s)Ss>L;`@Vy58+z1tlt($T&RybFD<sWv;ItI$hOlPc6jr7%x+CR^r!Kc1W$9< z{YhI+cP%w~Sl8|;x9Z#DUoTTPi^ML_IJ10l{uTLYUQfbry{%O_|9|P0_&fdEN*^iD z%$}gvba9bmqvFl%92xoCbq6NYSSiSTzMZ(-g^$nU>y#Z$tVhHZcZz@N`w+Hn;X<}1 zjruYJ#h134Y<E)gT216drdRZA`Ss8Dz?^?cj8VF4LQWXgdpIilJin{$l)$Xk{=G}) z#^tI<*X}*LS13DALruQB)@AbYY}<=wFRj<FdTL%?aqoC=2D@V61J(@^M&Cp|#ZLN1 zJ%3Rh_p$KMnIFRE*BNO3T5Tcw?9SfT&u7(6UV3SMz5nSiTo(WDUz=5Jz9TkezU=DG zC5JO^EZzIOLVxzvx4m}{m#eIssQ!E!_q**!qP)Xu#MW6)GTixWQ^HxhnhkE(t3ujj zqORWxVrjIxv2@{+zF!O8=?2=wsmWQm`14(?P7-hxd-ZR@W9tcDcC6p}ci!z?g)Q$V zOnWquTd<-1xS-ze`nN|9CH+`hwq>vN{r(?G6(Or<|8nc-FG-(qTz$&o$G0A?yZG_` z^%kL)D?5d~UguUmid*0H_hNdZAA8*TcX|2OzpdK+I#!LbI{QuIYUfwYlcsMK`+lY8 zQu~vmE$UOhs|r=d>Ym==p%bUOd;k9RC$>iWZ@KNm7NwRYeRc2G-nC!r>owkH>%OS8 ziCMgF_2use-^)&Jua+x&kgd@o?xVMPVZ?$6jg2>MTimMj7b{f}yEJvvq1H{7EBG(F zouB;r?h9pR(N&i?ci+1_;r`t1pLRv?srjETymIxm?L^Dou-kX<=9<j2&6~XZb>Ze$ zHRq0<^?MNfc-zj~4O*s~ADdNLxyAeU)kl}|3z+BMnJ23Kt-0-qyB^aG^>bzK#r+@q z|Jl1g=dJ(q>*34Q)6X8iI{EwGYbS!&zs-Eh(rh(ddB@ym*YaxDTz$CXY~Sr~X{Gt; zk0&a2^}4?|lBv@9HFx#;(9e$*_wv5kf6?&d?YRPZuMA%qebtLuxc^&A)uX+=Z)I=q ze{pGNbA83t#8_3&*mvANS	*JCGr8joI%p`|NGGCKrm=moyn%t2q&ycij5bme?2H zkD6<`c-PPCU|aAvz-7Hc*6OQi@m^QVeg`G}t>3xVQeG!`Zarttu`^dc-EnI_)O^c7 z{O~-f717H!$jzPUwtt6w%cm||ouq54KePS3r+ELr=f3tO^#w<rPp*<*E&sLs*6}Du z|Bl78mwcDuK4zX^tCe};k@KBE_a(>wT2ElQ|B^%1#ytGc&AWGQ-no0rSmj7_z=?&w zWR2DBl+L%Yf8UnX+k5gz2WOz&(=*rYWmY9#y4%_9ShH{5yxk{$zO|nrEc7ZkU*f|_ zme!xK-CvdTvcA9h#$6s;|IGiN6023s=G(T?FV_EExO~Fzwf}ZjUbIpB7|tCK$8zKP z*XQp2_iYsR|GQd$t0vn-_l4c(yM^bkCma2EWV!j`9V?rx7k;`kjNjh*@P{-1V2hdR z;?2dE-mLk=vbDxzdX$`brJVkbuis>&%Y6C7@=7^^H!k`5Z^>_2arwLak19;+IZmmB zOrMhbCwJzC3oEB|W(Y2PDV<qedFx-pmfkIMm2%%J=I(FVX6iiKq00FJvsz{M3l&>` ziz~{^T9#9+_&BEeELVT={FC#cTBRwxnu^)%n#Gl;?l_;C!<1SoZE0+H?#{gn{4H~S zR)vZ`sxw~j@}8Gt?4wNwChlP`Oj>X&=ze|H_7hjUjkXGjq`b;p_OHQbu0nA5<<wV( zn#{LLB}(seTBbKlN!-%VKJ}PS0&g#e=a*dqCigy>t(0B(`{7ldSl70BhhlmE@_QPU z=z8<W2H8oz`T6+wr#?w3H*U#auJ&74oUcz<xLi_dudJuhm$YdTQkR1BR;_TeuNURt z_IQd-y@6lvhqwu^1Pe1gn3pkx$!L^`8EH%w+bVzMVZiV8@@qw!m;BYp%vZ|vpZtw) zQd!fI+)d9mx!f{Uc^f{VOxN#L(4E^-jeQ?F{CE3&+;)2RnfBT>%);{<zwEWC%~!1T zS1j7x^<}O?ZGL*+KHIC3Dj%M5${gdrt8hB_lUdLwkz@7S%qC0{UXn6bp~q2v{o=H@ zDd~<gSl@4b)plwA?(KJ$?=qXf_p3we#j4p~XJ$%Wy{Z&2F@Dnq{n|rIM1od6x^QLM zmg|n?C$&%1vY)J-bthZf<K2u8KbwW@=Fix*Y1Y^4qI&s-?w9p9J-_s(b7uYJH#?hG zeN4)lt++OP^|2YhzPqieH{4N_FB7}X)|j(l$_!Jd3$3BoRZ5-II+dhuh`O&nGV56T ztH&42gzt5!?+v)WWbcgM3K#W#zs%6?aG9@lF?rJiX~Dg>cTM#9n8p?n_r1B&;daP+ zL!rHw#W-1CUSPb!^Zi$B{CXpyRUGsGTwE^4KlRc&z9@6fGfd3yHf&{_%;;L*7C-Bu z;nu>ohlLLf9oyEwVs~n*w>|8A@w>6(`wRRE<@@jN4fWa)bT;<c2feRKqOvcmB6qDz zs(Z{6o39wF?r~l7x%oQ2*z(L38qt|sBMbJt$^EnczqgFPMfrD|1eg5MuMQ>OF9h3J zC3EgOmUCQk-?0sERDN1L%{hMcQTEb{*Eqg3Wvem$`_nkNQB<YgQOn;_w`l8%m@h^L z9-44Od=HD2JTUEM*Q&*~X`F8w+*)?AYdu(>oO`BwPTJepn1eo(wi-_r=R9-#??LN_ zuYA^ozIu?YVR6XuKHrSa3w-}xIByIMSrzYje#UnT=kpP~TAo$sLhdPFDDJL~5PWs> zF#F=AH)obsKb%mq;<}QTPHDZP#?ecM^QJet_164#tLgQeXk63#y5IAYshaCP#=^rf zi{IUR+kZ)^I%vz)hYkEQ%zY+b$X8ulF7QSCXoL6kM3(QLT6#PCj9YqHH%?Z0GbNZY zynO?6|L({R(T#e7Tr1z~-Pb7)*tPXEhsqlFJ$LziYRtb#+1)L^FZ$i%iMOz2{j(T9 z;h*icDxX+7Ws3Fgcbt%Y$hF@s^T^XcmG-=L9SN@Y69d|JPjd@S`K_>IpZ8MlTW8W0 z%NI=N$*jqgI^J_CQ|i8Rt&Jy$DSq+CjE(tGUahH%FYGsy-{7!&9&i5b9B~hyH=PaH zYiG=!>RjBEv9egEzjH#r|3RkO)4`hc%k=z$GfR_2i^Vr~1Z%m@$@*2Ay0YVPx<>W! zxeX;N{crP}dZt*b=RM!lM|I9p|CrO!XL60#e2og-(zdfD|4HDE=Xp0yHe}zhsO)^l zR~Xqp)1_ePA1k>dR_qV%zNlmZm21a(oR+*T$&?P}y5F&_Rp|uJ2D6gpfKNYvv3v`z zf3s6JIDVG(j*Rb7n~u#n7`f@#UXjTv**;P=%A4MK>OJArSTC5$uH!R#o2jSs2IIGr zqOS=}%DigD(!2YF3a`XMey^ut?i?5Tnb;5OGEaM6bVg;)!%tevgw#$x)m$#LE<j_h z^In~nORQ&_V>xTy89cfe{p@C_OY8Q&ODC_gEWTNPM^E?AzPLL(xl88E{q?@_@vDcQ zO8REDZ!YPpo1*g4=INEgR~Ht)YxlXAk#~k+<?b~{YdL-iTxy-W@656|#$pzhOT4`8 z%7yyAcV;wMc;AuWoU2l}d``2)OyhgPjw|j8y>HoIys)hO*wNg*>RVW)&-Bbyzm=;r z^EA`FZx`!7x$UX%o!Mc$C-!iZyyqvgWlH-d9(r4$bmB-|;st)8FEf~TTlwimFY4QC z6P~>3Ay0Vzx}>{VJZt^bw^%)mId${GtJ8tA=J#%N`xG<F#_(wVG@Fe<Uy{;hKU@>8 zy=%tf?`~b|)@hY5wlrjZr8kE`@QNOPm7HwW`IeQ{%d0!)?6pZx)~ipnvyc|O7b0@c z_wO#Dc@v-6o)bBd{^dcLwCRKJ%`erKiJjY|sdrI#*)GY0wQJe-%q+@!_(UjnckSiH za@@zG|8Bj#;Z}(9I?3GKu9Iy!JJT~C9eiS;GOwgl{pph(l8=76+e@hGxU6B$-H?#v zW$qM_$zH@-k<b*d^S+*c+Iub2`cuwPQS+u5@aD8l+ZMJl$hRz$^YQ^XW1i>Xe}mr4 zEI9tiHe>ULW68O!_XTS=2N-Y7WW8tB;&%j8y)Qbr%f>M|@4Aj-^1QrBEWJBp^_5;6 z^)^e$;eOX{KB>?2zDeaBt-BXw)jSt$$@{wgS#CdHVSab`2D4=aXE&LNUG|-{wcfDx z_1lQwVKzrrYo|19%I!Z9e?qtP-L0T6Q*XWHVzs-cH0kff=aY7xxbOYhJgw;Lhwo;) zTqixrzvKJv?T_18+aw>o-?8qm_@aOVOhIqHE3{;_cQi7w$vSzSnoxC5Ab9sQ^&+3Q zPD=jMPZ(}}{kCJzVNgSxM{wuciAsfsZ{1O?kCnQ!Q0kxBo8FUgC+@x6WS*z{z3fe| zCb#9nTp#1v3*XM|6<w0+6X~Izs`yl8SL<zg!P13G_>R0&tkyd_Z^j4H)AP29rkp>c zwKw`#W5CPWy_clD?wxhI>%RKYs?)y$%3{0p7Cz~>`|2!rX#)QYD;3MVq2}$eP780h zSoP@%-@I1uwP~HqOQGfR>pH`@r#@c#vX<NU!i0O5mzLkT^RD-WZ9?vim%-|*Qx;V$ zdDpk7EHzi~xNvRw@)JI5%$WAywmKlNac#2OnU)9KR}~h&{<ZMcB1`puGd%uy3)`nL zoD=x3m&e5$e^L7rTinF8Yo3_*rEQv==kIYRprrEHktatokFBZCP1w2VXo;C~$ojCU zhL#_DLsGAnO>f<_NA}r^2R+<Owu^Gb1h{Trc1(9H4ZCG{eT(l7d9Jnp?r~SL=LtOH z-yveR;?Rkg-o;kWjFpxzKmBsX`5$3(?0Bq|s;}hjGM#>Z;`Zs!a?fPUdHOc=Ooq#Q zSF3y7Q$Cxf?-jql<Wj>)tIT@41}h$}4UgDa7dMEMzPPh~%kAGDP7x+N2F|IKNk>Bt zOD3&N>iL{>ZT7>>;o3)LWc_gC+L+=nRq{e>^{m~Zb6;pxPTFCzWSiLJkJ%k{H(s|d zIl8gpp7sjq$=nlnU0(Wb%4F{4Syh`pEIZxg5PA1~%NApYtCL!5Uka-&o$&g5$gldY zP1k)@+GM@=dK!l=w{bYmtkDz2V{M|+m$fJL!n!osXN!dP*-TDe^iXGVe(IEy{q`Z{ zb{UVlIiDQ+m{$6@LT<1Bynnjamb{m7Jf`~KMn<c{QERo={()UWZnrm7uvuuBxWpH! zZb*MqcjTY(T0euEOY%9Gmi@cWv20oMs=o(!)N>!&a@J4qS^dqIH#f(BnY{j+X?|h# z@iV;_y<6T#R<`@+{1@DN>-pmS9~W-hy7;>3G^y?KCMx+BB8J}#{bTOlzH@KY@t^9= zd+RUli2Y)|ctXlQOMBV)`KIgq&Yjm2KP$ER!@U#d-@iX<!??AR-6<%}Vv4@{)3uM+ zW_=Yn{&wl(vidz6e?Hu?@5>Hf$@ex>)~pI|JXU;itw4FK)_Xl?E$33T@~dkfY_ntS zu1yiod3!T)UU}oWMH2A~&ixIzy>8b0S@o@a0dw~)+O|D4{^^~-3r2tTc&5BtB3Nf- zo@Wnk{l7f3cEx<(UNd8XvNaPp;&?M;7Nwu6*&2EKR&-qBT;=-DThmYM>3cV4V&(4^ zx0<*e7J}9Gr}dRzcuaF$r&+s}x2(`ciX~M@>-8!hn`he(`+?i+2UAVz-?v6K-gjxN zPd0hKA~V6cnfrL|!5wekT`~K9?9@cb?Tep%D_mn}2I&g=zU-eZYq;*ey<p6yjfFcl z=885gWh<FvaxA5uZNGta-upivw`_EBddT(Yqk>A?<8%Lun+^#0a4dV?ymFzUN`6e) z?fk>LcXPIWXxi$ybyMh0haAOi(~ewY+IoS>Z~DK4s{ZMjUv>G`x|NnMuG+I{ap3J0 zxf-q+<qsv+NZl7<KDNM#%UG%=ps@9GfYY>}j?VMqrzP@lxgGp1??Qc|PRNg0Qw&%n znBM%<nsjl~%IAV7YM1;gklg3=M8Q-tYu3Ei;a@$k*X6d$7cahPA-7oQ)q$<7E5Elq z?_93AsA|vU8&?<oT_c(PspLtosKeRwM?5?=R?2UYyYIg#a=qzndo4YMi_7O#o)N83 zd)9Yav7u2|^}5|zrsBVk+pVuw<<`IBdjDi%&d=lbi;nybbY4*P_9nx_ry*U(o~3P0 zRNf!{W+rc^4CkZn2_>zkqn%kD<r<n@!)J!AFk#z%{P2Zjb8+*<%3hP-a{bIus4C8{ z-o0=8CgpI&>1RYfTvp;f>FIy^^^}aL%C+yb%IcQwxusV7JmhKVBU_(6jcro@*DCJ_ zs!!)Pe{jRG(TeZ$;lOwAi{s7|31znzo6eVFFpD~(w!iA(@vRegh+RG&zcuT-al9vk zopD9kQHCF99{74R>DV6*Z4+?e_@}_}szJ8M;oLfZf59$}qaq7A9FrHdM!4uK>vv7P zW$2=$WLT>*OCjorQj%e<&bK8mG*#rT`|Ho<aIJ4inzd~6i~Ch;oSM15J6}uN<YeoA z$5{Mh=Z`ZCcCP$)x-%k`C5#!|Tzf^iJzS@Y##ZxY3Qe48XH*+icqKUKow9=9gh&RJ z>~OZU;7iO!rG>o}E;h@ui=6L<JaIdc^ecj8??$GhoEKI(TBvclbKLJ_)~~&hs&qm) z@OyG#_^*27_&?M9mn{8zrD4N-&%aNy*$!;m9q77Yt=$bD-v)t48y<h1RdRv(Nz5(N z^ovH)o0@k|I8|1kHs6y)v*}BF;}`9x`^;7THtd}6Jblr2#(qH&=GY*emR(;0ExxB@ z8n&n(`pjOe@s%mju!3D9pyNsjC+mmZIw?UDwfQ;tJF_M`)xVEc`*Z(9XCCt{)il-F zcfL74`o4SnE1{zEhx-EVgL@zk@*d`M<hGO<U9bz>BBdMeK2PrJYP*FCgLpMWoGu4G zUR5r2@KyX;s}=QYp9ut-y!>|c=JuW+hvGl~p4YD6CZNuj<a$8xpU#Bjto30PrZviI zqz)YalCXO<?-u4`&GqvZJrzsOV>{4uuQ8_K=lZYRn<sBRKiOJRp;qZp9nT}Nsh4&J zUAwL^SN0U=D(l1B;=2;wtMWT9yL`Wr!+K7%^je=A46~v)r)wpBlU*2+UK-abv-)|< z+I1`5Z`iahJfq9+cEVDzQYXdktCy}U3ch!*ch-(W+|PDrUAdFL<t(4-;`;JmPAfW- zi+*yYZQ#1Lc(K%+zD@2jseK||r*?d>N%~%K*{ySv-LBNXRaaI|x^-lmbnzkWYprH! ze;raym90V~pJ!$D`fdNb<fYq{&X0ejUbAY>TFfxTT`%C9z~nocQ?#D!VO14(b3J<e z>XC<&_cDHFkKvNv70yr*_<kNA^QOi%^_^>Gp0TM-vRM|Ex9Dwd^A29t<L)x6QZF7V zQJFOByNH+4O_v`^HIp0PFP$|(a;HLo^6Q42P%|y*ROfX^^>|h5HKuuqE$_<n4Q>=! zF{LEJKu!3{QAyc_^FB;%6kQRyP*r911pP;H&t@1^lpgnMy0}L)*1YKZwgX!iNGm65 z^}VdGd-XkW)~pv*p5+<;^ly5r)p=|``*W`AcK6TxPmLsZu8FVN_wSa?Zl~Y;iqi$2 zINZE1f0NN^wMmDaOT5vG%f|2RBqe)P0)qG6UpGPRdUo!Dup2K}7SC&l64D5n_$bj{ zCE%-E-_5h9ua-wQz7OMx;H=rv%4mE{ttM}K^}K-d4)tAo4kawt+U$Gv#-@_4S29Z< z+%V==t?kcoQCj5j#976sbk6gWEtcgvA{=2X*^3fbzu*15fGhpj4e2)q5vz^A<jj<~ zDaJU*prLnqrMyznj3<1O4qgg@9uN3<9hWk^@oV#xS`&6+CP%0873OSt+ch-`C4#$7 zI*K1U^Q}|;7T2o!xYjF6FSe>r;E~(;VV>dq9D#yKp`L{@bHje|{<)#{{i@!}FNz$& z)t^r-ez1k(u>!BzJSMX$*9FQKgc*J<Qhn80+L)wd=(Js*W3rIgyu_cZ5A5UKmRR}d zA1a9yxM0RCC%<#z)t8LMd4kcKKQ)NFd7nA?(yy7xYd0J?WvkpZDX_l3-Fb)ao2tv7 zSDs!h8Xzl|bu^;A!>{A!sl9)nPnkadsoe#mxfi6@eY>HfF1f^+z30zlPsZ1VUa#L( zH;Jge4&pn=vfxO-qfd<d32ZASXy3T9;Pi_12CJCOa~^(K#kT3PWb^hD-euua1zWCe zoWbUzc){7bah|nU_lmVU0y+=P{Z_wK{L}RKRSI0v%hg<>8h#wibX}2k_}`0Q|KlAi zE}u$S9MU9z{jw;_w4NprhmvEf9jf$Q_C8ClUhpJxru4G)W^%h<aIqCOUtG7ppiHD+ zmUE$;WJkgRThm&*70HSkozJF4M#vwUX&|mOpSR?0xRQ+IxwVq7ts7>hwtSzV$!z_$ zzOm+ui$FoczMZj4G?_j;{1Eb^-}L0vy~(YNXB0Y?%WiBC<N3PB)^>H4a%M(Ght}51 z0RpEuPI(v^87*hKWiwTvMbYR*?vDx)@pbCKrnNnr6j)rm&+zwcUML_tLH`-6&;O>i z4~06`ots*5%-{C+v)p+9_!^}bvVZwB5>9g7*r7fp+Gm|q315?=<rUTY=U&aY+V;bT zYyRR>dBOJ#OC2<wnkB_0-?qz6Ua6*6pB$7K8tZyvVo@r`{fnoS7XO=3*Py%1TJq}B z?%j%0nvS!Fu+Mhd^u^X?M%49|dAV1vJP>}hOGd5LNHfg)qxH>ANw-cfU*8{7`^#>l zie|^QZJu?H-(+8Sf56V@;94urZ}Zq6+%srgv#)er1b^4BuTd{owwvyZy7sK8ui>D@ z^5bsxbLa4GS!x#OaDHNe8~3)hz1QtdX{;%Ga<MZh@2V`<^Y;I{Z|+cvU$4LZMB?O{ zweqGXe;Qg^+bgG^J^yv}<omOqeE;>b^z$T{xcG^ay@SGIGh^n)i%d8);n1Xo2C+N_ z$Kvjn6go6ip7H*<Kj%h;i?`t?rnDWheLu97I!`QJ?9y&kZ4*+$w2pV#@=Q%PuU9<` zouCGHo6fHXE4!DzouV+aefQ&t?+JT;DpxPKJ8zS5ZUo;c{!{)&pNzF8^J~b~oB61g z1wZoaHJ|m|UAS+m;t{(fd&xKMsv_}he*>2VEtzmr!1L@+;hg-v@4B_W`s7TGxfEnF zacX|D&Xt*qv-+)Uy<RTyYV3XgUG}WKa$-<%)Ea%s37Th4pJ?@oHCew-|J;Pbg83&O zto5_uyIS7!n<wPgmyO}8-_|(1S!?%AX>+~NzKlg@T_T=-ZV%kF$w<$6sgAKZ^Ss!W zG`|Iso7xNN-!RV%Nf%Yn{Jw^Z>zsS^heJ^*U&@|zpYhpe%T)fg@ppuxIBTY~Z=TLJ z#}rA|KGtNp-aXvcG`gkpChis6dCYVdd(6$i)aVmDE2RH?&Cpl8C%k$3zw=*Dx_<7c zS#AEWe)GSboj>1j>}^?4uJ%XAB6{MBPp&1$uc!B}p8R>UcTr8@zo{{`nL^9uH+3*f z{4X%^M19A$Q0M5+`Cr%H_nUZ6pn#K+PwZK4+oZK2;dk%rOzhv>n)2|>rp_gjZ$DUR zai_07)Wf~JPiunG6v0y`9VENNOAl>m-)yR+CwWBHlz)A_eZ8IK?;e%*3Epf)Wkzic zm8PEVpVyc9)XS(Ib-({MC1?N5RoaW+2kb}^5&!q`;+sb==3IPdw#0$^)$ciXHr%-R z_{g-1$6xF|?ov-)%2Z{vHFncQw@q97b%Sc`p5%%gXMf>*L-Ea|#<}`FAuIe^yISk} z9xYsM)Z*m$!l7WgL4CbL$a>p%S``X$g6mH{n7XpOFQoH=H)9p3gFoT0y<}1Umv#xC zDgOl8I}U%@84#`;tRLrL&Rt!l{I2LoeTVIlxKB5vcd{)$aaU~mE{Q3c2^O=a)qb1M z+8ZG-)m~z%@cDT{T9vCk>Xd9&I84ejbjn!y<v9yOvHDtWtu_CA{Cw&w4+m85?K%E> z9^b>=r&pwR-8}HG+_{MTkjbrhwmpd#U!*x~6OL&<z0ha5`sonPkGi}!{_VSIqUox6 zj%oMVsXOj4B-wRNExG#fM%l%s_Mi9O-=-@Y)l$3p>^^q8wI|lCt<Zhv#x+ZD<>p;_ zt$`aXH%YGGotC1P7`0w=dQRSqJ1+Ik3R9oYJSCd_zr<lxa8{*N&gaBp>6>XsKbXdc zazt)d*W&Aaw65BO<EGoj3ww50>{n1v|2WC#cczwLq=JUWAF0ZUMQ`W0Uv+!E<m1x1 z!2B3f{S)tfHMF?4y8F*gpTB<JgjaT&Q_jBV^ZBreuW!L#2lkc1OP4(j_!3;R^k=X| zQ+>dfu8AG>-}nD!53awktiUR%)hMziiqlN&^Byk|f6LB$F6^e0>r_&k3+1;hd8xTu zS!5TBT+SKBhk@(7nLa26>T}JO%70c?Fu}Q6dA`YncQt16JO8(x)!?w0^(Rqq&oPr{ z#%}IREzYObJ=&{y#C6`)Ui%w8!E(>@=WM?$6cSQ@H(p^|`t#)0y+60ReZD>QWZcU6 zvb{o{QeQW3an}siIy3#(d*1|$&B;#Z7{A>8UshOGaqCaieyhx$jU`2vn>aR4i0gSK zJu5$B-(JS=3xBqmO!%t#^8QO^-H#f=EKyPp%+npjt}UIkc&p7Z%|(U3{hod{eH|1W z=Dn$T`cs1o>euRDb)>{HO0o%CU+LdAd%yUnb3534-#%-o_>;Fsn15BriIo|e`xa+b zhU&V8Jh&L-!<NDMOiJ;BK*o$K+a8_%u<aE0vS=kE<2E0y+hwP#JtVJG7|#CxL`Sgp z(cA|na}?MrSKoNbnDcBMcbfn6U(XI-a&UKM@~A%LZ{4^%RQ$;K_WIz%n-8Q;__iSB zWWCVm$Kt0d%b$D}TeIcmirbx0ys1GQo7|`59Q@S&%c}2`t4;66C2d;YUpp>VRgiu3 zV`-h|xpOB2Kkulktx8?=v*ga=yZ2vBnls-w@6#k{j@nbVrzvDEHm>IqT6g4u7f;l) zjG56^4(yeD4bx=VEq5siwo4YY*MI-Y_TBd6?hw9>BBfgIR_t;3Fw<|xe9r||uQwzu z+_=APtyJ^Z^HVBcyC1rk5gK1vvG~hTh9c&Cr^3tpH+G%Q`<>g+l_d~Ya9QY++r1q* z8_ZUOm0f@M_z35&okf8SzB)5sE!@PCa-d7Gx<Pl@rOWq>Kg8Lj3dgRn?DBk87kukS z{lb(le(@Y`llSag%2=K!QYrCWfv0HYl9HNNEj13#(K9bU-goKaRFA_|>tB7?@nG+z zpI=**|8Y)9bU18xuEyfC>gvXaZ`uufgxeU4S*{!ruZ>=JLn+|%vNFNdnSs7OCejmM za-6O?u*tjD^lf%t$O4|KGY_vAi$)j*sqq{5{9aklm>6|>%?ze@YE1`c>KvZM_pN~W zsZ7FphTZJqr-Tbm-*wqgpqsu*WxJGC@RVr&sMZ+GX#e-eeG;E>oV5LJ6Y;*$R?6v- zCUf93@4m}!C3#OP?3&z<K3?853shpc6rT7yVe3p68702pqYLl9H##}@&O?D%o|%Up zo?r5yBkz22J^zW06CIwBRgd@1nDA%9pGzwH^>|g!%YRoC*v#glr7Ek$C)lp}SU}7{ zTbGk{j$jYRv66!?J}S6KDDechC3@e~QmWT;W=Xo%AmQ{&?2$m>3?sgq%r&h61uV)< zhN%Xx&ZY^paU3p5l;GLDU8(*fFUOHHk=kZY*%x*M_(*ou*2{1DBhbNdWDBoY{eh() z6n8US?8xwu?0s8yUij5^fzFO2Itm}3Z98wP;?|NJ#F!vZ>S3$TeKCH<wI9tNr+o`% zKC~&|n$YDP#SA9F+a{eVdpeEn%#sU!sTZF0y%k?(@~f%gy`9FkmN!BA4NT{sG_V|A zAoO!X*N3I<OJ4;G_FeU=f5qQ*d&jcA=ru9hbPFWEEY&OE?CgIg^R?oLV31Q(${D^h z)7MSjR`6t+kl2#{FHGWmb~=bG>pE0$BY9D)fs4d4uEXmJK5uX8S2!caVf$?RVZK8G zi8Hi#s)N1=v~U~>aeUGBZ|!j{lNC3LBt>6UKAN|)!^b6U)d>;X0`7%Rdo1dG#M?K# zop5x~qZ3>yzDjC>lUF8PS}y8ttM>FK_g@!{G@h<Cv63%(O9i?(j!xmtns<1Czf0mV zoh*&j6Hoh?x+Fy%)R@4TVlbWYNaCDWK7sbaGL9`S4Qbok<=zJ~PHi$cmzOvvc6O_) zw0V1Ckwxhq@vV|g8Q;I3ohJV4zv`8F^@0;58JBR*b9PZu+T7&PvDn#0Np5qKyKqo@ zhl@)Z>qLRr_6ir9G}eA@=C=Y%I4-SexN^)=QAKc4WaE=LAFNx{4;gEJka2&cs3kac zrsGo$4gSE+6=(W9*ZIh^s4y8Bn^lUeYG2?IpeAx&=y<%y*6EuQv{>Zb-YQ-Qv(Gwz zr2h59`5q3{w)qiX&e(74*k@$9&rX?r$p`N5^_o*UmE7OWa9;XC;;T)I?jbY58=t}^ z{t{cb^wRtl!p~UBB8>ucY%gud`dQ4>YB|@-tu^ewcm3b|DLzxq$n#sNwwP+Sgta<G z_Jo*gcTAjiZL#ACvr{gmJ}WC3nV0s7Y+A5GRd;#4#{5o3!-Tz_AK%QX7x{E*iMM>$ zzRL@RTFrtqF3ELl*(0aA$xVQZgO!!_llUgdvyqd&o_g}>$?NTxCqLf5`u*{*mrp-C z@!lZc?Jy^=`WAUcpQQn<;%CZdro1!1mDWD#qIK=VV7Enc|MNt2w>~?1^e3yOWq1Dc z1<#!BCB+@+vRP68qxQV?dh02oOHMEDzFIn6-Q9PFjeGh5&EJ;hj?ecu{knPI^Y5e2 zU#~yADVq6j?ZrQ3t_hA4YxeHjqZI#Yzq#jJnQQv~QcDV>_V4-gu70<Ly-jZ2+W3{r zUYz=P+K}5>ZKBeriCT;FCdS`>=pGdM{^2Hu_uTh5R?e3dEIt4EnCIX6Rh21q4^+2j z#jTPvd06-4NznbG|JGN8HU~(=2dgQEYX9O0yQreO%KNI!Y$XpJo1l9yPhFoqyTaMy zu-)p}G1&r^QD+`+Y5dp4a!|ZwQFu?qpWXlO+Rymayv@m{>9oRDZol9XhU#shZd!p= zljfe(;$~-W`R&4AxkX%X@7I!vto5&UsU$F~t#sd|!*L}>ZpGt=w#oZ;=`ou$ypFKk z@cG|d{RK;H|1M|VlA~dJDoZi;mG+`$DI=FH9v71N!v8G4dql@ULrG+E<0BQGsce3! zyZPgb+YWY?H+{~#CAFAW%W&EQizho={<$7|tM)8&)7fcrXXad)YOgjs=VR+hx4HlA z>ThnbV6FVLr&6<ga{7@?^Oo`T2>UPF&Ajpd<lJQS;Ftbi<Q9Ba&^z(M)T4XdqlL3I zxl-9){Fxj)XT>v{Tc=9*%ud^~@L`4j&Wz~w?&V=o8&;lpvX5`_(y#7U&mP}e=l%cb znfZ~YHVb?2(VP|jC^s#tbGyrCuRUjdv_4LAe>UYuW_|JUDL*(rN~SKdHCyQO&E>rM z$7MH4CLRA_ka8wOQds=4kkZr5pMRdt+n|!B*=F)8J+nV(S<SU7(;&^M`>*@2pFRC2 z+l4=hRavEG`({YRPpVCkygH{xduhh&lyJEs^XA81n(L-4Ixc3rO;GlMS0-P>w5wAu z{m~0l<TKvvQ&n44-^IPO(kbzlKQD*0>Q|}hGmU4?n9TR#!kg2pKdVP=b`((JxXk=8 znY#^CY*n3@vp=eLhKr9{!%2VPKtT>GmRO?&-K_T&UI>(QHk><Bk;;(wqU9vxoegW$ zm~?GdAKJlSn;6?r+<heIX5XoeTOuRc?w-1Oob$#qgISuL*#<mX^>yBt^k#QWIw@Z~ zmGir`&!>WAS^d4MT(X?Ay!&rGN^NO;=q12WTv~Ydh|Th&8|wwQduRGde4W09?UToy zx^-zc&$nOR#8t^|maDj2>w4Y3uWMWve!6__{~v}!Y0NBt-&K_93(pTrnSMjFZjQ`^ zV%5K|ygzTU^jdo1=<9X+<~SUyZ}DAsVd@*HubVf2)-JknWuiy%stcOZ7p}}|+xYMO z&62J;lTFlo7QFhBe3x&A!Ndzkx;TYBm}kzvYM7|R?r^$od4}I1m%iq!f}JlFFQ#63 zTp(tlJyr71RH5b<&R<lU_f61zdOLL2JoR^ir5(Fc0@yd}e~SC`KIziY$>J>MthUwF ztMwI3eR_ML;!96KBX`@F1Bbj0%vil9IaPhN-h^%Hc~f1_{9&Aah<&dBV;6%j+X9D) z9GBAftm~ZK_PJt`!d!-1tL*<5%dY(%@@v8Mg8A)poRWl3DW6h4l^penLpbwZs!;CT zFFCOb>zssSUoVL>4s$%o_~BArmV-pT=t=*@53bioFuu1pZgAjv6;aEg#}gmEVa^@b z5+1*fz!mc*#b<8+J~5y*x_I6?WBbx5#&36)`JG5%{Qje%lC5p^lD#Vz$=}*=&{S4m z<J}3};tczQwEJrwMebcPqfundbyH@~g<Ef(Yj=@UjQ5$qrBV3!<?(ngv6q!cHdgW; zlAHSfKbLi`eElK2+tbz4=ljow_a8hyZ&~Tz7|VF>+<JznWg6A{1Wnn_rzn*EI`~Sn z*IkqO<K<5OH4^r76%HBHSs9u?vhJVn)@{u$TyXBua={D^6P8=6sy8bCz9+`18~Hxr zO3t?hbF#MV4)ELhs#YUc+U3fZ1h4C>&Ryxe_-#sMN&VEt_x?Rj?0vWX%gm*9u70z> zp4Kj^yQcE|_>))O#<w1A%(?UARL&)nAT<Y>)Uy()i{e@rwtw`SIC1rhPtltTi)t>} zC>@>bwRuhOx04%pIppWg{#LQv<Xo`lmyExE9vGgNow-PuWv)Vo(Snl=+ccSU0~h$Z zMflEK{?YlG%ir)dn)OBjk8_XN{Jnm{=&I=a3v8}iIdd<FrV4DZd_H5=<6UXWmxa25 zr<5LOOk-a=Yud?^EjO*qJpA>JZ+lT*|4#FxwEOpqv5oSP;qPyiX#7gsm1_4|?#$n{ zTjJGc?O0K?ptD=;-DWmX-<Tzh<*UpWbap#<_bcUc9WSXmRuODGdA^`(y||0mN0(E_ zubjLZ?DKGj{f+gfUY~euHfu%yGS<*9vMMW?8xGo~U5q>&r*F5q(EOwB^YrEQ{?!LA zSh?qNt}WhjZocV?jJe9ZdoItETwBZ%6~ukPkhj25=d<_Y#f1kYud0|x6{nf>nV;JA z=k>|Z$KIbiV&+C$Sz6AES$u8vh2YcmSH5y@o;2s%hee&8!FID|WF*;T2V6YjB2}^c zvqj#NRtN7>N9J&*%-bX|S$4`9y(_CK7kjr?HEC>VdGpOSN+E>P=V3>iPc2VE(94!Y z{TuP|)6b;;+i*4L|CZZ6VRO#y(svSDvpcKkqYMA3AM2gne;FKJ6Te2=`q)LqIj?`I zKJlu*@3Pb1^PS?C11zln5B-hr2-e}5A<V^jTi4x??UnL(=VcB&@_*~5d%ip1?p{(Y zSA9X=eW}&e>3Y1X*UyG{S+(%*Dv0pbGLF4JlU?!8?L`;!TNl(FWdFv%B(7n3!9Go& zqwQ|=!fGK;&YE|>a}s`u-<D$Dx9zsA|B8=NwR?8HtuOYMXWCj(cc80uvFk>y6Ai_Z z7t-8jYps)2yQ$&ex+SNltMc#BpiY)M<q|t@tjY;7+aU3H593+$Q*k1{m*_;rpIwl! zdhS)vi+S1Z`9~X`Zsd};O1&f$Rg$6ZDY*Gm!MTU#(i~>%@{4Y&fUAq&_y5j0{A_n< z%6{#}Uveuq)j#VFO*<>T`rIu2u!URWm8M>+F^%f|x#nur=fX8NZp8<!TKh9)O7!Q* z)!UyvjySkgRw6cQN=)^}(BikI$zQLTM6jCwJGx@Ww%1u<f9GAFwI?!S)xlYNR`(dh ztU9<<DrTdr|E#6WIyzSqEUun9Yuul+j_KU(n%CbyFYi9OagycL*1US9EAr23FHdrP zExmDS&y8QlCU=XctxU>#-v7rz>*~~rXN>r*KK-|^zJG77*`&9>Lsy;rBD3+>!h`)5 zh5FC+a!&K5=ges?{B_26)1Fg7iK~@W+=TpU(x2_Ve=AgVf<wZahI!WYCCQ2op<i#m zpZ<9BN9z@)lV=rrGF=kh{G>3>wEqA3d)o_^uT6RRZ>p8wbDcYn)%Ng|ox4%q*ywZZ zN#VN3XTC(e)X|rGGK0@U&a=<|-It&5x35xh5Sk>w&-wOJd007<lfc_w`~I$p4GsKo zPXEv>K_=P1=OQDxzE~?CyAx`B@i*6*%Uboj!|kp2E4jBcILgfo4t}8SzC1Yl+ODlX z>pk)ew;epzbtbkrZxTn<o&>Y{hKX^OyQ==aGX8G)ZMFF<yV|Sf?nTAPze6Y8f4eQ} zte>9xqZC`de6@4B<%`YE`@V@jzNdE6SC^B~&6nT3+{rabzwf}qq}jp0zunuCxAykN ze~<I+UtK+?{n4nPc~4C5+ztE^g1-(6%TAH)d>mg||4&u!UDUR?!Y}r7wzAj6mi~C0 zI(5f$FUi{*^WK|O8|}KfCVzX;?_$RplLC^q#;nyk+kf34s!-Sd#LESdlf$JgC(F+| zy!m*0=h<b#&FYhFQXc>7i@!KMJ@&(sAgynYW-!lAUoh*l$egd<@?nn{dY=4gy2U8L z8Z=XfRp|MC6=}!%BK7HS>hd^EtfCgbEO@{=J5#v1_sqv_>{452eGPj(Mdnwd;@L~{ zsvkQ$cSU?o&o<txHM=&+&*{tOCD-lVmb@x)**8U)`+@xreTfI@J0lh_#5IU-x}oTk zP{iSpmv<o7!b{AHmz{09Xy>axN@s*aX3o%h|6umUSx$zZyzkpwt*?J^`NoN}>PrMR z*50ytoo1RpeZJP7gtnJEdIJ{)Szp_#Sv}8!|Bq4e_vbgZ`Eknzo^w=L$*$CXNyyo_ zE=)ant5W;vtW7pqCH>V}v26?TYk!r6<(Fnn`NH?|_PN6n*)4&wS`9wyDud2$w3$^V z8+c`&n+O*Vt6c+=xmnPIyzLk3-<(!WSt(*su{$K;{iHvs8U`W~Tzk5i+Mh1`{KELG zr0tcfhm!eSt0W@8@J3J0#4WpckDf}2bLG*@NMqY(zlPs>idlr@%*``11^D_ywk(VM zYH%bwfA7_gS2o7n@@{`_BqU@lf3&Dp_D$9Wd(WyYUa9Ft#-DH0@w`2Et+#&Sxii&j z4eh7T9Z9`xeM0k0tLVfB?;UDYSFTUG?P>CJ>1uc8DwQptyF23V+6(L#^SO5B`ESSa z3wt9<j=!m3D^Wk!edMIHVqpD^S68xHR3>r7PAz6m-1&l|ap#lzcFQKqCQGdizmlGr z)*3ZLO<TQZMx|}TS4SPjr@Dzc55*QG*DvN=^t7~gRrlGyUP~?)F5+?wjB;N)k>#Dy z#*Zc9S4$1#dcr4s)Yy=IpyJV<jx`w<EB};o`GiKlRBGCqwqY3r&XknX(Q$6w;&NF! zD{86j5s}`++#4M7)-vl^58hrXRx$n55>~s3oJU2LnO<8fr0FncMbHJu*Q;K#9WtpG zXfbo1{XAwuSI-v<pMSi}yEr~A-V<jt&wSFE9lu`pBz`yE{5$JIiqW&mvnfk_S3kRJ z|8-(>U(=SThMqWAU5StF;_A&#yay_(6wg1|w`oDqjNPtNlfE{*I~7s9<rk-Ly=jqE zmL0cA-+%M?+}BrLUD&qgbkaX(<NS5@&vOzOE9>`7_<eEO`q*eulOTt^ER89hey*yY z|8y=Dka%9ZLQ^AF!RzoZkyk&r_p&k-oYg<{DPXy=|1s0Y=||<&Hcc0PtZH3!UVW+e z7v-Zo=Rb<g{B>{Ywu>33^P)B09$ftEK;y>fqrD03liqL$9Ig$PSkB)j(x`ZEQdNY& zhvd2SAJ;RitKVNXdA`?y6;GnWSRA=LCj4x=snKL|NnpwK{Ojy{ucWC~>`v(|=Uk(B zXcmL|v-$}W7P)YnPi|E?zF&54#0igsaw~KC{~Rb^pB4UmidfJNZu!JTAx42KA8D}M zI;r+*&&`Z^S{sU0bEmnl-W1-;(e1^)+DYt=!RauTtUsJe4IEANjFW$J{ciPrv+ASC z+^{Fx_I+ka+3t3y*ZflOk^Pq&>lP<xo#+T%lV|qis%t{km6bEI1g!juIhnU6^}ewA zr+DjDVj^GvpODRSv+qj0o@Vzi_V=>yI<dd?_OE!hap^nGrCCu|Vx3uz?Daaj_ljs} ziT4tL$vrO7`F2x7&MjzuzDS^cz0k7hMma(9d*(7Z{}65c%Vnu`T21?h=+{49N8Sle zY&(_h*dbC~cX7XN)q}F~=r5_l%$IH{&EBH&?eUE(%^BG;Dle93>SZkSliKyhyXV?f z-m}hf{O5Sj@t)IVR=l9b^}H<N`L?#kr>m?Joq{@iw)#*1)?yVUf5OJ@SGQpF@A?-F z|B?h81r%>JRo}L)c;0;UMzK}O`IO~dXZe+muiN(X(7xM_PgIuw2{XIrp=c({d9jTl znl*Z<Pj%C$ZCRg#cX=7;Z~pGb@<g!JFd=c@<;p)L?uwT;Z!Qr$xXv@gv)zqrsf<~T zagA}!=YK~Ry_<cJo#}o}#Qh#SfiwGC4c_zDzdp=&&~Ac-yt~_kBViM+I#^A*vo>$> zRqpVvNByh#?&(RskJS=>T$_GHxXaBqd(C<oQ4!8PQc@1rFD{#H)Bb9jW9ias(-y0_ z$L6YrtepMN>DBBtD`!~g$z6KtaqMc~DHHD<6JK8pJ#}(Mdhz6mW@~4a|G(n?S<Y+D zwHUbv?td)nr{CTDQ~7;q4dc%_6aEL!zxB&6+UWbO<#YQ&!ZXSpxBiY>tGBgvtCG&u z*>Mr84m`Y~p7T?$Mun^NN7-%0y5#9ivZsrVg-`QRt=(u}<*D#}@murcos0T*D80W? zC|)6Grj&CgQqJ_S+kLTar97TDJ30;s2C~T3c$U_z%UZO$GNgW9ed!OuHLF*oY1{N# zPYaqb{hdzemXIyW?p-m~^kAOI=60YvwsMhSzl^+<%LC5EX@7XGY`l58^W!AhyV=Ue zV_wc#qI@&($Hh+Nt&_wjResqaC!PE4hcx#l|DCO30n3seZE}rGn#+D?hgFx3R(-no z@yDeV!a_xHMr(b(%Ks{{that!ef!2MpZ9y)8+tb{%em#wQQ>jugwQ<izF4*TgM6wt z1r^*5EXp|}5F)d3vSNhUhm*=nGR>{#t~OK54B8f0Rpja<?)dh>+ex?fO>CUIc*^2+ zyN+#Ox{&yL!|!*&T<iB)-=6qI<VKpj+N9>sdJKYlg7OvGicbfh;5j%$<5<P+`p@s@ zNjGsFS-HW?=F@vle{;90x*0u>wzn^vb@1}h<hiS(@;j>jmepSHe!HS+`(Z1=hn@EY zE~Zw`>g~8%AoE1FwS}v1(S$xFo6B48c`E$ZjsGa+;-GjWT{UdcX)7+pgfnvtHCh_D z^hAS1ou0A#UF=<c$I0W(D(^*EHrwBo6n54ZhrZ?&<WkgV37DvKb|t??iwL`xh!fZI zM=gsvM4W;wIZfVZKI7lEwvwlMZeD$1pMHmcT9dh5Nyme0HZDTZY};R{zB;*R(%}z} zoWx|e>3P2mUK!f+?WEu#>r3oXzM>B1zv_+D{(oK)?sls6;>OjkFO<Kx{s^3|XO`6{ zlxvw%pMLAQ@FB}>^^3d=g&8+9Y@V<)pvdc)wv=O;w5MT0R?FENe>9|(rYy56yOm*j zZo2qNfrHX}I6DN?n92?=Qu5!SneD3NZ@zhA#(gP~*;_V<pE107VvcRrv~zoy=b3E_ z;|S%*TxDW?uVzD9xI6!>qq*nV+_T>a*1S31>Cuv*;#AN6dFle@+44$lPCTs=TzMtY zY2MmW;?56MQjP>@yk2_Hrl{tHKqGtD8}YE2H$oq0TCJ71<rDwKp=!6^`Z_hUeFv8v zP&JWOy)ANMJ+HdXiT{5u@4xq|VtMoOrTe9NQ%hzjs;^PyopQbDh^oYm&k~GBV$@r# zDz<!>eY*E$<DH3C^}<5tHg?i;wnfD{U0QPI!;Q(>Lc2J!+<#QuKXKrA@W+py8zxUI zU7R{i@X}>Q)2DUkq_v7als#GPTJD*7NMMVhTe6%bC^F8<|56SqKcxG5iCiSF=e~;9 z_O&N{)hzYB>@<Fg*vR<YT4R;O@j~Hs-t8^Nl-FGU@h<f3tC*@EA@x%7dt$TplzaX& z`s3Jm)<Nj+@55os!<1DfE~yO7^Aw)e-6wE^VHT6uyM6AQlQXOPS5H_vamyx;>y9j* zEmKQs_f1Y-V9)x}>c^wH9P8`546o_d{@MM__kHB9Z?ScPoi)eyEOZi7`SkA8KO>b- z6Za+UJ*GU-U8&#YpMz5Zb267keXDTg#@u&pVPdiIU6LVhX3gdm6uD(Oy^rV6jH!o& zRk=Iw)&&YI^6i*$x9%m!gou?5np%1V+1oVPnE5p)FZ!*0{N&@+K9?t^)h?W-=CkVE zjyKxu8fm%->Iv$63KH8A-1HtlXa1ITvW-J)TGV;A-Wj%h&GRd?{hz9CHB@KLFR8DQ zc;R1Oe42m${k_qXO@B|gyZ_C+E5GkddH1Q+y8lQ{@h@lj&HMlUI{VZ2jfc6}%tWg< ze(8@p-`Yf$|2e#S{=2gm+Jv&5nQv`aY4)b@mFPzY!AFeiy|3NniQZ=8nse8~^QHdw z83!EeoaY?7IPKnSuWQSH`IyTbdb&||R$uum{bTiE!jX0#X2(gSNA`Vsv8%G%@c8y? zZ$-m0!;elaeJzr7DIsQ!<fkT|?ME$cUUbVUS+UY$XT8L^RUdRZ-^uH}dc1zsTPtQ) z5mBR#HFmq+tUPL!W)!e9?t#iyc86=es>^O4Kg0cC={v6)*Qv*hu0_9<T%;`6rS){N zVV9Q1swo>*IMurw-F)I4u_*Vo`bRs{pi1*q^VdYy^X@OHn6{v<>6a&)r{%Q%$&IJJ zGUfecQ8&$h%=m(#?^oxg4{CGR+SlxCsL0*#CG~ZIz~<kFe{FEioUD`YSQ7Kc%WcAu z3mF?<g|Ufq>6Lp;ubZHpo?^^7_xS%;XW6E86l~eC^=g(?%c7Qm`g=8*Q_{6&zYY6s z!}Zx|y}(Dd{QPb{kEC;#`=17${TM5GUi;m}qjUNeWHNpGvD9yE)#ls#Z#A6AVtaGN zAwFQY)uZ#8Lg#(eY?~J}^G$g(i)W8d_L=_+=a%dAf6o`R(eU$O{x3HD<v-1Hs$tpx z-?bPmny~!h+b`!lODE_y3EkdOKj&ztdAIpP=KMt;yRRf$HBV4W%jA7^_j1~jLav&o zb23bRT2BQ}OS7sS*b^|rd&l#1$5ZBkzhA!P+g;ANL7d~;&y$MYH#YuAl)mxY+40KS z=QfMqZ+-4`l~Mn}-DcJLBDwj`T9>>$QYP~He!=2P7ehAZmK~gy?|0+RtnXoUCRcmw z^Uodr<M#b7XLQWm_z!k}4+_73y7$rC9oKhT?SHVfOJ^PXJ@&d&wqe#Esy|&i<=cC8 zw$Sfm*3Ds?Z%4mS4^(JAJi#f>YLTk`k5INlGu(O=W-{uOZ2mB()cTBY_PQ*F)w}Yh zB~3l>D(sV^=1RGzk2V?UNEdF{Va*c7wPIR>*G=B~FH<{h8s!qNPFCL$e`3E_<+k#( z-}$t>B%W0IvItyi6Y%noaSSYGX%S(Gj^^8EwSKPI^!5W6^ek05Z^>`7+A5_uQ$=?5 zCWDDg4pv2~VGdIlBo}2$tFU?|8ap1J%j@-NO0$$o>)9pB;>-Lw#Gf1v5^O(dEAM^v zrm*P2sO1q}_3uQttnjTC4_VW*a;Iw2O|2_Sods8U$h(-nzOw3_VRukzK!BCe(wmL3 zykD*y%B^)TI{EtJ1(ysZlfwR@L%$uLbG;P}(s`zF_6(Pa;H(+*zaRc`QSckDzC=uR z`h*5?!LLFIrst&RruFaQoS1j}Zsh6D4?msl-2Jt0Mr}cSg}6&S@0Hqxw|HjfbBBC> zH~*K1&+=CNxj)vO`R@7k{?l0H)ojx(^EbI<xleoWF()Z!Py3RO2bjXW%jfANr%H=i z{VCZ#W#Okks~MiGj(3`SVnw(>&ZJjU-`9n4E$CLfby{F2V|eX_jJf*frr)c$BWG`E zzx>yq$~?8crRG`pge$k-nfa{#`^>c3|4%Ze9ezKjN5Ah$-u*>SUp;#9?U+pIthZ^; zw_N+wcJpet_`Ui!|4#0Bs(JWvZt|Rj!`EL%mMBD9rhU5K@hfrW3Y)BJN6dKB?ioM7 znbNz@X5YbUmW*1{ex9kjn%2L6<3!7;tLxqho6Y;M<k-9!Z1roc7iU$-KmA$2qw@Gp z{lO2%xR>0Ub7gsR)n>VSSJg@`n&%z#PvGeYJS{z^Xujs-&F%NhI{%zH@lZ{@;*ifi zca3K=r%haZaG!j{FZXM;zwP2X3U|5P6WA@-u}`SFqu`0-^rhzc_X92`wY?0vd9~T@ z*Etiu*-Pzb**uyh;WJr!<)+TxOOJg@m)j!$>vfD}{gmhDUObra<iaEshp5VI!^b<j zPI!lzPhz;Y>e1QF=a<i9JaL*~r^&ORgY(nMcd_m`{b0B4U$#f84u39+Og<=_yK9c3 z*sr|J)^{tfl`4xIYUX>oxH+4DTe{2MyF08VJG4m({&6unv|HpbM@Vf^DvST4Ij9|# zdcFM`J3igN`<g%Be$US>>1;f^mN(xrn8v8V^)yR((esUA=^OqO{1#Brd3<5Zl8MRR zr=2K?bN9P-al`A+W(I+`K6}+9FS~2~NB)`o-wV2ijT&7wpQY8?k~dv!PRmrTn;e^J z&M!RsY)S8K#^;X3OZYi_!%u0yyZ-a`(-SMtPZ3^L@4w^6G@mIy4t(72qW;Kcf|#>r z{Ms_*OA9aDxRM+AF}3eoZ28ZHy>8DYKP*a2>pL3yv&v@Y{^xSd^^aWnUKt+<7C85R zV&2Zh2kal)ofB)G<n-^SYPr+QTMJ_T9ld?I)i_>tgTDWicD*#g1Mw--P1}R>c!Jo3 z<Cs*xCePaOmc^icY5U7xPp>#k)mU{QbZL{yQY96+NArIyV*M9Zt1xxbrs+$Y`JaU- zs?St;zM<OcP1@G$v2MpgYVQcFbmCmt(i(8c#s7xg`tskoue?sUWN-4?_Ux1XtIfr4 z(^#i4_B>o^9WNm8CG<*6)#o=~R$Yx(cr)9ZzpiO#iPDMV=a=rj_4;7Fm)oh+i)Z)C zN4|e6ZT6?)EZhI9wcmGEfByEkees4FM+%eQxrzR=$n5IZXgT;&zP{DLM|Q{ilZPr_ z>d!d+Lm?(V^*sNsgFJNyV;@Pxh4{+cld$_=s#*AWM#1Vs>+jFG@5LAqo4-0Oc&V9I zn$P2E<rRxlUmE8o-FS2OdHH*$O?&H|o=92GNy-t}sZ?aU;@&icBH5Y2f;%tuCjXgK zVYpo{?zhtQpcYHTgW+A%t~{N5(oJR()A7q`i!Uz?*>9|r^`d0nz8K5-pN<3znyb9@ zxWunM>5!*YY^zYUQ{J@xWOK8h1>jPn`5X7Oy>*{|{(W%Rx9jQl8<TsDE*MGGo~@{V zm+bqmz&yG{JgiH#t*^|ScijdS<|!!-iye3xHlCl&c)fY{`Rnovo@Xt7^LDmo)w~Lc z<Lt84sakzI!f%PpPTiLl{CW19%H-IMzRh=1OLuaf|Ia8Yvb^ay)6eO7=eJ+^@OECb zV5Y3`Q9t4H!qMly&k!?s<Zvv}W@f9;;YTOfXVkX~O?3Q}z-fDi`OM*(x*I#VBRR@n z`yCYAIaT?LOQnb5^X9_s4fR(;eBRa0X}GJg_^!ZP5zeyYeb3c>+&hH?`i0iLoMFsx zjajF&&+13_gufAUSRQVdE;0+6aBPCL^11wi@{`=MCYueb@7#PAwLUnT*I}jVQl;bV zBIl=x2-iQW7dz7suu3RvCy#Q@u6td+xutpgf9P&VTyW=KZEAzC-NlxKzlp1ZR|^XH zOtKGCnU&#MzN_=-`qjVdejl`!zw)YCP4UAH58=YH<+X>-hD#ch{7(0K*62K?@_AXz zwul2ohl>sutxno0z2VLl!;;=2snfD|eDp3A#hXU|-TdL;+pqOu$6u#%N56aU_EJ&x z^e6h_CyM&dtkirkz1jNBobA!MAARkTjQ@Joloc-Nb*njWtGK4jP3PLB>c=aWU744z z(dKM1;ZNhE`&RyotfUvMownQJyTWo-*$xqDi)BSYN>5IB9qxH?QJ~Idrs~|p)pzrs z9Gql(>?*s1srQsOrV>+wC)Yo{nSSYz^W=pmFQn|cGdI0Y-DmU7?I-!~CY0NIi)`^! ze)g{9;W~}%H8(#jTC(u=GvQM!Ocq?)u)FSD_Ju+(&C|TiRm;oQeNYft&QQOAvEa1M zrLe<R>!Y4`2<_h$<1jOI?s~p+U#7K5dYqduXXVk@DUl0KUPx&@rNcWVG9b-!0cZWM zZ_{_AM4Ej(*4`%4#8?!0D<@6r^t$HjXZAkI=Gb+4ZhGu@tzAAj{+gk^p>9&!&8;ra z_*;_xy3d36-y=QsjWZIhj)&GK*Z)XA=vZ*!@q?n1Z(c3hJ~2jP=AN{c`^~1x3!<!w z&C_qz+@0-hAnkqsz)D@qr@FP>1__Nz^Ead<)W?eX86V)BpW$S%W}!wyK*Zl=T5St0 zCrWVlvlbZKGq|@(GGC`bxi2x}uEVB}ejC}=-L}h(iEZsEuSt*kP?ou8ulJ|v+$nqb z15WjseoKvEUcPPvYjHEX6zi6Ss<&Qt=y=BJE#S>HUOzX(LL~n|ubhH@pXW2asHjgh zRa>?!k*}X>dN%Vy{tNRjvkhuD8VTrTXCB&f_WA9=ddI)1<$rskC0DFFvSR;&f0I(W zHu4DMc<kjVuyZ+aUTA0YAD#2d-Rs(ZaetBi#ryZzB*!c9K^IwG%TC*o66p^O&(o^S zi}D0wj9%<K#uLW-t6tKFMc7tNkALnb-CZ-!h~L$zpZ(*>%`{OzJwFv?4~6>{9f2=O zZ{_mo%?*6u6g8*$bm`XYJCc?&n$;HzwQC={smCMdezDiL?`Hh;_fp5-T+ct3ugRv= zu~lht@b%ZG615VwA2+^@dCg{C`Rhmd+u8Rvm%QEmCyA&0Pdabn!Kq!xdtG(6MD6<Z z<zAp{b!6)GU7y)gj!s`O<)ipy+1--$svMF6x(ZPzGIByY#V#FXi8$^qbN*`cn?={& zE2=s8G|XTybae80a5kOYU149NNyY9S&Kl!K845?4?(LklQu~d~1g}2hQ<kl-%BHwY znR8_+^DcGs?oe+~7MQTmDr1wC!HtFTCZ2`{5#H@_>rDL8Kga1Uaq?&_yMF%D+NI9* zT2m%)B`Qi<OsrCjJn6=4s28MoA?0`D!A)XIoNg|0TIeTe(%RAy61-G1rLxEUQ&Q8! z@`N*9&IcLSoSnC(U3=1X-ibE~>hC@IFCFB5J9mfwq{;WJCRC>tNYobp|6D%f_x(Nc z0%7weeEl?k`2(|`=O@2U{eHb@^7j(n$Bf-8CM~RYsE^qB`|ty05R_VNw`k%UWhJSO zhhY8`XL;KrfyvbkTJz3dbm?0@E2#RO)|#|eT-M)D7q+nqKQHx}(=7Z#u}`MA(p1hT zQdauR+-6N_-}#FtOI&{5xsHAAk@h35JO!D;N+m+mxr<ALs(l=srl=`8sT&@;vo*Q7 zg`?i*riP-Ey`j(|m+Q@Sk96BZdV0T4Fp<0A?JU;I7z%2ip7{8ct6X>PPVv8gnWuId z&a&%$Zr%5H)mgcE?rnT5(s_<jQ$39z^`DAwk9Zv0n{xiq(tpR_*}VEb>uj8Um-|8g zJBPZfHQU@v*EccCJw3Mg^}+vt|9q>ukiNfs{lCriztcWsCLf56x6Qe>Zr9zv8x{nw zZf4!N>3~7+gTUAeC8egdKYkvbnqm9<NZWP!`<qvvH*daOo}Zt0k2i09{&V?fr`a-U z3{C6$4V6sn%6r)B-|zeXH&$x;KL0rjPgg$9xp%X)OtEXiwI}^ve@pk4DMjb}+<IBq zY~GnWmoMwxC`qcfp1Sg##je!)mHYE*Y!lzJnVUDi_WyJD<@LwO-)8^V$hJRp^Xf$| z!F#v=DA%t3@sfdaezWbqzhR4S=jyz8?l$F~tChnXgWH0>f6A`QWho!ua%9Jyn0mPu z*X7ES+&g~F5#PV@xBBC<lyh?V(vQ1-JaMU;kl)Lt_UwY%vSYdj?bg(vx#x2&PNM4S zjx0B}EeHK$+ICGpaAA=_$*RcvCDQ{Ihp<;M<*v#&p1Xac5c|vA^Q%-?<$DiizFnoZ zap}RY9>SW>dR`op%(it&`f?-V`m5zF3{N(GJyP%`f7ezeaaqNfzd>Fb`~LUp$;fnv zFZaqk>2=KG`NhdekxNb7EZ2WtkX@g5?Lqxzf&6WL+BQdL$A7whl6n4)(oajLDP7QU ziuwp`q*k7tCtuRc$&_)=jrZM`D%YI(l}7gu^iDpM)b}#ua`L*L&o18$Nta^3Q2c$< z>(0z~Z}#YZtGRG|kz@|2;kf?i`M<t8?ceuBK2-VhH0fXLKfajY+1Vd|dgq*|-)~k> zR{!kB{gj#wN7tt&2%NWC{&w|=u*L`Kla}05ov=kirS^SjM4a))Dz|UEJGV`+JakD{ z&#P#yI`gSRUXg2Vaqj-D`Jg=A?pv6m+(-H6`xUv*oBmsL_P>?i|NLGp_gfb^t$)=& z>ff#W?`&Y|PyMd?|1W-D{G{j?zx{{vn~huQ@7U#Tdv)43r$&drPAT$TEYoT3{7*7v z-=7$4Y!7d`S<UyX!mi!T>E8^sQuBaXv$gL(C(h(QnQ||?%KqZ<0A7oRCW{7pF}?@s z|M(aZ`68#SpP5_Kbk^{<!v6lh-SPaN?cXG=;CT+7teCL0|Nhqes`Hn&zW>yHE>+L* zuH4jmsZO2L>sQ6MTHL(1P3nd!Yr)&9y%)>Y8YljKDqt6t<U3cfCH(E1Ew&k#4tk%F zJ8RrE)AHKQx$kUVZ~CE=eWsdkrC^Q#mzmJ6qVF;lF8{pQS03tU5Axd2I?a=*@cSis z0W1FJpH6dH|DDCO=%?!Y3F=8Zj*2+d&9&P9*LOvCkW9U-ZN@aSM{Q1(5&FW`MhP(q zF-3yLg|$6O%P#Ti9q`*>x5IA7zP;YekD0EA$6OZ|o3z8_pwO<MtaR&ZdmgW4IrC-7 zRNdMX%c@SxId_i*fC`Ti2mg78JG0N-jDO9w!+EClswr2tzsUCN*|F<y+4^ax*R8(k z7Nd1k#n6b0YrSv1kWJ+C>8HXQ6~r5st#Z&{%r0VWk|}t4@%WP^v4WppRpmkEKo3dW znDipKl4s5Oo)@e4u)Ydv&Db5D{QuH|usM9M&azd??Nx}`@rJ)@{{20bzaRSUOL5z& z89yU_2YXlRbg#4A)`w1<6fS&}UvcoAuXn_ui55G0d%x~pp3hWo{bAXWJvS=?W0g*t z{V_EV>NzuGqJpG{+47?=&4i84UYT<H^s3YiqB*e}O85U^Q9gL$jl|CtH~ZpN%ar!} z&6q#;_yYA8l@(QaIR?_*@!3oNn_iS=bZeR@nPO@!H-j-~+UzO&_8Io>f7;fqt|QLq zU#ny#v%1(z_vdAwIogL$de^(o{r6c?Q2y6l%U^pHejS*ha%{tE4zq9KIS<a*MTka- zMoiTyd(5M1(tfjF@`#@KMp<8(Zo?ms1NTVoyy|sd-uAxyoS;8;2O|pOW8<dO?^?gU zrvB4w#xCVMZOMPWPx$-6FRg2X{6YT&d#-HzM<v%n1G3!nkCt3{S5w6k`*qs0`rR=K zyEXDFclhsfoGf+sa><s5M=zb_RLkMnw%Xw9y_c2yeft<26YuIXD;;ld6WPd?dQQZ$ z`ho7xQ^)yJ6do<Term!S&J~R6=Xj<~n-l%-qI2mI-{qoz``yn<gdblftiF1}mfIQE z+9T)wp4GbKP$sXa^ZMWKE<gD3<Mi}j*QZ{YSl=gL6S_`DUNJAgChx+}5ARjWBuox8 zExB<}R^IE%g*Ey9#v21Ky>OJTy}#_kE8SyzUwx^r4N%Tz7OZ%)cZ0&qAM;MueyUrf z_aa24*Lz=ZhlEP??)z`Pv6npA_op?~<Z*iHk&WB5H<gr~iSz53zG%|EHND-ZcCI<z z{pjcZ85|zd>+c72vQO{)y>d0<PoaeEn^X>5)$#saxg~A0K~aL-|M$l-wn?2$JZoDr zsbz7WVT}HbxpnzbR=e{;v#;LboNe(Ya<k;`)}yO_PvX7Uwg2A#`B$y)mMvM$Ul+8Y zb8_v$iT&O8C+AuGdUJ72pULsnjAzALRWf_{H#u>OuN7&2{ks2p{hPP!$2?_MG!^#k z_bd5&^Yq^I!{wjlne*lLR{wqW`S-zg>2Lo&FPFY1y+N<~{@$H+zrPD#dw;Lw=7(Ls z>kj<bai^sEebKD<cb6~OJyoMCf7&L^9C7*Z+lKPu+*ki4{yDsZ<FER<Lf5z%hU<=O z+}=4&S#EQf>&C#a=aZ(?URXPSYdzb-4F`75IJx7g5MNBphR%aeR>&D2fAWw~I4^e3 zm1D_iukA~`XK$LBciZOjX7T3&aWQWe#i!1-SoHA#({=mnhovRekB65w&G$G{+sVAj zigj(N&pYjnh7+{5_R1WdZQH$R+4a@}-lWq?!V9czN;FTow;btOD>`+v!4&>Ukv_3& z>jN#a9Ne^Iv`V6RmrG23bJ#TGMZiMu=!Mw}oZ7i$JwLZ_-K~3U6!Jpk;`%?@B@=7I z-^TrY^QTMZStCbPil6VoUqvNWThrD?&+dOBmi&9!bZyC^$u1Wjvu^&$-1Fts#jCHw z=kE;N7{B-8mzS&eSx$<r`L<f6`&RDOS#x8;)}-0igBR79PciG4d5f{AMr=pX#<MGH zPjCJc{km+;{~x#etG0gj+QV~4K|g%`V>a~!mlyp0TW;G5tyU=grz&?M0=%Y1My^Sv z|72*peVpFjJ(0o3%GTVrK0B``&-C@}wQoL)wrFyyhWXzOociqe>$I}^E7v|X%ScW( zt=u}%_~$}P8~chGH*%~DD|Q`lHhcH}hiL8270t`}gEor){bP3C(B%2adq!)Hc=Z>2 zk+8HgS)wuRREp+=h!<0GSWfC*ym_5THlrj0c~Q+X?e77sr#N2J+Hc^wx^-sU)Xkgk z<xIHolzGBx9?J`QbL*S>)r}eAgbp;8R&JPfN_YF4{kK_**MHr0edW((_KqytMKv!r zFdtzs6l$s~<|=ED75vHA!I-4tE`3_}-vRy)$^!WfQVZOU%xU_#*-G+oMT27YT<-<} zyPYi|pg#2JtoLtqmQ0e)INs$VvdaDPI_Ku^CJQbkWPDIG*|BjV+xPmaw|V)MB`2+T z`R?hN-q@{DFDb>tYqy2%a%J7l=-;y@r>_XqP1`EubE(cvLXA^Rv;6JUvQ-<GNl%ht zocR1ry3SQYPvv4W<6c+Y?B!uv0WO|hI_eRDZ&>V;PCrcGkl1vt=}2oZ*U`O47CKqV zNb&HhtvjgE?%b?wYT;9A)qlP|w?C;WiY?gd`A<WA#`_FlxS>ANz|n<GE9KvBN$=8{ zW^+fA_3x6JI7A|sa%lZu;CAWGgjBm`83p$aneH+TAFBrW>>rJj%GmxaaBpS!@<lR^ z_q6l#i-88MPaB^$KGp1)v`D6X#ts+GuP5dxB{Eq$J&7pER9whrf9(TvJ!dIM8|zUf zwOxt2LRk@V5pogp7HMb-WgR(^+R>?=e78VNIXBAm{lAs{&z_%XR$6dE%hm0V<<Z2T z2OJhck51I4ItpL1Gk#h)aq7lr8DE9f{$<H*j^BFoasI}GO#;97#O{{5;+%Eio%!xs zFN1KC$LX%~ET8ZlFs!yTjN24g|I}m8+I!J9J8Z2I-TN%2{(JFb#^3JD%PZeYYqoWq z%Q%v@`W3@ImKp3vu07#rT$dJk%b)Mvsf#<7h}b$^`ybjl*KlilujcJ6llHBfd!Bq# zx%auSz5LhS%$IL=g{}?FR?m5~A^mLH8*#Dhz0;obZA)h5D7G@~<T*6Qc~-|%VX^%B zb@u!Yd=s1v4xH!SKb6t`K!5AUh<PvAFEeJHS-CNVwVrh|W1fy&-*3U^QRc^XE$y$r zzVD^2_w{|J_1)%5aL#7BcP7`XL4vKGeK%9xj~^SW3RKpx-!M#f2Z?Q;{War?)nUKc zX7)c6W-x_WX2@K;wZTmO!JCf9yfTF!n=YQJFIxMDPmH}s%XYC-%A=K&?<_jJIV67H zmHl<BI~~@&Jt10qN|i^<Vyo?Pt}+I{Ymb)QjE|5lsO|21wf^oC>1j-0m~=Jh%=Gz7 zw~IVaUz=#YcPYm`J>6E&^rjB04y%sq!=<I-M-PS_2z%4&w?TB(?XI(rxl$B1h+Y(S zm{_l#{BGlksKav-m8S3cxKQ!vp}i+M5APN6ImmzXhv1@PU7DE(rZi~jg)ZU`Z8c<c z4x8f(%3Yt%rWW}`o^TYMAz3Khz2NADqzpq--MBFEOId{}sz!0$FGG|T9!=EcyFB;Y z<NksMImcqJ=Rdu-Z&m!m4290Kp6lOdtDmxh>3}^8Z_X3N)!m#-yVfaZo;O~UkhqL( z*XzZHPYEucv4qi*sj>b=$K|!rlO5Qd`t)CYxb)@3_VZF_SAV&tSh0Iab2(>;hM25K zck8Oe$`>|OoZXW)*n!~D(2%X(aUE6WQdX1N(w<gaT01Gx!SC$$j#E$VcHL>P34CJy zzP`t4LgXwaiJJy%d5rIu$jRoq7%YRp$eXfX?kK2tZkk=Pq0jQ1XllnN26>w$ru9z> z7u4)K@qeX%u5Cq$;+EYqX|*?MzjKzw=016^eNedM_3<~4k_wHMmVf#XV!qFkf9lhR zfg95|b9J1zT6@{-?_!^y23MNdCroxSE4fpjv*g)4P^E3}Ropy($%Q*^i)*K?em3di z4cmt=Uu<^YY<20`v7dpPW%q_zdR=mnPiYm?i(+QKeqDb3&D;EMUbNh`msCzqlG@bx zzeRShpG~Gk_0I2W)|me{oRGfvdgS+CXP<v><~M)yR{dJ)SG(OWzun_q_2%<(M&a_0 zjXPv#ZmvIm`_~L!`}!TbDt~`;?sLoX|0I`NcY$B?v5VfC8{wQ+4du0qPk-TmEPu@P zg?(Y~>d%K}6o&Tgefy*3<Ajo^RPj8OSrR2YyS^I7o8DWyv{Kwya(k_umYi_o9s$D> zM-qxc`e!C@vYy*{z-JFib$-kI?z8#U=j(UneR%(NQ9Q?O?)g)g?**l%_KHMCGDk*! zoah?1t!#z|tIdg1UK6I8PME5w?Hty&h9^?;&^H!a=dfiadu+6m_is2FliByLR^9R5 zmqSe~%YN^${JwOi_O&^DHkm=IZCA+$t)5d*di@|r-@7Z*9vqYVyZZ9AtCp6(U-!Pa zw@A9nrM`pjcuI9p(yf<{eldOzYl1u^Q@|}a&96fL4{6Q%XndpZQ&G~Ml*OkeRz&aJ zzQgpv%2Rtps?Pj7+O#xi>WTu%-7@a7C#Ex;H#t7*k0QABcJiR_8QqhOl3W3o7TkoC zOeuG^2YY(WeE+5T@}--ltD{z5^Sf~*@%*f_^%WMftKWH>xoH3U#lTQna^+&Tg3PNI zr{68({~O@?SGfBB&&#~8d2c+>-T!{p-uL%n_W%9O`MNxRS5C#<TKj~WIVpQ>Z8VN9 zH`RKTHA_3>%6DnG1&h{o)V<xkXx{%v$~P{|F^pUJ{^`DD0u!F|?3B-~|HPiWZi^xN z9<9Tx&wY7OR6qA|r-cej@Zt~4S)4S^g{-;lmc+6)EM)aWv6Xy3gkGnzFd6qv;rKAA zrF_-Rb6fLzO1<U(udBUWJ#Ag>^!O0XNF$xkl@oP!?<vH3t)KQ`b34bHJD-gv7%C<= zC9Ph4!(&#+aT|v1`Vx(%?vGe1IuET5s4_8He)>zsKem^FRZpAi-ECb&p1yn5|AphF zph$G=QMalkR?irB)E?wmV|hur>qFIJmvq%X`{W}Y{A!APW_;O#<&j3h#*8y<cB|K% zw~?O*UY{a*wo~ZCPfwnEX$vOGe>N%ZPB|MJTyihNv@N&DZ~mOx6HR)jtt{#v{`|*3 z|Nh!HvtOw@a=d5Y%y9TxKWEFoKPMA!UAeUN<N2!-8-k{2|85M*St~NPZ2k3~C-o16 zr~iMa`eDC@<KmY#AL?CO`ixu>`e!XYJ7ekjEu9<ZhPnuNo?zG&o%%7LC|2jEca6!( ze@CC3IWz5`#xlNB;uX*AD;aKZ3q&n#wUr3mAsCi^BkQ~LlS4f`I|VH5N;nqPOWLoV zTxjaR9>gPVru*m15yQrHPT^Cpgg)$8u=>Q6V$S6gR*FYg8>u^py_&a8^7*RZ?2<Oc zc9~r-nC*UeR%Tr}_)&7s*4c+w_w>}~J-sci9o;fX(1Yc2rutg;w`uDy_9_*B5DsDO zN<XTkw)XSGH}4L)<Z`KK&jD94OO=k+YpE2nMm^eLa^mr%Wd?GaT3@FvQRaCPx%Tqf z?@7E*B0q;P=KHgMmAz$hf<w~y=NzXa9`i0IES`NN*KY5=z%7qsC)qQlE)!b%`{B2# zu^gvgT+{mWaqmvftvY*G@GpptQR05^bl#~X4-L;Yq1XHkpBH*4>pkf#o@Dd4?D>{! z>MH*AG5ZA*6~l!up5U2cl9PS=U_<=DZmyGes~Y-K*7BWlcm6qr%kxv-owFOOHoku- zl<cg#<=)Cd^VjPPOm~1ou!-;7qt22W>kLF@e6CJteBIqt+Pd)1)Xlq2dxg*8Tr8oI zZ)koaZ>w}}IooWuj8#`ZC4Em(Q3-Vs?+lVSTKcs<piSde*pJ<t{DgSf9duge{oJ)x zBYeX)?Fkj<vg=NswaVJ-ceZ@Nc6}x8dwR-7^M7l5FMHF=FRSJ<HR#gY%^Y=88s!zU zTGUd*v>z_;%3S$K^lpOBfeEGO)C^}xf!7MGT;kXx+NlxJzby8<$&P<koa>G?tPTp} zzGBpvJvq2OJYhNrcBM|2+Taa>T{l&&&f8y}bJ00gcej-BPF81bFpO51t+F;>x$Iky z24iBzUdt^%m!{0_s=MRFXls;id^sYd?(JMP?h9XBr*j;fJjdx<cZ~TJz2CErws#2r zo>e*hQACfx#}6qTd~S=<&YwIMJzewmCi72M>Q$GRg?T^GWeD?Lv+C)tslEqqFI??X zVYqXBL22wuhGohO{#+s<S9gTIDp}$YbHzt^=8Q$(KuZw|rijHvuAiaj*x1GDKFjUn z8s`4A)oS$|jqH<JWLW~NJw2|cNzdQqtnF#!AhzJj70;7iqSf!Na4fFnJyi1Z`yT^I z+m5}fMCwa;JUk~(dd4CWbcsp(!n3{NCmz&1)?o8_7-8tZoOSWqqK7R79CMb<ju6y$ zw~d+-pctjIX|pw_*<3|2N1adaXB^X$lWyv5QgF)bT;OES{D-&8z4Amz)1!$=odO~& z5(*Z~XKZZuX8mF;;;-_>cuK7H#q$9+y*j@3hij4*cm1i4{$i}4>grN!5$oi|#d^x8 z@xu8Hmo2&&o!3M(91k}Mn=<)HNnoH(Owe9o=EA(dyCo}xnFB*MKDe3bu6JhZ<R@>o z`HCNoTYfvgk)zP%!?AWgL7~2%hjY#)vIOLtsat)S5^Qs_X;Sd=Zf?uitzYkal6$*) z(p1i(mJi<!FUjo{sy|;Gq9q-6MrP;9zmpAr&R5@SbSNy4b<zrx*F`5a&x#+N(e|i< z(bPUnWs!<-wZn>3_C?Aq9hY~#Y-rK4+@rBaW6z3RaZ}EH?pAX?8uIV8q1e}VCLKu! z_Oz?`wVr)GeNz9?0}u7CJm|IIQY|T5zBr)h$Q|iDp3kc6EV9kpBj>)Z-<q#^<oLGY zwbIFVFCE{XegDh6rP=qNiYIScF20d9OtE(LRY|_{Cp`4KeqXL(n!qDxw~S$5)GPnR zcSA%h4Q8d9-kbdU)RA>k{+C}a%GHw>d#`t9c3i}a8C<*Oubw$;s!qzUPfIsO@hv#K zKKa{fv+6&+nr@reJi=5aEzR86(c^f&UV81Z4SVIUPfcDoGm*!O{p;4>VPY}7{1Q%S zA3j`ET=Jjc2zZ&=<=}@alg*sc1;6Z1DEH^Pyv*jh<o_u`c{v>k#YRe%d6k#A)2#Ua z%(t7N>tr>XP0f66D!h~~WaxEmn!VotZ}6OJXDVjxp7dNPT1O`0bI!-<Q|oI4Bf~!) zuuA)%G}U6wf(X|TofV>tTW>9z<*3?u<9owI9?yUs8dnbg&KA);AJV@@_1O2dQ$kgh zkGJy~CW-Ys1@kXkSr{M?_igj!hmLOzl)o)1^Eh;3LD`I{$KKt(le%u>@4AG>*Ne(5 zBwx1~OJ=6jq`TZ^irwCSOl3;sx4%Cw)~Cg_eyusOmF4IOC0o0PrBkB6w_L578<o9b zeuwW-t3GqPk{JPARoaC;e_U^rr0>aDv0LugJ@px4imtCpD=t6zIqPSUmD5@_%MaU@ ze%+=z(^Ro9=-EH9Tip?oyJq*kQ+v4h317w&1tIGNmDjdH3ZL0K*NFX0XA-}@d_{w3 zy&bb1v)$qiLI=}D;xz7iF8&}1gTE)Y{gRvbDQCCoZLQ$N5swU83YuW>_vE%6!ad)_ zFBzL%%h7f2t0-u45#Rl$`cBQiKE4Zv?sI=WJbG(q%-<Qin^Z%eb7oH2mhE<MmyA=) zwAV!!?(Nop0180q39h2`af`mrcD_`)CTsnjb7$Wqly@+lXt}G%rNX~$Y2(ArM@OIR zJCw_RE?;lPs%a`S)%e5C%z1pe^P|x6onpZjFG3y)-m2RARqpU)aM|;a^OMpO*Y5WI z)~33+Emu#O&X9P;bAWA^2~SUh)5)!@Sx;>Cxn`A|gp@vi--v!Gs@KpA2-BY;5)fpu z#4nKbv1k@M#~Z;L;tw8%^1MmiY!T~mO@|>^rD)N-DISv)H5V#Nd}Mf~a^qref^5ub z&YtiW&RW?U{;78`C~>f@xG;h3x#x|_OKvMzt|lMd6!s$Iqo9+s)FI*NTp1qPHx3_n zYHTx^Au);Pz#dUvX5|GA&QbM@EnT@Dv)?y(Pp|22Gnpci;n6&aNpL|xkb*MrvmF9A z*duxl>{Ad@+@RlM;$^Z#Q|$JtdlTB0urP-3^~+~@IB(!v_mt(>>K^WQ8J1d1&u)L4 z$6Gx&Z$GQj5y6Af@>VW0?yUbZS8%!6ven$*K5PtFG3DV2%Qq>GCvUcOb6d*quP;@< zAUC&l(p8(HmIDh#T#eTnx#~36hMwKFi*=)V@+W)$s??UV8Qdy?Gt2uFm%GP{D9fvz z>3W(ld4Yp^j9`n<?hPwbuPjntuwMNJH}_`Ao8HYD3x9l4@N$?kVW!EE^A^)$KXlz( zzyA0Q)0E|oBFxWhRSLCo?25Y=M{-K87x_^C?e^TuQTAN--i202Os>#<@Kx{Vf#~;F zUNvlw_`rAm)!WT}B6|+{tL(YAl<C0h-pegKd%!u0+YFMSg41T6_j#P~;l#B6_X~cM zrXFn1+h4Z5aF(C;;+1LVm-F8^%4%J-W%tUuDOt|F0)O&4E`e6=yw&jg;_uIXwpG2} z<6x)FT}#X635@ECv@0h`8|r=(%vrFQaaOG8rqK7g^PIxcW`UNgm_BTgJj54wV!zE( z3%f+K{fB>~mA_qRR^)T~nfZyuQNr3;inSaXoV;4cjhgogtb5dcj@6hq?VfR_^^GG1 zK5A^eCnu)<xx3eFmXCVhvlIS5FMDl1yx+FE{>qxpT&WMHOE+uRzY3mxS@96B>dN5% zueOwy%7rbj+k9JIz{s{J^V^D|CsK143zsd4oc8T=#?eU^1T)(^9<I8!(!2Fe<Yqy` zCq29DEjWG!pP!ib+_<?X;8yxF33el;?$-7@^QMYMvDk6cH2o5gf7}sLovB-XV*Br2 zzyBti_DR*Bv3X$IdE}`6lvA6&2L*E&?W?`IqEy56_r4Vwt8DH3!p;4c_iW%^_Df@4 z2SfRn1(7xruCBdW6mW^7MEdNn4^t*=F!BqRzr1y($Ky41RbqPP6?*2<hWt}HRd}5= zjs#>1R4|ztE%!G*>?gyhno*$nd2%Z&x84z<kCS(BuVjDruAVXf<HOjKn$p#?_Vwx> zOZqh}XO-yovqdb@FESk7e928N{k3i5-!HkHUKeNVYh8b{^w+k=m(lZIl(-!Fk}J8` zqrPB+RqgGD^GCkuF3T7Ek?_k*>*}#Dx}V;L8V5~#d7C$j%kfz9uWb#63w~)N{R*@7 zxt^xPbv|ZYiqhvwpEI9w>&-8TI18Nlw32sys@?9{%g)_)yF24Gq`&=2ZtjL(+0FM& z<Cm~mt?*`_S8sJ4ZMC<d&y-_Qi%dk+xQs4e-(>BOx9ezf)2c%CRic8?i__Ht=NVp@ zYj<g0%EUIwWrydm&*eP%)Q;`g-OfD<-^?U3+kX71_ltj5xgn1A)?L5-d+!L{yWPAz z^mXa1z$(E#vZAw{Ub#lF{;7!HI_vG{WiH(<HW#B5yQXf7UhzTfA+LS?1I~q?KL?t> zzk6%xinRL6Yn9(=Y`OV3U+2qQw^{F1dQ&_+nPxe+>m_-eso6FA)zljj+B)AOS6^1# zQXAJ3`&aw(Q7$9LX**6FFMXoE$V(&c+SjVwtGngH6hHScO;UM(#j5x6ngeHiPgKjD z+&uH0&5Y!-{HP+UNz%!)L+7-sM<260z0&*lkICyFde?^(Ej#x+Vr^e|`o5ggyWX;M ze`@kmy2hVnFQLQ5v*@VZMcJU>lMd-`xyzsbnz5ny&WbXZ)RRv?=vN)*|NqQMNc`W) zz(qpGn2Td#t!73Y+;=!pbJoX4zj(Ynt2|5p_Ocz8t`j@L=G*h?SX}e7Gq>ixb6${G zEfysu@S3sh-44;B`q@|9W_Zl&o!Mm{{Y_Z#-p9!D<425or%x#6VYz?(7w@vY0rwkU zS5KHBu>O6P-Pc<Fy^X*6e(A~XsGj)eMheIN^rr6D)9gPzVlSBW{fK=*i+<<F%hPJg zKiFJre|+U;{QdohGnbjqiOdt4@!Y>4AgQ>w#$xS~8wV@@-PIRMzA`7cek)H?dgN81 zb)sV4x(}<i`d---oL&0r^JM>PY;!Jd=jQyX-<f}`!Ps8N>f)V;795sG<yHI7r#^al z{@WW5b*5jJWP}wzEK^ikVJA3^?{%N5(<UXC_fK>#b95F6-LjhTZ1!qX*TiGeF<L&; zd_q^6t!^-zl`~J(S>%?F|B(-d?f2@x)m*HSH|~{pacy}c%(Loj)Y{!P{<}*IpKvWI zZ_(zMIepK;#GL;QNz?PPoWuVw+*x9>{H$o@wzOj%62B&|u>aulGGvK?{~AHn#gg&c zxkBY{H2A*SdCMwJF3aTn)u`poIZP4}d(uizKWCU>w$A%<-_tGei%gr{_;e3HI<Gu$ zfBp4ju^`@CyCz@zJ=^S0#Ud@yO)obF&Wd=uym#hW`^o%C-CXylEvkMw%jX{Zuf^M) zkLt<_rRyxYe}CztKGW$E(|+!VdsLmZH#qi9kY{-D|Fe(0!>;ZLTi<ngd*O^3@uvKW z9EYEMpH;fkrEX?W*tI8HSKs~RS{~1rFR!?M{^m*7)anZ=Eq(=Y8a$9#8tQgi;iv~! z@*V#!!Cx6)E>?cO`1{nHyQ{g<+J2~=v)B<b=S*aeQ_+QGhg=n-t?!g-itYS%$l`sZ zfc~60+u!srblrCSSf`3aiPGJL7i?!$ylP*}y(@o`Uh|}WGluJIWfLtsn)*}Poxho< zxik58I&PZ(;f?sjdik9P7jk-gA5xsMxV)>m=z?h7E$1{zhTneGKOE`;e!H%z>=s!* zbM?;C!qOW>BDp?ZJ6dbF^YTK!Ddz9G-^xq8@t2a8zNW1IB+_Wb&li0^8~deI6uh^& z=sdfB@<D5lP1oYR3-+$LaXNqhZ!zT?K?0`>UQGDA=l7<2O55gGcI?|*Z(+<X6zO8{ z&EuQGY12zjw@!X*%W=#5;Tu+4k5#TEQERi-i@N`NF?UX@|L$eIEl=W?S<O&8vf0Y$ zY|iD(m&;=P=A^K6#b$_bi0$n?<&mRo^-uMqs)m(@RdtqAN}BzJ>8=5~GcTQ3t8e5h zvhan9;KPHPysLU&Ji8QFB&~Dq&7^wn<GvH^x??KJ^{!0cu^{hA>*KanX35{DxWDJn z`!QW;M?n6SBd>Jzj;AqK|M5`Vl<RM_UsvUw`Q9+K{mPrWPrfOAew{gO+ppPi^~#%f zcNN9GeKzH0^_)$u%qE}Dd0vTi;@+^d%Kg?a%|uQ%ZuU*HcfWqkYrw5n$+ab1Ve=fH z^Yv`oZMVEQv-L#8Z^v$~xfcG@=Pz7sxK}>vSWc2q;*8g_K395OcB}5_h-077V))~+ ziKXw&fMW?KB(lQRq%A!?x!$ve^Hi{0)1wJCKV2gO=LO6&SmJb+Nib+(+QKx?<&n?d z-g3?T{Mm0&zWA)C@k00i?3=YUo0DN>q$X=s<GI<d>y@*1DT&&wOcY2D73K?W>J8mv zr<!hfh?Vd1(odgX?DlK-{GP$PRO?>fOM{)lvtAst+AEgR<1u-@zzu^Jb+`9-=Y8r> zttr|&afYsatHK_aJI^9nSf734oBTTP%x8w(Iw!xjc03FIqb0NBi`A)~BYGt}=Y*b! zf3@}NiT$-fI<|}J<<yTFEjwIqexT;Qbyk5ms}SS%Fh-@O_)UC<)AMF*3_5IGlz#nq zy|QUSpmNlEtD<z~tRr$$W}Fe%>EJ37(7CyC-R*YQmy@=)9m)!p;0UtNt}tKoV)tFG zn@*1dm)(<2b}qhSXX<`s+2ZxLl;7S6sTPv&;jiY)+h3zNceVGW-}RT&@9y8e{{5}( z;qiHV6O@f!JH$-+T&0$?^~j94P=T2r;(R(pWS#XC#P6-+-u*>DLNo1jYb-xYmAltx zjlxJDwu;A3FJzbb$h*E5S<>$?vtj#VWh><wTRt)$oG$n0Nvu7`zLW>A`Bl#vc<l-{ z+^WiWW5u~!dK-@`SVX^htmb*4{!yxX?d8tEEjc@Ntak-A{AoOr`HwC1)&%i_%7rua zMQe{d{N}mw;W4f$)jNv%KZqICg&WrCPnyoZY=dFl^tcO#b^1$E-OZhk9eb~J?0wN^ zrpMnOowPlqUHRu+Y0a^uA5Wi}=NkPD?fCQQ>{&kt$GOuzo`?5a_8#4HGx&9{ui^Ll z`*T_>wGLKu{Vg`xZPy~&bM1p8SK^~*b5rJSyP2_asr%Zh#VZeFW;#_Kx*QzjYa7cb zwTScWmpvgor@Vi+38YGt?e<KW_$GBxx!Fe}iO2&TI+GTkd~108gp&J2*Y_*#WrZ?o zh6qG1F@3e@W<aRNrqkC8mN;q7YCQ1giQCSv7ZU4zdMg(s&XD@J@aw@ydxzJ}9S_rr zYZe6_TzaC$|3{zwar5_#Jx7XHt<!#3DYf(<ub#QD-;J&-JLXJOZrL2WHYh5T_2F5e zd*vr=9fi+{J-&Nh;Hgyc{?89&er<it{%l8G$2&fSKR&8cZ<H*0nf6VyRpa%Gt=(C7 ze>a5JN31zBleykb_Q2(1(~eD_@I~w6i+zl;S;mI8K0c>a-_6iF*J;e2T9}w2nX+Q$ zpMMQ|jV&^=_j1a7&vNgQP}ZOA@a3FZb1qMokvZepl|5^29$26{IdFl=r5ImJ8<qe4 zXa0ZLzIVP*tJc-f&m0Zk`vboiwC5W;XB%D3xx3LP$yVSV|C58y>fMZ4R`aJnvhZks z!8h|vTe6dB`~PL9&-8jX8eiwUtfaP7`B7BM|CiJFZmwlN{Y)$I--2zYdnVsEDLJnC z#;Wqdjc(WeP_Ba$SxzVZJ#_C&^Go%MzSHeCE#Dk5-*(A&&-HO{w|om#E0>Qkn(?0F z$ED{}R;^4~u$lc?%?Igy2Ny2(uHPIr@f?SqQ=z6r=-zd1dOJ)zOi#aAIB9!>;p5fy zeP(l|^yh7v>iPa%+Z>_qsa|W_oj2AzyZzH~!nD0#BugisUt*Lzf7K5DG@Y8JkQRPR zi<J+woRSWGn`o0?v-(z$G-q9<z3rsbg8h!C51M@PVYx5-s&8$e$`2*ga+~5K9rcFw zHHCb_&7WtS@YcHF{PEZB&Kq_g(y!^-E=kXB54V=;-*Wrx<2H-d)XEovdz)7(|NQ*y zk;%6O>n<DU#W|ixZL!f{ec-t7<Vl-oz1s>;ESqB1+%%ZKy{aU9miQN6Nr}zjeu8YD z|8N@K(BJjbJL?Otu)3&@pSN>Dh<E2zqpDf5QT2+eRI9e$UH$Y@LDJoo{f5as0;}HZ zEZnh3blQazjGmABCmnxo^zlpj_2#pG1QM_R)nXK6%9m1VdL^7VIkNqU^3vpMJ3b1W z{Zsw=ODJnb_Mv<8+DfHQtu}RK+&V#W{$^$2g6OqOW|zeoYb%<)C+RZf?U36N-naj7 z)dZ0RY1`zs)IV8v-SzYB-+4XH7XEk_!Pk(vLwv87=%O{kR+<Ui`o$90l<!Y|7|yS< zT;*<|;ylZoCt`-_ZMtWT-U&&kgKOCRoqiH?4XhGH-tMt}c)!m7&d>kvdd~&zm$gc< zf4^_d^|!jyosvqVr#mfpT_(kTz@%nxUUPJ3?Bd%+2gJ@*)!)eb&{FZN?8A~}{PQ;D zXYOP7f6;Q0bFr}7#kzR)JwG3K=KZbv`hc^`<^3#2jf)`ods@ayh3+Srw@RXRWlnef z)&0jIFJK9y%$)pFt6bwd_X*Xi{yKHnG{`Al(r02@?NalrYW8zlKTkDM4SutWyZe#D z(}=0{8{SNcQ{Lq{rCzwW`Pre&$c07^%`7aE@6QTd9p0+!eAemgDTmFkRzw~UUtn(e zW_i^6dHX##|H&7)FS9uE_}SzuYihE?I2<MZ#BIKB+<Un}N>V28p{v6FrCTFjZkgi7 z?DtqmOzyPH`jh-`-lqn>4AJFS^p#0rR@_3#S$p;=<yClh1ms_twdkfqz0wm~7lyp$ z+1HI0tbBKC)hVL`V&}v2H+RQz8*N(>lu&m>I?Eu-AV*9*H1FY-<K9(QUpICvdbi-6 z%0{alEgR)E44L?%wNf5@xpw;J6uGSxQzx26#Ls%@G`&+#*twMFYWZ7^y)q{PHtgFH zwyE>ogHL)nhDIjG-v$@E<XZh&WqYZ<&v&c($Ad{HuGC*QmYclc!rxO9k4|RZlswI3 zlI+R86!%T(*0&CAxwU8AG?(*5E(#Bsb{<qSIXe4GM{aI`;oZkS?knt*wB>W@pL~qb zqGx(ho&TCR@BUb)w6|e-92d{#dYfC_43i0yj_I0{BfYP=eZ$j&nA7|kw^im>N%wsG z@~Hlg<@KeT@A1PcMAZ6_(>2j4V4aG*kHg*b5#P-l%U3hMKC0ScF8^WHnG3S|@Az8o zTd)75ymRO7eQqDRS@+dPXg2BF|M=zXY1}jEU5HPvCxe;xjt$Ol4ELNC`@O?KUN`Pn zK;C0To2YF*(`0vkldk{C+<E!W{fXj6pPh{3wSILR-g}qN5~H$9H$+r+>y92rs_Xt% zRm`^Cdat9^yvqH+>v*S%&y4!r_jmT4kKozA=g%_VW&61%#_!u1sre*!6I1EGxutbq z8T><-Bp+8D`f|WpyS~<wPw9reyRmzJ)K|A)L5HS{EGMoHFEv-X9bY%$gZHUyF)caf zm0c5_-BY=EcF}BCb8Ycw#pbis_KTlwTU9lKG0{j`>A=;SFN#cyrKD9QosZ|JGBA98 zv2r8dtx&zUUaq^DKD>}9@RF@r!!l>K?)9WSoEG<D_}}wQPoEMN>R3^~S<WwIk5s?f zpL47BJ~UwrIP>@1<%0?PAeGlMZ{gm?g+jCaOzxhsJIR%5TOap((d8_;?~fkz-gB(@ z%)b8LgSAI{zHrKmeb$-f+ZGq?_%7b7Ax21DuB0`5t=g3o37Zew_H{95ZomDh%V$Cl z=eDmgj%EtdHfB0A1Q_jqu-Cgt3w8H09%b<rVwE~8bXI8j!F!x9r_AA8aObM~m6ERu z(<&U}XMXs<R_)or%z$gn5ti5Zr$@wOUz>egATmaB)AN+|+iyv?bn%2wG>@%unmqmV zlgFRePby(pXMMY1F0U%jhL*MM<(aa&Nt+C3Xs>m9>(O9w{LcO<4Lem<>u>zaTtAg# z;kPx58Rn=Zt?KwvH0??A=JOH<O`qPW-ei7o^_5o~`iHtdyeo7`J$vV+&V&Nz@|b$| z^$RWeEWa8b`5~Vw6!ZCiOv>~#@zXlLZ?DkQ>r(A?{2=yzz0u5gUcEEI7mr+BVsNs% zbJg6it$Z&V_7yyi&}UowC9dUn=iZJlBGnJS*H0}^FTCh~o#$@!E}>tywk-I(C_F!O zud+tMm!%PM-Z?@6O%>5hf`$<t3p)=o`M3%*w?x!zIh3fgJa7NouUXHJi~k8c*v`ZH zIFrNnfzI5FcLir`t%O87XVouSv_Q$9@xzqk`5qxES^qj`>8x<@wA`X5e0q+*UZ>}Q zrQQ!M_gtvA3Hz|!{{7RtGvj04SjEjc7FCn;PnUHQJLj^E0)`r3TXXDsTRRvtMEsIH zMZa$JI59zfo6<?Hb5@JiJz3zoLVJa_g=f#ECJ-$C1>%D64wlLH!s-RpB6K;|o<5`B zTHLCfd1&F6qfh@_Ui#+P(>ptR)7L+caKBK$t*Kke;?A>TISz#s2JxikAB;!z-^dC$ z^elAPY8vvhZs*Pe(PHP8ajyNOzdTb%l~G6E@U+z1hXP_1TiO{8^?ehte{fNbNuzuV zJNpt>PpRw=`c@^9&eQd$I)^vyGJRP7^ZKIJK>I|_o`C)FWrzNr`+cn5LxTTI;ntPb zn|%))ub*4>)M|mve=UZax5UlWP1e7;aCTe61eO;`;;p+hR+Zf@nJ6Bu6}z=g=g-U4 zzjA+_tu@T}V6%N!cJS6$_7ne4YfQEEHTnH=_UfB@)ywUYdRKmW|1>*yIs5nR*EWP^ zUyJI^I{ZHUyn)@1{}bD1R@!e-yIdWYrRjR?`pl>rm2fMS`bXi9_C>sTG%IV{y9l+7 zavi^OI;;H8U7Fo&R>s=<N9@<$hLBq0(2d<GFO~KeKbWJqE8Ayhj?0%b>y?hL<Bh#* zv{>CQC0f+%^h8k$r8mDCTicc2u0DU$X-?wT>$XlZC9UFzw^V(7)~Yp&hw1wdizm$f z&Pf~DL<8NtW=t*)>i$u`!s*=ck{>QVKAtd}8>RE<vhSkK2c0i;CP)P@;+j~jk$pPi zx1+z2DT|GTb@AHApYI=8@NBWQ+lr@cx4c)VD9sewsK;_`-sd9qD=|{C?`@YHTw$7h z;`ZOuyU*X9eLMdqldk(4F3t=?30uKHX(wI#E3c{@dOyuIz4G_n+t~kXyixUeQ~n+_ zJAd&)$>dTiz74AGfBIKerzM`7I`^oLghP{R-Maptk*@=n1WerKdp$>zfqkasY@Qqa z5&SJuAv_%7mdOc?HouKeEr0T<^Ax9}WvZz6$%aWh%YV4({h6&fZOenI?H7__UOs#G zYgWV>+i#oSUC7z&fARg(<L?W%OsVSjzfgZ5vtNRFt)7kJp(P#3Z1JAS(|8^#Z<qKh zAmg&f$)_>c+AXnBc$W0bPJ>Xp6Vrn`mk2A)+b4H+*ClzUQ!Rn_Z?|&soqRg`?T1rk z9%);YCh)S>O-d|#THu*<P={H6hW0TIf!0vJ#G?;O)-9Pjy})ap@3REi^3`73**J8r zsm#r<S1LN?VxBrVpgwtu{4uX*oVCx@rPGQQPO*_FV>tgu-%0rHmrV?YP6s(y{i>Jr z1%&hjB)Dq4vT@?f?Qpc`Xqcs47vN~Gu~FXVR?FYxm4EN={Mn}V;7h`>RUBex)1Rhn zcrGxd=wO-JT^r4FePThye=qGQHa>dNGNDX*?i}ZXto1t#S~uITI1tEs>?FISntVWG zqo%<*>l14Z#N<qW{YHOjS+%(HY_*eKA4_kz$>ekT&za`4ziBi30jXW_CJ|0weJ2>? zznXsi*JuBh2JX9x=Nv@bYiqaZoy;$|<k`a`p5SMA?}(!Qn+x-ulg*N@g>vY+t>-+I zed?{IzSY*K<-*TxH5Zq+EdQe4sUP`uN`$&jvH#8Y|K7e^b$_oy{O#xUx$$M@8sB%Y z>_}g~H|p!2yZ3mxH}pkZ(=pJUylAQTk?F5^8RhG5ZerB6n=iKiaG*g{%`=Je|2O~r z`C27BeV_N7i_?scT4ruNFV%7RO=azcNyp+`JU;N$b$VE4>TKt*NJ%wHFo-SB&)@ww zf4`>stM{o!N#Sa<vR~VKpYr_tVZxtNg-_XimDgF;{NPpWnZq0Qs4YrtLt4!-Bd*eG ze3olYW^CViz5ekA#l>HoCdY+D@pMjhPC6&H<^CP-4+h6p1hyG6xy8E0x;39Wvf#RB zLBaaMqBA|VDKAnFMa@&ro}SEPmBrJ$E-1LVphwY@>4DS<*X_mSm6fH%o$FRNtn+^I zDcL~lzRB(zS<MFy$)=uYonF$pK>kE?>gN*$C(2(>6qG$9w^O~|S-&ez<fzyJao6RY ze!_Fp1m~!!eM;@CYOuKPx5@OzypLLQk9~9%mSI-9yX*W+ll}DxTa*ItFfHpyTKUAk z?f2{BJzw(peQjoE^?9$(4oY3XSia0sR8Yb2xV21p+pNSXFV3$_>(f%!E)18+&x~HH zxtDFhG%KAwFFf1ge*cR8UjO04_WM)r*SBX!q!tBO*&O&Pe)2Kfsa^Hz8=b>l#g-i9 zi~H}es4dO@oXgEu4`=YrPmyzWsS<1wd-JQ&a@{ZI&OePA&rVlAlYPH9(b>7!=vKo1 z{^R<cE6+QB>dyP;#8(kfQBd)t{&nt0kIb#J#S6Dd?47*XvmnB3hjI^S(7RseT>0OR zGwfGcdTctPdZOs=jvs*;+wcFsq#kbmWPwe;{gI9-N9Vr$s`mZ<J6Y)uZ{v6U`{cU2 zzViFd>SAxZ`?b4O=jvrne!V(>yJXhozFA+k6*~U=${wS$VfDow*}mS5KWfbP&tC5R z|6}%<q~}#f*O-3HZBIRvuBTPgqThBTGpzn@uD1KvcXM>(Ry>Tq<Gnw1L)VAKIrBbc z&07@C-<ds;QT5h=1%H;BNeQ<9Td*x{0%xhr+lf|h_Wkx*dD8B?*zZFT*6;Nm?&r|w zTUwwo_3Pu)Y{#<})_D{hsrId3FuU){Mc2QJuCldUIpx83Zt>%u=9-CilMA=|pB3Et z@`ZM{jdi`*)p<wQ3-z3y?d<sR?K5W=Z<J)rq?3`S*wy@u9;yWID?IACEOwT)pHXUd zeBh^s&rP?_+f?%AmQ7jwxVXTjBgKtJ_wb`1o%b?Bv#*w!zBn2F<!!2ZFzdNBs&nMz zI}XbwczClvSD*iG#ubbCdZt-5yEe2bsUG<`MQ!ujs=e1v)u#v_*!TNkQ2G0rRaSqt z?5MuJYrdt))~8?d7T>j)w(#laUgkA7r#-x5AMtH(t^Fc<yMF;%YyJPEKH+^-v~>Oz zOF_ZL`?eqV{b<N9SoFqOXV*sAsG^tt<!||xe-^9W<0EwVo3G^Yt?$`qE#`l3`uk&? zN^jvIkrttJ?TO3RnApc0uFp8R_D`(V#5c3|+`4eJK0{C1q^Go9V%N!I0y-(l|NQ1C zTb&n3OXf<v@%c$WJFksNxmc{oEt@q*wmkguk#)<K#Ft&)kC=C)pIzRqu%qVv_Vnt- zuE(QIWcX?ngni9VUXa>bChf6z*_GG41uxupmCUbt_np5dtYg7Ed5-ydr4OFfAK=Nd z+x7U1n<KMUV%d%8LwiBJk>-2dj><o|J?oa<`*br#=hNYbI}2hqrmxQ9vc4q0HD2#+ z{LTA&FR3iC3ySx8mHo`yRsN*wzs&`l@;t=`XC_*ov0Uw=>+ZNq`EIv!xv2BZyO(7x z^!EfT+myplAa#Jh>SE6H^=2nUCp^qxsrRi==I)3MZT$S>lGKNP&ORm)CJ`n#?r!C2 zPBFP*5%)s*SZVDFNl{SKh{w!W*>!@_Y7xmz&!4Q!&ws#iiE)DU6?w1X4+|~6UY(P> z-XP<qb&&evyX?Omk|$qM+P%fh@>?Z)Y-45X&dlJNEYTUy{par8_4a=0MW6dw%RFAn z1lCJkRS!S^{<`J;s1&6FR`I~f1($EGUbxa)v^Y&db>oxQ#wm-VN>0wpc<ovjnk(md zfZgIk{?-%x%OZbrtyfVjy&x*2`s9>j#>uAD5vEO_f2{9a8<4m_IQ-t8bj#AuYa1Ed zwg<UxzrZ_n`Q@AoJ_fo~p=UPdU1H*!cdFC;^puJT^-L~4uBk74Be-Ptn77uy2v_;0 z{a}U8rhOOIpLiagR3vF8s1?K95w8DWOGWO+ES07d7mah%)H5#RJl*l&!Pixp5+d@N zN0)0<+dK3zHJy#>G!`zHHQ9<caE2wj$i)EhMIDPe(i9dQWV7;gF)2)2(ILFu^{ThU z2eq8gBR#(#G1SZ7ZJ1&EX$PZW^ppSIyzP&+ZC5(A%VMd>#OYF%`LCN;tb3eS7oAF+ z=_2;B;P}U7Y#l2FBp-8UZA!fQX2JU>&hG7rI$4@onprQ`Z4uedekwIhTF&(KMDaW+ z*P7J{PuotYYrfwoDd4<$jq~QU50AEfuQ-$Zo1IT^&&d@*If}fW>eX|N{+cd3(N^_i zm6o*ia)Eb>=lENneV!@EH`Q~B>3UV)-M8PAw8ZF4PWwIA-Q6^BnP{!A+n<WV=al8k z403&a%j@p;h<7cUvgqfjof}JY989M~@GiaeXJWsu$fOJMX8tZeRpyI5d>~k>dP!M* zvZzOkjljYC&m|{u_pF>KS6o&9f?xI6gcE<5f4Z92-@GWp(k6T9^vSrUAeqSzXXu#c z_R3Fg-F_<X0&Bs9TDjMUKU(!Sd}RK`ER(JvIEmS_)YUAm{2T+@q@Yi%%$__dtbzs; zc&2hsu$s{Gl|#aQf&B?jh0dF$6FLL-X3Uj8Z)+=*IFqC9{{cm(6t+iu&rNhwtAEnP z`D*rz2DxP6DhF9Fw-*9`m=`e~)k*E%Ju^OYUBCl#<N*)Jc*oC@M60{6L${tgmX`41 z-BszYY&$oGetxj!$yej8b{V@jgloD#d*JbQ_w@;r4+)2HpJ}g{ua{QnEaDk0+wNSO z&n7%KByMiVvRBO)laJMZ$g>yj_`uY3U7m@9H|oU1ritoqQg+S;pLEt(9635UyX(Sf zK@V>s<Mk`7eiiXt4U7Hex;8RjuKDnt_cnVk%-H-xciW^yk;H=4o(Hlgs#Z+B94u(^ z^J(Wl2b04y#0|RU?zYrXS6l4rBQ6ks_-yOzc=I?N7WN4pAMZ_2-shaIRR8n`|GcAi zQ^Zs^J&4L#v+q>u?vHWlS6dIT`fk!lZ~kavvGYXx^9hCJf;Q(jo-RI6aJ+GfOy{}C zHCx!{EP21&DlU*!fbX4W)c0vt_7+pT#CIQhvx?Emakix3gGyVQ1P)s!y(1^NYL8h4 zSDZ2g^@e%kvY+{-H%3YCdc5wW?X>!2`x!H`TI&q1-_+#Xs%&v%`kY_-T@A^fx(xFd z$9J;xEqKj+*<-8bXOWA|IaP}$TwD1ger8K|_T0ArPQt7_o3=0KdMjeplF@QNFytaf zqlwP~)9>x4dz&x!EehqB$*#*0`7bK$o7*l9U%Rh;?HwEe^BA3&Pnp`;>~U`RBzsY} zewxMFgZp1xNS&Y?&$VAOf}MB&>HTctPkO$GG)3|3dec(f{k`}91OvGlkF$cy(`Gk( zx2;$m88EM2v?1qh_iSN_&rI8|?dr<g=KWG=!ER6SN=Mhd;o(#GzTMvTcUj5RU(#MP z{P*wFXXBmsJghu-RoGwkPxp;BtXbZfW?x$zS#qNO-pc+R$<ObfPXF)6|1N)R;_7Q_ zwn|-HcK`gLs7K2)?SA}Uds8#Uetmhr(&dHOy`K})?k%_IE1ln8A2Z!5@8yIeb{oHM z{v+FR^c?fuD=~MCWRq+K&eqN8yk-36dD@lTE;pF@ep*k8I(Pf-%578p!nasw&ht(V z`Toad;kMkHey{e_e=2mhd}p#(-^SaAH}c<0<A2Ki+stH_&)XpM^V5pg(I1v+`&>@% zJ-?>(j@#$sdbeh#XBs7iJAS`?!AK{sVv%>%UajByFZRtX%{Z||`7hg^%9u%Z0=Xti z>&{LoS-?C0#EsJB=T0v7?>qf(Q(eICgB#}kJa*Ure_E2R%b(!Aq2UqrE=7Mbb8PEN z*7loSb(7!P|5^X%irMmSJ02~(xbIxXOyQMVle|B;zVFccq<`{)tB{ZRhY8)s?L7^f z)K#*!9_yIfI^oT-$d#_wniTY;yxz{fF(Y*DLuU1$hQ$3-+M9RmSK1ITJ8LWVs|^yr z3nL#k7)xfxI7n@__DEi0SaRXzdChv+U808HUHy)(%sbJ{^yz@?XT!>)G76ks-c2jl z&dy8CIP0>gEyz_!WFkx3)36&4dJG+=Xgdgr80&1v(PQ#xTolx>cZHAX#%3wzCev80 zgKsu3<Y&1fIA#9y_Ls-AHrLkZIWS*bbL6hB_VI9Mrqwqdf4{3&pf)RS%8#?_Zmllg zRIl*QZuayOb03~r+IVY!bL5+yXVckVu2SROk^Wr$zG_SUQr}I7%8#G9=*Yro{v~KJ z8xzNlh2qx&RAw)dbjo|N^xZxG-0t^I&I*d=Q`nb%Z+o|kZSVX0>_45fE3X(iM3wkx z*K!8-_Sx9It@N3fcxu`G`lEJ@g_A$$HTdmpI9z_cp8rhYUx!=a^EbCf^f`w#ulo=a z{(DDM{`T)rc71E8K9siGboZNc(Os|J-)}nj&OC3M^VZ3JZ~t9<cR%KCOr7(|$<oiW zYZvV<af#`^l3hGG{r-~O$%}R#Ss*o;&GZ7pD&FIwMb^vSFt1A!C^nPau$*UQtMiT- z8}enc)FcCpHs*NMe_?;L>3qiGiRX?s*A{&Iw((o@T}3|TI}7f;uh^gP!CiTmvzzh1 z;v--7eSdIp6MsiyWN`bMl_%q}wRlV8nU~f+5WMC1JZy#aKmSyVe<oL#UzwM&>*L9P z7R!!(nH;rNuJ+HGn{Vb_%DDQ<EA@?^(J9A!?yLDvrx+xA>^>qHZJg{<?{oU;m5V2? zY-3}aTTsNaa>0eBf;nk#wjW`?G5hNO)IWbOFaE7<xyb8_g>Q-fC)UT1!HMWE{_7d6 zUU2!VNYBlBe`vM8LZ}B{`#GIue&3Ue97>oZ7CnsEymjH}y5ohpX}?-dHrb^lt9}dG zp&EB@zP0K%D+wjm#(>V_L1M-A1<c<>{jZdoX{2pci4v4z5f41cwJ7Cc*t^pDJ9ath zX|tF2>~Ng6UB2W+l+vm=v0W#8Cj4kV8Qr?2d17M54fC|aM<=Q_l^ZUTuKXp!Bdc!g z?(%ifaUZdF#*H$YFV6jbTccB>^XSAQ@~flUQjhR%P&sDaF`xN`Z?En%MW?TGW$T^( z+g|3ei+noY^7y;c@6R?iM~Q8ol_<lx-hJ&$wf=Xt@1Gw3=6pJB{_H57U+LeUX{(%> zu6V|>eJ4{`506;J*Oiuw%w%h?%4Hs3c5CvF1gGHLbIvROeb`v56tREy@%WzAvn(!5 z+0fzt=b>wY=p|usnQ-IwKM!^_+%a8Z&QSHawO*)g_16>Juk;US|NOO-x4q<4x^mv{ z^1DSFW`15)d*XUjnxCaoy{TGx5#ziI>2Ll{P+z)7)a=wF!Ee!zdLE^goW66SU3>cE z178>9ep%Jv<gfOohI{_{qFISExz|>2E4{vS*>&?ju@+yyEqnJ&Hf%+qnv6Eb^!J|E z^JJp;nTN%FssHNm!aw(glzvjmL4V6f#d(_-T5q1&XL-nyweC)|B0sNp%e3Oc?@MZ3 zmS2&c9HCYz7yM9gPmrIE-iI9rrz`!~&HwZG51m-gnv;r^3H8677kqeeOgQA*j5n^W zTTZrE@paq%6t611bW_}|u6&8L^K8G!A1gL@Bs<(q_xh<KA8S+3u)aQzm!(B{|Cy@R zl3o8ZzVB9lG}Gj9WOd<*D@8K32_1X*^&Z`O^#4!xAEvi|4w@eR;GXvR&DI%DwsP&P zGSL;Y{~R)9s_gw2>=*cRjPKuAZC)iVx50oVJ?=8Mt@FM{qnQ~ue_gnK@2TrE*G+f% zea%f4_A^B;%l|K+rKyytR#?Bx^+rZtrn2dm{}qdVteNR!wf&my6bpwhKOLM}Z~IBq z$7I=WiWe<eHDUeBXZ06zwnR5vx+c6zbYmEE7(=g3^fzJipDS~1H-%Y#KG6Md!8dP- zM59@qDIybjc6TiPv8N$#Q-Du#gomZH#h)D4xt)#TnY(_u90{#Cc6>oy#?iW*`V;lp z$37QSTD@yw4{I_{HLIyx<g&7>LVJe7nhDn5-iAM8?q{EQ=R^7o`<ES7yZ&-*JgA@@ z*O>I1eaBoUxg7SXf`)TW{dBlJn=gG{KjX8PGS!MqtDfrY{i!hH|KIcwy%4>~<(#_J zXAc^!h~AlVA?D1kIL|P>^fzk467BB4#JcNmY5nCsd-X)~Ik&c&Rk}Og{3|(n)PC~n z_5{fj_OCC*bBn$I^6a9|@g#YD%PEr>P1ig>?3(g(&E^FY-k+Jd^O}ordimxBmlo>v ztN*;CBwxL3viH25!VgM5Jt_<Lk^JDAFqhxN<g)*h8oA)h@;o}eDpQn?T+T5&QjsWE z;>hlw^rC)+&b~Uk&^>1iN;bYoT3WJkTfCm+T%7}KYj3|;%sZp(Y>e521P=RbeI@04 zMs9DIeT;JRjaql#-sxa;aAu#JOWWC+uX+(%9xWCuQ!iNE_pP~4>xuOI7Y{R+yvhF4 zKb_M*d&Z{tk9PuRTHjJl>|0a#Gxhe&72M_Viu3<Y;Yjytum9EjZZCJNsYST%rf-LS zeA<wm9p9B#-1&Nw*fPe;3wTeTJKZ>0COYwNZ1Oz!O3zOd{3cl2U&{T+I8R3CQ|rBq zNB52QB^<CbuDK+4Q~HS1vi+Vp8>i}g5#4?2#fNT9HgQL;$Ghhw@4K!wWu|F=@iXR` z;(P5QZ!*l3VmP<G^~3q^^+!d#TmKyHf0kplu`VEA<?Q_pGi*6C{_!boc)ri)R#jng z=Nr>wa{D?HYhP&c?-V=!a%03>UaQdc*Rp*T_4BW5TE4n^<QsoaSjDQ#Xk&ld_0u+2 zXPuC^?Yy|HW#iwRgxAVv@77%sKiQMgc40w+US4g+<yG}tqq6v|8oD>It<%!omf!ty ztI~mK4>QYeZe6)#wsW$XP<Bs}#kKF7M0gLMuHjP?oy73$!z%Z$eMO9Nar?YIau#>$ zT#%k-7Io?vOX>>gH@Dt|%wFsEW>dkJJ`U+W-jBQuau{UIT%skJ#Mm}3U(9}eQ%{fI z#*+mHxfUyEh#b-IsOOt}+l0%jS1>MGUa^vE)$QObS;~*<3NJ^jV|l>5)63|W>Xw8p z$D=24Ui#H+Qa@Myq~5f+3Nhu~PyTP!=rj3PB!03vZ?pE&tF=>-zSpdnHYwttp~-Q< z((+%Q^S?}P`g2wJTQ76|_s|VzWVJ4C{=*%8TS1Sl!DxHk_iyX!C+nW7pRxJ#zYC|$ z*YBT|A@N2%LZxC(idRW!ZrAq3b5hmP>r?E$shoSR^kEY7`Qzey5(E$5Qf4r&*mp68 z$L5c;2h&N<2YW0;@78Sa`%~-SvSiKq&p&R={VKA<V%^;B*@Yq<_XI^g=qs`oIX6yx zmZg5?^XLDQ*>Br(tFAMe{#;S1TJcAH^o@j*8|M9tcRoGC*C)MsLE`i|ma94?xt{o> z&G{(Qq%7LiJem3QBNJJ}gn9Gz8cQa`IL(t_h;h2)rxbbW$WwVvKBh0*qvx_5E#Tkv z_uuq?jT-gU59X)7`v3Lmdg(bw`f`}gs{Oy?;kROe(l-A!0_{H@god2>aw<_tQ$^i1 zz_$L%>WS4(YgX2a<r=w$b@#P>_ixLdT@`Ot9^s*O^5m0ntJ&6b7JOJ#kg`Z@fB1=M zyQLqNTZI1M&lNcP;L3X=>!x)FR^G3<ap06($|4!AN!?D@;#yxH+&{zU*p+3P!e1vy zc09hyEO_|%hZ}`EvwUZM&}_Z6aR2+th1-;p4}Qt<pHja&vDxplYDoL9quODczKKs; zogKX_Ui;#<d9v>hEdTN7T4w9oi>EH0S{QA)-s)hp+<v8_C0`VJbe8qZljFJ1?9KBk z`h!*H!pWQNElyz6D@>P_f18yZy*|t~ooj=zSVCOjHJyZWmXBrQGhV(=d%1V_?9aDX z>zm*ASpWa2vE}~VZ|m>H$KSmdSN{I@_k(A{Pcewqdh<_d5EZ`t%fb1Cq6l~WyY^(O z8m)&9lTXxDTK@C6TV3D8J+see`iz%0JD*+^SzrEo?z27(y;NE8_4N-79x=cCxB2hS z*I!?s-u`BSU{GFc>v4{CLN#V<jy&Jzck<wwEB|d5vp)*R{q}uB$%n~*3+ormzPIx9 z9~J%Q4>suZ)!2OXTm4sZPk`T)teLegn%b#bYf4_se=YrQ&5u)0jqCV7F9<ksJm%BH z|GCk|#Ujg8;^iN%k-3<7ROUnYt!D4HT?e=C_}6~xnvnDQsSiZe)dRJzW`%}I`~C}B zYdUMrD)v9ptnurwKDfK;__L@3PhLxX60iTcyH;SQPu9L08<aNczudHHg}PVo<+VOX zrXKzudh>VuqWnkYmWrpB2t0Q_eXw8jz(Xf>lZ_lRrZV2XerlCkQj3J5TXeF@!W(m2 zow;1t&a$iW8BX$fxTv|*qaf#${sRtOuc>ppT5f()vV0%1<jF^2#l6j^e<b|+^W^t; z>uciYzSqB>E@ir}e*c1Vle2yI*V{jM-uT-zXV3amI}&)$oqTdN<6f$tn$MeGQJdFp zy~4M^X#MBO$7+>ZUw;w%q$KXtx!FHch)eR=gdgj-D04miSh={8<)pjOkq1hfKfO3` z@JCj3|28v4+q(<+9!;A4?Tcda#s3lOL$p_=OjuC*WSQ+5>s$4+{xV5Sc+YMz@Aj6% z759JebFw|W9(wJ)+{(3|)fAjdRzw$S$WEQ&{7L)%tko0jCEu-=KWg@%>jqoQuB+;C z@22ENeOq#*ZC1_{p*<@9oqz23d}&)+@Vu8vmoqzi6DlQVHt+u+sB^W=h9fP%HT&(; z1v~t1zs%h8t97!$1(tJcH<#6`OD?@ExXSd^R;eF}B{BDIJ%0T6z^|A7I!nu&ZiTFl z6&3I`{k@T6gWe}z(R{lJe-C#ru{VmG%6+lr+ve}yY5UW)Jr_O_{l0tR6aT`m4c2k* zoLpa}zu5IWhd*xe?@mRHlKE|l8f^<CnvytXtxrqh=u*_kaN!niI%aMn6Mv|5QvD)c zr5SomY5y7+^<wTZELRBlXeg7g;*a6-m;_Jp+*8wTh~7U{pf@{(p~`Z3QDeu=N`svp zH!Ek%o&ND~a+%ztNv_of*82ZNnE$*uu<*ben>)EjXWa>mn!8v`=H97rw~OXSE<IM3 zcUoCfTe9!Mq;-}Lj&=Oo6<D=;O5WNkp3Ipq>L*4`{=M<t4kex`JVrZ|4_x=1cXGRj z=2@Gg8(1o=n)KJ7QsaFZs@eYei*T-0YT%rl84l;_CV9`??qSx@d@)n8=IkC3=9mR8 z!cHfr{(sVFzTV;YDjw$oL(2ron90|a+B+*<eHvy@PceJ!?=WXh#udR=-~CUn(1=w# zp}4GxAz!L~S<{m$m!_2pGq@&wK9;EE(RZtPrNYk~{$)*1<|j4C%UXzB2zGpQSaP1c zlidWr@A7Z!zNh&1@Ro0wx9=B^jI+_E70y1VRnJfRE0TF<c`yILtm{|1A9w$BwMi@L z{0*6&+MyrMbpbXx_0y|uyI$7Sdmr;8^pYpduD@@8;zN1zkHcqt$`2Gdh?wtZU{`sc z5w^2nl3rtO?pi@fqZ<p7kEA?!KC9EsljVK*&Jz(wmdJX};1HkB%V+s~H<OwDwlJa9 z&fU&6n>JYdUr_qLzUE}qjoY6L6W;`7q(<+lzWVp=a(*S-iJHp-A8C2L-V@&L7o)ah z+S^mpeI5nZ7tPxuaQTqNoGfSC@T`IdHj|C)AC^umja_SY{^9QlOFs)=%s-UPU);Sd zZ`ag?rp7y0X=N|hSg>>A=7(pNYCdm_I()Nb)AMxklJ9j{(f^Ygt$ugczqxlI_WFYF zf2+mJd1CJxP0kPbb!p{{7`C(hU$^A!vyWzQb1N~Ze)3vnVp?7Oq1M@NtEQFD_&;I8 z&qi)@2gO6Jv+tO4iRUrs-8t|q#_J{Hjz<q<P1el@FTTu82yoxDbmeB}m^P*cA-}HX z_%^M{8~QjBpIm<Wd1rCVN~gsxHD#Us`#*@pbq5tHa^2&3RCAW|OW%zn6M6M4JsXp) z%62?q*>-l4VQK2gm0j8OemkDEWcx+@v05iw3CjMnxpwSf5mCBv+Ph|h=FDYcx+T+1 zdV0--#4i*u=H_!}=<mpA>rT75xaITb4`OFUzPhaZ`8svancNrGe1D5}r+m%Zd-;vm z1J*@zS;b2>J_%wu6Xrcx$%Eq(pJP;fm7JlI^R3$1hvrF6bo}ht>D;4IAH2h~-MnO$ z?pCgU5B%qGZQUg_XJ7IB=C{53bvE?$zVEGU5=?t?f>9&w$(n7ElQi{XuGS}C|FrL; zypV->nD~dqJ<y`6wG2{JiP&At<dtdtbF!fRuZI)+rMs_$^O+k##nh6Jn-g;WP5Q$h zc=P`BZKkue-o%>Ct)JGmwAp)~z~|}AW$jtc>%`uyO%VP6W@`G!#^mOl<#}s;O>N#? z*(K}1y7lp<f(6MXUVIU&-^t6rXTRnz_eVbAVTiy6!<o<HoIYN=bJO1W?9zUA*SNKP zW+HQT{kXj5`kjgTaUWMSSboYjE&BQ(Y<kZn;Zu*NzK+^5GcKjLpkfDGeNM(^lk|(F zZ!i2g9k$uz)5)leOPuMMDb3>PnPInLeniglo1J*?QEtTBsSlDeUa9>mGc0`^FLeKn zt!my0hJ#XfCNLgUPTsqI4lB<kS5}Mr432Cc7Koi(?tfql=j6Y|ef={IeBAsqJJo36 ztj@3N5*#CZgt?_OXI0$GxNcoA>qTV!-0(ENIcJrkd79MEx>&rDRGMcp`FYtxPh*Q( z-nCOBzH!?GKef+P+jsY2P(skw>lb98lZUInd06Z4RSC)WgeI)1{B|mXD|_DBJ2zFV zqgGyZO+OHq#N1lduw$j~B5s-44R5m(mKWAsWI5j8vHjgN#*KfO7mIdwi5o0ER6q04 z^6BZyuc|X1-JD|S6cu~3i${8g@!6FfCues)<2yceVVZ=hnbNg0fvH=f0{Q$lSIn#P zH(K$d;U8?`nA>Nj%oINUMZzt!fA@BW?Y*A6_`b&{>AL?17B=Tut+W07i1WN-OG`%e zv;>Wv>Y6wFHBPoowdPd6>bCiIwqiZ^q?Cj2<vp%!c)34)m#_05iN2Q~UVeSPgXyWq zlKz85Dc9FN;7Q<lxH>=a{>G3)CGX{w5C6Hh{riK|bY;1cs;`Ul%(vTgY*Q+Hp;;!z zb<`q4tEzd427{)}ALSkF{~Id)xWBsRzv6L5e|AuZ>c+4w7q8#Ykg?+~PFZ2^Dqd<( zRj-}%<=ZVu1(l{0mx>K<Can{=`^0%)r9=IXddmmw8v2Ub_FvkMsEP|Rtn7V!Y+q37 z{d@C5!!0hzR2`B?v)lF9wA=H+qIc|Rc9K_L-97&JbyrHol#@rKJ_^Oz{1e($H6f;W z%JvT{Li0^TEp&Zu8I^gh%HG8Okk#jQ^^xrs_My4;UE9;2{ZUxc^hU^ky5F*})D=7b z-B~(6ZbRDg$Nw^S&wh4PIt@A<{#xr*!|YtG^V2n5)_GT!KHueIFmFQL_x$qkzwcOQ zl+24bQ{tMUeB!BwP)ySMchCNOdv%(3=Px(A_}brPrNt+CKYr7Xy`+A3_Wt;<`|s4e zyLTsz<3(S6%a^MsRjg&S(%$KQHx4;tf1?jHZNB<XUY)uB^nZ`9&&WK#S9|k^Bim)C zah^9`$s+yZnug={wK7+~KbdCaVgLWY;iS7Ni@34Ol?&8AJec_XZn~H6x1Ha&8_elB z*_dznJD;zkVe__z&H($Yvi^{QdY2o?%fx!vpCwfPtg`k$^XdCxMOB9&r_J(5+wAwf zEnaj}e|<VL6F+aor!~8ilcG|dI3D-5KD*+xm#jtJHT_v1N)#>~PiRZNse7sNfmw8x z@7?ggrL|i;jN=ciN%>p<ZC~r^T$SkW>qD$R8>HXK+kap}WTI~3Y1wlE4{j|>f2L-* zQ%6yJfpFv}4<pX>s(-)NYIz>xKWXMPY3ph0>@c<#&+O~l@2`)l{k`$wuAYyl&$!7? zpDxL0Td#FUIaF_V(!m$*PtB*s#7$gxD>zTD?TPu*M{c6_yk6l?UKKqRT7SrS#*%A| zp5Y8Tk|LEiE<L$*O{1fx!sidaWK5SWFlsX2T~hKYbH%+tZ%gNCGm<+`d}chX{^{<2 zqo*gO-+lVUypHo)3QODm+d<i{<Zf-#ZI5gI-00}4v)q_9CsMRVXo=#HPp^385~sDK zCvgQZ1u!M49$0K|Bf==sXe-8e@NY@T(_;<K^<!tMCZ_7Yy*uUe<7%VQmmPO(g`byg zTl4MO=3L{<6%Ct|r@xtVslZ$F@4?jLsecY<FXKMuTwf{l<ncd)!Z+5F`}n8tmttI1 zZ}-Fb<%0+JTk=24-1eXHWY0zM^c%)CfqlyR|C}>#diRBI!_V&Idt49qoK4ES`0$+E zq1V4WH)L?{=Hli_Kj)geW%<tA!JmW|+Vfm5cKvR)uC|i*!b3q8+bvwxzt?zO&0Mta ziWbkg6GyhB>6Y6}?l8OceaYv*m)dg|-coN)w2$zvXS_Z&;mb*;_#1KFyTV^J#KiG- z{_6jH@Iz|uiTmq+)jw`HyOzK5yrI|*<}!B0q>3oTUAePv9T8nAb&qYA5A(@L%Vl$e zYqu)$Jmd0zwRf^w)bUg{j&n<Y%-QSf+bZqvqqnC?yo>+$twXmr)Nj6WecxWEfGKH@ zm(1l7PS~-V`}~u7`ztA7eCz5TvRD3T+iW3x)^h!W*}dT>KbcE+f4bO~`62B6is)vS zTg+eoWXR}TKAL}O?tR`pGjbvhuDza9?sp*ms^7hd?ymyu3?0@k@BO|t-Lqs>um8Kv z(OciiiiPLj%H-sA7rP@NcKFN#&x*is5!<*JE&da-SGQ_zX5S-`xTD^sI`glQ&Li8P z{R?tm%<_!6J8#dwKF1yjrfmmnZu#Avr~5gx;IEQoar*PRXKRWV@~}NQedb!7=ETjj zOK)xp_;f*7M=W#q2NvVg0$rM)&be>>Y+iIv`P5T;&*kg2oVR+fJNGa8EzimO>+|$> z{WD^n_i1m4-O4Ac)c47)V*YoqV150UWv$O=<Q~aUPLnpgy`%i*v9#4|zwBCRz?dd& zoW@jX?)IbpePuE4A#K4um-tg%+@~E}a?B`H@i5!HZ-I-KHQn0wO6OfS+tRRYvNI1F z&a^dmxF{rRZSDMTNw0c+uW0FknG4tE*}JMvdw$w^pV$}Cqvx(>J2E=9a4#~Ky*wwB zqrRWPJA9|mhUH6F*Ob=VEnVGLbkaLKU2A86e!Xm+imA`1<@26Q_d1<4$=;%4+ND=Z zx4MW--WU0asr$}eyRB|l7B0?y+c?iM<hNR#;pABiZLcGXSe|tY-g~>&{#p0IWl=Z$ z4?HrNuW!bC{qUI&(ft->vWh+8&vv|f%e2&Ivfa$p^;@Ty9NPQ#NoILaRrcbI*{dgI z${pF@@wZl{^`}UDiq5WvFASGXJy5^!%ucWU_*uVTPuHW#+7I=vbZ&U}b!x_9g?E)z zPCq5*gt$HadNZTuuhi9>8|79x_;vG7T^d^YEos)l>32WIgw=>J1)N_r&9|szQpQcT ztjHBnW+&Pg^y%8w7p_Pamc2WtkM-2m#8s>8=C6KqNA`>MFRO~5?X4X(eY4w7=vRI| z9poN-gNw!g@z1l~MK_ksm=n$@wK<4sb@A7iQ7`#jm4%g0W*AtV2+g;xI$%8Q&F6%u z7h&ECiT7t-VfywmO~LAwNQ2VX*|#L)zH<Ja@1%E*eG)_It}Pm(wv+3xSF0Umw|w1Z z|Ah5HTvpoW{|1lmzIi{9{jlV}Z5L0hFkj`Y9PU&cIqk)CyP}WbMGKD4ozdpbb9yu9 zc{8EAa{eaAADjPC*~>0A)&9f3+3F{aUOikIGw15jvpKI#MIKFg8O`q6S6vsWW+tMT zzw}(R^tQj-{Q6$G3n(0znl;-`^IH8Cx$C#v(@hy9yzA=k?t2<q;Ib-W!y}fMyydFL zuW<hCl*qd}%Pq!@sonQwKj+oGTBUR5d=i<tVB+`K`4u~}&oOwL6-b?%cFtSA<)&Le zPXFd!i4Q;Z#pM{!nLYb(&8_(7+(fzmb?42}e*7w`*pR9EPN@95-1gbW=SEq*id}Xo zvc5pCwcV~a@i<TCnLw|^N9DhMZf5kqpJQ-tLu>l(jlm0!oE2L<`y2EANgG2ZN}l@h zK>Td#q~>WiV~+W)U9{Jwy7ODmg^ypg_iT<o*|F&0?NbjH<~FO%Ensh+y*A2Os_x*y z2YWaV9!zjZ(B)?{|DIrA;Xb8I%u&H*r^A-Ncg#Xm>g`ySZyhS$`Re!5EXyg?ifMBj zt)q{!OI}!GY;|vUf`Gv0b3a=@SiH7*%rmF-SY&$0KkIUq4LqAWRdf!&nZVbOIzxhW zXQrQ>^R9qnfycOg*v|yL-uEWr#D}ke`U~T<3}gkq3cY)-QNgCMHTY4w(4IS!Y97|{ zak_sJ@SCG?e`R@n>u*bed$z6O*Vl`*`R;XZ&sw~yl)bgZ_Rii(ON*nev**ivXIZIm zA<no}IHl#G(Wji6jF~Kwip}<cGOMk`AHI^4lf8DUwKe;6k@vdbHJQv`Z5Dp}Yq#Kt z`qT%HQX=GP7f1)4En?XEanYI0QLlY0o1CA$JTdRy%q^>SUS&A8Dy@Fjw{k0{)BPKj zp2f3gU2NC-eOL48=f*{cvxJvji1>bGeZt3GG9m)oOYFqLZm(ruyZGAFTbv3P%1X_1 zZw20sF5}TV5&c78^WqC%Cl>C1c&zD-rq^lJ-k4P{_-~&|Ge|F-#Bm`!m$P7*&XKn# zDrSFM*CNrrpxf1_uzi8y-!E)`*40nl_sLUsRqcU}+DDgHzWTp2Q13_1tM#>^55Mr( zYfZl-d336s--|!TryQTg#D1*i?e(=QR?6O;b3dr2NAd359=kVu5-PhZA60E$+BHwa zXP-+UhsESRUf-je1gzW3747?G96wQc@HM+<z7><}lWBf-8~Ub%zEJB+G`xRqUevsp z3gNT)NpshRe!p$?WATDVXXfn<(b1m%R*CUs{jY;XdnW38W@`6FJXCt$;jMng`Qbi} zk2#BMZyxKY=%3Qkb$j3ag+Eg3nG9wBNg0d(^hjlk5O>u2oSfKpb7>I6a;5jNSw$-B zM$_M3JyyTJx9)Y==RN)^{XS0L_pC2#3;$a`DLeJYL|NDGdlvIt)w7@S&|Nf`M<GDv z;og8H)k`J#PCUIjVa0z7c^>xn`y+a`vhGgS+MSUSy4_cWaVcZ{vna*)LgHDiPt-QO zvOHgS>CnlLt7)63zFg}YIeF*9WuBf}t0$O5u)lp6_}M3L@z;i&;|n9tXRn!?;(oyS z-);6+cl%bp&f?#hx9;SuEtjnN-kH4e+NSwr&B@}M^<m4O?){kf#O<@fwCGeuL$mW{ z=?M&zx4%fL4|^GYe535MH2n$nf4#ZB&TY8aJYQs|t%iEOw83?qG7cS1)|&QNv+~vy z-a7L0z|YCTbL(==6FMKLyXGjl&h!^4J)`vISX)7kzSlPUw@H#&&lXNgeCHcj+V1`B zvxn60!w1%1d#6ynXJf;xMeX7zRlE6Ycm3LJ_?vabiqo^R?yhTMu;<<o<k;Zt?Nh(; z!S`G)RwIKfXQ%tAvuC|e>e!jlf4Kd%@}-@7j^4Xgqna!2Q!eacC#9_aFlmYOcbmss z+rQb)iZ+`b_;iEh>#PEy-z6K@y8c#t@3Zyp7yTJmrdK@|&wANVE9m|sPUUS^@!E@e zPiyrTd=qbr)vkRy*(&7sMd>1eiVIuvW<NesQU6es{j`6;xeCRzXRW+BFZ$*l7t}F* zo~q#8n7Y!W?EMk->+$j4$DdSP><zorD?MTP%i?=GHXe^@s*V(zrBrD)MI}{s>+PUy zeNBZsZ?_y#Joxj#f~MjF#}2+|3KrS;@<LVJ$Mt+a6imuDItb5P!!&It!}Ax4EX$|= zRTX<+aq#P#dQZz0@o#6H+<fNh)O`{0YxuqEe{Aj$k<IZ~{PMea>HZ~3cIQj(T)%31 zeYgFjEnO2gt~kByf@H_6%rMUi?~8mdy`yg)`(#oX&Y<0vm%(_${^Povi>DP$yX3W8 zMpDtdT+KpWBIL-c&T>o9heir7rWlFM-qo}4*)>Tuxn(x1<>!~wClvp7N?RP8eNDvS z<=#6Q58r(3+p%p%uYT#h|3!yg4*q=_-aBi5Np7vxvYsXJk7`)>_Fu{}z1?f0V*k4M z$JGyc^CiBv<?h@*uhzQsWz?zYR||_Ol$f6?SDDv7cy#i_Hs9~x?v>@uy)9V#>*vb2 z-2aF6$NXrhh<UrdT$Wjt>3>Ci(xW3cW48&PE&SV&`Iu>n-|W3{Valg=Zt8h$xxIW= z_KWR0c3;l&rq9@$*4f+~`-9(F@$358Y<W-Js`fwq=lW>B^u5PxYi#td*>G}wXT4^7 z>F#oG>$D{gZp_$oJx=@OT$j(0#_N|=ADjFv@R6;Qo*{3yP~AzR?$9HpmmeAkY8KaD z_0gGakowlWu!a4JOYzC4XOA9b+`shJd(rBj4X-orT@n31ukif;o#~%e*ajB4uY6iR zW7+iN71wXio#(-u;HGQ-&PVh5m%a}<!6z(I9!Vsht^5|*!Z=}q@~z&*W$W8z1aFHz z@#ax6D_ogp93fME>fg5V1%1Jbp41(??PT4Rom4+#VWMEev8}mIZO0cKs%o3Qb%nus z3EigwnKDd5uQsM-@`t>r{XH*6i?j0olNDEOo6`S@pA&8R>HoXc^2Tg^%S`iGy=$_V zA_I<8|NQZ^@s^%h!P3;l%eu=r?6la~pOh;xo16)Lw&et?zt1U0wmmPvb^lZC&ZUzz zH*7eP8&U7Hk?Bx%bX<6MSyp(9kIdmutE{@O*|w}$ATV=V_|!XBo4fnM($+P<t$6X4 zk*POu^S5InA(fRvo1#7$^;%ngY}7X5JjUesmV;sPP4Cmj_ctsr+WW$kum4KiGV%2( zS%<F)mtV`4T|MF1B;~NKXDc!`xnz|ZX9WgEPTg=?d(oHr`n^Aw#C=+uFZ;F1<3_uu zd*npj1rH|lpUT(T8FC{3)X`q6h+A2jb6Xk0nY}vupC3PPz1Qo!j#sNc*YTP+TMw`B z`nzN5M6Gkl98=$S80aYV1(+n<4P110=9K!Cy>3UA`d>-(Qrr=9CDs1>zR&ko^UHq{ zRnuAVEK|lu&9^qIcZGAk`*oi0#_d`6kLW+zlT~#`pwiA@MMtP+!}HMOXIc{XkKSb9 zyS=aM^a6|b%Pr0uyFFfVG5gxXPyfyyWvw#&RAsnGw`cjR<;x=X&5yGAEmL>;cl@(` zssE4s*<Kuay!E)_((Hec5wV`TroLHn^Ua*4SCZzHAK|QDt*fSeKS#+Rvh!s9sW+xS zKP<KiNdI~2pm=xUm!nBhf4Yy>z3et!zVW7c<Gg=KKX3i)z8a{fzrO8>Pps*$)sI#f z?43FF`83Ysc^*NmYHI9Fn_?37s&$)!yQ8M(FFa3UH*KFZ|NoZ<f2aB^lY7{?=K1^n zE0KHtDHl)Y-+bWbjD#~x$zl?%nyIV1#dqG@V$g3RFA<WkPW*H1iuH~!Uh|q?p1=K+ z4x<udJ#&$JY47{9X|q}+^e)CtOP8J&v25+^S+AweL@KSz^DoLvbxfYTp3V5(=_l%k zWFGVG)|GbeoyC>4ed*>M6QqT-46A<hw|#Y=CsI233a^10pQYvJYp17JRIHSmplqIg z>ga7zQ?~H=A@i=w*M*!+xM9ElPw4^sZm(4<HfYsOjft!0jlZ?rvTBk2ENiLF%NNN! zj^D-`X4}o-D|AOp-&}oZv)9Y+(!2Yub_dvN9{%h%u_eF1^<7EtohQ7^R$0<1uZ%yh z5M0vK{N<5ved}`Gur1%%%9_n`TS^bOtU1W9W%TTzmBKYf$K@{%EP1}+NPB@>TIAiA zJKkhX?)-U1+%d%Cef_gZH}m%Ye9_P$c&Q4!QS*CTbA1KNjQiRR8}AwI7w0+6fA!#m znq99}r~C-KIV16f+3c-r+!h<z&j>5lGiT#_bGdk8_h0ouJ-t73m!Aqq+j63HmBF<f zmg?BfRV8+Zm~}H+o_l^dJ=;G$%RZ;${wb;41LDnIJX(e;jw~n&O{#B*%beSIL_|I- zNA2#lwkOQlr`*oJf6pn-`Rv8PB{2;V<>sm~CQI_~94xbn>0?;R^yA3)jgN|24z2#} zl;fFU(s$&zVbST=Z<C*jZCBCB@vNA2yJkbC_n|!z4|lQrh&kXZvCdm#)gmWHtv%U_ zokv6zw)XM`C4S*sw(WX{SK~Le`h+62__O^h^IF6owsO5sQaxN<vchatR5|+-|63KG zuHWRJA-cxT<h@{d_P)86O6Ql}$nTF_T-q+cbv)}(M#0*$bJfqYrqB6aHqYH7viM9% zYf8qx1r>Gzo43z?FWWSk`B2_kmvr@&-;PZv>s|9e%b}-o+cBAktSs;E+}*T!hgwH{ z`JZU^pKGHI|Lg5Kcy9JirB5+kf4@n*VJX^_8Y6t-%p2#JqHDhyUg$4oa;TU5oBCz? z#dx<0ZvOXeQU|-wztLuxvuXMyZl)Qv*UOI{za4imIfv!8X%}zvw7)YR1%E1ET3=cB zQ~TxD^>%B&A4>SWb`$He(}L;GUwty)YM=7(#RsqY6>4IO%cjh3^h!I%wc1Kz>APb* z%UM2^pWS%l;Hfpso;kgqsvvdvsjHP?OxtVE{dO^a_lwU7etz&FXm?jC-{%vc@u)Ro zHPa_2Pm^|>^6@U;*)X<}dAmZkONRE@rq<v7?oz+xm${m|OY;4G6MyBNKb_Aq?mYI> zdb>7kJ-2@HwEFp5em`e!&%C$MBl7<;+Y6Gr_slZBaOU|*mdxOT2h$RN=%zRGe&?O@ zHR|}PsEA!*WgCu|9{aai>eHWP-0u!3u6#c0qu0-;XJ5`uHgMir!7p1A5T?NSQt(&c z%F-)R3Rw|PcC*@cPgwc&TOhYk%H)fC({DdJb=7{s#O|ZK%VJztf3I)88u({X(3V{$ zXH4F?6koQx@sQ)OwsgP)ovBa4z2B7goxc*Z-hZuN>5CV$D)*=JUES9i-}8Ri0o687 z3nd#a9`^41HUk-*HT>%=XJrNj>-j9&IU!sq^?TceT-WWU(!LY7#PM#KHSwF^xk|kP z1OJ%y$GEP&+jBKXD`L;I-_Nwf>WkWY?kL8ZAAZ^KDlOpfbJx0Zr&4F*lSj7fjkJE7 zbgQcRUB2wLb5;)e#hm=n+kIynueCTBxBl3_mgRHjMzFB6&#^gY{BFsq$d#ueG+!)9 zH&pTGu(7$bYuB^NE1IDmKc4tS|2X&WV7+<abA7G&kbOtP_T9OBB8XAm^!D9(O+pju zOC2Wl%3EFI>3;DoV`IId(BHDv#}>pn+1pLr_oJ|}?!yX(7y2@p(|+amJ?!>(UGvXa zXR*{7-;lq&uNxP}hIN1b!&K6|$5!xGfwLl`)Vk&D^${!uoA-Qw)w_A#E}i#p4~MN5 zRDItqFaAl+M(Dp$NoD`u9Q{u<2>}N!6;i&deysoJ(D(XnRM2`0kJ;`8oliWyIM<~- z>DdtX-7`q!qwbAUKVE%{i3^W<D|R8oCTG67>g*Gddsp2K)}C`<z3S7Js=q5{=J7m{ z;O~EPdw%QMsi$1n+NUaty6ut*yl!*CmNQ;w-s?{*UQhhL&nkNTt<A^P`U_Y;xV3$b z*FWF>JbZe9Mt#K8Y5LN8+M71t&~oG~Ivg>zUAgF^B){FY&5GwAZr*Y$PhNh0%E?Rl zn=)2MrG0o4W}EDD+LL)tUsQOO`hy>~+c&uv*d??$e6W7r(Qx1NUa0M|zJ=4BJ#Q39 zCN2|s9`-`<eTN0>?|D8l(aYC)ztc!Q&2=&Nb*Gh_tl;5KIgj}3*X`ez)-;W=FZF>i zTmHS|zQwE!4D)qg#YLPDw_7{ml76B_>1nxppPqW1yK>3=3fBRt=G09O0tzN<KHukk zdsFpA2jPC6<-6j}P4Rne5pC(+DfR1c!QQJ}$!+@cCeAxEvFVD4^FB43@72o>&itTr z_vcsf-Zj_Nj`x0x{JY}EEtOgIpO|76O;WAgySjVbE%j5b@u9o^tGu#5$9}l+Mp>tq zY5h_yvF^C|6{j3jYq!=Hd#=;7)(*dZz)|UWPyRczr1-<TbJor6jB)r~tLnbyN`G{u zsqd4S^1nYcN{9)%S320tzJt<Mx#(lGY~5<xfO+<x_XTHdynnhrbcKP+>4=yA+h^%b zy)*Nkxld)!TI-O{8f?q0E&d&G_Lw{ClE=!w9;;?2{3+J7`{2obxUkYTCOzcS?t2FR zk9_vuwtQyjT{-_BXDx4UnPk!@Woml)XXBI`<&SPG-n80R?OE~6+AP~p^|`+`ay?{Q z!1eNO%%+ZYPx>9F2wj=DLHS4h(}vV{9C6PoEb`@39IkciSol0B%W%Klr+@9kVz0Jv z=ci3E_iC(ye?M8}-u5cNLg9JycbmQQm5*w^yw2LpA+}*f?IYLPpS2km+PaUnEitsv zn6%6Lcvf`a?UlQ{Eh{{3eivka9`t7W^N#(>O8F8x5+CI>Kh{+o*${JnW|vTjUcJ#Q zXT~GdS1e+8S;_{MhrKn(t)5iU==Jx*hU+~tEAMaDum{%&GKG9~Qw^=GKW^s{RsL|H zVfnQcT@Ut){(1Dc#(wLnS)U&$9hk&?$Du{lb%s^n+mM^*mx~;Y2%9jIL*FUJh_}45 z{IHqE;^ciCwNG}6%$I+cyFBMg<?g7zf9sj}&rCeRd8#fr){Et*^s7I&uC)EJo#CV; zeCz9!hD7t1`SWg>S0~+>e)#p#X^|#}r~B^=Gu$nq>n>EL5wP#v3t7{?5Jj2%X`5tb z`#scA_KQ4q!9skB+PBH)KYTfszWCqQ*Ni_eH-8Tgioc|&9l^3nNqAL}<cSB89!b&9 zj1AwNtiMsFu|6>34X3KVjl`pW@7J;DT$Q@4&BDXA!s$RwS?$)P)sq9Q^W>hTTnU=| z#&YpC4zmYNffu?=zcUxyGK<n*Yo>nih|aTD-V-A=LOTN2Pna}6q2tBzS>kae$z>kG z*Ea>+l{l6#dsoYX7yIj<+eY+;<*{qHhaYA3-u}h;*q#6N2Qz<PH*o#<@qFb5&dCcT z4|f*dt6sQ$vF+VZSHAQ8pZ1no)~uMJ6X4Rd{Kt+z7C*`vy*|I-PvI%vVt?X~-522t zZ=Ef;xt<4|&%Sad<C?_cw0o`kf=v6ToO9XG$i1cTJoC;?f$<Gre<w}*wd1ap&8Zc6 z(`;XVx?A$~=)AZcMG=bis&)Rh{{I(g<k=jv4CLu&sFPO-IQO)aJLTr}4LSh}yq`4d zyzZH&5XO;wB!8z+?;-WYA3k1VZi%du{r&ZI`jm{53+Bz&nep}c^Ey+`H}5zE6pmNA z%gDarxUJ~xf5~)P`dYnNYoqqfR{!oB+aezPqju>HO?A;7)-M)0Hl7u`EKy&-H%{q& zhugAgAJ=QDURjcy^|3c`hUU$kPhF;JP4zk}?#I)~ovB#+_U6j%ebSm=o1f}#-<5mo zjzq`emtV8q_*e8~7CAg=WK_*Q7`yJ1s=boC+Om!N>i*``9G%&8eS_P^c#~^afAOce zE_IsueAh<J5G|L_p@%urj}_>>KY3(bK>bSxGsz|3j*9#BTg<k_E57;udDK>Sku55D z<_`vGw}pbuyo)(q4Q-fmB<>16PddD!<QlWI8)K*Zw&`!1KO`Q0QTHO^p24s5ha5_` zijF4VFy6(laNN>EM)r;5T}5C28^*u9N*i@EB%8Z!7Yl)i-;XvWpU+6tRbLgdGNe9h zUqO<G&fHcP!Lt&VxBRxM4PIFi{q@_#JwdXJrB4_|o|q=bE>y9d+fiUBXqUR^_j489 zxht8YP8@S+Xb^Mwtu*DO!_K1cqDygpSN2VK^P2ljgxr(!Pd?5TKl_HOK53oC>Fs^_ zYdDj|b2d%%eXv1pzr4cnm!W-p*B+O92zz)p)_?u6*CQ^;HqNeKqny6%vWWinG|RxH zUQ2^Mw+cHaz0^_Z$~ZRT(Y&R#<?RLMFWD_PGhJWtLN&veob~MY>ozugFZan4Yg^Xw zmalt?!_JLWD>GS|?wna4bTU-&5!2?FO2LOLeCnk#w>_8la{it1=#k9Z<7b-t`&NfE zJbq`HaD=6vPxz<o^z)wT-P*malKVcz9{2rx^<_Wj)xE1Wh!oCZiHPagJ8^|^*ZHM4 zq<6|I9M=r3ywona&rZtvXOHZ*@>6R*ZrB@~RIqVxu$9mKTlZ!vHfH=uHT{<%x?~gA z&qJM^oG*K9z&<#(LWNx#7NUDC??|ZfA3B-Gpm0>ynbmbO$LmF}&WbtxEYpa8&!#+u zwbdx^^YuSjD=s-sFSce>Wh%FvKFgYMe?1@HzrBecr4DR3S#1(?=-=^Vwf7UxJzB=p z>T`hmdgW=?X`dck{CH$tpQ(R6kI(IOTOGV2HQMbsR;`Hs=V;eqBkb=LdSXWH@j8!s zpE;Y{>nphJ=VZ)tmlbnj(`u>>{CoQOse|Fmv;*=c708+FjC{HzRIqS)`MT!@ET=x( zubxoF)f(|@@v)y--+nYqe`Ld`Tff3U)yD9qy<*f7`<BqAR{uA@wgi=J^p4k=Z*%|m zlxA^1Vd-NgQ)l;h3KjgByMa~AH`Z_mqi^i2W$Q{lv|rlPJNfjyqh}o6-pfhvtdS7) zdN%9KPgV9y7HXWjf@1mCqLm7E{#>HFEaI7~o5x(i4bd6TdlItNU0;5!!>XiYt?h++ zNWWe!eWJ)=@i+E&OhxA~-xEBh=*a(QlQT;@*PD4~4(z<MP|oM1>Acq|55IExraNX! z-u@8JSo6_vp2fGhp2r!_Ec=`AVpgZZY1U2q=eG9!`K!~h^-P5I=ABkoZccJq18Qo` zT&=jJwZZIZZItlw4SQBG?8>_JO~vq5<LUaF*<YkiFexmFHkr7%!@FC5ovz-I*V*R| zpE{fH+2X-lx!n$`A9X^PUk#CZu*x9+#3ROQ4a#RPGu=M6f6YDXTQk%+f@+>bySJ~( z-=uJJ-(DBHwB}hE9JeoM3oeMs(Mj^G*}l2k@A8tjrs8v*4rVW}bNJSC{BOgpE_sE? z8G>h@h}ZA25xy7Y?(VXC^ZX2_;7jYaTKS63<=ElZvfWYF)cR}M;%U6=mwU#UthW!m zyLoO==Cqr!m)$h|b#`_rJdxhg{r?g>JG<y3|Ft{2ZeO<8zw-(6OHFa+P`-;z6^cKe z&wnktX~)g_r+=6qPvtbUobj>z$#biZIgc(F8bA2wWA)f+a=p;;e|{xtk6TOA)uz?H z2uzm0sN-~8_<iJydZjP*dMBP0NZjXrU&!y&_GrIdKVL`Q?8}8sW*R<+#lN^(_H{;E z%zhi@zvJ8QzQQLvMdT~)%3b_9cX4-=X7NtFM|tHlpUetBy?P&ev|_!V)|0p27TQn# zoOa-;jMcaE>};a@F6_TjfBEnF|4y$?$lQ!*N-{pa>QqPOw#dpoqNioF&n~{^ZJ8x} zTIV0jS5ARxl{?og(7KV*sQ>K5?IVH-8gbSS;~ZWEADX#IeyaMc$CnDYZ*YI|*7lwD z;@uq6ti5^xyON7d_^!THf3=?H$@aN|zvF6hugr{;-Q4`?hfs4%)TZdwSN*f<1EY#Q zKK{MyoyeT)rTNy`)pwZ=JQVn1UwDOqb;Zei*>(Hl+XKIuE}4>fYt=N7hf_S?buv7? z(7d$oKnCw7kCbIus?9%dM`Zto^iy9~8*S=LtxkDW<Q=W()*Rr!KJ0{Ysm9L5yN=Zh znK>Cuoafz?v+d~GZ;6}lbx&*l@NiDO?mN@$t>4}>=_YpXPJg@Yk|4WWYIkwWmZ=MM z+mwy}&610qea1-c&FPiStG`{D?ejQV#mta-hH%98BNcTlpX##i+6BBX^N9_wUXU8- z(R2Tn%DLtD?5yI-UN^TNIG_HJYu(P@KWYvu>6uMCJv-a0|I5l9?NvVynMkJ23)K21 zTEnlPs`yAXPj;)|@AGVTwMDm!Ix_MxGTE${uIj`XT(9L)yjtJ7|9bSkvhN!vUp*&1 z|H%}e9iUd}XS?d7jSIx&SAiO&pZ+mVyp`k_74Z16_`#_jnRnBAZv^GXxleEx@V+Ow z>Sg~w3tPjOMV)hfXMZh!A`-W@`i7NN*QNV{yj`t^PY#rsE?u+z{-qfbCs{7ADDQE+ zSb1+5e_`nljru)KTMkb3w0i4jZFPN0N#2cjU$VHed&4$gXG;v-mhohg_=By!0YxuZ zBBQTdoB1}!<IDnc^=nfFt!7nj3NFmv?E139+GO(&<$|v#?p}#rfBfW;jq`g1OF4y~ z8~xW1l;_oN<vXVR^MbqTj9)vd#rR8a7p{0WQT?G;_=y==V*mZC>icK8=bWy2X8*8m zn)82CQyHsAlNJAnbF)URdOgdj_(18hhc~XBGFa84GwTP}<GsZTRXu7KaQ}VeRDWG& z;fHIM7cW)08Mb-W{n_5r#q{jJ4vxo4l8pC`eQsk|v_IwKCds73|9k}*4`=W%w(a?5 za7&w`TdnWgBkp@UE(<MDjhw?>-;@-lbR^=A-&=8)M@Ph0ZS*gge|I)ZaNoTxJn<Hx z^LX<^rgvvwUsrX7G4AWm`h-xWJpmeQN=lCpCvsc0Eio2YU;g|;G4qk#p6h2i<i}>^ z*RJH(=$t>pZvF|28w`E^E`OE2Z2e&_8Wi;V@9KY-`1DgI?oFN8nS6g{iOu6l4}RBo zomlYvjekQ@#|^Ptu5A`Cuk>H_X=e^Px4>Y3{V^Use?I-$;$IB!uTtU5Zl9}MuO`s( z_+)-)`~llP+(%xke{E-)6Z9}yviEM``wfLWnVzc)`KNa-w*9xjIQ8%uev1V~ex=?! z%h!aj-hRHS!J)q^tZ2&hDSwtHoc~wV$kOiHRNo-TDrE7(aQC%GOl~`tm3DK#Jjj`I ziRFCZ;(Jzp&%Kf&oc5&J$j{;D(K0*odE&Xp-_{ge$}7#*pDvY9vE_)?fkQRH#pr7% z3U_`I`N!%c_~}aPlZ!69eyzKqFD0%K^OraF%J$VdC4m=RbvJZ(ed6j!4X>9uA9PO2 zs(g9T{Wk@d>Xs~yTWnr_@swP$Or_pY_InYrYh(UQpEqM$_}=+Zuh(jb@FYpCw*RrX zKf-?E$!%^N3%;i8U@OitU$bmYY4%((mH7oO^H=G8J#}BQ`sV%B*XEiiue&|__+z)< zYvgu%u{K}X`ML2h$DvOzzFpz^zUGYW5AOPv>M4^&q75hdave~6tvBl%&-o>apIN5M ze$@PMJE(O>(%XZzmNoy5-<oA@n<C}2>Botho11OVrW`VvSCD;h(V4)P3<b;7XN5eT zw|wL2&Hv`Rw`VEOkJ~xHPBcnz-P!dM<ma<;#;Zmj-gC87GGn>W4b6_r?uQybZcnaN zP%RXmyRd$GmqEo9n~(n$QznK7PD~9-`uxM7ppm2e(;F|>s#|lV|J47O7bEc_-#4d> ztNm-0ZpHHti>*ax>J+aq2oE^7c5X^X<@T8Uc^+>?LeyO<OZr^rW-0utvr(SOB=Au3 zm-`EO&OCw3K`BSQi_}BRO^WUJs@%|$-@Eup$oW0W6Q1eRCq-(#s=V^KNw{U+`JETI zw05!Hxh1sj*!<9(rYFCCJ`H#quO+^u_-bh9jinny4n#hD{pPhm<Sg}~x|8oY(!FB7 z^V}A)4$@xorLK9ZR>j9u(SpY3?x_xK;ZJ;2=dauKd~fmA-9D-^O+xD{JU9R0xqY^U zdE4uolOq{FbbmeiYr~iNc6;sC&GtTP4F&uD-f(PvF)K4{`<{TH&{xNGO_c-r`!vsn zp5Iu#Gjc*&gp15m#*aBg?ww`nLH|If?M$}|bT{@aQ13Wh_pWyNm8AXQ44#L%{`IXC zkbC$}(s5N=gvPqyqz6+sr){2oi6iyi>`9wg>@37t;&zEfwk9@gu`VjE&+YX8`Sfph z@s}0Xq;G6+`CS!yd7Jv3yUs_t+#?@-@|dL++UGmv#JSze&s;aH6WZ7|r}x|;@3Nc5 z#}fUwACs;=e#P+1rw2Dh?KRc)OcZyYII8!WjoBynQJc>bgRhoavoBj8m&lZ>{eN%i zuH4=`(dYNgHMqCQ{ox~za~1aaCmuA{a~|Y5Eg*988T;GmKYmNbIdgsV?__?*>uvn} zZ#%DSW5d}6GOIL}ZTeu$8G42BXX}fkH}ChKm^E=;>%?V0IOXe1(t8h2KD=3{U(I#m zlaxD|dYgUJw#w}}KKFC+sV#paF5TQ2G{w6!XXc(m!A85+_x3F7J7z86(tEzV=fv)> z1uL`ae@C3mxSq^caPnaHnf;$-dLzo66tnmQ*#dv;ec$;ZrB;4M=C$;@OY|gfilzQC z{c&z#^4SN`df!jY{&ZEEEqG&`XfU__!tY<NKKLX5Ygr?AL*3(boTrre)(PA;oMDrj zGl%WDU%~o`?4ODj&ZyA!dcWf4+f^$%pZaCLoF#6yX>Diy1g}N2-!6Ul_Rpl4@9V8z zB^;O?>d5VL<d?+pYb#%e@$P#*?T??=ZXRQ!K+c|Z-K$q;U(Cp{PCmwD)jvu5$+?OZ zeWuTEw+FRuSDiLv`u9(gmS?`M7OzVvW7y2x`t5jF%eQhPoBvBD9o$-FdB?;;AfnQs zy};`ADzU^B{_B4AXK$@H4%zLp_su?WDQzArq4ckpztpAVNH8Ba_q1l8DEK6)#p3t- z-421VS(TT&>(1%@o%817+1uwCm#-4uu99@h$!PK1+{a>@x~IJPG)-=8<a35kBA-N_ zuQX5db)BW_Gj-F8DMwfA|IF}Jb?UBCxvdY>w`=xWDaTort9IvTxk*Z-iqv<R{an=3 z+j)7a&*J@S8I8MMNOG`gIk;`Sx2|*d;-wN!?YW=-?MXQ^LH=8-yx&Swp||m&*NZ2W z*zM!|Shbl|;^U*{*;nqYzB?_-+jG_D!xmfp9!0F=JGb;k{&~TA_Zcz5b6fQm_1@j5 zeotBT9)G`tnDCdCH_jiQm-(kL&(HnJ-1@g`9^E={SNqt>don2}EmmgnJl^M1r?mQD z{-aH9vt%aDZ*EwX;x~0h+v`HnB!O(JeT(~EYxlix%lx#r{M``~F>}Kc=VVvtJH6}h zTo}rF`bTJw`l{+}!FnIvvp*e~^Xkpyw4dsy4`kGRo7~L&sm~|p`h$Cor^_R`Zaxbx z5boW{R<CAy^8bx;*8;wP8|4R-zWek|-?{fkey+)r2^VIZ^i`Yl_4|rYZm-GDY(x%~ zPs@6&z9hp-t@h;kf8ddljB~c^xj!E=uZ;It6wS3TJS9qz_qOnd*L#&8pDf5#=h!D^ zC3ZqzqE^)6*RMa3YSD~u{_NMgd$9LZN&Os?iEEu+-mYKyrB(NQNzk#3Z5vD$PQA5r z>MDU%FZ-V`&sQ_l>9-3|pTWdov;T-~UB(FqX(KFEUG5%(Gzsa(Z?1d0tHi(NB`#+6 zdH9auSBv=fMV?a`|AwpF5}TK}Xzd1*g_^FxU8h8ZbAM~q7I&KYY+Jb0DKfG?edRWf zZJ~emeiD=yoGE(dm?|^Fo~^gdo}2xDvfm)bA+_g}gmJ+NkLL^gcdb%zeNcFZq4D^{ z!!h^fDZlgAPq!$mxMm$>?QRh2EcZI6>2sqa>vM+t-Pg7jyfBCfoWA(@wBxV#WiMSH z6SG46`TuaqdGWE6KA-;laOa`v$F-%WKW(l*9Afst?5#)6wpm@TUQ0?ae5_rZU}$x> zCR)s*)3b)VWP51-`$o$<8Q+_lHEz5v@_9aO+pq7DXLaV)9}InDlk9F86vbunraAe{ zz07sm?svm@CkSzbIknG@KGA;j&A;E@m0tzkeSPDM+SHqiSGmW!on*fhtjCtsI^$dO z!fdr_gZel3S4fwovGp)B--}r6b5HPpz>y{u`wJhgtA70Kz3Zhyf>egnR5R;S$|1*U zcVyM7h1*=<xY45T;dM)Cn$l{IospvR{>46+u;GAlb(a+D%_q7ieSKorrnC6OzMZoO zJf%24=Ie<M$?>7Pn2U@9{_f^od{v=F!0=OCeT(!_v3jp3zBlHJEPh|MJ1&22!(sdF zFMe-`v(HQyO-WnGVfCzJ+s_ZG@8q)YulT`vwzM%SY~I_dr@VZdxi&7pw>R;V-ady* z<^ebIu7!GtSY27`XYxMK>Ven(1ER}+uPi++T(G@pq0rp)&!rF7X4;4Bm6tP~A>EbO zn0Th`70;&b<?qwH>W^$bdBjks{|4W~yuTTz^uuOEGC!{WJNHfMZKL@=w}oEck-R@O z!bSPd_uAYk{L$%!0{i52r=B>WHtp@i_uD@A8dU8!PCxo@-;BUk{_3FP`V(G#P;C3y zAW|N4#BRqv3;C`M;j%p69ajp=y*zAsAgkWtoc_r*E7KHaWhJpMYOwOGS3Tpq#{Muz ztVpE*YxP~8V&RP52N@e@Sl9hcIsC_#=Xb({I3vA-j64;S3nG`qh24ICK%jb;)zaAy zcQ1dcdUpN1sb`k0+j6X-@~eb<o~_;4xYZY5q_y~)9o$i0*tzWWPlc(hg4>KARWhHC z%kt$4xxIRA)q^u8eOKhdWE5uo3cg-neCqSGTIcpS22+W?{<jxq?^0?!HaRP`j*Xq& zMY^}+*rW5^+(qubzjsd%{AS%VJziJh#XF`+jB=kkHmEK9mwom1+j%=8gucd4xy10i zn{)pDEdRYHugvZ*4@+W9H8PxU9`cRpT|?tTtEoGywAxOKEc=nQrdOj}<-snu=&(hq zj`fp|2h4iht6BXuLD`pMA*<M7iKzOU+gyEwa!x1v_Q>7fNiDY8#$^9LLGFuIpyjh- z{~5~{2S4uQTJOGH_S<{k9PbwHNro-&FYOF`l{HbG@BA(Iy=pRb0#E;QmL9w8+Ab=T zvixZ?m*J`{QHsiEFMHfv-rhH(?$fK#f3m+1l%L&LZ;{^j@_+h!?-{}F(@g(++1~li z*5`hC&9Sm}+k;BGY|r=F-gu{a?qvaoMow?5i}xXKpF98ULRC4HCpaW{YPf#u-NDYX zO<Q|^jFz_e<tg(s8kwg(Io_qV+N><JQ1M(%mEES8`GytG?frLuTQ73oAh_V>tdmmQ z1$Or*TwifB@NT`V;zi5MIolpiy?dmbN8-h=(=KLl?{w0VZ+xFB_*+zTpOEi7gQ+#e zy0&rgU;izCHGxgq@!zp$a~En!rpojO)VQ^o-S8^ttc&*k$+-Qe*LNr8*8ZQ)&UsI} zW9}O`e%TYhYmYNaiXdZGTGTNggSj8;AKvA=Q?B%2ZPwP?jvj07)brf<%_O4Uy_fgd zdVV40_Bu(0buC@ab!jp0KOW)#;j-?f;_l__$F#RZ#$R*xJggKp`>EuS+J~}ddbe@w zr0sJ#s=qc>HPf#<ICOj0n-7N_HhsvuZXvG3V&ZgY-kdkuab+1o`T_G5qFACT0$fch z7b{yYYRY11RBTX`_ILgEvZwyjxBB_{0`eXFjr`$-H?o}fxa269+1yy6)3CUx<Hdo; zdXIl_rypc}_+NpIPlP$xS$;*yq2JGMtQX*9?_zPbm~t$!YElQoyf!7HA9`<m>|72u zE^;`c8>>;X&(TIkL(Zk{L#v1IJxS(^UzI(-S{4~!zI?miMgHRz-GBT=mS<yF?^*R% zxK57=V$?}vC>1NxKW(*I`ReJV8B(5a*ESWcSZ(!u)s4-0+mHM!{$AcL`+eDGRxRW7 z$3h2u=R9F$%CgwJVuG9;M?pOMf-|~SQ&}YDObY(E{bJg(TWQA@%&Ukx=yY@b_Q3OX zF)J@;$tF(pTK#q2^mjpwD)nO16(iDSRrV}?#~qs1^(+5&ET7~-&z-M0Bv(YP(Yq_E z8MO40ov81Gi$T8>kKUA*2x0ksD}J?>>x2|8l~p-WwX1qpIJ$5DB%Etl{@e9W!iR@< zG@V>I6kDz_q%PzWZESMjWIMG-MKrO=;3m&xu173|o7mJBm5C}g32?S`L|?D((r}!@ zvbg2?UL_|1#e*D@U0NPTIFeK(l)0a7+RgOz$(CDd!vr-P9SXm(TLie6>N>F~3h@XA zc6AFlcCa`<IX%6BW3qEYXY`5obJ|wxvlAX&^LxuP`I6__YZ(XIJh!x(D}H>OBUA9n zBJEkKv$fNTt9C0(Z(VfI=w9l0?%#n0^-anTe*9m`z{#m4oc{gM{BLsFLW`C)DL?4o zng8-b>k0o&i{?%a&#DnfHM+{{eND$`fpcYAkW%)puV=1Zx-V!pgJGwf*##kmpI^^T zn3WbNIkA5Awe$9qcJpuk;j(t6(W&=Vp%RXhbSJQ|1f*!&PxbAd_G#z)Te<(2>E69N zaW&t`deMr_(d?nDlcF=57~HMu{(PVO_4B7sn@{)@>EFG3zwp}LdhP#bXO`6`@8@0= zCvnp2@0xiX$+Cj>?3+B#&&;|wZ%ul>tZBu*xP9`)`)aQj9pC-xZQkD{vB#Oy9_X=a zm83szn0(wYd6T{UlAo>LL{`~N`5Ex@k^U;X389|VcSYms9r|VBr(eyHv2%`^^wFm} z<$T;Hw!h0y#Gmlr^I0=SUSat;wl<?ly0fD54L2R!zx0EOMp$dM|5RSPM!Cw_oNlc> zzt?kxh&^2K%1FMf_<sF_zVDtNt~+P1&U)IR6X32hmq)`eolW)H=A5&?jb^%}^&jcW z5DPT<rl}fI9m*3s+j@h$>!lRAp08_W{PAA@$NNqA#|1I_XY{BX-)OEm;fcfvu7I7J zKAJpUqw;IU=D&r%5^Z1i?cTgPye4S1*Yty-j3V_*)#hcllx;4##yVX>*#5@cTF>vV zawmL#qG2@Av~15~t-@@DgyfA=^rn0clzeW#e64ld-EZb+;}Z+FhOJWQew<wBaO`o$ z9C>Xm{u>tI*7Hy1?woI-a_0EPh5m9ozaQrIkT0IyXCAw<EUdG1mz&Fs=i>4wZ@kn9 zk5xD|W0e~3p8B%_b|G)Rn+OJO{#M7v(6Xn!K~-;#S=QId5tk(%hw$Fvo3dV!%VXV% zD^mNXl<BRm_c^#%?bPY2O2#y62PwX2y}thP9r|w1ZI90R%m1DILiBkdfAgx>d)r^X z_AUG#^mWPYjgb<z8$Y^S@{#irKF+r&W13%zqsBuQ^~Hsc6;?aco6I%1$7yup!h%h% z?kk#%mo{xad#++rVuFrEfb@RDX)p3!b04S#y$_T;?(q3($3C%k<K*^gy%sZ>jCieE ztCO^tO)VCrJl<Y>X+_Da10S-3wC%+&Pu;986IHf1`&hR5jq7>;+Ma97blLEO^WnLF zRco1_)qPpLeQ_SI)5^PI?Ai5G!spj|+Vk{vxZM|<e87oe;jtYr-rH2#ZLG|*zh!@3 z*}Pa_?(zmn##up6Za!Yv#~Rf9(fFF+3a>5eIP}H0PT}M&)nnj!8*!I^<sF~2ceyF; zEUpH38@J?$ZN1qdb;{s<Q|;lSerrUI3vA}zA!MtRB>rV%^an4tDF-(?wC(!lRnObq z_h!S>zGwBlds37hZ4WdMD{<hOw)0qit>|M@*}{VNGjBfby=nL{ct`Jx-zR_UyT1SJ zu5w%H>ASX;alW`|v2dMN^|K<0!zT9xwiWG=QC2P7-mvI>SLV#h@aG~YZX28a5Pi`9 zR7E)|&~?+E?^ilMY1iG1d~Rv*-$AloAl1jG-a9aK(f$IztVQcu(!-whcOJ^Oy%`sv zbbfWuwrhC{)_pxFtMHhm(^Wlquf>$Ls{5T@eb4_T{io})*WysN36@X&e}?vdmy48& zooDU8>4B-=rzQ8^hyR^@FF)vg9kcZ8x3@C)s2^UjW>RvW(ILf4d)|4UJs0ot>+`F3 z|JHfrtzY`Aey+=}p#KZq^Qv++9i5cz_B@}o_u$bh8(My3Mg1ySsCd2nZPH8oe?2R& z?u-<?+r+f5EJndOGPL{5`Zs3l-!I|)D6=xsZmp-`%atmREycz66h-Ge-5C5*mp|lG z{Heu)hML8<Q>OZ?$UNmg<#_cPbFa#YA&Z<^Ib#fO8=qNtR?fdZ^>WC(Exx(;FFfw5 ze#%;>8I|(-{QEmA*WFxEl4Uw0sr{hUdYflA%x6R&`d7a<W!mkfX-hdBjJUtG+858A zx5AYF%3AexAuB_7^J*M1ymW?t^NL>HnfL#Q%{c$XhxcgF-lIJRMV_{f0;?E~mo=Z= zyfw4u$Wd7l`=nQg71-vk>iJYJC|R>+#pDm$jy5j;{h{G*$^BZ-y&P`>Y91E;Z7{TJ z%-Jmw`$)n{KQlW0&cmHHb@L4$C0xG}V3ID95qS0M%3{}`TcOXlze>+tFn4|O)t}$? zEvf#h^uuy?QTg#dXF1P2y~|#IqV3p?glC$+AN~n3^O?2%g>`x8PnHvNSKWWRcjeUj z)mN*;4LA2lrpE{M&s?x^ftLN+nU!`<-z-AT=}9O~>{Z{=w)@bos8y!PyB~E-I(^E* z|6jL;je2<K=P$Kh?O_w8+VW(Q`M2l(m|qpfetuus7qR-tEzKt1T;7PEo5%gJU*eK+ zz{{5JRh#1vX8wIA%qMQKTv_^MkJ@`?jh3YwJ?raTWQyMTNM=h&vL;2beLp=bEnF^Y zSK_bxCW|`{b%&T(Yd(JYPK@oU!K%cN!=1&kQ+-$aZxu9s@nV|c{?ve<u747qMT<V1 z*zi)b+1w_wGi%4rriZ^Qrk^{NK6OUcJLS-VWgWcz&sR?PuVr{^%frn%3~wf6y_~j2 zto>I?)D^ay^$8Q~UHZ9I%pYYg|4{K|p5Vd82)k`tKNh_@KYQtBvmLABs$VOW<cRCc ze*f>l0;PcEA7oTrrC%>x^g~nq=J9ie?r|5lYP&r+cX;_ZE%n?L^JGso-v1NF{)uzd zrw+{@iF;?1z3z3>zIN!Ciiz-ibq{y*S-&Q--fc1PvA3Py@q3wcy>ix*x1SXr@fA)N zc-PneU(Nl<6<%*2w^Fy}+16Eh?5_{D`-C$*KUZfa_iS#}*N+togZ1S;3#iDbFkU=+ za?gph%N#usoP7)ZetznB5qyu?IgI=B!`06=+XcI)ESd4C#4EM=#5T95C(r+i*i#an zF7V5*ee>L3#~P+BSif0`m;Ffnij@Tnrkj^-j<pt=@A>prXZ>`O^Xl!*?G<8wN}ujL zRW<wLxyIm7A8q|(yNgl-If7=-7IE&may-+B>Fg1q9L7n@GM1&D$$5KzcI27+tnnWj z(?6vzxvuB))tYHp!;OxomCpWR?uy5q{dtyYZcy*`FyFP|zohmV(IEQ{NA+LYvh{*? zJrNZ)eMOJ6-d+xVbT`UwO?q1FiGcY$BEBY1RE=JizlmRViS>D=`{Wxrp{wuqt@k|g zhJ!=u@|5_@d&kZ%Q|X9W9;LZ-S?v3DEY`-%(>+;F+0A!+YBASFb@j2APcoYX{M7vy zHazJ%Bzf@XlLablGrl&YTOCrnQ!V-E$D^0&^&Q$@<5$=pFK(~*5aVH+QaG=_Q@cy! z4(rbM_8w2}e@gkac}7L9`Sugrj_R$A$XT%F&cY41mTkDIJ3q`{NigX_YW}|8lj_dx zKiQVny-GMDzT(6EB|RG~JR;Uezc|3SDWq|7y4-*DJg%L-*Kd4$eYC^*YPfCD?fseF z<>fUSnvHep*RJTf@ljn_?7^Hbc_(t0d*`jsf9L6)WiJ0trRehRf88CGvgJ$k@80|J ze(AZYrh^*$WRGzy$UEJ0^0StK`ibY?<~)qIC}ZdSVE*|=+h4aH*%|&y0{8t6Yia~% zFfF$Dnd)+J-??IMGjZpie>76;K4tGaesqN$f4h7@fuu%0zkdBAo+*JgJhrmE{01Dn zVVnMyRkkS}Icz%5diyT6Ge1;>9tYPQh+}O!x;#YmYh~5)95MAxsT%LA!z%>cg(}1( zGA7kD9k=Ex+!|*)agk&bv$nYP5&`Sq%*|YV4a!F1kMrj<o&9qr=3Tz~y5cwW?kP)x zCui((y;t(Mb#M7++0xhbGo|vms#60hLqzr~*ZY8~L|(TFJ$I3_mps>ZmNCC=n}4^$ zD82d5A4Pk<2r<(NwMxI1oH>HpH5-`f-Gt=Sx)yjcX8bvSIKM3^(EX_ngNDL&lb5m` z9x*jcAx&XC0SBL`v#m%l(9)3B3Ey&0cfQK|FUtIrZ6Cg1iViclX<WZgb@!w_GN)n^ znYJ*=xZT|IQ)^@KAFekx%g)XJGK=-l=^w7wb1qiyboe*(rC9l_Ios9da{ZsJZMAB3 zpZ-3-)G1cIuOd0G=w<FXqQ6~HnnmV&Iq%ym{;#fjxh$M}s`E$HvOb@4{|+!7TG#li zYG=*0jx>qPoq<~E{2br@9bk0Y^s!#(Nu^YU-BjMl(3Mqnc~QT%tUWj5_52LuPaQ7> zMc!oH@>0LL+03Ryy)66T8-5-w3#LAop7Sc3GB2HU`0K#B-IgUmXU6AH$@iACBn@qU zb49uM9J^qq<$CY`lNo=0pZqm*itxN|GbT2($;|67RbC%b;XM13<*AfYsYaQJXO6jQ z*2|>b-pcd(h{3hGn2j&QpIvL5y05`{qru&8iSb>n`xp65*e<A8v?xPzBm4b*np5}x zf0p=u(ZT1*pSl?<{@f^tWM1)y@pcHK!1SI4yv2S7&r|ddM4z#od1CcaM#G?nWhIk? zI3_Y3T)I4Fy~(PL_iB!<lJDbK9LUmR>+(<J*RKaI^{cL}{&4PuVVwLCj#i6vC(a4x zEObb`|4gZ~IsKDvx#7Nz-Zh82_vUP=_PY}5*|Z>ine~nMvdb^8eg3fKrp4Q3<w>`+ zbbL=ITsx67E4DJ@Wm~y}RL!%W&rS8zJg1p&+)^AhF=~R4L))*Ga39g10#)}-+#lH7 zy<rx=>Z)~a08eoJZ7u(d6AQjPwcwhWwa{(b=G^cXg?)S<F9<uQ`92UlwOUtr)4NW= z8Tzxu{3p)$-Qrs-u(0sUCEY96zL@8CZnOE+H^1@7vD2ceGd*`s_FR8*vhI&93dfm4 z-(+^5v%Wm3cWT?&6Gux53qKr`IJqQm*(vR0L&c5R=I%OS=PmgH-kq#3_7mvub4_6D zpZoR1>?GUCi+yu+wy(aM7V|as<A#f0mtVJDaAD`qn+-=_?mQH|?#a;!yY3zS`nB-K zH|@Jci=V{*c>LGp$WC!RRs->z|IY<d=ZMGpzTBM@l@?Z|`a?xbRe9e;p@X+irZp@6 z)8e?i=bN1MA(Qn}E(y+fHuc}qWIyqG13}NfllYgcHnj<y-*@chjr#hQ#Ah;9>JvY? zrJS?uz3}jpYDnXZ;&bKlx-6`F=65V;5LOr1f8?KbwQO0@1INZv;e!$t#-TG>7BcaO zsvJ?_5lvXZ;LJL2Y4Qq&868XNPO?jB6?l58?UY^2p6Jkik+~#7>FL>|FAXw+bt2s1 z^>f?Aza$mb<j-+E)cCP}N4B`qy-lM1hW92Z$*uNz`fa7zA~xB(r~J2o>-q)Jr@l#+ zJe+B%@qXsC?`PlK)!Nea##gjDx6y3c+<w<@P1=56XBTs%eZ5ih+W157$E$xi1&@Ur z?vwg?$#5T+k4w=0l%Dm6I@f=*)|7DQ6}+apu0El~bnhNP!E0|$)xDZ7tMIIBk2QDA zNA&;$?gd)6SDMRh>tbK>Xlh~H$~D4!epDY&6MFaYYy86vnh!g9D;%d7)Pu&TTrbYJ z$mi2#@F{Ixera%njsN~dn;JJ*a!Nn3J@jW&vGIoJt5v&;jM%qbw%d5@!|T-#_r&{4 z-kR&%Qy)`5f3v;8iU%APN>a7TA=RqMcNMlxx4ELu?3!%DnfP%}#Rl_*MM3YUsl*$< z__>RB(s^0$W-p%2Yo!Ap<T!XulU(sq;=1d73-^mV1BJicP=7Vqr1iGOK350h2V%OZ zn-)&Ze`O((CA4Aw2G;B+Cfw2mzA{VM(w^HdH}28yXZ`fer=Ito!k^=xiWCzTm8f0X z_i3ussUOYe=Z$q;Lp%Q+I(faLI(VMFT9>EDwikk`M)fu^nOC>T7g}0ddS5X+`gk3) zsPyg0vZt<1`a0>?-`RFMUkRoij#*<7G}T%?=>7NA|9sz@uPi@5SMK&7)AhfDHh&hM z_;1gy-TSpC-OgTFsXlSvmHPS@6KBU&tDc(oWtwXZ$BCr}uc_$TY-m+WV)=0Jb7gqa zzU=#3yO;j|VXWp*teAXA_{Y}AOp>QoMU_PF%=hqWEOX&9i4hmy^MCb?Q^`p$Qx2TD z?6CCDQX473$wsHuR;M`m2G=c8`+cWs@tF;=F)~wDx3|B4JE8Ol&t;B0@%P@k^`9!3 z0`43>Ry}0`M|48-Kh^@b)5})cWOB1dF5~HX6I-`ZoWH0(-dsb_FzV`4!8==4mEJAq ziOULnAm;N>_t^Bz7?zx$YvS^lX1SLCbkRMqvtV7=NfGY{OV!&uL#|6d_1pb)`Ki70 z7ijtO3yEKeuQX&mRJUd8&tn}E#X0u<p7gH%DtnaI@w2CIt`z!pX4bhsZVCE}7S~1P z&Y3d(f@0{Z<+&b(#(56K#Z|HLjrOIz!5?-!(=o7{6F)^Z?)=VKyvy1Q??x~C`(x$D z64jjxrJf7U5cnoteB$7*yoJm;GZyenJFd-n>R7`^<^Ml#>|Cck;pxPSerqE*p2l0R zp0`b^?#GAvx~3l<+ID7Ue<q*moh+qbpR@XzV!;m65|-&7Pw!1j*LUv7a9uV1w5+}0 z*E%JaE0rpBp3h=7mgrCUEV%ed0DoP9sP_yFON(hK#$IwYtG)$3eUZDAYa*nZpu8&b zR6rQ>@+!TK*}pl8-V|pW9dz*!OTKwC{n@pP*@bL6=9atW?s(>N-0|u5hgC<cSSl+y z`%cw;oVw}jdcXDTXRX^VFh7{P%J}idYvInvmQFggQY$+7?u?Y~(&O6GpQkaZ)_YG^ znms9O+kVZ1LGNQ%bo`e~y8Y{YY0=vyYRl{F^{m71uDde5Dz|gXlHc|!E8X+t-sQ`` zdw)WHe_X8hlYika^^3m0K6|*dy|y`~bjiKHp}Q;p#uj_szP;b;?f;*0FCrb*X5ZH@ zS6+5(uh=%@O|FdJ_9#`Gs!H2^-?snvHqPEp^-eOuXTEbV<am7uoh?xu+_YAO_q}$o zYRo;B2dsaZZ7#O>l;@ggZ+(|8IZOAIH@|qmo4+m#DiYJb<>)U8Q)(<be3Mloq<}?+ z^K6=Juu;&l<g9>PkIKUa%YPr?f7ZS-BYCcEqL;ykS=YrKyd8U4*MxX~o$RH&G{UiW z`@btE((BE3n)bc^%hY~0VZ}a^(qz->v);kmjQoveq!npcsyev#NKaAPu3=wbTlD)= zN}I*5s<%hkyf<x7&F~D$_teVpTyWvb*I&6;!d9%kbhaSc@Z}qulpS_@?AvA<#w?yJ z&FuT)$)d^Gmw#rOwWvAnF7zln{57NXu7kWlt7L1Wju2n{@!Z5`Uyqlx#3{&BUEp@n zH<;RXI84=i*008Cj}vs*e>G~Hv)mvlY}mC~oSpsR8BxAd+x>Z>`d_rRNXWZfe-(OB zSC}`%=*?I5kJT%zEo}JSI0?(KFS6wOk+mr6bxWj=z3-F1N6MzYb$>K{ftuHHwO<at zQ_6f>tTbF^m3$ERUhiBwanJ9~3%U~-p46HO9|;Uqx}3gD^Z%KQIz`88Yqtnm`c1rT z^kr3WE8p(<bJwimW13TapkDLVei?}ylB%aapE#^B<?F8Gy}`ly(^svq{?^SGYPQzy zs@s(Xi=%&bZsXC~-y#1cW2!>)tHn|ct1kR}`?Bgjqf~74)*I*K!rOnc)(hmP7<veC zKT-Z&bH++|zajJ9lUD1$<e!$Ceb{2rT({-#s>?psHT`4Xv-xz)w%p%adddw<SS9Y} zREq8EVLrX-bpEb`a~{;pcwO-1N?q@fNvdDWg|pu*{4LNd(Xc}<>6Glf?FUld7xkR- z4T>sgp4)RhAaE7O!iKn{Q$9D+>n01=ANwHl$=<#-`{6a2mj~zH-+W+x>*Zbj^SF}k z9+DL0TiJK1_4Mio8#s@7T=;cxdtHL+=LbzHGdI+<3#y)ES}nvi`GKWXXv}>(pQeR| z_49te<Cjs`)6USeeM-Ktz@>PB76y(hEY%Ct{mctLS7a@S`TXR2T61%v-<lg|E7_;E z+?`Wz&-i4+eRl18{u}CTJ?3A1ID@}>@BEg8{HI%@+`ldB*&DR8OzBb2={LI9wR^MP zez@^EuXXLq-E*UMb7mg67!jCxae?sPscdbXViNrA8y>c;5V!El-M5+PxH8|qQkJc& zzLq^@5pZnP*{H7YZok1F9Ut3SA$fDI)W|j+^IRGGF0Ve>P)q%h_(JCia_tG7d(TxK zKYY`5p0&_izj^BAa$CN$vx$DIELh>s*5!7x#3XL{;{}0Y3m&JmIRw{zl~RxYQ+}Ga zY|r=RUEhTnOWh-a7)nF(pXX^UP7>QXbJerA25g7RSL|_(-z%Q;de3|g1B)LVOwMBd z?%Y4x8wJ|fyswAWfBrLPZ&gXjg6|0%#Y<9DKCw#6{@dn!ahY-U*;4is#b;y8*#cQZ z_U(OcDv~Pl)HQJ1dXqyZH%<SSwmRzVE#Y;^i|n<S)BUT`RK%BW`WmCKbN;v0I~FbS zzPfg6>+=mazgd`lIr+F^nQhdSEpo;OH+|}_S+gV0(D|^;+RQ*{1Cyfq*^_?<P2sf7 zpD@jm=e)mm`tn0%>ptB1+*$i&o4n%r#(S=gi<D;XE8^&k;cCnMG}X{)S|fME(un`d zxEbbq&u^V!7{}niHCbNu%6vP+CXK^)tJd<qdzN-~FK<EG#1GR=RxA#1KiK^DDc26; zQ_2T)gnnL_Ejl4zV5eH>sq}wm_XgL`mlR(9=;Se#`L$<0be>9&n9Uhwzt+s}ly}6r zYZ|SrMwid)THo7XdfdoJL&>^>$M(P8R~_zEEKf8SOXppdI-_;%aZ$#iC(~BV2%F@1 z%46!$WqYy>Vj9$?S9_P4+i{;e|19f%PNje%cf-LOw*(CTEe-B|{^(Baj)*HSf9{H9 z$f>s%+HYCxKJ&}x8SbLn%0D#j?p_&RKEW<_eMHvWtfee==eu?*+o>u4jre?W-mMvv znRPE~C{KDaKUU>X`Oe3^N#8OzUOKCL{P!u2^Vh5<KHXfkQ*t%S+w<`(i)Hssnfd&& zl$^`o<<qafO?$bfmW|{1v6QvnIsEiuXU6DHx^Uyk`oQ{rbBSFMD|;UQd)x6M*!!Ys zr0xVp*;B@og+52lU#V;q<Wp(2bdzI>_ZFi^H)VfC>`95cHQ~R+!uKT>kJoPtOR-iF zOjug{igD^*6{fx_9~BSV+50AWG`tn#3+B{iVvb3Abnu1BYg?D_BO14#rGA_u^1svK zQSi~(3nR8<oMaZQtJgif>vhtMH=JGD*j*M)Rx{i8VGF~PwpSOw2tSiQliF3bGNh!n z^ujxD2^HSIzAfrLZKr?#YYtIxj-6}&(v-Vpe$mW-`xWj!`zrhU&-|Hrg(BAZzE-LE zMfWT9l&*$;jEbK9E9{lYs`Rq<G>zR$J|0;VqY&z_Q(kG$tLWqVt~MsbEOe0JXW78V z^7_@(4*?UBuBHAD5Lo^r%zJAZ@1fE)+Yidr&cC!UbV=Jn>4jBi9N#UK)BT?ulaZsY zmj3MRb7s4qFQ4!72Ro<l`_U2;qhlAl{_g>W`^SD688Te6JvIGq9-~J6mcZ4=qeG{; zEa<tt=8|d5OrIM+4_Uf$elFLDu2laq^Yz^c=dQ-?*1v03{dT{H_pblWld4>PeGbdI z?=5@jP3Z~W*M6`5pS$Pr_n+_oyuI87QJ{{Wg;LGW*k<jOtFzh9^~B7WDfvR+z*XD- z3s-qw+?O)*_&>jki!T1$ViA5RRzqjD^QZDjF7N86GE6(zBT}4kVdWZL`%OXL9u@m@ z_38gJsO8yX!&-CVU0kfU^z;q+j2iVpYgi2@>)p|l%~6w0i)P^2mU}krxzzqR+lkK( zzv8#ttaX?BZtwB<#PpqkLTmdCrp+o6)SDY}{?>;IxzeteOy_Gs#a83;oy;<ZjJ<`6 zYNvaqTwXG{@z=)17T$Abg?!3w+qc(Z`szbl(v_~?yg9vO{k-~|sM@yNtP2;{{&9(} zXPX*-g#TTQa@OVZ){{zBU$|29=ha=Xy5c__A0p?ZC}s1A39nL({yt%cb$Q0Uokr)1 z|A`$p?oDU?w8QJtQr-%N?&(J_U$l6C<VtPR#iUE`f@HSL(H2NObG7cCa5PU*jm6~0 z=X-iDuYG(&Uwx*abmX4%avP%yB4=~YJ5)WV{)4Q>t9LVI?r#q<4Y~IFf*-fkp6>;< zdslKNtgO29*1@V#PH^)4)vcOJU1={}#9F#mKS-HUB$FcAvF!7~-fz9%CdjT_v-Foq z$U%uae#X{@fj8ViGeI9#zi13r+~b}q!+dtS@~<eFb3HZ3<{ow4zddkE_|cGxG@0}r zo@@WeT(7sDBW!Tv`O(JrpuzCQUwR9z=a}5N+t7Kc&Q$HS+Uu#eawjhD`SfbD{>%1* zf)`)Rw%zP|osW-WTWkwg%Zaf4Zuf6a7L>8S+AFZ>xLtDZWHp<jayQMWQ_D030)EUa z*r(janUuENh;Po$M+}=|t#yxD%~MhGda*kx>RF9IP~)C@+u&w)wR#=>;2CvELhm0< z>%DewW%`=^mRnw=tP*eEv^9m_mGL`UbwyO>mQ!VuLmQ^Vf92Tx<J|=r_k!Z*AH1&q zJvq5*fBe_{s{NjOfBWX~N|;I;T;bAa_xQX^-_*KZ@a6f{yMOOi+PQbyta723-hbQW zcD~%Yl!dc*&lZc@W>4w^n3pVD>i?YA5#D#2m-BGeR3?3O?jN@b8+lSgb$1=jkY4q9 zN!m}7ZDvzDpL$JJo)@+_!zJgb;l>i91ufTOKTZFX;o|eli#JkLIBV7?Vbhz>uSqYp z5!DS`c!)XR%r~Ck&`rmKZ<<V1*EMF3ULhy$Z@e(yb=$u`=fvyFpO&qR%v^MXQE0c! zZ??~NH~y~|cWB=#knqOGUcGzrw(G*-tFElN%O>(jBJ){$<dtJ=$~xy`oLsAywI%KJ zOLUXixujKr<Lb1}uVpV^TTzm=)k4zfO6c7Gfg9iDO@Fxe$t4N-s|Sm<ayMBo4cZ>u zFWNqB;hqaBWe+}unsqoX*Q&qW44zcEym!V0pV);>fzi9gHd)K*85~oe;3ByAxqP7z zt3S^rCC?=q+h3)>70YTA)lGQsy(?UQQQc-u^VVnielA+??S43$nH*y?_P@#heEFt> z-H%^bm)~pq)$uMQHub&l+L*Q1YM1|&HA|aQ>uH<Dbj$Pgstn(0@+YU&$kc0v%JfV) zaqRN7h~pn}WVm~OoI5O8cwF(d!nFN5R_tL<ey&@^qb`>uBiM5F)AX8un;haSs`ZZ8 zvl`8>d$F&{=JDBMma;cJ(oHJm9TeY857UrSKee*M;z^8v@ihY@t`_%>8T$83c7M8X ziTB?BtIwlkeMRm`Exzd~>0iFxU`1PCJ?~<vd+kzgWoh?5&NsjQ{mAM&U)(Q><|JQ? zc)6w~tT7-q)o<p#O~*dJIafbbBKOvZNV7>Y!oq@v3$3;=CSNFQeBx%4xvi#;$CK6h z!N!N$zB;!ayeodYw);YUtU>0!-^|Tj4%NqnH;Ux0Y2P)&)AFPpTi?%@UF%{EnaVkC z-*%~=AL@52Aa<9^lLgWFCQ%!wvAAio7oYgQ;MJ#&zC4q!haLBySHEA9?9#jEt<bNU zx|%=cmP*U=B92roI}<3g@5Ae&D?8%_V^>&Re=c|Oa;%qpzw#@+R)v#%9!z|TCRe`u zzRYg<Mj;vh`N6fPv^S(~bzm#eIPc?iCcSo9-w6-HpY>m?ZYpeA8(8T#%T7%H?x9?# z`!5TQ#mi1(shumDS&+MU*&)U&XJ(x%I~#UnF<(Zn)Tb56&PNKrh8*4UDd`4txHiLk zg+G}gCYO!UwoQAYdi-<w?4)TQH(RVyo?D%;wY%fTX@yfqUM`7wA97I5pRG8z(d@>i ztoW9=4(|)K&L&Bx>dQ($`0tvU$ErUujN!o>P{Q)7U7dUG(*BI{KNqVMTMjip_-IzM zCD?6^?a%EtGymy4a}{a-m9sJ`y|H{w@dtL{sbOrw2ah~^%BOk6taWYP&n;C#ov94- z9z5Nx|MK~t**O{8R#-is(8~Vbch6d7L9uqG?$TN*ONVKj0zU0L#8jWhwe#u^g@CSV z^C#Obt8Tw;K3huSTJ%%Cjy7@Km3M1)Og`cJ{+GUzRnEPM`%0=W@1Jh<+LLAR<+6-F z?OEE!*Uqe-JtuQ!-b0c9hc@1pny`Q7`SdOKJKP#S-)nqy+d976Qj75-OK9k)mj$lP zeqX|0rKw0+EHJ&&5Vk<3zdCF6<oX3lQ=@s`Xm4N=PLIFDFMMYA{h7xj3TiWs*&l0F zoA_<ht;)o`YnjV6pG;mcA!*&(b^qD-cUwJJ@cUQ@{~?}4G2=6JGp2uvQ@A6Lck$rc zPwig|m>#p<x@PZa=dv~Ly+!p79*;d2z32QAE7G2~-`4xTW_J3#idPH|HcXc-H+8Nr zuIJyi=$eg3tBUXzpF@nF{2w(O-nv9taQRg$uhgbLvZt=?5qEmuR<iEht=gB{Zf5^? zjk@$#e$o}?OY^q}{f>JzA#J^LUQ~I||MG9g_T7km&pc;Z)>l92K92ah>kqtMy}H$C zti1j3SN1BF27%rEa`_qY-_qmldQVR+5kIwO!k@V+^%H-`tJ)ngyD9Qn<<#aG+Gke3 zs7*=^;0Tt?{v9G6*xZ-*RQ;CGia$zq7k2qrytXMie!Vrf$;4&Lw~0x7yjD}UK0N-o zYWaejtHO56F4Vp3JLzb8dsT4agO99}%NMv`FM2Ih-dFj4)1t3=jC_Ym*RNZ8XXD$M zPmhQ)zVt5Vzy5t^{eOc;W@q${eU_W|y-Z!><7c^ftdmMaU0Hrye*E;_!*i~QTm7~M zb+NHtjau2H;Sq2~{L%l{qB9Ps7))UmUDGv1@1~Al%ISc62j?X6cNAN1(RG;GeBiEq zYIf+k$(GU!wly9ysav;2C+mZnn`NNlGamJ4%AP-sceI~knDQ>br8BC&ob&g`<L{NG zy)t*+m=Wmmna|PO@v;Aeyhp8FDZyO&GZHrWuS{)<IHFK5;A!XhPxR6ye^$1i3kyzh zUeDJ$_B1|n-O*S<qk{CfX9>HS>pNuov?nZF2bqrfE!4d;Cuv)F;~(S8x_Rv2>6rYf z?-j0w9xsk<{~WYD&{n&?@s?`u_N+6kL9K%PJX@Fd?>%{~KlyJ#*3GQd%Qt)Nyd<jn zFaBAn+cWhg(sSY;mhOzqzS8im)k7)e5oCsCPp#6MzCcAiztwlEw(2OwowmpbeU<(- zY}VJ`3unJ?%(?WrxH_q0r;vK|;Z*m#^+m#Ldu6WhM7U1P^1o*Md3(M8%vU$J{tRs4 zG6;^nctF!GR{K)<Q6a7VxBqPVZ9L>ADH)#&@Y-JgS=zs>oc({t<BG;7=jLu}{JqSU z?cjZZh{i+bPlJaz=lDCF|Do}PWAb5!8!xWrY!mobxi-`;I^*#3maaYg;uY`yJ}FQu zY<yUGV1nv#pNr*kys=?vnX2`9;md_LEc{q8qib2myWR8oC(D$`R!)hM`)FXhWYTJl zHui-FS&rP(xU}EUYwo31wkY@Dx}}x7!*4CS>}@9WlPM@Q=)B$jH4<;E`1-nS5*OZ| zs9PBv*8F#AZzXR+RN8wfy`BxzI37RY{JmExam|YL+a7*NHI&#@wnpWXP%m$&aDCkV zeCN;`4lYZ(yuK<-(fSazvN`GI!%(l(Gb>bLeoPf)W}5Tzrp6yD1J~J0Bc{a{3bt)s zU?AdMx*;U}v0mazzPN6y?v{-S=dRb5II=wzWdC&IF4y)`J5{dES~>M~=rQRlvm|e| zY2-a#6Se*tL#FnB4ZVV}g<R*haowA>*Q{@8y`Qg^=fw|u&Mc9!J74=<J=mecsJ1-b zCOw^f?q;tXm+hx({!ZGRX`S=fZoSQ;B`wMiJ5D5b|E)Y8CO`TA*2Swh+IVF`Cko`$ znCme|BpollXV_&G?pH3Kb}>lJWdCPbZ6_{8Qz408KD-yxgtIgb@8LFM5pT+NFSvOy zG<4o9z50DTwaa=xy~;_@kcoc&Tut`XtrIm{z8u$Vo@*zxL%8ElU`WJ=>DD5Lj<z{E zS5~Fv*WdA1KapW6c8RlJeu5X%lR^gFbCW(fXdQNX5f?h~f9++Zp!J7OH@sh87rpY+ zNw)LOaY=JObG>wSY{)*z{pVPl;s0m*Dt#?jPLzKB<|kBLzj48;o7Xq(G+zCyA^&)} z?v)!8-evxLvPJOH6pMJV{V7+c6eJ%kSM_e3<+buuh98q~b@vTfi_?dzV|V0Bf6w)t zZP9Av)3(cZf9>Zw+l2ee%CEJ1-Tit;dz#~Er`S5Kw+`3i)i!-BN<Z0lbl=Jz3B%BT z)s;#IT;F|+lQ&zXe$}mh?~`|%-wU;J{EWV~c<KL|;QBSEXCM5()VbT|%S5BF8PUsL z+`1%wcdHi@-#IVYEVH-Iw?(sy75#Jfy0ge*+ljWC$W>R)y;&UZ5){d)JoS<OI*+B! zi*#LHvldLQzP-+K`Mm6hy=s%^tNdAF`Q-d>{ppi`SUd?>^fP&rTQYdjWBrLIQ(y8v z6M2<<sP5E+cAFh}QEbeMJX6?$76#efIL-guFz}emAKSA^UB~P$tWE!B{O$eCH6>Xq zN&;R!5Yx?_xY;s3<Jso(-upYw3B)Msy;%R1OZ*mRX71L>w`2GUl<d}T)e-0Tzg%h8 z{R@E?4JE`?zH6NE(DP}Y$iZrHvYW4<UP$I^lVyCr$LCkuQzCg*J&rn|z4}??%4<E^ zvifZM*elL)PF<<uHsR}<8O5Q#DWO;IcPtgYJvlAz<09j|_bN6D2dtG0Kj|gYw715L z;q*=K%?=??TR#=`-gHqeJKA<`rh3}ye%_1szDAmHhPpDYmaMs@_|w15S|f3mr@7l3 zbE*2(^#_06Jip(Wtz?b#6rU9br(U0a=vjsgqr~xl`uw0i#qPC|xvP7tR$qDhW7+ma zcVlkIdrbI{9mtga_vzO(J}LVqz3s-&jxU%#smkk&|M5@89Nl5eYu&`wxUsHfb7<nR zTE=#@O~ila%jHMz+zML|d18swt%`hJUpMi5u?u}m>SMTXez$K*b=lVO)ra$a=OG>T z`pk6gjs16yF!@@TJzdJfT)1?~8oR?6A~rc#D%HOHxA4C6>aU@zTf^O}%>!IQeY$yW zDy6piZ}t?q;#oGy@#;}Kv$b}{nQu}|c1@k1aeBe0?jMfpuDCG2Dqg>Kvu@11o2LJ6 zJlXEB>tNly6Kdx5Wq%Z%dzYSA_4jIueyf08XY@XKiQTz9J8I^~+w8jD%pG~x^-}eY zeb3}3En{C^t?aXjee%k@DDPb<d{Y#14{6txv->O$UAygB@=9^W$A4WIj#Y{<NPJoG z{XyXW`R%LsT~XYA_S=7x`iV|4R{Dl_RtBz|cFXs^(X6+D6L|Zjg}CZXVn3^0TC^lR z{L*gzz2E*`^?l#hvGVHM_Ue}(f4%zmFRJQ|{Vw@;E7+Ry1^GjHf4t+DxRdh!!P(R7 zN2XTJVDppEZCUeiiT&*TcjMX%Gi!{MqMo{OH+LM|b>^nLK?ldB)L#d5tVPWZ*Q}eV zJt3z1fBfwK@#^J1b<g5g>eMdPwX1Jf%kDfq&@uUI>OAAE3O}~(o#p<~{bTu&{khYZ zd~8%cxN5=952_*D0autTg)VNWT-sN_<@@c-&ZcWGW(QAIl>ReU>6DSkS+<^KyVq;m z_}H7gF-&{Jo<5oJ_p-Z<)9g3oZ+rXtb?nx_&0#O+lrFmHcJqVF-rvE~PhItjdAspL zf@r<dHmji552wektJ?pj<AdAss8{nA?&WpbvDv<WAyHjn`bpOX(Yi%tHGf|<oGMth z`MA%=bEV%p_|p969F0!q6V*_-TJ+^)Vcx{@5QC>-f7cW<@iETJ?F~L?0q%MTzfyAb zi7YPhHgYp%6S~{jahl~o+MT62VwK;5>y)AoKd*lj5O&q3cK)e7$*bfnnmsBGPR-gG z&F-Qp|M~h^iSIvB4n2OHfB#hdf8Ov7GnP-Z=QF-2@t5sH9rJnR{zK&}=Fan2zUa5j zA_h4wo?qvE3|}ybxNJ~A{haN5nbU)sE8Nd&LXRaxEnWL<XYk5zDYnnkr!AWG{CP6l z5?^C=>#bqx>*_OdWJK1L>}lWprBclCT13!;oAYZJO3z)L>g^|_VaDnw^88F^y;9AV zD=hwP`l^<ac1g0b%Wgi-+<DRF<K90X>LzWvP!Mu^O3&Ngj`?D9eM-xgZJ%@F^s<xo z-a6i<h5v*!zWz3^ExP(xIM(K(df73X|316#yk|R-`hVJ{7YP?d>n9!j+!I+;>Rz{d z*Y4e~{vP^S`+v2|FPB$;>#pv9`LQpTGwWf;lCRl<6TW1}7pN~-@u+W_-CX|I$B(D! zP5URTJcBD`-P*Z^q5I;k^#tS=>wbz@#_?~ha3yG=Wo=r+?Ya%04W`w0{|}odQ>gBJ zvE#<o<a;IA4xKgun)RCfZb#~utiLiL)M(){P5Z#O$?1CoS8besJ8GYeI=lSB!yBA$ z#oiJKUT1J(#>s%sjBHX9e>eT!^wC6EvccN;&PB$lpFDT-M!&CS^O)wfHpsTKa_6^W zjOzLq*b{$f-I{CnHhHVYb-quBg>DG;i@5GqwtLiisO6BzLW9UJcbzgpu*<1_R*S;L zz=^Xpb|*X%Xw6bJtTcFh!A{+H@?3T{`6Cr`(zWfQcCE|1Un6={;AlWY@2<|ZU*>i% zJeht-*Sh2Id3C=T@7q@{<PWj3RQq#q606KJd-<LBpZouq-po=nBmU=+pBEKYKHptf z7B&4=;Z;MGQ*H7khW?QO``m4(Yn(lP)3<)+mp6|SkLZQ})IRdP_}-G@liPdpBzPWV zizRQ-d*h|D>}1HzCz>}ccU%5-+ID)+%H6e{+2Q;#74M5H6NOUiwfr@`7`+&MG*>JT zSs)^_MMUS?v^G&TYsu-hy2n){w#~1&rD-blA&<fKOxNcndllUFNwd$f>64s4=WEV{ zU8~|#>fb*8JfZ4LvCg~S{6S_b@9TavEmPgN-i>pG%D$GlN58DAJ?(vF%dg{eu0P!( z+rjklz64`eYs9_nJDdLQK9KIa`qLGWd%bh7PcQti=HSVLGiGi$Ih#{p-jiOR0IhVc z9=)n(3aXjcx15_C_VWwRz1G+b8_c|}1{qJ|wtg_Bph8A)a=mVX$LF2je){wKyq#hH zS1I`G@;*Be&ZcMnj$AV~?~hy^`h7uN@{RU*k=Gxm2CjcG>u1Kxe&fmOmhMrzI{T~3 zt=UI?e_k^E|2V>2?&s70ulv_OO?te1stv=(9XI0hr^~7`)mJn9`C0iPM@xFy+XF`Z zsek8fk<O{?+#=sAZL}=ark*b)Sklg@{BGaoq60D}Dt-OmFY*-YFIi{CW2fOKzwJ)F z*Pq!*w)ScKpA%=NrnIkRU$T3;aFbEvjfNWs9kpNX-LkAtde5f|L2;?wLa!qYJ6B~) zIq_!4*>hU=?tQ3SH|uAH%l0$fwKHW;{QToG@2QSg)7zX==k;ey%Q@@w@wbR!{mDPg zHmBE5;i-t-FxledKcW1BKT~JA_%$g`>-%){BX6-7XY#?aBMsC0+(I29rfCTX=Lv8! zaSBH!o^q7Wy}w*2#6^m!d2z~`MVj2Mh9_?8e4OSV<Mu3V^3H$jHW;1zd_}c-*U|m| z?5po@n`<#i_lI`ixmCsnzDY;!uG^SiI5D<9E_d=xiSX|_;e6TxjcffB1A`u%vAO$K z|MRWqnfnr79amFQDHKl#nk1T(zV;N0qRX4#s%3B1&bIfwlMpwB<@k<28_Krwub4M! zX#f{XZk^xk^5s!BMQSPU3~eWEzvC#sL*kFk0^J{#4tI8RT5o#O6ZgdS-<0C@AAdD{ z?7V$jL#%#vsX}?nlWS{MzT_@u^q8%7Nlz{+THv9(ZCX4xhpg^Gb9bKjd8N%AFYY{T zHaWr(`NjW;VwYggiRN7<0&bnf25u3RlV`}ztXj$BWnfe#bz@;{5?`lpoBT)N%v&t= zV(~F$g?FykJ8=ovuU*$yE>Upw@yWAl>YoqC_i#RXdxN3gF5rmFhhNH?4(C`V7whic ztJ}~iwrIlNr54lWmVV~C^{wM*uzV^@<VAk*6$KT)+p4x+;Y#P(`$X=V+a8YtY@2=M zbPvb<b}mWFdT>GNoZHf<HD}bHGbHOgR{hu`cws`~zT73LKW2Yj#(gsVXY-r6TUufy zrGIg8=1o6!b=jO_HZJw;{#uLW@;O+gcRKhfJb$h9=;)>O6)U-~ZWZL#Hk4s%owIV0 zriadq@XV7xWBm%w#P%MFGg!Xbbm`=k^6R8_IUiMIUte6o_wfw7e9P+R6F9Q<kJw*e z{lhTtL*PT!zOzkHc^ng-CWy?wurl}E3)?7b?NEu0len(#Dl5KOZyj)HV!c+}$0wI& zn7z~y^WsVC^pIOWbz0Yx*|qu(ff^dKN)<Hbb4u3=+*AAhWwzs=uU|^CCNFyN%W(Sn z#?)H5<lmodkD8^Hzj9{lx$)t_&X?Vj>&{=wTAH;oOmj|Ug;<l|g_}oyZ`Re{@BPHg ze&+YD5`DkSB%=@eh_U|T*uK2xRm;X(_1_YGMW;rmZhbfFO6~3|IXlJQOP$~GAzNuf z_0i22Pu#N=%QZK-QnY(n#xz6O*&b)^9^gCl;=86<N!QAAc6WM$-PUME&f8RRf~$gg zx_GSe`%3fEp*%n4tl&!g{^P>qtFf1uxL5;97`jgNW<BJZvvucYwc|}YZ$)fjzx{Pm zj^6WY^;w$xd#@Gk*uh_1JykJv>B2X+9d1`UF&tl>(ssk`&k06Xh0QxOmxXWk$l95x zep5Wb`$7@(%hNJulV4RnJMr`KWxqS#tCgd_h4UQX@=Ry-D^2cw(YDW~E>%AK14Hlx ziRbEvo|Q>ooGf5>L;0~(xwQO?42k<qma+F29y=SmN2RWQ^~AEkQ>Bl4R{mIFCabid zx+#joopZwN>)|<lyI$%ovCimeXNg>V;L5BG*ITpp22PkeZ`qzNdrX!mC%v9EJ-nod zLwRydq~g*vVV{!*?JmF5{j!cOtke3$xtY7B&EQa*qTQGIKb3^~-%Rw;{rKAT+xqWI z86U<An18;%A%^Xf*u(n$SAFNcx)BlKBX_rFLT;_#{iFjzvlSfKCx4n}I(z?=$Jc%N z4Zao5w{`flYP%TQ0*O|e_H(tnwsVzzFZv{6^8L2DX>;M1^0V=Cj_qi=aq0G+uAm*e zqE^WntnJ^H+RHTW<UPSR7ups-?lrRC@=?6a=v&dD0IjOM{H5*RZsgDH2(LeTbM@_; z+J5%mo^%G;9bfh>=cc*M(e);`-fm7h{JVjt^pt+M)>fz8fudVx&zZbFq~!CzQ`tYe zMVEc@pYW}>cBb>OJpp{IyR%J{q(bjj^L|X8W9TQ~evnh@!~VP0?bE(pbgOA!SfRx7 z_0f~Gp7}G%KIUDp(!Xvt&*t?l(dl)3CiQmpQ9FvVGv~{$JL&s;&cYWnFP;4Pa^+&% z$%bX0uC>f~vw31_zhP?r+vUOh$;pqmL}-NgSLSDZyByYSET3s1yse0>zx(Oi{r~sw z-}PaI+4cM$P5z22F4tdNNo#vuzajkj<eQsrtbSiN>*uGy>lSDJ@H)4;uWs^R-T&^c z-qt_Wck1&K_AyMiczt4S{HB>sb!rtaeptlUbye)%($%=oe_hGp2m24iEB~I;!``yC ztI+VgZt}S$+xfo6?Tq;AKCx1*b#v0^+SNfBd-cV$Uj056x%1n;uz>8RPCM6anR0Fa zkL{AL{bkRE-pKGTnSaEql6QJ?>}K8LQWy86_4=>9=yAQHzuvdad+CFX(*)AWSBLAI z_#dwG@d|6x`l}na>N%fZS>c=Ov^D)-(UF9&>*nj#C<quIXRUv3(A&%w|89-qVxD<H z-U^RjpOE`pf0OBAxZ|$;dqpu{a)h5={&`(}oAdfkQ@1~?hfSj=R@l@f7VOymYx{@O z%Z^@Gtvg~cU2o2=@FTx|)_3il{-*xp%_bY2edVneLkpb#p8X;h@iF{{lBL+2wj1WR z4+)%}W4&zN<KusW>LRO;nO&Q)zClO2_lEYj{_4~F-WlvaULI$9I!*575u^4)N4Fl~ zJ$K~7%dX@eqljd4{d;Edoxiu_$dyWQ7}vh6S`l&Q=<yVT4vuT{Y6Jd!V)z(cUo-Q~ zayA)-hkDkPS3>^Zda>&H9q+PbZ>qcB8SZ!f(~((dUbSNXi^G~`H?~*R$efvxz$R9E z%vgSQ&C$o52i<o_T$?_Jzb{BYLRah#t99Sfmool5$3K@AKCd-c`tI=^_093M&nzDB ztACrZ{^tKpc{3kWHNWOv_kGpt*tJ)(wr-ZHU;j0#WUu$qsLfH?nl&fA*KIEfTYtTK z-rjZ7w72ehuP6Vgvba3w;AgQsiHduZD(*4Ga(>vevx)Ki@2m658&sMf^P2q;wP^ag ze@F9Vx9`6m`n~<~F8=L>s(l`t3$F4l*Y?xe&Sv|^<FJrpbhC|t_4EqoOvR9AhaGf3 zx86AIezKwddE@i#`R)47D??VbE^?XuZ?$OM?S<a#ys6hBuC+X$x#3}+>*fmYl+`gx zzkZtL>)(hu#kwzQbt4lqt6C>hv_=@~U)7cWj3zDFr|_s}y7s+=>uy!QC_CU$yMAKR zqRZQ#rLNoU(i}RMCw}RHTW5n-?%XK&@{@Yg*1g`2Yk0YI>R9W)O>dvQ?v|Up^jdrK zbysbJ(zRL2S%0hw$uO;$8pRRA5Gq?(+?Y92;icxXkJ}#la$7xkwea$*yEQNFEMEPt z-TF$^i<N(G&yIT^_O|@@zjk)5jt4f6H)?hC{+QUhIOqlA$3D(m#ux3<FWpWRC|P)+ z;?;era{2u4g=Go_lV_g0cA!4;1^*mzL0`AcJgl(`dWz!C{VQL3;JK%SYnkKeIVOHZ zFP5DAFSK4ty)jsgWvBMhAk|fqKLjeMw9B0GpJ>VZ+-u4ME1oxT-yNrhXQp2~-*n3U z^Ev&`Y#DEY&UneRSYJF8Yq`Ez!}~=5+v)GWa+K#USm#`OZOs;`+)j^OYctQr)vxtk zGATab{DOIow#yxDtKI*~J}lAY*R@TYZ}|4;O5Q4&FBVU{_PFX5SGb0H9o4S1u&G_S zf7`8^9sBmZjA;)3wD$~;_0RmXXSkC~Y}R-04?X8?X_BCS>Un6v)=BfPaD7v{aQ?RJ zGOx8^x*qzCFN>!#J*ZJX#rb#N)eH}|%j$Xcd<R7K-V^aW%zaOB$=j@1uE+m$6|I}% zknAlbv)ns0zccspvS|lTG)-hxo?WDzE#TGp)@Bp;`~ydtI$4Fe)y#4<4#Jo}6=XMe zPMwx9-S+Fg=|;aAmNU=etFU_TQsv&|$kKue{p^RoL1KPRwz3{-4PfnIO7+64Q~fyX z`_=zd*_~{f$!g4<CU!<=#?6o!kuT~6w$Gd!ShM!~6T2hdtn$pX)8DQtk=f94t-vxt zx$a4WQh@7^IghlQz88esL>Vv%=<iL=yq!BEr)BpMzk3&CXGtcnvVCrvBO&>zwCQYO zU54)V*7%00&bKtCO<CRLGNGvdhgNF+mFzqBR^NQ{c=4yq-1-nXg@~AGC)bsDGwxR` ztz(|wCDHaiU|smtD#0BNetH{Dz7M{u#=S=2*0QCRc@a*_d8Y7JADpx9SH{_5uUC)O z&tBba-tp6AzH#s>>2p7Sb{JmbGv9Dc&-`}aQ~t#b2Fu>Kh<MN68s{VJS+r;QHV=iL zyNc@fE}diZAm?pc`1+~Zp@yQNd>KqZN#f!w3beU9ua%a3li!_N5WCWJ)mvY)il38P zawoR7F007N_xQ3T#b#rKkAJw->zv6)SSP7U?Kms6qHMSPt{2OiXMBn|Ww%k{bIrZg zzj6fyrv8o2wAB%h`Tfr7$J`?q&)V+Vy>tKmmoddv-|OoF1I1U)jnCgDZ&lNi-V<e^ zlKFQZkH@F2>q`U!A}Zape2w<K`g``z**y_I53e_@HNAYzC!F=(w6luy7N7kbv&`dP zu5jhng;!30-u82y{F~Swmi&!xtc=vX%_knnn$~Y1E6~E;HY2U8-TBD`@uXzt-p<Dl z)E{j)|5Dt^=iA<Jw$s;xo@{WOK7SIUM19k*8+Eh#Iz9Q-cdTZ9wbW~K30sW8^QPV( z6WdI`y}h=bXXzrb#oe<P2{gQYqd!@PeMdul$*&yWl^JYvzRk4u-eLP_uksh>L(jJN zq$M0b`GM=b&M!~%dMEYIS??$7Jkb|+sy`9$HfeuN^bTjSta%%S)y<^tzGk1d(Yc)e zyX}>b`atHb(tFu<y)t{3WVKH~EoQ<o@8w2KCUG<D?np2B*wq@fI`Y0s$pgk^roHTn zf3(h;KXT{Oh!Z^I%_nd^o-LB)gx3;tZAP!xGp34pRD4pkVfm;hJ~eB#>f8$b#OTdD z-Je%GBrd$56T)S;i(lbDk#F#VJJlVNW%fAyOZqffd`|t-)ZJG6+qYYnxGa%~6k1bY zxGC{EUkhi8rc2_YC)%u;OqooXT+Xvv6ecFlo2_BE?yE*?*4q0g6HZ0`mhqJ}a%s*# z@$USr1z%RCO7e9mc06=Us_^_%C;3EM+_}9lChe-@m1p65a@*zAx0xE8u;~8LD$2bg z_1W}4zkiC>6;EiW&z`x}f6sb0Put_iBKI!ZwutLOvg+afYY*PLEN1#-ex-Qhp*gKt zvue*CYEtrg)pY%(_L1w8-&dL?Pu=}gfgyhL^>2ksd*v=??g{IdKkw?ijlHH`ZzjtW z`4@d=o3QA>q5O;6Lb4B5^9X&bmUMCuaS&M|(%Q<`lCR1cw`pJOimOlRtvxon%+*lt zc8I^`Jm<-S!g)6@{8E-(uufYfZn0JIsm*(ir3Ulg+agpo|JUskQ;$S{z00QhF?P@9 zh`8_9J_#AFnO&T7JBzE|r7_2?C!wqL&e6v{2kVm7^`=TxJnGQ1%!^GuH8Y)izD)1T zo7*eQ*bY2C<G?=klG=e6P3d||RUGRhb6sSZQnz}taGc6osvH^NT7Gp|kp1L*Z_^ul zSBQGGx~W93n&f=QzAR(<Nvn+~KPcBJ`ObcD{!w?0@cl&Z%O1~`l-B(^FyoBn-eX5B za-(NWP=0RW;aG4iW6J5J<^`(G#|8H8xt96A)p33FvdhcE>R(M*J7M}&uf;;$uH90f zrq&Df{yVYh_nv~sPycpLT0eK))q;-GKi`$@ez;Qn=SATOvuEV8_-uH)<Df<NzHN_} zgeITvK03|qtP$VV-^_1bM9rTWeO;ii%`$7+iM0ENtZRe=%6;c}TQ2R7e)nAHyzRxh zUln!t|Gj*v_*(GgyQ@j-LJD#mmQ-Bv`sG_>8fdJ4ZAJaRCQZjLk>wK>&Spsz>)0I8 z8mss@=uMA@(2Q$qKFjZ(+4_pZdXZD?mgxoBiO<a~L@uvXp0~XJ$K!nq)BiYKX!t(k zLs#5Q{f!0+J<9bLe5dI5DW8d6BEwx~%x04-5$5lye~@F2f~tDY#&c7eO>Ig_A~yyk zO<%hBpODvKU$eX;_5CsdEVq)jGhgxON$jtGmFcmqJgaNtg4=VoZoVkZd~ou}4>c)| zs??2!L24-xWm9ZD+-Ez_)eczoGHBIw<<sY0?6I6v^p5vl^pzE>W8+dM-E3C6UbQqz z!%TV6{qMg$Uw^4S9;5QP^@d2L*@UB=mp8urP?1x{q{w(kFZB7DEnK_nuM|7}-15cs z?w1wIWua+mOnd7vUEILj*h<%MQ3#Z~8%HfqgU+4Re2j`P98vyaPMvOg+c+qO1g z?w>Qs0)ev`v^gg-S@3fv^gF+vu9#v|<<?OAYo$r;gzBl?ao(Jfm4ByfG>v&VLBVz} z--+W*e!e=V^WL0#kQ#o}Vy(inr&H>K*PlvnbxMjXzrR>TTzo}^c6T4=(%nrVf_)}U z67v`q$p@%iI8!X7nf}yiOYBo8rnCmxqPlZu6Xv|Uqj9x$dTxMSr<or2+Q}E{AAD5V zp(b-;8p|e8+f6es8*VIptJ3|CQ)F^el0rt%#Ix7?_bq6g<GD=I@s!Y}9}JDB7R@*= zReyZn#`2s#`ySIcx$K(asq0Q2i<xlQ`}EH}&u0H#8hG}_x{F~K+qFYn*79%XFQ5Bc zCMdsZ|BBeM+106Lk9HoOcVTblLbv6;KNMc@ztQikOt7uI<+?Ur>aN@B<z>YkAMMyT zeZS6cmlh_dIDczb<(aK9SJi~1)g_8$m#wR5HoX3|zG!2Jey-52649MG6V~;1c-$zm z^i5tDHeppr=J~AFCqm)!CnsErkNG%lg=OB7{Y5X=pS^Q>!fY$1Q)`x2ZH^Pu+H7=` z_3wt&w|j1_m?AaNEV=iRqebDvr*n4NY)LkM&|9=IuIp7qKt}_&1h4J6%gl<pHp{MQ zzPtbNI+w#KfuOeflUI9g2e;*Om&>$HG%uImEpNB#Zmq*tea|$Bu$<be%9-j6!M?{> zkE<RHd9&(!*81|xJNKRcT=Q<Pm3Qm?&Eczl?D@U=mRoqwz0Z4o{M9kcJNM~cozxHK z=ilm2K9_KOXFfNM?MdC?5b=%A>J%L%me#b&%srU7wPf;i3BJapzbW+>%v5IWI{ItR zefJ5H#kpZi<8(q#UA(d8JwwJ`hs2Kyo@jY=#@99+{p)F7KTG_as_ZJ>NNbPVZ;wn4 ziDJG~7VvWVGq3&pvRA!RJCwHX=8qNqT9;WO=FM=|hx5u_$9KvXOIq)^&zQwrB)@W^ z{)t+K%EmnoaenvC-kKL~vq)a(etml8+{leTc`sRVM*O{2a&C`DfF0ZEU!}dfCYvvB zoA_|zhR0@i8ebWC<f*s#UY@h;*2IaQxQ)anN$cc1ynJ-WgmcCUO8FnXABWpdZnWC7 z$=R+~r1%%pq17{9aJ}pnkd5lRBrd>k^z|>9TZOxV^vtgIz6)5C`A*S)-p=~OOS6t{ zt>5r)e$Q3;lWqU4%6Dcd3wb1MTzuu&GUH7Xgw{v0Y&VYE{6g;OhePgm#gZrHrWLLC ze^DG9)!wHX^rK_9o5r3AFL*!my4>&RXwfYXJ!JZRMp+Nr_Y0}dUF4o0Sn0T6vdSgT z3n8j+<=P%vOPI~ndAH<=z`<L_yBwC~*52H*bJKps`dzCwWbj$2T(GPBF|j>&jpkgR z%s7?LvCkgre^#Eou|NH2QQqs`(By4Lv`^<KYU&l8SZJ2)y8K~Gr%A)%lx5dzZ``V! zXsMF!wd7~7g_p>+bne`S!kK$EG1jfL6@I(<#?2_{toe3LzoLa5CwOTsYQMEMYU7%D zXDub(T;o!%_%X4*T`=Z*+QF(++s{vr$8B!op7(RsUi&Gnhwd!wnAoaxXW@+wdCLV4 zWIp)43HcPncK6EfGp1s-M<r(a9DlaDlEvhdmi3gZr<;$YWPM9uKgLqo&naWy_vv2V z3<h?aiJN}hy!$V@v$^5POVyo?vbR*9O}LTrL(qQWGT#sBA6=^~h5yuBhX43?)N!`C zx0YaqtJBv5t0#w_J*-sD;N2juxThm<&g7{{CsqD5d{ImkoZ41??bnGnpFO>|otBBZ z<Y)aX$J>3$jOV`&b$<HMdZB+`c|qP3$u<rJ?hDI5+ge>%)_G-F$aA}UtVX7%J;dGP z<aYh$<}#hSE2H*%xU|6~-Dg*?m)EmBefZ5*hkJSI?wA}GYo*6)%~z>j4HF1$U%KbX zLQ5G1rsk(chpMLESRr9~ZL-`^X30HeVXJo3aC+qmH&_3d*naS9pqufA$M5v=<{U5k zP}wL@sXF!E?vg#5o-NFOwMLWQqW`p4K;5sJNz=sEuVtSa(V#MI`jkND$jRdJ3zEBz z*DqDReQ>#3SL*r4KHFdKy8Qlwz{Cwt>-=x%YG%gEmYw##b(Zbkl~2ikt`=+FT+Q?J zZS|jkB|kK0-+jpF!u9^(lZV=M?I$u^Ojh+<B>bwda&vy9Aeg;2$LH<&=U>y-E}hbF zzSc#h|GfTL$9q1j`nLzmm3u@NZPYX2NU+U|6MrRLe?iXp)_vvcK5FtGqutl5$ef)$ z^O@oCJ(IRSne)EH%O~4r181>o!1Bg_KkPaF-<=iojam4c^ND|t@87r}x#Yxwy!6mQ zrfSZpyh%R~2fbb+bH-T4c#@^|qLP>!e(6asL`=N4WY?c*T<gPRa%%aJYr>4HnODnq ze0s#VceBD;1<u0y>(xIwZ_hpZ&-u^qA1ms;UcHO2Qsvvkm)}@wGgF}W#i#ubstrsF zCpXATzcgWZU-&pyWxC|)^v$QOQ$IF+u+{81aL8q!<)zF83zzN}n7qjTU-zveXZ`+s z%x9OJ_V$mR>WPH%pTD*EiX=QTR`k2o|GBLuWA$zN+j~#mZhjK@dcR<O`=XUAH?Qyi zIoWktv%Poqu}AW!H~38cJI(K=`Nbdo|D`6knshF-pUM9Iy2I8dW%b^>ZZ)?mYaaTc zzeQ8zn}&xLYwbeYg*pLF)lM1y8tW%@?Q|F6G4Gnb$6$}SMD%IpOs2nmZkrcOn_Ru3 zwpM3??~5yD<uX^N-<*AmZ)VAtuJC%+;)y=9JH)tE**3eV^oQ$uyM8+BCLX||!6c%} z;=1lq=#`|O)>2da-@P<%{_*<d%PVR}o3<;xpN2LV?laYX`tdp9>VM}gz3O!}Xziko ze6Ca}i358-|I4|3_Wsfx=Ju5)roXqDnzql>;rhe+Y<lkZ=u=ap>i1p~(s*>Q&oV`) z<;=^9125L~Uzm{bOG4V?&l=D0c~2L6iQajkc*<F=pvFTcK6Hwc;+(bl0n6MUtvIzY zVV!qcRL<^Mlg?hhck5E$!8L(*jh0%?+2^-QW;<VHaf4ofVf%*;A?thrn=}8_H?G~w zSLP+|c=S$^uv*FS9SMHd%U2ZE7k|$Zs+L@^*=eU@yzyF&m-__mFBv#D*vkh;=84?V zeWP>eMeB#yz?5Er-Q`|$?ldi*?;Kz9OJ~_$p3cR$Q(m|;U$c>tc;#=^9K53Deb{&A zb^j_E4(c9wtu5pb>a|qs|E(8gc~;lIf4pQVyDCu2D*9XcmsW|k)lxB~2bSD___f|M zk6my7Bc*n>;4YtTrJS0B_vhR+?>Kw=(fNJW3R3f|T3(B+vvX@})x0h(>>clE#9+U) zZ@!hDb;U9E#Muh76Au4qTX9xN*=Oci$(z?^M6TlWKe*Fp(QWN#?UAd}%ieRF`wGkX zSxSCy)+yq6`bK0kE0bT>?8)yq9sd_!mH(Vs|FUZCtH_lr+_pZJVGa3dy~g(Svnb`X zOa%^)T7!1u)G1ZVN*>LbKhH`ed%o_n_8F4DCtY9j@#TA;^_;yWQGr=YUqycWa`V@x zc~S50Ds_HeCs~u<d#_sS?cXB_KZ@?Xe)fB7&E6+1@f;d6a@Ea#YU%tvvFUg)^Zez# znja3FtZ}WWS5dk@^XIIyi~d(EvR95@RWB2DxzX`c%A-H;o%RW>Z)_6K%wxX#BF_HK z%DHk!JlF+pxx4PV<ZknP|GKYF5?>wtGEx3q>K=}M>7SK87Tem`c_y+Q^VfWQ`t+xF zX4lKyRb@jaMH-&He8uc%t(MXC)11xWtCenCw@mxHg(r1m-0G|KLd7wq^45Fz$n)Rw zc52{x-MRei=ND;D<d{$IEL7!RP|EJxarSV=JiXLDakHMKdo9jeMte;D<UhUaML^q= z`JXI9PG}z$s?t{q{U?>UYzx;<Cr8a|>C?Ge*F<pWzrJzxTbxzq&74Q7>GBh!mj5s| z6yKJ$znyVPP!<0>$74<@I`zA<-Y>juc_B2*e2Ot^%+kfhQ=cRjtYbWWEkOR|nXFx% zJ$Luq%bVtP_L<tYxPLAiww7yltaV&`bp6GDp9(IA-hPq1`0MjyTX(tZm9;*IlkW*y zxYd%c##a15SmB+RgedLkRSGX(PW`gF-EVdI=Y_@n>vqY%3wXV7`M3Q1s=d)$@7KTm zEibo%P3!ET&}ddufhUhEeoSo3zx4d^2W8Vmo_=hLwob{m`I_ImyMO!d9VQ!2s~OKN z4L)D(+ILUVX#W$#-;2Y0{(troRoUh6RcH6A#922#Pl(+dwc70blfb*v4doVe>t~j4 zRNk&7J9W#9HnSsci~N+^ryN=*v!kRWh>NvyZoS;Rxqjld-`;-Euyj}&)Om5;0uk+} zUpzxLE)n^8%}aIn>kV6O+>8Eped(nAGFCs&{yA&&Q1AFG<xLOvIXK?f7x8olW4NjA zDu$R)$rUW?w05kTs4o{2>dEM}akZ2|YhL~T(73`ocb9osedQ=*IU;Dhrs$4?%tWz^ zZ5B>!TAniQ^&Jx)x@gYXus_&M^yT8VDS}Tt4z*2g-SN;R?gh`A3wnm_N7N4Y|L8Qy zZL;syzjXRaW>@3`<@JX=q<s^(S)JrLY8AdTUSJ0?;$B~Hc%j^AHo@XcWN(pzQbWfB z-xQ9rRSC<rrY%)BiSa(JI45=6x)ok4D^z!<P5S8*8J%la9}|DSWZmP`v<xQ3Gcv*s zHajQm%a93D6B5uY4P72kIBU&O=c6l^Fvy;KxMEA>iuvUiUagADjrF`H7nt<+`Lia8 zP^ND^7p=d^=P!K8pXTapG{f%Wgk;WF!5rmGf@cevAM&+W3%qOb(cmbbw59BZtlzxK z_PY<C2y>RTPxfCl<zhX{BCigu#U|F#i@f#)&Y!VBXqVBk(-QBWiI{(^=wEhNI{Kyd z*;A3bwPe|K7Mh;g($p?*xq#!!OS|PyESFboz4vj&5e|nva}wGo9f~SZH-D(Nak6<y zd)l!XS?4QxrQO<U<|Y)+kdHdO`IUHr=uG`*B5|QAO;g16Vwd(*J@N_oR{t^Z=NHeo zgGr3RYSm1wDVpD<Ih^Yy_Brp23w`bSfXQ-ag4y1pV_b`7R?m9erdo2!;pYbNGcQ;5 zC!Ol9|Bq+*QSb9f#)nZ=KJ%8IXLDN8t72)GJg0K4`o48Bg_D*jUA}dx_EW*5E7|o= zy+S9pTR6_12^oGgdotz!#@lSyr$#NlbuXoPy1i$FqenzW*YR&{F8*G}gu9P^xpI1M zg=EixwG%{f3_#jBzJ?4yN_MD-$NbI{{`vXr1>^xpr18i4@~q|Ji^ce|+du6#QaE{i z-z8Uv#HX?=O;7$<HGTfdJrO^Z&qY4F;1gZ#u5S(<fn+yhiFzUi9)C=%gN{EM<_Pb9 z>^Ch>sqw1LA~7j}7IwCW`X38AWbAn4q%(YE*zE<|YyI{MByD=XH)`KBrFLE?_RRJr zyX&|7x0>*5LP}5jvx`e-Is2GY&34WbER&xWk)&Lg@<=$x-uL*CCHGHDeGOU~X~lev zBZ-&a{?dkH`<APyh&Q}_^Zvi8{=p04bM2yoPx(5$N@vr5_^qRS<^_I@!>c1+Z0FqQ zwrF+IwBtPLw~V)KbnC30<oe%5I$ts>Sj>~9e%<UT^)?^bQxrpI39vPVWU8#Zw7u0j zW$lKScVenII>7^#pIjgVm4VEES8c26*(JX&;Q7OKE6d&owgt}G8@AhA_lRBQ-%Bsd zqHMQzzq8x&I7?er%~vscmY*xn%}WNM&TDQ4eVDR%%K8=+H^r+Py*~H;n8@4}zQjs} zy(7J)xqga$O8%wUdl{FOp7G*VvH2+^*HkgR+iUC9Nq&2#Z&(}IcJycHf(-!~Vp^>7 zci9CJc6#Xqyt6&x$rq<kZ}{^h_qk7#s^+%ezAbB|6x5@`8MZ^>=7!yzhgc4YEHViE zG_}d3(WKF&RngaJ!U==(z9RQaKDs}YogT2Zbb_RhW%m5~#VeiLGCuI${2LiP({8KI zVMaq1LmLks{m%Q1Ej3S*UKsS9USrj9>rdDA!yg_W*~Z2unJ&10LlWcGGk+%4+wVV= z&nHx%yZKw^_p1skpWm=p9eyP>2N(%8!duf97U{IQ(m?(hHlhIiPgQ`pAd?7th!a zR<*4^sy^ACPg_&8U8bIe<4Xinl-6nIr9XD5yE{zwP7CCD^Fhu{UEilZ>YFFuOpEm! zU6b#A+4ZT@OK$t^Ye$O$`Q;zG-MDPr(qP1t%5v((+Nl#I9?jG%eKPIzC-1tsIea_k z2H!AMZNKyCmQC5Gd(SI#B(8~zz5IFWw2FV_x7oo;Ra-xH$zI4<aM5A$$$E#SQ|%6} z49IQ!x+MEX#Kq)^87le8;Gt3LvRy818k^g=e`PB_Qep4^e5TDU^Cd%R^C^S<XNB_~ zwVZt?`QWAE7d!V3rEsBq)5+XZj+B2qmo)WH^l9%S8}iDgZ<FP<5MtdVY1pJG_DxkT zo$H%$agNU61H$fKL`wSIm&~c$R{!DT#Thee&mTC#P%&rsX-D-Wp@foy#?yl)Jviax zBE#gKHi<((X6D4cltj@h;j_K|`s^!Onecs4n1-m-#3|mMe4Oe1<tGxkFF*%EBTm8x zLdBk&c<>f{GC%e7lC(vS;Dd)z%m0eA?aiC%H$Up{O6P4(abeoM^<Fw<+F2*UyL5gl zpMLlG(&_2n^}Y6$?Fwtv)O)`B_S)v<E>GP39oUkly_=tKyU_XF+{<gCO}Fid&`G<Z z^EhC){eix9UuOoEp5;xSu{f<W=bLWL0dvOE>szi(3I4U?X`SB3JNMr#?|=S%uI6O9 zO>z_8#pxdRV?EAxq}hG#lKU#k^}?o~lX_q2&k%B%U&=1I%Tpljp;>q64N)U|pQ(Z? z87|NIYLRBXxj`n;eU72<-UW9y>wK1$>3VrZ@cd=>KZW-%7}qIg9FTUZJRWufGz!`x z!@T9PSodR&&tf|T?TZ{H>PWV%d6E6#&O}kxPP>>zPaigxXPoJum~rjH*W}8DGwQ9B zoZ9z3a9Fx6B5`l*&aJPWhOL#ISk%pXPkpve&zbPfS8K1UmPH3ATV|HdbQbo}-1xI_ z+vNLor`Pve$FhCsk(}dYsl@R3_Ll1Qwico5x!c{|^e*e)*m&k;g~J<XYq=G@UMm$V z_j*lvx3yh9vnAR1{flMu#GRYAzs`F&ckWc~dTw2VCr1uFWw3toXHN5;#qUC`P8^xi z$=tfPG%UkZ`x58wl6mDJCEt&TTmQT{L8$!I2|niclVbTE<!r9M;$(KP?IUksbyk+m z-lx$A7yesv*||4iW!!G9sSbKU!Yg`otQUW7`*vz)wbFUf$#3k-T6E=<J(M-~sJS0j zoA0D@Y1h1Z{S$Yc|6Q{!n#-`TV)bKZ1(9yQ2O7#uKivOLu5Z)pWinK|Q4+Rjad`KE z?*-KxBi0^2`Zm$Hf6BUxZHqT}#{N0?`Ge!~=%)*h9ef_@Y+`Y=%Cp5Xp&&_d7xHk2 z+UHB4#*6p4D?dA*em9*ntL@zdS;xvHVd`A<^XfO96n-zRxoXcebtO;L-FLjx-Z`FH zv3Z8R-Vw{gdVK5i_D(Z#%W{2u@TSY=xEt?(1oB>%+cp2|v-dl_3M)#?`70kOW{Es_ zcCos3`o$U3*u&E@HkyYd9F*gd*javHb!Np;-mM$+KA1mxR}mf6m@d8f*)MTJ8K!?% zE(+FdUKL+oxOB!nkLj=cV>554Dhrm0ZL!XH9g_W;MdOu3CSTVqcOS9V7hz&iOAUA3 z%`p*oj;rKU>)IWp<};z*qxN57{ponkuyt1oR=q#)>3FVh#Zk^1bsPQ~-TaqYar)?@ zOJR#z%yrx!eEb-5;`Yzw{tpBioCP>idm>lH#yQ!f^d4fqRUhCzGf1oL(Gk&8OOHib z)JhA_-Sm0mNyEo$)0CBjw#6L0=o0<mO4_{JkDK_vyVSeI8KvL!W^l8(Guz*&{>?%T z)9kFE{!A`*BiD{}J%uCPGyj2B?xh&j^?mn0k=kLesM=k3>Fj(LwF9B@6*fO-=HJcV zG5Pa(R;kD9CH;9*|JL8$KKn-5-k5bOHg$U2<oUClwqIe|S7P!@_=5V)O0JXa|8~AQ zH@kVO^TE*DPY+G?VLxyCSJ$vKtZVaik4du@H?8|S_js9&*7wsdrhWSU&v7E>w&}Uz z-y?qHyM)aXO!f`EvFAvk@?7)hn_6C<-MxNhwV3|Ng-YsiljNf&7B36AZCd}c$!tO8 z1lJGS>c72;eIghyrzaozP2%#jJ&W`7H%?AZn{{KC8edlaa{rZ~E2q8|y4Y@bZylfO zq>V8bjxF9@tWbJZP$hNJ`HTru7=JkgrTzc9{LC){=f}Hj_WZw}vGn)-%p-;|bN2ci zIwpI(H|O6UMnf4BLzYiWm6ILgYNyOJonQZ_apmjC$Gavo|7vNtH?8B-X<lye!@p<n znswM@lqlq9JlV=Q_tvw<rZ;RdUQ2^kw@i+EeueGT^3WZ@4zZy1dY?qvqjctTme!*# z*pt|8Dt;7ojN+Zur{}XOeDwT&*?O;@x@u{ZYoLuyJ@-Kl3)KgIZ%*Tncf2^y`Sg#3 zwT8=TZ!elL$ww^r&&<>}rl+s2o;ACC@$~f8|KIB;rbXO(uD{D!pnBTcde=vVyHeNL zoH*X4C2{_6XS;dAy9qOPuhM9BvdC3%$ZvW)!QgmeWMXCGLi@H0U)7TRI2@LL`yqDb z<u5+dymyaO3$1?D_x)Z`aMtDVnt(hLmJ>l2Y-?lp#yzxpoB!8#6Vq+)l{Y`6B)v%K zcp)CEyz{BxZsFTi7u(<6xw|p%_O!PfefSc4zyEk*dh&{s{*h(7+IWxLuCa^W_HRB< z#<y!f&E$l$>X~29D0+QkZ{3by>%G+%6cQ|Ar#;B~xHCV&=-vKHx6U@yM=72?aIP<n z`BI?XUh9|zt6LMwuHJLrUc6vY9;inuQko@F`b$aX;i@R-+9S2Mc+=9A*KeP_G-&hA z&b8C+1#{lUawTP7$oQDOWxvgxlB;IFZe;x3S-AGy!`5{IcSP^44qCYNCU>o^xPy$e zx%iA}o_s1b;6)t*^(T-1f3>h4_qrC&go!3rc5-z~9?t$^X;(Adt6J^W^D_&#`X02Y zTT?jqj?K9nk$<BfzkB@FPVS;xpT;%s-Y9LEK99xMK7UZ=b!W-6&3<4mQKG!8r)Zr> z(TOWM%&`ip-F0Hy|LE+jnv?%%{UJs3$a;O_9;^1O+6f;^PX16UoEDywe>Kkk?LGUV z)-8)!tE{Gc^m%>Cd-Ey73!FJgTDeLrw%R4_2mY;<+_~0Fe%<<ftLq<)jDHjzIP=hW zvqjWyvmW){5H60T2bK25bv#XcU;g=)XWffeSC4!<*JTP{%b{^~2e=y*B4Ae!>PN9` zDWAf2<TPiQhUS|LM|J6k73J=RQvENB-de6tJbYrpdf^<t&(7IvP46y>G4E1+>b2}x z$eyncLr<-^zGH9r=9|aepI(l7<sqj~^g?BF@9toUAH0RXd0Q6R^W0w;vwqdrf@hnU z#E+a~HTzk+>UK(_=#go5hwHMQ)^pA^st>Sx!&<!Sm2zfO!urz69beRz`K-*dc>Y}Z zn1}V915vy0<m^79&fb#U9Q`!%*BTv-T$Pg_jq;U#t*F{nbkuWFmrrADo@L>ytwl?v zUT%0?u#nTEBQ|Eip|v_HQP(g2HmO{pz13~&-ji(l^^=aQ>%Vm4-h>yPCo7UR&bTMP z=5eY)JyUzh`UyH059CgB*n0c#1y^&~BU7FSed|0r<N0T+SKD13LcZlM)d|zv@$GK$ zht+pb7IGl<qy8)?BWoQ;J!B!rtDfi>`y0C@IPWFhD6Tm^SLdz^)9T23vyvSI<Rn`5 zA33a8bb@>1#>Qhu3O@)J-gy3nTT$)zz12^%HH&U2luRh|*yUaQVuGcI(J|-GFM`f0 zs!8oVtGJb8H@~;eMnQX{kDS})FH26k^ggw>C~)OAC#%E{VPa03dAft^LmsRKbuJeD z&eKTrQaE1$UK^3$`Y}9i!!+@Ra=E<x@-K{iBFf%DB6@CS9pW6q9KjujTuz2_U1GV! za!I7kgws*!u#I`3jpM8N%dPbmKHALnobk{E9=70fx1MLb+HfNA1Mkh+vcg|S^uMi4 zl{|g+g9DEv&vy}LX6r4dAJqpPa=L^V-|&7UetgpU7zf#VCAC*eK}#n>9`+00mXb)B z<ND`NSMC*~&))z3{^8nh>G5UjnOo}j!kfP^9={A)IdLv%fx3SE7PfkIDbWf07qaz; zKGQi<efxTX&WaUF^eX1=bE<jHEW4-oQ0Tj9%?veX-@VkjSZ!YaylnZ?uZHg&Rm#s_ zx6LWoxaaTb^G3qouJ9<fmrY!;oqOx78p($oTTjlbbmT9b)O@@$&6zjZ$|3f;^o>7e z<rbT2&ab^*8*rKPZ(?h}MD5P)R`Yng9__A3FWmiq?NimH2=jEYZC5R1I+<?vNE{U5 zF1!g|AF;0oygs5RzJB{T<)>#hxBB-TJM$*`j4<<q!e@7zysBZn06yK%E6t|<npu;1 zGa+#;cs)dB<VnTC%YXTz8{CZ4*M7dtzN~D{<!qmx%iETA8VNi%@n9^5H2PQE=lD>t z_VPdO=D6)X%l+5>yP_DasK0uuo9Zf&{52ES=REu3UO(;b^Jp9W_wiF|-j?KUcaJ$& zzWsKpf9Hw*c?|V+(`;rZ+%A;8!FyMFdf}y28=oEx;t?}FZE@ut|Axicwa?b={uzAE z!2PVy%{S2|FRFwCuJ4YQ6I}{k{qWy)`T4(JKK|L)zWlQDHRVfpSI^$P^1+RUI|l=` zUz%r5mjpNb>-A@Rx_D++GtXU>j`MM88&7>=dCn7l_QaO7qkrC{iA_*`(-CD>=yGOl z&&>M|0(_SDRm`({)c?C}-bZdn<~qMK+D(c3j~r@f_5JK@-uF;rVuXzQjO`wlVsFxT zegrPs(ARl@Q)#AUVo&KZnKcg=)}GEf8ui<2*Tdk8^QAw35aQLYZ#l`dC(L5;=flTO zS-vmZvzk5RNr7uX^w(<&ty?#53p&Vn#8aS9uK1VwdX<Z6`U<X{Y9Ze)tlhdfY2iho zFs?Iq+4d~yT)3EBQzn3^h<%;bB5M)B3vYSP{%o}J(ADbwb}X&*_}XThJtq#IHd`2c z`^=lPmoF5(`Mrzz`q~#eKkuynQt<8d-PMZ~e?ALR0ktP)rK+4xZ?}Fqx%$^xg@095 zR$Dy--!PqdTAUC$|M-o6HU1lYZ_fP{z;HP3V{s(Xe20jw4fjEg8!tcn%eno*B8UIz ze34AQ<E|UGPCU8jK>VWVvr_j7unD-m;XZQBG+#pOl5f_+^iQJv^_|Q5Hy-5Pt$X`- z$<s)?ypV%+a%nbi7`yXB|1>N*9B?IMrn2@qQO2$#N>3vU!lkpNvO<l2x|D|g4qaLn zHu;3`EvY%bckexI`0IP|j`CuL_T@!e=H%2Ao~($wne;C8$*ZY{V-FmE8FY1a=eZvi z|KIF+GJj(A45=9pIA$K$vf`Lzy#wPbdBv}ln}rtqF%0_0sxiOn)MqBeUY^f+$DTV) zng34BLPdAU((jD9NeiACEB$f{{(N)C&hF_)@~?h*Ug2qT{z<juA455zFaK};mU_2k z;*z`jFFii<rZKin!7lgtt#XzVeCfG!SZ$2opM3K4#G;L+f<nri$8YZbeLuh4n~6oJ zK0$|b>xw5n$HbUI{$42$50^}yb)){kvZpCuQse#Z@0~2xGOM58uPgrVb|2%A1%gKF z1goxpFWDFIUq<Bc>xti{9rASTN?*E4!)VgZ27A}#>yyr`{nUH$Y2}AFZTkf+IV~wX z%Vp0O7Wwg)D)Y#`{4vpj{rnAWF$F!Ap9>_nP54`{a{GnnwmXhxXC@z5tb06i=j4+y zX0DUI%Ab=6X}2(vySP|9Fx+L+GRgZNPPns{I=s-m{d!@{jy>HEHp+G$f3|$n)m5C~ zhP@uWr+bUHiS-|Jw|IWz{<R+WtiRnWk^{{{6V~#~%h=X<;CVzn_uu#_!N=c;8Sc(B z+MM%BwqkP5|K56E=8Ml*4;}ls|7zLZ(6Taii@*mj7aY5O^U<qSF8?ZAjvl|d!nkbK zfprP*QWu-)_J-)sH+?lTcGk+om1nB$xW4TODV4ULw7$MfiRIS4BQtKU*s|Q)dB<a~ zB-ZN>F0n|ume>AR&{TB5`bd|@Il;I7ixb=ZpKV+CM1oDqKg$2rjWjE<W3x25=4yX^ z<2FM~$x+kT_R6aj%be_<J+%JS{`q9Jk<^cK$6s21R<@MvzPkCjTy%Gscc1s1)8ZH3 zPM6!wXsotvdm@{R|FT@(m)bdH&y+ibOQra&HY$ZyGT$l;H9dLUCuHv4_cy1P?`AZu zue$VL-*sQHRD<63cDri6Jv}B<HC$V5miUM){x>5hG+}2<`pno1v7Im1$*<&0HePyO zHv46i>4Cp%Z}n_<srk0$X8-E`bLI}y^GstWo_PMV=JDZDr_i}O4=QYv48I<Hx#Gfy zCo;Oz<4)`nzY|dRLH4%syp1bQUUt2av`}!{75BOIEm|rnQF69{B}`hSPldnP{1E?{ zr&|#H>CUk>>+_L)zGr@Yb7{()zIvI-m9I^YdCxdI7k&@E&}uDHVePzi_EfLUl1Hrn zg-g8OG2N+xz3I`B%H`^RU+=p-`PPfcH-0Uz(ES?EyW{r#<w04j&nL&9XDyI2%+$NU zTigCqsqw&dm4)>|d~@`f9-W`~BmQoAbo05`?fvVj%D1m5wV%*tKKI}QH>q!J_qsI` zChDkNx%2g5TmB~TrhTb*q~0(UEd99T{?Xh1=DUAbZs0#)d`{<X(ZhMC&T8(|WslSj za?VmW$};nljS)C;-{|N1FbnOHqcw~dI}=kRPnFF2<uUidosF*NUF*3jw;$KM>v`g? zM|0zq*Y#rOR>yOB9NyOJ+x;i(pVR&0+vC1(zrJkA=FNPcmvy{O)cby>FtWgF)!cXS zdB4rCarZ=Pl)uW@#TK*dRkX!%Ee+?B`<FEC-_b7r@c5j~AKWMF?r#4oX!h~N<Ubv= z)u!#=WS(YVkmY^$_v_bw-+x`rc~?LAxkrV3%?pu?k2{m+8rs_R3;&pUwa3+>kj3~< z)9*yvG{tU%@1IVdKXX?7e|nwWuMIOL*J<@;ojkee)0?1mIZ2<m*H2o!+(zRtcgy*g z=a(}5oPB<A`I`HSxBu*S`;qv~<L&*`yhcCf%6vS$oApu1>9;RyInUmT+<i`#{l_%Z zb0_K#$I9ES;JDiK`H(`G#4CwIDJF?LDsg_E6|LUU%alH|-C3F=Iy2v?XUC_IkQCq3 z52vqO)8D0hxc);*XPDQ@h;<y{rhOVq^G<{wyRi6PnBD)Mn?F3|-rp4JpuY1D=abb& z@5~c6{R#ZRclGkFk|;L42a~yd{#^H2svG-!&4E+Wo9boEe@vUq{$z1oLf2|5KaIw( z-`eA6PpDa$`1fMnsk1quo6ns;-ZF99j>g`yt&-7R+I(F8KUmY_l%|?`aAi34FN|Lx z>>s|)!ZYUJmW`&*GZ#m#K7Mtr0bAA~vq|~^nYr?oYh74#B;OnCe;Ja|@wIFM@3;Mv zHq~xkF-=qQwzS~9db4>xyh4|6=e;|6Het=nU#T_I6}(Lg4+?2~ttz*@@=|G$P3=u} zq2zh`S*Q4SGZfz3KUFAk--}zN$wycJaGz_p>+P4{bKjXBt^N?`WUEqI|MttfT_tjX zO;Hv~nYGbuDt~WH-_4=1YR}?apW=D1{yP76-XHPPdA(q*>Gf+a;jQ=Tr|B!qTC7_Y zy;j;aPN?<rDwF48$N9_jk8R51%vrN<vEQ^+%G*{|mizSlS&;Z^v5k}>w|(;Db4w0S zQ?*aZzBldNqeoXiJ?)lZYT>)Ymsy_qf4BOx2`N5opMM0M6;zYDdscBJ&u)IZX&f=~ z^M0h<JM*P?O<~kZQ|<HvQi*FGuH&yaU$Zg(e9$|V1moY;|37d`%ocU}`v0DLMr`^5 zoh#A0?~dHwerunm?$V&mA=Rg+h}DZJg}l4l`gqQsfPYG#f>Y)^eRe%!^{lg2O4md` za)xcu7D}*noZ&D-Nkr|M7S|HaC7eq%nKF}_THIZ;7Tw64vRGu*R$(rF<5RbuXQWxa z<*q;b@Xw7y7tDCh+6!_X5jav1Zn)=2T&s26!lVqrzSC>1I!-<6n*IL!ufk`7dp9I8 zPQCMJQn~$Jr+hx)0@dx`x_)0XSh;+4VOiAVs6y5korgXw{`f&XEXVC9<JXu)CeJrV zTfdDyZV?>P+jT+j_|*xI--f(-<09<%{LPZH%evam3f0dkI&)2S(!`w8ey`PUy*jS@ z?sB?t&Z<+K7hlfGxfraaer{%dk?ZvCcRH*^H)l4ieSG}UX5$>SC9VSYuMc*W%(<K> z{;x{5YJ${c^JfNZPq(!fdB0{}&;5JTDK7Dvx{4~r$LALQP~BJ-y>9-6&HuM7xRY7W zs>Gl)!Ba57R$<zW|K2lyJZ;+<a&6y+n$w>gloq|bbE~nSp&%v5LPvl{fJdOG^k9YG z;)ETkI&Xs(AB+!Nz`w?#_?>r>$c}<Jlie%T9!O-HdBk4V-}J9`;`BEM8BMvKbA9t} z<a4_GWaV`2LyX><Z#Y!`tO;AyW%^F#&h`g|UORT%)dUEhGI%wkEcTn5y2Z=TFXoj- zzF8Zl&p*UyQeR%{AKkU^_V0fTrm8B7q6;s){?qqv-G$}%?k?Xw&v?O}`!BbtT<g+l zeJ!%lDkfsx&rc;MxICCmc5vU(@UegX{$fM!?A>g!H!pFSm85nD`O7WPmOkRK+DUwe zT}^<a<%6%BH3w|`T%`^7sN8b3SGcP6%Gmd|kWARA(1mf2I?5;4&+n6E7yY@nd)_T4 z=PY)&^(*zNx&jTDueVEwojCXM(qH3{J&Dg!S4=Ct7^J)PlgjK(Ny)|U4cJ?3qMgoN z_L<l4R^_ktapBgQv-X>owjWAgtTIQe>z4JY89OU(uRF3jv~FjNy>G}<XWP58Z!o{Q z-YneI9yh_|<MVrmE(QHgc6?L+IdF&b&4bzxPPj|F{PO$p9VL%xA6_tD2!Fp>^<8hl z^nbpeCfo_kIUxJO#dnf*@dTkL!>~K7t-t3j%A6N^ZkC|w0oyAppIb;ie6{9|fP(pq zGl$z(9Fm`~r}TN?8t&yA=gM|4FMpb2|I71g{UW=iiBT@s|Fhf9s#qncoPGPo5?Pgc z|9{_Q*S?Cb;x=bq8b7!HvEQSxPleemJGIQ@nihq%%$5;aest?!mD?c-o#{zJrumA= zZyx&;#hT^bT2kBYd{8jVUtLbJKv>Y_%zJ~mx9sOuvG4lJ)o9KuzDL7uCcnm3I~{A6 zGoR&`-aoqS%BwqF<||6eop(G8UumlF|26-Sd-V<HHs$@}zc?Xj``>vnCGTEzZ4Z)< zEw7up>r3eQJ?a@dl$Gk<A7Y+<ac}p8?++PrR;=&4mf57^H|f*Ubh&p<oEl60ru+4Z z#Pw=imAmGC<H%xvmurxU&q;XB4ig5GgPy967g*Z&|M4%0HG1Xy@JrABh1L6(e#_-D z^O`zIqW<&++jE)=-+bhYe8MO)$2xQF{{8BAQugkjw(;A(Tn(RuHQy6wH5}3pTRoN8 z#IGk&c3o(-M@_9&`~|67#|qLO_D%_3IxE8aNXb#(pQl!wdw9d3y`<s!=kw>CHh!$j zou<A!=1s1dz&fFa^_5OqlFxJBFW;1Dxi;NXWN)Q!6z``B!%m5_J0g#5I{UCWXXU90 zH$so!2>>spf6o7qO|Iq2S2r*B)-Q#p|2jQddD`-f+<E=!e~&WC)}P<hJMr(5D39RM zo)n?H$q}tF2S1<9pOUOwSjt?P$zNp5d17MD!gqhq^4@+~aLQH8JYrkUd7W>SuV&QU zDgUBkpZvvPyY-!i&!5cpkPvX}TX=Kbwe#zqi7Oh;Vkvi<;#J+AQCCpxlw0msVBC3t zGp6WJOW%dC9>F@(UmJ|KCH2>9hc{K63hvA~vC$}xgX80@IjbzQ)EbvxUbN>?LcE#o zsn;4j3*^~fZ27px_}CT4nwGgXeWukLa<0z1IpZ6jcv#bsyL)GLU72v}!Pyom%fK~P zvkOZXco!UwU$`Qn?)zW;%pDn;o7!IfWcYPD#5iZROGV3H-><A&5~giUxX{vKTU9UO z<ft4!<MOpQ;m~xkbqysuGyL{k<T@j>Naz>;#Q)PDNXwn%T^%kw??AvhuB9$B+oaPv zR;c0Qfneq&Bk^!GDo*4~)*BBLq(=<Mp1{_A+^CNI$wl-hXPjp^rJ)qCH|X9Ws8 zj&gmkzrIh|Vp}9jjHb@JH8Czb4sD#lQK}@<UC*d*<Z|u-i_f-)M`yKu&kd`;rQ?0p zs=VmzUB5V)1MFLter%3j87h4#(?(2JtSe%J_ucRFFGd*iTt4~QDlsQhwI^0}uC$i( zoA31#-2bYbf4U`b?N!z~1>XFI*iY|o6{uFuHrCoWaZ<#(nx$vY%t|U;%l1Cx72734 zxr;fwvI14=i%psi)Spe!EuS#yaKy^m16@Ad=k_I<D78qN8F8*$<+-Tk<rR~-3&Lvl z_GfagwR&va`ab0OEq~)~S1~c8KU=pp`mw3-DHhIPd!*zoQ?`rwWz?%m&Lj7&n)}PY zGly7hyQ1j5N+n~XV)+b{e=#rhPRP2wdgu7gK>O3wz9&NAhwBR$?Cbks+sA#Pu0}r0 zpJCCw%s_v!xEpE=6^!>zJP18*d3VE9^)H86g}%*;tqIG!GF$Mg-RY$7&gHc~61yi_ z$t4TF-gZ0WhT&)9*uU9r#hXHFj&;3#yZKGDJ-^T4^|v^l^-o<r|8C;fPt*Ro-CL^s zpH+q7N?OLOBPUf^z0a&ls4viFzB%c`gqrL26DDbkPB5AsvDx$7k>KOyS_-_c`@abv zpM1c$_gSjkU!OVA1tAW;)_*p5Dzoo@CMw3dkE@2Y=ID=8w&kX?d`&|q=Gt&Qoc_~t z&yw>Y2V<7~kSkdju_;n&<5I3gwf|o(yDY>WbbEEBz<RbI{=45_ddR6CpQ8M}o@ZXC z+y;d?ubUiB+Uv->_&mI|=F6ML9ifxcxdQ5?n!`<>&gbaQn0m}}pU0cG{}nb?oB!}A znY6ff#;hn+%fDaV+A`_fx!WR`kjX0jYU;Nr^A+Jue|y4DO0EufQmNxU`Q+!(hVQ)H zEWL40X6}*K+mn;M!JSR<>$TP=r<e|9GS}D7sZ}mr&o2K`uvs?j!0su&Tc^sN=+`nX zGFidqwrIuOox3Jged#z8`u^Rw6;CW%Ee$7R9VnaMa!D)or8@H`xBO`5T?uz8&Q37z z3hH;hrxE${lQDn!vJ3SoN^!M<9~U3qxcAG<mJUTZ=`_Ekw|p$xQ_^=$p3C|DrQZCo zEQPL<jP){aaxWO0&cE4st2_6wo1;l^>z(wkr>FadE_qVgx7@=afBl<p-)`}&RhSl4 zI#E7@e{tF*XJ12)Ii1Ir87B6MPx>l&AlCm{idxM-IWGT6E#Z)kOJLYy|4+(!vm*YT zy2sHg?y!z|^T+V1Zd<RgoH@Ly_1&)zhdEwZJfAmtetl+CUd{|IxxI^~X_l#-O!As( ztyXzRzi8qfo5Nuj&AQ%sIH_N&*)*>>FP-nSLGE_V<F{V&)OCoS3!gu?_{$xe)&AS| zi%bZ0IL~SB&a6GZOq>5h5sUumtLJv#F*y1<m0@KVUsYxNM)vpmGa{L;x6AW&9sZp? zH7nFmsdtj=`}48&^6O@_d=ot}BYex5H>;NvI=gyweNzwppJ{7(+Ft#gp|C}s=+ucl zCeM2eO?%mS{bQb|=O*YB95dW;*sN}2x1M^6_s7;1mG@@<s1!Za+%L3i*Y2G=fA^YY zXWqSg=j*Q*+xvt37d7WpmB0Nx?MhknPMz7gSN6#7_}*!5>zVVP|5yE$$-ll7crWjM zv3%2crT2S9+4r7%|Dxt~Cr3dVpNDIPx4469>8|v5Np+Fd3pVAKF)|(RsZ7nE^^tpC z#Io8iUr*-j-oW;P<y|RL!n~&vIWH^RkIk_x7dI`?o^yZWz3HCvpBk2UZ2DnkZFBqc z_oZGtFZHc%u;V+l$5^Y8>1Sl@>w2}5{HZr*UgleFW>k~a>@iDI+w9wNGbUb-DYEA$ z*{PoBeb}MX%_n<)n)SSkCPtNs?4R~}&yl(k%bQu&p#H-ucgEbfh;~&IPLsgp{kzJU zuS~vEE40%0XI=18hW{Fii?#Nj+vb0Q<KR}2Z_BQBY@Y42WY!<wqkCVPpSj~&CU}sm z{_NC6A$)gC!kf-`9ug}#e^)!B@euzp>8J%Y)j?C$pULIqw@m8&9JAV_s86Xg=Gk&Z zBewXq*Io-eeY;*XmOQU}>G$E6#kXH^y!vx0?d{GyeDYYZqhxQ4;3=QqOwZ0av#sN| z?@2iG=H;2&*Dr;fj$7UNpnclg<-b>jZ=DtKh(oS^+w)_(N{a6uALV;)u(@%{e6@E| zm~S&1`3QvzA8<-|+$pvG&aXqiJKu5W@ST|WdiVV4kNJFFWN&USea;>yeA_tqyydr= z`;Xlgh1dy;?~cq*Wau(C{}FG#^SJ%ZhF<NG=B3ipGFCIZS!cnrGR8KUtA2gy>~C-1 zOMRP{zTlRc-t_uA>P7jL20iPAZ~nQpJ@v9$`6^{6p4pAAvg^AiKRgg1HMMGKps?0E zE8~M4-yHAntT$7=X08|bLcKrz*MuLQ&f7}meu;itniE;!^!>{7*)KQcuHsVjSouxZ zXxS5`wY#D#w{PbWdTdfIc&C*qkFBv?wX3r8k5$w0AJq#N-r3S0UjM**`?qcr_APO@ zW`|9>KIPNX@I(2o$uT^^3-&B_Uv2omaMB0CttyLmuGnsvEPf}V?CiuFJAK6-Jt@0! zZ$l6#dsb)e%Kgp{|1B_d6Dusd=rK3p(~Gveh3)S<R&3vx=*JQA#oTq<hePQ)YK!+P zAD(FUdTOFl==Pk*a06|lt@914>X&_uC}B+TO%|7!%XDhyF>}VhzVm$SFNi$NS;Spg zCA~LwU!Kv!yj|ND-r6#w^yS?zpC|O~x7@yO!R<rS^mR7t>%9Nj`gDQ*k!?XWTWhR0 zhHVbZzdmElF^w<vT5?fb*K%`;R=w?Qx8LY=_~^y%n)FpIhl*ClE$cV_^)7BjSmw`* z^`CcsRq@~Wx3){LcU7Cd>ZkM!^DK3ig2OVAul9EynbumhG9=;uJcZ^HhLJ8+-GzQB zl|8<~*)B};PtN_uIqTH7%STT>nf^-OwD*rP$No8%|F6V-;FMZDtL>zDum6P9*~h}4 zr+-s<6aHnn<I~0?N1qsnh&Mei*7{=XyY0q#j{i&R<L9hMUb50EZ}um1S>LPTYwk{n zuMc)t=}QUx^2aaR%yIve4vsbPdK35W=h$~T__D;p_)|~56&?7>m2~<+jpFZ3x#qP; zUOk>H`^DkOM5cQ&{6C)^dzPOzzw*_+$Lb~z{wDIPPMK!^aBuxX%}p%Df0AY!ubSAq zp69rGu-r<Q7zyqAi`iyRd5&HvJ=8K~tDc|FC*i*ik7JCdtbZ}HjxF)=M6bN5Yc(sU zt}OT!_B{J}j^*=<ssBP+gJy1+|M}+oX)~`qos(Zud9F2RYs5O=xBUJ+w>}r`^r&0R zpMGJs#PyZJKLz_!qTSR^YtNW_QFHI%u-vlqmmXg@zJK?`cQOy9Ht0{USL3fJX|kJn zEO~it;U{UqnMt<;(uA$Pcq=GfU;ciH{!jV2MQcxREPvIwLTawf^v@^Xq%Euq)1I!y zyRc|eg@IM#MT`AG8_lvLm2+bMCH|fNeINIi>pzu^wmw+V#Iq~-fuXhB=Av_Na>Mqf zHQa2Bv~@os>HMolV@?XUKjWJt2mjT7zEirL@%`chzhCbZS7y9-yy5%)^RWvud)}~K zI@!dx^6U~v@#^c}w+EG9`2PJc^T&IfnfaP`y5?>U3Vo6xR1)#)@^Q}Wkhrbcy<Rir zwK6r0ZhPML2{Suj{rpFX($N>b%Z{@zDHq%#lA$TL<G(}o)4~ZweH*guC$6{rd7Sf9 zrFDJMr;H^*yFRg&eENK;H2Yh^<;knRsHRLX|6BX=D5qd->8h1n(Uaax^KCXiwddkI zlO69%zlZ!$U0J8<S|Z0M^8ew_#PFl%`I|52W~|?q@I)<~%dc0{ck!uTFKh!F;wJgd zyU@fO`@8STQMn&A&A&bCmhJYB*xp%m<;Cy&`uhua^VEZeVvRqz?D#LLruS~CK_R2> z%stEgT(52K>-(j$?Vo0x_up{lcVAgGwl?j3dcBx&$(u>fnC@OEzmd$%vQLe3>L<|- z`{$49OYi6MT9x13cUgHG>Im#fsb-yDe(Sar99Fvdd2YtiJ)c^puHPxU=)etAxf#1u z>MveTIsGoNw#C=xmx}$PWt~sgzv>H#%pab~&+f%c*;HY&*2B-*SqnUG(_D&)5iA zAvv4dg)hrLe!F~D@1AwezK=bdFR!@D`?J_9&-?gPP*21rb5)bWziB7yw;qaYj8}hb z61{<?y74E|B~fSPHxcI+^ULgRahY|>T{$GSP_o`U&ym~GqmrlS_~sS5r9n4%Leo|` zTcn#UQjK7Dd{rT`qD$xb;dYmU(<-A3ZGO7HNHF&6jXI>L+hTR{5cfhp^^_EyE0KL! zKUkMKNON0A|6lia-$XX%mDm64%n9EwGNCP3dbZflwSQDgM8cLOg>nS!<Oy(O`T6~9 zMHBBOt{AR*=_R5SlQlfFQ<T<zDEH8Ih-y@JX3S*uJJGO(sok)5((5i(7bc4nnoH!o zPiUt2|5I4bVA&cX$Z5%XLes%d(dk8>;_?s1Pec@!ADFnXVGfgeii2Nc_YAj_b2|=s zGS2Nt{g&VQH`?~3^IfL&8%}+S+@Cls+rHRaJ&~vgogf-eKcOa(jmyZH>l3r}SN=@9 zb(d@2+~-pHUE%ZX;7*l{tsA>6O+2kkgtsq!_V;V)^6I%d#?H^IB4;QTpXHRi;NP-& zh1{>s0=B4(nisBtj8|D-98ODEnzb`>YK6G>7O^&#-*5L!{>j(NJ9!!N4Gu<=L;RcF zU$yPI#rnx}Yq{VbrM`L*iyy8J#ARFLEL0h+f2=$tRQ6%Bdi@5+qZ7lcc(jUQ9e=HC znY(?8L2>{G&+NQAjUMWcUB%uWdM9cx^N`1~KwvrFq16Y=Qlc`hox4@~&f>uKHHGiu zcfCH$F1oPm(BmmePes0%pZ)it*s0NnM<vcL_4Ki&x~g`27|S)I&zxT%Rv%fZrL}3< z(+{UZ)WmX9TF$LpHl^!nS3&6Gjv%SiF{wPZAD8Jr{XE~EJAU5>?FiPANvG#KT=hQo zm(6FIJ=gt(RZ-LZP9I>cDQfKeKWn90ToS99m+tAp=6uUa2fJ77%XX}KY<gaEEr0#p znA!^7*Ztpu^U_w&Dy_3q>)CRYH)l)z>a#aCWfca@xDZz(({Cq#d<JNEI;qFt?6wNf znvh3a%P!P1ah(H=Pjmli5S}Kn+hM76oC4R4Uq9+^=YCjuLE!aU1?e~Ss;RD;fx5v) z+su`0a&2ZxsVv)m_fGfhgB-T{8<`?kb#hO0Sb2T->xF*ef=^$bwwoyNxyEqSuMPFw z0@MFS&%Ag_Ja+dx+luBRfy?{ztpC<6ulD^YS2HDm-}7#~_1@j@)?SfSS<$LI>Du;G zhfC{gcXl@{I%R$9n91{%_w2vef9alT|3&IzcyX?8N$88*pG=D^Zz-Kk-Sp(X+QjKD z54UKY-FZ}3vrO;Uro7H8H-yx^uL?$Awb{h`rJ;Tz((rWfwF@lK)Bbeme%keyH+k-! z_qv~0CEK=Cum8_lv6)9-Wr9MZ$oa+2Or6|C3XM~Y7AZ7N`Fep>$iscIgAu5>V9`|Z zP~5rRflJeNhZC2k*H3?w)+gPvOf7su{5MZ)JI;-oG~;;qT8YH9v!dg5rdFP@KURN2 zsPXk-;rS<?J<e$={k;}-klTFC#%y={bF8p2?qADp`L8*gAJBPJdrsq~fc&jHg!Aub zX}6^X)TMeyXqkF%owWT<HN%7R&Ml|*?k<=!S^QMIOI=sb<~uym-~T;J>+b6)b**U< zecQzn;V+;ju#BU=_2e;qGY?@8VUJ*uOGj8Z`@62VSnh4;3tVw+R*cOVjqLf0XSTY( zcxY|Z{`s7^^KAnYZqR7AK4`RiGRq&QqZgE9rbm|wOg$=Ue*gdDD<*O#HYb&<5|1)z z?L4abzOJhEo{ZW9ue`US-`6Gv`G-G#vqf#|Bd!a=tq<KFKlGPabED@I^Q)aMnQ<?d z?C8GL<l7^fml4uZHhtm^MoF$oxstItr*)^jT04Eq4Msht-5;huxxuK;s5zbICZjCl z+v!?285Qc4j!s>^bXN1dy;FQ&U2nYil*RXr*Q0>LO%9%WI?Jc6KEki7Z+KbijbE-- zue}hf&>n*x&1q#!cIQQPWS1pp%(B^f!!q!Bg~PF#>CE#%XKQ@r@nC9E-#K5pOi6{+ zP28qfPc`%YWyOH^dt052qTZjibo>%=CM}v#^^In;&MKk$vI`N%S8jCJb6Nl1u`_)R zht6j$T@~@z?@%qb-13&)pt4{Jv&E~KVjI-ofAP7!sBggv)l9BWIpJlsdvu>~V%ocU zo8IL~Nj~43gJd?}*_~B9dzGw)PgGcPX+xZEep-*)wTYtD*S~KO7T>k^J%2#3)1yY~ z^{y??ecLBo-u0UANWI_mGI?S47j8l)w;JsdW#8-P{Yw3Xyvx?rLbW#-Wlvt>+~$^( z$^Tk8=g~#=pMvJTI`ygfEpe&UUHn^iw>SKMYb8<jV7d2gH=g%542oAdd~Gb?dpU8+ zGr?~f4<9d$(sxt*@>y4AsSj^v!IYx8Apxs9gFpP-tX1=qiCybwqD63h?MbmH8Tpkw zX<LrgNYt7gT(&A_?PR;vS5JSPvFK%l!sVxnoa6$+zV;-xmsyG*p4*~YvqF4R>&Zi> zzw(&JZ(h2gIP*`!#1D1l;34j7ecH<Wn`eckn|hiH-L_KEU&XYu>D{`7<q~CGmbW$E z39YJ{J8iS>pX#P-YO5w_-s}vi?~I=L_|E^<*n76udw<8qb<CKw_4#i({g$AA$%kYf zJmrWhZ7JQIA$7mTclz~7oDJ1#h2cEB1@>BZ#9ggZHEwxk8;Nw4eG_!DzwdO>FH6E| z#+Ij!@3)+DZEzCzoACS3OtJk6Tv3t^-tw$|r9yAw-X}W$V6<f3eSNm5`%aY(r+U?` zUCDDbx><sbPPBR`Hf_T#Idj2t>z!I&HLX28rH8MF!+(X|hj4L=-x~vBHb^g>sik*9 z?{vLL{nQH&7PtI*w6^7ztW)v+;_J2sM+J=w`%bL6%s<nDZ{f@xi$$X9I*K0a)_=}& z;pPnE@-tGM?_zdTPdMQEAC4<_jNG4398%<{Z!SC4Qg$oS@~B6M%Ml0G`{z!(UT>S- z!Kd|O(Usc)2d7K^e6)KO_XA(CxY9Y!(7B7|zl|k=N58S}@v@HFU|Cbj^&{b=w%`Ss z1(r(c%10vqDki5-zkaj#Lv&<M=iQhfAx^EBB^d&Shg7N(7RT&L+H~!~mP34#8caP- zN!7E+2}I~~FqktqxpIgy#x<DBW=R_{YJPwI^QepAmL5hXP00^O6;zqEWI`-fd}y|@ zdvYvEfukrnVcKKU(~Z6&3g*))A1GEbeQ;yf|Ki|jy{B)p)0yneMaN{H1@3nAp25D3 zUp}P8s`$N7)|QD9jx#>o)$*)+z_RkqM=kM^xKs7d9_KjK=pS)o6l6Rlk)l&$kY;B4 z`emQ>t@3%9do}0G+xjCc>d0X;jnkV#bEasiZhW%#hn&QZ=Jz*rBa)^Be5+{J`NY6= zZtj+I_wNhmZMqkKI->f%nTVRfwciH54iCjwU-eR6$86oX?(o(u{`s6=S1pWozAbT1 zXV1h>t3rgcJL_kx+o37{u>Gd8sK3*;g^`ChCi0zq$YKBgkB*4+`<MOuq;EV;%HP~r zFqPx~Y2h__{-0hjA9~`ub7fAHMfzj$>g?pjVa+yiN^Zt^(>CT5|4@itWu#Je)zExO zV&5#)Pd}Y^G_osxJuK#S-r~}6-S6C;%k`ccRNL&IAyK8XL2lx^>CX2Ug~HNr9y?JN zq`PFLm75XgcF#3V>mF3jSD%tRyK`6Lo-OP<XR<u;*cR~p-?KK^52;dlFWF8{dpq-} zoxkkm{@;D`o}~B4z0iy=GhTMz<xm4h5zpDOt#xIl`=_tI$0(Jdw#jQsv*D-f7vD75 zy{SLSQgVe~CM&UbrtREHUQzSkQWq{+7IH-h&$lhz6tX&w^G|Mc(~3(EM30p&nb%ai z>b>j+ucuj0wUm@+CG-lE-<$M#N4wb~!%Jd<>h?*q9~ZN!<VcG47G9i@G+p;TqfUL+ zRqevLmpmKH?pm0cZ2Z@wH{t7Dtyjsx^B%<PbC~m6J!e(P<B4-+ZrpL2DSSZR^N7>l zPMfL&T|UOQW+m3Rs?3R8vh}2{$=S6Tn^ISHtx@z=Tz1?2Z?%VQ>pG*@*+2F^>p067 zaxGoz-bAZJ^@T-!_otUDEAH}UJ&-P0Q936&w_c?5;hc_^$YnR(<}t{reENJk@g9#$ z9s8mKGuatlN!-zCm|mW}+oFo^+Bb~}>J99Xw|}N?*p`s%DBHZ1wPJDe^&{WTT(Rx_ zowY{xs<zit<3hu<7rHzSAD^-PZ{ffFN&jBVLTR158(gAU6UvV&dOUq48T_Mq?d>i3 z_18Ciw_(0oZ&o;SZc;?Yqvph#xhI}o-={m<Y-g}+?3@YJC;YE0-(w-k$FnqWWw?~- z!dL4yD@(k;WB-PQvG8i!s(oc2GB~I8a(~v%Iju9@{f%{#-Hpp<bL2Z~EX{O#dJHE` z{CeHT%utCxb(Ow${?`{%CA@cD*`>{t!##=DTjaA)ZFH}<w^RMzJL`<Peim?+1y{UO zQ(EG5&{Lyg_7_X1)JvAC7T+h|VKz4IJ8~{}lYsNaqD2DltCn3mY{s~Dj>J@NxkqV5 ztCw$GRdAGl=X7i9Ju{Dp)>a>~+Qjo#a<YKq#L~MTmUkZXOFi%Rb=~{?rSBHh^F4dD z)^2-6*s88O<#G4Z4zIhl)vaE2Vqe+Cw-vd|G^BUT{d_y+Yf)a#*PAS}S3Q!tTY26u z>TQHW?8XMGUlNjPi(<`8d~!q#ukD;@b<paqcSj48(5EX^(+}jO-p>2F<Y4Xk-&s>) z%Y9eHd#>4QFR>}vDCLjAkDzb0A|j0}pQ?68t~8nLnDe&2b>r4*&7QT6i&fWOtp8Vf z|D|W{7tfr(!F#6tTF-Xp>v^rEVuJTPb}&rx@+@x5dtp82Iv2S2S(I?vK%l<w$p2US zZcCNC+f`d~b@y)9wZ9up_Ppd_GrzRK{7anAHHnmq#|xLXN{gMG*Z+B%TBpF;!lieX zK-K{5Flqc4wf368t*;pe&M(m`zSdr^-lt&L+n{&ng4*&YElhu-)&5`QN^iY<C~{vz z$<YfZY(=fS5?0zY<Snqy7ya}?_VwFW?;;th8LL@0i|-HH6cX`sw-?v*h`nCtGNW1) zc3rBdEBCa|Hd*yZQ03pYt}VL-G^_8NUAAy>e|);kw-ljrWBC~>v7x-X4L!X?|9(2W zzP@L}vy7XvA0H=la;MMHD?IUJ$<AGm6W(g?DJq{bjitx!*N0eBDVY;OTeF{D_}3Hj z%4lB5OomlFA(AULdB|0I-(%V$kzsftX~EGTJ?~Ty9ryjg%8N-iZ+!c9m@ibO{oeje z=t3eXpHHu6&aB>7I^|~C)iZaeJ-M~aDWN`)X}glNndo7AuY?x)wEmE72Ru?E*6Bws zS7a}|HS5LI1ZyQdlkD`s&<iPx#p56R`rzogqU(c2>(}GHbxP4&puMczx3QMY?}D~P zl!r^DYWTalUfUv5H}ll56&6vJXZE{jFAdQNZ&@wnJ|(JTm;bQ~iw}2w`uX+bmKe_Z zFvhu0KB)`bNxPH3!1&$b53;M4m%iM>6LUaae8!LUGqWD4h9$ULZ9-W9^sHjdTI+As zD1EEdXSW@$sR^h!q;K&#IWe+%NrT!k4&n7*k6fOr?I#p&kUK}J`qqkTubAu~v@AKI zrx$S2K2`syKs~F>+8YZ`zd-6*S^k7A`yqPOPv05&GR8-n>b0Ls{#=xOJ(hj_LdI8L zF6J)3|Gs3s=Dp^Ap;wA4e`hZ*zrOS@r|^|Sf}XE$8!5cJzVA-Gt3%*Z+1%t=pF`fu z|C0Z8^pt#6?~Bztx2f&Y`m(Kt@uE!b#n~bI0-vY`TCCM$yJu0iq1td-sdviti58Ko z`fjXxHZgYrd(RVg-ple&FLFfwket1#P3^{}C+;~DufNTgc>Sa{f1>^ggC%#XYyb8r zoKRQmtgMNA%2C|)&Tc|TTW>v^yf@1_e*YS!+5MY2uf5&A=~(8{Yis5(X18o?+iiDe z!?8NswL66y&c1p7_ppA#n$O1Cv+r$pp7EMzN^8~XqjM{MheaEjG=I{LJ`}Vva@EG0 zSrb)coSxo`wK#W@`>DQ?z3Z{aJgr_ciTh?}RL-F<{*m5ae?!3+1Oq*Ug;i{{f`nbS zTde^t|2fP7UjDO%_YQ|`jr+5LI;X@8>9({+i6)76s%_J6Xr~?558-*KGV{)=<`p{Y zcC7p>zkJ!p1rI&tE^=#&1)S8?tNeah`^z%}#_*!-^*i!;Cs*x~N?&feQZ&3_o(7M- z6n}lv(X=V`@&V^ny^8I2r(W7u+GFf`bp^-UqL{rp_x+BZ^D_}FImdT3M=S1z&Oy!N zImdObdTe`oWS9C82T|LXyRI1;cRMJ$PS&kT=$O6hhQpd|=N3NY)vbFq<+^-r;JMd) zx+Pgx<{X|V{;$aN7BkD_{!@v2^3{HCiOn+kar@f0wKa1BlULMNKhTqT{v>c7r$zBZ z-k|G$IU@h><Jj?Oi(AHp-P1RD{;g}hy-~Z<xio@N^`qLoNIid>EqjjmWN%o%eWluG z4-t<KhYXfQobs-nr+q`8)n%T?<mF<Y)938E(qnv{&CXKFcysp0LQwx|w?J6e9HzzG z^DL)N+LFK4C`3N*;e?*Bdif$h0o_aYa<msLFiM@^8XCYU_1eNztfTzb(c3d_3VQsA zTpJ>qeaCZ0{=vsn3d+HYVj0}mR$Y^yx9#@Qvpk<)v~w?+ea!sZ>9n^;WSuUoNPcak z+nKyee#)a6Pu*l^R~Nl;NW8R3YW2-p)4fhB?`f$|`rN^hw<xclH)LaZZM}bW-va15 zBDo!heOv;*{V&!3rc$EKS2g#(a0%xkuN&^~FFH-1x}}LXHf+(Aj0>r%kv~BbpC3=` zyDd4v>V$-H!Cb2arYR+M7yVcL6Amhpt&MT8-(0`@(W#x>|0Xtx9J-eJ=+ys4kwa`; zlc$AxDDL6R^H5AtYkly9??Qe4+=It=|7M(ZJH+M5PHnXp+75n-qL0o_^u5}_`W7-& z>5_B@GE_Ms_eOAy!fgh}XSYiYQluLMC6qtR&AkvY_mEob{7)-2cCRYGw|vop{U;~C zWH&oenQZ8}O+omY!siz)J>n^Q`2H-I@Uf}q`p48g6-V>u-O1{_`|fW2gRd2z&hD4g z<xu*c?fv3imw@|ngS#Fq_w4q5$f`J6wpAwIdsoEG-CMj0el@n3JQK9^ny{uP=$2yS z%r!MXXFkuEG_@eF$XNM+=lc*L7WKV5n{^H?Uhs8ULDjMN{F3`YzoY6+Kr3dv^GmQU zn5jpsn3-MUyfJF6%mV8Gp4SCyZ#h5ubkXd?wF_o##@zW!_Gn!_5~Z|EJMUDunikLT zHp?Z&V)N?j#JYOFXDf>%H@Pq6<=wkosx^Ds<#^o%>Ral;3ubVxm#K#=nBk9>uzl<y zzx|HB%Di234!`;MCuz>XjR&e+c2$>t^HQ_;Hr0Ba`@$vslcsdeu1q}|Ha}Hb`M2lR z3CmtdoK(4^wvlURllbJzMQh&A&O5`NHhH$ELtjca@04WD{PcpWk1$)`8P{&l4Rqbt z*;3Ca_(WpX+pNEDvg!nd7JC+?yR6(&-tmlmvDDFbX+n*{JD#+3t`T~g(DP^U?K1cO zYob<7dwpl&`{+v%<)`L+eb~%(it&|&yMKcHtcq1n<2*7_X5TNKw$L`YZ}lE?k+MRr z;C&4`p^IPLp1E<-|36C`mTk&S4t`#paP4`I;#RYNZT0irkH;IewPs2^^R(N4e1TkC z+9#L2SsQno8Xl05@z0xe<z@QoAKZ${Y1ywUr=&hUBP;it?W*3wd#)EO_ZTx(E?qHW z)!KiipWCL^gQigXmX<zFDfUbJRd_^Kt~#}ECv!&^pTm@_j+RUR|JCgJUfIU6*(1`V z<_>FAZfKp3Ur+tS>@RLluFolm5jrEAmVLEo&*RO_s}IR~*!RV)Pj;O9sqfbfgJLb) zcVG611gOk8sx|%f@&lZihHK_uWtwrhB!5Y5;avIu2cN_q5t;MI=hVA<vX>hKHy!0r z+m^m;-dh!g`gvcCf4zKfzp(O&SN%rD#U+U*(JTMi_6W5)Efx82sJ?z<TH=ip_n9l| z49a+y2G_aGwrl#*{KfcO#a{itVrMjuFjzXA6MwS7Wunf-KQo-a_GtdwdoB0Y_Wjv6 zs^>Lk&E9dQPfYj8=Yt0O{8Bz=-=F3?`_9TfJ-<_D?k|va*Y|5<cFqiWHPy{`#m?7n zIF4C==eNG*yyi*4nygv=5qs+A=$l4G&Xhf${Pa^tt>*>y+ta^j-xO36D!uXL!9+8+ zV6S#VH=|Aa{MBxlg|bH0pG^@~{xoITuT9gt-Z08AWgAal@rF^JD{es$W9?+$y%ws| zFTP<EuAh55MbXbdl1ZR_{v`QCY3;HZ@3*dEv3(-@H*PJ*+siwirKoIUE4p^eT<^}) zoP*^%PyT)`Ycl1qmY|dH&0|xtPB8sF7$QIagg<{<uC(yAg9i=n-oN2}Q}-Fu)V<Zo z!uyt5&G4Eg@F47neq{Z$(CSwv{tKsFOPI9p!ezVJ-uWB>^@SU~&41iE`RRo9m)SR7 zm+iV<d*RW|W07vbXE$6lHoLlU)rmE(mlsXG^!V`y&eQ+r@6}KAlkvRuPuuj%8<r!N zOqTOoz2W7%>AT15ThgB6*DpWRaJhMH+k^<uA2&LGzK>7!Y+&IqV2e~ODoYpVW?Xej zeZGyB_G!rgi_V72ZAU|j>kSsT&1d~SRgqCe|HZd+A-g!|v9*b8aNM-9Y>xi*tfUj1 z-`<^@HT7_i3h(yqET694{w%Dxebte3TB^q~4jkZrdU5G558YK(f83cbZnKDY*s&}) z-qbhr>Xu)JR+=8I<`>(--}1I<nd4U;M*VqT@1Eb5%@XB2asC09J7-Jxn@?6<Szpt& zWV!w8*!J|3lfV2pc`W>9_p0K{KaYF~|EFfYY6{Pf%OBsL7XFd@PkYwG(`g5rlcw}M z*%kMqCTyL|n^!T5Vl&>|`NbQwRwZQiS3%u$D+Tw%D*t6?@@=jZN%-PAhvEJ=583|H z4(H4m{l0yCHGAjT=vlg={n?+sc6IiA*z<EDyHVu)n$_Dv7tQ9Eaj5Ex=?;yl=<aT7 zJ|6wD(04<{&qG%PU6#}<=T6?yz3-Oo7rt+HCYIBM-ZL84OY7<FXxkX6EhC=Q!Ron@ z!R;>V;Wd@#Cq~Z}d{?@x^3J)~OAAx^ehPmztzL2Y`Wy=jg%^@*+yXYoX<dEYeL$$j zz2WF?5hk$`4!Z-2KYr(~UTku*bnVCbt;MOmrK=<xt1V9l?F)?dkj!^ywBiX|e88aB zbk}cvks4RcDP7$DKiM3<PWSkGe)>c~Cdqo~{gP`9J(5lxyeyWfFloo(4a?d0=N7CJ zRI^^9Wd1aM>*?3sr7^Qw0|WNOoYLQxGsEud*?ymn2Z4o+b1DuNM)`_wdOPcT{G{_@ z$Mt{iUz!uSXH5$KruLhQeWppQTKW0>w1*)HA8q5AXKN;I?)`nW^=Nh8Ez?TR%ll(9 z%0wIkOzOGV&l<m+K7WsJ@ihKWt3UNeR?e`VdP%+hs!jF6=7s;hIiH$v{pqo-e!0sJ z_t<TY_&>{T!>*$*{68K%+M}<}Exw60Z*j{)t<=x+W}Z5{y6eaO1o4wBA4H{MO?G9J zB&U~1&Y9TuP3*D8mQ|lT^EZa&AG~s^yTQSnXUmq1%;e<E+WOlEF5X+T*LTuh--}Z= z?3j?!di}%t4Z9xOA7S0Hmvj4Gh14zkJ~>-=UMs&dCpGzU_v?;*GyOK%PMcmod7AOG z8-`5p-Bpx6<tZKdYhNxXB`i3jgTur6;<^boLZ^4+9oj9n;G*{jU#%+67piaSY&t&+ z6>Mdi+ftdic(Q=B`a|aHXX+;hR>--Sy<7YvBfxy>ueU!dSJ%qv&M3@J*peg`_ohfY zc%_Wktld_sI$qk78Qg0p^YWgYl=n$YY2UgR8EUa#rfzV$8?bTV?0F1^bwa&H$K16h z+P&_TJMh(Ed;0mi^HP=s8Q6FJ^o%)rXImJn&=k(i9iGMR;{8U6mdRh-gcnxVFTD3c zY}&$$_ESATgjdXq`N!NvUd&%q-}NtZ&y-EE&g`awr^KV#MR&h<eY?QVAmPHnWv&}r ztDf$tRFGw2y1XlvMQ4t@rJJCaRPvH144O~O@BaK{sT94fS#ciU%C{T-#B5O7{=jeL z+-76d1?z%p&#Vl&e)&zRM{nJ_{I*-!^%9wDBedp(sz|LotNS_f(30@oI|7YnzQ50H zUw2}4MC2r|^q?DC%^%h=&xzj3dw*d~$pRTsLDr&02a^8FW{Q1wbToO}x95YBWZYsI zex9PM@07hh@B9Do{Ois9>x~~Dtn}%Z@!h`qYBk>y(YyzVn`82KJ(!%_qFLE$ocU+I z$;6cUlLy`yzuUU(Sd8Uk6;IV=JKg2G*;|TBBG$=>JQ4JZc=f*JiGGUUMH~0@e-XLO z{ao!^o1ZC3%haf+b)UXHYgtCl`)N;JZa8@1iQ(SIPviFR9Fw{J`{`@p$TjTSBbcZ9 zJzwP<m3!!<@r2q(hH0f$8kdgy9a#6~{+Wa3MZMW~OFQa6P7GaA>Z})SZoc-L<%!+D zeHCRFZTWxkRm@iXsb%I)V)rI(+o#VgRR3+N9@DL`dlwDcUmAY>m-i=c&Y3^V*Dd0G zZ_FwVeUUp;r%@)CuV|*y&+R@>r$#+ovBu}ZqhAN_9i4k7TIKbGJ0~ykD5aS?%S`?v zvCwwzLGN4dg=gCucE75hyg2aZ?{mh<Z2#|6f8jRfDf}Myzh-lV;e3guXUeCC-b?bk z7|kBkwc~<7!;wQjCvvJ^sgmHG@o<m0l>1Vzy(K*tIGWqc?Jqeb-({1Vq<x_1NB@8K zxW<X;XDdbKE;6%azE;fE)!OXlZ1t7z%(kpoY7atv67Ay8hkttf@}2|3!TJ{G75A!z z)qj3)`gruKy848tOE2BpE-tQZk+j@cC}7Rob0?Tycb;lFwZ%2H=tg(*t(IFYx3=)+ z3UwX%WoZz&;Y#BBr9o$N{a^Gl+zK_?6gmG(TxY5I&CLbRXDrKGEVW1~Z%NzooR~A` z;v9H$`*wU;)4alOeZ|VZ@$J)YUcRZ|Ed1b54{ONf%ifQFKjgY2v+O}u)w}5*zA!4( zr(Hg<E$m5uk&1clTciBa2rZLt_dth~?ek2p*PSf8rL#ICV%;^v={IMsTy0mHkutlc z++fvZ#?oiM*i-@oT&}L<-QBT7b6Tv1ws*DXv@K6G<L1?W(J{>Md)n_|dib`bp4Rm{ zx|7x8TsFtV&C8sgej(0RPUho*AF-LoChh*2eY^g%_^Sg)WLRGuIHA6|^6b}|sXNtF zZ?4R(d89ZqbLpWD-?&wLK}JOqY>6iljjFo!+C5J@Cw}FhtmZAz?aAbFx8_2~Ds`W| zOZbl6>D?z2*2)@q!^~%2xXSf2@^Yubi)3bej$QYn)r#ZZ5l=gt18184emE)dYLB{O z@Aa2S5p3V`>vggwOb>Bfzj<ZZbCr*QxpO9}+-sHne{Ey`wdu0`r5k5&&)I)xp1_Gm zoq`KKT;-{mFYu;c=b`_S%L{d*+;>#73G>ZUwYVv5y!qX+3mj~6GdVf<`OS4Vxty<g z-}`RaZ;!(C8(b|aCFwJsFgNjTIi1UzSJplA#I~(Bc_p*$CAqKGTmO5N+c!ry<42)t z{JPL3mp>e6c^`Cm@6U<JA`J|kw^p39w~_H>>3wGWWV&!t#Iwymk}a)0)fICV?I@a6 z^Gf19JFBJI&dx`l>N>M~46<VHuDn_Mxq|y=vzy_hImf3R+505t<Pxr}*DUw9)=hZw z>Dw~zS6nM=3%;M%?fmrY{r0W(eNKAWcl}<+3+`gM?R6vn{^Fy2GYUn`$`0I7Tb#&# zCgZC%huq6Y6Md%}8<b8kP&hHiieurSc#n+8o)72yPyfu=_BY?t#WrhmmZ;y~2^Oc7 zg>33C_UsohoonRAoR+C&{!a7j#Hf(c8B=FvCMoRCN<5eT)Z}M{$vyrqOZhWD6Y9^g z7uy+Lxnm|Dy8Nm_Os(|&thrH(SC<$tw@5D7!5#hl*=E!V(eVs#?h3mZ(ubxT_-!ds z?99Q!$g=aaS6JvIj{6Gt)O*%>f0%QR`_nuFDWetlUnKmP>a(i(TWHVY!XzP{$qDj* z7R+Edta9U@>cNz$_f_s+tzWVAcKF@xr-SqUsBKx%{XaffF+9Ddpy1TU)<Z|Djjx+2 z|7$+va$nApcgDHfY8#WS^rQZAHKpfYs#N`Vf3ppfA`i#CKPQ-3R$i{WWqUby+O-_H z{<SZvROTi;lT!EAUUpP0J9V|<OO<cjjo(UzvV(=LW;j~tpFg}_qi%|yMDgSLiO(;F zZ}FPuE3z>3l0#xly231vKGvf1ejC~Dy<}Pu>QP`V#jlsMc9z-<;r9<8{av7Nyj&;8 zwf9Nvt=6U93HkBP9!<hC3p#&uE#522wxa)E*za~HsZ&Rf^8QR;{kykhzoyI1J@5X_ zzVl)Bt>;gkMP+U|7v*Iv*{!qo+rCcQpS$X9o?rD_Ah%HZ>&4fp4>Mz8^bdbEn!#+} zQn2^U+}Ei)$~Hy36g$^1vzUP;;rH{q42-w!j~6-I_!nt4F?XZ=8^^r`C3hyw-oo^p zQKqOl`1ZYzq1NA3m8CfkJQm*glX->C+^mrOcZy7I#-G!?yx+t(RHNr_>deCt+S9$| z3sO$-JqvvpQ~Yj+d`9-N#QT=d?w&~Vc8?3w+UljUEc?3h`_1=WFkYF=fBVYY-PM<O zZGQLb&CAchise68<Jj^9rWenB%63Ru@aJ;%Cp@c8HugJb-F&yu+vZS|-So#l8CC1G z8|D>wzTbY&-&8K<-0mldbycT+?&~P+-|@R--}yOznyVfQosXOFrClYpj5ltT)h*#t zi9$Kk*)L`t<aqkftUvUJs9EGj^~^$vDT$K`Z#CaP!(8N)duiX^9RiUB2MhK|=d@cX zN7u|R<B$LDCHGQT+18`Ad$!~sp*4&5+8+<dub;->cV120&`^riYWozg-!2OFJ8Twi zvlH6mqom~MrNXn~*vW%$Hk*6Piytjhd68>xa3b`2j{5cMFPg(;zaI%XzU7kUj(Mkw zZYS9kR6n-f-&v#9x>WmYZ`HntEG|ZGL)O<jA~=4x9Q-#gIY!&zqr<{kd`Z=Ff8EdR zlFQDw>-bo|ul_oheO<+#=cRi7`YJZLmXBrS#Al0k{#x8J?ec*u1&8maAK9b+KY3cG z%8V4>it4xAUExX}ZylQY`G+s>{SObWGKrmTU&>tR@#czQ`)1`y&mTIfKA6(;<m8b{ za&oHo)^R(%oY|MmC!{v($O+dK=a$_(x%u&_Lf0R+XH1^N!_-~BH>}`E@is5s>*rR! z6wOwaV|XGkd3NXKmkriW!sh=M+1i<XwRp+lkk6g*Ng=f=N{z+&Gnp3|9ex;|D0*NE zPg?E@_12n|5wr8eC#W89wPjotv*~JK%+mNgxsz93y|Ug~ToW?w+oWgfpKML4eRbi^ z-lL*buKi*eHL+Hc-JQBmO4fhkd^wY4_MStRyG~A$+>-C*e`~|!^BOaMcr4px^SB~R zbDCE1zO~hX^8(X4cUNCucQajNk5u*9XL^$&*ZVwc-?M9K)J@aO_DeS!on>eJ>C>6N zrCWnB=I!1IllLe|1!-$6(wFE>G-<nd<9P33@!qp;S|=w(oY*$a#Xb2`Wv7jlc74d+ z3ZJ;0D!p%vX1<@lGbSMLk@7@&32AkYy-#|3oy`Q!o4ejW+flapmdLgidBt-Ev+iV? z>^y5)(4)3^sdtZBvUT6q>)*7N9zJz*-LLL92`S#!zFlJdbe-k+gp(6OmRUvCpY`jH zUAO4XBhv*x-@bm#m>AL==sU&k*uFJCT$LBa)>r(`Q`I?^`Ek0)x?g+C#S#zgX}@!p znO#o$@s<sWs-;)+cg~n~w0UvU7w=lm?_X1eC)uk^4%6zMxb2rqz{w2%XG`}_WpDIS z<Nhgr-1y1nu$aoEc{vyJZd4c)Hg<Mv%zei%!uCw}+QbVb?C;|`yy6^lr))d$PC;nm z(`D8#vX2(kf9CmJ{VQc(LERGxR)q(Xt350jr>fUJGq{)`Hr4**srPaVBr^n9?luR$ z@D%&?m*bpw?d~()t)BvGtDY_NE^a@*v}olP4vvGjSq1iZpJY39=;uUs*;xyp&RdyU z!1-j4T8Ey;8O0mS)^mTF{`i*lV9M*($A?$0e&FZxcTGWvRRl}@oCj~2Ebc9>W%7Hx zrXpgphUq4YFOtn^Y=MktJY46gKUq;Qqki}0J$IabMKI|;InFJ4q3hiRIZo^4vy=~i zbeZQ~sebG4*R6lb&IaBpZQJ<xyV#v+ReOVOUk&_Z-Pn9MIl<Vx`p>~9`7SPxb|$z6 zb{2)%X?eB0m|)6ruza)fRQLLz&F#i2-f7D(M$Jq5_<*DG+2fuw-`__S7Ck!hCvx%R zxNQXnM|rMXZ){u5?0)oAVR2%b-nELG51D#xDlWdee9QK-rHYAl`h}@qqkmqSIXi4> za>ct%&8HOjbx&n3+3Kxm{WdJz{*>y*qlf>vKC+R!`n5&#s*LA}&oA^&>Y7Z_&aPKc zojhqz>AmIJ+nLoGFF#qj#h}lxcvbY8=qD*xcYb>jS+ii5VDqyzjp6Zg6!%{|_(A*O zrx?9Wj~@qp_E|P5Yx*DYrjVrWZAvRu=1z&(HY0ewrpNg#ar09(ac;8&+bTZ&nQtF9 zVTpLg`?Mvu`P!Y`e|2s-q5Sr6r{R|S<^A*jJJj>MPq>r7Z9gZc%y1pQ>g-sajMz<) zf-)-3hMxT^OHzzCrLXX9`x5398OO+_>NAaJG1vLU%KhwbJ8v$DRlf2<_;5+gE0tTe zhP-UoO_dYho&A%<U6j(JQ+-L~&F6gnbKwgk`Ip^P|Gw<#RPDWQnJ$XHE_PqqHAAuM z^-k;hgbA<f|A=v!zTG|TtKV~x*V{W<RFoH{8~!qm5={Q+wngcmanQ#k-h?HOuC9Dr zGUH;p*z5Sq>|yM+V)8Z1AIx??TH{+_$Yr<8^4D+Gt@DjPO-gc6lzVlOlT*xp-`*P+ zZeOa4$dSu?exRX6Vq@!P<*95AL4{%LPb3eV5Lhc6KIPL1wdwUot9;s>|CX9D&QVR@ z{`SPCj@<$e|DF)&RlB4=)4pNi#(ROsLND3J?A)93uVvL$`?w8TRIUm7Uf4W$a&JkS z&!b(<H?8K2X3x6RsrG2D?#UDNo_e2Ib6c-$`Tt18QEUCJtkxDyt+Z9<7egwaSYLmB zp#0%_m5yiTT>m!&W|_^>sHs1Br_6lX7gKA=pxcQ*OSI;m`gLKVZ>m#mrR3$5<)@yO ze!u_3Ewg03)smGZKe?BBuDiA5x36N&i#|&!zL}y@t?RrdoHQ0z42#Hm*(Uw$$%))` zT~2A8t?w54Ogt94d~J!s$<ji{b>|!`@9W%oqAIl{?0oNU-u%LkjC=btQtjR+)&D5l z-d_^Ch5ZSaeW}N$$I^H0gZ4}Bmrj_eZhl6rzMf~oqPU}ztWR%P`(~+!;reO+0v~QD zGwAgC)5Nz=*!|dqHqC7+!QmT2t@?bAPxRo4-5G0T>$Uu_^Q16onYkYiMVwo}d`xr0 zud?gzR{P7;7!H3>aeRH<zQz5$+ufU)H)3~B|HjCqUmx~F>i5RET!-hdO-?y(XunOj zyyaWTv~R1rC*_x=cXdtDzW!8Q#A{LW`v=n(+~8tAy16EnX=88BwRNiDB~MzGY^l!L zqjp_Q&H1x}=Gs}i{MyZ!7f!r#DN%Flp^JIdiO0><yCuamXB;m(lUOw;yHV!#$ustG z_ev#CY5$xQbo;7fefe#dpDM?nJe}-(Y?p=UTrc0COPX@0ugp3dw!QS~zq>!u*Iv%s zdVab5m+O%Su03G-|G}4QALG7dul{yTKm4r5snpgyGjkK$T$a#+=`zA66}PFYUube* zFl0X4Ue(j^+4h}t%4YSnz_}kP4lm<B^X$F#`5wtX#nI}zXa1j_`2T-}??Lx{;ry)o zCqDR?Fz-a_-nVPHq_uuOOnkUz&xeYG5zGf?+t|#j;NzH|7OR{oXM5ypqMQAh+mnM` z5+5H4Uiw%rDX+Tov)x<SHP7yU-e@wtfSE~!@#yra%uK2Rkz0;7pDL^kpBthq{iney zc={=3CV7s?<tqZ@cAnFj{*jqUSnS%}*Uftr*7rDHYK{AP#L9AI?z=CC-c6TcVe*tM zH7hxx`~I?)MdG`*<1U<LH#&vQwy4BUGYJ%uQJdbt!lZ1wOk~eb|69i_WBewz@4usJ zY|%VTYW+WF&y(>ckM-|)K1sfBU-5}$-4+!oi5-_VE!WmvwD#W3+}(_95l@uVr$1m} zQVaIh{mt+5Ix&j>a+Q3l*Cc&6pVyfZe|wJVtzVV|63q5syj)fMr!{kL$JVk**P<h| z|As$`{npAlGv3cba&pzlHdeK-1}n{HUlBf9StF%4Wp?58NLD7d2$mN!rq-?&G0?U? z9zSDhZ$!5J0(;I|D>_p5yj{0a&r~jy?_7-IIi*Ku*M<lRPE>Mw-nI?eli6H*H|fjr z9|~rXvAI4A>!+9RDNf+buCn-Wo7vQV`t<LtOzQP2llTpEH*G)SJl#0zOis<8snv5j za*XbmP1#;N^Sy$O?OzwRD;u|n7p;H!D~Efbc~-@~$^|0QD;|El`l0%=SN2i!YR6NN zKUZi3=9#P9TqL<<!?{;8Z9e%(Py0FNnbaJ``JRc#?9>A{EuSIiY2ujqz3~R`ro{`h zf66s=KRtY@(WRcF?99&8_)0msD@vjt6a6O2KiK=;>%@=fmx@~}w!GLN-ae;C`S3nB z`J!!Jz3*G)CxjM0_LfueyRY%L!^+2{uTMg5a#dl<D+&8OOKokGLX|`7_1gkVC0AC} zuiTYx)o1B2$zjrmJKF>%X()KUvGz<j(=PMy7q_BJpi7^Jjk`;|R$PpD*WQY~Q}0*p zyf9<UkB6t;uS?lCdusf#<@MF8_vcTykgJri*3F-CioJEE)9xs{;=-M0_RbD`_Hlw` z`D<6%7Z)z^u+OQ=IN@ElxcOoDCvHxW=Dp{S=9_RG|0=1mWBQ>50$V5E=jWJnJzX(D z%JSPHOK<bbY}$uy_kPzq#ave3VAy^sr9GU-eb3y9dU^$xuVZ5Ma{M<PTes~ALqevY z57Sb+dtTqaCCX1fwRCQt)4fR{hs`*T{XcpAMAwskrbUqtV|2H#coF03ZJup$<!RN! z9|cj;drvLoyQi1(F1D-j%zgP*wz<NRdsiNnu_@bl<Mf0%Ek+x)|2VC!iI|q@J+a=B zCH;_?BU5|Cxwq^d3HLXtnYH=oyLn!WmP-xG*<SWoInvGW{cHC<&g{H?TNJj=Fy7R& zW!+7_klNxMd<)h#-*{8{=xbPq2%|#5Pey}zoYNQdpZ-}CxXfy6hIqP=LeZQ>Ykej@ zKd*80(?$bk>9e;#9IL!~^GD^bS;-rd?o}(jub(zA^Pfz>>*u}By6yK@eobVR*e5O| zqrP(Yx|MR%_`KSu9%?i{?_?<UJ8S-)`e%1c<~NvqW_s^_?Cylf=82Qf349cGK3(%5 z|Mo56%kkp>78KuV_WftJ@X1NtJqBy-HmBvuo^Mccc-DJ=wla&+t6zM}UaXk2{<>J1 zpyxM{lk$sx)mLOpD?E1T%PxUu-Z6PjSwTEHDbdTLCz|+Gu}`<W$DjNDnLx&AQO4G! z=)9OY-&Puz$4q~+Lhp>ub%hDv75h0H^gem)tF10<WVqqX;2_1`x_|kh?UKzrCa3EC zpXz6A+4HSmeaQrOfj5dA3Ez+Ii1IIqcjI{@%NBC^6z`1B8BO(;9yguc)-ujr{lH1* z4YycH?gB>HC&jKu4ouRVTHji3$o5C{PM)sJA%%+}1*@|6-kD(4&!}mCUhS3EPp`)Z z?q(|*9-jEXlg;R)W{QKr!L`@U*T%MZWr<lm(*0BvTBnwDIAv|A<l2rx|C}XCe3}x9 zV#2PHM=DcVUgjJ~;CZ&U{)cqXx7Nb9Ztthwd3~$kM5}ApkwtFzWnQd5@=QKR_L{o3 zSMzK3sWl5XDWAHXu+Qx=x0(EebJwm2Up2{D)+h5e^W7W!lM@}<maXkf$~a`ASEGHy zSK_5YVNd)Cfo6+a4L4Q({yD+(Z+e<=A4llsNPFiq2}{M466|@L44vKD7Qd`N#I#~r zs^MHFeILK{;<ZfA>p!mY_~o-zVyk7(uV<SX+jm#a|59ZAvSuB}wZ-q7lqV~j_pIF@ z_Oobd%*x}(qt+x!?0KkmR_Du%JiF$A-#xFM%$&`Zw1J&V>_R`E^iHLl*PJRBHZMGP z!1RlyqwxB~N77-QYwu-DI{#?SnX0qjH{Gm1A@pp;&Z{1lcBigObMwb??rZkwR1W%e z=9(OjoZy|$D;BQ5dB@74=YxOGjJc|NCpypb_1?~TH8=Rq;g3%;j-8OXc`x>25$7|h zMQ$DC``+>1>aqQz|90xR`+<)er1=!xBL)7xuyEe}>*?vwpNr4^x^ww#JA2wq%d0Xq z8)dt#-Z<7Le@j39Cx>71b${FZwdYseOpl-ROm|nwz4Rl}&u5#~+;Lg3K;v@q#=y5r z7nO7Tzw<|7W95Mbc1@Qv3ginXKF*lD<$Pk!HEB~urL!AkvsUOFZuXLkluGP*Sj_cw zrc&?@2m6!4o8wLzUoLgZt=}=%AWYz6W7_2ZeI{R*|MNOC&$-^TK;WQwOJX)#J5#^j zULWK1GZSC+=&;F4eTe><UbktX^QAUVHsu4tOV$`atZih{QR3Iz)xYiZyz|dIo?kw^ zYJu84HH8-*2mk+yTOn3IVf{Yy9Kjh+O%8iHcW!mubmZE<<3CO(O^e7`QC!%Qt!?yY z^1GGGKZO3dFMn^kkG>c8zWU&9+oeA_oMxwZc6G_;n=O*y^Gwyxp8NT>_tLvZD>9fJ z`<EZezEuO702R{wu0GLa`t)M%(<j5sDs{>dR-OK(c_hZ+@;&bFEmkh+SIRsJH(i;p zJYBhN;qeYbDFg4|&a(GwUl%;@b}w92wtl0Xk+9L^lmq;>Tv9VN_0E_qn^Ujp{4t_U za6PAdf9KI4<D&EX3jHHqMZ~R<_HZ*4zmRbuxvA++*NQ8bqK>zAo(bvOBFA(2(fh^x ztu}1=xBc2BYmX@w`pQSh?poN%uQuUfLbLs(m_4aWB>Acz?0+=z?uj-Tn+vlhGk;ua zZ28IGyLiTpC(J6();{`huvm`CX!DKwdUvVz;%NcRJ^RnK6g^Bon`Rjl{x9;iM(B?< ziB@sD+a2B?NcX+o`8Uft$3d3&*6;m7+rO@k;1b|l@V$DGhNxbbyn=JqM|0V<n@`k} z55Ii-=cnws!ic7Aj0aCK$Gxzye5n{H`d~9dt$%>g6y@uuPcE+vSSkB1>v(9&6Xk6u zPo1u}57DV^3O3D?^V+dKwfM5fj0o<p<(w}+t3N7#wajwM@*|75?iF(Pb=tlvlrv0t zJ7F`&2S$thfHkXTZBRQllSl89eDK5VZX2#P2PE<T_^X$<$>n;TQP2r?vAM-hrqx%U z-obv#*ykh9WcAihX54#sE}6{xMaxrc>6~4+-#lH~uT@{zpS|Fhi{#E#hcB|-o7Zf< zfqTW5*`YV09m2S_{xN)28ZqVB*?yZHzf{at@9@oB)u^lgZmUe-kv@w_O?jr<IPYc! z*;ghUKkLy|u-h;<d9wv8!@3X8G8tTAn*!Cp@r3RSe$+m9dw$lQhg$v#n?n^hv+XEa za?p1E#OFWOY^>JyuD^5Q%-@FX53g%qZJ(WUyhK^|yV>{M$M~+QINVN{J!AX&6Mr|D zCw)B3{jGaz!uigrV)tj1?$=Xpdzb5S>d<$IC!b5s&t$tNH(%pN<$i9C!yE7K*q{3* z@6&nS&Xc;G_4&7-?`)T?UUgn+(z3X^3wL#&)^^QSW=`2r5Ma-nFD|?0WPKI$nTdM! zHwvXQ%-fbJAD`29LAhezOO_7H&(p8{WM6gg9=F|+f2-A5?^pcsxBkbF!&=JzZuY}3 zi((Tb{e_GpK8aQbaoatxdM@y@o2B`iz22%XQJXe!R!i>kj41E=ly5J>#%a2+#p<nU z=u^IX%q!gbV!9XHv_5^hO^V~<tA_6S^RJ5z#JOnQH~HswYuRg+T|ZZUY(JLwM2d5n z)5@X}g$)MWs~%W0g@8skMAy00ZJD;_dM$VHS9x9auM?xD+_uaP64kHS6aGLsLHE{X zU)euq0?&+Vx2pR_n|RkaBnSB9IjsEq!}#$V+y6bkggJ8OEWd6u`R%2t|FxOyp1bYc zU%xFscXHsuJq2}74n9}E6u4{qT(he94t8<=DF<%$+MTPcW?#5Ad2xh|K&+FXw0w7O zykgC2E@fkb-%6nmZ<-$ANIG)3W6wD$mafhI`a5kBUN79f%}ShovPro_XhdUc?_Tat z4tZ$>`&jfQ&z>^vK;46x?_ISVv_7n8NamdM=y7TN)Yi(V`l`#@XYUCpeSQ4ynXI;+ z-~->KbY%SUdCo38Uz0R<%abKcTHY&8*<TPB6rZBlbA777?T)vc+guri6>_3Vbxy?` znRPU4iOK7wL3{U^1vPEwUQ#jLX+jfYnazYtf&c1mztZq6ip~BL|28Hvx&Fhsg^e4_ zbQUb^ubOr&_k6vSo$#ik^EMv6nY;U9ZtT|l6OqqfO)|;bed@03>f3t*-dUADHlOGv zV6K<9z$(5r<<<EwQra&$y8be<>If;S2?*EuMA($QT+hrE!*Yi|K;!?a*tqyL!n5A| zG<tCRy!1piHEG$ULSd1I_t-st>C|?k|Jml~-43!F9oaXjL~h>{TyOj+`p(9iH;pdm zPTI`uz2Jxc<(WDuaqn01n(D<I+K{oJ@ZjTfJX`dGe>27EA6;g*-B)#Maopt@U(T-9 zz2}*}VC7P+vadVLpZ>f*NB2^cT*RUP-3^b=$p4eRbG=@*)n5Ir!S$cK-~HzDz5Td$ zowbSQv5?hf!M=<0?^~*^*p&9|a{a#b<<%93PTySbyl3&(JL|scEcz<bui5y>{dMQH z;_26d6Eto2dR=Hyda;zD_LEu8iL4uDlcz*)b@n^adg-m!+}ZD2v!1qZx1AJUD$V6M z`?r(b{MOAWzdl%LZ>*_}<^1M&z^NqiV%*`otB&h0k-ENpNv!%)k-TRvQvApHE>-Zb z*PA82aoQK4+mP3Pa#zHPX*DXk>)&i@yk=OVv1X2e;yIxrt=Fq#Te&CmslSuX<8Kh2 zbY67grtq_NYU|T3uvH(O_fk8=qyLTPY9aoRD^(H)FS0zbFEC&%xpnoI&z7d!Yosl# zIE<LGgV_(hxyh=(`N2))PojI-ZZ_FZcyy(|;Qyie2>)vl{I;A=zU3BJU)qsk!sq>d zsb>FY`&AxKHVIi;->~tpamjMe63>5su~VYj=a;MfOYw<co~r)6q%$>q!l{X;4m&ot z=*lLpepz$vxBs!&==Epxb|_aXSLgTdEqooubLF9Mrq<WnpFfBFmf^K>O6qis51Ht? zk4=Z=zwn#3J@v;H9^m_SNaKX|!u84OM-Jc4adpeof5NVMzENb3#=W>1&7bdmT)W;O z@%s{IyZu+*-q8wL-?#4iX&b|TF+R8Q7q9KpcDt9f+BLDoeWmLHw#v)|`S7b3g%+qf zcsEQ-SgJZB>>%r@O&7U5^b)r)Ww2i0S|A#6nae?S+IhB)Af5AU^&%J9Jhb8!Pc)ZH zHgZWZnlMEhFzr|-&itZVZtgq5gKV-#7OJ|nY~b)&y=B9VZyF4Y$pKFoMD9IXp;*Fq zYWd2!&Ca(kF~3^TZ)xFWbvCZ;%8Tc}(pGS`dae-lZr$AFGC84moy~8D*&DhIuj=JZ z@p<<9`=Ne$&@zami*}5<2kY7U4{c>BIPg_2nz_Zz!bI&jgZ~G`U;m3IE;!yG$E@J6 z+uu7^>-_7@%Ad})%$A*M!z^JrD=&QY_n62@YO}9A;g}R6*4LgoVUt90u$FL1R?Xqo zgL1OdwAooJ*`&pe&!13Z&@+9$i&6a=Gj;dY!?zrZCqCuaC%oC_%eG}F(+wZh|6QQq zzWwGhuj9H7dj*WP`q)n2$-PnjV^VCW)!fy5nOiy4S39Jfb>8smi^w{ObEl?dTEBU) zf`zB-?w8j;OiVBBQk=ea_Uy3VG7~QTT{eL)@Yer~(sj3{d+nB9czdI2>U~Eo#eY5f zW=AOeJG4!<c!u2NpYM;oKX&qreSt3P?f<si^#@k!ec9$S%|XtP{ioT)1yOE%UTX_N z!qOC;#NIi%$903+XU;vAXBCpdj4wP{bDZPtOP;t(b@Ok$>5L4SFSp#zF6`Hnl-FME zj60_6`#hh6g@q|C$v{~6?FARLHfa-|BMC}u!iF<CI!|^O3O=4a_h_etLhhNv336#+ zn;v)1XrEZ`aAQXMO*PE~Ikv;^zh|jDOBCQ>;+WCid6!|*ymmqL<Rpjz2VHz@+<H1C z?!SSW=&7<XSt)Jyl7>!+p8fY%PpqES@llO``}(tt2k+kOh`u49zPiB3(&O9Q3mW3w z?7eMwwz-&=3ae;6)1JTnx%SVGck&EwA3UL6FJcUuvELK0zwNQM`husf{}=7dnvpMl zu!m(!#%|+H4toP;2F%>H!e>#lXqIr6aMoq9EuI=eub&@qaa6i?&wHuT_dmbY8J*^T ztx|3%o7$5jX9-#{aa_Mo?!lwE$+LF#W_4ukm?$-GQ(?01H>RwN;v-AbWnD_Ej(W@f zv)Xc|e%?7Y$wzb7O7E$y%B-=EX`FpnB*ypr-p92jKCcta`uerJlqcm}Sa<Zp>YKm$ zgJlgr@juz=aoi@DZ-ZTK;-nHwYtQZfG(_$uH@$rK=V{f1o>uo4**?$s6(+~bTU1@V z=}7sh-06O~FOJQqdgPNEm3Oh>_Uun85%v=l<2fJ4Pfe@mvCPxA%u7^EJ5buR)pg?< zFYqwNqp7A`S5I>2sT?hRweFnP(OZ$J)(#VQzthTU$l;VwJQ}h2i{$^tB`&sC-7o+1 z(`Gu9byO(rbyDK~a;+0l&;N+M+IiyXTi@wdM1z$72T0vr&9~D^dHUM2*Pp&kiqUxc z`JH*tnTh#c?uu*c^)l~<Ffwoommm1j(t9>NJ4ye`W!Z{YM&oYRGld&w>w8=8{e49E zed8Lhd5!r3?FLGcu5-AbtN&AooHe<1bH2faDWZxIg+De1?|3$=za-M)t(|Y3;;gyG zZoBmM>`qEs+ruO^DS*|R&&uGr-sgbt=Fjc!h353Iow*cJx#`1+s(M3*kWaT1&**A7 z7)&sb>!^@j5@BP}6%uNANS0ahy5o{K_QL+$dC#ug-ag%H`BjPM*P_$!Ii8#RrTTT- zofz%jYmwfWZD(ir?^YG4;|V%H>2vs>)}EEmGisloVC-F)F7L6#!#26(>%qkx-mfCH z6jY4At|>mh7dk#?w_#U3XziV&kF}cN+X$a&KMdY>v<Y7B)Ba)?vF^|5&i!>eC8AuW zJ^7P-DM_KH)<ARSf+Z<y?|zxo|M<(3Ef2mgD_dD{b>F|J_#e9%&Zh=H%5Ivjn!cO$ zx6#BmW{k`F-z2Sf{G97;@N>It>7gg`$1El(u)OwroKl&}dT7u859*h5-Rdh&SnJuE zUemTd+PkJ`HdoKoC;d}<GBe#4U(1W{bnq;>9~H5i@qNqL$^Oe#1uWl5+{t)XvqrRD zG5IFjucyD0`wEXg*d{nBqFuJJ!GVE=rJQG-<hF%^AJ1kQO|sq*ZSXSH+HI4|_6;e= zD`ky7%jspd9hQ@bDZc*p$5y9lU(N>B`=?uGJ>T=aIOO`-^lR$x)K=*j-f-^w|E%Mn zcz0UvjnDjVHLb!pTFNcM%#v%rti7=P(}Bi)p_^*71K!t8h-0w}zhQDn<ys%#>#4hJ zCRfZl(EIZR-{OVQ^13hh79Uq`XplR9Cg7>y-3yP}K+|o?C7Pna9y6SNB~&VfCKX78 z*H`YduykB>a;ZOf^~kduLY4W~Ih^k~-|Jp(6ABrmdFPpRMuusx?&-vnS|>`fPOM0s z&6fWCihtUdou|3=b9dM*aMLnQtyTHU5zw)ue~EnjrR!T8xACuR`pIVKd|Jlu6T=I3 zWmP5BwilC+*PXv&bmzv6<q5lfE?6mI(^KCO@?y=D@F}`)oqdutUY_l@(Gt<wcX4Z6 zp2ytdXSoZuaZXSXd*H!7!Pmm<S@WG`w>9V59M_ts!>RYx>aS+FXHN2@Z!f&tmrmv7 zEVo~z+ne%n;j2P}cY$VlpDrv^Wq7%JOZfvXwKH0OoHXXVTOMioZPCrXx5WkNQxtA( z%#)tDu--^@e#hCiJAWD%D))K5n7s09=jRg&%*qi5_xyKQ`M!=#ELdUTobE}i4V~%i z%{kYT96q|Mesq=Cf3)q9^Dcp%wzW>b@2Q;D(3v+gZMCx1ynnM}uJ5}4Bg7=SH!3{y z(2|n<ni8z1v~OhwFMBq%$oW=y?4m!bOE2$T`H%1P7AN*6^?n&Gr>D0cUAFG>LS3dr zyL+O4E0%u#kR-6iJ@5I2eVrG|w)<9nzb5GQ%Io;KC_B$tqBqT?)!8*?=N-Lud+Yj? zfMa`lJDCM0MPzI;cd*EM#?Rkf#N5a(pmxIlj2~oO+{`<&PJ22h*HkpjoZ9WViLbP= zJ#~*??JAxnisA30UitSeFpmqpt>)?S!i**8hKJDmLw#>&94_(j{;}ftp2r*Y&Rtwu zXI^LSm-eqQd*z$1E7?g78!D3Sym?}>`D3lq2K#5l)$;b?yThgw%z4v0^I_8RUGt>h z&xoHm-Cvf;vYxHS{^xXqzSf7=PCX4W;n}_P;k@i~cZKCuat`h-KC^q`*=c+m)`Vn< z&U|t+eeXr)7sB#$SKcoFzN|F;?$?`_pD%ZM_knv4&m9H5=XRfb7RR1($_lz<vt-)a zUlZ<RZjgPw&OO(6@8fw(qR;XNPv+cTU3Gu+Gn;$9W{ef`zg<?m%Bc6hl6a)@O3tEe zHsyf0qlKzmXOFR}s_@QNZ}a?NzN^c%fsJ$P(MV6p75>HH8OzLX@Rho4`(gK1Zr{79 zHkZ`hs(K{fo#m<PJbh`qb>ew5j=bG7e8SS^n}3|o@z_Xm@yVmy)7cI&KYVzo`M9wC zOXl0bDJ*GWQ7JjqA`J{1R2z8fcbW^Iw`A>Z&glMYZXU*R^0v;J*?CvoZM|O?&rfx% z3zW)S7kP9h&jdXOHLh39kwSlSN|vw)#MoEwpR4KOZehh1^7!Jeo9P^#-)9I#DsI$x z%9WvTPPsHedC}pJ6JHI~*`GHrF>X1`8syHu>*iuB_37$ojd(jA3OaBo=%=5Ts9(4% zcT#qre6VS0(23{v(Qh>U*R6Cdo%{0E|2wtoWqjwx+z*Ktu>G`9-C)|<1@6nYU4F>N z4O$j$ty9{4asH#`MKR}ZYt1`Vy5gcad()(f85$lP?ut8$9lg3fZYkp5nG+?tt3777 z`oEhBwUciiF_3+9E_7N3pQJ(74ZX$EY8&g1+&v;=l>h#x^47acZ1)%CM=}4?U4Mr0 z>XKvHFOT#*o*Yr9pI*IxPPdA9`MYzn_9EZ8wNJcAj4<TQ`1o+i%G_-JV=|TJ9X&t% z<eB|`dU?Yh;kKprGxLmX8bvNDTrfzR=2@bZB^ov*R_*v_W3{WY1{Etd|M+ve`Sa9> zGm?>umex<m;%l>dY`)`5mci}1&F>U4z5HjbPK~qH5Ushb6#g;wLm5kxio=W#ODs-S z@2}B1bG>!pp;*O3OY&7N&%d%t=In){fGrQ7GUmm-owJzthR@#RIj1lnE*ZmsK$ zsSJ6SI#KR%LQ8JKG2zWJ*Pcrq`D-})Blq9!zY|uNbcRYX*2{!vYHax>zI?-y<F8s? zHNR?p^;yiI@fnZr?ckM8S8Z!mdDYoOjN~I7ch3IAYZr3Xc4L2bzl6&5xz(4GHq0=V zuzbhWpEv8UZSd?|X1#}5kJBD5?=lWsTpJ)E_|+zR*SS!3zhxKRnMQa#J%4yVZzy|c z`p#DzJ|7(-)3yHJ|Ib!0`r`NV2F70#ZCZtx#lzaPLlPIoPcV8={2(J_e#~j18)+GR zG826oqWISpYPH_&2&rGT-b|90xlEf^<cZqWpR4zaoyadSkl8;k=D3g8s^tvH4*bQ; zzaG6@w7hAaR~pB6?#WBr78Z)0Iq0H%Ip*T8CEvaN*;ijbG-unSHUCe=Jg>i|xu;## zCg+bu>itKGo33o_75|X-{n?VBO%k_nadawoTHHJP@4L0FkOC)Xa#Ks%i{R+UXrTz> zzoq{BZwD&sgd~}TJ}ii1u8B}$_Tqf(akxs&r#0r*vWRn5maAp2W(l6_is2~;`@#2I z=YJ5NMfU9(K2O#hm~`}kPJ*mN@kx#PfKSgOtJXX{&#f=>ul&ci*9S7MWu1K-#$u7K ze%#%C<KFl~{lyP{OkcuqZq`B8`uZagtO^Nj{Tvl~Co-Qd`SY#0`m3bwWED@A7K<(H zvwkNr2^oL$_I76Z!J(0P?aCbAt(wXlL4g`A!B+)EIJ#5=Zt#d~_9<dvZE9*>bTeG) zfBoy`rtMc<5)=#=82`yAo_6bOJix)^T(9wBf*0fG)X?y?ZrzOK%)AS=*i_ou-t&}Q zt#1AmIP-{(bj0JACodN6RXQg%x#~;I1g{$`;`3)ofB1TS!v+=Q14kCVpY&Uy;NkVs zCgFUMSL$n{c3*XK;ZVD6<7)6Acg|TqJsA<^37T^CD$ncpvWXQ|JX_|TH}&7wyBiGO ze9L?A+;4sT+AW^JnWpd9y5@g2lHX$;Fy%F)<hL8OMRzl_mt0r8YqtAxuIajtqNN9d zn~Npvd4reF{cvz*^M&eZHZzi5#LBej8qfO2kh-&YskEHM9MQ7F`u|j(8|@EnY1F8x zI`gPeV*=A0&G34My6<nA$~@#MH1tc~1o>?hy{OgOWnUOqm-Kqs>&yu2DGxQ*=s320 zUgK=cucx}PZMye@pKoNZ?3|ST$guUeNO;se9+o9L9WMC>-~Gxqcbfm{r<*r99EhFe zpm}EXaqefPY3sY(7Pln%o!@vMea)xC;)f*InRweGisx=nng3NRyIyw^^QUGR8M#gJ zR(tJszWSPX(3*Xo#SZrU{2t$zS-&xB^O|jYdVa>&cX@4h;<rmFrq9jVeNCXFd!ebO zaNway_fA(%?$K~9T5mt?*s8x@A1$cZ@Z_j)x}x-sO@X@wJN7Z&Udv*-ck?BK*MZkV z4xi^z5LfwdXW7Btw54}4%>~ph)w4(}zVY+P^9e5N<?Fr$n!dTOxn5?!oyVn{Gewl7 zroXQUFSK*NvbE#a*-P#{)i>Jr1)kmdCP$@SiaXi;hKSVS-2q>Ic*I7?O}ICAE5n17 zH2XQHT`#gM@88i9bK6#(eW^`g$cj0;zg@Y)rB>O$MYy%B{fWQF8ku!EHBE;#RJOU* ze+ysu^G3_1izPx)1}iK+9K2q7=vLs`g$1E}rH4!&?t3df@Ag~A#fg`_n!T3C<saSV zdgJ<<<sbf?5HyQ6xybe9roq82F<JgWDt-Uf?>M>dk-_nKM_szln9PuPv*?0L^JQPX zELXOB%iMbJ-b|Fdq%Qm2aYf(^`<9%0z5Yh8rg{X||Ge=+`}wBI#-#IxHzV>dPC2*i z)eBasM8O#|9j;WrmbQKJPw8&syCZ7OCbEr{3X*f5|8=m>ywI|q>#LdTf|}AiC0F^6 zd54?Z=R5EISeMKCb4#GL<-?aJA4PgrX@vz<)L*inx_w6%YtMqol^5!~X7FvW^E>4} zHCc6=uf!vj4fge#>ylRgh|sl`p6V6*@x}DdM-4pEi$#_lTs6n>>4GDtO0FH4(t35Z zXzUHIL!mRKZ#-D2aEzNdR$gcKg6j*SOP<zzUe#6gcSq<wA*Qm>(1nq0tUjl{uezML zyrOd3`r9pTZ;o;9vpLWs_Vp6GUd}z8gxPw(c^XBHILn!I>L05xh}Cb;`dgK5P?o;o zRKV5KIV)F}vSnsStykD*Hb?R5)AVB-Hyk>$l2_X6WUXdaP3Wtq+BrfhKl5a&Zu?YE zSbWR03|t^NObaU2ugv?HEb-vcWzEOeGPW)@DnGvH<{ZIV@e^nL{eq?`+$cNaJwdoO z_^Md(q_QWE&RVH+8daxA7uU}+Dbts3SSA=dU$uS47wO;83pWX$oA;#i*292HznE&f zwan+elH}Gq&(z(meC$%hjMlZ%6QWhva%M?3ybu@tYrwa~|E%ETn#IvyCz|E1s(UIw z=VR+azd5x@JcXhLb|;=r{jjS*ZL8tl?WG;-=Fhhd*?eZ==c8Nq`OJ8*Y1(zIbM>3P zy*U$^w)%sSVQH3n_e9%LFB|qnJA`!EeNP%+k+nS>()Z@EF5?47^HAj%GIuMN-S0b> z6R0t*BJ6qk!khAvNy6_9HkXOqR_TtLJZs^mEUSrZ$7gs>Vcey0>SU(!RmIrbv1g^T z?U=oJ9&fz3=Bm}(l52ap#p}XM?yfSQUpK#^KDA--%C(>7Xx&xW*R8PSz;}sO|2rNx zX3J*IjSf3!^LBD$(!=}v-tz9Mzdo&cdfMJgYhPdA9T#BsF!b~_N&BNMM>fahZDVyl zbV2vAlp+sLs!!Y-AN{U1N6vkD#C7rO><gRO<Bg}Zel9=kbbs?y&tns6LK<S0ctyP6 zH+mDNol>y6UZuxgfW13=xiv?+bmb$LpTE~$YMLl|%6InUtUROCyRGu-D^k7dWfWVV z^mgvKHd{TE@weU2+0*L;oA%ouVo?0oaZN$dK4Ol4o#^)oeesKac72?zrMR8fJ>rCQ zl5gw^!Ls=p4+X!@&uH!46r&K?=O<pW>q*W+3qFHaor!EBe)a!O|7Y5<O<6Lq;FG+T z(IE{Z_WiTpOo=($*t9%jee><L&n?6KPTk2l-ZMFtDKU8aX|u+Fm9mNgWqd3b`pw@i z>`ZbrGI_!OFXDF7>U+{#41!{}3SBH?THRtgZ=Q_o_11EerpSn$QMI?a%^#@U?(<u* zEY0VB`c<>N^Gx@3+Y}_$fBv`iq|@Ieq1oGSb#NR^nLS;a;l_-wOTNmuvbQ!TF&Ldu zik}&?pG)V_hcmwYceMV#-kq3y<L%u8=jX=#kIJ09>{8YpUXernHkV%1@7Nud*OszC z<2tj^n~lGp?7A4{vEF%CZrSqNSuui7y&9LZ-Dyo*mHeuO|D4Q?=t(Z-M;&j}8!i6n zmm$0BnuHspoQ2M>)~*ky@07m&`>0Z`iQlDB<iQ!98wRZkiA_S^_->|pznP?HbLoL1 z|F2o8zk9aS#<KB-C^jCvE2?tNXYHbyU1?fUsu{}`&D2_!<7{ktz&Ly6%ByQ<tPC{? z{vN8ecxG4HE5Dnn&J{}zI)hZrdc9&-y~?b$H!?i5ayNSKT6w-Z`pu#8qKB^XT~Chw z-x#G5%-&`q;}deX?wahWCA?dHmuH^bRes~8^|E)9O;0&4o;d&3X8yAp><7P9WD8d% z8s6iZ!lfY^XV@ezb=1e}%>>S%3#;|-A3T(kRk8Q{9rdfK=XWJesP;N`&7=Op-fI~= zbM`dVzj<qWaYA~^lbPO=?bv24zPv+9gM+t)O~IjFqoq|{GhH^~z%_xJlWhJsvbwk| z>o{=W&}y5@dtdVH?$zdC*>SDJXkl5>+HEVk?;V*jrTsv_8}F#Sb@4ktCAs^i{s;`r zOY7`4&$Tc6GW}S?-DLAyr!Kr+dqnS!hWw4?|CW95xcH~uCN(}%>F|DyxQibWR@~t` zas1s?QJ2|b3s>%T{Qiu2=Ud)gA9xRzC)B^lJF$Pk<-LgyxcA+AQ=L|C86>_-x>wJ6 zXYWA`9=EkyJuUg%PA+_w!qIP1p^+nfI3(VMO^I1Rpj2zs_j8BB?rnbj?d)%D37JJ% z@0E_QgnVD0z{8}<>|XD|cZ(rG&0DTv!y8-Hz{D5HcY7-WH^*kTRheuIEl%nES|4b1 zDR<S*W88tf&D#y<MD)FDU8U0znA!F;;D@Ee(O=?Q*P3q@)(XF8?_|LFYqp?Zc8Aax zbM}g~XZd+1?0Z-5Ug-4i+Kye1U%q_6=c2!5PKv+82gy=jXZimte;!S%e`CNEvE;*z z*?X?}K3(;FBD2<yx8ZkRzngH!>{oC0x19RW>E1gXj$Ji-C)}$0v8-UhpRay9Gc~(; zbH1+2Uw`9R%-`lOH~)QGxBLI`vf>+`zZDeR-W~bp+4~p&HUGvXdD~Q`h`A|z3*LU1 zgT+l@LhQAq>FlTVUbtJglyh}^HEhqTpLFWy$A|l$o<1lWsiu1T$kpRlKH5s3yRvNa zP2SC3%=ZnGg4Ee7cUWww_&z6TL-Bh5vw~Y+z6h&b;yZg){7?4ujmtWp{%Bvhn5m;8 z_w=8zi53r1cPngGliMu)re^EQBMCAm@;<$ZlX<r_|G}@$1uj2#T+3KwH<5)!hEw%~ zP=BFH{gu~e`W9xKTv8Y3wJcTSFO!t|xd>C9S34F;yza>Ix!!YThwF?tt1m>vJFhsA zzBio1_;hFH&LwAb%6(hi7*`#<k^JS*JKq(&#v5LA{3$*)<HbCwYsN*qMZQYcU3|Yy z%G<>{`R2nnZYLMAUA?ite#)^|<wo1@Ydcoko=Q0M=J?Z~`gL2DsQ8^T7YO%eNGQ76 z5Gg*@b>6kz5;x8*O}W%w@<aZ2py{*gT~8v*=O3tgxUBn>>r0<&cB}RIX8Ji?>s!8V z`9hI~{(pZ?Fa9lEb9}w%C+^3~Zl3@AdPd3KS>KvY-ce9{e(sFF)bT^>6;vCa%&+|@ zRoQUAWjUX{vc`uRKaqQd^{z4t*9FdhcHmbJ?~;@}h1PcVQ=EM*GrL)qIAywQ^*F!c zX5itv`}#)~MC(Q-F6&Xt+;L4R-Ti49_rggmqV@GHjb3|%KItiI+w;D$kK*xJUCL<L zVZy)dtm(1tHG7ORFPybMXEw$AU&p(ft|3)Hi~ekjpAj5a%3as@Hfx{m{Au;4)1OZH zVb(iUSM?(I=T{$<+SBb$yDt9G`pfg7-rslA)VAgAQi$eH64MtD<9{~uO?Rpz=Q;kO z0*<W~2e~F}yYx!Cx6w&TR%2zRz>A+HM|V4%ZJYYxT42Dn%~JgP62#Ky@6lR%wOi<3 z%arc4k2X3+oA*sB(w7O=4L!l}<<;z859<R|U8jnKUV6LNYSofSE0=tHT@&j6w&ZuS z;?Ez`--Rv+Tq$4t|3dS<C3|-(zWh>s-R0-&*vG4^|FHkoso!*U_io9eqot-v=d7-l ztyL5Vcjl82j(jw4la$H_Pq!&bJFm-oCtv+nRT$9oWw+>j|3=ktVIK?KukIVTn^K;9 zx|MRmwSL2osmD&07dq^CF-1wTJoDkUOeaBAnMm>ZVsY;!3SS1QxUV<4JK<<MYt{M` z_rS%L6MTw0;-3fX+{bGgHt9jiE%sfmzosmdx3qtKQ{UcbR}bqV{qMn*y7u0CzTG{2 z$z+XtY;bSWb!OIAYsAhgDy6u&IQ@-fQJeqgnZ?D|pRI)IS42%-6WCJY**+)l&H5*+ z?z1jSdLPGe#CqG&%38hdFmHL!U;isFg~fPH{odqd9rI)zpOcNvx33>=#Ids%9*uI) zzsJrf{$>l~to?8H%Iul9`Li9*!*iQgGMX9(#wqzeO<ufy&VHw3pzg-<skbMvNhUw- zO*s;swf#$akRogQrh4x0*UYOt-YwU=D7z?f*+~Ik_k@3*ZqGf$yI<`&?`pd8qU+V& ze}mWRO_@CTa<HTKjjthl;x_(PKBgsRAhj}Y$2$vC$%)6Lt{JqtE<WuQT=C)2lm+QE ziI-V^d<uLT@i6wz#O}uz9=-SPT75(7`?|Ke#X&2z<^C4!lVHnS**ZaEN_~W8O^C#C z<7L~{?VZHd?yk7#!}4pJUcOv*K%%LyV0m=cxoskudsCNR`aC($LDP3Zp<B%FPSt?! z>H42f1*FR#NpjHrd8Xodzv(CIMHlRsty;KS{}J1i$JZ<U@1}d54X@$Jb-S|a!`)o5 zGnzVr`k|kvE^8^8;ALhu+w|IG?~=Gx^>M|It522i7%y|5_CiA^V%bNh8_T~4RwfiZ zmfjlQk+|{wFE`Wcn~DRD>z@p<HjI<#Si4uwe2Q|qtra`-#(nc6;tv~5=lXC{Cdp&n ze6{P(j868?Jg3*CH2L0|A4fRm-{?KTDby74j4{4`mDQ2P=NImoFvNuS^=Y|(n(w^+ z(w+PD9Ws|}gub0$sld0duypH!vv0%Hy+h_@HCoTV*R8I)^TE93-yd<jitU`-`+4hy zoSu1)lJ<OfB-78wAK7Fa)w^?nSWojUcBiv$ah=|p`4QK%qP9+vGJbhv;Z>)X;?wmW z8v6x(`>1xf^Q_JK7vY-(xVU)CX5OBDy*1x%5&!OsZ(h}3y}x+b{*BA@E!w`aH|}QB zHw}*bqjA$v{_K<6yvOHVtqc^q^-NN*mNET)0k3&wggndbo`tC#P3Ffhn2FxLA(?PY z{E-2B8QYD!tG1t=(Yab|r{;|{U+yotf8&1DhBxl7oEBL{%cT2%a(V0f{KKP_dhb@g zv%L7|mB3*WyLDmyBCho%JGaJM*sh^-ZX2T-Q?0s#`4!KUJ3oXj8Sa?EUFB(6c4)@E z+g4L<&x3XyT<_HNd_1supU;eht!cKW9k)$Nm1%p~ahAPolf=(i{7ZiPx?Q$#;V#9k zyB4loZ^6_eea&*VW0$ivYwQcVa})c|J-@?l#qHxiW8N-)l|u{H|E#y(a9yWya_*<q zJ#Sdm4^%fEeei#c+9VY@t;CnY`{g8VbPMk-*17ZDdtLXI396Hge55>|$ohRb)_HHY z_*09E*7fiEg!g_fQ+nu<pD5lcy!WW>%x{f(78j#+svIQ}^&dIgpV&~ncEZ86lO7xu zV4sn#Ud<`qde$nR!8#$u`~Lqu^)vTGpFeo)<{OXVC6%j8%tMa94K8-cwb~UbpLu!N ztMGr0XHMJ?b+g;#5I5E2%!%`?dkvK1eIBfxK5_mdrR^?ScdsP(yA~eUcCfQ;R$Kyq ztIac$t8<t7t)Djc&`%`;;g}1pr>1kxn~?VV+Lr<*&J!*>GdHXMct7LP)aZ>}nz2oV z^^ac{iacDy?(_1{ly!Hzi+o<5y1zTwEBszxn9ob0vcMUaRNtN4!e4TDir&T-M}v2< zOq(?Q@VyO%PgAo#E?HZvFv~_Wb9OtU)bZnAul-SKV_f9${hPZ?zzhEF;O67)oM+S@ ztop`gyUp;Tze44QHMf>sH@M-?!x8hNbLP!Xp+`$X>mluaKU;qr2D3Ed+`oE0tYuPq z3c)rWc?V?_w<<`Tix+w1nr^k%?x(A)e_izA-t*ZtiWU-2lnjsDVtb<ByI*t3N)7Xr z8?Pt&E%ui(&o$bS%{OKLJ;T3c@t$W7_X}P6o&5b(*PSnIOX|y&ZFBXN9c`{WQn~Wz z5c}r&(F^OHoi-<mJZL<;$bOS#-OO~Aiv2Qw@;+^ue3ZF8LoSckW8-gSzFlUzJehN3 zr`~?Vc<}z7FY0f8fC@mNP?m|uCkC)>bnj-=@?@RR8E|CQt|L_+Qf+or>1~=-I)&}+ z0oSFof3<BoDbH%MyJM3kQ{_cBRYOA;*>L&Q>+)vGJoTSazvBLiwRS-t(r#V(kk`8+ zE%@rfltXcy{S%YL_kW%*v&d+ZUBtiAUvsm9f1Igv)NxTtRNVG9w4igd$3puDw~CUO zKChPCf2aM6T#Z*k0%XYQQ^fD0Q|sp|uP$VdwlKZ?`;^0yd#9&;wlh0_e3tcR#otGM zb1X4B(*9Fio||P-eZSduwh7!RkD2Z*oWU7=|G}CI$t}mGEl}j+k}J7g=p7TV=Gxq+ zGfXsVuIlt0uQ8sj<j&>tkbiI5;;;Md0<3#iAH4mtH_1|t1r$z3^X8W@Z@E(0cKoq_ zT1Aem`Xm+}mgAiEXKNWB{oPZ^*0JD$!+$R!3#WggX*b)RPhN24Mt$_kh4vgV`*!E2 z_3W6kYlj0<XKEss|Dw}tCeJUl((<Y=Nm9M6tsckg`6DE!<MWUI9a&2`xBlGYB7b-D zzqxFt@^{sX9Q%p|b~+t-!f4nqX;P(pM{McYcHV=9w^o@;-#(c;SxDyJzYb<T0d*dU z2|-VqliwM*{%riD%pho!;WWEmd&hbc-UT)h+YZ<n?v<-8-*|Fj0?$jem2>3Xeg5Q# z&u*G;m$>nLN7_uat1(te>y9?pJKnAQ-t_v#j<DmxdDqvxUuh$JnsZL^=j`9CLN<5r zsU%9+)$Fl&Rgo01%zZcO<V;rvwRS0=8x~*sFGc+I>pF7rzw1ri+-aT>DrR#f-qcIq zbS+R;7oT`qWy*cQefpbQzUGLunK&JO7ALci=R}p=D#j0M&K!=^+%c(slk+m)M90-r z{`|C@+#a(1vDeNvt265!o^Pov4Kv8MoIj!e^V#F`Rf9Pe?}}G-zvViO>D5^VAs-=D zPq|HN?K4^Rn(9=iDqYxD^}{kNk6rGwTw^<bz5RPRg%x$r96#jWn!?<uASv)H@l?Zk zzrE!PUTyy{H)g`bSF5J_D{lO>(<APWwa+#m*$=y6J<@$#G8THek>AfbPV8CvJEeEW z?qhnD`=2b7kT^J<{lm`<!jX;BbZ(VOhN;vry%pcT=<e@diGq`@j!V0qDN0acuu^$1 z{;&R*Y?044#ml0($sbr;`W`($&YZt#h2E=d=QX7sbrb$8z3F5>7LvDs%lyw3t9d6c zpYmL6mp@mw#qUSo3$uThmepsdIk@+T^PPw-UAEx-Ee=)BOV^*YTWE*>`WrXDB>&Gn zr#nxN-bnT7e)3?>ma5#=yE$L;*zO(-*qQmaIi%h^wf^>0m%WmHQTIwUKUm)u{~5TE z--Pd_|D01NwJKAXr?@@+;vtx^_I5ePgPGHc<@&;B%U++wGV96Tyf~MCpQU}*JN+-* zxy;0h$#e71m+#Ck`9&1h_`h>le}K8n$L!WyJ(I`3@BX>*;(kfKosONvoU2T_F<Ng9 zGvCV<*!S$tf9<-@^?7B>R<s2wiO1<LII?mwW1(=`*^tx==VupYKboksU42^aQ#NM* z`LmR>E?->x%VYMLfWN2gIYK{AU^+PSlYmhDd(FW2yj=FH77G??lz5n)m|?~Dd&%K< zyU$OVr4p38pSQ8^+u8|HJjZ4VaL8~3&S(Ag=kw+Tsq^dit+L)wC+KQfe@*?F*A)Fp ztZ9aKo~y@JH*xXGv2*QQemK(oW}d?|L3s^-#;ZSOFa2z_)1CWYZNSZ{((jpuQVJJ* zKF^c7wpqVoZ{4gDsV7nkxh9{_E941NSr)bF_~uXQPt2Z}h2-5kmV5ea>>f=q#t#+l zbJ?ZmofEKpTEw9GCSw+}#$Wb5Yj4#5%4a^*?VS8~;REwC`#<pC&Ef2`TRTTqDsZm% z4A(VpzP^~-XnjR}Vpjg5Th&2lD?*IrY@9U2B|<vYYu^0pXl@Igd1Io^n@TpbSDG1j zxH9iN3Y`2gaI@ywX!o<5PnBi#@$pV<R9Keo-8aF7YhH!Kqazuct~bvSkU9C_ft1F% zZ}o?oli4~e3!@zvd&9P{=BLISQ=8`2nVNH`;E>p<8(O~u9*I1tje8*SL-zCym4zGM zcg>ovnbf(+X3N~&{fC}*dc=2DOyAA&{Lblm=U-kf_ZLhr_j`8a%l{K*2@4IQWGkPi z=$Q1)yB?7-XW`<UzfO<Obm#h?UzL8<ZBD@LaPgeD`bbMf{uV<Swe+X?f}WbCF=Ce% zUr%fMnKScTQSgU9>Rcx4Z#_C+bC)f2zhU4vmy@3-pKH10FETCcoZqRrx}Ca`+4_I} z3bw^EtvxHd%6GeoIZvRHq}L87Nf(a&4KEx@T4E-iHgY*Ect&%fi^*G~xZuQZ1qXyT z7$nF3x~uD(Gq--`#xo|&pUo4P^z$~Ie!_0a;63f;(KBj!F%uh&WQ-<PILz`|em&e{ ze|h=kXZK9!RlKZyvg-P7Ro$}m6Yp&zzRlRnIXw$$`s2jfv~PPh{QB^;U9K@|<<+e9 zG6|2Ch|CQ7B>2kcK%RN|b>F4_Qx0yZzRU1Ebi!AshxN}T*mA!9s(sp3-xE{1ez)Cy zzq9&rR;3CKMNjINT$Guxu&DMncb&zjjShF-yeMeCDN&)rc_iV_i4SuYAMD~iTy@3t zs)odsnv(em@7_Mz>6<Ke)@$cwH`#EP87e%UeF@Jew@-8W@~cKdLPTx9(XVsto>tbA zn>N4vBx|TUeTV-pi_IDT5+mL?-(T^}&E)SDk9o%q-I!=x`t#9^!Y`0{6;<VL&u_L{ z&b-P0yeQD*V6BFpBJ-Oa{L^o!Fv-=o+>p8%pX%OZys*UNu1Q&t^(xaT!B;q4O=K-N zn%tZ#odrUyzE*YfTMKZpXde4}__uPqdRCI9ou7=TTG6x_8&Z~kX60el`}pzVoBQ?) z64f<@-2aRFd_40^$D`TunjQBOg}jL~*@T;8MP_9b>^kYX)}tvi>&lI}veOi6FBQty z7hF8Pdiq-Sq}9((NHu$0c^G7I)1d}5uYxkI@_t^Hme2Jt-r1`bi+=+5`<$XyeC?Gh zs-O7I;PC+y$wiv^P1=%kpGP{(-@^2JyH{OnPSTG|*xbs*eUIN?51ZgGy>;?r-BN>- zx4bR|Z=7`K_vC-|EB71?)k!c3ij~?jpH1KI<kjO_He|LetqHLVtGH+UNQF=R-@he0 zy4F5Q-ufmdM62}Z;`npohZW|Y4V=NYdfggJ;cg-A=+&zNVnH3iw>GWzv5DH8;fd@v zfu)^mqkgPjrfL`QO-R3clitr|vs69e@2X7woN#%e@9dX(hEtS0>!*hlZdiBLS#!1F z`^ym}XR4*zcPz?0f8wk5$~SR0PXwtYrs#A2yfgKwx%Xz7#`I<DP9HiH_`<leMMUd! z#-TdHkF(9g4f1$}YR&Ur)-oQu=ka~UH{M5k{sfu*dUX7}r2k>7byF&>gm3xJod3*z zW>?sH`R%73H8O}^V@XNSx)ry)e$hwIj!8>-j;{YT_dw<6&2tolt-4xQ_gYj>QqO8v z?s(1pMfcT;NpoH$ecqG*%E717vS6pjf)kD<JP#+`Rz4)ZW1Zg|$&Njz%9E?|Ukhm1 z*_W?Ko2mS~JG*wKK~Ci6O%;55Qty{u+r6bU?bg?(P3Lb3=ufTQ-!f}?(us+7J5*Wf zZC)(PYGKRvV*B{##NrU<EaQ9~uDFjK?3X<jzdrppsAz)EWG!di@Luk7ZrZo_(zkDt z4J$r)N#yC1EgM%<eYkcz<673-Z7W{Ke!Fx;C*s1^i|>Wkze+dRx;Jyq1>1YZi_1>T zi(Yr_vhVdU&c{AyrTjx~&o(@%d$RaYuJid-HU3-b#m_F_lZ;eLeRT5w*=5P0<})A3 z-0J`SVxEB8<olZrz0Um7Qz~|D&Fy;&ewUxUyEAKl>Fm_&+^5ujB;2%mynIGO;I-3t zQ$<@V_KAv|(3rr;7@f24&daZR)z;hZsXJ}>c3Sh@xWzK6=jNRZTgkYVfAQV2`^UdO z6`h`O(e&NnmuG(F)!*0~cH%+U$J=w*lN{yZwd(hWMmaC_71{6lE5`kFGqaqq>gNMC z|8Lp~Z1@qBp)jRCyLVZE!wH@98}8YxoVVl&*XehAF7BB*x%;KVlk0P5w??NibUuH) zc3H?O4qxTd?_@VF(-UDic)|MJwm+Tk)>ag8p4+inXtBxZc{`Qg%g#^=s{i4qcfzCe z>Z#?Gk{6#VReoF_*3ELO$#8SUqF3KGzYBOLYrewU``X^aAukL|=dTImo0DX}wevJ{ zPvW7j?Pe#BSoPK3bW!1OzF+a~y1dxt`aLf<Ow=s1_fY)6^1|d_!$N00eUF)c7WJv` zFWflsi%iYhlrxWdLJuc!3EW>Hcr_)szU7~ZcmGy7?Wcz#{>EMKl|9#>WO#Lw?L5(_ z1NAq>ZY3_B)U)v2*<@}W<_hDTwsQ8lS8s|dvQ4_;SzmvI@mP$0&$QW}Cnq~knIjWA zwW~?P)2Va6{i6jg-BvCFvK@ULJdqLe6W<yKA7$d5)RXyNzGKtkPdn^SB`+^Dt=Rpo z!=_$W$Uoit-eRNt+P)`ex1TuXQDO5i`MbM}NseKm9*gF}h((w8X2wkHuYVb*X|rE{ zm(a${IS=H%xZm7fRbJ;cb-vp2#>VY)ywr6{Kbud`;^p|C(DLT{)YZo}+}^Die)sh{ z|0^qh9xY}*zxStW(UD^1`U!5u4sEBt=IZ}=c;fi8YxOcUIgdkjUH;|yx5T>7`3k#n z+qGN0D{7RuH*XScUQwHUe1lx6uPGO(pRoLIhPs-RsJR}KV2Ik!+0)&O<QG+b*Zw?f zK^2pG-?nwt#ThNf*S;^fd0R|y!vtNwe)m)Zt%}qXPQK{@#qmNf7dN<@DzW|k{q7{^ z&ujnoG09EPcCT;JPs=#2Ts2wqY~=a=1Cy<of*h^CW=_*xbEoER=H{q%9!^FtOP8Oi zh_K*4cy0LvWtAgsM^+_n>h4?WxPfKXdiM)0FK#l}E@C*kx2EnAFUPy~Q>|j9b~8?@ zn||Fo<IuP5=Q&&_b-NYG1ok{RrMlBhJ}}05?R?W)pH454cqqJEu->vd_T2*>e%UyO z>dOb0MsG<ux~y{Fo5>1iT|apw`ER=;$8+OC%2l-_XW=(@cjOm2-BY~2sqoFRrLOxt zH}m!#b-X7jT+8@;zRZ)ouA=hnmCqR@XS`@`-c!CZCx5n~aCmR?p5W_;3op6JEs^B= z<hJ9_nhi%B?|Glu@|yLb!uu~Z^?_Hbey+GE;JadJ{u!BYzgu5JnrCEkZG5`&o+78H z=bomYhr9PkzfW!q%WQw*-+24sz1^NUEYTf@!-{upyILH2f2~+=rjZ-l<;Ka0ej$$| zYYYFZ>d2q6!e^WAyS^2m&hUEPd0$zx{y7?KT<g9~pD%jVM<<!^t+8rbPd4ZFD%bDc z^6+BQuT3$(jQpmFPAjp94AV-LXEowVabPezk^Fwo^tB&bRKpLg%9}OmWQOH2gY4{O zHK!NxyGnU?d0Pm)*;B2yDKze;m(i(&@US<hq%KbljZy1$+;Bt0KSaY=HopJnIi`;e z#~zDqcx3nf$=zMbobEXuXD?m7d}|}ilit?-^=C}(Tg_J%_{6}HD5N5&XW785=CLkC zZAQf0_Ae)L-Nh&Vo%q*MXq!ab6USZO=f=%<U(fcyv*Psx^>2TCCx5Y8a^CKO+z0=H zlaKG7J~Z=bZO#p8vvoH0oaJ*}=Bn*XSdcY$`f4TSx4ZB4I-Fn>SY+#5<Ct~Hz3$_o z)owbI?AedhpH=!_^<87toGFz`=8H1UAN5=sWbLG&ARxf8^Wue>S?8vFwviFy=#+7A zs@Jety=~`)^FI!(kH7NqiTS5^7xw!3i5zpRnY+99?R}tP{b%RBYiq-vu9=ygn`fVt zdwT7Aoy{)$U!S~c=&)*X*xI{MCf#2Z-o%TrA389V$E&zJkT1M`&NBZ!m*2<!u2Z&4 zS(&mb*<+sN^YqU}N-O6uM0kChH0PD;qLpodw;Fb(Z(SUv`~UR5JqmM=U3G}`yiv9` zY`rY^h8aqM?ib=kMHcaVou8}8nI9$?aF9PI(V@QMuDoH`#$_Mxuemzwc(-5cJtt*x zW(SV@6Ztq2_v$dP7{*zA{82wMb9%spzfr9Dztqo73(WKVk>Zti+Nfjdo`sKd<_eVZ z$BS4UuTgiuH0`X6&8!a@ObRL;D_2_2Jf~(Yx$Cjm0{Oa}%{7IRk#_4toVIqHIGd+h zA}h8~QhZJqf9uTb>Hf1VZ2p*^S<-NL(#C5#GtSh{IX}~)KrLkJ@l}-tKjb;w>;G5F z75?L|(d|jt{o$WHs|{BLpZV-v!MAlPlx+EPJzo9EWI6iIVPn>T>}^}sgc=mfx@Ub| zyjg91b&Sy+=kkK?Lp>pZtK8H7T!=`%|Hr$rb~eu)@#b^)(pT&@TRZKq`6v0E+t;k0 zu*j<6S>+qg+LFS6r?nFg{I4(kkeZRHzO}0U?UNlwx6{u_aGq8D`#&r*Vs<5$!rZHd zUj%h!CLP&tF!`N}s=>^xS5<QrkH6{=;$By`c-HADy(^h>nL?T3IqYqX8zRq7%%AhN z=g`6D@4NSxa}-Qr)XWK#zBA+O4qdCjRckxyFYli+S@+iUA3tLBT%TU->6oXmep)uq z#W@j9YhKs;ey%_4%`4;l^XM#pE4i0^&&~eWB>&?7tRI<n=FHjyCZe^88N70>DmUCR zroC=eas4QG=#uk|;2>{<_1qJCJj5hU_IV4>HdJc)&VA^oyY_sw0>`{}>(&Wu;fOMH zcpb$N*|O%xDyGdB1rK&4RP6lI9J*D0uF96Kqvf45jVqQY)H`$4ExF?yEOWK4@r&Yu z!>63q*B;w^Y27qyE;)mrjqhBxh8|X^^Avt0_OxKaySh^zTi4C0N_<$;e6x1bN-M3I z-ved1xuUN0P0&92-0NQP;w49Y%LPTY_2_FqHQJ=QX{mt1zLXYS-;g+sj^~_A=KpLg zUtgKs#Sp8m$NP8Q;>daRhgoI{%?z4z`HA$__qy$BA{okgt_R=h><!<{!+qk|_T`r~ zH~&wI-g)qu+PA4Q-cBsPb!BSSbB)l9l#P2_-ed$%KNqr&=lsf^Yc)Sl@i=65RNu7v zAM5l<cdcjGr@Mw_B@>#M^uIKF@v1C1z?~a?tHkH#YGqN@xEJhq{~B#vTOU-<%c=Rr z$<gp{(u;N37xe$?Z?4+9R7P3SW7m5V-LI-kvTl5;kWZi7uA4vq*2$%hD%UlCGY`FA z!=CEBHEOwL4GV+4^J|^CMw&v=J>qP;_9^$iE8V7YZo~Wfv_E$&wB=2uG(Q$|mH5B- zyXo{khRg-k*?UuxW-hvCxoUgT+=~yb=hSQd@%Hp-EYi>3`F-QX{V(s;NG$j;dG@)( z>Q?hR4o1wiI#Ro><MFLk-twidL{4`2tvG2p-}d3A<5xGDmUe!1I98H#Q~$`adY{tS zMn-loZ%zKc$GBQbDp;g;VPMm(x<#`VUv1hFXT9p0$i;qcp>S5cU$a7fU;I3Os?C!Z z+YT>C2&(6|YO|Utq2GE~>Ehg}!sb$EvtGMYaM=e<cG~yL+s$#SiOPZIQydlNf82bY z<mS@7_uZV`wpP`LABnewbxvRD&wK2G@;AZkN46_$BX_x-v@M;l`IW^XVjhFhm6h4O zGq){V+jJsx@uke=QyHen9)7|9FYIh2ds)MDa}h_OL;3vE>ep_JEm@m>RgSgnTJVWS z`x7;9Dt^oP_A{qUv%swV{ezoxu5Y&Vs_GMMHx6UbaQ*)$^+Cd!U%j)eZ2tdwvRN_z zg`CTUz5gOodRDFMS^QJj_~qUU>^Fk@OqZ>*ORK+RxF&sD#&kx7cjwbrYb<h{U@9T~ zm%se_sj~vQOeZ;cn;zY%H~-h&GWYVfe|tS*zTR7KWYbKJjaS7l@cXEF=EN$$*}cri zM&#JFj!7Ryu5eoIu8dHMoot)6v*je0n!TH9(dC3|48oajG-t1rxPRkhx&O?F#g67I zO+HBz-gZ{!y4qV8iWT}D_?v#l@>X*Bp=ryqdxCE+cNDL<=KfBYgY~_5#P|9;@hh^n zJ++wkFYtox-GhP0&rC8XRTKMT{U`hSjIf3rec9X1^HXeR9GqNyd(tYOn_oA6lUnDs zWa+E|uDi{%vhB}(xnVoe;&s8K?N1)3?Y!J)Dq%QD^oIPyO20eIoV!HVrA1q2l;|1s z+B|%_npuJO#2)qD`isRf?ap0i!YUpdO|L)m>VmJG@@s(@fnfGCZLPa+PXBqQqhLnq zqMgUMD}(lL{C(l%q?;Pu{hN~&zI+cn=)kG5i={+&N<EXFhKfk;-;bG*T8HMW6Lkvw zD<|3|zgKbh^Cbb6U!Ja7DRu8V%TbjT`_!(kczhuK@uo{#>vZ-_=sfvBy77LS&5BvO zE7m{wez(3_F1dr<(DoK<`{vcJmI?p6#?F1^&CDBY`b868s75{d^jDbUwLG`yU+r1{ z53y{mQ&sypIlcGqrx*Xq1eJb2zwfcI%Hpv9MCAk3U6Pp|6`h>&zJF(QZ?C+u@<A;Z z%V9=w3wD;I1qD}kpZF~*XT)-KhRx<0Pu5RGSpj-a6hdq#*K14t_Sz=s`0(Z1TEQdA zHFf{mLj`<Q{_M*!J-B7c_a$Ao6tmh7-9CPjcWI#Q8Q#u4KddGv-<q7YIeF4wUxU<} z?A+&f{bu1T`~K!v_$#aSKz)rfYv<g)xOqKOBKyN?ixlR07li`%t$y6;c>ZDF3l8gL zt11Ip?BB*V+`q5${X*o9`tyej_MFPv8x^+d(Hfy$GrF~{<6iFXJ5+m}B}(XpPtfYc z6ZwLoVpWPP3uILa4lbPF`P513NOyR*VVE=LlzJcC=~nH<fqeHLHfWe%oy0r2T0#6n zL-tYbiRXBJxL<BslXLg8{DK~L$^9F9-p>h*-a5;{$nM(x{!2#XC5wD+E;X*-Ek7mb zzAnQ*_jO;Kj_p|fs_pM0pYvCHUUuC5_w4EXi}uTW_86I3$mBD9XZm|iKDNr}QH$=6 zd+Zgw@9xg=(Qz-=-2HIx6{(k+y=hD9PA$C?Wn}WlV*0{=s{hVvIA6@1z$sm|^G*@x z>C?rDFDE{zHC^MbCe$nR(n0V*(83e{7j)IPKjO@@&YM3=`P7vE(XbVecS3$zTfN)j z&zkh-$U$kR%b`wh^HVpe@2>R!`-1PnWcLDvb%(z={_4FOsWqke+0qk@D=b6&4_;q+ zKjiKMSDwx5XS;4voboU2VrNj0!koRzjVtA!^JM5fwLBnGu3EG^%5Tf-<GsR-Ocy>D z)iaqnBm^#;lz#dj*QUgz=>D8gK1pY*)5=c|Jy7*XG@4a(UV4hEwd$o1JF{P>EH8!# zuW>u}$EU;Ma`o}0%T|B>l`9}HVLp=*+o}mXuc`{uza3Y|PP@pG%JZq^@iGsdzuKx( zjlS=Bx$N<(Wyda*9N#C~HE)K6k?udf&*rJmv^>=7uUroBpM0rj%ioiFE6O>=7I&<O zd$l)NGFaTl=ljdZ+D5IS+u|L9OS^9_dE#ik;MM8N%N+JO86@A^rm$o|WoCEr)0~&i zaYq*WZ&{h^eD7SxNpB68qetG(7wg|-mMGl*c9I+GNe^|)Ba81dou3)tTVLTR)NeD5 z+dS<O*RMN2G%wa~K7VF*%EsPbr%D{<t~G4QiGR{-Qz-hUYd-(OMLaH&GmP(jI&Qj< z<IK-MQ*P5OrRhlqycf(9=lVAD)YX5!>8hxDxomgmdd*Eixjgf4ezMWOQ^R-lXVJaa zTEZ!1`#zojzH@J&lDxBT${x4y4+rk7XizKtv*s?N^s+tEKQb+M$*b3i>ppsc`J(&< z=`il7$^)kTKO3gb+`Fme?}<&e^Y2aEXSC<_{S@!ikj`@ds-GcAS6_#GPH>JrekkXR z$gQhce??d$rZK(QUpep5&hT9lxf2Di-|pCMI?Gb3>8#D>x3gM3PReM;&0EDj_31Ij z)f<{DZmQ4u@%4gSfY{NC90DvI?DZ4!ZO)%M&Yr*RRFBL1M|-EUFtWOIt6f|ebjkFB z;7t2>nls#=E{>|5C?wzD^W)<jUe)tHjNiYzE65n$e!af@?!HTE+k3D5H?z~o{?g(n zD`j*mZIPq%p$Tul+`D#Dai^R8S&l=3XE@RX#Z0^}MNZtXxoC?2*Dos~1vC6kryg7{ zQ_qtk{qc$K;SXZA{1=>8E8g2#XSS|wd6(3*Q+B`0QaQfLH6E#RIQsI=-7Rf*@11QZ z`L#Fu(k^MO_;tGuKb-n$>HpL+VgL5|wz3A5<=1DVFS{@Pwlgc9Taw#+P1{M;qQieG zgVt&-Pc8g0`S8z)yW;;GnQHF*YwIlTBbER73lA`?s4sr)vE{~^rOHoNMBWcN**j&Q zc7DCfp_WhIk9~c6)k<&m6+y+NQ}yMP9K1SKZ*z>E6MiYPb+KpS*Q#??UzaIOI?cE! z=a7=lLdlb?7rCZ>_S)&8_4HFEYn_GO^uz3He@x-_)tlbma{SUn?_&#Ji%&fF#OQ+N zGT*H~QjAvo{1H_-zrJD1taRzvAHBa+g3UiA$S%^Iz^t%9w_%&Zt=Epx4tJUbav2w% zXx-KzQQ{QsAQQ!!%b3_%c5=0b%HrNTVUY>88)iLwc`<UW^0_RbBS);A<mFZz^ESK| zvF-s!ZLUVMOUvA=0WH&h*`3=g;C(CQywi`ucaa=9l2u|CHaE;`HN9TnGOzW|>A){K z9u7`lbUGZ>zvyr{F01V|>e?c)e$uJ=XLrmBc_jVp(4JpXVLSYHe0{t9#)*Q*D{k3k zpVv>iSHSZ5xYyD!(R-)FcivjQ*5tii&5L_A6~>1Q&nhxKn_RZ`j^$+jGY><#GWphL z+jIF@f0~_hg!{(fLN=94+UZ}Inl0+jHHpj*;NQk-d~M-Uou9d;SFO^&Rz3Cj((I71 z^w`#KO%8HWfojiWdM|kEo{Uzu-Wau9eeN`eIb|n#>eBrsy)B|nKGv);KH3oHwKph} z^S#Z?Y7gt))s0H>9^%ZL0joG1H#}gt$z33>aJ0zJ@V2~pmy8<Q-n7sB6XTLDoSuKR zewx5hm!hXVF`r*XEfC*+uKxeuKHaN7|9<D!GOhc+H#gH}5vO>`_tQtV{qr>a!E5*J z=!Mwp3*vvp&$zhCQTogi>7{iM_v`u%7rSgaaPNn{rp4|(VsfiO{b%V;{B`)}Lq+FW z9bX;yh=*lAyZoa}cByc@F0k=v%Q<PQI7ePW$SSeE$lpV?b$?ZS##2|-<GUgQ{?DEp z|0vDm4d=la?h{Mv`jxN$-eQ`OBR^kvN#$1Y?bA9|_FaErD>K_ADpPL$*4Kv=6}GIs z?dtI6U&qESmy-t0UYrx0>J0DP|2HR)&5g@@&zu!Lm$ml?MXF0Z)C*mn@}e(VV)eRj zAx)MFtiNg(&8lB~>4aB~GJ|$*NcPlo8y&P;B`VyFUOCo${P5xO@>9>xKQaoNC?mqh zZ}v9ix}D`K4PG0sNqs`~^+y_+eRMW0pV#$pt|a5lmRnER8U!A<+P<B%>Fxctwn*D` z+H-|n94AG5`0lQfapOz>%Dl@Ac0YXP`#w9#-8=Du9C!D`-1STX^#=rkW;GwSw%)Sg z(7a!r6BAwDKQI5_Y<yWb`L_O?j0(9k>~*pthsD${#q0gre@$xL(KA=FqGo>0T$6q^ zN1szd_-0^H*_^Yg)zwP8uTnl9=?8WC898oTS>Nn1fro>CTI>aFgPB$<mdXFKX8$4Z zYRUvr`Co^%H%?7^{vyP4_3Zi!=htWaH2Ct#my4e#+uK_>U9`&8Xp_jv8&ZzzWHq#7 zIAmqky*W`+Ra6qQzGL&DCAVI22gR-O;kX=R^ERpX@#8H;msT7vTf=of^6`=tVXv3Z zoF}5h!nDoPe|n#Km}hY8{o3d3cZJvfxqhYj&U%Y^;Zy7OUsu07d+O0m8()k0N!81L z2%FYzGx5=<53DCUYyEzmihsYWcIjTeovn-3#63LtS4OC0_w#^5ows-H&g9*_SNf9d zAN%V2hvryJTJt+R>%$SYH;EbdZp_<|&mmxIcf7Zj;rzKf@AmOArUpcKtWkOM?cKTh z{h_Ljl^!-Jo-4ZEbiCb|dS~^TKcD7K?c8^#WOu#!+w&nSs`sB<(fs7wd-J)wzlra> z8*M-T2=h;?g57QPH>TAj%lO`yR+ARJ&CvI}?nm>#v+K5gYqwLrw9nw4%Zpn3X(yF# zot!wk-~GlanUs|Uadq)x4;@a_N}Swz^nzZkn`~jI`<oEsE!DgFCtkX4@Ha@3Z(?iw zhLss7bQvR_Jg@(zea!0T-V3dKMXE7vw)LtE91}uptprRKO}37ZPZH*T-??hV?1;*= z{Sq=tPd~4!iF?AQBxvUM@#CQ>H~oIcyr>Ooby|BdX%36W2lmdNd&*5ruX4)jib?Pu zsJJK59~WBPQ^L$Edrk4vPsuo0&JFwJcC45-JM`a|1E(a5g?AsVkBwb@t!ru0#E;$l zT_S&bXRo^T?6!Z%X{7`Hmm_5*zsQ^Xugm;*_*1e~O2W_Tq+8`VT#x(a8{Ylg_vGs1 zwN6Lnnw>?n-fM+?>YROj+Bb!?e;zGb+*2-9xUPx6`ew(L)*PoL=bp1ialHx>OI!Iq zPjThlC4APue1FBdy|unFCHhkR;avW|dUx$kyjh<2P~h&?<XMRlY9|@9JYph!HN+iv zzIdFbeXU5a<xAkH>leEnCLHMQ*n3g+v$OxBt*cU3p8KW7AhcR6<!Q~1gD3YH=l*2; z*ORtmh4h=4hr9-#51aluyJ=4ScQ(J{+kW0t{$e9<x8j4VRp126HevJd!`p8DwCt=m z6p-uGWZ-1r{4kY4`u_$;76%r;2o{N79}V1l8PC>4DS0zh8J+olZ=T}2@984_(=*Z@ zD!$sU_<5quoZc6Q-ESLgS+J1lL|??F;@;=M5g+-rti=xcSKY0b+GAfBTw?F<yLkOW zPqvHf+1t`4)YY5(x2biqf1^IN`O7i?JMmwI>qDz<i9Z+JDR@=ymxkZ(^u_+)FBmZO zuV`MRko$Ju8#^u5pzd?=F(0OLF4kWAzVU}u$Ik?Y+VpZ|zQ5;xzs(0-GH>OPI&s|- zwkLl@r{;Ao;650kcvUjGc577d*#+@}YX99cdmPyu*nUi8%s+lpwCC-!m2tZ9SCnPD zWhc$hH?2SaarNqs`%5&%=7!CyQhe8(xNJ|zG~?)&ykgc^)?Ho!)xNvqgq8U63Rg^- z{`3^*sT1=AH&)yI;pqD{#m!#v>ZzB;zK<(BgkxuIz1vZIe3nnc#e#y(l0DZp_FQx1 zD{Bd9O=;R|!ezdPLEXxbk4awN=cm+{V>TA84@A^1ANX~xKKOtt%XER5Lm83^^SpPg z^xyH2#iHebfZUfu2W6Z*W_?b};d+#M_9kmkeXhBL_A;XlhPB(K?_<^!h~w&7<b5#d zQhmsba-~(LDpv+RDv>PQ!StX~?_^!I`IquDhxWXjcyHfQS;rUor&4~czPvOd=6~V? zRkOrLt?w5a%z1P)J;<lN=a#XGQ&5i1nP1hPPm0c;{lz@@iJ@X@ai7PhnXVZ(&aF(^ zI%B%B>_1V><rRf?W_wruln`IY`tr2%_V!mslPpB$9`$P5%~$#VSbmUu)|V%IufAE8 zSRan<&P~toj!*fubxXuU1vcmA_qh!Is%;naOqQp7SCxIWnL*61i}if5XT6=nwtGL5 z7=0a5L{4wrb4G%zbHRzNt|uymGwOd#`2Kvg=z_lwJxVS}cHO>fmeJrbtFkR;&jfMH z6&h_(lbfXewCjl2GclT0EWF9h8$U5XbketX(#EwbX5|05HDAYQ*_Et-&Bix2GOFHR zF>UD+zlR?@o_#zmzADf4aoh17wRQLI)rYtzKeRZcZ*BB|-Thhlh0PDo1wJy?d>lAi zVs?b&voCh~DsvKq)J{ox?u*-Pk*|8KBd6eY{*zbLHxB7f5NEv3w_Bg(^o?bED;96q z5%OGX_pGT|s^>2n73Y_wR;FFKEh6o|{DA7L-A||cugZHYXy)G-xYD;WN_F!*{p(9T z()YC1$3_~Y)$%?U(SE+kaCye8k6rC|9$gGSGN*HjmE6;~8_&d_ygPL3Xz;xS)qmwa zeL8f+c5eSvjymhhQbmrZ)XUF&RJ$A|By{J~Td5#TdG60Y7~jaLy6%k9Fo}wL6Z@Al zdHrvW8?$*F#kRC2t(tM<;LU3;3ni6H7i4_&JzU~DwS7wcoK-?!Y~(Mxv}-E~M=#=^ zSsFaK#c^k&;pOs>k2^l=?+uwZIdNhCod@~8FMqPNM=#ctkdZMBstr{&@s#i6Tf|r# zd{iz!TuS|-hU~s2T^DW7T8cDTm~yIr3YjCNIOTGkTyMC#%@5@TPrn@%xpVLLgl&Sy z@2s_2HtSZpl*k{&5B2Ra4Gs23j91S7GpF0a!t;TO>!IGsMU$k8cHWC&cM8?pcB)ig zVNKl}#)Gv}L=<><&Mv4)UVbU->B;#&Io;ZMz8^?(aNF@@ZFcyg#y5P|+HV{=T%FqT zS}kneP5pNlCH~~ad^fV$Gw<fSW90^$4L1kh{`|B04vYOaL${im+tOJq^+(TqUDYer zzuN9>ZTk<6>}8y5Cj8!ZC{nTC@9A<`MydZ%{gLOM9z3;1W4E8_ah7+J8$W)r>%JPL zC_m}DWI5Y2jiUE*68j@Qnu)n^_W0Oby=4DL_mzvT#1-Q^>+bGIf3fxT&q@0`vsVYZ zfB)Z`TRrQRw!ZY%Fb%QQ&liYV7*4dTx4u@X6L@(`;bmuoWj}xX^=osucz;@m)mibL z4Sy{TPFvbjFvr(5u-Gzn;{W@Me)D@)iFcIG?3JFks4z$Q`vF7U)pp0iCF{+753AI< zIhZS-x$=GEsr`mKrDYaB(_a&*J~@l$RbjgZ*P^OBf4UA#E8_dQ<2m;yKNq(>{*RX@ zZ<$o@7MB~ib@Ig;%RkOrb6!ha7k%WRWH~pFJ-hrvrr-JnMHT8C3!Z4C*&B+QdC03x zT*maPfA{$=t4yX_TMv9?><AM|ztbmiC?{t{>9@UViRxJ~lU!be%+HwTT;lq^msvx$ z*lThA%LoTa)m_gQ7JI9|+@6>BG~`(Fl7Cv&tmk(usIOl6T{`g6+1YJZCeIFuz5I0x zQ&HV^74CCcYR_8k%f9UP5f?Il|3okA{?`eAj{9!EzW2|v>N6i$j(wh5&pmAcQ~N&? z*<VXt&t(f;GVgibnPgX<dvwc5`-Oa*!IAFfUmvUw>Yv}c%c!F4{?)%5&ImlHyYg^b z0{gbDH`RU!<-FL>Twl0Ef-^bSEM=;{=IWX*algkqW>ywyG*(`Ae^AZgP`bxLkzHti z!sh%4i$LMdr)iPrPAjO@+0Cf7`;(BH9%=SaBsYus*5~~N(#BsFDSwsOsb&;$)u@QE z@1kv)zdtKuoO@HM^yMwl#WrRq7W)`2+4u7Pm(^SCzuY``)_c#!E3@nCjy+n+bNYH~ z-)}z~7U#=TRvxWkDpH#HSl%<jG&O!*_p%F|!lJ&X&$cgpFL7N^vo=vX`u~xKkxXkO zb}Zy<sDJQs)zwWQ={sZBH3-bMemsv~KIF%%&doDkZ4wkH>E%3<CdPOrC`&2hOYB<l zbNWBLgVxHt_FA`on*LMOzD?6M2G%=0ENs(hj(z24s%LL25V*mvHf+PUm6<$g!ag3q zo;+6$_~!kzXk}QB^QXmj?dMnh{o%ACocC_kmfqttTek<rP16oiUBzm%G05)7-<us> z>Wa57tU0cJxW+`j{m0Yk)1B6R>#W=PiSe7o^_%akc6qh@fBdmiSUmFF%A_d2BU_4> z)h8}?i_>4_x^AP>u}x=>?@L<Q>@Fm4^{kEQ*%HNxCuI)TTX3!1|8AFqw%Kz3=y&&3 z|AlTn-v20Zo?l+6hK=a9c@y64i<4fc#FA9|DNcRul76AH?!0lS39I$HdMDb3=`LAm z<;K<h=cVwT6^9p_gr4;<7YMxOC(@qb&?myZRX(pi-}r>tgv(6d|1q8pdo%OsKijXJ z|BCZ7*6c~Ray+8kuIKP+LlLg6Zrw}S6c&p~TRERHovS!2cNR0duW#w18TouJ9L!8g zi^A4ii<-Clmg4bUDuy-(j~rrd-f+|;?MeP)j#m~cUh~9mq}`fm>L=*z9KJI+S6bjh zK*$ZgiokBJ)Aa{5yhT?=JoH$h-nFjB;PUTd!dc#o8|wpg%~$`K`G0Eh(}RE7{~nrh zbN6(KD_u*ILQESqG#2fxDY?98Q}c$Ztu=w`-8>^aSoR7r8pah*`?Wr{+^8}+RIT}6 zbIarDsgE;l-UYJQ+_aWHXZdB@L%p8@)keLX4m=8CibvkeaN46$?>Fz3=*9zE(*0)0 zi$!kMTzdFdd(x{T7w^l|pW69>`}tLyvn2;3M8e-{Oe(h*WIeu_HT29x)j20RBsP4_ z^oqVIb5LuMOK#z2&51=@12Xnp&t>_t$99FUol|C^)8!-Scb0kfO^<aiyu~WEjbkN; z_8D1lt-7yZnw48z!;Lw!>Tme?hHfureq?b|!2$$-@3T!jT~-&fWmV};NmYBNMMsL4 zsy)BK^iW)3(_^1Lldb%VSQfFAeOa)*oc(U&1(oM_zf0(s#jWtXs#dH2En{VH!B=(8 z*(ze!3@;iN#_QeG_xkx_`{EP+Pp(Bw%X##y8{9}g5vY08D>Tow)VJQig^Pbn;=V7} zqMsJeTprjbH+!>-!y0pY^YW&n-q9!2mejT{IrqF>zi4(|MCOU_w$H2FoNu`YSUyz* zx8id-!L9eZxh-Z|OaD|ZG4z$``(plgUvc>Usrx<l&OX-kF!s~b8c*^2Zwr||yT7|T zDQ#s;S5}3$h(-A`BRQY?^tF-eu2w86-Z1r8x6{Jj#Zx4k{*T$gbtE7rzS<mIDA zhnhPNH9nm6T5rv%e){l}&8JuIm%lMJqAd5@srfpa!&Ztc+%5S;xA4xbYmwYS>TZ{H zJ7OP2Y}?H(DltuGe@b|<@&}ztr)|48^X-^su`W0B^{4041m?!6zsu*moW@e`rCO+S z`{H9If#cgIYPe~td@ijvJTlpfF@NvxOIlH(E<9~{`zJj2TrA=GiXk;)LKq)+{GNrP zDncqoRdsElp*I7Mu{>mc$o#O|<Ht7frH)@(gly}6?D+n`{KMwTPn*k40_FsmoDsBK z5a{^)!^1OgUj1myk@irjV00J1Tsv!*Lw$&2$ia$Znp1cG{^p?OsOG5lc*@DWQO1rs zAed}A^>^w0rUVc?ra8k}YK?8BnqRZ&3u(U$mRezjy{aMnwjEj>T07VZy`IWlSMdwe z__<sC<KG=KcxKMgk&>9T%tyCpUBIi^bq35kXXj44weOI-)|}~;yJl_iI;*~Z;kNqh zV&k1sS<;U(FK#Z3H##KF*SU6DuFvJqo!jnz$^Uirmi#ZBsjl6MJ0i9A+R2|5&<r=x zb$8jLdbjLptx7`Zsl_7PrbmiD&rGOnTeoh)D&?|Ok}1+F`X|D>x}6ilOiV!a_y*Uy zy!}aQCg1<vQM2}6iu_NlDW??T>kU_(-_Mt}KKt9M)RlGTWY6C{%<cPRTE)9cyPAN9 zt1ZqYMJ32eJI;8JH~W)5xTI*$y)Nvk{;R5~R9e!1g>IuovxU6Exzh(U;zXjCGVQ-n zzhf_JylYClYi&~G#+l2OzPwVo>s8giz4GfUv(Mi#+SMR$#(6?~z4xmcqbHfm>hmA_ ze~Nr~{oom1>zZr(-f#XoSN_D?YYZPJhzeO&uP+zpYgKYQ=lj(3^I5l$bu}v%e9kX@ z+^$_CEj|B~s{3(%@Bd}<gl&btKb_R?5%G)N`+vgA_)R}|*1o)7xiTbUiqPrZzANAS zRV#n`-L&9-$*h{2_cR~!Mjd4HC^~*(Z^g8l`fqP$NpRFy>RDQ=on@$=G}S_QhWW+G z!qIh}J}YP13#l73+dS5us%*FahvIU@t+&f<L#CT&|IA+UahrqUAKTmWs#PuSZsv_% zQMtG+jlr)W-RXUK%hQL4HV92?FZL98W75~UK;pCd0i$!5wA6F%x}4rN=To2eIWaXk zKgIHiZ`akAHr-(?Uivw%!ji|Rx+Qv=+!<fT<d`}Ob|wxcji9t9`Du+$I8`gZScw#T zIZ~3@;&OC;_M>)Zg$#v^J82w0AM$tHT-kY3%bfM>>raO*1r7uYAK>WZGXGfjsOVU{ zXyWS)vF|L*<hN<tJ)To|$jLCjdh<q!oaUP+45Td&iSxDAubq{2Q+5si#?JQdr#P<r zuCdu1-?H)~BP;7NwQjviMeVQ|vt-21+n#Ud*Qyace$v;s?c~M<>nG1WUFmgsuGb57 ztL`_RS3{+(dvmJK9{&{b6g(Od^T$Hwhuo~E;I3f2?{o9GY`d9Vai?SCQ?^*XYnMN` zz-hyd%C0-yJL-FPm-#Dgx%a~VMfuBbj_-b@8U1)v+0bx9aYM*DlO<LhyCV+C`EJ=0 z8xo_U8XscQ{O_;oGR@E>VRkZ|jQN^ziwi1BxZgZ&-+OP@go+be!o~mQru^UK+<MTg zHKO>3zycO4YscDY!rTFWWXu<>6bn2(y<JaQs-*fm|IX&B{hqn?0STVZA2e0pFFEC7 z_U?ovo6G*#*i+pr^7p2i>KmBWt=@9PAi=xn#wJCJ+cTLfrN65`V0OHhwtGd#{Oyer z^ORlrHKqPvj=F1ikg?kQdg==QytPK}_IfHFz9I*%Y3%e>ayBVdwC;#p8TQH4Zf<|Z zm(|aIerQfpn#$Cn<SkRb@K9NKyY)SmX_r7<=t)i!FC}d}RrR}tL-0<q=eOI&3DxN? z$y2UO;3zEGar@~c@pV5^{vOF*@bPOw*w16L?Y=&|zxT?-eJ5;p9yUB4vD4w-efF1P zcS|ok@6!pain!@uvbf@;?(~`u?vt&4bIO=M(`H=hyYP>gN3K)W<>Qz2r_`S^TFxsd z(C;i{A~Uc1Ox$;&NKO6IQ-z=G%zt$IbIp$hhtBRUoWXm4Npr-{J0Tm7-#%+t{)Tg& zB7bmD@|F|tJ{~QQH7n9^d3ic$<5Q_uv(;XzFS#K2W7W*V_93UYS*&B{SlDB8=w)fH zh`wjyYPSC&CnPr+%#HIDUYR3zw0j}n#CqFf8Cg=by#6oFK6^aZ<%{|Orw8+&ABo#} zP%+5n-KyfluT?x!YXsD6vb~R&%O?5P9~C_F`K?t;@oB|(!kx;j_x8Lz(R(lUxqpfN z*E(hQi+eIXY<GI{Fa19IjBl*lg%=s|SGVujb7{}y-79LZJAaZlzZ>^`Qfm2L>DP@@ z-PN+U*6*IDcH`(Ftt*R~Waq9IY>N`PvZ&=$P3zi{8r62|+YDPZE>`Ya?O^)9yF2{& ztXBT>x0+{p>2#Z$Oxo@{zxr8T%-*{a;@v;POfSi;nh<Dv=-X?9y$`1rJ2&L7`hL}5 ze&>Y+3$q?I=C09Yv+ldi_*UTf7PAANnM0M<=N(^H#^L+6-nf@9^v8!OPInkOFICNP z68#s;w%`Z%(fEZ71-8e{LcAT1I&b}QV6x?ws8d%ZbE?{kV+*;~@P;^vw(Jk+XmNVt z_>GrqVnBz8)(`&ZmogWPZK@Q7f(|n=DDJ5#oKbw(^-iGpO5I-F){-FWS3gqjY;9#{ zTX+iGH00zxR&k*IRD;Rcqh{uUpPpwPXt)%2DqP>|kLl7QYH#2D{J=cRSm+nuys3h5 z2c9ORG`#KikZk*VXv%tj<G&M&YIeWNo*TY;lZ;@`Vg>EoNA=I1dF*p){&I}VsxISV zT5YiEud3t?Hur5lZ98mo;Mt7O->Ctu4@3mD6G9H1XxjKTVa>q^`N{QSQvR7z*A9d= zb9(SCKM>ZPuv+oyrjizKwmaa|7oOyAaPU;@x;H6Cse-5U?C;n)3%g#uctB#ETGFGW zEi3zuJ-Hp<Rakh}@=(9T-sCkwTpwFCCtqFuh1={m+uNzToc5k;{?pidsx`}FwbQe` zLdOptX_r}OyZ-8q_M`j(Y+dzdi|_pMU4D|)JGfoq@Auf+-AnuCS#D%;{ZsV%S@G{> z<;B;ZwKn+{-rU-6`B31tO2*nwGrjc;Me7YaWqe);%-m}?UB1-RoqK(Cul0oNt)D-4 zYnWbZx0&YaQhtBUoV9)*ZXIc^UGO&G&IInDe@)hVj!)|>I^Qm>m{762qu}GZ3-#8I zgmYFke~A$)yCc#$<<X6x&=))#gAL}rsJ+3sP3OvSmT6z^_4qAvl;)qf>NZ=E)tfa9 zkBS3VKl%J;tIu&YyRTV47sWmGsPSNV>UGX#Bl}~SpLV|gwmYZANPN&Y7Je#uxqHz& z$({{oSGcb_I&ac{jqd6t9ru)7*DuSu9iiUER?mB^Yb8(4r%%&zFR6tp)ks})|5lN^ z_TIlwPan0L|KyUM`RK&-UsK*)PD?vlv-so=k*B^|1y*`K6&)3&oz@iraXWUYf89Ru z@9V2sR(bL%3>+2gjHf&F104PpTW~noRwy?c3p_D7x~X{m6hUvV#NGPGWbaIF$otSM z#L%+;g-2NZmUoJVjtt_Q0go1?+;wH*e|g2gp*M;BwR6s+hkK0<l?rR0e<N;Nvz$TB zM1wE?!iT2*wdXF2R`~Z^NLm<WncvEsFSu9zd(96<rqA=feVBBP+jQlvFG+u1`L|ro zKK|kf_fE&d`DYf+_q(n7_fJ6G<##9NZY$}QD)*Jlm45xhH@#kdXQuhPTX$#Y`RAGc zi#ff&_~>T_U(4MlHXK!#X3Cx2V}9N-Gy9d(G_L2VmAqc>4riQu|M=@(Tl4w_#<Kzf zN{{%NJ1=+pZW#1SDvfzbyK~Az@f<CwSqZ0=8d=xQyuDuH^^@-h&N7*I?~G(;W~`VO zadh{|IJ4lai&kF_g`HjUvi|UbFbS)aZQ2a)nBJ+jM6_iZ7kqdW`|c*k=1SFj!k7Pi z@ClDF;>dl&|3JQP`K6gxr%mWoKgKP`7IGv&PsCfWS~*qouD59MyOSYm7H6~E!jJ6z zpZ@EliCRqmq=5OCJ|7LAGHvefx*eA@ghSKaOuIX7nQ3mmF*UT#@>xon=4P|{YfHN{ znj)oqxs?*PDK4ndw0D`Je_Oz3SBJva`zx+)`dE^EYF()2G_9?s<;QDJ2ygYfzDG4u zx3%r=v~Hh+JETk|GW=T|@o#niYOnce6E7btYJE{|Z~Xr2{u|eiWuFWB|J2%bx@*l; zuf;p&9VnOoRBW+;S79zs<LcGCY!S=1pZZb%^};%V#VL`K|DFknVXJj=y^toeNkk-^ z;pkERYEK>?bD#a*T9<vdSjsyk_ubgR(R;n}spf_YQYX3(IAuTJD}UAex2bxLl>LPp z1si@;em!uu|LW(U#V=;+GKNkoS?2sXnT5;n-ZS?PUxl^v<@^?Hc=LBh$<Z_SHpI{P z^p)r9F^T%A6Z-0Jcm$U!-7J|iF;Qu@jd{A%Y$3O)4VJTfH{>l2zbbcrvR@{*wN%o- z!;0J3mRT*;3ki4}qbKei#Cze%^ou3u+toWR)-?Wm_Jlj;$%Wg~PN*-sr!B+!W)54~ zw4nQ6POpEVuI{{ty>HWfMmGj!b~nfEdz}+&twk#4Y~0S&TK_XXX3rke*=zROJb&|G zhGfaV=eKk^&#+m}+1x%esxI=#jmfQtMACDr^?lY(Qjxg-<LLx{v5A(Cr7w$AJfF0F z*McV=TY~~0)z`j~Q(3pkFkWYRlwd1EVT`1;n1AvDUvt0S*%9>%*M7)9a?E;e;gP%* zza(aB<xWnWI=5C}Ud5;N^`Ucp=bm3+C#PY|t$fyCUgWki!}57GEoph|N7T1oX<Ve3 zo#690_C<tF*!i29A7x*B`gmx{dcU>7#%|uTITef=Pp~LWexW4%VTKv!v#DkuW*kUn z>eqar`T4D3?NVmexZ|%9=ET`VpSDWfw>wW%xcjY`)qNe4ETuQ?#o`AIPgc|i`JQ%r zQ*|!s$3EMz9227rtyA`WZ2If9VT<LFi)v50(|eY8Xv{GA>mGTy)A6@&T&VBjw`uQK zrnAH}in_?yo^O|zj9vey__gUTj+_2@{aP0-ZcpW^-^|IEzo+4l)q9`&iw{5A6KcJ_ zs?R#+@5#<DSKs8{o^>{8-<fxk1*$q5P3u*jdbbwY?u`90`%sZviT%fwSJaniUS9dF zjjhYCRzYat8^c3+ynN>*e{f%abzIWTt2OHG-Q+netx~FH;0D^}fUlaip+2n^hr>U= z)~Nn+uug{iowB{ok@AC@RknhvVoulit?HIWN?kQ6xfNNz!Fek;hg_Sop##HG1NNr! z`WFrb2lZC0yZcPFKX~`D&u;z|H~!ArHEZ$dSN*<W9#2|qC7m;7`r29B?&=J0)HFTy zeBI)yIbI+5uWnlVC1z{N#n%$EC1MxGKZ@xWo;Ib`?n2V;IgbDA)Q;69OmKbF`FY#d zb0uB2FJ{{p@g{8y(|4I=*EK2QeWJ{C_j!8+HD}+h-+#a4-L3d1W$z2pJ}0NdyjIea zpICBx;?igHJ^npjcKh|S3xC(@l%`&pXw9Enay_rW=Bn<2J)-M+Uab^6oVdhGq)Wk3 zIaI;JX4Tc(<v;T}Y*_C~8v19hzu_US_T&4<)06%`i=3r#e&Tok^d>XD#v6s|W&1wX z@jOj<{{BPs+#QqaZS(i1r?Wb7JX<p<B;(1_MMoOvowrhTeKh;>vKO_B3U@|oPWzNC zWqj({_YW`cUVWj*k<Wa4fAP+cHKGUqHU71p)zw?+t9N66zft;Bl@0X?|0}lCU*J0` zJ-NB>BlpGQf~yrTSx!&czjysw+uMm*i*;1p{AJY^-1d{#zq9+Ab7oq-tw*(fDT|t8 z_3^^g4(s!iL`Ak&#@{Jj{p?QCy|SH8djsnp-;3bBcG;(1<=&UY-j=&rYo->h+q&d` zL|pJJ*ZN8MbE6NfZ8!T_b?@Qif6ae%KIeb(*Z1A9aQ`IF|1(|dQ!cDOapc>XE0>=r z&)jch{pkLSXpcu0_hTDV7RId$QC?fGSKD#w>{Z?KA<Xd$d7piBW;F9XEYhRBQb#H| zwIeg+%%g*q7d%ow+}Pq4bAQg{%_3LU2UP@3w9~)SQ(PCag{v-W)vmdhc@HgEdtuG= zPfLZ^=iE$p;>!1Xb&YM?p~}!nuMD+%ll^}caXy>6?d{}!E>E7htJi)!^x@|ceKAuP z`?vL{54t&@iZ{^{<5yJPxa`f{&kviqekGrNmoWFop^6Isq?@}sr>1}Fw!4(-C+523 zOkalXrNtd-F0BW@?a+)WQ}nxbV@9U4Nr<k{z2u`VUB-$%%d}q3var(0(aZS3E_dcd z`0mux^?Ob}e9ZMjE_UJ@@uf8}YY*rgobz#6z)ACp9rbN{)7`gupI@c2-ZsYV^(lXu zE&Jwoyx6K@c<KC|J^Qx1&Qf1+*CwkgR^IpR2H%NYxhC5>a}~E9Uo~~<ySog=w;%VM zKRD}`e(THy|D>g?E=dMl`K#?0w}`Jz)3WX4<m2<~_N?A!Q}O2EVf|3CzB9=));?P= zv%>n<#GhG84^y7bIavQ^|KlUK>sI+^ei2@DyUSf|Ue-%_>!8iq%-a?S%opf7qI2Z( zq{gJ%H?CyLPW@T7bN_O?4F=XeOWAZyIT<*f9=)Wtz#&)S`0+^-m~ZSnJSpG$oS8SH zsNsqZ)!C1NS9cr@<7H-6n8O(HC8nvKb3#I-nFEtTqvF9>gICg7JEZj#>#s4G$jW3J zym8p@(A!}B7RL>Y2iaJp6Bre4FnBm@VDz{l&G|m@*bz?SISEQ%%~Os3nodnUotddK z$+dffO7|}F_;>mFQ6@|uC0zH|&(d3xwe_I<tRpW3I+=Wrotby;nYN0-Pnp;~X%Dyf zmJ7w}PV>5;md<2qz9Dr&RDYuJ|Frt=bNB!IX!|)l?d5TnNq*{$UNZY<E?X*EoRVtv zf8PJgk-P3U*#7RWnYmCk#$LaGwYf$i)w`fM=jqMNYs&krlpW{aHuLir-20%>SH>;X zz~GFcAitI7Y_GbgVBOhulWLr0kLw&dmC(a>tmVVmWx}dA_&3^ZI^H8clP9R-isf4S z`W9Kg-3qq(zZ^d)EKt)BTQ&8w*o~>>z6bg*2v?Q}KI*7v`&-gla=F6ya>-S_pT(Bv z`FAGjI|ymEMD1lc&p69G|80GOpiuaMdkgO5CkFVx+p;wJ%8u+)CvMJsve)Is>~nTS zm-Fsy-EDq%-krQZl~49MDLOCS;>T;hUM}JA8NI{xJganG`m}#F7SuRWas9l7dieTj z`maLu6<OX}d|bIL!8*$+eb0oQ72j)qI3D(DYGJ!#xxB(vdFdMAox-fIYqDlH?OhQf zb+nZAwcV5FCYxM3XR-85OW7(iYvBftk9*G@?(;OiQ)v5!@zjI}f4lSkZ?35@C<?JJ zh|&?&%UZaKHLU*lPOra*+RBcz@tRJGIP-Y}sK-5LQozFeh#AL3u6$s9cbi*K!>Ow4 zVzP3|)`!#E_e{6C^mc7c_2>Gf_s+&j-`$d5Wgg_8r?j%%^K;Rvb<aA|JDbyLW=(Zc z-2eWCZr{W$!ba~LRo;|p`g3Yc`(!08IVa>nZ>Zo5=?h9WRSW0TGbwI6$K!Xl)7EUG z(V3UE*LohF`Lc75Op-MJo3_LxZQtNMC5PC1kKA2&H7~zGde(c5=WbO7h1-HH+7Cr( ze7U*A|6a3c$c4|F9d<Vb?ELpTNd1!2jwb(J2K_jjmNnUNug>l6YDrS%46xMS=xEI_ zb#c@S(Uw1tetqd)ezK8MWkS7>qid0{$I>FZxSR$%ONGXg>-+vrR_(eb;v=>+;QjVK z9n;+&zhZaoocd~e(Sv;p1vYzhwq5qS;~>TvBYZE^lWCKOz&Qp1h0haZ6jYY1;LTFx z%<!mr!R6KL|C;fy-fD&ik6S0tp4o9X#^Ktl2JN!9?fRuVo8Lus+Z=HY&$HTD-{rc` zMxmqPU6$pOALWZwf7Q55xPJGHyTT{+BXeB#25Fi~-aat%LsM(DT}{Bpi2+lB6<Y58 zQs5ETBW)pd>r9oo{%5!8ou7Jc`fvCdxAy#{*Jl2!-1P75c-8*Lc<0Kb{?2nhznEN> z*Y%Zs<o^7A<&~bmbN>>BL$@UV3}2!yX(m^%p_tx1c>`~Hvzd{P%iAvnZtGv>tYP$) z-u10*SzGGLFaH*=Qf9q)Ki=+A2p2E!5^1w4(=+KQ7bYtHx=_Ju)5Bx3GhtTE1CNxx zvx_3dBfq!bUAgR5rrPevkR3LQ9<+M?{5@exvam?IpIAVAl*qKz$y39m*<ydFxnJ$P zy+?5GgnAWoS0SZ<BYV`(&G!A`J+b6{etwmXvr>8W3C|fNFCFF`-MT<;w^+%{mSem- z{t5qk?KV$?vrsL4&Yyl=yS|dR6p>X&Hl6*lsk>I|vq8ETcVwo->}BZ=?%{mxDo(lf zckV5+yVeu_Y|X^`Gv97L9;K4WDV_evgZt`QpL#iY0jIQj^&QME7i^5rY!l<+kovgY z3bN>Gs^B{CqN|Mf%{igxByVjo?N;4bd3||e{lNuIH!N<(mbA_}@;1|v$z-LxN}Yg< zj=PFF8xJFc;L?{7Gqv|_5k556n752|N{4>gjZNJ@qkJ5=6k3%MHd?E7pA+-`^5UJ) zQJJ*~DgVUl#Y4`%D4X{6x_IES>8Doc)G=*j+xU%@`?gETQ8A&pOBflpU*eZMy?Fh! zs{anN8_Yf)<<XXV%67~r{r2m7`<d@B<VobM%lt04-ET?%;nJf~CH@DuvskiOrhVA4 zY>$9{-`*8WmTZ<{;eC<yn=6{$c#3%#d3@@0P5C^#GDJme`j>hJ!v=}?BN<useKUSe zZ;)^}BX&eb@2SG~)xn2Pdp$pO-~!L7w6c!1Ve|gXl&@eAds8`G+fKpNbDsVoHe>1Y zQ!hQrzTmZBszh1_`<bBor?d9IC`?d%Bob!WbG6@PMemM}jH&1L?t1PgB)!1;+flEi zTThNOaF}N-kS)}X5f{1NP@fx6AN^qB3^l_K^CmsARb6e!6LNgw$`409FGU?>(DZcW zdb@<FgTZB+LyHlI0+YZ^Cc$g}7$q2cat?b;`lZOA=Gp4GXqEz)o)jhD*E*@7npuc_ zzQ)PLGa^gOR2ZBtTrWt`(qLlhH-8o~bIq5)!tRz0D;IEBI5!*0*(leiE?MzQ_3h?r z=T|9NGqx?d-7U%6m3Jfglb-B{5I*Y<M@nzDI<UGPxMIR~V^h(q3v)MIuiadvoa28r z(TekPAEOE<!^u}AZ+@SPb$(ZN(RVW6$vSp{yJi1R-*@}AK4((Z^nV|YUq4j-Ye)I> zn&pYLDgBr2jlN_Cxn*@f<encT{h@xV>%aHx7JIL}SuM%j+UItr_FB)rMJIo8XKa}K zW%BnolFO@4oY?$)OXvTYi{mwvx5atS{_0!0;>L^@YnJZT(~fxb*28YvDIpPtSqph4 z?pA*`gQea^?nX#|dPb+!F4vX)6HSc`Hy!WV`=Vw01Sh$T!is@St2Tf98&MzV>%9E( zg`#>7rCn#_R*U_;!2MU?=kg4dizjtmoDJP`N~C19kEOgiD<{1!W9|&LwjWpA?+Vx? z9TM&ctmU`Okv+fq<Gss4D|gLWY<7z`x<7ZF-IfzM!BH6^d8>taehIf6aAY}Z?b^~^ ze)QDKBQIvXQm~!g5`5F?h+pFlsk~>6H+Y#&>qtph)f;M<$qAXa{m@`P&3l9Mp6iiF z@kd-7v7W4aE*=LSurqt-9=UyWVTk_JDBr#db1(BG@A4BiU;lpbS=q?5%?p~?mUC1X zo!Jt#tg_?K(?wwuTBOQX&gn1TYy6_{!s9zH3lpTmeSYhQFr4LTo37+w?6!`lf5Y5m zb51Uq8_D)%+tu^+Uk+ZEkH7lq`+LbRpw`XQ+P=FBBYrAW8~tB0pKpPBh{bxZpjzIr zpGiBfta2^R*{GlKMQuj-t&+!Ac65FfFKJz4uD#rTCYSHgw9aI!W6QkE#kVZEz3$EI z(r29yuOGR+?9iM@k%W%5)ow>b<3l)~w;pU<7BS6hw$7SH!=ni{2kI+wp4?^2{HD8o z-=(c{U1$6;u?_X%UY`4>Sy!uY_x%>>&qZg~d=F3hzkhj0UA5QZ`4hadxo1sVcG<?` zi|uk-@9G~nHt#<%eP)Q-<d$!HcXB1nJ0ALKdd1g+?WgKGGjDQF<Vp*ecd5H^eO|e* zP>_ZARqls5tmTa+2if*7bG-4Vt$sWAnMraXEse=17wc^BD%G58|EI%CH{2_fF+}Tt zr6T7w{%OpNH=8WE&F1;=&R@6uJKxR)jvNPEb$0wXBcCF1Y064d_KBWXo*V4l@uaXa z^I_vc{<ZG6E9MC0NFM$o^r39)G`D)Mg-d_VVRO3pXTfEmdiBrJN!vdP9<^6tv01sR zev$5PerZ9q=K}TD-I7))&2KubpRsO{(Tm_YhUpPp+j{=#nKUP*c%HbfDYiG|_+x(_ zQE&T48kw77tfzC`Q=1T6b^e>8#m6nNkL81H7F-u=GY*~^9vwTqq}sbt-M@0-ZwH>w ztPziLZZB*4QkR$Dv#iV0`&ICfrU~B9|8)sZsHt~q-rm@zYhqH;^Uv=8xg)}@H=Js> z6iLlj*kpV5L|CxS?&hzGW*<MqNj`*hM2eqJe=*@Z&&j{B-=Fn2)|Tj7lzjhpgXQSN zbtjY#hjcD^JI7qmcBkU+gwNSsNrfM+GJY)#)is^{Fl3vfyL#B1aP{=NTQ1gAgk=>U z@(S|2TVFim)GLJz|7BupTXmjqFE9T-CELHvGSIA7+rDK*>OqUiuC=98W@|kA9I7?@ zRKS;7E57ANPDdSCu4%jDhy0b@Kb020+k59-?7Iu<>nxwLZ)I8Fy;QS3=4XHP&Wn?0 zd*qqxOSU|}SKFY){^itK$ClmK?(FA#R{3Jx(g_X^{K5<F)|>1+eg8qPv|Z=virXsv zk24F@EgEO5C|Zg8w7T8)Vk;07(vyEF75&ACVHrcPNbqkJj_oPzJC*DLPEBChtMcXU zREsBmQ|I_RnqYlyPSv9TmbSIeILs$y-T%^(BiZQUCBz_NvY1U-dmHmZmY~%JF+vq} zO*YTl_m=#dA-(#t{{H%ZCl<XwP&m<Yo!!z{|LZdyra0QiD&94TyDY*`eYV$D|H_h8 z>C4}|@^3MIvu|_ykBW!iW$rr6^q)6td0^O%f4goOy?=REl>6$bO6`r)a?Yom^4+ao ze(REM)*aJSm2#_c*^<j?AJ<qP(_OADtgewHk38CXr)qjqJ?D=ahh*j8gXdQ-Z(>_r zv^HYRG>54lSDezhJwtD4<NlZ7+4T`}$@A_gXr1@Xt*FzP?8@wVx#+Xz)ad6MP6a*O z^GELHu7Dyrx8k~YCtG*EIaeNf=Bns!A6I|#$L|gV|B_l3uXR{)(+6%dQC{B-shY|; z6X!!mWs5~_7XPW|&K9%VW6to&j{ELIjV{Q7mL(dC68@Z85oGn#==qs%OBtQTCf=WY zk$1zn<=a-C?e<z47!yAGopYU^vUkX0&jT5rVcwEA+A??kcKYk_e9CJ>^Ye$+O{ln; zom8Fn>a)s$gM0XFkMcjW$t#}6Fi(8-^FuSgPkuRrUy!3UYF=-B3WLIj)Q^lD_Z%Ly zKM!s_@=5BNo_^+m`xnxt^`15P{l4?y!^fJ_R9>`hSoy(MB$rR<QJcb}-%%_RJvQpt zyv)vLe=K7n<1TehzgjTAMth0cY7s7RQ%xmbF;=k~tFBah2@_c#A5&kt@8-kc#)!C- z(|0D%Q9fkptLk?$s+r0EPd&HE-nBJ>6J7-xn!4p5ocS`%e?y+KaCX<)eF@#yrfe{h zD1PI8MmFPXd=B5kgKkGf?^eB3I$xwXAw<w=Rrnsh&HfTkmPM7v20c2rEN?|d-P_mK z*JpkFo%R2*P`yU^tfz}qL@ghkyLVNq&Vy^#bdJE|Tr<~~oNt#`m=p0xN+^WAJ~CmR zaL5dYH;X-2O*M<Xw?S^<rN@t3H8)>fZjycGd)}4r#lbr=&filpyI0L#!|GY^K0#An zX}b2>qNGON?|gi1Zck^QGqjyOE9YyK=<fLazd8!P#!lYszo&lpTOFmhhW(FpnvP|y zn{r;hY1MO&tB3dYaPYY8`EFFksi@*(QQ%r{BcygPub`!mP4TzgPUpj3oriutTb;<a z@#QZ~`{1<HCLR`suZqilc`yiYsea>U6sTZvnsL&D!HKD1f!)&1%Qww+eD(%Mh4I+f zSjB5id40j<T{rLdnjZ(*uC?cs&U~G)=X^I?1B1gehL7`f?b`VqSQi{xkR)vun_hV% z<s<99dOMSFnMX1A4sN#5{gb)Oew{-?r;S(4;xL`(+A@OanXd|tmj&FDcs7~g@B7_W zbIbfTA1bLbTs`XyZ|iKwcXz)oiB8}4aqX5mjXxj0?0X%seaY7trslJ$Z5G|i&)9p{ z-u<a`pjdwM(Yt@9^7Fm8!PjuDa$!~6XJ&?{=H`FCubr{3{?q;$`hv5BPyat_lojC0 zU=eYw@%hf3A=NS$U-`ROE9Hm2taSP5v@+~l&b0WyoH7^d+@IJ*SuN^V(LXcG{kh1K zq@Ra2AKH99&}a9z*=^6?Uk=U{7XSQCdZ+wL>0`!s6EAHQy{tArq+MlC8uQ|e`FBEJ zZA|CMTAH;oZ06(>b-v2=h4Jk!oJgx?`~U7bcGv#)tmDn41s5(9C-Cs@U7_)kC+WXB zvvd8y7P)V8OpAO%=Kiq_XwOI!%=}oxdn;-23+JOUiv+K2T+8>ueuEtAIe(wDMK9(} zuU?jzEO|t>uj5z5(WrgrE-jUIzoIiuJ7;=-hx?Z0+^^)A<m*EMVmGbXbWQZ4*u{eN zlTWq=P5jOHF>hC;^jE!CJCn4t4dY|4l`XgwJ+)NrqBr}&+AzlkyBMq2Y0`Q6v#!>d z?kt~a&UxzHvDMy_+2g|NnJRo0;zF}mY36_Sdw=)Lw{mm7Fu$Z7(tkcw%{N;pa8r7@ z&Te+mqo%obai9qZPxJbCzO;{Bk0rS7AKfwUyzqVLI=%MUZT*)b`<fQbm7G;uWca7x zLb=-Q09g$)xl7s}w=L)7Pss}HTjn0qpIe<3TlcHw>z&oV*7$u42rX)}{N=L$_mv#) z{+5INvY+DFn%rmK+qH>FYkRlT#;c$99IjjCcJ_1456AP8zuK>4-rr(hUeBzwDD;%M z3g;Qw`OntnzF2+gpG93?$0~(OEJ-eY`OiNe7T<Z7dlffmxwrnMCkwbM+FS0YXw90n z`$@UoRP)Fy($@^6G?p1{IH_&X%)b4+mZtdZRvUMvJR8O8oFu2GH&id5QabFSKjU1O z%X|B}|0`cxU0%H5xP)N+C0?~lZR_gyE}Syu)S{67e_t(IJC=6_@qUW;HIDmeFj<&K zdBwtr88V%%Cr@7#JaGF$Vc_bkrvgor-5dL4cFkU4);($71)I4mXDpVSU9~1^cC)#y z@8Kw+>gkyuPUPq>{pNqvWXJQvJ8N>j&0P~DnR!-?YhuCD1nbbG5ATFBk9Dl5(mnq1 z$;tX<tGBLLStTodWZwD9Q95rw)~`rg9Mu!CS3GCdD*@y5wCzF70xwLQ7WCbzezArB z*x|Bk^B34=U(IU$ylcm|p2A&0C#HMJ9NfLVSL$7kao|VRC5f}yvNyjJna%ua&VF%= zZ9=DK=D!o}+t9$PoPDiawp`srdEuSij45sJljUruY^uLLRn|Vp$@kWOyE`RM)OJmm z`mbC&P4RMlm&Ol=W&5?lxz1X3?4Q5>@jQP2jEEO4*PM4>+`TiqJaBdKch;|UlP@Nu zJ>I#l<GLBg%+KqeNBiDzD|FeiIh!Hbrs7_DnedUHha&BM^1nR&_wB<~XMEpXT{Y>A zWe?{U>3++33XT6<_tl5&d$4lS=4`)!%~8{KDrL;ij=58)=^K3h1=rFgamrI;k34^; za;o9isyGdO{)x|n;(2+_E?AT5em(2y$@xDG>wi3`6`fgKFlX}f88+O>F29}lj|uEB zQ%}0LL-EBf&Fk`Z_4_jG`Bn(5UhA~<jb$X4%#Pr~2djd1mL3dVeC>{LK>eFQuD`pU zNU`jWme{AlG4puwxpw&}b9Aq*RkU(@wk2U>(V9DllybE0ym(*Be*e`Wr=v;M=PnB$ zmFp=kF%A9oe{;F+nNDTTU+b?txEZ<Q>xGWxh3&G9jyq~!AKNQ&{!MIoyK~#2Yg;Bn zc<#8p-TMFERbG!2Cpa9N6fm_Y=}@lsq580}x}Pi7)I5+6ZvCccnqw7xduCARk3W&W zetngA`l<EKK54-VW=#jZ4CN&k>4*ot`TggHfqIwQzqv12?5=f(#(a6cz}`nx_;uO5 zd)ne$yN~Vrw5*Z2eXix}l%7mA6YK8z^1I$gSFm4FSzvOOBcV%dTV&baq#g$g*1xNt z$mXcluhY5sbw>IwoucqNp_>IF=Pfjoz9=eV>C|{){tUsFmwBaqeIG~4J`}7fC~|t) z)$GXpeP-ta!Q2D$QpKef2=ed>|Ic1FtAbVj4bRLCD$x=j*BC~85bY6Y(W!~OUd8YH zWl6WuqjOhF=1<5~3+`(^n--9x#U0FN8Nj<hN`vWJX}zKKU9Y7F;}-=cITT!Pmsi-J z_;Fp~i@UM$%z6ysIxg8WDnl3DT@kjo!}b=JTR*>`I$KdYf9adAD&`uyUWEBS`Qqn# z`^zMgHTJjse;OXV#g_ReV4+vj#-|d#J%Y>J&lan0v0K!u{*UE|!1;3lC$p=5UKhyR zAnL@&@$}YlnP)fa{f~Q0y|jUyF<y!F2Zv!NubC_Z3xm_Na`DXCpBwb<`Fm{b`sH(3 zhIxnbc@^t>ajQdfz4tACdnx~{ZK+U7e&{OI0JcYZ63bI`{~UZ2uyOCoddr>n_rF}c zT5j&yx1NG2mv@SbK3wysI!??_F7$ZB=7M{7_gi0Tt*hK}U%9j9gIN96Uq)~Lb*#%P zX8ra4`0CrYSKm|p>%3*wp8hBI^27hmmdn+t{^hEEewY4}s#PhLH+l+ov7Z%p>f>NP zZ#uP1ONk|Vo8j5>iQdPL&0qWXxZ6qj#jKa^{`|DBUoha3$*M<6<*y2sDNZa|x!G7M zEX_M&fv~)sL6U64ix2G=IU;{Z&JOQtQ@gQgihIt)-`~o6N<Uc^@E^22^T1AVqt1$m zMge~@5#I^jHo~i-*KJ!Z_;ZQUqa(5MeFdBHf_7GZWzc?A=U$LDV{vWpH^yfSpGywk zx%f`dVecKCa_#AhCNia(Sw+u@^9kwpdvQwtJb&1m{^ueGnavnOG8zA}>#kVtuG4y_ zO0l+L;;R^wsHaa0)IMCPY;U(ZH{Es;lSF;h+P8<^E}C7w=y==C2|rpU6;4+6)8U&Z zZCq`&IrzZ?mA&sDMsvF#s_nH<s$J8+q0@c-6!)6Mq^HuqADD%wM`y8J-`DM*`6g|d zr_n1NC#64@KV9G7i;2Jg$Im!+M_QD}R$F;qUyG`YBIV*aVV`FmdGs(V$B(D%=i;K7 z9n;FT)<4?3ez&W9)c%ckcJi;i&Aa!+%8<ffYcZijlf{7scQ5RAl-+rI*KWB5_oJ?t z8)bd9`rPR7V%hVzdZ&fi&-?Fx(bN(6>h6*YkCbP8c++9~Y~PDR8J|pC-aa&V-@sv! zB2_l0TP01(OlF#F)Egx;)8ESyosF(BHVXI~iTPe>ZqYeVe^PIb&Mjqs&?<ZV{Igfi zukq!)xq8y}hCTbYJ4H`4Ua-bwmGzT-x?(p$n-@8zFwDwkQDRV<kSLh&;<&QZrB6PU zf<ZzNZD$wFDQuCKOB3l|USh{GTQu?B<nGPxRUhw}@x1+NXV$^_JgKPf`R2_Z__fr; zWHYzC)8d^Te#hcQ{rTX_6&F4%X?W3Uy4mUW=Ck@|=PwU`aoCZ`;!OUXLi=5MQ~&6^ zJ%8-5d_{(FR#OT0QJ>8hGeRCqy_8{3Jjrr4d>ZSba!uDmSz*7E92ycb)&9+EvEDr; zdFQ<^5*ofqAK%T1kn!F4!eiqd<BLbzJpGH}mfeuJ?Cn&T|6|FFQx}faKQmjkByI8K zoI;n-cNW~YTD1JrC%l|#K7C8WJ?p1V68rDHIP`MHXIF*bQ<mqPBYfYPOtIcJC)#iA zEswJmA?;mmJxeAV`mFQR*=<|(^vR0%erwg@KZLIoUwrIStbE;pE!E51mxp9e5Awda zENNM5d-o6b#$|hWew9oATs&v9?#fy9rzGy#rm)7@d^sY#<8BadmBiIq32jMNw6*%O zV$X)yZ28q0T(Uhiv1@7B-<Rn+ah(h6<09s-m(IM=dRX5xMEbA8y6&_r*2Ejy)_%u5 z#QayDJNe0)?Yl}w<F_wCuZnzM#kf3P%5n4WiAZ_76$?0Sm@nL2r#RQ-_8rE9%8Bz9 zir4oBExl58`a<`CDa_|I3%^;2RW>S~dwy&A`*$5e8}G$xMO0rmY}463{m+V9-(8ko zYGHYO&+J{gSl#w%>x%5n&Q#Aj^6Ag(%^^8^Zl6d`oZkKSE!PcJx&Pf#4}A3(mCWl) zzI}bkU4`}61rmHuEIYZUK0v3m!hcVO`U*eB$(bG^T=nf8eKIXqzFRlwSuEeI``x>9 zxvJ~;M~VMx3Ik?{ZcFnhU%&h&XXA~%x1MsYThh<6<=FF67sBR?N-O{N+&W>|D+$e% zZnr%ZMXdUlFMa-;b-prGzH&y+qX|hHm(+-56;A4&&L6QY>AcRj-&YL(mg>LotUUIj z@mTa7o1{<EPnadB)=y5lFPtS&a44=%Z^rLQ`(7Vr7kxSDpatimqgQTk)heHyxoF+* zT#u=fr}0dZRk``@*9Yba$|(;QIv)QkVf^W;gucL`99C~TWg(|;&Rkn<s}HeRapko0 zwzn1uyN1gdUe;wX*?aBM^%G)lHrZ!%-4-otQabSRpUdva7LvQxIQ1^AZx!snrW18z z8)q@!jdz+S7u#)D=DxV}*k-GuEYFp}{?nPJXmR)`l*nja>e(r>wwv4h$=vA8n%dL< z#u}C~8EFff=1()4o26fQ_ValsW4XoeV)^GTbkC7jUSq#J!NWJ?Ox?z=UpG{=>Wc$d z@7LJbyRG`y;yYE2*CNxV*lblxT7Bxr$&2=Xxc#Lf{M1wh)0F)hlV4V|T$;)HvgA~; z%WG%9$#0gtW;QbPRIgHf_V%^s;)RPY>m0UEo3^)Jl;Mrb&C?fIg%54~*5kBz-Iqm5 zoL&_{%AciGZCv`=xom$Y#f9#Buq8oh)!o|?&kT}yjkiwv9<}Xle`1l?f4`TS*XM9? z)?XJ8jl5%UMs`Z-SvBv=RXrt3GyEoG$BQS=;N!d05!-c;{b!il=ZERrd)Dqe*uMJq zQPbs@&V;&m+dh4M)a$3{vWe^8hOI9*cKBagZtWm$w6VEn{T%<UFt)SXCE_YW4zkaX z+w`ALVp)5N-y5ZEF$T6R&I(61KU~I{|GHA<^{>hG(p5|$X>ON;7``3c5Z`R`Hu+!J z6bJuxZ#5pSdweA7)1?cu*Az%3bZpFi$j-d;?%CR-FXnBQo5WO+9`-)>?Ry=s`GE^7 zSp2-wT1|NuhIG7?k>hx1)V_D+iV07T86GZwvf!KvZwT`WwzetF&+SwvX&=#g6#L?R z>^445rwIy2W*?|`ZW7qON>Zpr!7<}Mi{dQllJZ*Kn~oD?w`^*;bGzUKAJ;~Y39>9n z;*)PSy;0z6oDfkKAhJ?uX0D=WkxbR8Xpf&?Rpq6WZ!HQ)be(A?H);CT4Y6Ac<OHo< zbcEKPues90o>aZz-<nx%eu69vOboiAzMB*tebF&7tUh|PL$o)iUg8&v>y0Ce{f{KY z&WQMV%+BNC*Sjw*oE?_jdKLZa24hx>)7hA>E^Yl;d+)5=&LHpjqu_eGdX2=9H#7d_ z20xGAvEa$qcU5I(pE><`yMDFK4X94AHa)g>R>-Q5B%wVPFA8UUeUizhXT9-WPT^sG z-E8%@>!<83^UgZ?_4*09C!Ol`-w#b$zs7S@@eZ5IrdKzWmzb4Up5kwumKzo9yLG08 zoboqY+exQ5FW)~GuO_?nrSjx^)_p#DrfYT_%&oieTiv$O%`VJvtxAr0<L#X4Q&&B2 zRGQh(UC6cn%%fwrH<xn$WV)_qn*V9*pKq48zgpd|tb18^(IIxD@zV3^?C(qrR(92U z&-gu6t?1NQS0|BQFU)MMbe1bU3gEuW_bYs_cgbbfX8zhpx3~Oj>sH%N_`SX3z?Rm! z$+ww5^`8Hm{AJ_Si7)5s@4P17^h|%}w$JBPf2QC5G{@s=p82|+`5&DfInLFe<lXn= zg75oZ^*bhC_`FqjuEV$BmPX-;Z=Wk3&+})Un$cG;>+<07l^KHX8JttjRXXp?=l;Z0 zJvnu~)w#v<1p-T=&qvN$>a{hp`!b7*&$Qe#%Yt)?WYlh7Thi)1tw1=0U;5_n?p6O; z*Omr!O<%KO&O<TXTbY;jr|*1xCt>l8Hst_Or@2mLuY6ZNd|hAh&VudK&Ledv9c_P~ zsF>H2=vAMhv$lT2xd;g!C6DSgO7&rBl6qXiHIcWScT|?14O;$m{`6fdw}(H<5SZx6 z$)=z*`BDc@&Q0MjJ(K!RIEa0hi<-J!C$Ii!;gR=iOzN95R1cT=o{#-iTQ>Q9?By6; z^HZ@GTpIt)-E8-V;UUM)M_v-iGnDHynC*;u_*WfeRBo6UE3xrI{e=YqhG|b$8^$eQ z(R`8~HqpVRd1aECh+KE`1#^)krWdWuwuR;UC%&~_;q1`XZ`H#gJ1J(}d=m!Q!uIM% zjE7tTORu@7_`eJH{_^8+|L=PY){pBvSDCC*Pb#oaNtZ0I{juOsV@s-Vy@z7l7iG}U z$@gY<eUA@oQo;`JyY~1(z3tyHpWsSP!=0y77w~W2TQ0FZyhVXGlRxr#*^HApf}ghg z{9%5O-}LA1#Rog?uDhb2bT+JG#=Lh{wlW)&(x>OW+i|ckT##{RA?qCvLC^gk&+ry- z9ngHxJ})|;MpNmfaDlR`3U7n7rqW7QKSm4I2O=tt{*&%1JA8br^pd$i*|lEfD_E8p zE-Nh(-{tX&**wTa$mQZCmrJS^tdd1s3B3mjy-aN<luuNfr0`zJSH<z3>nx9^J=`Gc zJX+*#7%uBnIkDSA*b}ORX%15Xm(W7?PkNVJgr3AM>0BZQa*N|VR<J9a_(5VSC+b03 z1YEsA`WP$4H@H2pSlS|I@sd4{!TgVB)1GdVi7b`k4@4S*CvezqNcI7#LpXuef;IE0 z{@e=n1t<P8izIY;{IUjFax$UsfJ~#M*CaiQY&M8No6{_^+e{x_PvKtH_n<_02jiU& z>MxZGl<Qqp4n`V7oixXEd8dj+wx6(P!L>PRlOC**oWsQNPTfl!S%T*o$F~)o7d~5S z>=T*Dl78j@?}IjbPn-Ea)L#jE^iE>2b1Zt}YOi){rD<r}4;^#Ujjd<X=UD5@C_mVB zV%`IfxeJU<&V=_1{@wqf>iGS@`XfurmIh8|WcKFyv5r6dz=f%t+c>ODu5S8V{b<px zHQ}$%dK4VIuJ`esnTXz<uMeBM9E=Uad{3uUshBVDi=JJVc~O7*&RQRi1a<2h8$Vo7 zn8Wmep<-L(^E-7xXB}p|;ha>pG)UVxT{$_<+hf9x*N6E%CNVl~zLGhWxlti>6$48> zU&Dh<7rj?#Ke2Q8U^mZ5VMq7!cl%ouzZ+_M8T<_iV3ASusYtrnWf#=(x8jJ^wyTO# zQp$g_I@T;Y*gW~o3RchnTd3@F_f@7>r-+x7wXyxR-udCZfDHeXde3#GQL6gKH$M>k zaJVoz%|G4jm+R*H|GU;4e;B=k_tV_6y#Jl1_1x_fUnI!BOTOs1=<<=r6O**p+1x&s zV|6rbUL4osJC&-p3*$~bb$iJ)#kxP>L%(dL$v$?G`_uchALp+Qv`hR|$;$W6weASx z<mjI(lcFs0AIqCOunN_Yp8m-)>8;&=({h{tGr3M0ek?Tgof$R5X8P~fALBC(biZF; zztidA*V&8fWfv(;NELbD^ZtDJ=IayN(^dxMUi(w=ZZETqzx;XMobx`m?=_CpE>2iq zG<BDH(BCD3EDWdeAN-#t?&o(ce(F3$f$+a`<?gGlGVu=D{dT*{J?jlFpS{<yt4?2i zc4_q1+PinWwO^a<-5PIVQ$N2kYxa(qqWdRmpByyU=PUC0_S&`eGt4T3WamCTRr;$s zv+PjhySfA(>8Vvq11HaVXJvfw!*}uiJO8)+>e}kHH6%K`_uWxZw|63EKl<#Kmr{1# zFE8AXQ2aN4-=p%M!ISkDtUY3pzi-o<#QT2&YmbR-ns2~6S<32C`egPdo7Mw0SrMz& zPRd@j?^A=J+Ib$+oExt`31-*7-TQ3Kl$l$0^pwo}Yu0(kMNC6CViAvi;Eg3){B}lp z=kpy9n=0j0|JgaTq4vY4RchW-i>Ax3`r{ksu%b<yg>Pjc_e6flg`XPVmPj4&mYHqv zGUH&){tWY7cex)_R~`M$IJxv*T8!D=Ou31F%p{tBd0F>twDX#BP~ffiwEc-jk@Xf+ z<I5M`o4`EnLt^?BeV?CIEm7h3+9oGPyt%32a_Bn?|IWtuJ?{%!?j1^At~qu0UA`AR z3mQ6i+u1O_`X08w{Oay6WraO=6B-_QOgYcETsFGja@E~kHGz*gPMh!g)^x0`b5G~o z?3CD$(_8amTDKKWNbTupS@89+(7wpl|E7n3)eGdScA2}evY50!ijFfkI$#vK{p{Jt zp8G7H`~DQ1l)qeK{_?Fhw~cN08irlZFV_Eb_}tt=55tHkhkEBA#=Xv>CNm?ym8C|l z4ZmHO`uf;m=Oq`;&gzwK=KrpdI@c}oQRgOxt+T?rckB?0d?vH?xp1<{Wu7nfH|}If zR6b6a@##jr*IvgHQNc^@dab;hrK`8@ouF<1VL8KE8+)bw{{uHhHe?EFICU+Py#JBI z_DoKS{YtSQ^<dvrLye<uZG9J;lM=ryu?Sr0DzM6g-#K#KW_hN-!gg&}9?PS%z6%Dw z*;QZpJ@6fGoP2T7Y^zg2tDoH7rMkLNW1pg+nblGLW1V6=^+oJ1Nf$Mb>r@?czHRXG zW5?@8;nU0duP7QeJej<D*_lss7G5|$;Zgq8up4KRCmfi6()G*4yuBy#o-*FPZ+NX- z<+%6Rs!rwNEye1(Y~q5pic2mE9<7<<YfxElurHw|KCvdeQE}RYW>-J<$vTUeO>E4M zJ6@Y1mHcb-<)A5VZSQK=JAYsDCil1Rh5QBgcW^tedtTgB_PBXL>#5tTUbQr>S{AV_ zA*Sabm*bUS9c>pLzj(PjU#oY2ypVZKOZUE>w%wZb@dDqhW?x=op>WsD+3MkoHFfgr zM~*T)H_?jDjA_)9S2{E6Y_D%>)5Y?ub+_iFosecf&zoy@aeJW3cJH}t|4-J(=45mR z?6A3;8$4@n)z*zKPCk2i=jqPFIbGGAe<%6Qp7dlxvqUbJ{TtgwzZ-*H<Ypw6i9E~` z6q|Tw`wo$N);)i<XK~*+zx=zxRqIWc8@l*AtYar!^L+ID@7MOrXD8{H|6O|b<1))N zAH4)tdu`iwEM--M$%2gm0Zx&T%jyqa>dLLplyyDw=53WiAJeVih?&PzgdOgATDhgB z%vd3$lrF?mxQypxSIy^~j&M(*$1kQAU$MO9sj~ghT!E8JFJB**pUr!>rgXLUr$3jv z^1j|n+*O)d>#)5k&vs7U)8~IT+7*4_vprZnd5P0=$$7O;_WkMKy?Wmr$N5oj_ixvG zTD$qj_9^vTj@F%57B5JD@q1qG^{2D0M20<R`l0`3R(frP(_ts|lJ`|_4_@_sFIM{7 zT>j#N=AJfV>GP$oo3=Tg__Dh@X#3&XJrkbalDn4ti<5u<)59Vsor?S=dOjcitE}>W z^Vg4;O;>E%zS>A5*r!n|y8d@4%Vgbccb>eQ@NC20|Bn}Be9xI~u#`!;-YM&<#UhOd zZ~pQK`dqqn&bZ05PSlknKT0dq|J2l0_orexrmu8wn!kHrEAz<XPE|-;+wPpF>^EOG z-}`i!ckv0!(_ROcHT%!|IeBN+@69PXu8$NqPTD_B{M)8I`8>~^R?Q2kUCU=b`}e|y zl2eZ7u<pJq^fQ0ot^BzEqQy^k7tEPl?`~M!qSJG6a;|@TuOi3KwF{Y&9NWzpWPd(- z_vzEB@}0|_)|4-en#y~xH6wkRz&<V>L$fO;m%ry!H?pQDYS&vu>UgV^&AaZJbgMF8 zN}x@r^LxclCo-Q*+;GnPONGR7#}g$A>9s!`{|nCIcT78a?PgPJdgRVl*DE0bEN2`8 zm((vPcwXZ#divPXJxQXbS2ukYJ}PG?+TOM7>Bs(+i~75i4=+0xvAwibTbygYy?6Y6 zxy3R2Cfqj9W4`5P5TW@@*?G!Sr>@%h^3u;-E}qzLJomuys*PRU2j6^YUzwD2_uS>` zr%XTfPlSD5*~q-+>%`4wCXw?!B)o6bXB$UMP-9%0S?|UWyk*1LUl%Q%M57%4Yt^3Z z01cO4-+SgL$IjJhikoblbB|da?3GzK!~DYq=vev1g;M%&K9?LlxS;X(8J7<oxhss` zI5C?vElhk=e>OyT{e$MEi-f18a4XL<W#iu0B-k{eb^Yt8_ghOQ8$5XM^vAQe+7*?G zOniGn0@CWAi<N3w!p6!CAw%VRgP=p@H!6%wV;*1Fy?Y;941-=o$2Eh`t6Xl!tgRAk ztzXU{AM;aW(IaPB_OQ=8PS)Oi)hQERbpN*IE$Co*<*ey*1N_QlLRL&l$gy-2PHwp< zxhPI2*lFik1zYncEOY10UpT4$`j=1Z6)z=dPkM7t^s7`?vUXVQnZ$X2OL{^yd8-9J zs0KCk+XpkS+$doXVBpAPY&!o=X|2BewWGf|SB3@7&zzOaQ2u0Q%JJLTTUX_FcFNRW zyAvGd_AP8_6jNyNyQV^~Ylq}@_(X5d{xyB_@4vI{cD-77=i{S*$*Lu?i|>fnUaXJk zE1fvIe7bV~s^m417VqEPmwoB9-{#i)O#5$lbhEyuehT4>z59&o%l-cF?c2lmdjD$A z2;OBksd|6x*ZeB^r}rLw>Gqpf8h_$z$jPFNQ&*CzFVs9dee9pGO?cg#5EqVZImxr; zAO6<;&(%KqcYmC+LzKc?MT-Z9OkT6xLSvrz)ytkUQJJJyTIP26R1PQi39}2#Zl{{t zUT!~?(W3LG$Jf<aI4AOy^0pJTzpam1{gm0!{y;9RVE%*%v5++m9qQa&YA0OhabDF8 zzkRi%CP=XG(K>#8i-obTe$Uu;``}{#BTHf+U3-Boc{w{7>l<oI_bYRloVmE~<R1kF zC(efY27~f1bu0n;=BMv+-S%R<@^`_zb^PuD%S|QDMWo%0(B6qWewDE3h4N87p#^8M zSrrYfnhicIb6$VJd1dETLuZ*QKD`GLpB<QgI9Pbq#ZBw)6>83nkGg1m&-&&?>m~<_ zYk6jc0h1rFoIRpqu)Uq*T@kmVUa<c3`V{7!`KBT{>@1&|zuTT?Rmfp?+N&bSe4Jn4 z5ATtzUs`JO&-#mAK2$0Ff5XL_N|lL=qQnwo>So$)*mUxXiXclR%O0zjtY74}ESQ%T zAyV|Zw&YNE$n!-PwWjYB)-*g+Sa`r$_POZaqrRsjPYcbi_q4TcdVIm%BmM8vE#gwS zZ?=kU<KEt#cdt`U`kB)s*V#2&oNYfJJ6JqDZWWWd^!I1KemyInb?%huWhbTWSNHE( zoVn|@p>!VWmpjuJtYQ+gjQ+CltF-ro{}*=g_JkFyh29bAXtz^6)hTB7;_iaJJGpmb z`7h+JeQhndwMzEMwTcC^=asK8^Ov!)pZ<OoQ+>T4Z)T<2PEJiuo&L0on-gGz=o})_ z9I03b(V2}tf(Fs&M(=<PqN9wVS8q6ncMRR>=*-u>e#tXuzhYRW>%F!<=yLc2n|^Di z=P^P~51ih`-~IZKU3B%!d))^ut&NO>{8CO-eDv5TI{!~eUBvdyOw-Km<_fp2(G-(i zJ+oSE)hUC?Hj{eii2Y9O>NQk#yPEr_!+hn#d9ljLZg2GV`)Fx}T}<^0ylC>+`lHMF z3k&Mi<<lKmgL>clsM>#i)+2VIdV0<pCU0M%bNLMB{n}-XvyXEweekSt_VGPpzb*>g z&CW9Y*|h(iY2bRJSc7=;^Re=E8#Yy+DP10t{aNJMqO%oZH<?(Y6r8SpD^uE;9352K zmQ?Y5I?Gz7*m^7RixrwqWh`aa+WECKn7--OuZ#Ck_x<<jgRRiBnap=JLcP{*KhwzP zbK&_Mq4fUbiQ*EEYSz{Mde^5R`1<bBrmf|&$tScDPxh~>^$*eVy}$ik?&G?&hvnHv zWxppM-m_d){``JB@1w_d_rBsU+j-;ux`x;XANQ|dy!S=P>-oz=B719nZ}EPr;$^(n zk~8bfZ}y`>?cb+=S<9qQzqew>a&=?A*2u){wvz8v>gI|9yTiFF4^I6uvEkZ}7|C0& zHYX*6nwpnFWR+WUE_R6fuX~UxSYCHeI`bZLyN!=op~uDuPHXP17E5=WX4i?{m@f9a z_SKAkyTrdNu}S{o@K`tRs_swk6zL6<GPk|wH1+wGrtdC(rq=U5s0UkLax!5K%f)NS zpz&?xn~UE~x;jBiT~|`Y+G7(a@)g`q9CB_xx6>RvEThnJlWSVLw@S;Kc9E>=Z!NrE z?%(E<=DU5$M<llLh|hL`3tytV<CVcvvfCv(XK{5gEDtw&`}Adq!G=0L9o?RaEom1I zZS$Q`eBjv$Pr0u<|JHkV>Y2{FI`ML4r`6XIO^20D2UwhrPgFWP!~5c{9R<$!cAC!K z^ekw<_A)<*G)}XQ6Z30v4{;Y{haiTyE0nPfai@YuxUH2k!cR?=xYSuUed2m1VcF~K zDM^$3zIdIveSNZ<v+MH6w)!(V)&I2^Zgg&%KK<Z&CJ82f(doC>Gr8(LXs*#-{By;J z=wsLJJUD#y?W0-2na@@&K05Ey=cJ{7xGtZ#Ubg!BZpj7z_wANlz&+h>15;rA3*WF0 ztZv)yy)daYe6aVh!Gk!iLku|qK@E(3(sSO)1hJg4C{QTS<>HW1o#OUTV*TnK-=B9T z`DWETpH}es7h|m4H-Uq()l3skmpD5H>+JU5wih%=n<88Qo_bW67*TXrd+WXqhX3~5 z|LUduG!<g1Dim70Pkm3TbY{{#UoYMJ_T^n;U*@X}s~Q!bKFDnS*y4Wu(uau6oZ`Q# z%Uc@mSfAMY*!O|r_rB<>JUh!LRBx|;C+oX=_wIddN31>eL`OQk%e7Fs*BYVXv4?qM z_sJZ`N3!h>9qHX~Cs&BOiUp<Z-psn~@Ap`FyA=f!j7;3N{9b<O)!bYg75(hQ-5H7X zHcDk35h_u?{;ZJXKk_Z%Z=@;jTqO<$7KW%*vr-(7yo}69`qs7mr7Mfe{khY8S+rKI z-M3UwCBfMuCxBI0(r(q)qUHCPYFHi~j+LMHAyMFQ(y#Bb^XeZqO%m{{TpqVBwC3XL zy@xNnj`L!yvdtFLt@>G!sJ=k%M*oB&?WdBnXV=f0pMUI`maDj~=elE0Paks#3}D~x z{=3%5OO;P=Zs6yWr(ge0Iaw(zn-tzvBmZ~#Z&zm5oadVR&u{#pxxY56Io<h;zxYM> z?Uu*iE~vjM7xSNg*PGL88}GO`^RIodgq`oqiDfO_Gk)w(NNFl@J<=D`;T&Tpx{l-T zfroR<B*oahW6SnD-!k*=eN~$<%U9ydYHI(!)Sk0r`Lw<3@9n$3bW%v>v6a6k-+1$E zrT8vOrlhF>A0LS%ZQ%RM>&g0M`u+u6zh3f8HIph^K6TIEZ+`-_f^K|1{(X_*`=8;8 zfp4!p?VkQ)6O*>oE5TZm3Hnd%PQ{BpePsBn;_}Yj`yBskf6t#Z-F7omylH8z`hB&T z6NS}HKiBTx@n_cr_Wh?nEfnq);`1pyrG4d9X$0pHr+$k|$L4N$D_maG+;KK&x#;wZ zo0&|FcQ5E<`fHtD`-Ab2VA0X32FDEC|6O3KNs*8b>1K9gP~L5j^l+i$!lW}N!jtzn za0Z<?uRPsy3zJhlb8DJrZQ`lx8?&PBovYA}%4ywsCqU#%_)*E6mj9t4rPlUlytl&Z zr0+gjdgk-7lb@5TULA-!C9}9){8Oyzk(u{aPq}z%QiG9|&Ec08&KF!4y;8b&^P71H z+t;X<9-FRw30{BC`oZf$rtE2~4_7V8{gAh1NtW@ty*V-;u5Al^{EMmnPr&1zM}O2O zURs%WR^8&<<)Y8_C;0#KOkFFhv2SiwXx=)}9t-}>@sE`E8N9NL<XGdM`S;)|J`S!I zVtjuW`7C??(zG}3_J<`(0nZxROco}(w@ZZ2`MEIt_KWSMPCFNB9hm&*C6DK9=g`Wu z_yjw}Zbj?EQYu-ybf%^W2dz_EHLw2E(_fy8UUf=u71^CXb8gt`=UWP$_g~-T)^k89 z>wZbfmxZO>Z01{zJbvu^d{wn-xsZy1(jh0+%hgM-S~5QhZc&_BmpM&wW?lVb@oXd8 zAMft`dUr47m*}11mpd<?JiAcp`Fb`9n}zHv?@g4JJFrg2Novo|HOyrhJv@KoG_Jhj zUsoUe>#wJ*o$mH|3#}$qPk1At{k`WH`#s-JHOYnQ)*rsb$}<|CH=q0O-03}xXTKRU z?o`=oCE8c9D&ortQTrrgpASAR$DY-{$q>~H&kicJoHsN0A+PbDu419`XTLcPo;<Mm z$6A?nAzHbeHv|6ZPWU$=RPBG)5~g4JA&Id;t=F$VuaB;7FHFyJ{&6wx_>I)tw_HCg z7B~2?hTq=d##{I9)T*B;m#>AmE))swuw__2>6nnC-Fo4p=YQ)b8N?qH+ILN8U4y8O zV)(QP^S|FWiev7XC()??T%}EZ*S64}f>o*q8j3RxY?sM%iYq;JQ+nA}*(GO-Psa)0 zHV(d@^=-%M+=aIFnO(`jGb>hq-ub9Ips!=Ux+VXE&$BPR^1uEqEA-tQk8|Hs|JhuU z@7rGVa!K&c6>~Zi6HTHOgO$`IK07Iv)^YYZUUIthu20$NK#6-XTZ8(6&l5hdJk{jW z&-`wC!OZ5<<@W_G^QYgp+g2cX{?Wu)<#mj<`T7RoJyu(1#k|zfdsqJ=d57&Ob+>%! z`(GcjbJVvvHWf=fTw3z>k(Q86`KB(GcYOt6yJdPa=B`@ywD=iw;*~vRrSVGzc|_;y z^!k__c_gj%uWzQ|=H;6!rJGZ~%;n9x_ijV(W&J-V{9i1we5dhw=3gzj-(@1Virvp| z{Gh|l;c6JHDq;Lx_R3A2&{h8|>%|TH49@EN<VTmy&zZ3id9li)9rp}({C0A-T6twv zB71O&zlzmz1qLY*&W0XceHl)rZ;}QxCD;9`zO~OgWRh0ztE!3(MNWA-`s>!r{{E3? z{cP{8<#%_bJl(Z#v-jS9_BFS^T&uhI;ZH5ws@$ZNPxejxeWE$BW_G>Cv+dE*hPj`X zSXrH(dh`9#yBE$CeP>R-vEqt$Z`91%Prr9<ERUbq8E_!u+}8g!{HNZ2_70wDx6+y0 zS7dI+6V7YbKW9CEuVrkpBmY&<=4{*e-6fJOF=^9I+;?l8?zQsDixB-qG3LRwHA?n> zPqppiHf=Z+t8KSp!L4T;H~m+&^3+fM(U!5|#g^1tXAUjCeD|K?orIb11sQZR9lHxQ zuQ-3)`0u~nR-5Ku^L#Kn@cB;xY0C-m6XFG*T%VC7dqn(*_>t+}ALq_mm3YtJG}%2? zv)!quZ$jRUjGP%SK28jJF*ltxi8tx(n}Zr=95EbzB7a#WzX|`G{biPHmV|)=n@*#^ zwE6=Zau|6X9pW!A1szY=6`Z|mzKE3^!)qNWwl<k9MPXY%1sJdCT~)qMa_jkjQhnVC zo%i;+tlM+qY1ZYyd%xGrK5x0bIBM^eCHtP=(RrWncusWD^_iZ>zA3-Wot5)ii1pty z*FSUfrZMxM{%ikx?t|k$<YsX1SvZTSp7-bHjF#mQ^7Vo*_CDj~`72ugw`PUrHMdu* zi@DjC9cf$I)MxRj@JLM&hr|-cIpG_)ELrkn7Wq!u>2;L7?i_Ev{`zjOr%mr!npfnW zjNx7K&Gq@c#E!$kJ0n+~*x2{4uWjDivzp?Q_uFpy^{ONM;LTbKhI8z<A0J(6Xm%iQ z@~Np^mjmqXCZu26UBAOpx~cywf6MnMV`hdg(TuVA*QAQpG`mf1XkEoWe?#b;q|FxW zcE^*O&NnTe*>Plx&&i@=bJi*thIXGb+wmeN`FsGg$*;O3)gHI>Q@b^0%y&8%mJ-f* zzaf9#$J%ofwtV~-H*bsotF1=<x(zcjxRw<=T;3CT`2+I<_T**#BA?ppWwf1bRt9a{ zHv9iY_7>NI<<Cza3}^VT=fis!$$2TlEfSN>epDo$x~_a>*RLO0V%2+=c>I|6z=i99 z^<(ReFP&WvpQt-@;-;o_@)Cvb95>Abbd@44S<Fhlt+1PIGhw^(`Ar%U+iLnFldlUW zJvbUZuY&2KSEY_OYt5l6A@YkCI^L_#Y4PQf`R%!JqSwFe6Ou0S_<#Ca{z>-etzVvz z6;FjzZ!O?f^N{ut+!PeuY&$=hGsBZRY6079@m-e!j&OeB{xrMgj}xz1hkl3t_D9^N zHx#b@*4b!~H20TOP6JOwlZy`Hm4xDB1}hGxu{4LVt<_l*)+Y7Fyjx3VoBF%J?Z2j% z*Mr6)%KTkpr>{C|6}&S4`MwX!<K86|HuHZJDGg|y(NSadbcTPnr)>4|l7>k_XX1W} z?47%A34`T!!JWNnyRs&G-&WllJk?9~U2Hm|NRi;wi!9o^T>q8M^eCSgA!)ae{V}^} zU76!m-RO(gFWqnyPVp6P`RcRhPXE>kwtO!m*4N8E2|w5QV#T&q8J|o1)DH$<jZM5C zK4-E257CP62jk7uS1UzN6P>5@%eKnM=j;CyvxQB3MJ5|`L~rCUcz$H!!kK52zZRw? zr95)KdLgh*QHPT~)xjW0OTusBB5lbx>;k+7Dhm1+ExOM}t-ST<WMs_hzB_(%C2XEp z9(g)tgI&V!dTU$TrCw(PA97t(J#+Trl}@jF_perbHkrQj+~WST>lfFoj40lI-oMLj z^|Cn|BtLI@$dk_Bdz`<oF91BST^+SAYiZnT6XmTnPLkH;wL1<Tt~=IeEj}Z(E=kJ$ zhW;FZJHm&mpNrZmIy_cg@$p|_`PJ#xFM?P9{eEq!%%d+=z4Z_I-t3+lwEL;`nO|Qu z8k#;X30xpu)ltkap+r$-Z}s(T{&jg(+gIG)|Fh#(IrGndzp@N=Ond+P`{&u!s~TtN zgr15GV0N^du-op=1Gft-ht+NVut`=f%C`AAe{KK#b%%GD2s{yQd#U*P_35uwd(Vb4 z6>ieKIoZ11!a2xOCyw=Nc>R}b<GN!THFZVzx@!L6mV7!fzW?Rc%f*bY0S<0e=Sv&Y zUp}9iA0AY2`LLc+tn_!)y#Woe&lhgIJ5m3gp8oo(=_i{czbU<B-xwaU^YSgFeD4d@ z8)t|*tZMiz^yS|5$>#-}kKS9C(m63HKdEEMuU&s%bcAZ2RS#SwSU1Bq=(uWRJwMl? zZzo^ni5)1l@Jlb>KkH^*bw_v9=HTaijPp`^i=AJr<ChO%S=DbD)Fq<%?#ZnblN276 zd7z<J)%QnY-$|CQi*WVb`sR<z#!gLXty$BK+b`>~)9P!gwg~i!e%f`VS3A>&&r3IH z`>v+K^@su4Puda3HKyx7saNRH*m1w%<R|xs)*=3{K6$#dzHMk)5|{uQ5}n+qGt;?I z^>@df{0}<n{B!z$wQ9y+{n++=%C+hD=Nws<`1fMnsq;CZoBjNcvv^qFak%wo-Q$LS zey-v_M(Gm`G^D)yE*_D%nBkqbPW$>Cm323^e0){>E#TQ4lT}-*s@ngx&8e^NJ9jSN z<t%Zr+*dCQnAQE4xUIhTar41@)|%Rjy0d0Z+PHV(hhR{5Zcd)hp0)m`l=m5I{M1`} z!EXD<l&lGN_q}yXy>sJOn`p$-KU~I_eaaegPW}DoD<At+AaM1(9U?bt=jmnZ^X+CR zj6AkAq-x&_uIezu^*xT^+h07s`u1(;`}#?rsy{fo)vA22+x_bPmyG|{S-uv#RQ=4| zIPuHt)OX+90$o*dlV{CeeNX?F_}`qj_Eo(vR<~|b+oknk;~~RE7jG-|7H!(_z-;35 z=u4iVaSM)qoN%{$<C<uu^r`Mw{sxsE3ES%Mdxc%X5}ON#yV-)=lv5t2=Uggtys@dn zcFEa4bL;y=($m*Z(?37&koyY-g^6Y9-_P4t@;yABQXv;FV0B1fNp+6O^oKErm^tr% zeaNZa_0wW@!reM;lU1oJ@8x~YRcvcZ3+UVQRcorA*Vaolx!)sl-<zol7{5DI=ohzO zyVHlzlnX`X5BBbU{aSYB@r~;`+`AUV3d(<EN@Pmx3Yd{o|K~7UCQ~L;W|z~f843>r zC(hE4QrK#w86ti1EWa_=+u-yc_YZR$y%(1}|9x9x#&5GScEdBfB<4M?EYkVsc=Uo& z$LaOf9fzNank)SHe8oi0#70x0D)B56-{;fbpP#=J{Z%lbf&a5~`JH|?PutkuXP&-! z$FG_i1)BZIvH8>3ZdSkePeYYn;4JP(%VMjp8A=D9^ZjS^vGi$mrOb}LJUa=27aMy- zqCaYOd^we~M!0ZMO5`Ti-G&A)|J-<cvbL@0yvsr<HQU2gGn0~i^jGfcl{eh`Y{}J& zN}H2SjM9$G5EWhh;-0?Nth5^Seb*$VzPx{uyyWq5rJu8n&j|f|DJX7zvc9~_``n)P zU#wr`5<eBlB?lBNcwn^fK~ipxZ2PPan%Uys&(B^q|9X>U_NxNl$BlN(wQRq1&d!XO zeaG_56sHT}3)VZtH~trG{vY}zyjl16^9DWUShig}C6fDhoyk<(I#>Pe<f^rEPB?nI zxTxL`)b6{^zM3hFb<L?|F+12&)@sJocP%{{IA48k(Bgyf_x80n7pCo9b7I>2Lxp~F z#X@G)0UeI7mR$<`GClQ>M`M`VMQ0PkmG@IhW;lJjG4;s8V~ZOnRm{G=D`-k(MrG&B zu>ZV|ws~FY(Gd9Gnz$h1<m%sh0ye~VeoxMrWwdq1{>LGYx%lSkTAb{e$r)WVm*HXO z%m#=0j}E`Zlp50KRW9D0Z&>!%$tv^HbQ^h{HK0|lU8<GyioG;!`X;!>C3Jk=`R(Oy z>qTX2%BOQ(yI0zysC{kgJyy+xQ~$!YMp-ue>P?i@3;q3XX25!>U8VWb-;KHRm+sNJ z9<_Cc((%rqePKn#pw+KY9iO4AUss$=oZemk_ifqDP^CZm{tfo~Ip+C_UM`ZkF_+!p zEnDSY7q4%R+j>%Gf9LO7%J;r=_dAw&%>*OfPN#<gmz(*VUj2?$pPN){b-QT)lppU` z{Vma#dv@4tzi9hf$xC-%AFXs!FjFX-kf~Zb;o!=`=5X{u!tE#HT4N5@pT6|V26Xzm znC|owhf|#UM7m355_<p4IrZ!*^R%@$jJyBZmHO1*<*o{vXIQo1?w>nKY2bCRPmk2z zZ%)qmaSXBywr0-;VZ#Ny_ZMY7W39bc;daO+u(Qa(?f1F4nWfsRZG#s-usc(G@9Uv? z*ZV$yIixcG(9zCMj~}EysrL+cZQre*>81S1q^Zl@HAUu^^l@R4>p^VWKc5cW{xLwj zxs~&cm+#)#RpB$*9#&*+H$2C3SY!8&)SwG8Vby7QK}XGhpId(GRzuLMo(s{1>F3nn zZLPc}uxFd^`d*7~kp}<v_y?R@_xJhrSHd?>vCRKBe{X)SpN!|Vf7+!l>dYV1+wwf? zd&^hNyy1hu@!sDI_g?nC<ZS0@U7M?DIBCP#oHzCMp{k8LJsLKuoKX7REPcc`a^}w` zOE(!^v}Qi2_T}6K>&Nj$GWTvS;&CWW(p&ms%I3>$s#`YSYM-OZ6RF|4ykYx2#p4Iu z=Py~v<HN$OnYWw$WW=NOehKgX&oD`MzI?Xcl}okpz<>Wq`O!7|cRZBymw6i{`bhWm z7p1Co_g<ZRxHD?X(G<6$dyT!@y}6%TNoaQbJQH}s{LIZ=uNk*Y3bH!e8Z5%p_4Hp? zf7Hf6?QP;~=S<R{x3evAdZ~2joKC;x-!EU4>3-(g`h0es-Hd1F7iRr^W3lS#hVrbx z-7VRdE6&%??LJa_{Y@y>Q>Ud<&R4(I*`m6j>+0|AdiL8r`J0VWj_tKv<Ywf`RDWRS zllKZ*JNIP^T~=EBufZnj)eFzpg5t-f+nK7y34VGy@trRJDT7s&EZ!k&rfu#Gn9i|% z(f5b4ejhU=+n4o}e%u{+BHcUnpu>sA%WDefYFv-c>HO@cxxQZf^wiatnx<6e^GzsP zv*X6{8OFj=Di0g|x>cOyYkZ10XC)RC#lGLJs>^a_>(Xi79Db9UgVUC*d#CMm?Q(y^ z#V?b@t)Fq-4EFfDTUdYDQUA2mU$aDS*z+tr)w(KZZGio3)wu$z7#yzdnz`wdb#S(+ z)EslwOJ0|ZKMN&F*t*S3sK2qDCwJaui3?2+Q&~51Zp@s2V@d1ozkgh=hqk;GoO5WY z@IlUlnXc0W=kVFqg}T2nj}S@k&+rc}<>9&T!%Ox4U&muL%dT}VwY;s8*>HMW|IXIK z+J@<jAJc9Bg?Js!d3fXV;mf6kwyF7^4>+uZTj#CvE}y65QQBDalIdsh4a+z6jo-X} zzu1uEu<d5Tfr(k&d^7jY+PLD@`5A3?im#VjFPgG=O7oPWIyUX(zPT4?@asjC{;mDF zUoUXi+yI%_r(54g9Tc1*yKJwM&AOkB-*i68UEqG}W*KZhG3#^oo<CpNz9$tw+mSzG ze~xu-)|Zv8zwcjhk4m;X=l{`BkMka<e%+S((_1?3Zm!t<|H;=_<E<rEx<8y`Soc?9 z)<Vl!tIppu4AL$2kj=VjeQQ$8wxZBA3s>Z(`s_K{q*Nbs>c}3h%SlEaRjVB3H0DQM zw7<W9%ahMfgQrY$o;0nYc|*f(j!%nov$>ZxtonNHa(qC2V147u_s<ruT(NJ(KB11* zIj^iYnOxpgAOCW`R<qD#|04#nMhO>hKUQ9D(4W<t^;WpK@MglJLr+{x)sB?RyOIAX z`y6}Q_Jt=Fs5UHSJ|r|_oAN@%59wmT<+%;Zekb^TpPaS(b7-X*53l8-Pa78%`J2Dx z%{{!dXZ`8kq@C|puj*dU5&BiHQ$I2^bWWZ0Zuh^@TkmFVTW4MW{#fRn`%I_4D16y# zdZIV2C;oDhShc`}!e>>_BOY}8oYj}AXK-Ds^-rWApKGJK#h+JyAAHa}8(Vw7xB9GD z-_lk4R|wBuaemdZ)%;ezlNCdG+oX<E2FZS^{bhG{gKX&ana;D`yiA_`{uTG~kQnnS zlc|d3J}34+FS6NV;4#}mt+0N@+Yiz+YOD9m=-8&8cRM^c{(fy})ZKIIX8-8*dT0{v zK3PJ6dtW!Jo5Qx=pl3^6>`rU2Uq8oqeA=#`E53%@-5Rmy*xL0sm1F1rshz9fR;8qF z*S^fM;Pmdxam?j$ji!s(-YO?3C&+6jtbd!|wW9U_%U+wn?yktKGRGxn+<ax+Umy5u zSw~dF45KSNR~J4>bn^S5_q<<TC+KJIcX<WwxdD|k9@(ZpJFv+1_!hN4+`7M>&#--d z|7DW&@0!mS4SuT5&lP#GN?~Trgl>Mhbf?d4&vN6u_VgV{$hdPuSX}M(4AsXjg2e{R z{~MPDUrIJ#n-%x3YnSEvqmR{v5~3zep7zkB{&INxCTkPkyp>n#=HFCFd-3D+WkaRc zDVEV18m-z6KH@ih@~;2Bk|;JSI>9+WJEc*o+mWZnZ}IBJb!@w&jBc!6+_7Z4#krQm zFOCM8ugoi}8$EmH-+TIaRk`io#s{qrSf%$|GjDVIVx^*|Sfg0e${$~_#o<e*+X^O+ z3AZ0cZ>^U*?woa|z-P(&JuSSRyWUIAxEAnqHt+U5@8?)>9eBO=M)c%2ixzcGj(VM{ z5Unr1dP31u&aE>%Cb#&>wnx2N>^@)b#evj>mD}gB<VfE>vDo>!VC~Yq8y6csT9Pc< z%-binsqoFZ%~lJ9E!O|w`;)W7wM|_4?7Wl5?EkYqIC^zkbX2{rWOl2(vd#2;W?#&f z#+k%E&)wT(q3u6S*y1xs{$q8~>3=R;9=JJ0alhgI`G%)oUp5fe=vW(g#hBq6|J64S zb{^?oH2-FP@$9th`n^+U7PNAgg#?@h!EMhkU9pv!RhzruqTR;hd)2R7irrfFxww7L zx|i{P4kX6U(fIPwXtG)T(kI5%c5B&+ehY5qe=+Or2KftT#s5YAGyC`H&GWSQ#N>s% zDmxE4N#A)>Isb%5MM~;p8P_}PRtZgM?gCT8(-v3kG`i3HY1ab($kzdn-?QjWo-!@7 zu;_`~=_ke+MeiK6qSQKdge97q)Y4C#P<zR9!Jkj;S;KtB>Dy*8tV`RPnq2QXi{aTZ zhuZ<-TF37#IWMLoBlod4)v!s-@l8P9U)>@@-cO-#1^1oQka{%nwqIL`hH8DecE#PW zq}o?2X6<{u!QjlR1@C!0ET^e+uW#2aS@iwv`p84aQs-<xzo01RvbxI6b9d6xbj3nz z^S(X2UpX~+d#(79gb6F9RsWXlsq2heR3D`+s93PG_I5y3V&f#svhB+)PCtKfZo<1i z*Dj}@y<qevw46UHZ_mQr!cX58tQ4ES*HA&r@WtsnMc-a-zP5Og!@1YjM7Lb&{{E~y zIrGyYyB{uY(|)e`y3*I=u&(68>hxXTCZ9B_EuHrL^1pZYqP3VdU3$`}`%u|*#Zl|e zE1tM+b*Vqzrnoit>%_@>Eg!#p^eECYdbNwGqovf1`O;f;XV3E4Jb$L^x`q7hc6Y36 zcDQOiy;LA+snHsKz05sgcZ_oId|$z5XLf7o%uDm1-TLl=q44ZTW}#mHC2LFG-&$L- z^G&4gN}kZKI?-#wo*IV~q(pwbQ(AmW=I!6NHxJJcZ@nQZU0+uFOx0=EO>6Z%Ti^b% zd_2!J@`~vCk4}so@eF$${?2LrJ!|pKN@lUC`=7D~FsV#$*zc2k`OB89Z8g(GZJHfJ z+c=G5jQ=d_j(aR6=8<8|d&@PnWocJ!ZiU_S#II*Q7A1YD?d>`BGiY7R2jR}6;de9} z-z{aBc;JCi*~AR(|JB#)bF{;sL~s3Pe>FR`yRgxl=X;SyYtCHO@P!_YG6&UFG!3Tt znq=+TGwa@t?5n%a-VSRwxwSps^Y6OVckY|)zAOE7U#)#@p}T~})lI#tw-*()FrF^2 zJ#eD8#!|!Z!q3icb$P~&H_OX6M4X%YN!4ERzU6GW@9!S4hke;4rY_c2wzyu8P3!*Z z`2BZt9zRJilHIiSvDdldCv^{BnKC!-mSXscdCwj+d`va!kn`)U5!PDxQGJCB>xQi{ zwyqkQ(^XzC+jQ5!F;he*(B6J$vj5x3*;8MshhO>ka>ioQy?<ijV@?T1eKH7rqH1ms zc<iCdrGgDglJB?8JgXr5`3|4E_-zw+*7|JK?Qi3Qbmz?5wNq<nP2dHdJBMtiHW$v` zC3L#cire(`g2!rcTeQWG>)oHPchu^!>b&VwVifN;tXn!^^Z#(Kx9@)Ky1A<_e8$o{ zr%p{@9bWmfr817~$?27+4w^ob?npL_?=#F+=jCSJR3^PcEAy70+`3(d-<fX=Ja%NR ziOrff6YDGW8fUq`^J`g`_cwp?&hAOofdXIOiS+w8ol-4Pwbfi~FEC?1%Q=UWK@<PE zbp2V9qicO#duCCT=BWvtBD$%TJ38{}>Mk&~9Vs{asTH3pUHW0w^VW_{3)41yI=JPX zwq?EK%x|7wrq1yVdw040qq0AX-i690$*%{NKFxl7S4HMzy;$lBz2o7B{^!nk`&Rg> zS9*AAfzXBxYXX-o-21iB(N)34N7YrO>%{$%=cn}ze@Y8ZsIUymZBJufJvGtjUC>tJ zJ++=iE3Eb|=PBm@s!}Vv(#`&|Idd@goJ(2zCS<!j4RCc_dG<|#v(dYc9y(Kh{r!GN zzWzYy8WT^IV9q<8)9=*hFUa|M_=9ZM^3<mxb2Obb8&p}XHZRCkW4p5GZ~iOgwHt5z zUH(I1I)C>+%WD<Mw`NZ05biZ{7vbjSbyPdFFY#P>?uJLfvaimr&pY_yN=3=MNy+Y) z-+ungD7=K1FX`#3h}}i4{A{g;XHRrIx|Y6tQEIa1tp1y&pLfWG>FxAiaHD=p(d*!E z1<&S$buBFlnfaY#1?RhabN4nLS`^yj_qTd8uie?uRZq3;rT6?e)i_nGZL8168}}ys zczNOBiIj``9;c@6xpR!`+WF7reW~oebM~`oz5SLu+a$WB@wro6m+SoJ`MD|Ib~6Ot z+`n|4!iE>O%IuSFJ!v<wev-ZUa^|*mmiy~>@7G%5JLQ`FthcwXg)hC@E7<CM>019& zH$M5=gRTyVsVcI?Q|36m=YQN@xbaJWd~$`Ub9P&3W4`xN&hz)uDy9W5VZFX`Pte)9 zV$<1Gs>PKfw?}+ao;i7`q|2JDuKqKX3tVb1Xx6Xz_WQ`P^H+ktzEqK!z4zUofUFJY z_eSp*Q>tf|UwU}U;f1@m{J%Nz`HZ@r_U9K>7drcxRNZ#-lKZYI=5naKR^eo4mTh1A zl>$30siQUPV)!#(T-&GPa{h|%xxkHaH*<8OPx)OhYro2uv-SDzf&(YHzl6=GNo~of zWUP4o?pd0%V9XNjO$%HfuIuQpT4=P;sC9);%@MUM;Vj{-`e2D$Dk7cVjPJO7WLa4| z#cONOoj(T87S+Bx_qcY3!0WoOk2UXSEc^FwqWy}t6>Uy8UTm?Lwy((aNwCkP(|k$q z-*!zG_+zu_4EtQZ;FkD^O$~dW++O<f_fOG(&lFhStA@vYw3Ax$wZ`<EpSRavA2zcZ zGx>k6)#t>H-+C&zcgmjB`sv)SCG-Ri?npcrzHr~Xy8XHAdfwj`UfP`cYX5qxS9bpQ z+#FWKpO>~UKcCaH?$(|Mb`N<Q{g!k_YaL(r^a$UcYK<pJg~oQS`vgwyGxyYF5@r%+ zy6ng_Ip12{LgdWC;P;+eugr7SJ)#bR@-<ys3?oB+JP|*5a3RA-&X1fQ>pjE%pWOaf zZqDub%*)en75nu0Tt2LEtinTg?e>;Xw%Rir-b)7;GR&T?rc|d`r&xEiHGZSXT$aNc zECwta0=_sHG0aYynqfan?O8{+iTICuZOmtHR_%;v6;V*Tq7?k0#ZT6JT~fcCYm=2> z+iBa`_w8%J&7;$Y=dEycyc64A|5sg{o%vk-8L4Mp&s=h5O=9t9T<ye|KP4|bb9eu` z)#gqS54957<qsSZ@y*cgkvr5_#o?I1Qf93EEbd9*1i{O7)q7(!uAcjIAmgJbquV{z zkE$GQ9BzisqW9Q6{~UOxN<7OiEK#FIf2P2^%MQhN{#Tfn8|XItVc>~XchSBXTd%&! zW)s8fCjr8Jp~BDDRNlDr#$2winz}aR!Per41m7v`3!hCnR{pSI^6}JT%NbY7ELpdx zGt1}RIl-kBhv%F%-upE1i&-p>GJ9vOudmyL9~0i3`TpwG_I)lstLt<2u5-LOk)h-N zA&!MJtn+^U=1KUU(AT^2^{W$NS6TBWo1JV;ukW2B(>wF#HsN@lmg8wmOjn!V+?vm1 z`+2eXuHD~WXkRZ{p8laqi$yzIHTp!D^2?PBbA<Hd=69UUTi`yq^ViRlvdyx;pF}PF zb#m%WVcR=zCMz&Jd$V4wyVdqUKFjNZwU*z{_f+kBTKIm(_vG2@mhM?GW!2IZWwuF6 zYgP)M{(E4{yZXxdY0u;570*0%(rdL?q2=Yc{OPs=jr(mF|NYUaGz-$bU7BE?KPB|W z+oP9G8fH!0DEs=K<JPVBY>ThoU85yFW3gCgNS6HL1>c=sE$ciysrc89um5}>$D2HV z8D}^1e%YsqHaWIRZ{ptFRB1iJ_JprbYKgsPMz8+Wd5djV^QoSjT%RT!Ypf9%x#Mh- zXj$vN(ioqj47E1P*GJCYJHu48=++{^r8C|?FxyjI-TZdNxf^2lm-GI(?t5bLFQ1dl z@}C}j-Il!n$f1UvYrn*r_Z9Lr?6BOIaL@P9jzsh11J4;+u0EE%{oi?7%feNL1qQ$0 z%e(hHj#El1xnX|h=dNWZoGT99sBhCw<7#40U042V#<LWE{&IyC=i6R%XBNJm^fFuQ z&gRbDBInP@3lx4mUCr8l;UJ@k{J$neEr#SfS+{gK=EgB~+4NtjeEDAB!GdIFkNp46 zrL*feX7lfA6RebBNj|f<cFPM7|9$WF9u@et&0Ay%=kEIUD7N*#PyhLT^0`aa^GA>C ztJVhTO#LhJ{jOiAUA$edcj3XM;*X|0$(_m9c4@Bd+MI<8MAk7hPPVO^FmLws>|)gm z5zq8z*M$l5HTTIxG@X9om~?8+<^wUUCJ*yu7f0myZOCq%`uP*Xxm%fEKTei780P%o zO4av(9XI}73B9e@Z94nT+lTYxKM4DOo;vCE$+P<P9=5a3nx=_gXRo+t-jN^oRrq_E z$J>nNAEl4%k84X@`Ow26`0%CGCYwrDmuceJ{<-giCVc<hFJJF*^w`w}SLZih_U1Ma z;hkCdXj5k4x_=4(?bL5vo|h%D%vo;5j#GNJ7v`Nh9adMPRy+At%YLtT)3yh;ZtIsu z3CAt|bohqoIp+Gq|Bi0YXM8U4O@2mspP}6giTjJ$&CH*6eRQ?h?;D`Q`o2$B<Jr2a z)sK@br<5GNS;*6r&J*`u;bGe|$Ih?6`O6;HnJRqCd$WRd-IQhPBP9jz+&tZKa3Ldi z0{@w9pOeD3JD(BT%D8-|*VaGJ&YzjRyEU9|4UfVa)^2uo=SOQYZq?6xxw21Orn>g< zwO^~ZW+~q9*s{$?<<XR~-`jj==}r>pwY<Npa9L&d>ct0UR4!VyzO(nr*LB<0zu%{| zR&VF7P^%@Sw^hI1E{lFyvpY9-;yc~IedgA8(_YVtF}>}zxBB+K<vdPr_Df_}-#qGk zPmU#G<ukwTiRbvcRK&iSPCDp#_+h=YXMv-0#K~(r&&_&0%jaCrstv}B`L}m{zc=TJ zzy8jJo>N{4cx$y<PMzg=WK~!2CH^TZ_^qDuU#**e<IBvbReo((wq144+I)Skc%8$q zq{1!dt-o?N7oFMpz;eRgjnmbAZ(n&4-2H98;nsDLA%8XPc2tWWb=!7l$El{tZ5-tb zYOmL`vx&wq*==;Vaw?<EP3P9*<nwA8k{XihQYxP6?pe^v%6qbL+2?sz7hUzL3VW3_ z+xc7i2^pPB*V&la%-r(NH9wH|5xiG-v}E25+wU(oAB#Ibp)J#J{*khfZ{NNga(A6R zU0hAzS@&5x>xBFiqgg(+av5yv*FWNSKQs4X{43kb;`QzQ`TASGI&F;mBpYA8CP?}$ zul}8~7;7%M;)elOX5QfGVox*rT778V4V%Vk5i8|coc#*S+mGb0D^m~pfA30)ftT2^ zZ8P^yUl$uFbj8SZyWZ7_J+;$k=I?rC&~5yu=JrX8$%3hD9sa4x+pIQvCgo(T=S-Z~ zmi2y{vd;z3Xixpo#WN$i%PaiLN|#TmQCw5@R3h{^_v2?BQZpM@y?j0OaI&Gqu6v=c zIoqS}%&*-(>D<d?)p)zJoaf)~_)-`+V{d4~;cxD*Pw~2*JKubzq;smli&?CG)>89= z_SRU1D{~gDyLr*grEOZG;K!=X!DpXoM>?eUU7IB<_g{M1jCtC3OzKZO-#%TP@$}JS zS2v};5ZW=%e(Gi~<xPjCWqhjbv-D-^UX<OY*0=1{lZ!#_{xwYc*Ud_I+z>G}vU77> z<g7b;d*ikj^OMgms-5)YPDzktP;lMqZBvW4Gnby1;j6S+{%V;c=l5s1i$3|N8L~h5 zweF>=`cHGoXJ0y36(613vHh~$@A_jKo#(A^y_}M=F=OZR4fBO(`tIAZXZstS=2frs zZFYp*z5C|n_nr4Y=PCDntMcUUKAN+Y<z-KInoah$ZwoG`%(qKFb5LRDtvmK^LdmB! zKYre_>*d!P^B3LAIX-4FybCz4{bo_H;(P85afb{i*RPmaGx4ua%^E?2G!y6j59j8U zl-3)yx5!>n4LOwe+plxtnh7b{&B2#7o@`#w_w?PZ)0@LiXnidZ%A0gW{r5V48OIM@ zlPWu&tF7F$QOaE>sDI{teSazLYZawa%4JHTcIwT3$#TEJvhdN<?e9#TcgwH5c3Y5X z+1fW>zpAYa&=;4Q5VTJ6#J_W?N~(T`i{7g}`=L}HRWG2s<zk=Q6xq4EKipSocMDBh z{A=N4&G&jIXKcEDNpAj)%kf8e+!we%T>iRHq*Su|NK?0DW$7Qrpp~^Pr>=VZcYST` zpYl;-Vb7bI=XQoC3>-cLRZZm0TK3&#XXB0EIddm`y}Z<`PR2`Kp)>H*>)*$3HX1Lm zdA+GOvC;XW;nO~cdgE8jFPAv{ovd`2W!CCF(I-4)H{Rb_@PGQzv^A5Y-U|feSjcZy zNj9_)YnIokjNqx;k#U^!VA6+VeYWXG;`CoBiZ#p6kz*5UKI}SeyHOdRu=TW!)pu;p zhEBcdC#GehBJLN$va?PmjOFCCLkGJS*xsp4TKuv2p^;SABa^z~&H42^cpnCATFkmr z>v<QK*`%49752SmcIOOxcIeQ~(z+Yj*NuK=ZCf)(^n!5LE#WSW*$%nw?I-RRTiy$s zWWHdU&9YvB0||FFaKztTxA5|=AH3&6R^DMSWjIy*N`B?%Oa9At7~hn8xh%O@U7OMT zaOF;$M>oTD56`g`Dc@--QOcux^=JLRo6Z;C-)VEXv+JhwYmPlur>~y-#J~|_?~v(V z$`W|Y{%-ti*-MbV|1~pLpZ4>ItF~U<^>)%Mr*~GTu1@?o*+B1}Np$)Br4N?c_nu{2 zxo`hHzB#8qKYQ?I`qYhYUYgA^=URDh%hXp_?K>r^t|{)<dOLOVx6e!5^Fy7Uy$HKj z&&p>R^uuKLnWE{;@p~e&WEWb@erM3Mg1@kCW7FLAyfYHG(l57WCLcVr?C_n$o`wTI zwW1Ec-4!kH=tql1qv&h3riLW5V8w)c2b6xFZgpb4vNFBe=Fyg0`&Ujo*mB0t>RL+f z))S8e%lmUA`Ky^zUwn`0%jdi?%a6A%A*966^KbpWOUy+R&v>{uC49VhPQ)<x$-fhZ z2K~&s4{mvf<{19I661AhT~E%cYcd_D7_MK7-|<-O@}4bqDKm9+B$h?0EGUwGc~1VZ zXi&b4`YhYkJL7*W`ai2~V)U;40Zj^8pUq#CE#ds3@#TSR^=0)ycfX>N%T0xc=d8b_ zu=1v4@|xEtXV$ajY+e3d+N;$<U`4>0W7i@%oi+71E7(NNH^^yKR<M295X)i1taVuO z!UcaukEA2w*V*~om^k_Q6TJl3Oboey=XeQ-O>QnuD(AOxw)x%Dn0_W^zWwi>E-vRl z^Bw%|wOh=7Y&m@{LM49v$C{~kZ5y<{KK*Q9_$p`3&vuTN96Rfc-~U?dv9o67BA2L- zl17$~JSOP`UCsHJ9Qxhn?}mK_;xe<tyzf7}^ZSvc=KG3^Z_SsgehS>oY`#7BQj-6^ zu-DsVi>_zYsn4x1+jS~@(jUKdOOw)e|9X2pZLVi_c&7QP($+swZzsIdwJ*9FxU2A2 zYT=ee{}T-^<^5l{<@NS>(L?pEioW~qYFzDG5Vr2ymyg@lbT(HnxwUWK?^RoN#W+-^ zO03+r&LcYW{?==S=Zc+_RqRy$XSFji>z_CgUbOVpn@8^FoR3I;+FgHGSO(Pcl(XCX z(Z*%RN6jgp1!l1Hzi+dQw>J^w?caUk_`TLsM+_?TQtQnNbfq3&{T#DSVOvB%{rSg9 z?;B;ZC%fESXb_jqS2SCyHtXU)^Jm+y>a6-FB42Xv+%{d0qg<0*s}dBM0^_5XpIrUX zo~h)$+()gYg_CP`Y0K>TC$oCm=j%arHPtcv8;{xfSso8+FJ80pxYTcEHU8{3{Nisd z6eE)B-xN<%*?7IXs^jSw_T}yE(SH4!D`wQU)?N=OR*ue#Np*f&`Nnm^M#lx)BMeq> z9BKD&F<NIRu5wsr^2)_VkzWpN6JHRdJO6Aew^Si_z?Y`Sx<MvQ!i;l%aG#4m(=BYY z*?0H47oL2amhG#OGuNMtnI&Nxy#K^e$+)+MYqaKyo?hB<sVA^4cw>Qjl|WrL*WHK! zmk{R5^+|lUS39%adR&qGU&=sc%cIT`=e^I}J+H+X^M3l|!h1>FvTB(}|DQ>=mrUC` z6@u4hew?UY{7(9f?A}H<#re8Z9jlr3jE---{8(3vN2|qvcggIsU2$g@7HS+2-tnO- zG|!l6)g0~c>D3diy}p^V?&0#Q-TC5CZ)1h-zgc{B$5he!-RJD0N|va{pJeslTa`S; zZPnozzUJ8IYM<9%Rz;j_mZ}x(UM+Zb?dQwK<_q8U&H5aAIcn*P{F?h~ms$9I7HFtm zwN9FevH$&n&aeJj4T`TW$=RPcy6m)QI{&$~=cRWi2h6)_=~PhBy6(inT}qjUY~9te zoVP!$Rhr=FAeeW!uAqL&mm@pnZLZ6=it94JW8H7G>_ZCocL}cpQrkK{Z*6?W`F`JI z*`!w&AMf;8>2AOzAj9=CE&uWkz6{B$JE}#GPRg6o<9^Tbhr+4_Y5R=NypOx-%X&`h z-p>5yekohukH;!MCq=9heU(1Z>_?{qk9qrxfQVy9{Y!eL_^f^;tJ{3;dc9rc-n8!P zQ}4yBo4|VYcImqPUyM={IzE`Qd7jtw^EIzHdH>487pLc0x4I@MRlL03z0}fh?u^df z#yR=X2HAm(2MYsCYMD;&JiT^XGIKQN{`zOtcYLc3MC_XIW9Jo(89uk?tPMW$;{3XH zmpLzjPT$_Gc4^Py?DH3W4zK<Z;r-xhWc|7_v6s)hBCLgv)%_G{EKL@RVY|s~P}uvd z*J+h`?$WBS{)=kz%XZ0Ll)RjsA06y+`tto-XY;}{Cu%=CQj*_)qPbCL?`)}spVn=S zGrsaS$^XXg#YKq%#-h;&0;bqnC@a2pj_f{Me*1u`mQ#}Uwq?A+s}F8jc67}HyNxBs z+1lmnU%oYC4f*Nz%H!UH+=&qtyZ8S6+CJx-OX`Ww;&EH{eRdI3jBzX5x7mp?rAD(t zbMFbZx9#?Uc?vbZt{y#o8MStg(wus@;nUx1-OVSm+u~wOg52MP>)rXEI`NKyk@}?2 z2Tayo5@8d{8FKn}=f-eE*dI^6Us`YZX7_y8@23mOK5UmwNa$bS&N^c@|GKKq-D)Z- zzBdcvc;>ACws4A^$zr*<C!5?)^e_L%z{7aFkjeE_u#>fKccEm&YLQRr`;J>5Oqe8{ zbfnP})RwmD4!Y%hj?<8To$*HFS%wCaSKb%?cH|jrPN)5j`xAcne%Z85*gJHlc1U%- z5>s>eL9b7pDf?coGB#NI@cC`OV>5d)j9ibj@Xh|d%fE;Bt*N4vJKxoNx$Pgyew)uS ztP|}|JFR-}q3zAUmo}E40<99Ns|z(^zf{*KYTr$K|MBR;?7ZnU)-Q8=AIb?HdE0Wc z>;mJZDi-V6JGi$kzG1}nEu=QLv;Z_}!|=1PzQF8&)3aw$Zzi^MN1s?NbLLK|zRr#4 zV_R;{S-`*>c(jl6eijE`h^xRhnPqv(_VR+FlFZr`K?k2S{t>_UrpNHw*C#nlU&456 z4~sNiZmLd;h}v@^TvBvm-y0syH&IsEyK?mS=QZfoT1Y%P^1kw|;*FSnA%RM^k3@`2 zA8lE$<5Yh&=cDlH?=oi7)AF3tFTbjEwD^AS@79}&y}QHq-rkez%m4OXU2s%Vo%ZgM z%Q<&z)p1rlx3A{!H+$W4Fm~zP71u;RWp6#q-*!!;&Lu=E?6{?kPM^d3_Jco;@Mm1l z->=oe?L4byci<}7gY{NBH~D@HyLCip+4;Vt>f;-Zp8UP-(!Ok6sY8?BKE4&RGUoH$ zs<ThImLAISIAi@M#OA2@+P!x#PmHvY{~gDB_=LUL*)An{k<ULPUM{XV`TfGf3tw%g z-)@@c`fTo1uHF@|@|6^W{yFb=Oy!Sw$1r7K#Jh&4d;$x<F?<WT7<+H^?mhMOj0b$b z9-iEFw@G7-U)}bMgp^W+lE0Q=y3h50>e{h|OT;7=v>v=FceC?gsKCM(Zq?kXozk-F z87gF>Kls>lF_=B;y(@m1&9mDo`Sghy$>}C#%O)>K(zBeF;_<0ObC1T(kaKB@TRT6v z9FWakoV{&x;*{AscfAre>#p#eRFYg$-``%jIyg#MMMK9sDP!iuQ@f+9`Y%1vzq~;5 zTTkq4JD<t>%u>$({$iP&U4QYaSFQ!q&iNjkzEA8b-&uKkUJrV=i+|-4t*1;E+NK|W zXCUt|Irv=CzdVa(T|TuSHc7?mKWz&i{abS{&cA5sq)RL0?(h2P{Mh=M?@4j{3zzb) z6spx*&AsOzUaT|gd{z0Ay-yFC)boYDPCp)~+rBsWb-W5!<iEXtuKaR+v@iRcR%_A1 zpi|;|O2uwHdjF{I)4#Q!OUiE>KW=AmpOzN&UHNXwBu%BdW6S#9`+wY<So+0f#^F_b zCz)kuh^hW*=9?@zY00##;6?j_qDveu^V|;Xm5corwY)xiF~`TxVaKBP`u=ei>`(4o z;;H{@UHIQsbJp+W{bhIV>n-=h=nnHUjH!aVr+v&i6(|02^Ugbw3)OCLH0@}xnL0an z&be7}XDsrRU%yM5BUXGhrq-MF!#+g^#*{k~KE&!sgmheyH$NxYoz?a%W0jq)mBbSH z*-Kb>9!96K2YLp0*6*;`^Xgf$TS=(%--`8hGAp%mW=@}Y`0|W1ua9raYFPNTDEchh zxwVUfk_;aDc^KtfT=>(+c-Jq7uL^;E+*L}vc}c9ZCd@c|y8c_Yeus94w*0}V*L!}g z((PO6kl+Z0H#;Bi%0gOxvU$a?;F<z9OW_uo7MYg%Ifvss0`~R1{W4QIdE@qvHLP4l zTt*3w^A;#1zpC6FD<NTiX67C9_?{jCMz!nN)^}tpyu`kT2JD#LI{Pz2t8{C$*F(Af zfGvSrmWt$Vd^J;H;kT%uIn%s<dPE1c_)HOanL6vhow@`&-i_=V)3+^{bnQ{htT*O7 z>^rt3|LDK8Z)*LP@20m;zW6dxD&WjieqNtQ?$@>)1vMw92-FJHnl0j&X)N1v&!5fY z*y0!bvs{0={hW4xm)(r@lIcc|DrZl1TvM<jqL8<tIQ6YhOp9EL9B0d&c%3T`J+8Cm z$y&c~R+X5&m`i>u*XLKhR}!uy^yKrq%=<md_R>|)wtZGt9!P51)PL`A+Sff(OS{#H zbwWgiu39B~=!R<=1;>j+J8N0*Y(G5nd47)iSNH3WPn55Hz)^eW@3Z8b*{^g%G7dje zHh-RY-{ARc^`P9k-swjTzj?cfaf{gpXFF9b`{={F@%j51N8ZkVVRQCtfXvKo%2ql; zf+dk#@>lBbx%ueEvwBx<lW$`6>#LPdo%x-bwo7E4?uvP--B+_*wka?<a=j3j3eJ&h zO*<nsJ+t1>HsRB;*%OQA3aoYCI`4MP6ss$nrdv;V_d>hU#(geB=i;wft4nXEE;^tv z@mr^vLYw8}srw{Syh83S%BpudBWRi-KUe+a+~wcC-VI-R_3fJu_NOr)*XSIYbKyh1 z!nX&SX3Z~k#Uy^-xR#(76seVd`sRu>S@(sk-o6gkgV}rAr)w9lZ0wegEU0Rdl`S>7 zq<-i9^M4Z@<2y0~tbIdfOYUks<|AD>qvN{Ix8q8yzFNp_x^d{Ab)ZRMtGtGq&YB+{ zS)30A9}4yzirsgrwe}y+tkTyu>}OU=f1bEQx8A+-S@Yo=uk~$SKkSc_yd=}1ooSw* zbiTGJw(9N0iOw#CmG-*(3JkU#+3sVk!J{?(lDg+T(TcWNM`Q{({Far?jcIl0bl~*( ztHv=Up|R*w-hvYQjoJa9zFpv$!ZF4Awc;C|uiJQM8g95(pK!L)m1TX-B$3$}de@d( z<P@ru#QD^3y#K6!-W%h##(?&K?VEYL7)oz{>6q3WIpMAo|LZ#f6&E*hAKE6Te8Q;I zyd*4MR(`?h39oJ#wy$#j+PPaid)NI%yd5b!r*41YU}jwL@Upj1ub7nX%-(BevBxfE z$aY*Tx-9tKJZkcHY2A~bVluY;=?x1!nXVn4v1OZ4)V-vGg7v@rQ`SBGZTYbI*zZ+W z)$^X`T%K{?Zj!G)%LG;4%gWbmzf7IQeB#mn=o(GuSFa8EWq!wUCw!ifdi0QU`ui?Z zWzXv+JD+?ilZ#S%`?2cXqNz7bHCqET4MR>nzuzs%S;RQYe)6(wyhf}4yxEj;X19xZ z@~bqTx0`Zg?DWi&A3aa=sn>t^E-gXoBgf^A{Nng?oq78<+^$$QZSmI-*>#bhmzSO} z@iI1(Q8^*Xy)%eW;FGGP=d6p>k4m38haR3=;L<$Tl%?pxLDk&7S*H&!)(lf#&Nnx> zA@WN~)UEh8e5uwm)T9?*xajDvK8bbuy^AyXe67>_-9p+H91s4znBfikt33hrSvz{m zb$+dw$@Xxq$B&aS2ak#`oBE8~DM5#~P2eq`?Ar%TvnH%fK49{r@b1M8T+G%fSK?kA zJaF#Txzz^`@Wsj&+<0?N%$6;N?ak94!cXMBnIAjM{_VG(d}urSQqS0}wWsfI_Fnrj z++yzfDMe4M6ePmGikBvJFN@gaR~mQmec7q{Slh>pb8g3b==s_d-IrOVucEK$ubMnp zd(joCz{Tso9@~|5_Vi2fpb4S6%YXWoEWI%G*0rfs(*N(Y&zYW(HZv-!e?xgs<@d6y zihn$A2hOo6*?noZO-dg}Gt)_ixo4W(C&^??dwXWj21ZG{zM54U^2g5IX`i!vqpzQb z+2rFI!VBvQpKBCPJms|SM#hwf0hadlza;_$%f3#TG0E<2?-7aP6ZGBNLQHcm8MiCX zwR+bhl(#Q*v3vUNrGFlM>U(+R>(_+KexF~yzPH_W<*wh_@A8*%mR9K$eT_5q`S`kH zR>v&&u348E-*L=j;H)Z8TYWAu?bgL4TW{~JP77n0RaSBuPpnttocn*}2YcIp>1Y1` z*=Y1$jxRKG=ME8p2L;S$<{7@$sM<Sg{U1qLyBBebZ_LZw$gO<&Mfb+!MYGl(e?G;~ z{lLPowvfFirgK&v@(`H4x3xCmR{FGB#aRU=4<F9>kh8QXl*wdnu9ZRTp|Fj&XMJ?l zl0Ld7DBHz(srTGx7k3FyU0uI8%ye;jU|-oX*I!qv&lH}0HaTippiph>&2U!dq=I{= zy<aQVDA&lF*U0C~A9U4PxNy7u)M!Vm2#fd?q8lxH)_c7FCUI|th+lE(kq>JP?nLWI zguLl_*t<Dq;T-0chqY(rUcOR!Y_{^I!yFNvmOXzT6m`DWEm$^@-OBLh<(CcV_4(<J zMx4B_in*tEuV3uj#n$8Qc$NP&XWRxIZiNr6oXafBJXUMXJoh%Lw^2^8%Ede6+LWZN zY?<*F7oEFdWK?jLyZIJxK}+2o#}hYRX=EFj{J!Pzy7Mu2x32Ma#)te5bJqn-VMuy- z;(+?4uwCVE!}i2{TccHEX{MLI^!4o41#{~4pPpj1SB$7}<!CI|^xz1%`Z)aS|GnAU zrfPp$8})zwtF4zR%@5mNjy-X0_0@tU3=0+fG%tkS&J14cuY2qNGP_H&T(8c5)Er~S zb2&mM#hGV<II~pw+N$l9w_i<g`~6LO<^9sBzh|dyuU>p-`}^hk?>GchRl`r13n(-- z<>l8NI8onQ!~XW?hA;Po-~Np`#s2G*1)IeLLI0m|e}BDAlTK%MmN`-LOv`qY$>m+o zqXV_Ajf2-!rRsUbo!otgx#xgV&*_K|V-xq_(xQiX-b+uu&Ux_Q_SVkxrujU}SJbM! z)7XF0wS2*sPod>W&)>ZI6`J>?_^QqiLHpw1H)$o^Ki#~q*FTxG<Mj5G0zHRfW)&pN zuD8pb|H@9-TII9&9Wjk}k9P(?dE;al?A2YIe6P^CO!Kt9@A*p~IMv*ge4lX_-+e!G z_19UoA7dUK*b~$J#qx6hOH-52FSa&)k6J(F*4?kAn@fB5^&HuErmuDPg*V;}pP9m} znNJz-lWA6d^|(MuUNLBAy_AZAykgKx;Twv|jK)QZ67GIX&z?9jv08FYJoVMZ$-C<8 zr|3zXkE65tYCfL4zOlQA^L5Z6zJ;txQ@cIGo+!F#Jr{m_!g0d7TaVJ%j0BaY=1T{h zu<r<2mm{Sltr)a()5Y$b7LTWop4og7P?~z0RrG}GftWdB2Ni@Ht<3FOz3WeS&*=R7 zG|Bkpj~|^pKHcIsz8!JdY*#B`|0!qztCjzTWqJjfKW|l-bGnJ$nUppCahuhhM=3M% z&HG~3mXw9EsWWn)mRiU1V;w(_7L#I<mZqeh=9BzgpPx>j@k&Qo;bYN~TYP8pESwm6 z3#YG|d(rf^Ctv9D?^9l`+%<2>dgZGx>eGLvJvbBSmuVV*!qlrl<7r=^v(dXwrEgc> z?|=U92lKk5rJhPNy%KcyJ*i{n&pZTKsbjL_-xUqkLhnY`|1#NPbA?$8AB8>Jk(g+y zSYY=?`dQ6YHp8t)|NJ<+ep^~uxfarroV*0klAJEBPC?dIL)G_-chrBqxw7_V#H44n zGmhLlC89ljj!HmI)XuM()fUBm+DC&@ay^t6s41wH6*_J*4~W>(b#Y~V{<edl3B{VH z>CNKtmK&5?5_N-ZwwbHcS(R8AMf$w2*eR~xys_!)=Rb3kZ#oJ;U*G7pyY{x)S+T?i zJ15j889w_NJ$vzAJ%^BQ`CIF|O%--+yIVTLY@yOwzMr?=l+0S2eeV6c^<0_4OTYG~ z{oeL9G_y3><>7=aUy~	CnW{5DbW@bU!Ymy8OcL!#@&ZbpAfRE)jS3!mPy52e*SV z4;62b{Ld%mt+hU+c)4q;n(jLJH?ch_cav_Grua=u6WF*)^U;hajY3}?m;YIK>wUfO zY`b9Zt0yPi+V;!i?ae8#ySvL@Uw3-)U~$QeGK-Sw-|VeF$xQC~_`zmZNO4D}TYj;} z$;a;wH+lS6$FE{Jv$yf*f(((*JBw_WJXHF<Nx(MP+|vDMRqE!gIhxk7w`Ies4ShJL zNajCmm@NKct-;Sz92Y+^eYke_?AbQvWfRw(XsQ=$-K}Kzs`XUMDUn4+9}~~6@CCud zjL88ix6T&`9~EBmEl}&K7w6~0GrGT7O5WBfssJy`xei*Ev+uP-T*%?%@Wb9#x{XWM z$MEK=6`o9G-}t@ks5eKQT;#K6zjn<-`Z|#Z;y%5-^yTj#uKMB$P2VSJudk5jy;QYN zD!qQW>e4zjW@)?G{Qno(x(DoYpVK|{*_1s;r{Y_eqqUQvxFKPxxA)%MgPWdDk`#~K zT4`JBWG=sT-YWG9^@{f<^?o^fcc<IwiIqPLe!{)*P4(m{N=k}Ko?RZnjiq}#qEzRv zb-VggpR4|D-RoOD9IYI!9IP%+Yz=04w7G#6u)M#N%d(hRppw7mne@5EVhh9)E^J7> z5TH5L`)5a&iE`kN)=rj;Rf0<dmN?9M#ru%iBF4!E1Seh1?3%D@!VY6|HHknDFwF4R zc*1MtBm#m>qO(6r#+`QYc`BS0qjn&atKOh$neFi{&vt#4c&xZ}%RM10$uEY7_vQPz z%6rw7NeglddIueObg8AI6#{3Mv@<bYmYl+o1cF9+k3I@6eNnEM0)n2e%b!lI*~hrD z?WU|%k3bt39%D6*);G<Xz{Y#_>|Hk*XE1!+#QDzR=A8#Wlj{#{oS52oV{zVZKE^kT z|1j_;_>|2tGkyYHeFvVj?zq4vaZB#Z^&Vr%M!%^umHXUeZdOUF<uoSyA4-`q=YeT< zC)fYOidKft>i;nq*PQN8<usha@cM&NQ+C5Q*0mf7GlJTcW2JYvZ&N%h<o1gr1q2HW zd*;Wu%G84#^jo6u;KQK!&F;IbPF@IipH?eov$D0JBqY{k&c@Ufw^du^WeaMzUS6HE zlqtXBE>rv>nZE|h4fk=g&#}=nzLntoPeg0w>VQR3lee$r)U=bEl3#q%^RL$8?K5x6 zS$Z6?@VXIw?ZxxMGK?N){MGJ3)&?EfkSFtbB11<#cyW-l-e=^+L7p7tDqEi%+U(}n zckE1#b-4}Op=4vm##fGIbC0#p`*~6NZmjyG>DfCk8&?QFX_~rql5WcCi9QpU{W!(@ z{g0%XUs!z7<?o*-eFyt$i`EAHeRAqeXXn*#o&pTT-@?0(9+G=t-c-8d+MM6%ZnpL7 zxptMG`MuHidQe=5*VUkq;#WyaYck(G0WA*tX>tm>Ht1A>7ml?-?{cnbzxkFlGg^M@ zi5q>T{}<efdOvUH>pZWi+-Cy2U9?0mw_W(>`FE4!1=Z(Y3Sa-7eQbZmxyyTNjOs0K zt67QFZ<7-&)AwI7)hUU&h~1s{(tMRI$EIhUzc??nUFf;z=FWAJQ&#BQN!!S^+bR9_ zZk3Y@XG*9gCcJekTofo5n0sm0?wy{3&;Q@pE%xk4q3+*slP_;{ZzvvlHusELD2osO z)|X4Bs~8urPB&BSQP`K8b4;xA&Dx*uS1aFcncgUH+tIB)_UheZ5*IA*SH67l;>5SU zxAQ6wES=#O^RM<8!@hT{wh!E!s#+orO5T4n{f0?Gnr!X$*5s|rwq@P=vTTB7o5kh; zyZR#w4tXmJw0SD{&f8;PQYOm3RwL=4Z_gveNh&=X4(hbsoqu0p8}F|`hO^PZb5r{& zK3Q*^vz4Rr=n6Kj1yc3RYaWWN>C8-v{19QlJ3Xy<XKohDtE{zwxoewh{>`=3W*2Z< zzW7RNoK5%z!>`;g{;2-BaP$Q0iEpzl*52OxZqYf>Qy-*uUO%+M=G2@#$Haou#gR+X zwq9BH-u|XyaqI1PEAth#<yZH-jfrnPC)09h`^_D@cI|T&m)f=aVpKa@hE~18n=Kcw zn*O?zTl076Wf$GI*ZqQ>drz;smho3Ow*Kn6En>4i+IO5R_`L4+)pdFL|6iUh5xcqJ zze#%8+~BR<S<Zr2Htt*P5jDdgt2Xh@E~$+xmCre=hMY)_o_?-@A%k~oT;1HpYNaRl zds_1Y{frKEr7lpLe%96^ymHcFcY${^S?cu)_xHzq@{q|{Bv=@0qoP+m-_Eh_@tZei zz0{v;{a%@Jx_D|Vcj7Itt#^ZzSZzW*wdUI=1w34;cI<|x#I#14MYqq0oRN3ZR(;%{ z>U?}!YVbTS`S0vE8xx&w8ulxGKI8jB;$Gof!Qbge=IFeVZe}d(SbDxf@J9llBir3& z{5fapb&O1J{ARtfP4?OJn68_Tf9~x6<nmWonB(`!)cLX-*k|^n72EUiXupr|o9W%G z|22N*XWqK)({JrsG-u1=skcllHca)o_5R{-NeeZBijV@1%^6n`5_|V6XSUC^T9k8Y z=4OUNDUX$8HuT&4Vl-6VlBn;yd*L-dmsd*|Pnu6Z|NLt`r*WyL-@V04RZ{ATwyg~E zusCA0f$70-%f{KKbGH@<E<C9twz@RaNSI}YxZeaOmMGTM&)28<@b;EW&ph@oKWUfC ztM3nAZddwhb+zhmTE*X8cY}6DS_<+NKkVv$bf6}AyP$kbp~kMtLhd%x4V!o7OMXAv zsu}R?ysK2JqI%7v$@M?adKaY@{lB**R>_Ye*+cGK;NQYIEU`EDypy;*<zRW-kE|rC z4RbH{UpL>gzSgWg=X8yuUR_~eT9V{>$$2wm6aW5Vb5#3wX@lDNKUrGW{&4<3y8BVz zrc0N+@;^9gcA7qKJ@LFrB81_F^YW*vzx}ss$_lrydwJ<d-@&k@k!z=i)r&2C^L2?A zTeLt<B%6suO#VA*uZ_!&M5#^pXc4-y-7505o(0SIo$Lb3kH0pm+QXs|dt>hMJl6zU zyRDO>c87Ly&aaquai#2)un)4C2Twh@aPTqv3tuj+W6LZ~K9FGVoMNGuGokoIyzpVg z+9|9ind=(#w%nJBeS78h?B%x?3m$2&zp+KP>5bvWn3jbO3^$p-{9N~V{m;YZk!2s4 zW+zm}{dm0O{Juh`i_C=__F=t3b2rU@%*uQq>PCXGuFrvI!Yr$AXp8XdJO6v0tZn(` zsO(jjiqBWPtNb_RwAW&#OHp$ZZKc*-H0F#?+{)f8s=bDD(u^BNL~EUPW&Vy%(f#x! z`*>e{*28@64kz89NrrJJ<qNMg>GK;}&xxJc`FN$a-QDviOdrKAah7p3*t2RsQ>9tV ztGpA&)3rj`<~t<4%Qun``gP^}vrihucVuUqm2&H-Mcyb<63Oy>Z>f9Dd#cOTAc@i* zodeUV{hT#<@=n?=|K0gM@x5iLMqJstcXj@((^hBxsb5?C`?T4UvyZiW0)INW?rgBg zyDjtDZMW<8>nmN2&OBLXxj}_>!LsY`N^Y(AShidFj?U9kzfT(j)F%DOFV~CTEt#>u zJTEW*g1*#}3BiJI)-AL8!_)u8W261aIQNV>)^8WH6ega0`y<zL{onbq`?)J`Rydi> z6IlJR#Yam$LxACWy{!5CAE5<N8$~X9>Uc_pMcRm_X(TxAGdR%p^10dJH%r*-w}z}* z`Lv=ZNycRU?#YH1Uj1v6?dF_0d+9mv7gk);Z|+RG?(ix&;<u*8g8i$t)`;$G<Mgfl z`;KX6zV~loF@`T^!faC1BF#2<EPEhgnA=kEMBo6kv$kH%a|y$<(V_LrCk5@`$_(Cm zu0i~M<-UJsUMo*&_u9WPd2{ALjq_<t5;aS<FJ{x494F}BX06LO=l3G{CjC!ZoTWJj zZ4OsY5$DRg@HS%l^hXz(%|&!&j@uRsX&F!KE1I+5@Q)DYvX_?yf7(q6iu7D_cj_Fk zMwJt_8b$J_;x4LuU-+i{&V+xp8ug0CdoG;STqKmWiDQHJ8awX1-|-(O#2C!}F}Hrg zyyZEEeOIrVwl!nZUQN!xXFrwA?{FlwF1l5qygb`*=1Yr~+FiYF?-mN^xlF(O%K1u! z<=SbNU)gSUK6FTN`PEH(4<FoCK4J6OzXi{Ww*CC~jqmBMTNm~$_FWS7!Le&GW6iUd z69nsv{fnMyW*pfbB>i}yx+nKjPgV0k0hNX&`))e8PUI7Qv1i$qCr9pGotKopd@|bt z=DLb)3vMJV7Ej3klf>N3(p$W!_@=~5gL{kHPFEXT`_32GJ$07YYrj1mCm-6nTv7_1 z`}CN+;iOM`zxVYVNl3ceFMGJ`ouY&=-=xo9qeEJQd+P0V3Uja2=*#Ty<(X4(ezWK0 zV_Mf^OOD3XWSXqczi>D7d3nj_^RuJha-aIwXSbZ|Oy1+y`g7Gb^KXyZem5iQ#q?vm zyY{wSvogPxJ1KbHiKSBl3;(XZmK#@pv4Vez&9ADJrg;_T6~1h}>Na1zbHCtGw`KM- zGGev{gulKQyY{k~ef@&|iK{wn4)D2t`FCbdM6h=6%d_9#{PZ{S|5nF2z53tNdG!as z{W%@9!X@?|AN%E#)A&}lUEf?@_j-qh!Sv^R@0>+mFD*A0sXTJaz+j#df8Dv8yK`pP z9DXyE`w&NE)_H^9*-f&)>OXO8X8v+@)3MNNJKl-=ZaP+a|FC@I<6Y&Z>*{y!%ByU< z`AZ;FZ0EbVW$)fkJ2gcnT&-_|`fT?pAJlSBvqgSkF0Ovomh`mDdF|YelqC;sl&4E) z)IM5caN$sZP*V5#Y0pENl&3YCMXxx&+1~qT(W40)f7?BqEW9-;PEsRGbnD8k_Y>Sx z7wix}Rw|{@wsO^kl|BZma#l?{YGo?tS<krWK+{$4$7}+E4{vS{?tFBzpC|Xq;a}w^ zCLhQ-B7BthY?irXT;dD<#v2j}>z{f)`RBgQ@Xc<{=APeSuXzqxUUc?ctMb_H@rGj+ zHfHh9E?x2AI%u?c=5%J;-}kplS~;y&+04!PI`7a)<*iS0XHEa@oh<hv@5Zl6&ZW2V zTtgb4)icjq6}j%byx|It(u|eX+gl8FM$310u*n?hVSTo-x%HWN=9=rp0W)I7PfNG; zI9_}GFQ7s%!OY#q&GNa6`MaDStAdw)m!Ba!>1d$K0nhBa)^Dcmh}s?%mbmO+&-|Cm zCcO>%xkxIzd_jjwMV<V_9Xpn=_V<Y1$~<&_#uhK}>K*#^C9SzWt5c3Txu>X!9s9+} zdOYLPo^v%BJDki{J#{mc>+G7cM!BPQLTB|6pKEVVC73(z-uSrixYDuELI#-+&Ib96 zg;NXo9?K{lEZOmT!_3G@(e{hD7Tzgo3%GQ4>8Z1xIl<j;v-iDoefBzKpWn0BlNiix z;=e0>F0F3wK6CwKO>Di>BvEczqj>etr5jIf^T-Q-_WB-s!2$l6>%9}M2yiYt9DBNE z?wRYJ=F^wVo_u4OSakA)(#-uIVhV0d<}7{s@!!;&yGoyxTwi<R>$Iw%9Jj?C)$<QU zFD%sF`SD=Id8XIm7kBE!oRrx8z5jZbm+qpquGRT@=8N7GC-(>3D@>BG-BDj{A1xwq z$9B&DvwZI>3v+&-^S>`;bxF!ifcx!Ex!k@dPjZz1ZtfMgyzOy3N11h@SIg$!zdWIF zPjZ~knLWu-=GD@1esX2ihlh`5Rk7O~VhfI|b)J9g$MJvDBr2x0?faV|TCwH#MUg#) zPgWoPV#8GVo#WKvlNLK36}{hk;;G;^oqD!g{3rC&o=vrRGg;!zh7}IC-ke_J>&j5Q z+^Nz;s_$r+!r`T?lX*I?+J|u+osuzemOEGQl;?%<2~!g;^!WY>QaC?lq4K<}FE369 zMQ%~p!|%E1%bVv+wUWz^UVrgKa!&gJttR*6%MulG2CfS}FvUI$jNE!O>%61ogrJSh zcRIEd)#sMP$+h0R=k(Rp>0A97X`U?_d;9}i-(Re9@yjv|?fuGdj6>A=`{IH>@w%Ql zPCwWFc+PfTpU33?Orek#%dFDY^#)(w=d|VXzI685bHDA`*Q=9nwU!C;%Le8h`F&&A z*NJ(WOLld(9aH{j=2dlwExq%Q_5^$JMDadO+1q@kIo$R4jCi~Ey3fm$tKI%aUF_qg z<%Ul=P0fBA>ikoyKcl-q`n}5}!M5M`#I0BomxyQ`eD9#f9c{%K_t|rbspQuOK3DE> zzp8GmV!XS_JT^JwV1r!mKKl$c`^)`@^cSpgZJQzAV6;It#s9?{;pEH9PAEFN_1ua5 zq*lnt#%Y{tz;<(K{iLH3?y?^p8JF4W?65NHe8aP8ZQ03l3Z0GFNz=<Zud4ICtUu~p z^ibf>+<Jr1;IE;3Uwo^(@-mN4Y4+AP;&R%vwsLfN)CHf5o1%O9yiS?JAvWIGUz~c} zbQgX;ymOt&`Au_A_vx^)aSCalEYo|>V)39oBCX<Vr1-pAvGZozrKi`Md+WLSl%&K@ zG`St!nVYrIl<nryxH`kWsI;%sc$S}ewKRP9k7WzK%Eiq%({kqS$vbn8B+JSvJ$rZV z^X#ghT*j=GzL!thU6h}?d~)rgrzsw4V)vOg_~_J`ylVQ^>DPWe?(L5hx9^WLCraKm z-{_;`UhZ(iZAOs~+vASnC4ZKfTh$k?VJa?hoLBPPFG+Q6)LK{RUvHMG<nZLzxV^bq zz!>c1mOQ)pFaP9!H7!4;DR7oYJ^VJs+S;`?e8uail_9zASs#}6`ky$a{`x$lZ$(sF z)=KWHH5o?(?p$4wm;dpKmut2;Uw{5;-h0wNmWiHLk8|12egByGm!m2NEAn_>O<44( zzW+r1lJwj6-EaJ?bKdBDbF$lio#00on_JzV=oHsyzup?OHDtBOX}kG5x2-v+R`coq z8gGp^)0Rv4tf`KxpKx~Jh4=-}^$a`xCZ@hPa$3><`y*Rh0q&hGK{q}>zx(9&s~_9! zZadw0RQ+9SpIJixG1Uv{ediDO3V3PW4>}c{x-_J_{#lFI$?Y9Kzv<gbZ1B_ZlDW9! z=N5~-A7+|4x2D#Y=2Q!On)^odpkD3{wm3<lZ?ZhMJ8nLmQ8?wjew*#V?Qgal{dtvC zRcg7H$>*kd|J6^L+rF^hera$zDCE@FML~@U{Pz@Un-AqKU1%bm+v;p?_cZsW#-;g^ zZlbPhr``PiLjOShl*yAP|KfbkQ=MgykQVTHp6Sp2#+Vd=4GPUwAJ%_QxqofH6$g*B zFvIyL<!%)o6Wag(2-#ot=gotU%?r27elrv3^=~&W*UR0o;7msJJI&;a%u63%ew-X$ zub})!?2X~Z8`aFWB@<7@SshNEpRD|O#|n+B$v0xp*4@f$`Y^H0I;~zg{Yynm-2dP2 z|6ZNBJ}a?HQ23PWzO0-VIdLayuGDW_efeWa#G6-l@2A<;nU*Y&j57%P5uwQ#7Qc6S zpx_Nro5!_GhZ$@Nrp^3ab-FO;nN;C@-U_?_x__SD(WqKxm?yoAb3eoN6PBuHW^W2K z)C?0n7oxUwy586IHrxK~j>y+IRqy%n(Td2xS?;Mzm&uy?o!Yv1)}pJYe7;;=cI%I{ z-Px4-M@<oln@!D_daiyFGIno!cVnIH0@k~7vbUQVKmTI1mNX7MI$d|&*|<B0*+u@G zZ?AY0$e3IzyZ7{u;xp?b*SLIT-yvg=^!N91<NShidyJUlcAj~%;NE5N-RBn^6wWG6 ztGD5wBlzb$TgN=hGW~xAHs5~iiqX90y-#nxM%KnNq91;IeVlxJ>HJPxr-Fks&bl4h zFK2ILwa2~L{lT`>!#jTT&$xD{H~BrEynWA&{VDZ7tBtt~f8V<7cK%S|Z*$X{+vle* z**!fmXi|;!ho6?$y#?8Lg4exd$uCSYU(e#Y^hm<v`URYh;T}6@ZjU>Vac!Zo?<7}2 z!NX}!Cua71dSU(IoaCtoA8%}&Z(OiFTq60`fxNi8v2n||uO9g>q%z~#cge4Pi}tl# z{u9VAQSi4#YOa2M+YRAoUON|U^;>k%_Tbb#5{2<6<r7;JRj$qqxEPYelE}q9TO_dh zuwLV=Rc76WrMtT8U1v`J<=AcfWoF5??Z5Lvt*UKfUIv(_bgs_dBl)at*%M92lVXx; zJPY4A9ysznLTA3kFGE8=tEA|SPg$7my?ee}|JK#FXXQFtc&hE=R1O`AdoA*{GuvW` z{pKFMbr<KGefORI(EhnAucLcX;zQ1l@sWoYrJSgf`ToYeX-cfN;nezRmo(g}uVk;v znRZ^jaLGU6mV)IkCZ3(Op!OSs=yGE<wrLBK<Nh7K-72lzTxED6=lwgTU1h)K`8G$p zM%c^|5bsT>I<rreJ9j7V>xmXqBprUZI7Kgb{2+|cbYp8(kEB^L*W*@h?#n%T{TVAm zf>zorZF=)hQ;98@Gkw-$_sI8$>Lot5ecfquYR47Bl2i9S>J@cpcGquSF#Gav4|C3K zMXXmO&#aN~iFx$(NV`jWb=4`>Py5(;XWh-o+ZDmYskOh|F6ol@hTlxvZzR{+yB{j~ zUYc^G#?kS6-7^mzZ3BklRp-|*9y(WGq$KvW?djx6?!Q{r)z6#B{Oz~cFV2-6e@qSQ z_b4-JykT3I(^C87t@MNWo0mP~2sSJE%lP$8=hfrqxaSBQP)q&RAjHkv=_+IP?fPOC zwQD*HH#@T&duCqTVv{^~-zTO1svf=Ta)Mbs56W}ex@@Ipw-o1C`{kMmWUUNZUv+z( zc+SB;)_25yZ09>EX5u%cXt83Su1BoiADf8fG4=BQmNPF8ZY;bczu~Zs#BW*q9nDc@ z$sdFyH18DW7CUh=8O;B{JtOFUi<rjLrpfbS(;n)adR85LnC+RA+NPes`yVIRCh+V~ zZP8S$xndl?IsTx|`wN>M8o#-?wDs-VW|f%^(fJarJ_|~>-roK0s@#d@GxOfI+B}$< zxkCO}u2^4I{l-OM-m9M^{FBvV|F_n_a)PV!$=MD6cfKy!D)#GE#=r8%o42{@*?Jwg zyzqw-<GH4W)>GRryC~|5t^RuD=C3l(%r21}V@nCXhdKKm&E7a)IfAQYg4u!7;cq!= zEAEu9_*bV|?=q=9Q{ckB-C6g_)~(MA*j@dX)%1Pd*59Yky?wj1zU=;9{(Dmd4=wEU z_*Im#q1?G%;n#QG<LX??&qS}$KAv|qHDLZ0M)tz8gvd1gS(QsKu0DS2v9{d83w8N5 zKdW}0?WtSpGG|W6?6Y1bLL2XkB?{dsxcR_GX~oP6Ytgz(`Fq*F9Cau#iWk40?!~aY zwPg3T-i)Q6Jl{SN2uU$t{PJ_XJCD|bw-+XFJFN6zx}fmFCA$LE#cqn5zgaHCb6r5I zKJCTB=U*0vYpv+2QsCfPTk~A>%V)&{Po|gnT66r!{m5Xgow{rL%Y@G*3|yk6=^p2s zzMn4Eo)xVYBO!HO{MunY#)C4yZeBk%zmorh_#dA}*08pRo%3UNm@QCeYx5SBYp;K* z)b~S^fp3Gq{?XQdH-%H<^k+Tg`N;8k>95(mOTS7NwQLRAS!Z~Ce*XE+dBHJ-8&Cf| z=`rEQ($kGhD_$BMICJcQ+>OiAuI1f{y|-v~+T$Q*>(}@9U#k23zR=h@xi_|secPLq zSdFRn&PQ#gJe*&-t@?V*`ZI52-O|qA&fOR{JE(r*J?`uSipI4@m%ncl&7FB(c)Hij z^TP56MYQ5ob3f)xu$=JIX6E_ZuWRP*SNtU)Fy*HWf7Q(M!s6C5&rkkoW0=!(=K0B* zd1s!h&O3iQ`m%)LM9F&@8k-NMEnBP+{471S?wju^#m}3Sf;B&Hex$7Nd2_Y@(lh5z z{aNGjGx7ynB}cu&DUr49`+P2Tb<g#=cuHiggqhp2jMT1g%t2d<jK6-`nAj9N`}<<E zx|XKw8=r$$y!CDH3DnE_?e(w2(RGEfZ+6$G36o-8`UJ~)O^VFp6lYMIxyVOyL6P^4 z7aXVlEMeb!#=on3?iv46f0js?rJesY`BQ<sokhY7`x8_D2)ZA#t6w;+tnmBK;^(hE z_bDx$qNTf5s@G%5rvRURd!<empY?t-esVOGrdd_QvHP6LKBB$ucY8$b-sJ*(Tb8bD zH*n^k`J?$uZgJg1&&8K=I7OOTCsc2%c{1;VlcdutbryABfBwC1C*Moqcoz3d{$;(> z(qqM5k9Ns~T5{a2>y>0_>yoLT`q@ME>XcRvqpI7{lTyB@ne8;Hx@}sOt+6#|sjTmp zX~$Y7otIBsa?CpA#AIIX{u7CvM`fa0MY~t5WZ>jzS;XM<aQ*ZCjozJ;j^-USiJ2vv zxXNCnBxhFSC!1qo`!8&FF5g(JCgPoCy-w?-#S8}SMQ^{xIawq~PdAU!`~G(Julncn zE2o@%X0%&R*Ta8;mA`|8+WXIJL0n=>7DTO`di#^dg<53}mD;_D;=DVG4;!s$^lh2@ zFvUfu>xbov-R{4hR)ww>Uz)Z*Yn#QU51f`y)^|RfAX&X{v&D%7JGCc^<qWnnHMbb; zd@uj!dH2zSvyVt!YJbxrwXC|zDxqo1%6Y3p>-S|GEv?Fy5mB3B(Ubh*^5U(R**xWX zbK(l8a^^feG{-|@#<VuM1I!PuWIy!^6=k2Z;mcdeplO@7|Mt4l)jGF6|J%XRt=Cp; z3;X%tXZg3BsWw_>s*kIc4^5tQ@rK@u8Rwp#bSf9uaoBeK$l7ZT&>4%QW5s&GGu&qe zU%C3P{`tDgSECjhuSt;*nEwCtI@68Se%H61c6+;f^|RdPzqm^CE=)gn*7x}<;|I0B zyW4ho?Eba&^4@*F7RBCG%V=F3wY#?ZP_V{p?K?agt5R&Y9>00u%fH0GiF0-TG*+L9 z^IdDYIdozF(@z{?W?UN>4j4as9TJzl;_D`}sbcl-o63#F>i4N`$~n`dbJ%IlYD<^g zE6N<-eVC^2xbLo4slsP=v15mxoY3^W{_{CD-gtg*O?<I&yQr7?Wxn5Xm;UXQ{Jbpc zs?^fZ59jtDe)u)tv*J5*+|1BPkxMJu_yWIL-H!@8)tlz5pd(YA^!2h@ypij+?N?5S z%&gD;tCH*NpctI;kyoU?;Et-R8S~9JVe#lLojNv;^nZNmdMYljCr_{T>+^}ro4ki- ze#ZO#@l#HE&)ie9|KIW1dtxrE_dV%7^RAcUr=T#8I)!I}{1OMgb=_57GwF+q)77p` zGIf3`VV~SpEIZfC+qEKWw(moi<i4%Da&I+gJfFTOMnhEf!CSsN^XAWOIaS|t-s0d% z?%uE&HKIE*ey$X}F>_C1zSA0+nU@!3SZ;FKyTr&dwJTtzM&+`g*-OkkbGw{o?@*dp z#~35BWZm87kX1|Br1o-leAAq@Bj?$LYR7Ybx2!&9yEV7?`r&m;rQ~)=&6~X7I#VT^ zX-jhFrf$YX|EiArbNsU?do$0|&634jtlnn9yxP5@HvHue9vZM--|YSVhdl4)st3nB z_bxJhe9LII29N!%z4d}~i%!{JIH&4W{4Tci;wG2k`{Dm~{5m)1%%iud5mWLE88~_) ze$9Av<d@&E#!0F=3eV5XopIyo^G+M1$C=g};=UTGeQS_6ObRqoDLB9Sc*|zDPb>2M zXFS$QsNeozfBb=Enf8JiRTa1QUjB4K=`hppvz!mlRwP(<Uk|RR?L7C)TYEvWQX+r) zNj~1sOAUoRuDR%W@STo1!&0=N?qsU$U*`T}_W5(NMZK@?=sVfLYAar1&7FPa$$HMq z;oALET7Nie6vk+T$2hIHr?Jwtahk2u^{dw>-^>%4y>wB%MT#DGl97@GyXFEXO=oq@ z?g?|44i*{z=2@c_^jmptm5$Jf?sJ#fBJ-UB=O;|AoqurAwZ_b3H|J~C4gxpt3-g&A z)eD(F{X<f7?>@Q7E$*5(xv#$FJf^v^t1KXY$G(uePQCA*TWd^rjenPycd@li>cy*H zr=nRiVzyqm{(APg-1_I?y|qWzev5p)ZhQ8}#d05~{Hf(-=JP%JJx+4k^^WkA6OK2_ zb9+{colbQX^b=cDw$kb3kz1x>Gn8Ad1ys+Nf2BLu_lMc~Zs9#QeCPViRy9wkxV<zs z>1(I+FVHx)1xx*N`8!M5qL}t?KXCe}yrFo#PqK=RiuUySrge<hQe5g~oae{>(LA=L z$9Q@HZ{8`Znnsq)qqol4?1<VLvFgaw6FrkAO%*k+wtsW=Sn2kqD}!9GuJW1_;Hpzo zFw6J81ka{3V%>MtQ*L+Er_L8RXgGzt^Y_ErYiEt8huvG|HQk+0GJUE-NJTC4Kb7X3 zqMi*ouciwM%WmfW;xfTIa)rxT@%j|OZ^!-%9(TLpI%DI}RKqi~nUxk6P5gM~^0U$v zg+YO{m1J*<Ub1nI(SE+xV$JrFMGHk1JxE-wb*O3kEI$j^UjiTI=(TpPuGw#rm%zv` z_I_9I>hn^k!~&Ne&3I)ZJ^jV?V^8OnZC1RkJBQWxx6r-B=UX4gT&i9z5pbvY@Be1O z=6at4%a55oc8^>+_3uUYey@{19Zpt0J{13EnzLSyO85W!M^ZNH%`EzJBXPg}Q;ohY ziLX<gQ?9OBIkjj`k(i+?(|M=FbD!kfzRI6@R=&njPIhB`@y=W;{?h@47a!<*Y&^5! z1dsO<my<lF6(7uO;_=>GSXx@!J?nb-c3!o)55fgR>LWJ)-}A+5SHYB<Q|HDkv-ol9 zP1lq;vd^vA=fw)LeP6Lj^JUxT4Ob$=1lx~itP08%OFql)meaXk`ZW8@4&z@on~odo zZhn<yJNu*A{Y{ba$5v0R+^h9MO{U)9c9PmLt;c1a7q^^ZytPU9_ottK1e>`gFeFcK zwO2T-8zFr8%q+L{^#;ejBu<}`@P%p8F_(n}Oq=Gii*%jPxVxyJf=z3l9?SK2M=#26 zXf8b!y^-^g^yMpGoGc=5?J$$GcMV+kNk>=feRDCWExbhK&h)+?=c@!=^}>EzbFc<K z6RmT&_fBoO!#v*UyNns%Evr@Ecu8ujOIuQxo#OPKnZF;;z4K6KhkO0)7s|gJ0un^u z9AsZ4XV31m%O@$V`;scd<r91zd$Qg%cCMfPL;U2=+xKSt*x<bK`uD?L(}N?<&J0_= z+BARt?*A_F(%bhNgl(}pdu;7BF29SSv)J2>xOqM{US{gPwzaHz-MajV->RQK`}S;# zyus;Ghc_*57W;Cda%QW^?XFScQLlfxOy|(;=95*A>imA0+imULzWnY%HmA(kmmLd@ zoL{W*xN^<HcG9NTFK@8#{x+3wvY>0>`Ns8=mY2FFggdU-J|$|c#x{i`mA6t>wEXB1 zo?|m%W^cFWqDi}y4sD8yOI{_jL{V{#m-<)jv_-qut#Zv&v0GKW%|z(^B-!b=9_O48 z+f%<Jvv20LtCqXY$X}DccJq+@j_D`!J@zhh;|Mc8cG_=Wn%O>I-Z%44@7&w}JoHYN zke)jG<1~pk7n}_&q>G%L%)<@|7c)NG`PaYtK}l+g-V(L9HY>G5^}N&%b^0ZRf>%c< zUD>2F|Br@+V@mST?p319k)ln09xwgf3brWlcht{dTFPVepJ89-)xYbsMXqvht-B<0 zJLzm?^Q@pCsf()mX+AR_Olhd7anh4+@Y^)=*~^cz!m8hY7^^)iJbi8FwjIY4(-<D) zPdUAmpF<+~!Qu4gd-g`J62<S@Zhfz=7wKIYx!Odl^T*m9n(smFz*i?vZ1eqImtg(< zT<v@tIonnBt+xzg&e<Nw7dJCG|FO5@#~aR*4nE}#JsTfa1;6XvT|djzY>$gg+8w3G zLC^QK$2#v%_q$qbu3*5fE41^D`;i8Dr&r5@eS`YGB)<N;`k3>c%K3IP?dP{$XlHuO zc=O$7eoN)2&S$P9O26bkdE$ufo`~hgl$WtwWIyb>EK!gpdUE}P1eqI4M01WgM9$;d zkR$TM=EmV1C%)%T4jg2&ym9+!sQEs-2SGmSdjIW`8REY;$$e0Ev~|*XpUAZT$TCL3 zClY_21QrCRxr$E--tuJDnJzA_J8f%LTzPTVG)hMDM~mBy1h;$dCd*z7zqNJIF~?}9 z{ZV?MD!&SKD&1Q4W%h9K)o*i3x8|O}=@{bS^5*SRk7Jrg8AER+SlzGad1I9=%s=zw z+UvDV27CNByj*)n@|tp?2KT0qn;-7G$#*)JIca9heX*U}oTpDss6HMYv`Ss|qgZzG zlqOKq-lWG-tZJf@ZOw(_#m}QYYP3FHoOQHSw6B7x^qI@P$BH*=x2aX<aMeFiSGdU5 z(eCOoPh$J)tE-lECO-~qcaCiT6UuR9_I5)#zT?Y$yH{&nJ=$1s`kv;>hJvGBD_CAN zpS;z6AZS-_ZHe@u)??CUyWd*cMz4!LSADQVamTErXD?%AXCDzgdGY-%6<t{;tqF_$ zH3Qh+zet^=;3HtC7_n?xXVZ7?CJAP?`k1$zvi?nWYya)}`Q^&)9q)a4HqW1X&v)kC z&o81@xCn9XnY-$HOY_U+TOLjht9`Wb$KTU?&$(qr2v<KkcYgPyZ?Y?MSoG$Ie35C| zf0)to-jz3BrdZu5dcXH}zBore_pR2b?hO5!m1{oK@vNLAG~fP^ho{HwiU}eaM#*0| zjTOJ7)^F7A7m?63D0V*?(H|7EWXGBhPGXa}z1`&7#cEq}Hrzd^=Mg9nBeEdm+yVi= z4c#ser=L7i+Yo<e%ehY%Slb`D3-7-n{Ohqq^pQR7$&cLLZO?x-zrKt6V*hJJt?AlP z8&w2c^zEyJOA-ZdYKq^o2$VkCJtLtjy|wM4+e>e=_6_x!(JYdBn{v7;_P)PiXrQ|M z-%OJa3+7+rw|g>a|AM4BnR2HN|37N~`Gm@~33ehgs+^9@X?|z2e*S;6-=WUGHb3`y z`1${V#UI~H{xkj0_HIwjG9H;YUAI==q9rC%f=t)lT37Mp#D+gMCR(Citf^I#CgxiI zm5=9A{-b|;XL)YMht_%-BQr_&Un{;F{lB5Lc%yI0)9iTP%-E3B6QW{8p{KnzuHty? z;`8Q`-o{@?6#uTT@X&KG`@tSQ&rg9XGI8G1cHdZ|BToH^Prz%a443v@oE@-f!dh`o z<NC<zovGaqByz2MZ<(+BC@^KlZrAw%H+m9Z6;J5Xz0#~D`fZtC=i~ZCYdWislssIL z`682Pwqh~sm5n#FeQti%JE`2fi2co?aLMoYx5$2boqYS%?hRXua(1(AarP`TPWAFj z6?U5)#(h7=(dX2e<425mr!PBsX!+TF`}c|khu!Yv`?Zdp<;P9#i!6%AeonTSalTUW z{ZVtXr414?>3<)T+I4T*8*^gr-`DlLEd@V6?~e@ezVPN>UE$qrr=9p~n{SKpEojc( zBCvQJSM#sk%lVh4t-O@St@3Px^_7k4VfC}8w%BN?$(-?u-^y-eB!8xB$@%Av(|u<a zd-+}nxN!E$QQk*MpT2dtvzap;e7*Lw)f>Y{?8ddp1}FS>pL@G2bH~+HX8KV<YKLU@ zov)X_$dcMJzt%7@{C%dk##80FpAsV)Yb35!KUo~LGS;NBbZfvT#mVy$g`Z8lct3CB zS>`yGga0{G)9<|ecxaDBq}O7xBLOiN)t9~cyU#Phwr*lVVutnol}k6pi$<)P8eQWW zziU%y(Yw#?JX&$4w>D_}R?XWqN$|CV2WQ~Tn+yI+)TbUSS}EN#HACTDh`OBi#KMTR z{vPu!_+-u<S~}IXqpHR3V585MlWtcoOxF6^-@NP36baUYD}!aTH!SX4w>3K}+HJD2 zn$<kU;|or#&gv4ra?3(v)<^xsDU7jSqjm;`wwmuuPxsg<a;-V<){=0|@Ga9kte=^O zi2a^sBv&<Q&J>CIce&sFPA6T~nXq5&#+T)3F|R*uxT?CEC41)P{HI0o#XiL@FAk|~ z?BtHF=;(WR<+ys&o>0-xtdT8yKh_`F_;7~%nTiKS>N{>OzIHWg@h+oK^Z$OYyyic* zZsvMmGd+6duiHBc0#+Iv(^K^-%j_)>doRgxR3Yef+4|ipid&6-zT~W5&dS~IA(!fR z@vXj8_4}~b|8DJY5x?~|e^yy*Uj1&j?Q@^i-(T?Btp3rmn>$j@-~I5|pZmq>($$y$ zsn@gjJxYwvU+DJz^Ih?`ufjy)x1CwhT6$vYt$kL~(W^tROfq3qn#BOB=ofsikEoAG z=dOPcm$u7LBzT!As8j60KE12{T)^(a%EfDKXZeEq#oH9T{++G(@x5;PuH5?9{sPyf z#2(#wdR+B8$06Iv2UOpEpXe>udHC65<wv_JJnp=V`SvEqUG<CeSy3;I&pl3UkMi#e zC>Y+4KD?V}eI|eC(uV51hhI(hFIwbr;WGcP9NV+Y-h^(wlh=90=~;%~I`K~7_WC|w zZn;GdH(g1KnzOLo`^vYA6Z^vpf~9;fKD{a2<-X{5SxD%=@Dk4Fd5*vSoBXcdm!IaA z^)*Me|5Rnjsl`c+v0|S+bVY6+J=FC3Tid$Gbs?r7Px(HHN{i52=>LW3>B{EZSC4Cc z9KFa<?bJDWZq#R+S*uR8ap;73O^)gMbfEQdz0rn5L)*u>**`XNW+XYjzqKaWe(s`; ze~+|r#O8Livh~?Ixx2cy)?D&`b<%TQZKI`R<nlk46Fi@t<@~~aMc!l6+MG#uy2Yn6 z-n{o|TGZAs%|!ynQwslIY8HIWBBt^<DgDYSIjM?YF|!vQ+O*$ln=Qvrzi(X$)6HU- z*I(JZuX%pG#OWJPXKcJ;qSN%N%{%{Qe(H~_N58x(s$yNRDPL~&)8L$!{M#<SoS)jY z)NSRRJsCgpC+u^4Shn+`&Q$NIY&?}UUh_1sgugtWK66r#uITAE)nBG>KI6GFX#G@+ z<QvY-j2Blvv(5T+pK0d_g$E97U(Xp`om_Raen<Z6c-fQ<@kyKNSx$$f&pgNBm&Co# z7kOfBLa#q~V(ss4?q|n}{3R#LX~@o(li%(0*Zqd>jpU?_-`TbqADXhar0uxfdADbU z6Mb3w+|TfBoWE_hLfw*weK#LSo{^h>{r|t}`qF2sqh=%>Ia1WVUP{_(uEm*M|HOA& z$@;e+U3ahkZ|=3n;m+){9<nC4_D>Z`_<FTkO0+Tdpz%F*1D*rS=`(k(-!7B(PM+i4 zZpQP^_qXn!Bkg+L<XG-ulbNrV?3euV@EK!2XN^Ri&^?!Pnv!2Rq}7CTrv9DwF34x6 zyphf+`Q)OSmqGteCI8;v{k3h;91;D#S)xlTL&CCd1wLL9V_m;WGivRcDX+7FbN}(q zPrGGU==f&CO)2R{o)u43)B1VtZj7yV;NE3xwT+$GS)FmW<mS+$({0zi=Te`?ukm9( z|Hm83T*qEnRZaiMU$QF3TC=!SEA+K!-ozWXuPB~*&1%E*<4NJ!)NdSL=k2>udyK<o zq1p4ppASeL{GXHaV&>srkLvr6JoZ`eLj7vdf)}Arm%QRP{qf~S;mh<xF(xqv>oyyH z%0J%U!}R{*1Hm1+Hw|?DNiQ=ke{8X1GuM2tl~HLwLi(k8!``ll$-COGr*|WC^UAqX zytB5(TwL~J2mg+I``GU>b2-!h{}pI;5H`35nxOk_tY!QA)@Jp2Q=ggDWbH|<uMw)P z3EH<}+O16&^D<N(feLDcuKz7F5;w}<eD823-*-mmb77Xrmi#l^9dxI2ufC8dy7czx za|?C!@<k^7jdGngmCdYNXM^B|0<{<FX3x%gZ{8`t_qMfDy++#O<hO@+FW{f>?V-K1 z`>I76(x23Sr@l)&!Rb3?gG6lmnGVM1d+ImtV9DFC;P2TYUE^ofx;LXM?2;!Oz2;rU z;VzVNe1_3+wj}+6{Mq*ZemLazHZHj8^(R=Zf1YH(>rCIreX@?Cy4&wq$Im(VUwYE( z&9h4%zL6?DZs4(c;{p9yZ}KLYo-2ygJtOw<t4OHkgy$RO4U(sGpPFD1S$?Ux*6^Bv zx8nVxdJi%0f(UWGpD|6V$`);TrSz3mUZQXJ70vL12{W8hWtU}~f4s%gN3yp|w708U z&|;ahgQuVPk%c~YPC9kGaeO}8_jvnH<K_wv-%SFUWu}Qyxkr>zme@YNc%wyFVK4iX zUEvK&Ce5GnOQyJQ`#gWw8xI4|Ef)&=EVymO!(EQ9N^SMZ%<e}FzwpkEjGFrCWT!{0 z_TJ0{v7oTxzlt$kvNJ?i6=e3OAG&$-$NPSJg+m|ICv5grxge<3H7CN-rFjNVlwpAR z)oacSxi`Z*yJtsfi19mJ+!NsxvmmJb@=w3QxiMkAo@tBa3Rb99srRg%p1Lz^5BtrX zOQ&s4O5PGB^)zZ@eMa`tN2@~eGS}Xil6~}&;i;{UzJfyJY1Bprg_B#8BzxaAN}Sr7 zWSDdGp+)>gMv;oO6``STY$S?2E2d{o-ftsuXUb)@#t<hxPIm7@k7jM<?Y=2}$mZdM zDcPShKl+?pAbQ+scFb&XVe_44`Wyj8xpi$}l`ahOG6rYlpLqT2sCQ)bV2Ix^-+oi} zQj-(Lv&0(3lMghkwpq++x<2}r*pqYG#et!#T<<OQ=aFl%cyKQC^RHLSii=mrn*N`u zcE<UIXxcxW^XI!}wL8s9udEA`33He?U$y!1_ke@VkIlK8j@0Dy=HEEA;=20X?w;jy zKkYv&xA_RqNuQr#a({O&uGN@c?|rJZLjA;%9adW>*(U`EzN)lS?6y(dCvw2fa{j_8 zYAUH}Er(+YIyr5Z*h(`!|Lt|*GWV{NN?)PvQJsQ41swm**?XL4-!|Dagv0vk<(-S~ z@0@({={AooYtOk{IW69M-68gxX-BeBm^G)rR>j8LMyX%l*ZMvCxYVKK(%kyarRlYM zB@9D<dcN3nVr5yq@fG{x7dPfF`yBnU>GPe%AMB^|%ZLiCH)&GVF;MiJ!+%8M;7_Jn zgB#^Hg*WqCuIfA;9K!!&qJqqqC);zn+|E3e4)~M6&$6!i20yP4Pi(;H;3dL`zicc2 z>8C$^#`Vb(`>u8w@h{i<Z$0_r%*7uqp4H!+6LDI9<w>SPYx2y5;<+x=&*FVkV|X&^ z1;^WhbE~HC7d}be8fngUkSDE-&wPpf@{->I#gQj>tUe-eW?}t<i$Btz9JW~hU(+=( zg5$jVkILz9ZtmvE-5WBo?OSs3OK!dJNAuJER8R0Ye=0-ks>10>T%7N_SoI>Uws!pV z`q!b%QJ>S4a)2-HvPi|&1T&?`B~Ar3+q#xLUB(}%v+>RsMe|yjFU$Iu+Rl2!vGLBA z!iHy&dA~XibDi*&FM9S#PV1g=Yv^m$wNWB|0*m5Y`9)iTmIkfv2nkH>SDaI_Ij10b zgTR>$60Gl!wuxEp)97HlVU>Mq-O9HD_mtWL{d<q{@*b?WR|=>+$L6Y&#ls_O$g|Ni zzAU74=fw2AtCpuK_itFVZ<fNLCwY4xda)N=+x;!xQ*^qPUX%G{&JGJ<jdyb$pKaGT z;lrM@TdQ<$#H#rx1Zv$@K9>A&XTxKWmIW4T_h0>|xi!{S^O)$g;||3eLb+c2=1lFs z5-hsy{+V@N2iq3^yk7tLy?XLJp~Kb82lmw+cV1HB_5M=OktI9w^Q@%(OjyoWo?MZ4 zOK-O3fBWkDhwf-hTJt+R>rSzshhdiFmo2u}?H01X3tSWZ?(y+6dkyd2Zd^L)tQixp zg8jFT_wz#;Crw~bj80f}qA#|;XM#^y-On{^d}gIA*>+=bNbR*Zb9qId@Ynym7?|F2 zadtY}iKF(co1OjnZ@p-|)-e5wb#-A!W{+LaiqCgmS>5gmnsC17=4#(<XZQkc@w(<c z2@^8k&TIPn*{d+ki)ZcrT#vcx?Zz5eam=^(s+z0xT`9}w0j!n1_B}->CQRRRY2t;+ z+W)g>|G&2K^wuq_JTHB?Z?}MV;;FXu%zA;xn$5aOM`ioPl#Uvvvm|?#?b6-7WKo)O z^z5u%Sr;AN$({{b#*p$M+kBSpO!=%uZr|rBS>CAfWeB-<R@UU$D!+aH#c~&1%&#Vd zy*GHeg0;^hRc7mq;&ij`r?>qTabBj=?qHfcZL_8f$Dyl#g13~43AC(!ujnYS?$h%R z9O5GNJ9qgu6_}QPaoC|1v}4sA^FGy1`K(2UuS&J77Fee@ed;>i@{Ol|x350%$;RS# zw_D-WjcLCtI?TO;c9-2d`Tpi(-!=MNc6MB`soQl@Id3HjJYnM8^lOjSiSBL>lZAZo zEv-w6wQr~I7isjrSY^?<>670wueG1$>ZNk-``PwO_0&(RXtj`A?p=FSZ=I?2sW7ok z-23blyw+s(d|0%;G0$$}sgzZxLYS^tUoJeOx!U(zSk_}@{#$>Y9~k#pCd;o_bdY6l z!tSOIo0C_*<288@EF1QHPVXuo<+~0VI!q2)Csb-S%`=hyeBN06r1k2W49?RN%lMy& zxqVR(DL$puZNvPlUbW(nX0(OFj!C*QH_R+c81)yOSf3g*O^U%KE@$HXnS0kAz83aG zd8X&P*_C`(1KuxumT4Mt(xH8Y+vSOG6ij}vjY%sGn-DT}yK8BZ47*z3Tz`YtN#8TF zlFQ?Jztzo{>7pAJDBgd?GScLeCR4FV5O0dqFYerWb;Zj{@_Atw&&D5~b0n`@e|FN< z4HGTps-2%XOnj#o;&|ZWwMRNK1&rK#^b+q}C=>f2yG<ml>ROZhqcBmW{W?}Ri-J0> zw{e&^nBMSRvMKd-yLDabH0=-P%`W~3xuR=j_~XduJp~teu6Ry=sLw3Il<zzJyFRmO zeR-6J++WreDe<2tu;j~gx4u=l9&m%N^{vf|RZFrgJKu5X^wbN!x?_3B=E~0J%g^2Y z`))$gtFK0%uH5A^>=JI4XjSTxSvfaBkToRmgUG8BsVml>u%5nPUz7Vb$68kPAI-nI z<`{dt_{CLsbCY43j>9R%6mRA5{&l_IC;ZtUeeP=g-f74G1v$K!WgX!BxBlJAh94%+ zS1~*a?(i@6Rz0$Oj)q`||L5ewpQ)@n3TkrgIF9LA=rBvleJd!*-P8Vreedq=fsM)j zHXF?oncjQkl}G(GkYm3u=-1NR+;8#V<Fh4d+b?A=`89Lr%q;5&Em@bFH%-MpIW8$G zEv;;2b1n&RtQUSHZ#gS7gtxRy`^5v6uX?||n2P>-uUj5Cd1=_%!{?=3X1qSQq1<wh zT+Drq!}tCRcRm;Va;@^?b~DGC4gV(}Uoh|Uxsuz4>8kPS^``rzmS_KeVY=w5Sk|13 zEhlcD5;a*QeD8v$)%%zj?TH6PSeq_Q?3X$vHDyot%Qf@27v-<`Qt!Kp)$W3(=d8vX zuco~;ylLHY#d_|wTS}!iZf12yrmb46xh?mr-0kjH_by+a+bR%q@6M^)c1lv=2EV-a z*2=tMdOquUzWC0T>Knaov9GQbueK0MGq1?2Y2ZBKHse`ZhCD;nx&sINPpGjmy3b^s z7$N>dhQo|wn?}=G;r9Z)at1#2#p1V3FRCqFnKtE)mDc*_7ao1McS~^ZlV7~cM2@~T zKiBnsh0zYBWpdFKe_CDiV!2n_-(YvuKV8iE^Yh|AYnzt6`t0QQ$gMJ`==M}LI|FI) z`$gI34ry-saHZzRne15mN!nu0=QF+?w3hzkcf9`KhV(VN#qP2)S9P0SiJx=0zO}Z# zeQwD<-<>~7zj&vY)$;V`pDE3`W6l3B_x>hbbw<}2Ta{S8b)C6)gF)=?@7`<tT>%x2 zY$6LC1icn^2T1MNksHvm>AmTbAX{faFR3Vot^lJC)|L~@JDR)1*;gL(_T1e0{W-f$ zDo5dwZ3_h+IdlXs5Ln*nb(rth5}v86&z*fxRDa^Er8`IEx4msKtFk#N6`nkFyVn&{ zen0=~u7G*F4}E^{%c1g}weXQw@9wX5314S!bT#Qt#`@aKwQu-Od`_LIQ1HCjgX4~3 zLHWzv)a1;|3?ElBe+}DxcgpJp^ArQx9p-L#kd3+XMea*!qh<J;mc1u*c@3tnyR%My z`H~Bl7G$jPtzVRx#F1nA>g*q@tl1(jZ*9q1dCbi^^PHq=%xmwk3p%MaLF`6XB@dew z{5y82zmApthUdhce0dWtyxF?Jc)OT;u+dY~RNW0xA)aClyEnM3k6u)^`DVFi^v6r7 zORrg^?W(Q4+q8Xi>1VyQYi_@}Re5pae;e~z$q#2ev7K0cdT!>w`WdUP^=G?pl_^?o zW@o$N`it+EYW}@E_+7gA%DU~Z-lna6xz<>?r(<sT`}jL-Z(bMqOy2o%uI#VBezRq7 zEH&!-W395{u<+Rf87Z@_MHq*$-##%%LAu{3c}<l5n)s%@-va9uMcPdBCHE}#I<}_H zdDZsn^=V;=j(o4TmENuT8@5)uK1y2Sn-J%Q#}1;`cTMB!aB*KJt9$YN)uvtIKNl9c znz{?Ve*4+0H0j>Yg*s}Lp9?pBm-SKD7u&RV_RZ-zUIy_G<^C(l@G-{DUgx`mc^~(( zU8SGp<}SK%X|7)3#ox7kBBl#Hr(M&0^z7qd*N+c!n{H$XB&I0xb11pT>|eZBD_5z0 z!QtE8-R4RSEjPC&J20ek7<@bYr!OR1kE^&Pc^`x24fU%=tBkvkNN7apeGxG^=Ki<r zb&cY&xC0MkpS0cTXn6eWm03iHbl0b?f4H7-Hbp$p{bA!BB)h?VUi!+Lds@97`v}YP z`~3XHSjslPJZ&TQv$Vx4zf8aN&bLPVqt5K@cJ+4}6kkSe3r(nam_Fe{Nb;pK9Q-#A zcSdvScRZexackk6nv{L55sEkJwxxQ%t2J3DA!blg`@@mVuseKyp1t<r*{{Q$oL+g) zjd~&IWzeVn`mnG{Np4k>+{Y7!y1Qn_J0Gj5YS)z(Ov_Zhs<@|6-7X{etfSaZC!hC= zr(a1wyKYgvcXrQB_m@j&txsRR>hXnqP2UsWvyLfmld(yge`3WW3**N@qNf_>@v3#G zy$F3>XLq!%*+g1)0{2#C7YWb!lb0NiKHroU5VIij4p)iPTffQ6MQ7aZOAuK4{FqBp zV9WI7(GjxyJ5>8Z#AFwh<}PwyUZG<r{`l%j_r>)mwO>bAN!7~;*L^nFu6^Rb_ao2j zl2+yZ@6<K+yrb0dBdT+X$o)0yUR{0XxK4dk{BfW4>;9wJTU_3RP7&xnvPgJdb>dND z51#B*6Em*#hIgFQsC1jsqHW^wG-8*>hOHfEIu7bEsb^Y5MSpEPtvzwYjx|eD@~2JV zJozB>o}1vA)DK~a9;Rm!>eniNjeGH%v0Ohwcl*`5+?wm6BV`M|AGmv(?P1>5ggw)Q zu0D<yy`Q$fQm@$mafs=$RmoAaEluhKcHTIp!KCr`tW@4jQO9ey?p+R9`cC%lsc)AO z+l?<@dm*U!iCuof#+}KIIeDVI?|3gCdfX9x&D>Pz#tR4A&t=kkBmcdLO}fuhZzh#f zq9%1wV_D_1ISS#MFV}vp_*NJ`U*x`iL-pmS+aDZx^&&BI$0n2D!mq#n9liQ)S7Z5% znNgbW^t)zyeYJ6JOUtTU@wg?avm&rcv^KHb=Ev3q<I9SV7Ob>V?yqXCJAS+3t_EB1 z#8(FTGtO=JaB9s5W4W^{|NpjMwDSDHBe}ooV{RsxdUr`}d2E>Uqffu>L*M+5%^$gT z&9=^1a;fb6taX<s$#zG0Iq4bl#+BX9o#0k?ed|`Kr2)<YyIR+5*ve_l5^#0*Cc8fj z&zW}x<>jq!yZuoh>i#}|n~oO}AKKdY&MklFClInsOt4c==24k2L*Dd`xW%elZ~7c} z5fa>U*S7xho4BqC9Xjf6O)f6kC+6=goxDx_O2@(l6?!Wwmsn=rH|1yfP;BkF@_t{L zWrg)+Cv8uK3r;_;I%zN0^OuOY7L|F)JNu<!%C2?xwwA$>D%1BcTi(k%agKx8fHUI~ z(;vIM6SebRa55VG_xY51M=31Ntz}l4ag5W%tlQ5#f?v+8w>Vx>eAGKuK`34MlFi1= ziAO9-{w=ZOKO?=teO2G}S(+d9)^FXfuFzimQ8e)IrCyatre~cCTx|QgmUx~wk$$-U znbgk4HvhgzhTs!5m0$T@cMBwZp7JL#!!l^W;kbZ+zug~se{#KeS-ef(CH-1_VzN(p z<GvN&cX+?fy~(aDytm%|a<B3AuQAi*&bg-U<ds<}w&Tgh+nt4_t2cM$<qBD>@LSoF z@xNzg>bVonJ*L&mR_ljen=70toHFB|-pjJwi>pkZhP|kG`oP-9uwwd+={Z_#FVd$Q z+Px6F|NkD}x+!+QF1`G__Oqwwg#+om57%YPxxO@R`DS^Mj*YjE3v=;Y=BQU=pJZ%z zOJ8HvkM?!^{uvQ3T0Y-Se4kcexyS8!`1JXK@4vbItTWuPb7#Q5_}cIH&oJgKuu%}- zv2by*8-K-@#ZwecbiCrZ@m`l-+llw0l*XQ~4>?6n{eN5YuV~_t^)Jk`y!K9&5IlHW zQfZHOV8@B=vu6Aj&-qkfCB~_?d$O2tTRmIDlm8E<oiY~6(k=R_puE6z`m&PJ8nwHV z?OhjNI_|bKaGk-C79Xoe?M})@jHlI4ADVjg*8=5r5nE<lcMb?&t+28wYoo78-;${1 zmmhkZ((2$_va*}?$Yz#x+iO(Hm%f`N7`b~#l1tNjk*zVeqgm@31ae(clulo|)Fq*I zF<ARjz2AMiRSUvcO*_u)-X7$c`9yIQvwWP3e4VJ%^Sf<2>!+XN-YB)@$*yg&ZI8qh zT-utp8%uuD`>5&s;4ynmO_`5%<1<~0EQil|53)C(muFzVa(3CSm7%W~OO?GnzwkbJ z-_1CC-=)2OzhoNx*<!5n;K+Na?@OyTuU}$%&S>)zvDt6x51X)e^1cp@oOJrd^@#p` z>f5LE?XEt}{%ZSoDe<PsiJB?ves0rUeMb8BxgTdgxGU(z1)A*gU3sqdVQInz+l4pe ztM~O*$aQ;9?)k~5tNy(A7KcrK&(CLZ&s_w5HD2YOERp20+j*hkzS;MK&+9nYe64vg zon_CV$6<@>&&2#Z8~U+cf8CC*gSWdMYZdWLcrj<)>4N^XbAn%1?YkrObaP;5-s5en zd>?HRZ;X!%YmRTbcy?#ghOCEXg?e!%zqhD~x*k|jd|LnTHj#Rfd*$3~MLNITb<%PT zJEeA@{PC6Y$LqeRM!Yz*zUo$zQ^jNNHT~NR&vIEzwe~wI)>(MQX8RuAn#THw_yxM# zv!1^`%d)t(@xj|Xx#N3}?31iv{J?7TmGwuczkGK>^a|UDGh7dD^82@xZO^kk(nTL; zS$>&Sd9A?3v3|<zFUO}nym&{`nj?0{gvI79dWl<C$*zpepQo?qwDy%$)}F5q-Nhn0 zH+S<o&sDSV(HGKTI(<r4=bJC9YXg6mRy`~0ul&0|zbemKxvhEWq^$6lDbp{7l)CX> zow(|?>K~in-onxxw&MwFb(o`DqGIjxi?(oF`D@X?UFeSCG{0i)>Hq%(|NFMKiO=h4 z`1~jaZ-qIk3zT`wx3K+9+q_c8T4L9d>$7y9)^tw4dQGeG_T6h*@0Kb#9*&luw;=JN z-G!2G^$(fk*Q7@(xd*BAuw0uF-ScKPR~JLmgjY;5>ke-a+ojIv{%7V%U5gV1`cK|! z|5z#A$ZRJ!<I~rKi@OaD%H&*Na=pOBxyO^iNwC4daP1_u%Yi3Xw=Mj$Ugklwwy~m? z-4@R$7c{3YdRO__!}Il;%eOUeZE3SIdpEcJQcHsFV%_d~lNA?I4&DfI3@+|@xo-aY z7QRy-b${OKP4j-%erQGVspTHKI-aZ6-*aX9T&S|$dhLaWvksOEMRe)7zk8ECGfc;2 zpZt_h7Y|;Z87aHc&)~33^*+0EwkK?lKHRh_CN?&1;X#9MONuq_-pPF2d`hYL$Tl&p zk7q^tZUyb1cdc@Mt<ul>)qw_Q^p3@<ESRlbk!5sS{G_7w_iP{KJ8bn1oKi81&o{q* zeei?uRUh;HnlHFC58r1GpMLoKsSjzjwMG1oH>+63S|6MD^Sj2SPTSAtb3h%j`*VL} z)tLHS|93Il<(9Y{hu|+zN6cmW&ebK>Gv3ZWrpdlkS>Dv_nZqve;K=RuK3yFiCJQAy z)@IE-cVgdRkG+=-YghIiKXI)8M$p%zCu~0L``oh8(QbSB!sZtK=^Jm?7csD$;3?*5 zITq+`$t8ay=)x){JGmJ~x7X_4tQKt4*<Stpw4Nse=Q@RjQQtpn%Ier{-m)@l?;bhc z0~Plq`sbNEZ}jt#+r7s5$v?|&@hj`uGoojR)mJHOICjS+BQl?5+pVotx@*6k&kR^1 zrGF=fA<yn_$mYz`HMd^wi8)tsSoO09uUU*x{*EW}E$XFJ84drb3L1UfkiErkOT=!s z%GAqhmUCD8Z!gJj_`2)=+Tz}}=_}UHDbLf-yYPN)cQk8hTWx(nl@9aeIbAc@o*r~O zTR-Qsq0`wIKJ$ucN}lhxzdSsZnfbT%hW($*E}ko?XJ7Q$<mv0XlfO>r_U_#K^6As> z^ZKpxO|9-eEwO1ha;S;rTD$ZdmA6&L`9C~2Iev86?~T6gTdURwENP$Dlz-((*n07{ zk~*pQ9-q5Q7*bcOdd9BQ{HguBYipm)b%|XCb0&*x)=RrA4U^oo$3<E?Rpe<{+6E;? z$y@KcS|UUR)C88<a!qcYFFQePg4%>-wI0I4DmLqagk2}UEK_XFTC98T?i{DzEN63V z+{*P&{Mz?o>i4^bzP64!EJ++m65DE9|MF%1nAx?^S0Fs9T)_RbcHFg3&u6CIdsz|X z_T|tlR+*{OrvIt`{Zh25cuGURm-PDz`QAxYyQGf0`z|flVUn&hd;hP|op13U*{?Cn zOxDYm`YqbFpmOnV<#zr(C*#%j&8yMhEcyDyvu4JLa;GCoubfd^w)CKC?Che`lZ=xB zO0F*3Yrrqp`O9Q&bE-FMvfa^XW=i3A-iben>b;t^qt@BKIaRvkNxiLF{fd@Crma^j zrbYEWF3s1fD0B_i%&{qQ2(L8XoPVxyoz@Mx+z=i4WgC=KY*_dzr_L5wXx`lV=HZu? zL)PE-sCpfo6S$M_{e}Hr>iS0`9u_QJtYntHrsME&=B7(h3n%;wpO&F|#A)K`-$760 znErUL{%YD-KI2?mBlq`zsfQfuzwgo0^s4)v)c&Po)|3nW9-CJmi@9$3uJq|SiB6$B zznPQQq}BH;ajNFuG?H+#t1IO;kMWfFy0^JmA&AMVLGFSl7mKv%QaP)4CO`V3d7s4z z&EESjsNw(jbtMw7`_Ea%3+=4?J;kly@1_)kjmOW4njO1w=&}AQ+jl|Y&9wq^oa+5V z`OJAZzp~GrE@`IzWm1~O54p?Pt6whOXu1D#Vd&P?_kM?lUO%gDqn3X^=C0Q7Px1#3 z3f!vy;@8}^!Td+x>@^W`vaNqJJ;L5Z^H!<7@Z8$->WosBuAbkuv(>pvUS&rW+FR*w zxwhtJ#<%K)x|h15vZsA;=-XZ}XY%u-X|FG-*0Zggy{q-x%}9~6Q(p>(y$b2@{HwNj z@{y{Q+MPVi4*8Ln_4)N0CPmoV{=fHWlF?eh+rJETnYk7@91?G9Oj^3_$NAQ#ziu|N z!Pl?OJX<5ZJ-6w>gU*AViD!H+-II_Mm^YKNLxlg!t-}!yW{Tf?v2WXZQ<LBhcMg-_ ziu9&)8T=FL!%adsT&q`W%geUQO@GY(meKdpv{ymuQy&-233ht;k@4meMz<X$7pyJ! zs4hy7uM65(cf;I$jp>eBiKlr1-^!(WtE{Wjm0L@HEU~;V&-r!BqF=j{>*n9KnD(jd z(i@Y@tMt!J`Lxw}+kN$AU+2p0t^M;uBm8!|^zwq6PhW-Z5r0*$Dfn-?x>8l_lCJbs zsk<LWoq5Sw?pu}nsUp*K=UEY>ZOOI!gL8Ag%w<`=Zs)=VO%s(<PrrYVzt?&temg^K zfuDHvyXivy(${Lm`9G&~i|^9N(Vg%v&c08dC8_+4S3HO6U%iVpw;qJL_kCMoC1J@w ztGDFr0gu#)_IsPApDppKtJe>#KOnqwCd(6#t&#nT*Wz!yP2IHTU|C3d-sbn0)xNxr zyU_fr<DzV?(VMNhH>3L)kF{-VU(Ef?Rz;rwO&ZUhzOB_#vd@$j#b$3kf1Xh=&@#+F zsiLW~*Ig~KJN4Yj^SylTe*%mm6J}?+hc&qI@OCnUtjdk&thf=<!M<n3Y_9s%2Qo@# z&5eqB9(_rmb!FCy?=xQ37B{uc4NsC^#+sJ=@B7~aQ*I{taW8Ry8Pd0Uk@K(U!gEuL zB>zft9+*|Id%^7Qik!*wQ_q;0tO!0Mc=+Gk2C039k`vQA*)*^J>3M%vi6{7cQo8TQ zV_Q4+uKd9{_4MZori@uz7k98;F}d^cvOxX3`5(R7%-d8$js9#<4_Yh|P&?<kRBfmF z*Nrw@T4LhHw^#c-y_uNzcU$VB>_@gSpz2oe*|m06qr|-0byqGt>$5zw_W7YG9{r0+ zCAI4(yYLmCU&Jx-_u9|9o7!Z*R6l<dc2gp1e*J@k7UhO-t$T{^FQ0PQqCD|Q_W5ai z=N7!1{@#^Ywtn@26|&dQy*Ao^WB=YA4Dqfh@vgHsyk)wT6mxyq7P<6~+Pd+LJo$Dz z_$1>_d~j+LH`=pvo2vPK&FiO>PVS!gBW9_uRo1r7%m?je2O~s-y?Nf8WUPL)d=^vn zz3Fq}(k=Gvag0qhcKB5P<kq_bZ2pg)F3LXKTg@+R^ZU!{#AbI1$)8QU^S0|KrnHm? z$+X^npy@KHI=5yO_l?EVm$)&j*C*#1CC>a~(P*1xK5Ok37BkjUN-`#o=6OnA6n}0b z^4#J8o4!rzOg_h%lFmY68D_GLA&U+Q{>xssjw6;evLbBKpTLyU<}d6I?qN!q!I$f8 zrj~f#W9i?M^9(wt>f}Cop?~7QlivEI(@S_yhHTO?Gwk79^G0uWXEcvij#`@X_x1HR zLwxGH)6TnWI(w8w<mdF5sn;#@PVFtOJJB=Y%RvFrV(vck8Ez&@7ng1PIQzhb*f|!0 zUXp*W?R1kB+rDV^xet?@yi84A2ph5QJ=a?PM#YR_f>rL)V}ix!{Z=p)9bYDB!rs1Q z;nuf3rcsyAI4yU|ZaO>DwDajH-=?#YH|A9C_BNjM?wL<d%~Q+u$CuZ<tuAJJeMB!~ z@}#UiE}pH=AAPx9G+BN3`SQ<BU*czdjL!&>l9<f(Yx*B|W(n@HOGkY;D^xr8o_;u8 z-h<hkPq@l&`l<%z!!{28*ZQSTPw`+@6yPzkN_>4}<KGkMYU%SO=jcwK>cK2uKS%l1 zU7dS!F^kt9IsbFl!P9??`6fvw-E#Lxdvn>~;JP}tZ-&x8Z*6w;pKv@NW#vL0_t3Q) z%zyADuP^t^`S#2EV5Y%JU#}PH9bYW_zWnxGso$Q~)%?DKecnygZ>oE$O`4X7-3|89 zt2?d3+>oXDg{9|l_1bGm>dzDpPd?PV&+Ksh=0lrmgr~1jPjK)QU7()8v3F5=#SX_e z+rlC<Cr>PDd;a<D*IsLdrO!l{EjY)!E5PbW(aTTI%%8sMKe#nWQK@=y%);4@@AF@r ze){zRs52Yq$^TW)zJBN4z+X?NHY>iHul48Vgn*BIeZ8OZCn#=ZS-Et3^pP#QE8hyd z$T?~2us~(<QuT$xjJppVlK>5Uf7t82mg9HAq9v0{LMDe<G3;ElsjQH7`ZZ5xb(Sjs zX{FN{y_hAqefushv!5OFJNTd2bQLdVt$OqF3lgiXej3mE+@Q8=rO+j>S2<}j&!6}+ zafv~~^paPnvYf0;Z?iA0sqwWkt&KcyFjwl8Aom<U-lgGRO0>*7di|F_yK~~*B)`yq z-^(t@$J{SD5vsp&*DQb4{BpeuAHEfb?{u2}eD%+(>xw?NFXFkFUR5w5uF)lXk<078 zh4ue@>rGXn6fgcNi=LUc$TZ}|uiTXvb6PoL*L}{-7q`-Qqn(yGKj2Mn$?dyh!n;bp zvE5I6^Hs0&Y+SwOg1pbMFFSZ-UG#3=S#Hv#dp70+&$Kct*Gu<Kn>?=Mtvo6s|7C0C zQPF8nXYWv{JZgGWr6$gBO5DZIU3V1B?AFh)ldSeDm&~r$Ji4yQD(>Oa_fMW~=x>|u z{665_2e+R~j+og!S-ZDlN69=DLI1jlJs$U^TF>8UTXk)&S4#0S9>-^5M%(khyInea zN6c(P4gb$3oqN`6r>%IyJ2(AKj>+%60h2jD_k>?-=hxC;vQw~nef^m7<Uhxao<CV` z>A0BP=9lA)rjSp+BTDN-TzZcAYz>jRn%nNT`{o<rG__X04`pn!?}Z%HuV0wC>PWf7 z%;Y%?LdU<l?cK-LxwU)s1dctAoeu4t!tB8^&BWJZ&4fAiS`k*aF0Arjl`6m&a@Q(D zzdZBYif0?VpU!X2&u91B9{1j?I{ScSp1E{yK&;T7xs1nmtFROZ<tbFXu0PB!D#B=I zckMuNmxqd;YRCJjVXH5`ZDUmW;a6zF2^tvos(iPSb5`D+b8n(n>y=;2J$dV>C=1K| zlQYw2DKR-+S9jI=#?k(&qhis&ebcwd3R)l2dcM|euVje@cOwU=+Yx<zS*W*Z9ZSUi zrkA-s&)Y6_9GTPor}Wj&hw+LP_1i7y=1)DcnD3*__0LD|O!Q#cxWFjl-lZVT>_eA1 zAIeUa4K4B4$~vaJEvM&7y6%lV23KC3+8ecc_l8CHgx18y816b)-u0@ja`l1UoFAXv z>WZHC=DeBk(b;3sv#E+svb`@ROxgZC(oHd{Csya4U~Wd}rv&3S?sHE+nNt08szatp zy~@hDCHX4$4kvXEzFo_2@9?qkVdGPg+9|4;y3$j1r)vISm^hVD__9=@i=3o%pV>vX zFNZ=(<1}Tgb7jN=EOv17q&*Yfma?*Ie)>GA(6_5Vjl*cw>bi7mu|&U<2ha0Ol!^RR zJ>`aoQrM#@i@0WGO!JkD*u;@MKRqmSnHAr*`W0q2KYo3kUSI$B*Tm3h#_2zoW>jY@ z-DA4#u{iDFM9-v{CpHO3OeEHpO<2lxY1Iy|x?R7x&xV{{`2Gp^*~}D%d*Wv^143L+ zZMK^Gvf^OQOAcS1;;xiG-6bKe^)s&V&#p2qxe~(rNAlmFnI%Dq!BZ`EZR?%>uE%hG zlDBl_JD->Jmi=mcQ=Ejlv`&<*@KfhmqJLI$yB_ZcYfjhHFM?M)qBo~~sujGyMX+dV z*ylAYm9D(35^Vo?oExTX+2nBgPh#Pov_(d`XIwf0-e;`ZH%mfEd*Q2dr|+>o+jDzD zYS|htmNw<a!Yvp3U!CcZso%!Sc_%<BdbgqZmi^Cmxa>LMZd0#xDcI=wk&_x%{UWwl z9^BP?^VluTk5(BnPBDE^tvjTj?w{_Zy>qMm)BGb-D!*@@cc}36E+x5|grx?hc1M(d zzOQ~B?lQyQ=0bnb&KjYF;<wVjSa0a$Xr7dM|8l?6l<8+YEqu4k)-gO9?)GEij(}S& zsd0W2o++GNrmFG%Mq=^)ll9?e!}(@<b<DG$)crK#jr7z95gkt>Hq2xS^k$fI_HW-U ziGH0mx4x7-)r_c_C}Vxic~R4gB^_INx7JGNt}uHnBp3JhiP9NwGZ*XFa<>V2rgM~= zCHJ~N`zUsMF=KjLu-AW<bDgSv-?vPB6JqSOb^r0Tj54{8W?wv#8oGRQyyM5N`gGsU zAFIwQ>^sCV{XUb4oYR(o7a0pbob;D+;-2}Z=8hD5(R8L35s4LgY%TvU$e44f9ZKOe zN@SRD*F+)Z(1G+uABh6J%RUho&zo?a%k*gN)ZE`4B5^|h$svU}0fV@P7>U)ZMK2cE ziYbe<@JMQyh;wir+sINamY=!iMnG2Yt@=Wh^9yGe9(%Kt^8(Awb6fSk$<6qEw%D>H zCI5r$v5NQ7izM`){PZXn{josl(z5yvTRstXo;;59r5keAIlnx2=oSC%)pMp@H)CRX zYVfOp=dz>NzwC996+Q1hcq~1>IApHQu^&h0?sQqVy8KykQ=^r&@1BluZi78W$<+@I z&7a%<p}wZ_*CvxsPagUIjApIWZ)W<edvYg}1Ka)+7asL9%6`4Qw)pz`$IWtO8!}nn zrQY(G75jysqwr3k)k(H($2STj^6Z=JBGLcqtWWDiX~jFMqvCASUdD0SZ$7S{*Zk@D zi>1e}zu0N|ULd+{%Uf?TVTofGb_QNF=5T)Iww5PQ$lt-a{<`Y_IrnFXZ!LN_UF9sZ zQ}gN!^;I`EJV@<{sNi|#*BUQr@!WrszHCTXL9k`V`*RcbNl$yG^yl8r9ii(kCcHQ* zv7-3v%Ws>F_Bb9sEnW5VnK^50xt;clPpj6)Eaclg{YLlGUiruea@$>29(xn1JCQ@e zVt0^)^wfWoCKi^g{jor%-soM*cM~anmie+B2exhQT3vkK^32`rBMKbxZp+rKHkQ6@ zw<DwY(qxOKE!BLw4}Sj;e_ZRdF!|?&(v#MYOBa=|+hBN1Os+ogec^O2{oe@*Y#W~o zRR!*I+uiWmO4=uOS?t1E_Dh$Og{qe~@$Hj}=e=fjYky+x3MY+oQE#_hvE{E9Um`Gv zHNSn%MQOPy&!_y`rX_IV^K)4}PA<E9aXb^|pOV*L>tJvy>}C}5IB?6sb^3)Dn%xJv zRzAA2@8ib<Q*H)_8m}t6(D&HFK4p{CwT)@NIbUjq^}f}W+c|sjF54fX&2x{uHNUdT zRJG7B`|Xa+kD@LH9xU&QntxiFMafL~+L3x2KcTQ0IvuO{qN3l0mWr%YVic2A+Bl0x zy7j>=eUG|aHO*TBttpcZL_Rz4Y{M6&x-y-uR-w9wI$h=}KgnBLdgbw{KQ_~^Sl|9S zYp>7EcXc;r`83EM+u0N&^XE(Umk;rd&D)f@oTe-&*JNUypni77L&L8Z^jgAy9A$Tv z7QOiTOMRiUm(Obv71#MMA6~kw<FQV8&e9S#+3gy(zhAsPxz5V>UE`UGWlZd!4;_p@ zWDyY%xrXH@2OqzM&4UjOhne}#Yrp)my0D>gQN#(Oxl2y3-yE!xZW{FK$3h2>ZEH$z zJ?>N#G_x|{&{@$`6U`ww$x`2i<KRw@`+FAzi|o5C%he!TpZz|;zSZA#zp+5W^F5zy za`}7zNTsvy?5>r_t=H>}F)0#1<9@mI(JZsC(i_<yyxjIdthc!32Fuzti$(JTx$idD zh_BpgXzn6XS9SKb>(%UwXZESMge)}A-xlLn!1wa4?GEmPpD%oU$j)(V$r363HwU&$ z?UxmhkW!pd_IQ4G>X-WbFTzSbb28etEj`O&FlqPRxkW$YIX6vrFWP;X%T`skru}7F zK9j(2p~Tqqz6WPMeNnz@ANsUBqgyzoF?}yjoB64$8;TpNrq{A+hKElN-_m*Ak=6Iv zu@e`4nrE!mT(_Y4$F=aJGdrcqCS)#bG<2LlWnt0Poq@kz%vr<nHsW{~SN&a{s(R;m zz4h$o&8HuJ<&0hN_V2Q;L=KI>wac!&Ftt=VmFul)w<&bt4m08Ti6?(8DSfiI?R9j) zBfI?ab!9zm&Nl1H+}Bkuzj)yBsg?H=t)H!V@;h$J_M0zn*{{DJDf8>{d+zDe-oN}> z+`YhZkLjJp_gNEImF1$A-%qzY5&pRUT>aGogFjpTJjgnpWya86^W#@T9rNE=!td8t z*golC3@P2~HHG)}nRzaESzL`nWuL6ASG!#7=RYw`f$fY@kxxnc#H!`Vzk+1@C-%y3 zT>2`bD>r)YakI+%m4|L9%)cGE($OrxQQPnA=Xbo<9{qmqc+D>SO>Cb~_oenG*1|sl z0@(|h`fg3%70Rq$KkdPZ{W(1P7Zv&hR%)9^t>d0i?DWUwhv}=>x_?F9o1er!ea7#a zxH;A(A*>~KpG1w^oeP@ke;xbt_zqZ1*c1FP|NM(vB5DCSss;VR8V4@yoBsc+T(R0c zI|l|Kg`JfTT7Itmoc4Lo=^dNS#pN@nP2Kx8ZS(yuJ%#o;&whWlx%0f<@cFr%ckacz z(yUeQE(y*$>7Nzgo4rPIRda5U=DB%Jx-$7a{r9V1&)I&<edR8v>a@Gcwi1CX`$Rp2 zB>j_LPqcCm`aWlI&4-z@e=6uK`7g-5&U4YEt%cw87FwU(5kK>7gowNH-@<9X@5d(p z+&gorB;VaP3;s^q`+4S?9d(kcRBqOLbsTeFuP$GHd-nt9o`s>6t%sJsvl8)H+%?}+ zeOt}8yQ{xfpDwD-_dc@s1pf=oIh;$xT>UMVSom&#^5@m3;*7}3CMW$u27%edPiDQ| zGRbP&1fBmPN5aKgD%Iw$yYp$2)X(kw6Bl*bU63;8?my%HiQyb`+Bx-$q1{p2bvG_} zol^gKuSvSuu@}#I*IRcU7F4*gU*i2zF$39YS_+_f7>6d2jO}sn&BQzX`Y*%<hxJVh z-K6cnaqnEigIFOZ4#)R;LLA56rY)X$e~0NU_oL^HlkT38ERD|*n<p?Y<gS&YOLx2J zw!}?)PWWm+@|~r<=Go2OGmA>>m%s6u(Dva<aR)~|`+dzmz2}b`HRE;PoY7tU<Xv>i z>FiTc38m|FObW`U?glTM`K-LNbW4oV^$#b#))va_`Y*fZZtj9-aZ!=mZ*Kj(DEWV7 zp2_h;rYEbF-cPf>{KqhKt^D=AEXyZ;xiwV}rnz5!auRvj%+s}-wI$^D)SKM?RGU_R z>)iL5d3k3PViV7pEtZtCn0Bh;@6-+Y%NVCNztb)K){wSpsozAaLJszq%@!uxbXK0f zp%(aD;`Xh*jcUtWZ8UBN_6o**pZ%vaK;p`t&<|l*((B7oy%`_!cz?0;{?b43e~xmF zz|9A_51X`9*0P(O(Vv#-ckj!GC+2Hz`5nJ@C7?b$DQBgBi}{nMJsbS4^Ymm$zm`69 zhxyy8-4&%9D_jem_EoBx`*mEZGFZzP>ht{hUBCZx*nWQDwYer!w)1Adt)g~OpEG_R zHako7xt;$qQ}x$-hTgan`fneb{cR0$d^gMI!->E<)urE#YcTK&Y_(&5(f6<9z0B;z z`YzRz_7|5l)W=*ln6c`+#7=G_Ye`;t`#|3{z2`dBj!nt<+VV2({i#;VUx~r0`8U*4 zI^|^2%Ze&8`sF@^Y+e0~NBW8FqD9MBIoEA{$G=x}_N#VN&n($Xh4-HL&$jI<y0bC; z$w^MzcUs5)|K0xY>eThGR`+#r%!vCKYMkqGh%M>zKmN*6qiCCYvC6N{@{Q&8XDE9a z|83Q2J+6K7`Bm}nc~=&ketQ3LozqhO2S(||h0~|&oUW-l@ao35>oz}h-&{WseCOq@ zH!+t>e~G`yPMQ1QrL3C2Yk<z>jJTy5dpF3wpSpX^|5dW39!KI|*S#@adhdAKl`y-q zKIympxt^KkOO8#vGr9Wz!ue|TH|F0K30rk<ex_aj(__by{I*U^z4h$K%Dyu%7h2BD zP=2GY9_bVLX~WSaH^27ZVE*|(wZGy;kmLNT+uXuaYWZ$vKMJ;7%>Jv$spIQ9`E`2^ zhNbP4_+mc$g;~k>FE?d`udOIPp3?o%X5+Fi`=2mgG=6-y`@6-vPe)FEdid$F@#!+V z`o!X{7u=g}Jn6h~eRY2e-}kWpVpTT{UKVe(UnJeg-TqGW+n+C;d#6A7|7NdfW5nOP zQ{BQ38~)uMP-CblQo;QoU~g?FXtmbu7S%@vXN9C)e(`)QTb;Tx^m#^ALeBoo{UM46 zc|MqyRF_8b?o`$<Z-1otzSf!L$<Z~@#n;=#H`KpSY1#oDNvXIVYc;F8_JU>gI-yN3 zb{c7V*=<|cQasVq=nH3yOO4{fMGIzs51noCFGMavSKtK8373PZNlUC|$jz3z7nfsF z##ks2F5|#sc65Q1DnsPNt?ETDL{{GMGVw5y*ruZr75+ZMy7$Ioo`fq7B3uewuQsQ- z-!iNB3Xaa&vimi=%?{-&*Z%E%s<2gJk?)mRF}Y1~-m9)Vw65)B%s*LheO9t<C*R}t z6>nd8P4Mkr@~W%Y%F$Rf$oOK{>Q#O3H#+t&^=K$@*tNjJ{M{-kUG}w?<jg}>GhbqS z$)xmmX_oqZWA+B-13#I6WS1RceA!U)Z^FLE|I8X}u1^n+VHT<1aCu$nyOWH{EN&T! z%dOwI7CVbE$S~|<sJJAXR+rIqS2Dn7!Hgend$KDN?@O2nXQ;8v(u|+Q`K_1n<xvN# zH`2_Px*JN^?X5$Lgl~shx1D{Qv^b_Gw*9P$t#rZG7rJM+-)D-fK2RxgF4rcB@3hvn z*A1l~VpzV!ynDA=IoMpce#K;lDc#+ls=cMdzpBs5W1PZ#%GJ&C;<GIe9=vocHVBa| z;4j%H``Om=iSlKm455i-TWkL(&HD4}!NJ3S9vz;k{Uq#hS-$yH!E__3y%V_)acxVV z`hL#MdG%*rrs=L$Ej)hy>4OVA4N?w&)dJ3ktoE|>yQ_J?_`%HI42>F@#ZjvD8~9Ft zX!&Gw?zR_O%N-w<4~O3D?VVTWZu7=cIq2W@-^_~My%Us#epDo!dc(iM_{SdO`}dDL z+IA%EZ1aZw%J&bS{m;Hd;`s@`RSOQX=&CD+T-fy3nbnfN!Z3k3aQ}S1Iokxitz9iW z-bH<_URxIatafb(yXCVpm)^<Cr1;$^+HttvD72~cdaR1rwvc-fJm+36E4Jf3m6ESA zRaavBd5!;R(|&qP$Wt!o+S==7cC4di>$Bjd&MOOaDz~-Ey`Q-1w%V+j+uTg&oPBn? zD)q$^(Tk;TcCFei)&Jr^D;q<@o~yIGzP4R?_aWc+x!JSuzq^wU>zv&pbcR>BIr&J` z{Y0e~GdSuur|I97F5hM<SfTW8*1}2M{aV$BjsN`lG-Frg32CLw^wm2QE}g!$sdSy) z-MX+g^Xt~ew?scpyJL}e^;_1q8UJglK1{6Dz8~<R{Z72~s;3iv-<(m+R#@)!;c4rq zzexsvq@_RXUg)rQ>r*zrK(+q(&=+jGKBoEc=*|6*w;|(=@0t2{b6;9K6PfzNsPv?# zNuSr(P5F~`YtH*@FSFlXAo@2klg~}a_-R|GTgY{mnR8?K<*wc;4d3L*-!|jOg`<zy z6Xh?QVmTsQl6X&fJF7}7pX;^H?p%ldJ9fF%ZN6~!>RP9d+jp9BOfwaAX<S)TAAHj4 zRpZ(-=CeB{ZuZ#V_3xarT)m}>Yvc^UGz%ATgHW?ep|_8jX}$a*__}Omj9Qw=O=Fu& zYWgo;GVadQ4S%foY5)FbtNb1%w72Z<-;rWH&1`Y~(Uk(pe|#>p>|XBf$lS#CB$PQU zJ<TASDaxRH&8OfWbqNn%+el3nKAV1K`Hf3%`?^%jCu&T{@Obn|@x8}t=PB&cpDg0i zW-ki4xZ#rIE`F~ok0vjB{en;V=aIiBf~Nn8XO`Af;=Fh^zg+E&|Ccuc+MgHf>W@>b z%1gV*=b9XlwctwEf-Cp7$L33!<mOLzNMM$!k6dQw;ovK<>p8FI%Vi-gGub*H=9s#P zh2{DLpGtnScbVAiuDp<gjTH~-{G5^}{QbMH=3bdCTOVioOtXbKe1ZPuH@ePDE?7Bd z)r<1b`I8&udwpkl8_4E+3ugMYmQ_ceSl9b5?n3h_f2|d5CjL8a9+ld^E>N^Iqx4CK z&63ntjP+kluDzMLZr=mLq@O~QZO*=HbrsNeS!)+-+admGHcRDsy<Y+bd*mtv3{pIe zS$G5t-bmgNFyKfo-ji(hC80NfE9<}GVZ|#tP5Qda^kr3lDivm=ZaaI@>CDW%WyNY+ zB(k&YKGhs}@pExRPs!P}r;Vjo`oH4dzNhnr({f3XF8(d`W@(Eeziqqx=g!sg>P4<H zk6-@fS$WNtvyG>$ZT{Tr;=Oari_=dA9gO&S>y=hPTUkL{g|q7v<1aEY8%iJDj!^nx zCO7j~#MU^0+V&qeZ&V(-;SfC4qp$j;$ses3lQLiEd(1ZYAN$?EeTw;H%|9n5s!WUP zxX=>3M#|(>RJyr_U_iZ+w9?0e*<~e%tQ3E$^F`jxUwQ1D^scq_Uc45C91+#l*OL5Y z_PzOkL{Y)3#AV~#?~|9f?}_O+D7b!)17FaD_qxvi=kHzr&`;X)+COdEb9Z(cIEx%v z{&vqd%LHe$=W6p}j^Et-J;lh<XiKM=Q<AFS;dgic|0~<B(&ON?X+n$FmHIix$MPIr zzFJlFYVqpTvAl<r<Bq0>db#h3>3d#sgj=`ZWv$iIe{+8L-L(i4Tepbw?1x<ks-Cy9 zEZq0m=^V#Aai@00kZBT5x3`DL2T$&^*ATvCzVcIS&BiI~Smvo{*?C4tbhI|Edy$lw zP}x%5+1i-8(XwKa#xqZ)3o*wIyGq2=r!aMFaOSXyVF~+S&~{>ST92YZn@8jh!#0iH zvj-2mR_xH=k9@pZ{DpV(ol{-4K}XjrA7mCP_}R;@;&u4clC7NU-oN5iTJWCfi;irq zPu~&2&r7#N=bt{fu(ogg6rL@-cZ*F<9sO~7!eQ5f&|synR}V_tE}d*XW7qL3whE#T zR<hN1)_NR1{gmsR=0O$x)tc{0#hxqwQCB{)lfy;NW!;h!PnU1HnZesGYY`GxbXwQa z^g~Cw>-o~|!@PP6*0wT>-Yh-kcC2Js;BC*RA64cr>VKit@Syq6k?G}IriNF4He~F` zGwhojT{iF7<Wuh~BmePV=h*5V^!6psnjgnM{*Xv|E?8ett8-<dz)!)S-3@<cb1HRw z=-15j@l0RbP%W@&FK@m5M7OrI8M_%b$^2>LnehG8i{D2~p7DsW?6+AFbJ*Hb=6~$h z{D<==dDMT{e(&vrIe&jP&sx9lWAlVAKMiM>!j<cO{PO20<S2aFx}$StpX%F-^{d1c z*A)n;mrX3$-ri`mss5^b*Xx&sd_ulgHCI;jCbZl><}P=2<6qvnCN3K`DN7i?C@B41 z<J&I#KXq&In}eUdeg@7Aoaw#hjPl_tm4Rpan(`JLRd{|*Zb_~{s?E2kfLq7T<l4Rz zc*m;O?{mNB_~X#h^ryi(tL&{p<EKx0({I0I{okN3g@-n=sa9^(vzO|x|7wx=t!Ngf zZDAkhqlv3U`eS&l=FW?8@7{ZE^5V@mBsZz5iq6zrc7#)7W_I0$lti_NV@*5<)fZ*> zou1mc^31-K%H8t6f|gxbw(RSc--=cf`bFmYXnfvR5q0tH8K<;mh3hY_3>ALrW~02Y zx<4u7hqJ8Vjp~rM`6;I!c+LH&_Iy!&{J!1KCv8!Yc_{F(p!rnYZaaxBn->~|_Wb!h zXZ~8zyRi{-`W+&37CgCA^vUqi9OLxa8SBoUw+?S!pCJ%i{L`aXz0l;@@0&|DB|Kbp z-SxY8s#Ue`k-rc9<YNmDdZg~XxbE}Btzo-E+ZMdB{Jv+G`;!hE7BSupypwgmow;zl zCiqr;r9t(gA67~_N;yAI>%03{_N+WIN1WwKQn6RC?!236Cr;EHm*@GQvs@tkX<3)~ zL8+bz>zL0MY`e<7T%dD${JKY)d7?6tmAuSlP0FN9*67bYWb=Bb=%vQL_YC&=i+=v? zkg(ZmpGD?2nMGwYoA*wLFS~Vw;r_4Y#WDIP-adGD`EC8#&AoL}-(+{zM7&-r(71Nb zM6K?llImt>Txy=LzqzJ7>LrK!;)|BLjRh?0_$4|M4}JXXH0zU-;4zU*pL!3!e^2LZ zIQa3hVniV~-)6y{(0damA1(ZBYC7+}q-5JkCf=iI%WnUjP#mu1CGB<F>((|E-xJe1 z3Yc5gE_$V$t9K~;VLh*u+5U~57t1)4MVAUL{U~`u{S&|Sf%BT19ltnN-j2VwE%ofg zb)|nkpOj`&;7ZXucfZ-H^ZlQnX0HQo1>BnV_|IDJTYAs=pK?8Ybu%x<qK9>7VMnq? z{>i&LN+WN-J+?4oVTSE-mrtJ`KQt?PTVTZ{#&vD8!D;o#+Y4G3wJw@^rvC3I&T02Q zJ1smFxnhs(-~Me$x88hC^51_peUWx>RpF=KyANJ3&(Ht2`r#zDc(&<IZ0~tzhyQL_ zUNo0q<>XVV+GBwZf?vag#1(Sa)vS#U*?(f`taGk2U1st)INqM|w!xvUK;|QVYA%1| zWs%eSmj0SCtK^U4%nSQGr@nvGy-p<0t6pLH&QhP4$&M^8BA4deIrQO5!GdTBZSy_T zkHnTs_vQ(!>iImn^OaGpknz&9Q{rCIUeUKMJ+rKN_+Z=H4-3~UT%$U1tFPtbNv%$8 zPSbWx_*rx^J4j4<VvkU(km#EUKU+?{pSUn)VT@|=-fy?R-ck%<Y&W`n?n%I%zQ8*b z*S8dZs$VhV55xU3{;du=uS{+gsR!`=dCy^4(C+kv!T-&(bDwS>tgo-Cw%(y8UlsoU zYPIo?A31H-m+W$`t*_c!vV_6^%QIcpT?>!zNEI>ND>BROPf2m<_ix{4_or0+{#{-4 z^=04n%sY4YO4scD`)cn@0k&JrJ8yEld0Vr_KwyVm!jok+^?R%2p8dLh(cJ1+TxVgZ z<E)PMFx~tkkJp%`g{%*$JZ&_2)vi<KwUyHoE;6U@E${uc;oiGrnJbS~Kd{+amb7?} zvEP;pDYCj#kCd^k<5&48^~eAH-}drCn`a4~FHHS@E4{fJuf%Y-!st7jj+tfeJ5}Rz zTuf?bMVGW5%6EJEQ|fH}42!*TuD7H9O`p71Fv8^e@?#OT0WWW?O|kRWs=D6$@YaKk z9dS;Y#bVrSqSi6nX0DW4W{|Q!<J;@$2VyN8&xX(YduPewo;#~K{9U7V8mwy%Qs!n8 zoMaj#Q59qHH$FRMr`@xfGfRRWvzPw*m&d24!f3F1{qDow`8R%kxKVLM)v#XQOy&BK z!i`_|Ki~Xy|D0flY-YA-%emHJZ_4YwZhrD*Ln?FW%2?s)rn{%tRy%(`=Co<L@xQ;q zf0wvfxUAyW7J72E!`k=x!9AL5UBtJ2ek1Do?aq~0`M$})s_R`J?NOS4`fHW%1D)UL z)71a)KB!8JDC4~PsOaka875hKwtkq^vA(|HZMxo1)9uWLkDtf?Y?Zv$`D2f9k@=4b z^?%Qtlv{NL;}tT*Z^yXZcMsvyc(O{*^p;-m%C;Dm)2;`P_-0>ND_GxOW%ldxtUm2s z^S<<X_Utft)YY-W$I5J~``zC49R0iIFueJ>P|PjVT9tG0Dy6D^iO^g(b_pR7GnEf{ zrVlsP$4|KYo?F6zL1W_Uj(hecVq8n_eEDl_X!Cn>_Rg!K{{nQ*-}_(quxh9Cqm%A$ zZZa=RI^DTFboO5-QSYnM{_NAS5)+@vZ7jDiU};B2l8d@@Rk4m%(UXgwo_8YNt=P>N zw$e6ghm4fuGC$wW={?-`zu(^7&G<4lo`0Rc*D;m-{Y>?po{Hyga3{?^la)1XW9{bI z^TV^#7<uwS#Ejp?R5jX)UpUqDUdqse^PSH*o8b3<7fe2H`d;oFui^TMf=~I^dFT2B zBsW=UX7=TK$KJoTb8nPP<+dLm*R9nvjbNJ6Y0Z&*$l7MV`!U7G7gue`&gHBA_arZM z?~X$pYpOnYpLUq`yFOepHh-?<2Y=D8Ng)r9s$~BU&pt9^RZreOzh?f8@<uWHy#)?* zL}_p*P7IlMH|Fm?uhi?_$Ku5<O*zM3?c1ktjPqt^<kC+Mvy%3f@yua5v*2o50E<MD zOI3wROiRx4-<GBsrd8K%9p*@dPMQBu>%yXxI|2u7W6D0fSe+wN`RaLnl=2EK)+C-) zoU1rjd7jkmI`LrPx&`YNcsklT+B(jjbm+_J7j<j%*%q%_;OS`UXzJKK>G~J%m$eIF zN^Bi%J)32-bsq-?1_TDptddL?xiVRaU9-tLp;9R3?xTBpUU8FCE4yQy^1PmFi4`o} zYP_d*^#)@(6S0bi%ih<&oPF4l-Ez-z_TF3u=L@X%{``8|=h)3%wDaZB6{78G>y4dL zFR#vF)F}8jwbxfX^>M#v`c$*`OHSU73!8Rzt&!gYp4AgoSBb0&nfE91+KHSa(I-yL zm6DX)v-onS=kZ4}Jr+MBjo22Qbz*g%Jyq%Og|vlUPtVAwZT330NbrH3nqd81uLB>G zv;~=`oBBB|O5x#RYt8j&IK1prra%^d7Jt@xyKl$6A1?m2;Mam*Hr}-Xr6BmNx8?_* zewIL%Kvuw{6YN_-P<`UxkEgl=YC&+G?9T<SKu{$}_J--o71k@P+b_=jYLy=%A0i(z zKb_t7sV!e&Q0=Z~i|a3c%koiIi|s1=boG;5zlNms^a%0r9Jbskv-D1dWkp#<i}?t& zpK^5w{kPX_xqs@<6}=$1Gc)<*6yB1(hGyd0SH7ISr7NT7ZZNsgp-f<_qkuC6=D#V( z3clv{yCVez&j(4n7`hm`Y>W+2>=KR7HLwmd=}YLW*JP4py1Dr(n<I}SkK>yT2cKY_ z-_u?tXI=Wpp6c{lEp%VE{-XI|7Oh&Zuj+Rcb`;Ls#3^eEHVI^!q07dAvIj3MS`1q@ zK7Y*{6F24CCv&ju#`KrGe~kAj9<S8BoVI`dRc5|#zdTay)Bji+_fMYFe>iw&@vWyR zYw8WZ|Jr33BfV!C|EZYG+wK1)=6cxNoVj9E|4nv_Z$`JCq<QPeF7~~uF0TI8@A|@R zKfKS0pP8HT;MW1cIpR;MF8u%U?CkB?=Bxspd9iL2E%tcmsF>BBN^IGaR-bXqWs_Ui zG55B;<?`%FB};CU9MTW`^X1*$%MB*RYrZ=A?tK0{x!(VX{3)lc+Z@Vb5A6CHw!NM= zW3A5D`6b&eTaNvkz`R-9W!fz{cTkCU?&!v>o0HtsL!OH-JeB0Le|pH>Wy?}lFMj{- zMUgDmw8nr9cUqXr5Ad^|F4c%o5;-8QbTF`m=|jvHXUEuAT^AJ$9-P%x`F5W3tNr7S z1NW!Q(c^lw`%h=Rm~5y1+J5t!KmNKTC3Ym*B_2AGGI9Dhjde+J(uLJoHg&<dr!FR? z%&?lz@%y?hgXYvTYcHzHPX1$P_pkO`s{erwqi015J*S>AIV?9_)hV_^AaU6YA@%;( zi=VUgNN86sc1&IRK>q~u<!|jf?KXuvt0!04&;PLF+;)leNi4Hwq}4YpX40vNDU1nU zR%g(CILBS}N!{-^yO{l$YEI8e4LcYsFA>tBv{+qJXu8O!?zH`NGlSD?n1v*@qRiI1 z$DHErEu7w^nt8@~jgM&cmtNPhSz!yiXD;erx>0af>oLu@rn5e6;Oz*KTg&Ht%r<Y% z>Z|AHKh=+apcU3TCuEiS`TLve9ri0KtEE3S|G;3vdw*f+Ey+1%0bB`Qjh_Dv!+m$D zaV^d-`Lg#+VRJs{3h=j_#rszATYj~@Q~xRd*X+sV(w*mWLpPs0FF!-Ubw}gf*J1yy zR!^|!=Gy+M=z-5%#*^WVimAz-y*|7fEsGx|K5d)K(&f9*w!*U5Z}-|V_qM}x>Nl); z&bo4c^Pxq#J?s8y-(s78>TcX~s}pR$?`uZbdPJR`(*M@CbH3T!b3FT^Uq6ex!{e60 z`;6^0mv77lHom<4`u(c;`5est@!vX+&UpT$?8E)}_wMnnD}Se-x}PEP=KfQD9l92= zh33(1^YhldyZ5io`CgsM`}=i&etdhz`~3Ue`gpb{(|Gd!{rdLp`|R({vv<n`TBzpU z)n^W>`NAsBxO8gymfpyt&G+oT*njEn{r^Ma@M_U0<277=CG;7?Ong6;Ju6%FXMy_s zZEV_^h1@&l9`w1U+kW<%_??qMrAlF2y>goG1TVUiJ>~x?^O?H8nrC&nExWR53g^}v zzrQIjwfcRpe)HGU;+8BLvdd(<-d*}vE$`#{Eh$WM>&fIWPLbjr;kjp4#F_Oa1g+d~ zB_Zgf?4cz=j_O^WOOw5{3O~17s-Dr@`98sKrA5urIYG02^;<42(!P7J*ehbkH1+eF zwc~v@R-DzfkTX$uCTA?tdEjfKih7sjO#hX6@3p1Yw%ysetEoO$aSrpscU4zk|E=2n zZf$PU)o<>a3ymJ@$rOBY+AFFSKS@B>{GV9*$3r&TWWtUtcYV3eqoHb{(L$r8D|{XW zm}LoP31<a!-BJ<h>{HEKR8e=u%4_K@E3ta}=Zk9no{4qKyqkXH&n_$N|5wd;&N`X8 znEEVfn|{SQ%vU^yS68jDeyT5f;TMxfYAp5hW**z?wmkF@yP3{|6`xF=)XwYwz~8R< zW5uSgeZQ|7tbM+^u<Vvx%-pGsy!O)H>z6A>2h=&tIX(3mi?3V1`e{in7X!63Keeu0 zzxsZ;&}ZM5dRn%(%PQC0;M!R*JN{aS;p1mBzq3e$zA{z1?y)&adG)-oO*dZEmr8}l z{3x$o{ls+PoBJyRy0jX!7~EN#=9Y!)m(5;#FEhR3?)k$xOP9RO&dq)3Bv!n`<me-b z(nBi(B@NXr9i|-qSho4z+r)M?h8?02qP}%Xt5jbW`*yF;%rl!cclDZIKhqcAT=Z8b zX6?FTD?5BH=Q4y&Y0h)*yu-#aop~3};{5uql|4CGM#~+;mk7?@zUbAPxw~)sGxOvN zET44EaA9`GI>klhVk{r5MK9RuSiV_Q-N8`o(GXcISbt$+Zo&Tx*21gKFTWDve$G+7 zguh>E`G!)aS&9x9p1pnl*32^R4O6=gr=GjXQ#%#e#@lN;TwVwid)YLWUU<3c`l@n& z#)X#`*6aU0)3j`X^{xkJ?B<p4=R06E*W*oPv6kM62kZ@kQ$Uch*(m0R&~(;mJ@OfH z7i|_*#w2skIxaNRy+Bg*{@WLz$_<2L3>d|B{$5w8FFx(&X-QML9|Fq@Hcd5`lm1-Y z>(!+i*05J!b5@#7P~BOJupNrqrV8A)k%;!H54#|_&8>IK2OjBF2Le|(ob<7j3-|7F zi<r#Ay=YO^BxMunn6nCU;fJf9FjaH#Y<wHNs(+>Darr5nZ)b=6)Z16FW*@WCnTLPa zY&N$gh*~9{3%A+4ZTc?82bRCuH|%Imzt+c4c2U?x=Om~1hYBgDperqtE1OQlZLwh8 zZc$;QyT5+r<BujTi&k*T>kA!Rz3KSmjH9z`#a1Z&Q~D>z|L@RK4mm4l?~Z8#x{6VU zl%kv}ECp@i+ZIgaix$|@&?L5psl>*s&Hbdnu|C#g-z?N_%bWeu_4qeq$N5RMD^$|6 zFGxE}c$*})7~U{A_Q&Yt#Sh7cHqOjEbAjKxU7jOBm1)E4`h9nHXE8GwboaRwbSg}{ zY4{>+_024^eu0~Re3%+?ZU=pxvwG&Mw_%H;*_ZtOF6<fO!5{weV-I(g*aVg`{_{*1 zpH9$oT{rbao=(j*o7eG;&AQWBv!Z$;nsxvG;yEuBD;czx=d-F8Tg(~Lt`D76vOl*} zvI%TGQNQ9>y}-xSp)2br{Z|&Ad~VArpN*0nAD*$R*Y8V+cu;$1{gVX&dD*WHT+KPG zdPnKR(W^NeUebRLg}!GM+;?Hxb%wTer*q#c^cCJY&Sxey_wt@M3AYx-%2{jFRMlzS z`uaM(EA_I~gIAL$AAI}v{dUW9_Q462)y{J^-|@ef(>rI5``662tQV(K|2oxI+}d6H z`Q_gS&-(WK|MIc#3;UAklkc8rDz2CO<Nv;@;On>A_p&>G{k{8s`;+y}tF6C%`nayV z`un$Myf6Rj8~5idc)qXxa<#oe{=I*t1&8l{nzL)tPh0h$d7GvlnRe*m`V}(@YwV8a z^=bJ#n{L{)%JVbtx&w=I7^d(Zos-jXENh8cz1fbg4dtv_<#A!prLDKLtQXssWMel^ z{<d7{V$%uH4Ii?SRwa8@v(%(<e_!F<w{wSk?~5V>u18b%KHSO7vhK?qSDg%<?#&t> z@>4QiEMCyh<kb^feq?g|nk!xhrf>QF<+{k>{dN&6OMl27n16!njk)J%WA0mSc^rE` zp4$F^DZ#RS=FZq2wu)DEVF|K#6?20v0up5JUVQhSDLi1!;@jo_W-@u-v9hxG)A_tO z;bhE5i+0uGgAL89#hho<Wd0?clsV-#BPZcxOrDeA3X=jAR_|wr!nxnCvG)5`<^6C) z$#(tg)@Ki``XY9|IriUITci0t4MNX9+}&&RNoR=;C*N+jw)&Ny|D8Ldt1G^L(eCsE zsZwJ83vV}s&UaX^8|56sx!%A@!&$>RP2=>0Ra16+{%*N{N5}m(b<M{`A*-^FxyWit z-FwyJ(BdE>@pkUFS<UAhIMjHqofQdwq>|^lF=0okLc^zzx22CLi#9xYX8An-;LEQa zmGZ|zl3wwKZ~R!o{fl=(J<GQlf7*;5oc@*CHY@9<#B~L`pDZdb9dBQLUA6so!`b5H zvp4Ow`dYRB-nwe-o!dXH<#c{<h*AA~sh+ZcyvEAgQHx%jUM{spYiGf_XPW9?8U0>; zuD$Zb@ln8Xe?gURlVqPcoz+r2ZvSbSWpY$=?c>R?dOYHQ<oQWljvwj|aV(6`uKKr! z>4v^(+|~7(#@=tlH!WQySGRUk*pvcGODW^SH`Zm$dh+(ao6O4-Q$F1Baad6`L7dfK z*Nd6VS5$f#U+Z2yer3sH{!=aAd{@<o$NR{=EB*E9Wu#ZFOOeQ`0@HWbW`B*Vay&FE zfN^<C_i^r|jhsChPoKQ{b5)(q<68Y{bFQm#vC@lwPBEGk*Xn4TUcdfomK?(j<A`?i zRe!&-FOD-UdA&NfW^Qze`qQ<JyRV;HwcK^xl>V20YYttVJTW)p+I9BBf3oUiFU#xK zp9uOc`v2;8Mnj!k*$Lmoj<YL$n67^0a(t?9dRM09y4;koKdVkJd!C?LFmYqf=hu6a zR@N_Ge`aF&H_IIdWVU*QtZvV^S11q^@6J(m(z5nW)&C_Q`&a#aoBcE8-^(|bHg5RZ zv0?VXFB=zpDQy1IEfn?GJ2hpsy~u2#-?Os>eXnW;M(jA7Bx>dq{`=RGLknlVU`tGR z>r&Xl{={YDiL=Yg->*7icBd}cUw%W*(RtC2Dqk_z->IKe6I>Ti<iGM=&5Td=ovn=7 zM|C~9d7rMUx!W3^@gliw+E2~$+Ju0IO9V9@cdGmL?J>wx5$$(mPMYf3_K49_Xj#`O zfx{BN&u=;UuuiJS?CMGLZ_m9aik;V;&D(f8vnZ0q&Tpmic8wD+Hx*gsIA33LLz(x9 z=eFsygTJL*+Gv|ze|O!Pd7(8{7W}L1o1_0HG|uu%n=c)&<RoUW=I2(G7{)snkA%73 zS6%*Z=ZiBO8vPa9Y)k(>TkW=4H|zO@6YC^z9&pv#C$fTnYU>h7;geFDx5An`_H^Fz zwtp;kDCR)sqAh3FzpzR)STubH&yKpQ6W9NGsSt4Q`SnL@Vi|U&SSWw3mt@*?&hDa8 z^>&SK)_2R+&t0maHuuj7gEKbLJ}PsUZ(-PVNb$z(>eC00Fa=F~T`zXUXU+M^>>29C zr)^f&P1}D(sl_$#^x+sTq053|3`s%?Dh}7~Oq5{|ddE@z*!xn2s&D?n4<Ea>7t~bV ziDX&l=D6&n<gffyks`4NZ~Qq^;P#@Pt7@|T1DlJYHd7izw(dPP%~XG-e1*<DFaLF? zn@jkQPSM}|N-t<*y8fS8EkO-Gze)r#Xzt&4<d2oaBt66ZeU74Rq1FC!J^@=<b{(1# zf8KUoR#Kg9x#7V-RnI<`wCryES$byuV(l4gyB2A`@ZHz&*(Ll#027nW{x~c94-qy~ zkJU&1eY0zNpP_bc+SS-4N$2B!m~t+Cu;S0vB|!l^=4Nqqw%>YHZVFE=GWu1g)Oq<| zyPEdemM@KZ>W&laBu@KUZPHe%5ln2@^580GN^Zi>%GX6H3ogA~p8av>Mo$g-gjYU# z9m}tq7M;JBWV}nkeDC3yp2p|1yWgzlN!eL{)vfJ)J&SYs#4df-^B+SuscWUiyE@GM zwqxo`##5_R_IdrXijHDu>ylwf_t~)~{7b9BZPP{iKlSI|+xz)UwWR6nz%ahEe9tm^ zGtAN#pQ)>qnLedm)hYeU@^5kOKmLhSUG=<X_+=5JK+uM}El(|Fb-4O&7g|3%vP++j zhq?de<#YQ^t4q`yc39kFJEr9s{4UFI<)mX@+EXrZ=1+T_bL{k2`%3@s%bTN~sIFYo zZ*t?rGb53Ck6h+1Jh<WV@%37jt}=CJO>RG(zPa|@pR;y>s{4PrPdLs{`NrVPjJ{f* zvVYIyf0_pIgcUug?X=w{SjZYXjeA<!|GOKcpLML7%qsX>cGbEYS60=3RC{22ILP&Q zLFz&2F759jk9qfrMt>3BZ=Q2|hLH0XW_97<nYGHIsU||_XMA|C-|^v1m%wMyd)^F> z_<p>p>+DIj6!?7O%zeWGUFK%CLo-x2MrC9?TCc6)d|26d<C2Nj+B6U3cSI|!@pb*i zZ+=63V)@gJmi~Xf&O0K{r#!_gslGPph|e~|!woMx-b&mu*phg{`i2?L;^huadmZnb z(O!2<=4sl!W~+l|ZC<?bNt#`&yrZ*uw#ClKyG^qh<?l`BP&wV$w(^ji)#^r;>gE?~ z#KQTLDp+4jGY4|8DXnbEi?h;{DEVgayJy}#wTNjP8W*o}H`<l_VB-A7cJZP1I<q77 zML%4&SY76+=004*RZ?<n{`&6pJ3l`OlviFjve<}~Yx=T?Z)gR4O_AuLFKY^Gs?@~T zM0rKuMuv4S*JPTSdHMXmvxU#E{XL-Elk!kg@|%domPv1~>dJl;Tc;uOv@t~|!D1H^ z+Y>_@x%7ex?(b$BCa4zQt7rVkTI04~XWAy2g36q2?<ICjYcxIlb`{9~TZ~#a8(H@$ zJ=Uv=EW0?dT-C^;f=^QW;HK#b0d73J5>f_FWD}U%3WF66-c!hXAR3<BSHzsZ`h}GF zhrT>!e)GJ7$7=eMqYI=TF#q19kYc&OAoPs0x#@(2e1W@H9=&pWv+Lf3`ry(BMVc=j zES+5GXwGkZ?#1I=rPRm(p}96T6@UH<OzJy-mD{r7&E<KEjel3Xk}!RFbCyWiwj1d` z`u(PUNHBbL>2s;(kA#oY!uLLXY#OltgHPcxA+GrSeLv<EJ^8<L$HJP(Nz$htJE=dB zKDAx4!+gqgjfE1;_q`tqSgNv4y#B_de!JP!=pEX@4`OFN3oD!SIop=^=ABzjZgR~} zK33g*BRqNT{-5rDN;f+uefT2zJ~}D+9Y@)-X)DDObnnjauv&0H_0-3BKCzUu3LUJ@ z?F#>d#O^45i2i33`M1d7|HhjilOIG`O}qJDH6cuO+eg=6;rdv|nNsh9ZyeLPbZyHv zttf%|tz22zX4+9vx6?HymN)30dnW01?*1fG#)`ZL;(?QXihSJ}DB^CzvvA%?<A5^W zT&Y_oPh#ytZ0=t;s8oIZuTZD2Sz8w<?PUZp<^{XmJ>C`_!C*1#h|O=ez9%;%^89R1 z`c%yhKAX1pa+Q=#k@16d#~K|E_kT}4^sCl!Z^fVbo6>ugCs=!Talf3dq#)}5Ao=%F z8*UNS5QR++l9o#oZp;ijr*X?vm+ipQ*RziK&1c@sJ1>4${x11khl_JBU1F%U6tHD} z;kMrd6s!IF#loeNcCMB=xJYkhp6eV{{iW|W75N_W-&MuOwMuB!rQkL#ui3MXFZcZ? zW1=OZ74jye{?xl`JZF2a@#L+Etz)(J$Zj+Fy1J$P)4_~uapHTEgP4@gH*ZY&p7{Q* z#;wflZAHQjTar~d4BFntb2izqdEPO5eA#j*L*Mu5Q;k+`I=*hxii9s|auWX@EK6zo zTGV=X`jM)gDc&chFFz1?z-sy7*_H_#WlpU1%;3v=xkK!7s;*wW^rAVZ9=-Hz`Ofe6 zXuGnYgbWA!GA8fejIp;%Qq#6yc<wGbZ81j?_l9*fl?Q$-TsSvwgB#xx<*GUEk1opk z-rwG^O!r0KBI{Wdua*|NGgo;vO#ah6jiYh${KeUuTOD05HgoZ47%XtO_tb%vO(fD! zf*H)OD4T3`rf9J<*TVX9b>)+-)_AiWJEwAPZ9dEGhJ>TCYN}qdr)cnAn9h7LxHa#K z2Q%k4Ho;zn$|a4l-3L<rFUtC=U+?nM{I<-QIl!)bi;PA*pT&8G?H84KRc=Thd1im~ zYFk8KRzb3re1z=6>rJsQ1N!GJcV8I$vZn0CixAG}OAF0ZFD#odtwdV0{@#LlCGG;r z$-%prPixfh{x<h=Y$~m}+^)m=?`HA0)%?+0Yb5=C{X69q+#*^l8Q58IE4ys=SDl{| zj6A0q&CWc1>ceH;oeEvcJio{nyRM!nm|%9&^pcMF>?Ysht!%}Ilchz)gl2ECkLQiw zy6VZJraO1*q#9N{?>V^im7w`F-`sk|hqDXh7<AJfcPGBTd)%>CX9{a_ODR*(iN(L3 zE$oqB-eYVYx>coiUFOtQlO)IYOT6j=mu<eDqL_KiMX2!YLe)C`>aDKD9zWjS+K_CX zxP1BA)z2ceUfs<o@#9~3ulh;XsipU3CEY|@o?>WV_x17(iEGwp>&+MfpC8mRzj}54 z%+`6e)6PpTjAnE?02&?Cvx|Lb5LzEDbZ)9i+zq88N3ZyBc=EnE<ob^Fp_bS*hnoR= zrB>P>ZMKx%T6(wH<U5C6>0!0v?!J?@vYKziKY4Vf&VF^`+BBEtZ+h#4E-Q4oiX58O zb@N0_hVSIN(}iAMc0ao0`IGvKA-P_DG5h9T2@CmL%inIZDC$T;{j7d1Y5Ce<pVXAi zD>ctN(r&SJdp=t+I4knZB>^>^5JTN<EsGQ;p7g&|@pzZ+{HwQLTBt1deeSsQwoIY; z${U;YJ8n<RGf~{cBKJ@B#>W%dez(dTy1YW}uzcSCAZk@YSDZ`AnfATMLN`yGSZ|P) z*dN**z3kMfj}|IDDUR_v5{)N!Cve`qce(NKnyQmiwAbq??&K7|dAYV;^tP?+JTw3H zmphi94U4T<vVd=5in7M}d4VfbI(%i?R_SEOhCcZ<Uw`)36?apnFFm?2=dQ(*#Vb0~ zZd&xOaMQSVNbIfC`nwC}+|OE8ZFB5!!r2)o>PzF-ee32>cRBRpY4l%3MYi3d!uJ%G zaWoxK{k>_@lsOZZe4V_vEV<&UyXFl|))^XI{+?x>i=5vFBrf6*cAcSd$VHHY^QcQ; z;fsSVf@)m{)VuyzF67`n8WXT6^3;WCTMx`!V6eI4<{6#z&YeDIQti~I&piD~{q=OQ z!r+jHV*icm=WhA1;pR)zIm~J^1bDnTc6Eomxmo;8-Isg0CM&zug@&LF+eN<YDvI|D z=PKgfaplXVt=UWgCUNXCZz5KNwSH{bWRbh^cFWE;x^})o%a^-NsabXO@|>zg*QO@? zC~EwpA!6^cw(oK5dELz!g-JY2N<s<=5+7ZkNGcR7DgA0Z+*zM>HuGa{?2HnziQCW2 zTP3o0Qh<rIW#_59#)okspZ63QtTB0WN$$9~(dF&OH-csx{`H-^$6vyKA=bIBfJy1w z&eM!}w~x>Kyx8cg4}<y>R>|3?7F#@i9iy=5mFN3Q4Kw3C9m|r`Zg8z*yxqBNrLXw6 zgLBW6bZ~~Hn{O`35DLz#KPJBXutLths~qCK^Mt2FScC|#2z9gT3q3u}#A@L$3-^5W zeyylaU00Siw?EZ1?qPo}Hu<n_IETgNtP~gViNCJOojM%$@tkPRZyP3)6>6;$4|l%2 z7Jc`hDMOOZ*ZJ)2zoz`{TaugfD!ljH)?m?@)0k)dHp{;iy1wQs)84@HjYjoTx~3eQ z`h5P|iN_K$UKefOqj_2=d#=gvl0*I+6XT0lRo|Z<&v?MaT`B+AAMx6xdTW#Om+~rV z9jZR9?zwL#$<nsybaQuXT~3kya>moECp?(b$5Xpz#%YfI!cxNeNAs8heeQ+j+sFsj z=d}OxQ~Sp^<<mBS*cs=4$X~lZN3J{UX#E_2t)jpF$$7z>jaG%s%bMt4q4~-4>*ha8 zz2Z(?{rt9EDt=Xsd}Pn*=S6e>7Jj<T`CF4^@=;;Ng>etBzx}jqyR=#Yw?prdQ=w`8 zPZ*1)CTImO?z5P3Ogo0TYqs3}zkU}@4&QWr#I8KU{!xpeO<c17eD%9QhYr1!n8vI8 zGs&r}K2xc(=h5Z`?2CU`$m|MtyFathlFRPk(@P<NrN=cj`W7B{j%457@OpW9S+>D3 z-PU9|`-M+Re3t4zE$jU-ecI<sC2>;cy5H=%a`g1fAC+2lWk=8V{dj3};OD;2rQdJ= zS^i_y4_}_H??>H_Za>0&Wb={aqx%&miTSD4Fs5if{p-K0USOx()eG8t_BTh={5v(h zW&fwI57*ah{GlCh`R~;9iF-e>Ch6B~yulrB@$HcK#JxNEi{?MEJ5k+NQ7HH5&$~Sj zYfk;_`ds@w@!aIO^~ZjiTZW%nBeX|s&h+v%qOF_lQv>A`J3o0YFcotAaqQ*9Ln|I` z5!vFBG<(_$Ax;a)Wi9`%)_)CnS6=lZKG*18>~x;=`I~YhJQjWWD1Nr??<D7Uc{|U| z+anU}q+WblWVbM9>YuC|cD|X`JP+1xF=V|LyX2Agk^M8X-8~(+A1v~%wT|ERK6lqm z^9(<8M~QoX%-!!To%2~lyv}_I`@t7Mm%1A^CZAH9A=Z1{+G<(Mly&i^j-JS^-`4h4 zfzR`}`1?cQZ&(Wh%o6lD4%|5$C$Qkg)|=dqnEZFA`=nm<-(4=f_F!bTDaR#qImuZE zBeleGEY@uPzvt-P>YYEmc5VKyKd0vIE7SE1FaFF@|NErr(C2cW<aPbZcbE-qHoma` zGyQnwz7^HWg_<)0m#at?|4w>4H|?TT^6>@rU(IJ$RtVnHk~sFXB-5iS*zeiJ1NR;r zsXe1~S!i$nOk0^HZzj09IIf#KmD4uTVn(M`%~SW3Y5(Fhz6NeTo$CM3@dV!&IoWuf zox+cIu)JRC&);Sl`o=4Ze_y!zr4YmY@qg0a+OG~g#wYc9n_}tN2eLPUo;c@k;nd`n ziVgees9N9bvqG1tZl>-0o}QN>iejmU*57D*8Qm5B@%zzVy?&oF1y*PNc|Gaj8{?M+ z#~(&AG&EmsTzi!7YPWW5)AtugS$ntM=;p32eCq4d6Bl#gibm$a%*7Yqe7kHq@u~K) zVo+uD{0+ax;nTAxT{-{$#rH|8ZeJ0Ru6i=P^KaGdFox9ddeh8<(`)W#Twj0rV$}Ct zd+vyQwPX@nIrE*9NX{-N(QqT}v!z#8v)q62-YKr@K>c3PGuro09INxF;q=`6{K7)L z5TD;HIV(gG)7zY#6~9HW==9#0yYPX?PFu0P|C(LjWVf3w%ZQS_aq8UdofV%VIPC8o zJ5YJ}eqou(HJiEjo$Si$_osyAT#l@A)iU~htnKsp-4B0SMP0oUqwwvs*UtIjk|xro zRl$odW<QxCGBy6j`PDTQyw{VD)Wr$x*ivr4K5en7OxY#FFH3#@?}k(y|94viHT3kG z{<b;AR<qWljM+-U^SGUg<w}Ncik1N)!HV{x`*zlsc#FPSIf?!AhUN8M7J4@I-G5Ka zNjP8|B5|v_f!XzTlU58%h}VY$b!ib-SyXl0r}^5o)Gh3=>s)cY`Qx3FOAfhnRm4=( z6>8l|(AX1uG&VI*e?i-fKP3<6Nx8IGGaNelvDxow-g@DPt*`5scZBYK`D{j)ZQwcg z*?#G4)7`Gu&d{9Z`+DkR--|KN>)%U(<}wS;B^6Zv{;gYC?d+HJBynAT&eaR5u`@48 zSz7X+m45DA?&rbZFw;;t;LiKn|1TfQzT`h~H=gZD^83FHd!+B|+4-CMWvz~?d3T=4 zHubtq)8psdNLvs;$F|rsO)qby-7+=V`T(^p`9V*2|5#L;dGpwsM>nA(q4ocN+~Bmo z|7Ml~+ku7htFN8#xM<QDGvRJ#w4QwPyqa55Yg$g8e6p)~=9&yWS2OWFbyGS**M6FH zqS|Xpb#K?F6CY<pd|@{g?e$riYUmg7ruO&5pt-gA@?Q^c*m8ld@={QTh<WSjBOkz{ zWFL$gkM`VWEiM0@$t)ds|MZgg6V>bINB6pIzI;9?Ex0T@wEJ{Ut91FV{+&$K-KV?u zv<OPoKiW38<?zyuYW@S77rw1r!1H`wnB2wrZg-LnWv<sW-^6vUcumiJ-=~qQwdbdn z%0`Km-iVHP`*p>n&q9a(R4k7=6105PvKcmqZt=c#O4+@(OntTA?w=FSF7o*qd$Xd_ zetZ4N8Cp`+^Rnud`DZP>VJ8)Tly44OZsmoR+LVHRR`xfR(IrMpbCPx|O8T5&e=m1v z!m7Vj4xe`{x+wJIRk7@}v{{MXYI9e##R=72IpNfHV&Vp4MW&eRKc{5Bn54RVnt^G$ z=3VJ+xjx=2t-UAg67E)i!zl1J#ih3Xxlf*{QLg^n`lSaZZslI$lAN&pGw*wucZ+|A z=KME1YdmRbZYQJbujZw0CNue7-JGpx8*%u>xtg>os!WO3`c7U5nzbtVe9eL6<IPr@ zQ}=2+?6Olmw`QFP=gMj=@p_%f-+!<lUs}MdyfHs(OUd1b3-8?%oxtCn!^eN+c)jTD z>!si0_c*R;Iw4b9AGD8GVT)wb{PPjQg%&{@)R>s2&r%ImSkqadrWheSG33eyHKjX} zay-%LU#%)8?%ko_yQcHNtPTs0bK$zx_Eu{p1hSR*tW(!?HcXs%cov7m9HwaDL}_E4 z4u&HF-*VTqS@g7TRo>#WSL#r#K)%3gMFnsBFlUioW!1H94aeEj>fd@DVsGf~H`Q=` z%5!Z&1F!7{HdY2*_t<8pSHEV8aGU?QwPSLNVdA;)z|5w-`rQX_PpRnItKWU)w^6_L zqN?rrc6;UT+>xDe<%$jCzW;vfs?48!pI!dn`xmp4@Ui=Alja@re!VctWzo+wGuGc= zHgf%PYCHRq%}Ljtci#8h?y_q_y_fic*hcQa4KKN_Z?RaT`|h3_<B#7l`|M0hc^r2C z$nh)YUfnT$o?DUGY2UMZP0ZKWD1S3ub~AXIOWOCn>rGr6b>G)6J(^JKD6Fo!YvJx6 zJjZlSZA=ZcyYuf}y?KTIzi;2(=|8&0+pvc3?6MGv;JfkJ>Y?-eB6nZDUR(av{C`XR z^x$7Rc5<~&f2R^De*6~?`=<x5G7We)91HO|cIH@!PnSSNN64ALpGS`dZ!C@VnpNaE zxwYtWrNEsj-X9NL-*M3E+E0@Sza)1^u_mq4-#E!_(IUH?Q(qrW%qYI((z@H@=)Avn zGw#WitY5#*!P{}#pYrL;fBfNpp)~p7l3+W=1ust5cgR^R-<!65=GDMIIv$&*-1LbK zYnz`JF=6AYbq5~t9mvVL;;}j=hl{U&l|c92>ANj2=UlVa<>=IzxJOG;BBXN1-rDVV z#S#<N_|B=mVt$AB4o7p7%DZ!aTRnQOmU-uFzn)v_*R8)%v2w%GO$nb;a^HRvnK$o< zuk!j=MYR+Bn!nULXQod3w{N%2(dYI1{?%EX5L(l+3N(ejT4%0vR_Ld0qq%$8Zk8sR zhc!)HdzJ0s!j~rx-+aC<vTxJ0P3b4+o|@zl%QXKIZ?50%!^StJH_E5~H%mKQ@vQy# z?5p#YA6-AT;a;Yb#e-EkY4e|c?p^ao%2KJ}?59m<MLId%&-@B=_N-s<rmN$`!6m** zx8Kj(wr*DXO@T??`6_K9J7>H!>D;-dWoct_qFm0rN{0yLugm|0`>hKTn>&eMM^mhE zr^1IPp-Q#CR?PS^$7a?l-;<rEw@<#+m342@8O8qZ!Dct+KU;k2n0x(wkzmQ2IayrA zD?|>-EjC_%a<zhzkKl@=s2t9p8ry$+21~5n{O;w-$(1*5-`CC!-~4)8O_=^X#=fa1 zJ_KKqF{@ra^V@|R+G^bA<{RaR|0qu|H;6qo?=hd))D=6T8~!uptc=@HcGA$}j>*MB zr#0Z-BcIE=?yYCT?s8t@mX5AxZ^&v(`ZGtea>F6VR?A6?yJG%-PTeebxxZv)ghG^s z*|QFb^K;`K+dOic`DpEnX$v(k+}V~dbTZ#`{`$YWn*z>rUhC<MIiJp~CdfFCpDE|= z+!-IcKWMm|`SEG(zX=zLcDgFvQ*h&S6q-=0>g%QFd+AeHk7%+7<FT%fnkRL_&eUJ5 zTkdoCx!cJZO^($EI}R<l+nWC`kmnZj-Q%XOr!ACtFS;dp!@Q$kQZimgJ_*?CX0Un6 z(=P_=TPju0Xg{@kdnZ8g<`*TV6_3`YTWRjvoEJWAZk4ysxfa#*JFZ&a-dO&gKYx*S z`T1)d7ixMR9-WtAbkFM0?boMjEth`DuA93}#;5+y>dRpo>zS`F|G{)X|Lw{Rm6yAh z9*NI#*{FZSY|CT8GrFIPKX-S?&0~v-UuF6z#;G*%Ql!f}v)@}iCN5rh?#{`R-yRk& zu*rAXas6pRMCOg9wtf03%kuk^PlmbQU)%l5a6|s?MHcp2!P|xBOxPOTVELkJb%Su! z{a>Mri+O)1gw(%U`7I#$jb2#Ws|lYj+UKReo#+<9u`QZ)({i2DzOu*X&hP`xN1a%o z(3h2`z0K8~X@+X=E8*X_7gkOy>z>SfY4X9cn2cq5@;^@}HD468ejir(P)XqElXlBv zp93H5b=zY2q1e(eRyW)3aeYL6vER1{(PF!m8ye2fxP4_!kCte?dbMs<@F&~zlV7F( z^!~au#`b>Q;*U#DB|97H%|BiG?fA+3J^Gs`cz>NQ@+frQbo0G;H8^JfH$9|WKcS~^ zlGxJ(zbD(mGjrZbiQW0)l3wI%Jm*43{xn1HXBO>uxYPXS%NNg?B4+QDD}KzK{i*lQ z$I3mun-;JqFNSosb~e_})LNx?hL2O=hy@$#c9Uk6KU;3Ta(+?%dCS?U$~|c>H@T}E zKltHj{Y##Nx+9z}2MSvAnHDb+i4HV-G2!XI%#Z6fcbr}l=(>#D{#ZSzLv~$R#>Ro` zZAkWlpv7OcmF<J>uDXu7UErH)Y=_UztQYOa9#2^<to5g&!y)0{slti-izYl-FJt&q zyWRiasf|<i7EMXfmodD_?e72W(8MW7UA9h*WJWd9g*!{#RywbDt}$Mv$2q6|g~1{j zJ!_rvAMZJul_mRTh#Z);%%|drC|AIl0FGtZ{r}b`zh|GNULrn0eon)$s6e$%Y@w__ z1>Y%OInkk~GOx|`+=69K&hziQyTY7};m1Z1FQwMN!<o=AfT)UIch4(Ne%h`*y*K&A zTHbiha<RH|alB7o|2nvSd1p)S)B0a;Z?iT#&1YQue`oY$uI=}x`^By(o>}>t`)6+s zPfqB2k=QULAD@pF8@Am$s~`I5)YAh#n`8MbzMr+O|Lp(AOKVg8manOcwG8!NoaTM| z&5P^knvJjHOxODx>pJ>Q><aifzi5R>sL0Q2T+6+q*UWlYWU$7qrLg&|j_*!;zPOLf z^$QPFnuh5{UwYAE<WTSWD#+!(bjBRv-!H@-U%YlLv`yv7#f0FLbf%Q^=k**6w`i14 zICMfYQh?X5cT$`{>8;Gz(&*KWdmit~xFmhSrYkG#O6lRl-!$(eOR+p^y_;BGZ2X|7 z+_mJ}+^3(jrtuz~l>fQlM)mhXfxuu!*X??f?+MoT_MYg<6W+#JzV`WzyqBz(7kQ?L z+_{$NpL^-S%+?OQV+lV#9?dT1oy@y-(+0-dEKJYjwsEo?)yol{VLsJ0U%29KR-AeD z>VuDOPUZgE%Y0qkS?f~yjQKXc6?wgxXTBD;h%>aRE6&~W!hX-`hB?yu;n&xGu$PWs z)YA*@uPW3_NMCeyG<tTsh$H0qwI5e>Zr#-|T=swVnVPp9Z_Nz$+$gf)wtt$kPj$vC z_ceF*RH8SO?T+|kvF_H}H)lOhEeySs``mHz#<x|b9feog6n4C3b{D8=?TPbvI_*^F zt%;$A)7CH1bl-ATxm0Mm6Squu|8A%33;8GaKFa;h7I|v%stff@%iTPEpWe*;y=MBQ zv-L~g?syHF?md5Vetu@~sk4#OC)Me%+~w=LQGQdj<K}cvIk%=iMjQXzSBF2Iqc!R6 z|EY4uzrF51llpM`jCb6^Nio^NlS7R+N0;X<6}Z*1lY=k8?%uUO@7M2U6lFDKn{aGj zsBxgfTf6<AuP*nW|M~Q;m-UOM{O0=ojAiR=)5d()#VtYi>q=H{D_l8oQlijSBk@y@ ze8Tr0p01s%vL`vCyG{5+eC)nWLQC(?wOzD^t6t+<!Bo!I^Ny}My!l<E<}<f2MZ2fQ zixyOiZ8p@rc;sO3raiX*TbDP*h|hEOsyuqWu!wP*&7A%1HfB}qEAQXD8ETqxvz~4J zuZ`(Dst(=fw|nZmZt+Vtk?rdiukgQX6?XgAmB7WBbElQ$?UH`oJ?+uHjFtQoHcZuz z{<*B^>FKb&g=gB=R+T%Rc-vhjVsWwi((>KcEG@!XvX;m69lNvKvOaUQXF2D@O%IcN z{{J%AvSv@lsV?1LTAiD2O>b{|9I#biw#sDH)A}ggS)$h#YKgw}`&JtsaYaO3(X}T- z<ICp7-c#7^m)h;vx-TwjZRC+IF;zx6?I@9T;&$^E9J%EYyg2t*rT@bVO1X~J<}RUP zFN41YAJ%#^k)a}G;Tz`@;>j0TyLYX&{dcGH{Dt+JFPs}q(|!t^T(Rlk=hE=7Bi%vH zJaxMYlrQ+yAC`4E{Pq#M>5p9j+%}8f>@QA<{`FE$gY9bD<duz)m%pkmo0RITH$VF6 z<<t$+KX`wA(!?y0w7>p3`(3#cbDKW;OwYY~p?jA}<8p;^IjMBNw0oQ@Yq<{GF_dbZ z``~u_L4hqU27k1g8Vj_Wq&Jq^{^4qIRJ-W2n>A9t;$5)cC&PLPfvh=C8kUsYp7G3f z^~c@+cGqqE#2<h9;V-du3mvn}zHB_CIYHG|yNP>)Wl;A{2az9cu5&i`2=6J?KjyUE zWm1)%Uc)M8r>jio4$3$x^qP2FG8AQv_`o`A5}VqEO-s}>7XJRG-D36YPI^nvT9@Fr z&Gk0+hbOj0O<q4`(aVTpjrs%jiY3<9_`P1%o$r&ou*X81Rh^BAYh#OM1-sNPD}$VQ z+;?-@vj1H=nfOkMW39-hM*fwCt+S;REDEBTV?Npcd=atbMGA{#O#}D!gU_eEe(*W^ z5^s#O?CCd3#`9*|T&p}-5wzu;?a4i1>q^U)A8oz8`^27*RjEwsCi{Fvm#k^4|Jy#5 z^{$@H!3WD-r?abQ{Hoj*q%}2r<20r&i$}|%W~6_%P-6T)$FpSlqnz&nnTOM_uX_Gv z!Iq^mTBS@|>PoDRZFGNn<mYzl>kb(lsry8(?{jQA&Tf8wQ{>9eXLqd1K3*8{)?t@b z-^v`$t_y6w2Fya$Q>LuzV_vGeYnBzGmsfbb`tnC1+!3!_uBr&XpO^Ek;l#a*p-WE| zUdjH}%^k4oq|~&<GkHZcGGF`-`7POF>b$A8*ygt7z5u<@b?dS|cdz;5G2z!DwS5j% znkt9i2J-#R-Fr-GE`!XLSB^_MQkeTsKXM7}`Z7^o`^p*x2l=nZUj<)m@n5wtouxVW zl>tZKlK1sXcms}oGYA&g+3l5E8NG4lt&=>5j~lJ@Vd9v__f4kz#bl{7G3ASsUom_5 zmo?<erE|Wmy>#)_dja(fB^iTbrdzza=f~bud+~7DAv4EJhn15I8NEt`O_G*|{ouD? z^hi^a-xhmOeZl64*9&bW#IkMQ_(ZIkdNgXWgjwLi$i@b{`cIn^vZG8jxwkEwbv|Ol z)ToO|2gA6Y9co&ub7R&&#^e~!4POmPS4L>Al3?p9Oj)|(Qb?CpR3q=a{TKGv?GUX# z%<OM!<j?S4uVLE-=JLI>>mN@FQEm7T+nv6AUNnE`#?G1NXB4I$ouzao?xa|D(f8nW zJ61<+VXb}fX6aKQrPRaqs_S0PyHK|7N0@JiNK}_}&dw_yCk+f2bUU#z-g>t{=*+Jb zt{ld%7a#kzLbt_q*O%5e-vYZgHw30E{_k-?<J8o%j-g*R>J>+*yu6|0`Tg(iYrPfR zb+7sMPjY%7;v_2-cuG0o?)2q5nfNqyzsi)nKX?DJ`ko!P64<pWrpv^}2~DW?%R1sY zt3&$NTfvn@X{SP8-w9nX>G{v1tu<TQC;9uVcb~DqYigXm&yTL7tG-R%;5Jj+oLN<; z`CRd@Cz%I@r6$d=yCRz5^i(eKw$Z{b%{5vt&%O89YPDLk?XjGN+r}nKzKfsL&Ncby zoY=xF)6Q$;nyDVVKK?te(M}hy?=QX^uc&|5)_z%bUg1GCy@Jjub$SKn-Pg{^F0FrJ zo4EPgGPb7LtA)`|R`>q=WH03Cv&PrYhB4m0_SM^<&BdbX%qoHgD(;fomoGG*ow`rv z@+$kFyn1E#iyg=G-&O6?s8dm%b!TO@LAzaU*G(O1g$q?(8M4AR4N5a6iQZVau+u{O zpNL2ODS7dtN$y*e=P}lE{ZN{(8_}f7-ag-aUb9m0(x*=@O!5)kK3{2(--c~(c#l}l zKOwt2ppQkp!DXq+?2>|8i)7YkrB3YcG@U$qv!SY<aKTUUFAqbU`*XSzEWKMKp3BV) z-|<SY>7sQ-@uL1$H`=#5bF8pATV3I6dYFx|@5xQY>-9mBI{$@~&0Wo^c>Z6zm8LoO zWS{$#|1%=XCdwG<KjOW}y*yd+hkmBf-_+ZgPpe#?B>OgYTjVy~T9n7QHD$u#jcZp( z=l-}5cO_R=RWF%oN{a9H9qsSho5YGm9v!iI^@~@#=)+~!6Hmi_RmvW#Jel*U{Lh_9 zi!u!EE_&F~u`&34{W{h;8?u_Zbd>B%yz5P}{$w^CKd~V<dD9jr>(VLL7e1fSa-;I2 z*SZK>)))2B$w}v){LJdqUYZ}QcEYrDnsDOfg<40pI~OXPn(=AEynscCd(9nw7_im} za6gi{_2SL!`A2prc*h)Ys!SA4U%2P6Z|d}aJUUa3J5}mT5jQKb7nxbl@pSLzfVd@J z>=t}J<WwpD{mQ-O#btg5{F|5Pm$<Y%y<qGg`a&a@gT2Cb_QyqPw~jW&>f8VkXC^i# zh~IzYJ+<RiUFtOM7^S82x%V8dn7`_FgxD$Giy!|;dbezB@m}&}vx~!@$y|1NN#5I4 zjc1DqIO$llrl)P+BECdMKqjvKp7N(dO*&gPtPj@X&J^FSaI#{Vy;Sgu{AaI%R^D25 z<W{@+qL;1jN(95V1+6Y$u|i`(&*nz=8Ml@j2=-b`$v(?(%-YTQcIHa)-kG*@FJ9=& zlU2#tXSC?#x7ghwtoyEZWW0S8^-QH_qqKh48<#ti0>52e9`vv!Yfa+Gj_6aXe|6Vq ztyJcHCi)}D<k;gsRg-_RESE41c=+lC%ZXWujzu<s?du<ieq8o(*Yb!fw_>(l=?T#> zinx1MF=&^&{3(Nsx%_pDE@Z3>3!I-B6*n)^!dm9%v*;(Y#b)RU$9XQ>@9s4%Y*OEj zhr2#sGkV>$f90?HcTUf~xg+xF>{6*475mcuMP98B{WIN8Hu#3CNF;OUtw$C&bE-Ek zJ$%&Z=9$^@4F|99ZlBHfL+g*$q-g@S55r^{c58oHR$E@J|E2xO!P)N;I`m7buRmB- zU+yh;V741;QMcX6d%HE8R@beZQg%(G@#~jA40kVGP;a!{wuR&7zD||UjrTIQOFqzU zU>DN-8`DtB^s9bPV{5+1vNM{^iSP6JE*||o<D0M0hoxzfMRNNU_0E*W@A%I(LA?LZ zuZ1_{8yYQG4qJa%UGTX<=5Jrc)wi9p7k-src*XGBs(O=PdFZp9$(BBwLMwNJiqOur z_ttx!+a?;oR(d3?;Id#}wCTa@joWKgBL%#^y7fx7tdVNj_hME(i~5Xaou&^3#wEN* z)O8qcTikIh57?}HH0puj0m%o|4EOS`xXx>Prjhq;R<eP~)lJ()?LD6#VdCluwCtBn z-q<aC&f?@r-S~Z9W6YcNmR^{+t1UZYUF_k0-6+YmHqs@`^$H&zer4zP{nW9UfjOHY zW#-x-g}*$9&O6R<RE%-VuU~j&8dq^jlvZ=~`L!B3^^La=v^UGCw8X5c+q7WadX=v4 z53j0UUsv@k_3Oc}O4_HdR@P2aeZu$8<HO^|{zvaO^k!ZN|E>SHomnoXUSq?o53efz z9!+YJ=dZaU9dRK1w|@2G*vf*h3(pE2yt;Ff$Kj1S=}F#mHe2aOwN}kunaZ)W{?4Qz zmI<p1W{4P0n4wV1wpdiZ%~R01qw|7016LN8&-yD5ZZ1jeH{NWmaOK0+;vW0=IW0>X zR1IFte8RDfa~Eg+EdFK#Ay+3Qcb|%lA(`*u6AG<1+&6vEo4(?fnoi-njyvvdZ6A}B zX4<oDOS$#JGj!*Psh;b^?M%uhR?A2g?X8c|zP?(u|D20KQ}4^p-}#pVKjlW(9lYPu ztvhiR+fOErzpTF}*=(vh?H{}__VH{#$;k%O6@Khqt2yQBMy+P`;8}Ky_xpviW<SmB zU!;^6HGQ7m*_jCjcO6+fjUE)TWSJT5Y)xBj^13%@s{YhFfh@HxPgbw1TXIHl=C|x^ zQ}Pd<tq*;X_V<QHc+}R2(*|zV>o=^Ei0id0Vwp87&;Ip>zXu*wG8P4=&awW=)jRP_ z-1`rihg{Y9xA^=$vNCLc|Hc5pj|Gk?%tsf@V^~-{TW4Rp*Vev`eUh@wWgp74$|ZMw z<2z*I*YJAgN~0}ya*H~gK1mv@9OJoXx#yteWybj}cNcfpKYki>^)#>Dy5K#XqQ7qM zxZr15oV-7+^h@NC7jxozn$*8ArQSC1Z!|HyaNOMa#MbP$MKPwyj~{qh&M)rODcV+C zf9`_QhyNc|o6kF5|L^Ia!kUkFGK^H;e^LK)JnZ=6shf*JIG<=b2#2Shbn}`Q!l$au zpDgpP_Cb>Vkyy>9X+P>`Ul2df7;;hFSHRCDA!p@!2kFx-YwS5!r}%t2$l|rDwZeJR z%FwJ?DK~3ZXkTbKwf754wAz%q3H-OFPg*8;%>6>+>-KfWe~1-G%6T$WC9%jZ3->#y zy@*Ax#Ko@EoWZ!{>*2mx=WkSs&;0%@=>3X4=Kpn~lUy^dY8cJ)KB)QZW__T=!j&su zy`D9<Xqn2wAYnVtWsiz;mQB+1UC>(>@AUpds{d)>-`~1;SR__kZQ^{tZr}3jTYul@ zmsS;1U&L`w_=0#l|KGSx8tIFVvifQqUvi4ca%tGAPg{!wmj8G!;8&>MTF7;o{p9QB zdb^U}N$hvH-_~<nfArvR!|uMQnc3V<^(HX~zPMhBSs=Zue)D|KsxsBTuNGdHD|=tX zyxgMtccO;fy^{9B(jPbee{uItFmFioozV2aL$g*g8c(ph^1=68*<_ER%f?gcpM3Yd zz5dFNtj;Ts`g0hM1f@KZTd|n=Xg%ll@8-KLEOY)kZ(dt$KJ^pphwk@ZLnJ5f-*JI? zWpvy9`ZqJ)b)-zqJ~H*41iPe=SE|pMS37?87TvoYdUSV7Yp%PhwbJ#B&=-xm74QD# z_*Jca|LxhvE1i;irGF|`Z{MFYaYaz?`f`n|+NzxwzMZ`FH)l=Z-v{BY`(nCQ+t@}Q zcyr*a?8dJJwRhjf*3Xz3%i?Xi&{<6C%x2yv1?_fU432o#U*oxO=wh@N-(frXZ`aIk ztKHhOSM+$F%;l3(bJP=ZW_)H2%Xn)#%Qms}V9&?np`x}uwVNDd=6Bw?9Px2&)@ET} z_lYW&2i&h&^iK7bw@MRSrBw4b{Vwy&lNkpkmQ}p`#&<VoMF#V`piOg3uefY_`dle5 zYgT)HuxEHzm*A`;?dkPeQ%?N}U1M6SG;d`qZ{e{E%E#-u@9+C~fB$9eh!fmr#J^=2 z9r@EX!=dkZenZEfz#n{5-F$Ogwp>V!nP4J5<HPxxS%*}^6n1Zmj5Ggn!jt(^Aiu=p zRedWp4{qFdc#Y%VlXd6L=YV#o9`BgAZAar*zol0TXY}_;s+9!k_ANYbTyMXL?WE=m z39chc<85MRUU_-RV%cW15`H-zzr}GYm+g3Vq0jWyfupPs@-iAV5>6MlJ2~<0)4O8j zXm+DsJ@qzE;6zQy+tPyb{FoCWKSll8DcEBgyT9kXP|C`AF&kLA{{D-VFR5nG^pF3- zxz_N!_{vS~stz&V@>AvKtgC#x>-B?rRioy240p=doAcgFJ+}R$)nq47y}#^txowPr zx}&bl#4UAtOq1%~df(;JShZtuuFvOrul~mVkKG^fvwgi{t?Bh^OFYX@B)0}PByTxd z`F6jrl0H|>;!P)RmH$cjo}^RaopN2!GIA9kN2n*`Bte!-9?d_NF3~t}=&OVZug`*1 z&wBq0PT${#bCiDB$$xr!{!;;k5}h{_%BFvN{PcF@1Vhg=kGW0VB{E9P+m8s{uKlpl zMWHt1k?_fyS-uPM>Zh4%sqVYhx1#L)LY<bJ3^unZ7rGxu#Y`>X>PVR>bjn!op~n2U z72BJBtoDdF9oz6-E-!Ce%C4hcg7ZaOy(cn!OgeO=zD3h1@zBmGKC@<+7-n`k&FWBa zT-xC)!Z#txT{9$G^UPw&w711UCj@)$HU6|XpIx_w*ZH&g@5H1NM+(9X_q4=u>C_xf z%6Pa=Wi{WTJv$z;vDD9-b<CrAGSdO^Fr5W+;$uF|Q$MS7@o*xO-t+74cF6NiuJY+k zTdcJ$`R(=TB0Tl>(u?gE<V>C^A8=mP>bX<dWbN9Lo-o0Sh6z2|g7;mIE0<drOx=Ci zYJTbNH6Gho^iDKx3{LRbSa|H_?N8IzXs?T1%~2Tourqnym6X`E{IxGR?z4A2N$1|b z;ne#ti@KsE3?#izU*J~hJZfoM`tW@ELH9JpUnz1<X}4$QF7H?wTYr0BiG$SIP?M8~ z*zA@|`mfT-JP~K1dHscy{A2-(S8Fald{z4ETV?HmBa*6-LNgr>1=`u3F=kX3-eh>S zG*;>5`)&qj#`H@$`gf+tF8Kapvee#579p9U%T(-+TA%i;X`eQI#&fAXt8Px&S)szE zvLu}=t!t^po9#QB{`Sd8J6~Q>ztWZOqs7hHlIin!Yl=+L(yoi#Wl@{=BrhuBP##y0 z-sdwbr!1+RT%N7F@8XjD&89ICuVZEkC*90hTBA0@)~}(JP2q6Oy4t#L4OjX~%XA&z zu1P+jvh%VPckls;x`jcS@(zEGIkabAt*dd|e0;WQ|F(}7n;#sT8Gd9{KyS9U`NjH~ z>z8EM^znWcRL|Q}Q~9v_>*lR8d__BN+|QXFtLkK5>GbDk<%b-tnbRI0V4Jew+vO#( z?uWfqj#}qU+nDpYP$hEJpN>1F>dU$$pRI^o6ky@<^G>r*Y4qNUJ<7FriuO<V5q`C< z?u^{|_fbNs)*Iv|zKipHc8cYA+Y!FLC{Ot%GwN&aoY6kH?U&L`fg9&nv6_UoGi=v! z%@)11tz=%;+~cbxUmW|>Ay*}#d!jLAB2Q`2hubGxVr>#`PO{y6;`_?vKc(*<L{>E> zwD{NW_FVsB`URteOy%15d5Lct4CG|gW>|YzvAuEO`M~&a1z-K9;)5o|hg^at78y+G z4_8htRY+p0w|d2x9COm>csy(O6rN97PJb8Qe%-KJyWp<)yZvRi7byR`mD|m1u!s5W z?A?tVE&DpUy)1Xv`Xzn(^i1x=+lk5Vs~$e}+I=hKSF_u;TeGa6G<l!zVS67Ic=fp3 zz7M+Td!sGR>bd9Ve*9q7yYv1XmT!mZx3StkYB6A2JZ<N-h=aoQuOw4M6>my5zu#1` z-t*fH19kiRyj|aZi#+2#aA9kCg6Dg&6K6}l>bjp>>!<QFkKsenbGNJM`A@FSS$k6W z-RzWD>9BCULg|*zR-WZ+_pkhQ|Ayg85#HL{hAW*C``27K-;vI#8#c2-ZP%xWIrkHc zyq5OVML5XvM4R6EJi}^bDtG;E-?^vu3s(Mn$Mt2;<fmflS5jH67_8@+w(y?ioZ!RZ zV{!F@ZP2HuqU$w7xHVR_>g`+Hz5aYaxjEk^*3V0yeEPU(s@ad$FKL@TUD}uR-b-id z;#2!lvO80JA09W(ixiooR<SV6@j%nGD{Q)+3)H87m^3l-Vav^#t|fiCi-dPRKT<E& zlX>B$pEv)LnAJrQ|FiAcubg^n6~EA9!rGftM2!FV8kHVN54&e}|FZ|rr`F(vl~R7| z3%htkxb9!mDN^`;`QYM*X}?$`g15x@xE(yYS<U4Kqx;#1Ce|$)|B{_<Ryf-CUH<Zc z`NVmrH@;j;)n4^h%sLw~f8NF0`YP=DhSy#G*7y97StJ$M!dw<B{6RQi?IOF&CS9uq zbhDqaqzf8Kb>_>No(ff~Zg-5Hth1ZHlyz3X>_KPPbg*|8#J{8?)u>!rqnd)%{Xc z?rh%q_SeGQ(;lkvh(#9YZq&6|@VqU4H*>+|x3+({dH&f-bZuWy+%9)C{!8eOP?oz7 zpU=8#xYWOX>MX^?#fLMb#ELyGDQwEkn#Ig7FBZUl*l+gppB>v)3Qvg=D|JX%|K7uT zcKPh3*Ieh!%hcPZzTdLc@pHF!>l)Ty*Zm*<zL>m|W#t@!)2bbc(;I?ri)>vNvB|gY zSBTb}fVTllPKN$<-FjsrTPK_OvB!UY6@Ft`J|iV!MpSLNW_EpBwVgD3U17!Ti+QhO zo6DxZ;qc$P@xg(GY(7oQ)kX~7!rlU(o0oUG=AFA4czuasJU`PuwOt#0E`^=%zg|1z z;!L^49m^vZiJtxFS5~6;_|eI4Dt)E?O|o+rhh>%9Sv@!6=`P!xVcuP~c>>4NeO%U- z#~-AAxWuI&8Ee5+yKHrR{kb_p_0_LGTE*vEc5dnsKB2(;(wV<{#p6F!_c(vNWGZ;0 z@l0^j;Tr~@wE{}Fdlud+{5>sValyIGH?Dj%bo&s*so8JJ_H$XCe}=0B`~SxVcV4~N z+#z#RAo06uw7}cT`({4vK6-M~MYTySM`t?uo8{)(_{g@i&+KFg4G^kOdUB_Ja{7Yr z1-FHM?^scFEFtDp*m4PbrmNwJ3{i`26rbZSn`HO(cu2vfIlE7sJG;Q+QA+as47Drn z+I>G|o_*1cj*%1kyjM6^xyNnO2jQtb2b3=Ge6BUHKhxQ@`1_$_mBP1-gY~V>R^DZb z%31#Ka#H;IYZmL=Cf=~FaVVX;)V#X%%ar=$LuIY~{;Kb5AFK=%pS9J);JASC34Y$6 zCk*O*R6e(RObDFX9dol)@j>73;KG?NcnXfZn-r2)5aS~G(A{;rw#!cK#Qa^p?B8~? z?fu9Tdb`EuCC9!Anf)Kxx24>Ydp&vb-3t51O5ZI^o>c7&TNm#APUP$XMWKz{p7Y~= zitjMYu8&_N_@XOC>%qw>%g(QQlV2mQvB)=H&nLkCY=OJ;q6fjhcb`_#pQh!T-Y7fK zXIj~WlU(8&lU<l>1aIlo&HkkL?KYpx`7iDkGjF}`cS-roy1{YJ$*db@dmghsnV|P` zgYx^^OZOTr7fMc5dpl*)3;vtZvw2FTXKfKYx8CfL)P}q}^|RXy|6O@-(OM&NTf)kq z2U3oPOT$}ut1MkFWUk`dn6;^$<Bm+_)mi&@&D?*erfFa0sqk~Ev2|u=^n!e9mS0;{ zdh15!A@c=`Zv80Q8N4^k<kb_M*I#5Z?PL7n>kcPB`><bT!u^Z0t2T$N61v(pU#fp$ zPWQRZ6;-}`cbP3R9_(?d7wdTbL#oQuY5l3QyS{rKo$%hb;cJSiyPr|)lU>3uIh$7f zZn#suvrJ~Sw(#9!E)&khhIhy8G<+g27WQRVX`jcpoZFW_Z#MR>YZE@H^=Oyl3%PeW zIyYae{aNxXs9@3DsTS+X%qE7&{@rr%SPVaFc2`={u@?cgpWoMi3!lDkmGaGcA%`<t zkB9q)-kdk{#Ja!yRi$=w`MLN0`m+6{{`XZq&wK7G1nr0@lneWQ?(%|`lTU3Q*Ek(w zE;taW{_fGFOsVzf1A=t=pZ&{M%&%Q6k@@P2*Hx20+&@eW&Oc0Hxwt|g{Bx>P$dRq) z)86hYI`M0Mkn@8bX)C`jjeUA6UMnW{kCI8f_E-H<zct}Iyqfbrzuo^~`9z&FI%mQr zU7NW|?pRG~?+oEkGv3n@w_R_}m?Qakqn303oQ@eb&p(Mx%sbAl!2IdoB*l4_n-3&! z_1W3~qS!4?`TwbD^FN+8oVBL<Z_Z1$g=d;1e#~txk(JncPl~I_ZPraT#bdW`%z3as zqv1hs!uNOee8&~ftKGDVuBpk2`etgP#<1Vvh?}xfy#C$=l@|R~{SQv>YCP^*=W_Yr zYu9yQZt<SW(lS;(QuN5+ygln>z{$Ge83(>!k^IM1eyF1Bo%a{{o!eC$PrsM_SQ?@d zxS;s#%O6>1?s}}>?P%F~Yi^Y0q6O7#(^j1P5hwUme$m#4udM1XG+(qej?=ul`lard zjdqKlE`9fG<<uQUk6f#ki51ly^1S2baB5rDnw;dixR|@`C#SFJ){d=C`EvSo+n>MO z7piycj6C@{?T0+~KUeR+_8l`C(q#&IWER|#a+|-h;f!%Z^VgU=-B;gcY}Q>Oy1~}# z!b^6wT93)0jD7_NB(4i9l+@=>ZnZe*62fNKc;j}$)ROZ0(p8dX6`^m_6&N2~Ty2%f zZV)KSDp{WFb8qjeC8;@b?@zDVmFm5V=VP5NpXuty<zISInC}+s^L2~2YhrL``kLZz zY&dt~o^vna?eBE$O)NW|d7NX5JJ)e#fmt!G1(TMpaIi1_YH)JWx0=!)ku06{&-zTy zPtrVT_DlA(*~B;1YFSLW-1(XMn>uE=B}r*UDE~~4)V-SZRl6!}XU87d=2ce9Bf?*9 z<}?YFe821bvwbEXH(kGw{Hyb&x|FS&j95xmhu`$hH(|}C95eM!?bExYa{8TfY@=Gp zyNUPjfM+N^SZoz3^;0Nj&}7iO!KhMyds&LM?)p~=St~NQbOLs@vn^{E^mB-pvHMbe z=3JU|>ivDE$~IW9E!ugNi|KZKd&Ao}F6P;tC7+c3o^Q{Kf74LC@Gt+vs5^=LDqaUR zzi<tYz7wjx?nwN$MfZ=U8h()tYxXHjbt;Ut{c`K@yV!h&b-&8DFZgR9BA>tO@Wb98 zH|p!Z<Qc6!wnge~6mPilg!v2qDDThj)el@zoMhQ?yub9TsE2%2#3PoD|3Z21^UDfv zGg&UWvZl<-B{H>kso7_}2W9i6{_xD+;j*|Qi|>8JtCUra4EI(3d_OF6WZKs$tNVRs zow#~%eMjEzkms6Q>iITPJkRTRM9UN~7VWhLwK41Wzq?yCS8|QAS;YGDt9TEFR3#nj zl3YFa)1wuaziX>L*9iN``a!cX^;MnpRO9vURDG3apPls6WVV9|<Fc>z>%P8}_;8PF zU+~K9w^Wxs;9u}yGwYdSOp0F?ZHXw9WsX^{V!Zc-+{fkOTQ5y)cq(>(LByVpoR7zq zVotM~ykPA;Kf}BJ;5KG^S0^8X@(GP!7J`D_J;ydCzP$RnW&)>}skM!F%IBKh`Ra^+ zjJ_+|Wb@SBT=TFsY~|VV4EKxAU;oOzrN?ysimhu*y^(&f*Q=H9SKj>@w)JM`vis3$ zzu)cpvM^a}Vb#IMQ<R>GY(J4}^vkYIGtN)-blaV23BtJtV!guZ1A}#~?I-5^+^OL` zYZ_!^;?${`-Ai{0T@Kay9Pa1oX_c0x__$=M;g^=#jS(6(zmL`b_gkMZw<%`d26s8O z&(cXumU8<Ul|H#YwBC?#FztThp@c@x|8rKV#XRDl6xXM4a!t^OiIdru3VdxaT=#0m ztZ8pwtJavVu)lf!=ghVBS=WC4lrX#`c7MaYm0PU%K3_CEy!9+gRhymtqDiJ6eg}^P zcyye+JXL$1aHzpr-n-50&6ih%uiCm}Q+v`3Uyp(}kC+O~w>XGwSiaeL=_j^$@vOND z(r@-p-jq-qlHzsjo156Sc|N>bE^NQs&?9|~<E}+qqt4aI+|wL3-rxVaIZwadq)~gO zrdvK|%}3KMUFY;#o_7ado5^JOMnyOF^R3d^C#;$IcQF^-mgU*CH(O`g;q^){m^XgU z-d=zG@YD0cCes8puby{Ze<@#OW%LR+QR8jBnfEqN*#CO}YjN%WAGXT)eJk$Ox^!q^ zzo;K$-+J*vnOQ7(=AC;qKJ<23JQvg7;#{wH%xOEzwod;I`fFY_1Z-{S?(SEZ;3l=w zSWlB{!vk&;)wA06d9X?R_NS+}AK(_S5|j1%ed_UgTf_AxSxJjsWS`~CesJfuT8Dw$ zo4hxjs@sa6BzHRex^P7OUgVndo7|Qjxqd5mmoD-U#pjIO>|4v<?5uw-)c5ISYn67# z{;rm-cPu#Ho!<GBBVvunN6)}5BAf#HYCb+Qltk1fDV$o;=_x#U8OM@N4xx~)8!ito ztS_D7#9HwG%ugoA#>E$THh;665t;GSpo;yO@-B<&L*nwehcDRGWzFwY6m~w8bHO{l zEkA-s_ekN-Q1-yMm_p_zdw<{h<Ru3^8Fw6S{M)auS9$)i_K$}KjMG17m*44c^R!*& zwmDGr_F0_+A2u8QVm@Uy^C#oim_@~UDdvXP+>a;s7Oi@0^Mi8*X#Pj)B4_K8*@x4U z%}*+~E@n8zbbaTeNdXLnc{2s>`u#mQ^QhkUw54--&xo9yCbZg1fITLHJ(YWfcm0!~ z%t@{O3{T@GFelFNuAK6@t?tFF$(OtRH%@vZ_58uDR{M*~80r`W{)WgM>Y4p4`S#oU z<%a`xuCG4$vj2G7N3K|_n!Qg<mV20gX!Krjh2L7`^r4SpVrJ&T-&X9{>!_@IM=b1e zht<E`Jlj|1t#(Tbd_1`)MJIbtcWjJq>)JBq`VCuhw$7H5OJ5zk>cOprb4{b)89lCH zIW|+b-oE=QSL}^X=I0XS&weV8dtJ79YSQcbOP;EUzK&=A<JP|V`b+E24<=8yFm7|2 zy2ab#)bi)+)|zW`L@nPnPgwEg`|gz4Om?AWZ|pm6&iQL~p_;{KQMge1s+DJ^99dqG z{?p<0!l$aw>UXmJmYnVPQLdATQ;jFFYw4UL`Ngci|B5US%)E3(X<u*gB+JKVHaGhB z9Xs=;D#o_4Q$3C8(DkXm<sK!>`*~6NZY^{6R<ZjTm&!jVK*vTbD;$3M7*x+;;O2E` z`x*25&l|>-vajDnHQkClK4I>%$?1t)5{LCew4O4rxGz!vqG0W<e*KJZs}@G143506 za9(5_Z@KP^h1nVRnvR!GPjknwnZI^!y3+LSzh}#ChAMrTtbSzveD?FpCS_Xk<v8rP z?mxLqmREmb5qsh0p48d>$|r-Kx<6TGEtr4C!2PUH>mkKmT(T*v_U9yiK@5)6Lq|uB zT0%xgY;Vlq?Bnf}mDxJU&ZB?-j+x<;a=*H6Qrs{<lsjV;Ut`O(+Zk({)*Wz-Y_bVE z>tO!u>8cBdGaUI;x<j%RTm|L^KkR1LiQbeh_S3GkXa74{8*hDqo&r^u?+g~dRJZU% zcop9$e>_9<v~u%dmST3#<Mj=5I~et*iH9m~(Fzxvy=MJ6A$68Z?P}j<cxYXcXxo&( zdTG|~YZ{lQ-*lf_^nuq}=}Ty=?xLj^)2=%|@G4y=DC~dSV0Eu$ea5!RyBf0sf_P%9 z+5N&eOz#Gk&3%*R^7`zrQ1x}&dOl`oK4F>}U>0}5Kk+`N;kvb6QWZu^UvAc_UmVVH zqoGOvi_gWjWv#J0D<f~)xLwv0arFM<`=a}KpSY&<WX`f*DrX(uEir7hDq=bqBFUW0 zvrc~315wS8$D;MZMH+X_C$;_jJJ*I!^h>X?w2iayyrz|zHv+a@JTE9OGFfak(-XH- zLf?W_--cEl-~T{ncj5l?Kj+oHb!~lb!czb0jq8<7((jxsz;%@r$LmPX>-rvH2Q(`t z-xG+lsDD=bFH32r$KP26v!44qE-m14GrM;D$-Ubl3$5gLtLI!hu%&U&r55eam*(AR zYBY13k=5qw>wN6%L*>xJ={_d@jeqS*{Y2Jm|LI+jXISC7(AH@}{^AwaLMGpfJ)Y{< z$Y1|@<r!Jm+pCIQ=H+iqetYWQ#Ka`M4R7qOh(4L9_5G4?j$-~-_McN~e})~IqNnwN zb?wc01zWB}9)Bpiw<a%b=FUUr|EwLvr>&oIVJb`MmE+5H-=C$MyWr-LqqCI*7}E9B zg3p!-Ds<<5x2;;l@b7kg>%wVVS7bPPIv+Kkt?ZZo`M!SbfpZh**1tF$b;I}hn(JPv zUZJ1e*Zc|-J!`%*NOxk<9{H#9zc0%5F@OE|RQZSU{VCy-roOR#zHNHTa`Ba_zouXR zV(gX@*>k$D?%d~pr$xUwwxvpKjJbA;+hFeZAA<X@@ipD<-~Qcq&6F?axTmPT^*!ET zxbEVVNo8kE;}4y^uKcjRStsmH(MxCk;)Jpj`z>2J3UtK&UR)x0rGSyS=Do-Xf&25q zqf<^PT|V{bar-2RJzs7$)oSbhnzP(PLb3apLhQMx`!-(R+4`aIB%_-2M2<B_#rbX5 zt2mVO{C?$Cck^0u=!Um{>h{KFm92ZUq*ZF|uE|sE^`5AFU#BEzzrFN*msP#TB%eK9 zWiNJzX?$j$!u$834wF!e-mBDe--_04VJtm4Em>Ykav5*wzhC=Il@|3}PBDDix66XJ z@5Zj3x2x6DT+1ghZ+5sAp>(ZTCi4<+5C62E4HtEvmdxgRQ_frUSaQ`i&dTpsmU*w0 zeOj9$VXrpnXL5q~vfg>&Q@dkYZ+OJy)_+HI&QIU_&hD3TJ^t9C%1xj6ZEP#mCH~Yd z7e6e_Ie$lU@xDGo4dFM71>Oh=?$K59?o(agsWWk^uaa~b-`&Y)L<{d|{a(ykyEpLs zQ91bobyZb!yrj0g)qQ>LsbbtS?gOF17O!`)h_o-;acNm%(}VZi0WwQtMcE(Mm%1&2 zcg*k1XfryrmecC|=ia{jvn!>)FH7uk-Y2}bc~UC(G%eOD@h;81N|P2&4|WL*%5e(R zt?u|L2<w}FSeQTW)6`<m>GOFvcYk4xf2y@KN_urs4YSs&Uj6XssjIgItbC~GfBxZY z-&34>6#oXTo3iSx7hnB}_u@N+;vZkIcar>arGh6lx@4Z}D#3((Cm4O2WF&T;60%(> z@o6vThFy;)x|M&aELXC1JRtnFRc>On{`J1iC9VBck21ZVulwz??vBJKe(u+$cdguA zs<yp-`Sa#XRr|x8DWV@2x|ZbU%n&~5mVb7+@$@v|w`-0RZZ)nElKZ>uV*Rl<?5x>c z$NG*vzEBD4mN!>VRM>Xs@#<x(a?bmt9Q((<*J}Q`_SU%CU$?(ZuMRy{d@Nr;GiHkg z|C;LOnGP2|%`3E1e8_0=V2yBj;YpL;>**Sr)7*>yZ=bMzUto_(Y1Ps!sei10q-H!X zFlx#O>FEE-rKt7jvh?Y)c+2{fzy2!~3t~23`E_Ys(OZ4db$WGzv!?!<Zl!)rJ7(#@ z?LWW8|G3=oJ6$YI+w-+gD1Y+4O>Sp8wPv@a_Pkw`<8!X(W5m>j?tU&l^NK68PugSa zlKY>)(j}k52kw&BW9gHFyX2WfbjfSQ&&|<J`BQNO+VK`R{a!Y+q(tUoL-Ez;KOD|n zP4`xLW+vC+!YLl#S9QSq^wzVlP3F0CpLOBtKfZI~Ydyv7^=rz!V<ZhTvYzkid$4D( z^vd;aXEUFE?R>HP0ecv$xI+5PQ`6Q7T{$?VBse`RR%<8Y<N|YnUE5DO)vV|XKF<B| zib-4u>vY~rJeLn0)fF|U`tCH1=Wov9_g5ZmQv9Tmvmk1RkGQ7vQt20coCSXa&pze- zvc_ee<M$KK3npsE966O-FKNE(Y=qij9pSLQ<vl+R-+p>vp<?NpQ$l6;)&wUwR_r_K zyf)<Z)-0u?dzB~2$k=Z>cmCWROYz*$%Hw~16gZD~E?av_YRjJ6@dlo29&NV0IOF(~ z!v2-@e+#s~wJ|Sav*+95&gHJj;k!;LApXq@g{c>nlhSK9UpvR<@OoRPQbSt(WWis8 z$vpFXlFhbGuy>0w7RpSQ>c~{MWh&4&&ro$rUe5xrYh5abJjIx%>Avhr(Xz0;#Hl@} zNoLoF!#jK9AO1Rgdi%wvbC%iJ-ae<i#DC+q3WdnfV|$*ZNWNhCa`d6|{_lxXWO*+L z{!o(-?2Hog^N^}~vu=;WO|uT^&ph{4SnE%{a=BC{_SbK9Oy1U}58v-A{@6YJ(1-Lz z^Y^^?|9RnUaq9<h8ULMkh?PfJxN}yB-MyC8z57*1%BeHCwj9x~+x9tI%Presv~b5d zxvIB`-`ANlg#X<geW6aGtKa<Y!w+sXZ|tkgXNDz5^_H#u_S3B;blo9yX-Av7HLJHc z{JL;hs9xRS&-8-o`pw<9#ZCyW4O-da&*O4X@a45C<M&OQSN@YUE9`Xpctz%(VcNHn zw8y3Qi|j*>d2W0$ZHwVqzCRD`D`s9l$g1%+yK2TF%P?2rXB`uJjm*<kbtYPM8`syi zSxwNn<2r-ocKGu-j$%93FuTh3FZ4WT^KSdn2NRq{Ud@rH4`fai%kjIipyegwCBa_% z_4Aun{^{vXyS~Th=GEXcI?>%rciA}dDjxDXalyE8u9sl|ySEd2Y!YXMlH$sAp1zi> z*~jd^++8bOJZa|SH|Bj}R}><rR<HiD>hGI*>;?KMw_Eqk@!)a^zPskO(HSNMrt32+ zPky<<_e|ATe`e*$Gv4)fO!_~gOW(UKKNDyd<X-8#K3gpP+xa_R=WJwtnOc*7t@b8| zsj+<J*IO5VoG97&z3hMC?$h!coTKBf>`_d&`<CHxI_C}h61BTN$I5b)w=Q|oBXVV? z;@xF7H|%sbuan%qZspaQ=;eM}B91+{bN_s2P-v>5=B!;4Zg9TnSlj;kbzc4ZUx#%L z@`yftk^aFz+Q>|%_;BA@US}KWsNH5|zQ_8E)q1y<|7zOOd?WZ4sAs=2@HnI0rem3> zV}4yQ><);2R_G;I%vF$8s-Ao|X~rW}P1D0`bG0t>-dUO=YI=3kXW^66=67#el3Dq~ zY--8U6%q@z^=*O|hCExpO62SnC$?AhTFEas&6zg_{P@=U|KHrWgI26NYZRy7?R$16 zU!jiK<w^gc@`S(%XZJC;1_}uOvkWer`oXe(!Yf9ONoTZJ<t;M<xF9PIH1lpQLR)U| zqYbp&pmTLurHrvp#$$!Ph3B;=r0`A(HZT<FNY<UVF6QH$`V~!?xi92wB<8s74O;tC zYWcEiGsWXddU_1y&fG4qt*WNq^F>;4aPanu6H|KL_Hy`3`z>ROdT~3?;TUgr%Ql&4 z)NZ|rz5=vYzxDFh+JA2xD)wnCnyx8um}}`p)Ah2BbFSO7+-2PHmd}Fi?mbhn(+|T1 zzck+Xz4i9~*AJ&@a7vx-nDXlRqVSjIldkB7EbfxLeaz&2<ca%V?|<!{TK_}p(vjln z&3l-Y>i=C~D`=`s3}tUw#d^mnkEPM%l0uy(wC4_9V1T;5pix|*M8|5%x2ebDtCQj~ zuN-l6InH>)%(001Sc3I!7Qti9cYAF&9x3aq(Gm2JpY_AVXnvY-P}Za3HG!HRx0cP$ z<9;|Lvhd~6Lfv(zD!1INZ@%>})l1|2j+VtWRSWNNJzB4nsB7+bsd~rGo7d);_;vkQ zq7l`_(jhLarsgBaHJSH*j+!rMse!Aaugio5K}XcM+UwRX7SRftRI$$?;6aAT;Wf2( z`NsKni@G<f*L=Ka#*=$rc##iJe=Lvw!s+{X?r)HY>UjKVHEgW`=3;~6;U6&98qAJt zc$l92g?&n{(P!pYJ6)ddIi4A~$|Ph?BJak-*S-Bdul~{}*DS4Zc%^)q$Bg?IL%Y}d zx^7z9u&CeAPybPDRPE+<3tLY&J+$%_nqi@?ls&2Se8rQHyKVLU7tYLOQg;=e?h`S8 zsr=!xy*g7KW%0@Vz9O33_NQl2is;>);;O#Jaf)`6J!N-IKm4z`f~(|5h|Bpi3YOcO zzk7Qg>Mowv6S61b$v%+-`V5QOKmR{}?|Ox1m&)&d+CSgiwY?U7n`!^romby4Nb=nq z9eX!gzWROT=Hgch%TAeeF;Aa=mYJtMR5iot+sv2OSf+OTIO^`^=9cv5nOxA_s_n<) zCd|Ldb#Oy;c6YOh=#vAh+jXu_b634sQ_L0NwLGfv-?B5)?cZjvypwk#>2b=^=@S@d zu`XN4V=D6FyJ+Bd*JbBk9|&~a5X|&h>GZ1o`3vQ1^DDpc^;iYPt})!QNjlO>#6N9u z*y{T2m%0vKjyS-#Ikj4cDSOeMl5JCWd-!hLba-K!qWA3VT}e)7ZwcyFNPTLu+8ryf zNpI7|Q*Oy?UOf42Vk9}|MVnAgPQkn~FJ1YoyBrIQ&E-38d_T1Ax&FmkT}iw8RZ&u# zY@dg?eq6TKqUY38rTv-F*K{IU9(k09_ixB-dw9-ke!cvA`2c@6p<REAy8q3u`QAFC znf<5NzSWE7Ked*OwO{c1H@C}`o~Yc8siDr-r!I9ZcUpW`_d-thFW%!upBP#d52$Oh zH3U3edooA-y^J(ZlJd4SEJbX4<Q|9?@xNkS&+hScV|Nfg!`-~c%zSY|6Sf|c@Sah7 zFluAevfK{scPpLhpTt*nG34z3dYyU6rfFxsPoK9&>b=vmwZFZsnHSzo%dgLDXw3{u zci$C1y|8C8`wUJ^y%X#!cc1f%+>@hp!8k&(LBVAHmG`l6wtW*Vu2r(#@z}#{{qLFL z@oUqkWb*baKek#Xa-^Zf_}Iy$ydb;%Yk1$RKX_)@WmC214>}KeCf=#{xpd7zQefUp z?v8U3drA-M^q=8=Uvl4SW%k!2e$zkxde4x5+bMQJ(9I_&EmRr$`A;bEFL+e6vcB-2 z$C<v;x}^z!YZ6v$S=m!6m)hX?Cunh?ebZ0hM*i?wf4}&wXuooEa<0u<9U1RR=RB{o zTeeL~^ZI%1+K1(xiFOCuK0fb1pH#oKcHidmIeg*er*dtcvGj2Ke$(0U{QAy|OOvAf z7^Eki;QzGbzFPlu&#PItCTz_4oVg@o)-RVsrRloN48a*5bLPrE-g9d4gkAalzUNe9 zbN1fPun`fof6D*a)Bntg{s``r-P>n-JYm`>xU<<w`sLy|a&yfpM6X_(Cn~L6y)4q> zdcBy0X38$#XId#N`B4s2U;gWB-I&Mgm8T|Lv?OASu~@Ff+mNu_ybU==<08NO-ojaP zmwT4xd5PWyueaRJY5yZMlkEpr#J#9#$EAfYw==ix<Ue_g*;<l0!>4A&vdu|ruTE0! zV=<d(5N?tr)AMn*|9-L8Ypot<zB1W-QLp~S0w#e}gW_FNB7S_|bYsnes@*SFn?^6# zuRL-3BvC%mhl00!uAXk-YT#kybS~YnFf<^5i`&$3%afvbeWqt$c3n*gx2R8=%W|Sl z@M6)8&GxU(-u2FFeIq|Nt>AA@tzg&$uCM!=3cht$Y~+~kaEV#EK6u6HyN6|V&0}7B zq9^}!^>5eX_deTXZ0pQ6*}3WB`H6`&vxQIB<!dkVeRt*9^rdWnU2mK%h^(qIxMF5_ z>#f?x+kEq#<tMHRa0xs4ceDETXTO!gr!3~J-@80cTYE|HvdcSss_rbWkB&U3CYP_U zx~5Gd^zzFf^EXi$3eWybGP@X3-}-C@&ny+EQ~W1fG?mu~bA(@z(Epgk<Ed1{%{XD- z-MKe}C;5CmAUaXoZC%4l4TbcJg%Mw7zp|a(C2nRGnS7^Db!GYMy@{9euZtZEzigl; zc;EA0;?Yg2-oZ}HqH|;RD1T#`UGXP$=A(I?Q}e&<KDO-BT!YDbVua!@`+Ses{D!^W zpy5ks{@+(=f4Nw^>xwna^rp008K22ciaWB<;LUfdf(DhC1IcIG9#+K*R2AiN9MRGL zz(4z$Q9VOD%a35ESKO7C-<dt+wGrN#ZFF#zuJ!kz=pF_`RhBcF3nymJJvleo`EQoe zhP=B%MSISFog>h(>mBc_x1Xo3)JdOZWpXk#p}xJy@N4fKiC5;_YrY=ZrEq5U&2OI` z{kapAUa>ABv^gTOC^u<F@lmz>voCj^-ng?aPPpZoWy-S?{?fG#s?*k}Ru(z+AO8R2 ze*OFPzxHJ@NXKx--2V{j?YlKxt<dkkV_dAx^?uj5y}xgZosTya&1f@k5nZ>2#Xl^5 z?ry=aKKE?v-4Ft}UnK6966=CY5qZBsWs{b=(;_e<^rO}Aa!WU_Yg?Ppj&v9j^G zvd_G(1raQBgBg~BCx37Ja$l>=>9qaY?;H7CfBShC>ef%$)%)$ZnMtg$l<Y?RZ~t5T zh2N~#X_&f*f7&ed<c%8-pV_%=R$Hpin^jq7&i8VD{Ba{$y*_c7#*Q1GT9v;v?x}yN zJkL7hz~-oBRqj8E{o*HYI2)G!p~$JD^!WK&agB7dGY#cphHe>O{%$r@TND_!&2i?( z<fL;C<3BaLV4r%o`?m#O^`nxXHJ?8&&Ab_YV}^2t;|$+<9d&y@`MfB|`<mDIu$A$= zYrRW63){K5g1`QJIP%WB{*(RQXTco*tKFq#x!rXi-}>-z<?WTejujChTh=gyI*Q3z z+%)-gWOCT=^i4k_e%zRBvx2j9QMkJI6TJ`DVtq3{dfux#ds)Tp%Q@!>Hx^ufVIFL2 z^!R{KwA4Z22ismuY}*>=pU^RntLR#O0OzH^>Tg~~%j5HJRGvSb5oBcja>~VekL&X{ zi+<erOG6~&NTBK}@5>d}j!CR+;}rH6IkVyL%6WxpyX@C&Rh_o$!Qs5loJGxNQY5y1 zVf0phb!J1s4K0rqRomNo!}g0WyLV7KWba+YU#fSS<~OkZ*MIr$+pll0>>4HWx3dLR zxL-OTs`Y$bME1#Zdck?e{2k9Za@!u-;!;<?##ime5$@=E#=GsNA^R<V*d0D1Gs9!^ z!wWs4b58Osi;dLbiLO+9|3c5m$jQAvqtI->anAMMM$TsUV`bQcBVDg|8?se(7G4p( zt!8f*T$ZME=EApAH*LEgajO^VUQB+o(NaJ!G&%9+vPHTD8yYiLoGm-M!TibQn+LV; zq!|lW)gRBy3>ULL?6WIsiRa_#oJxFY{;#rb<eS`an3NbKY7*r;aoY#38D-~ReYku_ zV$1BkTP~Gm-dL61VKpK3%*M56H?|&QYrC2*U2A^kgzu?+9g}3ev^`co%4&7v5Zj`{ zcP!fF!I5`PBB?z&S-U+8mfrX=(?+7^iKO4jrGjBH;Ze=?Vi)t<b_BWdZ@54CkNfhe zU9EGO_q;eG6uW3$fTMTwydOEzr-KgVXmr2wkN6mG+$+GVRKGD@pjlv>&jLG*E>-2j z+j@Vl-l5d()V@?<cbAIv%YdxVkHyChRlGA|Una)*OEBk4sl}3M-U727>I<fa|Gc~S zsI!v#!#8qMr>Mjqyj*`Sy6IcQLmhR`*oBIQBEEA1cDFDetTaD3D_AkLlqEKeC6im) z|D?Zl;q2Xu70gP6XD!m%q~|{C{o)mCcgUJv`?zlBCC{Ao5&KU1OijG{Co5vsTHD<d zce)-HxEkSTxM!90tL^WlI#YcQFMIfxRp<q;@!>1~+9xc1Au4qIqN32{8}%td4s1vI zj5kF^Z74D`+ovzE?W&ey%BnYiLKfZsvE#F{{Ng&*|2KG=dfi!UlsH(cSE>4EMl6~! zX?aaMN8L)paKjI^ZN6{T^k=@&6RG`W?{V#gP(scvN4aaS@A^b>$#>}7j(EnEJAu(K z^MCt<<kd5$O__ZC<m3%Xzl;tWS?w;XR}w2Zvr@RF!g4BW_CtS{HSf>u*w{B$Zo;;Q zdOP+k=-ipAf9~)yro5#)%%9BWVp)G-WyAV4bNpE=iVUPp@6|i$p68v{)U!fYsqmj# zNZGWN9rpSMD>zpjpQE>ZR_4tT(JPVaZLVud&4YyfH+b^i++}%k(z69UuB;dDZ96wT zBEq!(gmuyU;I{PY)QVJf#pj|zF%{EKr+?6R{ZP~Fng55zPhrk41B_3KpWb#>#rnaY zhIdcekMF*nv-HgBBb%meYAWG<!==)?l{N8~>oTGBSEFS0KKiKs6K9>4peIwmLF%lj z^d1ITm#68wRJNKdxZb_&#V_tc-N#e8@(wBJome*i*VFpsy{Zf53;g^Y&e9$E%veYM z!K*D%j=V)LAKzd0&HqC2MyJ!kJyUzPSQg&hw%t8tk*>(yzh^h5>6U76_&*3_^Idp% zVPArD<w0$c%69_p_c)K|v-GJ1bo$@#O4>d1*14-8LM<kjE^XxMdU`aGgYRP5B2%L& z46ki>UVYgv=OMAjsea=-zQQ&0d#1L&xM#XaPUH{cettfKIk_fhKTfcfOPi2X#IP~4 zm0#>v5ziAD<}Hiv9&89N{TRi<Q}wk<zhr;Thc018OJ_lj2gR?>2o|XSfBf;6pWK4= zLI3TSYFj!gzEWhJcRZ$evpNs^nfJOWme=<fh;f?zDn2}w`><)vp11b(G4(t5x*y)H zKR@vQN5{HdJL@WTOq~C2-k$C|s|r^i+ZAekAhUjJR6NhoioogiPCpOxsn{v}+`sgE zeEy`C+=U%4wjY@%FzeDo)gyNQHnebT|EqE4kx>@o%$Z-q?)Wb4P5YBp^-ODvQ`aI% z@z67gZ+yHurZ3#2rQpW<GdkJk-Nl{t?&;?jPk*iZu>Sgm`<>bLkN3^}{mn=9Ny*&@ z|C)dI%lzuU^Yq{$PNT4IMXAcqIa=ndG@5_0czu0M;73W@`4{K6H53U>e0o6P&z9pC z`F4MG{4nK`@bn3WNjtVTzF@OYJ{q=4*urNEPpntxO)>o}CstqIWYL>y4Ze-4Wg%}o zE*_~ry(voXYyOhoztshQ$y?}WFWt;lwCkKuBbW8IBf=^j8*k@)%huU?c8$Vmvy(g* zC#_ky=vEu2i`^aDQ<j@&q#sGiE7Q9q{?z!(_qBI>l#l8(3kk~!G^>PNh>6ro)PJ%x z-&|$eDf<M5DZ85DPIxmMmn;a{xNzqRvo>DiZ{D1B3+g$t_CM>jJ$&Tb!D*MZu51n0 zoWH00omh4H=@sU`6RyWtT#id;4i#*Paomz+%WtIJv}45vtrIV2pGz&v3JKh~C-J_` zd6C}|oIJ(yMpNw19B54Ms$BM?<mj`bS@NH!Y4NFx&szD!r>W-Zk1w5%EWPF}_WAg* zvTxFJjmo}HOD4|Ds_&Z=8uzj*_5Q=75=afTX2BR8KO-}%_ovo1R%>=}KZ-1zCu(mv zQ`9lWM*Cb$*c{c3E;D}DHntnA@Xl@P^S#9)w<>YQ<K>;}bnkC4o~Iw3^RPibdd`PU zt<xPk!&CR=6<QU2UX*FUVd<4sbMsM)=cCm3>OQ>s)%Et3RYg0NJo)iR>if~2UrBM! z2edr*v_1IJ`N)(-eg5{xrYw8f9_$Eu0-_t<7kkZmc<%hAU;RxH&uaA7cGu+2bzLax z7-tzBbAI-PJ6FHXVYRt<Q^jrRk<~vcRuoFHZ8+x4E7p3<nOASiWe!uJDJ`ZgY0JZ! z+i&Y}a>qSXO{~{ht$qLGxe4!{C5c+?c))Xd<Ma;wpN0z}YfipjB4?L&a(&ajvvcd+ zXIZlSjmiqn(MdXe=hMallPP)cx;GR}De2`<c&H;-JA3|HJ#$^&+=n{OPkpvtPuaBk zL5RbIZ6{`Cd<t{eesN!g<Ic-!Z457r)hs7RMuxjZs4FqEOBV0&tDk3NT<KZ&>5h6c zC~`k-Yqd-X{bZvPd_&SKY7tBS3*nd77U<VX><OClMe*^AduK)3xaKHMnY=Uji;PuQ zgjd#j&FvAlMC%l}EQRMyfAk<J$#6~K<)BKTIE$58Kf_ijy#GJvWx}L2O2t+$JXS5y zD$7*1c>bU1%H8&5{*vvQOX~d-pPq?$<oa{B*|zkS3v4r^6LYPa9rilDH#oCNO(D1O zN)hL#ybXVuwDx(Wr`KQTUQ~WD;*hDZ9k2eJx7R*&txKxhetpjERxaD){8q9ZrJtPM zObFj9RT-K+IlOe@o>kjfKCL`(YH9t-^Rstko96HJX%?|>Iq_sEgMWUu+0LUs>t6(I z%+Z<RU2vFH>HN}(_ca&RA5Ne9ebMK8zvCoU9Zjs(xXyN|p>{j7%VkfgRA;6xN%wut zEB<(Y(|>nH`iZyt+L(Pkr@l{~TykO|`z5spaeAFwm!5n2rhh4?cmB$Cua7D&zM0K$ zt#ed+)k0~th1b9Kc)K3o)_eL<B&+7HBDNUe`c-G|C?40psag6t_1E`xXEIxhSyHx5 zv$i?^-hV~@q_YN6>~sCXMY45DMHE!>o~A7}o)f*r>`2u5dkJ>}U9Nm~(f{QhbnaK) zMHUugz0h<uf%(xVXJ#-*+k8@a=s)e7y~62dd5=TwBhTD??2#q$^-_J(-9t7D9y8vR z&MngljGI{B_3IM{m$xd{$1jgPRr}ZJh8;VlrO)fV*)*9kb3f+|84s^ZnoB27D*0b1 zJV}Oer^5knC6+atFTNJfGqU>5oA62G!^a7B?-grXmQ@$lIcfzmAHVSY^pyH0m-QY0 zR_XqG6|EDq`-y#*!u=Za_y=E)^PF14@#vAe#$1!okKMeLv+8&JiCl2aKj-v%gTD)k z)V3u|*lGLxxuY7tQRRe_%wlpWV!mlRd5rA;R+fEJ|JhvUl>8^gRBf`kOy<i8dfvH? z>(;a1FFm*P#gpjbt5?oE<+r}@qk*mH{l{0YetmnzqA>BeUHKZvMGCd=_Bd?6*z@u< z>!-)Z%jRl$wpwlD_ITxaw!UiqPu;mLckiqXKlg1z_-<Lbk`0S@9?AC!<DNP#MrTT8 zfzv#jV*=G@-z_*Q!^D*1YkaKW=V3O{iPH``dx=gEy4W~PQpkSiZI8t~R<oOaFNp|^ z-MpabQdoLu=*6!_|2Bq*J$`kg<F2Rr)mKSbGaF1amfqf3tY&*-Ze7{8)B2Cr*YDr7 zIzlu=YyMQB6oV&z%`J`5>s;P#UFv6iW-3em@^wdK7u~OMI@l8Y^X;dOBdt!sAAbDI z<8%KdF}+aofr{^^6}-mFuZn)O4CTIUHl@*eT^r-&X=dp{H}?EFaKN-p{-|v948@}} zUzUEUdBe<fLpizWjij54W!MIpj+mz#1THewhsO6h1|I9%>heTA?1mHfVK;A352T{U zP5;a11rh7d>wUJ2_2RRbYbmSt#{S5jK7I8!A9uddRiE+W`_!}~dAlo;VfzIqKDnmB za^qxEpv4#F=9sOXZnY=x|Njua_ig+2k4ahQPiaSAUfbQx$#`jAWp(w17rd8F=`DAB z=$ABeZoPZ^-?dlTp7^SWnwTHk(l{esdwbeepH9uX?%LfKeb)9Sa$Rw`>KLc=uuW9( z?X4GU4;>4Tzaw}%DEsow)A!4*3Z5RB_L=|avYeXtjZZQk|GczfRoC?|7hcCmEbp|N zIM<}`p_In`yR|!=uW$c&_GOUz#}D%qHhc?ov=n>Dx@+?PkM$L`>inNnkCe{X6dH3} zEY@?f+u`H4{~i81J-Vc}-!A_C{rLNFjZt=gbQW8y-2eCa*Sphi(|>+bbWX2SSUf8w zRk3PO)i1wEJ3C)3EV{jIqfWKlr}*xAUA^u94oGY~lD*t(O~I4gbWs*=me3Q^FWVH& zIdyu{jm#6-TPjw{TFv0PUvH%G=qJO*4ci>1tWG~+c7a1VbxCr?%AVsV4xPUdQetv^ z+ESm5uIp~!H;kKbes9!%CgD8-OCR4{7(Bo7&ri3R=2p5pg{wNu;?)w8XFjm~nXvtV zAqQt*&iD4&e!6xZEcwePe3<G}<S~ay<=W|P@8H?m&rVlg6o@@{kWcDU__>Ks>sM`K z*7_2=IXxpWM>kNMJCyO+XQhSZ3%zDfnR@i}ywnBzR7%+H>YT6@2rWLliGyoy?!ELE z_fJSiNL`y3+y7JW?Kignk8iZDdH&aOE4%y3nO$Cc-uwD*UhDP#RLpZJ0ddQzKh}Mm z@@}1+;>PO!75t8u-Zsds`nvgxzvSIIN9Ib6dfR(83+lbh`;GR#TK4<m^xL-Tiw*mG zU3NacV>xXO`<#{6W8_u!=h}Vmi@r1`t!$RR<j*OE;@wt(53Tn|Bn$WN7xMY)v!-UT zyw8+>&u;3bIZQ1q<KFbb=CJ6YUo{Lb5-cJemD=aA35T@_arJ)im7I9t#80d2f~smJ zzSjnmzjW09Gk><ltMJh>gFN~CygtiLUsv@VYz4d>o{#=+*vVBOs<DA9;LGDe(K(Du z^4HpAGtHXdP#fE7bZqfOt`8NA(bHajOa0u*vu>Hej}+;)c?#Q}?FweN`?F<lp34vR z7k#cDg75XszjC%?_UhlKFPXSm&6}?%apRL|R;BTiyZp)p#r0FdRz01o{my-Hi0F>H zZ%v;5d$}&~ebI0IV=v6t+?sMg`PKpxkK0!5W}Ti7Q`gPpw*5LaIefl(aOw96x92R3 zy?MWBer}>r@LFv#le3zjuHweXRSN0)mXgBS898e@*jH$UUELcOT5|VC-@@Nd58quJ z<H&8Z*3SBF$R0%|?&Zw&abb5K@}F3qz`x)4i}0Z*_l%C^`?_tNy|!*|$2EgQou{AL zd9{QhkMbDSCsc3W`23^W`y;8-F8p}=F>=a<s9KG=dG$wPIrVxU%;~SZC@7w)b5O3i zIxyM4DffCy-TLEJT66Vo&EC9c@8Y?SH2k-QR!BMZ-j&tkfBjX@+w|nQo9pV23J5F? zdvZqp+NMVf4)-k7-&W_o<ksZqxpngMY!$A|y2AN3P;SrN$iVWp7v`Tmrn;}P2|8;R zl<FQ+5a)Kz#;Ydg6rb!lNi~7|NAee!Z!g$hU*wi}U-0xg>vZ>scFtU-Nd<umdE+M~ z2x%*xjheYgBWLZy)XfalY)}7B@Hs!Tt6u%)_F21_o`39ddp6<0eUp-$3Cm}l>%J*4 zRsU(9#Wq2gH`<~<Q*$5JtyQ>sp)@t~BHy8N_tw`qD7w9>G=8!E_PXg>we4oxCeCon zU+eiaG2`5x8`0a3@<#Knyw1tYbbrs2$NbVEF1I+_`se&(ss6^dRetqVVe7kRvzRB_ z3NY_hsRs?D^IdO0vYf3anCZih2Axj~T6)uei9hdm5nc0HoAvc`X6L27pVxd|A;EY= z-&E>rnJ)KP|Jks?beWGRgXz=u8ZWKM7Cv<Oh{61X>_eZAr*FJvcmL*6hxXOw9~Ump zcDa%6f5fJ6?$a2pWlzt{_$F3=<=gEiA1|Fcp3WtC+HAgC*V2{#DRnP)NHh2>R4gnj z>-q6eW68fQ>@O^*mu&o6xA@})g-4q8GyJO<BI=GrDcs(>S5-^AqxVF$=q(TVRI~Z0 z1L<NCnkCQpl`A&i-0|k?yN|c#Po90UMMhKXZkDh06wBSt=H~Sg+mhDn{Hm3*o%NIT z?3DB#w+qY8+~xQ+O@=vt)qIV`$G{`!+nq)7*T^sbx997P*Nv%(R~w9NdPINTp0UQz zb*+%@Y8AG5F88=1cK&r(T^^N`{#!w1dwUhfg{JMn3wAooWJn*|$iHO?W3#*$?@G<9 zMGI4lQy2Oen%;FeoVT?8hlb&Er~60jk8V<9{P+C)tQ0r7gkzagcw~*|=1Oe|<kIC+ zDcl*kbwjRj;XBQ(Cw9-PEx6q-#GYr9oxGe;=uBjT`<=<fcdZp}$h2PJ^;b;(Tjf4M zYNm;$=WU+I)vCE-U*o%WDhO;lHEmPOEB#d459e=1gg)?yE$Li#W8DPKyY<GEnR_Fy z9zCM+Y;{eT<E^ANU*1i({Z`KS&e(fr$(s9`-P7;(L@m6~2A)}4_&2AoHPJceo7vK| z)`U6iyDj$dNI9+Dcv3j^==3Y4SC?lVZ9TeNRykO}nW=O~Uu40y-A9uaT+TCz_FJbt z{n_VFLY?NW{C%}6e_h~^TzQJ=oJjr8+|--5i@)7rKQpt@<Uix)@-t7YT;lR$y*FLg zE)5WU)Z_H*@br*#8Y!Vi%fvI|Yuyxoe|+QW$h5uSiTVxM6Z<;0a$eJo*%tP>_w$Mc ztwE;G^VBaIf7!nBukaQ{TdRAUKP}_8KmFY(N<PrDF`(+l&tG-6&)!Tf$$e<0{o(Yi zR++@xS|{(<zWny>H1n_h{onals88<DU#`Qu^1N2U^y9CX_3EELD7D=wQWN;PYKN<* zWW>kNrmcCo5&qe0pUt@T<m0jj-X`les86~h&_3JiTkSWMir<>@*XOkyR2NyZ?^)sZ zl&$7RYYT7bf0e$Z@H?s1{L=5t)x7T<H^@9-IJ)UKZ(xL7*s7%+5qg>h4%f=o%{p!S zy(nJlg3&DRxqBPFUkG7fs`t8Z&vwVW2|`j5eaT$SZ7i>Kixywa%71^oht26j85c|W ziz^KWHgA33bgpb}?S=<)raQd<er6BLtmzKods(EuO<q&-ckNu2MSm}Ne&;>WbDi~r zv*B{@H{9_>4z(4Q`H5#dnl?SX^1JuLrc^N}zPN2~9`or(@9WTvZi|=ZT4W+p|LK+4 zy?~Q7F3V(=?)Z7N#$&7S<&O>@w<*2<GIL^R$HvenwM`pNbO{T7ee242Xjh*-AJf9f z&woB7Y;INT<6IcLZjWK(j}9j0hu0rv?3LQ<$o}owkt=SZ4D6P?%=fk!YL<7lEmqT* z$-lgRm!YQbyQk&JLGz-7#T}bBe=5qiwKS;z#o>AHs+E}4O<CJ25#w$3$w7kKg<3Lv z6fb<3b(i(dnF3?sWvP9xmIcgzFMM`98ns&0J24^odCi5xNnO3{WdTOv9v{|7CI4}I z`8_pIuIQzEl*n}ZGY(2xc8Z%<YHpLX6N+p+tM~fk{o_^M9bDF*R4lSyY|r#vboWom z?<pH<>tC?5?W~)hX{Be)vHbN$mq(sj3;8rZ*SvX}==y9|(#>*}Lx<Jm>QyhV1W)la z&s$o2YWke(@;f<C?B?{CF!9l&vz@K#vwWE)@*aKG{Sxc^uRQO>PQ~ZKAC>%%Fn{pi zy*X1*Wc#~`>IXmm@!a@H{f@@(8?&Vs`@GSY*}2HqWNN+MOqGZQk2gx}-gsl)+$Db# z*XmkcN@|){AiUjV&5cvdWxg-ISG@`N`EvcON9%9?xOpaJiauj*>8#|K)r-96HA+=R ztS^tuVlXkvxjjSN-QjK3UcKd_O-meoS*PYCOZp3EizP0vn7Pp1e?m*C;WJ*#jq9&u zerKC)clqD7%tmeXY4tPD=HxvnYUI^YvMqlnWEP+;BHg#-)yGRSF86N8t2sY&%7nCq zor%Ye_Zo(E%D$XvDRm}6Pk(Xwg3X<$_7+CiJqfQmthLN})rD;S-?JUVrkMqoEO=>C z@L(hV@~szEXmQ=^Yp@R58!H}ks7NYgr>y>5x3UeE{Qvg_ec=i^Jwbnc{eu3a_CLP= z7XLrQRmXa9&#z}U?&kankUEn8vT)m_Gv_weIk>El`Z;BHW9upYBkW3U|G({3clx%! z-Tb3W5wDc7Owsk02S>gstUS;Oou!X9t!`7>wNT~e`AOTBuD=>Jca6^9g<H?0zcgm? zliHT##=ovyE4n4C*j}f_G4@?OztCZ&3hQ=O>p(`6#qI~^-n84*u&QeDwU;^Vd(TXi z@>H7r#l_<Eq~7`)ol1YcYwxgj*>CA`(7JS2>U`}V6Gd(Owl1yOdw*%!j8vt>q|Nzi z6HNZ3&k@zks1s1;G}(VoAS>o`e{V~A{1Nq{@&k^H930oIe!n=`Z`|OvDWm_kbp4jB z=5OCRH&+%{n>=;>=k@OMC*~%VJcGWVe1m(uyPUtw-YK1uG3&|q-k;lrIkQ&AujHP) zPUG6O@D+MHoCS9s*!y3TLGhrU`n+%2ECLE1r&2^`_;dNm@xCvfSjg5a+xoy;DMosd z^+_Ai;{^&wtUOPsyqTGP{Z`7nySy{g<~z-;7u~M8oI&;ftLmm09d_4?LSH%`@xLqE zar@?uxq2V1j(jcHet6-OBX9R?UC6}FT5f&kt;mVDKX%W$#Pxc==I5vWeUl5VA2!~0 z{O|V9+Br`-Sm|At#U7c8kCFoHu4}Zd7y}C2OLp~j?3g3q&T>^Zx^IPak^G%wv4ZR~ zm<`@_S!mQhN_V{@S{UH6Tj@sC&evVLtmkQbv72F47=DED8N-`ePAk3tO_j1c75QFm zS!OXYkmH`8<3ql}fH?*l*Q$&3@7|rmnDFDp;wU}SC23L5)t5QM9@!Rp+`lTf_0g`k zhFVut?CeXwo^#)-YV9=tDff|wyQG8FPxUPkdcwHlv+j{8`Stb!Kkn?`QT%_yn@{JC z*qem&o@M`WWd7pQj^gXjJY4YL^g<aCc1{nc+n3y!6)UXSnUozqY>jRE<FSa3op<9s zxwb@wiq@nBW&%s673(m67g*li*l=a<{)mbn9cS+UcdD)uGFD%5SWnDI`~6*IH;L)l zLfx;WE(Un*b(}BBckkVo`YDAv#($p)7@sjeGoL|-Nz~<q@}l=Ut?O+0ZU|O38T|RX z>%8-Z%j`}Gll)5N@4L^>XXpNSaw$8<-nKipPSofNFl`T3*x?-LaN_vHt!tPMM%y-M zTFdlzT`A&Z30bvZ(n{a-GR@wr4HJsrd|S{uyEi=Op<TV$^BWhN@4tx5^yI4-?{4NY zUgJ^0P$Ktq@B5G!F(=IDd^vqO;#9HX7yrJW=l8RHzWlU8;E94_;%l8-Csi`dC+F;( zG?TT*@(Ir>&p+*RN}2PU-#>_}<GFG0;2i0xJnZxB=Sn`Gf9vkE4Kr8PdmYwNeO0N% zpFLM2$a#xm#qQuYFL?@cEppkn{{Ld^xvJhgyYyP%d4K!U5eI)d-Q`?h7b(7X`?ow_ zY3Dx-6N3+2$o`&DbU271V9zS^FSB=-6fp<y5KYZXu+Ui1XvwJX!Sa<RgW|(L+dDcU zdJ<1Nb@;g1#cHk_u`}(>xmjLecuY;MK6KfR^rWZKe-l1QdcR40S;K71K8soXp3CIs zM}IHYbC!GAL{58hpy*w>#WWe6kH;isMDDyVh)`){wZGJMSlhMYqox4+(dyN#JCwE7 zDL-<*RnRc^!kQI<tG^zVV|NwNi21jHxyyOSBIYKg>FYWy19D;l83gae`&@9i`{3K- z&AQW9Bnxh<>L{FPs9;>*ZmwtGHl^paM6uPkb&Ic5Y*C-R`9Pb0qlHG&a)*51i=Q+D z&N&=h?(oL9@tS6Uo{`%kW4r%}UWd)5_kLzpWc)gP{by!*{kwIGH@;+eCtmr1OSH0B zgQwN+oa?)dO&2fCv*q2$9<*Dr`^|;Vzk&}mc<sEFRXTV2-_Oj7_1})IQqqe|Q<V;{ zK63Qbnuy2RQ+6cG6wSG!x!$MSWSZ19HJw(QW7m9nDxCM}IDOzctF)t&^_S|o{wEvq zWvoB-p8J`fnY3Hq<PMA7X)}|Lf^%$4kLj)W`O59$(drXhPu9pxJax3X=Hsp!um2ym z@6$Qu{5<2s<>gA3BI{4A*rj7!-(+wwHl*k1vIlmK21|WSLN}TwfBe<_ct>K|af9~c zTM;);Pc?78V0yZ2dWoLk-|a%P>xH6{+~t<Bd>4seIR5U~#mnNizwR^MnOZrir1RT_ zle6v|df9V)na(xUi9b2l7bnR!)t8-2Z8O`x@9CwL*()uID?Uy8C+)LS^`q6g^|_t( zwhPb43U(K>2;bH&4lJ8<{x#zVxya^>ohv?D$)<Si3g2t+vPf)iuj}5#&0*4cmYvH2 zrthBpIi|LT`<~y=XM8_@Y}>Ov-oxOH-TCIU**nyB_&>R4WYm*ieDqHlVgbunHSScu znxB`O7jApKwrY3e`rS2rwJxi41%>M~zx(Ixxtw)n*VhAw5_Pm6cB`#Edb#A+ln>Ew z{eyGtUsiZ6I~XYM=@s~sXK$OrugfRqB|iCMGiRpVT)oo6ZlDf(o^0hl!7iV|_gzOs zqty<aoO#^ykombqk2kz9zglf3s-Kgy>DUh0&w=l+accjWmXlax%9||oaqbh@FrDa4 z^(Lw&Y?8B2l^-(tROD%~Dx16K*sN6h3HP-whVT8ldiGas0r{WLmfqMAAol8v!TN(8 zCG2OTR<mD|)qAip?Xba2JC7jeCH;H$9I($(Vqfx)!H(m@@|G*&pO)RtJtV!L>5l14 zf!(Us-(P(>&LFPJqNA};@Xy;jmS$Jht1U8H(;_p!zQ{IwnM7c>TV6o^{PjMmmY1(A z^weX%c<SgC^P=Px_jL@8aKCQakdb!#bob|C@3{|mCWZE@#!bi;K0HU;tTNm0d~Dy@ zub-th9)4cz8a-jY*)Ik=ok;IbPg>;KPk-G1|6csp+N%y5MO_?zwylrK(wdnsu>Z6C zldDII{zg2xx_f_p?#Dl&!HsDZ&Jhn!d3{LvdUdCC;Pdx)AJ;fFvKO>$K7HrxgiNXX z=@F9Aa_5`xJKblSm$W4N^ulGYKX8ALnkimkcj(DVjxJ3fQHPhksk_(9Z2K4Z+N0^h z+OKxsW;^{)cFs60zcg?0-;KH_-nLzM(NVkczk1EAg!)v*H6pbeuGrK|cK6Droin{^ zqLZ8y9-3U2=c6{O%eG7?t*fb9chy<H1XuYJzo*+h+Ud+{vpRKEd5it?FQ%Nwa!T3s z)mtLU|J*5WEJ{1fQ;{w>x!LW$y>zmYRBEd96iIuvXEOg(`8(<YZtmUD|9FGC-}Lk5 z^6|5#)wcFpHi@^~eA4;iy7u|{7QW|U@5LnIBtFD^asT3)@ZgT*!t?z8Z}zGDznpE? z`eA?hmWvw;uKZie8-M0bxAn)xJ~~{dw@<qx#J+I%IscjYn(O||TeU#gU;L)StL$g% zRpw>0F2CfX$9z;cQuvkZ#?nnL?+)nC@kqaG)D^T~^KC&X=UM$91>f^+Vvb!@t))|c z@%X#X0_<NGo(U@5H2H9))LIkUh)XlQCBp<JCW)r8z7V==ckj-TNjjZt;}V2wK3#cv zYsIdRH<3cGiWD!X9R14Pv%Wa!)v;sD%`x^0FMkzpQ#!XnY-YDb<-<kscUI0?X_CN` zt=@Uf*Xg3}iL-U;CCaWJxZKS@zc_b*cX{$M^=0*j?h~rED16V*er5hxa<=f@AAX<v z_OIXI`a1gj(WuS$)|y*A?-Q%p@*&7jRJy+8%j3mP|Ju3ltbcxI{ry<mx@r0H?{=2g z?_FRUX7SAF6&J5&d$s5v36IjGxm~CI4K|*e{6nuubYtt~6%`AkWmaxocHzacsb(j7 zLJs7936oZ97O7Xi_v~HU?%99eEsI<IeaS&7=Dg4z;}d+3_NJ(RxBvOUewv$k+e%}j z<e=P7JkxR~DZ2RZ-L?0Kb81yPn=dW=>sItu2kjppI(08EX{n4*y1W0v36;{PH{$Gj z8*d2BxSnES$PwDLli`5Yk=aR?Rg{Z!B2S4Nf43^xZ(eALZLEY^y_|CHrrjyRQu9o# zd^ZZ;($=VGZBu_I@K;D~o`LMV4a`~jqMK$UvRfD3IwE*JCCSA{CuCpNWO4nz0Jmui z*XQ&&%(y>Q{4}@LF)5KSsV9QEON4|(dv9g!NO^QWT<V7Lp%wWF>ke+vJuxLR+Cskc z%+&wd_Y#;ZUzOix+tj>^|3$rDUB#Z=wOgm$Z78`Rab-8BtG$Zz+`5H#=AV`i`>;TJ zTCMw{5}z;swKs~}3Txkg!LBU3Sm?fhvq03>FpG>EfkGL~OxMCx|0tSmi<x!nl*jR< zTw1>JK5zCI^a}nhZ_wQ;a{p4u3hvlvGlLw#lMD~C?_4d(efUPGQSx0?>fL(JU6;R> z?r!RcXI{>9j#cKuIo-mV<UZG|e}M^$XEN<Bjp2AxuG}2A_a67!a{jo5a))IX#UE;J zoy;Nj?;~g!|3di6|MM?Ros+Ql#{{PH$sHHoa5`^qG&pRmKP~-4pYW=}+o1xt!K)6i zE;^_OuR7RJc=*_^#OABwrEOR9qq#+8&h0eLQ^@l8q&l%ALrwkHm&c3LK05t8ETs12 z|1`V$y`DmgyPK<=7isO*{qsOntEODT>qpG@&C@>bHH&{G@lc-Y&u_QC{qN*XzFt%F zCy`A&|MqKxH`mw?hB>SE)g^BUZaQ%8aChG9mm8DnwXbr1;nKP-b(dE=?n(>StXaph zX6iS(mSv=ccd5lqyIQoeUit2Q`_2t)5B98?dQOYuNoJ$NV}HxnX0!iFITtVW7u|mA z?4&gdnY@oXJUM)K@tHL;hbLCHJ@S|NvNqGm=jkO=mp57qXCL0Zqabd|`3v{&9#xe% ze9UIsYW3`(KU+-dw;Vm^CRQf5pGU4=g6GlRqg=DJPphs`ipx`3mazH{Gur{?unXLk zoYPGF+RnW7T&0k4`I+F!bq2|@(#5k_+3J^P{j7*hyR>=g@7-sf9Nyk~WLlll)3Uva zMpySLym+}n;xXf?dF9>u^AmlOID<CXFuKe0RXny+v3~ToA?5!x4wL#rt2S-=uuS9F z>TRVW->xRym_A=y%gO2IVV<0dx_4jX=RJR3QP=nUxu05(lCiOV;8y#)&c-VFXN~8G z)`*?p5zU|Vi8t%4n|p#^$nD^LcO!+YMfPs>a-DXosb+@W=bdYU3V$Bv6R=y*c&B>L zu3h`~S}}S&DNH&drP6g<fo;(gm3m{oPkqO?6dLBfTOhdCY;LN9%<*S;^qQV9YgH>H zJ=-R$*4t66ak9epO!(?8D(dPcNBnHx2bFg6cuh4ub$xEep(RyvV(<5_y1L8SWxvYy z&9-GNzT1~roPAd|OHNI2TXW&Y>u>nXW<QB^bZA(c>Gv+?-v&q5C0{>Jcy!~Bj<;ZN zy~4-Kpvh<#weFiDchrxra+03%DQ4r<$k5P|y*>3hQ;+Vjx)*i%+eNM^UR!s~xWyGA zHRaHnq8Y|7J<Y#=x_MK7f5-lRr`9Ef2CS^vb~UQ~IPcDG=><v81U5Ray*a5px36i% zje}45y)Q(3H;#GSoR_bzq$%dcWRoVQ+`f!Sz@c6sD7N`<r^?j?jc;E4f!Q3og|X$+ zS=c4@l=jYVKA4;u{9U5GE@47;=G|wDL`1h*28daG-C}iTnPYgWeNODGLkZG5oDyFr zGqk_$JRlZT#u9kCHaxNR`s;Kv8IGMShmIJWp2cyS?axD>NtdSvA7>AaQ(FJyf?D;a z?!AeNm6wOs-}+eBRW^5FpLlR}*t`tI&~0x57Is<+d$XSHHC%JZX@gU5z)PL7-o2pl z%yY+-)iiomP21t(^kkLs>Wi*S-!Fn@1vj62^I7DeHm8m2+G~s2@25P|jPRHt7c|do zo__DDRX6fx9gZ#Qn#+8=m0jJxaL2k+<>m43E_}`XW5|+NUt*lz>pivf-sE*t!U8U~ z)NagtG`pc_nab+UlFHXCtg~EM89v?8Tl~8E%g<l`{{8yKHRadCbjiDlKfletULK$K zu;Ekgzd1G&?Dr-fEV{qt?U%WQR+qP37T=aCeR|XL&i`9~Tz^#bn!iUdH{Lpb(U*za z=Y|Sgi40jN*Qod4xFmaIy^wWpF2~O1l^=AQ7oFf2=*Z@F*;&<=!`%Bo#zgk8cdCt> zSlzK@i`M%uR=NK6y@dXW=X~o*Y{Cyc+4B6nFawkSDkGj2x8<tkS!Wm<#f4)lj=Hd~ zml8Z$cE8-ryqzU@Lcp1qS$*PWQL}Ev7{=f0W7Dg+#?rqp`x}o{ai#kGN!q`|qnFQ6 z-_CqDEcrsxc|MkkGiP{oUz=_T+a0$4>WV!#7I;MNG1y$T?e~}Bsq0vzB5kU+byv(> zZtz1X?vd-B%j)N%XL&pHm``bU)!HX?QY&e(m~6jywAkzXOLwm->#V;kzy72**A}(B zPm}l+7tLQ<f9l0IZmAQ_FF!tG{2RQha>~RK>kre;UYve=x*{WsZv8f?p#Cu4LJt;O zj|TfQ4^--p-(Ihf=yQ9Ey4@4IM=y#uUbVk)@%ZsixvLgRGX$K{{WQfX_=Cl7wmA2^ z^}MMvkDs`{Vl!MB+NEP|$?p65+nn>0wA`7jN+SANDn!@$#LVPd;bZnMu{ih9ts`4s z3fyuL<?LVmV37i2zG%?O3oSME|97p(?{Qx&>hPOst&WY`V(}Eai3hKWu+7god_nk3 z>kg?RQ=aHghvJfh{xDy;pwywA&))GW?a0}vf2o;L%ChIr3-IJrI&9q|`RQG|;0{Z# zgI7PD6aBt8FpB@qi?Ufo_G|yWo7wdcI??w@`PNRK%zL+r<g>QT+M2dmyQMyI#RJi- zg|Cu!Kb31ZT2p7XP%+Cq`tProda-JJi#it>UsI?QKR>(2cMseA9cP5nZrl+Le{`l; z@A}oxDu=lazdaEeyK%wNult^L^yU@6wY&4_Ti*qVWu+IYsy5tley(ZWct`c+|IOcZ z&vYuE+*QAH+B^&Ha>Hl2vv<DZ?b&#|a991^+6~oZ{%8CwxK=hqaeFQns(W+q^Za-D zJNCZ`o2D{P=$Ki8S4#dHi57v-squE&+QHxNJaoCTu;K<UlPl}I1v}~|ToW(7H}m9& z=6~@%cB-dua9zvDNH}-t*P@`D?dnEpr(EXlt&R7+Qc(M42CG8D_f1dyTe_QUH|g}A z-sU<ZzFu$D7G?jusfU?1K3o@|b-W<UXUA(+KVSFAhc~`nWaE0_^KPQ?&c{2?<csdl z+$v(KbXVy9r$$Hnd$y+EO4Sno$S5yAAQ8|nW%t?W<mPLWw<R7;d@*Tl_q*shhuiL$ zemPSn#@v0Yxb;cimt&XT_j<d&DW8#R)Ialn=KQ&pJ@;1Y*Pr|SGEn^9)H{cJoz;6y zKW*t2@u_ZF{VUko?&Q}W!Lu$ICw(jl447s8`QNc6_6N5t{l(~ZG44rC?UTSAzR!i$ zCAghkdV|I1%c?!nvH?YfigR!DE>J0ZXfpraqROo?&t6%*c9k_gSK{-$Mf~KSZ*Qlh zND6MAYqT|CcZ&Yvo{IH7^*5vsCfNI5T2LG?<-xYk$qQe3L~-urc1oIkSME@1ujPkE zr$<|F%v{(0>EfSF4|g7`etf#?z?)8n&Ugvdu9cUS_V=>Bd4EZ>Os9L7)6RpAigTtk zr*ry!b33~x>TL$M@cmg_9x42vu07tGG4uW2OGgjzJEa$2IC#n{|EB%nQ(p4c^$X7j z1mwhCo%$+$>0{x)=gz4|o4OzM+PHJ#=FhXvvpo3N$zjRRoNB!G*hBu4T#r6XGJ5^t zj$z1U*}@qqE17=IzMAzkBX}*#wq1PF@9eLhu=#nP?z@`jc`7$9%?!W2H7z$-{mXW% z&pW%M%WaSEZnl!)XXjsf=;A{sPrlNf7d)fp)JrNZ`u|CV#qL=2WxcO14_@w{G3|oY zq{FvEPCX4%RIYiy&YRWz-HPk{S9lrH)+<gtUEA{agJSUCpR5a(&$;yb?04b5_E%fW zUmpJRq~+4S38noh-)nN`g(!TRnw$I0$)mo*e1GPLpu^AkucRN5FL2b!Gj^K#oIm`= zl1*`DS~_xD>;0yhd$-RCSjfe<DvjAOaq~&uL(Bhpta$!W&gR`ro)^r@u`etHt{GH& z_b8ezYU8cE`XJ%pA;(vS4-}FFrmc?;4!*}A=>GKA#iJ@BtsOIjuPYvZ!6JN+$9>Y# zVz*EGxu5cVo$2|0?~P-Bo1fnBd;RaAiNUI~QJeRyJS;ui;qQc7!duQy=_s#yvg@bY zo8;4P-)8(O<)0qK#v)rk_x7vSkdj5`jGDG|Pkn6sHalA<^z}m#)AUWDmOkc9ef-z* zv|nu(lshc;NnclZ&B<qLSDRiGjy`exC+7{Py5qf~Ig0y_?pzz$8dI+vc=$)^=Uau$ zRlR#w@V|^Y8=CTx?fK@wpud;?Z1r6?+wt-5**`nq{aLf&^50jdS+f`S_O{i}eRuuj z(;F}CO#f_6d)ua7bj|hijjtDz#X6gu9}8P@&Ri^1e!AuVzC0l%>-Xx`{>+POg7&SL z^5y8ie*O3hVV;}U9;(i2Pl-Hhu^?)dS^w9WN4>7zE11o)-LovIXov5nM>UuC`39}J zrmb$J@J;^PJ&nCDJC~+-r%b&oe|MXk(6WeIS#k08yH(TQx=yzFb>7cdDo=CC<#`8n zTT6>9^E8*V?Jw|tXzSf!cp{v$Z}07(8{HeS*2Y=eS<Oy=ab#Wi=I!iTotnL0o!rI! zvBb=$Iy`#I4U@kq4QK96Kg-TySAX7OUgu&9%TCVKdgm|xTX6J-TgU4^t1jo=t$Y2) z{O7$re_hv|`x&~r^0r-j>8`&^=k7|atlfWP3Uh+YIo0R)Z<(_kn)`Nt{M|eEOhQ;R zGwe3nYec+Rv9aWxG*3-#$}H_8&4*)`yqFX=OZM?W3I4kME_ZTlD*WPJJ<?nkE#>?1 zdc97?mSEY{CW4*anyTElcFeex@?OH6?aP8nhmDc5)Wes}-dlS-W8YSTiFs3B79=|a zAF91~ys2s9x~QcQ_A8HU%jn$bzN~B8n{E%T>+bR{HIw{y7wW&gv|ZU*T;Pn(qq-YP zhC&G`_Zg2)=YG-sxT>~&a(sA*OJx7wz>WvCUOhSWY99M^j+fe9ZEw*(s&Lum&<rtg zj}`p$u5l$gZjt?Vpv<A%Eqw9&uWIo*`;P@hdaX;7aejSyeIUDafpOXY2}QFd`YfYa z%%=U?I{8!OZaMcCH~mExzJ6Qv(nggtSJU8!{La`7yAzGtPs(u}I}yFK+RNkEi=YD^ z)sG*|s`)<U=I#3L>>L|kFXp$3**yJiA@?2StMl0l8+S0U{BSlGkz9ECPDTs6_;0(M zym#56)o(d=rpxR#P0wBIaHHp7`L%!1n=h-aa=y)DJejR9CQaCD*C)ecwlg^IB&0m} zy)HvWjw}8b_c`XzRntC47|eP2P+nP0K{-gqDa>(an3Y|PjE($^dOl(H3ySX!SaUo* z#uzb!J=S07U&0f)3(P+{e=|?!zP{*_^sDIsuNPcnWGVRF$j$ePl_zxh_0#93p6@?; zY)-k*nb_dzuGaTUlnq{_Dz9Jq{=bh`u{)1gfm~1sf0s)8E_=sg5%(2iHFF=Tnp~SA zZ(qQ^E7^(JPt5C?jmaq+Th)41qm(OR7xIN!EQ}AIk3VaC`et%g?bh?!-i*}^IU;BH zE1!I25;|-yC0N~h$8byUw}WPzBJ97MkY~Rmk-}OU``S`l_Urs#^Dc`{PWHOFT&D6D z=Q*vX4xTB$l=;+leBR>KD9&;@PU6<yHAmm<v!77^%RBg6fB&kjzn1xZ%umSjtj}aw zzGO$hB+p`{bw!`PO??w%t2O`1@#rtBHxyg-*zcVv&|i7-=7v()7d@#ub%C1Z`XyGq z`=T=WuB5zd-{;zTf1*aZobmq4cGjOI_J+q#nP$A1C3=5HjjdmROPz(^l%F;e+maXm z+<yPb*ZcML${w$lF8)=yCSI0#(q4^gV!Q3?e>J4ArdMBcsuJWdWDBj}Y}|0z;lm93 zPdNpBOD;ql%%11nU+u3Zb0NC^*K6ljq80x_uk5wZyV~FUq`koKj`aVVNf#CJcD~<O zWGK_NE494Nq{gpA^G@8(6(Ra+yYjPCHgDfwsxoOwU$Om?dw+ZVZR78qJbT$E^s0Na z#<k36@9M7^_Gx`R73j-#yg@RlT_WI1@Q3`ib=>ze=3iYc-Y8P%tyFA2tAAD})6+Xs zEg$I4<7%61@%QGH+pU3O=e5PxN*?_ADEWO%`|W>o)pZ|F4Nth5o?e_%7#shwp{3O? z@BC(uyFc7pPO@zj@&3W3GeJae_5V-li2?C-taUF%_dDy<|2ng0r@l)=zV<=+L$)cL zKWZd{_f7jBv@E8ev#h-HU#3g4@eJKa*X^y*5B?Wzt&7w3JMD4%=Q~S3{f9F@$xbd> zs%g<{YVOl-cS?1#e(cUgV%sGRcYers%w7?m{y04T*!qT=Pbc$M-deEDuwak2rheDd z$6>o;`t1_bzCSG5T3a8tI)v%_q1+AX@~du2`ETHJ{V`qfm~o4WU)Be<G{yI?zRq~K zy}5cSlX62hPowII33*E{-D!I%ao?8d(JB>tj*`z;1^gyWSrpy#y4|~f7js@r#i!yK zX1QOMud6BSsb*YsNsM==$An}y&9q|;yel;vq?-S%d0yfC>h$)w{{}Ie>lc<rOq+K^ zQ6_rA{<m8g>egt+Se9ANOPD+T|G(<`(pQ1cuPk>t^oh5>Xs6;_?v;}Nw%1%OIDUB2 z`g?y(em}G}PdN9%P0!V1t>MOf?B&9#uCCu%?k_NCXt3z+w%+-q^4#Nwz+jhbyWb*T z%hE(*yLXG<+4MmCf$2x7oExb{AwtLNRX5~nJowW6;c)oDP5*Y++|d#9Kb6kDHfm#O zfUewD{#oi*7dJ0X`n@7*jokF8rPux+*sl7^ohiX}ZSiz>6TMJzvEmcF=LP-Fhimru ztv}8yrn@}mOpxJ`Ye%}QLzuh%tx}X@+uX2`>->uoUoAt{FAaSy&0KMF@?_ri@_w}o z!qVzDNqq40Sm?Z~KVCL?Qd?h*yY8{z^U{anEge2B$@nhAryemc^-hh&&t0!M|4*`X zX3~F>bXsub@yqO%{SU6a5ZjSsZJ_s6d75qULxUZQj`1t=#h?1W`usA9q+hiMdK-I! zg$i_jF-db={qb&9;o0dcO5^nB9}T<i_gzSJn$P9r1J?Q9JIiZ=g5@fA{5LpvW#-J6 zzYogXo5S!d<eSh1K3=tmzJr;&Rpy+Z7}Q;Pl->T>sWl3RzB4{_ezmLU>vT(gmWcY? z=j^A7S*oNO<y2mX%I(}4;TTzLvwuSA3fYxu(vga_WxaM1?e4l0^K=ap_Skp$o^~^A z$zpoBS*SL^_s!l}5r+D4;iieZWKsoQb>v=J9;B0{6CA$AwAtvZu2HD;qWWjsR@r;i zW{51PJR_*MH}Bzc#wFsSzE|ex>iHT@yYbtq>XQ=d7QZzGD^^b2;uN~tbdl)m`T2zh z9IpE>sr*{HTjgF-uaU||CBxszD!f|U=VF|1elMIZ`;4cVdAgSXi&K4NbCBZQ60;S) zyLuw}_6Sd5-8_?h-;P%TM)7?dFXwx$b?E$&?6SAv!I9)z%~#w{X16qaKf!uh+h7LY zndWFQ$qVdmGg1q~E$*l!ImDXC1@Q?#jNoq!_+XpG9lq$O*}Trzma*Nuj1reh1kO#E zcv?Q3qfMk)apfY#FVCdI<rO|LZk^5}$P&bRFzlklgh_wxJcRpC?4F)2$Ra1nB*S&y z;*Ctx6x)EHZwz|kR+`L?^J@0)Qk}j?kj1IKyLaY|6um7%8+p$iIn%>$STt?Ni4A5_ zyS&bxd)mML?dxcsxl3nW@XVW#7^t|zP*hX=$jgZ@Evn}os0^~6Aa<JdU*XOhIjpXS zf|uQGzY?~q_EfVL&!2@~vzE<_)OfPwOF_^n3+LAo2cN&#qLMk`_!L1mU+=Drf_*A~ zmfTQ?5tXYy@73RP`&a{K=BrkrrHa0m^DAYf7L|WheZG0tTEkB^A8eY>y}K0Ay6IU_ z*?RN9Kn{Q14Sh}#r*6-DoX5MVz#yvFEc~*QUA_E#W$)J~E-gDP%}{w<YUSCP5^4@A zOQbm`2aEA0S=JT=a6ic^`oi?#g7i(+7f%hp#V9Xucv+$;SKs?vJn7=m#kVR;gO?kd z2_3o|wn_bshD&r=y=u5^=?t|KcLPFV6`rNE^M8|@@!V2Q(nxWMg}{-5wtx)FJA3Bd zx}`fozG-E;@V)ATp4OSuqfO^Ny6QN&A>{olub{q`Em<LQ8UfoT8Yvw+Kj-A{&6hq2 z>b!PdJ^OO1u0*-a(oWa<qKU63m}Fm@pk1P&7n*gvH1)#S=(f%CHBKAsSt2(n>U6=h z7iT9YZM}J=?Zvc|1AK47s?Pk;%WX97zgYeC=v3#ezaCgyt=c&!*K~0L(_Aspy>=x= zY*!|q>-sa7J<Z`C!x#Q1d($@r9$d9F_UT=xg2VDQm(sVsTy|-i<(B2ePXrFuFWXvs z>g@|_xjB<3DfE}UWR=*m&G_6ALuN;_zZ@@(zvi;<Q_jEp>t@`YGxv>N*-iBO{muP( z)$WjEFHUS*>9e?aLZbXTQU85&=7(yfZ~QI0dA`P?_UV&4`qu2Nz4mXteE8gNmOt<1 z{7wJ7X|L11b20~+A3s<Wl;in0L07|L@lWY>_5FSqIQow(DF_HCD%j+mTi~c3`Tf+Z zJcmV}3cs!?Str=J>5kc&iJWbf346+)a6b$_y-4eTt=Y$g?-+0VxFB4uVQ>6I_xzEf z6@T7wZRAV&@i*az*wcB<Vh`p;G>F@;i{2i7e_j3w*XOsxFa0XKz3+EXY4z`=wbyrc z+tn;C;4pWszs@w#gp2*IS?^_W=DU;M)}}<J+%(y!Gh>Tp@{KoKGSagvV|1rSFEve- zTYi|YJ667S!iUZ+|L^_z_4l+^pk>eA*Eucs?W~TNR!_WdcP^CA{O-K_8iHC=i(V>S zQ@<Y`aAaM-nTO}4hfP0O56+mW`_$yxb9>>*zqYveUA^zbFZ88;v;U{H>DKoQqP^C9 zUaxLwuWzPzq4LcvVdd%S=aW~w^cGK<6f0GIt3oBy&S3WBsI{Sa*(S4X1ox@?N?sHZ z7g@7r`mevQyi7lB-lj99=FsDFg)`?$tY&t)dQNMt@LUE>S%%Ut8o5`jRA=^`(uq13 z@%3}nUnlkNHHv3ri=8|j4eLXNWA~nTb|OB`LNYjWs@^Nt-V@UnHH$?SOmV7TIYr(1 z)vgKGtF083Q=N7O_%~Mmp2MuP_{SBWntxJD;x6Aj<iNeAL#SkRSm>G!GV#@pS+CMu z{Z56vox8*2rt`s<UpE=APY-)o@U$amcV$RU_%ZRq{<J>*Ltihl2hTrI`TNcB`lnB? zetjyfSa@m8RIjIB9h7<<e-+ejX*}X3{dV;M=GJDnT~9AB={wRSxNDbALtJO6tA)z} zH9-U8H>QdW-#1;^wCVEN8vm27pHKT*PoJHuu~XrZ)28g^Z!G?)yAJV51~7&$*sZf- z%feTCobK&>HScn(kj{kSbwTeI?2*_!=jN=gdg<vCqOVMS-4?xQozC2=e&@=!Uw+l) zAQgTyP__Es;ZOB;H!f}aruL+Xd*k^>+?h*v3BEHHW$os+w_dW(P~!mOB%SJ_mAPVP zb_OpFE^eJ^c6#ciqsu;hG&2moA-2my@+;HYFSqlT-mkwted8yU$!AmJ-gmxE3SC=$ zcFUGk|Joxj)Ne99x2<XKt;)+>YuUC)1tpp;*|m<#Yn#WWwF-Otyxq_Ks+8$XxA&a; zWtYw6o@1Mt*>?TPd0}<Q>YH<=$S<Z&)=$qoRvcHkJ@?#pzMZ?mexLgLkE^&_uk~X8 z=TolP<yX%?YMK6oFT?jl&N|1a`{#s(9|&ni=!w35>iae=FJT#H{m0d-Utin)diLts zx4)IX-hbKUX3NiMC5HWC3xBa~*Kc_B)AjF~%AQ*x?zvhu$IrTHeUblW|K{?}`U2g_ z>d9+otDoHd^b^aXFxHNDD+*2+wdI?8AHVudX3C-N*^&FdyT1*e$~6DL^k-&)t7mg3 zf7_D1QmyZbNoNB8nZ?(Z=u}PrS>J!*!^baQdVM6U<{0{P<efgZTX+33%Xdk69eZZq zJf2qc^ZLf=y(|4bYjniQ&s|`sCuVc3{nq}eDxPZtW<;K=o%(an_NB@b-^>45bTz|p z_j~?L%JZWaU3}rGuy=!abxEA9_4Ska_k*Oqs<qka?Ve&b>B-3phLS4p-8U7TOTF6V zQ|~=@@#Do=x^L1J9?h9_E^^MKM{lN`=9`=m=(c{7;HuAIO=i2weZSl}ySCXk??K;p zLA$c9*VkE$tuI$jN)j?td+HMGdSqo?qtyBAt2Xym+|b^+OEG?ZUf#NO`i;8z^_i3T zGUNYOUHw`1cWZ6!Zr9YEY72ku%h@>Py+Fnqo$ndx^$FUQf1>XTa>(wHSa$e@z&j3w zO8W_WB>o(Ja6fIr)+omGp1+B2@^d#Iyb)i)nOtve6|g}0*gw0BE{WgO)|{6Ge^>9F zx=7W?u&=Z5%m?9~<ad0rhJ8Ez{vEeS+copu;m0!=&#pfH_1ni;TssnXeg4MAbA<2G z-0L&0OUV^vOfT)JFV7bc+W300u-}U7^1KT*FIz7R)Sdon?X-JRhYEDqHCA0)9buz= zt?S~geTiFz{g)lpoAd0l_m(h~eOz2oiD%fk9QFiM)h^aHI_&y7cA~^Lr!=RuC}rcH zZ%(@BIpsO!MX{T=x>|8BSftRS`)$%n4}ZJ*HwrV>+?HkBBJEgv`CYy7$9GST2FmN* z``MSwnc|#s*nH!|bTLtbWd8$gPD*;#`3h2#wG$mas9!JMB_{ohBWA|s2Dh>z&0X^A z4xIJm$x9Kp<J>>%$kz>0>c_X1y;k8(`El~)zsZtyIngt>IO$LS)HLh&wxtKEBR{Dh zay=*)Iqg-$r)jfhCVrgrIBWOX_<H-7lK*a|M69ljv(n06#dz7uQBeDEdEE`p+cu5s zX31RS-2Eq~uqylBoOVu~aPwUZy7Q8L=3YvhENrNwwZNt#?a~ID%~wz6D)$~*#_HTR ztH}CI|7yjb3Z3dJxNEFtPh_>-JL6B(G{Y^`aZw&?-^`mb-|J?+v02XD?d8+nTr<n4 zzc}eHL$Olrw44*mKMP+F&i<WrrY~nhhr;O(H&gxi^&D5vSD5+NRr^&dZ)3OD#;bP% zR=y}ruQ8Z-)^n<Jjap6GBHNAkpFRA=%f8lVci5d~&g<^|kq3?+dT($$1*u2P!l_X6 zN?6PDnN<_}*8o|25%wjgd8~vcc-OxXI4rqK%zVZFYe_5Jw^prQwDLv7;<FPtR)a>^ zT^DtQ9$S^RwsV@ObJV(5<#W=sXSv?G{lHAO;&APPDaR&W@BH}p0MGr8Lj9ded&?@E z0<W^4e(4>}V6&oRqT!llO3PRHKA&;aa?P`&=g#o25&B^?t1#o(Ldor~W&UXy=asFx zRbRSDnECm}gpK>YBwS2#;O2k1^&#iN*5wCfKB=gsvi9!teXSf}VDjt2i`$BYbNv?g z-)4SRxZmOC8_va3gamu-mRxW5<LI^HeYQc7o4?qitYm?g;JGI)%Y05(2e6*gwkf(S zpEFVSx{K7AGqLi@=hpfEUQ`uhdtYUO`ATp56Wvku!mGl+&ik?~&}#3p)K4M)uRLd` z-`hW<L~et-^Rq(dxS0{<l}VfH9PRRtJn&wnp>fOice?q*iz`AV7R#S`!1(xY<NEnW z8_GWXvM4O8y};*YE%Ek&DR+qN$@VsbD8CGj^^rwuR<(Ux@Z+25<yGuQ(><52US$;f zuW8;P<|n%iCT^_fd$#TTFP<qMww#LfJA5s0Y2>{tJ1_S7-z{;A?G|03(Ne4*aJoot z=FYp5le2}UIv%@o%}3?TqS;aZU0k~(OLi}wVbJZTT~s*REAXp9y_NmaCx>b*!GZGm zsmYAPZn-<Vy*A!mw@`O_%IVhEi;wF}VViq1X-mcS2SN28zMWlLU&^G?+j?Xx^NB67 z`&X6jc|1Ahx!%OGFFg@9u_7_M0#kTasQ+aV-G0f%JTLmo+l?o>eRu!Nco*^fn#UCz zj;b{Fw};9dc1}P2^>MCZP4-OfT@RGv?l)@AFk1UT-D#mI-*>Jzo!s$0k~@lhHr(C0 zPI_XeiR%20gmoeHtBx&wFYv4WLBZr7%x+36AAGT!@M?B^V}+o{f^X@&7!0<(Ntkr~ ztgOJt<Dy>`zT7W!JEEPYA#sIY)=K=_!|t0tyD$H|rWk%*Wy1vZw8D8QQkubBAGM3? zu4Zn}+h6)`c1`}he@fFI{aJN&PwxD~i|+ip<fb1Ge`!+M^H0aGfBULy`TyEJ#q0O$ z^E`jQ4>#X#-dle|=zSOa7rqRY%i+6@_N4}fYq&?8E5Ek$>bytu%MV1}-!;$q@3NTN z({Dd$T6WvL;enrfk4Ma{R7s)5WsI89JzZ;}rIxd6=D$_gw7ok1rGR9&RhoFigky_Y ztC?FKe|~f^Ffw0Z&34_tT^yX^exF}5rp4Xyxl~`e%1~_DUz?39iv-$OHfzn@-2c(# z{;t*A{1iV1K0g=;I)v>|`JEhzp1&D&H$TKYPA-{Qf8+lK|L6Y>ZWS-~31)8k(aO1K z^5hf8@{<{V|4zzz|M+^=<(^4BllKN1PkM7@6W7IyYsHy%NzeUpEySTH=l^9sjo2+` zwmw<1-KzBK=K4z?J-w}8s2INv+!&Oz?!4%XroLy!j1@IXPJ9OvZu+b){NdasTUg;a zv$W!!#A3zC!B##(2OR#TZH@ZL@Nsuz>5eD=?l#Y{Ezc=@Ze6Z?aN4;&x7L|vt7p#G zd2-icyA8|dY)kIkJ@4_|%5t@8iwX_VKE8)f&+xt~TDUnzzun2D{{K_Y4bPANyrTEj zCE>un8Q%9nvo%)=H?DPZ`*AOJI#=Eu&th8(BgTfC*&a`dqOJITengqBsekhCfnM#5 z`68Y-#5cX0_-0yCRs51Kb=)ugHLo0-zc@<)I#0vY`R`JApu60nD`}HhFZ$%PdnC$M z6tdLI6gjc({P*#xH=myu%TA}s(k=dfCkC8<Y+G^17}PD_)pPUUS)Mx2U5vrcQ!Yn` z6}7E<&1><}@PUHGfhV8bB{%~V#Q$A&;aBln8MA)<Y6BCc#M>Sdn7+;XcJsDlL#C7T zqVK!dWo{mD`1sV!WoeLRs8&}-mCx(eyU(LGUR#x4e@d<De@zls?<RXL#pJx>cWxd~ z5n2;o`)b?T9n;fOjQ{S-wyd+vQ;(KE<9jY~($&7mOm)?uI33wi=~vt4&gOq*cDHo) zao>=f6*mGlE=+Ph+Sa9O+O^ho=ko<=-m}xV)vC(E*0M)&C10BD^7UDn`aRj{d<_9M ztLBD(wZ7ct5K!;1VA;vU=aZuz`v!arQ(!r}tc3Z{nOEx^bA1>U%fOSY5AH1PpMFNN zu6)Pa@)aFj&8`lCwkH<&O**^AdWEWmNWqsAAJ5oq%seRVw~IqJ`{=r}O?xz>U94Bl zSE?<WWjCQ+$ROkthiP75^{S%WV@`)leopcUT=39ybIr9`Pu%M>yly<X*Z%9w!&c|^ zTNj_Kb^m@nlY8mnNBwpt&uu65{+j1=Teq8Y1IN4XP0{OjrDd9aSsrMo$M7cg|DDI* z<`?guTIa6VVZq3<=WBuqlVYkvN8rT9m;06)E6tv9dG=|Og;rOtUAx`iage87@6~ss zSLGtFxinVX7v$jL2oke9aI^lJbza*ir+u0d%I|rfUlUMz+2X;`V_>}hqQrZVzbRE; zKAu}@ws}%{hk$#Ba_eGA&BaD-QoLW)U)%3~^W}Ww$4}2~4(>gCS6%I$>?`3HzvCzW zU1q~s!@NYUNc__CvtMR@+?;;H`?+oG6Wt}}&wZHoXxYTGe{ZU|E)oAEeCfIAm!I{U zf2-84dY5y_d=lqPj+dXMex=m(-zu6WxA`y6GOs=5o{0w!IcD+kSX{ZAu|wJL$JEX4 z*FXNrDR`+^)%|hJ-Q`MM_wO$A=Tr_q;qEd2`{#=>dB#$D)mb|tLVn1m%|4U-to&Ab zy4>RLuev9CGXK}zvEjV-CjS%HG|DF0<uB|1eYrk(o{jRv37r!l+~RpV*rsF@)=#Sc z?DC=B@wxYR^@@q^huL_g9U6Sw8MPj`&ifMkb=mu8C!Ifha@^N)#q{Shv9pOTy-vOo z$BXY2O7Jgiyby4~;DrTy*(1r5-O>&odn2;8>VK0}yqdK!()xa6i_Wz0N8gym_hfH8 z;?$#GpXex`*TBr=w|+YBr^-@0_KrK<cXs#R(Vj7XuGNobogTGYGThl&d)aq3PoH=B ztk-89e}kM}LGvZ&Z@&yavcPncz@_JNbwom<tyGuZ<S@OIbv;A$+F1rKL1P0>?pGX5 zd!}q$dH(5=iEX=m57+mx1Y9_gcEINR6XV$9-{&T#seh`E+i>G6pTd*1Tm4rZ|N5;k z(psUVyS-N6%-1Og+;?TWeph^IW++p<tzV$)|6bAmg|&RgmgYX;KL2rUPTDg)lV4@F zzqSX=;?Ugo__n~~Q-PNv;xp`<wpnpyvraZlj{Y*Ua`WwCd1mfAZ*MY2IBc}kG!Hqu zGlaY9$d7wTH6F3y>+1KlRQ}+a*yrJ|da2c4F@?Kc;Bm*tkfc5OccnW&O6s#8>`U-h zy%Foa!opf+8)v-IHNn>_kL;4L=x6Qznpp37%V2VOM}<p`mf-ofjGuSJFW~u<wCtYZ zBf&ejX6vmgZ9TH}XzPCFk7+rxcXF@jsJgRyzs56xrz>54mYnYhNsg(n4@$hY-)>FI zFQ%_Yuk2dp7oQLt#+%W~<*Xd%)Y~YPoE00q+;D@Z*edQN=c^<*OIcU3-n|&3A!2vW z>A>IVu?>e_``0~C?EkyC(&FOcTa{av$qF1gdYJj<Gi$!*``T|f+}6D)HPf#1Wqf>V z;(1TG-7e3MChZi;{(q*f$=l?#-qQNAomGoe{&Bq)i<=c?{{2|}wg{7X(eJ9)#PGO_ z+`Cjd=eOe5clkB1etz=Ho0qog)y{ya|4fR@UrV@8t$Mm5Y-Q_f8|x$ABKKBZ4B9{I zfmSWoe_f01!6C2xrUmg9u%3I<`(}6D|8=iz4&FTdGhLm}=+D3I{`1c`c&bj$xc=l3 zyM4X*JO$N<B`4xNrb~UVJum6`W_F*8$$P>6zlM+GjGxO1Ufi(uhRTuzkJOZ-OOJ8r zU5uKh@xUl%yZCk9+}7)QfedSJxh}0L{PwK0dbLu>`PhIKuN`*hUe74#_|Pf;a?jMQ zL6ct9C@Sn(asA#pk5<Rp`IWN+mz<t&wYB8^rL~4;ZuLgJkK_ekJ}fYuqStrz#>e>o z+#7eCJ@P7L@@wOw&i50n3gu>`UrblL|MSYGdCy<ZJ-(vy=tqr=Yf2dfo!9oc%sRg> zR@<y!yKwXTzb=b!?!SKIw?cbJZk_L!f~9e*!~MG+iX`tZ6k5GgdEK13SFB@h9AV!Z zEz2+Qwf)N79;<u%;?t%5+<$Ftob^~BRP_7$&sono?7p7#T%=U9fB7bk<S!oz?taU? z%X7TQ;nxb)ojWv6)nELyHrG-7$?Ypa88)_01%CPbU`a`I?9%hJ3N_%2^Z31g!II3x zj4qpx3Y&|5HNCXCb@@Fb+vWGu6*O2x7^hD+)nHMqPnzev>C<#plg(4(<qeBme<`cE z=-G$;`o!I4T%xNtH!DnG`vI;y>LG`kD(C(A7I4r1w|36@MPXHfEgN5l*=SGo-uQ8I ziGJXtZCm7+>(<%_=!Gqj-o;zF`Qn{Z3vQK${H|+#{C0g)c||ePp5U3;OQrQfo?fY3 z@!I%TkkIsV2mR}l<<733z|b4Ba{V>VE@x4Nrm&`ML6R+B;+(5o+n2{$uDV*jeR&bj zxw*%iKF!^7)$C(}-d=%K_vWSVQezJ}wP4*Bz0zsU+>@Oww`f`}k=@f?Q};hP&n<nD z-*a^-&ub2A)Mg#3x}<q9aq6L$g$HV<_-V`y(wxh-XMaFecA1yPy!x_eo60jT4_gjt z_8vO<$oZY~gh#)QPuK4#JW|1BsCSoH{8ypE8Np|(^M7ZgPdT{FKeE0f`GBP2JeI<z zWemrRW4ook?^xf&<}Jl5mbH^v^;CDOl$18dM-itvxB1U}W_&DuR^L3=#qyT6=9ci9 zZ%@Qo{)<nx(4TrS%5lPS!6$d>w=+DL@vMcxU;hBN#%aM<oNn<-SGF3T4$Tiv3{bt0 zZ*70Uz<thg{^w$%b?rCRKF|0$_uI{x$6xIIwdnuN;+j{?zb@*#{#YJ*ruvM0WkHve zW1oWm>YMBM-e%_?U9h!}!{5om)c4MN_lD)y{VJEti!HFtYgTZNW^J6;cKG0)=z{u} zN#EZ_hF$d)S5-T&pRqi`;ryYpGTt!fpHp(W9V@L~t$V>c@%+yE{em3D;`f<ba=UgH zd^Nksq5*A>2xrFC-eok%*(fX1q$tVrxzta7r+vWF?=kKi_nwM<pTE!{KH|yjfY5&; zADe%0eo&TBz9QuJ__5-~vuTStI#WFAXUNs6@EU!n-CkJn<HwH(fqw^<upX9_GuoYB zXlPOM<oh3kDYoqOJv$2P6D;N(*WsFanXjp-mwjP?)d#+o%b%CJpW<7QD|aBXyO~|j z?aHJ7LGcbB6n_ZWF7$Vt=<i=Q)3KhXyY+>L(7Z#-kJ)N$j|&J)ulRAigY&=?i#1`d zx7ObZ+*$NO)+L}<;O1lhGd2PI)&c6ue7nxnrxXR$_U~%m=_a*8@q2{KH<|pLRL<#= zd)S|*FeX%9m?x~!W-eNjXXov}6;`n4pW@e=ya=D3rK&d0B5eOI++yrm=)GN7BD+kl zz9u*R{=Ee^96egXW|&O!;!WyrJM-8rgem%z(ht9eFE&esW==?%7BcDm+=WHIdD#8h zIachEyOub=+UdLGKC=aS+U8QuX+Lj@{_<9S@r}9U@>O%`BcO$G`~Ji#E>zwxqvYjS zEK|s#v+2R?=`uPjip=Jx+NV3{uqf7VpB47RNlQZXM5ur6=BLZ^ISNj?D!gIpX%TnU zFZ?CGU^dGYP44^RCnA66pY_}AxZ?WsRoA~g+?XgR`qSt3N6z=R`;MQnN#y?&dEr5l z4d)J3i3<|~rDq(Kzp!DumxWMev4vFgtw~FFq@FBneD>Y;_^j9It$Q{e-($#nT6`w+ zJJ))}ZilYx&sJTDY@TxbUJFwP!^|Vjnx<iw7do^|Z=5l!Y08XgJHE_gox3O`#sAf> z0~>hqTs|oNI3{HmFh8ix(<(xEdYEFWSo1;Et>TI?$IY&ms$Y7SJXdzrGp0--k15T& z55)y6XlRzHPitFc8FFvgVWzLPmA`&m3<_s%I6SF=vA*eZkhXM*3eyDt%}yC?4yV&z zdDd0Rc@-!088f|B{&tY{lj)u{5^DZCbZgvvcNqO{-D4!Uq)@?Kapt5-osAz=H{F=W zKKm5!rKe_J=QXpfOx&Siy=2*>v#zSwy-%qJFKaoe%D&QJvWXVcNnJ+2c-i?~KQGRZ z2yOhc%3`<3!F@jUatA-meR_1miK{n0onw2nK;n+}&j-6C?@T_u`sIQ5*6Ut#ywg6{ z;kCL)Ucpk7&(T9YwDwTbyNwct&gVES)g5A#McykeQFffm^O0$%EQ8+R-%1s1{yX!O z_6fu@?rW+_n_S!Aupo7+jc(HkZk0`&L>c1tnJjDdwoQ{h-=X9Z*igSHV7=**?rYC4 zu}s~zY?skN-)$~@{}#XhFZ1eW(vNjhZZ}@r+p*}b!^Isvr}tQJu})a^L1<rFb?cGX z2OkyM1e_Jy7AORKnl|CoKCV2cGYV<T42(6ErYh7nMP+%hdFJ=7SkUX>&l@PRC?jZo z<|&?C6UCQ17iYXxh;!P*a<ymKhWbmKr=(Y&-DL3n>5?D+|LGg*9N$s@gy~@O1IcFh zw+cSZ>Kf7}8w;28`?dQ-IWQ$QZ{SR1mV6Yv;3r>d#jyzwkHsf;dt5D2c(9~>>56B~ zSAV`J%ko|5Q`^k-P-2dgjP;#wldjvk#hkBvpceD=-vP;=SqcI>+%uF+4m&K#JhmgZ z{>r8~#|!#Jy<Qz~d-h|Ci+|S1iN{$^&g#?ul(j#2h0kimKdJiyPxxM1x@oD5WS;`_ z(dF~xWm3-mQFZ>uc|C)_&V<8=CpPoBv(gshSBJExul#%4-mUM-xyaj!uUID5>|0yr z@-RG6{>o>IocC-#!hfplB<zigD<|o;+w;#pnIusEuTJmJU%l4{&m^%ce6@e$y+5C! z%XafrnZzp+6YiZbd(h!&ut?89!&t%~<NM5%Ltk@Ej8wQ^T5tI4o$Gu{YjQu&@sDSA z&pUcIM{oJIX;<Ifw)v}&*>mdsYJc_nVJfFu%r(1iehPo`Jx4QG>C>v&n+~41`r7*N zB&Ig$Pf;d}hWF}kJ=pdq@!x`!eim<WF{ig)rzJg~_!KBe%1-+5hmrlJNSB!_Z*$+3 zMJKMBNz{1ORey5ca5=Yv$H&A{+p?JXM`n%8t>ibI+*>7g8chD^9B^mh4(=m&m(*O^ zVi)#wirOsWfOCqoS5Nmp6Cm+dduN$PKyByu4iV1cNVN_Vms!6o>UYl4OS#MXv`?y~ ztTnlJNlNo}!5fQA<SH-jVE1{-yymAsS-bS2mWT6_PsZP1J@K&cFn_xY!|KcX{$AYa zCfHKJk^8&Q!JA7U^mpmK<t}R!!j#rTT<V#3cm3nC^PEE7$;?6#(QFrm7d=<^xSMmN zu|t~6jYG7>i$nC+ks~%C52WfJu@oBhPA>2dKl-fcvFL)nO$RfV?6K05oO`jw*ppxD zX&Ji^vw(v&lS0Q?mLD_wFNvJsKiJ_|%aLg%_h#~rA{RCBb*}TdU+p-T(~!;@F*j5z zeKOM({X<#LzA=OyT*?x$aPnU14X?KRe|<c3d9B|*^XUIK_vEY(x}ARcf`fdPdi?^y zch(9D0s?`%JPK~{Ze>?W@~e*dvm@_rT<z|CisEzg<2_#=&;9-G^wqa-r+<rmuJ=no zmGhC>0pI+T`;yFQch-ko<8|C<zM#R^=?F_wl9cc~<4tGhuK3>(cHFOF(ckaSuD_2D zD+)F5?dTU0KA1S6V5Xkl0+GZmOEMcysVz6J7u5OtFLuY`IlNlUbJ|MzH!XErIZu6? zOxvEYvri8vM=w_?zL{C~zjcby@0t|ugWF?2^v<?CY-Y;D-?&}(fv<QJ+r#hKpHKIf zskuo#Q(yk>>C-5?HMJ&nn~vXEGg0?x_Xqo*2^BxCymw*kJtVfEqr&CSE`j`_TjdJf zb`DBToD1u>NItX_%l}lras4t^xh|6<4|f$>gm-`N-QW_Vq<6o^`&s2D@k2{QScI4| zz2i=C?{mvldYGm0Kwx_G@zgy@aj%4w{REe1AJ4Smd!8_x>CPj)yX@zc93FxuE5UP> za@|HPM|f1GW&3>k>~z4A`MTQN2EWDsvhDr1pPUdbU(bFgeERY#&V!}>GhYch#&=y- z5RR+0d^62(-<MepTld8NWx1oz?$TTRW8wm~ZF@p=t~|NDbH=tkMzTu!Qy)5sxV5i8 zKefN--OMY@Dvl;Gaokz^d~GXb^!oKyT;BNj_rfP<D;7<jBsf`mk@BC1u^NXbCLW*W z67Z1SqG*4D;pR2B>JKH|-ORw^vLGO7)}QvL|7#p#v}(f61O+w}Pe{;~3gQbseQJ~X zbgzkdR{wbFmQ7<6TNt@+ie8qKZWBZ1Y!hW)PVQ66(|^C+e(C-G=bmb_Z+EJQUty8A z={DGr?Z0Zq+l6Kh87j`nF%L6)_^005f6Fj<i$ocZ^6Pov)%c%R)fa`c*H@a^S9IU3 zt)C$K^NvujoByKhM5E15EUnhhn=AiTr&26^#>MFtkDFaGl|AS2$Of~rE3LFj@6B{w z*1FLB3F9Lf`OxgIlkAQt`a7>)*!6r~T1-FZGusVk(u=CRx;8JI%qo$kzN7emU1Y2L z^uAeNKU?J5{yy1vH1qmapWynas_pDtC0}k{C|wf&?)<K|+*}E>_MP_GGIxHV&H8QD zbMs}3N`1p-d}mv}qi(LD@T`e;f974>YG^rOp4KTf+3ELqyViw2SIM}(qKyG*F0T=D zE>Aks*Qk;?aNFJRJ+liZm(RcPfBxS5!g?>6$lw3MtLEC~JL-1Fgk1T1Y!%1Fg?)?I z3(K~rJ=^M(p^)x$NbTTh%lH4@$J@_s$!>blGQn@&%3Gq&2TJVsKd;NYZFt-={&k({ zJ}LR>{|=ho^LwnBrFO(Q|McNX-d%BDgzK|gn{}r4^FLALs1)D6DL>F{rc=uyc7t6H zzxds#zq+S9p_yrUYz2GmjV}|UF8q1u>y`Z8+JB1Fo8pPavd5OSlobARQ&13KV3b&L zMB!<f++F#c$!1*%Jw_W>ACyo%romb|(ZH?K(5okqOL8&KjC<30nvyy`wYwO#X&5i5 zH*}F)8gM`$m1%}vLH&^kRs{y<DI6?(EIffp9Yxmt^>%YN&oP^XWZG9`)2w`zBt?!Y zJmo)`!V{F{!I(V3$ZKJP<0%${*a!bQHgZ+mF1vN*MPT>0JV~c>x~poQ%b$t)ap`uL zjOYfXEq67AEc6%(KS}xV2ru(*Dofg8xOSdxyVPZ+a{-%|e{j5_kQGyZMdMn6(W17` zi<zD-2(nvsy|ww+p=)|RGj*q)^KQ2{N-euMmG5ZJ_QEE8{VRTHKeUQ6Dg*890t*?F zt)DE)C|7CNJ7MO8nMx^Yb}vPCa_;2ZsmYZ0sK=$+H6U=p<_*RtL+)74*frJm)>}V@ zTgy|DjL$Fp?X-rytk9^To4+sfRlV6J#Z3=)-}un;YjOTd;|&YX3QUhS6S#U)RA1!p z=Nm@5tz@5emZv;>^meoNzrO{nd3?zQrrSUDeZOe1uKlisrQMX*>X{0M&!>IAA5!|` z)b-Olzc}b;FVE4*(PO*&e8PgS#RkdIo4fDrWc}09T2nW<YVlfSmp4jFc1#o$RNC?4 zdwt2_oE(t@O*JLw?<eeX3D21kzwdcd+B&yOGkR7mUHPVKp-AX92iMR3iO*aO-<|m0 z-~H9FK#ncdf68JJR$(qRzQg-h<^>xG`#0=Kx}TKcDA=m>idQL%ZH}!)zg!f@ji;*& zE^!EMV{YNRtG@Yxx>F+Gde5l1{smJ!o35-6>FcXce&o6F@|N4{ZGJoC9G|t~+>u2` z-l(euNDAJV&UfKV@l&@QMyEx@UDO;~uKOge+;E*|kv?nCzp#kt9{uTA?7gXbD#V5N z>!;s26D@vNIMXz-H#cQ{U2$psU8U5b;)k+rlDC+(?R=*njqmcjJ;6$7XNLFnqB{LK zzOJ7y#~quZS)a-leYW65LsVXJ$cF1*(<HieHwiyYS)_HJvpQ$dR_*&n$0RbAEII12 za>2w&dY2YWY;xm@x0KS%SaL>MGt?v~F4jOwv(qGKRmPGf-CI_g1l6tC!?spz->10| zx-<6QXWjqcKyV=AhF+shyk2a2t3+Qu60o#ut-RQvS-mj%`6RCTH}bO#r?Yv@dv|A2 zcZ9*gJto)RPPjGwyMaM(%>DbNCwBU%TuKtZb=GR<G^@AI<XaL$XKl_tdA9cXw|&fg z+%?_lxBatS{xIggUSsEfM^%pJ{mheQ>bu34R=qm5zIEFf)%oi#Ox?z}fb;qD(8@ni z@^Tpqb#^J=-spAo;L%%sejjevZ+xt(6~OYYUt;x%Rp-0bo!;$bHQh8l$WgAO?RbNf z?YoUr4u9F7uyNVWIOWn65nZo7$b8yzbwy8a|B1gR{?7S*cDd60+=e~#6Yur!3RbgK zOW?ZAck;i+;*a^e)4pfC6q!`^r}INvsmS@J3$Nv8edIrMJ^T5mC;v|zSd?sQ9wwt! ze?)QhzVG|xnY1`2%&``q{B!C<{*UW2x!2BH_*`qpM&<Ms7A>6OFUnG1-E51yE?Idq z^k`9n&0V%&MZ?Q8g_09<i;Azy><?Xc;K<q&ozaCJQw^&%6a@cz{&UVc@%7o(64zJe z;pVxYBG;AQ=-=IU<=ugc@z3jxR8_Z1{eH8k+TFW;*R=O1Qa^9L(^Ou|tewOCyd>z6 zV&BUbXC*WIE~?F6H>2+!$LSe;eX<W`^c^cHd9#{<CBZ7nguz9;Ma^FDte({5hKywo zR>)=U{i;1__143S-IBsZmb^T8ATDl-#rgTuLKMy|KD+8jk3y^b_d|=PubOfF{GT5Q zXI`&2TzMq)!i?+n<)42UD{fDGR`HF|C&KAaQ66*olnqA&jdo9Inz2D7=wI@oAc-K= z<9x?kQk4|s$`2Wpv37HwPH0e@bGX$vqKmb_Cn8DA+V~yoxf&;h6fuq&?FVgoip{RD zIr|(*XjWBAG7y}6sG@&*$IQt^(rHQ0>>5`}cpN>GuV~hv8X%BVujl3=+7N7iG;Md~ z&hDGtOH%bW+|^RsmGmu1StogcRat|37x!Gr(A=yqD_pC$pK6#F9rE*>eMfJE;UQIM zf&N*FgN3i<=rNsG=}bS#-F`=!S<|c+J!GHGT()<`3t`#*kW!x$MQi5$GCf-zvVoB` z^!V%$cdH*My;rzT*7q#&eWiJ<d-?CZPu$mKe&K!+{_X$ND{czMyYKinp80z%!tTg! z=0(SrA31!%ge!7-)LQ9pkC$DYcq5&`zu<$wpC3B0cTblm)|j+w7JlP-z36(*bv>o- ziJw{ABpw@mmsy%!ZU0x5;nl<7<jJ`g99Nb-&^^9i)O%GqhpNs>z8lF~>NTDTG>L9m z#K^!o-=I{$oMD?(wp`}kjVmQ3^3JWxI8g9;3TN5gb$4CnY`i3QlsSqo!*b8rqKIiz zJ!6lrn$F|3W|EQUG~ds>H%(^vE}Y)>@uf$h&fA&Nxl_*?dE9p6=zDpql`TH|baBa< z$R526CS5nfHAf^2r?uIgd3#kc=i|b9<!v0-!X*E&=$2*9o@QsbWxv{$VBWf&jw=Js zwQrlw(RO^tYt_Ehf4T!U9$k0iUW|O9Zt1PF_78IT{%20Vw)M({lV@2q9i_!IC(pii zb-qfu?%ltae{*b$+q>LBDev5YYpW9))MDH_tu6d=F6#5ixva=@c%Cf2=zadG+fzE; zG$qu3{hW2C%ThU5+~;-R;fo=z=f7^5_&u-j$9nC|(&(gE51q-`F~5XbPx^dU)%x%~ zXX6i}-|aQq-9AU<-8IdRS{)a&S#i77*<B^BOLkwlecJVtXWr)7)=MhgZ+*JEHs-yF z{ps-fd3B~Y<e%|R-ZtaBPt-D(2(bjUu5~@Ra?91Ked?9pES+ET^vb07?M%Wa#ed&? zb%&#C({DbTUteyUavnLz^6LwCb&uU&5y=;q-#3)q{`m4>mgYCzw8Q#8zqX~?RZc(Q zFVA^<%DpT5-RIkNwH|qNdGmGWR3B}Yy}#CYzx`hMm3O7`#O`e+y81sq&tG!hDD(aw zzo_rmpBK$O@qbr(Uv2&KwmaMMrM`dVTavx}++W#0$Ch?J|DJyF<b2_knu7Che)<%= ziuvMo_jvi*zb7KRJbV_c-(PCL^3HqH{CU5B?N+z>w(d=pD7WMM2PYWIHm2O&dS^>_ zD%+f&e$TbOZBRILNO0OAxoJ<oa(K;j@%a1W56i~O4!8R)>l=j6tF1ELs4=I$a+~vn zY8#oSlg|Gs`1SH-$16X*^HZfCp3(`95tzwxvgz&Tr4Fa=ACfp2oBi{{0ui2`Bl!*+ zBs5xz>RvQG4SKskk?H78M((zkY~CVMY7&-T&tLa$ee{K#=gac6R7@7=+xbpst?u%) zKK<h9_d_>BOf>%(Ejx23VZ&9PcD^5#R~Od*OF5QOxam&1NzkOMB_S6)DoYP$EK#{c zbbWWvAX>;*WZ$Q|Gc+RFHZVW)a4?nGX7jG;gN1YH?vz`PctYQqJWvSz(sfkj)9+i~ ztme;p%l1)*|HTpR?8njeG4-YA4#lRwdDw8ZrGSSof|o7hkf;P-#NA#m0e1cy3$|`J z{$i%j#KyxBWe&S%v~PSc;i`q0&}oNhkq0drC+bAl&&&O});NEiZ?D|ejQ3%Z7mB;J z?*C+0mbkI$qQ<pzXK(dCu()Q@5h`<hmfoj_9n*Z@p0;FFJjVR{Ax{s(kwlY@`ex1^ z2AwyCZVby#9N;*>mm&UGQ2X-E#;I2W*R1qSJGM(e=4h8){hWyVPc_2k9I-O*6qT(} zd^tTxv?I@M*UuNv+>Zr0B{ALov$k2WAb!%{FL%z~w|!VB^m<*mVej`NF~7QH<n52I z@9bLpSysH^;eUUQyW$VN>glWbPO<Tg7T8?>+4I{Wp`hQN{zc`LF8j(RbVTh*+2(ii zf1lc*b=KV^@16Db?>0e<_a7ZSwJcdo|6TM~zt77=w<Q)o()*auv6sU(?`E&-i-Qcl z7WUoIEqWpcF1ovht6Hz~VrmFjC#N7F!10lpvG&GRyPO+KmZu79tyGA=+P!M!>@d|c zEF$`nPwVI3Si~pl9VlzJKCddlJ8}wh^rI)${Qj95e%%p_OUfFKt-EO(Wz`y@|JUWm z#(0fctP7@EzhJqBT8kgx6?p#tw_-w+<fNkIj|}%0)x_<|?usgGJ^Y!u(3$;QKw-ic zfjQzwu5996&bo6+YPiU0#k=C49+tkYS3IN={zj46MBtf4LT+64^*j4Q`wq;Rd&1JX z&||8iw1&d}AMnbYwRmIRttXpf-fxgEmtA=`bDQ4DpYwezJ=Y$y+x_C+#YyX)S{L2? zqqF@%?EMv7w+~s?PN}FkKDSjwTdqIy#FGwP$4wJ7JuNz$xfM4}m{D`<qZR{W{frtR zUWQIjJI=luS9$)aQ&N^3>T{pDY^B`FS2HFoj<P+JV3$4BNT^@8_>34Em%eO?-Qgoj zr%I;0T=-_8WdD_-pop{uvzccUbh@%>a0iIx9J95NNXq`tY3tw{leuA`Y5OC_qs(3H z1|Jt#R&lv9UsGPBQ?Ywl%;9fy{JS!w7u4rAd}7FL&bh(%?Lv*#tuy!i7S<f_VCrHP zVb6ag*KH+y+99xE5reDaG1r3;=FZwD0t8Z=1QH|z10JoN-#q!on?;5fzs|YzT6g=K zH*C@tFO(Q>M68yV2)V|p&%&Rcbp6V^0`Z(R298_5z3G`>mbcO6Na^aeYvcF-JG4W? z!R+|1`V%{DYs^(_HLYGdW%Iw2@n!mQ1w}9PBp%nY`!KYKSud~17x}sO=1-S>@BV(8 zde_)CC?P4M-dDrCS!qUe{|;}?cSmMs^fTOKbSNlEcr`(=-PPLmk>296w+Rf6J5RmL zbnA%@;eUTKU`urE?yYr~UwORww%+*M&t2^E_h)P_PdF96L+7gf#M7s5ub%CfY85AQ zHo8T9)^?5w<;*N+Z(mVlK70Gb&Xl8j&i?OljJ|Z8=d9c%IhMS@#y#23UBeZujBRg2 zdVf<HZMU!ZG`HTs>hh08H?!{5PH%Ey(RSIIwKLGtPiOvmhKFC7Ua>CVX#E(OdH<6X zlc6r#rv$~grH>{jNgg%)>^?U(%r8E~dy~vXpYJ6ZjR*b;w&#jzFE3piEi?V23rjGg z$8=X$7Q^~&OISL7Jl5(LNyxA_RQgvt^Hqsv>w~$OCb$2bS!sWA?UkQLwk^82##?qL z<Lpa6RThhD=w+sdiuFqW?AwxO<??TF<@KG`f3tkFb%MO^AI%cncJG4lC6=upCI#FP z*gnts@3Gk1Z^QPx%y=nqTEHuNnR83lj2o|)7(5kB-03pq<i+}uIVUAgXe1r@>E0l) z(B;6-B#xH5OpWqu-@Nx*SrTWZ^V51JTT4!HWy8$y$)3l1gVu%#=C5QFoA%LY^U6;G zZ9a!CmKO?EaYt@ld@J#%Lsj>Lj*B@F9EtB;JUUKUuD-ERws_9xrj5I&iABd{7xd)4 zU;Xjwj~!q5*S+0arj?Q9P%p5@Ft4OY?B)+6(GB;*lB;*$U!800W#MPkG|4!FA*5ul z$DgFW4Xyi^<!{?8zA>})LqR>0+m!_y_0)>@UO#Vbr7u7KN^7&9#pY{XS0{<gEjM77 zJs8gP;fF)cHwLY<Z?F1)e?Rla#_#%~tKOUYlo~C{@%;TdWm8E(z};C|U8VB%dZy1G zPFx#j%=`PGp}d+|?Cwv@KLf06JP)6$-eN7uP`xR2_O8Dd%-6ENUg$1gU#laY{rf}F zL$<n|H{$XaS2(%+dCO_|ak=WX<fEHnXMel;=~q>+ZJaLegpIPV7p}fB>(>FDitXJ@ z43jfGo_sbmm3ddUa{peYFH?f8Zr9j9{-IufR?=<>|L4u`Zm*eO>b&W9PUevSEdgmE z>l0fh{F~sETeECM-?tSOQ!Jd%s_jY(VA}fsO!&iCfx4~6CmS==+B|1$DBEkn#Ag|p zb7|N9U8kHsw?x~S>^@i~lAiSW{pDXDO7&A#*aTf#dZi$L*@x)~ZFkm`nkBbS(-nxm zp%HRrbwT}Mjwu(9xKHjDcjIkgKXka2ee(JHQyI@{7>Sjc$v%ADF@bRx%Z86$tA1=K ziLk#lZR@AUucJb*iv3;vBGFFHIfc8MW25%vGNIfLMpy61RojLf+p;NqhFq`Ul<8vZ zQ#P;jnsn)+WX6O=M-MhWkXmwco0Wj<!xs{oQpMS4?=33hYpHj6yQC^$t)64j%SSRQ zV)q|T_@JlCAjBQL%h%(KZY0myg_2Q%&xDM)MD{Ya<mFGbY@5+F_w@fgKfb*_Fj4#J zE6ewdvu@A$<+@buYE#4J3TyVha!v08AHTWFJoxb=g6X__QOvrjW*gkaxEIH3&h(qC z(z$bu+ADUpT})?f4H+A+)|(68Zms#bA!_G?t?#524(x8>@Ze+WT4ibY$53Ty&dnM2 z`<7?+=4Aer;dyiE%_C4-+>+hc;<WbRU1iM^V!vKfaC#<ii1A@3ul==>Dyv1i9w(+U zYJ6N*&K(#2BE<Z75YO)XDCI>0)5AN`4%C=4-4@u!xz4iW#)@N;j@)}CwxquMTzV~c z+oex3C9OYiEW3J{=jcMSFF$<T+GeM;wQM!MvPSO0tWE4?aeKZ8HZH1QVR>+biG_)s zY4Z}D%Z<Cl*YirN|57%I$tbXX>D@SGzwg@>?$;|Gi5pMjbDFb2&rx9wE7N7w&CE$| zvx1L3P85(f&N*;HJiaz$|HS%?WA+`h>a(T(GX0$T*Ix4C>{E_AMYN-ixOuv~i0J%s zF7`+36y<i;wQ;#uq;EF5J`&uJ$MZ8r>BM~JdAGICI4;?+{g(U=O$(O0k`kux+ANkk zuYPU5w(m;L-NHn#1Rv|)A0v0|n*Kgc+Hc;2zc)4%Z2G+NX5I$f9lQ4Dwfb)tl;g>n z8`S>C^4^|Zj~<^qpSs{z>}JL7>B2Aa*Wa+tU0JHB&->A>c9v%CE)Aotc2{$)ww{03 zw#WXjRNcpCx2ONGW}Uv&i$%4b>qtP?wT>N$Pnlk3x3MKYYmj{P@tw<@m)Bceg}eLC zxMv+sOtx`9u50RX<DmbqHJ3Ir^DbJpaQ_FhD@xVPdjn(^X_=*}=~sKo-%NUDzb8NH z&*wky53M}^?1-el%)fv6AK27+ey@^~-Pw6~+L8Y*Y&#`-nFZ(M9!#8A!LnfU-)#nS zZ(b<vt3DYW_)JpytxnCQJ&#k5J-Pm0(qjM4f5tm^M(}N_ne=YPbzNis=wHk4ShY^C z^k&iFzJ;h`rf=|Okztjao_*=!^o!ms()C|wzrI~<k^X&E<=r{nWoIYFu%^wpy7ag8 zP5-LcE&1!Fzu9j6&8zK4`*gY8nX!L&?pb*9{tDeEr4#<Q7KA@LUtf7XP{ZN+;h@lI zdMp#zgE?PB1}bLrnw|JobG|26L|8Lu@x?bL`BCw`_m`HfzPW2oZGoK(+q(FfwLkcd zT{>VhtA20r`}GymZb$Q7ov`%N$HqNJn(iH4`=(Au@NK_*XPN+?i{0xD-kq1OYVHZC zvQ2WXiMn{QBU10ovW+)?pA+t}{PRO_ZQPbBM#c#J9tQ^n1%Wh&8QL=P;0|zvb>D{> zhmyNE&x^_h9{r%C*zL+Du}qX#bH*hxCb3R;hGkps*Kaev>5=I#>V9m6^t7w{rY#jy z*}7MUDQ)X!RxzI(_pLKuZkQ1?^M+e{-SO2ACdxJlCFa%6&=Kv4j=SExNP91nr6=dw zPfwQj|B+Z)B9tTc`^55&G|k09YRS_x!V^`pUT^TQVKNZ<x^3=3kC0g_t-B2wFBpsZ zF*)Z>I~$X{n$y3&szclG;ME-y-~Wi{`sKS@_x{~`Tcnm0A5IVY(db^WSElBSib34= z2f<BUN<67MGbiufRigU2z=Zik=w?;#w<<mAj>?tcZboeKlT~Mxb!h2mJ1gWcb41y@ z*D3AuY4n@G6*g7TD(yvtt@E-;6Ev3?mR)zT<x{uic-X*U@4T$3KK;Z4Nh799maOR~ z7BJoYs5L1mU0Fbgp~YpMqHuMyk(2V77A`C2V|zO$2MDOks7qc}eNntu&0y8O1242! zB}WC%42+#5`Ei{^*!t5c-?n}9&|MaOliS@`?b#8vZL3~f`MSSq*4n5kd(W;{ZD=-l zHIsqw&<As-M&^UQeY|WnZIkNNeZSvW-xG8zxp2*Fzrw;<A+I(zWqtSc%HUEcT{myz zlx-Oj*SDNGb)ls9_XgWrb9orLG~6eeGcb1LW-}j_-@R2K^e<P7s$Ar*AKZ;z^A9q( z<URdzrFP=sCRP>+_J|E1dSyzl$k;}F$X#dbYPV~%Aa}}=p5r|~-W>Xp)_RM7TYd7z z)jQM6WdE&rEBAKd|3_0_ol&Z*5sGRI;d;Ygr#)f1ul<34C9HNAu9wvQG(K}yTcA3_ zPPEi&0nbMHyZ3i2pUkg6Ni2;0?E0%RhhKPKGVV;Yy0=i#M*i`>_z(OX3tKLB{w*+> zI^*w7Ymas5R;-J%*$#7+UQz0j5;6VQDRpj1J^z7g{LJ1jGp`hAS>CNl^4W7{yXW1V zQ<K@x-}t=w>Z@g<QHSQMd5D|{kmhMslh9EJ7Lm?epmtPMqWa&Oi{0k!28+&aP5gY0 zq3q=R{A;Z%KbY-aQ02=Uf9ihP{IB)_|AH91J;QgMxu*2_@A>uhI{eO8+zbR=5?-Ep zE4OY_P}{tE<1fM&D~cyJd_B|AS5R_9#9+l9-GqS3>;nmB+5a>&F6wXpV8Jc_NRU~7 z%7L{Vr-~R3&b`s6s(wO0`l0ys*I$c2@hcylp;475wUBXjPQP;bdWRdqz8W!&Cy(14 zkDvL-=6}3t_$P<Blb=1k-gN!WZk+O|e)E3Ii&Y8h6&JO-mel7=Rgv$w(3RMJtmcbK zRQaRpvrQf}{49GM%Dba(^ODb5drRisI2%>^Dk$t_so7Tlw4*u3$;ZS$G@5b$bU63) z{?ctVr_Qsg+fL5p_u#Xcd9B>SXpidIbN}B3h0eS&<;>^Ic|4-CHF`En{^I$1bgiCr zZ>ffS@||~k1oSL(zB%mqS)ZJASe$pNyH{1z{__Ia7B(*zNW2rbp5<5kQ)%boDLk_2 zIrHDW=QsIwP;au-;#&9DdkyxcU9R;Pd6T{EY{|X4ts#~^4TqfC%Z{&RU`bgM!h5>^ z(Wax7!MB~`tC#J4YQ_EVsz=5_gB#)c8c`D$Z+m`spG`!;K51iLL#<wq+kBVm*_hpn zXXKvz-*4bNqtf8@*REF+R^7K1aGb9>tG}c7>JbU&Q$<la_f(H%elff+-xqr|r|z6L zV;2K&8v8V%15y@I`P+32H@t{Quew>df_27?*{dShCJElvW+?hJ^W9BxX(K^L)sM=j zKd$-tR*AuVTKlJC*N^g@Oj)Db_vwgh?8o}j{yU|&&R$c^JR!UD-bCpoHy>S|6YTwK zLQrK|wy%2l?)F!v(Xu=5PFi>3>C?AYeU~%cF4CRc{X1;$<vp2q8$Hby?X;N~)%(SN z7ym@n4XpgD_%<?`PETw6==n=$ce<uov=H-w^iD%>#%BxWpMLVM&+y#O`Ev?yyms+9 z;5Iuu+^jxaN<Be&R@uuhy2npcd_C~av2kKUY=^`g=H?*A#s-HOjErjY{7qe&4%J22 z&S5EWnR`6;%g<e1zVbP5?E|*GyO6$|WBtYw*@N3%Kj_M-Z4)keDDsG9fws=RzdW_q zf=>j@bv#xe_n<1zHAqw}Icz1nu$c57PM?}tO6w!4M1u<IgAGL@KE69|woArN;PytJ z<OBZ%-itLXU8LZ4kCEko%PIx7mz(_S&Ohbu5I(|b&OYDNI%bYilz{H)3{J!60y-Si z7%ndQG}Eg?%;j{{mLAdOS4Y<^s%xK?eQ%O<+swPpY|fFM4LsY{C<w)<Bs}76JkYq{ zYw-eOgXhQUKHZG@m*)^0Gv$VTefs5w8M%7ryVv<16DZ$OAFk6Jc+SsZ8uLLFwHe2z zrCC^>$~)03`r_5MIT`cXiYFH;YVQ2>GU=age8cp4!7T3eV!z+NyL|S&uF~C!+y1Pt z{<%)seA0!Q7N+8GCga|-?ioFAt3)Nfx+wTG9@taAF0FFP!T#Dw{{!6~-+#93>yAs0 z-yZudWB2Oor<0Ys)>-N+1tR7?$dPjWwZ^hr@swrC`dOFdZtU%T)F7L1X2Fy8)7ScX zZ(Qu!o|zNBC4U{~W{zL=!p^OSwf7o4ytgu4GliL9;pDVnudhsjqOtn>ns=#RZO$_N zdD`x?`Ud^=20#7#zFEvll;M!R@wjMdl<o7YX~o=Y!}<G8eN|A<xp%JdL97?6fY@0H z!ME!YGT%xkf069t<D7i6kn=@H;JbM<bBoKH9M`M}PJVEJaoengA32V`NvfZ7$mUV# zr-{8szAkZzJevJ{*Mh85MJ)#wonu)xIVn}dDcNzJ|D2CU{9l|s+tx15f46hl_iNYJ z?pd9rdi$$J$9{u9JNN(LIbNn{Cm`Rz@coIcxWrHWr}=V0-`YY7-A+{){%f~5xv6vV z3FF-x_v%yzEisy^q<r*WpAw7XA;(EAE%jDRii{2gwNK})yV+O&VUxBMmrLcd<DJ!Q ztJdw=5N_Wu+Wd<DjB}9NH}SN^HQEAoJ<_`aQ|}vHnq#y(N+D&**JI1lES@rb)C=GD z^sbU++4|WF{TVn6(>50itg}97#aP58(8%GrZ{IEpJ$c#UAl=C|A7%ZD-Un5A_C<@F z6x(U{MrnSCpVssD_qKnW`}vT`lJ7RMXE$cFe%C$wV{`Vb`|e#||DFrfX}`Pj>y2sC z9#kKk^MA+p3x-#tzOIO}UQ;z)K8z)r|9rpKRHOUtFTx+%?oYfIHN7*8MYVpee|)TO zJY&uc^ZwK9%exlx`K~_s<jO_IrA0+S-|jE4J==IX_2&l<JN?)LVZHt{4N|_SzcRKl zHd(*v_EqtMR{uV&bxWFe|EgVOwW(TP=lv3vRSbJXzl$n6?hLU@TEFW}=+`CB>NlmY z+AhYp@gz@7c%g~=nMG>u_jt2je-wJM&ShDg0ejyeHI3ylLe=5xd?b>Ny6jJ!ze!ix z>fDc#`ukz+B};C&7W?pilM{ZVd^B-?RC8@UyZf)Yr6E?g<TYm<{I?~NeR^Ryi?D&z zgA+y(dmpbpHtUp3(z2KT<f}`q=Glo=e?5FZ&E{T~)*8vW#OQ|?S3SA>>e}AfA&Jws zgtI8uo5Z&7XIS4^>g67LYF^jET|ATg7_Y?L?E8M|?zR76eM^HnZ@TQi#_#<#p5M## zXZXt}3%+HqRk_aR#eV#0)y{wBHM2e*I>HvAS(Uuzr-`2Ynw)1I!Mc~te)|QQy8lkw zzkcPF`+nPIKAqIAd+zSKzytCp{-2aDydTSIvpRQW?lya;-+xRu?~p0w(EpvY@!r?J zJI#NbJ7dONw|V9Z<-5zXHy`&{>?1Qd|5)*Tse}IC8lKF&{O)MAOnLRSkKg{id7ON@ zOmF4%84)b<lAG2)@is19`#gBUd)2kCr|tGWx0$=Cb@#W2(=SA@C}>SRcY5ll-*fd7 zw`*)kxpJTLx`?&?iYt7n`yM@6&opOmsCd!M(wLZpr6H-)r6O6hJQtNGIqz%|IHAO{ z=i_G$=1n{d@f<SBEJ3`D#<8!(j&tQpGWFHZy%AZ;ZvLgzrI_`c*~(Kr6P^_s?bsf8 z+v1FO4?EkgI)$LmR?~YUS)%G|E9-T)Ta{}#-t)_-*N!>uV5KSRAr!w!;0piB+mYcL zCKp&VGuXt|{V@^pOpsdXd^9Me{jcopjS}yFYh}6QN}pm$YmL&F7@)-Jz2s=9Tv%UU z)}CFi3Wi4?>qiQNE@wKem29+V+A=5A!zo$b#oDvo&ljD!_Ux}}*_kw>Q>&KLFN)20 z&H3n%#-t-A^D6|Kt2wMsDNS*eoZxzBW^KkNPKPB4llzySxu5rW>gx96?lCrcr*9rD z-!bQ_-bZ~$%kCmGu^qo}CW?43no$dyDm;DuP6I24kk`vw%j^m@7?bQY^|$Hos*<|$ zb@m&<+(nyIwWNG_p5{k>S<hL${kYxYy83XoH*9PDd5UK_z1sOG>z{Vl5=#T0A3VEF zzZEh0@E`5j#lJ+i{N3%f6)SsgKHag>=B$?Uzwf0<=I2&l{d}Nk!_o3P2gTkkHAqtS zK7Rhv|6Tdpp0e$n`s)7_y{EiJ`vZk+dduECtbDm><Jy1XTawKiwubXHZ_-xY^!m}h z(Dx?!QT635^DhMNe}95M{H)(|ueuETANh+CoDZt)N@(_TE%mtiey6Y6RmC~1VtEc( z1xL*newnoYX>Z4*EY+P-F8|i-y4CnwSxD`P{gT(WSNrCCac~Lo<CC6xfT85poll+h z2h;eMUzTs|+@8s#-<zzy(dzx&*O8F{Tr0(b-ezVm-ss0!UmNz|`Rr6ix5q5uEbmu$ zueqYVb(2HnY~E!>9h=4eznHi88t={=@9p!y-OIkZkk4Iqp2eTVeD$mO>ZP)5Y^@#s z_WqLoTK?#(`Ks)Y>nqk7uU;n_Th6_D&A}9xn~MUn_s3>;e?0I$>_Ttzt;)TVWd5Xk zJ1*}w%RX+}<-IiWhcb8l6Ri)=E-W&S@{L&~o8A&}PsOG2X7}eXOYJkJ_B#S%7ESfO zsW5$q$gMTnYO*Dto;f9*J;|S|pEKk8gvQ^>eBbORwAIwrSKiEtRbvp6*n7`b<&vd( zj-t7DUG#=Kr$u)>h-}~2`!xPjzEzsIS+L0QuTe{DCJDKIOk3EX<*0D(L4D|oKP3Wn zayP6^9e)1#utc!pQ{f`P4I9?pzQS<tU&qF-fW`;POF29~o}1R`uAY<FnVx*KEaT<W z6^k-jtb^YyT6fbgZ;8dL4J)*E&0Bmv`REJLYVW!8inCj%dQHvx`6yt))LTCGu}gZY zE?u2F=Y0Lopnu<dV~%M}*c<at_G*5Hd3{djiQ5~cHE#dY$YJNvShHQ0g-64Oz1QdC zLF-!*o<Z6oV%vgQ77Bc2W{%zZugh}km3Dp$^L8ob^ck})X64PF_f2v_+(zE)-saD3 z+;)axJ0_V5J-@g-c4MZpXJgM9xqhpkn~F{r33d5s_rIIm?tV0jz5U)EYsD~OG11>1 zUfqI@8(Ai2gu3MySzRgIsU~aMH2p&?i+cTS^V~~0tzxf_Za(tD^q^BsZ{@|8st;f0 zZ17&yAz`-1c};2VEcs8z-%WTXyEE_JUDN342d2&SH_8;=`E}>beVGRXgAKJ#ceK3f zcU?bey-I6wi1NbK=R%TaOW9^!ytme9!E>?DeV_TQ(zhk|74LiZC#%NPPVaAXc6Gq} zmn);y=GQytpBCqExz{bQ@R{P>(nAi@P910eB;sCop*{Z2slH<qEdMctZAuf^x4P2e z(MoRR?9#ehlP|p%oNX86eetjJf}C&rKD(?uX!kwsTy()-rW=Bf-8{d0{`)7G+5P0` zhJ+OU{zS)x9gqD3yro?Yv}WA6nh<hfcT3>G7CVg#f{UB1>!Xz1SnvBEGI3{RezvD; zs}2uWQh>qST|&<FfuHQ#{#`m-V$J_|r-{9V-K2i)Ll<khLl-C67zo^6E8Dlh<I3u9 z)3ue_I<|9k9{4NBss7JkoqX#t$E7tP>$}$~h6I~8E~?q@we<6)#FO`Lm%sV8Xu43B zWd388__!5Y4}A!Ia^X|`A(ad7f1Tplu=d>vCUMu@%8YMX&$OHoQ8fP8R`o>fiQ1E8 z96LIVh2Dxfx;j3&eoiHLqTTO*E1NGYzWa`4L9LgX*=Lzu`bVk~#MPO1{CF^9*}rca z*PduQ(I%5~Wqzi^{6^l~wjFmiHLf_fu7dI4{NvMZUVW+IzbA1*_xAI8KffQY7u{jm zbMWe&Q`Yy~5ATpGd;H`_z`FeGCq8RZe%yTXZ}uv__@8`FW7cG!TfRNIE>V87)YB`! zEI$cf1kEXx>Ir|E9TMZ>`Kcsj@}IQ@tPY`Crg~n591Xe4e0JoB*UdS%=4<NS3x4cp ztGX5+F`HZ_{e($!ik{P4!^vLZITGAkzSp1N;kZ0YdvQp6*U}Yyt=W05`aXXjA2oev zvbw*!)U5K8^ujm(Pc?jZW}S=L_J1#@`_3q9o^^F+q<W`+TN=17^iJ^6$-X}v#I-*5 z%Lb)BjN&$)JDaOEq{VUd>#378GH$=^_@conye_!+WJlDjE~(P$IfDIZch_y^R-SV4 zcCW+b`bFDk%k(VXt}U{2hk%#((hGN8pZ2_a?-t$hPJh>aB@K-)^%wugsyFvbFOBlu zGq0Vs?q=H2fE5$InfZNqTDk9Q6{F&-pzv%Zk;kcFIg{JhZSwma=lA?oIOpHK2G1`} zN#X4q7f$%0_~wlHmUpw_x9z!>V4WN*p6|xu@!?oOz?rM{Ds?ltZsfBbn&%OI%xrt^ z9lvK&n$vmxj25Sv<%ahsKHRvnp<w@~y}mLTGt=W<?la#|RuX4tC%FEj!kozLrCFZ0 zydF0`&}OWtQ824!nELG7tL4AH`@FgFdpg(E@6yXoNzZ-z*MO1d$#g!xRn`Lgqi?i( zpRKG&S$*B-a9zQf_Rf0W>+AkF*iGR}whS!4tsS2gUiD)3HD(h-+kd|z^sapi|26Z+ z)1>OXao<`xe%uyLI`7|{4w@HXHdDB>dx!d0sp>ru$7FM)jkYD*mWW0N%g@;P&TS8) z!OS)nyZzmdPn2)EazBo->Xhc(+<o&4|4e?yBY&y=r*D6mH-DtD%I@j)($c|=HzwS0 zT-N%fT_o$Vv1{oT_oEAsNM@N`G;J1Y-Ff>=cw+dA934kK7h}USFL!8_85f`EO!}P3 zTf?#Fwx}KE#7L`WM;x=oZ|^g_Gqj5<@*hdGKmFL=%==j`sE55wnaw~)f0bj#(^D5G z>L>~wsdr)GnHa_<;(yssX7A#<g!=|{e+wpOZH-!&_qyUouFmVJQ@$j=+)yWSI-tK} z4NLdG&@U3ka?%;x-5l0eT<&z8ny@fx=iY+}Yi9eYYV6hJdsedcw83$2zQ5BoCkwqd zExmX^@a~nriOTGa3U&f+UB~VuY~H>i$b9*~%DrWUH7YXoU&XhXM7?4Mt*v8V+0mZQ zbEmN)?mzqGr><_AZ#Qyi?cEWvr8UBF&5CD7KKMIm?-iEaTJ+LEZ2iaF?kW|~+N##o zF+7tcrhMzjo0XiF7t!6k!K{((6vxHXmZaOa4t!YsM0`tk{iVy37(l~!n#SUnKCAir z-xWVJreL1O*m@76mUWPZ6BH<?s*YxYi#GScTgD%#AP)hE|r{byd$kH9z4IqF5{ z^V;8Y|A~luXmkDwpO^cklS1b!#E;(WWZEd(y>W@|O>wR*cFy7@0o=<hyl1tqaLV<& zkUo8ZKI<aw*j1aS$Cz!pn*F~qYy~g-WzOTD4$V=Qcg>N|6>U6G|NEYwRL|oDp`W_? zj~!pb@n%V`!EqlO*Dv=%<Ud(|s`lC|knZ9B<>AFERqI1eFSt1~W%K2wfv#3rQ_`33 zNoGsrJbdq82XjlulPevuAMVZX(mD5|+vY!8YlPOxz@@9oOn;@%c36Fl|NQoA%^P_a zeB4sD;H>%?DYJDtF_Spi*{?3H&rKEG?zk#oadKg-_|;nvJ5?_1TH&|w{Q=(2Wjw8M zE%~-bTZE+^E_Pv6zn*pcyV6pduiNK_x~*N3peV0!C{K#{Tf5A%jLH>1&#scc8&_D+ z>-jC@a(FtQBSr=IE#(Zq=)c&FJRYm|KDr*R6+NeXGjB?LzwX(BqSc$F?sPUETo?4S z<f494Vo9+v$IRJVrk_84)p4I_S-tW0-B;{a$;5;#p2^83qu;~QQTZwS3O~=5y6R6_ z##eZ!z2D(FF=yiQxM{17i@(pWlDu!JZ}oNl^2L^7x}PU<8Hc@@_3Zn^q}u((BBv9} zvuw95wFzM{`uq5v^YQwS?5oPpo`w1EspYG2Ij5_*S!LQk)^9H@)2B}}lFQOctYSO2 z>!MHcOS}JpseNqk9rqqpcr-!tanh+xF_sn&%PK;AB5$^6{@l}_y3FQ-+L9eMTju@0 z_VxI_W$exSC9Q7BdP_h3l){_*-K2Vrwth?P&z4(D@@Fb9ny_E3>tROUqxy{gDSJ~h zy~4|%Z#-Zw<QnR`n*DK*%;YZ_@x~ebD}<kiZ@#}hUYti%ghz1kzPOcM?#~^6Z~Nib z^gTCm--V;Doqs=X*Wbij8#S}|*}J|6r;86q2d#In*gx;2yUf`eVa7k+GY356J|o$& zUR6VJpFq6cKAy{p%1>uzHwqpOng4fh{koq#GbJv~wOA5klk+dTuq036fY<Y<UX}vh zkyAd_%y+3sP*|NGq%&Knd%^w{SF?&N`7Y#}W?R{Q>)UNDJ%w`*=Z$-36%XizXYIMh zH&Ir2)54D`JXgJ+2uWP_4z3V5n(4gp^_h!t7hg>3uaQ%0l5&(~$*R|mnOYlTXR}LS z<)(Vkw5_kU{NM=eUc~-8bp>}{_WvmwPZFLaY`iM8gXgGVX<M2;&zX783xakf+}E<0 zqc~TtYME@2ZqZtYnALuB8fMf*-3&WBwQH$!N^Htqg=?bHU(%O8@_cLX<wPKh`72e! zf;EzS%3BtR=Z0R4eg0nb>y*BVk`Fc#PvW244?S^Rs{Uzl<dO=%^EF0YGF&{*mnQM{ z8XT#VD&*VZFh}{^<-X4+EBKy<vRF3Rv?^@ha<Cw7R(QZH<qMZNN+$p1WtQT(?w91+ zpnSl!)ZX;A=BpA0ccsGarEL!G3ziGKi2c0t#h#wZ)7$$zvsfyn9M|<6+jUL<m-4aG z88ehG1^1Rbjcl&}%p~xF<I5DLyJb~JpD#L^$9$Ppcp=9Z5$3<FjeQRO))zv5#mG4O zYz$eWa76G?X3LJ1;=9%6RGV&*FJAgcG3q(T7ZawvAvSI)%9}2C=IG3H&sZ*a>%8mY z=qE?NxVi`LH`ad206Gdm@lyP>iTiqr4?6mKo!D_=hhvX6&&Bf%^@iP6rflZ~UY`-T z@QC@=vMfWMqfM_ay2|OU)$yM*HQ_!lm&8TZo~$Ugh%Kj|M{w$=7p&qddMmv%Ea!kf zx7c5%5|jG)gOzJb0<7oD?d!g!dGXdti4vP<Hgm<7hTYn7ZPi?v4P}KK-OG%%9wt0g zG5f#k^E;haK03+;U$PXqm|W|pn-^plXPn_|V8~eVxTX2PTS0copa1tsa@ae4w&0)i z)l6&C<Z0XUR=fN?;BcMaB`fZ@_oJxJ)9fmRIVxrRddVgnb|25o=y~x!{eAR|%Wj*t z{rA$JIkQP}QNi)DQ}>v9jMwQGZt64s{cg7BQmKmxxh*a#4^Qve{r~Ul%aaVm3+oLh zw(PPD4(^-C@cK*fyV_qe$1j|ey=;41@y~z3r}C8!+kOO=#=oDodTMvem0G4fLT`oE z$zGUV_)J`RR@OfTgYPXn=Bz*dOV>w#3wxu4i1<3IE5FRDzh8?`sSjg0_0?-<<Ye|o zo2T;jHqMG#Tr+3J^I0sW^Uf}el{%$z_VfCVIrWa=(c6p{sr@`|Z&x7Z7P@9z>pSUY z#^MDR&zSeMaKBQ2^YxX`s|^>5Hrs9dJF#t^ZCg3#(PO?l(<d`t<rQX|ZuF5YEAaD0 z(<9|)&$_TYTXaZWqOhd%v`zp2Zkc5}_&IEZljJ^$UChs&9@$cS(x&;W!Sy|RZ?qXd ztC3F;*SxuuC%t;R-Ts2U4`(Nu*G^~4W|5cvb#{6A-PN=Etv9*!>~v9GeA;Dlr>5I< zgN9Ek(;c!|r0Qqe>$gnmo3zia-^BlE;MQw<JhImK2)(hhE)LQ4>|^`j5|=CED-eFn z_TTj7C-*Ja@KB!4Z0NGhV?`z#<CiP1=T_dX-VpS??R3|X56o|u>bFY#(K|Fn^UU8# zpIrqTwg?zh8Z8Sv<oV*j<Nn7VK3tU(oIca1XLJ3w{-$>wHg68jt?ya!^MrcJn;YeB z_x*d@emgGMsQ80{*LKk#wd*%ce%PGs&+U(#ckt?e<-!{?0`+}rMgH+!bDVOr;B$hY znN)TEzw&d-FO~hR>)m3(e{eCItL21<nSaGL__%C$PkvRQ{7-kc+RF<c?R<_$%T>;k zTu`&=p4{q2(VxqcD|((3EwE9jfB9;|d*Q>0-j5fnE)Tx_Aa-Trv%UP!Is(0me=`OD znEU73E7ii^LfubwMOW^+H)r?LbMLg<s(siMw^ZJK6c%GBSSs<|!0k?T+UYr~l)9L2 zbFS7)&}d8kq9&kUkgs#$<bCxi);VgYPv-c)%@lpGkZbjx2VYmb&cDz;$Ky-qccEqV zSF)d+QrmXJQ1bS=>@N#Mo(L9&f3sb(($1*<xBZ-~^QPwejkgP}FUbCHu$XP~u6w4B zv*uOLlz%Z{tE}7pPX1L={wz)f9Jl-)&G{Rt>ht<%g=|Y9le$aN%dRy>v)eda53Q(s zz4(;wg!1z<T)kLcb%)LS9maY0>4I>%jP*JFJ_qXmHsr2bzJ$lJ^_j@6vu{r&pY!Tm zp67pTna9DlRhs;A(}Gndf1F{-+R0cpV?nXu%r#n*7OY|^ar(>gC4~Dy^|vFhg8yB= zyMd!-)$FTHKXO9<XjxBw#>-u{?$|bEBf+kPVJhFZvwde@Hp~6Piz~SgY^-OuE8f3x zL-{A`_Js>pwpG@DXRLa(Ve-$4zf+=TO$u8j?&)crcWwH~X|u({a@+0%ZG6uev!MFf z;s=aZ8Q7=GOV}4o=4XoNdntbZ7u&qc&y{8xhQDz%SFiPmscm{&w9&?Yx5mEboRb1p zU1^mPFfv^1-uK#m^10LnaS8Wr?v!X|ALsp~UHE+a<+z7!KR-9LvQ7`lV-cyJ<5O-B z^FJqO25)&fpReA$B<1@1fsdr0-YQ%ywEBqku@BSs*J$nw)%?gW<}DQ$RjG1x-}7Z` z>*ljKK9YT`XE9ylYSIzGQj6cY9qgyKX6=ld>f!2eCne&S?w5Rtz~%xa^#FDDUkN^Q zYZ9+d)>^^K7a)D&H4nq`wc@#^23)14#!6F5m!zz#+${T8|6j}OQz-%(B_$UwI=Z{t zxu+ZP@vhu2uU3CSxZ|&*#+!n4moNSWHw30j<+I4v%QpE<wqIv0vBF@3^MY?q{A^|C z%Hnw0%3i$kSU!7a*0Y#;j;hF=@4OZ<B;MlleBj}#7=N#2@gZ+6U*)B(FP*(T!e@Og zTC6-#YWXwU+LA_xtXXGTj4v;;{M@`TBvse))_PCLs#MOR`7*1nFIl9ptjqEFW{u)w zXI@GFI<n-P&iwj)YN4S=jn3pR(r#UMW!pNDDNEQNd!?T9_Nl(ywYfs>N@V{V>unF; z^eYJ(tT26)d_s2O@29h}Z*tCI>sPTikhwlP)5}t-Z+fl%rP&q6@}Kh5^(tMxqF5LE zg!Edw&-@$`roFYBduAH<*Ej5Et7Y;nZgd??SL1x;_<gdg>GFwr^(EmyD?MJn&DuKg zipqTz3)A%HT`K8^`qlniczB$puIA*)*Na51I%T%5{I<Jh*Bz@vj_T`*ABakSePF?S z=W=d)yu@uAlgHox?&6udtLL}=yyG&xTbShgj4RKb5}dxjwf+FF-MRe&z814SRQOb^ zylJz3yGl?`!K7;v8ES7gHs82iA8q#db4c73ue)VV!7VkfdK#|HT~Tv6j%5P73LkTB zy7iLtP4^ww?>rXo^t5vw+Z)BX&Idgw?67L$W(o<pzhWPMbglc_X)8MBXWg=%b!u(M zt}U->@~#W>sp!A|n!EmR_Fb=)m3>w<+Ol#w(_}&ztoJCayMA5Hq<#OygE>W9Z}sbc z8Ei;7amaE%zkXx=Gye7Js{ER6d(E%U-=&g&lX2sn#>eaY7(<#QRy%&$I{$fo=90~E zmR{`k^%lp?Vm~>^hpcApxRG#z`v~v+m?Eztw{;Q;w#64uzTNe(VO3CK=*qZA>5PB8 zbLU-Q(A<(|<Sd#xU6lDf&)uF2XF1+(%HoipRzLfr#M87E@$z!x4gYUfop;)mmZaZt zPHxM_awA{+o?K?R8Sd{cloqYIAC$gRb<>+k#?^aVLVm9aFS~T`Rr4yTtnY1^htBA( zNKE)wa#?=WC8ykF^UOB;u1&X}b3lKa#*fGA7br7q;@H%2UWtF!)ypo+ea;$x$yYZ% zx=`<OE=QSMJ?EW9&A>YEPQj<&4(&hkSl(V;l4mdXv5;BcCUjgeFJJh7y5+Wvov%Md zUwbrNNm)txSI>_hi+g_T;CDOHTY4uVenHT#OKA`4&!$|vushaYGR*wFw3htR%$1V^ zYJV0jxSGJS=cG;je;GfuK=1llYgom_XFIko|8+<<>&2pY{(W!jr_K5o|M7p?L<9fp z9+|5gkH)*N?Tq@&@GX7Dx`pT5=gw!HyZ;6E@|AyoN*}42<?wU&j7%@L$B*w!*_+;z zd%VfPWYM&kycIjtSQaf<%KY{_=hx+H4i<<!bU4VU>{qcO=a1Y%ji(w<y}T+b6g*_s z2Kb%ZTpFczwAautie<@d4ZSP%f$WPGr&TV9TxELO=<2&O7V1(bHbu>Py>oeDN{hj) zV;kQ}%_~$t*KKh8!gTf{%Uw77XP-$=)Z4xwt+6!Kdcm&MN2f}K_x@3g;+x`mKW&2K zvp^OJM>n4H{+cb>4=3GQd_qUWGxgQHj_#@Hv$J{((-LNEykBJVfp3|W$Chie+^5#J zgg6;>hRwMB)*$~;ME8`F&PO;uYJL!vSe|j@PvYtg6Xo{pW7d7}Z*EL&)o-&3`~6za zBG><Ad2_Wp^pm>f<jcX6X6J_pujD^>`)by1S=C>k%UfQsPd_r<rK4_Vl=DUZiSy$o zynbhI7aLc8{$zXD^Z#4#mDt-!e>lJp;ypJ^TdrQufq8<NctNUx{N5b?n!VBMikt<w zKWO}`7XIJuA3k^X>F?q4Cy##pUB2Y=%Vod6zI}T3?Cp2gU$1|7wxpMFRpXYOi3S_@ zz1r^cf7<<0_rk4a6?HNT+RQp)<Y&%!w5$5_%PQ`R$3@niS>)fDxnslIjLIt;ek_{5 zq^n}-B@3q`!LIdxmd}jf=Udjot9x`x<4l7I-`?!jo#ULs_H(A={EBZ058R5J3;1t3 zR+dFf75H;9@yeBFlCDn{zRSI|S-sBi&fNK4O_SFY<R?i!lCk(>C!2SmgrD!A<z;Q< zQ~SR*26WHruQ#-KuU`~?B9(nXiQAg>KYbn-2On_wcI5F6+uUmhtm_wE-DEN2$bIJ( z-oJ7Z9I}Kfctfu&G(2x^_HB{H@eM4GmmD#zi@0v1zkPRaL<HyLgq53vzSl>+x7%}9 z?W-(j-O`Y?*B@O}{%z%=%*(Da;RBPZLHnP-Nte_nygMT-@^;75-&YntneyW2C(oTB zT0%dT2ed5aOrC64^f~+MkK7MCy6TTS?MX9=Uz>H%`iJku)ypmRTYD50I5`&o-ub|7 zg~!wgA5fEJ^RF|BfB8#J+`9AgubSPCq?w70-cc+0rivXuYZd?C!i$VY4>m{m?#sHs z)v3R)Hvebxm7hx|U3((W%)6l=(`eq#0Nr0p9~w{B`eXZ#!~fqV9R=Ry3x3LHiY>fY z-!fx5bHhQMNjIPU{-F6$)mV4#^6P207Wm0Wo1BQ=@yxvR<NW0kWxF2e=ijy7r%<|4 z!Tk|?{Nz?W_CL8>A3f?U{;_J2#SI~u9-;fO@p9!eYI&L2uZeN4T(vM~8vDVNe-p!} zXy(@*bIG%2;7V}&=d2qTXX_SnVNQi;jL(}LD<$f~<F3?18wBqcS#j_A`-_P&n-nf? z%00fa{LAw_xBq>4cJ}Gj*(Eb0j~XkjeH^q_^`gSWyIlU-y<XoRMaXHLSNJn2%r0DN z>CcQwd&0Q4h^DMp-*h+EY_-wZ=>8K7D~_#Le?86QNA6aI-niDETh3N>E#<VoEV)qX zwQ~LZfYZijc%Rp^2sZxJ<UT6$Cnl=Q(6RGHs?6T2Ka*SZUeCLlQ?<XRAXR4F&b8t# z+OG@F=5}8dT-S4W>z?e+38^xhmiwl*X#Mt_v(vU-WZfENv-pXPAk{~kBw2j;4jf8a z=6u+Dmtco+Yg$&}qf=)$heQ~K^;|h)rD^frT;gqaQ%h5e+>!cq3TLO7EZ#l6a>KRI zIm%U%?)r}$7?P$Ho>4lNt&k>pJm;lF@2?J3r@&8BT;@r7b?<4>`7(_?XG*8H*so=a zoX*Gv>&<Ppk~!isb>XeUVg`pdmLGU<Ln{5y)8gzWtr>2%Ga`1eD}VU4#$57{;T+4T z_=lC-rk>``7PeVp^G9KqZvBsr=#nkj%cmCYuB*|DUp{qbYVUMrrR(l|T47rICIp*2 z5c$;oa&O(tNoqa~M>ZRl+J>E4zdd3TW4T)_Z&cee_bZq4P3O)^n`hgz^6K?p-)<e$ zTI;p7CUAO3&<(eJ0X()A|3Wls{>A+J<QjKSYf{X<35Sb6bp7TPSa9^A^_4!U`n!u~ zEW4{LzT_+`-)}oZnHed<o0>90*B9L}*gnTdLH;{4^SWaRCyP(LI;?*_<#X|lpPlJ5 z-km(zV0?+qd_!ei_Wa*x)Y)4#Q>`Xfe0jNp`>KNGq=|RMzaCw<E~a48lBUd;7o95@ z<}6NId(R_lRTk5gHC|ulP73lmD_%EeMXGFU{g3@;&3>%7lVdtht^3@K2S2SPv+oOE zH(HupoqXtW^5TtWldJSk>}8ScQH{0le$SIKQ%x_5Y4`Q(@7JGvD*EtLvEJ_^$!8`n zH;nup+py%#{X;v{cfPn)rmrfK<fdmoseHP;eO%mL#y$CU?<Zwn+WYJAr(b`s?tXXG zw=2p*E%WcjdLEB&Ti2He2E<glpO<^?eD(M8uggn!eUOi7es_A|wr9Jtp5EqiWwMOY zeN($7?8)x6p90rfKNY*r&!?xhDNpmw(tQl-r#Ey&TxB}5^`)UxwOVt0=6?T}vg0yY zlLU)nty(H?oY|dz=F$A>Z8c|I`2?NXGuzkf-tzyhV6l(UvgXSAqLt4ignJJ@3)tSY zo4;5`aHpNoN6yl=$%0!vemGvUSat38)#Q}k&^3Z<`c2jdzOBxAm8m_KVNLq~5AAyz zCRQKby;c1lzpsm(OnJWDR)xmh+f$>iNjy1u-$TwTx@7XMbrMU18!VK>d-TqTo~ZY@ zQfnb+oYJ>r{}<NPTNpnat*l=j_u3|sCEn5G-0HQTTb$NQOe>Cb{F4)5FKj#iv%2*s z2~&63b~~><yn<&HSwC^h_FkVJHN8K3sbA366Py86*B0wpTQ=&dbe6{{yKHT^Eh6Z> z++j`MZPCxSMSm}~PAgdaOx;C5B<>UMv!jJeBmG`gcr%5pD{zj!o^R*+*7HO?&kL>~ zevwDz^X=|UD4V|JiqI|XbK9;@m;L0vz4)-G=zse?pVpNY*Z#EE{3W{M<TNwpC6ApS zsNF8U?t9jE+oiz0!N-LYUvk8{ncXzV-Pck1<ktzuqh7g6A7c(@G$oW5PIWynm!Y(r zDIimJ(<LX)^ZQzkE8N@awe#Xj5A}P+tJl`wUdH=JYubj8tm&_o7VIo%NO-y};mILS zzk6Q)9(`KOd5&w+WrMWhVD9%S;VFI_9>q@V@RAf!6ImwF>ba%fDH8;{9A~vCY~07D z#%0ETw^?M>(!7+toEyGz&fKxazpDSpPpjO(Z&x?xUUoHfF}&l+b3Wq6*)H1#iCuFZ zf9kI1TlB9)^+wr`%r`e|C--u(=;=f_*#0lktg(-2G+!@NV7tFW{l^QfmF-t8>{gXq zd$PV*dFaFByT8pZ+dBS~`x>*#M7)eIC;MvDR;}%~tgi5i?QgnTV49sYt5QNS_maEb zx3K)xNjt7e-#XtOw~9CSr}nJBi*`8Nw@=+Jwso$}ntGnngeOzZd@?XE2nglv^?SF& zYWv)o=hPFgrcd<wy<)oS+Bx@wKb7puS?3TZeC&VOyp6F}pA;@GyC-n#?ST|mUQ^4{ z;Z9i|s;Rt@D^2=>Ty0ODo#WMQ|97H->281f(8>N=4{N?U?qY6wsB77CQ7(0l+&x0l zzF+6?c(*@^jCku^Kd;Maq4&w#ddJ@{`@O8%_g}`|zgJZA*X>>_{qNPY@7F{%Cttg2 zxwERim`Q;9MylDT&)4pn`C65=+Nx)o&Fb!)HT7wI=F1Z^Vo#Nvcks&N-+X@F?In{A z7-{kCE;*O)^I`p2>q86rVwD%3a$S6_Q!}w;V!$r8A3sHRR-Ccj{6R0e{zEMHy4hdd zmUqoKpCGr>?vlZwRj<01PkAV_*yHHq)syE2C2q?-^Ln}K^~q81u1LLo(-#wY?84Jo z2UDc#54U7G2CNX9m2P}8`?8#rmFe@MtD8>5izITU-MlEUP;ruL=R(Cv^K8!_`Eg3{ zbKcv1Mc<CgHK(z0FL_>kVR7b>6-#&4*8lkWyCrH~qLIa=9yiWjAt_Z8uZ$_1Ql@<A zOy_6&y!AxaqKGLKKVCoMQhoZTYvuj`%}E=R`<r*(e_^xWbHh1iEB+TYZ$zD6_`LaW zd)DgU%l_-M(i;snca>$h3kDwLE9CsJZsyf=zSs2&oUfHh{8h8-5c4wSzPkOruJ4^A z9-dnD)~3}aN0XfE_X}ThDCu``Zf)aYRx@$mG*fwku8Dg_-vyb4mQKYj&oa(G%P?|F zZaK!$D=4LG;+E0#EvH8&xuW}^;4S4X?iu|T<QCfA+HSk)=l$(ACaxJ>MvjuRlt2u= zEnNo-Y|o}Rr+vLBx6t+!ODaTh&^5W%W%bL`?KAE@o}oLZbL&GD9TEQLvpz7-;(V_5 z;W76gfyZ?l*GOEIS!Eeg{At(S5)-rD#<WXv#uwjDJ5jdqelHs*uaK0AE3Z(kK@7+V zMvjsYw|w~X-_E0#)B5`BZ2nn??{7<dvaqF%{rvC6cW(xoTzHo<-(-vRZv|7g-Jk0_ z%GlrX-I{x|)NS|V+Dm+w-@SO_D4pzSu<YIi5!UhxA`3O0f~QPqX%9PYwsqcLgU7+I zw_jPf>$pSx;_%*8JfV`Sj5I@THm7|xxtJFInMY!oRcK~G;f@6t7X8_(^z!!Pc_&R? zb?HBve{n_Tt?z66H_WtJb<j7cEz98d63z8&@`3fdi=<pkCEC|Hn68NE6BSwXOxxaP zi&x66XS!m1=3EzCoLkyBcqjI>dBp8~Y7}eDvfx6fLpWnBYl$d?(Rw$h|82yC))fAE zMQ&`{PhY&TV54L5;u#w`cTY;Nc39);+T9|?sVfw<<ZslH&?Q_>-dodt$0(`V3JYeg z`#8NmN&WMpLKl4}B{o-mro9|rlrD5n2rO?kwd*syB=gKyhTFgE{h~8{=e*CRx#p!V z0~MD#@Zz#wqG4*3UWCQTlg#rB*`%j5uUVqE+BwVi*-GOpEnYekF26XN6xyiwC!TGJ z%jOV2Z%>xfSqmopD7;r_TRlfU_<Hiv`n}oREt$RF*o*6<>Z6u(|3A3(PSKgw8p1C6 zJqcZVP84x${Z+XtVZX@3BO5)Buj^R!U*xciNcud}nj(X=w!?nD!Q7WQKCjE%)v`Q| zDXfdVaw6m6?s+?>O!{&^Hgb7Xet7@V<hhoKzEhn4e4W_bHFefgSFg&IS2&X9yuWt4 zt7v<@(5F=*CG!g7GmMg^xwkkUVf8RPaboYoyG}t`Cyd_BYRlSk+WolfPSb01Of#mf zS{hb!vRg7#%~JJ%oPNh?d583$G0&e|RX^wTZngQ8nd{Hx#(H%B&YCL4@FRL_R4G4S zGSll1$3E=4SNJMX>R$Nye^!MzqfTYtty(>=>#o<VPj>aMecKe~&B?i4vY#*K`RdPG z&%cYiH+AbX?H{G@cpq&l+k4N7#mnX2)5wX9GnV~6ex>m5glgZjE&J8xs@3la(Mh|c z^SJ8Vb-7aBzuM-j_U&YBv&@*LA@c1Z^Sjn7*QF(53zzUmzniZj_vh^TS0DdecKf^V zK$XL;*{feVU%b@5cFFhpNfSM1Rjzy|S$-w?$Zpe^Bq=fFDebpy!XAd-*rL$-#8vCS zCeIn4ALKt{v|OmS^VgSexs4Uu=CjVMY<?Y>|ETM|G24gI{wLG!8D2_0^XdMX2l^ik z9#mSk740nxd3%USZ<+A3_Z=lp1)epX{#*8_R%r__D6%nlkj3-qipl4;)sgik{HbxQ zpX5K8AByMaIsIWq{n`z_hKB=p-prcgzVYCnxw$tKj_zu0Zi~MXn`QO2>DK85&k~-# zd&yK%Bye-@zPfr}z4a|&%~EbfA78F2F8=xNmA`k0*|v4}YpSmA-K9A9d${@9)2sWR z{Jna+e&TAe#`BTQC2xG@s64Op$W4!rTUsA{+wh@Pw8WNmZfRQAU01L~e%!X!o4tW? z*V<2kZ#$!F_>FhWII(N#hPj`ZvV?fMJ3>YEg8O$z+fF{Xe#?Dzz1_)trYAdg>d6{S zzyJN+!DuU6*X<suyLV*kI&4UlYP7t@bY@MzOh}6Mrz24f>7E~cMKMfyu_p7QO2q?K z$-umO!KJ(H>t!mWzwkd_uuv+pC-fEf1+7x)r(v3kPp7ijPMG9*{D{iOFOO0d%(sYY zKUE28u3hzIvwZzI>vhbsCx_0reKo%Ld8go4na7Roah9(vz7#4>Pi$e)uD@=RlZaIA z?+E?yZ_OPZrumwU+gGH0W$J9->*w;jA@=v;&uL3931oOax)t3owELU!?;~Cd7wxE* zejdj1Yx{5G@^>jyuBUgKie=pus3~oh{_%Bl{4C)`|5;<@ryi{Tr>4TT;nM->y~66R zyiIF`#8U3=D*rj@+8Xitg_$XpKN-9_YA!^q3(PeUdUb2ov2Cm3W3%}?BsQJ4pLfnJ zd(CV=J>!}0HvZe(TF&QmQpM`$sYbVzRWbgnX4v}uvE<KIc3W%7xb6p2%%wiFFX<Db zn>?p*{1$z>L1q8ms+V%pVvZb()PAbu+144Wx6gmYQ%N=M6y<d5KfyV{%j?raU7hT1 zi#>X77u^vU$DFs${Po+sMSmwvdh$$@Ib+{!X7`CfiH{>fCtk37J+<$Sf#BTVGO7;? zrX2YC;D5*bM_u)fe;RfyS|Zym|8M=lsgF&B7j>>XQZ++gYOCAoSpsJw`hUqxW=fa& z9nkA9&m+$DA%CW&8griI*XY|~Y{KW>)%QFQmy^HU-1sPrqx_%Q*L}LzrNxcj8Zipb zJ~RLK!mqsLIhT%$e9e*iscjLc%qKiC{zb+gD+$gC^COOZ_pF#vBD#v{a@yK^8mF6I zz6#YiFRtdHT4nuRFF#ajZk5m6r&n%dcg4t`yjkrtx8{7c$l+OLW>5U)J(=qfo45Ca zgX{8odB;nS&%Eb<{IARMdr|W4fG-VBbt|0e%*=B2&nF+=sMq%0#6`U_;s5XG!^sLv zYHtr_Pw4q@eah+ViGknFYphNyx2^ceUcW~6M$4u%$(-Azb}eMf+o>HLw_uT{lvPPh z_KWK89*@>BeR4k9YMZ+9$t(ZWXG^$p*SL6I?)WD8rlUUK(eWco@_E?KG=APyE+9ME z#@v+owq)S?$;;PW+pcaq`KfKjIf1Z!q9<QDhfQMIyG2;-{NmMYtlt|YB(|Pf7gx0P z)`~01Qrrs{eHLERZzGfFzvtr?z0)Q!`ufij`(~79JGXG82X_7IIip~2yZ41bR@TIF z7q8i0=ch6Lp1yzM#(MMm+;FosvgYTd-9K(nOgnJ->5l(Kms5XR?t3M1IQrkGr4pS> zjvU)v^egSz)k(Kz*6s}ddO2%)l<z{*38vwj(l&V9tgC8}cT={WoOobzqVX-0^P7)u z6+T{~dvy6f#j_jUa+Es%U-t8M?yUxI-3b=OxxuscMXjE*UC-!vvtZ^g)%pjQ)Kub3 z&aauL#>LDU)n&N!flG=_%APHf`d4L2d@6LVHhE}iXsA!pe(`3rL|0eKA|wCVCXVON z9Su0{{`GN~&C2awswW<5ivMQoo>FUO!1mKuF5%ObBXg1_UD~8Od7-Xv#sul<qOME# z^X$F8WJ`X~_vNAW9*uILuYU(GIG@;G-z&BGvaYH2%!kh`MJ=zY-a2A*=!z*%(3$6Q zFAiIT|A_hN6gTN6_fvh=Pg(E0O1rnIosgV)>EdRe0}G$H9i71^QuL|yycK)-o%Uxt z=H)%x_A*-dWx&<fR~H98J`iyK>P9XxZ$2%iV<&%ay(V}$<I*Lj(>fpWZEIf5dwW;y zl$cvh{lN$;E2U*C1SiD5za|r!{Whha^{7kNa($smf78vbM*I$S->Bk~pKCFv?oQ6M z(>IGhEoR;QVRFf9`LmvjA4=Q_cU|x^R4`<TW@7)0t#<pJ_iJ`5_VV5d;JRaxw{7>^ zlovl5ud&?z6zz3Z?9q~zYE?B!sq!<T&P!^`nm<)nu*%fGICSU5#^nB7_bnw4w;y?t zX>lu9<-X4ExGnKJmdZVhnjoR~C9`4nquh0FcDEkwKC)x!18!M2jW3d%|NZV4*k-+4 z^hQ3e+l>EO%9Z3k@2dVK@2lTS?R;n+o1Afw`L5*O2MaC#``B~UH$KrdTOz0K^`&Ej z`n@;S4_u@RZ%h#0TwMQm+y3uDaW)qcic>=bcSaNiYz*3V_oPJJj{i&gjxH?xd@f~1 z`OWV;dBP-(BAyEUyqf>~>y&p|=TbNBSpMO5*Y>Xurrb$d_eS*O^q=b2R{O1)dUN{P zu*GZ%kNrBOig?lww}=}3OL}>%-tchg)gYgqu6?rhs!yMq8B8+1%XT&PRY<+mb5GML z+$Xv#E1vam#BM#}k#l*=`__6^cFUcspC14IAokwD#70@$waq@S^GjB4n!11fQyvG~ z8&7Xu-RXAXY119aw|zVIl=^4pT#hxFeRiD-@A<MBUX51^ep~iR2|qZduz%s5uvv?g zbMKcV{FS@*ex;&U#QyC`Z_T1=EMI>&T2&vLCSTt?_0+pv`qSJVMXB$-W*oYF#|=+? zGqEpu5vwGFCprpjTws20>s`~}2G+g1KQN1Zv3uT_eCyf4rh9wsjK#jB@e1m^IIEzZ z=$Nne)Y{c*!-8_{T^kmdCr?Rme9w1KP3+4%?NuGoXV>XozFVEWV8%*bp=qC@j`DuJ z)b&s_w>~9lEvJ8hZc>xX?c&s6k&RukN^=`S-vk{r)y<tQzM?DX72kP@BOWOZa`Oxi zG<|N77iTzT%*M|Cvwx0ZhkRispPWa}k9F>xNk=SyJEs~o=s)V(vF?j!qME?l?}=Nk zJc?0}xU!Ph%y-_&b#=35ZczR8Wc{2SUrWlZioLh{-fpa){^;HpQJ%-2)cRD{b!}Qv ztADOoJoS0m3(kn=CM>^h7M`zTt$u#IwczYmv>qDk#9Niy|Gqps`}Asa$%gv%?{-|W zVet5!HT$)?;i{is*W41GUaah<d-m<~rs&mE6#l>9(mnD1%!-4vU;BTKDv(}w==0*h zoYMM>xh2xo=Hk&Qb<^B}iu^w8WuIZTb8(ku>8xHq_Q(|7ZkelD&)2SE(MjUDB%>o) z{Py>pb20B9sq%a5*|OHd_kZr?1^XSWo*p#VUSg(`+mxh~l0JR!U7hLH6?W<Td!>`o zo*r2GS$9pgb)3NL_p>thW`t*zo>{A}(UK5q^lit%`m$4xB=^miJN8%hVt$zS*<+Vo zUFyq1H+BB&mp#J0=3wF05HSW>2bTS-t7Ub9w#|>z{XT2Xy6=~-6l^fxdHt=|-kK5} z{;BDgO)jzRN)cS4Q*rZZ)XDG*uU>}MPuz5#ZMAXqecjuVPoL+Da(WyrS$<~GEMu;q zMXgGOzb}?wvh`YDZxHOcC^}3=>&3yuwSVTas4tp+^oTgyN!tl4CA_!)Tb(td{E}PJ z_UJ{Yo~N3me_Q!Pcxmk8ol#4#thj!`WsRxeL8a9B+%aY{hNma@*WNwqK24;-q*qcZ z@#CM*Za<1E_wmmZ5jY~qa6;SopX7r>{=(OP>d2Rwng(=yW8FU?-qW)_``Yx==9~F@ zlB(7!&5!H0+!x?-cj2bn_Oh!^Tne#GezVs-@6g^5pY!jE9&j>FcRf@%-)8j{*;95q z_q_RD>!f?$;Q4Gb1*P8~f;U(wdb+z#deoB9yK`4k;@&%EyOu_+o?W|Yd6vf#@h6k- z`m%eZ983)L%Xo9cHvE-9S*@YNt&Gs4J~0z3`jay*T#0d&m=L<|YX5Abvxam1jkMZs zuFLFfxbQ(Ks(R+vw>gaxvm8tsGnmR%`Ft0Y%vk$k<?c-Fz&ux>y`m~RKlpxce-hfa zYR3Az+jr}|ntryAMYWz+bj_s~hi-CRyA^y^CF|Ik1CO;Gw;oA%^}G>uS0l^qN>605 z*P<&=%^FviILJ9X(CU>vV0AWv`T85?IuF&EhFpJnj!kS*U>9w$xiRzWsn?5c=9Hxt zRX6G7eVR47<oC3M(<f__a(O=a+wN<g9J5<YG0bY|=S^IxoS7M~5;i`0STE8M<-TV9 z-GepTmp^j;uk+yf%xg=Rr>qPKjEmiIa_cnSV=pS+7ys-&;>!EqlBMHNCI5b&z(bpS zFFZdr{paP?p49<bQr?vh{vA7Z?}~<8i&~e-pBUYRVW&2QJyQE8ZY8yUo|KTVptE(; z#EP&7ewL!EE<9P1W543Sw3&L<by2LX^_6lj3SygLwjbHMEZAhT=8h(N10KC&a~A%R zS?~5|gVMwqi#(3x?40=bVzu=Zodb=Yy1VXl9`1Q~W!^^K>&hQCz5e?6S>>c#T51Q3 zcTHZKcYptrw-G*bKn<KD+&t4Vcg(ZDdpv)Kn4dHM?e(J1+ZUfd@6~?W`=U(ejXv)E z&rhDO=iQfi?W67_$@Pu*=YLk@Tgkz`GbDx6q0-Z0-U0FTN1sm<X^qvM(7dkaq3ajb zl!y18|L)w#9G5rkRF>BLC)HEm&E%F6UmB!4@1c*P_!5Rag&mXR<{p#q(K)-p=3i5F z!8$+RWsvsif%qr+7i<sLNwsgdcVX^)^H*<Ob}u<rf8^t?+^mNm!+oumC$r9w_FwMF z*{}3ML)l7EZ{0Ja$((N&aJWpca-5PPzNEWsXV^OLMNbm0TzKfg?=-oHWq-?o!sU0~ zZBubbuq)SHACi+*^4vY3Q$Rd=4l~Ohg~T}zgl;R%vsL@nz$0t5Z|?e8wNo#}1urvV zdFaLX@nCSulg{b66Ir<G=YOrqGm&}TrSje2-E*$<`dfLw9oL)nHSgtuhTfQloP~3r zUnojm^V~b?*p(M=n!~QGKK5p9&R&lK$H#F2nljUFw(AM4Gu&AcyEP^HU2J)I(*pB7 z8dE2k2Wj|BRn-)DyYLeG;j_g_3z%<L_4&;^H>3N`s^81h)vUT&st(Pw|EgNw+_uPn zy;eMzYtkh-<G)osg?7hdcY7)3M43&0C--6dz3-;yFYG_K+xvIi5((EY?ptD3Ud}18 zD$3favNd{x-p%Pk0_^uq;<wzZdn2bLza;T(%ENZ~tz{=K&s?{4vh?-?EPl~q!Qs1; zccoh&JXi8?<>ZPZ*V;8azRW(O#rEsrw=?xqkLjJ=m8M-G{Kxo$kKnqfDa_m7x1Q`c z-gff1kGj10P7~+;$T)q+o6+IAhr4gC@!mG;_BBz3!%Byh4!=9GVOCDJj{D0aZ<yup z`MESWRtOdw&wO%GH|Afalv=Wu&O#&k%z{WM$CipWZZW%d+GhUXzEp7{N#m2}gN52m zC(L&5sn>AUaPBz%xr6(((vrik)-3V}{lCiQnAzm7AKrL8^52)4yt4Y<iq8uoqs%7r zPfWj(sk)xoXwz%;Vm^*ydv(JrnTfaj{a*OKs=9vWm2vx5`wNQM);)E?@<&<}+|0Tj zH*z}qa4b5ZEO-8RvP+$^-p{Eu+jG)Y65EgHMom1UtbDe9=Nw<gVz<aQzSR>2LU*|( zRLSUiO{(D8!L}?;{rwH$)%z2RcALCd5bL;m(zMu<|CGf~21&QRG4^qkWtNj`brkMX zv#GTym@e3RoByMDURt{3+_SQ4mIj`<yf)EfN`}Vd1IdRcZf;&_zT(R4xm^-o3)A*G z?r__n1WthrdK&d&9KXWfaV6{x%-nK&Bg2fpk*b0jZtL9I6z-M&;&?PGH|GB)UA3rl zeJh?z@Xvh5UJw+W|8~>%U9L%m&;OJxG^wb5sd-)M>oHcZ^LMgRIN~SU-4fR4cbbyd zI%i6T+7FlWns*|<#JrifF>d`7>#0$zC#l?j`{Rdp6Vt^ItE*nGV(X{Rw@;01W;;BI zi6M8f+Z6%rd!RwxhCmgCB@f?EF8ncDAnd>E!X5ctj}uKNJ6+wq=EcoFr`PZ%I~upM zlxu~V=1)q!`@8LRrkb=--o?0yleR5XuM$(#;M^L@vAeoM>8H}m%6{*as-6y!iVtjm zJ2o%t@mjH3>Eg}iv`h1jSasL;9b0C|pfqEpfQDnT>&d{*Tf*lpG%hUYusd)|nmKKk zPt@W^Rkd#&iz|4J#IBvg7+gGOPEJBW^QRR&QvH_}Z~WKTe|l<^^}?MAg*G3wT_+3J z8yM&Ao5CZeQL)3ed57y+=_Oj%K0glJdM!`omZz0k(4M7w1~==U@t&KelfB<4wO&PD zN#8u<dD`Zfb8*To83*<LsNDVKUVJIT;$O_qO)LFe#4_qaS*EUe*0g=2Xxl$u<C&&k z@<cb*N$)vztZ?&P-wbhMv-6pz%lCS;Uw^cu<+n1p2cddTSJ`g!!6z{lPs_^|>iOtN z-sY1@XpCN#__6xULG4NT(`wJ##{J8CRo{7K%|oHXLgq(r$Mn{0Ia=PU5%Ycjg~S#o zF~dLB6NHyeJ9p^1l46pto9(k5OTK&j+P8S!MCrQArfp(27v^5%m%G)PX=&W=^GQrP zs9%`%`N9s{k7@S}&2sxKa!z#KEX|(P9sSu!#7p)-+OxJ(rV(2oJX8|byzS5bL7JKK z{4~k>b!omn#%I<0cRI3&|Jvv&9~r;7>eJf)Y|d)DpT(a&zmdO~`LTvUsQ=x$^TWN} ztNlB28+UO3tkNqrn5Hvhhn@ZEobQ@@l2|ABPDv2fT)QaGTCCWl!2bH{^vHyWshg}+ zci!P!WnJfJyXsn~U`WdQH5<0)Pd#?!YlP<hEydGn=hR2#-=Ab3m2Y2aKk2*plV{)c zEc5Sfu`A0z@$>0%{`~0wujZ|8ydTLom$gJ}&*uM!>TG8zo47wLK7I1|?HS5H*Gw!j zm@De}&Y$~k)0?2KJjPwD55(Tg=e}|`-toDBXp_*tsfH(h-#+)V)uyEJkI|R7{1wYR z=Y13TzV}H>>2zNep8CIhF1wVs&Hm%veQDpyk5jKS#i{T;)-Ms8H$B+(Q{adC3fZUM zKNPGt*!|1gy1Mmh)XDcjZ6_mB-cR|)mHu;g^&O4*r!U0*oxk?=>eH*uwGNj#-HYG* zSG-fAY_{1{iMwxE5+*)56jSzk*Y7C@)Yg{2Uw^OTNf}?&L6>7+jpg}-9@c-_$?y0o zF7xiKU0HkoUjJWq-gx3Uck}xDI`gNx=vht5T-3Mw569&=jjlUS`7<5c<z#<lXkA?B z-YzFwRq{eOJ}tuZr0g%A0!FdaH*>i+R7gi2OlQ?R*QPZ4&1~O-{pN@5<lcQ(Q&@50 zUSwkao%d%gOx6FLoR<0T!K=%=%f3r}s%LU+d*J+f*VlE`hu1&tT5|r_mBPq-bHBu# z|Dbkn*|z;N98RrB`4zd~ezd&j?%R8n3f8=QW~;`s)Q{ue=kKS_y?^paIdkj%{})A@ z_Nttl@!|A_tvteYPnKGE85T1Yu3BIy-eGw6U8Dk!KuTcwj{bgwx2;Ndjvsf>omlE{ z-0qlzZ@rbTq;HJNo|SCuX>$F~*?QUq>Q1shGGlyPbwY2|)ptjCvV7CO+ZcFbmX2@E z{P>$qt~woW6HNssEpz`X)*vr`_5AARfeq*HTN)hL+`rcF#N_=G3ud*t?tC77V_8Ka z;|E{KmmGQ=dTSprt?@p?lzrx7qsX70P`6BOtzTD9+}pUh{`<F3H}|hmt96`rNUN;( zUvhb6^s}%O7S&l>miNr8`SyO5>$=_V@BQDnYwE^7KOE|UdEb^VYs=CW61320Iw@A^ z*;6;Azi!*w<BtEO{=Vi3-r_y+oK7{nnTOw_s|M>Y3bZ{ua^~N=$?vzHb9M^3nAtUd z)^ls$7xJFG7I|E6xpoNE-*B7fks)iYKWkrt9z);lecjztO7#qO=2x6uV^<vUpILU( zw!<&XKRUiY^HnB!&HbR`lMC84-fY}(?}Jy<q;j@c#jcbid!l#O&-%UnVda^VqMiRw zXJ&Suc@rEG%raAHXL4Wqi$A<cPh2M2%sTcW<oxt4RTHOdty<{O)@Li3EhbxUIQ>9h z+(erhTiExXYQHUiWsZUChSQ7@Tgqom7HC&`xa;SZH9aCP-#A(c%-fl+CaJc(!`<e{ z(VDtO?=G`AuNbe-f3zK{T)m=P1y6cze-?X4;gxT7*~x^)ruNg{nweHKcP_P@ocOQM zc70g()X&#kpH-C3oVWCXVy;!4$8Md=$@O1N4u480KYn5V$wey436dW^ESOTtz30!J z-P?9%O!1oQCjIqclU+~Dk~hVU=j$Y9e=E9|F;6D*&Cgx$=3HvpvP%Bq+P4z*AK9PH z-@WtSmAh9WR~5$D>#KUL6I`9vt2X=F@94nWYp3b&QmtIU>bWPKKf!w%&)z2!u9_u= z?pv|ltFwNWo?-ISs*)U|yJn)!UB&Y1UXRzzD6LOBoe*kyZufrEJNYLnPE=$X-|P4~ z@$H1SL5ukIEG)UHdvVIk%vtK;Nn(Ev3klq8T4LP3KQVK9_^jjiGvz(3dM@3W@69?t zXd;LEl`nET^KNh0sw*2aL(+D`+(m%}|B{ZZC{>tw;f=7utNM>~1+VK*cz3w>R=RFN z+tGY)_p`hyMz4FMC(688%opg={-Z+H^z>3M&#a?KGK-Qdi*FVj`O*B;{WYu6V(G@f zKRU^bKLaOfFdf)t+4?4VlV;jvccnAG_tkt|pDxX%p&C_x*Gx6$|D40Wq@~Qgn-8`b zO+QfU+0u98PuJ8_Q}+neC;r^iRol8x`d6OT4!%`AGb<vm^+`Vomt0)>Ge_Ko@%WwP zYWo*vq|E0lRdH5*H_0HaTg_z!lj#Jj$;MNH)u$W_$h*HKL1Vksl-1KuuU+-zZcdX^ ztBTXEpGS9DtSajlvi&FUIr8N~=i}RNHD|WW{+Rsg3Aep(%=6-(OFpT}ZWXCFw|VW7 zm|*?nTEX6$#(;CP?(dJ@X8cIM>dcn+<suW0xvmW9PG>3AP@3_;!{e%S^B#+Tr|vJ@ zX=OT-?J=ME&5f@L_fD?0-nNP-%<g&8%ZXE&Sjvt*J)APzP}@+9x%I5>#((OHHVXrt zTeM7GE?!|R$o^(JcYr|IPu>SU)$iY`Yt$d@EWB_=*3ggR@!H?puh0Hkwq2=U(!~i~ z6I`vlcU^wj?X|h=&f0YOm77B^uTp7!dUyGD^Xc;U{=NS6ig#y5Y2Ll~)l64PCT-JV zno@r~H+JIvxV<X!=eeK!75#Z5bMM<a8^xWzE30<4WIN9--W<2`T8c%E)rPr(U#%*S z&x`oGXMTOhPrHTF(r28x8k1&p*EnZ&fXY;-ho4W^{8Y&|%6@UzZD02um8VRVNAK^R zvUQS3&PL;eOB+u=dD9Xd!rU%;OHDmBvF@G!Yx%B@<IAsIJ*#^Cy^E!@nQ3g7f~wAj z{9Q^W=Bsw*thPM!|4;q5eXW+cD%ro+f3esc{XuVW!SQob_SPRYef&#k&e3o0eqTEi z;^mN>t*hcD#P{au{`$MRovR&YcsMP$TzS_=NAKOc=XZX^9QNy<-?@Fqm&vae3je)u zzxkism+wb*NP15B-S@In$dGpd_hOy6?e}@U>|S_ZH`R&nZ{CaY!`v@dF6I4o*Kdy` zNSOC%%$+SAb=yB&ew_ZOURUq$ld3l+4_BuxytvN2Y2%*DEqk3OP3M{wzO;(BO!Qpj zHE9;_^5R!M%laN&_;}>b#e#g<f2WIfhUzme$e$OohOhlp0#~8Nx2Su?eGyk?MzvK4 zOxeUQvS>n*yZ@yloBCa}_Q*_TG&hL9slRQ-D($|dy_UAK7GJE&{Tu0d|Aa?<#&W*C z$puQO47nnYPIlL;3x*eR36(Du^?$)H9+t4dYLSs*(X_AY-HarB98MlEopC@?#ND;- zV8bJ+b*s1Oth)Z*F5<_YU*EL#nD|`g-Tm-RVDrfdu^qd<CjYJyUzgRJ#Ch=k>9_Y3 zm(Eu*De(H4HbwB;rx{k~pH294fIH!Pc1pcLLPBTV3&TdC?GdYW?T^ja&0S#pd*Y#} zw>QG;?*F@zXSXGK$<H4jF2^n}_BV>JDvy6x#lOA$t^mLJkw3jGf?bErC7;x_cXOwm zTM}v3>??3*Ql`eSOUlQ>?#{7qW4L@~J6A5lfj9j9hg2=5oPRm({EV9tWmSKC_8eV0 zKW5{ih<ZDpi`t9@#*<d$uhH=9S7o|b!?nY6VL8WM=aV0K?%7>ht$fkCC8_6s?>)sY zd<$#*7T37F54iF2qwz<v>2*cEX0l&GcK&)dG4o>P)D(lhf`c+Cxh(#39$BpTlHBrm z!KHT3N#9p=9KEv9G_^Ho<%Jb)i<j?VIF|V(q-FbjQQNI`^$}nF_C@aOnyjh3jBBo4 zV6sGzRMZ}=km!wlTYAgF4=SY}%d`9aJu*Y&RVByvojm%UJ7?Uw=KAgWq4!VJCq>o< zrT8D{yta6ebpk{5;cj!jl8>`q^tDfyaD4su%)N=K|2O|*F>LGFXeqZY@y)+IT^}Ev zwDfo=Gqe5F!_!p{SMeOIkKS==;?w&l<F8e2sWG$RV%s2E;uT#q<MCFlQg6NfG_KeE zr{6Spm;@||joj^W>u)7@=KtIekJ79IYW=$=F-R{`U3m9ES>{O=PW?{ao!`#{oaKM_ z&&I>3PWtC9{bRExD%Wd2IgxI4CFI}xpuV1~k{4PU4MTY^PTs#DCiLw>`Q-ZZ>3VWH zxo6CNyVM;2Zp1XdT>J6fiuY9uraY<0>HGWj=Kr*6k7L1iFRJ~TQ-9Y()?(SweXkzn z$8CN%VN;dmlVG!)6OOARPQ)L*Wvh^sHsgPBmio<XP0lG2tj~*G%AZZ*ysOe|DX71< z;hOiUsf$*|9}avaFU|Nm{MR!dBhO=BR@b}kwDT{BznFHK^?mok)TldOI4&=b6X82k z#wuG>>|=Cb$&r)uCl|h2>#B2V=EPg&&#sHJO_pZ1@-|^t5&WEIA2&B@?KM3HCD&4$ zi(4l$g(X$^@!i~!k!%0naO%emiyyN;)fM8qrmmAUjkDl?jDfnwTP=~|rb~O&&u|`^ zqo8S6e{7Dz8O}*_-4`;5?b-RkMNzYC{pxL(laI-5eet3Dmy5JmX#5d&+ncR310Jvn zr8y<4iKN_Ca6EL_XT{@{g2oGjlqDXWZn0wTY~JZB5OC<uvMai>#j`K1duFg*bE*id z?e@%>$5^JDs~G3zT`P`H3I4a@i{j(vnVz2c3KqtkJX7mGa!gcuxBA<YT?<6CCw;8v zT6Sul*+;FW;wQ_W>GJV?urRY~m2hu;%Q@+#LG`DWGd;Zum$z(<&2z4hNK`)YC9x>1 zSHW=qZEKDEiLd{(|Gb-dL-bjB^1J+942S=`+k8~w^KQfa(PeT+=k<4(@GLRBENQi2 z#!H?;=NT{O9NX$W`(?e(ra2n}mDP+7J9AE+8N9v3C(UoS+ToOEmzf?s)m7iYnDe1r zW`2UQn}WsLtRoVS^$dFJ-q#uQ$_YfwaGReeST4qEcV6MAOmN8F=1*dr?AbXVBsm}a z+nK-=aVu0qtzl`U{|tsU&V-<(9?par3~JW>NlX$-yv&(C49$ExY7O;{cLdZLmKMG> zQg4{sJmbI=Jr0dTukcsX`ZQxRulvrpR2s#wXNsQBqlP6J0S6t9u}`*`bdTYilh4<0 z=QL$io0K23KhfpmJC>hc{i2n1@$2%=y#kY?UVLY`cW%0#_Qir-J`L=0LBCcuxJL?I z*<Bb_x|#EPcKNIM?`|i)+wtR}XZ@mkNz2Z?3GlDm9HkjA${4W7>`~_gMahDX@70n{ zUn^@n<+Jg|ZH?V0v-jM%$yM0d?C3LXfzA^{dBuG>mMnKIPgq*09CwZ4xY;Ot`MJ`< z>)#oVdD)gpIPVM26?xU&uJB$<Zee!dTy=Zf{E3E4@`m+x+1rGZq^_;cntMx?At|gr z_vzG6=gem=e6_+lvZS@{@_zMsYZgh?Xk<=0%l^oeD}9$4pMiDK9seUfpHo&&PH)Y3 zmhw>%WHgR_Tb#z&e){bF(Ar&BxfwOM&Rm&otgw#p(1k^BzPG6v9b|M8Vmx}h*mz&v zrWZDo!@H)c*s2I>_Y2=v_1qy^mNmIy_2FB!O7-(<-E&{Ozw_NX>EgzpUhVRiN|^%R z{aKbD__cL+Z_Y3Gv^A15c{f|T^Mr2P(Rh6M-4xetr7x;WvTQ8RcUhL+F#g_t_WTE- z=}vYxJ1h@a+^Sk8XRnZ7_%d$Aj{RRt&n}pm?#5(OHSKR<R`i}CPQ~eBpDtbrSo1RY zS%iJa*2(9m*PouqG@s$xff&DuKc5#e#QzFB#8~t4u*&amdT!YnKlvAX$Q{|TafZXQ zRR#`ruU^I6*ng^Hrt9sxw}&$yu8Pdq(%7Dpq|kG~*~@;b%<Pno5Cvh;f|(0JmGY~a z^%ESt8Ww3Z8F^oSxjjbfs#U`;$7Hdzq}>N~&KzF*?rg0?^r!lVVU6M!KFKfA<4}q* z2(-Vwam&dEkz2PJS6|v+q2?WDWTwAoiF4|H6-H)`?I#v+3-4GyUpe`e&1~n6mmJ#` z^Tlmj{KH`4jfaz~mrh&Ed!v01*W#V)de^hh{3G^#x%|4-+A}A5ZJDF2<ih3UDP%b9 z>_qj`bNob{WrOPsckOtva!P%`=et!t=Y@-1;wtaW*5!2TK4RX`@PuQt<od(E+ztl* zI$5^AGt}9uiE~dzhS$fADk<r?nv+$kh14cB|Csk=>V#<r3QGRpvb!h$=K4z0)6<`R zd!+cQv}wfw>m^@;8|UjxEi>FT_nGJ<|9CC&=&ydS1a91GFM3s5GyTb(d;J&7gX{T3 z${6b#7cnp;JWM?Qr!MC}!OxAG_FY)<<n-xwhag3M`&|K+b&<N}*-tG5>%7x91Td#A zvnY8s!T$BR^Y*Q0mvq#o=ij;b>O<$F_nMd87pnXJ+w_0O?72?b^4ULZX63Ho%kb1^ zGgox0c;)w7t#)(Xp-jeGl7|)U3gky{d6pN~KM_9F>hbi@s~I{=ZhO2etLBrulsAQ) z$8Tw_-<PWT9k*8p<(YlzZWp*4S2(3(=^VG_lL>V{OkZ~0ow6>d)R)QJ&UlXYLdOC- zX2bK0yZ>6R5dA#2NV}9t;rC)oxuUK_Dc*TfZDmjXH>=B-2ex-y_`)PG?eeUBoB1LO zex;Osm{Fg&LuKM2VZMcl-#-bTZsOlRwZ(gH`I3wO-1lA&JM<)8>sztIgLmRtfr}(> zpPV86yEE{Z%dYvlw_Szi=oO``*qgO2O=^j~`Z@E-UtT)Qy*0(+yo~eIzxzF0Ci~C6 z(f7-#y=Cw8y&lh8=4O`ltvEJ8V%cH2_1|-9>NoT+3e}8xs$JjRK4X@!OYl9#rPW{m z`KFplGQIhJY3=*;Yy$zA`O4vYvPzXwj~w~aEZC=Y`(*RIpGQ0x1o>kg|2uT1Cq~%( zu#!vm(S5r+%BCjodOqunXoZlQoWK*!?pZ6gIe(tnm?>%VyI)bHY&C-#YnkIxzW<fB zCqxwd`SdjuAI4g4IMpRoKhKue;Yir$r%{ie@Xclp3JJIH-MF>BwWNxDd9lBSt<v_E zvLKa8cNd+Y(j&1K4AmbUbB)Ql?)TvD!Ds1DH(l73r7QQy)}W(qkF(eJSK;p)7ft#5 zV%fIdq}5j(Cf)EBx~F(hq4V!0!+&d+EQ=MFxWbopot1Y-@~zTFN1pa&^XAp>E67;2 zJy>SetR)_Y7p^qo@nv0=c~3s?dhwcb*VeJyEPc{%&vW_KtgjLrdB4n+?{B%zGBrHJ z%X{CyX)De5Z?{ZL-InLk?y7O7HlZo=*TRP)M{EDr#Ci9%+$c|QS-<YvLC3<7b4C&_ zLGw2V^U4)SX&k!zw0?SKfw6<C-qvUHc<Sc`CNDVF!Q9^<Go#cas`XFmZkDN~cN!mZ zHi_o?Z+_q#8&Ogr*d{HJ+bmmkxs9Xjg>SmUgB<HGO@`bB5AMzG>ye+ZeaDyN-+P@; z-ToT1Px7otT!g6F@&h)9SU*qCUGCnim|AvS{A;I~&Z>PK{9T35ey3g!-FIV0%aYW# zTNy0%VaM;J{F||=ZShN!%{@Gw2VDAmbT-QyC9z0FSckkaeb_v?YpP7}+O1xb3}<#+ zJR|5Fx@My|(}bRjn+h6lI+okBe7WCO=s%I`XY5z?|9m@LE3#~-<+`n_DbM>HYh*Xc z!mK3uQ`O)6S-!<BQPVOfs%Hgwm%b>-^}qAsfqchlsd{~})k$SpNo*B1Za1w;ufJZJ zWOr>+cSq;Le*2QM9H(!v&A7{?v{T8Was9Cm&H;^X+3x2f%gkTdvzRV^xF^5q+}Zm6 zBYSS0e11ALW5)4|^=58sl!c<+_~}1;xS?F*o5R(WMpxdPta})GcKSLk!<mhNd3o1+ z1?OemjM@~^z_Rjm{g>oPf4^^hbkX&6J;y0Nd-IPcWFInq3JiaK$V)VN$F{Rqp#}Zx ziL1PRa?RfhD(Uy!O>jEU%&=c)di2*XPam>$vzJ<gum!Ux_#T_Zayvh<!BOSmijsv- z?iKqTY7+dlvwV}%?V7!8D;g{_C2NA1EDoQ3RcCm0)znW4ZuRr5rkRE5yz<dyo^$U; z>Dsct^W0;)FK{#+YS25Hc4npV%)BrDHY^#_J-e4WEf%@BMoVNr=c4*8_BXaFE@GJD zJWJ(BM$+6PM`qozE}r|VyW)aOx7g=<Mn|H9etXAyaKBCZ`RWIU#|tlsCCh#qg{_@l z?Y>p!n_upU84Hi>zaDVhr{1u>)_{F$(AJREQ@G{YIX;vvajB?x@}9=E^lKygLPM1@ z=YPA7AL9I7^PwpBm&vlW#a6R2Q#Pp-JbkzR`#sMPBNJJp3ujkK<SY=XUSP$yRn4mU zjJq_?OAq5C7A*h#X7}h6pNSLrDfaLAGCpgr@3yP8Z~QoGXOyeB%_hd?%_6n>$dfLQ zr9-?HPB_n9biDX>Y2HyO>tzR&qpFYEDt({G<6e@m&3|dIR{5pdCqJB>Wb$<NePsjl z2F+*QJ@F42Hb1s{)0dyRfVX8@)a~Lse_q9RFG-5XC{eugIziHG#wv5|6%!}$E2TVG zalWtduJ`}!soYyv{n;X*wRcam$IYU0C%bz06X$u0)_ZSD@-I27czwz5A1{Twe%oI9 zEHdv-hwqe`n=%)ynOv|lWbKs8x7~jPluvY4KjrasD{H~+#Vt=8PBDrm)NpxDV^#}% z)N$y4!XHPj{}bdEUtsCF?tE`+{DH2Cb3@-{^tH+?WqEev+nV4TI+|N8-2xsiu4v@n zb=&R1tS9w?f17{Sv)2CCFmRhF_BF^Q`DKr@sB6n#p2Ydy{MHh)RsEt{vsW)NdZ}$Q z^Zl$CpI-69f6{WkwY$x;=MJ<FXPcIJ`xN)_w!p*luYP=zzNEEy3G2jT)xJk~ic}hm zRT|X2=h|q`TG(SUS4nk_p=!jcw*l`i6tJ&UWL<K~%IDDH`merQc~X-y*;ciD7GN>o zbuC<N)#o>rbwaGs$8K>H<eh2mI+tj)qdcHsm$2L3gud6-LHqyC(K*6tChgi$zWvoT zw?)>0jTvV8k5c}tD0|BW8yV<++t!)MBWZKQ@a`qwf4h8TllsiEY>e-lERzp0N|wK} zJh{2Yr~6D@Q2Lwd`1+qV-rv6R)J;7Te*eJ!;&=N_*3LTnG2P8$ZqDkctkBbjC(m2_ z=)OMf?dl6nn<x8B<5{_`*R=g|x3|`+R6ogW-M8Yl&neF;K9m@;D7&d;pW!$2{hY5} zo<CV-W}@CZbJMIH2RP3CE&8{%&r&e|<?O!XzLPD}Q;fNu=y%?qD!jhxe!b28U(bHN z%YSyrV~=~ujvN2drgT2n6y7;S+TiAPEy0-+W<@+(ZMLN6L4b{$Mu>`V|DMZ@dqvuv z<{5BIUos{7i`9peUhjl|{IgQ6wcop4j?TOMTmEa@_ievF%9Zxsu_z9%zWB?fC8{%T zmj01z^LTQX@P-_IxHotQhrqkCL%$n1>oqqD2u5C-Z&ZDB(UAvUt^coHzk0CyzolJl z-^u>vD_vVxB?KM68dbY>{dv#%d{<WP{Z#ws>cn+=b?^7DNHq#gj`CT(lJDvM#yv%6 z58umNqu;v0zcb#zFt?Zc?HVV!dCSZCbbD)ppU0>h@mgJ2{wR2r_QkGuf;Pe3vwKTQ z-~V}B@58=3|H1mmk|WEXeAEwmn`#iXr@z86>uS}kE;bYARj+tN)}_9E`5>}}+vv(| z$y4@R>veNA>q9$F2Ton!s-EE`uu#FO*he<^Ovx7aD|f!!dbIWJ!W#uGXD9fr$evl% zv$u}(cD|hx^ItXffKr`P&r1aDiYJ}qJ$&)G{EvIj=NZ&X&R$=#VnTJi)sCboS#j)I zSGUbnNSgnA(=kzRam%8_4a{Hal+Gx{dv*#=nz1+Bc*cy)re#M>=5(8P%bZudvu2y# z`h?SpWzL3{s+@DI=Gy#zoc!yq2J_V)avOC{o?Ra3X8vZ<f>%E3>oXkIS<U^*{>J66 zK4<3H+iRx3y1L`pgroIJi^C?JJ>Ydq_G!w#$VsBtD^?jzd>s3&)&A7q<-Y1#^13U| zw|XXb?6z&5eKSa=+)(WBvPF9Z_e-st)!DRQ$6Ht3Z`{Xv78!ASdl(r-dOJ6-p1Ao` zU5pLygad7lrd-}_`Dos*WukLeKJGjxZNqh_Zu35u`)nG#5$|hj{@i(Ix1hfGF~@?x zi$C1D8}sz^*B#5gxb*+q=lK0Sllr0q3tu0qi{#^3DXa9G`N8k^ZYsA6Le3T}o)}ls zdNbJZ;`FDh=k-3@*LCRinU?E*?m{usW{BF&X}-eLbK$|vSax=sowv$#9_}uF+?ZF_ zr#`FV`_HQn3Xk=Q>9J1#{qEnK<BB_ZtWxT`IJoph;#Q{hT5{>HY?+=Oo4QA3w#L%y zQR?#l6}wCvmVD`(vn4l8CfaLHag@w#4#9&L947j)?Cz9UZ)4uld28jm&HImCxy1HP zcbZM+dY?MQj+JZ^U;D5{&;P5mjPLKo7j+W#&m3Q#5?(Zyd4{rm_#E~<KNNS^|M=E= zV#60d_xcFYxUMy~wj0}sDm<>W^1kQ1Z?E?n!Oby7m7JUFCN_N2cf0pL;@^Qc2OC{O zXYYM0?OtwrG~Rg6^aqDlPl#@IuXBC2!~0my?`h8h0t-$CvsY#{xc;A!C3Ze(rM1g) zo15oN#MU%~3CplPowigVF5rWdzvTL_v6r<z3T5nRe8l^uzIywXAV&6Z-$%S6`3oEz zL_DvbzjZ=!&gUB8v!?l?2L$f-O<@1HtU~Fm>pD-zE8;WPU%7OZQ_|0MP2$o+j5-C@ z9EQs4cCQXk-sb;GbmGsY;YS|02A!V&Z&RID?W>x__qJQypO(Mn`eN-#pNw`#_fMD~ z%y-FZvUu^5N&khzXW4PqA3pj%gDvhSNA;Fpw;qM;agM57{v&mk^S+gbw0HdxVGG*N z?OB&_PwC-=d)6g}4^6+NOzTdWHbXb--rEVER-MjTTgJMwtZXg+<dg}yUoIS6!C7Ks znAH?0{9V+<{Nf#-1n(jj-;Vs<2_f98-Zo7NPC8kcvG<tOX0uOQPy4Y7Z0@S}oY8P} zMNGj7@fth!8lB>#s6&gn#aB#lb9?Y))`ut0cQV(n)@LZlI_<Trsi{1(?}W$I+*hvN z6<S4Z!7G?{GCoMr)Tju(8+H4lQ^NPelQWD~PuMeQ{RG2M-q|7lR3y{aO|{>{dh>fl z`Hjk3e{%M?t_!x`@+#>AZ&}yxrGjQREbC1j1kG=p<SakFJw5ls9)ZNu_kMP36&Z#< ziQKw#?bYX|j(l5>%{s`PR3?6U!4GTmkLrn^=P7;L?_utAV-I_)IM;fIYcm#qnB-M) z^u`|crPpVAtp6I@G}}Va_5H669b#Qig&%J=wQD-3X0<y*_^h@@fNtT-Z|y8AYCliy zDw^JXw4OouBKOg`+8aKm{$t=W-0QL>^O>g7>R>jeXZ}0y>q(kRFI&9hcbm7iyTe|Y z+{Xv^T0T1MTy6R3*a!Ejn@x9anDgsS{j2n_p-k-Z?kQ*U{+qoFu1$U;FpD{Z?~Q=M z(bHLHnZ?*Xdm1ffdD~d>`0?2+{ZDQg-F)14)}M=eG5efx{WT*7CFeD%3~kdTcD*u+ zJ;xoID;c5vY|7toeYMh$>1oV=YZPPDXB+RmmK@7AlXFwT{~5mp*LMHkG5^c4rnmn& zX2oWdy;Vy*VfUmn&njcy5^3eTHA$2F!%v8JpR_D*+iG4~{=tV`|8)1$_&}Atu_^}@ zTgvsmb){)2`!1J1(Nu3_x635)v*pwtH=jkj@~^U`c*JjIR9%%9SZbmEtVOEiNBFyj z7gy}>ZZCfF`0?5cTi<D)J~->$`$zdTFKoB9PEPu|)_I=nrw?z=hLm6Z8j!5kWwqQX zzi5?=k8byRPuY%dsjst>?*C1haVPW8n;gB49e;JjzNQ&{d$+wcYB68Ut@`{qudZ3k zd$8oMG~4_pOk=OA+LljlNB^)InYEWpoiV*~wjOVA@t@M9qK%qzpXN{B{MPd1ru9`z z_nh+$F8!FRa{2nac{jrS+msWTUa3W^CTsTZu-w>Z8vDF<-XEES>kFT6I%%javAS<5 z?=<ZV$IrZqjbsXa`*Yv@_k3r+iT^tCqkhKu{h~4_ZeEOvm9NjZsGj$gYu@i;`?}R@ zZ`S)9RY_H|jyt=S?L|RGTl(Rz%l-dExCcLeeR*>AuXxLYDNf6eGCdY}nKPGl=B;J_ zUIlG9thYa>+ozxBSxVB(+PQs_SFO&!u}wZzI>~95+WBvh77rI+QeXN=^wnhBUq@`^ zEv|g^t8e)>g>(Dj@RF|V@ajPOw38O^Qs>A2zgxp=wYXXHyY8Q<fl`9<<(m`57alU) zn){VgJ*v(=aH0Q$C*OV7uJ;LfUb%nOk*LPt$6L<m73)SM`M+?GKKu9F+N}AS7d1CC zTh6$DWv79->#vz<JJs~JhG+A{oW9`uE`7e_o`S|_>3^&1R|>|l-Fg+iCiZc~LWh>` zR&%`gJLK+9jQjm?<8|9hx3aEshqqd3xy`t6`^(f=tJ3?@TMqraGtYgqN8XpvMcIoU z912%^ZP>a)P+x5I^p1)}9se~ZU7GsWENN?4j#w6xsl@M1FK*N<bv|meU(-!~UFMI2 z+)Fms-gpvOyL8EU>8sWCx0MgCEcjCT+J5r7TW2TE&+8RTWK;Rium7*)@ryH0W{duK zyfc1v!sIiXgr?N*{NH;rOhsY0@^1ID?;6@=>LNaDO(;*f_>+cI#ZZ{*#-czl)dU z=0}9o3d+YA<O`N=eX?tpMoFn)=~qearp*cESFWB|bRe?CzIfZ}Rxi<@rT6QL6INSW zy#D`SY4ztIyUS8pZLco4?pTs<#pi!3alQ4kBWJg4ah*5k_OecED_J>*lO6N9yTvZg z*?Y%u>YvSzjy`(i>Rnw`7VnxjeeUge)#UP-J7W!W>#wF>IJ~p=gm-g!p|!ZoiPtM` z>d(HKwVJo%YV7{`(e<pmw2!a*!+&n>>Z|p?>Z)C~zwEod;YO{*g{=$y=J^zR<or7F zxiYj+eEa;fEA2!gg&$e1m-@WHPB$o!)ys5Bmck41b*#xVj$M1z=&aP(^>NF|wExrZ zN~NwgJTv?03huI{ace}qHnhGzaHVo}()SYUt*f(kp0YoAF3o55pRKRCOAQjdw!LEh za(BX7j>q)}K2IsWKF_7xbwOIkCeAWbLz#2c@-s9a3#B9o>s<M~;`zdtKNs<ApFW}6 z>te5>MBd_Wf2WH*NjzB@A<&Z2)3dE=*0vJ4ZB>Rz(Xvl9P6bX`?5=+|d%Bji!lqwW z_IlM`efT$yY3ZsTiS~1*X6?JlWY1A}R^a=go<)oAAJU%kcx8R{q=}6^Ke#kh4|hKA zTXp2xR>kt~HOXP^KYhPkPY`+iQ|GUox!K0&+a4QjeQ{c2-Ru&x1;Q5v5-(m)vw!uq zYGYWogOlus6Z@Y!uomfx>sX(tT-|Lavxd*8@IWDdjKjAr5@LJXV??*V2s_QP(pJ`H zGxt(s(UlBbKXdrPt&G+zt>;V#erb}Yq%N;#^WH~t<(^pfl$Z@G%^x-W`80RdY2ypI zMghI9{kCVn<-gAUU0Yx9&vA9k+8ws$2LB)MT6|>wW+qxOujt*Z;2VoPct7($5@gg~ z!kT<gE_8))*6x4K`BT=PxLp2!rKIxb2u9J^e9a|YPgXXaW}2>L_B&VW$;D;$J~J(6 zu351)p(^K4*pshbVPS07f6M!Zv?TEFI?}oH`oG(cbJyQhihp(XfB63!`~1ZUB%?Ql zN&VzovS3z?Zsh!V6*p&|_+%9uZ964ZeRAsD<9VMSep^@VZ?$*#`6WMpT=@6v<+q0q zgMVkgU;ST+%Sxo=0;{b2O@%h8)PfUxpB&1qcb=YjJmBQVXKT*x?ovN<v*U~BglEc! z`W$X?7n*l%O_F|iKXrM<bLL*PA3AEG%ln)s8ci@V(>N@*qQ_v(V$H=-Yp%Rz3Ru#k zaO%T3c7@b6f-V2WJ9IC6JTkLhR9Vo>oKZ%`<k7i<9nvqB)$UoBcRl-OnMo|C%12wa zdHgDiGXB@+|NT7O-~C9)9s`}tetOau1CFeeF?%g33~I{DXVxrvBrEgbEvJ-Kqgj8Y zKRaLIRFR7h?p~g0HSa}D(KDBLN&V-lJA~(5-8k#lV_!ot-LRiG3Qli%`<1!p_Mr&} z8UL_dowNQ)wA1282Tv}T#m~#K_Wh<P?f9@y1!a}V!R{M1>t)lpB0p^opIxT=Z*|A4 zKWBRWW=JkGJs0xnXHMUl>veXGuR1dxTP9hHJ=WWuSMHLu>8#ndsf-Nr4_Mdi53{>c zwB(2N&&}`t{1JY6ZLfG&^@nqU-}XOJd-X>%;z9Wgv6{)&9Ea==K3d;;sNG4^o$H_E zr$$Bl$*kNT&+O3ci%^%Z_xE1%b&H)DpY_`LM`O#je$(2lWyQ5qz;NcL<QvZxN#37z z@ORj5>9hZ$e%Kygz9ZL0_uskIbHh#r+>q|7{Fk$orO8(NN#)ez$9{YLx%ut)iqy{f z=YN^%zfb7C^l?FqiSVA2lI{7PMy~x6w#_SYYFZt0*Q@1l))MaCti4k_Qr*_nAK~8N zcFSNUld$aUCr)0wj52>-c@-nr$N9ANe*Jny<BRp@9IIm;!n|xu-^n<9TBkc<q0q-z zSK}!Ym*x8&ohV|wBct@y{CCcG)QT3c%v`E7^{&oO)1U=YmBAwk!joJTdCPNur`=2b zk^J2A)8>z2J01BaRefyC&$!#YfBw?X^-G<W^JvZw+;L5X`HimOwA#Lx0xP7qo;F+1 zdBpuE>%xnl_g$MeVeNtK$0r<W(vygoXt!b0Vb6cE7sYn)99bEoSK|8Go~Nd@Xm84j z_x*(jQ!jjdamVu5jy);P2lA@aCYmMlz1Zn~zSc{E$M!pz#iMcZ#ZLQMt9v<LYpb8( zuRjz0<k-&ztEFS_a&ETTwd>+lT|wK$AnuD-_o{iSW9|m!#;3dG^h-HsU3>^1M}228 z<HRYg2VIhy%uFv{OpjfZ*m|06-HX5eUyq$Ta^VI~^`A&t|GHxv7+B67-oVhtYM?Wr z<3&5OklGh{`CkXjs%i@V9N6Q^HjlqvCa%Ig>g}<|$NRV6?ax=^<f&nFmuHTT7D#%a zE$fx#z92!_sUdOw-`OnJi@gIrhwazBdBQq`gK_a$R~<K_o4cf<tgNM4*unxPayPME zdZ^_sV^mQs%J#VI$5)>XQ`L^`k&eFk<dxXUMIpYs?><UrRR|K;u9-V4K4Dt?70)`& z`u#Stv!1Y5O};I%@o6vP<}aI1nDd>nb$UCo?6Qu6sgK=-YeL7qDRZnl|8DD+orw$Y zTzfZV{ig{|OS3BzHZ455`lr4`+QXTNMK^9NIGdd(X1wO!1gW+Kb7f2>=7@+*ouYD* zL(l8=&cvRR`&Ld{=yT(&iHnXI_tmiFdW`L?zC}&@>Q~R_Kl5?2n@^so!(MyOuK6;a zaS109s~2P{Y`JhU+URA=%ghf?w7;cV_}jmn$(ob&`t*crlP!0!I(ICZy7(f?3tu*i z4@_2WCzj1}+Pm(8!{IG<nXgtn_4}*Uw*14v$urXD|7P`%%iG#9oqyBYDK6g%CVo*< zlujyQb8wroD*Jz0y&PNLGC#`-i&;{APbSxHXzH0UH<DZRC&Q6rUK6fJrk!_i;M|=4 z<lH<<v&}4%J<L=^%ecHAw;6~s&pUE7q$l|;*NrbdD<x)hHG+tVVV*53B{-s_EON7d za63(_I$`kIiOqf9lfCP9n0B6&n9;+?xW)L*l*YwVC$I*qnl~S>*ErcOoyNw%E?~^e zu&`q$qe8%;GYn^VI&6#``Z$9UIvzZemAA2bz<m5@?5nd0zs>tkg|6o6W4hL78pXw7 zBQLT0hNg6lSD?kxipepP1nUiRKBgVI8g92aKGc!<o!eH?*v)g#M3l0fKjm=sE6-ft zkmM7x90dm-ZG7LC5>U8Wvwrs9uh$Q~=lr?$(G8crn3PT8`SWc%-JE<Bjwh=Gl>G^m z;Iham*}ssX;KmAY$2xXl|3PEfJq8|2M7gq$b2@6c>`mxfZFXzZ+)KNDtnFDNJy**A zTyff~j9q^p9_|nf>QIcxo+`a|$0ygvHxixVeppO9$8s`U(K)4A#r@c`3H6^GI`y^9 zb<_h4-pbrMba3aIsoL{4ux*?jYqu|ZQvCOZr4oyBCFlMv-(+QRaM!#QeVUSYrI$w^ zTll#1<hoyd&nJD9krsa&_kNvw-tL4NlSZN9voEK3uc~!^v!GUC@3;GM`PFa55-P;H zteD+;Wu@3&+LX=a-(DVDRPAqf|K9!k^=0-&VO2kt`c^Hu`}cS5`*pu}-mPVD?=$zb z&YpCQ^TE5+z?~kl#gjg!{?9*_f9&fq`F}l}S6X)^94dK!dz0m%+T&gFcX=f*Twf=y z_gKrsTjANyzT1_v9FGX5btX@;Q_YHB{%8KH0*{<uUb>;`$yv8w32(jm`kc8J@3)=i z#+Pr^KUEdtb3X6BNb2#k{q9L|`_^pJ?|xw5F23VKaglgM%RWE-jH`NK`VTuBkNkOf z@2A5e;j2}%`c^)y(a*fH&g-ero`93LE*|rgy7%+I4c6rhXD^7%Q#vjX5c7X?d7`;` z%#<55-}JxM-#@cpf?Luhjlv1c$8RY!ti1e2AcsFEHNmf*_rB-$xc@)dq&G#ZFq^%h zGa=!Xn)tIvJ3jq%+c)WZ|F@3Aapm4`L&WbLWW0axoVCtoE0M&4H62qX6fKVMPdU4- z>zfNxk6wye$}*0bCl?yC@8sOcxl@xXPpHSGohv+WQQU8xnO!|MzU$v{bH4T7-!ija zA$T^QXT9H=^=}@2>8!W^^J>PjJY{JmX}P0q=2zCATVQ;y&1~_GGs_w+BJ4gUIobQ^ zY+ir4aM}lUX{mw<k#?W%pP&E1{C&~~$F$d??-%dhF>n5{tEo%x?wQ2cCV%#y{mTP_ z*7ghMc$b`ytn_BQcFxf6eA>!+`K6yc1Dxjsh8}$JVD*t{ntH!2Blyl#Y_Fer#ESh0 zV|apd$_<aZ2CS=Bo2_qPo_txBr{^})ccpT^IV{uLo4zNnIMuK=>MGCr_l|l`Ua|F^ zov|dGX9v$Q?@jBkZ%(aToN>x-;zE(No1D*2n%}$K!{R~q;xo5I`<`#!85`;1uJ>rF z^-kToR$sTSP1o7xSo^-w;=ZB3EqZE}YW@6si&nkO?b2dDIYn12cS+kGyAHlNtU>Q< zYo7f4_vG{Azs#9iJm+qC#b0{q<yHIbCu7^M$e&nVHg|8B%Guri{quK!cUQT!+a_YC zj;VL)jG*r|OW*38{H7(i*6PgB(^uJpK7J1>e6VxLe2Z^xJVz8}nFq7QX)$ze**@J; zVUP5lzWRB8zDzK#`s8@fbn=bf|6V^6dZ(5tG^bw;V&{8$e$S<b>>z>f8ryFwReig# zS^UM#-;F70te@1+{<wTgV!ck;zX_A&_`bec`ul}=pY^+!Tpz@1Z|MJC{q|2P?*Y+Q zUlty0nPOPrux(ED2Z2@9aqgGC{+Z~+zkvJG4q;z6Q<oQ2F7@tlLR$nX^fJ{2%3c;! zU6Bat=G(u*e@kNESJxVW*qZeBj~4Ip^}Hdg{GqAwCi8t=hg)l%*52^g%kWW8_Cd}f z*<<sxUrxK{a6VY=#INfz%HP)J{V@pSzE>A<D{f)XI>!#bx8JIM@fjC<sVY9mvNrvw zK2L?^g<UsK{bcn@sIJ*jf2_nuH@84=mPEAHHg3@sGTWxH^YkCRb0)Q9b#jjM!@qv7 zMU!v8R7~&5ZEni$+n5`2XhjQuNA7vUZMAk^3Sy3OO}X*7uc5ptN@r1RLWf=Nik6!q z5{v9jog^0Ze{z|8v0!4R8P7#^XYR)5lj@ibI@qv1I?VjBal0bVk^1d34%9pR(e&9h z!Qqb#^GAsed*0cxXAA}Am%VIktl&A4o$+Ix%<Ha7=H!EiKDbt-woSjAVG?b)Y?qwS zOg(Y$r)BDXi87_No02we4>&sSMbxCZ@k;mHuI-NcrEylZ*;8nW!4t_UKZU2tZ8ncv zwf(s7bT{i+@4s8>8qt2fgMZ?p)}XcZ%m?q6XsL?lYizu&l$gcG<zVzkx%16u<!cWT zcJ7?c+$j6xt7Hz7<M(yiZE1<84iu)J;Mc0-HZ(dd5X?4dVe5fnPy5D%Qw&vpf^nG- zuewQoI($fX`+X(n=Pxt2HJ&sV)QDN5?8EPvEc@_U*waaCHzeMPPUo2ZdQXe!$qin$ zJL}c?mUuPt@Of9>J1?>|Y2`(alsqG;eG3D26+h+TynW<o(pRHEGrQ~Dnr*8dw`yx` ze;^t5d|kd?-O>qrmg;$b)w8L~y0-hSwV=VDlJEUx{WgDs-cJe%dAsOYw`7%rqQwJH z;(Dn*VN2_S4{o#XG+C~bXmYL)j9c+xoqNQ_4~+H7Yc8$0P<rbqM|Ks5l=7Md53JPJ zGR$T$G~?mW?%`EWVmqMNap7F}Z%Kw28HvLO1dDa74ht`e;bA_`9UihSGw0GArx3q& z$AtE~B|P{QB9ZvO>XfjrTe$nO#fAlQd30IkdH>>MVZJVL(?=k#Cr4?|%J%E_Ts<?F z_RcX(+qU&;{pvE+de)PV?SpgL{iaMjrEFYuuw$aSLxieeWl{gKz%^x`M6YbvZL+4^ zF2O^+@0aV$qdR1N%u}1yD*mYD<*ywp#7u<jYfH2r{gn}UI>|*~p&BFK1EpzOL}xah zZdlo=nP`9Mh{;o)xaBXU-z=HMBFa9``&TEk^~y)N^2r((ll$ror+k@Ud@R7>py(tG zj(6MIFUlvdbX=St-t%vPt;C}Ads2TJ4{JVO-C&T{TBvQ1(p#uK;nLSRkHZQAoMbuX zd@*>`wvnr6N8%A)<vfW(XMS$CI|h%~4&@#0kaoKx)ZQI6Eob4%ge64{j<X`3wFF9T z7btq(5PE9&lf>BaO;7gUtKT@Q`_3an-bt~1n&GR@W@$<}P1u;dsoZYCio@!?k}-nu zXD0oBBmVY6!%f9o<!1BPTc*Z1sNT!9`}oXVLeEw$hO4jdyitr+XH-M?r8OR}?uyM6 z7cboYd+LGc?;kI#7u{AolojjtEbsk!rmOE_!{;!>lx!?~Qkc#j;-7RvaHU24j4tN$ zs(+6(>gr!i-Q*}@wfSE)Y9aJtM#7S6mbp<2qp}q{-zW*buURmmqdb)*d)r%2zW<%^ zyn8v8itiQP_VZa>;^XbwY};1cd{iCgCbl~%j-juIHUDzJRL1D7t0e0#=q%~xv3S?B zv58xCXUe2I`q!9FKdCq0ed^2|jg8U*Q+f_=&QlB)wEcX%Ku2ay|K~H!%FoNzvxom- zIU-_n{?E^dKJW8ipC7M&cw^n<u)hoatoHtTZnpFFgkQ`*udKVTZe^tLYKLCtz1pfj zclNq3e_z<n5yG<gviM31m>2!x_ps*)x*jT3yCI|)S#f=G%66lA#p|8h<5t9)#=L2m zk#=1DPgQkq(+bs{a?HzF+to7Gx$gOv+Il@qBuT7jB1`+_eSC$mx<M$*x2?#*$a29! zQD()zm+KT}Mo#?WY5dQ{;^Xc19Xk#lobGG$_Rl62E8#_+vt}%^JGPUzZ$fHm-s!Xn zZ@%XoZY{W~{@!Xsz327fQ`~zea^;s@+9baBX6J-YGb=YI21Dwspl4@~$#k~3-l|`j z7c6wG*y_Qd7V#dABQCo`SBOe89C5kinYU4D>2IT{^=A!}{?`^SHwd)e5`O;IJFclk zyiKoe-8DW{UUbO#s$N>%tTUgQ6xpN9qxVj25V|3^f4BL46@};Z^|G6TR^HG%a?925 z9CL&=L&Nc;ypv9^e#I?(ID5;(*&2IhY;63XwCCc%-SZ|GPuH($=d=tIG%X04V4~=5 zHSK7N%oOI0SvEV86l@gJ`#3FM=(FcdN^<i1CB9!>(cP?>MY!n5HoomM45l&)7d^61 z+ZX0@!m|mQ<~S{9)K3teH$k`{@esEgOA?cCQBv%;LQczKpA!dL=3L%z^Qeq)(Iq`w z14VY>A`_FE@V?Tcdm1+;B>qt2(of4d!K>dl(WOH0-iZgjC0-dVJ2`{O><`N<4Q@aA zO+_#FU5V^2Kg0O9F^o-q8#Woe)OIe`p2Rd;>*?%}Jii}XPuQ`~m{h;_q+8Erh2q3) z|2DH-Cnj<qE}8PwKlt%cgZ+}yj#(cR?x{?;-tkRILF~ZmhASU-U2i;^@k3ztinxp` zvm07&`fR)ry&}oKMEB&ENgdlKp4Ai1Dd%fr=bNhI@i5lPNK>l9t{{W){Uz?ilF-a) zrzd<l79$z4ELU5<XYIH5y!w|b>Sy}#sJ)n;nRxWW?a%ce?)7|srtHIH@ulJWGvx<g z`ww|PTlqYCu1(2I-A~rGyE)f=h>NQE{dAkmjJF%IF7I01-|M?Wttvu*Ln@&9^rwfP zrsmmYGKWs*S*@~5dBLtb3noRayr31gY?{}$mMJ!`ilYC?t<nqbyJ?obdzRpuJ$DP& z*8f`;)n>HO<nYZ?OWS+HBNpv_(j_cY&B(?QT9+f0y8Kjr=&GqTyaKh^iv?OG{`V<$ zzk8$i%6CF%a;R`XOW=pU)0>q}y_vjr*)*dcUF&vyIT28Dv{A@a?7dvtNmfy-#|(*6 ztI}n(&Rh=W)ba_Lp&2;Cf0|Wgn2EDw=C3d=*_`?#0r^aaxV}E){GwL1#i3$LLbKZJ z-P#rQ*;QA{+bUaC3QEr=PW1|38?={C^Kp$wJh(#_7N;}Ewq?neCgHc9+aDgW3qAR0 z_v-WYyRYBA9QV(hdCk0v(^tKO=KfoHZ*_g1{g(0jGN8*T3Fe6{=I4~JdlOYYU| z_**@@=FQdm{eOyXtE~NYKYw=axB2a5pBLWsa((`1$<muYy$s*X=?{_dISOjIJo1Qq zUh~FaCR^ycZI`E?&TxD$Sk>=P*{`A)w&c{6_s`RAE-A4Oc=5{mpxlz;uLoP5iqusl zq%D*zTs1Epm?O0>yy)q{c#nr?6L#}N?$L@fyY0a!pmE@9eSN_V^FNnncHiMLeWJH% z-T(LVYF^$glfR|=Zd2WlrM|QJ_r~r1{h*rFnE(IxrDtnz_F2yLSs}W}fA!p`oh%1C zKC3M=%(a>kH8W?Dl8x5d$;#q4Cuq9JJ!iUcX5ylgoA3W=*O(R5^Ko0iCAT}en_qaH zyg%V<?2bR}bN;)1Z|}a}bHAQPuS+cdM4mz39X1}T&q7=MOWW$u27BZ#E1jGwF*j)6 zT`^(p^F300Yq-9iV?U;6!Mf(W%Ehhwi~{FAe;mEi%|l_5N-Bf;gsWC9&YOP*?>osX zThabCytQrl`A0>HJIr_2e^?Xs>cGN3kvc1%d~m%l*}X@(Ua9%xdyQ)+611jNH#MKP zeRV-)!553KvgWL+m$~c(ruyHytkZhV<o3pJo;$p19%btTgP-{MoU~55%o$uCb5ZcP z%B$5Yc{@M*bn1(qxyTvV|DUBy#eId3*hyCg?$dqwo1*RacIZ$2d~}IR&6PvWL4x%$ zxAw+(DgH=_+P=5!^TYae-|L@v|9vQ4CbIT+TCM5^=3hMLo{H^oX1`V~FK^$y;!f=E zc_r`VJbu^bzn6b!&r!eQ0pkt6-n&0GWp7;h`qdFJ@rU=F($$(ae+Vjw^p82euueEU zdVh}MJg>IRrY$MGB}W2oGThP@+G;YbJt#;(rd9O!B<GZz*AhLG<}Y>WsBaP|aB2HJ z{Yp*U%~RL24sB`fw%jd0YmV*Fmrp+T)~LRppEBi$Kt;iU?Z-3KOu{%yS2MD0F^r#e zCUU=?@436|7E*n@v)nXQgiP43DT!#P?CUPeIX)-FCjR%zpQ_LHvh7ZAefRO}F?oIY zpFS)e9}ey~_k8K&SJzt`{?^_ul`adbzq<NV=vS?Co2^89S(fjL|8ehk&9g__ykD)o z_V)1G*ze|#A<KCRe;&MgYMuJ?^n1Zy9?j!-e%4;~@!)UWI6oWfiqPv*CmdcEJN4Ak zpkMsIkNN+yRGhE6%)3lTymC6z+g>$0kGHjN-fp<15ff*6aN@bVw6#yYe^!;0cZptN ztluZ>C-=VNteC-qncdIYzxVsRx$)k9RY?7PBlgRNsnJ#Yy%~ysynb5rlI4+kTk($- zmhtg7-<e+Cu;1$0^_9Ng-|e}x?uvGyq;BWC8js(X)z8h#xxFl}UUufS@Yk;=?ECj6 zDj@6qPy6fl6y&t`3d}wys`Q~hz5U|$6T9cHnD#d6Q2jzv@v~CVaWScvIw$qKjfnrf zYAx?Rquuv)*FIz^zNRwqtlAaJ=U<}l=CRd<dCWJzuW$Kp_A{IMsr}EUAFe;gdd+y! zU2{*<zZQFESmi7J^>fOtS<EN%HndcuaGvSx7qc8W^*IvDMFXWCFF!DuNBry&15V*< z?{xb<a9alEUaI|5|3&k(cGjIao1RMNxR);5_QNjs$o@RPc~`@|eoc{jH~S^{2C&;^ zlh*z}b>!Aw*W8R*{I+{lb0;cIU2$sJpO+KgOuIg{>BPboBTfT`4A1iS|Gwv^F$A#O zU&J6_YZ3ij%}i12h2>w1%a<?f{`XFjHYl85b@|rjy^EW#3GV$8!cw2Z70O<?f5Uvk z2T4DjkA4hw*7?&m>%uDeY0;(`hZfbOY_LnYqU?On!m}~wp~75I!D&(@%lZBnr&t|2 z+s}Mby7%{<(tu2}6O!dAt&h)2xL<c~fA-i!VZwWxH@D*={!RY0Ky8aa^P+X@SN!9- zc<6-j?{~-hZ5MiIpUUT(UEP~jR{!_JnwAu`>*vn%ahh#VvUK5}IDMaU;+Oe*OFZ4@ zw5BQx%~^bS@81LAlP9D(*15NA`lPNUa5QLUm*0BH+Ka7TyEYXw$BG*-f9}$CNQLv3 zd)d`r_1ne6*QzB}9J27ONIS-~zrOCa-DK9qZywF6-M3@kzKs7u+kWpzTKg?uJbZd? z{Y~?xIcD?n3|fWeMsYr{s+^b*x%Z1j6ie>@%^_iX<7|so$64OW)@<#TofL9w9cNHx zln>*wzRq_R#_xW`d`);=HuH3S!SNTH8OviI&)fZI=XVYN4nM!R++7pr2FZNu(eXYd zV)yj-(FXI_iis}HLb@}<r$4zPSLAK(GQs8a8k2gDMXd6QozpIg$F5l7u}F}`cecu` zp35GKCSG(?x%h>L*JII9rp`Q16P1t`ElN*Le`yo{xhdzpsmko7+!y}-m3Llz-nRdB z8~3KPnN!&!H$PBLIcxN55%*M)NaLmjx+iC~PV+E1_0q|10+&j1k_YQ6$@deudRT>) zFiq6H6{g{&RUeRFF_G)cH@2*uHobdaJ*;yIR2Qs#^2{lqMDX3-=l1VplXoOJX%)4c z5Im;FThwyU{e)oJ7gupD&7u|-$7pN!6^RndmAOB)q@3ZYJY;j!M(Lz;R@fEsOL2v( zPs`r>n{?-M+u`2#ueuNIo510!6e51V#YN*mtbCk`)8@V2D)IHx9&oiiDs(rGnehJ1 z8j};{Z1RftXM#iHM7a<Puj#}{b@>yelMD@?Sbgm&U(t!|c$nL}xGXl$TFNH$Emz!p z@kCY^u@Ab_T67+qO7&9zro`Q$qwuw^X+6i45)+=Cc1CS2G4tmI^6uOhq2RcVzy9Qc zwT6vTifflFbAK)rcmMudS=lXptDYF}i|L#7&$4({xPJpnb$j8)Kij@5{PW(}KWTjk zKVMX-2Al8E3C$9&74@ry=4|KFI_t)#>{KFcwUFiF*UWeFZ>Dda{ovXgkBl4JZBORs zugi<peD3QQ9vpV%>#}{<v$lGzbvyAdY)<04`sv@#^PMx&KEKA3>sBCF5^v=GO)nBU z^KO;zbD4W+_wVYL&Z~`loy>W@oV8w9e6QI-<Im!>IHkKfTHju29^U;jPBwZ|iGhFK zdb!Kn)<o%=Yk%368o;uYgZc25h~w|vBrpGZ@ji6*+09ZHmUr$;HE>oaNc<Wxz534i zt0(<s>^2;&7mr++9X%)VTXI3w<35>lZ{$A9wcOtz>t56P^XSA+m-`-m{QdR=>+wDH z0`;})Hyzi|@Ot2?x+3<lv6kvmnLW`(Z;nqY6`vxwHQ(M<`+mcoYbSOeu+`rYp7_y0 zPHevLowIQVH_QvQow8BMS!P1L)UKGHQ7Lmx_~#^5eP8Z1(Kfu^gfZ#6v@Jtf`OW_u z52*O8PLEo4+|;n==gyxOqBL%Gsg*GqH_lXHpKA87Wy#E(l~F8jEO{&bdb3Xxd^6Q8 z?0(5!r~49ozt2D1Z^e4QG$W}+;p*)&&HH8DpX9`?6SJ<H{k#3R`DWz}UrR;)^2xh) z3zl&IWBZq8{jW_<;^8|N@p_8~?>;|zH+|0jUE3aux=s7}yo0-4{?dgHVrv3^#%8n~ zo0a&D%W?9mN~=w;<9+q=S03aJNzgv0XtUw-&HFZcH8y3isp`&WkoE9jH_2bbv0m=$ zD|PiVLiOL~FPj^&<m!i%hpJvu`hPavod5QYsN>(lXHhRM9(-82XzkZYHYt+js`axk z-+ukLtMA82?|H}WuK&gR`^u{L`x{P|Wxr-R{^a_tuS(g{Z<VU`z57)UJc>Vi&G+@2 zWml(UY=4!$f79yI_isMk=^yW<-@EGEtGC~t@@8+j@pkKv%#WV0KTn@szcKCavUBIw zznUL?d9{lhv)Ri?(MG#J0(El*USwp5a+~DuSK3(rE;q(xo0oyzlH@~6zDJ)}uCSC% z)I)oz*vUnE-KBKdcPRHR6P<Htvj38kN;mA5*|sa3O!0j6nf;N~LAOUmAB!^Q?1-6n z$9i|pxs)QOAI;Z<r+#wWI&aC=WtZ-}TvS_jbKkxl`!ctl|2K8f*JVmEsgI{zJNWQn zo$9=6LK}We(UsGzUmLN&(JTAd6vt`8YRNZ#XRtnB@;dlQ_M_(cky}(M|K5nPT_-np z>jK7`*Bkb6ObEa8s;IquKgaRA1v@^*)*3!}8l<?aqf)V>ZQneR`)@Z*Ro|9AeSV(3 zw%Yo-PQAIz1ve8;A6jBrpuH?yjOEh1@4X9Gr<EHWH9X$Rv*unNSMpAgU0Jd9J9EsR z?pV9}^!@cWLtlS>n!o+q9hNd?#=hyf4_Fp3KAX<>kfn>!Wc$pAECr19+b-RaR?+Ob zKXr56*VAvGhy8Aw8@nz4mH6A&Ckhtbe>FcZ`g)OxAnU>FbAJ5|;bhYled(wvvZ3y9 z-Toh6I=AZQM=Vw?+`TVj+qyrTK|;&)=O3B8y6X4zYh61nLVOB8@3b&=l>9DOy5a-h ztKz~9j-KyZRoBfnb8%5UV)Cr`dV62JlFd|^kIFV5<X@f7JSXF`$n4Pl0)74mPYSe* zPHR{;FNoERZRuK*9<@w8UHII$yK@^?-dbbI#4ohJ;^or+Ws97Q_s`#Ux~DGw>C&sm z6lJoG%(tp}VYvBt&g%a<^JeE+6{t_#uE#m?PuWA+!%vg;YyUe@-|_#=k{j|l?w;$y zeBMlFf5Ku~9~+Q!vvp3v64Ny+zFuTczj`KP(V4zAUAi4hi_ZlXOxRRpdzq8LFmv7f z_7@TlExl$K#OE!z>h*I$l>a4%$yZ)qyE^rZ%xb}JdnYbk7Bx*L`M}dJ??iGfJSETT z+1Kyfn`s(8r})6-Jkh1oKle;8?orC#a_-gk>uW#6JpS|QQ?UVSeIWm88{Yon6ALS< z)^3hhskjibKkFoKR)Ijp&3|9km(P|vJV*Yj)Ysw-Vq6<`&$HEO32~jbVvf&W{i0J! zH+%~|Y<h6~+5Crls?F_oSE`?I+Iw@)j-5Ml{@?z!x9;k`jQ^iL9X**PVwtp7X<yA> zzkh5$v+daaPkpdq`3Wnx{qafa^>6n4ds!74wk~wN%-gM#K5DE?dF<ymBh!%eMxKGn zogJ@>f4VQeox1K!fMl(iKy)djWpHAr>b~z;)^5i%Julz=wNm1ND$Dzj&}YW0j5hPs z`7BthW&B*KVbvMc(+#W6@Nn--14{)??OZY0@m}L9pPYcW#m2M4QqB6a>U;lM8Pp%F zdH3r=V9RsM(3!%w!$g>m>B)653di${Fe{nlt+Cc%JF`JUgYC>N8x1xdMwfqfOBn<v zKU*YWkbbm*^OW#+J>Sg=jYe*t{;{O?NM3cTs#wrtxbEr{Zr9fQv*GcRw)S4}S*M?} z|54a<>pj1Z?s(4IE`9&1_}|MaS2F7t`CSe-pEEgEto_2?6sgZUUpu=Cu2{a+&-?H` zTjNhHW*XkRn-?GSDLbE3xJ+hqg+;JmjqRqgWj$4MIBUc{@vQo45%rlTYr&d>#sNmH zAKE^MRaaPBiB*+$eAuS3hxN6yGuKMSwDkw-k`k@Ls?M(ZRw|;gLOQ-}?J3^eueZPH z*B=gB&F;QZ%kdmv`KEeFF{ue_*d7?YnUs3rjZu#2bY-tqJ9xZLiEJ*A6bn>mz32GX zNXJa$<=zcPN-sPAv)C+Lm0(w1`$EG>j_>En#!p>Oeoyw<=f6a9LT7)hP0AzTc>c9| z`pu`7yw+M)wD$aot!a`qPofqw7G^LMt@WP9xbs>)5BI*j$Bs{;CT6={aa<=VE%HcO z<Vn=yLy#D;5wXgilO5W6PB@e8NmQ~p|ITYit}}<8?<k$AVtZgtz!`_*7kIjx`W8k` zckf@tUBYoU<L{-yABK#*d<$O)%nDUs6&Y~B$a>0y*Xpz6D^i;;JMF#urP%p@MCq2E zyyczyE$es9P4k_6;jPI$P<*vnCuLO2OjsbP@u?>Iaf!#{EMEOfJ3Joe8TWcWziQa0 zlKj4(rNqum(8EEQv3Ewpj0P4Hp$jQO^FVywcRNaNOl;_57E)O-ap4`Q<+s0l5?SWr zlMD%=Exly{4v|IewU=+JJQu#Bn-|h|{%UW1WY9sIciD>ETU8?DrGh+oZv<8^2s&@b zHs_|_bZaJVNtZkOZa#h0b$YSG*}4?l<8lV&3*P<iC`i6%{4v^n&by=YSQmaxSKSrU z>hM7?+<d;z?OPWz9?5)Z-+kg`Rp3;e2tU=WQk~QLOqo}HP5HIT#z;*hEx@RBW+a~{ zUp}LFWPQky(nrirjEb@64#dp5a{H>nAMPoF{~E7^rCd__!`?eh@Sos6&-SL?-9c~P z&z*n#vU2F@DKq6heqQ+{BTDu9pLjW!pvUKQOU}mWpV{+n6aSR;ebYWUG^qtY(av&W zTJ7idAVp~JvZHR(UK;K`KJT8if3WV%Yvmap>CX->+$kr|R=+Oi(DsAvsU8ZPfh*HX zY;NDYFr{$L_B&Hn%0549{&en?9y8O%9T#>#-RAR7Mr`>8&-sVs=D(l6o$tYGv7fsV zYFB9Vo!J}1>3#sYg*@r?FP8E(&YSdKZvG#5UuK4rhGWyx(4Si$%-v`EYSZ^s$3D#5 z`D}0Mw=;c-^_6vvKias&(_N?bak;Nul(ld9tJ~i;q}*i<*?IWvK86(rTffeKa=}PY zVdm{svT2J>PgeRq<A&{@GdkbQRc&71u;1}mOS<M$_2W}{2S3+`-FnK|y(S~DrufOJ z^$`ajn}*r!dhlAhXy?B2f`~T7;4`=EroWk}zTu(j(^uZHw}r3ms=xDTi`7MA-TwQ< z%Qu|5%i`tdEINJ1Z26dX?SJd;_Ags-QdY4w@f6>^IXn00%YD9imsxV7zwGaesn;?J z)bFIr2~73r)r-m&S(?c-*~sGX!yFTtu5bah8{6e~8o6{EG+fGFk!!ib+2@YpF1sg_ z)}3EkGR3m9++6o$%NHg4<t-oU8C1_Yrm(28s-6{!`nh;X%El;#>8aH_Kg_w|dEu6c z%Qe0IobL0l@>X0oX}Y-mbZ@9|-t@jyHO86zQ{xl@^JHhuw%#5eEE_7neevoV?PrHJ z`tq$kdwQCw>{g$qw3WQyWYd+y->j@|vT=Le5o20&Rqp3fS<y(5T(@WiuWO3+qV*Cp z)p~T6Rqx*T{PX2KXJ#kZ&F@ok$!1*TvFDZC(QDp&!e%`xzAfl@=);cFTxp%tyL>d- zcYE7k-u}p|M2>Gh>x~q{7=`ucWA7E|#pYk(TlMjd*Hx81*X!*Mc5bQP747AIeX;;! zpk$!r!5LNu^bbbN3-)Dw@|0VEMb&CS+aINA^$mOC*B-sBR-4VZGx>Wi=gO!JpASE7 zwk^HyrE{TS{>gOp_dR~?(f1s8Jj-`WRBBLHPH;J+%dsNqx7OysRg2gD`TW->Go^O> z8+YwZGwV}5d`q5g%a!76P1t%z->>e)jq+MM1DnmC1GiTn+qdF$XvY5qHP`Mem)oMc zOXoyiYq@g$-{?rjM^hK^JUU?hd6Jff>0!@#mn1HWA6op}!Z>JuTcx6?kWR#hNuUM` z>l=gi)xVcIuIaMa9(jJ6{?<+%>&UI0(clt3A>#Z$#)bDc2W|8eyQBFp>gTqf8x!Z8 zDhj!M-68VDi=%IP=V#`8y;nDvO?qvKhpQ0BzDIke&$?b8H7oL6z&v@r)y-EgZn8Rc zbq?3+{U-YP|1!+?=`D27{#7wqxpuan>0N7)|M#Wpe~3AS-_~B8w`!%}t`*MK`rZGJ zKHK?(>)c&F6TVefH|=L*IU01^tNvAHm)X26E=5IJzvYt+{#XlhWtQ=rzb}9K%TDEe z+ZN^~r0=;Sa>DYYZ*={AXF-$TmP$>bn<j=&*h80iB!!4sRW+WKGRr<<mhCa|z^jDP z%;>rEG$(1WI(4yV3N7)NpcI)VeM3^;oOOvuK+TjrN-DuMD$6emXggdg;)~9!IT5(C zti~;0AwJ6vT&VuAbMX~5)ZP4KX7fjvz?%n?4#;i}-ceU}b@HKi^~;{@xphNZKDpzu z(_GGL?QJ4K%vIZh4MOc_e>(1DG38l$*i9Qn`NdrsCj(cmJn^UJ%z-Ul&bMXzfAMhJ zK4CGlG=84%lM(9Dd?~hL$)DAGdbOT}2|qm~tsiX8)1te#b-v)%`Bx5YQu~%{<9owD z!`I%wZ_}l7Re!wiZjg&OuYINdnPx`MZTb0odhIpa%8dUx3)C)pGi}dH9gEI8Gbcs) zmB~un{~OZyC*kt!+zpDpxhH0BRCJ%wC*OIj{={rv*ClPd2ixKn+AowmIr#_syB1CH zuM2ISuKlrmk9xBITX{~`d8eIz25@d&T(fM})mJTZ^Nv^<ZmpW8-g!^wulA{FLQeHb z@BEFzljENLd0M~c7SF`;5C0vN9FE?~Hb2(+HZ!bc*|VyXUo~p9e1E%Iy?+;;rThJL z)fUw`U5!T+KWA_G)Nnhdjp@sY1>5cFd6<%ogq9zW4|Qevk-TY^nWOZH8OM&P3jFRp zRXMrh`x%v$NgM1;mVB^vi*WjSDXw%`kJjJ9s`@Col*zZ<S*{DL%vV>t<g0$LVrB35 zQ;cmJU+j?EuHN~&;?>kIhWqO+*e`ExU%Jn7hSVlkx%o?{bN!c*oR<F0GR+{(YuWlQ z%x-c$8a!QF+LN==tnYWNy1f0gUqtKP^gD$)%OzxcIiE2-`*bKKO@I02i4N}Z+IL<p zerjyEL1cqSeFR@b*EOA`XX^SUFFg{;woKVuG2F{?^86VZKJz}WIpGv#{59htbB2_O z?xIY6mYlv-zIJoMR!&dvp6_sbL9SqK^~YHKqmPQ`9bE5t+3eDmeGjX`@4VvTx`P<6 zDYm`0M##_3=knvZ@>lqzc#EnezAOHAvQ@G8X|<@H^P#=Rp6Y$yPOq!XpShQ{bZOwi z)lY97yqGBEq<+US=U>(dt)IFXxtH!<N(<_o)l{`=o!N=m_U8|toj<v?L{sBPZ=G}K zE4`i^<M3}L5gS9V3w+)7-GOu2`k70ci|<@X+&Ja(_aoDi<qQm8Ijs*oopa}={SKK0 z)yIE-d+g%5cvE?O`L-KBD-S27%dGTsP!s175f?G%T$pnFU8Y-i^KPC+PwuA#U;M7l zW_?P*X&-N{#H&?T|K2L}+4{FCrT9g|{}?X4VxJ9<LX!oytP);kTcfi6LE!wvK+g1t z3^8wkJDDuyK?gF*zSo%Xx<9)r?sDnr50)<ml8V9}hQ4>JOW(Ms)%UWMKUy!%&+YK7 zeZuaOwyJWG&*m$iQhizJQ1EzS!V1P&WxmDN+b3<C{pvxJ&DXf&K3_9REdx7P-*hA{ z_kHzn>5IfqGO0(?y62R;%y5|z(!~(&U1QJ0@GyP)??|5=ry7+0O#dD`ueCD0W0&NG zw($6mJoYjl)@4Rqu4kX!9Oqj9<&~(o)xyXNYkF<2b)BAlLHotkG`Z}nt!Lh3i%FET znQ-&&o*c-M#k>2tdSF@5sqp1$0^(KXx<a`R{Dfa`=5szjd7=L*!N|qoo|jg|vF-bD zElI|Wk8S#dvg3ab30<GD>~o^M#Zw^z2jyD9k~K5p4g23eX({;Gp0jVIc+~R5?0SA# zAI<c|y7AB6y7*?z{qS7hqbK)BR(0xBA!q50xlxQ?Unl?En6O3AS=zAoR>w)j?dPvv z-y$eo&zyVYQ|kMPW=U6DbB`>_UgSA@t#2B~<+r=1s;T!VaQaz1%ss%lS#3&R?e;A$ zo~!poM=5<-wlA8a^zy<!z8@F0U)lA#+}CZWpI-Q3MSR`bMeoI$ev36*YbJbow_7!{ z`HzeZw@vr9q~|MVPM*hc$n@y5SsmI<YQB6$I~TH+-8i3QFWsGU<9wR$iW3X@V+%Gc zXDyr);j}YBp-(|RT2Ve~oB3fjTcsBt3xECyxVx=t^ZcVrUh8NyW#u0$sMOwVV!9`$ zDDHpB-9z<%6|w>gpZ;ASxszFbcF&!{>O-wX!tX8@T9v%nZ6{w-vy!Xqa8bg~|8<%M zyQM47Y*LqwsW999T&$d@fAy}UZ_iI`u-Sb6Zg_iikoAl|^N#6me^QmaKgxU6dS{mf zFRnHoe%!p5`KRx~X68Dz`E&OeTgm2CvM=1RQRl#kUwJqC#p>@`eCcxDQMI@%;O=6% zzCXTFkq69X-Ei&uc2Q5Q#s5sN|B;oFerG35=9Rv)hI8wKA`My2g1ENNn>tmeaEt9x zDRgCcJIjA}$6+r!rf1)O2!G?KZm~_9#cIm8>Z;MjIn|TSCW&2IlyI=4OSLrRcz*7b zMUv{e7Z*Q_IJj~{fXC+K`ig&=Q!^`-3?%=C-*$`ZpSQs*LVAtwuk6R|)Bb)gdORcU z^W`J4e-1^+=tu-^4AJ5H#gir0v;62qo^4Ba-(UE!YEMi>d0pwxnRD-NJD;bgcl%B3 z#IJ5)$BlDWr${o#rM$P>G&?@}&FYFrH<VXLOUww%%-HQ3c3af{=KZJTP3p($FCUql z|7KC`<z2tl{_8Z=kG{U9w({^fz1!wryUPMPKl`i6-RpAiz5Q|V>jjh2|GfDguYayC zHT~<hKXr?bMt%DH%Xf9;ukEVwJ~i*xlwQp<ZPt&A{dexx_W9ClS7(Rq&#L{iUG<(n zXLLo4fi=JOt!_2`Uw`h_{o#7|z4J@Eox4`Ou=tmWJg4uOn0H-{z4>F~ee<?;0yFmt z|1!L)UHaGKhK2o|)rvy<lEPo<OC-L%nfOmH?^63L+sIk59PX=6$P0KqbNBf<{lNbz zS0^tDv3xout}dZGnYZU-iO1xJIwo-uO?zK{IbvaWy|71Z?`&CVEv99!b;DVDE}mK9 z@T>RY9Q}IrHl;~T+V@T_cYk{8qvT$NxwG>5uC@2czG(^9e>rPYWMtm)D+ZAX$JN!( zJgpbga=o_wZQ{vY+ME6sRhCaqoW3EIH+QGL+2io0mV);3{Sx2zJS=#;``4l^MN5rs zFKbmkYheFf<NWRo`yE5;*4OFbwwiC=ZIWG9ckJE9g~{bRUe_Caj9!?0VWVoyzT}El zgRgaEKYyNn>l>?jFJI4Y`;DiTze_5Ax~5$bOf^!TVDt2cf}v#l<Z}6^@vY%6Y$W<F ze%ulKqW_&ta6#(7kBhY{_Fpai|KW{&+oALucbn>Mgud#${~Mnkwd~h!4u37<9hF8> zaxT`#W;XI9KE0s7+qtcvK00WRs`Cw-Ri@uw2ei0$39R9lbrq<-@L)=8VDPt)q9fry zuD{yOTV}q*kMG1Bp`$HZ>a8?hJPO%+tf*+}9w&9r{^;=V>EUk{?Nzd!Q@Hx?Qp4V- zb5=>sP5h$Ww$47*ME}<Q4fpkLojra3=K9k8EH74t+W+2qHN^hYPPr*RPt5JFj~7<i z?)2!S{r&6zD+||Vm}SP!*!ucF?dzWXcMSes+qG-o-fIH;r*~NEMm)QC>&G|W9+RNS zUCnQj-&TDqn3Fk4)LlLJe|Lx?=R83XHQgT@f13KeKXl9M<9&g|-S=|hPUKwMzxMv? z@Z5)g;`eFn4|sJ$`E+pe=}6a_pTFk*;r(>IzJ}+YwxeOl#L}L+{YMUkb)Am&0MApY zK6VO{%&jd_s=lUqpe!|gm-V@x-FDOKO?JgT`y_wI@K?@(*y}r<ud8@xTa?%Ne($Y$ z8<~ABl^Ab&y<Ya6{Iu*R2L8Ij5}?qWAiK*t>HUYG3%Pes`fMuTnz;JSuO2hrrB`}v z&V8w`y(BH~d&~9D)h+){nY^5|UcF%TF4w@%KYo?&kG`7PI_KEWdkuOD9Gf=?-|$>h zwn+T$LheY15L06n0e^w>PoB=yvR}L;O}ccBzsQ0e#!=j@OKc9gF5MP$`Rk6SE3GZ$ zXYQ2Qe0X!Sm+H#sCo2=LC9@@7k@-C_a`8dg@=py@*L<w^w`82clJWX@qHlt6?6QAq zHr<(m+qV5Y86IY^M(=lGnZ@sevezRD{Z_Frb4{ztIl$|E?yZr_5rKTAy8b=uUw%8g z?niN;Mc77%HwOzio$HS8oXRa-`j#==T&d=JRLxI?J>9?KLU}A|68=B9_&aopK&(RD z`Hk#e)y|o}o48zC>i=x`b})Z|;KO!{AHE*eO6&I?{cM`mdGn{5faOWQ<9iqr<}lQy z+P^fruAAN}VwJjXy7#KUxBY2q+h+$kmR4QKYd`yBTUds=saHK$kQ@_7&^lGk>t{|b z%3__ZEFr|BS>M*;tM!NRkE6^#hLcS^vqSSHvj#SrSV~`B_uW`X=}5h>Qr(<tZ@ZQk zZ?Bx_%1;bhAM?Or#m?6&mtX0M`pVU`yL~Qui2bLt)jyA|sEvL-X@>OM+uN=L9ZtEQ zA3Et!ljY628%8qcdiG`auMXo`{o8R*`~(9%uk@d5>ar|?j;0HrGyb($we08K6YnaH zOYB_rzUIefx$>BGv)p>E?e_d>Dy&btRWkE=!Qsbu7x<;A9eH*-=)v;sshV}_GY@z@ zQ7oCTwMMR9t+w3ij0X4XjY(N;-+l?avER@1KjyLgJ@q+jyc&g`_;4<IDRtp%OSs*B z6_z@+`v=oj$%|c4y#7jH+x9s(rksf@@GHzTns6Z^X0?X?l6^6+zpS@ecK*)h37>B+ z`&ysk`0v6@xAp#cho?J98!hI2^=Ro8j;ZIryfI*wjFk1XdAfZ<9LwhZNZ!R0V}2;7 zh#&kgA@+>rzu>cx3z<Fily-7(O$sRz%u{RMpnpc!N&3@j-peapFFU0P&UAe;$?UYw zvUi>fd1eN-%{=mG&hC&&#i#Vw8vfoDv~vFO;=6Xsm(<%yGAbwK_3nQ@XSYJ=H0LYg zCSo)8$nMztkLd#o2xiL9+A#ly*(~-0Hxl0%d|NwbLT;+bi)(Lc*K#^o1~A;P&ZwJ^ z?6~86@7>1{TI~zi+xG2VW$c&dztE;~b6wu)nRC{<Uf7lpXWUq``rOK#>krI7e3ZV& z@_X5dRW&C<D+BBIsB>$s3U--xqvNP|`Bq()u)9pDdm8m8oshf!;zFxt)$L`gQkRF_ zYTgy!-yg@kC|I_A220B?rscOI9=R@N(A>>`*2J%y?F1x)#y~RY&8X#xPk1<w2p=)7 ztW47{olyCm^<7Rk!_m1>F&Zil_x;?g`^ny@*fOn(r`~$P^p+Qkz7_4&<d66nz9Yz& zL6z~=ufho78;h>5d%<LG|ML{rC!NpjHy^%XFONw+TI*wL5W0Oi+no(D&uk@>k~+)< z_aCo*aOUmo*pJT_6|6~WywSXI>f-k^6!t&9bE>uXR3!5}OOEBNBJp+{{xAR9{g>D) zeQ5s&7Q15?ch8!0pkDp+p^4Y;J^Cr-wvXum4?{=b;wxVTl=X~x)VnrpQup7N)~ojU z-OIu^b8jjp&N%GJw9}&8-Kxav<okCX#_HXl6qB9=&5qUL;cVOD>+H0R;UB|41-|-* zHNI_Uxguxl+zOkw$qba=bk$;Bn#C)nEbB;L*0hZ&-^1r<Md7}pi25-5zKaP~-|c?B zUoG0(<)=F1P0y<nAAkO<eBDrGaYaw6Xkq#3$MU8R{N~@2_FpC~rfw9u>F1mJE9UIW zDhhWmf7EeDD<oohe*Z4VqqmKV&sLv)GgH>Nh<T^}9fLz5{HJ=S75V0WXPbKKUYL^4 zq<adWLDn2G#zP{H9!9>NF-NI>iI`Z^*M*9$HE*iI52b^q#9(!}5))gXhxmz~GpqT_ zruW83I?qcvEN^P#Vq@~_BCE$7zO01r5z1=>uW49kvlJPnKa~60lVYtSbo#`niI<<- zeCXS5#9Oa>>g(R-!$vy4k8YY=`S3*c@v<o^jf9uZ<f#)$^5t8+@_K#w)_nWgQ>+1} zTX|&sjGUDA{{Hr21-rwV<lBDcXC7Q)eXS{;(A(zxF@757k9~hN{)s%fzk5%5RLp`5 zLHEF;FKcGZwNX{%zOtx`>2_l5?~6(6j<-8muJv_iYR+9feKNP(v|RUW&$KrZInp`O zIo5HC2e%o^e>=GC;I_?8N;k|h>ldor{`ThK?2}~z4-WGOMopcNcI5A&Q-bU%(R%fs zKh;xq9^Ac|B}DEKcj`S|TX#K+hEIK8R+@WAS6*rp$vhXlL@~Sg%y0G!W*5vZY+GxQ zd}@pD&c2un3?Iyr8XC9HJh5$UROZfvl*-#K+jy7X5out~WzId#!tJoFS1c|e_eo@Z zw2b=_k8Ky#b0?oP+hE3ZqH$~E*3>3eg_~|X1|U;EK1}?%p~z)@ziZ0Q$4hgIuY-qZ z&crqTJ>s)HrT16uDcjf6f2$Skm?HC0c+V5Q-^;e|{ym@f?AJAcmUiL6o%izAS(W|a zfsE{wg`7Sfbl&iZPRjDre;u!H%TldBDSEs@WW~+?I{l>bgfG88eVki){z$%TVfgkF z-#+i?PE**i%O{~~S#EBIN#Q*8+|^%;;(~><FN7>nY6x*MstuK!Y0w?CphkDo^HW_X z1)nU?G&-$u^4f|wEq7z?ZY%57(RyU{k#S+e1U>h1vsJ<0)Ldqr@(4(f`>|e>xl7<* zW4*|s|3U#NKh`V#QT}t8k9D@6v&F6Z*7o6@nM=;BNZhBy>2of7s+{lYC$s*aZZ62b zv$J*G&DSqyFTdVA_vgvqvELdE953f`e5hHX<{ud*(#z7QDA^c%dir~V%b$Li-?pu- zjt)HhDunm{tqB_+>`9un@l33|RFIBIOz2L>+UxWC>tEQX<#zm+6!MS?fR4XkTr?|b z=i;Sdz6)a`-_|sS^&eIaXKPlPv7|epY2vPj?H@{m)tVzOO5SIB#dzV(oQz!!YcmSh z2q&ywR>6EE=lJCvX=}{;vwHtpEqbv?Lu!q`QIJcDXHe{~ZMHg*<&I^`z{Bbf=3lXC zPiK5zfAh12p@Ki#ld_V~Q<fK>dQME)<DoZW)zN>?;+<cChu8Ukp1GoBxOw}7^rhEr z5+{o4cIEfQ{1nx$*mJDQUA(5&x$pBXE5Fv@tv4?(pJe-q#mq(~Dzo}f)b@<Zm6pp6 zD4+CP`~8mQlcRV4JTN+`ey90i=id!CewVk1v{}~gs6P^8t-g;%?|rxGgDK|ReScpV zWt;2}R#f7jaM7;s?D@9^PeXXxjq9iM78w6ik^Z>TRl?z=WT>6!AC3Ay89N_dT0P7A zIM3vY(#w-<L@QFBUcG+bAft3`%3a=Oz1k_$@+2IVIW7x!)viyOr4z>eWK)j5_&nii zg{a$ePuzNHF8ii_^Df5svz+2ZA4le`nf2|+5@zto`rM#=;YsYXe@3a~nEFr6KN@3U z2AY!okYpb9KWz?TU_CYd(#lI$-7i;faId@T>v}KDcyVu&>dOiHIa_>$oy39{&%42| zbm`5#=4OtgXVke(SDo1XO76(D)4L(V>V}8vQODIUZePS6B<FV)X<U6l9C%!P%R)yP zZ|lC7qMQ7@|7|SMl-2fiV*0@Of%5{#D~A0SI4TdAxvEancM$M<*&t=KIAX<-x~*k? zv%N~*?9){Y<u0qMsM)amomw}m)Cc3AZ=TG(__E-%HOKY(KW8<30{VBpp4oFn@aA@f zuTGDvwR+dQpY}Jy)$I9t9+OVJyW2$779LnK?f22Iyt2R7oo8=LFSC1fZRH{H(w$sy z<)@sV_4|tROqc1bH`jfbwV|F>&tXr{l!d%M(&B<xm!?^q3>HuRx${iVl?Tc`?sk(J z7ic|Ne)wwYLj^InInUSBKR+`)$}NG(*Dp{Pyu#)$v-keYeMyIPb~OCk`YHEw@)?V% zA6IPSPrVW=IX&;ZRqN0G?tRXGy+40?)?fDcwUF<>ZQSd*T>YFUn$Nw>;M%-suVu~Y zdoc?yuU4vYmOR<^eubKHjq}9Ka{B_`Z;C1GkWF}JaI@TM?h)UdRg0hgsqc0PRnODB z_sF^L)YiwwRm}lGpA`@Ox-j9;cg0m(mu1dWJulO<e8I`tOw8|Q%supV^XhpbW#+0D zF4kL?J+oP1>SXiwrr*Jk?`@~#m8}H-HMfWuPj~KIEVSi>D))(|;!E=*RbN%SP~KX2 zPT9?W)yX?0w`Li{KV@GQDs?MQpevrQp5qCJ(9QUt`92o+b!WK*nYc`w!L{?M$J7l8 z>8l)^TIOueNnX{v_fw(Go6ys;1sm)_-njEg?-z<rc=zF*_~UuzGI=%O@n8Jdk6msN zY*qXE*=2vxU8bi+{S!2{oUCBk|4T-WQSPB=)@PZr1@h|Oj?WiyHaGa^ED#v}!8>c& z<^%QiZ+tv;k8kDed0#gzpl(CvM#UVDVChe3IVXgdJ!Zf5QT|h!v*60)&5Dbxt#4dd z{Uu$dD`))|g^28g_*c%At71O-PxU`G?^k`#!4K~*KHrp~6LQGr#vMN6s|?EOdzPz< z^{+fWP5tJ59d(^ktL>8{cg%|1RnvPScgoTo=Y9MR{H{N~I+pj7>py!BmWL71W=Acu z%+4mQWI4<&>l$I$BD$IDQg!KmBOiSmvAB72QZ$Yze%Ag58uk9i0Uq_<eLdBxs^#wL zUt6zlsQzgq`_-@M%=4suR%Y7kquh6zJ+XMT>}kty&<OYs+pj8@<3KU%ly%^=?WgI- zyo^;(=GVX6BEnLYB{g}$^clPDOqOtblKIpZVdZGU$+*G({F&9iZ<e0@Ad!F6zv&~l zbUNeXFLQ72GUB{%xll?@o+tOvH>q=-MQ47qufJl>9$c((LV3%U(l_&!4}UsicYMks zpOariLs&vsLY`c8XWjC=A~VhMe%Gq*l}KabY;zxpPW-{Vy_StNnX%q(jc>tf@Bpu_ zTH&+_n~F7Aby?IuNo~IDmzlle*zs4Dto@&Q!&<M#&zf#tzePG;@Q&b}?E-f^85c)R z{&lli#AyA#n>``(<<yi@gf!n~Y)?I2mjarp{Fn9JY))6#9DT*|$<<yqo6gv~PpOuF z%6M?4#-={;Lxm!h*O$!XtDo-UJySC_ym<}h-WLqYO@g^sJ0|RP`o?v0wdv+?{iy;a z2QOMTe@%S5*ZuLHn03m!O5!>dC&5c5<~e;blsvRJvt_6Krj<;lr>l=2KU*Q<aojTX z;I9jT3;uuFciMdJ9+Bl{FJAba$UJ<<Z`Nbo=XaL7iq+XXh`qdF+5dU0{>=4vPff`4 zEn7A_aP7(V3pyFsR-0&FdYQTM`lkia7uJTqyq5BON@`qpOIl-Py2EBOSv|iH!KS0$ zbvr5+bqQ=231Tjj5TBu9lOUt~a(XuJ)`?%b-+B433UmoQR6oIhGn3)!%j?$#H|*$< zDN#^-+xNRwbzPeOw)KX0Cz-zb9vVLRRlVBf^BZ^0DB^t5SJ<K?an1N)5MPY$xihO@ zSNz-aDC^@%&WBcfmKlD=uQ{bl4=z8r{OG4wT~bfaEng`(W%vKiU)%Vz-+xJdqZ55w zd$m*P9X5Z@hk@tW?@wM45FFb(t$TXL_ahw@H($*2h!40bUhXO!c{cFtXU$FCIbUb@ zajZ_;S^sm}?bf+XrY+U3m*aP2RI%xNKj9F%{lM&Om(u>7n{L`9y}RT0+v?bzIqY{& z`u)CYYW+6*Qo799XVatDW}RjKq<3cDu^V@l&%Vh{>6}>W`c3ra^&72Dn=5Y!<Y;J0 zgBbj8o{OqC2p+U+c<`+8f!i;mU(wZDe3>gG+54+@udCO(RjRln-*CrdCbqS^4s2GN z7N93lA!a&nX(W5Gtzb*`skzy&q}P=nU8`4K@x8n7yfmNrzSa7Rbc@3*wai{ldBoPk z;kG4I*=ZBYNg);QYd+H!Y~N|Ody+);?Cee2Gk4pSh$vp#VZ-y#yJ~hjD4od4Pw(ds z4WDDKJwYvb%i{Xi&gUktxc7|5x6GmCk&06kUnOU?|D5agvD+^kXH9GVd)RIF`>C}t zX;1hf+>MHkpXFVma8YjY<7lJ2CEZJv>$s<Xo)w>Wxa8Nj71EL1CrzHb_gQr^@s)|) z{C2KMEA_8`gbYoGXS*zT(Yg~hG~EgxnyyD3n~vrG+m(C{GBo{e#q;m`7wSz(o6=sk zQ>`W`uSTh_JdWo`Vng2;zlC)0dh9BOh_p0deTXJO2S2dXa<*3~vTgv{F`<aRe; z>E~A(aq7Fiwj{SCFKO4B8-9H51WBdXweR1{%J<u=xGtIeW|MljLH!@|Fd=QvVpZwq z?bW7L#;!rpCy(Du^4^-@a&(elf_lc!Ul|r*4n6H{uRj(&y!-R&)AX{s+jhHm?#S6( z?s`o+Quh3owUbhLDkkpzeIl<ecjNj;oyq-c@)8rGmM(lN7MUAvlUhIhKIc3Me_{W9 z8@s>xzJ9g+m-@9mIkB6+J>|8o-<@;+ivBG}!Grr}R8(londTkuU)QYE@^SP1`n?vv zr_Q~4`_u1UvFwxQUz@K@dwG9ajp4_=o3DlLzRI(&qV%VA_WioNE$h}r{$2I;<NawB z_NqA#KOTHzv*yLyIX2fm|4jcg<F{_S_Ty>mA9rnF)lEFCH9dE||0CYURQ~IA_a$~Y z)u(*(dvQFZJE0<|;*#pTl53!m=GieE=?6~93wV8dRLJ~4ILyB*=;@T;s-KN_drb|F zP1&v%oRYa`1IzFIk_Te?GcOijcdvKlShg%UxFzA^r2UT<9S`{_yG!@kbM7Op_jJ`~ zRxy}IM*505+1t)y-;wtEUUlCM#{3tv`$4sTeU+n?>3x|s{Ib?JJiot76jGWo^=X+8 z?_}1pnxaE7|I!x*rPSV*o3>`R(rx|eN9A7IZ%DndDgU&Wan-WWPiGkU%RaZ=+0VZt zxs2=j`E^x6H}0ld`~2;>o9ul2UBUI#rUMR>7kGM0R3HDqmDu$6&8N@PZ_nQ4wf=rg zP2R@S#ou1mfBMvYX14OQ6gP#+X&)VvjQFJ9+nw6awf;h-fz0B^h08C<-?dzpaOBTp z_wWtXt6%?nc(b0T_56n2tp5d6UPa#fz5m=6pReVDEg}E%KTk2X=_uQ%!CZOZRAS^` zi%$)=Cq2@wJn$@V?Z)_aC7qy_gxVJxO*b;x(qDGX`d9yL-`|z>g({KX<5wDPE`Afy zf7{HgZDxj2j=|<5Z%t(#=37?pR#&@H#>mxkCTfxNxqCnFulM5LkmG5#EM(Pjb9<li z-;AgJe2SeJ`DCSF&x88B{~KNT7GL?<V3h7SX9C}OhQ9@cE47vFcWA{e=;rBffBroE z`IC|@%Q$p)Ui)Vjam;9Gxm$g@#NmAly7`wMU%vSMiTBGFKi+)*r2VhN#pi!+sQ=Rc zu<*mg`fvZ$bDky6^uO`*aFF8vx%GeV{GWfhTj5MtlvvnTE2H~XkIxG&`!6>yzGl}2 zf&JqByM1PS$;iF?^{ipfl_l#P>ej^Om;H~)OsaK#KmDKg7pb3xZddB2eBAiOZ<$y9 z9mkjd`R?a_@9+1IG=1Iux%z+26Y2lc^*8C89NWx(ygz;2-ve8p*8f~|sE+Bk;eMC> zs#%q*CT}#IYv!?Mh2H%Zp5JT#p4%WHtn@_h*Z21~=YD2PFnx6PM7Y<Q^}(n9W%;Td zS$hA)omrEtU+ubPTKf0<-uF|i{(V1nJ$*^5k;T&7`q#|6_vWqNxq6O*NQ7|+`)AX~ z^98rOx^Q{J+>P_)_ikBc9Ur;%j(JUIWo+%cZ#^r|91paN{&G{N#$;ya|JiT<@P1!; zI)#VXGDKXk)->a8nCexV^>xvYuIZ+R_&svUUZAJYQNBR^g7CVkrX9gtyqA0$MffZh zU*T;y@#)10hA9i{(^tL>Q8m1s<yyCp;o~~LbfJ|W{ya|%cvG5teQ}@ond^U@-qf6_ za<5(+7AURMl33=d(;7JY{669558r9eo!uZh`%R$uYSV=)vjjNxI>j6hK4YAy_A7a} z%8%*!k8<5pL%nRpl|oO?oRI%*#-#j`cTw55LcSc>;+NBZC-8J(XL)_{&vm!!h5kR^ zu&|;$%m2^*>$UvPjXUl{tUENJe(4oMC-=KIWqH{yIem_*uT+ey_)vUdgX!|}&G{yl z_f`oll6(?>Hod&@%dsnde`lCDKH1&7J5#B%Bi_Z_*YVQCiZ@QaHTzft-mXxJWfk%@ zOS&S>@QLMv@lVI?(u};XKOTzgtCu<Pbn%jyQ1jIbgN%~{g-tq@^)&7(YCpYbDi*gh zi|<mWgu@cysAa;lBqK`}D6VZ*a-4W3SY^re4eT4(ZQd}RlF`Z#I3=@cisdAh%p$p! zcbBqhJk^Lh#cBH`TFbI)U8G0Bo)+(klFiDCf_|=4zuM@%d)2Q<_dPl4J2H}gtA4GQ zS-O79(F4ak;%|l+b0&*NvE(|a?3!d#5`ArsQ1+{H^Q>ES(m$Q6-?!pQZ2GZJnm?}m zb-wUndxFhm`P>PcZ(IHJI)1HLI%b7X{k6r#)7h$p=1-T|`={agtX*$~^8IxC{TAI@ zA}XFeZP@|8=}R<UPITT8s2e1EjW-}paGMIVl7D?yq!4q`hndgK*uR-hZ_Mnk3aQmd zR%8&7?c#IQzxwuguwv@e_C%&ri3gH)tNS!0?z4-WT;D#+XXBi7p1zJt;ad^{69ai& zZ2RV)y8n%PZ~Hyx_pGmLYlM$F-7P8Ap6GDRqd;J?t?Z#~C-%Ha(#-Vl>`V({W9wLN zdD5YDW?E2vRJ6cxpQZXyjk*S^DNVW>^Zz}caPk||RsLJLdm`^BOnh+8y2M_Dn<Kfv zWr~BL&g@q{)2H-2s?BeC#=iLoQ~DyeMSaiMHLOHr&+=!~8JuKsv93&Hyzsl>UVD<| zc?lW8rK>Z1b+215Ki6{Z<&(vwzU;+WciG}wR<^D*6)Z7vt#^34@Y{>dj@2tOIvu=O z`W!C`2?q2|<JjVIKupKjq2d5baDd(4NLfM6+h6bH#;ka?CF-xR9rujD6;5$ohwW9C zbzPn>T{LxXq0}^nX$;dG3XUAzmb_SoH}$%7nZ|FY>i)>%{+YI4)wmeG$R^f>BscCp z{?d3$eEctE*Y#_67apj;aX76%SH~~*X}*O1qS6bQ-m}h%&2`?!X1zy3agT?>so6p? zmFXd;*A%I9-#RLAC#mVjzPUn9Om|~!;-}BmI5_>L?kVfPd`H%<eY&=}J+;SYS_gk# zWAH(3&8q%KT%oT77OZEJoi@{*Yct2vD@PM}Kdoup)u3>%ah`+!j#r$I{OT=DG8Qw3 zJ{93?RA)N>=w+nr|KMjgjn71O!b*dw*H&*2{|_n!zU*k9(>r-p_pQ?kYd9mOn!M50 zSRU}su43WT9ZDQGY!oiJ)O*dJs{6&FDI_xfka@MwNpq|6wWiu4Uk;eeXxX!P+GC;j z$3Dew|F81z{Kq_v!sXwN{I9RR`@O)f`9yE1mo&HfiTy#ZBo;1yV^?;5Uw3}U`u%$Z z%I~z4FKqW!7fuyCt6-n8DDjeXu=UsEODq%Lo4s4ssiIUTc-Ms0)BVv#ZqtuH#T>SB zRl5ByJ^6Sl!-rmmO@TXWtfsDBFL^DhMVZBN!fAI--l?h=7L+<KO$)0oUAK5feY*H` z**6oWT78uYUmX+5TN%rfkQTT6@IJNT&sJx9bgV9jaCdJ#xqhKXz!D=-&QiV`%r}_j zzA=1N6E)%Zx=bj;VXvp`t!r-uFFt9BduVpPq$?mec+WDiwW*cPp1qGBO$=KvStC<^ z==C1!SL?&MXK5LQCd@R`RAyJdJNe<fSMTZro-Sm6)qNv)-}=kUOXjb2zuhbC#F;%g zRD6qjF~jUz<=g&0*}VF|>CG<dT#sG8d06EYBWp(yd&aujw>QGS-AF1lUCov&Id|*# zS<Q(LuHAp<8NFLJaGuG*cS^RIN90Xc+|aA);^(V!Kg|4;#WBJ|^rJhkRte9_OPooC zVfzkVXRhB-AM`%WOp#x&d()NDbJ<Qwwi}YNg_}=5{!<@yStV+=L`rea`}}5;+uU-E z?u#l!Zq5C-;PyRR#>bnQ=6Bd<1sq)SmT%_ek8h-F=SA$D6<t21Cw=qJBV{`MyKY52 zWeNVt)hfk*reH7U$2$LK@wGCO_L{dg$6nKHU74`?m%B1UeT>cpCF?!+&uu?r6W+^y zu4kKkt?u^qtG3-PkXv^7Rq}<Ym$H1axBl<3tNrmoeD1C<_UG6C+qxxL)M(N49vQn_ zB|c8UAM0w$&jcsWR4AQi+mgPiW@G2C1tv|(VyTTMXB0FrUcK9J&*)u#g0r?y`r!?$ zLw~O3TUfC-;K&*d-8%*K`%7&CRzAG)HKOY6x4XjGZ_Ykjr*As_`TRB~RmPLkZlq}6 z)xE-E&AOmZMEc(R@67wnj?P=Y>_)Lm$1L{_NzJk#86l+)vYKU`=levWSBglpg_JYT znwzAa`@*T~u3OjMsR2jUICS-<c(<~<b@hr!Yi>JtZ~vO$HyKqW+wb1z|4`rdpoM?t zDfy#IJ5yh9G6s4&^4+hfSufSn?k_m;-kZ3OJ=e~k_<Be!cJG7*uiq{*w`We*>Q*jz z^8Cbk^QVfRiWjU?dUfLb#QEY?EPa1$Vhe(PF5Y31Ieq^AXK&<xR#q-CxpwDS&mS4R zC`QA3KN$X6+8_UE$^X9lPt0#0U(44UX4S7;d*|HRo;}NU8;6LQwZ(hptF=x%)YfIx zEArqf&%OKzha|om8oaY7mgj{?^{sZD{N<Xi{EiJBS7t2mNnEr;$Jc*p_vz28CkXCM zRarV^s-ED~14Rq2vuxG5vdQeJVwG>huC5iz3mu#`O7T~`7UJSRxTy2dq=^A4N1y%- zJ<)N^sNQI6%=<Z3!dA;C_g^!WJ+rb@y2eods>i8QPOBP|KfgVqn#LN$%Q9EX#vq7y ziIj)wnQqzm(lW#C>+|oGR5XfxFH!V*+W%<MQs3_1vzTY4N|hcFvRr&`U*c!y6&F|^ zh;Xe`3_9#vxx#t#q6lC1eI85?UsT!~%>TUXs7k@=!z?QGjW3<1oRUAP>b+aV;Bi3i zOgGt$E<!7|=im5KQJ~0q<fj6Ea=%KzZxu(&-whk1RJLaQHtxBa#c$QW@zw>_@9cNK zz3VKR;eKW__W_%!_E`ZFGe4EHq%J<hv1s2N-N{SL3fhaU=G87fQzHDnZBjvBmCfw4 z>f4eluiOnfczf+L$Nlx3tk+`?PCw!vS!+M%j16DX{`dQ@ywz0y#<{I8{j%ibYYpM* zdz<&3ll#4l|Glhj()+#ZBOV);?%6xzZZyMq-1gZ)=AZ{*gp1D6QAYR&e(d*kcX z*8E`>Y~kn<c1(Zfz@ylf+P!cFgA-d-Zn{nJw3DVh#WSR4%$nrmD_wt&Pbp#>hti8C z2`_~<{&Q;&uiMwg<E7X<t9$lK!}msie@*HVdHz<j&+_;~sV`q{hF{hC*?5Gv_UEGd zOZmLN+?8DB3zzoy?))!!tKj`|t@u;Ht0&H1v-@}aNu?0~S&2)zL$*G78#X(_=O6n8 zrs$JG?z4@SItki;UGl5?8)Lb^;rbohUjN)b;m5u^z5RRUZ<~8GFvLjMLsEHWYOt)U zXz;6;YV)h?$Nzn2UfZ|2|AbPHP-BJdfiu|_@zUYjl6_x4;dDyaC2%Fep!)4!uUXOT zUheK^?;V`bZ7pP}o07IbrCH+9f_pBPKgS&9dhlQ7&;R3(H=nk5XZ~b<`=_*HPSTp3 zdIhsafh9-PN<X>VMK8LsSYn$;bcllWk$p;HtJMT<dxlB;skayU?>Ya(dB+&@c~R@K z<8PKY>6rh#xXQY_H?P-bN6DtQ24YGF)_yqK!%#Z?Rl=LcdC&Iyr-dK9alB|^Pp4sZ z?X&;+|8x!~pWghpe{Yo6)R=^X9*1eZrow8Qo&4(MBcc|?Pi^GXeCRf1o`Z-2*D()= zs+ylO|7=L}lH_9yV+eB)e`LJr%mS_H`eG|W7mF-is5xWm#ZMtZTkWSgyb9~zx2s6e z#@2v+Rf^#kSuOcHJ5E<f3NBs$V@+n@Rr@2xCwrBb`1faR=C*(4!Op|T!&p@9tkNL* zdBKN(3XMII^+F9vamykW%t)7ertwVFSF5X1<C*8t*kh+VR?H~1*m|w++Rf&65Aj-` z39Ko$_b;Acna*I$VBGM?eOttWABl3$H0nfrwYuar>O8=jG-{8sKc9Ilg6qhanTfhl zGZQ!yIDMF9_WE3?$gnYy`?@D)qk}E~R~uem##fa`Cw0|V$-Sx!DxCh&NJ%SA)^FX` z#iqL)bnow7IFoZz!<yp^f)2*QF-&J14zSK(6tNHZ<M5IBC_m$pML!xJwTIkE-P6-? zDZHj&L1xcV2cP+p*A~s>oW?NifXRW2XIOgMk2yaMJbzl0`^x8l^OrA(ESMLrvvS3A z&Q;G<=am0ZTIYDD=V^V<LBYV4f38e^b*3W0J>Z~o6k9+%|EJi+@0to%oOwHAZJhBB z3qEC&kG1uVH41jOyZdWHRqX|C=UVVz&YYTB`ZnsVee|*5K(-^!7cLm)Ik~;`zCXq4 z`aNIMUDs-2Okc~ni-<P;T4Xt4dvAO7!U-|z{ujzJcJF)QbX$DO-mujZ>*ufA8}C`% z&G6ZG<CA}R<`3kOJbP1lrybQe-L&JNiMvp#xYK!Grhmo{%sAi4A71==!%;R<Mdzgq zkxE%k7s@iMx5Rqy5H?+CHF06JcS5ViBfDMOTfFb_1upYtS3SLmHHa-ZBP{N5lJN$| z3ih=w%MR!MNV0ihQ*tk3t~pzkjzhgm2YWGpF@JIXhMoNWZ_Orfl`Mae@};n;@!*d| zo_AkeG?dV<xVUttYj*8X_S5TliXNZ1J7KpZYx%XPU>%cI)`p|(_cr|ab+Gs7)(a&O zWe<2y^PTQ1mY8!GWC&k#@r*^DM=g2IB`$fS_c+xh<cw9xv`qKcZw@+pHBUKau!FaL zzFfm4=a+%U4R-W3eq>~+-0=O^B(7@y>i%7(udc0#UYr+euo6V+ik3_2D=+#YD*r`B zGFfxN9!WNfN#;BP2c8@T!^LsSt-s7rXvk!L@M{v+<-WxdGDjb1u(=yrbZO2A0kPe* z-WkQYxg1?%tn_GR)VgxNxtwz^*PnEMJ&W(zm0i61GQ#fPY%YF%X5ae48jrFGZ!%`T zk+6tiSlWJR@u9?mR_4R39G?>2e^nLzCihKFG&f{R;6*pr-3dV;DjH(;OKrOhccWuL z3YEq@1uFRxdJQMr!O(rLU-=8e7>3Jy2fnI`E|Ud0>tG;HUs8R6NU*_5i!Q+uk;w(O zKX$L0bKd35w$n+L$ptPUTJ~R;SQ*RR5DYmqWg6p^>&-RSSL{xZIrsAJnfmEx)^+?} z?IEBGE<ihe#9gjetN;}?e#e4Om%i1m&Z*q?e`C1xdh?qrzunuXVLi2Bd5rZ^^+un( ze?nSzpme?CVsmNzE%smQr>|s54iPrVe7w?$)%Q_F7pur=y(_BVitF?8lr@YmTS}B} z>3>{t*vIfe@}zIoyQ>c?KlKS>l4kkF8aikFsweD8yLq1{TCHU}&b#$ieT&=gLz7)o zQ<~+EF>dJny?)IOzkB=DMX&EGd$anKSU|g3>h|r|v$p<xpug*7z0Ja`v(FY(UeY;~ zvBYSN!=@lz&h$?+*4UUWI@{hGuqtSmuDs0e`}|w1);+7;<|ijT@x6cL_AuiBBUguv zmX=$7`x>6rG?_*{{oC*$#?HTJ@^csM9I^1FdL~A(YC(lnVZwT{f!uroD;^%#c)8}} z<%}ZJ`FAtb6e`_{yw9(G;aFeZbo7*5%;#lF!GZJQ1phs)-In(&ZRT>BZe{Lli-}zc zc4_{F2lqUh!Xh<M|JyAU4awy0*OR8DzGEoN74(nZ!?xpV=!XR>7!F)j75S>5c&NKd zAY9A%l_S#%E$!!%SVL!e#jjsiqpAG$(}T08&wf~aGtqy>7tL)JyLaq*YOzvdcRgtE zCwju769*bxg*A@dIqC3q*2Sc^fyWR0bYhVgo9Q;+uBKwE{=<9eD^C9G-#6<sOFLtG zqTH(j2^(29DYj{{Zj<bP+a0_+@7ODmWgE{gyRzV@{GU)R-5-<eG!B2%w<^{2%sx_H z)4r+JcwdlO@Xi~vq6<}*W=)s(D6QUmur9p5<>_-#iK(K3oCe3aFY_=2c`Afg^Rf!G z1nC(Sr#xGh@@&othvhkE<a+k*z56NKA;iRC!?|6Vm))lsZ{jF1bupJQXWe3@rRUaq zQEHXeR0+{@DZP!051m@|AuZ2iuU$Z}w1cm$bA{8($ZyZ@zu{qY(BfL+na=Uz-C@b5 z#ublw>KW5HKDqR{hOap@^Q_+Orp3E{xfN}GS9yGyNQU;7(8%1Q)1+5ug@p1R@8We` zrLEn!(3NAoLDhzZD<W2%(%O5fX_b%qyBh&Zcx;=J4k^jWu4Rha$~7h7fCQ+lP?>O& zm#wG3B17R-#9zgO^O$}J?VZBatM);aZ4qC5lWCBrOZ^Y49+mnHZd_VhH+m)ZPFcc# zs^CnVvMA^NZ`MnCI8Ru5_ULOvnjwECtiGEi_hq)!?~Ybgzn^n1+>3TwcBr7z;aIA~ zozB(n*RRSZuq3d2Q5JVgILM*nd$NOZp0J|nr^{QvYiDxxeJi&<n_%VPvL(Jup9@qL z26>m1^VYvqZJjFQeQb&Ar0`qOB0u;iU--wf!?)=-q@~il;j8Rd<|TY5BZRgwd}Wqk z1VQCqhqYnqmw5b6PSKhqn-nkDy+P$-8IRQ6n<vzyw1oF5*a-bEoOj~9<I60Ytufd4 zZF<=fp_js9^ysw5)wxGA!$6G|rGs+H6IIW%)Z1~U6o?<n{>r0$^{TpfxuQgy-aDrQ zK@(HgeewUs$9E(=h)bYps`8c<`*OMtC7<qS`to2?w~)tFP3^;};;&X1m_;lw_@I_& z?C0h`|CGhilgatJ?^%|rmH4U4ug$ia5&YWhN7AyN-aFSNYKouz<1*uX%72EI{T%gz z|4#YvAG%*J<l*`wI%&hy$Lj@3L}g1f{WyjBb@qqNP`k3Sa5c*o(OavwY<m>O2~7iB z5?To>8czD~ubZhcZB<cM?2a_1>pm-L)z;{VSS&feUi|&fDc_rIC#?`)UO2nZsH*Cy zrlIEAvmY#8@8Ui(!%{(y@zILtnM)t6s9o@_@mBkpFZBz)1?q%?xPg1Fybk~U;QGR) zSKifcElw}|_EvvmQiHdBSM>!3zp|I@ir1@hj&8co_H?C1JA2xWsxR;Au1Q3HjJjKW z`fJAKD9L&A=g*ydS#af*lUJLKzrC4xxnPZTl={^86BloOG`PQgYxLQ@W&0KGhcPG{ zed@Y=@#4)FkG?#rFS4-uHGPJIi%j9}skz_py!l#n_nMwboNI6S-kY_iVW0KSi9i2) zss4>={OkF;&Feo}%5PpjWBQ6)d50@!_^rObc4zSC{SWsG|L42k@uk1tU*G?{Tl}2+ zzn?F@d@)}?J|#Y*C!N1feBHGCpYi)vY?yzb?u`D$e9k(Z=o<5F%PzCkSNi+?lGkg~ z?*1}4$m-4ZZ`PlVU7x+`CExD!(`6nEF})SWpQZ}Eem!N={;0{Eg)hymzHeTNI+iUk zAyafhZsxl0;Cew%Vtduu2agX#81*ccU9l=LrYthc(F{EHIrCiF)(>lRnfX@ge|nlf zd0Lpr4XOIr>1SS6JaZTK_uP5oj!x;UyZ0LWmj%p<)Vg%W<xgNUml~t>k*(`xlYSns zFjoJ=9=$_``_#0eB7=;r7O_j$cFqy`e4z9AGZmq4S7%wr`Sa~^pX=x76vyJ)@8A2e z=Gm^^==cpsDvmInII-dNn`_VhZ?B2}%#}9LNz8f8j$;k7MfJ|l>z36xpZr_%O#N*6 zk+R4~HVf;H{ki)sk4ZQ!{$}#&k52Q=7k;nHc`%#LDEai^nJcTaCY+wlK7G!w$Q`EN z59wE#udxu4-1lMi!NeP1Ufwi0W`EuP{^EDH9~{4HU-4$*yBn_`&XihNxBsK@H*miw z`|AVeiytcr*raMZCJO$kpErGe_`Z0tdEcg2oC@ue*Ps3B#0mHBmHIIrq9+py6z)Xr zT&ec^Zq!>|anCj$`I4x&dh?&kDS2PG`EcKg-Ymh#F5X#;YjYD@t+uUx_)}E;;hFC} zcPHQd`?rzfe1zBI74MB|)r|gcEzxX>?9%d?)Ejt3qb>5{<<@13LQT)s6noZtEA~$~ zzWv1GN8UMdN*^aKNVI#HJ1O?+Y!3M+Il-3NSN3;J*<A8pYStzL%M>wPp#u+|KA3ku z?9s35e<EBiC#*Zd;G=QzwD`~5cSn`vj_4oSbzqlHgn0V11BaGG&q&QORnX}PN-(~D z)8~rK_N1z1npgKdoB8Ib=D`S#oVFXQuG-g6X}<e#-hVCmy+*4<qz(PHgov7?&Xq1J zSn++$-mkj?%De(+Y+c`BTy5u>qTX0q^s9y`(|7qn&cu+d9DH0i9hIz?|Iwd*L++2- zpJf&McXlq&ygKR3M(<=tw<{G77~;fq1WNvDT>mOuGF_+q-xT5JoL`u4&XcZN@L`_d z_lJ7lHR|nj9G}V^UtZqT5qPplV*A5MvqRoq32v8oXzi$Q`quZH<Dg-6=abR5jOH-S zuH%}sE+x~}HTCvfrcYlrWY2Hc_%-F<XPXPpx9?m&bymx|S%J}y>rL{zwd;-6O_;pc z+#={}?XnL);!PTtR-ARS*kN$;!@P|@UOY?YdTDblG~rTMJ)g6If<${p)n$%HOP?N| z%_4f@T)bq^i?vcq&+|BZF%z}jlDjz9dV0ndg+;m5vgKR1>jj_wdTyoh!eXnR8L^iS z&WYN7Q2gSBy>s7QG{|vtHm_#y%{(fu5)7Jb@Huqh!rqB-3l~;<vpPAOOYMpeeC^_F z{%2WJU9qsEv-9?j8}&`%dsJh-1WmhpqbqgC3)Rc+j~9vm?0oG}c#+#AZq2dBi^TOV zsC;U1x*9UGJ5FFhC*K8z_2)j^3J?9n+^MUrJ#|ZVwExS(J4@nkO__JFX~O%L2Eox> zk~fz0`~FhuTAAkOy5v)^|0-qW`FlP0vj|5DNjDj&-!ID2=bEX^Ai$hlf7D^!Zo@L` zvk%xG=J9Mj_uhPu^x_=r;DG0cq?#A;pSffuz;ODi>XXU6(wRO5{fC~Mm-xOTZ5NMO zi1Bldn62M?KQQgF$XzBr;g_7o-KRdx6K@?5$hOnC8zCuSaQXf#;|1R(8M0O^j|flb z`scNA9m7WMoJD^&dcQiLd`JF~ID<z0>~%>`JN-WOOjUm)TOuvD@%x3`6aH5=d`eN? z`)J1}m+#XwFEWMreOYo=OFYHum_zN1O;gz?tn$^FCBbt*boYiWH(Fa;xOQ&{VmUi! zt!C;oo;?qaK0PKhdEv3A$AaG2w8{(A>@4K;3Ke=e<7Q0P{pssDTQwxKxpu6RxjvOW zNbz-j=~IcY3oCm1U!O8<sd~7ph<Bq&c}VWVWt9(B39j4Z`k!IC@(%6eMz4ft$a!74 z#`0#C{>&SKBIcb-zI^bV+5XG3?Ss&Y3?^?+W2uK$XFc6^33m7A#WCLA{H5&6jd`hO zzUh3`^fAAjlgN6;aEsV8i35jZxR)3_X5m>aYI5mDu6q5qf|B%K7iG8kN=fcz2+x__ za`5_|xGq<jh#$+P&qT~vymVgD!}*%Ox?AgA3&l5fr)}iEmXMM0UtqsN-N8flJ2?*@ zvj4{SEm&sbcZ2C?{I6{IkgvS=&>{O2t4yYab{kKWZ1})G;gO8wj#J&*V*e5!$_r`z zTp8!P!c5Ra=a2Bix%CwXcgKpYTmnjd`*}qUTl_rmCKqG6rswtQWNp8WcYn`cO518= zV{dP*zFawI<>b}u>N6JPT3nM|JNcCUlNWC)X1w2fd+oEh-TH^LiV_2-O}3Mjo!hJD zr?1z(cyawyfkrW}nC+Y1-o048H*WjV3ZBGe^|~MUV)M)5d$0cK{(Q7@{}=h{v)6y6 zpMH>CbME*X?PvC|k?8X5cRx1P9<5jZC%aGZrM&$7xOww>_gU=!e%^ig;`?#?PVBoN zab8YFKSt*Ir~Ng7iS~_uXT&eMFZ3s3nn};!4Lcm~O`iO(z5C%Q72hDQ_P^Ka(jzAD zdZpA0w61!|7yUlVT7_Yq+aAfEUY%b{y>7;@J=wD3%6aiMnmZS-dp*1Sdj0+1ek&i> z^DmrzZQ<;Iis-#*9|{j>>+V^2_xAl<xssnUZ#$0sc`Fv$)-%^!bY|VcDXq4yLQm2) zvTsF&Fu$8H*IY1cOL5x1|7rgd-2DSv-+Qk4n)kLWVQ;<b_0SuxT%g>1_;JloyO-P9 z{w{8MvYSInUb^_d@|K79{HMRV=;au?dg6m`E$K5Rty*d4x9h-`+|Ay*uiCsYzuMQ4 zV)eP>$4d39mV(pY_N3b>u6zFf&<7X2Z%<F2aIHS+qmbH@GR@a?vVr}A89~o)?OthT z>SgdWHSny+`h&kz>!UjDnriIV?lnk>*%sLKQ*-Sv_Rq>c_RXG_*>=1@d-DZ-=>z{Q zf7B<*aPB)%5x?bZ2mhhF;lHJ8Sx-#3tkdD2*m==up=rk2X^RqCc1UFI+!ms2WyhoB zSgeq*{A}u$e@%%z&ad>@B&9FcayxN0bLU<t4sPJrTGen{WXD;(xzhFdPbTWm>e~Cl zSjaiM{}<PVZOV#=6SrGBFsr=cxy?B%;@4@nztv^T8nXi(g;!j>rMa=Bt5Zug;lM-i zP{H(>ULM+PH9nW>^2_rpmdx?=N@!LHdF98wR7e`p0d@@i^|v~RbNlkJZFX;-WCUNi zB^A7^_kjw({`C65_9Q{E(ocW$w_lfjQ_lTqzpKE^xWz%wei}b&T*@8ZxMY>bHShRv zUA<!wwxXV1Px98^&VIG0)c90^kF~CW%-1`Ig&0$cm7G7A9z4OuRTI$m__N;RsdEl| zd|LW@kHbol19vXi-#XA=5qRzSeUne@6FB||{y2S>f#sjtqP_$2jrIG38tYS*ZR!8j zYw7c(yg-Ea(6i{0x7I7Ju^Ro}H>JE<%6P#aIbO*f4Q2VJ%roDrSBLKO+MZJwS&(n| z`pkx&m!5SJiMHwWGsCZ_Rkk*!Prj7E<HVFV_eH!h$IK^eOld4<eogHDd4e^KV}Ab; z$xU;b7W|xh*lpUx!s7*Ir%iU$hl`kVw)Yr(RC{Q9M<r*$vBzqOdKX+4JWxwyNqNMy zN%!p5Q^^MpR2cX4|DIbHZQCQ97P9QIPR?SDpyVZ~4AG*(p(Q`pq+D>+@4jOEG_U<0 z=lYgs<@O~i>Sxa#Jh-u_Xwrk?iA6%7X|EY9I`?!pTI`;?r|#9+-7hRp`DRwL*DIQH z7YU#8u$a63qHNyHLtD=t<XJOuTF}<gC`QK%*L8Jy#13gY=3J{*wSQ3Cn|^AFzJ(fx zn2az>;z`4gyE%paxj){Znkzi3rLbG>G@t17*#T}r$<xXNHg753^m0jor{I<YQYRHc zg;;b2SZ>}4IyFnKLbbzpTllFn%P!jnFRQ6PXy~}%Nuke)Wuam%fA2nXG|$){;3aTj z-2_Drp{+kfJO#3EN2+<|KH#$~pSj0#a`bLlUY}i3{Acc!?JbU9^m2}$UDWjwgXPz9 zKOAkn8dtc`B>t8EueFZ<JrwtUy)omr{6gOEby?L(Jt2ZAKQ!l;mjBm|)X7vY4Xa&Y z;+XZ@xt=YCVTb5-<7DmN=yiprsk7>&L1XW8*CbC%IO)CUr{R71*ZVgem07{eJ^NC7 z$_|!2KNFf3&o}&Xsrs;rUWnsip8lI*YPPTLE~poo$e|=?%gdxRF?Cx<oMQX!v!=od z8&^M9u={n@{)g#&W$mif3zmKg&VK3q^{l}e-|kA^cIo=x8+(t&tuk6Y(|n_(TH%g< z=7lUyoVm`OE-z)O^0+?iNaK8-W}(>JeO)?hM@0y?&#|~4xlw6yhA*@oZuiwC&3U-i zXzD5dU>0AUzp0DoNiKLVVAkC=k#F(V;G~x#!l7OV7&!HwO%3DuF+*kQdQm5Vr~<L` z%NKH8pXm8(f#9)+^+v0HuRl2R$nWn<gx+mll~a4=?8Rjnn_l_!vZp23FVj1J=KKD; zarqnW>z?>8=9p5|>oxQF`409&kB`7+B^-i6RbH#fa+!WoE!uwlt!a1EPZeh7MLfs1 zTxL2Pc-~e=(7{aIC~N)x8kw67py7p@dp_GH30v&jlQ&;nqkbyW4C!CXbJWjmzuY1I zwC4|_3R6AHzanFX#{Hculs~vXSRe90ex~Nz#dXPi!arqYW}3g>r<Qi}JL|67mv2;0 zz2B$EEPmnU+O#v9{&IYewz-+N{HEE3$w${1A2wR{{Bxqg*Euh2`)j1~>?eMl)ncX= z=i4MLyq<egLk;6krcbPk>o<zqadurUvSf99Qxq+7hP&nhgI}0|`4W|VqNnSmr!0RY zBRAvWtBbpTM<(YS&HTOhY1Nj<wLIs~pFel<Wk<-XC$A1lR)0H_iBt#gxc2hx*568V z<mBB_O6Jb#>pSNrzFd6z;fojddvWA*sjdsJ{L7i%@h)!t_1w4hPLD&cR9v5ZH$2(& z|D&41d-{Km$9>-V@21fYsrjD`e|J@OKF^NZA6>lsS^Z&xm9I|h_CNaZAvgRJ?4M14 zv7N<!+q3;fpl&X-m+Sd4cBA9ry6pYNIw#m%7wmbcRsYoYYDxRtz}tMB4XXw7-S!0~ z)y@t27M^XSsQ1_H`L!u`0<UjfxAOJ=_qEHfeB9sO;Iq0R$Gdp#Ck7LPdpwUH*Db#v z#{alQa_UPH{%Z5CD-xNK2c|u85smdbtzI^p{ceL?>DNsjwy#Zg?{y5kyJ64D1fdPi zH+lp%)+EfCDg3XwUbgyp)26k5^UC=6`le2v%rd`w%4G1oy2^v4l?Ike=k4)-f3{q& zV9M-EW;#xJVo%hjOf29lY`*ROxg~pcvt)#_?$WH+TbP;_tdEY8SlANYbYsnTuet-j zrOr>$j4$vJ(6LbCI5a8wQTbNgKmErNy>Fc}=X@+?d(BEq&wOD|{gPukZxzxqpQl{* zd^kxdqtSGd<0=)7C<Ts9JC{yrb@|{WFgs`cl$pNEtC#uwY)WoQIQe+S1Yc)?FS+3w zAp%{Q;R(9Bm$vI{DYG_^GLUj&efaj(G)q2(0D+3&k4Yv<pC24{*dr|!(ep9KZ2k|! z<?gX3xKdQ7h^i@vuNPx4zEj`I=Is0}^lH((rr?=jOfN-$-nGsu>-)Z>v}*MdSIr+r zp<IFwq@TI0bnu>X<!JlVN)u;i<*9<Tx93Ma6?9g+<8Rm7ccUgN`O5$20>bZJWtOlN z{x<U2;r!UOTHR-d_bi=Nb`SgZ1h3HYul;KUT?EwsJHc=5?FZe9%6%E@D-N2)Ja1~= z6et!HxiUDiceTBSg~Hze)@%_OC$||91r`nm4?6U^A8h0{(Xd#v%IK5d##KF=ny!6V z)Xz9mr^`P2RiE)ZR`VLgiLOfBcRy6AZ(6Hn6v-SaH&aJEW5UUGtBitVH?HdO3Cpf1 zbXe!q*P<L*$?2fBoA>n;lW8YX>Yd#rW}e(O;iS}xPbX4#IyC!~g-)ILsv|TtWmDAQ zZlADY?*4kq5AR%a<X3ZXWXk3fX}l-XZl6fw4XI4o9J9dDZ1<{D9_2??8EuMO`_R>_ zyEwAp$oeM@Ibp@kojGPHEfa6P(c1)a&P|YW&aPW!bP42~oUrT)%h*#~@9WoyJu75g zJoo+G3tM#NG;9%SE7Mrn%`f)k<Qk(zvD2f<l@?8#vU1A`)sy})tCgK~Ikog}*)E*c z5+x+$e`OMb{wuE3iPr+mW;h+wDm}KUa3XsttBT~Rgx+0FCpeT}bH!c}<q4_0BD%w& zdDo#XE#;3QYfi1u&fwMmB|72MqF<Zu)-SfV*naL!^~~GM0ymVV>$VEIJ=;`$BDFX8 z=bq>(6Q33_@<zVvnxxF@G>yCB=fUpF#ipOs=iE5u&9LcCZp88>J6)zp8yz~Kv%OvC zy2Dg=z0<5xPc~_<>PcbWsq^3|yS`t}RF6poN!p9wP1*BSHc{8;W{^Z;irVgepKA_N z-PKOlvr46a)Q7Oogs4vqJu$IBO<SMwM9TKWxs#3w&CEH$p=^AUIb{>uDjTCny$cGH zV*^u{Se-~=)VHsgc=FVb7uk6a*@7<FSgB?98qYkD?(8;W#`$ftPo(pPR6YSklHKk_ zr#vbqoM(!w`=B&GRN33fXtmc(#-D4RsnrYr1eyQ&rr0M?Ed2z<()o2OjD+N#Y;Kq? zzvo1Hp&j><dkgGm%yu>F&bc-rXIpO$$mwRMS*21oYp?1lVZRA>`KCzGA{CWQ7PC|B zSr+PUiu9C7OflQtji%Urh1T=f1FbgU+0uPB;m6$T-NiRaooZH&R@v!M#OqmP?NP)V zQmL{tW`X0R-HT40C}mk~6a-3ITHVUg4M$eqYX}J|&h88WC9Rb?;w#rQYW0Uq<2La~ z4G)pr+4p5-&Ju~k_Z(k$@IPC7m(L)a;q$w|_bM%3nrA9!-()=#{Btpz=*)9T?H!## zt%5GKJL^w>|Fnv+{Dt-FrK=~HU4Qh=^ZAmqC!=4lIQrLd``&6MT|NI@@0T0rdq1>$ zw<Y>7Gjr?j%SYV~$wC@*ZzfpEo}aPzv;B*^KO#>ro<DcPs`Xl*_BsW-^?mz$>{Eo8 z+l(KRZ_crZ&S<nOtXOtn^~VD|;lE$)d?qN9+@Uvh_0*jDYzB+Xv8U6t*^IWFUmN#4 z<A%-&J8_4gHeGIirgd_2?ANdVUvhlf^NW=Vk99xI^U1x={XcN^<l{eDk57|mj$>J8 zC+lx0>#tq1qSrwA9Q%a0<1Br4wLcaZgv?s_xY>C2uY*o3eoKnJUz_sFDm?eP-S+<< z822pOy!(f;=(m3R_v!W99&h}$!*uWdjgP+1>eajKS^6+HgYEs5v>mo)&;GGzHoLa% zTghk>RJ~td^KzE7;<5=xx0w9#jtwZ&>v^V--r090tTQ-<^ZAwP8P;}{)1S`|<L9}$ z@bU4fKR(L_o$~23yr(fe@y}7dBNJV-dJQ+7ND+(VpY1UD<dXmV-%dG2J*)rUym!;2 z(^oi+q+X^bHk+uwFp8<#I(7P=D<@}#tnfQjqcQ*B+p_0NwDYS!t~y|2_J`vt2lJ*m zmYHl%CObMP&Ar5$v?SPLc}Qc$Z9mH`iaN>jPRX0DII-o@t1mZlJTCn5vwZr?{emsi z{Vmhhdi_%Sy-KRBGf?5{uT}9YE~&fUJy*}E9<RDVMB_}jD|EE?pi94K=&p5X6Mbh~ z%D%rZUsL6*-{$L~{vKQ=A}b+k9%kHoqBY}0uh!bfS*jW<Hl2$2F#Xu+Z*QkxpZEO3 z<LS4~*L(h~*}c&~=-;PDr}=M|)rknLT<X%deA?@0Tu)EM$34-1s=r=b-y`UUeZ6YS zvF~}IyU)5sN87QS+gcv%%dl^e*xu%A2RAHVwJ>g(udLAqHkV@GFP8;BF?asHxqc<P z>y$}7=gWTg*QCsPd+wd*!V?8bOZ`@S?%kvQZnA!9c(MGnthMicH%VJ<pWp8vVm5Qb z%&OZy_E)|Nt4Vle@}}O1y26pmT_aT^RdY+azBX#^9i!==?e6h@o%7C^C%bgxzr6bG zs~h)wd;KcdUuttB^aR^ZIqSK_zu$G5eoHGh&*BM;IChlFu*q!Whoqmz4~`nXTK#uY z*6|e?KLbT}IL}*t-{3CS%)H;Lc11MDDPQ}0Z9#p=ga~oRSesK1?)kq>$(|mha5d|R z`s;W9!Z&f$Up?iq`%%P8rmNR{Q|C@T=ehsv(Vl739<&Ij3pV>zu~*Nv{pS0=?cPP@ zZ})z8naTwpzujH=Cv9E2n?Gn3kJYBT*Nb2OTb5|ut6l9C8J)aiK{T77&gy`WbsVp> zb8~`9%KYcnY+t<h(%Ke}Uz4irJ>Q)+<$H7H<f$py0uP>ZAFDqcW3Ruhs_W5?8&eeT zo@jBeb*vCK{kqQZ=<d0R<qA%mKU#%VD}wy^_vh_A<y*kDRx+vdldeK`Wv0*5iCg>Z zH{~jHUNxMm{_U4=we3a+x5yipO}8H6d#?T3j8CJz%qQ%_@?En|Ezw_-+|DfY(Qo$S zf2seIDk440{5ANa-HxoPH>mq>VQv3+|C1+s{+~}g%CSZy?o3g{&-V|1E_F;Wye{_k zMv(ZHId2n+tK#<-?hnncVLE;_ZSm1-)mv}W>0iq~9`~~J^^&7`94Xb0rrFEoFyD^; z@#Wy>_Ukzb!3Gvl+l_o<8Fy~qBYk&~^nyh`HFG!l282yA+moSHn)xVgw(!*Y%O>Z) z-8d-{*~xxIvGFNacHWAB^9)+t?$<V5u4(vk!(x?%hnt>wsQhNrY8T<%nx@8+XL#S3 z65V5d(OK-rfjJ4jeD|K8esgi3{ubBRlGBq{d^q8;;OE0HcMd9E@4vrxr*ch2bV>iD z%&KD!x!{=~*(AL^AIc~7tTbn|?&9XFzxCVQ*`wi)kil2ymf}}FFOWNwcarnfR3{#| zvsqzr<k}GJudEMOhG)H2Gl)x=9_{LP?)<-<HSz9mr|b7smDTtjjTd#<c3NLhm7`ne zQ)9=R=07aCx9utl_S}BYp56TLZ_4qCs}paAzuC6&x%Han72D->%M$*ts6Q^x^FQ$C zqnbjkZuu3uvU79wESmRz^K1{k(c%(%huL_;MW$7zd)BXX*9doxj_cMj`1T-{_eetM z8Tl`Nq-}0*zn#fu&#}37mWOoOZzi*ZZRce+Je~ixdH(Sn`S(Zs`rr0u*%U0Bcra)F z8UFk)IrBGd$Su!WT%)U+EfyU6^)qMvrM1`1vJJvgC(JWp;S4@CBS^2ar-R8yJ2@&+ zcTLI6uy3Lt9(~z<@g=9F-R?aHK5WvGm}a!+4fpBmD^2&s?$Qjdv^*$cylh6}so8;n zV!Xy(8j_rsnl>6|K9Wg(zG;#`&)muTCx19^U}bCjs$Z{JK-4Wbb8%;738%v$n_ZJ; zB-YE>E_yC|i`8i7(F$SPlt%tDoMC4cdw;p}^z35p_p42P&o7zp-p(ST%{aq~Uz9QU zxfh4pvU5v2SwA%%xKjCruV#)+VBfUh=N|4yZ4H>EgP&I&KHbBlHcMG7@e-%-*%=wv zTyGg%l-a;2eD+yGZ)e(%O3p6=!e{fRO>|s-_qAA5z3-#j#bOn=U%$40d3W#kFX;kL zr#>kEabZ%P>uR~$FA>%^U-Z=cDJc7SRFbFv*L=OUc$xoGH#m2frq&jovx|+JBgcR8 zseRkSjDxNL9+h9D*8SbTMmbl0Z`r4b4RO|{JiPCcZyegWLV4!;epx5coVTS_$C<Yp z`nP1)@mzRgmh4ymNu(|0n5LiH<e4elp*z$UvRH>(%sf}|?8$HCS_59Qn4DO-Cz&Ek zPQ)aNY%}1RlYLI6)vIq-aiP=F#y>e>uGie-z4XP!9WLM6wZZIzXfQ*YwCTOxQxm2+ zmP`?udo^~tckJ<-+G3CAwv;yI_^}6`xE+3C+rQMcCzDS<Q@L?2tlp&h5Nm>4yVggs zEz|8AH}_er&)Iod;MtQ$c89M<xtrdrxjO$H=dyV}^mN!;zGbz)d->u;PDx=^p=Hmx zAHIy0g>RERPYX}4OU_U2Uc?sjZ_oGkmx}jxg-*)(8h^}w)3yyS4>~zo-!_@P;rY7F zDetGXZA-ZrK2tW6tuJbxX{;-A{rp|UXLXLG-n|fJ@@3`f+dj>8g%_ha%jODC$&U_P z9{6aY!WUUTLCcTRK(pBw7X|<L8L?<(@k5=D?v2kDWGG$FpB^ahk#nhfs@&<n3pQRz znmq5IP=jyPLZyVs^Msl@eXCUM&COoAvLsEGGkdAXpQht({x<um;OC73b8}sv>(-zC zmr&I+UA`x1nnsA!34S-ttIIhTPmx&KA{}bi)c!)l;hviJw`toiO?^;gadBIe{&mr# z8TkqeCdsd=*u2;;LX-V;+rr4Cd4~lUeV@BrQQp0yD5O#`V(OdP#fEOL_e-w*f9%$- zt4BN^OWMk1=Q;Czv6`D^edE)=Z#sdWi{*Gj>Y1(=pX{{WFFbu|@3yyZr!RaY)xVv~ z547@W*50>O&#%n9U^%yD%et44F58Y1-fj=Cgz^<m3_rpa^CXq;#*P!*f(<NH9o>62 z?VRd!^QhG$C+%$Q*HNE+3%{pqFIHOe<j{8k(^*$E53Vd)l&mV}@#s?CyLa1LbetZz z@O$UiUv*8cY%H9x=6dMD^vet`u{DQUFR9$q*t@6o$Hu>#Ix8x<KMGgt-*VZrr?sLo zI``B0sk+NgPF?Wz!w;og>lH>#hs?e`dwVd%&B@3-T5nzBn#}bV|Mf={C^av>cXHnz zzZ7Ss!!LGDaW3%lnznga;n%BS3r|ajhncR@HEjQI@zRg_7h7K|UDxUV^0fHxF_*LJ zR^_hd-oA??=lUe&JX2Y9OYc~_6&4<s)(JmpiF|d<;j3Zv9p)dma;r84#s9i{&FgCP zX^S6EmP|fr)>qTqtZTw*|NXR>RL+viKIb<~JXgSZz-?E6;D(8QoClA%S!E_Q)+lV4 zs8_{q=hvs<KC8E+d2jtU&vyTUmXeSMprZEfQqw(}hn0WEt$XY)9b0L=GfXpQ$G5G? z@f)L;vL2J0(>Wn&!SM?-J45PTd6uRKs>t28ykTt+!18sfS<hRRoC7!dEEB|yw-rB9 zkKEmu+cLj>{&c;K+P=$peBb=&d8;w~&0d-GDGvfFub#Z==wqO;>Ef39j$0k67Ka<I zw4T}PXC`qrK>U+wv#OiJJadP|dYc}0^m8(-T2t@9sd2LP(kwy8Qb!*?bEl^&;X9ve zhA1Zqv^MUt_?uf&<zyC7&$(7hcFms13|&$0%q?PWyL}nDRpXzXbqe3-xAtT1(jyBq zo_6JyemWI-r*!hpRUNlq`CPj-v;I-Rh6roM3%P#3ex5g&V+AgyXLuPuF$mSIc9jUe zI%Cx|=FQuELe&LB&-rx8ZapUXa~JzF7Hzk+s#WiV+}FCAPoA|b{ZoIGGZWWThMuVQ zu7<#DRTkmJ*Df7l`st8x#R?kS#{;vMEM}6Q(byZ9z4u|N8)Nbw!ES^4d(DP%Js)2w z<w`u}z0qJ8SA5`@g#MpBEL9zb_smb9SaA7WDfe2n!gprfS|`7}yI1|oxZ{)82kV*) z&+Uss`|YaMtj#HLv#Yb%{pS%+oBLmX@x%Ik|GjQ3Ji2SsK8y7Edis9-?N2_*AKu{l zT}fk!O%?C;fAQC5Zri_Z#p;+~rmFgPSC07JjXq!S^njV4o9xM&S{}hw3EAr}Tg$EJ ztyIeSoZOhUU9x!6a)TvCeubZAoO!Z6DAVBqo3`Os$IS~B8@3tGvpmLNF|+dad#<M$ z=bviW9hjG&c-~T8`h$p;W*={tuomx=^v%r-wO?G1Pe{+rjF<k=wesQNUa9wPfm5en zuKz2VX|^FIm{Dp&jB(t$m3nQ`DPO7-TF)+bd!cMLe-*DnSr(J(f+O6jId-k5PA(|A zQL~C8VEN+3n=c-HdGx8lE9s`ZlYElj=C5iI`!-*TJ<2L|eO%Wp{_^#gGq<(sWOz?` zU48a$+Wh}3pE7;jd+WK-1pQejY=bZSaW>u>dcD%8UiZ57_sQnS+Yc^UADQ>m_o-y{ zH1UW=+tXGvw|#M(uxal46>gJVo~_c^)IQ^Cph1fVQ_J5QLJci{Z+IoO{k<V*`~HIB z$<FOPlP_LgZnVzf(-FQN-7jbUYFsc9@qO}(ciJoF&fL4}FD37kHxY}<d2JTKv|+7v z2upp=>o6ySjca#5d46o$yAFq(*T=TyJvrF(bcRUHTAQTrd@kwH7b{OY70!@*{FHsS zotKCf?-Tajc2|~j?zY?TnmI4zD~H^o#Y~m6bw0)2tBGwo{m|uh*4~(Kk;QkPG<a35 zxRlHge|1X#n=nV-sLawyo=**K8nB#w%Vg#y*!=MBllrf`Qd-aUU6fdFz4fZPzD9A{ z;*48CbGw&0q>1qTTla7VSAlM-Fxw%%#7}$cY&+~KSF)J;%IMAxz1%a6<At)-oa@3V zU43@9#V0Y#Eqyynch(v9=htS|mVc`4v|F+7ZIWbPnq%K$z8S5$XPBO+3D0v<b=~X< zsl2b{Eb8A^KjmId5QA^_Y~L-7>u011?+AQ+S3_^w#LJ*`QLwRx$>c$j<X8P^H#L?Y zziQOApmTL<!PcHv4391eEnt~av9M)z>VhJp6*B9l1+uL0U;N+L>UV8Rbm|lb?(L^m zw20+R4dgSqqxD%!(EL%@%ypU>tEyL@dHCwB=8hcI+2K2Kp4QJ4-I3#}?ymbhRhxCj zD~(*^BgUE2%O2ZFzVzjMH#v|&<&OGdm9!oHYKxxBN-2Zu;eWz1PfuPHovUrPM#TDn z>S116R)L*$*?WIEJZhU4{&M3TekpF<ycdQMOa;#VD>!y6bmu&Hgx6Np-aPL`C&v+9 z+bmbhOLs0b+eF;5sgJmlDOC2*p=6ur-0gQRFkepI^CuzGs}t0`NyzN_Ws;c5HEr2} z-c@o3ol8O#_|3n(=v?&8{L2gGsp~^`>~yme@0#{%%Cs!s(t^jQE2A`jH}*{Gc<w3K z6Eb7Lf9W-h7mf>hPso2=_h#X~MLBb$-j~nb`&ig6=+eF0`mSD6gxl&b8Ps#{0j&nM zcp%EEZ@oq3Tj<ySo4@Ox=~Rx~Rj+#ds&!-X-5KULWS>ggxR@G--r%lCH(RA8V{~HM zwTPq%F`@ISpYM-P^*Y3%qUg|Xv-0xp%U5+bM62)rd}{LZnw|I9<mA5odRw&ouCMZ| zqbiH7#Zz^jt(xh$OKh^l^5sv~*MB<ws9)44zv-b0mruLg^=rSj*3A~}d)Vgb&vhw3 z&Lm66+GPF|@ulAOzblmdmv^O^-BGoxx_JH1y7yIGnx<Db{IF(w6ym7&>F1TufSBCw zYw-$uE~efqn=o&M^=?5IcI%mHtUaIEA5Oe)G5?*MjJM9qcM_kf`F+?Xnk<_hKi{?f z%Wn2#`?8%4j+o{1eB7DkykxfepSPEmP8H{g{y&@1;pMXF_wS#cl%JV)k7Kdx0|mat z()YTbn$#azT41=`XVs$0@Eu1sTv*R{LnK2_`q_yt;Zs2~@1E%QN?&>6{2TVO+VN~L zOZGes;5e42J!>)pH~XcwCRWZ&XUC+rEerc>o=4R4@W$xwGCSw3_T!M@!B?t_c&<k- zndJ3j@BNiaE-jntvo~8IzwDUpT9qt^O;Qb8CT&wxSgXQu)FsL@uc)y=VM5rYpDf8T z@{xSzTPDqQTN>Z3X?f^vMwPzL!DH977e2hZ{1wBxpkq}NyV`!OSjm5MW}mUC#f5?f z!{6(c&j_-XYplONQ_8O6Xu&cyv)scorMB@{1W%UV@N@pkgBJb9riJ-$HeFgdC+|(c zvSU*@EK)AA<+ey4Pq@U%_B2ZMQ2L}3RYCXWs0s00nQVSQcDtC#BGWru#w)i;d42x3 z^S;lNuj?NlT>fx@eCtmE_a!?H+N~4R<o^GAr%mm$EMbe7DeP+xFxG4F$<9gGIiX_b z*;&&Ytly+Pd}Phs)|{}1>mb`f8NGK#8--^$ZnvGYL5FRxLWX{aaFWduXA4C(LE||B z#ZN4cU#feMb#ZH9oY6t?KF+W?0*_zp-8@^sdoR0Me%Z0VEfQIvU=vQ-rud*mg5&5B zPD6086*!%N1Y2MI1mUC|vcB(IHE&obs+sM%qWR#<#LX@@ruJNRx2RR=+V=2^U^Lqt zyHor(ENWW{=P_F!dAWFT>5|~pCa*igCMUhqE!H}D>hz(S-N})0Y=!D_k$?7P91N+O zxn*ung>Rl+y#KyT*_F5V$$H;6dEI$;q3iBV`!cU@pZsxw`oxp-C*7^DwM%QA5}$T4 z;J>T&rKm%u9!cwEzuj8;Bx8c&&xQv~?#AEG%jO8{m}i}hV>f#?ujK40Mz61vc26qQ zYJPu+QM~_E&-T_+&)QENIIpU=%<Ssc4;3nW%W~#@d+;e?j$dQ<Ty3jX<~dGhOrJ|k z?dqRZT;!$N@XuwnQg^cc%<0|26Y4Y5V<RMfOwwdXmN;80adeX2{D=CU+Z$Vg9w<0F zX(lev*;H%y$<xtA<mZwd*Va`0Si*Mr-PZye34fL6Jsgos9lXWluZHZ9>)5P$BVtXO z*cA)U(?7O;lwG&nd6Th<^<%wXTw-Pu-t@2=PI$vp#XN0)Y31%sM^5YiS^6zU_ko*! zea;+a`Mp(>zV4S(Xqd2sPcF?Ps9mMB;*v~i?n^JL{P(*HIJ>6jeSdcA=Hq<Ls<tJq zcYKwZ<vo_1xqZ6tXI)@;=0qd?<5CS%Dz_;rq{?v|bvd=C=f1S&XBozcM*Nze3*>#K z%UG}be$`#3#r3LXNNHc<SLf@KtN$LHd6H+U7eoEugEKvU7(G0ra?U47f_47E#jh9y z^too=Q~Mjkrl_uVbKC2uix#~QU{MPB<NP$pqN_#JB0_0d+QPdVo3t_<%1!24eJSd0 z3UA6ioA*@e@tq!Fwi3x5&Ab+z6K3zc#Bun_qZBzC5s43T)YVzpmN@w-2OVL0A7gfA z;-a%tmKyDzST8^IT+qb%H~D`V-VNhZ_dNRAwl7rk{#TLUEcf3Zr1Z~)1jOVX&fasw z=z(e6Pe$qW9}iiaZ<JMfp8X-K^83e^Y>!+{=T;Z(yY~BP)cpG=pB$JRnqH&cyg+KQ zO!UtN@#$VGZ)uq`JajVOSa9*ilbfm0pLDxS<DPcTYB+H8_%qvk^(vSCh9;)$n(eYH z|I0_|+Bb?ewo}Zm{B_@Ot6=NFTCQ+jzgBb4*Wqhi8~wK5%>O9Os>GGKe1F5ww8JY> zx6hyUU3JdggK6x(oa+qoiXIy<-%OTGyV_en`K-E>fOChqYl7C72|{5Hn!01k=De0H zx~Vu_R(*!-;nd@+zs$U^+q<13=558p89A43PY()Wb*X=|UPvl#zGCkO4fc1_+7~Uf z%X-DUcd^CMJIZN_J0#|ue0ik_RPJwmENCG&XJ<ytlK|GESIuPRB%W?)HvY+IJ@eqq zeOphiGP>VUDEHW=TzdDJ60POZyDQkz59EHk*KcgZv7+$m$(N2i(ib~S)-y_PY)Cla z5_@~+{D}`9a_sP^XYVh2!t|s;P;5uVt;1%O2lzH!RrKl*iq~M}d3liaymeg1vST|} zu6^cEJh6;{Ez9PIiOd&ImRFuzR-HM>HQP;0P-oWh=lLApp4932&-Z^cw~aNt+)`Pv z&ER2{>kosK2@!cO)z+`yXDcOYb~U^I8&`VyB44fb|F#s*1s8JlE$#+S3f9g1{z&JX z>Ejq<`5Cgt*Wb8`R2UWYEx*#Z+V%Re%9AYd7HScNH)byWey-q#<=e7zdu~epKYVTl zV`mlvpY`pwhQsF+M1<St?mWqQsPRBz`g7r)!kQFIB|huNWhO_(mnA&ju=&P^pydtC zTh0kRY~ba)^hjZ?#;vyIEjjg)1ryBd6CNw*9;@VgBfy^7e{G`Q+DmKHqkOw|UOcl> zMO&Zy^V`1EO35R0D^fmwU&I>xGxgH8O%F|X{;aY6xvX?a-tRJ<+RJOy%i6`>p8B;c z_P*b-=6Nn^^<HJ0KhF>is+;NR{8#*~Pxf1_S54Vo2j*GN*x|TOMCYnP^VF47OzVsP z%N#O0ShV=so6>~jcb>P`#4HHW->EIR+~|j%Ou@$$=UTQ0aVjLR1bG!+(Ba}(u*$bo z*PP*8$>)M?=Oq4G${%I_@|^w0=NbLHk3zKc`gkV=YcYONzvb9q@l7e|)aK1w^m%Gd zUio0y^USU%DRkcX57U?2cBt}ZFjCmN)H|QEUi>hJb(P@+r+0ylx&k}h4<@y*nbsk+ zNJQN0gl*TdX-iise%BCK051ZUTXN)fm!Fu>C?c2jZ_-;|Zz;a=&0*T1Qke(dYJN8J zz8Ylx@A5j+m$M@$gsbU3zU~%x;Sb;Sn@WrZLJZtZszMBh4|=gMCH$XqyxvLi^@n-& zVeBpG+gY#YKN8^lUZy6&`2ne@fRz+VOO0(zCSH=%oV#(Q{;gY=rk32hSN>2)ME|bj z@~vj;?+1P1@#Nk)yF}1#f``H0>9U{yE?Rd<>0n8pDFf%STxW--Oo6UWmdld+&4qld znUoHi2>Cp=o1tgPxBYGX>V6OL=2gWjUdbG8>|Lk+{a5oB5lOA73?TYLs#6u$lH~^s zxNMu<uQn>giM)I1yXhH^lb_F~-0P=ZT`w-Y?6zV@`zd?&4L-azY1?_VvNwr(svk@g zGGyg_%YSaF;-<im_r1(aQfb=PCEi<Y6-|$y@YKZp(x#tm;*O0x8Zz~NmNzi#bY!dT z;hRymWZC`QC-sipoL&@g`N-m@HCIh!|1lMYsHdg1I9wHM|8daz!9+>htV>Dzvd+)? z7tGzS`e;GbomdUSU95I}Ru^<-9*8C7nRN!Q+>v4C>9>;Q!u*W0YL9MsKRc_&d1A}v zn=TSRCS{r(G??|<psRf02g!evO6sL6#JLzGKj?}4C|~Gu>+<7Vjhg0;?F%2|Y8Y%h zTx}+x>Y}MP<%5}s$yOa--h5|9rYmnh<R5;$pZ}whh(N|eSB(z=hr0v5UHTXk(-L%^ zdsc-YS3rG__(F~r)wmWWcI`bJs)dS^`Kr#%(^5B#+hJ>X@9Uwx+Jf)O1om8H%`d5c z$YQ+b;?arEWuk?XqoQ|BI(PfGUQE-YrPdz~AMVxT<k&g;sf^u(ip8hn%FcZ6-sRP8 zzUxT@^9MKa+X5fl#09!K&3C2zxmU5cTUp`Wizf434?q#y_u}p9{u6VX!0}qVn0wc} zJFodC<)o|#VS2$oDd)g+PEWH5Da?m8zSQ%`g|atQR4neEp}|$ZxZ5HiGOX2n?gw$F zjf^*zGe!hRvlP$tW_p)?JXNnLdCu&aXBynN%6(X$TYh?QPFaAZV{&+5fSur95$=5p zWnwg6#+z94hCQ%|^VaGOQ;QO6Ubu8Mk6~q7iDt&>vqHbEf-WrkaEK?aip}>*d+2YU ziX-)}x1XL{X5QN&KDp+d!?cYvR;RJ8jPgmEGim=R{cigczup|3oe;p;bmigqWmkS} zt&^^p@nwm^-)F9ik8N`P>{%JO>&xbT^-m?MGSUvmK3*JNd-nY=P(wGEw|hUMil68c zrTPA`tVgeI%Xq7FNILdetjf#IU7L5hlx&#%((<51eZ7F(&)&~3-yKYx8u8%$!Ozva z(2jz<?$@1cZaOQN7Cq=+``YEfBTs#&oBP~U#0|JAYCZfK7H?u|%X+<u?fq2t6HCrp z*8SJ*Rr5H@$Gt^B?3?eW^kZhXBOcf7t5{yg_t5KH`|DJp!=cQle(Hz?gjqB)xu={< zPpNtqz~NT^N@v#FhF0dAMF*Q&a&{^hI&X_{pI5ANn0=jCtn_nL;hKjt622PUYJ06y zbV>Ekz4voUGCyBlc5nS8bL+?R=8KssMDjY+Mco#dFkh@CNy%Q<e5ZqjzzP4?HBE+n z{W|T^b+`N$Us`{3ip;|@lfB~05|S^^Kk(t4ZnwPVEuToO&Gphh17GTh{+#*uLETr5 z0#lP~^5G^|+<j{`&Xrtfj<ZO4yoUc<{qu@*-Td#I=6vq*y<KpwTbKD<<x}>Yf6w<A zoO?Vc{7&?~H6>cht*hpIE>dm!{K?|^({q)LM?Y*hEIXrBbVu8^FrldV8YRy@tx<p4 zd(*~hdz!7_TG8+wfi~4X^|@cw`D!_hzoa@^$<;{l{R&(WRLIsN&GUFB<K_$d=byfu zo^{cJr|ob;%}&h?8BbKAW4{YM;(hn<i`;sr4KHomckTCi^Ck5{F2A}?yQ4nGE$&AV z^87Ca`o20I;W_?Grt;j!E2;%sU)-|LpZS3MIE!}Q*TOINZuWj%dT-tobL+?Tb!+%R zVR&Gp-EDz_HT*3}k0Rv3VQ6vfIV23-Pi(Zi)3@yVA(0%J*TT|quS5zA&O|EZNE|<C zAj2c<db_}&N0*te?J0YX49{UuTkTQ8jf+;7R))^{>ayC?@cT5&sVPrW6ZhTSsH5M! zL%3h(U)+`it^Gc?{LJ>$tC`PVuYP|^-<90^eM|FaeLeE-!lKy7`&(Y$K3Q>L@`)$@ zC*Rr1Z+1GRzd2*Y|3$Kyx(}sPHeTneej8L|;*nkJP|&z|=I`fx+c>95Z%tdzEM4rs zEA1)6(yEiOCoQHPEPvS0?OuB9wo__wdFq4bLgK-*Uqw~e2(bs7B~}+y8u-;OKXCM% z=-fk$eu~d#758`@bw6uqxm3uZeo^SeqZ_B6IeipVa_Z^u)SMJ)fK;NM(;=1UI{kU^ zay$1;c+K6m%<1{BBv$byznoU-f0Wfq2-q7E-<<fp%0jM3eNu5ldrSNR)$VRqofz&T zH`nLtgc@^STeKwg&#fPP!Pnyz`DH&{C=_>Q<(4|(e7srWgfshI^K<ui?cptc^i=#` zP_>y@!D8`mCQbcuC*)5!OLhNg6fkuD=iolCIESet6S>on{Pxzy5BbwC$FN$c&VKm) zs{5QkH*gm~F~$Yl1t`1*>H_>dSQz%h=%Iyn-*kgmR`GgpgTKHW+~D7ojoIM0{Bmg@ z&IbQtlm>swN>GEpoM*G6X^iEZrDE^HEyD_Ht_S<9lzn@+`ie!cW8qfb_kqc$8@{i2 z%AT{wo%gX#EPGkUlHCVaKfSwlxparH?y9$*yQ1HRXV=y}?`J;mKUZ-sPg9mpQO;B5 zxEQUaS*!0bv~b@&a>zBg`R|Mkx<6++3+y?0``7A2JEF}iqwl|XZ2s$pb4is%?21^? z<^MURE61@0ikp90d?`}vlksoI<36@)*6=02JhuPjGvVpoajZ)9b#u+)-fVr``q)}2 zE<1pu+`?nmqz~2mC$CdroSjhC#*$-sok1mGGcP0O4F?T1p$&zTxm%bUS#r*)OFaH@ zqG*R=!fO+)zfm?P1@qj4YZAH4%1k(U*PoAYshGlCUhQ--K;HCg<2|-HN$&(V3&ixS zdQ#$dpxpN8lv^J;WcpXd)SKuPt!R3bCEd4bL+XLRsec;go>}2_|5i%q%={x3{e|;( z_r|7KO}*S3YqMDEfm!wY<C2mrS9ZL5@<pMI*Y$_L#|HarWm|vlsIjZiW6`^$7_58k ze-Yzq+r7-<hd7GeEg3J>ALG*7bnoQ`n*@%VeAkcvIM(cc*m1s#f}QgnqvN^tx%>3_ zBQ6GB{lj}??w#{bUw-zSGr91=HnsF4GxyFq%vyK6CDcwxR?RSmM>4GG<~1)t#=}ap z{TD6V^z=|=?f18evp4(<sP+ii@j>O*nb)uUtL+V5Y-<<ZrYUgt%z;O(!kZEt4{=6L zm?3Md_}W!u&TOCZ9I^A(<$DWaqJv~+KYd=m*H~t@?`}hb{IX;JZ|Gz>ERt$S-n>om z!3`abqenJILIyB$u0aPdI+8c<koElt8ow~p29IBOEZgj2v8qvdro|-9u5AxJ)S}sB zPM+bvVKJ!_Jbp3p%woj&MV<-z_(eTz0AnpN0~oe~28i*C%Tc?#c0HISwBb3QT3*5j zr(YEsyZ4?c;<(Lnx;JX`^~T<v>baYX8iV#eS(h^B)Pvmx2aYbb629l9+Rz~Qg7>K7 zW(|dgRrO|9x87l}xP10-rF`<2=QSeo7v{@9IG=21))BmNhlQC3q$$VF_~=G=hvxZn zm-ZQaPz^qO9Ndlzt+YEFKPiv7Q;6||K(EHcw~`ap1uKOd4|mygo|t?>ebb4_9Gq)Q z=N&n?q1sl4|CsPe%O$Q~D%|;R3LR{GrhoIENLT&Cg6_???@ib@leInKl2Ki5P5bNS z2}guIZ5AFERr&bDaHpe?zg(cBkiSJjr^BO{?>GM4-D50ZG&$Jkyr1m4>LYFi@80s9 z3}<X;d9qr;(D_rS`@G_u{hi1~(>s$xQO?I;;~D*I@*Yc??n1{i>L+rU9hYhd*|1Gf zK~#t1sEgK(p8L`(6J!}Da*3@>C<F~?91r+*)m^2`0bH6Tu66~NW{#hDrgH81cV_L9 zj3pVysVmRqJ#k;UIpj(Dw`PkZKKWP~!{dU*JR3d~SBJ=QJaT>5e^({utiqEcD!0p2 zV?#t_y<%Frs#pA}FJ?G><v@Db?FF0Eq9>LJ$*2hiU%2q^L5!r5bn>@NZQL0%*2W~y znV)z=XSwC1X=lxMaB!tKJbYl!DwE(Cv%WybGvUNr9%c29)7$se+LW9N_uU-1daBl& zUAm4T%Oh7!yQR6JZ!<XNAItvTkSVjdZzX5P&sDbBzx;J=rgb#ezbgDLdE|xI4~th0 z+Y1_^J9hG_`YnC5h*uR-6PeELNY<ZeK3hfM^0_qO#0TEXZn7NCcz0NXUD`NAcE+mB zwYrCneR=F>R>$ZZ#J9aLUGX|k%jB=tF5l#=Di})-rB$9UT{emHyxF6!9ZKuiADudX zRmAh~-t%)sGtM!bm0VaaDt7Dk!~1R5>*d{cZeaPy+L8Z6+waKDptZ5Zo4)T=n75qi z74u%EC)u|8vp&@BzioPN{o)&iE1UoCKl$vk+1}j}-qQAxdp;aYxteoE{dyJCwP#C& zb{@NXZt;(W6a1u#<Ly4wD4x@<uDEpJ_oc4qyuV6?KJmm<`2@(h&)2(f?x1r03(I*= zk8RmjqB?iGe{|`jFv))vSA_+N%&%+IC`=5m)wh23+ckEnYus0vY=%#(Znrh;d8HsC zTzS>FF8@hrIg3kN>66gowFa?8h2IWlP7NsVlMH<xaMiLcTsGGK-B)(@DB}<<#xLyb zQ4deIFt4?^(3L1s#n!)y+0iD&UtHL={^8BbM;lLV(n=A1uHTZRzJ@<{^#U`FHVa$E z@0*(~Vhei8Wp8lhJ($PHE|YWOXo7Rxr&Z1V=d_=8cRzcjI4_Aa*1&E{(53wuWm0Pn z6z-W8BDL0Miwc{wcerHIC!XKQbv%2XrghfJvh9hyRh6bzE3)UQR`zD6ik+?3Gk?Cm z{;OWJVup41a=CpijdHhl+r9PM8}!zA;?L<y2FL$Sxb#ewv2mS<_t9-_0vGE!pY6ZG zer;=Hj85p;C4Y5GtS0{nt&9A#(X2JiywEM9YGwGWz3-N-e;qYrd+m3Fd+Uw=7Ra%_ zY?pZ1{r=a1K&jfqRlCv*wr&W}I4An{;*uH-UGDjR%j<W|IA8SIVB6uQb)r+_UzusH z312$<Zr1wQT$+wPT5ner9h`gjRMZ|7?fjgY*DZm;zAF`tl};KL6}>ch$IbCp@14Sh zilAN3e(u@9y}dhYZPe5FW7_xIjKAl{?5{kvkiYn8iL7VK-nyk1bH3dVj=lZq)ZVn! zPpWS&`u>`y`1wSE8TE(PpZjGUW6mB_r(4taaPI^4_hpy8-i7+6Uaoo1f4StMp?9U* zlbbpXJsdq{Ne2Y2AKVb$GKKH5<O$#3R(&d)!^(d96t3L!!hT9*;mZFyS>LBQ{<7Vs zzx<<(>7RXBJGS5W@$cH%<96|7^{c-ps@a?~TzNrwH~TT6)Bo7NCrP|+tpCgZ@Zjoe zD^0aT9S)wpD&kyw<qCV1=s7R{d-6Nuo4Qw}r7AQjK5v$IbXe6cA<=Tp%S}Ogv0J<| z6`sD-du6UKWoq^(#ZFV-YkJ+ck1q54M9=2z$QIz<^zYcS*p|4pf%>XmEmJ-!t+;jN z)|ZHvQ@_qGUdJzav%>5W8{ghV!6($}nbI@=XZ)x%{}X$XVaJxU_s-_2UVq(x;92px zy!`AiL5q~gin|iuZEx>t`|+WrKOtj*yt8%Z->Y-A4`1vo<mt<3IPfh&a*tIwYcq$P z)1SY|JN`sCpP8tYps5)3XoCH6g>@?;oLvs5o4Wj*p7cgTWm?wKtle{WDNXU38)O@I zuF0_9=gu0#{&<7FcP0Itnq`|0yO*g7n(?{CT7c$h4msZ1mwkDs%>*;vV}0eT?_{u+ zO+TH^YE~b2eSZ9tr=M?3nZE3+Z)uvYX17L3(Z|Op@4C!4Tiu(rIc~MZ>o>o<&O|ZI zkTU!CiTCrfs|Si!oIcBPz1Frfv*B}5AH#~&jE+pnq{vlQ^#0^WT3-;*4&<3Q@l>v4 z($&c49A@Ivg7S3&k1*<bN$1&C>&=;zko@ic#g~(fYSmsHuJ8LBy*OlD*_+-ym8MEx z?A7d}cH3316!>;}n|Fia|3IZ^tJOyLokGrD>D*eVYX9}==A~O)F4nE^j;+4=Z>nA2 z^1eRxwAEQtPA?4-y{?;bS4;eA)Z!`oRhjJXTTSOJhSn%L|F1&YjlW;9zPdK&qVaSc zr8~OQ^k4n0@8)9`Z~8MkTugTT-E-5Kw?t3)n5+NnYtY`?FPIM1to*b21<RWWXPWaB zl|t16=eB;j#<<{o=}f;(#+O7w7#4~?$Xa(Vdfn+7uKq(8Y>F;0?n<~flPBN4{$B3< z%DXFEeasImoskd`v@PEDl<D@5nc6x^kEfjPeN>m&^_u;XT+PjT>7?5{x5bx6{r<43 zK1^m_hxOsw(5FjU-I5pjTxAcPDfr(>EztDa-j)A0RhX{b9=$s365s3>s@`7|9#u}b zxcs*Mr2->A@eIS5w%sCf)4ACGu9)*ZPO~~_@vXH7CmOAZQBkU!p72iRMqAb|75%50 zyn*&pR<6|V{P)1k#K~WSH>sXg%erXcZl`k5ck5R4^ag!hbdl-FnhZmMy&~@=Y*z(W z#;MHDd^+vf*>(L<s+atj)?VP5B@)LwE9Csu-%Iz@XwRAVZ@$6QT<_j#Dvrme^O&6O z)o$}t<rm(5Y2_8wI(@D#jdi=ag1?>fzI=0CcG_{7PYcecpSq+F<|54bYc;#KLj5+; zr5eF|%l&8as>kd<p5J^UEJ5Q_(XWt>OBZ@RT2KEd-S^Ag`s~4mxu$+*s=I8|qknVn zF8TIsm;TRt7oM+I<9+e$vj5LsOM_nrePTDs2k6?HZB3aP>b2O9=dWwwey8ImQ*NHR z+xoL|W%TYBYOZ+`;yTJtbqT6`m0~gZxHv?ho~0=?&TikOJzsmSO`q%1cC%sfnKd_^ zCi2Lc)@H8U`}OJ-fA@`1b2iD=C@5zZSxdd^-4tw@GhP2w#gi6J+3j3;mAlow=a#)L zUmv`-tY$sSr@BKSH!DS!oO*He()XnQrPdOjwndlU{agFjv#a3SR>mEdmtWQVS{-B) zrLf4k_!@hCPgci^3nuxey6*YJ<X_t_Tc+Op`r(WX(oVa#3%`8#Il<_s&fVU3cla+} zUAS8K($$NV>S5h}ySMeo>F4&V|6Tm|>9gV~TX@e4C_H}CXOL&5D(=_bwff?kuakEz zH0C^5c4u$hMU7G`Pv80_F><WRM;gDMXt=z0azW*(xkW3dUU98|buy<wY3sLxhdKFA z816_cIQ&4YU0^3?UVnf0&b+V-m5V;RJU`iJ^TOs~!q%dB2@`i&Ew;V3M)`b``<A)q z{>E(kFRy23t-zRW6p>-4aP~t|-1Jjdxqf`BKk;16c4hJJmzNWMXvU@<W7D%Z^=7Kj z=778fhjc`Eg6iK)oL!c6HmaU8AYjj{xOw+=z8+ut$LZIr7{hb!&llfceY9$0%{w34 zL%scRYYg;~Vvg+SC^U@LXW?9^%{{qw(acwF>RL&MD*G<+wyzG<jQr2evF`NeaPNS} ze*(jvJ^z&CnE%}-{?(`MRR>Mi9shiE_Rl5R=j5**+qrPosrS2=1vEO%DAH@2JGcJj zq0{HSO4PF~?!O_Ovwc(i{udixJ3D4Jq(@FZb8PO{Mn%_z4MnC)Jxq`8e5@pEKChu8 zocpH1)JuJj<1-G#o@Cp-XVV9z*_W3;3YmAF`_%f@HD~|iNycq|UA8pp-E~IKtN^C^ zgBKQm7o0P%?r+q;f3oWm=T4k_DD&1|hZ*Ke=9<@QT>Er<qV<(1-j!d^g*QbpcyUiV zWgj1U%575+>-0H35x>9dsIxqIT$k9j`qzf3mLGq8vI{??acl9<kP6eQI}0m+CTL#j zGud!+b!pYMPX{L$EVYUhTE9<9OO$t#@ux-SMWUV+*FJTd#KN^~ZFu>^g%7sO+FG@k zhkech<=*}!PoCCae<ZOeSH4#2q28>poj3Eo{7KsIUHII&z{gR`N|N$@DrTKJ?X>;d zmu11#g<2Agb9tpF6za~|&+4`K;@1wIwj)LJ=DnJ{_4uBe^oJ+P7$<erOE2Nt@T9Bi z-_xQc6AsR(k?c9%{7}8?`xF1po(_{g?+?DH@_6s%d6D~gX+cp4YfF9od+t1Tk?^}0 zuZXi=|5|r>U#7hIzeVSD>bHKnHf=rEpIa{_7n<H$R4tjg;-vT6qSfF0I8vS;Ja^dT znr`do_xvU&gG>*FeVua8w8-DG@j2ID_ewM6wolHHr;0x<l3;smvOoOH{H{fj_S?7D zR+jPExwWUV-wVD~FW+G)CVBawP5sWG;+|Hw=LH_C9=vRJSFO3uK55<#lUv7ExvdS# zE7`q4`AEq8*CK)2;+6(257FP5U40<SeNV=XNQ(!LSkttp)rr2%c6iHcu{8ev#jmqo zbXBa;xF`D2P~Sw&WSK<o$&k948NMJ`7$Iz|k{Y%|@zg$coqjjh7jH9G^B(fqS--!2 z>8e`KINt2%1^?Zqm0vr2-Tl{xb639Z+#W4`R^Y6`D#<v_Jnl80x@Rp+%#2AicAT@% zzL2YFzwWeOe`6{wRlgi`W0@m%Pk!h9<^C_GH}lj)-S~Cn=S79p%U2g(T;+Y2TQK2= z@BaVssaZxRjlUGHJXNEWSG+V`_H*FVJIAKatY4pe|NZgC*|&I^8xHieo@;t5Beiz= ztGjMmX41kXEBSw@HC&%6n)_^%qx2j9H{R0MtEPv2x4h;4>6^|8_xCUVX#Q;0xVBzj zgR4sGOGs0dmW9U8y9NAglLPXf+~Ll*-B?|<HvMVKpGmS4eqEiUa<%xy8l`vd=X`BU zmVV{j_@{M6y<1@Q-1FS;4E|+Kx#t<rsyWr0SNm?itK*T3myGKaE;`LwFLa>c)eat6 znRyrUCbYLDY_qhkxjuc#Y3AkLc86m#y+tOg%$ud1Yr18(jwQ#tsa}hxPHQ`UH+S;F zW$KdeGqf}!LVj>B<Pk6~jSQ(<*_OFRb%(Uugmr5Qvr`n7Jz=gloYE@#??$J>Tg`t9 zR~skUX&(8?^~<?!h5CM`e|i&6Ow$+gW(=DtD_V5p*@2_mSFH(Bxbly8TQ|SdLT-5z zVQq~c>wWSKCheO1`r`iyv%fv@&(^GJ&Z}1XdM9(u2h#(w3db)@`u5_ouIwV^z1f*Q zZP$gB{w5pD>(RftKxlKLEN8uaM9tdVjdt@-b2sO<ygV{BK~j!=_SY+qWsaF|+j{q| zt&6fOySnTKA;my{E2r6))fV6GeRw%1#<MGQ;*Px=EoK$Hn36iDeer^G`;>O^6r4P| zuuI^%XG2HLfde9md2a>Wy3B&7oqFR|7h>h@T9;;Dv7>8C)zUQKdoJ733n$M>ujjZT zn+_gdO?z%A91>Vtr2qD<?QN^2tX{JUIyLv6m-~9*^EQjQE@9hk7EZSCD!=x!Y}2;s zEvaAE-)k-8d3vPrhkj4&_L}vTHL;dA-ro-0|K_?@rZeZY$#+_2u1JZ}<d_%5!Lja_ zyj4=)%*uDo?-tJ9<+l9Jt_E{4*_<_JgX*_l@k`N>+MyC+YbS8Hs&QqI#ml&P_cwLl zv%A=Ruj<#7iw2U<9r<P)y1(w~D#;!9S*|^toOSQ-h9%*pXLlHX-5u`CIdzZP)!Sc} zw5<=GTGQ<F@SS7)y}+(k`ThSj#AiQ`&f$JjSSTVlT~?i`zLM$F&(P&xo#Ld*n09YI zz3=vxxO#n2qist<j~Pra|GsIV-}^NscjcBX;F_F0)xy>{bB957;Qt#7Uo<Jt&EH+W z{m1-OKTFi-opay2$3-Th_{nbb%<z^AHyUm^uABRXopJHUsWzrp<u|Pq`0QzVBIc@y zlRLwjy<F055fhh*uE<uKwNL5t)_pm-CpvQs^eo*j=9LTXt*<|5kox&*!hZkS1^eIi z+MKi(De|wpC0nKSdVfkT^EI^${<mh6q|SCPd*5qXkj3*cY+=Hl4Y7s`Lhcn_G*NCg zPw}mo7<$_B#b)RCyrnA^E?D?JGKfR<=#KaqO>6B$WRCTIaAB7DEB?gWP}%oLgY%OD zwdqy+@4VSCZ{lNFpRlv_>XoGiNm|7R($3~R*N-x~AE6}O`ZjCP`lQ1F`zOTS+I?i! zCu7s5Z7eK3tJXO^DD$!t$X>pi^WK&X%MRSWYt@l@EJ^l&Wl!a=TT<&<1Mh!rRAjx{ zP_JF=eA9mAp+BA{-Xve{mtOz9HGad*prdy<E;`m<4w)vE+iCm%?f=@%|9;iKebS>d z_2`{LQ$(Mv@%P*2Z)wKz{))G6U1s7UwX?ThKGxiwKSl7w46B(p-*x@9zLBDGAjQ-D zS9P_@TP3r`wlA~vtyGO;4Lg?2p5`2-^JS^$xz3zTi}|9OuE}@!#9r;rn%TlzHPL5Y z9PjrW=f&oJMu!zjex3c5sh$4!TW?(G?)s&I`!22z&cCwcSejnS`W3$mbXBVM_o=e- za7VIzeLLyUy_a%o|Nn9EN5?KIX*0Jv+r3SnyWzXA&5Vcq_ewWqSKZma{pR9U=j|WZ zYdL?2c<Vk_vWw2l_<3pHr$rmeo(3#AypH$(9_@hN7P-#_f1kaXwk+dVW7~muTO%&_ zuFtq~r=H`>+&}HB{<25DvcK8d+wk}8>XqkuPkSHy5NLXM%JbsXXHxyXb8N3Kf1(_* zhRLaOL#;gfkweLc<aAzH1%A_d7!{ovt*~X%m0QgzomL0We@oQ-HQS|i;g==WjLa3Q zm_8gkpKG{p)zkNaSv6;?*52vdSNfrD?#}>_TMp&PK6p?sS8kbq{G0%{je&vvzG?kk z2lgtl#5aAJexUgwZ$_fVp6Z>;JAS%v`BtXQspoFjx_SSZI!<;$tF}2N7m^m{@SCk) zd-F=-J64VxLO(8Ay<2%8Ol4*G?`jQ$yvxDg0vf+GXa8gGG5OcEr>;6=)jf%+GueNb z>+v}A3f!8@I<GXRp`JBj;Yr`!zqfx|F8k+6(wp+W(wp=AFC<vr`D=Tja%$6Mor6X% z5Ac<9#jlQBZ9Zw%8L#s#_H`<$`M<?9uFT2i^lqJ;AGP9eZm8ZbTZ@d?+-~OQcm3yN zKRu_h+-lLG(g^F??F&BMGM&#?cl*naH~nW1-mYz4$h-S9Cz~^$uEm|K`o!F0>-XL1 zQ(vMSY5o4=lD|KVcdxPVambkZ+Qlerzgmq+(7Y?RPDLEvvg7(H^Xio`#sZUVvR`h$ zoipt=kBrfTe??I%o6q~Y9B8#tyzbl?^Zn!#|4f~U|Gqw-XCjp!tK72Ay#43I-yTb} zZan=~nzV1%-ir)vQ(sSQVt6aRp}aMre(&}jDYExut7b$O^&NP~Q9kLEiDlWWBGzC3 zX2@TD%E*0h%Fj8Es{*^8|N6Qn(R}JUs~HhX4IgAz$34*4dV1}wDLs$7C%>_p(0JmO z;wq^`?-LbY--{~UKQH>Le@fShfI1EDO20Uf!wZZvu04O|@3r#(MeCMr%MIVwrgZA? z*erQb-&3Z)#ZWxvZ&<CynbOK<aqV(Tr+!@&n>E#{F6-@ImmLy{uh>{D?z*VjxG3Ir z@laT0a(eDQa{)`YGj%7o9Zj;-N&UL)PUSQ)iTF7@DW`*+8@BN-h{^h*uaN5(JMq7s zzNz<dJ^{%&+-0u&Hm<G8IpzJibmO6#b@%k2KE1u`VSasK=NkP}vv{4$A00|~^Zxq& z`G()v-Le(K(sr)a(dhd)Z({wvRb7_#%4I^ixeMn%S!!cCH8t>hSbuY5t>dHFmwbCp z?%$Pvs%5s!4$a^xFJJxGb#kN0VZ}Wk4U>XQ1Y=#M-!|roSrjqt#7%AQskc~*pR=#M zos_fhtmyYzwN*PqwBp|IJuDC2bN%ac@yefPwpCm+zbY9U^sD;ii$}*N@9wnA4U@i_ zwl}Q!+Du8e1H3Wk;uFutx99r2&^_2~{@HW;zX>m652}3FpB#6y=kF`#jrB>Nz3-Xk zO*wV7uXefPhmh&Em8@!V;#Z>%f4AfGF|Dxw{$ZCzd+}XaRsQm%r`=WmnSxrUH&(KW z)W525FBQ9C`nx&r_p3#pyk~AYW%Toe-U)|T0c)S<udb;-+;R4z)6wl01otk@xvToV zO<H@)!j)<}-m*Tpd|=A^K);KYmaj#kl}jI;(|jksY)75K+k?~hDsDTwp*C>U*4rN+ z@V(j;pjZ$ey7cAL&BvT(uHx6)n>j64xhDI}meZ5!D(hG6*NO9eEy_L1?}~U;<=eo+ z#xGQVTobF>|H0#88fbNJgx5vL7|JU5`uzU3=7-A*cS$w;Q_8LXxIjPld4R52_mi}h ze*(USH~$IHxlnRe!TV@UY?jNlj!iL9_xa|8mT%gTw=&YR%T>A4bi#~~5`|Z1f1EW) z|F!z(?ZbcSuU2TyndI&CeqDX!j2yG9jWhNO`d+W&*P4D<@D{gHRoTZ+`ys;}O?-bC z7TjI>LFGuo1^ySaINog8w)Bl>Z`O9U6Z!2jUphMOr+US>dpc~*;@!TfYh|Wu^xuPb zy9COFHF?*6o5p-sbeDF0Ijj3!^Yd>m*fNTE#9!cvpSQpM{MH@kPOn?FCz7xEs_&C( z=lT0*aV-q^Kjl8ptGh4QMgE6RHq^GTUc-JhEwaK?BxnM!^ZZqtR-SpG{EK<@tDe78 zFDpsfSfqP?d0b$+E92^{w`?+|n;van=@<X}8dFT%t$qLBC9d3m=VGc)riry_s#R=h zL|{UC$@ZOhv$Hf#Z9Z6U_T*Yz^gqSb#mlVExy?CxW@@tK=6%MCqYl<BRGgJ(!EJnX zEBn`t5B|*FEb!*l<?zy#XWqqqx%v7|6!&}ao+;;2CkgEFuv)KH87M#BXVFWwrD+?p zH=kbmw5DU7rjO%`%~wA@KJ>|7pQ|)rbyYs7KI}DKG|OeF=$w`RJ|$`Pysghlv-*9t z*!AB+i+4wVm3v>mcfvn<;fn0drw_iF|7?BR*W0{4XAMl7=go3`z53u3o$NV%=l7*) zeVwuE>$<k5r%i&xG}kj3ei1+V_f(8&#<#6ryXQ1-*m{U*;`ILY`nQ`Uv}+gM3d*{^ zYVML>Vv{277+2YOI5#MNIP>lDYwxywb@lb}{O*i)6TZJ&THt>p(@bmc616YEUs~kM zAKtQ$`Tk>H`6=caZGPD&JLJCn)cMLHdVWh#dDNvRWhQr|Q=iu?j@_q`9DP~p%e}7$ z_j+FA%Cp?2?hP50S<1P*U#r?aan&0euAtN}NiVB6{@*3rvt(ZN?aUV8U%UtAKJ52f zd4D=zEvrO*``wcdsw~w0Ui>P4Y42Q*^7-tOPo}@jD|ucwW1ZQ8{L^u+M?U9%`O)|F zmbjA1$>cv`=N@l-99@>TTe@zIm4jQ<FZbW4&py}4+?9WKVUS+=>(!?_UDsLf*~S0j z=f@aJwSAV|Y!N2W<x}E6olZK(H|Nbm&gXtpOKREN+I<!st}d=WpEm1p=(nK7k*~vl z27a6SiM8mm^<B5#pyiWAv|WvUUzwuWe9799^I16is%q<H=a+=}Y88rDD2dc6pEWpe z_~nJuVutajviFIEs1!`r$g3^xx%4k&?UILAzod1y+-r2Qj=Q;V`zpz0HuF!fnSJAB zO2MzwYvVTsm;_%9+xw(tTZqQ{4#u^4OJkpAe0seh<@ZSw@ncVa{#?AZY5n)3EB_V! zTO<9yYHQf5e}AU?)UhhoubjIgdD7RQy+w@srxs3+eqpM;R8B+m4Qw#y(q!MCd)A%| zj-7q->gV#BhpRFLgg;Atf6QmIG-~ywrk3YlKGh^Xwp?6sO4~+v=6T+$A$8@q3(uE} zBp=urye9HZl+&8XoE2x-l`ik|eQn>DZtEWPVAiq&6^VBWAN3h?E7lhrKlyj{<G#tq zWuHe~)4OH)$X1nm;eUQ{`8&P|=?~bRm9C6g`{iMRUfld*|5tbFewj$rd4<m`JS5a- zRK4_wETehA!@h>a;m2heMOOc0_Fwkr$dSpK5~sS|gZH@ye`w@&-yFZnOyzf#gG5GO zS3z^7$tRtR2`p@FSJs;!`76J@{#C<o`#b+rr!yYlmHhsR=ir0eF*ZAmdn;#@eEjlm zM#)3YpbJiywid<-^*L?6r}#UJql){|y@cCb@$ataSMe4|J&3%fayc)(Ho-&ig+Pq2 zW{|I9{oL90f973UnZ%?Nr<-y(#LK$s^a93mRcTi*&G?FmXI};vYMp=1`t-WfwY2)9 zGv!Vx++P=R`mdFOC$F~MS61ise=Bw7qKq`XWZe9HhPet$kx^xHl5V}sPUp2(Cq#)} zVVV*3;9m3BbzD6Y4TRcF0+7d<CS3YkaeV)u<>#KAJ}>(AVvW|GS+DNw*i*AXB-35$ z#+$2Fop%!_w$!(1UOhUg;;ZQDl^GM}OcbwOc41%s_3%6u&jks$s!GM>xcoqEwo?TM zIJFvTRaEo;b|-gitNrrw|6SSU=%;DBA6lEe`rERZ`SOlwnsaYR3(s5jY14(ZwtHV* ziJQaa_TbDRwv-s|=lPA7GD>WfniV(BS-$*N%3DMI`;zxJ$2Kgfe{`R1t+CF|Me_`I z)ci>?P>W}K{4wE2=Of#n!Ai<Xy#K2WcFEOEY?~~yw;;xSvU{k*kMH{)lsOb$mG!L+ zEQoz?{&x1a!pHi*&U^~j&d>e1>cINB^8}+7>t2dd)Be{wbI%pM?OE@0{+^q%;IF~N zQtyX7ADMkOh4gL+wOtzSeE)Jicj#N|S5I&DNSxwN)jS`o#(enKoj)rzW_>NLzCAtt z`Ge$=h_VN^OaFd1v=e=JbX8D}et)QHz=Iv-OFP;)#HQ|;%GT|5PFY8*@YkY<kW;~d zoo)7OG!uPK{$$Da`tzX6bg9K#`E0Kw>DXtcsyQ*<!k?eq5>L*FE0*e8%5~&ca($E5 z!`*fhzPQBM?c1j@t8z`&6|JXk+qtcse7^4V6HI*_s#OZwbFqzm&9?ICLMx2V9by#M zH;CT&W%Y@W(>Lok&pf}NN4Hh<V?^K{?MKOR89o_4hEkJP{xP~Z>%y!HvmR|wOY=Cj z#=}`;ZNJn`6Rl4PfB#)&OI&v6{{En=`&8D~w{0!nQLlX3`t`%t%C!~guYTQeFm^Gv zIl;4Dq<l@(PuH^-Hkhp2FjK+r{(KA8gZIU}|JJSBGe_uGf-;jI_xt`k?=P!=Iqk@1 zr<+sz=ugIktCz3t$hf-nT`PydpJn&|uQxKC`9$*9&X80)(ei}roBMvQD9U?$`por> z@4t(E_I=w{&*+eF%t_O-+^FxW_t!jS(b>J6yRO`PD0JZUsV=kPn+ulks$W*G)b#gF z&6GcIyF^KTZ~DjOPxu!_>|eV;<HZcV6B8C>Y+ow;4A#Kmx(8|CT;uin=M=Jd#olwz zTYa70T-KQDQK-cx*Oq+5OFQYHW2U&jtwc?eQvH;>*K%!j)kW6MS!{UfL44E8l|r^g zTduSAN&P%yutYb|XHrEM_m<_y^3-qHzd5$<A!KZ7dAS9ji~b*GN#ARmuKk{&`%}N= z(({A78T_wm+<$V(sD#a1D7B1HV#?olUm4jiynMDzCwAhavTKd+`f3!~Hf`ACQl{nd z+pGS?tNNZ9{#=F3%l=JR=<HL+`e!q<Qgot~>}wx}?0IX9Z9}(hkltoH>5@$AKbKve zv8$ufyIFQ0n6#*CN%CX6!-)@-LkgOU>pw&aX)CbL_~TpsX?bgW{)JrsCG)IhSy^}d zT^-=mbVIIo*V5vgCFQ!kCqGm<Eve@@Hu<CKY|*4`Tr>RY6YV{IU!A1#(K~*h?mfww zuRibGV{qexo$PHP?{xkhRdRK1jWb!arQhW_F0wqjkn7P5D-TxBXB)1U*Cu#4nksBL zoNKh}?u>-qb(+)8n!Ng;b*`{FxzOb4g}}2Cv21J18anh28;VH0s+pmbuzAs6bH|6h z_s<=D!TdQ^ULq)f_e1@*hMn8><u3i2`q@Dt%S~XdC(o1#h2N~24;w#XU41|x=DqIk zg+9J>&8F=<(%ZS+`EYryWmzS=$qZHfz?`XzBBake(&6d6k-+Av&zEb!oPM&b`KC|o zu3X>uobT4@&2mX)z3MvoiC4i@SLSHOu$gxQ->U6g`}g^wqsK4jP5Rcgq<-Vg*Su~) z<wdr?=6B4MUT{r8fA;~2+ZHSb%kQgk6iCL&o!?=&Z{u2BGsh(le2hXwG<*ddRx5!$ z$vRu1=%vwzDK^hk&umsoNN@RTF2HyHHjAN_+-0^#S^kCw@gBzGxsej03p)h%8nLps zm~`HFQz4Zsy)9ra`-5G1<z;g9D*AyrPiID0^EdEGExA_7;HuB})`lVdWb|D2g2y+j z?Q|sEcF%SY66FjL_L!vI7@}41*2q@XZrN(pb6*^ftP{KO(pe~0_d-*oO|0&ouHCU} z0;ZZLRfRo63=Ym!d3U>xS-<sMqQfzVGq0>~)J<*@<_r<Z*<TpG=+f%2x3f%F)L%-t zb1y>1_u#kLDKTxy8U|N>8n_<tlm4CGbSV3E;p*@#GwltA{-1)bI<P;`0dIqNW24@x zwaWkAlD&J=y_Rp`@|vt_xb*wYc)6+sndOr`3?)BIxqQ)6W~p`CN_{RrU5o5$&xo-9 zs~(<&71eK^<hXy0mQei=FR{Bm?pNIUAG?Y++~2NUc5{8`r8c28>N`1&#om0XiBrj& zAJo>gT#Sk7Y;(;6g%?R_e3vHi-MwOJ_4Jyn_?%ZP(%G9sbpO_W+t+GY_$2H1`Y(@E zv|l9~l;`;0j89aqj(y)_d$4TM_B8bnWvKu+k2O(0f;|8IzP-GZk&&rq;sRIy(E3f= z1UBtDU%akXulMavrr-;LHL48#$}Ts#Gh9x_%$2n_-00k&Z(!IrdzzV?(6%LyH5hrG z<cDZImF>7M@$I2o`K|LgUw5Tm+LpZa_!OPkO4qe!tCnX*R8B8BR-53zE$8%txARiB zzb%_?Q(vX`?Dg>v$uHRIEbm9Hn{KP9^zWNX{f*C#D-UqozG9jXZnk32s?FDnQ<pxN zu(0p$yM$HQxoPWmFSTNr(cI=@w!53<*j$~jpScz+pL41G?04b5`ipZNt!roO=QzdB z-@1lfW%tY(b|RX!H=KTHwBGu`l->8QN49BBqu<1ZvsoM;vV0D$;Ov|q*()M&_QVze z;cM%}+Ycz#yU$p(d%1r6rhv*vX$-!33;4>8O|kcXfAI0W3k>$cR}_zw<g0y{K113d zbpGDVWfP)S&%ZYNpsQjskCF;^&hOT{9gK;$-!mU?WxM@@cVd9f)vPRMB}X3>gO$I9 zzn^@jFd@^)@M86C{WsFb96mm6bKM!EH|_MCj3k}xqZ3QE2JEe0bu?9@w#N2zSd;I+ z6V*L4dw4|-D=pIEKPtOJR?uTh=i=<-X30|SAjTsH?<{$28MVE|!@_do%8j>ebg%jy zvF@I#=9loM?#7vqIk8(+7QIz&JkV%x#HzSuZC=F6b^d>|HrIvfbG!e&Fs-YgX5U+J zwxrj#N8fu|R28#Lo2kCur9RsEWTlIE`qJ6wXWvoVcRBEjGT+t9ystRY53Q}6Bk>?T zeew2fXKP|!-QX$pvUpyk-lGsE`DE7B{6i;QYArV9uwOLqvh()w@G0m#xg=$_<*qXi zQ+Lb|pY_`L@slM1YrB@4+vlY$7nNEa)m_0N-mG)+)n|^KVa!EWmu`{bznAr;es<l` z+s?lx>;JmnTk-M}H_JQU)9NWR++$|>w^m-WK0M)}?8+6a3#zOR>KwMRPGi{kQ2DTx zkg)L#1B242BX5Lem+XINw{r{UzmxklnC*-n2y1$z9B{uikv-MD$}G&QRz>o`M8<ik zTeYuGJ$7|#fr-CQt+>|Hq_;r|b@R(ak58%J605u1#z6ah>Vj<M#@j#l>x<~iJl$mZ z?D>DgYcqHD-O20G)-miae;k=OX<EdFHy3y`HCVP(b=)vW@cMk#bU~ewfL|WFRsKQ_ z|6MEIxvJf=y)CtE^6Udr$Gyx}2uyXm!c)^~yr6oT?uK($x=%0l^g8rpS7%pG_L+Ug z`47(MSk$|+7Bm%KQ#)R6bVzB!hr;DwExyebPpVX#b$ChUu?s6FpH!S4KXdJC!*%kF zGhb$H;?qen@he%=Fzc!}`}#FU6la{#yxFzD^QmX%#(>>+y{FxKn_o39`}Hq2rY}a- zu66OLe))M19gZtcnE&Pd4KvBf0j+^qQ|Ic>dJt*Pq#`4mUa#!X_4;zh>C8LQzt@S^ zALxm>-tu+J!}7gfl3j0vS$ujbaFzE(pQzwev2<1G@`_}yo1vGTUj9DfcXG+T>A&J$ zRj+(so8VQe|Ml;`m%lAfRb<)D`+B5+L9()89#5-Kbl`QPlU;4+Un<P~yeL~`&R2(= z+nX*<(6oPXv9;j1l=X`A`kt2!nuoRs&ia3Zh4=mUHMghyUBb`#YJ=+RY1K1@&L%xG zjyb<M{!&|acjM!p7dJl|mTvfVxk|0<{D!zsvrKLNCHrWY99VYzYSqrD^sXlrNyar= zbz0Nx3pdnUI_v+XH)#3k1&1bn;<Qe9U^QRnwXj@o&vyT1sdb;Ev)au*ROHInp9oI= z=UTZ#Y1gd#CaEDziDDdwF4SxkxmL|(#?x99xR7OCAz!ThT|?;&`I9Fe<c)8?@$3|% zq5Ac!mpmO6>`v5#pX3)<Qk?90G}1XtE_&(g;+ZR#%s$s*dA%cLp2+LoTZcA^JoH!D zy8Xi;>Af#%lEbF&lPdf3&iLJok0%;W8ZW6AW<Hg*y7a!&_HvEM+{^Yn@wHL0oYKkD z>N-nV)06AxwH?3aAM53+{`5{);M|uO<>iK^U-r$gP866`xmdXCvhzlHAAyDI{rUS} z1f>?edbsi9)9za=onL><?%KDiynp-m^71!cpSLZIv%R<d-}g7=#>{F)ldnyDF5)z) zI&@liRY(0i=UJ%|6)v2`g+}{luT)Ad3AE>*W!j}K8oJ<VPE}ugc9?g!`qrg)RK)V) zF58@4ncORKU+&-CKX+~B|75>DLx9icg-k)=k=)2*Z*LfU>bbgJI$my(w(jy9$~;RW zD%DPIUi`V(!{gcR)9#vO9EW5N+fIE^Ca8M;$g#G1CC8i3>(6of1lri&pTOzw_xdas z|8GuF`#Wa7Eh&cz&Qx^yJ1r5Nui4>va@k(i?H%t!)Vh~4t9)*Mclm(E)$ZxnJI^TJ zn^qQ^Y?^4qwcSO3`J2_tPlP?0+}U=id*>X>|A)-YFMN8Ca9gs!>1ndp*L^RSrtReP z+ib0L?os$uOK$hG@)vmOQzj|ANW0>h^j34@rkgWoU0rF)si__QmBFWbE_<Y#<M)|- z7Y*jy<?lBP=a4o#c-P$JM)2_-&cjkdYosf-l$7(Gl}VX)|F>~^iu8;bUoLNpuef)z zclI6!-;XO_zi(M^u-@}i`J|fKzu|V828#6+zqeUD+4pZ>?B=<<^K$m&FJ`ZQepcb% zZ<|+rzFn;Ed-p_JP5WBh@pk?l<COAOvD=pZ**T%7a9*Z;RMg%W?dz+juG)THZ@bLd zKhF0REIDPBOLyLUp?k9Sgm#6=gv;mN7;ZD@5^3LK^+LbG;#ZFhhvVf)?JM<(Q<D!> z$L4!Zins5v-s$=}&0+P@Q<~dPZaX?_X=#1LWbTWW*Vg!MPIFmv>G|czZ*!C`r0Ip^ z=WNS8lq?)6@>5-DwY@`@j<{sj)^lMmJ9%E|)cj&KDR7^*_upitKL_>73^rN)SDMv) zV|C;SDQjho{TF+0+AL*V)RFA_>89AvHDNkNza8J*-c+j{GVAE1JB#*~8$U0uRo`^k z``g#z#QMYP!qE!5tBYA~9_7+s((rCU>Y|XVJUd$=E+nN|O+Ka*ILAn&df7$GQx*TB z?^TvgyRPXG;~n$fcHQ28ax+(Neyr|RR8`a5St!$*ecf;GsxYZn|GrI`7oRfu!u&qd zS+P?sxGknla`TcpsM?$Pbm9HO-D|A_iWt_GsjN_4ag=RqeePa|mPya*CkaNh+w6`z z6m=*nCt~+x?ux{1N46X(@p{v5e{7nGt;)RMrgSeip3@KK?da~*c~UrMd!)Qast;rD z<arXRS3GXFyxjd(oNbrf!eei*mruUoZ57h}bW%m_%cLd05B(Kn<9U7UZfA4e;a8ty zCOug4ooA<|fkY;APV(9M#Ptrc`g2=j=X!e_>@a$7Wu%{Ker6J%qNdsAh9^09Z5;Dw zweu<lt_ivFXxf)Ft0&7nuCNCdK0D2&rWtc^(d<2)o3!=QSf4w6;@<qMLuMcA&MKyh zhW&ZfFW$X8JzZwXvX9g5Te)7~w{4FrNk6b|k@)rl;YF1?P4OmX32WXLeXo~nI$*u2 zDp=;fAh#ovYN<oxoi^i?2r0J5!A`DDszO?q+b=&_bvd+o>ZQa_8fVsDG0jOiTH3o< z>hk&(e1d%&cdYT1oEmf0@a6OmtAg9z$_@R5Uzd9Nn{&EyH)vS}&P+TI>v5j-;9^0; z-AlTstXqBe?!^RwWnS{r*}^97m~}q6-m7=73Qt6mh>F>=JtsZSZ(5$QTIWSQXB&@= zTT~r;+E2+DR=N+0A=P|}(qHxeN;g^--q9<Je0-tDDc*B04~KA$*@TJhTpCgj((gUr z>O8@>?aaORO*ZZGJT3^9b?_e6K9cUQJjEzqaP|p>wEL1zZU$@EWG(ZE@9JYNld507 z=?T-1j~!|^xDEzRuNHTakI`7T|I6I-D>{yed=dP;X;SKs#eAF99;)&7&)MkvDQ|{T zBL5zCiTy98`1A;dckX=HbMeHY&2g`PZJ4tB#LK3q)w{Q|$;!Pt`&U-k@_bF4(S5}g z+cvu%a*ZiIvSq^T_RgJ=@AzC&&8)=J9HR~_yIaq`)WUo2w52H}ZD&4iaNZ%5y5Fd$ zApYEgGP!q-Qk>Vfomuc$Q{_~FkF3Gx2T}8H%)XUll$~NZi{*?|=E{Emwbq)kDsuM{ zbvl^~^t+Qx_syRE^wZO)Jo~g;y>@QfP@eyztS|q4kjTEv8t?b~6=dgAc>nKL$?c%o z{|+2A-SjkVLH$QXkrPLD>=ntl{KQUEENgk8>H1#xV>7c|ti`x?WU$t)VDgjM<bQJ0 z>*c$(XL$Z>SQq_0{^Hfki*Nla`u*dFYwq@2|Jth=1T!DMl{0_2`Qw6#^UM@(`Mdtw zD)d-J$lc?w`{UQ!^<U2@H}06=w??F(TI0bUz0;e!IVP_v3d#_1tv8CjufIXH+Uwht zH#0As65F~;R3_tvjOh7Onu~+=79H}hiCTL#Hq2+0Yw60!JB?SeZ_aEybYSPc#+?Ou z^X@O!GM_t9I3{{u_scUi9_(gJQp<YJ2dnk%^>g8r-fr|^!}=d$H+ST&n(l9IzP;T1 zJ=<m<!HAv@R~jvS3SK^WGtX^Z{p4ml`If*EfpzB_FBI*3KiN!5p3V3Ai(-9F%|lw( zU%l1y)I6jW{@r+biAdtq)8aFyMa+8<@+pF+)-Q8`cJ3FeM_<G1CWl>7om(ic#J8|i z?sP@mlWT|WRp@K-&FEJXVK;t$_sF-Dcd1{uL<;jUF3jyUUiA8Hzr^Ye5kb44PkZX0 zFS6ceE~zPTSV-S(hSib{N|lZ#hhh_EnU}oMaDJ1)oc2np%_+|P#+zrm!&3BPA~F|; z=*5MzMrpEgE2mz0%qzR;{(kZLKLXP?7HKR_G5#cD@U)CM@%Db++Y5_=g8i?}vr`G& z5U;V}q<r#SwcvmUuAG_Qq@8YSGCke?_mD$){a*8Q%eSvj-;X)BZ_n)}Pf6=tj_1!+ z@px#TIZ(B^=w{FAL^m02pBGm&`oj6SW?yofBqJ3SYr%8s$EKoV9ztC{#p~ZqX74Bt zS|5_EJ+VL0G*IzOamWuPuFhwvU#yBB`*nSFTf5VPz1{xiW}l_Gxxq%e%DumooG3{7 z_*mQg+oO6{10~}l=^opzcSoOTgtmk_IL`-s>HIk(eX`ewyLk>Vzw(!D2wzjWw))kB z>n|7IX8-c_+rx+7-m$&-`(t)jl*iuRw{u_r<9k-Es?oar$XfaChBy1ah@NA<6?W(1 zMz=2gs(SN!^YiKd4w|a1XUaUA68a?frc9GW?mc_m*!okSvKCha1u}2hQMRGna9XYR zlPeP?BQI1)mYKf(n%eg5^atg4kOm8zl#o~9{D5yeKRb1t-1j~2A6F$G_YA)_*>883 z{C(eMGTrf5N`_qgipuWBV+#Hr^Xys_HWt*o9OB&e`>|q)&_4wet))qCUwP&5E{tqr z6?ytQR3k>LeidtdzWI%}8)gf2O6EUiiH}>d_0Wf@&o6wEDVPztOKZ38Ia$uai)H00 zjMbiLlg?~$O)EOFT6w2u(c~w~atnmhRW6-v?kajNBdZjAcBw)6F^0FsCeMN&+?#Nh z@6)W?eW{YO{bo$asd$l7;rK@+;uBYnhvcIvk<5X!V?Hu9)l1di3_GrHSf`2GSSlb` zZTg?z54rBh9DOj$=zHh)s~YRt?^@WdTot}NQ{nLZHRtwsJo_;9eZV=@UC(l=CTlzY zu8;^kSNW^x+t(k}MKTuMd4?Pe@6R0nIH%f{dxnOwLF=2hJ_au|Cx1TvXzpSq`&Xse zJm(HC-xv8sQt(^4h?5HYl8$=jOH<<{p1$+Tthe}5v|9OpQ~TndT%Ls-Pd}NgQJ);C ze*eX;n5>v^al@r&%x`U<oHsLH<ed4fx4V)P?|hjgWEy4eKf$s^ivPv;Gw&s@><O2@ zaQCnBu3h<Cue9fXFZcaY(J%EPzgK^|Z%OTMSJ(31^~Ju5PSuaP*6+PPnLkawwSMWA zDMx=RbjJrDTqC}kNp3;D+1!jvYp$(o)s6gPG*?g3Mu&H%<87UnFW-vaEuVK$_2lmD zPkd`NvNx`Md35`N{>Li2M3=6O4K0n;Td~UHt(Z~X_bn^6w!M52t0TDkf*<F}zqg-O z9TeQ6ux$F5u5FSMGrOOz75&#G{V-GJn+lhnSiLqoTXo~(-TM_X6t7%;Yg2i3rE~eY zL(y^aFW%&owUthey|(SAhLuWLi-x4((zBbB7wmg>^V04Uk^)ao8?D~%yj%63Y==e5 zL7%2&+zjGv_fGDvJ$n9PY%=fBEqjY+2CXccG==ZhwQ0UD=l!j_c;L^3=SDAWrZX<{ z)mKzsZX~$eu>O^Op1j;bjy;vPgVxKvkN$tUJJa%raxTB;i`cHkI}he84CN?F5MvBK zYs6!-$mSm7(_1I!t@8Ah+O0Nqd6xHv-Cu*Z9%0n=zxwTQi0`~*YS}R-f=xZ+JmU;c zRNrV{7Wiy>c6CVh($~*a*_TPov9$f}8_^W&b2UREEdKfiMQxM%B|To7dp;cv%(yc@ zh4~~~`$@LRft{1sRrqDp_$!JfRhd25B2F>z$oh59h)tUO&is!0bhCr@KgEMjOHJun zc0=g|Pw73kBd-ps-YxN{U$<^|cCR(t$>dqz?an73-Vo;@zEgNp@>yluOtDv`AEO%D zR!F2X&(%B^y`!*6pWk4!Q9X0$m8Iuir{wJOb@~^1f+@<R$!=}SJqywD*-lB}D|ZBW z)Noi|{(HCltiIv;(!zwY$l%}1f(qT{$9$b;%~@N|&+?}KPRz0s@4jp0xpf{pd2q$d z(&gqV8$KKfaZssV;9EV*>-3)oQ{OEsmi0Sz_4KEe1s6CCv)6DGes}K)b@7^3zqo~K zg;2Br&z6XF+AXv9ZCHDgd+X^(Cs$U?EnR#ye{X=ENz%(T+CRJ)<lH+piC^fLwA0GE zF6oXVbWrZtMVJ1?H&{;GUlDT3+F(V}jdtm~nf9BnzMkfJyYH%8@TQWdqFZmRP*b}8 zIPRy9{kyXBn{HoN`upeQV#9d*dD%DW&+0#qKD~6gy33LK^EmizIokU-_{L5zN!7X< zI(KiJl9X!RiGbsI<px)`ngv_Eo5;oRY=Pp$v+oYM-8vcc{Pt2gk)`~z->b{~Uu4}} z_RGM2=KpGq6kCOxwzqfMi+1#Ou*q$iaL@CIQr?H8vlr)Ybe>>*LDQ&Yvciiw2Wv#{ zIjhvq*uA(R!)=-9ndB66<93<EQ^y5AYVOY~y!C|bRYJPY&(B}vY~JzmelT{FmH7JF z*CMgLb0=ePrOE7NO;^00I)#3aI9%q;$qfolorjJNPx*cnc)tmYRCEk>R7q*#<=)iN z<-KY}=0cX2%k)iluP`nX2oW`yxhzp&){IV<Cok$R9DO3j`}N;}!c;lFTZV;>r;6W+ zWJ#WXqc~an`8tEMi;pw@?p`6Zu`{W;E&tK}V^<jGe!RRT?n1-g{=aur`7S2>Z?k$D zbue7Dvcy^@a$B?Sw%JG6cptqp3)Zf=KjW2=F8j70k?$wv_5EG4x!N%-<HF5Lk6s<$ zdp$f;`qj+Im#gYGADY~-WL{*8TYmi!M`d}#x#=03KDYV({pUU7)BP!mWm_EOjF?0| zStTv=*_W-GtA9~rYWGG{_s-<M6W&$tjXA{O9z1Wy#J~Sm{$Q3>oShM{kJFcbr^pP6 z75nxyXiieh7QfISanLmR4y&WdUsL~>-8KG#)t!c%-SYnnWrBUC)c0rdz2xK2oV{Us zf&G(+<Vz0MV_c1Xo;r5&LXgo?U!zKm$H@xITY}GTYQM37>#(-UyZsmU^vAH)NgA?d zTX~tyPJQt_KKWO^+~0XYJPzjz&#rs1?SFY~fp$aQj_beg{#JWFDSpP*qSp#uCnjuK zedb@H{xsJ88<yX`V#@sd-<0E;^?w#w|G2a}`BNE}WZxWfb4hL!tHLcce1`Ee_I5uJ zIH@St&XCSfuy*6*?>k!;Ur842a#w!rJ2O>9Z9?X}eZ1DwCVqXkwX)o;t}&9uvHXk9 z@4D#+MYN6=8L09~oYhsCZI-g!l&$)p<+h?7Q~9552v40{7_Zr^koM@>qm%~wJKXhi zlmk8pP2yA$-r>XWcE#Og=VE4@YcxN-d6xL5ll))O@BZ1W-BMZTnZV)9p30Wp-msXh z$W~|m---p6X<bK|O%y683T|Qd@LgB%n0ZUAIirDFOWxbJ_XXYNvo&3xS@Hh*w|8xO zlP2c5mfzcNy3c0iilzU)zTCFd?4s%JuOH37I@a?>9kg4p|GwS7ws-FWgZJjy)Fz7m zD3?3;pz*ZzelD%H`}$S;jTgSH^M0{5A|TLaGpFX_FS}lus4h}S5na+d#Xjg*)x$-m zQ^ZQQtm5*vxYK&Acuvveiq{_PyuueNXS0{>*q4`OJEx)0EUG`z^!*vBCRMTSr&&L% z*q+{VEnHzy9~-}K%@wNxsiJ@YnZnyKtXiKBoj*S@Pw8KJ#VX(SosVRjKQ!9k)m!vr z=8YQ;XI?GXao*-5UtyfW>1Tgx_*r^;gx*$&=1s}CTy^Gk*2+l1^;68<<|-fK-W}4u z=}7L?kCm)FLYz)Yi5)Y!8cSxB2gjSO>+Za8yDo9T>S~Dvmu>1@o{4%?&XR4Fus-=T zrQ?XFoYDvH8^`kELbbySMW-FxC}(l<(en9vH3xs4J>dUy9&h_X@9R}TE2o@dT5H<< zZ?f7g*BuSr8m}7ICnvs+f2B|*{UH8RP~7aNZo#4w7j3-OXwFnD%lSLCvQ0AQ_K(~$ ziJ1XG8dVSUCak%%#$<gOZ@t&CRo7c5&v-E-rr~kN&)c@A)mDU_6#v9J@9p;{%_y!n zN2MRdiKIDSWB4}Z!8ul+{h5D0zuFbEUVK~9QWeYXJ{J5cY(E7oJ#9_qB^n*LdG=IP zBG-?T(Q4Hl<;V4(uP~?=<$HNPQ1$ow(5YAT4jf55pnQVutCn<vcZLy{isi#s^=eXv zUP1Fa-cOU27ZO%awYwK=Wz0EKu+d_}v2z)3p6onUkoli8_0X~XDs`ti-j_`~&wl4$ zrdONyspT_2`E+Yq$rOp6U*=%&KKRJyMJlzdvwL{TrlueNbx3c;ga@X=qC5N)o5Rda zXD7t*WcIboemnQZ?O#CGlm%Ru{9W7ESAMM*3E23MKPh3hRjT}lS3z?ZDHgJYiD%wu zskUaB7|yO1SMo5RkmDXtJtt47?1XFFk7aiS^EXwgSzV|uxN3Cw>W8ZE|63L2?_K<T z@0QZ~r6;*Q6fHgAzfMK^ee<_#YTN2wB<m}05%~DA{I9znbLHZ?tjm?p76;#6YIUPn zM%9`(ynd2-rQyNNCu_Igo60ZvMt&2=A<o&a84j1eIUU}5Syy$-i4%dFG9q(4|4x_K z!+hk^kBe)5TJ#D(Jl8dC{->R*ITy$6P}Q^7xb;WEHDlNEZviKSPaV=pZ)UkJxmP&I z?c*Bjc^bt>IIlm__-hlNSMyH!>@EgB&N%@`6q#!Nt|>VxTA$2wHPA;-Ba~_O?4Bt+ zj|0rlX=!e87ZD17yMCqm<4Av-U-^L(O0^E0GL>~nT^QK@db`@{S3+MrxAV@>3{~ej zG?_2J^OKtAz0}A1zs`H)JMp{v2emnIy3JELH~+eEk+-UB*~5v(+d9SPd~tkGWn+2e zGH=m4+2o!L#tC-k4UJdV-<f^$d4)++(469wsLBlYA4#vzu@#?RDj?|T?$8m$)y^!! zry#P#XF|ozt#>uNH<l@WdKluh{Ac<i%V}@t7wGX!`B&6ubRkULBPHz4;&ZH$`TEAa zmtIZH^8Itc(s*HaeA;!*UyJ@V$6WgStzh3|g}p5$#sALzb(;Bln!!=Ya{c-*On-B> z)tdfXl5(TbS0UB$RqDYhm(^VxTHHNY_RQWBxA3>;#u`h{SCjt!a}oaifUD`U_@e)( zefalW_Ijwbjxnxq&6;LSOKa(<yFb;=9nwkK_}a|ViszV4$^!m6qtiVPpIEJ8uijwO zB{I)=X0&PQxv4Hq`gdfXUOfC@?qLJT>-GNS**&dGKOR-NRls4w^D9X$+vuc2<t8t; zd7I^>j*81I)t#PkHfw3o-44%1M>o0^@-E}HzcSURtKp=&USOEXG4VdBPZwgc+V*xV z@OrDi_5Zi6`_FJs`fxw5WyggTvEu5?CMhiuIa|%tAKU!ua%_Du<E-GOIgGz=hdqxs zkP5G?U-4mI>n=~(oGg|0IJRA84zb<kdPZO7v;6$mCQ=jhzP-}vRqafJsvTAFlfo4~ z1sR?CULq|0(D2}%SF`$AlFbhsSif>%?@Zs>$??}$KfN`zz+&Pu1!XhwuU-w)BL9j% zc6wy;`x*b#qYF>`s*L%QleP2cqm5}ctNkx^wP!X<w1m}f%JSx$=(RbN>B^KVQ?J~O zesyf4>+jX)?r(mTV36{3iua4&ZAo7q?2$ZDKi~cCM$eTG_D(GKKEA1rZ{y$32M=yL z{O-zb9*-Iwku6D<=eNk~u8mta_4U=Re!af09e>Q<-|w2U{dAJ2ZRu9C&Fsh0cKgry zb}RlP$DNsP_U&KRAh@@(e((F*Cp=%DweQu6G%=6(C40aB&X(3^F-P8-6&~BRbBlT0 z)<BKe-9Iw~`4zY2-aM{<!))dYi!$d9?)wMtdvWC+-`IIV+ot8!v`&%q2H6+I@60Ua zBeyy4+Wc)+zy4HiJ^olZrtpsqB7LvZHj8(+9xB^(GkAA?tJmfoa}!U$+_0+t5XY?P zt-s&7Rz)d0UE<z6fusEbZ`MZFEI#3_53g*{eQ<lPCDZ*&ns?YacBo5F`oQk~W4^<r z;wcZ+qTHMwFen-*>^S{zlQiR04hsjC4;uq2FMrA|QsLkeVBxDQm0)-`Z(q&CFaD-~ z^*esP39RC^;+9mMxcp*zaj^9xwfsprI`uNO$rg9_S~&IIUVn0ug)FD)zpxz_SFDQC znci~#Y^=;xapn^(wI;{-9B(|?dF0y+_C*3qE?clD{X55<`2TE*fXTD(=Ty`thwa_C z`cC^<M`wojD;Voq&OFiEw%fz-rtnW)j=E2ICl@_9;rL$h)0t~taivmzu~T!V>YbE4 z>X>Y|s9yZ`-;Wb!oa;(HnzXhkNNfe~;W^XQ*X=p+Q;ESR;z9H_jsD)hLM(HY&Kk|{ zT*<6jDjb;YF`@0Hm9TBr^{Kb6K2^HLSAQt-_U<F{O1+D04Z8l_%eZ^@-d!6H!GD3L zUp(0ovr|mt{zSq5_e}0B(_!}4YOpA9W#i;O9>vi;IcjfE{e!2@n>TROE1B*#n6)=? z&ja(Wgax+SMb19&oK-J5;RTC$zhKO+?!z3`mK*w#6}`kNreEZJR&3Zb;lYe5UfZ~p z)BW`;|Nh?-5Pjh8!`rIm+=uV>E4;UjSg`JBjirWtYPk(_eerH_p6WD>PxGG}vKl4c z`dGqI>S5k5xAuYNgu41^kC{?-uK3`f!q;w@VzFtD$b^|c)z@v8Non`-7K!8LWItXI zD=qMLdHvJyKiPaAUvj*eu6QtwZ|0Ku>G}q01t+Z&A5HmiT2HK}N=#--C7;)M-;Gtp zw~s5H_~!9`woF^!)1zuXo;ZFB-Dm%1v4Txw?uU4b+FdI?PcxG^=indHTR-)w3eV(e zpCjaK1<wDeIC}V^+GbT}M(_WNdTyRih~LtncVqe5*~{0zy8HO|+%SEK(3LBWo^*YA z@|?q=+wzGD6Zc8{U&L0Mx#Z%^114OzJeAY9nve2?aZ2Rf;M_eS$Ut^QLX=UEd94z6 zQS#CgLf$D)C$9SZ%SeB*q>IGo-8Rop)t4{(p;&m#nu+h-NB`c#<(2zc%YFMM9y~YS z%8PHGy6aMrsVhY~@|Nuo>HO`hdid3ADYH*24(_h0c=>nNY=g)1n|>a8_1`;DwKY_$ zb?W?gN=K(EJbEQ<FL>bKOxvURci3BZ{r7C*pPZ2QcK?)^pd#1emJ^e>wF;M95z+~1 z+Z~%$A9^s7fAgk0&TAY}Gz(f}&IOlj?$KnDH}W`hWo5O@Ecfkd)jR(6JY<<rdw%=F z7fok;HGeL7;_a*0@KcBN{yc4UwR;O9!!IoC>@=KE-&3+Hcjkn^>GMyWE}OCU+wq9) z*H7-A(tfwS@W$OB`T0@h)eY>CXSY?`EV)pVE_7-8C!Okg$6l^kroXP4yqX0XxjwXM z$_I6sU-y=3yg0pS%9Ew{;^*f@X9?G4$Ncqw>=vthHNEYDUUU3(?(p7YWdRDGr%!fk z%$%9MBuGc4X3Mk5Z}bIz$J^hHwY_)mzU_k7*Zzi=eEqUw+x|Otc6EWb*KYg&P|m?c z%6<27-(Nk8J$D{h_PIWAiSrD-9%GBu|1)a-eoK|@&R`R~^n12q-R6jOv8M%|^|9WW zbn3Lh&aAIVJ8y|}gg0+mFMjvJn(H<qr`AfS#;=~rwd(e7-yYK}FT?ONQxoTj|K^-p zwBk^mTp~wO6>Ij(MX!?7&ZHG(Y_on7!ab4otW)cw%U9diyi`!0@ctX0X}#GDclE8S zEh^%|C$=fp)kduebIJN37}~0HHL$8<Pn7J>&fo0ICR}nn!LPAoLjU9VDN$Zonk$zs zndVh>^fH%c%-YRiGn8bz+-GrLika~2kc>~tiHNoyVfE`ylReyI_-!9)sD8V`=H0n> z`<fbs_L@gR9ewRyh3l3txlz*jC2L9jxhYn`uY6V-FFkk1xaenB$<HY5qg9LV2&AtS zuk+S<8g6r-Iev3-nUhqe=G8SJn}g0)>8oFTb8pio5W8#RzGh21U*83eQ8t$zMP_|m zp?>t)QfuL05cj5Yx4TJEEQbxJ`YQ=VAHj!jrq$J_MEJdYbLQ{C?RF3Cf6nV|uXp*$ z{(Eahn2w8Xjavwpj`=g+2G(qz%h6j}<9G1>%V>^EKD#kzM&h)6QX9H+_;^2Nu&mv4 zE|8(nXT_&edViE>yZ+BF+UdV0v3f!9@mIzN&QB@gR$Uy%vAiVXdxoB<$eK%qcY^ay zae7bW_@22}@6k&EVQ#04M-KU0z5G_|h_~0ft!~zvG_g$oaQ^!yxzH6ejDEjxlKWGe z!JT+`&vYN<$Lm(Pg!p@XT|LX8VEK`g!A`rp47=@=S37s#vv|KU<LF{L6`!QcuH2|^ z0h(env?czW*t1XQ_upgNjxAQ&eOgV~HQ2~}rp&27(-P+ktl?F-6WDQPTT8F?+UePE zma?`V|5TsRzWrF_5gDf~&KCPTZtti(cE^Zk-~Gf7@s^Fh-u8Xv3f%Jai)VRKo5dF9 z-b#)sLN`~}G<zsW7@kqPxWQSWVQwMsG@ozROHMjU-WN?_HQJ}m^8Cb)bs85Yf4uv5 z`NW?0Tn;Ld_j|4P%|5p7(;>!(9Hv)KFP}a8_U_rX4J|xB-`C3ty*ynLtA8-a;@Z?) zq2SdMT$9#!7|jsfIIYCv==s%3UdvmPJViO$Hm_YA+~)P==6u0-T!P<zH@cer;PEx- zk1kZGa=2%F#>H2jUFfrAQtnEX$AYgS&19^z`|@V4@V0tvS7E;JsQmhed7kIBrZNcL z*c`P-;r`vC*{4071EiYjFA3bSzwIQ|bV=ZjA-miRMGf79{qJ<&^nRbz)a;mc;WW=L z)ejRSzhpk_7D>DCyYtp*&Cqq%yRIwEwQT)-uF}u!grY#I<rb4lvs9ITp;d1#CEs^H zsBByIa$~oX&dZJ7{jtkV>E0{2Venp+)%}E)xt(liKKm{6sDf1s&$l<6ompQfJgH4- zol$DY?61L>Tn~58{Pt{RvL#C%SBJ<wfj=MC+`FLEzqD|6-Q#IDH@;>q?ata+pcNEw zJ^QHknx0(|7wxQ@l~+eS$&7gAf4C+2_~AG6bo(QND$Xda^NL*myep$*;`7**lcYcG z@!s=UZ{~v^7iHV_evAu}nd1FC(5nBpcKz%npJ#}bO*yx?MDFnFDV9~gUG-mX_L%>) zpk`Xy%Br9}vo^|REzOF|WfNa6GxNjSI}<<ZeN<n5ZDQmO`$r#~AKYCt>%7$CLw8tT z-utv|i-D1hP|l^z#_!pWzWURhQSjlc-jla=d=~{T9+-CJhE<Nw+&{+Kl)KlnsOryo z|2yg?cTfGHr5dJYs*m>SFzUH1D`xp-nHjR}&K>3xvc4M<jlyf3BSiF9FF!l0U;{^P z_M8nLzJZ1<qcrV;J~fD}Ut}hE+o(-7u4jgjVyoy`Em!3`tjj8$m-iVR=`%Z#eZxTH zlhvU#^ZUK?;+eH`r<^+adX<AVYw`oD)GN%n^Ul`&kNZ>q(K+VWsf9h0=4!gcx=-~; zR#H<so@_3#?eFakvRdk<Uzex^DyVVgd^$eE+=*|&0^W{q#vhBXl|=L=?J>9z`d-!K z?)%63^~ILIKd~A9KIecje|36ocXBHy>*vQ6r5UvcQ$22ZOmcQ!&28Imv~P{is_1%m znbVQCe!N%`xAI!oBLQ_St@=JLPSJDqHG$mcR{Y-^#XesIw2DW$>4SRpwAWkK=6bn( z&ug8>w#=_v@@`9H^!<YQF}GO$KZ$QC-t_Q9(!G6;T~qhmICiOLmS)ns&zqDhf^)aN zi+=Hq&v2tum$%{j&pcbN?6<qS?aH%DC9{8+*DL6qwV3aybYa&uTOr<ObMM+MSiha0 ze|x#P!~5g+L#{Zzx_dt_`g?i&)!oNgo_^leS7|3AeY1Y2&Yb)$Yde-C_lm@S`Iq-E zZ{GPo&DlP2te0k;Ty^4h!W{v#o;~#^woiF_)$QYwMQj-#jo9yYZ+sKYq$%j0Q1?>p z(e7EUeXUk3^$+_TAGqIntK>DWvzPbD+$lld5c69<MYw19v8jB!djmYb_3$`oeoLUL zThZhFjTIrQc21cxf#db83;#HpCzsw%<=m%m*-0%i=fIW6GlZVRrbldfqxaP7^UX`U zR~Wy$EOU9PRNL+n_Lm}(Vw+8iIE<gT&6J$yTVEI&x|;Q(Xa9-SezL1lV!Y4zH=Hvp zPIkzVHCiclJLb@u-%7_f95|!g$CB<KaCObaV>fNHJm+23o812HUk7uaa?9I)6&^m% z7q9xXBxbM9e6I`_$HTYf6BlfZO!s^!kzo1f?|<QlgL_|`V|eqh_2Z$hH+KhVU0bIX z%IaiwWL9cKeM9)Z*49I*jW_jY3oFP>?R`=Wo`qA{C-MJ@<)%HK+2&>Ki*Y-$OIh*Q zt#^Go7v@cxsbZWvapr<D=c36^)K2=|exP>FW65lGQP$@NzbMSiTK8(TF<ZubN1FxR zR{1CL*q0{c9^b^Hbu(boLpRVQT$BRxBwYQ+bN2sDHm&V*Y>Q+OPcvDt%t!C%_rsz) zEV~YxroIz?zdA66e|KS3Q0V$cMHhrs56{0dDRSQ@*;6}RuFvt!pX!+*&;K}}eBQn} zwYLA}xfrKi)MaCQFn4)WyrE-S0+(x!WNt(58p|W+o=liM>)blA%DCClS(S2rh0P0> zwfq%qtrzI5@2vm$f!~&|=!6vGqDp`EqqApBnq8uN$~Q_OMK#)En+3zR55KE?R<eOx zpG%S^$P{qMJSf{W@yGNZ@r~jWPx~wP<<vV`ot>S0_`yd0L@nm$nVbD?-ZZQ9pJwiH zcQfl<<{0(4MV<erR#et6ZB$wB@Wgj(rsJ9Chd1f$sTb}qS{w2_tSR7`+lw<1v!quV znM<hqMM}Rhzq`%ngl8%Dt?-)?n_tIwlp6+|w3Oa!&+m~H+8D4uv+|ke=79Cx;qxSK z9kSS5yX?S*0?_nni{rGurRQE-<?QnnO5GH|u)nIruZm;u#>(x!iW{{*`*C&hC#LWE zer(-O)n{Av%IZH&GnKIvVBA!ZY@xC26X$+*rf=-V2Xqe~P(HQ$(@x*;AijC37M2pG zoAc7=vWU%_!PUXXmmAffsQbA&e3!I!>87k2OQ)bHQ@tNe3vOO0idE!(_`N6PwpPpf zSTTRUquRw?X8NyMixvuc&z$@~o3TPh@l>3Hve&a$Z+>(-cFNV?Pe_t6*X=Flw(S#Q zcKGMEH0WOAL5ah5cV77Yp1D@;(iW6yoJHFo#r^atOxc}&Ggo6~&A%@(XRh}@U#0%@ zX-)RdvJWjCKW+;PHgfbWce}A{-RZM6Yo1mYg{H5c-f^r)+UUy0+p<2TYtK$uwK|W% zfStE9r%b%w?1A63T}3t(yEJQW)Yw0)*kFG9<>5cOf+H_EUt^whcXR5Ml@2*A_7xYL zs?-H%?l{<O>Rx}0Z;NHC-?m+z0$(<Mm7dS$8z3UbWw3U^ch%i9EuU}%-;-`DpHW^N z;FE{GoVwBMbKGvuZ_{T;Z)lY`T)Op2{hAYgPc|gp^X~e1DDMbEQ}gXttD-cnuj^`Z zpUo%E>Ac4HVM3{S?)Eb)>hIc2ywYza`|+FlywH|wn^Zk|cG)gnE<GXTfa%#HX_aeF zRmCgpokUz7o!D?=^=q{)^UJF@9Q1p0faj)=ZgGO6LDQ#Hg|ljBKE2pC`(o;=A|I9h z##-_E$G=-A9;rGxTXwxsV!MrO`-!A;`Ek;>rEhEsz7V!v>-y3Jt*I^F{!NTDpI^GF zoM#ckLCwM`4A-T%gcWbBi&_(Uid((Q>oe=Lm{n8O%~HDhOh!?{wrkHZACJS!GA#{y z&c0QB#XD)?W5M_Tew2SVTa^-cT}kBNUgy=Tzu)_j{3o$qyQ4eknU-O+<ee{kY3CIj z1*dFaJLHzQTzl)49YPta&b2<0wBxWoBd}@tg@Y$LCwj&Obl<GsBmRP`INYM_gd#^e ztA@XHP`?5n+kUG#`n9|GN?t{LleUUxO!fc8y^lNj@`f$*r~8O++^Rh@^WfBzg^{jj z(o@Zs&n{e7eN}N;M*Wq&2Ygt*p0(s^Ql8Z;6mvJt?`O-r_hyxR$0vGQ+|RzP&r`A$ zG!otK!OpQ~_MLg=;j5-{O+S?Q;PD^P&c@c?%6tZQ3>)^au59N!UKd=`{cW{*yu}WI z89P3E@(0|RKi5NS?{c5=dnf+QzI$fP?V9t)oEN41_vZ2Xch>G_zS-&eeXga<I!W7K z6o*bRIA?p$ENEJ!bZuJ34(s<@t6Mp4ADK5N=6;EjV{h&ht%|u`bMCx)+i!8_)C{gy zODf;<q;{2VesO-+&-4tnJI~)X|E}e*OP9#bjSAo6`-0=@QoXeoZiZag9iTOL?oRtH z*2#BYv~4ig-@jkH-lJ1Bk)7kl7QcEwCdF8Xh#VHfTCsWVZ@(X!KiBQ;cjlA-szars z=lm9GF03dt*&UW2X6drPZQ5IbCZ28XQf2~Ak}R7IpUyAk+{~1df9z+QPuTh^`uf|a z<S2*a?-04&zWI&fnbYoO1xL=bmgwG--Bc%YWtLE-=3=So*H5o}dQz@%#ni-apVY(c z>p8vGc8e|)eHf8(Y`?Eqs^_t;NsTc{+OLGt&VN`_GEahi+F57ToymVP<nBtx&U4%K z>crYhD?<FG4^93qzQkurjK-S7M_x?1b8^xC2M;r@dQMH4&GbB2H>r%%I1Ros{)HLq zo7*WV8teD?)^0GiG&$7goFlv|{BLlpcm4mL>i?hE{||{?`&;bDzMx~qD~!t~m|I<W zI@eWa^QReBvPu&pcXe6MRybo&|I&JX;K9ejY1VZd4lnF89?B=iM4nj0x^IQS>?*-S zml|eVu5K>rGBBDEe@?M|cPvw%`tDn)eVX=*HoTdi&c3knzi^Smvy{&%A;*rr4c#XG zLThSP{hl%>wq4(jtp5F@a<@&Jr=(SiO$^gPRwn<32}zEN64y^{n<84>(8nAs^{Gak zi{s4eR>ntnz7{w;H7>WFxxjMj%#BJ`TDKBkR$UBS=@$O(&8)9c)#v27yM9%5S-V$G z(%(>>(eZTJa#5+^qCzuU-z`ViYKvdjJTKPU*FF8#^2haj{U4TfuRCqT!jgXc%Et#s zn}k`HRHt)&V73o+*gjLH=`#mg!acptyVcbh8z1*aw`GO~Ei}^2UlM$b^<4PZhYJfA zFPir2?Y^%o%oII0u^TQ~a3*cq{3DTOAp){Zvrat=U^``eVNs^{q!{ZMA>~t&^Tox? zgv)2@ZOzr(d8Gc{-uhn?-+i_#IJj?)r$=(i`<{t=3+FG5n380exp4=(gNJ*y#l=R3 zUxHTBEbRu?A}#Xq4`vk}x!`ztQS!2_n<lj?e>-u_S3N)KcgYlmuLtcEk`t#qdnb3& zp_k{1N72#UOKdr&dPnETHwbJyT4(7J?bGS?dm`IRlM{TNVlI*?!k4w{3vQ_O8W`8- zZ+VyZKJUTt_T$H5H($(Bdiw6)xy_Gnh_dXj+@5++<OIvLyGyICR#XLC{JYiU_mZ3H zCsohdX}%IR{k>?(s({zlOM2G(Rt26qv}|vv_2&z3dwutxuZTOWoSq|mUga};pw^Sp zl=UZ8?g-PKzO~CiX130%qgGP>5?626*FE%b{>bq)Cws@CgZuXAteE<G#srzeLHfH= zGBjhp8vHBW!gx6RRn-cMeC11D)!%QKkT&zmFZ*xn_L}FacGpi8+*_Wi;#I-w6t>Wd zqeT0yulA+Te>?i8Ze*9ZT2b>>(Iooo?)P&xDoUJDPLMv<6S6hI`Qw?&zvpIt-cZoE zU&6Wme6Hg){xh|ihuJhv+Bu*6X5hB#=|$a3wefmawS~T#XZA`IuhZ8%_Ur!_LmS0y zyfII5>OZ=~O5FJEa^po@`mdwx&zD86+cWdK^RsBqBU0_!ffbV%P1!Nyv9&~n>e|MP zv(?`f`gbn)vvPO*)xEE7P8PWOxb6Y(AD($9{aB07dhM+b^v+6%W#Z2B?M%J!-nGp( z%%s-uD$m*&hd=(N=O^;-Stk;p%P;D~66NLIn|N{$r$>O5(sy?`zACFds-2HIdp;i7 za^m~_EgyU`&pF#%&h=GKVLq2V+waVC=U>trm#190bv19TTz`s*^rOdI2J-RIzk&>7 z#aJ_^ZM<%9zhU~*`Ug9D6&Yr1adhqRcz-#aC-^N_he+W@1wEmEH`Lrp6z(l`exeey zpku;c%Ycf!wcoDXY~(lCy`p5>8>`tj&VP}9S19gTK69G1KN~YQyYhu;yNuW9m<6^Q z_}UmB(sL`0S$@*^Vdd0$c8rIUjW>H)+}$L0d}_7pmkvX&MSJyRUmvNL+p#M*;F0KW zF<CKoy<>mYbFXXr@O_bSk)6erWO31b%Hm7C|GhtI`|-=Z*8A0bW+xgX-lzZHzC~u^ zJChEj`JoqbR({TPF_`SMWRB9Q?bq*?v#tJAW1OaaFOGLrhMx6VXU<~=5{h%mw(U04 znC?CIRIbgO!qB}w-NqtCHIri>%Gb|-u=ehYy!Tme^Nf49N?lp>;c=4WUAN8e*yrqs zlzwb>XZOjMZH>8M^WVDY1Z_5osrX!XLY!GO=gPAW-QM^2*Iam$x%rCV#8=b!V!V3S zav$9CYj$hPzCZkbjN@k<cgl~G<&fasJM%%KkxyFqqyp`G3wNKpoV&jG?=G+UuyZ-~ z7wWI5_9RC4q(5?F&a4sE`NXT_X4f;P{>o=}i_-s}8%oM88q*q1Ez_8-^yO5{jCq?> z9kQMI`@DJcR5o<}((hL6uvK;X86!EF<0wa$AdB*k%=AxuJKOla?he)Se5HKaduBY- z=Go`}H@JxJ7hm*F^m%4eSHg174LuW8mrm+dk^5W!{Px=|t3FJg8~^=n-wnO1yL+pT za=eyMydhsHaZo>&ZRwv`!aL@~ZaUhQW~b8iQ}^t}SpMt_OB;9pSa$A94Wm#Ghs!mw z4~qMbY~=WFP~Y|Fz}4dsr+=?#xgQy{^;7ZreR}hjWT|X@5x%Hrg3koe61Ry~N?uVa zW}H_%3tUfgKbT(6=jEl(v2AVa^qi8OxMw|WhrI4AD4Msv`e>ey#Kt|ZUmr*jskL|g zt!O7+lkzk})9vW2|B(WzhYV(?zxn^)vf|v*^y#x=R=>5J)~XkM=f<hU<sH2p?J+qQ z(*G5IwvnH0Br@Tq|F1^wM+;6n|K)U6JNmDE*_FR+&n+etsP5=Gw6Ol{zDmdEms;{x zH(ITAGh5wY_MrFdu1tS5jt_Y<J_TETd=Z@RB`WUJp8p#zvYpdo={)^W>ZtMT!0%~C zH|n4Ey1uaIb5Gv>jJBoK^X`|K_1CF>TYut0k@LlfVv7=;Q$;^(t?G`RH_=>XqOt6z zYyQtSfjjqoi~qCTUU8aa!K5IguKIYFfS(gQQwkTYO3vhOT@~aUdS}8$xoy60l0I{@ z2bJqx+uy10_IRz!gQ-C^ULQG+me;tQNRf!KbL-%6YO7GbtGY~_qy1h|T}PhWRN;%; zkM7!YUEuCMfrVjvS09^fJXf%AqPvmU^Y>?uS+WTGPkX-bz}vrjFSu<l6AhoaKkMDh zdaKD1H{>>5R8n71&vVm0FmtQ(M46TwON=F5e;KPj+m^gCZE4{2mDw+|zoly4eX^<N zNbi%12V3WyJvu}CtMa3HDkZ`#{<e1u*Gy-98X~YX;m#7?*f$ZDFOHtDxP92O*zfe= zv)``!&zE0Ue^S@7+emO{Dc80gQQDmDo;M#&>G*f5{>f}s%LN-vxTBMM7VkcB%306Q zA=i7+vYaJZzB!-1r<8_%(n(-EmeylpP;+oo$#LO>e3hDC+V@H=^nCX6a*56fhSL21 ze{X0mFuaz_zj5L@m;IU<8oj=PpT2cJaOGCLJ1cyL_{HUo87g}}U2T1DaM!H#ddwf8 zGtVB#o0Ra2Uzk?!Sk`G&E%c8kzV?Do8{dT>u|T<RExwr-`tLdO)z67E{GlVErrW-C zUE_3{KRvPMR8F6Edf%Gw=aXZc#2_wsJ^7%Y$b}M@9>JXc?&Du>&VP_}c;@LpzyFGh zyr_7p{?1GEhV;t|PaNG3pXv?BJF-$&=W?D)Sm(6ZE30_YuJJ5Ws?VQx(wprT$7{9! zb7v>yo!|H1#io**>$WdtcIPZ|tf*hNYx-2}myNCy_UraZZh0@*n)7MHKkXeq{(k>7 zzdp}RVpHIHQ7fiN(>>}dQ{J4}{c^ExYwM-J%>72~%_Z5J^(M`JdSUHDuV6{toGntZ zmux5P%+~(8|6;dH)#SQuIW8V6>;IXCd+lUmsy;ED-*j)m``}Y~6Jt6&tyaeAR@^tg z9JMf|byDiJ2Fb(mk&Y+1<h5(oeAsyCxcfFf5c`d>+pgnmMRS*>H|$wBG3?QrZA+fc z%d6&}FK4&tzEyw!c6sX+*MEN6`F(5g`J?lB6y7Jro#$aa|C8yI<9_}rkJmq7s;{s8 z+djA1+*(aL&UE$GcQ3Ckev`p=VYm6|uKj=fer~E24{n_q@;on_Rb!8RZ`IPUz1|(R zlfq|dzvg_Qd%lYA<kqf<JExXfEGxZX+W!2^)XD{G9zFQ(qgDKJ%6&eL9l^O%@^^o{ z5VPu^c4R@pfgNivXK){xn(kV7{HB<h!fr1wx%y9&8r9e)iRV^1th=tL67D!7`O$`% z)Bk;tlzp+{y}+*M{G0Exmae|FXYafq5%uGy7k7MnKFy4aF>-QbD$|R-U-=4cGm>+Z z9xnaoqWmW5%JDY4kIzEO0#Y+}MwrJ7_>?+ZebzqBC)n^|ZY+y~<L;8HX}dON?>y%J z_SM=_uj!^M>z(sI*;u{M&k(c9&sIAfRA$2+_v(_^#l^Zil=V4<*`K8g8cb@xcbxgz z#EtG(&j&?r7Own~A*|ptXG@yymEw|XedZe?e^`H<vHYpi<tB$ax$pV~PD~a28~iC- z=P=i5wncN!+&iLMko}T(Zt@{%fiKHj{^|3TN*+7$D4Kn(-GasS`qI7&9C_T-%yjNP z^}9P|*Ry%I0!;I!9^K&P6}6%;TOlCw-CeHS!WR;oCwgpcmNU<JbSsACmp->{)0_qF z7Ywa8t8UQN&5G8)aL(Q5`QdMyw|vQcdU47I!Ald*AIR{D<=ML?C!}t(Qn2ceqL*uC zczrm(%|0+J_R#V5+xfq5-&<Y3#I~l+VQ$>}V*ZcX9QRoFCD|=2IX!dfogDd)V@pr% z;Ngs@s1G^zl=Dba=&`3Wqx&Z~h5w3aJ-v9R^%>5{GwXF?!&WUl5!m<8T5JC&mXo{Z zYu?tm&Uo|s#R%EvrQVNCf`rT`$1GKm6JDV+r$+7N%XbAjyY2<KJki$DE%MS?`l((t zbl;<y&P!+bE;|)IrT1CT#_VgKMfp#B_z)}`VzyYTbxQj^G4_wPIkRQ@X2e@$-!J_0 z(YNMf$;G<8f$Ln2qFHX)b7yOCZ`Rx*&wXpX+3H?5buWfP<t+>>)30$l?2HO#D&TUT z)@fXo^=MDntnkn+LLXuuOxf?bG;43Q{(_4S>-`eCg4Xj@D2C+O3-^D~T{H8?P7ikG z+*2<dm%HxXZ*|dn(wj>sj@|OP{xsEVpHkn<?FYneYFz)6;M?c=Q@Kcdg3{gV(acG$ zp9RXUN4~x7wX&wZ%_{qP-Ahlk0-1Fu!ZyeL{Zevvdx55}jbDOnK8v1W+O+1UHB*v` zrZ`D51titK2yifH)(FUT_R&!@EcPt__$Ddj-bKAnbsZVaD$7-Fwtt>vRd}Ou7w22& z9+vKy(w#xC@3@9tYI~oOeKq`P*7facPp{^?AGms2{nfAMQdg=8$%ygXu3cVoz0W1{ zVSoO;E_2%{?Y!So^Ww{EHo5;(-4T^JZPxd?scVdDT4ZN4)!XGvbNThTWB)p5#oilQ z=|5)k?LWNY@cQeg_B~TNEa-6RLGFAbx8v*IGar!L^Lcf3UQzF)f_>~$Hnna)%vo~g zx&PDua~yRSgfZwoFn+Yjv$tPQP^|yP5AH;^`cql4H7}F4Nk2-RKTH1+>;F?Mzus>D z$Irm<|35QBfHyOX2m>3#_WQ?K*&lEo%+*LeznOtSWc&N&Y>GMc;_q5RmFN7rKA-8@ zE;;+>eoqenXA?GbUAI1a_G;Bz`MS*^acdj?=WgYi`E0f6iDl77JqhvKS$|ru&W&HG z_{mZ4Yu5Cz<?b8mr=4-G2$D4Zu-f{m@>)C3pf7KCTiG)0+j5mZ;{EHh8SG4^_lwzQ zEYt~d2)}38WS+F&Bu+unD6zh*C98Jg%h&ZTVihaPTl{_&FJ}qzVKMq!c1qyn{gutW zyM@0zntP)+<(-T}@r}yMza4Xv(_a{T=J1FRyzrqsa$kMNiSyV0osU(2A+kH~{?#y+ zD!nXW6^pO^2lO)}mFDgK`q2MFUVy1}IsXIYdwU!Ae%RG=K>x+*@@+yl7wmugufDN% z*YCf7()rHnSF*hMC9E|^N3de~^WMemPT2)aXY>Uv1@tW&AKhlRRaJKiU3Q{Dwn(LX zkB!C0hA-kD|FXHBSY|6|HRtSN-uK_XDt~wuH_KG;#A7SYs*hbc@!ncRiq?-)Uffg` zQoL7D#Mb-c3D?w&=c+1<kqMr2c!Kx4EI3ym`lNZqBTZJL^?s^%|6k$R<kfPoOtt#q z6@HUH!HH5&Y;+skgIS6=T^u$GGoF62<wbR0M@jr~eW%Jycm3HX&R_r7?XdqvrIin> z=*ob%r5Us4a$I3QAKy^ft|YtU)BCAUtDWv%cj1cIz2D+M{?Empdp=L+TJu8RQQkrD z#RNU3x%K~D)qYsjTRNw`)GxP>j7Vwn`#AZR+yC63_Z*a@_op{M`8}26s_gzvFLXst zMgF+TROz%oYN3!X%c6q)RtNn5t)A|&c-P8!?Fak+on&hf&E++6ugi5TySzU4e!An6 zhQ2S^_7ncu&oWYHvR&`O7V&65pK<PUait8W`_eHiELMf}J~w~YEnC3h<0hK<p#ATo z2J0W)(pwtz<L+}8)~$5>`lWr|e0|;xoA+%|T=sn_vuM(M7M(q<UoP%?%JAuz_LR?` zMPC?c8U3BZE;!?p@~6*x9iF+%-hcl31k?L1VIO|im;T^0Rtk~-vz4XtNc`%8|21nH zr$5MMH+jF_{X=E_+&>@d=bzKu(;CM=k!{i=XaAGe^?&f^HRO3Kg*28pGoF3d#&_vy z8}Ga|(tJO3^A%qIJ;oBZP1?FbS?}4xn3W$t*l0S$J@*w|v}FD6uIcRNxfZHQ6P}i3 zCT%;xpL1)r#`%Y7FCOVL3IBCj5I%$B>g9VjANTvN__wFBQUAd+-dmTaPGzotuO5G) zC9m@V|IVe&vGu3F?EU5<w$^cB&e~|cw-=c<_qu9qe{qe=^2K((58v;3MY3&=+wdd5 z*)LWp<>lRL3*Y_S##rgJ-FHI%_S_SEd)~5N`m~LI)5|>n2eFm4g$b_J?Q@R(W@BKK z6wuyL+w}d%H~A}DJAZ87(4?~SZx4r0sd#;3u~tz{NMY-BrREdq-&c5il|AUv)_=b9 z&z`)UPF(v=g{V~Dek1t)vsj~bL`qe4VyjH;zs3_^BH5Hqm$y|PxqVLQLUl09vRCT@ zCSAYgD)pB6Rohml+<lktR>fw%*%!AkHQ&11=U0Bvjx}q3sc%?)>)XV2=0S(6y<F<- zUWc;O)L-oX;W1rr&6Cf2TsQS!?h?6Wy|-$&OUjQur4t`-Hoxv|+h+R0K7Ot?)4%Pa zsmxK9T0sxQI}X%!N6Gz~_wcuC_l0|%DY9KT`tGiE1yZgLbdUV_x$k&?MR)4aEe?Ih zSWJ&<r+ujGc8Nc$b!qQjT_(fMuWbegCqJ8ieSNsj-QVu@OW7RPPWAX4)qCR0_mw9; znf_F=pD=A#O3mDPC%*o)7CPBmmY;1W|842+A8&jo&i}r0-HpxLW3IpUVqU(4fBth_ zrj0Ta->zQlvS9fe<$H%!J~3BLaQb37>osfTpXiFWv47V4UD^7u_tVFZtP}aZJ574` zXue77`R`oO>wojssENt1t{2PPC*`!{cciz{gYV)$_sH%EYWf-3e?WGQ(35Rle`=1N zt6F)*V~?vQQ(VBrcW;9yy1rMJkJ|p{=bZUdxqNuVBk$GgZgO<?Y~3OyIDhviju(qp z#>_X}7q^>N=|W}YQntV#!51zXL5^Wd%{~~PK3^dCvr(k_W&Vem^J-!~3(ntOuNYKo zHsQqi=e%}I*W6#p@10*)yYxZTV*9_}pImro^30&-+Kv<7>ZVU!x~JmgcdPwBY-g$d z+bdJs8}y>Ou3%f~mWOBd<{5slx%KJa-zOywllGs}|99p2oLak`94>7xQW;K`&Ho*q z9Pm3MY1P#o^FA_SCyNF5P7xL6lq5awFZW{V&DQ!g*713tex}{*qV~6G*WUBdPnb2; z9u?bOd(Fwbf353#VIj|bX)ky;e=bZHobgbJ>2sOuwDVtt6?-kV^Xq)Pv-|uU@tJm? zbeaCeO?+%@<#J-4w&IVSpOg$t-wVFKDb{%JrP2j$pC_MZDz84l@kLwf_J!l#E@}}% zs(MxPIA+#wTCFnU(I1WsQ&q<+-vu`qdSyLu*IL>9EZ`D@?gP<8!Jj|ne)Tt`zuWqS zdD7zVE4xx|<?n2e3o2rry)tFRYO$LN6S=NF>2|muHj%GxdXQR%)6$&z?3zrbSxWYQ z^5s1~1ub6hQPZqdTY5#>-ShWax%W5gSk`O{s(<iabYX0$V*U4usbQJ%+n*_GD#^Y% zc8RTm!FzT=@)WjMx9i4S55&K`DBdr}xYlhpR|%Kkg&kh;cHj18EvR1C#&z$c)UNk` zl#FU@FWY~#-q^<fB)XUPo`0|Xd}&3eUHi@UoWFSGlEb!6jxV-#EILnSb+2Dt$5OIy zmbyz&R$FDelJpYqv+Q5$o1>UAq`!6+DFocryL3=%#U<UB)nXaaTV+19U-`s5Ga~y- z<?H?*cftfuY^r1VBeM0-mkI7QYG+pIHeTPb?P2xKPM`U<%0&l`tynM0F7Tq}Cx=Iu z*4*>^cV4eQzCOBJP>EmZgWv699pQ!X3Y8C3gSxlek5bB?C{pv`*;bhYkMip+o6KWa z!nQ1IU-^{ZulDrybb-IZ72K*#PqKqVUK%r(bcLzCSrw+|@jq<x`f72_ea3f`?UH?$ zG}-S9{j{<xr9v*Y_rtc*7Z3M;W%w4ue_`V<-WlH{&6U0^vE}&?yl2|yI^L>=lfFvV z(^ssKTYdga9m_Yre&IK7<rKTizlJE9)vGeeZT9=RT*>~!)s73Fm+;q^+PYs5uJ$Xq z{@tc#*&F2r?HxaS>?h7Y|1)xLNc?MUr%8LlUj*x4a(Mmb%FY;;te~)bMkW5euJd;* zUHVhPHIdPL7ss3j_v-BYOTW&`Q2+L9bCgTld>IX<s})M~*RK`W`Jh@#(P7(3jwjVp zijC&=H7#7rQ#|%Bdp}d*XqyPTl61;d4)#6q$`{U>D1BKc`qNSEOo#lD=Wcs8tajs4 z_?dFHaq8k)4y*efSIhfEEhpSGE@H{FENa?oY*g}2xN(ok#Mj2+*EIx_{;W^t`(r-y z#D^uRP4;zHc08=iVv@hUKysRr?2;QRm~A4J5*mBCjO*vR^v&=8$dR#XvFU{T#Ru1@ zPUN+la?vhcT&u`YTIA#0N;$^pG@DXp56KT=R+*WL%P$1Dwa2`2ci83g(&L}*nSdJI zevY4JX$_v${Rcju`M~`Cdd~$}|0PZA1;<!_`(Bf&IJ4}G(0{SCCP@#a0LI;EdJ698 zaRSq4{^b5(laXA1MySSbuLq;7C(D*uofkhvCM^3kYpTl6H5d4cd?iah*sgW3$+k0Q z_h^qem@`Gv{C1PXjW-vjJE;7wI^bTDt}XaN=o812rM@d;Haxbzd3$~3g8iG*;vc+^ zUFh`e5tp>eB`*0V&(;<=?phP!5VU58gLKTtAL~q%u75vQapZcznyK{}>ibfd_U9=r zu<ZC@H%sY4ap77Shx%yChv^CPc5q}mX_sGk6Sk~6F?EG#CCj4PO--41xk}Cm-kjjR zhwF<;J<B5>r3o9iomzS~dfofOTf$oBarXb%=c>f}=akX})=zVqH?Vzec(&mczs<ST zz8y+7O!t+aiiIs#-?2UQU6aeCh4rlS-d;7Yd-mB@{5s!-<$)@{Rz*%^n)RJe)Fesp z4=Z=cK3R>tZHL(d-^l7!_?4@i&TxOh_mRUTzD!5Ky?lv}gy4sjT@9-H9<vL6o6GcM z?R%E3T}r$<Pv-7gFD%|D$*#m+5+P{Ot0eIIhUJgEFG`%B%*xIs?99{T+u&Zz{8Fi& zY2xm=+uv_faVoW3e_hZfv$N!x*GE}rSFwl_yJbE^?>pzY!Rjfq{B(}BrLC)Ox+~-t zc*h-nw^sO3gVF@f&99l}=6lB-o_vja+nGEO<6F7TSIWOL>|C&0{X$6j`3adDt&iR_ zf41QLKW6VoESGlpEwHf`{IEb?)4xuB&JIQEzbf^oimX@a?_Z=YyWxvp-vY}ya};Mk zoZ{dgwcz(G54QbJU+;f>|BxncNtg5AsjhAB|7jX2%6|(uyXpkLk%He(g<IuXuA=_B z0bk3rSncnxl&*Qb-1R=Y^O7I0VkUCUx{zt$9J!>~SDR_qQjR+Zm-C*uCER$Y<FZ}H zp}A#>o2pXY9;*NTg~!t8((Z?G7JHknX*#9vo^1c|3+q+p<@q02=hVHJ@<l%5_44>z z?0=okybxdXzFYayf%l)fIp55WmkC&{!F2Cr{G5c)|Bu)t|9cDmS-d}FVcawI%$MbV z^nE`h{JF%W`(QfXmA=jfpFd0aAKCApbMW`q(--_bo-jv#JuO~yWPkmnn)-e22ZaA< zi|%3Bzez#r_iE0Pdcj-yTb*Q_S@ta0Z>6~G`)Y&Lm4Blef<I-S{N5tCFysFE(hCap zxy>TKzjD~M$LnudRQu!HbS3*8_4@=A=Y4HuiTWaL<PxMZ`QaQpr~kc0e)}aH#eb)m z|Em4KVUzhLLAGvU&KG^v5AroD>mBqCPB(M;zn>?z%w^qsyS@9EiY??Ab02F@VgEVR z_xFOFKl#VMTM7MiaIcc>ec-uq+3U$SIsW&iJ@0Z@t~ilp+cWiC=DO(UgzP#K_V6d{ zlit4;`Tx@@)x37@o7VO96E><b&1+qM_{{H8=SJgl=1|7?nGXN9-z})A-&dO4(3M>; z_#(3~nJwC_Oz=*z`Jp}K6CYPkTQ^(i#;otW)7YI#<;@RH(V57vRIZe8{;tbMOTiUu zc3U>4zkBw``bKvE@9(qBejkp$*w3-napA0d!K!&qqI;+B`q5nzAXsm>`&-xx@xL4y znN`*gig$c{{#&^-Am;Nn2D>S@jh=kJ7xpl1S5Uq4i)yta5qZ)3E`L{kaCGNe_Noq! zD@u3DGWUOF*!5|un#+=(CykY^yHDS~?`ZWl*9FpxIZ_^U`pg$p-SkJZ^2qTb7rXdI zl~$!+w!b>I+qq2oUS;#>{vBmIxj!A>r*t%g)E&9KT*=_1Z_00vB`2O2@Bb!!H}Cu% z<$b%Hm;72|JF(u)f0otTxh6Gh7oGSP_|tvQliP~w@0G<?{+KCm>))1DFjMZ}@1HIS zSra*~biE0f-2bn84a4sRhqf%2)u;|$^7|B<V8@|Ohq|kLw!buAD9!ZyE8WSNQlT4_ z@{@0c((!PvE{88g?zt@c^MY3I`R}l#a&^>_-@D^d4nzxl6fB$gxPGgj;0vAo@to{` znk**j<V$we*d4AoK4lMk0LvS<iLZX!b{^2NocOeOsSDqmRWt1FZ+$1YzO?Itt-7kz zx9Bsce|NZ=-SOGzGGF?m|AYOaFS4|QYWFSW$e61%|9ji}h|S*@bc@)Zb$n9s+L`53 zwfx7MYWi>9{N1Z$5FWRrx;s9l{!p%1^_Oo=9-qwCp7=0TUFr7k0G9=B4+JMH*1X{R zyDeDZ<J{k6m-;{N_np<<-`VYuziX~gNJyv4{og(+Kj#EbeEHYI`YFTrvQrn+r*-Ab zf3H-u$J~iUO~RfjT~Bm{no#Gxd`+gUH<S*ir*$7Vvf91IcO%D*-ru~c4ewXZowudF z?EO-)nRfNh1$UfvsqyC){E)L>ML@pz?n>7Aky=bs8I+EOr*<9iX{cv9e_8F0eNgq@ z=jqG&<{o!x>ksXgv0DC@eU~?%WZv^|p_l&CI@Tvw9w~PdkW~2T;?VbuLH27|-$8d4 zxsMy2Co)B)_g(%TE68YnUwJ|96O)ARX_`*|>gRS{h(0l~&QZ^9(*KV0rQ(@e@+zB- zP5u0>&Tu00b|1Zi<-rw4(v3S*CUjN>$cKvTEZ7vsr2VHUs#e8yNwdqT(yIMSPkj0) zH1TnErHkE#MaA9=mU`a*^s`gx>hagEv%XKZfAsf>Qh>GEC+3sWf45aD2KOyH!Jfan z<;`k)*9GhA+daNlW-1+ie)Fx8^5OYAuRlNjeuB`#=TkYpFx^xQy>Nfa!-K2DKAN^D zT~ELBW|Fwa#!37?j=DU!r?>Q1#EKIi=B|yinty&v1<RYaL3%H)Ki%5S5VW^H;tBKY zl>y~p6JM)WyuHLUXXmA^_18siKKQBm_Ls*KJ=>oVeI8#!4=9~IULWDIfPLbL4~Ey> zGy1>1d@P|9uu!MS;ho5=nOa4TQDHZYJZkDwC(7@!6r5kG@~QEg3e)m9mV0Hq*UJyz zGEMs+)bV508TXoYhl!7>t-DG-NL}NYTkCovKT`P2QL)B1z7u)N3VZ|lH)iwM9ov83 z!Tv|C<Rc>`*|MawOD10zI<Tx>l+kzVH2!mCx&e=Ot`?In<G8xD(_}}g%K>HO(&dMC zg}(Uzt>gT*`}&TP?2K#u7N1zOIiP+)dx&R5Me*8SKHP#ceAGWR=7w1xU6$ov;$;=- zrnK+;$`jAC7nE@ye4g;;dcpPo+r(b{%QS4v{r2nqh4cmYFDoy|-4c<wHo8Smq`&@v zb?x1nKR+wqS|#2M`tnnx|Hq5{9-k_mly0WibU8e|rd%+6%kvV3O%Lzoy=;1Rx9C&k z<NhC2Q4_h$-A?m9>ec1n&=WOJ;l4}8T`!i|+orm_-y$+$?^=`jvOhZ3SBp1BK37`8 z+R-4Z)5x-Y=05q7>0ye?1D9N?UoHD5bgkcq<MrErHTu-VPI$53@$HSgTVWflglaZe z*<S2>e}Var;Qel|C5^dik2d?3@lSZIx2Yzq`^3k)M&<n%(|z7gS9uk_<@h^oo$X@B z)8}`(d<gDnNV_h4<!x6=RnSTEU-^f>7YQ%?drjC!_?GSRm*q**r@76KtV^44g8xah z{seh_Cee>d_1rnP;`n~BRrhXL6uM1t0;7<pwA?3|D%*Yc-U!Ao)G5mB-^Nn+U+*FJ z>dUjvy9>R1aP@8O1?ybtE$8mlJ@_oPaPtM`A0hG|g;sulQhll`<-^LdRqq5ErS8}| zvG2{=Gp*TS!Qy*zh6j5MliGKD?qL3NN;z)6@pku90+Cn$GwC0!pTPPoyyS^|gbwrP zShvo7&5J#l-<FA-N)&38=~0~8RCkd5W|Yzf{<fa<A3bX{>&4t!Zw4xzzV6vk^JVqY zTL<sGyjXrhKr^A0Z<d*clii7n>MoPr{x{|qw7q$K)<x>YKjWHx=MT*@Yz!}VJH<Fh z@Y&YRKMwA*ICt4~xm;N9T2ueD(}Qtu)+L+piBF58UF|;fpW`WAsMLASUvGk`;b)fF zWoa+`_bty$|1s}+pWKNhvOx>@A1Dj_p7HchuVFUB-mI_{@d7g^NE=F*>=J%CVZO!f z2Ae52m#zOT(6~=fNqWhrH;kJk)0Y2PweqxJS*X0g^qF&$+>|D0TL1od_3iKeb@j%c zWil*_9!#Avaaz)@{}caw_?7DZMeFc=qozgAemOD!{nf|!W&am$=5M#f)o!T9-&oLI z^YDkv^N&X#RQq(>JShM9h~fVWaq~5|r)#a*%JHVz|CZGn$EXFnYhDVR<UDu&EicRY zY1VTd=sWWlOk}+D|MZ2#;y>)143&=MKTk2}zOC0jULGVJ?>iy0PI}$p?=QX{xV`T7 z_l2UC39|RXE`6AJEwg<K-=+WA{2Bi7i#5()x4Up@pV>jKzqgt+&R-W!QLCBcv7tPr z?!dlx`WZ3t{~wtB{<TC{r}X&#R>7wEbMz)TOzID)O`quPU@x)I(eCGtT&o7353c<i z6gF8MVv~McRxh<^zgy&bWws8_J1$B4%iUVysvj?#c1YM|Mxd&Z<N95(%?~((n(tZ* zmAn&{OxW9R;}E`2wm6~m6N`4b$O{D>Cfn*`yrPGHuM~XO8p!>2!mop8O)~tZpZF5X zcq}8}v+gE^V@9_cW13!zG~K<u`hA?my4%cknaj`Q2!1f>+jp@3xaqHtTmL7waRs(W z%6(AoY*;eG@W5S*$8780sn*4x7pXn&JdrDK^~{Ca_j<Hjyq%)@u>8*z)93fUow-~d zEp$`h_zcwxUDJ3f?`^(tdmgKmR}52S=H{>sKU^ISowHInWvqR3xzYpoS-Fm}jT~=R z$sIg5tF~d@iref;Z?<pmw2!RUR;kz~n(%1Pi58EKll<P@Z{j%7EUNwDiMCzB^feU+ zuElUx<#(mru+}c!@MT&_k%DDIeR}FGMeY0(J<(RGb^ALTwr%ucveaUVYYLS*u_|=M zw)a9e*sXfMTv562vcN3!>YLq{Izmn?kNDbXad}nB(=}EPjzyF<JukV+dhcXtV*Rcg z5xPy{C8k~H*P1!>d2PFJJ5RdkSs4Gm>}HNs>vjJc*mjn%|1RIPbkcA28{1_$CcLy3 z?9%Dzd+YIW=Ul6d3D&tM9PhupAl&ie>P^YCh^~|gBG!jlK6oFPC(P)-nB&OvvbYV- zE(-rPe`d^FY0DZXBlyAXO^`x!srS1d!JD}2BZGGbnC{?+(An*DU11{6t+(rhzpRQa zRDX5luyro~+g0Bj?C$4DZ`pE}FT;O#_=fGS2iiAThc0?sr%)flvgW%mQ^?N~R;>Cf zIDY)~e^Ga7^$GTEXD)`muRq_(Sk&$JW`mV_&>0UFqay!53ei87JlTD#i^pQQy6%NN z=Vc9jTf*v1%0D#C`{QKZI@$h&p>?HW&Z{TPQ>B(4VaWCkj&_aPFw;+RLGT=}zf69) z`<nl%PH3&jYX5O)qN?Bh%?Dm9GKu}qG+3E>XPvr>)D`A=)_S}rxNja>&buPS{;fml z@t2&73YG^id-IaDDB3??;j#bwg3De?zv?umH*Ej<<#8_0%=*b!)9vFQ<r)iq5bEH$ zKRt@&SMV8u=JQ8HPX1dqSJ5>;y;DTqS7_zEWulceTf0s?U)p`*%e?uLMPIDudwdI= z=UsDcwa3S(<sP2}H3UDno)0+Ct{=2l{+rPIyW%h7qQxuss(YvWzMa#?Wvi?AF*0O& z1@C{MD(<Znl?tCKPL_ApZ)bFktDk@FLeupS*9E_~aQv`xU62))^1H`>;^Vciy!RZn zch-+97HEvq4c<QIdiC?SuN{|E{VeP3SBhauS3LGoS9#*o-|x@NX!^dOJ7hwVp<_<@ zDWlIf4=Du{t25o?QDRpK(lOW_(Bc=i=HTyZu9LQZago}ao5>d^_u}Zo?=to4yU*UR zoBvjW>E|>hfxRM@ajR!;WPks8-;v|~&);rm%-`+&tixlO=-aFQ^}>y}o_g=8cTf2p z(|?=mUU*)o$oul0N4^^gRMzMVOcbBz%d(_sQY_Pb;qLE#T{U*kv^LeG-SIJ*?eU~_ ztKZCTj;91wa!#F0-`cUq?y=jG&!OH*2KBae_uk3=JJVV5+F9jbpZLeGX-ezYCyD%g zaK`iDBGVN&tLt34`n9@h;&$&na{cnTD~rA-bU19Ac4FD~3yb>&x<c}OV;^N-(PNxB z!<oU?)cfrh{|QS&ew5E*KC@V)(NAWVk+R1p8RI{fZtrBO^Uo<@PV4lp7b~i%`Qn=L zYt29F`Z<THw=L&e+`qBIA>V4^v)b)SvO3Cw7s`vOYC=+;-PyA|kVR>=(uL_&&zgQO zFnKR5^s>M!CF#dMcBKn9!&55dub(k(XgO<ov2VR(iQ!EaJ1%vjzb)Tp-hREix|8R^ zwc_T^aHZSP?~Thp6vjUKtm$G`#r?N=w%PZG#dR)fC$j7BE=xEsD!HQWuGf#6a?gpp z+lo64I9*a2)k1=p&Ms8>P!;nid7aXO<~im(9Q)PXFSK}_v-|J6<Oh$E;G`PW$u*N> zpJ=ahwVQuggX!*d7qdCPf`l@fmpbU)*`pl%kh3KB@b{1t#R4ZEEZ5lDus8PA<IUe( z66&t0+Btu+H{$r_Sl?}TtDN)gk7+e?TR6_l7k>FbSBqEeP)Chjl%A1;u+|IJ2_M+4 zf2d_w?hO9*db8TQ6{_*PhS?o<&qJPkmOYo&d;59QIjzkH?4y18UwD|-7QD)qvb$g8 z75H^t!o(MwCI7L^o250ymF-4@ss9Jgmp>Y&7RScay?<fFTJJGcl`+5Guj%;wD#82f z-Io0R_iy@-dyPu^cYKug#koCU?(gAvA+l9wgLhs%SH#6z4%{ogGS)6Pdts;Rv?<)H zw?DsIWQYIP3kBD^f81E-vAi@}KV#L_TD#RjDUE9*t-mCQu6%HFU9DY#-|vrqf2MJt z{4Ok%sj&JM@8@cv-RB?eO}^rAcz?aE!XN!yBk8|>IUf)3T?~En_?(i#^pGd4{WClI z)z032$rz>{K0jOI(!+VeA7`GK{(~!ZqIk+4juWq^c^=MJ{pGQQ<I6>nmHUjoPGY~8 zSy@xBGSTt(0-al-sm;r7ah>@;^DURFf`I0{w`Ky2PPg2$h4;v<mHlwDvq5}$>4^q` z#`=?6r#FONSRudh1mo!y?JR*Ub+=zLYuZ)2wb<AzEnxj};o!fQ4_V)D>^N^P(8%-m zX7Z=MNA(!veWypc)~{_)z4usUQi55FM`OowjyqdyA4V<bOkcR1Rct@UjV<LCI)Ap# zIXLNpDf`C5^AgXk;wa%2nyK(uHU41y)zcsTu3mPfqJD$v?hp?p(MK=#I+;JXdE0sa z7RPfdPka!yp5AcnW@$j;+TRTE&lmr%J8r-5=gwp$gXp4r^Em&x)hnG56j-?T^O0xP zGh#md{QTKvh335NvzzL<l@eZd9*DB%TvpjFvg53a!}DsPliSsG=hy2xmHnOEy*^I3 z(Q}cK{0&wAww2mS_0mgD2Mc8|`fKj%O0g5wdhfbmQ?$x&K1n6sEnk<H-LH0gvUuyd z+4o|&?eu+B4zB&V<(2jnSGFTX^U7XSSF!y3_Jz&T$G<+KJ>c!q6JIJXDsle_^}k;t zX7!}|thvMU|K2sno4h})7oG2`?zH`xv|RksTFwfF`v$e~O+Sxue7jRGy>R|_)qU@~ zPB7hm<16~@;A|_8r{=W}R@PtsvibJ&+437M-v85h{lnQQoXSi>FV9LVP0W{6(7eYr z*TO|E>Y|lmvj>ZfPk!t^_lK$l#(Q~x@t(VF&U7zEdF7vNt@Cdx9KFXE`&zH@PDi*F z*PLT^FQ<Rw-S~aFmd<l=CYP{$ch36%Iq?mCJCvUE3N+fRyWQHfFWq6^Q*pi%7xkUC zPWND*e^)$_ZPJN9FV^Q?xU{e0!Lq+W4Bel+1<xItZuBE@zss!!TPjXu{z(Zq6n&y~ zpSrVqq2P?88b%M<{(NfEc=<MlalWRA=ua<p-xt~jz8Q6<4mIyqv;Nr-@2zlh|F<Ub zFZJ2-E*!28a=g30&%F8hTX94BYku3(`h(K{zVhcRTkqd7y{6Xj-$4#W6YHBn0<)zS zHn>P_Uu!8aqt*0%gl2t{d(DF@@sIpZcIf{zos=~Fhk3cRfxyfS>)p8uPTy$^jtlB& zF#91d$g0w8p09E##J%a}Wu?>K{Y7qWvD)cqll{b=vF^si<?Ho#w$$;Tnmf_FLYeLB zBT+@!FqSoDf*0Pn9Pl>adOC;ijJkLu$Ga5<r_=9!d+=qZ_@+j;)}5kC7tE(mF=bb% zU;l7U<ED!Lt*j0jYKDiIC!UZLds5fw@Fuy9`J<)aeb>r!9DDERF~;BW;oLH7_CC(+ z30x_Y&a%j^c9q-lJgw@We39^)Kepz@?D_ZJu6p?W+?jxSt)c_dW~w&mnVo*FJ>@@3 z*cP4>8gp77sct^BM{^>_PwUN-*kj9$D_*6qeb8M$Z|m=Uf=a?h?rBRUp5};T&$hbt z!Irnm-1qL;1^d@tIPiO`)A!nN7rrNz>m{1%Z)>~V=L}bAR^9iAd8(hb)A}bngIM<e zKNPcV>O$pB9;~mEpNfBa94@y{?UT@iQ>$GpzOJ6263_aKqvOrX?<+Ve48nRR%-yHu z`ak^azN)Avt)KZfF9|xpxAO4!La~Li_0}oV51O$H*Z+CotuR07E61(NuUP*mt}fr< z9oByHSaCa#*)KlXd*}J|*Bm@1^F?;``*lj6n&iul^FO+6&9~us*`0vdTY}pvKKRKN z@wy)Pb>rp2<$m&S=FSzXRTIB(vRrP#!Z$p@&s@H>m1@hDOpk3_e_yQe<W{SKC--k& z+VgN__E*t=O0rMR)vx2PxV!zGTZP%(UKg&A4{yUVU8SE|zL8TX+Fsi9kaNr3Jxgxv zb+SG7c9moO+RN`>hJ4m#Dm|foK;@$Mfx{|H%b&D7d413I#OuPOrr@Hawmr**<uA<h zTf%iiSo{f#{H!FkruiogCPpqfbho02{qKX684QY>9K?kibz}uQ(&q}*Klo?4)WPkc z=9JFLC2KE#ui4_Pb!O`>mZT}m-99wUi~7UjDL6y6l=H`9|JVtQ<*(S@FX8wh<JX*d zPl-2cqyOuK|8u?_=+$GAjN4TDkZq5x?t`0FXZGx8`J=bIUZ7m;qv2vvrZ4iMo^fHZ zk4%#$9)Ew&yXKGklh6BRl{&k9xjwCa`zqJI__^LS|C>dVzD#TJ_&WEB-p9a8-h1Rd zSym~!w7vIM*tEB7_m`?Y+dY<CiuSmhesKK+MP;uiANPGNZFf8H{^afOJttKf`u-^0 zO#jwlQdRu)t6|~9hqXtvuRMA>+vEE^{fXzVt9A0+pB*h8_Q7tq_a1&%l}mm3e;ePw zY`s_SuWxs%xbwV`Kw}Kk#J7)cD@~}}n&c68?Eba|cGYeyY89OaYJ4ZM*ZK2YkPl<| z^fT;={f~J+D(g>laXvHe5_$hvsIrFdLD$a8w=ae6GiDsUv`0+g(%#;UNxb*^x4e@u z{pIuVqmbZ?|H@9!)vvuQW^kQ$-D>)g71#M)wC)&fbgbup>|OKjy6QcDJ)?~NZBJh_ z>VMqGH1Tcr)9^QpOH$u}{B%HOws+0i^&a2ro|evjeDLHe>3f-r_Wf46db_y(QN2Ic zg#E?RzpM5?^%7jh((SVTd))IS?-h6Eot!&e@ugWS<E5H&FI5-FFZuC{Yv0tMFSpiu zeB0K;kutxt<h`<3edQi@=adV<>L1!W9M0bLl6+>~rE)=2uTgf=<bIo&N7)ZujMn<u z-J85MMgI4U)gIrriYoP9+huY=CWukGcIm8_e>}7fOI>-C{731+*MCCq_ls3Nh!bf1 zt$x+<_X55569pTkW>1y6^08ax{@a)(7xv}Z9@=Hv(b~ncAtK2C-o1VGN6I$|uH3i2 zo#V_eVaEIx4$r4D2VUz1eK3|j7jrH3(RJP9=lu@~%(Povo66~0ziE>TYmI+XM=!^f zr)zxf&T?H~zTJcIt>*Jrze~GJF2okq)f}CDf?LY#TtK~+QH|JC4woDG4rhPMxJd22 z%p_~SWD)Cx&PXYhiCnYFr`>4Wt6Xo*eQkjg@01gt=4$JGtURK9+NIqz<7l{eR|%+A zWsEj9e{o2CQ|+-^r!KwOv*g6yOY2@;uKw=IcSlu~<$|V{hu!Dz{(nwtDK@*sFkMkv zBh>uft*G<7-ENk5Z-o~3|LYdnG1J8%YFb52%Lkzk-BU$sYkmt|X!)|v@!0e)2mS`v zU*gV>HfwxuuCeLh`SRbp56nJ&^?1FD+>VRgB6`2FPnR=9Eq$==5`UAZ?uD}<OMZ2n zRkge9&$7(%AE)iXFBd<R?ml|p)fI+Gd#*5V@@gro@lME&6XgHBAoTw8FMS*z<G#;k zc=$L?>2~`3wU?CV{_^{G(JAtzlB`P3%frXLukqH_|9CI>QLs#K#y;gswQKjBcx^21 zx}dt9qoh(easlU6j>~zjC$4MGom`ihvtZ@Dz|=3c%r$(bc@y?3B?Mj*IglP6{4rSB zW!Cz&0x$RRADd+Obn#QAtLY8h2Ta%}UQd_ko*=*S6<3RGlv2j_tts;>Rf8Plu3W0^ zpItgz^FY@$@sj#|QEC-SU26D_O*+Lc<mtAezcr3&l2bmr$?hobxjVUTo}d0hV$%uc zi-vy<C)7;UI^wb*{f_E_husZz0n%T@g*)xm2QT@ZqdRf>J^$GyucSlV*WOxue)Y~4 zKhORLhu81Dr2qEx_w`Y}O85TH6O)VgEbcsCFWi{JHj&Xhn0tx(wt9}*3$6>o_j9;f z%t~2*f3eborFoi-`HL_5I8MBt-VpD!-^B6hv=c1)j^3xg@7T$*M_X4`zB*plS>AUd zYhAtIgvD!J?kj&6`fzs}(_K~91)KMrV3_^VYSV+WS6L?cv#eo?ln|)R)ctYFO7Mlw zrdzpIOe|Jn9U&k3yMD;1O=PdBZ(du!FV8FGN8P>Y4Qf}cLR!|`7H>bn=3mgyT2kNX za^bJ5!@Dm(4*h=lk-2yEamGvk%QiK>_dNLhmT=>&nu#v^O(v>{H_8@qt~poA%KUP{ z!*WlRDy9|ZVr|(w96EpOik-+~_-~%{k>=`u2OfztR$fT$s@{1yf3m;AgpZn=6twD< zn7)<ivu{zC%{^iDD*Pq0liY#0#9Nb3u<h^W@tUxAuj~E)zABBnm!*#uRVmlkTo-KH ze=V`@T9p%{?^n(Vy;_?d^3^Gw;TFx@C+4@rx#jP~HJ^-JSc;VA{rIJ+`r7kgx<^-l z-?hndzm{e;<$v(pVfC^hOqr?t@#M|tt3+2WsNZd~v)TUNN%;!fc{T^)Rhfc*o|N8n zXr9o)^zTz1X&=%1IJ0|t!}Z6S^WR@l-Q*Z#W7-(||Ad9|CB^M8R&qbN9n7Dx-T$>h zqH9g+suRz(SGllN7|i>3VDH~A{okV7BkiU)@PB&wq`Z>(>6AT+j@OPz8$GeyvuW9% z&3hlV=I9Dq)GyDM5O`RT-=sT%b@|7=`iCZaRPEWK)lsl#qqEwXZljOA@<)E$=a`x? z-NEK{?}gx(LKF7pFOvS?%ejX|X~ErnD=*&joIgKJ-RUMz{yBw-_ju;sa80mkJ;7|r zt@OiI|4wiIyf53lm%Z1#>Yo|2z9;L3;#Wr7k89_@H&A9WePi^jK0#=`2dnhsT;4x5 z>v^nhSik*vInOoje*G7r3qM^BXjR<)vQ;0nNNca{Pp{kF3g;ibWwqI|K4ty?dHNwI zZvIPh`qX6eL+MIm=Y)Q5mXa?0N%kMh7(P9J?rpHpc}e5D|DNK_=btbH9@S63z_$NS z)7-C5c{k2k&vN1ZzDbJGU$yJy@A$+wzLR~u`sVf84w3uGQA--%eY(nLCn9)Z-o9Us zb$iyhZE)IuO@aAO_S|o!uN8#%fBR8)@Ac~^y1%TBo^^R(Qn%OP%-6{)+4pbpzc1~< zlE&64^Wj~;z`^%MPVAi4hnOp+m3b!QKjsr)EPC)y@?)!Y#S#8ZJKgUjyzOczv#t+n zyVW(3>&fr_D+l?lRW$$DNxW>0IOm~K?fPI!&lZQza+%Hf$xE2cE}v-p=D4iZ*68U8 z9#6Z9S1}p9MeQ$6pU|&xbUnasX%v~DEPvvjjH=_;vl<sVW1lek|J9JMh<2YTa9@nk zy5b6p)W;pk1`Q=0T|HG9?OR?vkLpyZdNr*+(^a}eM119hR*PE<{FgJN^EO|U{&C;! z{eu0y{~Tk_y)f`CJu7fv)xO0QFOBbpr*_%=uoX7heS7W+@6)%NPpp5@Blsmy@WQ-z zA7cLdrPnwdp0C;1SHfu%eJX(0aOs_2w=0*OFAo#3+^2kc*WrH;j4d0N%#gI|?+m!M zn&a=hJvH_Fmz#RGY8-O;|8))PldrP7nO=v<Z_r4uRs5z`$r9KSc{1HR`rBO}eMa6- zeYZaprQd51o4^=#AV>I<m8-(-6tfwrT15-qIkTkvdBge2DgFHe;aRl}TdjXL#>l*6 z5GapRY?`-&$wyT{Qb03ql1H8EbQU!m$DV@g_lxxRvuVrKpD>E(G-;34c<6u9>+tox z-44f{1!p*H$@|$*Z?E(~InJ{2eDzbdq7arh^QVfxSv9+WbN_Oa`<g{-r5;XMb4zj2 zwpZS}SLuBaT)*pJwuV#og#@#Us$Z(3*!z1pDsF}~$1PG~Hrf+5JK_5JZ3nnwZJoc( z<alx2T!eG=W$Cr0?LX_cDDj`r5<DRtQ+sglhF@&<J2@iUeg`RV&P!<LvbulFj@z22 zW70e8gfqfD%<q0Q)d)AfnJJq%Z}o|WH=E}g{g_&QDBXLCypr$Cc?yALZ~dfo3<N){ zd{=Vd-_2i^AFdZMR_-lk_pW))UsSiv$G2jejRXJ9%1i5n8t(@yJt=(aR4@8(w@An0 z_m>o=Z9e^Y_o7ao38$3y{r`H))M4AnbrZk&<$ihgira3XZnuzMLAQc%`RNJWn^T!D zrJwk{wR+k2%kmp;mBl~My;a+s{;q}N_uCepUtcFaa;RVHVEc<x|II4lglXrkKDN$U zC*1x%K-($(;ftd`i>m^>tu>q1SiNMFuK&A)ak&eNQh?HfgBF>N@%@v{B2Ktl$=CQV zt4bH_NSgnr!LQKBM_v5qgEO5C@9L{74)SS+{H|A7y{AT)asJ_*i(4B@J~+<%<TUr* zN=B3S!NMsua<h~RI^XZm{^a1}&!Y1rcxB&HkKL{5+4@K7{eCZq`foDBWvd_mg57iG z9o$`CpQj}`!Lxd~|9oZ*)wMtV#0jp*zOCq_Hk0Fx`NUUiWhOq`yH;ubdA3PRk~MJ$ zLUn6X@A6sx5Uz=y_UrTK{Isn5{TyEw2{r1~DD}TDQ~XrbUBn()wZSU2@~=b6@0Zro zf8<oJY&!V;q|nKI?~?B?Q~%(d{aNsQZFS(q?|b$&`PZ{l-Fb5%;n-G>kCK;_dgm=L zegAmZk!mj&tGTUgmPXbkD?0CN-z@s(;=cpY9g4r|Vw6sPpD3tl=l)sfM!ungzr@7z zuNAG2y;&^!dz#+w$)b;6o3aajVCeFB&wazt^_T6+irYRZmGT=;G|rXKT%`7?BG>uJ z*I5%d&Tt4y+AZ7uzTUzsVmp(dzu=7MkLnv1Ev>eVV|n*LHv2=RhSJ6F9YQDfWxW(y zzp%q({z9csRre>Kc>a53+@q}-f-^V^I=@?V>&S}=-rV=D_ITKXb6u0HH(0%Gy{)tD zscxt2()Nl@k?POC&Z+LZ-^LLV68mVkcUJ@d(_L8)`1)#p$*obEpt~oy{>1{zB_9sH z_e?z0r4~D@?rzYHeR2irohqwucJ8q|@Au@h-3jl6(jb|8;l-RULOrWQ|IEAM;Oxoy zi!=67?GL4Zx!O$AR&$&Q5VO3u?!M;ac{7YkB=;VvW^m=ITlSM{N$u?!m7WtnJ^n4< z!6V;z>!sNW1tz1wBhUADn%rVvdU$2M_{Wcy6OX5VdlPc-dL`%EI8Es<GanYe`Yv0* z?0@&fF%RCVS=~Mt76nJ!&Hp2`Lp-RtFWCAkm(?VW8{8|+FIWZF?`_p#lI1Vwd*Cgs zY4=HiY410^m33=B=WgYC@^#`m@0xIiiHy^-`z{zeK3SaJ&7P9)H^Eq)>F*-*Zy$sr zztmS3eTrPKBtPk)v9JrD$Bh`J6BlFTCVbqvM<LPGLGFpv-sw>)2V?bLJ}Yk0|9J23 z+~_a=1Sax?-F{oin(x;pXH)vSX4#q(ERjpI8UIUFsF%MJ{PN>YqR@L)yW55F=`3$v z^BM1U<y(`%$!ZcRxWn7)M-AU)Rl8@aT(#}=qgZ~`TXgH}n0q?chV#kikE|0PK2Dq7 zkiU2d=kK*ko)+7dojm9+m^XvdFL|OvgXr0-<%dKi?bsg+$xr?vT>orIPJ?Qo*T+~5 zmjtEFCq4wW)JpF^5Wm_WH&&(5H8Sht)KaCp-&gNE@;lKr!Du_j&9BoB+*`T+{9F;q z1?tnp9K!W@Umd8=QxJM5B=|vS%C`o4m-Sc5yKgStZ#PTjQ{#TGRjPYi`C{Lf^Oj8S zXqdj1?GnGs1KleO#&ccb{>aU+Rx_%Z^G$x)*Zk-s?n<r-yTg_=Zdo%?=ZV%)@p-zs z8|<=f*~RBvUmd~dY1bdYqLt}#B0tjj%MQUx$M5SaFGM}(yth6op?=cV6CdYVl&!t( ze%yucPVrXN`!5|;e#`hye7Bj|m2J+kRf`>1)b!rnYM$StHL2EYf(P^Y%(n)W#oHaO zC30W*7_j8$9i@ryR@b=L#k=Yk9hjA6)%)-4R*AoR$|this_MS_yuHK0^--Q?!@28U zOh4pkHqT$bl<iwn$NI3HEblH)tB>0t?RsFlBB%p-`TEOFnGY7PXC8FQt8B8n^=VP* zX=xj7-!82h|C{@E)o!2Vs4mWUcHPxyi*G3DXK1XQRCfE-mzlP^w=&#Ql5~5pf7&C4 zd+XJvp1;qn^dK=S_p*NO?0xQTd>&o%9MtnKnLVif)mZJwvS^8Ht%j{l!R2oTHTw0; z6Ilb_$SL13l6~sef5FjvNpsEXk3Z^u>|V}d_h+8g52knC4e8!@zZ(hMe9-^ivQg}A zapMW+=^ic1&z*f<+U3AsJMnt?&V4NJ=EqsRu-?maLUjl0;t$naA@%R#xPLs}tyg`6 z{p-TJ(foVmXBnv%9oVhJB-e9K*uz`!!n|E|0`+eMYB}!tzkd+>vbLe^l66SpTXm5R zeH+H2&n{vad`foLYwb7w($iBi=yzT6`<BYYr`lEDCu_ag-k$Z;b=P?*@y4!ue?1O= zul^#mzue_PTGc1!sz;OKPe@dJ`XU?oEtu(!#PkR04&Urp)wXuneDOZr;M2X_XNRe4 z&DGWuY_|XER|@X2=;smsb%xo}-v94`b5&7o(QYh{di|>pZ2n+!>Rg3N`GcEP%Y^T6 zR~(-I?`K|W^e){sFS`FVn@_O+*UM>ABlw|mzh)!<Q{S7<<Gc41Fvl_NH{qSXc;|he z<xkFDEdL|m`QU3s>9&`~Q+&Utt!TKLugIy*^!$tN?0E|u=KreydyT>9$<#`&_shdN zc=m2}w0V8?El>W!eG?czUgKAJ6V0A-Xit?%M6+0?`nD&ppSu{n__#ftf6sh2Tj6iF zm0j9g4v2s7THYY~cILUV^9n!j@kO3g5=j<ZxcBnH$qgqO?*49NxVK3EfQ!#W_9BM; zAAZ&G{q8oH=(D70+sC8qi<Ii)YaHK;GJ5_y%6v~>u&T-Br-%GmQNfw}HaVvJ)Jsyj zknQxu!N-Xu<*K^ntMhlJD|_6~FSl4eKSjwVnloW`t;x=?C70G|@jf{hF1NvS|0c)c zA6ZR2C)cNSaMXytN_Ej#{CM?+mx=YdKjx(<-TW>gP^pmrI9op@vfjkj<w*m3{o~j3 z=O55wl6|4anET;1x00r^$cF{|Ck2$`f1GqxxL?om;@1xMmOO8z3;E7VnnkT1v44Df z+yBIS*|#$H)xA@izZyRJINA4`$CHVYoqK{F^Chc1vhMEq!lpe-?t@?7m!`8Oml~x1 ze$!o~J|n@iXU>b2#ce%}6S*t8-PYAb&Elv(GhbLz;IDjTv!5c9Q09xT2ZX1v&058A z<hk3-2Nz|YI^27(g7wku#jYouC3PF~ETuw1VwtwhToXLu$>O~Wlsg;rtG2LyJf=98 z|C?X^fnySXnNONKx9mA5xoiCz;mU*W?GLxiwK&|w!y$O#XIjfkMI}xfBjdFD*-lFu zzh@s~EvtV#rG|Nu(uwUeg;KtrcbVyB?AY!gxa!U<$+Xn2kQ<?sLIgg}`MLD_<oFM3 z&-484a5c-gXe_^@UawJ9m)D4E`4_EUXSlcD)DeDjERyf7fNXAkQ+n=}Yg?Ut@~^d@ z^S`^r>Z^m@rJRG`=ZdUc@VmP~)~1>%(=wG=Nb?KJ-i9`#`rj?HGs|WeYzWs7NQ{5j zIC(46)$?l^f*oDW?r@hs+4J9a`|SRB*@-W|_i>~w*Pr51&a><O;{Ow$xj0D2XkHFp z?z7*dRzN>8v*F(EOHDCmf+xyicK(b@RML-V*RJ2<Y;>mf=4zHI?pC8O;h74;;R|^R z1W&}ou<mM(XWIBZ)U4j+cbMw`bM+r2Ch+IX3{}6wz1sEu;q3c{K5_fjhAEuSyJ&OD z+d(>Jt+PvRpnKiKr`3`jG9A|I{Va`?R90KPy%??V=DIJ-z4LEBKMpTxXZ_iEOMYMb zDb)w=x6J1<oM@EllV!f6s<hznJBixmdJ~y;XPv(F)jGw!>b7<0i3|5v);rcc@?(C~ zVC}2Iy(r9D_JT~A--K$N-`qA5*5MQKt@H2SjcBQ9-pw-M<8GIzxlFbZ-`}2buFpNV zSHUSidY8nTdr}K7y;PfUNGfF2gWW4<Y^Z+C{qfk{1<q|JK75|=pCxQL?+L40xlRAn zm<<2j75iaTetW|G-PKhIcdMFKoOs7tUv!~-xzx+M@+V5~|83nf>#n`p0?Rl14$QAe z3H<f9Ea}r;-+xE`&lBd}BQJQu+49AA`;`qmmXkt1T))IzzPIE3CpD+Y$J2k<R$XH8 zeW5ZVe1m`Ag7<TxmDp6Aw=L$V=+C!TT(8{uqb^3tpx3)a=X$V`hl*fF!JO!23@tWW z+|BBB-)#TX(Eoahc-{f;gu9?IC^4&y%;l;Z{9O--7cAjDv}-HVtizeSHTRa6eqfou z&B0rkF*=yVNZ616!D}1a=5Hlc--YX4<tBVwzJG#e*)PRTm8AJ^TPD=lc&q%5(iS{X zxbMjMuc9yiP1||o_es}f=Y?z)-QJ%Rdbv+8gymOveWyduQ?s?74HpXseg3|UBV|@M zPriAV!~6%rDnB0>TmH0|%yGs+sIsQ-S?;0dPhaF7dY*4Q@m0Rs#Ov<0uG7AM@5)&( zAM@z#FYg+$4nC(3o5EG9@9#R{V6>OFBJa6MME0gKSB3JRCm(mZDqVQ#$nxrkt3voI zq5JudC$a8dexAQRY`K2D@mz_f@0Hyl>)Zcy#?O^l_{xdpS4!uFdlM%;tJP3Cdi$%= zgGd3%d#BZm_OfX*ZM+~{`s(4$qK`9YC|x~%@BG_Rmy};Ud@C1EyyxU;$NpGr`@YxH zJU$otPQ0GotaLb9N9lOF+MEb++tSl^|CEFNyshb+FQ|X1W{LNcud(%fE((2ho%6$# zjcV-KC%)a<AYA<+^tsZ_@T`uK9nW3%s1^owEC^QN6x`3Isq_AzK;xTR-Zd@{R5)4w ziv{V}oqs1JKUrYqKBjL%^KTZv6NuWsI_S@f??=u@TTcJMam7>f5a+ZxAMSAozHrvw zw0Ha0I~$ei<d@ueFwIl)(^S{K^YycK9EnbtUeUj7-KGbN3zS6t!Y(m>Q;$%(SKaR_ z_r8AjGqXDqD-X=koA`9`Y4xj2Rf{^-w+S@L1y29rsW835+B@Y}mgq#*Srhae<kPKI zvd;HaXDU>i$Rw4Lb^Ca|9wX=Mst-S{r#C#C`|J7Qr%D$-#<F~R>_5%$@%K_b`8ACl z_1jJLKmOC2$XT_BBje&vD-GL;r&#BA-gIB$I%~VX>$3M-%R9gG#yxslCD@TYZ%$MH zzxYR=on7qYh3zft_qk6w@x}7o^@C4}=lJUh=G}@}@W1cG^bQ{R)ppw}_1<jfx*O^u zcH`hqr?!75w?C2cSQdNLZoZ%@)93B}?^wSuzd55^&$PLL|JxhEpAOPzYAfciI?*Ei zp-<xLYUQT+l@9NweE69;LFusn9-&6g`O_=(S8$xE*~3z!(fX)ZsrO%0&W6=pV(oUu z2l_*l&M4Zb+A27ENo}#pY?>B!sp+#a(>5Q^<IhuKA8G&bKPl-~ds07QimLqmmk+00 za%|Q~ZK_{Bg|~jwsw>P@i#pC{*e`Vy+jHXE&bIBcc0c&N{O`Ti`}AW*3x`j)SYyv2 z?+0va7}c!1QZ^jP*0|?iclXJLMW#IRwStOwH?_UpEa^9O=j;3ay{G*dr#Q(uOu9bh z<;}dsZVHFbhloceq+gYBR9<JL@}ce%`|>5v80W2-rT#+1)cL*f#Cqm?9Z^azu7BMY z&Ge~hp2p&aYYQfntlZkPPub!3+Cy`aCW`NQ7y5~z%)>T;{eGO4i`{+0=R)$W!ZY_B z`hP{Pmc>iuaBi5j&nB_TTG399Gy8V3{K?mKSn|XFk8npr{F}1R3(q@*&h%ifUe_xA z&5xV=+#DX;j_Dphn)5ffUeb-OSK_>_p&!L!RP7@7;rlj|8rJzInrv@fV(b5`o8DAD zi~EL;uKE3+t|`C%+$*krd0<!So&3t?`YoQaEv6bOkE2&USe^NlIX_T)$;0il9DkXw z`YKv^P)p!rrT_A+T$lD=T+(^@*JERMy~gTwr88P8I3rl6AGrN){`_YOOn*PPiv6g+ zUsbXFzYqWX^LbXbV)K_*aaPQ!Zpma+5)NB_oHy|Pyo7x{98dOlhV0l}m9=km8^_C2 zwtE%sS4kBlf7w!d?TBi^#*T*eZOfVE4$NzwuU3*bT{c2i@E6b9AM@fnE`RfpTQ-mX z#k9R87Pt4>EKvW(w0FMivh$XrmJgN-e3U)tx4!=7^Sg0O+lr^pV)GA3Ty;g&Zu;9h z->g4ud%dVOwtu~aMfnNMH`~K%Y<HbtFWR!*QGJKwwbds+-DP(%tMIFCx7j^gi8*k` zJ?jic^9<J~tu|BciQhSRUUn_(l0(7v55G>$c;0#Px_KPazl-W=A1rM){?K9-oUyWw z^F*BBg{iI%O7*rM8-qWoys*|}nrq<__hF^orTY*5s?3NlnkS=h>T}A9PLY)hD)0aE z_`vd$G55pC_3vF(jTE?_XkHKwR{5n9DEQ)iQQmsxh`?D%YD}Ar&Ib!etWy%$Sedo_ ze(=K6jVHeSta+ZvSTtkaG>6rdd8eHfWOc4D_qG4&lhW){Q?)3zUUjMPKKG{Q?$>v| z+m`Fh_#?FGPn<!Z(outG?v5opN+Y%>RWezI2`%2|7<P;8@V(mhvO8O(_t%@*pPW`< zYa=dKk#+l^S9PxNmmf9Df_|=yW&Nqq8WC|ehV^++I+OM;XWwb7mCh_)=M}Kn&otq3 z@u>#>$-xu&BRS?+&x~2?@T|Vrbk2U|C9IbBu8Nf<_&w9gkiR0w-FWY{RA}ENv7qL! zmrN&=M|wnmvlVmNEu*;M+U{eAGfI40ZeDsRw#4t|^QoWDb9ye=UE21nB0a`3Ez~3Y z+l+H8UqYQ6ww1J%Y(M96A!X;Zn&{SsJ(D@VOqlk~r|*+F7pH-?wfDWgbJrg5*T2?D zc`W24HFMo2gKfLJzASb+&~!U=pG>j3N>j@vPvt4m(H)KI0TY<RIOg<fwLDwpS6LM- z$aLy+#_}Y~GRx9Z=4{XK?Wy_|igG5!b4|?t`ZGjFx9`5&cW#cj)2vB;;SZ!QX7Wz6 zR@`7dxt{Ul?#t_H+BQz$v*~F)&~;IA*82L^2ATVklaB7XHf6C#%a*4r>=h>%Mtdx( zOHkb9%#pdxx|(-VdHTt^TQ}uunpzuN4}^2+$T%(7S{vHzcKLaWQ|h9u4_Ci>9S*J* zO_ck(iv9J{^_kz_y=Jp{T(frJ{-0J3Dh)k3AO3#g{dtvxv3GO6h{tOuhvyH9i}V$w zR6P23)tBD?qOh`RtwY(zUs7w7oE9ACX1pJ^{$$w;(<iFF_d*1sAEstZzs{P^^J0B# z!?8$@pDb*O>*nkX<9ISz!0DpEJ(mqyRg+I$Jm#6gu;JhDYZo*!AG&ZV&U>}1b#hzF zk)k(6pTy3wonkRjy_a=Cz3TOW$!Bi!eN(;n?dgphBCFVH>bseKv9`z<IkVW@YJTP5 zEFHoyJ8ngEMytXk=bd~`mz~yg`G(tVweBq8z4h1ULA}Y_qLu~|i7oB_#7v&75f(bA zZ7I>gF0v@GjMM1VOF8z(CKqmQo!O9QE5RRi;liPt=be0h?vYZwz9F3}m))v8LHolc z&TVY#Hz-_Uo5-;HZbW_HAOAHP&lJPtbYcUqDipf9ik+Wv*t)^x#@l1Nn7mWgWJjEB zIk3<0Qe=k{PXvq0vc^)q$wl?TOmS8l`<@zq2+9%3n4|o3t-zv0T|uU>qdp7Vwzf)| zy<!lw4s`!u-?2-7zUjo2c?`U31wJTrxlJv8&XsxUc@tOTi%i9o$Ng;e(YGf&_b{38 z+|eVxZ=Tqsgu3or)@vJYm_6u~ist?O;6_~V>}>@}eG@nY*)L{I2v}6Au%DB0Z_yUH zYpog8H`2d~divKsb?|$$ns1MBOM}RT@O?6_^Eo{<YWa9onUdFqiyqnd#VFcI_JkY% zKljKFN8U_j&s-dCyC$uc*Rt8Dv3_r)-^IAR%X2zpvrO2d1sPx0$4@@Hb-g10m5B#t zn{~aLxL0ydX0pTe&UAsLan=%F_kMdY`ReNsyQykVRcfAI^|>cplDYR_)!`p+_nAI0 zy}14Q2Ikk%CnB_tINu4me`x2fnGL#Iwu`=4R6I*Z;`TOH>C}Adifzd+Yz00Y^_<$g zqyAOM#AoU&*|u0%uGn#>$TRRxNRY{4HPM8l9$T9#)jLnPA8Bm0y*feG(}SVEu_no{ za^0ziE>Gj8rkrQ_f0<>&3Qoq@k}M?`O^(Ky`kBnOc9JJFW^cM|b~kx<k-V>3VDC1@ zviD93&-Aw1M#N7F4Ou+xoBheE4?ldKcQniUzxYu9?fKcWX*1;QeV+SgZl9}fw%q#A zhDe{)4<GHF@_e_MdH2i3@ww+~4DY>P_A$EX_ZEx8t5*wK<g|UY@;!W4QYOBncyo;G zx57R4b#eRUm$hHNU%N9&YntBi-}m?ZyLNZS+~Y5&XMW#efARd~4fWe&`_}6({Bp8l z%g)H$=l8>B7yo=%pIKPFFWcJZ{QU*X-+nspe|h7)xYf@;pZ#NzcPz$!KmYCa;<fku z!(XlsPQAZ&`R&~`XMZQ|kC)Ytv{_+3{q@zukJsoueXVnU+TkxBf24j4*uUY|iC4nb zb&~Hs%|3ZmUq0^itKysH*G->qdbZVP{^>8-GcBjjyuRsM%(Z8mjz9lvv9><^c7ML! z{<<?yzwiE9^}RCY->*~u!%J4RJbl-H_m1t^-5YMdS^lx$$A(?A=RY|-QBJP?uf|$C zo3-gLYjy`8{IvAJqswQ1q}CN%>V<!PdNgr=R9>6@r6&E(s<?G={O5Ns|G7Kc__X-@ z{r_8^8t@nW-l({L_fHFkf1h<ey?A`r%j&i7+s|nmqvzlL-hMfIZFu|7vOD~j4c;#^ z{{8aAl!?>#RjWVtv6DUhKd)CO<ksrd$F_X)iWXg0lRRs6)c36?+Cs%&Kbt?jutMT_ zq}Az%Z}(6C$igPN{dY9`A8}S43lX)4)BhB+ht}_NzHqnnQrk7{La)s#7hc~;2)`aE z<ebBPTT(jty<Pj<U61`9O`fn%Ui3M?t?K(1dp5N>Z}U}jRL)&~=D@?ROI3M<<Xc`I zN#QLr5Igtu*}@lpRth`*NRW+Vex+g-vgZ1%!`G9Ky;959-jqL2Pi1|7^`RRZ71t#F zR6KqATTtr#2|+GfJJW624O@P?temc#^>BNcn{fNy(x{e>yan6dPd#$$l<Q*7lIhFX zwWhDQo?q2eboTS^zdd{RA2+@A=t{k=dFkvavU6q}_g|3e_<u#%zG~N>%+oI(XBC;A z-OkQ8-L;hc7pvl8eZRWxE@kX$jP-Z39vcX_y%+x`+w)G=({J{!LxG9WQCytSE2iu1 z6~3e*xHVPTch<AF+SVI4|4n?KQlHNE*k5nmy;oY5tnxXJpSAc)cpi9pEMoh-$@Wik zXH8aFP~;Zc+iZE$St0z>^M0r8PUdoQHJ6**xfMIr#9Q*7r!?Q-@@l^4u=bFOkX~E; z>SNcr9xsl+9QIOtE88qXv&E(hjJQPKwq#mMoea$UvLa{uzE`Yn!7CQ9wKsm^T&^y5 z@cP5sjdnlV*XX{B{vjrNXks0A8B6)@yD8>xFYd5kUO&D2_`l%b*Spr42t-QgUPxly zv|xF%O(s8=wElbLtitY-U#~^KSg81F*V>Q+se9_%rm}v{)_*S&;<;&0yiVP8*1xmL zmF41c%X=q1e_qMoo6q*Rc{|_16FnboQpGjTd)WzJo|*8b@(N!-;hRqz#Am3KDe(33 zp1l0!*RnmT7pHHWlBzj->K~suu`)IDpZOp9wd2SCUYn<Zv!>7CF8g`Wf+J=Bm*f8f z_Ax^bvYLM5I4ke=_Z94otgQ3yZ@Kb$dubiJ5o7&iwL)gsqZ5)|Bt|nI$vr>INBvNW z=Y%T@ZeH)-Bpn`EKFjZk^4A|OL0`UY4ZbNjXS&<^&qYB`Br_7FR(^l|XXC%B(5Ex` zW6WbDd0+owvD=?I-~QrSW3iYC4~&;wsGBSAv_acxkA=hWzbuEPl-Cx@^1s++YnZFe zdPnl(rAEG#sCp4@ruB>^%x9;{a(-?sEamy{eM>^{>(AxCQYQ9al(Je~!SGG_UdZHQ zEq#*&mu}^Zxw?rt?CzOo5|XvMo>qUziMkhHG~>(79mh7W(n?cRZFV+if476<hKHH{ zsZ`UYDvdA1v!{yKBuu|qt~ux9GTxic`nKI7Q<i9o%-_uX@llFJ{l=zASC-yi;wE}M zwe>2yw5ip;@;h=i+NYlyX~{C~5{@~@cKcw|I-7t`d>5)86kdteTYM@xLe`Pxv5|iL z;|<FzzfG?0@Qr!y{!Zn(qWmSc<=dxzJ-9K7t^Lm8`?E8nvQB4*edElCQTyh%p7E`B zX@p~Aea6S!hw@3MLvq$9PMDQ&!gK1}>_10$8P0wB>x-SroX654(*IA}-@0|@=-kTe zXR0&a9Nf&)KKCipbK~`^j^<3va}io%?XvKoVE<=H#;X4Hg<8`N?5^TJYxz7`;oXhP zA0|fboFP*2YpGT84w1+F$@SBl8`*DjaXmknBe|EAK`3N;MiaX~BhU05P3+E$y3_wO zu{$xUOt)`lcVhY{F}=B&-H|CldipUCebjk6XA8R{(+BVAJ}vA{OpE=dPXO`%r%k`y z!tTh-p3OG>eKwo!beC3kEvDEh(+gVJ9hs-iVw+w!n@w!`saAF^=JW+@)BP8+iB0Ei zV;7KypPyFD!XU_i40xwow6WVUa!)UBW4B>a$(g>jjoprgv5=i%I%5&L+;q`)b^&Q{ z*~!4b5X#8FAc3r#fql9|JG(2BTgmkHc6L=rxifuZJG&^8U+MG{?d-OU%+uLA*zK81 ts@SLJSF?*wkL_R=kO5}|Mh1o-%nS?yC<eCFPVeksS7KY+z|O$H005OAc6I;& -- GitLab