Integrantes:
Sosa Pérez, Sebastián Alonso
Rivera Camacho, Priscila Yamilet

CLASIFICACIÓN DE CRÉDITOS UTILIZANDO TÉCNICAS DE REGULACIÓN SOBRE LA BASE DE DATOS CREDIT GERMAN

Creado: 23/09/2021

Resumen

Con el objetivo de determinar un modelo de credit scoring para la base de datos Credit German, se utilizaron las técnicas de regulación: Ridge, Lasso y Elastic Net. Utilizando el modelo principal Logit, analizamos en base a este sus parámetros β, encontramos los resultados donde, el modelo Logit tiene una precisión del 37.2%, el modelo lasso presenta una precisión del 76.7%, el modelo Ridge de 75.6% y el modelo Elastic net de 69.2%. Finalmente, llegamos a la conclusión que el modelo Lasso presenta una mejor predicción de los datos, con una precisión en los datos de entrenamiento de 82.9% y para los datos de prueba 76.7%, siendo este superior a los modelos propuestos.

Palabras claves: Ridge, Lasso y Elastic Net, Beta y Logit

Abstrac

In order to determine a credit scoring model for the Credit German database, the following regulation techniques were used: Ridge, Lasso and Elastic Net. Using the main Logit model, we analyzed its β parameters based on this, we found the results where, the Logit model has an accuracy of 37.2%, the lasso model has an accuracy of 76.7%, the Ridge model of 75.6% and the Elastic net model of 69.2%. Finally, we reached the conclusion that the Lasso model presents a better prediction of the data, with a precision in the training data of 82.9% and for the test data 76.7%, this being superior to the proposed models.

Keywords: Ridge, Lasso and Elastic Net, Beta and Logit

Introducción

Una compañía financiera es una entidad que cuenta como objetivo principal percibir la mayor cantidad de recursos de capital para poder tener solvencia y realizar la facilitación tanto de servicios como de bienes, por medio de operaciones de crédito. (Tigreros, 2020) Las instituciones financieras consideran importante la liquidez que le admita cumplir sus obligaciones de prestar crédito a sus clientes. Estas instituciones también tienen como finalidad evitar el menor riesgo que se enfrentan ante la aprobación de un crédito. En Perú, el buen desarrollo y el boom de las Micro finanzas se ha fundamentado en importantes puntos como: transparencia de centrales de riesgo y normas de información financiera, apropiados sistemas de tecnologías crediticias, un marco regulatorio de apoyo institucional, alta promoción de transparencia en precios y por último la competencia en el mercado. No obstante, estas instituciones se ven amenazadas por el ingreso de nuevas empresas oligopólicas con mayores capitales y por supuesto, mejores tecnologías para la detección de los riesgos crediticios. (Calderón, 2020) Es por eso, que es fundamental desarrollar mecanismos que ayuden a reducir este problema de riesgo crediticio, para así poder identificar clientes que no cumplan con sus obligaciones, es decir que presenten insolvencia para culminar satisfactoriamente un crédito. Pues la mayor inquietud de estas instituciones financieras es terminar en casos jurídicos con el fin de recuperar solo su capital e ideando procesos de gestión de carteras a los clientes deudores. (Tigreros, 2020) La problemática identificada es ¿Cómo aplicar las técnicas de regulación para la clasificación crediticia de los futuros clientes de Credit German? En el presente informe se analiza la dataset de la entidad alemana de préstamos particulares llamada Credict German, aplicando las técnicas de regulación (lasso, rigde y elastic net) con el objetivo de determinar el pronóstico de clasificación crediticia para futuros clientes de Credit German, para lograrlo identificaremos el mejor modelo con las técnicas de regulación para la clasificación crediticia, analizaremos los atributos crediticios de los clientes de Credit German. En el ámbito internacional, Qin, C. (2021) en su investigación propone el uso de eXtreme Gradient Boosting como modelo para la evaluación crediticia, basado en una optimización de partículas, además realiza una comparación de clasificadores normalmente usados en similares investigaciones, métodos hiperparámetros de optimización y algoritmos tradicionales utilizados en el aprendizaje automático. Los resultados arrojaron que el modelo eXtreme Gradient Boosting fue superior al resto de modelos analizados, incluso la optimización del enjambre de partículas del modelo resulta ser mejor que otras estrategias de optimización. Se obtuvo como conclusión que a nivel de rendimiento XGBoost optimizado con las técnicas RS, GS Y TPE es inferior al rendimiento de APSO-XGBoost. Pardo, O. (2020) En su trabajo realizó un modelo logit para evaluar el riesgo crediticio de una cooperativa en Villavicencio, para esta investigación utilizaron un modelo cualitativo, el modelo logit, se trabaja una variable tipo binario, cuando el número tiende a 1 quiere decir que los clientes asociados no tienen buen desempeño, y por lo contrario el 0 representa el buen desempeño en su cartera. El resultado es que los factores de riesgo de los socios varones fueron la corta edad y ser soltero, los bajos recursos, además del tiempo limitado de pertenencia a la cooperativa, trabajar en entidades privadas, y tener préstamos grandes con amplios plazos de pago. El porcentaje de aciertos buenos del modelo es de 63.95%, es decir el nivel de predicción es aceptable, se encontró que los asociados reducen en un 0.45% el riesgo de incumplimiento cada año y si aumentan sus ingresos, por cada 1% adicional su nivel de incumplimiento disminuye en 6.74%. Por último, se afirma la importancia del modelo logit como herramienta cuantitativa para predecir posibles riesgos. Guevara K. (2020) En su trabajo de investigación realiza un análisis de la dataset de LendingClub, una entidad financiera estadounidense, con la finalidad de clasificar sus clientes mediante modelos de regresión, es por eso que aplica como metodología una máquina de soporte vectorial que le permita catalogar a los usuarios como ‘’malos o buenos’’ y así realizar la asignación crediticia a cada uno de ellos. Los resultados obtenidos con Kernel radial representan un 96% de la clasificación de la base que fue creada, de estos el 83% de vectores corresponde a una clasificación ‘’C’’. Eso quiere decir que existe un desbalance en los datos utilizados. Se concluyó con una tasa de positivos mayor a 50 puntos porcentuales. El error de la base balanceada representó un 0,4614, mientras que la original fue menor y fue de 0,1486. Leal A. (2018). En su investigación, tuvo como propósito el análisis de riesgo crediticio de un modelo Credit Scoring para la empresa Fantasía S.A. Utilizó un método de estudio Delphi el cual le permitió establecer variables tanto cuantitativas como cualitativas para recurrir a la evaluación de la calidad de cada cliente, algunas de sus variables cualitativas fueron los temas legales y comerciales, la antigüedad y contribución de la empresa. Los resultados mostraron que el 81,82% de clientes cumplían los mínimos requisitos para el crédito, mientras que el 18,18% no lo hacían. Finalmente, los autores concluyeron que el sistema de gestión que presenta dicha empresa no cumple correctamente su función, el modelo Credit Scoring le será de mayor eficiencia a Fantasía S.A., pues presenta más flexibilidad y objetividad en la clasificación de créditos. Sánchez S. 2016 Desarrolla un estudio que le permite calcular la eficiencia relativa de los actores de crédito en un banco. La investigación utilizó la programación lineal, mediante el DEA con un proceso doble para la optimización, el banco colombiano fue el objeto de estudio, el cual contaba con cinco bandas de actividades de crédito. Los resultados arrojaron que las zonas geográficas con mejor desempeño fueron Sur y Cafetera, por otro lado, la banda con mayor eficiencia fueron la oficial y la agropecuaria. Mientras que la banca y zona más ineficientes fueron la personal y la Costa, respectivamente. La investigación concluye con la validación del método utilizado, ya que sirve para analizar situaciones reales para la cooperativa. López Rodríguez, (2016). propuso en su investigación realizar un modelo ontológico con el modelo relacional para analizar créditos financieros mediante la relación de distintas bases de datos. Se hizo uso de sistemas para realizar la evaluación apoyado en ontologías con la herramienta Protégé 5.5 para el Banco Nacional de Cuba, aplicando el método se modeló un sistema flexible sencillo mantenimiento y a la vez reutilizable. Finalmente se pudieron obtener a partir de los métodos, 2 ontologías que cumplen el objetivo de clasificar las variables del financiamiento y por lo tanto el riesgo crediticio en las entidades. Banda, O. (2014). En su informe, ante el problema del credit scoring de las instituciones de microfinanzas realiza la aplicación teórica del método Holt-Winters para evaluar adecuadamente los créditos. Como método metodológico teórico para analizar el riesgo crediticio de concebir microcréditos fue a partir de flujos de efectivo esperados, incluyendo la estacionalidad de ellos, se empleó el método Holt-Winters de pronóstico no lineal. Los resultados revelan que los clientes de las IMF poseen distintas características para encontrar la probabilidad de que cumplan con el pago del crédito, es por eso que sus modelos deben ser distintos. Concluyó que el conocimiento del cliente sea fundamental en el proceso de otorgamiento de crédito, también es de suma importancia que las imf cuenten con una metodología que les permita discriminar objetivamente las solicitudes de crédito. (Medina & Selva, 2013) En su investigación realiza un análisis del Credit Scoring partiendo de información existente entre el cliente y la operación. Utilizó un sistema de puntuación cualitativo para obtener como respuesta la probabilidad de pago de cada cliente, dependiendo si la función fue conocida o no, pudieron aplicar modelos paramétricos o no paramétricos. Como resultado se obtuvo que, de la evaluación de 1446 individuos, 984 fueron clasificados como no morosos y 462 fueron morosos. Para este análisis el cliente era moroso si tenía más de 2 meses de retraso en el pago del crédito. Finalmente se concluye que el modelo no paramétrico usado, el algoritmo CART presenta mayor eficiencia que los paramétricos, pues no lanza porcentajes elevados de clientes dudosos. Honglian, H. (2018) realiza su investigación con la finalidad de probar un novedoso método para la clasificación crediticia de mayor eficiencia, para ello genera subconjuntos que se pueden ajustar y los amplía utilizando el BalanceCascade, después se asegura de disminuir los datos negativos y mejora el rendimiento de la predicción. Este modelo tiene como clasificadores el aumento de gradiente a nivel extremo y el bosque aleatorio, se obtuvo como resultados que la media de desempeño del modelo realizado es superior ya que desarrolla satisfactoriamente el análisis crediticio, y es mejor que otros sistemas ya que se evidencia al medir el conjunto de datos. Wang, G. (2012) en su investigación presenta dos modelos de árbol de conjuntos de estrategia dual para disminuir el riesgo de trabajar con datos redundantes y el exceso de datos de ruido, los árboles estratégicos con los que se trabaja son RS-Bagging DT y Bagging-RS DT, se utiliza una evaluación integral y experimental con el fin de ratificar lo eficaz de los métodos. Se obtuvo como resultado que uno de los DT presenta la menor media entre los únicos 5 clasificadores, por otro lado, se obtiene que los mejores métodos gracia a su precisión son RS-Bagging DT y Bagging-RS DT. Finalmente se concluye que ambos métodos pueden ser usados para el análisis crediticio de instituciones financieras pues son eficaces en la práctica del credit scoring. A nivel nacional: Quiroz, B. (2020) realizó su investigación basada en el planteamiento de un modelo credit Scoring para reducir el riesgo crediticio en la Caja Municipal Piura, para lograr su objetivo utilizó la regresión logística tipo binaria la cual le permita realizar un modelo que resulte una variable dependiente discreta dicotómica. A partir de todo el procedimiento se obtuvo que el uso de la data de la Caja municipal Piura posee una probabilidad de default. Finalmente concluyó con el modelo que le permite calificar estadísticamente y realizar predicciones con un 96,7% de exactitud los créditos otorgados. Siguas, A. (2019) en su investigación tuvo como finalidad establecer la relación entre la clasificación crediticia de los clientes deudores y el proceso para brindar el crédito en una empresa de servicios para el hogar S.A.C. La investigación es cuantitativa correlacional, con una muestra de 91 documentos escogidos aleatoriamente, para realizar un análisis documental que permita clasificar a los clientes deudores de la institución como normal, deficiente, dudoso o pérdida. Los resultados mostraron que el 49.5% representa a los deudores normales, el 26,3% es considerado deficiente y el 6.3% clasifica como pérdida o cliente dudoso. Después de analizar los resultados se concluye que si existe la relación entre la clasificación crediticia y el proceso de brindar el financiamiento y fue comprobado con chi cuadrado siendo el alfa el nivel de significancia diferente al p valor=0.000. Flores, (2019) Utilizó como metodología la técnica intuitiva regresión logística utilizando muestras de entrenamiento intramuestral y fuera de muestra. Se obtuvo como resultado intramuestral un coeficiente de Gini de 0.515, y fuera de muestra se obtiene un coeficiente de Gini de 0.48, ambos modelos al cruzarlos en un diagrama de dispersión obtienen 0.85 de correlación, eso quiere decir que ambos modelos pueden cumplir correctamente el objetivo y lograr la clasificación crediticia. Finalmente, se concluyó que ambos modelos analizados, tanto el revolvente que considera variables del titular y socios, y el modelo que usa sólo variables del titular cumplen con altos niveles de correcta predicción. Romero, L. (2017) en su investigación, presenta un modelo de credit scoring con la finalidad de evaluar el riesgo crediticio en la entidad Agrobanco, puesto que la evaluación de crédito se desarrolló de manera lenta y deficiente. Para ello, se pantlea una metodología de efectos marginales y que permita evaluar entre los años de 2009 al 2015, a partir de un modelo de Credit Scoring. Se obtuvo como resultado la determinación de siete variables independientes: garantía, periodo, edad, antigüedad, soltero y calificación normal, las cuales en la morosidad de créditos dados son significativamente estadísticas, por otro lado, las variables no representativas son: mujer, monto y hectárea. Finalmente concluyó las variables: periodo, soltero, edad, garantía antigüedad, soltero y calificación normal, cumplen como determinantes socioeconómicas.

Material y métodos

Como metodología se aplicó los modelos de regulación como técnica para aplicar un modelo cuya variable de respuesta es de tipo binaria en donde con valores de 0 cuando el cliente no es apto para el crédito y 1 cuando si puede acceder al crédito. La población es de 1000 clientes de la base datos Credict German que se encuentra dentro de UCI machine learning repository. Estas fueron las variables de estudios:

   
Variable   
   
Descripción   
   
Tipo   
   
Atributo   1   
   
Estado de la cuenta corriente    
   
Cualitativa   
   
Atributo   2   
   
Duración   en mes   
   
Cuantitativa   
   
Atributo   3   
   
Historial de crédito   
   
Cualitativa   
   
Atributo   4   
   
Propósito   
   
Cualitativa   
   
Atributo   5   
   
Monto del crédito   
   
Cuantitativa   
   
Atributo   6   
   
Cuenta de ahorros/bonos   
   
Cualitativa   
   
Atributo   7   
   
Empleo actual desde (tiempo)   
   
Cualitativa   
   
Atributo   8   
   
Tasa de pago en porcentaje de la renta disponible   
   
Cuantitativa   
   
Atributo   9   
   
Situación personal y sexo   
   
Cualitativa   
   
Atributo   10   
   
Otros deudores / garantes   
   
Cualitativa   
   
Atributo   11   
   
Residencia actual desde   
   
Cuantitativa   
   
Atributo   12   
   
Propiedad   
   
Cualitativa   
   
Atributo   13   
   
Edad en   años   
   
Cuantitativa   
   
Atributo   14   
   
Otros   planes de pago a plazos   
   
Cualitativa   
   
Atributo   15   
   
Vivienda   
   
Cualitativa   
   
Atributo   16   
   
Número   de créditos existentes en este banco   
   
Cuantitativa   
   
Atributo   17   
   
Trabajo   
   
Cualitativa   
   
Atributo   18   
   
Número de personas susceptibles de mantenimiento   
   
Cuantitativa   
   
Atributo   19   
   
Teléfono   
   
Cualitativa   
   
Atributo   20   
   
Trabajador   extranjero   
   
Cualitativa   


Se utilizo el lenguaje de programación R y el editor de código Rstudio para el procesamiento de datos y se utilizó la precisión, la curva ROC y el accuracy. El modelo para la regresión lasso es la siguiente:

\[ \beta_{Lasso}= argmin\sum_{i=1}^n(y_i-\beta_0-\sum_{j=1}^p\beta_ix_{il})^z+\lambda\sum_{j=1}^p|\beta_1| \]

En el cual el valor de λ hace que los parámetros del modelo lleguen a tomar el valor de 0. Para el modelo rigde se expresa el siguiente modelo:

\[ \beta_{Lasso}= argmin\sum_{i=1}^n(y_i-\beta_0-\sum_{j=1}^p\beta_ix_{il})^z+\lambda\sum_{j=1}^p\beta_1^2 \]


En el cual el valor de λ hace que los parámetros del modelo se aproximen a 0. El modelo elastic-net se representa de la siguiente manera:

\[ \frac{(y_i-\beta_0-\sum_{j=1}^p\beta_ix_{il})^2}{2n}+\lambda\alpha\sum_{j=1}^p|\beta_1|+\frac{1-\alpha}{2}\sum_{j=1}^p\beta_j^2 \]

El modelo elastic-net es una combinación del modelo rigde como el modelo lasso, los valores del parámetro α están dentro del intervalo de 0 a 1. Cuando el parámetro α toma el valor de cero es una regresión rigde y cuando es igual a 1 es una regresión lasso.

Resultados

Se puede ver que las variables no poseen ningún dato faltante, si tuviera algún dato faltante se tendría que completar esos valores mediante la media, moda o mediana según el tipo de variable que sea.

El siguiente paso es determinar si los datos de tipo numérico poseen datos atípicos para esta detección de forma multivariable se usa variación del método de los k-vecinos más cercanos. El resultado de este método arroja que solo poseen datos atípicos, esto se puede apreciar de una mejor manera en el siguiente grafico:

Después de haber detectado estos 25 valores atípicos se procede a eliminar los 25 datos atípicos pues estos valores complican nuestro análisis.

Se puede ver que la data posee un desbalanceo de clases, la clase 1 que representan aquellas personas que son aprobadas en el préstamo supera a la clase 0 que representan a las personas que no son accesibles al préstamo. Esta clase de problema genera un sesgo en el modelo pues este es entrenado con una mayor cantidad de una clase, esto ocasiona que no pueda detectar con una mejor precisión a la clase minoritaria, para dar solución a esto se aplican técnicas de balanceo a la data de entrenamiento.

Después de haber realizado el preprocesamiento de la data se comienza a aplicar los modelos el primer modelo es el modelo de regresión logística también conocido como logit, este modelo se utiliza pues se trata de clasificar aquellas personas que pueden ser calificadas a un crédito.

Ahora se comienzan a aplicar los modelos de regulación para la selección de predictores en el caso de la regresión ridge solo se aproxima a los predictores β a 0, la regresión lasso trata de seleccionar parámetros dando como valor a las β y el modelo de regresión elastic-net combina los métodos de las dos técnicas para así superar sus limitaciones.

En esta tabla se puede los valores de cada parámetro de los modelos ya dichos, se toma el modelo logit pues también se toma dentro de los modelos de regresión lineal y además es usado para estos tipos de problemas que consisten en clasificación.

   
Modelo    
   
λ   
   
Α   
   
Logit   
   
-   
   
-   
   
Lasso   
   
0.0178148   
   
1   
   
Rigde   
   
0.1286373   
   
0   
   
Elastic-net   
   
0.128461   
   
0.1   

Después de halar los parámetros del modelo se comienza a evaluar su desempeño tanto para los datos de entrenamiento como para los datos de prueba:

   
Modelo    
   
Precisión   
   
Accuracy   
   
Logit   
   
0.811   
   
0.834   
   
Lasso   
   
0.829   
   
0.806   
   
Rigde   
   
0.829   
   
0.806   
   
Elastic-net   
   
0.792   
   
0.813   

Podemos ver en esta tabla que el modelo que se desempeña de una mejor forma son 2 los cuales son el modelo lasso y el modelo rigde, esto es con los datos de entrenamiento. Ahora se evalúa con los datos de prueba:

   
Modelo    
   
Precisión   
   
Accuracy   
   
Logit   
   
0.372   
   
0.265   
   
Lasso   
   
0.767   
   
0.714   
   
Rigde   
   
0.756   
   
0.704   
   
Elastic-net   
   
0.692   
   
0.711   

En este caso el mejor modelo es el modelo Lasso pues tiene una precisión superior a los demás modelos con un valor de 0.767.
Esto también se puede evaluar con la curva ROC que se presenta en la siguiente figura:


El modelo que presenta el mayor valor auc es el modelo lasso.

# Concluciones

La conclusión global que se obtiene en este trabajo, es que las técnicas utilizadas para el estudio y modelización del incumplimiento para un cliente que pertenece a esta base de datos, lo anterior, se respalda por un alto índice de la precisión. Adicionalmente, se considera que dentro de estas técnicas probadas, la mejor es la técnica de regulación es Lasso que posee una alta precisión de 0.7667 es Lasso debido a que predice de una mejor manera a los clientes no aptos para el crédito y el área bajo la curva es igual a 0.779 lo cual lo hace el mayor de todos los modelos probados. Estos modelos superan con una alta presión al modelo logit, pues según los datos de prueba el modelo Logit presenta una precisión de 0.372, a comparación de los modelos Lasso y Rigde que presentan 0.767 y 0.756 en precisión respectivamente.

Finalmente, cabe mencionar que estos modelos utilizan 20 variables de las cuales selecciona 3 solo tres fueron seleccionadas.

Como sirven estos modelos en el ámbito internacional y en el ámbito nacional. Para disminuir sus riesgos y aumentar las tasas de niveles- tomarlo como alternativa para analizar los riesgos de sus futuros clientes.
Los modelos de regulación es para la selección de variables.

Discusión

Una revisión bibliográfica de la literatura sobre los modelos de Credit Scoring, arrojan que uno de los modelos más implementados para este tipo de problemas es el modelo Logit por autores como Pardo, O. (2020), revelando que este modelo es aceptable puesto que su porcentaje de aciertos es de 63.95%, por otro lado, los estudios que utilizaron las técnicas de regresión para realizar el riesgo de análisis crediticio son Quiroz, B. (2020), Flores, (2019). El modelo más preciso en esta investigación es el modelo Lasso, con una precisión del 76.7%, siendo este un método paramétrico. Otros autores utilizan los modelos no paramétricos como es el caso de Guevara, K (2020) que usa un modelo de máquinas de soporte vectorial que tiene una precisión de 85.1%,

Codigo

data<- read.table("C:/Users/atita/Downloads/german (2).data", quote="\"", comment.char="")

str(data)

head(data)


library(tidyverse)

data[,21]<- ifelse(data[,21]==1,1,0)
data[,21] %>% head()

table(data[,1])

as.factor(data[,1]) %>% head()

data[,1]<- factor(data[,1],labels  = c(1:4))

table(data[,3])
data[,3]<- factor(data[,3],labels  = c(1:5))

table(data[,4])
data[,4]<- factor(data[,4],labels  = c(1:10))

table(data[,6])
data[,6]<- factor(data[,6],labels  = c(1:5))

table(data[,7])
data[,7]<- factor(data[,7],labels  = c(1:5))

table(data[,9])
data[,9]<- factor(data[,9],labels  = c(1:4))

table(data[,10])
data[,10]<- factor(data[,10],labels  = c(1:3))

table(data[,12])
data[,12]<- factor(data[,12],labels  = c(1:4))

table(data[,14])
data[,14]<- factor(data[,14],labels  = c(1:3))

table(data[,15])
data[,15]<- factor(data[,15],labels  = c(1:3))

table(data[,17])
data[,17]<- factor(data[,17],labels  = c(1:4))

table(data[,19])
data[,19]<- factor(data[,19],labels  = c(1:2))

table(data[,20])
data[,20]<- factor(data[,20],labels  = c(1:2))

sapply(data,function( x) class(x))

data[,21]<- as.factor(data[,21])

library(naniar)

vis_miss(data)

data %>% select(V21) %>% group_by(V21) %>% count() %>% 
  as.data.frame() %>% ggplot(aes(V21,n))+geom_col(fill=c("blue","red"),alpha=0.3)+
  theme_elegante()

# Datos atipicos 

library(PCAmixdata)

corte<-splitmix(data)
dquanti<-as.data.frame(corte$X.quanti)
dcuali<-as.data.frame(corte$X.quali)

head(dquanti)

library(FNN)
X<-get.knn(data = dquanti,k=5)
score<-rowMeans(X$nn.dist)

cota<-quantile(score,c(0.75,0.975))[2]
index<-which(score>cota)
Out<-score[index]
length(Out)

valores<-as.factor(ifelse(score>cota,"Atípico","No atipico"))
obs<-c(1:length(score))
pd<-data.frame(score,valores,obs) 
ggplot(pd, aes(x=obs,y=score, col=valores)) +geom_point()+
  theme_elegante()+labs(title="Valores atípicos",color="",x="",caption = "Elaboración propia")

Datos<-data
Datos<-Datos[-index,]
str(Datos)

# Correlacion entre variables

library(GGally)

ggcorr(dquanti, palette = "RdBu", label = TRUE)


# Variables

library(rsample)
set.seed(2021)
corte<- initial_split(Datos, prop = 0.7, strata = "V21")
train <- training(corte)
test  <- testing(corte)

table(train$V21) %>% prop.table()

dim(train)

library(ROSE)
Dtrain<-train
Dtrain <- ovun.sample(V21 ~ ., data = Dtrain, method = "both", p=0.5, N=700, seed = 1)$data
table(Dtrain$V21) %>% prop.table()

# Modelos 

library(caret)

library(glmnet)

# Logit 
library(glm2)

modelo_lg<- glm2(V21~.,data = Dtrain,family = binomial)
modelo_lg

df_coeficientes <- coef(modelo_lg) %>%
  as.matrix() %>%
  as_tibble(rownames = "predictor")

df_coeficientes %>%
  filter(predictor != "(Intercept)") %>%
  ggplot(aes(x = predictor, y = V1)) +
  geom_col() +
  labs(title = "Coeficientes del modelo Lasso") +
  theme_bw() +
  theme(axis.text.x = element_text(size = 6, angle = 45))

df_lg<- df_coeficientes %>%
  filter(predictor != "(Intercept)") 

# Rigde

x_train <- model.matrix(V21~., data = Dtrain)[, -1]
y_train <- Dtrain$V21

modelo_r <- glmnet(
  x           = x_train,
  y           = y_train,
  alpha       = 0,
  nlambda     = 100,
  standardize = TRUE,
  family = "binomial"
)

modelo_r

## Elegir los paremetros 

regularizacion <- modelo_r$beta %>% 
  as.matrix() %>%
  t() %>% 
  as_tibble() %>%
  mutate(lambda = modelo_r$lambda)

regularizacion <- regularizacion %>%
  pivot_longer(
    cols = !lambda, 
    names_to = "predictor",
    values_to = "coeficientes"
  )

library(scales)

regularizacion %>%
  ggplot(aes(x = lambda, y = coeficientes, color = predictor)) +
  geom_line() +
  scale_x_log10(
    breaks = trans_breaks("log10", function(x) 10^x),
    labels = trans_format("log10", math_format(10^.x))
  ) +
  labs(title = "Coeficientes del modelo en función de la regularización") +
  theme_bw() +
  theme(legend.position = "none")

set.seed(123)
cv_error <- cv.glmnet(
  x      = x_train,
  y      = y_train,
  alpha  = 0,
  nfolds = 10,
  type.measure = "mse",
  standardize  = TRUE,
  family="binomial"
)

plot(cv_error)

modelo_r <- glmnet(
  x           = x_train,
  y           = y_train,
  alpha       = 0,
  lambda      = cv_error$lambda.1se,
  standardize = TRUE,
  family = "binomial"
)

summary(modelo_r)

df_coeficientes <- coef(modelo_r) %>%
  as.matrix() %>%
  as_tibble(rownames = "predictor") %>%
  rename(coeficiente = s0)

df_coeficientes %>%
  filter(predictor != "(Intercept)") %>%
  ggplot(aes(x = predictor, y = coeficiente)) +
  geom_col() +
  labs(title = "Coeficientes del modelo Ridge") +
  theme_bw() +
  theme(axis.text.x = element_text(size = 6, angle = 45))

df_r<- df_coeficientes %>%
  filter(predictor != "(Intercept)")

# Modelo Lasso 

modelo_ls <- glmnet(
  x           = x_train,
  y           = y_train,
  alpha       = 1,
  nlambda     = 100,
  standardize = TRUE,
  family = "binomial"
)

regularizacion <- modelo_ls$beta %>% 
  as.matrix() %>%
  t() %>% 
  as_tibble() %>%
  mutate(lambda = modelo_ls$lambda)

regularizacion <- regularizacion %>%
  pivot_longer(
    cols = !lambda, 
    names_to = "predictor",
    values_to = "coeficientes"
  )

regularizacion %>%
  ggplot(aes(x = lambda, y = coeficientes, color = predictor)) +
  geom_line() +
  scale_x_log10(
    breaks = trans_breaks("log10", function(x) 10^x),
    labels = trans_format("log10", math_format(10^.x))
  ) +
  labs(title = "Coeficientes del modelo en función de la regularización") +
  theme_bw() +
  theme(legend.position = "none")

# Evolución del error en función de lambda
# ==============================================================================
set.seed(123)
cv_error <- cv.glmnet(
  x      = x_train,
  y      = y_train,
  alpha  = 1,
  nfolds = 10,
  type.measure = "mse",
  standardize  = TRUE,
  family="binomial"
)

plot(cv_error)

modelo_ls <- glmnet(
  x           = x_train,
  y           = y_train,
  alpha       = 1,
  lambda      = cv_error$lambda.1se,
  standardize = TRUE,
  family="binomial"
)

# Coeficientes del modelo
# ==============================================================================
df_coeficientes <- coef(modelo_ls) %>%
  as.matrix() %>%
  as_tibble(rownames = "predictor") %>%
  rename(coeficiente = s0)

df_coeficientes %>%
  filter(predictor != "(Intercept)") %>%
  ggplot(aes(x = predictor, y = coeficiente)) +
  geom_col() +
  labs(title = "Coeficientes del modelo Lasso") +
  theme_bw() +
  theme(axis.text.x = element_text(size = 6, angle = 45))

df_ls<- df_coeficientes %>%
  filter(predictor != "(Intercept)")


# Elasticnet

set.seed(123)

modelo_el <- train(
  V21 ~., data = Dtrain, method = "glmnet",
  trControl = trainControl("cv", number = 10),
  tuneLength = 10
)
coef(modelo_el$finalModel, modelo_el$bestTune$lambda)

df_coeficientes <- coef(modelo_el$finalModel,modelo_el$bestTune$lambda) %>%
  as.matrix() %>%
  as_tibble(rownames = "predictor")

colnames(df_coeficientes)[2]<-  "V1"

df_coeficientes %>%
  filter(predictor != "(Intercept)") %>%
  ggplot(aes(x = predictor, y = V1)) +
  geom_col() +
  labs(title = "Coeficientes del modelo Elastic-net") +
  theme_bw() +
  theme(axis.text.x = element_text(size = 6, angle = 45))

df_elc<- df_coeficientes %>%
  filter(predictor != "(Intercept)")

df<- cbind(df_lg ,df_r,df_ls,df_elc)
print(df)
write_excel_csv(df,"data.csv")
#### Vamos a validar 

## Modelo logit 

p_lg<- predict(modelo_lg,newdata = Dtrain[,-21],type = "response")
p_lg<- ifelse(p_lg>0.5,1,0)
p_lg
class(Dtrain$V21)
p_lg<- p_lg%>% as.data.frame()
draw_confusion_matrix(confusionMatrix(Dtrain$V21,p_lg %>% as.factor()))
a<-ConfusionMatrix(Dtrain$V21,p_lg$.)
confusionMatrix(data = Dtrain$V21,reference = p_lg$.)
table(Dtrain$V21,as.factor(p_lg$.))
length(Dtrain$V1)
length(p_lg)

## Modelo elastinec 

p_nect<- predict(modelo_el,newdata = Dtrain[,-21])
p_lg<- ifelse(p_lg>0.5,1,0)
p_nect %>% class()
class(Dtrain$V21)
p_lg$. %>% class()
draw_confusion_matrix(confusionMatrix(Dtrain$V21,p_nect))

table(Dtrain$V21,p_nect)

## Modelo Rigde

predicciones_train <- predict(modelo_r, newx = x_train,type = "class")
a<- predicciones_train %>% as.data.frame()
a
draw_confusion_matrix(confusionMatrix(Dtrain$V21,a$s0))

## Modelo lasso

predicciones_train_l <- predict(modelo_ls, newx = x_train,type = "class")
a<- predicciones_train %>% as.data.frame()
a
draw_confusion_matrix(confusionMatrix(Dtrain$V21,a$s0))

### Test

## Modelo elastic:

t_nect<- predict(modelo_el,newdata = test[,-21])
draw_confusion_matrix(confusionMatrix(test$V21,t_nect))

## Lasso;

x_test <- model.matrix(V21~., data = test)[, -1]
y_test <- test$V21
predicciones_test_l <- predict(modelo_ls, newx = x_test,type = "class")
a<- predicciones_test_l %>% as.data.frame()
a
draw_confusion_matrix(confusionMatrix(test$V21,a$s0))

# Rigde

predicciones_test_l <- predict(modelo_r, newx = x_test,type = "class")
a<- predicciones_test_l %>% as.data.frame()
a
draw_confusion_matrix(confusionMatrix(test$V21,a$s0))

## logid

t_lg<- predict(modelo_lg,newdata = test[,-21])
t_lg<- ifelse(t_lg>0.5,1,0)
draw_confusion_matrix(confusionMatrix(test$V21,t_lg %>% as.factor()))
table(test$V21,t_lg %>% as.factor())
####
DataExplorer::plot_missing(data,geom_label_args = list("size" = 4, "label.padding" = unit(0.2, "lines")))

## 

AUC(t_lg,test$V21)

library(ROCR)

library(pROC)

library(pROC)
curva_ROC <- roc(modelo_logit_viv$y,modelo_logit_viv$fitted.values)
plot(curva_ROC,col = "blue",xlim = c(1,0),ylim = c(0,1),
     xlab = "Especifidad", ylab ="Sensibilidad", main = "Curva de ROC")
auc(curva_ROC) # 0.8445

curva_ROC<-roc(t_nect,test$V21)

## Grsficos roc 

## Elastinet

t_nect<- predict(modelo_el,newdata = test[,-21],type = "prob")
roc (prueba $ predeterminado, predicho)
a<- roc(test$V21,t_nect[,2])
ggroc(a)
AUC()
## lasso

predicciones_test_l <- predict(modelo_ls, newx = x_test,type = "response")

a1<- roc(test$V21,predicciones_test_l)
ggroc(a1)

## rigde 

predicciones_test_r <- predict(modelo_r, newx = x_test,type = "response")
a2<- roc(test$V21,predicciones_test_r)
ggroc(a2)

results_bag <- list(lasso = modelo_ls, rigde = modelo_r)

## Logit

p_log<- predict(modelo_lg,test[,-21],type = "response")
a3<- roc(test$V21,p_log)
ggroc(a3)

## Funcion 

graf<- function(a,title){
  b<- ggroc(a,color="blue")+labs(title=title,subtitle = 
              paste("El area bajo la curva: ",round(a$auc,3)),
              caption = "Fuente: Elaboración propia")+
  theme_elegante()
  return(b)
}

z<- graf(a,"Curva ROC del modelo elastic-net")
z1<- graf(a1,"Curva ROC del modelo Lasso")
z2<- graf(a2,"Curva ROC del modelo Rigde")
z3<- graf(a3,"Curva ROC del modelo Logit")

ggarrange(z3,z1,z2,z)
LS0tDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6IA0KICAgIGNvZGVfZG93bmxvYWQ6IHRydWUNCiAgICAjIGNvZGVfZm9sZGluZzogaGlkZQ0KICAgIGhpZ2hsaWdodDogemVuYnVybg0KICAgICMgbnVtYmVyX3NlY3Rpb25zOiB5ZXMNCiAgICB0aGVtZTogImZsYXRseSINCiAgICB0b2M6IFRSVUUNCiAgICB0b2NfZmxvYXQ6IFRSVUUNCmVkaXRvcl9vcHRpb25zOiANCiAgbWFya2Rvd246IA0KICAgIHdyYXA6IHNlbnRlbmNlDQotLS0NCg0KPC9jZW50ZXI+DQoNCjxjZW50ZXI+DQoNCjxiPkludGVncmFudGVzOjwvYj48YnI+IDxiPlNvc2EgUMOpcmV6LCBTZWJhc3Rpw6FuIEFsb25zbzwvYj4gPGJyPiA8Yj4gUml2ZXJhIENhbWFjaG8sIFByaXNjaWxhIFlhbWlsZXQgPC9iPiA8YnI+DQoNCjxoMT4NCg0KWyoqKkNMQVNJRklDQUNJw5NOIERFIENSw4lESVRPUyBVVElMSVpBTkRPIFTDiUNOSUNBUyBERSBSRUdVTEFDScOTTiBTT0JSRSBMQSBCQVNFIERFIERBVE9TIENSRURJVCBHRVJNQU4qKipde3N0eWxlPSJjb2xvcjpibGFjayJ9DQoNCjwvaDE+DQoNCjwvY2VudGVyPg0KDQo8Y2VudGVyPg0KDQo8aT5DcmVhZG86IDIzLzA5LzIwMjENCg0KPC9jZW50ZXI+DQoNCiMgUmVzdW1lbg0KDQo8cCBhbGlnbj0ibGVmdCI+DQoNCkNvbiBlbCBvYmpldGl2byBkZSBkZXRlcm1pbmFyIHVuIG1vZGVsbyBkZSBjcmVkaXQgc2NvcmluZyBwYXJhIGxhIGJhc2UgZGUgZGF0b3MgQ3JlZGl0IEdlcm1hbiwgc2UgdXRpbGl6YXJvbiBsYXMgdMOpY25pY2FzIGRlIHJlZ3VsYWNpw7NuOiBSaWRnZSwgTGFzc28geSBFbGFzdGljIE5ldC4NClV0aWxpemFuZG8gZWwgbW9kZWxvIHByaW5jaXBhbCBMb2dpdCwgYW5hbGl6YW1vcyBlbiBiYXNlIGEgZXN0ZSBzdXMgcGFyw6FtZXRyb3MgzrIsIGVuY29udHJhbW9zIGxvcyByZXN1bHRhZG9zIGRvbmRlLCBlbCBtb2RlbG8gTG9naXQgdGllbmUgdW5hIHByZWNpc2nDs24gZGVsIDM3LjIlLCBlbCBtb2RlbG8gbGFzc28gcHJlc2VudGEgdW5hIHByZWNpc2nDs24gZGVsIDc2LjclLCBlbCBtb2RlbG8gUmlkZ2UgZGUgNzUuNiUgeSBlbCBtb2RlbG8gRWxhc3RpYyBuZXQgZGUgNjkuMiUuDQpGaW5hbG1lbnRlLCBsbGVnYW1vcyBhIGxhIGNvbmNsdXNpw7NuIHF1ZSBlbCBtb2RlbG8gTGFzc28gcHJlc2VudGEgdW5hIG1lam9yIHByZWRpY2Npw7NuIGRlIGxvcyBkYXRvcywgY29uIHVuYSBwcmVjaXNpw7NuIGVuIGxvcyBkYXRvcyBkZSBlbnRyZW5hbWllbnRvIGRlIDgyLjklIHkgcGFyYSBsb3MgZGF0b3MgZGUgcHJ1ZWJhIDc2LjclLCBzaWVuZG8gZXN0ZSBzdXBlcmlvciBhIGxvcyBtb2RlbG9zIHByb3B1ZXN0b3MuDQoNCjwvcD4NCg0KKipQYWxhYnJhcyBjbGF2ZXM6IFJpZGdlLCBMYXNzbyB5IEVsYXN0aWMgTmV0LCBCZXRhIHkgTG9naXQqKg0KDQojIEFic3RyYWMNCg0KSW4gb3JkZXIgdG8gZGV0ZXJtaW5lIGEgY3JlZGl0IHNjb3JpbmcgbW9kZWwgZm9yIHRoZSBDcmVkaXQgR2VybWFuIGRhdGFiYXNlLCB0aGUgZm9sbG93aW5nIHJlZ3VsYXRpb24gdGVjaG5pcXVlcyB3ZXJlIHVzZWQ6IFJpZGdlLCBMYXNzbyBhbmQgRWxhc3RpYyBOZXQuDQpVc2luZyB0aGUgbWFpbiBMb2dpdCBtb2RlbCwgd2UgYW5hbHl6ZWQgaXRzIM6yIHBhcmFtZXRlcnMgYmFzZWQgb24gdGhpcywgd2UgZm91bmQgdGhlIHJlc3VsdHMgd2hlcmUsIHRoZSBMb2dpdCBtb2RlbCBoYXMgYW4gYWNjdXJhY3kgb2YgMzcuMiUsIHRoZSBsYXNzbyBtb2RlbCBoYXMgYW4gYWNjdXJhY3kgb2YgNzYuNyUsIHRoZSBSaWRnZSBtb2RlbCBvZiA3NS42JSBhbmQgdGhlIEVsYXN0aWMgbmV0IG1vZGVsIG9mIDY5LjIlLg0KRmluYWxseSwgd2UgcmVhY2hlZCB0aGUgY29uY2x1c2lvbiB0aGF0IHRoZSBMYXNzbyBtb2RlbCBwcmVzZW50cyBhIGJldHRlciBwcmVkaWN0aW9uIG9mIHRoZSBkYXRhLCB3aXRoIGEgcHJlY2lzaW9uIGluIHRoZSB0cmFpbmluZyBkYXRhIG9mIDgyLjklIGFuZCBmb3IgdGhlIHRlc3QgZGF0YSA3Ni43JSwgdGhpcyBiZWluZyBzdXBlcmlvciB0byB0aGUgcHJvcG9zZWQgbW9kZWxzLg0KDQoqKktleXdvcmRzOiBSaWRnZSwgTGFzc28gYW5kIEVsYXN0aWMgTmV0LCBCZXRhIGFuZCBMb2dpdCoqDQoNCiMgSW50cm9kdWNjacOzbg0KDQpVbmEgY29tcGHDscOtYSBmaW5hbmNpZXJhIGVzIHVuYSBlbnRpZGFkIHF1ZSBjdWVudGEgY29tbyBvYmpldGl2byBwcmluY2lwYWwgcGVyY2liaXIgbGEgbWF5b3IgY2FudGlkYWQgZGUgcmVjdXJzb3MgZGUgY2FwaXRhbCBwYXJhIHBvZGVyIHRlbmVyIHNvbHZlbmNpYSB5IHJlYWxpemFyIGxhIGZhY2lsaXRhY2nDs24gdGFudG8gZGUgc2VydmljaW9zIGNvbW8gZGUgYmllbmVzLCBwb3IgbWVkaW8gZGUgb3BlcmFjaW9uZXMgZGUgY3LDqWRpdG8uDQooVGlncmVyb3MsIDIwMjApIExhcyBpbnN0aXR1Y2lvbmVzIGZpbmFuY2llcmFzIGNvbnNpZGVyYW4gaW1wb3J0YW50ZSBsYSBsaXF1aWRleiBxdWUgbGUgYWRtaXRhIGN1bXBsaXIgc3VzIG9ibGlnYWNpb25lcyBkZSBwcmVzdGFyIGNyw6lkaXRvIGEgc3VzIGNsaWVudGVzLg0KRXN0YXMgaW5zdGl0dWNpb25lcyB0YW1iacOpbiB0aWVuZW4gY29tbyBmaW5hbGlkYWQgZXZpdGFyIGVsIG1lbm9yIHJpZXNnbyBxdWUgc2UgZW5mcmVudGFuIGFudGUgbGEgYXByb2JhY2nDs24gZGUgdW4gY3LDqWRpdG8uDQpFbiBQZXLDuiwgZWwgYnVlbiBkZXNhcnJvbGxvIHkgZWwgYm9vbSBkZSBsYXMgTWljcm8gZmluYW56YXMgc2UgaGEgZnVuZGFtZW50YWRvIGVuIGltcG9ydGFudGVzIHB1bnRvcyBjb21vOiB0cmFuc3BhcmVuY2lhIGRlIGNlbnRyYWxlcyBkZSByaWVzZ28geSBub3JtYXMgZGUgaW5mb3JtYWNpw7NuIGZpbmFuY2llcmEsIGFwcm9waWFkb3Mgc2lzdGVtYXMgZGUgdGVjbm9sb2fDrWFzIGNyZWRpdGljaWFzLCB1biBtYXJjbyByZWd1bGF0b3JpbyBkZSBhcG95byBpbnN0aXR1Y2lvbmFsLCBhbHRhIHByb21vY2nDs24gZGUgdHJhbnNwYXJlbmNpYSBlbiBwcmVjaW9zIHkgcG9yIMO6bHRpbW8gbGEgY29tcGV0ZW5jaWEgZW4gZWwgbWVyY2Fkby4NCk5vIG9ic3RhbnRlLCBlc3RhcyBpbnN0aXR1Y2lvbmVzIHNlIHZlbiBhbWVuYXphZGFzIHBvciBlbCBpbmdyZXNvIGRlIG51ZXZhcyBlbXByZXNhcyBvbGlnb3DDs2xpY2FzIGNvbiBtYXlvcmVzIGNhcGl0YWxlcyB5IHBvciBzdXB1ZXN0bywgbWVqb3JlcyB0ZWNub2xvZ8OtYXMgcGFyYSBsYSBkZXRlY2Npw7NuIGRlIGxvcyByaWVzZ29zIGNyZWRpdGljaW9zLg0KKENhbGRlcsOzbiwgMjAyMCkgRXMgcG9yIGVzbywgcXVlIGVzIGZ1bmRhbWVudGFsIGRlc2Fycm9sbGFyIG1lY2FuaXNtb3MgcXVlIGF5dWRlbiBhIHJlZHVjaXIgZXN0ZSBwcm9ibGVtYSBkZSByaWVzZ28gY3JlZGl0aWNpbywgcGFyYSBhc8OtIHBvZGVyIGlkZW50aWZpY2FyIGNsaWVudGVzIHF1ZSBubyBjdW1wbGFuIGNvbiBzdXMgb2JsaWdhY2lvbmVzLCBlcyBkZWNpciBxdWUgcHJlc2VudGVuIGluc29sdmVuY2lhIHBhcmEgY3VsbWluYXIgc2F0aXNmYWN0b3JpYW1lbnRlIHVuIGNyw6lkaXRvLg0KUHVlcyBsYSBtYXlvciBpbnF1aWV0dWQgZGUgZXN0YXMgaW5zdGl0dWNpb25lcyBmaW5hbmNpZXJhcyBlcyB0ZXJtaW5hciBlbiBjYXNvcyBqdXLDrWRpY29zIGNvbiBlbCBmaW4gZGUgcmVjdXBlcmFyIHNvbG8gc3UgY2FwaXRhbCBlIGlkZWFuZG8gcHJvY2Vzb3MgZGUgZ2VzdGnDs24gZGUgY2FydGVyYXMgYSBsb3MgY2xpZW50ZXMgZGV1ZG9yZXMuDQooVGlncmVyb3MsIDIwMjApIExhIHByb2JsZW3DoXRpY2EgaWRlbnRpZmljYWRhIGVzIMK/Q8OzbW8gYXBsaWNhciBsYXMgdMOpY25pY2FzIGRlIHJlZ3VsYWNpw7NuIHBhcmEgbGEgY2xhc2lmaWNhY2nDs24gY3JlZGl0aWNpYSBkZSBsb3MgZnV0dXJvcyBjbGllbnRlcyBkZSBDcmVkaXQgR2VybWFuPw0KRW4gZWwgcHJlc2VudGUgaW5mb3JtZSBzZSBhbmFsaXphIGxhIGRhdGFzZXQgZGUgbGEgZW50aWRhZCBhbGVtYW5hIGRlIHByw6lzdGFtb3MgcGFydGljdWxhcmVzIGxsYW1hZGEgQ3JlZGljdCBHZXJtYW4sIGFwbGljYW5kbyBsYXMgdMOpY25pY2FzIGRlIHJlZ3VsYWNpw7NuIChsYXNzbywgcmlnZGUgeSBlbGFzdGljIG5ldCkgY29uIGVsIG9iamV0aXZvIGRlIGRldGVybWluYXIgZWwgcHJvbsOzc3RpY28gZGUgY2xhc2lmaWNhY2nDs24gY3JlZGl0aWNpYSBwYXJhIGZ1dHVyb3MgY2xpZW50ZXMgZGUgQ3JlZGl0IEdlcm1hbiwgcGFyYSBsb2dyYXJsbyBpZGVudGlmaWNhcmVtb3MgZWwgbWVqb3IgbW9kZWxvIGNvbiBsYXMgdMOpY25pY2FzIGRlIHJlZ3VsYWNpw7NuIHBhcmEgbGEgY2xhc2lmaWNhY2nDs24gY3JlZGl0aWNpYSwgYW5hbGl6YXJlbW9zIGxvcyBhdHJpYnV0b3MgY3JlZGl0aWNpb3MgZGUgbG9zIGNsaWVudGVzIGRlIENyZWRpdCBHZXJtYW4uDQpFbiBlbCDDoW1iaXRvIGludGVybmFjaW9uYWwsIFFpbiwgQy4NCigyMDIxKSBlbiBzdSBpbnZlc3RpZ2FjacOzbiBwcm9wb25lIGVsIHVzbyBkZSBlWHRyZW1lIEdyYWRpZW50IEJvb3N0aW5nIGNvbW8gbW9kZWxvIHBhcmEgbGEgZXZhbHVhY2nDs24gY3JlZGl0aWNpYSwgYmFzYWRvIGVuIHVuYSBvcHRpbWl6YWNpw7NuIGRlIHBhcnTDrWN1bGFzLCBhZGVtw6FzIHJlYWxpemEgdW5hIGNvbXBhcmFjacOzbiBkZSBjbGFzaWZpY2Fkb3JlcyBub3JtYWxtZW50ZSB1c2Fkb3MgZW4gc2ltaWxhcmVzIGludmVzdGlnYWNpb25lcywgbcOpdG9kb3MgaGlwZXJwYXLDoW1ldHJvcyBkZSBvcHRpbWl6YWNpw7NuIHkgYWxnb3JpdG1vcyB0cmFkaWNpb25hbGVzIHV0aWxpemFkb3MgZW4gZWwgYXByZW5kaXphamUgYXV0b23DoXRpY28uDQpMb3MgcmVzdWx0YWRvcyBhcnJvamFyb24gcXVlIGVsIG1vZGVsbyBlWHRyZW1lIEdyYWRpZW50IEJvb3N0aW5nIGZ1ZSBzdXBlcmlvciBhbCByZXN0byBkZSBtb2RlbG9zIGFuYWxpemFkb3MsIGluY2x1c28gbGEgb3B0aW1pemFjacOzbiBkZWwgZW5qYW1icmUgZGUgcGFydMOtY3VsYXMgZGVsIG1vZGVsbyByZXN1bHRhIHNlciBtZWpvciBxdWUgb3RyYXMgZXN0cmF0ZWdpYXMgZGUgb3B0aW1pemFjacOzbi4NClNlIG9idHV2byBjb21vIGNvbmNsdXNpw7NuIHF1ZSBhIG5pdmVsIGRlIHJlbmRpbWllbnRvIFhHQm9vc3Qgb3B0aW1pemFkbyBjb24gbGFzIHTDqWNuaWNhcyBSUywgR1MgWSBUUEUgZXMgaW5mZXJpb3IgYWwgcmVuZGltaWVudG8gZGUgQVBTTy1YR0Jvb3N0Lg0KUGFyZG8sIE8uDQooMjAyMCkgRW4gc3UgdHJhYmFqbyByZWFsaXrDsyB1biBtb2RlbG8gbG9naXQgcGFyYSBldmFsdWFyIGVsIHJpZXNnbyBjcmVkaXRpY2lvIGRlIHVuYSBjb29wZXJhdGl2YSBlbiBWaWxsYXZpY2VuY2lvLCBwYXJhIGVzdGEgaW52ZXN0aWdhY2nDs24gdXRpbGl6YXJvbiB1biBtb2RlbG8gY3VhbGl0YXRpdm8sIGVsIG1vZGVsbyBsb2dpdCwgc2UgdHJhYmFqYSB1bmEgdmFyaWFibGUgdGlwbyBiaW5hcmlvLCBjdWFuZG8gZWwgbsO6bWVybyB0aWVuZGUgYSAxIHF1aWVyZSBkZWNpciBxdWUgbG9zIGNsaWVudGVzIGFzb2NpYWRvcyBubyB0aWVuZW4gYnVlbiBkZXNlbXBlw7FvLCB5IHBvciBsbyBjb250cmFyaW8gZWwgMCByZXByZXNlbnRhIGVsIGJ1ZW4gZGVzZW1wZcOxbyBlbiBzdSBjYXJ0ZXJhLg0KRWwgcmVzdWx0YWRvIGVzIHF1ZSBsb3MgZmFjdG9yZXMgZGUgcmllc2dvIGRlIGxvcyBzb2Npb3MgdmFyb25lcyBmdWVyb24gbGEgY29ydGEgZWRhZCB5IHNlciBzb2x0ZXJvLCBsb3MgYmFqb3MgcmVjdXJzb3MsIGFkZW3DoXMgZGVsIHRpZW1wbyBsaW1pdGFkbyBkZSBwZXJ0ZW5lbmNpYSBhIGxhIGNvb3BlcmF0aXZhLCB0cmFiYWphciBlbiBlbnRpZGFkZXMgcHJpdmFkYXMsIHkgdGVuZXIgcHLDqXN0YW1vcyBncmFuZGVzIGNvbiBhbXBsaW9zIHBsYXpvcyBkZSBwYWdvLg0KRWwgcG9yY2VudGFqZSBkZSBhY2llcnRvcyBidWVub3MgZGVsIG1vZGVsbyBlcyBkZSA2My45NSUsIGVzIGRlY2lyIGVsIG5pdmVsIGRlIHByZWRpY2Npw7NuIGVzIGFjZXB0YWJsZSwgc2UgZW5jb250csOzIHF1ZSBsb3MgYXNvY2lhZG9zIHJlZHVjZW4gZW4gdW4gMC40NSUgZWwgcmllc2dvIGRlIGluY3VtcGxpbWllbnRvIGNhZGEgYcOxbyB5IHNpIGF1bWVudGFuIHN1cyBpbmdyZXNvcywgcG9yIGNhZGEgMSUgYWRpY2lvbmFsIHN1IG5pdmVsIGRlIGluY3VtcGxpbWllbnRvIGRpc21pbnV5ZSBlbiA2Ljc0JS4NClBvciDDumx0aW1vLCBzZSBhZmlybWEgbGEgaW1wb3J0YW5jaWEgZGVsIG1vZGVsbyBsb2dpdCBjb21vIGhlcnJhbWllbnRhIGN1YW50aXRhdGl2YSBwYXJhIHByZWRlY2lyIHBvc2libGVzIHJpZXNnb3MuDQpHdWV2YXJhIEsuDQooMjAyMCkgRW4gc3UgdHJhYmFqbyBkZSBpbnZlc3RpZ2FjacOzbiByZWFsaXphIHVuIGFuw6FsaXNpcyBkZSBsYSBkYXRhc2V0IGRlIExlbmRpbmdDbHViLCB1bmEgZW50aWRhZCBmaW5hbmNpZXJhIGVzdGFkb3VuaWRlbnNlLCBjb24gbGEgZmluYWxpZGFkIGRlIGNsYXNpZmljYXIgc3VzIGNsaWVudGVzIG1lZGlhbnRlIG1vZGVsb3MgZGUgcmVncmVzacOzbiwgZXMgcG9yIGVzbyBxdWUgYXBsaWNhIGNvbW8gbWV0b2RvbG9nw61hIHVuYSBtw6FxdWluYSBkZSBzb3BvcnRlIHZlY3RvcmlhbCBxdWUgbGUgcGVybWl0YSBjYXRhbG9nYXIgYSBsb3MgdXN1YXJpb3MgY29tbyAnJ21hbG9zIG8gYnVlbm9zJycgeSBhc8OtIHJlYWxpemFyIGxhIGFzaWduYWNpw7NuIGNyZWRpdGljaWEgYSBjYWRhIHVubyBkZSBlbGxvcy4NCkxvcyByZXN1bHRhZG9zIG9idGVuaWRvcyBjb24gS2VybmVsIHJhZGlhbCByZXByZXNlbnRhbiB1biA5NiUgZGUgbGEgY2xhc2lmaWNhY2nDs24gZGUgbGEgYmFzZSBxdWUgZnVlIGNyZWFkYSwgZGUgZXN0b3MgZWwgODMlIGRlIHZlY3RvcmVzIGNvcnJlc3BvbmRlIGEgdW5hIGNsYXNpZmljYWNpw7NuICcnQycnLg0KRXNvIHF1aWVyZSBkZWNpciBxdWUgZXhpc3RlIHVuIGRlc2JhbGFuY2UgZW4gbG9zIGRhdG9zIHV0aWxpemFkb3MuDQpTZSBjb25jbHV5w7MgY29uIHVuYSB0YXNhIGRlIHBvc2l0aXZvcyBtYXlvciBhIDUwIHB1bnRvcyBwb3JjZW50dWFsZXMuDQpFbCBlcnJvciBkZSBsYSBiYXNlIGJhbGFuY2VhZGEgcmVwcmVzZW50w7MgdW4gMCw0NjE0LCBtaWVudHJhcyBxdWUgbGEgb3JpZ2luYWwgZnVlIG1lbm9yIHkgZnVlIGRlIDAsMTQ4Ni4NCkxlYWwgQS4NCigyMDE4KS4NCkVuIHN1IGludmVzdGlnYWNpw7NuLCB0dXZvIGNvbW8gcHJvcMOzc2l0byBlbCBhbsOhbGlzaXMgZGUgcmllc2dvIGNyZWRpdGljaW8gZGUgdW4gbW9kZWxvIENyZWRpdCBTY29yaW5nIHBhcmEgbGEgZW1wcmVzYSBGYW50YXPDrWEgUy5BLiBVdGlsaXrDsyB1biBtw6l0b2RvIGRlIGVzdHVkaW8gRGVscGhpIGVsIGN1YWwgbGUgcGVybWl0acOzIGVzdGFibGVjZXIgdmFyaWFibGVzIHRhbnRvIGN1YW50aXRhdGl2YXMgY29tbyBjdWFsaXRhdGl2YXMgcGFyYSByZWN1cnJpciBhIGxhIGV2YWx1YWNpw7NuIGRlIGxhIGNhbGlkYWQgZGUgY2FkYSBjbGllbnRlLCBhbGd1bmFzIGRlIHN1cyB2YXJpYWJsZXMgY3VhbGl0YXRpdmFzIGZ1ZXJvbiBsb3MgdGVtYXMgbGVnYWxlcyB5IGNvbWVyY2lhbGVzLCBsYSBhbnRpZ8O8ZWRhZCB5IGNvbnRyaWJ1Y2nDs24gZGUgbGEgZW1wcmVzYS4NCkxvcyByZXN1bHRhZG9zIG1vc3RyYXJvbiBxdWUgZWwgODEsODIlIGRlIGNsaWVudGVzIGN1bXBsw61hbiBsb3MgbcOtbmltb3MgcmVxdWlzaXRvcyBwYXJhIGVsIGNyw6lkaXRvLCBtaWVudHJhcyBxdWUgZWwgMTgsMTglIG5vIGxvIGhhY8OtYW4uDQpGaW5hbG1lbnRlLCBsb3MgYXV0b3JlcyBjb25jbHV5ZXJvbiBxdWUgZWwgc2lzdGVtYSBkZSBnZXN0acOzbiBxdWUgcHJlc2VudGEgZGljaGEgZW1wcmVzYSBubyBjdW1wbGUgY29ycmVjdGFtZW50ZSBzdSBmdW5jacOzbiwgZWwgbW9kZWxvIENyZWRpdCBTY29yaW5nIGxlIHNlcsOhIGRlIG1heW9yIGVmaWNpZW5jaWEgYSBGYW50YXPDrWEgUy5BLiwgcHVlcyBwcmVzZW50YSBtw6FzIGZsZXhpYmlsaWRhZCB5IG9iamV0aXZpZGFkIGVuIGxhIGNsYXNpZmljYWNpw7NuIGRlIGNyw6lkaXRvcy4NClPDoW5jaGV6IFMuDQoyMDE2IERlc2Fycm9sbGEgdW4gZXN0dWRpbyBxdWUgbGUgcGVybWl0ZSBjYWxjdWxhciBsYSBlZmljaWVuY2lhIHJlbGF0aXZhIGRlIGxvcyBhY3RvcmVzIGRlIGNyw6lkaXRvIGVuIHVuIGJhbmNvLg0KTGEgaW52ZXN0aWdhY2nDs24gdXRpbGl6w7MgbGEgcHJvZ3JhbWFjacOzbiBsaW5lYWwsIG1lZGlhbnRlIGVsIERFQSBjb24gdW4gcHJvY2VzbyBkb2JsZSBwYXJhIGxhIG9wdGltaXphY2nDs24sIGVsIGJhbmNvIGNvbG9tYmlhbm8gZnVlIGVsIG9iamV0byBkZSBlc3R1ZGlvLCBlbCBjdWFsIGNvbnRhYmEgY29uIGNpbmNvIGJhbmRhcyBkZSBhY3RpdmlkYWRlcyBkZSBjcsOpZGl0by4NCkxvcyByZXN1bHRhZG9zIGFycm9qYXJvbiBxdWUgbGFzIHpvbmFzIGdlb2dyw6FmaWNhcyBjb24gbWVqb3IgZGVzZW1wZcOxbyBmdWVyb24gU3VyIHkgQ2FmZXRlcmEsIHBvciBvdHJvIGxhZG8sIGxhIGJhbmRhIGNvbiBtYXlvciBlZmljaWVuY2lhIGZ1ZXJvbiBsYSBvZmljaWFsIHkgbGEgYWdyb3BlY3VhcmlhLg0KTWllbnRyYXMgcXVlIGxhIGJhbmNhIHkgem9uYSBtw6FzIGluZWZpY2llbnRlcyBmdWVyb24gbGEgcGVyc29uYWwgeSBsYSBDb3N0YSwgcmVzcGVjdGl2YW1lbnRlLg0KTGEgaW52ZXN0aWdhY2nDs24gY29uY2x1eWUgY29uIGxhIHZhbGlkYWNpw7NuIGRlbCBtw6l0b2RvIHV0aWxpemFkbywgeWEgcXVlIHNpcnZlIHBhcmEgYW5hbGl6YXIgc2l0dWFjaW9uZXMgcmVhbGVzIHBhcmEgbGEgY29vcGVyYXRpdmEuDQpMw7NwZXogUm9kcsOtZ3VleiwgKDIwMTYpLg0KcHJvcHVzbyBlbiBzdSBpbnZlc3RpZ2FjacOzbiByZWFsaXphciB1biBtb2RlbG8gb250b2zDs2dpY28gY29uIGVsIG1vZGVsbyByZWxhY2lvbmFsIHBhcmEgYW5hbGl6YXIgY3LDqWRpdG9zIGZpbmFuY2llcm9zIG1lZGlhbnRlIGxhIHJlbGFjacOzbiBkZSBkaXN0aW50YXMgYmFzZXMgZGUgZGF0b3MuDQpTZSBoaXpvIHVzbyBkZSBzaXN0ZW1hcyBwYXJhIHJlYWxpemFyIGxhIGV2YWx1YWNpw7NuIGFwb3lhZG8gZW4gb250b2xvZ8OtYXMgY29uIGxhIGhlcnJhbWllbnRhIFByb3TDqWfDqSA1LjUgcGFyYSBlbCBCYW5jbyBOYWNpb25hbCBkZSBDdWJhLCBhcGxpY2FuZG8gZWwgbcOpdG9kbyBzZSBtb2RlbMOzIHVuIHNpc3RlbWEgZmxleGlibGUgc2VuY2lsbG8gbWFudGVuaW1pZW50byB5IGEgbGEgdmV6IHJldXRpbGl6YWJsZS4NCkZpbmFsbWVudGUgc2UgcHVkaWVyb24gb2J0ZW5lciBhIHBhcnRpciBkZSBsb3MgbcOpdG9kb3MsIDIgb250b2xvZ8OtYXMgcXVlIGN1bXBsZW4gZWwgb2JqZXRpdm8gZGUgY2xhc2lmaWNhciBsYXMgdmFyaWFibGVzIGRlbCBmaW5hbmNpYW1pZW50byB5IHBvciBsbyB0YW50byBlbCByaWVzZ28gY3JlZGl0aWNpbyBlbiBsYXMgZW50aWRhZGVzLg0KQmFuZGEsIE8uDQooMjAxNCkuDQpFbiBzdSBpbmZvcm1lLCBhbnRlIGVsIHByb2JsZW1hIGRlbCBjcmVkaXQgc2NvcmluZyBkZSBsYXMgaW5zdGl0dWNpb25lcyBkZSBtaWNyb2ZpbmFuemFzIHJlYWxpemEgbGEgYXBsaWNhY2nDs24gdGXDs3JpY2EgZGVsIG3DqXRvZG8gSG9sdC1XaW50ZXJzIHBhcmEgZXZhbHVhciBhZGVjdWFkYW1lbnRlIGxvcyBjcsOpZGl0b3MuDQpDb21vIG3DqXRvZG8gbWV0b2RvbMOzZ2ljbyB0ZcOzcmljbyBwYXJhIGFuYWxpemFyIGVsIHJpZXNnbyBjcmVkaXRpY2lvIGRlIGNvbmNlYmlyIG1pY3JvY3LDqWRpdG9zIGZ1ZSBhIHBhcnRpciBkZSBmbHVqb3MgZGUgZWZlY3Rpdm8gZXNwZXJhZG9zLCBpbmNsdXllbmRvIGxhIGVzdGFjaW9uYWxpZGFkIGRlIGVsbG9zLCBzZSBlbXBsZcOzIGVsIG3DqXRvZG8gSG9sdC1XaW50ZXJzIGRlIHByb27Ds3N0aWNvIG5vIGxpbmVhbC4NCkxvcyByZXN1bHRhZG9zIHJldmVsYW4gcXVlIGxvcyBjbGllbnRlcyBkZSBsYXMgSU1GIHBvc2VlbiBkaXN0aW50YXMgY2FyYWN0ZXLDrXN0aWNhcyBwYXJhIGVuY29udHJhciBsYSBwcm9iYWJpbGlkYWQgZGUgcXVlIGN1bXBsYW4gY29uIGVsIHBhZ28gZGVsIGNyw6lkaXRvLCBlcyBwb3IgZXNvIHF1ZSBzdXMgbW9kZWxvcyBkZWJlbiBzZXIgZGlzdGludG9zLg0KQ29uY2x1ecOzIHF1ZSBlbCBjb25vY2ltaWVudG8gZGVsIGNsaWVudGUgc2VhIGZ1bmRhbWVudGFsIGVuIGVsIHByb2Nlc28gZGUgb3RvcmdhbWllbnRvIGRlIGNyw6lkaXRvLCB0YW1iacOpbiBlcyBkZSBzdW1hIGltcG9ydGFuY2lhIHF1ZSBsYXMgaW1mIGN1ZW50ZW4gY29uIHVuYSBtZXRvZG9sb2fDrWEgcXVlIGxlcyBwZXJtaXRhIGRpc2NyaW1pbmFyIG9iamV0aXZhbWVudGUgbGFzIHNvbGljaXR1ZGVzIGRlIGNyw6lkaXRvLg0KKE1lZGluYSAmIFNlbHZhLCAyMDEzKSBFbiBzdSBpbnZlc3RpZ2FjacOzbiByZWFsaXphIHVuIGFuw6FsaXNpcyBkZWwgQ3JlZGl0IFNjb3JpbmcgcGFydGllbmRvIGRlIGluZm9ybWFjacOzbiBleGlzdGVudGUgZW50cmUgZWwgY2xpZW50ZSB5IGxhIG9wZXJhY2nDs24uDQpVdGlsaXrDsyB1biBzaXN0ZW1hIGRlIHB1bnR1YWNpw7NuIGN1YWxpdGF0aXZvIHBhcmEgb2J0ZW5lciBjb21vIHJlc3B1ZXN0YSBsYSBwcm9iYWJpbGlkYWQgZGUgcGFnbyBkZSBjYWRhIGNsaWVudGUsIGRlcGVuZGllbmRvIHNpIGxhIGZ1bmNpw7NuIGZ1ZSBjb25vY2lkYSBvIG5vLCBwdWRpZXJvbiBhcGxpY2FyIG1vZGVsb3MgcGFyYW3DqXRyaWNvcyBvIG5vIHBhcmFtw6l0cmljb3MuDQpDb21vIHJlc3VsdGFkbyBzZSBvYnR1dm8gcXVlLCBkZSBsYSBldmFsdWFjacOzbiBkZSAxNDQ2IGluZGl2aWR1b3MsIDk4NCBmdWVyb24gY2xhc2lmaWNhZG9zIGNvbW8gbm8gbW9yb3NvcyB5IDQ2MiBmdWVyb24gbW9yb3Nvcy4NClBhcmEgZXN0ZSBhbsOhbGlzaXMgZWwgY2xpZW50ZSBlcmEgbW9yb3NvIHNpIHRlbsOtYSBtw6FzIGRlIDIgbWVzZXMgZGUgcmV0cmFzbyBlbiBlbCBwYWdvIGRlbCBjcsOpZGl0by4NCkZpbmFsbWVudGUgc2UgY29uY2x1eWUgcXVlIGVsIG1vZGVsbyBubyBwYXJhbcOpdHJpY28gdXNhZG8sIGVsIGFsZ29yaXRtbyBDQVJUIHByZXNlbnRhIG1heW9yIGVmaWNpZW5jaWEgcXVlIGxvcyBwYXJhbcOpdHJpY29zLCBwdWVzIG5vIGxhbnphIHBvcmNlbnRhamVzIGVsZXZhZG9zIGRlIGNsaWVudGVzIGR1ZG9zb3MuDQpIb25nbGlhbiwgSC4NCigyMDE4KSByZWFsaXphIHN1IGludmVzdGlnYWNpw7NuIGNvbiBsYSBmaW5hbGlkYWQgZGUgcHJvYmFyIHVuIG5vdmVkb3NvIG3DqXRvZG8gcGFyYSBsYSBjbGFzaWZpY2FjacOzbiBjcmVkaXRpY2lhIGRlIG1heW9yIGVmaWNpZW5jaWEsIHBhcmEgZWxsbyBnZW5lcmEgc3ViY29uanVudG9zIHF1ZSBzZSBwdWVkZW4gYWp1c3RhciB5IGxvcyBhbXBsw61hIHV0aWxpemFuZG8gZWwgQmFsYW5jZUNhc2NhZGUsIGRlc3B1w6lzIHNlIGFzZWd1cmEgZGUgZGlzbWludWlyIGxvcyBkYXRvcyBuZWdhdGl2b3MgeSBtZWpvcmEgZWwgcmVuZGltaWVudG8gZGUgbGEgcHJlZGljY2nDs24uDQpFc3RlIG1vZGVsbyB0aWVuZSBjb21vIGNsYXNpZmljYWRvcmVzIGVsIGF1bWVudG8gZGUgZ3JhZGllbnRlIGEgbml2ZWwgZXh0cmVtbyB5IGVsIGJvc3F1ZSBhbGVhdG9yaW8sIHNlIG9idHV2byBjb21vIHJlc3VsdGFkb3MgcXVlIGxhIG1lZGlhIGRlIGRlc2VtcGXDsW8gZGVsIG1vZGVsbyByZWFsaXphZG8gZXMgc3VwZXJpb3IgeWEgcXVlIGRlc2Fycm9sbGEgc2F0aXNmYWN0b3JpYW1lbnRlIGVsIGFuw6FsaXNpcyBjcmVkaXRpY2lvLCB5IGVzIG1lam9yIHF1ZSBvdHJvcyBzaXN0ZW1hcyB5YSBxdWUgc2UgZXZpZGVuY2lhIGFsIG1lZGlyIGVsIGNvbmp1bnRvIGRlIGRhdG9zLg0KV2FuZywgRy4NCigyMDEyKSBlbiBzdSBpbnZlc3RpZ2FjacOzbiBwcmVzZW50YSBkb3MgbW9kZWxvcyBkZSDDoXJib2wgZGUgY29uanVudG9zIGRlIGVzdHJhdGVnaWEgZHVhbCBwYXJhIGRpc21pbnVpciBlbCByaWVzZ28gZGUgdHJhYmFqYXIgY29uIGRhdG9zIHJlZHVuZGFudGVzIHkgZWwgZXhjZXNvIGRlIGRhdG9zIGRlIHJ1aWRvLCBsb3Mgw6FyYm9sZXMgZXN0cmF0w6lnaWNvcyBjb24gbG9zIHF1ZSBzZSB0cmFiYWphIHNvbiBSUy1CYWdnaW5nIERUIHkgQmFnZ2luZy1SUyBEVCwgc2UgdXRpbGl6YSB1bmEgZXZhbHVhY2nDs24gaW50ZWdyYWwgeSBleHBlcmltZW50YWwgY29uIGVsIGZpbiBkZSByYXRpZmljYXIgbG8gZWZpY2F6IGRlIGxvcyBtw6l0b2Rvcy4NClNlIG9idHV2byBjb21vIHJlc3VsdGFkbyBxdWUgdW5vIGRlIGxvcyBEVCBwcmVzZW50YSBsYSBtZW5vciBtZWRpYSBlbnRyZSBsb3Mgw7puaWNvcyA1IGNsYXNpZmljYWRvcmVzLCBwb3Igb3RybyBsYWRvLCBzZSBvYnRpZW5lIHF1ZSBsb3MgbWVqb3JlcyBtw6l0b2RvcyBncmFjaWEgYSBzdSBwcmVjaXNpw7NuIHNvbiBSUy1CYWdnaW5nIERUIHkgQmFnZ2luZy1SUyBEVC4gRmluYWxtZW50ZSBzZSBjb25jbHV5ZSBxdWUgYW1ib3MgbcOpdG9kb3MgcHVlZGVuIHNlciB1c2Fkb3MgcGFyYSBlbCBhbsOhbGlzaXMgY3JlZGl0aWNpbyBkZSBpbnN0aXR1Y2lvbmVzIGZpbmFuY2llcmFzIHB1ZXMgc29uIGVmaWNhY2VzIGVuIGxhIHByw6FjdGljYSBkZWwgY3JlZGl0IHNjb3JpbmcuDQpBIG5pdmVsIG5hY2lvbmFsOiBRdWlyb3osIEIuDQooMjAyMCkgcmVhbGl6w7Mgc3UgaW52ZXN0aWdhY2nDs24gYmFzYWRhIGVuIGVsIHBsYW50ZWFtaWVudG8gZGUgdW4gbW9kZWxvIGNyZWRpdCBTY29yaW5nIHBhcmEgcmVkdWNpciBlbCByaWVzZ28gY3JlZGl0aWNpbyBlbiBsYSBDYWphIE11bmljaXBhbCBQaXVyYSwgcGFyYSBsb2dyYXIgc3Ugb2JqZXRpdm8gdXRpbGl6w7MgbGEgcmVncmVzacOzbiBsb2fDrXN0aWNhIHRpcG8gYmluYXJpYSBsYSBjdWFsIGxlIHBlcm1pdGEgcmVhbGl6YXIgdW4gbW9kZWxvIHF1ZSByZXN1bHRlIHVuYSB2YXJpYWJsZSBkZXBlbmRpZW50ZSBkaXNjcmV0YSBkaWNvdMOzbWljYS4NCkEgcGFydGlyIGRlIHRvZG8gZWwgcHJvY2VkaW1pZW50byBzZSBvYnR1dm8gcXVlIGVsIHVzbyBkZSBsYSBkYXRhIGRlIGxhIENhamEgbXVuaWNpcGFsIFBpdXJhIHBvc2VlIHVuYSBwcm9iYWJpbGlkYWQgZGUgZGVmYXVsdC4NCkZpbmFsbWVudGUgY29uY2x1ecOzIGNvbiBlbCBtb2RlbG8gcXVlIGxlIHBlcm1pdGUgY2FsaWZpY2FyIGVzdGFkw61zdGljYW1lbnRlIHkgcmVhbGl6YXIgcHJlZGljY2lvbmVzIGNvbiB1biA5Niw3JSBkZSBleGFjdGl0dWQgbG9zIGNyw6lkaXRvcyBvdG9yZ2Fkb3MuDQpTaWd1YXMsIEEuDQooMjAxOSkgZW4gc3UgaW52ZXN0aWdhY2nDs24gdHV2byBjb21vIGZpbmFsaWRhZCBlc3RhYmxlY2VyIGxhIHJlbGFjacOzbiBlbnRyZSBsYSBjbGFzaWZpY2FjacOzbiBjcmVkaXRpY2lhIGRlIGxvcyBjbGllbnRlcyBkZXVkb3JlcyB5IGVsIHByb2Nlc28gcGFyYSBicmluZGFyIGVsIGNyw6lkaXRvIGVuIHVuYSBlbXByZXNhIGRlIHNlcnZpY2lvcyBwYXJhIGVsIGhvZ2FyIFMuQS5DLiBMYSBpbnZlc3RpZ2FjacOzbiBlcyBjdWFudGl0YXRpdmEgY29ycmVsYWNpb25hbCwgY29uIHVuYSBtdWVzdHJhIGRlIDkxIGRvY3VtZW50b3MgZXNjb2dpZG9zIGFsZWF0b3JpYW1lbnRlLCBwYXJhIHJlYWxpemFyIHVuIGFuw6FsaXNpcyBkb2N1bWVudGFsIHF1ZSBwZXJtaXRhIGNsYXNpZmljYXIgYSBsb3MgY2xpZW50ZXMgZGV1ZG9yZXMgZGUgbGEgaW5zdGl0dWNpw7NuIGNvbW8gbm9ybWFsLCBkZWZpY2llbnRlLCBkdWRvc28gbyBww6lyZGlkYS4NCkxvcyByZXN1bHRhZG9zIG1vc3RyYXJvbiBxdWUgZWwgNDkuNSUgcmVwcmVzZW50YSBhIGxvcyBkZXVkb3JlcyBub3JtYWxlcywgZWwgMjYsMyUgZXMgY29uc2lkZXJhZG8gZGVmaWNpZW50ZSB5IGVsIDYuMyUgY2xhc2lmaWNhIGNvbW8gcMOpcmRpZGEgbyBjbGllbnRlIGR1ZG9zby4NCkRlc3B1w6lzIGRlIGFuYWxpemFyIGxvcyByZXN1bHRhZG9zIHNlIGNvbmNsdXllIHF1ZSBzaSBleGlzdGUgbGEgcmVsYWNpw7NuIGVudHJlIGxhIGNsYXNpZmljYWNpw7NuIGNyZWRpdGljaWEgeSBlbCBwcm9jZXNvIGRlIGJyaW5kYXIgZWwgZmluYW5jaWFtaWVudG8geSBmdWUgY29tcHJvYmFkbyBjb24gY2hpIGN1YWRyYWRvIHNpZW5kbyBlbCBhbGZhIGVsIG5pdmVsIGRlIHNpZ25pZmljYW5jaWEgZGlmZXJlbnRlIGFsIHAgdmFsb3I9MC4wMDAuDQpGbG9yZXMsICgyMDE5KSBVdGlsaXrDsyBjb21vIG1ldG9kb2xvZ8OtYSBsYSB0w6ljbmljYSBpbnR1aXRpdmEgcmVncmVzacOzbiBsb2fDrXN0aWNhIHV0aWxpemFuZG8gbXVlc3RyYXMgZGUgZW50cmVuYW1pZW50byBpbnRyYW11ZXN0cmFsIHkgZnVlcmEgZGUgbXVlc3RyYS4NClNlIG9idHV2byBjb21vIHJlc3VsdGFkbyBpbnRyYW11ZXN0cmFsIHVuIGNvZWZpY2llbnRlIGRlIEdpbmkgZGUgMC41MTUsIHkgZnVlcmEgZGUgbXVlc3RyYSBzZSBvYnRpZW5lIHVuIGNvZWZpY2llbnRlIGRlIEdpbmkgZGUgMC40OCwgYW1ib3MgbW9kZWxvcyBhbCBjcnV6YXJsb3MgZW4gdW4gZGlhZ3JhbWEgZGUgZGlzcGVyc2nDs24gb2J0aWVuZW4gMC44NSBkZSBjb3JyZWxhY2nDs24sIGVzbyBxdWllcmUgZGVjaXIgcXVlIGFtYm9zIG1vZGVsb3MgcHVlZGVuIGN1bXBsaXIgY29ycmVjdGFtZW50ZSBlbCBvYmpldGl2byB5IGxvZ3JhciBsYSBjbGFzaWZpY2FjacOzbiBjcmVkaXRpY2lhLg0KRmluYWxtZW50ZSwgc2UgY29uY2x1ecOzIHF1ZSBhbWJvcyBtb2RlbG9zIGFuYWxpemFkb3MsIHRhbnRvIGVsIHJldm9sdmVudGUgcXVlIGNvbnNpZGVyYSB2YXJpYWJsZXMgZGVsIHRpdHVsYXIgeSBzb2Npb3MsIHkgZWwgbW9kZWxvIHF1ZSB1c2Egc8OzbG8gdmFyaWFibGVzIGRlbCB0aXR1bGFyIGN1bXBsZW4gY29uIGFsdG9zIG5pdmVsZXMgZGUgY29ycmVjdGEgcHJlZGljY2nDs24uDQpSb21lcm8sIEwuDQooMjAxNykgZW4gc3UgaW52ZXN0aWdhY2nDs24sIHByZXNlbnRhIHVuIG1vZGVsbyBkZSBjcmVkaXQgc2NvcmluZyBjb24gbGEgZmluYWxpZGFkIGRlIGV2YWx1YXIgZWwgcmllc2dvIGNyZWRpdGljaW8gZW4gbGEgZW50aWRhZCBBZ3JvYmFuY28sIHB1ZXN0byBxdWUgbGEgZXZhbHVhY2nDs24gZGUgY3LDqWRpdG8gc2UgZGVzYXJyb2xsw7MgZGUgbWFuZXJhIGxlbnRhIHkgZGVmaWNpZW50ZS4NClBhcmEgZWxsbywgc2UgcGFudGxlYSB1bmEgbWV0b2RvbG9nw61hIGRlIGVmZWN0b3MgbWFyZ2luYWxlcyB5IHF1ZSBwZXJtaXRhIGV2YWx1YXIgZW50cmUgbG9zIGHDsW9zIGRlIDIwMDkgYWwgMjAxNSwgYSBwYXJ0aXIgZGUgdW4gbW9kZWxvIGRlIENyZWRpdCBTY29yaW5nLg0KU2Ugb2J0dXZvIGNvbW8gcmVzdWx0YWRvIGxhIGRldGVybWluYWNpw7NuIGRlIHNpZXRlIHZhcmlhYmxlcyBpbmRlcGVuZGllbnRlczogZ2FyYW50w61hLCBwZXJpb2RvLCBlZGFkLCBhbnRpZ8O8ZWRhZCwgc29sdGVybyB5IGNhbGlmaWNhY2nDs24gbm9ybWFsLCBsYXMgY3VhbGVzIGVuIGxhIG1vcm9zaWRhZCBkZSBjcsOpZGl0b3MgZGFkb3Mgc29uIHNpZ25pZmljYXRpdmFtZW50ZSBlc3RhZMOtc3RpY2FzLCBwb3Igb3RybyBsYWRvLCBsYXMgdmFyaWFibGVzIG5vIHJlcHJlc2VudGF0aXZhcyBzb246IG11amVyLCBtb250byB5IGhlY3TDoXJlYS4NCkZpbmFsbWVudGUgY29uY2x1ecOzIGxhcyB2YXJpYWJsZXM6IHBlcmlvZG8sIHNvbHRlcm8sIGVkYWQsIGdhcmFudMOtYSBhbnRpZ8O8ZWRhZCwgc29sdGVybyB5IGNhbGlmaWNhY2nDs24gbm9ybWFsLCBjdW1wbGVuIGNvbW8gZGV0ZXJtaW5hbnRlcyBzb2Npb2Vjb27Ds21pY2FzLg0KDQojIE1hdGVyaWFsIHkgbcOpdG9kb3MNCg0KQ29tbyBtZXRvZG9sb2fDrWEgc2UgYXBsaWPDsyBsb3MgbW9kZWxvcyBkZSByZWd1bGFjacOzbiBjb21vIHTDqWNuaWNhIHBhcmEgYXBsaWNhciB1biBtb2RlbG8gY3V5YSB2YXJpYWJsZSBkZSByZXNwdWVzdGEgZXMgZGUgdGlwbyBiaW5hcmlhIGVuIGRvbmRlIGNvbiB2YWxvcmVzIGRlIDAgY3VhbmRvIGVsIGNsaWVudGUgbm8gZXMgYXB0byBwYXJhIGVsIGNyw6lkaXRvIHkgMSBjdWFuZG8gc2kgcHVlZGUgYWNjZWRlciBhbCBjcsOpZGl0by4NCkxhIHBvYmxhY2nDs24gZXMgZGUgMTAwMCBjbGllbnRlcyBkZSBsYSBiYXNlIGRhdG9zIENyZWRpY3QgR2VybWFuIHF1ZSBzZSBlbmN1ZW50cmEgZGVudHJvIGRlIFVDSSBtYWNoaW5lIGxlYXJuaW5nIHJlcG9zaXRvcnkuDQpFc3RhcyBmdWVyb24gbGFzIHZhcmlhYmxlcyBkZSBlc3R1ZGlvczogPGJyPg0KDQo8Y2VudGVyPg0KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCi50ZyAge2JvcmRlci1jb2xsYXBzZTpjb2xsYXBzZTtib3JkZXItY29sb3I6I2FhYmNmZTtib3JkZXItc3BhY2luZzowO30NCi50ZyB0ZHtiYWNrZ3JvdW5kLWNvbG9yOiNlOGVkZmY7Ym9yZGVyLWNvbG9yOiNhYWJjZmU7Ym9yZGVyLXN0eWxlOnNvbGlkO2JvcmRlci13aWR0aDoxcHg7Y29sb3I6IzY2OTsNCiAgZm9udC1mYW1pbHk6QXJpYWwsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7b3ZlcmZsb3c6aGlkZGVuO3BhZGRpbmc6MTBweCA1cHg7d29yZC1icmVhazpub3JtYWw7fQ0KLnRnIHRoe2JhY2tncm91bmQtY29sb3I6I2I5YzlmZTtib3JkZXItY29sb3I6I2FhYmNmZTtib3JkZXItc3R5bGU6c29saWQ7Ym9yZGVyLXdpZHRoOjFweDtjb2xvcjojMDM5Ow0KICBmb250LWZhbWlseTpBcmlhbCwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDpub3JtYWw7b3ZlcmZsb3c6aGlkZGVuO3BhZGRpbmc6MTBweCA1cHg7d29yZC1icmVhazpub3JtYWw7fQ0KLnRnIC50Zy0wbGF4e3RleHQtYWxpZ246bGVmdDt2ZXJ0aWNhbC1hbGlnbjp0b3B9DQo8L3N0eWxlPg0KPHRhYmxlIGNsYXNzPSJ0ZyI+DQo8dGhlYWQ+DQogIDx0cj4NCiAgICA8dGggY2xhc3M9InRnLTBsYXgiPiZuYnNwOyZuYnNwOyZuYnNwOzxicj48c3BhbiBzdHlsZT0iY29sb3I6YmxhY2siPlZhcmlhYmxlPC9zcGFuPiZuYnNwOyZuYnNwOyZuYnNwOzwvdGg+DQogICAgPHRoIGNsYXNzPSJ0Zy0wbGF4Ij4mbmJzcDsmbmJzcDsmbmJzcDs8YnI+PHNwYW4gc3R5bGU9ImNvbG9yOmJsYWNrIj5EZXNjcmlwY2nDs248L3NwYW4+Jm5ic3A7Jm5ic3A7Jm5ic3A7PC90aD4NCiAgICA8dGggY2xhc3M9InRnLTBsYXgiPiZuYnNwOyZuYnNwOyZuYnNwOzxicj48c3BhbiBzdHlsZT0iY29sb3I6YmxhY2siPlRpcG88L3NwYW4+Jm5ic3A7Jm5ic3A7Jm5ic3A7PC90aD4NCiAgPC90cj4NCjwvdGhlYWQ+DQo8dGJvZHk+DQogIDx0cj4NCiAgICA8dGQgY2xhc3M9InRnLTBsYXgiPiZuYnNwOyZuYnNwOyZuYnNwOzxicj48c3BhbiBzdHlsZT0iY29sb3I6YmxhY2siPkF0cmlidXRvJm5ic3A7Jm5ic3A7Jm5ic3A7MTwvc3Bhbj4mbmJzcDsmbmJzcDsmbmJzcDs8L3RkPg0KICAgIDx0ZCBjbGFzcz0idGctMGxheCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7PGJyPjxzcGFuIHN0eWxlPSJjb2xvcjpibGFjayI+RXN0YWRvIGRlIGxhIGN1ZW50YSBjb3JyaWVudGUgPC9zcGFuPiZuYnNwOyZuYnNwOyZuYnNwOzwvdGQ+DQogICAgPHRkIGNsYXNzPSJ0Zy0wbGF4Ij4mbmJzcDsmbmJzcDsmbmJzcDs8YnI+PHNwYW4gc3R5bGU9ImNvbG9yOmJsYWNrIj5DdWFsaXRhdGl2YTwvc3Bhbj4mbmJzcDsmbmJzcDsmbmJzcDs8L3RkPg0KICA8L3RyPg0KICA8dHI+DQogICAgPHRkIGNsYXNzPSJ0Zy0wbGF4Ij4mbmJzcDsmbmJzcDsmbmJzcDs8YnI+PHNwYW4gc3R5bGU9ImNvbG9yOmJsYWNrIj5BdHJpYnV0byZuYnNwOyZuYnNwOyZuYnNwOzI8L3NwYW4+Jm5ic3A7Jm5ic3A7Jm5ic3A7PC90ZD4NCiAgICA8dGQgY2xhc3M9InRnLTBsYXgiPiZuYnNwOyZuYnNwOyZuYnNwOzxicj48c3BhbiBzdHlsZT0iY29sb3I6YmxhY2siPkR1cmFjacOzbiZuYnNwOyZuYnNwOyZuYnNwO2VuIG1lczwvc3Bhbj4mbmJzcDsmbmJzcDsmbmJzcDs8L3RkPg0KICAgIDx0ZCBjbGFzcz0idGctMGxheCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7PGJyPjxzcGFuIHN0eWxlPSJjb2xvcjpibGFjayI+Q3VhbnRpdGF0aXZhPC9zcGFuPiZuYnNwOyZuYnNwOyZuYnNwOzwvdGQ+DQogIDwvdHI+DQogIDx0cj4NCiAgICA8dGQgY2xhc3M9InRnLTBsYXgiPiZuYnNwOyZuYnNwOyZuYnNwOzxicj48c3BhbiBzdHlsZT0iY29sb3I6YmxhY2siPkF0cmlidXRvJm5ic3A7Jm5ic3A7Jm5ic3A7Mzwvc3Bhbj4mbmJzcDsmbmJzcDsmbmJzcDs8L3RkPg0KICAgIDx0ZCBjbGFzcz0idGctMGxheCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7PGJyPjxzcGFuIHN0eWxlPSJjb2xvcjpibGFjayI+SGlzdG9yaWFsIGRlIGNyw6lkaXRvPC9zcGFuPiZuYnNwOyZuYnNwOyZuYnNwOzwvdGQ+DQogICAgPHRkIGNsYXNzPSJ0Zy0wbGF4Ij4mbmJzcDsmbmJzcDsmbmJzcDs8YnI+PHNwYW4gc3R5bGU9ImNvbG9yOmJsYWNrIj5DdWFsaXRhdGl2YTwvc3Bhbj4mbmJzcDsmbmJzcDsmbmJzcDs8L3RkPg0KICA8L3RyPg0KICA8dHI+DQogICAgPHRkIGNsYXNzPSJ0Zy0wbGF4Ij4mbmJzcDsmbmJzcDsmbmJzcDs8YnI+PHNwYW4gc3R5bGU9ImNvbG9yOmJsYWNrIj5BdHJpYnV0byZuYnNwOyZuYnNwOyZuYnNwOzQ8L3NwYW4+Jm5ic3A7Jm5ic3A7Jm5ic3A7PC90ZD4NCiAgICA8dGQgY2xhc3M9InRnLTBsYXgiPiZuYnNwOyZuYnNwOyZuYnNwOzxicj48c3BhbiBzdHlsZT0iY29sb3I6YmxhY2siPlByb3DDs3NpdG88L3NwYW4+Jm5ic3A7Jm5ic3A7Jm5ic3A7PC90ZD4NCiAgICA8dGQgY2xhc3M9InRnLTBsYXgiPiZuYnNwOyZuYnNwOyZuYnNwOzxicj48c3BhbiBzdHlsZT0iY29sb3I6YmxhY2siPkN1YWxpdGF0aXZhPC9zcGFuPiZuYnNwOyZuYnNwOyZuYnNwOzwvdGQ+DQogIDwvdHI+DQogIDx0cj4NCiAgICA8dGQgY2xhc3M9InRnLTBsYXgiPiZuYnNwOyZuYnNwOyZuYnNwOzxicj48c3BhbiBzdHlsZT0iY29sb3I6YmxhY2siPkF0cmlidXRvJm5ic3A7Jm5ic3A7Jm5ic3A7NTwvc3Bhbj4mbmJzcDsmbmJzcDsmbmJzcDs8L3RkPg0KICAgIDx0ZCBjbGFzcz0idGctMGxheCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7PGJyPjxzcGFuIHN0eWxlPSJjb2xvcjpibGFjayI+TW9udG8gZGVsIGNyw6lkaXRvPC9zcGFuPiZuYnNwOyZuYnNwOyZuYnNwOzwvdGQ+DQogICAgPHRkIGNsYXNzPSJ0Zy0wbGF4Ij4mbmJzcDsmbmJzcDsmbmJzcDs8YnI+PHNwYW4gc3R5bGU9ImNvbG9yOmJsYWNrIj5DdWFudGl0YXRpdmE8L3NwYW4+Jm5ic3A7Jm5ic3A7Jm5ic3A7PC90ZD4NCiAgPC90cj4NCiAgPHRyPg0KICAgIDx0ZCBjbGFzcz0idGctMGxheCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7PGJyPjxzcGFuIHN0eWxlPSJjb2xvcjpibGFjayI+QXRyaWJ1dG8mbmJzcDsmbmJzcDsmbmJzcDs2PC9zcGFuPiZuYnNwOyZuYnNwOyZuYnNwOzwvdGQ+DQogICAgPHRkIGNsYXNzPSJ0Zy0wbGF4Ij4mbmJzcDsmbmJzcDsmbmJzcDs8YnI+PHNwYW4gc3R5bGU9ImNvbG9yOmJsYWNrIj5DdWVudGEgZGUgYWhvcnJvcy9ib25vczwvc3Bhbj4mbmJzcDsmbmJzcDsmbmJzcDs8L3RkPg0KICAgIDx0ZCBjbGFzcz0idGctMGxheCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7PGJyPjxzcGFuIHN0eWxlPSJjb2xvcjpibGFjayI+Q3VhbGl0YXRpdmE8L3NwYW4+Jm5ic3A7Jm5ic3A7Jm5ic3A7PC90ZD4NCiAgPC90cj4NCiAgPHRyPg0KICAgIDx0ZCBjbGFzcz0idGctMGxheCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7PGJyPjxzcGFuIHN0eWxlPSJjb2xvcjpibGFjayI+QXRyaWJ1dG8mbmJzcDsmbmJzcDsmbmJzcDs3PC9zcGFuPiZuYnNwOyZuYnNwOyZuYnNwOzwvdGQ+DQogICAgPHRkIGNsYXNzPSJ0Zy0wbGF4Ij4mbmJzcDsmbmJzcDsmbmJzcDs8YnI+PHNwYW4gc3R5bGU9ImNvbG9yOmJsYWNrIj5FbXBsZW8gYWN0dWFsIGRlc2RlICh0aWVtcG8pPC9zcGFuPiZuYnNwOyZuYnNwOyZuYnNwOzwvdGQ+DQogICAgPHRkIGNsYXNzPSJ0Zy0wbGF4Ij4mbmJzcDsmbmJzcDsmbmJzcDs8YnI+PHNwYW4gc3R5bGU9ImNvbG9yOmJsYWNrIj5DdWFsaXRhdGl2YTwvc3Bhbj4mbmJzcDsmbmJzcDsmbmJzcDs8L3RkPg0KICA8L3RyPg0KICA8dHI+DQogICAgPHRkIGNsYXNzPSJ0Zy0wbGF4Ij4mbmJzcDsmbmJzcDsmbmJzcDs8YnI+PHNwYW4gc3R5bGU9ImNvbG9yOmJsYWNrIj5BdHJpYnV0byZuYnNwOyZuYnNwOyZuYnNwOzg8L3NwYW4+Jm5ic3A7Jm5ic3A7Jm5ic3A7PC90ZD4NCiAgICA8dGQgY2xhc3M9InRnLTBsYXgiPiZuYnNwOyZuYnNwOyZuYnNwOzxicj48c3BhbiBzdHlsZT0iY29sb3I6YmxhY2siPlRhc2EgZGUgcGFnbyBlbiBwb3JjZW50YWplIGRlIGxhIHJlbnRhIGRpc3BvbmlibGU8L3NwYW4+Jm5ic3A7Jm5ic3A7Jm5ic3A7PC90ZD4NCiAgICA8dGQgY2xhc3M9InRnLTBsYXgiPiZuYnNwOyZuYnNwOyZuYnNwOzxicj48c3BhbiBzdHlsZT0iY29sb3I6YmxhY2siPkN1YW50aXRhdGl2YTwvc3Bhbj4mbmJzcDsmbmJzcDsmbmJzcDs8L3RkPg0KICA8L3RyPg0KICA8dHI+DQogICAgPHRkIGNsYXNzPSJ0Zy0wbGF4Ij4mbmJzcDsmbmJzcDsmbmJzcDs8YnI+PHNwYW4gc3R5bGU9ImNvbG9yOmJsYWNrIj5BdHJpYnV0byZuYnNwOyZuYnNwOyZuYnNwOzk8L3NwYW4+Jm5ic3A7Jm5ic3A7Jm5ic3A7PC90ZD4NCiAgICA8dGQgY2xhc3M9InRnLTBsYXgiPiZuYnNwOyZuYnNwOyZuYnNwOzxicj48c3BhbiBzdHlsZT0iY29sb3I6YmxhY2siPlNpdHVhY2nDs24gcGVyc29uYWwgeSBzZXhvPC9zcGFuPiZuYnNwOyZuYnNwOyZuYnNwOzwvdGQ+DQogICAgPHRkIGNsYXNzPSJ0Zy0wbGF4Ij4mbmJzcDsmbmJzcDsmbmJzcDs8YnI+PHNwYW4gc3R5bGU9ImNvbG9yOmJsYWNrIj5DdWFsaXRhdGl2YTwvc3Bhbj4mbmJzcDsmbmJzcDsmbmJzcDs8L3RkPg0KICA8L3RyPg0KICA8dHI+DQogICAgPHRkIGNsYXNzPSJ0Zy0wbGF4Ij4mbmJzcDsmbmJzcDsmbmJzcDs8YnI+PHNwYW4gc3R5bGU9ImNvbG9yOmJsYWNrIj5BdHJpYnV0byZuYnNwOyZuYnNwOyZuYnNwOzEwPC9zcGFuPiZuYnNwOyZuYnNwOyZuYnNwOzwvdGQ+DQogICAgPHRkIGNsYXNzPSJ0Zy0wbGF4Ij4mbmJzcDsmbmJzcDsmbmJzcDs8YnI+PHNwYW4gc3R5bGU9ImNvbG9yOmJsYWNrIj5PdHJvcyBkZXVkb3JlcyAvIGdhcmFudGVzPC9zcGFuPiZuYnNwOyZuYnNwOyZuYnNwOzwvdGQ+DQogICAgPHRkIGNsYXNzPSJ0Zy0wbGF4Ij4mbmJzcDsmbmJzcDsmbmJzcDs8YnI+PHNwYW4gc3R5bGU9ImNvbG9yOmJsYWNrIj5DdWFsaXRhdGl2YTwvc3Bhbj4mbmJzcDsmbmJzcDsmbmJzcDs8L3RkPg0KICA8L3RyPg0KICA8dHI+DQogICAgPHRkIGNsYXNzPSJ0Zy0wbGF4Ij4mbmJzcDsmbmJzcDsmbmJzcDs8YnI+PHNwYW4gc3R5bGU9ImNvbG9yOmJsYWNrIj5BdHJpYnV0byZuYnNwOyZuYnNwOyZuYnNwOzExPC9zcGFuPiZuYnNwOyZuYnNwOyZuYnNwOzwvdGQ+DQogICAgPHRkIGNsYXNzPSJ0Zy0wbGF4Ij4mbmJzcDsmbmJzcDsmbmJzcDs8YnI+PHNwYW4gc3R5bGU9ImNvbG9yOmJsYWNrIj5SZXNpZGVuY2lhIGFjdHVhbCBkZXNkZTwvc3Bhbj4mbmJzcDsmbmJzcDsmbmJzcDs8L3RkPg0KICAgIDx0ZCBjbGFzcz0idGctMGxheCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7PGJyPjxzcGFuIHN0eWxlPSJjb2xvcjpibGFjayI+Q3VhbnRpdGF0aXZhPC9zcGFuPiZuYnNwOyZuYnNwOyZuYnNwOzwvdGQ+DQogIDwvdHI+DQogIDx0cj4NCiAgICA8dGQgY2xhc3M9InRnLTBsYXgiPiZuYnNwOyZuYnNwOyZuYnNwOzxicj48c3BhbiBzdHlsZT0iY29sb3I6YmxhY2siPkF0cmlidXRvJm5ic3A7Jm5ic3A7Jm5ic3A7MTI8L3NwYW4+Jm5ic3A7Jm5ic3A7Jm5ic3A7PC90ZD4NCiAgICA8dGQgY2xhc3M9InRnLTBsYXgiPiZuYnNwOyZuYnNwOyZuYnNwOzxicj48c3BhbiBzdHlsZT0iY29sb3I6YmxhY2siPlByb3BpZWRhZDwvc3Bhbj4mbmJzcDsmbmJzcDsmbmJzcDs8L3RkPg0KICAgIDx0ZCBjbGFzcz0idGctMGxheCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7PGJyPjxzcGFuIHN0eWxlPSJjb2xvcjpibGFjayI+Q3VhbGl0YXRpdmE8L3NwYW4+Jm5ic3A7Jm5ic3A7Jm5ic3A7PC90ZD4NCiAgPC90cj4NCiAgPHRyPg0KICAgIDx0ZCBjbGFzcz0idGctMGxheCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7PGJyPjxzcGFuIHN0eWxlPSJjb2xvcjpibGFjayI+QXRyaWJ1dG8mbmJzcDsmbmJzcDsmbmJzcDsxMzwvc3Bhbj4mbmJzcDsmbmJzcDsmbmJzcDs8L3RkPg0KICAgIDx0ZCBjbGFzcz0idGctMGxheCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7PGJyPjxzcGFuIHN0eWxlPSJjb2xvcjpibGFjayI+RWRhZCBlbiZuYnNwOyZuYnNwOyZuYnNwO2HDsW9zPC9zcGFuPiZuYnNwOyZuYnNwOyZuYnNwOzwvdGQ+DQogICAgPHRkIGNsYXNzPSJ0Zy0wbGF4Ij4mbmJzcDsmbmJzcDsmbmJzcDs8YnI+PHNwYW4gc3R5bGU9ImNvbG9yOmJsYWNrIj5DdWFudGl0YXRpdmE8L3NwYW4+Jm5ic3A7Jm5ic3A7Jm5ic3A7PC90ZD4NCiAgPC90cj4NCiAgPHRyPg0KICAgIDx0ZCBjbGFzcz0idGctMGxheCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7PGJyPjxzcGFuIHN0eWxlPSJjb2xvcjpibGFjayI+QXRyaWJ1dG8mbmJzcDsmbmJzcDsmbmJzcDsxNDwvc3Bhbj4mbmJzcDsmbmJzcDsmbmJzcDs8L3RkPg0KICAgIDx0ZCBjbGFzcz0idGctMGxheCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7PGJyPjxzcGFuIHN0eWxlPSJjb2xvcjpibGFjayI+T3Ryb3MmbmJzcDsmbmJzcDsmbmJzcDtwbGFuZXMgZGUgcGFnbyBhIHBsYXpvczwvc3Bhbj4mbmJzcDsmbmJzcDsmbmJzcDs8L3RkPg0KICAgIDx0ZCBjbGFzcz0idGctMGxheCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7PGJyPjxzcGFuIHN0eWxlPSJjb2xvcjpibGFjayI+Q3VhbGl0YXRpdmE8L3NwYW4+Jm5ic3A7Jm5ic3A7Jm5ic3A7PC90ZD4NCiAgPC90cj4NCiAgPHRyPg0KICAgIDx0ZCBjbGFzcz0idGctMGxheCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7PGJyPjxzcGFuIHN0eWxlPSJjb2xvcjpibGFjayI+QXRyaWJ1dG8mbmJzcDsmbmJzcDsmbmJzcDsxNTwvc3Bhbj4mbmJzcDsmbmJzcDsmbmJzcDs8L3RkPg0KICAgIDx0ZCBjbGFzcz0idGctMGxheCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7PGJyPjxzcGFuIHN0eWxlPSJjb2xvcjpibGFjayI+Vml2aWVuZGE8L3NwYW4+Jm5ic3A7Jm5ic3A7Jm5ic3A7PC90ZD4NCiAgICA8dGQgY2xhc3M9InRnLTBsYXgiPiZuYnNwOyZuYnNwOyZuYnNwOzxicj48c3BhbiBzdHlsZT0iY29sb3I6YmxhY2siPkN1YWxpdGF0aXZhPC9zcGFuPiZuYnNwOyZuYnNwOyZuYnNwOzwvdGQ+DQogIDwvdHI+DQogIDx0cj4NCiAgICA8dGQgY2xhc3M9InRnLTBsYXgiPiZuYnNwOyZuYnNwOyZuYnNwOzxicj48c3BhbiBzdHlsZT0iY29sb3I6YmxhY2siPkF0cmlidXRvJm5ic3A7Jm5ic3A7Jm5ic3A7MTY8L3NwYW4+Jm5ic3A7Jm5ic3A7Jm5ic3A7PC90ZD4NCiAgICA8dGQgY2xhc3M9InRnLTBsYXgiPiZuYnNwOyZuYnNwOyZuYnNwOzxicj48c3BhbiBzdHlsZT0iY29sb3I6YmxhY2siPk7Dum1lcm8mbmJzcDsmbmJzcDsmbmJzcDtkZSBjcsOpZGl0b3MgZXhpc3RlbnRlcyBlbiBlc3RlIGJhbmNvPC9zcGFuPiZuYnNwOyZuYnNwOyZuYnNwOzwvdGQ+DQogICAgPHRkIGNsYXNzPSJ0Zy0wbGF4Ij4mbmJzcDsmbmJzcDsmbmJzcDs8YnI+PHNwYW4gc3R5bGU9ImNvbG9yOmJsYWNrIj5DdWFudGl0YXRpdmE8L3NwYW4+Jm5ic3A7Jm5ic3A7Jm5ic3A7PC90ZD4NCiAgPC90cj4NCiAgPHRyPg0KICAgIDx0ZCBjbGFzcz0idGctMGxheCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7PGJyPjxzcGFuIHN0eWxlPSJjb2xvcjpibGFjayI+QXRyaWJ1dG8mbmJzcDsmbmJzcDsmbmJzcDsxNzwvc3Bhbj4mbmJzcDsmbmJzcDsmbmJzcDs8L3RkPg0KICAgIDx0ZCBjbGFzcz0idGctMGxheCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7PGJyPjxzcGFuIHN0eWxlPSJjb2xvcjpibGFjayI+VHJhYmFqbzwvc3Bhbj4mbmJzcDsmbmJzcDsmbmJzcDs8L3RkPg0KICAgIDx0ZCBjbGFzcz0idGctMGxheCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7PGJyPjxzcGFuIHN0eWxlPSJjb2xvcjpibGFjayI+Q3VhbGl0YXRpdmE8L3NwYW4+Jm5ic3A7Jm5ic3A7Jm5ic3A7PC90ZD4NCiAgPC90cj4NCiAgPHRyPg0KICAgIDx0ZCBjbGFzcz0idGctMGxheCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7PGJyPjxzcGFuIHN0eWxlPSJjb2xvcjpibGFjayI+QXRyaWJ1dG8mbmJzcDsmbmJzcDsmbmJzcDsxODwvc3Bhbj4mbmJzcDsmbmJzcDsmbmJzcDs8L3RkPg0KICAgIDx0ZCBjbGFzcz0idGctMGxheCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7PGJyPjxzcGFuIHN0eWxlPSJjb2xvcjpibGFjayI+TsO6bWVybyBkZSBwZXJzb25hcyBzdXNjZXB0aWJsZXMgZGUgbWFudGVuaW1pZW50bzwvc3Bhbj4mbmJzcDsmbmJzcDsmbmJzcDs8L3RkPg0KICAgIDx0ZCBjbGFzcz0idGctMGxheCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7PGJyPjxzcGFuIHN0eWxlPSJjb2xvcjpibGFjayI+Q3VhbnRpdGF0aXZhPC9zcGFuPiZuYnNwOyZuYnNwOyZuYnNwOzwvdGQ+DQogIDwvdHI+DQogIDx0cj4NCiAgICA8dGQgY2xhc3M9InRnLTBsYXgiPiZuYnNwOyZuYnNwOyZuYnNwOzxicj48c3BhbiBzdHlsZT0iY29sb3I6YmxhY2siPkF0cmlidXRvJm5ic3A7Jm5ic3A7Jm5ic3A7MTk8L3NwYW4+Jm5ic3A7Jm5ic3A7Jm5ic3A7PC90ZD4NCiAgICA8dGQgY2xhc3M9InRnLTBsYXgiPiZuYnNwOyZuYnNwOyZuYnNwOzxicj48c3BhbiBzdHlsZT0iY29sb3I6YmxhY2siPlRlbMOpZm9ubzwvc3Bhbj4mbmJzcDsmbmJzcDsmbmJzcDs8L3RkPg0KICAgIDx0ZCBjbGFzcz0idGctMGxheCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7PGJyPjxzcGFuIHN0eWxlPSJjb2xvcjpibGFjayI+Q3VhbGl0YXRpdmE8L3NwYW4+Jm5ic3A7Jm5ic3A7Jm5ic3A7PC90ZD4NCiAgPC90cj4NCiAgPHRyPg0KICAgIDx0ZCBjbGFzcz0idGctMGxheCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7PGJyPjxzcGFuIHN0eWxlPSJjb2xvcjpibGFjayI+QXRyaWJ1dG8mbmJzcDsmbmJzcDsmbmJzcDsyMDwvc3Bhbj4mbmJzcDsmbmJzcDsmbmJzcDs8L3RkPg0KICAgIDx0ZCBjbGFzcz0idGctMGxheCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7PGJyPjxzcGFuIHN0eWxlPSJjb2xvcjpibGFjayI+VHJhYmFqYWRvciZuYnNwOyZuYnNwOyZuYnNwO2V4dHJhbmplcm88L3NwYW4+Jm5ic3A7Jm5ic3A7Jm5ic3A7PC90ZD4NCiAgICA8dGQgY2xhc3M9InRnLTBsYXgiPiZuYnNwOyZuYnNwOyZuYnNwOzxicj48c3BhbiBzdHlsZT0iY29sb3I6YmxhY2siPkN1YWxpdGF0aXZhPC9zcGFuPiZuYnNwOyZuYnNwOyZuYnNwOzwvdGQ+DQogIDwvdHI+DQo8L3Rib2R5Pg0KPC90YWJsZT4NCjwvY2VudGVyPg0KDQo8YnI+DQoNClNlIHV0aWxpem8gZWwgbGVuZ3VhamUgZGUgcHJvZ3JhbWFjacOzbiBSIHkgZWwgZWRpdG9yIGRlIGPDs2RpZ28gUnN0dWRpbyBwYXJhIGVsIHByb2Nlc2FtaWVudG8gZGUgZGF0b3MgeSBzZSB1dGlsaXrDsyBsYSBwcmVjaXNpw7NuLCBsYSBjdXJ2YSBST0MgeSBlbCBhY2N1cmFjeS4NCkVsIG1vZGVsbyBwYXJhIGxhIHJlZ3Jlc2nDs24gbGFzc28gZXMgbGEgc2lndWllbnRlOg0KDQokJA0KXGJldGFfe0xhc3NvfT0gYXJnbWluXHN1bV97aT0xfV5uKHlfaS1cYmV0YV8wLVxzdW1fe2o9MX1ecFxiZXRhX2l4X3tpbH0pXnorXGxhbWJkYVxzdW1fe2o9MX1ecHxcYmV0YV8xfA0KJCQgPGJyPg0KDQpFbiBlbCBjdWFsIGVsIHZhbG9yIGRlIM67IGhhY2UgcXVlIGxvcyBwYXLDoW1ldHJvcyBkZWwgbW9kZWxvIGxsZWd1ZW4gYSB0b21hciBlbCB2YWxvciBkZSAwLg0KUGFyYSBlbCBtb2RlbG8gcmlnZGUgc2UgZXhwcmVzYSBlbCBzaWd1aWVudGUgbW9kZWxvOg0KDQokJA0KXGJldGFfe0xhc3NvfT0gYXJnbWluXHN1bV97aT0xfV5uKHlfaS1cYmV0YV8wLVxzdW1fe2o9MX1ecFxiZXRhX2l4X3tpbH0pXnorXGxhbWJkYVxzdW1fe2o9MX1ecFxiZXRhXzFeMg0KJCQNCg0KPGJyPiBFbiBlbCBjdWFsIGVsIHZhbG9yIGRlIM67IGhhY2UgcXVlIGxvcyBwYXLDoW1ldHJvcyBkZWwgbW9kZWxvIHNlIGFwcm94aW1lbiBhIDAuDQpFbCBtb2RlbG8gZWxhc3RpYy1uZXQgc2UgcmVwcmVzZW50YSBkZSBsYSBzaWd1aWVudGUgbWFuZXJhOg0KDQokJA0KXGZyYWN7KHlfaS1cYmV0YV8wLVxzdW1fe2o9MX1ecFxiZXRhX2l4X3tpbH0pXjJ9ezJufStcbGFtYmRhXGFscGhhXHN1bV97aj0xfV5wfFxiZXRhXzF8K1xmcmFjezEtXGFscGhhfXsyfVxzdW1fe2o9MX1ecFxiZXRhX2peMg0KJCQgPGJyPg0KDQpFbCBtb2RlbG8gZWxhc3RpYy1uZXQgZXMgdW5hIGNvbWJpbmFjacOzbiBkZWwgbW9kZWxvIHJpZ2RlIGNvbW8gZWwgbW9kZWxvIGxhc3NvLCBsb3MgdmFsb3JlcyBkZWwgcGFyw6FtZXRybyDOsSBlc3TDoW4gZGVudHJvIGRlbCBpbnRlcnZhbG8gZGUgMCBhIDEuDQpDdWFuZG8gZWwgcGFyw6FtZXRybyDOsSB0b21hIGVsIHZhbG9yIGRlIGNlcm8gZXMgdW5hIHJlZ3Jlc2nDs24gcmlnZGUgeSBjdWFuZG8gZXMgaWd1YWwgYSAxIGVzIHVuYSByZWdyZXNpw7NuIGxhc3NvLg0KDQo8Y2VudGVyPg0KDQohW10oaW1hZ2VzL2ltYWdlbi5wbmcpe3dpZHRoPSI1MDcifQ0KDQo8L2NlbnRlcj4NCg0KIyBSZXN1bHRhZG9zDQoNClNlIHB1ZWRlIHZlciBxdWUgbGFzIHZhcmlhYmxlcyBubyBwb3NlZW4gbmluZ8O6biBkYXRvIGZhbHRhbnRlLCBzaSB0dXZpZXJhIGFsZ8O6biBkYXRvIGZhbHRhbnRlIHNlIHRlbmRyw61hIHF1ZSBjb21wbGV0YXIgZXNvcyB2YWxvcmVzIG1lZGlhbnRlIGxhIG1lZGlhLCBtb2RhIG8gbWVkaWFuYSBzZWfDum4gZWwgdGlwbyBkZSB2YXJpYWJsZSBxdWUgc2VhLg0KPGJyPg0KDQo8Y2VudGVyPg0KDQohW10oaW1hZ2VzL2ltYWdlbiUyMDIucG5nKXt3aWR0aD0iNTczIn0NCg0KPC9jZW50ZXI+DQoNCkVsIHNpZ3VpZW50ZSBwYXNvIGVzIGRldGVybWluYXIgc2kgbG9zIGRhdG9zIGRlIHRpcG8gbnVtw6lyaWNvIHBvc2VlbiBkYXRvcyBhdMOtcGljb3MgcGFyYSBlc3RhIGRldGVjY2nDs24gZGUgZm9ybWEgbXVsdGl2YXJpYWJsZSBzZSB1c2EgdmFyaWFjacOzbiBkZWwgbcOpdG9kbyBkZSBsb3Mgay12ZWNpbm9zIG3DoXMgY2VyY2Fub3MuDQpFbCByZXN1bHRhZG8gZGUgZXN0ZSBtw6l0b2RvIGFycm9qYSBxdWUgc29sbyBwb3NlZW4gZGF0b3MgYXTDrXBpY29zLCBlc3RvIHNlIHB1ZWRlIGFwcmVjaWFyIGRlIHVuYSBtZWpvciBtYW5lcmEgZW4gZWwgc2lndWllbnRlIGdyYWZpY286DQoNCjxjZW50ZXI+DQoNCiFbXShpbWFnZXMvSW1hZ2VuNC5wbmcpDQoNCjwvY2VudGVyPg0KDQpEZXNwdcOpcyBkZSBoYWJlciBkZXRlY3RhZG8gZXN0b3MgMjUgdmFsb3JlcyBhdMOtcGljb3Mgc2UgcHJvY2VkZSBhIGVsaW1pbmFyIGxvcyAyNSBkYXRvcyBhdMOtcGljb3MgcHVlcyBlc3RvcyB2YWxvcmVzIGNvbXBsaWNhbiBudWVzdHJvIGFuw6FsaXNpcy4NCg0KU2UgcHVlZGUgdmVyIHF1ZSBsYSBkYXRhIHBvc2VlIHVuIGRlc2JhbGFuY2VvIGRlIGNsYXNlcywgbGEgY2xhc2UgMSBxdWUgcmVwcmVzZW50YW4gYXF1ZWxsYXMgcGVyc29uYXMgcXVlIHNvbiBhcHJvYmFkYXMgZW4gZWwgcHLDqXN0YW1vIHN1cGVyYSBhIGxhIGNsYXNlIDAgcXVlIHJlcHJlc2VudGFuIGEgbGFzIHBlcnNvbmFzIHF1ZSBubyBzb24gYWNjZXNpYmxlcyBhbCBwcsOpc3RhbW8uDQpFc3RhIGNsYXNlIGRlIHByb2JsZW1hIGdlbmVyYSB1biBzZXNnbyBlbiBlbCBtb2RlbG8gcHVlcyBlc3RlIGVzIGVudHJlbmFkbyBjb24gdW5hIG1heW9yIGNhbnRpZGFkIGRlIHVuYSBjbGFzZSwgZXN0byBvY2FzaW9uYSBxdWUgbm8gcHVlZGEgZGV0ZWN0YXIgY29uIHVuYSBtZWpvciBwcmVjaXNpw7NuIGEgbGEgY2xhc2UgbWlub3JpdGFyaWEsIHBhcmEgZGFyIHNvbHVjacOzbiBhIGVzdG8gc2UgYXBsaWNhbiB0w6ljbmljYXMgZGUgYmFsYW5jZW8gYSBsYSBkYXRhIGRlIGVudHJlbmFtaWVudG8uDQoNCjxjZW50ZXI+DQoNCiFbXShpbWFnZXMvSW1hZ2VuNS5wbmcpDQoNCjwvY2VudGVyPg0KDQpEZXNwdcOpcyBkZSBoYWJlciByZWFsaXphZG8gZWwgcHJlcHJvY2VzYW1pZW50byBkZSBsYSBkYXRhIHNlIGNvbWllbnphIGEgYXBsaWNhciBsb3MgbW9kZWxvcyBlbCBwcmltZXIgbW9kZWxvIGVzIGVsIG1vZGVsbyBkZSByZWdyZXNpw7NuIGxvZ8Otc3RpY2EgdGFtYmnDqW4gY29ub2NpZG8gY29tbyBsb2dpdCwgZXN0ZSBtb2RlbG8gc2UgdXRpbGl6YSBwdWVzIHNlIHRyYXRhIGRlIGNsYXNpZmljYXIgYXF1ZWxsYXMgcGVyc29uYXMgcXVlIHB1ZWRlbiBzZXIgY2FsaWZpY2FkYXMgYSB1biBjcsOpZGl0by4NCg0KQWhvcmEgc2UgY29taWVuemFuIGEgYXBsaWNhciBsb3MgbW9kZWxvcyBkZSByZWd1bGFjacOzbiBwYXJhIGxhIHNlbGVjY2nDs24gZGUgcHJlZGljdG9yZXMgZW4gZWwgY2FzbyBkZSBsYSByZWdyZXNpw7NuIHJpZGdlIHNvbG8gc2UgYXByb3hpbWEgYSBsb3MgcHJlZGljdG9yZXMgzrIgYSAwLCBsYSByZWdyZXNpw7NuIGxhc3NvIHRyYXRhIGRlIHNlbGVjY2lvbmFyIHBhcsOhbWV0cm9zIGRhbmRvIGNvbW8gdmFsb3IgYSBsYXMgzrIgeSBlbCBtb2RlbG8gZGUgcmVncmVzacOzbiBlbGFzdGljLW5ldCBjb21iaW5hIGxvcyBtw6l0b2RvcyBkZSBsYXMgZG9zIHTDqWNuaWNhcyBwYXJhIGFzw60gc3VwZXJhciBzdXMgbGltaXRhY2lvbmVzLg0KDQpFbiBlc3RhIHRhYmxhIHNlIHB1ZWRlIGxvcyB2YWxvcmVzIGRlIGNhZGEgcGFyw6FtZXRybyBkZSBsb3MgbW9kZWxvcyB5YSBkaWNob3MsIHNlIHRvbWEgZWwgbW9kZWxvIGxvZ2l0IHB1ZXMgdGFtYmnDqW4gc2UgdG9tYSBkZW50cm8gZGUgbG9zIG1vZGVsb3MgZGUgcmVncmVzacOzbiBsaW5lYWwgeSBhZGVtw6FzIGVzIHVzYWRvIHBhcmEgZXN0b3MgdGlwb3MgZGUgcHJvYmxlbWFzIHF1ZSBjb25zaXN0ZW4gZW4gY2xhc2lmaWNhY2nDs24uDQoNCjxjZW50ZXI+DQoNCg0KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCi50ZyAge2JvcmRlci1jb2xsYXBzZTpjb2xsYXBzZTtib3JkZXItY29sb3I6I2FhYmNmZTtib3JkZXItc3BhY2luZzowO30NCi50ZyB0ZHtiYWNrZ3JvdW5kLWNvbG9yOiNlOGVkZmY7Ym9yZGVyLWNvbG9yOiNhYWJjZmU7Ym9yZGVyLXN0eWxlOnNvbGlkO2JvcmRlci13aWR0aDoxcHg7Y29sb3I6IzY2OTsNCiAgZm9udC1mYW1pbHk6QXJpYWwsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7b3ZlcmZsb3c6aGlkZGVuO3BhZGRpbmc6MTBweCA1cHg7d29yZC1icmVhazpub3JtYWw7fQ0KLnRnIHRoe2JhY2tncm91bmQtY29sb3I6I2I5YzlmZTtib3JkZXItY29sb3I6I2FhYmNmZTtib3JkZXItc3R5bGU6c29saWQ7Ym9yZGVyLXdpZHRoOjFweDtjb2xvcjojMDM5Ow0KICBmb250LWZhbWlseTpBcmlhbCwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDpub3JtYWw7b3ZlcmZsb3c6aGlkZGVuO3BhZGRpbmc6MTBweCA1cHg7d29yZC1icmVhazpub3JtYWw7fQ0KLnRnIC50Zy0wbGF4e3RleHQtYWxpZ246bGVmdDt2ZXJ0aWNhbC1hbGlnbjp0b3B9DQo8L3N0eWxlPg0KPHRhYmxlIGNsYXNzPSJ0ZyI+DQo8dGhlYWQ+DQogIDx0cj4NCiAgICA8dGggY2xhc3M9InRnLTBsYXgiPiZuYnNwOyZuYnNwOyZuYnNwOzxicj48c3BhbiBzdHlsZT0iY29sb3I6YmxhY2siPk1vZGVsbyA8L3NwYW4+Jm5ic3A7Jm5ic3A7Jm5ic3A7PC90aD4NCiAgICA8dGggY2xhc3M9InRnLTBsYXgiPiZuYnNwOyZuYnNwOyZuYnNwOzxicj48c3BhbiBzdHlsZT0iY29sb3I6YmxhY2siPs67PC9zcGFuPiZuYnNwOyZuYnNwOyZuYnNwOzwvdGg+DQogICAgPHRoIGNsYXNzPSJ0Zy0wbGF4Ij4mbmJzcDsmbmJzcDsmbmJzcDs8YnI+PHNwYW4gc3R5bGU9ImNvbG9yOmJsYWNrIj7OkTwvc3Bhbj4mbmJzcDsmbmJzcDsmbmJzcDs8L3RoPg0KICA8L3RyPg0KPC90aGVhZD4NCjx0Ym9keT4NCiAgPHRyPg0KICAgIDx0ZCBjbGFzcz0idGctMGxheCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7PGJyPjxzcGFuIHN0eWxlPSJjb2xvcjpibGFjayI+TG9naXQ8L3NwYW4+Jm5ic3A7Jm5ic3A7Jm5ic3A7PC90ZD4NCiAgICA8dGQgY2xhc3M9InRnLTBsYXgiPiZuYnNwOyZuYnNwOyZuYnNwOzxicj48c3BhbiBzdHlsZT0iY29sb3I6YmxhY2siPi08L3NwYW4+Jm5ic3A7Jm5ic3A7Jm5ic3A7PC90ZD4NCiAgICA8dGQgY2xhc3M9InRnLTBsYXgiPiZuYnNwOyZuYnNwOyZuYnNwOzxicj48c3BhbiBzdHlsZT0iY29sb3I6YmxhY2siPi08L3NwYW4+Jm5ic3A7Jm5ic3A7Jm5ic3A7PC90ZD4NCiAgPC90cj4NCiAgPHRyPg0KICAgIDx0ZCBjbGFzcz0idGctMGxheCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7PGJyPjxzcGFuIHN0eWxlPSJjb2xvcjpibGFjayI+TGFzc288L3NwYW4+Jm5ic3A7Jm5ic3A7Jm5ic3A7PC90ZD4NCiAgICA8dGQgY2xhc3M9InRnLTBsYXgiPiZuYnNwOyZuYnNwOyZuYnNwOzxicj48c3BhbiBzdHlsZT0iY29sb3I6YmxhY2siPjAuMDE3ODE0ODwvc3Bhbj4mbmJzcDsmbmJzcDsmbmJzcDs8L3RkPg0KICAgIDx0ZCBjbGFzcz0idGctMGxheCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7PGJyPjxzcGFuIHN0eWxlPSJjb2xvcjpibGFjayI+MTwvc3Bhbj4mbmJzcDsmbmJzcDsmbmJzcDs8L3RkPg0KICA8L3RyPg0KICA8dHI+DQogICAgPHRkIGNsYXNzPSJ0Zy0wbGF4Ij4mbmJzcDsmbmJzcDsmbmJzcDs8YnI+PHNwYW4gc3R5bGU9ImNvbG9yOmJsYWNrIj5SaWdkZTwvc3Bhbj4mbmJzcDsmbmJzcDsmbmJzcDs8L3RkPg0KICAgIDx0ZCBjbGFzcz0idGctMGxheCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7PGJyPjxzcGFuIHN0eWxlPSJjb2xvcjpibGFjayI+MC4xMjg2MzczPC9zcGFuPiZuYnNwOyZuYnNwOyZuYnNwOzwvdGQ+DQogICAgPHRkIGNsYXNzPSJ0Zy0wbGF4Ij4mbmJzcDsmbmJzcDsmbmJzcDs8YnI+PHNwYW4gc3R5bGU9ImNvbG9yOmJsYWNrIj4wPC9zcGFuPiZuYnNwOyZuYnNwOyZuYnNwOzwvdGQ+DQogIDwvdHI+DQogIDx0cj4NCiAgICA8dGQgY2xhc3M9InRnLTBsYXgiPiZuYnNwOyZuYnNwOyZuYnNwOzxicj48c3BhbiBzdHlsZT0iY29sb3I6YmxhY2siPkVsYXN0aWMtbmV0PC9zcGFuPiZuYnNwOyZuYnNwOyZuYnNwOzwvdGQ+DQogICAgPHRkIGNsYXNzPSJ0Zy0wbGF4Ij4mbmJzcDsmbmJzcDsmbmJzcDs8YnI+PHNwYW4gc3R5bGU9ImNvbG9yOmJsYWNrIj4wLjEyODQ2MTwvc3Bhbj4mbmJzcDsmbmJzcDsmbmJzcDs8L3RkPg0KICAgIDx0ZCBjbGFzcz0idGctMGxheCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7PGJyPjxzcGFuIHN0eWxlPSJjb2xvcjpibGFjayI+MC4xPC9zcGFuPiZuYnNwOyZuYnNwOyZuYnNwOzwvdGQ+DQogIDwvdHI+DQo8L3Rib2R5Pg0KPC90YWJsZT4NCg0KPC9jZW50ZXI+DQoNCkRlc3B1w6lzIGRlIGhhbGFyIGxvcyBwYXLDoW1ldHJvcyBkZWwgbW9kZWxvIHNlIGNvbWllbnphIGEgZXZhbHVhciBzdSBkZXNlbXBlw7FvIHRhbnRvIHBhcmEgbG9zIGRhdG9zIGRlIGVudHJlbmFtaWVudG8gY29tbyBwYXJhIGxvcyBkYXRvcyBkZSBwcnVlYmE6DQoNCjxjZW50ZXI+DQoNCjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+DQoudGcgIHtib3JkZXItY29sbGFwc2U6Y29sbGFwc2U7Ym9yZGVyLWNvbG9yOiNhYWJjZmU7Ym9yZGVyLXNwYWNpbmc6MDt9DQoudGcgdGR7YmFja2dyb3VuZC1jb2xvcjojZThlZGZmO2JvcmRlci1jb2xvcjojYWFiY2ZlO2JvcmRlci1zdHlsZTpzb2xpZDtib3JkZXItd2lkdGg6MXB4O2NvbG9yOiM2Njk7DQogIGZvbnQtZmFtaWx5OkFyaWFsLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O292ZXJmbG93OmhpZGRlbjtwYWRkaW5nOjEwcHggNXB4O3dvcmQtYnJlYWs6bm9ybWFsO30NCi50ZyB0aHtiYWNrZ3JvdW5kLWNvbG9yOiNiOWM5ZmU7Ym9yZGVyLWNvbG9yOiNhYWJjZmU7Ym9yZGVyLXN0eWxlOnNvbGlkO2JvcmRlci13aWR0aDoxcHg7Y29sb3I6IzAzOTsNCiAgZm9udC1mYW1pbHk6QXJpYWwsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6bm9ybWFsO292ZXJmbG93OmhpZGRlbjtwYWRkaW5nOjEwcHggNXB4O3dvcmQtYnJlYWs6bm9ybWFsO30NCi50ZyAudGctMGxheHt0ZXh0LWFsaWduOmxlZnQ7dmVydGljYWwtYWxpZ246dG9wfQ0KPC9zdHlsZT4NCjx0YWJsZSBjbGFzcz0idGciPg0KPHRoZWFkPg0KICA8dHI+DQogICAgPHRoIGNsYXNzPSJ0Zy0wbGF4Ij4mbmJzcDsmbmJzcDsmbmJzcDs8YnI+PHNwYW4gc3R5bGU9ImNvbG9yOmJsYWNrIj5Nb2RlbG8gPC9zcGFuPiZuYnNwOyZuYnNwOyZuYnNwOzwvdGg+DQogICAgPHRoIGNsYXNzPSJ0Zy0wbGF4Ij4mbmJzcDsmbmJzcDsmbmJzcDs8YnI+PHNwYW4gc3R5bGU9ImNvbG9yOmJsYWNrIj5QcmVjaXNpw7NuPC9zcGFuPiZuYnNwOyZuYnNwOyZuYnNwOzwvdGg+DQogICAgPHRoIGNsYXNzPSJ0Zy0wbGF4Ij4mbmJzcDsmbmJzcDsmbmJzcDs8YnI+PHNwYW4gc3R5bGU9ImNvbG9yOmJsYWNrIj5BY2N1cmFjeTwvc3Bhbj4mbmJzcDsmbmJzcDsmbmJzcDs8L3RoPg0KICA8L3RyPg0KPC90aGVhZD4NCjx0Ym9keT4NCiAgPHRyPg0KICAgIDx0ZCBjbGFzcz0idGctMGxheCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7PGJyPjxzcGFuIHN0eWxlPSJjb2xvcjpibGFjayI+TG9naXQ8L3NwYW4+Jm5ic3A7Jm5ic3A7Jm5ic3A7PC90ZD4NCiAgICA8dGQgY2xhc3M9InRnLTBsYXgiPiZuYnNwOyZuYnNwOyZuYnNwOzxicj48c3BhbiBzdHlsZT0iY29sb3I6YmxhY2siPjAuODExPC9zcGFuPiZuYnNwOyZuYnNwOyZuYnNwOzwvdGQ+DQogICAgPHRkIGNsYXNzPSJ0Zy0wbGF4Ij4mbmJzcDsmbmJzcDsmbmJzcDs8YnI+PHNwYW4gc3R5bGU9ImNvbG9yOmJsYWNrIj4wLjgzNDwvc3Bhbj4mbmJzcDsmbmJzcDsmbmJzcDs8L3RkPg0KICA8L3RyPg0KICA8dHI+DQogICAgPHRkIGNsYXNzPSJ0Zy0wbGF4Ij4mbmJzcDsmbmJzcDsmbmJzcDs8YnI+PHNwYW4gc3R5bGU9ImNvbG9yOmJsYWNrIj5MYXNzbzwvc3Bhbj4mbmJzcDsmbmJzcDsmbmJzcDs8L3RkPg0KICAgIDx0ZCBjbGFzcz0idGctMGxheCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7PGJyPjxzcGFuIHN0eWxlPSJjb2xvcjpibGFjayI+MC44Mjk8L3NwYW4+Jm5ic3A7Jm5ic3A7Jm5ic3A7PC90ZD4NCiAgICA8dGQgY2xhc3M9InRnLTBsYXgiPiZuYnNwOyZuYnNwOyZuYnNwOzxicj48c3BhbiBzdHlsZT0iY29sb3I6YmxhY2siPjAuODA2PC9zcGFuPiZuYnNwOyZuYnNwOyZuYnNwOzwvdGQ+DQogIDwvdHI+DQogIDx0cj4NCiAgICA8dGQgY2xhc3M9InRnLTBsYXgiPiZuYnNwOyZuYnNwOyZuYnNwOzxicj48c3BhbiBzdHlsZT0iY29sb3I6YmxhY2siPlJpZ2RlPC9zcGFuPiZuYnNwOyZuYnNwOyZuYnNwOzwvdGQ+DQogICAgPHRkIGNsYXNzPSJ0Zy0wbGF4Ij4mbmJzcDsmbmJzcDsmbmJzcDs8YnI+PHNwYW4gc3R5bGU9ImNvbG9yOmJsYWNrIj4wLjgyOTwvc3Bhbj4mbmJzcDsmbmJzcDsmbmJzcDs8L3RkPg0KICAgIDx0ZCBjbGFzcz0idGctMGxheCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7PGJyPjxzcGFuIHN0eWxlPSJjb2xvcjpibGFjayI+MC44MDY8L3NwYW4+Jm5ic3A7Jm5ic3A7Jm5ic3A7PC90ZD4NCiAgPC90cj4NCiAgPHRyPg0KICAgIDx0ZCBjbGFzcz0idGctMGxheCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7PGJyPjxzcGFuIHN0eWxlPSJjb2xvcjpibGFjayI+RWxhc3RpYy1uZXQ8L3NwYW4+Jm5ic3A7Jm5ic3A7Jm5ic3A7PC90ZD4NCiAgICA8dGQgY2xhc3M9InRnLTBsYXgiPiZuYnNwOyZuYnNwOyZuYnNwOzxicj48c3BhbiBzdHlsZT0iY29sb3I6YmxhY2siPjAuNzkyPC9zcGFuPiZuYnNwOyZuYnNwOyZuYnNwOzwvdGQ+DQogICAgPHRkIGNsYXNzPSJ0Zy0wbGF4Ij4mbmJzcDsmbmJzcDsmbmJzcDs8YnI+PHNwYW4gc3R5bGU9ImNvbG9yOmJsYWNrIj4wLjgxMzwvc3Bhbj4mbmJzcDsmbmJzcDsmbmJzcDs8L3RkPg0KICA8L3RyPg0KPC90Ym9keT4NCjwvdGFibGU+DQoNCjwvY2VudGVyPg0KDQpQb2RlbW9zIHZlciBlbiBlc3RhIHRhYmxhIHF1ZSBlbCBtb2RlbG8gcXVlIHNlIGRlc2VtcGXDsWEgZGUgdW5hIG1lam9yIGZvcm1hIHNvbiAyIGxvcyBjdWFsZXMgc29uIGVsIG1vZGVsbyBsYXNzbyB5IGVsIG1vZGVsbyByaWdkZSwgZXN0byBlcyBjb24gbG9zIGRhdG9zIGRlIGVudHJlbmFtaWVudG8uDQpBaG9yYSBzZSBldmFsw7phIGNvbiBsb3MgZGF0b3MgZGUgcHJ1ZWJhOg0KDQo8Y2VudGVyPg0KDQo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KLnRnICB7Ym9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlO2JvcmRlci1jb2xvcjojYWFiY2ZlO2JvcmRlci1zcGFjaW5nOjA7fQ0KLnRnIHRke2JhY2tncm91bmQtY29sb3I6I2U4ZWRmZjtib3JkZXItY29sb3I6I2FhYmNmZTtib3JkZXItc3R5bGU6c29saWQ7Ym9yZGVyLXdpZHRoOjFweDtjb2xvcjojNjY5Ow0KICBmb250LWZhbWlseTpBcmlhbCwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtvdmVyZmxvdzpoaWRkZW47cGFkZGluZzoxMHB4IDVweDt3b3JkLWJyZWFrOm5vcm1hbDt9DQoudGcgdGh7YmFja2dyb3VuZC1jb2xvcjojYjljOWZlO2JvcmRlci1jb2xvcjojYWFiY2ZlO2JvcmRlci1zdHlsZTpzb2xpZDtib3JkZXItd2lkdGg6MXB4O2NvbG9yOiMwMzk7DQogIGZvbnQtZmFtaWx5OkFyaWFsLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0Om5vcm1hbDtvdmVyZmxvdzpoaWRkZW47cGFkZGluZzoxMHB4IDVweDt3b3JkLWJyZWFrOm5vcm1hbDt9DQoudGcgLnRnLTBsYXh7dGV4dC1hbGlnbjpsZWZ0O3ZlcnRpY2FsLWFsaWduOnRvcH0NCjwvc3R5bGU+DQo8dGFibGUgY2xhc3M9InRnIj4NCjx0aGVhZD4NCiAgPHRyPg0KICAgIDx0aCBjbGFzcz0idGctMGxheCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7PGJyPjxzcGFuIHN0eWxlPSJjb2xvcjpibGFjayI+TW9kZWxvIDwvc3Bhbj4mbmJzcDsmbmJzcDsmbmJzcDs8L3RoPg0KICAgIDx0aCBjbGFzcz0idGctMGxheCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7PGJyPjxzcGFuIHN0eWxlPSJjb2xvcjpibGFjayI+UHJlY2lzacOzbjwvc3Bhbj4mbmJzcDsmbmJzcDsmbmJzcDs8L3RoPg0KICAgIDx0aCBjbGFzcz0idGctMGxheCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7PGJyPjxzcGFuIHN0eWxlPSJjb2xvcjpibGFjayI+QWNjdXJhY3k8L3NwYW4+Jm5ic3A7Jm5ic3A7Jm5ic3A7PC90aD4NCiAgPC90cj4NCjwvdGhlYWQ+DQo8dGJvZHk+DQogIDx0cj4NCiAgICA8dGQgY2xhc3M9InRnLTBsYXgiPiZuYnNwOyZuYnNwOyZuYnNwOzxicj48c3BhbiBzdHlsZT0iY29sb3I6YmxhY2siPkxvZ2l0PC9zcGFuPiZuYnNwOyZuYnNwOyZuYnNwOzwvdGQ+DQogICAgPHRkIGNsYXNzPSJ0Zy0wbGF4Ij4mbmJzcDsmbmJzcDsmbmJzcDs8YnI+PHNwYW4gc3R5bGU9ImNvbG9yOmJsYWNrIj4wLjM3Mjwvc3Bhbj4mbmJzcDsmbmJzcDsmbmJzcDs8L3RkPg0KICAgIDx0ZCBjbGFzcz0idGctMGxheCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7PGJyPjxzcGFuIHN0eWxlPSJjb2xvcjpibGFjayI+MC4yNjU8L3NwYW4+Jm5ic3A7Jm5ic3A7Jm5ic3A7PC90ZD4NCiAgPC90cj4NCiAgPHRyPg0KICAgIDx0ZCBjbGFzcz0idGctMGxheCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7PGJyPjxzcGFuIHN0eWxlPSJjb2xvcjpibGFjayI+TGFzc288L3NwYW4+Jm5ic3A7Jm5ic3A7Jm5ic3A7PC90ZD4NCiAgICA8dGQgY2xhc3M9InRnLTBsYXgiPiZuYnNwOyZuYnNwOyZuYnNwOzxicj48c3BhbiBzdHlsZT0iY29sb3I6YmxhY2siPjAuNzY3PC9zcGFuPiZuYnNwOyZuYnNwOyZuYnNwOzwvdGQ+DQogICAgPHRkIGNsYXNzPSJ0Zy0wbGF4Ij4mbmJzcDsmbmJzcDsmbmJzcDs8YnI+PHNwYW4gc3R5bGU9ImNvbG9yOmJsYWNrIj4wLjcxNDwvc3Bhbj4mbmJzcDsmbmJzcDsmbmJzcDs8L3RkPg0KICA8L3RyPg0KICA8dHI+DQogICAgPHRkIGNsYXNzPSJ0Zy0wbGF4Ij4mbmJzcDsmbmJzcDsmbmJzcDs8YnI+PHNwYW4gc3R5bGU9ImNvbG9yOmJsYWNrIj5SaWdkZTwvc3Bhbj4mbmJzcDsmbmJzcDsmbmJzcDs8L3RkPg0KICAgIDx0ZCBjbGFzcz0idGctMGxheCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7PGJyPjxzcGFuIHN0eWxlPSJjb2xvcjpibGFjayI+MC43NTY8L3NwYW4+Jm5ic3A7Jm5ic3A7Jm5ic3A7PC90ZD4NCiAgICA8dGQgY2xhc3M9InRnLTBsYXgiPiZuYnNwOyZuYnNwOyZuYnNwOzxicj48c3BhbiBzdHlsZT0iY29sb3I6YmxhY2siPjAuNzA0PC9zcGFuPiZuYnNwOyZuYnNwOyZuYnNwOzwvdGQ+DQogIDwvdHI+DQogIDx0cj4NCiAgICA8dGQgY2xhc3M9InRnLTBsYXgiPiZuYnNwOyZuYnNwOyZuYnNwOzxicj48c3BhbiBzdHlsZT0iY29sb3I6YmxhY2siPkVsYXN0aWMtbmV0PC9zcGFuPiZuYnNwOyZuYnNwOyZuYnNwOzwvdGQ+DQogICAgPHRkIGNsYXNzPSJ0Zy0wbGF4Ij4mbmJzcDsmbmJzcDsmbmJzcDs8YnI+PHNwYW4gc3R5bGU9ImNvbG9yOmJsYWNrIj4wLjY5Mjwvc3Bhbj4mbmJzcDsmbmJzcDsmbmJzcDs8L3RkPg0KICAgIDx0ZCBjbGFzcz0idGctMGxheCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7PGJyPjxzcGFuIHN0eWxlPSJjb2xvcjpibGFjayI+MC43MTE8L3NwYW4+Jm5ic3A7Jm5ic3A7Jm5ic3A7PC90ZD4NCiAgPC90cj4NCjwvdGJvZHk+DQo8L3RhYmxlPg0KDQo8L2NlbnRlcj4NCiA8YnI+DQpFbiBlc3RlIGNhc28gZWwgbWVqb3IgbW9kZWxvIGVzIGVsIG1vZGVsbyBMYXNzbyBwdWVzIHRpZW5lIHVuYSBwcmVjaXNpw7NuIHN1cGVyaW9yIGEgbG9zIGRlbcOhcyBtb2RlbG9zIGNvbiB1biB2YWxvciBkZSAwLjc2Ny4gIDxicj4NCkVzdG8gdGFtYmnDqW4gc2UgcHVlZGUgZXZhbHVhciBjb24gbGEgY3VydmEgUk9DIHF1ZSBzZSBwcmVzZW50YSBlbiBsYSBzaWd1aWVudGUgZmlndXJhOg0KIDxicj4NCjxjZW50ZXI+DQohW10oaW1hZ2VzL0ltYWdlbjYucG5nKQ0KPC9jZW50ZXI+DQogPGJyPg0KIEVsIG1vZGVsbyBxdWUgcHJlc2VudGEgZWwgbWF5b3IgdmFsb3IgYXVjIGVzIGVsIG1vZGVsbyBsYXNzby4NCiANCiAjIENvbmNsdWNpb25lcw0KIA0KIExhIGNvbmNsdXNpw7NuIGdsb2JhbCBxdWUgc2Ugb2J0aWVuZSBlbiBlc3RlIHRyYWJham8sIGVzIHF1ZSBsYXMgdMOpY25pY2FzIHV0aWxpemFkYXMgcGFyYSBlbCBlc3R1ZGlvIHkgbW9kZWxpemFjacOzbiBkZWwgaW5jdW1wbGltaWVudG8gcGFyYSB1biBjbGllbnRlIHF1ZSBwZXJ0ZW5lY2UgYSBlc3RhIGJhc2UgZGUgZGF0b3MsIGxvIGFudGVyaW9yLCBzZSByZXNwYWxkYSBwb3IgdW4gYWx0byDDrW5kaWNlIGRlIGxhIHByZWNpc2nDs24uIEFkaWNpb25hbG1lbnRlLCBzZSBjb25zaWRlcmEgcXVlIGRlbnRybyBkZSBlc3RhcyB0w6ljbmljYXMgcHJvYmFkYXMsIGxhIG1lam9yIGVzIGxhIHTDqWNuaWNhIGRlIHJlZ3VsYWNpw7NuIGVzIExhc3NvIHF1ZSBwb3NlZSB1bmEgYWx0YSBwcmVjaXNpw7NuIGRlIDAuNzY2NyBlcyBMYXNzbyBkZWJpZG8gYSBxdWUgcHJlZGljZSBkZSB1bmEgbWVqb3IgbWFuZXJhIGEgbG9zIGNsaWVudGVzIG5vIGFwdG9zIHBhcmEgZWwgY3LDqWRpdG8geSBlbCDDoXJlYSBiYWpvIGxhIGN1cnZhIGVzIGlndWFsIGEgMC43NzkgbG8gY3VhbCBsbyBoYWNlIGVsIG1heW9yIGRlIHRvZG9zIGxvcyBtb2RlbG9zIHByb2JhZG9zLg0KRXN0b3MgbW9kZWxvcyBzdXBlcmFuIGNvbiB1bmEgYWx0YSBwcmVzacOzbiBhbCBtb2RlbG8gbG9naXQsIHB1ZXMgc2Vnw7puIGxvcyBkYXRvcyBkZSBwcnVlYmEgZWwgbW9kZWxvIExvZ2l0IHByZXNlbnRhIHVuYSBwcmVjaXNpw7NuIGRlIDAuMzcyLCBhIGNvbXBhcmFjacOzbiBkZSBsb3MgbW9kZWxvcyBMYXNzbyB5IFJpZ2RlIHF1ZSBwcmVzZW50YW4gMC43NjcgeSAwLjc1NiBlbiBwcmVjaXNpw7NuIHJlc3BlY3RpdmFtZW50ZS4gPGJyPg0KDQpGaW5hbG1lbnRlLCBjYWJlIG1lbmNpb25hciBxdWUgZXN0b3MgbW9kZWxvcyB1dGlsaXphbiAyMCB2YXJpYWJsZXMgZGUgbGFzIGN1YWxlcyBzZWxlY2Npb25hIDMgc29sbyB0cmVzIGZ1ZXJvbiBzZWxlY2Npb25hZGFzLiAgPGJyPg0KDQpDb21vIHNpcnZlbiBlc3RvcyBtb2RlbG9zIGVuIGVsIMOhbWJpdG8gaW50ZXJuYWNpb25hbCB5IGVuIGVsIMOhbWJpdG8gbmFjaW9uYWwuIFBhcmEgZGlzbWludWlyIHN1cyByaWVzZ29zIHkgYXVtZW50YXIgbGFzIHRhc2FzIGRlIG5pdmVsZXMtIHRvbWFybG8gY29tbyBhbHRlcm5hdGl2YSBwYXJhIGFuYWxpemFyIGxvcyByaWVzZ29zIGRlIHN1cyBmdXR1cm9zIGNsaWVudGVzLiA8YnI+DQpMb3MgbW9kZWxvcyBkZSByZWd1bGFjacOzbiBlcyBwYXJhIGxhIHNlbGVjY2nDs24gZGUgdmFyaWFibGVzLiAgPGJyPg0KDQoNCiMgRGlzY3VzacOzbg0KDQpVbmEgcmV2aXNpw7NuIGJpYmxpb2dyw6FmaWNhIGRlIGxhIGxpdGVyYXR1cmEgc29icmUgbG9zIG1vZGVsb3MgZGUgQ3JlZGl0IFNjb3JpbmcsIGFycm9qYW4gcXVlIHVubyBkZSBsb3MgbW9kZWxvcyBtw6FzIGltcGxlbWVudGFkb3MgcGFyYSBlc3RlIHRpcG8gZGUgcHJvYmxlbWFzIGVzIGVsIG1vZGVsbyBMb2dpdCBwb3IgYXV0b3JlcyBjb21vIFBhcmRvLCBPLiAoMjAyMCksIHJldmVsYW5kbyBxdWUgZXN0ZSBtb2RlbG8gZXMgYWNlcHRhYmxlIHB1ZXN0byBxdWUgc3UgcG9yY2VudGFqZSBkZSBhY2llcnRvcyBlcyBkZSA2My45NSUsIHBvciBvdHJvIGxhZG8sIGxvcyBlc3R1ZGlvcyBxdWUgdXRpbGl6YXJvbiBsYXMgdMOpY25pY2FzIGRlIHJlZ3Jlc2nDs24gcGFyYSByZWFsaXphciBlbCByaWVzZ28gZGUgYW7DoWxpc2lzIGNyZWRpdGljaW8gc29uIFF1aXJveiwgQi4gKDIwMjApLCBGbG9yZXMsICgyMDE5KS4gRWwgbW9kZWxvIG3DoXMgcHJlY2lzbyBlbiBlc3RhIGludmVzdGlnYWNpw7NuIGVzIGVsIG1vZGVsbyBMYXNzbywgY29uIHVuYSBwcmVjaXNpw7NuIGRlbCA3Ni43JSwgc2llbmRvIGVzdGUgdW4gbcOpdG9kbyBwYXJhbcOpdHJpY28uIE90cm9zIGF1dG9yZXMgdXRpbGl6YW4gbG9zIG1vZGVsb3Mgbm8gcGFyYW3DqXRyaWNvcyBjb21vIGVzIGVsIGNhc28gZGUgR3VldmFyYSwgSyAoMjAyMCkgcXVlIHVzYSB1biBtb2RlbG8gZGUgbcOhcXVpbmFzIGRlIHNvcG9ydGUgdmVjdG9yaWFsIHF1ZSB0aWVuZSB1bmEgcHJlY2lzacOzbiBkZSA4NS4xJSwgDQoNCiMgQ29kaWdvIA0KDQpgYGAgcg0KZGF0YTwtIHJlYWQudGFibGUoIkM6L1VzZXJzL2F0aXRhL0Rvd25sb2Fkcy9nZXJtYW4gKDIpLmRhdGEiLCBxdW90ZT0iXCIiLCBjb21tZW50LmNoYXI9IiIpDQoNCnN0cihkYXRhKQ0KDQpoZWFkKGRhdGEpDQoNCg0KbGlicmFyeSh0aWR5dmVyc2UpDQoNCmRhdGFbLDIxXTwtIGlmZWxzZShkYXRhWywyMV09PTEsMSwwKQ0KZGF0YVssMjFdICU+JSBoZWFkKCkNCg0KdGFibGUoZGF0YVssMV0pDQoNCmFzLmZhY3RvcihkYXRhWywxXSkgJT4lIGhlYWQoKQ0KDQpkYXRhWywxXTwtIGZhY3RvcihkYXRhWywxXSxsYWJlbHMgID0gYygxOjQpKQ0KDQp0YWJsZShkYXRhWywzXSkNCmRhdGFbLDNdPC0gZmFjdG9yKGRhdGFbLDNdLGxhYmVscyAgPSBjKDE6NSkpDQoNCnRhYmxlKGRhdGFbLDRdKQ0KZGF0YVssNF08LSBmYWN0b3IoZGF0YVssNF0sbGFiZWxzICA9IGMoMToxMCkpDQoNCnRhYmxlKGRhdGFbLDZdKQ0KZGF0YVssNl08LSBmYWN0b3IoZGF0YVssNl0sbGFiZWxzICA9IGMoMTo1KSkNCg0KdGFibGUoZGF0YVssN10pDQpkYXRhWyw3XTwtIGZhY3RvcihkYXRhWyw3XSxsYWJlbHMgID0gYygxOjUpKQ0KDQp0YWJsZShkYXRhWyw5XSkNCmRhdGFbLDldPC0gZmFjdG9yKGRhdGFbLDldLGxhYmVscyAgPSBjKDE6NCkpDQoNCnRhYmxlKGRhdGFbLDEwXSkNCmRhdGFbLDEwXTwtIGZhY3RvcihkYXRhWywxMF0sbGFiZWxzICA9IGMoMTozKSkNCg0KdGFibGUoZGF0YVssMTJdKQ0KZGF0YVssMTJdPC0gZmFjdG9yKGRhdGFbLDEyXSxsYWJlbHMgID0gYygxOjQpKQ0KDQp0YWJsZShkYXRhWywxNF0pDQpkYXRhWywxNF08LSBmYWN0b3IoZGF0YVssMTRdLGxhYmVscyAgPSBjKDE6MykpDQoNCnRhYmxlKGRhdGFbLDE1XSkNCmRhdGFbLDE1XTwtIGZhY3RvcihkYXRhWywxNV0sbGFiZWxzICA9IGMoMTozKSkNCg0KdGFibGUoZGF0YVssMTddKQ0KZGF0YVssMTddPC0gZmFjdG9yKGRhdGFbLDE3XSxsYWJlbHMgID0gYygxOjQpKQ0KDQp0YWJsZShkYXRhWywxOV0pDQpkYXRhWywxOV08LSBmYWN0b3IoZGF0YVssMTldLGxhYmVscyAgPSBjKDE6MikpDQoNCnRhYmxlKGRhdGFbLDIwXSkNCmRhdGFbLDIwXTwtIGZhY3RvcihkYXRhWywyMF0sbGFiZWxzICA9IGMoMToyKSkNCg0Kc2FwcGx5KGRhdGEsZnVuY3Rpb24oIHgpIGNsYXNzKHgpKQ0KDQpkYXRhWywyMV08LSBhcy5mYWN0b3IoZGF0YVssMjFdKQ0KDQpsaWJyYXJ5KG5hbmlhcikNCg0KdmlzX21pc3MoZGF0YSkNCg0KZGF0YSAlPiUgc2VsZWN0KFYyMSkgJT4lIGdyb3VwX2J5KFYyMSkgJT4lIGNvdW50KCkgJT4lIA0KICBhcy5kYXRhLmZyYW1lKCkgJT4lIGdncGxvdChhZXMoVjIxLG4pKStnZW9tX2NvbChmaWxsPWMoImJsdWUiLCJyZWQiKSxhbHBoYT0wLjMpKw0KICB0aGVtZV9lbGVnYW50ZSgpDQoNCiMgRGF0b3MgYXRpcGljb3MgDQoNCmxpYnJhcnkoUENBbWl4ZGF0YSkNCg0KY29ydGU8LXNwbGl0bWl4KGRhdGEpDQpkcXVhbnRpPC1hcy5kYXRhLmZyYW1lKGNvcnRlJFgucXVhbnRpKQ0KZGN1YWxpPC1hcy5kYXRhLmZyYW1lKGNvcnRlJFgucXVhbGkpDQoNCmhlYWQoZHF1YW50aSkNCg0KbGlicmFyeShGTk4pDQpYPC1nZXQua25uKGRhdGEgPSBkcXVhbnRpLGs9NSkNCnNjb3JlPC1yb3dNZWFucyhYJG5uLmRpc3QpDQoNCmNvdGE8LXF1YW50aWxlKHNjb3JlLGMoMC43NSwwLjk3NSkpWzJdDQppbmRleDwtd2hpY2goc2NvcmU+Y290YSkNCk91dDwtc2NvcmVbaW5kZXhdDQpsZW5ndGgoT3V0KQ0KDQp2YWxvcmVzPC1hcy5mYWN0b3IoaWZlbHNlKHNjb3JlPmNvdGEsIkF0w61waWNvIiwiTm8gYXRpcGljbyIpKQ0Kb2JzPC1jKDE6bGVuZ3RoKHNjb3JlKSkNCnBkPC1kYXRhLmZyYW1lKHNjb3JlLHZhbG9yZXMsb2JzKSANCmdncGxvdChwZCwgYWVzKHg9b2JzLHk9c2NvcmUsIGNvbD12YWxvcmVzKSkgK2dlb21fcG9pbnQoKSsNCiAgdGhlbWVfZWxlZ2FudGUoKStsYWJzKHRpdGxlPSJWYWxvcmVzIGF0w61waWNvcyIsY29sb3I9IiIseD0iIixjYXB0aW9uID0gIkVsYWJvcmFjacOzbiBwcm9waWEiKQ0KDQpEYXRvczwtZGF0YQ0KRGF0b3M8LURhdG9zWy1pbmRleCxdDQpzdHIoRGF0b3MpDQoNCiMgQ29ycmVsYWNpb24gZW50cmUgdmFyaWFibGVzDQoNCmxpYnJhcnkoR0dhbGx5KQ0KDQpnZ2NvcnIoZHF1YW50aSwgcGFsZXR0ZSA9ICJSZEJ1IiwgbGFiZWwgPSBUUlVFKQ0KDQoNCiMgVmFyaWFibGVzDQoNCmxpYnJhcnkocnNhbXBsZSkNCnNldC5zZWVkKDIwMjEpDQpjb3J0ZTwtIGluaXRpYWxfc3BsaXQoRGF0b3MsIHByb3AgPSAwLjcsIHN0cmF0YSA9ICJWMjEiKQ0KdHJhaW4gPC0gdHJhaW5pbmcoY29ydGUpDQp0ZXN0ICA8LSB0ZXN0aW5nKGNvcnRlKQ0KDQp0YWJsZSh0cmFpbiRWMjEpICU+JSBwcm9wLnRhYmxlKCkNCg0KZGltKHRyYWluKQ0KDQpsaWJyYXJ5KFJPU0UpDQpEdHJhaW48LXRyYWluDQpEdHJhaW4gPC0gb3Z1bi5zYW1wbGUoVjIxIH4gLiwgZGF0YSA9IER0cmFpbiwgbWV0aG9kID0gImJvdGgiLCBwPTAuNSwgTj03MDAsIHNlZWQgPSAxKSRkYXRhDQp0YWJsZShEdHJhaW4kVjIxKSAlPiUgcHJvcC50YWJsZSgpDQoNCiMgTW9kZWxvcyANCg0KbGlicmFyeShjYXJldCkNCg0KbGlicmFyeShnbG1uZXQpDQoNCiMgTG9naXQgDQpsaWJyYXJ5KGdsbTIpDQoNCm1vZGVsb19sZzwtIGdsbTIoVjIxfi4sZGF0YSA9IER0cmFpbixmYW1pbHkgPSBiaW5vbWlhbCkNCm1vZGVsb19sZw0KDQpkZl9jb2VmaWNpZW50ZXMgPC0gY29lZihtb2RlbG9fbGcpICU+JQ0KICBhcy5tYXRyaXgoKSAlPiUNCiAgYXNfdGliYmxlKHJvd25hbWVzID0gInByZWRpY3RvciIpDQoNCmRmX2NvZWZpY2llbnRlcyAlPiUNCiAgZmlsdGVyKHByZWRpY3RvciAhPSAiKEludGVyY2VwdCkiKSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gcHJlZGljdG9yLCB5ID0gVjEpKSArDQogIGdlb21fY29sKCkgKw0KICBsYWJzKHRpdGxlID0gIkNvZWZpY2llbnRlcyBkZWwgbW9kZWxvIExhc3NvIikgKw0KICB0aGVtZV9idygpICsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDYsIGFuZ2xlID0gNDUpKQ0KDQpkZl9sZzwtIGRmX2NvZWZpY2llbnRlcyAlPiUNCiAgZmlsdGVyKHByZWRpY3RvciAhPSAiKEludGVyY2VwdCkiKSANCg0KIyBSaWdkZQ0KDQp4X3RyYWluIDwtIG1vZGVsLm1hdHJpeChWMjF+LiwgZGF0YSA9IER0cmFpbilbLCAtMV0NCnlfdHJhaW4gPC0gRHRyYWluJFYyMQ0KDQptb2RlbG9fciA8LSBnbG1uZXQoDQogIHggICAgICAgICAgID0geF90cmFpbiwNCiAgeSAgICAgICAgICAgPSB5X3RyYWluLA0KICBhbHBoYSAgICAgICA9IDAsDQogIG5sYW1iZGEgICAgID0gMTAwLA0KICBzdGFuZGFyZGl6ZSA9IFRSVUUsDQogIGZhbWlseSA9ICJiaW5vbWlhbCINCikNCg0KbW9kZWxvX3INCg0KIyMgRWxlZ2lyIGxvcyBwYXJlbWV0cm9zIA0KDQpyZWd1bGFyaXphY2lvbiA8LSBtb2RlbG9fciRiZXRhICU+JSANCiAgYXMubWF0cml4KCkgJT4lDQogIHQoKSAlPiUgDQogIGFzX3RpYmJsZSgpICU+JQ0KICBtdXRhdGUobGFtYmRhID0gbW9kZWxvX3IkbGFtYmRhKQ0KDQpyZWd1bGFyaXphY2lvbiA8LSByZWd1bGFyaXphY2lvbiAlPiUNCiAgcGl2b3RfbG9uZ2VyKA0KICAgIGNvbHMgPSAhbGFtYmRhLCANCiAgICBuYW1lc190byA9ICJwcmVkaWN0b3IiLA0KICAgIHZhbHVlc190byA9ICJjb2VmaWNpZW50ZXMiDQogICkNCg0KbGlicmFyeShzY2FsZXMpDQoNCnJlZ3VsYXJpemFjaW9uICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSBsYW1iZGEsIHkgPSBjb2VmaWNpZW50ZXMsIGNvbG9yID0gcHJlZGljdG9yKSkgKw0KICBnZW9tX2xpbmUoKSArDQogIHNjYWxlX3hfbG9nMTAoDQogICAgYnJlYWtzID0gdHJhbnNfYnJlYWtzKCJsb2cxMCIsIGZ1bmN0aW9uKHgpIDEwXngpLA0KICAgIGxhYmVscyA9IHRyYW5zX2Zvcm1hdCgibG9nMTAiLCBtYXRoX2Zvcm1hdCgxMF4ueCkpDQogICkgKw0KICBsYWJzKHRpdGxlID0gIkNvZWZpY2llbnRlcyBkZWwgbW9kZWxvIGVuIGZ1bmNpw7NuIGRlIGxhIHJlZ3VsYXJpemFjacOzbiIpICsNCiAgdGhlbWVfYncoKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikNCg0Kc2V0LnNlZWQoMTIzKQ0KY3ZfZXJyb3IgPC0gY3YuZ2xtbmV0KA0KICB4ICAgICAgPSB4X3RyYWluLA0KICB5ICAgICAgPSB5X3RyYWluLA0KICBhbHBoYSAgPSAwLA0KICBuZm9sZHMgPSAxMCwNCiAgdHlwZS5tZWFzdXJlID0gIm1zZSIsDQogIHN0YW5kYXJkaXplICA9IFRSVUUsDQogIGZhbWlseT0iYmlub21pYWwiDQopDQoNCnBsb3QoY3ZfZXJyb3IpDQoNCm1vZGVsb19yIDwtIGdsbW5ldCgNCiAgeCAgICAgICAgICAgPSB4X3RyYWluLA0KICB5ICAgICAgICAgICA9IHlfdHJhaW4sDQogIGFscGhhICAgICAgID0gMCwNCiAgbGFtYmRhICAgICAgPSBjdl9lcnJvciRsYW1iZGEuMXNlLA0KICBzdGFuZGFyZGl6ZSA9IFRSVUUsDQogIGZhbWlseSA9ICJiaW5vbWlhbCINCikNCg0Kc3VtbWFyeShtb2RlbG9fcikNCg0KZGZfY29lZmljaWVudGVzIDwtIGNvZWYobW9kZWxvX3IpICU+JQ0KICBhcy5tYXRyaXgoKSAlPiUNCiAgYXNfdGliYmxlKHJvd25hbWVzID0gInByZWRpY3RvciIpICU+JQ0KICByZW5hbWUoY29lZmljaWVudGUgPSBzMCkNCg0KZGZfY29lZmljaWVudGVzICU+JQ0KICBmaWx0ZXIocHJlZGljdG9yICE9ICIoSW50ZXJjZXB0KSIpICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSBwcmVkaWN0b3IsIHkgPSBjb2VmaWNpZW50ZSkpICsNCiAgZ2VvbV9jb2woKSArDQogIGxhYnModGl0bGUgPSAiQ29lZmljaWVudGVzIGRlbCBtb2RlbG8gUmlkZ2UiKSArDQogIHRoZW1lX2J3KCkgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gNiwgYW5nbGUgPSA0NSkpDQoNCmRmX3I8LSBkZl9jb2VmaWNpZW50ZXMgJT4lDQogIGZpbHRlcihwcmVkaWN0b3IgIT0gIihJbnRlcmNlcHQpIikNCg0KIyBNb2RlbG8gTGFzc28gDQoNCm1vZGVsb19scyA8LSBnbG1uZXQoDQogIHggICAgICAgICAgID0geF90cmFpbiwNCiAgeSAgICAgICAgICAgPSB5X3RyYWluLA0KICBhbHBoYSAgICAgICA9IDEsDQogIG5sYW1iZGEgICAgID0gMTAwLA0KICBzdGFuZGFyZGl6ZSA9IFRSVUUsDQogIGZhbWlseSA9ICJiaW5vbWlhbCINCikNCg0KcmVndWxhcml6YWNpb24gPC0gbW9kZWxvX2xzJGJldGEgJT4lIA0KICBhcy5tYXRyaXgoKSAlPiUNCiAgdCgpICU+JSANCiAgYXNfdGliYmxlKCkgJT4lDQogIG11dGF0ZShsYW1iZGEgPSBtb2RlbG9fbHMkbGFtYmRhKQ0KDQpyZWd1bGFyaXphY2lvbiA8LSByZWd1bGFyaXphY2lvbiAlPiUNCiAgcGl2b3RfbG9uZ2VyKA0KICAgIGNvbHMgPSAhbGFtYmRhLCANCiAgICBuYW1lc190byA9ICJwcmVkaWN0b3IiLA0KICAgIHZhbHVlc190byA9ICJjb2VmaWNpZW50ZXMiDQogICkNCg0KcmVndWxhcml6YWNpb24gJT4lDQogIGdncGxvdChhZXMoeCA9IGxhbWJkYSwgeSA9IGNvZWZpY2llbnRlcywgY29sb3IgPSBwcmVkaWN0b3IpKSArDQogIGdlb21fbGluZSgpICsNCiAgc2NhbGVfeF9sb2cxMCgNCiAgICBicmVha3MgPSB0cmFuc19icmVha3MoImxvZzEwIiwgZnVuY3Rpb24oeCkgMTBeeCksDQogICAgbGFiZWxzID0gdHJhbnNfZm9ybWF0KCJsb2cxMCIsIG1hdGhfZm9ybWF0KDEwXi54KSkNCiAgKSArDQogIGxhYnModGl0bGUgPSAiQ29lZmljaWVudGVzIGRlbCBtb2RlbG8gZW4gZnVuY2nDs24gZGUgbGEgcmVndWxhcml6YWNpw7NuIikgKw0KICB0aGVtZV9idygpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQ0KDQojIEV2b2x1Y2nDs24gZGVsIGVycm9yIGVuIGZ1bmNpw7NuIGRlIGxhbWJkYQ0KIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCnNldC5zZWVkKDEyMykNCmN2X2Vycm9yIDwtIGN2LmdsbW5ldCgNCiAgeCAgICAgID0geF90cmFpbiwNCiAgeSAgICAgID0geV90cmFpbiwNCiAgYWxwaGEgID0gMSwNCiAgbmZvbGRzID0gMTAsDQogIHR5cGUubWVhc3VyZSA9ICJtc2UiLA0KICBzdGFuZGFyZGl6ZSAgPSBUUlVFLA0KICBmYW1pbHk9ImJpbm9taWFsIg0KKQ0KDQpwbG90KGN2X2Vycm9yKQ0KDQptb2RlbG9fbHMgPC0gZ2xtbmV0KA0KICB4ICAgICAgICAgICA9IHhfdHJhaW4sDQogIHkgICAgICAgICAgID0geV90cmFpbiwNCiAgYWxwaGEgICAgICAgPSAxLA0KICBsYW1iZGEgICAgICA9IGN2X2Vycm9yJGxhbWJkYS4xc2UsDQogIHN0YW5kYXJkaXplID0gVFJVRSwNCiAgZmFtaWx5PSJiaW5vbWlhbCINCikNCg0KIyBDb2VmaWNpZW50ZXMgZGVsIG1vZGVsbw0KIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCmRmX2NvZWZpY2llbnRlcyA8LSBjb2VmKG1vZGVsb19scykgJT4lDQogIGFzLm1hdHJpeCgpICU+JQ0KICBhc190aWJibGUocm93bmFtZXMgPSAicHJlZGljdG9yIikgJT4lDQogIHJlbmFtZShjb2VmaWNpZW50ZSA9IHMwKQ0KDQpkZl9jb2VmaWNpZW50ZXMgJT4lDQogIGZpbHRlcihwcmVkaWN0b3IgIT0gIihJbnRlcmNlcHQpIikgJT4lDQogIGdncGxvdChhZXMoeCA9IHByZWRpY3RvciwgeSA9IGNvZWZpY2llbnRlKSkgKw0KICBnZW9tX2NvbCgpICsNCiAgbGFicyh0aXRsZSA9ICJDb2VmaWNpZW50ZXMgZGVsIG1vZGVsbyBMYXNzbyIpICsNCiAgdGhlbWVfYncoKSArDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSA2LCBhbmdsZSA9IDQ1KSkNCg0KZGZfbHM8LSBkZl9jb2VmaWNpZW50ZXMgJT4lDQogIGZpbHRlcihwcmVkaWN0b3IgIT0gIihJbnRlcmNlcHQpIikNCg0KDQojIEVsYXN0aWNuZXQNCg0Kc2V0LnNlZWQoMTIzKQ0KDQptb2RlbG9fZWwgPC0gdHJhaW4oDQogIFYyMSB+LiwgZGF0YSA9IER0cmFpbiwgbWV0aG9kID0gImdsbW5ldCIsDQogIHRyQ29udHJvbCA9IHRyYWluQ29udHJvbCgiY3YiLCBudW1iZXIgPSAxMCksDQogIHR1bmVMZW5ndGggPSAxMA0KKQ0KY29lZihtb2RlbG9fZWwkZmluYWxNb2RlbCwgbW9kZWxvX2VsJGJlc3RUdW5lJGxhbWJkYSkNCg0KZGZfY29lZmljaWVudGVzIDwtIGNvZWYobW9kZWxvX2VsJGZpbmFsTW9kZWwsbW9kZWxvX2VsJGJlc3RUdW5lJGxhbWJkYSkgJT4lDQogIGFzLm1hdHJpeCgpICU+JQ0KICBhc190aWJibGUocm93bmFtZXMgPSAicHJlZGljdG9yIikNCg0KY29sbmFtZXMoZGZfY29lZmljaWVudGVzKVsyXTwtICAiVjEiDQoNCmRmX2NvZWZpY2llbnRlcyAlPiUNCiAgZmlsdGVyKHByZWRpY3RvciAhPSAiKEludGVyY2VwdCkiKSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gcHJlZGljdG9yLCB5ID0gVjEpKSArDQogIGdlb21fY29sKCkgKw0KICBsYWJzKHRpdGxlID0gIkNvZWZpY2llbnRlcyBkZWwgbW9kZWxvIEVsYXN0aWMtbmV0IikgKw0KICB0aGVtZV9idygpICsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDYsIGFuZ2xlID0gNDUpKQ0KDQpkZl9lbGM8LSBkZl9jb2VmaWNpZW50ZXMgJT4lDQogIGZpbHRlcihwcmVkaWN0b3IgIT0gIihJbnRlcmNlcHQpIikNCg0KZGY8LSBjYmluZChkZl9sZyAsZGZfcixkZl9scyxkZl9lbGMpDQpwcmludChkZikNCndyaXRlX2V4Y2VsX2NzdihkZiwiZGF0YS5jc3YiKQ0KIyMjIyBWYW1vcyBhIHZhbGlkYXIgDQoNCiMjIE1vZGVsbyBsb2dpdCANCg0KcF9sZzwtIHByZWRpY3QobW9kZWxvX2xnLG5ld2RhdGEgPSBEdHJhaW5bLC0yMV0sdHlwZSA9ICJyZXNwb25zZSIpDQpwX2xnPC0gaWZlbHNlKHBfbGc+MC41LDEsMCkNCnBfbGcNCmNsYXNzKER0cmFpbiRWMjEpDQpwX2xnPC0gcF9sZyU+JSBhcy5kYXRhLmZyYW1lKCkNCmRyYXdfY29uZnVzaW9uX21hdHJpeChjb25mdXNpb25NYXRyaXgoRHRyYWluJFYyMSxwX2xnICU+JSBhcy5mYWN0b3IoKSkpDQphPC1Db25mdXNpb25NYXRyaXgoRHRyYWluJFYyMSxwX2xnJC4pDQpjb25mdXNpb25NYXRyaXgoZGF0YSA9IER0cmFpbiRWMjEscmVmZXJlbmNlID0gcF9sZyQuKQ0KdGFibGUoRHRyYWluJFYyMSxhcy5mYWN0b3IocF9sZyQuKSkNCmxlbmd0aChEdHJhaW4kVjEpDQpsZW5ndGgocF9sZykNCg0KIyMgTW9kZWxvIGVsYXN0aW5lYyANCg0KcF9uZWN0PC0gcHJlZGljdChtb2RlbG9fZWwsbmV3ZGF0YSA9IER0cmFpblssLTIxXSkNCnBfbGc8LSBpZmVsc2UocF9sZz4wLjUsMSwwKQ0KcF9uZWN0ICU+JSBjbGFzcygpDQpjbGFzcyhEdHJhaW4kVjIxKQ0KcF9sZyQuICU+JSBjbGFzcygpDQpkcmF3X2NvbmZ1c2lvbl9tYXRyaXgoY29uZnVzaW9uTWF0cml4KER0cmFpbiRWMjEscF9uZWN0KSkNCg0KdGFibGUoRHRyYWluJFYyMSxwX25lY3QpDQoNCiMjIE1vZGVsbyBSaWdkZQ0KDQpwcmVkaWNjaW9uZXNfdHJhaW4gPC0gcHJlZGljdChtb2RlbG9fciwgbmV3eCA9IHhfdHJhaW4sdHlwZSA9ICJjbGFzcyIpDQphPC0gcHJlZGljY2lvbmVzX3RyYWluICU+JSBhcy5kYXRhLmZyYW1lKCkNCmENCmRyYXdfY29uZnVzaW9uX21hdHJpeChjb25mdXNpb25NYXRyaXgoRHRyYWluJFYyMSxhJHMwKSkNCg0KIyMgTW9kZWxvIGxhc3NvDQoNCnByZWRpY2Npb25lc190cmFpbl9sIDwtIHByZWRpY3QobW9kZWxvX2xzLCBuZXd4ID0geF90cmFpbix0eXBlID0gImNsYXNzIikNCmE8LSBwcmVkaWNjaW9uZXNfdHJhaW4gJT4lIGFzLmRhdGEuZnJhbWUoKQ0KYQ0KZHJhd19jb25mdXNpb25fbWF0cml4KGNvbmZ1c2lvbk1hdHJpeChEdHJhaW4kVjIxLGEkczApKQ0KDQojIyMgVGVzdA0KDQojIyBNb2RlbG8gZWxhc3RpYzoNCg0KdF9uZWN0PC0gcHJlZGljdChtb2RlbG9fZWwsbmV3ZGF0YSA9IHRlc3RbLC0yMV0pDQpkcmF3X2NvbmZ1c2lvbl9tYXRyaXgoY29uZnVzaW9uTWF0cml4KHRlc3QkVjIxLHRfbmVjdCkpDQoNCiMjIExhc3NvOw0KDQp4X3Rlc3QgPC0gbW9kZWwubWF0cml4KFYyMX4uLCBkYXRhID0gdGVzdClbLCAtMV0NCnlfdGVzdCA8LSB0ZXN0JFYyMQ0KcHJlZGljY2lvbmVzX3Rlc3RfbCA8LSBwcmVkaWN0KG1vZGVsb19scywgbmV3eCA9IHhfdGVzdCx0eXBlID0gImNsYXNzIikNCmE8LSBwcmVkaWNjaW9uZXNfdGVzdF9sICU+JSBhcy5kYXRhLmZyYW1lKCkNCmENCmRyYXdfY29uZnVzaW9uX21hdHJpeChjb25mdXNpb25NYXRyaXgodGVzdCRWMjEsYSRzMCkpDQoNCiMgUmlnZGUNCg0KcHJlZGljY2lvbmVzX3Rlc3RfbCA8LSBwcmVkaWN0KG1vZGVsb19yLCBuZXd4ID0geF90ZXN0LHR5cGUgPSAiY2xhc3MiKQ0KYTwtIHByZWRpY2Npb25lc190ZXN0X2wgJT4lIGFzLmRhdGEuZnJhbWUoKQ0KYQ0KZHJhd19jb25mdXNpb25fbWF0cml4KGNvbmZ1c2lvbk1hdHJpeCh0ZXN0JFYyMSxhJHMwKSkNCg0KIyMgbG9naWQNCg0KdF9sZzwtIHByZWRpY3QobW9kZWxvX2xnLG5ld2RhdGEgPSB0ZXN0WywtMjFdKQ0KdF9sZzwtIGlmZWxzZSh0X2xnPjAuNSwxLDApDQpkcmF3X2NvbmZ1c2lvbl9tYXRyaXgoY29uZnVzaW9uTWF0cml4KHRlc3QkVjIxLHRfbGcgJT4lIGFzLmZhY3RvcigpKSkNCnRhYmxlKHRlc3QkVjIxLHRfbGcgJT4lIGFzLmZhY3RvcigpKQ0KIyMjIw0KRGF0YUV4cGxvcmVyOjpwbG90X21pc3NpbmcoZGF0YSxnZW9tX2xhYmVsX2FyZ3MgPSBsaXN0KCJzaXplIiA9IDQsICJsYWJlbC5wYWRkaW5nIiA9IHVuaXQoMC4yLCAibGluZXMiKSkpDQoNCiMjIA0KDQpBVUModF9sZyx0ZXN0JFYyMSkNCg0KbGlicmFyeShST0NSKQ0KDQpsaWJyYXJ5KHBST0MpDQoNCmxpYnJhcnkocFJPQykNCmN1cnZhX1JPQyA8LSByb2MobW9kZWxvX2xvZ2l0X3ZpdiR5LG1vZGVsb19sb2dpdF92aXYkZml0dGVkLnZhbHVlcykNCnBsb3QoY3VydmFfUk9DLGNvbCA9ICJibHVlIix4bGltID0gYygxLDApLHlsaW0gPSBjKDAsMSksDQogICAgIHhsYWIgPSAiRXNwZWNpZmlkYWQiLCB5bGFiID0iU2Vuc2liaWxpZGFkIiwgbWFpbiA9ICJDdXJ2YSBkZSBST0MiKQ0KYXVjKGN1cnZhX1JPQykgIyAwLjg0NDUNCg0KY3VydmFfUk9DPC1yb2ModF9uZWN0LHRlc3QkVjIxKQ0KDQojIyBHcnNmaWNvcyByb2MgDQoNCiMjIEVsYXN0aW5ldA0KDQp0X25lY3Q8LSBwcmVkaWN0KG1vZGVsb19lbCxuZXdkYXRhID0gdGVzdFssLTIxXSx0eXBlID0gInByb2IiKQ0Kcm9jIChwcnVlYmEgJCBwcmVkZXRlcm1pbmFkbywgcHJlZGljaG8pDQphPC0gcm9jKHRlc3QkVjIxLHRfbmVjdFssMl0pDQpnZ3JvYyhhKQ0KQVVDKCkNCiMjIGxhc3NvDQoNCnByZWRpY2Npb25lc190ZXN0X2wgPC0gcHJlZGljdChtb2RlbG9fbHMsIG5ld3ggPSB4X3Rlc3QsdHlwZSA9ICJyZXNwb25zZSIpDQoNCmExPC0gcm9jKHRlc3QkVjIxLHByZWRpY2Npb25lc190ZXN0X2wpDQpnZ3JvYyhhMSkNCg0KIyMgcmlnZGUgDQoNCnByZWRpY2Npb25lc190ZXN0X3IgPC0gcHJlZGljdChtb2RlbG9fciwgbmV3eCA9IHhfdGVzdCx0eXBlID0gInJlc3BvbnNlIikNCmEyPC0gcm9jKHRlc3QkVjIxLHByZWRpY2Npb25lc190ZXN0X3IpDQpnZ3JvYyhhMikNCg0KcmVzdWx0c19iYWcgPC0gbGlzdChsYXNzbyA9IG1vZGVsb19scywgcmlnZGUgPSBtb2RlbG9fcikNCg0KIyMgTG9naXQNCg0KcF9sb2c8LSBwcmVkaWN0KG1vZGVsb19sZyx0ZXN0WywtMjFdLHR5cGUgPSAicmVzcG9uc2UiKQ0KYTM8LSByb2ModGVzdCRWMjEscF9sb2cpDQpnZ3JvYyhhMykNCg0KIyMgRnVuY2lvbiANCg0KZ3JhZjwtIGZ1bmN0aW9uKGEsdGl0bGUpew0KICBiPC0gZ2dyb2MoYSxjb2xvcj0iYmx1ZSIpK2xhYnModGl0bGU9dGl0bGUsc3VidGl0bGUgPSANCiAgICAgICAgICAgICAgcGFzdGUoIkVsIGFyZWEgYmFqbyBsYSBjdXJ2YTogIixyb3VuZChhJGF1YywzKSksDQogICAgICAgICAgICAgIGNhcHRpb24gPSAiRnVlbnRlOiBFbGFib3JhY2nDs24gcHJvcGlhIikrDQogIHRoZW1lX2VsZWdhbnRlKCkNCiAgcmV0dXJuKGIpDQp9DQoNCno8LSBncmFmKGEsIkN1cnZhIFJPQyBkZWwgbW9kZWxvIGVsYXN0aWMtbmV0IikNCnoxPC0gZ3JhZihhMSwiQ3VydmEgUk9DIGRlbCBtb2RlbG8gTGFzc28iKQ0KejI8LSBncmFmKGEyLCJDdXJ2YSBST0MgZGVsIG1vZGVsbyBSaWdkZSIpDQp6MzwtIGdyYWYoYTMsIkN1cnZhIFJPQyBkZWwgbW9kZWxvIExvZ2l0IikNCg0KZ2dhcnJhbmdlKHozLHoxLHoyLHopDQoNCg0KYGBgDQoNCg==