Introducción

Como norma general, las clasificaciones de cobertura de suelo proporcionan información elemental para evaluar el impacto de las interacciones humanas dentro del medio ambiente y evaluar los fundamentos científicos para la sostenibilidad, la vulnerabilidad y la resiliencia de los sistemas de tierras y su uso (Han et al., 2004). Sin embargo, clasificar los datos de detección remota en un mapa temático sigue siendo un desafío debido a que muchos factores, como la complejidad del paisaje en un área de estudio, los datos de detección remota seleccionados y los enfoques de procesamiento de imágenes y clasificación, pueden afectar el éxito de una clasificación (Lu & Weng, 2007).

Según Gómez et al., (2016), la cobertura terrestre se relaciona con la cobertura biofísica de la superficie de la Tierra, identificando vegetación, aguas continentales, suelo desnudo o infraestructura humana. Una dificultad en la clasificación de la cubierta terrestre en ambientes semiáridos como el de la zona de Toledo, es la similitud espectral de algunos de sus tipos de cobertura. Esta situación puede dificultar la discriminación de las diferentes coberturas de suelo, llevando a una clasificación errónea.

El área de estudio pertenece a la Cuenca hidrográfica del Tajo. El río Tajo constituye una importante demarcación hidrográfica, la quinta de mayor dimensión a nivel europeo y la tercera de la Península Ibérica, con una superficie de 80.629 km2, de los que aproximadamente un 30% están situados en territorio portugués (24.800 km2) (Ferreira, 2013). Debido a la importancia ecológica, demográfica, económica y social que representa la cuenca, es preciso el análisis y monitoreo del uso y evolución de las coberturas del suelo para garantizar su sostenibilidad.

El presente artículo tiene como objetivo la elaboración de una clasificación supervisada de las coberturas de suelo en el área de estudio, mediante la utilización de técnicas de detección remota.

Datos y método

Zona de estudio

El área seleccionada comprende una superficie rectangular de 881,70 km2 que comprende las fértiles vegas del río Tajo en las inmediaciones de la ciudad de Toledo, en la comunidad autónoma de Castilla la Mancha. Esta situado en la submeseta sur de la Península Ibérica entre las estribaciones de la Sierra de Gredos al Norte y los Montes de Toledo al Sur.



Los límites del área son 387435.00, 425505.00 para la longitud y 4401555.00, 4424715.00 para la latitud, con el sistema de referencia de coordenadas EPSG:32630 - WGS 84 / UTM zone 30N.

Los datos radiometricos y espectrales se han obtenido de una imagen satelital Landsat 8 nivel 1, correspondiente al 14 de Marzo de 2020 cuyo identificador de producto es LC08_L1TP_201032_20200314_20200325_01_T1.

La clasificación supervisada se ha llevado a cabo mediante el algoritmo Random Forest. Este algoritmo es una forma de clasificación conjunta de árboles de decisión. Un árbol de decisión es un modelo no paramétrico, que se describe mediante un gráfico similar a un árbol, y se utiliza tanto en tareas de clasificación como de regresión (Reis et al., 2018). Cada árbol individual del Random Forest realiza una predicción de clase y la clase con más votos se convierte en la predicción de nuestro modelo.

Para llevar a cabo la evaluación de precisión, se asignaron y examinaron al azar un total de 65 polígonos de muestra que cubren diferentes tipos de cobertura terrestre, utilizando datos del Sistema de Información sobre Ocupación del Suelo de España (SIOSE), el Sistema de Información Geográfica de Parcelas Agrícolas (SIGPAC), el Sistema de Información Geográfica de Datos Agrarios (SIGA) e imagenes de alta resolución del mapa de Google Earth. Estos mismos polígonos fueron utilizados para la obtención de los perfiles espectrales de las coberturas de suelo. Los píxeles de muestreo utilizados para la evaluación de precisión se seleccionaron utilizando el método de muestreo estratificado aleatoriamente.



La clasificación utilizada para los polígonos de muestra se describe a continuación:

-Agua: Masas de agua continentales quietas o corrientes de la superficie del suelo. Principalmente masas de agua pertenecientes al rio Tajo, embalses naturales y balsas de riego.

-Barbecho: Terreno de labor que no es sembrado durante cierto número de ciclos vegetativos con el fin de permitir su regeneración y el almacenamiento hídrico.

-Cultivos herbáceos: Principalmente cultivos anuales de secano y regadío, entre los que predominan los cereales de grano como maiz, trigo y cebada.

-Cultivos permanentes: Cultivos leñosos entre los que predominan el olivar y el viñedo.

-Dehesa: Esta clase comprende una mezcla de las coberturas definidas por el SIOSE como pastizal, arbolado forestal y matorral. Predominan los encinares y la mezcla de coníferas y frondosas autóctonas del género quercus. También destaca la presencia de pastizal matorral con especies autóctonas del genero retama, lavandula, rosmarinus y thymus entre otras.

-Industrial: Edificaciones de tipo industrial en las que predominan las cubiertas amplias de colores claros, generalmente blanco o metálico característico de las chapas metálicas o paneles sándwich.

-Residencial: Edificaciones de tipo residencial en las que predominan los colores marrones, rojizos y ocres característicos de las cubiertas cerámicas.

Para el procesamiento y análisis de los datos satelitales se ha empleado software open source Rstudio. Para la digitalización de los polígonos de muestra se ha utilizado otro software libre y de codígo abierto, Qgis.

Metodología

En el siguiente gráfico se muestra la metodología llevada a cabo para el análisis de las imágenes satelitales y la elaboración de la clasificación supervisada:

Resultados

Preprocesamiento

Las imágenes adquiridas por los sensores Landsat están sujetas a distorsión como resultado de los sensores, los efectos solares, atmosféricos y topográficos. El preprocesamiento intenta minimizar estos efectos en la medida deseada para una aplicación particular. (Young et al., 2017)

Corrección radiométrica

En el presente estudio se van a utilizar valores de reflectancia TOA (top-of-atmosphere) para realizar los análisis pertinentes para la obtención de la clasificación supervisada de suelos. La corrección radiométrica necesaria para obtener estos valores es la corrección solar. La corrección solar convierte la radiancia en el sensor en reflectancia en la parte superior de la atmósfera (TOA) incorporando la irradiancia solar exoatmosférica, la distancia Tierra-Sol y el ángulo de elevación solar (Young et al., 2017).

Sin embargo, los productos Landsat 8 proporcionan coeficientes para convertir los niveles digitales (DN, digital number) directamente a reflectancia TOA sin necesidad de obtener la radiancia en el sensor mediante la expresión proporcionada por el Servicio Geológico de los Estados Unidos (USGS):

\[\rho_\lambda=\frac{M_p·Q_{cal}+A_p}{sin(\theta_{SE})}\] Donde:

\(\rho_\lambda\) = Reflectancia planetaria TOA
\(M_p\) = Factor de reescalamiento multiplicativo específico de banda de los metadatos (REFLECTANCE_MULT_BAND_x, donde x es el número de banda)
\(Q_{cal}\) = Valores de píxeles de producto estándar cuantificados y calibrados (DN)
\(A_p\) = Factor de reescalado aditivo específico de banda de los metadatos (REFLECTANCE_ADD_BAND_x, donde x es el número de banda)
\(\theta_{SE}\) = Ángulo local de elevación del sol.El ángulo de elevación del sol del centro de la escena en grados se proporciona en los metadatos (SUN_ELEVATION)


Los coeficientes se pueden obtener directamente de los matadatos:

Band Ap Mp θSE
Ultra-blue -0.1 2e-05 42.81618189
Blue -0.1 2e-05 42.81618189
Green -0.1 2e-05 42.81618189
Red -0.1 2e-05 42.81618189
NIR -0.1 2e-05 42.81618189
SWIR1 -0.1 2e-05 42.81618189
SWIR2 -0.1 2e-05 42.81618189

La reflectancia es un ratio, por lo que tras la corrección solar, los valores de reflectancia TOA quedan como un porcentaje (entre 0 y 1) que relaciona la radiación reflejada por cada pixel respecto a la radiación que recibe. La siguiente tabla muestra un resumen estadístico de las bandas de interés:

Ultra.blue Blue Green Red NIR SWIR1 SWIR2
Min. 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
1st Qu. 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000
Median 0.1210037 0.1005814 0.0868390 0.0743325 0.2169357 0.1875381 0.1082030
3rd Qu. 0.1362763 0.1189438 0.1149123 0.1197089 0.3020385 0.2651370 0.1760027
Max. 0.8379626 0.8793663 0.8794840 0.9540225 1.0000000 1.0000000 1.0000000
NA’s 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000

Perfiles espectrales

El perfil espectral es la representación gráfica del comportamiento espectral de cierta superficie. Los distintos tipos de coberturas terrestres (bosques, suelos cultivados, láminas de agua, etc.) se distinguen por la energía que reflejan y emiten (Alonso et al., 1993). Mediante la comparación de perfiles espectrales se puede reconocer cubiertas de interés y discriminarlas de otras similares, por lo que la obtención de las firmas espectrales se recomiendan como punto de partida en trabajos de teledetección (Chuvieco, 2010).

Para poder clasificar las superficies en función de los valores de reflectancia TOA, es necesario utilizar informacion auxiliar, es decir, información geográfica no espectral. Los muestreos aleatorios realizados en los polígonos clasificados en función de la cobertura del suelo se representan a continuación:

El valor medio de reflectancia TOA de los puntos muestreados en cada polígono de clasificación se recoge en la siguiente tabla:

Estos valores se muestran de un modo más ilustrativo a traves de un gráfico de perfíl espectral, en el que se representa la reflectancia TOA de cada cobertura en función de la banda espectral.

Índices de diferencia normalizada

Debido a las diferencias en la reflectancia de las distintas coberturas del suelo, se pueden emplear índices de diferencia normalizada que permiten obtener información sobre la ocupación del suelo. Esta información puede utilizarse para ampliar el conocimiento sobre la zona de estudio y como una clasificación previa a la clasificación supervisada de cobertura del suelo.

El calculo de la correlación entre los datos de distintas bandas permite saber si poseen o no cierta independencia estadística. Es decir, una alta correlación sugiere una redundancia sustancial en el contenido de la información entre esas bandas (Jensen, 2015). Los datos de correlación son importantes a la hora de elaborar índices de diferencia normalizada, ya que estos índices son ratios, por lo que interesa que la información comparada tenga la mayor independencia estadística posible.

Para todos los índices de diferencia normalizada (NDVI, NDWI y NDBI) se utiliza una expresión con semejante estructura, en la que únicamente cambian las combinaciones de capas a utilizar. La expresión se define de la siquiente forma:


\[NDI=\frac{banda_i-banda_j}{banda_i+banda_j}\]

Índice de vegetación de diferencia normalizada (NDVI)

El Índice de Vegetación de Diferencia Normalizada (NDVI) es un índice que describe la proporción de vegetación midiendo la diferencia en la porción infrarroja cercana del espectro electromagnético, que se refleja fuertemente en la vegetación verde y la porción roja del espectro que es absorbida por la vegetación (Malik et al., 2019). Por lo tanto, las bandas utilizadas para la obtención del NDVI son la banda 5 de infrarrojo cercano (845–885 nm) y la banda 4, del rojo visible (630–680 nm).

Discriminando las zonas que no poseen (presumiblemente) vegetación, se puede obtener una mejor visualización de las zonas con cobertura vegetal. Observando el mapa de NDVI, se puede considerar que valores de NDVI por encima de 0,35 pertenecen a superficies con al menos, cierta flora.

Índice de agua de diferencia normalizada (NDWI)

McFeeters (McFeeters, 1996) propuso el índice de agua de diferencia normalizada (NDWI) más conocido, utilizando la banda verde y la banda del infrarrojo cercano (NIR). Relaciona la gran reflectancia de las masas de agua en la banda verde con su baja relfectancia en la banda NIR. Las bandas utilizadas para la obtención del NDWI son la banda 3, verde visible (525–600 nm) y la banda 5 de infrarrojo cercano (845–885 nm).

Índice de construcción de diferencia normalizada (NDBI)

En comparación con otras superficies de cobertura del suelo, los terrenos urbanizados tienen mayor reflectancia en el rango de longitud de onda MIR que en el rango de longitud de onda NIR (Pattanayak & Diwakar (2018), Malik et al., (2019)). Debido a esto, para el cálculo del Índice de construcción de diferencia normalizada (NDBI) generalmente se utiliza la banda 6 (SWIR1), del infrarrojo medio (1560–1660 nm) y la banda 5 (NIR) de infrarrojo cercano (845–885 nm). Sin embargo, debido a la dificultad de discriminar las zonas residenciales de las superficies de barbecho utilizando esas dos bandas, en el presente area de estudio, se ha utilizado la banda 4, rojo visible (630–680 nm) y la banda 6 (SWIR1) de infrarrojo medio.

Histograma

Un histograma es la representación gráfica de la distribución de frecuencias de una variable. Aporta información valiosa como guía, es decir, es un indicativo para deducir el número de regiones diferenciadas en una variable y así poder buscar un significado a cada zona diferenciada. También es útil a la hora de localizar umbrales para reclasificar imágenes en los análisis de índices de diferencia normalizada.

Composiciones de color

Con las composiciones de color se puede lograr resaltar ciertos componentes o caracteríticas del área de estudio para poder realizar un análisis visual de las imágenes satelitales. La combinación de bandas a utilizar dependerá principalmente de las distintas coberturas de suelo que se deseen resaltar en la zona de interés.

Composición de color natural

Esta composición muestra la imagen tal y como la percebiría el ojo humano, es decir, se asigna la banda del rojo visible (banda 4) al canal rojo del monitor, la banda del verde visible (banda 3) al canal verde y la banda azul (banda 2) al canal azul.

Composición en falso color

Una elección muy utilizada es la composición en falso color que asigna a los canales rojo, verde y azul del monitor las bandas correspondientes al infrarrojo cercano, al rojo y al verde del espectro electromagnético respectivamente. En estas imágenes de falso color una de las características principales es que la vegetación aparece en color rojo. (García-Meléndez, 2006)

Otra composición en falso color utilizada para resaltar las superficies agrícolas es la que combina las bandas 6 (SWIR1), 5 (NIR) y 2 (Azul).

Con la composición en falso color que combina las bandas 7, 6 y 4 se logra resaltar las zonas urbanas con cierta tonalidad morada.

Clasificación supervisada

Las técnicas de clasificación de imágenes satelitales se utilizan para agrupar pixeles con valores similares en varias clases. En la clasificación supervisada, se parte con una serie clases previamente predefinidas (sitios de entrenamiento). El algoritmo de clasificación de imágenes usa los sitios de entrenamiento para identificar las coberturas de suelo en la imagen completa. Como sitios de entrenamiento se van a utilizar los polígonos empleados anteriormente para la obtención de los perfiles espectrales.

Random Forest

Como su propio nombre indica, Random Forest consiste en una gran cantidad de árboles de decisión individuales que operan como un conjunto. Este algoritmo puede ser menos sensible al ruido y puede ser más eficiente que otros clasificadores no paramétricos de uso común, como las máquinas de soporte vectorial (Pelletier et al., 2016). Se han utilizado 1993 puntos de muestreo distribuidos aleatoriamente en los 65 polígonos clasificados previamente. El mapa de clasificación predicho mediante el modelo obtenido por el algoritmo Random Forest se muestra a continuación:


La matriz de confusión permite la visualización de la efectividad del algoritmo de clasificación utilizado. Las columnas de la matriz representan el número de predicciones de cada clase, mientras que las filas representan las observaciones reales en cada categoría.

Clase Agua Barbecho Cultivo herbaceo Cultivo permanente Dehesa Industrial Residencial Error de clase
Agua 232 0 0 0 0 0 2 0.0085470
Barbecho 0 239 3 30 14 0 4 0.1758621
Cultivo herbaceo 0 0 477 5 5 0 0 0.0205339
Cultivo permanente 0 33 4 207 15 0 6 0.2188679
Dehesa 0 1 0 12 495 0 1 0.0275049
Industrial 0 0 0 0 0 57 4 0.0655738
Residencial 1 12 0 13 1 6 114 0.2244898

Evaluación del modelo

La evaluación de precisión es el paso final en el análisis de los datos de teledetección. Ayuda a verificar la precisión de los resultados obtenidos. Se ha elegido la precisión general, el coeficiente Kappa y la precisión del productor y del usuario como evaluaciones cuantitativas para determinar la precisión final de la clasificación supervisada de la cubierta terrestre.

Precisión general

La precisión general es la medida de precisión más simple y una de las más populares. Se calcula dividiendo el el número total de píxeles clasificados correctamente (es decir, la suma de la diagonal principal) por el número total de píxeles en la matriz de confusión (Congalton, 1991).

\[Overall\ accuracy\ (OA)=\frac{\sum{Diagonal}}{\sum{matrix}}\]

Donde:

\(\sum{Diagonal}\) = Suma de los valores de la diagonal principal de la matriz de confusión
\(\sum{matrix}\) = Suma de todos los valores de la matriz de confusión

Kappa

Esta evaluación corrige la precisión general de las predicciones del modelo por la precisión que se espera que ocurra por casualidad:

\[Kappa\ (K)=\frac{Overall\ accuracy-chance\ agreement}{1-chance\ agreement}\]

Donde:

\(Overall\ accuracy\) = Determinado por la diagonal principal de la matriz de confusión
\(chance\ agreement\) = Suma del producto de los totales de cada fila y columna divididos por el número total de pixeles muestreados para cada clase.


Los valores de evaluación de la precisión general y kappa se muestran a continuación:

Overall_accuracy Kappa
0.9136979 0.8940531

Precisión del productor y del usuario

Se produce un error de clasificación cuando a un pixel perteneciente a una clase se le asigna una clase distinta. La precisón del Productor mide errores de omisión, es decir, cuando se excluye un pixel de la categoría que está siendo evaluada. En cambio, la precisión del usuario mide los errores de comisión, esto es, cuando se incluye un pixel incorrectamente en la categoría que está siendo evaluada.

La precisión del productor (PA) se obtiene de dividir el número de píxeles correctamente clasificados en cada categoría (diagonal principal de la matriz de confusión) por el número de píxeles de referencia de esa categoría (el total de la columna):

\[Productor\ accuracy\ (PA)=\frac{Diagonal}{\sum{col}}\] Donde:

\(Diagonal\) = Valor de la columna perteneciente a la diagonal principal de la matriz de confusión
\(\sum{col}\) = Suma de cada columna de la matriz de confusión


Mientras que la precisión del usuario (UA) se calcula dividiendo el número de píxeles correctamente clasificados en cada categoría por el número total de píxeles que se clasificaron en esa categoría (el total de la fila):

\[User\ accuracy\ (UA)=\frac{Diagonal}{\sum{row}}\] Donde:

\(Diagonal\) = Valor de la fila perteneciente a la diagonal principal de la matriz de confusión
\(\sum{col}\) = Suma de cada fila de la matriz de confusión


Los valores de precisión del productor y del usuario para cada tipo de cobertura se agrupan en la siguiente tabla:

Clase Precision_productor Precision_usuario
Agua 0.9957082 0.9914530
Barbecho 0.8385965 0.8241379
Cultivo herbaceo 0.9855372 0.9794661
Cultivo permanente 0.7752809 0.7811321
Dehesa 0.9339623 0.9724951
Industrial 0.9047619 0.9344262
Residencial 0.8702290 0.7755102

Discusión

Observando los perfiles espectrales, se pueden prever las dificultades que se van a presentar en torno a la clasificación de las superficies de barbecho, cultivos permanentes y residenciales cuya semejanza espectral complica su discriminación. Esta semejanza puede estar ocasionada por el sistema de explotación extensivo tradicional de la zona, donde, amplios marcos de plantación unido a una labranza constante del terreno, hace que las superficies destinadas a cultivos permanentes reflejen la radiación de forma similar a los terrenos en barbecho (también intensamente labrados). Ambas superficies difieren únicamente en la mayor reflectancia de los cultivos permanentes debido a la mayor presencia de vegetación. La similitud espectral entre estas dos clases y las superficies residenciales puede deberse a que el componente principal en la fabricación del material cerámico, utilizado generalmente en este tipo de construcciones, es la arcilla, mineral predominante en el área de estudio. Sin embargo, estas firmas espectrales difieren de las obtenidas en las superficies industriales, tambien dedicadas a la edificación, pero donde se utilizan materiales metálicos para su construcción.

Las superficies destinadas a cultivos herbáceos mantienen el perfil habitual para ese tipo de vegetación, baja relfectancia en el espectro visible y un pico pronunciado en el infrarrojo cercano (NIR). En el caso de los cultivos permanentes, la menor reflectancia en el NIR puede deberse a su baja densidad de plantación, donde gran parte de la energía recibida en el sensor es reflejada por el suelo subyacente. Algo distinto sucede en las áreas de dehesa, donde el terreno esta completamente cubierto de vegetación. En este caso la baja reflectancia en el infrarrojo cercano puede estar producida por el tipo de vegetación presente en la zona, con fracciones secas y leñosas que poseen escasa cantidad de clorofilas.

La reflectancia en la porción del infrarrojo medio (SWIR1) de las distintas clases de vegetación está influenciada por la cantidad de humedad presente en sus tejidos. A medida que aumenta el contenido de agua en la hoja, las características de absorción de radiación SWIR se ven afectadas por las propiedades espectrales del agua (Serbin et al., 2009). Esto explicaría la menor reflectancia de los cultivos anuales en esta porción del espectro, debido a que, sus estructuras deben almacenar mayor cantidad de agua para mantener la turgencia. Unido a esto, muchos agricultores aumentan la disponibilidad de agua para esos cultivos mediante la utilización sistemas de riego.

En la matriz de correlación se puede observar que la banda del infrarrojo cercano (NIR) es la menos correlacionada con el resto, siendo la que posee menor información redundante de las otras bandas. Es por esto que se utiliza en la gran mayoría de los índices de diferencia normalizada. El resto de bandas poseen una correlación alta, superior al 70%.

El índice de vegetación de diferencia normalizada (NDVI) muestra valores bastante dispares entre las diferentes áreas de vegetación. Los cultivos herbáceos ubicados en la ribera del río Tajo y en la zona noroeste del área de estudio presentan valores cercanos a 1, lo que está asociado a una vegetación más activa (Chuvieco, 2008). Si bien el valor del NDVI puede variar en función de diversos factores como el estado fenológico de la vegetación o situación hídrica del suelo, puede utilizarse como criterio de clasificación si se dispone de valores de referencia. Hernández et al., (2014) obtivieron valores de NDVI que oscilan entre 0,3 y 0,4 para otras dehesas de la Península Ibérica, lo que concuerda con lo obtenido en el presente trabajo.

Mediante el índice de agua de diferencia normalizada (NDWI) se logró identificar las masas de agua presentes en el área de estudio. El índice permite, incluso a simple vista, reconocer pequeñas balsas de riego. Sin embargo, no se obtuvieron los mismos resultados al intentar identificar el terreno construido mediante el NDBI. La discriminación de clases no fue del todo efectiva debido a las similitudes espectrales comentadas anteriormente.

Junto con los índices de diferencia normalizada, las composiciones de color permitieron la identificación previa de las coberturas de suelo. Es preciso destacar que las composiciones en falso color son especialmente útiles para el reconocimiento de superficies con ciertas características espectrales, como la vegetación.

Mediante el algoritmo de clasificación supervisada Random Forest se obtuvo un buen mapa de cobertura de suelos, donde se pueden identificar la mayoría de superficies destacadas anteriormente mediante los índices de diferencia normalizada y las composiciones de color. Tras calcular la precisión general del modelo, se obtuvo que el 91,37% de las muestras estaban correctamente clasificadas, con un coeficiente kappa de 0,894, el cual se considera casi perfecto (Landis & Koch, 1977).

La categoría peor clasificada por el modelo es cultivos permanentes, con una precisión de productor y de usuario de 0,7753 y 0,7811 respectivamente. Esto quiere decir que el 77,53% de los pixeles clasificados previamente en esa categoría también aparecen con esa clasificación en el mapa (precisión del productor) y que el 78,11% de los píxeles que aparecen con esa clase en el mapa realmente son cultivos permanentes (precisión del usuario). Ademas de ésta, las únicas clases con una precisión menor al 90% son barbecho (0.8386 y 0.8241) y residencial (0.8702 y 0.7755). Observando la matriz de confusión, se puede apreciar que la mayoría de los píxeles clasificados incorrectamente en estas categorías han sido adjudicado entre estas mismas categorías, como se predijo al analizar el gráfico de perfiles espectrales. Por ejemplo, a la categoría de barbecho se le han incluido 33 pixeles de cultivos permanentes y 12 de residencial, mientras que a la clase Cultivos permanentes se le han adjudicado 30 pixeles pertenecientes a barbecho y 13 pertenecientes a residencial.

Conclusión

Las regiones semiáridas de la provincia de toledo presentan, en algunas de sus cubiertas, semejanzas espectrales y radiométricas que reducen la precisión con la que se puede elaborar una clasificación supervisada de cobertura de suelo.

Debido a la gran cantidad de información que aporta, el gráfico de perfiles espectrales es un primer paso fundamental para la elaboración de una clasificación supervisada de coberturas. También es recomendable la aplicación de índices de diferencia normalizada y composiciones de color como herramientas para la comprensión espectral de las superficies evaluadas.

Con el algoritmo Random Forest se obtienen buenos modelos de clasificación supervisada, a pesar de las similitudes espectrales presentes en las coberturas del área de estudio. No obstante, es preciso tener en cuenta los resultados obtenidos en la evaluación de precisión del modelo a la hora de llevar a cabo una interpretación del mapa de clasificación.

Bibliografía

ALONSO, Carmelo; MORENO, Victoriano y RODRÍGUEZ, Elías (1993). Determinación experimental de la firma espectral de la vegetación. una sencilla práctica de introducción a la teledetección. en: teledetección. avances y aplicaciones. En: Memorias VIII Congreso Nacional de Teledetección. p. 429-432.

Chuvieco, E. (2008). Teledetección ambiental, la observación de la tierra desde el espacio. Barcelona, España, Editorial Ariel.

Congalton, R. G. (1991). A review of assessing the accuracy of classifications of remotely sensed data. Remote sensing of environment, 37(1), 35-46.

Emilio Chuvieco. (2010). “Teledetección Ambiental”. Edición 2010, Editorial Ariel, pag 18,46,55.

Ferreira, M. T. (2013). Calidad ecológica en la Demarcación Hidrográfica del Tajo: Una perspectiva integrada. El Tajo. Historia de un río ignorado, 145-171.

GARCÍA-MELÉNDEZ, E. D. U. A. R. D. O. (2006). Análisis visual de imágenes. Área de Geodinámico Externa.

Gómez, C., White, J. C., & Wulder, M. A. (2016). Optical remotely sensed time series data for land cover classification: A review. ISPRS Journal of Photogrammetry and Remote Sensing, 116, 55-72.

Han, K. S., Champeaux, J. L., & Roujean, J. L. (2004). A land cover classification product over France at 1 km resolution using SPOT4/VEGETATION data. Remote sensing of Environment, 92(1), 52-66.

Hernández, C. G., Escribano, J. A., & TARQUIS, Y. (2014). COMPARACIÓN DEL ÍNDICE DE VEGETACIÓN DE DIFERENCIA NORMALIZADA OBTENIDO A DIFERENTES ESCALAS EN PASTOS DE DEHESA. PASTOS Y PAC, 121-128.

Jensen, John R. (2015). Introductory Digital Image Processing: A Remote Sensing Perspective. USA. Prentice Hall Press.

Landis, J. R., & Koch, G. G. (1977). The measurement of observer agreement for categorical data. biometrics, 159-174.

Lu, D., & Weng, Q. (2007). A survey of image classification methods and techniques for improving classification performance. International journal of Remote sensing, 28(5), 823-870.

Malik, M. S., Shukla, J. P., & Mishra, S. (2019). Relationship of LST, NDBI and NDVI using Landsat-8 data in Kandaihimmat Watershed, Hoshangabad, India.

McFeeters, S. K. (1996). The use of the Normalized Difference Water Index (NDWI) in the delineation of open water features. International journal of remote sensing, 17(7), 1425-1432.

Pattanayak, S. P., & Diwakar, S. K. (2018). Seasonal Comparative Study of NDVI, NDBI and NDWI of Hyderabad City (Telangana) Based on LISS-III Image Using Remote Sensing and DIP. Khoj: An International Peer Reviewed Journal of Geography, 5(1), 78-86.

Reis, I., Baron, D., & Shahaf, S. (2018). Probabilistic Random Forest.

Serbin, G., Daughtry, C. S., Hunt, E. R., Brown, D. J., & McCarty, G. W. (2009). Effect of soil spectral properties on remote sensing of crop residue cover. Soil Science Society of America Journal, 73(5), 1545-1558.

Young, N. E., Anderson, R. S., Chignell, S. M., Vorster, A. G., Lawrence, R., & Evangelista, P. H. (2017). A survival guide to Landsat preprocessing. Ecology, 98(4), 920-932.

Zhang, Y., Guo, L., Chen, Y., Shi, T., Luo, M., Ju, Q., … & Wang, S. (2019). Prediction of Soil Organic Carbon based on Landsat 8 Monthly NDVI Data for the Jianghan Plain in Hubei Province, China. Remote Sensing, 11(14), 1683.

LS0tDQp0aXRsZTogQ2xhc2lmaWNhY2nDs24gc3VwZXJ2aXNhZGEgZGUgbGEgY29iZXJ0dXJhIGRlIHN1ZWxvIG1lZGlhbnRlIGVsIGFsZ29yaXRtbyBSYW5kb20gRm9yZXN0IGVuIHVuIMOhcmVhIGRlIGxhIHByb3ZpbmNpYSBkZSBUb2xlZG8gKEVzcGHDsWEpIA0KYXV0aG9yOiAiUGVkcm8gUGFibG8gUGxhdGVybyBQYXBhc2VpdCINCmRhdGU6ICIyMCBBYnJpbCAyMDIwIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCg0KIyBJbnRyb2R1Y2Npw7NuDQoNCjxkaXYgc3R5bGU9InRleHQtYWxpZ246IGp1c3RpZnkiPg0KDQpDb21vIG5vcm1hIGdlbmVyYWwsIGxhcyBjbGFzaWZpY2FjaW9uZXMgZGUgY29iZXJ0dXJhIGRlIHN1ZWxvIHByb3BvcmNpb25hbiBpbmZvcm1hY2nDs24gZWxlbWVudGFsIHBhcmEgZXZhbHVhciBlbCBpbXBhY3RvIGRlIGxhcyBpbnRlcmFjY2lvbmVzIGh1bWFuYXMgZGVudHJvIGRlbCBtZWRpbyBhbWJpZW50ZSB5IGV2YWx1YXIgbG9zIGZ1bmRhbWVudG9zIGNpZW50w61maWNvcyBwYXJhIGxhIHNvc3RlbmliaWxpZGFkLCBsYSB2dWxuZXJhYmlsaWRhZCB5IGxhIHJlc2lsaWVuY2lhIGRlIGxvcyBzaXN0ZW1hcyBkZSB0aWVycmFzIHkgc3UgdXNvIChIYW4gZXQgYWwuLCAyMDA0KS4gU2luIGVtYmFyZ28sIGNsYXNpZmljYXIgbG9zIGRhdG9zIGRlIGRldGVjY2nDs24gcmVtb3RhIGVuIHVuIG1hcGEgdGVtw6F0aWNvIHNpZ3VlIHNpZW5kbyB1biBkZXNhZsOtbyBkZWJpZG8gYSBxdWUgbXVjaG9zIGZhY3RvcmVzLCBjb21vIGxhIGNvbXBsZWppZGFkIGRlbCBwYWlzYWplIGVuIHVuIMOhcmVhIGRlIGVzdHVkaW8sIGxvcyBkYXRvcyBkZSBkZXRlY2Npw7NuIHJlbW90YSBzZWxlY2Npb25hZG9zIHkgbG9zIGVuZm9xdWVzIGRlIHByb2Nlc2FtaWVudG8gZGUgaW3DoWdlbmVzIHkgY2xhc2lmaWNhY2nDs24sIHB1ZWRlbiBhZmVjdGFyIGVsIMOpeGl0byBkZSB1bmEgY2xhc2lmaWNhY2nDs24gKEx1ICYgV2VuZywgMjAwNykuDQoNClNlZ8O6biBHw7NtZXogZXQgYWwuLCAoMjAxNiksIGxhIGNvYmVydHVyYSB0ZXJyZXN0cmUgc2UgcmVsYWNpb25hIGNvbiBsYSBjb2JlcnR1cmEgYmlvZsOtc2ljYSBkZSBsYSBzdXBlcmZpY2llIGRlIGxhIFRpZXJyYSwgaWRlbnRpZmljYW5kbyB2ZWdldGFjacOzbiwgYWd1YXMgY29udGluZW50YWxlcywgc3VlbG8gZGVzbnVkbyBvIGluZnJhZXN0cnVjdHVyYSBodW1hbmEuIFVuYSBkaWZpY3VsdGFkIGVuIGxhIGNsYXNpZmljYWNpw7NuIGRlIGxhIGN1YmllcnRhIHRlcnJlc3RyZSBlbiBhbWJpZW50ZXMgc2VtacOhcmlkb3MgY29tbyBlbCBkZSBsYSB6b25hIGRlIFRvbGVkbywgZXMgbGEgc2ltaWxpdHVkIGVzcGVjdHJhbCBkZSBhbGd1bm9zIGRlIHN1cyB0aXBvcyBkZSBjb2JlcnR1cmEuIEVzdGEgc2l0dWFjacOzbiBwdWVkZSBkaWZpY3VsdGFyIGxhIGRpc2NyaW1pbmFjacOzbiBkZSBsYXMgZGlmZXJlbnRlcyBjb2JlcnR1cmFzIGRlIHN1ZWxvLCBsbGV2YW5kbyBhIHVuYSBjbGFzaWZpY2FjacOzbiBlcnLDs25lYS4gDQoNCkVsIMOhcmVhIGRlIGVzdHVkaW8gcGVydGVuZWNlIGEgbGEgQ3VlbmNhIGhpZHJvZ3LDoWZpY2EgZGVsIFRham8uIEVsIHLDrW8gVGFqbyBjb25zdGl0dXllIHVuYSBpbXBvcnRhbnRlIGRlbWFyY2FjacOzbiBoaWRyb2dyw6FmaWNhLCBsYSBxdWludGEgZGUgbWF5b3IgZGltZW5zacOzbiBhIG5pdmVsIGV1cm9wZW8geSBsYSB0ZXJjZXJhIGRlIGxhIFBlbsOtbnN1bGEgSWLDqXJpY2EsIGNvbiB1bmEgc3VwZXJmaWNpZSBkZSA4MC42Mjkga21eMl4sIGRlIGxvcyBxdWUgYXByb3hpbWFkYW1lbnRlIHVuIDMwJSBlc3TDoW4gc2l0dWFkb3MgZW4gdGVycml0b3JpbyBwb3J0dWd1w6lzICgyNC44MDAga21eMl4pIChGZXJyZWlyYSwgMjAxMykuIERlYmlkbyBhIGxhIGltcG9ydGFuY2lhIGVjb2zDs2dpY2EsIGRlbW9ncsOhZmljYSwgZWNvbsOzbWljYSB5IHNvY2lhbCBxdWUgcmVwcmVzZW50YSBsYSBjdWVuY2EsIGVzIHByZWNpc28gZWwgYW7DoWxpc2lzIHkgbW9uaXRvcmVvIGRlbCB1c28geSBldm9sdWNpw7NuIGRlIGxhcyBjb2JlcnR1cmFzIGRlbCBzdWVsbyBwYXJhIGdhcmFudGl6YXIgc3Ugc29zdGVuaWJpbGlkYWQuDQoNCkVsIHByZXNlbnRlIGFydMOtY3VsbyB0aWVuZSBjb21vIG9iamV0aXZvIGxhIGVsYWJvcmFjacOzbiBkZSB1bmEgY2xhc2lmaWNhY2nDs24gc3VwZXJ2aXNhZGEgZGUgbGFzIGNvYmVydHVyYXMgZGUgc3VlbG8gZW4gZWwgw6FyZWEgZGUgZXN0dWRpbywgbWVkaWFudGUgbGEgdXRpbGl6YWNpw7NuIGRlIHTDqWNuaWNhcyBkZSBkZXRlY2Npw7NuIHJlbW90YS4NCg0KPGRpdi8+DQoNCiMgRGF0b3MgeSBtw6l0b2RvDQoNCiMjIFpvbmEgZGUgZXN0dWRpbw0KDQo8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOiBqdXN0aWZ5Ij4NCg0KRWwgw6FyZWEgc2VsZWNjaW9uYWRhIGNvbXByZW5kZSB1bmEgc3VwZXJmaWNpZSByZWN0YW5ndWxhciBkZSA4ODEsNzAga21eMl4gcXVlIGNvbXByZW5kZSBsYXMgZsOpcnRpbGVzIHZlZ2FzIGRlbCByw61vIFRham8gZW4gbGFzIGlubWVkaWFjaW9uZXMgZGUgbGEgY2l1ZGFkIGRlIFRvbGVkbywgZW4gbGEgY29tdW5pZGFkIGF1dMOzbm9tYSBkZSBDYXN0aWxsYSBsYSBNYW5jaGEuIEVzdGEgc2l0dWFkbyBlbiBsYSBzdWJtZXNldGEgc3VyIGRlIGxhIFBlbsOtbnN1bGEgSWLDqXJpY2EgZW50cmUgbGFzIGVzdHJpYmFjaW9uZXMgZGUgbGEgU2llcnJhIGRlIEdyZWRvcyBhbCBOb3J0ZSB5IGxvcyBNb250ZXMgZGUgVG9sZWRvIGFsIFN1ci4NCg0KPGRpdi8+DQoNClwNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpsaWJyYXJ5KGxlYWZsZXQpDQoNCmxlYWZsZXQod2lkdGggPSAiMTAwJSIpICU+JSANCmFkZFRpbGVzKCkgJT4lDQpzZXRWaWV3KGxuZyA9IC00LjE1LCBsYXQgPSAzOS44Nywgem9vbSA9IDExKSAlPiUNCmFkZE1hcmtlcnMobG5nID0gLTQuMTUsIGxhdCA9IDM5Ljg3LCBwb3B1cCA9ICJUaGUgTGFuZHNhdCBzY2VuZSBjZW50ZXIiKSAlPiUNCmFkZFByb3ZpZGVyVGlsZXMocHJvdmlkZXJzJE9wZW5TdHJlZXRNYXAuSE9ULCBvcHRpb25zPSBwcm92aWRlclRpbGVPcHRpb25zKG9wYWNpdHkgPSAxKSkNCmBgYA0KDQpcDQo8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOiBqdXN0aWZ5Ij4NCg0KTG9zIGzDrW1pdGVzIGRlbCDDoXJlYSBzb24gMzg3NDM1LjAwLCA0MjU1MDUuMDAgcGFyYSBsYSBsb25naXR1ZCB5IDQ0MDE1NTUuMDAsIDQ0MjQ3MTUuMDAgcGFyYSBsYSBsYXRpdHVkLCBjb24gZWwgc2lzdGVtYSBkZSByZWZlcmVuY2lhIGRlIGNvb3JkZW5hZGFzIEVQU0c6MzI2MzAgLSBXR1MgODQgLyBVVE0gem9uZSAzME4uDQoNCkxvcyBkYXRvcyByYWRpb21ldHJpY29zIHkgZXNwZWN0cmFsZXMgc2UgaGFuIG9idGVuaWRvIGRlIHVuYSBpbWFnZW4gc2F0ZWxpdGFsIExhbmRzYXQgOCBuaXZlbCAxLCBjb3JyZXNwb25kaWVudGUgYWwgMTQgZGUgTWFyem8gZGUgMjAyMCBjdXlvIGlkZW50aWZpY2Fkb3IgZGUgcHJvZHVjdG8gZXMgTEMwOF9MMVRQXzIwMTAzMl8yMDIwMDMxNF8yMDIwMDMyNV8wMV9UMS4gDQoNCkxhIGNsYXNpZmljYWNpw7NuIHN1cGVydmlzYWRhIHNlIGhhIGxsZXZhZG8gYSBjYWJvIG1lZGlhbnRlIGVsIGFsZ29yaXRtbyBSYW5kb20gRm9yZXN0LiBFc3RlIGFsZ29yaXRtbyBlcyB1bmEgZm9ybWEgZGUgY2xhc2lmaWNhY2nDs24gY29uanVudGEgZGUgw6FyYm9sZXMgZGUgZGVjaXNpw7NuLiBVbiDDoXJib2wgZGUgZGVjaXNpw7NuIGVzIHVuIG1vZGVsbyBubyBwYXJhbcOpdHJpY28sIHF1ZSBzZSBkZXNjcmliZSBtZWRpYW50ZSB1biBncsOhZmljbyBzaW1pbGFyIGEgdW4gw6FyYm9sLCB5IHNlIHV0aWxpemEgdGFudG8gZW4gdGFyZWFzIGRlIGNsYXNpZmljYWNpw7NuIGNvbW8gZGUgcmVncmVzacOzbiAoUmVpcyBldCBhbC4sIDIwMTgpLiBDYWRhIMOhcmJvbCBpbmRpdmlkdWFsIGRlbCBSYW5kb20gRm9yZXN0IHJlYWxpemEgdW5hIHByZWRpY2Npw7NuIGRlIGNsYXNlIHkgbGEgY2xhc2UgY29uIG3DoXMgdm90b3Mgc2UgY29udmllcnRlIGVuIGxhIHByZWRpY2Npw7NuIGRlIG51ZXN0cm8gbW9kZWxvLg0KDQpQYXJhIGxsZXZhciBhIGNhYm8gbGEgZXZhbHVhY2nDs24gZGUgcHJlY2lzacOzbiwgc2UgYXNpZ25hcm9uIHkgZXhhbWluYXJvbiBhbCBhemFyIHVuIHRvdGFsIGRlIDY1IHBvbMOtZ29ub3MgZGUgbXVlc3RyYSBxdWUgY3VicmVuIGRpZmVyZW50ZXMgdGlwb3MgZGUgY29iZXJ0dXJhIHRlcnJlc3RyZSwgdXRpbGl6YW5kbyBkYXRvcyBkZWwgU2lzdGVtYSBkZSBJbmZvcm1hY2nDs24gc29icmUgT2N1cGFjacOzbiBkZWwgU3VlbG8gZGUgRXNwYcOxYSAoU0lPU0UpLCBlbCBTaXN0ZW1hIGRlIEluZm9ybWFjacOzbiBHZW9ncsOhZmljYSBkZSBQYXJjZWxhcyBBZ3LDrWNvbGFzIChTSUdQQUMpLCBlbCBTaXN0ZW1hIGRlIEluZm9ybWFjacOzbiBHZW9ncsOhZmljYSBkZSBEYXRvcyBBZ3JhcmlvcyAoU0lHQSkgZSBpbWFnZW5lcyBkZSBhbHRhIHJlc29sdWNpw7NuIGRlbCBtYXBhIGRlIEdvb2dsZSBFYXJ0aC4gRXN0b3MgbWlzbW9zIHBvbMOtZ29ub3MgZnVlcm9uIHV0aWxpemFkb3MgcGFyYSBsYSBvYnRlbmNpw7NuIGRlIGxvcyBwZXJmaWxlcyBlc3BlY3RyYWxlcyBkZSBsYXMgY29iZXJ0dXJhcyBkZSBzdWVsby4gTG9zIHDDrXhlbGVzIGRlIG11ZXN0cmVvIHV0aWxpemFkb3MgcGFyYSBsYSBldmFsdWFjacOzbiBkZSBwcmVjaXNpw7NuIHNlIHNlbGVjY2lvbmFyb24gdXRpbGl6YW5kbyBlbCBtw6l0b2RvIGRlIG11ZXN0cmVvIGVzdHJhdGlmaWNhZG8gYWxlYXRvcmlhbWVudGUuDQpcDQo8ZGl2Lz4NCg0KXA0KYGBge3IgaW5jbHVkZT1GQUxTRX0NCmxpYnJhcnkoc3ApDQpsaWJyYXJ5KHJhc3RlcikNCmxpYnJhcnkoUlN0b29sYm94KQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShyZXNoYXBlMikNCmxpYnJhcnkocmdkYWwpDQpgYGANCg0KYGBge3IgaW5jbHVkZT1GQUxTRX0NCmxpYnJhcnkobGVhZmxldCkNCg0KcG9seWdvbnMgPC0gc2hhcGVmaWxlKCJDOi9Vc2Vycy9VU1MvRGVza3RvcC9QZWRyby8yMDE5IC0gMjAyMC9QZXJjZXBjaW9uIHJlbW90YS9JbmZvcm1lIDEvQ29iZXJ0dXJhcy9jb2JlcnR1cmFzLnNocCIpDQpwcm9qNHN0cmluZyhwb2x5Z29ucykNCmBgYA0KDQpgYGB7ciBpbmNsdWRlPUZBTFNFfQ0KIyBSZXByb3llY3RhbW9zIGxvcyBwb2zDrWdvbm9zIHBhcmEgcG9kZXIgdmlzdWFsaXphcmxvcyBjb3JyZWN0YW1lbnRlDQoNCnBvbF9yZXAgPC0gc3BUcmFuc2Zvcm0ocG9seWdvbnMsIENSUygiK2luaXQ9ZXBzZzo0MzI2IikpDQpwcm9qNHN0cmluZyhwb2xfcmVwKQ0KYGBgDQoNCmBgYHtyIGVjaG89RkFMU0V9DQpsZWFmbGV0KHdpZHRoID0gIjEwMCUiKSAlPiUNCiAgYWRkUHJvdmlkZXJUaWxlcyhwcm92aWRlcnMkRXNyaS5Xb3JsZEltYWdlcnksIG9wdGlvbnM9IHByb3ZpZGVyVGlsZU9wdGlvbnMob3BhY2l0eSA9IDAuOTkpKSAlPiUNCiAgYWRkUG9seWdvbnMoZGF0YSA9IHBvbF9yZXAsIHBvcHVwPXBvbF9yZXAkY2xhc3MsDQogIHN0cm9rZSA9IEZBTFNFLCBmaWxsT3BhY2l0eSA9IDAuNSwgc21vb3RoRmFjdG9yID0gMC41KSAlPiUNCiAgc2V0VmlldyhsbmcgPSAtNC4wOCwgbGF0ID0gMzkuODcsIHpvb20gPSAxMSkNCmBgYA0KDQpcDQo8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOiBqdXN0aWZ5Ij4NCg0KTGEgY2xhc2lmaWNhY2nDs24gdXRpbGl6YWRhIHBhcmEgbG9zIHBvbMOtZ29ub3MgZGUgbXVlc3RyYSBzZSBkZXNjcmliZSBhIGNvbnRpbnVhY2nDs246DQoNCi1BZ3VhOiBNYXNhcyBkZSBhZ3VhIGNvbnRpbmVudGFsZXMgcXVpZXRhcyBvIGNvcnJpZW50ZXMgZGUgbGEgc3VwZXJmaWNpZSBkZWwgc3VlbG8uIFByaW5jaXBhbG1lbnRlIG1hc2FzIGRlIGFndWEgcGVydGVuZWNpZW50ZXMgYWwgcmlvIFRham8sIGVtYmFsc2VzIG5hdHVyYWxlcyB5IGJhbHNhcyBkZSByaWVnby4NCg0KLUJhcmJlY2hvOiBUZXJyZW5vIGRlIGxhYm9yIHF1ZSBubyBlcyBzZW1icmFkbyBkdXJhbnRlIGNpZXJ0byBuw7ptZXJvIGRlIGNpY2xvcyB2ZWdldGF0aXZvcyBjb24gZWwgZmluIGRlIHBlcm1pdGlyIHN1IHJlZ2VuZXJhY2nDs24geSBlbCBhbG1hY2VuYW1pZW50byBow61kcmljby4gIA0KDQotQ3VsdGl2b3MgaGVyYsOhY2VvczogUHJpbmNpcGFsbWVudGUgY3VsdGl2b3MgYW51YWxlcyBkZSBzZWNhbm8geSByZWdhZMOtbywgZW50cmUgbG9zIHF1ZSBwcmVkb21pbmFuIGxvcyBjZXJlYWxlcyBkZSBncmFubyBjb21vIG1haXosIHRyaWdvIHkgY2ViYWRhLg0KDQotQ3VsdGl2b3MgcGVybWFuZW50ZXM6IEN1bHRpdm9zIGxlw7Fvc29zIGVudHJlIGxvcyBxdWUgcHJlZG9taW5hbiBlbCBvbGl2YXIgeSBlbCB2acOxZWRvLg0KDQotRGVoZXNhOiBFc3RhIGNsYXNlIGNvbXByZW5kZSB1bmEgbWV6Y2xhIGRlIGxhcyBjb2JlcnR1cmFzIGRlZmluaWRhcyBwb3IgZWwgU0lPU0UgY29tbyBwYXN0aXphbCwgYXJib2xhZG8gZm9yZXN0YWwgeSBtYXRvcnJhbC4gUHJlZG9taW5hbiBsb3MgZW5jaW5hcmVzIHkgbGEgbWV6Y2xhIGRlIGNvbsOtZmVyYXMgeSBmcm9uZG9zYXMgYXV0w7NjdG9uYXMgZGVsIGfDqW5lcm8gcXVlcmN1cy4gVGFtYmnDqW4gZGVzdGFjYSBsYSBwcmVzZW5jaWEgZGUgcGFzdGl6YWwgbWF0b3JyYWwgY29uIGVzcGVjaWVzIGF1dMOzY3RvbmFzIGRlbCBnZW5lcm8gcmV0YW1hLCBsYXZhbmR1bGEsIHJvc21hcmludXMgeSB0aHltdXMgZW50cmUgb3RyYXMuDQoNCi1JbmR1c3RyaWFsOiBFZGlmaWNhY2lvbmVzIGRlIHRpcG8gaW5kdXN0cmlhbCBlbiBsYXMgcXVlIHByZWRvbWluYW4gbGFzIGN1YmllcnRhcyBhbXBsaWFzIGRlIGNvbG9yZXMgY2xhcm9zLCBnZW5lcmFsbWVudGUgYmxhbmNvIG8gbWV0w6FsaWNvIGNhcmFjdGVyw61zdGljbyBkZSBsYXMgY2hhcGFzIG1ldMOhbGljYXMgbyBwYW5lbGVzIHPDoW5kd2ljaC4gDQoNCi1SZXNpZGVuY2lhbDogRWRpZmljYWNpb25lcyBkZSB0aXBvIHJlc2lkZW5jaWFsIGVuIGxhcyBxdWUgcHJlZG9taW5hbiBsb3MgY29sb3JlcyBtYXJyb25lcywgcm9qaXpvcyB5IG9jcmVzIGNhcmFjdGVyw61zdGljb3MgZGUgbGFzIGN1YmllcnRhcyBjZXLDoW1pY2FzLg0KDQpQYXJhIGVsIHByb2Nlc2FtaWVudG8geSBhbsOhbGlzaXMgZGUgbG9zIGRhdG9zIHNhdGVsaXRhbGVzIHNlIGhhIGVtcGxlYWRvIHNvZnR3YXJlIG9wZW4gc291cmNlIFJzdHVkaW8uIFBhcmEgbGEgZGlnaXRhbGl6YWNpw7NuIGRlIGxvcyBwb2zDrWdvbm9zIGRlIG11ZXN0cmEgc2UgaGEgdXRpbGl6YWRvIG90cm8gc29mdHdhcmUgbGlicmUgeSBkZSBjb2TDrWdvIGFiaWVydG8sIFFnaXMuDQoNCjxkaXYvPg0KDQojIyBNZXRvZG9sb2fDrWENCg0KPGRpdiBzdHlsZT0idGV4dC1hbGlnbjoganVzdGlmeSI+DQoNCkVuIGVsIHNpZ3VpZW50ZSBncsOhZmljbyBzZSBtdWVzdHJhIGxhIG1ldG9kb2xvZ8OtYSBsbGV2YWRhIGEgY2FibyBwYXJhIGVsIGFuw6FsaXNpcyBkZSBsYXMgaW3DoWdlbmVzIHNhdGVsaXRhbGVzIHkgbGEgZWxhYm9yYWNpw7NuIGRlIGxhIGNsYXNpZmljYWNpw7NuIHN1cGVydmlzYWRhOg0KDQo8ZGl2Lz4NCg0KYGBge3IsIG91dC53aWR0aCA9ICIxMDAlIiwgZWNobyA9IEZBTFNFLCBmaWcuYWxpZ24gPSAiY2VudGVyIn0NCg0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoIkM6L1VzZXJzL1VTUy9EZXNrdG9wL1BlZHJvLzIwMTkgLSAyMDIwL1BlcmNlcGNpb24gcmVtb3RhL0luZm9ybWUgMS9kaWFncmFtYTIucG5nIikNCg0KYGBgDQoNCg0KIyBSZXN1bHRhZG9zDQoNCiMjIFByZXByb2Nlc2FtaWVudG8NCg0KPGRpdiBzdHlsZT0idGV4dC1hbGlnbjoganVzdGlmeSI+DQoNCkxhcyBpbcOhZ2VuZXMgYWRxdWlyaWRhcyBwb3IgbG9zIHNlbnNvcmVzIExhbmRzYXQgZXN0w6FuIHN1amV0YXMgYSBkaXN0b3JzacOzbiBjb21vIHJlc3VsdGFkbyBkZSBsb3Mgc2Vuc29yZXMsIGxvcyBlZmVjdG9zIHNvbGFyZXMsIGF0bW9zZsOpcmljb3MgeSB0b3BvZ3LDoWZpY29zLiBFbCBwcmVwcm9jZXNhbWllbnRvIGludGVudGEgbWluaW1pemFyIGVzdG9zIGVmZWN0b3MgZW4gbGEgbWVkaWRhIGRlc2VhZGEgcGFyYSB1bmEgYXBsaWNhY2nDs24gcGFydGljdWxhci4gKFlvdW5nIGV0IGFsLiwgMjAxNykNCg0KPGRpdi8+DQoNCiMjIyBDb3JyZWNjacOzbiByYWRpb23DqXRyaWNhDQoNCjxkaXYgc3R5bGU9InRleHQtYWxpZ246IGp1c3RpZnkiPg0KDQpFbiBlbCBwcmVzZW50ZSBlc3R1ZGlvIHNlIHZhbiBhIHV0aWxpemFyIHZhbG9yZXMgZGUgcmVmbGVjdGFuY2lhIFRPQSAoKnRvcC1vZi1hdG1vc3BoZXJlKikgcGFyYSByZWFsaXphciBsb3MgYW7DoWxpc2lzIHBlcnRpbmVudGVzIHBhcmEgbGEgb2J0ZW5jacOzbiBkZSBsYSBjbGFzaWZpY2FjacOzbiBzdXBlcnZpc2FkYSBkZSBzdWVsb3MuIExhIGNvcnJlY2Npw7NuIHJhZGlvbcOpdHJpY2EgbmVjZXNhcmlhIHBhcmEgb2J0ZW5lciBlc3RvcyB2YWxvcmVzIGVzIGxhIGNvcnJlY2Npw7NuIHNvbGFyLiBMYSBjb3JyZWNjacOzbiBzb2xhciBjb252aWVydGUgbGEgcmFkaWFuY2lhIGVuIGVsIHNlbnNvciBlbiByZWZsZWN0YW5jaWEgZW4gbGEgcGFydGUgc3VwZXJpb3IgZGUgbGEgYXRtw7NzZmVyYSAoVE9BKSBpbmNvcnBvcmFuZG8gbGEgaXJyYWRpYW5jaWEgc29sYXIgZXhvYXRtb3Nmw6lyaWNhLCBsYSBkaXN0YW5jaWEgVGllcnJhLVNvbCB5IGVsIMOhbmd1bG8gZGUgZWxldmFjacOzbiBzb2xhciAoWW91bmcgZXQgYWwuLCAyMDE3KS4NCg0KU2luIGVtYmFyZ28sIGxvcyBwcm9kdWN0b3MgTGFuZHNhdCA4IHByb3BvcmNpb25hbiBjb2VmaWNpZW50ZXMgcGFyYSBjb252ZXJ0aXIgbG9zIG5pdmVsZXMgZGlnaXRhbGVzICgqRE4sIGRpZ2l0YWwgbnVtYmVyKikgZGlyZWN0YW1lbnRlIGEgcmVmbGVjdGFuY2lhIFRPQSBzaW4gbmVjZXNpZGFkIGRlIG9idGVuZXIgbGEgcmFkaWFuY2lhIGVuIGVsIHNlbnNvciBtZWRpYW50ZSBsYSBleHByZXNpw7NuIHByb3BvcmNpb25hZGEgcG9yIGVsIFNlcnZpY2lvIEdlb2zDs2dpY28gZGUgbG9zIEVzdGFkb3MgVW5pZG9zIChVU0dTKToNCg0KPGRpdi8+DQoNCiQkXHJob19cbGFtYmRhPVxmcmFje01fcMK3UV97Y2FsfStBX3B9e3NpbihcdGhldGFfe1NFfSl9JCQNCkRvbmRlOiANCg0KIyMjIyMjICRccmhvX1xsYW1iZGEkID0gUmVmbGVjdGFuY2lhIHBsYW5ldGFyaWEgVE9BXA0KIyMjIyMjICRNX3AkID0gRmFjdG9yIGRlIHJlZXNjYWxhbWllbnRvIG11bHRpcGxpY2F0aXZvIGVzcGVjw61maWNvIGRlIGJhbmRhIGRlIGxvcyBtZXRhZGF0b3MgKFJFRkxFQ1RBTkNFX01VTFRfQkFORF94LCBkb25kZSB4IGVzIGVsIG7Dum1lcm8gZGUgYmFuZGEpXA0KIyMjIyMjICRRX3tjYWx9JCA9IFZhbG9yZXMgZGUgcMOteGVsZXMgZGUgcHJvZHVjdG8gZXN0w6FuZGFyIGN1YW50aWZpY2Fkb3MgeSBjYWxpYnJhZG9zIChETilcDQojIyMjIyMgJEFfcCQgPSBGYWN0b3IgZGUgcmVlc2NhbGFkbyBhZGl0aXZvIGVzcGVjw61maWNvIGRlIGJhbmRhIGRlIGxvcyBtZXRhZGF0b3MgKFJFRkxFQ1RBTkNFX0FERF9CQU5EX3gsIGRvbmRlIHggZXMgZWwgbsO6bWVybyBkZSBiYW5kYSlcDQojIyMjIyMgJFx0aGV0YV97U0V9JCA9IMOBbmd1bG8gbG9jYWwgZGUgZWxldmFjacOzbiBkZWwgc29sLkVsIMOhbmd1bG8gZGUgZWxldmFjacOzbiBkZWwgc29sIGRlbCBjZW50cm8gZGUgbGEgZXNjZW5hIGVuIGdyYWRvcyBzZSBwcm9wb3JjaW9uYSBlbiBsb3MgbWV0YWRhdG9zIChTVU5fRUxFVkFUSU9OKQ0KXA0KTG9zIGNvZWZpY2llbnRlcyBzZSBwdWVkZW4gb2J0ZW5lciBkaXJlY3RhbWVudGUgZGUgbG9zIG1hdGFkYXRvczoNCg0KQmFuZCAgICAgICB8IEF+cH4gICB8IE1+cH4gICAgfCAgICDOuH5TRX4gICAgfA0KLS0tLS0tLS0tLS18LS0tLS0tLS18LS0tLS0tLS0tfC0tLS0tLS0tLS0tLS18DQpVbHRyYS1ibHVlIHwgLTAuMSAgIHwgMmUtMDUgICB8IDQyLjgxNjE4MTg5IHwNCkJsdWUgICAgICAgfCAtMC4xICAgfCAyZS0wNQkgIHwgNDIuODE2MTgxODkgfA0KR3JlZW4gICAgICB8IC0wLjEgICB8IDJlLTA1CSAgfCA0Mi44MTYxODE4OSB8DQpSZWQgICAgICAgIHwgLTAuMSAgIHwgMmUtMDUJICB8IDQyLjgxNjE4MTg5IHwNCk5JUiAgICAgICAgfCAtMC4xICAgfCAyZS0wNQkgIHwgNDIuODE2MTgxODkgfA0KU1dJUjEgICAgICB8IC0wLjEgICB8IDJlLTA1CSAgfCA0Mi44MTYxODE4OSB8DQpTV0lSMiAgICAgIHwgLTAuMSAgIHwgMmUtMDUJICB8IDQyLjgxNjE4MTg5IHwNCg0KYGBge3IgaW5jbHVkZT1GQUxTRX0NCnNldHdkKCJDOi9Vc2Vycy9VU1MvRGVza3RvcC9QZWRyby8yMDE5IC0gMjAyMC9QZXJjZXBjaW9uIHJlbW90YS9JbmZvcm1lIDEvTGFuZHNhdF9zaW5fcmVjb3J0YXIiKQ0KYGBgDQoNCmBgYHtyIGluY2x1ZGU9RkFMU0V9DQpnZXR3ZCgpDQpgYGANCg0KYGBge3IgaW5jbHVkZT1GQUxTRX0NCm10bGZpbGUgPC0gIkxDMDhfTDFUUF8yMDEwMzJfMjAyMDAzMTRfMjAyMDAzMjVfMDFfVDFfTVRMLnR4dCINCmBgYA0KDQpgYGB7ciBpbmNsdWRlPUZBTFNFfQ0KbWV0YWRhdGEgPC0gcmVhZE1ldGEobXRsZmlsZSkNCmBgYA0KDQpgYGB7ciBpbmNsdWRlPUZBTFNFfQ0KbHNhdCA8LSBzdGFja01ldGEobXRsZmlsZSkNCmxzYXQNCmBgYA0KDQpgYGB7ciBpbmNsdWRlPUZBTFNFfQ0KIyBDcmVhbW9zIHVuIHN1YmdydXBvIHNpbiBsYXMgYmFuZGFzIDEwIHkgMTEsIHlhIHF1ZSBhbCBzZXIgYmFuZGFzIHRlcm1hbGVzIG5vIHRpZW5lbiBkYXRvcyBkZSBjb3JyZWNjacOzbiBkZSByZWZsZWN0YW5jaWEgZW4gbG9zIG1ldGFkYXRvcw0KDQpsc2F0c3ViIDwtIGxzYXRbWzE6OF1dDQpgYGANCg0KYGBge3IgaW5jbHVkZT1GQUxTRX0NCiMgQWNjZWRlbW9zIGEgbG9zIGRhdG9zIGRlIFJFRkxFQ1RBTkNFX0FERF9CQU5EIHkgUkVGTEVDVEFOQ0VfTVVMVF9CQU5EIGVuIGxvcyBtZXRhZGF0b3MNCg0KZ2V0TWV0YShsc2F0c3ViLCBtZXRhRGF0YSA9IG1ldGFkYXRhLCB3aGF0ID0gIkNBTFJFRiIpDQpgYGANCg0KYGBge3IgaW5jbHVkZT1GQUxTRX0NCmxzYXRfcmVmIDwtIHJhZENvcihsc2F0LCBtZXRhRGF0YSA9IG1ldGFkYXRhLCBtZXRob2QgPSAiYXByZWYiKQ0KYGBgDQoNCmBgYHtyIGluY2x1ZGU9RkFMU0V9DQojdHJlIGVzIGxhIHJlZmxlY3RhbmNpYSBUT0EsIGJ0IGVzIGxhIHRlbXBlcmF0dXJhIGRlIGJyaWxsbw0KDQpuYW1lcyhsc2F0X3JlZikNCmBgYA0KDQpgYGB7ciBpbmNsdWRlPUZBTFNFfQ0KbmFtZXMobHNhdF9yZWYpIDwtIGMoJ1VsdHJhLWJsdWUnLCAnQmx1ZScsICdHcmVlbicsICdSZWQnLCAnTklSJywgJ1NXSVIxJywgJ1NXSVIyJywgJ0NpcnJ1cycsICdUSVJTMScsICdUSVJTMicpDQpgYGANCg0KPGRpdiBzdHlsZT0idGV4dC1hbGlnbjoganVzdGlmeSI+DQoNCkxhIHJlZmxlY3RhbmNpYSBlcyB1biByYXRpbywgcG9yIGxvIHF1ZSB0cmFzIGxhIGNvcnJlY2Npw7NuIHNvbGFyLCBsb3MgdmFsb3JlcyBkZSByZWZsZWN0YW5jaWEgVE9BIHF1ZWRhbiBjb21vIHVuIHBvcmNlbnRhamUgKGVudHJlIDAgeSAxKSBxdWUgcmVsYWNpb25hIGxhIHJhZGlhY2nDs24gcmVmbGVqYWRhIHBvciBjYWRhIHBpeGVsIHJlc3BlY3RvIGEgbGEgcmFkaWFjacOzbiBxdWUgcmVjaWJlLiBMYSBzaWd1aWVudGUgdGFibGEgbXVlc3RyYSB1biByZXN1bWVuIGVzdGFkw61zdGljbyBkZSBsYXMgYmFuZGFzIGRlIGludGVyw6lzOg0KDQo8ZGl2Lz4NCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmxzYXRfNyA8LSBsc2F0X3JlZltbMTo3XV0NCmtuaXRyOjprYWJsZShzdW1tYXJ5KGxzYXRfNykpDQpgYGANCg0KDQpgYGB7ciBpbmNsdWRlID0gRkFMU0V9DQpwbG90UkdCKGxzYXQsIDQsIDMsIDIsIHN0cmV0Y2ggPSAibGluIikNCmBgYA0KDQpgYGB7ciBpbmNsdWRlPUZBTFNFfQ0KIyBSZWNvcnRhbW9zIGxhIGltYWdlbg0KDQpleHRlbnQobHNhdF9yZWYpDQpgYGANCg0KYGBge3IgaW5jbHVkZT1GQUxTRX0NCmUgPC0gZXh0ZW50KDM4NzQzNSwgNDI1NTA1LCA0NDAxNTU1LCA0NDI0NzE1KQ0KYGBgDQoNCmBgYHtyIGluY2x1ZGU9RkFMU0V9DQpjbGlwX2xzYXQgPC0gY3JvcChsc2F0X3JlZixlKQ0KY2xpcF9sc2F0DQpgYGANCg0KYGBge3IgaW5jbHVkZT1GQUxTRX0NCmxhbmRzYXRSR0IgPC0gY2xpcF9sc2F0W1tjKDQsMywyKV1dDQpwbG90UkdCKGxhbmRzYXRSR0IsIGF4ZXMgPSBUUlVFLCBzdHJldGNoID0gImxpbiIsIG1haW4gPSAiTGFuZHNhdCBUcnVlIENvbG9yIENvbXBvc2l0ZSIpDQpgYGANCg0KYGBge3IgaW5jbHVkZT1GQUxTRX0NCmxheWVyX2ZpbGVuYW1lcyA8LSBjKCJVbHRyYS1ibHVlLnRpZiIsICJCbHVlLnRpZiIsICJHcmVlbi50aWYiLCAiUmVkLnRpZiIsICJOSVIudGlmIiwgIlNXSVIxLnRpZiIsICJTV0lSMi50aWYiLCAiQ2lycnVzLnRpZiIsICJUSVJTMS50aWYiLCAiVElSUzIudGlmIikNCmZvcihpIGluIDE6MTApIHsNCiAgTGF5ZXIgPC0gcmFzdGVyKGNsaXBfbHNhdCwgbGF5ZXIgPSBpKQ0KICB3cml0ZVJhc3RlcihMYXllciwgbGF5ZXJfZmlsZW5hbWVzW2ldLCBvdmVyd3JpdGU9VFJVRSkNCn0NCmBgYA0KDQpgYGB7ciBpbmNsdWRlPUZBTFNFfQ0KIyBMYXMgYmFuZGFzICJDaXJydXMiLCAiVElSUzEiIHkgIlRJUlMyIiBubyBzZSB2YW4gYSB1dGlsaXphciBwYXJhIGVsIGFuw6FsaXNpcy4gU2UgY3JlYSB1biBvYmpldG8gY29uIHVuIHN1YmNvbmp1bnRvIGRlIGJhbmRhcy4NCmxhbmRzYXQgPC0gY2xpcF9sc2F0W1sxOjddXQ0Kc3VtbWFyeShsYW5kc2F0KQ0KYGBgDQoNCiMjIFBlcmZpbGVzIGVzcGVjdHJhbGVzDQoNCjxkaXYgc3R5bGU9InRleHQtYWxpZ246IGp1c3RpZnkiPg0KDQpFbCBwZXJmaWwgZXNwZWN0cmFsIGVzIGxhIHJlcHJlc2VudGFjacOzbiBncsOhZmljYSBkZWwgY29tcG9ydGFtaWVudG8gZXNwZWN0cmFsIGRlIGNpZXJ0YSBzdXBlcmZpY2llLiBMb3MgZGlzdGludG9zIHRpcG9zIGRlIGNvYmVydHVyYXMgdGVycmVzdHJlcyAoYm9zcXVlcywgc3VlbG9zIGN1bHRpdmFkb3MsIGzDoW1pbmFzIGRlIGFndWEsIGV0Yy4pIHNlIGRpc3Rpbmd1ZW4gcG9yIGxhIGVuZXJnw61hIHF1ZSByZWZsZWphbiB5IGVtaXRlbiAoQWxvbnNvIGV0IGFsLiwgMTk5MykuIE1lZGlhbnRlIGxhIGNvbXBhcmFjacOzbiBkZSBwZXJmaWxlcyBlc3BlY3RyYWxlcyBzZSBwdWVkZSByZWNvbm9jZXIgY3ViaWVydGFzIGRlIGludGVyw6lzIHkgZGlzY3JpbWluYXJsYXMgZGUgb3RyYXMgc2ltaWxhcmVzLCBwb3IgbG8gcXVlIGxhIG9idGVuY2nDs24gZGUgbGFzIGZpcm1hcyBlc3BlY3RyYWxlcyBzZSByZWNvbWllbmRhbiBjb21vIHB1bnRvIGRlIHBhcnRpZGEgZW4gdHJhYmFqb3MgZGUgdGVsZWRldGVjY2nDs24gKENodXZpZWNvLCAyMDEwKS4NCg0KUGFyYSBwb2RlciBjbGFzaWZpY2FyIGxhcyBzdXBlcmZpY2llcyBlbiBmdW5jacOzbiBkZSBsb3MgdmFsb3JlcyBkZSByZWZsZWN0YW5jaWEgVE9BLCBlcyBuZWNlc2FyaW8gdXRpbGl6YXIgaW5mb3JtYWNpb24gYXV4aWxpYXIsIGVzIGRlY2lyLCBpbmZvcm1hY2nDs24gZ2VvZ3LDoWZpY2Egbm8gZXNwZWN0cmFsLiBMb3MgbXVlc3RyZW9zIGFsZWF0b3Jpb3MgcmVhbGl6YWRvcyBlbiBsb3MgcG9sw61nb25vcyBjbGFzaWZpY2Fkb3MgZW4gZnVuY2nDs24gZGUgbGEgY29iZXJ0dXJhIGRlbCBzdWVsbyBzZSByZXByZXNlbnRhbiBhIGNvbnRpbnVhY2nDs246ICANCg0KPGRpdi8+DQoNCmBgYHtyIGluY2x1ZGU9RkFMU0V9DQpzZXQuc2VlZCgxMDEpDQpzYW1wbGVzIDwtIHNwc2FtcGxlKHBvbHlnb25zLCAyMDAwLCB0eXBlPSdyZWd1bGFyJykNCnNhbXBsZXMNCmBgYA0KDQpgYGB7ciBpbmNsdWRlPUZBTFNFfQ0KZGZfc2FtcGxlcyA8LSBhcyhzYW1wbGVzLCJTcGF0aWFsUG9pbnRzRGF0YUZyYW1lIikNCm51bWVybyA8LSBsZW5ndGgoc2FtcGxlcykNCmBgYA0KDQpgYGB7ciBpbmNsdWRlPUZBTFNFfQ0KZGZfc2FtcGxlc0BkYXRhID0gZGF0YS5mcmFtZShJRD0xOm51bWVybywgc2l6ZT0xKQ0KZGZfc2FtcGxlcw0KYGBgDQoNCmBgYHtyIGVjaG89RkFMU0V9DQpsaWJyYXJ5KHpvb20pDQpwbG90UkdCKGxhbmRzYXRSR0IsIGF4ZXMgPSBUUlVFLCBzdHJldGNoID0gImxpbiIsIG1haW4gPSAiUmVwcmVzZW50YWNpw7NuIGRlIGxvcyBtdWVzdHJlb3MgZW4gbG9zIHBvbMOtZ29ub3MgZGUgY2xhc2lmaWNhY2nDs24gIikNCnBsb3QocG9seWdvbnMsIGNvbCA9ICJ5ZWxsb3ciLCBhZGQgPSBUUlVFKQ0KcGxvdChkZl9zYW1wbGVzLCBwY2ggPSAxLCBjb2wgPSAiYmxhY2siLCBjZXggPSAoZGZfc2FtcGxlcyRzaXplKS8zLCBhZGQ9VFJVRSkNCnpvb21wbG90Lnpvb20oeGxpbSA9IE5VTEwsIHlsaW0gPSBOVUxMLCBmYWN0ID0gMikNCmBgYA0KDQpgYGB7ciBpbmNsdWRlPUZBTFNFfQ0KIyBBZ3JlZ2Ftb3MgbGEgY2xhc2UgZGUgY29iZXJ0dXJhIGRlbCBzdWVsbyBhIGxvcyBwdW50b3MNCg0KZGZfc2FtcGxlcyRjbGFzZSA8LSBvdmVyKGRmX3NhbXBsZXMsIHBvbHlnb25zKSRDb2JlcnR1cmENCmRmX3NhbXBsZXMNCmBgYA0KDQpgYGB7ciBpbmNsdWRlPUZBTFNFfQ0KZGYgPC0gcmFzdGVyOjpleHRyYWN0KGxhbmRzYXQsIGRmX3NhbXBsZXMpDQpoZWFkKGRmKQ0KYGBgDQo8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOiBqdXN0aWZ5Ij4NCg0KRWwgdmFsb3IgbWVkaW8gZGUgcmVmbGVjdGFuY2lhIFRPQSBkZSBsb3MgcHVudG9zIG11ZXN0cmVhZG9zIGVuIGNhZGEgcG9sw61nb25vIGRlIGNsYXNpZmljYWNpw7NuIHNlIHJlY29nZSBlbiBsYSBzaWd1aWVudGUgdGFibGE6IA0KDQo8ZGl2Lz4NCg0KYGBge3IgaW5jbHVkZT1GQUxTRX0NCm1zIDwtIGFnZ3JlZ2F0ZShkZiwgbGlzdChkZl9zYW1wbGVzJGNsYXNlKSwgbWVhbikNCm1zDQpgYGANCg0KYGBge3IgZWNobz1GQUxTRX0NCiMgaW5zdGVhZCBvZiB0aGUgZmlyc3QgY29sdW1uLCB3ZSB1c2Ugcm93IG5hbWVzDQoNCnJvd25hbWVzKG1zKSA8LSBtc1ssMV0NCm1zIDwtIG1zWywtMV0NCm1zDQpgYGANCjxkaXYgc3R5bGU9InRleHQtYWxpZ246IGp1c3RpZnkiPg0KDQpFc3RvcyB2YWxvcmVzIHNlIG11ZXN0cmFuIGRlIHVuIG1vZG8gbcOhcyBpbHVzdHJhdGl2byBhIHRyYXZlcyBkZSB1biBncsOhZmljbyBkZSBwZXJmw61sIGVzcGVjdHJhbCwgZW4gZWwgcXVlIHNlIHJlcHJlc2VudGEgbGEgcmVmbGVjdGFuY2lhIFRPQSBkZSBjYWRhIGNvYmVydHVyYSBlbiBmdW5jacOzbiBkZSBsYSBiYW5kYSBlc3BlY3RyYWwuDQoNCjxkaXYvPg0KDQpgYGB7ciBpbmNsdWRlPUZBTFNFfQ0KIyBDcmVhdGUgYSB2ZWN0b3Igb2YgY29sb3IgZm9yIHRoZSBsYW5kIGNvdmVyIGNsYXNzZXMgZm9yIHVzZSBpbiBwbG90dGluZw0KDQpteWNvbG9yIDwtIGMoJ2JsdWU0JywgJ3JlZCcsICdsYXduZ3JlZW4nLCAnZGFya2dyZWVuJywgJ3llbGxvdycsICd2aW9sZXRyZWQnLCAnY3lhbicpDQpgYGANCg0KYGBge3IgZWNobz1GQUxTRX0NCiN0cmFuc2Zvcm0gbXMgZnJvbSBhIGRhdGEuZnJhbWUgdG8gYSBtYXRyaXgNCg0KbXMgPC0gYXMubWF0cml4KG1zKQ0KcGxvdCgwLCB5bGltPWMoMCwwLjYpLCANCiAgICAgICAgeGxpbSA9IGMoMSw3KSwgdHlwZT0nbicsIHhsYWI9IkJhbmRhcyIsIHlsYWIgPSAiUmVmbGVjdGFuY2lhIFRPQSIsIGF4ZXMgPSBGQUxTRSkNCg0KIyBhZGQgdGhlIGRpZmZlcmVudCBjbGFzc2VzDQoNCmZvciAoaSBpbiAxOm5yb3cobXMpKXsNCiAgICBsaW5lcyhtc1tpLF0sIHR5cGUgPSAibCIsIGx3ZCA9IDMsIGx0eSA9IDEsIGNvbCA9IG15Y29sb3JbaV0pDQp9DQoNCnRpdGxlKG1haW49KCJQZXJmaWwgZXNwZWN0cmFsIGRlIGxhcyBjb2JlcnR1cmFzIGRlIHN1ZWxvIiksIGZvbnQubWFpbiA9IDIpDQpsZWdlbmQoInRvcGxlZnQiLCByb3duYW1lcyhtcyksDQogICAgICAgY2V4PTAuOCwgY29sPW15Y29sb3IsIGx0eSA9IDEsIGx3ZCA9MywgYnR5ID0gIm4iKQ0KYXhpcyhzaWRlID0gMSwgYXQgPSAxOjcsIGxhYmVscyA9IGMoJ1VsdHJhLWJsdWUnLCAnQmx1ZScsICdHcmVlbicsICdSZWQnLCAnTklSJywgJ1NXSVIxJywgJ1NXSVIyJykpDQpheGlzKHNpZGUgPSAyLCBhdCA9IGMoMCwgMC4xLCAwLjIsIDAuMywgMC40LCAwLjUsIDAuNiksIGxhYmVscyA9IGMoMCwgMC4xLCAwLjIsIDAuMywgMC40LCAwLjUsIDAuNikpDQpgYGANCg0KIyMgw41uZGljZXMgZGUgZGlmZXJlbmNpYSBub3JtYWxpemFkYQ0KDQo8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOiBqdXN0aWZ5Ij4NCg0KRGViaWRvIGEgbGFzIGRpZmVyZW5jaWFzIGVuIGxhIHJlZmxlY3RhbmNpYSBkZSBsYXMgZGlzdGludGFzIGNvYmVydHVyYXMgZGVsIHN1ZWxvLCBzZSBwdWVkZW4gZW1wbGVhciDDrW5kaWNlcyBkZSBkaWZlcmVuY2lhIG5vcm1hbGl6YWRhIHF1ZSBwZXJtaXRlbiBvYnRlbmVyIGluZm9ybWFjacOzbiBzb2JyZSBsYSBvY3VwYWNpw7NuIGRlbCBzdWVsby4gRXN0YSBpbmZvcm1hY2nDs24gcHVlZGUgdXRpbGl6YXJzZSBwYXJhIGFtcGxpYXIgZWwgY29ub2NpbWllbnRvIHNvYnJlIGxhIHpvbmEgZGUgZXN0dWRpbyB5IGNvbW8gdW5hIGNsYXNpZmljYWNpw7NuIHByZXZpYSBhIGxhIGNsYXNpZmljYWNpw7NuIHN1cGVydmlzYWRhIGRlIGNvYmVydHVyYSBkZWwgc3VlbG8uDQoNCkVsIGNhbGN1bG8gZGUgbGEgY29ycmVsYWNpw7NuIGVudHJlIGxvcyBkYXRvcyBkZSBkaXN0aW50YXMgYmFuZGFzIHBlcm1pdGUgc2FiZXIgc2kgcG9zZWVuIG8gbm8gY2llcnRhIGluZGVwZW5kZW5jaWEgZXN0YWTDrXN0aWNhLiBFcyBkZWNpciwgdW5hIGFsdGEgY29ycmVsYWNpw7NuIHN1Z2llcmUgdW5hIHJlZHVuZGFuY2lhIHN1c3RhbmNpYWwgZW4gZWwgY29udGVuaWRvIGRlIGxhIGluZm9ybWFjacOzbiBlbnRyZSBlc2FzIGJhbmRhcyAoSmVuc2VuLCAyMDE1KS4gTG9zIGRhdG9zIGRlIGNvcnJlbGFjacOzbiBzb24gaW1wb3J0YW50ZXMgYSBsYSBob3JhIGRlIGVsYWJvcmFyIMOtbmRpY2VzIGRlIGRpZmVyZW5jaWEgbm9ybWFsaXphZGEsIHlhIHF1ZSBlc3RvcyDDrW5kaWNlcyBzb24gcmF0aW9zLCBwb3IgbG8gcXVlIGludGVyZXNhIHF1ZSBsYSBpbmZvcm1hY2nDs24gY29tcGFyYWRhIHRlbmdhIGxhIG1heW9yIGluZGVwZW5kZW5jaWEgZXN0YWTDrXN0aWNhIHBvc2libGUuIA0KDQo8ZGl2Lz4NCg0KYGBge3IgZWNobz1GQUxTRX0NCnBhaXJzKGxhbmRzYXRbWzI6N11dLCBtYWluID0gIkNvcnJlbGFjacOzbiBlbnRyZSBiYW5kYXMiKQ0KYGBgDQo8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOiBqdXN0aWZ5Ij4NCg0KUGFyYSB0b2RvcyBsb3Mgw61uZGljZXMgZGUgZGlmZXJlbmNpYSBub3JtYWxpemFkYSAoTkRWSSwgTkRXSSB5IE5EQkkpIHNlIHV0aWxpemEgdW5hIGV4cHJlc2nDs24gY29uIHNlbWVqYW50ZSBlc3RydWN0dXJhLCBlbiBsYSBxdWUgw7puaWNhbWVudGUgY2FtYmlhbiBsYXMgY29tYmluYWNpb25lcyBkZSBjYXBhcyBhIHV0aWxpemFyLiBMYSBleHByZXNpw7NuIHNlIGRlZmluZSBkZSBsYSBzaXF1aWVudGUgZm9ybWE6DQoNCjxkaXYvPg0KXA0KJCROREk9XGZyYWN7YmFuZGFfaS1iYW5kYV9qfXtiYW5kYV9pK2JhbmRhX2p9JCQNClwNCg0KYGBge3IgaW5jbHVkZT1GQUxTRX0NCnZpIDwtIGZ1bmN0aW9uKGltZywgaywgaSkgew0KICBiayA8LSBpbWdbW2tdXQ0KICBiaSA8LSBpbWdbW2ldXQ0KICB2aSA8LSAoYmsgLSBiaSkgLyAoYmsgKyBiaSkNCiAgcmV0dXJuKHZpKQ0KfQ0KYGBgDQoNCiMjIyDDjW5kaWNlIGRlIHZlZ2V0YWNpw7NuIGRlIGRpZmVyZW5jaWEgbm9ybWFsaXphZGEgKE5EVkkpDQoNCjxkaXYgc3R5bGU9InRleHQtYWxpZ246IGp1c3RpZnkiPg0KDQpFbCDDjW5kaWNlIGRlIFZlZ2V0YWNpw7NuIGRlIERpZmVyZW5jaWEgTm9ybWFsaXphZGEgKE5EVkkpIGVzIHVuIMOtbmRpY2UgcXVlIGRlc2NyaWJlIGxhIHByb3BvcmNpw7NuIGRlIHZlZ2V0YWNpw7NuIG1pZGllbmRvIGxhIGRpZmVyZW5jaWEgZW4gbGEgcG9yY2nDs24gaW5mcmFycm9qYSBjZXJjYW5hIGRlbCBlc3BlY3RybyBlbGVjdHJvbWFnbsOpdGljbywgcXVlIHNlIHJlZmxlamEgZnVlcnRlbWVudGUgZW4gbGEgdmVnZXRhY2nDs24gdmVyZGUgeSBsYSBwb3JjacOzbiByb2phIGRlbCBlc3BlY3RybyBxdWUgZXMgYWJzb3JiaWRhIHBvciBsYSB2ZWdldGFjacOzbiAoTWFsaWsgZXQgYWwuLCAyMDE5KS4gUG9yIGxvIHRhbnRvLCBsYXMgYmFuZGFzIHV0aWxpemFkYXMgcGFyYSBsYSBvYnRlbmNpw7NuIGRlbCBORFZJIHNvbiBsYSBiYW5kYSA1IGRlIGluZnJhcnJvam8gY2VyY2FubyAoODQ14oCTODg1IG5tKSB5IGxhIGJhbmRhIDQsIGRlbCByb2pvIHZpc2libGUgKDYzMOKAkzY4MCBubSkuDQoNCjxkaXYvPg0KDQpgYGB7ciBlY2hvPUZBTFNFfQ0KbmR2aSA8LSB2aShsYW5kc2F0LCA1LCA0KQ0KcGxvdChuZHZpLCBjb2wgPSByZXYodGVycmFpbi5jb2xvcnMoMjU1KSksIG1haW4gPSAiTkRWSSIpDQpgYGANCjxkaXYgc3R5bGU9InRleHQtYWxpZ246IGp1c3RpZnkiPg0KDQpEaXNjcmltaW5hbmRvIGxhcyB6b25hcyBxdWUgbm8gcG9zZWVuIChwcmVzdW1pYmxlbWVudGUpIHZlZ2V0YWNpw7NuLCBzZSBwdWVkZSBvYnRlbmVyIHVuYSBtZWpvciB2aXN1YWxpemFjacOzbiBkZSBsYXMgem9uYXMgY29uIGNvYmVydHVyYSB2ZWdldGFsLiBPYnNlcnZhbmRvIGVsIG1hcGEgZGUgTkRWSSwgc2UgcHVlZGUgY29uc2lkZXJhciBxdWUgdmFsb3JlcyBkZSBORFZJIHBvciBlbmNpbWEgZGUgMCwzNSBwZXJ0ZW5lY2VuIGEgc3VwZXJmaWNpZXMgY29uIGFsIG1lbm9zLCBjaWVydGEgZmxvcmEuDQoNCjxkaXYvPg0KDQpgYGB7ciBlY2hvPUZBTFNFfQ0KdmVnIDwtIHJlY2xhc3NpZnkobmR2aSwgY2JpbmQoLUluZiwgMC4zNSwgTkEpKQ0KY29sdmVnIDwtIGNvbG9yUmFtcFBhbGV0dGUoYygieWVsbG93IiwiY2hhcnRyZXVzZTIiLCJkYXJrZ3JlZW4iKSkNCnBsb3QodmVnLCBtYWluPSdWZWdldGFjacOzbicsIGNvbCA9IGNvbHZlZyg1MCkpDQpgYGANCg0KIyMjIMONbmRpY2UgZGUgYWd1YSBkZSBkaWZlcmVuY2lhIG5vcm1hbGl6YWRhIChORFdJKQ0KDQo8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOiBqdXN0aWZ5Ij4NCg0KTWNGZWV0ZXJzIChNY0ZlZXRlcnMsIDE5OTYpIHByb3B1c28gZWwgw61uZGljZSBkZSBhZ3VhIGRlIGRpZmVyZW5jaWEgbm9ybWFsaXphZGEgKE5EV0kpIG3DoXMgY29ub2NpZG8sIHV0aWxpemFuZG8gbGEgYmFuZGEgdmVyZGUgeSBsYSBiYW5kYSBkZWwgaW5mcmFycm9qbyBjZXJjYW5vIChOSVIpLiBSZWxhY2lvbmEgbGEgZ3JhbiByZWZsZWN0YW5jaWEgZGUgbGFzIG1hc2FzIGRlIGFndWEgZW4gbGEgYmFuZGEgdmVyZGUgY29uIHN1IGJhamEgcmVsZmVjdGFuY2lhIGVuIGxhIGJhbmRhIE5JUi4gTGFzIGJhbmRhcyB1dGlsaXphZGFzIHBhcmEgbGEgb2J0ZW5jacOzbiBkZWwgTkRXSSBzb24gbGEgYmFuZGEgMywgdmVyZGUgdmlzaWJsZSAoNTI14oCTNjAwIG5tKSB5IGxhIGJhbmRhIDUgZGUgaW5mcmFycm9qbyBjZXJjYW5vICg4NDXigJM4ODUgbm0pLg0KDQo8ZGl2Lz4NCg0KYGBge3IgZWNobz1GQUxTRX0NCm5kd2kgPC0gdmkobGFuZHNhdCwgMywgNSkNCnBsb3QobmR3aSwgY29sID0gYnB5LmNvbG9ycyg1MCksIG1haW4gPSAiTkRXSSIpDQpgYGANCg0KYGBge3IgZWNobz1GQUxTRX0NCndhdGVyIDwtIHJlY2xhc3NpZnkobmR3aSwgY2JpbmQoLUluZiwgMCwgTkEpKQ0KY29sd2F0IDwtIGNvbG9yUmFtcFBhbGV0dGUoYygiYmx1ZSIsImRhcmtibHVlIiwiY3lhbiIpKQ0KcGxvdCh3YXRlcixjb2wgPSBjb2x3YXQoNTApLCBtYWluID0gJ0FndWEnKQ0KYGBgDQoNCiMjIyDDjW5kaWNlIGRlIGNvbnN0cnVjY2nDs24gZGUgZGlmZXJlbmNpYSBub3JtYWxpemFkYSAoTkRCSSkNCg0KPGRpdiBzdHlsZT0idGV4dC1hbGlnbjoganVzdGlmeSI+DQoNCkVuIGNvbXBhcmFjacOzbiBjb24gb3RyYXMgc3VwZXJmaWNpZXMgZGUgY29iZXJ0dXJhIGRlbCBzdWVsbywgbG9zIHRlcnJlbm9zIHVyYmFuaXphZG9zIHRpZW5lbiBtYXlvciByZWZsZWN0YW5jaWEgZW4gZWwgcmFuZ28gZGUgbG9uZ2l0dWQgZGUgb25kYSBNSVIgcXVlIGVuIGVsIHJhbmdvIGRlIGxvbmdpdHVkIGRlIG9uZGEgTklSIChQYXR0YW5heWFrICYgRGl3YWthciAoMjAxOCksIE1hbGlrIGV0IGFsLiwgKDIwMTkpKS4gRGViaWRvIGEgZXN0bywgcGFyYSBlbCBjw6FsY3VsbyBkZWwgw41uZGljZSBkZSBjb25zdHJ1Y2Npw7NuIGRlIGRpZmVyZW5jaWEgbm9ybWFsaXphZGEgKE5EQkkpIGdlbmVyYWxtZW50ZSBzZSB1dGlsaXphIGxhIGJhbmRhIDYgKFNXSVIxKSwgZGVsIGluZnJhcnJvam8gbWVkaW8gKDE1NjDigJMxNjYwIG5tKSB5IGxhIGJhbmRhIDUgKE5JUikgZGUgaW5mcmFycm9qbyBjZXJjYW5vICg4NDXigJM4ODUgbm0pLiBTaW4gZW1iYXJnbywgZGViaWRvIGEgbGEgZGlmaWN1bHRhZCBkZSBkaXNjcmltaW5hciBsYXMgem9uYXMgcmVzaWRlbmNpYWxlcyBkZSBsYXMgc3VwZXJmaWNpZXMgZGUgYmFyYmVjaG8gdXRpbGl6YW5kbyBlc2FzIGRvcyBiYW5kYXMsIGVuIGVsIHByZXNlbnRlIGFyZWEgZGUgZXN0dWRpbywgc2UgaGEgdXRpbGl6YWRvIGxhIGJhbmRhIDQsIHJvam8gdmlzaWJsZSAoNjMw4oCTNjgwIG5tKSB5IGxhIGJhbmRhIDYgKFNXSVIxKSBkZSBpbmZyYXJyb2pvIG1lZGlvLiANCg0KPGRpdi8+DQoNCmBgYHtyIGVjaG89RkFMU0V9DQpuZGJpIDwtIHZpKGxhbmRzYXQsIDQsIDYpDQpwbG90KG5kYmksIGNvbCA9IHRvcG8uY29sb3JzKDUwKSwgbWFpbiA9ICJOREJJIikNCmBgYA0KDQpgYGB7ciBlY2hvPUZBTFNFfQ0KYnVpbHQgPC0gcmVjbGFzc2lmeShuZGJpLCBjKC1JbmYsIC0wLjI2LCBOQSwgLTAuMjYsIDAsIDEsIDAsIEluZiwgTkEpKQ0KcGxvdChidWlsdCwgY29sID0gInJlZDQiLCBtYWluID0gJ1N1ZWxvIGNvbnN0cnVpZG8nLCBsZWdlbmQgPSBUUlVFKQ0KYGBgDQoNCiMjIEhpc3RvZ3JhbWENCg0KPGRpdiBzdHlsZT0idGV4dC1hbGlnbjoganVzdGlmeSI+DQoNClVuIGhpc3RvZ3JhbWEgZXMgbGEgcmVwcmVzZW50YWNpw7NuIGdyw6FmaWNhIGRlIGxhIGRpc3RyaWJ1Y2nDs24gZGUgZnJlY3VlbmNpYXMgZGUgdW5hIHZhcmlhYmxlLiBBcG9ydGEgaW5mb3JtYWNpw7NuIHZhbGlvc2EgY29tbyBndcOtYSwgZXMgZGVjaXIsIGVzIHVuIGluZGljYXRpdm8gcGFyYSBkZWR1Y2lyIGVsIG7Dum1lcm8gZGUgcmVnaW9uZXMgZGlmZXJlbmNpYWRhcyBlbiB1bmEgdmFyaWFibGUgeSBhc8OtIHBvZGVyIGJ1c2NhciB1biBzaWduaWZpY2FkbyBhIGNhZGEgem9uYSBkaWZlcmVuY2lhZGEuIFRhbWJpw6luIGVzIMO6dGlsIGEgbGEgaG9yYSBkZSBsb2NhbGl6YXIgdW1icmFsZXMgcGFyYSByZWNsYXNpZmljYXIgaW3DoWdlbmVzIGVuIGxvcyBhbsOhbGlzaXMgZGUgw61uZGljZXMgZGUgZGlmZXJlbmNpYSBub3JtYWxpemFkYS4NCg0KPGRpdi8+DQoNCmBgYHtyIGVjaG89RkFMU0V9DQphenVsIDwtIHJnYigwLCAwLCAxLCAwLjMpIA0Kcm9qbyA8LSByZ2IoMSwgMCwgMCwgMC4zKQ0KdmVyZGUgPC0gcmdiKDAsIDEsIDAsIDAuMykNCg0KaGlzdChuZHZpLA0KICAgICBtYWluID0gIkRpc3RyaWJ1Y2nDs24gZGUgbG9zIHZhbG9yZXMgZGUgbG9zIMONbmRpY2VzIGRlIGRpZmVyZW5jaWEgbm9ybWFsaXphZGEgIiwNCiAgICAgeGxhYiA9ICJWYWxvcmVzIiwNCiAgICAgeWxhYj0gIkZyZWN1ZW5jaWEiLA0KICAgICBjb2wgPSB2ZXJkZSwNCiAgICAgeGxpbSA9IGMoLTAuNSwgMSksDQogICAgIGJyZWFrcyA9IDMwLA0KICAgICB4YXh0ID0gJ24nKQ0KDQpoaXN0KG5kd2ksDQogICAgIGNvbCA9IGF6dWwsDQogICAgIGJyZWFrcyA9IDMwLA0KICAgICB4YXh0ID0gJ24nLA0KICAgICBhZGQgPSBUUlVFKQ0KDQpoaXN0KG5kYmksDQogICAgIGNvbCA9IHJvam8sDQogICAgIGJyZWFrcyA9IDMwLA0KICAgICB4YXh0ID0gJ24nLA0KICAgICBhZGQgPSBUUlVFKQ0KDQpheGlzKHNpZGU9MSwgYXQgPSBzZXEoLTAuNSwxLCAwLjA1KSwgbGFiZWxzID0gc2VxKC0wLjUsMSwgMC4wNSkpDQpsZWdlbmQoInRvcHJpZ2h0IiwgbGVnZW5kID0gYygiTkRWSSIsIk5EV0kiLCJOREJJIiksIGZpbGwgPSBjKHZlcmRlLCBhenVsLCByb2pvKSwgYm94LmNvbCA9ICJ3aGl0ZSIpDQpgYGANCg0KIyMgQ29tcG9zaWNpb25lcyBkZSBjb2xvcg0KDQo8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOiBqdXN0aWZ5Ij4NCg0KQ29uIGxhcyBjb21wb3NpY2lvbmVzIGRlIGNvbG9yIHNlIHB1ZWRlIGxvZ3JhciByZXNhbHRhciBjaWVydG9zIGNvbXBvbmVudGVzIG8gY2FyYWN0ZXLDrXRpY2FzIGRlbCDDoXJlYSBkZSBlc3R1ZGlvIHBhcmEgcG9kZXIgcmVhbGl6YXIgdW4gYW7DoWxpc2lzIHZpc3VhbCBkZSBsYXMgaW3DoWdlbmVzIHNhdGVsaXRhbGVzLiBMYSBjb21iaW5hY2nDs24gZGUgYmFuZGFzIGEgdXRpbGl6YXIgZGVwZW5kZXLDoSBwcmluY2lwYWxtZW50ZSBkZSBsYXMgZGlzdGludGFzIGNvYmVydHVyYXMgZGUgc3VlbG8gcXVlIHNlIGRlc2VlbiByZXNhbHRhciBlbiBsYSB6b25hIGRlIGludGVyw6lzLg0KDQo8ZGl2Lz4NCg0KIyMjIENvbXBvc2ljacOzbiBkZSBjb2xvciBuYXR1cmFsDQoNCjxkaXYgc3R5bGU9InRleHQtYWxpZ246IGp1c3RpZnkiPg0KDQpFc3RhIGNvbXBvc2ljacOzbiBtdWVzdHJhIGxhIGltYWdlbiB0YWwgeSBjb21vIGxhIHBlcmNlYmlyw61hIGVsIG9qbyBodW1hbm8sIGVzIGRlY2lyLCBzZSBhc2lnbmEgbGEgYmFuZGEgZGVsIHJvam8gdmlzaWJsZSAoYmFuZGEgNCkgYWwgY2FuYWwgcm9qbyBkZWwgbW9uaXRvciwgbGEgYmFuZGEgZGVsIHZlcmRlIHZpc2libGUgKGJhbmRhIDMpIGFsIGNhbmFsIHZlcmRlIHkgbGEgYmFuZGEgYXp1bCAoYmFuZGEgMikgYWwgY2FuYWwgYXp1bC4NCg0KPGRpdi8+DQoNCmBgYHtyIGVjaG89RkFMU0V9DQpsYW5kc2F0UkdCIDwtIGxhbmRzYXRbW2MoNCwzLDIpXV0NCnBsb3RSR0IobGFuZHNhdFJHQiwgYXhlcyA9IFRSVUUsIHN0cmV0Y2ggPSAibGluIikNCnRpdGxlKG1haW49KCJDb21wb3NpY2nDs24gZGUgY29sb3IgbmF0dXJhbCIpLCBmb250Lm1haW4gPSAyLCBzdWIgPSAiUkdCICg0LCAzLCAyKSIsIGZvbnQuc3ViID0gMiAsIGNleC5zdWIgPSAwLjkgKQ0KYGBgDQoNCg0KIyMjIENvbXBvc2ljacOzbiBlbiBmYWxzbyBjb2xvcg0KDQo8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOiBqdXN0aWZ5Ij4NCg0KVW5hIGVsZWNjacOzbiBtdXkgdXRpbGl6YWRhIGVzIGxhIGNvbXBvc2ljacOzbiBlbiBmYWxzbyBjb2xvciBxdWUgYXNpZ25hIGEgbG9zIGNhbmFsZXMgcm9qbywgdmVyZGUgeSBhenVsIGRlbCBtb25pdG9yIGxhcyBiYW5kYXMgY29ycmVzcG9uZGllbnRlcyBhbCBpbmZyYXJyb2pvIGNlcmNhbm8sIGFsIHJvam8geSBhbCB2ZXJkZSBkZWwgZXNwZWN0cm8gZWxlY3Ryb21hZ27DqXRpY28gcmVzcGVjdGl2YW1lbnRlLiBFbiBlc3RhcyBpbcOhZ2VuZXMgZGUgZmFsc28gY29sb3IgdW5hIGRlIGxhcyBjYXJhY3RlcsOtc3RpY2FzIHByaW5jaXBhbGVzIGVzIHF1ZSBsYSB2ZWdldGFjacOzbiBhcGFyZWNlIGVuIGNvbG9yIHJvam8uIChHYXJjw61hLU1lbMOpbmRleiwgMjAwNikNCg0KPGRpdi8+DQoNCmBgYHtyIGVjaG89RkFMU0V9DQpsYW5kc2F0RkNDIDwtIGxhbmRzYXRbW2MoNSw0LDMpXV0NCnBsb3RSR0IobGFuZHNhdEZDQywgYXhlcyA9IFRSVUUsIHN0cmV0Y2ggPSAibGluIikNCnRpdGxlKG1haW49KCJDb21wb3NpY2nDs24gZW4gZmFsc28gY29sb3IgLSBWZWdldGFjacOzbiIpLCBmb250Lm1haW4gPSAyLCBzdWIgPSAiUkdCICg1LCA0LCAzKSIsIGZvbnQuc3ViID0gMiAsIGNleC5zdWIgPSAwLjkgKQ0KYGBgDQo8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOiBqdXN0aWZ5Ij4NCg0KT3RyYSBjb21wb3NpY2nDs24gZW4gZmFsc28gY29sb3IgdXRpbGl6YWRhIHBhcmEgcmVzYWx0YXIgbGFzIHN1cGVyZmljaWVzIGFncsOtY29sYXMgZXMgbGEgcXVlIGNvbWJpbmEgbGFzIGJhbmRhcyA2IChTV0lSMSksIDUgKE5JUikgeSAyIChBenVsKS4gDQoNCjxkaXYvPg0KDQpgYGB7ciBlY2hvPUZBTFNFfQ0KbGFuZHNhdEFHIDwtIGxhbmRzYXRbW2MoNiw1LDIpXV0NCnBsb3RSR0IobGFuZHNhdEFHLCBheGVzID0gVFJVRSwgc3RyZXRjaCA9ICJsaW4iKQ0KdGl0bGUobWFpbj0oIkNvbXBvc2ljacOzbiBlbiBmYWxzbyBjb2xvciAtIEFncmljdWx0dXJhIiksIGZvbnQubWFpbiA9IDIsIHN1YiA9ICJSR0IgKDYsIDUsIDIpIiwgZm9udC5zdWIgPSAyICwgY2V4LnN1YiA9IDAuOSApDQpgYGANCjxkaXYgc3R5bGU9InRleHQtYWxpZ246IGp1c3RpZnkiPg0KDQpDb24gbGEgY29tcG9zaWNpw7NuIGVuIGZhbHNvIGNvbG9yIHF1ZSBjb21iaW5hIGxhcyBiYW5kYXMgNywgNiB5IDQgc2UgbG9ncmEgcmVzYWx0YXIgbGFzIHpvbmFzIHVyYmFuYXMgY29uIGNpZXJ0YSB0b25hbGlkYWQgbW9yYWRhLg0KDQo8ZGl2Lz4NCg0KYGBge3IgZWNobz1GQUxTRX0NCmxhbmRzYXRGQ1UgPC0gbGFuZHNhdFtbYyg3LDYsNCldXQ0KcGxvdFJHQihsYW5kc2F0RkNVLCBheGVzID0gVFJVRSwgc3RyZXRjaCA9ICJsaW4iKQ0KdGl0bGUobWFpbj0oIkNvbXBvc2ljacOzbiBkZSBmYWxzbyBjb2xvciAtIFpvbmFzIHVyYmFuYXMiKSwgZm9udC5tYWluID0gMiwgc3ViID0gIlJHQiAoNywgNiwgNSkiLCBmb250LnN1YiA9IDIgLCBjZXguc3ViID0gMC45ICkNCmBgYA0KDQojIyBDbGFzaWZpY2FjacOzbiBzdXBlcnZpc2FkYQ0KDQo8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOiBqdXN0aWZ5Ij4NCg0KTGFzIHTDqWNuaWNhcyBkZSBjbGFzaWZpY2FjacOzbiBkZSBpbcOhZ2VuZXMgc2F0ZWxpdGFsZXMgc2UgdXRpbGl6YW4gcGFyYSBhZ3J1cGFyIHBpeGVsZXMgY29uIHZhbG9yZXMgc2ltaWxhcmVzIGVuIHZhcmlhcyBjbGFzZXMuIEVuIGxhIGNsYXNpZmljYWNpw7NuIHN1cGVydmlzYWRhLCBzZSBwYXJ0ZSBjb24gdW5hIHNlcmllIGNsYXNlcyBwcmV2aWFtZW50ZSBwcmVkZWZpbmlkYXMgKHNpdGlvcyBkZSBlbnRyZW5hbWllbnRvKS4gRWwgYWxnb3JpdG1vIGRlIGNsYXNpZmljYWNpw7NuIGRlIGltw6FnZW5lcyB1c2EgbG9zIHNpdGlvcyBkZSBlbnRyZW5hbWllbnRvIHBhcmEgaWRlbnRpZmljYXIgbGFzIGNvYmVydHVyYXMgZGUgc3VlbG8gZW4gbGEgaW1hZ2VuIGNvbXBsZXRhLiBDb21vIHNpdGlvcyBkZSBlbnRyZW5hbWllbnRvIHNlIHZhbiBhIHV0aWxpemFyIGxvcyBwb2zDrWdvbm9zIGVtcGxlYWRvcyBhbnRlcmlvcm1lbnRlIHBhcmEgbGEgb2J0ZW5jacOzbiBkZSBsb3MgcGVyZmlsZXMgZXNwZWN0cmFsZXMuDQoNCjxkaXYvPg0KDQpgYGB7ciBpbmNsdWRlID0gRkFMU0V9DQpzYW1wbGV2YWwgPC0gZGZfc2FtcGxlcw0Kc2FtcGxldmFsDQpgYGANCg0KYGBge3IgaW5jbHVkZSA9IEZBTFNFfQ0KIyBBZ3JlZ2Ftb3MgbG9zIHZhbG9yZXMgZGUgY2xhc2UgKFZhbG9yZXMpIGRlIGxvcyBwb2xpZ29ub3MgZGUgY29iZXJ0dXJhIGEgc2FtcGxldmFsDQoNCnNhbXBsZXZhbCRjbGFzc3ZhbHVlIDwtIG92ZXIoc2FtcGxldmFsLCBwb2x5Z29ucykkVmFsb3INCnNhbXBsZXZhbA0KYGBgDQoNCmBgYHtyIGluY2x1ZGUgPSBGQUxTRX0NCiMgRXh0cmFlbW9zIGxvcyB2YWxvcmVzIGRlIHBpeGVsIGRlIGNhZGEgYmFuZGEgZGUgbGFuZHNhdCBxdWUgY29ycmVzcG9udGVuIGNvbiBsb3MgbXVlc3RyZW9zDQoNCnNhbXB2YWxzIDwtIGV4dHJhY3QobGFuZHNhdCwgc2FtcGxldmFsLCBkZiA9IFRSVUUpDQpoZWFkKHNhbXB2YWxzKQ0KYGBgDQoNCmBgYHtyIGluY2x1ZGUgPSBGQUxTRX0NCiMgUXVpdGFtb3MgbGEgcHJpbWVyYSBjb2x1bW5hDQoNCnNhbXB2YWxzIDwtIHNhbXB2YWxzWywgLTFdDQpzYW1wdmFscw0KYGBgDQoNCmBgYHtyIGluY2x1ZGUgPSBGQUxTRX0NCiMgQ3JlYW1vcyB1biBkYXRhLmZyYW1lIGNvbiBsYSBwcmltZXJhIGNvbHVtbmEgY29tbyBsb3MgdmFsb3JlcyBkZSBjbGFzZSB5IGxhcyBkZW3DoXMgY29uIGxvcyB2YWxvcmVzIGRlIHBpeGVsIGV4dHJhaWRvcw0KDQpzYW1wZGF0YSA8LSBkYXRhLmZyYW1lKGNsYXNzdmFsdWUgPSBzYW1wbGV2YWxAZGF0YSRjbGFzc3ZhbHVlLCBzYW1wdmFscykNCnNhbXBkYXRhICANCmBgYA0KDQpgYGB7ciBpbmNsdWRlID0gRkFMU0V9DQpjbGFzc2RmIDwtIGRhdGEuZnJhbWUoSUQgPSBjKDEsMiwzLDQsNSw2LDcpLCBsZWdlbmQgPSBjKCJBZ3VhIiwgIkJhcmJlY2hvIiwgIkN1bHRpdm8gaGVyYmFjZW8iLCAiQ3VsdGl2byBwZXJtYW5lbnRlIiwgIkRlaGVzYSIsICJJbmR1c3RyaWFsIiwgIlJlc2lkZW5jaWFsIikpDQpjbGFzc2RmDQpgYGANCg0KYGBge3IgaW5jbHVkZSA9IEZBTFNFfQ0KY2xhc3Njb2xvciA8LSBjKCJkYXJrYmx1ZSIsICJjaG9jb2xhdGUxIiwgImRhcmtncmVlbiIsICJjaGFydHJldXNlMiIsICJ5ZWxsb3ciLCAiY3lhbiIsICJkYXJrcmVkIikNCmBgYA0KDQojIyMgUmFuZG9tIEZvcmVzdA0KDQo8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOiBqdXN0aWZ5Ij4NCg0KQ29tbyBzdSBwcm9waW8gbm9tYnJlIGluZGljYSwgUmFuZG9tIEZvcmVzdCBjb25zaXN0ZSBlbiB1bmEgZ3JhbiBjYW50aWRhZCBkZSDDoXJib2xlcyBkZSBkZWNpc2nDs24gaW5kaXZpZHVhbGVzIHF1ZSBvcGVyYW4gY29tbyB1biBjb25qdW50by4gRXN0ZSBhbGdvcml0bW8gcHVlZGUgc2VyIG1lbm9zIHNlbnNpYmxlIGFsIHJ1aWRvIHkgcHVlZGUgc2VyIG3DoXMgZWZpY2llbnRlIHF1ZSBvdHJvcyBjbGFzaWZpY2Fkb3JlcyBubyBwYXJhbcOpdHJpY29zIGRlIHVzbyBjb23Dum4sIGNvbW8gbGFzIG3DoXF1aW5hcyBkZSBzb3BvcnRlIHZlY3RvcmlhbCAoUGVsbGV0aWVyIGV0IGFsLiwgMjAxNikuIFNlIGhhbiB1dGlsaXphZG8gMTk5MyBwdW50b3MgZGUgbXVlc3RyZW8gZGlzdHJpYnVpZG9zIGFsZWF0b3JpYW1lbnRlIGVuIGxvcyA2NSBwb2zDrWdvbm9zIGNsYXNpZmljYWRvcyBwcmV2aWFtZW50ZS4gRWwgbWFwYSBkZSBjbGFzaWZpY2FjacOzbiBwcmVkaWNobyBtZWRpYW50ZSBlbCBtb2RlbG8gb2J0ZW5pZG8gcG9yIGVsIGFsZ29yaXRtbyBSYW5kb20gRm9yZXN0IHNlIG11ZXN0cmEgYSBjb250aW51YWNpw7NuOg0KDQo8ZGl2Lz4NCg0KYGBge3IgaW5jbHVkZSA9IEZBTFNFfQ0KbGlicmFyeShyYW5kb21Gb3Jlc3QpDQpgYGANCg0KYGBge3IgaW5jbHVkZSA9IEZBTFNFfQ0KbW9kZWwgPC0gcmFuZG9tRm9yZXN0KGFzLmZhY3RvcihjbGFzc3ZhbHVlKX4uLCBkYXRhID0gc2FtcGRhdGEsICkNCm1vZGVsDQpgYGANCg0KYGBge3IgaW5jbHVkZSA9IEZBTFNFfQ0KcHJsYW5kc2F0MiA8LSBwcmVkaWN0KGxhbmRzYXQsIG1vZGVsLCB0eXBlPSdjbGFzcycpDQpwcmxhbmRzYXQyDQpgYGANCg0KYGBge3IgaW5jbHVkZSA9IEZBTFNFfQ0KbGlicmFyeShsYXR0aWNlKQ0KbGlicmFyeShyYXN0ZXJWaXMpDQpgYGANCg0KYGBge3IgZWNobyA9IEZBTFNFLCBvdXQud2lkdGggPSAiMTAwJSJ9DQpwcmxhbmRzYXQyIDwtIHJhdGlmeShwcmxhbmRzYXQyKQ0KbGV2ZWxzKHBybGFuZHNhdDIpIDwtIGNsYXNzZGYNCmxldmVscGxvdChwcmxhbmRzYXQyLA0KICAgICAgICAgIG1heHBpeGVscyA9IDFlNiwgDQogICAgICAgICAgeGxhYj0gTlVMTCwNCiAgICAgICAgICB5bGFiPSBOVUxMLA0KICAgICAgICAgIG1haW49ICJDbGFzaWZpY2FjacOzbiBvYnRlbmlkYSBtZWRpYW50ZSBSYW5kb20gRm9yZXN0IiwNCiAgICAgICAgICBjb2xvcmtleSA9IFRSVUUsDQogICAgICAgICAgc2NhbGVzPWxpc3QoZHJhdz1UUlVFKSwNCiAgICAgICAgICBjb2wucmVnaW9ucyA9IGNsYXNzY29sb3IsDQogICAgICAgICAgbGFiZWxzID0gRkFMU0UpDQpgYGANCg0KYGBge3IsIGVjaG8gPSBGQUxTRX0NCg0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoIkM6L1VzZXJzL1VTUy9EZXNrdG9wL1BlZHJvLzIwMTkgLSAyMDIwL1BlcmNlcGNpb24gcmVtb3RhL0luZm9ybWUgMS9tYXBhMi5wbmciKQ0KDQpgYGANCg0KXA0KPGRpdiBzdHlsZT0idGV4dC1hbGlnbjoganVzdGlmeSI+DQoNCkxhIG1hdHJpeiBkZSBjb25mdXNpw7NuIHBlcm1pdGUgbGEgdmlzdWFsaXphY2nDs24gZGUgbGEgZWZlY3RpdmlkYWQgZGVsIGFsZ29yaXRtbyBkZSBjbGFzaWZpY2FjacOzbiB1dGlsaXphZG8uIExhcyBjb2x1bW5hcyBkZSBsYSBtYXRyaXogcmVwcmVzZW50YW4gZWwgbsO6bWVybyBkZSBwcmVkaWNjaW9uZXMgZGUgY2FkYSBjbGFzZSwgbWllbnRyYXMgcXVlIGxhcyBmaWxhcyByZXByZXNlbnRhbiBsYXMgb2JzZXJ2YWNpb25lcyByZWFsZXMgZW4gY2FkYSBjYXRlZ29yw61hLg0KDQo8ZGl2Lz4NCg0KYGBge3IgaW5jbHVkZT1GQUxTRX0NCndyaXRlUmFzdGVyKHBybGFuZHNhdDIsICJwcmVkaWNjaW9uIiwgb3ZlcndyaXRlPVRSVUUpDQpgYGANCg0KYGBge3IgaW5jbHVkZSA9IEZBTFNFfQ0KdGFibGEgPC0gZGF0YS5mcmFtZShtb2RlbCRjb25mdXNpb24pDQpuYW1lcyh0YWJsYSkgPSBjKCJBZ3VhIiwiQmFyYmVjaG8iLCJDdWx0aXZvIGhlcmJhY2VvIiwiQ3VsdGl2byBwZXJtYW5lbnRlIiwiRGVoZXNhIiwiSW5kdXN0cmlhbCIsIlJlc2lkZW5jaWFsIiwgIkVycm9yIGRlIGNsYXNlIikNCnRhYmxhDQpgYGANCg0KYGBge3IgZWNobyA9IEZBTFNFfQ0KQ2xhc2UgPC0gYygiQWd1YSIsIkJhcmJlY2hvIiwiQ3VsdGl2byBoZXJiYWNlbyIsIkN1bHRpdm8gcGVybWFuZW50ZSIsIkRlaGVzYSIsIkluZHVzdHJpYWwiLCJSZXNpZGVuY2lhbCIpDQp4IDwtIGNiaW5kKENsYXNlLCB0YWJsYSkNCmtuaXRyOjprYWJsZSh4KQ0KYGBgDQoNCiMjIEV2YWx1YWNpw7NuIGRlbCBtb2RlbG8NCg0KPGRpdiBzdHlsZT0idGV4dC1hbGlnbjoganVzdGlmeSI+DQoNCkxhIGV2YWx1YWNpw7NuIGRlIHByZWNpc2nDs24gZXMgZWwgcGFzbyBmaW5hbCBlbiBlbCBhbsOhbGlzaXMgZGUgbG9zIGRhdG9zIGRlIHRlbGVkZXRlY2Npw7NuLiBBeXVkYSBhIHZlcmlmaWNhciBsYSBwcmVjaXNpw7NuIGRlIGxvcyByZXN1bHRhZG9zIG9idGVuaWRvcy4gU2UgaGEgZWxlZ2lkbyBsYSBwcmVjaXNpw7NuIGdlbmVyYWwsIGVsIGNvZWZpY2llbnRlIEthcHBhIHkgbGEgcHJlY2lzacOzbiBkZWwgcHJvZHVjdG9yIHkgZGVsIHVzdWFyaW8gY29tbyBldmFsdWFjaW9uZXMgY3VhbnRpdGF0aXZhcyBwYXJhIGRldGVybWluYXIgbGEgcHJlY2lzacOzbiBmaW5hbCBkZSBsYSBjbGFzaWZpY2FjacOzbiBzdXBlcnZpc2FkYSBkZSBsYSBjdWJpZXJ0YSB0ZXJyZXN0cmUuICANCg0KPGRpdi8+DQoNCiMjIyBQcmVjaXNpw7NuIGdlbmVyYWwNCg0KPGRpdiBzdHlsZT0idGV4dC1hbGlnbjoganVzdGlmeSI+DQoNCkxhIHByZWNpc2nDs24gZ2VuZXJhbCBlcyBsYSBtZWRpZGEgZGUgcHJlY2lzacOzbiBtw6FzIHNpbXBsZSB5IHVuYSBkZSBsYXMgbcOhcyBwb3B1bGFyZXMuIFNlIGNhbGN1bGEgZGl2aWRpZW5kbyBlbCBlbCBuw7ptZXJvIHRvdGFsIGRlIHDDrXhlbGVzIGNsYXNpZmljYWRvcyBjb3JyZWN0YW1lbnRlIChlcyBkZWNpciwgbGEgc3VtYSBkZSBsYSBkaWFnb25hbCBwcmluY2lwYWwpIHBvciBlbCBuw7ptZXJvIHRvdGFsIGRlIHDDrXhlbGVzIGVuIGxhIG1hdHJpeiBkZSBjb25mdXNpw7NuIChDb25nYWx0b24sIDE5OTEpLg0KDQo8ZGl2Lz4NCg0KJCRPdmVyYWxsXCBhY2N1cmFjeVwgKE9BKT1cZnJhY3tcc3Vte0RpYWdvbmFsfX17XHN1bXttYXRyaXh9fSQkDQoNCkRvbmRlOiANCg0KIyMjIyMjICRcc3Vte0RpYWdvbmFsfSQgPSBTdW1hIGRlIGxvcyB2YWxvcmVzIGRlIGxhIGRpYWdvbmFsIHByaW5jaXBhbCBkZSBsYSBtYXRyaXogZGUgY29uZnVzacOzblwNCiMjIyMjIyAkXHN1bXttYXRyaXh9JCA9IFN1bWEgZGUgdG9kb3MgbG9zIHZhbG9yZXMgZGUgbGEgbWF0cml6IGRlIGNvbmZ1c2nDs25cDQoNCmBgYHtyIGluY2x1ZGU9RkFMU0V9DQojIG51bWJlciBvZiBjYXNlcw0KbiA8LSBjb2xTdW1zICh0YWJsYVsgLCAxOjddKQ0Kbg0KYGBgDQoNCmBgYHtyIGluY2x1ZGU9RkFMU0V9DQpuMiA8LSBzdW0obikNCm4yDQpgYGANCg0KYGBge3IgaW5jbHVkZT1GQUxTRX0NCmRpYWcgPC0gZGlhZyhtb2RlbCRjb25mdXNpb24pDQpkaWFnDQpgYGANCg0KYGBge3IgaW5jbHVkZT1GQUxTRX0NCiMgT3ZlcmFsbCBBY2N1cmFjeQ0KT0EgPC0gc3VtKGRpYWcpIC8gbjINCk9BDQpgYGANCg0KIyMjIEthcHBhDQoNCjxkaXYgc3R5bGU9InRleHQtYWxpZ246IGp1c3RpZnkiPg0KDQpFc3RhIGV2YWx1YWNpw7NuIGNvcnJpZ2UgbGEgcHJlY2lzacOzbiBnZW5lcmFsIGRlIGxhcyBwcmVkaWNjaW9uZXMgZGVsIG1vZGVsbyBwb3IgbGEgcHJlY2lzacOzbiBxdWUgc2UgZXNwZXJhIHF1ZSBvY3VycmEgcG9yIGNhc3VhbGlkYWQ6DQoNCjxkaXYvPg0KDQokJEthcHBhXCAoSyk9XGZyYWN7T3ZlcmFsbFwgYWNjdXJhY3ktY2hhbmNlXCBhZ3JlZW1lbnR9ezEtY2hhbmNlXCBhZ3JlZW1lbnR9JCQNCjxkaXYgc3R5bGU9InRleHQtYWxpZ246IGp1c3RpZnkiPg0KDQpEb25kZToNCg0KIyMjIyMjICRPdmVyYWxsXCBhY2N1cmFjeSQgPSBEZXRlcm1pbmFkbyBwb3IgbGEgZGlhZ29uYWwgcHJpbmNpcGFsIGRlIGxhIG1hdHJpeiBkZSBjb25mdXNpw7NuXA0KIyMjIyMjICRjaGFuY2VcIGFncmVlbWVudCQgPSBTdW1hIGRlbCBwcm9kdWN0byBkZSBsb3MgdG90YWxlcyBkZSBjYWRhIGZpbGEgeSBjb2x1bW5hIGRpdmlkaWRvcyBwb3IgZWwgbsO6bWVybyB0b3RhbCBkZSBwaXhlbGVzIG11ZXN0cmVhZG9zIHBhcmEgY2FkYSBjbGFzZS4NCg0KPGRpdi8+DQoNCmBgYHtyIGluY2x1ZGU9RkFMU0V9DQp0YWJsYTIgPC0gdGFibGFbLCAtOF0NCnRhYmxhMg0KYGBgDQoNCmBgYHtyIGluY2x1ZGU9RkFMU0V9DQpwIDwtIHJvd1N1bXModGFibGEyWzE6NywgXSkNCnAgPC0gcC9uMg0KcA0KYGBgDQoNCmBgYHtyIGluY2x1ZGU9RkFMU0V9DQpxIDwtIGNvbFN1bXModGFibGFbICwgMTo3XSkNCnEgPC0gcS9uMg0KcQ0KYGBgDQoNCmBgYHtyIGluY2x1ZGU9RkFMU0V9DQpleHBBY2N1cmFjeSA8LSBzdW0ocCpxKQ0Ka2FwcGEgPC0gKE9BIC0gZXhwQWNjdXJhY3kpIC8gKDEgLSBleHBBY2N1cmFjeSkNCmthcHBhDQpgYGANCg0KXA0KTG9zIHZhbG9yZXMgZGUgZXZhbHVhY2nDs24gZGUgbGEgcHJlY2lzacOzbiBnZW5lcmFsIHkga2FwcGEgc2UgbXVlc3RyYW4gYSBjb250aW51YWNpw7NuOg0KDQpgYGB7ciBlY2hvID0gRkFMU0V9DQpvayA8LSBkYXRhLmZyYW1lKE92ZXJhbGxfYWNjdXJhY3kgPSBPQSwgS2FwcGEgPSBrYXBwYSkNCmtuaXRyOjprYWJsZShvaykNCmBgYA0KDQoNCiMjIyBQcmVjaXNpw7NuIGRlbCBwcm9kdWN0b3IgeSBkZWwgdXN1YXJpbw0KDQo8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOiBqdXN0aWZ5Ij4NCg0KU2UgcHJvZHVjZSB1biBlcnJvciBkZSBjbGFzaWZpY2FjacOzbiBjdWFuZG8gYSB1biBwaXhlbCBwZXJ0ZW5lY2llbnRlIGEgdW5hIGNsYXNlIHNlIGxlIGFzaWduYSB1bmEgY2xhc2UgZGlzdGludGEuIExhIHByZWNpc8OzbiBkZWwgUHJvZHVjdG9yIG1pZGUgZXJyb3JlcyBkZSBvbWlzacOzbiwgZXMgZGVjaXIsIGN1YW5kbyBzZSBleGNsdXllIHVuIHBpeGVsIGRlIGxhIGNhdGVnb3LDrWEgcXVlIGVzdMOhIHNpZW5kbyBldmFsdWFkYS4gRW4gY2FtYmlvLCBsYSBwcmVjaXNpw7NuIGRlbCB1c3VhcmlvIG1pZGUgbG9zIGVycm9yZXMgZGUgY29taXNpw7NuLCBlc3RvIGVzLCBjdWFuZG8gc2UgaW5jbHV5ZSB1biBwaXhlbCBpbmNvcnJlY3RhbWVudGUgZW4gbGEgY2F0ZWdvcsOtYSBxdWUgZXN0w6Egc2llbmRvIGV2YWx1YWRhLiANCg0KTGEgcHJlY2lzacOzbiBkZWwgcHJvZHVjdG9yIChQQSkgc2Ugb2J0aWVuZSBkZSBkaXZpZGlyIGVsIG7Dum1lcm8gZGUgcMOteGVsZXMgY29ycmVjdGFtZW50ZSBjbGFzaWZpY2Fkb3MgZW4gY2FkYSBjYXRlZ29yw61hIChkaWFnb25hbCBwcmluY2lwYWwgZGUgbGEgbWF0cml6IGRlIGNvbmZ1c2nDs24pIHBvciBlbCBuw7ptZXJvIGRlIHDDrXhlbGVzIGRlIHJlZmVyZW5jaWEgZGUgZXNhIGNhdGVnb3LDrWEgKGVsIHRvdGFsIGRlIGxhIGNvbHVtbmEpOg0KDQokJFByb2R1Y3RvclwgYWNjdXJhY3lcIChQQSk9XGZyYWN7RGlhZ29uYWx9e1xzdW17Y29sfX0kJA0KRG9uZGU6DQoNCiMjIyMjIyAkRGlhZ29uYWwkID0gVmFsb3IgZGUgbGEgY29sdW1uYSBwZXJ0ZW5lY2llbnRlIGEgbGEgZGlhZ29uYWwgcHJpbmNpcGFsIGRlIGxhIG1hdHJpeiBkZSBjb25mdXNpw7NuXA0KIyMjIyMjICRcc3Vte2NvbH0kID0gU3VtYSBkZSBjYWRhIGNvbHVtbmEgZGUgbGEgbWF0cml6IGRlIGNvbmZ1c2nDs25cDQoNCjxkaXYvPg0KDQoNCjxkaXYgc3R5bGU9InRleHQtYWxpZ246IGp1c3RpZnkiPg0KDQpcDQpNaWVudHJhcyBxdWUgbGEgcHJlY2lzacOzbiBkZWwgdXN1YXJpbyAoVUEpIHNlIGNhbGN1bGEgZGl2aWRpZW5kbyBlbCBuw7ptZXJvIGRlIHDDrXhlbGVzIGNvcnJlY3RhbWVudGUgY2xhc2lmaWNhZG9zIGVuIGNhZGEgY2F0ZWdvcsOtYSBwb3IgZWwgbsO6bWVybyB0b3RhbCBkZSBww614ZWxlcyBxdWUgc2UgY2xhc2lmaWNhcm9uIGVuIGVzYSBjYXRlZ29yw61hIChlbCB0b3RhbCBkZSBsYSBmaWxhKToNCg0KPGRpdi8+DQoNCiQkVXNlclwgYWNjdXJhY3lcIChVQSk9XGZyYWN7RGlhZ29uYWx9e1xzdW17cm93fX0kJA0KRG9uZGU6DQoNCiMjIyMjIyAkRGlhZ29uYWwkID0gVmFsb3IgZGUgbGEgZmlsYSBwZXJ0ZW5lY2llbnRlIGEgbGEgZGlhZ29uYWwgcHJpbmNpcGFsIGRlIGxhIG1hdHJpeiBkZSBjb25mdXNpw7NuXA0KIyMjIyMjICRcc3Vte2NvbH0kID0gU3VtYSBkZSBjYWRhIGZpbGEgZGUgbGEgbWF0cml6IGRlIGNvbmZ1c2nDs25cDQoNCmBgYHtyIGluY2x1ZGU9RkFMU0V9DQpQQSA8LSBkaWFnL2NvbFN1bXModGFibGFbICwgMTo3XSkNClBBDQpgYGANCg0KYGBge3IgaW5jbHVkZT1GQUxTRX0NClVBIDwtIGRpYWcgLyByb3dTdW1zKHRhYmxhMlsxOjcsIF0pDQpVQQ0KYGBgDQoNCmBgYHtyIGluY2x1ZGU9RkFMU0V9DQpvdXRBY2MgPC0gZGF0YS5mcmFtZShQcmVjaXNpb25fcHJvZHVjdG9yID0gUEEsIFByZWNpc2lvbl91c3VhcmlvID0gVUEpDQpvdXRBY2MNCmBgYA0KDQo8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOiBqdXN0aWZ5Ij4NClwNCg0KTG9zIHZhbG9yZXMgZGUgcHJlY2lzacOzbiBkZWwgcHJvZHVjdG9yIHkgZGVsIHVzdWFyaW8gcGFyYSBjYWRhIHRpcG8gZGUgY29iZXJ0dXJhIHNlIGFncnVwYW4gZW4gbGEgc2lndWllbnRlIHRhYmxhOg0KDQo8ZGl2Lz4NCg0KYGBge3IgZWNobz1GQUxTRX0NCmhoIDwtIGNiaW5kKENsYXNlLCBvdXRBY2MpDQprbml0cjo6a2FibGUoaGgpDQpgYGANCg0KIyBEaXNjdXNpw7NuDQoNCjxkaXYgc3R5bGU9InRleHQtYWxpZ246IGp1c3RpZnkiPg0KDQpPYnNlcnZhbmRvIGxvcyBwZXJmaWxlcyBlc3BlY3RyYWxlcywgc2UgcHVlZGVuIHByZXZlciBsYXMgZGlmaWN1bHRhZGVzIHF1ZSBzZSB2YW4gYSBwcmVzZW50YXIgZW4gdG9ybm8gYSBsYSBjbGFzaWZpY2FjacOzbiBkZSBsYXMgc3VwZXJmaWNpZXMgZGUgYmFyYmVjaG8sIGN1bHRpdm9zIHBlcm1hbmVudGVzIHkgcmVzaWRlbmNpYWxlcyBjdXlhIHNlbWVqYW56YSBlc3BlY3RyYWwgY29tcGxpY2Egc3UgZGlzY3JpbWluYWNpw7NuLiBFc3RhIHNlbWVqYW56YSBwdWVkZSBlc3RhciBvY2FzaW9uYWRhIHBvciBlbCBzaXN0ZW1hIGRlIGV4cGxvdGFjacOzbiBleHRlbnNpdm8gdHJhZGljaW9uYWwgZGUgbGEgem9uYSwgZG9uZGUsIGFtcGxpb3MgbWFyY29zIGRlIHBsYW50YWNpw7NuIHVuaWRvIGEgdW5hIGxhYnJhbnphIGNvbnN0YW50ZSBkZWwgdGVycmVubywgaGFjZSBxdWUgbGFzIHN1cGVyZmljaWVzIGRlc3RpbmFkYXMgYSBjdWx0aXZvcyBwZXJtYW5lbnRlcyByZWZsZWplbiBsYSByYWRpYWNpw7NuIGRlIGZvcm1hIHNpbWlsYXIgYSBsb3MgdGVycmVub3MgZW4gYmFyYmVjaG8gKHRhbWJpw6luIGludGVuc2FtZW50ZSBsYWJyYWRvcykuIEFtYmFzIHN1cGVyZmljaWVzIGRpZmllcmVuIMO6bmljYW1lbnRlIGVuIGxhIG1heW9yIHJlZmxlY3RhbmNpYSBkZSBsb3MgY3VsdGl2b3MgcGVybWFuZW50ZXMgZGViaWRvIGEgbGEgbWF5b3IgcHJlc2VuY2lhIGRlIHZlZ2V0YWNpw7NuLiBMYSBzaW1pbGl0dWQgZXNwZWN0cmFsIGVudHJlIGVzdGFzIGRvcyBjbGFzZXMgeSBsYXMgc3VwZXJmaWNpZXMgcmVzaWRlbmNpYWxlcyBwdWVkZSBkZWJlcnNlIGEgcXVlIGVsIGNvbXBvbmVudGUgcHJpbmNpcGFsIGVuIGxhIGZhYnJpY2FjacOzbiBkZWwgbWF0ZXJpYWwgY2Vyw6FtaWNvLCB1dGlsaXphZG8gZ2VuZXJhbG1lbnRlIGVuIGVzdGUgdGlwbyBkZSBjb25zdHJ1Y2Npb25lcywgZXMgbGEgYXJjaWxsYSwgbWluZXJhbCBwcmVkb21pbmFudGUgZW4gZWwgw6FyZWEgZGUgZXN0dWRpby4gU2luIGVtYmFyZ28sIGVzdGFzIGZpcm1hcyBlc3BlY3RyYWxlcyBkaWZpZXJlbiBkZSBsYXMgb2J0ZW5pZGFzIGVuIGxhcyBzdXBlcmZpY2llcyBpbmR1c3RyaWFsZXMsIHRhbWJpZW4gZGVkaWNhZGFzIGEgbGEgZWRpZmljYWNpw7NuLCBwZXJvIGRvbmRlIHNlIHV0aWxpemFuIG1hdGVyaWFsZXMgbWV0w6FsaWNvcyBwYXJhIHN1IGNvbnN0cnVjY2nDs24uDQoNCkxhcyBzdXBlcmZpY2llcyBkZXN0aW5hZGFzIGEgY3VsdGl2b3MgaGVyYsOhY2VvcyBtYW50aWVuZW4gZWwgcGVyZmlsIGhhYml0dWFsIHBhcmEgZXNlIHRpcG8gZGUgdmVnZXRhY2nDs24sIGJhamEgcmVsZmVjdGFuY2lhIGVuIGVsIGVzcGVjdHJvIHZpc2libGUgeSB1biBwaWNvIHByb251bmNpYWRvIGVuIGVsIGluZnJhcnJvam8gY2VyY2FubyAoTklSKS4gRW4gZWwgY2FzbyBkZSBsb3MgY3VsdGl2b3MgcGVybWFuZW50ZXMsIGxhIG1lbm9yIHJlZmxlY3RhbmNpYSBlbiBlbCBOSVIgcHVlZGUgZGViZXJzZSBhIHN1IGJhamEgZGVuc2lkYWQgZGUgcGxhbnRhY2nDs24sIGRvbmRlIGdyYW4gcGFydGUgZGUgbGEgZW5lcmfDrWEgcmVjaWJpZGEgZW4gZWwgc2Vuc29yIGVzIHJlZmxlamFkYSBwb3IgZWwgc3VlbG8gc3VieWFjZW50ZS4gQWxnbyBkaXN0aW50byBzdWNlZGUgZW4gbGFzIMOhcmVhcyBkZSBkZWhlc2EsIGRvbmRlIGVsIHRlcnJlbm8gZXN0YSBjb21wbGV0YW1lbnRlIGN1YmllcnRvIGRlIHZlZ2V0YWNpw7NuLiBFbiBlc3RlIGNhc28gbGEgYmFqYSByZWZsZWN0YW5jaWEgZW4gZWwgaW5mcmFycm9qbyBjZXJjYW5vIHB1ZWRlIGVzdGFyIHByb2R1Y2lkYSBwb3IgZWwgdGlwbyBkZSB2ZWdldGFjacOzbiBwcmVzZW50ZSBlbiBsYSB6b25hLCBjb24gZnJhY2Npb25lcyBzZWNhcyB5IGxlw7Fvc2FzIHF1ZSBwb3NlZW4gZXNjYXNhIGNhbnRpZGFkIGRlIGNsb3JvZmlsYXMuIA0KDQpMYSByZWZsZWN0YW5jaWEgZW4gbGEgcG9yY2nDs24gZGVsIGluZnJhcnJvam8gbWVkaW8gKFNXSVIxKSBkZSBsYXMgZGlzdGludGFzIGNsYXNlcyBkZSB2ZWdldGFjacOzbiBlc3TDoSBpbmZsdWVuY2lhZGEgcG9yIGxhIGNhbnRpZGFkIGRlIGh1bWVkYWQgcHJlc2VudGUgZW4gc3VzIHRlamlkb3MuIEEgbWVkaWRhIHF1ZSBhdW1lbnRhIGVsIGNvbnRlbmlkbyBkZSBhZ3VhIGVuIGxhIGhvamEsIGxhcyBjYXJhY3RlcsOtc3RpY2FzIGRlIGFic29yY2nDs24gZGUgcmFkaWFjacOzbiBTV0lSIHNlIHZlbiBhZmVjdGFkYXMgcG9yIGxhcyBwcm9waWVkYWRlcyBlc3BlY3RyYWxlcyBkZWwgYWd1YSAoU2VyYmluIGV0IGFsLiwgMjAwOSkuIEVzdG8gZXhwbGljYXLDrWEgbGEgbWVub3IgcmVmbGVjdGFuY2lhIGRlIGxvcyBjdWx0aXZvcyBhbnVhbGVzIGVuIGVzdGEgcG9yY2nDs24gZGVsIGVzcGVjdHJvLCBkZWJpZG8gYSBxdWUsIHN1cyBlc3RydWN0dXJhcyBkZWJlbiBhbG1hY2VuYXIgbWF5b3IgY2FudGlkYWQgZGUgYWd1YSBwYXJhIG1hbnRlbmVyIGxhIHR1cmdlbmNpYS4gVW5pZG8gYSBlc3RvLCBtdWNob3MgYWdyaWN1bHRvcmVzIGF1bWVudGFuIGxhIGRpc3BvbmliaWxpZGFkIGRlIGFndWEgcGFyYSBlc29zIGN1bHRpdm9zIG1lZGlhbnRlIGxhIHV0aWxpemFjacOzbiBzaXN0ZW1hcyBkZSByaWVnby4NCg0KRW4gbGEgbWF0cml6IGRlIGNvcnJlbGFjacOzbiBzZSBwdWVkZSBvYnNlcnZhciBxdWUgbGEgYmFuZGEgZGVsIGluZnJhcnJvam8gY2VyY2FubyAoTklSKSBlcyBsYSBtZW5vcyBjb3JyZWxhY2lvbmFkYSBjb24gZWwgcmVzdG8sIHNpZW5kbyBsYSBxdWUgcG9zZWUgbWVub3IgaW5mb3JtYWNpw7NuIHJlZHVuZGFudGUgZGUgbGFzIG90cmFzIGJhbmRhcy4gRXMgcG9yIGVzdG8gcXVlIHNlIHV0aWxpemEgZW4gbGEgZ3JhbiBtYXlvcsOtYSBkZSBsb3Mgw61uZGljZXMgZGUgZGlmZXJlbmNpYSBub3JtYWxpemFkYS4gRWwgcmVzdG8gZGUgYmFuZGFzIHBvc2VlbiB1bmEgY29ycmVsYWNpw7NuIGFsdGEsIHN1cGVyaW9yIGFsIDcwJS4NCg0KRWwgw61uZGljZSBkZSB2ZWdldGFjacOzbiBkZSBkaWZlcmVuY2lhIG5vcm1hbGl6YWRhIChORFZJKSBtdWVzdHJhIHZhbG9yZXMgYmFzdGFudGUgZGlzcGFyZXMgZW50cmUgbGFzIGRpZmVyZW50ZXMgw6FyZWFzIGRlIHZlZ2V0YWNpw7NuLiBMb3MgY3VsdGl2b3MgaGVyYsOhY2VvcyB1YmljYWRvcyBlbiBsYSByaWJlcmEgZGVsIHLDrW8gVGFqbyB5IGVuIGxhIHpvbmEgbm9yb2VzdGUgZGVsIMOhcmVhIGRlIGVzdHVkaW8gcHJlc2VudGFuIHZhbG9yZXMgY2VyY2Fub3MgYSAxLCBsbyBxdWUgZXN0w6EgYXNvY2lhZG8gYSB1bmEgdmVnZXRhY2nDs24gbcOhcyBhY3RpdmEgKENodXZpZWNvLCAyMDA4KS4gU2kgYmllbiBlbCB2YWxvciBkZWwgTkRWSSBwdWVkZSB2YXJpYXIgZW4gZnVuY2nDs24gZGUgZGl2ZXJzb3MgZmFjdG9yZXMgY29tbyBlbCBlc3RhZG8gZmVub2zDs2dpY28gZGUgbGEgdmVnZXRhY2nDs24gbyBzaXR1YWNpw7NuIGjDrWRyaWNhIGRlbCBzdWVsbywgcHVlZGUgdXRpbGl6YXJzZSBjb21vIGNyaXRlcmlvIGRlIGNsYXNpZmljYWNpw7NuIHNpIHNlIGRpc3BvbmUgZGUgdmFsb3JlcyBkZSByZWZlcmVuY2lhLiBIZXJuw6FuZGV6IGV0IGFsLiwgKDIwMTQpIG9idGl2aWVyb24gdmFsb3JlcyBkZSBORFZJIHF1ZSBvc2NpbGFuIGVudHJlIDAsMyB5IDAsNCBwYXJhIG90cmFzIGRlaGVzYXMgZGUgbGEgUGVuw61uc3VsYSBJYsOpcmljYSwgbG8gcXVlIGNvbmN1ZXJkYSBjb24gbG8gb2J0ZW5pZG8gZW4gZWwgcHJlc2VudGUgdHJhYmFqby4NCg0KTWVkaWFudGUgZWwgw61uZGljZSBkZSBhZ3VhIGRlIGRpZmVyZW5jaWEgbm9ybWFsaXphZGEgKE5EV0kpIHNlIGxvZ3LDsyBpZGVudGlmaWNhciBsYXMgbWFzYXMgZGUgYWd1YSBwcmVzZW50ZXMgZW4gZWwgw6FyZWEgZGUgZXN0dWRpby4gRWwgw61uZGljZSBwZXJtaXRlLCBpbmNsdXNvIGEgc2ltcGxlIHZpc3RhLCByZWNvbm9jZXIgcGVxdWXDsWFzIGJhbHNhcyBkZSByaWVnby4gU2luIGVtYmFyZ28sIG5vIHNlIG9idHV2aWVyb24gbG9zIG1pc21vcyByZXN1bHRhZG9zIGFsIGludGVudGFyIGlkZW50aWZpY2FyIGVsIHRlcnJlbm8gY29uc3RydWlkbyBtZWRpYW50ZSBlbCBOREJJLiBMYSBkaXNjcmltaW5hY2nDs24gZGUgY2xhc2VzIG5vIGZ1ZSBkZWwgdG9kbyBlZmVjdGl2YSBkZWJpZG8gYSBsYXMgc2ltaWxpdHVkZXMgZXNwZWN0cmFsZXMgY29tZW50YWRhcyBhbnRlcmlvcm1lbnRlLiANCg0KSnVudG8gY29uIGxvcyDDrW5kaWNlcyBkZSBkaWZlcmVuY2lhIG5vcm1hbGl6YWRhLCBsYXMgY29tcG9zaWNpb25lcyBkZSBjb2xvciBwZXJtaXRpZXJvbiBsYSBpZGVudGlmaWNhY2nDs24gcHJldmlhIGRlIGxhcyBjb2JlcnR1cmFzIGRlIHN1ZWxvLiBFcyBwcmVjaXNvIGRlc3RhY2FyIHF1ZSBsYXMgY29tcG9zaWNpb25lcyBlbiBmYWxzbyBjb2xvciBzb24gZXNwZWNpYWxtZW50ZSDDunRpbGVzIHBhcmEgZWwgcmVjb25vY2ltaWVudG8gZGUgc3VwZXJmaWNpZXMgY29uIGNpZXJ0YXMgY2FyYWN0ZXLDrXN0aWNhcyBlc3BlY3RyYWxlcywgY29tbyBsYSB2ZWdldGFjacOzbi4gDQoNCk1lZGlhbnRlIGVsIGFsZ29yaXRtbyBkZSBjbGFzaWZpY2FjacOzbiBzdXBlcnZpc2FkYSBSYW5kb20gRm9yZXN0IHNlIG9idHV2byB1biBidWVuIG1hcGEgZGUgY29iZXJ0dXJhIGRlIHN1ZWxvcywgZG9uZGUgc2UgcHVlZGVuIGlkZW50aWZpY2FyIGxhIG1heW9yw61hIGRlIHN1cGVyZmljaWVzIGRlc3RhY2FkYXMgYW50ZXJpb3JtZW50ZSBtZWRpYW50ZSBsb3Mgw61uZGljZXMgZGUgZGlmZXJlbmNpYSBub3JtYWxpemFkYSB5IGxhcyBjb21wb3NpY2lvbmVzIGRlIGNvbG9yLiBUcmFzIGNhbGN1bGFyIGxhIHByZWNpc2nDs24gZ2VuZXJhbCBkZWwgbW9kZWxvLCBzZSBvYnR1dm8gcXVlIGVsIDkxLDM3JSBkZSBsYXMgbXVlc3RyYXMgZXN0YWJhbiBjb3JyZWN0YW1lbnRlIGNsYXNpZmljYWRhcywgY29uIHVuIGNvZWZpY2llbnRlIGthcHBhIGRlIDAsODk0LCBlbCBjdWFsIHNlIGNvbnNpZGVyYSBjYXNpIHBlcmZlY3RvIChMYW5kaXMgJiBLb2NoLCAxOTc3KS4gDQoNCkxhIGNhdGVnb3LDrWEgcGVvciBjbGFzaWZpY2FkYSBwb3IgZWwgbW9kZWxvIGVzIGN1bHRpdm9zIHBlcm1hbmVudGVzLCBjb24gdW5hIHByZWNpc2nDs24gZGUgcHJvZHVjdG9yIHkgZGUgdXN1YXJpbyBkZSAwLDc3NTMgeSAwLDc4MTEgcmVzcGVjdGl2YW1lbnRlLiBFc3RvIHF1aWVyZSBkZWNpciBxdWUgZWwgNzcsNTMlIGRlIGxvcyBwaXhlbGVzIGNsYXNpZmljYWRvcyBwcmV2aWFtZW50ZSBlbiBlc2EgY2F0ZWdvcsOtYSB0YW1iacOpbiBhcGFyZWNlbiBjb24gZXNhIGNsYXNpZmljYWNpw7NuIGVuIGVsIG1hcGEgKHByZWNpc2nDs24gZGVsIHByb2R1Y3RvcikgeSBxdWUgZWwgNzgsMTElIGRlIGxvcyBww614ZWxlcyBxdWUgYXBhcmVjZW4gY29uIGVzYSBjbGFzZSBlbiBlbCBtYXBhIHJlYWxtZW50ZSBzb24gY3VsdGl2b3MgcGVybWFuZW50ZXMgKHByZWNpc2nDs24gZGVsIHVzdWFyaW8pLiBBZGVtYXMgZGUgw6lzdGEsIGxhcyDDum5pY2FzIGNsYXNlcyBjb24gdW5hIHByZWNpc2nDs24gbWVub3IgYWwgOTAlIHNvbiBiYXJiZWNobyAoMC44Mzg2IHkJMC44MjQxKSB5IHJlc2lkZW5jaWFsICgwLjg3MDIgeQkwLjc3NTUpLiBPYnNlcnZhbmRvIGxhIG1hdHJpeiBkZSBjb25mdXNpw7NuLCBzZSBwdWVkZSBhcHJlY2lhciBxdWUgbGEgbWF5b3LDrWEgZGUgbG9zIHDDrXhlbGVzIGNsYXNpZmljYWRvcyBpbmNvcnJlY3RhbWVudGUgZW4gZXN0YXMgY2F0ZWdvcsOtYXMgaGFuIHNpZG8gYWRqdWRpY2FkbyBlbnRyZSBlc3RhcyBtaXNtYXMgY2F0ZWdvcsOtYXMsIGNvbW8gc2UgcHJlZGlqbyBhbCBhbmFsaXphciBlbCBncsOhZmljbyBkZSBwZXJmaWxlcyBlc3BlY3RyYWxlcy4gUG9yIGVqZW1wbG8sIGEgbGEgY2F0ZWdvcsOtYSBkZSBiYXJiZWNobyBzZSBsZSBoYW4gaW5jbHVpZG8gMzMgcGl4ZWxlcyBkZSBjdWx0aXZvcyBwZXJtYW5lbnRlcyB5IDEyIGRlIHJlc2lkZW5jaWFsLCBtaWVudHJhcyBxdWUgYSBsYSBjbGFzZSBDdWx0aXZvcyBwZXJtYW5lbnRlcyBzZSBsZSBoYW4gYWRqdWRpY2FkbyAzMCBwaXhlbGVzIHBlcnRlbmVjaWVudGVzIGEgYmFyYmVjaG8geSAxMyBwZXJ0ZW5lY2llbnRlcyBhIHJlc2lkZW5jaWFsLg0KDQo8ZGl2Lz4NCg0KIyBDb25jbHVzacOzbg0KDQo8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOiBqdXN0aWZ5Ij4NCg0KTGFzIHJlZ2lvbmVzIHNlbWnDoXJpZGFzIGRlIGxhIHByb3ZpbmNpYSBkZSB0b2xlZG8gcHJlc2VudGFuLCBlbiBhbGd1bmFzIGRlIHN1cyBjdWJpZXJ0YXMsIHNlbWVqYW56YXMgZXNwZWN0cmFsZXMgeSByYWRpb23DqXRyaWNhcyBxdWUgcmVkdWNlbiBsYSBwcmVjaXNpw7NuIGNvbiBsYSBxdWUgc2UgcHVlZGUgZWxhYm9yYXIgdW5hIGNsYXNpZmljYWNpw7NuIHN1cGVydmlzYWRhIGRlIGNvYmVydHVyYSBkZSBzdWVsby4gDQoNCkRlYmlkbyBhIGxhIGdyYW4gY2FudGlkYWQgZGUgaW5mb3JtYWNpw7NuIHF1ZSBhcG9ydGEsIGVsIGdyw6FmaWNvIGRlIHBlcmZpbGVzIGVzcGVjdHJhbGVzIGVzIHVuIHByaW1lciBwYXNvIGZ1bmRhbWVudGFsIHBhcmEgbGEgZWxhYm9yYWNpw7NuIGRlIHVuYSBjbGFzaWZpY2FjacOzbiBzdXBlcnZpc2FkYSBkZSBjb2JlcnR1cmFzLiBUYW1iacOpbiBlcyByZWNvbWVuZGFibGUgbGEgYXBsaWNhY2nDs24gZGUgw61uZGljZXMgZGUgZGlmZXJlbmNpYSBub3JtYWxpemFkYSB5IGNvbXBvc2ljaW9uZXMgZGUgY29sb3IgY29tbyBoZXJyYW1pZW50YXMgcGFyYSBsYSBjb21wcmVuc2nDs24gZXNwZWN0cmFsIGRlIGxhcyBzdXBlcmZpY2llcyBldmFsdWFkYXMuIA0KDQpDb24gZWwgYWxnb3JpdG1vIFJhbmRvbSBGb3Jlc3Qgc2Ugb2J0aWVuZW4gYnVlbm9zIG1vZGVsb3MgZGUgY2xhc2lmaWNhY2nDs24gc3VwZXJ2aXNhZGEsIGEgcGVzYXIgZGUgbGFzIHNpbWlsaXR1ZGVzIGVzcGVjdHJhbGVzIHByZXNlbnRlcyBlbiBsYXMgY29iZXJ0dXJhcyBkZWwgw6FyZWEgZGUgZXN0dWRpby4gTm8gb2JzdGFudGUsIGVzIHByZWNpc28gdGVuZXIgZW4gY3VlbnRhIGxvcyByZXN1bHRhZG9zIG9idGVuaWRvcyBlbiBsYSBldmFsdWFjacOzbiBkZSBwcmVjaXNpw7NuIGRlbCBtb2RlbG8gYSBsYSBob3JhIGRlIGxsZXZhciBhIGNhYm8gdW5hIGludGVycHJldGFjacOzbiBkZWwgbWFwYSBkZSBjbGFzaWZpY2FjacOzbi4NCg0KPGRpdi8+DQoNCiMgQmlibGlvZ3JhZsOtYQ0KDQpBTE9OU08sIENhcm1lbG87IE1PUkVOTywgVmljdG9yaWFubyB5IFJPRFLDjUdVRVosIEVsw61hcyAoMTk5MykuIERldGVybWluYWNpw7NuIGV4cGVyaW1lbnRhbCBkZSBsYSBmaXJtYSBlc3BlY3RyYWwgZGUgbGEgdmVnZXRhY2nDs24uIHVuYSBzZW5jaWxsYSBwcsOhY3RpY2EgZGUgaW50cm9kdWNjacOzbiBhIGxhIHRlbGVkZXRlY2Npw7NuLiBlbjogdGVsZWRldGVjY2nDs24uIGF2YW5jZXMgeSBhcGxpY2FjaW9uZXMuIEVuOiBNZW1vcmlhcyBWSUlJIENvbmdyZXNvIE5hY2lvbmFsIGRlIFRlbGVkZXRlY2Npw7NuLiBwLiA0MjktNDMyLg0KDQpDaHV2aWVjbywgRS4gKDIwMDgpLiBUZWxlZGV0ZWNjacOzbiBhbWJpZW50YWwsIGxhIG9ic2VydmFjacOzbiBkZSBsYSB0aWVycmEgZGVzZGUgZWwgZXNwYWNpby4gQmFyY2Vsb25hLCBFc3Bhw7FhLCBFZGl0b3JpYWwgQXJpZWwuDQoNCkNvbmdhbHRvbiwgUi4gRy4gKDE5OTEpLiBBIHJldmlldyBvZiBhc3Nlc3NpbmcgdGhlIGFjY3VyYWN5IG9mIGNsYXNzaWZpY2F0aW9ucyBvZiByZW1vdGVseSBzZW5zZWQgZGF0YS4gUmVtb3RlIHNlbnNpbmcgb2YgZW52aXJvbm1lbnQsIDM3KDEpLCAzNS00Ni4NCg0KRW1pbGlvIENodXZpZWNvLiAoMjAxMCkuIOKAnFRlbGVkZXRlY2Npw7NuIEFtYmllbnRhbOKAnS4gRWRpY2nDs24gMjAxMCwNCkVkaXRvcmlhbCBBcmllbCwgcGFnIDE4LDQ2LDU1Lg0KDQpGZXJyZWlyYSwgTS4gVC4gKDIwMTMpLiBDYWxpZGFkIGVjb2zDs2dpY2EgZW4gbGEgRGVtYXJjYWNpw7NuIEhpZHJvZ3LDoWZpY2EgZGVsIFRham86IFVuYSBwZXJzcGVjdGl2YSBpbnRlZ3JhZGEuIEVsIFRham8uIEhpc3RvcmlhIGRlIHVuIHLDrW8gaWdub3JhZG8sIDE0NS0xNzEuDQoNCkdBUkPDjUEtTUVMw4lOREVaLCBFLiBELiBVLiBBLiBSLiBELiBPLiAoMjAwNikuIEFuw6FsaXNpcyB2aXN1YWwgZGUgaW3DoWdlbmVzLiDDgXJlYSBkZSBHZW9kaW7DoW1pY28gRXh0ZXJuYS4NCg0KR8OzbWV6LCBDLiwgV2hpdGUsIEouIEMuLCAmIFd1bGRlciwgTS4gQS4gKDIwMTYpLiBPcHRpY2FsIHJlbW90ZWx5IHNlbnNlZCB0aW1lIHNlcmllcyBkYXRhIGZvciBsYW5kIGNvdmVyIGNsYXNzaWZpY2F0aW9uOiBBIHJldmlldy4gSVNQUlMgSm91cm5hbCBvZiBQaG90b2dyYW1tZXRyeSBhbmQgUmVtb3RlIFNlbnNpbmcsIDExNiwgNTUtNzIuDQoNCkhhbiwgSy4gUy4sIENoYW1wZWF1eCwgSi4gTC4sICYgUm91amVhbiwgSi4gTC4gKDIwMDQpLiBBIGxhbmQgY292ZXIgY2xhc3NpZmljYXRpb24gcHJvZHVjdCBvdmVyIEZyYW5jZSBhdCAxIGttIHJlc29sdXRpb24gdXNpbmcgU1BPVDQvVkVHRVRBVElPTiBkYXRhLiBSZW1vdGUgc2Vuc2luZyBvZiBFbnZpcm9ubWVudCwgOTIoMSksIDUyLTY2Lg0KDQpIZXJuw6FuZGV6LCBDLiBHLiwgRXNjcmliYW5vLCBKLiBBLiwgJiBUQVJRVUlTLCBZLiAoMjAxNCkuIENPTVBBUkFDScOTTiBERUwgw41ORElDRSBERSBWRUdFVEFDScOTTiBERSBESUZFUkVOQ0lBIE5PUk1BTElaQURBIE9CVEVOSURPIEEgRElGRVJFTlRFUyBFU0NBTEFTIEVOIFBBU1RPUyBERSBERUhFU0EuIFBBU1RPUyBZIFBBQywgMTIxLTEyOC4NCg0KSmVuc2VuLCBKb2huIFIuICgyMDE1KS4gSW50cm9kdWN0b3J5IERpZ2l0YWwgSW1hZ2UgUHJvY2Vzc2luZzogQSBSZW1vdGUgU2Vuc2luZyBQZXJzcGVjdGl2ZS4gVVNBLiBQcmVudGljZSBIYWxsIFByZXNzLg0KDQpMYW5kaXMsIEouIFIuLCAmIEtvY2gsIEcuIEcuICgxOTc3KS4gVGhlIG1lYXN1cmVtZW50IG9mIG9ic2VydmVyIGFncmVlbWVudCBmb3IgY2F0ZWdvcmljYWwgZGF0YS4gYmlvbWV0cmljcywgMTU5LTE3NC4NCg0KTHUsIEQuLCAmIFdlbmcsIFEuICgyMDA3KS4gQSBzdXJ2ZXkgb2YgaW1hZ2UgY2xhc3NpZmljYXRpb24gbWV0aG9kcyBhbmQgdGVjaG5pcXVlcyBmb3IgaW1wcm92aW5nIGNsYXNzaWZpY2F0aW9uIHBlcmZvcm1hbmNlLiBJbnRlcm5hdGlvbmFsIGpvdXJuYWwgb2YgUmVtb3RlIHNlbnNpbmcsIDI4KDUpLCA4MjMtODcwLg0KDQpNYWxpaywgTS4gUy4sIFNodWtsYSwgSi4gUC4sICYgTWlzaHJhLCBTLiAoMjAxOSkuIFJlbGF0aW9uc2hpcCBvZiBMU1QsIE5EQkkgYW5kIE5EVkkgdXNpbmcgTGFuZHNhdC04IGRhdGEgaW4gS2FuZGFpaGltbWF0IFdhdGVyc2hlZCwgSG9zaGFuZ2FiYWQsIEluZGlhLg0KDQpNY0ZlZXRlcnMsIFMuIEsuICgxOTk2KS4gVGhlIHVzZSBvZiB0aGUgTm9ybWFsaXplZCBEaWZmZXJlbmNlIFdhdGVyIEluZGV4IChORFdJKSBpbiB0aGUgZGVsaW5lYXRpb24gb2Ygb3BlbiB3YXRlciBmZWF0dXJlcy4gSW50ZXJuYXRpb25hbCBqb3VybmFsIG9mIHJlbW90ZSBzZW5zaW5nLCAxNyg3KSwgMTQyNS0xNDMyLiANCg0KUGF0dGFuYXlhaywgUy4gUC4sICYgRGl3YWthciwgUy4gSy4gKDIwMTgpLiBTZWFzb25hbCBDb21wYXJhdGl2ZSBTdHVkeSBvZiBORFZJLCBOREJJIGFuZCBORFdJIG9mIEh5ZGVyYWJhZCBDaXR5IChUZWxhbmdhbmEpIEJhc2VkIG9uIExJU1MtSUlJIEltYWdlIFVzaW5nIFJlbW90ZSBTZW5zaW5nIGFuZCBESVAuIEtob2o6IEFuIEludGVybmF0aW9uYWwgUGVlciBSZXZpZXdlZCBKb3VybmFsIG9mIEdlb2dyYXBoeSwgNSgxKSwgNzgtODYuDQoNClJlaXMsIEkuLCBCYXJvbiwgRC4sICYgU2hhaGFmLCBTLiAoMjAxOCkuIFByb2JhYmlsaXN0aWMgUmFuZG9tIEZvcmVzdC4NCg0KU2VyYmluLCBHLiwgRGF1Z2h0cnksIEMuIFMuLCBIdW50LCBFLiBSLiwgQnJvd24sIEQuIEouLCAmIE1jQ2FydHksIEcuIFcuICgyMDA5KS4gRWZmZWN0IG9mIHNvaWwgc3BlY3RyYWwgcHJvcGVydGllcyBvbiByZW1vdGUgc2Vuc2luZyBvZiBjcm9wIHJlc2lkdWUgY292ZXIuIFNvaWwgU2NpZW5jZSBTb2NpZXR5IG9mIEFtZXJpY2EgSm91cm5hbCwgNzMoNSksIDE1NDUtMTU1OC4NCg0KWW91bmcsIE4uIEUuLCBBbmRlcnNvbiwgUi4gUy4sIENoaWduZWxsLCBTLiBNLiwgVm9yc3RlciwgQS4gRy4sIExhd3JlbmNlLCBSLiwgJiBFdmFuZ2VsaXN0YSwgUC4gSC4gKDIwMTcpLiBBIHN1cnZpdmFsIGd1aWRlIHRvIExhbmRzYXQgcHJlcHJvY2Vzc2luZy4gRWNvbG9neSwgOTgoNCksIDkyMC05MzIuDQoNClpoYW5nLCBZLiwgR3VvLCBMLiwgQ2hlbiwgWS4sIFNoaSwgVC4sIEx1bywgTS4sIEp1LCBRLiwgLi4uICYgV2FuZywgUy4gKDIwMTkpLiBQcmVkaWN0aW9uIG9mIFNvaWwgT3JnYW5pYyBDYXJib24gYmFzZWQgb24gTGFuZHNhdCA4IE1vbnRobHkgTkRWSSBEYXRhIGZvciB0aGUgSmlhbmdoYW4gUGxhaW4gaW4gSHViZWkgUHJvdmluY2UsIENoaW5hLiBSZW1vdGUgU2Vuc2luZywgMTEoMTQpLCAxNjgzLg0K