Trabajo elaborado para la asignatura “Programación y manejo de datos en la era del Big Data” de la Universitat de València durante el curso 2020-2021. El repo del trabajo está aquí. La página web de la asignatura y los trabajos de mis compañeros pueden verse aquí.

1. INTRODUCCIÓN

El objetivo del trabajo es entender la economía griega, estudiando su evolución así como sus variables macroeconómicas más importantes entendiendo las causas que han provocado esta evolución. Analizar las políticas fiscales (la evolución y situación actual de la misma tras la crisis financiera), la evolución de uno de sus sectores más importantes como es el turismo (y mostrar algunos de los lugares mas bonitos) y el impacto que ha tenido el COVID en este, etc.

Posición geográfica de Grecia

Grecia se sitúa en la parte sureste de Europa, su capital es Atenas y es un país conocido por la cantidad de turistas que atrae cada año. Gran parte del territorio griego está formado por islas y un país muy montañoso (es el país de Europa con mas picos montañosos) donde predomina el clima mediterráneo.

Mostramos en un mapa las principales ciudades griegas:

Mapa

Código

posicion_grecia <- leaflet() %>% addTiles() %>% setView(lng = 21.824312, lat = 39.074208, zoom = 6) %>% addMarkers(lng = c(23.7308, 22.93086, 25.14341, 21.73444), lat = c(37.9816, 40.64361, 35.32787, 38.24444), popup = c("Atenas", "Salónica", "Heraklion", "Patrasse")) %>% addPopups(lng = 23.7308, lat = 37.9816, popup = "Atenas") 

#- creamos el gráfico que muestre las ciudades más importantes, pero que la capital aparezca marcada desde el inicio

posicion_grecia

2. SECTOR EXTERIOR DE GRECIA.

Balanza de pagos

En primer lugar vamos a estudiar la evolución de la balanza de pagos de Grecia (representada en negro). Observamos que en el periodo anterior a la crisis la balanza por cuenta corriente (que mide la diferencia entre exportaciones e importaciones de bienes y servicios) era muy deficitaria, pero debido al fuerte impacto que tuvo la crisis financiera empezada en Grecia, las importaciones de bienes y servicios cayeron en mayor medida de lo que hicieron las exportaciones (es decir, la mejora de la balanza por cuenta corriente fué debida al menor poder adquisitivo de los ciudadanos griegos mas que a una mejora de las exportaciones).

El saldo deficitario de la balanza por cuenta corriente obliga a un superavit en la cuenta de activos, por ello la cuenta financiera (la que mide la diferencia entre exportaciones e importaciones de activos) griega es positiva y sigue la evolución inversa a la balanza por cuenta corriente. La cuenta de capitales tiene un peso bastante menor en la balanza de pagos y siempre ha mostrado un superávit. La cuenta de errores y omisiones mide las transacciones que no han sido incluidas en el resto de las balanzas y se incluye porque la suma de las 3 balanzas que conforman la balanza de pagos (cuenta corriente, financiera y de capitales) han de sumar 0.

Gráfico

Observamos que con la moderación del déficit por cuenta corriente el superávit por cuenta financiera también se modera, mostrando ambas balanzas un saldo mas equilibrado aunque sin llegar a ser positiva. Entre los sectores exportadores más importantes de Grecia está el turismo, el cual estudiaremos como ha evolucionado en su periodo más reciente mas adelante, además de la metalúrgia, los productos químicos, el tabaco y productos textiles.

Código del gráfico

grafico_balanza_pagos <- datos_balanza_pago %>% ggplot(aes(x = Año, group = 1)) +           geom_line(aes(x = Año, y = Cuenta_corriente), colour = "green1") +
  geom_line(aes(x = Año, y = Cuenta_financiera), colour = "orange") + 
  geom_line(aes(x = Año, y = Cuenta_capital), colour = "blue") +
  geom_line(aes(x = Año, y = Cuenta_errores), colour = "red") + 
  geom_line(aes(x = Año, y = Balanza_pagos), colour = "black") +
  theme_solarized() +
  scale_x_continuous(breaks = seq(2008, 2019, 2))
  labs(
    title = "Balanza de pagos de Grecia",
    subtitle = "Periodo 2008-2019, US$ actuales",
    caption = "Datos provenientes de KNOEMA",
    y = "Nivel de las balanzas"
  )
grafico_balanza_pagos

Preparación de datos

#- En este caso como la preparación de datos ocupa mucho como para ponerlo junto al código del gráfico, lo pongo por separado

datos_grecia <- rio::import("./datos/BANCO MUNDIAL/DATOS_GRECIA.xls") %>% select(-c("Country Code", "Indicator Code", "Country Name")) %>% rename(Indicador = "Indicator Name") 

datos_zona_euro <- rio::import("./datos/BANCO MUNDIAL/ZONA EURO.xls") %>% select(-c("Country Code", "Indicator Code", "Country Name")) %>% rename(Indicador = "Indicator Name")

#- importamos los datos de Grecia del Banco Mundial, nos quedamos con las variables que nos interesan y renombramos el resto

datos_balanzas_pago_cc <- rio::import("./datos/BALANZA DE PAGOS/CUENTA_CORRIENTE.xlsx") %>% select(-c("CAMBIAR, %"))
datos_balanzas_pago_cf <- rio::import("./datos/BALANZA DE PAGOS/CUENTA FINANCIERA.xlsx") %>% select(-c("CAMBIAR, %")) 
datos_balanzas_pago_ck <- rio::import("./datos/BALANZA DE PAGOS/CUENTA DE CAPITAL.xlsx") %>% select(-c("CAMBIAR, %"))
datos_balanzas_pago_ce <- rio::import("./datos/BALANZA DE PAGOS/CUENTA ERRORES.xlsx") %>% select(-c("CAMBIAR, %"))

datos_balanza_pago1 <- merge(datos_balanzas_pago_cc, datos_balanzas_pago_cf, by = "FECHA") %>% rename(Cuenta_corriente = "VALOR.x", Cuenta_financiera = "VALOR.y")
datos_balanza_pago2 <- merge(datos_balanza_pago1, datos_balanzas_pago_ck, by = "FECHA") %>% rename(Cuenta_capital = "VALOR")  
datos_balanza_pago <- merge(datos_balanza_pago2, datos_balanzas_pago_ce, by = "FECHA")  %>% rename(Cuenta_errores = "VALOR", Año = "FECHA") %>% mutate(Cuenta_financiera = - Cuenta_financiera, Balanza_pagos = Cuenta_corriente + Cuenta_financiera + Cuenta_capital + Cuenta_errores) 

#- importamos las distintas balanzas de Grecia, las unimos en un solo DF y creamos la variable balanza de pagos

Destino exportaciones

Ahora vemos los principales destinos de las exportaciones griegas durante los años finales de la crisis:

TABLA

Países receptores de las exportaciones griegas
País importador 2010 2011 2012 2013 2014
Turquía 1.140.550.738 2.303.212.811 3.435.646.248 4.250.341.626 4.334.775.889
Italia 2.250.927.601 2.798.266.455 2.534.619.194 3.070.466.248 3.155.823.150
Alemania 2.207.925.276 2.279.645.252 2.142.839.645 2.299.013.187 2.315.844.180
Bulgaria 1.376.620.463 1.643.649.251 1.904.960.122 1.802.809.953 1.767.240.794
Chipre 1.531.591.107 1.795.837.765 1.673.728.957 1.495.290.265 1.614.683.238
Reino Unido 1.109.737.848 1.160.532.629 1.055.137.879 1.273.683.250 1.270.646.299
Estados Unidos 829.877.823 1.518.624.660 1.150.437.333 1.176.272.558 1.019.274.291
Francia 797.156.010 852.435.799 828.845.348 829.571.986 860.808.788
Rumania 774.551.048 807.021.044 715.965.853 790.288.720 834.755.595
Macedonia 416.921.918 530.794.165 637.832.968 987.288.959 934.353.887
Resto del mundo 7.884.982.746 11.354.841.302 13.684.085.134 15.984.841.834 15.497.584.586
Total 20.320.842.579 27.044.861.133 29.764.098.681 33.959.868.586 33.605.790.697

Observamos como Turquía se convierte en principal receptor de las exportaciones griegas, seguido por Italia y Alemania. Si representamos en un mapa los países que mas exportaciones compran a Grecia:

CÓDIGO

tabla_destino_exportaciones <- destino_exportaciones
  
knitr::kable(tabla_destino_exportaciones,
  format.args = list(decimal.mark = ",", big.mark = "."),
  align = "c",
  caption = "Países receptores de las exportaciones griegas"
) %>% kable_styling(fixed_thead = list(enabled = T, background = "red")) %>% row_spec(12, background = "blue", color = "white") %>% row_spec(11, color = "orange")

Otra forma de visualizar estos datos

Mostramos en un mapa, en donde el mayor tamaño del punto en cada país representa un número mayor de exportaciones que van destinadas a estos países.

MAPA

Vemos como la mayoría de los países que más importan productos y servicios griegos están próximos a Grecia, seguramente por los bajos costes de transporte a estos países. Este es el caso de Rumania, Bulgaria, Macedonia, Turquía, Chipre e Italia. El comercio tan alto con Italia, Turquía y Chipre es debido a la potente industria naviera griega la cual abarata el transporte de productos a estos países.

Es en parte esta gran ventaja competitiva que tiene Grecia en su industria naval que le permite ser muy competitiva en varios productos que se pueden transportar de esta forma, las exportaciones textiles se benefícian en gran parte de ello.

CÓDIGO

world <- rnaturalearth::ne_countries(scale = "medium", returnclass = "sf")

#- creamos el df con los datos geográficos de los países que aparecen en la tabla

paises <- data.frame(
  pais = c("Turquía", "Italia", "Alemania", "Bulgaria", "Chipre", "Reino Unido", "Estados Unidos", "Francia", "Rumania", "Macedonia", "Grecia"),
  longitude = c(35.24, 12.57, 10.45, 25.49, 33.43, -3.44, -95.71, 2.21, 24.97, 21.74, 21.82),
  latitude = c(38.96, 41.87, 51.17, 42.73, 35.13, 55.38, 37.09, 46.23, 45.94, 41.61, 39.07),
  exportaciones_2014 = c(4334775889, 3155823150, 2315844180, 1767240794, 1614683238, 1270646299, 1019274291, 860808788, 834755595, 934353887, 0)
)

#- hacemos el mapa

mapa <- world %>% ggplot() + geom_sf(fill = "antiquewhite") + 
  coord_sf(xlim = c(-15, 45), ylim = c(30, 60), expand = FALSE) +
  geom_point(data = paises, aes(x = longitude, y = latitude, size = exportaciones_2014)) +
  geom_text(data = paises, aes(x = longitude +6, y = latitude, label = pais)) +
  theme_solarized() +
  labs(
    title = "Distribución de las exportaciones griegas (2014)",
    caption = "Datos provenientes de KNOEMA",
    x = "Longitud",
    y = "Latitud",
    size = "Exportaciones"
  )
mapa

3. SECTOR TURÍSTICO GRIEGO

En este apartado analizamos como ha afectado el coronavirus a uno de sus sectores mas importantes como es el turismo y la reacción del gobierno griego para hacer frente a la crisis del coronavirus.

El turismo se ha visto afectado negativamente para todos los países por las restricciones internacionales sobre la movilidad adoptadas por los países para hacer frente a la pandemia. Las economías que tienen altos niveles de turismo se han visto afectadas, ya que el turismo también influye en otros sectores de la economía, como la restauración y la hostelería.

Sin embargo, como veremos a continuación, el sector turístico en Grecia es más importante de lo que lo es para el resto de países de la zona euro y es un sector estratégico para la economía griega, al ser una de las princiales fuentes de ingresos de la misma.

Peso del turismo en la economía griega

Peso sobre las exportaciones

El turismo siempre ha representado una gran proporción de la balanza comercial griega, en el gráfico a continuación comparamos el peso porcentual que tiene el turismo internacional sobre las exportaciones con la media de los países de las zona euro, donde las barras rojas representan los datos de la eurozona (media de los países de la zona euro) y las azules los de Grecia.

Observamos que claramente el sector turístico griego tiene un peso mayor sobre la economía nacional (sobre un 30% de las exportaciones griegas y sobre un 8% del PIB) que la que tiene para la media de los países de la eurozona (sobre un 7,5% de sus exportaciones).

Esto ha contribuido a que la crisis del coronavirus haya tenido un mayor impacto en la economía griega que en el resto de países. El PIB de Grecia ha caído un 8% debido a esto, según reportan informes, por ponerlo en contexto, para España que es un país donde el turismo representa una gran fuente de ingresos ha sido de un 3’3%. Para frenar la caída del PIB el gobierno griego aprobó la supresión del IVA hasta marzo de 2021.

Se calcula (no existen todavía cifras oficiales) que el turismo va a caer en Grecia un 75% durante este año: un 80% para el turimsmo internacional y un 45% el turismo de interior.

Código

turismo_grecia <- rio::import("./BANCO MUNDIAL/API_GRC_DS2_es_excel_v2_1873453.xls") %>% rename(Indicador = "Indicator Name") %>% filter(Indicador == "Turismo internacional, recibos (% del total de exportaciones)") %>% select(-c("Indicator Code", Indicador, "Country Code", "Country Name")) %>% pivot_longer(cols = everything(), names_to = "Año", values_to = "Turismo_Grecia")

turismo_eurozona <- rio::import("./BANCO MUNDIAL/API_EMU_DS2_es_excel_v2_1882537.xls") %>% rename(Indicador = "Indicator Name") %>% filter(Indicador == "Turismo internacional, recibos (% del total de exportaciones)") %>% select(-c("Indicator Code", Indicador, "Country Code", "Country Name")) %>% pivot_longer(cols = everything(), names_to = "Año", values_to = "Turismo_Eurozona")

#- importamos los datos de los 2 excels

turismo <- merge(turismo_grecia, turismo_eurozona, by ="Año") %>% drop_na()

#- unimos ambos excels en uno solo

grafico_turismo <- turismo %>% ggplot() + geom_bar(aes(x = Año, y = Turismo_Grecia), colour = "blue", stat = "identity", fill = "blue") + geom_bar(aes(x = Año, y = Turismo_Eurozona), stat = "identity", colour = "black", fill = "red") + theme_solarized() + theme(axis.text.x = element_text(angle = 90, hjust = 1)) + labs(title = "Turismo sobre el total de las exportaciones, \ncomparación con Europa", x = "Año", y = "Porcentaje de turismo sobre las exportaciones", caption = "Datos provenientes del Banco Mundial") 
grafico_turismo 

#- representamos el gráfico

Sitios más visitados

Acrópolis de Atenas

Es el monumento griego más emblemático, ha sufrido incendios, guerras y derrumbes pero sigue conservando su encanto para los turistas.

Partenón

Templo de mármol blanco y en proceso de restauración desde 1841, es el segundo lugar más visitado de Grecia tras la Acrópolis.

Meteora

Su nombre en español significa “Monasterios caídos del cielo”, están clasificados como Patrimonio de la Humanidad desde 1988 por la UNESCO.

Vídeo sobre Grecia

Incluyo también un video de algunos de los sitios más bonitos de Grecia que me ha parecido interesante.

Respuesta a la caída del PIB por el COVID

La crisis del coronavirus llega a Grecia en un momento crítico, con la política fiscal limitada en gran parte debido al alto nivel de deuda y con la política monetaria en manos del BCE. Como hemos comentado, la caída del turismo debido a las restricciones de movimiento ha tenido un fuerte impacto en Grecia debido a la gran depedencia de este sector por parte de la economía.

En este apartado estudiamos los mecansimos de respuesta que ha adoptado Grecia para hacer frente a los problemas económicos.

Política fiscal

La política fiscal griega se encuentra limitada debido al alto nivel de deuda que acumula Grecia desde el periodo anterior a la crisis financiera de 2007. Como observamos en el siguiente gráfico animado, el nivel de deuda de Grecia se encuentra muy por encima de la media de la zona euro:

Gráfico deuda griega

El nivel de deuda griega comienza a elevarse a partir de 1980, observamos como los ya altos niveles de deuda (ya se encontraban en torno al 100% del PIB antes de la crisis financiera de 2007) se elevan todavía más durante la crisis financiera. Este hecho puso en jaque la economía griega, así como su estancia en el euro y tuvo que ser rescatada.

El elevado nivel de deuda que arrastra hasta día de hoy limita mucho el gasto público que puede aplicar el gobierno, ya que se enfrenta a restricciones por parte de la eurozona.

El gobierno griego venía aplicando una bajada de impuestos desde desde la reforma fiscal de 2019 y que se ha visto acelerada con la crisis del coronavirus, ya que el gobierno griego ha eliminado el IVA como impuesto hasta marzo de 2021 como medida para fomentar el consumo y impulsar la economía.

Código

deuda_grecia <- rio::import("./datos/datosmacro/DEUDA GRECIA.xlsx") %>% rename(Año = Fecha, Deuda_Sobre_PIB = "Deuda (%PIB)") %>% select(Año, Deuda_Sobre_PIB)

grafico_deuda_grecia <- deuda_grecia %>% ggplot(aes(x = Año, y = Deuda_Sobre_PIB/100, group = 1)) + geom_line() + theme_solarized() + labs(title = "Deuda externa griega sobre el PIB", x = "Año", y = "Porcentaje de deuda sobre el PIB", caption = "Datos provenientes de datosmacro") + scale_y_continuous(labels = scales::percent) + transition_reveal(Año)

animate(grafico_deuda_grecia, nframes = 60, duration = 3)

4. CONCLUSIÓN

Pese a que la economía griega no pasa una buena racha desde el periodo anterior a la crisis financiera de 2007 y con la presente crisis por el coronavirus, que hemos comentado durante el trabajo, Grecia sigue siendo uno de los países preferidos por los turistas por sus maravillosos lugares y no cabe duda que el turismo recuperará sus niveles anteriores a la pandemia.

Durante el trabajo hemos comentado los desequilibrios macroeconómicos por cuenta corriente y deuda pública de Grecia, aunque también hemos comentado cosas positivas derivadas del turismo y la evolución de este por la pandemia.

LS0tDQp0aXRsZTogIkFuw6FsaXNpcyBkZSBsYSBlY29ub23DrWEgZ3JpZWdhIg0Kc3VidGl0bGU6ICJTZXJnaW8gRXNjb3JjaWEgVG9ycmVzKHNlcmVzdG9AYWx1bW5pLnV2LmVzKSIgIy0gcG9uZ28gdMO6IG5vbWJyZSBhaMOtIHBhcmEgcSBhcGFyZXpjYSBtw6FzIGdyYW5kZSBxIGVsIGRlIGxhIFVWDQphdXRob3I6ICJVbml2ZXJzaXRhdCBkZSBWYWzDqG5jaWEiDQpkYXRlOiAiRGljaWVtYnJlIGRlIDIwMjAgKGFjdHVhbGl6YWRvIGVsIGByIGZvcm1hdChTeXMudGltZSgpLCAnJWQtJW0tJVknKWApIg0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50Og0KICAgICNjc3M6ICIuL2Fzc2V0cy9teV9jc3NfZmlsZS5jc3MiDQogICAgdGhlbWU6IHBhcGVyDQogICAgaGlnaGxpZ2h0OiB0ZXh0bWF0ZSANCiAgICB0b2M6IHRydWUNCiAgICB0b2NfZGVwdGg6IDMgDQogICAgdG9jX2Zsb2F0OiANCiAgICAgIGNvbGxhcHNlZDogdHJ1ZQ0KICAgICAgc21vb3RoX3Njcm9sbDogdHJ1ZQ0KICAgIHNlbGZfY29udGFpbmVkOiB0cnVlDQogICAgbnVtYmVyX3NlY3Rpb25zOiBmYWxzZQ0KICAgIGRmX3ByaW50OiBrYWJsZQ0KICAgIGNvZGVfZG93bmxvYWQ6IHRydWUNCmVkaXRvcl9vcHRpb25zOiANCiAgY2h1bmtfb3V0cHV0X3R5cGU6IGNvbnNvbGUNCi0tLQ0KDQpgYGB7ciBwYWNrYWdlcy1zZXR1cCwgaW5jbHVkZSA9IEZBTFNFfQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KGtsaXBweSkgICMtIHJlbW90ZXM6Omluc3RhbGxfZ2l0aHViKCJybGVzdXIva2xpcHB5IikNCmxpYnJhcnkoa25pdHIpDQoNCmBgYA0KDQpgYGB7ciBjaHVuay1zZXR1cCwgaW5jbHVkZSA9IEZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFLCBldmFsID0gVFJVRSwgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIA0KICAgICAgICAgICAgICAgICAgICAgICNyZXN1bHRzID0gImhvbGQiLA0KICAgICAgICAgICAgICAgICAgICAgIGNhY2hlID0gRkFMU0UsIGNhY2hlLnBhdGggPSAiL2NhY2hlcy8iLCBjb21tZW50ID0gIiM+IiwNCiAgICAgICAgICAgICAgICAgICAgICAjZmlnLndpZHRoID0gNywgI2ZpZy5oZWlnaHQ9IDcsICAgDQogICAgICAgICAgICAgICAgICAgICAgI291dC53aWR0aCA9IDcsIG91dC5oZWlnaHQgPSA3LA0KICAgICAgICAgICAgICAgICAgICAgIGNvbGxhcHNlID0gVFJVRSwgIGZpZy5zaG93ID0gImhvbGQiLA0KICAgICAgICAgICAgICAgICAgICAgIGZpZy5hc3AgPSA3LzksIG91dC53aWR0aCA9ICI2MCUiLCBmaWcuYWxpZ24gPSAiY2VudGVyIikNCmtuaXRyOjpvcHRzX2NodW5rJHNldChkZXYgPSAicG5nIiwgZGV2LmFyZ3MgPSBsaXN0KHR5cGUgPSAiY2Fpcm8tcG5nIikpDQpgYGANCg0KYGBge3Igb3B0aW9ucy1zZXR1cCwgaW5jbHVkZSA9IEZBTFNFfQ0Kb3B0aW9ucyhzY2lwZW4gPSA5OTkpICMtIHBhcmEgcXVpdGFyIGxhIG5vdGFjacOzbiBjaWVudMOtZmljYQ0Kb3B0aW9ucygieWFtbC5ldmFsLmV4cHIiID0gVFJVRSkgDQpgYGANCg0KDQpgYGB7ciBrbGlwcHksIGVjaG8gPSBGQUxTRX0NCmtsaXBweTo6a2xpcHB5KHBvc2l0aW9uID0gYygidG9wIiwgInJpZ2h0IikpICMtIHJlbW90ZXM6Omluc3RhbGxfZ2l0aHViKCJybGVzdXIva2xpcHB5IikNCmBgYA0KDQo8aHIgY2xhc3M9ImxpbmVhLWJsYWNrIj4NCg0KVHJhYmFqbyBlbGFib3JhZG8gcGFyYSBsYSBhc2lnbmF0dXJhICJQcm9ncmFtYWNpw7NuIHkgbWFuZWpvIGRlIGRhdG9zIGVuIGxhIGVyYSBkZWwgQmlnIERhdGEiIGRlIGxhIFVuaXZlcnNpdGF0IGRlIFZhbMOobmNpYSBkdXJhbnRlIGVsIGN1cnNvIDIwMjAtMjAyMS4gRWwgcmVwbyBkZWwgdHJhYmFqbyBlc3TDoSBbYXF1w61dKGh0dHBzOi8vZ2l0aHViLmNvbS9zZXJlc3RvL3RyYWJham9fQmlnRGF0YSl7dGFyZ2V0PSJfYmxhbmsifS4gTGEgcMOhZ2luYSB3ZWIgZGUgbGEgYXNpZ25hdHVyYSB5IGxvcyB0cmFiYWpvcyBkZSBtaXMgY29tcGHDsWVyb3MgcHVlZGVuIHZlcnNlIFthcXXDrV0oaHR0cHM6Ly9wZXJlenA0NC5naXRodWIuaW8vaW50cm8tZHMtMjAtMjEtd2ViLzA3LXRyYWJham9zLmh0bWwpe3RhcmdldD0iX2JsYW5rIn0uDQoNCjwhLS0gRWwgcMOhcnJhZm8gZGUgYXJyaWJhIGhhcyBkZSBkZWphcmxvIGNhc2kgaWd1YWwsIA0KICAgICAgICBzb2xvIEhBUyBkZSBTVVNUSVRVSVIgbGFzIDIgdmVjZXMgcXVlIGFwYXJlY2UgInBlcmV6cDQ0IiBwb3IgdHUgdXN1YXJpbyBkZSBHaXRodWItLT4NCiAgICAgICAgDQohW10oLi9kYXRvcy9mb3Rvcy8xMDI0cHgtRmxhZ19vZl9HcmVlY2Uuc3ZnLnBuZykgDQoNCiMgMS4gSU5UUk9EVUNDScOTTg0KDQpFbCBvYmpldGl2byBkZWwgdHJhYmFqbyBlcyBlbnRlbmRlciBsYSBlY29ub23DrWEgZ3JpZWdhLCBlc3R1ZGlhbmRvIHN1IGV2b2x1Y2nDs24gYXPDrSBjb21vIHN1cyB2YXJpYWJsZXMgbWFjcm9lY29uw7NtaWNhcyBtw6FzIGltcG9ydGFudGVzIGVudGVuZGllbmRvIGxhcyBjYXVzYXMgcXVlIGhhbiBwcm92b2NhZG8gZXN0YSBldm9sdWNpw7NuLiBBbmFsaXphciBsYXMgcG9sw610aWNhcyBmaXNjYWxlcyAobGEgZXZvbHVjacOzbiB5IHNpdHVhY2nDs24gYWN0dWFsIGRlIGxhIG1pc21hIHRyYXMgbGEgY3Jpc2lzIGZpbmFuY2llcmEpLCBsYSBldm9sdWNpw7NuIGRlIHVubyBkZSBzdXMgc2VjdG9yZXMgbcOhcyBpbXBvcnRhbnRlcyBjb21vIGVzIGVsIHR1cmlzbW8gKHkgbW9zdHJhciBhbGd1bm9zIGRlIGxvcyBsdWdhcmVzIG1hcyBib25pdG9zKSB5IGVsIGltcGFjdG8gcXVlIGhhIHRlbmlkbyBlbCBDT1ZJRCBlbiBlc3RlLCBldGMuDQoNCmBgYHtyLCBldmFsID0gVFJVRSwgZWNobyA9IEZBTFNFfQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KGdndGhlbWVzKQ0KbGlicmFyeShybmF0dXJhbGVhcnRoKQ0KbGlicmFyeShrYWJsZUV4dHJhKQ0KbGlicmFyeShsZWFmbGV0KQ0KbGlicmFyeSh2ZW1iZWRyKQ0KbGlicmFyeShwbG90bHkpDQpsaWJyYXJ5KGdnYW5pbWF0ZSkNCmBgYA0KDQojIyBQb3NpY2nDs24gZ2VvZ3LDoWZpY2EgZGUgR3JlY2lhIHsudGFic2V0fQ0KDQpHcmVjaWEgc2Ugc2l0w7phIGVuIGxhIHBhcnRlIHN1cmVzdGUgZGUgRXVyb3BhLCBzdSBjYXBpdGFsIGVzIEF0ZW5hcyB5IGVzIHVuIHBhw61zIGNvbm9jaWRvIHBvciBsYSBjYW50aWRhZCBkZSB0dXJpc3RhcyBxdWUgYXRyYWUgY2FkYSBhw7FvLiBHcmFuIHBhcnRlIGRlbCB0ZXJyaXRvcmlvIGdyaWVnbyBlc3TDoSBmb3JtYWRvIHBvciBpc2xhcyB5IHVuIHBhw61zIG11eSBtb250YcOxb3NvIChlcyBlbCBwYcOtcyBkZSBFdXJvcGEgY29uIG1hcyBwaWNvcyBtb250YcOxb3NvcykgZG9uZGUgcHJlZG9taW5hIGVsIGNsaW1hIG1lZGl0ZXJyw6FuZW8uIA0KDQpNb3N0cmFtb3MgZW4gdW4gbWFwYSBsYXMgcHJpbmNpcGFsZXMgY2l1ZGFkZXMgZ3JpZWdhczoNCg0KIyMjIE1hcGENCg0KYGBge3IsIGVjaG8gPSBGQUxTRSwgZXZhbCA9IFRSVUV9DQpwb3NpY2lvbl9ncmVjaWEgPC0gbGVhZmxldCgpICU+JSBhZGRUaWxlcygpICU+JSBzZXRWaWV3KGxuZyA9IDIxLjgyNDMxMiwgbGF0ID0gMzkuMDc0MjA4LCB6b29tID0gNikgJT4lIGFkZE1hcmtlcnMobG5nID0gYygyMy43MzA4LCAyMi45MzA4NiwgMjUuMTQzNDEsIDIxLjczNDQ0KSwgbGF0ID0gYygzNy45ODE2LCA0MC42NDM2MSwgMzUuMzI3ODcsIDM4LjI0NDQ0KSwgcG9wdXAgPSBjKCJBdGVuYXMiLCAiU2Fsw7NuaWNhIiwgIkhlcmFrbGlvbiIsICJQYXRyYXNzZSIpKSAlPiUgYWRkUG9wdXBzKGxuZyA9IDIzLjczMDgsIGxhdCA9IDM3Ljk4MTYsIHBvcHVwID0gIkF0ZW5hcyIpIA0KDQojLSBjcmVhbW9zIGVsIGdyw6FmaWNvIHF1ZSBtdWVzdHJlIGxhcyBjaXVkYWRlcyBtw6FzIGltcG9ydGFudGVzLCBwZXJvIHF1ZSBsYSBjYXBpdGFsIGFwYXJlemNhIG1hcmNhZGEgZGVzZGUgZWwgaW5pY2lvDQoNCnBvc2ljaW9uX2dyZWNpYQ0KYGBgDQoNCiMjIyBDw7NkaWdvIA0KDQpgYGB7ciwgZWNobyA9IFRSVUUsIGV2YWwgPSBGQUxTRX0NCnBvc2ljaW9uX2dyZWNpYSA8LSBsZWFmbGV0KCkgJT4lIGFkZFRpbGVzKCkgJT4lIHNldFZpZXcobG5nID0gMjEuODI0MzEyLCBsYXQgPSAzOS4wNzQyMDgsIHpvb20gPSA2KSAlPiUgYWRkTWFya2VycyhsbmcgPSBjKDIzLjczMDgsIDIyLjkzMDg2LCAyNS4xNDM0MSwgMjEuNzM0NDQpLCBsYXQgPSBjKDM3Ljk4MTYsIDQwLjY0MzYxLCAzNS4zMjc4NywgMzguMjQ0NDQpLCBwb3B1cCA9IGMoIkF0ZW5hcyIsICJTYWzDs25pY2EiLCAiSGVyYWtsaW9uIiwgIlBhdHJhc3NlIikpICU+JSBhZGRQb3B1cHMobG5nID0gMjMuNzMwOCwgbGF0ID0gMzcuOTgxNiwgcG9wdXAgPSAiQXRlbmFzIikgDQoNCiMtIGNyZWFtb3MgZWwgZ3LDoWZpY28gcXVlIG11ZXN0cmUgbGFzIGNpdWRhZGVzIG3DoXMgaW1wb3J0YW50ZXMsIHBlcm8gcXVlIGxhIGNhcGl0YWwgYXBhcmV6Y2EgbWFyY2FkYSBkZXNkZSBlbCBpbmljaW8NCg0KcG9zaWNpb25fZ3JlY2lhDQpgYGANCg0KDQojIDIuIFNFQ1RPUiBFWFRFUklPUiBERSBHUkVDSUEuDQoNCiMjIEJhbGFuemEgZGUgcGFnb3Mgey50YWJzZXR9DQoNCmBgYHtyLCBldmFsID0gVFJVRSwgZWNobyA9IEZBTFNFfQ0KZGF0b3NfZ3JlY2lhIDwtIHJpbzo6aW1wb3J0KCIuL2RhdG9zL0JBTkNPIE1VTkRJQUwvREFUT1NfR1JFQ0lBLnhscyIpICU+JSBzZWxlY3QoLWMoIkNvdW50cnkgQ29kZSIsICJJbmRpY2F0b3IgQ29kZSIsICJDb3VudHJ5IE5hbWUiKSkgJT4lIHJlbmFtZShJbmRpY2Fkb3IgPSAiSW5kaWNhdG9yIE5hbWUiKSANCg0KZGF0b3Nfem9uYV9ldXJvIDwtIHJpbzo6aW1wb3J0KCIuL2RhdG9zL0JBTkNPIE1VTkRJQUwvWk9OQSBFVVJPLnhscyIpICU+JSBzZWxlY3QoLWMoIkNvdW50cnkgQ29kZSIsICJJbmRpY2F0b3IgQ29kZSIsICJDb3VudHJ5IE5hbWUiKSkgJT4lIHJlbmFtZShJbmRpY2Fkb3IgPSAiSW5kaWNhdG9yIE5hbWUiKQ0KDQojLSBpbXBvcnRhbW9zIGxvcyBkYXRvcyBkZSBHcmVjaWEgZGVsIEJhbmNvIE11bmRpYWwsIG5vcyBxdWVkYW1vcyBjb24gbGFzIHZhcmlhYmxlcyBxdWUgbm9zIGludGVyZXNhbiB5IHJlbm9tYnJhbW9zIGVsIHJlc3RvDQoNCmRhdG9zX2JhbGFuemFzX3BhZ29fY2MgPC0gcmlvOjppbXBvcnQoIi4vZGF0b3MvQkFMQU5aQSBERSBQQUdPUy9DVUVOVEFfQ09SUklFTlRFLnhsc3giKSAlPiUgc2VsZWN0KC1jKCJDQU1CSUFSLMKgJSIpKQ0KZGF0b3NfYmFsYW56YXNfcGFnb19jZiA8LSByaW86OmltcG9ydCgiLi9kYXRvcy9CQUxBTlpBIERFIFBBR09TL0NVRU5UQSBGSU5BTkNJRVJBLnhsc3giKSAlPiUgc2VsZWN0KC1jKCJDQU1CSUFSLMKgJSIpKSANCmRhdG9zX2JhbGFuemFzX3BhZ29fY2sgPC0gcmlvOjppbXBvcnQoIi4vZGF0b3MvQkFMQU5aQSBERSBQQUdPUy9DVUVOVEEgREUgQ0FQSVRBTC54bHN4IikgJT4lIHNlbGVjdCgtYygiQ0FNQklBUizCoCUiKSkNCmRhdG9zX2JhbGFuemFzX3BhZ29fY2UgPC0gcmlvOjppbXBvcnQoIi4vZGF0b3MvQkFMQU5aQSBERSBQQUdPUy9DVUVOVEEgRVJST1JFUy54bHN4IikgJT4lIHNlbGVjdCgtYygiQ0FNQklBUizCoCUiKSkNCg0KZGF0b3NfYmFsYW56YV9wYWdvMSA8LSBtZXJnZShkYXRvc19iYWxhbnphc19wYWdvX2NjLCBkYXRvc19iYWxhbnphc19wYWdvX2NmLCBieSA9ICJGRUNIQSIpICU+JSByZW5hbWUoQ3VlbnRhX2NvcnJpZW50ZSA9ICJWQUxPUi54IiwgQ3VlbnRhX2ZpbmFuY2llcmEgPSAiVkFMT1IueSIpDQpkYXRvc19iYWxhbnphX3BhZ28yIDwtIG1lcmdlKGRhdG9zX2JhbGFuemFfcGFnbzEsIGRhdG9zX2JhbGFuemFzX3BhZ29fY2ssIGJ5ID0gIkZFQ0hBIikgJT4lIHJlbmFtZShDdWVudGFfY2FwaXRhbCA9ICJWQUxPUiIpICANCmRhdG9zX2JhbGFuemFfcGFnbyA8LSBtZXJnZShkYXRvc19iYWxhbnphX3BhZ28yLCBkYXRvc19iYWxhbnphc19wYWdvX2NlLCBieSA9ICJGRUNIQSIpICAlPiUgcmVuYW1lKEN1ZW50YV9lcnJvcmVzID0gIlZBTE9SIiwgQcOxbyA9ICJGRUNIQSIpICU+JSBtdXRhdGUoQ3VlbnRhX2ZpbmFuY2llcmEgPSAtIEN1ZW50YV9maW5hbmNpZXJhLCBCYWxhbnphX3BhZ29zID0gQ3VlbnRhX2NvcnJpZW50ZSArIEN1ZW50YV9maW5hbmNpZXJhICsgQ3VlbnRhX2NhcGl0YWwgKyBDdWVudGFfZXJyb3JlcykgDQoNCiMtIGltcG9ydGFtb3MgbGFzIGRpc3RpbnRhcyBiYWxhbnphcyBkZSBHcmVjaWEsIGxhcyB1bmltb3MgZW4gdW4gc29sbyBERiB5IGNyZWFtb3MgbGEgdmFyaWFibGUgYmFsYW56YSBkZSBwYWdvcw0KDQpgYGANCg0KRW4gcHJpbWVyIGx1Z2FyIHZhbW9zIGEgZXN0dWRpYXIgbGEgZXZvbHVjacOzbiBkZSBsYSBiYWxhbnphIGRlIHBhZ29zIGRlIEdyZWNpYSAocmVwcmVzZW50YWRhIGVuIG5lZ3JvKS4gT2JzZXJ2YW1vcyBxdWUgZW4gZWwgcGVyaW9kbyBhbnRlcmlvciBhIGxhIGNyaXNpcyBsYSBiYWxhbnphIHBvciBjdWVudGEgY29ycmllbnRlIChxdWUgbWlkZSBsYSBkaWZlcmVuY2lhIGVudHJlIGV4cG9ydGFjaW9uZXMgZSBpbXBvcnRhY2lvbmVzIGRlIGJpZW5lcyB5IHNlcnZpY2lvcykgZXJhIG11eSBkZWZpY2l0YXJpYSwgcGVybyBkZWJpZG8gYWwgZnVlcnRlIGltcGFjdG8gcXVlIHR1dm8gbGEgY3Jpc2lzIGZpbmFuY2llcmEgZW1wZXphZGEgZW4gR3JlY2lhLCBsYXMgaW1wb3J0YWNpb25lcyBkZSBiaWVuZXMgeSBzZXJ2aWNpb3MgY2F5ZXJvbiBlbiBtYXlvciBtZWRpZGEgZGUgbG8gcXVlIGhpY2llcm9uIGxhcyBleHBvcnRhY2lvbmVzIChlcyBkZWNpciwgbGEgbWVqb3JhIGRlIGxhIGJhbGFuemEgcG9yIGN1ZW50YSBjb3JyaWVudGUgZnXDqSBkZWJpZGEgYWwgbWVub3IgcG9kZXIgYWRxdWlzaXRpdm8gZGUgbG9zIGNpdWRhZGFub3MgZ3JpZWdvcyBtYXMgcXVlIGEgdW5hIG1lam9yYSBkZSBsYXMgZXhwb3J0YWNpb25lcykuIA0KDQpFbCBzYWxkbyBkZWZpY2l0YXJpbyBkZSBsYSBiYWxhbnphIHBvciBjdWVudGEgY29ycmllbnRlIG9ibGlnYSBhIHVuIHN1cGVyYXZpdCBlbiBsYSBjdWVudGEgZGUgYWN0aXZvcywgcG9yIGVsbG8gbGEgY3VlbnRhIGZpbmFuY2llcmEgKGxhIHF1ZSBtaWRlIGxhIGRpZmVyZW5jaWEgZW50cmUgZXhwb3J0YWNpb25lcyBlIGltcG9ydGFjaW9uZXMgZGUgYWN0aXZvcykgZ3JpZWdhIGVzIHBvc2l0aXZhIHkgc2lndWUgbGEgZXZvbHVjacOzbiBpbnZlcnNhIGEgbGEgYmFsYW56YSBwb3IgY3VlbnRhIGNvcnJpZW50ZS4gTGEgY3VlbnRhIGRlIGNhcGl0YWxlcyB0aWVuZSB1biBwZXNvIGJhc3RhbnRlIG1lbm9yIGVuIGxhIGJhbGFuemEgZGUgcGFnb3MgeSBzaWVtcHJlIGhhIG1vc3RyYWRvIHVuIHN1cGVyw6F2aXQuIExhIGN1ZW50YSBkZSBlcnJvcmVzIHkgb21pc2lvbmVzIG1pZGUgbGFzIHRyYW5zYWNjaW9uZXMgcXVlIG5vIGhhbiBzaWRvIGluY2x1aWRhcyBlbiBlbCByZXN0byBkZSBsYXMgYmFsYW56YXMgeSBzZSBpbmNsdXllIHBvcnF1ZSBsYSBzdW1hIGRlIGxhcyAzIGJhbGFuemFzIHF1ZSBjb25mb3JtYW4gbGEgYmFsYW56YSBkZSBwYWdvcyAoY3VlbnRhIGNvcnJpZW50ZSwgZmluYW5jaWVyYSB5IGRlIGNhcGl0YWxlcykgaGFuIGRlIHN1bWFyIDAuDQoNCiMjIyBHcsOhZmljbw0KDQpgYGB7ciwgZWNobyA9IEZBTFNFLCBldmFsID0gVFJVRX0NCmdyYWZpY29fYmFsYW56YV9wYWdvcyA8LSBkYXRvc19iYWxhbnphX3BhZ28gJT4lIGdncGxvdChhZXMoeCA9IEHDsW8sIGdyb3VwID0gMSkpICsgICAgICAgICAgIGdlb21fbGluZShhZXMoeCA9IEHDsW8sIHkgPSBDdWVudGFfY29ycmllbnRlKSwgY29sb3VyID0gImdyZWVuMSIpICsNCiAgZ2VvbV9saW5lKGFlcyh4ID0gQcOxbywgeSA9IEN1ZW50YV9maW5hbmNpZXJhKSwgY29sb3VyID0gIm9yYW5nZSIpICsgDQogIGdlb21fbGluZShhZXMoeCA9IEHDsW8sIHkgPSBDdWVudGFfY2FwaXRhbCksIGNvbG91ciA9ICJibHVlIikgKw0KICBnZW9tX2xpbmUoYWVzKHggPSBBw7FvLCB5ID0gQ3VlbnRhX2Vycm9yZXMpLCBjb2xvdXIgPSAicmVkIikgKyANCiAgZ2VvbV9saW5lKGFlcyh4ID0gQcOxbywgeSA9IEJhbGFuemFfcGFnb3MpLCBjb2xvdXIgPSAiYmxhY2siKSArDQogIHRoZW1lX3NvbGFyaXplZCgpICsNCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgyMDA4LCAyMDE5LCAyKSkgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIkJhbGFuemEgZGUgcGFnb3MgZGUgR3JlY2lhIiwNCiAgICBzdWJ0aXRsZSA9ICJQZXJpb2RvIDIwMDgtMjAxOSwgVVMkIGFjdHVhbGVzIiwNCiAgICBjYXB0aW9uID0gIkRhdG9zIHByb3ZlbmllbnRlcyBkZSBLTk9FTUEiLA0KICAgIHkgPSAiTml2ZWwgZGUgbGFzIGJhbGFuemFzIg0KICApDQpncmFmaWNvX2JhbGFuemFfcGFnb3MNCmBgYA0KDQpPYnNlcnZhbW9zIHF1ZSBjb24gbGEgbW9kZXJhY2nDs24gZGVsIGTDqWZpY2l0IHBvciBjdWVudGEgY29ycmllbnRlIGVsIHN1cGVyw6F2aXQgcG9yIGN1ZW50YSBmaW5hbmNpZXJhIHRhbWJpw6luIHNlIG1vZGVyYSwgbW9zdHJhbmRvIGFtYmFzIGJhbGFuemFzIHVuIHNhbGRvIG1hcyBlcXVpbGlicmFkbyBhdW5xdWUgc2luIGxsZWdhciBhIHNlciBwb3NpdGl2YS4gRW50cmUgbG9zIHNlY3RvcmVzIGV4cG9ydGFkb3JlcyBtw6FzIGltcG9ydGFudGVzIGRlIEdyZWNpYSBlc3TDoSBlbCB0dXJpc21vLCBlbCBjdWFsIGVzdHVkaWFyZW1vcyBjb21vIGhhIGV2b2x1Y2lvbmFkbyBlbiBzdSBwZXJpb2RvIG3DoXMgcmVjaWVudGUgbWFzIGFkZWxhbnRlLCBhZGVtw6FzIGRlIGxhIG1ldGFsw7pyZ2lhLCBsb3MgcHJvZHVjdG9zIHF1w61taWNvcywgZWwgdGFiYWNvIHkgcHJvZHVjdG9zIHRleHRpbGVzLg0KDQojIyMgQ8OzZGlnbyBkZWwgZ3LDoWZpY28NCg0KYGBge3IsIGVjaG8gPSBUUlVFLCBldmFsID0gRkFMU0UsIG1lc3NzYWdlID0gRkFMU0V9DQpncmFmaWNvX2JhbGFuemFfcGFnb3MgPC0gZGF0b3NfYmFsYW56YV9wYWdvICU+JSBnZ3Bsb3QoYWVzKHggPSBBw7FvLCBncm91cCA9IDEpKSArICAgICAgICAgICBnZW9tX2xpbmUoYWVzKHggPSBBw7FvLCB5ID0gQ3VlbnRhX2NvcnJpZW50ZSksIGNvbG91ciA9ICJncmVlbjEiKSArDQogIGdlb21fbGluZShhZXMoeCA9IEHDsW8sIHkgPSBDdWVudGFfZmluYW5jaWVyYSksIGNvbG91ciA9ICJvcmFuZ2UiKSArIA0KICBnZW9tX2xpbmUoYWVzKHggPSBBw7FvLCB5ID0gQ3VlbnRhX2NhcGl0YWwpLCBjb2xvdXIgPSAiYmx1ZSIpICsNCiAgZ2VvbV9saW5lKGFlcyh4ID0gQcOxbywgeSA9IEN1ZW50YV9lcnJvcmVzKSwgY29sb3VyID0gInJlZCIpICsgDQogIGdlb21fbGluZShhZXMoeCA9IEHDsW8sIHkgPSBCYWxhbnphX3BhZ29zKSwgY29sb3VyID0gImJsYWNrIikgKw0KICB0aGVtZV9zb2xhcml6ZWQoKSArDQogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoMjAwOCwgMjAxOSwgMikpDQogIGxhYnMoDQogICAgdGl0bGUgPSAiQmFsYW56YSBkZSBwYWdvcyBkZSBHcmVjaWEiLA0KICAgIHN1YnRpdGxlID0gIlBlcmlvZG8gMjAwOC0yMDE5LCBVUyQgYWN0dWFsZXMiLA0KICAgIGNhcHRpb24gPSAiRGF0b3MgcHJvdmVuaWVudGVzIGRlIEtOT0VNQSIsDQogICAgeSA9ICJOaXZlbCBkZSBsYXMgYmFsYW56YXMiDQogICkNCmdyYWZpY29fYmFsYW56YV9wYWdvcw0KYGBgDQoNCiMjIyBQcmVwYXJhY2nDs24gZGUgZGF0b3MNCg0KYGBge3IsIGV2YWwgPSBGQUxTRSwgZWNobyA9IFRSVUV9DQojLSBFbiBlc3RlIGNhc28gY29tbyBsYSBwcmVwYXJhY2nDs24gZGUgZGF0b3Mgb2N1cGEgbXVjaG8gY29tbyBwYXJhIHBvbmVybG8ganVudG8gYWwgY8OzZGlnbyBkZWwgZ3LDoWZpY28sIGxvIHBvbmdvIHBvciBzZXBhcmFkbw0KDQpkYXRvc19ncmVjaWEgPC0gcmlvOjppbXBvcnQoIi4vZGF0b3MvQkFOQ08gTVVORElBTC9EQVRPU19HUkVDSUEueGxzIikgJT4lIHNlbGVjdCgtYygiQ291bnRyeSBDb2RlIiwgIkluZGljYXRvciBDb2RlIiwgIkNvdW50cnkgTmFtZSIpKSAlPiUgcmVuYW1lKEluZGljYWRvciA9ICJJbmRpY2F0b3IgTmFtZSIpIA0KDQpkYXRvc196b25hX2V1cm8gPC0gcmlvOjppbXBvcnQoIi4vZGF0b3MvQkFOQ08gTVVORElBTC9aT05BIEVVUk8ueGxzIikgJT4lIHNlbGVjdCgtYygiQ291bnRyeSBDb2RlIiwgIkluZGljYXRvciBDb2RlIiwgIkNvdW50cnkgTmFtZSIpKSAlPiUgcmVuYW1lKEluZGljYWRvciA9ICJJbmRpY2F0b3IgTmFtZSIpDQoNCiMtIGltcG9ydGFtb3MgbG9zIGRhdG9zIGRlIEdyZWNpYSBkZWwgQmFuY28gTXVuZGlhbCwgbm9zIHF1ZWRhbW9zIGNvbiBsYXMgdmFyaWFibGVzIHF1ZSBub3MgaW50ZXJlc2FuIHkgcmVub21icmFtb3MgZWwgcmVzdG8NCg0KZGF0b3NfYmFsYW56YXNfcGFnb19jYyA8LSByaW86OmltcG9ydCgiLi9kYXRvcy9CQUxBTlpBIERFIFBBR09TL0NVRU5UQV9DT1JSSUVOVEUueGxzeCIpICU+JSBzZWxlY3QoLWMoIkNBTUJJQVIswqAlIikpDQpkYXRvc19iYWxhbnphc19wYWdvX2NmIDwtIHJpbzo6aW1wb3J0KCIuL2RhdG9zL0JBTEFOWkEgREUgUEFHT1MvQ1VFTlRBIEZJTkFOQ0lFUkEueGxzeCIpICU+JSBzZWxlY3QoLWMoIkNBTUJJQVIswqAlIikpIA0KZGF0b3NfYmFsYW56YXNfcGFnb19jayA8LSByaW86OmltcG9ydCgiLi9kYXRvcy9CQUxBTlpBIERFIFBBR09TL0NVRU5UQSBERSBDQVBJVEFMLnhsc3giKSAlPiUgc2VsZWN0KC1jKCJDQU1CSUFSLMKgJSIpKQ0KZGF0b3NfYmFsYW56YXNfcGFnb19jZSA8LSByaW86OmltcG9ydCgiLi9kYXRvcy9CQUxBTlpBIERFIFBBR09TL0NVRU5UQSBFUlJPUkVTLnhsc3giKSAlPiUgc2VsZWN0KC1jKCJDQU1CSUFSLMKgJSIpKQ0KDQpkYXRvc19iYWxhbnphX3BhZ28xIDwtIG1lcmdlKGRhdG9zX2JhbGFuemFzX3BhZ29fY2MsIGRhdG9zX2JhbGFuemFzX3BhZ29fY2YsIGJ5ID0gIkZFQ0hBIikgJT4lIHJlbmFtZShDdWVudGFfY29ycmllbnRlID0gIlZBTE9SLngiLCBDdWVudGFfZmluYW5jaWVyYSA9ICJWQUxPUi55IikNCmRhdG9zX2JhbGFuemFfcGFnbzIgPC0gbWVyZ2UoZGF0b3NfYmFsYW56YV9wYWdvMSwgZGF0b3NfYmFsYW56YXNfcGFnb19jaywgYnkgPSAiRkVDSEEiKSAlPiUgcmVuYW1lKEN1ZW50YV9jYXBpdGFsID0gIlZBTE9SIikgIA0KZGF0b3NfYmFsYW56YV9wYWdvIDwtIG1lcmdlKGRhdG9zX2JhbGFuemFfcGFnbzIsIGRhdG9zX2JhbGFuemFzX3BhZ29fY2UsIGJ5ID0gIkZFQ0hBIikgICU+JSByZW5hbWUoQ3VlbnRhX2Vycm9yZXMgPSAiVkFMT1IiLCBBw7FvID0gIkZFQ0hBIikgJT4lIG11dGF0ZShDdWVudGFfZmluYW5jaWVyYSA9IC0gQ3VlbnRhX2ZpbmFuY2llcmEsIEJhbGFuemFfcGFnb3MgPSBDdWVudGFfY29ycmllbnRlICsgQ3VlbnRhX2ZpbmFuY2llcmEgKyBDdWVudGFfY2FwaXRhbCArIEN1ZW50YV9lcnJvcmVzKSANCg0KIy0gaW1wb3J0YW1vcyBsYXMgZGlzdGludGFzIGJhbGFuemFzIGRlIEdyZWNpYSwgbGFzIHVuaW1vcyBlbiB1biBzb2xvIERGIHkgY3JlYW1vcyBsYSB2YXJpYWJsZSBiYWxhbnphIGRlIHBhZ29zDQoNCmBgYA0KDQojIyBEZXN0aW5vIGV4cG9ydGFjaW9uZXMgey50YWJzZXR9DQoNCkFob3JhIHZlbW9zIGxvcyBwcmluY2lwYWxlcyBkZXN0aW5vcyBkZSBsYXMgZXhwb3J0YWNpb25lcyBncmllZ2FzIGR1cmFudGUgbG9zIGHDsW9zIGZpbmFsZXMgZGUgbGEgY3Jpc2lzOg0KDQojIyMgVEFCTEENCmBgYHtyLCBlY2hvID0gRkFMU0V9DQpkZXN0aW5vX2V4cG9ydGFjaW9uZXMgPC0gcmlvOjppbXBvcnQoIi4vZGF0b3MvZGVzdGlubyBleHBvcnRhY2lvbmVzLnhsc3giKSAjLSBpbXBvcnRhbW9zIGxvcyBkYXRvcw0KDQp0YWJsYV9kZXN0aW5vX2V4cG9ydGFjaW9uZXMgPC0gZGVzdGlub19leHBvcnRhY2lvbmVzDQogIA0Ka25pdHI6OmthYmxlKHRhYmxhX2Rlc3Rpbm9fZXhwb3J0YWNpb25lcywNCiAgZm9ybWF0LmFyZ3MgPSBsaXN0KGRlY2ltYWwubWFyayA9ICIsIiwgYmlnLm1hcmsgPSAiLiIpLA0KICBhbGlnbiA9ICJjIiwNCiAgY2FwdGlvbiA9ICJQYcOtc2VzIHJlY2VwdG9yZXMgZGUgbGFzIGV4cG9ydGFjaW9uZXMgZ3JpZWdhcyINCikgJT4lIGthYmxlX3N0eWxpbmcoZml4ZWRfdGhlYWQgPSBsaXN0KGVuYWJsZWQgPSBULCBiYWNrZ3JvdW5kID0gInJlZCIpKSAlPiUgcm93X3NwZWMoMTIsIGJhY2tncm91bmQgPSAiYmx1ZSIsIGNvbG9yID0gIndoaXRlIikgJT4lIHJvd19zcGVjKDExLCBjb2xvciA9ICJvcmFuZ2UiKSAjLSBjcmVhbW9zIGxhIHRhYmxhLCByZXNhbHRhbmRvIGFsZ3VuYXMgZmlsdGFzIChjb21vIGVsIHRvdGFsIG8gYWwgcmVzdG8gZGVsIG11bmRvKQ0KDQpgYGANCg0KT2JzZXJ2YW1vcyBjb21vIFR1cnF1w61hIHNlIGNvbnZpZXJ0ZSBlbiBwcmluY2lwYWwgcmVjZXB0b3IgZGUgbGFzIGV4cG9ydGFjaW9uZXMgZ3JpZWdhcywgc2VndWlkbyBwb3IgSXRhbGlhIHkgQWxlbWFuaWEuIFNpIHJlcHJlc2VudGFtb3MgZW4gdW4gbWFwYSBsb3MgcGHDrXNlcyBxdWUgbWFzIGV4cG9ydGFjaW9uZXMgY29tcHJhbiBhIEdyZWNpYToNCg0KIyMjIEPDk0RJR08NCg0KYGBge3IsIGVjaG8gPSBUUlVFLCBldmFsID0gRkFMU0V9DQp0YWJsYV9kZXN0aW5vX2V4cG9ydGFjaW9uZXMgPC0gZGVzdGlub19leHBvcnRhY2lvbmVzDQogIA0Ka25pdHI6OmthYmxlKHRhYmxhX2Rlc3Rpbm9fZXhwb3J0YWNpb25lcywNCiAgZm9ybWF0LmFyZ3MgPSBsaXN0KGRlY2ltYWwubWFyayA9ICIsIiwgYmlnLm1hcmsgPSAiLiIpLA0KICBhbGlnbiA9ICJjIiwNCiAgY2FwdGlvbiA9ICJQYcOtc2VzIHJlY2VwdG9yZXMgZGUgbGFzIGV4cG9ydGFjaW9uZXMgZ3JpZWdhcyINCikgJT4lIGthYmxlX3N0eWxpbmcoZml4ZWRfdGhlYWQgPSBsaXN0KGVuYWJsZWQgPSBULCBiYWNrZ3JvdW5kID0gInJlZCIpKSAlPiUgcm93X3NwZWMoMTIsIGJhY2tncm91bmQgPSAiYmx1ZSIsIGNvbG9yID0gIndoaXRlIikgJT4lIHJvd19zcGVjKDExLCBjb2xvciA9ICJvcmFuZ2UiKQ0KDQpgYGANCg0KIyMgT3RyYSBmb3JtYSBkZSB2aXN1YWxpemFyIGVzdG9zIGRhdG9zIHsudGFic2V0fQ0KDQpNb3N0cmFtb3MgZW4gdW4gbWFwYSwgZW4gZG9uZGUgZWwgbWF5b3IgdGFtYcOxbyBkZWwgcHVudG8gZW4gY2FkYSBwYcOtcyByZXByZXNlbnRhIHVuIG7Dum1lcm8gbWF5b3IgZGUgZXhwb3J0YWNpb25lcyBxdWUgdmFuIGRlc3RpbmFkYXMgYSBlc3RvcyBwYcOtc2VzLg0KDQojIyMgTUFQQQ0KDQpgYGB7ciwgZWNobyA9IEZBTFNFfQ0Kd29ybGQgPC0gcm5hdHVyYWxlYXJ0aDo6bmVfY291bnRyaWVzKHNjYWxlID0gIm1lZGl1bSIsIHJldHVybmNsYXNzID0gInNmIikNCg0KIy0gY3JlYW1vcyBlbCBkZiBjb24gbG9zIGRhdG9zIGdlb2dyw6FmaWNvcyBkZSBsb3MgcGHDrXNlcyBxdWUgYXBhcmVjZW4gZW4gbGEgdGFibGENCg0KcGFpc2VzIDwtIGRhdGEuZnJhbWUoDQogIHBhaXMgPSBjKCJUdXJxdcOtYSIsICJJdGFsaWEiLCAiQWxlbWFuaWEiLCAiQnVsZ2FyaWEiLCAiQ2hpcHJlIiwgIlJlaW5vIFVuaWRvIiwgIkVzdGFkb3MgVW5pZG9zIiwgIkZyYW5jaWEiLCAiUnVtYW5pYSIsICJNYWNlZG9uaWEiLCAiR3JlY2lhIiksDQogIGxvbmdpdHVkZSA9IGMoMzUuMjQsIDEyLjU3LCAxMC40NSwgMjUuNDksIDMzLjQzLCAtMy40NCwgLTk1LjcxLCAyLjIxLCAyNC45NywgMjEuNzQsIDIxLjgyKSwNCiAgbGF0aXR1ZGUgPSBjKDM4Ljk2LCA0MS44NywgNTEuMTcsIDQyLjczLCAzNS4xMywgNTUuMzgsIDM3LjA5LCA0Ni4yMywgNDUuOTQsIDQxLjYxLCAzOS4wNyksDQogIGV4cG9ydGFjaW9uZXNfMjAxNCA9IGMoNDMzNDc3NTg4OSwgMzE1NTgyMzE1MCwgMjMxNTg0NDE4MCwgMTc2NzI0MDc5NCwgMTYxNDY4MzIzOCwgMTI3MDY0NjI5OSwgMTAxOTI3NDI5MSwgODYwODA4Nzg4LCA4MzQ3NTU1OTUsIDkzNDM1Mzg4NywgMCkNCikNCg0KIy0gaGFjZW1vcyBlbCBtYXBhDQoNCm1hcGEgPC0gd29ybGQgJT4lIGdncGxvdCgpICsgZ2VvbV9zZihmaWxsID0gImFudGlxdWV3aGl0ZSIpICsgDQogIGNvb3JkX3NmKHhsaW0gPSBjKC0xNSwgNDUpLCB5bGltID0gYygzMCwgNjApLCBleHBhbmQgPSBGQUxTRSkgKw0KICBnZW9tX3BvaW50KGRhdGEgPSBwYWlzZXMsIGFlcyh4ID0gbG9uZ2l0dWRlLCB5ID0gbGF0aXR1ZGUsIHNpemUgPSBleHBvcnRhY2lvbmVzXzIwMTQpKSArDQogIGdlb21fdGV4dChkYXRhID0gcGFpc2VzLCBhZXMoeCA9IGxvbmdpdHVkZSArNiwgeSA9IGxhdGl0dWRlLCBsYWJlbCA9IHBhaXMpKSArDQogIHRoZW1lX3NvbGFyaXplZCgpICsNCiAgbGFicygNCiAgICB0aXRsZSA9ICJEaXN0cmlidWNpw7NuIGRlIGxhcyBleHBvcnRhY2lvbmVzIGdyaWVnYXMgKDIwMTQpIiwNCiAgICBjYXB0aW9uID0gIkRhdG9zIHByb3ZlbmllbnRlcyBkZSBLTk9FTUEiLA0KICAgIHggPSAiTG9uZ2l0dWQiLA0KICAgIHkgPSAiTGF0aXR1ZCIsDQogICAgc2l6ZSA9ICJFeHBvcnRhY2lvbmVzIg0KICApDQptYXBhDQpgYGANCg0KVmVtb3MgY29tbyBsYSBtYXlvcsOtYSBkZSBsb3MgcGHDrXNlcyBxdWUgbcOhcyBpbXBvcnRhbiBwcm9kdWN0b3MgeSBzZXJ2aWNpb3MgZ3JpZWdvcyBlc3TDoW4gcHLDs3hpbW9zIGEgR3JlY2lhLCBzZWd1cmFtZW50ZSBwb3IgbG9zIGJham9zIGNvc3RlcyBkZSB0cmFuc3BvcnRlIGEgZXN0b3MgcGHDrXNlcy4gRXN0ZSBlcyBlbCBjYXNvIGRlIFJ1bWFuaWEsIEJ1bGdhcmlhLCBNYWNlZG9uaWEsIFR1cnF1w61hLCBDaGlwcmUgZSBJdGFsaWEuIEVsIGNvbWVyY2lvIHRhbiBhbHRvIGNvbiBJdGFsaWEsIFR1cnF1w61hIHkgQ2hpcHJlIGVzIGRlYmlkbyBhIGxhIHBvdGVudGUgaW5kdXN0cmlhIG5hdmllcmEgZ3JpZWdhIGxhIGN1YWwgYWJhcmF0YSBlbCB0cmFuc3BvcnRlIGRlIHByb2R1Y3RvcyBhIGVzdG9zIHBhw61zZXMuDQoNCkVzIGVuIHBhcnRlIGVzdGEgZ3JhbiB2ZW50YWphIGNvbXBldGl0aXZhIHF1ZSB0aWVuZSBHcmVjaWEgZW4gc3UgaW5kdXN0cmlhIG5hdmFsIHF1ZSBsZSBwZXJtaXRlIHNlciBtdXkgY29tcGV0aXRpdmEgZW4gdmFyaW9zIHByb2R1Y3RvcyBxdWUgc2UgcHVlZGVuIHRyYW5zcG9ydGFyIGRlIGVzdGEgZm9ybWEsIGxhcyBleHBvcnRhY2lvbmVzIHRleHRpbGVzIHNlIGJlbmVmw61jaWFuIGVuIGdyYW4gcGFydGUgZGUgZWxsby4NCg0KIyMjIEPDk0RJR08NCg0KYGBge3IsIGVjaG8gPSBUUlVFLCBldmFsID0gRkFMU0V9DQp3b3JsZCA8LSBybmF0dXJhbGVhcnRoOjpuZV9jb3VudHJpZXMoc2NhbGUgPSAibWVkaXVtIiwgcmV0dXJuY2xhc3MgPSAic2YiKQ0KDQojLSBjcmVhbW9zIGVsIGRmIGNvbiBsb3MgZGF0b3MgZ2VvZ3LDoWZpY29zIGRlIGxvcyBwYcOtc2VzIHF1ZSBhcGFyZWNlbiBlbiBsYSB0YWJsYQ0KDQpwYWlzZXMgPC0gZGF0YS5mcmFtZSgNCiAgcGFpcyA9IGMoIlR1cnF1w61hIiwgIkl0YWxpYSIsICJBbGVtYW5pYSIsICJCdWxnYXJpYSIsICJDaGlwcmUiLCAiUmVpbm8gVW5pZG8iLCAiRXN0YWRvcyBVbmlkb3MiLCAiRnJhbmNpYSIsICJSdW1hbmlhIiwgIk1hY2Vkb25pYSIsICJHcmVjaWEiKSwNCiAgbG9uZ2l0dWRlID0gYygzNS4yNCwgMTIuNTcsIDEwLjQ1LCAyNS40OSwgMzMuNDMsIC0zLjQ0LCAtOTUuNzEsIDIuMjEsIDI0Ljk3LCAyMS43NCwgMjEuODIpLA0KICBsYXRpdHVkZSA9IGMoMzguOTYsIDQxLjg3LCA1MS4xNywgNDIuNzMsIDM1LjEzLCA1NS4zOCwgMzcuMDksIDQ2LjIzLCA0NS45NCwgNDEuNjEsIDM5LjA3KSwNCiAgZXhwb3J0YWNpb25lc18yMDE0ID0gYyg0MzM0Nzc1ODg5LCAzMTU1ODIzMTUwLCAyMzE1ODQ0MTgwLCAxNzY3MjQwNzk0LCAxNjE0NjgzMjM4LCAxMjcwNjQ2Mjk5LCAxMDE5Mjc0MjkxLCA4NjA4MDg3ODgsIDgzNDc1NTU5NSwgOTM0MzUzODg3LCAwKQ0KKQ0KDQojLSBoYWNlbW9zIGVsIG1hcGENCg0KbWFwYSA8LSB3b3JsZCAlPiUgZ2dwbG90KCkgKyBnZW9tX3NmKGZpbGwgPSAiYW50aXF1ZXdoaXRlIikgKyANCiAgY29vcmRfc2YoeGxpbSA9IGMoLTE1LCA0NSksIHlsaW0gPSBjKDMwLCA2MCksIGV4cGFuZCA9IEZBTFNFKSArDQogIGdlb21fcG9pbnQoZGF0YSA9IHBhaXNlcywgYWVzKHggPSBsb25naXR1ZGUsIHkgPSBsYXRpdHVkZSwgc2l6ZSA9IGV4cG9ydGFjaW9uZXNfMjAxNCkpICsNCiAgZ2VvbV90ZXh0KGRhdGEgPSBwYWlzZXMsIGFlcyh4ID0gbG9uZ2l0dWRlICs2LCB5ID0gbGF0aXR1ZGUsIGxhYmVsID0gcGFpcykpICsNCiAgdGhlbWVfc29sYXJpemVkKCkgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIkRpc3RyaWJ1Y2nDs24gZGUgbGFzIGV4cG9ydGFjaW9uZXMgZ3JpZWdhcyAoMjAxNCkiLA0KICAgIGNhcHRpb24gPSAiRGF0b3MgcHJvdmVuaWVudGVzIGRlIEtOT0VNQSIsDQogICAgeCA9ICJMb25naXR1ZCIsDQogICAgeSA9ICJMYXRpdHVkIiwNCiAgICBzaXplID0gIkV4cG9ydGFjaW9uZXMiDQogICkNCm1hcGENCmBgYA0KDQojIDMuIFNFQ1RPUiBUVVLDjVNUSUNPIEdSSUVHTw0KDQpFbiBlc3RlIGFwYXJ0YWRvIGFuYWxpemFtb3MgY29tbyBoYSBhZmVjdGFkbyBlbCBjb3JvbmF2aXJ1cyBhIHVubyBkZSBzdXMgc2VjdG9yZXMgbWFzIGltcG9ydGFudGVzIGNvbW8gZXMgZWwgdHVyaXNtbyB5IGxhIHJlYWNjacOzbiBkZWwgZ29iaWVybm8gZ3JpZWdvIHBhcmEgaGFjZXIgZnJlbnRlIGEgbGEgY3Jpc2lzIGRlbCBjb3JvbmF2aXJ1cy4gDQoNCkVsIHR1cmlzbW8gc2UgaGEgdmlzdG8gYWZlY3RhZG8gbmVnYXRpdmFtZW50ZSBwYXJhIHRvZG9zIGxvcyBwYcOtc2VzIHBvciBsYXMgcmVzdHJpY2Npb25lcyBpbnRlcm5hY2lvbmFsZXMgc29icmUgbGEgbW92aWxpZGFkIGFkb3B0YWRhcyBwb3IgbG9zIHBhw61zZXMgcGFyYSBoYWNlciBmcmVudGUgYSBsYSBwYW5kZW1pYS4gTGFzIGVjb25vbcOtYXMgcXVlIHRpZW5lbiBhbHRvcyBuaXZlbGVzIGRlIHR1cmlzbW8gc2UgaGFuIHZpc3RvIGFmZWN0YWRhcywgeWEgcXVlIGVsIHR1cmlzbW8gdGFtYmnDqW4gaW5mbHV5ZSBlbiBvdHJvcyBzZWN0b3JlcyBkZSBsYSBlY29ub23DrWEsIGNvbW8gbGEgcmVzdGF1cmFjacOzbiB5IGxhIGhvc3RlbGVyw61hLg0KDQpTaW4gZW1iYXJnbywgY29tbyB2ZXJlbW9zIGEgY29udGludWFjacOzbiwgZWwgc2VjdG9yIHR1csOtc3RpY28gZW4gR3JlY2lhIGVzIG3DoXMgaW1wb3J0YW50ZSBkZSBsbyBxdWUgbG8gZXMgcGFyYSBlbCByZXN0byBkZSBwYcOtc2VzIGRlIGxhIHpvbmEgZXVybyB5IGVzIHVuIHNlY3RvciBlc3RyYXTDqWdpY28gcGFyYSBsYSBlY29ub23DrWEgZ3JpZWdhLCBhbCBzZXIgdW5hIGRlIGxhcyBwcmluY2lhbGVzIGZ1ZW50ZXMgZGUgaW5ncmVzb3MgZGUgbGEgbWlzbWEuDQoNCiMjIFBlc28gZGVsIHR1cmlzbW8gZW4gbGEgZWNvbm9tw61hIGdyaWVnYSB7LnRhYnNldH0NCg0KIyMjIFBlc28gc29icmUgbGFzIGV4cG9ydGFjaW9uZXMNCg0KRWwgdHVyaXNtbyBzaWVtcHJlIGhhIHJlcHJlc2VudGFkbyB1bmEgZ3JhbiBwcm9wb3JjacOzbiBkZSBsYSBiYWxhbnphIGNvbWVyY2lhbCBncmllZ2EsIGVuIGVsIGdyw6FmaWNvIGEgY29udGludWFjacOzbiBjb21wYXJhbW9zIGVsIHBlc28gcG9yY2VudHVhbCBxdWUgdGllbmUgZWwgdHVyaXNtbyBpbnRlcm5hY2lvbmFsIHNvYnJlIGxhcyBleHBvcnRhY2lvbmVzIGNvbiBsYSBtZWRpYSBkZSBsb3MgcGHDrXNlcyBkZSBsYXMgem9uYSBldXJvLCBkb25kZSBsYXMgYmFycmFzIHJvamFzIHJlcHJlc2VudGFuIGxvcyBkYXRvcyBkZSBsYSBldXJvem9uYSAobWVkaWEgZGUgbG9zIHBhw61zZXMgZGUgbGEgem9uYSBldXJvKSB5IGxhcyBhenVsZXMgbG9zIGRlIEdyZWNpYS4NCg0KYGBge3IsIGVjaG8gPSBGQUxTRX0NCnR1cmlzbW9fZ3JlY2lhIDwtIHJpbzo6aW1wb3J0KCIuL2RhdG9zL0JBTkNPIE1VTkRJQUwvREFUT1NfR1JFQ0lBLnhscyIpICU+JSByZW5hbWUoSW5kaWNhZG9yID0gIkluZGljYXRvciBOYW1lIikgJT4lIGZpbHRlcihJbmRpY2Fkb3IgPT0gIlR1cmlzbW8gaW50ZXJuYWNpb25hbCwgcmVjaWJvcyAoJSBkZWwgdG90YWwgZGUgZXhwb3J0YWNpb25lcykiKSAlPiUgc2VsZWN0KC1jKCJJbmRpY2F0b3IgQ29kZSIsIEluZGljYWRvciwgIkNvdW50cnkgQ29kZSIsICJDb3VudHJ5IE5hbWUiKSkgJT4lIHBpdm90X2xvbmdlcihjb2xzID0gZXZlcnl0aGluZygpLCBuYW1lc190byA9ICJBw7FvIiwgdmFsdWVzX3RvID0gIlR1cmlzbW9fR3JlY2lhIikNCg0KdHVyaXNtb19ldXJvem9uYSA8LSByaW86OmltcG9ydCgiLi9kYXRvcy9CQU5DTyBNVU5ESUFML1pPTkEgRVVSTy54bHMiKSAlPiUgcmVuYW1lKEluZGljYWRvciA9ICJJbmRpY2F0b3IgTmFtZSIpICU+JSBmaWx0ZXIoSW5kaWNhZG9yID09ICJUdXJpc21vIGludGVybmFjaW9uYWwsIHJlY2lib3MgKCUgZGVsIHRvdGFsIGRlIGV4cG9ydGFjaW9uZXMpIikgJT4lIHNlbGVjdCgtYygiSW5kaWNhdG9yIENvZGUiLCBJbmRpY2Fkb3IsICJDb3VudHJ5IENvZGUiLCAiQ291bnRyeSBOYW1lIikpICU+JSBwaXZvdF9sb25nZXIoY29scyA9IGV2ZXJ5dGhpbmcoKSwgbmFtZXNfdG8gPSAiQcOxbyIsIHZhbHVlc190byA9ICJUdXJpc21vX0V1cm96b25hIikNCg0KdHVyaXNtbyA8LSBtZXJnZSh0dXJpc21vX2dyZWNpYSwgdHVyaXNtb19ldXJvem9uYSwgYnkgPSJBw7FvIikgJT4lIGRyb3BfbmEoKQ0KDQpncmFmaWNvX3R1cmlzbW8gPC0gdHVyaXNtbyAlPiUgZ2dwbG90KCkgKyBnZW9tX2JhcihhZXMoeCA9IEHDsW8sIHkgPSBUdXJpc21vX0dyZWNpYSksIGNvbG91ciA9ICJibHVlIiwgc3RhdCA9ICJpZGVudGl0eSIsIGZpbGwgPSAiYmx1ZSIpICsgZ2VvbV9iYXIoYWVzKHggPSBBw7FvLCB5ID0gVHVyaXNtb19FdXJvem9uYSksIHN0YXQgPSAiaWRlbnRpdHkiLCBjb2xvdXIgPSAiYmxhY2siLCBmaWxsID0gInJlZCIpICsgdGhlbWVfc29sYXJpemVkKCkgKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCBoanVzdCA9IDEpKSArIGxhYnModGl0bGUgPSAiVHVyaXNtbyBzb2JyZSBlbCB0b3RhbCBkZSBsYXMgZXhwb3J0YWNpb25lcywgXG5jb21wYXJhY2nDs24gY29uIEV1cm9wYSIsIHggPSAiQcOxbyIsIHkgPSAiUG9yY2VudGFqZSBkZSB0dXJpc21vIHNvYnJlIGxhcyBleHBvcnRhY2lvbmVzIiwgY2FwdGlvbiA9ICJEYXRvcyBwcm92ZW5pZW50ZXMgZGVsIEJhbmNvIE11bmRpYWwiKSANCmdyYWZpY29fdHVyaXNtbyANCmBgYA0KDQpPYnNlcnZhbW9zIHF1ZSBjbGFyYW1lbnRlIGVsIHNlY3RvciB0dXLDrXN0aWNvIGdyaWVnbyB0aWVuZSB1biBwZXNvIG1heW9yIHNvYnJlIGxhIGVjb25vbcOtYSBuYWNpb25hbCAoc29icmUgdW4gMzAlIGRlIGxhcyBleHBvcnRhY2lvbmVzIGdyaWVnYXMgeSBzb2JyZSB1biA4JSBkZWwgUElCKSBxdWUgbGEgcXVlIHRpZW5lIHBhcmEgbGEgbWVkaWEgZGUgbG9zIHBhw61zZXMgZGUgbGEgZXVyb3pvbmEgKHNvYnJlIHVuIDcsNSUgZGUgc3VzIGV4cG9ydGFjaW9uZXMpLiANCg0KRXN0byBoYSBjb250cmlidWlkbyBhIHF1ZSBsYSBjcmlzaXMgZGVsIGNvcm9uYXZpcnVzIGhheWEgdGVuaWRvIHVuIG1heW9yIGltcGFjdG8gZW4gbGEgZWNvbm9tw61hIGdyaWVnYSBxdWUgZW4gZWwgcmVzdG8gZGUgcGHDrXNlcy4gRWwgUElCIGRlIEdyZWNpYSBoYSBjYcOtZG8gdW4gOCUgZGViaWRvIGEgZXN0bywgc2Vnw7puIHJlcG9ydGFuIGluZm9ybWVzLCBwb3IgcG9uZXJsbyBlbiBjb250ZXh0bywgcGFyYSBFc3Bhw7FhIHF1ZSBlcyB1biBwYcOtcyBkb25kZSBlbCB0dXJpc21vIHJlcHJlc2VudGEgdW5hIGdyYW4gZnVlbnRlIGRlIGluZ3Jlc29zIGhhIHNpZG8gZGUgdW4gMyczJS4gUGFyYSBmcmVuYXIgbGEgY2HDrWRhIGRlbCBQSUIgZWwgZ29iaWVybm8gZ3JpZWdvIGFwcm9iw7MgbGEgc3VwcmVzacOzbiBkZWwgSVZBIGhhc3RhIG1hcnpvIGRlIDIwMjEuDQoNClNlIGNhbGN1bGEgKG5vIGV4aXN0ZW4gdG9kYXbDrWEgY2lmcmFzIG9maWNpYWxlcykgcXVlIGVsIHR1cmlzbW8gdmEgYSBjYWVyIGVuIEdyZWNpYSB1biA3NSUgZHVyYW50ZSBlc3RlIGHDsW86IHVuIDgwJSBwYXJhIGVsIHR1cmltc21vIGludGVybmFjaW9uYWwgeSB1biA0NSUgZWwgdHVyaXNtbyBkZSBpbnRlcmlvci4NCg0KIyMjIEPDs2RpZ28NCg0KYGBge3IsIGVjaG8gPSBUUlVFLCBldmFsID0gRkFMU0V9DQp0dXJpc21vX2dyZWNpYSA8LSByaW86OmltcG9ydCgiLi9CQU5DTyBNVU5ESUFML0FQSV9HUkNfRFMyX2VzX2V4Y2VsX3YyXzE4NzM0NTMueGxzIikgJT4lIHJlbmFtZShJbmRpY2Fkb3IgPSAiSW5kaWNhdG9yIE5hbWUiKSAlPiUgZmlsdGVyKEluZGljYWRvciA9PSAiVHVyaXNtbyBpbnRlcm5hY2lvbmFsLCByZWNpYm9zICglIGRlbCB0b3RhbCBkZSBleHBvcnRhY2lvbmVzKSIpICU+JSBzZWxlY3QoLWMoIkluZGljYXRvciBDb2RlIiwgSW5kaWNhZG9yLCAiQ291bnRyeSBDb2RlIiwgIkNvdW50cnkgTmFtZSIpKSAlPiUgcGl2b3RfbG9uZ2VyKGNvbHMgPSBldmVyeXRoaW5nKCksIG5hbWVzX3RvID0gIkHDsW8iLCB2YWx1ZXNfdG8gPSAiVHVyaXNtb19HcmVjaWEiKQ0KDQp0dXJpc21vX2V1cm96b25hIDwtIHJpbzo6aW1wb3J0KCIuL0JBTkNPIE1VTkRJQUwvQVBJX0VNVV9EUzJfZXNfZXhjZWxfdjJfMTg4MjUzNy54bHMiKSAlPiUgcmVuYW1lKEluZGljYWRvciA9ICJJbmRpY2F0b3IgTmFtZSIpICU+JSBmaWx0ZXIoSW5kaWNhZG9yID09ICJUdXJpc21vIGludGVybmFjaW9uYWwsIHJlY2lib3MgKCUgZGVsIHRvdGFsIGRlIGV4cG9ydGFjaW9uZXMpIikgJT4lIHNlbGVjdCgtYygiSW5kaWNhdG9yIENvZGUiLCBJbmRpY2Fkb3IsICJDb3VudHJ5IENvZGUiLCAiQ291bnRyeSBOYW1lIikpICU+JSBwaXZvdF9sb25nZXIoY29scyA9IGV2ZXJ5dGhpbmcoKSwgbmFtZXNfdG8gPSAiQcOxbyIsIHZhbHVlc190byA9ICJUdXJpc21vX0V1cm96b25hIikNCg0KIy0gaW1wb3J0YW1vcyBsb3MgZGF0b3MgZGUgbG9zIDIgZXhjZWxzDQoNCnR1cmlzbW8gPC0gbWVyZ2UodHVyaXNtb19ncmVjaWEsIHR1cmlzbW9fZXVyb3pvbmEsIGJ5ID0iQcOxbyIpICU+JSBkcm9wX25hKCkNCg0KIy0gdW5pbW9zIGFtYm9zIGV4Y2VscyBlbiB1bm8gc29sbw0KDQpncmFmaWNvX3R1cmlzbW8gPC0gdHVyaXNtbyAlPiUgZ2dwbG90KCkgKyBnZW9tX2JhcihhZXMoeCA9IEHDsW8sIHkgPSBUdXJpc21vX0dyZWNpYSksIGNvbG91ciA9ICJibHVlIiwgc3RhdCA9ICJpZGVudGl0eSIsIGZpbGwgPSAiYmx1ZSIpICsgZ2VvbV9iYXIoYWVzKHggPSBBw7FvLCB5ID0gVHVyaXNtb19FdXJvem9uYSksIHN0YXQgPSAiaWRlbnRpdHkiLCBjb2xvdXIgPSAiYmxhY2siLCBmaWxsID0gInJlZCIpICsgdGhlbWVfc29sYXJpemVkKCkgKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCBoanVzdCA9IDEpKSArIGxhYnModGl0bGUgPSAiVHVyaXNtbyBzb2JyZSBlbCB0b3RhbCBkZSBsYXMgZXhwb3J0YWNpb25lcywgXG5jb21wYXJhY2nDs24gY29uIEV1cm9wYSIsIHggPSAiQcOxbyIsIHkgPSAiUG9yY2VudGFqZSBkZSB0dXJpc21vIHNvYnJlIGxhcyBleHBvcnRhY2lvbmVzIiwgY2FwdGlvbiA9ICJEYXRvcyBwcm92ZW5pZW50ZXMgZGVsIEJhbmNvIE11bmRpYWwiKSANCmdyYWZpY29fdHVyaXNtbyANCg0KIy0gcmVwcmVzZW50YW1vcyBlbCBncsOhZmljbw0KYGBgDQoNCiMjIFNpdGlvcyBtw6FzIHZpc2l0YWRvcyB7LnRhYnNldH0NCg0KIyMjIEFjcsOzcG9saXMgZGUgQXRlbmFzDQoNCkVzIGVsIG1vbnVtZW50byBncmllZ28gbcOhcyBlbWJsZW3DoXRpY28sIGhhIHN1ZnJpZG8gaW5jZW5kaW9zLCBndWVycmFzIHkgZGVycnVtYmVzIHBlcm8gc2lndWUgY29uc2VydmFuZG8gc3UgZW5jYW50byBwYXJhIGxvcyB0dXJpc3Rhcy4gDQoNCiFbXSguL2RhdG9zL2ZvdG9zL2Fjcm9wb2xpcy1hdGFyZGVjZXItcGFydGVub24tb2dkNXg5Y2cyY3hpZjgzM3N0NjBlNXl2b3J1a2YxN2E4bXExNDV6Y3o0LmpwZykgDQoNCiMjIyBQYXJ0ZW7Ds24NCg0KVGVtcGxvIGRlIG3DoXJtb2wgYmxhbmNvIHkgZW4gcHJvY2VzbyBkZSByZXN0YXVyYWNpw7NuIGRlc2RlIDE4NDEsIGVzIGVsIHNlZ3VuZG8gbHVnYXIgbcOhcyB2aXNpdGFkbyBkZSBHcmVjaWEgdHJhcyBsYSBBY3LDs3BvbGlzLg0KDQohW10oLi9kYXRvcy9mb3Rvcy9UaGVfUGFydGhlbm9uX2luX0F0aGVucy5qcGcpIA0KDQojIyMgTWV0ZW9yYQ0KDQpTdSBub21icmUgZW4gZXNwYcOxb2wgc2lnbmlmaWNhICJNb25hc3RlcmlvcyBjYcOtZG9zIGRlbCBjaWVsbyIsIGVzdMOhbiBjbGFzaWZpY2Fkb3MgY29tbyBQYXRyaW1vbmlvIGRlIGxhIEh1bWFuaWRhZCBkZXNkZSAxOTg4IHBvciBsYSBVTkVTQ08uDQoNCiFbXSguL2RhdG9zL2ZvdG9zL21vbmFzdGVyaW8tYWNlYm8tdmFybGFhbS1tZXRlb3JhLWdyZWNpYV85NzA3MC02ODguanBnKSANCg0KIyMjIFbDrWRlbyBzb2JyZSBHcmVjaWENCg0KSW5jbHV5byB0YW1iacOpbiB1biB2aWRlbyBkZSBhbGd1bm9zIGRlIGxvcyBzaXRpb3MgbcOhcyBib25pdG9zIGRlIEdyZWNpYSBxdWUgbWUgaGEgcGFyZWNpZG8gaW50ZXJlc2FudGUuDQoNCmBgYHtyLCBlY2hvID0gRkFMU0V9DQoNCmVtYmVkX3VybCgiaHR0cHM6Ly93d3cueW91dHViZS5jb20vd2F0Y2g/dj0yWDYxREh3dFZlNCIpICU+JQ0KICB1c2VfYWxpZ24oImNlbnRlciIpDQoNCmBgYA0KDQoNCiMjIFJlc3B1ZXN0YSBhIGxhIGNhw61kYSBkZWwgUElCIHBvciBlbCBDT1ZJRA0KDQpMYSBjcmlzaXMgZGVsIGNvcm9uYXZpcnVzIGxsZWdhIGEgR3JlY2lhIGVuIHVuIG1vbWVudG8gY3LDrXRpY28sIGNvbiBsYSBwb2zDrXRpY2EgZmlzY2FsIGxpbWl0YWRhIGVuIGdyYW4gcGFydGUgZGViaWRvIGFsIGFsdG8gbml2ZWwgZGUgZGV1ZGEgeSBjb24gbGEgcG9sw610aWNhIG1vbmV0YXJpYSBlbiBtYW5vcyBkZWwgQkNFLiBDb21vIGhlbW9zIGNvbWVudGFkbywgbGEgY2HDrWRhIGRlbCB0dXJpc21vIGRlYmlkbyBhIGxhcyByZXN0cmljY2lvbmVzIGRlIG1vdmltaWVudG8gaGEgdGVuaWRvIHVuIGZ1ZXJ0ZSBpbXBhY3RvIGVuIEdyZWNpYSBkZWJpZG8gYSBsYSBncmFuIGRlcGVkZW5jaWEgZGUgZXN0ZSBzZWN0b3IgcG9yIHBhcnRlIGRlIGxhIGVjb25vbcOtYS4NCg0KRW4gZXN0ZSBhcGFydGFkbyBlc3R1ZGlhbW9zIGxvcyBtZWNhbnNpbW9zIGRlIHJlc3B1ZXN0YSBxdWUgaGEgYWRvcHRhZG8gR3JlY2lhIHBhcmEgaGFjZXIgZnJlbnRlIGEgbG9zIHByb2JsZW1hcyBlY29uw7NtaWNvcy4NCg0KIyMjIFBvbMOtdGljYSBmaXNjYWwgey50YWJzZXR9DQoNCkxhIHBvbMOtdGljYSBmaXNjYWwgZ3JpZWdhIHNlIGVuY3VlbnRyYSBsaW1pdGFkYSBkZWJpZG8gYWwgYWx0byBuaXZlbCBkZSBkZXVkYSBxdWUgYWN1bXVsYSBHcmVjaWEgZGVzZGUgZWwgcGVyaW9kbyBhbnRlcmlvciBhIGxhIGNyaXNpcyBmaW5hbmNpZXJhIGRlIDIwMDcuIENvbW8gb2JzZXJ2YW1vcyBlbiBlbCBzaWd1aWVudGUgZ3LDoWZpY28gYW5pbWFkbywgZWwgbml2ZWwgZGUgZGV1ZGEgZGUgR3JlY2lhIHNlIGVuY3VlbnRyYSBtdXkgcG9yIGVuY2ltYSBkZSBsYSBtZWRpYSBkZSBsYSB6b25hIGV1cm86DQoNCiMjIyMgR3LDoWZpY28gZGV1ZGEgZ3JpZWdhDQoNCmBgYHtyLCBlY2hvID0gRkFMU0UsIGV2YWwgPSBUUlVFfQ0KZGV1ZGFfZ3JlY2lhIDwtIHJpbzo6aW1wb3J0KCIuL2RhdG9zL2RhdG9zbWFjcm8vREVVREEgR1JFQ0lBLnhsc3giKSAlPiUgcmVuYW1lKEHDsW8gPSBGZWNoYSwgRGV1ZGFfU29icmVfUElCID0gIkRldWRhICglUElCKSIpICU+JSBzZWxlY3QoQcOxbywgRGV1ZGFfU29icmVfUElCKQ0KDQpncmFmaWNvX2RldWRhX2dyZWNpYSA8LSBkZXVkYV9ncmVjaWEgJT4lIGdncGxvdChhZXMoeCA9IEHDsW8sIHkgPSBEZXVkYV9Tb2JyZV9QSUIvMTAwLCBncm91cCA9IDEpKSArIGdlb21fcG9pbnQoKSArIGdlb21fbGluZSgpICsgdGhlbWVfc29sYXJpemVkKCkgKyBsYWJzKHRpdGxlID0gIkRldWRhIGV4dGVybmEgZ3JpZWdhIHNvYnJlIGVsIFBJQiIsIHggPSAiQcOxbyIsIHkgPSAiUG9yY2VudGFqZSBkZSBkZXVkYSBzb2JyZSBlbCBQSUIiLCBjYXB0aW9uID0gIkRhdG9zIHByb3ZlbmllbnRlcyBkZSBkYXRvc21hY3JvIikgKyBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50KSArIHRyYW5zaXRpb25fcmV2ZWFsKEHDsW8pDQoNCmFuaW1hdGUoZ3JhZmljb19kZXVkYV9ncmVjaWEsIG5mcmFtZXMgPSA2MCwgZHVyYXRpb24gPSAzKQ0KYGBgDQoNCkVsIG5pdmVsIGRlIGRldWRhIGdyaWVnYSBjb21pZW56YSBhIGVsZXZhcnNlIGEgcGFydGlyIGRlIDE5ODAsIG9ic2VydmFtb3MgY29tbyBsb3MgeWEgYWx0b3Mgbml2ZWxlcyBkZSBkZXVkYSAoeWEgc2UgZW5jb250cmFiYW4gZW4gdG9ybm8gYWwgMTAwJSBkZWwgUElCIGFudGVzIGRlIGxhIGNyaXNpcyBmaW5hbmNpZXJhIGRlIDIwMDcpIHNlIGVsZXZhbiB0b2RhdsOtYSBtw6FzIGR1cmFudGUgbGEgY3Jpc2lzIGZpbmFuY2llcmEuIEVzdGUgaGVjaG8gcHVzbyBlbiBqYXF1ZSBsYSBlY29ub23DrWEgZ3JpZWdhLCBhc8OtIGNvbW8gc3UgZXN0YW5jaWEgZW4gZWwgZXVybyB5IHR1dm8gcXVlIHNlciByZXNjYXRhZGEuDQoNCkVsIGVsZXZhZG8gbml2ZWwgZGUgZGV1ZGEgcXVlIGFycmFzdHJhIGhhc3RhIGTDrWEgZGUgaG95IGxpbWl0YSBtdWNobyBlbCBnYXN0byBww7pibGljbyBxdWUgcHVlZGUgYXBsaWNhciBlbCBnb2JpZXJubywgeWEgcXVlIHNlIGVuZnJlbnRhIGEgcmVzdHJpY2Npb25lcyBwb3IgcGFydGUgZGUgbGEgZXVyb3pvbmEuDQoNCkVsIGdvYmllcm5vIGdyaWVnbyB2ZW7DrWEgYXBsaWNhbmRvIHVuYSBiYWphZGEgZGUgaW1wdWVzdG9zIGRlc2RlIGRlc2RlIGxhIHJlZm9ybWEgZmlzY2FsIGRlIDIwMTkgeSBxdWUgc2UgaGEgdmlzdG8gYWNlbGVyYWRhIGNvbiBsYSBjcmlzaXMgZGVsIGNvcm9uYXZpcnVzLCB5YSBxdWUgZWwgZ29iaWVybm8gZ3JpZWdvIGhhIGVsaW1pbmFkbyBlbCBJVkEgY29tbyBpbXB1ZXN0byBoYXN0YSBtYXJ6byBkZSAyMDIxIGNvbW8gbWVkaWRhIHBhcmEgZm9tZW50YXIgZWwgY29uc3VtbyB5IGltcHVsc2FyIGxhIGVjb25vbcOtYS4NCg0KIyMjIyBDw7NkaWdvIA0KYGBge3IsIGVjaG8gPSBUUlVFLCBldmFsID0gRkFMU0V9DQpkZXVkYV9ncmVjaWEgPC0gcmlvOjppbXBvcnQoIi4vZGF0b3MvZGF0b3NtYWNyby9ERVVEQSBHUkVDSUEueGxzeCIpICU+JSByZW5hbWUoQcOxbyA9IEZlY2hhLCBEZXVkYV9Tb2JyZV9QSUIgPSAiRGV1ZGEgKCVQSUIpIikgJT4lIHNlbGVjdChBw7FvLCBEZXVkYV9Tb2JyZV9QSUIpDQoNCmdyYWZpY29fZGV1ZGFfZ3JlY2lhIDwtIGRldWRhX2dyZWNpYSAlPiUgZ2dwbG90KGFlcyh4ID0gQcOxbywgeSA9IERldWRhX1NvYnJlX1BJQi8xMDAsIGdyb3VwID0gMSkpICsgZ2VvbV9saW5lKCkgKyB0aGVtZV9zb2xhcml6ZWQoKSArIGxhYnModGl0bGUgPSAiRGV1ZGEgZXh0ZXJuYSBncmllZ2Egc29icmUgZWwgUElCIiwgeCA9ICJBw7FvIiwgeSA9ICJQb3JjZW50YWplIGRlIGRldWRhIHNvYnJlIGVsIFBJQiIsIGNhcHRpb24gPSAiRGF0b3MgcHJvdmVuaWVudGVzIGRlIGRhdG9zbWFjcm8iKSArIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnQpICsgdHJhbnNpdGlvbl9yZXZlYWwoQcOxbykNCg0KYW5pbWF0ZShncmFmaWNvX2RldWRhX2dyZWNpYSwgbmZyYW1lcyA9IDYwLCBkdXJhdGlvbiA9IDMpDQpgYGANCg0KIyA0LiBDT05DTFVTScOTTg0KDQpQZXNlIGEgcXVlIGxhIGVjb25vbcOtYSBncmllZ2Egbm8gcGFzYSB1bmEgYnVlbmEgcmFjaGEgZGVzZGUgZWwgcGVyaW9kbyBhbnRlcmlvciBhIGxhIGNyaXNpcyBmaW5hbmNpZXJhIGRlIDIwMDcgeSBjb24gbGEgcHJlc2VudGUgY3Jpc2lzIHBvciBlbCBjb3JvbmF2aXJ1cywgcXVlIGhlbW9zIGNvbWVudGFkbyBkdXJhbnRlIGVsIHRyYWJham8sIEdyZWNpYSBzaWd1ZSBzaWVuZG8gdW5vIGRlIGxvcyBwYcOtc2VzIHByZWZlcmlkb3MgcG9yIGxvcyB0dXJpc3RhcyBwb3Igc3VzIG1hcmF2aWxsb3NvcyBsdWdhcmVzIHkgbm8gY2FiZSBkdWRhIHF1ZSBlbCB0dXJpc21vIHJlY3VwZXJhcsOhIHN1cyBuaXZlbGVzIGFudGVyaW9yZXMgYSBsYSBwYW5kZW1pYS4NCg0KRHVyYW50ZSBlbCB0cmFiYWpvIGhlbW9zIGNvbWVudGFkbyBsb3MgZGVzZXF1aWxpYnJpb3MgbWFjcm9lY29uw7NtaWNvcyBwb3IgY3VlbnRhIGNvcnJpZW50ZSB5IGRldWRhIHDDumJsaWNhIGRlIEdyZWNpYSwgYXVucXVlIHRhbWJpw6luIGhlbW9zIGNvbWVudGFkbyBjb3NhcyBwb3NpdGl2YXMgZGVyaXZhZGFzIGRlbCB0dXJpc21vIHkgbGEgZXZvbHVjacOzbiBkZSBlc3RlIHBvciBsYSBwYW5kZW1pYS4NCg0KDQojIDUuIEJJQkxJT0dSQUbDjUENCg0KTWUgaGUgYmFzYWRvIGVuIGFsZ3Vub3MgYXJ0w61jdWxvcyB5IHdlYnMgY29tbzoNCg0KW0VsIENvbmZpZGVuY2lhbC4gKDIwMjApLiBMYSBjcmlzaXMgZGVsIHR1cmlzbW8gcG9yIGVsIGNvdmlkIGxlIGN1ZXN0YSBtw6FzIGEgRXNwYcOxYSBxdWUgYSBGcmFuY2lhIGUgSXRhbGlhIGp1bnRhc10oaHR0cHM6Ly93d3cuZWxjb25maWRlbmNpYWwuY29tL2Vjb25vbWlhLzIwMjEtMDEtMTMvY3Jpc2lzLXR1cmlzbW8tY292aWQtY3Vlc3RhLWVzcGFuYS1tYXMtaXRhbGlhLWZyYW5jaWEtanVudGFzXzI4OTY0MTEvKQ0KDQpbVGhlIEVjb25vbWljIFRpbWVzLiAoMjAyMCkuIEdyZWVrIGVjb25vbXkgbWF5IGNvbnRyYWN0IDExJSBwZXJjZW50IGluIDIwMjAsIGNlbnRyYWwgYmFuayBzYXlzXShodHRwczovL2Vjb25vbWljdGltZXMuaW5kaWF0aW1lcy5jb20vbmV3cy9pbnRlcm5hdGlvbmFsL2J1c2luZXNzL2dyZWVrLWVjb25vbXktbWF5LWNvbnRyYWN0LTExLXBlcmNlbnQtaW4tMjAyMC1jZW50cmFsLWJhbmstc2F5cy9hcnRpY2xlc2hvdy83OTcyMjg3NS5jbXMpDQoNClsyMG1pbnV0b3MuICgyMDIwKS4gRXNwYcOxYSBzdWJlIGxvcyBpbXB1ZXN0b3MgZW4gcGxlbmEgcGFuZGVtaWEuLi4gbWllbnRyYXMgZWwgcmVzdG8gZGUgbG9zIHBhw61zZXMgZGUgRXVyb3BhIGxvcyBiYWphXShodHRwczovL3d3dy4yMG1pbnV0b3MuZXMvbm90aWNpYS80NDM0MTQ5LzAvZXNwYW5hLXN1YmUtbG9zLWltcHVlc3Rvcy1lbi1wbGVuYS1wYW5kZW1pYS1taWVudHJhcy1ldXJvcGEtbG9zLWJhamEteS1ncmVjaWEtZWxpbWluYS1lbC1pdmEvKQ0KDQpbRXhwYW5zaW9uLCBkYXRvc21hY3JvXShodHRwczovL2RhdG9zbWFjcm8uZXhwYW5zaW9uLmNvbS9wYWlzZXMvZ3JlY2lhKQ0KDQpbQmFuY28gTXVuZGlhbC4gKDIwMjApLiBHcmVjaWEgfCBEYXRhIC0gRGF0b3MgZGUgbGlicmUgYWNjZXNvIGRlbCBCYW5jbyBNdW5kaWFsXShodHRwczovL2RhdG9zLmJhbmNvbXVuZGlhbC5vcmcvcGFpcy9ncmVjaWEpDQoNCltLTk9FTUFdKGh0dHBzOi8va25vZW1hLmVzL2F0bGFzL0dyZWNpYS90b3BpY3MvRWNvbm9tJUMzJUFEYSkNCg0KW0dUUCBIZWFkbGluZXMgR3JlZWNlLiAoMjAyMCkuIFBhbmRlbWljIENvc3RzIEdyZWVjZSDigqwxNWJuIGluIFRvdXJpc20gUmV2ZW51ZXNdKGh0dHBzOi8vbmV3cy5ndHAuZ3IvMjAyMC8xMi8xNi9wYW5kZW1pYy1jb3N0cy1ncmVlY2UtZTE1Ym4taW4tdG91cmlzbS1yZXZlbnVlcy8pDQo=