Trabajo elaborado para la asignatura “Programación y manejo de datos en la era del Big Data” de la Universitat de València durante el curso 2020-2021. La página web de la asignatura puede verse aquí: https://perezp44.github.io/intro-ds-20-21-web/. Los trabajos de mis compañeros de curso pueden verse aquí.


1. Introducción

1.1. ¿Qué son los delitos?

La Rae define delito como “Acción u omisión voluntaria o imprudente penada por la ley” o como Culpa, quebrantamiento de la ley. Los delitos son por tanto, acciones que van en contra de lo establecido por la ley y que son castigados por ella con una pena grave. En este trabajo queremos ver que tendencia ha seguido el número de delitos durante los últimos años , a nivel nacional, atendiendo a la tipología penal, años y regiones. Así de ver como ha influido sobre el número de delitos registrados las restricciones a la movilidad y el confinamiento que se apodero de gran parte del pasado año 2020. LO VEMOS.

2. ¿De dónde provienen los datos?

Los datos recabados para este trabajo pertenecen al ministerio de interior del gobierno de España, y se pueden encontrar en el portal estadístico de criminalidad que se aloja en su web.

Para el año 2020 la información esta actualizada para los 9 primeros meses, desde Enero hasta Septiembre. Pero nos permite generar una visión clara sobre la tendencia y el impacto de la pandemia en el número de infracciones cometidas.

enlace al portal estadístico de criminalidad

2.2. Evolución de los delitos en España.

Para poner precedentes sobre la evolución y entender el impacto de la pandemia sobre el numero de delitos es necesario primero estudiar la tendencia que han seguido en nuestro país a lo largo de anteriores años.

Esta tabla muestra la evolución de los delitos en España desde el año 2010 hasta el 2019 (años que tienen la evolución completa de los 12 meses) atendiendo a la tipología penal.

#cargamos los datos 
EvolucionDelitosESP <-  rio::import("./datos/EvolucionESP.csv")
#seleccionamos los datos que nos interesa mostrar 
dfEvolucionDelitos <- EvolucionDelitosESP %>% select(`Total Nacional`,`A2019`, `A2018`,`A2017`,`A2016`,`A2015`, `A2014`, `A2013`, `A2012` , `A2011`, `A2010`)

dfEvolucionDelitos %>% DT::datatable(extensions = 'Buttons', 
                               options = list(dom = 'Blfrtip', 
                                              buttons = c('copy', 'csv', 'excel', 'pdf', 'print'), 
                                              pageLength = 5, autoWidth = TRUE ))

A continuación, se muestra una tabla con el total de Infracciones Penales de cada año (la suma de todos los delitos cometidos durante el año con independencia de la tipología penal). Podemos observar que la tendencia de los últimos 4 años es ascendente pero si observamos en la tabla interactiva de arriba , el 2016 venía precedido de una caída notable en el número de delitos, por lo que para 2019 con 411903 infracciones penales cometidas todavía no se han alcanzado las 461042 que se registraron en 2010. Si bien es cierto que para el 2020 se ha experimentado una fuerte caída como veremos a continuación.

#cargamos los datos
EvolucionDelitosESP <-  rio::import("./datos/EvolucionESP.csv")
#filtramos para mostrar el total de infracciones de cada año desde 2016 hasta 2019.
TotalInfracciones19 <- EvolucionDelitosESP %>% slice_max(A2019, n=1) %>% select("Total Nacional","A2019") 
TotalInfracciones18 <- EvolucionDelitosESP %>% slice_max(A2018, n=1) %>% select("Total Nacional","A2018")
TotalInfracciones17 <- EvolucionDelitosESP %>% slice_max(A2017, n=1) %>% select("Total Nacional","A2017")
TotalInfracciones16 <- EvolucionDelitosESP %>% slice_max(A2016, n=1) %>% select("Total Nacional","A2016")
#precargamos la imagen para incorporarla en las tablas 
ImagenDelitos <- "https://upload.wikimedia.org/wikipedia/commons/thumb/9/9a/Flag_of_Spain.svg/1200px-Flag_of_Spain.svg.png"

Tabla_TotalInfracciones19 <- TotalInfracciones19 %>% gt()

Tabla_TotalInfracciones19 <- TotalInfracciones19 %>% add_column(ImagenDelitos) %>% 
  select("Total Nacional", "A2019" , "ImagenDelitos") %>% ungroup()

Tabla_TotalInfracciones19 %>% gt() %>% 
  gt::text_transform(locations = cells_body(columns = vars(ImagenDelitos)),
                     fn = function(x) {gt::web_image(x, height = 50)}) %>% tab_header(title = md("**Infracciones penales año 2019**"),subtitle = md("**Total Nacional**")) %>%
  tab_options(heading.background.color = "orange", column_labels.font.weight = "bold")
Infracciones penales año 2019
Total Nacional
Total Nacional A2019 ImagenDelitos
TOTAL INFRACCIONES PENALES 411903


Tabla_TotalInfracciones18 <- TotalInfracciones18 %>% gt()

Tabla_TotalInfracciones18 <- TotalInfracciones18 %>% add_column(ImagenDelitos) %>% 
  select("Total Nacional", "A2018" , "ImagenDelitos") %>% ungroup()

Tabla_TotalInfracciones18 %>% gt() %>% 
  gt::text_transform(locations = cells_body(columns = vars(ImagenDelitos)),
                     fn = function(x) {gt::web_image(x, height = 50)}) %>% tab_header(title = md("**Infracciones penales año 2018**"),subtitle = md("**Total Nacional**")) %>%
  tab_options(heading.background.color = "orange", column_labels.font.weight = "bold")
Infracciones penales año 2018
Total Nacional
Total Nacional A2018 ImagenDelitos
TOTAL INFRACCIONES PENALES 394824


Tabla_TotalInfracciones17 <- TotalInfracciones17 %>% gt()

Tabla_TotalInfracciones17 <- TotalInfracciones17 %>% add_column(ImagenDelitos) %>% 
  select("Total Nacional", "A2017" , "ImagenDelitos") %>% ungroup()

Tabla_TotalInfracciones17 %>% gt() %>% 
  gt::text_transform(locations = cells_body(columns = vars(ImagenDelitos)),
                     fn = function(x) {gt::web_image(x, height = 50)}) %>% tab_header(title = md("**Infracciones penales año 2017**"),subtitle = md("**Total Nacional**")) %>%
  tab_options(heading.background.color = "orange", column_labels.font.weight = "bold")
Infracciones penales año 2017
Total Nacional
Total Nacional A2017 ImagenDelitos
TOTAL INFRACCIONES PENALES 375865


Tabla_TotalInfracciones16 <- TotalInfracciones16 %>% gt()

Tabla_TotalInfracciones16 <- TotalInfracciones16 %>% add_column(ImagenDelitos) %>% 
  select("Total Nacional", "A2016" , "ImagenDelitos") %>% ungroup()

Tabla_TotalInfracciones16 %>% gt() %>% 
  gt::text_transform(locations = cells_body(columns = vars(ImagenDelitos)),
                     fn = function(x) {gt::web_image(x, height = 50)}) %>% tab_header(title = md("**Infracciones penales año 2016**"),subtitle = md("**Total Nacional**")) %>%
  tab_options(heading.background.color = "orange", column_labels.font.weight = "bold")
Infracciones penales año 2016
Total Nacional
Total Nacional A2016 ImagenDelitos
TOTAL INFRACCIONES PENALES 367936

Las tablas muestran de una forma resumida el número de infracciones totales para los últimos 4 años, excluyendo el 2020.

Este gráfico interactivo muestra el Total de Infracciones cometidas (Delitos) atendiendo a la Comunidad autónoma durante el año 2019. Podemos observar como Andalucía es la comunidad autónoma donde se registran mayor número de delitos, seguido por la Comunidad de Madrid y la Comunidad Valenciana.

#importamos los datos
EvolucionDelitosEspaña<-  rio::import("./datos/DATOSCOMUNIDADAUTO.csv")

EvolucionDelitosESP <-  rio::import("./datos/EvolucionESP.csv")

GraficoEvolucionDelitos = EvolucionDelitosESP[!44]



EvolucionDelitosEspa<-  rio::import("./datos/DATOSCOMUNIDADAUTO.csv")

EvolucionDelitosESP <-  rio::import("./datos/EvolucionESP.csv")

#LIMPIAMOS DATOS, eliminando todas las filas que contienen valores nulos NA y cambiamos nombres de columnas

EvolucionDelitosComuni <- na.omit(EvolucionDelitosEspa)

EvolucionInfraEsp <- rio::import("./datos/EvolucionInfraccionesESP.csv")

names(EvolucionInfraEsp)
#> [1] "Comunidades"  "Infracciones" "Años"
colnames(EvolucionInfraEsp)[3] <- "Fechas"

# Define the number of colors you want
nb.cols <- 19
mycolors <- colorRampPalette(brewer.pal(8, "Set2"))(nb.cols)
# Create a ggplot with 18 colors 


Comuni2019 <- EvolucionDelitosComuni %>% group_by(Comunidades, A2019)

library(plotly)
grComuni2019 <- ggplot(Comuni2019, aes(A2019,Comunidades, fill = Comunidades)) + scale_fill_manual(values = mycolors) + geom_col(position = "dodge") + labs(x = "Infracciones", y = "Comunidades", title = "Delitos por comunidades en 2019") + theme_bw() + theme(plot.title = element_text(hjust = 0))
grComuni2019

En este mapa se encuentra geolocalizadas las todas las Comunidades Autónomas y muestran con un pop-up el total de Infracciones penales cometidas durante el año 2019 en dicha región.


MapaDelitosEspaña <- leaflet() %>%
  setView(lng = -5.99629, lat = 37.3826, zoom = 5) %>% 
  addMarkers(lng = -5.99629, lat = 37.3826 , popup = "ANDALUCÍA-89.729")%>%
  setView(lng = -0.876566, lat = 41.6563, zoom = 5) %>% 
  addMarkers(lng = -0.876566, lat = 41.6563 , popup = "ARAGÓN-10.891") %>% 
  setView(lng = -5.84476, lat = 43.36029, zoom = 5) %>% 
  addMarkers(lng = -5.84476, lat = 43.36029 , popup = "PRINCIPADO DE ASTURIAS-8.143")%>%
  setView(lng = 2.65024, lat = 39.56939, zoom = 5) %>% 
  addMarkers(lng = 2.65024, lat = 39.56939 , popup = "BALEARES-15.306") %>% 
  setView(lng = -15.5000000, lat = 28.0000000, zoom = 5) %>% 
  addMarkers(lng = -15.5000000, lat = 28.0000000 , popup = "CANARIAS-24.731")%>%
  setView(lng = -3.80444, lat = 43.46472, zoom = 5) %>% 
  addMarkers(lng = -3.80444, lat = 43.46472 , popup = "CANTABRIA-4.139") %>% 
  setView(lng = -4.72372, lat = 41.65518, zoom = 5) %>% 
  addMarkers(lng = -4.72372, lat = 41.65518 , popup = "CASTILLA Y LEON-16.860")%>%
  setView(lng = -1.85643, lat = 38.99424, zoom = 5) %>% 
  addMarkers(lng = -1.85643, lat = 38.99424 , popup = "CASTILLA LA MANCHA-19.638") %>% 
  setView(lng = 2.16992, lat = 41.3879, zoom = 5) %>% 
  addMarkers(lng = 2.16992, lat = 41.3879 , popup = "CATALUÑA-38.424")%>%
  setView(lng = -0.376805, lat = 39.4702, zoom = 5) %>% 
  addMarkers(lng = -0.376805, lat = 39.4702 , popup = "COMUNITAT VALENCIANA-50.416") %>%  
  setView(lng = -6.4230578, lat = 38.9743700, zoom = 5) %>% 
  addMarkers(lng = -6.4230578, lat = 38.9743700 , popup = "EXTREMADURA-8.284")%>%
  setView(lng = -8.54569, lat = 42.88052, zoom = 5) %>% 
  addMarkers(lng = -8.54569, lat = 42.88052 , popup = "GALICIA-18.565") %>%   
  setView(lng = -3.70256, lat = 40.4165, zoom = 5) %>% 
  addMarkers(lng = -3.70256, lat = 40.4165 , popup = "COMUNIDAD DE MADRID-73.308")%>%
  setView(lng = -1.1300400, lat = 37.9870400, zoom = 5) %>% 
  addMarkers(lng = -1.1300400, lat = 37.9870400 , popup = "MURCIA-15.770") %>% 
  setView(lng = -1.64323, lat = 42.81687, zoom = 5) %>% 
  addMarkers(lng = -1.64323, lat = 42.81687 , popup = "NAVARRA-4.500")%>%
  setView(lng = -2.67268, lat = 42.84998, zoom = 5) %>% 
  addMarkers(lng = -2.67268, lat = 42.84998 , popup = "PAIS VASCO-5.128") %>%  
  setView(lng = -2.4500000, lat = 42.4666700, zoom = 5) %>% 
  addMarkers(lng = -2.4500000, lat = 42.4666700 , popup = "RIOJA-3.120")%>%
  setView(lng = -5.32042, lat = 35.88919, zoom = 5) %>% 
  addMarkers(lng = -5.32042, lat = 35.88919 , popup = "CIUDAD AUTÓNOMA DE CEUTA-2.162") %>%  
  setView(lng = -2.93833, lat = 35.29369, zoom = 5) %>% 
  addMarkers(lng = -2.93833, lat = 35.29369 , popup = "CIUDAD AUTÓNOMA DE MELILLA-2.789") %>% addTiles()

MapaDelitosEspaña

3. ¿Qué ha pasado en 2020?

Como decíamos, el 2020 ha sido un año atípico, la pandemia, el confinamiento y las restricciones sobre la movilidad han hecho efecto no solo sobre la economía, sino también sobre el número de delitos cometidos en nuestro país. Para el año 2020 se ha experimentado una fuerte caída en el número de Infracciones penales cometidas. En el primer trimestre de 2020, durante los meses que precedían el confinamiento ya se experimento una caída del 8,9% respecto al primer trimestre del año anterior. Esta caída sería mucho más pronunciada en los dos siguientes trimestres ( periodos para los que se dispone información actualmente).

Entre Enero y Junio la caída a nivel nacional es del 24,8%, todavía mayor en los grandes núcleos urbanos como es la capital u otras ciudades grandes. Como vemos en la tabla de Enero a Septiembre la caída se recupera respecto a el año anterior debido al levantamiento de algunas restricciones a la movilidad, pero siguen siendo bastante alta.


#importar datos

#primer trimestre
primertrimestreESP <- rio::import("./datos/primertrimestreESP.csv")

names(primertrimestreESP)[4] <- "Variacion19%20"
names(primertrimestreESP)[2] <- "EneroMarzo19"
names(primertrimestreESP)[3] <- "EneroMarzo20"

dfprimertrimestre <- primertrimestreESP %>%  slice(c(15))

VarDelitosprimertri <- dfprimertrimestre

VarDelitosprimertri %>% gt() %>% tab_header(title = md("**Variación Delitos 1er Trimestre 2020 y 2019**"),subtitle = md("**España**")) %>%
  tab_options(heading.background.color = "black", column_labels.font.weight = "bold")
Variación Delitos 1er Trimestre 2020 y 2019
España
Delitos EneroMarzo19 EneroMarzo20 Variacion19%20
TOTAL INFRACCIONES PENALES 529.066 481.872 -8,9


#segundo trimestre

segundotrimestreESP <- rio::import("./datos/segundotrimestreESP.csv")
names(segundotrimestreESP)[4] <- "Variacion19%20"
names(segundotrimestreESP)[2] <- "EneroJunio19"
names(segundotrimestreESP)[3] <- "EneroJunio20"

dfsegundotrimestre <- segundotrimestreESP %>%  slice(c(15))

VarDelitossegundotri <- dfsegundotrimestre

VarDelitossegundotri %>% gt() %>% tab_header(title = md("**Variación Delitos 2ndo Trimestre 2020 y 2019**"),subtitle = md("**España**")) %>%
  tab_options(heading.background.color = "black", column_labels.font.weight = "bold")
Variación Delitos 2ndo Trimestre 2020 y 2019
España
Delitos EneroJunio19 EneroJunio20 Variacion19%20
TOTAL INFRACCIONES PENALES 1.069.105 803.609 -24,8


#tercer trimestre

tercertrimestreESP <- rio::import("./datos/tercertrimestreESP.csv")
names(tercertrimestreESP)[4] <- "Variacion19%20"
names(tercertrimestreESP)[2] <- "EneroSeptiembre19"
names(tercertrimestreESP)[3] <- "EneroSeptiembre20"

dftercertrimestre <- tercertrimestreESP %>%  slice(c(15))

VarDelitostercertri <- dftercertrimestre

VarDelitostercertri %>% gt() %>% tab_header(title = md("**Variación Delitos 3er Trimestre 2020 y 2019**"),subtitle = md("**España**")) %>%
  tab_options(heading.background.color = "black", column_labels.font.weight = "bold") 
Variación Delitos 3er Trimestre 2020 y 2019
España
Delitos EneroSeptiembre19 EneroSeptiembre20 Variacion19%20
TOTAL INFRACCIONES PENALES 1644917 1312481 -20,2

En esta tabla interactiva se puede observar la evolución de los Delitos cometidos durante los primeros 9 meses de 2020 respecto a los 9 primeros del año anterior, atendiendo a la tipología penal, y la comunidad (cada página recoge los datos de una comunidad autónoma).

#REALIZAMOS UNA TABLA INTERACTIVA SEGUN LA COMUNIDAD, TIPOLOGIA PENAL Y PERIODOS

DENEROSEPTIEMBRE20 <- rio::import("./datos/ENEROSEPTIEMBRE20.csv")

names(DENEROSEPTIEMBRE20)[4] <- "Variacion19%20"
names(DENEROSEPTIEMBRE20)[1] <- "C.AUTONOMA, TIPOLOGIA PENAL Y PERIODOS"


dfEneroSeptiembre <- DENEROSEPTIEMBRE20 
dfEneroSeptiembre %>% DT::datatable(extensions = 'Buttons', 
                                     options = list(dom = 'Blfrtip', 
                                                    buttons = c('copy', 'csv', 'excel', 'pdf', 'print'), 
                                                    pageLength = 16, autoWidth = TRUE ))

Este gráfico muestra el total de infracciones penales según la tipología penal para los primeros 9 meses del 2020.

#graficos para 2020 segun tipologia penal 

ggplot(tercertrimestreESP,aes(Delitos,EneroSeptiembre20,color = Delitos,fill= Delitos)) +
  geom_bar(position = "stack",  width =.18,stat="identity") +
  coord_flip()+
  geom_text(aes(label= EneroSeptiembre20 ,hjust=-.03,  colour="black"),size=3.2)+
  theme(axis.line = element_line(color = "orange",size=1))+
  theme(panel.background=element_blank())+
  scale_x_discrete() +
  xlab(NULL)+ylab(NULL)+
  theme(legend.position = "none",
        axis.text = element_text(size = 8,face="bold"),
        plot.title = element_text(size=14,face = "bold")) +
  ggtitle("Infracciones Penales Enero-Septiembre 2020 " ,subtitle = "Total Nacional")

4. Conclusión

El confinamiento ha sido determinante en la caída del número de delitos registrados en nuestro país durante el 2020. Entre Marzo y Junio, meses durante los cuales las restricciones a la movilidad eran más extremas, la caída fue del 20,4%. Con el levantamiento de las restricciones en verano se registro una pequeña subida , aunque respecto al año anterior la caída sigue siendo del 20,2%. Como observamos en la última tabla interactiva, es especialmente relevamente la caída en el número de hurtos y robos en domicilio, debido a que la gente permanecía en cuarentena dentro de sus casas debido al estado de alarma.

2020 ha sido un año complicado, del que dificilmente podemos extraer cosas positivas, salvo que el número de delitos se ha visto drasticamente reducido. Veremos que depara el año 2021.

current session info


- Session info ---------------------------------------------------------------
 setting  value                       
 version  R version 4.0.3 (2020-10-10)
 os       Windows 10 x64              
 system   x86_64, mingw32             
 ui       RTerm                       
 language (EN)                        
 collate  Spanish_Spain.1252          
 ctype    Spanish_Spain.1252          
 tz       Europe/Paris                
 date     2021-01-13                  

- Packages -------------------------------------------------------------------
 package           * version    date       lib source                        
 assertthat          0.2.1      2019-03-21 [1] CRAN (R 4.0.3)                
 backports           1.2.0      2020-11-02 [1] CRAN (R 4.0.3)                
 base64enc           0.1-3      2015-07-28 [1] CRAN (R 4.0.3)                
 broom               0.7.3      2020-12-16 [1] CRAN (R 4.0.3)                
 cellranger          1.1.0      2016-07-27 [1] CRAN (R 4.0.3)                
 checkmate           2.0.0      2020-02-06 [1] CRAN (R 4.0.3)                
 class               7.3-17     2020-04-26 [2] CRAN (R 4.0.3)                
 classInt            0.4-3      2020-04-07 [1] CRAN (R 4.0.3)                
 cli                 2.2.0      2020-11-20 [1] CRAN (R 4.0.3)                
 clipr               0.7.1      2020-10-08 [1] CRAN (R 4.0.3)                
 codetools           0.2-16     2018-12-24 [2] CRAN (R 4.0.3)                
 colorspace          2.0-0      2020-11-11 [1] CRAN (R 4.0.3)                
 commonmark          1.7        2018-12-01 [1] CRAN (R 4.0.3)                
 crayon              1.3.4      2017-09-16 [1] CRAN (R 4.0.3)                
 crosstalk           1.1.0.1    2020-03-13 [1] CRAN (R 4.0.3)                
 curl                4.3        2019-12-02 [1] CRAN (R 4.0.3)                
 data.table          1.13.6     2020-12-30 [1] CRAN (R 4.0.3)                
 DBI                 1.1.0      2019-12-15 [1] CRAN (R 4.0.3)                
 dbplyr              2.0.0      2020-11-03 [1] CRAN (R 4.0.3)                
 desc                1.2.0      2018-05-01 [1] CRAN (R 4.0.3)                
 details             0.2.1      2020-01-12 [1] CRAN (R 4.0.3)                
 digest              0.6.27     2020-10-24 [1] CRAN (R 4.0.3)                
 dplyr             * 1.0.2      2020-08-18 [1] CRAN (R 4.0.3)                
 DT                * 0.17       2021-01-06 [1] CRAN (R 4.0.3)                
 e1071               1.7-4      2020-10-14 [1] CRAN (R 4.0.3)                
 ellipsis            0.3.1      2020-05-15 [1] CRAN (R 4.0.3)                
 evaluate            0.14       2019-05-28 [1] CRAN (R 4.0.3)                
 fansi               0.4.1      2020-01-08 [1] CRAN (R 4.0.3)                
 farver              2.0.3      2020-01-16 [1] CRAN (R 4.0.3)                
 forcats           * 0.5.0      2020-03-01 [1] CRAN (R 4.0.3)                
 foreign             0.8-80     2020-05-24 [2] CRAN (R 4.0.3)                
 fs                  1.5.0      2020-07-31 [1] CRAN (R 4.0.3)                
 generics            0.1.0      2020-10-31 [1] CRAN (R 4.0.3)                
 gganimate         * 1.0.7      2020-10-15 [1] CRAN (R 4.0.3)                
 ggplot2           * 3.3.3      2020-12-30 [1] CRAN (R 4.0.3)                
 ggrepel           * 0.9.0      2020-12-16 [1] CRAN (R 4.0.3)                
 ggspatial         * 1.1.5      2021-01-04 [1] CRAN (R 4.0.3)                
 ggthemes          * 4.2.0      2019-05-13 [1] CRAN (R 4.0.3)                
 gifski            * 0.8.6      2018-09-28 [1] CRAN (R 4.0.3)                
 glue                1.4.2      2020-08-27 [1] CRAN (R 4.0.3)                
 gt                * 0.2.2      2020-08-05 [1] CRAN (R 4.0.3)                
 gtable              0.3.0      2019-03-25 [1] CRAN (R 4.0.3)                
 haven               2.3.1      2020-06-01 [1] CRAN (R 4.0.3)                
 here                1.0.1      2020-12-13 [1] CRAN (R 4.0.3)                
 hms                 0.5.3      2020-01-08 [1] CRAN (R 4.0.3)                
 htmltools           0.5.0      2020-06-16 [1] CRAN (R 4.0.3)                
 htmlwidgets         1.5.3      2020-12-10 [1] CRAN (R 4.0.3)                
 httr                1.4.2      2020-07-20 [1] CRAN (R 4.0.3)                
 jsonlite            1.7.2      2020-12-09 [1] CRAN (R 4.0.3)                
 kableExtra        * 1.3.1      2020-10-22 [1] CRAN (R 4.0.3)                
 KernSmooth          2.23-17    2020-04-26 [2] CRAN (R 4.0.3)                
 klippy            * 0.0.0.9500 2021-01-11 [1] Github (rlesur/klippy@378c247)
 knitr             * 1.30       2020-09-22 [1] CRAN (R 4.0.3)                
 labeling            0.4.2      2020-10-20 [1] CRAN (R 4.0.3)                
 lattice             0.20-41    2020-04-02 [2] CRAN (R 4.0.3)                
 lazyeval            0.2.2      2019-03-15 [1] CRAN (R 4.0.3)                
 leafem            * 0.1.3      2020-07-26 [1] CRAN (R 4.0.3)                
 leaflet           * 2.0.4.1    2021-01-07 [1] CRAN (R 4.0.3)                
 lifecycle           0.2.0      2020-03-06 [1] CRAN (R 4.0.3)                
 lubridate           1.7.9.2    2020-11-13 [1] CRAN (R 4.0.3)                
 magrittr            2.0.1      2020-11-17 [1] CRAN (R 4.0.3)                
 modelr              0.1.8      2020-05-19 [1] CRAN (R 4.0.3)                
 munsell             0.5.0      2018-06-12 [1] CRAN (R 4.0.3)                
 openxlsx            4.2.3      2020-10-27 [1] CRAN (R 4.0.3)                
 patchwork         * 1.1.1      2020-12-17 [1] CRAN (R 4.0.3)                
 pillar              1.4.7      2020-11-20 [1] CRAN (R 4.0.3)                
 pkgconfig           2.0.3      2019-09-22 [1] CRAN (R 4.0.3)                
 plotly            * 4.9.2.2    2020-12-19 [1] CRAN (R 4.0.3)                
 png                 0.1-7      2013-12-03 [1] CRAN (R 4.0.3)                
 prettyunits         1.1.1      2020-01-24 [1] CRAN (R 4.0.3)                
 progress            1.2.2      2019-05-16 [1] CRAN (R 4.0.3)                
 purrr             * 0.3.4      2020-04-17 [1] CRAN (R 4.0.3)                
 R6                  2.5.0      2020-10-28 [1] CRAN (R 4.0.3)                
 raster              3.4-5      2020-11-14 [1] CRAN (R 4.0.3)                
 RColorBrewer      * 1.1-2      2014-12-07 [1] CRAN (R 4.0.3)                
 Rcpp                1.0.5      2020-07-06 [1] CRAN (R 4.0.3)                
 readr             * 1.4.0      2020-10-05 [1] CRAN (R 4.0.3)                
 readxl              1.3.1      2019-03-13 [1] CRAN (R 4.0.3)                
 reprex              0.3.0      2019-05-16 [1] CRAN (R 4.0.3)                
 rio                 0.5.16     2018-11-26 [1] CRAN (R 4.0.3)                
 rlang               0.4.10     2020-12-30 [1] CRAN (R 4.0.3)                
 rmarkdown           2.6        2020-12-14 [1] CRAN (R 4.0.3)                
 rnaturalearth     * 0.1.0      2017-03-21 [1] CRAN (R 4.0.3)                
 rnaturalearthdata * 0.1.0      2017-02-21 [1] CRAN (R 4.0.3)                
 rprojroot           2.0.2      2020-11-15 [1] CRAN (R 4.0.3)                
 rstudioapi          0.13       2020-11-12 [1] CRAN (R 4.0.3)                
 rvest               0.3.6      2020-07-25 [1] CRAN (R 4.0.3)                
 sass                0.2.0      2020-03-18 [1] CRAN (R 4.0.3)                
 scales              1.1.1      2020-05-11 [1] CRAN (R 4.0.3)                
 sessioninfo         1.1.1      2018-11-05 [1] CRAN (R 4.0.3)                
 sf                * 0.9-6      2020-09-13 [1] CRAN (R 4.0.3)                
 sp                  1.4-4      2020-10-07 [1] CRAN (R 4.0.3)                
 stringi             1.5.3      2020-09-09 [1] CRAN (R 4.0.3)                
 stringr           * 1.4.0      2019-02-10 [1] CRAN (R 4.0.3)                
 tibble            * 3.0.4      2020-10-12 [1] CRAN (R 4.0.3)                
 tidyr             * 1.1.2      2020-08-27 [1] CRAN (R 4.0.3)                
 tidyselect          1.1.0      2020-05-11 [1] CRAN (R 4.0.3)                
 tidyverse         * 1.3.0      2019-11-21 [1] CRAN (R 4.0.3)                
 tweenr              1.0.1      2018-12-14 [1] CRAN (R 4.0.3)                
 units               0.6-7      2020-06-13 [1] CRAN (R 4.0.3)                
 vctrs               0.3.6      2020-12-17 [1] CRAN (R 4.0.3)                
 viridisLite         0.3.0      2018-02-01 [1] CRAN (R 4.0.3)                
 webshot             0.5.2      2019-11-22 [1] CRAN (R 4.0.3)                
 withr               2.3.0      2020-09-22 [1] CRAN (R 4.0.3)                
 xfun                0.19       2020-10-30 [1] CRAN (R 4.0.3)                
 xml2                1.3.2      2020-04-23 [1] CRAN (R 4.0.3)                
 yaml                2.2.1      2020-02-01 [1] CRAN (R 4.0.3)                
 zip                 2.1.1      2020-08-27 [1] CRAN (R 4.0.3)                

[1] C:/Users/Hugo/Documents/R/win-library/4.0
[2] C:/Program Files/R/R-4.0.3/library


LS0tDQp0aXRsZTogPEZPTlQgQ09MT1I9IlllbGxvdyI+IkRFTElUT1MgRU4gRVNQQcORQS4gRVZPTFVDScOTTiBZIEVGRUNUT1MgREUgTEEgUEFOREVNSUEgU09CUkUgRUwgTsOaTUVSTyBUT1RBTCBERSBJTkZSQUNDSU9ORVMgUEVOQUxFUyBSRUdJU1RSQURBUyAiPC9GT05UPiANCmF1dGhvcjogIkh1Z28gTW9uZW8gSGVybsOhbmRleiAoaHVtb2hlckBhbHVtbmkudXYuZXMpIiAgDQpkYXRlOiAiRW5lcm8gZGUgMjAyMCAoYWN0dWFsaXphZG8gZWwgYHIgZm9ybWF0KFN5cy50aW1lKCksICclZC0lbS0lWScpYCkiDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6DQogICAgdGhlbWU6IGRhcmtseQ0KICAgIGhpZ2hsaWdodDogdGV4dG1hdGUgDQogICAgdG9jOiB0cnVlDQogICAgdG9jX2RlcHRoOiAzIA0KICAgIHRvY19mbG9hdDogDQogICAgICBjb2xsYXBzZWQ6IHRydWUNCiAgICAgIHNtb290aF9zY3JvbGw6IHRydWUNCiAgICBzZWxmX2NvbnRhaW5lZDogdHJ1ZQ0KICAgIG51bWJlcl9zZWN0aW9uczogZmFsc2UNCiAgICBkZl9wcmludDoga2FibGUNCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQplZGl0b3Jfb3B0aW9uczogDQogIGNodW5rX291dHB1dF90eXBlOiBjb25zb2xlDQotLS0NCg0KYGBge3IgcGFja2FnZXMtc2V0dXAsIGluY2x1ZGUgPSBGQUxTRX0NCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShrbGlwcHkpDQpsaWJyYXJ5KGtuaXRyKQ0KbGlicmFyeShSQ29sb3JCcmV3ZXIpDQpsaWJyYXJ5KHRpYmJsZSkNCmxpYnJhcnkoZ2d0aGVtZXMpDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeShwYXRjaHdvcmspDQpsaWJyYXJ5KGdncmVwZWwpDQpsaWJyYXJ5KHNmKQ0KbGlicmFyeShnZ3NwYXRpYWwpDQpsaWJyYXJ5KHJuYXR1cmFsZWFydGgpDQpsaWJyYXJ5KHJuYXR1cmFsZWFydGhkYXRhKQ0KbGlicmFyeShwbG90bHkpDQpsaWJyYXJ5KGdnYW5pbWF0ZSkNCmxpYnJhcnkgKGdpZnNraSkNCmxpYnJhcnkoZ3QpDQpsaWJyYXJ5KGthYmxlRXh0cmEpDQpsaWJyYXJ5KERUKQ0KbGlicmFyeShsZWFmbGV0KSANCmxpYnJhcnkobGVhZmVtKSANCmBgYA0KDQpgYGB7ciBjaHVuay1zZXR1cCwgaW5jbHVkZSA9IEZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFLCBldmFsID0gVFJVRSwgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIA0KICAgICAgICAgICAgICAgICAgICAgICNyZXN1bHRzID0gImhvbGQiLA0KICAgICAgICAgICAgICAgICAgICAgIGNhY2hlID0gRkFMU0UsIGNhY2hlLnBhdGggPSAiL2NhY2hlcy8iLCBjb21tZW50ID0gIiM+IiwNCiAgICAgICAgICAgICAgICAgICAgICAjZmlnLndpZHRoID0gNywgI2ZpZy5oZWlnaHQ9IDcsICAgDQogICAgICAgICAgICAgICAgICAgICAgI291dC53aWR0aCA9IDcsIG91dC5oZWlnaHQgPSA3LA0KICAgICAgICAgICAgICAgICAgICAgIGNvbGxhcHNlID0gVFJVRSwgIGZpZy5zaG93ID0gImhvbGQiLA0KICAgICAgICAgICAgICAgICAgICAgIGZpZy5hc3AgPSA3LzksIG91dC53aWR0aCA9ICI2MCUiLCBmaWcuYWxpZ24gPSAiY2VudGVyIikNCmtuaXRyOjpvcHRzX2NodW5rJHNldChkZXYgPSAicG5nIiwgZGV2LmFyZ3MgPSBsaXN0KHR5cGUgPSAiY2Fpcm8tcG5nIikpDQpgYGANCg0KYGBge3Igb3B0aW9ucy1zZXR1cCwgaW5jbHVkZSA9IEZBTFNFfQ0Kb3B0aW9ucyhzY2lwZW4gPSA5OTkpICMtIHBhcmEgcXVpdGFyIGxhIG5vdGFjacOzbiBjaWVudMOtZmljYQ0Kb3B0aW9ucygieWFtbC5ldmFsLmV4cHIiID0gVFJVRSkgDQpgYGANCg0KDQpgYGB7ciBrbGlwcHksIGVjaG8gPSBGQUxTRX0NCmtsaXBweTo6a2xpcHB5KHBvc2l0aW9uID0gYygidG9wIiwgInJpZ2h0IikpICMtIHJlbW90ZXM6Omluc3RhbGxfZ2l0aHViKCJybGVzdXIva2xpcHB5IikNCmBgYA0KDQotLS0tLS0tLS0tLS0tLS0tLQ0KDQo8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOiBqdXN0aWZ5Ij5UcmFiYWpvICBlbGFib3JhZG8gcGFyYSBsYSBhc2lnbmF0dXJhICJQcm9ncmFtYWNpw7NuIHkgbWFuZWpvIGRlIGRhdG9zIGVuIGxhIGVyYSBkZWwgQmlnIERhdGEiIGRlIGxhIFVuaXZlcnNpdGF0IGRlIFZhbMOobmNpYSBkdXJhbnRlIGVsIGN1cnNvIDIwMjAtMjAyMS4gTGEgcMOhZ2luYSB3ZWIgZGUgbGEgYXNpZ25hdHVyYSBwdWVkZSB2ZXJzZSBhcXXDrTogPGh0dHBzOi8vcGVyZXpwNDQuZ2l0aHViLmlvL2ludHJvLWRzLTIwLTIxLXdlYi8+LiBMb3MgdHJhYmFqb3MgZGUgbWlzIGNvbXBhw7Flcm9zIGRlIGN1cnNvIHB1ZWRlbiB2ZXJzZSBbYXF1w61dKGh0dHBzOi8vcGVyZXpwNDQuZ2l0aHViLmlvL2ludHJvLWRzLTIwLTIxLXdlYi8wNy10cmFiYWpvcy5odG1sKS48ZGl2Lz4NCg0KLS0tLS0tLS0tLS0tLS0tDQoNCjxicj4NCg0KIyA8Rk9OVCBDT0xPUj0iWWVsbG93Ij4xLiBJbnRyb2R1Y2Npw7NuIDwvRk9OVD4NCiMjIDxGT05UIENPTE9SPSJZZWxsb3ciPjEuMS4gwr9RdcOpIHNvbiBsb3MgZGVsaXRvcz8gPC9GT05UPg0KDQpgYGB7ciBldmFsID0gVFJVRSwgZWNobyA9IEZBTFNFfQ0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoaGVyZTo6aGVyZSgiaW1hZ2VuZXMiLCAiaW1hZ2VuMS5qcGciKSAgKQ0KYGBgDQoNCjxkaXYgc3R5bGU9InRleHQtYWxpZ246IGp1c3RpZnkiPg0KDQpMYSBSYWUgZGVmaW5lIGRlbGl0byBjb21vIOKAnEFjY2nDs24gdSBvbWlzacOzbiB2b2x1bnRhcmlhIG8gaW1wcnVkZW50ZSBwZW5hZGEgcG9yIGxhIGxleeKAnSBvIGNvbW8gQ3VscGEsIHF1ZWJyYW50YW1pZW50byBkZSBsYSBsZXkuIExvcyBkZWxpdG9zIHNvbiBwb3IgdGFudG8sIGFjY2lvbmVzIHF1ZSB2YW4gZW4gY29udHJhIGRlIGxvIGVzdGFibGVjaWRvIHBvciBsYSBsZXkgeSBxdWUgc29uIGNhc3RpZ2Fkb3MgcG9yIGVsbGEgY29uIHVuYSBwZW5hIGdyYXZlLiBFbiBlc3RlIHRyYWJham8gcXVlcmVtb3MgdmVyIHF1ZSB0ZW5kZW5jaWEgaGEgc2VndWlkbyBlbCBuw7ptZXJvIGRlIGRlbGl0b3MgZHVyYW50ZSBsb3Mgw7psdGltb3MgYcOxb3MgLCBhIG5pdmVsIG5hY2lvbmFsLCBhdGVuZGllbmRvIGEgbGEgdGlwb2xvZ8OtYSBwZW5hbCwgYcOxb3MgeSByZWdpb25lcy4gQXPDrSBkZSB2ZXIgY29tbyBoYSBpbmZsdWlkbyBzb2JyZSBlbCBuw7ptZXJvIGRlIGRlbGl0b3MgcmVnaXN0cmFkb3MgbGFzIHJlc3RyaWNjaW9uZXMgYSBsYSBtb3ZpbGlkYWQgeSBlbCBjb25maW5hbWllbnRvIHF1ZSBzZSBhcG9kZXJvIGRlIGdyYW4gcGFydGUgZGVsIHBhc2FkbyBhw7FvIDIwMjAuICAqKkxPIFZFTU9TKiouIA0KDQo8ZGl2Lz4NCg0KDQojIDxGT05UIENPTE9SPSJ5ZWxsb3ciPjIuIMK/RGUgZMOzbmRlIHByb3ZpZW5lbiBsb3MgZGF0b3M/IDwvRk9OVD4NCg0KPGRpdiBzdHlsZT0idGV4dC1hbGlnbjoganVzdGlmeSI+DQoNCkxvcyBkYXRvcyByZWNhYmFkb3MgcGFyYSBlc3RlIHRyYWJham8gcGVydGVuZWNlbiBhbCBtaW5pc3RlcmlvIGRlIGludGVyaW9yIGRlbCBnb2JpZXJubyBkZSBFc3Bhw7FhLCB5IHNlIHB1ZWRlbiBlbmNvbnRyYXIgZW4gZWwgcG9ydGFsIGVzdGFkw61zdGljbyBkZSBjcmltaW5hbGlkYWQgcXVlIHNlIGFsb2phIGVuIHN1IHdlYi4NCg0KUGFyYSBlbCBhw7FvIDIwMjAgbGEgaW5mb3JtYWNpw7NuIGVzdGEgYWN0dWFsaXphZGEgcGFyYSBsb3MgOSBwcmltZXJvcyBtZXNlcywgZGVzZGUgRW5lcm8gaGFzdGEgU2VwdGllbWJyZS4gUGVybyBub3MgcGVybWl0ZSBnZW5lcmFyIHVuYSB2aXNpw7NuIGNsYXJhIHNvYnJlIGxhIHRlbmRlbmNpYSB5IGVsIGltcGFjdG8gZGUgbGEgcGFuZGVtaWEgZW4gZWwgbsO6bWVybyBkZSBpbmZyYWNjaW9uZXMgY29tZXRpZGFzLg0KDQpbZW5sYWNlIGFsIHBvcnRhbCBlc3RhZMOtc3RpY28gZGUgY3JpbWluYWxpZGFkXShodHRwczovL2VzdGFkaXN0aWNhc2RlY3JpbWluYWxpZGFkLnNlcy5taXIuZXMvcHVibGljby9wb3J0YWxlc3RhZGlzdGljby8pDQoNCmBgYHtyIGV2YWwgPSBUUlVFLCBlY2hvID0gRkFMU0V9DQprbml0cjo6aW5jbHVkZV9ncmFwaGljcyhoZXJlOjpoZXJlKCJpbWFnZW5lcyIsICJtaW5pc3RlcmlvLnBuZyIpICApDQpgYGANCg0KIyMgPEZPTlQgQ09MT1I9IlllbGxvdyI+Mi4yLiBFdm9sdWNpw7NuIGRlIGxvcyBkZWxpdG9zIGVuIEVzcGHDsWEuIDwvRk9OVD4NCg0KPGRpdiBzdHlsZT0idGV4dC1hbGlnbjoganVzdGlmeSI+DQoNClBhcmEgcG9uZXIgcHJlY2VkZW50ZXMgc29icmUgbGEgZXZvbHVjacOzbiB5IGVudGVuZGVyIGVsIGltcGFjdG8gZGUgbGEgcGFuZGVtaWEgc29icmUgZWwgbnVtZXJvIGRlIGRlbGl0b3MgZXMgbmVjZXNhcmlvIHByaW1lcm8gZXN0dWRpYXIgbGEgdGVuZGVuY2lhIHF1ZSBoYW4gc2VndWlkbyBlbiBudWVzdHJvIHBhw61zIGEgbG8gbGFyZ28gZGUgYW50ZXJpb3JlcyBhw7Fvcy4gDQoNCkVzdGEgdGFibGEgbXVlc3RyYSBsYSBldm9sdWNpw7NuIGRlIGxvcyBkZWxpdG9zIGVuIEVzcGHDsWEgZGVzZGUgZWwgYcOxbyAyMDEwIGhhc3RhIGVsIDIwMTkgKGHDsW9zIHF1ZSB0aWVuZW4gbGEgZXZvbHVjacOzbiBjb21wbGV0YSBkZSBsb3MgMTIgbWVzZXMpIGF0ZW5kaWVuZG8gYSBsYSB0aXBvbG9nw61hIHBlbmFsLiANCg0KYGBge3IgZXZhbCA9IFRSVUUsIGVjaG8gPSBUUlVFfQ0KI2NhcmdhbW9zIGxvcyBkYXRvcyANCkV2b2x1Y2lvbkRlbGl0b3NFU1AgPC0gIHJpbzo6aW1wb3J0KCIuL2RhdG9zL0V2b2x1Y2lvbkVTUC5jc3YiKQ0KI3NlbGVjY2lvbmFtb3MgbG9zIGRhdG9zIHF1ZSBub3MgaW50ZXJlc2EgbW9zdHJhciANCmRmRXZvbHVjaW9uRGVsaXRvcyA8LSBFdm9sdWNpb25EZWxpdG9zRVNQICU+JSBzZWxlY3QoYFRvdGFsIE5hY2lvbmFsYCxgQTIwMTlgLCBgQTIwMThgLGBBMjAxN2AsYEEyMDE2YCxgQTIwMTVgLCBgQTIwMTRgLCBgQTIwMTNgLCBgQTIwMTJgICwgYEEyMDExYCwgYEEyMDEwYCkNCg0KZGZFdm9sdWNpb25EZWxpdG9zICU+JSBEVDo6ZGF0YXRhYmxlKGV4dGVuc2lvbnMgPSAnQnV0dG9ucycsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMgPSBsaXN0KGRvbSA9ICdCbGZydGlwJywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnV0dG9ucyA9IGMoJ2NvcHknLCAnY3N2JywgJ2V4Y2VsJywgJ3BkZicsICdwcmludCcpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlTGVuZ3RoID0gNSwgYXV0b1dpZHRoID0gVFJVRSApKQ0KDQpgYGANCkEgY29udGludWFjacOzbiwgc2UgbXVlc3RyYSB1bmEgdGFibGEgY29uIGVsIHRvdGFsIGRlIEluZnJhY2Npb25lcyBQZW5hbGVzIGRlIGNhZGEgYcOxbyAobGEgc3VtYSBkZSB0b2RvcyBsb3MgZGVsaXRvcyBjb21ldGlkb3MgZHVyYW50ZSBlbCBhw7FvIGNvbiBpbmRlcGVuZGVuY2lhIGRlIGxhIHRpcG9sb2fDrWEgcGVuYWwpLiBQb2RlbW9zIG9ic2VydmFyIHF1ZSBsYSB0ZW5kZW5jaWEgZGUgbG9zIMO6bHRpbW9zIDQgYcOxb3MgZXMgYXNjZW5kZW50ZSBwZXJvIHNpIG9ic2VydmFtb3MgZW4gbGEgdGFibGEgaW50ZXJhY3RpdmEgZGUgYXJyaWJhICwgZWwgMjAxNiB2ZW7DrWEgcHJlY2VkaWRvIGRlIHVuYSBjYcOtZGEgbm90YWJsZSBlbiBlbCBuw7ptZXJvIGRlIGRlbGl0b3MsIHBvciBsbyBxdWUgcGFyYSAyMDE5IGNvbiA0MTE5MDMgaW5mcmFjY2lvbmVzIHBlbmFsZXMgY29tZXRpZGFzIHRvZGF2w61hIG5vIHNlIGhhbiBhbGNhbnphZG8gbGFzIDQ2MTA0MiBxdWUgc2UgcmVnaXN0cmFyb24gZW4gMjAxMC4gU2kgYmllbiBlcyBjaWVydG8gcXVlIHBhcmEgZWwgMjAyMCBzZSBoYSBleHBlcmltZW50YWRvIHVuYSBmdWVydGUgY2HDrWRhIGNvbW8gdmVyZW1vcyBhIGNvbnRpbnVhY2nDs24uIA0KYGBge3IgZXZhbCA9IFRSVUUsIGVjaG8gPSBUUlVFfQ0KI2NhcmdhbW9zIGxvcyBkYXRvcw0KRXZvbHVjaW9uRGVsaXRvc0VTUCA8LSAgcmlvOjppbXBvcnQoIi4vZGF0b3MvRXZvbHVjaW9uRVNQLmNzdiIpDQojZmlsdHJhbW9zIHBhcmEgbW9zdHJhciBlbCB0b3RhbCBkZSBpbmZyYWNjaW9uZXMgZGUgY2FkYSBhw7FvIGRlc2RlIDIwMTYgaGFzdGEgMjAxOS4NClRvdGFsSW5mcmFjY2lvbmVzMTkgPC0gRXZvbHVjaW9uRGVsaXRvc0VTUCAlPiUgc2xpY2VfbWF4KEEyMDE5LCBuPTEpICU+JSBzZWxlY3QoIlRvdGFsIE5hY2lvbmFsIiwiQTIwMTkiKSANClRvdGFsSW5mcmFjY2lvbmVzMTggPC0gRXZvbHVjaW9uRGVsaXRvc0VTUCAlPiUgc2xpY2VfbWF4KEEyMDE4LCBuPTEpICU+JSBzZWxlY3QoIlRvdGFsIE5hY2lvbmFsIiwiQTIwMTgiKQ0KVG90YWxJbmZyYWNjaW9uZXMxNyA8LSBFdm9sdWNpb25EZWxpdG9zRVNQICU+JSBzbGljZV9tYXgoQTIwMTcsIG49MSkgJT4lIHNlbGVjdCgiVG90YWwgTmFjaW9uYWwiLCJBMjAxNyIpDQpUb3RhbEluZnJhY2Npb25lczE2IDwtIEV2b2x1Y2lvbkRlbGl0b3NFU1AgJT4lIHNsaWNlX21heChBMjAxNiwgbj0xKSAlPiUgc2VsZWN0KCJUb3RhbCBOYWNpb25hbCIsIkEyMDE2IikNCiNwcmVjYXJnYW1vcyBsYSBpbWFnZW4gcGFyYSBpbmNvcnBvcmFybGEgZW4gbGFzIHRhYmxhcyANCkltYWdlbkRlbGl0b3MgPC0gImh0dHBzOi8vdXBsb2FkLndpa2ltZWRpYS5vcmcvd2lraXBlZGlhL2NvbW1vbnMvdGh1bWIvOS85YS9GbGFnX29mX1NwYWluLnN2Zy8xMjAwcHgtRmxhZ19vZl9TcGFpbi5zdmcucG5nIg0KDQpUYWJsYV9Ub3RhbEluZnJhY2Npb25lczE5IDwtIFRvdGFsSW5mcmFjY2lvbmVzMTkgJT4lIGd0KCkNCg0KVGFibGFfVG90YWxJbmZyYWNjaW9uZXMxOSA8LSBUb3RhbEluZnJhY2Npb25lczE5ICU+JSBhZGRfY29sdW1uKEltYWdlbkRlbGl0b3MpICU+JSANCiAgc2VsZWN0KCJUb3RhbCBOYWNpb25hbCIsICJBMjAxOSIgLCAiSW1hZ2VuRGVsaXRvcyIpICU+JSB1bmdyb3VwKCkNCg0KVGFibGFfVG90YWxJbmZyYWNjaW9uZXMxOSAlPiUgZ3QoKSAlPiUgDQogIGd0Ojp0ZXh0X3RyYW5zZm9ybShsb2NhdGlvbnMgPSBjZWxsc19ib2R5KGNvbHVtbnMgPSB2YXJzKEltYWdlbkRlbGl0b3MpKSwNCiAgICAgICAgICAgICAgICAgICAgIGZuID0gZnVuY3Rpb24oeCkge2d0Ojp3ZWJfaW1hZ2UoeCwgaGVpZ2h0ID0gNTApfSkgJT4lIHRhYl9oZWFkZXIodGl0bGUgPSBtZCgiKipJbmZyYWNjaW9uZXMgcGVuYWxlcyBhw7FvIDIwMTkqKiIpLHN1YnRpdGxlID0gbWQoIioqVG90YWwgTmFjaW9uYWwqKiIpKSAlPiUNCiAgdGFiX29wdGlvbnMoaGVhZGluZy5iYWNrZ3JvdW5kLmNvbG9yID0gIm9yYW5nZSIsIGNvbHVtbl9sYWJlbHMuZm9udC53ZWlnaHQgPSAiYm9sZCIpDQoNCg0KVGFibGFfVG90YWxJbmZyYWNjaW9uZXMxOCA8LSBUb3RhbEluZnJhY2Npb25lczE4ICU+JSBndCgpDQoNClRhYmxhX1RvdGFsSW5mcmFjY2lvbmVzMTggPC0gVG90YWxJbmZyYWNjaW9uZXMxOCAlPiUgYWRkX2NvbHVtbihJbWFnZW5EZWxpdG9zKSAlPiUgDQogIHNlbGVjdCgiVG90YWwgTmFjaW9uYWwiLCAiQTIwMTgiICwgIkltYWdlbkRlbGl0b3MiKSAlPiUgdW5ncm91cCgpDQoNClRhYmxhX1RvdGFsSW5mcmFjY2lvbmVzMTggJT4lIGd0KCkgJT4lIA0KICBndDo6dGV4dF90cmFuc2Zvcm0obG9jYXRpb25zID0gY2VsbHNfYm9keShjb2x1bW5zID0gdmFycyhJbWFnZW5EZWxpdG9zKSksDQogICAgICAgICAgICAgICAgICAgICBmbiA9IGZ1bmN0aW9uKHgpIHtndDo6d2ViX2ltYWdlKHgsIGhlaWdodCA9IDUwKX0pICU+JSB0YWJfaGVhZGVyKHRpdGxlID0gbWQoIioqSW5mcmFjY2lvbmVzIHBlbmFsZXMgYcOxbyAyMDE4KioiKSxzdWJ0aXRsZSA9IG1kKCIqKlRvdGFsIE5hY2lvbmFsKioiKSkgJT4lDQogIHRhYl9vcHRpb25zKGhlYWRpbmcuYmFja2dyb3VuZC5jb2xvciA9ICJvcmFuZ2UiLCBjb2x1bW5fbGFiZWxzLmZvbnQud2VpZ2h0ID0gImJvbGQiKQ0KDQoNClRhYmxhX1RvdGFsSW5mcmFjY2lvbmVzMTcgPC0gVG90YWxJbmZyYWNjaW9uZXMxNyAlPiUgZ3QoKQ0KDQpUYWJsYV9Ub3RhbEluZnJhY2Npb25lczE3IDwtIFRvdGFsSW5mcmFjY2lvbmVzMTcgJT4lIGFkZF9jb2x1bW4oSW1hZ2VuRGVsaXRvcykgJT4lIA0KICBzZWxlY3QoIlRvdGFsIE5hY2lvbmFsIiwgIkEyMDE3IiAsICJJbWFnZW5EZWxpdG9zIikgJT4lIHVuZ3JvdXAoKQ0KDQpUYWJsYV9Ub3RhbEluZnJhY2Npb25lczE3ICU+JSBndCgpICU+JSANCiAgZ3Q6OnRleHRfdHJhbnNmb3JtKGxvY2F0aW9ucyA9IGNlbGxzX2JvZHkoY29sdW1ucyA9IHZhcnMoSW1hZ2VuRGVsaXRvcykpLA0KICAgICAgICAgICAgICAgICAgICAgZm4gPSBmdW5jdGlvbih4KSB7Z3Q6OndlYl9pbWFnZSh4LCBoZWlnaHQgPSA1MCl9KSAlPiUgdGFiX2hlYWRlcih0aXRsZSA9IG1kKCIqKkluZnJhY2Npb25lcyBwZW5hbGVzIGHDsW8gMjAxNyoqIiksc3VidGl0bGUgPSBtZCgiKipUb3RhbCBOYWNpb25hbCoqIikpICU+JQ0KICB0YWJfb3B0aW9ucyhoZWFkaW5nLmJhY2tncm91bmQuY29sb3IgPSAib3JhbmdlIiwgY29sdW1uX2xhYmVscy5mb250LndlaWdodCA9ICJib2xkIikNCg0KDQpUYWJsYV9Ub3RhbEluZnJhY2Npb25lczE2IDwtIFRvdGFsSW5mcmFjY2lvbmVzMTYgJT4lIGd0KCkNCg0KVGFibGFfVG90YWxJbmZyYWNjaW9uZXMxNiA8LSBUb3RhbEluZnJhY2Npb25lczE2ICU+JSBhZGRfY29sdW1uKEltYWdlbkRlbGl0b3MpICU+JSANCiAgc2VsZWN0KCJUb3RhbCBOYWNpb25hbCIsICJBMjAxNiIgLCAiSW1hZ2VuRGVsaXRvcyIpICU+JSB1bmdyb3VwKCkNCg0KVGFibGFfVG90YWxJbmZyYWNjaW9uZXMxNiAlPiUgZ3QoKSAlPiUgDQogIGd0Ojp0ZXh0X3RyYW5zZm9ybShsb2NhdGlvbnMgPSBjZWxsc19ib2R5KGNvbHVtbnMgPSB2YXJzKEltYWdlbkRlbGl0b3MpKSwNCiAgICAgICAgICAgICAgICAgICAgIGZuID0gZnVuY3Rpb24oeCkge2d0Ojp3ZWJfaW1hZ2UoeCwgaGVpZ2h0ID0gNTApfSkgJT4lIHRhYl9oZWFkZXIodGl0bGUgPSBtZCgiKipJbmZyYWNjaW9uZXMgcGVuYWxlcyBhw7FvIDIwMTYqKiIpLHN1YnRpdGxlID0gbWQoIioqVG90YWwgTmFjaW9uYWwqKiIpKSAlPiUNCiAgdGFiX29wdGlvbnMoaGVhZGluZy5iYWNrZ3JvdW5kLmNvbG9yID0gIm9yYW5nZSIsIGNvbHVtbl9sYWJlbHMuZm9udC53ZWlnaHQgPSAiYm9sZCIpDQoNCg0KYGBgDQoNCjxkaXYvPg0KDQpMYXMgdGFibGFzIG11ZXN0cmFuIGRlIHVuYSBmb3JtYSByZXN1bWlkYSBlbCBuw7ptZXJvIGRlIGluZnJhY2Npb25lcyB0b3RhbGVzIHBhcmEgbG9zIMO6bHRpbW9zIDQgYcOxb3MsIGV4Y2x1eWVuZG8gZWwgMjAyMC4gDQoNCg0KDQpFc3RlIGdyw6FmaWNvIGludGVyYWN0aXZvIG11ZXN0cmEgZWwgVG90YWwgZGUgSW5mcmFjY2lvbmVzIGNvbWV0aWRhcyAoRGVsaXRvcykgYXRlbmRpZW5kbyBhIGxhIENvbXVuaWRhZCBhdXTDs25vbWEgZHVyYW50ZSBlbCBhw7FvIDIwMTkuIFBvZGVtb3Mgb2JzZXJ2YXIgY29tbyBBbmRhbHVjw61hIGVzIGxhIGNvbXVuaWRhZCBhdXTDs25vbWEgZG9uZGUgc2UgcmVnaXN0cmFuIG1heW9yIG7Dum1lcm8gZGUgZGVsaXRvcywgc2VndWlkbyBwb3IgbGEgQ29tdW5pZGFkIGRlIE1hZHJpZCB5IGxhIENvbXVuaWRhZCBWYWxlbmNpYW5hLiANCg0KYGBge3IgZXZhbCA9IFRSVUUsIGVjaG8gPSBUUlVFfQ0KI2ltcG9ydGFtb3MgbG9zIGRhdG9zDQpFdm9sdWNpb25EZWxpdG9zRXNwYcOxYTwtICByaW86OmltcG9ydCgiLi9kYXRvcy9EQVRPU0NPTVVOSURBREFVVE8uY3N2IikNCg0KRXZvbHVjaW9uRGVsaXRvc0VTUCA8LSAgcmlvOjppbXBvcnQoIi4vZGF0b3MvRXZvbHVjaW9uRVNQLmNzdiIpDQoNCkdyYWZpY29Fdm9sdWNpb25EZWxpdG9zID0gRXZvbHVjaW9uRGVsaXRvc0VTUFshNDRdDQoNCg0KDQpFdm9sdWNpb25EZWxpdG9zRXNwYTwtICByaW86OmltcG9ydCgiLi9kYXRvcy9EQVRPU0NPTVVOSURBREFVVE8uY3N2IikNCg0KRXZvbHVjaW9uRGVsaXRvc0VTUCA8LSAgcmlvOjppbXBvcnQoIi4vZGF0b3MvRXZvbHVjaW9uRVNQLmNzdiIpDQoNCiNMSU1QSUFNT1MgREFUT1MsIGVsaW1pbmFuZG8gdG9kYXMgbGFzIGZpbGFzIHF1ZSBjb250aWVuZW4gdmFsb3JlcyBudWxvcyBOQSB5IGNhbWJpYW1vcyBub21icmVzIGRlIGNvbHVtbmFzDQoNCkV2b2x1Y2lvbkRlbGl0b3NDb211bmkgPC0gbmEub21pdChFdm9sdWNpb25EZWxpdG9zRXNwYSkNCg0KRXZvbHVjaW9uSW5mcmFFc3AgPC0gcmlvOjppbXBvcnQoIi4vZGF0b3MvRXZvbHVjaW9uSW5mcmFjY2lvbmVzRVNQLmNzdiIpDQoNCm5hbWVzKEV2b2x1Y2lvbkluZnJhRXNwKQ0KY29sbmFtZXMoRXZvbHVjaW9uSW5mcmFFc3ApWzNdIDwtICJGZWNoYXMiDQoNCiMgRGVmaW5lIHRoZSBudW1iZXIgb2YgY29sb3JzIHlvdSB3YW50DQpuYi5jb2xzIDwtIDE5DQpteWNvbG9ycyA8LSBjb2xvclJhbXBQYWxldHRlKGJyZXdlci5wYWwoOCwgIlNldDIiKSkobmIuY29scykNCiMgQ3JlYXRlIGEgZ2dwbG90IHdpdGggMTggY29sb3JzIA0KDQoNCkNvbXVuaTIwMTkgPC0gRXZvbHVjaW9uRGVsaXRvc0NvbXVuaSAlPiUgZ3JvdXBfYnkoQ29tdW5pZGFkZXMsIEEyMDE5KQ0KDQpsaWJyYXJ5KHBsb3RseSkNCmdyQ29tdW5pMjAxOSA8LSBnZ3Bsb3QoQ29tdW5pMjAxOSwgYWVzKEEyMDE5LENvbXVuaWRhZGVzLCBmaWxsID0gQ29tdW5pZGFkZXMpKSArIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IG15Y29sb3JzKSArIGdlb21fY29sKHBvc2l0aW9uID0gImRvZGdlIikgKyBsYWJzKHggPSAiSW5mcmFjY2lvbmVzIiwgeSA9ICJDb211bmlkYWRlcyIsIHRpdGxlID0gIkRlbGl0b3MgcG9yIGNvbXVuaWRhZGVzIGVuIDIwMTkiKSArIHRoZW1lX2J3KCkgKyB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMCkpDQpnckNvbXVuaTIwMTkNCg0KDQoNCmBgYA0KICAgICAgICAgICAgICAgICANCkVuIGVzdGUgbWFwYSBzZSBlbmN1ZW50cmEgZ2VvbG9jYWxpemFkYXMgbGFzIHRvZGFzIGxhcyBDb211bmlkYWRlcyBBdXTDs25vbWFzIHkgbXVlc3RyYW4gY29uIHVuIHBvcC11cCBlbCB0b3RhbCBkZSBJbmZyYWNjaW9uZXMgcGVuYWxlcyBjb21ldGlkYXMgZHVyYW50ZSBlbCBhw7FvIDIwMTkgZW4gZGljaGEgcmVnacOzbi4gICANCg0KYGBge3IgZXZhbCA9IFRSVUUsIGVjaG8gPSBUUlVFfQ0KDQpNYXBhRGVsaXRvc0VzcGHDsWEgPC0gbGVhZmxldCgpICU+JQ0KICBzZXRWaWV3KGxuZyA9IC01Ljk5NjI5LCBsYXQgPSAzNy4zODI2LCB6b29tID0gNSkgJT4lIA0KICBhZGRNYXJrZXJzKGxuZyA9IC01Ljk5NjI5LCBsYXQgPSAzNy4zODI2ICwgcG9wdXAgPSAiQU5EQUxVQ8ONQS04OS43MjkiKSU+JQ0KICBzZXRWaWV3KGxuZyA9IC0wLjg3NjU2NiwgbGF0ID0gNDEuNjU2Mywgem9vbSA9IDUpICU+JSANCiAgYWRkTWFya2VycyhsbmcgPSAtMC44NzY1NjYsIGxhdCA9IDQxLjY1NjMgLCBwb3B1cCA9ICJBUkFHw5NOLTEwLjg5MSIpICU+JSANCiAgc2V0VmlldyhsbmcgPSAtNS44NDQ3NiwgbGF0ID0gNDMuMzYwMjksIHpvb20gPSA1KSAlPiUgDQogIGFkZE1hcmtlcnMobG5nID0gLTUuODQ0NzYsIGxhdCA9IDQzLjM2MDI5ICwgcG9wdXAgPSAiUFJJTkNJUEFETyBERSBBU1RVUklBUy04LjE0MyIpJT4lDQogIHNldFZpZXcobG5nID0gMi42NTAyNCwgbGF0ID0gMzkuNTY5MzksIHpvb20gPSA1KSAlPiUgDQogIGFkZE1hcmtlcnMobG5nID0gMi42NTAyNCwgbGF0ID0gMzkuNTY5MzkgLCBwb3B1cCA9ICJCQUxFQVJFUy0xNS4zMDYiKSAlPiUgDQogIHNldFZpZXcobG5nID0gLTE1LjUwMDAwMDAsIGxhdCA9IDI4LjAwMDAwMDAsIHpvb20gPSA1KSAlPiUgDQogIGFkZE1hcmtlcnMobG5nID0gLTE1LjUwMDAwMDAsIGxhdCA9IDI4LjAwMDAwMDAgLCBwb3B1cCA9ICJDQU5BUklBUy0yNC43MzEiKSU+JQ0KICBzZXRWaWV3KGxuZyA9IC0zLjgwNDQ0LCBsYXQgPSA0My40NjQ3Miwgem9vbSA9IDUpICU+JSANCiAgYWRkTWFya2VycyhsbmcgPSAtMy44MDQ0NCwgbGF0ID0gNDMuNDY0NzIgLCBwb3B1cCA9ICJDQU5UQUJSSUEtNC4xMzkiKSAlPiUgDQogIHNldFZpZXcobG5nID0gLTQuNzIzNzIsIGxhdCA9IDQxLjY1NTE4LCB6b29tID0gNSkgJT4lIA0KICBhZGRNYXJrZXJzKGxuZyA9IC00LjcyMzcyLCBsYXQgPSA0MS42NTUxOCAsIHBvcHVwID0gIkNBU1RJTExBIFkgTEVPTi0xNi44NjAiKSU+JQ0KICBzZXRWaWV3KGxuZyA9IC0xLjg1NjQzLCBsYXQgPSAzOC45OTQyNCwgem9vbSA9IDUpICU+JSANCiAgYWRkTWFya2VycyhsbmcgPSAtMS44NTY0MywgbGF0ID0gMzguOTk0MjQgLCBwb3B1cCA9ICJDQVNUSUxMQSBMQSBNQU5DSEEtMTkuNjM4IikgJT4lIA0KICBzZXRWaWV3KGxuZyA9IDIuMTY5OTIsIGxhdCA9IDQxLjM4NzksIHpvb20gPSA1KSAlPiUgDQogIGFkZE1hcmtlcnMobG5nID0gMi4xNjk5MiwgbGF0ID0gNDEuMzg3OSAsIHBvcHVwID0gIkNBVEFMVcORQS0zOC40MjQiKSU+JQ0KICBzZXRWaWV3KGxuZyA9IC0wLjM3NjgwNSwgbGF0ID0gMzkuNDcwMiwgem9vbSA9IDUpICU+JSANCiAgYWRkTWFya2VycyhsbmcgPSAtMC4zNzY4MDUsIGxhdCA9IDM5LjQ3MDIgLCBwb3B1cCA9ICJDT01VTklUQVQgVkFMRU5DSUFOQS01MC40MTYiKSAlPiUgIA0KICBzZXRWaWV3KGxuZyA9IC02LjQyMzA1NzgsIGxhdCA9IDM4Ljk3NDM3MDAsIHpvb20gPSA1KSAlPiUgDQogIGFkZE1hcmtlcnMobG5nID0gLTYuNDIzMDU3OCwgbGF0ID0gMzguOTc0MzcwMCAsIHBvcHVwID0gIkVYVFJFTUFEVVJBLTguMjg0IiklPiUNCiAgc2V0VmlldyhsbmcgPSAtOC41NDU2OSwgbGF0ID0gNDIuODgwNTIsIHpvb20gPSA1KSAlPiUgDQogIGFkZE1hcmtlcnMobG5nID0gLTguNTQ1NjksIGxhdCA9IDQyLjg4MDUyICwgcG9wdXAgPSAiR0FMSUNJQS0xOC41NjUiKSAlPiUgICANCiAgc2V0VmlldyhsbmcgPSAtMy43MDI1NiwgbGF0ID0gNDAuNDE2NSwgem9vbSA9IDUpICU+JSANCiAgYWRkTWFya2VycyhsbmcgPSAtMy43MDI1NiwgbGF0ID0gNDAuNDE2NSAsIHBvcHVwID0gIkNPTVVOSURBRCBERSBNQURSSUQtNzMuMzA4IiklPiUNCiAgc2V0VmlldyhsbmcgPSAtMS4xMzAwNDAwLCBsYXQgPSAzNy45ODcwNDAwLCB6b29tID0gNSkgJT4lIA0KICBhZGRNYXJrZXJzKGxuZyA9IC0xLjEzMDA0MDAsIGxhdCA9IDM3Ljk4NzA0MDAgLCBwb3B1cCA9ICJNVVJDSUEtMTUuNzcwIikgJT4lIA0KICBzZXRWaWV3KGxuZyA9IC0xLjY0MzIzLCBsYXQgPSA0Mi44MTY4Nywgem9vbSA9IDUpICU+JSANCiAgYWRkTWFya2VycyhsbmcgPSAtMS42NDMyMywgbGF0ID0gNDIuODE2ODcgLCBwb3B1cCA9ICJOQVZBUlJBLTQuNTAwIiklPiUNCiAgc2V0VmlldyhsbmcgPSAtMi42NzI2OCwgbGF0ID0gNDIuODQ5OTgsIHpvb20gPSA1KSAlPiUgDQogIGFkZE1hcmtlcnMobG5nID0gLTIuNjcyNjgsIGxhdCA9IDQyLjg0OTk4ICwgcG9wdXAgPSAiUEFJUyBWQVNDTy01LjEyOCIpICU+JSAgDQogIHNldFZpZXcobG5nID0gLTIuNDUwMDAwMCwgbGF0ID0gNDIuNDY2NjcwMCwgem9vbSA9IDUpICU+JSANCiAgYWRkTWFya2VycyhsbmcgPSAtMi40NTAwMDAwLCBsYXQgPSA0Mi40NjY2NzAwICwgcG9wdXAgPSAiUklPSkEtMy4xMjAiKSU+JQ0KICBzZXRWaWV3KGxuZyA9IC01LjMyMDQyLCBsYXQgPSAzNS44ODkxOSwgem9vbSA9IDUpICU+JSANCiAgYWRkTWFya2VycyhsbmcgPSAtNS4zMjA0MiwgbGF0ID0gMzUuODg5MTkgLCBwb3B1cCA9ICJDSVVEQUQgQVVUw5NOT01BIERFIENFVVRBLTIuMTYyIikgJT4lICANCiAgc2V0VmlldyhsbmcgPSAtMi45MzgzMywgbGF0ID0gMzUuMjkzNjksIHpvb20gPSA1KSAlPiUgDQogIGFkZE1hcmtlcnMobG5nID0gLTIuOTM4MzMsIGxhdCA9IDM1LjI5MzY5ICwgcG9wdXAgPSAiQ0lVREFEIEFVVMOTTk9NQSBERSBNRUxJTExBLTIuNzg5IikgJT4lIGFkZFRpbGVzKCkNCg0KTWFwYURlbGl0b3NFc3Bhw7FhDQpgYGANCg0KDQoNCiMgPEZPTlQgQ09MT1I9IlllbGxvdyI+My4gwr9RdcOpIGhhIHBhc2FkbyBlbiAyMDIwPyA8L0ZPTlQ+DQoNCkNvbW8gZGVjw61hbW9zLCBlbCAyMDIwIGhhIHNpZG8gdW4gYcOxbyBhdMOtcGljbywgbGEgcGFuZGVtaWEsIGVsIGNvbmZpbmFtaWVudG8geSBsYXMgcmVzdHJpY2Npb25lcyBzb2JyZSBsYSBtb3ZpbGlkYWQgaGFuIGhlY2hvIGVmZWN0byBubyBzb2xvIHNvYnJlIGxhIGVjb25vbcOtYSwgc2lubyB0YW1iacOpbiBzb2JyZSBlbCBuw7ptZXJvIGRlIGRlbGl0b3MgY29tZXRpZG9zIGVuIG51ZXN0cm8gcGHDrXMuIFBhcmEgZWwgYcOxbyAyMDIwIHNlIGhhIGV4cGVyaW1lbnRhZG8gdW5hIGZ1ZXJ0ZSBjYcOtZGEgZW4gZWwgbsO6bWVybyBkZSBJbmZyYWNjaW9uZXMgcGVuYWxlcyBjb21ldGlkYXMuIEVuIGVsIHByaW1lciB0cmltZXN0cmUgZGUgMjAyMCwgZHVyYW50ZSBsb3MgbWVzZXMgcXVlIHByZWNlZMOtYW4gZWwgY29uZmluYW1pZW50byB5YSBzZSBleHBlcmltZW50byB1bmEgY2HDrWRhIGRlbCA4LDklIHJlc3BlY3RvIGFsIHByaW1lciB0cmltZXN0cmUgZGVsIGHDsW8gYW50ZXJpb3IuIEVzdGEgY2HDrWRhIHNlcsOtYSBtdWNobyBtw6FzIHByb251bmNpYWRhIGVuIGxvcyBkb3Mgc2lndWllbnRlcyB0cmltZXN0cmVzICggcGVyaW9kb3MgcGFyYSBsb3MgcXVlIHNlIGRpc3BvbmUgaW5mb3JtYWNpw7NuIGFjdHVhbG1lbnRlKS4gDQoNCg0KRW50cmUgRW5lcm8geSBKdW5pbyBsYSBjYcOtZGEgYSBuaXZlbCBuYWNpb25hbCBlcyBkZWwgMjQsOCUsIHRvZGF2w61hIG1heW9yIGVuIGxvcyBncmFuZGVzIG7DumNsZW9zIHVyYmFub3MgY29tbyBlcyBsYSBjYXBpdGFsIHUgb3RyYXMgY2l1ZGFkZXMgZ3JhbmRlcy4gQ29tbyB2ZW1vcyBlbiBsYSB0YWJsYSAgZGUgRW5lcm8gYSBTZXB0aWVtYnJlIGxhIGNhw61kYSBzZSByZWN1cGVyYSByZXNwZWN0byBhIGVsIGHDsW8gYW50ZXJpb3IgZGViaWRvIGFsIGxldmFudGFtaWVudG8gZGUgYWxndW5hcyByZXN0cmljY2lvbmVzIGEgbGEgbW92aWxpZGFkLCBwZXJvIHNpZ3VlbiBzaWVuZG8gYmFzdGFudGUgYWx0YS4gDQoNCg0KYGBge3IgZXZhbCA9IFRSVUUsIGVjaG8gPSBUUlVFfQ0KDQojaW1wb3J0YXIgZGF0b3MNCg0KI3ByaW1lciB0cmltZXN0cmUNCnByaW1lcnRyaW1lc3RyZUVTUCA8LSByaW86OmltcG9ydCgiLi9kYXRvcy9wcmltZXJ0cmltZXN0cmVFU1AuY3N2IikNCg0KbmFtZXMocHJpbWVydHJpbWVzdHJlRVNQKVs0XSA8LSAiVmFyaWFjaW9uMTklMjAiDQpuYW1lcyhwcmltZXJ0cmltZXN0cmVFU1ApWzJdIDwtICJFbmVyb01hcnpvMTkiDQpuYW1lcyhwcmltZXJ0cmltZXN0cmVFU1ApWzNdIDwtICJFbmVyb01hcnpvMjAiDQoNCmRmcHJpbWVydHJpbWVzdHJlIDwtIHByaW1lcnRyaW1lc3RyZUVTUCAlPiUgIHNsaWNlKGMoMTUpKQ0KDQpWYXJEZWxpdG9zcHJpbWVydHJpIDwtIGRmcHJpbWVydHJpbWVzdHJlDQoNClZhckRlbGl0b3NwcmltZXJ0cmkgJT4lIGd0KCkgJT4lIHRhYl9oZWFkZXIodGl0bGUgPSBtZCgiKipWYXJpYWNpw7NuIERlbGl0b3MgMWVyIFRyaW1lc3RyZSAyMDIwIHkgMjAxOSoqIiksc3VidGl0bGUgPSBtZCgiKipFc3Bhw7FhKioiKSkgJT4lDQogIHRhYl9vcHRpb25zKGhlYWRpbmcuYmFja2dyb3VuZC5jb2xvciA9ICJibGFjayIsIGNvbHVtbl9sYWJlbHMuZm9udC53ZWlnaHQgPSAiYm9sZCIpDQoNCg0KI3NlZ3VuZG8gdHJpbWVzdHJlDQoNCnNlZ3VuZG90cmltZXN0cmVFU1AgPC0gcmlvOjppbXBvcnQoIi4vZGF0b3Mvc2VndW5kb3RyaW1lc3RyZUVTUC5jc3YiKQ0KbmFtZXMoc2VndW5kb3RyaW1lc3RyZUVTUClbNF0gPC0gIlZhcmlhY2lvbjE5JTIwIg0KbmFtZXMoc2VndW5kb3RyaW1lc3RyZUVTUClbMl0gPC0gIkVuZXJvSnVuaW8xOSINCm5hbWVzKHNlZ3VuZG90cmltZXN0cmVFU1ApWzNdIDwtICJFbmVyb0p1bmlvMjAiDQoNCmRmc2VndW5kb3RyaW1lc3RyZSA8LSBzZWd1bmRvdHJpbWVzdHJlRVNQICU+JSAgc2xpY2UoYygxNSkpDQoNClZhckRlbGl0b3NzZWd1bmRvdHJpIDwtIGRmc2VndW5kb3RyaW1lc3RyZQ0KDQpWYXJEZWxpdG9zc2VndW5kb3RyaSAlPiUgZ3QoKSAlPiUgdGFiX2hlYWRlcih0aXRsZSA9IG1kKCIqKlZhcmlhY2nDs24gRGVsaXRvcyAybmRvIFRyaW1lc3RyZSAyMDIwIHkgMjAxOSoqIiksc3VidGl0bGUgPSBtZCgiKipFc3Bhw7FhKioiKSkgJT4lDQogIHRhYl9vcHRpb25zKGhlYWRpbmcuYmFja2dyb3VuZC5jb2xvciA9ICJibGFjayIsIGNvbHVtbl9sYWJlbHMuZm9udC53ZWlnaHQgPSAiYm9sZCIpDQoNCg0KI3RlcmNlciB0cmltZXN0cmUNCg0KdGVyY2VydHJpbWVzdHJlRVNQIDwtIHJpbzo6aW1wb3J0KCIuL2RhdG9zL3RlcmNlcnRyaW1lc3RyZUVTUC5jc3YiKQ0KbmFtZXModGVyY2VydHJpbWVzdHJlRVNQKVs0XSA8LSAiVmFyaWFjaW9uMTklMjAiDQpuYW1lcyh0ZXJjZXJ0cmltZXN0cmVFU1ApWzJdIDwtICJFbmVyb1NlcHRpZW1icmUxOSINCm5hbWVzKHRlcmNlcnRyaW1lc3RyZUVTUClbM10gPC0gIkVuZXJvU2VwdGllbWJyZTIwIg0KDQpkZnRlcmNlcnRyaW1lc3RyZSA8LSB0ZXJjZXJ0cmltZXN0cmVFU1AgJT4lICBzbGljZShjKDE1KSkNCg0KVmFyRGVsaXRvc3RlcmNlcnRyaSA8LSBkZnRlcmNlcnRyaW1lc3RyZQ0KDQpWYXJEZWxpdG9zdGVyY2VydHJpICU+JSBndCgpICU+JSB0YWJfaGVhZGVyKHRpdGxlID0gbWQoIioqVmFyaWFjacOzbiBEZWxpdG9zIDNlciBUcmltZXN0cmUgMjAyMCB5IDIwMTkqKiIpLHN1YnRpdGxlID0gbWQoIioqRXNwYcOxYSoqIikpICU+JQ0KICB0YWJfb3B0aW9ucyhoZWFkaW5nLmJhY2tncm91bmQuY29sb3IgPSAiYmxhY2siLCBjb2x1bW5fbGFiZWxzLmZvbnQud2VpZ2h0ID0gImJvbGQiKSANCg0KYGBgDQoNCjxkaXYgc3R5bGU9InRleHQtYWxpZ246IGp1c3RpZnkiPiANCg0KDQoNCkVuIGVzdGEgdGFibGEgaW50ZXJhY3RpdmEgc2UgcHVlZGUgb2JzZXJ2YXIgbGEgZXZvbHVjacOzbiBkZSBsb3MgRGVsaXRvcyBjb21ldGlkb3MgZHVyYW50ZSBsb3MgcHJpbWVyb3MgOSBtZXNlcyBkZSAyMDIwIHJlc3BlY3RvIGEgbG9zIDkgcHJpbWVyb3MgZGVsIGHDsW8gYW50ZXJpb3IsIGF0ZW5kaWVuZG8gYSBsYSB0aXBvbG9nw61hIHBlbmFsLCB5IGxhIGNvbXVuaWRhZCAoY2FkYSBww6FnaW5hIHJlY29nZSBsb3MgZGF0b3MgZGUgdW5hIGNvbXVuaWRhZCBhdXTDs25vbWEpLiANCg0KDQpgYGB7ciBldmFsID0gVFJVRSwgZWNobyA9IFRSVUV9DQojUkVBTElaQU1PUyBVTkEgVEFCTEEgSU5URVJBQ1RJVkEgU0VHVU4gTEEgQ09NVU5JREFELCBUSVBPTE9HSUEgUEVOQUwgWSBQRVJJT0RPUw0KDQpERU5FUk9TRVBUSUVNQlJFMjAgPC0gcmlvOjppbXBvcnQoIi4vZGF0b3MvRU5FUk9TRVBUSUVNQlJFMjAuY3N2IikNCg0KbmFtZXMoREVORVJPU0VQVElFTUJSRTIwKVs0XSA8LSAiVmFyaWFjaW9uMTklMjAiDQpuYW1lcyhERU5FUk9TRVBUSUVNQlJFMjApWzFdIDwtICJDLkFVVE9OT01BLCBUSVBPTE9HSUEgUEVOQUwgWSBQRVJJT0RPUyINCg0KDQpkZkVuZXJvU2VwdGllbWJyZSA8LSBERU5FUk9TRVBUSUVNQlJFMjAgDQpkZkVuZXJvU2VwdGllbWJyZSAlPiUgRFQ6OmRhdGF0YWJsZShleHRlbnNpb25zID0gJ0J1dHRvbnMnLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zID0gbGlzdChkb20gPSAnQmxmcnRpcCcsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1dHRvbnMgPSBjKCdjb3B5JywgJ2NzdicsICdleGNlbCcsICdwZGYnLCAncHJpbnQnKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZUxlbmd0aCA9IDE2LCBhdXRvV2lkdGggPSBUUlVFICkpDQoNCmBgYA0KDQo8ZGl2Lz4NCg0KRXN0ZSBncsOhZmljbyBtdWVzdHJhIGVsIHRvdGFsIGRlIGluZnJhY2Npb25lcyBwZW5hbGVzIHNlZ8O6biBsYSB0aXBvbG9nw61hIHBlbmFsIHBhcmEgbG9zIHByaW1lcm9zIDkgbWVzZXMgZGVsIDIwMjAuIA0KDQpgYGB7ciBldmFsID0gVFJVRSwgZWNobyA9IFRSVUV9DQojZ3JhZmljb3MgcGFyYSAyMDIwIHNlZ3VuIHRpcG9sb2dpYSBwZW5hbCANCg0KZ2dwbG90KHRlcmNlcnRyaW1lc3RyZUVTUCxhZXMoRGVsaXRvcyxFbmVyb1NlcHRpZW1icmUyMCxjb2xvciA9IERlbGl0b3MsZmlsbD0gRGVsaXRvcykpICsNCiAgZ2VvbV9iYXIocG9zaXRpb24gPSAic3RhY2siLCAgd2lkdGggPS4xOCxzdGF0PSJpZGVudGl0eSIpICsNCiAgY29vcmRfZmxpcCgpKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsPSBFbmVyb1NlcHRpZW1icmUyMCAsaGp1c3Q9LS4wMywgIGNvbG91cj0iYmxhY2siKSxzaXplPTMuMikrDQogIHRoZW1lKGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJvcmFuZ2UiLHNpemU9MSkpKw0KICB0aGVtZShwYW5lbC5iYWNrZ3JvdW5kPWVsZW1lbnRfYmxhbmsoKSkrDQogIHNjYWxlX3hfZGlzY3JldGUoKSArDQogIHhsYWIoTlVMTCkreWxhYihOVUxMKSsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLA0KICAgICAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDgsZmFjZT0iYm9sZCIpLA0KICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTQsZmFjZSA9ICJib2xkIikpICsNCiAgZ2d0aXRsZSgiSW5mcmFjY2lvbmVzIFBlbmFsZXMgRW5lcm8tU2VwdGllbWJyZSAyMDIwICIgLHN1YnRpdGxlID0gIlRvdGFsIE5hY2lvbmFsIikNCg0KDQpgYGANCg0KIyA8Rk9OVCBDT0xPUj0iWWVsbG93Ij4gNC4gQ29uY2x1c2nDs24gPC9GT05UPg0KDQoNCkVsIGNvbmZpbmFtaWVudG8gaGEgc2lkbyBkZXRlcm1pbmFudGUgZW4gbGEgY2HDrWRhIGRlbCBuw7ptZXJvIGRlIGRlbGl0b3MgcmVnaXN0cmFkb3MgZW4gbnVlc3RybyBwYcOtcyBkdXJhbnRlIGVsIDIwMjAuIEVudHJlIE1hcnpvIHkgSnVuaW8sIG1lc2VzIGR1cmFudGUgbG9zIGN1YWxlcyBsYXMgcmVzdHJpY2Npb25lcyBhIGxhIG1vdmlsaWRhZCBlcmFuIG3DoXMgZXh0cmVtYXMsIGxhIGNhw61kYSBmdWUgZGVsIDIwLDQlLiBDb24gZWwgbGV2YW50YW1pZW50byBkZSBsYXMgcmVzdHJpY2Npb25lcyBlbiB2ZXJhbm8gc2UgcmVnaXN0cm8gdW5hIHBlcXVlw7FhIHN1YmlkYSAsIGF1bnF1ZSByZXNwZWN0byBhbCBhw7FvIGFudGVyaW9yIGxhIGNhw61kYSBzaWd1ZSBzaWVuZG8gZGVsIDIwLDIlLiBDb21vIG9ic2VydmFtb3MgZW4gbGEgw7psdGltYSB0YWJsYSBpbnRlcmFjdGl2YSwgZXMgZXNwZWNpYWxtZW50ZSByZWxldmFtZW50ZSBsYSBjYcOtZGEgZW4gZWwgbsO6bWVybyBkZSBodXJ0b3MgeSByb2JvcyBlbiBkb21pY2lsaW8sIGRlYmlkbyBhIHF1ZSBsYSBnZW50ZSBwZXJtYW5lY8OtYSBlbiBjdWFyZW50ZW5hIGRlbnRybyBkZSBzdXMgY2FzYXMgZGViaWRvIGFsIGVzdGFkbyBkZSBhbGFybWEuDQoNCjIwMjAgaGEgc2lkbyB1biBhw7FvIGNvbXBsaWNhZG8sIGRlbCBxdWUgZGlmaWNpbG1lbnRlIHBvZGVtb3MgZXh0cmFlciBjb3NhcyBwb3NpdGl2YXMsIHNhbHZvIHF1ZSBlbCBuw7ptZXJvIGRlIGRlbGl0b3Mgc2UgaGEgdmlzdG8gZHJhc3RpY2FtZW50ZSByZWR1Y2lkby4gVmVyZW1vcyBxdWUgZGVwYXJhIGVsIGHDsW8gMjAyMS4gDQoNCg0KYGBge3IgZXZhbCA9IFRSVUUsIGVjaG8gPSBGQUxTRX0NCnNlc3Npb25pbmZvOjpzZXNzaW9uX2luZm8oKSAlPiUgZGV0YWlsczo6ZGV0YWlscyhzdW1tYXJ5ID0gJ2N1cnJlbnQgc2Vzc2lvbiBpbmZvJykNCmBgYA0K