Introducción
¿Qué son los SEM?
Los modelos de ecuaciones estructurales (SEM, Structural Equation Models) permiten analizar simultáneamente múltiples relaciones entre variables.
Combinan elementos de la regresión múltiple y del análisis factorial para estudiar variables observadas y latentes.
Permiten incorporar errores de medición dentro del modelo.
Facilitan la estimación de efectos directos, indirectos y mediadores.
Se utilizan para contrastar modelos teóricos mediante datos empíricos.
Definición resumida.
Los modelos de ecuaciones estructurales (SEM) son técnicas estadísticas que combinan regresión y análisis factorial para estudiar relaciones complejas entre variables observadas y latentes, permitiendo evaluar modelos teóricos mediante datos empíricos.
¿Para qué sirven los SEM?
Evaluar teorías que involucran múltiples relaciones entre variables.
Analizar efectos directos, indirectos y de mediación.
Estudiar constructos latentes a partir de indicadores observables.
Determinar qué tan bien un modelo teórico se ajusta a los datos.
Breve historia de los SEM
Los antecedentes de los modelos de ecuaciones estructurales (SEM) se encuentran en el análisis de trayectoria (path analysis) desarrollado por Sewall Wright para estudiar relaciones causales entre variables.
Durante las décadas de 1960 y 1970, estas ideas fueron ampliadas para analizar fenómenos complejos en las ciencias sociales y del comportamiento.
En la década de 1970, Karl Jöreskog desarrolló LISREL (Linear Structural Relations), considerado el primer sistema general para los SEM modernos.
Desde entonces, los SEM han evolucionado incorporando variables latentes, datos longitudinales, modelos multinivel, variables categóricas y métodos de estimación más robustos.
Actualmente, los SEM constituyen una de las metodologías más utilizadas para evaluar teorías y estudiar relaciones complejas entre variables observadas y latentes.
Software para SEM
Actualmente existen numerosos programas para estimar modelos SEM. Entre los más utilizados se encuentran:
lavaan (R): gratuito, flexible y ampliamente utilizado en investigación académica.
Mplus: uno de los programas más completos para modelos avanzados.
AMOS: popular por su interfaz gráfica y facilidad de uso.
Stata: incorpora procedimientos para SEM y modelos generalizados.
OpenMx (R): orientado a aplicaciones avanzadas y modelos especializados.
Hoy en día, los programas más utilizados para la enseñanza y la investigación en SEM son los tres primeros. Entre ellos, lavaan se ha convertido en una de las opciones más populares debido a que es gratuito, reproducible y está integrado con el ecosistema de análisis estadístico de R.
Relación causal y no causal
En SEM es importante distinguir entre una relación causal y una relación no causal.
Una relación causal representa una hipótesis teórica según la cual una variable puede influir sobre otra. Se representa mediante una flecha unidireccional.
Una relación no causal representa únicamente una asociación o covariación entre variables, sin asumir una dirección de influencia. Se representa mediante una flecha bidireccional.
Es importante destacar que los SEM no demuestran causalidad; únicamente permiten evaluar si una hipótesis causal propuesta por la teoría es compatible con los datos observados.
Ejemplo de relación causal
Supóngase que la teoría plantea que un mayor nivel de educación puede influir positivamente en el salario.
Nivel de educación ─────► Salario
La flecha representa una hipótesis de influencia teórica desde la educación hacia el salario.
En este caso se propone una dirección específica de influencia:
\[
\text{Educación} \rightarrow \text{Salario}
\]
Sin embargo, el modelo SEM no demuestra que dicha causalidad exista; únicamente evalúa si esta hipótesis es consistente con los datos observados.
Ejemplo de relación no causal
Supóngase que se observa una asociación entre ansiedad y depresión, pero no se desea establecer una dirección de influencia entre ambas variables.
Ansiedad ◄────► Depresión
En este caso solamente se indica que ambas variables están relacionadas o covarían entre sí.
La relación puede expresarse como:
\[
Cov(\text{Ansiedad},\text{Depresión}) \neq 0
\]
sin asumir que una variable sea causa de la otra.
Diferencia fundamental
Table 2.1: Table 2.2: Diferencias entre relaciones causales y no causales en SEM
|
Relación.causal
|
Relación.no.causal
|
|
Representa una hipótesis de influencia
|
Representa una asociación o covariación
|
|
Flecha unidireccional (→)
|
Flecha bidireccional (↔︎)
|
|
Implica una dirección teórica
|
No implica dirección
|
|
Requiere sustento teórico
|
Indica únicamente relación estadística
|
Idea clave
En SEM, una flecha simple (\(\rightarrow\)) representa una hipótesis causal propuesta por la teoría, mientras que una flecha doble (\(\leftrightarrow\)) representa una asociación o covariación sin dirección causal explícita.
Tipos de variables en SEM
Introducción
En SEM, las variables pueden clasificarse desde diferentes perspectivas. Algunas clasificaciones describen la naturaleza de la variable, otras su posición dentro del modelo y otras su función dentro de las relaciones entre variables.
Por esta razón, una misma variable puede pertenecer simultáneamente a varias categorías. Por ejemplo, una variable puede ser latente, endógena y mediadora al mismo tiempo.
Clasificación 1: Variables manifiestas y latentes
Esta clasificación responde a la pregunta:
¿La variable puede observarse directamente?**
Variables manifiestas (observadas o indicadoras).
Son variables que pueden medirse directamente.
Generalmente corresponden a:
- Ítems de cuestionarios.
- Preguntas de encuestas.
- Mediciones físicas.
- Registros administrativos.
Ejemplos.
- Edad.
- Ingreso.
- Peso.
- Ítem: “Me siento satisfecho con mi trabajo”.
En los diagramas SEM suelen representarse mediante rectángulos.
[Edad]
[Ingreso]
[Ítem 1]
Variables latentes (no observadas).
Son constructos teóricos que no pueden observarse directamente.
Su medición se realiza mediante una o varias variables observadas.
Ejemplos.
Inteligencia.
Ansiedad.
Liderazgo.
Motivación.
Satisfacción laboral.
En los diagramas SEM suelen representarse mediante óvalos.
(Satisfacción)
│
┌───────┼───────┐
▼ ▼ ▼
[Item1] [Item2] [Item3]
Clasificación 2: Variables exógenas y endógenas
Esta clasificación responde a la pregunta:
¿La variable recibe flechas dentro del modelo?
Variables exógenas.
Son variables que explican otras variables del modelo, pero no son explicadas por ninguna otra variable.
Son análogas a las variables independientes en regresión.
Ejemplo.
Educación ───► Salario
La variable:
Educación
es exógena porque no recibe flechas.
Variables endógenas.
Son variables explicadas por otras variables dentro del modelo.
Son análogas a las variables dependientes en regresión.
Ejemplo.
Educación ───► Salario
La variable:
Salario
es endógena porque recibe una flecha.
Toda variable endógena debe estar asociada a un término de error o perturbación.
Variables de error
Los términos de error representan la parte de una variable que no es explicada por el modelo.
Existen dos tipos principales.
Error de medición.
Aparece asociado a variables observadas.
e1 ─► X1
e2 ─► X2
e3 ─► X3
Representa:
Error estructural (perturbación).
Aparece asociado a variables latentes endógenas.
F1 ─► F2
▲
│
d1
Representa la parte de la variable latente que no es explicada por las variables antecedentes.
Idea clave
Las clasificaciones anteriores describen aspectos diferentes de una misma variable:
Latente/manifiesta describe su naturaleza.
Exógena/endógena describe su posición dentro del modelo.
Mediadora/moderadora describe su función dentro de las relaciones entre variables.
Error representa variabilidad no explicada.
Por ello, una misma variable puede pertenecer simultáneamente a varias categorías.
Por ejemplo:
Motivación ─► Persistencia ─► Rendimiento
La variable:
Persistencia
puede ser simultáneamente:
Latente.
Endógena.
Mediadora.
Tipos de variables en un diagrama SEM
La figura siguiente resume los principales tipos de variables en un modelo SEM. El objetivo no es interpretar estimaciones numéricas, sino identificar el papel que cumple cada elemento dentro del modelo.
Table 5.1: Identificación de los tipos de variables en el diagrama SEM conceptual
|
Elemento.en.la.figura
|
Tipo.de.variable
|
Descripción
|
|
x1, x2, x3, y1, y2, z1, z2
|
Manifiestas (observadas)
|
Indicadores observados
|
|
F1, F2, F3
|
Latentes
|
Constructos no observados
|
|
Errores en x1, x2, x3, y1, y2, z1, z2
|
Errores de medición
|
Parte no explicada del indicador
|
|
Error en F2 y F3
|
Error estructural
|
Residuo de variables latentes endógenas
|
|
F1
|
Exógena
|
No recibe flechas; no es explicada por otras variables
|
|
F2, F3
|
Endógenas
|
Reciben flechas; son explicadas por otras variables
|
|
F2
|
Mediadora
|
Transmite el efecto indirecto: F1 → F2 → F3
|
|
school
|
Agrupación / moderadora
|
Define subpoblaciones; no necesariamente aparece como nodo
|
Interpretación del diagrama
En este diagrama:
F1, F2 y F3 son variables latentes, mientras que x1, x2, x3, y1, y2, z1 y z2 son variables manifiestas o indicadores observados.
La variable F1 es exógena porque no recibe flechas de otras variables latentes. En cambio, F2 y F3 son endógenas porque reciben flechas dentro del modelo.
Además, F2 cumple el papel de variable mediadora, porque transmite parte del efecto de F1 sobre F3:
\[
F1 \rightarrow F2 \rightarrow F3
\]
Los errores asociados a los indicadores representan errores de medición, mientras que los errores asociados a F2 y F3 representan perturbaciones o errores estructurales.
Finalmente, una variable como school puede utilizarse como variable de agrupación o moderadora para comparar el modelo entre diferentes subpoblaciones.
Resumen general
Table 6.1: Resumen de los principales tipos de variables en SEM
|
Tipo
|
¿X se observa directamente?
|
¿X recibe influencia de otra variable?
|
Papel dentro del modelo
|
|
Manifiesta
|
Sí
|
Puede o no
|
Variable observada
|
|
Latente
|
No
|
Puede o no
|
Constructo teórico
|
|
Exógena
|
Puede o no
|
No
|
Explica otras variables
|
|
Endógena
|
Puede o no
|
Sí
|
Es explicada por otras variables
|
|
Mediadora
|
Puede o no
|
Sí
|
Transmite un efecto
|
|
Moderadora
|
Puede o no
|
Generalmente no
|
Modifica una relación
|
|
Error de medición
|
No
|
Sí
|
Error asociado a un indicador
|
|
Error estructural
|
No
|
Sí
|
Error asociado a una variable latente
|
Escala de las variables latentes
¿Por qué debemos fijar una escala?
Considere la siguiente variable latente:
Inteligencia
│
┌─────┼─────┐
▼ ▼ ▼
I1 I2 I3
donde:
La variable latente Inteligencia no puede observarse directamente.
A diferencia de variables como:
Edad (años),
Peso (kg),
Distancia (metros),
la inteligencia no posee unidades de medida naturales.
Por esta razón, el modelo necesita una referencia para definir la escala del factor latente. En otras palabras:
Antes de estimar el modelo debemos decidir cuál será la unidad de medida de la variable latente.
Analogía intuitiva
Suponga que queremos medir una distancia.
Podemos expresarla en:
metros,
kilómetros,
millas.
La distancia física es exactamente la misma:
- Lo único que cambia es la unidad utilizada para medirla.
Algo similar ocurre con una variable latente:
- La variable latente es la misma, pero debemos decidir en qué “unidades” la vamos a medir.
Los métodos de escalamiento son simplemente diferentes maneras de definir esa unidad de medida.
Modelo conceptual base
Para ilustrar los distintos métodos utilizaremos el siguiente modelo:
Inteligencia
│
┌─────┼─────┐
▼ ▼ ▼
I1 I2 I3
donde:
Es importante destacar que:
- Los tres métodos producen esencialmente el mismo modelo teórico y el mismo ajuste global. Lo único que cambia es la forma en que se define la unidad de medida de la variable latente.
Métodos para definir la escala de una variable latente
Existen tres métodos comunes para establecer la escala de una variable latente:
Variable latente estandarizada.
Variable marcador.
Codificación de efectos.
Escala: variable latente estandarizada
La idea consiste en fijar la varianza de la variable latente en 1.
\[
Var(\eta)=1
\]
Por ejemplo:
\[
Var(\text{Inteligencia})=1
\]
Interpretación
En este caso:
Media = 0
Varianza = 1
Desviación estándar = 1
Ejemplo
Si una persona obtiene:
\[
\eta = 2
\]
significa que se encuentra aproximadamente dos desviaciones estándar por encima del promedio en inteligencia.
Escala: variable marcador
La idea consiste en seleccionar un indicador y fijar su carga factorial en 1. Por ejemplo, \(\lambda_1 = 1\) en:
Inteligencia
│
┌─────┼─────┐
▼ ▼ ▼
I1 I2 I3
Interpretación
Estamos diciendo que la escala de la variable latente será la misma que la escala del indicador elegido como referencia.
En este caso:
I1
actúa como variable marcador.
Ejemplo intuitivo
Suponga que:
I1 = Puntaje de razonamiento lógico (0 a 100)
I2 = Comprensión verbal (0 a 50)
I3 = Memoria (0 a 30)
Si fijamos:
\[
\lambda_1 = 1
\]
entonces:
La inteligencia queda medida aproximadamente en la misma escala que I1.
Es decir, I1 se convierte en la referencia para medir la inteligencia.
Analogía
Si queremos medir una distancia podemos escoger:
Metros
Kilómetros
Millas
Todas representan la misma distancia.
Aquí ocurre algo similar:
Inteligencia
se mide usando como referencia el indicador I1.
Desventajas
- Los resultados dependen parcialmente del indicador elegido como referencia.
Escala: codificación de efectos
La idea consiste en fijar el promedio de las cargas factoriales en 1.
Por ejemplo:
\[
\lambda_1+\lambda_2+\lambda_3=3
\]
o equivalentemente:
\[
\frac{\lambda_1+\lambda_2+\lambda_3}{3}=1
\]
Ejemplo
Suponga:
\[
\lambda_1 = 0.8
\]
\[
\lambda_2 = 1.1
\]
\[
\lambda_3 = 1.1
\]
Entonces:
\[
\frac{0.8+1.1+1.1}{3}=1
\]
Analogía
Variable marcador:
La escala depende de I1
Codificación de efectos:
La escala depende del promedio de I1, I2 e I3
Por esta razón, ningún indicador domina completamente la definición de la escala.
Comparación de los métodos de escala
Table 12.1: Comparación de los principales métodos para definir la escala de una variable latente
|
Método
|
Restricción
|
Unidad
|
Interpretación
|
|
Latente estandarizada
|
Var(η) = 1
|
Desviaciones estándar
|
El factor se expresa en unidades estandarizadas
|
|
Variable marcador
|
λ₁ = 1
|
Indicador de referencia
|
El factor adopta la escala del indicador marcador
|
|
Codificación de efectos
|
Promedio(λ) = 1
|
Promedio de los indicadores
|
El factor adopta una escala promedio de los indicadores
|
Resumen
Table 13.1: Comparación de los principales métodos para definir la escala de una variable latente
|
Método
|
Restricción
|
Unidad
|
Interpretación
|
|
Latente estandarizada
|
Var(η) = 1
|
Desviaciones estándar
|
Escala en desviaciones estándar
|
|
Variable marcador
|
λ₁ = 1
|
Indicador de referencia
|
La escala depende de un indicador de referencia
|
|
Codificación de efectos
|
Promedio de cargas = 1
|
Promedio de indicadores
|
La escala depende del promedio de los indicadores
|
Tipos de relaciones entre variables
En un SEM, se pueden definir varios tipos de relaciones entre variables. A continuación se describen estos tipos de relaciones.
Covariación
Se refiere a la relación entre dos variables que varían juntas, pero sin implicar causalidad. Indica que cuando una variable cambia, la otra también lo hace, pero no necesariamente porque una cause a la otra.
Ejemplo.
La relación entre la cantidad de helados vendidos y el número de personas que van a la playa. Estas dos variables covarían porque ambas aumentan durante el verano, pero una no causa directamente a la otra. Véase la figura 14.1.
Causalidad
En SEM, una relación causal representa una hipótesis teórica de influencia entre dos variables. Esta hipótesis propone que una variable puede influir sobre otra y se representa mediante una flecha unidireccional.
Es importante aclarar que una flecha en un diagrama SEM no demuestra causalidad. La flecha solo indica que el investigador propone una dirección de influencia con base en la teoría.
Ejemplo.
La teoría económica sugiere que un mayor nivel de educación puede favorecer mejores oportunidades laborales y, en consecuencia, mayores salarios. Esta hipótesis puede representarse mediante una relación direccional entre educación y salario. Véase la figura 14.2.
En la figura, la flecha indica que el nivel de educación se propone como una posible variable explicativa del salario.
Por tanto, la interpretación correcta no es:
"La educación causa el salario."
sino:
"Según la teoría, se propone que el nivel de educación puede influir sobre el salario."
El SEM permite evaluar si esta hipótesis es compatible con los datos observados, pero no prueba causalidad por sí mismo.
Relación espuria
Se da cuando dos variables parecen estar relacionadas, pero esta relación es causada por una tercera variable que afecta a ambas. La relación entre las dos variables no es directa sino que es mediada por esta tercera variable.
Ejemplo.
El tamaño del pie y la habilidad para leer en niños. Aunque pueden parecer relacionados, ambos están influenciados por la edad del niño, que es la verdadera causa subyacente de la relación. Véase la figura 14.3.
Causalidad directa
Ocurre cuando una variable directamente afecta a otra sin la intervención de otras variables. En el diagrama de SEM, esto se representa con una flecha que va directamente de la variable causa a la variable efecto.
Ejemplo.
El tenre un empleo (variable independiente) incrementa los ingresos (variable dependiente). Véase la figura 14.4.
Causalidad indirecta
Se refiere a una situación en la que una variable afecta a otra a través de una o más variables intermedias (mediadoras). En un diagrama SEM, esto se muestra como una cadena de flechas que pasan por una o más variables mediadoras antes de llegar a la variable objetivo.
Ejemplo.
La educación afecta los ingresos a través del empleo. La educación (variable independiente) aumenta la probabilidad de obtener un empleo (variable mediadora), lo cual a su vez incrementa los ingresos (variable dependiente). Véase la figura 14.5.
Causalidad recíproca
Se presenta cuando dos variables se afectan mutuamente. Cada variable es a la vez causa y efecto de la otra. En un diagrama SEM, esto se representa con flechas bidireccionales entre las dos variables.
Ejemplo.
Estrés y problemas de salud. El estrés puede causar problemas de salud, y a su vez, los problemas de salud pueden aumentar el nivel de estrés. Esta relación es bidireccional. Véase la figura 14.6.
Diagramas estructurales
Como ejemplo, véase la figura 14.7.
Observaciones.
Los efectos directos se indican con flechas rechas.
El final de la flecha es la variable dependiente.
Las estimaciones delos parámetros siempre aparecen sobre la flecha correspondiente.
Cualquier variable que sea influenciada por otra variable del modelo debe tener un término de error.
Algunos programas también suelen mostrar:
Junto a cada variable, su varianza.
En el caso de las variables dependientes, la proporción de varianza explicada correspondiente.
Componentes de un SEM
Tipos
Son dos: Modelo de medida y modelo estructural. Más adelante, se explica cada uno de ellos.
Al sustituir en el modelo de medida las relaciones de covarianza por las relaciones causales de la parte estructural, se obtiene el modelo estructural completo, también denominado modelo de regresión estructural.
Modelo de medida
Compuesto por las relaciones entre las variables indicadoras del modelo y sus constructos latentes.
Así como por las relaciones de covarianza entre las variables latentes.
Cada constructo latente y sus indicadores forman una parte del modelo de medida.
También conocido como instrumento de medida y es el modelo propuesto para “medir” las variables latentes.
Este modelo corresponde a un análisis factorial confirmatorio,en el que cada variable latente se asocia con un grupo de variables observadas, y además se permite que las variables latentes estén correlacionadas entre sí.
Véase la figura 15.1.
Modelo estructural
Se refiere a las interrelaciones causales propuestas entre las variables latentes del modelo.
Es la parte del modelo que emplea el análisis de caminos (path analysis), pero con variables alatentes.
Es similar a un análisis de regresión.
Véase la figura 15.2.
Modelo estructural completo
Véase la figura 15.3.
Otros tipos de modelos
Modelo factorial exploratorio vs confirmatorio
El modelo de variables latentes (LVM) crea las variables latentes (LVs) empleadas en el modelo estructural.
Cuando un LVM se examina sin un modelo estructural, se conoce ocasionalmente como análisis factorial confirmatorio (CFA).
Si no se tuviera una estructura hipotética para el modelo de variables latentes, se trataría de un análisis factorial exploratorio (EFA).
Véase la figura 16.1.
Modelos de segundo orden
Véase la figura 16.3.
Procedimiento para ejecutar un SEM
Etapa 1: Validación del modelo de medida
Implica realizar un Análisis factorial Confirmatorio (AFC), proponiendo los indicadores de cada variable latente y
evaluando en forma conjunta la bondad de ajuste de los instrumentos de medida empleados para cada factor.
Significa reemplazar los efectos directos e indirectos del componente estructural propuestos según la teoría por relaciones de covarianza entre las variables latentes.
Si el ajuste es rechazado se aplican herramientas de reespecificación.
Etapa 2: Ajuste del modelo completo de ecuaciones estructurales
Es el ajuste del SEM incorporando las modificaciones de la etapa anterior.
Incluye la comparación con otros modelos alternativos que difieran en la parte estructural, si los hubiera, utilizando para esto contrastes de comparación de modelos.
Pasos en cada una de las etapas
Son los siguientes (cada uno se explicará más adelante):
Especificación.
Identificación.
Evaluación de la calidad de la base de datos.
Estimación de parámetros.
Evaluación de la bondad de ajuste.
Re-especificación del modelo.
Véase la figura 18.1.
Especificación
El modelo se define con base en los conocimientos teóricos y antecedentes empíricos del tema estudiado.
Se deben incluir únicamente las variables esenciales que cuenten con un fuerte respaldo teórico y empírico.
Es crucial determinar las relaciones entre variables latentes e indicadoras, asumiendo que cualquier relación no especificada no existe.
Es recomendable realizar un análisis factorial exploratorio (AFE) previo para validar o revalidar las escalas utilizadas en la medición de cada variable latente.
Según la regla de Kenny (1979), el número de factores por factor debe ser: mínimo 2, 3 es bueno, 4 es óptimo, y 5 o más es excesivo, pero no se deben exceder los 20 factores para todo el SEM.
En esta etapa se determina qué parámetros serán estimados y cuáles se mantendrán constantes.
Además, se asume la forma de la distribución conjunta, usualmente una normalidad multivariada.
Lo más común es diseñar el modelo utilizando un diagrama estructural.
A partir de este gráfico, el software genera las ecuaciones del modelo automáticamente.
La interfaz gráfica también permite añadir directamente en el diagrama las restricciones que se imponen habitualmente sobre los parámetros para los siguientes pasos del análisis.
Identificación
Identificación (definición)
Un modelo está identificado cuando todos y cada uno de sus parámetros pueden ser estimados de manera única a partir de la matriz de varianzas y covarianzas muestrales.
Identificación (condiciones)
Se deben cumplir las siguientes condiciones necesarias para la identificación:
Condición 1.
Si tenemos \(K\) variables observables, entonces, la cantidad de datos \(p\) (es decir, la cantidad de varianzas y covarianzas muestrales) debe ser suficiente para estimar el número de parámetros (\(q\)) del modelo. Esta es la regla clásica de conteo según la cual los grados de libertad deben ser mayores o iguales a cero:
\[\text{Grados de libertad} \;=\; p - q \;=\; \frac{K(K + 1)}{2} - q \; \geq \; 0\]
Condición 2.
Debe definirse la escala de los errores (véase la figura 20.1):
- Los coeficientes de sus efectos directos sobre las indicadoras y las latentes endógenas se fijan en 1.
Condición 3.
También debe definierse la escala de los factores latentes. Las opciones habituales son fijar en 1 (véase la figura 20.1):
La carga factorial asociada a una de las variables observadas (de referencia) de cada latente o
La varianza de las variables latentes exógenas.
Identificación (observaciones)
Que se haya identificado completamente el modelo de ecuaciones estructurales (SEM) no asegura que el modelo de medida también lo esté.
Para los modelos de medida basados en análisis factorial confirmatorio (AFC) convencionales, donde cada indicador se asocia únicamente a un factor y los errores de medición no están correlacionados, es necesario cumplir con las siguientes reglas que se describen en la sección siguiente:
Identificación (Regla de los tres indicadores)
Si el modelo tiene una sola variable latente, debe incluir al menos tres indicadores (véase la figura 20.2).
Identificación (Regla de los dos indicadores)
Si el modelo incluye dos o más variables latentes, cada una de ellas debe tener al menos dos indicadores (véase la figura 20.3).
Evaluación de la calidad de la base de datos
En las siguientes secciones se van a proponer recomendaciones con respecto a los siguientes puntos:
Tamaño de la muestra.
Multicolinealidad.
Valores extremos univariados y multivariados.
4.Normalidad multivariada.
Tamaño de la muestra
Se recomienda tener:
Al menos 200 observaciones.
Al menos 10 observaciones por cada variable observada.
Multicolinealidad
Una colinealidad bivariada extrema (\(r > 0.85\)) y multivariada puede indicar la presencia de variables redundantes y que la matriz de correlación no sea definida positiva.
Es importante examinar los coeficientes de correlación, así como el determinante y los autovalores de la matriz de correlación.
Valores extremos univariados y multivariados
Se deben eliminar observaciones cuyos valores se desvíen más de 3 desviaciones estándar de la media.
En el caso de valores extremos multivariados, se deben calcular las distancias de Mahalanobis y descartar las observaciones con distancias significativas al 1%.
Normalidad multivariada
Se deben examinar los coeficientes de asimetría y curtosis para evaluar la normalidad univariada.
Se consideran normales las variables cuyos coeficientes en valor absoluto sean menores a 3 y 10 respectivamente.
Es importante aplicar pruebas de normalidad univariada (como la prueba conjunta de asimetría y curtosis) y algún test de normalidad multivariada (como el de Mardia). Lo más relevante es que se cumpla la curtosis multivariada.
Normalidad multivariada: comentario
Si la distribución no es normal pero presenta mesocurtosis, las propiedades de los estimadores de máxima verosimilitud son equivalentes a las que se tienen bajo la hipótesis de normalidad.
Sin embargo, si la curtosis difiere significativamente de la normal, estos estimadores son consistentes pero no eficientes asintóticamente.
Lo anterior puede generar dificultades en las pruebas de significación individual de los parámetros y en la prueba de validez global del modelo.
Estimación de parámetros
Objetivos
En los modelos de ecuaciones estructurales (SEM), el objetivo es ajustar las covarianzas entre las variables.
En lugar de reducir la diferencia entre los valores pronosticados y los observados a nivel individual, se busca minimizar la discrepancia entre las covarianzas observadas en la muestra y las covarianzas previstas por el modelo estructural.
Por esta razón, estos modelos también se conocen como modelos de estructura de covarianza (Covariance Structure Models).
Hipótesis fundamental
La hipótesis principal sostiene que, si el modelo es preciso, la matriz de varianzas y covarianzas de la población puede ser representada de manera exacta mediante una combinación de los parámetros del modelo.
Expresado en notación:
\[Ho:\; \Sigma \,=\, \Sigma(\theta)\]
- En la expresión anterior, \(\Sigma\) representa la matriz de varianzas y covarianzas de la población entre las variables observadas, y \(\Sigma(\theta)\) es la matriz de varianzas y covarianzas obtenida como una función de los parámetros contenidos en el vector \(\theta\).
Estimación: ejemplo
Consideremos el siguiente modelo de regresión:
\[ y \;=\; \beta x + \varepsilon\]
La matriz de varianzas y covarianzas entre \(X\) y \(Y\) es:
\[\Sigma \;= \; \begin{pmatrix}
V(X)& Cov(X,Y)\\
Cov(X,Y) & V(Y)
\end{pmatrix}\]
Aplicando propiedades de varianza y covarianza (y suponiendo que \(V(\varepsilon)=\sigma^2\)) se puede demostrar que:
\[Cov(X,Y) \;=\; \beta \,V(X), \qquad V(Y) \;=\; \beta^2\, V(X) \;+\; V(\varepsilon)\;=\; \beta^2\, V(X) \;+\; \sigma^2\]
Al reemplazar estas expresiones en la matriz de varianzas y covarianzas poblacional, se puede expresar en términos de los parámetros del modelo, obteniendo así la matriz implícita de varianzas y covarianzas:
\[\Sigma(\theta) \;= \; \begin{pmatrix}
V(X) & \beta \,V(X)\\
\beta \,V(X) & \beta^2\, V(X) \;+\; \sigma^2
\end{pmatrix}, \qquad \theta=(\beta, \sigma^2)^T\]
La estimación de los parámetros se lleva a cabo buscando maximizar la precisión del modelo. Para lograr esto, se intenta reducir al mínimo las diferencias entre las varianzas y covarianzas observadas, \(S\), y las que el modelo reproduce, \(S\big(\widehat{\theta}\big)\)
Estimación: métodos
Algunos métodos de estimación
En los modelos de ecuaciones estructurales (SEM) existen distintos métodos para estimar los parámetros del modelo, los cuales difieren en los supuestos estadísticos que adoptan, en la forma como tratan la matriz de covarianzas y en sus propiedades inferenciales. En las secciones siguientes se presentan y discuten los métodos más utilizados en la práctica aplicada:
Máxima verosimilitud (ML).
Mínimos cuadrados no ponderados (ULS).
Mínimos cuadrados generalizados (GLS).
Mínimos cuadrados ponderados (WLS) o de distribución asintóticamente libre (ADF).
Máxima verosimilitud (ML)
Es el método de estimación más utilizado en SEM y constituye la opción preferida bajo el supuesto de normalidad multivariada, debido a sus propiedades de insesgadez y eficiencia asintótica.
En la práctica, ML es relativamente robusto frente a desviaciones moderadas de la normalidad. Sin embargo, cuando la falta de normalidad es severa, se recomienda el uso de errores estándar robustos (por ejemplo, Quasi-Maximum Likelihood o correcciones tipo Huber–White) o procedimientos de bootstrap.
Mínimos cuadrados no ponderados (ULS)
Es conceptualmente similar al método de Mínimos Cuadrados Ordinarios (OLS) en regresión, en el sentido de que minimiza las discrepancias entre las covarianzas observadas y las reproducidas por el modelo.
No requiere que la matriz de covarianzas muestral sea definida positiva, lo que puede resultar ventajoso en situaciones problemáticas.
Produce estimadores insesgados, aunque generalmente menos eficientes que los obtenidos mediante ML.
Requiere que todas las variables observadas estén medidas en la misma escala.
En la práctica, suele emplearse como método preliminar para obtener valores iniciales que posteriormente se utilizan en la estimación por ML.
Mínimos cuadrados generalizados (GLS)
Al igual que ML, este método opera bajo el supuesto de normalidad multivariada.
A diferencia de ULS, no exige que todas las variables estén en la misma escala, ya que incorpora una matriz de ponderación.
En términos computacionales, suele ser más eficiente que ML y ULS, aunque en la práctica es menos utilizado que ML en aplicaciones estándar.
Mínimos cuadrados ponderados (WLS) o de distribución asintóticamente libre (ADF)
Este método no requiere el supuesto de normalidad multivariada, pero sí demanda un tamaño muestral elevado, típicamente entre 200 y 500 observaciones o más.
Es especialmente adecuado cuando se trabaja con variables ordinales o categóricas, estimadas a partir de matrices de correlaciones policóricas, tetracóricas o poliseriales.
Estimación: función de ajuste
En los modelos de ecuaciones estructurales, la estimación de los parámetros se realiza minimizando una función de ajuste, la cual mide la discrepancia entre la matriz de varianzas y covarianzas observada en la muestra, \(S\), y la matriz de varianzas y covarianzas implícita en el modelo, \(\Sigma(\theta)\).
Cada método de estimación se asocia con una función de ajuste particular, cuya minimización produce los estimadores de los parámetros del modelo.
Máxima verosimilitud (ML)
La función de ajuste de máxima verosimilitud se define como:
\[
F_{ML} \; = \; \log|\Sigma(\theta)| \;+\; \mathrm{tr}\!\left(S\,\Sigma^{-1}(\theta)\right) \;-\; \log|S| \;-\; (p+q),
\]
donde \(S\) es la matriz de covarianzas muestral, \(\Sigma(\theta)\) la matriz implícita del modelo, y \(p\) y \(q\) constantes que dependen del número de variables observadas.
Interpretación.
Este criterio evalúa qué tan probable es observar la matriz \(S\) bajo el supuesto de normalidad multivariada y dado el modelo especificado. Minimizar \(F_{ML}\) equivale a maximizar la verosimilitud del modelo, por lo que este método es el más utilizado cuando se asume normalidad multivariada.
Mínimos cuadrados no ponderados (ULS)
La función de ajuste ULS está dada por:
\[
F_{ULS} \; = \; \frac{1}{2}\,\mathrm{tr}\!\left(\big[S - \Sigma(\theta)\big]^2\right).
\]
Interpretación.
Este método minimiza directamente la suma de los cuadrados de las diferencias entre las covarianzas observadas y las reproducidas por el modelo, otorgando el mismo peso a todas ellas. Es conceptualmente simple y no requiere normalidad multivariada, aunque puede ser menos eficiente que ML.
Mínimos cuadrados generalizados (GLS)
La función de ajuste GLS se define como:
\[
F_{GLS} \; = \; \frac{1}{2}\,\mathrm{tr}\!\left(\left\{\big[S - \Sigma(\theta)\big] W^{-1}\right\}^2\right),
\]
donde \(W\) es una matriz de ponderación, usualmente relacionada con \(\Sigma(\theta)\).
Interpretación.
GLS extiende el método ULS incorporando ponderaciones, de modo que las discrepancias entre covarianzas no contribuyen todas por igual a la función de ajuste. Bajo normalidad multivariada, puede ser más eficiente que ULS, aunque suele ser computacionalmente menos estable que ML.
Mínimos cuadrados ponderados (WLS) o distribución asintóticamente libre (ADF)
La función de ajuste WLS (o ADF) se expresa como:
\[
F_{WLS} \; = \; \frac{1}{2}\,\mathrm{tr}\!\left(\left\{\big[S - \Sigma(\theta)\big] V^{-1}\right\}^2\right),
\]
donde \(V\) es la matriz de varianzas y covarianzas asintóticas de los elementos de \(S\).
Interpretación.
Este método pondera las discrepancias utilizando información sobre la variabilidad de las covarianzas muestrales. No requiere normalidad multivariada y es especialmente apropiado para variables ordinales o categóricas, aunque demanda tamaños muestrales grandes para un desempeño adecuado.
Comentario pedagógico
En todos los casos, el objetivo es el mismo: encontrar el conjunto de parámetros \(\theta\) que haga que la matriz implícita del modelo, \(\Sigma(\theta)\), se aproxime lo mejor posible a la matriz observada \(S\). Las diferencias entre los métodos radican en cómo se miden y ponderan esas discrepancias, no en la lógica general del enfoque.
Resumen de las funciones de ajuste
Véase la figura 25.1.
Estimación con variables observadas ordinales o categóricas
Observaciones generales
Cuando los indicadores asociados a una variable latente son ordinales o categóricos, el supuesto de normalidad multivariada suele verse comprometido. En estas condiciones, el uso del método de Máxima Verosimilitud (ML) no es recomendable en su forma estándar.
En su lugar, se deben emplear métodos de estimación que tengan en cuenta la falta de normalidad, ya sea mediante funciones de ajuste alternativas o a través de correcciones robustas en los errores estándar.
Indicadores en escala Likert o similar
Cuando los indicadores constituyen un conjunto homogéneo de variables medidas en escala Likert (u otras escalas ordinales similares), es posible agrupar los ítems (mediante la suma o el promedio de los puntajes) con el objetivo de aproximar la normalidad y así poder aplicar el método ML.
Este enfoque es válido únicamente bajo el supuesto de unidimensionalidad, es decir, que los indicadores agrupados midan un único constructo latente.
Para evaluar este supuesto, se recomienda realizar previamente un Análisis Factorial Exploratorio (AFE).
La agrupación de indicadores puede realizarse de forma aleatoria o, preferiblemente, atendiendo a criterios de contenido o afinidad conceptual.
Metodología de Muthén (1984) para variables continuas y categóricas (CVM)
En este enfoque, las variables observadas pueden ser de cualquier tipo: dicotómicas, ordinales o continuas.
El método se basa en el uso de una matriz de correlaciones policóricas (o tetracóricas, según corresponda), seguida de la estimación del modelo mediante Mínimos Cuadrados Ponderados (WLS) o el método Asintóticamente Libre de Distribución (ADF).
Esta metodología requiere un tamaño muestral considerable, dado el elevado número de parámetros involucrados en la matriz de ponderación.
Cuando se presentan dificultades asociadas a muestras pequeñas o problemas de convergencia, es posible complementar este enfoque con métodos de estimación robusta, que mejoren la estabilidad de los resultados.
Evaluación del ajuste
Observaciones
Se examina la significancia de los coeficientes, similar a un modelo de regresión, y se revisan las medidas de bondad de ajuste.
Ninguna medida por sí sola proporciona toda la información necesaria para evaluar el modelo, por lo que generalmente se utiliza un conjunto de medidas que se informa simultáneamente.
Tipos de medidas de ajuste
Las medidas de bondad de ajuste en los modelos de ecuaciones estructurales se agrupan, de manera general, en tres categorías principales, cada una de las cuales evalúa un aspecto distinto del desempeño del modelo:
Medidas absolutas. Evalúan directamente el grado de discrepancia entre la matriz de varianzas y covarianzas observada y la reproducida por el modelo, es decir, analizan el tamaño de los residuos sin realizar comparaciones con otros modelos.
Medidas de ajuste comparativo o incremental. Comparan el ajuste del modelo propuesto con el de un modelo de referencia más restrictivo (usualmente el modelo nulo o independiente), permitiendo valorar la mejora relativa del modelo especificado.
Medidas de parsimonia. Evalúan el ajuste del modelo teniendo en cuenta su complejidad, penalizando la inclusión excesiva de parámetros y favoreciendo modelos más simples que expliquen adecuadamente los datos.
Indices de ajuste
- La figura 27.1 resume los principales tipos de medidas de ajuste empleadas en SEM.
El estadístico \(\chi^2\) evalúa la discrepancia global entre la matriz observada y la matriz reproducida por el modelo. Idealmente, este estadístico debería resultar no significativo.
Un valor significativo de \(\chi^2\) indica que el modelo teórico propuesto difiere de manera significativa de la estructura de covarianzas observada en los datos.
En este contexto, la hipótesis nula establece que los residuos del modelo son nulos, es decir, que el modelo reproduce exactamente la matriz de varianzas y covarianzas poblacional.
Re-especificación del modelo
Descripción
Cuando el ajuste del modelo no es satisfactorio, puede ser necesario proceder a su re-especificación, siempre guiada por criterios teóricos y sustantivos.
Para ello, se examinan los índices de modificación, que corresponden a parámetros inicialmente fijados en cero (efectos no incluidos en el modelo).
Cada índice de modificación indica la reducción esperada en el estadístico \(\chi^2\) si el parámetro correspondiente fuera liberado y estimado.
Un valor superior a 3.84 (valor crítico de una \(\chi^2\) con 1 grado de libertad y \(\alpha = 0.05\)) sugiere que la inclusión de dicho parámetro produciría una mejora estadísticamente significativa en el ajuste del modelo.
En consecuencia, un índice de modificación elevado señala que la incorporación del efecto adicional podría mejorar de forma sustantiva el ajuste del modelo a los datos, siempre que exista una justificación teórica para ello.
Nota pedagógica: sobre la re-especificación de modelos
Aunque los índices de modificación constituyen una herramienta útil para diagnosticar fuentes de mal ajuste, no deben utilizarse como un mecanismo automático de corrección del modelo. En particular, es importante que el estudiante tenga en cuenta lo siguiente:
Los índices de modificación se calculan condicionalmente al modelo estimado y a la muestra analizada. Por tanto, reflejan posibles mejoras específicas de los datos y no necesariamente relaciones estructurales reales en la población.
Re-especificar un modelo basándose únicamente en criterios estadísticos puede conducir a sobreajuste (overfitting), es decir, a un modelo que reproduce muy bien los datos observados, pero que tiene escasa capacidad de generalización.
La inclusión indiscriminada de parámetros adicionales suele aumentar artificialmente el ajuste, pero debilita la interpretabilidad y la parsimonia del modelo, dos principios centrales en SEM.
Todo parámetro liberado debe contar con una justificación teórica, sustantiva o metodológica clara (por ejemplo, similitud de contenido entre ítems, efectos de método o fundamentos conceptuales previos).
En la práctica recomendada, los índices de modificación deben utilizarse como herramientas exploratorias, no como reglas de decisión automáticas.
En consecuencia, la re-especificación de un modelo SEM debe entenderse como un proceso iterativo guiado por la teoría, en el que la evidencia empírica complementa (pero no sustituye) al razonamiento conceptual.
Ejercicios
Los siguientes ejercicios tienen como objetivo reforzar la comprensión conceptual de los modelos de ecuaciones estructurales antes de introducir formalmente la notación matricial y los desarrollos algebraicos. En todos los casos, el énfasis debe ponerse en la interpretación, no en la optimización automática del ajuste.
Ejercicio 1. Identificación de tipos de variables
Considere el siguiente escenario:
Un investigador desea estudiar el efecto de la motivación académica sobre el rendimiento estudiantil, considerando además el rol de la autoeficacia como variable intermedia.
La motivación se mide mediante cuatro ítems tipo Likert, la autoeficacia mediante tres ítems y el rendimiento mediante el promedio de calificaciones. El estudio se realiza comparando estudiantes de colegios públicos y privados.
Desarrolle los siguientes incisos:
Identifique todas las variables manifiestas del estudio.
Identifique las variables latentes.
Señale cuáles variables son exógenas, endógenas y *mediadoras**.
Indique explícitamente los términos de error asociados.
Identifique la variable de agrupación y explique su función en un análisis SEM multigrupo.
Ejercicio 2. Lectura conceptual de un diagrama SEM
Considere un diagrama SEM conceptual que contiene:
Dos factores latentes \(F_1\) y \(F_2\).
Tres indicadores para \(F_1\) y dos para \(F_2\)
Una relación estructural \(F_2 \leftarrow F_1\).
Términos de error para todos los indicadores.
Desarrolle los siguientes incisos:
Explique por qué \(F_1\) se clasifica como variable exógena.
Justifique por qué \(F_2\) es una variable endógena.
Indique en qué sentido \(F_2\) puede considerarse una variable mediadora.
Explique por qué los términos de error no deben interpretarse como “ruido irrelevante”.
Ejercicio 3. Escala de la variable latente
Considere un factor latente \(\eta\) medido por tres indicadores \(x_1, x_2, x_3\).
Explique conceptualmente qué significa que el modelo no esté identificado si no se fija la escala de \(\eta\).
Describa cómo se define la escala de \(\eta\) bajo cada uno de los siguientes métodos:
Discuta una ventaja y una desventaja conceptual de cada método.
Ejercicio 4. Interpretación de cargas factoriales
Suponga que en un modelo con variable marcador se fija \(\lambda_1 = 1\) para el indicador \(x_1\), y se estima \(\lambda_2 = 0.75\) para \(x_2\).
Interprete \(\lambda_2 = 0.75\) en términos de unidades de cambio.
Explique por qué esta interpretación depende del indicador marcador elegido.
Discuta qué cambiaría (conceptualmente) si el modelo se estimara usando codificación de efectos.
Ejercicio 5. Métodos de estimación
Para cada uno de los siguientes escenarios, indique qué método de estimación sería más apropiado y justifique su respuesta:
Indicadores continuos aproximadamente normales, tamaño muestral moderado.
Indicadores ordinales tipo Likert con cinco categorías y muestra grande.
Indicadores dicotómicos con fuerte asimetría y curtosis elevada.
Modelo preliminar usado únicamente para obtener valores iniciales.
Ejercicio 6. Evaluación del ajuste del modelo
Suponga que un modelo SEM arroja los siguientes resultados:
Desarrolle los siguientes incisos:
Evalúe el ajuste global del modelo considerando distintos tipos de índices.
Explique por qué un \(\chi^2\) significativo no implica necesariamente un mal modelo.
Discuta el papel del tamaño muestral en la interpretación del ajuste.
Ejercicio 7. Re-especificación responsable del modelo
Un modelo SEM presenta un ajuste insatisfactorio y varios índices de modificación superiores a 10.
Explique por qué no es apropiado liberar automáticamente todos los parámetros sugeridos.
Indique al menos tres criterios no estadísticos que deberían guiar una re-especificación.
Discuta cómo la re-especificación puede afectar la replicabilidad del modelo.
Ejercicio 8. Integrador
Construya un diagrama SEM conceptual que incluya explícitamente los siete tipos de variables discutidos en el capítulo:
Manifiestas.
Latentes.
Errores.
Exógenas.
Endógenas.
Mediadoras.
Variable de agrupación.
Explique brevemente el rol de cada elemento en el diagrama.
LS0tDQp0aXRsZTogIk1PREVMT1MgREUgRUNVQUNJT05FUyBFU1RSVUNUVVJBTEVTIChTRU0pIg0Kc3VidGl0bGU6IDxoMT4qKlRlb3LDrWEqKjwvaDE+DQoNCmF1dGhvcjogDQogIC0gbmFtZSAgICAgICAgICA6ICJEci4gcmVyLiBuYXQuIEh1bWJlcnRvIExMaW7DoXMgU29sYW5vIg0KICAgIGFmZmlsaWF0aW9uICAgOiAiRGVwYXJ0YW1lbnRvIGRlIE1hdGVtw6F0aWNhcyB5IEVzdGFkw61zdGljYSwgVW5pdmVyc2lkYWQgZGVsIE5vcnRlIChCYXJyYW5xdWlsbGEsIENvbG9tYmlhKSINCiAgICAgI2NvcnJlc3BvbmRpbmcgOiB5ZXMgICAgIyBEZWZpbmUgb25seSBvbmUgY29ycmVzcG9uZGluZyBhdXRob3INCiAgICAgI2FkZHJlc3MgICAgICAgOiAiRGVwYXJ0YW1lbnRvIGRlIE1hdGVtw6F0aWNhcyB5IEVzdGFkw61zdGljYSINCiAgICBlbWFpbCAgICAgICAgIDogfA0KICAgICAgaGxsaW5hc0B1bmlub3J0ZS5lZHUuY28NCiAgICAgIA0KICAgICAgW0Jpb2dyYXBoaWNhbCBza2V0Y2hdKGh0dHBzOi8vcnB1YnMuY29tL2hsbGluYXMvQmlvX1NrZXRjaCkNCiAgICAgIA0KICAgICAgYHIgZm9ybWF0KFN5cy50aW1lKCksICIlZC8lbS8leSIpYCANCiAgICAgIA0KICAgICAjcm9sZTogICAgICAgICAjIENvbnRyaWJ1dG9yc2hpcCByb2xlcyAoZS5nLiwgQ1JlZGlULCBodHRwczovL2Nhc3JhaS5vcmcvY3JlZGl0LykNCiAgIyAgICAtIENvbmNlcHR1YWxpemF0aW9uDQogICMgICAgLSBXcml0aW5nIC0gT3JpZ2luYWwgRHJhZnQgUHJlcGFyYXRpb24NCiAgIyAgICAtIFdyaXRpbmcgLSBSZXZpZXcgJiBFZGl0aW5nDQogIyAtIG5hbWUgICAgICAgICAgOiAiQXV0b3IgbnVtZXJvIDIiDQogIyAgIGFmZmlsaWF0aW9uICAgOiAiMSwyIg0KICMgICByb2xlOg0KICMgICAgIC0gV3JpdGluZyAtIFJldmlldyAmIEVkaXRpbmcNCiAgICAgI2FmZmlsaWF0aW9uOg0KICAjLSBpZCAgICAgICAgICAgIDogIjEiDQogICMgIGluc3RpdHV0aW9uICAgOiAiVW5pdmVyc2lkYWQgZGVsIE5vcnRlIChCYXJyYW5xdWlsbGEsIENvbG9tYmlhKSINCiAgIyFbXShobGxpbmFzLmpwZyl7d2lkdGg9MWlufSANCiAgDQojZGF0ZTogJ2ByIGZvcm1hdChTeXMudGltZSgpLCAiJWQvJW0vJXkiKWAnICAjIHZlciBodHRwczovL2Jvb2tkb3duLm9yZy95aWh1aS9ybWFya2Rvd24tY29va2Jvb2svdXBkYXRlLWRhdGUuaHRtbA0Kb3V0cHV0OiANCiAgICBib29rZG93bjo6aHRtbF9kb2N1bWVudDI6IA0KICAgICAgICAgICNPSk8gU2FsZW4gY2FwaXR1bG9zLCBzZWNjaW9uZXMgeSBUZW9yZW1hcw0KICAgICNib29rZG93bjo6aHRtbF9ib29rOg0KICAgICAgICAgICNPSk8gRVJST1IgU2FsZW4gdGVvcmVtYXMsIHBlcm8gbm8gc2FsZW4gbG9zIGNhcGl0dWxvcyANCiAgICAjaHRtbF9kb2N1bWVudDoNCiAgICAgICAgICB0b2M6IHRydWUgICAgICAjIHRhYmxlIG9mIGNvbnRlbnQgdHJ1ZQ0KICAgICAgICAgIHRvY19kZXB0aDogNCAgICMgdXB0byB0aHJlZSBkZXB0aHMgb2YgaGVhZGluZ3MgKHNwZWNpZmllZCBieSAjLCAjIyBhbmQgIyMjKQ0KICAgICAgICAgIHRvY19mbG9hdDogdHJ1ZSAjQ29uIHRydWUsIHRvYyBzYWxlIGFsIG1hcmdlbiBpenF1aWVyZG8gZGUgbGEgcMOhZ2luYTsgZGUgbG8gY29udHJhcmlvLCBhcnJpYmENCiAgICAgICAgICBjb2xsYXBzZWQ6IGZhbHNlDQogICAgICAgICAgc21vb3RoX3Njcm9sbDogZmFsc2UNCiAgICAgICAgICBudW1iZXJfc2VjdGlvbnM6IHRydWUgICAjIGlmIHlvdSB3YW50IG51bWJlciBzZWN0aW9ucyBhdCBlYWNoIHRhYmxlIGhlYWRlcg0KICAgICAgICAgICN0aGVtZTogc2FuZHN0b25lDQogICAgICAgICAgI3RoZW1lOiB1bml0ZWQgICMgbWFueSBvcHRpb25zIGZvciB0aGVtZSwgdGhpcyBvbmUgaXMgbXkgZmF2b3JpdGUuDQogICAgICAgICAgI3RoZW1lOiBmbGF0bHkgICMgDQogICAgICAgICAgI3RoZW1lOiBjZXJ1bGVhbiAgIyANCiAgICAgICAgICAjaGlnaGxpZ2h0OiB0YW5nbyAgIyBzcGVjaWZpZXMgdGhlIHN5bnRheCBoaWdobGlnaHRpbmcgc3R5bGUNCiAgICAgICAgICAjY3NzOiBTY3JpcHRzIGFjY2Vzb3Jpb3MvZXN0aWxvYm90b24uY3NzDQogICAgICAgICAgI2NzczogbXkuY3NzICAgIyB5b3UgY2FuIGFkZCB5b3VyIGN1c3RvbSBjc3MsIHNob3VsZCBiZSBpbiBzYW1lIGZvbGRlcg0KICAgICAgICAgIGNvZGVfZG93bmxvYWQ6IHRydWUNCiAgICAgICAgICAjaGlnaGxpZ2h0OiB0YW5nbyAgIyBjYW1iaWFyIGNvbG9yIGRlIGxpYnJhcnkgZW4gYXp1bA0KICAgICMgYm9va2Rvd246OmdpdGJvb2s6DQogICAgIyAgICAgIGluY2x1ZGVzOg0KICAgICMgICAgICAgIGluX2hlYWRlcjogaGVhZGVyLmh0bWwNCiAgICAjIGJvb2tkb3duOjpwZGZfYm9vazoNCiAgICAjICAgICAgIGtlZXBfdGV4OiB5ZXMNCiAgICAjIGJvb2tkb3duOjpodG1sX2Jvb2s6DQogICAgIyAgICAgICBjc3M6IHRvYy5jc3MNCiAgICAjIGJvb2tkb3duOjpodG1sX2Jvb2s6DQogICAgIyAgICAgICAgIGluY2x1ZGVzOg0KICAgICMgICAgICAgICAgIGluX2hlYWRlcjogc3R5bGUuY3NzDQogICAgI2Jvb2tkb3duOjpodG1sX2RvY3VtZW50MjogZGVmYXVsdA0KICAgICMgYm9va2Rvd246OnBkZl9kb2N1bWVudDI6DQogICAgIyAgICAgIGtlZXBfdGV4OiB0cnVlDQogICAgI2JpYmxpb2dyYXBoeTogcmVmZXJlbmNlcy5iaWINCiAgICBtYXRoamF4OiAiaHR0cDovL2V4YW1wbGUuY29tL21hdGhqYXgvTWF0aEpheC5qcz9jb25maWc9VGVYLUFNUy1NTUxfSFRNTG9yTU1MIg0KaGVhZGVyLWluY2x1ZGVzOg0KICAgIFx1c2VwYWNrYWdlW3gxMW5hbWVzXXt4Y29sb3J9IA0KICAgIA0KY3NsOiBzY2llbmNlLmNzbA0KI09qbzogU2UgdXRpbGl6YSBsZW5ndWFqZSBZQU1MDQoNCmFic3RyYWN0OiB8DQogKipFbiBbUnB1YnM6OiB0b2NdKGh0dHBzOi8vcnB1YnMuY29tL2hsbGluYXMvdG9jKSBzZSBwdWVkZW4gdmVyIG90cm9zIGRvY3VtZW50b3MgZGUgcG9zaWJsZSBpbnRlcsOpcy4qKg0KICANCi0tLQ0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSwgZmlnLmFsaWduPSJjZW50ZXIiLCAgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSMsDQogICAgICAgICAgICAgICAgICAgICAgI3N0eWxlID0gImNvbG9yOmRhcmtibHVlIg0KICAgICAgICAgICAgICAgICAgICAjIGNsYXNzLnNvdXJjZT0iYmctZGFuZ2VyIiwgY2xhc3Mub3V0cHV0PSJiZy13YXJuaW5nIiAgICNDb2xvcmVzIGRlbnRybyBkZWwgY2h1bmsNCiAgICAgICAgICAgICAgICAgICAgICkNCmxpYnJhcnkocmdsKQ0Ka25pdHI6OmtuaXRfaG9va3Mkc2V0KHdlYmdsID0gaG9va193ZWJnbCkNCmBgYA0KDQoNCg0KDQpgYGB7ciwgZWNobz1GQUxTRSwgZXZhbD1GQUxTRX0NCmh0dHBzOi8vYm9va2Rvd24ub3JnL3lpaHVpL3JtYXJrZG93bi9sYW5ndWFnZS1lbmdpbmVzLmh0bWwNCg0KaHR0cHM6Ly9ib29rZG93bi5vcmcveWlodWkvYm9va2Rvd24vbWFya2Rvd24tc3ludGF4Lmh0bWwNCg0KaHR0cHM6Ly9ib29rZG93bi5vcmcveWlodWkvYm9va2Rvd24vYS1zaW5nbGUtZG9jdW1lbnQuaHRtbA0KDQpodHRwczovL2Jvb2tkb3duLm9yZy95aWh1aS9ib29rZG93bi9tYXJrZG93bi1leHRlbnNpb25zLWJ5LWJvb2tkb3duLmh0bWwNCg0KaHR0cHM6Ly9ib29rZG93bi5vcmcveWlodWkvcm1hcmtkb3duL2Jvb2tkb3duLW1hcmtkb3duLmh0bWwgICMgVGVvcmVtcyBhbmQgcHJvb2ZzDQoNCmh0dHBzOi8vYm9va2Rvd24ub3JnL3lpaHVpL2Jvb2tkb3duL21hcmtkb3duLWV4dGVuc2lvbnMtYnktYm9va2Rvd24uaHRtbCN0aGVvcmVtcw0KDQpodHRwczovL2Jvb2tkb3duLm9yZy95aWh1aS9ib29rZG93bi9odG1sLmh0bWwNCg0KaHR0cHM6Ly93d3cuZGF0YS10by12aXouY29tLw0KICANCltScHVic10obGluaykNCiAgDQooXCNlcTplYy0pLCAgRWN1YWNpb24gXEByZWYoZXE6ZWMtKSwgRmlndXJhIFxAcmVmKGZpZzpGaWctKSwgVGFibGUgXEByZWYodGFiOm10Y2FycyksIFRoZW9yZW0gXEByZWYodGhtOmJvcmluZykNCg0KIyMjIyBFbCBjw7NkaWdvLiAgey51bmxpc3RlZCAudW5udW1iZXJlZH0gIA0KIyMjIyANCiMgVGl0dWxvIHsjVGl0dWxvU2VjY2lvbn0gICBcQHJlZihUaXR1bG9TZWNjaW9uKQ0KICANCiMgRm9yIEhUTUwsIHdlIGNhbiBzZXQgY29sb3Igd2l0aCBDU1MsIGUuZy4sIDxzcGFuIHN0eWxlPSJjb2xvcjogcmVkOyI+dGV4dDwvc3Bhbj4NCiAgDQojIGh0dHBzOi8vcmFkaWFudC1yc3RhdHMuZ2l0aHViLmlvL2RvY3MvbW9kZWwvbG9naXN0aWMuaHRtbCBTaGlubnkgTG9naXQgIA0KICANCmBgYA0KDQoNCmBgYHtyLCBldmFsPUZBTFNFLCBlY2hvPUZBTFNFfQ0KI0xhIGZvdG8gdGFtYcOxbyBjw6lkdWxhDQoNCmh0bWx0b29sczo6aW1nKHNyYyA9IGtuaXRyOjppbWFnZV91cmkoZmlsZS5wYXRoKFIuaG9tZSgiZG9jIiksICJodG1sIiwgImxvZ28uanBnIikpLCANCiAgICAgICAgICAgICAgIGFsdCA9ICdobGxpbmFzJywgDQogICAgICAgICAgICAgICBzdHlsZSA9ICdwb3NpdGlvbjphYnNvbHV0ZTsgdG9wOjA7IHJpZ2h0OjA7IHBhZGRpbmc6MTBweDsnICMsDQogICAgICAgICAgICAgICB3aWR0aCA9ICIyMDBweCIpICAjIEFxdcOtIGVzcGVjaWZpY2FzIGVsIGFuY2hvIGRlc2VhZG8gZW4gcMOteGVsZXMgbyBwb3JjZW50YWplDQpgYGANCg0KDQoNCg0KYGBge3IsIGVjaG89RkFMU0UsIH0NCiMgTGEgZm90byBncmFuZGUNCg0KaHRtbHRvb2xzOjppbWcoc3JjID0ga25pdHI6OmltYWdlX3VyaSgiaGxsaW5hczIwMjMuanBnIiksIA0KICAgICAgICAgICAgICAgYWx0ID0gJ2hsbGluYXMyMDIzJywgDQogICAgICAgICAgICAgICBzdHlsZSA9ICdwb3NpdGlvbjphYnNvbHV0ZTsgdG9wOjA7IHJpZ2h0OjA7IHBhZGRpbmc6MXB4OycsDQogICAgICAgICAgICAgICB3aWR0aD0iMTUlIikNCmBgYA0KDQoNCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yICAtLT4NCg0KYGBge2NzcywgZWNobz1GQUxTRX0NCi5jb2x1bW5zIHtkaXNwbGF5OiBmbGV4O30NCmgxIHtjb2xvcjogZGFya2JsdWU7fQ0KaDMge2NvbG9yOiBkYXJrZ3JlZW47fQ0KaDQge2NvbG9yOiBncmVlbjt9DQpgYGANCg0KDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUgLS0+DQo8IS0tIENhcMOtdHVsbyAgLS0+DQoNCg0KYGBge2NzcywgZWNobz1GQUxTRSwgZXZhbD1GQUxTRX0NCiNodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy80MTAzMDQ3Ny9jaGFuZ2luZy1jaHVuay1iYWNrZ3JvdW5kLWNvbG9yLWluLXJtYXJrZG93bg0KDQouYmFkQ29kZSB7DQpiYWNrZ3JvdW5kLWNvbG9yOiByZWQ7DQp9DQpgYGANCg0KDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQojIEludHJvZHVjY2nDs24NCg0KIyMjIMK/UXXDqSBzb24gbG9zIFNFTT8NCg0KMS4gTG9zIG1vZGVsb3MgZGUgZWN1YWNpb25lcyBlc3RydWN0dXJhbGVzIChTRU0sICpTdHJ1Y3R1cmFsIEVxdWF0aW9uIE1vZGVscyopIHBlcm1pdGVuIGFuYWxpemFyIHNpbXVsdMOhbmVhbWVudGUgbcO6bHRpcGxlcyByZWxhY2lvbmVzIGVudHJlIHZhcmlhYmxlcy4NCg0KMi4gQ29tYmluYW4gZWxlbWVudG9zIGRlIGxhIHJlZ3Jlc2nDs24gbcO6bHRpcGxlIHkgZGVsIGFuw6FsaXNpcyBmYWN0b3JpYWwgcGFyYSBlc3R1ZGlhciB2YXJpYWJsZXMgb2JzZXJ2YWRhcyB5IGxhdGVudGVzLg0KDQozLiBQZXJtaXRlbiBpbmNvcnBvcmFyIGVycm9yZXMgZGUgbWVkaWNpw7NuIGRlbnRybyBkZWwgbW9kZWxvLg0KDQo0LiBGYWNpbGl0YW4gbGEgZXN0aW1hY2nDs24gZGUgZWZlY3RvcyBkaXJlY3RvcywgaW5kaXJlY3RvcyB5IG1lZGlhZG9yZXMuDQoNCjUuIFNlIHV0aWxpemFuIHBhcmEgY29udHJhc3RhciBtb2RlbG9zIHRlw7NyaWNvcyBtZWRpYW50ZSBkYXRvcyBlbXDDrXJpY29zLg0KDQoqKkRlZmluaWNpw7NuIHJlc3VtaWRhLioqDQoNCiBMb3MgbW9kZWxvcyBkZSBlY3VhY2lvbmVzIGVzdHJ1Y3R1cmFsZXMgKFNFTSkgc29uIHTDqWNuaWNhcyBlc3RhZMOtc3RpY2FzIHF1ZSBjb21iaW5hbiByZWdyZXNpw7NuIHkgYW7DoWxpc2lzIGZhY3RvcmlhbCBwYXJhIGVzdHVkaWFyIHJlbGFjaW9uZXMgY29tcGxlamFzIGVudHJlIHZhcmlhYmxlcyBvYnNlcnZhZGFzIHkgbGF0ZW50ZXMsIHBlcm1pdGllbmRvIGV2YWx1YXIgbW9kZWxvcyB0ZcOzcmljb3MgbWVkaWFudGUgZGF0b3MgZW1ww61yaWNvcy4NCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCiMjIyDCv1BhcmEgcXXDqSBzaXJ2ZW4gbG9zIFNFTT8NCg0KMS4gRXZhbHVhciB0ZW9yw61hcyBxdWUgaW52b2x1Y3JhbiBtw7psdGlwbGVzIHJlbGFjaW9uZXMgZW50cmUgdmFyaWFibGVzLg0KDQoyLiBBbmFsaXphciBlZmVjdG9zIGRpcmVjdG9zLCBpbmRpcmVjdG9zIHkgZGUgbWVkaWFjacOzbi4NCg0KMy4gRXN0dWRpYXIgY29uc3RydWN0b3MgbGF0ZW50ZXMgYSBwYXJ0aXIgZGUgaW5kaWNhZG9yZXMgb2JzZXJ2YWJsZXMuDQoNCjQuIERldGVybWluYXIgcXXDqSB0YW4gYmllbiB1biBtb2RlbG8gdGXDs3JpY28gc2UgYWp1c3RhIGEgbG9zIGRhdG9zLg0KDQoNCg0KDQo8IS0tICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUgLS0+DQo8IS0tIFNlcGFyYWRvciAtLT4NCg0KIyMjIEJyZXZlIGhpc3RvcmlhIGRlIGxvcyBTRU0NCg0KMS4gTG9zIGFudGVjZWRlbnRlcyBkZSBsb3MgbW9kZWxvcyBkZSBlY3VhY2lvbmVzIGVzdHJ1Y3R1cmFsZXMgKFNFTSkgc2UgZW5jdWVudHJhbiBlbiBlbCBhbsOhbGlzaXMgZGUgdHJheWVjdG9yaWEgKCpwYXRoIGFuYWx5c2lzKikgZGVzYXJyb2xsYWRvIHBvciBTZXdhbGwgV3JpZ2h0IHBhcmEgZXN0dWRpYXIgcmVsYWNpb25lcyBjYXVzYWxlcyBlbnRyZSB2YXJpYWJsZXMuDQoNCjIuIER1cmFudGUgbGFzIGTDqWNhZGFzIGRlIDE5NjAgeSAxOTcwLCBlc3RhcyBpZGVhcyBmdWVyb24gYW1wbGlhZGFzIHBhcmEgYW5hbGl6YXIgZmVuw7NtZW5vcyBjb21wbGVqb3MgZW4gbGFzIGNpZW5jaWFzIHNvY2lhbGVzIHkgZGVsIGNvbXBvcnRhbWllbnRvLg0KDQozLiBFbiBsYSBkw6ljYWRhIGRlIDE5NzAsIEthcmwgSsO2cmVza29nIGRlc2Fycm9sbMOzIExJU1JFTCAoKkxpbmVhciBTdHJ1Y3R1cmFsIFJlbGF0aW9ucyopLCBjb25zaWRlcmFkbyBlbCBwcmltZXIgc2lzdGVtYSBnZW5lcmFsIHBhcmEgbG9zIFNFTSBtb2Rlcm5vcy4NCg0KNC4gRGVzZGUgZW50b25jZXMsIGxvcyBTRU0gaGFuIGV2b2x1Y2lvbmFkbyBpbmNvcnBvcmFuZG8gdmFyaWFibGVzIGxhdGVudGVzLCBkYXRvcyBsb25naXR1ZGluYWxlcywgbW9kZWxvcyBtdWx0aW5pdmVsLCB2YXJpYWJsZXMgY2F0ZWfDs3JpY2FzIHkgbcOpdG9kb3MgZGUgZXN0aW1hY2nDs24gbcOhcyByb2J1c3Rvcy4NCg0KNS4gQWN0dWFsbWVudGUsIGxvcyBTRU0gY29uc3RpdHV5ZW4gdW5hIGRlIGxhcyBtZXRvZG9sb2fDrWFzIG3DoXMgdXRpbGl6YWRhcyBwYXJhIGV2YWx1YXIgdGVvcsOtYXMgeSBlc3R1ZGlhciByZWxhY2lvbmVzIGNvbXBsZWphcyBlbnRyZSB2YXJpYWJsZXMgb2JzZXJ2YWRhcyB5IGxhdGVudGVzLg0KDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQojIyMgU29mdHdhcmUgcGFyYSBTRU0NCg0KQWN0dWFsbWVudGUgZXhpc3RlbiBudW1lcm9zb3MgcHJvZ3JhbWFzIHBhcmEgZXN0aW1hciBtb2RlbG9zIFNFTS4gRW50cmUgbG9zIG3DoXMgdXRpbGl6YWRvcyBzZSBlbmN1ZW50cmFuOg0KDQoxLiAqKmxhdmFhbiAoUikqKjogZ3JhdHVpdG8sIGZsZXhpYmxlIHkgYW1wbGlhbWVudGUgdXRpbGl6YWRvIGVuIGludmVzdGlnYWNpw7NuIGFjYWTDqW1pY2EuDQoNCjIuICoqTXBsdXMqKjogdW5vIGRlIGxvcyBwcm9ncmFtYXMgbcOhcyBjb21wbGV0b3MgcGFyYSBtb2RlbG9zIGF2YW56YWRvcy4NCg0KMy4gKipBTU9TKio6IHBvcHVsYXIgcG9yIHN1IGludGVyZmF6IGdyw6FmaWNhIHkgZmFjaWxpZGFkIGRlIHVzby4NCg0KNC4gKipTdGF0YSoqOiBpbmNvcnBvcmEgcHJvY2VkaW1pZW50b3MgcGFyYSBTRU0geSBtb2RlbG9zIGdlbmVyYWxpemFkb3MuDQoNCjUuICoqT3Blbk14IChSKSoqOiBvcmllbnRhZG8gYSBhcGxpY2FjaW9uZXMgYXZhbnphZGFzIHkgbW9kZWxvcyBlc3BlY2lhbGl6YWRvcy4NCg0KDQpIb3kgZW4gZMOtYSwgbG9zIHByb2dyYW1hcyBtw6FzIHV0aWxpemFkb3MgcGFyYSBsYSBlbnNlw7FhbnphIHkgbGEgaW52ZXN0aWdhY2nDs24gZW4gU0VNIHNvbiBsb3MgdHJlcyBwcmltZXJvcy4gRW50cmUgZWxsb3MsICoqbGF2YWFuKiogc2UgaGEgY29udmVydGlkbyBlbiB1bmEgZGUgbGFzIG9wY2lvbmVzIG3DoXMgcG9wdWxhcmVzIGRlYmlkbyBhIHF1ZSBlcyBncmF0dWl0bywgcmVwcm9kdWNpYmxlIHkgZXN0w6EgaW50ZWdyYWRvIGNvbiBlbCBlY29zaXN0ZW1hIGRlIGFuw6FsaXNpcyBlc3RhZMOtc3RpY28gZGUgUi4NCiAgDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQojIFJlbGFjacOzbiBjYXVzYWwgeSBubyBjYXVzYWwNCg0KRW4gU0VNIGVzIGltcG9ydGFudGUgZGlzdGluZ3VpciBlbnRyZSB1bmEgcmVsYWNpw7NuIGNhdXNhbCB5IHVuYSByZWxhY2nDs24gbm8gY2F1c2FsLg0KDQpVbmEgKipyZWxhY2nDs24gY2F1c2FsKiogcmVwcmVzZW50YSB1bmEgaGlww7N0ZXNpcyB0ZcOzcmljYSBzZWfDum4gbGEgY3VhbCB1bmEgdmFyaWFibGUgcHVlZGUgaW5mbHVpciBzb2JyZSBvdHJhLiBTZSByZXByZXNlbnRhIG1lZGlhbnRlIHVuYSBmbGVjaGEgdW5pZGlyZWNjaW9uYWwuDQoNClVuYSAqKnJlbGFjacOzbiBubyBjYXVzYWwqKiByZXByZXNlbnRhIMO6bmljYW1lbnRlIHVuYSBhc29jaWFjacOzbiBvIGNvdmFyaWFjacOzbiBlbnRyZSB2YXJpYWJsZXMsIHNpbiBhc3VtaXIgdW5hIGRpcmVjY2nDs24gZGUgaW5mbHVlbmNpYS4gU2UgcmVwcmVzZW50YSBtZWRpYW50ZSB1bmEgZmxlY2hhIGJpZGlyZWNjaW9uYWwuDQoNCkVzIGltcG9ydGFudGUgZGVzdGFjYXIgcXVlIGxvcyBTRU0gbm8gZGVtdWVzdHJhbiBjYXVzYWxpZGFkOyDDum5pY2FtZW50ZSBwZXJtaXRlbiBldmFsdWFyIHNpIHVuYSBoaXDDs3Rlc2lzIGNhdXNhbCBwcm9wdWVzdGEgcG9yIGxhIHRlb3LDrWEgZXMgY29tcGF0aWJsZSBjb24gbG9zIGRhdG9zIG9ic2VydmFkb3MuDQoNCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCiMjIyBFamVtcGxvIGRlIHJlbGFjacOzbiBjYXVzYWwNCg0KU3Vww7NuZ2FzZSBxdWUgbGEgdGVvcsOtYSBwbGFudGVhIHF1ZSB1biBtYXlvciBuaXZlbCBkZSBlZHVjYWNpw7NuIHB1ZWRlIGluZmx1aXIgcG9zaXRpdmFtZW50ZSBlbiBlbCBzYWxhcmlvLg0KDQpgYGB0ZXh0DQpOaXZlbCBkZSBlZHVjYWNpw7NuIOKUgOKUgOKUgOKUgOKUgOKWuiBTYWxhcmlvDQpgYGANCg0KTGEgZmxlY2hhIHJlcHJlc2VudGEgdW5hIGhpcMOzdGVzaXMgZGUgaW5mbHVlbmNpYSB0ZcOzcmljYSBkZXNkZSBsYSBlZHVjYWNpw7NuIGhhY2lhIGVsIHNhbGFyaW8uDQoNCkVuIGVzdGUgY2FzbyBzZSBwcm9wb25lIHVuYSBkaXJlY2Npw7NuIGVzcGVjw61maWNhIGRlIGluZmx1ZW5jaWE6DQoNClxbDQpcdGV4dHtFZHVjYWNpw7NufSBccmlnaHRhcnJvdyBcdGV4dHtTYWxhcmlvfQ0KXF0NCg0KU2luIGVtYmFyZ28sIGVsIG1vZGVsbyBTRU0gbm8gZGVtdWVzdHJhIHF1ZSBkaWNoYSBjYXVzYWxpZGFkIGV4aXN0YTsgw7puaWNhbWVudGUgZXZhbMO6YSBzaSBlc3RhIGhpcMOzdGVzaXMgZXMgY29uc2lzdGVudGUgY29uIGxvcyBkYXRvcyBvYnNlcnZhZG9zLg0KDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQojIyMgRWplbXBsbyBkZSByZWxhY2nDs24gbm8gY2F1c2FsDQoNClN1cMOzbmdhc2UgcXVlIHNlIG9ic2VydmEgdW5hIGFzb2NpYWNpw7NuIGVudHJlIGFuc2llZGFkIHkgZGVwcmVzacOzbiwgcGVybyBubyBzZSBkZXNlYSBlc3RhYmxlY2VyIHVuYSBkaXJlY2Npw7NuIGRlIGluZmx1ZW5jaWEgZW50cmUgYW1iYXMgdmFyaWFibGVzLg0KDQpgYGB0ZXh0DQpBbnNpZWRhZCDil4TilIDilIDilIDilIDilrogRGVwcmVzacOzbg0KYGBgDQoNCkVuIGVzdGUgY2FzbyBzb2xhbWVudGUgc2UgaW5kaWNhIHF1ZSBhbWJhcyB2YXJpYWJsZXMgZXN0w6FuIHJlbGFjaW9uYWRhcyBvIGNvdmFyw61hbiBlbnRyZSBzw60uDQoNCkxhIHJlbGFjacOzbiBwdWVkZSBleHByZXNhcnNlIGNvbW86DQoNClxbDQpDb3YoXHRleHR7QW5zaWVkYWR9LFx0ZXh0e0RlcHJlc2nDs259KSBcbmVxIDANClxdDQoNCnNpbiBhc3VtaXIgcXVlIHVuYSB2YXJpYWJsZSBzZWEgY2F1c2EgZGUgbGEgb3RyYS4NCg0KDQo8IS0tICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUgLS0+DQo8IS0tIFNlcGFyYWRvciAtLT4NCg0KIyMjIERpZmVyZW5jaWEgZnVuZGFtZW50YWwNCg0KYGBge3IsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQoNCmxpYnJhcnkoa25pdHIpDQpsaWJyYXJ5KGthYmxlRXh0cmEpDQoNCnRhYmxhX2NhdXNhbGlkYWQgPC0gZGF0YS5mcmFtZSgNCiAgYFJlbGFjacOzbiBjYXVzYWxgID0gYygNCiAgICAiUmVwcmVzZW50YSB1bmEgaGlww7N0ZXNpcyBkZSBpbmZsdWVuY2lhIiwNCiAgICAiRmxlY2hhIHVuaWRpcmVjY2lvbmFsICjihpIpIiwNCiAgICAiSW1wbGljYSB1bmEgZGlyZWNjacOzbiB0ZcOzcmljYSIsDQogICAgIlJlcXVpZXJlIHN1c3RlbnRvIHRlw7NyaWNvIg0KICApLA0KICBgUmVsYWNpw7NuIG5vIGNhdXNhbGAgPSBjKA0KICAgICJSZXByZXNlbnRhIHVuYSBhc29jaWFjacOzbiBvIGNvdmFyaWFjacOzbiIsDQogICAgIkZsZWNoYSBiaWRpcmVjY2lvbmFsICjihpQpIiwNCiAgICAiTm8gaW1wbGljYSBkaXJlY2Npw7NuIiwNCiAgICAiSW5kaWNhIMO6bmljYW1lbnRlIHJlbGFjacOzbiBlc3RhZMOtc3RpY2EiDQogICkNCikNCg0Ka2FibGUoDQogIHRhYmxhX2NhdXNhbGlkYWQsDQogIGFsaWduID0gYygibCIsImwiKSwNCiAgY2FwdGlvbiA9ICJEaWZlcmVuY2lhcyBlbnRyZSByZWxhY2lvbmVzIGNhdXNhbGVzIHkgbm8gY2F1c2FsZXMgZW4gU0VNIg0KKSAlPiUNCiAga2FibGVfc3R5bGluZygNCiAgICBib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCJob3ZlciIsImNvbmRlbnNlZCIpLA0KICAgIGZ1bGxfd2lkdGggPSBGQUxTRSwNCiAgICBwb3NpdGlvbiA9ICJjZW50ZXIiDQogICkgJT4lDQogIHJvd19zcGVjKDAsDQogICAgICAgICAgIGJvbGQgPSBUUlVFLA0KICAgICAgICAgICBjb2xvciA9ICJ3aGl0ZSIsDQogICAgICAgICAgIGJhY2tncm91bmQgPSAiIzJDM0U1MCIpDQpgYGANCg0KDQo8IS0tICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUgLS0+DQo8IS0tIFNlcGFyYWRvciAtLT4NCg0KIyMjIElkZWEgY2xhdmUNCg0KIEVuIFNFTSwgdW5hIGZsZWNoYSBzaW1wbGUgKFwoXHJpZ2h0YXJyb3dcKSkgcmVwcmVzZW50YSB1bmEgaGlww7N0ZXNpcyBjYXVzYWwgcHJvcHVlc3RhIHBvciBsYSB0ZW9yw61hLCBtaWVudHJhcyBxdWUgdW5hIGZsZWNoYSBkb2JsZSAoXChcbGVmdHJpZ2h0YXJyb3dcKSkgcmVwcmVzZW50YSB1bmEgYXNvY2lhY2nDs24gbyBjb3ZhcmlhY2nDs24gc2luIGRpcmVjY2nDs24gY2F1c2FsIGV4cGzDrWNpdGEuDQoNCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCiMgVGlwb3MgZGUgdmFyaWFibGVzIGVuIFNFTQ0KDQojIyMgSW50cm9kdWNjacOzbg0KDQpFbiBTRU0sIGxhcyB2YXJpYWJsZXMgcHVlZGVuIGNsYXNpZmljYXJzZSBkZXNkZSBkaWZlcmVudGVzIHBlcnNwZWN0aXZhcy4gQWxndW5hcyBjbGFzaWZpY2FjaW9uZXMgZGVzY3JpYmVuIGxhIG5hdHVyYWxlemEgZGUgbGEgdmFyaWFibGUsIG90cmFzIHN1IHBvc2ljacOzbiBkZW50cm8gZGVsIG1vZGVsbyB5IG90cmFzIHN1IGZ1bmNpw7NuIGRlbnRybyBkZSBsYXMgcmVsYWNpb25lcyBlbnRyZSB2YXJpYWJsZXMuDQoNClBvciBlc3RhIHJhesOzbiwgdW5hIG1pc21hIHZhcmlhYmxlIHB1ZWRlIHBlcnRlbmVjZXIgc2ltdWx0w6FuZWFtZW50ZSBhIHZhcmlhcyBjYXRlZ29yw61hcy4gUG9yIGVqZW1wbG8sIHVuYSB2YXJpYWJsZSBwdWVkZSBzZXIgKipsYXRlbnRlKiosICoqZW5kw7NnZW5hKiogeSAqKm1lZGlhZG9yYSoqIGFsIG1pc21vIHRpZW1wby4NCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCiMjIyBDbGFzaWZpY2FjacOzbiAxOiBWYXJpYWJsZXMgbWFuaWZpZXN0YXMgeSBsYXRlbnRlcw0KDQpFc3RhIGNsYXNpZmljYWNpw7NuIHJlc3BvbmRlIGEgbGEgcHJlZ3VudGE6DQoNCmBgYHRleHQNCsK/TGEgdmFyaWFibGUgcHVlZGUgb2JzZXJ2YXJzZSBkaXJlY3RhbWVudGU/KioNCmBgYA0KDQo8IS0tICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUgLS0+DQo8IS0tIFNlcGFyYWRvciAtLT4NCg0KIyMjIyBWYXJpYWJsZXMgbWFuaWZpZXN0YXMgKG9ic2VydmFkYXMgbyBpbmRpY2Fkb3JhcykuIHsudW5saXN0ZWQgLnVubnVtYmVyZWR9ICANCg0KU29uIHZhcmlhYmxlcyBxdWUgcHVlZGVuIG1lZGlyc2UgZGlyZWN0YW1lbnRlLg0KDQpHZW5lcmFsbWVudGUgY29ycmVzcG9uZGVuIGE6DQoNCi0gw410ZW1zIGRlIGN1ZXN0aW9uYXJpb3MuDQotIFByZWd1bnRhcyBkZSBlbmN1ZXN0YXMuDQotIE1lZGljaW9uZXMgZsOtc2ljYXMuDQotIFJlZ2lzdHJvcyBhZG1pbmlzdHJhdGl2b3MuDQoNCioqRWplbXBsb3MuKioNCg0KLSBFZGFkLg0KLSBJbmdyZXNvLg0KLSBQZXNvLg0KLSDDjXRlbTogIk1lIHNpZW50byBzYXRpc2ZlY2hvIGNvbiBtaSB0cmFiYWpvIi4NCg0KRW4gbG9zIGRpYWdyYW1hcyBTRU0gc3VlbGVuIHJlcHJlc2VudGFyc2UgbWVkaWFudGUgcmVjdMOhbmd1bG9zLg0KDQpgYGB0ZXh0DQpbRWRhZF0NCg0KW0luZ3Jlc29dDQoNClvDjXRlbSAxXQ0KYGBgDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQojIyMjIFZhcmlhYmxlcyBsYXRlbnRlcyAobm8gb2JzZXJ2YWRhcykuIHsudW5saXN0ZWQgLnVubnVtYmVyZWR9ICANCg0KU29uIGNvbnN0cnVjdG9zIHRlw7NyaWNvcyBxdWUgbm8gcHVlZGVuIG9ic2VydmFyc2UgZGlyZWN0YW1lbnRlLg0KDQpTdSBtZWRpY2nDs24gc2UgcmVhbGl6YSBtZWRpYW50ZSB1bmEgbyB2YXJpYXMgdmFyaWFibGVzIG9ic2VydmFkYXMuDQoNCioqRWplbXBsb3MuKioNCg0KLSBJbnRlbGlnZW5jaWEuDQoNCi0gQW5zaWVkYWQuDQoNCi0gTGlkZXJhemdvLg0KDQotIE1vdGl2YWNpw7NuLg0KDQotIFNhdGlzZmFjY2nDs24gbGFib3JhbC4NCg0KRW4gbG9zIGRpYWdyYW1hcyBTRU0gc3VlbGVuIHJlcHJlc2VudGFyc2UgbWVkaWFudGUgw7N2YWxvcy4NCg0KYGBgdGV4dA0KICAgICAgICAoU2F0aXNmYWNjacOzbikNCiAgICAgICAgICAgICAgIOKUgg0KICAgICAgIOKUjOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUvOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUkA0KICAgICAgIOKWvCAgICAgICDilrwgICAgICAg4pa8DQogICAgW0l0ZW0xXSBbSXRlbTJdIFtJdGVtM10NCmBgYA0KDQo8IS0tICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUgLS0+DQo8IS0tIFNlcGFyYWRvciAtLT4NCg0KIyMjIENsYXNpZmljYWNpw7NuIDI6IFZhcmlhYmxlcyBleMOzZ2VuYXMgeSBlbmTDs2dlbmFzDQoNCkVzdGEgY2xhc2lmaWNhY2nDs24gcmVzcG9uZGUgYSBsYSBwcmVndW50YToNCg0KYGBgdGV4dA0Kwr9MYSB2YXJpYWJsZSByZWNpYmUgZmxlY2hhcyBkZW50cm8gZGVsIG1vZGVsbz8NCmBgYA0KDQo8IS0tICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUgLS0+DQo8IS0tIFNlcGFyYWRvciAtLT4NCg0KIyMjIyBWYXJpYWJsZXMgZXjDs2dlbmFzLiB7LnVubGlzdGVkIC51bm51bWJlcmVkfSAgDQoNClNvbiB2YXJpYWJsZXMgcXVlIGV4cGxpY2FuIG90cmFzIHZhcmlhYmxlcyBkZWwgbW9kZWxvLCBwZXJvIG5vIHNvbiBleHBsaWNhZGFzIHBvciBuaW5ndW5hIG90cmEgdmFyaWFibGUuDQoNClNvbiBhbsOhbG9nYXMgYSBsYXMgdmFyaWFibGVzIGluZGVwZW5kaWVudGVzIGVuIHJlZ3Jlc2nDs24uDQoNCioqRWplbXBsby4qKg0KDQpgYGB0ZXh0DQpFZHVjYWNpw7NuIOKUgOKUgOKUgOKWuiBTYWxhcmlvDQpgYGANCg0KTGEgdmFyaWFibGU6DQoNCmBgYHRleHQNCkVkdWNhY2nDs24NCmBgYA0KDQplcyBleMOzZ2VuYSBwb3JxdWUgbm8gcmVjaWJlIGZsZWNoYXMuDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQojIyMjIFZhcmlhYmxlcyBlbmTDs2dlbmFzLiB7LnVubGlzdGVkIC51bm51bWJlcmVkfSAgDQoNClNvbiB2YXJpYWJsZXMgZXhwbGljYWRhcyBwb3Igb3RyYXMgdmFyaWFibGVzIGRlbnRybyBkZWwgbW9kZWxvLg0KDQpTb24gYW7DoWxvZ2FzIGEgbGFzIHZhcmlhYmxlcyBkZXBlbmRpZW50ZXMgZW4gcmVncmVzacOzbi4NCg0KKipFamVtcGxvLioqDQoNCmBgYHRleHQNCkVkdWNhY2nDs24g4pSA4pSA4pSA4pa6IFNhbGFyaW8NCmBgYA0KDQpMYSB2YXJpYWJsZToNCg0KYGBgdGV4dA0KU2FsYXJpbw0KYGBgDQoNCmVzIGVuZMOzZ2VuYSBwb3JxdWUgcmVjaWJlIHVuYSBmbGVjaGEuDQoNClRvZGEgdmFyaWFibGUgZW5kw7NnZW5hIGRlYmUgZXN0YXIgYXNvY2lhZGEgYSB1biB0w6lybWlubyBkZSBlcnJvciBvIHBlcnR1cmJhY2nDs24uDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQojIyMgQ2xhc2lmaWNhY2nDs24gMzogVmFyaWFibGVzIG1lZGlhZG9yYXMgeSBtb2RlcmFkb3Jhcw0KDQpFc3RhIGNsYXNpZmljYWNpw7NuIHJlc3BvbmRlIGEgbGEgcHJlZ3VudGE6DQoNCmBgYHRleHQNCsK/UXXDqSBmdW5jacOzbiBjdW1wbGUgbGEgdmFyaWFibGUgZGVudHJvIGRlIGxhIHJlbGFjacOzbiBlbnRyZSBvdHJhcyB2YXJpYWJsZXM/KioNCmBgYA0KDQo8IS0tICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUgLS0+DQo8IS0tIFNlcGFyYWRvciAtLT4NCg0KIyMjIyBWYXJpYWJsZXMgbWVkaWFkb3Jhcy4gey51bmxpc3RlZCAudW5udW1iZXJlZH0gIA0KDQpVbmEgdmFyaWFibGUgbWVkaWFkb3JhIGV4cGxpY2EgKipjw7NtbyoqIG8gKipwb3IgcXXDqSoqIHVuYSB2YXJpYWJsZSBpbmZsdXllIHNvYnJlIG90cmEuDQoNCioqRXN0cnVjdHVyYSBnZW5lcmFsLioqDQoNCmBgYHRleHQNClgg4pSA4pSA4pSA4pa6IE0g4pSA4pSA4pSA4pa6IFkNCmBgYA0KDQpkb25kZToNCg0KLSBYID0gdmFyaWFibGUgaW5kZXBlbmRpZW50ZS4NCg0KLSBNID0gdmFyaWFibGUgbWVkaWFkb3JhLg0KDQotIFkgPSB2YXJpYWJsZSBkZXBlbmRpZW50ZS4NCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCioqRWplbXBsby4qKg0KDQpgYGB0ZXh0DQpDYXBhY2l0YWNpw7NuIOKUgOKWuiBDb21wZXRlbmNpYXMg4pSA4pa6IERlc2VtcGXDsW8NCmBgYA0KDQpJbnRlcnByZXRhY2nDs246ICBMYSBjYXBhY2l0YWNpw7NuIG1lam9yYSBsYXMgY29tcGV0ZW5jaWFzLCB5IGVzdGFzIGNvbXBldGVuY2lhcyBtZWpvcmFuIGVsIGRlc2VtcGXDsW8uDQoNCkxhIHZhcmlhYmxlIG1lZGlhZG9yYSBlczoNCg0KYGBgdGV4dA0KQ29tcGV0ZW5jaWFzDQpgYGANCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCioqRWZlY3RvcyBlbiB1bmEgbWVkaWFjacOzbi4qKg0KDQpgYGB0ZXh0DQpYIOKUgOKUgOKUgOKWuiBNIOKUgOKUgOKUgOKWuiBZDQrilIIgICAgICAgICAgICAg4payDQrilJTilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilJgNCmBgYA0KDQpFeGlzdGVuOg0KDQotIEVmZWN0byBkaXJlY3RvOiBcKFggXHJpZ2h0YXJyb3cgWVwpLg0KDQotIEVmZWN0byBpbmRpcmVjdG86IFwoWCBccmlnaHRhcnJvdyBNIFxyaWdodGFycm93IFlcKS4NCg0KLSBFZmVjdG8gdG90YWw6IHN1bWEgZGUgYW1ib3MuDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQojIyMjIFZhcmlhYmxlcyBtb2RlcmFkb3Jhcy4gey51bmxpc3RlZCAudW5udW1iZXJlZH0gIA0KDQpVbmEgdmFyaWFibGUgbW9kZXJhZG9yYSBtb2RpZmljYSBsYSBpbnRlbnNpZGFkIG8gZGlyZWNjacOzbiBkZSB1bmEgcmVsYWNpw7NuLg0KDQpMYSBwcmVndW50YSB5YSBubyBlczoNCg0KYGBgdGV4dA0Kwr9Dw7NtbyBvY3VycmUgZWwgZWZlY3RvPw0KYGBgDQoNCnNpbm86DQoNCmBgYHRleHQNCsK/Q3XDoW5kbyBvY3VycmU/IG8gwr9QYXJhIHF1acOpbiBvY3VycmU/DQpgYGANCg0KDQo8IS0tICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUgLS0+DQo8IS0tIFNlcGFyYWRvciAtLT4NCg0KKipFamVtcGxvLioqDQoNClNpbiBtb2RlcmFkb3I6DQoNCmBgYHRleHQNCkV4cGVyaWVuY2lhIGxhYm9yYWwg4pSA4pa6IFNhbGFyaW8NCmBgYA0KDQpDb24gbW9kZXJhZG9yOg0KDQpgYGB0ZXh0DQpFeHBlcmllbmNpYSBsYWJvcmFsIOKUgOKWuiBTYWxhcmlvDQogICAgICAgICAg4payDQogICAgICAgICAg4pSCDQogICAgICAgR8OpbmVybw0KYGBgDQoNCkxhIHJlbGFjacOzbiBwdWVkZSBzZXIgZGlmZXJlbnRlIHBhcmE6DQoNCi0gaG9tYnJlcywNCg0KLSBtdWplcmVzLg0KDQpFbiBlc3RlIGNhc28sIGBHw6luZXJvYCBlcyB1bmEgdmFyaWFibGUgbW9kZXJhZG9yYS4NCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCioqSW50ZXJwcmV0YWNpw7NuIG1hdGVtw6F0aWNhLioqDQoNClNpbiBtb2RlcmFjacOzbjoNCg0KYGBgdGV4dA0KRXhwZXJpZW5jaWEg4pSA4pa6IFNhbGFyaW8NCmBgYA0KDQpDb24gbW9kZXJhY2nDs246DQoNCmBgYHRleHQNCihFeHBlcmllbmNpYSDDlyBHw6luZXJvKSDilIDilrogU2FsYXJpbw0KYGBgDQoNCkxhIHBlbmRpZW50ZSBjYW1iaWEgZGVwZW5kaWVuZG8gZGVsIHZhbG9yIGRlbCBtb2RlcmFkb3IuDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQojIyMgVmFyaWFibGVzIGRlIGVycm9yDQoNCkxvcyB0w6lybWlub3MgZGUgZXJyb3IgcmVwcmVzZW50YW4gbGEgcGFydGUgZGUgdW5hIHZhcmlhYmxlIHF1ZSBubyBlcyBleHBsaWNhZGEgcG9yIGVsIG1vZGVsby4NCg0KRXhpc3RlbiBkb3MgdGlwb3MgcHJpbmNpcGFsZXMuDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQojIyMjIEVycm9yIGRlIG1lZGljacOzbi4gey51bmxpc3RlZCAudW5udW1iZXJlZH0gIA0KDQpBcGFyZWNlIGFzb2NpYWRvIGEgdmFyaWFibGVzIG9ic2VydmFkYXMuDQoNCmBgYHRleHQNCmUxIOKUgOKWuiBYMQ0KZTIg4pSA4pa6IFgyDQplMyDilIDilrogWDMNCmBgYA0KDQpSZXByZXNlbnRhOg0KDQotIGVycm9yZXMgZGUgbWVkaWNpw7NuLA0KDQotIHZhcmlhYmlsaWRhZCBlc3BlY8OtZmljYSBkZWwgaW5kaWNhZG9yLA0KDQotIGZhY3RvcmVzIG5vIGNvbnNpZGVyYWRvcyBlbiBlbCBtb2RlbG8uDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQojIyMgRXJyb3IgZXN0cnVjdHVyYWwgKHBlcnR1cmJhY2nDs24pLiB7LnVubGlzdGVkIC51bm51bWJlcmVkfSAgDQoNCkFwYXJlY2UgYXNvY2lhZG8gYSB2YXJpYWJsZXMgbGF0ZW50ZXMgZW5kw7NnZW5hcy4NCg0KYGBgdGV4dA0KRjEg4pSA4pa6IEYyDQogICAgICDilrINCiAgICAgIOKUgg0KICAgICAgZDENCmBgYA0KDQpSZXByZXNlbnRhIGxhIHBhcnRlIGRlIGxhIHZhcmlhYmxlIGxhdGVudGUgcXVlIG5vIGVzIGV4cGxpY2FkYSBwb3IgbGFzIHZhcmlhYmxlcyBhbnRlY2VkZW50ZXMuDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQojIElkZWEgY2xhdmUNCg0KTGFzIGNsYXNpZmljYWNpb25lcyBhbnRlcmlvcmVzIGRlc2NyaWJlbiBhc3BlY3RvcyBkaWZlcmVudGVzIGRlIHVuYSBtaXNtYSB2YXJpYWJsZToNCg0KLSAqKkxhdGVudGUvbWFuaWZpZXN0YSoqIGRlc2NyaWJlIHN1IG5hdHVyYWxlemEuDQoNCi0gKipFeMOzZ2VuYS9lbmTDs2dlbmEqKiBkZXNjcmliZSBzdSBwb3NpY2nDs24gZGVudHJvIGRlbCBtb2RlbG8uDQoNCi0gKipNZWRpYWRvcmEvbW9kZXJhZG9yYSoqIGRlc2NyaWJlIHN1IGZ1bmNpw7NuIGRlbnRybyBkZSBsYXMgcmVsYWNpb25lcyBlbnRyZSB2YXJpYWJsZXMuDQoNCi0gKipFcnJvcioqIHJlcHJlc2VudGEgdmFyaWFiaWxpZGFkIG5vIGV4cGxpY2FkYS4NCg0KDQo8IS0tICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUgLS0+DQo8IS0tIFNlcGFyYWRvciAtLT4NCg0KDQpQb3IgZWxsbywgdW5hIG1pc21hIHZhcmlhYmxlIHB1ZWRlIHBlcnRlbmVjZXIgc2ltdWx0w6FuZWFtZW50ZSBhIHZhcmlhcyBjYXRlZ29yw61hcy4NCg0KUG9yIGVqZW1wbG86DQoNCmBgYHRleHQNCk1vdGl2YWNpw7NuIOKUgOKWuiBQZXJzaXN0ZW5jaWEg4pSA4pa6IFJlbmRpbWllbnRvDQpgYGANCg0KTGEgdmFyaWFibGU6DQoNCmBgYHRleHQNClBlcnNpc3RlbmNpYQ0KYGBgDQoNCnB1ZWRlIHNlciBzaW11bHTDoW5lYW1lbnRlOg0KDQotIExhdGVudGUuDQoNCi0gRW5kw7NnZW5hLg0KDQotIE1lZGlhZG9yYS4NCg0KDQo8IS0tICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUgLS0+DQo8IS0tIFNlcGFyYWRvciAtLT4NCg0KIyBUaXBvcyBkZSB2YXJpYWJsZXMgZW4gdW4gZGlhZ3JhbWEgU0VNDQoNCkxhIGZpZ3VyYSBzaWd1aWVudGUgcmVzdW1lIGxvcyBwcmluY2lwYWxlcyB0aXBvcyBkZSB2YXJpYWJsZXMgZW4gdW4gbW9kZWxvIFNFTS4gRWwgb2JqZXRpdm8gbm8gZXMgaW50ZXJwcmV0YXIgZXN0aW1hY2lvbmVzIG51bcOpcmljYXMsIHNpbm8gaWRlbnRpZmljYXIgZWwgcGFwZWwgcXVlIGN1bXBsZSBjYWRhIGVsZW1lbnRvIGRlbnRybyBkZWwgbW9kZWxvLg0KDQoNCg0KYGBge3IgdGFibGEtc2VtLTd0eXBlcywgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmxpYnJhcnkoa25pdHIpDQpsaWJyYXJ5KGthYmxlRXh0cmEpDQoNCnRhYmxhX3NlbV83dHlwZXMgPC0gZGF0YS5mcmFtZSgNCiAgYEVsZW1lbnRvIGVuIGxhIGZpZ3VyYWAgPSBjKA0KICAgICJ4MSwgeDIsIHgzLCB5MSwgeTIsIHoxLCB6MiIsDQogICAgIkYxLCBGMiwgRjMiLA0KICAgICJFcnJvcmVzIGVuIHgxLCB4MiwgeDMsIHkxLCB5MiwgejEsIHoyIiwNCiAgICAiRXJyb3IgZW4gRjIgeSBGMyIsDQogICAgIkYxIiwNCiAgICAiRjIsIEYzIiwNCiAgICAiRjIiLA0KICAgICJzY2hvb2wiDQogICksDQogIGBUaXBvIGRlIHZhcmlhYmxlYCA9IGMoDQogICAgIk1hbmlmaWVzdGFzIChvYnNlcnZhZGFzKSIsDQogICAgIkxhdGVudGVzIiwNCiAgICAiRXJyb3JlcyBkZSBtZWRpY2nDs24iLA0KICAgICJFcnJvciBlc3RydWN0dXJhbCIsDQogICAgIkV4w7NnZW5hIiwNCiAgICAiRW5kw7NnZW5hcyIsDQogICAgIk1lZGlhZG9yYSIsDQogICAgIkFncnVwYWNpw7NuIC8gbW9kZXJhZG9yYSINCiAgKSwNCiAgYERlc2NyaXBjacOzbmAgPSBjKA0KICAgICJJbmRpY2Fkb3JlcyBvYnNlcnZhZG9zIiwNCiAgICAiQ29uc3RydWN0b3Mgbm8gb2JzZXJ2YWRvcyIsDQogICAgIlBhcnRlIG5vIGV4cGxpY2FkYSBkZWwgaW5kaWNhZG9yIiwNCiAgICAiUmVzaWR1byBkZSB2YXJpYWJsZXMgbGF0ZW50ZXMgZW5kw7NnZW5hcyIsDQogICAgIk5vIHJlY2liZSBmbGVjaGFzOyBubyBlcyBleHBsaWNhZGEgcG9yIG90cmFzIHZhcmlhYmxlcyIsDQogICAgIlJlY2liZW4gZmxlY2hhczsgc29uIGV4cGxpY2FkYXMgcG9yIG90cmFzIHZhcmlhYmxlcyIsDQogICAgIlRyYW5zbWl0ZSBlbCBlZmVjdG8gaW5kaXJlY3RvOiBGMSDihpIgRjIg4oaSIEYzIiwNCiAgICAiRGVmaW5lIHN1YnBvYmxhY2lvbmVzOyBubyBuZWNlc2FyaWFtZW50ZSBhcGFyZWNlIGNvbW8gbm9kbyINCiAgKQ0KKQ0KDQprYWJsZSgNCiAgdGFibGFfc2VtXzd0eXBlcywNCiAgYWxpZ24gPSBjKCJsIiwgImwiLCAibCIpLA0KICBjYXB0aW9uID0gIklkZW50aWZpY2FjacOzbiBkZSBsb3MgdGlwb3MgZGUgdmFyaWFibGVzIGVuIGVsIGRpYWdyYW1hIFNFTSBjb25jZXB0dWFsIiwgDQogICAgZm9ybWF0PSJodG1sIg0KKSAlPiUNCiAga2FibGVfc3R5bGluZygNCiAgICBib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiLCAiY29uZGVuc2VkIiksDQogICAgZnVsbF93aWR0aCA9IEZBTFNFLA0KICAgIHBvc2l0aW9uID0gImNlbnRlciINCiAgKSAlPiUNCiAgcm93X3NwZWMoDQogICAgMCwNCiAgICBib2xkID0gVFJVRSwNCiAgICBjb2xvciA9ICJ3aGl0ZSIsDQogICAgYmFja2dyb3VuZCA9ICIjMkMzRTUwIg0KICApICU+JQ0KICBjb2x1bW5fc3BlYygxLCBib2xkID0gVFJVRSwgd2lkdGggPSAiNWNtIikgJT4lDQogIGNvbHVtbl9zcGVjKDIsIHdpZHRoID0gIjRjbSIpICU+JQ0KICBjb2x1bW5fc3BlYygzLCB3aWR0aCA9ICI4Y20iKQ0KYGBgDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQoNCiMjIyBEaWFncmFtYSBTRU0gY29uY2VwdHVhbA0KDQpgYGB7ciBzZW0tY29uY2VwdHVhbC03dHlwZXMsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD03LCBmaWcuY2FwPSIqKkRpYWdyYW1hIFNFTSBjb25jZXB0dWFsIGlsdXN0cmFuZG8gZGlmZXJlbnRlcyB0aXBvcyBkZSB2YXJpYWJsZXMqKi4ifQ0KDQpsaWJyYXJ5KGxhdmFhbikNCmxpYnJhcnkoc2VtUGxvdCkNCg0KIyBNb2RlbG8gU0VNIGNvbmNlcHR1YWwNCm1vZGVsX2NvbmNlcHR1YWwgPC0gJw0KICAjIE1vZGVsbyBkZSBtZWRpY2nDs24NCiAgRjEgPX4geDEgKyB4MiArIHgzDQogIEYyID1+IHkxICsgeTINCiAgRjMgPX4gejEgKyB6Mg0KDQogICMgTW9kZWxvIGVzdHJ1Y3R1cmFsDQogIEYyIH4gRjENCiAgRjMgfiBGMg0KJw0KDQojIFNpbXVsYWNpw7NuIHNvbG8gcGFyYSBkaWJ1amFyIGVsIG1vZGVsbw0Kc2V0LnNlZWQoMTIzKQ0KZGF0X3NpbSA8LSBzaW11bGF0ZURhdGEobW9kZWxfY29uY2VwdHVhbCwgc2FtcGxlLm5vYnMgPSAzMDApDQoNCmZpdF9jb25jZXB0dWFsIDwtIHNlbShtb2RlbF9jb25jZXB0dWFsLCBkYXRhID0gZGF0X3NpbSkNCg0KIyBHcsOhZmljbyBjb25jZXB0dWFsIHNpbiBjb2VmaWNpZW50ZXMNCnNlbVBhdGhzKA0KICBmaXRfY29uY2VwdHVhbCwNCiAgd2hhdCA9ICJwYXRoIiwNCiAgd2hhdExhYmVscyA9ICJub25lIiwNCiAgc3R5bGUgPSAibGlzcmVsIiwNCiAgbGF5b3V0ID0gInRyZWUiLA0KICByb3RhdGlvbiA9IDIsDQogIHJlc2lkdWFscyA9IFRSVUUsDQogIGludGVyY2VwdHMgPSBGQUxTRSwNCiAgZXhvQ292ID0gRkFMU0UsDQogIG5DaGFyTm9kZXMgPSAwLA0KICBzaXplTWFuID0gNywNCiAgc2l6ZUxhdCA9IDksDQogIGVkZ2UuY29sb3IgPSAiYmxhY2siLA0KICBjb2xvciA9IGxpc3QoDQogICAgbGF0ID0gIm9yYW5nZSIsDQogICAgbWFuID0gImxpZ2h0Z3JlZW4iDQogICkNCikNCmBgYA0KDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQojIyMgSW50ZXJwcmV0YWNpw7NuIGRlbCBkaWFncmFtYQ0KDQpFbiBlc3RlIGRpYWdyYW1hOg0KDQotIGBGMWAsIGBGMmAgeSBgRjNgIHNvbiB2YXJpYWJsZXMgbGF0ZW50ZXMsIG1pZW50cmFzIHF1ZSBgeDFgLCBgeDJgLCBgeDNgLCBgeTFgLCBgeTJgLCBgejFgIHkgYHoyYCBzb24gdmFyaWFibGVzIG1hbmlmaWVzdGFzIG8gaW5kaWNhZG9yZXMgb2JzZXJ2YWRvcy4NCg0KLSBMYSB2YXJpYWJsZSBgRjFgIGVzIGV4w7NnZW5hIHBvcnF1ZSBubyByZWNpYmUgZmxlY2hhcyBkZSBvdHJhcyB2YXJpYWJsZXMgbGF0ZW50ZXMuIEVuIGNhbWJpbywgYEYyYCB5IGBGM2Agc29uIGVuZMOzZ2VuYXMgcG9ycXVlIHJlY2liZW4gZmxlY2hhcyBkZW50cm8gZGVsIG1vZGVsby4NCg0KLSBBZGVtw6FzLCBgRjJgIGN1bXBsZSBlbCBwYXBlbCBkZSB2YXJpYWJsZSBtZWRpYWRvcmEsIHBvcnF1ZSB0cmFuc21pdGUgcGFydGUgZGVsIGVmZWN0byBkZSBgRjFgIHNvYnJlIGBGM2A6DQoNClxbDQpGMSBccmlnaHRhcnJvdyBGMiBccmlnaHRhcnJvdyBGMw0KXF0NCg0KLSBMb3MgZXJyb3JlcyBhc29jaWFkb3MgYSBsb3MgaW5kaWNhZG9yZXMgcmVwcmVzZW50YW4gZXJyb3JlcyBkZSBtZWRpY2nDs24sIG1pZW50cmFzIHF1ZSBsb3MgZXJyb3JlcyBhc29jaWFkb3MgYSBgRjJgIHkgYEYzYCByZXByZXNlbnRhbiBwZXJ0dXJiYWNpb25lcyBvIGVycm9yZXMgZXN0cnVjdHVyYWxlcy4NCg0KLSBGaW5hbG1lbnRlLCB1bmEgdmFyaWFibGUgY29tbyBgc2Nob29sYCBwdWVkZSB1dGlsaXphcnNlIGNvbW8gdmFyaWFibGUgZGUgYWdydXBhY2nDs24gbyBtb2RlcmFkb3JhIHBhcmEgY29tcGFyYXIgZWwgbW9kZWxvIGVudHJlIGRpZmVyZW50ZXMgc3VicG9ibGFjaW9uZXMuDQoNCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCiMgUmVzdW1lbiBnZW5lcmFsDQoNCmBgYHtyLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KbGlicmFyeShrbml0cikNCmxpYnJhcnkoa2FibGVFeHRyYSkNCg0KdGFibGFfdmFyaWFibGVzIDwtIGRhdGEuZnJhbWUoDQogIFRpcG8gPSBjKA0KICAgICJNYW5pZmllc3RhIiwNCiAgICAiTGF0ZW50ZSIsDQogICAgIkV4w7NnZW5hIiwNCiAgICAiRW5kw7NnZW5hIiwNCiAgICAiTWVkaWFkb3JhIiwNCiAgICAiTW9kZXJhZG9yYSIsDQogICAgIkVycm9yIGRlIG1lZGljacOzbiIsDQogICAgIkVycm9yIGVzdHJ1Y3R1cmFsIg0KICApLA0KICBgwr9TZSBvYnNlcnZhIGRpcmVjdGFtZW50ZT9gID0gYygNCiAgICAiU8OtIiwNCiAgICAiTm8iLA0KICAgICJQdWVkZSBvIG5vIiwNCiAgICAiUHVlZGUgbyBubyIsDQogICAgIlB1ZWRlIG8gbm8iLA0KICAgICJQdWVkZSBvIG5vIiwNCiAgICAiTm8iLA0KICAgICJObyINCiAgKSwNCiAgYMK/UmVjaWJlIGluZmx1ZW5jaWEgZGUgb3RyYXMgdmFyaWFibGVzP2AgPSBjKA0KICAgICJQdWVkZSBvIG5vIiwNCiAgICAiUHVlZGUgbyBubyIsDQogICAgIk5vIiwNCiAgICAiU8OtIiwNCiAgICAiU8OtIiwNCiAgICAiR2VuZXJhbG1lbnRlIG5vIiwNCiAgICAiU8OtIiwNCiAgICAiU8OtIg0KICApLA0KICBgUGFwZWwgZGVudHJvIGRlbCBtb2RlbG9gID0gYygNCiAgICAiVmFyaWFibGUgb2JzZXJ2YWRhIiwNCiAgICAiQ29uc3RydWN0byB0ZcOzcmljbyIsDQogICAgIkV4cGxpY2Egb3RyYXMgdmFyaWFibGVzIiwNCiAgICAiRXMgZXhwbGljYWRhIHBvciBvdHJhcyB2YXJpYWJsZXMiLA0KICAgICJUcmFuc21pdGUgdW4gZWZlY3RvIiwNCiAgICAiTW9kaWZpY2EgdW5hIHJlbGFjacOzbiIsDQogICAgIkVycm9yIGFzb2NpYWRvIGEgdW4gaW5kaWNhZG9yIiwNCiAgICAiRXJyb3IgYXNvY2lhZG8gYSB1bmEgdmFyaWFibGUgbGF0ZW50ZSINCiAgKQ0KKQ0KDQprYWJsZSgNCiAgdGFibGFfdmFyaWFibGVzLA0KICBhbGlnbiA9IGMoImwiLCJjIiwiYyIsImwiKSwNCiAgY29sLm5hbWVzID0gYygNCiAgICAiVGlwbyIsDQogICAgIsK/WCBzZSBvYnNlcnZhIGRpcmVjdGFtZW50ZT8iLA0KICAgICLCv1ggcmVjaWJlIGluZmx1ZW5jaWEgZGUgb3RyYSB2YXJpYWJsZT8iLA0KICAgICJQYXBlbCBkZW50cm8gZGVsIG1vZGVsbyINCiAgKSwNCiAgY2FwdGlvbiA9ICJSZXN1bWVuIGRlIGxvcyBwcmluY2lwYWxlcyB0aXBvcyBkZSB2YXJpYWJsZXMgZW4gU0VNIiwNCiAgZm9ybWF0PSJodG1sIiwNCiAgYm9va3RhYnMgPSBUUlVFDQopICU+JQ0KICBrYWJsZV9zdHlsaW5nKA0KICAgIGZ1bGxfd2lkdGggPSBGQUxTRSwNCiAgICBwb3NpdGlvbiA9ICJjZW50ZXIiIywNCiAgICAjZm9udF9zaXplID0gMTENCiAgKSAlPiUNCiAga2FibGVfY2xhc3NpY18yKGZ1bGxfd2lkdGggPSBGQUxTRSkgJT4lDQogIHJvd19zcGVjKA0KICAgIDAsDQogICAgYm9sZCA9IFRSVUUsDQogICAgY29sb3IgPSAid2hpdGUiLA0KICAgIGJhY2tncm91bmQgPSAiIzJDM0U1MCINCiAgKSAlPiUNCiAgY29sdW1uX3NwZWMoMSwgYm9sZCA9IFRSVUUsIHdpZHRoID0gIjNjbSIpICU+JQ0KICBjb2x1bW5fc3BlYygyLCB3aWR0aCA9ICIzY20iKSAlPiUNCiAgY29sdW1uX3NwZWMoMywgd2lkdGggPSAiNGNtIikgJT4lDQogIGNvbHVtbl9zcGVjKDQsIHdpZHRoID0gIjZjbSIpDQpgYGANCg0KDQoNCg0KDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQojIEVzY2FsYSBkZSBsYXMgdmFyaWFibGVzIGxhdGVudGVzDQoNCiMjIyDCv1BvciBxdcOpIGRlYmVtb3MgZmlqYXIgdW5hIGVzY2FsYT8NCg0KQ29uc2lkZXJlIGxhIHNpZ3VpZW50ZSB2YXJpYWJsZSBsYXRlbnRlOg0KDQpgYGB0ZXh0DQogICAgICBJbnRlbGlnZW5jaWENCiAgICAgICAgICAg4pSCDQogICAgIOKUjOKUgOKUgOKUgOKUgOKUgOKUvOKUgOKUgOKUgOKUgOKUgOKUkA0KICAgICDilrwgICAgIOKWvCAgICAg4pa8DQogICAgSTEgICAgSTIgICAgSTMNCmBgYA0KDQpkb25kZToNCg0KLSBJMSA9IFJhem9uYW1pZW50byBsw7NnaWNvLg0KDQotIEkyID0gQ29tcHJlbnNpw7NuIHZlcmJhbC4NCg0KLSBJMyA9IE1lbW9yaWEuDQoNCkxhIHZhcmlhYmxlIGxhdGVudGUgKipJbnRlbGlnZW5jaWEqKiBubyBwdWVkZSBvYnNlcnZhcnNlIGRpcmVjdGFtZW50ZS4NCg0KQSBkaWZlcmVuY2lhIGRlIHZhcmlhYmxlcyBjb21vOg0KDQotIEVkYWQgKGHDsW9zKSwNCg0KLSBQZXNvIChrZyksDQoNCi0gRGlzdGFuY2lhIChtZXRyb3MpLA0KDQpsYSBpbnRlbGlnZW5jaWEgbm8gcG9zZWUgdW5pZGFkZXMgZGUgbWVkaWRhIG5hdHVyYWxlcy4NCg0KUG9yIGVzdGEgcmF6w7NuLCBlbCBtb2RlbG8gbmVjZXNpdGEgdW5hIHJlZmVyZW5jaWEgcGFyYSBkZWZpbmlyIGxhIGVzY2FsYSBkZWwgZmFjdG9yIGxhdGVudGUuIEVuIG90cmFzIHBhbGFicmFzOg0KDQpgYGB0ZXh0DQpBbnRlcyBkZSBlc3RpbWFyIGVsIG1vZGVsbyBkZWJlbW9zIGRlY2lkaXIgY3XDoWwgc2Vyw6EgbGEgdW5pZGFkIGRlIG1lZGlkYSBkZSBsYSB2YXJpYWJsZSBsYXRlbnRlLg0KYGBgDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQoNCiMjIyBBbmFsb2fDrWEgaW50dWl0aXZhDQoNClN1cG9uZ2EgcXVlIHF1ZXJlbW9zIG1lZGlyIHVuYSBkaXN0YW5jaWEuDQoNClBvZGVtb3MgZXhwcmVzYXJsYSBlbjoNCg0KLSBtZXRyb3MsDQoNCi0ga2lsw7NtZXRyb3MsDQoNCi0gbWlsbGFzLg0KDQpMYSBkaXN0YW5jaWEgZsOtc2ljYSBlcyBleGFjdGFtZW50ZSBsYSBtaXNtYToNCg0KLSBMbyDDum5pY28gcXVlIGNhbWJpYSBlcyBsYSB1bmlkYWQgdXRpbGl6YWRhIHBhcmEgbWVkaXJsYS4NCg0KQWxnbyBzaW1pbGFyIG9jdXJyZSBjb24gdW5hIHZhcmlhYmxlIGxhdGVudGU6DQoNCi0gTGEgdmFyaWFibGUgbGF0ZW50ZSBlcyBsYSBtaXNtYSwgcGVybyBkZWJlbW9zIGRlY2lkaXIgZW4gcXXDqSAidW5pZGFkZXMiIGxhIHZhbW9zIGEgbWVkaXIuDQoNCkxvcyBtw6l0b2RvcyBkZSBlc2NhbGFtaWVudG8gc29uIHNpbXBsZW1lbnRlIGRpZmVyZW50ZXMgbWFuZXJhcyBkZSBkZWZpbmlyIGVzYSB1bmlkYWQgZGUgbWVkaWRhLg0KDQo8IS0tICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUgLS0+DQo8IS0tIFNlcGFyYWRvciAtLT4NCg0KDQojIyMgTW9kZWxvIGNvbmNlcHR1YWwgYmFzZQ0KDQpQYXJhIGlsdXN0cmFyIGxvcyBkaXN0aW50b3MgbcOpdG9kb3MgdXRpbGl6YXJlbW9zIGVsIHNpZ3VpZW50ZSBtb2RlbG86DQoNCmBgYHRleHQNCiAgICAgIEludGVsaWdlbmNpYQ0KICAgICAgICAgICDilIINCiAgICAg4pSM4pSA4pSA4pSA4pSA4pSA4pS84pSA4pSA4pSA4pSA4pSA4pSQDQogICAgIOKWvCAgICAg4pa8ICAgICDilrwNCiAgICBJMSAgICBJMiAgICBJMw0KYGBgDQoNCmRvbmRlOg0KDQotIEkxID0gUmF6b25hbWllbnRvIGzDs2dpY28uDQoNCi0gSTIgPSBDb21wcmVuc2nDs24gdmVyYmFsLg0KDQotIEkzID0gTWVtb3JpYS4NCg0KRXMgaW1wb3J0YW50ZSBkZXN0YWNhciBxdWU6DQoNCi0gTG9zIHRyZXMgbcOpdG9kb3MgcHJvZHVjZW4gZXNlbmNpYWxtZW50ZSBlbCBtaXNtbyBtb2RlbG8gdGXDs3JpY28geSBlbCBtaXNtbyBhanVzdGUgZ2xvYmFsLiBMbyDDum5pY28gcXVlIGNhbWJpYSBlcyBsYSBmb3JtYSBlbiBxdWUgc2UgZGVmaW5lIGxhIHVuaWRhZCBkZSBtZWRpZGEgZGUgbGEgdmFyaWFibGUgbGF0ZW50ZS4NCg0KDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQojIE3DqXRvZG9zIHBhcmEgZGVmaW5pciBsYSBlc2NhbGEgZGUgdW5hIHZhcmlhYmxlIGxhdGVudGUNCg0KRXhpc3RlbiB0cmVzIG3DqXRvZG9zIGNvbXVuZXMgcGFyYSBlc3RhYmxlY2VyIGxhIGVzY2FsYSBkZSB1bmEgdmFyaWFibGUgbGF0ZW50ZToNCg0KMS4gKipWYXJpYWJsZSBsYXRlbnRlIGVzdGFuZGFyaXphZGEqKi4NCg0KMi4gKipWYXJpYWJsZSBtYXJjYWRvcioqLg0KDQozLiAqKkNvZGlmaWNhY2nDs24gZGUgZWZlY3RvcyoqLg0KDQoNCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCiMgRXNjYWxhOiB2YXJpYWJsZSBsYXRlbnRlIGVzdGFuZGFyaXphZGENCg0KTGEgaWRlYSBjb25zaXN0ZSBlbiBmaWphciBsYSB2YXJpYW56YSBkZSBsYSB2YXJpYWJsZSBsYXRlbnRlIGVuIDEuDQoNClxbDQpWYXIoXGV0YSk9MQ0KXF0NCg0KUG9yIGVqZW1wbG86DQoNClxbDQpWYXIoXHRleHR7SW50ZWxpZ2VuY2lhfSk9MQ0KXF0NCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCg0KIyMjIEludGVycHJldGFjacOzbg0KDQpFbiBlc3RlIGNhc286IA0KDQotIExhIHZhcmlhYmxlIGxhdGVudGUgcXVlZGEgbWVkaWRhIGVuIGRlc3ZpYWNpb25lcyBlc3TDoW5kYXIuDQoNCi0gRXMgc2ltaWxhciBhIHRyYWJhamFyIGNvbiBwdW50dWFjaW9uZXMgZXN0YW5kYXJpemFkYXMgKCp6LXNjb3JlcyopLg0KDQpgYGB0ZXh0DQpNZWRpYSA9IDANClZhcmlhbnphID0gMQ0KRGVzdmlhY2nDs24gZXN0w6FuZGFyID0gMQ0KYGBgDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQoNCiMjIyBFamVtcGxvDQoNClNpIHVuYSBwZXJzb25hIG9idGllbmU6DQoNClxbDQpcZXRhID0gMg0KXF0NCg0Kc2lnbmlmaWNhIHF1ZSBzZSBlbmN1ZW50cmEgYXByb3hpbWFkYW1lbnRlIGRvcyBkZXN2aWFjaW9uZXMgZXN0w6FuZGFyIHBvciBlbmNpbWEgZGVsIHByb21lZGlvIGVuIGludGVsaWdlbmNpYS4NCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCg0KIyMjIFZlbnRhamFzDQoNCi0gRmFjaWxpdGEgbGEgY29tcGFyYWNpw7NuIGVudHJlIGZhY3RvcmVzLg0KDQotIFByb2R1Y2UgY29lZmljaWVudGVzIGVzdGFuZGFyaXphZG9zIGRlIGZvcm1hIG5hdHVyYWwuDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQoNCiMjIyBEZXN2ZW50YWphcw0KDQotIExhIGVzY2FsYSBwaWVyZGUgaW50ZXJwcmV0YWNpw7NuIHByw6FjdGljYS4NCg0KLSBMb3MgcmVzdWx0YWRvcyBzZSBleHByZXNhbiBlbiB1bmlkYWRlcyBhYnN0cmFjdGFzLg0KDQoNCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCiMgRXNjYWxhOiB2YXJpYWJsZSBtYXJjYWRvcg0KDQpMYSBpZGVhIGNvbnNpc3RlIGVuIHNlbGVjY2lvbmFyIHVuIGluZGljYWRvciB5IGZpamFyIHN1IGNhcmdhIGZhY3RvcmlhbCBlbiAxLiBQb3IgZWplbXBsbywgJFxsYW1iZGFfMSA9IDEkIGVuOiANCg0KYGBgdGV4dA0KICAgICAgSW50ZWxpZ2VuY2lhDQogICAgICAgICAgIOKUgg0KICAgICDilIzilIDilIDilIDilIDilIDilLzilIDilIDilIDilIDilIDilJANCiAgICAg4pa8ICAgICDilrwgICAgIOKWvA0KICAgIEkxICAgIEkyICAgIEkzDQpgYGANCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCiMjIyBJbnRlcnByZXRhY2nDs24NCg0KRXN0YW1vcyBkaWNpZW5kbyBxdWUgbGEgZXNjYWxhIGRlIGxhIHZhcmlhYmxlIGxhdGVudGUgc2Vyw6EgbGEgbWlzbWEgcXVlIGxhIGVzY2FsYSBkZWwgaW5kaWNhZG9yIGVsZWdpZG8gY29tbyByZWZlcmVuY2lhLg0KDQpFbiBlc3RlIGNhc286DQoNCmBgYHRleHQNCkkxDQpgYGANCg0KYWN0w7phIGNvbW8gdmFyaWFibGUgbWFyY2Fkb3IuDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQoNCiMjIyBFamVtcGxvIGludHVpdGl2bw0KDQpTdXBvbmdhIHF1ZToNCg0KYGBgdGV4dA0KSTEgPSBQdW50YWplIGRlIHJhem9uYW1pZW50byBsw7NnaWNvICgwIGEgMTAwKQ0KDQpJMiA9IENvbXByZW5zacOzbiB2ZXJiYWwgKDAgYSA1MCkNCg0KSTMgPSBNZW1vcmlhICgwIGEgMzApDQpgYGANCg0KU2kgZmlqYW1vczoNCg0KXFsNClxsYW1iZGFfMSA9IDENClxdDQoNCmVudG9uY2VzOiANCg0KLSBMYSBpbnRlbGlnZW5jaWEgcXVlZGEgbWVkaWRhIGFwcm94aW1hZGFtZW50ZSBlbiBsYSBtaXNtYSBlc2NhbGEgcXVlIEkxLg0KDQotIEVzIGRlY2lyLCBJMSBzZSBjb252aWVydGUgZW4gbGEgcmVmZXJlbmNpYSBwYXJhIG1lZGlyIGxhIGludGVsaWdlbmNpYS4NCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCg0KIyMjIEFuYWxvZ8OtYQ0KDQpTaSBxdWVyZW1vcyBtZWRpciB1bmEgZGlzdGFuY2lhIHBvZGVtb3MgZXNjb2dlcjoNCg0KYGBgdGV4dA0KTWV0cm9zDQoNCktpbMOzbWV0cm9zDQoNCk1pbGxhcw0KYGBgDQoNClRvZGFzIHJlcHJlc2VudGFuIGxhIG1pc21hIGRpc3RhbmNpYS4NCg0KQXF1w60gb2N1cnJlIGFsZ28gc2ltaWxhcjoNCg0KYGBgdGV4dA0KSW50ZWxpZ2VuY2lhDQpgYGANCg0Kc2UgbWlkZSB1c2FuZG8gY29tbyByZWZlcmVuY2lhIGVsIGluZGljYWRvciBJMS4NCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCg0KIyMjIFZlbnRhamFzDQoNCi0gRXMgZWwgbcOpdG9kbyBtw6FzIHV0aWxpemFkby4NCg0KLSBUaWVuZSB1bmEgaW50ZXJwcmV0YWNpw7NuIHNlbmNpbGxhLg0KDQo8IS0tICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUgLS0+DQo8IS0tIFNlcGFyYWRvciAtLT4NCg0KDQojIyMgRGVzdmVudGFqYXMNCg0KLSBMb3MgcmVzdWx0YWRvcyBkZXBlbmRlbiBwYXJjaWFsbWVudGUgZGVsIGluZGljYWRvciBlbGVnaWRvIGNvbW8gcmVmZXJlbmNpYS4NCg0KDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQojIEVzY2FsYTogY29kaWZpY2FjacOzbiBkZSBlZmVjdG9zDQoNCkxhIGlkZWEgY29uc2lzdGUgZW4gZmlqYXIgZWwgcHJvbWVkaW8gZGUgbGFzIGNhcmdhcyBmYWN0b3JpYWxlcyBlbiAxLg0KDQpQb3IgZWplbXBsbzoNCg0KXFsNClxsYW1iZGFfMStcbGFtYmRhXzIrXGxhbWJkYV8zPTMNClxdDQoNCm8gZXF1aXZhbGVudGVtZW50ZToNCg0KXFsNClxmcmFje1xsYW1iZGFfMStcbGFtYmRhXzIrXGxhbWJkYV8zfXszfT0xDQpcXQ0KDQo8IS0tICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUgLS0+DQo8IS0tIFNlcGFyYWRvciAtLT4NCg0KDQojIyMgSW50ZXJwcmV0YWNpw7NuDQoNCi0gTmluZ8O6biBpbmRpY2Fkb3IgZGVmaW5lIHBvciBzw60gc29sbyBsYSBlc2NhbGEgZGVsIGZhY3Rvci4NCg0KLSBUb2RvcyBsb3MgaW5kaWNhZG9yZXMgcGFydGljaXBhbiBjb25qdW50YW1lbnRlIGVuIGxhIGRlZmluaWNpw7NuIGRlIGxhIHVuaWRhZCBkZSBtZWRpZGEuDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQoNCiMjIyBFamVtcGxvDQoNClN1cG9uZ2E6DQoNClxbDQpcbGFtYmRhXzEgPSAwLjgNClxdDQoNClxbDQpcbGFtYmRhXzIgPSAxLjENClxdDQoNClxbDQpcbGFtYmRhXzMgPSAxLjENClxdDQoNCkVudG9uY2VzOg0KDQpcWw0KXGZyYWN7MC44KzEuMSsxLjF9ezN9PTENClxdDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQoNCiMjIyBBbmFsb2fDrWENCg0KVmFyaWFibGUgbWFyY2Fkb3I6DQoNCmBgYHRleHQNCkxhIGVzY2FsYSBkZXBlbmRlIGRlIEkxDQpgYGANCg0KQ29kaWZpY2FjacOzbiBkZSBlZmVjdG9zOg0KDQpgYGB0ZXh0DQpMYSBlc2NhbGEgZGVwZW5kZSBkZWwgcHJvbWVkaW8gZGUgSTEsIEkyIGUgSTMNCmBgYA0KDQpQb3IgZXN0YSByYXrDs24sIG5pbmfDum4gaW5kaWNhZG9yIGRvbWluYSBjb21wbGV0YW1lbnRlIGxhIGRlZmluaWNpw7NuIGRlIGxhIGVzY2FsYS4NCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCg0KIyMjIFZlbnRhamFzDQoNCi0gUmVkdWNlIGxhIGRlcGVuZGVuY2lhIGRlIHVuIMO6bmljbyBpbmRpY2Fkb3IuDQoNCi0gVXRpbGl6YSB0b2RhIGxhIGluZm9ybWFjacOzbiBkaXNwb25pYmxlLg0KDQo8IS0tICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUgLS0+DQo8IS0tIFNlcGFyYWRvciAtLT4NCg0KDQojIyMgRGVzdmVudGFqYXMNCg0KLSBTdSBpbnRlcnByZXRhY2nDs24gZXMgbWVub3MgaW50dWl0aXZhLg0KDQotIEVzIG1lbm9zIHV0aWxpemFkYSBlbiBjdXJzb3MgaW50cm9kdWN0b3Jpb3MuDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQojIENvbXBhcmFjacOzbiBkZSBsb3MgbcOpdG9kb3MgZGUgZXNjYWxhDQoNCg0KYGBge3IsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQoNCmxpYnJhcnkoa25pdHIpDQpsaWJyYXJ5KGthYmxlRXh0cmEpDQoNCnRhYmxhX2VzY2FsYSA8LSBkYXRhLmZyYW1lKA0KICBgTcOpdG9kbyBkZSBlc2NhbGFgID0gYygNCiAgICAiTGF0ZW50ZSBlc3RhbmRhcml6YWRhIiwNCiAgICAiVmFyaWFibGUgbWFyY2Fkb3IiLA0KICAgICJDb2RpZmljYWNpw7NuIGRlIGVmZWN0b3MiDQogICksDQogIGBSZXN0cmljY2nDs24gaW1wdWVzdGFgID0gYygNCiAgICAiVmFyKM63KSA9IDEiLA0KICAgICLOu+KCgSA9IDEiLA0KICAgICJQcm9tZWRpbyjOuykgPSAxIg0KICApLA0KICBgVW5pZGFkIGRlbCBmYWN0b3JgID0gYygNCiAgICAiRGVzdmlhY2lvbmVzIGVzdMOhbmRhciIsDQogICAgIkluZGljYWRvciBkZSByZWZlcmVuY2lhIiwNCiAgICAiUHJvbWVkaW8gZGUgbG9zIGluZGljYWRvcmVzIg0KICApLA0KICBgSW50ZXJwcmV0YWNpw7NuYCA9IGMoDQogICAgIkVsIGZhY3RvciBzZSBleHByZXNhIGVuIHVuaWRhZGVzIGVzdGFuZGFyaXphZGFzIiwNCiAgICAiRWwgZmFjdG9yIGFkb3B0YSBsYSBlc2NhbGEgZGVsIGluZGljYWRvciBtYXJjYWRvciIsDQogICAgIkVsIGZhY3RvciBhZG9wdGEgdW5hIGVzY2FsYSBwcm9tZWRpbyBkZSBsb3MgaW5kaWNhZG9yZXMiDQogICkNCikNCg0Ka2FibGUoDQogIHRhYmxhX2VzY2FsYSwNCiAgYWxpZ24gPSBjKCJsIiwiYyIsImwiLCJsIiksDQogIGNvbC5uYW1lcyA9IGMoDQogICAgIk3DqXRvZG8iLA0KICAgICJSZXN0cmljY2nDs24iLA0KICAgICJVbmlkYWQiLA0KICAgICJJbnRlcnByZXRhY2nDs24iDQogICksDQogIGNhcHRpb24gPSAiQ29tcGFyYWNpw7NuIGRlIGxvcyBwcmluY2lwYWxlcyBtw6l0b2RvcyBwYXJhIGRlZmluaXIgbGEgZXNjYWxhIGRlIHVuYSB2YXJpYWJsZSBsYXRlbnRlIiwgDQogIGZvcm1hdD0iaHRtbCINCikgJT4lDQogIGthYmxlX3N0eWxpbmcoKSAlPiUNCiAga2FibGVfY2xhc3NpY18yKGZ1bGxfd2lkdGggPSBGQUxTRSkNCmBgYA0KDQoNCg0KDQoNCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCiMgUmVzdW1lbg0KDQpgYGB7ciwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmxpYnJhcnkoa25pdHIpDQpsaWJyYXJ5KGthYmxlRXh0cmEpDQoNCnRhYmxhX2VzY2FsYSA8LSBkYXRhLmZyYW1lKA0KICBNw6l0b2RvID0gYygNCiAgICAiTGF0ZW50ZSBlc3RhbmRhcml6YWRhIiwNCiAgICAiVmFyaWFibGUgbWFyY2Fkb3IiLA0KICAgICJDb2RpZmljYWNpw7NuIGRlIGVmZWN0b3MiDQogICksDQogIFJlc3RyaWNjacOzbiA9IGMoDQogICAgIlZhcijOtykgPSAxIiwNCiAgICAizrvigoEgPSAxIiwNCiAgICAiUHJvbWVkaW8gZGUgY2FyZ2FzID0gMSINCiAgKSwNCiAgVW5pZGFkID0gYygNCiAgICAiRGVzdmlhY2lvbmVzIGVzdMOhbmRhciIsDQogICAgIkluZGljYWRvciBkZSByZWZlcmVuY2lhIiwNCiAgICAiUHJvbWVkaW8gZGUgaW5kaWNhZG9yZXMiDQogICksDQogIEludGVycHJldGFjacOzbiA9IGMoDQogICAgIkVzY2FsYSBlbiBkZXN2aWFjaW9uZXMgZXN0w6FuZGFyIiwNCiAgICAiTGEgZXNjYWxhIGRlcGVuZGUgZGUgdW4gaW5kaWNhZG9yIGRlIHJlZmVyZW5jaWEiLA0KICAgICJMYSBlc2NhbGEgZGVwZW5kZSBkZWwgcHJvbWVkaW8gZGUgbG9zIGluZGljYWRvcmVzIg0KICApDQopDQoNCmthYmxlKA0KICB0YWJsYV9lc2NhbGEsDQogIGFsaWduID0gYygibCIsImMiLCJsIiwibCIpLA0KICBjb2wubmFtZXMgPSBjKA0KICAgICJNw6l0b2RvIiwNCiAgICAiUmVzdHJpY2Npw7NuIiwNCiAgICAiVW5pZGFkIiwNCiAgICAiSW50ZXJwcmV0YWNpw7NuIg0KICApLA0KICBjYXB0aW9uID0gIkNvbXBhcmFjacOzbiBkZSBsb3MgcHJpbmNpcGFsZXMgbcOpdG9kb3MgcGFyYSBkZWZpbmlyIGxhIGVzY2FsYSBkZSB1bmEgdmFyaWFibGUgbGF0ZW50ZSIsDQogIGZvcm1hdD0iaHRtbCINCikgJT4lDQogIGthYmxlX3N0eWxpbmcoKSAlPiUNCiAga2FibGVfY2xhc3NpY18yKGZ1bGxfd2lkdGggPSBGQUxTRSkNCmBgYA0KDQo8IS0tICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUgLS0+DQo8IS0tIFNlcGFyYWRvciAtLT4NCg0KDQojIyMgSWRlYSBjbGF2ZQ0KDQoNCi0gTG9zIHRyZXMgbcOpdG9kb3MgcHJvZHVjZW4gZXNlbmNpYWxtZW50ZSBlbCBtaXNtbyBtb2RlbG8gdGXDs3JpY28geSBlbCBtaXNtbyBhanVzdGUgZ2xvYmFsLiANCg0KLSBMYSBkaWZlcmVuY2lhIHJhZGljYSDDum5pY2FtZW50ZSBlbiBsYSBmb3JtYSBlbiBxdWUgc2UgZGVmaW5lIGxhIHVuaWRhZCBkZSBtZWRpZGEgZGUgbGEgdmFyaWFibGUgbGF0ZW50ZTogDQogICAgDQogICAtICoqVmFyaWFibGUgbGF0ZW50ZSBlc3RhbmRhcml6YWRhOioqIGVsIGZhY3RvciBzZSBtaWRlIGVuIGRlc3ZpYWNpb25lcyBlc3TDoW5kYXIuDQogICAgDQogICAtICoqVmFyaWFibGUgbWFyY2Fkb3I6KiogZWwgZmFjdG9yIGFkb3B0YSBsYSBlc2NhbGEgZGUgdW4gaW5kaWNhZG9yIGRlIHJlZmVyZW5jaWEuDQogICAgDQogICAtICoqQ29kaWZpY2FjacOzbiBkZSBlZmVjdG9zOioqIGVsIGZhY3RvciBhZG9wdGEgdW5hIGVzY2FsYSBiYXNhZGEgZW4gZWwgcHJvbWVkaW8gZGUgbG9zIGluZGljYWRvcmVzLg0KICAgIA0KDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQojIFRpcG9zIGRlIHJlbGFjaW9uZXMgZW50cmUgdmFyaWFibGVzDQoNCkVuIHVuIFNFTSwgc2UgcHVlZGVuIGRlZmluaXIgdmFyaW9zIHRpcG9zIGRlIHJlbGFjaW9uZXMgZW50cmUgdmFyaWFibGVzLiBBIGNvbnRpbnVhY2nDs24gc2UgZGVzY3JpYmVuIGVzdG9zIHRpcG9zIGRlIHJlbGFjaW9uZXMuDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQojIyMgQ292YXJpYWNpw7NuDQoNClNlIHJlZmllcmUgYSBsYSByZWxhY2nDs24gZW50cmUgZG9zIHZhcmlhYmxlcyBxdWUgdmFyw61hbiBqdW50YXMsIHBlcm8gc2luIGltcGxpY2FyIGNhdXNhbGlkYWQuIEluZGljYSBxdWUgY3VhbmRvIHVuYSB2YXJpYWJsZSBjYW1iaWEsIGxhIG90cmEgdGFtYmnDqW4gbG8gaGFjZSwgcGVybyBubyBuZWNlc2FyaWFtZW50ZSBwb3JxdWUgdW5hIGNhdXNlIGEgbGEgb3RyYS4NCg0KKipFamVtcGxvLioqDQoNCkxhIHJlbGFjacOzbiBlbnRyZSBsYSBjYW50aWRhZCBkZSBoZWxhZG9zIHZlbmRpZG9zIHkgZWwgbsO6bWVybyBkZSBwZXJzb25hcyBxdWUgdmFuIGEgbGEgcGxheWEuIEVzdGFzIGRvcyB2YXJpYWJsZXMgY292YXLDrWFuIHBvcnF1ZSBhbWJhcyBhdW1lbnRhbiBkdXJhbnRlIGVsIHZlcmFubywgcGVybyB1bmEgbm8gY2F1c2EgZGlyZWN0YW1lbnRlIGEgbGEgb3RyYS4gVsOpYXNlIGxhIGZpZ3VyYSBcQHJlZihmaWc6UmVsYWNpb24xKS4gDQoNCg0KPGNlbnRlcj4NCmBgYHtyIFJlbGFjaW9uMSwgZWNobz1GQUxTRSwgZmlnLmNhcCA9ICIqKkNvdmFyaWFjacOzbioqIiwgb3V0LndpZHRoID0gIjUwJSJ9DQojIGZpZy53aWR0aCA9IDIwICMgTm8gZnVuY2lvbmEgZXN0YSBvcGNpb24gZW4gZWwgY2h1bmsNCg0KI2h0dHA6Ly96ZXZyb3NzLmNvbS9ibG9nLzIwMTcvMDYvMTkvdGlwcy1hbmQtdHJpY2tzLWZvci13b3JraW5nLXdpdGgtaW1hZ2VzLWFuZC1maWd1cmVzLWluLXItbWFya2Rvd24tZG9jdW1lbnRzLw0KIyBQYWdpbmEgMzU5IGRlIFIyMDE1LUZyaWVuZGx5DQoNCmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKCJSZWxhY2lvbjEucG5nIikNCg0KI090cmEgbWFuZXJhLCBwZXJvICBzYWxlIGVsIGNhcHRpb246DQojPGNlbnRlcj4NCiMhWygjZmlnOkZpZy1jYXB0aW9uKSBNaSBmaWd1cmFdKE5vbWJyZS5wbmcpe3dpZHRoPTQwMHB4fQ0KIzwvY2VudGVyPg0KYGBgDQo8L2NlbnRlcj4NCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCiMjIyBDYXVzYWxpZGFkDQoNCkVuIFNFTSwgdW5hIHJlbGFjacOzbiBjYXVzYWwgcmVwcmVzZW50YSB1bmEgKipoaXDDs3Rlc2lzIHRlw7NyaWNhIGRlIGluZmx1ZW5jaWEqKiBlbnRyZSBkb3MgdmFyaWFibGVzLiBFc3RhIGhpcMOzdGVzaXMgcHJvcG9uZSBxdWUgdW5hIHZhcmlhYmxlIHB1ZWRlIGluZmx1aXIgc29icmUgb3RyYSB5IHNlIHJlcHJlc2VudGEgbWVkaWFudGUgdW5hIGZsZWNoYSB1bmlkaXJlY2Npb25hbC4NCg0KRXMgaW1wb3J0YW50ZSBhY2xhcmFyIHF1ZSB1bmEgZmxlY2hhIGVuIHVuIGRpYWdyYW1hIFNFTSAqKm5vIGRlbXVlc3RyYSBjYXVzYWxpZGFkKiouIExhIGZsZWNoYSBzb2xvIGluZGljYSBxdWUgZWwgaW52ZXN0aWdhZG9yIHByb3BvbmUgdW5hIGRpcmVjY2nDs24gZGUgaW5mbHVlbmNpYSBjb24gYmFzZSBlbiBsYSB0ZW9yw61hLg0KDQoqKkVqZW1wbG8uKioNCg0KTGEgdGVvcsOtYSBlY29uw7NtaWNhIHN1Z2llcmUgcXVlIHVuIG1heW9yIG5pdmVsIGRlIGVkdWNhY2nDs24gcHVlZGUgZmF2b3JlY2VyIG1lam9yZXMgb3BvcnR1bmlkYWRlcyBsYWJvcmFsZXMgeSwgZW4gY29uc2VjdWVuY2lhLCBtYXlvcmVzIHNhbGFyaW9zLiBFc3RhIGhpcMOzdGVzaXMgcHVlZGUgcmVwcmVzZW50YXJzZSBtZWRpYW50ZSB1bmEgcmVsYWNpw7NuIGRpcmVjY2lvbmFsIGVudHJlIGVkdWNhY2nDs24geSBzYWxhcmlvLiBWw6lhc2UgbGEgZmlndXJhIFxAcmVmKGZpZzpSZWxhY2lvbjIpLg0KDQoNCg0KPGNlbnRlcj4NCmBgYHtyIFJlbGFjaW9uMiwgZWNobz1GQUxTRSwgZmlnLmNhcCA9ICIqKkNhdXNhbGlkYWQqKiIsIG91dC53aWR0aCA9ICI1MCUifQ0KIyBmaWcud2lkdGggPSAyMCAjIE5vIGZ1bmNpb25hIGVzdGEgb3BjaW9uIGVuIGVsIGNodW5rDQoNCiNodHRwOi8vemV2cm9zcy5jb20vYmxvZy8yMDE3LzA2LzE5L3RpcHMtYW5kLXRyaWNrcy1mb3Itd29ya2luZy13aXRoLWltYWdlcy1hbmQtZmlndXJlcy1pbi1yLW1hcmtkb3duLWRvY3VtZW50cy8NCiMgUGFnaW5hIDM1OSBkZSBSMjAxNS1GcmllbmRseQ0KDQprbml0cjo6aW5jbHVkZV9ncmFwaGljcygiUmVsYWNpb24yLnBuZyIpDQoNCiNPdHJhIG1hbmVyYSwgcGVybyAgc2FsZSBlbCBjYXB0aW9uOg0KIzxjZW50ZXI+DQojIVsoI2ZpZzpGaWctY2FwdGlvbikgTWkgZmlndXJhXShOb21icmUucG5nKXt3aWR0aD00MDBweH0NCiM8L2NlbnRlcj4NCmBgYA0KPC9jZW50ZXI+DQoNCkVuIGxhIGZpZ3VyYSwgbGEgZmxlY2hhIGluZGljYSBxdWUgZWwgKipuaXZlbCBkZSBlZHVjYWNpw7NuKiogc2UgcHJvcG9uZSBjb21vIHVuYSBwb3NpYmxlIHZhcmlhYmxlIGV4cGxpY2F0aXZhIGRlbCAqKnNhbGFyaW8qKi4NCg0KUG9yIHRhbnRvLCBsYSBpbnRlcnByZXRhY2nDs24gY29ycmVjdGEgbm8gZXM6DQoNCmBgYHRleHQNCiJMYSBlZHVjYWNpw7NuIGNhdXNhIGVsIHNhbGFyaW8uIg0KYGBgDQoNCnNpbm86DQoNCmBgYHRleHQNCiJTZWfDum4gbGEgdGVvcsOtYSwgc2UgcHJvcG9uZSBxdWUgZWwgbml2ZWwgZGUgZWR1Y2FjacOzbiBwdWVkZSBpbmZsdWlyIHNvYnJlIGVsIHNhbGFyaW8uIg0KYGBgDQoNCkVsIFNFTSBwZXJtaXRlIGV2YWx1YXIgc2kgZXN0YSBoaXDDs3Rlc2lzIGVzIGNvbXBhdGlibGUgY29uIGxvcyBkYXRvcyBvYnNlcnZhZG9zLCBwZXJvIG5vIHBydWViYSBjYXVzYWxpZGFkIHBvciBzw60gbWlzbW8uDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQojIyMgUmVsYWNpw7NuIGVzcHVyaWENCg0KU2UgZGEgY3VhbmRvIGRvcyB2YXJpYWJsZXMgcGFyZWNlbiBlc3RhciByZWxhY2lvbmFkYXMsIHBlcm8gZXN0YSByZWxhY2nDs24gZXMgY2F1c2FkYSBwb3IgdW5hIHRlcmNlcmEgdmFyaWFibGUgcXVlIGFmZWN0YSBhIGFtYmFzLiBMYSByZWxhY2nDs24gZW50cmUgbGFzIGRvcyB2YXJpYWJsZXMgbm8gZXMgZGlyZWN0YSBzaW5vIHF1ZSBlcyBtZWRpYWRhIHBvciBlc3RhIHRlcmNlcmEgdmFyaWFibGUuDQoNCioqRWplbXBsby4qKg0KDQpFbCB0YW1hw7FvIGRlbCBwaWUgeSBsYSBoYWJpbGlkYWQgcGFyYSBsZWVyIGVuIG5pw7Fvcy4gQXVucXVlIHB1ZWRlbiBwYXJlY2VyIHJlbGFjaW9uYWRvcywgYW1ib3MgZXN0w6FuIGluZmx1ZW5jaWFkb3MgcG9yIGxhIGVkYWQgZGVsIG5pw7FvLCBxdWUgZXMgbGEgdmVyZGFkZXJhIGNhdXNhIHN1YnlhY2VudGUgZGUgbGEgcmVsYWNpw7NuLiBWw6lhc2UgbGEgZmlndXJhIFxAcmVmKGZpZzpSZWxhY2lvbjMpLiANCg0KDQo8Y2VudGVyPg0KYGBge3IgUmVsYWNpb24zLCBlY2hvPUZBTFNFLCBmaWcuY2FwID0gIioqUmVsYWNpw7NuIGVzcHVyaWEqKiIsIG91dC53aWR0aCA9ICI0MCUifQ0KIyBmaWcud2lkdGggPSAyMCAjIE5vIGZ1bmNpb25hIGVzdGEgb3BjaW9uIGVuIGVsIGNodW5rDQoNCiNodHRwOi8vemV2cm9zcy5jb20vYmxvZy8yMDE3LzA2LzE5L3RpcHMtYW5kLXRyaWNrcy1mb3Itd29ya2luZy13aXRoLWltYWdlcy1hbmQtZmlndXJlcy1pbi1yLW1hcmtkb3duLWRvY3VtZW50cy8NCiMgUGFnaW5hIDM1OSBkZSBSMjAxNS1GcmllbmRseQ0KIyANCg0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoIlJlbGFjaW9uMy5wbmciKQ0KDQojT3RyYSBtYW5lcmEsIHBlcm8gIHNhbGUgZWwgY2FwdGlvbjoNCiM8Y2VudGVyPg0KIyFbKCNmaWc6RmlnLWNhcHRpb24pIE1pIGZpZ3VyYV0oTm9tYnJlLnBuZyl7d2lkdGg9NDAwcHh9DQojPC9jZW50ZXI+DQpgYGANCjwvY2VudGVyPg0KDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQojIyMgQ2F1c2FsaWRhZCBkaXJlY3RhDQoNCk9jdXJyZSBjdWFuZG8gdW5hIHZhcmlhYmxlIGRpcmVjdGFtZW50ZSBhZmVjdGEgYSBvdHJhIHNpbiBsYSBpbnRlcnZlbmNpw7NuIGRlIG90cmFzIHZhcmlhYmxlcy4gRW4gZWwgZGlhZ3JhbWEgZGUgU0VNLCBlc3RvIHNlIHJlcHJlc2VudGEgY29uIHVuYSBmbGVjaGEgcXVlIHZhIGRpcmVjdGFtZW50ZSBkZSBsYSB2YXJpYWJsZSBjYXVzYSBhIGxhIHZhcmlhYmxlIGVmZWN0by4NCg0KKipFamVtcGxvLioqDQoNCkVsIHRlbnJlIHVuIGVtcGxlbyAodmFyaWFibGUgaW5kZXBlbmRpZW50ZSkgaW5jcmVtZW50YSBsb3MgaW5ncmVzb3MgKHZhcmlhYmxlIGRlcGVuZGllbnRlKS4gVsOpYXNlIGxhIGZpZ3VyYSBcQHJlZihmaWc6UmVsYWNpb240KS4gDQoNCjxjZW50ZXI+DQpgYGB7ciBSZWxhY2lvbjQsIGVjaG89RkFMU0UsIGZpZy5jYXAgPSAiKipDYXVzYWxpZGFkIGRpcmVjdGEqKiIsIG91dC53aWR0aCA9ICI2MCUifQ0KIyBmaWcud2lkdGggPSAyMCAjIE5vIGZ1bmNpb25hIGVzdGEgb3BjaW9uIGVuIGVsIGNodW5rDQoNCiNodHRwOi8vemV2cm9zcy5jb20vYmxvZy8yMDE3LzA2LzE5L3RpcHMtYW5kLXRyaWNrcy1mb3Itd29ya2luZy13aXRoLWltYWdlcy1hbmQtZmlndXJlcy1pbi1yLW1hcmtkb3duLWRvY3VtZW50cy8NCiMgUGFnaW5hIDM1OSBkZSBSMjAxNS1GcmllbmRseQ0KIyANCiNrbml0cjo6aW5jbHVkZV9ncmFwaGljcygiUmVsYWNpb240LnBuZyIpDQprbml0cjo6aW5jbHVkZV9ncmFwaGljcygiUmVsYWNpb241LnBuZyIpDQoNCiNPdHJhIG1hbmVyYSwgcGVybyAgc2FsZSBlbCBjYXB0aW9uOg0KIzxjZW50ZXI+DQojIVsoI2ZpZzpGaWctY2FwdGlvbikgTWkgZmlndXJhXShOb21icmUucG5nKXt3aWR0aD00MDBweH0NCiM8L2NlbnRlcj4NCmBgYA0KPC9jZW50ZXI+DQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQojIyMgQ2F1c2FsaWRhZCBpbmRpcmVjdGENCg0KU2UgcmVmaWVyZSBhIHVuYSBzaXR1YWNpw7NuIGVuIGxhIHF1ZSB1bmEgdmFyaWFibGUgYWZlY3RhIGEgb3RyYSBhIHRyYXbDqXMgZGUgdW5hIG8gbcOhcyB2YXJpYWJsZXMgaW50ZXJtZWRpYXMgKG1lZGlhZG9yYXMpLiBFbiB1biBkaWFncmFtYSBTRU0sIGVzdG8gc2UgbXVlc3RyYSBjb21vIHVuYSBjYWRlbmEgZGUgZmxlY2hhcyBxdWUgcGFzYW4gcG9yIHVuYSBvIG3DoXMgdmFyaWFibGVzIG1lZGlhZG9yYXMgYW50ZXMgZGUgbGxlZ2FyIGEgbGEgdmFyaWFibGUgb2JqZXRpdm8uDQoNCioqRWplbXBsby4qKg0KDQpMYSBlZHVjYWNpw7NuIGFmZWN0YSBsb3MgaW5ncmVzb3MgYSB0cmF2w6lzIGRlbCBlbXBsZW8uIExhIGVkdWNhY2nDs24gKHZhcmlhYmxlIGluZGVwZW5kaWVudGUpIGF1bWVudGEgbGEgcHJvYmFiaWxpZGFkIGRlIG9idGVuZXIgdW4gZW1wbGVvICh2YXJpYWJsZSBtZWRpYWRvcmEpLCBsbyBjdWFsIGEgc3UgdmV6IGluY3JlbWVudGEgbG9zIGluZ3Jlc29zICh2YXJpYWJsZSBkZXBlbmRpZW50ZSkuIFbDqWFzZSBsYSBmaWd1cmEgXEByZWYoZmlnOlJlbGFjaW9uNSkuIA0KDQoNCjxjZW50ZXI+DQpgYGB7ciBSZWxhY2lvbjUsIGVjaG89RkFMU0UsIGZpZy5jYXAgPSAiKipDYXVzYWxpZGFkIGluZGlyZWN0YSoqIiwgb3V0LndpZHRoID0gIjQwJSJ9DQojIGZpZy53aWR0aCA9IDIwICMgTm8gZnVuY2lvbmEgZXN0YSBvcGNpb24gZW4gZWwgY2h1bmsNCg0KI2h0dHA6Ly96ZXZyb3NzLmNvbS9ibG9nLzIwMTcvMDYvMTkvdGlwcy1hbmQtdHJpY2tzLWZvci13b3JraW5nLXdpdGgtaW1hZ2VzLWFuZC1maWd1cmVzLWluLXItbWFya2Rvd24tZG9jdW1lbnRzLw0KIyBQYWdpbmEgMzU5IGRlIFIyMDE1LUZyaWVuZGx5DQoNCmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKCJSZWxhY2lvbjUucG5nIikNCg0KI090cmEgbWFuZXJhLCBwZXJvICBzYWxlIGVsIGNhcHRpb246DQojPGNlbnRlcj4NCiMhWygjZmlnOkZpZy1jYXB0aW9uKSBNaSBmaWd1cmFdKE5vbWJyZS5wbmcpe3dpZHRoPTQwMHB4fQ0KIzwvY2VudGVyPg0KYGBgDQo8L2NlbnRlcj4NCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCiMjIyBDYXVzYWxpZGFkIHJlY8OtcHJvY2ENCg0KU2UgcHJlc2VudGEgY3VhbmRvIGRvcyB2YXJpYWJsZXMgc2UgYWZlY3RhbiBtdXR1YW1lbnRlLiBDYWRhIHZhcmlhYmxlIGVzIGEgbGEgdmV6IGNhdXNhIHkgZWZlY3RvIGRlIGxhIG90cmEuIEVuIHVuIGRpYWdyYW1hIFNFTSwgZXN0byBzZSByZXByZXNlbnRhIGNvbiBmbGVjaGFzIGJpZGlyZWNjaW9uYWxlcyBlbnRyZSBsYXMgZG9zIHZhcmlhYmxlcy4NCg0KKipFamVtcGxvLioqDQoNCkVzdHLDqXMgeSBwcm9ibGVtYXMgZGUgc2FsdWQuIEVsIGVzdHLDqXMgcHVlZGUgY2F1c2FyIHByb2JsZW1hcyBkZSBzYWx1ZCwgeSBhIHN1IHZleiwgbG9zIHByb2JsZW1hcyBkZSBzYWx1ZCBwdWVkZW4gYXVtZW50YXIgZWwgbml2ZWwgZGUgZXN0csOpcy4gRXN0YSByZWxhY2nDs24gZXMgYmlkaXJlY2Npb25hbC4gVsOpYXNlIGxhIGZpZ3VyYSBcQHJlZihmaWc6UmVsYWNpb242KS4gDQoNCg0KPGNlbnRlcj4NCmBgYHtyIFJlbGFjaW9uNiwgZWNobz1GQUxTRSwgZmlnLmNhcCA9ICIqKkNhdXNhbGlkYWQgcmVjw61wcm9jYSoqIiwgb3V0LndpZHRoID0gIjYwJSJ9DQojIGZpZy53aWR0aCA9IDIwICMgTm8gZnVuY2lvbmEgZXN0YSBvcGNpb24gZW4gZWwgY2h1bmsNCg0KI2h0dHA6Ly96ZXZyb3NzLmNvbS9ibG9nLzIwMTcvMDYvMTkvdGlwcy1hbmQtdHJpY2tzLWZvci13b3JraW5nLXdpdGgtaW1hZ2VzLWFuZC1maWd1cmVzLWluLXItbWFya2Rvd24tZG9jdW1lbnRzLw0KIyBQYWdpbmEgMzU5IGRlIFIyMDE1LUZyaWVuZGx5DQoNCmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKCJSZWxhY2lvbjYucG5nIikNCg0KI090cmEgbWFuZXJhLCBwZXJvICBzYWxlIGVsIGNhcHRpb246DQojPGNlbnRlcj4NCiMhWygjZmlnOkZpZy1jYXB0aW9uKSBNaSBmaWd1cmFdKE5vbWJyZS5wbmcpe3dpZHRoPTQwMHB4fQ0KIzwvY2VudGVyPg0KYGBgDQo8L2NlbnRlcj4NCg0KDQo8IS0tICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUgLS0+DQo8IS0tIFNlcGFyYWRvciAtLT4NCg0KIyMjIERpYWdyYW1hcyBlc3RydWN0dXJhbGVzDQoNCkNvbW8gZWplbXBsbywgdsOpYXNlIGxhIGZpZ3VyYSBcQHJlZihmaWc6UmVsYWNpb243KS4gDQoNCg0KPGNlbnRlcj4NCmBgYHtyIFJlbGFjaW9uNywgZWNobz1GQUxTRSwgZmlnLmNhcCA9ICIqKkVqZW1wbG8gZGUgdW4gZGlhZ3JhbWEgZXN0cnVjdHVyYWwqKiIsIG91dC53aWR0aCA9ICI4MCUifQ0KIyBmaWcud2lkdGggPSAyMCAjIE5vIGZ1bmNpb25hIGVzdGEgb3BjaW9uIGVuIGVsIGNodW5rDQoNCiNodHRwOi8vemV2cm9zcy5jb20vYmxvZy8yMDE3LzA2LzE5L3RpcHMtYW5kLXRyaWNrcy1mb3Itd29ya2luZy13aXRoLWltYWdlcy1hbmQtZmlndXJlcy1pbi1yLW1hcmtkb3duLWRvY3VtZW50cy8NCiMgUGFnaW5hIDM1OSBkZSBSMjAxNS1GcmllbmRseQ0KDQprbml0cjo6aW5jbHVkZV9ncmFwaGljcygiUmVsYWNpb243LnBuZyIpDQoNCiNPdHJhIG1hbmVyYSwgcGVybyAgc2FsZSBlbCBjYXB0aW9uOg0KIzxjZW50ZXI+DQojIVsoI2ZpZzpGaWctY2FwdGlvbikgTWkgZmlndXJhXShOb21icmUucG5nKXt3aWR0aD00MDBweH0NCiM8L2NlbnRlcj4NCmBgYA0KPC9jZW50ZXI+DQoNCg0KKipPYnNlcnZhY2lvbmVzLioqDQoNCjEuIExvcyBlZmVjdG9zIGRpcmVjdG9zIHNlIGluZGljYW4gY29uIGZsZWNoYXMgcmVjaGFzLiANCg0KMi4gRWwgZmluYWwgZGUgbGEgZmxlY2hhIGVzIGxhIHZhcmlhYmxlIGRlcGVuZGllbnRlLg0KDQozLiBMYXMgZXN0aW1hY2lvbmVzIGRlbG9zIHBhcsOhbWV0cm9zIHNpZW1wcmUgYXBhcmVjZW4gc29icmUgbGEgZmxlY2hhIGNvcnJlc3BvbmRpZW50ZS4NCg0KNC4gQ3VhbHF1aWVyIHZhcmlhYmxlIHF1ZSBzZWEgaW5mbHVlbmNpYWRhIHBvciBvdHJhIHZhcmlhYmxlIGRlbCBtb2RlbG8gZGViZSB0ZW5lciB1biB0w6lybWlubyBkZSBlcnJvci4gDQoNCjUuIEFsZ3Vub3MgcHJvZ3JhbWFzIHRhbWJpw6luIHN1ZWxlbiBtb3N0cmFyOiANCiAgICANCiAgICArIEp1bnRvIGEgY2FkYSB2YXJpYWJsZSwgc3UgdmFyaWFuemEuDQogICAgDQogICAgKyBFbiBlbCBjYXNvIGRlIGxhcyB2YXJpYWJsZXMgZGVwZW5kaWVudGVzLCBsYSBwcm9wb3JjacOzbiBkZSB2YXJpYW56YSBleHBsaWNhZGEgY29ycmVzcG9uZGllbnRlLg0KICAgIA0KDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQojIENvbXBvbmVudGVzIGRlIHVuIFNFTQ0KDQojIyMgVGlwb3MNCg0KMS4gU29uIGRvczogKk1vZGVsbyBkZSBtZWRpZGEqIHkgKm1vZGVsbyBlc3RydWN0dXJhbCouIE3DoXMgYWRlbGFudGUsIHNlIGV4cGxpY2EgY2FkYSB1bm8gZGUgZWxsb3MuIA0KDQoyLiBBbCBzdXN0aXR1aXIgZW4gZWwgbW9kZWxvIGRlIG1lZGlkYSBsYXMgcmVsYWNpb25lcyBkZSBjb3ZhcmlhbnphIHBvciBsYXMgcmVsYWNpb25lcyBjYXVzYWxlcyBkZSBsYSBwYXJ0ZSBlc3RydWN0dXJhbCwgc2Ugb2J0aWVuZSBlbCAqbW9kZWxvIGVzdHJ1Y3R1cmFsIGNvbXBsZXRvKiwgdGFtYmnDqW4gZGVub21pbmFkbyAqbW9kZWxvIGRlIHJlZ3Jlc2nDs24gZXN0cnVjdHVyYWwqLg0KDQo8IS0tICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUgLS0+DQo8IS0tIFNlcGFyYWRvciAtLT4NCg0KIyMjIE1vZGVsbyBkZSBtZWRpZGENCiAgDQogIA0KMS4gQ29tcHVlc3RvIHBvciBsYXMgcmVsYWNpb25lcyBlbnRyZSBsYXMgdmFyaWFibGVzIGluZGljYWRvcmFzIGRlbCBtb2RlbG8geSBzdXMgY29uc3RydWN0b3MgbGF0ZW50ZXMuIA0KDQoyLiBBc8OtIGNvbW8gcG9yIGxhcyByZWxhY2lvbmVzIGRlIGNvdmFyaWFuemEgZW50cmUgbGFzIHZhcmlhYmxlcyBsYXRlbnRlcy4gDQoNCjMuIENhZGEgY29uc3RydWN0byBsYXRlbnRlIHkgc3VzIGluZGljYWRvcmVzIGZvcm1hbiB1bmEgcGFydGUgZGVsIG1vZGVsbyBkZSBtZWRpZGEuDQoNCjQuIFRhbWJpw6luIGNvbm9jaWRvIGNvbW8gaW5zdHJ1bWVudG8gZGUgbWVkaWRhIHkgZXMgZWwgbW9kZWxvIHByb3B1ZXN0byBwYXJhICJtZWRpciIgbGFzIHZhcmlhYmxlcyBsYXRlbnRlcy4gDQoNCjUuIEVzdGUgbW9kZWxvIGNvcnJlc3BvbmRlIGEgdW4gYW7DoWxpc2lzIGZhY3RvcmlhbCBjb25maXJtYXRvcmlvLGVuIGVsIHF1ZSBjYWRhIHZhcmlhYmxlIGxhdGVudGUgc2UgYXNvY2lhIGNvbiB1biBncnVwbyBkZSB2YXJpYWJsZXMgb2JzZXJ2YWRhcywgeSBhZGVtw6FzIHNlIHBlcm1pdGUgcXVlIGxhcyB2YXJpYWJsZXMgbGF0ZW50ZXMgZXN0w6luIGNvcnJlbGFjaW9uYWRhcyBlbnRyZSBzw60uDQoNCjYuIFbDqWFzZSBsYSBmaWd1cmEgXEByZWYoZmlnOlJlbGFjaW9uOCkuIA0KDQoNCjxjZW50ZXI+DQpgYGB7ciBSZWxhY2lvbjgsIGVjaG89RkFMU0UsIGZpZy5jYXAgPSAiKipNb2RlbG8gZGUgbWVkaWRhKioiLCBvdXQud2lkdGggPSAiNTAlIn0NCiMgZmlnLndpZHRoID0gMjAgIyBObyBmdW5jaW9uYSBlc3RhIG9wY2lvbiBlbiBlbCBjaHVuaw0KDQojaHR0cDovL3pldnJvc3MuY29tL2Jsb2cvMjAxNy8wNi8xOS90aXBzLWFuZC10cmlja3MtZm9yLXdvcmtpbmctd2l0aC1pbWFnZXMtYW5kLWZpZ3VyZXMtaW4tci1tYXJrZG93bi1kb2N1bWVudHMvDQojIFBhZ2luYSAzNTkgZGUgUjIwMTUtRnJpZW5kbHkNCg0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoIlJlbGFjaW9uOC5wbmciKQ0KDQojT3RyYSBtYW5lcmEsIHBlcm8gIHNhbGUgZWwgY2FwdGlvbjoNCiM8Y2VudGVyPg0KIyFbKCNmaWc6RmlnLWNhcHRpb24pIE1pIGZpZ3VyYV0oTm9tYnJlLnBuZyl7d2lkdGg9NDAwcHh9DQojPC9jZW50ZXI+DQpgYGANCjwvY2VudGVyPg0KDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQojIyMgTW9kZWxvIGVzdHJ1Y3R1cmFsDQoNCjEuIFNlIHJlZmllcmUgYSBsYXMgaW50ZXJyZWxhY2lvbmVzIGNhdXNhbGVzIHByb3B1ZXN0YXMgZW50cmUgbGFzIHZhcmlhYmxlcyBsYXRlbnRlcyBkZWwgbW9kZWxvLg0KDQoyLiBFcyBsYSBwYXJ0ZSBkZWwgbW9kZWxvIHF1ZSBlbXBsZWEgZWwgYW7DoWxpc2lzIGRlIGNhbWlub3MgKHBhdGggYW5hbHlzaXMpLCBwZXJvIGNvbiB2YXJpYWJsZXMgYWxhdGVudGVzLiANCg0KMy4gRXMgc2ltaWxhciBhIHVuIGFuw6FsaXNpcyBkZSByZWdyZXNpw7NuLiANCg0KNC4gVsOpYXNlIGxhIGZpZ3VyYSBcQHJlZihmaWc6UmVsYWNpb245KS4gDQoNCg0KPGNlbnRlcj4NCmBgYHtyIFJlbGFjaW9uOSwgZWNobz1GQUxTRSwgZmlnLmNhcCA9ICIqKk1vZGVsbyBlc3RydWN0dXJhbCoqIiwgb3V0LndpZHRoID0gIjIwJSJ9DQojIGZpZy53aWR0aCA9IDIwICMgTm8gZnVuY2lvbmEgZXN0YSBvcGNpb24gZW4gZWwgY2h1bmsNCg0KI2h0dHA6Ly96ZXZyb3NzLmNvbS9ibG9nLzIwMTcvMDYvMTkvdGlwcy1hbmQtdHJpY2tzLWZvci13b3JraW5nLXdpdGgtaW1hZ2VzLWFuZC1maWd1cmVzLWluLXItbWFya2Rvd24tZG9jdW1lbnRzLw0KIyBQYWdpbmEgMzU5IGRlIFIyMDE1LUZyaWVuZGx5DQoNCmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKCJSZWxhY2lvbjkucG5nIikNCg0KI090cmEgbWFuZXJhLCBwZXJvICBzYWxlIGVsIGNhcHRpb246DQojPGNlbnRlcj4NCiMhWygjZmlnOkZpZy1jYXB0aW9uKSBNaSBmaWd1cmFdKE5vbWJyZS5wbmcpe3dpZHRoPTQwMHB4fQ0KIzwvY2VudGVyPg0KYGBgDQo8L2NlbnRlcj4NCg0KDQo8IS0tICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUgLS0+DQo8IS0tIFNlcGFyYWRvciAtLT4NCg0KIyMjIE1vZGVsbyBlc3RydWN0dXJhbCBjb21wbGV0bw0KDQpWw6lhc2UgbGEgZmlndXJhIFxAcmVmKGZpZzpSZWxhY2lvbjEwKS4gDQoNCg0KPGNlbnRlcj4NCmBgYHtyIFJlbGFjaW9uMTAsIGVjaG89RkFMU0UsIGZpZy5jYXAgPSAiKipNb2RlbG8gZXN0cnVjdHVyYWwgY29tcGxldG8qKiIsIG91dC53aWR0aCA9ICI1MCUifQ0KIyBmaWcud2lkdGggPSAyMCAjIE5vIGZ1bmNpb25hIGVzdGEgb3BjaW9uIGVuIGVsIGNodW5rDQoNCiNodHRwOi8vemV2cm9zcy5jb20vYmxvZy8yMDE3LzA2LzE5L3RpcHMtYW5kLXRyaWNrcy1mb3Itd29ya2luZy13aXRoLWltYWdlcy1hbmQtZmlndXJlcy1pbi1yLW1hcmtkb3duLWRvY3VtZW50cy8NCiMgUGFnaW5hIDM1OSBkZSBSMjAxNS1GcmllbmRseQ0KDQprbml0cjo6aW5jbHVkZV9ncmFwaGljcygiUmVsYWNpb24xMC5wbmciKQ0KDQojT3RyYSBtYW5lcmEsIHBlcm8gIHNhbGUgZWwgY2FwdGlvbjoNCiM8Y2VudGVyPg0KIyFbKCNmaWc6RmlnLWNhcHRpb24pIE1pIGZpZ3VyYV0oTm9tYnJlLnBuZyl7d2lkdGg9NDAwcHh9DQojPC9jZW50ZXI+DQpgYGANCjwvY2VudGVyPg0KDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQojIE90cm9zIHRpcG9zIGRlIG1vZGVsb3MNCg0KIyMjIE1vZGVsbyBmYWN0b3JpYWwgZXhwbG9yYXRvcmlvIHZzIGNvbmZpcm1hdG9yaW8NCg0KMS4gRWwgbW9kZWxvIGRlIHZhcmlhYmxlcyBsYXRlbnRlcyAoTFZNKSBjcmVhIGxhcyB2YXJpYWJsZXMgbGF0ZW50ZXMgKExWcykgZW1wbGVhZGFzIGVuIGVsIG1vZGVsbyBlc3RydWN0dXJhbC4gDQoNCjIuIEN1YW5kbyB1biBMVk0gc2UgZXhhbWluYSBzaW4gdW4gbW9kZWxvIGVzdHJ1Y3R1cmFsLCBzZSBjb25vY2Ugb2Nhc2lvbmFsbWVudGUgY29tbyAqKmFuw6FsaXNpcyBmYWN0b3JpYWwgY29uZmlybWF0b3JpbyoqIChDRkEpLiANCg0KMy4gU2kgbm8gc2UgdHV2aWVyYSB1bmEgZXN0cnVjdHVyYSBoaXBvdMOpdGljYSBwYXJhIGVsIG1vZGVsbyBkZSB2YXJpYWJsZXMgbGF0ZW50ZXMsIHNlIHRyYXRhcsOtYSBkZSB1biAqKmFuw6FsaXNpcyBmYWN0b3JpYWwgZXhwbG9yYXRvcmlvKiogKEVGQSkuDQoNCjQuIFbDqWFzZSBsYSBmaWd1cmEgXEByZWYoZmlnOlJlbGFjaW9uMTEpLiANCg0KDQo8Y2VudGVyPg0KYGBge3IgUmVsYWNpb24xMSwgZWNobz1GQUxTRSwgZmlnLmNhcCA9ICIqKk1vZGVsbyBmYWN0b3JpYWwgZXhwbG9yYXRvcmlvIHZzIGNvbmZpcm1hdG9yaW8qKiIsIG91dC53aWR0aCA9ICI4MCUifQ0KIyBmaWcud2lkdGggPSAyMCAjIE5vIGZ1bmNpb25hIGVzdGEgb3BjaW9uIGVuIGVsIGNodW5rDQoNCiNodHRwOi8vemV2cm9zcy5jb20vYmxvZy8yMDE3LzA2LzE5L3RpcHMtYW5kLXRyaWNrcy1mb3Itd29ya2luZy13aXRoLWltYWdlcy1hbmQtZmlndXJlcy1pbi1yLW1hcmtkb3duLWRvY3VtZW50cy8NCiMgUGFnaW5hIDM1OSBkZSBSMjAxNS1GcmllbmRseQ0KDQprbml0cjo6aW5jbHVkZV9ncmFwaGljcygiUmVsYWNpb24xMS5wbmciKQ0KDQojT3RyYSBtYW5lcmEsIHBlcm8gIHNhbGUgZWwgY2FwdGlvbjoNCiM8Y2VudGVyPg0KIyFbKCNmaWc6RmlnLWNhcHRpb24pIE1pIGZpZ3VyYV0oTm9tYnJlLnBuZyl7d2lkdGg9NDAwcHh9DQojPC9jZW50ZXI+DQpgYGANCjwvY2VudGVyPg0KDQoNCg0KDQo8IS0tICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUgLS0+DQo8IS0tIFNlcGFyYWRvciAtLT4NCg0KIyMjIE1vZGVsbyBmb3JtYXRpdm8gdnMgcmVmbGVjdGl2bw0KDQoxLiBFeGlzdGVuIGRvcyB0aXBvcyBkZSB2YXJpYWJsZXMgbGF0ZW50ZXM6ICpyZWZsZWN0aXZhcyogeSAqZm9ybWF0aXZhcyouIA0KDQoyLiBTZSBjb25zaWRlcmEgcXVlIGxhcyB2YXJpYWJsZXMgbGF0ZW50ZXMgKipyZWZsZWN0aXZhcyoqIGNhdXNhbiBsYSBjb3ZhcmlhY2nDs24gZGUgb3RyYXMgdmFyaWFibGVzLiANCg0KMy4gTGFzIHZhcmlhYmxlcyBsYXRlbnRlcyAqKmZvcm1hdGl2YXMqKiBzb24gZWwgcmVzdWx0YWRvIGRlIGxhIGNvdmFyaWFjacOzbiBkZSBvdHJhcyB2YXJpYWJsZXMgKHNpbWlsYXIgYSB1biBtb2RlbG8gZGUgcmVncmVzacOzbikuDQoNCjQuIFbDqWFzZSBsYSBmaWd1cmEgXEByZWYoZmlnOlJlbGFjaW9uMTIpLiANCg0KDQo8Y2VudGVyPg0KYGBge3IgUmVsYWNpb24xMiwgZWNobz1GQUxTRSwgZmlnLmNhcCA9ICIqKk1vZGVsbyBmb3JtYXRpdm8gdnMgcmVmbGVjdGl2byoqIiwgb3V0LndpZHRoID0gIjgwJSJ9DQojIGZpZy53aWR0aCA9IDIwICMgTm8gZnVuY2lvbmEgZXN0YSBvcGNpb24gZW4gZWwgY2h1bmsNCg0KI2h0dHA6Ly96ZXZyb3NzLmNvbS9ibG9nLzIwMTcvMDYvMTkvdGlwcy1hbmQtdHJpY2tzLWZvci13b3JraW5nLXdpdGgtaW1hZ2VzLWFuZC1maWd1cmVzLWluLXItbWFya2Rvd24tZG9jdW1lbnRzLw0KIyBQYWdpbmEgMzU5IGRlIFIyMDE1LUZyaWVuZGx5DQoNCmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKCJSZWxhY2lvbjEyLnBuZyIpDQoNCiNPdHJhIG1hbmVyYSwgcGVybyAgc2FsZSBlbCBjYXB0aW9uOg0KIzxjZW50ZXI+DQojIVsoI2ZpZzpGaWctY2FwdGlvbikgTWkgZmlndXJhXShOb21icmUucG5nKXt3aWR0aD00MDBweH0NCiM8L2NlbnRlcj4NCmBgYA0KPC9jZW50ZXI+DQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQojIyMgTW9kZWxvcyBkZSBzZWd1bmRvIG9yZGVuDQoNClbDqWFzZSBsYSBmaWd1cmEgXEByZWYoZmlnOlJlbGFjaW9uMTMpLiANCg0KDQo8Y2VudGVyPg0KYGBge3IgUmVsYWNpb24xMywgZWNobz1GQUxTRSwgZmlnLmNhcCA9ICIqKk1vZGVsb3MgZGUgc2VndW5kbyBvcmRlbioqIiwgb3V0LndpZHRoID0gIjEwMCUifQ0KIyBmaWcud2lkdGggPSAyMCAjIE5vIGZ1bmNpb25hIGVzdGEgb3BjaW9uIGVuIGVsIGNodW5rDQoNCiNodHRwOi8vemV2cm9zcy5jb20vYmxvZy8yMDE3LzA2LzE5L3RpcHMtYW5kLXRyaWNrcy1mb3Itd29ya2luZy13aXRoLWltYWdlcy1hbmQtZmlndXJlcy1pbi1yLW1hcmtkb3duLWRvY3VtZW50cy8NCiMgUGFnaW5hIDM1OSBkZSBSMjAxNS1GcmllbmRseQ0KDQprbml0cjo6aW5jbHVkZV9ncmFwaGljcygiUmVsYWNpb24xMy5wbmciKQ0KDQojT3RyYSBtYW5lcmEsIHBlcm8gIHNhbGUgZWwgY2FwdGlvbjoNCiM8Y2VudGVyPg0KIyFbKCNmaWc6RmlnLWNhcHRpb24pIE1pIGZpZ3VyYV0oTm9tYnJlLnBuZyl7d2lkdGg9NDAwcHh9DQojPC9jZW50ZXI+DQpgYGANCjwvY2VudGVyPg0KDQoNCg0KDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQojIFByb2NlZGltaWVudG8gcGFyYSBlamVjdXRhciB1biBTRU0NCg0KIyMjIEV0YXBhIDE6IFZhbGlkYWNpw7NuIGRlbCBtb2RlbG8gZGUgbWVkaWRhDQoNCjEuIEltcGxpY2EgcmVhbGl6YXIgdW4gQW7DoWxpc2lzIGZhY3RvcmlhbCBDb25maXJtYXRvcmlvIChBRkMpLCBwcm9wb25pZW5kbyBsb3MgaW5kaWNhZG9yZXMgZGUgY2FkYSB2YXJpYWJsZSBsYXRlbnRlIHkNCmV2YWx1YW5kbyBlbiBmb3JtYSBjb25qdW50YSBsYSBib25kYWQgZGUgYWp1c3RlIGRlIGxvcyBpbnN0cnVtZW50b3MgZGUgbWVkaWRhIGVtcGxlYWRvcyBwYXJhIGNhZGEgZmFjdG9yLg0KDQoyLiBTaWduaWZpY2EgcmVlbXBsYXphciBsb3MgZWZlY3RvcyBkaXJlY3RvcyBlIGluZGlyZWN0b3MgZGVsIGNvbXBvbmVudGUgZXN0cnVjdHVyYWwgcHJvcHVlc3RvcyBzZWfDum4gbGEgdGVvcsOtYSBwb3IgcmVsYWNpb25lcyBkZSBjb3ZhcmlhbnphIGVudHJlIGxhcyB2YXJpYWJsZXMgbGF0ZW50ZXMuDQoNCjMuIFNpIGVsIGFqdXN0ZSBlcyByZWNoYXphZG8gc2UgYXBsaWNhbiBoZXJyYW1pZW50YXMgZGUgcmVlc3BlY2lmaWNhY2nDs24uDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQojIyMgRXRhcGEgMjogQWp1c3RlIGRlbCBtb2RlbG8gY29tcGxldG8gZGUgZWN1YWNpb25lcyBlc3RydWN0dXJhbGVzDQoNCjEuIEVzIGVsIGFqdXN0ZSBkZWwgU0VNIGluY29ycG9yYW5kbyBsYXMgbW9kaWZpY2FjaW9uZXMgZGUgbGEgZXRhcGEgYW50ZXJpb3IuDQoNCjIuIEluY2x1eWUgbGEgY29tcGFyYWNpw7NuIGNvbiBvdHJvcyBtb2RlbG9zIGFsdGVybmF0aXZvcyBxdWUgZGlmaWVyYW4gZW4gbGEgcGFydGUgZXN0cnVjdHVyYWwsIHNpIGxvcyBodWJpZXJhLCB1dGlsaXphbmRvIHBhcmEgZXN0byBjb250cmFzdGVzIGRlIGNvbXBhcmFjacOzbiBkZSBtb2RlbG9zLg0KDQo8IS0tICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUgLS0+DQo8IS0tIFNlcGFyYWRvciAtLT4NCg0KIyBQYXNvcyBlbiBjYWRhIHVuYSBkZSBsYXMgZXRhcGFzDQoNClNvbiBsb3Mgc2lndWllbnRlcyAoY2FkYSB1bm8gc2UgZXhwbGljYXLDoSBtw6FzIGFkZWxhbnRlKTogDQoNCjEuIEVzcGVjaWZpY2FjacOzbi4NCg0KMi4gSWRlbnRpZmljYWNpw7NuLg0KDQozLiBFdmFsdWFjacOzbiBkZSBsYSBjYWxpZGFkIGRlIGxhIGJhc2UgZGUgZGF0b3MuDQoNCjQuIEVzdGltYWNpw7NuIGRlIHBhcsOhbWV0cm9zLg0KDQo1LiBFdmFsdWFjacOzbiBkZSBsYSBib25kYWQgZGUgYWp1c3RlLg0KDQo2LiBSZS1lc3BlY2lmaWNhY2nDs24gZGVsIG1vZGVsby4NCg0KDQpWw6lhc2UgbGEgZmlndXJhIFxAcmVmKGZpZzpSZWxhY2lvbjE3KS4gDQoNCg0KPGNlbnRlcj4NCmBgYHtyIFJlbGFjaW9uMTcsIGVjaG89RkFMU0UsIGZpZy5jYXAgPSAiKipQYXNvcyBlbiBjYWRhIHVuYSBkZSBsYXMgZXRhcGFzKioiLCBvdXQud2lkdGggPSAiNzAlIn0NCiMgZmlnLndpZHRoID0gMjAgIyBObyBmdW5jaW9uYSBlc3RhIG9wY2lvbiBlbiBlbCBjaHVuaw0KDQojaHR0cDovL3pldnJvc3MuY29tL2Jsb2cvMjAxNy8wNi8xOS90aXBzLWFuZC10cmlja3MtZm9yLXdvcmtpbmctd2l0aC1pbWFnZXMtYW5kLWZpZ3VyZXMtaW4tci1tYXJrZG93bi1kb2N1bWVudHMvDQojIFBhZ2luYSAzNTkgZGUgUjIwMTUtRnJpZW5kbHkNCg0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoIlJlbGFjaW9uMTcucG5nIikNCg0KI090cmEgbWFuZXJhLCBwZXJvICBzYWxlIGVsIGNhcHRpb246DQojPGNlbnRlcj4NCiMhWygjZmlnOkZpZy1jYXB0aW9uKSBNaSBmaWd1cmFdKE5vbWJyZS5wbmcpe3dpZHRoPTQwMHB4fQ0KIzwvY2VudGVyPg0KYGBgDQo8L2NlbnRlcj4NCg0KDQo8IS0tICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUgLS0+DQo8IS0tIFNlcGFyYWRvciAtLT4NCg0KIyBFc3BlY2lmaWNhY2nDs24NCg0KDQoxLiBFbCBtb2RlbG8gc2UgZGVmaW5lIGNvbiBiYXNlIGVuIGxvcyBjb25vY2ltaWVudG9zIHRlw7NyaWNvcyB5IGFudGVjZWRlbnRlcyBlbXDDrXJpY29zIGRlbCB0ZW1hIGVzdHVkaWFkby4gDQoNCjIuIFNlIGRlYmVuIGluY2x1aXIgw7puaWNhbWVudGUgbGFzIHZhcmlhYmxlcyBlc2VuY2lhbGVzIHF1ZSBjdWVudGVuIGNvbiB1biBmdWVydGUgcmVzcGFsZG8gdGXDs3JpY28geSBlbXDDrXJpY28uIA0KDQozLiBFcyBjcnVjaWFsIGRldGVybWluYXIgbGFzIHJlbGFjaW9uZXMgZW50cmUgdmFyaWFibGVzIGxhdGVudGVzIGUgaW5kaWNhZG9yYXMsIGFzdW1pZW5kbyBxdWUgY3VhbHF1aWVyIHJlbGFjacOzbiBubyBlc3BlY2lmaWNhZGEgbm8gZXhpc3RlLiANCg0KNC4gRXMgcmVjb21lbmRhYmxlIHJlYWxpemFyIHVuIGFuw6FsaXNpcyBmYWN0b3JpYWwgZXhwbG9yYXRvcmlvIChBRkUpIHByZXZpbyBwYXJhIHZhbGlkYXIgbyByZXZhbGlkYXIgbGFzIGVzY2FsYXMgdXRpbGl6YWRhcyBlbiBsYSBtZWRpY2nDs24gZGUgY2FkYSB2YXJpYWJsZSBsYXRlbnRlLiANCg0KNS4gU2Vnw7puIGxhIHJlZ2xhIGRlIEtlbm55ICgxOTc5KSwgZWwgbsO6bWVybyBkZSBmYWN0b3JlcyBwb3IgZmFjdG9yIGRlYmUgc2VyOiBtw61uaW1vIDIsIDMgZXMgYnVlbm8sIDQgZXMgw7NwdGltbywgeSA1IG8gbcOhcyBlcyBleGNlc2l2bywgcGVybyBubyBzZSBkZWJlbiBleGNlZGVyIGxvcyAyMCBmYWN0b3JlcyBwYXJhIHRvZG8gZWwgU0VNLg0KDQo2LiBFbiBlc3RhIGV0YXBhIHNlIGRldGVybWluYSBxdcOpIHBhcsOhbWV0cm9zIHNlcsOhbiBlc3RpbWFkb3MgeSBjdcOhbGVzIHNlIG1hbnRlbmRyw6FuIGNvbnN0YW50ZXMuDQoNCjcuIEFkZW3DoXMsIHNlIGFzdW1lIGxhIGZvcm1hIGRlIGxhIGRpc3RyaWJ1Y2nDs24gY29uanVudGEsIHVzdWFsbWVudGUgdW5hIG5vcm1hbGlkYWQgbXVsdGl2YXJpYWRhLg0KDQo4LiBMbyBtw6FzIGNvbcO6biBlcyBkaXNlw7FhciBlbCBtb2RlbG8gdXRpbGl6YW5kbyB1biBkaWFncmFtYSBlc3RydWN0dXJhbC4gDQoNCjkuIEEgcGFydGlyIGRlIGVzdGUgZ3LDoWZpY28sIGVsIHNvZnR3YXJlIGdlbmVyYSBsYXMgZWN1YWNpb25lcyBkZWwgbW9kZWxvIGF1dG9tw6F0aWNhbWVudGUuDQoNCjEwLiBMYSBpbnRlcmZheiBncsOhZmljYSB0YW1iacOpbiBwZXJtaXRlIGHDsWFkaXIgZGlyZWN0YW1lbnRlIGVuIGVsIGRpYWdyYW1hIGxhcyByZXN0cmljY2lvbmVzIHF1ZSBzZSBpbXBvbmVuIGhhYml0dWFsbWVudGUgc29icmUgbG9zIHBhcsOhbWV0cm9zIHBhcmEgbG9zIHNpZ3VpZW50ZXMgcGFzb3MgZGVsIGFuw6FsaXNpcy4NCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCiMgSWRlbnRpZmljYWNpw7NuDQoNCiMjIyBJZGVudGlmaWNhY2nDs24gKGRlZmluaWNpw7NuKQ0KDQpVbiBtb2RlbG8gZXN0w6EgaWRlbnRpZmljYWRvIGN1YW5kbyB0b2RvcyB5IGNhZGEgdW5vIGRlIHN1cyBwYXLDoW1ldHJvcyBwdWVkZW4gc2VyIGVzdGltYWRvcyBkZSBtYW5lcmEgw7puaWNhIGEgcGFydGlyIGRlIGxhIG1hdHJpeiBkZSB2YXJpYW56YXMgeSBjb3ZhcmlhbnphcyBtdWVzdHJhbGVzLg0KDQo8IS0tICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUgLS0+DQo8IS0tIFNlcGFyYWRvciAtLT4NCg0KIyMjIElkZW50aWZpY2FjacOzbiAoY29uZGljaW9uZXMpDQoNClNlIGRlYmVuIGN1bXBsaXIgbGFzIHNpZ3VpZW50ZXMgY29uZGljaW9uZXMgbmVjZXNhcmlhcyBwYXJhIGxhIGlkZW50aWZpY2FjacOzbjoNCg0KKipDb25kaWNpw7NuIDEuKioNCg0KU2kgdGVuZW1vcyAkSyQgdmFyaWFibGVzIG9ic2VydmFibGVzLCBlbnRvbmNlcywgbGEgY2FudGlkYWQgZGUgZGF0b3MgJHAkIChlcyBkZWNpciwgbGEgY2FudGlkYWQgZGUgdmFyaWFuemFzIHkgY292YXJpYW56YXMgbXVlc3RyYWxlcykgZGViZSBzZXIgc3VmaWNpZW50ZSBwYXJhIGVzdGltYXIgZWwgbsO6bWVybyBkZSBwYXLDoW1ldHJvcyAoJHEkKSBkZWwgbW9kZWxvLiBFc3RhIGVzIGxhIHJlZ2xhIGNsw6FzaWNhIGRlIGNvbnRlbyBzZWfDum4gbGEgY3VhbCBsb3MgZ3JhZG9zIGRlIGxpYmVydGFkIGRlYmVuIHNlciBtYXlvcmVzIG8gaWd1YWxlcyBhIGNlcm86IA0KJCRcdGV4dHtHcmFkb3MgZGUgbGliZXJ0YWR9IFw7PVw7IHAgLSBxIFw7PVw7IFxmcmFje0soSyArIDEpfXsyfSAtIHEgXDsgXGdlcSBcOyAwJCQNCg0KKipDb25kaWNpw7NuIDIuKioNCg0KRGViZSBkZWZpbmlyc2UgbGEgZXNjYWxhIGRlIGxvcyBlcnJvcmVzICh2w6lhc2UgbGEgZmlndXJhIFxAcmVmKGZpZzpSZWxhY2lvbjE0KSk6ICANCiAgICANCiAgMS4gTG9zIGNvZWZpY2llbnRlcyBkZSBzdXMgZWZlY3RvcyBkaXJlY3RvcyBzb2JyZSBsYXMgaW5kaWNhZG9yYXMgeSBsYXMgbGF0ZW50ZXMgZW5kw7NnZW5hcyBzZSBmaWphbiBlbiAxLiANCiAgICANCiANCioqQ29uZGljacOzbiAzLioqIA0KDQpUYW1iacOpbiBkZWJlIGRlZmluaWVyc2UgbGEgZXNjYWxhIGRlIGxvcyBmYWN0b3JlcyBsYXRlbnRlcy4gTGFzIG9wY2lvbmVzIGhhYml0dWFsZXMgc29uIGZpamFyIGVuIDEgKHbDqWFzZSBsYSBmaWd1cmEgXEByZWYoZmlnOlJlbGFjaW9uMTQpKToNCiAgICAgIA0KICAxLiBMYSBjYXJnYSBmYWN0b3JpYWwgYXNvY2lhZGEgYSB1bmEgZGUgbGFzIHZhcmlhYmxlcyBvYnNlcnZhZGFzIChkZSByZWZlcmVuY2lhKSBkZSBjYWRhIGxhdGVudGUgbyANCiAgICAgIA0KICAyLiBMYSB2YXJpYW56YSBkZSBsYXMgdmFyaWFibGVzIGxhdGVudGVzIGV4w7NnZW5hcy4NCg0KDQoNCjxjZW50ZXI+DQpgYGB7ciBSZWxhY2lvbjE0LCBlY2hvPUZBTFNFLCBmaWcuY2FwID0gIioqSWRlbnRpZmljYWNpw7NuIChjb25kaWNpb25lcyAyIHkgMykqKiIsIG91dC53aWR0aCA9ICI0MCUifQ0KIyBmaWcud2lkdGggPSAyMCAjIE5vIGZ1bmNpb25hIGVzdGEgb3BjaW9uIGVuIGVsIGNodW5rDQoNCiNodHRwOi8vemV2cm9zcy5jb20vYmxvZy8yMDE3LzA2LzE5L3RpcHMtYW5kLXRyaWNrcy1mb3Itd29ya2luZy13aXRoLWltYWdlcy1hbmQtZmlndXJlcy1pbi1yLW1hcmtkb3duLWRvY3VtZW50cy8NCiMgUGFnaW5hIDM1OSBkZSBSMjAxNS1GcmllbmRseQ0KDQprbml0cjo6aW5jbHVkZV9ncmFwaGljcygiUmVsYWNpb24xNC5wbmciKQ0KDQojT3RyYSBtYW5lcmEsIHBlcm8gIHNhbGUgZWwgY2FwdGlvbjoNCiM8Y2VudGVyPg0KIyFbKCNmaWc6RmlnLWNhcHRpb24pIE1pIGZpZ3VyYV0oTm9tYnJlLnBuZyl7d2lkdGg9NDAwcHh9DQojPC9jZW50ZXI+DQpgYGANCjwvY2VudGVyPg0KDQo8IS0tICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUgLS0+DQo8IS0tIFNlcGFyYWRvciAtLT4NCg0KIyMjIElkZW50aWZpY2FjacOzbiAob2JzZXJ2YWNpb25lcykNCiANCg0KMS4gUXVlIHNlIGhheWEgaWRlbnRpZmljYWRvIGNvbXBsZXRhbWVudGUgZWwgbW9kZWxvIGRlIGVjdWFjaW9uZXMgZXN0cnVjdHVyYWxlcyAoU0VNKSBubyBhc2VndXJhIHF1ZSBlbCBtb2RlbG8gZGUgbWVkaWRhIHRhbWJpw6luIGxvIGVzdMOpLiANCg0KMi4gUGFyYSBsb3MgbW9kZWxvcyBkZSBtZWRpZGEgYmFzYWRvcyBlbiBhbsOhbGlzaXMgZmFjdG9yaWFsIGNvbmZpcm1hdG9yaW8gKEFGQykgY29udmVuY2lvbmFsZXMsIGRvbmRlIGNhZGEgaW5kaWNhZG9yIHNlIGFzb2NpYSDDum5pY2FtZW50ZSBhIHVuIGZhY3RvciB5IGxvcyBlcnJvcmVzIGRlIG1lZGljacOzbiBubyBlc3TDoW4gY29ycmVsYWNpb25hZG9zLCBlcyBuZWNlc2FyaW8gY3VtcGxpciBjb24gbGFzIHNpZ3VpZW50ZXMgcmVnbGFzIHF1ZSBzZSBkZXNjcmliZW4gZW4gbGEgc2VjY2nDs24gc2lndWllbnRlOg0KICAgIA0KICAgICsgUmVnbGEgZGUgbG9zIHRyZXMgaW5kaWNhZG9yZXMuDQogICAgDQogICAgKyBSZWdsYSBkZSBsb3MgZG9zIGluZGljYWRvcmVzLg0KDQo8IS0tICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUgLS0+DQo8IS0tIFNlcGFyYWRvciAtLT4NCg0KIyMjIElkZW50aWZpY2FjacOzbiAoUmVnbGEgZGUgbG9zIHRyZXMgaW5kaWNhZG9yZXMpDQoNClNpIGVsIG1vZGVsbyB0aWVuZSB1bmEgc29sYSB2YXJpYWJsZSBsYXRlbnRlLCBkZWJlIGluY2x1aXIgYWwgbWVub3MgdHJlcyBpbmRpY2Fkb3JlcyAodsOpYXNlIGxhIGZpZ3VyYSBcQHJlZihmaWc6UmVsYWNpb24xNSkpLg0KDQo8Y2VudGVyPg0KYGBge3IgUmVsYWNpb24xNSwgZWNobz1GQUxTRSwgZmlnLmNhcCA9ICIqKklkZW50aWZpY2FjacOzbiAocmVnbGEgZGUgbG9zIHRyZXMgaW5kaWNhZG9yZXMpKioiLCBvdXQud2lkdGggPSAiNzAlIn0NCiMgZmlnLndpZHRoID0gMjAgIyBObyBmdW5jaW9uYSBlc3RhIG9wY2lvbiBlbiBlbCBjaHVuaw0KDQojaHR0cDovL3pldnJvc3MuY29tL2Jsb2cvMjAxNy8wNi8xOS90aXBzLWFuZC10cmlja3MtZm9yLXdvcmtpbmctd2l0aC1pbWFnZXMtYW5kLWZpZ3VyZXMtaW4tci1tYXJrZG93bi1kb2N1bWVudHMvDQojIFBhZ2luYSAzNTkgZGUgUjIwMTUtRnJpZW5kbHkNCg0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoIlJlbGFjaW9uMTUucG5nIikNCg0KI090cmEgbWFuZXJhLCBwZXJvICBzYWxlIGVsIGNhcHRpb246DQojPGNlbnRlcj4NCiMhWygjZmlnOkZpZy1jYXB0aW9uKSBNaSBmaWd1cmFdKE5vbWJyZS5wbmcpe3dpZHRoPTQwMHB4fQ0KIzwvY2VudGVyPg0KYGBgDQo8L2NlbnRlcj4NCg0KDQoNCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCiMjIyBJZGVudGlmaWNhY2nDs24gKFJlZ2xhIGRlIGxvcyBkb3MgaW5kaWNhZG9yZXMpDQoNClNpIGVsIG1vZGVsbyBpbmNsdXllIGRvcyBvIG3DoXMgdmFyaWFibGVzIGxhdGVudGVzLCBjYWRhIHVuYSBkZSBlbGxhcyBkZWJlIHRlbmVyIGFsIG1lbm9zIGRvcyBpbmRpY2Fkb3JlcyAodsOpYXNlIGxhIGZpZ3VyYSBcQHJlZihmaWc6UmVsYWNpb24xNikpLg0KDQo8Y2VudGVyPg0KYGBge3IgUmVsYWNpb24xNiwgZWNobz1GQUxTRSwgZmlnLmNhcCA9ICIqKklkZW50aWZpY2FjacOzbiAocmVnbGEgZGUgbG9zIGRvcyBpbmRpY2Fkb3JlcykqKiIsIG91dC53aWR0aCA9ICI3MCUifQ0KIyBmaWcud2lkdGggPSAyMCAjIE5vIGZ1bmNpb25hIGVzdGEgb3BjaW9uIGVuIGVsIGNodW5rDQoNCiNodHRwOi8vemV2cm9zcy5jb20vYmxvZy8yMDE3LzA2LzE5L3RpcHMtYW5kLXRyaWNrcy1mb3Itd29ya2luZy13aXRoLWltYWdlcy1hbmQtZmlndXJlcy1pbi1yLW1hcmtkb3duLWRvY3VtZW50cy8NCiMgUGFnaW5hIDM1OSBkZSBSMjAxNS1GcmllbmRseQ0KDQprbml0cjo6aW5jbHVkZV9ncmFwaGljcygiUmVsYWNpb24xNi5wbmciKQ0KDQojT3RyYSBtYW5lcmEsIHBlcm8gIHNhbGUgZWwgY2FwdGlvbjoNCiM8Y2VudGVyPg0KIyFbKCNmaWc6RmlnLWNhcHRpb24pIE1pIGZpZ3VyYV0oTm9tYnJlLnBuZyl7d2lkdGg9NDAwcHh9DQojPC9jZW50ZXI+DQpgYGANCjwvY2VudGVyPg0KDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQpgYGB7ciBldmFsPUZBTFNFLCBlY2hvPUZBTFNFfQ0KTk8gRVNUw4EgUEFSQUZSQVNFQURPDQoNCklkZW50aWZpY2FjacOzbiAoY29udC4pIA0KDQpSZWdsYXMgZGUgS2VubnksIEthc2h5IHkgQm9sZ2VyICgxOTk4KSBwYXJhIEFGQyBubyBjb252ZW5jaW9uYWxlcyAoaW5kaWNhZG9yZXMgY29uDQpjYXJnYXMgZmFjdG9yaWFsZXMgZW4gbWFzIGRlIHVuIGZhY3RvciB5L28gY29uIGVycm9yZXMgZGUgbWVkaWNpw7NuIGNvcnJlbGFjaW9uYWRvcyk6DQrvgqcgRW4gbW9kZWxvcyBjb24gZXNjYWxhcyB1bmlkaW1lbnNpb25hbGVzIChlc3RydWN0dXJhIGZhY3RvcmlhbCBzaW1wbGUpIGNvbiB0w6lybWlub3MgZGUNCmVycm9yIGNvcnJlbGFjaW9uYWRvczoNCu+CpyBQYXJhIGNhZGEgZmFjdG9yIGRlYmUgY3VtcGxpcnNlIGFsZ3VuYSBkZSBsYXMgc2lndWllbnRlcyBzaXR1YWNpb25lczoNCjEuIFRlbmVyIGFsIG1lbm9zIHRyZXMgaW5kaWNhZG9yZXMgY3V5b3MgZXJyb3JlcyBubyBlc3TDqW4gY29ycmVsYWNpb25hZG9zIGVudHJlIHPDrS4NCjIuIFRlbmVyIGFsIG1lbm9zIGRvcyBpbmRpY2Fkb3JlcyBjdXlvcyBlcnJvcmVzIG5vIGVzdMOpbiBjb3JyZWxhY2lvbmFkb3MgZW50cmUgc8OtIHkgcXVlOg0KYS4gTG9zIGVycm9yZXMgZGUgYW1ib3MgaW5kaWNhZG9yZXMgbm8gZXN0w6luIGNvcnJlbGFjaW9uYWRvcyBjb24gZWwgZXJyb3IgZGUgdW4gdGVyY2VyDQppbmRpY2Fkb3IgZGUgdW4gZmFjdG9yIGRpZmVyZW50ZS4NCmIuIFVuYSByZXN0cmljY2nDs24gZGUgaWd1YWxkYWQgc2VhIGltcHVlc3RhIHNvYnJlIGxhcyBjYXJnYXMgZmFjdG9yaWFsZXMgZGUgYW1ib3MgaW5kaWNhZG9yZXMuDQrvgqcgUGFyYSBjYWRhIHBhciBkZSBmYWN0b3JlcyBkZWJlIGhhYmVyIGFsIG1lbm9zIGRvcyBpbmRpY2Fkb3JlcywgdW5vIGRlIGNhZGEgZmFjdG9yLA0KY3V5b3MgdMOpcm1pbm9zIGRlIGVycm9yIG5vIGVzdMOpbiBjb3JyZWxhY2lvbmFkb3MuDQrvgqcgUGFyYSBjYWRhIGluZGljYWRvciBkZWJlIGhhYmVyIGFsIG1lbm9zIG90cm8gaW5kaWNhZG9yIChubyBuZWNlc2FyaWFtZW50ZSBkZWwNCm1pc21vIGZhY3RvcikgY29uIGVsIGN1YWwgZW50cmUgc3VzIGVycm9yZXMgbm8gaGF5YSBjb3JyZWxhY2nDs24uDQoNCu+CpyBFbiBtb2RlbG9zIGNvbiBlc2NhbGFzIG11bHRpZGltZW5zaW9uYWxlcyAoY29uIGluZGljYWRvcmVzIGNvbXBsZWpvcywgcXVlIHNhdHVyYW4gZW4NCm3DoXMgZGUgdW4gZmFjdG9yKSB5IGNvbiB0w6lybWlub3MgZGUgZXJyb3IgY29ycmVsYWNpb25hZG9zOg0K74KnIENhcmdhcyBmYWN0b3JpYWxlcy4gUGFyYSBjYWRhIGluZGljYWRvciBjb21wbGVqbyBkZWJlbiBjdW1wbGlyc2UgbGFzIHNpZ3VpZW50ZXMgZG9zIGNvbmRpY2lvbmVzOg0KMS4gQ2FkYSBmYWN0b3IgZW4gZWwgcXVlIHNhdHVyZSB1biBpbmRpY2Fkb3IgY29tcGxlam8gZGViZSBjdW1wbGlyIGFsZ3VuYSBkZSBsYXMgc2lndWllbnRlcyBzaXR1YWNpb25lczoNCjEpIFRlbmVyIGFsIG1lbm9zIHRyZXMgaW5kaWNhZG9yZXMgY3V5b3MgZXJyb3JlcyBubyBlc3TDqW4gY29ycmVsYWNpb25hZG9zIGVudHJlIHPDrS4NCjIpIFRlbmVyIGFsIG1lbm9zIGRvcyBpbmRpY2Fkb3JlcyBjdXlvcyBlcnJvcmVzIG5vIGVzdMOpbiBjb3JyZWxhY2lvbmFkb3MgZW50cmUgc8OtIHkgYWRlbcOhcyBxdWU6DQphLiBMb3MgZXJyb3JlcyBkZSBhbWJvcyBpbmRpY2Fkb3JlcyBubyBlc3TDqW4gY29ycmVsYWNpb25hZG9zIGNvbiBlbCBlcnJvciBkZSB1biB0ZXJjZXIgaW5kaWNhZG9yIGRlIG90cm8gZmFjdG9yLg0KYi4gVW5hIHJlc3RyaWNjacOzbiBkZSBpZ3VhbGRhZCBzZWEgaW1wdWVzdGEgc29icmUgbGFzIGNhcmdhcyBmYWN0b3JpYWxlcyBkZSBhbWJvcyBpbmRpY2Fkb3Jlcy4NCjIuIFRvZG8gcGFyIGRlIGZhY3RvcmVzIGVuIGxvcyBxdWUgc2F0dXJlIGVsIGluZGljYWRvciBjb21wbGVqbyBkZWJlIHRlbmVyIGFsIG1lbm9zIGRvcyBpbmRpY2Fkb3JlcywgdW5vIGRlIGNhZGENCmZhY3RvciwgY3V5b3MgdMOpcm1pbm9zIGRlIGVycm9yIG5vIGVzdMOpbiBjb3JyZWxhY2lvbmFkb3MuDQrvgqcgQ29ycmVsYWNpb25lcyBlbnRyZSBsb3MgZXJyb3JlcyBkZSBpbmRpY2Fkb3JlcyBjb21wbGVqb3MuIERlYmVuIGN1bXBsaXJzZSBsYXMgc2lndWllbnRlcyBkb3MNCmNvbmRpY2lvbmVzOg0KMS4gTGFzIG1pc21hcyByZWdsYXMgYW50ZXJpb3JlcyBxdWUgZGViZW4gY3VtcGxpcnNlIHBhcmEgY2FyZ2FzIGZhY3RvcmlhbGVzLg0KMi4gUGFyYSBjYWRhIGZhY3RvciBlbiBlbCBxdWUgY2FyZ3VlIHVuIGluZGljYWRvciBjb21wbGVqbyBkZWJlIGhhYmVyIGFsIG1lbm9zIHVuIGluZGljYWRvciBjb24gdW5hIHNvbGEgY2FyZ2ENCmZhY3RvcmlhbCBxdWUgbm8gZXN0w6kgY29ycmVsYWNpb25hZG8gY29uIGVsIGluZGljYWRvciBjb21wbGVqby4NCmBgYA0KDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQojIEV2YWx1YWNpw7NuIGRlIGxhIGNhbGlkYWQgZGUgbGEgYmFzZSBkZSBkYXRvcw0KDQpFbiBsYXMgc2lndWllbnRlcyBzZWNjaW9uZXMgc2UgdmFuIGEgcHJvcG9uZXIgcmVjb21lbmRhY2lvbmVzIGNvbiByZXNwZWN0byBhIGxvcyBzaWd1aWVudGVzIHB1bnRvczogDQoNCjEuIFRhbWHDsW8gZGUgbGEgbXVlc3RyYS4NCg0KMi4gTXVsdGljb2xpbmVhbGlkYWQuDQoNCjMuIFZhbG9yZXMgZXh0cmVtb3MgdW5pdmFyaWFkb3MgeSBtdWx0aXZhcmlhZG9zLg0KDQo0Lk5vcm1hbGlkYWQgbXVsdGl2YXJpYWRhLg0KDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQojIyMgVGFtYcOxbyBkZSBsYSBtdWVzdHJhDQoNClNlIHJlY29taWVuZGEgdGVuZXI6DQoNCjEuIEFsIG1lbm9zIDIwMCBvYnNlcnZhY2lvbmVzLiANCg0KMi4gQWwgbWVub3MgMTAgb2JzZXJ2YWNpb25lcyBwb3IgY2FkYSB2YXJpYWJsZSBvYnNlcnZhZGEuDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQojIyMgTXVsdGljb2xpbmVhbGlkYWQNCg0KMS4gVW5hIGNvbGluZWFsaWRhZCBiaXZhcmlhZGEgZXh0cmVtYSAoJHIgPiAwLjg1JCkgeSBtdWx0aXZhcmlhZGEgcHVlZGUgaW5kaWNhciBsYSBwcmVzZW5jaWEgZGUgdmFyaWFibGVzIHJlZHVuZGFudGVzIHkgcXVlIGxhIG1hdHJpeiBkZSBjb3JyZWxhY2nDs24gbm8gc2VhIGRlZmluaWRhIHBvc2l0aXZhLiANCg0KMi4gRXMgaW1wb3J0YW50ZSBleGFtaW5hciBsb3MgY29lZmljaWVudGVzIGRlIGNvcnJlbGFjacOzbiwgYXPDrSBjb21vIGVsIGRldGVybWluYW50ZSB5IGxvcyBhdXRvdmFsb3JlcyBkZSBsYSBtYXRyaXogZGUgY29ycmVsYWNpw7NuLg0KDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQojIyMgVmFsb3JlcyBleHRyZW1vcyB1bml2YXJpYWRvcyB5IG11bHRpdmFyaWFkb3MNCg0KMS4gU2UgZGViZW4gZWxpbWluYXIgb2JzZXJ2YWNpb25lcyBjdXlvcyB2YWxvcmVzIHNlIGRlc3bDrWVuIG3DoXMgZGUgMyBkZXN2aWFjaW9uZXMgZXN0w6FuZGFyIGRlIGxhIG1lZGlhLiANCg0KMi4gRW4gZWwgY2FzbyBkZSB2YWxvcmVzIGV4dHJlbW9zIG11bHRpdmFyaWFkb3MsIHNlIGRlYmVuIGNhbGN1bGFyIGxhcyBkaXN0YW5jaWFzIGRlIE1haGFsYW5vYmlzIHkgZGVzY2FydGFyIGxhcyBvYnNlcnZhY2lvbmVzIGNvbiBkaXN0YW5jaWFzIHNpZ25pZmljYXRpdmFzIGFsIDElLg0KDQo8IS0tICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUgLS0+DQo8IS0tIFNlcGFyYWRvciAtLT4NCg0KIyMjIE5vcm1hbGlkYWQgbXVsdGl2YXJpYWRhDQoNCjEuIFNlIGRlYmVuIGV4YW1pbmFyIGxvcyBjb2VmaWNpZW50ZXMgZGUgYXNpbWV0csOtYSB5IGN1cnRvc2lzIHBhcmEgZXZhbHVhciBsYSBub3JtYWxpZGFkIHVuaXZhcmlhZGEuDQoNCjIuIFNlIGNvbnNpZGVyYW4gbm9ybWFsZXMgbGFzIHZhcmlhYmxlcyBjdXlvcyBjb2VmaWNpZW50ZXMgZW4gdmFsb3IgYWJzb2x1dG8gc2VhbiBtZW5vcmVzIGEgMyB5IDEwIHJlc3BlY3RpdmFtZW50ZS4gDQoNCjMuIEVzIGltcG9ydGFudGUgYXBsaWNhciBwcnVlYmFzIGRlIG5vcm1hbGlkYWQgdW5pdmFyaWFkYSAoY29tbyBsYSBwcnVlYmEgY29uanVudGEgZGUgYXNpbWV0csOtYSB5IGN1cnRvc2lzKSB5IGFsZ8O6biB0ZXN0IGRlIG5vcm1hbGlkYWQgbXVsdGl2YXJpYWRhIChjb21vIGVsIGRlIE1hcmRpYSkuIExvIG3DoXMgcmVsZXZhbnRlIGVzIHF1ZSBzZSBjdW1wbGEgbGEgY3VydG9zaXMgbXVsdGl2YXJpYWRhLg0KDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQojIyMgTm9ybWFsaWRhZCBtdWx0aXZhcmlhZGE6IGNvbWVudGFyaW8NCg0KMS4gU2kgbGEgZGlzdHJpYnVjacOzbiBubyBlcyBub3JtYWwgcGVybyBwcmVzZW50YSBtZXNvY3VydG9zaXMsIGxhcyBwcm9waWVkYWRlcyBkZSBsb3MgZXN0aW1hZG9yZXMgZGUgbcOheGltYSB2ZXJvc2ltaWxpdHVkICBzb24gZXF1aXZhbGVudGVzIGEgbGFzIHF1ZSBzZSB0aWVuZW4gYmFqbyBsYSBoaXDDs3Rlc2lzIGRlIG5vcm1hbGlkYWQuIA0KDQoyLiBTaW4gZW1iYXJnbywgc2kgbGEgY3VydG9zaXMgZGlmaWVyZSBzaWduaWZpY2F0aXZhbWVudGUgZGUgbGEgbm9ybWFsLCBlc3RvcyBlc3RpbWFkb3JlcyBzb24gY29uc2lzdGVudGVzIHBlcm8gbm8gZWZpY2llbnRlcyBhc2ludMOzdGljYW1lbnRlLg0KDQozLiBMbyBhbnRlcmlvciBwdWVkZSBnZW5lcmFyIGRpZmljdWx0YWRlcyBlbiBsYXMgcHJ1ZWJhcyBkZSBzaWduaWZpY2FjacOzbiBpbmRpdmlkdWFsIGRlIGxvcyBwYXLDoW1ldHJvcyB5IGVuIGxhIHBydWViYSBkZSB2YWxpZGV6IGdsb2JhbCBkZWwgbW9kZWxvLg0KDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQojIEVzdGltYWNpw7NuIGRlIHBhcsOhbWV0cm9zDQoNCiMjIyBPYmpldGl2b3MNCg0KMS4gRW4gbG9zIG1vZGVsb3MgZGUgZWN1YWNpb25lcyBlc3RydWN0dXJhbGVzIChTRU0pLCBlbCBvYmpldGl2byBlcyBhanVzdGFyIGxhcyBjb3ZhcmlhbnphcyBlbnRyZSBsYXMgdmFyaWFibGVzLiANCg0KMi4gRW4gbHVnYXIgZGUgcmVkdWNpciBsYSBkaWZlcmVuY2lhIGVudHJlIGxvcyB2YWxvcmVzIHByb25vc3RpY2Fkb3MgeSBsb3Mgb2JzZXJ2YWRvcyBhIG5pdmVsIGluZGl2aWR1YWwsIHNlIGJ1c2NhIG1pbmltaXphciBsYSBkaXNjcmVwYW5jaWEgZW50cmUgbGFzIGNvdmFyaWFuemFzIG9ic2VydmFkYXMgZW4gbGEgbXVlc3RyYSB5IGxhcyBjb3ZhcmlhbnphcyBwcmV2aXN0YXMgcG9yIGVsIG1vZGVsbyBlc3RydWN0dXJhbC4gDQoNCjMuIFBvciBlc3RhIHJhesOzbiwgZXN0b3MgbW9kZWxvcyB0YW1iacOpbiBzZSBjb25vY2VuIGNvbW8gKm1vZGVsb3MgZGUgZXN0cnVjdHVyYSBkZSBjb3ZhcmlhbnphKiAoQ292YXJpYW5jZSBTdHJ1Y3R1cmUgTW9kZWxzKS4NCg0KDQo8IS0tICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUgLS0+DQo8IS0tIFNlcGFyYWRvciAtLT4NCg0KIyMjIEhpcMOzdGVzaXMgZnVuZGFtZW50YWwNCg0KMS4gTGEgaGlww7N0ZXNpcyBwcmluY2lwYWwgc29zdGllbmUgcXVlLCBzaSBlbCBtb2RlbG8gZXMgcHJlY2lzbywgbGEgbWF0cml6IGRlIHZhcmlhbnphcyB5IGNvdmFyaWFuemFzIGRlIGxhIHBvYmxhY2nDs24gcHVlZGUgc2VyIHJlcHJlc2VudGFkYSBkZSBtYW5lcmEgZXhhY3RhIG1lZGlhbnRlIHVuYSBjb21iaW5hY2nDs24gZGUgbG9zIHBhcsOhbWV0cm9zIGRlbCBtb2RlbG8uIA0KDQoyLiBFeHByZXNhZG8gZW4gbm90YWNpw7NuOg0KDQokJEhvOlw7ICBcU2lnbWEgXCw9XCwgXFNpZ21hKFx0aGV0YSkkJA0KDQozLiBFbiBsYSBleHByZXNpw7NuIGFudGVyaW9yLCAkXFNpZ21hJCByZXByZXNlbnRhIGxhIG1hdHJpeiBkZSB2YXJpYW56YXMgeSBjb3ZhcmlhbnphcyBkZSBsYSBwb2JsYWNpw7NuIGVudHJlIGxhcyB2YXJpYWJsZXMgb2JzZXJ2YWRhcywgeSAkXFNpZ21hKFx0aGV0YSkkIGVzIGxhIG1hdHJpeiBkZSB2YXJpYW56YXMgeSBjb3ZhcmlhbnphcyBvYnRlbmlkYSBjb21vIHVuYSBmdW5jacOzbiBkZSBsb3MgcGFyw6FtZXRyb3MgY29udGVuaWRvcyBlbiBlbCB2ZWN0b3IgJFx0aGV0YSQuDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQojIEVzdGltYWNpw7NuOiBlamVtcGxvDQoNCg0KQ29uc2lkZXJlbW9zIGVsIHNpZ3VpZW50ZSBtb2RlbG8gZGUgcmVncmVzacOzbjogDQoNCiQkIHkgXDs9XDsgXGJldGEgeCArIFx2YXJlcHNpbG9uJCQNCg0KTGEgbWF0cml6IGRlIHZhcmlhbnphcyB5IGNvdmFyaWFuemFzIGVudHJlICRYJCB5ICRZJCBlczogDQoNCiQkXFNpZ21hIFw7PSBcOyBcYmVnaW57cG1hdHJpeH0NCiBWKFgpJiBDb3YoWCxZKVxcIA0KQ292KFgsWSkgJiBWKFkpDQpcZW5ke3BtYXRyaXh9JCQNCg0KQXBsaWNhbmRvIHByb3BpZWRhZGVzIGRlIHZhcmlhbnphIHkgY292YXJpYW56YSAoeSBzdXBvbmllbmRvIHF1ZSAkVihcdmFyZXBzaWxvbik9XHNpZ21hXjIkKSBzZSBwdWVkZSBkZW1vc3RyYXIgcXVlOg0KDQokJENvdihYLFkpIFw7PVw7IFxiZXRhIFwsVihYKSwgXHFxdWFkIFYoWSkgXDs9XDsgXGJldGFeMlwsIFYoWCkgXDsrXDsgVihcdmFyZXBzaWxvbilcOz1cOyBcYmV0YV4yXCwgVihYKSBcOytcOyBcc2lnbWFeMiQkDQoNCkFsIHJlZW1wbGF6YXIgZXN0YXMgZXhwcmVzaW9uZXMgZW4gbGEgbWF0cml6IGRlIHZhcmlhbnphcyB5IGNvdmFyaWFuemFzIHBvYmxhY2lvbmFsLCBzZSBwdWVkZSBleHByZXNhciBlbiB0w6lybWlub3MgZGUgbG9zIHBhcsOhbWV0cm9zIGRlbCBtb2RlbG8sIG9idGVuaWVuZG8gYXPDrSBsYSBtYXRyaXogaW1wbMOtY2l0YSBkZSB2YXJpYW56YXMgeSBjb3ZhcmlhbnphczoNCg0KDQokJFxTaWdtYShcdGhldGEpIFw7PSBcOyBcYmVnaW57cG1hdHJpeH0NClYoWCkgJiBcYmV0YSBcLFYoWClcXCANClxiZXRhIFwsVihYKSAmIFxiZXRhXjJcLCBWKFgpIFw7K1w7IFxzaWdtYV4yDQpcZW5ke3BtYXRyaXh9LCBccXF1YWQgXHRoZXRhPShcYmV0YSwgXHNpZ21hXjIpXlQkJA0KDQpMYSBlc3RpbWFjacOzbiBkZSBsb3MgcGFyw6FtZXRyb3Mgc2UgbGxldmEgYSBjYWJvIGJ1c2NhbmRvIG1heGltaXphciBsYSBwcmVjaXNpw7NuIGRlbCBtb2RlbG8uIFBhcmEgbG9ncmFyIGVzdG8sIHNlIGludGVudGEgcmVkdWNpciBhbCBtw61uaW1vIGxhcyBkaWZlcmVuY2lhcyBlbnRyZSBsYXMgdmFyaWFuemFzIHkgY292YXJpYW56YXMgb2JzZXJ2YWRhcywgJFMkLCB5IGxhcyBxdWUgZWwgbW9kZWxvIHJlcHJvZHVjZSwgJFNcYmlnKFx3aWRlaGF0e1x0aGV0YX1cYmlnKSQNCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCiMgRXN0aW1hY2nDs246IG3DqXRvZG9zDQoNCiMjIyBBbGd1bm9zIG3DqXRvZG9zIGRlIGVzdGltYWNpw7NuDQoNCkVuIGxvcyBtb2RlbG9zIGRlIGVjdWFjaW9uZXMgZXN0cnVjdHVyYWxlcyAoU0VNKSBleGlzdGVuIGRpc3RpbnRvcyBtw6l0b2RvcyBwYXJhIGVzdGltYXIgbG9zIHBhcsOhbWV0cm9zIGRlbCBtb2RlbG8sIGxvcyBjdWFsZXMgZGlmaWVyZW4gZW4gbG9zIHN1cHVlc3RvcyBlc3RhZMOtc3RpY29zIHF1ZSBhZG9wdGFuLCBlbiBsYSBmb3JtYSBjb21vIHRyYXRhbiBsYSBtYXRyaXogZGUgY292YXJpYW56YXMgeSBlbiBzdXMgcHJvcGllZGFkZXMgaW5mZXJlbmNpYWxlcy4gIEVuIGxhcyBzZWNjaW9uZXMgc2lndWllbnRlcyBzZSBwcmVzZW50YW4geSBkaXNjdXRlbiBsb3MgbcOpdG9kb3MgbcOhcyB1dGlsaXphZG9zIGVuIGxhIHByw6FjdGljYSBhcGxpY2FkYToNCg0KMS4gKk3DoXhpbWEgdmVyb3NpbWlsaXR1ZCAoTUwpLioNCg0KMi4gKk3DrW5pbW9zIGN1YWRyYWRvcyBubyBwb25kZXJhZG9zIChVTFMpLioNCg0KMy4gKk3DrW5pbW9zIGN1YWRyYWRvcyBnZW5lcmFsaXphZG9zIChHTFMpLioNCg0KNC4gKk3DrW5pbW9zIGN1YWRyYWRvcyBwb25kZXJhZG9zIChXTFMpKiBvICpkZSBkaXN0cmlidWNpw7NuIGFzaW50w7N0aWNhbWVudGUgbGlicmUgKEFERikqLiANCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCiMjIyBNw6F4aW1hIHZlcm9zaW1pbGl0dWQgKE1MKQ0KDQoxLiBFcyBlbCBtw6l0b2RvIGRlIGVzdGltYWNpw7NuIG3DoXMgdXRpbGl6YWRvIGVuIFNFTSB5IGNvbnN0aXR1eWUgbGEgb3BjacOzbiBwcmVmZXJpZGEgYmFqbyBlbCBzdXB1ZXN0byBkZSAqKm5vcm1hbGlkYWQgbXVsdGl2YXJpYWRhKiosIGRlYmlkbyBhIHN1cyBwcm9waWVkYWRlcyBkZSBpbnNlc2dhZGV6IHkgZWZpY2llbmNpYSBhc2ludMOzdGljYS4NCg0KMi4gRW4gbGEgcHLDoWN0aWNhLCBNTCBlcyByZWxhdGl2YW1lbnRlIHJvYnVzdG8gZnJlbnRlIGEgZGVzdmlhY2lvbmVzIG1vZGVyYWRhcyBkZSBsYSBub3JtYWxpZGFkLiBTaW4gZW1iYXJnbywgY3VhbmRvIGxhIGZhbHRhIGRlIG5vcm1hbGlkYWQgZXMgc2V2ZXJhLCBzZSByZWNvbWllbmRhIGVsIHVzbyBkZSAqKmVycm9yZXMgZXN0w6FuZGFyIHJvYnVzdG9zKiogKHBvciBlamVtcGxvLCBRdWFzaS1NYXhpbXVtIExpa2VsaWhvb2QgbyBjb3JyZWNjaW9uZXMgdGlwbyBIdWJlcuKAk1doaXRlKSBvIHByb2NlZGltaWVudG9zIGRlICoqYm9vdHN0cmFwKiouDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQojIyMgTcOtbmltb3MgY3VhZHJhZG9zIG5vIHBvbmRlcmFkb3MgKFVMUykNCg0KMS4gRXMgY29uY2VwdHVhbG1lbnRlIHNpbWlsYXIgYWwgbcOpdG9kbyBkZSAqKk3DrW5pbW9zIEN1YWRyYWRvcyBPcmRpbmFyaW9zIChPTFMpKiogZW4gcmVncmVzacOzbiwgZW4gZWwgc2VudGlkbyBkZSBxdWUgbWluaW1pemEgbGFzIGRpc2NyZXBhbmNpYXMgZW50cmUgbGFzIGNvdmFyaWFuemFzIG9ic2VydmFkYXMgeSBsYXMgcmVwcm9kdWNpZGFzIHBvciBlbCBtb2RlbG8uDQoNCjIuIE5vIHJlcXVpZXJlIHF1ZSBsYSBtYXRyaXogZGUgY292YXJpYW56YXMgbXVlc3RyYWwgc2VhIGRlZmluaWRhIHBvc2l0aXZhLCBsbyBxdWUgcHVlZGUgcmVzdWx0YXIgdmVudGFqb3NvIGVuIHNpdHVhY2lvbmVzIHByb2JsZW3DoXRpY2FzLg0KDQozLiBQcm9kdWNlIGVzdGltYWRvcmVzIGluc2VzZ2Fkb3MsIGF1bnF1ZSBnZW5lcmFsbWVudGUgbWVub3MgZWZpY2llbnRlcyBxdWUgbG9zIG9idGVuaWRvcyBtZWRpYW50ZSBNTC4NCg0KNC4gUmVxdWllcmUgcXVlIHRvZGFzIGxhcyB2YXJpYWJsZXMgb2JzZXJ2YWRhcyBlc3TDqW4gbWVkaWRhcyBlbiBsYSBtaXNtYSBlc2NhbGEuDQoNCjUuIEVuIGxhIHByw6FjdGljYSwgc3VlbGUgZW1wbGVhcnNlIGNvbW8gbcOpdG9kbyBwcmVsaW1pbmFyIHBhcmEgb2J0ZW5lciAqKnZhbG9yZXMgaW5pY2lhbGVzKiogcXVlIHBvc3Rlcmlvcm1lbnRlIHNlIHV0aWxpemFuIGVuIGxhIGVzdGltYWNpw7NuIHBvciBNTC4NCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCiMjIyBNw61uaW1vcyBjdWFkcmFkb3MgZ2VuZXJhbGl6YWRvcyAoR0xTKQ0KDQoxLiBBbCBpZ3VhbCBxdWUgTUwsIGVzdGUgbcOpdG9kbyBvcGVyYSBiYWpvIGVsIHN1cHVlc3RvIGRlICoqbm9ybWFsaWRhZCBtdWx0aXZhcmlhZGEqKi4NCg0KMi4gQSBkaWZlcmVuY2lhIGRlIFVMUywgbm8gZXhpZ2UgcXVlIHRvZGFzIGxhcyB2YXJpYWJsZXMgZXN0w6luIGVuIGxhIG1pc21hIGVzY2FsYSwgeWEgcXVlIGluY29ycG9yYSB1bmEgbWF0cml6IGRlIHBvbmRlcmFjacOzbi4NCg0KMy4gRW4gdMOpcm1pbm9zIGNvbXB1dGFjaW9uYWxlcywgc3VlbGUgc2VyIG3DoXMgZWZpY2llbnRlIHF1ZSBNTCB5IFVMUywgYXVucXVlIGVuIGxhIHByw6FjdGljYSBlcyBtZW5vcyB1dGlsaXphZG8gcXVlIE1MIGVuIGFwbGljYWNpb25lcyBlc3TDoW5kYXIuDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQojIyMgTcOtbmltb3MgY3VhZHJhZG9zIHBvbmRlcmFkb3MgKFdMUykgbyBkZSBkaXN0cmlidWNpw7NuIGFzaW50w7N0aWNhbWVudGUgbGlicmUgKEFERikNCg0KMS4gRXN0ZSBtw6l0b2RvIG5vIHJlcXVpZXJlIGVsIHN1cHVlc3RvIGRlIG5vcm1hbGlkYWQgbXVsdGl2YXJpYWRhLCBwZXJvIHPDrSBkZW1hbmRhIHVuICoqdGFtYcOxbyBtdWVzdHJhbCBlbGV2YWRvKiosIHTDrXBpY2FtZW50ZSBlbnRyZSAyMDAgeSA1MDAgb2JzZXJ2YWNpb25lcyBvIG3DoXMuDQoNCjIuIEVzIGVzcGVjaWFsbWVudGUgYWRlY3VhZG8gY3VhbmRvIHNlIHRyYWJhamEgY29uICoqdmFyaWFibGVzIG9yZGluYWxlcyBvIGNhdGVnw7NyaWNhcyoqLCBlc3RpbWFkYXMgYSBwYXJ0aXIgZGUgbWF0cmljZXMgZGUgY29ycmVsYWNpb25lcyBwb2xpY8OzcmljYXMsIHRldHJhY8OzcmljYXMgbyBwb2xpc2VyaWFsZXMuDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQojIEVzdGltYWNpw7NuOiBmdW5jacOzbiBkZSBhanVzdGUNCg0KDQpFbiBsb3MgbW9kZWxvcyBkZSBlY3VhY2lvbmVzIGVzdHJ1Y3R1cmFsZXMsIGxhIGVzdGltYWNpw7NuIGRlIGxvcyBwYXLDoW1ldHJvcyBzZSByZWFsaXphIG1pbmltaXphbmRvIHVuYSAqKmZ1bmNpw7NuIGRlIGFqdXN0ZSoqLCBsYSBjdWFsIG1pZGUgbGEgZGlzY3JlcGFuY2lhIGVudHJlIGxhIG1hdHJpeiBkZSB2YXJpYW56YXMgeSBjb3ZhcmlhbnphcyBvYnNlcnZhZGEgZW4gbGEgbXVlc3RyYSwgXChTXCksIHkgbGEgbWF0cml6IGRlIHZhcmlhbnphcyB5IGNvdmFyaWFuemFzIGltcGzDrWNpdGEgZW4gZWwgbW9kZWxvLCBcKFxTaWdtYShcdGhldGEpXCkuICANCg0KQ2FkYSBtw6l0b2RvIGRlIGVzdGltYWNpw7NuIHNlIGFzb2NpYSBjb24gdW5hIGZ1bmNpw7NuIGRlIGFqdXN0ZSBwYXJ0aWN1bGFyLCBjdXlhIG1pbmltaXphY2nDs24gcHJvZHVjZSBsb3MgZXN0aW1hZG9yZXMgZGUgbG9zIHBhcsOhbWV0cm9zIGRlbCBtb2RlbG8uDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQojIyMgTcOheGltYSB2ZXJvc2ltaWxpdHVkIChNTCkNCg0KTGEgZnVuY2nDs24gZGUgYWp1c3RlIGRlIG3DoXhpbWEgdmVyb3NpbWlsaXR1ZCBzZSBkZWZpbmUgY29tbzoNCg0KXFsNCkZfe01MfSBcOyA9IFw7IFxsb2d8XFNpZ21hKFx0aGV0YSl8IFw7K1w7IFxtYXRocm17dHJ9XCFcbGVmdChTXCxcU2lnbWFeey0xfShcdGhldGEpXHJpZ2h0KSBcOy1cOyBcbG9nfFN8IFw7LVw7IChwK3EpLA0KXF0NCg0KZG9uZGUgXChTXCkgZXMgbGEgbWF0cml6IGRlIGNvdmFyaWFuemFzIG11ZXN0cmFsLCBcKFxTaWdtYShcdGhldGEpXCkgbGEgbWF0cml6IGltcGzDrWNpdGEgZGVsIG1vZGVsbywgeSBcKHBcKSB5IFwocVwpIGNvbnN0YW50ZXMgcXVlIGRlcGVuZGVuIGRlbCBuw7ptZXJvIGRlIHZhcmlhYmxlcyBvYnNlcnZhZGFzLg0KDQoqKkludGVycHJldGFjacOzbi4qKiAgDQoNCkVzdGUgY3JpdGVyaW8gZXZhbMO6YSBxdcOpIHRhbiBwcm9iYWJsZSBlcyBvYnNlcnZhciBsYSBtYXRyaXogXChTXCkgYmFqbyBlbCBzdXB1ZXN0byBkZSBub3JtYWxpZGFkIG11bHRpdmFyaWFkYSB5IGRhZG8gZWwgbW9kZWxvIGVzcGVjaWZpY2Fkby4gTWluaW1pemFyIFwoRl97TUx9XCkgZXF1aXZhbGUgYSBtYXhpbWl6YXIgbGEgdmVyb3NpbWlsaXR1ZCBkZWwgbW9kZWxvLCBwb3IgbG8gcXVlIGVzdGUgbcOpdG9kbyBlcyBlbCBtw6FzIHV0aWxpemFkbyBjdWFuZG8gc2UgYXN1bWUgbm9ybWFsaWRhZCBtdWx0aXZhcmlhZGEuDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQojIyMgTcOtbmltb3MgY3VhZHJhZG9zIG5vIHBvbmRlcmFkb3MgKFVMUykNCg0KTGEgZnVuY2nDs24gZGUgYWp1c3RlIFVMUyBlc3TDoSBkYWRhIHBvcjoNCg0KXFsNCkZfe1VMU30gXDsgPSBcOyBcZnJhY3sxfXsyfVwsXG1hdGhybXt0cn1cIVxsZWZ0KFxiaWdbUyAtIFxTaWdtYShcdGhldGEpXGJpZ11eMlxyaWdodCkuDQpcXQ0KDQoqKkludGVycHJldGFjacOzbi4qKiAgDQoNCkVzdGUgbcOpdG9kbyBtaW5pbWl6YSBkaXJlY3RhbWVudGUgbGEgc3VtYSBkZSBsb3MgY3VhZHJhZG9zIGRlIGxhcyBkaWZlcmVuY2lhcyBlbnRyZSBsYXMgY292YXJpYW56YXMgb2JzZXJ2YWRhcyB5IGxhcyByZXByb2R1Y2lkYXMgcG9yIGVsIG1vZGVsbywgb3RvcmdhbmRvIGVsIG1pc21vIHBlc28gYSB0b2RhcyBlbGxhcy4gRXMgY29uY2VwdHVhbG1lbnRlIHNpbXBsZSB5IG5vIHJlcXVpZXJlIG5vcm1hbGlkYWQgbXVsdGl2YXJpYWRhLCBhdW5xdWUgcHVlZGUgc2VyIG1lbm9zIGVmaWNpZW50ZSBxdWUgTUwuDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQojIyMgTcOtbmltb3MgY3VhZHJhZG9zIGdlbmVyYWxpemFkb3MgKEdMUykNCg0KTGEgZnVuY2nDs24gZGUgYWp1c3RlIEdMUyBzZSBkZWZpbmUgY29tbzoNCg0KXFsNCkZfe0dMU30gXDsgPSBcOyBcZnJhY3sxfXsyfVwsXG1hdGhybXt0cn1cIVxsZWZ0KFxsZWZ0XHtcYmlnW1MgLSBcU2lnbWEoXHRoZXRhKVxiaWddIFdeey0xfVxyaWdodFx9XjJccmlnaHQpLA0KXF0NCg0KZG9uZGUgXChXXCkgZXMgdW5hIG1hdHJpeiBkZSBwb25kZXJhY2nDs24sIHVzdWFsbWVudGUgcmVsYWNpb25hZGEgY29uIFwoXFNpZ21hKFx0aGV0YSlcKS4NCg0KKipJbnRlcnByZXRhY2nDs24uKiogIA0KDQpHTFMgZXh0aWVuZGUgZWwgbcOpdG9kbyBVTFMgaW5jb3Jwb3JhbmRvIHBvbmRlcmFjaW9uZXMsIGRlIG1vZG8gcXVlIGxhcyBkaXNjcmVwYW5jaWFzIGVudHJlIGNvdmFyaWFuemFzIG5vIGNvbnRyaWJ1eWVuIHRvZGFzIHBvciBpZ3VhbCBhIGxhIGZ1bmNpw7NuIGRlIGFqdXN0ZS4gQmFqbyBub3JtYWxpZGFkIG11bHRpdmFyaWFkYSwgcHVlZGUgc2VyIG3DoXMgZWZpY2llbnRlIHF1ZSBVTFMsIGF1bnF1ZSBzdWVsZSBzZXIgY29tcHV0YWNpb25hbG1lbnRlIG1lbm9zIGVzdGFibGUgcXVlIE1MLg0KDQo8IS0tICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUgLS0+DQo8IS0tIFNlcGFyYWRvciAtLT4NCg0KIyMjIE3DrW5pbW9zIGN1YWRyYWRvcyBwb25kZXJhZG9zIChXTFMpIG8gZGlzdHJpYnVjacOzbiBhc2ludMOzdGljYW1lbnRlIGxpYnJlIChBREYpDQoNCkxhIGZ1bmNpw7NuIGRlIGFqdXN0ZSBXTFMgKG8gQURGKSBzZSBleHByZXNhIGNvbW86DQoNClxbDQpGX3tXTFN9IFw7ID0gXDsgXGZyYWN7MX17Mn1cLFxtYXRocm17dHJ9XCFcbGVmdChcbGVmdFx7XGJpZ1tTIC0gXFNpZ21hKFx0aGV0YSlcYmlnXSBWXnstMX1ccmlnaHRcfV4yXHJpZ2h0KSwNClxdDQoNCmRvbmRlIFwoVlwpIGVzIGxhIG1hdHJpeiBkZSB2YXJpYW56YXMgeSBjb3ZhcmlhbnphcyBhc2ludMOzdGljYXMgZGUgbG9zIGVsZW1lbnRvcyBkZSBcKFNcKS4NCg0KKipJbnRlcnByZXRhY2nDs24uKiogIA0KDQpFc3RlIG3DqXRvZG8gcG9uZGVyYSBsYXMgZGlzY3JlcGFuY2lhcyB1dGlsaXphbmRvIGluZm9ybWFjacOzbiBzb2JyZSBsYSB2YXJpYWJpbGlkYWQgZGUgbGFzIGNvdmFyaWFuemFzIG11ZXN0cmFsZXMuIE5vIHJlcXVpZXJlIG5vcm1hbGlkYWQgbXVsdGl2YXJpYWRhIHkgZXMgZXNwZWNpYWxtZW50ZSBhcHJvcGlhZG8gcGFyYSB2YXJpYWJsZXMgb3JkaW5hbGVzIG8gY2F0ZWfDs3JpY2FzLCBhdW5xdWUgZGVtYW5kYSB0YW1hw7FvcyBtdWVzdHJhbGVzIGdyYW5kZXMgcGFyYSB1biBkZXNlbXBlw7FvIGFkZWN1YWRvLg0KDQo8IS0tICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUgLS0+DQo8IS0tIFNlcGFyYWRvciAtLT4NCg0KIyMjIyBDb21lbnRhcmlvIHBlZGFnw7NnaWNvIHsudW5saXN0ZWQgLnVubnVtYmVyZWR9DQoNCkVuIHRvZG9zIGxvcyBjYXNvcywgZWwgb2JqZXRpdm8gZXMgZWwgbWlzbW86IGVuY29udHJhciBlbCBjb25qdW50byBkZSBwYXLDoW1ldHJvcyBcKFx0aGV0YVwpIHF1ZSBoYWdhIHF1ZSBsYSBtYXRyaXogaW1wbMOtY2l0YSBkZWwgbW9kZWxvLCBcKFxTaWdtYShcdGhldGEpXCksIHNlIGFwcm94aW1lIGxvIG1lam9yIHBvc2libGUgYSBsYSBtYXRyaXogb2JzZXJ2YWRhIFwoU1wpLiBMYXMgZGlmZXJlbmNpYXMgZW50cmUgbG9zIG3DqXRvZG9zIHJhZGljYW4gZW4gKipjw7NtbyBzZSBtaWRlbiB5IHBvbmRlcmFuIGVzYXMgZGlzY3JlcGFuY2lhcyoqLCBubyBlbiBsYSBsw7NnaWNhIGdlbmVyYWwgZGVsIGVuZm9xdWUuDQoNCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCiMjIyBSZXN1bWVuIGRlIGxhcyBmdW5jaW9uZXMgZGUgYWp1c3RlDQoNCg0KVsOpYXNlIGxhIGZpZ3VyYSBcQHJlZihmaWc6UmVsYWNpb24xOCkuDQoNCjxjZW50ZXI+DQpgYGB7ciBSZWxhY2lvbjE4LCBlY2hvPUZBTFNFLCBmaWcuY2FwID0gIioqRnVuY2lvbmVzIGRlIGJvbmRhZCBkZSBhanVzdGUqKiIsIG91dC53aWR0aCA9ICIxMDAlIn0NCiMgZmlnLndpZHRoID0gMjAgIyBObyBmdW5jaW9uYSBlc3RhIG9wY2lvbiBlbiBlbCBjaHVuaw0KDQojaHR0cDovL3pldnJvc3MuY29tL2Jsb2cvMjAxNy8wNi8xOS90aXBzLWFuZC10cmlja3MtZm9yLXdvcmtpbmctd2l0aC1pbWFnZXMtYW5kLWZpZ3VyZXMtaW4tci1tYXJrZG93bi1kb2N1bWVudHMvDQojIFBhZ2luYSAzNTkgZGUgUjIwMTUtRnJpZW5kbHkNCg0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoIlJlbGFjaW9uMTgucG5nIikNCg0KI090cmEgbWFuZXJhLCBwZXJvICBzYWxlIGVsIGNhcHRpb246DQojPGNlbnRlcj4NCiMhWygjZmlnOkZpZy1jYXB0aW9uKSBNaSBmaWd1cmFdKE5vbWJyZS5wbmcpe3dpZHRoPTQwMHB4fQ0KIzwvY2VudGVyPg0KYGBgDQo8L2NlbnRlcj4NCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCiMgRXN0aW1hY2nDs24gY29uIHZhcmlhYmxlcyBvYnNlcnZhZGFzIG9yZGluYWxlcyBvIGNhdGVnw7NyaWNhcyANCg0KIyMjIE9ic2VydmFjaW9uZXMgZ2VuZXJhbGVzDQoNCjEuIEN1YW5kbyBsb3MgaW5kaWNhZG9yZXMgYXNvY2lhZG9zIGEgdW5hIHZhcmlhYmxlIGxhdGVudGUgc29uICoqb3JkaW5hbGVzIG8gY2F0ZWfDs3JpY29zKiosIGVsIHN1cHVlc3RvIGRlICpub3JtYWxpZGFkIG11bHRpdmFyaWFkYSogc3VlbGUgdmVyc2UgY29tcHJvbWV0aWRvLiBFbiBlc3RhcyBjb25kaWNpb25lcywgZWwgdXNvIGRlbCBtw6l0b2RvIGRlICpNw6F4aW1hIFZlcm9zaW1pbGl0dWQgKE1MKSogbm8gZXMgcmVjb21lbmRhYmxlIGVuIHN1IGZvcm1hIGVzdMOhbmRhci4NCg0KMi4gRW4gc3UgbHVnYXIsIHNlIGRlYmVuIGVtcGxlYXIgKm3DqXRvZG9zIGRlIGVzdGltYWNpw7NuIHF1ZSB0ZW5nYW4gZW4gY3VlbnRhIGxhIGZhbHRhIGRlIG5vcm1hbGlkYWQqLCB5YSBzZWEgbWVkaWFudGUgZnVuY2lvbmVzIGRlIGFqdXN0ZSBhbHRlcm5hdGl2YXMgbyBhIHRyYXbDqXMgZGUgY29ycmVjY2lvbmVzIHJvYnVzdGFzIGVuIGxvcyBlcnJvcmVzIGVzdMOhbmRhci4NCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCiMjIyBJbmRpY2Fkb3JlcyBlbiBlc2NhbGEgTGlrZXJ0IG8gc2ltaWxhcg0KDQoxLiBDdWFuZG8gbG9zIGluZGljYWRvcmVzIGNvbnN0aXR1eWVuIHVuIGNvbmp1bnRvICpob21vZ8OpbmVvKiBkZSB2YXJpYWJsZXMgbWVkaWRhcyBlbiBlc2NhbGEgTGlrZXJ0ICh1IG90cmFzIGVzY2FsYXMgb3JkaW5hbGVzIHNpbWlsYXJlcyksIGVzIHBvc2libGUgKmFncnVwYXIgbG9zIMOtdGVtcyogIChtZWRpYW50ZSBsYSBzdW1hIG8gZWwgcHJvbWVkaW8gZGUgbG9zIHB1bnRhamVzKSBjb24gZWwgb2JqZXRpdm8gZGUgYXByb3hpbWFyIGxhIG5vcm1hbGlkYWQgeSBhc8OtIHBvZGVyIGFwbGljYXIgZWwgbcOpdG9kbyBNTC4NCg0KMi4gRXN0ZSBlbmZvcXVlIGVzIHbDoWxpZG8gw7puaWNhbWVudGUgYmFqbyBlbCBzdXB1ZXN0byBkZSAqdW5pZGltZW5zaW9uYWxpZGFkKiwgZXMgZGVjaXIsIHF1ZSBsb3MgaW5kaWNhZG9yZXMgYWdydXBhZG9zIG1pZGFuIHVuIMO6bmljbyBjb25zdHJ1Y3RvIGxhdGVudGUuDQoNCjMuIFBhcmEgZXZhbHVhciBlc3RlIHN1cHVlc3RvLCBzZSByZWNvbWllbmRhIHJlYWxpemFyIHByZXZpYW1lbnRlIHVuICpBbsOhbGlzaXMgRmFjdG9yaWFsIEV4cGxvcmF0b3JpbyAoQUZFKSouDQoNCjQuIExhIGFncnVwYWNpw7NuIGRlIGluZGljYWRvcmVzIHB1ZWRlIHJlYWxpemFyc2UgZGUgZm9ybWEgKmFsZWF0b3JpYSogbywgcHJlZmVyaWJsZW1lbnRlLCBhdGVuZGllbmRvIGEgKmNyaXRlcmlvcyBkZSBjb250ZW5pZG8gbyBhZmluaWRhZCBjb25jZXB0dWFsKi4NCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCiMjIyBNZXRvZG9sb2fDrWEgZGUgTXV0aMOpbiAoMTk4NCkgcGFyYSB2YXJpYWJsZXMgY29udGludWFzIHkgY2F0ZWfDs3JpY2FzIChDVk0pDQoNCjEuIEVuIGVzdGUgZW5mb3F1ZSwgbGFzIHZhcmlhYmxlcyBvYnNlcnZhZGFzIHB1ZWRlbiBzZXIgZGUgKmN1YWxxdWllciB0aXBvKjogZGljb3TDs21pY2FzLCBvcmRpbmFsZXMgbyBjb250aW51YXMuDQoNCjIuIEVsIG3DqXRvZG8gc2UgYmFzYSBlbiBlbCB1c28gZGUgdW5hICptYXRyaXogZGUgY29ycmVsYWNpb25lcyBwb2xpY8OzcmljYXMqIChvIHRldHJhY8OzcmljYXMsIHNlZ8O6biBjb3JyZXNwb25kYSksIHNlZ3VpZGEgZGUgbGEgZXN0aW1hY2nDs24gZGVsIG1vZGVsbyBtZWRpYW50ZSAqTcOtbmltb3MgQ3VhZHJhZG9zIFBvbmRlcmFkb3MgKFdMUykqIG8gZWwgbcOpdG9kbyAqQXNpbnTDs3RpY2FtZW50ZSBMaWJyZSBkZSBEaXN0cmlidWNpw7NuIChBREYpKi4NCg0KMy4gRXN0YSBtZXRvZG9sb2fDrWEgcmVxdWllcmUgdW4gKnRhbWHDsW8gbXVlc3RyYWwgY29uc2lkZXJhYmxlKiwgZGFkbyBlbCBlbGV2YWRvIG7Dum1lcm8gZGUgcGFyw6FtZXRyb3MgaW52b2x1Y3JhZG9zIGVuIGxhIG1hdHJpeiBkZSBwb25kZXJhY2nDs24uDQoNCjQuIEN1YW5kbyBzZSBwcmVzZW50YW4gZGlmaWN1bHRhZGVzIGFzb2NpYWRhcyBhIG11ZXN0cmFzIHBlcXVlw7FhcyBvIHByb2JsZW1hcyBkZSBjb252ZXJnZW5jaWEsIGVzIHBvc2libGUgY29tcGxlbWVudGFyIGVzdGUgZW5mb3F1ZSBjb24gKm3DqXRvZG9zIGRlIGVzdGltYWNpw7NuIHJvYnVzdGEqLCBxdWUgbWVqb3JlbiBsYSBlc3RhYmlsaWRhZCBkZSBsb3MgcmVzdWx0YWRvcy4NCg0KDQo8IS0tICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUgLS0+DQo8IS0tIFNlcGFyYWRvciAtLT4NCg0KIyBFdmFsdWFjacOzbiBkZWwgYWp1c3RlDQoNCiMjIyBPYnNlcnZhY2lvbmVzDQoNCjEuIFNlIGV4YW1pbmEgbGEgc2lnbmlmaWNhbmNpYSBkZSBsb3MgY29lZmljaWVudGVzLCBzaW1pbGFyIGEgdW4gbW9kZWxvIGRlIHJlZ3Jlc2nDs24sIHkgc2UgcmV2aXNhbiBsYXMgbWVkaWRhcyBkZSBib25kYWQgZGUgYWp1c3RlLiANCg0KMi4gTmluZ3VuYSBtZWRpZGEgcG9yIHPDrSBzb2xhIHByb3BvcmNpb25hIHRvZGEgbGEgaW5mb3JtYWNpw7NuIG5lY2VzYXJpYSBwYXJhIGV2YWx1YXIgZWwgbW9kZWxvLCBwb3IgbG8gcXVlIGdlbmVyYWxtZW50ZSBzZSB1dGlsaXphIHVuIGNvbmp1bnRvIGRlIG1lZGlkYXMgcXVlIHNlIGluZm9ybWEgc2ltdWx0w6FuZWFtZW50ZS4NCg0KDQo8IS0tICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUgLS0+DQo8IS0tIFNlcGFyYWRvciAtLT4NCg0KIyMjIFRpcG9zIGRlIG1lZGlkYXMgZGUgYWp1c3RlDQoNCkxhcyBtZWRpZGFzIGRlIGJvbmRhZCBkZSBhanVzdGUgZW4gbG9zIG1vZGVsb3MgZGUgZWN1YWNpb25lcyBlc3RydWN0dXJhbGVzIHNlIGFncnVwYW4sIGRlIG1hbmVyYSBnZW5lcmFsLCBlbiB0cmVzIGNhdGVnb3LDrWFzIHByaW5jaXBhbGVzLCBjYWRhIHVuYSBkZSBsYXMgY3VhbGVzIGV2YWzDumEgdW4gYXNwZWN0byBkaXN0aW50byBkZWwgZGVzZW1wZcOxbyBkZWwgbW9kZWxvOg0KDQoxLiAqKk1lZGlkYXMgYWJzb2x1dGFzLioqICBFdmFsw7phbiBkaXJlY3RhbWVudGUgZWwgZ3JhZG8gZGUgZGlzY3JlcGFuY2lhIGVudHJlIGxhIG1hdHJpeiBkZSB2YXJpYW56YXMgeSBjb3ZhcmlhbnphcyBvYnNlcnZhZGEgeSBsYSByZXByb2R1Y2lkYSBwb3IgZWwgbW9kZWxvLCBlcyBkZWNpciwgYW5hbGl6YW4gZWwgdGFtYcOxbyBkZSBsb3MgcmVzaWR1b3Mgc2luIHJlYWxpemFyIGNvbXBhcmFjaW9uZXMgY29uIG90cm9zIG1vZGVsb3MuDQoNCjIuICoqTWVkaWRhcyBkZSBhanVzdGUgY29tcGFyYXRpdm8gbyBpbmNyZW1lbnRhbC4qKiAgICBDb21wYXJhbiBlbCBhanVzdGUgZGVsIG1vZGVsbyBwcm9wdWVzdG8gY29uIGVsIGRlIHVuIG1vZGVsbyBkZSByZWZlcmVuY2lhIG3DoXMgcmVzdHJpY3Rpdm8gKHVzdWFsbWVudGUgZWwgbW9kZWxvIG51bG8gbyBpbmRlcGVuZGllbnRlKSwgcGVybWl0aWVuZG8gdmFsb3JhciBsYSBtZWpvcmEgcmVsYXRpdmEgZGVsIG1vZGVsbyBlc3BlY2lmaWNhZG8uDQoNCjMuICoqTWVkaWRhcyBkZSBwYXJzaW1vbmlhLioqICAgIEV2YWzDumFuIGVsIGFqdXN0ZSBkZWwgbW9kZWxvIHRlbmllbmRvIGVuIGN1ZW50YSBzdSBjb21wbGVqaWRhZCwgcGVuYWxpemFuZG8gbGEgaW5jbHVzacOzbiBleGNlc2l2YSBkZSBwYXLDoW1ldHJvcyB5IGZhdm9yZWNpZW5kbyBtb2RlbG9zIG3DoXMgc2ltcGxlcyBxdWUgZXhwbGlxdWVuIGFkZWN1YWRhbWVudGUgbG9zIGRhdG9zLg0KDQoNCmBgYHtyIGV2YWw9RkFMU0UsIGluY2x1ZGU9RkFMU0V9DQpcYmVnaW57dGFibGV9W2h0XQ0KXGNlbnRlcmluZw0KXGJlZ2lue3RhYnVsYXJ9e3xsfGN8Y3x9DQpcaGxpbmUNClx0ZXh0YmZ7Rml0IE1lYXN1cmV9ICYgXHRleHRiZntHb29kIEZpdH0gJiBcdGV4dGJme0FjY2VwdGFibGUgRml0fSBcXA0KXGhsaW5lDQokXGNoaV4yJCAmICQwIFxsZXEgXGNoaV4yIFxsZXEgMmRmJCAmICQyZGYgXGxlcSBcY2hpXjIgXGxlcSAzZGYkIFxcDQpcaGxpbmUNCiRwJCB2YWx1ZSAmICQuMDUgPCBwIFxsZXEgMS4wMCQgJiAkLjAxIFxsZXEgcCBcbGVxIC4wNSQgXFwNClxobGluZQ0KJFxjaGleMi9kZiQgJiAkMCBcbGVxIFxjaGleMi9kZiBcbGVxIDIkICYgJDIgPCBcY2hpXjIvZGYgXGxlcSAzJCBcXA0KXGhsaW5lDQpSTVNFQSAmICQwIFxsZXEgXHRleHR7Uk1TRUF9IFxsZXEgLjA1JCAmICQuMDUgPCBcdGV4dHtSTVNFQX0gXGxlcSAuMDgkIFxcDQpcaGxpbmUNCiRwJCB2YWx1ZSBmb3IgdGVzdCBvZiBjbG9zZSBmaXQgKFJNU0VBICQ8IC4wNSQpICYgJC4xMCA8IHAgXGxlcSAxLjAwJCAmICQuMDUgXGxlcSBwIFxsZXEgLjEwJCBcXA0KXGhsaW5lDQpDb25maWRlbmNlIGludGVydmFsIChDSSkgJiBjbG9zZSB0byBSTVNFQSwgbGVmdCBib3VuZGFyeSBvZiBDSSA9IC4wMCAmIGNsb3NlIHRvIFJNU0VBIFxcDQpcaGxpbmUNClNSTVIgJiAkMCBcbGVxIFx0ZXh0e1NSTVJ9IFxsZXEgLjA1JCAmICQwIFxsZXEgXHRleHR7U1JNUn0gXGxlcSAuMTAkIFxcDQpcaGxpbmUNCk5GSSAmICQuOTUgXGxlcSBcdGV4dHtORkl9IFxsZXEgMS4wMCQgJiAkLjkwIFxsZXEgXHRleHR7TkZJfSA8IC45NSQgXFwNClxobGluZQ0KTk5GSSAmICQuOTcgXGxlcSBcdGV4dHtOTkZJfSBcbGVxIDEuMDAkICYgJC45NSBcbGVxIFx0ZXh0e05ORkl9IDwgLjk3JCBcXA0KXGhsaW5lDQpcaGxpbmUNClRMSSAmICQuOTcgXGxlcSBcdGV4dHtDRkl9IFxsZXEgMS4wMCQgJiAkLjk1IFxsZXEgXHRleHR7Q0ZJfSA8IC45NyQgXFwNCkNGSSAmICQuOTcgXGxlcSBcdGV4dHtDRkl9IFxsZXEgMS4wMCQgJiAkLjk1IFxsZXEgXHRleHR7Q0ZJfSA8IC45NyQgXFwNClxobGluZQ0KR0ZJICYgJC45NSBcbGVxIFx0ZXh0e0dGSX0gXGxlcSAxLjAwJCAmICQuOTAgXGxlcSBcdGV4dHtHRkl9IDwgLjk1JCBcXA0KXGhsaW5lDQpBR0ZJICYgJC45MCBcbGVxIFx0ZXh0e0FHRkl9IFxsZXEgMS4wMCwgXHRleHR7Y2xvc2UgdG8gR0ZJfSQgJiAkLjg1IFxsZXEgXHRleHR7QUdGSX0gPCAuOTAsIFx0ZXh0e2Nsb3NlIHRvIEdGSX0kIFxcDQpcaGxpbmUNCkFJQyAmIFxtdWx0aWNvbHVtbnsyfXtjfH17c21hbGxlciB0aGFuIEFJQyBmb3IgY29tcGFyaXNvbiBtb2RlbH0gXFwNClxobGluZQ0KQ0FJQyAmIFxtdWx0aWNvbHVtbnsyfXtjfH17c21hbGxlciB0aGFuIENBSUMgZm9yIGNvbXBhcmlzb24gbW9kZWx9IFxcDQpcaGxpbmUNCkVDVkkgJiBcbXVsdGljb2x1bW57Mn17Y3x9e3NtYWxsZXIgdGhhbiBFQ1ZJIGZvciBjb21wYXJpc29uIG1vZGVsfSBcXA0KXGhsaW5lDQpcZW5ke3RhYnVsYXJ9DQpcY2FwdGlvbntHb29kbmVzcyBvZiBGaXQgSW5kaWNlc30NClxlbmR7dGFibGV9DQoNCmBgYA0KDQo8IS0tICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUgLS0+DQo8IS0tIFNlcGFyYWRvciAtLT4NCg0KIyMjIEluZGljZXMgZGUgYWp1c3RlDQoNCjEuIExhIGZpZ3VyYSBcQHJlZihmaWc6UmVsYWNpb24xOSkgcmVzdW1lIGxvcyBwcmluY2lwYWxlcyB0aXBvcyBkZSBtZWRpZGFzIGRlIGFqdXN0ZSBlbXBsZWFkYXMgZW4gU0VNLg0KDQo8Y2VudGVyPg0KYGBge3IgUmVsYWNpb24xOSwgZWNobz1GQUxTRSwgZmlnLmNhcCA9ICIqKlRpcG9zIGRlIG1lZGlkYXMgZGUgYWp1c3RlKioiLCBvdXQud2lkdGggPSAiODAlIn0NCiMgZmlnLndpZHRoID0gMjAgIyBObyBmdW5jaW9uYSBlc3RhIG9wY2lvbiBlbiBlbCBjaHVuaw0KDQojaHR0cDovL3pldnJvc3MuY29tL2Jsb2cvMjAxNy8wNi8xOS90aXBzLWFuZC10cmlja3MtZm9yLXdvcmtpbmctd2l0aC1pbWFnZXMtYW5kLWZpZ3VyZXMtaW4tci1tYXJrZG93bi1kb2N1bWVudHMvDQojIFBhZ2luYSAzNTkgZGUgUjIwMTUtRnJpZW5kbHkNCg0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoIlJlbGFjaW9uMTkucG5nIikNCg0KI090cmEgbWFuZXJhLCBwZXJvICBzYWxlIGVsIGNhcHRpb246DQojPGNlbnRlcj4NCiMhWygjZmlnOkZpZy1jYXB0aW9uKSBNaSBmaWd1cmFdKE5vbWJyZS5wbmcpe3dpZHRoPTQwMHB4fQ0KIzwvY2VudGVyPg0KYGBgDQo8L2NlbnRlcj4NCg0KDQoyLiBFbCBlc3RhZMOtc3RpY28gJFxjaGleMiQgZXZhbMO6YSBsYSBkaXNjcmVwYW5jaWEgZ2xvYmFsIGVudHJlIGxhIG1hdHJpeiBvYnNlcnZhZGEgeSBsYSBtYXRyaXogcmVwcm9kdWNpZGEgcG9yIGVsIG1vZGVsby4gSWRlYWxtZW50ZSwgZXN0ZSBlc3RhZMOtc3RpY28gZGViZXLDrWEgcmVzdWx0YXIgbm8gc2lnbmlmaWNhdGl2by4NCg0KMy4gVW4gdmFsb3Igc2lnbmlmaWNhdGl2byBkZSAkXGNoaV4yJCBpbmRpY2EgcXVlIGVsIG1vZGVsbyB0ZcOzcmljbyBwcm9wdWVzdG8gZGlmaWVyZSBkZSBtYW5lcmEgc2lnbmlmaWNhdGl2YSBkZSBsYSBlc3RydWN0dXJhIGRlIGNvdmFyaWFuemFzIG9ic2VydmFkYSBlbiBsb3MgZGF0b3MuDQoNCjQuIEVuIGVzdGUgY29udGV4dG8sIGxhIGhpcMOzdGVzaXMgbnVsYSBlc3RhYmxlY2UgcXVlIGxvcyByZXNpZHVvcyBkZWwgbW9kZWxvIHNvbiBudWxvcywgZXMgZGVjaXIsIHF1ZSBlbCBtb2RlbG8gcmVwcm9kdWNlIGV4YWN0YW1lbnRlIGxhIG1hdHJpeiBkZSB2YXJpYW56YXMgeSBjb3ZhcmlhbnphcyBwb2JsYWNpb25hbC4NCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCiMgUmUtZXNwZWNpZmljYWNpw7NuIGRlbCBtb2RlbG8NCg0KIyMjIERlc2NyaXBjacOzbg0KDQoxLiBDdWFuZG8gZWwgYWp1c3RlIGRlbCBtb2RlbG8gbm8gZXMgc2F0aXNmYWN0b3JpbywgcHVlZGUgc2VyIG5lY2VzYXJpbyBwcm9jZWRlciBhIHN1IHJlLWVzcGVjaWZpY2FjacOzbiwgc2llbXByZSBndWlhZGEgcG9yIGNyaXRlcmlvcyB0ZcOzcmljb3MgeSBzdXN0YW50aXZvcy4NCg0KMi4gUGFyYSBlbGxvLCBzZSBleGFtaW5hbiBsb3Mgw61uZGljZXMgZGUgbW9kaWZpY2FjacOzbiwgcXVlIGNvcnJlc3BvbmRlbiBhIHBhcsOhbWV0cm9zIGluaWNpYWxtZW50ZSBmaWphZG9zIGVuIGNlcm8gKGVmZWN0b3Mgbm8gaW5jbHVpZG9zIGVuIGVsIG1vZGVsbykuDQoNCjMuIENhZGEgw61uZGljZSBkZSBtb2RpZmljYWNpw7NuIGluZGljYSBsYSByZWR1Y2Npw7NuIGVzcGVyYWRhIGVuIGVsIGVzdGFkw61zdGljbyAkXGNoaV4yJCBzaSBlbCBwYXLDoW1ldHJvIGNvcnJlc3BvbmRpZW50ZSBmdWVyYSBsaWJlcmFkbyB5IGVzdGltYWRvLg0KDQo0LiBVbiB2YWxvciBzdXBlcmlvciBhIDMuODQgKHZhbG9yIGNyw610aWNvIGRlIHVuYSAkXGNoaV4yJCBjb24gMSBncmFkbyBkZSBsaWJlcnRhZCB5ICRcYWxwaGEgPSAwLjA1JCkgc3VnaWVyZSBxdWUgbGEgaW5jbHVzacOzbiBkZSBkaWNobyBwYXLDoW1ldHJvIHByb2R1Y2lyw61hIHVuYSBtZWpvcmEgZXN0YWTDrXN0aWNhbWVudGUgc2lnbmlmaWNhdGl2YSBlbiBlbCBhanVzdGUgZGVsIG1vZGVsby4NCg0KNS4gRW4gY29uc2VjdWVuY2lhLCB1biDDrW5kaWNlIGRlIG1vZGlmaWNhY2nDs24gZWxldmFkbyBzZcOxYWxhIHF1ZSBsYSBpbmNvcnBvcmFjacOzbiBkZWwgZWZlY3RvIGFkaWNpb25hbCBwb2Ryw61hIG1lam9yYXIgZGUgZm9ybWEgc3VzdGFudGl2YSBlbCBhanVzdGUgZGVsIG1vZGVsbyBhIGxvcyBkYXRvcywgc2llbXByZSBxdWUgZXhpc3RhIHVuYSBqdXN0aWZpY2FjacOzbiB0ZcOzcmljYSBwYXJhIGVsbG8uDQoNCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCiMjIyBOb3RhIHBlZGFnw7NnaWNhOiBzb2JyZSBsYSByZS1lc3BlY2lmaWNhY2nDs24gZGUgbW9kZWxvcyANCg0KQXVucXVlIGxvcyDDrW5kaWNlcyBkZSBtb2RpZmljYWNpw7NuIGNvbnN0aXR1eWVuIHVuYSBoZXJyYW1pZW50YSDDunRpbCBwYXJhIGRpYWdub3N0aWNhciBmdWVudGVzIGRlIG1hbCBhanVzdGUsICpubyBkZWJlbiB1dGlsaXphcnNlIGNvbW8gdW4gbWVjYW5pc21vIGF1dG9tw6F0aWNvIGRlIGNvcnJlY2Npw7NuIGRlbCBtb2RlbG8qLiBFbiBwYXJ0aWN1bGFyLCBlcyBpbXBvcnRhbnRlIHF1ZSBlbCBlc3R1ZGlhbnRlIHRlbmdhIGVuIGN1ZW50YSBsbyBzaWd1aWVudGU6DQoNCjEuIExvcyDDrW5kaWNlcyBkZSBtb2RpZmljYWNpw7NuIHNlIGNhbGN1bGFuICpjb25kaWNpb25hbG1lbnRlIGFsIG1vZGVsbyBlc3RpbWFkbyB5IGEgbGEgbXVlc3RyYSBhbmFsaXphZGEqLiBQb3IgdGFudG8sIHJlZmxlamFuIHBvc2libGVzIG1lam9yYXMgKmVzcGVjw61maWNhcyBkZSBsb3MgZGF0b3MqIHkgbm8gbmVjZXNhcmlhbWVudGUgcmVsYWNpb25lcyBlc3RydWN0dXJhbGVzIHJlYWxlcyBlbiBsYSBwb2JsYWNpw7NuLg0KDQoyLiBSZS1lc3BlY2lmaWNhciB1biBtb2RlbG8gYmFzw6FuZG9zZSDDum5pY2FtZW50ZSBlbiBjcml0ZXJpb3MgZXN0YWTDrXN0aWNvcyBwdWVkZSBjb25kdWNpciBhICpzb2JyZWFqdXN0ZSAob3ZlcmZpdHRpbmcpKiwgZXMgZGVjaXIsIGEgdW4gbW9kZWxvIHF1ZSByZXByb2R1Y2UgbXV5IGJpZW4gbG9zIGRhdG9zIG9ic2VydmFkb3MsIHBlcm8gcXVlIHRpZW5lICplc2Nhc2EgY2FwYWNpZGFkIGRlIGdlbmVyYWxpemFjacOzbiouDQoNCjMuIExhIGluY2x1c2nDs24gaW5kaXNjcmltaW5hZGEgZGUgcGFyw6FtZXRyb3MgYWRpY2lvbmFsZXMgc3VlbGUgYXVtZW50YXIgYXJ0aWZpY2lhbG1lbnRlIGVsIGFqdXN0ZSwgcGVybyAqZGViaWxpdGEgbGEgaW50ZXJwcmV0YWJpbGlkYWQgeSBsYSBwYXJzaW1vbmlhIGRlbCBtb2RlbG8qLCBkb3MgcHJpbmNpcGlvcyBjZW50cmFsZXMgZW4gU0VNLg0KDQo0LiBUb2RvIHBhcsOhbWV0cm8gbGliZXJhZG8gZGViZSBjb250YXIgY29uIHVuYSAqanVzdGlmaWNhY2nDs24gdGXDs3JpY2EsIHN1c3RhbnRpdmEgbyBtZXRvZG9sw7NnaWNhIGNsYXJhKiAocG9yIGVqZW1wbG8sIHNpbWlsaXR1ZCBkZSBjb250ZW5pZG8gZW50cmUgw610ZW1zLCBlZmVjdG9zIGRlIG3DqXRvZG8gbyBmdW5kYW1lbnRvcyBjb25jZXB0dWFsZXMgcHJldmlvcykuDQoNCjUuIEVuIGxhIHByw6FjdGljYSByZWNvbWVuZGFkYSwgbG9zIMOtbmRpY2VzIGRlIG1vZGlmaWNhY2nDs24gZGViZW4gdXRpbGl6YXJzZSBjb21vICpoZXJyYW1pZW50YXMgZXhwbG9yYXRvcmlhcyosIG5vIGNvbW8gcmVnbGFzIGRlIGRlY2lzacOzbiBhdXRvbcOhdGljYXMuDQoNCkVuIGNvbnNlY3VlbmNpYSwgbGEgcmUtZXNwZWNpZmljYWNpw7NuIGRlIHVuIG1vZGVsbyBTRU0gZGViZSBlbnRlbmRlcnNlIGNvbW8gdW4gKnByb2Nlc28gaXRlcmF0aXZvIGd1aWFkbyBwb3IgbGEgdGVvcsOtYSosIGVuIGVsIHF1ZSBsYSBldmlkZW5jaWEgZW1ww61yaWNhIGNvbXBsZW1lbnRhIChwZXJvIG5vIHN1c3RpdHV5ZSkgYWwgcmF6b25hbWllbnRvIGNvbmNlcHR1YWwuDQoNCg0KDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gQ2Fww610dWxvIEVqZXJjaWNpb3MgLS0+DQoNCiMgRWplcmNpY2lvcw0KDQoNCkxvcyBzaWd1aWVudGVzIGVqZXJjaWNpb3MgdGllbmVuIGNvbW8gb2JqZXRpdm8gcmVmb3J6YXIgbGEgY29tcHJlbnNpw7NuIGNvbmNlcHR1YWwgZGUgbG9zIG1vZGVsb3MgZGUgZWN1YWNpb25lcyBlc3RydWN0dXJhbGVzIGFudGVzIGRlIGludHJvZHVjaXIgZm9ybWFsbWVudGUgbGEgbm90YWNpw7NuIG1hdHJpY2lhbCB5IGxvcyBkZXNhcnJvbGxvcyBhbGdlYnJhaWNvcy4gRW4gdG9kb3MgbG9zIGNhc29zLCBlbCDDqW5mYXNpcyBkZWJlIHBvbmVyc2UgZW4gbGEgKippbnRlcnByZXRhY2nDs24qKiwgbm8gZW4gbGEgb3B0aW1pemFjacOzbiBhdXRvbcOhdGljYSBkZWwgYWp1c3RlLg0KDQo8IS0tICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUgLS0+DQo8IS0tIFNlcGFyYWRvciAtLT4NCg0KIyMjIEVqZXJjaWNpbyAxLiBJZGVudGlmaWNhY2nDs24gZGUgdGlwb3MgZGUgdmFyaWFibGVzDQoNCkNvbnNpZGVyZSBlbCBzaWd1aWVudGUgZXNjZW5hcmlvOg0KDQotIFVuIGludmVzdGlnYWRvciBkZXNlYSBlc3R1ZGlhciBlbCBlZmVjdG8gZGUgbGEgKm1vdGl2YWNpw7NuIGFjYWTDqW1pY2EqIHNvYnJlIGVsICpyZW5kaW1pZW50byBlc3R1ZGlhbnRpbCosIGNvbnNpZGVyYW5kbyBhZGVtw6FzIGVsIHJvbCBkZSBsYSAqYXV0b2VmaWNhY2lhKiBjb21vIHZhcmlhYmxlIGludGVybWVkaWEuICANCiANCi0gTGEgbW90aXZhY2nDs24gc2UgbWlkZSBtZWRpYW50ZSBjdWF0cm8gw610ZW1zIHRpcG8gTGlrZXJ0LCBsYSBhdXRvZWZpY2FjaWEgbWVkaWFudGUgdHJlcyDDrXRlbXMgeSBlbCByZW5kaW1pZW50byBtZWRpYW50ZSBlbCBwcm9tZWRpbyBkZSBjYWxpZmljYWNpb25lcy4gRWwgZXN0dWRpbyBzZSByZWFsaXphIGNvbXBhcmFuZG8gZXN0dWRpYW50ZXMgZGUgY29sZWdpb3MgcMO6YmxpY29zIHkgcHJpdmFkb3MuDQoNCkRlc2Fycm9sbGUgbG9zIHNpZ3VpZW50ZXMgaW5jaXNvczogDQoNCmEuIElkZW50aWZpcXVlIHRvZGFzIGxhcyAqdmFyaWFibGVzIG1hbmlmaWVzdGFzKiBkZWwgZXN0dWRpby4NCg0KYi4gSWRlbnRpZmlxdWUgbGFzICp2YXJpYWJsZXMgbGF0ZW50ZXMqLg0KDQpjLiBTZcOxYWxlIGN1w6FsZXMgdmFyaWFibGVzIHNvbiAqZXjDs2dlbmFzKiwgKmVuZMOzZ2VuYXMqIHkgKm1lZGlhZG9yYXMqKi4NCg0KZC4gSW5kaXF1ZSBleHBsw61jaXRhbWVudGUgbG9zICp0w6lybWlub3MgZGUgZXJyb3IqIGFzb2NpYWRvcy4NCg0KZS4gSWRlbnRpZmlxdWUgbGEgKnZhcmlhYmxlIGRlIGFncnVwYWNpw7NuKiB5IGV4cGxpcXVlIHN1IGZ1bmNpw7NuIGVuIHVuIGFuw6FsaXNpcyBTRU0gbXVsdGlncnVwby4NCg0KDQo8IS0tICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUgLS0+DQo8IS0tIFNlcGFyYWRvciAtLT4NCg0KIyMjIEVqZXJjaWNpbyAyLiBMZWN0dXJhIGNvbmNlcHR1YWwgZGUgdW4gZGlhZ3JhbWEgU0VNDQoNCkNvbnNpZGVyZSB1biBkaWFncmFtYSBTRU0gY29uY2VwdHVhbCBxdWUgY29udGllbmU6DQoNCi0gRG9zIGZhY3RvcmVzIGxhdGVudGVzIFwoRl8xXCkgeSBcKEZfMlwpLg0KDQotIFRyZXMgaW5kaWNhZG9yZXMgcGFyYSBcKEZfMVwpIHkgZG9zIHBhcmEgXChGXzJcKQ0KDQotIFVuYSByZWxhY2nDs24gZXN0cnVjdHVyYWwgXChGXzIgXGxlZnRhcnJvdyBGXzFcKS4NCg0KLSBUw6lybWlub3MgZGUgZXJyb3IgcGFyYSB0b2RvcyBsb3MgaW5kaWNhZG9yZXMuDQoNCkRlc2Fycm9sbGUgbG9zIHNpZ3VpZW50ZXMgaW5jaXNvczogDQoNCmEuIEV4cGxpcXVlIHBvciBxdcOpIFwoRl8xXCkgc2UgY2xhc2lmaWNhIGNvbW8gdmFyaWFibGUgKmV4w7NnZW5hKi4NCg0KYi4gSnVzdGlmaXF1ZSBwb3IgcXXDqSBcKEZfMlwpIGVzIHVuYSB2YXJpYWJsZSAqZW5kw7NnZW5hKi4NCg0KYy4gSW5kaXF1ZSBlbiBxdcOpIHNlbnRpZG8gXChGXzJcKSBwdWVkZSBjb25zaWRlcmFyc2UgdW5hICp2YXJpYWJsZSBtZWRpYWRvcmEqLg0KDQpkLiBFeHBsaXF1ZSBwb3IgcXXDqSBsb3MgdMOpcm1pbm9zIGRlIGVycm9yIG5vIGRlYmVuIGludGVycHJldGFyc2UgY29tbyDigJxydWlkbyBpcnJlbGV2YW50ZeKAnS4NCg0KDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQojIyMgRWplcmNpY2lvIDMuIEVzY2FsYSBkZSBsYSB2YXJpYWJsZSBsYXRlbnRlDQoNCkNvbnNpZGVyZSB1biBmYWN0b3IgbGF0ZW50ZSBcKFxldGFcKSBtZWRpZG8gcG9yIHRyZXMgaW5kaWNhZG9yZXMgXCh4XzEsIHhfMiwgeF8zXCkuDQoNCg0KYS4gRXhwbGlxdWUgY29uY2VwdHVhbG1lbnRlIHF1w6kgc2lnbmlmaWNhIHF1ZSBlbCBtb2RlbG8gKm5vIGVzdMOpIGlkZW50aWZpY2Fkbyogc2kgbm8gc2UgZmlqYSBsYSBlc2NhbGEgZGUgXChcZXRhXCkuDQoNCmIuIERlc2NyaWJhIGPDs21vIHNlIGRlZmluZSBsYSBlc2NhbGEgZGUgXChcZXRhXCkgYmFqbyBjYWRhIHVubyBkZSBsb3Mgc2lndWllbnRlcyBtw6l0b2RvczoNCg0KICAgLSBWYXJpYWJsZSBsYXRlbnRlIGVzdGFuZGFyaXphZGEuDQogICANCiAgIC0gVmFyaWFibGUgbWFyY2Fkb3IuDQogICANCiAgIC0gQ29kaWZpY2FjacOzbiBkZSBlZmVjdG9zLg0KICAgDQpjLiBEaXNjdXRhIHVuYSB2ZW50YWphIHkgdW5hIGRlc3ZlbnRhamEgY29uY2VwdHVhbCBkZSBjYWRhIG3DqXRvZG8uDQoNCg0KDQo8IS0tICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUgLS0+DQo8IS0tIFNlcGFyYWRvciAtLT4NCg0KIyMjIEVqZXJjaWNpbyA0LiBJbnRlcnByZXRhY2nDs24gZGUgY2FyZ2FzIGZhY3RvcmlhbGVzDQoNClN1cG9uZ2EgcXVlIGVuIHVuIG1vZGVsbyBjb24gKnZhcmlhYmxlIG1hcmNhZG9yKiBzZSBmaWphIFwoXGxhbWJkYV8xID0gMVwpIHBhcmEgZWwgaW5kaWNhZG9yIFwoeF8xXCksIHkgc2UgZXN0aW1hIFwoXGxhbWJkYV8yID0gMC43NVwpIHBhcmEgXCh4XzJcKS4gIA0KDQphLiBJbnRlcnByZXRlIFwoXGxhbWJkYV8yID0gMC43NVwpIGVuIHTDqXJtaW5vcyBkZSB1bmlkYWRlcyBkZSBjYW1iaW8uDQoNCmIuIEV4cGxpcXVlIHBvciBxdcOpIGVzdGEgaW50ZXJwcmV0YWNpw7NuIGRlcGVuZGUgZGVsIGluZGljYWRvciBtYXJjYWRvciBlbGVnaWRvLg0KDQpjLiBEaXNjdXRhIHF1w6kgY2FtYmlhcsOtYSAoY29uY2VwdHVhbG1lbnRlKSBzaSBlbCBtb2RlbG8gc2UgZXN0aW1hcmEgdXNhbmRvICpjb2RpZmljYWNpw7NuIGRlIGVmZWN0b3MqLg0KDQoNCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCiMjIyBFamVyY2ljaW8gNS4gTcOpdG9kb3MgZGUgZXN0aW1hY2nDs24NCg0KUGFyYSBjYWRhIHVubyBkZSBsb3Mgc2lndWllbnRlcyBlc2NlbmFyaW9zLCBpbmRpcXVlICpxdcOpIG3DqXRvZG8gZGUgZXN0aW1hY2nDs24gc2Vyw61hIG3DoXMgYXByb3BpYWRvKiB5IGp1c3RpZmlxdWUgc3UgcmVzcHVlc3RhOg0KDQphLiBJbmRpY2Fkb3JlcyBjb250aW51b3MgYXByb3hpbWFkYW1lbnRlIG5vcm1hbGVzLCB0YW1hw7FvIG11ZXN0cmFsIG1vZGVyYWRvLg0KDQpiLiBJbmRpY2Fkb3JlcyBvcmRpbmFsZXMgdGlwbyBMaWtlcnQgY29uIGNpbmNvIGNhdGVnb3LDrWFzIHkgbXVlc3RyYSBncmFuZGUuDQoNCmMuIEluZGljYWRvcmVzIGRpY290w7NtaWNvcyBjb24gZnVlcnRlIGFzaW1ldHLDrWEgeSBjdXJ0b3NpcyBlbGV2YWRhLg0KDQpkLiBNb2RlbG8gcHJlbGltaW5hciB1c2FkbyDDum5pY2FtZW50ZSBwYXJhIG9idGVuZXIgdmFsb3JlcyBpbmljaWFsZXMuDQoNCg0KDQo8IS0tICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUgLS0+DQo8IS0tIFNlcGFyYWRvciAtLT4NCg0KIyMjIEVqZXJjaWNpbyA2LiBFdmFsdWFjacOzbiBkZWwgYWp1c3RlIGRlbCBtb2RlbG8NCg0KU3Vwb25nYSBxdWUgdW4gbW9kZWxvIFNFTSBhcnJvamEgbG9zIHNpZ3VpZW50ZXMgcmVzdWx0YWRvczoNCg0KLSBcKFxjaGleMlwpIHNpZ25pZmljYXRpdm8uDQoNCi0gUk1TRUEgPSAwLjA0NS4NCg0KLSBDRkkgPSAwLjk3Lg0KDQotIFNSTVIgPSAwLjA0Lg0KDQpEZXNhcnJvbGxlIGxvcyBzaWd1aWVudGVzIGluY2lzb3M6IA0KDQphLiBFdmFsw7plIGVsIGFqdXN0ZSBnbG9iYWwgZGVsIG1vZGVsbyBjb25zaWRlcmFuZG8gZGlzdGludG9zIHRpcG9zIGRlIMOtbmRpY2VzLg0KDQpiLiBFeHBsaXF1ZSBwb3IgcXXDqSB1biBcKFxjaGleMlwpIHNpZ25pZmljYXRpdm8gbm8gaW1wbGljYSBuZWNlc2FyaWFtZW50ZSB1biBtYWwgbW9kZWxvLg0KDQpjLiBEaXNjdXRhIGVsIHBhcGVsIGRlbCB0YW1hw7FvIG11ZXN0cmFsIGVuIGxhIGludGVycHJldGFjacOzbiBkZWwgYWp1c3RlLg0KDQoNCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCiMjIyBFamVyY2ljaW8gNy4gUmUtZXNwZWNpZmljYWNpw7NuIHJlc3BvbnNhYmxlIGRlbCBtb2RlbG8NCg0KVW4gbW9kZWxvIFNFTSBwcmVzZW50YSB1biBhanVzdGUgaW5zYXRpc2ZhY3RvcmlvIHkgdmFyaW9zIMOtbmRpY2VzIGRlIG1vZGlmaWNhY2nDs24gc3VwZXJpb3JlcyBhIDEwLiANCg0KYS4gRXhwbGlxdWUgcG9yIHF1w6kgKm5vIGVzIGFwcm9waWFkbyogbGliZXJhciBhdXRvbcOhdGljYW1lbnRlIHRvZG9zIGxvcyBwYXLDoW1ldHJvcyBzdWdlcmlkb3MuDQoNCmIuIEluZGlxdWUgYWwgbWVub3MgdHJlcyBjcml0ZXJpb3MgKm5vIGVzdGFkw61zdGljb3MqIHF1ZSBkZWJlcsOtYW4gZ3VpYXIgdW5hIHJlLWVzcGVjaWZpY2FjacOzbi4NCg0KYy4gRGlzY3V0YSBjw7NtbyBsYSByZS1lc3BlY2lmaWNhY2nDs24gcHVlZGUgYWZlY3RhciBsYSByZXBsaWNhYmlsaWRhZCBkZWwgbW9kZWxvLg0KDQoNCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCiMjIyBFamVyY2ljaW8gOC4gSW50ZWdyYWRvciANCg0KQ29uc3RydXlhIHVuICpkaWFncmFtYSBTRU0gY29uY2VwdHVhbCogcXVlIGluY2x1eWEgZXhwbMOtY2l0YW1lbnRlIGxvcyBzaWV0ZSB0aXBvcyBkZSB2YXJpYWJsZXMgZGlzY3V0aWRvcyBlbiBlbCBjYXDDrXR1bG86DQoNCi0gTWFuaWZpZXN0YXMuICANCg0KLSBMYXRlbnRlcy4NCg0KLSBFcnJvcmVzLiANCg0KLSBFeMOzZ2VuYXMuICANCg0KLSBFbmTDs2dlbmFzLiAgDQoNCi0gTWVkaWFkb3Jhcy4NCg0KLSBWYXJpYWJsZSBkZSBhZ3J1cGFjacOzbi4gIA0KDQpFeHBsaXF1ZSBicmV2ZW1lbnRlIGVsIHJvbCBkZSBjYWRhIGVsZW1lbnRvIGVuIGVsIGRpYWdyYW1hLg0KDQoNCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCg0KPCEtLSBDYXDDrXR1bG8gQmlibGlvZ3JhZsOtYS0tPg0KDQoNCiMgQmlibGlvZ3JhZsOtYSB7LnVubGlzdGVkIC51bm51bWJlcmVkfQ0KICANCkNvbnN1bHRhciBlbCBkb2N1bWVudG8gW1JQdWJzIDo6IEFuw6FsaXNpcyBtdWx0aXZhcmlhZG8gKGJpYmxpb2dyYWbDrWEpXShodHRwczovL3JwdWJzLmNvbS9obGxpbmFzL1JfTXVsdGl2YXJpYWRvX0JpYmxpb2dyYWZpYSkuDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUgLS0+DQoNCiZuYnNwOw0KDQoNCiZuYnNwOw0KPGNlbnRlcj4NCn5+fg0KSWYgeW91IGZvdW5kIGFueSBFUlJPUlMgb3IgaGF2ZSBTVUdHRVNUSU9OUywgcGxlYXNlIHJlcG9ydCB0aGVtIHRvIG15IGVtYWlsLiBUaGFua3MuICANCn5+fg0KPC9jZW50ZXI+DQoNCg0K