Trabajo elaborado para la asignatura “Programación y manejo de datos en la era del Big Data” de la Universitat de València durante el curso 2020-2021. El repo del trabajo está aquí. La página web de la asignatura y los trabajos de mis compañeros pueden verse aquí.
2. DATOS
En este caso, los datos de este trabajo se han obtenido en exclusiva del excel generado automáticamente por la herramienta de Google que permite hacer encuestas (encuesta anteriormente mencionada, con su respectivo link). Cabe destacar que he tenido que modificar la primera fila del excel donde aparecía la pregunta entera, lo cual a la hora de trabajar con R podría haber sido complicado. A continuación, muestro una tabla en la que se ven todos los resultados de dicha encuesta, y con los cuales voy a trabajar el resto del trabajo.
excel <- read_excel("./Datos/RESPUESTAS_ENCUESTA_COVID.xlsx")
encuesta <- excel %>% select(-MARCA, -HABITANTES, -DISTANCIA, -CONSECUENCIAS_PANDEMIA, -SERVICIOS_VENTA_ONLINE, -FINANCIACION_EXTERNA, -INCREMENTO_VENTAS_ONLINE, -24, -25)
DT::datatable(encuesta, class = 'cell-border stripe', filter = "top", rownames = FALSE)
3. ANÁLISIS DE LA ENCUESTA
A continuación, paso a explicar con detalle los datos más importantes extraidos de la encuesta realizada.
3.1 SECTORES MÁS REPRESENTATIVOS.
Entre los sectores más representativos encontramos en primera posición a las Agencias de Viaje. Esto se debe a que desde la Asociación Empresarial Valenciana de Agencias de Viaje (AEVAV), fueron muchos de sus asociados los que se perdieron un poco de su tiempo para responder las diferentes cuestiones. En segundo lugar hosteleria y tiendas de ropa. Como se puede intuir son sectores que se han visto bastante castigados dadas las restricciones impuestas por los diferentes gobiernos. Esto hace que los resultados de la encuesta, como veremos más adelante sean poco alentadores para la economía valenciana.
sectores <- encuesta %>% group_by(SECTOR) %>% summarise(N=n()) %>% slice_max(N, n=5) %>%
mutate(SECTOR = forcats::as_factor(SECTOR))
graficosectores <- ggplot (sectores, aes (x=N, y=SECTOR), aes(fct_rev(SECTOR))) + geom_bar(stat = "identity", fill = "skyblue") + labs(title = "Cinco sectores más representativos de la encuesta", x="Número de comercios", y="Sector") + theme_minimal()
graficosectores
3.2 MUNICIPIOS MÁS REPRESENTATIVOS
Para representar los municipios que más han contestado al cuestionario, he realizado un mapa. De todas formas, los cinco municipios más presentes en la encuesta son:
- Valencia con 65 observaciones
- Buñol con 37 observaciones
- Benifaio con 28 observaciones
- Alzira con 27 observaciones
- Ontinyent con 22 observaciones
Por lo que podemos afirmar que la muestra obtenida refleja bien el tejido comercial valenciano, ya que hemos obtenido datos de muchos municipios diferentes.
municipios <- encuesta %>% group_by(MUNICIPIO) %>% summarise(N=n()) %>% slice_max(N, n=5)
mapaCiudadyPueblomayorinciAcu <- leaflet() %>%
addPopups(lng = -0.37480, lat = 39.47973 , popup = "Valencia") %>%
addPopups(lng = -0.79031, lat = 39.41447 , popup = "Buñol") %>%
addPopups(lng = -0.42500, lat = 39.28439 , popup = "Benifaio") %>%
addPopups(lng = -0.42666, lat = 39.15447 , popup = "Alzira") %>%
addPopups(lng = -0.30950, lat = 39.19868 , popup = "Sueca") %>%
setView(lng = -0.5, lat = 39.500, zoom = 8.5) %>% addTiles()
mapaCiudadyPueblomayorinciAcu
3.3 AFECTACIÓN DEL COVID-19
En primer lugar, me he centrado en la pregunta más básica: ¿El COVID19 ha afectado de forma negativa en su negocio?
afectacion <- encuesta %>% group_by(AFECTACION) %>% summarise(N=n()) %>% na.omit() %>% mutate (porcentaje=prop.table(N)*100, round(porcentaje, 2))
graficoafectacion <- ggplot(afectacion, aes(x="", y = round(porcentaje, 2), fill=AFECTACION)) + geom_bar(stat ="identity", color = "white") +
geom_text(aes(label = round(porcentaje, 2)), position = position_stack(vjust=0.5), color="white", size = 5, ) +
coord_polar(theta = "y") +
scale_fill_manual(values = c("steelblue", "red")) +
theme_void() +
labs(title = "¿Ha afectado de forma negativa el COVID-19 en su negocio?")
graficoafectacion
Como podemos observar, el 92.55% de los encuestados ha contestado que sí que ha tenido una afectación negativa. Mientras que los que han respondido que no, representan la minoría de comercios, cabe destacar que se trata de comercios los cuales se consideran esenciales (buscar en la tabla en la columna AFECTACIÓN: “No”).
3.4 AFECTACIÓN POR TRIMESTRES
En este apartado voy a analizar mediante un gráfico conocido como de quesitos, la pérdida de facturación de los comercios en los tres trimestres en los que ha estado presente la pandemia. Es decir, en el segundo trimestre, tercer trimestre y cuarto trimestre de 2020. Como podemos observar los resultados son bastante similares con una leve mejora en el tercer trimestre respecto al segundo.
3.4.1 SEGUNDO TRIMESTRE DE 2020
En este primer trimestre analizado (segundo trimestre del 2020), los resultados mostrados son tremendamente malos. Ya que como podemos observar el 54,96% de los comercios han pérdido más del 50% de la facturación respecto al mismo trimestre del año pasado. Por contra, el 8,59% han perdido solo entre el 0 y el 10% de dicha facturación.
trimestres <- encuesta %>% group_by(SEGUNDOTRIMESTRE) %>% summarise(N=n()) %>% na.omit() %>% arrange(desc(N)) %>% mutate(porcentaje=prop.table(N)*100, round(porcentaje, 2))
graficotrimestre2 <- ggplot(trimestres, aes(x="", y = round(porcentaje, 2), fill=SEGUNDOTRIMESTRE)) + geom_bar(stat ="identity", color = "white") +
geom_text(aes(label = round(porcentaje, 2)), position = position_stack(vjust=0.5), color="white", size = 5, ) +
coord_polar(theta = "y") +
theme_void() +
scale_fill_manual(values = c("STEELBLUE", "BLUE", "ORANGE", "RED","BROWN","GREEN", "DARKGREY"))+
labs(title = "¿Cuánto ha visto reducida su facturación en el 2T2020?")
graficotrimestre2 + theme(panel.grid.major = element_line(linetype = "blank")) +labs(fill = "FACTURACIÓN PERDIDA")
3.4.2 TERCER TRIMESTRE DE 2020
En el tercer trimestre, y con la llegada del verano y la llamada “Nueva Normalidad”, establecida en el territorio español a partir del mes de mayo, parecía que el la economía iba a resurgir. Pero nada más lejos de la realidad, las restricciones y la incertidumbre de los consumidores hicieron que durante todo el verano no se diera la recuperación esperada. Aunque cabe mencionar que si que se observa un ligero atisbo de mejora. Ya que en este caso se ha reducido más de 10 puntos porcentuales los encuestados que indicaron que perdieron más del 50% de la facturación. Si nos fijamos en los encuestados menos afectados (0-10%), vemos como en este caso son un 13,38%, cifra ligeramente superior a la del trimestre anterior.
trimestres <- encuesta %>% group_by(TERCERTRIMESTRE) %>% summarise(N=n()) %>% na.omit() %>% arrange(desc(N)) %>% mutate(porcentaje=prop.table(N)*100, round(porcentaje, 2))
graficotrimestre3 <- ggplot(trimestres, aes(x="", y = round(porcentaje, 2), fill=TERCERTRIMESTRE)) + geom_bar(stat ="identity", color = "white") +
geom_text(aes(label = round(porcentaje, 2)), position = position_stack(vjust=0.5), color="white", size = 5, ) +
coord_polar(theta = "y") +
theme_void() +
scale_fill_manual(values = c("STEELBLUE", "BLUE", "ORANGE", "RED","BROWN","GREEN", "DARKGREY"))+
labs(title = "¿Cuánto ha visto reducida su facturación en el 3T2020?")
graficotrimestre3 + theme(panel.grid.major = element_line(linetype = "blank")) +labs(fill = "FACTURACIÓN PERDIDA")
3.4.3 CUARTO TRIMESTRE DE 2020
Por último, analizamos el último trimestre del año, el cual muestra resultados muy parecidos a los del trimestre anterior. Esto quiere decir que durante el transcurso del año el pequeño comercio valenciano no pudo remontar la situación provocada por la crisis de la pandemia, que impidió durante la gran parte del año 2020, que los comercios desarrollarán su actividad con total normalidad y sin restricciones.
trimestres <- encuesta %>% group_by(CUARTOTRIMESTRE) %>% summarise(N=n()) %>% na.omit() %>% arrange(desc(N)) %>% mutate(porcentaje=prop.table(N)*100, round(porcentaje, 2))
graficotrimestre4 <- ggplot(trimestres, aes(x="", y = round(porcentaje, 2), fill=CUARTOTRIMESTRE)) + geom_bar(stat ="identity", color = "white") +
geom_text(aes(label = round(porcentaje, 2)), position = position_stack(vjust=0.5), color="white", size = 5, ) +
coord_polar(theta = "y") +
theme_void() +
scale_fill_manual(values = c("STEELBLUE", "BLUE", "ORANGE", "RED","BROWN","GREEN", "DARKGREY"))+
labs(title = "¿Cuánto ha visto reducida su facturación en el 4T2020?")
graficotrimestre4 + theme(panel.grid.major = element_line(linetype = "blank")) +labs(fill = "FACTURACIÓN PERDIDA")
3.5 DIGITALIZACIÓN DEL PEQUEÑO COMERCIO
En este punto, voy a hablar de unos de los mayores problemas del pequeño comercio y del comercio tradicional en general, la digitalización. Y es que en muchos casos, el comercio tradicional ha sido sobrepasado por las nuevas tecnologías, ya que actualmente, es dificil ver por ejemplo, una carnicería o verdulería de un mercado municipal vendiendo sus productos en internet.Culpa de ello lo tienen también las grandes tecnológicas como Amazon, las cuales han hecho que nos acostumbremos a ir de compras a golpe de “click” desde el sofá de nuestra casa, abandonando en cierto modo el comercio del barrio de toda la vida.
digitalizacion <- encuesta %>% group_by(VENTA_ONLINE) %>% summarise (N=n()) %>% na.omit()
graficodigitalizacion <- ggplot(digitalizacion, aes(x= VENTA_ONLINE, y=N)) + geom_bar(stat = "identity", fill ="steelblue") + theme_minimal()
graficodigitalizacion + theme(panel.grid.major = element_line(linetype = "blank"),
panel.background = element_rect(fill = NA),
plot.background = element_rect(colour = NA)) +labs(title = "¿Su negocio dispone de un servicio de venta online?",
x = "¿Venta Online?", y = "Número de comercios")
Como he dicho anteriormente, y como muestran los resultados, actualmente la falta de digitalización en el sector comercial valenciano es un reto que hay que abordar. Y es que más de 300 comercios son los que han contestado que no disponen de servicio de venta online, mientras que solo un poco más de 150 han sido los que han contestado que sí.
3.6 AYUDAS AL PEQUEÑO COMERCIO
Durante la pandemía, los gobiernos han tenido que recurrir a ciertas ayudas de apoyo a los empresarios y autónomos, ya que ante la obligación de tener que cerrar obligatoriamente, el gobierno tuvo que apoyar a los trabajadores de dichos comercios. Dichas ayudas podemos consultarlas en la página web de la Conselleria d’Economia de la Generalitat Valenciana.
ayudas <- encuesta %>% group_by(AYUDAS) %>% summarise(respuestas = n()) %>% na.omit()
graficoayudas <- ggplot(ayudas, aes(x= AYUDAS, y= respuestas)) + geom_bar(stat = "identity", fill = "steelblue") + labs(title = "¿Ha solicitado ayudas a las AAPP ante la crisis del COVID19?") + theme_minimal() + geom_text(aes(label=respuestas), positicion = position_stack(vjust = 0.5), color = "black", size = 4)
graficoayudas
Como vemos, 386 han solicitado ayudas, mientras que 44 de los que si que han solicitado, no las habian recibido en el momento de la contestación de la encuesta. Por su parte 147 comerciantes no pidieron ningún tipo de ayuda.
En el siguiente gráfico, hemos preguntado: ¿Le parecen suficientes las ayudas recibidas por las AAPP?. Pregunta, a la que como es de esperar cuando alguien tiene que valorar la cuantía de una ayuda económica, han respondido de forma mayoritaria que no han sido suficientes.
ayudas1 <- encuesta %>% group_by(AYUDA_SUFICIENTE) %>% summarise(respuestas = n()) %>% na.omit() %>% mutate(porcentaje=prop.table(respuestas)*100, round(porcentaje, 2))
graficoayudas1 <- ggplot(ayudas1, aes(x="", y = round(porcentaje, 2), fill=AYUDA_SUFICIENTE)) +
geom_bar(stat ="identity", color = "white") +
geom_text(aes(label = round(porcentaje, 2)), position = position_stack(vjust=0.5), color="white", size = 5, ) +
coord_polar(theta = "y") + theme_void()
graficoayudas1+labs(title = "¿Considera suficientes las ayudas recibidas?")
3.7 CIERRE DE LOS COMERCIOS DEBIDO A LA PANDEMIA
Como he mencionado anteriormente, los negocios se vieron obligados a cerrar en la primera ola de la pandemia debido a las restricciones de movilidad impuestas por el gobierno central. Este cierre fue en cierta medida asimétrico y dependió principalmente del tipo de negocio.
cierre <- encuesta %>% group_by(TIEMPO_CERRADO) %>% summarise(observaciones = n()) %>% na.omit() %>% arrange(-observaciones)
graficocierre <- ggplot(cierre, aes(x = TIEMPO_CERRADO, y = observaciones)) +
geom_bar(stat = "identity", fill = "brown") +
labs(title = "¿Cuánto tiempo ha estado su negocio cerrado dada la crisis del COVID19?", x = "Tiempo cerrado", y = "Observaciones") + theme_minimal()
graficocierre
Como observamos, la gran mayoría de comercios estuvieron cerrados dos meses o más. siendo un total de más de 400 encuestados los que estuvieron cerrados dicho tiempo. Por contra menos de 75 comercios han estado cerrados un mes o menos. Estos resultados arrojan una situación más que preocupante, ya que el comercio valenciano está sufriendo serias dificutlades para remontar dicha situación negativa.
Con los resultados obtenidos, está claro que muchos de los encuestados han tenido serias dificultades económicas dadas las restricciones que obligaban a cerrar cualquier negocio considerado no esencial. Ante estos resultados donde hemos visto que gran cantidad de negocios han permanecido cerrados un tiempo más que significativo. Es inevitable analizar la cuestión de cuántos de ellos se han planteado el cierre de sus negocios dada la situación.
cese <- encuesta %>% group_by(CIERRE) %>% summarise(observaciones = n()) %>% na.omit() %>% mutate(porcentaje=prop.table(observaciones)*100, round(porcentaje, 2))
graficocese <- ggplot(cese, aes(x="", y = round(porcentaje, 2), fill=CIERRE)) +
geom_bar(stat ="identity", color = "white") +
geom_text(aes(label = round(porcentaje, 2)), position = position_stack(vjust=0.5), color="white", size = 5, ) +
coord_polar(theta = "y") + theme_void()
graficocese + labs (title = "¿Se ha planteado cerrar de forma permanente su negocio dada la situación?")
En este gráfico se muestra una realidad más que precupante, ya que el 45% de los encuestados han contestado que se han planteado cerrar de forma permanente su negocio. Esto refleja que la situación del pequeño comercio valenciano es generalmente poco solvente y con poco margen de maniobra.
3.8 CAMPAÑA DE NAVIDAD
Ante las dificultades sufridas en la primera mitad del año 2020, la campaña de Navidad tenía una importancia en algunos casos vital para el comercio valenciano, ya que podía ser la clave para remontar los resultados económicos tan malos de los meses anteriores.
navidad <- encuesta %>% group_by(IMPORTANCIA_NAVIDAD) %>% summarise(importancia = n()) %>% na.omit()
graficonavidad <- ggplot(navidad, aes(x = IMPORTANCIA_NAVIDAD, y = importancia)) +
geom_bar(stat = "identity", fill = "red") +
labs(title = "¿Qué importante va a ser la campaña de Navidad en su Negocio?", x = "Importancia campaña Navidad", y = "observaciones") + theme_minimal()
graficonavidad
Como podemos comprobar en el gráfico, la mayoría de las contestaciones es que la campaña de Navidad era muy importante o importante para su comercio. Ahora bien, sabiendo a posteriori como ha ido dicha campaña, es de esperar que el pequeño comercio valenciano esté pasando un comienzo de año 2021 económicamente complicado.
LS0tDQp0aXRsZTogIkFmZWN0YWNpw7NuIGRlbCBDT1ZJRC0xOSBlbiBlbCBwZXF1ZcOxbyBjb21lcmNpbyB2YWxlbmNpYW5vIg0Kc3VidGl0bGU6ICJDYXJsb3MgUm9kcmlndWV6IEdvbnphbHZvKGNhcm9nb240QGFsdW1uaS51di5lcykiICMtIHBvbmdvIHTDuiBub21icmUgYWjDrSBwYXJhIHEgYXBhcmV6Y2EgbcOhcyBncmFuZGUgcSBlbCBkZSBsYSBVVg0KYXV0aG9yOiAiVW5pdmVyc2l0YXQgZGUgVmFsw6huY2lhIg0KZGF0ZTogIkRpY2llbWJyZSBkZSAyMDIwIChhY3R1YWxpemFkbyBlbCBgciBmb3JtYXQoU3lzLnRpbWUoKSwgJyVkLSVtLSVZJylgKSINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICAjY3NzOiAiLi9hc3NldHMvbXlfY3NzX2ZpbGUuY3NzIg0KICAgIHRoZW1lOiBwYXBlcg0KICAgIGhpZ2hsaWdodDogdGV4dG1hdGUgDQogICAgdG9jOiB0cnVlDQogICAgdG9jX2RlcHRoOiAzIA0KICAgIHRvY19mbG9hdDogDQogICAgICBjb2xsYXBzZWQ6IHRydWUNCiAgICAgIHNtb290aF9zY3JvbGw6IHRydWUNCiAgICBzZWxmX2NvbnRhaW5lZDogdHJ1ZQ0KICAgIG51bWJlcl9zZWN0aW9uczogZmFsc2UNCiAgICBkZl9wcmludDoga2FibGUNCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQplZGl0b3Jfb3B0aW9uczogDQogIGNodW5rX291dHB1dF90eXBlOiBjb25zb2xlDQotLS0NCg0KYGBge3IgcGFja2FnZXMtc2V0dXAsIGluY2x1ZGUgPSBGQUxTRX0NCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShrbGlwcHkpICAjLSByZW1vdGVzOjppbnN0YWxsX2dpdGh1Yigicmxlc3VyL2tsaXBweSIpDQpsaWJyYXJ5KGtuaXRyKQ0KbGlicmFyeShyZWFkeGwpDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShsZWFmbGV0KQ0KbGlicmFyeShwbG90bHkpDQoNCmBgYA0KDQpgYGB7ciBjaHVuay1zZXR1cCwgaW5jbHVkZSA9IEZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFLCBldmFsID0gVFJVRSwgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIA0KICAgICAgICAgICAgICAgICAgICAgICNyZXN1bHRzID0gImhvbGQiLA0KICAgICAgICAgICAgICAgICAgICAgIGNhY2hlID0gRkFMU0UsIGNhY2hlLnBhdGggPSAiL2NhY2hlcy8iLCBjb21tZW50ID0gIiM+IiwNCiAgICAgICAgICAgICAgICAgICAgICAjZmlnLndpZHRoID0gNywgI2ZpZy5oZWlnaHQ9IDcsICAgDQogICAgICAgICAgICAgICAgICAgICAgI291dC53aWR0aCA9IDcsIG91dC5oZWlnaHQgPSA3LA0KICAgICAgICAgICAgICAgICAgICAgIGNvbGxhcHNlID0gVFJVRSwgIGZpZy5zaG93ID0gImhvbGQiLA0KICAgICAgICAgICAgICAgICAgICAgIGZpZy5hc3AgPSA3LzksIG91dC53aWR0aCA9ICI2MCUiLCBmaWcuYWxpZ24gPSAiY2VudGVyIikNCmtuaXRyOjpvcHRzX2NodW5rJHNldChkZXYgPSAicG5nIiwgZGV2LmFyZ3MgPSBsaXN0KHR5cGUgPSAiY2Fpcm8tcG5nIikpDQpgYGANCg0KYGBge3Igb3B0aW9ucy1zZXR1cCwgaW5jbHVkZSA9IEZBTFNFfQ0Kb3B0aW9ucyhzY2lwZW4gPSA5OTkpICMtIHBhcmEgcXVpdGFyIGxhIG5vdGFjacOzbiBjaWVudMOtZmljYQ0Kb3B0aW9ucygieWFtbC5ldmFsLmV4cHIiID0gVFJVRSkgDQpgYGANCg0KDQpgYGB7ciBrbGlwcHksIGVjaG8gPSBGQUxTRX0NCmtsaXBweTo6a2xpcHB5KHBvc2l0aW9uID0gYygidG9wIiwgInJpZ2h0IikpICMtIHJlbW90ZXM6Omluc3RhbGxfZ2l0aHViKCJybGVzdXIva2xpcHB5IikNCmBgYA0KDQo8aHIgY2xhc3M9ImxpbmVhLWJsYWNrIj4NCg0KVHJhYmFqbyBlbGFib3JhZG8gcGFyYSBsYSBhc2lnbmF0dXJhICJQcm9ncmFtYWNpw7NuIHkgbWFuZWpvIGRlIGRhdG9zIGVuIGxhIGVyYSBkZWwgQmlnIERhdGEiIGRlIGxhIFVuaXZlcnNpdGF0IGRlIFZhbMOobmNpYSBkdXJhbnRlIGVsIGN1cnNvIDIwMjAtMjAyMS4gRWwgcmVwbyBkZWwgdHJhYmFqbyBlc3TDoSBbYXF1w61dKGh0dHBzOi8vZ2l0aHViLmNvbS9jYXJsb3Nyb2RyaWd1ZXpnb256YWx2by90cmFiYWpvX0JpZ0RhdGEpe3RhcmdldD0iX2JsYW5rIn0uIExhIHDDoWdpbmEgd2ViIGRlIGxhIGFzaWduYXR1cmEgeSBsb3MgdHJhYmFqb3MgZGUgbWlzIGNvbXBhw7Flcm9zIHB1ZWRlbiB2ZXJzZSBbYXF1w61dKGh0dHBzOi8vcGVyZXpwNDQuZ2l0aHViLmlvL2ludHJvLWRzLTIwLTIxLXdlYi8wNy10cmFiYWpvcy5odG1sKXt0YXJnZXQ9Il9ibGFuayJ9Lg0KDQo8IS0tIEVsIHDDoXJyYWZvIGRlIGFycmliYSBoYXMgZGUgZGVqYXJsbyBjYXNpIGlndWFsLCANCiAgICAgICAgc29sbyBIQVMgZGUgU1VTVElUVUlSIGxhcyAyIHZlY2VzIHF1ZSBhcGFyZWNlICJwZXJlenA0NCIgcG9yIHR1IHVzdWFyaW8gZGUgR2l0aHViLS0+DQoNCjxociBjbGFzcz0ibGluZWEtcmVkIj4NCg0KIyAxLiBJTlRST0RVQ0NJw5NODQoNCkVuIGVsIGx1Z2FyIGhlIHJlYWxpemFkbyBsYXMgcHLDoWN0aWNhcyBjdXJyaWN1bGFyZXMsICoqVW5pw7MgR3JlbWlhbCDigJMgRmVkZXJhY2nDsyBkZSBHcmVtaXMgaSBBc3NvY2lhY2lvbnMgZGVsIENvbWVyw6cgVmFsZW5jacOgKiosIGhlbW9zIGFuYWxpemFuZG8gZWwgaW1wYWN0byBkZWwgQ09WSUQxOSBlbiBlbCBwZXF1ZcOxbyBjb21lcmNpbyB2YWxlbmNpYW5vLiBQYXJhIGVsbG8gaGVtb3MgZWxhYm9yYWRvIHVuYSBbZW5jdWVzdGFdKGh0dHBzOi8vZm9ybXMuZ2xlLzRZZVhZU3U0SG1lWXhCTVlBKSBkaXJpZ2lkYSBhIGxvcyBwZXF1ZcOxb3MgY29tZXJjaW9zXlttw6FzIGRlIDEwMCBhc29jaWFjaW9uZXMgZGlzdHJpYnVpZGFzIHBvciB0b2RhIGxhIENvbXVuaWRhZCBWYWxlbmNpYW5hXSBhZGhlcmlkb3MgYSBsYXMgYXNvY2lhY2lvbmVzIGRlIFVuacOzIEdyZW1pYWwuDQoNCiFbRm90byBkZSBsYSDDumx0aW1hIGNhbWFwYcOxYSBkZSBVR10oLi9pbWFnZW5lcy9Db21lcsOnQnJ1dGFsLmpwZyl7d2lkdGg9MzAlfQ0KDQoNCg0KDQoNCg0KDQoNCiBFbiBlc3RlIHRyYWJham8gdmVyZW1vcyBjb21vIHNlIGhhIHZpc3RvIHJlZHVjaWRhIGxhIGZhY3R1cmFjacOzbiBlbiBsb3MgZGlmZXJlbnRlcyB0cmltZXN0cmVzIGRlIGVzdGUgw7psdGltbyBhw7FvLCBlbCBwcm9ibGVtYSBkZSBsYSBkaWdpdGFsaXphY2nDs24gZW4gZWwgcGVxdWXDsW8gY29tZXJjaW8gKGxvIGN1YWwgc3Vwb25lIHVuIGdyYW4gcmV0byBwYXJhIGVsIGZ1dHVybyBkZWwgc2VjdG9yKSwgbGFzIHByZXZpc2lvbmVzIGZ1dHVyYXMgZGFkYXMgbGFzIGV4cGVjdGF0aXZhcyBkZSBmdXR1cmFzIG1lZGlkYXMgcmVzdHJpY3RpdmFzIGEgY2F1c2EgZGUgbGEgc2VndW5kYSBvbGEgZGUgbGEgcGFuZGVtaWEgeSBsYSBpbXBvcnRhbmNpYSBkZSBsYSBjYW1wYcOxYSBkZSBOYXZpZGFkIHBhcmEgZXN0b3MgbmVnb2Npb3MuIA0KDQojIDIuIERBVE9TDQoNCkVuIGVzdGUgY2FzbywgbG9zIGRhdG9zIGRlIGVzdGUgdHJhYmFqbyBzZSBoYW4gb2J0ZW5pZG8gZW4gZXhjbHVzaXZhIGRlbCBleGNlbCBnZW5lcmFkbyBhdXRvbcOhdGljYW1lbnRlIHBvciBsYSBoZXJyYW1pZW50YSBkZSBHb29nbGUgcXVlIHBlcm1pdGUgaGFjZXIgZW5jdWVzdGFzIChlbmN1ZXN0YSBhbnRlcmlvcm1lbnRlIG1lbmNpb25hZGEsIGNvbiBzdSByZXNwZWN0aXZvIGxpbmspLiBDYWJlIGRlc3RhY2FyIHF1ZSBoZSB0ZW5pZG8gcXVlIG1vZGlmaWNhciBsYSBwcmltZXJhIGZpbGEgZGVsIGV4Y2VsIGRvbmRlIGFwYXJlY8OtYSBsYSBwcmVndW50YSBlbnRlcmEsIGxvIGN1YWwgYSBsYSBob3JhIGRlIHRyYWJhamFyIGNvbiBSIHBvZHLDrWEgaGFiZXIgc2lkbyBjb21wbGljYWRvLiANCkEgY29udGludWFjacOzbiwgbXVlc3RybyB1bmEgdGFibGEgZW4gbGEgcXVlIHNlIHZlbiB0b2RvcyBsb3MgcmVzdWx0YWRvcyBkZSBkaWNoYSBlbmN1ZXN0YSwgeSBjb24gbG9zIGN1YWxlcyB2b3kgYSB0cmFiYWphciBlbCByZXN0byBkZWwgdHJhYmFqby4gDQoNCmBgYHtyLCBldmFsID0gVFJVRSwgZWNobyA9IFRSVUV9DQpleGNlbCA8LSByZWFkX2V4Y2VsKCIuL0RhdG9zL1JFU1BVRVNUQVNfRU5DVUVTVEFfQ09WSUQueGxzeCIpIA0KZW5jdWVzdGEgPC0gZXhjZWwgJT4lIHNlbGVjdCgtTUFSQ0EsIC1IQUJJVEFOVEVTLCAtRElTVEFOQ0lBLCAtQ09OU0VDVUVOQ0lBU19QQU5ERU1JQSwgLVNFUlZJQ0lPU19WRU5UQV9PTkxJTkUsIC1GSU5BTkNJQUNJT05fRVhURVJOQSwgLUlOQ1JFTUVOVE9fVkVOVEFTX09OTElORSwgLTI0LCAtMjUpDQpEVDo6ZGF0YXRhYmxlKGVuY3Vlc3RhLCBjbGFzcyA9ICdjZWxsLWJvcmRlciBzdHJpcGUnLCBmaWx0ZXIgPSAidG9wIiwgcm93bmFtZXMgPSBGQUxTRSkNCmBgYA0KDQojIDMuIEFOw4FMSVNJUyBERSBMQSBFTkNVRVNUQQ0KQSBjb250aW51YWNpw7NuLCBwYXNvIGEgZXhwbGljYXIgY29uIGRldGFsbGUgbG9zIGRhdG9zIG3DoXMgaW1wb3J0YW50ZXMgZXh0cmFpZG9zIGRlIGxhIGVuY3Vlc3RhIHJlYWxpemFkYS4gDQoNCiMjIDMuMSBTRUNUT1JFUyBNw4FTIFJFUFJFU0VOVEFUSVZPUy4NCg0KRW50cmUgbG9zIHNlY3RvcmVzIG3DoXMgcmVwcmVzZW50YXRpdm9zIGVuY29udHJhbW9zIGVuIHByaW1lcmEgcG9zaWNpw7NuIGEgbGFzIEFnZW5jaWFzIGRlIFZpYWplLiBFc3RvIHNlIGRlYmUgYSBxdWUgZGVzZGUgbGEgQXNvY2lhY2nDs24gRW1wcmVzYXJpYWwgVmFsZW5jaWFuYSBkZSBBZ2VuY2lhcyBkZSBWaWFqZSAoQUVWQVYpLCBmdWVyb24gbXVjaG9zIGRlIHN1cyBhc29jaWFkb3MgbG9zIHF1ZSBzZSBwZXJkaWVyb24gdW4gcG9jbyBkZSBzdSB0aWVtcG8gcGFyYSByZXNwb25kZXIgbGFzIGRpZmVyZW50ZXMgY3Vlc3Rpb25lcy4gDQpFbiBzZWd1bmRvIGx1Z2FyIGhvc3RlbGVyaWEgeSB0aWVuZGFzIGRlIHJvcGEuIA0KQ29tbyBzZSBwdWVkZSBpbnR1aXIgc29uIHNlY3RvcmVzIHF1ZSBzZSBoYW4gdmlzdG8gYmFzdGFudGUgY2FzdGlnYWRvcyBkYWRhcyBsYXMgcmVzdHJpY2Npb25lcyBpbXB1ZXN0YXMgcG9yIGxvcyBkaWZlcmVudGVzIGdvYmllcm5vcy4gRXN0byBoYWNlIHF1ZSBsb3MgcmVzdWx0YWRvcyBkZSBsYSBlbmN1ZXN0YSwgY29tbyB2ZXJlbW9zIG3DoXMgYWRlbGFudGUgc2VhbiBwb2NvIGFsZW50YWRvcmVzIHBhcmEgbGEgZWNvbm9tw61hIHZhbGVuY2lhbmEuIA0KDQpgYGB7ciwgZXZhbCA9IFRSVUUsIGVjaG8gPSBUUlVFfQ0Kc2VjdG9yZXMgPC0gZW5jdWVzdGEgJT4lIGdyb3VwX2J5KFNFQ1RPUikgJT4lIHN1bW1hcmlzZShOPW4oKSkgJT4lIHNsaWNlX21heChOLCBuPTUpICU+JQ0KICAgIG11dGF0ZShTRUNUT1IgPSBmb3JjYXRzOjphc19mYWN0b3IoU0VDVE9SKSkNCmdyYWZpY29zZWN0b3JlcyA8LSBnZ3Bsb3QgKHNlY3RvcmVzLCBhZXMgKHg9TiwgeT1TRUNUT1IpLCBhZXMoZmN0X3JldihTRUNUT1IpKSkgKyBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgZmlsbCA9ICJza3libHVlIikgKyBsYWJzKHRpdGxlID0gIkNpbmNvIHNlY3RvcmVzIG3DoXMgcmVwcmVzZW50YXRpdm9zIGRlIGxhIGVuY3Vlc3RhIiwgeD0iTsO6bWVybyBkZSBjb21lcmNpb3MiLCB5PSJTZWN0b3IiKSArIHRoZW1lX21pbmltYWwoKQ0KZ3JhZmljb3NlY3RvcmVzDQpgYGANCg0KIyMgMy4yIE1VTklDSVBJT1MgTcOBUyBSRVBSRVNFTlRBVElWT1MNClBhcmEgcmVwcmVzZW50YXIgbG9zIG11bmljaXBpb3MgcXVlIG3DoXMgaGFuIGNvbnRlc3RhZG8gYWwgY3Vlc3Rpb25hcmlvLCBoZSByZWFsaXphZG8gdW4gbWFwYS4gDQpEZSB0b2RhcyBmb3JtYXMsIGxvcyBjaW5jbyBtdW5pY2lwaW9zIG3DoXMgcHJlc2VudGVzIGVuIGxhIGVuY3Vlc3RhIHNvbjoNCg0KICAxLiBWYWxlbmNpYSBjb24gNjUgb2JzZXJ2YWNpb25lcw0KICAyLiBCdcOxb2wgY29uIDM3IG9ic2VydmFjaW9uZXMNCiAgMy4gQmVuaWZhaW8gY29uIDI4IG9ic2VydmFjaW9uZXMgDQogIDQuIEFsemlyYSBjb24gMjcgb2JzZXJ2YWNpb25lcw0KICA1LiBPbnRpbnllbnQgY29uIDIyIG9ic2VydmFjaW9uZXMNCg0KUG9yIGxvIHF1ZSBwb2RlbW9zIGFmaXJtYXIgcXVlIGxhIG11ZXN0cmEgb2J0ZW5pZGEgcmVmbGVqYSBiaWVuIGVsIHRlamlkbyBjb21lcmNpYWwgdmFsZW5jaWFubywgeWEgcXVlIGhlbW9zIG9idGVuaWRvIGRhdG9zIGRlIG11Y2hvcyBtdW5pY2lwaW9zIGRpZmVyZW50ZXMuIA0KDQpgYGB7ciwgZXZhbCA9IFRSVUUsIGVjaG8gPSBUUlVFfQ0KbXVuaWNpcGlvcyA8LSBlbmN1ZXN0YSAlPiUgZ3JvdXBfYnkoTVVOSUNJUElPKSAlPiUgc3VtbWFyaXNlKE49bigpKSAlPiUgc2xpY2VfbWF4KE4sIG49NSkNCg0KbWFwYUNpdWRhZHlQdWVibG9tYXlvcmluY2lBY3UgPC0gbGVhZmxldCgpICU+JSANCiAgYWRkUG9wdXBzKGxuZyA9IC0wLjM3NDgwLCBsYXQgPSAzOS40Nzk3MyAsIHBvcHVwID0gIlZhbGVuY2lhIikgJT4lDQogIGFkZFBvcHVwcyhsbmcgPSAtMC43OTAzMSwgbGF0ID0gMzkuNDE0NDcgLCBwb3B1cCA9ICJCdcOxb2wiKSAlPiUNCiAgYWRkUG9wdXBzKGxuZyA9IC0wLjQyNTAwLCBsYXQgPSAzOS4yODQzOSAsIHBvcHVwID0gIkJlbmlmYWlvIikgJT4lDQogIGFkZFBvcHVwcyhsbmcgPSAtMC40MjY2NiwgbGF0ID0gMzkuMTU0NDcgLCBwb3B1cCA9ICJBbHppcmEiKSAlPiUNCiAgYWRkUG9wdXBzKGxuZyA9IC0wLjMwOTUwLCBsYXQgPSAzOS4xOTg2OCAsIHBvcHVwID0gIlN1ZWNhIikgJT4lDQogIHNldFZpZXcobG5nID0gLTAuNSwgbGF0ID0gMzkuNTAwLCB6b29tID0gOC41KSAlPiUgIGFkZFRpbGVzKCkNCm1hcGFDaXVkYWR5UHVlYmxvbWF5b3JpbmNpQWN1DQpgYGAgDQoNCiMjIDMuMyBBRkVDVEFDScOTTiBERUwgQ09WSUQtMTkNCg0KRW4gcHJpbWVyIGx1Z2FyLCBtZSBoZSBjZW50cmFkbyBlbiBsYSBwcmVndW50YSBtw6FzIGLDoXNpY2E6DQoqKsK/RWwgQ09WSUQxOSBoYSBhZmVjdGFkbyBkZSBmb3JtYSBuZWdhdGl2YSBlbiBzdSBuZWdvY2lvPyoqIA0KDQpgYGB7ciwgZXZhbCA9IFRSVUUsIGVjaG8gPSBUUlVFfQ0KYWZlY3RhY2lvbiA8LSBlbmN1ZXN0YSAlPiUgZ3JvdXBfYnkoQUZFQ1RBQ0lPTikgJT4lIHN1bW1hcmlzZShOPW4oKSkgJT4lIG5hLm9taXQoKSAlPiUgbXV0YXRlIChwb3JjZW50YWplPXByb3AudGFibGUoTikqMTAwLCByb3VuZChwb3JjZW50YWplLCAyKSkgDQpncmFmaWNvYWZlY3RhY2lvbiA8LSBnZ3Bsb3QoYWZlY3RhY2lvbiwgYWVzKHg9IiIsIHkgPSByb3VuZChwb3JjZW50YWplLCAyKSwgZmlsbD1BRkVDVEFDSU9OKSkgKyAgICAgZ2VvbV9iYXIoc3RhdCA9ImlkZW50aXR5IiwgY29sb3IgPSAid2hpdGUiKSArIA0KICAgIGdlb21fdGV4dChhZXMobGFiZWwgPSByb3VuZChwb3JjZW50YWplLCAyKSksIHBvc2l0aW9uID0gcG9zaXRpb25fc3RhY2sodmp1c3Q9MC41KSwgY29sb3I9IndoaXRlIiwgc2l6ZSA9IDUsICkgKyANCiAgY29vcmRfcG9sYXIodGhldGEgPSAieSIpICsgDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoInN0ZWVsYmx1ZSIsICJyZWQiKSkgKyANCiAgdGhlbWVfdm9pZCgpICsgDQogIGxhYnModGl0bGUgPSAiwr9IYSBhZmVjdGFkbyBkZSBmb3JtYSBuZWdhdGl2YSBlbCBDT1ZJRC0xOSBlbiBzdSBuZWdvY2lvPyIpDQpncmFmaWNvYWZlY3RhY2lvbg0KYGBgDQpDb21vIHBvZGVtb3Mgb2JzZXJ2YXIsIGVsIDkyLjU1JSBkZSBsb3MgZW5jdWVzdGFkb3MgaGEgY29udGVzdGFkbyBxdWUgc8OtIHF1ZSBoYSB0ZW5pZG8gdW5hIGFmZWN0YWNpw7NuIG5lZ2F0aXZhLiBNaWVudHJhcyBxdWUgbG9zIHF1ZSBoYW4gcmVzcG9uZGlkbyBxdWUgbm8sIHJlcHJlc2VudGFuIGxhIG1pbm9yw61hIGRlIGNvbWVyY2lvcywgY2FiZSBkZXN0YWNhciBxdWUgc2UgdHJhdGEgZGUgY29tZXJjaW9zIGxvcyBjdWFsZXMgc2UgY29uc2lkZXJhbiBlc2VuY2lhbGVzIChidXNjYXIgZW4gbGEgdGFibGEgZW4gbGEgY29sdW1uYSBBRkVDVEFDScOTTjogIk5vIikuIA0KDQojIyAzLjQgQUZFQ1RBQ0nDk04gUE9SIFRSSU1FU1RSRVMgDQoNCkVuIGVzdGUgYXBhcnRhZG8gdm95IGEgYW5hbGl6YXIgbWVkaWFudGUgdW4gZ3LDoWZpY28gY29ub2NpZG8gY29tbyBkZSBxdWVzaXRvcywgbGEgcMOpcmRpZGEgZGUgZmFjdHVyYWNpw7NuIGRlIGxvcyBjb21lcmNpb3MgZW4gbG9zIHRyZXMgdHJpbWVzdHJlcyBlbiBsb3MgcXVlIGhhIGVzdGFkbyBwcmVzZW50ZSBsYSBwYW5kZW1pYS4gRXMgZGVjaXIsIGVuIGVsIHNlZ3VuZG8gdHJpbWVzdHJlLCB0ZXJjZXIgdHJpbWVzdHJlIHkgY3VhcnRvIHRyaW1lc3RyZSBkZSAyMDIwLiANCkNvbW8gcG9kZW1vcyBvYnNlcnZhciBsb3MgcmVzdWx0YWRvcyBzb24gYmFzdGFudGUgc2ltaWxhcmVzIGNvbiB1bmEgbGV2ZSBtZWpvcmEgZW4gZWwgdGVyY2VyIHRyaW1lc3RyZSByZXNwZWN0byBhbCBzZWd1bmRvLg0KDQojIyMgMy40LjEgU0VHVU5ETyBUUklNRVNUUkUgREUgMjAyMA0KRW4gZXN0ZSBwcmltZXIgdHJpbWVzdHJlIGFuYWxpemFkbyAoc2VndW5kbyB0cmltZXN0cmUgZGVsIDIwMjApLCBsb3MgcmVzdWx0YWRvcyBtb3N0cmFkb3Mgc29uIHRyZW1lbmRhbWVudGUgbWFsb3MuIFlhIHF1ZSBjb21vIHBvZGVtb3Mgb2JzZXJ2YXIgZWwgNTQsOTYlIGRlIGxvcyBjb21lcmNpb3MgaGFuIHDDqXJkaWRvIG3DoXMgZGVsIDUwJSBkZSBsYSBmYWN0dXJhY2nDs24gcmVzcGVjdG8gYWwgbWlzbW8gdHJpbWVzdHJlIGRlbCBhw7FvIHBhc2Fkby4gDQpQb3IgY29udHJhLCBlbCA4LDU5JSBoYW4gcGVyZGlkbyBzb2xvIGVudHJlIGVsIDAgeSBlbCAxMCUgZGUgZGljaGEgZmFjdHVyYWNpw7NuLiANCg0KYGBge3IsIGV2YWwgPSBUUlVFLCBlY2hvID0gVFJVRX0NCnRyaW1lc3RyZXMgPC0gZW5jdWVzdGEgJT4lIGdyb3VwX2J5KFNFR1VORE9UUklNRVNUUkUpICU+JSBzdW1tYXJpc2UoTj1uKCkpICU+JSBuYS5vbWl0KCkgJT4lIGFycmFuZ2UoZGVzYyhOKSkgJT4lIG11dGF0ZShwb3JjZW50YWplPXByb3AudGFibGUoTikqMTAwLCByb3VuZChwb3JjZW50YWplLCAyKSkNCg0KZ3JhZmljb3RyaW1lc3RyZTIgPC0gZ2dwbG90KHRyaW1lc3RyZXMsIGFlcyh4PSIiLCB5ID0gcm91bmQocG9yY2VudGFqZSwgMiksIGZpbGw9U0VHVU5ET1RSSU1FU1RSRSkpICsgICAgIGdlb21fYmFyKHN0YXQgPSJpZGVudGl0eSIsIGNvbG9yID0gIndoaXRlIikgKyANCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcm91bmQocG9yY2VudGFqZSwgMikpLCBwb3NpdGlvbiA9IHBvc2l0aW9uX3N0YWNrKHZqdXN0PTAuNSksIGNvbG9yPSJ3aGl0ZSIsIHNpemUgPSA1LCApICsgDQogIGNvb3JkX3BvbGFyKHRoZXRhID0gInkiKSAgKyANCiAgdGhlbWVfdm9pZCgpICsgDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoIlNURUVMQkxVRSIsICJCTFVFIiwgIk9SQU5HRSIsICJSRUQiLCJCUk9XTiIsIkdSRUVOIiwgIkRBUktHUkVZIikpKw0KICBsYWJzKHRpdGxlID0gIsK/Q3XDoW50byBoYSB2aXN0byByZWR1Y2lkYSBzdSBmYWN0dXJhY2nDs24gZW4gZWwgMlQyMDIwPyIpDQpncmFmaWNvdHJpbWVzdHJlMiArIHRoZW1lKHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2xpbmUobGluZXR5cGUgPSAiYmxhbmsiKSkgK2xhYnMoZmlsbCA9ICJGQUNUVVJBQ0nDk04gUEVSRElEQSIpIA0KYGBgDQoNCiMjIyAzLjQuMiBURVJDRVIgVFJJTUVTVFJFIERFIDIwMjANCkVuIGVsIHRlcmNlciB0cmltZXN0cmUsIHkgY29uIGxhIGxsZWdhZGEgZGVsIHZlcmFubyB5IGxhIGxsYW1hZGEgIk51ZXZhIE5vcm1hbGlkYWQiLCBlc3RhYmxlY2lkYSBlbiBlbCB0ZXJyaXRvcmlvIGVzcGHDsW9sIGEgcGFydGlyIGRlbCBtZXMgZGUgbWF5bywgcGFyZWPDrWEgcXVlIGVsIGxhIGVjb25vbcOtYSBpYmEgYSByZXN1cmdpci4gUGVybyBuYWRhIG3DoXMgbGVqb3MgZGUgbGEgcmVhbGlkYWQsIGxhcyByZXN0cmljY2lvbmVzIHkgbGEgaW5jZXJ0aWR1bWJyZSBkZSBsb3MgY29uc3VtaWRvcmVzIGhpY2llcm9uIHF1ZSBkdXJhbnRlIHRvZG8gZWwgdmVyYW5vIG5vIHNlIGRpZXJhIGxhIHJlY3VwZXJhY2nDs24gZXNwZXJhZGEuIA0KQXVucXVlIGNhYmUgbWVuY2lvbmFyIHF1ZSBzaSBxdWUgc2Ugb2JzZXJ2YSB1biBsaWdlcm8gYXRpc2JvIGRlIG1lam9yYS4gWWEgcXVlIGVuIGVzdGUgY2FzbyBzZSBoYSByZWR1Y2lkbyBtw6FzIGRlIDEwIHB1bnRvcyBwb3JjZW50dWFsZXMgbG9zIGVuY3Vlc3RhZG9zIHF1ZSBpbmRpY2Fyb24gcXVlIHBlcmRpZXJvbiBtw6FzIGRlbCA1MCUgZGUgbGEgZmFjdHVyYWNpw7NuLiANClNpIG5vcyBmaWphbW9zIGVuIGxvcyBlbmN1ZXN0YWRvcyBtZW5vcyBhZmVjdGFkb3MgKDAtMTAlKSwgdmVtb3MgY29tbyBlbiBlc3RlIGNhc28gc29uIHVuIDEzLDM4JSwgY2lmcmEgbGlnZXJhbWVudGUgc3VwZXJpb3IgYSBsYSBkZWwgdHJpbWVzdHJlIGFudGVyaW9yLiANCg0KYGBge3IsIGV2YWwgPSBUUlVFLCBlY2hvID0gVFJVRX0NCnRyaW1lc3RyZXMgPC0gZW5jdWVzdGEgJT4lIGdyb3VwX2J5KFRFUkNFUlRSSU1FU1RSRSkgJT4lIHN1bW1hcmlzZShOPW4oKSkgJT4lIG5hLm9taXQoKSAlPiUgYXJyYW5nZShkZXNjKE4pKSAlPiUgbXV0YXRlKHBvcmNlbnRhamU9cHJvcC50YWJsZShOKSoxMDAsIHJvdW5kKHBvcmNlbnRhamUsIDIpKSANCg0KZ3JhZmljb3RyaW1lc3RyZTMgPC0gZ2dwbG90KHRyaW1lc3RyZXMsIGFlcyh4PSIiLCB5ID0gcm91bmQocG9yY2VudGFqZSwgMiksIGZpbGw9VEVSQ0VSVFJJTUVTVFJFKSkgKyAgICAgZ2VvbV9iYXIoc3RhdCA9ImlkZW50aXR5IiwgY29sb3IgPSAid2hpdGUiKSArIA0KICAgIGdlb21fdGV4dChhZXMobGFiZWwgPSByb3VuZChwb3JjZW50YWplLCAyKSksIHBvc2l0aW9uID0gcG9zaXRpb25fc3RhY2sodmp1c3Q9MC41KSwgY29sb3I9IndoaXRlIiwgc2l6ZSA9IDUsICkgKyANCiAgY29vcmRfcG9sYXIodGhldGEgPSAieSIpICArIA0KICB0aGVtZV92b2lkKCkgKyANCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiU1RFRUxCTFVFIiwgIkJMVUUiLCAiT1JBTkdFIiwgIlJFRCIsIkJST1dOIiwiR1JFRU4iLCAiREFSS0dSRVkiKSkrDQogIGxhYnModGl0bGUgPSAiwr9DdcOhbnRvIGhhIHZpc3RvIHJlZHVjaWRhIHN1IGZhY3R1cmFjacOzbiBlbiBlbCAzVDIwMjA/IikNCmdyYWZpY290cmltZXN0cmUzICsgdGhlbWUocGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfbGluZShsaW5ldHlwZSA9ICJibGFuayIpKSArbGFicyhmaWxsID0gIkZBQ1RVUkFDScOTTiBQRVJESURBIikgDQpgYGANCg0KIyMjIDMuNC4zIENVQVJUTyBUUklNRVNUUkUgREUgMjAyMA0KUG9yIMO6bHRpbW8sIGFuYWxpemFtb3MgZWwgw7psdGltbyB0cmltZXN0cmUgZGVsIGHDsW8sIGVsIGN1YWwgbXVlc3RyYSByZXN1bHRhZG9zIG11eSBwYXJlY2lkb3MgYSBsb3MgZGVsIHRyaW1lc3RyZSBhbnRlcmlvci4gDQpFc3RvIHF1aWVyZSBkZWNpciBxdWUgZHVyYW50ZSBlbCB0cmFuc2N1cnNvIGRlbCBhw7FvIGVsIHBlcXVlw7FvIGNvbWVyY2lvIHZhbGVuY2lhbm8gbm8gcHVkbyByZW1vbnRhciBsYSBzaXR1YWNpw7NuIHByb3ZvY2FkYSBwb3IgbGEgY3Jpc2lzIGRlIGxhIHBhbmRlbWlhLCBxdWUgaW1waWRpw7MgZHVyYW50ZSBsYSBncmFuIHBhcnRlIGRlbCBhw7FvIDIwMjAsIHF1ZSBsb3MgY29tZXJjaW9zIGRlc2Fycm9sbGFyw6FuIHN1IGFjdGl2aWRhZCBjb24gdG90YWwgbm9ybWFsaWRhZCB5IHNpbiByZXN0cmljY2lvbmVzLiANCg0KYGBge3IsIGV2YWwgPSBUUlVFLCBlY2hvID0gVFJVRX0NCnRyaW1lc3RyZXMgPC0gZW5jdWVzdGEgJT4lIGdyb3VwX2J5KENVQVJUT1RSSU1FU1RSRSkgJT4lIHN1bW1hcmlzZShOPW4oKSkgJT4lIG5hLm9taXQoKSAlPiUgYXJyYW5nZShkZXNjKE4pKSAlPiUgbXV0YXRlKHBvcmNlbnRhamU9cHJvcC50YWJsZShOKSoxMDAsIHJvdW5kKHBvcmNlbnRhamUsIDIpKQ0KDQpncmFmaWNvdHJpbWVzdHJlNCA8LSBnZ3Bsb3QodHJpbWVzdHJlcywgYWVzKHg9IiIsIHkgPSByb3VuZChwb3JjZW50YWplLCAyKSwgZmlsbD1DVUFSVE9UUklNRVNUUkUpKSArICAgICBnZW9tX2JhcihzdGF0ID0iaWRlbnRpdHkiLCBjb2xvciA9ICJ3aGl0ZSIpICsgDQogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHJvdW5kKHBvcmNlbnRhamUsIDIpKSwgcG9zaXRpb24gPSBwb3NpdGlvbl9zdGFjayh2anVzdD0wLjUpLCBjb2xvcj0id2hpdGUiLCBzaXplID0gNSwgKSArIA0KICBjb29yZF9wb2xhcih0aGV0YSA9ICJ5IikgICsgDQogIHRoZW1lX3ZvaWQoKSArIA0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCJTVEVFTEJMVUUiLCAiQkxVRSIsICJPUkFOR0UiLCAiUkVEIiwiQlJPV04iLCJHUkVFTiIsICJEQVJLR1JFWSIpKSsNCiAgbGFicyh0aXRsZSA9ICLCv0N1w6FudG8gaGEgdmlzdG8gcmVkdWNpZGEgc3UgZmFjdHVyYWNpw7NuIGVuIGVsIDRUMjAyMD8iKQ0KZ3JhZmljb3RyaW1lc3RyZTQgKyB0aGVtZShwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9saW5lKGxpbmV0eXBlID0gImJsYW5rIikpICtsYWJzKGZpbGwgPSAiRkFDVFVSQUNJw5NOIFBFUkRJREEiKQ0KYGBgDQoNCg0KIyMgMy41IERJR0lUQUxJWkFDScOTTiBERUwgUEVRVUXDkU8gQ09NRVJDSU8NCg0KRW4gZXN0ZSBwdW50bywgdm95IGEgaGFibGFyIGRlIHVub3MgZGUgbG9zIG1heW9yZXMgcHJvYmxlbWFzIGRlbCBwZXF1ZcOxbyBjb21lcmNpbyB5IGRlbCBjb21lcmNpbyB0cmFkaWNpb25hbCBlbiBnZW5lcmFsLCAqKmxhIGRpZ2l0YWxpemFjacOzbioqLiBZIGVzIHF1ZSBlbiBtdWNob3MgY2Fzb3MsIGVsIGNvbWVyY2lvIHRyYWRpY2lvbmFsIGhhIHNpZG8gc29icmVwYXNhZG8gcG9yIGxhcyBudWV2YXMgdGVjbm9sb2fDrWFzLCB5YSBxdWUgYWN0dWFsbWVudGUsIGVzIGRpZmljaWwgdmVyIHBvciBlamVtcGxvLCB1bmEgY2FybmljZXLDrWEgbyB2ZXJkdWxlcsOtYSBkZSB1biBtZXJjYWRvIG11bmljaXBhbCB2ZW5kaWVuZG8gc3VzIHByb2R1Y3RvcyBlbiBpbnRlcm5ldC5DdWxwYSBkZSBlbGxvIGxvIHRpZW5lbiB0YW1iacOpbiBsYXMgZ3JhbmRlcyB0ZWNub2zDs2dpY2FzIGNvbW8gQW1hem9uLCBsYXMgY3VhbGVzIGhhbiBoZWNobyBxdWUgbm9zIGFjb3N0dW1icmVtb3MgYSBpciBkZSBjb21wcmFzIGEgZ29scGUgZGUgImNsaWNrIiBkZXNkZSBlbCBzb2bDoSBkZSBudWVzdHJhIGNhc2EsIGFiYW5kb25hbmRvIGVuIGNpZXJ0byBtb2RvIGVsIGNvbWVyY2lvIGRlbCBiYXJyaW8gZGUgdG9kYSBsYSB2aWRhLiANCg0KYGBge3IsIGV2YWwgPSBUUlVFLCBlY2hvID0gVFJVRX0NCmRpZ2l0YWxpemFjaW9uIDwtIGVuY3Vlc3RhICU+JSBncm91cF9ieShWRU5UQV9PTkxJTkUpICU+JSBzdW1tYXJpc2UgKE49bigpKSAlPiUgbmEub21pdCgpDQpncmFmaWNvZGlnaXRhbGl6YWNpb24gPC0gZ2dwbG90KGRpZ2l0YWxpemFjaW9uLCBhZXMoeD0gVkVOVEFfT05MSU5FLCB5PU4pKSArIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBmaWxsID0ic3RlZWxibHVlIikgKyB0aGVtZV9taW5pbWFsKCkNCmdyYWZpY29kaWdpdGFsaXphY2lvbiArIHRoZW1lKHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2xpbmUobGluZXR5cGUgPSAiYmxhbmsiKSwgDQogICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gTkEpLCANCiAgICBwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoY29sb3VyID0gTkEpKSArbGFicyh0aXRsZSA9ICLCv1N1IG5lZ29jaW8gZGlzcG9uZSBkZSB1biBzZXJ2aWNpbyBkZSB2ZW50YSBvbmxpbmU/IiwgDQogICAgeCA9ICLCv1ZlbnRhIE9ubGluZT8iLCB5ID0gIk7Dum1lcm8gZGUgY29tZXJjaW9zIikNCmBgYA0KQ29tbyBoZSBkaWNobyBhbnRlcmlvcm1lbnRlLCB5IGNvbW8gbXVlc3RyYW4gbG9zIHJlc3VsdGFkb3MsIGFjdHVhbG1lbnRlIGxhIGZhbHRhIGRlIGRpZ2l0YWxpemFjacOzbiBlbiBlbCBzZWN0b3IgY29tZXJjaWFsIHZhbGVuY2lhbm8gZXMgdW4gcmV0byBxdWUgaGF5IHF1ZSBhYm9yZGFyLiBZIGVzIHF1ZSBtw6FzIGRlIDMwMCBjb21lcmNpb3Mgc29uIGxvcyBxdWUgaGFuIGNvbnRlc3RhZG8gcXVlIG5vIGRpc3BvbmVuIGRlIHNlcnZpY2lvIGRlIHZlbnRhIG9ubGluZSwgbWllbnRyYXMgcXVlIHNvbG8gdW4gcG9jbyBtw6FzIGRlIDE1MCBoYW4gc2lkbyBsb3MgcXVlIGhhbiBjb250ZXN0YWRvIHF1ZSBzw60uIA0KDQojIyAzLjYgQVlVREFTIEFMIFBFUVVFw5FPIENPTUVSQ0lPDQoNCkR1cmFudGUgbGEgcGFuZGVtw61hLCBsb3MgZ29iaWVybm9zIGhhbiB0ZW5pZG8gcXVlIHJlY3VycmlyIGEgY2llcnRhcyBheXVkYXMgZGUgYXBveW8gYSBsb3MgZW1wcmVzYXJpb3MgeSBhdXTDs25vbW9zLCB5YSBxdWUgYW50ZSBsYSBvYmxpZ2FjacOzbiBkZSB0ZW5lciBxdWUgY2VycmFyIG9ibGlnYXRvcmlhbWVudGUsIGVsIGdvYmllcm5vIHR1dm8gcXVlIGFwb3lhciBhIGxvcyB0cmFiYWphZG9yZXMgZGUgZGljaG9zIGNvbWVyY2lvcy4NCkRpY2hhcyBheXVkYXMgcG9kZW1vcyBjb25zdWx0YXJsYXMgZW4gbGEgcMOhZ2luYSB3ZWIgZGUgbGEgW0NvbnNlbGxlcmlhIGQnRWNvbm9taWEgZGUgbGEgR2VuZXJhbGl0YXQgVmFsZW5jaWFuYV0oaHR0cDovL3d3dy5pbmRpLmd2YS5lcy9lcy93ZWIvY29tZXJjaW8vaW5jZW50aXZvcykuDQoNCmBgYHtyLCBldmFsID0gVFJVRSwgZWNobyA9IFRSVUV9DQpheXVkYXMgPC0gZW5jdWVzdGEgJT4lIGdyb3VwX2J5KEFZVURBUykgJT4lIHN1bW1hcmlzZShyZXNwdWVzdGFzID0gbigpKSAlPiUgbmEub21pdCgpDQpncmFmaWNvYXl1ZGFzIDwtIGdncGxvdChheXVkYXMsIGFlcyh4PSBBWVVEQVMsIHk9IHJlc3B1ZXN0YXMpKSArIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBmaWxsID0gInN0ZWVsYmx1ZSIpICsgbGFicyh0aXRsZSA9ICLCv0hhIHNvbGljaXRhZG8gYXl1ZGFzIGEgbGFzIEFBUFAgYW50ZSBsYSBjcmlzaXMgZGVsIENPVklEMTk/IikgKyB0aGVtZV9taW5pbWFsKCkgKyBnZW9tX3RleHQoYWVzKGxhYmVsPXJlc3B1ZXN0YXMpLCBwb3NpdGljaW9uID0gcG9zaXRpb25fc3RhY2sodmp1c3QgPSAwLjUpLCBjb2xvciA9ICJibGFjayIsIHNpemUgPSA0KQ0KZ3JhZmljb2F5dWRhcw0KYGBgDQpDb21vIHZlbW9zLCAzODYgaGFuIHNvbGljaXRhZG8gYXl1ZGFzLCBtaWVudHJhcyBxdWUgNDQgZGUgbG9zIHF1ZSBzaSBxdWUgaGFuIHNvbGljaXRhZG8sIG5vIGxhcyBoYWJpYW4gcmVjaWJpZG8gZW4gZWwgbW9tZW50byBkZSBsYSBjb250ZXN0YWNpw7NuIGRlIGxhIGVuY3Vlc3RhLiBQb3Igc3UgcGFydGUgMTQ3IGNvbWVyY2lhbnRlcyBubyBwaWRpZXJvbiBuaW5nw7puIHRpcG8gZGUgYXl1ZGEuIA0KDQpFbiBlbCBzaWd1aWVudGUgZ3LDoWZpY28sIGhlbW9zIHByZWd1bnRhZG86ICoqwr9MZSBwYXJlY2VuIHN1ZmljaWVudGVzIGxhcyBheXVkYXMgcmVjaWJpZGFzIHBvciBsYXMgQUFQUD8qKi4gUHJlZ3VudGEsIGEgbGEgcXVlIGNvbW8gZXMgZGUgZXNwZXJhciBjdWFuZG8gYWxndWllbiB0aWVuZSBxdWUgdmFsb3JhciBsYSBjdWFudMOtYSBkZSB1bmEgYXl1ZGEgZWNvbsOzbWljYSwgaGFuIHJlc3BvbmRpZG8gZGUgZm9ybWEgbWF5b3JpdGFyaWEgcXVlIG5vIGhhbiBzaWRvIHN1ZmljaWVudGVzLiANCg0KYGBge3IsIGV2YWwgPSBUUlVFLCBlY2hvID0gVFJVRX0NCmF5dWRhczEgPC0gZW5jdWVzdGEgJT4lIGdyb3VwX2J5KEFZVURBX1NVRklDSUVOVEUpICU+JSBzdW1tYXJpc2UocmVzcHVlc3RhcyA9IG4oKSkgJT4lIG5hLm9taXQoKSAlPiUgbXV0YXRlKHBvcmNlbnRhamU9cHJvcC50YWJsZShyZXNwdWVzdGFzKSoxMDAsIHJvdW5kKHBvcmNlbnRhamUsIDIpKQ0KZ3JhZmljb2F5dWRhczEgPC0gZ2dwbG90KGF5dWRhczEsIGFlcyh4PSIiLCB5ID0gcm91bmQocG9yY2VudGFqZSwgMiksIGZpbGw9QVlVREFfU1VGSUNJRU5URSkpICsNCiAgICBnZW9tX2JhcihzdGF0ID0iaWRlbnRpdHkiLCBjb2xvciA9ICJ3aGl0ZSIpICsNCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcm91bmQocG9yY2VudGFqZSwgMikpLCBwb3NpdGlvbiA9IHBvc2l0aW9uX3N0YWNrKHZqdXN0PTAuNSksIGNvbG9yPSJ3aGl0ZSIsIHNpemUgPSA1LCApICsNCiAgY29vcmRfcG9sYXIodGhldGEgPSAieSIpICsgdGhlbWVfdm9pZCgpICANCmdyYWZpY29heXVkYXMxK2xhYnModGl0bGUgPSAiwr9Db25zaWRlcmEgc3VmaWNpZW50ZXMgbGFzIGF5dWRhcyByZWNpYmlkYXM/IikNCmBgYA0KDQojIyAzLjcgQ0lFUlJFIERFIExPUyBDT01FUkNJT1MgREVCSURPIEEgTEEgUEFOREVNSUENCg0KQ29tbyBoZSBtZW5jaW9uYWRvIGFudGVyaW9ybWVudGUsIGxvcyBuZWdvY2lvcyBzZSB2aWVyb24gb2JsaWdhZG9zIGEgY2VycmFyIGVuIGxhIHByaW1lcmEgb2xhIGRlIGxhIHBhbmRlbWlhIGRlYmlkbyBhIGxhcyByZXN0cmljY2lvbmVzIGRlIG1vdmlsaWRhZCBpbXB1ZXN0YXMgcG9yIGVsIGdvYmllcm5vIGNlbnRyYWwuIA0KRXN0ZSBjaWVycmUgZnVlIGVuIGNpZXJ0YSBtZWRpZGEgYXNpbcOpdHJpY28geSBkZXBlbmRpw7MgcHJpbmNpcGFsbWVudGUgZGVsIHRpcG8gZGUgbmVnb2Npby4gDQoNCmBgYHtyLCBldmFsID0gVFJVRSwgZWNobyA9IFRSVUV9DQpjaWVycmUgPC0gZW5jdWVzdGEgJT4lIGdyb3VwX2J5KFRJRU1QT19DRVJSQURPKSAlPiUgc3VtbWFyaXNlKG9ic2VydmFjaW9uZXMgPSBuKCkpICU+JSBuYS5vbWl0KCkgJT4lIGFycmFuZ2UoLW9ic2VydmFjaW9uZXMpDQpncmFmaWNvY2llcnJlIDwtIGdncGxvdChjaWVycmUsIGFlcyh4ID0gVElFTVBPX0NFUlJBRE8sIHkgPSBvYnNlcnZhY2lvbmVzKSkgKyANCiAgICAgICAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIGZpbGwgPSAiYnJvd24iKSArDQogICAgICAgIGxhYnModGl0bGUgPSAiwr9DdcOhbnRvIHRpZW1wbyBoYSBlc3RhZG8gc3UgbmVnb2NpbyBjZXJyYWRvIGRhZGEgbGEgY3Jpc2lzIGRlbCBDT1ZJRDE5PyIsIHggPSAiVGllbXBvIGNlcnJhZG8iLCB5ID0gIk9ic2VydmFjaW9uZXMiKSArIHRoZW1lX21pbmltYWwoKQ0KZ3JhZmljb2NpZXJyZQ0KYGBgDQoNCkNvbW8gb2JzZXJ2YW1vcywgbGEgZ3JhbiBtYXlvcsOtYSBkZSBjb21lcmNpb3MgZXN0dXZpZXJvbiBjZXJyYWRvcyBkb3MgbWVzZXMgbyBtw6FzLiBzaWVuZG8gdW4gdG90YWwgZGUgbcOhcyBkZSA0MDAgZW5jdWVzdGFkb3MgbG9zIHF1ZSBlc3R1dmllcm9uIGNlcnJhZG9zIGRpY2hvIHRpZW1wby4NClBvciBjb250cmEgbWVub3MgZGUgNzUgY29tZXJjaW9zIGhhbiBlc3RhZG8gY2VycmFkb3MgdW4gbWVzIG8gbWVub3MuIEVzdG9zIHJlc3VsdGFkb3MgYXJyb2phbiB1bmEgc2l0dWFjacOzbiBtw6FzIHF1ZSBwcmVvY3VwYW50ZSwgeWEgcXVlIGVsIGNvbWVyY2lvIHZhbGVuY2lhbm8gZXN0w6Egc3VmcmllbmRvIHNlcmlhcyBkaWZpY3V0bGFkZXMgcGFyYSByZW1vbnRhciBkaWNoYSBzaXR1YWNpw7NuIG5lZ2F0aXZhLiANCg0KDQpDb24gbG9zIHJlc3VsdGFkb3Mgb2J0ZW5pZG9zLCBlc3TDoSBjbGFybyBxdWUgbXVjaG9zIGRlIGxvcyBlbmN1ZXN0YWRvcyBoYW4gdGVuaWRvIHNlcmlhcyBkaWZpY3VsdGFkZXMgZWNvbsOzbWljYXMgZGFkYXMgbGFzIHJlc3RyaWNjaW9uZXMgcXVlIG9ibGlnYWJhbiBhIGNlcnJhciBjdWFscXVpZXIgbmVnb2NpbyBjb25zaWRlcmFkbyBubyBlc2VuY2lhbC4gDQpBbnRlIGVzdG9zIHJlc3VsdGFkb3MgZG9uZGUgaGVtb3MgdmlzdG8gcXVlIGdyYW4gY2FudGlkYWQgZGUgbmVnb2Npb3MgaGFuIHBlcm1hbmVjaWRvIGNlcnJhZG9zIHVuIHRpZW1wbyBtw6FzIHF1ZSBzaWduaWZpY2F0aXZvLiBFcyBpbmV2aXRhYmxlIGFuYWxpemFyIGxhIGN1ZXN0acOzbiBkZSBjdcOhbnRvcyBkZSBlbGxvcyBzZSBoYW4gcGxhbnRlYWRvIGVsIGNpZXJyZSBkZSBzdXMgbmVnb2Npb3MgZGFkYSBsYSBzaXR1YWNpw7NuLiANCg0KYGBge3IsIGVjaG8gPSBUUlVFLCBldmFsID0gVFJVRX0NCmNlc2UgPC0gZW5jdWVzdGEgJT4lIGdyb3VwX2J5KENJRVJSRSkgJT4lIHN1bW1hcmlzZShvYnNlcnZhY2lvbmVzID0gbigpKSAlPiUgbmEub21pdCgpICU+JSBtdXRhdGUocG9yY2VudGFqZT1wcm9wLnRhYmxlKG9ic2VydmFjaW9uZXMpKjEwMCwgcm91bmQocG9yY2VudGFqZSwgMikpDQoNCmdyYWZpY29jZXNlIDwtICBnZ3Bsb3QoY2VzZSwgYWVzKHg9IiIsIHkgPSByb3VuZChwb3JjZW50YWplLCAyKSwgZmlsbD1DSUVSUkUpKSArDQogICAgZ2VvbV9iYXIoc3RhdCA9ImlkZW50aXR5IiwgY29sb3IgPSAid2hpdGUiKSArDQogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHJvdW5kKHBvcmNlbnRhamUsIDIpKSwgcG9zaXRpb24gPSBwb3NpdGlvbl9zdGFjayh2anVzdD0wLjUpLCBjb2xvcj0id2hpdGUiLCBzaXplID0gNSwgKSArDQogIGNvb3JkX3BvbGFyKHRoZXRhID0gInkiKSArIHRoZW1lX3ZvaWQoKSANCmdyYWZpY29jZXNlICsgbGFicyAodGl0bGUgPSAiwr9TZSBoYSBwbGFudGVhZG8gY2VycmFyIGRlIGZvcm1hIHBlcm1hbmVudGUgc3UgbmVnb2NpbyBkYWRhIGxhIHNpdHVhY2nDs24/IikNCmBgYA0KRW4gZXN0ZSBncsOhZmljbyBzZSBtdWVzdHJhIHVuYSByZWFsaWRhZCBtw6FzIHF1ZSBwcmVjdXBhbnRlLCB5YSBxdWUgZWwgNDUlIGRlIGxvcyBlbmN1ZXN0YWRvcyBoYW4gY29udGVzdGFkbyBxdWUgc2UgaGFuIHBsYW50ZWFkbyBjZXJyYXIgZGUgZm9ybWEgcGVybWFuZW50ZSBzdSBuZWdvY2lvLiANCkVzdG8gcmVmbGVqYSBxdWUgbGEgc2l0dWFjacOzbiBkZWwgcGVxdWXDsW8gY29tZXJjaW8gdmFsZW5jaWFubyBlcyBnZW5lcmFsbWVudGUgcG9jbyBzb2x2ZW50ZSB5IGNvbiBwb2NvIG1hcmdlbiBkZSBtYW5pb2JyYS4gDQoNCiMjIDMuOCBDQU1QQcORQSBERSBOQVZJREFEDQoNCkFudGUgbGFzIGRpZmljdWx0YWRlcyBzdWZyaWRhcyBlbiBsYSBwcmltZXJhIG1pdGFkIGRlbCBhw7FvIDIwMjAsIGxhIGNhbXBhw7FhIGRlIE5hdmlkYWQgdGVuw61hIHVuYSBpbXBvcnRhbmNpYSBlbiBhbGd1bm9zIGNhc29zIHZpdGFsIHBhcmEgZWwgY29tZXJjaW8gdmFsZW5jaWFubywgeWEgcXVlIHBvZMOtYSBzZXIgbGEgY2xhdmUgcGFyYSByZW1vbnRhciBsb3MgcmVzdWx0YWRvcyBlY29uw7NtaWNvcyB0YW4gbWFsb3MgZGUgbG9zIG1lc2VzIGFudGVyaW9yZXMuDQoNCmBgYHtyLCBlY2hvID0gVFJVRSwgZXZhbCA9IFRSVUV9DQpuYXZpZGFkIDwtIGVuY3Vlc3RhICU+JSBncm91cF9ieShJTVBPUlRBTkNJQV9OQVZJREFEKSAlPiUgc3VtbWFyaXNlKGltcG9ydGFuY2lhID0gbigpKSAlPiUgbmEub21pdCgpDQpncmFmaWNvbmF2aWRhZCA8LSBnZ3Bsb3QobmF2aWRhZCwgYWVzKHggPSBJTVBPUlRBTkNJQV9OQVZJREFELCB5ID0gaW1wb3J0YW5jaWEpKSArIA0KICAgICAgICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgZmlsbCA9ICJyZWQiKSArDQogICAgICAgIGxhYnModGl0bGUgPSAiwr9RdcOpIGltcG9ydGFudGUgdmEgYSBzZXIgbGEgY2FtcGHDsWEgZGUgTmF2aWRhZCBlbiBzdSBOZWdvY2lvPyIsIHggPSAiSW1wb3J0YW5jaWEgY2FtcGHDsWEgTmF2aWRhZCIsIHkgPSAib2JzZXJ2YWNpb25lcyIpICsgdGhlbWVfbWluaW1hbCgpDQpncmFmaWNvbmF2aWRhZA0KYGBgDQpDb21vIHBvZGVtb3MgY29tcHJvYmFyIGVuIGVsIGdyw6FmaWNvLCBsYSBtYXlvcsOtYSBkZSBsYXMgY29udGVzdGFjaW9uZXMgZXMgcXVlIGxhIGNhbXBhw7FhIGRlIE5hdmlkYWQgZXJhIG11eSBpbXBvcnRhbnRlIG8gaW1wb3J0YW50ZSBwYXJhIHN1IGNvbWVyY2lvLiANCkFob3JhIGJpZW4sIHNhYmllbmRvICphIHBvc3RlcmlvcmkqIGNvbW8gaGEgaWRvIGRpY2hhIGNhbXBhw7FhLCBlcyBkZSBlc3BlcmFyIHF1ZSBlbCBwZXF1ZcOxbyBjb21lcmNpbyB2YWxlbmNpYW5vIGVzdMOpIHBhc2FuZG8gdW4gY29taWVuem8gZGUgYcOxbyAyMDIxIGVjb27Ds21pY2FtZW50ZSBjb21wbGljYWRvLiANCg0KIyA0LiBDT05DTFVTSU9ORVMNCg0KQSBtb2RvIGRlIGNvbmNsdXNpw7NuLCBjb21vIGhlbW9zIHZpc3RvIGEgbG8gbGFyZ28gZGUgZXN0ZSB0cmFiYWpvLCBlbCBwZXF1ZcOxbyBjb21lcmNpbyB2YWxlbmNpYW5vIGhhIHNpZG8gdW4gc2VjdG9yIGVsIGN1YWwgaGEgc2lkbyBtdXkgY2FzdGlnYWRvIHBvciBsYSBjcmlzaXMgZWNvbsOzbWljYSBwcm92b2NhZGEgcG9yIGxhIHBhbmRlbWlhIGRlbCBDT1ZJRDE5LiANCkVsIHRpZW1wbyBxdWUgdHV2aWVyb24gcXVlIGNlcnJhciBjb21vIHN1IHNpdHVhY2nDs24gcHJldmlhIGRlIGZhbHRhIGRlIGxpcXVpZGV6IGV4Y2VzaXZhIHkgZGUgc29sdmVuY2lhLCBoaWNpZXJvbiBxdWUgYW50ZSBkaWNoYSBjcmlzaXMgbG9zIGNvbWVyY2lvcyBubyBlc3R1dmllcmFuIHRvZG8gbG8gYmllbiBkZSBwcmVwYXJhZG9zIHF1ZSBsYSBzaXR1YWNpw7NuIHJlcXVlcsOtYS4gDQpEZSB0b2RhcyBmb3JtYXMgbGFzIGF5dWRhcyBkZSBsb3MgZGlmZXJlbnRlcyBnb2JpZXJub3MsIGF1bnF1ZSBlbiBtdWNob3MgY2Fzb3MsIHNlIGhhbiBjb25zaWRlcmFkbyBpbnN1ZmljaWVudGVzLCBoYW4gYXl1ZGFkbyBhIG1pdGlnYXIgZWwgaW1wYWN0byBuZWdhdGl2byBkZSBsYSBjcmlzaXMuIA0KDQoNCiMgNS4gQklCTElPR1JBRsONQQ0KDQoqW3dlYiBkZWwgcHJvZmVzb3JdKGh0dHBzOi8vcGVyZXpwNDQuZ2l0aHViLmlvL2ludHJvLWRzLTIwLTIxLXdlYi8wNS1zbGlkZXMuaHRtbCkuDQoNCipbcMOhZ2luYSBkw7NuZGUgYXByZW5kZXIgYSBoYWNlciBncsOhZmljb3MgZGUgcXVlc2l0b3NdKGh0dHBzOi8vcnB1YnMuY29tL2x1aXNfYm9sYW5vcy81Mzc4OTkpLg0K