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

En la asignatura de “Programación y manejo de datos en la era del Big Data” 1 tenemos que hacer un trabajo de tema libre, por lo que nos parecia interesante hacerlo de un tema que nos afecta a todos, como es la evolución de la pandemia de la Covid-19

Por ello, hemos buscado diferentes conjuntos de datos con los que poder hacer el análisis. Y así, mostrar de una forma más visual y sencilla diferentes cuestiones que nos pueden surgir al pensar en la Covid-19. Como por ejemplo, que incidencia de contagios ha habido dependiendo de la província o CCAA, donde se han hecho más pruebas pcr o test de ac o que paises han controlado mejor o peor la pandemía, entre otras cuestioenes.

2. Contexto mundial de la Covid-19


ORIGEN DEL COVID-19

La Covid-19 es una enfermedad infecciosa causada por un coronavirus recientemente descubierto.

Tuvo su origen en la ciudad de Wuhan, en China. Y el primer caso diagnosticado fue el 17 de noviembre de 2019. Todo y que se ha expandido rapidamente por todo el mundo.


¿QUÉ ES EL CORONAVIRUS

Los coronavirus son una serie de virus llamados así por su forma. Estos organismos no son nuevos, ya que conviven con el ser humano desde siempre. Además, hay muchos tipos de ellos, tanto en animales como en seres humanos.

Sin embargo, el análisis comparativo de esta enfermedad determinó que el SARS-CoV-2 era lo suficientemente distinto de los otros coronavirus de gravedad detectados en humanos (SARS y MERS) como para que este fuera consdierado una nueva enfermedad, recibiendo el nombre de Covid-19.


¿CÓMO SE PROPAGA EL COVID-19?

El virus que causa la Covid-19 se transmite principalmente a través de la gotículas generadas cuando una persona infectada tose, estornuda o espira. 2

Estas gotículas son demasiado pesadas para permanecer suspendidas en el aire y caen rapidamente sobre el suelo y/o las superfícies, conviertiendose estas en otra forma posible de contagio.

3. Datos utilizados para el trabajo.

Datos

Obtener los datos es fundamental para poder hacer el análisis.

Por ello, para el presente trabajo utilizaremos los datos que hemos extraido en diferentes páginas web, referenciadas al final del informe (en Referencias), y que hemos modificado para poder hacer este análisis.

De manera que, los datos modificado aparecen en la pestaña Tidy. Estos corresponden a aquellos que contienen información sobre los contagiados, recuperados y fallecidos a nivel mundial, estatal y autonómico.

Así como otras cifras, sobre las diferentes pruebas realizadas (PCR’s y Test rápidos), la saturación del sistema santiario español y algunos efectos económicos de la pandemía.

Tidy

La finalidad de este apartado es poner los código que hemos utilizado para “limpiar” los datos y a partir de los cuales hemos podido hacer gráficos, mapas, tablas…

#TIDY PARA EL "MUNDO".

library(rio)
library(tidyverse)

url_mundo <- "https://raw.githubusercontent.com/datasets/covid-19/master/data/time-series-19-covid-combined.csv"

df_mundo <- readr::read_csv(url_mundo)

df_mundo <- df_mundo %>% select(-"Province/State") %>%
            separate(Date, c("Año","Mes","Dia"), sep = "-")

df_mundo <- df_mundo  %>%
            relocate("Country/Region", .before=Año) %>%
            relocate(Año, .before=Confirmed)

df_mundo <- df_mundo %>%
            relocate(Mes, .after=Dia)

#A fecha del 01/12:

df_mundo_12 <- df_mundo %>% filter(Mes == "12" & Dia == "01")
df_mundo_12 <- df_mundo_12 %>% select(-Deaths)

#Para ver que hay países que se repiten y habrá que sumar todos los que se repiten:

df <- df_mundo_12 %>% group_by(`Country/Region`) %>% summarise(N = n())
#Países que se repiten: Australia, Canada, China, Denmark, France, Netherlands, United Kingdom.

df_b <- df_mundo_12 %>% filter(!(`Country/Region` %in% c("Australia", "Canada", "China", "Denmark", "France", "Netherlands", "United Kingdom")))


#Para Australia:
df_A <- df_mundo_12 %>% filter(`Country/Region` %in% "Australia")
df_cA <- df_A %>% mutate(Confirmed = sum(Confirmed))
df_cA <- df_cA %>% mutate(Recovered = sum(Recovered))
df_cA <- df_cA %>% slice(1)

#Para China:
df_C <- df_mundo_12 %>% filter(`Country/Region` %in% "China")
df_c <- df_C %>% mutate(Confirmed = sum(Confirmed))
df_c <- df_c %>% mutate(Recovered = sum(Recovered))
df_c <- df_c %>% slice(1)

#Para Denmark:
df_D <- df_mundo_12 %>% filter(`Country/Region` %in% "Denmark")
df_d <- df_D %>% mutate(Confirmed = sum(Confirmed))
df_d <- df_d %>% mutate(Recovered = sum(Recovered))
df_d <- df_d %>% slice(1)

#Para France:
df_F <- df_mundo_12 %>% filter(`Country/Region` %in% "France")
df_f <- df_F %>% mutate(Confirmed = sum(Confirmed))
df_f <- df_f %>% mutate(Recovered = sum(Recovered))
df_f <- df_f %>% slice(1)

#Para Netherlands:
df_N <- df_mundo_12 %>% filter(`Country/Region` %in% "Denmark")
df_n <- df_N %>% mutate(Confirmed = sum(Confirmed))
df_n <- df_n %>% mutate(Recovered = sum(Recovered))
df_n <- df_n %>% slice(1)

#Para United Kingdom:
df_U <- df_mundo_12 %>% filter(`Country/Region` %in% "Denmark")
df_u <- df_U %>% mutate(Confirmed = sum(Confirmed))
df_u <- df_u %>% mutate(Recovered = sum(Recovered))
df_u <- df_u %>% slice(1)


#Ahora tengo que juntar las tablas:
tabla <- bind_rows(df_b, df_u, df_n, df_f, df_d, df_c, df_cA)
#Gráficos de la evolución del Covid-19
library(tidyverse)
url_mundo <- "https://raw.githubusercontent.com/datasets/covid-19/master/data/time-series-19-covid-combined.csv"

df_mundo <- readr::read_csv(url_mundo)

df_mundo <- df_mundo %>% select(-"Province/State") %>%
            separate(Date, c("Año","Mes","Dia"), sep = "-")

df_mundo <- df_mundo  %>%
            relocate("Country/Region", .before=Año) %>%
            relocate(Año, .before=Confirmed)

df_mundo <- df_mundo %>%
            relocate(Mes, .after=Dia)
#Estos datos muestran el número de muertes diarias en el mundo, los hemos arreglado para poder hacer un facet_wrap con los diferentes meses y la evolución de estos según los dias. 
library(tidyverse)

#Para la tabla de muertes_dia hacemos, separamos por día y mes. Y filtrar las fechas hasta des de las primeras disponibles hasta el 31 de octubre.

library(lubridate)

muertes_dia <- rio::import(here::here("datos", "muertes_dia.xlsx"))

muertes_dia <- muertes_dia %>% mutate(Dia= day(Date)) %>% mutate(Mes= month(Date))  %>%
filter(!Mes == "11")  %>% select(!Date)

muertes_dia <- muertes_dia %>% mutate(Mes = case_when(
  Mes == 1 ~ "Enero",
  Mes == 2 ~ "Febrero",
  Mes == 3 ~ "Marzo",
  Mes == 4 ~ "Abril",
  Mes == 5 ~ "Mayo",
  Mes == 6 ~ "Junio",
  Mes == 7 ~ "Julio",
  Mes == 8 ~ "Agosto",
  Mes == 9 ~ "Septiembre",
  Mes == 10 ~ "Octubre",
))

muertes_dia$facet = factor(muertes_dia$Mes, levels = c("Enero","Febrero","Marzo", "Abril","Mayo","Junio","Julio","Agosto","Septiembre","Octubre"))
#Datos_CCAA
urla <-"https://raw.githubusercontent.com/datadista/datasets/master/COVID%2019/ccaa_ingresos_camas_convencionales_uci.csv"
aaa <- rio::import(urla)

#Hay que tener en cuenta que la variable % Camas Ocupadas UCI Covid no tiene datos hasta el 21-09-2020 por lo tanto para analizar la segunda OLA si que nos sirve pero no para la primera
library(tidyverse)


datos_CCAA <- aaa %>%
  separate(Fecha, c("Año","Mes","Dia"), sep = "-") %>%
  select(-CCAA) %>% mutate(CCAA = case_when(
  cod_ine == 0 ~ "España",
  cod_ine == 1 ~ "Andalucia",
  cod_ine == 2 ~ "Aragon",
  cod_ine == 3 ~ "Asturias",
  cod_ine == 4 ~ "Islas Baleares",
  cod_ine == 5 ~ "Canarias",
  cod_ine == 6 ~ "Cantabria",
  cod_ine == 7 ~ "Castilla Leon",
  cod_ine == 8 ~ "Castilla La Mancha",
  cod_ine == 9 ~ "Cataluña",
  cod_ine == 10 ~ "Com.Valenciana",
  cod_ine == 11 ~ "Extremadura",
  cod_ine == 12 ~ "Galicia",
  cod_ine == 13 ~ "Madrid",
  cod_ine == 14 ~ "Murcia",
  cod_ine == 15 ~ "Navarra",
  cod_ine == 16 ~ "Pais Vasco",
  cod_ine == 17 ~ "La Rioja",
  cod_ine == 18 ~ "Ceuta",
  cod_ine == 19 ~ "Melilla",
)) %>% relocate(CCAA, .after=cod_ine)

datos_CCAA <- datos_CCAA %>% rename("Ingresos Ult.24h" = "Ingresos COVID últimas 24 h") %>% rename("Altas Ult24h" = "Altas COVID últimas 24 h")
library(rio)
library(tidyverse)
#link: https://github.com/datadista/datasets/blob/master/COVID%2019/ccaa_covid19_test_realizados.csv

dfp <- rio::import(here::here("datos", "datos_pruebas.xlsx"))

dfa <-dfp %>%
  separate(Fecha, c("año","mes","dia"), sep = "-") %>%                 relocate(año, .after=dia) %>%
  relocate(dia, .before =mes) %>% select(!OTROS_TESTS) %>% select(!OTROS_TESTS_x_1000hab.)

dfCCAA <- dfa %>% filter(CCAA != "España")

#Exporto los datos para poder empezar el análisis desde aquí.
#rio::export(dfCCAA, here::here("datos", "dfCCAA.csv"))

dfCCAA <- rio::import(here::here("datos", "dfCCAA.csv"))

dfCCAA <- dfCCAA %>% select(!CCAA)
dfCCAA <- dfCCAA %>% mutate(CCAA = case_when(
  cod_ine == 1 ~ "Andalucia",
  cod_ine == 2 ~ "Aragon",
  cod_ine == 3 ~ "Asturias",
  cod_ine == 4 ~ "I.Baleares",
  cod_ine == 5 ~ "Canarias",
  cod_ine == 6 ~ "Cantabria",
  cod_ine == 7 ~ "Castilla Leon",
  cod_ine == 8 ~ "Castilla La Mancha",
  cod_ine == 9 ~ "Cataluña",
  cod_ine == 10 ~ "C.Valenciana",
  cod_ine == 11 ~ "Extremadura",
  cod_ine == 12 ~ "Galicia",
  cod_ine == 13 ~ "Madrid",
  cod_ine == 14 ~ "Murcia",
  cod_ine == 15 ~ "Navarra",
  cod_ine == 16 ~ "Pais Vasco",
  cod_ine == 17 ~ "La Rioja",
  cod_ine == 18 ~ "Ceuta",
  cod_ine == 19 ~ "Melilla",
)) %>% relocate(CCAA, .after=cod_ine)
library(rio)
library(tidyverse)

dfPROV <- rio::import(here::here("datos", "dfTrel.csv"))

dfPROV <- mutate(dfPROV %>% mutate(Cod = case_when(
     provincia == "Alava" ~ "01",
     provincia == "Albacete" ~ "02",
     provincia == "Alicante" ~ "03",
     provincia == "Almeria" ~ "04",
     provincia == "Avila" ~ "05",
     provincia == "Badajoz" ~ "06",
     provincia == "Islas Baleares" ~ "07",
     provincia == "Barcelona" ~ "08",
     provincia == "Burgos" ~ "09",
     provincia == "Caceres" ~ "10",
     provincia == "Cadiz" ~ "11",
     provincia == "Castellon" ~ "12",
     provincia == "Ciudad Real" ~ "13",
     provincia == "Cordoba" ~ "14",
     provincia == "A Coruña" ~ "15",
     provincia == "Cuenca" ~ "16",
     provincia == "Girona" ~ "17",
     provincia == "Granada" ~ "18",
     provincia == "Guadalajara" ~ "19",
     provincia == "Guipuzcoa" ~ "20",
     provincia == "Huelva" ~ "21",
     provincia == "Huesca" ~ "22",
     provincia == "Jaen" ~ "23",
     provincia == "Leon" ~ "24",
     provincia == "Lleida" ~ "25",
     provincia == "La Rioja" ~ "26",
     provincia == "Lugo" ~ "27",
     provincia == "Madrid" ~ "28",
     provincia == "Malaga" ~ "29",
     provincia == "Murcia" ~ "30",
     provincia == "Navarra" ~ "31",
     provincia == "Ourense" ~ "32",
     provincia == "Asturias" ~ "33",
     provincia == "Palencia" ~ "34",
     provincia == "Las Palmas" ~ "35",
     provincia == "Pontevedra" ~ "36",
     provincia == "Salamanca" ~ "37",
     provincia == "Tenerife" ~ "38",
     provincia == "Cantabria" ~ "39",
     provincia == "Segovia" ~ "40",
     provincia == "Sevilla" ~ "41",
     provincia == "Soria" ~ "42",
     provincia == "Tarragona" ~ "43",
     provincia == "Teruel" ~ "44",
     provincia == "Toledo" ~ "45",
     provincia == "Valencia" ~ "46",
     provincia == "Valladolid" ~ "47",
     provincia == "Bizkaia" ~ "48",
     provincia == "Zamora" ~ "49",
     provincia == "Zaragoza" ~ "50",
     provincia == "Ceuta" ~ "51",
     provincia == "Melilla" ~ "52")))

dfPROV <- dfPROV %>% select(provincia, Cod, Poblacion, Total, Totalxcap) %>% arrange(Cod)
#Preparando los datos para el análisis de las provincias
library(tidyverse)

df_prov <- rio::import(here::here("datos", "datos_provincias.csv"))

df_prov <- df_prov %>% separate(fecha, c("dia","mes","año"), sep = "--")

df_prov <- df_prov %>% select(provincia_iso, provincia, dia, mes, año, num_casos)

library(rio)

rio::export(df_prov, here::here("datos", "datos_provinciasok.csv"))

df <- rio::import(here::here("datos", "datos_provinciasok.csv"))

dfg <- df %>% select(-provincia_iso) %>% select(-año)

dfhab <- rio::import(here::here("datos", "excel_hab_prov.xlsx"))

tabla <- full_join(dfg, dfhab, by = c("provincia" = "Provincia"))

dfgg <- tabla %>% group_by(provincia, mes, Poblacion) %>% summarise(Num = sum(num_casos))

dfgg <- dfgg %>% select(provincia, Poblacion, mes, Num)


dfrel <- dfgg %>% mutate(Total_cap = (Num/Poblacion))
dfT <- dfgg %>% group_by(provincia, Poblacion) %>% summarise(Total = sum(mes, Num))

dfTrel <- dfT %>% mutate(Totalxcap = (Total/Poblacion))

unique(dfTrel$provincia)
#>  [1] "A Coruña"               "Alava"                  "Albacete"              
#>  [4] "Alicante"               "Almeria"                "Asturias"              
#>  [7] "Avila"                  "Badajoz"                "Barcelona"             
#> [10] "Bizkaia"                "Burgos"                 "Caceres"               
#> [13] "Cadiz"                  "Cantabria"              "Castellon"             
#> [16] "Ceuta"                  "Ciudad Real"            "Cordoba"               
#> [19] "Cuenca"                 "Girona"                 "Granada"               
#> [22] "Guadalajara"            "Guipuzcoa"              "Huelva"                
#> [25] "Huesca"                 "Islas Baleares"         "Jaen"                  
#> [28] "La Rioja"               "Las Palmas"             "Leon"                  
#> [31] "Lleida"                 "Lugo"                   "Madrid"                
#> [34] "Malaga"                 "Melilla"                "Murcia"                
#> [37] "Navarra"                "Ourense"                "Palencia"              
#> [40] "Pontevedra"             "Salamanca"              "Santa Cruz de Tenerife"
#> [43] "Segovia"                "Sevilla"                "Soria"                 
#> [46] "Tarragona"              "Teruel"                 "Toledo"                
#> [49] "Valencia"               "Valladolid"             "Zamora"                
#> [52] "Zaragoza"
dfTrel$provincia <- gsub("Santa Cruz de Tenerife", "Tenerife",dfTrel$provincia)

rio::export(dfTrel, here::here("datos", "dfTrel.csv"))

4. Estudio sobre los Datos del MUNDO

4.1 Preguntas y respuestas de la situación actual.

df <- rio::import(here::here("datos", "tabla_mundo.csv"))

#Con esto podemos hacer unas tablas.

dfmax1 <- df %>% slice_max(Confirmed, n=1) #Estados Unidos es el país con más contagios.

dfmax2 <- df %>% slice_max(Recovered, n=1) #El máximo de recuperados está en India.

df_min1 <- df %>% slice_min(Confirmed, n=1) #El país con menos contagios es Vanuatu (es un país Oceania)
#TABLA PARA EL PAÍS CON MENOS CONATGIOS.

Imagen <- "http://banderasmundo.es/wp-content/uploads/2017/09/vanuatu.png"

df_min1 <- df_min1 %>% add_column(Imagen)
df_min1 <- df_min1 %>% select(-c(Dia, Mes, Año))

library(gt)
Tabla_Pmencotag <- df_min1 %>% gt()

Tabla_Pmencotag <- Tabla_Pmencotag %>%
                   tab_header(title = md("**País con menos contagios de Covid-19**"),subtitle = md("A fecha: 1/12/2020"))

Tabla_Pmencotag <- Tabla_Pmencotag %>%
                tab_options(heading.background.color = "coral") %>% tab_options(heading.title.font.size = 15, heading.subtitle.font.size = 13,  column_labels.font.weight =  "bold")


Tabla_Pmencotag <- Tabla_Pmencotag  %>%
  gt::text_transform(locations = cells_body(columns = vars(Imagen)), fn = function(x) {gt::web_image(x, height = 50)}) %>%  cols_align(
    align = "center")

#Lo mismo hacemos para las otras tres tablas

¿CUÁL ES EL PAÍS CON MÁS PERSONAS CONTAGIADAS?


País con más contagios de Covid-19
A fecha: 1/12/2020
Country/Region Confirmed Recovered ImagenUS
US 13721858 5226581


¿EN QUÉ PAÍS HAY MÁS PERSONAS RECUPERADAS?


País con más recuperados de Covid-19
A fecha: 1/12/2020
Country/Region Confirmed Recovered ImagenI
India 9499413 8932647


¿CUÁL ES EL PAÍS CON MENOS CONTAGIOS?


País con menos contagios de Covid-19
A fecha: 1/12/2020
Country/Region Confirmed Recovered Imagen
Vanuatu 1 0

El país más afectado hoy en día por la pandemia es Estados Unidos, como podremos confirmar a lo largo del análisis. Además, India pese a que tiene un gran número de recuperados (en la fecha indicada en la tabla) no deja de tener contagiados y su cifra va en aumento.

Filtrando los datos extraidos del repositorio de Github Covid-19, hemos obtenido que el país con menos contagios es Vanuatu, un país insular de Ocenia, que en estos momentos tiene solo 1 persona confirmada de coronavirus, por lo que es el país con menos casos hasta el momento. (Además, cabe tener en cuenta que esta isla cuenta con muy poca población (292.680 habitantes))

4.2 Los 10 países con más casos de Coronavirus, ¿Cuáles son?

a <- ggplot(covid)+
  geom_col(aes(ranking,cu_cases,fill=cname))+
  scale_fill_manual(values=mycolors)+
  geom_text(aes(ranking,cu_cases,label=as.factor(cu_cases)),hjust=-0.1,size=5)+
  geom_text(aes(ranking, y=0 , label = cname), hjust=1.1,size=5) +
  geom_text(aes(x=10, y=max(cu_cases) , label = as.factor(date)), vjust = 0, hjust=1, alpha = 0.1,  col = "black", size = 20)+
  labs(title = "Evolución de los casos positivos de Covid-19 en el mundo",
       subtitle = "Datos de la Universidad Johns Hopkins",
       x=NULL,
       y=NULL)+
  coord_flip(clip = "off")+
  scale_x_reverse()+
  theme_minimal()+
  theme(legend.position = "none",
        axis.title.y = element_blank(),
        axis.title.x = element_blank(),
        axis.text.y = element_blank(),
        axis.text.x = element_blank(),
        plot.title = element_text(hjust = 0, size=20,face="bold"),
        plot.subtitle = element_text(hjust = 0, size=12, face="italic"),
        plot.margin = margin(1, 4, 1, 3, "cm"))+
  transition_states(date,transition_length = 1,state_length = 0,wrap = FALSE)
 animate(a,
        nframes = 800,
        fps = 24,
        end_pause = 200,
        width = 1000,
        height = 600,
        type = "cairo")

Con el anterior gráfico pretendemos mostrar la evolución de los casos positivos en coronavirus, mostrando los 10 países que se encuentran en el “top”. Estos datos van desde incioos de enero hasta principios de diciembre (año 2020)

Observamos que China es el primer país en tener positivos en coronavirus, como sabemos Wuhan fue el lugar donde se detectó el primer positivo. El coronavirus se propaga rapidamente por todo el mundo y vemos a través del gráfico que Italia y España rapidamente pasan a tener un número elevado de contagios, el cual es superado por Estados Unidos en marzo, donde los casos crecen de manera exponencial.

Los últimos datos mostrados indican que India, Brasil y Rusia se situan en la segunda, tercera y cuarta posición respectivamente en contagios. En decima posición se encuentra México con 1.144.643 de casos acumulados.

4.3 Evolución de los contagios (a nivel mundial)

Para poder entender como ha sido la propagación del virus a nivel mundial nos parecia interesante analizar diferentes países que no fueran parecidos entre si. Para ello elegimos estos países - Estados Unidos, Nigeria, Portugal y Japón - e hicimos un gráfico donde mostramos la evolución de los casos registrados diariamente.

#Gráfico para US:
df_mundoUS<- df_mundo %>% filter(`Country/Region` == "US") %>% select(-c(Recovered, Deaths))

df_mundoUSS <- df_mundoUS %>% summarise(dif = diff(Confirmed))

dfUS <- df_mundoUS %>% select(`Country/Region`,Dia, Mes)
dfUS <- dfUS %>% slice(-1)
US <- bind_cols(dfUS, df_mundoUSS)

US <- US %>% mutate(ranking = row_number())

graficoUS <- ggplot(US, aes(ranking, dif, color = Mes)) + geom_line() + labs(title = "EEUU",  x = NULL, y = "Nº casos al día") +  theme_bw() + theme(axis.text.x=element_blank(), axis.ticks.x=element_blank())  +  theme(plot.title = element_text(hjust = 0.5)) +  theme(legend.position = "none")

#Ibamos ha hacerlo también de Australia, pero no lo he hecho porque el número de casos es bastante bajo y la diferencia entre un día y otro sale negativa. (Por lo que el gráfico no se ve bien)

#Mismo proceso para Nigeria, Japón y Portugal
#Por tanto, pongo el código para que no se vea. (echo=FALSE)

Cabe tener en cuenta que los colores muestran los diferentes meses, empezando en Enero y acabando en Noviembre.

A la vista del gráfico observamos que la evolución en los distintos países es muy diferente. En PORTUGAL, al principio de la pandemia se muestra un aumento en la curva, aunque es muy poco pronunciado y seguidamente los casos bajan y se mantienen en valores muy bajos durante un período de tiempo (meses) largo hasta que empieza la segunda ola donde los casos se disparan teniendo su máximo en casi 8000 casos registrados en un solo dia.

La evolución de NIGERIA, en cambio es muy diferente en este país el virus llega más tarde que los demás y la primera ola parece ser mayor que la segunda, aunque no se pueden tampoco sacar demasiadas conclusiones ya que el sistema sanitario de este país no es comparable al de los otros tres países analizados.

JAPÓN, sufre como vemos en el gráfico tres picos muy claros. `El primero, al principio de la pandémia, el siguiente unos meses más tarde y cuando parecia que podian controlar la situación los casos empezaron a aumentar progresivamente hasta llegar a máximos nunca vistos antes en la pandemia.

Por último, el caso de ESTADOS UNIDOS es diferente ya que la curva es siempre ascendente y no ofrece cambios extremadamente bruscos como la de los otros países. Su tendencia es clara, cada vez mas casos teniendo el pico máximo en las fechas más recientes


Continuamos con el análisis a nivel mundial, para ello ahora utilizaremos el paquete tidycovid19

#remotes::install_github("joachim-gassen/tidycovid19")
library(tidycovid19)

#install.packages("maps")
library(lubridate)

merged <- download_merged_data(cached = TRUE, silent = TRUE)

a <- plot_covid19_stripes(
  type = "confirmed",
  countries = c("CHN" , "ESP",  "BRA", "ZAF", "UK", "USA"),
  sort_countries = "countries")

a <- a + theme_test() +  theme(legend.direction = "horizontal") + theme(legend.position = "bottom") +
  labs(title = "COVID-19 -CASOS DIARIOS", subtitle = " Muestra el cambio diario en casos confirmados (promedio de 7 días)", caption = "Datos obtenindos de Johns Hopkins University CSSE Github
  Repo: https://github.com/joachim-gassen/tidycovid19.
       Últimos datos obtenidos 09/12/2020")  
     

a <- a + theme(plot.title = element_text(hjust = 0.5)) +  theme(plot.subtitle = element_text(hjust = 0.5))  

[Ampliar Imagen]

En el gráfico anterior se contrasta lo que se ha comentado anteriormente. El país con más casos diarios actualmente es Estados Unidos, su tendencia es clara, como se ha dicho antes, no paran de aumentar los casos. Parecida a esta es la tendencia que observamos en Brasil, donde el primer caso se confirmó el 25 de febrero de 2020, en el estado de São Paulo, por parte de un brasileño que viajó a Italia con sintomas leves.

Por otra parte tenemos a España y Sud-Africa, sus gráficos si muestran las famosas olas donde los casos aumentaban paro luego se reducian. Concretamente en el caso de España se pueden ver como hacia el final, meses más recientes, vuelven a aparecer tonos mas verdosos lo que significa que los casos han disminuido, en comparación con los meses de marzo-abril.

El país restante es China donde según los datos que tenemos la Pandemia esta controlada ya que los valores son infimos para la población que tiene el gigante asiático. Además, se observa que al principio de la crisi sanitaria presentaba más casos que el resto de países analizados (en este gráfico)


mapaCD <- map_covid19(
  data = download_merged_data(cached = TRUE, silent = TRUE),
  type = "deaths",
  cumulative = FALSE,
  change_ave = 7,
  per_capita = TRUE)

library(ggplot2)
mapaCD <- mapaCD + labs(title = "COVID-19",
                        subtitle = "Muestra la variación diaria de muertes por 100.000 habitantes (promedio durante 7 dias)", caption = "Datos del día 07/12/2020,  
Datos obtenindos de Johns Hopkins University CSSE Github Repo: https://github.com/joachim-gassen/tidycovid19.") +
  theme(plot.title = element_text(hjust = 0.5)) +  
  theme(plot.subtitle = element_text(hjust = 0.5))

mapaCD +   scale_fill_viridis_c(direction = -1)

[Ampliar Imagen]

Este mapa nos muestra la variación de muertes por 100 mil habitantes en un promedio de 7 días. Los datos son de la semana del 7 de diciembre. En este mapa, se puede recalcar que la zona más afectada por muertes por COVID es el centro de Europa, donde podríamos destacar países como Italia, Eslovenia o Bulgaria. Otro de los países más afectados por el coronavirus sin duda es Estados Unidos donde destaca tanto en muertes, como en contagios. También se puede ver que los países donde menos muertes por 100 mil habitantes están habiendo, son países de África, Oceanía y parte de Asia.

mapaCC <- map_covid19(
  data = download_merged_data(cached = TRUE, silent = TRUE),
  type = "confirmed",
  cumulative = FALSE,
  change_ave = 7,
  per_capita = TRUE)

mapaCC <- mapaCC + labs(title = "COVID-19 - CASOS CONFIRMADOS",
                        subtitle = "Muestra la variación diaria de casos confirmados por 100.000 habitantes (promedio durante 7 dias)", caption = "Datos del día 07/12/2020,  
Datos obtenindos de Johns Hopkins University CSSE Github Repo: https://github.com/joachim-gassen/tidycovid19.") +
  theme(plot.title = element_text(hjust = 0.5)) +  
  theme(plot.subtitle = element_text(hjust = 0.5))

mapaCC + scale_fill_viridis_c(direction = -1)

[Ampliar Imagen]

Este mapa nos muestra la variación de casos confirmados por 100 mil habitantes en un promedio de 7 días. Los datos so de la semana del 7 de diciembre.

Como podemos observar, las zonas donde menos casos se confirman son en zonas de África (hay que tener en cuenta que se realizan menos pruebas que en el resto de los continentes) Por otro lado, hay otras zonas como Australia y parte de Asia donde también hay pocos contagios confirmados.

Las zonas más afectadas serían zonas de Europa, Rusia y Estados Unidos.


#remotes::install_github("joachim-gassen/tidycovid19")
library(ggplot2)
library(tidyverse)
library(tidycovid19)

dfz <- download_merged_data(silent = TRUE, cached = TRUE)

dfz <- dfz %>% group_by(iso3c) %>% summarise(
    confirmed_cases = max(confirmed, na.rm = TRUE),
    soc_dist_measures = max(soc_dist)
  ) %>% filter(confirmed_cases >= 1000)

DF <- dfz %>% arrange(desc(confirmed_cases))

DF <- dfz %>% slice_max(confirmed_cases, n=20)%>% slice(-7)

ggplot(DF, aes(x = confirmed_cases, y = soc_dist_measures, color = iso3c)) + geom_point() +
scale_x_continuous(trans='log10', labels = scales::comma) +
ggrepel::geom_label_repel(ggplot2::aes(label = iso3c)) + labs(title = "RELACIÓN ENTRE LOS CASOS CONFIRMADOS Y LAS MEDIDAS TOMADAS",
subtitle = "Relación hecha para los 20 países con más contagios" ,caption = "Datosdel repositorio de Github de CSSE de la Uni.
Johns Hopkins. Paquete <<tidycovid19>>", y = "Medidas distancia social", x = "Casos confirmados") +
theme_bw() +  theme(legend.position = "none") +  theme(plot.title = element_text(hjust = 0.5)) +  theme(plot.subtitle = element_text(hjust = 0.5))

En este gráfico se muestra la relación existente entre el número de casos (contagios) y el número de medidas de distanciamiento social aplicadas en cada uno de los países de la muestra (netos de restricciones levantadas)

Se encargan de recopilar estos datos ACAPS, un proyecto no gubernamental. 3

En este caso se muestra el número de medidas de distanciamiento social informadas hasta la fecha por ACAPS, neto de restricciones levantadas. Todo y que también se puede ver la relación con otras medidas que recoge este proyecto, tales como el número de medidas sociales y económicas o de reestricciones de movimiento, etc.

De acuerdo con el gráfico, observamos que el país del mundo con más contagios actualmente, Estados Unidos, ha aplicado un nivel de medidas de distancia social muy bajo, en comparación con otros países, como en Gran Bretaña, donde Boris Johnson se ha visto obligado a imponer reglas de distanciamiento social dado la desbordada situación en la que se encontraba. Teniendo en cuenta además, que al inicio de la pandemia evitó poner medidas drásticas, todo y que su estratégia tuvo que cambiar al ver que el virus estaba cogiendo fuerza en su país.

España se encuentra a día de hoy con 1,73 M de casos acumulados, las estrategias para reducir el contagio se han basado principalmente en reducir la movilidad de las personas, por ello, el 13 de marzo se declaró el Estado de Alarma con confinamiento domiciliario. Esta primera cuarentena se levantó el pasado 21 de junio, con una reducción considerable de los casos. Todo y que ha aumentado en los meses posteriores, haciendo referencia a la “segunda ola” (o incluso, algunos hablan de una “tercera ola”)

4.4 Evolución de los fallecidos (a nivel mundial)

library(gganimate)
library(plotly)

graficoM <- ggplot(muertes_dia , aes(Dia , Daily_Deaths,  color= Mes))  + geom_line() + geom_point() +
  labs(title = "Evolución de muertes al día en el mundo por Covid",
    subtitle = "Desde el 24 de Enero hasta el 31 de Octubre", caption = "Elaboración propia con datos 
    del repositorio COVID19",
    y = "Muertes diarias", x = "Dias") +  
  theme(legend.position = "none") + scale_x_continuous(breaks = seq(1, 30, 5)) + 
  facet_wrap(~facet, nrow = 4, ncol = 3)  + transition_reveal(Dia)

En el siguiente conjunto de gráficos observamos la evolución de las muertes por Covid en todo el mundo.

Como podemos observar es a partir del tercer mes, el mes de Marzo cuando las muertes empiezan a ser significativas llegando al máximo total en Abril donde rozaron las 8000 muertes en un dÍa. A partir de ahí y en vista de los gráficos observamos que las cifras tienen tendencias muy parecidas, es decir, se mantiene bastante constante el número de fallecidos diarios y fluctua entre los 6000 y los 4000 muertos diarios continuando esta tendencia hasta el mes de Octubre.

Cabe añadir la aclaración de que aquí se representan el número de fallecidos a escala mundial y que dentro de cada país hay diferencias, puede ser que en un país haya disminuido el número de muertes diarias, mientras que en otro haya aumentado. Además, aquí no podemos considerar primera ola y/o segunda ola, dado que en cada país la evolución de la pandemía ha sido un tanto diferente, como hemos podido comprobar anteriormente con cuatro países y sus respectivas curvas.

5. Conclusiones sobre los “Datos del Mundo”.

Conclusiones

En esta primera sección se ha pretendido analizar la Covid-19, a nivel mundial. Como conclusiones, podemos extraer que la pandemia se está (o ya se ha) expandido rapidamente por todo el mundo.

A través de los diferentes gráficos hemos podido comprobar como la pandemía está fuera de control en Estados Unidos, siendo el país líder con más contagios. A este le siguen (a día de hoy), la India, Brasil y Rusia.

Asimismo, como curiosidad cabe destacar qeu el país con menos contagios a día 1/12 (2020) es Vanautu, una isla de Oceania, que presenta tan solo 1 caso.

Por otra parte pretendemos mostrar como ha afectado la pandemia en diferentes países, por ello hemos cogido EEUU, Portugal, Japón y Nigeria y hemos hecho una serie de gráfico, en los cuales podemos los diferentes casos por Covid que hay al día. En el caso de EEUU y Japón se observara dos picos claros.

A diferencia de Nigeria, por ejemplo, donde además de valores más bajos por el momento se puede considerar que ha habido solo “una ola”. En el caso de Portugal, en la segunda ola hay un aumento de los contagios.

Utilizando el paquete Tidycovid19 nos ha permitido mostrar de manera rápida y sencilla el número de casos diarios en diferentes países, donde se confirma que en China los casos eran más abundantes al principio de la pandemia.

De igual modo, con este paquete hemos hecho dos mapas, uno de la variación de las muertes por cada 100 mil habitantes e igual para el número de casos, donde se confirma también lo comentado previamente. (Además, podemos observar que el continente oceánico y africano son los que menos casos y muertes presentan)

Por último, con el fin de mostrar la evolución de los fallecidos hemos hecho un gráfico, en el cual se observa como en marzo la tendencia era alcista, mientras en los meses restantes parece oscilar en las mismas cifras, un nivel alto y preocupante.

(Para ver los casos, muertes y recuperados de manera dinámica podemos ver el [LiveMap])

Live Map

En este apartado se muestra una bola del mundo dinámica. En ella se recoge el número de muertes, fallecidos y recuperados para cada país, como podemos observar.

Los datos provienen del Centro de ciencia e ingeniería de sistemas (JHU CSSE) de la Universidad Johns Hopkins.

Se actualizan cada día y se obtiene rapidamente gracias a la función live.map del paquete: covid19.analytics.


library(covid19.analytics)

library(tidyverse)

data <- covid19.data()
#> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

data <-data %>%
       select(-c(FIPS,Admin2,Combined_Key)) %>%
       relocate(Lat, .after=Case_Fatality_Ratio) %>%      relocate(Long_, .after=Lat)

6. Estudio sobre los datos de ESPAÑA

6.1 Datos de interés


¿CUÁL FUE LA EVOLUCIÓN DE LOS CONTAGIOS DURANTE LOS 6 PRIMEROS MESES?

#Tabla para poder interpretar el gráfico y consultar más datos

df_mundoE<- df_mundo %>% filter(`Country/Region` == "Spain") %>% select(-c(Recovered, Deaths))

df_mundoEE <- df_mundoE %>% summarise(dif = diff(Confirmed))
dfE <- df_mundoE %>% select(`Country/Region`,Dia, Mes)

df_mundoEsp<- df_mundo %>% filter(`Country/Region` == "Spain") %>% slice(-1)

#Hemos quitados dos de los datos mostrados, ya que distorsionan la gráfica. (Son datos no correctos que contienen valor 0)
Union <- bind_cols(df_mundoEsp, df_mundoEE)
Union <- Union %>% slice(-93)
Union <- Union %>% slice(-115)
Union <- Union %>% slice(-122)
Union <- Union %>% slice(-124)
Union <- Union %>% slice(-50)
Union <- Union %>% mutate(ranking = row_number())

Union <- Union  %>% select(Orden="ranking", Dia, Mes, `Contagios/dia` = "dif", ConfirmadosT="Confirmed", RecuperadosT="Recovered", MuertesT="Deaths")

TABLA RESUMEN

#En la siguiente tabla se muetra para España el número de contagios al día que hubo en tal fecha y el número de contagios, muertes o recuperados acumulados. Hay que poner una nota de págona diciendo que a partir de julio los fines de semana num de contagios/dia sale como 0)

library(reactable)
reactable(Union, defaultPageSize =  10,  paginationType = "jump", showPageSizeOptions =  TRUE , pageSizeOptions =  c ( 10 , 50 , 100 ),defaultColDef = colDef(
    align = "center",
    minWidth = 70,
    headerStyle = list(background = "lightgreen"),
    filterable = TRUE),  highlight = TRUE, outlined = TRUE,
    columns = list(
  `Contagios/dia` = colDef(style = function(value) {
    if (value > 0) {
      color <- "#e00000"}
      else {
      color <- "#008000"
    }
    list(color = color, fontWeight = "bold")
  })))

*Hay que tener en cuenta que a partir de julio los datos en fin de semana tienen un valor de 0, no obstante, deberían obviarse al consultar los datos en la tabla, ya que no resultan coherentes.

A partir de los datos representados en la tabla anteror, hemos hecho el siguiente gráfico, en él se muestra la evolución de los contagios de Covid en España desde enero hasta junio 4

Podemos observar, por tanto, la “curva” de la Primera OLA

#Gráfico de la evolución de los contagios en España des de enero hasta junio. He cogido estos meses, porque a partir de julio, los datos de los fines de semana son 0, por lo que el gráfico que sale no representa realmente el número de contagios.

df_mundoE<- df_mundo %>% filter(`Country/Region` == "Spain") %>% select(-c(Recovered, Deaths))

df_mundoEE <- df_mundoE %>% summarise(dif = diff(Confirmed))
dfE <- df_mundoE %>% select(`Country/Region`,Dia, Mes)

dfE <- dfE %>% slice(-1)
a <- bind_cols(dfE, df_mundoEE)
b <- a %>% filter(Mes %in% c("01", "02", "03", "04", "05", "06"))

b <- b%>% slice(-93) 
b <- b%>% slice(-115)
b <- b %>% slice(-122)
b <- b %>% slice(-124)
b <- b%>% slice(-50)
b <- b %>% mutate(ranking = row_number())

g6 <- ggplot(b, aes(ranking, dif, color = Mes)) + geom_line() + labs(title = "Evolución contagios Covid-19", subtitle = "De enero a junio (2020)", caption = "Elaboración propia", x = NULL, y = "Nº casos al día") +  theme_bw() + theme(axis.text.x=element_blank(), axis.ticks.x=element_blank())  +  theme(plot.title = element_text(hjust = 0.5)) + theme(plot.subtitle = element_text(hjust = 0.5))

library(plotly)

Interpretación del gráfico En este se muestra la evolución de los contagios por Covid-19 en España durante los 6 primeros meses,los datos van concretamente desde el 23 de enero hasta el 30 de junio, además se observan 6 colores diferentes, correspondientes a los (6) meses. Esta representado de la siguiente manera: En el eje de las ordenadas se meustra el número de casos al día y en el de las abcisas un “ranking”, este corresponde a la fila de la tabla representada arriba, en la variable “orden”.

Ejemplo: Ranking 59, contagios al día: 3394 y mes 03. Para ver a que día corresponde este valor iriamos a la [Tabla Resumen] y vemos que corresponde con el día 22 (de marzo) Además, obtenemos otros datos como el número de confirmados totales hasta ese día, recuperados o muertes.


Asimismo, cabe hacer una interpretación de los resultados obtenidos de manera que, como podemos observar en el gráfico el aumento en el mes de Marzo es increíble pasando de los 0 casos a cerca de 10000 positivos en un solo día, a raíz de este aumento tan marcado, el gobierno decidió aplicar un conjunto de medidas entre las que estaba el confinamiento domiciliario para toda la población y que como podemos observar tuvo bastante efecto, ya que el número de contagios descendió de manera considerable en Abril. Es cierto, no obstante, que en este mismo mes se dieron diversos picos de contagios pero la tendencia a partir de este mes, Abril, fue la reducción de los casos, acabándose de confirmar con la tendencia en Mayo y en Junio obteniendo valores de contagios muy reducidos en comparación con meses previos.

6.2 Saturación del sistema sanitario español

En este apartado se analizará la evolución de los pacientes ingresados por Covid durante las últimas 24 horas en los meses de septiembre-octubre y noviembre. Así como los dados de alta al día, también durante estos meses.

datos_CCAA <- datos_CCAA %>%
  relocate(Año, .after=Dia) %>%
  relocate(Mes, .after=Dia)

datos_Esp <- datos_CCAA %>%
  filter(cod_ine == 0) %>%
  relocate(cod_ine, .before=Dia)  #Datos para España.

datos_CV <- datos_CCAA %>%
  filter(cod_ine == 10) %>%
  relocate(cod_ine, .before=Dia) #Datos para la Comunitat Valenciana.

datos_Esp_S_N <- datos_Esp %>% filter (Mes == "09"| Mes == "10"| Mes == "11")

datos_CV_S_N<- datos_CV %>% filter (Mes == "09"| Mes == "10"| Mes == "11")

datos_Esp_N <- datos_Esp %>% filter(Mes == "11")

EVOLUCIÓN DE LOS PACIENTES INGRESADOS POR COVID-19

grafico_1 <- ggplot(datos_Esp_S_N , aes(Dia , `Total Pacientes COVID ingresados`, group=Mes, color= Mes))  + geom_line() + labs(title = " Evolución de pacientes ingresados por covid en España", subtitle = "Desde el 1 Septiembre hasta Noviembre 30", caption = "Datos repositorio COVID19")

En el anterior gráfico vemos tres líneas que muestran los datos referentes a los pacientes ingresados por Covid-19 en España en los meses de Septiembre(09) Octubre(10) y Noviembre(11).

Estos meses agrupan lo que ha sido la segunda ola. Dado que observamos un aumento mantenido en Septiembre (del nivel de ingreso hospitalario por Covid), que a mediados de Octubre aumenta de manera muy pronunciada, casi duplicando la que había al principio del mes. En Noviembre, representado por la línea azul, observamos que primeramente los ingresos continúan aumentando, pero a vemos que la tendencia a partir del día 10 empiezan a disminuir, pasando de un máximo de mas de 20000 a menos de 15000 en a penas 15 días. Y situandose a finales de mes, en un nivel más bajo que los ingresados que habían en estos días un mes antes, en octubre.

grafico_a <- ggplot(datos_Esp_N, aes(Dia, `Altas Ult24h`,   fill = Mes )) +  scale_fill_brewer(palette="Spectral") + geom_bar(stat = "identity")+ 
  labs(title = "Número de pacientes dados de alta por COVID en España al día", subtitle = "Mes Noviembre", caption = "Elaboración propia a partir de datos COVID19") + theme(legend.position = "none")


grafico_ap <- grafico_a + 
  geom_text(aes(y=`Altas Ult24h`, 
    label = `Altas Ult24h`), position = position_dodge(width = 0.8), 
    size = 3.2, vjust=3, col = "Black")

Durante el mes de Noviembre vemos que el numero de pacientes dados de alta es bastante elevado, los días que la cifra se reduce coincide con los Domingos de cada mes, dado que estos días, por lo general, el número de altas suele ser menor. Además al venir de una situación de muchos positivos no es de extrañar que el número de altas ronde una cifra de 2000 altas diarias.

#Preparamos los datos para hacer una TABLA
datos_CCAA_S_N <- datos_CCAA %>% filter (Mes == "09"| Mes == "10"| Mes == "11")

datos_CCAA_yaltas <- datos_CCAA_S_N %>% mutate(`%Altas por ingresados`  = (`Altas Ult24h`/ `Total Pacientes COVID ingresados`)* 100)

datos_CCAA_yaltas <- datos_CCAA_yaltas %>% select(Dia, Mes, CCAA, `Total Pacientes COVID ingresados`, `% Camas Ocupadas COVID`, `Total pacientes COVID en UCI`, `%Altas por ingresados`)

6.3 Pruebas realizadas en las CCAA

¿Cuántas PCR’s se han hecho por cada mil habitantes?

Corresponden a los últimos datos disponibles. Asimismo, las Comunidades Autónomas con un mayor tamaño, son aquellas en las que se realizaron más pruebas por cada 100mil habitantes. (Los datos son acumulados)

library(wordcloud2)

dfCCAAp <- dfCCAA %>% select(dia, mes, CCAA, PCR_x_1000hab.) %>% filter(dia == "5") %>% filter(mes == "11") %>% arrange(desc(PCR_x_1000hab.))
dfCCAAp <- dfCCAAp %>% select(CCAA, PCR_x_1000hab.)

wordcloud2(data = dfCCAAp, size = 0.4)

Ahora vamos a verlo mediante gráficos, así podremos ver las PCR’s acumuladas en total y las realizadas para cada 1000habitantes.

PruebasP <- ggplot(dfCCAA, aes(mes, PCR_x_1000hab., fill = CCAA)) + geom_col(position = "dodge")

PCRs <- PruebasP +  facet_wrap(vars(CCAA)) + labs(x = "Mes", y = "Núm. pruebas PCR", title = "PCR's al mes por cada mil hab.", caption = "Datos obtenidos de Datadista")  + theme_bw() + scale_y_continuous(labels=function(n){format(n, scientific = FALSE)}) + theme(legend.position = "none") + theme(plot.title = element_text(hjust = 0.5))
graficoB <- ggplot(dfCCAA, aes(mes, PCR, fill = CCAA)) + geom_col(position = "dodge")

b <- graficoB +  facet_wrap(vars(CCAA)) + labs(x = "Mes", y = "Núm. pruebas PCR", title = "PCR's mensuales") + theme_bw() + scale_y_continuous(labels=function(n){format(n, scientific = FALSE)}) + theme(legend.position = "none") + theme(plot.title = element_text(hjust = 0.5))
#Ahora con el paquete patchwork juntamos los dos gráficos

En este caso hemos ajustadao la escala de x para que coincida en todas las CCAA, por lo que en Ceuta y Melilla no se ven los datos en el gráfico de la izquierda, no porque no haya valores, sino porque las pruebas hechas en estas ciudades autónomas son prácticamente insignificante si se comparan con otras CCAA. En cambio, al poner el número de pruebas por cada mil habitantes, si se observan los datos, ya que hemos cogido un rango menor.

Este conjunto de gráficos nos muestra, por un lado, el número de PCR’s que se han realizado en cada comunidad autónoma en cada mes; y la otra, nos muestra el número de PCR’s por cada mil habitantes.

Si miramos la tabla de la cantidad de PCR’s realizadas, en primer lugar, se observa claramente como la cantidad pruebas realizadas en la “segunda ola” (en los últimos meses del año) es mucho mayor que el número de pruebas realizadas en la primera. Esto se debe a que, en la primera ola, el virus llegó cuando nadie lo esperaba, y la cantidad de recursos estaba muy limitado, es más, el sistema sanitario se colapsó.

También, debemos destacar que el número de pruebas realizadas en las comunidades de Madrid, Cataluña y Andalucía es mayor que las realizadas en el resto de CCAA. Cabe recalcar que la población de dichas comunidades es mucho mayor.

No obstante, si observamos el segundo conjunto de gráficos, la cantidad de pruebas realizadas en relación a la cantidad de habitantes que hay en cada comunidad, se iguala mucho más. En la “primera ola” la cantidad de pruebas están bastante igualadas en la mayoría de CCAA, sin embargo, donde se muestran más diferencias es en la “segunda ola”.

En la “segunda ola” Madrid ya no tiene unos datos tan escandalosos, los datos de Navarra y La Rioja se disparan. Por otro lado, también destacan otras comunidades como Aragón, Cantabria, Cataluña y Asturias. Las Comunidades con menos pruebas realizadas, serían Andalucía (el número de pruebas es altísimo pero comparado con su población es bajo), Valencia o Canarias.

C_M <- dfCCAA %>% filter(CCAA %in% c("Melilla", "Ceuta"))
C_M <- C_M %>% select(dia, mes, año, CCAA, PCR, TEST_ANTICUERPOS)
C_M <- C_M %>% pivot_longer(5:6, names_to = "Prueba", values_to= "N.prueba")

CeuMel <- C_M %>% group_by(CCAA, mes, Prueba) %>% summarise(Total = sum(N.prueba)) %>% filter(Prueba == "PCR") %>% filter(mes != "11")


graficoC_M <- ggplot(CeuMel, aes(mes, Total, fill = CCAA)) + scale_fill_brewer(palette = "Reds") + geom_col(position = "dodge") + labs(x = "Meses", y = "Núm. pruebas PCR", title = "PCR's mensuales Ceuta y Melilla") + theme_bw() + theme(plot.title = element_text(hjust = 0.5))
library(plotly)
ggplotly(graficoC_M)

Si dejaramos las escalas libres para Ceuta y Melilla, vemos como el nivel de PCR’s ha incrementado a lo largo de los meses, de marzo ha octubre hubo un aumento de 55.146 pruebas en Melilla, no obstante, en ambos gráficos estas ciudades autónomas presentan un número de pruebas bajo, cabe decir, no obstante, que el número de habitantes aquí es menor que en otras CCAA, por tanto, resulta lógico que las pruebas realizadas (sin tener en cuenta los datos relativos) sean menores.

6.4 Comparación, pruebas PCR y test anticuerpos

dfb <- dfCCAA %>% select(dia, mes, año, cod_ine, CCAA, PCR, TEST_ANTICUERPOS)

Tpruebasl <- dfb %>% pivot_longer(cols = 6:7, names_to = "Prueba", values_to = "Total")

mediap <- Tpruebasl %>% group_by(Prueba) %>%  summarise(media = mean(Total))


grafico2 <- ggplot(mediap, aes(Prueba, media, fill = Prueba)) +  scale_fill_brewer(palette="Spectral") + geom_col() + labs(y = "Media pruebas",  title = "Comparación: Número de pruebas (totales) medias", caption = "Elaboración propia") + scale_y_continuous(labels=function(n){format(n, scientific = FALSE)}) + geom_text(aes(y=media, label = media), position = position_dodge(width = 0.8), size = 3.2, vjust=3, col = "Black") + xlab(NULL) +  theme_classic() + theme(legend.position = "none") + theme(plot.title = element_text(hjust = 0.5))

A la vista del gráfico se comprueba como el número de PCRs es más significativo, se utiliza diariamente más que los tests rápidos, para detectar los positivos en Covid-19.

Una de las causas principales de ello, es porque las PCR’s (‘Reacción en Cadena de la Polimerasa’) son más fiables, permiten detectar y cuantificar el virus. Mientras que el test rápido sirve para detectar si la persona ha estado contagiada, en presencia o no de anticuerpos.

maxP <- dfCCAA %>% select(dia, mes, cod_ine, PCR) %>% filter(mes != "4")
maxp <- maxP %>% slice_max(PCR, n=1) #El dia que más pruebas PCR se hicieron fue el día 5 del 11 en Cataluña, concretamente se hicieron: 2.792.707
maxp <- maxp %>% rename(N.Pruebas = "PCR")
maxp <- maxp %>% mutate(Tipo_Prueba =  case_when(N.Pruebas == 2792707 ~ "PCR"))

#Haremos lo mismo para los otros tipos de prueba y para obtener el mínimo, por lo que creemos que el código no es necesario mostrarlo.
#PREPARACIÓN DE LAS TABLAS
#Juntar las tablas.
tabla <- rbind(maxo, maxac,maxp)

#Exporto esta tabla:
rio::export(tabla, here::here("datos", "tablamax.csv"))
tabla <- rio::import(here::here("datos", "tablamax.csv"))

tabla <- tabla %>% mutate(CCAA = case_when(cod_ine == 1 ~"Andalucia",   cod_ine == 9 ~ "Cataluña")) %>% select(dia, mes, CCAA, Tipo_Prueba, N.Pruebas)

#Repetimos todo el proceso para hacer el mínimo
#Paso final para las tablas
library(flextable)

ftmin <- flextable(head(tablamin), col_keys = c("dia", "mes", "CCAA", "Tipo_Prueba", "N.Pruebas"))

ftmax <-  flextable(head(tabla), col_keys = c("dia", "mes", "CCAA", "Tipo_Prueba", "N.Pruebas"))


¿Cuál fue el día en el que menos pruebas se hicieron?

dia

mes

CCAA

Tipo_Prueba

N.Pruebas

2

7

Madrid

OTROS_TESTS

0

14

5

Cataluña

TEST_ANTICUERPOS

1983

14

5

I.Baleares

PCR

649


Y, ¿Cuál fue el día en el que más pruebas se hicieron?

dia

mes

CCAA

Tipo_Prueba

N.Pruebas

5

11

Andalucia

OTROS_TESTS

1048632

5

11

Andalucia

TEST_ANTICUERPOS

490969

5

11

Cataluña

PCR

2792707


*Cabe tener en cuenta que los datos van desde el 23 de marzo hasta el 5 de noviembre.

6.5 Análisis de casos según las provincias

#Preparando los datos para que salga el mapa.
library(rio)
library(tidyverse)


Provincias <- rio::import("https://github.com/perezp44/LAU2boundaries4spain/blob/master/data/Provincias.rda?raw=true")


dfPROV <- dfPROV %>% mutate(Total_x_cap = Totalxcap*100)
dfPROV <- dfPROV %>% select(provincia, Cod, Poblacion, Total, Total_x_cap) %>% arrange(Cod)
#names(Provincias)


library(sf)

canarias <- Provincias %>% filter(INECodProv %in% c(35,38))

peninsula <- Provincias %>% filter( !(INECodProv %in% c(35, 38)))

my_shift <- st_bbox(peninsula)[c(1,2)]- (st_bbox(canarias)[c(1,2)]) + c(-2.4, -1.1)

canarias$geometry <- canarias$geometry + my_shift

st_crs(canarias)  <- st_crs(peninsula)

peninsula_y_canarias <- rbind(peninsula, canarias)



p <- ggplot(texto = "provincia" ) + geom_sf(data = peninsula_y_canarias)


Tabla <- full_join(peninsula_y_canarias, dfPROV, by = c("INECodProv" = "Cod"))


Tabla1 <- Tabla %>% select(provincia, INECodProv, Total_x_cap, geometry)

provincias_point <- st_centroid(Tabla1)
provincias_points <- cbind(Tabla1, st_coordinates(st_centroid(Tabla1$geometry)))


mapa <- p + geom_sf(data = peninsula_y_canarias, fill = NA) +
    geom_sf(data = provincias_points, aes(geometry = geometry, fill = Total_x_cap)) + scale_fill_viridis_c(direction = -1, option = "inferno", name = "Contagios x hab (%)", alpha = .6) + labs(title = "Contagios relativos según provincia y población") + theme(plot.title = element_text(hjust = 0.7, face = "bold", color = "Black")) + geom_text(data = provincias_points, aes(X, y=Y, label = provincia), color = "Black", fontface = "bold", check_overlap = TRUE, size = 2.5) +  theme_minimal() + theme(axis.text.x = element_blank(), axis.text.y = element_blank()) + labs(x = NULL, y=NULL)

Es importante considerar los datos de manera relativa

Provincias con más casos según población

#Teniendo en cuenta la población:

dfTrelp <- dfTrel %>% mutate(Porcentaje = Totalxcap*100)


graficoB <- ggplot(dfTrelp, aes(forcats::fct_reorder(provincia, Porcentaje), Porcentaje)) +
  geom_col(aes(fill = Porcentaje)) +
  theme(axis.text.x = element_text(angle=90, vjust=0.6), panel.background = NULL) +
  scale_fill_viridis_c(option = "inferno", name = "Contagios per capita", alpha = 0.8, begin = 0.3, end = 0.7, direction = -1, guide = guide_colorbar( direction = "horizontal", barheight = unit(2, units = "mm"), barwidth = unit(50, units = "mm"), draw.ulim = F, title.position = 'top', title.hjust = 0.5, label.hjust = 0.5)) +
  theme(legend.text = element_text(size = 7)) +
  labs(title = "Contagios totales según provincia", subtitle = "Y en relación al número de habitantes") +
  theme(plot.title = element_text(hjust = 0.5)) +
  theme(plot.subtitle = element_text(hjust = 0.5)) + labs(x = NULL, y = NULL) + theme(legend.position = "bottom")

Treemapify

Si relacionamos el número de contagios totales por el número de habitantes; vemos que la provincia con más contagios es Navarra, seguida de Huesca y Burgos. Madrid sigue siendo una de las provincias cabeceras en cuanto a contagios. Al contrario, las provincias que más destacan por menor número de casos son las provincias canarias Tenerife y Las Palmas.

library(treemapify)

ggplot(dfTrelp, aes(area = Porcentaje, fill = Porcentaje, label = provincia)) +
  geom_treemap() +
  geom_treemap_text(fontface = "italic", colour = "white", place = "centre",
                    grow = FALSE) +
  scale_fill_viridis_c(option = "inferno", name = "", alpha = 0.8, begin = 0.3, end = 0.7, direction = -1,
                       guide = guide_colorbar( title = "% casos según población", direction = "horizontal", barheight = unit(2, units = "mm"),
                                               barwidth = unit(50, units = "mm"), draw.ulim = F,
                                               title.position = 'top', title.hjust = 0.5, label.hjust = 0.5)) +
  theme(legend.position = "bottom") + scale_x_continuous(labels=function(n){format(n, scientific = FALSE)}) +
  labs(title = "Provincias con mayor número de casos según su población (en %)",
       subtitle = "Se ha calculado el Total de casos entre la pobación y multiplicado por 100 para sacar el porcentaje",
       caption = "Los últimos datos corresponden al 11-11-2020") + theme(plot.title = element_text(hjust = 0.5)) +
  theme(plot.subtitle = element_text(hjust = 0.5))

Una comparación

Dado que es importante tener en cuenta los casos de manera relativa, aquí hemos querido comparar el número de provincias con más casos teniendo en cuenta el número de habitantes que hay en cada una de estas y sin tener en cuenta la población. Como era esperable y a la vista del gráfico, observamos que resultados difieren al considerar o no la población


dfM <- dfTrel %>% select(provincia, Total) %>% arrange(desc(Total))

dfM <- dfM %>% filter(provincia %in% c("Madrid", "Barcelona", "Murcia", "Sevilla", "Zaragoza"))

graficoA <- ggplot(dfM, aes(forcats::fct_reorder(provincia, Total), Total)) +
  geom_col(aes(fill = Total)) +
  theme(panel.background = NULL) +
  scale_y_continuous(labels=function(n){format(n, scientific = FALSE)})

graficoA <- graficoA + geom_text(aes(y=Total, label = Total), position = position_dodge(width = 0.9), size = 3.2, vjust=2, col = "White") + labs(x = NULL, y = NULL, title = "5 provincias con más contagios totales") + theme(plot.title = element_text(hjust = 0.5))

dfMb <- dfTrel %>% select(provincia, Totalxcap) %>% arrange(desc(Totalxcap))

dfMb <- dfMb %>% filter(provincia %in% c("Navarra", "Huesca", "Burgos", "Valladolid", "Zaragoza"))

graficoA2 <- ggplot(dfMb, aes(forcats::fct_reorder(provincia, Totalxcap), Totalxcap)) +
  geom_col(aes(fill = Totalxcap)) +
  theme(panel.background = NULL) +
  scale_y_continuous(labels=function(n){format(n, scientific = FALSE)})

graficoA2 <- graficoA2 + geom_text(aes(y=Totalxcap, label = Totalxcap), position = position_dodge(width = 0.3), size = 2, vjust=3, col = "White") + labs(x = NULL, y = NULL, title = "5 provincias con más contagios en función de la población") + theme(plot.title = element_text(hjust = 0.5))

7. Estudio sobre el Covid en la Comunidad Valenciana

Siguiendo nuestro análisis sobre la Covid-19, en este apartado nos centraremos en analizar algunos elementos destaclabes de la pandemía en la Comunidad Valenciana.

7.1 Contagios en la Comunidad Valenciana.


dfrelb <- dfgg %>% mutate(Total_cap = (Num/Poblacion))

dfTrelx <- dfrelb %>% mutate(Totalxcap = (Total_cap*100)) %>% filter(provincia %in% c("Castellon", "Valencia", "Alicante"))

dfTrelx <- transform(dfTrelx, mes = as.numeric(mes))

a <- ggplot(data = dfTrelx, aes(mes, Num, group=provincia, color = provincia)) + geom_line() + geom_point() + theme_minimal()   + labs(y= "Número de contagios", y = "Meses", caption = "Elaboración propia") + theme(plot.title = element_text(hjust = 0.5)) + scale_x_continuous(breaks = seq(1, 11, 1))

a + transition_reveal(mes) + labs(title="NÚMERO DE CASOS EN LA COMUNIDAD VALENCIANA. Mes: {as.integer(frame_along)}")

Centrándonos en las provincias de la Comunidad Valenciana, se puede observar que Alicante es la que menos Contagios tiene de las tres, luego iría Castellón y Valencia. Pero las tres, tienen una buena tasa de contagios respecto al resto de provincias, ya que están entre las 11 provincias con menos contagios de toda España.

7.2 Ingresados en Sept-Oct-Nov por Covid.

datos_CV <- datos_CCAA %>%
filter(cod_ine == 10) %>%
relocate(cod_ine, .before=Dia) #Datos para la Comunitat Valenciana.
datos_CV_S_N<- datos_CV %>% filter (Mes == "09"| Mes == "10"| Mes == "11")
grafico_CV <- ggplot(datos_CV_S_N , aes(Dia , `Total Pacientes COVID ingresados`, group=Mes, color= Mes))  + geom_line() + labs(title = " Evolución de pacientes ingresados por covid en la Comunidad Valenciana", subtitle = "Desde el 1 Septiembre hasta Noviembre 30", caption = "Datos repositorio COVID19")
grafico_CV

La evolución de los pacientes ingresados por COVID en la segunda ola, han evolucionado de manera similar a la evolución de contagios.

Podemos ver, como en septiembre el número de pacientes estaba bastante controlado, pero cuando llegó el mes de octubre, fue cuando los hospitales sufrieron un repunte total de los pacientes ingresados, que durante el mes de noviembre aumentó todavía más si cabe.

En noviembre los datos se volvieron altamente peligrosos, ya que los hospitales de la Comunidad estaban cerca de colapsarse como ya sucedió en la primera ola.

La cresta de esta ola, llegó el 18 de noviembre donde habían más de 1800 ingresados por coronavirus en la Comunidad Valenciana.

Pruebas realizadas

Tipos de pruebas


La prueba más repetida en nuestra comunidad es sin ninguna duda, la prueba PCR, seguida de la prueba de anticuerpos. En todos los meses recogidos, la cantidad de pruebas PCR es muy superior a la cantidad del resto de pruebas.

También podemos ver, que el en el mes de septiembre se han realizado más pruebas que en los meses de julio y agosto. Cabe destacar que, en el mes de julio, se realizaron más pruebas de anticuerpos que en el resto de los meses.

Por último, se ve una clara evolución al alza de otros tests, esto se da gracias a que la prueba de antígenos cada vez es más común debido a su eficacia y a que la realización de ella es mucho más barata que las PCR.

cv <- dfp %>% filter(CCAA == "Comunidad Valenciana")
cv  <- cv %>%
  separate(Fecha, c("año","mes","dia"), sep = "-") %>%                 relocate(año, .after=dia) %>%
  relocate(dia, .before =mes)


cv <- cv %>% filter (mes == "07"| mes == "08"| mes == "09") %>% select(dia, mes, PCR, TEST_ANTICUERPOS, OTROS_TESTS)

cvl <- cv %>% pivot_longer(3:5, names_to = "Pruebas", values_to = "N.prueba")

#Para calcular en la Comunidad Valenciana que tipo de pruebas se han hecho más durante los meses de julio, agosto y septiembre.

Csep <- cvl %>% group_by(mes, Pruebas) %>% summarise(Total = sum(N.prueba)) %>% filter(mes == "09")

S <- ggplot(Csep, aes("", Total, fill = Pruebas)) + geom_bar(stat = "identity", color="white") + geom_text(aes(label=Total), position = position_stack(vjust=0.5), color = "white", size = 2) + coord_polar(theta = "y") + scale_fill_manual(values=c("salmon","steelblue","orange","gray")) + theme_void() + labs(title="septiembre") + theme(plot.title = element_text(hjust = 0.5))
#Igual para julio y agosto

Cjul <- cvl %>% group_by(mes, Pruebas) %>% summarise(Total = sum(N.prueba)) %>% filter(mes == "07")

J <- ggplot(Cjul, aes("", Total, fill = Pruebas)) + geom_bar(stat = "identity", color="white") + geom_text(aes(label=Total), position = position_stack(vjust=0.5), color = "white", size = 2) + coord_polar(theta = "y") + scale_fill_manual(values=c("salmon","steelblue","orange","gray")) + theme_void() + labs(title="julio") + theme(plot.title = element_text(hjust = 0.5)) + theme(legend.position = "none")

Cagost <- cvl %>% group_by(mes, Pruebas) %>% summarise(Total = sum(N.prueba)) %>% filter(mes == "08")

A <- ggplot(Cagost, aes("", Total, fill = Pruebas)) + geom_bar(stat = "identity", color="white") + geom_text(aes(label=Total), position = position_stack(vjust=0.5), color = "white", size = 2) + coord_polar(theta = "y") + scale_fill_manual(values=c("salmon","steelblue","orange","gray")) + theme_void() + labs(title="agosto") + theme(plot.title = element_text(hjust = 0.5)) + theme(legend.position = "none")

PCR’s según mes


C_V <- dfCCAA %>% filter(CCAA == "C.Valenciana")
C_V <- C_V %>% select(dia, mes, año, CCAA, PCR, TEST_ANTICUERPOS)
C_V <- C_V %>% pivot_longer(5:6, names_to = "Prueba", values_to= "N.prueba")

CVlcna <- C_V %>% group_by(mes, Prueba) %>% summarise(Total = sum(N.prueba)) %>% filter(Prueba == "PCR") %>% filter(mes != "11")

graficoC_V <- ggplot(CVlcna, aes(mes, Total, fill = "Orange"))  + geom_col(position = "dodge") + labs(x = "Meses", y = "Núm. pruebas PCR", title = "PCR's mensuales C.Valenciana", subtitle =  "Meses abril-octubre") + theme_bw() + theme(plot.title = element_text(hjust = 0.5)) + theme(plot.subtitle = element_text(hjust = 0.5)) + theme(legend.position = "none") + theme(plot.title = element_text(hjust = 0.5)) + scale_y_continuous(labels=function(n){format(n, scientific = FALSE)})

En este gráfico se muestran las PCR’s acumuladas

La evolución mensual de PCR’s en la Comunidad Valenciana, demuestra que la cantidad de pruebas realizadas en la segunda ola, es mucho mayor que en la primera; esto se debe a que en la primera ola estábamos escasos de recursos.

#Hemos hecho este gráfico pero no sale cuando le damos a Knit.
library(highcharter)

C_vf <- C_V %>% filter(mes != "11") %>% filter(mes != "4")  %>% group_by(mes, Prueba) %>% summarise(Total = sum(N.prueba))

hchart(C_vf, "column", hcaes(x = mes, y = Total, group = Prueba))  %>%  hc_add_theme(hc_theme_gridlight())  %>%   hc_title(
    text = "<b>NÚMERO DE PRUEBAS SEGÚN TESTS Y MESES EN LA COMUNIDAD VALENCIANA </b>",
    margin = 20,
    align = "center",
    style = list(color = "#22A884"))

#*Los valores de este gráfico son la suma total de las pruebas realizadas en un mes concreto, los datos ofrecidos mostraban las pruebas realizadas por semanas durante cada mes.

8. Algunas cuestiones sobre el impacto económico

¿Qué cuestiones?

Por último, en este apartado nos gustaría comentar cual ha sido el efecto de la Covid-19, en algunos ámbitos económicos, en concreto, como ha afectado al mercado de trabajo, al desempleo, en diferentes países europeos. Además de algunas cuestiones sobre el PIB, el cual, como era de esperar ha bajado ddebido a la actual crisis sanitaria.

Para mostrar esto, hemos cogido datos del Eurostat. Este BREVE análisis se dividirá en:

  • Primeramente un mapa con el % de parados que había en los diferentes países de la Unión Europea, durante el mes de abril, en plena pandemia (y confinamineto de muchos de estos países)

  • Seguidamente compararemos en los diferentes meses como ha evolucionado el paro en 5 países europeos, estos son: Francia, Portugal, Italia, España y como curiosidad, Suecia, ya que es el único país europeo en el que no habido un confinamiento estricto.

  • Por último, centrados en España, podremos observar como el paro ha afectado ha afectado de manera diferente dependiendo del género. Presentando un % de paro mayor las muejeres que los hombres.

En cuanto al PIB, considerando el año base en 2015, pretendemos ver el efecto para Francia, Italia, España y Suecia del:

  • PIB a precios de mercado.
  • Exportaciones de bienes y servicios.
  • Importaciones de bienes y servicios.

DESEMPLEO

Con el fin de analizar la situación del mercado laboral tras la crisi del Covid, hemos hecho una serie de mapas-gráficos.

A través del mapa, observamos que en el mes de Abril la tasa armonizada de paro en España se situaba en valores entre 14,3-16,4. Cifras solo superadas por Grecia.

No obstante, cabe destacar que esto no es una situación nueva, es decir, las cifras de paro en España ya eran elevadas antes de la pandemia, al igual que en Grecia, Por lo tanto, no observamos a corto plazo cambios muy significativos entre la proporción de la población ocupada y la desocupada (Población Activa)

En el siguiente gráfico se muestra la evolución de la tasa de paro armonizada para 5 países (España, Francia, Italia, Portugal y Suecia)

Como vemos, la tendencia aunque no muy pronunciada es clara, a excepción de Italia. Aquí primero parece disminuir la tasa de paro y a partir de abril cambia de tendencia y empieza a aumentar.

En cambio, los demás países analizados y sobretodo en España la tasa de paro aumenta tras la crisis sanitaria. Pasando, por ejemplo, en España de 13,7% en diciembre de 2019 a 16,2% en noviembre de 2020, pasando por un máximo de 16,9% en julio.

En el último gráfico se muestra como ha afectado en España la tasa de paro en función del género, donde podemos concluir que hay más % de mujeres desempleadas que de hombres.

Finalmente, decir que esta crisis no ha afectado de igual manera que la recesión de 2008, además de que muchas empresas han tenido que aplicar el ERTE a sus trabajadores y el gobierno ha tenido que adoptar nuevas medidas en torno a esto. 5

#PREPARANDO LOS DATOS
paro <- search_eurostat(pattern = "unemployment",
                             type = "table")

#Hay datos hasta 2020M11, es decir, hasta el mes de noviembre de este año, 2020.

inf_paro <- get_eurostat(id= "teilm020",  time_format = "num")

labelE <- label_eurostat(inf_paro)

country_codes <- unique(mapdata_0$NUTS_ID)

#2020.25 corresponde al año 2020 mes 04 (abril)
inf_paro_2020 <- inf_paro %>%
  filter( time == "2020.25") %>%
  filter(geo %in% country_codes)

inf_paro_2020_mapa <- mapdata_0 %>%
  right_join(inf_paro_2020) %>%
  mutate(cat = cut_to_classes(values, n=8, decimals = 1))

Mapa de coropletas para el paro

#CODIGO PARA EL MAPA

ggplot(inf_paro_2020_mapa, aes(fill=cat)) +
  geom_sf(color = alpha("white", 1/2), alpha= .9) +
  xlim(c(-20, 44)) +
  ylim(c(35, 70)) +
  labs(title = "Tasa armonizada de paro (%)",
       subtitle = "Abril 2020",
       caption = "(C) EuroGeographics for the administrative boundaries",
       fill= "") +
  theme_classic() +
  theme(
    axis.line = element_blank(),
    axis.text = element_blank(),
    axis.title = element_blank(),
    axis.ticks = element_blank(),
    plot.background = element_rect(fill = "snow", color = NA),
    panel.background = element_rect(fill= "snow", color = NA),
    plot.title = element_text(size = 18, hjust = 0.5),
    plot.subtitle = element_text(size = 12, hjust = 0.5),
    plot.caption = element_text(size = 8, hjust = 1),
    legend.title = element_text(color = "grey40", size = 8),
    legend.text = element_text(color = "grey40", size = 7, hjust = 0),
    legend.position = c(0.93, 0.6),
    plot.margin = unit(c(0.5,2,0.5,1), "cm")) +
  scale_fill_brewer(palette= "Paired")

Evolución del paro

#PREPARANDO LOS DATOS
#La tasa de paro de España en el mes de abril fue del 15%

#En cambio, en el mes de enero, antes de comenzar la pandemia era de 13.5

#Filtramos para comparar España, Francia, Italia, Portugal y Suiza

Filtros <- inf_paro %>% filter(geo %in% c("ES", "PT", "IT", "FR", "SE"))
Filtros <- Filtros %>% filter(sex == "T")

library(plotly)

Evparo <- ggplot(Filtros, aes(time, values, color = geo)) + geom_line(size = 1) + geom_point() + labs(y = "Valor (en %)", title = "Evolución de la tasa de paro armonizada (en %)",
subtitle = "PAÍSES: España, Francia, Italia, Portugal, Suecia", caption ="Datos Eurostat.
Los datos van desde diciembre 2019 hasta octubre 2020.
(Cada punto del gráfico indica un mes)") +
theme_light() +
theme(plot.title = element_text(size = 18, hjust = 0.5),
plot.subtitle = element_text(size = 12, hjust = 0.5),
plot.caption = element_text(size = 8, hjust = 1)) +
  theme(axis.title.x=element_blank(),
        axis.text.x=element_blank(),
        axis.ticks.x=element_blank())

Evparo <- Evparo + scale_y_continuous(breaks = seq(2, 17, 1))

Paro en España, a qué genero ha afectado más?

#Como ha afectado el paro dependiendo del sexo?

Spain <- inf_paro %>% filter(geo == "ES")
Spain <- Spain %>% filter(sex %in% c("M", "F"))


GraficoSpain <- ggplot(Spain, aes(time, values, color = sex)) +
  geom_line(size = 1) +
  geom_point() +
  labs(y = "Valor (en %)",
       title = "Evolución tasa de paro armonizada para España (en %)",
 subtitle = "Diferenciando por sexo: femenino y masculino", caption ="Datos Eurostat.
Los datos van desde diciembre 2019 hasta octubre 2020.
(Cada punto del gráfico indica un mes)") +
  theme_minimal() +
  theme(plot.title = element_text(size = 18, hjust = 0.5),
        plot.subtitle = element_text(size = 12, hjust = 0.5),
        plot.caption = element_text(size = 8, hjust = 1)) +
  theme(axis.title.x=element_blank(),
        axis.text.x=element_blank(),
        axis.ticks.x=element_blank()) +
  theme(legend.position = "bottom") +
 theme(legend.direction = "horizontal")

PIB

#Datos del paquete Eurostat:
library(tidyverse)

library(eurostat)

gdp <- get_eurostat("namq_10_gdp", time_format = "raw", keepFlags = TRUE)

labelgdp <- label_eurostat(gdp, fix_duplicated = TRUE)
df_names <- names(gdp)

df <- label_eurostat(gdp, code = df_names, fix_duplicated = TRUE)

df <- df %>%
    select(unit_code, s_adj_code, na_item_code, geo, geo_code, time, values)

#df_bb <- pjpv2020.01::pjp_f_unique_values(df, truncate = TRUE, nn_truncate = 200)

df <- df %>% filter(time >= "2018Q1")
gdp <- df


gdp<- gdp %>% rename (unidad_de_medida =na_item_code)

# a) Gross domestic product at market prices
gdp_a <-  gdp  %>% filter(unidad_de_medida== "B1GQ") %>% select(-unidad_de_medida)

gdp_a <- gdp_a %>% filter(unit_code == "CLV_I15") %>% filter(s_adj_code == "SCA")

gdp_a <- gdp_a %>% select(-c(unit_code,s_adj_code))
#Lo mismo para las exportaciones y las importaciones
library(plotly)

Evgdpa <- ggplot(gdp_pa, aes(time, values,group=geo, color = geo)) + geom_line(size = 1) + geom_point() + labs(y = "Valor (Índices)", title = "Evolución del PIB a precios de mercado (Año base 2015)",
                                                                                                      subtitle = "PAÍSES: España, Francia, Italia, Portugal, Suecia", caption ="Datos Eurostat.
Los datos van desde el primer trimestre de 2018 hasta el tercer trimestre del 2020.
(Cada punto del gráfico indica un trimestre)") +
    theme_light() +
    theme(plot.title = element_text(size = 18, hjust = 0.5),
          plot.subtitle = element_text(size = 12, hjust = 0.5),
          plot.caption = element_text(size = 8, hjust = 1)) +
    theme(axis.title.x=element_blank(),
          axis.text.x=element_blank())


#ggplotly(Evgdpa, tooltip = c("geo", "values"))


En estos tres gráficos queremos ofrecer una perspectiva económica de cuál ha sido el impacto del coronavirus en cuatro países europeos, algunos de los cuales ofrecen diferencias destacables en cuanto a su estructura o composición económica De manera que en estos gráficos se muestra tanto la evolución del PIB a precios de mercado como las exportaciones e importaciones de bienes y servicios, todos ellos en números índices, cuyo año base es 2015 (2015 = 100)

Observando de forma global en los tres gráficos podemos ver que tanto Francia, España e Italia tienen una evolución muy parecida. En cambio, Suecia no sufre tan drásticamente los efectos negativos de la pandemia.

Esto se debe, en parte, a que Suecia no puso un confinamiento restrictivo, durante el primer pico de la pandemia, dado que la incidencia fue mucho menor que en los otros tres países analizados. Optó pues, por la estrategia de ’inmunidad de rebaño" Como resultado, observamos que las cifras de Suecia con mejores que la de otros países de la eurozona, el PIB no cayó tanto en el segundo y tercer trimestre de 2020, se encontraba alrededor de 105 pp. Mientras que en España bajó 15 puntos respecto a su año base.

Además, cabe decir que en el país escandinavo, la digitalización y el teletrabajo ya estaba presente en muchas empresas, a diferencia de otros países, como España, que pilló más de improvisto.

No obstante, sería interesante saber lo que proponen las diferentes autoridades responsables de la política económica para intentar devolver los actuales valores a las cifras que había antes del primer trimestre de 2020. Así como el efecto que tendrá la aplicación de la vacuna sobre las expectativas de la población.

9. Conclusión

El contar con una herramienta tan potente como es R, que nos permite manejar datos y utilizarlos para hacer análisis complejos nos ha permitido y facilitado tener una perspectiva más amplia y a la vez concreta de lo que está sucediendo con la actual pandemia de la Covid-19. Por lo que nuestro análisis se ha centrado en esta, tanto a nivel mundial como más concretamente para España y la Comunidad Valenciana. Así como hemos mostrado de manera breve cual ha sido el impacto económico que ha podido tener la pandemia a nivel europeo.

Cabe señalar que nos ha resultado muy interesante el hecho de poner manejar los datos a nuestro antojo para intentar resolver ciertas cuestiones que nos planteamos antes de empezar el análisis y así, ofrecer la información de forma más visual a través de gráficos, tablas, mapas y demás. Para obtener estos resultados, hemos tenido que seguir varios pasos, empezando por buscar los datos y hacerlos “tidy” (para utilizar aquello que realmente necesitábamos) Además, decir que existen diferentes paquetes (Covid19, TidyCovid19, ncov19…) que recopilan información sobre el Coronavirus y facilitan la creación de, por ejemplo, mapas.

Como indicamos en la introducción, elegimos el tema de la Covid-19 dado que queríamos entender por nuestro pie que era esto que había, prácticamente, paralizado el mundo. Por ello, en el presente informe hemos intentado mostrar curiosidades y datos, con el fin de tener una visión general de cómo ha sido el devenir de la pandemia y su evolución hasta prácticamente el mes de Diciembre.

Por último, cabe comentar algunas cuestiones extraídas tras hacer el análisis. Así pues, es destacable que la segunda ola a nivel de contagios ha sido mucho mayor que la primera ola en la mayoría de países, todo y que gracias a la previa preparación, la saturación del sistema sanitario no ha llegado al nivel de la primera, donde hubo momentos en los que los hospitales parecían estar al borde del colapso.

Asimismo, dado que creemos que para poder comparar los datos es mejor que sean relativos, para el caso de España hemos cogido la población de las provincias y así hemos podido calcular el % de contagios según la población. Además de, por ejemplo, las PCR’s por cada 100 mil habitantes, en las diferentes Comunidades Autónomas, donde destaca Navarra como la que más pruebas ha realizado.

Finalmente decir que al tratarse de un tema actual los datos van evolucionando, cambiando. Por tanto, hay que fijarse en el periodo para el que está hecha cada una de las representaciones.

Referencias

Las siguientes páginas web son las que hemos utilizado para la realización del trabajo:

Además de las páginas web mencionadas, hemos utilizado los tutoriales y slides del curso (link mencionado en: nota de página 1)

Asimismo, como comeNtabamos en la introducción nos hemos inspirado para hacer el presente trabajo en nuestro interés por investigar sobre este tema, el cual es actual, así como por la cantidad de datos y notícias que se transmiten día a día.

Igualmente, para hacer el informe y tener ejemplos (referencias) hemos acudido a los trabajos realizados por los compañeros que cursaron la asignatura el año pasado, los encontramos aquí: https://github.com/perezp44/tutoriales_intro_DS



Para acabar este chunk incluiremos la session info:

sessioninfo::session_info() %>% details::details(summary = 'current session info') 

current session info


- Session info ---------------------------------------------------------------
 setting  value                       
 version  R version 4.0.2 (2020-06-22)
 os       Windows 10 x64              
 system   x86_64, mingw32             
 ui       RTerm                       
 language (EN)                        
 collate  Spanish_Spain.1252          
 ctype    Spanish_Spain.1252          
 tz       Europe/Paris                
 date     2020-12-17                  

- Packages -------------------------------------------------------------------
 package           * version    date       lib
 ape                 5.4-1      2020-08-13 [1]
 assertthat          0.2.1      2019-03-21 [1]
 backports           1.2.0      2020-11-02 [1]
 base64enc           0.1-3      2015-07-28 [1]
 bibtex              0.4.2.2    2020-01-02 [1]
 bitops              1.0-6      2013-08-17 [1]
 blob                1.2.1      2020-01-20 [1]
 broom               0.7.0      2020-07-09 [1]
 Cairo             * 1.5-12.2   2020-07-07 [1]
 caTools             1.18.0     2020-01-17 [1]
 cellranger          1.1.0      2016-07-27 [1]
 checkmate           2.0.0      2020-02-06 [1]
 class               7.3-17     2020-04-26 [2]
 classInt            0.4-3      2020-04-07 [1]
 cli                 2.2.0      2020-11-20 [1]
 clipr               0.7.1      2020-10-08 [1]
 collapsibleTree     0.1.7      2018-08-22 [1]
 colorspace          2.0-0      2020-11-11 [1]
 commonmark          1.7        2018-12-01 [1]
 countrycode         1.2.0      2020-05-22 [1]
 covdata           * 0.5.95     2020-12-05 [1]
 covid19.analytics * 2.0        2020-09-28 [1]
 cpp11               0.2.4      2020-11-05 [1]
 crayon              1.3.4      2017-09-16 [1]
 crosstalk           1.1.0.1    2020-03-13 [1]
 curl                4.3        2019-12-02 [1]
 data.table          1.13.0     2020-07-24 [1]
 data.tree           1.0.0      2020-08-03 [1]
 DBI                 1.1.0      2019-12-15 [1]
 dbplyr              1.4.4      2020-05-27 [1]
 desc                1.2.0      2018-05-01 [1]
 deSolve             1.28       2020-03-08 [1]
 details             0.2.1      2020-01-12 [1]
 digest              0.6.27     2020-10-24 [1]
 dplyr             * 1.0.2      2020-08-18 [1]
 DT                  0.16       2020-10-13 [1]
 e1071               1.7-4      2020-10-14 [1]
 ellipsis            0.3.1      2020-05-15 [1]
 eurostat          * 3.6.84     2020-11-19 [1]
 evaluate            0.14       2019-05-28 [1]
 fansi               0.4.1      2020-01-08 [1]
 farver              2.0.3      2020-01-16 [1]
 fastmap             1.0.1      2019-10-08 [1]
 flextable         * 0.5.11     2020-09-09 [1]
 forcats           * 0.5.0      2020-03-01 [1]
 foreign             0.8-80     2020-05-24 [2]
 formatR             1.7        2019-06-11 [1]
 fs                  1.5.0      2020-07-31 [1]
 gdtools             0.2.2      2020-04-03 [1]
 generics            0.1.0      2020-10-31 [1]
 gganimate         * 1.0.7      2020-10-15 [1]
 ggfittext           0.9.0      2020-06-14 [1]
 ggplot2           * 3.3.2      2020-06-19 [1]
 ggrepel             0.8.2      2020-03-08 [1]
 ggThemeAssist     * 0.1.5      2016-08-13 [1]
 gifski            * 0.8.6      2018-09-28 [1]
 glue                1.4.2      2020-08-27 [1]
 gplots              3.1.0      2020-09-18 [1]
 gridExtra         * 2.3        2017-09-09 [1]
 gt                * 0.2.2      2020-11-20 [1]
 gtable              0.3.0      2019-03-25 [1]
 gtools              3.8.2      2020-03-31 [1]
 haven               2.3.1      2020-06-01 [1]
 here                1.0.0      2020-11-15 [1]
 hms                 0.5.3      2020-01-08 [1]
 htmltools           0.5.0      2020-06-16 [1]
 htmlwidgets         1.5.2      2020-10-03 [1]
 httpuv              1.5.4      2020-06-06 [1]
 httr                1.4.2      2020-07-20 [1]
 jsonlite            1.7.1      2020-09-07 [1]
 KernSmooth          2.23-17    2020-04-26 [2]
 klippy            * 0.0.0.9500 2020-11-14 [1]
 knitr             * 1.30       2020-09-22 [1]
 labeling            0.4.2      2020-10-20 [1]
 later               1.1.0.1    2020-06-05 [1]
 lattice             0.20-41    2020-04-02 [2]
 lazyeval            0.2.2      2019-03-15 [1]
 lifecycle           0.2.0      2020-03-06 [1]
 lubridate         * 1.7.9.2    2020-11-13 [1]
 magrittr            2.0.1      2020-11-17 [1]
 mime                0.9        2020-02-04 [1]
 miniUI              0.1.1.1    2018-05-18 [1]
 modelr              0.1.8      2020-05-19 [1]
 munsell             0.5.0      2018-06-12 [1]
 nlme                3.1-148    2020-05-24 [2]
 officer             0.3.14     2020-09-07 [1]
 openxlsx            4.2.2      2020-09-17 [1]
 patchwork         * 1.1.0      2020-11-09 [1]
 pheatmap            1.0.12     2019-01-04 [1]
 pillar              1.4.7      2020-11-20 [1]
 pkgconfig           2.0.3      2019-09-22 [1]
 plotly            * 4.9.2.1    2020-04-04 [1]
 plyr                1.8.6      2020-03-03 [1]
 png                 0.1-7      2013-12-03 [1]
 prettyunits         1.1.1      2020-01-24 [1]
 progress            1.2.2      2019-05-16 [1]
 promises            1.1.1      2020-06-09 [1]
 purrr             * 0.3.4      2020-04-17 [1]
 R6                  2.5.0      2020-10-28 [1]
 rclipboard          0.1.2      2019-07-02 [1]
 RColorBrewer      * 1.1-2      2014-12-07 [1]
 Rcpp                1.0.5      2020-07-06 [1]
 reactable         * 0.2.3      2020-10-04 [1]
 reactR              0.4.3      2020-07-12 [1]
 readr             * 1.4.0      2020-10-05 [1]
 readxl              1.3.1      2019-03-13 [1]
 RefManageR          1.2.12     2019-04-03 [1]
 rentrez             1.2.3      2020-11-10 [1]
 reprex              0.3.0      2019-05-16 [1]
 rio               * 0.5.16     2018-11-26 [1]
 rlang               0.4.9      2020-11-26 [1]
 rmarkdown           2.5        2020-10-21 [1]
 rprojroot           2.0.2      2020-11-15 [1]
 rstudioapi          0.13       2020-11-12 [1]
 rvest               0.3.6      2020-07-25 [1]
 sass                0.2.0      2020-03-18 [1]
 scales              1.1.1      2020-05-11 [1]
 sessioninfo         1.1.1      2018-11-05 [1]
 sf                * 0.9-6      2020-09-13 [1]
 shiny               1.5.0      2020-06-23 [1]
 shinycssloaders     1.0.0      2020-07-28 [1]
 shinydashboard      0.7.1      2018-10-17 [1]
 shinyjs             2.0.0      2020-09-09 [1]
 shinyWidgets        0.5.4      2020-10-06 [1]
 sp                  1.4-2      2020-05-20 [1]
 stringi             1.5.3      2020-09-09 [1]
 stringr           * 1.4.0      2019-02-10 [1]
 systemfonts         0.3.1      2020-09-08 [1]
 tibble            * 3.0.4      2020-10-12 [1]
 tidycovid19       * 0.0.0.9000 2020-12-11 [1]
 tidyr             * 1.1.2      2020-08-27 [1]
 tidyselect          1.1.0      2020-05-11 [1]
 tidyverse         * 1.3.0      2019-11-21 [1]
 treemapify        * 2.5.4      2020-11-19 [1]
 tweenr              1.0.1      2018-12-14 [1]
 units               0.6-7      2020-06-13 [1]
 uuid                0.1-4      2020-02-26 [1]
 vctrs               0.3.5      2020-11-17 [1]
 viridisLite         0.3.0      2018-02-01 [1]
 withr               2.3.0      2020-09-22 [1]
 wordcloud2        * 0.2.1      2018-01-03 [1]
 xfun                0.19       2020-10-30 [1]
 XML                 3.99-0.5   2020-07-23 [1]
 xml2                1.3.2      2020-04-23 [1]
 xtable              1.8-4      2019-04-21 [1]
 yaml                2.2.1      2020-02-01 [1]
 zip                 2.1.1      2020-08-27 [1]
 source                                     
 CRAN (R 4.0.2)                             
 CRAN (R 4.0.2)                             
 CRAN (R 4.0.3)                             
 CRAN (R 4.0.0)                             
 CRAN (R 4.0.2)                             
 CRAN (R 4.0.3)                             
 CRAN (R 4.0.2)                             
 CRAN (R 4.0.2)                             
 CRAN (R 4.0.3)                             
 CRAN (R 4.0.3)                             
 CRAN (R 4.0.2)                             
 CRAN (R 4.0.3)                             
 CRAN (R 4.0.2)                             
 CRAN (R 4.0.2)                             
 CRAN (R 4.0.2)                             
 CRAN (R 4.0.3)                             
 CRAN (R 4.0.3)                             
 CRAN (R 4.0.3)                             
 CRAN (R 4.0.2)                             
 CRAN (R 4.0.2)                             
 Github (kjhealy/covdata@719f554)           
 CRAN (R 4.0.3)                             
 CRAN (R 4.0.3)                             
 CRAN (R 4.0.2)                             
 CRAN (R 4.0.2)                             
 CRAN (R 4.0.2)                             
 CRAN (R 4.0.2)                             
 CRAN (R 4.0.3)                             
 CRAN (R 4.0.2)                             
 CRAN (R 4.0.2)                             
 CRAN (R 4.0.2)                             
 CRAN (R 4.0.3)                             
 CRAN (R 4.0.3)                             
 CRAN (R 4.0.3)                             
 CRAN (R 4.0.2)                             
 CRAN (R 4.0.3)                             
 CRAN (R 4.0.3)                             
 CRAN (R 4.0.2)                             
 CRAN (R 4.0.2)                             
 CRAN (R 4.0.2)                             
 CRAN (R 4.0.2)                             
 CRAN (R 4.0.2)                             
 CRAN (R 4.0.2)                             
 CRAN (R 4.0.3)                             
 CRAN (R 4.0.2)                             
 CRAN (R 4.0.2)                             
 CRAN (R 4.0.3)                             
 CRAN (R 4.0.3)                             
 CRAN (R 4.0.2)                             
 CRAN (R 4.0.3)                             
 CRAN (R 4.0.3)                             
 CRAN (R 4.0.3)                             
 CRAN (R 4.0.2)                             
 CRAN (R 4.0.3)                             
 CRAN (R 4.0.3)                             
 CRAN (R 4.0.3)                             
 CRAN (R 4.0.2)                             
 CRAN (R 4.0.3)                             
 CRAN (R 4.0.3)                             
 Github (rstudio/gt@416ca71)                
 CRAN (R 4.0.2)                             
 CRAN (R 4.0.3)                             
 CRAN (R 4.0.2)                             
 CRAN (R 4.0.3)                             
 CRAN (R 4.0.2)                             
 CRAN (R 4.0.2)                             
 CRAN (R 4.0.3)                             
 CRAN (R 4.0.2)                             
 CRAN (R 4.0.2)                             
 CRAN (R 4.0.3)                             
 CRAN (R 4.0.2)                             
 Github (rlesur/klippy@378c247)             
 CRAN (R 4.0.3)                             
 CRAN (R 4.0.3)                             
 CRAN (R 4.0.2)                             
 CRAN (R 4.0.2)                             
 CRAN (R 4.0.2)                             
 CRAN (R 4.0.2)                             
 CRAN (R 4.0.3)                             
 CRAN (R 4.0.3)                             
 CRAN (R 4.0.0)                             
 CRAN (R 4.0.3)                             
 CRAN (R 4.0.2)                             
 CRAN (R 4.0.2)                             
 CRAN (R 4.0.2)                             
 CRAN (R 4.0.2)                             
 CRAN (R 4.0.2)                             
 CRAN (R 4.0.3)                             
 CRAN (R 4.0.3)                             
 CRAN (R 4.0.2)                             
 CRAN (R 4.0.2)                             
 CRAN (R 4.0.3)                             
 CRAN (R 4.0.2)                             
 CRAN (R 4.0.0)                             
 CRAN (R 4.0.2)                             
 CRAN (R 4.0.2)                             
 CRAN (R 4.0.2)                             
 CRAN (R 4.0.2)                             
 CRAN (R 4.0.3)                             
 CRAN (R 4.0.3)                             
 CRAN (R 4.0.3)                             
 CRAN (R 4.0.2)                             
 CRAN (R 4.0.3)                             
 CRAN (R 4.0.3)                             
 CRAN (R 4.0.3)                             
 CRAN (R 4.0.2)                             
 CRAN (R 4.0.2)                             
 CRAN (R 4.0.3)                             
 CRAN (R 4.0.2)                             
 CRAN (R 4.0.3)                             
 CRAN (R 4.0.3)                             
 CRAN (R 4.0.3)                             
 CRAN (R 4.0.3)                             
 CRAN (R 4.0.3)                             
 CRAN (R 4.0.2)                             
 CRAN (R 4.0.3)                             
 CRAN (R 4.0.3)                             
 CRAN (R 4.0.2)                             
 CRAN (R 4.0.3)                             
 CRAN (R 4.0.2)                             
 CRAN (R 4.0.3)                             
 CRAN (R 4.0.3)                             
 CRAN (R 4.0.3)                             
 CRAN (R 4.0.3)                             
 CRAN (R 4.0.2)                             
 CRAN (R 4.0.2)                             
 CRAN (R 4.0.2)                             
 CRAN (R 4.0.2)                             
 CRAN (R 4.0.3)                             
 Github (joachim-gassen/tidycovid19@8006632)
 CRAN (R 4.0.2)                             
 CRAN (R 4.0.2)                             
 CRAN (R 4.0.3)                             
 CRAN (R 4.0.3)                             
 CRAN (R 4.0.2)                             
 CRAN (R 4.0.2)                             
 CRAN (R 4.0.0)                             
 CRAN (R 4.0.3)                             
 CRAN (R 4.0.2)                             
 CRAN (R 4.0.3)                             
 CRAN (R 4.0.3)                             
 CRAN (R 4.0.3)                             
 CRAN (R 4.0.3)                             
 CRAN (R 4.0.2)                             
 CRAN (R 4.0.2)                             
 CRAN (R 4.0.2)                             
 CRAN (R 4.0.2)                             

[1] C:/Users/noeli/OneDrive/Documentos/R/win-library/4.0
[2] C:/Program Files/R/R-4.0.2/library



  1. Si quieres visitar la web del curso: https://perezp44.github.io/intro-ds-20-21-web/↩︎

  2. Si quieres consultar más información haz click aquí↩︎

  3. Indicamos el enlace por si se quiere obtener más información al respecto.https://data.humdata.org/dataset/acaps-covid19-government-measures-dataset↩︎

  4. No hemos hecho la evolución hasta la fecha actual, dado que a partir de julio los datos de contagios en fines de semana muestran unos valores de 0 (Un resultado no coherente)↩︎

  5. Aquí dejamos en elance por si se quiere consultar más inf. SEPE↩︎

LS0tDQp0aXRsZTogPGNlbnRlcj48Rk9OVCBDT0xPUj0iRkY0RDAwIj5BTsOBTElTSVMgU09CUkUgTEEgQ09WSUQtMTk8L0ZPTlQ+PC9jZW50ZXI+DQphdXRob3I6ICJNaWVtYnJvcyBkZWwgZ3J1cG86ICBcblxuICoqSWduYWNpbyBNb250YXZhKiogKG1vbnBlaWdAYWx1bW5pLnV2LmVzKSwgXG5cbiAqKkFuZHJldSBFc3BhcnphKiogKGFuZXNpbWFyQGFsdW1uaS51di5lcykgeSBcblxuICoqTm9lbGlhIFPDoW5jaGV6KiogKG5vc2FuNUBhbHVtbmkudXYuZXMpIFxuXG4gVW5pdmVyc2l0YXQgZGUgVmFsw6huY2lhIg0KZGF0ZTogIkRpY2llbWJyZSBkZSAyMDIwIChhY3R1YWxpemFkbyBlbCBgciBmb3JtYXQoU3lzLnRpbWUoKSwgJyVkLSVtLSVZJylgKSINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDogDQogICAgc2VsZl9jb250YWluZWQ6IHllcw0KICAgIGNvZGVfZG93bmxvYWQ6IHRydWUNCiAgICBjb2RlX2ZvbGRpbmc6IHNob3cNCiAgICB0aGVtZTogdW5pdGVkDQogICAgaGlnaGxpZ2h0OiBweWdtZW50cw0KICAgIHRvYzogeWVzDQogICAgdG9jX2Zsb2F0Og0KICAgICAgY29sbGFwc2VkOiB5ZXMNCiAgICAgIHNtb290aF9zY3JvbGw6IHllcw0KICAgIGRmX3ByaW50OiBrYWJsZQ0KZWRpdG9yX29wdGlvbnM6IA0KICBjaHVua19vdXRwdXRfdHlwZTogY29uc29sZQ0KLS0tDQoNCmBgYHtyIHBhY2thZ2VzLXNldHVwLCBpbmNsdWRlID0gRkFMU0V9DQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCiMgcmVtb3Rlczo6aW5zdGFsbF9naXRodWIoInJsZXN1ci9rbGlwcHkiKQ0KbGlicmFyeShrbGlwcHkpIA0KbGlicmFyeShrbml0cikNCmBgYA0KDQoNCmBgYHtyIGNodW5rLXNldHVwLCBpbmNsdWRlID0gRkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUsIGV2YWwgPSBUUlVFLCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgDQogICAgICAgICAgICAgICAgICAgICAgI3Jlc3VsdHMgPSAiaG9sZCIsDQogICAgICAgICAgICAgICAgICAgICAgY2FjaGUgPSBGQUxTRSwgY2FjaGUucGF0aCA9ICIvY2FjaGVzLyIsIGNvbW1lbnQgPSAiIz4iLA0KICAgICAgICAgICAgICAgICAgICAgICNmaWcud2lkdGggPSA3LCAjZmlnLmhlaWdodD0gNywgICANCiAgICAgICAgICAgICAgICAgICAgICAjb3V0LndpZHRoID0gNywgb3V0LmhlaWdodCA9IDcsDQogICAgICAgICAgICAgICAgICAgICAgY29sbGFwc2UgPSBUUlVFLCAgZmlnLnNob3cgPSAiaG9sZCIsDQogICAgICAgICAgICAgICAgICAgICAgZmlnLmFzcCA9IDcvOSwgb3V0LndpZHRoID0gIjYwJSIsIGZpZy5hbGlnbiA9ICJjZW50ZXIiKQ0KIy0gcGFyYSBtZWpvcmFyIGxvcyBncsOhZmljb3MsIGJ1ZW5vIGVuIHJlYWxpZGFkIHBhcmEgcXVlIHNlIHZlYW4gaWd1YWwgZW4gZGlzdGludG9zIFNPDQojLSBodHRwczovL3d3dy5qdW1waW5ncml2ZXJzLmNvbS9ibG9nL3Ita25pdHItbWFya2Rvd24tcG5nLXBkZi1ncmFwaGljcy8NCmtuaXRyOjpvcHRzX2NodW5rJHNldChkZXYgPSAicG5nIiwgZGV2LmFyZ3MgPSBsaXN0KHR5cGUgPSAiY2Fpcm8tcG5nIikpDQpgYGANCg0KYGBge3Igb3B0aW9ucy1zZXR1cCwgaW5jbHVkZSA9IEZBTFNFfQ0Kb3B0aW9ucyhzY2lwZW4gPSA5OTkpICMtIHBhcmEgcXVpdGFyIGxhIG5vdGFjacOzbiBjaWVudMOtZmljYQ0Kb3B0aW9ucygieWFtbC5ldmFsLmV4cHIiID0gVFJVRSkgIy0gaHR0cHM6Ly9naXRodWIuY29tL3Zpa2luZy9yLXlhbWwvaXNzdWVzLzQ3ICAobG8gcHVzZSB4IGVsIHBiIGNvbiBlbCB3YXJuaW5nKSBFbiByZWFsaWRhZCBjcmVvIHF1ZSBtZWpvciBzZXLDrWEgcG9uZXJsbyBlbiBSUHJvZmlsZQ0KYGBgDQoNCg0KYGBge3Iga2xpcHB5LCBlY2hvID0gRkFMU0V9DQprbGlwcHk6OmtsaXBweShwb3NpdGlvbiA9IGMoInRvcCIsICJyaWdodCIpKSAjLSByZW1vdGVzOjppbnN0YWxsX2dpdGh1Yigicmxlc3VyL2tsaXBweSIpDQpgYGANCg0KPGRpdiBzdHlsZT0idGV4dC1hbGlnbjoganVzdGlmeSI+PGRpdi8+DQotLS0tLS0tLS0tLS0tLS0tLQ0KDQpUcmFiYWpvICBlbGFib3JhZG8gcGFyYSBsYSBhc2lnbmF0dXJhICJQcm9ncmFtYWNpw7NuIHkgbWFuZWpvIGRlIGRhdG9zIGVuIGxhIGVyYSBkZWwgQmlnIERhdGEiIGRlIGxhIFVuaXZlcnNpdGF0IGRlIFZhbMOobmNpYSBkdXJhbnRlIGVsIGN1cnNvIDIwMjAtMjAyMS4gTGEgcMOhZ2luYSB3ZWIgZGUgbGEgYXNpZ25hdHVyYSBwdWVkZSB2ZXJzZSBhcXXDrTogPGh0dHBzOi8vcGVyZXpwNDQuZ2l0aHViLmlvL2ludHJvLWRzLTIwLTIxLXdlYi8+LiBMb3MgdHJhYmFqb3MgZGUgbWlzIGNvbXBhw7Flcm9zIGRlIGN1cnNvIHB1ZWRlbiB2ZXJzZSBbYXF1w61dKGh0dHBzOi8vcGVyZXpwNDQuZ2l0aHViLmlvL2ludHJvLWRzLTIwLTIxLXdlYi8wNy10cmFiYWpvcy5odG1sKQ0KDQotLS0tLS0tLS0tLS0tLS0NCg0KIyMgMS4gSW50cm9kdWNjacOzbiANCg0KDQpFbiBsYSBhc2lnbmF0dXJhIGRlICJQcm9ncmFtYWNpw7NuIHkgbWFuZWpvIGRlIGRhdG9zIGVuIGxhIGVyYSBkZWwgQmlnIERhdGEiIFteMV0gdGVuZW1vcyBxdWUgaGFjZXIgdW4gdHJhYmFqbyBkZSB0ZW1hIGxpYnJlLCBwb3IgbG8gcXVlIG5vcyBwYXJlY2lhIGludGVyZXNhbnRlIGhhY2VybG8gZGUgdW4gdGVtYSBxdWUgbm9zIGFmZWN0YSBhIHRvZG9zLCBjb21vIGVzICoqbGEgZXZvbHVjacOzbiBkZSBsYSBwYW5kZW1pYSBkZSBsYSBDb3ZpZC0xOSoqIA0KDQpQb3IgZWxsbywgaGVtb3MgYnVzY2FkbyBkaWZlcmVudGVzIGNvbmp1bnRvcyBkZSBkYXRvcyBjb24gbG9zIHF1ZSBwb2RlciBoYWNlciBlbCBhbsOhbGlzaXMuIFkgYXPDrSwgbW9zdHJhciBkZSB1bmEgZm9ybWEgbcOhcyB2aXN1YWwgeSBzZW5jaWxsYSBkaWZlcmVudGVzIGN1ZXN0aW9uZXMgcXVlIG5vcyBwdWVkZW4gc3VyZ2lyIGFsIHBlbnNhciBlbiBsYSBDb3ZpZC0xOS4gQ29tbyBwb3IgZWplbXBsbywgcXVlIGluY2lkZW5jaWEgZGUgY29udGFnaW9zIGhhIGhhYmlkbyBkZXBlbmRpZW5kbyBkZSBsYSBwcm92w61uY2lhIG8gQ0NBQSwgZG9uZGUgc2UgaGFuIGhlY2hvIG3DoXMgcHJ1ZWJhcyBwY3IgbyB0ZXN0IGRlIGFjIG8gcXVlIHBhaXNlcyBoYW4gY29udHJvbGFkbyBtZWpvciBvIHBlb3IgbGEgcGFuZGVtw61hLCBlbnRyZSBvdHJhcyBjdWVzdGlvZW5lcy4gDQoNCiMjIDIuIENvbnRleHRvIG11bmRpYWwgZGUgbGEgQ292aWQtMTkgDQo8YnI+DQoNCiMjIyMgPEZPTlQgQ09MT1I9IkZGNEQwMCI+KipPUklHRU4gREVMIENPVklELTE5Kio8L0ZPTlQ+DQoNCkxhIENvdmlkLTE5IGVzIHVuYSBlbmZlcm1lZGFkICoqaW5mZWNjaW9zYSoqIGNhdXNhZGEgcG9yIHVuIGNvcm9uYXZpcnVzIHJlY2llbnRlbWVudGUgZGVzY3ViaWVydG8uIA0KDQpUdXZvIHN1IG9yaWdlbiBlbiBsYSBjaXVkYWQgZGUgV3VoYW4sIGVuIENoaW5hLiBZIGVsICoqcHJpbWVyIGNhc28qKiBkaWFnbm9zdGljYWRvIGZ1ZSBlbCAxNyBkZSBub3ZpZW1icmUgZGUgMjAxOS4gVG9kbyB5IHF1ZSBzZSBoYSBleHBhbmRpZG8gcmFwaWRhbWVudGUgcG9yIHRvZG8gZWwgbXVuZG8uDQoNCjxicj4NCg0KIyMjIyA8Rk9OVCBDT0xPUj0iRkY0RDAwIj4qKsK/UVXDiSBFUyBFTCBDT1JPTkFWSVJVUyoqPC9GT05UPg0KDQpMb3MgY29yb25hdmlydXMgc29uIHVuYSAqKnNlcmllIGRlIHZpcnVzKiogbGxhbWFkb3MgYXPDrSBwb3Igc3UgZm9ybWEuIEVzdG9zIG9yZ2FuaXNtb3Mgbm8gc29uIG51ZXZvcywgeWEgcXVlIGNvbnZpdmVuIGNvbiBlbCBzZXIgaHVtYW5vIGRlc2RlIHNpZW1wcmUuIEFkZW3DoXMsIGhheSBtdWNob3MgdGlwb3MgZGUgZWxsb3MsIHRhbnRvIGVuIGFuaW1hbGVzIGNvbW8gZW4gc2VyZXMgaHVtYW5vcy4NCg0KU2luIGVtYmFyZ28sIGVsIGFuw6FsaXNpcyBjb21wYXJhdGl2byBkZSBlc3RhIGVuZmVybWVkYWQgZGV0ZXJtaW7DsyBxdWUgZWwgU0FSUy1Db1YtMiBlcmEgbG8gc3VmaWNpZW50ZW1lbnRlIGRpc3RpbnRvIGRlIGxvcyBvdHJvcyBjb3JvbmF2aXJ1cyBkZSBncmF2ZWRhZCBkZXRlY3RhZG9zIGVuIGh1bWFub3MgKFNBUlMgeSBNRVJTKSBjb21vIHBhcmEgcXVlIGVzdGUgZnVlcmEgY29uc2RpZXJhZG8gdW5hIG51ZXZhIGVuZmVybWVkYWQsIHJlY2liaWVuZG8gZWwgbm9tYnJlIGRlICoqQ292aWQtMTkuKioNCg0KDQo8Y2VudGVyPjxpbWcgc3JjPSJpbWFnZW5lcy9jb3ZpZC5qcGciIHdpZHRoPSIzNTBweCIgLz48L2NlbnRlcj4NCg0KPGJyPg0KDQojIyMjIDxGT05UIENPTE9SPSJGRjREMDAiPioqwr9Dw5NNTyBTRSBQUk9QQUdBIEVMIENPVklELTE5PyoqPC9GT05UPg0KDQpFbCB2aXJ1cyBxdWUgY2F1c2EgbGEgQ292aWQtMTkgc2UgdHJhbnNtaXRlIHByaW5jaXBhbG1lbnRlIGEgdHJhdsOpcyBkZSBsYSBnb3TDrWN1bGFzIGdlbmVyYWRhcyBjdWFuZG8gdW5hIHBlcnNvbmEgaW5mZWN0YWRhICoqdG9zZSwgZXN0b3JudWRhIG8gZXNwaXJhLioqIFteMl0NCg0KRXN0YXMgZ290w61jdWxhcyBzb24gZGVtYXNpYWRvIHBlc2FkYXMgcGFyYSBwZXJtYW5lY2VyIHN1c3BlbmRpZGFzIGVuIGVsIGFpcmUgeSBjYWVuIHJhcGlkYW1lbnRlIHNvYnJlIGVsIHN1ZWxvIHkvbyBsYXMgc3VwZXJmw61jaWVzLCBjb252aWVydGllbmRvc2UgZXN0YXMgZW4gb3RyYSBmb3JtYSAgcG9zaWJsZSBkZSBjb250YWdpby4gDQoNCiMjIDMuIERhdG9zIHV0aWxpemFkb3MgcGFyYSBlbCB0cmFiYWpvLiB7LnRhYnNldH0NCg0KIyMjIDxGT05UIENPTE9SPSJGRjREMDAiPioqRGF0b3MqKjwvRk9OVD4NCg0KT2J0ZW5lciBsb3MgZGF0b3MgZXMgZnVuZGFtZW50YWwgcGFyYSBwb2RlciBoYWNlciBlbCBhbsOhbGlzaXMuDQoNClBvciBlbGxvLCBwYXJhIGVsIHByZXNlbnRlIHRyYWJham8gdXRpbGl6YXJlbW9zIGxvcyBkYXRvcyBxdWUgaGVtb3MgZXh0cmFpZG8gZW4gZGlmZXJlbnRlcyBww6FnaW5hcyB3ZWIsIHJlZmVyZW5jaWFkYXMgYWwgZmluYWwgZGVsIGluZm9ybWUgKGVuIFtSZWZlcmVuY2lhc10pLCB5IHF1ZSBoZW1vcyBtb2RpZmljYWRvIHBhcmEgcG9kZXIgaGFjZXIgZXN0ZSBhbsOhbGlzaXMuDQoNCkRlIG1hbmVyYSBxdWUsIGxvcyBkYXRvcyBtb2RpZmljYWRvIGFwYXJlY2VuIGVuIGxhIHBlc3Rhw7FhIFRpZHkuIEVzdG9zIGNvcnJlc3BvbmRlbiBhIGFxdWVsbG9zIHF1ZSBjb250aWVuZW4gaW5mb3JtYWNpw7NuIHNvYnJlIGxvcyBjb250YWdpYWRvcywgcmVjdXBlcmFkb3MgeSBmYWxsZWNpZG9zIGEgbml2ZWwgbXVuZGlhbCwgZXN0YXRhbCB5IGF1dG9uw7NtaWNvLiANCg0KQXPDrSBjb21vIG90cmFzIGNpZnJhcywgc29icmUgbGFzIGRpZmVyZW50ZXMgcHJ1ZWJhcyByZWFsaXphZGFzIChQQ1IncyB5IFRlc3QgcsOhcGlkb3MpLCBsYSBzYXR1cmFjacOzbiBkZWwgc2lzdGVtYSBzYW50aWFyaW8gZXNwYcOxb2wgeSBhbGd1bm9zIGVmZWN0b3MgZWNvbsOzbWljb3MgZGUgbGEgcGFuZGVtw61hLiANCg0KDQojIyMgPEZPTlQgQ09MT1I9IkZGNEQwMCI+KipUaWR5Kio8L0ZPTlQ+DQoNCkxhIGZpbmFsaWRhZCBkZSBlc3RlIGFwYXJ0YWRvIGVzIHBvbmVyIGxvcyBjw7NkaWdvIHF1ZSBoZW1vcyB1dGlsaXphZG8gcGFyYSAibGltcGlhciIgbG9zIGRhdG9zIHkgYSBwYXJ0aXIgZGUgbG9zIGN1YWxlcyBoZW1vcyBwb2RpZG8gaGFjZXIgZ3LDoWZpY29zLCBtYXBhcywgdGFibGFzLi4uDQoNCmBgYHtyfQ0KI1RJRFkgUEFSQSBFTCAiTVVORE8iLg0KDQpsaWJyYXJ5KHJpbykNCmxpYnJhcnkodGlkeXZlcnNlKQ0KDQp1cmxfbXVuZG8gPC0gImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9kYXRhc2V0cy9jb3ZpZC0xOS9tYXN0ZXIvZGF0YS90aW1lLXNlcmllcy0xOS1jb3ZpZC1jb21iaW5lZC5jc3YiDQoNCmRmX211bmRvIDwtIHJlYWRyOjpyZWFkX2Nzdih1cmxfbXVuZG8pDQoNCmRmX211bmRvIDwtIGRmX211bmRvICU+JSBzZWxlY3QoLSJQcm92aW5jZS9TdGF0ZSIpICU+JQ0KICAgICAgICAgICAgc2VwYXJhdGUoRGF0ZSwgYygiQcOxbyIsIk1lcyIsIkRpYSIpLCBzZXAgPSAiLSIpDQoNCmRmX211bmRvIDwtIGRmX211bmRvICAlPiUNCiAgICAgICAgICAgIHJlbG9jYXRlKCJDb3VudHJ5L1JlZ2lvbiIsIC5iZWZvcmU9QcOxbykgJT4lDQogICAgICAgICAgICByZWxvY2F0ZShBw7FvLCAuYmVmb3JlPUNvbmZpcm1lZCkNCg0KZGZfbXVuZG8gPC0gZGZfbXVuZG8gJT4lDQogICAgICAgICAgICByZWxvY2F0ZShNZXMsIC5hZnRlcj1EaWEpDQoNCiNBIGZlY2hhIGRlbCAwMS8xMjoNCg0KZGZfbXVuZG9fMTIgPC0gZGZfbXVuZG8gJT4lIGZpbHRlcihNZXMgPT0gIjEyIiAmIERpYSA9PSAiMDEiKQ0KZGZfbXVuZG9fMTIgPC0gZGZfbXVuZG9fMTIgJT4lIHNlbGVjdCgtRGVhdGhzKQ0KDQojUGFyYSB2ZXIgcXVlIGhheSBwYcOtc2VzIHF1ZSBzZSByZXBpdGVuIHkgaGFicsOhIHF1ZSBzdW1hciB0b2RvcyBsb3MgcXVlIHNlIHJlcGl0ZW46DQoNCmRmIDwtIGRmX211bmRvXzEyICU+JSBncm91cF9ieShgQ291bnRyeS9SZWdpb25gKSAlPiUgc3VtbWFyaXNlKE4gPSBuKCkpDQojUGHDrXNlcyBxdWUgc2UgcmVwaXRlbjogQXVzdHJhbGlhLCBDYW5hZGEsIENoaW5hLCBEZW5tYXJrLCBGcmFuY2UsIE5ldGhlcmxhbmRzLCBVbml0ZWQgS2luZ2RvbS4NCg0KZGZfYiA8LSBkZl9tdW5kb18xMiAlPiUgZmlsdGVyKCEoYENvdW50cnkvUmVnaW9uYCAlaW4lIGMoIkF1c3RyYWxpYSIsICJDYW5hZGEiLCAiQ2hpbmEiLCAiRGVubWFyayIsICJGcmFuY2UiLCAiTmV0aGVybGFuZHMiLCAiVW5pdGVkIEtpbmdkb20iKSkpDQoNCg0KI1BhcmEgQXVzdHJhbGlhOg0KZGZfQSA8LSBkZl9tdW5kb18xMiAlPiUgZmlsdGVyKGBDb3VudHJ5L1JlZ2lvbmAgJWluJSAiQXVzdHJhbGlhIikNCmRmX2NBIDwtIGRmX0EgJT4lIG11dGF0ZShDb25maXJtZWQgPSBzdW0oQ29uZmlybWVkKSkNCmRmX2NBIDwtIGRmX2NBICU+JSBtdXRhdGUoUmVjb3ZlcmVkID0gc3VtKFJlY292ZXJlZCkpDQpkZl9jQSA8LSBkZl9jQSAlPiUgc2xpY2UoMSkNCg0KI1BhcmEgQ2hpbmE6DQpkZl9DIDwtIGRmX211bmRvXzEyICU+JSBmaWx0ZXIoYENvdW50cnkvUmVnaW9uYCAlaW4lICJDaGluYSIpDQpkZl9jIDwtIGRmX0MgJT4lIG11dGF0ZShDb25maXJtZWQgPSBzdW0oQ29uZmlybWVkKSkNCmRmX2MgPC0gZGZfYyAlPiUgbXV0YXRlKFJlY292ZXJlZCA9IHN1bShSZWNvdmVyZWQpKQ0KZGZfYyA8LSBkZl9jICU+JSBzbGljZSgxKQ0KDQojUGFyYSBEZW5tYXJrOg0KZGZfRCA8LSBkZl9tdW5kb18xMiAlPiUgZmlsdGVyKGBDb3VudHJ5L1JlZ2lvbmAgJWluJSAiRGVubWFyayIpDQpkZl9kIDwtIGRmX0QgJT4lIG11dGF0ZShDb25maXJtZWQgPSBzdW0oQ29uZmlybWVkKSkNCmRmX2QgPC0gZGZfZCAlPiUgbXV0YXRlKFJlY292ZXJlZCA9IHN1bShSZWNvdmVyZWQpKQ0KZGZfZCA8LSBkZl9kICU+JSBzbGljZSgxKQ0KDQojUGFyYSBGcmFuY2U6DQpkZl9GIDwtIGRmX211bmRvXzEyICU+JSBmaWx0ZXIoYENvdW50cnkvUmVnaW9uYCAlaW4lICJGcmFuY2UiKQ0KZGZfZiA8LSBkZl9GICU+JSBtdXRhdGUoQ29uZmlybWVkID0gc3VtKENvbmZpcm1lZCkpDQpkZl9mIDwtIGRmX2YgJT4lIG11dGF0ZShSZWNvdmVyZWQgPSBzdW0oUmVjb3ZlcmVkKSkNCmRmX2YgPC0gZGZfZiAlPiUgc2xpY2UoMSkNCg0KI1BhcmEgTmV0aGVybGFuZHM6DQpkZl9OIDwtIGRmX211bmRvXzEyICU+JSBmaWx0ZXIoYENvdW50cnkvUmVnaW9uYCAlaW4lICJEZW5tYXJrIikNCmRmX24gPC0gZGZfTiAlPiUgbXV0YXRlKENvbmZpcm1lZCA9IHN1bShDb25maXJtZWQpKQ0KZGZfbiA8LSBkZl9uICU+JSBtdXRhdGUoUmVjb3ZlcmVkID0gc3VtKFJlY292ZXJlZCkpDQpkZl9uIDwtIGRmX24gJT4lIHNsaWNlKDEpDQoNCiNQYXJhIFVuaXRlZCBLaW5nZG9tOg0KZGZfVSA8LSBkZl9tdW5kb18xMiAlPiUgZmlsdGVyKGBDb3VudHJ5L1JlZ2lvbmAgJWluJSAiRGVubWFyayIpDQpkZl91IDwtIGRmX1UgJT4lIG11dGF0ZShDb25maXJtZWQgPSBzdW0oQ29uZmlybWVkKSkNCmRmX3UgPC0gZGZfdSAlPiUgbXV0YXRlKFJlY292ZXJlZCA9IHN1bShSZWNvdmVyZWQpKQ0KZGZfdSA8LSBkZl91ICU+JSBzbGljZSgxKQ0KDQoNCiNBaG9yYSB0ZW5nbyBxdWUganVudGFyIGxhcyB0YWJsYXM6DQp0YWJsYSA8LSBiaW5kX3Jvd3MoZGZfYiwgZGZfdSwgZGZfbiwgZGZfZiwgZGZfZCwgZGZfYywgZGZfY0EpDQpgYGANCg0KYGBge3J9DQojR3LDoWZpY29zIGRlIGxhIGV2b2x1Y2nDs24gZGVsIENvdmlkLTE5DQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCnVybF9tdW5kbyA8LSAiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2RhdGFzZXRzL2NvdmlkLTE5L21hc3Rlci9kYXRhL3RpbWUtc2VyaWVzLTE5LWNvdmlkLWNvbWJpbmVkLmNzdiINCg0KZGZfbXVuZG8gPC0gcmVhZHI6OnJlYWRfY3N2KHVybF9tdW5kbykNCg0KZGZfbXVuZG8gPC0gZGZfbXVuZG8gJT4lIHNlbGVjdCgtIlByb3ZpbmNlL1N0YXRlIikgJT4lDQogICAgICAgICAgICBzZXBhcmF0ZShEYXRlLCBjKCJBw7FvIiwiTWVzIiwiRGlhIiksIHNlcCA9ICItIikNCg0KZGZfbXVuZG8gPC0gZGZfbXVuZG8gICU+JQ0KICAgICAgICAgICAgcmVsb2NhdGUoIkNvdW50cnkvUmVnaW9uIiwgLmJlZm9yZT1Bw7FvKSAlPiUNCiAgICAgICAgICAgIHJlbG9jYXRlKEHDsW8sIC5iZWZvcmU9Q29uZmlybWVkKQ0KDQpkZl9tdW5kbyA8LSBkZl9tdW5kbyAlPiUNCiAgICAgICAgICAgIHJlbG9jYXRlKE1lcywgLmFmdGVyPURpYSkNCmBgYA0KDQpgYGB7cn0NCiNFc3RvcyBkYXRvcyBtdWVzdHJhbiBlbCBuw7ptZXJvIGRlIG11ZXJ0ZXMgZGlhcmlhcyBlbiBlbCBtdW5kbywgbG9zIGhlbW9zIGFycmVnbGFkbyBwYXJhIHBvZGVyIGhhY2VyIHVuIGZhY2V0X3dyYXAgY29uIGxvcyBkaWZlcmVudGVzIG1lc2VzIHkgbGEgZXZvbHVjacOzbiBkZSBlc3RvcyBzZWfDum4gbG9zIGRpYXMuIA0KbGlicmFyeSh0aWR5dmVyc2UpDQoNCiNQYXJhIGxhIHRhYmxhIGRlIG11ZXJ0ZXNfZGlhIGhhY2Vtb3MsIHNlcGFyYW1vcyBwb3IgZMOtYSB5IG1lcy4gWSBmaWx0cmFyIGxhcyBmZWNoYXMgaGFzdGEgZGVzIGRlIGxhcyBwcmltZXJhcyBkaXNwb25pYmxlcyBoYXN0YSBlbCAzMSBkZSBvY3R1YnJlLg0KDQpsaWJyYXJ5KGx1YnJpZGF0ZSkNCg0KbXVlcnRlc19kaWEgPC0gcmlvOjppbXBvcnQoaGVyZTo6aGVyZSgiZGF0b3MiLCAibXVlcnRlc19kaWEueGxzeCIpKQ0KDQptdWVydGVzX2RpYSA8LSBtdWVydGVzX2RpYSAlPiUgbXV0YXRlKERpYT0gZGF5KERhdGUpKSAlPiUgbXV0YXRlKE1lcz0gbW9udGgoRGF0ZSkpICAlPiUNCmZpbHRlcighTWVzID09ICIxMSIpICAlPiUgc2VsZWN0KCFEYXRlKQ0KDQptdWVydGVzX2RpYSA8LSBtdWVydGVzX2RpYSAlPiUgbXV0YXRlKE1lcyA9IGNhc2Vfd2hlbigNCiAgTWVzID09IDEgfiAiRW5lcm8iLA0KICBNZXMgPT0gMiB+ICJGZWJyZXJvIiwNCiAgTWVzID09IDMgfiAiTWFyem8iLA0KICBNZXMgPT0gNCB+ICJBYnJpbCIsDQogIE1lcyA9PSA1IH4gIk1heW8iLA0KICBNZXMgPT0gNiB+ICJKdW5pbyIsDQogIE1lcyA9PSA3IH4gIkp1bGlvIiwNCiAgTWVzID09IDggfiAiQWdvc3RvIiwNCiAgTWVzID09IDkgfiAiU2VwdGllbWJyZSIsDQogIE1lcyA9PSAxMCB+ICJPY3R1YnJlIiwNCikpDQoNCm11ZXJ0ZXNfZGlhJGZhY2V0ID0gZmFjdG9yKG11ZXJ0ZXNfZGlhJE1lcywgbGV2ZWxzID0gYygiRW5lcm8iLCJGZWJyZXJvIiwiTWFyem8iLCAiQWJyaWwiLCJNYXlvIiwiSnVuaW8iLCJKdWxpbyIsIkFnb3N0byIsIlNlcHRpZW1icmUiLCJPY3R1YnJlIikpDQpgYGANCg0KYGBge3J9DQojRGF0b3NfQ0NBQQ0KdXJsYSA8LSJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vZGF0YWRpc3RhL2RhdGFzZXRzL21hc3Rlci9DT1ZJRCUyMDE5L2NjYWFfaW5ncmVzb3NfY2FtYXNfY29udmVuY2lvbmFsZXNfdWNpLmNzdiINCmFhYSA8LSByaW86OmltcG9ydCh1cmxhKQ0KDQojSGF5IHF1ZSB0ZW5lciBlbiBjdWVudGEgcXVlIGxhIHZhcmlhYmxlICUgQ2FtYXMgT2N1cGFkYXMgVUNJIENvdmlkIG5vIHRpZW5lIGRhdG9zIGhhc3RhIGVsIDIxLTA5LTIwMjAgcG9yIGxvIHRhbnRvIHBhcmEgYW5hbGl6YXIgbGEgc2VndW5kYSBPTEEgc2kgcXVlIG5vcyBzaXJ2ZSBwZXJvIG5vIHBhcmEgbGEgcHJpbWVyYQ0KbGlicmFyeSh0aWR5dmVyc2UpDQoNCg0KZGF0b3NfQ0NBQSA8LSBhYWEgJT4lDQogIHNlcGFyYXRlKEZlY2hhLCBjKCJBw7FvIiwiTWVzIiwiRGlhIiksIHNlcCA9ICItIikgJT4lDQogIHNlbGVjdCgtQ0NBQSkgJT4lIG11dGF0ZShDQ0FBID0gY2FzZV93aGVuKA0KICBjb2RfaW5lID09IDAgfiAiRXNwYcOxYSIsDQogIGNvZF9pbmUgPT0gMSB+ICJBbmRhbHVjaWEiLA0KICBjb2RfaW5lID09IDIgfiAiQXJhZ29uIiwNCiAgY29kX2luZSA9PSAzIH4gIkFzdHVyaWFzIiwNCiAgY29kX2luZSA9PSA0IH4gIklzbGFzIEJhbGVhcmVzIiwNCiAgY29kX2luZSA9PSA1IH4gIkNhbmFyaWFzIiwNCiAgY29kX2luZSA9PSA2IH4gIkNhbnRhYnJpYSIsDQogIGNvZF9pbmUgPT0gNyB+ICJDYXN0aWxsYSBMZW9uIiwNCiAgY29kX2luZSA9PSA4IH4gIkNhc3RpbGxhIExhIE1hbmNoYSIsDQogIGNvZF9pbmUgPT0gOSB+ICJDYXRhbHXDsWEiLA0KICBjb2RfaW5lID09IDEwIH4gIkNvbS5WYWxlbmNpYW5hIiwNCiAgY29kX2luZSA9PSAxMSB+ICJFeHRyZW1hZHVyYSIsDQogIGNvZF9pbmUgPT0gMTIgfiAiR2FsaWNpYSIsDQogIGNvZF9pbmUgPT0gMTMgfiAiTWFkcmlkIiwNCiAgY29kX2luZSA9PSAxNCB+ICJNdXJjaWEiLA0KICBjb2RfaW5lID09IDE1IH4gIk5hdmFycmEiLA0KICBjb2RfaW5lID09IDE2IH4gIlBhaXMgVmFzY28iLA0KICBjb2RfaW5lID09IDE3IH4gIkxhIFJpb2phIiwNCiAgY29kX2luZSA9PSAxOCB+ICJDZXV0YSIsDQogIGNvZF9pbmUgPT0gMTkgfiAiTWVsaWxsYSIsDQopKSAlPiUgcmVsb2NhdGUoQ0NBQSwgLmFmdGVyPWNvZF9pbmUpDQoNCmRhdG9zX0NDQUEgPC0gZGF0b3NfQ0NBQSAlPiUgcmVuYW1lKCJJbmdyZXNvcyBVbHQuMjRoIiA9ICJJbmdyZXNvcyBDT1ZJRCDDg8K6bHRpbWFzIDI0IGgiKSAlPiUgcmVuYW1lKCJBbHRhcyBVbHQyNGgiID0gIkFsdGFzIENPVklEIMODwrpsdGltYXMgMjQgaCIpDQpgYGANCg0KYGBge3IgcHJ1ZWJhc19DQ0FBfQ0KbGlicmFyeShyaW8pDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCiNsaW5rOiBodHRwczovL2dpdGh1Yi5jb20vZGF0YWRpc3RhL2RhdGFzZXRzL2Jsb2IvbWFzdGVyL0NPVklEJTIwMTkvY2NhYV9jb3ZpZDE5X3Rlc3RfcmVhbGl6YWRvcy5jc3YNCg0KZGZwIDwtIHJpbzo6aW1wb3J0KGhlcmU6OmhlcmUoImRhdG9zIiwgImRhdG9zX3BydWViYXMueGxzeCIpKQ0KDQpkZmEgPC1kZnAgJT4lDQogIHNlcGFyYXRlKEZlY2hhLCBjKCJhw7FvIiwibWVzIiwiZGlhIiksIHNlcCA9ICItIikgJT4lICAgICAgICAgICAgICAgICByZWxvY2F0ZShhw7FvLCAuYWZ0ZXI9ZGlhKSAlPiUNCiAgcmVsb2NhdGUoZGlhLCAuYmVmb3JlID1tZXMpICU+JSBzZWxlY3QoIU9UUk9TX1RFU1RTKSAlPiUgc2VsZWN0KCFPVFJPU19URVNUU194XzEwMDBoYWIuKQ0KDQpkZkNDQUEgPC0gZGZhICU+JSBmaWx0ZXIoQ0NBQSAhPSAiRXNwYcOxYSIpDQoNCiNFeHBvcnRvIGxvcyBkYXRvcyBwYXJhIHBvZGVyIGVtcGV6YXIgZWwgYW7DoWxpc2lzIGRlc2RlIGFxdcOtLg0KI3Jpbzo6ZXhwb3J0KGRmQ0NBQSwgaGVyZTo6aGVyZSgiZGF0b3MiLCAiZGZDQ0FBLmNzdiIpKQ0KDQpkZkNDQUEgPC0gcmlvOjppbXBvcnQoaGVyZTo6aGVyZSgiZGF0b3MiLCAiZGZDQ0FBLmNzdiIpKQ0KDQpkZkNDQUEgPC0gZGZDQ0FBICU+JSBzZWxlY3QoIUNDQUEpDQpkZkNDQUEgPC0gZGZDQ0FBICU+JSBtdXRhdGUoQ0NBQSA9IGNhc2Vfd2hlbigNCiAgY29kX2luZSA9PSAxIH4gIkFuZGFsdWNpYSIsDQogIGNvZF9pbmUgPT0gMiB+ICJBcmFnb24iLA0KICBjb2RfaW5lID09IDMgfiAiQXN0dXJpYXMiLA0KICBjb2RfaW5lID09IDQgfiAiSS5CYWxlYXJlcyIsDQogIGNvZF9pbmUgPT0gNSB+ICJDYW5hcmlhcyIsDQogIGNvZF9pbmUgPT0gNiB+ICJDYW50YWJyaWEiLA0KICBjb2RfaW5lID09IDcgfiAiQ2FzdGlsbGEgTGVvbiIsDQogIGNvZF9pbmUgPT0gOCB+ICJDYXN0aWxsYSBMYSBNYW5jaGEiLA0KICBjb2RfaW5lID09IDkgfiAiQ2F0YWx1w7FhIiwNCiAgY29kX2luZSA9PSAxMCB+ICJDLlZhbGVuY2lhbmEiLA0KICBjb2RfaW5lID09IDExIH4gIkV4dHJlbWFkdXJhIiwNCiAgY29kX2luZSA9PSAxMiB+ICJHYWxpY2lhIiwNCiAgY29kX2luZSA9PSAxMyB+ICJNYWRyaWQiLA0KICBjb2RfaW5lID09IDE0IH4gIk11cmNpYSIsDQogIGNvZF9pbmUgPT0gMTUgfiAiTmF2YXJyYSIsDQogIGNvZF9pbmUgPT0gMTYgfiAiUGFpcyBWYXNjbyIsDQogIGNvZF9pbmUgPT0gMTcgfiAiTGEgUmlvamEiLA0KICBjb2RfaW5lID09IDE4IH4gIkNldXRhIiwNCiAgY29kX2luZSA9PSAxOSB+ICJNZWxpbGxhIiwNCikpICU+JSByZWxvY2F0ZShDQ0FBLCAuYWZ0ZXI9Y29kX2luZSkNCmBgYA0KYGBge3IgUFJPVklOQ0lBU30NCmxpYnJhcnkocmlvKQ0KbGlicmFyeSh0aWR5dmVyc2UpDQoNCmRmUFJPViA8LSByaW86OmltcG9ydChoZXJlOjpoZXJlKCJkYXRvcyIsICJkZlRyZWwuY3N2IikpDQoNCmRmUFJPViA8LSBtdXRhdGUoZGZQUk9WICU+JSBtdXRhdGUoQ29kID0gY2FzZV93aGVuKA0KICAgICBwcm92aW5jaWEgPT0gIkFsYXZhIiB+ICIwMSIsDQogICAgIHByb3ZpbmNpYSA9PSAiQWxiYWNldGUiIH4gIjAyIiwNCiAgICAgcHJvdmluY2lhID09ICJBbGljYW50ZSIgfiAiMDMiLA0KICAgICBwcm92aW5jaWEgPT0gIkFsbWVyaWEiIH4gIjA0IiwNCiAgICAgcHJvdmluY2lhID09ICJBdmlsYSIgfiAiMDUiLA0KICAgICBwcm92aW5jaWEgPT0gIkJhZGFqb3oiIH4gIjA2IiwNCiAgICAgcHJvdmluY2lhID09ICJJc2xhcyBCYWxlYXJlcyIgfiAiMDciLA0KICAgICBwcm92aW5jaWEgPT0gIkJhcmNlbG9uYSIgfiAiMDgiLA0KICAgICBwcm92aW5jaWEgPT0gIkJ1cmdvcyIgfiAiMDkiLA0KICAgICBwcm92aW5jaWEgPT0gIkNhY2VyZXMiIH4gIjEwIiwNCiAgICAgcHJvdmluY2lhID09ICJDYWRpeiIgfiAiMTEiLA0KICAgICBwcm92aW5jaWEgPT0gIkNhc3RlbGxvbiIgfiAiMTIiLA0KICAgICBwcm92aW5jaWEgPT0gIkNpdWRhZCBSZWFsIiB+ICIxMyIsDQogICAgIHByb3ZpbmNpYSA9PSAiQ29yZG9iYSIgfiAiMTQiLA0KICAgICBwcm92aW5jaWEgPT0gIkEgQ29ydcOxYSIgfiAiMTUiLA0KICAgICBwcm92aW5jaWEgPT0gIkN1ZW5jYSIgfiAiMTYiLA0KICAgICBwcm92aW5jaWEgPT0gIkdpcm9uYSIgfiAiMTciLA0KICAgICBwcm92aW5jaWEgPT0gIkdyYW5hZGEiIH4gIjE4IiwNCiAgICAgcHJvdmluY2lhID09ICJHdWFkYWxhamFyYSIgfiAiMTkiLA0KICAgICBwcm92aW5jaWEgPT0gIkd1aXB1emNvYSIgfiAiMjAiLA0KICAgICBwcm92aW5jaWEgPT0gIkh1ZWx2YSIgfiAiMjEiLA0KICAgICBwcm92aW5jaWEgPT0gIkh1ZXNjYSIgfiAiMjIiLA0KICAgICBwcm92aW5jaWEgPT0gIkphZW4iIH4gIjIzIiwNCiAgICAgcHJvdmluY2lhID09ICJMZW9uIiB+ICIyNCIsDQogICAgIHByb3ZpbmNpYSA9PSAiTGxlaWRhIiB+ICIyNSIsDQogICAgIHByb3ZpbmNpYSA9PSAiTGEgUmlvamEiIH4gIjI2IiwNCiAgICAgcHJvdmluY2lhID09ICJMdWdvIiB+ICIyNyIsDQogICAgIHByb3ZpbmNpYSA9PSAiTWFkcmlkIiB+ICIyOCIsDQogICAgIHByb3ZpbmNpYSA9PSAiTWFsYWdhIiB+ICIyOSIsDQogICAgIHByb3ZpbmNpYSA9PSAiTXVyY2lhIiB+ICIzMCIsDQogICAgIHByb3ZpbmNpYSA9PSAiTmF2YXJyYSIgfiAiMzEiLA0KICAgICBwcm92aW5jaWEgPT0gIk91cmVuc2UiIH4gIjMyIiwNCiAgICAgcHJvdmluY2lhID09ICJBc3R1cmlhcyIgfiAiMzMiLA0KICAgICBwcm92aW5jaWEgPT0gIlBhbGVuY2lhIiB+ICIzNCIsDQogICAgIHByb3ZpbmNpYSA9PSAiTGFzIFBhbG1hcyIgfiAiMzUiLA0KICAgICBwcm92aW5jaWEgPT0gIlBvbnRldmVkcmEiIH4gIjM2IiwNCiAgICAgcHJvdmluY2lhID09ICJTYWxhbWFuY2EiIH4gIjM3IiwNCiAgICAgcHJvdmluY2lhID09ICJUZW5lcmlmZSIgfiAiMzgiLA0KICAgICBwcm92aW5jaWEgPT0gIkNhbnRhYnJpYSIgfiAiMzkiLA0KICAgICBwcm92aW5jaWEgPT0gIlNlZ292aWEiIH4gIjQwIiwNCiAgICAgcHJvdmluY2lhID09ICJTZXZpbGxhIiB+ICI0MSIsDQogICAgIHByb3ZpbmNpYSA9PSAiU29yaWEiIH4gIjQyIiwNCiAgICAgcHJvdmluY2lhID09ICJUYXJyYWdvbmEiIH4gIjQzIiwNCiAgICAgcHJvdmluY2lhID09ICJUZXJ1ZWwiIH4gIjQ0IiwNCiAgICAgcHJvdmluY2lhID09ICJUb2xlZG8iIH4gIjQ1IiwNCiAgICAgcHJvdmluY2lhID09ICJWYWxlbmNpYSIgfiAiNDYiLA0KICAgICBwcm92aW5jaWEgPT0gIlZhbGxhZG9saWQiIH4gIjQ3IiwNCiAgICAgcHJvdmluY2lhID09ICJCaXprYWlhIiB+ICI0OCIsDQogICAgIHByb3ZpbmNpYSA9PSAiWmFtb3JhIiB+ICI0OSIsDQogICAgIHByb3ZpbmNpYSA9PSAiWmFyYWdvemEiIH4gIjUwIiwNCiAgICAgcHJvdmluY2lhID09ICJDZXV0YSIgfiAiNTEiLA0KICAgICBwcm92aW5jaWEgPT0gIk1lbGlsbGEiIH4gIjUyIikpKQ0KDQpkZlBST1YgPC0gZGZQUk9WICU+JSBzZWxlY3QocHJvdmluY2lhLCBDb2QsIFBvYmxhY2lvbiwgVG90YWwsIFRvdGFseGNhcCkgJT4lIGFycmFuZ2UoQ29kKQ0KYGBgDQoNCmBgYHtyfQ0KI1ByZXBhcmFuZG8gbG9zIGRhdG9zIHBhcmEgZWwgYW7DoWxpc2lzIGRlIGxhcyBwcm92aW5jaWFzDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCg0KZGZfcHJvdiA8LSByaW86OmltcG9ydChoZXJlOjpoZXJlKCJkYXRvcyIsICJkYXRvc19wcm92aW5jaWFzLmNzdiIpKQ0KDQpkZl9wcm92IDwtIGRmX3Byb3YgJT4lIHNlcGFyYXRlKGZlY2hhLCBjKCJkaWEiLCJtZXMiLCJhw7FvIiksIHNlcCA9ICItLSIpDQoNCmRmX3Byb3YgPC0gZGZfcHJvdiAlPiUgc2VsZWN0KHByb3ZpbmNpYV9pc28sIHByb3ZpbmNpYSwgZGlhLCBtZXMsIGHDsW8sIG51bV9jYXNvcykNCg0KbGlicmFyeShyaW8pDQoNCnJpbzo6ZXhwb3J0KGRmX3Byb3YsIGhlcmU6OmhlcmUoImRhdG9zIiwgImRhdG9zX3Byb3ZpbmNpYXNvay5jc3YiKSkNCg0KZGYgPC0gcmlvOjppbXBvcnQoaGVyZTo6aGVyZSgiZGF0b3MiLCAiZGF0b3NfcHJvdmluY2lhc29rLmNzdiIpKQ0KDQpkZmcgPC0gZGYgJT4lIHNlbGVjdCgtcHJvdmluY2lhX2lzbykgJT4lIHNlbGVjdCgtYcOxbykNCg0KZGZoYWIgPC0gcmlvOjppbXBvcnQoaGVyZTo6aGVyZSgiZGF0b3MiLCAiZXhjZWxfaGFiX3Byb3YueGxzeCIpKQ0KDQp0YWJsYSA8LSBmdWxsX2pvaW4oZGZnLCBkZmhhYiwgYnkgPSBjKCJwcm92aW5jaWEiID0gIlByb3ZpbmNpYSIpKQ0KDQpkZmdnIDwtIHRhYmxhICU+JSBncm91cF9ieShwcm92aW5jaWEsIG1lcywgUG9ibGFjaW9uKSAlPiUgc3VtbWFyaXNlKE51bSA9IHN1bShudW1fY2Fzb3MpKQ0KDQpkZmdnIDwtIGRmZ2cgJT4lIHNlbGVjdChwcm92aW5jaWEsIFBvYmxhY2lvbiwgbWVzLCBOdW0pDQoNCg0KZGZyZWwgPC0gZGZnZyAlPiUgbXV0YXRlKFRvdGFsX2NhcCA9IChOdW0vUG9ibGFjaW9uKSkNCmRmVCA8LSBkZmdnICU+JSBncm91cF9ieShwcm92aW5jaWEsIFBvYmxhY2lvbikgJT4lIHN1bW1hcmlzZShUb3RhbCA9IHN1bShtZXMsIE51bSkpDQoNCmRmVHJlbCA8LSBkZlQgJT4lIG11dGF0ZShUb3RhbHhjYXAgPSAoVG90YWwvUG9ibGFjaW9uKSkNCg0KdW5pcXVlKGRmVHJlbCRwcm92aW5jaWEpDQpkZlRyZWwkcHJvdmluY2lhIDwtIGdzdWIoIlNhbnRhIENydXogZGUgVGVuZXJpZmUiLCAiVGVuZXJpZmUiLGRmVHJlbCRwcm92aW5jaWEpDQoNCnJpbzo6ZXhwb3J0KGRmVHJlbCwgaGVyZTo6aGVyZSgiZGF0b3MiLCAiZGZUcmVsLmNzdiIpKQ0KYGBgDQoNCg0KIyMgIDQuIEVzdHVkaW8gc29icmUgbG9zICoqRGF0b3MgZGVsIE1VTkRPKioNCg0KIyMjIDQuMSBQcmVndW50YXMgeSByZXNwdWVzdGFzIGRlIGxhIHNpdHVhY2nDs24gYWN0dWFsLg0KDQpgYGB7cn0NCmRmIDwtIHJpbzo6aW1wb3J0KGhlcmU6OmhlcmUoImRhdG9zIiwgInRhYmxhX211bmRvLmNzdiIpKQ0KDQojQ29uIGVzdG8gcG9kZW1vcyBoYWNlciB1bmFzIHRhYmxhcy4NCg0KZGZtYXgxIDwtIGRmICU+JSBzbGljZV9tYXgoQ29uZmlybWVkLCBuPTEpICNFc3RhZG9zIFVuaWRvcyBlcyBlbCBwYcOtcyBjb24gbcOhcyBjb250YWdpb3MuDQoNCmRmbWF4MiA8LSBkZiAlPiUgc2xpY2VfbWF4KFJlY292ZXJlZCwgbj0xKSAjRWwgbcOheGltbyBkZSByZWN1cGVyYWRvcyBlc3TDoSBlbiBJbmRpYS4NCg0KZGZfbWluMSA8LSBkZiAlPiUgc2xpY2VfbWluKENvbmZpcm1lZCwgbj0xKSAjRWwgcGHDrXMgY29uIG1lbm9zIGNvbnRhZ2lvcyBlcyBWYW51YXR1IChlcyB1biBwYcOtcyBPY2VhbmlhKQ0KDQpgYGANCg0KYGBge3J9DQojVEFCTEEgUEFSQSBFTCBQQcONUyBDT04gTUVOT1MgQ09OQVRHSU9TLg0KDQpJbWFnZW4gPC0gImh0dHA6Ly9iYW5kZXJhc211bmRvLmVzL3dwLWNvbnRlbnQvdXBsb2Fkcy8yMDE3LzA5L3ZhbnVhdHUucG5nIg0KDQpkZl9taW4xIDwtIGRmX21pbjEgJT4lIGFkZF9jb2x1bW4oSW1hZ2VuKQ0KZGZfbWluMSA8LSBkZl9taW4xICU+JSBzZWxlY3QoLWMoRGlhLCBNZXMsIEHDsW8pKQ0KDQpsaWJyYXJ5KGd0KQ0KVGFibGFfUG1lbmNvdGFnIDwtIGRmX21pbjEgJT4lIGd0KCkNCg0KVGFibGFfUG1lbmNvdGFnIDwtIFRhYmxhX1BtZW5jb3RhZyAlPiUNCiAgICAgICAgICAgICAgICAgICB0YWJfaGVhZGVyKHRpdGxlID0gbWQoIioqUGHDrXMgY29uIG1lbm9zIGNvbnRhZ2lvcyBkZSBDb3ZpZC0xOSoqIiksc3VidGl0bGUgPSBtZCgiQSBmZWNoYTogMS8xMi8yMDIwIikpDQoNClRhYmxhX1BtZW5jb3RhZyA8LSBUYWJsYV9QbWVuY290YWcgJT4lDQogICAgICAgICAgICAgICAgdGFiX29wdGlvbnMoaGVhZGluZy5iYWNrZ3JvdW5kLmNvbG9yID0gImNvcmFsIikgJT4lIHRhYl9vcHRpb25zKGhlYWRpbmcudGl0bGUuZm9udC5zaXplID0gMTUsIGhlYWRpbmcuc3VidGl0bGUuZm9udC5zaXplID0gMTMsICBjb2x1bW5fbGFiZWxzLmZvbnQud2VpZ2h0ID0gICJib2xkIikNCg0KDQpUYWJsYV9QbWVuY290YWcgPC0gVGFibGFfUG1lbmNvdGFnICAlPiUNCiAgZ3Q6OnRleHRfdHJhbnNmb3JtKGxvY2F0aW9ucyA9IGNlbGxzX2JvZHkoY29sdW1ucyA9IHZhcnMoSW1hZ2VuKSksIGZuID0gZnVuY3Rpb24oeCkge2d0Ojp3ZWJfaW1hZ2UoeCwgaGVpZ2h0ID0gNTApfSkgJT4lICBjb2xzX2FsaWduKA0KICAgIGFsaWduID0gImNlbnRlciIpDQoNCiNMbyBtaXNtbyBoYWNlbW9zIHBhcmEgbGFzIG90cmFzIHRyZXMgdGFibGFzDQpgYGANCg0KYGBge3IgZWNobz1GQUxTRSwgZXZhbD1UUlVFfQ0KDQojVEFCTEEgUEFSQSBFTCBQQcONUyBDT04gTcOBUyBDT05UQUdJT1M6DQoNCg0KSW1hZ2VuVVMgPC0gImh0dHBzOi8vdXBsb2FkLndpa2ltZWRpYS5vcmcvd2lraXBlZGlhL2NvbW1vbnMvYS9hNC9GbGFnX29mX3RoZV9Vbml0ZWRfU3RhdGVzLnN2ZyINCg0KZGZtYXgxIDwtIGRmbWF4MSAlPiUgYWRkX2NvbHVtbihJbWFnZW5VUykNCmRmbWF4MSA8LSBkZm1heDEgJT4lIHNlbGVjdCgtYyhEaWEsIE1lcywgQcOxbykpDQoNCmxpYnJhcnkoZ3QpDQpUYWJsYV9QbWFzY290YWcgPC0gZGZtYXgxICU+JSBndCgpDQoNClRhYmxhX1BtYXNjb3RhZyA8LSBUYWJsYV9QbWFzY290YWcgJT4lDQogICAgICAgICAgICAgICAgICAgdGFiX2hlYWRlcih0aXRsZSA9IG1kKCIqKlBhw61zIGNvbiBtw6FzIGNvbnRhZ2lvcyBkZSBDb3ZpZC0xOSoqIiksc3VidGl0bGUgPSBtZCgiQSBmZWNoYTogMS8xMi8yMDIwIikpDQoNClRhYmxhX1BtYXNjb3RhZyA8LSBUYWJsYV9QbWFzY290YWcgJT4lDQogICAgICAgICAgICAgICAgdGFiX29wdGlvbnMoaGVhZGluZy5iYWNrZ3JvdW5kLmNvbG9yID0gImNvcmFsIikgJT4lIHRhYl9vcHRpb25zKGhlYWRpbmcudGl0bGUuZm9udC5zaXplID0gMTUsIGhlYWRpbmcuc3VidGl0bGUuZm9udC5zaXplID0gMTMsICBjb2x1bW5fbGFiZWxzLmZvbnQud2VpZ2h0ID0gICJib2xkIikNCg0KDQpUYWJsYV9QbWFzY290YWcgPC0gVGFibGFfUG1hc2NvdGFnICAlPiUNCiAgZ3Q6OnRleHRfdHJhbnNmb3JtKGxvY2F0aW9ucyA9IGNlbGxzX2JvZHkoY29sdW1ucyA9IHZhcnMoSW1hZ2VuVVMpKSwgZm4gPSBmdW5jdGlvbih4KSB7Z3Q6OndlYl9pbWFnZSh4LCBoZWlnaHQgPSA1MCl9KSAlPiUgIGNvbHNfYWxpZ24oDQogICAgYWxpZ24gPSAiY2VudGVyIikNCg0KI1BBw41TIENPTiBNw4FTIFJFQ1VQRVJBRE9TIERFIENPVklELTE5DQoNCkltYWdlbkkgPC0gImh0dHBzOi8vd3d3LmJhbmRlcmFzLW11bmRvLmVzL2RhdGEvZmxhZ3MvdzU4MC9pbi5wbmciDQoNCmRmbWF4MiA8LSBkZm1heDIgJT4lIGFkZF9jb2x1bW4oSW1hZ2VuSSkNCmRmbWF4MiA8LSBkZm1heDIgJT4lIHNlbGVjdCgtYyhEaWEsIE1lcywgQcOxbykpDQoNCg0KbGlicmFyeShndCkNClRhYmxhX1BtYXNyZWN1IDwtIGRmbWF4MiAlPiUgZ3QoKQ0KDQoNClRhYmxhX1BtYXNyZWN1IDwtIFRhYmxhX1BtYXNyZWN1ICU+JQ0KICAgICAgICAgICAgICAgICAgIHRhYl9oZWFkZXIodGl0bGUgPSBtZCgiKipQYcOtcyBjb24gbcOhcyByZWN1cGVyYWRvcyBkZSBDb3ZpZC0xOSoqIiksc3VidGl0bGUgPSBtZCgiQSBmZWNoYTogMS8xMi8yMDIwIikpDQoNClRhYmxhX1BtYXNyZWN1IDwtIFRhYmxhX1BtYXNyZWN1ICU+JQ0KICAgICAgICAgICAgICAgIHRhYl9vcHRpb25zKGhlYWRpbmcuYmFja2dyb3VuZC5jb2xvciA9ICJjb3JhbCIpICU+JSB0YWJfb3B0aW9ucyhoZWFkaW5nLnRpdGxlLmZvbnQuc2l6ZSA9IDE1LCBoZWFkaW5nLnN1YnRpdGxlLmZvbnQuc2l6ZSA9IDEzLCAgY29sdW1uX2xhYmVscy5mb250LndlaWdodCA9ICAiYm9sZCIpDQoNCg0KVGFibGFfUG1hc3JlY3UgPC0gVGFibGFfUG1hc3JlY3UgICU+JQ0KICBndDo6dGV4dF90cmFuc2Zvcm0obG9jYXRpb25zID0gY2VsbHNfYm9keShjb2x1bW5zID0gdmFycyhJbWFnZW5JKSksIGZuID0gZnVuY3Rpb24oeCkge2d0Ojp3ZWJfaW1hZ2UoeCwgaGVpZ2h0ID0gNTApfSkgJT4lICBjb2xzX2FsaWduKA0KICAgIGFsaWduID0gImNlbnRlciIpDQpgYGANCg0KDQo8YnI+DQo8Y2VudGVyPjxGT05UIENPTE9SPSJCbHVlIj4qKsK/Q1XDgUwgRVMgRUwgUEHDjVMgQ09OIE3DgVMgUEVSU09OQVMgQ09OVEFHSUFEQVM/Kio8L0ZPTlQ+PC9jZW50ZXI+DQogDQo8YnI+DQpgYGB7ciBlY2hvID0gRkFMU0UsIGV2YWwgPSBUUlVFfQ0KVGFibGFfUG1hc2NvdGFnDQpgYGANCg0KDQo8YnI+DQo8Y2VudGVyPjxGT05UIENPTE9SPSJCbHVlIj4qKsK/RU4gUVXDiSBQQcONUyBIQVkgTcOBUyBQRVJTT05BUyBSRUNVUEVSQURBUz8qKjwvRk9OVD48L2NlbnRlcj4NCjxicj4NCmBgYHtyIGVjaG8gPSBGQUxTRSwgZXZhbCA9IFRSVUV9DQpUYWJsYV9QbWFzcmVjdQ0KYGBgDQoNCjxicj4NCjxjZW50ZXI+PEZPTlQgQ09MT1I9IkJsdWUiPioqwr9DVcOBTCBFUyBFTCBQQcONUyBDT04gTUVOT1MgQ09OVEFHSU9TPyoqPC9GT05UPjwvY2VudGVyPg0KPGJyPg0KYGBge3IgZWNobyA9IEZBTFNFLCBldmFsID0gVFJVRX0NClRhYmxhX1BtZW5jb3RhZw0KYGBgDQoNCg0KRWwgcGHDrXMgbcOhcyBhZmVjdGFkbyBob3kgZW4gZMOtYSBwb3IgbGEgcGFuZGVtaWEgZXMgRXN0YWRvcyBVbmlkb3MsIGNvbW8gcG9kcmVtb3MgY29uZmlybWFyIGEgbG8gbGFyZ28gZGVsIGFuw6FsaXNpcy4gQWRlbcOhcywgSW5kaWEgcGVzZSBhIHF1ZSB0aWVuZSB1biBncmFuIG7Dum1lcm8gZGUgcmVjdXBlcmFkb3MgKGVuIGxhIGZlY2hhIGluZGljYWRhIGVuIGxhIHRhYmxhKSBubyBkZWphIGRlIHRlbmVyIGNvbnRhZ2lhZG9zIHkgc3UgY2lmcmEgdmEgZW4gYXVtZW50by4gDQoNCkZpbHRyYW5kbyBsb3MgZGF0b3MgZXh0cmFpZG9zIGRlbCByZXBvc2l0b3JpbyBkZSBHaXRodWIgQ292aWQtMTksIGhlbW9zIG9idGVuaWRvIHF1ZSBlbCBwYcOtcyBjb24gbWVub3MgY29udGFnaW9zIGVzIFZhbnVhdHUsIHVuIHBhw61zIGluc3VsYXIgZGUgT2NlbmlhLCBxdWUgZW4gZXN0b3MgbW9tZW50b3MgdGllbmUgc29sbyAxIHBlcnNvbmEgY29uZmlybWFkYSBkZSBjb3JvbmF2aXJ1cywgcG9yIGxvIHF1ZSBlcyBlbCBwYcOtcyBjb24gbWVub3MgY2Fzb3MgaGFzdGEgZWwgbW9tZW50by4gKEFkZW3DoXMsIGNhYmUgdGVuZXIgZW4gY3VlbnRhIHF1ZSBlc3RhIGlzbGEgY3VlbnRhIGNvbiBtdXkgcG9jYSBwb2JsYWNpw7NuICgyOTIuNjgwIGhhYml0YW50ZXMpKQ0KDQoNCiMjIyA0LjIgTG9zIDEwIHBhw61zZXMgY29uIG3DoXMgY2Fzb3MgZGUgQ29yb25hdmlydXMsIMK/Q3XDoWxlcyBzb24/DQoNCmBgYHtyIGVjaG8gPSBGQUxTRSwgZXZhbD0gVFJVRX0NCiNHcsOhZmljbyBjb24gbG9zIDEwIHBhw61zZXMgcXVlIG3DoXMgY2Fzb3MgZGUgY29yb25hdmlydXMgcHJlc2VudGFuLg0KI0xvIGhlIHNhY2FkbyBhIHBhcnRpciBkZSBhcXXDrTogaHR0cHM6Ly9ycHVicy5jb20vSm9uYXRoYW5SemV6YWsvNjUyNjMzICEhISENCg0KI3JlbW90ZXM6Omluc3RhbGxfZ2l0aHViKCJramhlYWx5L2NvdmRhdGFAbWFpbiIpDQoNCmxpYnJhcnkoY292ZGF0YSkNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShsdWJyaWRhdGUpDQpsaWJyYXJ5KGdnYW5pbWF0ZSkNCmxpYnJhcnkoZ2lmc2tpKQ0KbGlicmFyeShSQ29sb3JCcmV3ZXIpDQoNCiNpbnN0YWxsLnBhY2thZ2VzKCJDYWlybyIpDQpsaWJyYXJ5KENhaXJvKQ0KDQpjb3ZpZCA8LSBjb3ZuYXQgJT4lDQogIGdyb3VwX2J5KGRhdGUpICU+JQ0KICBhcnJhbmdlKGRhdGUsIGRlc2MoY3VfY2FzZXMpKSAlPiUNCiAgbXV0YXRlKHJhbmtpbmcgPSByb3dfbnVtYmVyKCkpICU+JQ0KICBmaWx0ZXIocmFua2luZyA8PSAxMCkNCg0KI3VuaXF1ZShjb3ZpZCRjbmFtZSkgI0VzdG8gbm9zIHNpcnZlIHBhcmEgdmVyIGxhIHZhcmlhYmxlIHF1ZSBtdWVzdHJhIGVsIG5vbWJyZSBkZSBsYXMgcmVnaW9uZXMgZGVsIGRmIGNvdmlkLg0KDQojRGUgZXN0YSBtYW5lcmEgaGEgY2FtYmlhZG8gYWxndW5vcyBub21icmVzIGRlIGxhIGZpbGEgY25hbWUsIHRhbWJpw6luIHNlIHBvZMOtYSBoYWJlciBoZWNobyBjb24gbGEgZnVuY2nDs24gY2FzZV93aGVuLg0KDQpjb3ZpZCRjbmFtZSA8LSBnc3ViKCJUYWl3YW4sIFByb3ZpbmNlIG9mIENoaW5hIiwgIlRhaXdhbiIsIGNvdmlkJGNuYW1lKQ0KY292aWQkY25hbWUgPC0gZ3N1YigiSXJhbiwgSXNsYW1pYyBSZXB1YmxpYyBvZiIsICJJcmFuIiwgY292aWQkY25hbWUpDQpjb3ZpZCRjbmFtZSA8LSBnc3ViKCJSdXNzaWFuIEZlZGVyYXRpb24iLCAiUnVzc2lhIiwgY292aWQkY25hbWUpDQpjb3ZpZCRjbmFtZSA8LSBnc3ViKCJLb3JlYSwgUmVwdWJsaWMgb2YiLCAiU291dGggS29yZWEiLCBjb3ZpZCRjbmFtZSkNCmNvdmlkJGNuYW1lIDwtIGdzdWIoIlVuaXRlZCBBcmFiIEVtaXJhdGVzIiwgIlVBRSIsIGNvdmlkJGNuYW1lKQ0KDQojY3VfY2FzZXMgc29uIGxvcyBjYXNvcyBhY3VtdWxhZG9zLg0KDQojaW5zdGFsbC5wYWNrYWdlcygiUkNvbG9yQnJld2VyIikNCm5iLmNvbHMgPC0gNTANCm15Y29sb3JzIDwtIGNvbG9yUmFtcFBhbGV0dGUoYnJld2VyLnBhbCgxMiwgIlBhaXJlZCIpKShuYi5jb2xzKQ0KYGBgDQoNCmBgYHtyfQ0KYSA8LSBnZ3Bsb3QoY292aWQpKw0KICBnZW9tX2NvbChhZXMocmFua2luZyxjdV9jYXNlcyxmaWxsPWNuYW1lKSkrDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1teWNvbG9ycykrDQogIGdlb21fdGV4dChhZXMocmFua2luZyxjdV9jYXNlcyxsYWJlbD1hcy5mYWN0b3IoY3VfY2FzZXMpKSxoanVzdD0tMC4xLHNpemU9NSkrDQogIGdlb21fdGV4dChhZXMocmFua2luZywgeT0wICwgbGFiZWwgPSBjbmFtZSksIGhqdXN0PTEuMSxzaXplPTUpICsNCiAgZ2VvbV90ZXh0KGFlcyh4PTEwLCB5PW1heChjdV9jYXNlcykgLCBsYWJlbCA9IGFzLmZhY3RvcihkYXRlKSksIHZqdXN0ID0gMCwgaGp1c3Q9MSwgYWxwaGEgPSAwLjEsICBjb2wgPSAiYmxhY2siLCBzaXplID0gMjApKw0KICBsYWJzKHRpdGxlID0gIkV2b2x1Y2nDs24gZGUgbG9zIGNhc29zIHBvc2l0aXZvcyBkZSBDb3ZpZC0xOSBlbiBlbCBtdW5kbyIsDQogICAgICAgc3VidGl0bGUgPSAiRGF0b3MgZGUgbGEgVW5pdmVyc2lkYWQgSm9obnMgSG9wa2lucyIsDQogICAgICAgeD1OVUxMLA0KICAgICAgIHk9TlVMTCkrDQogIGNvb3JkX2ZsaXAoY2xpcCA9ICJvZmYiKSsNCiAgc2NhbGVfeF9yZXZlcnNlKCkrDQogIHRoZW1lX21pbmltYWwoKSsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLA0KICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMCwgc2l6ZT0yMCxmYWNlPSJib2xkIiksDQogICAgICAgIHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLCBzaXplPTEyLCBmYWNlPSJpdGFsaWMiKSwNCiAgICAgICAgcGxvdC5tYXJnaW4gPSBtYXJnaW4oMSwgNCwgMSwgMywgImNtIikpKw0KICB0cmFuc2l0aW9uX3N0YXRlcyhkYXRlLHRyYW5zaXRpb25fbGVuZ3RoID0gMSxzdGF0ZV9sZW5ndGggPSAwLHdyYXAgPSBGQUxTRSkNCmBgYA0KDQpgYGB7ciBvdXQud2lkdGg9IjEwMCUifQ0KIGFuaW1hdGUoYSwNCiAgICAgICAgbmZyYW1lcyA9IDgwMCwNCiAgICAgICAgZnBzID0gMjQsDQogICAgICAgIGVuZF9wYXVzZSA9IDIwMCwNCiAgICAgICAgd2lkdGggPSAxMDAwLA0KICAgICAgICBoZWlnaHQgPSA2MDAsDQogICAgICAgIHR5cGUgPSAiY2Fpcm8iKQ0KYGBgDQoNCkNvbiBlbCBhbnRlcmlvciBncsOhZmljbyBwcmV0ZW5kZW1vcyBtb3N0cmFyIGxhIGV2b2x1Y2nDs24gZGUgbG9zIGNhc29zIHBvc2l0aXZvcyBlbiBjb3JvbmF2aXJ1cywgbW9zdHJhbmRvIGxvcyAxMCBwYcOtc2VzIHF1ZSBzZSBlbmN1ZW50cmFuIGVuIGVsICJ0b3AiLiBFc3RvcyBkYXRvcyB2YW4gZGVzZGUgaW5jaW9vcyBkZSBlbmVybyBoYXN0YSBwcmluY2lwaW9zIGRlIGRpY2llbWJyZSAoYcOxbyAyMDIwKQ0KDQpPYnNlcnZhbW9zIHF1ZSBDaGluYSBlcyBlbCBwcmltZXIgcGHDrXMgZW4gdGVuZXIgcG9zaXRpdm9zIGVuIGNvcm9uYXZpcnVzLCBjb21vIHNhYmVtb3MgV3VoYW4gZnVlIGVsIGx1Z2FyIGRvbmRlIHNlIGRldGVjdMOzIGVsIHByaW1lciBwb3NpdGl2by4gRWwgY29yb25hdmlydXMgc2UgcHJvcGFnYSByYXBpZGFtZW50ZSBwb3IgdG9kbyBlbCBtdW5kbyB5IHZlbW9zIGEgdHJhdsOpcyBkZWwgZ3LDoWZpY28gcXVlIEl0YWxpYSB5IEVzcGHDsWEgcmFwaWRhbWVudGUgcGFzYW4gYSB0ZW5lciB1biBuw7ptZXJvIGVsZXZhZG8gZGUgY29udGFnaW9zLCBlbCBjdWFsIGVzIHN1cGVyYWRvIHBvciBFc3RhZG9zIFVuaWRvcyBlbiBtYXJ6bywgZG9uZGUgbG9zIGNhc29zIGNyZWNlbiBkZSBtYW5lcmEgZXhwb25lbmNpYWwuDQoNCkxvcyDDumx0aW1vcyBkYXRvcyBtb3N0cmFkb3MgaW5kaWNhbiBxdWUgSW5kaWEsIEJyYXNpbCB5IFJ1c2lhIHNlIHNpdHVhbiBlbiBsYSBzZWd1bmRhLCB0ZXJjZXJhIHkgY3VhcnRhIHBvc2ljacOzbiByZXNwZWN0aXZhbWVudGUgZW4gY29udGFnaW9zLiBFbiBkZWNpbWEgcG9zaWNpw7NuIHNlIGVuY3VlbnRyYSBNw6l4aWNvIGNvbiAxLjE0NC42NDMgZGUgY2Fzb3MgYWN1bXVsYWRvcy4NCg0KIyMjIDQuMyBFdm9sdWNpw7NuIGRlIGxvcyBjb250YWdpb3MgKGEgbml2ZWwgbXVuZGlhbCkNCg0KUGFyYSBwb2RlciBlbnRlbmRlciBjb21vIGhhIHNpZG8gbGEgcHJvcGFnYWNpw7NuIGRlbCB2aXJ1cyBhIG5pdmVsIG11bmRpYWwgbm9zIHBhcmVjaWEgaW50ZXJlc2FudGUgYW5hbGl6YXIgZGlmZXJlbnRlcyBwYcOtc2VzIHF1ZSBubyBmdWVyYW4gcGFyZWNpZG9zIGVudHJlIHNpLiBQYXJhIGVsbG8gZWxlZ2ltb3MgZXN0b3MgcGHDrXNlcyAtICoqRXN0YWRvcyBVbmlkb3MsIE5pZ2VyaWEsIFBvcnR1Z2FsIHkgSmFww7NuKiogLSBlIGhpY2ltb3MgdW4gZ3LDoWZpY28gZG9uZGUgbW9zdHJhbW9zIGxhIGV2b2x1Y2nDs24gZGUgbG9zIGNhc29zIHJlZ2lzdHJhZG9zIGRpYXJpYW1lbnRlLiAgDQoNCmBgYHtyIFVTfQ0KI0dyw6FmaWNvIHBhcmEgVVM6DQpkZl9tdW5kb1VTPC0gZGZfbXVuZG8gJT4lIGZpbHRlcihgQ291bnRyeS9SZWdpb25gID09ICJVUyIpICU+JSBzZWxlY3QoLWMoUmVjb3ZlcmVkLCBEZWF0aHMpKQ0KDQpkZl9tdW5kb1VTUyA8LSBkZl9tdW5kb1VTICU+JSBzdW1tYXJpc2UoZGlmID0gZGlmZihDb25maXJtZWQpKQ0KDQpkZlVTIDwtIGRmX211bmRvVVMgJT4lIHNlbGVjdChgQ291bnRyeS9SZWdpb25gLERpYSwgTWVzKQ0KZGZVUyA8LSBkZlVTICU+JSBzbGljZSgtMSkNClVTIDwtIGJpbmRfY29scyhkZlVTLCBkZl9tdW5kb1VTUykNCg0KVVMgPC0gVVMgJT4lIG11dGF0ZShyYW5raW5nID0gcm93X251bWJlcigpKQ0KDQpncmFmaWNvVVMgPC0gZ2dwbG90KFVTLCBhZXMocmFua2luZywgZGlmLCBjb2xvciA9IE1lcykpICsgZ2VvbV9saW5lKCkgKyBsYWJzKHRpdGxlID0gIkVFVVUiLCAgeCA9IE5VTEwsIHkgPSAiTsK6IGNhc29zIGFsIGTDrWEiKSArICB0aGVtZV9idygpICsgdGhlbWUoYXhpcy50ZXh0Lng9ZWxlbWVudF9ibGFuaygpLCBheGlzLnRpY2tzLng9ZWxlbWVudF9ibGFuaygpKSAgKyAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpICsgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikNCg0KI0liYW1vcyBoYSBoYWNlcmxvIHRhbWJpw6luIGRlIEF1c3RyYWxpYSwgcGVybyBubyBsbyBoZSBoZWNobyBwb3JxdWUgZWwgbsO6bWVybyBkZSBjYXNvcyBlcyBiYXN0YW50ZSBiYWpvIHkgbGEgZGlmZXJlbmNpYSBlbnRyZSB1biBkw61hIHkgb3RybyBzYWxlIG5lZ2F0aXZhLiAoUG9yIGxvIHF1ZSBlbCBncsOhZmljbyBubyBzZSB2ZSBiaWVuKQ0KDQojTWlzbW8gcHJvY2VzbyBwYXJhIE5pZ2VyaWEsIEphcMOzbiB5IFBvcnR1Z2FsDQojUG9yIHRhbnRvLCBwb25nbyBlbCBjw7NkaWdvIHBhcmEgcXVlIG5vIHNlIHZlYS4gKGVjaG89RkFMU0UpDQpgYGANCg0KDQpgYGB7ciBOaWdlcmlhLCAgZWNobz1GQUxTRSwgZXZhbD1UUlVFfQ0KDQojUGFyYSBOaWdlcmlhOg0KDQpkZl9tdW5kb048LSBkZl9tdW5kbyAlPiUgZmlsdGVyKGBDb3VudHJ5L1JlZ2lvbmAgPT0gIk5pZ2VyaWEiKSAlPiUgc2VsZWN0KC1jKFJlY292ZXJlZCwgRGVhdGhzKSkNCg0KZGZfbXVuZG9OTiA8LSBkZl9tdW5kb04gJT4lIHN1bW1hcmlzZShkaWYgPSBkaWZmKENvbmZpcm1lZCkpDQoNCmRmTiA8LSBkZl9tdW5kb04gJT4lIHNlbGVjdChgQ291bnRyeS9SZWdpb25gLERpYSwgTWVzKQ0KZGZOIDwtIGRmTiAlPiUgc2xpY2UoLTEpDQpOIDwtIGJpbmRfY29scyhkZk4sIGRmX211bmRvTk4pDQoNCk4gPC0gTiAlPiUgbXV0YXRlKHJhbmtpbmcgPSByb3dfbnVtYmVyKCkpDQoNCmdyYWZpY29OIDwtIGdncGxvdChOLCBhZXMocmFua2luZywgZGlmLCBjb2xvciA9IE1lcykpICsgZ2VvbV9saW5lKCkgKyBsYWJzKHRpdGxlID0gIk5pZ2VyaWEiLCB4ID0gTlVMTCwgeSA9ICJOwrogY2Fzb3MgYWwgZMOtYSIpICsgIHRoZW1lX2J3KCkgKyB0aGVtZShheGlzLnRleHQueD1lbGVtZW50X2JsYW5rKCksIGF4aXMudGlja3MueD1lbGVtZW50X2JsYW5rKCkpICArICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkgKyAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQ0KDQpgYGANCg0KDQoNCmBgYHtyIEphcMOzbiwgZWNobz1GQUxTRSwgZXZhbD1UUlVFfQ0KDQojUGFyYSBKYXDDs24NCg0KZGZfbXVuZG9KPC0gZGZfbXVuZG8gJT4lIGZpbHRlcihgQ291bnRyeS9SZWdpb25gID09ICJKYXBhbiIpICU+JSBzZWxlY3QoLWMoUmVjb3ZlcmVkLCBEZWF0aHMpKQ0KDQpkZl9tdW5kb0pKIDwtIGRmX211bmRvSiAlPiUgc3VtbWFyaXNlKGRpZiA9IGRpZmYoQ29uZmlybWVkKSkNCg0KZGZKIDwtIGRmX211bmRvSiAlPiUgc2VsZWN0KGBDb3VudHJ5L1JlZ2lvbmAsRGlhLCBNZXMpDQpkZkogPC0gZGZKICU+JSBzbGljZSgtMSkNCkogPC0gYmluZF9jb2xzKGRmSiwgZGZfbXVuZG9KSikNCg0KSiA8LSBKICU+JSBtdXRhdGUocmFua2luZyA9IHJvd19udW1iZXIoKSkNCg0KZ3JhZmljb0ogPC0gZ2dwbG90KEosIGFlcyhyYW5raW5nLCBkaWYsIGNvbG9yID0gTWVzKSkgKyBnZW9tX2xpbmUoKSArIGxhYnModGl0bGUgPSAiSmFww7NuIiwgIHggPSBOVUxMLCB5ID0gIk7CuiBjYXNvcyBhbCBkw61hIikgKyAgdGhlbWVfYncoKSArIHRoZW1lKGF4aXMudGV4dC54PWVsZW1lbnRfYmxhbmsoKSwgYXhpcy50aWNrcy54PWVsZW1lbnRfYmxhbmsoKSkgICsgIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikNCmBgYA0KDQpgYGB7ciBQb3J0dWdhbCwgZWNobyA9IEZBTFNFLGV2YWw9VFJVRX0NCiNQYXJhIFBvcnR1Z2FsDQoNCmRmX211bmRvUDwtIGRmX211bmRvICU+JSBmaWx0ZXIoYENvdW50cnkvUmVnaW9uYCA9PSAiUG9ydHVnYWwiKSAlPiUgc2VsZWN0KC1jKFJlY292ZXJlZCwgRGVhdGhzKSkNCg0KZGZfbXVuZG9QUCA8LSBkZl9tdW5kb1AgJT4lIHN1bW1hcmlzZShkaWYgPSBkaWZmKENvbmZpcm1lZCkpDQoNCmRmUCA8LSBkZl9tdW5kb1AgJT4lIHNlbGVjdChgQ291bnRyeS9SZWdpb25gLERpYSwgTWVzKQ0KZGZQIDwtIGRmUCAlPiUgc2xpY2UoLTEpDQpQIDwtIGJpbmRfY29scyhkZlAsIGRmX211bmRvUFApDQoNClAgPC0gUCAlPiUgbXV0YXRlKHJhbmtpbmcgPSByb3dfbnVtYmVyKCkpDQoNCmdyYWZpY29QIDwtIGdncGxvdChQLCBhZXMocmFua2luZywgZGlmLCBjb2xvciA9IE1lcykpICsgZ2VvbV9saW5lKCkgKyBsYWJzKHRpdGxlID0gIlBvcnR1Z2FsIiwgIHggPSBOVUxMLCB5ID0gIk7CuiBjYXNvcyBhbCBkw61hIikgKyAgdGhlbWVfYncoKSArIHRoZW1lKGF4aXMudGV4dC54PWVsZW1lbnRfYmxhbmsoKSwgYXhpcy50aWNrcy54PWVsZW1lbnRfYmxhbmsoKSkgICsgIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKSsgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikNCmBgYA0KDQoNCmBgYHtyIGVjaG89RkFMU0UsIGV2YWwgPSBUUlVFLCAgb3V0LndpZHRoPSI5MCUiIH0NCmxpYnJhcnkocGF0Y2h3b3JrKQ0KKGdyYWZpY29VUyArIGdyYWZpY29QKSAvIChncmFmaWNvSiArIGdyYWZpY29OKQ0KYGBgDQpDYWJlIHRlbmVyIGVuIGN1ZW50YSBxdWUgbG9zIGNvbG9yZXMgbXVlc3RyYW4gbG9zIGRpZmVyZW50ZXMgbWVzZXMsIGVtcGV6YW5kbyBlbiBFbmVybyB5IGFjYWJhbmRvIGVuIE5vdmllbWJyZS4NCg0KQSBsYSB2aXN0YSBkZWwgZ3LDoWZpY28gb2JzZXJ2YW1vcyBxdWUgbGEgZXZvbHVjacOzbiBlbiBsb3MgZGlzdGludG9zIHBhw61zZXMgZXMgbXV5IGRpZmVyZW50ZS4gRW4gPEZPTlQgQ09MT1I9IkZGNEQwMCI+KipQT1JUVUdBTCoqPC9GT05UPiwgYWwgKipwcmluY2lwaW8gZGUgbGEgcGFuZGVtaWEgc2UgbXVlc3RyYSB1biBhdW1lbnRvIGVuIGxhIGN1cnZhLCBhdW5xdWUgZXMgbXV5IHBvY28gcHJvbnVuY2lhZG8qKiB5ICoqc2VndWlkYW1lbnRlIGxvcyBjYXNvcyBiYWphbiB5IHNlIG1hbnRpZW5lbiBlbiB2YWxvcmVzIG11eSBiYWpvcyBkdXJhbnRlIHVuIHBlcsOtb2RvIGRlIHRpZW1wbyAobWVzZXMpIGxhcmdvKiogaGFzdGEgcXVlIGVtcGllemEgbGEgKipzZWd1bmRhIG9sYSBkb25kZSBsb3MgY2Fzb3Mgc2UgZGlzcGFyYW4gdGVuaWVuZG8gc3UgbcOheGltbyBlbiBjYXNpIDgwMDAgY2Fzb3MgcmVnaXN0cmFkb3MgZW4gdW4gc29sbyBkaWEqKi4NCg0KTGEgZXZvbHVjacOzbiBkZSA8Rk9OVCBDT0xPUj0iRkY0RDAwIj4qKk5JR0VSSUEqKjwvRk9OVD4sIGVuIGNhbWJpbyBlcyBtdXkgZGlmZXJlbnRlIGVuIGVzdGUgcGHDrXMgKiplbCB2aXJ1cyBsbGVnYSBtw6FzIHRhcmRlIHF1ZSBsb3MgZGVtw6FzKiogeSBsYSAqKnByaW1lcmEgb2xhIHBhcmVjZSBzZXIgbWF5b3IgcXVlIGxhIHNlZ3VuZGEqKiwgYXVucXVlIG5vIHNlIHB1ZWRlbiB0YW1wb2NvIHNhY2FyIGRlbWFzaWFkYXMgY29uY2x1c2lvbmVzIHlhIHF1ZSBlbCBzaXN0ZW1hIHNhbml0YXJpbyBkZSBlc3RlIHBhw61zIG5vIGVzIGNvbXBhcmFibGUgYWwgZGUgbG9zIG90cm9zIHRyZXMgcGHDrXNlcyBhbmFsaXphZG9zLiANCg0KPEZPTlQgQ09MT1I9IkZGNEQwMCI+KipKQVDDk04qKjwvRk9OVD4sIHN1ZnJlIGNvbW8gdmVtb3MgZW4gZWwgZ3LDoWZpY28gKip0cmVzIHBpY29zKiogbXV5IGNsYXJvcy4gYCoqRWwgcHJpbWVybywgYWwgcHJpbmNpcGlvIGRlIGxhIHBhbmTDqW1pYSwgZWwgc2lndWllbnRlIHVub3MgbWVzZXMgbcOhcyB0YXJkZSB5IGN1YW5kbyBwYXJlY2lhIHF1ZSBwb2RpYW4gY29udHJvbGFyIGxhIHNpdHVhY2nDs24gbG9zIGNhc29zIGVtcGV6YXJvbiBhIGF1bWVudGFyIHByb2dyZXNpdmFtZW50ZSoqIGhhc3RhIGxsZWdhciBhIG3DoXhpbW9zIG51bmNhIHZpc3RvcyBhbnRlcyBlbiBsYSBwYW5kZW1pYS4NCg0KUG9yIMO6bHRpbW8sIGVsIGNhc28gZGUgPEZPTlQgQ09MT1I9IkZGNEQwMCI+KipFU1RBRE9TIFVOSURPUyoqPC9GT05UPg0KZXMgZGlmZXJlbnRlIHlhIHF1ZSAqKmxhIGN1cnZhIGVzIHNpZW1wcmUgYXNjZW5kZW50ZSoqIHkgbm8gb2ZyZWNlIGNhbWJpb3MgZXh0cmVtYWRhbWVudGUgYnJ1c2NvcyBjb21vIGxhIGRlIGxvcyBvdHJvcyBwYcOtc2VzLiBTdSB0ZW5kZW5jaWEgZXMgY2xhcmEsICoqY2FkYSB2ZXogbWFzIGNhc29zIHRlbmllbmRvIGVsIHBpY28gbcOheGltbyBlbiBsYXMgZmVjaGFzIG3DoXMgcmVjaWVudGVzKioNCg0KPGJyPg0KDQojIyMgQ29udGludWFtb3MgY29uIGVsIGFuw6FsaXNpcyBhIG5pdmVsIG11bmRpYWwsIHBhcmEgZWxsbyBhaG9yYSB1dGlsaXphcmVtb3MgZWwgcGFxdWV0ZSAqKnRpZHljb3ZpZDE5KioNCg0KYGBge3IgZWNobyA9IFRSVUUsIGV2YWwgPSBGQUxTRX0NCiNyZW1vdGVzOjppbnN0YWxsX2dpdGh1Yigiam9hY2hpbS1nYXNzZW4vdGlkeWNvdmlkMTkiKQ0KbGlicmFyeSh0aWR5Y292aWQxOSkNCg0KI2luc3RhbGwucGFja2FnZXMoIm1hcHMiKQ0KbGlicmFyeShsdWJyaWRhdGUpDQoNCm1lcmdlZCA8LSBkb3dubG9hZF9tZXJnZWRfZGF0YShjYWNoZWQgPSBUUlVFLCBzaWxlbnQgPSBUUlVFKQ0KDQphIDwtIHBsb3RfY292aWQxOV9zdHJpcGVzKA0KICB0eXBlID0gImNvbmZpcm1lZCIsDQogIGNvdW50cmllcyA9IGMoIkNITiIgLCAiRVNQIiwgICJCUkEiLCAiWkFGIiwgIlVLIiwgIlVTQSIpLA0KICBzb3J0X2NvdW50cmllcyA9ICJjb3VudHJpZXMiKQ0KDQphIDwtIGEgKyB0aGVtZV90ZXN0KCkgKyAgdGhlbWUobGVnZW5kLmRpcmVjdGlvbiA9ICJob3Jpem9udGFsIikgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikgKw0KICBsYWJzKHRpdGxlID0gIkNPVklELTE5IC1DQVNPUyBESUFSSU9TIiwgc3VidGl0bGUgPSAiIE11ZXN0cmEgZWwgY2FtYmlvIGRpYXJpbyBlbiBjYXNvcyBjb25maXJtYWRvcyAocHJvbWVkaW8gZGUgNyBkw61hcykiLCBjYXB0aW9uID0gIkRhdG9zIG9idGVuaW5kb3MgZGUgSm9obnMgSG9wa2lucyBVbml2ZXJzaXR5IENTU0UgR2l0aHViDQogIFJlcG86IGh0dHBzOi8vZ2l0aHViLmNvbS9qb2FjaGltLWdhc3Nlbi90aWR5Y292aWQxOS4NCiAgICAgICDDmmx0aW1vcyBkYXRvcyBvYnRlbmlkb3MgMDkvMTIvMjAyMCIpICANCiAgICAgDQoNCmEgPC0gYSArIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKSArICB0aGVtZShwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkgIA0KDQpgYGANCg0KDQpgYGB7ciBldmFsID0gVFJVRSwgZWNobyA9IEZBTFNFLCBvdXQud2lkdGg9IjcwJSJ9DQprbml0cjo6aW5jbHVkZV9ncmFwaGljcyhoZXJlOjpoZXJlKCJpbWFnZW5lcyIsICJiYXJyYXMucG5nIikpDQpgYGANCjxhIGhyZWY9Ii4vaW1hZ2VuZXMvYmFycmFzLnBuZyIgdGFyZ2V0PSJfYmxhbmsiPltBbXBsaWFyIEltYWdlbl08L2E+DQoNCg0KRW4gZWwgZ3LDoWZpY28gYW50ZXJpb3Igc2UgY29udHJhc3RhIGxvIHF1ZSBzZSBoYSBjb21lbnRhZG8gYW50ZXJpb3JtZW50ZS4gKipFbCBwYcOtcyBjb24gbcOhcyBjYXNvcyBkaWFyaW9zIGFjdHVhbG1lbnRlIGVzIEVzdGFkb3MgVW5pZG9zKiosIHN1IHRlbmRlbmNpYSBlcyBjbGFyYSwgY29tbyBzZSBoYSBkaWNobyBhbnRlcywgbm8gcGFyYW4gZGUgYXVtZW50YXIgbG9zIGNhc29zLiBQYXJlY2lkYSBhIGVzdGEgZXMgbGEgdGVuZGVuY2lhIHF1ZSBvYnNlcnZhbW9zIGVuIEJyYXNpbCwgZG9uZGUgZWwgcHJpbWVyIGNhc28gc2UgY29uZmlybcOzIGVsIDI1IGRlIGZlYnJlcm8gZGUgMjAyMCwgZW4gZWwgZXN0YWRvIGRlIFPDo28gUGF1bG8sIHBvciBwYXJ0ZSBkZSB1biBicmFzaWxlw7FvIHF1ZSB2aWFqw7MgYSBJdGFsaWEgY29uIHNpbnRvbWFzIGxldmVzLg0KDQpQb3Igb3RyYSBwYXJ0ZSB0ZW5lbW9zIGEgKipFc3Bhw7FhKiogeSAqKlN1ZC1BZnJpY2EqKiwgc3VzIGdyw6FmaWNvcyBzaSBtdWVzdHJhbiBsYXMgZmFtb3NhcyBvbGFzIGRvbmRlIGxvcyBjYXNvcyBhdW1lbnRhYmFuIHBhcm8gbHVlZ28gc2UgcmVkdWNpYW4uIENvbmNyZXRhbWVudGUgZW4gZWwgY2FzbyBkZSBFc3Bhw7FhIHNlIHB1ZWRlbiB2ZXIgY29tbyBoYWNpYSBlbCBmaW5hbCwgbWVzZXMgbcOhcyByZWNpZW50ZXMsICB2dWVsdmVuIGEgYXBhcmVjZXIgdG9ub3MgbWFzIHZlcmRvc29zIGxvIHF1ZSBzaWduaWZpY2EgcXVlIGxvcyBjYXNvcyBoYW4gZGlzbWludWlkbywgZW4gY29tcGFyYWNpw7NuIGNvbiBsb3MgbWVzZXMgZGUgbWFyem8tYWJyaWwuDQoNCkVsIHBhw61zIHJlc3RhbnRlIGVzICoqQ2hpbmEqKiBkb25kZSBzZWfDum4gbG9zIGRhdG9zIHF1ZSB0ZW5lbW9zIGxhIFBhbmRlbWlhIGVzdGEgY29udHJvbGFkYSB5YSBxdWUgbG9zIHZhbG9yZXMgc29uIGluZmltb3MgcGFyYSBsYSBwb2JsYWNpw7NuIHF1ZSB0aWVuZSBlbCBnaWdhbnRlIGFzacOhdGljby4gQWRlbcOhcywgc2Ugb2JzZXJ2YSBxdWUgYWwgcHJpbmNpcGlvIGRlIGxhIGNyaXNpIHNhbml0YXJpYSBwcmVzZW50YWJhIG3DoXMgY2Fzb3MgcXVlIGVsIHJlc3RvIGRlIHBhw61zZXMgYW5hbGl6YWRvcyAoZW4gZXN0ZSBncsOhZmljbykNCg0KPGJyPg0KDQpgYGB7ciBlY2hvID0gVFJVRSwgZXZhbCA9IEZBTFNFfQ0KbWFwYUNEIDwtIG1hcF9jb3ZpZDE5KA0KICBkYXRhID0gZG93bmxvYWRfbWVyZ2VkX2RhdGEoY2FjaGVkID0gVFJVRSwgc2lsZW50ID0gVFJVRSksDQogIHR5cGUgPSAiZGVhdGhzIiwNCiAgY3VtdWxhdGl2ZSA9IEZBTFNFLA0KICBjaGFuZ2VfYXZlID0gNywNCiAgcGVyX2NhcGl0YSA9IFRSVUUpDQoNCmxpYnJhcnkoZ2dwbG90MikNCm1hcGFDRCA8LSBtYXBhQ0QgKyBsYWJzKHRpdGxlID0gIkNPVklELTE5IiwNCiAgICAgICAgICAgICAgICAgICAgICAgIHN1YnRpdGxlID0gIk11ZXN0cmEgbGEgdmFyaWFjacOzbiBkaWFyaWEgZGUgbXVlcnRlcyBwb3IgMTAwLjAwMCBoYWJpdGFudGVzIChwcm9tZWRpbyBkdXJhbnRlIDcgZGlhcykiLCBjYXB0aW9uID0gIkRhdG9zIGRlbCBkw61hIDA3LzEyLzIwMjAsICANCkRhdG9zIG9idGVuaW5kb3MgZGUgSm9obnMgSG9wa2lucyBVbml2ZXJzaXR5IENTU0UgR2l0aHViIFJlcG86IGh0dHBzOi8vZ2l0aHViLmNvbS9qb2FjaGltLWdhc3Nlbi90aWR5Y292aWQxOS4iKSArDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKSArICANCiAgdGhlbWUocGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpDQoNCm1hcGFDRCArICAgc2NhbGVfZmlsbF92aXJpZGlzX2MoZGlyZWN0aW9uID0gLTEpDQpgYGANCg0KYGBge3IgZXZhbCA9IFRSVUUsIGVjaG8gPSBGQUxTRSwgb3V0LndpZHRoPSI3MCUifQ0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoaGVyZTo6aGVyZSgiaW1hZ2VuZXMiLCAiTXVlcnRlc19kaWFyaWFzLnBuZyIpKQ0KYGBgDQo8YSBocmVmPSIuL2ltYWdlbmVzL011ZXJ0ZXNfZGlhcmlhcy5wbmciIHRhcmdldD0iX2JsYW5rIj5bQW1wbGlhciBJbWFnZW5dPC9hPg0KDQpFc3RlIG1hcGEgbm9zIG11ZXN0cmEgbGEgdmFyaWFjacOzbiBkZSBtdWVydGVzIHBvciAxMDAgbWlsIGhhYml0YW50ZXMgZW4gdW4gcHJvbWVkaW8gZGUgNyBkw61hcy4gIExvcyBkYXRvcyBzb24gZGUgbGEgc2VtYW5hIGRlbCA3IGRlIGRpY2llbWJyZS4gDQpFbiBlc3RlIG1hcGEsIHNlIHB1ZWRlIHJlY2FsY2FyIHF1ZSBsYSB6b25hIG3DoXMgYWZlY3RhZGEgcG9yIG11ZXJ0ZXMgcG9yIENPVklEIGVzIGVsIGNlbnRybyBkZSBFdXJvcGEsIGRvbmRlIHBvZHLDrWFtb3MgZGVzdGFjYXIgcGHDrXNlcyBjb21vIEl0YWxpYSwgRXNsb3ZlbmlhIG8gQnVsZ2FyaWEuIE90cm8gZGUgbG9zIHBhw61zZXMgbcOhcyBhZmVjdGFkb3MgcG9yIGVsIGNvcm9uYXZpcnVzIHNpbiBkdWRhIGVzIEVzdGFkb3MgVW5pZG9zIGRvbmRlIGRlc3RhY2EgdGFudG8gZW4gbXVlcnRlcywgY29tbyBlbiBjb250YWdpb3MuDQpUYW1iacOpbiBzZSBwdWVkZSB2ZXIgcXVlIGxvcyBwYcOtc2VzIGRvbmRlIG1lbm9zIG11ZXJ0ZXMgcG9yIDEwMCBtaWwgaGFiaXRhbnRlcyBlc3TDoW4gaGFiaWVuZG8sIHNvbiBwYcOtc2VzIGRlIMOBZnJpY2EsIE9jZWFuw61hIHkgcGFydGUgZGUgQXNpYS4NCg0KDQpgYGB7ciBlY2hvID0gVFJVRSwgZXZhbCA9IEZBTFNFfQ0KbWFwYUNDIDwtIG1hcF9jb3ZpZDE5KA0KICBkYXRhID0gZG93bmxvYWRfbWVyZ2VkX2RhdGEoY2FjaGVkID0gVFJVRSwgc2lsZW50ID0gVFJVRSksDQogIHR5cGUgPSAiY29uZmlybWVkIiwNCiAgY3VtdWxhdGl2ZSA9IEZBTFNFLA0KICBjaGFuZ2VfYXZlID0gNywNCiAgcGVyX2NhcGl0YSA9IFRSVUUpDQoNCm1hcGFDQyA8LSBtYXBhQ0MgKyBsYWJzKHRpdGxlID0gIkNPVklELTE5IC0gQ0FTT1MgQ09ORklSTUFET1MiLA0KICAgICAgICAgICAgICAgICAgICAgICAgc3VidGl0bGUgPSAiTXVlc3RyYSBsYSB2YXJpYWNpw7NuIGRpYXJpYSBkZSBjYXNvcyBjb25maXJtYWRvcyBwb3IgMTAwLjAwMCBoYWJpdGFudGVzIChwcm9tZWRpbyBkdXJhbnRlIDcgZGlhcykiLCBjYXB0aW9uID0gIkRhdG9zIGRlbCBkw61hIDA3LzEyLzIwMjAsICANCkRhdG9zIG9idGVuaW5kb3MgZGUgSm9obnMgSG9wa2lucyBVbml2ZXJzaXR5IENTU0UgR2l0aHViIFJlcG86IGh0dHBzOi8vZ2l0aHViLmNvbS9qb2FjaGltLWdhc3Nlbi90aWR5Y292aWQxOS4iKSArDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKSArICANCiAgdGhlbWUocGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpDQoNCm1hcGFDQyArIHNjYWxlX2ZpbGxfdmlyaWRpc19jKGRpcmVjdGlvbiA9IC0xKQ0KYGBgDQoNCmBgYHtyIGV2YWwgPSBUUlVFLCBlY2hvID0gRkFMU0UsIG91dC53aWR0aD0iNjAlIn0NCmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKGhlcmU6OmhlcmUoImltYWdlbmVzIiwgIkNhc29zY29uZmlybWFkb3MucG5nIikpDQpgYGANCjxhIGhyZWY9Ii4vaW1hZ2VuZXMvQ2Fzb3Njb25maXJtYWRvcy5wbmciIHRhcmdldD0iX2JsYW5rIj5bQW1wbGlhciBJbWFnZW5dPC9hPg0KDQpFc3RlIG1hcGEgbm9zIG11ZXN0cmEgbGEgdmFyaWFjacOzbiBkZSBjYXNvcyBjb25maXJtYWRvcyBwb3IgMTAwIG1pbCBoYWJpdGFudGVzIGVuIHVuIHByb21lZGlvIGRlIDcgZMOtYXMuICBMb3MgZGF0b3Mgc28gZGUgbGEgc2VtYW5hIGRlbCA3IGRlIGRpY2llbWJyZS4gDQoNCkNvbW8gcG9kZW1vcyBvYnNlcnZhciwgbGFzIHpvbmFzIGRvbmRlIG1lbm9zIGNhc29zIHNlIGNvbmZpcm1hbiBzb24gZW4gem9uYXMgZGUgw4FmcmljYSAoaGF5IHF1ZSB0ZW5lciBlbiBjdWVudGEgcXVlIHNlIHJlYWxpemFuIG1lbm9zIHBydWViYXMgcXVlIGVuIGVsIHJlc3RvIGRlIGxvcyBjb250aW5lbnRlcykgUG9yIG90cm8gbGFkbywgaGF5IG90cmFzIHpvbmFzIGNvbW8gQXVzdHJhbGlhIHkgcGFydGUgZGUgQXNpYSBkb25kZSB0YW1iacOpbiBoYXkgcG9jb3MgY29udGFnaW9zIGNvbmZpcm1hZG9zLiANCg0KTGFzIHpvbmFzIG3DoXMgYWZlY3RhZGFzIHNlcsOtYW4gem9uYXMgZGUgRXVyb3BhLCBSdXNpYSB5IEVzdGFkb3MgVW5pZG9zLg0KDQpgYGB7cn0NCg0KI3JlbW90ZXM6Omluc3RhbGxfZ2l0aHViKCJqb2FjaGltLWdhc3Nlbi90aWR5Y292aWQxOSIpDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkodGlkeWNvdmlkMTkpDQoNCmRmeiA8LSBkb3dubG9hZF9tZXJnZWRfZGF0YShzaWxlbnQgPSBUUlVFLCBjYWNoZWQgPSBUUlVFKQ0KDQpkZnogPC0gZGZ6ICU+JSBncm91cF9ieShpc28zYykgJT4lIHN1bW1hcmlzZSgNCiAgICBjb25maXJtZWRfY2FzZXMgPSBtYXgoY29uZmlybWVkLCBuYS5ybSA9IFRSVUUpLA0KICAgIHNvY19kaXN0X21lYXN1cmVzID0gbWF4KHNvY19kaXN0KQ0KICApICU+JSBmaWx0ZXIoY29uZmlybWVkX2Nhc2VzID49IDEwMDApDQoNCkRGIDwtIGRmeiAlPiUgYXJyYW5nZShkZXNjKGNvbmZpcm1lZF9jYXNlcykpDQoNCkRGIDwtIGRmeiAlPiUgc2xpY2VfbWF4KGNvbmZpcm1lZF9jYXNlcywgbj0yMCklPiUgc2xpY2UoLTcpDQoNCmdncGxvdChERiwgYWVzKHggPSBjb25maXJtZWRfY2FzZXMsIHkgPSBzb2NfZGlzdF9tZWFzdXJlcywgY29sb3IgPSBpc28zYykpICsgZ2VvbV9wb2ludCgpICsNCnNjYWxlX3hfY29udGludW91cyh0cmFucz0nbG9nMTAnLCBsYWJlbHMgPSBzY2FsZXM6OmNvbW1hKSArDQpnZ3JlcGVsOjpnZW9tX2xhYmVsX3JlcGVsKGdncGxvdDI6OmFlcyhsYWJlbCA9IGlzbzNjKSkgKyBsYWJzKHRpdGxlID0gIlJFTEFDScOTTiBFTlRSRSBMT1MgQ0FTT1MgQ09ORklSTUFET1MgWSBMQVMgTUVESURBUyBUT01BREFTIiwNCnN1YnRpdGxlID0gIlJlbGFjacOzbiBoZWNoYSBwYXJhIGxvcyAyMCBwYcOtc2VzIGNvbiBtw6FzIGNvbnRhZ2lvcyIgLGNhcHRpb24gPSAiRGF0b3NkZWwgcmVwb3NpdG9yaW8gZGUgR2l0aHViIGRlIENTU0UgZGUgbGEgVW5pLg0KSm9obnMgSG9wa2lucy4gUGFxdWV0ZSA8PHRpZHljb3ZpZDE5Pj4iLCB5ID0gIk1lZGlkYXMgZGlzdGFuY2lhIHNvY2lhbCIsIHggPSAiQ2Fzb3MgY29uZmlybWFkb3MiKSArDQp0aGVtZV9idygpICsgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKyAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpICsgIHRoZW1lKHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKQ0KYGBgDQpFbiBlc3RlIGdyw6FmaWNvIHNlIG11ZXN0cmEgbGEgcmVsYWNpw7NuIGV4aXN0ZW50ZSBlbnRyZSBlbCBuw7ptZXJvIGRlIGNhc29zIChjb250YWdpb3MpIHkgZWwgbsO6bWVybyBkZSBtZWRpZGFzIGRlIGRpc3RhbmNpYW1pZW50byBzb2NpYWwgYXBsaWNhZGFzIGVuIGNhZGEgdW5vIGRlIGxvcyBwYcOtc2VzIGRlIGxhIG11ZXN0cmEgKG5ldG9zIGRlIHJlc3RyaWNjaW9uZXMgbGV2YW50YWRhcykNCg0KU2UgZW5jYXJnYW4gZGUgcmVjb3BpbGFyIGVzdG9zIGRhdG9zIEFDQVBTLCB1biBwcm95ZWN0byBubyBndWJlcm5hbWVudGFsLiBbXjNdDQoNCkVuIGVzdGUgY2FzbyBzZSBtdWVzdHJhIGVsIG7Dum1lcm8gZGUgbWVkaWRhcyBkZSBkaXN0YW5jaWFtaWVudG8gc29jaWFsIGluZm9ybWFkYXMgaGFzdGEgbGEgZmVjaGEgcG9yIEFDQVBTLCBuZXRvIGRlIHJlc3RyaWNjaW9uZXMgbGV2YW50YWRhcy4gVG9kbyB5IHF1ZSB0YW1iacOpbiBzZSBwdWVkZSB2ZXIgbGEgcmVsYWNpw7NuIGNvbiBvdHJhcyBtZWRpZGFzIHF1ZSByZWNvZ2UgZXN0ZSBwcm95ZWN0bywgdGFsZXMgY29tbyBlbCBuw7ptZXJvIGRlIG1lZGlkYXMgc29jaWFsZXMgeSBlY29uw7NtaWNhcyBvIGRlIHJlZXN0cmljY2lvbmVzIGRlIG1vdmltaWVudG8sIGV0Yy4gDQoNCkRlIGFjdWVyZG8gY29uIGVsIGdyw6FmaWNvLCBvYnNlcnZhbW9zIHF1ZSBlbCBwYcOtcyBkZWwgbXVuZG8gY29uIG3DoXMgY29udGFnaW9zIGFjdHVhbG1lbnRlLCBFc3RhZG9zIFVuaWRvcywgaGEgYXBsaWNhZG8gdW4gbml2ZWwgZGUgbWVkaWRhcyBkZSBkaXN0YW5jaWEgc29jaWFsIG11eSBiYWpvLCBlbiBjb21wYXJhY2nDs24gY29uIG90cm9zIHBhw61zZXMsIGNvbW8gZW4gR3JhbiBCcmV0YcOxYSwgZG9uZGUgQm9yaXMgSm9obnNvbiBzZSBoYSB2aXN0byBvYmxpZ2FkbyBhIGltcG9uZXIgIHJlZ2xhcyBkZSBkaXN0YW5jaWFtaWVudG8gc29jaWFsIGRhZG8gbGEgZGVzYm9yZGFkYSBzaXR1YWNpw7NuIGVuIGxhIHF1ZSBzZSBlbmNvbnRyYWJhLiBUZW5pZW5kbyBlbiBjdWVudGEgYWRlbcOhcywgcXVlIGFsIGluaWNpbyBkZSBsYSBwYW5kZW1pYSBldml0w7MgcG9uZXIgbWVkaWRhcyBkcsOhc3RpY2FzLCB0b2RvIHkgcXVlIHN1IGVzdHJhdMOpZ2lhIHR1dm8gcXVlIGNhbWJpYXIgYWwgdmVyIHF1ZSBlbCB2aXJ1cyBlc3RhYmEgY29naWVuZG8gZnVlcnphIGVuIHN1IHBhw61zLg0KDQpFc3Bhw7FhIHNlIGVuY3VlbnRyYSBhIGTDrWEgZGUgaG95IGNvbiAxLDczIE0gZGUgY2Fzb3MgYWN1bXVsYWRvcywgbGFzIGVzdHJhdGVnaWFzIHBhcmEgcmVkdWNpciBlbCBjb250YWdpbyBzZSBoYW4gYmFzYWRvIHByaW5jaXBhbG1lbnRlIGVuIHJlZHVjaXIgbGEgbW92aWxpZGFkIGRlIGxhcyBwZXJzb25hcywgcG9yIGVsbG8sIGVsIDEzIGRlIG1hcnpvIHNlIGRlY2xhcsOzIGVsIEVzdGFkbyBkZSBBbGFybWEgY29uIGNvbmZpbmFtaWVudG8gZG9taWNpbGlhcmlvLiBFc3RhIHByaW1lcmEgY3VhcmVudGVuYSBzZSBsZXZhbnTDsyBlbCBwYXNhZG8gMjEgZGUganVuaW8sIGNvbiB1bmEgcmVkdWNjacOzbiBjb25zaWRlcmFibGUgZGUgbG9zIGNhc29zLiBUb2RvIHkgcXVlIGhhIGF1bWVudGFkbyBlbiBsb3MgbWVzZXMgcG9zdGVyaW9yZXMsIGhhY2llbmRvIHJlZmVyZW5jaWEgYSBsYSAic2VndW5kYSBvbGEiIChvIGluY2x1c28sIGFsZ3Vub3MgaGFibGFuIGRlIHVuYSAidGVyY2VyYSBvbGEiKQ0KDQojIyMgNC40IEV2b2x1Y2nDs24gZGUgbG9zIGZhbGxlY2lkb3MgKGEgbml2ZWwgbXVuZGlhbCkNCg0KDQpgYGB7ciBncmFmaWNvTX0NCmxpYnJhcnkoZ2dhbmltYXRlKQ0KbGlicmFyeShwbG90bHkpDQoNCmdyYWZpY29NIDwtIGdncGxvdChtdWVydGVzX2RpYSAsIGFlcyhEaWEgLCBEYWlseV9EZWF0aHMsICBjb2xvcj0gTWVzKSkgICsgZ2VvbV9saW5lKCkgKyBnZW9tX3BvaW50KCkgKw0KICBsYWJzKHRpdGxlID0gIkV2b2x1Y2nDs24gZGUgbXVlcnRlcyBhbCBkw61hIGVuIGVsIG11bmRvIHBvciBDb3ZpZCIsDQogICAgc3VidGl0bGUgPSAiRGVzZGUgZWwgMjQgZGUgRW5lcm8gaGFzdGEgZWwgMzEgZGUgT2N0dWJyZSIsIGNhcHRpb24gPSAiRWxhYm9yYWNpw7NuIHByb3BpYSBjb24gZGF0b3MgDQogICAgZGVsIHJlcG9zaXRvcmlvIENPVklEMTkiLA0KICAgIHkgPSAiTXVlcnRlcyBkaWFyaWFzIiwgeCA9ICJEaWFzIikgKyAgDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKyBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDEsIDMwLCA1KSkgKyANCiAgZmFjZXRfd3JhcCh+ZmFjZXQsIG5yb3cgPSA0LCBuY29sID0gMykgICsgdHJhbnNpdGlvbl9yZXZlYWwoRGlhKQ0KYGBgDQoNCkVuIGVsIHNpZ3VpZW50ZSBjb25qdW50byBkZSBncsOhZmljb3Mgb2JzZXJ2YW1vcyBsYSBldm9sdWNpw7NuIGRlIGxhcyBtdWVydGVzIHBvciBDb3ZpZCBlbiB0b2RvIGVsIG11bmRvLg0KDQpgYGB7ciBlY2hvPSBGQUxTRSwgZXZhbCA9IFRSVUUsIG91dC53aWR0aD0iODAlIn0NCmdyYWZpY29NDQpgYGANCg0KQ29tbyBwb2RlbW9zIG9ic2VydmFyIGVzIGEgcGFydGlyIGRlbCB0ZXJjZXIgbWVzLCBlbCBtZXMgZGUgTWFyem8gY3VhbmRvIGxhcyBtdWVydGVzIGVtcGllemFuIGEgc2VyIHNpZ25pZmljYXRpdmFzIGxsZWdhbmRvIGFsIG3DoXhpbW8gdG90YWwgZW4gQWJyaWwgZG9uZGUgcm96YXJvbiBsYXMgODAwMCBtdWVydGVzIGVuIHVuIGTDjWEuIEEgcGFydGlyIGRlIGFow60geSBlbiB2aXN0YSBkZSBsb3MgZ3LDoWZpY29zIG9ic2VydmFtb3MgcXVlIGxhcyBjaWZyYXMgdGllbmVuIHRlbmRlbmNpYXMgbXV5IHBhcmVjaWRhcywgZXMgZGVjaXIsIHNlIG1hbnRpZW5lIGJhc3RhbnRlIGNvbnN0YW50ZSBlbCBuw7ptZXJvIGRlIGZhbGxlY2lkb3MgZGlhcmlvcyB5IGZsdWN0dWEgZW50cmUgbG9zIDYwMDAgeSBsb3MgNDAwMCBtdWVydG9zIGRpYXJpb3MgY29udGludWFuZG8gZXN0YSB0ZW5kZW5jaWEgaGFzdGEgZWwgbWVzIGRlIE9jdHVicmUuIA0KDQpDYWJlIGHDsWFkaXIgbGEgYWNsYXJhY2nDs24gZGUgcXVlIGFxdcOtIHNlIHJlcHJlc2VudGFuIGVsIG7Dum1lcm8gZGUgZmFsbGVjaWRvcyBhIGVzY2FsYSBtdW5kaWFsIHkgcXVlIGRlbnRybyBkZSBjYWRhIHBhw61zIGhheSBkaWZlcmVuY2lhcywgcHVlZGUgc2VyIHF1ZSBlbiB1biBwYcOtcyBoYXlhIGRpc21pbnVpZG8gZWwgbsO6bWVybyBkZSBtdWVydGVzIGRpYXJpYXMsIG1pZW50cmFzIHF1ZSBlbiBvdHJvIGhheWEgYXVtZW50YWRvLiBBZGVtw6FzLCBhcXXDrSBubyBwb2RlbW9zIGNvbnNpZGVyYXIgcHJpbWVyYSBvbGEgeS9vIHNlZ3VuZGEgb2xhLCBkYWRvIHF1ZSBlbiBjYWRhIHBhw61zIGxhIGV2b2x1Y2nDs24gZGUgbGEgcGFuZGVtw61hIGhhIHNpZG8gdW4gdGFudG8gZGlmZXJlbnRlLCBjb21vIGhlbW9zIHBvZGlkbyBjb21wcm9iYXIgYW50ZXJpb3JtZW50ZSBjb24gY3VhdHJvIHBhw61zZXMgeSBzdXMgcmVzcGVjdGl2YXMgY3VydmFzLg0KDQojIyAgNS4gQ29uY2x1c2lvbmVzIHNvYnJlIGxvcyAiRGF0b3MgZGVsIE11bmRvIi4gey50YWJzZXR9DQoNCiMjIyA8Rk9OVCBDT0xPUj0iRkY0RDAwIj4qKkNvbmNsdXNpb25lcyoqPC9GT05UPg0KDQpFbiBlc3RhIHByaW1lcmEgc2VjY2nDs24gc2UgaGEgcHJldGVuZGlkbyBhbmFsaXphciBsYSBDb3ZpZC0xOSwgYSBuaXZlbCBtdW5kaWFsLg0KQ29tbyBjb25jbHVzaW9uZXMsIHBvZGVtb3MgZXh0cmFlciBxdWUgbGEgcGFuZGVtaWEgc2UgZXN0w6EgKG8geWEgc2UgaGEpIGV4cGFuZGlkbyByYXBpZGFtZW50ZSBwb3IgdG9kbyBlbCBtdW5kby4NCg0KQSB0cmF2w6lzIGRlIGxvcyBkaWZlcmVudGVzIGdyw6FmaWNvcyBoZW1vcyBwb2RpZG8gY29tcHJvYmFyIGNvbW8gbGEgcGFuZGVtw61hIGVzdMOhIGZ1ZXJhIGRlIGNvbnRyb2wgZW4gRXN0YWRvcyBVbmlkb3MsIHNpZW5kbyBlbCBwYcOtcyBsw61kZXIgY29uIG3DoXMgY29udGFnaW9zLiBBIGVzdGUgbGUgc2lndWVuIChhIGTDrWEgZGUgaG95KSwgbGEgSW5kaWEsIEJyYXNpbCB5IFJ1c2lhLg0KDQpBc2ltaXNtbywgY29tbyBjdXJpb3NpZGFkIGNhYmUgZGVzdGFjYXIgcWV1IGVsIHBhw61zIGNvbiBtZW5vcyBjb250YWdpb3MgYSBkw61hIDEvMTIgKDIwMjApIGVzIFZhbmF1dHUsIHVuYSBpc2xhIGRlIE9jZWFuaWEsIHF1ZSBwcmVzZW50YSB0YW4gc29sbyAxIGNhc28uDQoNClBvciBvdHJhIHBhcnRlIHByZXRlbmRlbW9zIG1vc3RyYXIgY29tbyBoYSBhZmVjdGFkbyBsYSBwYW5kZW1pYSBlbiBkaWZlcmVudGVzIHBhw61zZXMsIHBvciBlbGxvIGhlbW9zIGNvZ2lkbyBFRVVVLCBQb3J0dWdhbCwgSmFww7NuIHkgTmlnZXJpYSB5IGhlbW9zIGhlY2hvIHVuYSBzZXJpZSBkZSBncsOhZmljbywgZW4gbG9zIGN1YWxlcyBwb2RlbW9zIGxvcyBkaWZlcmVudGVzIGNhc29zIHBvciBDb3ZpZCBxdWUgaGF5IGFsIGTDrWEuIEVuIGVsIGNhc28gZGUgRUVVVSB5IEphcMOzbiBzZSBvYnNlcnZhcmEgZG9zIHBpY29zIGNsYXJvcy4NCg0KQSBkaWZlcmVuY2lhIGRlIE5pZ2VyaWEsIHBvciBlamVtcGxvLCBkb25kZSBhZGVtw6FzIGRlIHZhbG9yZXMgbcOhcyBiYWpvcyBwb3IgZWwNCm1vbWVudG8gc2UgcHVlZGUgY29uc2lkZXJhciBxdWUgaGEgaGFiaWRvIHNvbG8gInVuYSBvbGEiLiBFbiBlbCBjYXNvIGRlIFBvcnR1Z2FsLCBlbiBsYSBzZWd1bmRhIG9sYSBoYXkgdW4gYXVtZW50byBkZSBsb3MgY29udGFnaW9zLg0KDQpVdGlsaXphbmRvIGVsIHBhcXVldGUgVGlkeWNvdmlkMTkgbm9zIGhhIHBlcm1pdGlkbyBtb3N0cmFyIGRlIG1hbmVyYSByw6FwaWRhIHkgc2VuY2lsbGEgZWwgbsO6bWVybyBkZSBjYXNvcyBkaWFyaW9zIGVuIGRpZmVyZW50ZXMgcGHDrXNlcywgZG9uZGUgc2UgY29uZmlybWEgcXVlIGVuIENoaW5hIGxvcyBjYXNvcyBlcmFuIG3DoXMgYWJ1bmRhbnRlcyBhbCBwcmluY2lwaW8gZGUgbGEgcGFuZGVtaWEuDQoNCkRlIGlndWFsIG1vZG8sIGNvbiBlc3RlIHBhcXVldGUgaGVtb3MgaGVjaG8gZG9zIG1hcGFzLCB1bm8gZGUgbGEgdmFyaWFjacOzbiBkZSBsYXMgbXVlcnRlcyBwb3IgY2FkYSAxMDAgbWlsIGhhYml0YW50ZXMgZSBpZ3VhbCBwYXJhIGVsIG7Dum1lcm8gZGUgY2Fzb3MsIGRvbmRlIHNlIGNvbmZpcm1hIHRhbWJpw6luIGxvIGNvbWVudGFkbyBwcmV2aWFtZW50ZS4gKEFkZW3DoXMsICBwb2RlbW9zIG9ic2VydmFyIHF1ZSBlbCBjb250aW5lbnRlIG9jZcOhbmljbyB5IGFmcmljYW5vIHNvbiBsb3MgcXVlIG1lbm9zIGNhc29zIHkgbXVlcnRlcyBwcmVzZW50YW4pDQoNClBvciDDumx0aW1vLCBjb24gZWwgZmluIGRlIG1vc3RyYXIgbGEgZXZvbHVjacOzbiBkZSBsb3MgZmFsbGVjaWRvcyBoZW1vcyBoZWNobyB1biBncsOhZmljbywgZW4gZWwgY3VhbCBzZSBvYnNlcnZhIGNvbW8gZW4gbWFyem8gbGEgdGVuZGVuY2lhIGVyYSBhbGNpc3RhLCBtaWVudHJhcyBlbiBsb3MgbWVzZXMgcmVzdGFudGVzIHBhcmVjZSBvc2NpbGFyIGVuIGxhcyBtaXNtYXMgY2lmcmFzLCB1biBuaXZlbCBhbHRvIHkgcHJlb2N1cGFudGUuDQoNCihQYXJhIHZlciBsb3MgY2Fzb3MsIG11ZXJ0ZXMgeSByZWN1cGVyYWRvcyBkZSBtYW5lcmEgZGluw6FtaWNhIHBvZGVtb3MgdmVyIGVsIFtMaXZlTWFwXSkNCg0KIyMjIDxGT05UIENPTE9SPSJGRjREMDAiPioqTGl2ZSBNYXAqKjwvRk9OVD4gDQoNCkVuIGVzdGUgYXBhcnRhZG8gc2UgbXVlc3RyYSB1bmEgYm9sYSBkZWwgbXVuZG8gZGluw6FtaWNhLiBFbiBlbGxhIHNlIHJlY29nZSBlbCBuw7ptZXJvIGRlIG11ZXJ0ZXMsIGZhbGxlY2lkb3MgeSByZWN1cGVyYWRvcyBwYXJhIGNhZGEgcGHDrXMsIGNvbW8gcG9kZW1vcyBvYnNlcnZhci4NCg0KTG9zIGRhdG9zIHByb3ZpZW5lbiBkZWwgQ2VudHJvIGRlIGNpZW5jaWEgZSBpbmdlbmllcsOtYSBkZSBzaXN0ZW1hcyAoSkhVIENTU0UpIGRlIGxhIFVuaXZlcnNpZGFkIEpvaG5zIEhvcGtpbnMuDQoNClNlIGFjdHVhbGl6YW4gY2FkYSBkw61hIHkgc2Ugb2J0aWVuZSByYXBpZGFtZW50ZSBncmFjaWFzIGEgbGEgZnVuY2nDs24gKipsaXZlLm1hcCoqIGRlbCBwYXF1ZXRlOiAqKmNvdmlkMTkuYW5hbHl0aWNzKiouIA0KDQpgYGB7cn0NCg0KbGlicmFyeShjb3ZpZDE5LmFuYWx5dGljcykNCg0KbGlicmFyeSh0aWR5dmVyc2UpDQoNCmRhdGEgPC0gY292aWQxOS5kYXRhKCkNCg0KZGF0YSA8LWRhdGEgJT4lDQogICAgICAgc2VsZWN0KC1jKEZJUFMsQWRtaW4yLENvbWJpbmVkX0tleSkpICU+JQ0KICAgICAgIHJlbG9jYXRlKExhdCwgLmFmdGVyPUNhc2VfRmF0YWxpdHlfUmF0aW8pICU+JSAgICAgIHJlbG9jYXRlKExvbmdfLCAuYWZ0ZXI9TGF0KQ0KYGBgDQoNCg0KYGBge3Igb3V0LndpZHRoPSIxMDAlIiwgZXZhbCA9IFRSVUUsIGVjaG89IEZBTFNFfQ0KbGl2ZS5tYXAoZGF0YSwgdGl0bGUgPSAiQ09ST05BVklSVVMgRU4gRUwgTVVORE8iLCBuby5sZWdlbmQgPSBUUlVFKQ0KYGBgDQoNCg0KIyMgNi4gRXN0dWRpbyBzb2JyZSBsb3MgKipkYXRvcyBkZSBFU1BBw5FBKioNCg0KIyMjIDYuMSBEYXRvcyBkZSBpbnRlcsOpcw0KDQo8YnI+DQoqKsK/Q1XDgUwgRlVFIExBIEVWT0xVQ0nDk04gREUgTE9TIENPTlRBR0lPUyBEVVJBTlRFIExPUyA2IFBSSU1FUk9TIE1FU0VTPyoqDQoNCg0KYGBge3J9DQojVGFibGEgcGFyYSBwb2RlciBpbnRlcnByZXRhciBlbCBncsOhZmljbyB5IGNvbnN1bHRhciBtw6FzIGRhdG9zDQoNCmRmX211bmRvRTwtIGRmX211bmRvICU+JSBmaWx0ZXIoYENvdW50cnkvUmVnaW9uYCA9PSAiU3BhaW4iKSAlPiUgc2VsZWN0KC1jKFJlY292ZXJlZCwgRGVhdGhzKSkNCg0KZGZfbXVuZG9FRSA8LSBkZl9tdW5kb0UgJT4lIHN1bW1hcmlzZShkaWYgPSBkaWZmKENvbmZpcm1lZCkpDQpkZkUgPC0gZGZfbXVuZG9FICU+JSBzZWxlY3QoYENvdW50cnkvUmVnaW9uYCxEaWEsIE1lcykNCg0KZGZfbXVuZG9Fc3A8LSBkZl9tdW5kbyAlPiUgZmlsdGVyKGBDb3VudHJ5L1JlZ2lvbmAgPT0gIlNwYWluIikgJT4lIHNsaWNlKC0xKQ0KDQojSGVtb3MgcXVpdGFkb3MgZG9zIGRlIGxvcyBkYXRvcyBtb3N0cmFkb3MsIHlhIHF1ZSBkaXN0b3JzaW9uYW4gbGEgZ3LDoWZpY2EuIChTb24gZGF0b3Mgbm8gY29ycmVjdG9zIHF1ZSBjb250aWVuZW4gdmFsb3IgMCkNClVuaW9uIDwtIGJpbmRfY29scyhkZl9tdW5kb0VzcCwgZGZfbXVuZG9FRSkNClVuaW9uIDwtIFVuaW9uICU+JSBzbGljZSgtOTMpDQpVbmlvbiA8LSBVbmlvbiAlPiUgc2xpY2UoLTExNSkNClVuaW9uIDwtIFVuaW9uICU+JSBzbGljZSgtMTIyKQ0KVW5pb24gPC0gVW5pb24gJT4lIHNsaWNlKC0xMjQpDQpVbmlvbiA8LSBVbmlvbiAlPiUgc2xpY2UoLTUwKQ0KVW5pb24gPC0gVW5pb24gJT4lIG11dGF0ZShyYW5raW5nID0gcm93X251bWJlcigpKQ0KDQpVbmlvbiA8LSBVbmlvbiAgJT4lIHNlbGVjdChPcmRlbj0icmFua2luZyIsIERpYSwgTWVzLCBgQ29udGFnaW9zL2RpYWAgPSAiZGlmIiwgQ29uZmlybWFkb3NUPSJDb25maXJtZWQiLCBSZWN1cGVyYWRvc1Q9IlJlY292ZXJlZCIsIE11ZXJ0ZXNUPSJEZWF0aHMiKQ0KYGBgDQoNCg0KICoqVEFCTEEgUkVTVU1FTioqDQpgYGB7cn0NCiNFbiBsYSBzaWd1aWVudGUgdGFibGEgc2UgbXVldHJhIHBhcmEgRXNwYcOxYSBlbCBuw7ptZXJvIGRlIGNvbnRhZ2lvcyBhbCBkw61hIHF1ZSBodWJvIGVuIHRhbCBmZWNoYSB5IGVsIG7Dum1lcm8gZGUgY29udGFnaW9zLCBtdWVydGVzIG8gcmVjdXBlcmFkb3MgYWN1bXVsYWRvcy4gSGF5IHF1ZSBwb25lciB1bmEgbm90YSBkZSBww6Fnb25hIGRpY2llbmRvIHF1ZSBhIHBhcnRpciBkZSBqdWxpbyBsb3MgZmluZXMgZGUgc2VtYW5hIG51bSBkZSBjb250YWdpb3MvZGlhIHNhbGUgY29tbyAwKQ0KDQpsaWJyYXJ5KHJlYWN0YWJsZSkNCnJlYWN0YWJsZShVbmlvbiwgZGVmYXVsdFBhZ2VTaXplID0gIDEwLCAgcGFnaW5hdGlvblR5cGUgPSAianVtcCIsIHNob3dQYWdlU2l6ZU9wdGlvbnMgPSAgVFJVRSAsIHBhZ2VTaXplT3B0aW9ucyA9ICBjICggMTAgLCA1MCAsIDEwMCApLGRlZmF1bHRDb2xEZWYgPSBjb2xEZWYoDQogICAgYWxpZ24gPSAiY2VudGVyIiwNCiAgICBtaW5XaWR0aCA9IDcwLA0KICAgIGhlYWRlclN0eWxlID0gbGlzdChiYWNrZ3JvdW5kID0gImxpZ2h0Z3JlZW4iKSwNCiAgICBmaWx0ZXJhYmxlID0gVFJVRSksICBoaWdobGlnaHQgPSBUUlVFLCBvdXRsaW5lZCA9IFRSVUUsDQogICAgY29sdW1ucyA9IGxpc3QoDQogIGBDb250YWdpb3MvZGlhYCA9IGNvbERlZihzdHlsZSA9IGZ1bmN0aW9uKHZhbHVlKSB7DQogICAgaWYgKHZhbHVlID4gMCkgew0KICAgICAgY29sb3IgPC0gIiNlMDAwMDAifQ0KICAgICAgZWxzZSB7DQogICAgICBjb2xvciA8LSAiIzAwODAwMCINCiAgICB9DQogICAgbGlzdChjb2xvciA9IGNvbG9yLCBmb250V2VpZ2h0ID0gImJvbGQiKQ0KICB9KSkpDQpgYGANCipIYXkgcXVlIHRlbmVyIGVuIGN1ZW50YSBxdWUgYSBwYXJ0aXIgZGUganVsaW8gbG9zIGRhdG9zIGVuIGZpbiBkZSBzZW1hbmEgdGllbmVuIHVuIHZhbG9yIGRlIDAsIG5vIG9ic3RhbnRlLCBkZWJlcsOtYW4gb2J2aWFyc2UgYWwgY29uc3VsdGFyIGxvcyBkYXRvcyBlbiBsYSB0YWJsYSwgeWEgcXVlIG5vIHJlc3VsdGFuIGNvaGVyZW50ZXMuICANCg0KQSBwYXJ0aXIgZGUgbG9zIGRhdG9zIHJlcHJlc2VudGFkb3MgZW4gbGEgdGFibGEgYW50ZXJvciwgaGVtb3MgaGVjaG8gZWwgc2lndWllbnRlIGdyw6FmaWNvLCBlbiDDqWwgc2UgbXVlc3RyYSBsYSBldm9sdWNpw7NuIGRlIGxvcyBjb250YWdpb3MgZGUgQ292aWQgZW4gRXNwYcOxYSBkZXNkZSBlbmVybyBoYXN0YSBqdW5pbyBbXjRdDQoNClBvZGVtb3Mgb2JzZXJ2YXIsIHBvciB0YW50bywgIGxhICJjdXJ2YSIgZGUgbGEgPEZPTlQgQ09MT1I9IkZGNEQwMCI+KipQcmltZXJhIE9MQSoqPC9GT05UPg0KDQpgYGB7cn0NCiNHcsOhZmljbyBkZSBsYSBldm9sdWNpw7NuIGRlIGxvcyBjb250YWdpb3MgZW4gRXNwYcOxYSBkZXMgZGUgZW5lcm8gaGFzdGEganVuaW8uIEhlIGNvZ2lkbyBlc3RvcyBtZXNlcywgcG9ycXVlIGEgcGFydGlyIGRlIGp1bGlvLCBsb3MgZGF0b3MgZGUgbG9zIGZpbmVzIGRlIHNlbWFuYSBzb24gMCwgcG9yIGxvIHF1ZSBlbCBncsOhZmljbyBxdWUgc2FsZSBubyByZXByZXNlbnRhIHJlYWxtZW50ZSBlbCBuw7ptZXJvIGRlIGNvbnRhZ2lvcy4NCg0KZGZfbXVuZG9FPC0gZGZfbXVuZG8gJT4lIGZpbHRlcihgQ291bnRyeS9SZWdpb25gID09ICJTcGFpbiIpICU+JSBzZWxlY3QoLWMoUmVjb3ZlcmVkLCBEZWF0aHMpKQ0KDQpkZl9tdW5kb0VFIDwtIGRmX211bmRvRSAlPiUgc3VtbWFyaXNlKGRpZiA9IGRpZmYoQ29uZmlybWVkKSkNCmRmRSA8LSBkZl9tdW5kb0UgJT4lIHNlbGVjdChgQ291bnRyeS9SZWdpb25gLERpYSwgTWVzKQ0KDQpkZkUgPC0gZGZFICU+JSBzbGljZSgtMSkNCmEgPC0gYmluZF9jb2xzKGRmRSwgZGZfbXVuZG9FRSkNCmIgPC0gYSAlPiUgZmlsdGVyKE1lcyAlaW4lIGMoIjAxIiwgIjAyIiwgIjAzIiwgIjA0IiwgIjA1IiwgIjA2IikpDQoNCmIgPC0gYiU+JSBzbGljZSgtOTMpIA0KYiA8LSBiJT4lIHNsaWNlKC0xMTUpDQpiIDwtIGIgJT4lIHNsaWNlKC0xMjIpDQpiIDwtIGIgJT4lIHNsaWNlKC0xMjQpDQpiIDwtIGIlPiUgc2xpY2UoLTUwKQ0KYiA8LSBiICU+JSBtdXRhdGUocmFua2luZyA9IHJvd19udW1iZXIoKSkNCg0KZzYgPC0gZ2dwbG90KGIsIGFlcyhyYW5raW5nLCBkaWYsIGNvbG9yID0gTWVzKSkgKyBnZW9tX2xpbmUoKSArIGxhYnModGl0bGUgPSAiRXZvbHVjacOzbiBjb250YWdpb3MgQ292aWQtMTkiLCBzdWJ0aXRsZSA9ICJEZSBlbmVybyBhIGp1bmlvICgyMDIwKSIsIGNhcHRpb24gPSAiRWxhYm9yYWNpw7NuIHByb3BpYSIsIHggPSBOVUxMLCB5ID0gIk7CuiBjYXNvcyBhbCBkw61hIikgKyAgdGhlbWVfYncoKSArIHRoZW1lKGF4aXMudGV4dC54PWVsZW1lbnRfYmxhbmsoKSwgYXhpcy50aWNrcy54PWVsZW1lbnRfYmxhbmsoKSkgICsgIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKSArIHRoZW1lKHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKQ0KDQpsaWJyYXJ5KHBsb3RseSkNCmBgYA0KDQoNCmBgYHtyIG91dC53aWR0aD0iMTAwJSIsIG91dC5oZWlnaHQ9IjUwJSIsIGVjaG89RkFMU0UsIGV2YWw9VFJVRX0NCmdncGxvdGx5KGc2KQ0KYGBgDQoNCjxzdHlsZT4NCmRpdi5ibHVlIHsgYmFja2dyb3VuZC1jb2xvcjojYjFmZmEzOyBib3JkZXItcmFkaXVzOiA1cHg7IHBhZGRpbmc6IDIwcHg7fQ0KPC9zdHlsZT4NCjxkaXYgY2xhc3MgPSAiYmx1ZSI+DQoNCioqSW50ZXJwcmV0YWNpw7NuIGRlbCBncsOhZmljbyoqDQpFbiBlc3RlIHNlIG11ZXN0cmEgbGEgZXZvbHVjacOzbiBkZSBsb3MgY29udGFnaW9zIHBvciBDb3ZpZC0xOSBlbiBFc3Bhw7FhIGR1cmFudGUgbG9zIDYgcHJpbWVyb3MgbWVzZXMsbG9zIGRhdG9zIHZhbiBjb25jcmV0YW1lbnRlIGRlc2RlIGVsIDIzIGRlIGVuZXJvIGhhc3RhIGVsIDMwIGRlIGp1bmlvLCAgYWRlbcOhcyBzZSBvYnNlcnZhbiA2IGNvbG9yZXMgZGlmZXJlbnRlcywgY29ycmVzcG9uZGllbnRlcyBhIGxvcyAoNikgbWVzZXMuIA0KRXN0YSByZXByZXNlbnRhZG8gZGUgbGEgc2lndWllbnRlIG1hbmVyYTogRW4gZWwgZWplIGRlIGxhcyBvcmRlbmFkYXMgc2UgbWV1c3RyYSBlbCBuw7ptZXJvIGRlIGNhc29zIGFsIGTDrWEgeSBlbiBlbCBkZSBsYXMgYWJjaXNhcyB1biAicmFua2luZyIsIGVzdGUgY29ycmVzcG9uZGUgYSBsYSBmaWxhIGRlIGxhIHRhYmxhIHJlcHJlc2VudGFkYSBhcnJpYmEsIGVuIGxhIHZhcmlhYmxlICJvcmRlbiIuDQoNCioqRWplbXBsbyoqOiBfX1JhbmtpbmcgNTksIGNvbnRhZ2lvcyBhbCBkw61hOiAzMzk0IHkgbWVzIDAzLl9fIFBhcmEgdmVyIGEgcXVlIGTDrWEgY29ycmVzcG9uZGUgZXN0ZSB2YWxvciBpcmlhbW9zIGEgbGEgW1RhYmxhIFJlc3VtZW5dIHkgdmVtb3MgcXVlIGNvcnJlc3BvbmRlIGNvbiBlbCBkw61hIDIyIChkZSBtYXJ6bykgQWRlbcOhcywgb2J0ZW5lbW9zIG90cm9zIGRhdG9zIGNvbW8gZWwgbsO6bWVybyBkZSBjb25maXJtYWRvcyB0b3RhbGVzIGhhc3RhIGVzZSBkw61hLCByZWN1cGVyYWRvcyBvIG11ZXJ0ZXMuDQoNCjwvZGl2Pg0KDQo8YnI+DQpBc2ltaXNtbywgY2FiZSBoYWNlciB1bmEgaW50ZXJwcmV0YWNpw7NuIGRlIGxvcyByZXN1bHRhZG9zIG9idGVuaWRvcyBkZSBtYW5lcmEgcXVlLCBjb21vIHBvZGVtb3Mgb2JzZXJ2YXIgZW4gZWwgZ3LDoWZpY28gZWwgYXVtZW50byBlbiBlbCBtZXMgZGUgTWFyem8gZXMgaW5jcmXDrWJsZSBwYXNhbmRvIGRlIGxvcyAwIGNhc29zIGEgY2VyY2EgZGUgMTAwMDAgcG9zaXRpdm9zIGVuIHVuIHNvbG8gZMOtYSwgYSByYcOteiBkZSBlc3RlIGF1bWVudG8gdGFuIG1hcmNhZG8sIGVsIGdvYmllcm5vIGRlY2lkacOzIGFwbGljYXIgdW4gY29uanVudG8gZGUgbWVkaWRhcyBlbnRyZSBsYXMgcXVlIGVzdGFiYSBlbCBjb25maW5hbWllbnRvIGRvbWljaWxpYXJpbyBwYXJhIHRvZGEgbGEgcG9ibGFjacOzbiB5IHF1ZSBjb21vIHBvZGVtb3Mgb2JzZXJ2YXIgdHV2byBiYXN0YW50ZSBlZmVjdG8sIHlhIHF1ZSBlbCBuw7ptZXJvIGRlIGNvbnRhZ2lvcyBkZXNjZW5kacOzIGRlIG1hbmVyYSBjb25zaWRlcmFibGUgZW4gQWJyaWwuIEVzIGNpZXJ0bywgbm8gb2JzdGFudGUsIHF1ZSBlbiBlc3RlIG1pc21vIG1lcyBzZSBkaWVyb24gZGl2ZXJzb3MgcGljb3MgZGUgY29udGFnaW9zIHBlcm8gbGEgdGVuZGVuY2lhIGEgcGFydGlyIGRlIGVzdGUgbWVzLCBBYnJpbCwgZnVlIGxhIHJlZHVjY2nDs24gZGUgbG9zIGNhc29zLCBhY2Fiw6FuZG9zZSBkZSBjb25maXJtYXIgY29uIGxhIHRlbmRlbmNpYSBlbiBNYXlvIHkgZW4gSnVuaW8gIG9idGVuaWVuZG8gdmFsb3JlcyBkZSBjb250YWdpb3MgbXV5IHJlZHVjaWRvcyBlbiBjb21wYXJhY2nDs24gY29uIG1lc2VzIHByZXZpb3MuIA0KDQojIyMgNi4yIFNhdHVyYWNpw7NuIGRlbCBzaXN0ZW1hIHNhbml0YXJpbyBlc3Bhw7FvbA0KDQpFbiBlc3RlIGFwYXJ0YWRvIHNlIGFuYWxpemFyw6EgbGEgKipldm9sdWNpw7NuKiogZGUgbG9zICoqcGFjaWVudGVzICBpbmdyZXNhZG9zIHBvciBDb3ZpZCBkdXJhbnRlIGxhcyDDumx0aW1hcyAyNCBob3JhcyBlbiBsb3MgbWVzZXMgZGUgc2VwdGllbWJyZS1vY3R1YnJlIHkgbm92aWVtYnJlKiouIEFzw60gY29tbyBsb3MgZGFkb3MgZGUgYWx0YSBhbCBkw61hLCB0YW1iacOpbiBkdXJhbnRlIGVzdG9zIG1lc2VzLg0KDQpgYGB7cn0NCmRhdG9zX0NDQUEgPC0gZGF0b3NfQ0NBQSAlPiUNCiAgcmVsb2NhdGUoQcOxbywgLmFmdGVyPURpYSkgJT4lDQogIHJlbG9jYXRlKE1lcywgLmFmdGVyPURpYSkNCg0KZGF0b3NfRXNwIDwtIGRhdG9zX0NDQUEgJT4lDQogIGZpbHRlcihjb2RfaW5lID09IDApICU+JQ0KICByZWxvY2F0ZShjb2RfaW5lLCAuYmVmb3JlPURpYSkgICNEYXRvcyBwYXJhIEVzcGHDsWEuDQoNCmRhdG9zX0NWIDwtIGRhdG9zX0NDQUEgJT4lDQogIGZpbHRlcihjb2RfaW5lID09IDEwKSAlPiUNCiAgcmVsb2NhdGUoY29kX2luZSwgLmJlZm9yZT1EaWEpICNEYXRvcyBwYXJhIGxhIENvbXVuaXRhdCBWYWxlbmNpYW5hLg0KDQpkYXRvc19Fc3BfU19OIDwtIGRhdG9zX0VzcCAlPiUgZmlsdGVyIChNZXMgPT0gIjA5InwgTWVzID09ICIxMCJ8IE1lcyA9PSAiMTEiKQ0KDQpkYXRvc19DVl9TX048LSBkYXRvc19DViAlPiUgZmlsdGVyIChNZXMgPT0gIjA5InwgTWVzID09ICIxMCJ8IE1lcyA9PSAiMTEiKQ0KDQpkYXRvc19Fc3BfTiA8LSBkYXRvc19Fc3AgJT4lIGZpbHRlcihNZXMgPT0gIjExIikNCmBgYA0KDQoqKkVWT0xVQ0nDk04gREUgTE9TIFBBQ0lFTlRFUyBJTkdSRVNBRE9TIFBPUiBDT1ZJRC0xOSoqDQpgYGB7cn0NCmdyYWZpY29fMSA8LSBnZ3Bsb3QoZGF0b3NfRXNwX1NfTiAsIGFlcyhEaWEgLCBgVG90YWwgUGFjaWVudGVzIENPVklEIGluZ3Jlc2Fkb3NgLCBncm91cD1NZXMsIGNvbG9yPSBNZXMpKSAgKyBnZW9tX2xpbmUoKSArIGxhYnModGl0bGUgPSAiIEV2b2x1Y2nDs24gZGUgcGFjaWVudGVzIGluZ3Jlc2Fkb3MgcG9yIGNvdmlkIGVuIEVzcGHDsWEiLCBzdWJ0aXRsZSA9ICJEZXNkZSBlbCAxIFNlcHRpZW1icmUgaGFzdGEgTm92aWVtYnJlIDMwIiwgY2FwdGlvbiA9ICJEYXRvcyByZXBvc2l0b3JpbyBDT1ZJRDE5IikNCmBgYA0KDQpgYGB7ciBvdXQud2lkdGg9IjcwJSIsIGVjaG89RkFMU0UsIGV2YWwgPSBUUlVFfQ0KZ3JhZmljb18xDQpgYGANCg0KRW4gZWwgYW50ZXJpb3IgZ3LDoWZpY28gdmVtb3MgdHJlcyBsw61uZWFzIHF1ZSBtdWVzdHJhbiBsb3MgZGF0b3MgcmVmZXJlbnRlcyBhIGxvcyBwYWNpZW50ZXMgaW5ncmVzYWRvcyBwb3IgQ292aWQtMTkgZW4gRXNwYcOxYSBlbiBsb3MgbWVzZXMgZGUgU2VwdGllbWJyZSgwOSkgT2N0dWJyZSgxMCkgeSBOb3ZpZW1icmUoMTEpLiANCg0KRXN0b3MgbWVzZXMgYWdydXBhbiBsbyBxdWUgaGEgc2lkbyBsYSAqKnNlZ3VuZGEgb2xhKiouIERhZG8gcXVlIG9ic2VydmFtb3MgdW4gYXVtZW50byBtYW50ZW5pZG8gZW4gU2VwdGllbWJyZSAoZGVsIG5pdmVsIGRlIGluZ3Jlc28gaG9zcGl0YWxhcmlvIHBvciBDb3ZpZCksIHF1ZSBhIG1lZGlhZG9zIGRlIE9jdHVicmUgYXVtZW50YSBkZSBtYW5lcmEgbXV5IHByb251bmNpYWRhLCBjYXNpIGR1cGxpY2FuZG8gbGEgcXVlIGhhYsOtYSBhbCBwcmluY2lwaW8gZGVsIG1lcy4gRW4gTm92aWVtYnJlLCByZXByZXNlbnRhZG8gcG9yIGxhIGzDrW5lYSBhenVsLCBvYnNlcnZhbW9zIHF1ZSBwcmltZXJhbWVudGUgbG9zIGluZ3Jlc29zIGNvbnRpbsO6YW4gYXVtZW50YW5kbywgcGVybyBhIHZlbW9zIHF1ZSBsYSB0ZW5kZW5jaWEgYSBwYXJ0aXIgZGVsIGTDrWEgMTAgZW1waWV6YW4gYSBkaXNtaW51aXIsIHBhc2FuZG8gZGUgdW4gbcOheGltbyBkZSBtYXMgZGUgMjAwMDAgYSBtZW5vcyBkZSAxNTAwMCBlbiBhIHBlbmFzIDE1IGTDrWFzLiBZIHNpdHVhbmRvc2UgYSBmaW5hbGVzIGRlIG1lcywgZW4gdW4gbml2ZWwgbcOhcyBiYWpvIHF1ZSBsb3MgaW5ncmVzYWRvcyBxdWUgaGFiw61hbiBlbiBlc3RvcyBkw61hcyB1biBtZXMgYW50ZXMsIGVuIG9jdHVicmUuDQoNCmBgYHtyfQ0KZ3JhZmljb19hIDwtIGdncGxvdChkYXRvc19Fc3BfTiwgYWVzKERpYSwgYEFsdGFzIFVsdDI0aGAsICAgZmlsbCA9IE1lcyApKSArICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlPSJTcGVjdHJhbCIpICsgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIpKyANCiAgbGFicyh0aXRsZSA9ICJOw7ptZXJvIGRlIHBhY2llbnRlcyBkYWRvcyBkZSBhbHRhIHBvciBDT1ZJRCBlbiBFc3Bhw7FhIGFsIGTDrWEiLCBzdWJ0aXRsZSA9ICJNZXMgTm92aWVtYnJlIiwgY2FwdGlvbiA9ICJFbGFib3JhY2nDs24gcHJvcGlhIGEgcGFydGlyIGRlIGRhdG9zIENPVklEMTkiKSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikNCg0KDQpncmFmaWNvX2FwIDwtIGdyYWZpY29fYSArIA0KICBnZW9tX3RleHQoYWVzKHk9YEFsdGFzIFVsdDI0aGAsIA0KICAgIGxhYmVsID0gYEFsdGFzIFVsdDI0aGApLCBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC44KSwgDQogICAgc2l6ZSA9IDMuMiwgdmp1c3Q9MywgY29sID0gIkJsYWNrIikNCmBgYA0KDQoNCmBgYHtyIG91dC53aWR0aD0iNzAlIiwgZWNobyA9IEZBTFNFLCBldmFsPSBUUlVFfQ0KZ3JhZmljb19hcA0KYGBgDQoNCkR1cmFudGUgZWwgbWVzIGRlIE5vdmllbWJyZSB2ZW1vcyBxdWUgZWwgbnVtZXJvIGRlIHBhY2llbnRlcyBkYWRvcyBkZSBhbHRhIGVzIGJhc3RhbnRlIGVsZXZhZG8sIGxvcyBkw61hcyBxdWUgbGEgY2lmcmEgc2UgcmVkdWNlIGNvaW5jaWRlIGNvbiBsb3MgRG9taW5nb3MgZGUgY2FkYSBtZXMsIGRhZG8gcXVlIGVzdG9zIGTDrWFzLCBwb3IgbG8gZ2VuZXJhbCwgZWwgbsO6bWVybyBkZSBhbHRhcyBzdWVsZSBzZXIgbWVub3IuDQpBZGVtw6FzIGFsIHZlbmlyIGRlIHVuYSBzaXR1YWNpw7NuIGRlIG11Y2hvcyBwb3NpdGl2b3Mgbm8gZXMgZGUgZXh0cmHDsWFyIHF1ZSBlbCBuw7ptZXJvIGRlIGFsdGFzIHJvbmRlIHVuYSBjaWZyYSBkZSAyMDAwIGFsdGFzIGRpYXJpYXMuDQoNCmBgYHtyfQ0KI1ByZXBhcmFtb3MgbG9zIGRhdG9zIHBhcmEgaGFjZXIgdW5hIFRBQkxBDQpkYXRvc19DQ0FBX1NfTiA8LSBkYXRvc19DQ0FBICU+JSBmaWx0ZXIgKE1lcyA9PSAiMDkifCBNZXMgPT0gIjEwInwgTWVzID09ICIxMSIpDQoNCmRhdG9zX0NDQUFfeWFsdGFzIDwtIGRhdG9zX0NDQUFfU19OICU+JSBtdXRhdGUoYCVBbHRhcyBwb3IgaW5ncmVzYWRvc2AgID0gKGBBbHRhcyBVbHQyNGhgLyBgVG90YWwgUGFjaWVudGVzIENPVklEIGluZ3Jlc2Fkb3NgKSogMTAwKQ0KDQpkYXRvc19DQ0FBX3lhbHRhcyA8LSBkYXRvc19DQ0FBX3lhbHRhcyAlPiUgc2VsZWN0KERpYSwgTWVzLCBDQ0FBLCBgVG90YWwgUGFjaWVudGVzIENPVklEIGluZ3Jlc2Fkb3NgLCBgJSBDYW1hcyBPY3VwYWRhcyBDT1ZJRGAsIGBUb3RhbCBwYWNpZW50ZXMgQ09WSUQgZW4gVUNJYCwgYCVBbHRhcyBwb3IgaW5ncmVzYWRvc2ApDQpgYGANCg0KYGBge3IgZWNobyA9IEZBTFNFLCBldmFsID0gVFJVRX0NCg0KRFQ6OmRhdGF0YWJsZShkYXRvc19DQ0FBX3lhbHRhcywgZmlsdGVyID0gJ3RvcCcsDQogICAgICAgICAgICAgIG9wdGlvbnMgPSBsaXN0KHBhZ2VMZW5ndGggPSAxMCAsIGF1dG9XaWR0aCA9IFRSVUUgKSkNCmBgYA0KDQojIyMgNi4zIFBydWViYXMgcmVhbGl6YWRhcyBlbiBsYXMgQ0NBQQ0KDQoqKsK/Q3XDoW50YXMgUENSJ3Mgc2UgaGFuIGhlY2hvIHBvciBjYWRhIG1pbCBoYWJpdGFudGVzPyoqDQoNCkNvcnJlc3BvbmRlbiBhIGxvcyDDumx0aW1vcyBkYXRvcyBkaXNwb25pYmxlcy4NCkFzaW1pc21vLCBsYXMgQ29tdW5pZGFkZXMgQXV0w7Nub21hcyBjb24gdW4gbWF5b3IgdGFtYcOxbywgc29uIGFxdWVsbGFzIGVuIGxhcyBxdWUgc2UgcmVhbGl6YXJvbiBtw6FzIHBydWViYXMgcG9yIGNhZGEgMTAwbWlsIGhhYml0YW50ZXMuIChMb3MgZGF0b3Mgc29uIGFjdW11bGFkb3MpDQoNCmBgYHtyICBvdXQud2lkdGggPSAiNjAlIn0NCmxpYnJhcnkod29yZGNsb3VkMikNCg0KZGZDQ0FBcCA8LSBkZkNDQUEgJT4lIHNlbGVjdChkaWEsIG1lcywgQ0NBQSwgUENSX3hfMTAwMGhhYi4pICU+JSBmaWx0ZXIoZGlhID09ICI1IikgJT4lIGZpbHRlcihtZXMgPT0gIjExIikgJT4lIGFycmFuZ2UoZGVzYyhQQ1JfeF8xMDAwaGFiLikpDQpkZkNDQUFwIDwtIGRmQ0NBQXAgJT4lIHNlbGVjdChDQ0FBLCBQQ1JfeF8xMDAwaGFiLikNCg0Kd29yZGNsb3VkMihkYXRhID0gZGZDQ0FBcCwgc2l6ZSA9IDAuNCkNCmBgYA0KDQpBaG9yYSB2YW1vcyBhIHZlcmxvIG1lZGlhbnRlIGdyw6FmaWNvcywgYXPDrSBwb2RyZW1vcyB2ZXIgbGFzIFBDUidzIGFjdW11bGFkYXMgZW4gdG90YWwgeSBsYXMgcmVhbGl6YWRhcyBwYXJhIGNhZGEgMTAwMGhhYml0YW50ZXMuIA0KDQpgYGB7cn0NClBydWViYXNQIDwtIGdncGxvdChkZkNDQUEsIGFlcyhtZXMsIFBDUl94XzEwMDBoYWIuLCBmaWxsID0gQ0NBQSkpICsgZ2VvbV9jb2wocG9zaXRpb24gPSAiZG9kZ2UiKQ0KDQpQQ1JzIDwtIFBydWViYXNQICsgIGZhY2V0X3dyYXAodmFycyhDQ0FBKSkgKyBsYWJzKHggPSAiTWVzIiwgeSA9ICJOw7ptLiBwcnVlYmFzIFBDUiIsIHRpdGxlID0gIlBDUidzIGFsIG1lcyBwb3IgY2FkYSBtaWwgaGFiLiIsIGNhcHRpb24gPSAiRGF0b3Mgb2J0ZW5pZG9zIGRlIERhdGFkaXN0YSIpICArIHRoZW1lX2J3KCkgKyBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzPWZ1bmN0aW9uKG4pe2Zvcm1hdChuLCBzY2llbnRpZmljID0gRkFMU0UpfSkgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpDQpgYGANCg0KYGBge3J9DQpncmFmaWNvQiA8LSBnZ3Bsb3QoZGZDQ0FBLCBhZXMobWVzLCBQQ1IsIGZpbGwgPSBDQ0FBKSkgKyBnZW9tX2NvbChwb3NpdGlvbiA9ICJkb2RnZSIpDQoNCmIgPC0gZ3JhZmljb0IgKyAgZmFjZXRfd3JhcCh2YXJzKENDQUEpKSArIGxhYnMoeCA9ICJNZXMiLCB5ID0gIk7Dum0uIHBydWViYXMgUENSIiwgdGl0bGUgPSAiUENSJ3MgbWVuc3VhbGVzIikgKyB0aGVtZV9idygpICsgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscz1mdW5jdGlvbihuKXtmb3JtYXQobiwgc2NpZW50aWZpYyA9IEZBTFNFKX0pICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKQ0KI0Fob3JhIGNvbiBlbCBwYXF1ZXRlIHBhdGNod29yayBqdW50YW1vcyBsb3MgZG9zIGdyw6FmaWNvcw0KYGBgDQoNCmBgYHtyIGVjaG89RkFMU0UsIGV2YWw9VFJVRSwgb3V0LndpZHRoPSI5MCUifQ0KYiArIFBDUnMNCmBgYA0KDQpFbiBlc3RlIGNhc28gaGVtb3MgYWp1c3RhZGFvIGxhIGVzY2FsYSBkZSB4IHBhcmEgcXVlIGNvaW5jaWRhIGVuIHRvZGFzIGxhcyBDQ0FBLCBwb3IgbG8gcXVlIGVuIENldXRhIHkgTWVsaWxsYSBubyBzZSB2ZW4gbG9zIGRhdG9zIGVuIGVsIGdyw6FmaWNvIGRlIGxhIGl6cXVpZXJkYSwgbm8gcG9ycXVlIG5vIGhheWEgdmFsb3Jlcywgc2lubyBwb3JxdWUgbGFzIHBydWViYXMgaGVjaGFzIGVuIGVzdGFzIGNpdWRhZGVzIGF1dMOzbm9tYXMgc29uIHByw6FjdGljYW1lbnRlIGluc2lnbmlmaWNhbnRlIHNpIHNlIGNvbXBhcmFuIGNvbiBvdHJhcyBDQ0FBLiBFbiBjYW1iaW8sIGFsIHBvbmVyIGVsIG7Dum1lcm8gZGUgcHJ1ZWJhcyBwb3IgY2FkYSBtaWwgaGFiaXRhbnRlcywgc2kgc2Ugb2JzZXJ2YW4gbG9zIGRhdG9zLCB5YSBxdWUgaGVtb3MgY29naWRvIHVuIHJhbmdvIG1lbm9yLg0KDQpFc3RlIGNvbmp1bnRvIGRlIGdyw6FmaWNvcyBub3MgbXVlc3RyYSwgcG9yIHVuIGxhZG8sIGVsIG7Dum1lcm8gZGUgUENS4oCZcyBxdWUgc2UgaGFuIHJlYWxpemFkbyBlbiBjYWRhIGNvbXVuaWRhZCBhdXTDs25vbWEgZW4gY2FkYSBtZXM7IHkgbGEgb3RyYSwgbm9zIG11ZXN0cmEgZWwgbsO6bWVybyBkZSBQQ1LigJlzIHBvciBjYWRhIG1pbCBoYWJpdGFudGVzLg0KDQpTaSBtaXJhbW9zIGxhIHRhYmxhIGRlIGxhIGNhbnRpZGFkIGRlIFBDUuKAmXMgcmVhbGl6YWRhcywgZW4gcHJpbWVyIGx1Z2FyLCBzZSBvYnNlcnZhIGNsYXJhbWVudGUgY29tbyBsYSBjYW50aWRhZCBwcnVlYmFzIHJlYWxpemFkYXMgZW4gbGEg4oCcc2VndW5kYSBvbGHigJ0gKGVuIGxvcyDDumx0aW1vcyBtZXNlcyBkZWwgYcOxbykgZXMgbXVjaG8gbWF5b3IgcXVlIGVsIG7Dum1lcm8gZGUgcHJ1ZWJhcyByZWFsaXphZGFzIGVuIGxhIHByaW1lcmEuIEVzdG8gc2UgZGViZSBhIHF1ZSwgZW4gbGEgcHJpbWVyYSBvbGEsIGVsIHZpcnVzIGxsZWfDsyBjdWFuZG8gbmFkaWUgbG8gZXNwZXJhYmEsIHkgbGEgY2FudGlkYWQgZGUgcmVjdXJzb3MgZXN0YWJhIG11eSBsaW1pdGFkbywgZXMgbcOhcywgZWwgc2lzdGVtYSBzYW5pdGFyaW8gc2UgY29sYXBzw7MuDQoNClRhbWJpw6luLCBkZWJlbW9zIGRlc3RhY2FyIHF1ZSBlbCBuw7ptZXJvIGRlIHBydWViYXMgcmVhbGl6YWRhcyBlbiBsYXMgY29tdW5pZGFkZXMgZGUgTWFkcmlkLCBDYXRhbHXDsWEgeSBBbmRhbHVjw61hIGVzIG1heW9yIHF1ZSBsYXMgcmVhbGl6YWRhcyBlbiBlbCByZXN0byBkZSBDQ0FBLiBDYWJlIHJlY2FsY2FyIHF1ZSBsYSBwb2JsYWNpw7NuIGRlIGRpY2hhcyBjb211bmlkYWRlcyBlcyBtdWNobyBtYXlvci4NCg0KTm8gb2JzdGFudGUsIHNpIG9ic2VydmFtb3MgZWwgc2VndW5kbyBjb25qdW50byBkZSBncsOhZmljb3MsIGxhIGNhbnRpZGFkIGRlIHBydWViYXMgcmVhbGl6YWRhcyBlbiByZWxhY2nDs24gYSBsYSBjYW50aWRhZCBkZSBoYWJpdGFudGVzIHF1ZSBoYXkgZW4gY2FkYSBjb211bmlkYWQsIHNlIGlndWFsYSBtdWNobyBtw6FzLiBFbiBsYSDigJxwcmltZXJhIG9sYeKAnSBsYSBjYW50aWRhZCBkZSBwcnVlYmFzIGVzdMOhbiBiYXN0YW50ZSBpZ3VhbGFkYXMgZW4gbGEgbWF5b3LDrWEgZGUgQ0NBQSwgc2luIGVtYmFyZ28sIGRvbmRlIHNlIG11ZXN0cmFuIG3DoXMgZGlmZXJlbmNpYXMgZXMgZW4gbGEg4oCcc2VndW5kYSBvbGHigJ0uDQoNCkVuIGxhIOKAnHNlZ3VuZGEgb2xh4oCdIE1hZHJpZCB5YSBubyB0aWVuZSB1bm9zIGRhdG9zIHRhbiBlc2NhbmRhbG9zb3MsIGxvcyBkYXRvcyBkZSBOYXZhcnJhIHkgTGEgUmlvamEgc2UgZGlzcGFyYW4uIFBvciBvdHJvIGxhZG8sIHRhbWJpw6luIGRlc3RhY2FuIG90cmFzIGNvbXVuaWRhZGVzIGNvbW8gQXJhZ8OzbiwgQ2FudGFicmlhLCBDYXRhbHXDsWEgeSBBc3R1cmlhcy4gTGFzIENvbXVuaWRhZGVzIGNvbiBtZW5vcyBwcnVlYmFzIHJlYWxpemFkYXMsIHNlcsOtYW4gQW5kYWx1Y8OtYSAoZWwgbsO6bWVybyBkZSBwcnVlYmFzIGVzIGFsdMOtc2ltbyBwZXJvIGNvbXBhcmFkbyBjb24gc3UgcG9ibGFjacOzbiBlcyBiYWpvKSwgVmFsZW5jaWEgbyBDYW5hcmlhcy4gDQoNCg0KDQpgYGB7cn0NCkNfTSA8LSBkZkNDQUEgJT4lIGZpbHRlcihDQ0FBICVpbiUgYygiTWVsaWxsYSIsICJDZXV0YSIpKQ0KQ19NIDwtIENfTSAlPiUgc2VsZWN0KGRpYSwgbWVzLCBhw7FvLCBDQ0FBLCBQQ1IsIFRFU1RfQU5USUNVRVJQT1MpDQpDX00gPC0gQ19NICU+JSBwaXZvdF9sb25nZXIoNTo2LCBuYW1lc190byA9ICJQcnVlYmEiLCB2YWx1ZXNfdG89ICJOLnBydWViYSIpDQoNCkNldU1lbCA8LSBDX00gJT4lIGdyb3VwX2J5KENDQUEsIG1lcywgUHJ1ZWJhKSAlPiUgc3VtbWFyaXNlKFRvdGFsID0gc3VtKE4ucHJ1ZWJhKSkgJT4lIGZpbHRlcihQcnVlYmEgPT0gIlBDUiIpICU+JSBmaWx0ZXIobWVzICE9ICIxMSIpDQoNCg0KZ3JhZmljb0NfTSA8LSBnZ3Bsb3QoQ2V1TWVsLCBhZXMobWVzLCBUb3RhbCwgZmlsbCA9IENDQUEpKSArIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAiUmVkcyIpICsgZ2VvbV9jb2wocG9zaXRpb24gPSAiZG9kZ2UiKSArIGxhYnMoeCA9ICJNZXNlcyIsIHkgPSAiTsO6bS4gcHJ1ZWJhcyBQQ1IiLCB0aXRsZSA9ICJQQ1IncyBtZW5zdWFsZXMgQ2V1dGEgeSBNZWxpbGxhIikgKyB0aGVtZV9idygpICsgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpDQpgYGANCg0KYGBge3Igb3V0LndpZHRoPSI4MCUiLCBvdXQuaGVpZ2h0PSI5MCUifQ0KbGlicmFyeShwbG90bHkpDQpnZ3Bsb3RseShncmFmaWNvQ19NKQ0KYGBgDQoNClNpIGRlamFyYW1vcyBsYXMgZXNjYWxhcyBsaWJyZXMgcGFyYSBDZXV0YSB5IE1lbGlsbGEsIHZlbW9zIGNvbW8gZWwgbml2ZWwgZGUgUENSJ3MgaGEgaW5jcmVtZW50YWRvIGEgbG8gbGFyZ28gZGUgbG9zIG1lc2VzLCBkZSBtYXJ6byBoYSBvY3R1YnJlIGh1Ym8gdW4gYXVtZW50byBkZSA1NS4xNDYgcHJ1ZWJhcyBlbiBNZWxpbGxhLCBubyBvYnN0YW50ZSwgZW4gYW1ib3MgZ3LDoWZpY29zIGVzdGFzIGNpdWRhZGVzIGF1dMOzbm9tYXMgcHJlc2VudGFuIHVuIG7Dum1lcm8gZGUgcHJ1ZWJhcyBiYWpvLCBjYWJlIGRlY2lyLCBubyBvYnN0YW50ZSwgcXVlIGVsIG7Dum1lcm8gZGUgaGFiaXRhbnRlcyBhcXXDrSBlcyBtZW5vciBxdWUgZW4gb3RyYXMgQ0NBQSwgcG9yIHRhbnRvLCByZXN1bHRhIGzDs2dpY28gcXVlIGxhcyBwcnVlYmFzIHJlYWxpemFkYXMgKHNpbiB0ZW5lciBlbiBjdWVudGEgbG9zIGRhdG9zIHJlbGF0aXZvcykgc2VhbiBtZW5vcmVzLg0KDQoNCiMjIyA2LjQgQ29tcGFyYWNpw7NuLCBwcnVlYmFzIFBDUiB5IHRlc3QgYW50aWN1ZXJwb3MNCg0KYGBge3IgcHJ1ZWJhc0NDQUF9DQpkZmIgPC0gZGZDQ0FBICU+JSBzZWxlY3QoZGlhLCBtZXMsIGHDsW8sIGNvZF9pbmUsIENDQUEsIFBDUiwgVEVTVF9BTlRJQ1VFUlBPUykNCg0KVHBydWViYXNsIDwtIGRmYiAlPiUgcGl2b3RfbG9uZ2VyKGNvbHMgPSA2OjcsIG5hbWVzX3RvID0gIlBydWViYSIsIHZhbHVlc190byA9ICJUb3RhbCIpDQoNCm1lZGlhcCA8LSBUcHJ1ZWJhc2wgJT4lIGdyb3VwX2J5KFBydWViYSkgJT4lICBzdW1tYXJpc2UobWVkaWEgPSBtZWFuKFRvdGFsKSkNCg0KDQpncmFmaWNvMiA8LSBnZ3Bsb3QobWVkaWFwLCBhZXMoUHJ1ZWJhLCBtZWRpYSwgZmlsbCA9IFBydWViYSkpICsgIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGU9IlNwZWN0cmFsIikgKyBnZW9tX2NvbCgpICsgbGFicyh5ID0gIk1lZGlhIHBydWViYXMiLCAgdGl0bGUgPSAiQ29tcGFyYWNpw7NuOiBOw7ptZXJvIGRlIHBydWViYXMgKHRvdGFsZXMpIG1lZGlhcyIsIGNhcHRpb24gPSAiRWxhYm9yYWNpw7NuIHByb3BpYSIpICsgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscz1mdW5jdGlvbihuKXtmb3JtYXQobiwgc2NpZW50aWZpYyA9IEZBTFNFKX0pICsgZ2VvbV90ZXh0KGFlcyh5PW1lZGlhLCBsYWJlbCA9IG1lZGlhKSwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuOCksIHNpemUgPSAzLjIsIHZqdXN0PTMsIGNvbCA9ICJCbGFjayIpICsgeGxhYihOVUxMKSArICB0aGVtZV9jbGFzc2ljKCkgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpDQpgYGANCg0KYGBge3IgZWNobz1GQUxTRSwgZXZhbD1UUlVFfQ0KZ3JhZmljbzINCmBgYA0KDQpBIGxhIHZpc3RhIGRlbCBncsOhZmljbyBzZSBjb21wcnVlYmEgY29tbyBlbCBuw7ptZXJvIGRlIFBDUnMgZXMgbcOhcyBzaWduaWZpY2F0aXZvLCBzZSB1dGlsaXphIGRpYXJpYW1lbnRlIG3DoXMgcXVlIGxvcyB0ZXN0cyByw6FwaWRvcywgcGFyYSBkZXRlY3RhciBsb3MgcG9zaXRpdm9zIGVuIENvdmlkLTE5LiANCg0KVW5hIGRlIGxhcyBjYXVzYXMgcHJpbmNpcGFsZXMgZGUgZWxsbywgZXMgcG9ycXVlIGxhcyBQQ1IncyAoJ1JlYWNjacOzbiBlbiBDYWRlbmEgZGUgbGEgUG9saW1lcmFzYScpIHNvbiBtw6FzIGZpYWJsZXMsIHBlcm1pdGVuIGRldGVjdGFyIHkgY3VhbnRpZmljYXIgZWwgdmlydXMuIE1pZW50cmFzIHF1ZSBlbCB0ZXN0IHLDoXBpZG8gc2lydmUgcGFyYSBkZXRlY3RhciBzaSBsYSBwZXJzb25hIGhhIGVzdGFkbyBjb250YWdpYWRhLCBlbiBwcmVzZW5jaWEgbyBubyBkZSBhbnRpY3VlcnBvcy4gDQoNCmBgYHtyfQ0KbWF4UCA8LSBkZkNDQUEgJT4lIHNlbGVjdChkaWEsIG1lcywgY29kX2luZSwgUENSKSAlPiUgZmlsdGVyKG1lcyAhPSAiNCIpDQptYXhwIDwtIG1heFAgJT4lIHNsaWNlX21heChQQ1IsIG49MSkgI0VsIGRpYSBxdWUgbcOhcyBwcnVlYmFzIFBDUiBzZSBoaWNpZXJvbiBmdWUgZWwgZMOtYSA1IGRlbCAxMSBlbiBDYXRhbHXDsWEsIGNvbmNyZXRhbWVudGUgc2UgaGljaWVyb246IDIuNzkyLjcwNw0KbWF4cCA8LSBtYXhwICU+JSByZW5hbWUoTi5QcnVlYmFzID0gIlBDUiIpDQptYXhwIDwtIG1heHAgJT4lIG11dGF0ZShUaXBvX1BydWViYSA9ICBjYXNlX3doZW4oTi5QcnVlYmFzID09IDI3OTI3MDcgfiAiUENSIikpDQoNCiNIYXJlbW9zIGxvIG1pc21vIHBhcmEgbG9zIG90cm9zIHRpcG9zIGRlIHBydWViYSB5IHBhcmEgb2J0ZW5lciBlbCBtw61uaW1vLCBwb3IgbG8gcXVlIGNyZWVtb3MgcXVlIGVsIGPDs2RpZ28gbm8gZXMgbmVjZXNhcmlvIG1vc3RyYXJsby4NCmBgYA0KDQpgYGB7ciBlY2hvPUZBTFNFLCBldmFsPVRSVUV9DQptYXhBQyA8LSBkZkNDQUEgJT4lIHNlbGVjdChkaWEsIG1lcywgY29kX2luZSwgVEVTVF9BTlRJQ1VFUlBPUykgJT4lIGZpbHRlcihtZXMgIT0gIjQiKQ0KDQptYXhhYyA8LSBtYXhBQyAlPiUgc2xpY2VfbWF4KFRFU1RfQU5USUNVRVJQT1MsIG49MSkgI03DoXhpbW8gZGUgcHJ1ZWJhcyBkZSBhbnRpZ2Vub3MgZnVlIGVsIGTDrWEgNSBkZWwgMTEgZW4gQW5kYWx1Y8OtYSBjb24gNDkwLjk2OQ0KDQptYXhhYyA8LSBtYXhhYyAlPiUgcmVuYW1lKE4uUHJ1ZWJhcyA9ICJURVNUX0FOVElDVUVSUE9TIikNCm1heGFjIDwtIG1heGFjICU+JSBtdXRhdGUoVGlwb19QcnVlYmEgPSAgY2FzZV93aGVuKE4uUHJ1ZWJhcyA9PSA0OTA5NjkgfiAiVEVTVF9BTlRJQ1VFUlBPUyIpKQ0KYGBgDQoNCmBgYHtyIGVjaG89RkFMU0UsIGV2YWw9VFJVRX0NCm1heE8gPC1kZnAgJT4lDQogIHNlcGFyYXRlKEZlY2hhLCBjKCJhw7FvIiwibWVzIiwiZGlhIiksIHNlcCA9ICItIikgJT4lICAgICAgICAgICAgICAgICByZWxvY2F0ZShhw7FvLCAuYWZ0ZXI9ZGlhKSAlPiUNCiAgcmVsb2NhdGUoZGlhLCAuYmVmb3JlID1tZXMpICU+JSBzZWxlY3QoZGlhLCBtZXMsIGNvZF9pbmUsIE9UUk9TX1RFU1RTKSAlPiUgIGZpbHRlcihtZXMgIT0gIjQiKSAlPiUgZmlsdGVyKGNvZF9pbmUgIT0gIjAiKQ0KbWF4byA8LSBtYXhPICU+JSBzbGljZV9tYXgoT1RST1NfVEVTVFMsIG49MSkgI03DoXhpbW8gZGUgIm90cmFzIHB1ZWJhcyIgIGZ1ZSBlbCBkw61hIDUgZGVsIDExIGVuIEFuZGFsdWPDrWEgY29uIDEuMDQ4LjYzMg0KDQptYXhvIDwtIG1heG8gJT4lIHJlbmFtZShOLlBydWViYXMgPSAiT1RST1NfVEVTVFMiKQ0KbWF4byA8LSBtYXhvICU+JSBtdXRhdGUoVGlwb19QcnVlYmEgPSAgY2FzZV93aGVuKE4uUHJ1ZWJhcyA9PSAxMDQ4NjMyIH4gIk9UUk9TX1RFU1RTIikpDQpgYGANCg0KYGBge3J9DQojUFJFUEFSQUNJw5NOIERFIExBUyBUQUJMQVMNCiNKdW50YXIgbGFzIHRhYmxhcy4NCnRhYmxhIDwtIHJiaW5kKG1heG8sIG1heGFjLG1heHApDQoNCiNFeHBvcnRvIGVzdGEgdGFibGE6DQpyaW86OmV4cG9ydCh0YWJsYSwgaGVyZTo6aGVyZSgiZGF0b3MiLCAidGFibGFtYXguY3N2IikpDQp0YWJsYSA8LSByaW86OmltcG9ydChoZXJlOjpoZXJlKCJkYXRvcyIsICJ0YWJsYW1heC5jc3YiKSkNCg0KdGFibGEgPC0gdGFibGEgJT4lIG11dGF0ZShDQ0FBID0gY2FzZV93aGVuKGNvZF9pbmUgPT0gMSB+IkFuZGFsdWNpYSIsICAgY29kX2luZSA9PSA5IH4gIkNhdGFsdcOxYSIpKSAlPiUgc2VsZWN0KGRpYSwgbWVzLCBDQ0FBLCBUaXBvX1BydWViYSwgTi5QcnVlYmFzKQ0KDQojUmVwZXRpbW9zIHRvZG8gZWwgcHJvY2VzbyBwYXJhIGhhY2VyIGVsIG3DrW5pbW8NCmBgYA0KDQpgYGB7ciBldmFsPVRSVUUsIGVjaG89RkFMU0V9DQptaW5QIDwtIGRmQ0NBQSAlPiUgc2VsZWN0KGRpYSwgbWVzLCBjb2RfaW5lLCBQQ1IpICU+JSBmaWx0ZXIobWVzICE9ICI0IikNCm1pbnAgPC0gbWluUCAlPiUgc2xpY2VfbWluKFBDUiwgbj0xKSAjRWwgZGlhIHF1ZSBtw6FzIHBydWViYXMgUENSIHNlIGhpY2llcm9uIGZ1ZSBlbCBkw61hIDUgZGVsIDExIGVuIENhdGFsdcOxYSwgY29uY3JldGFtZW50ZSBzZSBoaWNpZXJvbjogMi43OTIuNzA3DQptaW5wIDwtIG1pbnAgJT4lIHJlbmFtZShOLlBydWViYXMgPSAiUENSIikNCg0KbWlucCA8LSBtaW5wICU+JSBtdXRhdGUoVGlwb19QcnVlYmEgPSAgY2FzZV93aGVuKE4uUHJ1ZWJhcyA9PSA2NDkgfiAiUENSIikpDQoNCm1pbkFDIDwtIGRmQ0NBQSAlPiUgc2VsZWN0KGRpYSwgbWVzLCBjb2RfaW5lLCBURVNUX0FOVElDVUVSUE9TKSAlPiUgZmlsdGVyKG1lcyAhPSAiNCIpDQoNCm1pbmFjIDwtIG1pbkFDICU+JSBzbGljZV9taW4oVEVTVF9BTlRJQ1VFUlBPUywgbj0xKSAjTcOheGltbyBkZSBwcnVlYmFzIGRlIGFudGlnZW5vcyBmdWUgZWwgZMOtYSA1IGRlbCAxMSBlbiBBbmRhbHVjw61hIGNvbiA0OTAuOTY5DQoNCm1pbmFjIDwtIG1pbmFjICU+JSByZW5hbWUoTi5QcnVlYmFzID0gIlRFU1RfQU5USUNVRVJQT1MiKQ0KbWluYWMgPC0gbWluYWMgJT4lIG11dGF0ZShUaXBvX1BydWViYSA9ICBjYXNlX3doZW4oTi5QcnVlYmFzID09DQoxOTgzIH4gIlRFU1RfQU5USUNVRVJQT1MiKSkNCg0KbWluTyA8LWRmcCAlPiUNCiAgc2VwYXJhdGUoRmVjaGEsIGMoImHDsW8iLCJtZXMiLCJkaWEiKSwgc2VwID0gIi0iKSAlPiUgICAgICAgICAgICAgICAgIHJlbG9jYXRlKGHDsW8sIC5hZnRlcj1kaWEpICU+JQ0KICByZWxvY2F0ZShkaWEsIC5iZWZvcmUgPW1lcykgJT4lIHNlbGVjdChkaWEsIG1lcywgY29kX2luZSwgT1RST1NfVEVTVFMpICU+JSAgZmlsdGVyKG1lcyAhPSAiNCIpICU+JSBmaWx0ZXIoY29kX2luZSAhPSAiMCIpDQptaW5vIDwtIG1pbk8gJT4lIHNsaWNlX21pbihPVFJPU19URVNUUywgbj0xKSAjTcOheGltbyBkZSAib3RyYXMgcHVlYmFzIiAgZnVlIGVsIGTDrWEgNSBkZWwgMTEgZW4gQW5kYWx1Y8OtYSBjb24gMS4wNDguNjMyDQoNCm1pbm8gPC0gbWlubyAlPiUgcmVuYW1lKE4uUHJ1ZWJhcyA9ICJPVFJPU19URVNUUyIpDQptaW5vIDwtIG1pbm8gJT4lIG11dGF0ZShUaXBvX1BydWViYSA9ICBjYXNlX3doZW4oTi5QcnVlYmFzID09IDAgfiAiT1RST1NfVEVTVFMiKSkNCg0KYGBgDQoNCmBgYHtyIGV2YWw9VFJVRSwgZWNobz1GQUxTRX0NCnRhYmxhbWluIDwtIHJiaW5kKG1pbm8sIG1pbmFjICxtaW5wKQ0KDQojRXhwb3J0byBlc3RhIHRhYmxhOg0KcmlvOjpleHBvcnQodGFibGFtaW4sIGhlcmU6OmhlcmUoImRhdG9zIiwgInRhYmxhbWl4LmNzdiIpKQ0KdGFibGFtaW4gPC0gcmlvOjppbXBvcnQoaGVyZTo6aGVyZSgiZGF0b3MiLCAidGFibGFtaXguY3N2IikpDQoNCnRhYmxhbWluIDwtIHRhYmxhbWluICU+JSBtdXRhdGUoQ0NBQSA9IGNhc2Vfd2hlbihjb2RfaW5lID09IDEzIH4gIk1hZHJpZCIsICBjb2RfaW5lID09IDkgfiAiQ2F0YWx1w7FhIiwgY29kX2luZSA9PSA0IH4gIkkuQmFsZWFyZXMiKSkgJT4lIHNlbGVjdChkaWEsIG1lcywgQ0NBQSwgVGlwb19QcnVlYmEsIE4uUHJ1ZWJhcykNCmBgYA0KDQpgYGB7cn0NCiNQYXNvIGZpbmFsIHBhcmEgbGFzIHRhYmxhcw0KbGlicmFyeShmbGV4dGFibGUpDQoNCmZ0bWluIDwtIGZsZXh0YWJsZShoZWFkKHRhYmxhbWluKSwgY29sX2tleXMgPSBjKCJkaWEiLCAibWVzIiwgIkNDQUEiLCAiVGlwb19QcnVlYmEiLCAiTi5QcnVlYmFzIikpDQoNCmZ0bWF4IDwtICBmbGV4dGFibGUoaGVhZCh0YWJsYSksIGNvbF9rZXlzID0gYygiZGlhIiwgIm1lcyIsICJDQ0FBIiwgIlRpcG9fUHJ1ZWJhIiwgIk4uUHJ1ZWJhcyIpKQ0KYGBgDQoNCjxicj4NCg0KPGNlbnRlcj48Rk9OVCBDT0xPUj0iQmx1ZSI+KirCv0N1w6FsIGZ1ZSBlbCBkw61hIGVuIGVsIHF1ZSBtZW5vcyBwcnVlYmFzIHNlIGhpY2llcm9uPyoqPC9GT05UPjwvY2VudGVyPg0KYGBge3IgZWNobz1GQUxTRSwgZXZhbD1UUlVFLCBvdXQud2lkdGg9IjgwJSJ9DQpmdG1pbg0KYGBgDQoNCjxicj4NCg0KPGNlbnRlcj48Rk9OVCBDT0xPUj0iQmx1ZSI+KipZLCDCv0N1w6FsIGZ1ZSBlbCBkw61hIGVuIGVsIHF1ZSBtw6FzIHBydWViYXMgc2UgaGljaWVyb24/Kio8L0ZPTlQ+PC9jZW50ZXI+DQoNCmBgYHtyIGVjaG89RkFMU0UsIGV2YWw9VFJVRSwgb3V0LndpZHRoPSI4MCUifQ0KZnRtYXgNCmBgYA0KDQo8YnI+DQoqQ2FiZSB0ZW5lciBlbiBjdWVudGEgcXVlIGxvcyBkYXRvcyB2YW4gZGVzZGUgZWwgMjMgZGUgbWFyem8gaGFzdGEgZWwgNSBkZSBub3ZpZW1icmUuDQoNCiMjIyA2LjUgQW7DoWxpc2lzIGRlIGNhc29zIHNlZ8O6biBsYXMgKipwcm92aW5jaWFzKioNCg0KYGBge3J9DQojUHJlcGFyYW5kbyBsb3MgZGF0b3MgcGFyYSBxdWUgc2FsZ2EgZWwgbWFwYS4NCmxpYnJhcnkocmlvKQ0KbGlicmFyeSh0aWR5dmVyc2UpDQoNCg0KUHJvdmluY2lhcyA8LSByaW86OmltcG9ydCgiaHR0cHM6Ly9naXRodWIuY29tL3BlcmV6cDQ0L0xBVTJib3VuZGFyaWVzNHNwYWluL2Jsb2IvbWFzdGVyL2RhdGEvUHJvdmluY2lhcy5yZGE/cmF3PXRydWUiKQ0KDQoNCmRmUFJPViA8LSBkZlBST1YgJT4lIG11dGF0ZShUb3RhbF94X2NhcCA9IFRvdGFseGNhcCoxMDApDQpkZlBST1YgPC0gZGZQUk9WICU+JSBzZWxlY3QocHJvdmluY2lhLCBDb2QsIFBvYmxhY2lvbiwgVG90YWwsIFRvdGFsX3hfY2FwKSAlPiUgYXJyYW5nZShDb2QpDQojbmFtZXMoUHJvdmluY2lhcykNCg0KDQpsaWJyYXJ5KHNmKQ0KDQpjYW5hcmlhcyA8LSBQcm92aW5jaWFzICU+JSBmaWx0ZXIoSU5FQ29kUHJvdiAlaW4lIGMoMzUsMzgpKQ0KDQpwZW5pbnN1bGEgPC0gUHJvdmluY2lhcyAlPiUgZmlsdGVyKCAhKElORUNvZFByb3YgJWluJSBjKDM1LCAzOCkpKQ0KDQpteV9zaGlmdCA8LSBzdF9iYm94KHBlbmluc3VsYSlbYygxLDIpXS0gKHN0X2Jib3goY2FuYXJpYXMpW2MoMSwyKV0pICsgYygtMi40LCAtMS4xKQ0KDQpjYW5hcmlhcyRnZW9tZXRyeSA8LSBjYW5hcmlhcyRnZW9tZXRyeSArIG15X3NoaWZ0DQoNCnN0X2NycyhjYW5hcmlhcykgIDwtIHN0X2NycyhwZW5pbnN1bGEpDQoNCnBlbmluc3VsYV95X2NhbmFyaWFzIDwtIHJiaW5kKHBlbmluc3VsYSwgY2FuYXJpYXMpDQoNCg0KDQpwIDwtIGdncGxvdCh0ZXh0byA9ICJwcm92aW5jaWEiICkgKyBnZW9tX3NmKGRhdGEgPSBwZW5pbnN1bGFfeV9jYW5hcmlhcykNCg0KDQpUYWJsYSA8LSBmdWxsX2pvaW4ocGVuaW5zdWxhX3lfY2FuYXJpYXMsIGRmUFJPViwgYnkgPSBjKCJJTkVDb2RQcm92IiA9ICJDb2QiKSkNCg0KDQpUYWJsYTEgPC0gVGFibGEgJT4lIHNlbGVjdChwcm92aW5jaWEsIElORUNvZFByb3YsIFRvdGFsX3hfY2FwLCBnZW9tZXRyeSkNCg0KcHJvdmluY2lhc19wb2ludCA8LSBzdF9jZW50cm9pZChUYWJsYTEpDQpwcm92aW5jaWFzX3BvaW50cyA8LSBjYmluZChUYWJsYTEsIHN0X2Nvb3JkaW5hdGVzKHN0X2NlbnRyb2lkKFRhYmxhMSRnZW9tZXRyeSkpKQ0KDQoNCm1hcGEgPC0gcCArIGdlb21fc2YoZGF0YSA9IHBlbmluc3VsYV95X2NhbmFyaWFzLCBmaWxsID0gTkEpICsNCiAgICBnZW9tX3NmKGRhdGEgPSBwcm92aW5jaWFzX3BvaW50cywgYWVzKGdlb21ldHJ5ID0gZ2VvbWV0cnksIGZpbGwgPSBUb3RhbF94X2NhcCkpICsgc2NhbGVfZmlsbF92aXJpZGlzX2MoZGlyZWN0aW9uID0gLTEsIG9wdGlvbiA9ICJpbmZlcm5vIiwgbmFtZSA9ICJDb250YWdpb3MgeCBoYWIgKCUpIiwgYWxwaGEgPSAuNikgKyBsYWJzKHRpdGxlID0gIkNvbnRhZ2lvcyByZWxhdGl2b3Mgc2Vnw7puIHByb3ZpbmNpYSB5IHBvYmxhY2nDs24iKSArIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjcsIGZhY2UgPSAiYm9sZCIsIGNvbG9yID0gIkJsYWNrIikpICsgZ2VvbV90ZXh0KGRhdGEgPSBwcm92aW5jaWFzX3BvaW50cywgYWVzKFgsIHk9WSwgbGFiZWwgPSBwcm92aW5jaWEpLCBjb2xvciA9ICJCbGFjayIsIGZvbnRmYWNlID0gImJvbGQiLCBjaGVja19vdmVybGFwID0gVFJVRSwgc2l6ZSA9IDIuNSkgKyAgdGhlbWVfbWluaW1hbCgpICsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCksIGF4aXMudGV4dC55ID0gZWxlbWVudF9ibGFuaygpKSArIGxhYnMoeCA9IE5VTEwsIHk9TlVMTCkNCg0KYGBgDQoNCmBgYHtyIGVjaG89RkFMU0UsIGV2YWw9VFJVRSwgb3V0LndpZHRoPSIxMDAlIn0NCm1hcGENCmBgYA0KDQojIyBFcyBpbXBvcnRhbnRlIGNvbnNpZGVyYXIgbG9zIGRhdG9zIGRlIG1hbmVyYSByZWxhdGl2YSB7LnRhYnNldH0NCg0KIyMjIDxGT05UIENPTE9SPSJGRjREMDAiPioqUHJvdmluY2lhcyBjb24gbcOhcyBjYXNvcyBzZWfDum4gcG9ibGFjacOzbioqPC9GT05UPg0KDQpgYGB7cn0NCiNUZW5pZW5kbyBlbiBjdWVudGEgbGEgcG9ibGFjacOzbjoNCg0KZGZUcmVscCA8LSBkZlRyZWwgJT4lIG11dGF0ZShQb3JjZW50YWplID0gVG90YWx4Y2FwKjEwMCkNCg0KDQpncmFmaWNvQiA8LSBnZ3Bsb3QoZGZUcmVscCwgYWVzKGZvcmNhdHM6OmZjdF9yZW9yZGVyKHByb3ZpbmNpYSwgUG9yY2VudGFqZSksIFBvcmNlbnRhamUpKSArDQogIGdlb21fY29sKGFlcyhmaWxsID0gUG9yY2VudGFqZSkpICsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGU9OTAsIHZqdXN0PTAuNiksIHBhbmVsLmJhY2tncm91bmQgPSBOVUxMKSArDQogIHNjYWxlX2ZpbGxfdmlyaWRpc19jKG9wdGlvbiA9ICJpbmZlcm5vIiwgbmFtZSA9ICJDb250YWdpb3MgcGVyIGNhcGl0YSIsIGFscGhhID0gMC44LCBiZWdpbiA9IDAuMywgZW5kID0gMC43LCBkaXJlY3Rpb24gPSAtMSwgZ3VpZGUgPSBndWlkZV9jb2xvcmJhciggZGlyZWN0aW9uID0gImhvcml6b250YWwiLCBiYXJoZWlnaHQgPSB1bml0KDIsIHVuaXRzID0gIm1tIiksIGJhcndpZHRoID0gdW5pdCg1MCwgdW5pdHMgPSAibW0iKSwgZHJhdy51bGltID0gRiwgdGl0bGUucG9zaXRpb24gPSAndG9wJywgdGl0bGUuaGp1c3QgPSAwLjUsIGxhYmVsLmhqdXN0ID0gMC41KSkgKw0KICB0aGVtZShsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gNykpICsNCiAgbGFicyh0aXRsZSA9ICJDb250YWdpb3MgdG90YWxlcyBzZWfDum4gcHJvdmluY2lhIiwgc3VidGl0bGUgPSAiWSBlbiByZWxhY2nDs24gYWwgbsO6bWVybyBkZSBoYWJpdGFudGVzIikgKw0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkgKw0KICB0aGVtZShwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkgKyBsYWJzKHggPSBOVUxMLCB5ID0gTlVMTCkgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikNCmBgYA0KDQpgYGB7ciBlY2hvPUZBTFNFLCBldmFsPVRSVUUsIG91dC53aWR0aD0iODAlIn0NCmdyYWZpY29CDQpgYGANCg0KIyMjIDxGT05UIENPTE9SPSJGRjREMDAiPioqVHJlZW1hcGlmeSoqPC9GT05UPg0KDQpTaSByZWxhY2lvbmFtb3MgZWwgbsO6bWVybyBkZSBjb250YWdpb3MgdG90YWxlcyBwb3IgZWwgbsO6bWVybyBkZSBoYWJpdGFudGVzOyB2ZW1vcyBxdWUgbGEgcHJvdmluY2lhIGNvbiBtw6FzIGNvbnRhZ2lvcyBlcyBOYXZhcnJhLCBzZWd1aWRhIGRlIEh1ZXNjYSB5IEJ1cmdvcy4gTWFkcmlkIHNpZ3VlIHNpZW5kbyB1bmEgZGUgbGFzIHByb3ZpbmNpYXMgY2FiZWNlcmFzIGVuIGN1YW50byBhIGNvbnRhZ2lvcy4NCkFsIGNvbnRyYXJpbywgbGFzIHByb3ZpbmNpYXMgcXVlIG3DoXMgZGVzdGFjYW4gcG9yIG1lbm9yIG7Dum1lcm8gZGUgY2Fzb3Mgc29uIGxhcyBwcm92aW5jaWFzIGNhbmFyaWFzIFRlbmVyaWZlIHkgTGFzIFBhbG1hcy4NCg0KYGBge3J9DQpsaWJyYXJ5KHRyZWVtYXBpZnkpDQoNCmdncGxvdChkZlRyZWxwLCBhZXMoYXJlYSA9IFBvcmNlbnRhamUsIGZpbGwgPSBQb3JjZW50YWplLCBsYWJlbCA9IHByb3ZpbmNpYSkpICsNCiAgZ2VvbV90cmVlbWFwKCkgKw0KICBnZW9tX3RyZWVtYXBfdGV4dChmb250ZmFjZSA9ICJpdGFsaWMiLCBjb2xvdXIgPSAid2hpdGUiLCBwbGFjZSA9ICJjZW50cmUiLA0KICAgICAgICAgICAgICAgICAgICBncm93ID0gRkFMU0UpICsNCiAgc2NhbGVfZmlsbF92aXJpZGlzX2Mob3B0aW9uID0gImluZmVybm8iLCBuYW1lID0gIiIsIGFscGhhID0gMC44LCBiZWdpbiA9IDAuMywgZW5kID0gMC43LCBkaXJlY3Rpb24gPSAtMSwNCiAgICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBndWlkZV9jb2xvcmJhciggdGl0bGUgPSAiJSBjYXNvcyBzZWfDum4gcG9ibGFjacOzbiIsIGRpcmVjdGlvbiA9ICJob3Jpem9udGFsIiwgYmFyaGVpZ2h0ID0gdW5pdCgyLCB1bml0cyA9ICJtbSIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXJ3aWR0aCA9IHVuaXQoNTAsIHVuaXRzID0gIm1tIiksIGRyYXcudWxpbSA9IEYsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlLnBvc2l0aW9uID0gJ3RvcCcsIHRpdGxlLmhqdXN0ID0gMC41LCBsYWJlbC5oanVzdCA9IDAuNSkpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpICsgc2NhbGVfeF9jb250aW51b3VzKGxhYmVscz1mdW5jdGlvbihuKXtmb3JtYXQobiwgc2NpZW50aWZpYyA9IEZBTFNFKX0pICsNCiAgbGFicyh0aXRsZSA9ICJQcm92aW5jaWFzIGNvbiBtYXlvciBuw7ptZXJvIGRlIGNhc29zIHNlZ8O6biBzdSBwb2JsYWNpw7NuIChlbiAlKSIsDQogICAgICAgc3VidGl0bGUgPSAiU2UgaGEgY2FsY3VsYWRvIGVsIFRvdGFsIGRlIGNhc29zIGVudHJlIGxhIHBvYmFjacOzbiB5IG11bHRpcGxpY2FkbyBwb3IgMTAwIHBhcmEgc2FjYXIgZWwgcG9yY2VudGFqZSIsDQogICAgICAgY2FwdGlvbiA9ICJMb3Mgw7psdGltb3MgZGF0b3MgY29ycmVzcG9uZGVuIGFsIDExLTExLTIwMjAiKSArIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKSArDQogIHRoZW1lKHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKQ0KDQpgYGANCg0KDQojIyMgPEZPTlQgQ09MT1I9IkZGNEQwMCI+KipVbmEgY29tcGFyYWNpw7NuKio8L0ZPTlQ+DQoNCkRhZG8gcXVlIGVzIGltcG9ydGFudGUgdGVuZXIgZW4gY3VlbnRhIGxvcyBjYXNvcyBkZSBtYW5lcmEgcmVsYXRpdmEsIGFxdcOtIGhlbW9zIHF1ZXJpZG8gY29tcGFyYXIgZWwgbsO6bWVybyBkZSBwcm92aW5jaWFzIGNvbiBtw6FzIGNhc29zIHRlbmllbmRvIGVuIGN1ZW50YSBlbCBuw7ptZXJvIGRlIGhhYml0YW50ZXMgcXVlIGhheSBlbiBjYWRhIHVuYSBkZSBlc3RhcyB5IHNpbiB0ZW5lciBlbiBjdWVudGEgbGEgcG9ibGFjacOzbi4gQ29tbyBlcmEgZXNwZXJhYmxlIHkgYSBsYSB2aXN0YSBkZWwgZ3LDoWZpY28sIG9ic2VydmFtb3MgcXVlIHJlc3VsdGFkb3MgZGlmaWVyZW4gYWwgY29uc2lkZXJhciBvIG5vIGxhIHBvYmxhY2nDs24NCg0KYGBge3J9DQoNCmRmTSA8LSBkZlRyZWwgJT4lIHNlbGVjdChwcm92aW5jaWEsIFRvdGFsKSAlPiUgYXJyYW5nZShkZXNjKFRvdGFsKSkNCg0KZGZNIDwtIGRmTSAlPiUgZmlsdGVyKHByb3ZpbmNpYSAlaW4lIGMoIk1hZHJpZCIsICJCYXJjZWxvbmEiLCAiTXVyY2lhIiwgIlNldmlsbGEiLCAiWmFyYWdvemEiKSkNCg0KZ3JhZmljb0EgPC0gZ2dwbG90KGRmTSwgYWVzKGZvcmNhdHM6OmZjdF9yZW9yZGVyKHByb3ZpbmNpYSwgVG90YWwpLCBUb3RhbCkpICsNCiAgZ2VvbV9jb2woYWVzKGZpbGwgPSBUb3RhbCkpICsNCiAgdGhlbWUocGFuZWwuYmFja2dyb3VuZCA9IE5VTEwpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscz1mdW5jdGlvbihuKXtmb3JtYXQobiwgc2NpZW50aWZpYyA9IEZBTFNFKX0pDQoNCmdyYWZpY29BIDwtIGdyYWZpY29BICsgZ2VvbV90ZXh0KGFlcyh5PVRvdGFsLCBsYWJlbCA9IFRvdGFsKSwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuOSksIHNpemUgPSAzLjIsIHZqdXN0PTIsIGNvbCA9ICJXaGl0ZSIpICsgbGFicyh4ID0gTlVMTCwgeSA9IE5VTEwsIHRpdGxlID0gIjUgcHJvdmluY2lhcyBjb24gbcOhcyBjb250YWdpb3MgdG90YWxlcyIpICsgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpDQoNCmRmTWIgPC0gZGZUcmVsICU+JSBzZWxlY3QocHJvdmluY2lhLCBUb3RhbHhjYXApICU+JSBhcnJhbmdlKGRlc2MoVG90YWx4Y2FwKSkNCg0KZGZNYiA8LSBkZk1iICU+JSBmaWx0ZXIocHJvdmluY2lhICVpbiUgYygiTmF2YXJyYSIsICJIdWVzY2EiLCAiQnVyZ29zIiwgIlZhbGxhZG9saWQiLCAiWmFyYWdvemEiKSkNCg0KZ3JhZmljb0EyIDwtIGdncGxvdChkZk1iLCBhZXMoZm9yY2F0czo6ZmN0X3Jlb3JkZXIocHJvdmluY2lhLCBUb3RhbHhjYXApLCBUb3RhbHhjYXApKSArDQogIGdlb21fY29sKGFlcyhmaWxsID0gVG90YWx4Y2FwKSkgKw0KICB0aGVtZShwYW5lbC5iYWNrZ3JvdW5kID0gTlVMTCkgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzPWZ1bmN0aW9uKG4pe2Zvcm1hdChuLCBzY2llbnRpZmljID0gRkFMU0UpfSkNCg0KZ3JhZmljb0EyIDwtIGdyYWZpY29BMiArIGdlb21fdGV4dChhZXMoeT1Ub3RhbHhjYXAsIGxhYmVsID0gVG90YWx4Y2FwKSwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuMyksIHNpemUgPSAyLCB2anVzdD0zLCBjb2wgPSAiV2hpdGUiKSArIGxhYnMoeCA9IE5VTEwsIHkgPSBOVUxMLCB0aXRsZSA9ICI1IHByb3ZpbmNpYXMgY29uIG3DoXMgY29udGFnaW9zIGVuIGZ1bmNpw7NuIGRlIGxhIHBvYmxhY2nDs24iKSArIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKQ0KYGBgDQoNCmBgYHtyIGVjaG89RkFMU0UsIGV2YWw9VFJVRSwgb3V0LndpZHRoPSIxMDAlIn0NCmxpYnJhcnkocGF0Y2h3b3JrKQ0KZ3JhZmljb0EgLyBncmFmaWNvQTINCmBgYA0KDQojIyA3LiBFc3R1ZGlvIHNvYnJlIGVsIENvdmlkIGVuIGxhICoqQ29tdW5pZGFkIFZhbGVuY2lhbmEqKg0KDQpTaWd1aWVuZG8gbnVlc3RybyBhbsOhbGlzaXMgc29icmUgbGEgQ292aWQtMTksIGVuIGVzdGUgYXBhcnRhZG8gbm9zIGNlbnRyYXJlbW9zIGVuIGFuYWxpemFyIGFsZ3Vub3MgZWxlbWVudG9zIGRlc3RhY2xhYmVzIGRlIGxhIHBhbmRlbcOtYSBlbiBsYSBDb211bmlkYWQgVmFsZW5jaWFuYS4NCg0KIyMjIDcuMSBDb250YWdpb3MgZW4gbGEgQ29tdW5pZGFkIFZhbGVuY2lhbmEuDQoNCiAgYGBge3IgZWNobz1GQUxTRSwgZXZhbD1GQUxTRX0NCmRmQ1YgPC0gZGZyZWwgJT4lIGZpbHRlcihwcm92aW5jaWEgJWluJSBjKCJWYWxlbmNpYSIsICJBbGljYW50ZSIsICJDYXN0ZWxsb24iKSkNCmBgYA0KDQpgYGB7ciwgZWNobz1GQUxTRSwgZXZhbD1GQUxTRX0NCmdyYWZpY29DViA8LSBnZ3Bsb3QoZGZDViwgYWVzKG1lcywgVG90YWxfY2FwLCBjb2xvciA9IHByb3ZpbmNpYSkpICsgZ2VvbV9saW5lKCkgKyBnZW9tX3BvaW50KCkgKyB0aGVtZV9saWdodCgpICsgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscz1mdW5jdGlvbihuKXtmb3JtYXQobiwgc2NpZW50aWZpYyA9IEZBTFNFKX0pICsgbGFicyh0aXRsZSA9ICJFdi4gY29udGFnaW9zIENvbS5WYWxlbmNpYW5hIGVuIGZ1bmNpw7NuIGRlIHN1cyBoYWJpdGFudGVzIiwgY2FwdGlvbiA9ICJEYXRvcyBkZWwgSW5zdGl0dXRvIGRlIFNhbHVkIENhcmxvcyBJSUkiLCB4ID0gIk1lc2VzIiwgeSA9ICJDb250YWdpb3MgcGVyIGNhcGl0YSIpICsgIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIGZhY2UgPSAiYm9sZCIsIGNvbG9yID0gIkNvcmFsIikpICsgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCAxMiwgMSkpDQpnZ3Bsb3RseShncmFmaWNvQ1YpDQpgYGANCg0KYGBge3Igb3V0LndpZHRoPSI5MCUifQ0KDQpkZnJlbGIgPC0gZGZnZyAlPiUgbXV0YXRlKFRvdGFsX2NhcCA9IChOdW0vUG9ibGFjaW9uKSkNCg0KZGZUcmVseCA8LSBkZnJlbGIgJT4lIG11dGF0ZShUb3RhbHhjYXAgPSAoVG90YWxfY2FwKjEwMCkpICU+JSBmaWx0ZXIocHJvdmluY2lhICVpbiUgYygiQ2FzdGVsbG9uIiwgIlZhbGVuY2lhIiwgIkFsaWNhbnRlIikpDQoNCmRmVHJlbHggPC0gdHJhbnNmb3JtKGRmVHJlbHgsIG1lcyA9IGFzLm51bWVyaWMobWVzKSkNCg0KYSA8LSBnZ3Bsb3QoZGF0YSA9IGRmVHJlbHgsIGFlcyhtZXMsIE51bSwgZ3JvdXA9cHJvdmluY2lhLCBjb2xvciA9IHByb3ZpbmNpYSkpICsgZ2VvbV9saW5lKCkgKyBnZW9tX3BvaW50KCkgKyB0aGVtZV9taW5pbWFsKCkgICArIGxhYnMoeT0gIk7Dum1lcm8gZGUgY29udGFnaW9zIiwgeSA9ICJNZXNlcyIsIGNhcHRpb24gPSAiRWxhYm9yYWNpw7NuIHByb3BpYSIpICsgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpICsgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgxLCAxMSwgMSkpDQoNCmEgKyB0cmFuc2l0aW9uX3JldmVhbChtZXMpICsgbGFicyh0aXRsZT0iTsOaTUVSTyBERSBDQVNPUyBFTiBMQSBDT01VTklEQUQgVkFMRU5DSUFOQS4gTWVzOiB7YXMuaW50ZWdlcihmcmFtZV9hbG9uZyl9IikNCmBgYA0KDQpDZW50csOhbmRvbm9zIGVuIGxhcyBwcm92aW5jaWFzIGRlIGxhIENvbXVuaWRhZCBWYWxlbmNpYW5hLCBzZSBwdWVkZSBvYnNlcnZhciBxdWUgQWxpY2FudGUgZXMgbGEgcXVlIG1lbm9zIENvbnRhZ2lvcyB0aWVuZSBkZSBsYXMgdHJlcywgbHVlZ28gaXLDrWEgQ2FzdGVsbMOzbiB5IFZhbGVuY2lhLiBQZXJvIGxhcyB0cmVzLCB0aWVuZW4gdW5hIGJ1ZW5hIHRhc2EgZGUgY29udGFnaW9zIHJlc3BlY3RvIGFsIHJlc3RvIGRlIHByb3ZpbmNpYXMsIHlhIHF1ZSBlc3TDoW4gZW50cmUgbGFzIDExIHByb3ZpbmNpYXMgY29uIG1lbm9zIGNvbnRhZ2lvcyBkZSB0b2RhIEVzcGHDsWEuIA0KDQojIyMgNy4yIEluZ3Jlc2Fkb3MgZW4gU2VwdC1PY3QtTm92IHBvciBDb3ZpZC4gDQoNCmBgYHtyfQ0KZGF0b3NfQ1YgPC0gZGF0b3NfQ0NBQSAlPiUNCmZpbHRlcihjb2RfaW5lID09IDEwKSAlPiUNCnJlbG9jYXRlKGNvZF9pbmUsIC5iZWZvcmU9RGlhKSAjRGF0b3MgcGFyYSBsYSBDb211bml0YXQgVmFsZW5jaWFuYS4NCmRhdG9zX0NWX1NfTjwtIGRhdG9zX0NWICU+JSBmaWx0ZXIgKE1lcyA9PSAiMDkifCBNZXMgPT0gIjEwInwgTWVzID09ICIxMSIpDQpncmFmaWNvX0NWIDwtIGdncGxvdChkYXRvc19DVl9TX04gLCBhZXMoRGlhICwgYFRvdGFsIFBhY2llbnRlcyBDT1ZJRCBpbmdyZXNhZG9zYCwgZ3JvdXA9TWVzLCBjb2xvcj0gTWVzKSkgICsgZ2VvbV9saW5lKCkgKyBsYWJzKHRpdGxlID0gIiBFdm9sdWNpw7NuIGRlIHBhY2llbnRlcyBpbmdyZXNhZG9zIHBvciBjb3ZpZCBlbiBsYSBDb211bmlkYWQgVmFsZW5jaWFuYSIsIHN1YnRpdGxlID0gIkRlc2RlIGVsIDEgU2VwdGllbWJyZSBoYXN0YSBOb3ZpZW1icmUgMzAiLCBjYXB0aW9uID0gIkRhdG9zIHJlcG9zaXRvcmlvIENPVklEMTkiKQ0KZ3JhZmljb19DVg0KYGBgDQoNCmBgYHtyIGVjaG89RkFMU0UsIGV2YWw9RkFMU0V9DQpncmFmaWNvX2IgPC0gZ2dwbG90KGRhdG9zX0NWX1NfTiwgYWVzKERpYSwgYEFsdGFzIFVsdDI0aGAsICAgZmlsbCA9IE1lcyApKSArICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IikrIGxhYnModGl0bGUgPSAiTsO6bWVybyBkZSBwYWNpZW50ZXMgZGFkb3MgZGUgYWx0YSBwb3IgQ09WSUQgZW4gbGEgQ29tdW5pZGFkIFZhbGVuY2lhbmEgYWwgZMOtYSIpKyBsYWJzKHN1YnRpdGxlID0gIkRlc2RlIGVsIDEgU2VwdGllbWJyZSBoYXN0YSBOb3ZpZW1icmUgMzAiKQ0KDQpsaWJyYXJ5KHBsb3RseSkNCmdncGxvdGx5KGdyYWZpY29fYikNCiNMbyBvY3VsdGFtb3MgcG9ycXVlIG5vIG5vcyBndXN0YSBjb21vIHF1ZWRhLg0KYGBgDQoNCkxhIGV2b2x1Y2nDs24gZGUgbG9zIHBhY2llbnRlcyBpbmdyZXNhZG9zIHBvciBDT1ZJRCBlbiBsYSBzZWd1bmRhIG9sYSwgaGFuIGV2b2x1Y2lvbmFkbyBkZSBtYW5lcmEgc2ltaWxhciBhIGxhIGV2b2x1Y2nDs24gZGUgY29udGFnaW9zLg0KDQpQb2RlbW9zIHZlciwgY29tbyBlbiBzZXB0aWVtYnJlIGVsIG7Dum1lcm8gZGUgcGFjaWVudGVzIGVzdGFiYSBiYXN0YW50ZSBjb250cm9sYWRvLCBwZXJvIGN1YW5kbyBsbGVnw7MgZWwgbWVzIGRlIG9jdHVicmUsIGZ1ZSBjdWFuZG8gbG9zIGhvc3BpdGFsZXMgc3Vmcmllcm9uIHVuIHJlcHVudGUgdG90YWwgZGUgbG9zIHBhY2llbnRlcyBpbmdyZXNhZG9zLCBxdWUgZHVyYW50ZSBlbCBtZXMgZGUgbm92aWVtYnJlIGF1bWVudMOzIHRvZGF2w61hIG3DoXMgc2kgY2FiZS4NCg0KRW4gbm92aWVtYnJlIGxvcyBkYXRvcyBzZSB2b2x2aWVyb24gYWx0YW1lbnRlIHBlbGlncm9zb3MsIHlhIHF1ZSBsb3MgaG9zcGl0YWxlcyBkZSBsYSBDb211bmlkYWQgZXN0YWJhbiBjZXJjYSBkZSBjb2xhcHNhcnNlIGNvbW8geWEgc3VjZWRpw7MgZW4gbGEgcHJpbWVyYSBvbGEuIA0KDQpMYSBjcmVzdGEgZGUgZXN0YSBvbGEsIGxsZWfDsyBlbCAxOCBkZSBub3ZpZW1icmUgZG9uZGUgaGFiw61hbiBtw6FzIGRlIDE4MDAgaW5ncmVzYWRvcyBwb3IgY29yb25hdmlydXMgZW4gbGEgQ29tdW5pZGFkIFZhbGVuY2lhbmEuDQoNCiMjIFBydWViYXMgcmVhbGl6YWRhcyB7LnRhYnNldH0NCg0KIyMjIDxGT05UIENPTE9SPSJGRjREMDAiPioqVGlwb3MgZGUgcHJ1ZWJhcyoqPC9GT05UPg0KDQo8YnI+DQoNCkxhIHBydWViYSBtw6FzIHJlcGV0aWRhIGVuIG51ZXN0cmEgY29tdW5pZGFkIGVzIHNpbiBuaW5ndW5hIGR1ZGEsIGxhIHBydWViYSBQQ1IsIHNlZ3VpZGEgZGUgbGEgcHJ1ZWJhIGRlIGFudGljdWVycG9zLiBFbiB0b2RvcyBsb3MgbWVzZXMgcmVjb2dpZG9zLCBsYSBjYW50aWRhZCBkZSBwcnVlYmFzIFBDUiBlcyBtdXkgc3VwZXJpb3IgYSBsYSBjYW50aWRhZCBkZWwgcmVzdG8gZGUgcHJ1ZWJhcy4NCg0KVGFtYmnDqW4gcG9kZW1vcyB2ZXIsIHF1ZSBlbCBlbiBlbCBtZXMgZGUgc2VwdGllbWJyZSBzZSBoYW4gcmVhbGl6YWRvIG3DoXMgcHJ1ZWJhcyBxdWUgZW4gbG9zIG1lc2VzIGRlIGp1bGlvIHkgYWdvc3RvLg0KQ2FiZSBkZXN0YWNhciBxdWUsIGVuIGVsIG1lcyBkZSBqdWxpbywgc2UgcmVhbGl6YXJvbiBtw6FzIHBydWViYXMgZGUgYW50aWN1ZXJwb3MgcXVlIGVuIGVsIHJlc3RvIGRlIGxvcyBtZXNlcy4gDQoNClBvciDDumx0aW1vLCBzZSB2ZSB1bmEgY2xhcmEgZXZvbHVjacOzbiBhbCBhbHphIGRlIG90cm9zIHRlc3RzLCBlc3RvIHNlIGRhIGdyYWNpYXMgYSBxdWUgbGEgcHJ1ZWJhIGRlIGFudMOtZ2Vub3MgY2FkYSB2ZXogZXMgbcOhcyBjb23Dum4gZGViaWRvIGEgc3UgZWZpY2FjaWEgeSBhIHF1ZSBsYSByZWFsaXphY2nDs24gZGUgZWxsYSBlcyBtdWNobyBtw6FzIGJhcmF0YSBxdWUgbGFzIFBDUi4NCg0KYGBge3J9DQpjdiA8LSBkZnAgJT4lIGZpbHRlcihDQ0FBID09ICJDb211bmlkYWQgVmFsZW5jaWFuYSIpDQpjdiAgPC0gY3YgJT4lDQogIHNlcGFyYXRlKEZlY2hhLCBjKCJhw7FvIiwibWVzIiwiZGlhIiksIHNlcCA9ICItIikgJT4lICAgICAgICAgICAgICAgICByZWxvY2F0ZShhw7FvLCAuYWZ0ZXI9ZGlhKSAlPiUNCiAgcmVsb2NhdGUoZGlhLCAuYmVmb3JlID1tZXMpDQoNCg0KY3YgPC0gY3YgJT4lIGZpbHRlciAobWVzID09ICIwNyJ8IG1lcyA9PSAiMDgifCBtZXMgPT0gIjA5IikgJT4lIHNlbGVjdChkaWEsIG1lcywgUENSLCBURVNUX0FOVElDVUVSUE9TLCBPVFJPU19URVNUUykNCg0KY3ZsIDwtIGN2ICU+JSBwaXZvdF9sb25nZXIoMzo1LCBuYW1lc190byA9ICJQcnVlYmFzIiwgdmFsdWVzX3RvID0gIk4ucHJ1ZWJhIikNCg0KI1BhcmEgY2FsY3VsYXIgZW4gbGEgQ29tdW5pZGFkIFZhbGVuY2lhbmEgcXVlIHRpcG8gZGUgcHJ1ZWJhcyBzZSBoYW4gaGVjaG8gbcOhcyBkdXJhbnRlIGxvcyBtZXNlcyBkZSBqdWxpbywgYWdvc3RvIHkgc2VwdGllbWJyZS4NCg0KQ3NlcCA8LSBjdmwgJT4lIGdyb3VwX2J5KG1lcywgUHJ1ZWJhcykgJT4lIHN1bW1hcmlzZShUb3RhbCA9IHN1bShOLnBydWViYSkpICU+JSBmaWx0ZXIobWVzID09ICIwOSIpDQoNClMgPC0gZ2dwbG90KENzZXAsIGFlcygiIiwgVG90YWwsIGZpbGwgPSBQcnVlYmFzKSkgKyBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgY29sb3I9IndoaXRlIikgKyBnZW9tX3RleHQoYWVzKGxhYmVsPVRvdGFsKSwgcG9zaXRpb24gPSBwb3NpdGlvbl9zdGFjayh2anVzdD0wLjUpLCBjb2xvciA9ICJ3aGl0ZSIsIHNpemUgPSAyKSArIGNvb3JkX3BvbGFyKHRoZXRhID0gInkiKSArIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1jKCJzYWxtb24iLCJzdGVlbGJsdWUiLCJvcmFuZ2UiLCJncmF5IikpICsgdGhlbWVfdm9pZCgpICsgbGFicyh0aXRsZT0ic2VwdGllbWJyZSIpICsgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpDQojSWd1YWwgcGFyYSBqdWxpbyB5IGFnb3N0bw0KYGBgDQoNCmBgYHtyfQ0KDQpDanVsIDwtIGN2bCAlPiUgZ3JvdXBfYnkobWVzLCBQcnVlYmFzKSAlPiUgc3VtbWFyaXNlKFRvdGFsID0gc3VtKE4ucHJ1ZWJhKSkgJT4lIGZpbHRlcihtZXMgPT0gIjA3IikNCg0KSiA8LSBnZ3Bsb3QoQ2p1bCwgYWVzKCIiLCBUb3RhbCwgZmlsbCA9IFBydWViYXMpKSArIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBjb2xvcj0id2hpdGUiKSArIGdlb21fdGV4dChhZXMobGFiZWw9VG90YWwpLCBwb3NpdGlvbiA9IHBvc2l0aW9uX3N0YWNrKHZqdXN0PTAuNSksIGNvbG9yID0gIndoaXRlIiwgc2l6ZSA9IDIpICsgY29vcmRfcG9sYXIodGhldGEgPSAieSIpICsgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoInNhbG1vbiIsInN0ZWVsYmx1ZSIsIm9yYW5nZSIsImdyYXkiKSkgKyB0aGVtZV92b2lkKCkgKyBsYWJzKHRpdGxlPSJqdWxpbyIpICsgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQ0KDQpDYWdvc3QgPC0gY3ZsICU+JSBncm91cF9ieShtZXMsIFBydWViYXMpICU+JSBzdW1tYXJpc2UoVG90YWwgPSBzdW0oTi5wcnVlYmEpKSAlPiUgZmlsdGVyKG1lcyA9PSAiMDgiKQ0KDQpBIDwtIGdncGxvdChDYWdvc3QsIGFlcygiIiwgVG90YWwsIGZpbGwgPSBQcnVlYmFzKSkgKyBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgY29sb3I9IndoaXRlIikgKyBnZW9tX3RleHQoYWVzKGxhYmVsPVRvdGFsKSwgcG9zaXRpb24gPSBwb3NpdGlvbl9zdGFjayh2anVzdD0wLjUpLCBjb2xvciA9ICJ3aGl0ZSIsIHNpemUgPSAyKSArIGNvb3JkX3BvbGFyKHRoZXRhID0gInkiKSArIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1jKCJzYWxtb24iLCJzdGVlbGJsdWUiLCJvcmFuZ2UiLCJncmF5IikpICsgdGhlbWVfdm9pZCgpICsgbGFicyh0aXRsZT0iYWdvc3RvIikgKyB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpDQpgYGANCg0KYGBge3IgZWNobz1GQUxTRSwgZXZhbD1UUlVFLCBvdXQud2lkdGg9IjgwJSJ9DQpsaWJyYXJ5KHBhdGNod29yaykNCkogKyAgQSArIFMNCmBgYA0KDQojIyMgPEZPTlQgQ09MT1I9IkZGNEQwMCI+KipQQ1IncyBzZWfDum4gIG1lcyoqPC9GT05UPg0KDQpgYGB7cn0NCg0KQ19WIDwtIGRmQ0NBQSAlPiUgZmlsdGVyKENDQUEgPT0gIkMuVmFsZW5jaWFuYSIpDQpDX1YgPC0gQ19WICU+JSBzZWxlY3QoZGlhLCBtZXMsIGHDsW8sIENDQUEsIFBDUiwgVEVTVF9BTlRJQ1VFUlBPUykNCkNfViA8LSBDX1YgJT4lIHBpdm90X2xvbmdlcig1OjYsIG5hbWVzX3RvID0gIlBydWViYSIsIHZhbHVlc190bz0gIk4ucHJ1ZWJhIikNCg0KQ1ZsY25hIDwtIENfViAlPiUgZ3JvdXBfYnkobWVzLCBQcnVlYmEpICU+JSBzdW1tYXJpc2UoVG90YWwgPSBzdW0oTi5wcnVlYmEpKSAlPiUgZmlsdGVyKFBydWViYSA9PSAiUENSIikgJT4lIGZpbHRlcihtZXMgIT0gIjExIikNCg0KZ3JhZmljb0NfViA8LSBnZ3Bsb3QoQ1ZsY25hLCBhZXMobWVzLCBUb3RhbCwgZmlsbCA9ICJPcmFuZ2UiKSkgICsgZ2VvbV9jb2wocG9zaXRpb24gPSAiZG9kZ2UiKSArIGxhYnMoeCA9ICJNZXNlcyIsIHkgPSAiTsO6bS4gcHJ1ZWJhcyBQQ1IiLCB0aXRsZSA9ICJQQ1IncyBtZW5zdWFsZXMgQy5WYWxlbmNpYW5hIiwgc3VidGl0bGUgPSAgIk1lc2VzIGFicmlsLW9jdHVicmUiKSArIHRoZW1lX2J3KCkgKyB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkgKyB0aGVtZShwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpICsgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscz1mdW5jdGlvbihuKXtmb3JtYXQobiwgc2NpZW50aWZpYyA9IEZBTFNFKX0pDQpgYGANCg0KYGBge3IgZWNobz1GQUxTRSwgZXZhbD1UUlVFLCBvdXQud2lkdGg9Ijc1JSJ9DQpsaWJyYXJ5KHBsb3RseSkNCmdncGxvdGx5KGdyYWZpY29DX1YsIHRvb2x0aXAgPSBjKCJtZXMiLCAiVG90YWwiKSwgd2lkdGg9IDQ1MCkNCmBgYA0KRW4gZXN0ZSBncsOhZmljbyBzZSBtdWVzdHJhbiBsYXMgUENSJ3MgKiphY3VtdWxhZGFzKioNCg0KTGEgZXZvbHVjacOzbiBtZW5zdWFsIGRlIFBDUuKAmXMgZW4gbGEgQ29tdW5pZGFkIFZhbGVuY2lhbmEsIGRlbXVlc3RyYSBxdWUgbGEgY2FudGlkYWQgZGUgcHJ1ZWJhcyByZWFsaXphZGFzIGVuIGxhIHNlZ3VuZGEgb2xhLCBlcyBtdWNobyBtYXlvciBxdWUgZW4gbGEgcHJpbWVyYTsgZXN0byBzZSBkZWJlIGEgcXVlIGVuIGxhIHByaW1lcmEgb2xhIGVzdMOhYmFtb3MgZXNjYXNvcyBkZSByZWN1cnNvcy4gDQoNCg0KYGBge3IgZWNobz1UUlVFLCBldmFsPUZBTFNFfQ0KI0hlbW9zIGhlY2hvIGVzdGUgZ3LDoWZpY28gcGVybyBubyBzYWxlIGN1YW5kbyBsZSBkYW1vcyBhIEtuaXQuDQpsaWJyYXJ5KGhpZ2hjaGFydGVyKQ0KDQpDX3ZmIDwtIENfViAlPiUgZmlsdGVyKG1lcyAhPSAiMTEiKSAlPiUgZmlsdGVyKG1lcyAhPSAiNCIpICAlPiUgZ3JvdXBfYnkobWVzLCBQcnVlYmEpICU+JSBzdW1tYXJpc2UoVG90YWwgPSBzdW0oTi5wcnVlYmEpKQ0KDQpoY2hhcnQoQ192ZiwgImNvbHVtbiIsIGhjYWVzKHggPSBtZXMsIHkgPSBUb3RhbCwgZ3JvdXAgPSBQcnVlYmEpKSAgJT4lICBoY19hZGRfdGhlbWUoaGNfdGhlbWVfZ3JpZGxpZ2h0KCkpICAlPiUgICBoY190aXRsZSgNCiAgICB0ZXh0ID0gIjxiPk7Dmk1FUk8gREUgUFJVRUJBUyBTRUfDmk4gVEVTVFMgWSBNRVNFUyBFTiBMQSBDT01VTklEQUQgVkFMRU5DSUFOQSA8L2I+IiwNCiAgICBtYXJnaW4gPSAyMCwNCiAgICBhbGlnbiA9ICJjZW50ZXIiLA0KICAgIHN0eWxlID0gbGlzdChjb2xvciA9ICIjMjJBODg0IikpDQoNCiMqTG9zIHZhbG9yZXMgZGUgZXN0ZSBncsOhZmljbyBzb24gbGEgc3VtYSB0b3RhbCBkZSBsYXMgcHJ1ZWJhcyByZWFsaXphZGFzIGVuIHVuIG1lcyBjb25jcmV0bywgbG9zIGRhdG9zIG9mcmVjaWRvcyBtb3N0cmFiYW4gbGFzIHBydWViYXMgcmVhbGl6YWRhcyBwb3Igc2VtYW5hcyBkdXJhbnRlIGNhZGEgbWVzLg0KYGBgDQoNCg0KIyMgOC4gQWxndW5hcyBjdWVzdGlvbmVzIHNvYnJlIGVsIGltcGFjdG8gZWNvbsOzbWljbyB7LnRhYnNldH0NCg0KIyMjIDxGT05UIENPTE9SPSJGRjREMDAiPioqwr9RdcOpIGN1ZXN0aW9uZXM/Kio8L0ZPTlQ+DQoNClBvciDDumx0aW1vLCBlbiBlc3RlIGFwYXJ0YWRvIG5vcyBndXN0YXLDrWEgY29tZW50YXIgY3VhbCBoYSBzaWRvIGVsIGVmZWN0byBkZSBsYSBDb3ZpZC0xOSwgZW4gYWxndW5vcyDDoW1iaXRvcyBlY29uw7NtaWNvcywgZW4gY29uY3JldG8sIGNvbW8gaGEgYWZlY3RhZG8gYWwgbWVyY2FkbyBkZSB0cmFiYWpvLCBhbCBkZXNlbXBsZW8sIGVuIGRpZmVyZW50ZXMgcGHDrXNlcyBldXJvcGVvcy4gQWRlbcOhcyBkZSBhbGd1bmFzIGN1ZXN0aW9uZXMgc29icmUgZWwgUElCLCBlbCBjdWFsLCBjb21vIGVyYSBkZSBlc3BlcmFyIGhhIGJhamFkbyBkZGViaWRvIGEgbGEgYWN0dWFsIGNyaXNpcyBzYW5pdGFyaWEuICANCg0KUGFyYSBtb3N0cmFyIGVzdG8sIGhlbW9zIGNvZ2lkbyBkYXRvcyBkZWwgRXVyb3N0YXQuIEVzdGUgQlJFVkUgYW7DoWxpc2lzIHNlIGRpdmlkaXLDoSBlbjoNCg0KLSBQcmltZXJhbWVudGUgdW4gbWFwYSBjb24gZWwgJSBkZSBwYXJhZG9zIHF1ZSBoYWLDrWEgZW4gbG9zIGRpZmVyZW50ZXMgcGHDrXNlcyBkZSBsYSBVbmnDs24gRXVyb3BlYSwgZHVyYW50ZSBlbCBtZXMgZGUgYWJyaWwsIGVuIHBsZW5hIHBhbmRlbWlhICh5IGNvbmZpbmFtaW5ldG8gZGUgbXVjaG9zIGRlIGVzdG9zIHBhw61zZXMpDQoNCi0gU2VndWlkYW1lbnRlIGNvbXBhcmFyZW1vcyBlbiBsb3MgZGlmZXJlbnRlcyBtZXNlcyBjb21vIGhhIGV2b2x1Y2lvbmFkbyBlbCBwYXJvIGVuIDUgcGHDrXNlcyBldXJvcGVvcywgZXN0b3Mgc29uOiBGcmFuY2lhLCBQb3J0dWdhbCwgSXRhbGlhLCBFc3Bhw7FhIHkgY29tbyBjdXJpb3NpZGFkLCBTdWVjaWEsIHlhIHF1ZSBlcyBlbCDDum5pY28gcGHDrXMgZXVyb3BlbyBlbiBlbCBxdWUgbm8gaGFiaWRvIHVuIGNvbmZpbmFtaWVudG8gZXN0cmljdG8uIA0KDQotIFBvciDDumx0aW1vLCBjZW50cmFkb3MgZW4gRXNwYcOxYSwgcG9kcmVtb3Mgb2JzZXJ2YXIgY29tbyBlbCBwYXJvIGhhIGFmZWN0YWRvIGhhIGFmZWN0YWRvIGRlIG1hbmVyYSBkaWZlcmVudGUgZGVwZW5kaWVuZG8gZGVsIGfDqW5lcm8uIFByZXNlbnRhbmRvIHVuICUgZGUgcGFybyBtYXlvciBsYXMgbXVlamVyZXMgcXVlIGxvcyBob21icmVzLiANCg0KRW4gY3VhbnRvIGFsIFBJQiwgY29uc2lkZXJhbmRvIGVsIGHDsW8gYmFzZSBlbiAyMDE1LCBwcmV0ZW5kZW1vcyB2ZXIgZWwgZWZlY3RvIHBhcmEgRnJhbmNpYSwgSXRhbGlhLCBFc3Bhw7FhIHkgU3VlY2lhIGRlbDoNCg0KLSBQSUIgYSBwcmVjaW9zIGRlIG1lcmNhZG8uDQotIEV4cG9ydGFjaW9uZXMgZGUgYmllbmVzIHkgc2VydmljaW9zLg0KLSBJbXBvcnRhY2lvbmVzIGRlIGJpZW5lcyB5IHNlcnZpY2lvcy4NCg0KDQojIyMgPEZPTlQgQ09MT1I9IkZGNEQwMCI+KipERVNFTVBMRU8qKjwvRk9OVD4NCg0KQ29uIGVsIGZpbiBkZSBhbmFsaXphciBsYSBzaXR1YWNpw7NuIGRlbCBtZXJjYWRvIGxhYm9yYWwgdHJhcyBsYSBjcmlzaSBkZWwgQ292aWQsIGhlbW9zIGhlY2hvIHVuYSBzZXJpZSBkZSBtYXBhcy1ncsOhZmljb3MuDQoNCkEgdHJhdsOpcyBkZWwgbWFwYSwgb2JzZXJ2YW1vcyBxdWUgZW4gZWwgbWVzIGRlIEFicmlsIGxhIHRhc2EgYXJtb25pemFkYSBkZSBwYXJvIGVuIEVzcGHDsWEgc2Ugc2l0dWFiYSBlbiB2YWxvcmVzIGVudHJlIDE0LDMtMTYsNC4gQ2lmcmFzIHNvbG8gc3VwZXJhZGFzIHBvciBHcmVjaWEuDQoNCk5vIG9ic3RhbnRlLCBjYWJlIGRlc3RhY2FyIHF1ZSBlc3RvIG5vIGVzIHVuYSBzaXR1YWNpw7NuIG51ZXZhLCBlcyBkZWNpciwgbGFzIGNpZnJhcyBkZSBwYXJvIGVuIEVzcGHDsWEgeWEgZXJhbiBlbGV2YWRhcyBhbnRlcyBkZSBsYSBwYW5kZW1pYSwgYWwgaWd1YWwgcXVlIGVuIEdyZWNpYSwgUG9yIGxvIHRhbnRvLCBubyBvYnNlcnZhbW9zIGEgY29ydG8gcGxhem8gY2FtYmlvcyBtdXkgc2lnbmlmaWNhdGl2b3MgZW50cmUgbGEgcHJvcG9yY2nDs24gZGUgbGEgcG9ibGFjacOzbiBvY3VwYWRhIHkgbGEgZGVzb2N1cGFkYSAoUG9ibGFjacOzbiBBY3RpdmEpDQoNCkVuIGVsIHNpZ3VpZW50ZSBncsOhZmljbyBzZSBtdWVzdHJhIGxhIGV2b2x1Y2nDs24gZGUgbGEgdGFzYSBkZSBwYXJvIGFybW9uaXphZGEgcGFyYSA1IHBhw61zZXMgKEVzcGHDsWEsIEZyYW5jaWEsIEl0YWxpYSwgUG9ydHVnYWwgeSBTdWVjaWEpDQoNCkNvbW8gdmVtb3MsIGxhIHRlbmRlbmNpYSBhdW5xdWUgbm8gbXV5IHByb251bmNpYWRhIGVzIGNsYXJhLCBhIGV4Y2VwY2nDs24gZGUgSXRhbGlhLiBBcXXDrSBwcmltZXJvIHBhcmVjZSBkaXNtaW51aXIgbGEgdGFzYSBkZSBwYXJvIHkgYSBwYXJ0aXIgZGUgYWJyaWwgY2FtYmlhIGRlIHRlbmRlbmNpYSB5IGVtcGllemEgYSBhdW1lbnRhci4gDQoNCkVuIGNhbWJpbywgbG9zIGRlbcOhcyBwYcOtc2VzIGFuYWxpemFkb3MgeSBzb2JyZXRvZG8gZW4gRXNwYcOxYSBsYSB0YXNhIGRlIHBhcm8gYXVtZW50YSB0cmFzIGxhIGNyaXNpcyBzYW5pdGFyaWEuIFBhc2FuZG8sIHBvciBlamVtcGxvLCBlbiBFc3Bhw7FhIGRlIDEzLDclIGVuIGRpY2llbWJyZSBkZSAyMDE5IGEgMTYsMiUgZW4gbm92aWVtYnJlIGRlIDIwMjAsIHBhc2FuZG8gcG9yIHVuIG3DoXhpbW8gZGUgMTYsOSUgZW4ganVsaW8uIA0KDQpFbiBlbCDDumx0aW1vIGdyw6FmaWNvIHNlIG11ZXN0cmEgY29tbyBoYSBhZmVjdGFkbyBlbiBFc3Bhw7FhIGxhIHRhc2EgZGUgcGFybyBlbiBmdW5jacOzbiBkZWwgZ8OpbmVybywgZG9uZGUgcG9kZW1vcyBjb25jbHVpciBxdWUgaGF5IG3DoXMgJSBkZSBtdWplcmVzIGRlc2VtcGxlYWRhcyBxdWUgZGUgaG9tYnJlcy4NCg0KRmluYWxtZW50ZSwgZGVjaXIgcXVlIGVzdGEgY3Jpc2lzIG5vIGhhIGFmZWN0YWRvIGRlIGlndWFsIG1hbmVyYSBxdWUgbGEgcmVjZXNpw7NuIGRlIDIwMDgsICBhZGVtw6FzIGRlIHF1ZSBtdWNoYXMgZW1wcmVzYXMgaGFuIHRlbmlkbyBxdWUgYXBsaWNhciBlbCBFUlRFIGEgc3VzIHRyYWJhamFkb3JlcyB5IGVsIGdvYmllcm5vIGhhIHRlbmlkbyBxdWUgYWRvcHRhciBudWV2YXMgbWVkaWRhcyBlbiB0b3JubyBhIGVzdG8uIFteNV0NCg0KDQoNCmBgYHtyIGVjaG89RkFMU0UsIGV2YWw9VFJVRX0NCmxpYnJhcnkoZXVyb3N0YXQpDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCg0KI1Byb2JhbmRvIGEgYQ0KbWFwZGF0YV8wIDwtIGdldF9ldXJvc3RhdF9nZW9zcGF0aWFsKG51dHNfbGV2ZWwgPSAwKQ0KbSA8LSBtYXBkYXRhXzAgJT4lDQogIGdncGxvdCguLCBhZXMoKSkgKw0KICBnZW9tX3NmKGZpbGw9ImdyZWVuIiwgY29sb3I9ImJsYWNrIiwgc2l6ZSA9IDAuMSkgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB4bGltKGMoLTMwLCA0NCkpICsNCiAgeWxpbShjKDM1LCA3NSkpDQpgYGANCg0KYGBge3J9DQojUFJFUEFSQU5ETyBMT1MgREFUT1MNCnBhcm8gPC0gc2VhcmNoX2V1cm9zdGF0KHBhdHRlcm4gPSAidW5lbXBsb3ltZW50IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9ICJ0YWJsZSIpDQoNCiNIYXkgZGF0b3MgaGFzdGEgMjAyME0xMSwgZXMgZGVjaXIsIGhhc3RhIGVsIG1lcyBkZSBub3ZpZW1icmUgZGUgZXN0ZSBhw7FvLCAyMDIwLg0KDQppbmZfcGFybyA8LSBnZXRfZXVyb3N0YXQoaWQ9ICJ0ZWlsbTAyMCIsICB0aW1lX2Zvcm1hdCA9ICJudW0iKQ0KDQpsYWJlbEUgPC0gbGFiZWxfZXVyb3N0YXQoaW5mX3Bhcm8pDQoNCmNvdW50cnlfY29kZXMgPC0gdW5pcXVlKG1hcGRhdGFfMCROVVRTX0lEKQ0KDQojMjAyMC4yNSBjb3JyZXNwb25kZSBhbCBhw7FvIDIwMjAgbWVzIDA0IChhYnJpbCkNCmluZl9wYXJvXzIwMjAgPC0gaW5mX3Bhcm8gJT4lDQogIGZpbHRlciggdGltZSA9PSAiMjAyMC4yNSIpICU+JQ0KICBmaWx0ZXIoZ2VvICVpbiUgY291bnRyeV9jb2RlcykNCg0KaW5mX3Bhcm9fMjAyMF9tYXBhIDwtIG1hcGRhdGFfMCAlPiUNCiAgcmlnaHRfam9pbihpbmZfcGFyb18yMDIwKSAlPiUNCiAgbXV0YXRlKGNhdCA9IGN1dF90b19jbGFzc2VzKHZhbHVlcywgbj04LCBkZWNpbWFscyA9IDEpKQ0KYGBgDQoNCiAqKk1hcGEgZGUgY29yb3BsZXRhcyBwYXJhIGVsIHBhcm8qKg0KDQoNCmBgYHtyIG91dC53aWR0aD0iODUlIn0NCiNDT0RJR08gUEFSQSBFTCBNQVBBDQoNCmdncGxvdChpbmZfcGFyb18yMDIwX21hcGEsIGFlcyhmaWxsPWNhdCkpICsNCiAgZ2VvbV9zZihjb2xvciA9IGFscGhhKCJ3aGl0ZSIsIDEvMiksIGFscGhhPSAuOSkgKw0KICB4bGltKGMoLTIwLCA0NCkpICsNCiAgeWxpbShjKDM1LCA3MCkpICsNCiAgbGFicyh0aXRsZSA9ICJUYXNhIGFybW9uaXphZGEgZGUgcGFybyAoJSkiLA0KICAgICAgIHN1YnRpdGxlID0gIkFicmlsIDIwMjAiLA0KICAgICAgIGNhcHRpb24gPSAiKEMpIEV1cm9HZW9ncmFwaGljcyBmb3IgdGhlIGFkbWluaXN0cmF0aXZlIGJvdW5kYXJpZXMiLA0KICAgICAgIGZpbGw9ICIiKSArDQogIHRoZW1lX2NsYXNzaWMoKSArDQogIHRoZW1lKA0KICAgIGF4aXMubGluZSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICBheGlzLnRleHQgPSBlbGVtZW50X2JsYW5rKCksDQogICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9ibGFuaygpLA0KICAgIHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gInNub3ciLCBjb2xvciA9IE5BKSwNCiAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGw9ICJzbm93IiwgY29sb3IgPSBOQSksDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTgsIGhqdXN0ID0gMC41KSwNCiAgICBwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiwgaGp1c3QgPSAwLjUpLA0KICAgIHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChzaXplID0gOCwgaGp1c3QgPSAxKSwNCiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiZ3JleTQwIiwgc2l6ZSA9IDgpLA0KICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImdyZXk0MCIsIHNpemUgPSA3LCBoanVzdCA9IDApLA0KICAgIGxlZ2VuZC5wb3NpdGlvbiA9IGMoMC45MywgMC42KSwNCiAgICBwbG90Lm1hcmdpbiA9IHVuaXQoYygwLjUsMiwwLjUsMSksICJjbSIpKSArDQogIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGU9ICJQYWlyZWQiKQ0KYGBgDQoNCg0KKipFdm9sdWNpw7NuIGRlbCBwYXJvKioNCg0KYGBge3J9DQojUFJFUEFSQU5ETyBMT1MgREFUT1MNCiNMYSB0YXNhIGRlIHBhcm8gZGUgRXNwYcOxYSBlbiBlbCBtZXMgZGUgYWJyaWwgZnVlIGRlbCAxNSUNCg0KI0VuIGNhbWJpbywgZW4gZWwgbWVzIGRlIGVuZXJvLCBhbnRlcyBkZSBjb21lbnphciBsYSBwYW5kZW1pYSBlcmEgZGUgMTMuNQ0KDQojRmlsdHJhbW9zIHBhcmEgY29tcGFyYXIgRXNwYcOxYSwgRnJhbmNpYSwgSXRhbGlhLCBQb3J0dWdhbCB5IFN1aXphDQoNCkZpbHRyb3MgPC0gaW5mX3Bhcm8gJT4lIGZpbHRlcihnZW8gJWluJSBjKCJFUyIsICJQVCIsICJJVCIsICJGUiIsICJTRSIpKQ0KRmlsdHJvcyA8LSBGaWx0cm9zICU+JSBmaWx0ZXIoc2V4ID09ICJUIikNCg0KbGlicmFyeShwbG90bHkpDQoNCkV2cGFybyA8LSBnZ3Bsb3QoRmlsdHJvcywgYWVzKHRpbWUsIHZhbHVlcywgY29sb3IgPSBnZW8pKSArIGdlb21fbGluZShzaXplID0gMSkgKyBnZW9tX3BvaW50KCkgKyBsYWJzKHkgPSAiVmFsb3IgKGVuICUpIiwgdGl0bGUgPSAiRXZvbHVjacOzbiBkZSBsYSB0YXNhIGRlIHBhcm8gYXJtb25pemFkYSAoZW4gJSkiLA0Kc3VidGl0bGUgPSAiUEHDjVNFUzogRXNwYcOxYSwgRnJhbmNpYSwgSXRhbGlhLCBQb3J0dWdhbCwgU3VlY2lhIiwgY2FwdGlvbiA9IkRhdG9zIEV1cm9zdGF0Lg0KTG9zIGRhdG9zIHZhbiBkZXNkZSBkaWNpZW1icmUgMjAxOSBoYXN0YSBvY3R1YnJlIDIwMjAuDQooQ2FkYSBwdW50byBkZWwgZ3LDoWZpY28gaW5kaWNhIHVuIG1lcykiKSArDQp0aGVtZV9saWdodCgpICsNCnRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE4LCBoanVzdCA9IDAuNSksDQpwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiwgaGp1c3QgPSAwLjUpLA0KcGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KHNpemUgPSA4LCBoanVzdCA9IDEpKSArDQogIHRoZW1lKGF4aXMudGl0bGUueD1lbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGV4dC54PWVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50aWNrcy54PWVsZW1lbnRfYmxhbmsoKSkNCg0KRXZwYXJvIDwtIEV2cGFybyArIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoMiwgMTcsIDEpKQ0KYGBgDQoNCmBgYHtyIGVjaG89RkFMU0UsIGV2YWw9VFJVRX0NCmdncGxvdGx5KEV2cGFybywgdG9vbHRpcCA9IGMoImdlbyIsICJ2YWx1ZXMiKSwgd2lkdGg9IDg1MCkNCmBgYA0KDQoqKlBhcm8gZW4gRXNwYcOxYSwgYSBxdcOpIGdlbmVybyBoYSBhZmVjdGFkbyBtw6FzPyoqDQoNCmBgYHtyfQ0KI0NvbW8gaGEgYWZlY3RhZG8gZWwgcGFybyBkZXBlbmRpZW5kbyBkZWwgc2V4bz8NCg0KU3BhaW4gPC0gaW5mX3Bhcm8gJT4lIGZpbHRlcihnZW8gPT0gIkVTIikNClNwYWluIDwtIFNwYWluICU+JSBmaWx0ZXIoc2V4ICVpbiUgYygiTSIsICJGIikpDQoNCg0KR3JhZmljb1NwYWluIDwtIGdncGxvdChTcGFpbiwgYWVzKHRpbWUsIHZhbHVlcywgY29sb3IgPSBzZXgpKSArDQogIGdlb21fbGluZShzaXplID0gMSkgKw0KICBnZW9tX3BvaW50KCkgKw0KICBsYWJzKHkgPSAiVmFsb3IgKGVuICUpIiwNCiAgICAgICB0aXRsZSA9ICJFdm9sdWNpw7NuIHRhc2EgZGUgcGFybyBhcm1vbml6YWRhIHBhcmEgRXNwYcOxYSAoZW4gJSkiLA0KIHN1YnRpdGxlID0gIkRpZmVyZW5jaWFuZG8gcG9yIHNleG86IGZlbWVuaW5vIHkgbWFzY3VsaW5vIiwgY2FwdGlvbiA9IkRhdG9zIEV1cm9zdGF0Lg0KTG9zIGRhdG9zIHZhbiBkZXNkZSBkaWNpZW1icmUgMjAxOSBoYXN0YSBvY3R1YnJlIDIwMjAuDQooQ2FkYSBwdW50byBkZWwgZ3LDoWZpY28gaW5kaWNhIHVuIG1lcykiKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE4LCBoanVzdCA9IDAuNSksDQogICAgICAgIHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyLCBoanVzdCA9IDAuNSksDQogICAgICAgIHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChzaXplID0gOCwgaGp1c3QgPSAxKSkgKw0KICB0aGVtZShheGlzLnRpdGxlLng9ZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRleHQueD1lbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGlja3MueD1lbGVtZW50X2JsYW5rKCkpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpICsNCiB0aGVtZShsZWdlbmQuZGlyZWN0aW9uID0gImhvcml6b250YWwiKQ0KYGBgDQoNCmBgYHtyIGVjaG89RkFMU0UsIGV2YWw9VFJVRSwgb3V0LndpZHRoPSI4NSUifQ0KbGlicmFyeShnZ1RoZW1lQXNzaXN0KQ0KR3JhZmljb1NwYWluICsgdGhlbWUoIA0KICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoY29sb3VyID0gImNvcmFsMiIpLCANCiAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDExLCANCiAgICAgICAgY29sb3VyID0gImFxdWFtYXJpbmU0IiksIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9IE5BKSwgDQogICAgcGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAiYWxpY2VibHVlIiwgDQogICAgICAgIGNvbG91ciA9IE5BKSwgbGVnZW5kLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJhbGljZWJsdWUiKSkNCmBgYA0KDQojIyMgPEZPTlQgQ09MT1I9IkZGNEQwMCI+KipQSUIqKjwvRk9OVD4NCg0KYGBge3J9DQojRGF0b3MgZGVsIHBhcXVldGUgRXVyb3N0YXQ6DQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCg0KbGlicmFyeShldXJvc3RhdCkNCg0KZ2RwIDwtIGdldF9ldXJvc3RhdCgibmFtcV8xMF9nZHAiLCB0aW1lX2Zvcm1hdCA9ICJyYXciLCBrZWVwRmxhZ3MgPSBUUlVFKQ0KDQpsYWJlbGdkcCA8LSBsYWJlbF9ldXJvc3RhdChnZHAsIGZpeF9kdXBsaWNhdGVkID0gVFJVRSkNCmRmX25hbWVzIDwtIG5hbWVzKGdkcCkNCg0KZGYgPC0gbGFiZWxfZXVyb3N0YXQoZ2RwLCBjb2RlID0gZGZfbmFtZXMsIGZpeF9kdXBsaWNhdGVkID0gVFJVRSkNCg0KZGYgPC0gZGYgJT4lDQogICAgc2VsZWN0KHVuaXRfY29kZSwgc19hZGpfY29kZSwgbmFfaXRlbV9jb2RlLCBnZW8sIGdlb19jb2RlLCB0aW1lLCB2YWx1ZXMpDQoNCiNkZl9iYiA8LSBwanB2MjAyMC4wMTo6cGpwX2ZfdW5pcXVlX3ZhbHVlcyhkZiwgdHJ1bmNhdGUgPSBUUlVFLCBubl90cnVuY2F0ZSA9IDIwMCkNCg0KZGYgPC0gZGYgJT4lIGZpbHRlcih0aW1lID49ICIyMDE4UTEiKQ0KZ2RwIDwtIGRmDQoNCg0KZ2RwPC0gZ2RwICU+JSByZW5hbWUgKHVuaWRhZF9kZV9tZWRpZGEgPW5hX2l0ZW1fY29kZSkNCg0KIyBhKSBHcm9zcyBkb21lc3RpYyBwcm9kdWN0IGF0IG1hcmtldCBwcmljZXMNCmdkcF9hIDwtICBnZHAgICU+JSBmaWx0ZXIodW5pZGFkX2RlX21lZGlkYT09ICJCMUdRIikgJT4lIHNlbGVjdCgtdW5pZGFkX2RlX21lZGlkYSkNCg0KZ2RwX2EgPC0gZ2RwX2EgJT4lIGZpbHRlcih1bml0X2NvZGUgPT0gIkNMVl9JMTUiKSAlPiUgZmlsdGVyKHNfYWRqX2NvZGUgPT0gIlNDQSIpDQoNCmdkcF9hIDwtIGdkcF9hICU+JSBzZWxlY3QoLWModW5pdF9jb2RlLHNfYWRqX2NvZGUpKQ0KI0xvIG1pc21vIHBhcmEgbGFzIGV4cG9ydGFjaW9uZXMgeSBsYXMgaW1wb3J0YWNpb25lcw0KDQpgYGANCg0KYGBge3IgZWNobz1GQUxTRSwgZXZhbD1UUlVFfQ0KI2IpRXhwb3J0IG9mIGdvb2RzIGFuZCBzZXJ2aWNlcy4NCmdkcF9iIDwtIGdkcCAgJT4lIGZpbHRlcih1bmlkYWRfZGVfbWVkaWRhPT0gIlA2IikgJT4lIGZpbHRlcih1bml0X2NvZGUgPT0gIkNMVl9JMTUiKSAlPiUgZmlsdGVyKHNfYWRqX2NvZGUgPT0gIlNDQSIpDQoNCmdkcF9iIDwtIGdkcF9iICU+JSBzZWxlY3QoLWModW5pdF9jb2RlLHNfYWRqX2NvZGUpKQ0KZ2RwX2IgPC0gZ2RwX2IgJT4lIHNlbGVjdCgtdW5pZGFkX2RlX21lZGlkYSkNCg0KI2MpSW1wb3J0cyBvZiBnb29kIGFuZCBzZXJ2aWNlcy4NCg0KZ2RwX2MgPC0gIGdkcCAgJT4lIGZpbHRlcih1bmlkYWRfZGVfbWVkaWRhPT0gIlA3IikgJT4lIGZpbHRlcih1bml0X2NvZGUgPT0gIkNMVl9JMTUiKSAlPiUgZmlsdGVyKHNfYWRqX2NvZGUgPT0gIlNDQSIpDQoNCmdkcF9jIDwtIGdkcF9jICU+JSBzZWxlY3QoLWModW5pdF9jb2RlLHNfYWRqX2NvZGUpKQ0KZ2RwX2MgPC0gZ2RwX2MgJT4lIHNlbGVjdCgtdW5pZGFkX2RlX21lZGlkYSkNCg0KI2QpR3Jvc3MgZml4ZWQgY2FwaXRhbCBmb3JtYXRpb24NCmdkcF9kPC0gZ2RwICAlPiUgZmlsdGVyKHVuaWRhZF9kZV9tZWRpZGE9PSAiUDUxRyIpICU+JSBmaWx0ZXIoc19hZGpfY29kZSA9PSAiU0NBIikgJT4lIGZpbHRlcih1bml0X2NvZGUgPT0gIkNMVl9JMTUiKQ0KDQpnZHBfZCA8LSBnZHBfZCAlPiUgc2VsZWN0KC1jKHVuaXRfY29kZSxzX2Fkal9jb2RlKSkNCmdkcF9kIDwtIGdkcF9kICU+JSBzZWxlY3QoLXVuaWRhZF9kZV9tZWRpZGEpDQoNCg0KI3NlbGVjY2lvbmFtb3MgRnJhbmNpYSBJdGFsaWEgRXNwYcOxYSB5IFNVZWNpYQ0KDQpnZHBfcGE8LSBnZHBfYSAlPiUgIGZpbHRlciAoZ2VvPT0iSXRhbHkifGdlbz09IlN3ZWRlbiJ8Z2VvPT0iRnJhbmNlInxnZW89PSJTcGFpbiIgKQ0KZ2RwX3BiPC0gZ2RwX2IgJT4lICBmaWx0ZXIgKGdlbz09Ikl0YWx5InxnZW89PSJTd2VkZW4ifGdlbz09IkZyYW5jZSJ8Z2VvPT0iU3BhaW4iICkNCmdkcF9wYzwtIGdkcF9jICU+JSAgZmlsdGVyIChnZW89PSJJdGFseSJ8Z2VvPT0iU3dlZGVuInxnZW89PSJGcmFuY2UifGdlbz09IlNwYWluIiApDQoNCmBgYA0KDQpgYGB7cn0NCmxpYnJhcnkocGxvdGx5KQ0KDQpFdmdkcGEgPC0gZ2dwbG90KGdkcF9wYSwgYWVzKHRpbWUsIHZhbHVlcyxncm91cD1nZW8sIGNvbG9yID0gZ2VvKSkgKyBnZW9tX2xpbmUoc2l6ZSA9IDEpICsgZ2VvbV9wb2ludCgpICsgbGFicyh5ID0gIlZhbG9yICjDjW5kaWNlcykiLCB0aXRsZSA9ICJFdm9sdWNpw7NuIGRlbCBQSUIgYSBwcmVjaW9zIGRlIG1lcmNhZG8gKEHDsW8gYmFzZSAyMDE1KSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJ0aXRsZSA9ICJQQcONU0VTOiBFc3Bhw7FhLCBGcmFuY2lhLCBJdGFsaWEsIFBvcnR1Z2FsLCBTdWVjaWEiLCBjYXB0aW9uID0iRGF0b3MgRXVyb3N0YXQuDQpMb3MgZGF0b3MgdmFuIGRlc2RlIGVsIHByaW1lciB0cmltZXN0cmUgZGUgMjAxOCBoYXN0YSBlbCB0ZXJjZXIgdHJpbWVzdHJlIGRlbCAyMDIwLg0KKENhZGEgcHVudG8gZGVsIGdyw6FmaWNvIGluZGljYSB1biB0cmltZXN0cmUpIikgKw0KICAgIHRoZW1lX2xpZ2h0KCkgKw0KICAgIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE4LCBoanVzdCA9IDAuNSksDQogICAgICAgICAgcGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIsIGhqdXN0ID0gMC41KSwNCiAgICAgICAgICBwbG90LmNhcHRpb24gPSBlbGVtZW50X3RleHQoc2l6ZSA9IDgsIGhqdXN0ID0gMSkpICsNCiAgICB0aGVtZShheGlzLnRpdGxlLng9ZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgIGF4aXMudGV4dC54PWVsZW1lbnRfYmxhbmsoKSkNCg0KDQojZ2dwbG90bHkoRXZnZHBhLCB0b29sdGlwID0gYygiZ2VvIiwgInZhbHVlcyIpKQ0KYGBgIA0KDQoNCmBgYHtyIGVjaG89RkFMU0UsIGV2YWw9VFJVRX0NCkV2Z2RwYiA8LSBnZ3Bsb3QoZ2RwX3BiLCBhZXModGltZSwgdmFsdWVzLGdyb3VwPWdlbywgY29sb3IgPSBnZW8pKSArIGdlb21fbGluZShzaXplID0gMSkgKyBnZW9tX3BvaW50KCkgKyBsYWJzKHkgPSAiVmFsb3IgKMONbmRpY2VzKSIsIHRpdGxlID0gIkV2b2wuICAgZXhwb3J0LiBkZSBiaWVuZXMgeSBzZXJ2aWNpb3MgKEEuIGJhc2UgMjAxNSkiLHN1YnRpdGxlID0gIlBBw41TRVM6IEVzcGHDsWEsIEZyYW5jaWEsIEl0YWxpYSwgUG9ydHVnYWwsIFN1ZWNpYSIsIGNhcHRpb24gPSJEYXRvcyBFdXJvc3RhdC4NCkxvcyBkYXRvcyB2YW4gZGVzZGUgZWwgcHJpbWVyIHRyaW1lc3RyZSBkZSAyMDE4IGhhc3RhIGVsIHRlcmNlciB0cmltZXN0cmUgZGVsIDIwMjAuDQooQ2FkYSBwdW50byBkZWwgZ3LDoWZpY28gaW5kaWNhIHVuIHRyaW1lc3RyZSkiKSArDQogICAgdGhlbWVfbGlnaHQoKSArDQogICAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTgsIGhqdXN0ID0gMC41KSwNCiAgICAgICAgICBwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiwgaGp1c3QgPSAwLjUpLA0KICAgICAgICAgIHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChzaXplID0gOCwgaGp1c3QgPSAxKSkgKw0KICAgIHRoZW1lKGF4aXMudGl0bGUueD1lbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgYXhpcy50ZXh0Lng9ZWxlbWVudF9ibGFuaygpKQ0KDQoNCiNnZ3Bsb3RseShFdmdkcGIsIHRvb2x0aXAgPSBjKCJnZW8iLCAidmFsdWVzIikpDQoNCg0KRXZnZHBjIDwtIGdncGxvdChnZHBfcGEsIGFlcyh0aW1lLCB2YWx1ZXMsZ3JvdXA9Z2VvLCBjb2xvciA9IGdlbykpICsgZ2VvbV9saW5lKHNpemUgPSAxKSArIGdlb21fcG9pbnQoKSArIGxhYnMoeSA9ICJWYWxvciAoZW4gw61uZGljZXMpIiwgdGl0bGUgPSAiRXZvbC4gaW1wICBiaWVuZXMgeSBzZXJ2aWNpb3MgKEEuYmFzZSAyMDE1KSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJ0aXRsZSA9ICJQQcONU0VTOiBFc3Bhw7FhLCBGcmFuY2lhLCBJdGFsaWEsIFBvcnR1Z2FsLCBTdWVjaWEiLCBjYXB0aW9uID0iRGF0b3MgRXVyb3N0YXQuDQpMb3MgZGF0b3MgdmFuIGRlc2RlIGVsIHByaW1lciB0cmltZXN0cmUgZGUgMjAxOCBoYXN0YSBlbCB0ZXJjZXIgdHJpbWVzdHJlIGRlbCAyMDIwLg0KKENhZGEgcHVudG8gZGVsIGdyw6FmaWNvIGluZGljYSB1biB0cmltZXN0cmUpIikgKw0KICAgIHRoZW1lX2xpZ2h0KCkgKw0KICAgIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE4LCBoanVzdCA9IDAuNSksDQogICAgICAgICAgcGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIsIGhqdXN0ID0gMC41KSwNCiAgICAgICAgICBwbG90LmNhcHRpb24gPSBlbGVtZW50X3RleHQoc2l6ZSA9IDgsIGhqdXN0ID0gMSkpICsNCiAgICB0aGVtZShheGlzLnRpdGxlLng9ZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgIGF4aXMudGV4dC54PWVsZW1lbnRfYmxhbmsoKSkNCg0KI2dncGxvdGx5KEV2Z2RwYywgdG9vbHRpcCA9IGMoImdlbyIsICJ2YWx1ZXMiKSkNCmBgYA0KDQpgYGB7ciBlY2hvPUZBTFNFLCBldmFsPVRSVUUsIG91dC53aWR0aD0iOTAlIn0NCmxpYnJhcnkoZ3JpZEV4dHJhKSAgIy0gaW5zdGFsbC5wYWNrYWdlcygiZ3JpZEV4dHJhIikNCg0KZ3JpZC5hcnJhbmdlKEV2Z2RwYSwgRXZnZHBiLEV2Z2RwYywgbnJvdz0gMykNCmBgYA0KDQoNCjxicj4NCg0KRW4gZXN0b3MgdHJlcyBncsOhZmljb3MgcXVlcmVtb3Mgb2ZyZWNlciB1bmEgcGVyc3BlY3RpdmEgZWNvbsOzbWljYSBkZSBjdcOhbCBoYSBzaWRvIGVsICBpbXBhY3RvIGRlbCBjb3JvbmF2aXJ1cyBlbiBjdWF0cm8gcGHDrXNlcyBldXJvcGVvcywgYWxndW5vcyBkZSBsb3MgY3VhbGVzIG9mcmVjZW4gZGlmZXJlbmNpYXMgZGVzdGFjYWJsZXMgZW4gY3VhbnRvIGEgc3UgZXN0cnVjdHVyYSBvIGNvbXBvc2ljacOzbiBlY29uw7NtaWNhIERlIG1hbmVyYSBxdWUgZW4gZXN0b3MgZ3LDoWZpY29zIHNlIG11ZXN0cmEgdGFudG8gbGEgZXZvbHVjacOzbiBkZWwgUElCIGEgcHJlY2lvcyBkZSBtZXJjYWRvIGNvbW8gbGFzIGV4cG9ydGFjaW9uZXMgZSBpbXBvcnRhY2lvbmVzIGRlIGJpZW5lcyB5IHNlcnZpY2lvcywgdG9kb3MgZWxsb3MgZW4gbsO6bWVyb3Mgw61uZGljZXMsIGN1eW8gYcOxbyBiYXNlIGVzIDIwMTUgKDIwMTUgPSAxMDApDQoNCk9ic2VydmFuZG8gZGUgZm9ybWEgZ2xvYmFsIGVuIGxvcyB0cmVzIGdyw6FmaWNvcyBwb2RlbW9zIHZlciBxdWUgdGFudG8gRnJhbmNpYSwgRXNwYcOxYSBlIEl0YWxpYSB0aWVuZW4gdW5hIGV2b2x1Y2nDs24gbXV5IHBhcmVjaWRhLiBFbiBjYW1iaW8sIFN1ZWNpYSBubyBzdWZyZSB0YW4gZHLDoXN0aWNhbWVudGUgbG9zIGVmZWN0b3MgbmVnYXRpdm9zIGRlIGxhIHBhbmRlbWlhLg0KDQpFc3RvIHNlIGRlYmUsIGVuIHBhcnRlLCBhIHF1ZSBTdWVjaWEgbm8gcHVzbyB1biBjb25maW5hbWllbnRvIHJlc3RyaWN0aXZvLCBkdXJhbnRlIGVsIHByaW1lciBwaWNvIGRlIGxhIHBhbmRlbWlhLCBkYWRvIHF1ZSBsYSBpbmNpZGVuY2lhIGZ1ZSBtdWNobyBtZW5vciBxdWUgZW4gbG9zIG90cm9zIHRyZXMgcGHDrXNlcyBhbmFsaXphZG9zLiBPcHTDsyBwdWVzLCBwb3IgbGEgZXN0cmF0ZWdpYSBkZSAnaW5tdW5pZGFkIGRlIHJlYmHDsW8iIENvbW8gcmVzdWx0YWRvLCBvYnNlcnZhbW9zIHF1ZSBsYXMgY2lmcmFzIGRlIFN1ZWNpYSBjb24gbWVqb3JlcyBxdWUgbGEgZGUgb3Ryb3MgcGHDrXNlcyBkZSBsYSBldXJvem9uYSwgZWwgUElCIG5vIGNhecOzIHRhbnRvIGVuIGVsIHNlZ3VuZG8geSB0ZXJjZXIgdHJpbWVzdHJlIGRlIDIwMjAsIHNlIGVuY29udHJhYmEgYWxyZWRlZG9yIGRlIDEwNSBwcC4gTWllbnRyYXMgcXVlIGVuIEVzcGHDsWEgYmFqw7MgMTUgcHVudG9zIHJlc3BlY3RvIGEgc3UgYcOxbyBiYXNlLg0KDQpBZGVtw6FzLCBjYWJlIGRlY2lyIHF1ZSBlbiBlbCBwYcOtcyBlc2NhbmRpbmF2bywgbGEgZGlnaXRhbGl6YWNpw7NuIHkgZWwgdGVsZXRyYWJham8geWEgZXN0YWJhIHByZXNlbnRlIGVuIG11Y2hhcyBlbXByZXNhcywgYSBkaWZlcmVuY2lhIGRlIG90cm9zIHBhw61zZXMsIGNvbW8gRXNwYcOxYSwgcXVlIHBpbGzDsyBtw6FzIGRlIGltcHJvdmlzdG8uDQoNCk5vIG9ic3RhbnRlLCBzZXLDrWEgaW50ZXJlc2FudGUgc2FiZXIgbG8gcXVlIHByb3BvbmVuIGxhcyBkaWZlcmVudGVzIGF1dG9yaWRhZGVzIHJlc3BvbnNhYmxlcyBkZSBsYSBwb2zDrXRpY2EgZWNvbsOzbWljYSBwYXJhIGludGVudGFyIGRldm9sdmVyIGxvcyBhY3R1YWxlcyB2YWxvcmVzIGEgbGFzIGNpZnJhcyBxdWUgaGFiw61hIGFudGVzIGRlbCBwcmltZXIgdHJpbWVzdHJlIGRlIDIwMjAuIEFzw60gY29tbyBlbCBlZmVjdG8gcXVlIHRlbmRyw6EgbGEgYXBsaWNhY2nDs24gZGUgbGEgdmFjdW5hIHNvYnJlIGxhcyBleHBlY3RhdGl2YXMgZGUgbGEgcG9ibGFjacOzbi4NCg0KIyMgOS4gQ29uY2x1c2nDs24NCg0KRWwgY29udGFyIGNvbiB1bmEgaGVycmFtaWVudGEgdGFuIHBvdGVudGUgY29tbyBlcyBSLCBxdWUgbm9zIHBlcm1pdGUgbWFuZWphciBkYXRvcyB5IHV0aWxpemFybG9zIHBhcmEgaGFjZXIgYW7DoWxpc2lzIGNvbXBsZWpvcyBub3MgaGEgcGVybWl0aWRvIHkgZmFjaWxpdGFkbyB0ZW5lciB1bmEgcGVyc3BlY3RpdmEgbcOhcyBhbXBsaWEgeSBhIGxhIHZleiBjb25jcmV0YSBkZSBsbyBxdWUgZXN0w6Egc3VjZWRpZW5kbyBjb24gbGEgYWN0dWFsIHBhbmRlbWlhIGRlIGxhIENvdmlkLTE5LiBQb3IgbG8gcXVlIG51ZXN0cm8gYW7DoWxpc2lzIHNlIGhhIGNlbnRyYWRvIGVuIGVzdGEsIHRhbnRvIGEgbml2ZWwgbXVuZGlhbCBjb21vIG3DoXMgY29uY3JldGFtZW50ZSBwYXJhIEVzcGHDsWEgeSBsYSBDb211bmlkYWQgVmFsZW5jaWFuYS4gQXPDrSBjb21vIGhlbW9zIG1vc3RyYWRvIGRlIG1hbmVyYSBicmV2ZSBjdWFsIGhhIHNpZG8gZWwgaW1wYWN0byBlY29uw7NtaWNvIHF1ZSBoYSBwb2RpZG8gdGVuZXIgbGEgcGFuZGVtaWEgYSBuaXZlbCBldXJvcGVvLg0KDQoNCkNhYmUgc2XDsWFsYXIgcXVlIG5vcyBoYSByZXN1bHRhZG8gbXV5IGludGVyZXNhbnRlIGVsIGhlY2hvIGRlIHBvbmVyIG1hbmVqYXIgbG9zIGRhdG9zIGEgbnVlc3RybyBhbnRvam8gcGFyYSBpbnRlbnRhciByZXNvbHZlciBjaWVydGFzIGN1ZXN0aW9uZXMgcXVlIG5vcyBwbGFudGVhbW9zIGFudGVzIGRlIGVtcGV6YXIgZWwgYW7DoWxpc2lzIHkgYXPDrSwgb2ZyZWNlciBsYSBpbmZvcm1hY2nDs24gZGUgZm9ybWEgbcOhcyB2aXN1YWwgYSB0cmF2w6lzIGRlIGdyw6FmaWNvcywgdGFibGFzLCBtYXBhcyB5IGRlbcOhcy4gUGFyYSBvYnRlbmVyIGVzdG9zIHJlc3VsdGFkb3MsIGhlbW9zIHRlbmlkbyBxdWUgc2VndWlyIHZhcmlvcyBwYXNvcywgZW1wZXphbmRvIHBvciBidXNjYXIgbG9zIGRhdG9zIHkgaGFjZXJsb3Mg4oCcdGlkeeKAnSAocGFyYSB1dGlsaXphciBhcXVlbGxvIHF1ZSByZWFsbWVudGUgbmVjZXNpdMOhYmFtb3MpIEFkZW3DoXMsIGRlY2lyIHF1ZSBleGlzdGVuIGRpZmVyZW50ZXMgcGFxdWV0ZXMgKENvdmlkMTksIFRpZHlDb3ZpZDE5LCBuY292MTnigKYpIHF1ZSByZWNvcGlsYW4gaW5mb3JtYWNpw7NuIHNvYnJlIGVsIENvcm9uYXZpcnVzIHkgZmFjaWxpdGFuIGxhIGNyZWFjacOzbiBkZSwgcG9yIGVqZW1wbG8sIG1hcGFzLg0KDQoNCkNvbW8gaW5kaWNhbW9zIGVuIGxhIGludHJvZHVjY2nDs24sIGVsZWdpbW9zIGVsIHRlbWEgZGUgbGEgQ292aWQtMTkgZGFkbyBxdWUgcXVlcsOtYW1vcyBlbnRlbmRlciBwb3IgbnVlc3RybyBwaWUgcXVlIGVyYSBlc3RvIHF1ZSBoYWLDrWEsIHByw6FjdGljYW1lbnRlLCBwYXJhbGl6YWRvIGVsIG11bmRvLiBQb3IgZWxsbywgZW4gZWwgcHJlc2VudGUgaW5mb3JtZSBoZW1vcyBpbnRlbnRhZG8gbW9zdHJhciBjdXJpb3NpZGFkZXMgeSBkYXRvcywgY29uIGVsIGZpbiBkZSB0ZW5lciB1bmEgdmlzacOzbiBnZW5lcmFsIGRlIGPDs21vIGhhIHNpZG8gZWwgZGV2ZW5pciBkZSBsYSBwYW5kZW1pYSB5IHN1IGV2b2x1Y2nDs24gaGFzdGEgcHLDoWN0aWNhbWVudGUgZWwgbWVzIGRlIERpY2llbWJyZS4gDQoNCg0KUG9yIMO6bHRpbW8sIGNhYmUgY29tZW50YXIgYWxndW5hcyBjdWVzdGlvbmVzIGV4dHJhw61kYXMgdHJhcyBoYWNlciBlbCBhbsOhbGlzaXMuIEFzw60gcHVlcywgZXMgZGVzdGFjYWJsZSBxdWUgbGEgc2VndW5kYSBvbGEgYSBuaXZlbCBkZSBjb250YWdpb3MgaGEgc2lkbyBtdWNobyBtYXlvciBxdWUgbGEgcHJpbWVyYSBvbGEgZW4gbGEgbWF5b3LDrWEgZGUgcGHDrXNlcywgdG9kbyB5IHF1ZSBncmFjaWFzIGEgbGEgcHJldmlhIHByZXBhcmFjacOzbiwgbGEgc2F0dXJhY2nDs24gZGVsIHNpc3RlbWEgc2FuaXRhcmlvIG5vIGhhIGxsZWdhZG8gYWwgbml2ZWwgZGUgbGEgcHJpbWVyYSwgZG9uZGUgaHVibyBtb21lbnRvcyBlbiBsb3MgcXVlIGxvcyBob3NwaXRhbGVzIHBhcmVjw61hbiBlc3RhciBhbCBib3JkZSBkZWwgY29sYXBzby4gDQoNCg0KQXNpbWlzbW8sIGRhZG8gcXVlIGNyZWVtb3MgcXVlIHBhcmEgcG9kZXIgY29tcGFyYXIgbG9zIGRhdG9zIGVzIG1lam9yIHF1ZSBzZWFuIHJlbGF0aXZvcywgcGFyYSBlbCBjYXNvIGRlIEVzcGHDsWEgaGVtb3MgY29naWRvIGxhIHBvYmxhY2nDs24gZGUgbGFzIHByb3ZpbmNpYXMgeSBhc8OtIGhlbW9zIHBvZGlkbyBjYWxjdWxhciBlbCAlIGRlIGNvbnRhZ2lvcyBzZWfDum4gbGEgcG9ibGFjacOzbi4gQWRlbcOhcyBkZSwgcG9yIGVqZW1wbG8sIGxhcyBQQ1LigJlzIHBvciBjYWRhIDEwMCBtaWwgaGFiaXRhbnRlcywgZW4gbGFzIGRpZmVyZW50ZXMgQ29tdW5pZGFkZXMgQXV0w7Nub21hcywgZG9uZGUgZGVzdGFjYSBOYXZhcnJhIGNvbW8gbGEgcXVlIG3DoXMgcHJ1ZWJhcyBoYSByZWFsaXphZG8uIA0KDQoNCkZpbmFsbWVudGUgZGVjaXIgcXVlIGFsIHRyYXRhcnNlIGRlIHVuIHRlbWEgYWN0dWFsIGxvcyBkYXRvcyB2YW4gZXZvbHVjaW9uYW5kbywgY2FtYmlhbmRvLiBQb3IgdGFudG8sIGhheSBxdWUgZmlqYXJzZSBlbiBlbCBwZXJpb2RvIHBhcmEgZWwgcXVlIGVzdMOhIGhlY2hhIGNhZGEgdW5hIGRlIGxhcyByZXByZXNlbnRhY2lvbmVzLg0KDQoNCiMjIFJlZmVyZW5jaWFzDQoNCkxhcyBzaWd1aWVudGVzIHDDoWdpbmFzIHdlYiBzb24gbGFzIHF1ZSBoZW1vcyB1dGlsaXphZG8gcGFyYSBsYSByZWFsaXphY2nDs24gZGVsIHRyYWJham86DQoNCg0KLSA8YSBocmVmPSJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vZGF0YXNldHMvY292aWQtMTkvbWFzdGVyL2RhdGEvdGltZS1zZXJpZXMtMTktY292aWQtY29tYmluZWQuY3N2Ii90YXJnZXQ9Il9ibGFuayI+aHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2RhdGFzZXRzL2NvdmlkLTE5L21hc3Rlci9kYXRhL3RpbWUtc2VyaWVzLTE5LWNvdmlkLWNvbWJpbmVkLmNzdjwvYT4NCg0KDQotIDxhIGhyZWY9ICJodHRwczovL2RhdG9zbWFjcm8uZXhwYW5zaW9uLmNvbS9vdHJvcy9jb3JvbmF2aXJ1cy92YW51YXR1DQoiL3RhcmdldD0iX2JsYW5rIj5odHRwczovL2RhdG9zbWFjcm8uZXhwYW5zaW9uLmNvbS9vdHJvcy9jb3JvbmF2aXJ1cy92YW51YXR1DQo8L2E+DQoNCi0gPGEgaHJlZj0iaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2RhdGFzZXRzL2NvdmlkLTE5L21hc3Rlci9kYXRhL3RpbWUtc2VyaWVzLTE5LWNvdmlkLWNvbWJpbmVkLmNzdiIvdGFyZ2V0PSJfYmxhbmsiPmh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9kYXRhc2V0cy9jb3ZpZC0xOS9tYXN0ZXIvZGF0YS90aW1lLXNlcmllcy0xOS1jb3ZpZC1jb21iaW5lZC5jc3Y8L2E+DQoNCg0KLSA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vZGF0YWRpc3RhL2RhdGFzZXRzL2Jsb2IvbWFzdGVyL0NPVklEJTIwMTkvY2NhYV9jb3ZpZDE5X3Rlc3RfcmVhbGl6YWRvcy5jc3YiL3RhcmdldD0iX2JsYW5rIj5odHRwczovL2dpdGh1Yi5jb20vZGF0YWRpc3RhL2RhdGFzZXRzL2Jsb2IvbWFzdGVyL0NPVklEJTIwMTkvY2NhYV9jb3ZpZDE5X3Rlc3RfcmVhbGl6YWRvcy5jc3Y8L2E+DQoNCg0KLSA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vZGF0YWRpc3RhL2RhdGFzZXRzL2Jsb2IvbWFzdGVyL0NPVklEJTIwMTkvY2NhYV9jb3ZpZDE5X3Rlc3RfcmVhbGl6YWRvcy5jc3YiL3RhcmdldD0iX2JsYW5rIj5odHRwczovL2dpdGh1Yi5jb20vZGF0YWRpc3RhL2RhdGFzZXRzL2Jsb2IvbWFzdGVyL0NPVklEJTIwMTkvY2NhYV9jb3ZpZDE5X3Rlc3RfcmVhbGl6YWRvcy5jc3Y8L2E+DQoNCg0KLSA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vam9hY2hpbS1nYXNzZW4vdGlkeWNvdmlkMTkuIi90YXJnZXQ9Il9ibGFuayI+aHR0cHM6Ly9naXRodWIuY29tL2pvYWNoaW0tZ2Fzc2VuL3RpZHljb3ZpZDE5LjwvYT4NCg0KDQotIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9wZXJlenA0NC9MQVUyYm91bmRhcmllczRzcGFpbi9ibG9iL21hc3Rlci9kYXRhL1Byb3ZpbmNpYXMucmRhP3Jhdz10cnVlIi90YXJnZXQ9Il9ibGFuayI+aHR0cHM6Ly9naXRodWIuY29tL3BlcmV6cDQ0L0xBVTJib3VuZGFyaWVzNHNwYWluL2Jsb2IvbWFzdGVyL2RhdGEvUHJvdmluY2lhcy5yZGE/cmF3PXRydWU8L2E+DQoNCg0KLSA8YSBocmVmPSJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vZGF0YWRpc3RhL2RhdGFzZXRzL21hc3Rlci9DT1ZJRCUyMDE5L2NjYWFfaW5ncmVzb3NfY2FtYXNfY29udmVuY2lvbmFsZXNfdWNpLmNzdiIvdGFyZ2V0PSJfYmxhbmsiPmh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9kYXRhZGlzdGEvZGF0YXNldHMvbWFzdGVyL0NPVklEJTIwMTkvY2NhYV9pbmdyZXNvc19jYW1hc19jb252ZW5jaW9uYWxlc191Y2kuY3N2PC9hPg0KDQoNCi0gPGEgaHJlZj0iaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2RhdGFkaXN0YS9kYXRhc2V0cy9tYXN0ZXIvQ09WSUQlMjAxOS9jY2FhX2luZ3Jlc29zX2NhbWFzX2NvbnZlbmNpb25hbGVzX3VjaS5jc3YiL3RhcmdldD0iX2JsYW5rIj5odHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vZGF0YWRpc3RhL2RhdGFzZXRzL21hc3Rlci9DT1ZJRCUyMDE5L2NjYWFfaW5ncmVzb3NfY2FtYXNfY29udmVuY2lvbmFsZXNfdWNpLmNzdjwvYT4NCg0KDQotIDxhIGhyZWY9Imh0dHBzOi8vYm9va2Rvd24ub3JnL3lpaHVpL3JtYXJrZG93bi9sZWFybnItc3RhcnQuaHRtbCIvdGFyZ2V0PSJfYmxhbmsiPmh0dHBzOi8vYm9va2Rvd24ub3JnL3lpaHVpL3JtYXJrZG93bi9sZWFybnItc3RhcnQuaHRtbDwvYT4NCg0KDQotIDxhIGhyZWY9Imh0dHBzOi8vYm9va2Rvd24ub3JnL3lpaHVpL3JtYXJrZG93bi9sZWFybnItc3RhcnQuaHRtbCIvdGFyZ2V0PSJfYmxhbmsiPmh0dHBzOi8vYm9va2Rvd24ub3JnL3lpaHVpL3JtYXJrZG93bi9sZWFybnItc3RhcnQuaHRtbDwvYT4NCg0KDQotIDxhIGhyZWY9Imh0dHBzOi8vcnB1YnMuY29tLyIvdGFyZ2V0PSJfYmxhbmsiPmh0dHBzOi8vcnB1YnMuY29tLzwvYT4NCg0KDQotIDxhIGhyZWY9Imh0dHBzOi8vdWdvcHJvdG8uZ2l0aHViLmlvL3Vnb19yX2RvYy9wZGYvZ2dhbmltYXRlLnBkZiIvdGFyZ2V0PSJfYmxhbmsiPmh0dHBzOi8vdWdvcHJvdG8uZ2l0aHViLmlvL3Vnb19yX2RvYy9wZGYvZ2dhbmltYXRlLnBkZjwvYT4NCg0KDQotIDxhIGhyZWY9Imh0dHBzOi8vd3d3LmhpZ2hjaGFydHMuY29tL2Jsb2cvdHV0b3JpYWxzL2hpZ2hjaGFydHMtZm9yLXItdXNlcnMvIi90YXJnZXQ9Il9ibGFuayI+aHR0cHM6Ly93d3cuaGlnaGNoYXJ0cy5jb20vYmxvZy90dXRvcmlhbHMvaGlnaGNoYXJ0cy1mb3Itci11c2Vycy88L2E+DQoNCg0KLSA8YSBocmVmPSJodHRwczovL3Rvd2FyZHNkYXRhc2NpZW5jZS5jb20vY3JlYXRlLWEtd29yZC1jbG91ZC13aXRoLXItYmRlM2U3NDIyZThhIi90YXJnZXQ9Il9ibGFuayI+aHR0cHM6Ly90b3dhcmRzZGF0YXNjaWVuY2UuY29tL2NyZWF0ZS1hLXdvcmQtY2xvdWQtd2l0aC1yLWJkZTNlNzQyMmU4YTwvYT4NCg0KDQotIDxhIGhyZWY9Imh0dHBzOi8vd3d3LnItYmxvZ2dlcnMuY29tLzIwMjAvMDQvdGlkeWNvdmlkMTktbmV3LXZpc3VhbGl6YXRpb25zLWFuZC1kYXRhLW9uLWxpZnRpbmctb2YtZ292ZXJubWVudGFsLW1lYXN1cmVzLz9mYmNsaWQ9SXdBUjB6eUtnWm9LWVB1MEtYZE9lUFQ1b2o4ajVCVGU3aWxyajBwaGpaeFVSZ05uLVJkemFhWGlWTU9pRSIvdGFyZ2V0PSJfYmxhbmsiPmh0dHBzOi8vd3d3LnItYmxvZ2dlcnMuY29tLzIwMjAvMDQvdGlkeWNvdmlkMTktbmV3LXZpc3VhbGl6YXRpb25zLWFuZC1kYXRhLW9uLWxpZnRpbmctb2YtZ292ZXJubWVudGFsLW1lYXN1cmVzLz9mYmNsaWQ9SXdBUjB6eUtnWm9LWVB1MEtYZE9lUFQ1b2o4ajVCVGU3aWxyajBwaGpaeFVSZ05uLVJkemFhWGlWTU9pRTwvYT4NCg0KDQotICA8YSBocmVmPSJodHRwczovL2VzdGFkaXN0aWNhbWVudGUuY29tL3BhbGV0YXMtZGUtY29sb3Jlcy1lbi1yLyIvdGFyZ2V0PSJfYmxhbmsiL3RhcmdldD0iX2JsYW5rIj5odHRwczovL2VzdGFkaXN0aWNhbWVudGUuY29tL3BhbGV0YXMtZGUtY29sb3Jlcy1lbi1yLzwvYT4gDQoNCg0KLSAgPGEgaHJlZj0iaHR0cHM6Ly9tYXBwaW5nZ2lzLmNvbS8yMDE5LzA3L2NyZWFjaW9uLWRlLW1hcGFzLWNvbi1yLXktZ2dwbG90Mi8iL3RhcmdldD0iX2JsYW5rIj5odHRwczovL21hcHBpbmdnaXMuY29tLzIwMTkvMDcvY3JlYWNpb24tZGUtbWFwYXMtY29uLXIteS1nZ3Bsb3QyLzwvYT4gDQoNCi0gPGEgaHJlZj0iaHR0cHM6Ly9nZ2FuaW1hdGUuY29tLyIvdGFyZ2V0PSJfYmxhbmsiPmh0dHBzOi8vZ2dhbmltYXRlLmNvbS88L2E+IA0KDQotIDxhIGhyZWY9Imh0dHBzOi8vZ3QucnN0dWRpby5jb20vIi90YXJnZXQ9Il9ibGFuayI+aHR0cHM6Ly9ndC5yc3R1ZGlvLmNvbS88L2E+IA0KLSA8YSBocmVmPSJodHRwczovL2RhdGFjeS5lcy9ibG9nL3RhYmxhcy1ib25pdGFzLWVuLXItc2ktZXMtcG9zaWJsZS8iL3RhcmdldD0iX2JsYW5rIj5odHRwczovL2RhdGFjeS5lcy9ibG9nL3RhYmxhcy1ib25pdGFzLWVuLXItc2ktZXMtcG9zaWJsZTwvYT4gDQoNCi0gPGEgaHJlZj0iIGh0dHBzOi8vcnB1YnMuY29tL0pvbmF0aGFuUnplemFrLzY1MjYzMw0KIi90YXJnZXQ9Il9ibGFuayI+aHR0cHM6Ly9ycHVicy5jb20vSm9uYXRoYW5SemV6YWsvNjUyNjMzPC9hPiAgDQoNCi0gPGEgaHJlZj0iaHR0cHM6Ly93d3cud29ybGRvbWV0ZXJzLmluZm8vY29yb25hdmlydXMvIi90YXJnZXQ9Il9ibGFuayI+V29ybGRvbWV0ZXJzPC9hPiANCg0KLSA8YSBocmVmPSJodHRwczovL2NuZWNvdmlkLmlzY2lpaS5lcy9jb3ZpZDE5LyIvdGFyZ2V0PSJfYmxhbmsiPkNPVklEIElTQ0lJSTwvYT4gIA0KDQpBZGVtw6FzIGRlIGxhcyBww6FnaW5hcyB3ZWIgbWVuY2lvbmFkYXMsIGhlbW9zIHV0aWxpemFkbyBsb3MgdHV0b3JpYWxlcyB5IHNsaWRlcyBkZWwgY3Vyc28gKGxpbmsgbWVuY2lvbmFkbyBlbjogbm90YSBkZSBww6FnaW5hIDEpDQoNCkFzaW1pc21vLCBjb21vIGNvbWVOdGFiYW1vcyBlbiBsYSBpbnRyb2R1Y2Npw7NuIG5vcyBoZW1vcyBpbnNwaXJhZG8gcGFyYSBoYWNlciBlbCBwcmVzZW50ZSB0cmFiYWpvIGVuIG51ZXN0cm8gaW50ZXLDqXMgcG9yIGludmVzdGlnYXIgc29icmUgZXN0ZSB0ZW1hLCBlbCBjdWFsIGVzIGFjdHVhbCwgYXPDrSBjb21vIHBvciBsYSBjYW50aWRhZCBkZSBkYXRvcyB5IG5vdMOtY2lhcyBxdWUgc2UgdHJhbnNtaXRlbiBkw61hIGEgZMOtYS4NCg0KSWd1YWxtZW50ZSwgcGFyYSBoYWNlciBlbCBpbmZvcm1lIHkgdGVuZXIgZWplbXBsb3MgKHJlZmVyZW5jaWFzKSBoZW1vcyBhY3VkaWRvIGEgbG9zIHRyYWJham9zIHJlYWxpemFkb3MgcG9yIGxvcyBjb21wYcOxZXJvcyBxdWUgY3Vyc2Fyb24gbGEgYXNpZ25hdHVyYSBlbCBhw7FvIHBhc2FkbywgbG9zIGVuY29udHJhbW9zIGFxdcOtOiA8aHR0cHM6Ly9naXRodWIuY29tL3BlcmV6cDQ0L3R1dG9yaWFsZXNfaW50cm9fRFM+DQoNCi0tLS0tLS0tLS0tLS0tLS0NCg0KPGJyPg0KDQpQYXJhIGFjYWJhciBlc3RlIGNodW5rIGluY2x1aXJlbW9zIGxhIGBzZXNzaW9uIGluZm9gOg0KDQpgYGB7cn0NCnNlc3Npb25pbmZvOjpzZXNzaW9uX2luZm8oKSAlPiUgZGV0YWlsczo6ZGV0YWlscyhzdW1tYXJ5ID0gJ2N1cnJlbnQgc2Vzc2lvbiBpbmZvJykgDQpgYGANCg0KW14xXTogU2kgcXVpZXJlcyB2aXNpdGFyIGxhIHdlYiBkZWwgY3Vyc286IDxhIGhyZWY9Imh0dHBzOi8vcGVyZXpwNDQuZ2l0aHViLmlvL2ludHJvLWRzLTIwLTIxLXdlYi8idGFyZ2V0PSJfYmxhbmsiPmh0dHBzOi8vcGVyZXpwNDQuZ2l0aHViLmlvL2ludHJvLWRzLTIwLTIxLXdlYi88L2E+DQoNClteMl06IFNpIHF1aWVyZXMgY29uc3VsdGFyIG3DoXMgaW5mb3JtYWNpw7NuIGhheiBjbGljayA8YSBocmVmPSJodHRwczovL3d3dy5tc2Nicy5nb2IuZXMvcHJvZmVzaW9uYWxlcy9zYWx1ZFB1YmxpY2EvY2NheWVzL2FsZXJ0YXNBY3R1YWwvbkNvdi9kb2N1bWVudG9zL0lUQ29yb25hdmlydXMucGRmIzp+OnRleHQ9RW4lMjBlc3RlJTIwbW9tZW50byUyMHNlJTIwZGVzY29ub2NlLG9yaWdlbiUyMGRlJTIwbGElMjBwYW5kZW1pYS4vInRhcmdldD0iX2JsYW5rIj4gYXF1w608L2E+IA0KDQpbXjNdOiBJbmRpY2Ftb3MgZWwgZW5sYWNlIHBvciBzaSBzZSBxdWllcmUgb2J0ZW5lciBtw6FzIGluZm9ybWFjacOzbiBhbCByZXNwZWN0by48YSBocmVmPSJodHRwczovL2RhdGEuaHVtZGF0YS5vcmcvZGF0YXNldC9hY2Fwcy1jb3ZpZDE5LWdvdmVybm1lbnQtbWVhc3VyZXMtZGF0YXNldCIvdGFyZ2V0PSJfYmxhbmsiPmh0dHBzOi8vZGF0YS5odW1kYXRhLm9yZy9kYXRhc2V0L2FjYXBzLWNvdmlkMTktZ292ZXJubWVudC1tZWFzdXJlcy1kYXRhc2V0PC9hPiAgDQoNClteNF06IE5vIGhlbW9zIGhlY2hvIGxhIGV2b2x1Y2nDs24gaGFzdGEgbGEgZmVjaGEgYWN0dWFsLCBkYWRvIHF1ZSBhIHBhcnRpciBkZSBqdWxpbyBsb3MgZGF0b3MgZGUgY29udGFnaW9zIGVuIGZpbmVzIGRlIHNlbWFuYSBtdWVzdHJhbiB1bm9zIHZhbG9yZXMgZGUgMCAoVW4gcmVzdWx0YWRvIG5vIGNvaGVyZW50ZSkNCg0KW141XTogQXF1w60gZGVqYW1vcyBlbiBlbGFuY2UgcG9yIHNpIHNlIHF1aWVyZSBjb25zdWx0YXIgbcOhcyBpbmYuIDxhIGhyZWY9Imh0dHBzOi8vd3d3LnNlcGUuZXMvSG9tZVNlcGUvQ09WSUQtMTkvbnVldmFzLW1lZGlkYXMtYXBsaWNhY2lvbi1FUlRFLUNPVklELTE5LVJlYWwtRGVjcmV0by1sZXktMzAtMjAyMC0yOS1zZXB0aWVtYnJlLmh0bWwiL3RhcmdldD0iX2JsYW5rIj5TRVBFPC9hPiAgDQo=