Presentación
En el marco del cálculo del costo de menstruar en Argentina, llevado
a cabo desde la campaña #MenstruAcción y EcoFeminita, en el presente
documento de trabajo se encuentra la exploración, organización y
limpieza de los datos obtenidos mediante el #MenstruScrapper,
desarrollado por Nayla Portas de [LAS] de sistemas. El #MenstruScrapper
fue ejecutado el día 1 de Abril de 2026 sobre la página Precios Claros,
sumándose esta información a la que obtenemos todos los Marzos y
Septiembres desde 2019. En esta instancia, se obtuvieron, luego de
realizar una limpieza y preprocesamiento, 52348 observaciones de
tampones y toallitas.
- Respecto de los tampones: Se obtuvieron 11686 precios.
- Respecto de las toallitas: Se obtuvieron 40662 precios.
A su vez, se carga la estimación, por cada provincia, de personas que
menstrúan. Como está aclarado en la carpeta de fuentes, esto sale de las
proyecciones poblacionales del INDEC para 2026, teniendo en cuenta que
la menarca se estima en los 13 años y la menopausia en 49 años. Estos
datos se van a utilizar para ponderar el precio promedio de cada
provincia a la hora de agregar en un indicador nacional.
En nuestro
repositorio se encuentran aclaradas todas las fuentes adicionales a
las que se recurrió para realizar el cálculo y los archivos
correspondientes. En otro paso se encuentra el cálculo propiamente dicho
del costo anual de menstruar.
A continuación, calculamos el total a nivel nacional de personas que
menstrúan, sumando los datos de todas las provincias. Y, dividiendo los
datos de cada provincia por dicho total, obtenemos las proporciones que
nos van a servir para ponderar los promedios de precio según el peso de
cada una de las provincias. Como guardo estas modificaciones bajo el
mismo nombre, la información será pisada en la misma tabla
menstruan, de la que se vuelve a presentar una vista
previa.
menstruan <- menstruan %>%
mutate(total = sum(Menstruan),
pond = Menstruan/total) %>%
select(Provincia, pond)
head(menstruan)
Además, considerando que hay outliers (valores atípicos) en los
precios unitarios, a la hora de calcular los promedios de precios
provinciales se remueven “las colas” de la distribución, utilizando una
media alfa podada:
Total Nacional
Toallitas
Promedio del precio por unidad
Para calcular el precio promedio de cada provincia tomamos los datos,
los filtramos para quedarnos únicamente con las toallitas, agrupando las
observaciones según la variable Provincia. Con
summarise() podemos definir indicadores que agregan la
información para cada grupo, así que definimos el promedio provincial
como una media podada. Es en el parámetro trim que se
aclara la proporción de los datos que se podan. Finalmente, anexamos en
una nueva columna los ponderadores de cada provincia, así toda la
información necesaria para el cálculo del promedio nacional se encuentra
en la misma tabla.
toallitas <- datos %>%
filter(Categoría == "toallitas") %>%
group_by(Provincia) %>%
summarise(prom = mean(precio_unidad, trim = 0.025)) %>%
left_join(., menstruan, by = "Provincia")
head(toallitas)
Luego, el valor promedio para el total nacional se calcula como una
media ponderada. La función weighted.mean() nos permite
aclarar la variable a promediar, y la variable que funciona como
ponderador.
valor_toallitas <- weighted.mean(toallitas$prom, toallitas$pond)
Toallitas: El precio promedio por unidad es de $334.4
Gasto por año por persona
El gasto anual por persona se calcula teniendo en cuenta:
- ciclos por año: 13
- productos utilizados por ciclo: 22
(Ambos datos se encuentran aclarados en las Fuentes)
ciclos_por_anio <- 13
productos_por_ciclo <- 22
productos_por_anio <- ciclos_por_anio * productos_por_ciclo
gasto_por_anio_toallitas <- valor_toallitas * productos_por_anio
options(scipen=100, digits=4)
Toallitas: El gasto promedio por año por persona es
de $95638.91
Tampones
Se realiza un procedimiento semejante para el caso de los
tampones.
Promedio del precio por unidad
tampones <- datos %>%
filter(Categoría == "tampones") %>%
group_by(Provincia) %>%
summarise(prom = mean(precio_unidad, trim = 0.025)) %>%
left_join(., menstruan, by = "Provincia")
valor_tampones <- weighted.mean(tampones$prom, tampones$pond)
Tampones: El precio promedio por unidad es de $414
Gasto por año por persona
El gasto anual por persona se calcula teniendo en cuenta:
- ciclos por año: 13
- productos utilizados por ciclo: 22
gasto_por_anio_tampones <- valor_tampones * productos_por_anio
options(scipen=100, digits=4)
Tampones: El gasto promedio por año por persona es de
$118404.49
Aumentos
Como esta es la onceava vez que realizamos este ejercicio de
estimación semestral, podemos ver cómo evolucionaron los precios de
toallitas y tampones en el último año. También, con los datos del Índice
de Precios al Consumidor (IPC - INDEC), se puede realizar una
comparación entre la evolución de estos productos de gestión menstrual y
el nivel general de precios, el rubro alimentos y bebidas no
alcohólicas, y el de Salud. Ambas series se levantan desde archivos de
extensión .xlsx en las tablas serie_inflacion y
precios_pgm.
serie_inflacion <- read_excel("Fuentes/serie_inflacion.xlsx")
precios_pgm <- read_csv("Fuentes/serie_precios_pgm_viejo.csv")
A continuación, agrego los precios actuales de toallitas y tampones a
la serie histórica y la guardo.
precios_pgm <- precios_pgm %>%
add_row(
Mes = as.Date("2026-03-01"),
Toallitas = round(valor_toallitas, 2),
Tampones = round(valor_tampones, 2)
)
write_csv(precios_pgm, 'Fuentes/serie_precios_pgm_nuevo.csv')
head(serie_inflacion)
head(precios_pgm)
Asegurándonos de que los datos se encuentran ordenados por fecha,
podemos transformar ambas series para que se encuentren expresadas con
el mes de marzo 2019 = 100. De esta forma podremos comparar la evolución
de ambas. Esto lo hacemos modificando las series con las que contamos
dividiendo todos los valores por el primero de ellos (y multiplicando
por 100). La selección del primer elemento de la serie se realizó con la
función first().
base100 <- serie_inflacion %>%
mutate(`Nivel General` = `Nivel General`/first(`Nivel General`) * 100,
`Alimentos y bebidas no alcohólicas` = `Alimentos y bebidas no alcohólicas`/
first(`Alimentos y bebidas no alcohólicas`) * 100,
Salud = Salud/first(Salud) * 100)
head(base100)
pgm_100 <- precios_pgm %>%
mutate(Toallitas = Toallitas/first(Toallitas) * 100,
Tampones = Tampones/first(Tampones) * 100)
head(pgm_100)
Podemos anexar la evolución de los precios de los productos de
gestión menstrual a la serie de inflación, por más que esta última tenga
valores mensuales y nuestros datos se hayan recolectado cada seis meses,
utilizando Mes como variable de link. Luego reordenamos la
información para que todas las variables, excepto Mes, se
presenten en una variable Categoría (con valores “Nivel
General”, “Salud”, “Toallitas”, etc.), y los valores de cada serie se
agrupen en la variable Indice. No habrá datos en diversos
meses para toallitas y tampones, así que filtramos esas filas vacías, y
finalmente creamos la variable Grupo para identificar como
“IPC” a las categorías del índice de precios al consumidor, y como “PGM”
a los productos de gestión menstrual.
# Esto se puede correr "de a poco" para ver cómo cambian las cosas en cada paso
base100 <- base100 %>%
left_join(., pgm_100, by = "Mes") %>%
pivot_longer(-Mes, names_to = "Categoria", values_to = "Indice") %>%
filter(!is.na(Indice)) %>%
mutate(Grupo = case_when(Categoria %in% c("Nivel General", "Alimentos y bebidas no alcohólicas", "Salud") ~ "IPC",
Categoria %in% c("Toallitas", "Tampones") ~ "PGM"))
head(base100)
A fines de graficar esta información, por esta vez se prescinde de la
serie de “Alimentos y bedidas no alcohólicas” porque no agrega tanta
información en la comparabilidad, y sí ocupa espacio visual que puede
obstruir la comparación de las demás series.
base100bis <- base100 %>%
filter(Categoria != "Alimentos y bebidas no alcohólicas")
Para el gráfico puedo definir un vector de colores que sirva para
distinguir las series de IPC (en la gama de azules) y las de productos
de gestión menstrual (en la gama del rojo).
colorcitos <- c('royalblue4', 'royalblue',
'violetred', 'red')
Finalmente, definimos nuestro gráfico. Tomando la tabla
base100bis,
library(ggrepel)
ggplot(base100bis, aes(x = Mes, y = Indice, group = Categoria, color = Categoria)) +
geom_line(data = base100bis %>% filter(Grupo == "PGM"), size = 1, alpha = 1) +
geom_line(data = base100bis %>% filter(Grupo == "IPC"), alpha = 1, size = 1) +
geom_point(data = base100bis %>% filter(Grupo == "PGM"), size = 2) +
theme_minimal() +
theme(legend.position = "top",
text = element_text(size = 13)) +
scale_color_manual(values = colorcitos) +
expand_limits(x = as.POSIXct(c("2019-03-01", "2026-03-01"))) +
labs(title = "Inflación de Toallitas y Tampones vs. Salud y Nivel General del IPC-INDEC",
subtitle = "Marzo 2019 - Marzo 2026", #<------------------------------------------------- CAMBIAR
x = "",
y = "Indice de precios",
caption = "Fuente: #MenstruAcción y #EcoFemiData (EcoFeminita)") +
scale_x_datetime(breaks = seq(as.POSIXct('2019-03-01'), by='6 months', length = 15), #<------------------------ CAMBIAR
labels = c("03-2019", "09-2019", "03-2020", "09-2020", "03-2021", "09-2021", "03-2022", "09-2022", "03-2023", "09-2023", "03-2024", "09-2024", "03-2025", "09-2025", "03-2026")) #<------------- CAMBIAR

LS0tDQp0aXRsZTogJ0PDoWxjdWxvOiDCv0N1w6FudG8gY3Vlc3RhIG1lbnN0cnVhcj8nDQphdXRob3I6ICdFY29mZW1pbml0YSAvICNNZW5zdHJ1QWNjacOzbiAvIEVjb2ZlbWlkYXRhJw0Kc3VidGl0bGU6IERhdG9zIGRlIE1hcnpvIDIwMjYNCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICB0b2M6IG5vDQogICAgdG9jX2RlcHRoOiAnNScNCiAgICBkZl9wcmludDogcGFnZWQNCiAgaHRtbF9ub3RlYm9vazoNCiAgICB0b2M6IG5vDQogICAgdG9jX2Zsb2F0OiB5ZXMNCiAgICB0b2NfZGVwdGg6IDUNCi0tLQ0KDQo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KICBib2R5ew0KICBmb250LXNpemU6IDE0cHQ7DQp9DQo8L3N0eWxlPg0KDQohW10oaW1nL0xvZ29zIEVjb0ZlbWluaXRhLTAzLnBuZyl7d2lkdGg9MTMwcHh9ICFbXShpbWcvTUVOU1RSVUFDQ0lPTi5wbmcpe3dpZHRoPTExMHB4fSAhW10oaW1nL0Vjb2ZlbWlkYXRhLnBuZyl7d2lkdGg9MTAwcHh9DQpgYGB7ciBpbmNsdWRlPUZBTFNFfQ0KIyMgUHJlcGFyYW5kbyBlbCBlbnRvcm5vIGRlIHRyYWJham8NCg0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KHJlYWR4bCkNCmxpYnJhcnkoRFQpDQpsaWJyYXJ5KGx1YnJpZGF0ZSkNCg0KZGF0b3MgPC0gcmVhZFJEUygiRnVlbnRlcy9wcmVjaW9zLWdlc3Rpb24tbWVuc3RydWFsLTIwMjYtMDQtMDEtbGltcGlvLlJEUyIpDQoNCm1lbnN0cnVhbiA8LSByZWFkX2V4Y2VsKCJGdWVudGVzL3BvYmxhY2lvbmVzLnhscyIpICU+JSANCiAgc2VsZWN0KFByb3ZpbmNpYSwgTWVuc3RydWFuKSAjIFBhcmEgc2FjYXIgbGFzIGNvbHVtbmFzIGNvbiBjb21lbnRhcmlvcw0KDQptZW5zdHJ1YW4gJT4lIG11dGF0ZSh0b3RhbCA9IHN1bShNZW5zdHJ1YW4pKQ0KDQpjYW50c19jYXRlZ29yaWFzIDwtIGRhdG9zICU+JSBncm91cF9ieShDYXRlZ29yw61hKSAlPiUgc3VtbWFyaXNlKG49bigpKQ0KYGBgDQoNCiMjIFByZXNlbnRhY2nDs24NCg0KRW4gZWwgbWFyY28gZGVsIGPDoWxjdWxvIGRlbCBjb3N0byBkZSBtZW5zdHJ1YXIgZW4gQXJnZW50aW5hLCBsbGV2YWRvIGEgY2FibyBkZXNkZSBsYSBjYW1wYcOxYSAjTWVuc3RydUFjY2nDs24geSBFY29GZW1pbml0YSwgZW4gZWwgcHJlc2VudGUgZG9jdW1lbnRvIGRlIHRyYWJham8gc2UgZW5jdWVudHJhIGxhIGV4cGxvcmFjacOzbiwgb3JnYW5pemFjacOzbiB5IGxpbXBpZXphIGRlIGxvcyBkYXRvcyBvYnRlbmlkb3MgbWVkaWFudGUgZWwgWyNNZW5zdHJ1U2NyYXBwZXJdKGh0dHBzOi8vZ2l0aHViLmNvbS9sYXNkZXNpc3RlbWFzL21lbnN0cnVzY3JhcHBlciksIGRlc2Fycm9sbGFkbyBwb3IgTmF5bGEgUG9ydGFzIGRlIFtMQVNdIGRlIHNpc3RlbWFzLiBFbCAjTWVuc3RydVNjcmFwcGVyIGZ1ZSBlamVjdXRhZG8gZWwgZMOtYSAxIGRlIEFicmlsIGRlIDIwMjYgc29icmUgbGEgcMOhZ2luYSBQcmVjaW9zIENsYXJvcywgc3Vtw6FuZG9zZSBlc3RhIGluZm9ybWFjacOzbiBhIGxhIHF1ZSBvYnRlbmVtb3MgdG9kb3MgbG9zIE1hcnpvcyB5IFNlcHRpZW1icmVzIGRlc2RlIDIwMTkuIEVuIGVzdGEgaW5zdGFuY2lhLCBzZSBvYnR1dmllcm9uLCBsdWVnbyBkZSByZWFsaXphciB1bmEgbGltcGllemEgeSBwcmVwcm9jZXNhbWllbnRvLCBgciBucm93KGRhdG9zKWAgb2JzZXJ2YWNpb25lcyBkZSB0YW1wb25lcyB5IHRvYWxsaXRhcy4NCg0KKyBSZXNwZWN0byBkZSBsb3MgdGFtcG9uZXM6IFNlIG9idHV2aWVyb24gYHIgY2FudHNfY2F0ZWdvcmlhcyAlPiUgZmlsdGVyKENhdGVnb3LDrWEgPT0gInRhbXBvbmVzIikgJT4lIHB1bGwobilgIHByZWNpb3MuDQorIFJlc3BlY3RvIGRlIGxhcyB0b2FsbGl0YXM6IFNlIG9idHV2aWVyb24gYHIgY2FudHNfY2F0ZWdvcmlhcyAlPiUgZmlsdGVyKENhdGVnb3LDrWEgPT0gInRvYWxsaXRhcyIpICU+JSBwdWxsKG4pYCBwcmVjaW9zLg0KDQpBIHN1IHZleiwgc2UgY2FyZ2EgbGEgZXN0aW1hY2nDs24sIHBvciBjYWRhIHByb3ZpbmNpYSwgZGUgcGVyc29uYXMgcXVlIG1lbnN0csO6YW4uIENvbW8gZXN0w6EgYWNsYXJhZG8gZW4gbGEgY2FycGV0YSBkZSBmdWVudGVzLCBlc3RvIHNhbGUgZGUgbGFzIHByb3llY2Npb25lcyBwb2JsYWNpb25hbGVzIGRlbCBJTkRFQyBwYXJhIGByIHllYXIobm93KCkpYCwgdGVuaWVuZG8gZW4gY3VlbnRhIHF1ZSBsYSBtZW5hcmNhIHNlIGVzdGltYSBlbiBsb3MgMTMgYcOxb3MgeSBsYSBtZW5vcGF1c2lhIGVuIDQ5IGHDsW9zLiBFc3RvcyBkYXRvcyBzZSB2YW4gYSB1dGlsaXphciBwYXJhIHBvbmRlcmFyIGVsIHByZWNpbyBwcm9tZWRpbyBkZSBjYWRhIHByb3ZpbmNpYSBhIGxhIGhvcmEgZGUgYWdyZWdhciBlbiB1biBpbmRpY2Fkb3IgbmFjaW9uYWwuIA0KDQpFbiBbbnVlc3RybyByZXBvc2l0b3Jpb10oaHR0cHM6Ly9naXRodWIuY29tL0Vjb2ZlbWluaXRhL0Vjb0ZlbWlEYXRhL3RyZWUvbWFzdGVyL01lbnN0cnVBY2Npb24vY3VhbnRvX2N1ZXN0YV9tZW5zdHJ1YXIpIHNlIGVuY3VlbnRyYW4gYWNsYXJhZGFzIHRvZGFzIGxhcyBmdWVudGVzIGFkaWNpb25hbGVzIGEgbGFzIHF1ZSBzZSByZWN1cnJpw7MgcGFyYSByZWFsaXphciBlbCBjw6FsY3VsbyB5IGxvcyBhcmNoaXZvcyBjb3JyZXNwb25kaWVudGVzLiBFbiBvdHJvIHBhc28gc2UgZW5jdWVudHJhIGVsIGPDoWxjdWxvIHByb3BpYW1lbnRlIGRpY2hvIGRlbCBjb3N0byBhbnVhbCBkZSBtZW5zdHJ1YXIuIA0KDQpBIGNvbnRpbnVhY2nDs24sIGNhbGN1bGFtb3MgZWwgdG90YWwgYSBuaXZlbCBuYWNpb25hbCBkZSBwZXJzb25hcyBxdWUgbWVuc3Ryw7phbiwgc3VtYW5kbyBsb3MgZGF0b3MgZGUgdG9kYXMgbGFzIHByb3ZpbmNpYXMuIFksIGRpdmlkaWVuZG8gbG9zIGRhdG9zIGRlIGNhZGEgcHJvdmluY2lhIHBvciBkaWNobyB0b3RhbCwgb2J0ZW5lbW9zIGxhcyBwcm9wb3JjaW9uZXMgcXVlIG5vcyB2YW4gYSBzZXJ2aXIgcGFyYSBwb25kZXJhciBsb3MgcHJvbWVkaW9zIGRlIHByZWNpbyBzZWfDum4gZWwgcGVzbyBkZSBjYWRhIHVuYSBkZSBsYXMgcHJvdmluY2lhcy4gQ29tbyBndWFyZG8gZXN0YXMgbW9kaWZpY2FjaW9uZXMgYmFqbyBlbCBtaXNtbyBub21icmUsIGxhIGluZm9ybWFjacOzbiBzZXLDoSBwaXNhZGEgZW4gbGEgbWlzbWEgdGFibGEgYG1lbnN0cnVhbmAsIGRlIGxhIHF1ZSBzZSB2dWVsdmUgYSBwcmVzZW50YXIgdW5hIHZpc3RhIHByZXZpYS4NCg0KYGBge3IgZWNobz1UUlVFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KbWVuc3RydWFuIDwtIG1lbnN0cnVhbiAlPiUgDQogIG11dGF0ZSh0b3RhbCA9IHN1bShNZW5zdHJ1YW4pLA0KICAgICAgICAgcG9uZCA9IE1lbnN0cnVhbi90b3RhbCkgJT4lIA0KICBzZWxlY3QoUHJvdmluY2lhLCBwb25kKQ0KDQpoZWFkKG1lbnN0cnVhbikNCmBgYA0KDQpBZGVtw6FzLCBjb25zaWRlcmFuZG8gcXVlIGhheSBvdXRsaWVycyAodmFsb3JlcyBhdMOtcGljb3MpIGVuIGxvcyBwcmVjaW9zIHVuaXRhcmlvcywgYSBsYSBob3JhIGRlIGNhbGN1bGFyIGxvcyBwcm9tZWRpb3MgZGUgcHJlY2lvcyBwcm92aW5jaWFsZXMgc2UgcmVtdWV2ZW4gImxhcyBjb2xhcyIgZGUgbGEgZGlzdHJpYnVjacOzbiwgdXRpbGl6YW5kbyB1bmEgbWVkaWEgYWxmYSBwb2RhZGE6ICAgICANCg0KLSBhbGZhID0gMi41JQ0KDQojIyBDw6FsY3VsbyB5IFJlc3VsdGFkb3MNCg0KQSBjb250aW51YWNpw7NuIHlhIHByb2NlZGVtb3MgYSBjYWxjdWxhciBsb3MgcHJlY2lvcyBwcm9tZWRpbyBkZSB0b2FsbGl0YXMgeSB0YW1wb25lcy4gUGFyYSBlbCBjYXNvIGRlbCB0b3RhbCBuYWNpb25hbCwgcHJpbWVybyBoYWJyw6EgcXVlIGNhbGN1bGFyIGxvcyBwcmVjaW9zIHByb21lZGlvIChwb3IgdW5pZGFkKSBkZSBjYWRhIHByb3ZpbmNpYSwgcGFyYSBsdWVnbyBhZ3JlZ2FybG9zIGVuIHVuIHByb21lZGlvIGdlbmVyYWwuIFVuYSB2ZXogcXVlIHRlbmVtb3MgcHJlY2lvcyByZXByZXNlbnRhdGl2b3MgZGUgdG9hbGxpdGFzIHkgdGFtcG9uZXMsIHBvZHJlbW9zIGVzdGltYXIgdW4gY29zdG8gYW51YWwgcG9yIHBlcnNvbmEgZGUgYWN1ZXJkbyBhIGxhcyBlc3RpbWFjaW9uZXMgZGUgY3XDoW50b3MgY2ljbG9zIHBvciBhw7FvIHByZXNlbnRhbiBsYXMgcGVyc29uYXMgcXVlIG1lbnN0csO6YW4sIHkgY3XDoW50b3MgcHJvZHVjdG9zIHV0aWxpemFuIHBvciBjaWNsby4NCg0KIyMgVG90YWwgTmFjaW9uYWwNCg0KIyMjIFRvYWxsaXRhcw0KDQojIyMgUHJvbWVkaW8gZGVsIHByZWNpbyBwb3IgdW5pZGFkDQoNClBhcmEgY2FsY3VsYXIgZWwgcHJlY2lvIHByb21lZGlvIGRlIGNhZGEgcHJvdmluY2lhIHRvbWFtb3MgbG9zIGRhdG9zLCBsb3MgZmlsdHJhbW9zIHBhcmEgcXVlZGFybm9zIMO6bmljYW1lbnRlIGNvbiBsYXMgdG9hbGxpdGFzLCBhZ3J1cGFuZG8gbGFzIG9ic2VydmFjaW9uZXMgc2Vnw7puIGxhIHZhcmlhYmxlIGBQcm92aW5jaWFgLiBDb24gYHN1bW1hcmlzZSgpYCBwb2RlbW9zIGRlZmluaXIgaW5kaWNhZG9yZXMgcXVlIGFncmVnYW4gbGEgaW5mb3JtYWNpw7NuIHBhcmEgY2FkYSBncnVwbywgYXPDrSBxdWUgZGVmaW5pbW9zIGVsIHByb21lZGlvIHByb3ZpbmNpYWwgY29tbyB1bmEgbWVkaWEgcG9kYWRhLiBFcyBlbiBlbCBwYXLDoW1ldHJvIGB0cmltYCBxdWUgc2UgYWNsYXJhIGxhIHByb3BvcmNpw7NuIGRlIGxvcyBkYXRvcyBxdWUgc2UgcG9kYW4uIEZpbmFsbWVudGUsIGFuZXhhbW9zIGVuIHVuYSBudWV2YSBjb2x1bW5hIGxvcyBwb25kZXJhZG9yZXMgZGUgY2FkYSBwcm92aW5jaWEsIGFzw60gdG9kYSBsYSBpbmZvcm1hY2nDs24gbmVjZXNhcmlhIHBhcmEgZWwgY8OhbGN1bG8gZGVsIHByb21lZGlvIG5hY2lvbmFsIHNlIGVuY3VlbnRyYSBlbiBsYSBtaXNtYSB0YWJsYS4NCg0KYGBge3IgZWNobz1UUlVFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KdG9hbGxpdGFzIDwtIGRhdG9zICU+JSANCiAgZmlsdGVyKENhdGVnb3LDrWEgPT0gInRvYWxsaXRhcyIpICU+JQ0KICBncm91cF9ieShQcm92aW5jaWEpICU+JSANCiAgc3VtbWFyaXNlKHByb20gPSBtZWFuKHByZWNpb191bmlkYWQsIHRyaW0gPSAwLjAyNSkpICU+JSANCiAgbGVmdF9qb2luKC4sIG1lbnN0cnVhbiwgYnkgPSAiUHJvdmluY2lhIikNCg0KaGVhZCh0b2FsbGl0YXMpDQpgYGANCg0KTHVlZ28sIGVsIHZhbG9yIHByb21lZGlvIHBhcmEgZWwgdG90YWwgbmFjaW9uYWwgc2UgY2FsY3VsYSBjb21vIHVuYSBtZWRpYSBwb25kZXJhZGEuIExhIGZ1bmNpw7NuIGB3ZWlnaHRlZC5tZWFuKClgIG5vcyBwZXJtaXRlIGFjbGFyYXIgbGEgdmFyaWFibGUgYSBwcm9tZWRpYXIsIHkgbGEgdmFyaWFibGUgcXVlIGZ1bmNpb25hIGNvbW8gcG9uZGVyYWRvci4NCg0KYGBge3IgZWNobz1UUlVFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KdmFsb3JfdG9hbGxpdGFzIDwtIHdlaWdodGVkLm1lYW4odG9hbGxpdGFzJHByb20sIHRvYWxsaXRhcyRwb25kKQ0KYGBgDQoNCjxmb250IHNpemU9IjYiPiBUb2FsbGl0YXM6IEVsIHByZWNpbyBwcm9tZWRpbyBwb3IgdW5pZGFkIGVzIGRlICRgciByb3VuZCh2YWxvcl90b2FsbGl0YXMsIDIpYCA8L2ZvbnQ+IA0KDQojIyMgR2FzdG8gcG9yIGHDsW8gcG9yIHBlcnNvbmENCg0KRWwgZ2FzdG8gYW51YWwgcG9yIHBlcnNvbmEgc2UgY2FsY3VsYSB0ZW5pZW5kbyBlbiBjdWVudGE6DQoNCi0gY2ljbG9zIHBvciBhw7FvOiAxMw0KLSBwcm9kdWN0b3MgdXRpbGl6YWRvcyBwb3IgY2ljbG86IDIyDQoNCihBbWJvcyBkYXRvcyBzZSBlbmN1ZW50cmFuIGFjbGFyYWRvcyBlbiBsYXMgYEZ1ZW50ZXNgKQ0KDQpgYGB7ciBlY2hvPVRSVUUsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpjaWNsb3NfcG9yX2FuaW8gPC0gMTMNCnByb2R1Y3Rvc19wb3JfY2ljbG8gPC0gMjINCnByb2R1Y3Rvc19wb3JfYW5pbyA8LSBjaWNsb3NfcG9yX2FuaW8gKiBwcm9kdWN0b3NfcG9yX2NpY2xvDQoNCmdhc3RvX3Bvcl9hbmlvX3RvYWxsaXRhcyA8LSB2YWxvcl90b2FsbGl0YXMgKiBwcm9kdWN0b3NfcG9yX2FuaW8NCg0Kb3B0aW9ucyhzY2lwZW49MTAwLCBkaWdpdHM9NCkNCmBgYA0KDQoNCjxmb250IHNpemU9IjYiPiBUb2FsbGl0YXM6IEVsIGdhc3RvIHByb21lZGlvIHBvciBhw7FvIHBvciBwZXJzb25hIGVzIGRlICRgciByb3VuZChnYXN0b19wb3JfYW5pb190b2FsbGl0YXMsIDIpYCA8L2ZvbnQ+DQoNCiMjIyBUYW1wb25lcw0KDQpTZSByZWFsaXphIHVuIHByb2NlZGltaWVudG8gc2VtZWphbnRlIHBhcmEgZWwgY2FzbyBkZSBsb3MgdGFtcG9uZXMuDQoNCiMjIyBQcm9tZWRpbyBkZWwgcHJlY2lvIHBvciB1bmlkYWQNCg0KYGBge3IgZWNobz1UUlVFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KdGFtcG9uZXMgPC0gZGF0b3MgJT4lIA0KICBmaWx0ZXIoQ2F0ZWdvcsOtYSA9PSAidGFtcG9uZXMiKSAlPiUNCiAgZ3JvdXBfYnkoUHJvdmluY2lhKSAlPiUgDQogIHN1bW1hcmlzZShwcm9tID0gbWVhbihwcmVjaW9fdW5pZGFkLCB0cmltID0gMC4wMjUpKSAlPiUgDQogIGxlZnRfam9pbiguLCBtZW5zdHJ1YW4sIGJ5ID0gIlByb3ZpbmNpYSIpDQoNCnZhbG9yX3RhbXBvbmVzIDwtIHdlaWdodGVkLm1lYW4odGFtcG9uZXMkcHJvbSwgdGFtcG9uZXMkcG9uZCkNCmBgYA0KDQo8Zm9udCBzaXplPSI2Ij4gVGFtcG9uZXM6IEVsIHByZWNpbyBwcm9tZWRpbyBwb3IgdW5pZGFkIGVzIGRlICRgciByb3VuZCh2YWxvcl90YW1wb25lcywgMilgIDwvZm9udD4gDQoNCiMjIyBHYXN0byBwb3IgYcOxbyBwb3IgcGVyc29uYQ0KDQpFbCBnYXN0byBhbnVhbCBwb3IgcGVyc29uYSBzZSBjYWxjdWxhIHRlbmllbmRvIGVuIGN1ZW50YToNCg0KLSBjaWNsb3MgcG9yIGHDsW86IDEzDQotIHByb2R1Y3RvcyB1dGlsaXphZG9zIHBvciBjaWNsbzogMjINCg0KYGBge3IgZWNobz1UUlVFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KZ2FzdG9fcG9yX2FuaW9fdGFtcG9uZXMgPC0gdmFsb3JfdGFtcG9uZXMgKiBwcm9kdWN0b3NfcG9yX2FuaW8NCg0Kb3B0aW9ucyhzY2lwZW49MTAwLCBkaWdpdHM9NCkNCmBgYA0KDQo8Zm9udCBzaXplPSI2Ij4gVGFtcG9uZXM6IEVsIGdhc3RvIHByb21lZGlvIHBvciBhw7FvIHBvciBwZXJzb25hIGVzIGRlICRgciByb3VuZChnYXN0b19wb3JfYW5pb190YW1wb25lcywgMilgIDwvZm9udD4gDQoNCiMjIFBvciBwcm92aW5jaWENCg0KUGFyYSBvYnRlbmVyIGxvcyBkYXRvcyBkZSBjYWRhIHByb3ZpbmNpYSBlbCBwcm9jZWRpbWllbnRvIGVzIGHDum4gbcOhcyBzZW5jaWxsby4gRW4gbGEgdmFyaWFibGUgYGdhc3RvX3Bvcl9hbmlvYCwgY2FkYSBwcmVjaW8gcHJvbWVkaW8gc2UgbXVsdGlwbGljYSBwb3IgbGEgY2FudGlkYWQgZGUgcHJvZHVjdG9zIHF1ZSBzZSB1dGlsaXphbiBhbnVhbG1lbnRlLiBQb3IgdW5hIGN1ZXN0acOzbiBkZSBleHBvc2ljacOzbiwgc2UgcXVpdGFuIGRlIGxhIHRhYmxhIGxhcyBjb2x1bW5hcyBjb24gYXF1ZWxsb3MgcHJlY2lvcyBwcm9tZWRpb3MgcG9yIHVuaWRhZCwgeSBsb3MgcG9uZGVyYWRvcmVzIHByb3ZpbmNpYWxlcy4NCg0KIyMjIFRvYWxsaXRhcw0KDQojIyMgR2FzdG8gcG9yIGHDsW8gcG9yIHBlcnNvbmENCg0KYGBge3IgZWNobz1UUlVFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KdG9hbGxpdGFzIDwtIHRvYWxsaXRhcyAlPiUgDQogIG11dGF0ZShnYXN0b19wb3JfYW5pbyA9IHJvdW5kKHByb20gKiBwcm9kdWN0b3NfcG9yX2FuaW8sIDIpKSAlPiUgDQogIHNlbGVjdCgtcHJvbSwgLXBvbmQpICU+JSANCiAgYXJyYW5nZShnYXN0b19wb3JfYW5pbykNCg0KdG9hbGxpdGFzICU+JQ0KICAgIGRhdGF0YWJsZSgNCiAgICBleHRlbnNpb25zID0gJ0J1dHRvbnMnLCANCiAgICBvcHRpb25zID0gbGlzdChkb20gPSAnQmZydGlwJywgDQogICAgICAgICAgICAgICAgICAgYnV0dG9ucyA9IGMoJ2NvcHknLCAnY3N2JywgJ2V4Y2VsJywgJ3BkZicsICdwcmludCcpKSkNCmBgYA0KDQojIyMgVGFtcG9uZXMNCg0KIyMjIEdhc3RvIHBvciBhw7FvIHBvciBwZXJzb25hDQoNCmBgYHtyIGVjaG89VFJVRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCnRhbXBvbmVzIDwtIHRhbXBvbmVzICU+JSANCiAgbXV0YXRlKGdhc3RvX3Bvcl9hbmlvID0gcm91bmQocHJvbSAqIHByb2R1Y3Rvc19wb3JfYW5pbywgMikpICU+JSANCiAgc2VsZWN0KC1wcm9tLCAtcG9uZCkgJT4lIA0KICBhcnJhbmdlKGdhc3RvX3Bvcl9hbmlvKQ0KDQp0YW1wb25lcyAlPiUgDQogICAgZGF0YXRhYmxlKA0KICAgIGV4dGVuc2lvbnMgPSAnQnV0dG9ucycsIA0KICAgIG9wdGlvbnMgPSBsaXN0KGRvbSA9ICdCZnJ0aXAnLCANCiAgICAgICAgICAgICAgICAgICBidXR0b25zID0gYygnY29weScsICdjc3YnLCAnZXhjZWwnLCAncGRmJywgJ3ByaW50JykpKQ0KYGBgDQoNCiMjIEF1bWVudG9zDQoNCkNvbW8gZXN0YSBlcyBsYSBvbmNlYXZhIHZleiBxdWUgcmVhbGl6YW1vcyBlc3RlIGVqZXJjaWNpbyBkZSBlc3RpbWFjacOzbiBzZW1lc3RyYWwsIHBvZGVtb3MgdmVyIGPDs21vIGV2b2x1Y2lvbmFyb24gbG9zIHByZWNpb3MgZGUgdG9hbGxpdGFzIHkgdGFtcG9uZXMgZW4gZWwgw7psdGltbyBhw7FvLiBUYW1iacOpbiwgY29uIGxvcyBkYXRvcyBkZWwgw41uZGljZSBkZSBQcmVjaW9zIGFsIENvbnN1bWlkb3IgKElQQyAtIElOREVDKSwgc2UgcHVlZGUgcmVhbGl6YXIgdW5hIGNvbXBhcmFjacOzbiBlbnRyZSBsYSBldm9sdWNpw7NuIGRlIGVzdG9zIHByb2R1Y3RvcyBkZSBnZXN0acOzbiBtZW5zdHJ1YWwgeSBlbCBuaXZlbCBnZW5lcmFsIGRlIHByZWNpb3MsIGVsIHJ1YnJvIGFsaW1lbnRvcyB5IGJlYmlkYXMgbm8gYWxjb2jDs2xpY2FzLCB5IGVsIGRlIFNhbHVkLiBBbWJhcyBzZXJpZXMgc2UgbGV2YW50YW4gZGVzZGUgYXJjaGl2b3MgZGUgZXh0ZW5zacOzbiAueGxzeCBlbiBsYXMgdGFibGFzIGBzZXJpZV9pbmZsYWNpb25gIHkgYHByZWNpb3NfcGdtYC4NCg0KYGBge3IgZWNobz1UUlVFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0Kc2VyaWVfaW5mbGFjaW9uIDwtIHJlYWRfZXhjZWwoIkZ1ZW50ZXMvc2VyaWVfaW5mbGFjaW9uLnhsc3giKQ0KcHJlY2lvc19wZ20gPC0gcmVhZF9jc3YoIkZ1ZW50ZXMvc2VyaWVfcHJlY2lvc19wZ21fdmllam8uY3N2IikNCmBgYA0KDQpBIGNvbnRpbnVhY2nDs24sIGFncmVnbyBsb3MgcHJlY2lvcyBhY3R1YWxlcyBkZSB0b2FsbGl0YXMgeSB0YW1wb25lcyBhIGxhIHNlcmllIGhpc3TDs3JpY2EgeSBsYSBndWFyZG8uIA0KDQpgYGB7cn0NCg0KcHJlY2lvc19wZ20gPC0gcHJlY2lvc19wZ20gJT4lIA0KICBhZGRfcm93KA0KICAgIE1lcyA9IGFzLkRhdGUoIjIwMjYtMDMtMDEiKSwNCiAgICBUb2FsbGl0YXMgPSByb3VuZCh2YWxvcl90b2FsbGl0YXMsIDIpLA0KICAgIFRhbXBvbmVzID0gcm91bmQodmFsb3JfdGFtcG9uZXMsIDIpDQogICkNCg0KDQp3cml0ZV9jc3YocHJlY2lvc19wZ20sICdGdWVudGVzL3NlcmllX3ByZWNpb3NfcGdtX251ZXZvLmNzdicpDQoNCmBgYA0KDQoNCmBgYHtyIGVjaG89VFJVRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmhlYWQoc2VyaWVfaW5mbGFjaW9uKQ0KYGBgDQoNCmBgYHtyIGVjaG89VFJVRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmhlYWQocHJlY2lvc19wZ20pDQpgYGANCg0KQXNlZ3Vyw6FuZG9ub3MgZGUgcXVlIGxvcyBkYXRvcyBzZSBlbmN1ZW50cmFuIG9yZGVuYWRvcyBwb3IgZmVjaGEsIHBvZGVtb3MgdHJhbnNmb3JtYXIgYW1iYXMgc2VyaWVzIHBhcmEgcXVlIHNlIGVuY3VlbnRyZW4gZXhwcmVzYWRhcyBjb24gZWwgbWVzIGRlIG1hcnpvIDIwMTkgPSAxMDAuIERlIGVzdGEgZm9ybWEgcG9kcmVtb3MgY29tcGFyYXIgbGEgZXZvbHVjacOzbiBkZSBhbWJhcy4gRXN0byBsbyBoYWNlbW9zIG1vZGlmaWNhbmRvIGxhcyBzZXJpZXMgY29uIGxhcyBxdWUgY29udGFtb3MgZGl2aWRpZW5kbyB0b2RvcyBsb3MgdmFsb3JlcyBwb3IgZWwgcHJpbWVybyBkZSBlbGxvcyAoeSBtdWx0aXBsaWNhbmRvIHBvciAxMDApLiBMYSBzZWxlY2Npw7NuIGRlbCBwcmltZXIgZWxlbWVudG8gZGUgbGEgc2VyaWUgc2UgcmVhbGl6w7MgY29uIGxhIGZ1bmNpw7NuIGBmaXJzdCgpYC4NCg0KYGBge3IgZWNobz1UUlVFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KYmFzZTEwMCA8LSBzZXJpZV9pbmZsYWNpb24gJT4lIA0KICBtdXRhdGUoYE5pdmVsIEdlbmVyYWxgID0gYE5pdmVsIEdlbmVyYWxgL2ZpcnN0KGBOaXZlbCBHZW5lcmFsYCkgKiAxMDAsDQogICAgICAgICBgQWxpbWVudG9zIHkgYmViaWRhcyBubyBhbGNvaMOzbGljYXNgID0gYEFsaW1lbnRvcyB5IGJlYmlkYXMgbm8gYWxjb2jDs2xpY2FzYC8NCiAgICAgICAgICAgZmlyc3QoYEFsaW1lbnRvcyB5IGJlYmlkYXMgbm8gYWxjb2jDs2xpY2FzYCkgKiAxMDAsDQogICAgICAgICBTYWx1ZCA9IFNhbHVkL2ZpcnN0KFNhbHVkKSAqIDEwMCkNCg0KaGVhZChiYXNlMTAwKQ0KYGBgDQoNCmBgYHtyIGVjaG89VFJVRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCnBnbV8xMDAgPC0gcHJlY2lvc19wZ20gJT4lIA0KICBtdXRhdGUoVG9hbGxpdGFzID0gVG9hbGxpdGFzL2ZpcnN0KFRvYWxsaXRhcykgKiAxMDAsDQogICAgICAgICBUYW1wb25lcyA9IFRhbXBvbmVzL2ZpcnN0KFRhbXBvbmVzKSAqIDEwMCkNCg0KaGVhZChwZ21fMTAwKQ0KYGBgDQoNClBvZGVtb3MgYW5leGFyIGxhIGV2b2x1Y2nDs24gZGUgbG9zIHByZWNpb3MgZGUgbG9zIHByb2R1Y3RvcyBkZSBnZXN0acOzbiBtZW5zdHJ1YWwgYSBsYSBzZXJpZSBkZSBpbmZsYWNpw7NuLCBwb3IgbcOhcyBxdWUgZXN0YSDDumx0aW1hIHRlbmdhIHZhbG9yZXMgbWVuc3VhbGVzIHkgbnVlc3Ryb3MgZGF0b3Mgc2UgaGF5YW4gcmVjb2xlY3RhZG8gY2FkYSBzZWlzIG1lc2VzLCB1dGlsaXphbmRvIGBNZXNgIGNvbW8gdmFyaWFibGUgZGUgbGluay4gTHVlZ28gcmVvcmRlbmFtb3MgbGEgaW5mb3JtYWNpw7NuIHBhcmEgcXVlIHRvZGFzIGxhcyB2YXJpYWJsZXMsIGV4Y2VwdG8gYE1lc2AsIHNlIHByZXNlbnRlbiBlbiB1bmEgdmFyaWFibGUgYENhdGVnb3LDrWFgIChjb24gdmFsb3JlcyAiTml2ZWwgR2VuZXJhbCIsICJTYWx1ZCIsICJUb2FsbGl0YXMiLCBldGMuKSwgeSBsb3MgdmFsb3JlcyBkZSBjYWRhIHNlcmllIHNlIGFncnVwZW4gZW4gbGEgdmFyaWFibGUgYEluZGljZWAuIE5vIGhhYnLDoSBkYXRvcyBlbiBkaXZlcnNvcyBtZXNlcyBwYXJhIHRvYWxsaXRhcyB5IHRhbXBvbmVzLCBhc8OtIHF1ZSBmaWx0cmFtb3MgZXNhcyBmaWxhcyB2YWPDrWFzLCB5IGZpbmFsbWVudGUgY3JlYW1vcyBsYSB2YXJpYWJsZSBgR3J1cG9gIHBhcmEgaWRlbnRpZmljYXIgY29tbyAiSVBDIiBhIGxhcyBjYXRlZ29yw61hcyBkZWwgw61uZGljZSBkZSBwcmVjaW9zIGFsIGNvbnN1bWlkb3IsIHkgY29tbyAiUEdNIiBhIGxvcyBwcm9kdWN0b3MgZGUgZ2VzdGnDs24gbWVuc3RydWFsLg0KDQpgYGB7ciBlY2hvPVRSVUUsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojIEVzdG8gc2UgcHVlZGUgY29ycmVyICJkZSBhIHBvY28iIHBhcmEgdmVyIGPDs21vIGNhbWJpYW4gbGFzIGNvc2FzIGVuIGNhZGEgcGFzbw0KYmFzZTEwMCA8LSBiYXNlMTAwICU+JSANCiAgbGVmdF9qb2luKC4sIHBnbV8xMDAsIGJ5ID0gIk1lcyIpICU+JSANCiAgcGl2b3RfbG9uZ2VyKC1NZXMsIG5hbWVzX3RvID0gIkNhdGVnb3JpYSIsIHZhbHVlc190byA9ICJJbmRpY2UiKSAlPiUgDQogIGZpbHRlcighaXMubmEoSW5kaWNlKSkgJT4lIA0KICBtdXRhdGUoR3J1cG8gPSBjYXNlX3doZW4oQ2F0ZWdvcmlhICVpbiUgYygiTml2ZWwgR2VuZXJhbCIsICJBbGltZW50b3MgeSBiZWJpZGFzIG5vIGFsY29ow7NsaWNhcyIsICJTYWx1ZCIpIH4gIklQQyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBDYXRlZ29yaWEgJWluJSBjKCJUb2FsbGl0YXMiLCAiVGFtcG9uZXMiKSB+ICJQR00iKSkNCg0KaGVhZChiYXNlMTAwKQ0KYGBgDQoNCkEgZmluZXMgZGUgZ3JhZmljYXIgZXN0YSBpbmZvcm1hY2nDs24sIHBvciBlc3RhIHZleiBzZSBwcmVzY2luZGUgZGUgbGEgc2VyaWUgZGUgIkFsaW1lbnRvcyB5IGJlZGlkYXMgbm8gYWxjb2jDs2xpY2FzIiBwb3JxdWUgbm8gYWdyZWdhIHRhbnRhIGluZm9ybWFjacOzbiBlbiBsYSBjb21wYXJhYmlsaWRhZCwgeSBzw60gb2N1cGEgZXNwYWNpbyB2aXN1YWwgcXVlIHB1ZWRlIG9ic3RydWlyIGxhIGNvbXBhcmFjacOzbiBkZSBsYXMgZGVtw6FzIHNlcmllcy4NCg0KYGBge3IgZWNobz1UUlVFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KYmFzZTEwMGJpcyA8LSBiYXNlMTAwICU+JSANCiAgZmlsdGVyKENhdGVnb3JpYSAhPSAiQWxpbWVudG9zIHkgYmViaWRhcyBubyBhbGNvaMOzbGljYXMiKQ0KYGBgDQoNClBhcmEgZWwgZ3LDoWZpY28gcHVlZG8gZGVmaW5pciB1biB2ZWN0b3IgZGUgY29sb3JlcyBxdWUgc2lydmEgcGFyYSBkaXN0aW5ndWlyIGxhcyBzZXJpZXMgZGUgSVBDIChlbiBsYSBnYW1hIGRlIGF6dWxlcykgeSBsYXMgZGUgcHJvZHVjdG9zIGRlIGdlc3Rpw7NuIG1lbnN0cnVhbCAoZW4gbGEgZ2FtYSBkZWwgcm9qbykuDQoNCmBgYHtyIGVjaG89VFJVRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmNvbG9yY2l0b3MgPC0gYygncm95YWxibHVlNCcsICdyb3lhbGJsdWUnLCANCiAgICAgICAgICAgICAgICAndmlvbGV0cmVkJywgJ3JlZCcpDQpgYGANCg0KRmluYWxtZW50ZSwgZGVmaW5pbW9zIG51ZXN0cm8gZ3LDoWZpY28uIFRvbWFuZG8gbGEgdGFibGEgYGJhc2UxMDBiaXNgLCANCg0KYGBge3IgZWNobz1UUlVFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KbGlicmFyeShnZ3JlcGVsKQ0KDQpnZ3Bsb3QoYmFzZTEwMGJpcywgYWVzKHggPSBNZXMsIHkgPSBJbmRpY2UsIGdyb3VwID0gQ2F0ZWdvcmlhLCBjb2xvciA9IENhdGVnb3JpYSkpICsNCiAgZ2VvbV9saW5lKGRhdGEgPSBiYXNlMTAwYmlzICU+JSBmaWx0ZXIoR3J1cG8gPT0gIlBHTSIpLCBzaXplID0gMSwgYWxwaGEgPSAxKSArDQogIGdlb21fbGluZShkYXRhID0gYmFzZTEwMGJpcyAlPiUgZmlsdGVyKEdydXBvID09ICJJUEMiKSwgYWxwaGEgPSAxLCBzaXplID0gMSkgKw0KICBnZW9tX3BvaW50KGRhdGEgPSBiYXNlMTAwYmlzICU+JSBmaWx0ZXIoR3J1cG8gPT0gIlBHTSIpLCBzaXplID0gMikgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIiwNCiAgICAgICAgdGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTMpKSArDQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjb2xvcmNpdG9zKSArDQogIGV4cGFuZF9saW1pdHMoeCA9IGFzLlBPU0lYY3QoYygiMjAxOS0wMy0wMSIsICIyMDI2LTAzLTAxIikpKSArIA0KICBsYWJzKHRpdGxlID0gIkluZmxhY2nDs24gZGUgVG9hbGxpdGFzIHkgVGFtcG9uZXMgdnMuIFNhbHVkIHkgTml2ZWwgR2VuZXJhbCBkZWwgSVBDLUlOREVDIiwNCiAgICAgICBzdWJ0aXRsZSA9ICJNYXJ6byAyMDE5IC0gTWFyem8gMjAyNiIsICM8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDQU1CSUFSDQogICAgICAgeCA9ICIiLA0KICAgICAgIHkgPSAiSW5kaWNlIGRlIHByZWNpb3MiLA0KICAgICAgIGNhcHRpb24gPSAiRnVlbnRlOiAjTWVuc3RydUFjY2nDs24geSAjRWNvRmVtaURhdGEgKEVjb0ZlbWluaXRhKSIpICsNCiAgc2NhbGVfeF9kYXRldGltZShicmVha3MgPSBzZXEoYXMuUE9TSVhjdCgnMjAxOS0wMy0wMScpLCBieT0nNiBtb250aHMnLCBsZW5ndGggPSAxNSksICM8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENBTUJJQVINCiAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCIwMy0yMDE5IiwgIjA5LTIwMTkiLCAiMDMtMjAyMCIsICIwOS0yMDIwIiwgIjAzLTIwMjEiLCAiMDktMjAyMSIsICIwMy0yMDIyIiwgIjA5LTIwMjIiLCAiMDMtMjAyMyIsICIwOS0yMDIzIiwgIjAzLTIwMjQiLCAiMDktMjAyNCIsICIwMy0yMDI1IiwgIjA5LTIwMjUiLCAiMDMtMjAyNiIpKSAjPC0tLS0tLS0tLS0tLS0gQ0FNQklBUg0KYGBgDQoNCg==