Los datos se recuperaron del sitio del CEEY donde se tienen las encuestas ESRU-EMOVI (Las escuestas de la fundación Espinosa Rugarcía de Movilidad Soical en México) para los levantamientos: 2006, 2011 y 2017.
Cada una de las encuentas tiene distintos objetivos, que se explicarán en las siguientes secciones. Para mayores detalles sobre las encuetas se puede consultar el sitio oficial donde se encuetran alojados los datos CEEY.
library(tidyverse)
library(haven) # importa, entre otros software, de Stata
library(sjlabelled) # manejar labels de las variables
library(openxlsx) # leer archivos de excel
library(DT) # visualizar a tablas
library(data.table) # convertir a tablas
library(highcharter) # gráficas interactivas
library(foreign)
ESRU-EMOVI 2017
Por primera vez y gracias al enfoque territorial de la ESRU – EMOVI 2017, es posible medir la movilidad social por regiones. La encuesta de 2017, al igual que las anteriores, tiene como finalidad principal medir la movilidad social intergeneracional. Cuenta con 17,665 entrevistas y es representativa de hombres y mujeres entre 25 y 64 años a nivel nacional, para la Ciudad de México y cinco regiones del país: norte, norte-occidente, centro, centro-norte y sur. Los objetivos de la ESRU-EMOVI 2017 son:
Contar con información actualizada en las distintas dimensiones de la movilidad social a nivel nacional.
Generar estimaciones de movilidad para cinco regiones del país y la Ciudad de México.
Analizar los patrones de movilidad social desde la perspectiva de la desigualdad de oportunidades.
Encuesta financiada por la Fundación ESRU.
des_var_entrevistado <- read.xlsx(
xlsxFile = "Datos/ESRU-EMOVI-2017/Diccionario-ESRU-EMOVI-2017.xlsx"
)
datatable(as.data.table(des_var_entrevistado),options = list(pageLength = 5))
des_var_hogar <- read.xlsx(
xlsxFile = "Datos/ESRU-EMOVI-2017/Diccionario-ESRU-EMOVI-2017.xlsx",
sheet = 2
)
datatable(as.data.table(des_var_hogar),options = list(pageLength = 5))
cargar<- function(){
datos_e <<- read_stata(
path = "Datos/ESRU-EMOVI-2017/ESRU-EMOVI-2017-Entrevistado.dta",
atomic.to.fac = TRUE,
enc = NULL,
)
}
data_hogar <- read_stata(
path = "Datos/ESRU-EMOVI-2017/ESRU-EMOVI-2017-Hogar.dta",
atomic.to.fac = TRUE,
enc = NULL
)
cargar()
data_emovi2017<-datos_e
Al momento de exportar a R, existen errores en las etiqeutas de las variables y de los valores. Las etiquetes de las variables describen con mayor precisión a dichas variables. Mientras que las etiquetas de los volores están asociadas a datos categóricos. Existen diversas formaas de lidiar con este problema. La forma que se utilizará (por el momento, esto se podría optimizar) es hacer una conversión de codificación entre los formatos de windows y mac, solo en caso de ser necesario. No es posible hacer una coversión general (por el momento, podría optimizarse) pues algunas codificaciones son correctas y otras no.
#a <- get_label(data_emovi2017$est_dis)
#b <- get_labels(data_emovi2017$Estado)
#print(a)
#print(b)
codi_etiquetas <- function(df_var, enco = "ISO_8859-15"){
return(set_labels(
df_var,
labels =unlist(
lapply(
get_labels(df_var),
iconv,from= "UTF-8",
to=enco#
)
)
)
)
}
compro_eti <- function(var, enco = "ISO_8859-15" ){
data_e2 <- data_emovi2017
print(get_labels(data_e2[[var]]))
#codi_etiquetas(data_e2$ezona)
data_e2[[var]] <- codi_etiquetas(data_e2[[var]],enco)
print(get_labels(data_e2[[var]]))
}
cambiar_eti <- function(var, enco="ISO_8859-15"){
data_emovi2017[[var]] <<- codi_etiquetas(data_emovi2017[[var]],enco)
print(get_labels(data_emovi2017[[var]]))
}
#get_labels(data_emovi2017)
#get_labels(data_emovi2017$ezona)
#str(get_labels(data_emovi2017))
#replace_labels(data_emovi2017,
#labels=iconv(get_labels(data_emovi2017),"UTF-8","ISO_8859-15"))
#lapply(get_labels(data_emovi2017), iconv,from= "UTF-8",to="ISO_8859-15")
#get_labels(data_emovi2017$ezona)
#data_e2 <- data_emovi2017
#print(get_labels(data_e2['ezona']))
#codi_etiquetas(data_e2$ezona)
#data_e2['ezona'] <- codi_etiquetas(data_e2['ezona'])#
#print(get_labels(data_e2['ezona']))
#get_labels(data_e2$ezona)
#compro_eti("p13")
#cambiar_eti('p13')
#compro_eti('ezona')
#cambiar_eti('ezona')
cambiar_eti('p133',enco = "Windows-1252")
## [1] "Menor a 1 salario mínimo ($0 – $2,399)"
## [2] "Igual a un salario mínimo ($2,400)"
## [3] "Más de 1 salario mínimo hasta 2 ($2,401 – $4,800)"
## [4] "Más de 2 salarios mínimos hasta 3 ($4,801 – $7,200)"
## [5] "Más de 3 salarios mínimos hasta 5 ($7,201 – $12,000)"
## [6] "Más de 5 salarios mínimos hasta 10 ($12,001 – $24,000)"
## [7] "Más de 10 salarios mínimos ($24,001 o más)"
## [8] "No quiso dar información"
## [9] "NS"
str(data_emovi2017)
view(data_emovi2017)
Entrevistados por estado
myMenuItems <- c("downloadPNG", "downloadJPEG", "downloadPDF", 'downloadSVG', 'printChart')
plota <- data_emovi2017 %>%
count(Estado) %>%
hchart('treemap',
hcaes(x = paste(get_labels(Estado),' ','(', n,')', sep = ''), value='n', color = 'n')
) %>%
hc_add_theme(hc_theme_ffx()) %>%
hc_title(
text = "Número de entrevistados por estado"
)%>%
hc_subtitle(text = paste("Total de participates: " , toString(nrow(data_emovi2017)))) %>%
hc_exporting(enabled = TRUE,
filename = "archivo",
sourceWidth = 1000,
sourceHeight = 640,
scale = 10,
buttons = list(contextButton = list(menuItems = myMenuItems))
)
htmlwidgets::saveWidget(widget = plota, file = "./plot.html")
setwd("~/OneDrive - Centro de Investigacion y Docencia Economicas CIDE/TesisME2019/TesinaCIDEMERMM")
webshot::webshot(url = "~/Users/rafamtz/OneDrive - Centro de Investigacion y Docencia Economicas CIDE/TesisME2019/TesinaCIDEMERMM/plot.html",
delay = 2)
## NULL
plota
Sexo por estado
dfh_c <- readRDS(file = "Datos/dfh_c_combinada_ch_cri3.Rda")
myMenuItems <- c("downloadPNG", "downloadJPEG", "downloadPDF", 'downloadSVG', 'printChart')
gra_sex_est<-function(df){
df %>%
slice(as.integer(unlist(dfh_c%>%select(id_ho))))%>%
count(Estado, p06)%>%
hchart('column',
hcaes( y = 'n', group = as_label(p06)))%>%
hc_add_theme(hc_theme_ggplot2())%>%
hc_title(
text = "Número de entrevistados por estado y sexo"
) %>%
#hc_subtitle(text = "Las edades están agrupadas en intervalos
# de 10 años (da clic sobre F o M)") %>%
# hc_credits(
# enabled = TRUE, text = "Source: SSS",
# style = list(fontSize = "12px"))%>%
hc_yAxis(title = list(text = "Número de participantes"))%>%
hc_xAxis(title=list(text="Estados"),
categories = get_labels(df$Estado)) %>%
hc_exporting(enabled = TRUE,
filename = "datos",
buttons = list(contextButton = list(menuItems = myMenuItems)))
}
gra_sex_est(data_emovi2017)
## Sexo por edad
myMenuItems <- c("downloadPNG", "downloadJPEG", "downloadPDF", 'downloadSVG', 'printChart')
gra_sex_est<-function(df){
df %>%
slice(as.integer(unlist(dfh_c%>%select(id_ho))))%>%
count(p05, p06)%>%
hchart('column',
hcaes( y = 'n', group = as_label(p06)))%>%
hc_add_theme(hc_theme_ggplot2())%>%
hc_title(
text = "Número de entrevistados por edad y sexo"
) %>%
#hc_subtitle(text = "Las edades están agrupadas en intervalos
# de 10 años (da clic sobre F o M)") %>%
# hc_credits(
# enabled = TRUE, text = "Source: SSS",
# style = list(fontSize = "12px"))%>%
hc_yAxis(title = list(text = "Número de participantes"))%>%
hc_xAxis(title=list(text="Edad"),
categories = as.character(25:50)) %>%
hc_exporting(enabled = TRUE,
filename = "datos",
buttons = list(contextButton = list(menuItems = myMenuItems)))
}
gra_sex_est(data_emovi2017)
Sexo por cohort
myMenuItems <- c("downloadPNG", "downloadJPEG", "downloadPDF", 'downloadSVG', 'printChart')
gra_sex_est<-function(df){
df %>%
slice(as.integer(unlist(dfh_c%>%select(id_ho))))%>%
count(p133, p06)%>%
hchart('column',
hcaes( y = 'n', group = as_label(p06)))%>%
hc_add_theme(hc_theme_ggplot2())%>%
hc_title(
text = "Número de entrevistados por intervalo de ingreso y sexo"
) %>%
#hc_subtitle(text = "Las edades están agrupadas en intervalos
# de 10 años (da clic sobre F o M)") %>%
# hc_credits(
# enabled = TRUE, text = "Source: SSS",
# style = list(fontSize = "12px"))%>%
hc_yAxis(title = list(text = "Número de participantes"))%>%
hc_xAxis(title=list(text="Intervalo de ingreso"),
categories = get_labels(data_emovi2017$p133)) %>%
hc_exporting(enabled = TRUE,
filename = "datos",
buttons = list(contextButton = list(menuItems = myMenuItems)))
}
gra_sex_est(data_emovi2017)
Escolaridad sexo
data_emovi2017 %>%
count(p13,p06)%>%
hchart('column',
hcaes( y = 'n', group = as_label(p06)))%>%
hc_add_theme(hc_theme_ffx())%>%
hc_title(
text = "Escolaridad por sexo"
) %>%
#hc_subtitle(text = "Las edades están agrupadas en intervalos
# de 10 años (da clic sobre F o M)") %>%
# hc_credits(
# enabled = TRUE, text = "Source: SSS",
# style = list(fontSize = "12px"))%>%
hc_yAxis(title = list(text = "Número de participantes"))%>%
hc_xAxis(title=list(text="Escolaridad"),
categories = get_labels(data_emovi2017$p13)) %>%
hc_exporting(enabled = TRUE,
filename = "datos",
buttons = list(contextButton = list(menuItems = myMenuItems)))
Número de personas que aportan al ingreso
data_emovi2017 %>%
count(p132)%>%
hchart('column',
hcaes( y = 'n'))%>%
hc_add_theme(hc_theme_ffx())%>%
hc_title(
text = "Numero de miembros que aportan ingreso"
) %>%
#hc_subtitle(text = "Las edades están agrupadas en intervalos
# de 10 años (da clic sobre F o M)") %>%
# hc_credits(
# enabled = TRUE, text = "Source: SSS",
# style = list(fontSize = "12px"))%>%
hc_yAxis(title = list(text = "Número de participantes"))%>%
hc_xAxis(title=list(text="Número de personas"),
categories = get_labels(data_emovi2017$p132)) %>%
hc_exporting(enabled = TRUE,
filename = "datos",
buttons = list(contextButton = list(menuItems = myMenuItems)))
Percepción de movilidad
data_emovi2017$p147<-add_labels(
data_emovi2017$p147,
labels = c("1" = 1,
"2" = 2,
"3" = 3,
"4" = 4,
"5" = 5,
"6" = 6,
"7" = 7,
"8" = 8,
"9" = 9,
"10" = 10))
Percepción Actual
gra_per_eco_act<- function(df){
df%>%
count(p147)%>%
hchart('column',
hcaes( y = 'n'))%>%
hc_add_theme(hc_theme_ffx())%>%
hc_title(
text = "Opinión sobre situación económica actual"
) %>%
#hc_subtitle(text = "Las edades están agrupadas en intervalos
# de 10 años (da clic sobre F o M)") %>%
# hc_credits(
# enabled = TRUE, text = "Source: SSS",
# style = list(fontSize = "12px"))%>%
hc_yAxis(title = list(text = "Número de participantes"))%>%
hc_xAxis(title=list(text="Posición económica"),
categories = get_labels(df$p147)) %>%
hc_exporting(enabled = TRUE,
filename = "datos",
buttons = list(contextButton = list(menuItems = myMenuItems)))
}
gra_per_eco_act(data_emovi2017)
data_emovi2017$p148<-add_labels(
data_emovi2017$p148,
labels = c("1" = 1,
"2" = 2,
"3" = 3,
"4" = 4,
"5" = 5,
"6" = 6,
"7" = 7,
"8" = 8,
"9" = 9,
"10" = 10))
Percepción pasada
gra_per_eco_ant<- function(df){
df%>%
count(p148)%>%
hchart('column',
hcaes( y = 'n'))%>%
hc_add_theme(hc_theme_ffx())%>%
hc_title(
text = "Opinión sobre situación económica de los padres"
) %>%
#hc_subtitle(text = "Las edades están agrupadas en intervalos
# de 10 años (da clic sobre F o M)") %>%
# hc_credits(
# enabled = TRUE, text = "Source: SSS",
# style = list(fontSize = "12px"))%>%
hc_yAxis(title = list(text = "Número de participantes"))%>%
hc_xAxis(title=list(text="Posición económica"),
categories = get_labels(df$p148)) %>%
hc_exporting(enabled = TRUE,
filename = "datos",
buttons = list(contextButton = list(menuItems = myMenuItems)))
}
gra_per_eco_ant(data_emovi2017)
Percepción relativa
skey<-data_emovi2017%>%
select(p148,p147)%>%
data_to_sankey()
#skey
for (a in unique(skey$from)){
skey$from[skey$from == a] <-paste(a,'p')
}
#skey$weight<-as.double(skey$weight)
#for (a in unique(skey$from)){
#skey[skey$from ==a, "weight"] <- round(skey[skey$from ==a, "weight"] / #sum(skey[skey$from==a,3]),2)
#}
#skey
skey%>%
hchart('sankey',nodeWidth=50,
opacity=1, linkOpacity=0.05, minLinkWidth=2,
name = "Movilidad",nodePadding = 15,clip=FALSE,
description = "hola")%>%
hc_add_theme(hc_theme_ffx())%>%
hc_title(
text = "Percepción de movilidad relativa"
)%>%
hc_exporting(enabled = TRUE,
filename = "datos",
buttons = list(contextButton = list(menuItems = myMenuItems)))
skey<-data_emovi2017%>%
filter(p06==1)%>%
select(p148,p147)%>%
data_to_sankey()
for (a in unique(skey$from)){
skey$from[skey$from == a] <-paste(a,'p')
}
skey%>%
hchart('sankey',nodeWidth=50,
opacity=1, linkOpacity=0.05, minLinkWidth=2,
name = "Movilidad",nodePadding = 15,clip=FALSE,
description = "hola")%>%
hc_add_theme(hc_theme_ffx())%>%
hc_title(
text = "Percepción de movilidad relativa"
)%>%
hc_subtitle(text = "Hombres") %>%
hc_exporting(enabled = TRUE,
filename = "datos",
buttons = list(contextButton = list(menuItems = myMenuItems)))
skey<-data_emovi2017%>%
filter(p06==2)%>%
select(p148,p147)%>%
data_to_sankey()
for (a in unique(skey$from)){
skey$from[skey$from == a] <-paste(a,'p')
}
skey%>%
hchart('sankey',nodeWidth=50,
opacity=1, linkOpacity=0.05, minLinkWidth=2,
name = "Movilidad",nodePadding = 15,clip=FALSE,
description = "hola")%>%
hc_add_theme(hc_theme_ffx())%>%
hc_title(
text = "Percepción de movilidad relativa"
)%>%
hc_subtitle(text = "Mujeres") %>%
hc_exporting(enabled = TRUE,
filename = "datos",
buttons = list(contextButton = list(menuItems = myMenuItems)))
## creamos mov
data_emovi2017<-data_emovi2017%>%
mutate(mov = ifelse(p147>p148,"mejor",
ifelse(p147<p148,"peor","igual")),
id_ho = as.integer(row.names(data_emovi2017)))
data_emovi2017$mov<-set_labels(
data_emovi2017$mov,
labels = c("mejor" = "mejor",
"peor" = "peor",
"igual" = "igual"))
Percepción cualitativa total
data_emovi2017 %>%
slice(dfh_c%>%select(id_ho)%>%pull())%>%
count(mov)%>%
mutate(freq = round(100 * n/sum(n), 0))%>%
hchart('column',
hcaes( y = 'freq'))%>%
hc_add_theme(hc_theme_ggplot2())%>%
hc_title(
text = "Percepción de movilidad"
) %>%
hc_subtitle(text = "") %>%
# hc_credits(
# enabled = TRUE, text = "Source: SSS",
# style = list(fontSize = "12px"))%>%
hc_yAxis(title = list(text = "Porcentaje"))%>%
hc_xAxis(title=list(text="Tipo de percepción"),
categories = get_labels(data_emovi2017$mov)) %>%
#hc_title(align = "left")%>%
hc_exporting(enabled = TRUE,
filename = "datos",
buttons = list(contextButton = list(menuItems = myMenuItems)))
data_emovi2017 %>%
slice(dfh_c%>%select(id_ho)%>%pull())%>%
count(p133,mov)%>%
group_by(p133) %>%
mutate(freq = n)%>%
#mutate(freq = round(100 * n/sum(n), 0))%>%
hchart('column',
hcaes( y = 'freq', group = as_label(mov)))%>%
hc_add_theme(hc_theme_ggplot2())%>%
hc_title(
text = "Percepción de movilidad de acuerdo a intervalo de ingreso"
) %>%
#hc_subtitle(text = "Para el color de piel se revisa la escala") %>%
# hc_credits(
# enabled = TRUE, text = "Source: SSS",
# style = list(fontSize = "12px"))%>%
hc_yAxis(title = list(text = "Número de entrevistados"))%>%
hc_xAxis(title=list(text="Intervalo de ingreso"),
categories = get_labels(data_emovi2017$p133)) %>%
hc_exporting(enabled = TRUE,
filename = "datos",
buttons = list(contextButton = list(menuItems = myMenuItems)))
# Per_SitEco
data_emovi2017 %>%
count(p151,mov)%>%
group_by(p151) %>%
mutate(freq = round(100 * n/sum(n), 0))%>%
hchart('column',
hcaes( y = 'freq', group = as_label(mov)))%>%
hc_add_theme(hc_theme_ffx())%>%
hc_title(
text = "Percepción de movilidad de acuerdo al color de piel"
) %>%
hc_subtitle(text = "Para el color de piel se revisa la escala") %>%
# hc_credits(
# enabled = TRUE, text = "Source: SSS",
# style = list(fontSize = "12px"))%>%
hc_yAxis(title = list(text = "Porcentaje"))%>%
hc_xAxis(title=list(text="Color de piel"),
categories = get_labels(data_emovi2017$p151)) %>%
hc_exporting(enabled = TRUE,
filename = "datos",
buttons = list(contextButton = list(menuItems = myMenuItems)))
Percepción regional
# pensamos que los datos se leeen como factores cando corresponda, si se leen como enteros no debe hacerse el casting
#data_emovi2017<-datos_e
hijos <- data_emovi2017 %>%
filter(p02 == 1) %>% #compartir gasot para comer
filter(between(p05,25,40)) %>% # edad
#filter(p08 == 1) %>%
filter(p12 == 2) %>% # ya no estudia
filter(p26 == 1 | p26==2 ) %>% # sosten principal papa, mama,
filter((!is.na(p43) & p43!=98 & p26 == 1 ) |
(!is.na(p43m) & p43m!=98 & p26 == 2 )) %>% # reporta educación de pp
filter(!is.na(p13))%>% # reporta educación
filter(SINCO3 !="") %>%# reporta oficio actual
filter(p68 == 1 | p69 == 1) %>% # si trabaja
filter(p132 %in% c(1)) %>%# persona que aportan ingreso
filter(!p133 %in% c(8,9,NA) ) # reporta ingresos
# no estan los ingresos hogar aislados.
#edad_promedio_padres <- mean(hijos$p38_11, na.rm = TRUE)
#edad_promedio_padres-21
unique(hijos$p43)
## [1] 11 2 6 <NA> 98 4 3 8 5 7 10 12 9 1
## Levels: 1 2 3 4 5 6 7 8 9 10 11 12 98
gra_sex_est(hijos)
var<-c("Estado","p05","p06","p13","SINCO3","p133","mov","id_ho","region")
hijos_para_sal<-hijos%>%
select(var)%>%
mutate(p133 = ifelse(p133==1,2,p133)-1)# juntamos el cohort 1 y 2
hijos_para_sal <- hijos_para_sal%>%
mutate(estrato = ifelse(p133 %in% c(1,2),1,
ifelse(p133 %in% c(3),2,
ifelse(p133 %in% c(4,5),3,4))))
saveRDS(hijos_para_sal, file="Datos/hijos_emovi2017.Rda")
data_emovi2017<-data_emovi2017%>%
mutate(
region_m = ifelse(Estado %in% as.integer(c("02","26","08","05","19","28")),1,
ifelse(Estado %in%as.integer(c("12","20","07","30","27","04","31","23")),4,
ifelse(Estado %in% as.integer(c("03","25","18","10","32","16","06","14","01","24")),2,3)))
)
data_emovi2017$region_m<- set_labels(
data_emovi2017$region_m,
labels = c("Norte" = 1,
"Norte-Centro" = 2,
"Centro" = 3,
"Sur" = 4))
data_emovi2017 %>%
slice(as.integer(unlist(hijos_para_sal%>%select(id_ho))))%>%
count(region_m,mov)%>%
group_by(region_m) %>%
mutate(freq = round(100 * n/sum(n), 0))%>%
hchart('column',
hcaes( y = 'freq', group = as_label(mov)))%>%
hc_add_theme(hc_theme_tufte())%>%
hc_title(
text = "Percepción de movilidad de acuerdo region"
) %>%
hc_subtitle(text = "") %>%
# hc_credits(
# enabled = TRUE, text = "Source: SSS",
# style = list(fontSize = "12px"))%>%
hc_yAxis(title = list(text = "Porcentaje"))%>%
hc_xAxis(title=list(text="Region"),
categories = get_labels(data_emovi2017$region_m)) %>%
hc_exporting(enabled = TRUE,
filename = "datos",
buttons = list(contextButton = list(menuItems = myMenuItems)))
#la nacional
#menos movil 1 2
# empate 2 1
# empate 3 4
# mas 4 3
Percepción por cohort de ingreso
data_emovi2017 %>%
count(p133,mov)%>%
group_by(p133) %>%
mutate(freq = round(100 * n/sum(n), 0))%>%
hchart('column',
hcaes( y = 'freq', group = as_label(mov)))%>%
hc_add_theme(hc_theme_ffx())%>%
hc_title(
text = "Percepción de movilidad de acuerdo a cohort de ingreso"
) %>%
hc_subtitle(text = "") %>%
# hc_credits(
# enabled = TRUE, text = "Source: SSS",
# style = list(fontSize = "12px"))%>%
hc_yAxis(title = list(text = "Porcentaje"))%>%
hc_xAxis(title=list(text="Region"),
categories = get_labels(data_emovi2017$p133)) %>%
hc_exporting(enabled = TRUE,
filename = "datos",
buttons = list(contextButton = list(menuItems = myMenuItems)))
Percepción cohort de menor nivel
#unique((data_emovi2017%>%
# filter((p133==1 | p133==2) & p132==1))$p133)
#
# nrow((data_emovi2017%>%
# filter((p133==1 | p133==2) & p132==1)))
skey<-data_emovi2017%>%
filter((p133==1 | p133==2) & p132==1)%>%
select(p148,p147)%>%
data_to_sankey()
for (a in unique(skey$from)){
skey$from[skey$from == a] <-paste(a,'p')
}
skey%>%
hchart('sankey',nodeWidth=50,
opacity=1, linkOpacity=0.05, minLinkWidth=2,
name = "Movilidad",nodePadding = 15,clip=FALSE,
description = "hola")%>%
hc_add_theme(hc_theme_ffx())%>%
hc_title(
text = "Percepción de movilidad relativa"
)%>%
hc_subtitle(text = "Cohorts de menor ingreso") %>%
hc_exporting(enabled = TRUE,
filename = "datos",
buttons = list(contextButton = list(menuItems = myMenuItems)))
Percepción cohort de mayor nivel
# unique((data_emovi2017%>%
# filter(p133==6 | p133==7))$p133)
#
# nrow((data_emovi2017%>%
# filter(p133==6 | p133==7)))
skey<-data_emovi2017%>%
filter((p133==7) & p132==1)%>%
select(p148,p147)%>%
data_to_sankey()
for (a in unique(skey$from)){
skey$from[skey$from == a] <-paste(a,'p')
}
skey%>%
hchart('sankey',nodeWidth=50,
opacity=1, linkOpacity=0.05, minLinkWidth=2,
name = "Movilidad",nodePadding = 15,clip=FALSE,
description = "hola")%>%
hc_add_theme(hc_theme_ffx())%>%
hc_title(
text = "Percepción de movilidad relativa"
)%>%
hc_subtitle(text = "Cohorts de mayor ingreso") %>%
hc_exporting(enabled = TRUE,
filename = "datos",
buttons = list(contextButton = list(menuItems = myMenuItems)))
ESRU-EMOVI 2011
La ESRU – EMOVI 2011 se diseñó para continuar el estudio nacional sobre la movilidad social iniciado en 2006. Para esta ocasión, se realizaron 11,001 entrevistas efectivas con información representativa a nivel nacional de hombres y mujeres entre 25 y 64 años de edad, por tipo de jefatura del hogar y de ámbitos urbano y no urbano. Los principales objetivos de la ESRU – EMOVI 2011 son:
- Conocer el grado de asociación entre los recursos de los padres y el logro socioeconómico de los hijos.
- Identificar las barreras que limitan la posibilidad de que las personas experimenten movilidad social.
Encuesta dirigida por el Programa de Movilidad Social del CEEY y financiada por la Fundación ESRU.
cargar_esru2011<- function(){
return(read_stata(
path = "Datos/ESRU-EMOVI-2011/Emovi2011modEntrevistado.dta",
atomic.to.fac = TRUE,
enc = NULL,
))
}
data_emovi2011<-cargar_esru2011()
data_emovi2011$p124<-add_labels(
data_emovi2011$p124,
labels = c("1" = 1,
"2" = 2,
"3" = 3,
"4" = 4,
"5" = 5,
"6" = 6,
"7" = 7,
"8" = 8,
"9" = 9,
"10" = 10))
Percepción de movilidad pasada
gra_per_eco_act<- function(df){
df%>%
count(p124)%>%
hchart('column',
hcaes( y = 'n'))%>%
hc_add_theme(hc_theme_ffx())%>%
hc_title(
text = "Opinión sobre situación económica pasada"
) %>%
#hc_subtitle(text = "Las edades están agrupadas en intervalos
# de 10 años (da clic sobre F o M)") %>%
# hc_credits(
# enabled = TRUE, text = "Source: SSS",
# style = list(fontSize = "12px"))%>%
hc_yAxis(title = list(text = "Número de participantes"))%>%
hc_xAxis(title=list(text="Posición económica"),
categories = get_labels(df$p124)) %>%
hc_exporting(enabled = TRUE,
filename = "datos",
buttons = list(contextButton = list(menuItems = myMenuItems)))
}
gra_per_eco_act(data_emovi2011)
Percepción ecnomica actual
data_emovi2011$p169<-add_labels(
data_emovi2011$p169,
labels = c("1" = 1,
"2" = 2,
"3" = 3,
"4" = 4,
"5" = 5,
"6" = 6,
"7" = 7,
"8" = 8,
"9" = 9,
"10" = 10))
gra_per_eco_act<- function(df){
df%>%
count(p169)%>%
hchart('column',
hcaes( y = 'n'))%>%
hc_add_theme(hc_theme_ffx())%>%
hc_title(
text = "Opinión sobre situación económica actual"
) %>%
#hc_subtitle(text = "Las edades están agrupadas en intervalos
# de 10 años (da clic sobre F o M)") %>%
# hc_credits(
# enabled = TRUE, text = "Source: SSS",
# style = list(fontSize = "12px"))%>%
hc_yAxis(title = list(text = "Número de participantes"))%>%
hc_xAxis(title=list(text="Posición económica"),
categories = get_labels(df$p169)) %>%
hc_exporting(enabled = TRUE,
filename = "datos",
buttons = list(contextButton = list(menuItems = myMenuItems)))
}
gra_per_eco_act(data_emovi2011)
data_emovi2011<-data_emovi2011%>%
filter(!(p124 %in% c(98,99)) & !(p169 %in% c(98,99)))%>%
mutate(mov = ifelse(p169>p124,"mejor",
ifelse(p169<p124,"peor","igual")))
data_emovi2011$mov<-set_labels(
data_emovi2011$mov,
labels = c("mejor" = "mejor",
"peor" = "peor",
"igual" = "igual"))
Percepción cualitativa total
data_emovi2011 %>%
count(mov)%>%
mutate(freq = round(100 * n/sum(n), 0))%>%
hchart('column',
hcaes( y = 'freq'))%>%
hc_add_theme(hc_theme_ffx())%>%
hc_title(
text = "Percepción de movilidad"
) %>%
hc_subtitle(text = "") %>%
# hc_credits(
# enabled = TRUE, text = "Source: SSS",
# style = list(fontSize = "12px"))%>%
hc_yAxis(title = list(text = "Porcentaje"))%>%
hc_xAxis(title=list(text="Tipo de percepción"),
categories = get_labels(data_emovi2011$mov)) %>%
hc_exporting(enabled = TRUE,
filename = "datos",
buttons = list(contextButton = list(menuItems = myMenuItems)))
Percepción regional
data_emovi2011<- data_emovi2011%>% mutate(
region = ifelse(entidad %in% c("02","26","08","05","19","28"),1,
ifelse(entidad %in% c("12","20","07","30","27","04","31","23"),5,
ifelse(entidad %in% c("03","25","18","10","32"),2,
ifelse(entidad %in% c("13","01","06","16","24"),3,4))))
)
data_emovi2011 %>%
count(region,mov)%>%
group_by(region) %>%
mutate(freq = round(100 * n/sum(n), 0))%>%
hchart('column',
hcaes( y = 'freq', group = as_label(mov)))%>%
hc_add_theme(hc_theme_ffx())%>%
hc_title(
text = "Percepción de movilidad de acuerdo region"
) %>%
hc_subtitle(text = "") %>%
# hc_credits(
# enabled = TRUE, text = "Source: SSS",
# style = list(fontSize = "12px"))%>%
hc_yAxis(title = list(text = "Porcentaje"))%>%
hc_xAxis(title=list(text="Region"),
categories = get_labels(data_emovi2017$region)) %>%
hc_exporting(enabled = TRUE,
filename = "datos",
buttons = list(contextButton = list(menuItems = myMenuItems)))
ESRU-EMOVI 2006
La ESRU – EMOVI 2006 es una de las primeras encuestas de cobertura nacional diseñada con el objetivo de medir la movilidad social en México. La encuesta es un corte transversal que incluye preguntas retrospectivas sobre la situación socioeconómica de los padres del entrevistado con el objetivo de observar la influencia que tienen los recursos de los padres en la posición socioeconómica de sus hijos.
Para este levantamiento se realizaron 7,288 entrevistas efectivas con información representativa a nivel nacional de hombres, jefes de hogar, entre 25 y 64 años de edad.
Encuesta dirigida por Florencia Torche y financiada por la Fundación ESRU.
LS0tCnRpdGxlOiAiRGF0b3MgRVNSVS1FTU9WSSIKYXV0aG9yOiAiUmFmYWVsIE1hcnTDrW5leiBNYXJ0w61uZXoiCm91dHB1dDogCiAgaHRtbF9kb2N1bWVudDoKICAgIHRvYzogdHJ1ZQogICAgdG9jX2Zsb2F0OiB0cnVlCiAgICBudW1iZXJfc2VjdGlvbnM6IGZhbHNlCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUKLS0tCgpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFLCBtZXNzYWdlID0gRkFMU0UsIGV2YWw9VFJVRSwgd2FybmluZyA9IEZBTFNFKQpgYGAKPGRpdiBpZCA9ICJqdXN0aWZpY2FyIj4KTG9zIGRhdG9zIHNlIHJlY3VwZXJhcm9uIGRlbCBzaXRpbyBkZWwgW0NFRVldW10gZG9uZGUgc2UgdGllbmVuIGxhcyBlbmN1ZXN0YXMgRVNSVS1FTU9WSSAoTGFzIGVzY3Vlc3RhcyBkZSBsYSBmdW5kYWNpw7NuIEVzcGlub3NhIFJ1Z2FyY8OtYSBkZSBNb3ZpbGlkYWQgU29pY2FsIGVuIE3DqXhpY28pIHBhcmEgbG9zIGxldmFudGFtaWVudG9zOiAyMDA2LCAyMDExIHkgMjAxNy4gCgpDYWRhIHVuYSBkZSBsYXMgZW5jdWVudGFzIHRpZW5lIGRpc3RpbnRvcyBvYmpldGl2b3MsIHF1ZSBzZSBleHBsaWNhcsOhbiBlbiBsYXMgc2lndWllbnRlcyBzZWNjaW9uZXMuIFBhcmEgbWF5b3JlcyBkZXRhbGxlcyBzb2JyZSBsYXMgZW5jdWV0YXMgc2UgcHVlZGUgY29uc3VsdGFyIGVsIHNpdGlvIG9maWNpYWwgZG9uZGUgc2UgZW5jdWV0cmFuIGFsb2phZG9zIGxvcyBkYXRvcyBbQ0VFWV1bXS4KPC9kaXY+CiAgW0NFRVldOiBodHRwczovL2NlZXkub3JnLm14L2NvbnRlbmlkby9xdWUtaGFjZW1vcy9lbW92aS8KCgoKCgoKYGBge3IgY2FyZ2FyX2JpbGlvdGVjYXMsIGV2YWwgPSBUUlVFfQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShoYXZlbikgIyBpbXBvcnRhLCBlbnRyZSBvdHJvcyBzb2Z0d2FyZSwgZGUgU3RhdGEKbGlicmFyeShzamxhYmVsbGVkKSAjIG1hbmVqYXIgbGFiZWxzIGRlIGxhcyB2YXJpYWJsZXMgCmxpYnJhcnkob3Blbnhsc3gpICMgbGVlciBhcmNoaXZvcyBkZSBleGNlbApsaWJyYXJ5KERUKSAjIHZpc3VhbGl6YXIgYSB0YWJsYXMKbGlicmFyeShkYXRhLnRhYmxlKSAjIGNvbnZlcnRpciBhIHRhYmxhcwpsaWJyYXJ5KGhpZ2hjaGFydGVyKSAjIGdyw6FmaWNhcyBpbnRlcmFjdGl2YXMKbGlicmFyeShmb3JlaWduKQpgYGAKCiMgRVNSVS1FTU9WSSAyMDE3Cgo8ZGl2IGlkID0gImp1c3RpZmljYXIiPgpQb3IgcHJpbWVyYSB2ZXogeSBncmFjaWFzIGFsIGVuZm9xdWUgdGVycml0b3JpYWwgZGUgbGEgRVNSVSDigJMgRU1PVkkgMjAxNywgZXMgcG9zaWJsZSBtZWRpciBsYSBtb3ZpbGlkYWQgc29jaWFsIHBvciByZWdpb25lcy4gTGEgZW5jdWVzdGEgZGUgMjAxNywgYWwgaWd1YWwgcXVlIGxhcyBhbnRlcmlvcmVzLCB0aWVuZSBjb21vIGZpbmFsaWRhZCBwcmluY2lwYWwgbWVkaXIgbGEgbW92aWxpZGFkIHNvY2lhbCBpbnRlcmdlbmVyYWNpb25hbC4gQ3VlbnRhIGNvbiAxNyw2NjUgZW50cmV2aXN0YXMgeSBlcyByZXByZXNlbnRhdGl2YSBkZSBob21icmVzIHkgbXVqZXJlcyBlbnRyZSAyNSB5IDY0IGHDsW9zIGEgbml2ZWwgbmFjaW9uYWwsIHBhcmEgbGEgQ2l1ZGFkIGRlIE3DqXhpY28geSBjaW5jbyByZWdpb25lcyBkZWwgcGHDrXM6IG5vcnRlLCBub3J0ZS1vY2NpZGVudGUsIGNlbnRybywgY2VudHJvLW5vcnRlIHkgc3VyLiBMb3Mgb2JqZXRpdm9zIGRlIGxhIEVTUlUtRU1PVkkgMjAxNyBzb246CgphKSBDb250YXIgY29uIGluZm9ybWFjacOzbiBhY3R1YWxpemFkYSBlbiBsYXMgZGlzdGludGFzIGRpbWVuc2lvbmVzIGRlIGxhIG1vdmlsaWRhZCBzb2NpYWwgYSBuaXZlbCBuYWNpb25hbC4KCmEpIEdlbmVyYXIgZXN0aW1hY2lvbmVzIGRlIG1vdmlsaWRhZCBwYXJhIGNpbmNvIHJlZ2lvbmVzIGRlbCBwYcOtcyB5IGxhIENpdWRhZCBkZSBNw6l4aWNvLgoKYSkgQW5hbGl6YXIgbG9zIHBhdHJvbmVzIGRlIG1vdmlsaWRhZCBzb2NpYWwgZGVzZGUgbGEgcGVyc3BlY3RpdmEgZGUgbGEgZGVzaWd1YWxkYWQgZGUgb3BvcnR1bmlkYWRlcy4KCkVuY3Vlc3RhIGZpbmFuY2lhZGEgcG9yIGxhIEZ1bmRhY2nDs24gRVNSVS4KCjwvZGl2PgoKYGBge3IgdmFyX2VudHJlX2Vtb3ZpMjAxN30KZGVzX3Zhcl9lbnRyZXZpc3RhZG8gPC0gcmVhZC54bHN4KAogICAgICAgICAgICAgICAgICAgICAgICAgIHhsc3hGaWxlID0gIkRhdG9zL0VTUlUtRU1PVkktMjAxNy9EaWNjaW9uYXJpby1FU1JVLUVNT1ZJLTIwMTcueGxzeCIKICAgICAgICAgICAgICAgICAgICAgICAgKQpkYXRhdGFibGUoYXMuZGF0YS50YWJsZShkZXNfdmFyX2VudHJldmlzdGFkbyksb3B0aW9ucyA9IGxpc3QocGFnZUxlbmd0aCA9IDUpKQpgYGAKCgpgYGB7cn0KZGVzX3Zhcl9ob2dhciA8LSByZWFkLnhsc3goCiAgICAgICAgICAgICAgICAgICB4bHN4RmlsZSA9ICJEYXRvcy9FU1JVLUVNT1ZJLTIwMTcvRGljY2lvbmFyaW8tRVNSVS1FTU9WSS0yMDE3Lnhsc3giLAogICAgICAgICAgICAgICAgICAgc2hlZXQgPSAyCiAgICAgICAgICAgICAgICAgKQpkYXRhdGFibGUoYXMuZGF0YS50YWJsZShkZXNfdmFyX2hvZ2FyKSxvcHRpb25zID0gbGlzdChwYWdlTGVuZ3RoID0gNSkpCmBgYAoKCgoKYGBge3IgY2FyZ2FyIGRhdG9zLCBldmFsID0gVFJVRX0KCmNhcmdhcjwtIGZ1bmN0aW9uKCl7CgpkYXRvc19lIDw8LSByZWFkX3N0YXRhKAogICAgICAgICAgICAgICAgICAgICBwYXRoID0gIkRhdG9zL0VTUlUtRU1PVkktMjAxNy9FU1JVLUVNT1ZJLTIwMTctRW50cmV2aXN0YWRvLmR0YSIsCiAgICAgICAgICAgICAgICAgICAgIGF0b21pYy50by5mYWMgPSBUUlVFLAogICAgICAgICAgICAgICAgICAgICBlbmMgPSBOVUxMLAogICAgICAgICAgICAgICAgICAgICApCn0KCmRhdGFfaG9nYXIgPC0gcmVhZF9zdGF0YSgKICAgICAgICAgIHBhdGggPSAgIkRhdG9zL0VTUlUtRU1PVkktMjAxNy9FU1JVLUVNT1ZJLTIwMTctSG9nYXIuZHRhIiwKICAgICAgICAgICAgICAgICAgICAgYXRvbWljLnRvLmZhYyA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgIGVuYyA9IE5VTEwKICAgICAgICAgICAgICAgICAgICAgKQoKY2FyZ2FyKCkKZGF0YV9lbW92aTIwMTc8LWRhdG9zX2UgCmBgYAoKYGBge3J9CgpgYGAKCgoKCjxkaXYgaWQgPSAianVzdGlmaWNhciI+CkFsIG1vbWVudG8gZGUgZXhwb3J0YXIgYSBSLCBleGlzdGVuIGVycm9yZXMgZW4gbGFzIGV0aXFldXRhcyBkZSBsYXMgdmFyaWFibGVzIHkgZGUgbG9zIHZhbG9yZXMuIExhcyBldGlxdWV0ZXMgZGUgbGFzIHZhcmlhYmxlcyBkZXNjcmliZW4gY29uIG1heW9yIHByZWNpc2nDs24gYSBkaWNoYXMgdmFyaWFibGVzLiBNaWVudHJhcyBxdWUgbGFzIGV0aXF1ZXRhcyBkZSBsb3Mgdm9sb3JlcyBlc3TDoW4gYXNvY2lhZGFzIGEgZGF0b3MgY2F0ZWfDs3JpY29zLiBFeGlzdGVuIGRpdmVyc2FzIGZvcm1hYXMgZGUgbGlkaWFyIGNvbiBlc3RlIHByb2JsZW1hLiBMYSBmb3JtYSBxdWUgc2UgdXRpbGl6YXLDoSAocG9yIGVsIG1vbWVudG8sIGVzdG8gc2UgcG9kcsOtYSBvcHRpbWl6YXIpIGVzIGhhY2VyIHVuYSBjb252ZXJzacOzbiBkZSBjb2RpZmljYWNpw7NuIGVudHJlIGxvcyBmb3JtYXRvcyBkZSB3aW5kb3dzIHkgbWFjLCBzb2xvIGVuIGNhc28gZGUgc2VyIG5lY2VzYXJpby4gTm8gZXMgcG9zaWJsZSBoYWNlciB1bmEgY292ZXJzacOzbiBnZW5lcmFsIChwb3IgZWwgbW9tZW50bywgcG9kcsOtYSBvcHRpbWl6YXJzZSkgcHVlcyBhbGd1bmFzIGNvZGlmaWNhY2lvbmVzIHNvbiBjb3JyZWN0YXMgeSBvdHJhcyBuby4KPC9kaXY+CgpgYGB7ciBmdW5jaW9uZXMgY29kaWZpY2FyLCBldmFsID0gVFJVRX0KI2EgPC0gZ2V0X2xhYmVsKGRhdGFfZW1vdmkyMDE3JGVzdF9kaXMpCiNiIDwtIGdldF9sYWJlbHMoZGF0YV9lbW92aTIwMTckRXN0YWRvKQojcHJpbnQoYSkKI3ByaW50KGIpCgpjb2RpX2V0aXF1ZXRhcyA8LSBmdW5jdGlvbihkZl92YXIsIGVuY28gPSAiSVNPXzg4NTktMTUiKXsKcmV0dXJuKHNldF9sYWJlbHMoCiAgICAgICAgICAgICAgICAgICAgICAgICAgZGZfdmFyLAogICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9dW5saXN0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcHBseSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9sYWJlbHMoZGZfdmFyKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb252LGZyb209ICJVVEYtOCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bz1lbmNvIwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgKQopCn0KCmNvbXByb19ldGkgPC0gZnVuY3Rpb24odmFyLCBlbmNvID0gIklTT184ODU5LTE1IiApewpkYXRhX2UyIDwtIGRhdGFfZW1vdmkyMDE3CnByaW50KGdldF9sYWJlbHMoZGF0YV9lMltbdmFyXV0pKQojY29kaV9ldGlxdWV0YXMoZGF0YV9lMiRlem9uYSkKZGF0YV9lMltbdmFyXV0gPC0gY29kaV9ldGlxdWV0YXMoZGF0YV9lMltbdmFyXV0sZW5jbykKcHJpbnQoZ2V0X2xhYmVscyhkYXRhX2UyW1t2YXJdXSkpCn0KCmNhbWJpYXJfZXRpIDwtIGZ1bmN0aW9uKHZhciwgZW5jbz0iSVNPXzg4NTktMTUiKXsKZGF0YV9lbW92aTIwMTdbW3Zhcl1dIDw8LSBjb2RpX2V0aXF1ZXRhcyhkYXRhX2Vtb3ZpMjAxN1tbdmFyXV0sZW5jbykKcHJpbnQoZ2V0X2xhYmVscyhkYXRhX2Vtb3ZpMjAxN1tbdmFyXV0pKQp9CgoKCiNnZXRfbGFiZWxzKGRhdGFfZW1vdmkyMDE3KQojZ2V0X2xhYmVscyhkYXRhX2Vtb3ZpMjAxNyRlem9uYSkKI3N0cihnZXRfbGFiZWxzKGRhdGFfZW1vdmkyMDE3KSkKI3JlcGxhY2VfbGFiZWxzKGRhdGFfZW1vdmkyMDE3LAojbGFiZWxzPWljb252KGdldF9sYWJlbHMoZGF0YV9lbW92aTIwMTcpLCJVVEYtOCIsIklTT184ODU5LTE1IikpCiNsYXBwbHkoZ2V0X2xhYmVscyhkYXRhX2Vtb3ZpMjAxNyksIGljb252LGZyb209ICJVVEYtOCIsdG89IklTT184ODU5LTE1IikKCiNnZXRfbGFiZWxzKGRhdGFfZW1vdmkyMDE3JGV6b25hKQojZGF0YV9lMiA8LSBkYXRhX2Vtb3ZpMjAxNwojcHJpbnQoZ2V0X2xhYmVscyhkYXRhX2UyWydlem9uYSddKSkKI2NvZGlfZXRpcXVldGFzKGRhdGFfZTIkZXpvbmEpCiNkYXRhX2UyWydlem9uYSddIDwtIGNvZGlfZXRpcXVldGFzKGRhdGFfZTJbJ2V6b25hJ10pIwojcHJpbnQoZ2V0X2xhYmVscyhkYXRhX2UyWydlem9uYSddKSkKI2dldF9sYWJlbHMoZGF0YV9lMiRlem9uYSkKCgojY29tcHJvX2V0aSgicDEzIikKI2NhbWJpYXJfZXRpKCdwMTMnKQojY29tcHJvX2V0aSgnZXpvbmEnKQojY2FtYmlhcl9ldGkoJ2V6b25hJykKY2FtYmlhcl9ldGkoJ3AxMzMnLGVuY28gPSAiV2luZG93cy0xMjUyIikKYGBgCgpgYGB7ciwgZXZhbCA9IEZBTFNFfQpzdHIoZGF0YV9lbW92aTIwMTcpCnZpZXcoZGF0YV9lbW92aTIwMTcpCmBgYAoKCiMjIEVudHJldmlzdGFkb3MgcG9yIGVzdGFkbwoKYGBge3IgZW50cmV2aXN0YWRvc19lc3RhZG8sIGZpZy53aWR0aCA9IDEwMCwgZmlnLmhlaWdodD0gNDB9CgpteU1lbnVJdGVtcyA8LSBjKCJkb3dubG9hZFBORyIsICJkb3dubG9hZEpQRUciLCAiZG93bmxvYWRQREYiLCAnZG93bmxvYWRTVkcnLCAncHJpbnRDaGFydCcpCnBsb3RhIDwtIGRhdGFfZW1vdmkyMDE3ICU+JQogIAogIGNvdW50KEVzdGFkbykgJT4lCiAgaGNoYXJ0KCd0cmVlbWFwJywKICAgICAgICAgaGNhZXMoeCA9IHBhc3RlKGdldF9sYWJlbHMoRXN0YWRvKSwnICcsJygnLCBuLCcpJywgc2VwID0gJycpLCB2YWx1ZT0nbicsIGNvbG9yID0gJ24nKQogICkgJT4lCiAgaGNfYWRkX3RoZW1lKGhjX3RoZW1lX2ZmeCgpKSAlPiUKICBoY190aXRsZSgKICAgIHRleHQgPSAiTsO6bWVybyBkZSBlbnRyZXZpc3RhZG9zIHBvciBlc3RhZG8iCiAgKSU+JSAKICBoY19zdWJ0aXRsZSh0ZXh0ID0gcGFzdGUoIlRvdGFsIGRlIHBhcnRpY2lwYXRlczogIiAsIHRvU3RyaW5nKG5yb3coZGF0YV9lbW92aTIwMTcpKSkpICU+JQogIGhjX2V4cG9ydGluZyhlbmFibGVkID0gVFJVRSwKICAgICAgICAgICAgICAgZmlsZW5hbWUgPSAiYXJjaGl2byIsCiAgICAgICAgICAgICAgIHNvdXJjZVdpZHRoID0gIDEwMDAsCiAgICAgICAgICAgICAgIHNvdXJjZUhlaWdodCA9IDY0MCwKICAgICAgICAgICAgICAgc2NhbGUgPSAxMCwKICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgYnV0dG9ucyA9IGxpc3QoY29udGV4dEJ1dHRvbiA9IGxpc3QobWVudUl0ZW1zID0gbXlNZW51SXRlbXMpKQogICkKaHRtbHdpZGdldHM6OnNhdmVXaWRnZXQod2lkZ2V0ID0gcGxvdGEsIGZpbGUgPSAiLi9wbG90Lmh0bWwiKQpzZXR3ZCgifi9PbmVEcml2ZSAtIENlbnRybyBkZSBJbnZlc3RpZ2FjaW9uIHkgRG9jZW5jaWEgRWNvbm9taWNhcyBDSURFL1Rlc2lzTUUyMDE5L1Rlc2luYUNJREVNRVJNTSIpCndlYnNob3Q6OndlYnNob3QodXJsID0gIn4vVXNlcnMvcmFmYW10ei9PbmVEcml2ZSAtIENlbnRybyBkZSBJbnZlc3RpZ2FjaW9uIHkgRG9jZW5jaWEgRWNvbm9taWNhcyBDSURFL1Rlc2lzTUUyMDE5L1Rlc2luYUNJREVNRVJNTS9wbG90Lmh0bWwiLCAKICAgICAgICAgICAgICAgICAgZGVsYXkgPSAyKQpwbG90YQpgYGAKCiMjIFNleG8gcG9yIGVzdGFkbyAKCmBgYHtyIGVzdGFkb19zZXhvLCBmaWcud2lkdGg9MTAsIGV2YWwgPSBUUlVFfQoKZGZoX2MgPC0gcmVhZFJEUyhmaWxlID0gIkRhdG9zL2RmaF9jX2NvbWJpbmFkYV9jaF9jcmkzLlJkYSIpCgpteU1lbnVJdGVtcyA8LSBjKCJkb3dubG9hZFBORyIsICJkb3dubG9hZEpQRUciLCAiZG93bmxvYWRQREYiLCAnZG93bmxvYWRTVkcnLCAncHJpbnRDaGFydCcpCmdyYV9zZXhfZXN0PC1mdW5jdGlvbihkZil7CmRmICU+JQogICAgc2xpY2UoYXMuaW50ZWdlcih1bmxpc3QoZGZoX2MlPiVzZWxlY3QoaWRfaG8pKSkpJT4lCiAgY291bnQoRXN0YWRvLCBwMDYpJT4lIAogIGhjaGFydCgnY29sdW1uJywKICAgICAgICAgaGNhZXMoIHkgPSAnbicsICBncm91cCA9IGFzX2xhYmVsKHAwNikpKSU+JQogIGhjX2FkZF90aGVtZShoY190aGVtZV9nZ3Bsb3QyKCkpJT4lCiAgaGNfdGl0bGUoCiAgICB0ZXh0ID0gIk7Dum1lcm8gZGUgZW50cmV2aXN0YWRvcyBwb3IgZXN0YWRvIHkgc2V4byIKICApICU+JQogICNoY19zdWJ0aXRsZSh0ZXh0ID0gIkxhcyBlZGFkZXMgZXN0w6FuIGFncnVwYWRhcyBlbiBpbnRlcnZhbG9zIAogICAjICAgICAgICAgICBkZSAxMCBhw7FvcyAoZGEgY2xpYyBzb2JyZSBGIG8gTSkiKSAlPiUKICAjIGhjX2NyZWRpdHMoCiAgIyAgZW5hYmxlZCA9IFRSVUUsIHRleHQgPSAiU291cmNlOiBTU1MiLAogICMgIHN0eWxlID0gbGlzdChmb250U2l6ZSA9ICIxMnB4IikpJT4lCiAgaGNfeUF4aXModGl0bGUgPSBsaXN0KHRleHQgPSAiTsO6bWVybyBkZSBwYXJ0aWNpcGFudGVzIikpJT4lCiAgaGNfeEF4aXModGl0bGU9bGlzdCh0ZXh0PSJFc3RhZG9zIiksCiAgICAgICAgICAgY2F0ZWdvcmllcyA9IGdldF9sYWJlbHMoZGYkRXN0YWRvKSkgJT4lCiAgICBoY19leHBvcnRpbmcoZW5hYmxlZCA9IFRSVUUsCiAgICAgICAgICAgICAgIGZpbGVuYW1lID0gImRhdG9zIiwKICAgICAgICAgICAgICAgYnV0dG9ucyA9IGxpc3QoY29udGV4dEJ1dHRvbiA9IGxpc3QobWVudUl0ZW1zID0gbXlNZW51SXRlbXMpKSkKfQpncmFfc2V4X2VzdChkYXRhX2Vtb3ZpMjAxNykKYGBgCiMjIFNleG8gcG9yIGVkYWQgCgpgYGB7ciBlc3RhZG9fc2V4bzEsIGZpZy53aWR0aD0xMCwgZXZhbCA9IFRSVUV9Cm15TWVudUl0ZW1zIDwtIGMoImRvd25sb2FkUE5HIiwgImRvd25sb2FkSlBFRyIsICJkb3dubG9hZFBERiIsICdkb3dubG9hZFNWRycsICdwcmludENoYXJ0JykKZ3JhX3NleF9lc3Q8LWZ1bmN0aW9uKGRmKXsKZGYgJT4lCiAgICBzbGljZShhcy5pbnRlZ2VyKHVubGlzdChkZmhfYyU+JXNlbGVjdChpZF9obykpKSklPiUKICBjb3VudChwMDUsIHAwNiklPiUgCiAgaGNoYXJ0KCdjb2x1bW4nLAogICAgICAgICBoY2FlcyggeSA9ICduJywgIGdyb3VwID0gYXNfbGFiZWwocDA2KSkpJT4lCiAgaGNfYWRkX3RoZW1lKGhjX3RoZW1lX2dncGxvdDIoKSklPiUKICBoY190aXRsZSgKICAgIHRleHQgPSAiTsO6bWVybyBkZSBlbnRyZXZpc3RhZG9zIHBvciBlZGFkIHkgc2V4byIKICApICU+JQogICNoY19zdWJ0aXRsZSh0ZXh0ID0gIkxhcyBlZGFkZXMgZXN0w6FuIGFncnVwYWRhcyBlbiBpbnRlcnZhbG9zIAogICAjICAgICAgICAgICBkZSAxMCBhw7FvcyAoZGEgY2xpYyBzb2JyZSBGIG8gTSkiKSAlPiUKICAjIGhjX2NyZWRpdHMoCiAgIyAgZW5hYmxlZCA9IFRSVUUsIHRleHQgPSAiU291cmNlOiBTU1MiLAogICMgIHN0eWxlID0gbGlzdChmb250U2l6ZSA9ICIxMnB4IikpJT4lCiAgaGNfeUF4aXModGl0bGUgPSBsaXN0KHRleHQgPSAiTsO6bWVybyBkZSBwYXJ0aWNpcGFudGVzIikpJT4lCiAgaGNfeEF4aXModGl0bGU9bGlzdCh0ZXh0PSJFZGFkIiksCiAgICAgICAgICAgY2F0ZWdvcmllcyA9IGFzLmNoYXJhY3RlcigyNTo1MCkpICU+JQogICAgaGNfZXhwb3J0aW5nKGVuYWJsZWQgPSBUUlVFLAogICAgICAgICAgICAgICBmaWxlbmFtZSA9ICJkYXRvcyIsCiAgICAgICAgICAgICAgIGJ1dHRvbnMgPSBsaXN0KGNvbnRleHRCdXR0b24gPSBsaXN0KG1lbnVJdGVtcyA9IG15TWVudUl0ZW1zKSkpCn0KZ3JhX3NleF9lc3QoZGF0YV9lbW92aTIwMTcpCmBgYAoKIyMgU2V4byBwb3IgY29ob3J0IAoKYGBge3IgZXN0YWRvX3NleG8yLCBmaWcud2lkdGg9MTAsIGV2YWwgPSBUUlVFfQpteU1lbnVJdGVtcyA8LSBjKCJkb3dubG9hZFBORyIsICJkb3dubG9hZEpQRUciLCAiZG93bmxvYWRQREYiLCAnZG93bmxvYWRTVkcnLCAncHJpbnRDaGFydCcpCmdyYV9zZXhfZXN0PC1mdW5jdGlvbihkZil7CmRmICU+JQogICAgc2xpY2UoYXMuaW50ZWdlcih1bmxpc3QoZGZoX2MlPiVzZWxlY3QoaWRfaG8pKSkpJT4lCiAgY291bnQocDEzMywgcDA2KSU+JSAKICBoY2hhcnQoJ2NvbHVtbicsCiAgICAgICAgIGhjYWVzKCB5ID0gJ24nLCAgZ3JvdXAgPSBhc19sYWJlbChwMDYpKSklPiUKICBoY19hZGRfdGhlbWUoaGNfdGhlbWVfZ2dwbG90MigpKSU+JQogIGhjX3RpdGxlKAogICAgdGV4dCA9ICJOw7ptZXJvIGRlIGVudHJldmlzdGFkb3MgcG9yIGludGVydmFsbyBkZSBpbmdyZXNvIHkgc2V4byIKICApICU+JQogICNoY19zdWJ0aXRsZSh0ZXh0ID0gIkxhcyBlZGFkZXMgZXN0w6FuIGFncnVwYWRhcyBlbiBpbnRlcnZhbG9zIAogICAjICAgICAgICAgICBkZSAxMCBhw7FvcyAoZGEgY2xpYyBzb2JyZSBGIG8gTSkiKSAlPiUKICAjIGhjX2NyZWRpdHMoCiAgIyAgZW5hYmxlZCA9IFRSVUUsIHRleHQgPSAiU291cmNlOiBTU1MiLAogICMgIHN0eWxlID0gbGlzdChmb250U2l6ZSA9ICIxMnB4IikpJT4lCiAgaGNfeUF4aXModGl0bGUgPSBsaXN0KHRleHQgPSAiTsO6bWVybyBkZSBwYXJ0aWNpcGFudGVzIikpJT4lCiAgaGNfeEF4aXModGl0bGU9bGlzdCh0ZXh0PSJJbnRlcnZhbG8gZGUgaW5ncmVzbyIpLAogICAgICAgICAgIGNhdGVnb3JpZXMgPSBnZXRfbGFiZWxzKGRhdGFfZW1vdmkyMDE3JHAxMzMpKSAlPiUKICAgIGhjX2V4cG9ydGluZyhlbmFibGVkID0gVFJVRSwKICAgICAgICAgICAgICAgZmlsZW5hbWUgPSAiZGF0b3MiLAogICAgICAgICAgICAgICBidXR0b25zID0gbGlzdChjb250ZXh0QnV0dG9uID0gbGlzdChtZW51SXRlbXMgPSBteU1lbnVJdGVtcykpKQp9CmdyYV9zZXhfZXN0KGRhdGFfZW1vdmkyMDE3KQpgYGAKCiMjIEVzY29sYXJpZGFkIHNleG8KCmBgYHtyIGVzY29sYXJpZGFkX3NleG8xLCBmaWcud2lkdGg9MTB9CgoKZGF0YV9lbW92aTIwMTcgJT4lCiAgY291bnQocDEzLHAwNiklPiUgCiAgaGNoYXJ0KCdjb2x1bW4nLAogICAgICAgICBoY2FlcyggeSA9ICduJywgIGdyb3VwID0gYXNfbGFiZWwocDA2KSkpJT4lCiAgaGNfYWRkX3RoZW1lKGhjX3RoZW1lX2ZmeCgpKSU+JQogIGhjX3RpdGxlKAogICAgdGV4dCA9ICJFc2NvbGFyaWRhZCBwb3IgIHNleG8iCiAgKSAlPiUKICAjaGNfc3VidGl0bGUodGV4dCA9ICJMYXMgZWRhZGVzIGVzdMOhbiBhZ3J1cGFkYXMgZW4gaW50ZXJ2YWxvcyAKICAgIyAgICAgICAgICAgZGUgMTAgYcOxb3MgKGRhIGNsaWMgc29icmUgRiBvIE0pIikgJT4lCiAgIyBoY19jcmVkaXRzKAogICMgIGVuYWJsZWQgPSBUUlVFLCB0ZXh0ID0gIlNvdXJjZTogU1NTIiwKICAjICBzdHlsZSA9IGxpc3QoZm9udFNpemUgPSAiMTJweCIpKSU+JQogIGhjX3lBeGlzKHRpdGxlID0gbGlzdCh0ZXh0ID0gIk7Dum1lcm8gZGUgcGFydGljaXBhbnRlcyIpKSU+JQogIGhjX3hBeGlzKHRpdGxlPWxpc3QodGV4dD0iRXNjb2xhcmlkYWQiKSwKICAgICAgICAgICBjYXRlZ29yaWVzID0gZ2V0X2xhYmVscyhkYXRhX2Vtb3ZpMjAxNyRwMTMpKSAlPiUKICAgIGhjX2V4cG9ydGluZyhlbmFibGVkID0gVFJVRSwKICAgICAgICAgICAgICAgZmlsZW5hbWUgPSAiZGF0b3MiLAogICAgICAgICAgICAgICBidXR0b25zID0gbGlzdChjb250ZXh0QnV0dG9uID0gbGlzdChtZW51SXRlbXMgPSBteU1lbnVJdGVtcykpKQpgYGAKCiMjIE7Dum1lcm8gZGUgcGVyc29uYXMgcXVlIGFwb3J0YW4gYWwgaW5ncmVzbwoKYGBge3IgcGVyc29uYXNfYXBvcnRhbiwgZmlnLndpZHRoPTEwfQpkYXRhX2Vtb3ZpMjAxNyAlPiUKICBjb3VudChwMTMyKSU+JSAKICBoY2hhcnQoJ2NvbHVtbicsCiAgICAgICAgIGhjYWVzKCB5ID0gJ24nKSklPiUKICBoY19hZGRfdGhlbWUoaGNfdGhlbWVfZmZ4KCkpJT4lCiAgaGNfdGl0bGUoCiAgICB0ZXh0ID0gIk51bWVybyBkZSBtaWVtYnJvcyBxdWUgYXBvcnRhbiBpbmdyZXNvIgogICkgJT4lCiAgI2hjX3N1YnRpdGxlKHRleHQgPSAiTGFzIGVkYWRlcyBlc3TDoW4gYWdydXBhZGFzIGVuIGludGVydmFsb3MgCiAgICMgICAgICAgICAgIGRlIDEwIGHDsW9zIChkYSBjbGljIHNvYnJlIEYgbyBNKSIpICU+JQogICMgaGNfY3JlZGl0cygKICAjICBlbmFibGVkID0gVFJVRSwgdGV4dCA9ICJTb3VyY2U6IFNTUyIsCiAgIyAgc3R5bGUgPSBsaXN0KGZvbnRTaXplID0gIjEycHgiKSklPiUKICBoY195QXhpcyh0aXRsZSA9IGxpc3QodGV4dCA9ICJOw7ptZXJvIGRlIHBhcnRpY2lwYW50ZXMiKSklPiUKICBoY194QXhpcyh0aXRsZT1saXN0KHRleHQ9Ik7Dum1lcm8gZGUgcGVyc29uYXMiKSwKICAgICAgICAgICBjYXRlZ29yaWVzID0gZ2V0X2xhYmVscyhkYXRhX2Vtb3ZpMjAxNyRwMTMyKSkgJT4lCiAgICBoY19leHBvcnRpbmcoZW5hYmxlZCA9IFRSVUUsCiAgICAgICAgICAgICAgIGZpbGVuYW1lID0gImRhdG9zIiwKICAgICAgICAgICAgICAgYnV0dG9ucyA9IGxpc3QoY29udGV4dEJ1dHRvbiA9IGxpc3QobWVudUl0ZW1zID0gbXlNZW51SXRlbXMpKSkKYGBgCgojIFBlcmNlcGNpw7NuIGRlIG1vdmlsaWRhZCAKCmBgYHtyLCBldmFsID0gVFJVRX0KCgpkYXRhX2Vtb3ZpMjAxNyRwMTQ3PC1hZGRfbGFiZWxzKAogICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfZW1vdmkyMDE3JHAxNDcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiMSIgPSAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjIiID0gMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIzIiA9IDMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiNCIgPSA0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjUiID0gNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI2IiA9IDYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiNyIgPSA3LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjgiID0gOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI5IiA9IDksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMTAiID0gMTApKQpgYGAKCgojIFBlcmNlcGNpw7NuIEFjdHVhbAoKYGBge3IsIGV2YWwgPSBUUlVFfQpncmFfcGVyX2Vjb19hY3Q8LSBmdW5jdGlvbihkZil7CiAgZGYlPiUKICBjb3VudChwMTQ3KSU+JSAKICBoY2hhcnQoJ2NvbHVtbicsCiAgICAgICAgIGhjYWVzKCB5ID0gJ24nKSklPiUKICBoY19hZGRfdGhlbWUoaGNfdGhlbWVfZmZ4KCkpJT4lCiAgaGNfdGl0bGUoCiAgICB0ZXh0ID0gIk9waW5pw7NuIHNvYnJlIHNpdHVhY2nDs24gZWNvbsOzbWljYSBhY3R1YWwiCiAgKSAlPiUKICAjaGNfc3VidGl0bGUodGV4dCA9ICJMYXMgZWRhZGVzIGVzdMOhbiBhZ3J1cGFkYXMgZW4gaW50ZXJ2YWxvcyAKICAgIyAgICAgICAgICAgZGUgMTAgYcOxb3MgKGRhIGNsaWMgc29icmUgRiBvIE0pIikgJT4lCiAgIyBoY19jcmVkaXRzKAogICMgIGVuYWJsZWQgPSBUUlVFLCB0ZXh0ID0gIlNvdXJjZTogU1NTIiwKICAjICBzdHlsZSA9IGxpc3QoZm9udFNpemUgPSAiMTJweCIpKSU+JQogIGhjX3lBeGlzKHRpdGxlID0gbGlzdCh0ZXh0ID0gIk7Dum1lcm8gZGUgcGFydGljaXBhbnRlcyIpKSU+JQogIGhjX3hBeGlzKHRpdGxlPWxpc3QodGV4dD0iUG9zaWNpw7NuIGVjb27Ds21pY2EiKSwKICAgICAgICAgICBjYXRlZ29yaWVzID0gZ2V0X2xhYmVscyhkZiRwMTQ3KSkgJT4lCiAgICBoY19leHBvcnRpbmcoZW5hYmxlZCA9IFRSVUUsCiAgICAgICAgICAgICAgIGZpbGVuYW1lID0gImRhdG9zIiwKICAgICAgICAgICAgICAgYnV0dG9ucyA9IGxpc3QoY29udGV4dEJ1dHRvbiA9IGxpc3QobWVudUl0ZW1zID0gbXlNZW51SXRlbXMpKSkKfQpncmFfcGVyX2Vjb19hY3QoZGF0YV9lbW92aTIwMTcpCgpgYGAKCmBgYHtyLCBldmFsID0gVFJVRX0KZGF0YV9lbW92aTIwMTckcDE0ODwtYWRkX2xhYmVscygKICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX2Vtb3ZpMjAxNyRwMTQ4LAogICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIjEiID0gMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIyIiA9IDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMyIgPSAzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjQiID0gNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI1IiA9IDUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiNiIgPSA2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjciID0gNywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4IiA9IDgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiOSIgPSA5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjEwIiA9IDEwKSkKYGBgCgoKIyBQZXJjZXBjacOzbiBwYXNhZGEKCmBgYHtyLCBldmFsPVRSVUV9CmdyYV9wZXJfZWNvX2FudDwtIGZ1bmN0aW9uKGRmKXsKICBkZiU+JQogIGNvdW50KHAxNDgpJT4lIAogIGhjaGFydCgnY29sdW1uJywKICAgICAgICAgaGNhZXMoIHkgPSAnbicpKSU+JQogIGhjX2FkZF90aGVtZShoY190aGVtZV9mZngoKSklPiUKICBoY190aXRsZSgKICAgIHRleHQgPSAiT3BpbmnDs24gc29icmUgc2l0dWFjacOzbiBlY29uw7NtaWNhIGRlIGxvcyBwYWRyZXMiCiAgKSAlPiUKICAjaGNfc3VidGl0bGUodGV4dCA9ICJMYXMgZWRhZGVzIGVzdMOhbiBhZ3J1cGFkYXMgZW4gaW50ZXJ2YWxvcyAKICAgIyAgICAgICAgICAgZGUgMTAgYcOxb3MgKGRhIGNsaWMgc29icmUgRiBvIE0pIikgJT4lCiAgIyBoY19jcmVkaXRzKAogICMgIGVuYWJsZWQgPSBUUlVFLCB0ZXh0ID0gIlNvdXJjZTogU1NTIiwKICAjICBzdHlsZSA9IGxpc3QoZm9udFNpemUgPSAiMTJweCIpKSU+JQogIGhjX3lBeGlzKHRpdGxlID0gbGlzdCh0ZXh0ID0gIk7Dum1lcm8gZGUgcGFydGljaXBhbnRlcyIpKSU+JQogIGhjX3hBeGlzKHRpdGxlPWxpc3QodGV4dD0iUG9zaWNpw7NuIGVjb27Ds21pY2EiKSwKICAgICAgICAgICBjYXRlZ29yaWVzID0gZ2V0X2xhYmVscyhkZiRwMTQ4KSkgJT4lCiAgICBoY19leHBvcnRpbmcoZW5hYmxlZCA9IFRSVUUsCiAgICAgICAgICAgICAgIGZpbGVuYW1lID0gImRhdG9zIiwKICAgICAgICAgICAgICAgYnV0dG9ucyA9IGxpc3QoY29udGV4dEJ1dHRvbiA9IGxpc3QobWVudUl0ZW1zID0gbXlNZW51SXRlbXMpKSkKfQpncmFfcGVyX2Vjb19hbnQoZGF0YV9lbW92aTIwMTcpCmBgYAoKIyBQZXJjZXBjacOzbiByZWxhdGl2YQoKYGBge3IsIGV2YWwgPSBUUlVFfQoKCnNrZXk8LWRhdGFfZW1vdmkyMDE3JT4lCiAgc2VsZWN0KHAxNDgscDE0NyklPiUKICBkYXRhX3RvX3NhbmtleSgpCgojc2tleQoKZm9yIChhIGluIHVuaXF1ZShza2V5JGZyb20pKXsKc2tleSRmcm9tW3NrZXkkZnJvbSA9PSBhXSA8LXBhc3RlKGEsJ3AnKQp9Cgojc2tleSR3ZWlnaHQ8LWFzLmRvdWJsZShza2V5JHdlaWdodCkKCiNmb3IgKGEgaW4gdW5pcXVlKHNrZXkkZnJvbSkpewojc2tleVtza2V5JGZyb20gPT1hLCAid2VpZ2h0Il0gPC0gcm91bmQoc2tleVtza2V5JGZyb20gPT1hLCAid2VpZ2h0Il0gLyAjc3VtKHNrZXlbc2tleSRmcm9tPT1hLDNdKSwyKQojfQoKI3NrZXkKCnNrZXklPiUKaGNoYXJ0KCdzYW5rZXknLG5vZGVXaWR0aD01MCwKICAgICAgIG9wYWNpdHk9MSwgbGlua09wYWNpdHk9MC4wNSwgbWluTGlua1dpZHRoPTIsCiAgICAgICBuYW1lID0gIk1vdmlsaWRhZCIsbm9kZVBhZGRpbmcgPSAxNSxjbGlwPUZBTFNFLAogICAgICAgZGVzY3JpcHRpb24gPSAiaG9sYSIpJT4lCiAgaGNfYWRkX3RoZW1lKGhjX3RoZW1lX2ZmeCgpKSU+JQogIGhjX3RpdGxlKAogICAgdGV4dCA9ICJQZXJjZXBjacOzbiBkZSBtb3ZpbGlkYWQgcmVsYXRpdmEiCiAgKSU+JQogICAgaGNfZXhwb3J0aW5nKGVuYWJsZWQgPSBUUlVFLAogICAgICAgICAgICAgICBmaWxlbmFtZSA9ICJkYXRvcyIsCiAgICAgICAgICAgICAgIGJ1dHRvbnMgPSBsaXN0KGNvbnRleHRCdXR0b24gPSBsaXN0KG1lbnVJdGVtcyA9IG15TWVudUl0ZW1zKSkpCgpgYGAKYGBge3J9Cgpza2V5PC1kYXRhX2Vtb3ZpMjAxNyU+JQogIGZpbHRlcihwMDY9PTEpJT4lCiAgc2VsZWN0KHAxNDgscDE0NyklPiUKICBkYXRhX3RvX3NhbmtleSgpCgoKZm9yIChhIGluIHVuaXF1ZShza2V5JGZyb20pKXsKc2tleSRmcm9tW3NrZXkkZnJvbSA9PSBhXSA8LXBhc3RlKGEsJ3AnKQp9CgoKc2tleSU+JQpoY2hhcnQoJ3NhbmtleScsbm9kZVdpZHRoPTUwLAogICAgICAgb3BhY2l0eT0xLCBsaW5rT3BhY2l0eT0wLjA1LCBtaW5MaW5rV2lkdGg9MiwKICAgICAgIG5hbWUgPSAiTW92aWxpZGFkIixub2RlUGFkZGluZyA9IDE1LGNsaXA9RkFMU0UsCiAgICAgICBkZXNjcmlwdGlvbiA9ICJob2xhIiklPiUKICBoY19hZGRfdGhlbWUoaGNfdGhlbWVfZmZ4KCkpJT4lCiAgaGNfdGl0bGUoCiAgICB0ZXh0ID0gIlBlcmNlcGNpw7NuIGRlIG1vdmlsaWRhZCByZWxhdGl2YSIKICApJT4lCiAgaGNfc3VidGl0bGUodGV4dCA9ICJIb21icmVzIikgJT4lCiAgICBoY19leHBvcnRpbmcoZW5hYmxlZCA9IFRSVUUsCiAgICAgICAgICAgICAgIGZpbGVuYW1lID0gImRhdG9zIiwKICAgICAgICAgICAgICAgYnV0dG9ucyA9IGxpc3QoY29udGV4dEJ1dHRvbiA9IGxpc3QobWVudUl0ZW1zID0gbXlNZW51SXRlbXMpKSkKCmBgYAoKYGBge3J9Cgpza2V5PC1kYXRhX2Vtb3ZpMjAxNyU+JQogIGZpbHRlcihwMDY9PTIpJT4lCiAgc2VsZWN0KHAxNDgscDE0NyklPiUKICBkYXRhX3RvX3NhbmtleSgpCgoKZm9yIChhIGluIHVuaXF1ZShza2V5JGZyb20pKXsKc2tleSRmcm9tW3NrZXkkZnJvbSA9PSBhXSA8LXBhc3RlKGEsJ3AnKQp9CgoKc2tleSU+JQpoY2hhcnQoJ3NhbmtleScsbm9kZVdpZHRoPTUwLAogICAgICAgb3BhY2l0eT0xLCBsaW5rT3BhY2l0eT0wLjA1LCBtaW5MaW5rV2lkdGg9MiwKICAgICAgIG5hbWUgPSAiTW92aWxpZGFkIixub2RlUGFkZGluZyA9IDE1LGNsaXA9RkFMU0UsCiAgICAgICBkZXNjcmlwdGlvbiA9ICJob2xhIiklPiUKICBoY19hZGRfdGhlbWUoaGNfdGhlbWVfZmZ4KCkpJT4lCiAgaGNfdGl0bGUoCiAgICB0ZXh0ID0gIlBlcmNlcGNpw7NuIGRlIG1vdmlsaWRhZCByZWxhdGl2YSIKICApJT4lCiAgaGNfc3VidGl0bGUodGV4dCA9ICJNdWplcmVzIikgJT4lCiAgICBoY19leHBvcnRpbmcoZW5hYmxlZCA9IFRSVUUsCiAgICAgICAgICAgICAgIGZpbGVuYW1lID0gImRhdG9zIiwKICAgICAgICAgICAgICAgYnV0dG9ucyA9IGxpc3QoY29udGV4dEJ1dHRvbiA9IGxpc3QobWVudUl0ZW1zID0gbXlNZW51SXRlbXMpKSkKCmBgYAojIyBjcmVhbW9zIG1vdgoKYGBge3IsIGV2YWw9VFJVRX0KCmRhdGFfZW1vdmkyMDE3PC1kYXRhX2Vtb3ZpMjAxNyU+JQogIG11dGF0ZShtb3YgPSBpZmVsc2UocDE0Nz5wMTQ4LCJtZWpvciIsCiAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UocDE0NzxwMTQ4LCJwZW9yIiwiaWd1YWwiKSksCiAgICAgICAgIGlkX2hvID0gYXMuaW50ZWdlcihyb3cubmFtZXMoZGF0YV9lbW92aTIwMTcpKSkKZGF0YV9lbW92aTIwMTckbW92PC1zZXRfbGFiZWxzKAogICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfZW1vdmkyMDE3JG1vdiwKICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJtZWpvciIgPSAibWVqb3IiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBlb3IiID0gInBlb3IiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImlndWFsIiA9ICJpZ3VhbCIpKQpgYGAKCiMgUGVyY2VwY2nDs24gY3VhbGl0YXRpdmEgdG90YWwgCgpgYGB7ciwgZXZhbD1UUlVFLCBldmFsID0gVFJVRX0KZGF0YV9lbW92aTIwMTcgJT4lCiAgc2xpY2UoZGZoX2MlPiVzZWxlY3QoaWRfaG8pJT4lcHVsbCgpKSU+JQogIGNvdW50KG1vdiklPiUgCiAgbXV0YXRlKGZyZXEgPSByb3VuZCgxMDAgKiBuL3N1bShuKSwgMCkpJT4lCiAKICBoY2hhcnQoJ2NvbHVtbicsCiAgICAgICAgIGhjYWVzKCB5ID0gJ2ZyZXEnKSklPiUKICBoY19hZGRfdGhlbWUoaGNfdGhlbWVfZ2dwbG90MigpKSU+JQogIGhjX3RpdGxlKAogICAgdGV4dCA9ICJQZXJjZXBjacOzbiBkZSBtb3ZpbGlkYWQiCiAgKSAlPiUKICBoY19zdWJ0aXRsZSh0ZXh0ID0gIiIpICU+JQogICMgaGNfY3JlZGl0cygKICAjICBlbmFibGVkID0gVFJVRSwgdGV4dCA9ICJTb3VyY2U6IFNTUyIsCiAgIyAgc3R5bGUgPSBsaXN0KGZvbnRTaXplID0gIjEycHgiKSklPiUKICBoY195QXhpcyh0aXRsZSA9IGxpc3QodGV4dCA9ICJQb3JjZW50YWplIikpJT4lCiAgaGNfeEF4aXModGl0bGU9bGlzdCh0ZXh0PSJUaXBvIGRlIHBlcmNlcGNpw7NuIiksCiAgICAgICAgICAgY2F0ZWdvcmllcyA9IGdldF9sYWJlbHMoZGF0YV9lbW92aTIwMTckbW92KSkgJT4lCiAgI2hjX3RpdGxlKGFsaWduID0gImxlZnQiKSU+JQogICAgaGNfZXhwb3J0aW5nKGVuYWJsZWQgPSBUUlVFLAogICAgICAgICAgICAgICBmaWxlbmFtZSA9ICJkYXRvcyIsCiAgICAgICAgICAgICAgIGJ1dHRvbnMgPSBsaXN0KGNvbnRleHRCdXR0b24gPSBsaXN0KG1lbnVJdGVtcyA9IG15TWVudUl0ZW1zKSkpCmBgYAoKCgpgYGB7cn0KZGF0YV9lbW92aTIwMTcgJT4lCiAgc2xpY2UoZGZoX2MlPiVzZWxlY3QoaWRfaG8pJT4lcHVsbCgpKSU+JQogIGNvdW50KHAxMzMsbW92KSU+JSAKICBncm91cF9ieShwMTMzKSAlPiUKICBtdXRhdGUoZnJlcSA9IG4pJT4lCiAgI211dGF0ZShmcmVxID0gcm91bmQoMTAwICogbi9zdW0obiksIDApKSU+JQogIGhjaGFydCgnY29sdW1uJywKICAgICAgICAgaGNhZXMoIHkgPSAnZnJlcScsICBncm91cCA9IGFzX2xhYmVsKG1vdikpKSU+JQogIGhjX2FkZF90aGVtZShoY190aGVtZV9nZ3Bsb3QyKCkpJT4lCiAgaGNfdGl0bGUoCiAgICB0ZXh0ID0gIlBlcmNlcGNpw7NuIGRlIG1vdmlsaWRhZCBkZSBhY3VlcmRvIGEgaW50ZXJ2YWxvIGRlIGluZ3Jlc28iCiAgKSAlPiUKICAjaGNfc3VidGl0bGUodGV4dCA9ICJQYXJhIGVsIGNvbG9yIGRlIHBpZWwgc2UgcmV2aXNhIGxhIGVzY2FsYSIpICU+JQogICMgaGNfY3JlZGl0cygKICAjICBlbmFibGVkID0gVFJVRSwgdGV4dCA9ICJTb3VyY2U6IFNTUyIsCiAgIyAgc3R5bGUgPSBsaXN0KGZvbnRTaXplID0gIjEycHgiKSklPiUKICBoY195QXhpcyh0aXRsZSA9IGxpc3QodGV4dCA9ICJOw7ptZXJvIGRlIGVudHJldmlzdGFkb3MiKSklPiUKICBoY194QXhpcyh0aXRsZT1saXN0KHRleHQ9IkludGVydmFsbyBkZSBpbmdyZXNvIiksCiAgICAgICAgICAgY2F0ZWdvcmllcyA9IGdldF9sYWJlbHMoZGF0YV9lbW92aTIwMTckcDEzMykpICU+JQogICAgaGNfZXhwb3J0aW5nKGVuYWJsZWQgPSBUUlVFLAogICAgICAgICAgICAgICBmaWxlbmFtZSA9ICJkYXRvcyIsCiAgICAgICAgICAgICAgIGJ1dHRvbnMgPSBsaXN0KGNvbnRleHRCdXR0b24gPSBsaXN0KG1lbnVJdGVtcyA9IG15TWVudUl0ZW1zKSkpCmBgYAoKYGBge3J9CiMgUGVyX1NpdEVjbwoKZGF0YV9lbW92aTIwMTcgJT4lCiAgY291bnQocDE1MSxtb3YpJT4lIAogIGdyb3VwX2J5KHAxNTEpICU+JQogIG11dGF0ZShmcmVxID0gcm91bmQoMTAwICogbi9zdW0obiksIDApKSU+JQogIGhjaGFydCgnY29sdW1uJywKICAgICAgICAgaGNhZXMoIHkgPSAnZnJlcScsICBncm91cCA9IGFzX2xhYmVsKG1vdikpKSU+JQogIGhjX2FkZF90aGVtZShoY190aGVtZV9mZngoKSklPiUKICBoY190aXRsZSgKICAgIHRleHQgPSAiUGVyY2VwY2nDs24gZGUgbW92aWxpZGFkIGRlIGFjdWVyZG8gYWwgY29sb3IgZGUgcGllbCIKICApICU+JQogIGhjX3N1YnRpdGxlKHRleHQgPSAiUGFyYSBlbCBjb2xvciBkZSBwaWVsIHNlIHJldmlzYSBsYSBlc2NhbGEiKSAlPiUKICAjIGhjX2NyZWRpdHMoCiAgIyAgZW5hYmxlZCA9IFRSVUUsIHRleHQgPSAiU291cmNlOiBTU1MiLAogICMgIHN0eWxlID0gbGlzdChmb250U2l6ZSA9ICIxMnB4IikpJT4lCiAgaGNfeUF4aXModGl0bGUgPSBsaXN0KHRleHQgPSAiUG9yY2VudGFqZSIpKSU+JQogIGhjX3hBeGlzKHRpdGxlPWxpc3QodGV4dD0iQ29sb3IgZGUgcGllbCIpLAogICAgICAgICAgIGNhdGVnb3JpZXMgPSBnZXRfbGFiZWxzKGRhdGFfZW1vdmkyMDE3JHAxNTEpKSAlPiUKICAgIGhjX2V4cG9ydGluZyhlbmFibGVkID0gVFJVRSwKICAgICAgICAgICAgICAgZmlsZW5hbWUgPSAiZGF0b3MiLAogICAgICAgICAgICAgICBidXR0b25zID0gbGlzdChjb250ZXh0QnV0dG9uID0gbGlzdChtZW51SXRlbXMgPSBteU1lbnVJdGVtcykpKQoKYGBgCgoKIyBQZXJjZXBjacOzbiByZWdpb25hbAoKCmBgYHtyIGhpam9zc2VsZWNjaW9ufQojIHBlbnNhbW9zIHF1ZSBsb3MgZGF0b3Mgc2UgbGVlZW4gY29tbyBmYWN0b3JlcyBjYW5kbyBjb3JyZXNwb25kYSwgc2kgc2UgbGVlbiBjb21vIGVudGVyb3Mgbm8gZGViZSBoYWNlcnNlIGVsIGNhc3RpbmcKI2RhdGFfZW1vdmkyMDE3PC1kYXRvc19lCmhpam9zIDwtIGRhdGFfZW1vdmkyMDE3ICU+JQogIGZpbHRlcihwMDIgPT0gMSkgICU+JSAjY29tcGFydGlyIGdhc290IHBhcmEgY29tZXIKICBmaWx0ZXIoYmV0d2VlbihwMDUsMjUsNDApKSAlPiUgIyBlZGFkCiAgI2ZpbHRlcihwMDggPT0gMSkgICU+JSAKICBmaWx0ZXIocDEyID09IDIpICAlPiUgIyB5YSBubyBlc3R1ZGlhCiAgZmlsdGVyKHAyNiA9PSAxIHwgcDI2PT0yICkgJT4lICMgc29zdGVuIHByaW5jaXBhbCBwYXBhLCBtYW1hLCAKICAgZmlsdGVyKCghaXMubmEocDQzKSAmIHA0MyE9OTggJiBwMjYgPT0gMSApIHwKICAgICAgICAgICAgKCFpcy5uYShwNDNtKSAmIHA0M20hPTk4ICAmIHAyNiA9PSAyICkpICU+JSAjIHJlcG9ydGEgZWR1Y2FjacOzbiBkZSBwcAogICBmaWx0ZXIoIWlzLm5hKHAxMykpJT4lICMgIHJlcG9ydGEgZWR1Y2FjacOzbgogIGZpbHRlcihTSU5DTzMgIT0iIikgJT4lIyByZXBvcnRhIG9maWNpbyBhY3R1YWwKICAgZmlsdGVyKHA2OCA9PSAxIHwgcDY5ID09IDEpICAlPiUgIyBzaSB0cmFiYWphCiAgIGZpbHRlcihwMTMyICVpbiUgYygxKSkgJT4lIyBwZXJzb25hIHF1ZSBhcG9ydGFuIGluZ3Jlc28KICBmaWx0ZXIoIXAxMzMgJWluJSBjKDgsOSxOQSkgKSAjIHJlcG9ydGEgaW5ncmVzb3MKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIG5vIGVzdGFuIGxvcyBpbmdyZXNvcyAgaG9nYXIgYWlzbGFkb3MuIAoKI2VkYWRfcHJvbWVkaW9fcGFkcmVzIDwtIG1lYW4oaGlqb3MkcDM4XzExLCBuYS5ybSA9IFRSVUUpCiNlZGFkX3Byb21lZGlvX3BhZHJlcy0yMQp1bmlxdWUoaGlqb3MkcDQzKQpgYGAKCmBgYHtyfQpncmFfc2V4X2VzdChoaWpvcykKYGBgCgoKYGBge3IgcGFyYV9wcmVfc2FsfQoKCnZhcjwtYygiRXN0YWRvIiwicDA1IiwicDA2IiwicDEzIiwiU0lOQ08zIiwicDEzMyIsIm1vdiIsImlkX2hvIiwicmVnaW9uIikKaGlqb3NfcGFyYV9zYWw8LWhpam9zJT4lCiAgc2VsZWN0KHZhciklPiUKICBtdXRhdGUocDEzMyA9IGlmZWxzZShwMTMzPT0xLDIscDEzMyktMSkjIGp1bnRhbW9zIGVsIGNvaG9ydCAxIHkgMiAKCmhpam9zX3BhcmFfc2FsIDwtIGhpam9zX3BhcmFfc2FsJT4lCiAgICAgICAgICAgIG11dGF0ZShlc3RyYXRvID0gaWZlbHNlKHAxMzMgJWluJSBjKDEsMiksMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHAxMzMgJWluJSBjKDMpLDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UocDEzMyAlaW4lIGMoNCw1KSwzLDQpKSkpCgpzYXZlUkRTKGhpam9zX3BhcmFfc2FsLCBmaWxlPSJEYXRvcy9oaWpvc19lbW92aTIwMTcuUmRhIikKCmBgYAoKCgpgYGB7ciwgZXZhbCA9IFRSVUV9CgoKZGF0YV9lbW92aTIwMTc8LWRhdGFfZW1vdmkyMDE3JT4lCiAgbXV0YXRlKAogICAgICAgICAgICByZWdpb25fbSA9IGlmZWxzZShFc3RhZG8gJWluJSBhcy5pbnRlZ2VyKGMoIjAyIiwiMjYiLCIwOCIsIjA1IiwiMTkiLCIyOCIpKSwxLAogICAgICAgICAgICAgICAgaWZlbHNlKEVzdGFkbyAlaW4lYXMuaW50ZWdlcihjKCIxMiIsIjIwIiwiMDciLCIzMCIsIjI3IiwiMDQiLCIzMSIsIjIzIikpLDQsCiAgICAgICAgICBpZmVsc2UoRXN0YWRvICVpbiUgYXMuaW50ZWdlcihjKCIwMyIsIjI1IiwiMTgiLCIxMCIsIjMyIiwiMTYiLCIwNiIsIjE0IiwiMDEiLCIyNCIpKSwyLDMpKSkKICAgICAgICAgICkKCmRhdGFfZW1vdmkyMDE3JHJlZ2lvbl9tPC0gc2V0X2xhYmVscygKICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX2Vtb3ZpMjAxNyRyZWdpb25fbSwKICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJOb3J0ZSIgPSAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vcnRlLUNlbnRybyIgPSAyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNlbnRybyIgPSAzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlN1ciIgPSA0KSkKCmRhdGFfZW1vdmkyMDE3ICU+JQogIHNsaWNlKGFzLmludGVnZXIodW5saXN0KGhpam9zX3BhcmFfc2FsJT4lc2VsZWN0KGlkX2hvKSkpKSU+JQogIGNvdW50KHJlZ2lvbl9tLG1vdiklPiUgCiAgZ3JvdXBfYnkocmVnaW9uX20pICU+JQogIG11dGF0ZShmcmVxID0gcm91bmQoMTAwICogbi9zdW0obiksIDApKSU+JQogIGhjaGFydCgnY29sdW1uJywKICAgICAgICAgaGNhZXMoIHkgPSAnZnJlcScsICBncm91cCA9IGFzX2xhYmVsKG1vdikpKSU+JQogIGhjX2FkZF90aGVtZShoY190aGVtZV90dWZ0ZSgpKSU+JQogIGhjX3RpdGxlKAogICAgdGV4dCA9ICJQZXJjZXBjacOzbiBkZSBtb3ZpbGlkYWQgZGUgYWN1ZXJkbyByZWdpb24iCiAgKSAlPiUKICBoY19zdWJ0aXRsZSh0ZXh0ID0gIiIpICU+JQogICMgaGNfY3JlZGl0cygKICAjICBlbmFibGVkID0gVFJVRSwgdGV4dCA9ICJTb3VyY2U6IFNTUyIsCiAgIyAgc3R5bGUgPSBsaXN0KGZvbnRTaXplID0gIjEycHgiKSklPiUKICBoY195QXhpcyh0aXRsZSA9IGxpc3QodGV4dCA9ICJQb3JjZW50YWplIikpJT4lCiAgaGNfeEF4aXModGl0bGU9bGlzdCh0ZXh0PSJSZWdpb24iKSwKICAgICAgICAgICBjYXRlZ29yaWVzID0gZ2V0X2xhYmVscyhkYXRhX2Vtb3ZpMjAxNyRyZWdpb25fbSkpICU+JQogICAgaGNfZXhwb3J0aW5nKGVuYWJsZWQgPSBUUlVFLAogICAgICAgICAgICAgICBmaWxlbmFtZSA9ICJkYXRvcyIsCiAgICAgICAgICAgICAgIGJ1dHRvbnMgPSBsaXN0KGNvbnRleHRCdXR0b24gPSBsaXN0KG1lbnVJdGVtcyA9IG15TWVudUl0ZW1zKSkpCgojbGEgbmFjaW9uYWwKI21lbm9zIG1vdmlsICAgICAgIDEgICAgIDIKIyAgZW1wYXRlICAgICAgICAgIDIgICAgIDEKIyAgZW1wYXRlICAgICAgICAgIDMgICAgIDQKIyAgbWFzICAgICAgICAgICAgIDQgICAgIDMKYGBgCgojIFBlcmNlcGNpw7NuIHBvciBjb2hvcnQgZGUgaW5ncmVzbwpgYGB7ciwgZXZhbCA9IFRSVUV9CmRhdGFfZW1vdmkyMDE3ICU+JQogIGNvdW50KHAxMzMsbW92KSU+JSAKICBncm91cF9ieShwMTMzKSAlPiUKICBtdXRhdGUoZnJlcSA9IHJvdW5kKDEwMCAqIG4vc3VtKG4pLCAwKSklPiUKICBoY2hhcnQoJ2NvbHVtbicsCiAgICAgICAgIGhjYWVzKCB5ID0gJ2ZyZXEnLCAgZ3JvdXAgPSBhc19sYWJlbChtb3YpKSklPiUKICBoY19hZGRfdGhlbWUoaGNfdGhlbWVfZmZ4KCkpJT4lCiAgaGNfdGl0bGUoCiAgICB0ZXh0ID0gIlBlcmNlcGNpw7NuIGRlIG1vdmlsaWRhZCBkZSBhY3VlcmRvIGEgY29ob3J0IGRlIGluZ3Jlc28iCiAgKSAlPiUKICBoY19zdWJ0aXRsZSh0ZXh0ID0gIiIpICU+JQogICMgaGNfY3JlZGl0cygKICAjICBlbmFibGVkID0gVFJVRSwgdGV4dCA9ICJTb3VyY2U6IFNTUyIsCiAgIyAgc3R5bGUgPSBsaXN0KGZvbnRTaXplID0gIjEycHgiKSklPiUKICBoY195QXhpcyh0aXRsZSA9IGxpc3QodGV4dCA9ICJQb3JjZW50YWplIikpJT4lCiAgaGNfeEF4aXModGl0bGU9bGlzdCh0ZXh0PSJSZWdpb24iKSwKICAgICAgICAgICBjYXRlZ29yaWVzID0gZ2V0X2xhYmVscyhkYXRhX2Vtb3ZpMjAxNyRwMTMzKSkgJT4lCiAgICBoY19leHBvcnRpbmcoZW5hYmxlZCA9IFRSVUUsCiAgICAgICAgICAgICAgIGZpbGVuYW1lID0gImRhdG9zIiwKICAgICAgICAgICAgICAgYnV0dG9ucyA9IGxpc3QoY29udGV4dEJ1dHRvbiA9IGxpc3QobWVudUl0ZW1zID0gbXlNZW51SXRlbXMpKSkKYGBgCgoKIyBQZXJjZXBjacOzbiBjb2hvcnQgZGUgbWVub3Igbml2ZWwKYGBge3IsIGV2YWwgPSBUUlVFfQojdW5pcXVlKChkYXRhX2Vtb3ZpMjAxNyU+JQojICAgZmlsdGVyKChwMTMzPT0xIHwgcDEzMz09MikgJiBwMTMyPT0xKSkkcDEzMykKIyAKIyBucm93KChkYXRhX2Vtb3ZpMjAxNyU+JQojICAgZmlsdGVyKChwMTMzPT0xIHwgcDEzMz09MikgJiBwMTMyPT0xKSkpCgpza2V5PC1kYXRhX2Vtb3ZpMjAxNyU+JQogIGZpbHRlcigocDEzMz09MSB8IHAxMzM9PTIpICYgcDEzMj09MSklPiUKICBzZWxlY3QocDE0OCxwMTQ3KSU+JQogIGRhdGFfdG9fc2Fua2V5KCkKCgpmb3IgKGEgaW4gdW5pcXVlKHNrZXkkZnJvbSkpewpza2V5JGZyb21bc2tleSRmcm9tID09IGFdIDwtcGFzdGUoYSwncCcpCn0KCgpza2V5JT4lCmhjaGFydCgnc2Fua2V5Jyxub2RlV2lkdGg9NTAsCiAgICAgICBvcGFjaXR5PTEsIGxpbmtPcGFjaXR5PTAuMDUsIG1pbkxpbmtXaWR0aD0yLAogICAgICAgbmFtZSA9ICJNb3ZpbGlkYWQiLG5vZGVQYWRkaW5nID0gMTUsY2xpcD1GQUxTRSwKICAgICAgIGRlc2NyaXB0aW9uID0gImhvbGEiKSU+JQogIGhjX2FkZF90aGVtZShoY190aGVtZV9mZngoKSklPiUKICBoY190aXRsZSgKICAgIHRleHQgPSAiUGVyY2VwY2nDs24gZGUgbW92aWxpZGFkIHJlbGF0aXZhIgogICklPiUKICBoY19zdWJ0aXRsZSh0ZXh0ID0gIkNvaG9ydHMgZGUgbWVub3IgaW5ncmVzbyIpICU+JQogICAgaGNfZXhwb3J0aW5nKGVuYWJsZWQgPSBUUlVFLAogICAgICAgICAgICAgICBmaWxlbmFtZSA9ICJkYXRvcyIsCiAgICAgICAgICAgICAgIGJ1dHRvbnMgPSBsaXN0KGNvbnRleHRCdXR0b24gPSBsaXN0KG1lbnVJdGVtcyA9IG15TWVudUl0ZW1zKSkpCmBgYAoKIyBQZXJjZXBjacOzbiBjb2hvcnQgZGUgbWF5b3Igbml2ZWwKYGBge3IsIGV2YWwgPSBUUlVFfQojIHVuaXF1ZSgoZGF0YV9lbW92aTIwMTclPiUKIyAgIGZpbHRlcihwMTMzPT02IHwgcDEzMz09NykpJHAxMzMpCiMgCiMgbnJvdygoZGF0YV9lbW92aTIwMTclPiUKIyAgIGZpbHRlcihwMTMzPT02IHwgcDEzMz09NykpKQoKc2tleTwtZGF0YV9lbW92aTIwMTclPiUKIGZpbHRlcigocDEzMz09NykgJiBwMTMyPT0xKSU+JQogIHNlbGVjdChwMTQ4LHAxNDcpJT4lCiAgZGF0YV90b19zYW5rZXkoKQoKCmZvciAoYSBpbiB1bmlxdWUoc2tleSRmcm9tKSl7CnNrZXkkZnJvbVtza2V5JGZyb20gPT0gYV0gPC1wYXN0ZShhLCdwJykKfQoKCnNrZXklPiUKaGNoYXJ0KCdzYW5rZXknLG5vZGVXaWR0aD01MCwKICAgICAgIG9wYWNpdHk9MSwgbGlua09wYWNpdHk9MC4wNSwgbWluTGlua1dpZHRoPTIsCiAgICAgICBuYW1lID0gIk1vdmlsaWRhZCIsbm9kZVBhZGRpbmcgPSAxNSxjbGlwPUZBTFNFLAogICAgICAgZGVzY3JpcHRpb24gPSAiaG9sYSIpJT4lCiAgaGNfYWRkX3RoZW1lKGhjX3RoZW1lX2ZmeCgpKSU+JQogIGhjX3RpdGxlKAogICAgdGV4dCA9ICJQZXJjZXBjacOzbiBkZSBtb3ZpbGlkYWQgcmVsYXRpdmEiCiAgKSU+JQogIGhjX3N1YnRpdGxlKHRleHQgPSAiQ29ob3J0cyBkZSBtYXlvciBpbmdyZXNvIikgJT4lCiAgICBoY19leHBvcnRpbmcoZW5hYmxlZCA9IFRSVUUsCiAgICAgICAgICAgICAgIGZpbGVuYW1lID0gImRhdG9zIiwKICAgICAgICAgICAgICAgYnV0dG9ucyA9IGxpc3QoY29udGV4dEJ1dHRvbiA9IGxpc3QobWVudUl0ZW1zID0gbXlNZW51SXRlbXMpKSkKYGBgCgoKCgoKCgojIEVTUlUtRU1PVkkgMjAxMQoKPGRpdiBpZCA9ICJqdXN0aWZpY2FyIj4KTGEgRVNSVSDigJMgRU1PVkkgMjAxMSBzZSBkaXNlw7HDsyBwYXJhIGNvbnRpbnVhciBlbCBlc3R1ZGlvIG5hY2lvbmFsIHNvYnJlIGxhIG1vdmlsaWRhZCBzb2NpYWwgaW5pY2lhZG8gZW4gMjAwNi4gUGFyYSBlc3RhIG9jYXNpw7NuLCBzZSByZWFsaXphcm9uIDExLDAwMSBlbnRyZXZpc3RhcyBlZmVjdGl2YXMgY29uIGluZm9ybWFjacOzbiByZXByZXNlbnRhdGl2YSBhIG5pdmVsIG5hY2lvbmFsIGRlIGhvbWJyZXMgeSBtdWplcmVzIGVudHJlIDI1IHkgNjQgYcOxb3MgZGUgZWRhZCwgcG9yIHRpcG8gZGUgamVmYXR1cmEgZGVsIGhvZ2FyIHkgZGUgw6FtYml0b3MgdXJiYW5vIHkgbm8gdXJiYW5vLiBMb3MgcHJpbmNpcGFsZXMgb2JqZXRpdm9zIGRlIGxhIEVTUlUg4oCTIEVNT1ZJIDIwMTEgc29uOgoKYSkgQ29ub2NlciBlbCBncmFkbyBkZSBhc29jaWFjacOzbiBlbnRyZSBsb3MgcmVjdXJzb3MgZGUgbG9zIHBhZHJlcyB5IGVsIGxvZ3JvIHNvY2lvZWNvbsOzbWljbyBkZSBsb3MgaGlqb3MuCmEpIElkZW50aWZpY2FyIGxhcyBiYXJyZXJhcyBxdWUgbGltaXRhbiBsYSBwb3NpYmlsaWRhZCBkZSBxdWUgbGFzIHBlcnNvbmFzIGV4cGVyaW1lbnRlbiBtb3ZpbGlkYWQgc29jaWFsLgoKRW5jdWVzdGEgZGlyaWdpZGEgcG9yIGVsIFByb2dyYW1hIGRlIE1vdmlsaWRhZCBTb2NpYWwgZGVsIENFRVkgeSBmaW5hbmNpYWRhIHBvciBsYSBGdW5kYWNpw7NuIEVTUlUuCgoKPC9kaXY+CgpgYGB7cn0KCmNhcmdhcl9lc3J1MjAxMTwtIGZ1bmN0aW9uKCl7CgpyZXR1cm4ocmVhZF9zdGF0YSgKICAgICAgICAgICAgICAgICAgICAgcGF0aCA9ICJEYXRvcy9FU1JVLUVNT1ZJLTIwMTEvRW1vdmkyMDExbW9kRW50cmV2aXN0YWRvLmR0YSIsCiAgICAgICAgICAgICAgICAgICAgIGF0b21pYy50by5mYWMgPSBUUlVFLAogICAgICAgICAgICAgICAgICAgICBlbmMgPSBOVUxMLAogICAgICAgICAgICAgICAgICAgICApKQp9CmBgYAoKCmBgYHtyfQpkYXRhX2Vtb3ZpMjAxMTwtY2FyZ2FyX2VzcnUyMDExKCkKYGBgCgoKCgoKYGBge3J9CmRhdGFfZW1vdmkyMDExJHAxMjQ8LWFkZF9sYWJlbHMoCiAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9lbW92aTIwMTEkcDEyNCwKICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCIxIiA9IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMiIgPSAyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjMiID0gMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI0IiA9IDQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiNSIgPSA1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjYiID0gNiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI3IiA9IDcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiOCIgPSA4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjkiID0gOSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIxMCIgPSAxMCkpCmBgYAoKCiMjIFBlcmNlcGNpw7NuIGRlIG1vdmlsaWRhZCBwYXNhZGEKCmBgYHtyLCBldmFsID0gRkFMU0V9CmdyYV9wZXJfZWNvX2FjdDwtIGZ1bmN0aW9uKGRmKXsKICBkZiU+JQogIGNvdW50KHAxMjQpJT4lIAogIGhjaGFydCgnY29sdW1uJywKICAgICAgICAgaGNhZXMoIHkgPSAnbicpKSU+JQogIGhjX2FkZF90aGVtZShoY190aGVtZV9mZngoKSklPiUKICBoY190aXRsZSgKICAgIHRleHQgPSAiT3BpbmnDs24gc29icmUgc2l0dWFjacOzbiBlY29uw7NtaWNhIHBhc2FkYSIKICApICU+JQogICNoY19zdWJ0aXRsZSh0ZXh0ID0gIkxhcyBlZGFkZXMgZXN0w6FuIGFncnVwYWRhcyBlbiBpbnRlcnZhbG9zIAogICAjICAgICAgICAgICBkZSAxMCBhw7FvcyAoZGEgY2xpYyBzb2JyZSBGIG8gTSkiKSAlPiUKICAjIGhjX2NyZWRpdHMoCiAgIyAgZW5hYmxlZCA9IFRSVUUsIHRleHQgPSAiU291cmNlOiBTU1MiLAogICMgIHN0eWxlID0gbGlzdChmb250U2l6ZSA9ICIxMnB4IikpJT4lCiAgaGNfeUF4aXModGl0bGUgPSBsaXN0KHRleHQgPSAiTsO6bWVybyBkZSBwYXJ0aWNpcGFudGVzIikpJT4lCiAgaGNfeEF4aXModGl0bGU9bGlzdCh0ZXh0PSJQb3NpY2nDs24gZWNvbsOzbWljYSIpLAogICAgICAgICAgIGNhdGVnb3JpZXMgPSBnZXRfbGFiZWxzKGRmJHAxMjQpKSAlPiUKICAgIGhjX2V4cG9ydGluZyhlbmFibGVkID0gVFJVRSwKICAgICAgICAgICAgICAgZmlsZW5hbWUgPSAiZGF0b3MiLAogICAgICAgICAgICAgICBidXR0b25zID0gbGlzdChjb250ZXh0QnV0dG9uID0gbGlzdChtZW51SXRlbXMgPSBteU1lbnVJdGVtcykpKQp9CmdyYV9wZXJfZWNvX2FjdChkYXRhX2Vtb3ZpMjAxMSkKCmBgYAoKCgojIyBQZXJjZXBjacOzbiBlY25vbWljYSBhY3R1YWwKCgpgYGB7cn0KZGF0YV9lbW92aTIwMTEkcDE2OTwtYWRkX2xhYmVscygKICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX2Vtb3ZpMjAxMSRwMTY5LAogICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIjEiID0gMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIyIiA9IDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMyIgPSAzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjQiID0gNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI1IiA9IDUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiNiIgPSA2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjciID0gNywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4IiA9IDgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiOSIgPSA5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjEwIiA9IDEwKSkKYGBgCgpgYGB7ciwgZXZhbCA9IEZBTFNFfQpncmFfcGVyX2Vjb19hY3Q8LSBmdW5jdGlvbihkZil7CiAgZGYlPiUKICBjb3VudChwMTY5KSU+JSAKICBoY2hhcnQoJ2NvbHVtbicsCiAgICAgICAgIGhjYWVzKCB5ID0gJ24nKSklPiUKICBoY19hZGRfdGhlbWUoaGNfdGhlbWVfZmZ4KCkpJT4lCiAgaGNfdGl0bGUoCiAgICB0ZXh0ID0gIk9waW5pw7NuIHNvYnJlIHNpdHVhY2nDs24gZWNvbsOzbWljYSBhY3R1YWwiCiAgKSAlPiUKICAjaGNfc3VidGl0bGUodGV4dCA9ICJMYXMgZWRhZGVzIGVzdMOhbiBhZ3J1cGFkYXMgZW4gaW50ZXJ2YWxvcyAKICAgIyAgICAgICAgICAgZGUgMTAgYcOxb3MgKGRhIGNsaWMgc29icmUgRiBvIE0pIikgJT4lCiAgIyBoY19jcmVkaXRzKAogICMgIGVuYWJsZWQgPSBUUlVFLCB0ZXh0ID0gIlNvdXJjZTogU1NTIiwKICAjICBzdHlsZSA9IGxpc3QoZm9udFNpemUgPSAiMTJweCIpKSU+JQogIGhjX3lBeGlzKHRpdGxlID0gbGlzdCh0ZXh0ID0gIk7Dum1lcm8gZGUgcGFydGljaXBhbnRlcyIpKSU+JQogIGhjX3hBeGlzKHRpdGxlPWxpc3QodGV4dD0iUG9zaWNpw7NuIGVjb27Ds21pY2EiKSwKICAgICAgICAgICBjYXRlZ29yaWVzID0gZ2V0X2xhYmVscyhkZiRwMTY5KSkgJT4lCiAgICBoY19leHBvcnRpbmcoZW5hYmxlZCA9IFRSVUUsCiAgICAgICAgICAgICAgIGZpbGVuYW1lID0gImRhdG9zIiwKICAgICAgICAgICAgICAgYnV0dG9ucyA9IGxpc3QoY29udGV4dEJ1dHRvbiA9IGxpc3QobWVudUl0ZW1zID0gbXlNZW51SXRlbXMpKSkKfQpncmFfcGVyX2Vjb19hY3QoZGF0YV9lbW92aTIwMTEpCgpgYGAKCmBgYHtyfQoKZGF0YV9lbW92aTIwMTE8LWRhdGFfZW1vdmkyMDExJT4lCiAgZmlsdGVyKCEocDEyNCAlaW4lIGMoOTgsOTkpKSAmICEocDE2OSAlaW4lIGMoOTgsOTkpKSklPiUKICBtdXRhdGUobW92ID0gaWZlbHNlKHAxNjk+cDEyNCwibWVqb3IiLAogICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHAxNjk8cDEyNCwicGVvciIsImlndWFsIikpKQpkYXRhX2Vtb3ZpMjAxMSRtb3Y8LXNldF9sYWJlbHMoCiAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9lbW92aTIwMTEkbW92LAogICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIm1lam9yIiA9ICJtZWpvciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGVvciIgPSAicGVvciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaWd1YWwiID0gImlndWFsIikpCmBgYAoKIyMgUGVyY2VwY2nDs24gY3VhbGl0YXRpdmEgdG90YWwgCgpgYGB7cn0KZGF0YV9lbW92aTIwMTEgJT4lCiAgY291bnQobW92KSU+JSAKICBtdXRhdGUoZnJlcSA9IHJvdW5kKDEwMCAqIG4vc3VtKG4pLCAwKSklPiUKICBoY2hhcnQoJ2NvbHVtbicsCiAgICAgICAgIGhjYWVzKCB5ID0gJ2ZyZXEnKSklPiUKICBoY19hZGRfdGhlbWUoaGNfdGhlbWVfZmZ4KCkpJT4lCiAgaGNfdGl0bGUoCiAgICB0ZXh0ID0gIlBlcmNlcGNpw7NuIGRlIG1vdmlsaWRhZCIKICApICU+JQogIGhjX3N1YnRpdGxlKHRleHQgPSAiIikgJT4lCiAgIyBoY19jcmVkaXRzKAogICMgIGVuYWJsZWQgPSBUUlVFLCB0ZXh0ID0gIlNvdXJjZTogU1NTIiwKICAjICBzdHlsZSA9IGxpc3QoZm9udFNpemUgPSAiMTJweCIpKSU+JQogIGhjX3lBeGlzKHRpdGxlID0gbGlzdCh0ZXh0ID0gIlBvcmNlbnRhamUiKSklPiUKICBoY194QXhpcyh0aXRsZT1saXN0KHRleHQ9IlRpcG8gZGUgcGVyY2VwY2nDs24iKSwKICAgICAgICAgICBjYXRlZ29yaWVzID0gZ2V0X2xhYmVscyhkYXRhX2Vtb3ZpMjAxMSRtb3YpKSAlPiUKICAgIGhjX2V4cG9ydGluZyhlbmFibGVkID0gVFJVRSwKICAgICAgICAgICAgICAgZmlsZW5hbWUgPSAiZGF0b3MiLAogICAgICAgICAgICAgICBidXR0b25zID0gbGlzdChjb250ZXh0QnV0dG9uID0gbGlzdChtZW51SXRlbXMgPSBteU1lbnVJdGVtcykpKQpgYGAKCiMjIFBlcmNlcGNpw7NuIHJlZ2lvbmFsCgoKYGBge3J9CmRhdGFfZW1vdmkyMDExPC0gZGF0YV9lbW92aTIwMTElPiUgbXV0YXRlKAogICAgICAgICAgICByZWdpb24gPSBpZmVsc2UoZW50aWRhZCAlaW4lIGMoIjAyIiwiMjYiLCIwOCIsIjA1IiwiMTkiLCIyOCIpLDEsCiAgICAgICAgICAgICAgICBpZmVsc2UoZW50aWRhZCAlaW4lIGMoIjEyIiwiMjAiLCIwNyIsIjMwIiwiMjciLCIwNCIsIjMxIiwiMjMiKSw1LAogICAgICAgICAgICAgICAgaWZlbHNlKGVudGlkYWQgJWluJSBjKCIwMyIsIjI1IiwiMTgiLCIxMCIsIjMyIiksMiwKICAgICAgICAgICAgICAgIGlmZWxzZShlbnRpZGFkICVpbiUgYygiMTMiLCIwMSIsIjA2IiwiMTYiLCIyNCIpLDMsNCkpKSkKICAgICAgICAgICkKYGBgCgoKYGBge3J9CgpkYXRhX2Vtb3ZpMjAxMSAlPiUKICBjb3VudChyZWdpb24sbW92KSU+JSAKICBncm91cF9ieShyZWdpb24pICU+JQogIG11dGF0ZShmcmVxID0gcm91bmQoMTAwICogbi9zdW0obiksIDApKSU+JQogIGhjaGFydCgnY29sdW1uJywKICAgICAgICAgaGNhZXMoIHkgPSAnZnJlcScsICBncm91cCA9IGFzX2xhYmVsKG1vdikpKSU+JQogIGhjX2FkZF90aGVtZShoY190aGVtZV9mZngoKSklPiUKICBoY190aXRsZSgKICAgIHRleHQgPSAiUGVyY2VwY2nDs24gZGUgbW92aWxpZGFkIGRlIGFjdWVyZG8gcmVnaW9uIgogICkgJT4lCiAgaGNfc3VidGl0bGUodGV4dCA9ICIiKSAlPiUKICAjIGhjX2NyZWRpdHMoCiAgIyAgZW5hYmxlZCA9IFRSVUUsIHRleHQgPSAiU291cmNlOiBTU1MiLAogICMgIHN0eWxlID0gbGlzdChmb250U2l6ZSA9ICIxMnB4IikpJT4lCiAgaGNfeUF4aXModGl0bGUgPSBsaXN0KHRleHQgPSAiUG9yY2VudGFqZSIpKSU+JQogIGhjX3hBeGlzKHRpdGxlPWxpc3QodGV4dD0iUmVnaW9uIiksCiAgICAgICAgICAgY2F0ZWdvcmllcyA9IGdldF9sYWJlbHMoZGF0YV9lbW92aTIwMTckcmVnaW9uKSkgJT4lCiAgICBoY19leHBvcnRpbmcoZW5hYmxlZCA9IFRSVUUsCiAgICAgICAgICAgICAgIGZpbGVuYW1lID0gImRhdG9zIiwKICAgICAgICAgICAgICAgYnV0dG9ucyA9IGxpc3QoY29udGV4dEJ1dHRvbiA9IGxpc3QobWVudUl0ZW1zID0gbXlNZW51SXRlbXMpKSkKYGBgCgojIEVTUlUtRU1PVkkgMjAwNgoKPGRpdiBpZCA9ICJqdXN0aWZpY2FyIj4KTGEgRVNSVSDigJMgRU1PVkkgMjAwNiBlcyB1bmEgZGUgbGFzIHByaW1lcmFzIGVuY3Vlc3RhcyBkZSBjb2JlcnR1cmEgbmFjaW9uYWwgZGlzZcOxYWRhIGNvbiBlbCBvYmpldGl2byBkZSBtZWRpciBsYSBtb3ZpbGlkYWQgc29jaWFsIGVuIE3DqXhpY28uIExhIGVuY3Vlc3RhIGVzIHVuIGNvcnRlIHRyYW5zdmVyc2FsIHF1ZSBpbmNsdXllIHByZWd1bnRhcyByZXRyb3NwZWN0aXZhcyBzb2JyZSBsYSBzaXR1YWNpw7NuIHNvY2lvZWNvbsOzbWljYSBkZSBsb3MgcGFkcmVzIGRlbCBlbnRyZXZpc3RhZG8gY29uIGVsIG9iamV0aXZvIGRlIG9ic2VydmFyIGxhIGluZmx1ZW5jaWEgcXVlIHRpZW5lbiBsb3MgcmVjdXJzb3MgZGUgbG9zIHBhZHJlcyBlbiBsYSBwb3NpY2nDs24gc29jaW9lY29uw7NtaWNhIGRlIHN1cyBoaWpvcy4KClBhcmEgZXN0ZSBsZXZhbnRhbWllbnRvIHNlIHJlYWxpemFyb24gNywyODggZW50cmV2aXN0YXMgZWZlY3RpdmFzIGNvbiBpbmZvcm1hY2nDs24gcmVwcmVzZW50YXRpdmEgYSBuaXZlbCBuYWNpb25hbCBkZSBob21icmVzLCBqZWZlcyBkZSBob2dhciwgZW50cmUgMjUgeSA2NCBhw7FvcyBkZSBlZGFkLgoKRW5jdWVzdGEgZGlyaWdpZGEgcG9yIEZsb3JlbmNpYSBUb3JjaGUgeSBmaW5hbmNpYWRhIHBvciBsYSBGdW5kYWNpw7NuIEVTUlUuCgo8L2Rpdj4KCgoK