#IMPORTANDO DATOS
library(readxl)
precios <- read_excel("C:/Users/luigg/Desktop/UDG/CUARTO CICLO/MODELACION/precios2.xlsx")
New names:
precios <- precios[,2:12]
cat("Se seleccionaron los siguientes activos:
        Tesla (TSLA) - Sector Tecnología & Automotriz: Tesla es una empresa líder en innovación en el sector automotriz y representa una oportunidad para captar el crecimiento en la transición energética.
        JP Morgan Chase (JPM) - Sector Financiero: Como uno de los bancos más grandes y diversificados de EE.UU., JPMorgan ofrece estabilidad y exposición a servicios financieros globales, adaptándose bien a los cambios económicos.
        Coca-Cola (KO) - Sector Consumo: Empresa de productos de consumo que históricamente ha demostrado estabilidad, es un activo defensivo que proporciona una fuente confiable de ingresos en momentos de alta volatilidad.
        Pfizer (PFE) - Sector Salud: Con gran inversión en investigación y desarrollo, Pfizer tiene un papel destacado en el contexto sanitario global y ofrece exposición a la industria de la salud.
        Prologis (PLD) - Sector Inmobiliario/Logístico: Como líder en propiedades industriales, su negocio se ha fortalecido con el auge del comercio electrónico, proporcionando estabilidad y crecimiento en el sector inmobiliario.
        Visa (V) - Sector Financiero & Tecnológico: Visa es líder en pagos electrónicos, lo cual es fundamental en una economía cada vez más digital, lo que hace que sea una opción atractiva para un portafolio balanceado.
        Goldman Sachs (GS) - Sector Financiero: Con una amplia gama de servicios financieros y de inversión, Goldman Sachs tiene capacidad de adaptación a ciclos económicos, brindando exposición a los mercados de capital.
        Chevron (CVX) - Sector Energético: Proporciona estabilidad en el sector energético, con posiciones en combustibles fósiles y una gradual transición hacia energías alternativas, lo que la hace resiliente ante la volatilidad de precios.
        Walmart (WMT) - Sector Consumo: Su presencia en el comercio minorista y en línea ofrece seguridad en periodos de recesión, y su enfoque en el comercio digital le permite adaptarse a nuevas tendencias de consumo.
        Intel (INTC) - Sector Tecnología & Semiconductores: La demanda creciente de semiconductores para la tecnología avanzada convierte a Intel en una pieza importante dentro de esta cartera, reflejando la relevancia de este sector en el futuro.
    
    
    El período de datos elegido, de enero de 2018 a diciembre de 2023, permite capturar el rendimiento de los activos a lo largo de distintas fases económicas, proporcionando una visión integral de su resiliencia y comportamiento. Este rango incluye el crecimiento económico previo a la pandemia de COVID-19, ofreciendo un punto de referencia en condiciones de estabilidad (2018-2019). A continuación, se considera el impacto de la pandemia (2020-2021), un contexto de crisis global que permite observar la capacidad de los activos para adaptarse en momentos de alta incertidumbre. Finalmente, el período abarca la recuperación económica y las tensiones inflacionarias posteriores (2022-2023), en las que las empresas enfrentaron alzas de tasas de interés y otros retos económicos. Este rango asegura una evaluación completa, destacando el desempeño de los activos en situaciones tanto de crecimiento como de crisis y recuperación.")
Se seleccionaron los siguientes activos:
        Tesla (TSLA) - Sector Tecnología & Automotriz: Tesla es una empresa líder en innovación en el sector automotriz y representa una oportunidad para captar el crecimiento en la transición energética.
        JP Morgan Chase (JPM) - Sector Financiero: Como uno de los bancos más grandes y diversificados de EE.UU., JPMorgan ofrece estabilidad y exposición a servicios financieros globales, adaptándose bien a los cambios económicos.
        Coca-Cola (KO) - Sector Consumo: Empresa de productos de consumo que históricamente ha demostrado estabilidad, es un activo defensivo que proporciona una fuente confiable de ingresos en momentos de alta volatilidad.
        Pfizer (PFE) - Sector Salud: Con gran inversión en investigación y desarrollo, Pfizer tiene un papel destacado en el contexto sanitario global y ofrece exposición a la industria de la salud.
        Prologis (PLD) - Sector Inmobiliario/Logístico: Como líder en propiedades industriales, su negocio se ha fortalecido con el auge del comercio electrónico, proporcionando estabilidad y crecimiento en el sector inmobiliario.
        Visa (V) - Sector Financiero & Tecnológico: Visa es líder en pagos electrónicos, lo cual es fundamental en una economía cada vez más digital, lo que hace que sea una opción atractiva para un portafolio balanceado.
        Goldman Sachs (GS) - Sector Financiero: Con una amplia gama de servicios financieros y de inversión, Goldman Sachs tiene capacidad de adaptación a ciclos económicos, brindando exposición a los mercados de capital.
        Chevron (CVX) - Sector Energético: Proporciona estabilidad en el sector energético, con posiciones en combustibles fósiles y una gradual transición hacia energías alternativas, lo que la hace resiliente ante la volatilidad de precios.
        Walmart (WMT) - Sector Consumo: Su presencia en el comercio minorista y en línea ofrece seguridad en periodos de recesión, y su enfoque en el comercio digital le permite adaptarse a nuevas tendencias de consumo.
        Intel (INTC) - Sector Tecnología & Semiconductores: La demanda creciente de semiconductores para la tecnología avanzada convierte a Intel en una pieza importante dentro de esta cartera, reflejando la relevancia de este sector en el futuro.
    
    
    El período de datos elegido, de enero de 2018 a diciembre de 2023, permite capturar el rendimiento de los activos a lo largo de distintas fases económicas, proporcionando una visión integral de su resiliencia y comportamiento. Este rango incluye el crecimiento económico previo a la pandemia de COVID-19, ofreciendo un punto de referencia en condiciones de estabilidad (2018-2019). A continuación, se considera el impacto de la pandemia (2020-2021), un contexto de crisis global que permite observar la capacidad de los activos para adaptarse en momentos de alta incertidumbre. Finalmente, el período abarca la recuperación económica y las tensiones inflacionarias posteriores (2022-2023), en las que las empresas enfrentaron alzas de tasas de interés y otros retos económicos. Este rango asegura una evaluación completa, destacando el desempeño de los activos en situaciones tanto de crecimiento como de crisis y recuperación.
#ANALISIS SOBRE NIVELES
chart.Correlation(precios)


estadisticos <- data.frame(
  Activo = colnames(precios),
  Media = apply(precios, 2, mean),
  Desviacion_Estandar = apply(precios, 2, sd),
  Asimetria = apply(precios, 2, skewness),
  Curtosis = apply(precios, 2, kurtosis)
)

jarque_bera_test <- apply(precios, 2, function(x) jarque.test(na.omit(x))$p.value)
estadisticos$Jarque_Bera_pvalor <- jarque_bera_test

print(estadisticos)

cat("

TSLA (Tesla):
Histograma: La distribución es ligeramente sesgada hacia la derecha, con una gran variabilidad en los precios.
Estadísticas: Alta desviación estándar (113.53), indicando alta volatilidad. La asimetría es positiva (0.17), y la curtosis es baja (1.60), lo que indica una distribución ligeramente aplanada.
Jarque-Bera: p-valor de 0, lo que sugiere que los precios no siguen una distribución normal.

JPM (JPMorgan Chase):
Histograma: Distribución relativamente concentrada y simétrica.
Estadísticas: Desviación estándar baja (21.38), indicando menor volatilidad. Asimetría levemente positiva (0.27) y curtosis baja (1.98), mostrando una distribución cerca de la normalidad.
Jarque-Bera: p-valor de 0, indicando no normalidad, aunque su distribución es cercana a la normal.

KO (Coca-Cola):
Histograma: Distribución simétrica, con menor dispersión de precios.
Estadísticas: Media de 53.63 con una desviación estándar baja (6.43), lo que indica estabilidad. Asimetría cercana a 0 (-0.01) y curtosis baja (1.85), sugiriendo una distribución simétrica y levemente aplanada.
Jarque-Bera: p-valor de 0, indicando no normalidad, aunque es casi simétrica.

PFE (Pfizer):
Histograma: Distribución levemente sesgada a la derecha, con una leve dispersión.
Estadísticas: Media de 39.81 y desviación estándar baja (6.48). Asimetría positiva (0.78) y curtosis moderada (2.99), indicando una cola derecha más larga.
Jarque-Bera: p-valor de 0, señalando no normalidad debido a la asimetría y cola derecha.

PLD (Prologis):
Histograma: Distribución simétrica y más dispersa.
Estadísticas: Media de 102.36 con desviación estándar moderada (27.90). Asimetría positiva (0.24) y curtosis de 2.24, cerca de la normalidad.
Jarque-Bera: p-valor cercano a 0, lo que indica no normalidad, aunque es casi simétrica.

V (Visa):
Histograma: Distribución ligeramente sesgada a la izquierda, con precios distribuidos en un rango amplio.
Estadísticas: Media de 192.84 y desviación estándar moderada (36.72). Asimetría negativa (-0.47) y curtosis de 2.15, sugiriendo una ligera concentración en el centro.
Jarque-Bera: p-valor de 0, lo que indica no normalidad por la leve asimetría izquierda.

GS (Goldman Sachs):
Histograma: Distribución simétrica, con una mayor dispersión en los precios.
Estadísticas: Media de 279.69 y desviación estándar relativamente alta (71.49), mostrando volatilidad. Asimetría positiva (0.13) y curtosis baja (1.66), indicando una distribución aplanada.
Jarque-Bera: p-valor de 0, indicando no normalidad.

CVX (Chevron):
Histograma: Distribución simétrica con dispersión moderada.
Estadísticas: Media de 125.15 y desviación estándar de 28.47. Asimetría positiva (0.24) y curtosis de 2.24, cercana a una distribución normal.
Jarque-Bera: p-valor cercano a 0, indicando no normalidad, aunque con baja asimetría.

WMT (Walmart):
Histograma: Distribución simétrica y concentrada en un rango estrecho.
Estadísticas: Media de 42.40 y baja desviación estándar (7.48), lo que indica estabilidad. Asimetría negativa (-0.38) y curtosis de 1.97, cercana a la normalidad.
Jarque-Bera: p-valor de 0, indicando no normalidad, pero la distribución es simétrica.

INTC (Intel):
Histograma: Distribución simétrica con dispersión moderada.
Estadísticas: Media de 47.29 y baja desviación estándar (10.06), indicando estabilidad. Asimetría negativa (-0.51) y curtosis de 2.49, lo que sugiere una concentración en el centro.
Jarque-Bera: p-valor de 0, indicando no normalidad.")


TSLA (Tesla):
Histograma: La distribución es ligeramente sesgada hacia la derecha, con una gran variabilidad en los precios.
Estadísticas: Alta desviación estándar (113.53), indicando alta volatilidad. La asimetría es positiva (0.17), y la curtosis es baja (1.60), lo que indica una distribución ligeramente aplanada.
Jarque-Bera: p-valor de 0, lo que sugiere que los precios no siguen una distribución normal.

JPM (JPMorgan Chase):
Histograma: Distribución relativamente concentrada y simétrica.
Estadísticas: Desviación estándar baja (21.38), indicando menor volatilidad. Asimetría levemente positiva (0.27) y curtosis baja (1.98), mostrando una distribución cerca de la normalidad.
Jarque-Bera: p-valor de 0, indicando no normalidad, aunque su distribución es cercana a la normal.

KO (Coca-Cola):
Histograma: Distribución simétrica, con menor dispersión de precios.
Estadísticas: Media de 53.63 con una desviación estándar baja (6.43), lo que indica estabilidad. Asimetría cercana a 0 (-0.01) y curtosis baja (1.85), sugiriendo una distribución simétrica y levemente aplanada.
Jarque-Bera: p-valor de 0, indicando no normalidad, aunque es casi simétrica.

PFE (Pfizer):
Histograma: Distribución levemente sesgada a la derecha, con una leve dispersión.
Estadísticas: Media de 39.81 y desviación estándar baja (6.48). Asimetría positiva (0.78) y curtosis moderada (2.99), indicando una cola derecha más larga.
Jarque-Bera: p-valor de 0, señalando no normalidad debido a la asimetría y cola derecha.

PLD (Prologis):
Histograma: Distribución simétrica y más dispersa.
Estadísticas: Media de 102.36 con desviación estándar moderada (27.90). Asimetría positiva (0.24) y curtosis de 2.24, cerca de la normalidad.
Jarque-Bera: p-valor cercano a 0, lo que indica no normalidad, aunque es casi simétrica.

V (Visa):
Histograma: Distribución ligeramente sesgada a la izquierda, con precios distribuidos en un rango amplio.
Estadísticas: Media de 192.84 y desviación estándar moderada (36.72). Asimetría negativa (-0.47) y curtosis de 2.15, sugiriendo una ligera concentración en el centro.
Jarque-Bera: p-valor de 0, lo que indica no normalidad por la leve asimetría izquierda.

GS (Goldman Sachs):
Histograma: Distribución simétrica, con una mayor dispersión en los precios.
Estadísticas: Media de 279.69 y desviación estándar relativamente alta (71.49), mostrando volatilidad. Asimetría positiva (0.13) y curtosis baja (1.66), indicando una distribución aplanada.
Jarque-Bera: p-valor de 0, indicando no normalidad.

CVX (Chevron):
Histograma: Distribución simétrica con dispersión moderada.
Estadísticas: Media de 125.15 y desviación estándar de 28.47. Asimetría positiva (0.24) y curtosis de 2.24, cercana a una distribución normal.
Jarque-Bera: p-valor cercano a 0, indicando no normalidad, aunque con baja asimetría.

WMT (Walmart):
Histograma: Distribución simétrica y concentrada en un rango estrecho.
Estadísticas: Media de 42.40 y baja desviación estándar (7.48), lo que indica estabilidad. Asimetría negativa (-0.38) y curtosis de 1.97, cercana a la normalidad.
Jarque-Bera: p-valor de 0, indicando no normalidad, pero la distribución es simétrica.

INTC (Intel):
Histograma: Distribución simétrica con dispersión moderada.
Estadísticas: Media de 47.29 y baja desviación estándar (10.06), indicando estabilidad. Asimetría negativa (-0.51) y curtosis de 2.49, lo que sugiere una concentración en el centro.
Jarque-Bera: p-valor de 0, indicando no normalidad.
#ANALISIS SOBRE PRIMERAS DIFERENCIAS
precios <- na.omit(precios)
diferencias <- diff(as.matrix(precios)) 

par(mfrow = c(2, 5))
for (i in 1:ncol(diferencias)) {
  hist(diferencias[, i], main = colnames(diferencias)[i], xlab = "Diferencias", ylab = "Frecuencia", breaks = 20)
}


estadisticos2 <- data.frame(
  Activo = colnames(diferencias),
  Media = apply(diferencias, 2, mean),
  Desviacion_Estandar = apply(diferencias, 2, sd),
  Asimetria = apply(diferencias, 2, skewness),
  Curtosis = apply(diferencias, 2, kurtosis)
)

jarque_bera_test2 <- apply(diferencias, 2, function(x) jarque.test(na.omit(x))$p.value)
estadisticos2$Jarque_Bera_pvalor <- jarque_bera_test2

print(estadisticos2)

cat("
TSLA (Tesla):
Histograma: La distribución muestra una alta concentración alrededor de la media, con algunos valores extremos.
Estadísticas: Media de 0.15 y desviación estándar alta (6.99), indicando una considerable volatilidad en los cambios de precios. La asimetría es negativa (-0.15) y la curtosis alta (9.96), lo que indica una distribución leptocúrtica con colas gruesas.
Jarque-Bera: p-valor de 0, lo que sugiere que la serie no sigue una distribución normal debido a los valores extremos.

JPM (JPMorgan Chase):
Histograma: Distribución simétrica y menos dispersa, con cambios más concentrados alrededor de la media.
Estadísticas: Media de 0.04 y baja desviación estándar (2.19), lo que indica menor volatilidad en los cambios de precios. La asimetría es cercana a cero (-0.09) y la curtosis es alta (10.00), indicando colas gruesas.
Jarque-Bera: p-valor de 0, indicando no normalidad debido a la curtosis elevada.

KO (Coca-Cola):
Histograma: Distribución sesgada a la izquierda, con algunos valores extremos.
Estadísticas: Media de 0.008 y desviación estándar baja (0.67), sugiriendo estabilidad en los cambios de precios. Asimetría negativa (-0.88) y alta curtosis (10.95), lo cual refleja una fuerte concentración de cambios cerca de la media y colas pronunciadas.
Jarque-Bera: p-valor de 0, lo que indica no normalidad debido a la asimetría y curtosis elevadas.

PFE (Pfizer):
Histograma: Distribución levemente sesgada hacia la derecha.
Estadísticas: Media de -0.0038, lo que sugiere una ligera tendencia negativa en el cambio de precios. Desviación estándar baja (0.66), asimetría positiva (0.26) y moderada curtosis (7.26), mostrando colas moderadamente gruesas.
Jarque-Bera: p-valor de 0, lo que indica no normalidad debido a la curtosis.

PLD (Prologis):
Histograma: Distribución sesgada a la izquierda con dispersión moderada.
Estadísticas: Media de 0.045 y desviación estándar de 1.90, lo cual indica cambios moderados. Asimetría negativa (-0.56) y curtosis elevada (8.58), lo que sugiere una distribución con colas gruesas.
Jarque-Bera: p-valor de 0, indicando no normalidad debido a las colas gruesas.

V (Visa):
Histograma: Distribución simétrica con dispersión en torno a la media.
Estadísticas: Media de 0.097 y desviación estándar moderada (3.21), lo que indica fluctuaciones moderadas en los cambios de precios. La asimetría es cercana a cero (-0.08) y la curtosis es alta (9.60), lo que implica colas gruesas.
Jarque-Bera: p-valor de 0, indicando no normalidad.

GS (Goldman Sachs):
Histograma: Distribución simétrica con valores dispersos.
Estadísticas: Media de 0.086 y desviación estándar alta (5.08), lo que sugiere una mayor volatilidad. Asimetría negativa (-0.13) y curtosis elevada (5.63), lo que indica colas gruesas.
Jarque-Bera: p-valor de 0, indicando no normalidad debido a la curtosis.

CVX (Chevron):
Histograma: Distribución simétrica y más dispersa.
Estadísticas: Media de 0.014 y desviación estándar de 2.36, con asimetría negativa (-0.49) y alta curtosis (8.54), lo que indica una fuerte concentración alrededor de la media y colas pronunciadas.
Jarque-Bera: p-valor de 0, indicando no normalidad.

WMT (Walmart):
Histograma: Distribución simétrica y concentrada.
Estadísticas: Media de 0.013 y baja desviación estándar (0.58), mostrando estabilidad. Asimetría negativa (-0.78) y alta curtosis (17.98), sugiriendo una distribución altamente leptocúrtica con colas extremas.
Jarque-Bera: p-valor de 0, indicando no normalidad debido a la curtosis extrema.

INTC (Intel):
Histograma: Distribución simétrica con dispersión moderada.
Estadísticas: Media de 0.002 y baja desviación estándar (1.15), indicando cambios leves. Asimetría negativa (-0.77) y curtosis alta (15.55), lo que implica una fuerte concentración y colas gruesas.
Jarque-Bera: p-valor de 0, indicando no normalidad.")

TSLA (Tesla):
Histograma: La distribución muestra una alta concentración alrededor de la media, con algunos valores extremos.
Estadísticas: Media de 0.15 y desviación estándar alta (6.99), indicando una considerable volatilidad en los cambios de precios. La asimetría es negativa (-0.15) y la curtosis alta (9.96), lo que indica una distribución leptocúrtica con colas gruesas.
Jarque-Bera: p-valor de 0, lo que sugiere que la serie no sigue una distribución normal debido a los valores extremos.

JPM (JPMorgan Chase):
Histograma: Distribución simétrica y menos dispersa, con cambios más concentrados alrededor de la media.
Estadísticas: Media de 0.04 y baja desviación estándar (2.19), lo que indica menor volatilidad en los cambios de precios. La asimetría es cercana a cero (-0.09) y la curtosis es alta (10.00), indicando colas gruesas.
Jarque-Bera: p-valor de 0, indicando no normalidad debido a la curtosis elevada.

KO (Coca-Cola):
Histograma: Distribución sesgada a la izquierda, con algunos valores extremos.
Estadísticas: Media de 0.008 y desviación estándar baja (0.67), sugiriendo estabilidad en los cambios de precios. Asimetría negativa (-0.88) y alta curtosis (10.95), lo cual refleja una fuerte concentración de cambios cerca de la media y colas pronunciadas.
Jarque-Bera: p-valor de 0, lo que indica no normalidad debido a la asimetría y curtosis elevadas.

PFE (Pfizer):
Histograma: Distribución levemente sesgada hacia la derecha.
Estadísticas: Media de -0.0038, lo que sugiere una ligera tendencia negativa en el cambio de precios. Desviación estándar baja (0.66), asimetría positiva (0.26) y moderada curtosis (7.26), mostrando colas moderadamente gruesas.
Jarque-Bera: p-valor de 0, lo que indica no normalidad debido a la curtosis.

PLD (Prologis):
Histograma: Distribución sesgada a la izquierda con dispersión moderada.
Estadísticas: Media de 0.045 y desviación estándar de 1.90, lo cual indica cambios moderados. Asimetría negativa (-0.56) y curtosis elevada (8.58), lo que sugiere una distribución con colas gruesas.
Jarque-Bera: p-valor de 0, indicando no normalidad debido a las colas gruesas.

V (Visa):
Histograma: Distribución simétrica con dispersión en torno a la media.
Estadísticas: Media de 0.097 y desviación estándar moderada (3.21), lo que indica fluctuaciones moderadas en los cambios de precios. La asimetría es cercana a cero (-0.08) y la curtosis es alta (9.60), lo que implica colas gruesas.
Jarque-Bera: p-valor de 0, indicando no normalidad.

GS (Goldman Sachs):
Histograma: Distribución simétrica con valores dispersos.
Estadísticas: Media de 0.086 y desviación estándar alta (5.08), lo que sugiere una mayor volatilidad. Asimetría negativa (-0.13) y curtosis elevada (5.63), lo que indica colas gruesas.
Jarque-Bera: p-valor de 0, indicando no normalidad debido a la curtosis.

CVX (Chevron):
Histograma: Distribución simétrica y más dispersa.
Estadísticas: Media de 0.014 y desviación estándar de 2.36, con asimetría negativa (-0.49) y alta curtosis (8.54), lo que indica una fuerte concentración alrededor de la media y colas pronunciadas.
Jarque-Bera: p-valor de 0, indicando no normalidad.

WMT (Walmart):
Histograma: Distribución simétrica y concentrada.
Estadísticas: Media de 0.013 y baja desviación estándar (0.58), mostrando estabilidad. Asimetría negativa (-0.78) y alta curtosis (17.98), sugiriendo una distribución altamente leptocúrtica con colas extremas.
Jarque-Bera: p-valor de 0, indicando no normalidad debido a la curtosis extrema.

INTC (Intel):
Histograma: Distribución simétrica con dispersión moderada.
Estadísticas: Media de 0.002 y baja desviación estándar (1.15), indicando cambios leves. Asimetría negativa (-0.77) y curtosis alta (15.55), lo que implica una fuerte concentración y colas gruesas.
Jarque-Bera: p-valor de 0, indicando no normalidad.
LS0tDQp0aXRsZTogIlRhcmVhIE1vZGVsYWNpw7NuIEZpbmFuY2llcmEgXyBTZXNpw7NuIDE2LzExLzIwMjQiDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQpgYGB7cn0NCiNJTlNUQUxBTkRPIFkgQUNUSVZBTkRPIExJQlJFUklBUw0KaW5zdGFsbC5wYWNrYWdlcygidGlkeXZlcnNlIikNCmluc3RhbGwucGFja2FnZXMoInRpZHlxdWFudCIpDQppbnN0YWxsLnBhY2thZ2VzKCJxcm10b29scyIpDQppbnN0YWxsLnBhY2thZ2VzKCJxdWFudG1vZCIpDQppbnN0YWxsLnBhY2thZ2VzKCJtb21lbnRzIikNCmxpYnJhcnkocXJtdG9vbHMpDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkodGlkeXF1YW50KQ0KaW5zdGFsbC5wYWNrYWdlcygidHNlcmllcyIpDQpsaWJyYXJ5KHRzZXJpZXMpDQppbnN0YWxsLnBhY2thZ2VzKCJQZXJmb3JtYW5jZUFuYWx5dGljcyIpDQpsaWJyYXJ5KHF1YW50bW9kKQ0KbGlicmFyeShQZXJmb3JtYW5jZUFuYWx5dGljcykNCmxpYnJhcnkobW9tZW50cykNCmBgYA0KDQpgYGB7cn0NCiNJTVBPUlRBTkRPIERBVE9TDQpsaWJyYXJ5KHJlYWR4bCkNCnByZWNpb3MgPC0gcmVhZF9leGNlbCgiQzovVXNlcnMvbHVpZ2cvRGVza3RvcC9VREcvQ1VBUlRPIENJQ0xPL01PREVMQUNJT04vcHJlY2lvczIueGxzeCIpDQpwcmVjaW9zIDwtIHByZWNpb3NbLDI6MTJdDQpjYXQoIlNlIHNlbGVjY2lvbmFyb24gbG9zIHNpZ3VpZW50ZXMgYWN0aXZvczoNCiAgICAgICAgVGVzbGEgKFRTTEEpIC0gU2VjdG9yIFRlY25vbG9nw61hICYgQXV0b21vdHJpejogVGVzbGEgZXMgdW5hIGVtcHJlc2EgbMOtZGVyIGVuIGlubm92YWNpw7NuIGVuIGVsIHNlY3RvciBhdXRvbW90cml6IHkgcmVwcmVzZW50YSB1bmEgb3BvcnR1bmlkYWQgcGFyYSBjYXB0YXIgZWwgY3JlY2ltaWVudG8gZW4gbGEgdHJhbnNpY2nDs24gZW5lcmfDqXRpY2EuDQogICAgICAgIEpQIE1vcmdhbiBDaGFzZSAoSlBNKSAtIFNlY3RvciBGaW5hbmNpZXJvOiBDb21vIHVubyBkZSBsb3MgYmFuY29zIG3DoXMgZ3JhbmRlcyB5IGRpdmVyc2lmaWNhZG9zIGRlIEVFLlVVLiwgSlBNb3JnYW4gb2ZyZWNlIGVzdGFiaWxpZGFkIHkgZXhwb3NpY2nDs24gYSBzZXJ2aWNpb3MgZmluYW5jaWVyb3MgZ2xvYmFsZXMsIGFkYXB0w6FuZG9zZSBiaWVuIGEgbG9zIGNhbWJpb3MgZWNvbsOzbWljb3MuDQogICAgICAgIENvY2EtQ29sYSAoS08pIC0gU2VjdG9yIENvbnN1bW86IEVtcHJlc2EgZGUgcHJvZHVjdG9zIGRlIGNvbnN1bW8gcXVlIGhpc3TDs3JpY2FtZW50ZSBoYSBkZW1vc3RyYWRvIGVzdGFiaWxpZGFkLCBlcyB1biBhY3Rpdm8gZGVmZW5zaXZvIHF1ZSBwcm9wb3JjaW9uYSB1bmEgZnVlbnRlIGNvbmZpYWJsZSBkZSBpbmdyZXNvcyBlbiBtb21lbnRvcyBkZSBhbHRhIHZvbGF0aWxpZGFkLg0KICAgICAgICBQZml6ZXIgKFBGRSkgLSBTZWN0b3IgU2FsdWQ6IENvbiBncmFuIGludmVyc2nDs24gZW4gaW52ZXN0aWdhY2nDs24geSBkZXNhcnJvbGxvLCBQZml6ZXIgdGllbmUgdW4gcGFwZWwgZGVzdGFjYWRvIGVuIGVsIGNvbnRleHRvIHNhbml0YXJpbyBnbG9iYWwgeSBvZnJlY2UgZXhwb3NpY2nDs24gYSBsYSBpbmR1c3RyaWEgZGUgbGEgc2FsdWQuDQogICAgICAgIFByb2xvZ2lzIChQTEQpIC0gU2VjdG9yIElubW9iaWxpYXJpby9Mb2fDrXN0aWNvOiBDb21vIGzDrWRlciBlbiBwcm9waWVkYWRlcyBpbmR1c3RyaWFsZXMsIHN1IG5lZ29jaW8gc2UgaGEgZm9ydGFsZWNpZG8gY29uIGVsIGF1Z2UgZGVsIGNvbWVyY2lvIGVsZWN0csOzbmljbywgcHJvcG9yY2lvbmFuZG8gZXN0YWJpbGlkYWQgeSBjcmVjaW1pZW50byBlbiBlbCBzZWN0b3IgaW5tb2JpbGlhcmlvLg0KICAgICAgICBWaXNhIChWKSAtIFNlY3RvciBGaW5hbmNpZXJvICYgVGVjbm9sw7NnaWNvOiBWaXNhIGVzIGzDrWRlciBlbiBwYWdvcyBlbGVjdHLDs25pY29zLCBsbyBjdWFsIGVzIGZ1bmRhbWVudGFsIGVuIHVuYSBlY29ub23DrWEgY2FkYSB2ZXogbcOhcyBkaWdpdGFsLCBsbyBxdWUgaGFjZSBxdWUgc2VhIHVuYSBvcGNpw7NuIGF0cmFjdGl2YSBwYXJhIHVuIHBvcnRhZm9saW8gYmFsYW5jZWFkby4NCiAgICAgICAgR29sZG1hbiBTYWNocyAoR1MpIC0gU2VjdG9yIEZpbmFuY2llcm86IENvbiB1bmEgYW1wbGlhIGdhbWEgZGUgc2VydmljaW9zIGZpbmFuY2llcm9zIHkgZGUgaW52ZXJzacOzbiwgR29sZG1hbiBTYWNocyB0aWVuZSBjYXBhY2lkYWQgZGUgYWRhcHRhY2nDs24gYSBjaWNsb3MgZWNvbsOzbWljb3MsIGJyaW5kYW5kbyBleHBvc2ljacOzbiBhIGxvcyBtZXJjYWRvcyBkZSBjYXBpdGFsLg0KICAgICAgICBDaGV2cm9uIChDVlgpIC0gU2VjdG9yIEVuZXJnw6l0aWNvOiBQcm9wb3JjaW9uYSBlc3RhYmlsaWRhZCBlbiBlbCBzZWN0b3IgZW5lcmfDqXRpY28sIGNvbiBwb3NpY2lvbmVzIGVuIGNvbWJ1c3RpYmxlcyBmw7NzaWxlcyB5IHVuYSBncmFkdWFsIHRyYW5zaWNpw7NuIGhhY2lhIGVuZXJnw61hcyBhbHRlcm5hdGl2YXMsIGxvIHF1ZSBsYSBoYWNlIHJlc2lsaWVudGUgYW50ZSBsYSB2b2xhdGlsaWRhZCBkZSBwcmVjaW9zLg0KICAgICAgICBXYWxtYXJ0IChXTVQpIC0gU2VjdG9yIENvbnN1bW86IFN1IHByZXNlbmNpYSBlbiBlbCBjb21lcmNpbyBtaW5vcmlzdGEgeSBlbiBsw61uZWEgb2ZyZWNlIHNlZ3VyaWRhZCBlbiBwZXJpb2RvcyBkZSByZWNlc2nDs24sIHkgc3UgZW5mb3F1ZSBlbiBlbCBjb21lcmNpbyBkaWdpdGFsIGxlIHBlcm1pdGUgYWRhcHRhcnNlIGEgbnVldmFzIHRlbmRlbmNpYXMgZGUgY29uc3Vtby4NCiAgICAgICAgSW50ZWwgKElOVEMpIC0gU2VjdG9yIFRlY25vbG9nw61hICYgU2VtaWNvbmR1Y3RvcmVzOiBMYSBkZW1hbmRhIGNyZWNpZW50ZSBkZSBzZW1pY29uZHVjdG9yZXMgcGFyYSBsYSB0ZWNub2xvZ8OtYSBhdmFuemFkYSBjb252aWVydGUgYSBJbnRlbCBlbiB1bmEgcGllemEgaW1wb3J0YW50ZSBkZW50cm8gZGUgZXN0YSBjYXJ0ZXJhLCByZWZsZWphbmRvIGxhIHJlbGV2YW5jaWEgZGUgZXN0ZSBzZWN0b3IgZW4gZWwgZnV0dXJvLg0KICAgIA0KICAgIA0KICAgIEVsIHBlcsOtb2RvIGRlIGRhdG9zIGVsZWdpZG8sIGRlIGVuZXJvIGRlIDIwMTggYSBkaWNpZW1icmUgZGUgMjAyMywgcGVybWl0ZSBjYXB0dXJhciBlbCByZW5kaW1pZW50byBkZSBsb3MgYWN0aXZvcyBhIGxvIGxhcmdvIGRlIGRpc3RpbnRhcyBmYXNlcyBlY29uw7NtaWNhcywgcHJvcG9yY2lvbmFuZG8gdW5hIHZpc2nDs24gaW50ZWdyYWwgZGUgc3UgcmVzaWxpZW5jaWEgeSBjb21wb3J0YW1pZW50by4gRXN0ZSByYW5nbyBpbmNsdXllIGVsIGNyZWNpbWllbnRvIGVjb27Ds21pY28gcHJldmlvIGEgbGEgcGFuZGVtaWEgZGUgQ09WSUQtMTksIG9mcmVjaWVuZG8gdW4gcHVudG8gZGUgcmVmZXJlbmNpYSBlbiBjb25kaWNpb25lcyBkZSBlc3RhYmlsaWRhZCAoMjAxOC0yMDE5KS4gQSBjb250aW51YWNpw7NuLCBzZSBjb25zaWRlcmEgZWwgaW1wYWN0byBkZSBsYSBwYW5kZW1pYSAoMjAyMC0yMDIxKSwgdW4gY29udGV4dG8gZGUgY3Jpc2lzIGdsb2JhbCBxdWUgcGVybWl0ZSBvYnNlcnZhciBsYSBjYXBhY2lkYWQgZGUgbG9zIGFjdGl2b3MgcGFyYSBhZGFwdGFyc2UgZW4gbW9tZW50b3MgZGUgYWx0YSBpbmNlcnRpZHVtYnJlLiBGaW5hbG1lbnRlLCBlbCBwZXLDrW9kbyBhYmFyY2EgbGEgcmVjdXBlcmFjacOzbiBlY29uw7NtaWNhIHkgbGFzIHRlbnNpb25lcyBpbmZsYWNpb25hcmlhcyBwb3N0ZXJpb3JlcyAoMjAyMi0yMDIzKSwgZW4gbGFzIHF1ZSBsYXMgZW1wcmVzYXMgZW5mcmVudGFyb24gYWx6YXMgZGUgdGFzYXMgZGUgaW50ZXLDqXMgeSBvdHJvcyByZXRvcyBlY29uw7NtaWNvcy4gRXN0ZSByYW5nbyBhc2VndXJhIHVuYSBldmFsdWFjacOzbiBjb21wbGV0YSwgZGVzdGFjYW5kbyBlbCBkZXNlbXBlw7FvIGRlIGxvcyBhY3Rpdm9zIGVuIHNpdHVhY2lvbmVzIHRhbnRvIGRlIGNyZWNpbWllbnRvIGNvbW8gZGUgY3Jpc2lzIHkgcmVjdXBlcmFjacOzbi4iKQ0KYGBgDQoNCmBgYHtyfQ0KI0FOQUxJU0lTIFNPQlJFIE5JVkVMRVMNCmNoYXJ0LkNvcnJlbGF0aW9uKHByZWNpb3MpDQoNCmVzdGFkaXN0aWNvcyA8LSBkYXRhLmZyYW1lKA0KICBBY3Rpdm8gPSBjb2xuYW1lcyhwcmVjaW9zKSwNCiAgTWVkaWEgPSBhcHBseShwcmVjaW9zLCAyLCBtZWFuKSwNCiAgRGVzdmlhY2lvbl9Fc3RhbmRhciA9IGFwcGx5KHByZWNpb3MsIDIsIHNkKSwNCiAgQXNpbWV0cmlhID0gYXBwbHkocHJlY2lvcywgMiwgc2tld25lc3MpLA0KICBDdXJ0b3NpcyA9IGFwcGx5KHByZWNpb3MsIDIsIGt1cnRvc2lzKQ0KKQ0KDQpqYXJxdWVfYmVyYV90ZXN0IDwtIGFwcGx5KHByZWNpb3MsIDIsIGZ1bmN0aW9uKHgpIGphcnF1ZS50ZXN0KG5hLm9taXQoeCkpJHAudmFsdWUpDQplc3RhZGlzdGljb3MkSmFycXVlX0JlcmFfcHZhbG9yIDwtIGphcnF1ZV9iZXJhX3Rlc3QNCg0KcHJpbnQoZXN0YWRpc3RpY29zKQ0KDQpjYXQoIg0KDQpUU0xBIChUZXNsYSk6DQpIaXN0b2dyYW1hOiBMYSBkaXN0cmlidWNpw7NuIGVzIGxpZ2VyYW1lbnRlIHNlc2dhZGEgaGFjaWEgbGEgZGVyZWNoYSwgY29uIHVuYSBncmFuIHZhcmlhYmlsaWRhZCBlbiBsb3MgcHJlY2lvcy4NCkVzdGFkw61zdGljYXM6IEFsdGEgZGVzdmlhY2nDs24gZXN0w6FuZGFyICgxMTMuNTMpLCBpbmRpY2FuZG8gYWx0YSB2b2xhdGlsaWRhZC4gTGEgYXNpbWV0csOtYSBlcyBwb3NpdGl2YSAoMC4xNyksIHkgbGEgY3VydG9zaXMgZXMgYmFqYSAoMS42MCksIGxvIHF1ZSBpbmRpY2EgdW5hIGRpc3RyaWJ1Y2nDs24gbGlnZXJhbWVudGUgYXBsYW5hZGEuDQpKYXJxdWUtQmVyYTogcC12YWxvciBkZSAwLCBsbyBxdWUgc3VnaWVyZSBxdWUgbG9zIHByZWNpb3Mgbm8gc2lndWVuIHVuYSBkaXN0cmlidWNpw7NuIG5vcm1hbC4NCg0KSlBNIChKUE1vcmdhbiBDaGFzZSk6DQpIaXN0b2dyYW1hOiBEaXN0cmlidWNpw7NuIHJlbGF0aXZhbWVudGUgY29uY2VudHJhZGEgeSBzaW3DqXRyaWNhLg0KRXN0YWTDrXN0aWNhczogRGVzdmlhY2nDs24gZXN0w6FuZGFyIGJhamEgKDIxLjM4KSwgaW5kaWNhbmRvIG1lbm9yIHZvbGF0aWxpZGFkLiBBc2ltZXRyw61hIGxldmVtZW50ZSBwb3NpdGl2YSAoMC4yNykgeSBjdXJ0b3NpcyBiYWphICgxLjk4KSwgbW9zdHJhbmRvIHVuYSBkaXN0cmlidWNpw7NuIGNlcmNhIGRlIGxhIG5vcm1hbGlkYWQuDQpKYXJxdWUtQmVyYTogcC12YWxvciBkZSAwLCBpbmRpY2FuZG8gbm8gbm9ybWFsaWRhZCwgYXVucXVlIHN1IGRpc3RyaWJ1Y2nDs24gZXMgY2VyY2FuYSBhIGxhIG5vcm1hbC4NCg0KS08gKENvY2EtQ29sYSk6DQpIaXN0b2dyYW1hOiBEaXN0cmlidWNpw7NuIHNpbcOpdHJpY2EsIGNvbiBtZW5vciBkaXNwZXJzacOzbiBkZSBwcmVjaW9zLg0KRXN0YWTDrXN0aWNhczogTWVkaWEgZGUgNTMuNjMgY29uIHVuYSBkZXN2aWFjacOzbiBlc3TDoW5kYXIgYmFqYSAoNi40MyksIGxvIHF1ZSBpbmRpY2EgZXN0YWJpbGlkYWQuIEFzaW1ldHLDrWEgY2VyY2FuYSBhIDAgKC0wLjAxKSB5IGN1cnRvc2lzIGJhamEgKDEuODUpLCBzdWdpcmllbmRvIHVuYSBkaXN0cmlidWNpw7NuIHNpbcOpdHJpY2EgeSBsZXZlbWVudGUgYXBsYW5hZGEuDQpKYXJxdWUtQmVyYTogcC12YWxvciBkZSAwLCBpbmRpY2FuZG8gbm8gbm9ybWFsaWRhZCwgYXVucXVlIGVzIGNhc2kgc2ltw6l0cmljYS4NCg0KUEZFIChQZml6ZXIpOg0KSGlzdG9ncmFtYTogRGlzdHJpYnVjacOzbiBsZXZlbWVudGUgc2VzZ2FkYSBhIGxhIGRlcmVjaGEsIGNvbiB1bmEgbGV2ZSBkaXNwZXJzacOzbi4NCkVzdGFkw61zdGljYXM6IE1lZGlhIGRlIDM5LjgxIHkgZGVzdmlhY2nDs24gZXN0w6FuZGFyIGJhamEgKDYuNDgpLiBBc2ltZXRyw61hIHBvc2l0aXZhICgwLjc4KSB5IGN1cnRvc2lzIG1vZGVyYWRhICgyLjk5KSwgaW5kaWNhbmRvIHVuYSBjb2xhIGRlcmVjaGEgbcOhcyBsYXJnYS4NCkphcnF1ZS1CZXJhOiBwLXZhbG9yIGRlIDAsIHNlw7FhbGFuZG8gbm8gbm9ybWFsaWRhZCBkZWJpZG8gYSBsYSBhc2ltZXRyw61hIHkgY29sYSBkZXJlY2hhLg0KDQpQTEQgKFByb2xvZ2lzKToNCkhpc3RvZ3JhbWE6IERpc3RyaWJ1Y2nDs24gc2ltw6l0cmljYSB5IG3DoXMgZGlzcGVyc2EuDQpFc3RhZMOtc3RpY2FzOiBNZWRpYSBkZSAxMDIuMzYgY29uIGRlc3ZpYWNpw7NuIGVzdMOhbmRhciBtb2RlcmFkYSAoMjcuOTApLiBBc2ltZXRyw61hIHBvc2l0aXZhICgwLjI0KSB5IGN1cnRvc2lzIGRlIDIuMjQsIGNlcmNhIGRlIGxhIG5vcm1hbGlkYWQuDQpKYXJxdWUtQmVyYTogcC12YWxvciBjZXJjYW5vIGEgMCwgbG8gcXVlIGluZGljYSBubyBub3JtYWxpZGFkLCBhdW5xdWUgZXMgY2FzaSBzaW3DqXRyaWNhLg0KDQpWIChWaXNhKToNCkhpc3RvZ3JhbWE6IERpc3RyaWJ1Y2nDs24gbGlnZXJhbWVudGUgc2VzZ2FkYSBhIGxhIGl6cXVpZXJkYSwgY29uIHByZWNpb3MgZGlzdHJpYnVpZG9zIGVuIHVuIHJhbmdvIGFtcGxpby4NCkVzdGFkw61zdGljYXM6IE1lZGlhIGRlIDE5Mi44NCB5IGRlc3ZpYWNpw7NuIGVzdMOhbmRhciBtb2RlcmFkYSAoMzYuNzIpLiBBc2ltZXRyw61hIG5lZ2F0aXZhICgtMC40NykgeSBjdXJ0b3NpcyBkZSAyLjE1LCBzdWdpcmllbmRvIHVuYSBsaWdlcmEgY29uY2VudHJhY2nDs24gZW4gZWwgY2VudHJvLg0KSmFycXVlLUJlcmE6IHAtdmFsb3IgZGUgMCwgbG8gcXVlIGluZGljYSBubyBub3JtYWxpZGFkIHBvciBsYSBsZXZlIGFzaW1ldHLDrWEgaXpxdWllcmRhLg0KDQpHUyAoR29sZG1hbiBTYWNocyk6DQpIaXN0b2dyYW1hOiBEaXN0cmlidWNpw7NuIHNpbcOpdHJpY2EsIGNvbiB1bmEgbWF5b3IgZGlzcGVyc2nDs24gZW4gbG9zIHByZWNpb3MuDQpFc3RhZMOtc3RpY2FzOiBNZWRpYSBkZSAyNzkuNjkgeSBkZXN2aWFjacOzbiBlc3TDoW5kYXIgcmVsYXRpdmFtZW50ZSBhbHRhICg3MS40OSksIG1vc3RyYW5kbyB2b2xhdGlsaWRhZC4gQXNpbWV0csOtYSBwb3NpdGl2YSAoMC4xMykgeSBjdXJ0b3NpcyBiYWphICgxLjY2KSwgaW5kaWNhbmRvIHVuYSBkaXN0cmlidWNpw7NuIGFwbGFuYWRhLg0KSmFycXVlLUJlcmE6IHAtdmFsb3IgZGUgMCwgaW5kaWNhbmRvIG5vIG5vcm1hbGlkYWQuDQoNCkNWWCAoQ2hldnJvbik6DQpIaXN0b2dyYW1hOiBEaXN0cmlidWNpw7NuIHNpbcOpdHJpY2EgY29uIGRpc3BlcnNpw7NuIG1vZGVyYWRhLg0KRXN0YWTDrXN0aWNhczogTWVkaWEgZGUgMTI1LjE1IHkgZGVzdmlhY2nDs24gZXN0w6FuZGFyIGRlIDI4LjQ3LiBBc2ltZXRyw61hIHBvc2l0aXZhICgwLjI0KSB5IGN1cnRvc2lzIGRlIDIuMjQsIGNlcmNhbmEgYSB1bmEgZGlzdHJpYnVjacOzbiBub3JtYWwuDQpKYXJxdWUtQmVyYTogcC12YWxvciBjZXJjYW5vIGEgMCwgaW5kaWNhbmRvIG5vIG5vcm1hbGlkYWQsIGF1bnF1ZSBjb24gYmFqYSBhc2ltZXRyw61hLg0KDQpXTVQgKFdhbG1hcnQpOg0KSGlzdG9ncmFtYTogRGlzdHJpYnVjacOzbiBzaW3DqXRyaWNhIHkgY29uY2VudHJhZGEgZW4gdW4gcmFuZ28gZXN0cmVjaG8uDQpFc3RhZMOtc3RpY2FzOiBNZWRpYSBkZSA0Mi40MCB5IGJhamEgZGVzdmlhY2nDs24gZXN0w6FuZGFyICg3LjQ4KSwgbG8gcXVlIGluZGljYSBlc3RhYmlsaWRhZC4gQXNpbWV0csOtYSBuZWdhdGl2YSAoLTAuMzgpIHkgY3VydG9zaXMgZGUgMS45NywgY2VyY2FuYSBhIGxhIG5vcm1hbGlkYWQuDQpKYXJxdWUtQmVyYTogcC12YWxvciBkZSAwLCBpbmRpY2FuZG8gbm8gbm9ybWFsaWRhZCwgcGVybyBsYSBkaXN0cmlidWNpw7NuIGVzIHNpbcOpdHJpY2EuDQoNCklOVEMgKEludGVsKToNCkhpc3RvZ3JhbWE6IERpc3RyaWJ1Y2nDs24gc2ltw6l0cmljYSBjb24gZGlzcGVyc2nDs24gbW9kZXJhZGEuDQpFc3RhZMOtc3RpY2FzOiBNZWRpYSBkZSA0Ny4yOSB5IGJhamEgZGVzdmlhY2nDs24gZXN0w6FuZGFyICgxMC4wNiksIGluZGljYW5kbyBlc3RhYmlsaWRhZC4gQXNpbWV0csOtYSBuZWdhdGl2YSAoLTAuNTEpIHkgY3VydG9zaXMgZGUgMi40OSwgbG8gcXVlIHN1Z2llcmUgdW5hIGNvbmNlbnRyYWNpw7NuIGVuIGVsIGNlbnRyby4NCkphcnF1ZS1CZXJhOiBwLXZhbG9yIGRlIDAsIGluZGljYW5kbyBubyBub3JtYWxpZGFkLiIpDQpgYGANCg0KYGBge3J9DQojQU5BTElTSVMgU09CUkUgUFJJTUVSQVMgRElGRVJFTkNJQVMNCnByZWNpb3MgPC0gbmEub21pdChwcmVjaW9zKQ0KZGlmZXJlbmNpYXMgPC0gZGlmZihhcy5tYXRyaXgocHJlY2lvcykpIA0KDQpwYXIobWZyb3cgPSBjKDIsIDUpKQ0KZm9yIChpIGluIDE6bmNvbChkaWZlcmVuY2lhcykpIHsNCiAgaGlzdChkaWZlcmVuY2lhc1ssIGldLCBtYWluID0gY29sbmFtZXMoZGlmZXJlbmNpYXMpW2ldLCB4bGFiID0gIkRpZmVyZW5jaWFzIiwgeWxhYiA9ICJGcmVjdWVuY2lhIiwgYnJlYWtzID0gMjApDQp9DQoNCmVzdGFkaXN0aWNvczIgPC0gZGF0YS5mcmFtZSgNCiAgQWN0aXZvID0gY29sbmFtZXMoZGlmZXJlbmNpYXMpLA0KICBNZWRpYSA9IGFwcGx5KGRpZmVyZW5jaWFzLCAyLCBtZWFuKSwNCiAgRGVzdmlhY2lvbl9Fc3RhbmRhciA9IGFwcGx5KGRpZmVyZW5jaWFzLCAyLCBzZCksDQogIEFzaW1ldHJpYSA9IGFwcGx5KGRpZmVyZW5jaWFzLCAyLCBza2V3bmVzcyksDQogIEN1cnRvc2lzID0gYXBwbHkoZGlmZXJlbmNpYXMsIDIsIGt1cnRvc2lzKQ0KKQ0KDQpqYXJxdWVfYmVyYV90ZXN0MiA8LSBhcHBseShkaWZlcmVuY2lhcywgMiwgZnVuY3Rpb24oeCkgamFycXVlLnRlc3QobmEub21pdCh4KSkkcC52YWx1ZSkNCmVzdGFkaXN0aWNvczIkSmFycXVlX0JlcmFfcHZhbG9yIDwtIGphcnF1ZV9iZXJhX3Rlc3QyDQoNCnByaW50KGVzdGFkaXN0aWNvczIpDQoNCmNhdCgiDQpUU0xBIChUZXNsYSk6DQpIaXN0b2dyYW1hOiBMYSBkaXN0cmlidWNpw7NuIG11ZXN0cmEgdW5hIGFsdGEgY29uY2VudHJhY2nDs24gYWxyZWRlZG9yIGRlIGxhIG1lZGlhLCBjb24gYWxndW5vcyB2YWxvcmVzIGV4dHJlbW9zLg0KRXN0YWTDrXN0aWNhczogTWVkaWEgZGUgMC4xNSB5IGRlc3ZpYWNpw7NuIGVzdMOhbmRhciBhbHRhICg2Ljk5KSwgaW5kaWNhbmRvIHVuYSBjb25zaWRlcmFibGUgdm9sYXRpbGlkYWQgZW4gbG9zIGNhbWJpb3MgZGUgcHJlY2lvcy4gTGEgYXNpbWV0csOtYSBlcyBuZWdhdGl2YSAoLTAuMTUpIHkgbGEgY3VydG9zaXMgYWx0YSAoOS45NiksIGxvIHF1ZSBpbmRpY2EgdW5hIGRpc3RyaWJ1Y2nDs24gbGVwdG9jw7pydGljYSBjb24gY29sYXMgZ3J1ZXNhcy4NCkphcnF1ZS1CZXJhOiBwLXZhbG9yIGRlIDAsIGxvIHF1ZSBzdWdpZXJlIHF1ZSBsYSBzZXJpZSBubyBzaWd1ZSB1bmEgZGlzdHJpYnVjacOzbiBub3JtYWwgZGViaWRvIGEgbG9zIHZhbG9yZXMgZXh0cmVtb3MuDQoNCkpQTSAoSlBNb3JnYW4gQ2hhc2UpOg0KSGlzdG9ncmFtYTogRGlzdHJpYnVjacOzbiBzaW3DqXRyaWNhIHkgbWVub3MgZGlzcGVyc2EsIGNvbiBjYW1iaW9zIG3DoXMgY29uY2VudHJhZG9zIGFscmVkZWRvciBkZSBsYSBtZWRpYS4NCkVzdGFkw61zdGljYXM6IE1lZGlhIGRlIDAuMDQgeSBiYWphIGRlc3ZpYWNpw7NuIGVzdMOhbmRhciAoMi4xOSksIGxvIHF1ZSBpbmRpY2EgbWVub3Igdm9sYXRpbGlkYWQgZW4gbG9zIGNhbWJpb3MgZGUgcHJlY2lvcy4gTGEgYXNpbWV0csOtYSBlcyBjZXJjYW5hIGEgY2VybyAoLTAuMDkpIHkgbGEgY3VydG9zaXMgZXMgYWx0YSAoMTAuMDApLCBpbmRpY2FuZG8gY29sYXMgZ3J1ZXNhcy4NCkphcnF1ZS1CZXJhOiBwLXZhbG9yIGRlIDAsIGluZGljYW5kbyBubyBub3JtYWxpZGFkIGRlYmlkbyBhIGxhIGN1cnRvc2lzIGVsZXZhZGEuDQoNCktPIChDb2NhLUNvbGEpOg0KSGlzdG9ncmFtYTogRGlzdHJpYnVjacOzbiBzZXNnYWRhIGEgbGEgaXpxdWllcmRhLCBjb24gYWxndW5vcyB2YWxvcmVzIGV4dHJlbW9zLg0KRXN0YWTDrXN0aWNhczogTWVkaWEgZGUgMC4wMDggeSBkZXN2aWFjacOzbiBlc3TDoW5kYXIgYmFqYSAoMC42NyksIHN1Z2lyaWVuZG8gZXN0YWJpbGlkYWQgZW4gbG9zIGNhbWJpb3MgZGUgcHJlY2lvcy4gQXNpbWV0csOtYSBuZWdhdGl2YSAoLTAuODgpIHkgYWx0YSBjdXJ0b3NpcyAoMTAuOTUpLCBsbyBjdWFsIHJlZmxlamEgdW5hIGZ1ZXJ0ZSBjb25jZW50cmFjacOzbiBkZSBjYW1iaW9zIGNlcmNhIGRlIGxhIG1lZGlhIHkgY29sYXMgcHJvbnVuY2lhZGFzLg0KSmFycXVlLUJlcmE6IHAtdmFsb3IgZGUgMCwgbG8gcXVlIGluZGljYSBubyBub3JtYWxpZGFkIGRlYmlkbyBhIGxhIGFzaW1ldHLDrWEgeSBjdXJ0b3NpcyBlbGV2YWRhcy4NCg0KUEZFIChQZml6ZXIpOg0KSGlzdG9ncmFtYTogRGlzdHJpYnVjacOzbiBsZXZlbWVudGUgc2VzZ2FkYSBoYWNpYSBsYSBkZXJlY2hhLg0KRXN0YWTDrXN0aWNhczogTWVkaWEgZGUgLTAuMDAzOCwgbG8gcXVlIHN1Z2llcmUgdW5hIGxpZ2VyYSB0ZW5kZW5jaWEgbmVnYXRpdmEgZW4gZWwgY2FtYmlvIGRlIHByZWNpb3MuIERlc3ZpYWNpw7NuIGVzdMOhbmRhciBiYWphICgwLjY2KSwgYXNpbWV0csOtYSBwb3NpdGl2YSAoMC4yNikgeSBtb2RlcmFkYSBjdXJ0b3NpcyAoNy4yNiksIG1vc3RyYW5kbyBjb2xhcyBtb2RlcmFkYW1lbnRlIGdydWVzYXMuDQpKYXJxdWUtQmVyYTogcC12YWxvciBkZSAwLCBsbyBxdWUgaW5kaWNhIG5vIG5vcm1hbGlkYWQgZGViaWRvIGEgbGEgY3VydG9zaXMuDQoNClBMRCAoUHJvbG9naXMpOg0KSGlzdG9ncmFtYTogRGlzdHJpYnVjacOzbiBzZXNnYWRhIGEgbGEgaXpxdWllcmRhIGNvbiBkaXNwZXJzacOzbiBtb2RlcmFkYS4NCkVzdGFkw61zdGljYXM6IE1lZGlhIGRlIDAuMDQ1IHkgZGVzdmlhY2nDs24gZXN0w6FuZGFyIGRlIDEuOTAsIGxvIGN1YWwgaW5kaWNhIGNhbWJpb3MgbW9kZXJhZG9zLiBBc2ltZXRyw61hIG5lZ2F0aXZhICgtMC41NikgeSBjdXJ0b3NpcyBlbGV2YWRhICg4LjU4KSwgbG8gcXVlIHN1Z2llcmUgdW5hIGRpc3RyaWJ1Y2nDs24gY29uIGNvbGFzIGdydWVzYXMuDQpKYXJxdWUtQmVyYTogcC12YWxvciBkZSAwLCBpbmRpY2FuZG8gbm8gbm9ybWFsaWRhZCBkZWJpZG8gYSBsYXMgY29sYXMgZ3J1ZXNhcy4NCg0KViAoVmlzYSk6DQpIaXN0b2dyYW1hOiBEaXN0cmlidWNpw7NuIHNpbcOpdHJpY2EgY29uIGRpc3BlcnNpw7NuIGVuIHRvcm5vIGEgbGEgbWVkaWEuDQpFc3RhZMOtc3RpY2FzOiBNZWRpYSBkZSAwLjA5NyB5IGRlc3ZpYWNpw7NuIGVzdMOhbmRhciBtb2RlcmFkYSAoMy4yMSksIGxvIHF1ZSBpbmRpY2EgZmx1Y3R1YWNpb25lcyBtb2RlcmFkYXMgZW4gbG9zIGNhbWJpb3MgZGUgcHJlY2lvcy4gTGEgYXNpbWV0csOtYSBlcyBjZXJjYW5hIGEgY2VybyAoLTAuMDgpIHkgbGEgY3VydG9zaXMgZXMgYWx0YSAoOS42MCksIGxvIHF1ZSBpbXBsaWNhIGNvbGFzIGdydWVzYXMuDQpKYXJxdWUtQmVyYTogcC12YWxvciBkZSAwLCBpbmRpY2FuZG8gbm8gbm9ybWFsaWRhZC4NCg0KR1MgKEdvbGRtYW4gU2FjaHMpOg0KSGlzdG9ncmFtYTogRGlzdHJpYnVjacOzbiBzaW3DqXRyaWNhIGNvbiB2YWxvcmVzIGRpc3BlcnNvcy4NCkVzdGFkw61zdGljYXM6IE1lZGlhIGRlIDAuMDg2IHkgZGVzdmlhY2nDs24gZXN0w6FuZGFyIGFsdGEgKDUuMDgpLCBsbyBxdWUgc3VnaWVyZSB1bmEgbWF5b3Igdm9sYXRpbGlkYWQuIEFzaW1ldHLDrWEgbmVnYXRpdmEgKC0wLjEzKSB5IGN1cnRvc2lzIGVsZXZhZGEgKDUuNjMpLCBsbyBxdWUgaW5kaWNhIGNvbGFzIGdydWVzYXMuDQpKYXJxdWUtQmVyYTogcC12YWxvciBkZSAwLCBpbmRpY2FuZG8gbm8gbm9ybWFsaWRhZCBkZWJpZG8gYSBsYSBjdXJ0b3Npcy4NCg0KQ1ZYIChDaGV2cm9uKToNCkhpc3RvZ3JhbWE6IERpc3RyaWJ1Y2nDs24gc2ltw6l0cmljYSB5IG3DoXMgZGlzcGVyc2EuDQpFc3RhZMOtc3RpY2FzOiBNZWRpYSBkZSAwLjAxNCB5IGRlc3ZpYWNpw7NuIGVzdMOhbmRhciBkZSAyLjM2LCBjb24gYXNpbWV0csOtYSBuZWdhdGl2YSAoLTAuNDkpIHkgYWx0YSBjdXJ0b3NpcyAoOC41NCksIGxvIHF1ZSBpbmRpY2EgdW5hIGZ1ZXJ0ZSBjb25jZW50cmFjacOzbiBhbHJlZGVkb3IgZGUgbGEgbWVkaWEgeSBjb2xhcyBwcm9udW5jaWFkYXMuDQpKYXJxdWUtQmVyYTogcC12YWxvciBkZSAwLCBpbmRpY2FuZG8gbm8gbm9ybWFsaWRhZC4NCg0KV01UIChXYWxtYXJ0KToNCkhpc3RvZ3JhbWE6IERpc3RyaWJ1Y2nDs24gc2ltw6l0cmljYSB5IGNvbmNlbnRyYWRhLg0KRXN0YWTDrXN0aWNhczogTWVkaWEgZGUgMC4wMTMgeSBiYWphIGRlc3ZpYWNpw7NuIGVzdMOhbmRhciAoMC41OCksIG1vc3RyYW5kbyBlc3RhYmlsaWRhZC4gQXNpbWV0csOtYSBuZWdhdGl2YSAoLTAuNzgpIHkgYWx0YSBjdXJ0b3NpcyAoMTcuOTgpLCBzdWdpcmllbmRvIHVuYSBkaXN0cmlidWNpw7NuIGFsdGFtZW50ZSBsZXB0b2PDunJ0aWNhIGNvbiBjb2xhcyBleHRyZW1hcy4NCkphcnF1ZS1CZXJhOiBwLXZhbG9yIGRlIDAsIGluZGljYW5kbyBubyBub3JtYWxpZGFkIGRlYmlkbyBhIGxhIGN1cnRvc2lzIGV4dHJlbWEuDQoNCklOVEMgKEludGVsKToNCkhpc3RvZ3JhbWE6IERpc3RyaWJ1Y2nDs24gc2ltw6l0cmljYSBjb24gZGlzcGVyc2nDs24gbW9kZXJhZGEuDQpFc3RhZMOtc3RpY2FzOiBNZWRpYSBkZSAwLjAwMiB5IGJhamEgZGVzdmlhY2nDs24gZXN0w6FuZGFyICgxLjE1KSwgaW5kaWNhbmRvIGNhbWJpb3MgbGV2ZXMuIEFzaW1ldHLDrWEgbmVnYXRpdmEgKC0wLjc3KSB5IGN1cnRvc2lzIGFsdGEgKDE1LjU1KSwgbG8gcXVlIGltcGxpY2EgdW5hIGZ1ZXJ0ZSBjb25jZW50cmFjacOzbiB5IGNvbGFzIGdydWVzYXMuDQpKYXJxdWUtQmVyYTogcC12YWxvciBkZSAwLCBpbmRpY2FuZG8gbm8gbm9ybWFsaWRhZC4iKQ0KYGBgDQoNCmBgYHtyfQ0KI05PUk1BTElEQUQgUEFSQSBMQSBDQVJURVJBDQpkaWZlcmVuY2lhczIgPC0gYXMuZGF0YS5mcmFtZShkaWZlcmVuY2lhcykNCg0KcmVnLm5vbS5NYXJrb3dpdHogPSBsbShkaWZlcmVuY2lhczIkS08gfiBkaWZlcmVuY2lhczIkUEZFICsgZGlmZXJlbmNpYXMyJENWWCArIGRpZmVyZW5jaWFzMiRXTVQgKyBkaWZlcmVuY2lhczIkYFMmUDUwMGApDQpzdW1tYXJ5KHJlZy5ub20uTWFya293aXR6KQ0KcmVzLm5vbS5NYXJrb3dpdHogPSByZWcubm9tLk1hcmtvd2l0eiRyZXMNCmphcnF1ZS5iZXJhLnRlc3QocmVzLm5vbS5NYXJrb3dpdHopDQoNCnJlZy5ub20uU2hhcnBlID0gbG0oZGlmZXJlbmNpYXMyJFRTTEEgfiBkaWZlcmVuY2lhczIkUExEICsgZGlmZXJlbmNpYXMyJFYgKyBkaWZlcmVuY2lhczIkV01UKQ0Kc3VtbWFyeShyZWcubm9tLlNoYXJwZSkNCnJlcy5ub20uU2hhcnBlID0gcmVnLm5vbS5TaGFycGUkcmVzDQpqYXJxdWUuYmVyYS50ZXN0KHJlcy5ub20uU2hhcnBlKQ0KDQpyZWcubm9tLk1hcmtvd2l0ek1pY2hhdWQgPSBsbShkaWZlcmVuY2lhczIkSlBNIH4gZGlmZXJlbmNpYXMyJEtPICsgZGlmZXJlbmNpYXMyJFBGRSArIGRpZmVyZW5jaWFzMiRQTEQgKyBkaWZlcmVuY2lhczIkViArIGRpZmVyZW5jaWFzMiRHUyArICsgZGlmZXJlbmNpYXMyJENWWCArIGRpZmVyZW5jaWFzMiRXTVQgKyBkaWZlcmVuY2lhczIkYFMmUDUwMGApDQpzdW1tYXJ5KHJlZy5ub20uTWFya293aXR6TWljaGF1ZCkNCnJlcy5ub20uTWFya293aXR6TWljaGF1ZCA9IHJlZy5ub20uTWFya293aXR6TWljaGF1ZCRyZXMNCmphcnF1ZS5iZXJhLnRlc3QocmVzLm5vbS5NYXJrb3dpdHpNaWNoYXVkKQ0KDQoNCmNhdCgiTG9zIHJlc2lkdW9zIGRlIGNhZGEgbW9kZWxvL2NhcnRlcmEgbm8gc2lndWVuIHVuYSBkaXN0cmlidWNpw7NuIG5vcm1hbCwgY29tbyBsbyBpbmRpY2EgZWwgcC12YWxvciBkZSBsYSBwcnVlYmEgZGUgSmFycXVlLUJlcmEuIEVzdG8gc3VnaWVyZSBxdWUgbGFzIGNhcnRlcmFzIGV4aGliZSBubyBub3JtYWxpZGFkLCBxdWUgcHVlZGUgZGViZXJzZSBhIGxhIHZvbGF0aWxpZGFkIHkgZXZlbnRvcyBleHRyZW1vcyBlbiBsb3MgY2FtYmlvcyBkZSBsb3MgcHJlY2lvcyBkZSBsb3MgYWN0aXZvcywgbG8gY3VhbCBlcyBjb23Dum4gZW4gc2VyaWVzIGZpbmFuY2llcmFzLiIpDQoNCmBgYA0KDQpgYGB7cn0NCiMgQ8OhbGN1bG8gZGUgbGEgbWF0cml6IGRlIGNvcnJlbGFjaW9uZXMNCmluc3RhbGwucGFja2FnZXMoImNvcnJwbG90IikNCmxpYnJhcnkoY29ycnBsb3QpDQoNCmNvcnJlbGF0aW9uX21hdHJpeCA8LSBjb3IocHJlY2lvcykNCmNvcnJwbG90KGNvcnJlbGF0aW9uX21hdHJpeCwgbWV0aG9kID0gIm51bWJlciIsIHR5cGUgPSAidXBwZXIiKQ0KYGBgDQoNCmBgYHtyfQ0KIyBEZXRlcm1pbmFudGUgZGUgbGEgbWF0cml6IGRlIGNvcnJlbGFjaW9uZXMNCmRldF9jb3JyZWxhdGlvbiA8LSBkZXQoY29ycmVsYXRpb25fbWF0cml4KQ0KIyBSZW1vdmVyIGVsIGFjdGl2byBjb24gZWwgbWVub3IgaW1wYWN0byBlbiBlbCBkZXRlcm1pbmFudGUNCmRldF92YWx1ZXMgPC0gc2FwcGx5KDE6bmNvbChwcmVjaW9zKSwgZnVuY3Rpb24oaSkgew0KICB0ZW1wX21hdHJpeCA8LSBwcmVjaW9zWywgLWldDQogIGRldChjb3IodGVtcF9tYXRyaXgpKQ0KfSkNCmRldF92YWx1ZXMNCmBgYA0KDQpgYGB7cn0NCiMgVmFsaWRhciBxdWUgbG9zIMOtbmRpY2VzIGRlIGRldF92YWx1ZXMgY29pbmNpZGFuIGNvbiBwcmVjaW9zDQppZiAobGVuZ3RoKGRldF92YWx1ZXMpICE9IG5jb2wocHJlY2lvcykpIHsNCiAgc3RvcCgiRWwgdGFtYcOxbyBkZSBkZXRfdmFsdWVzIG5vIGNvaW5jaWRlIGNvbiBlbCBuw7ptZXJvIGRlIGNvbHVtbmFzIGRlIHByZWNpb3MuIikNCn0NCg0KIyBJZGVudGlmaWNhciBlbCDDrW5kaWNlIGRlbCBwZW9yIGFjdGl2byBiYXNhZG8gZW4gZWwgZGV0ZXJtaW5hbnRlIG3DoXhpbW8NCndvcnN0X2Fzc2V0IDwtIHdoaWNoLm1heChkZXRfdmFsdWVzKQ0KaWYgKHdvcnN0X2Fzc2V0ID4gbmNvbChwcmVjaW9zKSkgew0KICBzdG9wKCJFbCDDrW5kaWNlIGRlbCBwZW9yIGFjdGl2byBleGNlZGUgbGFzIGNvbHVtbmFzIGRpc3BvbmlibGVzIGVuIHByZWNpb3MuIikNCn0NCg0KIyBPYnRlbmVyIGVsIG5vbWJyZSBkZWwgYWN0aXZvIHJlbW92aWRvDQpyZW1vdmVkX2Fzc2V0IDwtIGNvbG5hbWVzKHByZWNpb3MpW3dvcnN0X2Fzc2V0XQ0KY2F0KCJBY3Rpdm8gcmVtb3ZpZG86IiwgcmVtb3ZlZF9hc3NldCwgIlxuIikNCg0KIyBSZW1vdmVyIGVsIGFjdGl2byBkZSBwcmVjaW9zDQpwcmVjaW9zIDwtIHByZWNpb3NbLCAtd29yc3RfYXNzZXQsIGRyb3AgPSBGQUxTRV0NCmBgYA0KDQpgYGB7cn0NCiMgUmVjYWxjdWxhciBwZXNvcyBjb24gOSBhY3Rpdm9zIHJlc3RhbnRlcw0KaW5zdGFsbC5wYWNrYWdlcyhjKCJxdWFkcHJvZyIsICJST0kiLCAiUG9ydGZvbGlvQW5hbHl0aWNzIikpDQpsaWJyYXJ5KHF1YWRwcm9nKQ0KbGlicmFyeShST0kpDQpsaWJyYXJ5KFBvcnRmb2xpb0FuYWx5dGljcykNCmluc3RhbGwucGFja2FnZXMoIkRFb3B0aW0iKQ0KbGlicmFyeSgiREVvcHRpbSIpDQoNCmNvdl9tYXRyaXggPC0gY292KHByZWNpb3MpDQojIEZ1bmNpw7NuIHBhcmEgY2FsY3VsYXIgbGEgdmFyaWFuemEgZGVsIHBvcnRhZm9saW8NCnBvcnRmb2xpb192YXJpYW5jZSA8LSBmdW5jdGlvbih3ZWlnaHRzLCBjb3ZfbWF0cml4KSB7DQogIHJldHVybih0KHdlaWdodHMpICUqJSBjb3ZfbWF0cml4ICUqJSB3ZWlnaHRzKQ0KfQ0KDQojIEZ1bmNpw7NuIGRlIG9wdGltaXphY2nDs24NCm9wdGltaXplX3BvcnRmb2xpbyA8LSBmdW5jdGlvbihjb3ZfbWF0cml4KSB7DQogIA0KICAjIEZ1bmNpw7NuIG9iamV0aXZvOiBNaW5pbWl6YXIgbGEgdmFyaWFuemENCiAgb2JqZWN0aXZlX2Z1bmN0aW9uIDwtIGZ1bmN0aW9uKHdlaWdodHMpIHsNCiAgICB3ZWlnaHRzIDwtIHdlaWdodHMgLyBzdW0od2VpZ2h0cykgICMgTm9ybWFsaXphciBwZXNvcyBwYXJhIHF1ZSBzdW1lbiAxDQogICAgcmV0dXJuKHBvcnRmb2xpb192YXJpYW5jZSh3ZWlnaHRzLCBjb3ZfbWF0cml4KSkNCiAgfQ0KICANCiAgIyBPcHRpbWl6YWNpw7NuIHVzYW5kbyBERW9wdGltDQogIHJlc3VsdCA8LSBERW9wdGltKG9iamVjdGl2ZV9mdW5jdGlvbiwNCiAgICAgICAgICAgICAgICAgICAgbG93ZXIgPSByZXAoMCwgbmNvbChjb3ZfbWF0cml4KSksICAjIFBlc29zID49IDANCiAgICAgICAgICAgICAgICAgICAgdXBwZXIgPSByZXAoMSwgbmNvbChjb3ZfbWF0cml4KSksICAjIFBlc29zIDw9IDENCiAgICAgICAgICAgICAgICAgICAgY29udHJvbCA9IGxpc3QoTlAgPSAyMDAsIGl0ZXJtYXggPSAxMDAsIHRyYWNlID0gVFJVRSkpDQogIA0KICAjIFBlc29zIMOzcHRpbW9zIG5vcm1hbGl6YWRvcw0KICBvcHRpbWFsX3dlaWdodHMgPC0gcmVzdWx0JG9wdGltJGJlc3RtZW0gLyBzdW0ocmVzdWx0JG9wdGltJGJlc3RtZW0pDQogIHJldHVybihvcHRpbWFsX3dlaWdodHMpDQp9DQoNCiMgQ2FsY3VsYXIgbG9zIHBlc29zIMOzcHRpbW9zDQpvcHRpbWFsX3dlaWdodHMgPC0gb3B0aW1pemVfcG9ydGZvbGlvKGNvdl9tYXRyaXgpDQoNCiMgQXNvY2lhciBwZXNvcyDDs3B0aW1vcyBjb24gbG9zIGFjdGl2b3MgcmVzdGFudGVzDQpyZW1haW5pbmdfYXNzZXRzIDwtIGNvbG5hbWVzKHByZWNpb3MpDQpvcHRpbWFsX3dlaWdodHNfcGVyY2VudCA8LSBvcHRpbWFsX3dlaWdodHMgKiAxMDAgICMgQ29udmVydGlyIGEgcG9yY2VudGFqZXMNCndlaWdodHNfdGFibGUgPC0gZGF0YS5mcmFtZSgNCiAgQWN0aXZvID0gcmVtYWluaW5nX2Fzc2V0cywNCiAgUGVzbyA9IHJvdW5kKG9wdGltYWxfd2VpZ2h0c19wZXJjZW50LCAyKQ0KKQ0KDQojIE1vc3RyYXIgbG9zIHJlc3VsdGFkb3MNCmNhdCgiUGVzb3Mgw7NwdGltb3MgZGVzcHXDqXMgZGUgZWxpbWluYXIgdW4gYWN0aXZvOlxuIikNCnByaW50KHdlaWdodHNfdGFibGUpDQpgYGANCg0KYGBge3J9DQojIFJlbW92ZXIgb3RybyBhY3Rpdm8geSBhbmFsaXphciBjb2ludGVncmFjacOzbiAoZ3J1cG9zIGRlIDgpDQpkZXRfdmFsdWVzIDwtIHNhcHBseSgxOm5jb2wocHJlY2lvcyksIGZ1bmN0aW9uKGkpIHsNCiAgdGVtcF9tYXRyaXggPC0gcHJlY2lvc1ssIC1pLCBkcm9wID0gRkFMU0VdDQogIGlmIChuY29sKHRlbXBfbWF0cml4KSA+IDEpIHsNCiAgICByZXR1cm4oZGV0KGNvcih0ZW1wX21hdHJpeCkpKQ0KICB9IGVsc2Ugew0KICAgIHJldHVybihOQSkNCiAgfQ0KfSkNCndvcnN0X2Fzc2V0IDwtIHdoaWNoLm1heChkZXRfdmFsdWVzWyFpcy5uYShkZXRfdmFsdWVzKV0pDQpyZW1vdmVkX2Fzc2V0IDwtIGNvbG5hbWVzKHByZWNpb3MpW3dvcnN0X2Fzc2V0XQ0KY2F0KCJTZWd1bmRvIGFjdGl2byByZW1vdmlkbzoiLCByZW1vdmVkX2Fzc2V0LCAiXG4iKQ0KcHJlY2lvcyA8LSBwcmVjaW9zWywgLXdvcnN0X2Fzc2V0LCBkcm9wID0gRkFMU0VdDQoNCiMgUHJ1ZWJhIGRlIGNvaW50ZWdyYWNpw7NuDQppbnN0YWxsLnBhY2thZ2VzKCJ1cmNhIikNCmxpYnJhcnkoInVyY2EiKQ0KY29pbnRlZ3JhdGlvbl90ZXN0IDwtIGNhLmpvKHByZWNpb3MsIHR5cGUgPSAidHJhY2UiLCBLID0gMiwgZWNkZXQgPSAibm9uZSIsIHNwZWMgPSAibG9uZ3J1biIpDQpzdW1tYXJ5KGNvaW50ZWdyYXRpb25fdGVzdCkNCg0Kc3RyKHByZWNpb3MpDQpwcmVjaW9zIDwtIGFzLmRhdGEuZnJhbWUobGFwcGx5KHByZWNpb3MsIGFzLm51bWVyaWMpKQ0KDQoNCiMgQW7DoWxpc2lzIEVuZ2xlLUdyYW5nZXIgcGFyYSBwYWlycyB0cmFkaW5nDQpmb3IgKGkgaW4gMToobmNvbChwcmVjaW9zKSAtIDEpKSB7DQogIGZvciAoaiBpbiAoaSArIDEpOm5jb2wocHJlY2lvcykpIHsNCiAgICBwYWlyX21vZGVsIDwtIGxtKHByZWNpb3NbLCBpXSB+IHByZWNpb3NbLCBqXSkNCiAgICByZXNpZHVhbHMgPC0gcGFpcl9tb2RlbCRyZXNpZHVhbHMNCiAgICBhZGZfcmVzdWx0IDwtIGFkZi50ZXN0KHJlc2lkdWFscywgYWx0ZXJuYXRpdmUgPSAic3RhdGlvbmFyeSIpDQogICAgY2F0KCJBREYgVGVzdCBwYXJhIiwgY29sbmFtZXMocHJlY2lvcylbaV0sICJ5IiwgY29sbmFtZXMocHJlY2lvcylbal0sICJcbiIpDQogICAgcHJpbnQoYWRmX3Jlc3VsdCkNCiAgfQ0KfQ0KDQojIEFqdXN0ZSBHQVJDSCBwYXJhIGFqdXN0YXIgaGV0ZXJvY2VkYXN0aWNpZGFkDQppbnN0YWxsLnBhY2thZ2VzKCJydWdhcmNoIikNCmxpYnJhcnkoInJ1Z2FyY2giKQ0KDQpnYXJjaF9zcGVjIDwtIHVnYXJjaHNwZWModmFyaWFuY2UubW9kZWwgPSBsaXN0KG1vZGVsID0gInNHQVJDSCIsIGdhcmNoT3JkZXIgPSBjKDEsIDEpKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICBtZWFuLm1vZGVsID0gbGlzdChhcm1hT3JkZXIgPSBjKDAsIDApLCBpbmNsdWRlLm1lYW4gPSBUUlVFKSkNCg0KZ2FyY2hfcmVzdWx0cyA8LSBsYXBwbHkoMTpuY29sKHByZWNpb3MpLCBmdW5jdGlvbihpKSB7DQogIHNlcmllcyA8LSBkaWZmKGxvZyhwcmVjaW9zWywgaV0pKQ0KICBzZXJpZXMgPC0gbmEub21pdChzZXJpZXMpDQogIHVnYXJjaGZpdChnYXJjaF9zcGVjLCBzZXJpZXMpDQp9KQ0KDQojIENhbGN1bGFyIG51ZXZhIG1hdHJpeiBkZSBjb3ZhcmlhbnphIGNvbmRpY2lvbmFsDQp2b2xhdGlsaXRpZXMgPC0gc2FwcGx5KGdhcmNoX3Jlc3VsdHMsIGZ1bmN0aW9uKGdhcmNoX2ZpdCkgc2lnbWEoZ2FyY2hfZml0KSkNCmNvcnJlbGF0aW9ucyA8LSBjb3IoZG8uY2FsbChjYmluZCwgbGFwcGx5KGdhcmNoX3Jlc3VsdHMsIGZ1bmN0aW9uKGdhcmNoX2ZpdCkgZ2FyY2hfZml0QGZpdCRyZXNpZHVhbHMpKSkNCg0KIyBTZWxlY2Npb25hciBsYSDDumx0aW1hIGZpbGEgZGUgdm9sYXRpbGlkYWRlcw0KbGFzdF92b2xhdGlsaXRpZXMgPC0gdm9sYXRpbGl0aWVzW25yb3codm9sYXRpbGl0aWVzKSwgXSAgIyBWZWN0b3IgZGUgbG9uZ2l0dWQgOA0KDQojIENvbnZlcnRpciBhIG1hdHJpeiBkaWFnb25hbA0Kdm9sYXRpbGl0eV9tYXRyaXggPC0gZGlhZyhsYXN0X3ZvbGF0aWxpdGllcykgICMgTWF0cml6IGRpYWdvbmFsICg4eDgpDQoNCiMgQ2FsY3VsYXIgbGEgbnVldmEgbWF0cml6IGRlIGNvdmFyaWFuemFzDQpuZXdfY292X21hdHJpeCA8LSB2b2xhdGlsaXR5X21hdHJpeCAlKiUgY29ycmVsYXRpb25zICUqJSB2b2xhdGlsaXR5X21hdHJpeA0KDQojIE1vc3RyYXIgbGEgbnVldmEgbWF0cml6IGRlIGNvdmFyaWFuemFzDQpwcmludChuZXdfY292X21hdHJpeCkNCg0KDQojIFJlY2FsY3VsYXIgcGVzb3Mgw7NwdGltb3MgY29uIGxhIG51ZXZhIG1hdHJpeiBkZSBjb3ZhcmlhbnphDQpuZXdfb3B0aW1hbF93ZWlnaHRzIDwtIG9wdGltaXplX3BvcnRmb2xpbyhuZXdfY292X21hdHJpeCkNCm5ld19vcHRpbWFsX3dlaWdodHNfcGVyY2VudCA8LSBuZXdfb3B0aW1hbF93ZWlnaHRzICogMTAwDQpuZXdfd2VpZ2h0c190YWJsZSA8LSBkYXRhLmZyYW1lKA0KICBBY3Rpdm8gPSBjb2xuYW1lcyhwcmVjaW9zKSwNCiAgUGVzbyA9IHJvdW5kKG5ld19vcHRpbWFsX3dlaWdodHNfcGVyY2VudCwgMikNCikNCg0KIyBNb3N0cmFyIGxvcyByZXN1bHRhZG9zIGZpbmFsZXMNCmNhdCgiUGVzb3Mgw7NwdGltb3MgY29uIGxhIG51ZXZhIG1hdHJpeiBkZSBjb3ZhcmlhbnphOlxuIikNCnByaW50KG5ld193ZWlnaHRzX3RhYmxlKQ0KYGBgDQoNCg==