From 21b8c323585fc91db3bd7c9e7bcc0212a95e035c Mon Sep 17 00:00:00 2001 From: aliciamirag <2caualiciamira@gmail.com> Date: Tue, 16 Dec 2025 18:30:39 +0100 Subject: [PATCH] Agregar proyecto 100453622 --- _projects/2025/100453622/100453622.Rmd | 837 ++++++ _projects/2025/100453622/100453622.html | 2410 +++++++++++++++++ .../2025/100453622/ImprovementDataBase.xlsx | Bin 0 -> 61090 bytes .../2025/100453622/ReplicationDataBase.xlsx | Bin 0 -> 56756 bytes 4 files changed, 3247 insertions(+) create mode 100644 _projects/2025/100453622/100453622.Rmd create mode 100644 _projects/2025/100453622/100453622.html create mode 100644 _projects/2025/100453622/ImprovementDataBase.xlsx create mode 100644 _projects/2025/100453622/ReplicationDataBase.xlsx diff --git a/_projects/2025/100453622/100453622.Rmd b/_projects/2025/100453622/100453622.Rmd new file mode 100644 index 00000000..99f5394f --- /dev/null +++ b/_projects/2025/100453622/100453622.Rmd @@ -0,0 +1,837 @@ +--- +title: "Protests in spanish regions 2022" +description: Replication and Improvement of the chosen graph and database +categories: "2025" +author: Alicia Mira Guirao +date: "`r Sys.Date()`" +output: + distill::distill_article: + self_contained: false + toc: true +--- + +# GRAPH REPLICATION + +This is the initial version of the graph replication about motive protest distribution across spanish provinces in 2022. + +## Data Preparing + +```{r Data Cleaning and Transformation} +library(readxl) +library(dplyr) +library(tidyverse) +library(sf) +library(mapSpain) +library(rnaturalearth) +library(rnaturalearthdata) +library(ggplot2) +library(grid) +#library(extrafont) +library(showtext) + +# Font adding +font_add("Lexend", regular = "/Users/cguirao/Library/Fonts/LexendDeca-VariableFont_wght.ttf") # needed font for the graph +showtext_auto() + +# Data import +protests <- read_excel("~/Desktop/datavizu/_projects/2025/100453622/ReplicationDataBase.xlsx", + sheet = "TABLA 1-3-7", + skip = 1) # skipping the title + +prov <- esp_get_prov() + +library(giscoR) +neighbors <- gisco_get_countries( + country = c("Portugal", "France", "Morocco", "Algeria", "Andorra")) + +# Adding those that are left bc they are named differently in INE +protests <- protests |> + mutate( + `Comunidad autónoma y provincia` = recode( + `Comunidad autónoma y provincia`, + "Murcia, Región de" = "Murcia", + "Navarra, Comunidad Foral de" = "Navarra", + "Madrid, Comunidad de" = "Madrid", + "Asturias, Principado de" = "Asturias" + ) + ) + +# Filter only provinces +data_prov <- protests %>% + filter(`Comunidad autónoma y provincia` %in% prov$ine.prov.name) + +# Jonning shapefile with filtered dataframe +protest_prov <- prov %>% + left_join(data_prov, + by = c("ine.prov.name" = "Comunidad autónoma y provincia")) + +# Creating data for canary islands map +canarias_data <- protest_prov %>% + filter(ine.prov.name %in% c("Palmas, Las", "Santa Cruz de Tenerife")) + +# Creating data for peninsula and baleares islands map +peninsula_data <- protest_prov %>% + filter(!ine.prov.name %in% c("Palmas, Las", "Santa Cruz de Tenerife")) + +# Obtaining coordenates of each province +peninsula_data <- peninsula_data |> + mutate( + centroide = st_centroid(geometry), + x = st_coordinates(centroide)[,1], + y = st_coordinates(centroide)[,2], + + x = case_when( + ine.prov.name == "Segovia" ~ x + 0.2, + ine.prov.name == "Toledo" ~ x - 0.45, + ine.prov.name == "Pontevedra" ~ x - 0.2, + ine.prov.name == "Sevilla" ~ x - 0.05, + ine.prov.name == "Granada" ~ x - 0.4, + ine.prov.name == "Almería" ~ x + 0.1, + ine.prov.name == "Murcia" ~ x + 0.1, + ine.prov.name == "Alicante/Alacant" ~ x + 0.25, + ine.prov.name == "Castellón/Castelló" ~ x + 0.25, + ine.prov.name == "Valencia/València" ~ x + 0.4, + ine.prov.name == "Balears, Illes" ~ x - 0.3, + ine.prov.name == "Guadalajara" ~ x + 0.2, + ine.prov.name == "Ceuta" ~ x + 0.35, + ine.prov.name == "Melilla" ~ x + 0.25, + TRUE ~ x + ), + y = case_when( + ine.prov.name == "Segovia" ~ y + 0.35, + ine.prov.name == "Coruña, A" ~ y + 0.1, + ine.prov.name == "Pontevedra" ~ y - 0.3, + ine.prov.name == "Navarra" ~ y + 0.25, + ine.prov.name == "Sevilla" ~ y + 0.25, + ine.prov.name == "Granada" ~ y - 0.15, + ine.prov.name == "Almería" ~ y - 0.1, + ine.prov.name == "Murcia" ~ y - 0.25, + ine.prov.name == "Asturias" ~ y + 0.2, + ine.prov.name == "Cantabria" ~ y + 0.2, + ine.prov.name == "Alicante/Alacant" ~ y - 0.2, + ine.prov.name == "Valencia/València" ~ y + 0.1, + ine.prov.name == "Ceuta" ~ y - 0.1, + ine.prov.name == "Melilla" ~ y + 0.1, + TRUE ~ y )) + +canarias_data <- canarias_data |> + mutate( + centroide = st_centroid(geometry), + x = st_coordinates(centroide)[,1], + y = st_coordinates(centroide)[,2], + + x = case_when(ine.prov.name == "Palmas, Las" ~ x - 0.2, + ine.prov.name == "Santa Cruz de Tenerife" ~ x - 0.3, + TRUE ~ x ), + y = case_when( + TRUE ~ y )) + +# Renaming names legend from the dataset as in the original graph +names(peninsula_data)[39] <- "Otras motivaciones*" +names(canarias_data)[39] <- "Otras motivaciones*" + +# Creation of a vector of protest motives +motivo_cols <- c( + "Temas laborales", + "Temas de inmigración", + "Asuntos vecinales", + "Contra la droga y la delincuencia", + "Apoyo a grupos terroristas", + "Libertad de presos de grupos terroristas", + "Contra el terrorismo", + "Enseñanza", + "Temas nacionalistas", + "Contra medidas políticas y legislativas", + "Sanidad", + "Agrarias", + "Ecologistas", + "Contra la violencia de género", + "1º de Mayo", + "Otras motivaciones*" +) + +# Regrouping motives as in the graphic +motivo_cols <- case_when( + motivo_cols %in% c( + "Temas de inmigración", + "Contra la droga y la delincuencia", + "Contra el terrorismo", + "Libertad de presos de grupos terroristas", + "Apoyo a grupos terroristas", + "Temas nacionalistas", + "1º de Mayo", + "Otras motivaciones*" + ) ~ "Otras motivaciones*", + TRUE ~ motivo_cols +) + +# Turning characteres into numeric in order to calculate proportions +peninsula_data <- peninsula_data %>% + mutate(across( + .cols = all_of(c(motivo_cols, "Total")), + ~ as.numeric(.) + )) + +canarias_data <- canarias_data %>% + mutate(across( + .cols = all_of(c(motivo_cols, "Total")), + ~ as.numeric(.) + )) + +# Ordering motives as in the legend from the graph +orden_deseado <- c( + "Temas laborales", + "Asuntos vecinales", + "Enseñanza", + "Contra medidas políticas\ny legislativas", + "Sanidad", + "Agrarias", + "Ecologistas", + "Contra la violencia\nde género", + "Otras motivaciones*" +) + +# Colors for each motive +colores_motivos <- c( + "Temas laborales" = "#de5424", + "Asuntos vecinales" = "#e0945d", + "Enseñanza" = "#63a4bc", + "Contra medidas políticas\ny legislativas" = "#848ab5", + "Sanidad" = "#95bb9e", + "Agrarias" = "#ebd98c", + "Ecologistas" = "#b7c27e", + "Contra la violencia\nde género"= "#a47297", + "Otras motivaciones*" = "#8a898a" +) + +# Creating data for pie charts +pies_peninsula <- peninsula_data |> + select(ine.prov.name, x, y, all_of(motivo_cols), Total) |> + pivot_longer( + cols = all_of(motivo_cols), + names_to = "motivo", + values_to = "valor") |> + mutate( + # ← AQUÍ añades el recode para cambiar los nombres + motivo = recode( + motivo, + "Contra medidas políticas y legislativas" = "Contra medidas políticas\ny legislativas", + "Contra la violencia de género" = "Contra la violencia\nde género" + ), + # Y LUEGO lo conviertes a factor con los nombres ya modificados + motivo = factor(motivo, levels = orden_deseado) + ) |> + arrange(ine.prov.name, motivo) |> + group_by(ine.prov.name) |> + mutate( + prop = valor / sum(valor, na.rm = TRUE), + angle_end = cumsum(prop) * 2 * pi, + angle_start = lag(angle_end, default = 0) + ) |> + ungroup() + +# Pie proportion for each province +max_total <- max(pies_peninsula$Total, na.rm = TRUE) +factor_escala <- 0.9 + +pies_peninsula <- pies_peninsula %>% + mutate( + radius = sqrt(Total / max_total) * factor_escala + ) + +# Same process for canary island pies +canarias_pies <- canarias_data |> + select(ine.prov.name, x, y, all_of(motivo_cols), Total) |> + pivot_longer( + cols = all_of(motivo_cols), + names_to = "motivo", + values_to = "valor") |> + mutate( + + motivo = recode( + motivo, + "Contra medidas políticas y legislativas" = "Contra medidas políticas\ny legislativas", + "Contra la violencia de género" = "Contra la violencia\nde género" + ), + + motivo = factor(motivo, levels = orden_deseado) + ) |> + arrange(ine.prov.name, motivo) |> + group_by(ine.prov.name) |> + mutate( + prop = valor / sum(valor, na.rm = TRUE), + angle_end = cumsum(prop) * 2 * pi, + angle_start = lag(angle_end, default = 0) + ) |> + ungroup() + +max_total <- max(canarias_pies$Total, na.rm = TRUE) +factor_escala <- 0.4 # Ajusta esto para círculos más grandes/pequeños + +canarias_pies <- canarias_pies %>% + mutate( + radius = sqrt(Total / max_total) * factor_escala + ) +``` + +## Pie-charts size legend + +```{r Pie-charts size Legend, fig.width=12, fig.height=7, fig.showtext=TRUE} +# STILL STRUGGLING WITH THIS + +valores_originales <- c(4251, 3498, 2464, 1579, 949, 252, 58) +etiquetas_originales <- c("4.251", "3.500", "2.500", "1.500", "1.000", "250", "58") + + +valores_reales <- rev(valores_originales) +etiquetas_display <- rev(etiquetas_originales) + +max_total_peninsula <- 4251 + +factor_escala_leyenda <- 0.00031 # Factor de escala para coordenadas geográficas + +radios <- sqrt(valores_reales / pi) * factor_escala_leyenda + +y_centers <- c(41.9, 42.05, 42.2, 42.35, 42.5, 42.65, 42.8) + 0.25 + +y_tops <- y_centers + radios + +# Tibble with all the data +legend_data <- tibble( + manifestaciones = valores_reales, + etiqueta = etiquetas_display, + radius = radios, + x = -11, # ← TODOS la misma X + y = y_centers # ← Y va subiendo +) |> + mutate( + # Punto en el borde IZQUIERDO del semicírculo (para las líneas) + x_start = x - radius, # Borde izquierdo (en lugar de x + radius) + y_start = y + ) + +``` + +## Canary island Map + +```{r Canary Island Map, fig.width=12, fig.height=7, fig.showtext=TRUE} + +mapa_canarias <- ggplot() + + + geom_sf( + data = canarias_data, + fill = "#FEFAE0", + color = "#4D5662", + linewidth = 0.3 + ) + + + ggforce::geom_arc_bar( + data = canarias_pies, + aes( + x0 = x, + y0 = y, + r0 = 0, + r = radius, + start = angle_start, + end = angle_end, + fill = motivo + ), + color = "black", + linewidth = 0.2, + alpha = 0.8 + ) + + + scale_fill_manual(values = colores_motivos) + + + coord_sf( + expand = FALSE, + clip = "off") + + theme_void() + + theme( + legend.position = "none", + plot.background = element_rect( + fill = "#e6ffff", + color = "#ffffff", + linewidth = 5 + ), + panel.background = element_blank(), + plot.margin = margin(3,3,8,33, "pt") + ) + +# Transforming the canary island into a graphical object (grob) to insert in the final map +grob_canarias <- ggplotGrob(mapa_canarias) + +mapa_canarias +``` + +## Plotting final map + +```{r Plotting final map, fig.width=12, fig.height=7, fig.showtext=TRUE} + +final_map <- ggplot() + + + # Neighbor Countries + geom_sf( + data = neighbors, + fill = "#D6D6D6", + color = "#4D5662", + linewidth = 0.3 + ) + + + # Spanish provinces + geom_sf( + data = peninsula_data, + fill = "#FEFAE0", + color = "#4D5662", + linewidth = 0.3 + ) + + + # Pie-charts + ggforce::geom_arc_bar( + data = pies_peninsula, + aes( + x0 = x, + y0 = y, + r0 = 0, + r = radius, + start = angle_start, + end = angle_end, + fill = motivo, + color = "black", + ), + color = "black", + linewidth = 0.2, + alpha = 0.8 + ) + +# Colors for protest motives +final_map <- final_map + scale_fill_manual( + values = colores_motivos) + +# Protest motives guides legend +final_map <- final_map + guides( + fill = guide_legend( + override.aes = list( + shape = 24, + size = 1.3, #2 + color = "black", + stroke = 0.4 + ), + byrow = TRUE, # ← Organiza en una sola columna + spacing.y = unit(0.8, "cm") + )) + +# Coordenates +final_map <- final_map + coord_sf(xlim = c(-11.7, 3.8), ylim = c(35.2, 44)) + +# Pie-charts size legend +final_map <- final_map + + ggforce::geom_arc_bar( + data = legend_data, + aes( + x0 = x, + y0 = y, + r0 = 0, + r = radius, + start = pi/2, # Empieza arriba (90°) + end = 3*pi/2 # Termina abajo (270°) → semicírculo IZQUIERDO + ), + color = "black", + fill = NA, + linewidth = 0.4 + ) + + + geom_segment( + data = legend_data, + aes( + x = x, # Empieza en el borde izquierdo del semicírculo + xend = x + max(radius) + 0.3, # Todas terminan a la IZQUIERDA + y = y_tops, # En la parte superior + yend = y_tops # Línea horizontal + ), + linetype = "dotted", + linewidth = 0.3, + color = "black" + ) + + + geom_text( + data = legend_data, + aes( + x = x + max(radius) + 0.4, + y = y_tops, # Alineadas con la parte superior + label = etiqueta + ), + hjust = 1, # Alineado a la derecha del texto + size = 2.5, # 4 + family = "Lexend" + ) + + + annotate( + "text", + x = -11, + y = 43.8, + label = "MANIFESTACIONES\n2022", + size = 3.7, # 6 + hjust = 0.5, + vjust = 0, + lineheight = 0.8, + fontface = "plain", + ) + +# Adding texts +final_map <- final_map + geom_text( + data = data.frame( + x = 4, + y = 44, + label = "MANIFESTACIONES SEGÚN MOTIVACIÓN" + ), + aes(x = x, y = y, label = label), + size = 5, # 8 + fontface = "bold", + hjust = 1, # alineado a la derecha + vjust = 1, # alineado arriba + color = "black" + ) + + + geom_text( + data = data.frame( + x = 4.15, + y = 35.38, + label = "Fuente: Anuario estadístico del Ministerio del Interior 2022" + ), + aes(x = x, y = y, label = label), + size = 2.5, # 4 + family = "Lexend", + hjust = 1, + vjust = 0, + color = "black" + ) + + + geom_text( + data = data.frame( + x = 4.15, + y = 34.99, + label = "Atlas Nacional de España (ANE) CC BY 4.0 ign.es\n\nParticipantes:www.ign.es/resources/ane/participantes.pdf" + ), + aes(x = x, y = y, label = label), + size = 2.5, # 4 + family = "Lexend", + hjust = 1, + vjust = 0, + color = "black", + lineheight = 0.4 + ) + + geom_text( + data = data.frame( + x = -12.2, + y = 37, + label = "*Incluye inmigración, droga y\n\ndelincuencia, apoyo a grupos\n\nterroristas, contra el terrorismo,\n\ntemas nacionalistas o 1ª de mayo\n\n\nCataluña y País Vasco sin datos" + ), + aes(x = x, y = y, label = label), + size = 2.5, # 4 + family = "Lexend", + hjust = 0, + vjust = 0, + color = "black", + lineheight = 0.5, + fontface = "bold" # ← Esto junta las dos últimas líneas + ) + +# Themes + final_map <- final_map + theme_void() + + theme( + plot.background = element_rect(fill = "#ffffff", + color = "#ffffff", + linewidth = 5), + panel.background = element_rect(fill = "#e6ffff" ), + plot.margin = margin(5), + + legend.spacing.y = unit(0.8, "cm"), + + legend.position = c(0.012, 0.52), + legend.justification = c(0, 0.5), + + legend.text = element_text( + size = 7.5, # 11.5 # hay que ajustar los valores a la escala de showtext() + family = "Lexend", + lineheight = 0.9 + ), + + legend.title = element_blank(), + legend.background = element_blank(), + + legend.key = element_rect( + fill = "#e6ffff", + color = NA ) + ) + +# Adding Grob (Canary island map) +final_map <- final_map + +annotation_custom( + grob = grob_canarias, + xmin = -12.87, + xmax = -6.63, + ymin = 34.47, + ymax = 36.8) + +# ggsave("mi_grafico.png", plot = final_map, width = 10, height = 8, dpi = 150) +# system("open mi_grafico.png") + +final_map +``` + +----------------------------------------------------------------------------------------------------------- + +# GRAPH IMPROVEMENT + +This is my initial improved version of the original graph about motive protest distribution in Spain (across autonomous communities in 2024) + +## Data Cleaning and Variable Transformation + +```{r Data Cleaning and Variable Transformation} +library(readxl) +library(dplyr) +library(tidyverse) +library(ggplot2) +library(grid) +library(showtext) +library(tidytext) +library(showtext) + +# FONTS IMPORT +font_add("Gravitas", regular = "/Users/cguirao/Library/Fonts/GravitasOne-Regular.ttf") +font_add("Sans Code", regular = " /Users/cguirao/Library/Fonts/GoogleSansCode-Regular.ttf") + # bold = "/Users/cguirao/Library/Fonts/GoogleSansCode-ExtraBold.ttf") +font_add("Sans Code Extrabold", regular = "/Users/cguirao/Library/Fonts/GoogleSansCode-ExtraBold.ttf") +font_add("Mulish", regular = "/Users/cguirao/Library/Fonts/Mulish-VariableFont_wght.ttf") +# font_add("Mulish Semibold", regular = "/Users/cguirao/Library/Fonts/Mulish-VariableFont_wght.ttf") +showtext_auto() + +#DATA IMPORT +improvdata <- read_excel("~/Desktop/datavizu/_projects/2025/100453622/ImprovementDataBase.xlsx", + sheet = "TABLA 1-3-7", + skip = 1) # skipping the title + + +improvdata <- improvdata |> rename(`Autonomous Communities` = `Comunidad autónoma y provincia`) + +improvdata <- improvdata |> filter(`Autonomous Communities` %in% c( + "Andalucía", + "Aragón", + "Asturias, Principado de", + "Balears, Illes", + "Canarias", + "Cantabria", + "Castilla y León", + "Castilla-La Mancha", + "Comunitat Valenciana", + "Extremadura", + "Galicia", + "Madrid, Comunidad de", + "Murcia, Región de", + "Navarra, Comunidad Foral de", + "Rioja, La" + )) + + +# Creating new group categories of protest motives: +improvdata <- improvdata |> rename(`Labour-Economic` = `Motivos laborales / económicos`, + `Political-Legislative` = `Contra medidas políticas / legislativas`, + `Healthcare` = `Motivos sanitarios`, + `Neighborhood Affairs` = `Movilizaciones vecinales`, + `Against Crime` = `Contra la droga / delincuencia`, + `Education` = `Movilizaciones enseñanza / educación`, + `Nationalism` = `Temas nacionalistas`, + `International Phenomena` = `Asuntos internacionales`, + `Commemorative Days` = `Conmemoración/ homenajes`, + `Religion` = `Temas religiosos`, + `Feminism` = `Contra violencia de género`, + `Other motives*` = `Otras`) + +improvdata <- improvdata |> + mutate(across( + -`Autonomous Communities`, + as.numeric + )) + +improvdata <- improvdata |> + mutate(`Enviromental Matters` = `Ecologismo` + `Cambio climático`, + `Human Rights` = `Derechos humanos` + `Contra el odio, racismo, xenofobia, etc.` + `Insumisión`, + `Terrorism`= Terrorismo + `Contra la radicalización violenta` ) |> + select(-Ecologismo, -`Cambio climático`, -`Derechos humanos`, -`Contra el odio, racismo, xenofobia, etc.`, -`Insumisión`, -Terrorismo, -`Contra la radicalización violenta`) + +improvdata <- improvdata |> relocate(Total, .after = everything()) |> relocate(`Other motives*`, .before = Total) +``` + +## Relative weights for each CCAA and Protest motive + +```{r Calculating relative weights for each CCAA and protest motive} +datos_graphs <- improvdata |> + + pivot_longer( + cols = -c(`Autonomous Communities`, Total), + names_to = "Motivo", + values_to = "Frecuencia" + ) %>% + + mutate( + Porcentaje = (Frecuencia / Total) * 100 + ) %>% + select(`Autonomous Communities`, Motivo, Porcentaje) + +# Filtering top 10 most important motives and ordering them from the most to the least +datos_graphs <- datos_graphs |> filter(Motivo %in% c( + "Labour-Economic", + "Other motives*", + "Political-Legislative", + "Neighborhood Affairs", + "International Phenomena", + "Healthcare", + "Feminism", + "Human Rights", + "Education", + "Enviromental Matters" +)) + +datos_graphs <- datos_graphs |> select(Motivo, `Autonomous Communities`, Porcentaje) |> arrange(Motivo, `Autonomous Communities`) + +# Calculating national average for each motive +national_average <- improvdata |> + + pivot_longer( + cols = -c(`Autonomous Communities`, Total), + names_to = "Motivo", + values_to = "Frecuencia" + ) |> + + group_by(Motivo) |> + + summarise( + Frecuencia_Total = sum(Frecuencia), + Total_General = sum(Total) + ) |> + + mutate( + Media_Nacional_pct = (Frecuencia_Total / Total_General) * 100 + ) |> + + select(Motivo, Media_Nacional_pct) + +# Joinning everithing in the same dataframe +datos_graphs <- datos_graphs |> left_join(national_average, by = "Motivo") + +# Creating divergence column and ordering its values +datos_graphs <- datos_graphs |> + mutate(Divergencia = Porcentaje - Media_Nacional_pct, + CCAA_ordenada = reorder_within(`Autonomous Communities`, Divergencia, Motivo)) + # ¿Qué hace reorder_within()?\n") + # 1. Toma cada CCAA (ej: 'Aragón')\n") + # 2. Le añade el motivo: 'Aragón___Education'\n") + # 3. Ordena por Divergencia DENTRO de cada motivo\n") + # 4. Resultado: orden correcto en cada faceta\n\n") + +# Changing names (ABREVIATURAS?) +datos_graphs <- datos_graphs |> + mutate( + `Autonomous Communities` = recode( + `Autonomous Communities`, + "Murcia, Región de" = "Murcia", + "Navarra, Comunidad Foral de" = "Navarra", + "Madrid, Comunidad de" = "Madrid", + "Asturias, Principado de" = "Asturias", + "Balears, Illes" = "Baleares", + "Rioja, La" = "La Rioja", + "Comunitat Valenciana" = "Comunidad Valenciana" + ) + ) + +# Choosing colors for each CCAA +colores_CCAA <- c( + "Andalucía" = "#EFCE7B", + "Aragón" = "#2B2B23", + "Asturias" = "#238BB0", + "Balears" = "#D8560E", + "Canarias" = "#B28622", + "Cantabria" = "#92A2A6", + "Castilla y León" = "#849E15", + "Castilla-La Mancha" = "#6D1F42", + "Comunidad Valenciana" = "#876929", + "Extremadura" = "#25533F", + "Galicia" = "#F4BEAE", + "Madrid" = "#105666", + "Navarra" = "#976D90", + "La Rioja" = "#D9CBC2", + "Murcia" = "#112250") + +# Creating text labels with national average value for each motive +datos_graphs <- datos_graphs %>% + mutate( + Motivo_label = paste0(Motivo, "\n(avg: ", + round(Media_Nacional_pct, 1), + "%)")) +``` + +## Plotting the graph + +```{r Plotting the final version, fig.width=16, fig.height=10, fig.showtext=TRUE} +g <- ggplot(datos_graphs, aes(x = Divergencia, y = CCAA_ordenada)) + +# Creating color-filled bars with CCAA categories +g <- g + geom_col(aes(fill = `Autonomous Communities`), width = 0.7, alpha = 0.85) + +# Creating middle-line representing average values +g <- g + geom_vline(xintercept = 0, linewidth = 0.3, color = "#6B6B6B") + +# Doing faceting +g <- g + facet_wrap(~ Motivo_label, ncol = 5, scales = "free_y") + #labeller = labeller(group = label_wrap_gen(width = 25))) + +# Colors +g <- g + scale_fill_manual(values = colores_CCAA) + + scale_x_continuous(labels = function(x) sprintf("%+.1f", x)) + + scale_y_reordered() + +# Labs +g <- g + labs(title = "Divergences in Protest Activity and Motives Across Spanish Autonomous Communities, 2024", x = NULL, y = NULL) + +# Text +g <- g + geom_text( + aes( + label = paste0(`Autonomous Communities`, " (", round(Porcentaje, 1), "%)"), + x = Divergencia, # Posición X = final de la barra + hjust = if_else(Divergencia >= 0, -0.05, 1.05) # Ajustar según lado + ), + size = 2.6, # 1.5 html # Tamaño nombres CCAA + family = "Mulish", + fontface = "plain" +) + +# Themes +g <- g + theme_void() + + theme( + panel.spacing = unit(0.25, "cm"), + plot.background = element_rect(fill = "#EFE7DA"), + panel.background = element_rect(fill = "#EFE7DA" ), + plot.margin = margin(10, 10, 30, 10), + aspect.ratio = 1.5, + plot.title = element_text( + size = 15, # 7.5 para html, # Tamaño título principal + fontface = "plain", + family = "Gravitas", + hjust = 0.5, # Centrado (0 = izq, 0.5 = centro, 1 = der) + margin = margin(b = 17) # Espacio abajo + ), + strip.text = element_text( + size = 9.3, # 5 para html --> 5.7 + fontface = "regular", + family = "Sans Code Extrabold", + hjust = 0, + color = "#3D211A", + ), + legend.position = "none" + ) + +g +``` + + diff --git a/_projects/2025/100453622/100453622.html b/_projects/2025/100453622/100453622.html new file mode 100644 index 00000000..dad34f60 --- /dev/null +++ b/_projects/2025/100453622/100453622.html @@ -0,0 +1,2410 @@ + + + + +
+ + + + + + + + + + + + + + + +Replication and Improvement of the chosen graph and database
+This is the initial version of the graph replication about motive protest distribution across spanish provinces in 2022.
+library(readxl)
+library(dplyr)
+library(tidyverse)
+library(sf)
+library(mapSpain)
+library(rnaturalearth)
+library(rnaturalearthdata)
+library(ggplot2)
+library(grid)
+#library(extrafont)
+library(showtext)
+
+# Font adding
+font_add("Lexend", regular = "/Users/cguirao/Library/Fonts/LexendDeca-VariableFont_wght.ttf") # needed font for the graph
+showtext_auto()
+
+# Data import
+protests <- read_excel("~/Desktop/datavizu/_projects/2025/100453622/ReplicationDataBase.xlsx",
+ sheet = "TABLA 1-3-7",
+ skip = 1) # skipping the title
+
+prov <- esp_get_prov()
+
+library(giscoR)
+neighbors <- gisco_get_countries(
+ country = c("Portugal", "France", "Morocco", "Algeria", "Andorra"))
+
+# Adding those that are left bc they are named differently in INE
+protests <- protests |>
+ mutate(
+ `Comunidad autónoma y provincia` = recode(
+ `Comunidad autónoma y provincia`,
+ "Murcia, Región de" = "Murcia",
+ "Navarra, Comunidad Foral de" = "Navarra",
+ "Madrid, Comunidad de" = "Madrid",
+ "Asturias, Principado de" = "Asturias"
+ )
+ )
+
+# Filter only provinces
+data_prov <- protests %>%
+ filter(`Comunidad autónoma y provincia` %in% prov$ine.prov.name)
+
+# Jonning shapefile with filtered dataframe
+protest_prov <- prov %>%
+ left_join(data_prov,
+ by = c("ine.prov.name" = "Comunidad autónoma y provincia"))
+
+# Creating data for canary islands map
+canarias_data <- protest_prov %>%
+ filter(ine.prov.name %in% c("Palmas, Las", "Santa Cruz de Tenerife"))
+
+# Creating data for peninsula and baleares islands map
+peninsula_data <- protest_prov %>%
+ filter(!ine.prov.name %in% c("Palmas, Las", "Santa Cruz de Tenerife"))
+
+# Obtaining coordenates of each province
+peninsula_data <- peninsula_data |>
+ mutate(
+ centroide = st_centroid(geometry),
+ x = st_coordinates(centroide)[,1],
+ y = st_coordinates(centroide)[,2],
+
+ x = case_when(
+ ine.prov.name == "Segovia" ~ x + 0.2,
+ ine.prov.name == "Toledo" ~ x - 0.45,
+ ine.prov.name == "Pontevedra" ~ x - 0.2,
+ ine.prov.name == "Sevilla" ~ x - 0.05,
+ ine.prov.name == "Granada" ~ x - 0.4,
+ ine.prov.name == "Almería" ~ x + 0.1,
+ ine.prov.name == "Murcia" ~ x + 0.1,
+ ine.prov.name == "Alicante/Alacant" ~ x + 0.25,
+ ine.prov.name == "Castellón/Castelló" ~ x + 0.25,
+ ine.prov.name == "Valencia/València" ~ x + 0.4,
+ ine.prov.name == "Balears, Illes" ~ x - 0.3,
+ ine.prov.name == "Guadalajara" ~ x + 0.2,
+ ine.prov.name == "Ceuta" ~ x + 0.35,
+ ine.prov.name == "Melilla" ~ x + 0.25,
+ TRUE ~ x
+ ),
+ y = case_when(
+ ine.prov.name == "Segovia" ~ y + 0.35,
+ ine.prov.name == "Coruña, A" ~ y + 0.1,
+ ine.prov.name == "Pontevedra" ~ y - 0.3,
+ ine.prov.name == "Navarra" ~ y + 0.25,
+ ine.prov.name == "Sevilla" ~ y + 0.25,
+ ine.prov.name == "Granada" ~ y - 0.15,
+ ine.prov.name == "Almería" ~ y - 0.1,
+ ine.prov.name == "Murcia" ~ y - 0.25,
+ ine.prov.name == "Asturias" ~ y + 0.2,
+ ine.prov.name == "Cantabria" ~ y + 0.2,
+ ine.prov.name == "Alicante/Alacant" ~ y - 0.2,
+ ine.prov.name == "Valencia/València" ~ y + 0.1,
+ ine.prov.name == "Ceuta" ~ y - 0.1,
+ ine.prov.name == "Melilla" ~ y + 0.1,
+ TRUE ~ y ))
+
+canarias_data <- canarias_data |>
+ mutate(
+ centroide = st_centroid(geometry),
+ x = st_coordinates(centroide)[,1],
+ y = st_coordinates(centroide)[,2],
+
+ x = case_when(ine.prov.name == "Palmas, Las" ~ x - 0.2,
+ ine.prov.name == "Santa Cruz de Tenerife" ~ x - 0.3,
+ TRUE ~ x ),
+ y = case_when(
+ TRUE ~ y ))
+
+# Renaming names legend from the dataset as in the original graph
+names(peninsula_data)[39] <- "Otras motivaciones*"
+names(canarias_data)[39] <- "Otras motivaciones*"
+
+# Creation of a vector of protest motives
+motivo_cols <- c(
+ "Temas laborales",
+ "Temas de inmigración",
+ "Asuntos vecinales",
+ "Contra la droga y la delincuencia",
+ "Apoyo a grupos terroristas",
+ "Libertad de presos de grupos terroristas",
+ "Contra el terrorismo",
+ "Enseñanza",
+ "Temas nacionalistas",
+ "Contra medidas políticas y legislativas",
+ "Sanidad",
+ "Agrarias",
+ "Ecologistas",
+ "Contra la violencia de género",
+ "1º de Mayo",
+ "Otras motivaciones*"
+)
+
+# Regrouping motives as in the graphic
+motivo_cols <- case_when(
+ motivo_cols %in% c(
+ "Temas de inmigración",
+ "Contra la droga y la delincuencia",
+ "Contra el terrorismo",
+ "Libertad de presos de grupos terroristas",
+ "Apoyo a grupos terroristas",
+ "Temas nacionalistas",
+ "1º de Mayo",
+ "Otras motivaciones*"
+ ) ~ "Otras motivaciones*",
+ TRUE ~ motivo_cols
+)
+
+# Turning characteres into numeric in order to calculate proportions
+peninsula_data <- peninsula_data %>%
+ mutate(across(
+ .cols = all_of(c(motivo_cols, "Total")),
+ ~ as.numeric(.)
+ ))
+
+canarias_data <- canarias_data %>%
+ mutate(across(
+ .cols = all_of(c(motivo_cols, "Total")),
+ ~ as.numeric(.)
+ ))
+
+# Ordering motives as in the legend from the graph
+orden_deseado <- c(
+ "Temas laborales",
+ "Asuntos vecinales",
+ "Enseñanza",
+ "Contra medidas políticas\ny legislativas",
+ "Sanidad",
+ "Agrarias",
+ "Ecologistas",
+ "Contra la violencia\nde género",
+ "Otras motivaciones*"
+)
+
+# Colors for each motive
+colores_motivos <- c(
+ "Temas laborales" = "#de5424",
+ "Asuntos vecinales" = "#e0945d",
+ "Enseñanza" = "#63a4bc",
+ "Contra medidas políticas\ny legislativas" = "#848ab5",
+ "Sanidad" = "#95bb9e",
+ "Agrarias" = "#ebd98c",
+ "Ecologistas" = "#b7c27e",
+ "Contra la violencia\nde género"= "#a47297",
+ "Otras motivaciones*" = "#8a898a"
+)
+
+# Creating data for pie charts
+pies_peninsula <- peninsula_data |>
+ select(ine.prov.name, x, y, all_of(motivo_cols), Total) |>
+ pivot_longer(
+ cols = all_of(motivo_cols),
+ names_to = "motivo",
+ values_to = "valor") |>
+ mutate(
+ # ← AQUÍ añades el recode para cambiar los nombres
+ motivo = recode(
+ motivo,
+ "Contra medidas políticas y legislativas" = "Contra medidas políticas\ny legislativas",
+ "Contra la violencia de género" = "Contra la violencia\nde género"
+ ),
+ # Y LUEGO lo conviertes a factor con los nombres ya modificados
+ motivo = factor(motivo, levels = orden_deseado)
+ ) |>
+ arrange(ine.prov.name, motivo) |>
+ group_by(ine.prov.name) |>
+ mutate(
+ prop = valor / sum(valor, na.rm = TRUE),
+ angle_end = cumsum(prop) * 2 * pi,
+ angle_start = lag(angle_end, default = 0)
+ ) |>
+ ungroup()
+
+# Pie proportion for each province
+max_total <- max(pies_peninsula$Total, na.rm = TRUE)
+factor_escala <- 0.9
+
+pies_peninsula <- pies_peninsula %>%
+ mutate(
+ radius = sqrt(Total / max_total) * factor_escala
+ )
+
+# Same process for canary island pies
+canarias_pies <- canarias_data |>
+ select(ine.prov.name, x, y, all_of(motivo_cols), Total) |>
+ pivot_longer(
+ cols = all_of(motivo_cols),
+ names_to = "motivo",
+ values_to = "valor") |>
+ mutate(
+
+ motivo = recode(
+ motivo,
+ "Contra medidas políticas y legislativas" = "Contra medidas políticas\ny legislativas",
+ "Contra la violencia de género" = "Contra la violencia\nde género"
+ ),
+
+ motivo = factor(motivo, levels = orden_deseado)
+ ) |>
+ arrange(ine.prov.name, motivo) |>
+ group_by(ine.prov.name) |>
+ mutate(
+ prop = valor / sum(valor, na.rm = TRUE),
+ angle_end = cumsum(prop) * 2 * pi,
+ angle_start = lag(angle_end, default = 0)
+ ) |>
+ ungroup()
+
+max_total <- max(canarias_pies$Total, na.rm = TRUE)
+factor_escala <- 0.4 # Ajusta esto para círculos más grandes/pequeños
+
+canarias_pies <- canarias_pies %>%
+ mutate(
+ radius = sqrt(Total / max_total) * factor_escala
+ )
+# STILL STRUGGLING WITH THIS
+
+valores_originales <- c(4251, 3498, 2464, 1579, 949, 252, 58)
+etiquetas_originales <- c("4.251", "3.500", "2.500", "1.500", "1.000", "250", "58")
+
+
+valores_reales <- rev(valores_originales)
+etiquetas_display <- rev(etiquetas_originales)
+
+max_total_peninsula <- 4251
+
+factor_escala_leyenda <- 0.00031 # Factor de escala para coordenadas geográficas
+
+radios <- sqrt(valores_reales / pi) * factor_escala_leyenda
+
+y_centers <- c(41.9, 42.05, 42.2, 42.35, 42.5, 42.65, 42.8) + 0.25
+
+y_tops <- y_centers + radios
+
+# Tibble with all the data
+legend_data <- tibble(
+ manifestaciones = valores_reales,
+ etiqueta = etiquetas_display,
+ radius = radios,
+ x = -11, # ← TODOS la misma X
+ y = y_centers # ← Y va subiendo
+) |>
+ mutate(
+ # Punto en el borde IZQUIERDO del semicírculo (para las líneas)
+ x_start = x - radius, # Borde izquierdo (en lugar de x + radius)
+ y_start = y
+ )
+mapa_canarias <- ggplot() +
+
+ geom_sf(
+ data = canarias_data,
+ fill = "#FEFAE0",
+ color = "#4D5662",
+ linewidth = 0.3
+ ) +
+
+ ggforce::geom_arc_bar(
+ data = canarias_pies,
+ aes(
+ x0 = x,
+ y0 = y,
+ r0 = 0,
+ r = radius,
+ start = angle_start,
+ end = angle_end,
+ fill = motivo
+ ),
+ color = "black",
+ linewidth = 0.2,
+ alpha = 0.8
+ ) +
+
+ scale_fill_manual(values = colores_motivos) +
+
+ coord_sf(
+ expand = FALSE,
+ clip = "off") +
+ theme_void() +
+ theme(
+ legend.position = "none",
+ plot.background = element_rect(
+ fill = "#e6ffff",
+ color = "#ffffff",
+ linewidth = 5
+ ),
+ panel.background = element_blank(),
+ plot.margin = margin(3,3,8,33, "pt")
+ )
+
+# Transforming the canary island into a graphical object (grob) to insert in the final map
+grob_canarias <- ggplotGrob(mapa_canarias)
+
+mapa_canarias
+
final_map <- ggplot() +
+
+ # Neighbor Countries
+ geom_sf(
+ data = neighbors,
+ fill = "#D6D6D6",
+ color = "#4D5662",
+ linewidth = 0.3
+ ) +
+
+ # Spanish provinces
+ geom_sf(
+ data = peninsula_data,
+ fill = "#FEFAE0",
+ color = "#4D5662",
+ linewidth = 0.3
+ ) +
+
+ # Pie-charts
+ ggforce::geom_arc_bar(
+ data = pies_peninsula,
+ aes(
+ x0 = x,
+ y0 = y,
+ r0 = 0,
+ r = radius,
+ start = angle_start,
+ end = angle_end,
+ fill = motivo,
+ color = "black",
+ ),
+ color = "black",
+ linewidth = 0.2,
+ alpha = 0.8
+ )
+
+# Colors for protest motives
+final_map <- final_map + scale_fill_manual(
+ values = colores_motivos)
+
+# Protest motives guides legend
+final_map <- final_map + guides(
+ fill = guide_legend(
+ override.aes = list(
+ shape = 24,
+ size = 1.3, #2
+ color = "black",
+ stroke = 0.4
+ ),
+ byrow = TRUE, # ← Organiza en una sola columna
+ spacing.y = unit(0.8, "cm")
+ ))
+
+# Coordenates
+final_map <- final_map + coord_sf(xlim = c(-11.7, 3.8), ylim = c(35.2, 44))
+
+# Pie-charts size legend
+final_map <- final_map +
+ ggforce::geom_arc_bar(
+ data = legend_data,
+ aes(
+ x0 = x,
+ y0 = y,
+ r0 = 0,
+ r = radius,
+ start = pi/2, # Empieza arriba (90°)
+ end = 3*pi/2 # Termina abajo (270°) → semicírculo IZQUIERDO
+ ),
+ color = "black",
+ fill = NA,
+ linewidth = 0.4
+ ) +
+
+ geom_segment(
+ data = legend_data,
+ aes(
+ x = x, # Empieza en el borde izquierdo del semicírculo
+ xend = x + max(radius) + 0.3, # Todas terminan a la IZQUIERDA
+ y = y_tops, # En la parte superior
+ yend = y_tops # Línea horizontal
+ ),
+ linetype = "dotted",
+ linewidth = 0.3,
+ color = "black"
+ ) +
+
+ geom_text(
+ data = legend_data,
+ aes(
+ x = x + max(radius) + 0.4,
+ y = y_tops, # Alineadas con la parte superior
+ label = etiqueta
+ ),
+ hjust = 1, # Alineado a la derecha del texto
+ size = 2.5, # 4
+ family = "Lexend"
+ ) +
+
+ annotate(
+ "text",
+ x = -11,
+ y = 43.8,
+ label = "MANIFESTACIONES\n2022",
+ size = 3.7, # 6
+ hjust = 0.5,
+ vjust = 0,
+ lineheight = 0.8,
+ fontface = "plain",
+ )
+
+# Adding texts
+final_map <- final_map + geom_text(
+ data = data.frame(
+ x = 4,
+ y = 44,
+ label = "MANIFESTACIONES SEGÚN MOTIVACIÓN"
+ ),
+ aes(x = x, y = y, label = label),
+ size = 5, # 8
+ fontface = "bold",
+ hjust = 1, # alineado a la derecha
+ vjust = 1, # alineado arriba
+ color = "black"
+ ) +
+
+ geom_text(
+ data = data.frame(
+ x = 4.15,
+ y = 35.38,
+ label = "Fuente: Anuario estadístico del Ministerio del Interior 2022"
+ ),
+ aes(x = x, y = y, label = label),
+ size = 2.5, # 4
+ family = "Lexend",
+ hjust = 1,
+ vjust = 0,
+ color = "black"
+ ) +
+
+ geom_text(
+ data = data.frame(
+ x = 4.15,
+ y = 34.99,
+ label = "Atlas Nacional de España (ANE) CC BY 4.0 ign.es\n\nParticipantes:www.ign.es/resources/ane/participantes.pdf"
+ ),
+ aes(x = x, y = y, label = label),
+ size = 2.5, # 4
+ family = "Lexend",
+ hjust = 1,
+ vjust = 0,
+ color = "black",
+ lineheight = 0.4
+ ) +
+ geom_text(
+ data = data.frame(
+ x = -12.2,
+ y = 37,
+ label = "*Incluye inmigración, droga y\n\ndelincuencia, apoyo a grupos\n\nterroristas, contra el terrorismo,\n\ntemas nacionalistas o 1ª de mayo\n\n\nCataluña y País Vasco sin datos"
+ ),
+ aes(x = x, y = y, label = label),
+ size = 2.5, # 4
+ family = "Lexend",
+ hjust = 0,
+ vjust = 0,
+ color = "black",
+ lineheight = 0.5,
+ fontface = "bold" # ← Esto junta las dos últimas líneas
+ )
+
+# Themes
+ final_map <- final_map + theme_void() +
+ theme(
+ plot.background = element_rect(fill = "#ffffff",
+ color = "#ffffff",
+ linewidth = 5),
+ panel.background = element_rect(fill = "#e6ffff" ),
+ plot.margin = margin(5),
+
+ legend.spacing.y = unit(0.8, "cm"),
+
+ legend.position = c(0.012, 0.52),
+ legend.justification = c(0, 0.5),
+
+ legend.text = element_text(
+ size = 7.5, # 11.5 # hay que ajustar los valores a la escala de showtext()
+ family = "Lexend",
+ lineheight = 0.9
+ ),
+
+ legend.title = element_blank(),
+ legend.background = element_blank(),
+
+ legend.key = element_rect(
+ fill = "#e6ffff",
+ color = NA )
+ )
+
+# Adding Grob (Canary island map)
+final_map <- final_map +
+annotation_custom(
+ grob = grob_canarias,
+ xmin = -12.87,
+ xmax = -6.63,
+ ymin = 34.47,
+ ymax = 36.8)
+
+# ggsave("mi_grafico.png", plot = final_map, width = 10, height = 8, dpi = 150)
+# system("open mi_grafico.png")
+
+final_map
+
This is my initial improved version of the original graph about motive protest distribution in Spain (across autonomous communities in 2024)
+library(readxl)
+library(dplyr)
+library(tidyverse)
+library(ggplot2)
+library(grid)
+library(showtext)
+library(tidytext)
+library(showtext)
+
+# FONTS IMPORT
+font_add("Gravitas", regular = "/Users/cguirao/Library/Fonts/GravitasOne-Regular.ttf")
+font_add("Sans Code", regular = " /Users/cguirao/Library/Fonts/GoogleSansCode-Regular.ttf")
+ # bold = "/Users/cguirao/Library/Fonts/GoogleSansCode-ExtraBold.ttf")
+font_add("Sans Code Extrabold", regular = "/Users/cguirao/Library/Fonts/GoogleSansCode-ExtraBold.ttf")
+font_add("Mulish", regular = "/Users/cguirao/Library/Fonts/Mulish-VariableFont_wght.ttf")
+# font_add("Mulish Semibold", regular = "/Users/cguirao/Library/Fonts/Mulish-VariableFont_wght.ttf")
+showtext_auto()
+
+#DATA IMPORT
+improvdata <- read_excel("~/Desktop/datavizu/_projects/2025/100453622/ImprovementDataBase.xlsx",
+ sheet = "TABLA 1-3-7",
+ skip = 1) # skipping the title
+
+
+improvdata <- improvdata |> rename(`Autonomous Communities` = `Comunidad autónoma y provincia`)
+
+improvdata <- improvdata |> filter(`Autonomous Communities` %in% c(
+ "Andalucía",
+ "Aragón",
+ "Asturias, Principado de",
+ "Balears, Illes",
+ "Canarias",
+ "Cantabria",
+ "Castilla y León",
+ "Castilla-La Mancha",
+ "Comunitat Valenciana",
+ "Extremadura",
+ "Galicia",
+ "Madrid, Comunidad de",
+ "Murcia, Región de",
+ "Navarra, Comunidad Foral de",
+ "Rioja, La"
+ ))
+
+
+# Creating new group categories of protest motives:
+improvdata <- improvdata |> rename(`Labour-Economic` = `Motivos laborales / económicos`,
+ `Political-Legislative` = `Contra medidas políticas / legislativas`,
+ `Healthcare` = `Motivos sanitarios`,
+ `Neighborhood Affairs` = `Movilizaciones vecinales`,
+ `Against Crime` = `Contra la droga / delincuencia`,
+ `Education` = `Movilizaciones enseñanza / educación`,
+ `Nationalism` = `Temas nacionalistas`,
+ `International Phenomena` = `Asuntos internacionales`,
+ `Commemorative Days` = `Conmemoración/ homenajes`,
+ `Religion` = `Temas religiosos`,
+ `Feminism` = `Contra violencia de género`,
+ `Other motives*` = `Otras`)
+
+improvdata <- improvdata |>
+ mutate(across(
+ -`Autonomous Communities`,
+ as.numeric
+ ))
+
+improvdata <- improvdata |>
+ mutate(`Enviromental Matters` = `Ecologismo` + `Cambio climático`,
+ `Human Rights` = `Derechos humanos` + `Contra el odio, racismo, xenofobia, etc.` + `Insumisión`,
+ `Terrorism`= Terrorismo + `Contra la radicalización violenta` ) |>
+ select(-Ecologismo, -`Cambio climático`, -`Derechos humanos`, -`Contra el odio, racismo, xenofobia, etc.`, -`Insumisión`, -Terrorismo, -`Contra la radicalización violenta`)
+
+improvdata <- improvdata |> relocate(Total, .after = everything()) |> relocate(`Other motives*`, .before = Total)
+datos_graphs <- improvdata |>
+
+ pivot_longer(
+ cols = -c(`Autonomous Communities`, Total),
+ names_to = "Motivo",
+ values_to = "Frecuencia"
+ ) %>%
+
+ mutate(
+ Porcentaje = (Frecuencia / Total) * 100
+ ) %>%
+ select(`Autonomous Communities`, Motivo, Porcentaje)
+
+# Filtering top 10 most important motives and ordering them from the most to the least
+datos_graphs <- datos_graphs |> filter(Motivo %in% c(
+ "Labour-Economic",
+ "Other motives*",
+ "Political-Legislative",
+ "Neighborhood Affairs",
+ "International Phenomena",
+ "Healthcare",
+ "Feminism",
+ "Human Rights",
+ "Education",
+ "Enviromental Matters"
+))
+
+datos_graphs <- datos_graphs |> select(Motivo, `Autonomous Communities`, Porcentaje) |> arrange(Motivo, `Autonomous Communities`)
+
+# Calculating national average for each motive
+national_average <- improvdata |>
+
+ pivot_longer(
+ cols = -c(`Autonomous Communities`, Total),
+ names_to = "Motivo",
+ values_to = "Frecuencia"
+ ) |>
+
+ group_by(Motivo) |>
+
+ summarise(
+ Frecuencia_Total = sum(Frecuencia),
+ Total_General = sum(Total)
+ ) |>
+
+ mutate(
+ Media_Nacional_pct = (Frecuencia_Total / Total_General) * 100
+ ) |>
+
+ select(Motivo, Media_Nacional_pct)
+
+# Joinning everithing in the same dataframe
+datos_graphs <- datos_graphs |> left_join(national_average, by = "Motivo")
+
+# Creating divergence column and ordering its values
+datos_graphs <- datos_graphs |>
+ mutate(Divergencia = Porcentaje - Media_Nacional_pct,
+ CCAA_ordenada = reorder_within(`Autonomous Communities`, Divergencia, Motivo))
+ # ¿Qué hace reorder_within()?\n")
+ # 1. Toma cada CCAA (ej: 'Aragón')\n")
+ # 2. Le añade el motivo: 'Aragón___Education'\n")
+ # 3. Ordena por Divergencia DENTRO de cada motivo\n")
+ # 4. Resultado: orden correcto en cada faceta\n\n")
+
+# Changing names (ABREVIATURAS?)
+datos_graphs <- datos_graphs |>
+ mutate(
+ `Autonomous Communities` = recode(
+ `Autonomous Communities`,
+ "Murcia, Región de" = "Murcia",
+ "Navarra, Comunidad Foral de" = "Navarra",
+ "Madrid, Comunidad de" = "Madrid",
+ "Asturias, Principado de" = "Asturias",
+ "Balears, Illes" = "Baleares",
+ "Rioja, La" = "La Rioja",
+ "Comunitat Valenciana" = "Comunidad Valenciana"
+ )
+ )
+
+# Choosing colors for each CCAA
+colores_CCAA <- c(
+ "Andalucía" = "#EFCE7B",
+ "Aragón" = "#2B2B23",
+ "Asturias" = "#238BB0",
+ "Balears" = "#D8560E",
+ "Canarias" = "#B28622",
+ "Cantabria" = "#92A2A6",
+ "Castilla y León" = "#849E15",
+ "Castilla-La Mancha" = "#6D1F42",
+ "Comunidad Valenciana" = "#876929",
+ "Extremadura" = "#25533F",
+ "Galicia" = "#F4BEAE",
+ "Madrid" = "#105666",
+ "Navarra" = "#976D90",
+ "La Rioja" = "#D9CBC2",
+ "Murcia" = "#112250")
+
+# Creating text labels with national average value for each motive
+datos_graphs <- datos_graphs %>%
+ mutate(
+ Motivo_label = paste0(Motivo, "\n(avg: ",
+ round(Media_Nacional_pct, 1),
+ "%)"))
+g <- ggplot(datos_graphs, aes(x = Divergencia, y = CCAA_ordenada))
+
+# Creating color-filled bars with CCAA categories
+g <- g + geom_col(aes(fill = `Autonomous Communities`), width = 0.7, alpha = 0.85)
+
+# Creating middle-line representing average values
+g <- g + geom_vline(xintercept = 0, linewidth = 0.3, color = "#6B6B6B")
+
+# Doing faceting
+g <- g + facet_wrap(~ Motivo_label, ncol = 5, scales = "free_y")
+ #labeller = labeller(group = label_wrap_gen(width = 25)))
+
+# Colors
+g <- g + scale_fill_manual(values = colores_CCAA) +
+ scale_x_continuous(labels = function(x) sprintf("%+.1f", x)) +
+ scale_y_reordered()
+
+# Labs
+g <- g + labs(title = "Divergences in Protest Activity and Motives Across Spanish Autonomous Communities, 2024", x = NULL, y = NULL)
+
+# Text
+g <- g + geom_text(
+ aes(
+ label = paste0(`Autonomous Communities`, " (", round(Porcentaje, 1), "%)"),
+ x = Divergencia, # Posición X = final de la barra
+ hjust = if_else(Divergencia >= 0, -0.05, 1.05) # Ajustar según lado
+ ),
+ size = 2.6, # 1.5 html # Tamaño nombres CCAA
+ family = "Mulish",
+ fontface = "plain"
+)
+
+# Themes
+g <- g + theme_void() +
+ theme(
+ panel.spacing = unit(0.25, "cm"),
+ plot.background = element_rect(fill = "#EFE7DA"),
+ panel.background = element_rect(fill = "#EFE7DA" ),
+ plot.margin = margin(10, 10, 30, 10),
+ aspect.ratio = 1.5,
+ plot.title = element_text(
+ size = 15, # 7.5 para html, # Tamaño título principal
+ fontface = "plain",
+ family = "Gravitas",
+ hjust = 0.5, # Centrado (0 = izq, 0.5 = centro, 1 = der)
+ margin = margin(b = 17) # Espacio abajo
+ ),
+ strip.text = element_text(
+ size = 9.3, # 5 para html --> 5.7
+ fontface = "regular",
+ family = "Sans Code Extrabold",
+ hjust = 0,
+ color = "#3D211A",
+ ),
+ legend.position = "none"
+ )
+
+g
+
ej7FK5HTj%Ozb~lm%^R5Mw!3HX9BE>p_*eYa%wgk0PV?I z2=!xU2LGv*1b*NdRO!shVzQ!tk5V&Bj~fOnb(D-*aU7V*Oj+PBI!yV7ru!qu*dA@r z)Et?~Y%-j)zfK@mx=GDZLm)f=1gjO2&SfPMxsi>+pnb=N%< zMwv>!^+L7S>e0M^u+?^w+ToAjW)06lRafMuw*8_rusjL+>Q!b&eEL8iD_ fnQKL-&l3StOo3nn$5M||%7`baXD-!edL!+4-c7o!L;P^017 zolxLBthG8?Te-$&B(6I#eu79Z(3CkrN=h6XGXw{tNdUo8bt`zsZ%YCIj*IHkH0ROA z(9e|Z8R+AiK?7@NT?&IfDxJ@(QI3C<8t5bmi*ZGU)!wIc6dI0^-?LPSOY6hZ`CNQv zkt!2n6GNIG=$1lC|G;W%<+CzT+;0+CkjP7WzgPRS++0wLqfbd)HG_~K1r+(HmsLQ% zz}S1C4&q`qf}%DYv*{hb19u5IzOZH}04w5=PL6fy7UzpTV**Dfwje*8+IuH~8Zn#Sm{1WGD^QjLyw Fp>^(IGG0qSa2g_E&6-; ztdB Zm>oU3W*`$WtWg^*TP`~J7>B#>Zk*|xjw%98aeermzIfVDdqnGOPv*UuHHfn; z4c_~FgFp6_cmJ@wXv-yS+pxU5s-ZxFp#odM9c}fhJijeQ6lwW=gLLd|qzE#-7?Qf3 z3(!j2rNA~{lg|<{Zaj?R8cn`p%hps3j0%tn@gO1vCKc;XiEwekKt7?R*E>*;J*n7u zR^I 6e rd0bmQ_BPa{Lfo67Tf`)cOw;jKFX#me zdjVt+{B|6H@UfxOwVEQ9Bn(XLl=+jOhYsfUO_2P=Rf@KBOonm^Bq6h8;4ux5O@N{m zu?u8+wZYt*mquQR&E#FBH~d*G57NKb7mU9+1%^=*Rdu@?&Y>YOXJM74&kbLGsR`Mj zUt9Y2@1Su6MBAKVU{#F}@N77H-&HOBxSi3`TV5XHN?0dKdSY-L8``g<195#u8+8d# zOMfawB;j
|$;S`f{Mn3j}DU&L9_thn;i7^gP5}=Qw29ld)26)VGnS5yFKwyOh zGAwONXsEJI3{A!hLYM7|{CEcgtiFXuWn!|0Rd5^4$8%_H7u=vJo4d|Kl2G+q9zszI zOcT~gqoA7%Ep4BlBnHSKBT16$^WbiK1VXk0T$9! eU<=LbYp8H)VY886!(WJhFl=>&KyDmmW}JQ za61j x&772?q}n2_r+cy<;!h7)6~ZR$*{dFf#f@%$GQ*sz ^Suwqg ^%n0#?uU6=2+CX0pHy|LRCrj>$Ki;DMJx zbG;=Z%Jl|cdE#zhDvI?yd3EFIEhS0iDKBa+oWxmHLz)vBS|2~cKl}sHm?MeUJZ01Y zC21U-D{xWVba(tvSebTanb;%R`V42q1v=Zu2aGB6O|`=YmS|Svl4{R4K?6}Pzmm3? z0z358v(KxRf}$2*g)Kel*tJyZd06sY7N|bXnYc_(c-cgPq~{RiDzYF@Yshqk-`a-j ztq@XATRww~NScoeCGx(&1 ^+eHPTN_SRFhRwn$8^So4FNlso0j zVs{){KHVgWT3-Q!IvbjmXt_q@0^3`+kN^Fu&CEL}Z4db&!;~Mrf-EGrB}9)?Ss14X z1KvhO*aoJr-7Jq)U`rAzThtqAgKyU!i`a>tF#~kC2C>WX!?OtSifj}LxFLKN$aYnU z<;xkRfso~OvPA1C=!lkTt)43qCB@;^{0m5_EQ+5OAe+4f?vytO?lhhgXwpDo{DK5f zTLw%xtgy@G4B>2n;*TuA^PhgBGh>O}A?rBUOhKS;q(lZA5zVwvxR9mn69~60Caw?s z$*m*~de~3|#=Ur)$n9|y#HQS03EqCc5#L9WZvo%-1xtfc|B*w5<-rs5Xd5ie^P6Xp z0aASzAYjyU{+<|AO)*j}iBxevk^3GRh``Mdcw4+-)@FMA6n7fC#5L5uORfk& #lw^!j%%cx@@-9(PY`<{t&u6{%c&rf?GwsFd3;*n$ tc)%W9T&Fw3RWR>qJ3XdVCdMH@a~As@vYmW7tbsx~ zR#sXh;$D+_xk%S$*z5uFq(My=;L(g}kvoNxBm!G|Ce0tug&va!e$V<@p3S|Jd$5^< z`VO`+cIYbZ=dMHJZ&Wx7-=I;D7ZcG&|191N47E2UkObK3@HjhIf*$ItqG} 83qoFIvF^IxX)
}^eUCfywKHO@o~#)9FFNS(& DW(W!@c;&afvB69U+YRC!tlNV=itXt ziSb8P_n>bOD(A#jl5Q%Lhx4T|(_S9hmgt`QSNSME$5+1-;JvyPL`B6lg!lV$tWg&d zOi(>T^gzM1aK7Gmg65Eyxi&|TRk(~Yp91k!m)a;Uvx9&C;cKGi;e^8a)9+?*y2DXY z3brmDB$7x~S*U6Fe$~>$EifmH$*;f&u=MtAq?i|Ts0}nbtIoh*{Xzl7)Jefp-0`9( z%a2d|u3sJgtG{5X@_k?2yk9oNt!I;YCWl3JFSG`ib3q=FiHnIn`E_y=gv)5OAS|$9 zboT|pS%K4@klA}OQ*c+Tk>L;+U4^_sLD%Hv-N#|fM(OubaIS6h&0wv*PR{&Fk3*uF zOmSB7qF~ut1ts!z2Z=hn1eZ-jjD406@N@H6G?8YkbWwX*)sa;h5chjtu*Fu&8glsi z9(`V(`B-mm8Au3~>v0gvWp$!eNBl=FjH9-iy^Ky1(3OaFS8-wN0FtvX2yTxbYNc9e z@B^aPsV>E3t=cG7#b{3EMh!2_!I^ED+JvJBt$2&4D+0Er88>-Um_MGh=Jb9JRpNib zk~K(=cEJ)OePgQZLPpa{n3tc)vD?MAbpdX4`y!-G=5(g@rCbJ$R5?R%hmh&;)3=e; z%A1b|M7fH5Xvx$mkgpwM2I&cM6HU+CG{he)+UJ+zp(vjGWr7*>(s0!h0w?+F_r?Q@ zutu*9fu&3Vd*Y9Z!cQnuwTj&3T0tUGW28=J&0Gz>m+_iGT($n^P@_uAMBC1?j1Q7D zrf`Cb5dPR-6uLAoUN}iwMp?+9FdCS^fa04QL!Ax|a7iO}GAag}PO9O62U0A?+LG^G z%jAcw1?BtiTJ{eI2@w8K__BszS$6tmO?;yB*^FcgYLIz3w2gNQ8q9C*CysID? FYP7cW zgh1WVFhm=wTsk3<7*sab$-!h^KgVRAAcIra5FGPpOy=tCUm|Boy@nTrp7r0oSiW&J zD$B9(4lIc|wO#}Pc7Xnj6A!eoU-E)o?=&PLVW+`;-x*jf^Br!;MHmuvz?2|Z!M8|N zgYp>xn)b!6Ro+qKxUdMp=fcKRckqm^O6C5$qS%-|&ygUVy3|sIeYLHQo=|j{b1tBX z9}El$*8Ac4k&n~Gze$wKgoPuITK22KrE-HMm>KIK`VR#ZF<=NGKQbk*D9gfA{yr^K z`u9bbno%qw`m&k0JBj^(tY)U?yiG{oZk~!1{=R|$^}>yM?b^d0eQF7GBTxg{_9C}+ z06DBc`L$uPagE2IuB1VnYJc0N0%nUq6+e3{-l?Y=Lx{KUf+uQpsD6Maeof%2Ohqg? z_6jo^p*+@{O9NGaH796)8A&m@lM;v7H+`_blR;KFa44dTc5(-OY^E46-pBO8HNFfd z*mgy-`3s_80hCQ@n}JL%d9b%5PDAhKRm}91O-XimI>BMj17;-l5b%8eSI)eb>K|w& z0_%kvGj-vM>PwJ-I0$oXi09lb%GRzxqjNRgSF9e0(%@~NrP4efvdz}6L922#y&rff zdZK1&A0z!WM&N;(;`nUr8lCA(UyPXKYFeULJsFk4*8oSQc|25^t=)`PT9c-8Ev?a`u` zO1@DviEQc6%pPNeScV`6!(ae4t-$ur4{Qf*PRQ}mFb}|M36|$Klu5&0I6IcuoZ_=0 z>D3Vvrg3@EoA9jW5o!8d3aDz%;Xv1Q0%oODHV=I^kaQ74K$RhAxXB_wjVsV=kmS3f z^Re@dA+Skb`e&*EWJ`LuLGuTiNa3iAGoj;>o+22lF&}0kmwpvHZUm8PnqnUea`Lrm zO2pbJ2-y|3dk!6x*chA!ToIEjGn8|tkC{0{w*7YvxET}n%F+!!+l}(Slzkn0uO;o==2WYkeH}+HcaA&-mF>Lk0Dqs?1pn9T^ZS33@BR;U zTH~kkoba`tcX)YLak~2i+!tQ0m4WQtXE=ii-e}Jy*-h zn@>rHO2t3EITmT19@`Bo$puSa2z-5W{APYra4>l~N{GUk%{G$)wu&cHAP{UejWIr! zw4V#6!pZcXespA3leHj12LXZd{V(Ndu7AnXdUb`&=waJb8K1&0jLPEZq`BOq={#dz z>GB6R`f>@9vKcK~tQntzof6mNJ=9Sh@V~a#VrqE N>Pe2tM`Iw;n gW9y93?99m}n? R7Pi!(D-#ucoSfH&Yn{CtXH)`l5g)enl?|t-mg(VWAdwld-!}(nGUBL^l zaJ8yB;C4XW$rpHsUQPbGw&9@oE)($B$?tFBtA~^ReLD(KLo-`TUQL?q*AbsH?RVv1 zBPAyvT9TiC|DH6U;hGUqIj4&UE*;o`!zCRV;?dN0Yhww3z41USz?0r5mBIX}B@^yO zak9=4AV==p!CW^u#^ LbdCNLO+f!i>OnvCP(4sfn?a>=M_g}kmd7tyW9|{NJ s?)5lkdyS9bmpQujlRc72w$0y#4WXehc6`UOrap z@iC%V@OwWLI wUeup0N9HY LwR)~3Sb?as zM&vigVSNlt>QL@~^vPR@DXH)_>iOljpA@bva4wg}9u8+%0Oue&zNL^?eRx-K@N>S& zOm}dMcG<;}t+$KL9Z;9F^W!8ec{51?@icTz0NxP&F}zi(+Yo~B@ZsgKtc!am#>Q7v z^L*AtPbdVR!|UF}mzV(6s(g2Al 70n;^k|VQrPk(Wt@O0iJ}5F}vrKL7zJ- zL;r}Q1VKZcshFN`13rqD7hd-_Ut!IQ%`Jg#`Smq8aES})?xd)EeOl^T)sOugScH!# z$#8#dNCtVm9;{cVz_9IoekG`M=0vo%WjDqh7qTR(I;wFbH3L@Xi4^s0!6}%#Z@p6E zNHEg+pjdCY=nO$v5gsgzvZ9B$(6-YyJy`VzwqM-V U2K<-S#YI4;uc(rm*IK0 zV=t;!&*`+oMz?WT_#d4R!#NH6t3RqqRo{jbG7A~S6Km(29ou*x+thid;_H$FC|v0V z%sC3`0&Bh|W4Glk5Yy|+K#NUSOW3+4n;V{ K`R$MrnnwRbGCm7DD; zUfFV?^ GSY?6%Ejd^&1hUm(qIB#H)4y|_B~Hvy3w}aDc?F1WWaBJt zm|DLb7*7;05`&-|qt(Z}4a&G`24)4|1z~!)E2Qg{*KqMC=Q4r7ms$PG7{=c_GJ$#A zXGC(Q3}~)jNI2V=jy_dSszEuP$gbi? r`z2K96vXcg?Zv1;@;?(Bsn1CGarrpYH`Ij&BZ{9veV<_H~_ zql_ie$kf(+rw~krT58Ic^H||>P(L=GMdU6qIi~Ic;X*`RlB*@xzqSY^-=Pc*MB_>{ zY>a;x@UOv4<^8tkr0F>o)zhV#?tsCay)nRl$mQGy{&Vux^CYN(hwTSPljl`v<2D2` zH*@(wmx(ok4KrVpGf2)5Jq(q~VNY2DtB8j7LTfOA1Gwn4jbseMPqZRiSu7?) q5_^?-5Z5H1o3e4J#fE%F$}n!i29cYZQa zlG-P7vg~j%bk~Gf#e#*Dct9Mw!Z5$ewZK?14Vwg5>@a)sGG8tfp^P{U*56oCsdsk@ z^bq*%3EFHk4u=-KmlBm61FB4#8#=1`8^4#^i2bH>io$W6F3Tm5p5kf)r{pzC(m14E zxT& aI;nBwz2BYtHc?#~Y42`NNikXET;hKKk_Jo6%d?F +Sp+xo|t1#2Y%<8@+__dsMXx64+9gb1_)Y%UUQE=993N|)(Pq`&wMFpHwP z7@+7ztIfhUKh<`^LxW#2e+Qxw^yxc;jBqWmHLtehRe48q&SpFXna0t5><%ZA4l2Na zGC36QPm(a6Y4S{zhyCK@r0rtmB)$K2K2!g*1i^NTQ^MRhoBEg{04a{1Q0uer8WJ&3 zX=BK#t`#BHXWG(H6z0i^48saHxdxeL7e yalMVP9 zP!b4wY8>>vuZZmh1bZJ2`Ja&~qdh0+m7$rTB;-JxH@1!eCO=#EzrU$N1Cc{$r`b`N zoWm;mL)s&`=ZUc9ewe=fjBl)9ZZaPyPHWm7Mui+oAxpHf%!L!x$OmCyWmZrrGDv+> z$U7O-pT2WG1qU9pS<+{% DhR$)m$$-gMPG}V;)o#fpT_}fEi38u;H4seHrVO)bfOF^VD8=y?~Qt znCX;D#+)%g*L4wc3j@W3tGf^LKbfnB@%064=%sUoq!IO*ZiF3Sjpu%i*|@V@%y;s_ z;{2kMuDp!@vNkY#0C9=;aS>@A FX z>c{_%5+SAK?YuHbJ1_JHMO`}A!LSJ^-<){k&rsaFpFTjxhFHuAn%n1fRTSp+Q*hby zg232;U`P!)&{dvKO3Pg*R$wUZX$#JlWX6Y%I1HaA4BeaAD#~hS?x?zrnnd4+g=a>R zom_eGdqR+n(X};Z@xfdJ^mJPVXj_7fq?Z3G*@}R;){7#1G~o;%L%t`z%IQ76{X_kW zXig4>VFnQ?2SzMZ+p1NV*B*<|uh33j=_%w=fF2Qunz*|~8sπnd?2=go-vV2fCB z7YTW*CMQ)_p_DzNv>^)w)>9A*ZFHSH_pTFkx(`<%iw{1CtD2vig_hsRaNuRFeQ|6B zTGNH8aCE%pD3cK%@D8N{hjS5xi_T(rxeH^eTg I1-0|anZZx{*!#2kk$MRc9NY9suN zdVkoH*`tHngbeyIkRLKi z2q#}U+H$ttDR{Zr?2hGDg&6uaqPieDZkcmlV!R-o%+WhSdzxroC1ctw!(*7FZGc*( zWQr(LJ=?t}>*saB7;-Z{PZ!mR^P6rXtTyZ}x-$jC!y~bVGHQ`>-&4W#hfK9#6bE^O z o$Vy|hJOyp^y3&gDWlf7^9)WT;Y@sfcV)ECdsw#L_J!KMy< l$rR^~R54tv!Bp~dHME}J^n822z^@K8gX#AoeY z4tqHIUu2qYD}|grI|A ~rgEw}^Y^I1?npNJ z^v|eX+uPrzSY{ $_5OpBVE;lo z@E<{Mr&k5*@BDB?g>n$BC#>e=Ep=-RaSiEGX~azA!#5ddNXb8hnnl1^k{Ad&jK^h- zv(yUHF+OmEoIZAf=06Oh7eFKq3F20o0o10ZhKbuWwtXc}Q?YS$8lb}wIfe}69%GQL zqv&Z+W7?{ehi@gI1-sM2F$itUZD5BLYy$`a7b3tF80`1iqiCkvECEN@_OJU#VioD9 zTEW=LqtmvQM0ExD%AaI=qyOSW^gxA1e|!FlLx`%)nHC*04G9(Pvp7s2An97*KWp#g zX1vV I9{>wAFm2#`Je5a!P7nCd+%|hO@(}+gSjX<+fk4EqN zhW$34K+;JRzDU5%FEgtv6vfFzyTWTL3^XTPD(Xbm9Es;~!1%mr_dDZV(j^b1gK@wN zUXq@<@mc}Xpfc1+e72Y?a<&?NAN}UnAU17mF2v9!`(p8qIa7`}0Ul&mPUZ~cT%$V# zZB`UV-rr((z`)BQq|;w(o?}tXF_SMRSz@#r+fYXfyax^jP*JF#5NktSx(BA+t57f4 z2-b3tb5ly%eI)H5y4n*W)ns7e4;7-hMO7VDF$C!tr^Q=+L~edQinEh5|819m(tjV_ zL1JFFBT^CsVdQoL)ILp|d>SL&z>xrlW685=iFdB> `t8s`d$;*d lSn=rg$^WFz@#u&=@`es_&AcJpMC~G< z(I>3>1zRBeige2wv|^e{c2(FNYuR8+_AXu7M11yqLHGepR&)JK(OF=HC&)-g0RWE( z LG4!r^s0Hl4;z%338Go zjNt22C)lfiE jK9rC#D^;jPesNy|Js3A++GcNsjLS;3+@JHtd_SCE1ry5nPF~Lpv z#suFI1At4S Zotq+(J&gqGtT0Yt@TQ*84-@#gZqql zj__+ma5w&5n2;Qz`Ughs#qr@3`FuOp^q^{zT+-zd!fi#a(DZr^&+qLldDdbh8XRT) zz*l(}b`{FP@pOmf{|+{@*4OkMsDtIX1f7c*WMu|ioeF3f+Vk^#u9*AUga5xaGW;j1 zVk;r(2_;SGW@D76-`7TltAA`{m}QG9L;GjVE5&1*Skc!;27Q3odh9=HUMn2bE5B-9 ze;+M+^XgsCClV+6035iaAToT*d2U}CphMvgCtXW~A0$<+0l;+EFqa$i_A=q*ssFU* zwLsC)7Lou2 0O6i zu_0F&m&iR$CgK^QJ0QO~5TAuub|y0yVjOEj61_MS=-<8PvpEaV4M`R0EpR5K9xXt; z)OB!hmQRi1_RwWtOnQpD 1y-o@p6`;d0uArj7G;!}-IP0rIefObtYS6E_`8G0P`b*n#Z#Her zlNFcAsZqDM%JYWf13>tdtfIA4!J)4wTL)P&dBqh*w6pzzw~~4%L9QlRR_$5Cn^C5M z3bo`YTEYPhx*AEXu9drkwgMja#@V_GOA6eYZCz_k4{mGJQ)V()yk}`yLQjEpt2Q9= zELgU2!;Zc$65Tw-UY}3*HMv7qhgmK@N7=w_L4Flq$EfLuQ9L0+v swvO)B+n(oQ?C6L#oXQSHVb)oQc&4jy{8|&MUL4ygvb|G1iZuw(wvn2W$`M|`D zzSSE>{O*>JXM~9CAvFf${e~joVd_mHe1~B&wX_C?s)W AhZNfLJ zCvAm<5LJi5tl3!=GI();zTt)N$_L?r*${OZN1h{ r$G^GK z=cS7faawAMTo1mC*zNI8`SE{hkn1jgxn07IEDDK?^~?##?eE+|WiVrg#S(_aHa&jw z@%O9{jNW *u!3eyM~tNxKRNE!N^8KMCN`wj85Kl&vbekS<6?yWB~^?p7G3B7;Z zmL1J234NTd3k6IDybHt~1{?_G3ccS=1bja2wFdm{eg6PB26V;y=LGCV^q$kJ`+m-R zwh3hIe{!w)zwTdtegv#O67~9i9=@IJI9`|48Tq$Ye70tN=& hiP&pAC-;jcSRJjo3?Et_%&W`!1cK~P~Rn7%%H>9i{RZay@Hl(l~ zRW1c_H>8SQtzC!=hKpvJbgEmN*& m{(Z0yzk}pp zl1XMVYu4O%)~tIKgi%QqdwX~a#w@J=QP_z|4#pSox(>#-Yx59}ar@hZ!wAo|{ +orWNxxa$x5Rx#E@ z^sp-gvE
tE}r#UoY!jX;jzAHPB?^~@8T2frSJhoD;k1kTWE2BX)SE^|CWC;p-sLn2W z{*W}LjdI}MmbV__z`uLY1lD1)R*2nFh`Xnf9b4 z(_G6DvOf;HsnHmu$mHj;T|sY&cQezzlpfhCQb*$x>5n_9thI@faMgWh(hH`Dyp67< z3OdilF^Xf48+@Ka)3(Ykn02eXOUE8qW-kAPI0SmeC?-v;Wc?17lmVQ=M&!M4CG;#( zHg}a23Qj9Me4JwN{7Peh-%{Kx9%FzI#Nq&x_i2^fVAhn%AetUW)umz>MezIa_mJFt zf>oqrug{I;FmA{`#9in52OJEsKl40)gcu|9?cLBOx?^@}utwM^h{1->%mRC6e-d;< zSEDG0G0Ey+m4A#Bo uP4VegX9l}TKII;r%~_)sGRn }f3mWP76P}*Tkt&Qna93@f3REg5s&8HOa5`vm~r24Oe*{6ySzljTmgz9@@V42 z`LxhhW9h$c{Cnn zql|VdlZ?sAlyRcdih{Xhlg)#Hd!z=omR}RZQRXC@0MS!~)DljrjY`+5(wGd(f~=O; zrNy?C_<7>o@FKTjs%s^b#NU|82)i?~ =_vIgIM1yg}aJG`~bZi?SwlDmF(B8O +&qclYCISjp1Dr@g;C8%9FMZp*R|ncUIG=1W8t$;;_&0 z>WLNOA`Hqh{k5oQ;0WY410*t>h$Zd0yM9ct!Ja^&`~G@II8q#=GTk_YRN`AGMH@g< zQsz-B^UqeeVYM$n9c<-udNCX0_7NPOLCs%S6+ESWmUOW7kxkNn?u?D Kr3; z3FEJPsH=ApYjxoLNgO}eJZM`5^z&VF%#agWv`5V1RIln>yZ0XjSl_@o*q&o|PK{G_ z@)RHr&R$}dI-j!Xds@)E`Zx0gZQcM=x!Uu1)cD%uo1ci8?h|3>iTEmId=a~A(b-K~ zex#eKk6bthrrRB%Wa>LO4B-G-(?sW$>p6d#@6gyInWUnS03<4>GC1`hSe(35vC+al zWC8{%yU;m*( nzzk$5Kwc60a37PbP04I04lX&ZjcRopk$i;_M*SHEk$HG^5bRsBjY zPZNp k`f!BjRxc;#rikRC;;4k^Ru``htb^5(&>01<9?b{ zXsUTjOm*6OLtmeC7)f*4<1c<9-agQSOeb2Fz>cl5nEATcF7ukbbfqqR;q0H@a*RTx zf0_0Zax#QKb7N&1n58gAW8d#&+{xTeT&NrSgG;}k3B%P?faQ988HcG?y3noO?^okB z#5X1)?NUz7E7nb-Uaf6hJns1xqc_VvuW*rP!P9Z8tgnLC;@Zcmj1wEX95ORW!24ALjG!z7Q zfV@eP?X!J!d~R$`19GGo1spe}R(8M|3+~NvEx~)pV@eV@9y{Pe&ZTc=X{#m_?{tV~ z9aIBk@BJloN8wM#lpuRU4J&I@DkmDalR-QzNdiuQD=(n=;R92R-oZB2?{RbQ%?#+n zWh=|DN9DA0z-DD-5)*wXq}=sF)VwmjT}nV|!7HTSAM(ZR{ 0UmD`xb;fwv`%k<7(tLJ z258M!*cUL{MD{SwN6TK8$z?1DHrz_whG@NCHIe{cv7TTHzDXK3j3(JjT u#pH z{|#^;I_N0JpQj9m@13u23EB8cew+vJcAcV_UGipvhbG{FxNC`*6}x#4^n0lfTHJ>= z{UUFuam)*6A{&sG&)Vr6d^p{NLIPyP%$e+y$4oBMKAKKMS>Rqhu*h~f#ICGCny=Gy zK5aum^^6CLKVUO!uFCk6-({6hy34%tqiim6`tR#L;Y0S4@iUh`PChz5t?B?4MUoH= zMvTnxzHrtv?q=fn2WR4a3&s;rBy})*3FEv#-^T5v)$uBm<|qYO2OSM-bvi>FPva1s zxwucx5Nq1H-Px7+aAm!{n63z~n>vyt+nqQ)I;O}Vji6j+eErpFVTtE3FuA3)r=oZ3 zN&NE_{!|CxhC~FbP9&nPTmg2EQR9i9(Iv(*Hj0+8IeQYgH<9jVSvQn<%(w=5U)y8| z>AnwbXNeq4&$qR&p@!Y|_BYUdR?7)vVlH*ji+AAb)X_?o_;R=$$QjMBu(iVzfz$jD zv7Iq7SjywYO{;x8Owc)=tERdxyo@)UUt9BAHSylF44Ip^dUbW8_5pvka=!V?)$@a$ z(N0IAxZHc0fhNU%8#j%8mNe7}(mv noCCDCcXff0g}b08i-WnNa5 D6dab2Pl$#Cipc zmfYLQNQj5@W+zvMYd(UH*BM7~ ipZypx!W>bW<+IO}*-EIbLOn3aXIDmYX_SsleyJjT0$)(2{uFNrEm5-CG( z@ij?p7${@62$_2PP&=ET=C&yGvltih<^8$17V_zc%3T_Pqf$|y*N%4206RpUQ-240 zU=iov1ph^I)wZyM>pNM@3qSE}%sCW;ND6vS^%f*^(55n4#s%}HSGjP&wP$C>6IYHj z4pBU#^Cd>qzyqF6D?~IuNSVhKOVgR2cf9!yn@J>$doL4FQO9Q@v w&>)z%n;`Sf~Q>~x&GzPIf(ZbhzfP*3%$`p0o0q5(}Jt1!=T-H)SE-01stX8xH= zQ7UIhN0!Tp<*oBuFihvUoX6V?`r?Qkd9S%v=QMKC$yhs3h$0yS-#$gHIQYCT+fI+S z=}vhx90YMVKF9X42vRK#LZ-=SFxj6q0`@?dl};>?oUksbTxX4f%T-Rdy>>+fI)}qn zI?cdne%JZL29@zwr?z><<~w30NOJf*kOX$jh+ !DSE3WiXEtA+Tl>g9zo!lbd`ay=E7{hiaVAmE`B1lF7Rc0q z1%G`I-?u>XRMIv0^M!vv+b)~Yq5O8|nTnad1;yvu)8i3e4q>&*VeZ& 0 z1DG>mUG{`P|JY36p7XxoYs&eb&di9W(X5)4z}1n%@ra0Pr1-4AyROdZ1MPKa!;_}^ zI>a6&I+49uhuD3H5)aj$z5ewl)TC8-qlRF%>Rr{KFD@0VH#@9OJ4jft?1tPT9P=)0 z$9}Kns3IaWOdxD=p5Un~re)@6wcsf^gIbnowUDVJCJ=@=PuSEl69`AVC3xzIX&FtN zpvQdXYkJI@)t~BjkG5J8zqyCjTEgldD-ET#RHkm%=T`H?nK3z}Anf0#XyPM1<^xQi z58^x_Q^QOkEb)>ab6MO|LUF4ea~<4Mbn)XJa}it{q&(TAdOv~`j5cP+sdrnm(Q|vl zS21LrLFb^4p|`s4h u ^yaOOJ6rzzm!9qrL-aO_@B3X6xfb??rE74v#+%&*ZoDH$`V^J zYHdbWa8wTbgeF*}*<&6~7L~OR&%v 8y zak$b4M`poMtJI35&GpEtHu=fUDEyOZv6mMqLk-u`jf?ga%;0bme{gonngHx};ZO!A ztk+zZu3#FozQ0GAa#0lc_^7dE!sY1X>f$~=(wdKEogXRQBFl&>ZwKS`5U Zz1M-5@n(zME>^y?l$dq=eE(M5^4#fO(*Yh2DKKeCzni9j; zriT`kDRkADaXT7;1(2&$^ZHhX$iaSL7*D;G^LPSOoHX#!ke^}~wt$?BurMc!0&+lB zGz}a9;NB9-o=&?zt&RtnedrIo%*{+O{4xN?1I6bKG>?I-C>j%waEtIHHH~fholQ7% z=)AxEvU?V<86aZQDYgxnnM)U Lcp}|?^Xx3aAEe{>tR7}c2jus zAoY!}Crx0#*}K91*c)wbY>hsX|6L@cdk5EvDAWlpfa-VLd3>G;^90P`6zSk-sP&I989iU+GIWG|4;LOo zRlCsjXX1}MXr$mFXbY!n)FJmWp+^Y|gl17htOA_g%OS`4!lQH>bt_u7h)yXGC!((D z`QO*u`3X-+6a>Hw^d|7RF=L->^%UA!k}|aJGh`!kc3`K-GM H_mT`T3oY3>a;?S-fF>SP_??8@@XM&-E#9ntUD$#X?F9@Zj8Q1Y~6#g zv_{9f?MWPQ$eKs2w}iLWr_kGGIB@|vp-$4o53bQ9X5CxR{+tUC{vJj#pM4-kSvQ)U z!H%C!4!e{rx->h$2x|qxl}gC6PWPtuFM9di66MhY }Q+q@t}k0u%x3SCDW>NrOfH*CdA;tJewiy@#*>nK);u3`AfmckP1b zHgeRsR?uy)R^)a0K 37@2!@^+ zIsix5SU3Ca-{rSQ6Y| R~g%lE9vxx>*G_m+dxB36#3 I{e`GIE zB#m!qq$T{+j=h;saAa1*;H*Kd)}Nq;y9FnT;2q(d_eQD oN)^5zU`KSjHu Dg8v5p(suW3x$T=ZTu#e$Oa21DT`(yHJA;0Ima@t< z$>hAPxozT-4tf8sbtv4?{&!RMK`$+2x-_1xF}gvKU>f@b7Rb>-e4=rehr%9c{U>FY zL#42PD8W>X>wLae+c-~WE3c6H`td~$9SQK-avMvxehhEkr>=3};B^biFP+5i v=2E?>vJj|SdI*zrBmp9vv-_ml5ZywlRE z3XrWaRF>fnx^zDc22cU2r224$KnWxfiwt_s`v^hk0<<#anP}xh4Y*J@?G$M){QFYz z`q@r;Yxj94s2z(PZ!=>PdWi`R)QMR2Athd-UK~BN^S2O`>c;RLjT^Ky-D FEA z9}m~Wi6jCp{`ZI5=X-%_JMg{nr~j6Z(e;l6oS(@OYNZ;puoPrp&BA(~?GM9chV<}` ziVwN4cGv5j(OFWwnbiGI>b~?%14Q_*b) (M$$d^r$9oO(HTGVySXf)Z@L~I?WLn8q*g!lB@Kwc$>m>$hG_8ktD9C z{$P&sS4c%lo}Vu|CjhZXMHg7Abuora|Il!s)7qF#``-E(kLimE6~PE!VJ|ItOM#?{ znNb~*>or8XBK!rTH_%V{YT5aV6iJs 0!MwT7oia*3h zcuJ~=Dv;{TIPH~(@~_Gz);whOhG)CH-=8>d;fi0+FC^W;K6*8fZpf`abNA^(g6Qa) zySAwehOqXA^Jn-bSYH_3Ba(uQn@{@kx{5h6?~>aL2vI$29=-Xs#&ofxj2}qk`? !LL!*IZ12?asdhr0u?#v z!UZ`i?;g0}4Tj&@xowfj-&A*Znw7QLlwWo7keRK^dr7iZ(92O*vof%Z8Bc7k`yd&U z*GP^UO}({1oX3{ip|oQYh^EvstQt4uRC0*`$_McuEn4tBl5(=V^}-GZAyNX8+G+h+ zYyRD2%^Ye&<0H_s fc;F#$LXk9`HAwvF9Ko2sc;Q*Y#$blX%TJ{}~i-TV~iqQqN z?T_-VWOL-F%L~)|!`ZqFTevjw*8kiJC`~`MU1bML!%<#9_DZj*A!tL+ ;BU#?Pf2F)F9SYv$Zib+XXmygLNUT~91ZSY4kc=Q zYkx_Uqx!iW-x@2 Lk00(cf@?U=YtG>!-8TZGQJuCP6%2Lf`k#W@Cgeol6hZeQ^eb z1vxQ@sRe3p^lHx3K}ulxlgTuY+`n#8XDNBrpllRVm`f?-2fK=ee!STZd2*N#+R_#g z#`yDumMm~~>?B(Qdn!V-qWUL)um3$>An$ik-AD0~n;JFb{bNYRn_QJ2k<3Cm=!ZwF zV=**!JcZ6a5_zf1_a>jjN05%6EMvgRY@VqWZaH0lZqc;hU}|`(WR?u4^@~$v#|RRU zWuqyXLHX(`f+h!I$e+g2n1#@*Upr~1J_j9A 6g|NLrWgo-)-=(%_F&_D60Vx5>atC2063SKu(BqO4y3M}PBOXq;26vM+Hs zf}v_Xwc4eNQEo!XygjaIS?1@sLPL%!muIZN#!`tJlTpB30WGOWsfoUB$H%5W)ROdN zZxqxYR=Bgu0ixDEN`^E0gyC(bcG`G;7%i8qt~S5dBDSrdb~(N^>NGcRy{d$haUm`! z+m8a$>I%xZbFmfr7eSv6k&O_OYnf50T&31k`&gqI!^9aB4CAL`oz&v7*)2{ pHyx-O{ZqH4&@DV9W_jGOUhz#Pz59vK>~a$>1?roW zc2Q$!; ?koNy|oB{%>(u(`*_))3T6%0VbC(@la2nVbH&kxttcQlVN39 z@|nQatEdJV_q!&3^#BSYWhbg|7N1`I5`IX_FP=|2A_6IAnHd$iYZ2|3g`mmB79UMm zYAbV~7+UdF!soz`G~s%GW3IN6xJ9W8&BI?*2yr&kj{077Fc-XrUmVGuGSxLtr%Z)N zDsr@}&?ZuBPzZCU%&**-#9f)31vO|DKmCL*5u%G!W^$rzvPh+CDj~Q~V+}F5l@upv zz99esWciiEET8y22w&x^Z+Z~^to7Pnj*24;iDM;#-iWZONwo4w=rn5v0|9XNM5g4I zErw# !bx6aR-6owr1i8>fL^ogwa@qqA+G-X@!jW|8Q&{>uw8tX3^ z;YUq`Fp|Gqc?+jMm!MCm)SfeT`Xl9=ASoAO)8uD_KqMq)4VlV7gwMvt)dK24kCL#1 zlc0X)kem4F;aK=@<}O(0B@lvE`Jr>eLYM84a!5tszBag@KC4FiU%~JHDh3Gu!9ZCN z0l jVL#khJU=stt(HXDb%pl2bL9iXf|tHY<) r3CB{ytTQ!D$OhXu z6kE{KKb_@{##Kb_a`ZREH-h;EIuP-$Oc@56%vcUPBC7~^-CgkL=5W;_GpFGWB-vP0 zdfJafi30P)eVF`iIV5&k!v2y-d~5|@^gFsEa?L)tW&_~-3-m+j zx%hkPvW%}>&lY419AkV6f?Go12&jPY@pl&-b-@-)Y^W5RRL|`%BN+QlS|L2kk%v;I zibZ8dWPPXv#GB$}Xi}U5t@Q%H35h!p4>W>XcA-jFmQe{zn7H#6u|^kMg(ZoZ^d)6$ zizKU)v8Ck%Q6|P<=XhfY;V}SMO6MZ11OO TP|%1>+Z);< zzG-BX3I(ZVI(NGjD-gVKc3f~feTgBz{j7@)vHYHU_2c?yfpT(*L99aYX%igNPn@Y` z^RiF}rDTiADDZn6EMsm|251NbAA3vAp5XoAOKjD1d<1?X4Soalv(<%K9X-UNk-~3@ z>!?H9H_Z>0!*`086o&&?YLgsf8MJ3i9Sj$ss2SyAs>6l#9W3Yg&;b%rGi*D5?1B>u z-+OHbWiHM!#RUyNjTgf(`u|FJyjw-u+>Aw|HZmXKESPUZ>+3gzN{HjOkv?Ad7_1#W zZTUSPMDj+fdxhhiH|J{73f{+|Net(32c)u;v%YBve;?m|Hb=)CMbqkytV2w8k?||H zgt;p`!xIRG9 <*s)5ZUeT>ECSx5N#>t@N7v1?!1h z!G}S1F7Z;MiXdyD6%X D-)<=JOLv0no=dMWP;qYS?;*oUt#Ek8dK8l=?yWS3i zcxmOsai6{csF&BS7&!&7rywo~8n|-WQ)1l2gdyc<)Bw&3EW|_PsK6bDSwB46H|o89 zN *5LBj#Lr&MO&lGr7f#H|ojz6o0)Qv3i UM4XLR0nn^5w|V^@RFG)KzEO1zAr})8G+yslR5)z1})IpTuNC*VpAu;2-?|&y)3p zEJ`2~8uVt#7bn2?T)|I*5VQGVf gW|CSvw_@nd25#p*QOT{= (Tl{<563z&|9~kMt6I*Mnzg>djG@xiqZv-g0Xbo;WF;p zgj)1$xmj!&RPdoogW15yZ! m@WXUO@VGk#3 z0dXXu(A8~yB7z;~jSmurOh#UyJd`|d(&4=wExdTbY&ARaw^yNSn`dReBO^z$wL3qY zPcq(OdZ|R4SXe$XN-4S;Q&`x3Xh}Nyca19TW~u>iCcEVHGansC<_r(ZbALG(#FILV zoKP|(A0~hCjCjj?EHz{@SV_z?*U1q}si=X!+OJs`?7-tYaI+d1JR>NRmEvj`($_lv zn=qc<96AgXWZO;9sNlryrX!kOut50yzOqndMZK+8+^QFcrQTN3L1z}k#z6TF&SdJm z4Omg0!ar|nvgP*x2%Nut3#&-5A%JYUlPN8_I;#DZ=ASNR1T15vzZv7KnFQ z6&LnXfzZ<+2};x0B|V;v`s4RDcBN?0cn%OabMgUgBK%?~YKJ3})8eR>n6_DhGhbDpdGnvmBf5|;ZledZX5Y~lD_Bg;7#qK|r|KBOf5iutWtwYou zGtz?j6@}D?7Tf2$-QDoqafQ9*Jw}4 xbQ~t)W%EwYBw^m&=K;?Cgr! zxv+tbvvz^ycYc>Uzh}4RC;RvNof&Wr_}jzd>Ddsg-br?UeOTxQar@h0`6B9j$#Tmx zIDg!XnE0HeeZ{IE?&;`mZ@urW4;ozAr0&&9i}>_*UyJXCV_~9!W8pq$FVV8R+`-~| za&)URO7iRhznjgisG=w1u%8EF$Js~=>Dh?Z+~r7ITKh8sGW=|;mpO1Y!!_>bin3|G ziZ{}}y;Np!r#ONN4uXo#2{8^OwKmC1t1f ;~2z*Muo&G&3c@! Vau)mj%S+Z%7T)$fu8jAnMZ+Y8S =$S*SjnSW)&}9YW@=$7pAarV%Y!z#IV22toq!8c(YW+U zT{L`BnpwF*1YsRavIO-$KpD|;w#I(Dj+0*Mq#XC*r+t7_rYpDF ` ziEdzE*>{JUGuu?jX;`7iC2;*@GZ(h?(;MHN8WsnA*EO<$VY_r~BjOgmQ?7i^<`{`~ zriH8H8m6i1*O#IeHL9(0$ox=Xi`>Xc2`Ga3qyvMG88Sy!ww&0V4<_-u*1#9d_k`5u zlQhA;qLs)H%Q{&DdO8>+@&xYtL5?Es{-LlBMyZ(?g{r5bnH>sVBBwB?`6fq$JVmp- zOTd?TF|PeAxs$Ayv3dq`Lw&Lw#abN#K)&kHpx_eDm`#sQ7)Yb=wblf2*KTh%REmoR z0vn<>qt0IOSyP&43D1C~hW%C%%r_|N)JMdJPi@w9q3UczI)(ky9*6*f7BOE(6a0u? zh_a7aq=IMl+FpSNn;GVbrhd@0< mFm;eXx_I^P>UQd5~nd0aWvF+Ed zV$6DNt1se}X{G!yDZ`rx#KiurfLB%2;Tg6V-LbuJqe&43dAu5H{Rv*7wFVy$LIkfO zZhcg~PR9Q5drfdp%xu1-2_dg`Up*_tUuGf{F5kdA;p=o!!{7c5+iNa&_l`ZB8gzUp zxmH8onh7<&0n|f$!xBv=#xa`dmujuO<8QhvrK));bzWAKSBh{7_yZE-!=LVo&By-y z`oymGrdzb6Zzd+V5WdTqo@h7|&6FyoH2^w{uG^k-g>laCrx2_=p#UZ%?NFHIA9K=? zgz~bYcH=43jv5Z1#VZpbI|fbQ$b2l6>6oul#jmH8Exr201sN%oE@!S|qwbEg9bkZ# zGg}r>w47+59oW*n{inyip*jEpv(7Qeh)mGB+MJPIF2}f|*`_LVKH3MLMu7R*%O*;B zV(sf`S{utUq6n^vxFyl`tnui~U=xiXbK>apzOa8%Vv&9NkHx&%gpo{DNvdb2FQF3S zGQdbKm2n;hsGHXPoHiysArtO;Io;wR_k!;;O8(o36H=J) vq&!&($`k8_zv!*jj zB$-kkIzJcZ`nU>s9d!{VlSuY|Q2@7Hh)?s|L!d_zqL2UN<2O>R3}~rltYMI{$&l?2 zQuvVh$3fxNHn=j%ef6}?5;SS9ms6}5N}*zJW6iOdj+}GXo5Oe%hoWXskXSDon!DB2 z KoKskb5tK5DQAYqpZNW!-%2wo2P4OD@C{7YuhaggQFCJ6qPBwhU)cAsu z^TjA`RavW`eZNPe$^s%5ae|eU?YD#qH^0682NS{5Boh=Dn2!avS_R|#JqkFe)}H}I z%s%WyI7pv!kqULpoC;ZUqK~+5+u4nZ7MaKVzZQS5^SoTb?WHZ`zf!XyvfJ&k*8{T$ z6{VOPRUtMdmBRpxrG>Dt%%jFq?9X&Qkc5ja0NNt)q~aX>)Z%1S63XILnqLU~%VAq{ z(WkIEDaq-Jdi0{yKHE^N;ekz1iK&w=t4Zk^)(lPKypYRB_qi 0Cg%_5*%2-SNoZg76hv*?OZ5P`KdUaxDP TPd{l_Fh?F1UQpw1N&1M~}{D=n<8o$c7OR3hp#eiHceS z@-BD+b5X2IR(y=+cv#7uXq3c6JKaBk3iv}3?8PNUdEU5Lb=G-+zUptB*pmMETqN*0 zvo#XX9p$kRR|XpN*`FaW2OQ|u? inbo@XTrrGDMCS!pj49&5yfuLq=G3dFC^`+^1pVH3>KMUDL&>b=2wO| zSu_FAwl3<4;wdmvIRH#l7B1C%KDo?QErE^1NAU=u3ZXboN!=%NHW5`s3qyVZPeJNd ztcdQfMSaz|btz3k?YU0lFcv&s(eJ_P4FU9-jsd8x6>?Z0TVm&q6p2=MQ#=G 0X zUG^oY`PE$hS9|sBDP+^e;_qF(IY&o|u5I~d)&-fpWe-1w465dJ--iE3iGz6Lf_O7H zTPz41*!Z7_1M|O#gLGUv6WTxJZRj^VsOTev)zX6tzk3!I^N+_ecOmr8y6S@K+wg=6 zstrSzK}A=Y`M%?MwYs-OB4nmcYtPf5Xp>N=DW_gPecR3!sFw@;&i-p$iqa}+n_%X_ z(T5n|w|&IT{Zt7*x>s<#(!A)^AD-(Uxihwo=T$31R9)yld3rSL~81x(ClyRB#mz z5-BCjNSff#M$9j&F3TAq%#!ec7ndP|wHYX)APi9=`52LWb3oNT7Doei d^9VcC#b3*YaNjl_~4!qY;fOMjo49QaP^Sh$JU& ^iS zNTg{}P)aX=QT%XGuqkVw*#s_m`~1{3Q$!i7&aHbawu5JeMy0yx9oN}4GfWt}tm|}N zdq%{@w}Nd{C9BB$?7DcPFise7Y#_l(Q@I;4-@lKktEI4&(AuLwMq7uS<@16Th^U_d zbESr}cL?PA gfwcM^q V$E9Gy$C$r4!ljiKQ(*GUU_@k0K@F$9g z$h2c*1g9T0AE?(tRbRCCXw&m0#5NRjZ8B0>GXUND`{tdRFzXL1E5=L(&YFfRQvwX^ zLn#89C&DxT&zN#m$k0_@=1g^u(Fj?qL0#)X6r0fq&=G1l))fSe4!oB;_NAVy>O>Ml z6hW>WVVEaEb?LVx|0l)qKTKf}He4*S8M;2;t9DL>L8JH#iEQMe%Sr N zG4AN??Dg{P3~#no>GTjK8QWuMSbE=G3i<8)Y&EE$U?H`@?Lt*Pn|K}80d*s7tS2rl z%O_+R*|?vtwp5|U3wbQ7nl69ZigQ4^_yfe+goEd7BE%deAOBaC#`XvB-MJy?&rP+u zKL*iHpWJ%XwwX>TvxMNe&ae= O;wmw3(Zy%9BTnv( zZ%!u7a&CT<^1)pAS$`^26q}|NtRfI>JL87IQNov_D)GS@YLwl<6PKFm!?du49wilj zq;m5q@mD-0e6qQRq{p{K6o%XES0A?NjTQHeM!#w5yf1BKPQkzA77Xc(XC*#xOAQeI zY)58M9a%GqxL>%Rbo-*P?Cw`FbCWOuCzV+)pgMV&2bal9Elz!CZjP&Qckd$NXSeez z%un&rrFmV$fc{c3ST3uPy!MEYYQCwXq6u=vz2n>8zP4(G-zU+;sq>pGVCufkLArE> z08HHJAr#OMY4g~PBxg^RgR?)1={EU{=S=(0P9JN)DImKDBj!v73xUBBQgpLVn&One ziNr=IOh4W%H+_>waHt;O_?U@7mJC~vrh$pm@V6ot$2Ep!UJGg6O{vpERoF~%z4EFB zu+)-=xdeiG_ipgGklU0h*x}XHs!WV0L#W8NH^a!?R<;)tuIKtUwEo?AtPWJ6jB@!- zO2*iTvv$2qj?w^|VM?G`;G9DD0J$(tlf-YSUF{k9FS{8wmW%8mBu*tv;i=|mpo4bo zpjp*+ctw`fF|LAa+#gQ!MFz)zus!(SrRX3Lfv1u^8PE#&zhY0~v#n_#3ed!z!Q#F- zDkMC+zu+|B%n9lv0fh_IR4|D{HbgkP`}6{9XRtI?Z(;I*pc(W^($Obw@u_bHzYs)b zzsFCzWT?PV^j611B#Ij|sPROE57~tzLMY&V7aCf9vXlu)BJBR=U<^KJK`p0Dmp3B* zdmmOHsGYUI@Slsy<(V{}RW9=M1&R9c*LNEV;MW@vfU-(L{Oba<5*ZTPp9mk!oI3ft z69Q}qkXTUz06_$^P{#E5ftrYpuZ1kqY#MKJ+2WQne72wI_!##K>L8q=l9!6x)m#I9 zCc9DICs)O-hR;rA_+kZXE!3YQK~RevJ4v}2LMAL)1EPn~5owDez~%=8c10-M&&wKs zS+m2;EFqKLc?U)Aom}_IOdt`?GTdf^i9^R`tdL3V{G|f7a&Vfcfv=u%nrK))Ip&Jk zi=+iLf3fgkMnJO<8Cv(n$B{R91=?|EVLF^*_kA+;aCB&umuQ)i3L|yurVysm#8Zr% zUx_7nh(JR;|L2fTe_>y&$JGq-!cXyH(NX`;E-J+%lRo9f8mo*_ef?>xM#V;%%h4{| zrKA2oRMzt~;3gv%004wnER|0cE~W8|{1L6yE)cbms%iV`5T34bjq)H1OP-)%bMWe~ z41DTf9**MCO&jx{b}aai4vgq@EZ84r_78M|NK{OBlH1wu(rGspaBtB`W0t2#r|OVy zr%~Y)8EkV!y?Bce^H-|iD;BJC8C8bcf!SHx<4C6xv@|z#arl+gjy5^fQrT#?O8?X~ zPE;skd3>@~hj-qa y2g zEN-SZ?P;8~%)LhwY*5y%aMGqo=UR_O*@jdV3$1|erQ*ZlQY=q~#IWp9#saC-Q%|~Z z*%VkpjcCb14@UK*OD?iRBv{=Fk+AEV5WisdMW>l&F6TQ{6QJv)*~7RYhYQPVD$H1t zB8g^@3V-2CMDu%dVE@H#!%Dwn8xRaQ7mOjz1S#jHe*4I1{snKmGb#fnc#Wl}@M!_E zusJ_0XA2RUVpW806*GrP*ozek5DeVE7(D~2Rd;^}L~)2VzADyFlOpV)tNa#OaL{@) zxvmblhc*?o$kw$E07~APInV+H4Squ;e$X1QeRN~!b$o
&zv@~$=?M!~NtO;)j!W `X#p<> #5& z1RhYXFzz@*I<=t1E(J=_=ZJ9C+W o*q(X(d=E&+C{&EoT z2Xb?TQGqZnekpf7u0Mj+6WFSbcG&p-GR6Ml36(N#S9~y2tSAPNsezY&Zg>oxjTVm# zX+MntY!^o*#cJWI3O>fQU{^>NyyZJK!<^$XXzOup52nN>nyZY_i#aT(&9M_lTQ#n1 zF6Cx`W*PaH2m)7V2biQddyN+#gGTV*J)i-T+d}12ghO5oNF|Y%aarH7u!%=|J;JVm zjc1d$-8_TKCGx`P+0ub4J<5%T*NW$h=>^*tp_~yXxOC`Yw(5&hL)OcC@{uguvEJY4 z{(8NBAKm$Yj2*M1i}W_->s#}OQD*mvk_smiw7Pdj$l20M`iDWMqipF-uIqYHBsLp5 z`~vU)K|%iyMGDxA=S$q70DwM}{~7SJ{0s1p#HNEQpWP=up$vL`hUpf>WceB&Vd| Ayg)$?E&>b79;f|FSk??C+>n9!TZgTC#s3kOT`y3&@n5`1O0Nkb zm!CXbsgIAe1{FRBD+{;92kIfoJ0kDgos<6~EXxl3) WC|r}ISb`Mi z&s9ljwSwNZjrrwuMe!8>+t#3WNBh-+T#sI20~uKU;W *jg2ViEA&=*HesvHLJ65Aw|+NSP8WzFe|1>SXcat^-HAxpZM zi-2!&Mq8aP!t-z~wE6v)s6dk9zbg0!asoaA5mYcOI(uA^dME3{>XZ$vTVAaVzwZ2+ zp}m}?eS3UfYIKd Ok@;_ FOi zWRALW*jxihMR-DNNL;$DS9yO^GuIU*)`jj`aIM46LaMu@-T1>L_K%O~RqF%vx{Q~r znZdrxRV}}aP)j%^&nE(1tEwQ3M{&T?)Qx+F^atKsg+yjC9;WMr^FHb4KYQMqM|o-5 z?tWPN_-%PQJ^c^Wcgy}u^<9hqR(+QlLn ezm(6_d~6}`+xg`z@dN|ApLYYc zjz!wWH?}B5X9x6tE)nvMSX&NQC_Ir;O^?S#zV1X-k7CTBH7SHsG~Rz#-;EWu-1x`P z{_l&Ik+4cU_izBfAjkjgu2}zl^RoOuflV_?MA2Xh?4RVfxy8-e1OsH)4jId)%5!e# zivji@Z8s&!j7BeBuj2-08d&WzC=w$h>IHw|kcQQZCX}vW9qh-|@rcJxH!?U-fIvBj zss}cAk25zP|LD#oSi-`U(JGX=BtN&4v+Zhl >0FwRsJ*a+tuHf*;DC!J{EgT9dt-(gD)AYA3GLo8?u-_ zi%bm*P_6yhI~o~8Mre`U4&PPwWaKi6FZv?1`}*{|v0nLAmRqazK 5vP`~iO0z{|*R7DjJ);4KKMmw?>k!w0<&Xcgg1-cxY6 zXI|f9``w~XFDK!gyz4{$tEP4Ok}UxjnwVeTB&=v#Rk9#9nw!8M4x|{S|BtzM43F$< z^G0La>Daby+vwPK$4N&W+qP}nwr$(aN&laj^US>O%;$4HRMmB@+G}gAy6e98`e8&U zR$$-W 10eI4ZAZm>p7T8x}!5frx zC3y;7(7Ro+xLu*da@TJ^If?xDTZ&?oEI+p!Z*vBWI|68QU77navY7AQlmkV2I_*bwPnLk_xRtTt-n7JA?kpy0y(m>kUD*|v>li$I=R zd-#Ag+Ivlv!4mK{W1e_0_S#1)VaM|!WxTn9c+2=rV2*6_rO7Sw=6Mj)2`zsb{eZE~ z7m-}b&h;xGboQr3V*+))jtv;&NS;+;ww{fbQqm)G3B6}jkAblOmhi8gap`??dbziQ z@Pr%OvIUwObL^z|)aELH2kDjV_zkT@l^wHVni~b|rQ %#-VHVs;j?#s z3_^%8?4I2WFZ#2`2Q~uBcM!P`gRlZTl>VQFa4dZ;ZevryfeU&?v$E*H-NC>C2G}V; zQ3hd6c$BApGpc(Z*ibC}pWF-~1hX(GPXlID-)Ck|WECMs${?KTOBgc4%7y^ CA1kUNUauS~BewCkhCn~ssvk3hlWQ*6S&_M?fFIMV!B!N3SfD4$yr zzcd;{AqPAhF7HpqO)`!sS I8=Q_X6Y!XH@^5gerSFE~XKJ zIanz1KbIZyGupKy2NS~xAtF p2%3-y7=9fO&HMKbd$=mV@=H+_$= zuo hAF=GG%D$KI{DrEd+%IrTw^;j9!Sm(^D6>07YN1yaP^Z>)R5j3k% zJl}Won)FAO^}Vz~upT~^;NLw$fmw-vi_AQ&j42LandVOiMvEGl-Z!E Q4f7!Lo%xC zoWGAT%4PY_3xtbR%NZz1JFubYyga6)eZ`l&X>LuPvyecPJrG;?pkpnpxVbJ+yxOqu zTt~0ba9`j)G~@5464i!6*E-Dw&g1aG@gq^iweJ7?xLo1=s$O<#(QVi~%n!j8&A{sG zZZ-qA86vXqI*DwCbicPQ)a2Im4haRHg3c9$|IUx^x)hED)VpAGaq8a@9tcZc@7Z8H zp@N^8L#}WMDcdi%piyksxukt+cVxdFM}H4tgy^Dw;^#rTklffZo9xsXziGSz|M|G6 z688Q#mjC}&_^avq|4`wN5V1MZ?Yp?+ga6;NCFXx+OA_C!IVk_E=0smng9##`Fpe^s z9jdBm|L0;3tIEfvS71PRyc8qSb$HU&+Gl1*y6^>d@~jpsX0MJ9_M*JTwMkk|7N3KQ zAGWo)QnV&3wUBAy%-H)`(uzW9MkNLl9Kw%`oY7>~2QL{a(%?srv6_j4-?`F|XV&L@)@uOV zKRlJ~WwrBe>u=MLYe#~enQkcC>f^X-BcBzA5~ry!n2(8}umw)_@C`d8VOrdQmNu JpC) zEi#cEGxTrTxLX)os$h?+Q0kBc18x({pcjI{I%XM48vbO@oPKLu5VJ%@leivY_S+;9 z*u(_c4IDo?dP!TCL_;m9(dDCjHh)1>qYJY?UMoQaHwpQ45Q@qX?m`2dgZkdYh4A-! z(ZrfL^f|HMLg}w9C0z6U4@I5g0RTS`N;1HAQCI1Uq4`wpOj*8W! z#h2xeOoj*N#m9QFocQu`-@=71S+;S#i3|SxfKalbPaO~0u71%PrO(~L^H4>H0lbnF zxq7+t(smM5$tOsC9Zq@oUDM5geVT7WrU33H%^KNX>W;2oiK}R<@cyyDv`{6$V@Fpf z((l{WQD&x4hKc&4oW?`cK&UF)jJB|kQfa|zsbDC=DKCFpit&u4>z46Rfq_E@9Yx!G zU1ssz`colQHjBhSC0dA`1Xxr~0ua8U7LdCYfScRf3u;hJLm`wzS8`A-&Yx*TUa?!q z#TFon7AUhp+*kx;N-Yz6{W>1y`b}ngMx?uLv7$V9n`x1Ce><=!-$#zsR}3AnY6Y$_ z7t2}*&c;;|>e&g|)d}&syyBbl1St1UlPkLh>#>{D&UNZ9QDYId?U5eXzvobNgmxbn z(Jl89-J66O`n-}^YzprJ=%}i?om}_De!(&!x~#i|tVGrhqzF3VWKwG`KSjzqCil)k zC1oeAo8fl&*#-owX0}ie9G&%=D%`WVN%FkHal~}AoLg>qYB99T5|gy9JHYLxHb=Fa zrtgjicMO5<)JnY&sa_Yk66W{2qw?e5!)+Cz@DH)Bs`ebPoaMh%ch>){x~oB!$j=;P z=!?jzb8Z$g{gxyZ3@UnbwW)d8o6t=D>vLp^j(4(40_PYQ)64nobA(_NTw-!?VE6=~ zrg~7KNcfwK!UzHAKdL)f;nU6kvAUywSMiqlE !@RG*XoOxG%vtJ=U3|k3dSj>yNIiqo`^$QXu z^? 2r=yUTE8z6nYWjViT zb=Z+Y((bcfpYZy-)XGj%R^Q=j-;rRzKQm!n?}SX>4ZiL`aUfEK lAWWjKp0uYhm7R{xU|SY`i&k2ymbhSRF<7NtUpIV{XLHrI~R9_V%8Sl~B?hia51 zMU(Rm?7Ohfbi9&5!j3+@M{9O^k{R60F&`YKT$o#|y4kW4Ut|@os_ej4LepR>E%DdH zH&*qR@0#K_R<*fB2F_oA?~N9Ii+qjwJ7WD%M?_sPmtX;W5RCS9lqCk2yM6$vYeMJ` zikifojI1RezM~#R=C^dL^$U u9_Brv8xP@UY#jR^ OK_jK0PSntOau# zi;v~+4$r6pm`KFbJ>jx>{xuc8GL98R-F%Z3keYhc2F^0!L|wj&=${sfsw5{ufU8O3 z?`i~ibIrgOQNngk&Rr}pHm!6H5!{2`;z|j1GrfV?PZWlr%XEV)yqnS)i7~rdLf&s% z7c7QGkooX5;xEo^>un$&R+Nj-HAaZ55#YLrNd~XzocXT}*);z4wpCwqjjp}xk4F1@ zM4Lnyo+xTTZp*Vca0)It81oxtl--@j@f`2mo!gDfAQawndGc3au~q(JN$`;Lk6vqA za;!Y8IhJ)_F>| l;EUxVvOKwR=e(X@-Qb}+(q$PRMLAd@hIAa?{ zLv(f&aLv Z9#L>>g4tv$Xl3OBf55gk+9*LYm)dwJqGVS`BL3;;7LHyG zVKfAsBA@C%APy&o0B4mcooVKZu8}zspok3;dH;m3T;R{05*|mK3Fx_DqZEFSf-S#b zlWM5m0&T2&;4fV)2|XgOv(|Rxf{i}|;&f*vxLyRPZ2dt!c)3P9|1_cyTN)y %tDTMB5DiI==pR*RmZxGndR=J2$|0pSnZK&gCpL<$->T4N z^l1-Hjk`xI0>n?a8&{DKjBoOehZlzM5a^RBNs_+j5&6-gcH=FA9B#GiO8BFF|D!7O ztQ4n&^LGqp`?j0=-w;5o|BAs )@2=17=|rlHSM3%O$Rm(Ysv}ENUB1 27Pl#V+ ODUaYHNYOU)xROH= z(`>3`%o Plf&QNeF|LoniH-AsP zj^>-(oL&1yT=0^Tpskn3rT+}$crZH 00_nGrjemJe4q>` (9gNhWk8#3>3nc|GXu3P}!2kOJ`CSHF%3xVAWUIZAMhmr>g2i%Jbb0JhC_c-j zt84>nuWYfmiS{=ezlfKseqisuUpKj9PYDtN WIJqq`gyMrkiOs*%5V=BDbuaGZj$0JIFGiFJA~o7J}ZD3ZO*?RJ9Q5EW~e0M6=tP zXjkSI@*7yrrP+tgrLX^*Iwt*#OQH*UfV+puRfLMqVxQj$mRr0QcBu+oaIv-&n8NSv zs8DJL?7&NU_rk7&rwbpXw4C9*_AvBTH850|ZD9Xi Nuj-PBL7%c3cN zZkIUR(xPd*Kh41(Of%tMz52P2<`XC+5wjg8psBsfho=fi_d@VKbdbWJ_%0#UM*gut zMzP*#BPb-2gH>zliTD)Z2|X5&?m1aNn~cH`K+#>|t%K^x@csxX##%p_V2nfk66yCi z_4{Y-4fRK50Uv2Jq3{!>oD09zL>VV6&?ZnoSqS`PF&4`0)=mKNLHqzpB_`uxpp~Mf z>oP@{L o+&OvZug$n2c-d z*mZk->ih1L2pUYF+hn2wsPs#~N#@gFg{ELa_bcHgGrrh`BrIay?gotiMDm}mBB( >2$9WE2(y0y+9@6d)6mJ^T~wx5 z0)vfhn^YnnSS9&607pgg=YIPJ6}y`UVLiSY8H8kTqLh^-vwC#D_6|k*W&?f2wLbzi zt}j#~r@39xS`OA(EK2xKn Jo)sEhwR z*}M*wuo#PR8!CPyO^s(PxpYEe?{%iYmZ9SoI4FvT65kb7!B{?F;ki4qW4jKVr{sY{ z*%@B_A8_lw`U`h^jg8CH-~aYS{BH@fN;$qcf4>|&;;%TAIh&PoS1&Ar*S&wDwP-9q znIy$`!W{S5EMVD*7T_5*^l0}tVQwopmYjPJEKkwS4vV9g#zcBCcIsFq8b&af7`+?1 zM5rtuH7pRnlvOkf+fHft4%Ri?4#bLY|0B |>}!5Yf>%>2{9qtBe@J)c-2w-`S(6iyeSz%3vrO_aWK)~d?&h!&xb L4wRuLbGlHiJX>(m#4bUI=md@tTMY=Wn>VtQ2hKA03A1eItqT@uApZsqk> z@pEf Zj{`gN|1y`KsSSgL2Uoh_HS%7ClKEy qM# z;pCeL_A# XQt72tzT~Hm21%jvtDRm$H_~uj z$nzpQq{DY_*KVHA9aXwhM`>J}kprLZFCER^I;RJ@pKhL2CtI|6U-uJ9VRKcl&TelG zE#KO-5r+x9q9pkcIaNn^TV9wdUwLzT=1&(@TuViFTnQ!p)L|bZO`p4IMX7 aWga!U8S1}|m8obc_XyF^Rs3^N2^zFah8MzreLLJOX>fUNLBV$My)p;&fKO<$ zSczhCg(neYnuiqiHSaZFOhk{c2`LN!Ys|jG(3hz4dBK{bbqz_J>c6UbCb|oWFZqo8 zIB@i!L*WlBp8S~Kfc6j9(y#>^1Nc#*jw(=C$N#Dd5zBiaDb3^q^P{3MFB*Ho+9v?h zVcoaTc=6{M#7HT`tZnC}s3&8bJ~TW50Veq7Aq=FF{3rneKEY|T7mg}Ztv$2BB(S zpFJSGCR`v9#PWRtN)E|P5DG&$^y@`hBpl+DiNXQ()uzLlwxE!()HB(Lf?7Q!L4Ob| zxGn_{*jQ`m|DZ|{3TrMh;lHXPAXfQjo5w+%HSNhiM8oa}$pT+dXld_+c&~ z=0X^V+Of&umd@M9i?oTrBMbLJU{&q2-uKTCX^Z1BN#{Wr3^Ekm*+XZq=-*d~L8q`+ zo1J>cU!&wTmkgojhZB=#44s=bVgf5VaZ#sg)$F?T(uAZbwkB^T s|?gKel~ zpbIn+5wb`sH16nG)9552J;4Wp2Z|XnoE9HQj1S>qo^yenL21LUY?vUI)!W;0tlqQY zmPd$QZ42|C&3R~Lkg+Ot;Aw&`&g}#gYDYci+@}nowjr*8v$;9FI@eyhp(eGMs5`|g zIp&rH8v7TCE#h#Sd~0f9iR$=uhz&|9_3#n3L2CShpZ)#ss__3`VcP0;4bT)E004vl z0N^`P|E1$PnHgIf|Lgr9JpH+bR1_8)QYT&Ym+x^~xmpu0@R)CA<}y>`P7Kcea11#M z&v_xgA`==Au&>vsu`g(Qm=@5vHM~GH03-rY(mMt)t8)jRLD+d>Dz?JoGA3PZPq>e7 z>TBt9O{sc0t ;G@ zVAhut&Q(b=F^I1x<&zy*aDwJ}!k7b4pSsQ-bZoCJ6D?Btw!-+BlJ6A1ZSQD tF39|5#>8 n ziYZWr!6KwjPkdIyh#@L|V1XYVr@+8F=mFN!m@6H+fkjX`2^-_@7A;zOo{|)ffp=FX za|}`aytWxz0BP&JzzKcB<>g~00Pd9TQYPBUNs|h^Lv`qQuZLq?X7Gnn|EBw;CUzI1 z5BqDd_!Ic1>pTU#^5bn-@; p++&D}#W W6Cf%sb6@lqI-^OSj#IG<;7W}TQ =|ngwx2IcU!Hd)uTN25u6OUYEAvM;vx8lqmt{*` z@2{*6)w{hYRiB@IXIb8^4-dMZ4;PM6kCoj+te(=ygfln}ftPn6XvaHpkppiM;fB&U zkl6k _ ?*FZin-CB5m^Yk8XHIPoX$M? z$UP)k6!#n=JklMcm~)0?(NH;FsXn@@ynfpjL##pY3Q <3irj$%cbz zt|fN6N*sfbb+Fz(D(6IQ^+?EAZ1GUsJY?UNZ}H+MaV=DO9f@ 1)G)d?!Qf8m=63%#Af!qsR~n;g|LY{&)^9LC2=oz_Ko_Zv-TfZCe=-xcm+c z6sUl?zcrwu=xmWLFNaXm^moS?wPV;<8mNldINirukXOM2=sg3A0 0RC9Mt^asG5V?>Nmq`9Gy>0PokC*?A~2sc);FnXWlNQq6w~O zfI~id8!-(JrR71!F@$_~q?+(|o4XKZj!F@Kx*wQa7SgN(h{P&g5i@(4-Z)mChkUXb zM|JtM1o#bAJvYU3wkeK&wg8!;Uw&1WV{RL}M|DfoX4F-drk0hGKKH4yv_0Oc&^W4$ zX)Q2zHdRF_j-ebtE3=9W4c-5ag>Lw55?@2qV6e}h3Kt#Fly(9ECX+ULPs3KxBLbs) zHyG!i25n^&y?x45x|@eVmo1~r0z1<(t};cUX$QGM#AKCPwV!S?=dVc` GsvTA$^ZS6G-j4y}3V_+i%fAfv=T(H1_& z>6q)p8Pr(B%80%gGMv6TpQJz3EgXV(R4W7opEqJHg*0C}Vt|X YC9^?*P3Yep@Fp92&9oc-u171+*~a=lAtLjwz{aaAQNiht7m$}85v5nUL~ zR`UP?4-1X6h}XW3+UE4HxV7|V>io5kRc>olDdVbmcu3i06`WS~X>mcL_VHSZ8}T6H z?L$tSP4}Zgp>6Y$Me@SkMHvdbL$zeX_FmFow2K1+_En*b#~mqK2^g;J!Fw5_Q8L1! zOBV_YwIg1&Z63z5!DjiqF;M?WLTA _e_U@cr27fy4GRE3vIYR~ z{qgsI+0n_(%GmMm^R0cHHJe@WN3Vhp@Ug4<8eovzXa%2a9P`E|mJ!Lj(_}*R3+P&z z)O#~t^DcwmR&pyCqdkAh&KZ?!KInnrXtUlrMxVN@yyQH@6wU*C)Y-b6e!+suHrx3( z)qGwhxtSJQ+8cmFuR#MdFY?Kkf8Aa`b!`ld1O;WPL6H2QM(j8AN+3St>I=?5y}fvr zY8C~2H^vn0%;;V^o(Nt-tVL(&9C?B%Tf@QVya01=?9I5Urruqfd75b53;0}>T~}Lj zjEi!j(Z0)Q)7|o;uhr!N_+|NMCAOC8KRo-bl@)z|I^*cM6w=GCMXIZ(O{7Ju4UXf_ z#V8thfvxJ7a8_aT7*VOx?S-|VRbnc9yfJV-hj*EzAKjmdY~yEC{*%WCWp4Y@1K|_m z@Y%L|cVi0oaxZJO?V<-&iVgQNV;Y)>25=MbMB0<2+AIFUz{2Cwa(_2WYR#o1>fFIy zcl2`O$`d^}>bJ2TKcijnkrVt>$fnNFtLLW77b@Q4?ko9XXD;6ARgNuq7GA2K^UcH9 z$^C_hN27mpyzJy?q=9^5{Jv_F7?~0Y*AJdU)aAM(?w%Nja9pCLN68zCYCR!ZO`zYe z*b2AG-T0_MO0`r0WO=#4pU~1+8FQec)5BhZfIlj{@fn90jc@V6x_3t#e26H>1L037 zQ^wD$(~G|P>0jb5%Ex2`t6lhcVQtIT%&qaY1;zMgVid+CWMNXQ++_CW2CyV*vr(Z0 z6%WfT2wka!=Vw*=hwUxu46c_ek1l|N0pU=$d;55VH6cU&I6P;ZvvheE5y(LhP)stZ zKePv`wg}()>R-><`g4wG=}~Nz7`Y`7e{X0z`h%|K4yfZ9@h147f)i5Pd3le^?vOUc zUEVYNQC-iio3Xl%kKtd>Wn((4;mZ?DRRnB)`ymPq@$dv_fG3`&?a}-+%?JpM*kVid z{za_S_glA**w^)W$9rehR$tG9y>aXc|0)0*aMrgbvm8Ht%6|k0Q_Sa VsUllvrllN zXW9BL`n1I?vmr&8JympR47$<2Im>JXe~-}F=@wKlW{c51qdU1DT$?l`5*@hPCevi} zr}|}G74E*oS^=8XdrQ_k)C*O;j@=6P7evU}rD39(u`Yk5Ia`Vy-;<1LMjF_B8nZ{o zBX6h8yBf;G+@xHnnmei*JlqzkIj#Hi=W&azZ 8+Gvdk_dOc{Ysdj?WR9DU&cag3r;JWE5%`n}jhmM^*(=U{S`?I^=DL`LfgRt7c zB?=@#zR29{tm#P!b--Q$A6gIqiaAVlh#ZrElK`5LeJGHtdK3G&okkIb>==PQ ;W`D4ZO`_$S& c==)yHMjvHIw-`Wn1B*vP?inEK&$$o zHpe!U3H!S7Bo{vl5hJ2OIW>LTar3`R&RC50SXMxElJ9W_my$msaF{CBG*WL%S>=dd zA3Xkg1CrwO_T)T_;||yr_@l|%Y!o_yJT)69cfi1I3N=&yN=%0QLv nuA`-uk3MX4L*dw2n7fS1=xRIgzt&P@JcF{sr($fP#q=W 5%Uf2J9R0f$dRN0=GDqcgzT3jq}dyi J N&jN>%os z0mjGtP4Z)vUwasV0+z5q+O2H;2;w7aSU}rnQ~r`RY;a@+j6222WhVRS229NFx8f1L zB&GMaci(%+WEUdbD3 *7Uu!7VRmKvaSeDDA%4r-QQoEdPG z=ejt+OtMX8y7mQoKcLD&*;cuH3=1R9PwU%rs-wK3u|lCPnVCl>E50S2(t8oMR!S^} z?TJco7zyPc96>o`%q=kB9(KVfGg1or?i(qDAtGZ;wlNHcmR?_Pip{)hQ1c4i>lq_7 zL1p^Tk6M_IlZzgddt0O0(xYJ52HwS*iXU45zA`o>w#om}N>8*lr#!B_#bvSMQ+Pg5 zgG9`hzAGjo(t!!Ipg@3?%)AgY$#e(TK7*j-u*L#Cq%0O*s=_!AER4y8*|>g<`#h!< zhU9%)o9y*DPGiWiL$+m)FNRupIuM~8Ot;uY`6rpgPk9!$))o4Mbt`n#M41o9Uz-1b z){SL5`88M}JZL>bSi!MmR+ZHE-Onz*k#QuLP>5_lR9@L&361DT`J80)IDzgi(FH#Y zsC~3U*xp%w^AQxpU5%ZxHy9PuTU?815`6l(M$rZ!P#60PUS7GEj>$n*q-$Mig-*#w zZH11l*53lAJDBO=HV`-bst^Cn4vPIml#Wrs5H}#pew4%9x0YfKpO#3IlJlf pHEm$Xj_X2(PykJpGU zYDet9NLI9U$9>Fm0avZ7mJ&q0hv#JyQD2Pn=hek7=n?US&i8iAR)MJG;`HEU$ &80?4~P#+#@`}?M!Nsb7EnG~G0r^J zVDQc#R^QkghK^<&w}9|KN7UIKf;_msN-KJYKOo`O9|v23e~ZObcI1)U