Proyecto realizado para la asignatura’’Programación y manejo de datos en la era del Big Data" impartida por el profesor Pedro J. Pérez en el Grado de Economía de la Universidad de Valencia. La página web de la asignatura se puede ver aquí . Los trabajos elaborados por nuestros compañeros de curso pueden verse aquí


1.Introducción

La palabra crimen se refiere a una acción voluntaria de herir gravemente o asesinar a alguien. Como es de suponerse, hay diversos tipos y diversos niveles de gravedad de crímenes : mientras que algunos son robos o hurtos , otros pueden ser realmente flagrantes ataques contra la integridad humana como el abuso sexual , la tortura y el asesinato.

2.Crimen mundial

Según los datos de la Oficina de las Naciones Unidas contra la Droga y el Delito (UNODC , por sus siglas en inglés) , cuya página oficial se puede ver aquí , señalan que en el mundo se producen más muertes por homicidios intencional que por conflictos armados y terrorismo juntos – 464.000 víctimas de homicidio, 89.000 de conflictos armados y 26.000 de actos terroristas en 2017.- Los altos niveles de conflicto armado e inseguridad tienen un impacto destructivo en el desarrollo de un país y afectan al crecimiento económico. En la Agenda 2030 de la ONU , se encuentra un claro entendimiento de que los derechos humanos, la paz y la seguridad y el desarrollo están profundamente interrelacionadas y se refuerzan mutuamente. En su totalidad, se refleja la importancia de mejorar el acceso a la justicia,garantizar la seguridad y la protección y promover los derechos humano para el desarrollo sostenible.Todos los objetivos planteados por la ONU se pueden ver aquí Para abordar estos desafíos y construir sociedades más pacíficas e inclusivas, es necesario que se establezcan regulaciones más eficientes y transparentes y presupuestos gubernamentales completos y realistas. Uno de los primeros pasos hacia la protección de los derechos individuales es la creación de instituciones nacionales de derechos humanos más independientes en todo el mundo. No obstante, la tendencia muestra que el Objetivo de Desarrollo Sostenible fijado por la ONU para 2030 que pretende reducir significativamente todas las formas de violencia está lejos de ser cumplido. El riesgo de sufrir un asesinato ha caído en las últimas décadas ―en 2017 se produjeron 6,1 homicidios por cada 100.000 habitantes en el mundo, mientras que en 1993 fueron 7,4―, pero en realidad ese descenso está asociado al crecimiento demográfico y no a un cese de la violencia. Esto es, la población mundial ha aumentado un ritmo mayor que el de asesinatos. Además, en los últimos años se ha producido un repunte que choca frontalmente con el objetivo de las Naciones Unidas, ya que entre 2015 y 2017 los homicidios han aumentado un 4% a nivel mundial.

Sin embargo, no todas las regiones se enmarcan dentro de la misma tendencia.

2.1.Casos de crimenes por continente

#Paquetes utilizados
library(ggplot2)
library(plotrix)
# Creamos los datos

x <-  c(17.2,13,2.3,3,2.8)
lbl <-  c("America","Africa","Asia","Europa", "Oceania")


piepercent<- round(100*x/sum(x), 1)


pie3D(x, labels = piepercent, main = "Casos de homicidios por continente en %",explode=0.1, edges = 10,border = "black", col = rainbow(length(x)))
legend("top", c("America","Africa","Asia","Europa","Oceania"), cex = 0.5,
   fill = rainbow(length(x)))

Europa ha disminuido su tasa de homicidios en un 63% desde 2002 y Asia un 36% desde 1990. Pero las Américas siguen reportando altos índices de criminalidad, al igual que África. Como podemos ver en el gráfico, con datos proporcionados de UNODC , el caso de América es especialmente preocupante ya que, a pesar de contar con el 13% del total de la población mundial, reporta el 44.9% de homicidios internacionales. Después de América, se sitúa África con casi 34%. Las regiones donde menos homicidios se producen es en Asia, seguida de Oceanía y Europa.

2.2. Países más peligrosos

#Paquetes

library(tidyverse)
library(ggplot2)
library(magick)
library(cowplot)

#Seleccionar países

world <- map_data("world") %>% mutate(color = case_when(region == "Venezuela" ~ 1,
                                                        region == "South Africa" ~ 2,
                                                        region == "El Salvador" ~ 3,
                                                        region == "Afghanistan" ~ 4,
                                                        region == "Brazil" ~ 5,
                                                        region == "Guyana" ~ 6,
                                                        region == "Jamaica" ~ 7,
                                                        region == "Honduras" ~ 8,
                                                        region == "Mexico" ~ 9)) %>% mutate(color = if_else(is.na(color),0,color))

# Capitales de los paises

ciudades <- c("Caracas","Ciudad del Cabo","San Salvador","Kabul","Brasilia","Georgetown","Kingston","Tegucigalpa","Mexico City")
lat <- c(6.1975098,-33.09600,14.03208,31.66738,-14.030664,4.236475,18.50068,15.78618,20.84380)
long <- c(-68.14307,27.76211,-88.70761,68.97343,-38.94233,-58.01074,-77.92686,-88.01040,-105.45634)

coordciudades <- data.frame(ciudades,lat,long)


#Mostralas en el mapa

lineas <- data.frame(id = c("Caracas","Ciudad del Cabo","San Salvador","Kabul","Brasilia","Georgetown","Kingston","Tegucigalpa","Mexico City"),
                     lat_1 = c(6.1975098,-33.09600,14.03208,31.66738,-14.030664,4.236475,18.50068,15.78618,20.84380),
                     long_1 = c(-68.14307,27.76211,-88.70761,68.97343,-38.94233,-58.01074,-77.92686,-88.01040,-105.45634),
                     lat_2 = c(14,-33,20,40,-20,10,30,-5,24),
                     long_2 = c(-63,40,-81, 80,-30,-40,-60,-99,-130 ))
#A continuación importamos las fotos con ''image_read'' y el link directo de la foto. Este procedimiento se realiza para cada uno de los países.

#Juntamos el mapa creado con las imágenes importadas
mapasi <- ggplot() + geom_map(data = world, map = world, aes(long, lat, map_id = region), color = "#010101", fill = "#FAF168") +
                    geom_map(data = world %>% filter(color==1), map = world, aes(long, lat, map_id = region), color = "#000000", fill = "red") +
                    geom_map(data = world %>% filter(color==2), map = world, aes(long, lat, map_id = region), color = "#000000", fill = "yellow") +
                    geom_map(data = world %>% filter(color==3), map = world, aes(long, lat, map_id = region), color = "#000000", fill = "#9d05ff") +
                    geom_map(data = world %>% filter(color==4), map = world, aes(long, lat, map_id = region), color = "#000000", fill = "#ab6800") +
                    geom_map(data = world %>% filter(color==5), map = world, aes(long, lat, map_id = region), color = "#000000", fill = "#241414") +
                    geom_map(data = world %>% filter(color==6), map = world, aes(long, lat, map_id = region), color = "#000000", fill = "#004dff") +
                    geom_map(data = world %>% filter(color==7), map = world, aes(long, lat, map_id = region), color = "#000000", fill = "#F781CE") +
                    geom_map(data = world %>% filter(color==8), map = world, aes(long, lat, map_id = region), color = "#000000", fill = "#a4034b") +
                    geom_map(data = world %>% filter(color==9), map = world, aes(long, lat, map_id = region), color = "#000000", fill = "#238a00") +
                    geom_segment(data = lineas, aes(x = long_1, y = lat_1, xend = long_2, yend = lat_2), color = "#000000", size = 2, alpha = 0.8, lineend = "round") +
                    geom_point(data = coordciudades, aes(x = long,y = lat), size = 2) +
                    ylim(-55,NA) +
                    theme(panel.background = element_rect(fill = "#FCDFDF"), panel.grid = element_line(colour = "#000000"), axis.title = element_blank(),
                    axis.text = element_blank(), axis.ticks = element_blank())

En base a los datos del Ministerio de Asuntos Exteriores y del** Índice de paz global** publicado por el Institute of Economics and Peace en 2018,podemos observar en el mapa los países más peligrosos. Este índice es útil sobre todo para mirar la evolución del nivel de paz en un país a lo largo del tiempo. El IPG utiliza 23 indicadores cualitativos y cuantitativos de fuentes muy respetadas y mide el estado de la paz en tres ámbitos temáticos: el grado de seguridad y protección social, el grado de conflictos internos e internacionales activos y el grado de militarización. Como podemos observar, la mayoría de los países considerados más ‘’violentos’’ se encuentran en América Central y Latina. Estos países son : Venezuela , El Salvador, Brasil , Guyana , Jamaica, Honduras y México. Los otros países ‘’peligrosos’’ son Sudáfrica ( África) y Afganistán (Asia).

2.3. Países más seguros

#Importamos datos y los arreglamos
url87 <- "https://raw.githubusercontent.com/Pavlinadinkova/Criminalidad/main/paises.csv"
seguros <- rio::import(url87 , setclass = "tibble")

names(seguros)= c("Ranking","Pais","Criminalidad","Seguridad")
seguros <- seguros %>% mutate( Seguridad = stringr::str_remove_all(Seguridad, pattern = "([.])"))
seguros <- seguros %>% mutate( Seguridad = stringr::str_replace_all(Seguridad , pattern = "[,]" , replacement = "." ))
seguros <- seguros %>% mutate( Seguridad = as.numeric(Seguridad))

seguros <- seguros %>% select(Pais, Seguridad)
#Creamos círculos

pck <-circleProgressiveLayout(seguros$Seguridad, sizetype = 'area')

mydata<- cbind(seguros, pck)

myPlotCord <- circleLayoutVertices(pck)

pl <- ggplot()

pl <- pl + geom_polygon(data = myPlotCord, aes(x, y, group = id, fill=as.factor(id)), colour = "black", alpha = 0.6)
pl <- pl+ geom_text(data = mydata, aes(x, y, size=Seguridad, label = Pais)) + scale_size_continuous(range = c(1,4)) + theme_void() +  theme(legend.position="none") + coord_equal()


plotly::ggplotly(pl)

Si bien algunas regiones han caído en ciclos aparentemente interminables de violencia y conflicto, otras disfrutan de un nivel sostenido de paz, seguridad y prosperidad.

A continuación podemos observar la clasificación de los países según el Índice de Seguridad. Dicho índice ordena los países del mundo según un escalafón del 0 al 100. Se toman en consideración factores como el nivel de delincuencia, seguridad a la hora de caminar solo/a por la calle de día y de noche, atracos, robos de automóviles y en los hogares, crímenes violentos y más. En las primeras posiciones en lo que respecta a seguridad corresponden a naciones de Asia. Estas son Qatar con 88.10 puntos, Taiwán (84.7) , Emiratos Árabes Unidos (84.5) , Georgia(79.5), Omán(79.3), y Hong Kong (79). En cuanto al continente europeo, todos los países se ubican sobre la media global en cuanto a seguridad. Entre los mejores están Eslovenia con 79 puntos, siendo el país más seguro del mundo fuera de Asia. Le sigue Suiza con 78.4 puntos. España se sitúa en el puesto 37º con 67.6 puntos. En lo que respecta a América, pocos países han logrado estar sobre la media global en cuanto a seguridad. Únicamente Cuba (70.9) , Canadá (59.3) y Nicaragua(54.5).

3.Poblaciones con más presos

Países

Alrededor del mundo existen unas 11 millones de personas encarceladas, ya sea que estén esperando un juicio, detenidos, sentenciados o convictos.

En los sistemas judiciales a nivel mundial, los ciudadanos que sean encontrados culpables de diversos delitos pueden cumplir la pena correspondiente a la falta, establecida en los códigos penales, con el internamiento del reo en un establecimiento penitenciario.

Como puede ser previsible, a mayor número de población que tiene un país, mayores probabilidades existen de que, cuantitativamente, haya cientos de miles de sus habitantes encarcelados. Sin embargo, que exista correlación entre población total y población encarcelada no quiere decir que haya excepciones o ejemplos que evidencien situaciones concretas, por no decir anormales.

Este es el caso de Estados Unidos, que a pesar de ser el tercer país más poblado del mundo con cerca de 330 millones de habitantes-pero muy lejos de India y China-, es el país que mayor población carcelaria tiene. Según World Prison Brief , en 2018 tuvo 2.121.600 personas en prisión. El motivo principal de este sobredimensionamiento es la dura política judicial en el país, con penas muy elevadas y poco orientada a la reinserción frente a una perspectiva punitiva muy asentada.

Después de EEUU, se sitúa China , que a pesar de ser el primer país mundial en cuanto a número de habitantes, se sitúa bastante por detrás de EEUU. En 2018, China tuvo 1.649.804 personas en la carcel. No obstante, el World Prison Brief advierte que estos datos sólo incluyen a los que ya fueron sentenciados y se dejan fuera otras personas que están en procesos judiciales.

Otro dato que llama la atención es India, que es el segundo país más poblado , sin embargo, es el quinto en cuanto a personas encarceladas, con 419.623 en 2018.

En el continente europeo, Rusia es el país que más personas privadas de su libertad hay-567.789.-

España ,en el mes de Diciembre de 2018 tuvo en total 48.348 personas encarceladas, según los datos provenientes del Ministerio del Interior.

Código

#poblacion carcelaria
url2 <- "https://raw.githubusercontent.com/Pavlinadinkova/Criminalidad/main/poblacion_carcelaria.csv"

paises<- rio::import(url2, setclass="tibble") %>% mutate(Pais = c(1:15),Country = factor(Country, levels = Country[order(Number, decreasing = TRUE)]), Number = stringr::str_remove_all(Number, pattern = "[^[:alnum:]]"), Number = as.numeric(Number), )

pl <- ggplot(paises, aes(x=Country, y=Number)) + geom_point(aes(color=Country), size=3) + geom_segment(aes(x=Country, xend= Country, y=0, yend= Number, color=Country))+geom_text(aes(label=Country), size=3, angle=90, vjust=1, nudge_y =0) +theme(legend.position="none")+ labs(y="Número de carcelarios", x=NULL,title = "Poblaciones con más presos", subtitle = "Datos de 2018" , caption= "Fuente:FRED")+ theme(axis.text.x = element_blank(),axis.line = element_line(color = "brown",size=0.5), axis.ticks.x = element_blank(), panel.background = element_rect(fill = "#F0EE84"), panel.grid.major.y = element_line("grey"), panel.grid.major.x = element_blank(), panel.grid.minor.y = element_blank())

4.Asesinos

*Asesinos

En el gráfico que vemos a continuación , podemos ver algunos de los asesinos en serie según el número confirmados de víctimas. No obstante, existen numerosas víctimas sospechadas, que están sin confirmar. Los asesinos en serie asesinan a tres o más personas en dos o más eventos separados.

  • Thug Behram (India) : Conocido como ‘’El rey de los matones’’, fue también uno de los asesinos en serie más prolíficos de la historia. Era el líder de una secta llamada ‘’Thugs’’ , considerada la primera mafia del mundo que operó en India. Los participantes de la secta conseguían hacer falsas amistades con los peregrinos hasta ganarse su confianza. Cuando los peregrinos les permitían unirseles en su travesía, el grupo de los ‘’thugs’’ los mataban tras robarlos. Ellos les estrangulaban con un pañuelo ceremonial llamado rumal , y escondían los cadáveres enterrándolos o arrojándolos dentro de algún pozo. Behram fue ejecutado en 1840 por ahorcamiento.
  • Alexe Popova (Russia) : Inuaguró el asesinato serial como una reivindicación de género extrema. Creó la primera agencia matrimonial de la historia con el slogan ’’Liberar a esposas infelices de sus esposos tiranos’’. Su estrategia de negocio era aplicar tarifas mínimas al alcance de cualquier bolsillo, y arsénico como vehículo mortal. Usaba el metaloide, uno de los venenos más mortales. Fue fusilada en San Petersburgo en 1909.
  • Harold Shipman (Reino Unido) : Conocido como Doctor Muerte , y mataba a sus víctimas inyectándoles sobredosis de morfina. Solía elegir a personas indefensas, de edad avanzada, en su mayoría mujeres que sobrepasaban los 75 años. El propio Shipman extendía los certificados de defunción poniéndoles como causa de muerte por vejez. En el año 2000, fue condenado a 1000 años de prisión con cadenas perpetuas. No obstante, murió en 2004 ahorcándose en su celda de prisión.
  • Mariam Soulakiotis ( Grecia) : Madre Superiora de una orden de monjas ilegalmente establecida llamadas “Las Calendarista” separadas de la Iglesia Ortodoxa, en Grecia. Su modus operandis era alentar a las mujeres adineradas a unirse al convento y luego torturarlas hasta que donaran sus fortunas al monasterio. Una vez los donaban, Soulakiotis las mataba. También engañó a muchos de sus nuevos reclutas para que cedieran sus propiedades a su nombre, ya que los convenció de que esta era la mejor manera de entrar al cielo. Fue sentenciada únicamente a 16 años de prisión, sin embargo murió en la cárcel con una gran fortuna.
  • Luis Alfredo Garavito ( Colombia) : era conocido como La Bestia. Antes de cumplir los 18 años, fue detenido por la policia al intentar abusar de un niño. Tras este momento empezó a violar niños. Fue internado varias veces en hospitales psiquiatricos, pero a pesar de ello, siguió vilando y torturando a decenas de niños. A los 36 años comenzó con los asesinatos. En 2001, fue sentenciado a 1853 años y 9 días de cárcel, la condena más alta de la que se tenga registro en Colombia,​ aunque posteriormente fue conmutada a 40 años, por su colaboración y buen comportamiento.
  • Pedro Alonso López (Colombia) . Conocido como el Monstruo de los Andes. Pedro viajó por Perú, y había empezado a atacar violentamente y asesinar a niñas de las tribus locales. Luego hizo viajes por Ecuador , donde los casos de desaparición de muchachas aumentaron. Tras violar, estrangular y matar a sus víctimas, practicaba necrofilia con sus cuerpos ya sin vida, y los terminaba escondiendo o enterrando para no ser descubiertas. Un error de Pedró le llevó directamente a su detención. Pillaron al criminal con las manos en la masa mientras secuestraba en un supermercado a Marie, una niña de 12 años. Los gritos de su madre alertaron a los empleados del local que lograron darle caza. Le condenaron a 16 años de prisión. Sin embargo, al final le impusieron una fianza de cincuenta dolares y la obligación de un tratamiento psiquiátrico y su posterior seguimiento mensual. Una vez en libertad, desapareció en 1998. En 2002 la Interpol emitió una orden de búsqueda y captura contra el colombiano , pero sin embargo, sigue en libertad.
  • Miyuki Ishikawa (Japón) : Conocida como la Matrona demoníaca, mataba a los recién nacidos para salvarles de una vida de miseria y pobreza. Incluso había padres que acudían a ella con el fin de que hiciera algo, ya que no podían alimentar a su hijo. Sus prácticas no eran tan secretas, sin embargo,nadie realmente hizo nada para detenerla. Su marido, el DR. Nakayama era quién se encargaba de hacer los certificados de defunción falsos. Sin embargo en 1948 la policía la detuvo, tras haber encontrado los restos de bebés y tras la autopsia, se descubrió que no habían muerto por causas naturales. A pesar de todo, sólo fue condenada a 8 años de prisión por delito de omisión, y no por asesinato.

Código


#Personas

url <- "https://raw.githubusercontent.com/Pavlinadinkova/Criminalidad/main/personas.csv"

personas <- rio::import(url, setclass = "tibble")
persona1 <- personas 

names(persona1)= c("Persona","Cantidad")

persona1 <- persona1 %>%  arrange(desc(Cantidad))


plot <- persona1 %>%  ggplot(aes(x=reorder(Persona, Cantidad) ,y=Cantidad),aes(fct_rev(Persona)))+ coord_flip() +  geom_bar(color = "#000000",fill = "#7FF364",stat="identity", width = 0.5) + geom_text(size = 4, stat = "identity", aes(label= Cantidad), hjust= 1) +  labs(fill=NULL,
               x= NULL,
               y=NULL,
               title="Asesinos con más numeros de víctimas ",
              
               caption="Fuente: Wikipedia") +
               theme( plot.background = element_rect(fill="#DEC0F0"),
              panel.background = element_blank(),
              panel.grid  = element_blank(),
              axis.ticks = element_blank(),
              axis.text.x = element_blank(),
              axis.text.y = element_text(face = "bold",size = 10),
              plot.title = element_text(hjust = 0, size = 15),
              plot.subtitle = element_text(hjust = 0.5, size = 15),
              panel.border = element_blank(),
              legend.position = "none",
              plot.margin = margin(t = 10, r = 8, b = 8 , l=32),
              strip.background = element_rect(fill = "blue",colour = "red"))
#A esto le añadimos imágenes con ''ggdraw'' y ''draw_image''

5. Tasa comparada

*Comparación

El siguiente gráfico nos muestra la tasa comparada de criminalidad de los países de la Unión Europea, considerando las infracciones penales por diez mil habitantes. Son datos de los años 2008-2009.

España ,como podemos observar, es uno de los países más seguros de Europa, según los datos de Eurostat.

Código


#Tasa comparada

url <- "https://raw.githubusercontent.com/Pavlinadinkova/Criminalidad/main/comparada.csv"
comparada <- rio::import(url, setclass = "tibble") %>% mutate(Pais = c("SUECIA","BELGICA","DINAMARCA","REINO UNIDO","HOLANDA","ALEMANIA","LUXEMBURGO","FINLANDIA","IRLANDA","AUSTRIA","ITALIA","FRANCIA","ESPAÑA","PORTUGAL","GRECIA"),Pais = factor(Pais, levels = Pais[order(Tasa, decreasing = TRUE)]), Tasa = stringr::str_remove_all(Tasa, pattern = "[^[:alnum:]]"), Tasa = as.numeric(Tasa),)


d <- ggplot(comparada) +
  geom_point(aes(x = Ranking, y = Tasa, colour = Pais )) +
  facet_wrap(vars(Pais))+ labs(title = "Tasa comparada ",
              subtitle = "Por número de delitos", 
              caption = "Datos provenientes de Ministerio de Asuntos Exteriores",
              x = "Ranking ",
              y = NULL,
              color = "Ranking")

6. Crimen en España

¿Es España un país seguro? Como hemos podido observar en los gráficos anteriores, España es uno de los países europeos más seguros, ya que no ocupa ningún puesto destacado en las clasificaciones de los principales tipos de crímenes como homicidios, violaciones o robos .

Según datos de 2016 proporcionados por Eurostat :

  • •Cuenta con una tasa de 0,48 homicidios por cada 100.000 habitantes.
  • •Tasa de agresiones de 37,2 por cada 100.000 habitantes.
  • •Tasa de robos que afecta a 351,1 de cada cien mil personas.
  • •España está en el puesto 21º con 18,7 casos de violencia sexual por cada 100.000 personas.

6.1 Comunidades por número de delitos

#Importamos datos y los arreglamos
url33 <- "https://raw.githubusercontent.com/Pavlinadinkova/Criminalidad/main/ccaa.csv"
ccaa <- rio::import(url33)

data <- ccaa %>% mutate( Total = stringr::str_remove_all(Delitos, pattern = "([.])"))
data <- data %>% mutate( Total = stringr::str_replace_all(Total , pattern = "[,]" , replacement = "." ))
data <- data %>% mutate( Total = as.numeric(Total))

ccaa1 <- data %>% select(Comunidad , Total) %>% arrange(desc(Total)) %>% filter(Comunidad != "Espanya Total")
names(ccaa1) = c("CCAA","Delito")

library(wordcloud2)
library(ggplot2)
library(tidyverse)

#Gráfico
comunidades <- ggplot(ccaa1, aes(x=reorder(CCAA,Delito), y=Delito, fill=CCAA))+
  geom_bar(stat="identity") +
  theme(legend.position = "none") +
  coord_polar(start = 0)  + ylim(0,410000) + 
  labs (x="Comunidades Autonomas") + labs(y="Delitos") + labs(title = "Comunidades por número de delitos ") 

comunidades

Según datos proporcionados por el Ministerio del Interior en 2010, podemos observar las Comunidades Autónomas donde más delitos e infracciones se producen.

Las cifras absolutas revelan que Andalucía con 409.392 casos , Madrid con 401.855 casos y Valencia con 287.156 casos son, por este orden, las comunidades con más nivel delictivo. También influye que son las comunidades que mayor población tienen, sin contar la Comunidad de Cataluña , que no estaba en los datos ofrecidos. No obstante, según datos de Observatorio de la Delincuencia en Andalucía Cataluña se sitúa en el puesto número 3, delante de la Comunidad Valenciana , con más de 350.000 casos.

Andalucía se sitúa en todas las tipologías delictivas muy cercanas a la media española. Esto quiere decir que, a pesar de ser la comunidad más poblada, no se diferencia del resto de comunidades en el nivel de delincuencia registrada. En dicha comunidad, Granada es la provincia donde más homicidios y asesinatos se producen.

En Madrid, el delito más grave, el de homicidios, ha caído un 11%.Los delitos de lesiones y riñas tumultuarias ascienden un 10.6%. Los secuestros denunciados ascendieron al 16%. Uno de los datos más preocupantes es el importante aumento de delitos contra la libertad e indemnidad sexual. Los robos con violencia e intimidación subieron un 9.2% ; los robos en viviendas cayeron un 10.5%

En Valencia, hay que destacar que en el caso de homicidios dolosos y asesinatos consumados incrementa un 150%. En cuanto a los delitos contra la libertad e indemnidad sexual incrementan un 26,4%, mientras que el resto de los delitos contra la libertad e indemnidad sexual sube un 30,7 %. También han aumentado los robos de vehículos un 4,4 % y los robos con violencia e intimidación un 8,1%. Y baja un 15,3 % los robos con la fuerza en domicilio y también bajan los delitos por tráfico de drogas un 3,9%.

6.2 Tipos de delitos

#Improtamos datos
url98 <- "https://raw.githubusercontent.com/Pavlinadinkova/Criminalidad/main/drogas.csv"
tipos<- rio::import(url98 , setclass = "tibble")

#Hurtos 

 hurtos <- tipos %>% select(Hurtos, Any)

grafhurtos <- ggplot(hurtos, aes(x=Any, y=Hurtos , color=Any)) + geom_line()  +
  expand_limits(y=2) + theme(legend.position = "none") + labs(title = "Infracciones penales por hurtos ", subtitle ="En miles de habitantes" ,  caption = "Source:INE",
              x = "Fecha ",
              y = NULL,
              color = "Hurtos") + theme(
  panel.background = element_rect(fill = "#F7C9C9")) 

#Hacemos lo mismo para los otros delitos y finalmente juntamos los gráficos con library(patchwork)

Los gráficos siguientes, según el Balance de Criminalidad del Ministerio de Interior permite ver cómo han ido evolucionando otros tipos de delitos en España como son el tráfico de drogas, los hurtos o los robos de vehículos. Además, recientemente Interior ha incluido en sus estadísticas periódicas los secuestros y las agresiones sexuales.

  • En España se han registrado 12.662 infracciones por tráfico de drogas hasta el trimestre 3 de 2020
  • En España se han cometido 309.913 hurtos hasta el último trimestre de 2020.
  • Se han cometido 61 secuestros hasta el último trimestre.
  • En España se han registrado 1.281 violaciones hasta trimestre 3 de 2020.

6.3 Evolución de las infracciones

El siguiente gráfico representa cómo ha evolucionado el número de infracciones penales desde 2012. Como podemos observar en 2020 se ha producido un descenso bastante importante en las infracciones, probablemente producidas por la pandemia mundial de Covid-19, ya que Gobierno español ( como muchos otros en el mundo) decretó un confinamiento generalizado, ampliándose posteriormente al conjunto de toda la población, limitando la libertad de movimiento de los ciudadanos.

Es importante mencionar, que durante la pandemia, han ido apareciendo otros tipos de delitos, que no están contabilizados en las estadisticas , que son las estafas y los ciberdelitos.


library(ggplot2)
library(tidyverse)
library(gganimate)
library(hrbrthemes)

url34 <- "https://raw.githubusercontent.com/Pavlinadinkova/Criminalidad/main/variacion.csv"

variacion <- rio::import(url34 , setclass = "tibble")

names(variacion)= c("Periodo","Infracciones")
variacion <- variacion%>% mutate( Infracciones = stringr::str_remove_all(Infracciones, pattern = "([.])"))
variacion <- variacion %>% mutate( Infracciones = stringr::str_replace_all(Infracciones , pattern = "[,]" , replacement = "." ))
variacion <- variacion %>% mutate( Infracciones = as.numeric(Infracciones)) 


variacion1 <- variacion %>% separate(Periodo, c("Año","Trimestre"), sep = "[-]") %>% select(-c(Trimestre))

variacion2 <- variacion1 %>% group_by(Año, Infracciones) %>%  mutate(SumaTotal= sum(Infracciones)) %>% mutate(Año = unique(Año)) %>% ungroup()


variacion3<- variacion2 %>% select(c(Año,SumaTotal)) %>% unique() %>% mutate(Año = as.numeric(Año))


dd <- ggplot(variacion3, aes(Año, SumaTotal)) + geom_point() + geom_line( color="#F24340" , size=1 , aplha=0.9 , linetype=2) +
  theme_ipsum() + ggtitle("Variación interanual de las infracciones penales registradas")  + labs(x = "Año", y = NULL)  
  
dd

#Si al final ponemos ''transition_reveal(Año) , saldrá el gráfico animado 

7. Conclusiones

La delincuencia es un fenómeno universal y tan antiguo como la misma humanidad. La evolución de la criminalidad es un índice fundamental para comprender la realidad social. No obstante, es un fenómeno que cada vez tiende a aumentar más, y es, lamentablemente, difícilmente controlable.

Como hemos visto por el análisis anterior, por suerte no nos encontramos en una de las regiones más violentas del mundo, y por eso mucha gente ni le presta atención al crimen. Sin embargo, esto no debería de alegrarnos, al contrario, se deberían tomar más medidas para prevenir las delincuencias que se producen, tanto a nivel europeo, como nacional. Porque , aunque no tengamos numerosos asesinatos o homicidios como es el caso de Venezuela o Afganistán, sí que los tenemos, y es algo que debería o , al menos , se debería intentar de reducir. Por eso ,acciones como aumentar la vigilancia, las retenciones, las sanciones y una justicia más estricta, es necesaria.

8. Bibliografia

  • Página oficial del Instituto Nacional de Estadística. aquí
  • La Fundación InSight Crime. aquí
  • Artículo del periódico El Economista aquí
  • Diario Digital Nuestro País aquí
  • Ministerio del Interior Portal Estadístico de Criminalidad aquí



Para acabar este chunk para incluir tu session info:

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

current session info


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

- Packages -------------------------------------------------------------------
 package     * version    date       lib source                        
 assertthat    0.2.1      2019-03-21 [1] CRAN (R 4.0.2)                
 backports     1.1.9      2020-08-24 [1] CRAN (R 4.0.2)                
 base64enc     0.1-3      2015-07-28 [1] CRAN (R 4.0.0)                
 blob          1.2.1      2020-01-20 [1] CRAN (R 4.0.2)                
 broom         0.7.0      2020-07-09 [1] CRAN (R 4.0.2)                
 cellranger    1.1.0      2016-07-27 [1] CRAN (R 4.0.2)                
 cli           2.0.2      2020-02-28 [1] CRAN (R 4.0.2)                
 colorspace    1.4-1      2019-03-18 [1] CRAN (R 4.0.2)                
 cowplot     * 1.1.0      2020-09-08 [1] CRAN (R 4.0.3)                
 cpp11         0.2.1      2020-08-11 [1] CRAN (R 4.0.2)                
 crayon        1.3.4      2017-09-16 [1] CRAN (R 4.0.2)                
 crosstalk     1.1.0.1    2020-03-13 [1] CRAN (R 4.0.2)                
 curl          4.3        2019-12-02 [1] CRAN (R 4.0.2)                
 data.table    1.13.0     2020-07-24 [1] CRAN (R 4.0.2)                
 DBI           1.1.0      2019-12-15 [1] CRAN (R 4.0.2)                
 dbplyr        1.4.4      2020-05-27 [1] CRAN (R 4.0.2)                
 digest        0.6.25     2020-02-23 [1] CRAN (R 4.0.2)                
 dplyr       * 1.0.2      2020-08-18 [1] CRAN (R 4.0.2)                
 ellipsis      0.3.1      2020-05-15 [1] CRAN (R 4.0.2)                
 evaluate      0.14       2019-05-28 [1] CRAN (R 4.0.2)                
 extrafont     0.17       2014-12-08 [1] CRAN (R 4.0.3)                
 extrafontdb   1.0        2012-06-11 [1] CRAN (R 4.0.3)                
 fansi         0.4.1      2020-01-08 [1] CRAN (R 4.0.2)                
 farver        2.0.3      2020-01-16 [1] CRAN (R 4.0.2)                
 forcats     * 0.5.0      2020-03-01 [1] CRAN (R 4.0.2)                
 foreign       0.8-80     2020-05-24 [2] CRAN (R 4.0.2)                
 fs            1.5.0      2020-07-31 [1] CRAN (R 4.0.2)                
 gdtools       0.2.2      2020-04-03 [1] CRAN (R 4.0.2)                
 generics      0.1.0      2020-10-31 [1] CRAN (R 4.0.3)                
 gganimate   * 1.0.7      2020-10-15 [1] CRAN (R 4.0.3)                
 ggplot2     * 3.3.2      2020-06-19 [1] CRAN (R 4.0.2)                
 glue          1.4.2      2020-08-27 [1] CRAN (R 4.0.2)                
 gtable        0.3.0      2019-03-25 [1] CRAN (R 4.0.2)                
 haven         2.3.1      2020-06-01 [1] CRAN (R 4.0.2)                
 hms           0.5.3      2020-01-08 [1] CRAN (R 4.0.2)                
 hrbrthemes  * 0.8.0      2020-03-06 [1] CRAN (R 4.0.3)                
 htmltools     0.5.0      2020-06-16 [1] CRAN (R 4.0.2)                
 htmlwidgets   1.5.1      2019-10-08 [1] CRAN (R 4.0.2)                
 httr          1.4.2      2020-07-20 [1] CRAN (R 4.0.2)                
 jsonlite      1.7.1      2020-09-07 [1] CRAN (R 4.0.2)                
 klippy      * 0.0.0.9500 2020-11-13 [1] Github (rlesur/klippy@378c247)
 knitr       * 1.29       2020-06-23 [1] CRAN (R 4.0.2)                
 labeling      0.3        2014-08-23 [1] CRAN (R 4.0.0)                
 lazyeval      0.2.2      2019-03-15 [1] CRAN (R 4.0.2)                
 lifecycle     0.2.0      2020-03-06 [1] CRAN (R 4.0.2)                
 lubridate     1.7.9      2020-06-08 [1] CRAN (R 4.0.2)                
 magick      * 2.4.0      2020-06-23 [1] CRAN (R 4.0.2)                
 magrittr      1.5        2014-11-22 [1] CRAN (R 4.0.2)                
 maps        * 3.3.0      2018-04-03 [1] CRAN (R 4.0.3)                
 modelr        0.1.8      2020-05-19 [1] CRAN (R 4.0.2)                
 munsell       0.5.0      2018-06-12 [1] CRAN (R 4.0.2)                
 openxlsx      4.2.2      2020-09-17 [1] CRAN (R 4.0.2)                
 packcircles * 0.3.4      2020-12-12 [1] CRAN (R 4.0.3)                
 patchwork   * 1.1.0      2020-11-09 [1] CRAN (R 4.0.3)                
 pillar        1.4.6      2020-07-10 [1] CRAN (R 4.0.2)                
 pkgconfig     2.0.3      2019-09-22 [1] CRAN (R 4.0.2)                
 plotly        4.9.2.1    2020-04-04 [1] CRAN (R 4.0.2)                
 plotrix     * 3.7-8      2020-04-16 [1] CRAN (R 4.0.3)                
 prettyunits   1.1.1      2020-01-24 [1] CRAN (R 4.0.2)                
 progress      1.2.2      2019-05-16 [1] CRAN (R 4.0.2)                
 purrr       * 0.3.4      2020-04-17 [1] CRAN (R 4.0.2)                
 R6            2.4.1      2019-11-12 [1] CRAN (R 4.0.2)                
 Rcpp          1.0.5      2020-07-06 [1] CRAN (R 4.0.2)                
 readr       * 1.4.0      2020-10-05 [1] CRAN (R 4.0.2)                
 readxl        1.3.1      2019-03-13 [1] CRAN (R 4.0.2)                
 reprex        0.3.0      2019-05-16 [1] CRAN (R 4.0.2)                
 rio           0.5.16     2018-11-26 [1] CRAN (R 4.0.3)                
 rlang         0.4.7      2020-07-09 [1] CRAN (R 4.0.2)                
 rmarkdown     2.3        2020-06-18 [1] CRAN (R 4.0.2)                
 rstudioapi    0.11       2020-02-07 [1] CRAN (R 4.0.2)                
 Rttf2pt1      1.3.8      2020-01-10 [1] CRAN (R 4.0.3)                
 rvest         0.3.6      2020-07-25 [1] CRAN (R 4.0.2)                
 scales        1.1.1      2020-05-11 [1] CRAN (R 4.0.2)                
 sessioninfo   1.1.1      2018-11-05 [1] CRAN (R 4.0.3)                
 stringi       1.5.3      2020-09-09 [1] CRAN (R 4.0.2)                
 stringr     * 1.4.0      2019-02-10 [1] CRAN (R 4.0.2)                
 systemfonts   0.3.1      2020-09-08 [1] CRAN (R 4.0.2)                
 tibble      * 3.0.3      2020-07-10 [1] CRAN (R 4.0.2)                
 tidyr       * 1.1.2      2020-08-27 [1] CRAN (R 4.0.2)                
 tidyselect    1.1.0      2020-05-11 [1] CRAN (R 4.0.2)                
 tidyverse   * 1.3.0      2019-11-21 [1] CRAN (R 4.0.2)                
 tweenr        1.0.1      2018-12-14 [1] CRAN (R 4.0.3)                
 vctrs         0.3.4      2020-08-29 [1] CRAN (R 4.0.2)                
 viridisLite   0.3.0      2018-02-01 [1] CRAN (R 4.0.2)                
 withr         2.2.0      2020-04-20 [1] CRAN (R 4.0.2)                
 wordcloud2  * 0.2.1      2018-01-03 [1] CRAN (R 4.0.3)                
 xfun          0.17       2020-09-09 [1] CRAN (R 4.0.2)                
 xml2        * 1.3.2      2020-04-23 [1] CRAN (R 4.0.2)                
 yaml          2.2.1      2020-02-01 [1] CRAN (R 4.0.2)                
 zip           2.1.1      2020-08-27 [1] CRAN (R 4.0.2)                

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


LS0tDQp0aXRsZTogPEZPTlQgQ09MT1I9IiNEQTE2Q0EiPiBDcmltaW5hbGlkYWQgZW4gZWwgbXVuZG8gPC9GT05UPiANCmF1dGhvcjogIlBhdmxpbmEgRGlua292YSBHcm96ZXZhIiANCmRhdGU6ICIxNiBkZSBFbmVybyBkZSAyMDIxIg0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50Og0KICAgIHRoZW1lOiB5ZXRpDQogICAgaGlnaGxpZ2h0OiB0ZXh0bWF0ZSANCiAgICB0b2M6IHRydWUNCiAgICB0b2NfZGVwdGg6IDMgDQogICAgdG9jX2Zsb2F0OiANCiAgICAgIGNvbGxhcHNlZDogdHJ1ZQ0KICAgICAgc21vb3RoX3Njcm9sbDogdHJ1ZQ0KICAgIHNlbGZfY29udGFpbmVkOiB0cnVlDQogICAgbnVtYmVyX3NlY3Rpb25zOiBmYWxzZQ0KICAgIGRmX3ByaW50OiBrYWJsZQ0KICAgIGNvZGVfZG93bmxvYWQ6IHRydWUNCmVkaXRvcl9vcHRpb25zOiANCiAgY2h1bmtfb3V0cHV0X3R5cGU6IGNvbnNvbGUNCi0tLQ0KDQo8Rk9OVCBDT0xPUj0iQnJvd24iPlByb3llY3RvIHJlYWxpemFkbyBwYXJhIGxhIGFzaWduYXR1cmEnJ1Byb2dyYW1hY2nDs24geSBtYW5lam8gZGUgZGF0b3MgZW4gbGEgZXJhIGRlbCBCaWcgRGF0YSIgaW1wYXJ0aWRhIHBvciBlbCBwcm9mZXNvciBQZWRybyBKLiBQw6lyZXogZW4gZWwgR3JhZG8gZGUgRWNvbm9tw61hIGRlIGxhIFVuaXZlcnNpZGFkIGRlIFZhbGVuY2lhLiBMYSBww6FnaW5hIHdlYiBkZSBsYSBhc2lnbmF0dXJhIHNlIHB1ZWRlIHZlciBbYXF1w61dKCBodHRwczovL3BlcmV6cDQ0LmdpdGh1Yi5pby9pbnRyby1kcy0yMC0yMS13ZWIpIC4gTG9zIHRyYWJham9zIGVsYWJvcmFkb3MgcG9yIG51ZXN0cm9zIGNvbXBhw7Flcm9zIGRlIGN1cnNvIHB1ZWRlbiB2ZXJzZSBbYXF1w61dKGh0dHBzOi8vcGVyZXpwNDQuZ2l0aHViLmlvL2ludHJvLWRzLTIwLTIxLXdlYi8wNy10cmFiYWpvcy5odG1sKTwvRk9OVD4NCg0KYGBge3IgcGFja2FnZXMtc2V0dXAsIGluY2x1ZGUgPSBGQUxTRX0NCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShrbGlwcHkpICAjLSByZW1vdGVzOjppbnN0YWxsX2dpdGh1Yigicmxlc3VyL2tsaXBweSIpDQpsaWJyYXJ5KGtuaXRyKQ0KbGlicmFyeShjb3dwbG90KQ0KbGlicmFyeSh4bWwyKQ0KbGlicmFyeShtYWdpY2spDQpsaWJyYXJ5KG1hcHMpDQpsaWJyYXJ5KGdnYW5pbWF0ZSkNCg0KDQpgYGANCg0KYGBge3IgY2h1bmstc2V0dXAsIGluY2x1ZGUgPSBGQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSwgZXZhbCA9IFRSVUUsIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCANCiAgICAgICAgICAgICAgICAgICAgICAjcmVzdWx0cyA9ICJob2xkIiwNCiAgICAgICAgICAgICAgICAgICAgICBjYWNoZSA9IEZBTFNFLCBjYWNoZS5wYXRoID0gIi9jYWNoZXMvIiwgY29tbWVudCA9ICIjPiIsDQogICAgICAgICAgICAgICAgICAgICAgI2ZpZy53aWR0aCA9IDcsICNmaWcuaGVpZ2h0PSA3LCAgIA0KICAgICAgICAgICAgICAgICAgICAgICNvdXQud2lkdGggPSA3LCBvdXQuaGVpZ2h0ID0gNywNCiAgICAgICAgICAgICAgICAgICAgICBjb2xsYXBzZSA9IFRSVUUsICBmaWcuc2hvdyA9ICJob2xkIiwNCiAgICAgICAgICAgICAgICAgICAgICBmaWcuYXNwID0gNy85LCBvdXQud2lkdGggPSAiNjAlIiwgZmlnLmFsaWduID0gImNlbnRlciIpDQojLSBwYXJhIG1lam9yYXIgbG9zIGdyw6FmaWNvcywgYnVlbm8gZW4gcmVhbGlkYWQgcGFyYSBxdWUgc2UgdmVhbiBpZ3VhbCBlbiBkaXN0aW50b3MgU08NCiMtIGh0dHBzOi8vd3d3Lmp1bXBpbmdyaXZlcnMuY29tL2Jsb2cvci1rbml0ci1tYXJrZG93bi1wbmctcGRmLWdyYXBoaWNzLw0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGRldiA9ICJwbmciLCBkZXYuYXJncyA9IGxpc3QodHlwZSA9ICJjYWlyby1wbmciKSkNCmBgYA0KDQpgYGB7ciBvcHRpb25zLXNldHVwLCBpbmNsdWRlID0gRkFMU0V9DQpvcHRpb25zKHNjaXBlbiA9IDk5OSkgIy0gcGFyYSBxdWl0YXIgbGEgbm90YWNpw7NuIGNpZW50w61maWNhDQpvcHRpb25zKCJ5YW1sLmV2YWwuZXhwciIgPSBUUlVFKSAjLSBodHRwczovL2dpdGh1Yi5jb20vdmlraW5nL3IteWFtbC9pc3N1ZXMvNDcgIChsbyBwdXNlIHggZWwgcGIgY29uIGVsIHdhcm5pbmcpIEVuIHJlYWxpZGFkIGNyZW8gcXVlIG1lam9yIHNlcsOtYSBwb25lcmxvIGVuIFJQcm9maWxlDQpgYGANCg0KDQpgYGB7ciBrbGlwcHksIGVjaG8gPSBGQUxTRX0NCmtsaXBweTo6a2xpcHB5KHBvc2l0aW9uID0gYygidG9wIiwgInJpZ2h0IikpICMtIHJlbW90ZXM6Omluc3RhbGxfZ2l0aHViKCJybGVzdXIva2xpcHB5IikNCg0KbGlicmFyeShwYWNrY2lyY2xlcykNCg0KYGBgDQoNCi0tLS0tLS0tLS0tLS0tLS0tDQoNCiMjIDxGT05UIENPTE9SPSIjREExNkNBIj4gMS5JbnRyb2R1Y2Npw7NuIDwvRk9OVD4gDQoNCkxhIHBhbGFicmEgKipjcmltZW4qKiBzZSByZWZpZXJlIGEgdW5hIGFjY2nDs24gdm9sdW50YXJpYSBkZSBoZXJpciBncmF2ZW1lbnRlIG8gYXNlc2luYXIgYSBhbGd1aWVuLiANCkNvbW8gZXMgZGUgc3Vwb25lcnNlLCBoYXkgZGl2ZXJzb3MgdGlwb3MgeSBkaXZlcnNvcyBuaXZlbGVzIGRlIGdyYXZlZGFkIGRlIGNyw61tZW5lcyA6IG1pZW50cmFzIHF1ZSBhbGd1bm9zIHNvbiByb2JvcyBvIGh1cnRvcyAsIG90cm9zIHB1ZWRlbiBzZXIgcmVhbG1lbnRlIGZsYWdyYW50ZXMgYXRhcXVlcyBjb250cmEgbGEgaW50ZWdyaWRhZCBodW1hbmEgY29tbyBlbCBhYnVzbyBzZXh1YWwgLCBsYSB0b3J0dXJhIHkgZWwgYXNlc2luYXRvLiANCg0KDQo8Y2VudGVyPjxpbWcgc3JjPSJodHRwczovL3N0My5kZXBvc2l0cGhvdG9zLmNvbS82ODA5MTY4LzE5MzAyL3YvOTUwL2RlcG9zaXRwaG90b3NfMTkzMDIyMzY0LXN0b2NrLWlsbHVzdHJhdGlvbi1jcmltZS1zY2VuZS1kYW5nZXItdGFwZXMtdmVjdG9yLmpwZyIgd2lkdGg9IjM1MHB4IiAvPjwvY2VudGVyPg0KDQojIyA8Rk9OVCBDT0xPUj0iI0RBMTZDQSI+IDIuQ3JpbWVuIG11bmRpYWwgPC9GT05UPg0KDQpTZWfDum4gbG9zIGRhdG9zIGRlIGxhICoqT2ZpY2luYSBkZSBsYXMgTmFjaW9uZXMgVW5pZGFzIGNvbnRyYSBsYSBEcm9nYSB5IGVsIERlbGl0byoqIChVTk9EQyAsIHBvciBzdXMgc2lnbGFzIGVuIGluZ2zDqXMpICwgY3V5YSBww6FnaW5hIG9maWNpYWwgc2UgcHVlZGUgdmVyIFthcXXDrV0oIGh0dHBzOi8vZGF0YXVub2RjLnVuLm9yZy8pICwgc2XDsWFsYW4gcXVlIGVuIGVsIG11bmRvIHNlIHByb2R1Y2VuIG3DoXMgbXVlcnRlcyBwb3IgaG9taWNpZGlvcyBpbnRlbmNpb25hbCBxdWUgcG9yIGNvbmZsaWN0b3MgYXJtYWRvcyB5IHRlcnJvcmlzbW8ganVudG9zIOKAkyA0NjQuMDAwIHbDrWN0aW1hcyBkZSBob21pY2lkaW8sIDg5LjAwMCBkZSBjb25mbGljdG9zIGFybWFkb3MgeSAyNi4wMDAgZGUgYWN0b3MgdGVycm9yaXN0YXMgZW4gMjAxNy4tDQpMb3MgYWx0b3Mgbml2ZWxlcyBkZSBjb25mbGljdG8gYXJtYWRvIGUgaW5zZWd1cmlkYWQgdGllbmVuIHVuIGltcGFjdG8gZGVzdHJ1Y3Rpdm8gZW4gZWwgZGVzYXJyb2xsbyBkZSB1biBwYcOtcyB5IGFmZWN0YW4gYWwgY3JlY2ltaWVudG8gZWNvbsOzbWljby4gRW4gbGEgKipBZ2VuZGEgMjAzMCoqIGRlIGxhIE9OVSAsIHNlIGVuY3VlbnRyYSB1biBjbGFybyBlbnRlbmRpbWllbnRvIGRlIHF1ZSBsb3MgZGVyZWNob3MgaHVtYW5vcywgbGEgcGF6IHkgbGEgc2VndXJpZGFkIHkgZWwgZGVzYXJyb2xsbyBlc3TDoW4gcHJvZnVuZGFtZW50ZSBpbnRlcnJlbGFjaW9uYWRhcyB5IHNlIHJlZnVlcnphbiBtdXR1YW1lbnRlLiBFbiBzdSB0b3RhbGlkYWQsIHNlIHJlZmxlamEgbGEgaW1wb3J0YW5jaWEgZGUgbWVqb3JhciBlbCBhY2Nlc28gYSBsYSBqdXN0aWNpYSxnYXJhbnRpemFyIGxhIHNlZ3VyaWRhZCB5IGxhIHByb3RlY2Npw7NuIHkgcHJvbW92ZXIgbG9zIGRlcmVjaG9zIGh1bWFubyBwYXJhIGVsIGRlc2Fycm9sbG8gc29zdGVuaWJsZS5Ub2RvcyBsb3Mgb2JqZXRpdm9zIHBsYW50ZWFkb3MgcG9yIGxhIE9OVSBzZSBwdWVkZW4gdmVyIFthcXXDrV0oIGh0dHBzOi8vc2Rncy51bi5vcmcvZ29hbHMpDQpQYXJhIGFib3JkYXIgZXN0b3MgZGVzYWbDrW9zIHkgY29uc3RydWlyIHNvY2llZGFkZXMgbcOhcyBwYWPDrWZpY2FzIGUgaW5jbHVzaXZhcywgZXMgbmVjZXNhcmlvIHF1ZSBzZSBlc3RhYmxlemNhbiByZWd1bGFjaW9uZXMgbcOhcyBlZmljaWVudGVzIHkgdHJhbnNwYXJlbnRlcyB5IHByZXN1cHVlc3RvcyBndWJlcm5hbWVudGFsZXMgY29tcGxldG9zIHkgcmVhbGlzdGFzLiBVbm8gZGUgbG9zIHByaW1lcm9zIHBhc29zIGhhY2lhIGxhIHByb3RlY2Npw7NuIGRlIGxvcyBkZXJlY2hvcyBpbmRpdmlkdWFsZXMgZXMgbGEgY3JlYWNpw7NuIGRlIGluc3RpdHVjaW9uZXMgbmFjaW9uYWxlcyBkZSBkZXJlY2hvcyBodW1hbm9zIG3DoXMgaW5kZXBlbmRpZW50ZXMgZW4gdG9kbyBlbCBtdW5kby4gDQpObyBvYnN0YW50ZSwgbGEgdGVuZGVuY2lhIG11ZXN0cmEgcXVlIGVsIE9iamV0aXZvIGRlIERlc2Fycm9sbG8gU29zdGVuaWJsZSBmaWphZG8gcG9yIGxhIE9OVSBwYXJhIDIwMzAgcXVlIHByZXRlbmRlIHJlZHVjaXIgc2lnbmlmaWNhdGl2YW1lbnRlIHRvZGFzIGxhcyBmb3JtYXMgZGUgdmlvbGVuY2lhIGVzdMOhIGxlam9zIGRlIHNlciBjdW1wbGlkby4NCkVsIHJpZXNnbyBkZSBzdWZyaXIgdW4gYXNlc2luYXRvIGhhIGNhw61kbyBlbiBsYXMgw7psdGltYXMgZMOpY2FkYXMg4oCVZW4gMjAxNyBzZSBwcm9kdWplcm9uIDYsMSBob21pY2lkaW9zIHBvciBjYWRhIDEwMC4wMDAgaGFiaXRhbnRlcyBlbiBlbCBtdW5kbywgbWllbnRyYXMgcXVlIGVuIDE5OTMgZnVlcm9uIDcsNOKAlSwgcGVybyBlbiByZWFsaWRhZCBlc2UgZGVzY2Vuc28gZXN0w6EgYXNvY2lhZG8gYWwgY3JlY2ltaWVudG8gZGVtb2dyw6FmaWNvIHkgbm8gYSB1biBjZXNlIGRlIGxhIHZpb2xlbmNpYS4gRXN0byBlcywgbGEgcG9ibGFjacOzbiBtdW5kaWFsIGhhIGF1bWVudGFkbyB1biByaXRtbyBtYXlvciBxdWUgZWwgZGUgYXNlc2luYXRvcy4gQWRlbcOhcywgZW4gbG9zIMO6bHRpbW9zIGHDsW9zIHNlIGhhIHByb2R1Y2lkbyB1biByZXB1bnRlIHF1ZSBjaG9jYSBmcm9udGFsbWVudGUgY29uIGVsIG9iamV0aXZvIGRlIGxhcyBOYWNpb25lcyBVbmlkYXMsIHlhIHF1ZSBlbnRyZSAyMDE1IHkgMjAxNyBsb3MgaG9taWNpZGlvcyBoYW4gYXVtZW50YWRvIHVuIDQlIGEgbml2ZWwgbXVuZGlhbC4NCg0KU2luIGVtYmFyZ28sIG5vIHRvZGFzIGxhcyByZWdpb25lcyBzZSBlbm1hcmNhbiBkZW50cm8gZGUgbGEgbWlzbWEgdGVuZGVuY2lhLg0KDQoNCg0KDQoNCiMjIyA8Rk9OVCBDT0xPUj0iI0RBMTZDQSI+IDIuMS5DYXNvcyBkZSBjcmltZW5lcyBwb3IgY29udGluZW50ZSA8L0ZPTlQ+DQoNCg0KYGBge3Igb3V0LndpZHRoPSIxMDAlIiAsIGVjaG89VFJVRX0NCiNQYXF1ZXRlcyB1dGlsaXphZG9zDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KHBsb3RyaXgpDQojIENyZWFtb3MgbG9zIGRhdG9zDQoNCnggPC0gIGMoMTcuMiwxMywyLjMsMywyLjgpDQpsYmwgPC0gIGMoIkFtZXJpY2EiLCJBZnJpY2EiLCJBc2lhIiwiRXVyb3BhIiwgIk9jZWFuaWEiKQ0KDQoNCnBpZXBlcmNlbnQ8LSByb3VuZCgxMDAqeC9zdW0oeCksIDEpDQoNCg0KcGllM0QoeCwgbGFiZWxzID0gcGllcGVyY2VudCwgbWFpbiA9ICJDYXNvcyBkZSBob21pY2lkaW9zIHBvciBjb250aW5lbnRlIGVuICUiLGV4cGxvZGU9MC4xLCBlZGdlcyA9IDEwLGJvcmRlciA9ICJibGFjayIsIGNvbCA9IHJhaW5ib3cobGVuZ3RoKHgpKSkNCmxlZ2VuZCgidG9wIiwgYygiQW1lcmljYSIsIkFmcmljYSIsIkFzaWEiLCJFdXJvcGEiLCJPY2VhbmlhIiksIGNleCA9IDAuNSwNCiAgIGZpbGwgPSByYWluYm93KGxlbmd0aCh4KSkpDQoNCg0KYGBgDQpFdXJvcGEgaGEgZGlzbWludWlkbyBzdSB0YXNhIGRlIGhvbWljaWRpb3MgZW4gdW4gNjMlIGRlc2RlIDIwMDIgeSBBc2lhIHVuIDM2JSBkZXNkZSAxOTkwLiBQZXJvIGxhcyBBbcOpcmljYXMgc2lndWVuIHJlcG9ydGFuZG8gYWx0b3Mgw61uZGljZXMgZGUgY3JpbWluYWxpZGFkLCBhbCBpZ3VhbCBxdWUgw4FmcmljYS4NCkNvbW8gcG9kZW1vcyB2ZXIgZW4gZWwgZ3LDoWZpY28sIGNvbiBkYXRvcyBwcm9wb3JjaW9uYWRvcyBkZSAqKlVOT0RDKiogLCBlbCBjYXNvIGRlIEFtw6lyaWNhIGVzIGVzcGVjaWFsbWVudGUgcHJlb2N1cGFudGUgeWEgcXVlLCBhIHBlc2FyIGRlIGNvbnRhciBjb24gZWwgMTMlIGRlbCB0b3RhbCBkZSBsYSBwb2JsYWNpw7NuIG11bmRpYWwsIHJlcG9ydGEgZWwgNDQuOSUgZGUgaG9taWNpZGlvcyBpbnRlcm5hY2lvbmFsZXMuIERlc3B1w6lzIGRlIEFtw6lyaWNhLCBzZSBzaXTDumEgw4FmcmljYSBjb24gY2FzaSAzNCUuIExhcyByZWdpb25lcyBkb25kZSBtZW5vcyBob21pY2lkaW9zIHNlIHByb2R1Y2VuIGVzIGVuIEFzaWEsIHNlZ3VpZGEgZGUgT2NlYW7DrWEgeSBFdXJvcGEuIA0KDQoNCg0KDQoNCiMjIyA8Rk9OVCBDT0xPUj0iI0RBMTZDQSI+IDIuMi4gUGHDrXNlcyBtw6FzIHBlbGlncm9zb3MgPC9GT05UPg0KDQoNCmBgYHtyIG91dC53aWR0aD0iMTAwJSIgLCBlY2hvPVRSVUV9DQojUGFxdWV0ZXMNCg0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KG1hZ2ljaykNCmxpYnJhcnkoY293cGxvdCkNCg0KI1NlbGVjY2lvbmFyIHBhw61zZXMNCg0Kd29ybGQgPC0gbWFwX2RhdGEoIndvcmxkIikgJT4lIG11dGF0ZShjb2xvciA9IGNhc2Vfd2hlbihyZWdpb24gPT0gIlZlbmV6dWVsYSIgfiAxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpb24gPT0gIlNvdXRoIEFmcmljYSIgfiAyLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpb24gPT0gIkVsIFNhbHZhZG9yIiB+IDMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lvbiA9PSAiQWZnaGFuaXN0YW4iIH4gNCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaW9uID09ICJCcmF6aWwiIH4gNSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaW9uID09ICJHdXlhbmEiIH4gNiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaW9uID09ICJKYW1haWNhIiB+IDcsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lvbiA9PSAiSG9uZHVyYXMiIH4gOCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaW9uID09ICJNZXhpY28iIH4gOSkpICU+JSBtdXRhdGUoY29sb3IgPSBpZl9lbHNlKGlzLm5hKGNvbG9yKSwwLGNvbG9yKSkNCg0KIyBDYXBpdGFsZXMgZGUgbG9zIHBhaXNlcw0KDQpjaXVkYWRlcyA8LSBjKCJDYXJhY2FzIiwiQ2l1ZGFkIGRlbCBDYWJvIiwiU2FuIFNhbHZhZG9yIiwiS2FidWwiLCJCcmFzaWxpYSIsIkdlb3JnZXRvd24iLCJLaW5nc3RvbiIsIlRlZ3VjaWdhbHBhIiwiTWV4aWNvIENpdHkiKQ0KbGF0IDwtIGMoNi4xOTc1MDk4LC0zMy4wOTYwMCwxNC4wMzIwOCwzMS42NjczOCwtMTQuMDMwNjY0LDQuMjM2NDc1LDE4LjUwMDY4LDE1Ljc4NjE4LDIwLjg0MzgwKQ0KbG9uZyA8LSBjKC02OC4xNDMwNywyNy43NjIxMSwtODguNzA3NjEsNjguOTczNDMsLTM4Ljk0MjMzLC01OC4wMTA3NCwtNzcuOTI2ODYsLTg4LjAxMDQwLC0xMDUuNDU2MzQpDQoNCmNvb3JkY2l1ZGFkZXMgPC0gZGF0YS5mcmFtZShjaXVkYWRlcyxsYXQsbG9uZykNCg0KDQojTW9zdHJhbGFzIGVuIGVsIG1hcGENCg0KbGluZWFzIDwtIGRhdGEuZnJhbWUoaWQgPSBjKCJDYXJhY2FzIiwiQ2l1ZGFkIGRlbCBDYWJvIiwiU2FuIFNhbHZhZG9yIiwiS2FidWwiLCJCcmFzaWxpYSIsIkdlb3JnZXRvd24iLCJLaW5nc3RvbiIsIlRlZ3VjaWdhbHBhIiwiTWV4aWNvIENpdHkiKSwNCiAgICAgICAgICAgICAgICAgICAgIGxhdF8xID0gYyg2LjE5NzUwOTgsLTMzLjA5NjAwLDE0LjAzMjA4LDMxLjY2NzM4LC0xNC4wMzA2NjQsNC4yMzY0NzUsMTguNTAwNjgsMTUuNzg2MTgsMjAuODQzODApLA0KICAgICAgICAgICAgICAgICAgICAgbG9uZ18xID0gYygtNjguMTQzMDcsMjcuNzYyMTEsLTg4LjcwNzYxLDY4Ljk3MzQzLC0zOC45NDIzMywtNTguMDEwNzQsLTc3LjkyNjg2LC04OC4wMTA0MCwtMTA1LjQ1NjM0KSwNCiAgICAgICAgICAgICAgICAgICAgIGxhdF8yID0gYygxNCwtMzMsMjAsNDAsLTIwLDEwLDMwLC01LDI0KSwNCiAgICAgICAgICAgICAgICAgICAgIGxvbmdfMiA9IGMoLTYzLDQwLC04MSwgODAsLTMwLC00MCwtNjAsLTk5LC0xMzAgKSkNCiNBIGNvbnRpbnVhY2nDs24gaW1wb3J0YW1vcyBsYXMgZm90b3MgY29uICcnaW1hZ2VfcmVhZCcnIHkgZWwgbGluayBkaXJlY3RvIGRlIGxhIGZvdG8uIEVzdGUgcHJvY2VkaW1pZW50byBzZSByZWFsaXphIHBhcmEgY2FkYSB1bm8gZGUgbG9zIHBhw61zZXMuDQpgYGANCg0KYGBge3IsIGVjaG89RkFMU0V9DQoNCiNJbXBvcnRhciBmb3Rvcw0KDQp2ZW5lenVlbGEgPC0gaW1hZ2VfcmVhZCgiaHR0cHM6Ly91cGxvYWQud2lraW1lZGlhLm9yZy93aWtpcGVkaWEvY29tbW9ucy8wLzA2L0ZsYWdfb2ZfVmVuZXp1ZWxhLnN2ZyIpDQoNCnN1ZGFmcmljYTwtIGltYWdlX3JlYWQoImh0dHBzOi8vdXBsb2FkLndpa2ltZWRpYS5vcmcvd2lraXBlZGlhL2NvbW1vbnMvYS9hZi9GbGFnX29mX1NvdXRoX0FmcmljYS5zdmciKSAlPiUgaW1hZ2VfYm9yZGVyKCIjZmZmZmZmIiwiMTB4MTAiKQ0KDQpzYWx2YWRvciA8LSBpbWFnZV9yZWFkKCJodHRwczovL3VwbG9hZC53aWtpbWVkaWEub3JnL3dpa2lwZWRpYS9jb21tb25zLzMvMzQvRmxhZ19vZl9FbF9TYWx2YWRvci5zdmciKSAlPiUgaW1hZ2VfYm9yZGVyKCIjZmZmZmZmIiwiMTB4MTAiKQ0KDQphZmdhbmlzdGFuIDwtIGltYWdlX3JlYWQoImh0dHBzOi8vdXBsb2FkLndpa2ltZWRpYS5vcmcvd2lraXBlZGlhL2NvbW1vbnMvOS85YS9GbGFnX29mX0FmZ2hhbmlzdGFuLnN2ZyIpICU+JSBpbWFnZV9ib3JkZXIoIiNmZmZmZmYiLCIxMHgxMCIpDQoNCmJyYXNpbCA8LSBpbWFnZV9yZWFkKCJodHRwczovL3VwbG9hZC53aWtpbWVkaWEub3JnL3dpa2lwZWRpYS9jb21tb25zLzAvMDUvRmxhZ19vZl9CcmF6aWwuc3ZnIikgJT4lIGltYWdlX2JvcmRlcigiI2ZmZmZmZiIsIjEweDEwIikNCg0KZ3V5YW5hIDwtIGltYWdlX3JlYWQoImh0dHBzOi8vdXBsb2FkLndpa2ltZWRpYS5vcmcvd2lraXBlZGlhL2NvbW1vbnMvOS85OS9GbGFnX29mX0d1eWFuYS5zdmciKSAlPiUgaW1hZ2VfYm9yZGVyKCIjZmZmZmZmIiwiMTB4MTAiKQ0KDQpqYW1haWNhIDwtIGltYWdlX3JlYWQoImh0dHBzOi8vdXBsb2FkLndpa2ltZWRpYS5vcmcvd2lraXBlZGlhL2NvbW1vbnMvMC8wYS9GbGFnX29mX0phbWFpY2Euc3ZnIikgJT4lIGltYWdlX2JvcmRlcigiI2ZmZmZmZiIsIjEweDEwIikNCg0KaG9uZHVyYXMgPC0gaW1hZ2VfcmVhZCgiaHR0cHM6Ly91cGxvYWQud2lraW1lZGlhLm9yZy93aWtpcGVkaWEvY29tbW9ucy84LzgyL0ZsYWdfb2ZfSG9uZHVyYXMuc3ZnIikgJT4lIGltYWdlX2JvcmRlcigiI2ZmZmZmZiIsIjEweDEwIikNCg0KbWV4aWNvIDwtIGltYWdlX3JlYWQoImh0dHBzOi8vdXBsb2FkLndpa2ltZWRpYS5vcmcvd2lraXBlZGlhL2NvbW1vbnMvZi9mYy9GbGFnX29mX01leGljby5zdmciKSAlPiUgaW1hZ2VfYm9yZGVyKCIjZmZmZmZmIiwiMTB4MTAiKQ0KYGBgDQoNCmBgYHtyfQ0KDQojSnVudGFtb3MgZWwgbWFwYSBjcmVhZG8gY29uIGxhcyBpbcOhZ2VuZXMgaW1wb3J0YWRhcw0KbWFwYXNpIDwtIGdncGxvdCgpICsgZ2VvbV9tYXAoZGF0YSA9IHdvcmxkLCBtYXAgPSB3b3JsZCwgYWVzKGxvbmcsIGxhdCwgbWFwX2lkID0gcmVnaW9uKSwgY29sb3IgPSAiIzAxMDEwMSIsIGZpbGwgPSAiI0ZBRjE2OCIpICsNCiAgICAgICAgICAgICAgICAgICAgZ2VvbV9tYXAoZGF0YSA9IHdvcmxkICU+JSBmaWx0ZXIoY29sb3I9PTEpLCBtYXAgPSB3b3JsZCwgYWVzKGxvbmcsIGxhdCwgbWFwX2lkID0gcmVnaW9uKSwgY29sb3IgPSAiIzAwMDAwMCIsIGZpbGwgPSAicmVkIikgKw0KICAgICAgICAgICAgICAgICAgICBnZW9tX21hcChkYXRhID0gd29ybGQgJT4lIGZpbHRlcihjb2xvcj09MiksIG1hcCA9IHdvcmxkLCBhZXMobG9uZywgbGF0LCBtYXBfaWQgPSByZWdpb24pLCBjb2xvciA9ICIjMDAwMDAwIiwgZmlsbCA9ICJ5ZWxsb3ciKSArDQogICAgICAgICAgICAgICAgICAgIGdlb21fbWFwKGRhdGEgPSB3b3JsZCAlPiUgZmlsdGVyKGNvbG9yPT0zKSwgbWFwID0gd29ybGQsIGFlcyhsb25nLCBsYXQsIG1hcF9pZCA9IHJlZ2lvbiksIGNvbG9yID0gIiMwMDAwMDAiLCBmaWxsID0gIiM5ZDA1ZmYiKSArDQogICAgICAgICAgICAgICAgICAgIGdlb21fbWFwKGRhdGEgPSB3b3JsZCAlPiUgZmlsdGVyKGNvbG9yPT00KSwgbWFwID0gd29ybGQsIGFlcyhsb25nLCBsYXQsIG1hcF9pZCA9IHJlZ2lvbiksIGNvbG9yID0gIiMwMDAwMDAiLCBmaWxsID0gIiNhYjY4MDAiKSArDQogICAgICAgICAgICAgICAgICAgIGdlb21fbWFwKGRhdGEgPSB3b3JsZCAlPiUgZmlsdGVyKGNvbG9yPT01KSwgbWFwID0gd29ybGQsIGFlcyhsb25nLCBsYXQsIG1hcF9pZCA9IHJlZ2lvbiksIGNvbG9yID0gIiMwMDAwMDAiLCBmaWxsID0gIiMyNDE0MTQiKSArDQogICAgICAgICAgICAgICAgICAgIGdlb21fbWFwKGRhdGEgPSB3b3JsZCAlPiUgZmlsdGVyKGNvbG9yPT02KSwgbWFwID0gd29ybGQsIGFlcyhsb25nLCBsYXQsIG1hcF9pZCA9IHJlZ2lvbiksIGNvbG9yID0gIiMwMDAwMDAiLCBmaWxsID0gIiMwMDRkZmYiKSArDQogICAgICAgICAgICAgICAgICAgIGdlb21fbWFwKGRhdGEgPSB3b3JsZCAlPiUgZmlsdGVyKGNvbG9yPT03KSwgbWFwID0gd29ybGQsIGFlcyhsb25nLCBsYXQsIG1hcF9pZCA9IHJlZ2lvbiksIGNvbG9yID0gIiMwMDAwMDAiLCBmaWxsID0gIiNGNzgxQ0UiKSArDQogICAgICAgICAgICAgICAgICAgIGdlb21fbWFwKGRhdGEgPSB3b3JsZCAlPiUgZmlsdGVyKGNvbG9yPT04KSwgbWFwID0gd29ybGQsIGFlcyhsb25nLCBsYXQsIG1hcF9pZCA9IHJlZ2lvbiksIGNvbG9yID0gIiMwMDAwMDAiLCBmaWxsID0gIiNhNDAzNGIiKSArDQogICAgICAgICAgICAgICAgICAgIGdlb21fbWFwKGRhdGEgPSB3b3JsZCAlPiUgZmlsdGVyKGNvbG9yPT05KSwgbWFwID0gd29ybGQsIGFlcyhsb25nLCBsYXQsIG1hcF9pZCA9IHJlZ2lvbiksIGNvbG9yID0gIiMwMDAwMDAiLCBmaWxsID0gIiMyMzhhMDAiKSArDQogICAgICAgICAgICAgICAgICAgIGdlb21fc2VnbWVudChkYXRhID0gbGluZWFzLCBhZXMoeCA9IGxvbmdfMSwgeSA9IGxhdF8xLCB4ZW5kID0gbG9uZ18yLCB5ZW5kID0gbGF0XzIpLCBjb2xvciA9ICIjMDAwMDAwIiwgc2l6ZSA9IDIsIGFscGhhID0gMC44LCBsaW5lZW5kID0gInJvdW5kIikgKw0KICAgICAgICAgICAgICAgICAgICBnZW9tX3BvaW50KGRhdGEgPSBjb29yZGNpdWRhZGVzLCBhZXMoeCA9IGxvbmcseSA9IGxhdCksIHNpemUgPSAyKSArDQogICAgICAgICAgICAgICAgICAgIHlsaW0oLTU1LE5BKSArDQogICAgICAgICAgICAgICAgICAgIHRoZW1lKHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICIjRkNERkRGIiksIHBhbmVsLmdyaWQgPSBlbGVtZW50X2xpbmUoY29sb3VyID0gIiMwMDAwMDAiKSwgYXhpcy50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICAgICAgICAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF9ibGFuaygpLCBheGlzLnRpY2tzID0gZWxlbWVudF9ibGFuaygpKQ0KYGBgDQpFbiBiYXNlIGEgbG9zIGRhdG9zIGRlbCBNaW5pc3RlcmlvIGRlIEFzdW50b3MgRXh0ZXJpb3JlcyB5IGRlbCoqIMONbmRpY2UgZGUgcGF6IGdsb2JhbCoqIHB1YmxpY2FkbyBwb3IgZWwgKipJbnN0aXR1dGUgb2YgRWNvbm9taWNzIGFuZCBQZWFjZSoqIGVuIDIwMTgscG9kZW1vcyBvYnNlcnZhciBlbiBlbCBtYXBhIGxvcyBwYcOtc2VzIG3DoXMgcGVsaWdyb3Nvcy4gRXN0ZSDDrW5kaWNlIGVzIMO6dGlsIHNvYnJlIHRvZG8gcGFyYSBtaXJhciBsYSBldm9sdWNpw7NuIGRlbCBuaXZlbCBkZSBwYXogZW4gdW4gcGHDrXMgYSBsbyBsYXJnbyBkZWwgdGllbXBvLiBFbCBJUEcgdXRpbGl6YSAyMyBpbmRpY2Fkb3JlcyBjdWFsaXRhdGl2b3MgeSBjdWFudGl0YXRpdm9zIGRlIGZ1ZW50ZXMgbXV5IHJlc3BldGFkYXMgeSBtaWRlIGVsIGVzdGFkbyBkZSBsYSBwYXogZW4gdHJlcyDDoW1iaXRvcyB0ZW3DoXRpY29zOiBlbCBncmFkbyBkZSBzZWd1cmlkYWQgeSBwcm90ZWNjacOzbiBzb2NpYWwsIGVsIGdyYWRvIGRlIGNvbmZsaWN0b3MgaW50ZXJub3MgZSBpbnRlcm5hY2lvbmFsZXMgYWN0aXZvcyB5IGVsIGdyYWRvIGRlIG1pbGl0YXJpemFjacOzbi4NCkNvbW8gcG9kZW1vcyBvYnNlcnZhciwgbGEgbWF5b3LDrWEgZGUgbG9zIHBhw61zZXMgY29uc2lkZXJhZG9zIG3DoXMg4oCY4oCZdmlvbGVudG9z4oCZ4oCZIHNlIGVuY3VlbnRyYW4gZW4gQW3DqXJpY2EgQ2VudHJhbCB5IExhdGluYS4gRXN0b3MgcGHDrXNlcyBzb24gOiBWZW5lenVlbGEgLCBFbCBTYWx2YWRvciwgQnJhc2lsICwgR3V5YW5hICwgSmFtYWljYSwgSG9uZHVyYXMgeSBNw6l4aWNvLg0KTG9zIG90cm9zIHBhw61zZXMg4oCY4oCZcGVsaWdyb3Nvc+KAmeKAmSBzb24gU3Vkw6FmcmljYSAoIMOBZnJpY2EpIHkgQWZnYW5pc3TDoW4gKEFzaWEpLg0KDQoNCg0KDQoNCmBgYHtyIG91dC53aWR0aD0iMTAwJSIsIGVjaG89RkFMU0V9DQptYXBhZmluYWwgPC0gZ2dkcmF3KG1hcGFzaSkgKyAgZHJhd19pbWFnZSh2ZW5lenVlbGEsIHggPSAwLjM0LCB5ID0gMC41Miwgd2lkdGggPSAwLjA1LCBoZWlnaHQgPSAwLjA1KSArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJhd19pbWFnZShzdWRhZnJpY2EsIHggPSAwLjU5LCB5ID0gMC4xOSwgd2lkdGggPSAwLjA1LCBoZWlnaHQgPSAwLjA1KSArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJhd19pbWFnZShzYWx2YWRvciwgeD0wLjI0LCB5PTAuMzMsIHdpZHRoID0gMC4wNSwgaGVpZ2h0ID0gMC4wNSkgKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyYXdfaW1hZ2UoYWZnYW5pc3RhbiwgeCA9IDAuNjgsIHkgPSAwLjY3LCB3aWR0aCA9IDAuMDUsIGhlaWdodCA9IDAuMDUpICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmF3X2ltYWdlKGJyYXNpbCwgeCA9IDAuNDEsIHkgPSAwLjI2LCB3aWR0aCA9IDAuMDUsIGhlaWdodCA9IDAuMDUpICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmF3X2ltYWdlKGd1eWFuYSwgeCA9IDAuNDAsIHkgPSAwLjQ3LCB3aWR0aCA9IDAuMDUsIGhlaWdodCA9IDAuMDUpICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmF3X2ltYWdlKGphbWFpY2EsIHggPSAwLjM1LCB5ID0gMC42MCwgd2lkdGggPSAwLjA1LCBoZWlnaHQgPSAwLjA1KSArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJhd19pbWFnZShob25kdXJhcywgeCA9IDAuMjYsIHkgPSAwLjU1LCB3aWR0aCA9IDAuMDUsIGhlaWdodCA9IDAuMDUpICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJhd19pbWFnZShtZXhpY28sIHggPSAwLjEyLCB5ID0gMC41Niwgd2lkdGggPSAwLjA1LCBoZWlnaHQgPSAwLjA1KQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KbWFwYWZpbmFsDQoNCmBgYA0KDQoNCiMjIyA8Rk9OVCBDT0xPUj0iI0RBMTZDQSI+IDIuMy4gUGHDrXNlcyBtw6FzIHNlZ3Vyb3MgPC9GT05UPg0KDQoNCg0KYGBge3Igb3V0LndpZHRoPSIxMDAlIn0NCiNJbXBvcnRhbW9zIGRhdG9zIHkgbG9zIGFycmVnbGFtb3MNCnVybDg3IDwtICJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vUGF2bGluYWRpbmtvdmEvQ3JpbWluYWxpZGFkL21haW4vcGFpc2VzLmNzdiINCnNlZ3Vyb3MgPC0gcmlvOjppbXBvcnQodXJsODcgLCBzZXRjbGFzcyA9ICJ0aWJibGUiKQ0KDQpuYW1lcyhzZWd1cm9zKT0gYygiUmFua2luZyIsIlBhaXMiLCJDcmltaW5hbGlkYWQiLCJTZWd1cmlkYWQiKQ0Kc2VndXJvcyA8LSBzZWd1cm9zICU+JSBtdXRhdGUoIFNlZ3VyaWRhZCA9IHN0cmluZ3I6OnN0cl9yZW1vdmVfYWxsKFNlZ3VyaWRhZCwgcGF0dGVybiA9ICIoWy5dKSIpKQ0Kc2VndXJvcyA8LSBzZWd1cm9zICU+JSBtdXRhdGUoIFNlZ3VyaWRhZCA9IHN0cmluZ3I6OnN0cl9yZXBsYWNlX2FsbChTZWd1cmlkYWQgLCBwYXR0ZXJuID0gIlssXSIgLCByZXBsYWNlbWVudCA9ICIuIiApKQ0Kc2VndXJvcyA8LSBzZWd1cm9zICU+JSBtdXRhdGUoIFNlZ3VyaWRhZCA9IGFzLm51bWVyaWMoU2VndXJpZGFkKSkNCg0Kc2VndXJvcyA8LSBzZWd1cm9zICU+JSBzZWxlY3QoUGFpcywgU2VndXJpZGFkKQ0KI0NyZWFtb3MgY8OtcmN1bG9zDQoNCnBjayA8LWNpcmNsZVByb2dyZXNzaXZlTGF5b3V0KHNlZ3Vyb3MkU2VndXJpZGFkLCBzaXpldHlwZSA9ICdhcmVhJykNCg0KbXlkYXRhPC0gY2JpbmQoc2VndXJvcywgcGNrKQ0KDQpteVBsb3RDb3JkIDwtIGNpcmNsZUxheW91dFZlcnRpY2VzKHBjaykNCg0KcGwgPC0gZ2dwbG90KCkNCg0KcGwgPC0gcGwgKyBnZW9tX3BvbHlnb24oZGF0YSA9IG15UGxvdENvcmQsIGFlcyh4LCB5LCBncm91cCA9IGlkLCBmaWxsPWFzLmZhY3RvcihpZCkpLCBjb2xvdXIgPSAiYmxhY2siLCBhbHBoYSA9IDAuNikNCnBsIDwtIHBsKyBnZW9tX3RleHQoZGF0YSA9IG15ZGF0YSwgYWVzKHgsIHksIHNpemU9U2VndXJpZGFkLCBsYWJlbCA9IFBhaXMpKSArIHNjYWxlX3NpemVfY29udGludW91cyhyYW5nZSA9IGMoMSw0KSkgKyB0aGVtZV92b2lkKCkgKyAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIikgKyBjb29yZF9lcXVhbCgpDQoNCg0KcGxvdGx5OjpnZ3Bsb3RseShwbCkNCg0KDQpgYGANClNpIGJpZW4gYWxndW5hcyByZWdpb25lcyBoYW4gY2HDrWRvIGVuIGNpY2xvcyBhcGFyZW50ZW1lbnRlIGludGVybWluYWJsZXMgZGUgdmlvbGVuY2lhIHkgY29uZmxpY3RvLCBvdHJhcyBkaXNmcnV0YW4gZGUgdW4gbml2ZWwgc29zdGVuaWRvIGRlIHBheiwgc2VndXJpZGFkIHkgcHJvc3BlcmlkYWQuDQoNCg0KQSBjb250aW51YWNpw7NuIHBvZGVtb3Mgb2JzZXJ2YXIgbGEgY2xhc2lmaWNhY2nDs24gZGUgbG9zIHBhw61zZXMgc2Vnw7puIGVsICoqw41uZGljZSBkZSBTZWd1cmlkYWQqKi4gRGljaG8gw61uZGljZSBvcmRlbmEgbG9zIHBhw61zZXMgZGVsIG11bmRvIHNlZ8O6biB1biBlc2NhbGFmw7NuIGRlbCAwIGFsIDEwMC4gU2UgdG9tYW4gZW4gY29uc2lkZXJhY2nDs24gZmFjdG9yZXMgY29tbyBlbCBuaXZlbCBkZSBkZWxpbmN1ZW5jaWEsIHNlZ3VyaWRhZCBhIGxhIGhvcmEgZGUgY2FtaW5hciBzb2xvL2EgcG9yIGxhIGNhbGxlIGRlIGTDrWEgeSBkZSBub2NoZSwgYXRyYWNvcywgcm9ib3MgZGUgYXV0b23Ds3ZpbGVzIHkgZW4gbG9zIGhvZ2FyZXMsIGNyw61tZW5lcyB2aW9sZW50b3MgeSBtw6FzLg0KRW4gbGFzIHByaW1lcmFzIHBvc2ljaW9uZXMgZW4gbG8gcXVlIHJlc3BlY3RhIGEgc2VndXJpZGFkIGNvcnJlc3BvbmRlbiBhIG5hY2lvbmVzIGRlIEFzaWEuIEVzdGFzIHNvbiBRYXRhciBjb24gODguMTAgcHVudG9zLCBUYWl3w6FuICg4NC43KSAsIEVtaXJhdG9zIMOBcmFiZXMgVW5pZG9zICg4NC41KSAsIEdlb3JnaWEoNzkuNSksIE9tw6FuKDc5LjMpLCB5IEhvbmcgS29uZyAoNzkpLg0KRW4gY3VhbnRvIGFsIGNvbnRpbmVudGUgZXVyb3BlbywgdG9kb3MgbG9zIHBhw61zZXMgc2UgdWJpY2FuIHNvYnJlIGxhIG1lZGlhIGdsb2JhbCBlbiBjdWFudG8gYSBzZWd1cmlkYWQuIEVudHJlIGxvcyBtZWpvcmVzIGVzdMOhbiBFc2xvdmVuaWEgY29uIDc5IHB1bnRvcywgc2llbmRvIGVsIHBhw61zIG3DoXMgc2VndXJvIGRlbCBtdW5kbyBmdWVyYSBkZSBBc2lhLiBMZSBzaWd1ZSBTdWl6YSBjb24gNzguNCBwdW50b3MuDQpFc3Bhw7FhIHNlIHNpdMO6YSBlbiBlbCBwdWVzdG8gMzfCuiBjb24gNjcuNiBwdW50b3MuDQpFbiBsbyBxdWUgcmVzcGVjdGEgYSBBbcOpcmljYSwgcG9jb3MgcGHDrXNlcyBoYW4gbG9ncmFkbyBlc3RhciBzb2JyZSBsYSBtZWRpYSBnbG9iYWwgZW4gY3VhbnRvIGEgc2VndXJpZGFkLiDDmm5pY2FtZW50ZSBDdWJhICg3MC45KSAsIENhbmFkw6EgKDU5LjMpIHkgTmljYXJhZ3VhKDU0LjUpLg0KDQoNCg0KIyMgPEZPTlQgQ09MT1I9IiNEQTE2Q0EiPiAzLlBvYmxhY2lvbmVzIGNvbiBtw6FzIHByZXNvcyA8L0ZPTlQ+IHsudGFic2V0fQ0KDQojIyMgKipQYcOtc2VzKiogDQoNCkFscmVkZWRvciBkZWwgbXVuZG8gZXhpc3RlbiB1bmFzIDExICBtaWxsb25lcyBkZSBwZXJzb25hcyBlbmNhcmNlbGFkYXMsIHlhIHNlYSBxdWUgZXN0w6luIGVzcGVyYW5kbyB1biBqdWljaW8sIGRldGVuaWRvcywgc2VudGVuY2lhZG9zIG8gY29udmljdG9zLg0KDQpFbiBsb3Mgc2lzdGVtYXMganVkaWNpYWxlcyBhIG5pdmVsIG11bmRpYWwsIGxvcyBjaXVkYWRhbm9zIHF1ZSBzZWFuIGVuY29udHJhZG9zIGN1bHBhYmxlcyBkZSBkaXZlcnNvcyBkZWxpdG9zIHB1ZWRlbiBjdW1wbGlyIGxhIHBlbmEgY29ycmVzcG9uZGllbnRlIGEgbGEgZmFsdGEsIGVzdGFibGVjaWRhIGVuIGxvcyBjw7NkaWdvcyBwZW5hbGVzLCBjb24gZWwgaW50ZXJuYW1pZW50byBkZWwgcmVvIGVuIHVuIGVzdGFibGVjaW1pZW50byBwZW5pdGVuY2lhcmlvLg0KDQpDb21vIHB1ZWRlIHNlciBwcmV2aXNpYmxlLCBhIG1heW9yIG7Dum1lcm8gZGUgcG9ibGFjacOzbiBxdWUgdGllbmUgdW4gcGHDrXMsIG1heW9yZXMgcHJvYmFiaWxpZGFkZXMgZXhpc3RlbiBkZSBxdWUsIGN1YW50aXRhdGl2YW1lbnRlLCBoYXlhIGNpZW50b3MgZGUgbWlsZXMgZGUgc3VzIGhhYml0YW50ZXMgZW5jYXJjZWxhZG9zLg0KU2luIGVtYmFyZ28sIHF1ZSBleGlzdGEgY29ycmVsYWNpw7NuIGVudHJlIHBvYmxhY2nDs24gdG90YWwgeSBwb2JsYWNpw7NuIGVuY2FyY2VsYWRhIG5vIHF1aWVyZSBkZWNpciBxdWUgaGF5YSBleGNlcGNpb25lcyBvIGVqZW1wbG9zIHF1ZSBldmlkZW5jaWVuIHNpdHVhY2lvbmVzIGNvbmNyZXRhcywgcG9yIG5vIGRlY2lyIGFub3JtYWxlcy4NCg0KRXN0ZSBlcyBlbCBjYXNvIGRlIEVzdGFkb3MgVW5pZG9zLCBxdWUgYSBwZXNhciBkZSBzZXIgZWwgdGVyY2VyIHBhw61zIG3DoXMgcG9ibGFkbyBkZWwgbXVuZG8gY29uIGNlcmNhIGRlIDMzMCBtaWxsb25lcyBkZSBoYWJpdGFudGVzLXBlcm8gbXV5IGxlam9zIGRlIEluZGlhIHkgQ2hpbmEtLCBlcyBlbCBwYcOtcyBxdWUgbWF5b3IgcG9ibGFjacOzbiBjYXJjZWxhcmlhIHRpZW5lLiBTZWfDum4gKipXb3JsZCBQcmlzb24gQnJpZWYqKiAsIGVuIDIwMTggdHV2byAgMi4xMjEuNjAwICAgIHBlcnNvbmFzIGVuIHByaXNpw7NuLiBFbCBtb3Rpdm8gcHJpbmNpcGFsIGRlIGVzdGUgc29icmVkaW1lbnNpb25hbWllbnRvIGVzIGxhIGR1cmEgcG9sw610aWNhIGp1ZGljaWFsIGVuIGVsIHBhw61zLCBjb24gcGVuYXMgbXV5IGVsZXZhZGFzIHkgcG9jbyBvcmllbnRhZGEgYSBsYSByZWluc2VyY2nDs24gZnJlbnRlIGEgdW5hIHBlcnNwZWN0aXZhIHB1bml0aXZhIG11eSBhc2VudGFkYS4NCg0KRGVzcHXDqXMgZGUgRUVVVSwgc2Ugc2l0w7phIENoaW5hICwgcXVlIGEgcGVzYXIgZGUgc2VyIGVsIHByaW1lciBwYcOtcyBtdW5kaWFsIGVuIGN1YW50byBhIG7Dum1lcm8gZGUgaGFiaXRhbnRlcywgc2Ugc2l0w7phIGJhc3RhbnRlIHBvciBkZXRyw6FzIGRlIEVFVVUuIEVuIDIwMTgsIENoaW5hIHR1dm8gMS42NDkuODA0IHBlcnNvbmFzIGVuIGxhIGNhcmNlbC4gTm8gb2JzdGFudGUsIGVsICoqV29ybGQgUHJpc29uIEJyaWVmKiogYWR2aWVydGUgcXVlIGVzdG9zIGRhdG9zIHPDs2xvIGluY2x1eWVuIGEgbG9zIHF1ZSB5YSBmdWVyb24gc2VudGVuY2lhZG9zIHkgc2UgZGVqYW4gZnVlcmEgb3RyYXMgcGVyc29uYXMgcXVlIGVzdMOhbiBlbiBwcm9jZXNvcyBqdWRpY2lhbGVzLiANCg0KDQpPdHJvIGRhdG8gcXVlIGxsYW1hIGxhIGF0ZW5jacOzbiBlcyBJbmRpYSwgcXVlIGVzIGVsIHNlZ3VuZG8gcGHDrXMgbcOhcyBwb2JsYWRvICwgc2luIGVtYmFyZ28sIGVzIGVsIHF1aW50byBlbiBjdWFudG8gYSBwZXJzb25hcyBlbmNhcmNlbGFkYXMsIGNvbiA0MTkuNjIzIGVuIDIwMTguDQoNCkVuIGVsIGNvbnRpbmVudGUgZXVyb3BlbywgUnVzaWEgZXMgZWwgcGHDrXMgcXVlIG3DoXMgcGVyc29uYXMgcHJpdmFkYXMgZGUgc3UgbGliZXJ0YWQgaGF5LTU2Ny43ODkuLQ0KDQpFc3Bhw7FhICxlbiBlbCBtZXMgZGUgRGljaWVtYnJlIGRlIDIwMTggdHV2byBlbiB0b3RhbCA0OC4zNDggcGVyc29uYXMgZW5jYXJjZWxhZGFzLCBzZWfDum4gbG9zIGRhdG9zIHByb3ZlbmllbnRlcyBkZWwgKipNaW5pc3RlcmlvIGRlbCBJbnRlcmlvcioqLg0KDQoNCg0KDQoNCmBgYHtyIG91dC53aWR0aD0iMTAwJSIgLCBlY2hvPUZBTFNFfQ0KI3BvYmxhY2lvbiBjYXJjZWxhcmlhDQp1cmwyIDwtICJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vUGF2bGluYWRpbmtvdmEvQ3JpbWluYWxpZGFkL21haW4vcG9ibGFjaW9uX2NhcmNlbGFyaWEuY3N2Ig0KDQpwYWlzZXM8LSByaW86OmltcG9ydCh1cmwyLCBzZXRjbGFzcz0idGliYmxlIikgJT4lIG11dGF0ZShQYWlzID0gYygxOjE1KSxDb3VudHJ5ID0gZmFjdG9yKENvdW50cnksIGxldmVscyA9IENvdW50cnlbb3JkZXIoTnVtYmVyLCBkZWNyZWFzaW5nID0gVFJVRSldKSwgTnVtYmVyID0gc3RyaW5ncjo6c3RyX3JlbW92ZV9hbGwoTnVtYmVyLCBwYXR0ZXJuID0gIlteWzphbG51bTpdXSIpLCBOdW1iZXIgPSBhcy5udW1lcmljKE51bWJlciksICkNCg0KcGwgPC0gZ2dwbG90KHBhaXNlcywgYWVzKHg9Q291bnRyeSwgeT1OdW1iZXIpKSArIGdlb21fcG9pbnQoYWVzKGNvbG9yPUNvdW50cnkpLCBzaXplPTMpICsgZ2VvbV9zZWdtZW50KGFlcyh4PUNvdW50cnksIHhlbmQ9IENvdW50cnksIHk9MCwgeWVuZD0gTnVtYmVyLCBjb2xvcj1Db3VudHJ5KSkrZ2VvbV90ZXh0KGFlcyhsYWJlbD1Db3VudHJ5KSwgc2l6ZT0zLCBhbmdsZT05MCwgdmp1c3Q9MSwgbnVkZ2VfeSA9MCkgK3RoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpKyBsYWJzKHk9Ik7Dum1lcm8gZGUgY2FyY2VsYXJpb3MiLCB4PU5VTEwsdGl0bGUgPSAiUG9ibGFjaW9uZXMgY29uIG3DoXMgcHJlc29zIiwgc3VidGl0bGUgPSAiRGF0b3MgZGUgMjAxOCIgLCBjYXB0aW9uPSAiRnVlbnRlOkZSRUQiKSsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCksYXhpcy5saW5lID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJyb3duIixzaXplPTAuNSksIGF4aXMudGlja3MueCA9IGVsZW1lbnRfYmxhbmsoKSwgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIiNGMEVFODQiKSwgcGFuZWwuZ3JpZC5tYWpvci55ID0gZWxlbWVudF9saW5lKCJncmV5IiksIHBhbmVsLmdyaWQubWFqb3IueCA9IGVsZW1lbnRfYmxhbmsoKSwgcGFuZWwuZ3JpZC5taW5vci55ID0gZWxlbWVudF9ibGFuaygpKQ0KYGBgDQoNCmBgYHtyIG91dC53aWR0aD0iMTAwJSIgLCBlY2hvPUZBTFNFfQ0KcGxvdGQgPC0gZ2dkcmF3KHBsKSAgKyBkcmF3X2ltYWdlKCJodHRwczovL3VwbG9hZC53aWtpbWVkaWEub3JnL3dpa2lwZWRpYS9jb21tb25zLzAvMDUvRmxhZ19vZl9CcmF6aWwuc3ZnIix4PSAwLjE0LCB5ID0gMC4zOSwgd2lkdGggPTAuMDMsIGhlaWdodCA9IDAuMDMsIHNjYWxlID0gMS4zKSAgKyBkcmF3X2ltYWdlKCJodHRwczovL3VwbG9hZC53aWtpbWVkaWEub3JnL3dpa2lwZWRpYS9jb21tb25zL2YvZjMvRmxhZ19vZl9SdXNzaWEuc3ZnIix4PSAwLjIwLCB5ID0gMC4zNiwgd2lkdGggPTAuMDMsIGhlaWdodCA9IDAuMDMsIHNjYWxlID0gMS4zKSArIGRyYXdfaW1hZ2UoImh0dHBzOi8vdXBsb2FkLndpa2ltZWRpYS5vcmcvd2lraXBlZGlhL2NvbW1vbnMvNC80MS9GbGFnX29mX0luZGlhLnN2ZyIseD0gMC4yNSwgeSA9IDAuMzAsIHdpZHRoID0wLjAzLCBoZWlnaHQgPSAwLjAzLCBzY2FsZSA9IDEuMykgKyBkcmF3X2ltYWdlKCJodHRwczovL3VwbG9hZC53aWtpbWVkaWEub3JnL3dpa2lwZWRpYS9jb21tb25zL2EvYTkvRmxhZ19vZl9UaGFpbGFuZC5zdmciLHg9IDAuMzEyLCB5ID0gMC4zMCwgd2lkdGggPTAuMDMsIGhlaWdodCA9IDAuMDMsIHNjYWxlID0gMS4zKSAgKyBkcmF3X2ltYWdlKCJodHRwczovL3VwbG9hZC53aWtpbWVkaWEub3JnL3dpa2lwZWRpYS9jb21tb25zL2IvYjQvRmxhZ19vZl9UdXJrZXkuc3ZnIix4PSAwLjM3LCB5ID0gMC4yNSwgd2lkdGggPTAuMDMsIGhlaWdodCA9IDAuMDMsIHNjYWxlID0gMS4zKSAgKyBkcmF3X2ltYWdlKCJodHRwczovL3VwbG9hZC53aWtpbWVkaWEub3JnL3dpa2lwZWRpYS9jb21tb25zLzkvOWYvRmxhZ19vZl9JbmRvbmVzaWEuc3ZnIix4PSAwLjQzLCB5ID0gMC4yNSwgd2lkdGggPTAuMDMsIGhlaWdodCA9IDAuMDMsIHNjYWxlID0gMS4zKSAgKyBkcmF3X2ltYWdlKCJodHRwczovL3VwbG9hZC53aWtpbWVkaWEub3JnL3dpa2lwZWRpYS9jb21tb25zL2MvY2EvRmxhZ19vZl9JcmFuLnN2ZyIseD0gMC40OCwgeSA9IDAuMjEsIHdpZHRoID0wLjAzLCBoZWlnaHQgPSAwLjAzLCBzY2FsZSA9IDEuMykgKyBkcmF3X2ltYWdlKCJodHRwczovL3VwbG9hZC53aWtpbWVkaWEub3JnL3dpa2lwZWRpYS9jb21tb25zL2YvZmMvRmxhZ19vZl9NZXhpY28uc3ZnIix4PSAwLjU0LCB5ID0gMC4yMSwgd2lkdGggPTAuMDMsIGhlaWdodCA9IDAuMDMsIHNjYWxlID0gMS4zKSArIGRyYXdfaW1hZ2UoImh0dHBzOi8vdXBsb2FkLndpa2ltZWRpYS5vcmcvd2lraXBlZGlhL2NvbW1vbnMvYS9hNC9GbGFnX29mX3RoZV9Vbml0ZWRfU3RhdGVzLnN2ZyIseD0gMC42MCwgeSA9IDAuNzksIHdpZHRoID0wLjAzLCBoZWlnaHQgPSAwLjAzLCBzY2FsZSA9IDEuMykrIGRyYXdfaW1hZ2UoImh0dHBzOi8vdXBsb2FkLndpa2ltZWRpYS5vcmcvd2lraXBlZGlhL2NvbW1vbnMvOS85OS9GbGFnX29mX3RoZV9QaGlsaXBwaW5lcy5zdmciLHg9IDAuNjU1LCB5ID0gMC4yMSwgd2lkdGggPTAuMDMsIGhlaWdodCA9IDAuMDMsIHNjYWxlID0gMS4zKSArIGRyYXdfaW1hZ2UoImh0dHBzOi8vdXBsb2FkLndpa2ltZWRpYS5vcmcvd2lraXBlZGlhL2NvbW1vbnMvYS9hZi9GbGFnX29mX1NvdXRoX0FmcmljYS5zdmciLHg9IDAuNzE1LCB5ID0gMC4yMSwgd2lkdGggPTAuMDMsIGhlaWdodCA9IDAuMDMsIHNjYWxlID0gMS4zKSArIGRyYXdfaW1hZ2UoImh0dHBzOi8vdXBsb2FkLndpa2ltZWRpYS5vcmcvd2lraXBlZGlhL2NvbW1vbnMvMi8yMS9GbGFnX29mX1ZpZXRuYW0uc3ZnIix4PSAwLjc3NSwgeSA9IDAuMjAsIHdpZHRoID0wLjAzLCBoZWlnaHQgPSAwLjAzLCBzY2FsZSA9IDEuMykgKyBkcmF3X2ltYWdlKCJodHRwczovL3VwbG9hZC53aWtpbWVkaWEub3JnL3dpa2lwZWRpYS9jb21tb25zLzIvMjEvRmxhZ19vZl9Db2xvbWJpYS5zdmciLHg9IDAuODM1LCB5ID0gMC4yMCwgd2lkdGggPTAuMDMsIGhlaWdodCA9IDAuMDMsIHNjYWxlID0gMS4zKSArIGRyYXdfaW1hZ2UoImh0dHBzOi8vdXBsb2FkLndpa2ltZWRpYS5vcmcvd2lraXBlZGlhL2NvbW1vbnMvNy83MS9GbGFnX29mX0V0aGlvcGlhLnN2ZyIseD0gMC44OSwgeSA9IDAuMjAsIHdpZHRoID0wLjAzLCBoZWlnaHQgPSAwLjAzLCBzY2FsZSA9IDEuMykgKyBkcmF3X2ltYWdlKCJodHRwczovL3VwbG9hZC53aWtpbWVkaWEub3JnL3dpa2lwZWRpYS9jb21tb25zL2YvZmEvRmxhZ19vZl90aGVfUGVvcGxlJTI3c19SZXB1YmxpY19vZl9DaGluYS5zdmciLHg9IDAuOTQsIHkgPSAwLjc0LCB3aWR0aCA9MC4wMywgaGVpZ2h0ID0gMC4wMywgc2NhbGUgPSAxLjMpDQoNCnBsb3RkDQoNCmBgYA0KDQoNCiMjIyAqKkPDs2RpZ28qKg0KDQoNCmBgYHtyIG91dC53aWR0aD0iMTAwJSIgfQ0KI3BvYmxhY2lvbiBjYXJjZWxhcmlhDQp1cmwyIDwtICJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vUGF2bGluYWRpbmtvdmEvQ3JpbWluYWxpZGFkL21haW4vcG9ibGFjaW9uX2NhcmNlbGFyaWEuY3N2Ig0KDQpwYWlzZXM8LSByaW86OmltcG9ydCh1cmwyLCBzZXRjbGFzcz0idGliYmxlIikgJT4lIG11dGF0ZShQYWlzID0gYygxOjE1KSxDb3VudHJ5ID0gZmFjdG9yKENvdW50cnksIGxldmVscyA9IENvdW50cnlbb3JkZXIoTnVtYmVyLCBkZWNyZWFzaW5nID0gVFJVRSldKSwgTnVtYmVyID0gc3RyaW5ncjo6c3RyX3JlbW92ZV9hbGwoTnVtYmVyLCBwYXR0ZXJuID0gIlteWzphbG51bTpdXSIpLCBOdW1iZXIgPSBhcy5udW1lcmljKE51bWJlciksICkNCg0KcGwgPC0gZ2dwbG90KHBhaXNlcywgYWVzKHg9Q291bnRyeSwgeT1OdW1iZXIpKSArIGdlb21fcG9pbnQoYWVzKGNvbG9yPUNvdW50cnkpLCBzaXplPTMpICsgZ2VvbV9zZWdtZW50KGFlcyh4PUNvdW50cnksIHhlbmQ9IENvdW50cnksIHk9MCwgeWVuZD0gTnVtYmVyLCBjb2xvcj1Db3VudHJ5KSkrZ2VvbV90ZXh0KGFlcyhsYWJlbD1Db3VudHJ5KSwgc2l6ZT0zLCBhbmdsZT05MCwgdmp1c3Q9MSwgbnVkZ2VfeSA9MCkgK3RoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpKyBsYWJzKHk9Ik7Dum1lcm8gZGUgY2FyY2VsYXJpb3MiLCB4PU5VTEwsdGl0bGUgPSAiUG9ibGFjaW9uZXMgY29uIG3DoXMgcHJlc29zIiwgc3VidGl0bGUgPSAiRGF0b3MgZGUgMjAxOCIgLCBjYXB0aW9uPSAiRnVlbnRlOkZSRUQiKSsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCksYXhpcy5saW5lID0gZWxlbWVudF9saW5lKGNvbG9yID0gImJyb3duIixzaXplPTAuNSksIGF4aXMudGlja3MueCA9IGVsZW1lbnRfYmxhbmsoKSwgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIiNGMEVFODQiKSwgcGFuZWwuZ3JpZC5tYWpvci55ID0gZWxlbWVudF9saW5lKCJncmV5IiksIHBhbmVsLmdyaWQubWFqb3IueCA9IGVsZW1lbnRfYmxhbmsoKSwgcGFuZWwuZ3JpZC5taW5vci55ID0gZWxlbWVudF9ibGFuaygpKQ0KYGBgDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KcGxvdGQgPC0gZ2dkcmF3KHBsKSAgKyBkcmF3X2ltYWdlKCJodHRwczovL3VwbG9hZC53aWtpbWVkaWEub3JnL3dpa2lwZWRpYS9jb21tb25zLzAvMDUvRmxhZ19vZl9CcmF6aWwuc3ZnIix4PSAwLjE0LCB5ID0gMC4zOSwgd2lkdGggPTAuMDMsIGhlaWdodCA9IDAuMDMsIHNjYWxlID0gMS4zKSAgKyBkcmF3X2ltYWdlKCJodHRwczovL3VwbG9hZC53aWtpbWVkaWEub3JnL3dpa2lwZWRpYS9jb21tb25zL2YvZjMvRmxhZ19vZl9SdXNzaWEuc3ZnIix4PSAwLjIwLCB5ID0gMC4zNiwgd2lkdGggPTAuMDMsIGhlaWdodCA9IDAuMDMsIHNjYWxlID0gMS4zKSArIGRyYXdfaW1hZ2UoImh0dHBzOi8vdXBsb2FkLndpa2ltZWRpYS5vcmcvd2lraXBlZGlhL2NvbW1vbnMvNC80MS9GbGFnX29mX0luZGlhLnN2ZyIseD0gMC4yNSwgeSA9IDAuMzAsIHdpZHRoID0wLjAzLCBoZWlnaHQgPSAwLjAzLCBzY2FsZSA9IDEuMykgKyBkcmF3X2ltYWdlKCJodHRwczovL3VwbG9hZC53aWtpbWVkaWEub3JnL3dpa2lwZWRpYS9jb21tb25zL2EvYTkvRmxhZ19vZl9UaGFpbGFuZC5zdmciLHg9IDAuMzEyLCB5ID0gMC4zMCwgd2lkdGggPTAuMDMsIGhlaWdodCA9IDAuMDMsIHNjYWxlID0gMS4zKSAgKyBkcmF3X2ltYWdlKCJodHRwczovL3VwbG9hZC53aWtpbWVkaWEub3JnL3dpa2lwZWRpYS9jb21tb25zL2IvYjQvRmxhZ19vZl9UdXJrZXkuc3ZnIix4PSAwLjM3LCB5ID0gMC4yNSwgd2lkdGggPTAuMDMsIGhlaWdodCA9IDAuMDMsIHNjYWxlID0gMS4zKSAgKyBkcmF3X2ltYWdlKCJodHRwczovL3VwbG9hZC53aWtpbWVkaWEub3JnL3dpa2lwZWRpYS9jb21tb25zLzkvOWYvRmxhZ19vZl9JbmRvbmVzaWEuc3ZnIix4PSAwLjQzLCB5ID0gMC4yNSwgd2lkdGggPTAuMDMsIGhlaWdodCA9IDAuMDMsIHNjYWxlID0gMS4zKSAgKyBkcmF3X2ltYWdlKCJodHRwczovL3VwbG9hZC53aWtpbWVkaWEub3JnL3dpa2lwZWRpYS9jb21tb25zL2MvY2EvRmxhZ19vZl9JcmFuLnN2ZyIseD0gMC40OCwgeSA9IDAuMjEsIHdpZHRoID0wLjAzLCBoZWlnaHQgPSAwLjAzLCBzY2FsZSA9IDEuMykgKyBkcmF3X2ltYWdlKCJodHRwczovL3VwbG9hZC53aWtpbWVkaWEub3JnL3dpa2lwZWRpYS9jb21tb25zL2YvZmMvRmxhZ19vZl9NZXhpY28uc3ZnIix4PSAwLjU0LCB5ID0gMC4yMSwgd2lkdGggPTAuMDMsIGhlaWdodCA9IDAuMDMsIHNjYWxlID0gMS4zKSArIGRyYXdfaW1hZ2UoImh0dHBzOi8vdXBsb2FkLndpa2ltZWRpYS5vcmcvd2lraXBlZGlhL2NvbW1vbnMvYS9hNC9GbGFnX29mX3RoZV9Vbml0ZWRfU3RhdGVzLnN2ZyIseD0gMC42MCwgeSA9IDAuNzksIHdpZHRoID0wLjAzLCBoZWlnaHQgPSAwLjAzLCBzY2FsZSA9IDEuMykrIGRyYXdfaW1hZ2UoImh0dHBzOi8vdXBsb2FkLndpa2ltZWRpYS5vcmcvd2lraXBlZGlhL2NvbW1vbnMvOS85OS9GbGFnX29mX3RoZV9QaGlsaXBwaW5lcy5zdmciLHg9IDAuNjU1LCB5ID0gMC4yMSwgd2lkdGggPTAuMDMsIGhlaWdodCA9IDAuMDMsIHNjYWxlID0gMS4zKSArIGRyYXdfaW1hZ2UoImh0dHBzOi8vdXBsb2FkLndpa2ltZWRpYS5vcmcvd2lraXBlZGlhL2NvbW1vbnMvYS9hZi9GbGFnX29mX1NvdXRoX0FmcmljYS5zdmciLHg9IDAuNzE1LCB5ID0gMC4yMSwgd2lkdGggPTAuMDMsIGhlaWdodCA9IDAuMDMsIHNjYWxlID0gMS4zKSArIGRyYXdfaW1hZ2UoImh0dHBzOi8vdXBsb2FkLndpa2ltZWRpYS5vcmcvd2lraXBlZGlhL2NvbW1vbnMvMi8yMS9GbGFnX29mX1ZpZXRuYW0uc3ZnIix4PSAwLjc3NSwgeSA9IDAuMjAsIHdpZHRoID0wLjAzLCBoZWlnaHQgPSAwLjAzLCBzY2FsZSA9IDEuMykgKyBkcmF3X2ltYWdlKCJodHRwczovL3VwbG9hZC53aWtpbWVkaWEub3JnL3dpa2lwZWRpYS9jb21tb25zLzIvMjEvRmxhZ19vZl9Db2xvbWJpYS5zdmciLHg9IDAuODM1LCB5ID0gMC4yMCwgd2lkdGggPTAuMDMsIGhlaWdodCA9IDAuMDMsIHNjYWxlID0gMS4zKSArIGRyYXdfaW1hZ2UoImh0dHBzOi8vdXBsb2FkLndpa2ltZWRpYS5vcmcvd2lraXBlZGlhL2NvbW1vbnMvNy83MS9GbGFnX29mX0V0aGlvcGlhLnN2ZyIseD0gMC44OSwgeSA9IDAuMjAsIHdpZHRoID0wLjAzLCBoZWlnaHQgPSAwLjAzLCBzY2FsZSA9IDEuMykgKyBkcmF3X2ltYWdlKCJodHRwczovL3VwbG9hZC53aWtpbWVkaWEub3JnL3dpa2lwZWRpYS9jb21tb25zL2YvZmEvRmxhZ19vZl90aGVfUGVvcGxlJTI3c19SZXB1YmxpY19vZl9DaGluYS5zdmciLHg9IDAuOTQsIHkgPSAwLjc0LCB3aWR0aCA9MC4wMywgaGVpZ2h0ID0gMC4wMywgc2NhbGUgPSAxLjMpDQoNCg0KYGBgDQoNCiMjIDxGT05UIENPTE9SPSIjREExNkNBIj4gNC5Bc2VzaW5vcyA8L0ZPTlQ+IHsudGFic2V0fQ0KDQojIyMgKioqQXNlc2lub3MqKg0KDQpFbiBlbCBncsOhZmljbyBxdWUgdmVtb3MgYSBjb250aW51YWNpw7NuICwgcG9kZW1vcyB2ZXIgYWxndW5vcyBkZSBsb3MgYXNlc2lub3MgZW4gc2VyaWUgc2Vnw7puIGVsIG7Dum1lcm8gKipjb25maXJtYWRvcyoqIGRlIHbDrWN0aW1hcy4gTm8gb2JzdGFudGUsIGV4aXN0ZW4gbnVtZXJvc2FzIHbDrWN0aW1hcyBzb3NwZWNoYWRhcywgcXVlIGVzdMOhbiBzaW4gY29uZmlybWFyLiANCkxvcyBhc2VzaW5vcyBlbiBzZXJpZSBhc2VzaW5hbiBhIHRyZXMgbyBtw6FzIHBlcnNvbmFzIGVuIGRvcyBvIG3DoXMgZXZlbnRvcyBzZXBhcmFkb3MuDQoNCg0KPi0gKipUaHVnIEJlaHJhbSAoSW5kaWEpKiogOiAgQ29ub2NpZG8gY29tbyDigJjigJlFbCByZXkgZGUgbG9zIG1hdG9uZXPigJnigJksIGZ1ZSB0YW1iacOpbiB1bm8gZGUgbG9zIGFzZXNpbm9zIGVuIHNlcmllIG3DoXMgcHJvbMOtZmljb3MgZGUgbGEgaGlzdG9yaWEuIEVyYSBlbCBsw61kZXIgZGUgdW5hIHNlY3RhIGxsYW1hZGEg4oCY4oCZVGh1Z3PigJnigJkgLCBjb25zaWRlcmFkYSBsYSBwcmltZXJhIG1hZmlhIGRlbCBtdW5kbyBxdWUgb3BlcsOzIGVuIEluZGlhLiBMb3MgcGFydGljaXBhbnRlcyBkZSBsYSBzZWN0YSBjb25zZWd1w61hbiBoYWNlciBmYWxzYXMgYW1pc3RhZGVzIGNvbiBsb3MgcGVyZWdyaW5vcyBoYXN0YSBnYW5hcnNlIHN1IGNvbmZpYW56YS4gQ3VhbmRvIGxvcyBwZXJlZ3Jpbm9zIGxlcyBwZXJtaXTDrWFuIHVuaXJzZWxlcyBlbiBzdSB0cmF2ZXPDrWEsIGVsIGdydXBvIGRlIGxvcyDigJjigJl0aHVnc+KAmeKAmSBsb3MgbWF0YWJhbiB0cmFzIHJvYmFybG9zLiBFbGxvcyBsZXMgZXN0cmFuZ3VsYWJhbiBjb24gdW4gcGHDsXVlbG8gY2VyZW1vbmlhbCBsbGFtYWRvICoqcnVtYWwqKiAsIHkgZXNjb25kw61hbiBsb3MgY2Fkw6F2ZXJlcyBlbnRlcnLDoW5kb2xvcyBvIGFycm9qw6FuZG9sb3MgZGVudHJvIGRlIGFsZ8O6biBwb3pvLiANCkJlaHJhbSBmdWUgZWplY3V0YWRvIGVuIDE4NDAgcG9yIGFob3JjYW1pZW50by4NCg0KDQogDQo+LSAqKkFsZXhlIFBvcG92YSAoUnVzc2lhKSoqIDogSW51YWd1csOzIGVsIGFzZXNpbmF0byBzZXJpYWwgY29tbyB1bmEgcmVpdmluZGljYWNpw7NuIGRlIGfDqW5lcm8gZXh0cmVtYS4gQ3Jlw7MgbGEgcHJpbWVyYSBhZ2VuY2lhIG1hdHJpbW9uaWFsIGRlIGxhIGhpc3RvcmlhIGNvbiBlbCBzbG9nYW4gKirigJnigJlMaWJlcmFyIGEgZXNwb3NhcyBpbmZlbGljZXMgZGUgc3VzIGVzcG9zb3MgdGlyYW5vc+KAmeKAmSoqLg0KU3UgZXN0cmF0ZWdpYSBkZSBuZWdvY2lvIGVyYSBhcGxpY2FyIHRhcmlmYXMgbcOtbmltYXMgYWwgYWxjYW5jZSBkZSBjdWFscXVpZXIgYm9sc2lsbG8sIHkgYXJzw6luaWNvIGNvbW8gdmVow61jdWxvIG1vcnRhbC4gVXNhYmEgZWwgKiptZXRhbG9pZGUqKiwgdW5vIGRlIGxvcyB2ZW5lbm9zIG3DoXMgbW9ydGFsZXMuDQpGdWUgZnVzaWxhZGEgZW4gU2FuIFBldGVyc2J1cmdvIGVuIDE5MDkuDQoNCj4tICoqSGFyb2xkIFNoaXBtYW4gKFJlaW5vIFVuaWRvKSoqIDogQ29ub2NpZG8gY29tbyAqKkRvY3RvciBNdWVydGUqKiAsIHkgbWF0YWJhIGEgc3VzIHbDrWN0aW1hcyBpbnllY3TDoW5kb2xlcyBzb2JyZWRvc2lzIGRlIG1vcmZpbmEuIFNvbMOtYSBlbGVnaXIgYSBwZXJzb25hcyBpbmRlZmVuc2FzLCBkZSBlZGFkIGF2YW56YWRhLCBlbiBzdSBtYXlvcsOtYSBtdWplcmVzIHF1ZSBzb2JyZXBhc2FiYW4gbG9zIDc1IGHDsW9zLiBFbCBwcm9waW8gU2hpcG1hbiBleHRlbmTDrWEgbG9zIGNlcnRpZmljYWRvcyBkZSBkZWZ1bmNpw7NuIHBvbmnDqW5kb2xlcyBjb21vIGNhdXNhIGRlIG11ZXJ0ZSAqKnBvciB2ZWpleioqLiBFbiBlbCBhw7FvIDIwMDAsIGZ1ZSBjb25kZW5hZG8gYSAxMDAwIGHDsW9zIGRlIHByaXNpw7NuIGNvbiBjYWRlbmFzIHBlcnBldHVhcy4gTm8gb2JzdGFudGUsIG11cmnDsyBlbiAyMDA0IGFob3Jjw6FuZG9zZSBlbiBzdSBjZWxkYSBkZSBwcmlzacOzbi4NCg0KPi0gKipNYXJpYW0gU291bGFraW90aXMgKCBHcmVjaWEpICoqIDogTWFkcmUgU3VwZXJpb3JhIGRlIHVuYSBvcmRlbiBkZSBtb25qYXMgaWxlZ2FsbWVudGUgZXN0YWJsZWNpZGEgbGxhbWFkYXMg4oCcTGFzIENhbGVuZGFyaXN0YeKAnSBzZXBhcmFkYXMgZGUgbGEgSWdsZXNpYSBPcnRvZG94YSwgZW4gR3JlY2lhLiAgU3UgKiptb2R1cyBvcGVyYW5kaXMqKiBlcmEgYWxlbnRhciBhIGxhcyBtdWplcmVzIGFkaW5lcmFkYXMgYSB1bmlyc2UgYWwgY29udmVudG8geSBsdWVnbyB0b3J0dXJhcmxhcyBoYXN0YSBxdWUgZG9uYXJhbiBzdXMgZm9ydHVuYXMgYWwgbW9uYXN0ZXJpby4gVW5hIHZleiBsb3MgZG9uYWJhbiwgU291bGFraW90aXMgbGFzIG1hdGFiYS4gVGFtYmnDqW4gZW5nYcOxw7MgYSBtdWNob3MgZGUgc3VzIG51ZXZvcyByZWNsdXRhcyBwYXJhIHF1ZSBjZWRpZXJhbiBzdXMgcHJvcGllZGFkZXMgYSBzdSBub21icmUsIHlhIHF1ZSBsb3MgY29udmVuY2nDsyBkZSBxdWUgZXN0YSBlcmEgbGEgbWVqb3IgbWFuZXJhIGRlIGVudHJhciBhbCBjaWVsby4gRnVlIHNlbnRlbmNpYWRhIMO6bmljYW1lbnRlIGEgMTYgYcOxb3MgZGUgcHJpc2nDs24sIHNpbiBlbWJhcmdvIG11cmnDsyBlbiBsYSBjw6FyY2VsIGNvbiB1bmEgZ3JhbiBmb3J0dW5hLiANCg0KPi0gKipMdWlzIEFsZnJlZG8gR2FyYXZpdG8gKCBDb2xvbWJpYSkqKiA6IGVyYSBjb25vY2lkbyBjb21vICoqTGEgQmVzdGlhKiouIEFudGVzIGRlIGN1bXBsaXIgbG9zIDE4IGHDsW9zLCBmdWUgZGV0ZW5pZG8gcG9yIGxhIHBvbGljaWEgYWwgaW50ZW50YXIgYWJ1c2FyIGRlIHVuIG5pw7FvLiBUcmFzIGVzdGUgbW9tZW50byBlbXBlesOzIGEgdmlvbGFyIG5pw7Fvcy4gRnVlIGludGVybmFkbyB2YXJpYXMgdmVjZXMgZW4gaG9zcGl0YWxlcyBwc2lxdWlhdHJpY29zLCBwZXJvIGEgcGVzYXIgZGUgZWxsbywgc2lndWnDsyB2aWxhbmRvIHkgdG9ydHVyYW5kbyBhIGRlY2VuYXMgZGUgbmnDsW9zLiBBIGxvcyAzNiBhw7FvcyBjb21lbnrDsyBjb24gbG9zIGFzZXNpbmF0b3MuICBFbiAyMDAxLCBmdWUgc2VudGVuY2lhZG8gYSAxODUzIGHDsW9zIHkgOSBkw61hcyBkZSBjw6FyY2VsLCBsYSBjb25kZW5hIG3DoXMgYWx0YSBkZSBsYSBxdWUgc2UgdGVuZ2EgcmVnaXN0cm8gZW4gQ29sb21iaWEs4oCLIGF1bnF1ZSBwb3N0ZXJpb3JtZW50ZSBmdWUgY29ubXV0YWRhIGEgNDAgYcOxb3MsIHBvciBzdSBjb2xhYm9yYWNpw7NuIHkgYnVlbiBjb21wb3J0YW1pZW50by4NCg0KPi0gKipQZWRybyBBbG9uc28gTMOzcGV6IChDb2xvbWJpYSkqKiAuIENvbm9jaWRvIGNvbW8gZWwgKipNb25zdHJ1byBkZSBsb3MgQW5kZXMqKi4gUGVkcm8gdmlhasOzIHBvciBQZXLDuiwgeSBoYWLDrWEgZW1wZXphZG8gYSBhdGFjYXIgdmlvbGVudGFtZW50ZSB5IGFzZXNpbmFyIGEgbmnDsWFzIGRlIGxhcyB0cmlidXMgbG9jYWxlcy4gTHVlZ28gaGl6byB2aWFqZXMgcG9yIEVjdWFkb3IgLCBkb25kZSBsb3MgY2Fzb3MgZGUgZGVzYXBhcmljacOzbiBkZSBtdWNoYWNoYXMgYXVtZW50YXJvbi4gVHJhcyB2aW9sYXIsIGVzdHJhbmd1bGFyIHkgbWF0YXIgYSBzdXMgdsOtY3RpbWFzLCBwcmFjdGljYWJhIG5lY3JvZmlsaWEgY29uIHN1cyBjdWVycG9zIHlhIHNpbiB2aWRhLCB5IGxvcyB0ZXJtaW5hYmEgZXNjb25kaWVuZG8gbyBlbnRlcnJhbmRvIHBhcmEgbm8gc2VyIGRlc2N1YmllcnRhcy4gDQpVbiBlcnJvciBkZSBQZWRyw7MgbGUgbGxldsOzIGRpcmVjdGFtZW50ZSBhIHN1IGRldGVuY2nDs24uIFBpbGxhcm9uIGFsIGNyaW1pbmFsIGNvbiBsYXMgbWFub3MgZW4gbGEgbWFzYSBtaWVudHJhcyBzZWN1ZXN0cmFiYSBlbiB1biBzdXBlcm1lcmNhZG8gYSBNYXJpZSwgdW5hIG5pw7FhIGRlIDEyIGHDsW9zLiBMb3MgZ3JpdG9zIGRlIHN1IG1hZHJlIGFsZXJ0YXJvbiBhIGxvcyBlbXBsZWFkb3MgZGVsIGxvY2FsIHF1ZSBsb2dyYXJvbiBkYXJsZSBjYXphLiANCkxlIGNvbmRlbmFyb24gYSAxNiBhw7FvcyBkZSBwcmlzacOzbi4gU2luIGVtYmFyZ28sIGFsIGZpbmFsIGxlIGltcHVzaWVyb24gdW5hIGZpYW56YSBkZSBjaW5jdWVudGEgZG9sYXJlcyB5IGxhIG9ibGlnYWNpw7NuIGRlIHVuIHRyYXRhbWllbnRvIHBzaXF1acOhdHJpY28geSBzdSBwb3N0ZXJpb3Igc2VndWltaWVudG8gbWVuc3VhbC4gVW5hIHZleiBlbiBsaWJlcnRhZCwgZGVzYXBhcmVjacOzIGVuIDE5OTguIEVuIDIwMDIgbGEgSW50ZXJwb2wgZW1pdGnDsyB1bmEgb3JkZW4gZGUgYsO6c3F1ZWRhIHkgY2FwdHVyYSBjb250cmEgZWwgY29sb21iaWFubyAsIHBlcm8gc2luIGVtYmFyZ28sIHNpZ3VlIGVuIGxpYmVydGFkLiANCg0KPi0gKipNaXl1a2kgSXNoaWthd2EgKEphcMOzbikqKiA6IENvbm9jaWRhIGNvbW8gbGEgKipNYXRyb25hIGRlbW9uw61hY2EqKiwgbWF0YWJhIGEgbG9zIHJlY2nDqW4gbmFjaWRvcyBwYXJhICoqc2FsdmFybGVzIGRlIHVuYSB2aWRhIGRlIG1pc2VyaWEgeSBwb2JyZXphKiouIEluY2x1c28gaGFiw61hIHBhZHJlcyBxdWUgYWN1ZMOtYW4gYSBlbGxhIGNvbiBlbCBmaW4gZGUgcXVlIGhpY2llcmEgYWxnbywgeWEgcXVlIG5vIHBvZMOtYW4gYWxpbWVudGFyIGEgc3UgaGlqby4gU3VzIHByw6FjdGljYXMgbm8gZXJhbiB0YW4gc2VjcmV0YXMsIHNpbiBlbWJhcmdvLG5hZGllIHJlYWxtZW50ZSBoaXpvIG5hZGEgcGFyYSBkZXRlbmVybGEuIFN1IG1hcmlkbywgZWwgRFIuIE5ha2F5YW1hIGVyYSBxdWnDqW4gc2UgZW5jYXJnYWJhIGRlIGhhY2VyIGxvcyBjZXJ0aWZpY2Fkb3MgZGUgZGVmdW5jacOzbiBmYWxzb3MuIFNpbiBlbWJhcmdvIGVuIDE5NDggbGEgcG9saWPDrWEgbGEgZGV0dXZvLCB0cmFzIGhhYmVyIGVuY29udHJhZG8gbG9zIHJlc3RvcyBkZSBiZWLDqXMgeSB0cmFzIGxhIGF1dG9wc2lhLCBzZSBkZXNjdWJyacOzIHF1ZSBubyBoYWLDrWFuIG11ZXJ0byBwb3IgY2F1c2FzIG5hdHVyYWxlcy4gQSBwZXNhciBkZSB0b2RvLCBzw7NsbyBmdWUgY29uZGVuYWRhIGEgOCBhw7FvcyBkZSBwcmlzacOzbiBwb3IgZGVsaXRvIGRlIG9taXNpw7NuLCB5IG5vIHBvciBhc2VzaW5hdG8uIA0KDQoNCg0KDQpgYGB7ciBvdXQud2lkdGg9IjEwMCUiICxlY2hvPUZBTFNFfQ0KDQojUGVyc29uYXMNCg0KdXJsIDwtICJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vUGF2bGluYWRpbmtvdmEvQ3JpbWluYWxpZGFkL21haW4vcGVyc29uYXMuY3N2Ig0KDQpwZXJzb25hcyA8LSByaW86OmltcG9ydCh1cmwsIHNldGNsYXNzID0gInRpYmJsZSIpDQpwZXJzb25hMSA8LSBwZXJzb25hcyANCg0KbmFtZXMocGVyc29uYTEpPSBjKCJQZXJzb25hIiwiQ2FudGlkYWQiKQ0KDQpwZXJzb25hMSA8LSBwZXJzb25hMSAlPiUgIGFycmFuZ2UoZGVzYyhDYW50aWRhZCkpDQoNCg0KcGxvdCA8LSBwZXJzb25hMSAlPiUgIGdncGxvdChhZXMoeD1yZW9yZGVyKFBlcnNvbmEsIENhbnRpZGFkKSAseT1DYW50aWRhZCksYWVzKGZjdF9yZXYoUGVyc29uYSkpKSsgY29vcmRfZmxpcCgpICsgIGdlb21fYmFyKGNvbG9yID0gIiMwMDAwMDAiLGZpbGwgPSAiIzdGRjM2NCIsc3RhdD0iaWRlbnRpdHkiLCB3aWR0aCA9IDAuNSkgKyBnZW9tX3RleHQoc2l6ZSA9IDQsIHN0YXQgPSAiaWRlbnRpdHkiLCBhZXMobGFiZWw9IENhbnRpZGFkKSwgaGp1c3Q9IDEpICsgIGxhYnMoZmlsbD1OVUxMLA0KICAgICAgICAgICAgICAgeD0gTlVMTCwNCiAgICAgICAgICAgICAgIHk9TlVMTCwNCiAgICAgICAgICAgICAgIHRpdGxlPSJBc2VzaW5vcyBjb24gbcOhcyBudW1lcm9zIGRlIHbDrWN0aW1hcyAiLA0KICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgIGNhcHRpb249IkZ1ZW50ZTogV2lraXBlZGlhIikgKw0KICAgICAgICAgICAgICAgdGhlbWUoIHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsPSIjREVDMEYwIiksDQogICAgICAgICAgICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgICAgIHBhbmVsLmdyaWQgID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgICAgICBheGlzLnRpY2tzID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIixzaXplID0gMTApLA0KICAgICAgICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMCwgc2l6ZSA9IDE1KSwNCiAgICAgICAgICAgICAgcGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgc2l6ZSA9IDE1KSwNCiAgICAgICAgICAgICAgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsDQogICAgICAgICAgICAgIHBsb3QubWFyZ2luID0gbWFyZ2luKHQgPSAxMCwgciA9IDgsIGIgPSA4ICwgbD0zMiksDQogICAgICAgICAgICAgIHN0cmlwLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJibHVlIixjb2xvdXIgPSAicmVkIikpDQpgYGANCg0KYGBge3Igb3V0LndpZHRoPSIxMDAlIiAgLCBlY2hvPUZBTFNFfQ0KDQpwbG90ZCA8LSBnZ2RyYXcocGxvdCkgICsgZHJhd19pbWFnZSgiaHR0cHM6Ly9oaXN0b3JpYWRlbG9zYXNlc2lub3MuZmlsZXMud29yZHByZXNzLmNvbS8yMDE0LzEyL2Vsbm9ydGU1MGY4ZDA4YzYyZmE3XzIwLXRodWcuanBnIix4PSAwLjA0LCB5ID0gMC44Miwgd2lkdGggPTAuMDUsIGhlaWdodCA9IDAuMDUsIHNjYWxlID0gMS4zKSArDQogICAgZHJhd19pbWFnZSgiaHR0cHM6Ly93d3cuaW5mb2JhZS5jb20vbmV3LXJlc2l6ZXIvSEUtbWYweVRRM0U0NHVJREtlUEh5ZnJUZEpFPS83Njh4NzY4L2ZpbHRlcnM6Zm9ybWF0KGpwZyk6cXVhbGl0eSg4NSkvczMuYW1hem9uYXdzLmNvbS9hcmMtd29yZHByZXNzLWNsaWVudC11cGxvYWRzL2luZm9iYWUtd3Avd3AtY29udGVudC91cGxvYWRzLzIwMTgvMTIvMTMxNTU2MjIvTWFkYW1lLVBvcG92YS01LmpwZyIsIHg9MC4wNCwgeT0wLjcxLCB3aWR0aD0wLjA2LCBoZWlnaHQgPSAwLjA2LCBzY2FsZT0xLjMpICsNCiAgICBkcmF3X2ltYWdlKCJodHRwczovL3d3dy50aGVzdW4uY28udWsvd3AtY29udGVudC91cGxvYWRzLzIwMjAvMDkvTklOVENIREJQSUNUMDAwMDAxMjk0MjU5LmpwZz9zdHJpcD1hbGwmdz05NjAiLCB4PTAuMDMsIHk9MC41OSwgd2lkdGg9MC4wNSwgaGVpZ2h0ID0gMC4wNSwgc2NhbGUgPSAxLjIpICsgZHJhd19pbWFnZSgiaHR0cDovL2szMy5rbjMubmV0L3RhcmluZ2EvNS9EL0IvMS8yLzUvTWF4aW1pbGlhbm9BMzEvRjI3LmpwZyIsIHg9MC4wMDIsIHk9MC40NSwgd2lkdGg9MC4wNTUsIGhlaWdodCA9IDAuMDYsIHNjYWxlID0gMS4zKSArIGRyYXdfaW1hZ2UoImh0dHA6Ly9rMzMua24zLm5ldC90YXJpbmdhL0UvNC9DL0IvQS84L01heGltaWxpYW5vQTMxL0Y3Ri5qcGciLCB4PTAuMDYsIHk9MC4zNSwgd2lkdGg9MC4wNiwgaGVpZ2h0ID0gMC4wNiwgc2NhbGUgPSAxLjMpICsNCiAgICBkcmF3X2ltYWdlKCJodHRwczovL3d3dy5pbmZvYmFlLmNvbS9uZXctcmVzaXplci9BOFM3XzA0QW0xdUVMZ2MyYjcxaXNBRFhnSmM9Lzc2OHgxMTUyL2ZpbHRlcnM6Zm9ybWF0KGpwZyk6cXVhbGl0eSg4NSkvczMuYW1hem9uYXdzLmNvbS9hcmMtd29yZHByZXNzLWNsaWVudC11cGxvYWRzL2luZm9iYWUtd3Avd3AtY29udGVudC91cGxvYWRzLzIwMTgvMTEvMTQxMDA5MzMvUGVkcm8tQWxvbnNvLUxvcGV6LWVsLU1vbnN0cnVvLWRlLWxvcy1BbmRlcy0yLmpwZyIseD0gMC4wNiwgeSA9IDAuMjQ1LCB3aWR0aCA9MC4wNiwgaGVpZ2h0ID0gMC4wNiwgc2NhbGUgPSAxLjMpICsNCiAgICBkcmF3X2ltYWdlKCJodHRwczovL21pcm8ubWVkaXVtLmNvbS9tYXgvNjI1LzEqWHAwNmZqMmhFcWlwNXI2LWVKMVR6Zy5qcGVnIix4PSAwLjAzNSwgeSA9IDAuMTE1LCB3aWR0aCA9MC4wNiwgaGVpZ2h0ID0gMC4wNiwgc2NhbGUgPSAxLjMpDQoNCnBsb3RkDQoNCmBgYA0KDQojIyMgKipDw7NkaWdvKioNCg0KDQoNCmBgYHtyIG91dC53aWR0aD0iMTAwJSIgfQ0KDQojUGVyc29uYXMNCg0KdXJsIDwtICJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vUGF2bGluYWRpbmtvdmEvQ3JpbWluYWxpZGFkL21haW4vcGVyc29uYXMuY3N2Ig0KDQpwZXJzb25hcyA8LSByaW86OmltcG9ydCh1cmwsIHNldGNsYXNzID0gInRpYmJsZSIpDQpwZXJzb25hMSA8LSBwZXJzb25hcyANCg0KbmFtZXMocGVyc29uYTEpPSBjKCJQZXJzb25hIiwiQ2FudGlkYWQiKQ0KDQpwZXJzb25hMSA8LSBwZXJzb25hMSAlPiUgIGFycmFuZ2UoZGVzYyhDYW50aWRhZCkpDQoNCg0KcGxvdCA8LSBwZXJzb25hMSAlPiUgIGdncGxvdChhZXMoeD1yZW9yZGVyKFBlcnNvbmEsIENhbnRpZGFkKSAseT1DYW50aWRhZCksYWVzKGZjdF9yZXYoUGVyc29uYSkpKSsgY29vcmRfZmxpcCgpICsgIGdlb21fYmFyKGNvbG9yID0gIiMwMDAwMDAiLGZpbGwgPSAiIzdGRjM2NCIsc3RhdD0iaWRlbnRpdHkiLCB3aWR0aCA9IDAuNSkgKyBnZW9tX3RleHQoc2l6ZSA9IDQsIHN0YXQgPSAiaWRlbnRpdHkiLCBhZXMobGFiZWw9IENhbnRpZGFkKSwgaGp1c3Q9IDEpICsgIGxhYnMoZmlsbD1OVUxMLA0KICAgICAgICAgICAgICAgeD0gTlVMTCwNCiAgICAgICAgICAgICAgIHk9TlVMTCwNCiAgICAgICAgICAgICAgIHRpdGxlPSJBc2VzaW5vcyBjb24gbcOhcyBudW1lcm9zIGRlIHbDrWN0aW1hcyAiLA0KICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgIGNhcHRpb249IkZ1ZW50ZTogV2lraXBlZGlhIikgKw0KICAgICAgICAgICAgICAgdGhlbWUoIHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsPSIjREVDMEYwIiksDQogICAgICAgICAgICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgICAgIHBhbmVsLmdyaWQgID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgICAgICBheGlzLnRpY2tzID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIixzaXplID0gMTApLA0KICAgICAgICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMCwgc2l6ZSA9IDE1KSwNCiAgICAgICAgICAgICAgcGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgc2l6ZSA9IDE1KSwNCiAgICAgICAgICAgICAgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsDQogICAgICAgICAgICAgIHBsb3QubWFyZ2luID0gbWFyZ2luKHQgPSAxMCwgciA9IDgsIGIgPSA4ICwgbD0zMiksDQogICAgICAgICAgICAgIHN0cmlwLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJibHVlIixjb2xvdXIgPSAicmVkIikpDQojQSBlc3RvIGxlIGHDsWFkaW1vcyBpbcOhZ2VuZXMgY29uICcnZ2dkcmF3JycgeSAnJ2RyYXdfaW1hZ2UnJw0KYGBgDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KDQpwbG90ZCA8LSBnZ2RyYXcocGxvdCkgICsgZHJhd19pbWFnZSgiaHR0cHM6Ly9oaXN0b3JpYWRlbG9zYXNlc2lub3MuZmlsZXMud29yZHByZXNzLmNvbS8yMDE0LzEyL2Vsbm9ydGU1MGY4ZDA4YzYyZmE3XzIwLXRodWcuanBnIix4PSAwLjA0LCB5ID0gMC44Miwgd2lkdGggPTAuMDUsIGhlaWdodCA9IDAuMDUsIHNjYWxlID0gMS4zKSArDQogICAgZHJhd19pbWFnZSgiaHR0cHM6Ly93d3cuaW5mb2JhZS5jb20vbmV3LXJlc2l6ZXIvSEUtbWYweVRRM0U0NHVJREtlUEh5ZnJUZEpFPS83Njh4NzY4L2ZpbHRlcnM6Zm9ybWF0KGpwZyk6cXVhbGl0eSg4NSkvczMuYW1hem9uYXdzLmNvbS9hcmMtd29yZHByZXNzLWNsaWVudC11cGxvYWRzL2luZm9iYWUtd3Avd3AtY29udGVudC91cGxvYWRzLzIwMTgvMTIvMTMxNTU2MjIvTWFkYW1lLVBvcG92YS01LmpwZyIsIHg9MC4wNCwgeT0wLjcxLCB3aWR0aD0wLjA2LCBoZWlnaHQgPSAwLjA2LCBzY2FsZT0xLjMpICsNCiAgICBkcmF3X2ltYWdlKCJodHRwczovL3d3dy50aGVzdW4uY28udWsvd3AtY29udGVudC91cGxvYWRzLzIwMjAvMDkvTklOVENIREJQSUNUMDAwMDAxMjk0MjU5LmpwZz9zdHJpcD1hbGwmdz05NjAiLCB4PTAuMDMsIHk9MC41OSwgd2lkdGg9MC4wNSwgaGVpZ2h0ID0gMC4wNSwgc2NhbGUgPSAxLjIpICsgZHJhd19pbWFnZSgiaHR0cDovL2szMy5rbjMubmV0L3RhcmluZ2EvNS9EL0IvMS8yLzUvTWF4aW1pbGlhbm9BMzEvRjI3LmpwZyIsIHg9MC4wMDIsIHk9MC40NSwgd2lkdGg9MC4wNTUsIGhlaWdodCA9IDAuMDYsIHNjYWxlID0gMS4zKSArIGRyYXdfaW1hZ2UoImh0dHA6Ly9rMzMua24zLm5ldC90YXJpbmdhL0UvNC9DL0IvQS84L01heGltaWxpYW5vQTMxL0Y3Ri5qcGciLCB4PTAuMDYsIHk9MC4zNSwgd2lkdGg9MC4wNiwgaGVpZ2h0ID0gMC4wNiwgc2NhbGUgPSAxLjMpICsNCiAgICBkcmF3X2ltYWdlKCJodHRwczovL3d3dy5pbmZvYmFlLmNvbS9uZXctcmVzaXplci9BOFM3XzA0QW0xdUVMZ2MyYjcxaXNBRFhnSmM9Lzc2OHgxMTUyL2ZpbHRlcnM6Zm9ybWF0KGpwZyk6cXVhbGl0eSg4NSkvczMuYW1hem9uYXdzLmNvbS9hcmMtd29yZHByZXNzLWNsaWVudC11cGxvYWRzL2luZm9iYWUtd3Avd3AtY29udGVudC91cGxvYWRzLzIwMTgvMTEvMTQxMDA5MzMvUGVkcm8tQWxvbnNvLUxvcGV6LWVsLU1vbnN0cnVvLWRlLWxvcy1BbmRlcy0yLmpwZyIseD0gMC4wNiwgeSA9IDAuMjQ1LCB3aWR0aCA9MC4wNiwgaGVpZ2h0ID0gMC4wNiwgc2NhbGUgPSAxLjMpICsNCiAgICBkcmF3X2ltYWdlKCJodHRwczovL21pcm8ubWVkaXVtLmNvbS9tYXgvNjI1LzEqWHAwNmZqMmhFcWlwNXI2LWVKMVR6Zy5qcGVnIix4PSAwLjAzNSwgeSA9IDAuMTE1LCB3aWR0aCA9MC4wNiwgaGVpZ2h0ID0gMC4wNiwgc2NhbGUgPSAxLjMpDQoNCg0KYGBgDQoNCg0KIyMgPEZPTlQgQ09MT1I9IiNEQTE2Q0EiPiA1LiBUYXNhIGNvbXBhcmFkYSA8L0ZPTlQ+IHsudGFic2V0fQ0KDQojIyMgKioqQ29tcGFyYWNpw7NuKioNCg0KRWwgc2lndWllbnRlIGdyw6FmaWNvIG5vcyBtdWVzdHJhIGxhIHRhc2EgY29tcGFyYWRhIGRlIGNyaW1pbmFsaWRhZCBkZSBsb3MgcGHDrXNlcyBkZSBsYSBVbmnDs24gRXVyb3BlYSwgY29uc2lkZXJhbmRvIGxhcyBpbmZyYWNjaW9uZXMgcGVuYWxlcyBwb3IgZGlleiBtaWwgaGFiaXRhbnRlcy4gU29uIGRhdG9zIGRlIGxvcyBhw7FvcyAyMDA4LTIwMDkuDQoNCkVzcGHDsWEgLGNvbW8gcG9kZW1vcyBvYnNlcnZhciwgZXMgdW5vIGRlIGxvcyBwYcOtc2VzIG3DoXMgc2VndXJvcyBkZSBFdXJvcGEsIHNlZ8O6biBsb3MgZGF0b3MgZGUgKipFdXJvc3RhdCoqLiANCg0KDQoNCmBgYHtyIG91dC53aWR0aD0iMTAwJSIgLCBlY2hvPUZBTFNFfQ0KDQojVGFzYSBjb21wYXJhZGENCg0KdXJsIDwtICJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vUGF2bGluYWRpbmtvdmEvQ3JpbWluYWxpZGFkL21haW4vY29tcGFyYWRhLmNzdiINCmNvbXBhcmFkYSA8LSByaW86OmltcG9ydCh1cmwsIHNldGNsYXNzID0gInRpYmJsZSIpICU+JSBtdXRhdGUoUGFpcyA9IGMoIlNVRUNJQSIsIkJFTEdJQ0EiLCJESU5BTUFSQ0EiLCJSRUlOTyBVTklETyIsIkhPTEFOREEiLCJBTEVNQU5JQSIsIkxVWEVNQlVSR08iLCJGSU5MQU5ESUEiLCJJUkxBTkRBIiwiQVVTVFJJQSIsIklUQUxJQSIsIkZSQU5DSUEiLCJFU1BBw5FBIiwiUE9SVFVHQUwiLCJHUkVDSUEiKSxQYWlzID0gZmFjdG9yKFBhaXMsIGxldmVscyA9IFBhaXNbb3JkZXIoVGFzYSwgZGVjcmVhc2luZyA9IFRSVUUpXSksIFRhc2EgPSBzdHJpbmdyOjpzdHJfcmVtb3ZlX2FsbChUYXNhLCBwYXR0ZXJuID0gIlteWzphbG51bTpdXSIpLCBUYXNhID0gYXMubnVtZXJpYyhUYXNhKSwpDQoNCg0KZCA8LSBnZ3Bsb3QoY29tcGFyYWRhKSArDQogIGdlb21fcG9pbnQoYWVzKHggPSBSYW5raW5nLCB5ID0gVGFzYSwgY29sb3VyID0gUGFpcyApKSArDQogIGZhY2V0X3dyYXAodmFycyhQYWlzKSkrIGxhYnModGl0bGUgPSAiVGFzYSBkZSBjcmltaW5hbGlkYWQgY29tcGFyYWRhICIsDQogICAgICAgICAgICAgIHN1YnRpdGxlID0gIlBvciBuw7ptZXJvIGRlIGRlbGl0b3MiLCANCiAgICAgICAgICAgICAgY2FwdGlvbiA9ICJEYXRvcyBwcm92ZW5pZW50ZXMgZGUgTWluaXN0ZXJpbyBkZSBBc3VudG9zIEV4dGVyaW9yZXMiLA0KICAgICAgICAgICAgICB4ID0gIlJhbmtpbmcgIiwNCiAgICAgICAgICAgICAgeSA9IE5VTEwsDQogICAgICAgICAgICAgIGNvbG9yID0gIlJhbmtpbmciKQ0KDQoNCg0KcGxvdGx5OjpnZ3Bsb3RseShkLCB3aWR0aCA9IDkwMCwgaGVpZ2h0ID0gNTAwKQ0KDQpgYGANCg0KIyMjICoqQ8OzZGlnbyoqDQoNCg0KYGBge3Igb3V0LndpZHRoPSIxMDAlIn0NCg0KI1Rhc2EgY29tcGFyYWRhDQoNCnVybCA8LSAiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL1BhdmxpbmFkaW5rb3ZhL0NyaW1pbmFsaWRhZC9tYWluL2NvbXBhcmFkYS5jc3YiDQpjb21wYXJhZGEgPC0gcmlvOjppbXBvcnQodXJsLCBzZXRjbGFzcyA9ICJ0aWJibGUiKSAlPiUgbXV0YXRlKFBhaXMgPSBjKCJTVUVDSUEiLCJCRUxHSUNBIiwiRElOQU1BUkNBIiwiUkVJTk8gVU5JRE8iLCJIT0xBTkRBIiwiQUxFTUFOSUEiLCJMVVhFTUJVUkdPIiwiRklOTEFORElBIiwiSVJMQU5EQSIsIkFVU1RSSUEiLCJJVEFMSUEiLCJGUkFOQ0lBIiwiRVNQQcORQSIsIlBPUlRVR0FMIiwiR1JFQ0lBIiksUGFpcyA9IGZhY3RvcihQYWlzLCBsZXZlbHMgPSBQYWlzW29yZGVyKFRhc2EsIGRlY3JlYXNpbmcgPSBUUlVFKV0pLCBUYXNhID0gc3RyaW5ncjo6c3RyX3JlbW92ZV9hbGwoVGFzYSwgcGF0dGVybiA9ICJbXls6YWxudW06XV0iKSwgVGFzYSA9IGFzLm51bWVyaWMoVGFzYSksKQ0KDQoNCmQgPC0gZ2dwbG90KGNvbXBhcmFkYSkgKw0KICBnZW9tX3BvaW50KGFlcyh4ID0gUmFua2luZywgeSA9IFRhc2EsIGNvbG91ciA9IFBhaXMgKSkgKw0KICBmYWNldF93cmFwKHZhcnMoUGFpcykpKyBsYWJzKHRpdGxlID0gIlRhc2EgY29tcGFyYWRhICIsDQogICAgICAgICAgICAgIHN1YnRpdGxlID0gIlBvciBuw7ptZXJvIGRlIGRlbGl0b3MiLCANCiAgICAgICAgICAgICAgY2FwdGlvbiA9ICJEYXRvcyBwcm92ZW5pZW50ZXMgZGUgTWluaXN0ZXJpbyBkZSBBc3VudG9zIEV4dGVyaW9yZXMiLA0KICAgICAgICAgICAgICB4ID0gIlJhbmtpbmcgIiwNCiAgICAgICAgICAgICAgeSA9IE5VTEwsDQogICAgICAgICAgICAgIGNvbG9yID0gIlJhbmtpbmciKQ0KDQoNCmBgYA0KDQojIyA8Rk9OVCBDT0xPUj0iI0RBMTZDQSI+IDYuIENyaW1lbiBlbiBFc3Bhw7FhIDwvRk9OVD4NCg0Kwr9FcyBFc3Bhw7FhIHVuIHBhw61zIHNlZ3Vybz8gQ29tbyBoZW1vcyBwb2RpZG8gb2JzZXJ2YXIgZW4gbG9zIGdyw6FmaWNvcyBhbnRlcmlvcmVzLCBFc3Bhw7FhIGVzIHVubyBkZSBsb3MgcGHDrXNlcyBldXJvcGVvcyBtw6FzIHNlZ3Vyb3MsIHlhIHF1ZSBubyBvY3VwYSBuaW5nw7puIHB1ZXN0byBkZXN0YWNhZG8gZW4gbGFzIGNsYXNpZmljYWNpb25lcyBkZSBsb3MgcHJpbmNpcGFsZXMgdGlwb3MgZGUgY3LDrW1lbmVzIGNvbW8gaG9taWNpZGlvcywgdmlvbGFjaW9uZXMgbyByb2JvcyAuIA0KDQpTZWfDum4gZGF0b3MgZGUgMjAxNiBwcm9wb3JjaW9uYWRvcyBwb3IgKipFdXJvc3RhdCoqIDoNCg0KPi0g4oCiQ3VlbnRhIGNvbiB1bmEgdGFzYSBkZSAwLDQ4ICoqaG9taWNpZGlvcyoqIHBvciBjYWRhIDEwMC4wMDAgaGFiaXRhbnRlcy4NCj4tIOKAolRhc2EgZGUgKiphZ3Jlc2lvbmVzKiogZGUgMzcsMiBwb3IgY2FkYSAxMDAuMDAwIGhhYml0YW50ZXMuDQo+LSDigKJUYXNhIGRlICoqcm9ib3MqKiBxdWUgYWZlY3RhIGEgMzUxLDEgZGUgY2FkYSBjaWVuIG1pbCBwZXJzb25hcy4NCj4tIOKAokVzcGHDsWEgZXN0w6EgZW4gZWwgcHVlc3RvIDIxwrogY29uIDE4LDcgY2Fzb3MgZGUgKip2aW9sZW5jaWEgc2V4dWFsKiogIHBvciBjYWRhIDEwMC4wMDAgcGVyc29uYXMuIA0KDQoNCiMjIyA8Rk9OVCBDT0xPUj0iI0RBMTZDQSI+IDYuMSBDb211bmlkYWRlcyBwb3IgbsO6bWVybyBkZSBkZWxpdG9zIDwvRk9OVD4NCg0KDQpgYGB7ciBvdXQud2lkdGg9IjEwMCUifQ0KI0ltcG9ydGFtb3MgZGF0b3MgeSBsb3MgYXJyZWdsYW1vcw0KdXJsMzMgPC0gImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9QYXZsaW5hZGlua292YS9DcmltaW5hbGlkYWQvbWFpbi9jY2FhLmNzdiINCmNjYWEgPC0gcmlvOjppbXBvcnQodXJsMzMpDQoNCmRhdGEgPC0gY2NhYSAlPiUgbXV0YXRlKCBUb3RhbCA9IHN0cmluZ3I6OnN0cl9yZW1vdmVfYWxsKERlbGl0b3MsIHBhdHRlcm4gPSAiKFsuXSkiKSkNCmRhdGEgPC0gZGF0YSAlPiUgbXV0YXRlKCBUb3RhbCA9IHN0cmluZ3I6OnN0cl9yZXBsYWNlX2FsbChUb3RhbCAsIHBhdHRlcm4gPSAiWyxdIiAsIHJlcGxhY2VtZW50ID0gIi4iICkpDQpkYXRhIDwtIGRhdGEgJT4lIG11dGF0ZSggVG90YWwgPSBhcy5udW1lcmljKFRvdGFsKSkNCg0KY2NhYTEgPC0gZGF0YSAlPiUgc2VsZWN0KENvbXVuaWRhZCAsIFRvdGFsKSAlPiUgYXJyYW5nZShkZXNjKFRvdGFsKSkgJT4lIGZpbHRlcihDb211bmlkYWQgIT0gIkVzcGFueWEgVG90YWwiKQ0KbmFtZXMoY2NhYTEpID0gYygiQ0NBQSIsIkRlbGl0byIpDQoNCmxpYnJhcnkod29yZGNsb3VkMikNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkodGlkeXZlcnNlKQ0KDQojR3LDoWZpY28NCmNvbXVuaWRhZGVzIDwtIGdncGxvdChjY2FhMSwgYWVzKHg9cmVvcmRlcihDQ0FBLERlbGl0byksIHk9RGVsaXRvLCBmaWxsPUNDQUEpKSsNCiAgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKw0KICBjb29yZF9wb2xhcihzdGFydCA9IDApICArIHlsaW0oMCw0MTAwMDApICsgDQogIGxhYnMgKHg9IkNvbXVuaWRhZGVzIEF1dG9ub21hcyIpICsgbGFicyh5PSJEZWxpdG9zIikgKyBsYWJzKHRpdGxlID0gIkNvbXVuaWRhZGVzIHBvciBuw7ptZXJvIGRlIGRlbGl0b3MgIikgDQoNCmNvbXVuaWRhZGVzDQoNCmBgYA0KDQpTZWfDum4gZGF0b3MgcHJvcG9yY2lvbmFkb3MgcG9yIGVsICoqTWluaXN0ZXJpbyBkZWwgSW50ZXJpb3IqKiBlbiAyMDEwLCBwb2RlbW9zIG9ic2VydmFyIGxhcyBDb211bmlkYWRlcyBBdXTDs25vbWFzIGRvbmRlIG3DoXMgZGVsaXRvcyBlIGluZnJhY2Npb25lcyBzZSBwcm9kdWNlbi4NCg0KDQpMYXMgY2lmcmFzIGFic29sdXRhcyByZXZlbGFuIHF1ZSBBbmRhbHVjw61hIGNvbiA0MDkuMzkyIGNhc29zICwgTWFkcmlkIGNvbiA0MDEuODU1IGNhc29zIHkgVmFsZW5jaWEgY29uIDI4Ny4xNTYgY2Fzb3Mgc29uLCBwb3IgZXN0ZSBvcmRlbiwgbGFzIGNvbXVuaWRhZGVzIGNvbiBtw6FzIG5pdmVsIGRlbGljdGl2by4gVGFtYmnDqW4gaW5mbHV5ZSBxdWUgc29uIGxhcyBjb211bmlkYWRlcyBxdWUgbWF5b3IgcG9ibGFjacOzbiB0aWVuZW4sIHNpbiBjb250YXIgbGEgQ29tdW5pZGFkIGRlIENhdGFsdcOxYSAsIHF1ZSBubyBlc3RhYmEgZW4gbG9zIGRhdG9zIG9mcmVjaWRvcy4gTm8gb2JzdGFudGUsIHNlZ8O6biBkYXRvcyBkZSAqKk9ic2VydmF0b3JpbyBkZSBsYSBEZWxpbmN1ZW5jaWEgZW4gQW5kYWx1Y8OtYSoqIENhdGFsdcOxYSBzZSBzaXTDumEgZW4gZWwgcHVlc3RvIG7Dum1lcm8gMywgZGVsYW50ZSBkZSBsYSBDb211bmlkYWQgVmFsZW5jaWFuYSAsIGNvbiBtw6FzIGRlIDM1MC4wMDAgY2Fzb3MuDQoNCioqQW5kYWx1Y8OtYSoqIHNlIHNpdMO6YSBlbiB0b2RhcyBsYXMgdGlwb2xvZ8OtYXMgZGVsaWN0aXZhcyBtdXkgY2VyY2FuYXMgYSBsYSBtZWRpYSBlc3Bhw7FvbGEuIEVzdG8gcXVpZXJlIGRlY2lyIHF1ZSwgYSBwZXNhciBkZSBzZXIgbGEgY29tdW5pZGFkIG3DoXMgcG9ibGFkYSwgbm8gc2UgZGlmZXJlbmNpYSBkZWwgcmVzdG8gZGUgY29tdW5pZGFkZXMgZW4gZWwgbml2ZWwgZGUgZGVsaW5jdWVuY2lhIHJlZ2lzdHJhZGEuIEVuIGRpY2hhIGNvbXVuaWRhZCwgR3JhbmFkYSBlcyBsYSBwcm92aW5jaWEgZG9uZGUgbcOhcyBob21pY2lkaW9zIHkgYXNlc2luYXRvcyBzZSBwcm9kdWNlbi4NCg0KRW4gKipNYWRyaWQqKiwgZWwgZGVsaXRvIG3DoXMgZ3JhdmUsIGVsIGRlIGhvbWljaWRpb3MsIGhhIGNhw61kbyB1biAxMSUuTG9zIGRlbGl0b3MgZGUgbGVzaW9uZXMgeSByacOxYXMgdHVtdWx0dWFyaWFzIGFzY2llbmRlbiB1biAxMC42JS4gTG9zIHNlY3Vlc3Ryb3MgZGVudW5jaWFkb3MgYXNjZW5kaWVyb24gYWwgMTYlLg0KVW5vIGRlIGxvcyBkYXRvcyBtw6FzIHByZW9jdXBhbnRlcyBlcyBlbCBpbXBvcnRhbnRlIGF1bWVudG8gZGUgZGVsaXRvcyBjb250cmEgbGEgbGliZXJ0YWQgZSBpbmRlbW5pZGFkIHNleHVhbC4gTG9zIHJvYm9zIGNvbiB2aW9sZW5jaWEgZSBpbnRpbWlkYWNpw7NuIHN1Ymllcm9uIHVuIDkuMiUgOyBsb3Mgcm9ib3MgZW4gdml2aWVuZGFzIGNheWVyb24gdW4gMTAuNSUNCg0KRW4gKipWYWxlbmNpYSoqLCBoYXkgcXVlIGRlc3RhY2FyIHF1ZSBlbiBlbCBjYXNvIGRlIGhvbWljaWRpb3MgZG9sb3NvcyB5IGFzZXNpbmF0b3MgY29uc3VtYWRvcyBpbmNyZW1lbnRhIHVuIDE1MCUuIEVuIGN1YW50byBhIGxvcyBkZWxpdG9zIGNvbnRyYSBsYSBsaWJlcnRhZCBlIGluZGVtbmlkYWQgc2V4dWFsIGluY3JlbWVudGFuIHVuIDI2LDQlLCBtaWVudHJhcyBxdWUgZWwgcmVzdG8gZGUgbG9zIGRlbGl0b3MgY29udHJhIGxhIGxpYmVydGFkIGUgaW5kZW1uaWRhZCBzZXh1YWwgc3ViZSB1biAzMCw3ICUuDQpUYW1iacOpbiBoYW4gYXVtZW50YWRvIGxvcyByb2JvcyBkZSB2ZWjDrWN1bG9zIHVuIDQsNCAlIHkgbG9zIHJvYm9zIGNvbiB2aW9sZW5jaWEgZSBpbnRpbWlkYWNpw7NuIHVuIDgsMSUuIFkgYmFqYSB1biAxNSwzICUgbG9zIHJvYm9zIGNvbiBsYSBmdWVyemEgZW4gZG9taWNpbGlvIHkgdGFtYmnDqW4gYmFqYW4gbG9zIGRlbGl0b3MgcG9yIHRyw6FmaWNvIGRlIGRyb2dhcyB1biAzLDklLg0KDQoNCg0KDQogDQogDQoNCg0KDQoNCiMjIyA8Rk9OVCBDT0xPUj0iI0RBMTZDQSI+IDYuMiBUaXBvcyBkZSBkZWxpdG9zIDwvRk9OVD4NCg0KDQoNCmBgYHtyIG91dC53aWR0aD0iMTAwJSJ9DQojSW1wcm90YW1vcyBkYXRvcw0KdXJsOTggPC0gImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9QYXZsaW5hZGlua292YS9DcmltaW5hbGlkYWQvbWFpbi9kcm9nYXMuY3N2Ig0KdGlwb3M8LSByaW86OmltcG9ydCh1cmw5OCAsIHNldGNsYXNzID0gInRpYmJsZSIpDQoNCiNIdXJ0b3MgDQoNCiBodXJ0b3MgPC0gdGlwb3MgJT4lIHNlbGVjdChIdXJ0b3MsIEFueSkNCg0KZ3JhZmh1cnRvcyA8LSBnZ3Bsb3QoaHVydG9zLCBhZXMoeD1BbnksIHk9SHVydG9zICwgY29sb3I9QW55KSkgKyBnZW9tX2xpbmUoKSAgKw0KICBleHBhbmRfbGltaXRzKHk9MikgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsgbGFicyh0aXRsZSA9ICJJbmZyYWNjaW9uZXMgcGVuYWxlcyBwb3IgaHVydG9zICIsIHN1YnRpdGxlID0iRW4gbWlsZXMgZGUgaGFiaXRhbnRlcyIgLCAgY2FwdGlvbiA9ICJTb3VyY2U6SU5FIiwNCiAgICAgICAgICAgICAgeCA9ICJGZWNoYSAiLA0KICAgICAgICAgICAgICB5ID0gTlVMTCwNCiAgICAgICAgICAgICAgY29sb3IgPSAiSHVydG9zIikgKyB0aGVtZSgNCiAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIiNGN0M5QzkiKSkgDQoNCiNIYWNlbW9zIGxvIG1pc21vIHBhcmEgbG9zIG90cm9zIGRlbGl0b3MgeSBmaW5hbG1lbnRlIGp1bnRhbW9zIGxvcyBncsOhZmljb3MgY29uIGxpYnJhcnkocGF0Y2h3b3JrKQ0KYGBgDQoNCmBgYHtyLGVjaG89RkFMU0V9DQoNCg0KIyBEcm9nYXMNCiAgDQpkcm9nYXMgPC0gdGlwb3MgJT4lIHNlbGVjdChJbmZyYWNjaW9uZXNkcm9nYXMsIEFueSkNCg0KICBncmFmZHJvZ2FzIDwtIGdncGxvdChkcm9nYXMsIGFlcyh4PUFueSwgeT1JbmZyYWNjaW9uZXNkcm9nYXMgLCBjb2xvcj1BbnkpKSArIGdlb21fbGluZSgpICArDQogIGV4cGFuZF9saW1pdHMoeT0yKSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKyBsYWJzKHRpdGxlID0gIkluZnJhY2Npb25lcyBwZW5hbGVzIHBvciB0csOhZmljbyBkcm9nYXMgIixzdWJ0aXRsZSA9IkVuIG1pbGVzIGRlIGhhYml0YW50ZXMiICwgICAgIGNhcHRpb24gPSAiU291cmNlOklORSIsDQogICAgICAgICAgICAgIHggPSAiRmVjaGEgIiwNCiAgICAgICAgICAgICAgeSA9IE5VTEwsDQogICAgICAgICAgICAgIGNvbG9yID0gIkRyb2dhcyIpICsgdGhlbWUoDQogIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICIjQjBGQUU5IikpIA0KDQoNCg0KI1NleHVhbGVzDQoNCnNleHVhbGVzIDwtIHRpcG9zICU+JSBzZWxlY3QoU2V4dWFsZXMsQW55KQ0KDQogIGdyYWZzZXh1YWwgPC0gZ2dwbG90KHNleHVhbGVzLCBhZXMoeD1BbnksIHk9U2V4dWFsZXMgLCBjb2xvcj1BbnkpKSArIGdlb21fbGluZSgpICArDQogIGV4cGFuZF9saW1pdHMoeT0yKSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKyBsYWJzKHRpdGxlID0gIkluZnJhY2Npb25lcyBhZ3Jlc2lvbmVzIHNleHVhbGVzICIsICAgIGNhcHRpb24gPSAiU291cmNlOklORSIsDQogICAgICAgICAgICAgIHggPSAiRmVjaGEgIiwNCiAgICAgICAgICAgICAgeSA9IE5VTEwsDQogICAgICAgICAgICAgIGNvbG9yID0gIlNleHVhbGVzIikgKyB0aGVtZSgNCiAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIiNGNUVFNzMiKSkgDQoNCg0KDQojU2VjdWVzdHJvcw0Kc2VjdWVzdHJvcyA8LSB0aXBvcyAlPiUgc2VsZWN0KFNlY3Vlc3Ryb3MsIEFueSkNCg0KICBncmFmc2VjdWVzdHJvcyA8LSBnZ3Bsb3Qoc2VjdWVzdHJvcywgYWVzKHg9QW55LCB5PVNlY3Vlc3Ryb3MgLCBjb2xvcj1BbnkpKSArIGdlb21fbGluZSgpICArDQogIGV4cGFuZF9saW1pdHMoeT0yKSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKyBsYWJzKHRpdGxlID0gIkluZnJhY2Npb25lcyBwZW5hbGVzIHBvciBzZWN1ZXN0cm9zICIsICAgIGNhcHRpb24gPSAiU291cmNlOklORSIsDQogICAgICAgICAgICAgIHggPSAiRmVjaGEgIiwNCiAgICAgICAgICAgICAgeSA9IE5VTEwsDQogICAgICAgICAgICAgIGNvbG9yID0gIlNlY3Vlc3Ryb3MiKSArIHRoZW1lKA0KICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAiIzg4Rjk2OSIpKSANCg0KDQoNCmBgYA0KDQpMb3MgZ3LDoWZpY29zIHNpZ3VpZW50ZXMsIHNlZ8O6biBlbCAqKkJhbGFuY2UgZGUgQ3JpbWluYWxpZGFkIGRlbCBNaW5pc3RlcmlvIGRlIEludGVyaW9yKiogcGVybWl0ZSB2ZXIgY8OzbW8gaGFuIGlkbyBldm9sdWNpb25hbmRvIG90cm9zIHRpcG9zIGRlIGRlbGl0b3MgZW4gRXNwYcOxYSBjb21vIHNvbiBlbCB0csOhZmljbyBkZSBkcm9nYXMsIGxvcyBodXJ0b3MgbyBsb3Mgcm9ib3MgZGUgdmVow61jdWxvcy4gQWRlbcOhcywgcmVjaWVudGVtZW50ZSBJbnRlcmlvciBoYSBpbmNsdWlkbyBlbiBzdXMgZXN0YWTDrXN0aWNhcyBwZXJpw7NkaWNhcyBsb3Mgc2VjdWVzdHJvcyB5IGxhcyBhZ3Jlc2lvbmVzIHNleHVhbGVzLg0KDQo+LSBFbiBFc3Bhw7FhIHNlIGhhbiByZWdpc3RyYWRvIDEyLjY2MiBpbmZyYWNjaW9uZXMgcG9yIHRyw6FmaWNvIGRlIGRyb2dhcyBoYXN0YSBlbCB0cmltZXN0cmUgMyBkZSAyMDIw77u/DQo+LSBFbiBFc3Bhw7FhIHNlIGhhbiBjb21ldGlkbyAzMDkuOTEz77u/IGh1cnRvcyBoYXN0YSBlbCDDumx0aW1vIHRyaW1lc3RyZSBkZSAyMDIwLg0KPi0gU2UgaGFuIGNvbWV0aWRvIDYxIHNlY3Vlc3Ryb3MgaGFzdGEgZWwgw7psdGltbyB0cmltZXN0cmUuDQo+LSBFbiBFc3Bhw7FhIHNlIGhhbiByZWdpc3RyYWRvIDEuMjgxIHZpb2xhY2lvbmVzIGhhc3RhIHRyaW1lc3RyZSAzIGRlIDIwMjAuDQoNCg0KYGBge3Igb3V0LndpZHRoPSIxMDAlIiAsICBlY2hvPUZBTFNFfQ0KbGlicmFyeShwYXRjaHdvcmspDQooZ3JhZmh1cnRvcyArIGdyYWZkcm9nYXMpIC8gKGdyYWZzZXh1YWwrZ3JhZnNlY3Vlc3Ryb3MgKQ0KDQpgYGANCg0KDQoNCiMjIyA8Rk9OVCBDT0xPUj0iI0RBMTZDQSI+IDYuMyBFdm9sdWNpw7NuIGRlIGxhcyBpbmZyYWNjaW9uZXMgPC9GT05UPg0KDQpFbCBzaWd1aWVudGUgZ3LDoWZpY28gcmVwcmVzZW50YSBjw7NtbyBoYSBldm9sdWNpb25hZG8gZWwgbsO6bWVybyBkZSBpbmZyYWNjaW9uZXMgcGVuYWxlcyBkZXNkZSAyMDEyLiBDb21vIHBvZGVtb3Mgb2JzZXJ2YXIgZW4gMjAyMCBzZSBoYSBwcm9kdWNpZG8gdW4gZGVzY2Vuc28gYmFzdGFudGUgaW1wb3J0YW50ZSBlbiBsYXMgaW5mcmFjY2lvbmVzLCBwcm9iYWJsZW1lbnRlIHByb2R1Y2lkYXMgcG9yIGxhIHBhbmRlbWlhIG11bmRpYWwgZGUgQ292aWQtMTksIHlhIHF1ZSBHb2JpZXJubyBlc3Bhw7FvbCAoIGNvbW8gbXVjaG9zIG90cm9zIGVuIGVsIG11bmRvKSBkZWNyZXTDsyB1biBjb25maW5hbWllbnRvIGdlbmVyYWxpemFkbywgYW1wbGnDoW5kb3NlIHBvc3Rlcmlvcm1lbnRlIGFsIGNvbmp1bnRvIGRlIHRvZGEgbGEgcG9ibGFjacOzbiwgbGltaXRhbmRvIGxhIGxpYmVydGFkIGRlIG1vdmltaWVudG8gZGUgbG9zIGNpdWRhZGFub3MuDQoNCkVzIGltcG9ydGFudGUgbWVuY2lvbmFyLCBxdWUgZHVyYW50ZSBsYSBwYW5kZW1pYSwgaGFuIGlkbyBhcGFyZWNpZW5kbyBvdHJvcyB0aXBvcyBkZSBkZWxpdG9zLCBxdWUgbm8gZXN0w6FuIGNvbnRhYmlsaXphZG9zIGVuIGxhcyBlc3RhZGlzdGljYXMgLCBxdWUgc29uIGxhcyBlc3RhZmFzIHkgbG9zIGNpYmVyZGVsaXRvcy4gDQoNCmBgYHtyIG91dC53aWR0aD0iMTAwJSIgfQ0KDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkoZ2dhbmltYXRlKQ0KbGlicmFyeShocmJydGhlbWVzKQ0KDQp1cmwzNCA8LSAiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL1BhdmxpbmFkaW5rb3ZhL0NyaW1pbmFsaWRhZC9tYWluL3ZhcmlhY2lvbi5jc3YiDQoNCnZhcmlhY2lvbiA8LSByaW86OmltcG9ydCh1cmwzNCAsIHNldGNsYXNzID0gInRpYmJsZSIpDQoNCm5hbWVzKHZhcmlhY2lvbik9IGMoIlBlcmlvZG8iLCJJbmZyYWNjaW9uZXMiKQ0KdmFyaWFjaW9uIDwtIHZhcmlhY2lvbiU+JSBtdXRhdGUoIEluZnJhY2Npb25lcyA9IHN0cmluZ3I6OnN0cl9yZW1vdmVfYWxsKEluZnJhY2Npb25lcywgcGF0dGVybiA9ICIoWy5dKSIpKQ0KdmFyaWFjaW9uIDwtIHZhcmlhY2lvbiAlPiUgbXV0YXRlKCBJbmZyYWNjaW9uZXMgPSBzdHJpbmdyOjpzdHJfcmVwbGFjZV9hbGwoSW5mcmFjY2lvbmVzICwgcGF0dGVybiA9ICJbLF0iICwgcmVwbGFjZW1lbnQgPSAiLiIgKSkNCnZhcmlhY2lvbiA8LSB2YXJpYWNpb24gJT4lIG11dGF0ZSggSW5mcmFjY2lvbmVzID0gYXMubnVtZXJpYyhJbmZyYWNjaW9uZXMpKSANCg0KDQp2YXJpYWNpb24xIDwtIHZhcmlhY2lvbiAlPiUgc2VwYXJhdGUoUGVyaW9kbywgYygiQcOxbyIsIlRyaW1lc3RyZSIpLCBzZXAgPSAiWy1dIikgJT4lIHNlbGVjdCgtYyhUcmltZXN0cmUpKQ0KDQp2YXJpYWNpb24yIDwtIHZhcmlhY2lvbjEgJT4lIGdyb3VwX2J5KEHDsW8sIEluZnJhY2Npb25lcykgJT4lICBtdXRhdGUoU3VtYVRvdGFsPSBzdW0oSW5mcmFjY2lvbmVzKSkgJT4lIG11dGF0ZShBw7FvID0gdW5pcXVlKEHDsW8pKSAlPiUgdW5ncm91cCgpDQoNCg0KdmFyaWFjaW9uMzwtIHZhcmlhY2lvbjIgJT4lIHNlbGVjdChjKEHDsW8sU3VtYVRvdGFsKSkgJT4lIHVuaXF1ZSgpICU+JSBtdXRhdGUoQcOxbyA9IGFzLm51bWVyaWMoQcOxbykpDQoNCg0KZGQgPC0gZ2dwbG90KHZhcmlhY2lvbjMsIGFlcyhBw7FvLCBTdW1hVG90YWwpKSArIGdlb21fcG9pbnQoKSArIGdlb21fbGluZSggY29sb3I9IiNGMjQzNDAiICwgc2l6ZT0xICwgYXBsaGE9MC45ICwgbGluZXR5cGU9MikgKw0KICB0aGVtZV9pcHN1bSgpICsgZ2d0aXRsZSgiVmFyaWFjacOzbiBpbnRlcmFudWFsIGRlIGxhcyBpbmZyYWNjaW9uZXMgcGVuYWxlcyByZWdpc3RyYWRhcyIpICArIGxhYnMoeCA9ICJBw7FvIiwgeSA9IE5VTEwpICANCiAgDQpkZA0KDQojU2kgYWwgZmluYWwgcG9uZW1vcyAnJ3RyYW5zaXRpb25fcmV2ZWFsKEHDsW8pICwgc2FsZHLDoSBlbCBncsOhZmljbyBhbmltYWRvIA0KDQpgYGANCg0KIyMjIDxGT05UIENPTE9SPSIjREExNkNBIj4gNy4gQ29uY2x1c2lvbmVzIDwvRk9OVD4NCg0KTGEgZGVsaW5jdWVuY2lhIGVzIHVuIGZlbsOzbWVubyB1bml2ZXJzYWwgeSB0YW4gYW50aWd1byBjb21vIGxhIG1pc21hIGh1bWFuaWRhZC4gTGEgZXZvbHVjacOzbiBkZSBsYSBjcmltaW5hbGlkYWQgZXMgdW4gw61uZGljZSBmdW5kYW1lbnRhbCBwYXJhIGNvbXByZW5kZXIgbGEgcmVhbGlkYWQgc29jaWFsLiANCk5vIG9ic3RhbnRlLCBlcyB1biBmZW7Ds21lbm8gcXVlIGNhZGEgdmV6IHRpZW5kZSBhIGF1bWVudGFyIG3DoXMsIHkgZXMsIGxhbWVudGFibGVtZW50ZSwgZGlmw61jaWxtZW50ZSBjb250cm9sYWJsZS4gDQoNCkNvbW8gaGVtb3MgdmlzdG8gcG9yIGVsIGFuw6FsaXNpcyBhbnRlcmlvciwgcG9yIHN1ZXJ0ZSBubyBub3MgZW5jb250cmFtb3MgZW4gdW5hIGRlIGxhcyByZWdpb25lcyBtw6FzIHZpb2xlbnRhcyBkZWwgbXVuZG8sIHkgcG9yIGVzbyBtdWNoYSBnZW50ZSBuaSBsZSBwcmVzdGEgYXRlbmNpw7NuIGFsIGNyaW1lbi4gU2luIGVtYmFyZ28sIGVzdG8gbm8gZGViZXLDrWEgZGUgYWxlZ3Jhcm5vcywgYWwgY29udHJhcmlvLCBzZSBkZWJlcsOtYW4gdG9tYXIgbcOhcyBtZWRpZGFzIHBhcmEgcHJldmVuaXIgbGFzIGRlbGluY3VlbmNpYXMgcXVlIHNlIHByb2R1Y2VuLCB0YW50byBhIG5pdmVsIGV1cm9wZW8sIGNvbW8gbmFjaW9uYWwuIA0KUG9ycXVlICwgYXVucXVlIG5vIHRlbmdhbW9zIG51bWVyb3NvcyBhc2VzaW5hdG9zIG8gaG9taWNpZGlvcyBjb21vIGVzIGVsIGNhc28gZGUgVmVuZXp1ZWxhIG8gQWZnYW5pc3TDoW4sIHPDrSBxdWUgbG9zIHRlbmVtb3MsIHkgZXMgYWxnbyBxdWUgZGViZXLDrWEgIG8gLCBhbCBtZW5vcyAsIHNlIGRlYmVyw61hIGludGVudGFyIGRlIHJlZHVjaXIuIFBvciBlc28gLGFjY2lvbmVzIGNvbW8gYXVtZW50YXIgbGEgdmlnaWxhbmNpYSwgbGFzIHJldGVuY2lvbmVzLCBsYXMgc2FuY2lvbmVzIHkgdW5hIGp1c3RpY2lhIG3DoXMgZXN0cmljdGEsIGVzIG5lY2VzYXJpYS4gDQoNCg0KDQojIyA8Rk9OVCBDT0xPUj0iI0RBMTZDQSI+IDguIEJpYmxpb2dyYWZpYSA8L0ZPTlQ+DQoNCj4tIFDDoWdpbmEgb2ZpY2lhbCBkZWwgSW5zdGl0dXRvIE5hY2lvbmFsIGRlIEVzdGFkw61zdGljYS4gW2FxdcOtXShodHRwczovL3d3dy5pbmUuZXMvZHluZ3MvSU5FYmFzZS9saXN0YW9wZXJhY2lvbmVzLmh0bSkNCg0KPi0gTGEgRnVuZGFjacOzbiBJblNpZ2h0IENyaW1lLiBbYXF1w61dKGh0dHBzOi8vZXMuaW5zaWdodGNyaW1lLm9yZy9ub3RpY2lhcy9hbmFsaXNpcy9iYWxhbmNlLWhvbWljaWRpb3MtMjAxOS8pDQoNCj4tIEFydMOtY3VsbyBkZWwgcGVyacOzZGljbyAqKkVsIEVjb25vbWlzdGEqKiBbYXF1w61dKGh0dHBzOi8vd3d3LmVsZWNvbm9taXN0YS5jb20ubXgvaW50ZXJuYWNpb25hbGVzL0xvcy0xMC1wYWlzZXMtY29uLW1hcy1wZXJzb25hcy1lbmNhcmNlbGFkYXMtMjAxNjA5MTItMDA2My5odG1sKQ0KDQoNCj4tIEVVUk9TVEFULiBbYXF1w61dKGh0dHBzOi8vZWMuZXVyb3BhLmV1L2V1cm9zdGF0L2RhdGFicm93c2VyL3ZpZXcvY3JpbV9vZmZfY2F0L2RlZmF1bHQvdGFibGU/bGFuZz1lbikNCg0KPi0gTGEgRnVuZGFjacOzbiBpTyBbYXF1w61dKGh0dHBzOi8vZnVuZGFjaW9uaW8uY29tL3ZpYWphcnNlZ3Vyby9jb25zZWpvcy12aWFqZXJvcy92aW9sZW5jaWEvcGFpc2VzLWNvbi1tYXlvci1pbmRpY2UtZGUtY3JpbWluYWxpZGFkLyMpDQoNCj4tICoqQkJDIE5FV1MqKiBbYXF1w61dKGh0dHBzOi8vd3d3LmJiYy5jb20vbXVuZG8vbm90aWNpYXMtaW50ZXJuYWNpb25hbC00NDA0Nzg4OSkNCg0KPi0gRGlhcmlvIERpZ2l0YWwgTnVlc3RybyBQYcOtcyBbYXF1w61dKGh0dHBzOi8vd3d3LmVscGFpcy5jci8yMDIwLzA3LzE4L2xvcy1wYWlzZXMtbWFzLXNlZ3Vyb3MteS1jb24tbWVub3MtZGVsaW5jdWVuY2lhLXBhcmEtdmlhamFyLWVuLTIwMjAvKQ0KDQo+LSBNaW5pc3RlcmlvIGRlbCBJbnRlcmlvciAqKlBvcnRhbCBFc3RhZMOtc3RpY28gZGUgQ3JpbWluYWxpZGFkICoqIFthcXXDrV0oaHR0cHM6Ly9lc3RhZGlzdGljYXNkZWNyaW1pbmFsaWRhZC5zZXMubWlyLmVzL3B1YmxpY28vcG9ydGFsZXN0YWRpc3RpY28vKSANCg0KDQogDQoNCi0tLS0tLS0tLS0tLS0tLS0NCg0KPGJyPjxicj4NCg0KUGFyYSBhY2FiYXIgZXN0ZSBjaHVuayBwYXJhIGluY2x1aXIgdHUgYHNlc3Npb24gaW5mb2A6DQoNCmBgYHtyfQ0Kc2Vzc2lvbmluZm86OnNlc3Npb25faW5mbygpICU+JSBkZXRhaWxzOjpkZXRhaWxzKHN1bW1hcnkgPSAnY3VycmVudCBzZXNzaW9uIGluZm8nKSANCmBgYA0K