hllinas2023

1 Introducción

1.0.1 ¿Qué son los SEM?

  1. Los modelos de ecuaciones estructurales (SEM, Structural Equation Models) permiten analizar simultáneamente múltiples relaciones entre variables.

  2. Combinan elementos de la regresión múltiple y del análisis factorial para estudiar variables observadas y latentes.

  3. Permiten incorporar errores de medición dentro del modelo.

  4. Facilitan la estimación de efectos directos, indirectos y mediadores.

  5. 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.

1.0.2 ¿Para qué sirven los SEM?

  1. Evaluar teorías que involucran múltiples relaciones entre variables.

  2. Analizar efectos directos, indirectos y de mediación.

  3. Estudiar constructos latentes a partir de indicadores observables.

  4. Determinar qué tan bien un modelo teórico se ajusta a los datos.

1.0.3 Breve historia de los SEM

  1. 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.

  2. Durante las décadas de 1960 y 1970, estas ideas fueron ampliadas para analizar fenómenos complejos en las ciencias sociales y del comportamiento.

  3. En la década de 1970, Karl Jöreskog desarrolló LISREL (Linear Structural Relations), considerado el primer sistema general para los SEM modernos.

  4. 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.

  5. 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.

1.0.4 Software para SEM

Actualmente existen numerosos programas para estimar modelos SEM. Entre los más utilizados se encuentran:

  1. lavaan (R): gratuito, flexible y ampliamente utilizado en investigación académica.

  2. Mplus: uno de los programas más completos para modelos avanzados.

  3. AMOS: popular por su interfaz gráfica y facilidad de uso.

  4. Stata: incorpora procedimientos para SEM y modelos generalizados.

  5. 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.

2 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.

2.0.1 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.

2.0.2 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.

2.0.3 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

2.0.4 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.

3 Tipos de variables en SEM

3.0.1 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.

3.0.2 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]

3.0.3 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.

3.0.4 Clasificación 3: Variables mediadoras y moderadoras

Esta clasificación responde a la pregunta:

¿Qué función cumple la variable dentro de la relación entre otras variables?**

Variables mediadoras.

Una variable mediadora explica cómo o por qué una variable influye sobre otra.

Estructura general.

X ───► M ───► Y

donde:

  • X = variable independiente.

  • M = variable mediadora.

  • Y = variable dependiente.

Ejemplo.

Capacitación ─► Competencias ─► Desempeño

Interpretación: La capacitación mejora las competencias, y estas competencias mejoran el desempeño.

La variable mediadora es:

Competencias

Efectos en una mediación.

X ───► M ───► Y
│             ▲
└─────────────┘

Existen:

  • Efecto directo: \(X \rightarrow Y\).

  • Efecto indirecto: \(X \rightarrow M \rightarrow Y\).

  • Efecto total: suma de ambos.

Variables moderadoras.

Una variable moderadora modifica la intensidad o dirección de una relación.

La pregunta ya no es:

¿Cómo ocurre el efecto?

sino:

¿Cuándo ocurre? o ¿Para quién ocurre?

Ejemplo.

Sin moderador:

Experiencia laboral ─► Salario

Con moderador:

Experiencia laboral ─► Salario
          ▲
          │
       Género

La relación puede ser diferente para:

  • hombres,

  • mujeres.

En este caso, Género es una variable moderadora.

Interpretación matemática.

Sin moderación:

Experiencia ─► Salario

Con moderación:

(Experiencia × Género) ─► Salario

La pendiente cambia dependiendo del valor del moderador.

3.0.5 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:

  • errores de medición,

  • variabilidad específica del indicador,

  • factores no considerados en el modelo.

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.

4 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.

5 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

5.0.1 Diagrama SEM conceptual

**Diagrama SEM conceptual ilustrando diferentes tipos de variables**.

Figure 5.1: Diagrama SEM conceptual ilustrando diferentes tipos de variables.

5.0.2 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.

6 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 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 Es explicada por otras variables
Mediadora Puede o no Transmite un efecto
Moderadora Puede o no Generalmente no Modifica una relación
Error de medición No Error asociado a un indicador
Error estructural No Error asociado a una variable latente

7 Escala de las variables latentes

7.0.1 ¿Por qué debemos fijar una escala?

Considere la siguiente variable latente:

      Inteligencia
           │
     ┌─────┼─────┐
     ▼     ▼     ▼
    I1    I2    I3

donde:

  • I1 = Razonamiento lógico.

  • I2 = Comprensión verbal.

  • I3 = Memoria.

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.

7.0.2 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.

7.0.3 Modelo conceptual base

Para ilustrar los distintos métodos utilizaremos el siguiente modelo:

      Inteligencia
           │
     ┌─────┼─────┐
     ▼     ▼     ▼
    I1    I2    I3

donde:

  • I1 = Razonamiento lógico.

  • I2 = Comprensión verbal.

  • I3 = Memoria.

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.

8 Métodos para definir la escala de una variable latente

Existen tres métodos comunes para establecer la escala de una variable latente:

  1. Variable latente estandarizada.

  2. Variable marcador.

  3. Codificación de efectos.

9 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 \]

9.0.1 Interpretación

En este caso:

  • La variable latente queda medida en desviaciones estándar.

  • Es similar a trabajar con puntuaciones estandarizadas (z-scores).

Media = 0
Varianza = 1
Desviación estándar = 1

9.0.2 Ejemplo

Si una persona obtiene:

\[ \eta = 2 \]

significa que se encuentra aproximadamente dos desviaciones estándar por encima del promedio en inteligencia.

9.0.3 Ventajas

  • Facilita la comparación entre factores.

  • Produce coeficientes estandarizados de forma natural.

9.0.4 Desventajas

  • La escala pierde interpretación práctica.

  • Los resultados se expresan en unidades abstractas.

10 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

10.0.1 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.

10.0.2 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.

10.0.3 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.

10.0.4 Ventajas

  • Es el método más utilizado.

  • Tiene una interpretación sencilla.

10.0.5 Desventajas

  • Los resultados dependen parcialmente del indicador elegido como referencia.

11 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 \]

11.0.1 Interpretación

  • Ningún indicador define por sí solo la escala del factor.

  • Todos los indicadores participan conjuntamente en la definición de la unidad de medida.

11.0.2 Ejemplo

Suponga:

\[ \lambda_1 = 0.8 \]

\[ \lambda_2 = 1.1 \]

\[ \lambda_3 = 1.1 \]

Entonces:

\[ \frac{0.8+1.1+1.1}{3}=1 \]

11.0.3 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.

11.0.4 Ventajas

  • Reduce la dependencia de un único indicador.

  • Utiliza toda la información disponible.

11.0.5 Desventajas

  • Su interpretación es menos intuitiva.

  • Es menos utilizada en cursos introductorios.

12 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

13 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

13.0.1 Idea clave

  • Los tres métodos producen esencialmente el mismo modelo teórico y el mismo ajuste global.

  • La diferencia radica únicamente en la forma en que se define la unidad de medida de la variable latente:

    • Variable latente estandarizada: el factor se mide en desviaciones estándar.

    • Variable marcador: el factor adopta la escala de un indicador de referencia.

    • Codificación de efectos: el factor adopta una escala basada en el promedio de los indicadores.

14 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.

14.0.1 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.

**Covariación**

Figure 14.1: Covariación

14.0.2 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.

**Causalidad**

Figure 14.2: Causalidad

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.

14.0.3 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.

**Relación espuria**

Figure 14.3: Relación espuria

14.0.4 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 directa**

Figure 14.4: Causalidad directa

14.0.5 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 indirecta**

Figure 14.5: Causalidad indirecta

14.0.6 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.

**Causalidad recíproca**

Figure 14.6: Causalidad recíproca

14.0.7 Diagramas estructurales

Como ejemplo, véase la figura 14.7.

**Ejemplo de un diagrama estructural**

Figure 14.7: Ejemplo de un diagrama estructural

Observaciones.

  1. Los efectos directos se indican con flechas rechas.

  2. El final de la flecha es la variable dependiente.

  3. Las estimaciones delos parámetros siempre aparecen sobre la flecha correspondiente.

  4. Cualquier variable que sea influenciada por otra variable del modelo debe tener un término de error.

  5. 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.

15 Componentes de un SEM

15.0.1 Tipos

  1. Son dos: Modelo de medida y modelo estructural. Más adelante, se explica cada uno de ellos.

  2. 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.

15.0.2 Modelo de medida

  1. Compuesto por las relaciones entre las variables indicadoras del modelo y sus constructos latentes.

  2. Así como por las relaciones de covarianza entre las variables latentes.

  3. Cada constructo latente y sus indicadores forman una parte del modelo de medida.

  4. También conocido como instrumento de medida y es el modelo propuesto para “medir” las variables latentes.

  5. 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í.

  6. Véase la figura 15.1.

**Modelo de medida**

Figure 15.1: Modelo de medida

15.0.3 Modelo estructural

  1. Se refiere a las interrelaciones causales propuestas entre las variables latentes del modelo.

  2. Es la parte del modelo que emplea el análisis de caminos (path analysis), pero con variables alatentes.

  3. Es similar a un análisis de regresión.

  4. Véase la figura 15.2.

**Modelo estructural**

Figure 15.2: Modelo estructural

15.0.4 Modelo estructural completo

Véase la figura 15.3.

**Modelo estructural completo**

Figure 15.3: Modelo estructural completo

16 Otros tipos de modelos

16.0.1 Modelo factorial exploratorio vs confirmatorio

  1. El modelo de variables latentes (LVM) crea las variables latentes (LVs) empleadas en el modelo estructural.

  2. Cuando un LVM se examina sin un modelo estructural, se conoce ocasionalmente como análisis factorial confirmatorio (CFA).

  3. Si no se tuviera una estructura hipotética para el modelo de variables latentes, se trataría de un análisis factorial exploratorio (EFA).

  4. Véase la figura 16.1.

**Modelo factorial exploratorio vs confirmatorio**

Figure 16.1: Modelo factorial exploratorio vs confirmatorio

16.0.2 Modelo formativo vs reflectivo

  1. Existen dos tipos de variables latentes: reflectivas y formativas.

  2. Se considera que las variables latentes reflectivas causan la covariación de otras variables.

  3. Las variables latentes formativas son el resultado de la covariación de otras variables (similar a un modelo de regresión).

  4. Véase la figura 16.2.

**Modelo formativo vs reflectivo**

Figure 16.2: Modelo formativo vs reflectivo

16.0.3 Modelos de segundo orden

Véase la figura 16.3.

**Modelos de segundo orden**

Figure 16.3: Modelos de segundo orden

17 Procedimiento para ejecutar un SEM

17.0.1 Etapa 1: Validación del modelo de medida

  1. 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.

  2. Significa reemplazar los efectos directos e indirectos del componente estructural propuestos según la teoría por relaciones de covarianza entre las variables latentes.

  3. Si el ajuste es rechazado se aplican herramientas de reespecificación.

17.0.2 Etapa 2: Ajuste del modelo completo de ecuaciones estructurales

  1. Es el ajuste del SEM incorporando las modificaciones de la etapa anterior.

  2. 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.

18 Pasos en cada una de las etapas

Son los siguientes (cada uno se explicará más adelante):

  1. Especificación.

  2. Identificación.

  3. Evaluación de la calidad de la base de datos.

  4. Estimación de parámetros.

  5. Evaluación de la bondad de ajuste.

  6. Re-especificación del modelo.

Véase la figura 18.1.

**Pasos en cada una de las etapas**

Figure 18.1: Pasos en cada una de las etapas

19 Especificación

  1. El modelo se define con base en los conocimientos teóricos y antecedentes empíricos del tema estudiado.

  2. Se deben incluir únicamente las variables esenciales que cuenten con un fuerte respaldo teórico y empírico.

  3. Es crucial determinar las relaciones entre variables latentes e indicadoras, asumiendo que cualquier relación no especificada no existe.

  4. 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.

  5. 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.

  6. En esta etapa se determina qué parámetros serán estimados y cuáles se mantendrán constantes.

  7. Además, se asume la forma de la distribución conjunta, usualmente una normalidad multivariada.

  8. Lo más común es diseñar el modelo utilizando un diagrama estructural.

  9. A partir de este gráfico, el software genera las ecuaciones del modelo automáticamente.

  10. 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.

20 Identificación

20.0.1 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.

20.0.2 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):

  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):

  1. La carga factorial asociada a una de las variables observadas (de referencia) de cada latente o

  2. La varianza de las variables latentes exógenas.

**Identificación (condiciones 2 y 3)**

Figure 20.1: Identificación (condiciones 2 y 3)

20.0.3 Identificación (observaciones)

  1. Que se haya identificado completamente el modelo de ecuaciones estructurales (SEM) no asegura que el modelo de medida también lo esté.

  2. 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:

    • Regla de los tres indicadores.

    • Regla de los dos indicadores.

20.0.4 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 tres indicadores)**

Figure 20.2: Identificación (regla de los tres indicadores)

20.0.5 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).

**Identificación (regla de los dos indicadores)**

Figure 20.3: Identificación (regla de los dos indicadores)

21 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:

  1. Tamaño de la muestra.

  2. Multicolinealidad.

  3. Valores extremos univariados y multivariados.

4.Normalidad multivariada.

21.0.1 Tamaño de la muestra

Se recomienda tener:

  1. Al menos 200 observaciones.

  2. Al menos 10 observaciones por cada variable observada.

21.0.2 Multicolinealidad

  1. 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.

  2. Es importante examinar los coeficientes de correlación, así como el determinante y los autovalores de la matriz de correlación.

21.0.3 Valores extremos univariados y multivariados

  1. Se deben eliminar observaciones cuyos valores se desvíen más de 3 desviaciones estándar de la media.

  2. En el caso de valores extremos multivariados, se deben calcular las distancias de Mahalanobis y descartar las observaciones con distancias significativas al 1%.

21.0.4 Normalidad multivariada

  1. Se deben examinar los coeficientes de asimetría y curtosis para evaluar la normalidad univariada.

  2. Se consideran normales las variables cuyos coeficientes en valor absoluto sean menores a 3 y 10 respectivamente.

  3. 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.

21.0.5 Normalidad multivariada: comentario

  1. 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.

  2. Sin embargo, si la curtosis difiere significativamente de la normal, estos estimadores son consistentes pero no eficientes asintóticamente.

  3. 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.

22 Estimación de parámetros

22.0.1 Objetivos

  1. En los modelos de ecuaciones estructurales (SEM), el objetivo es ajustar las covarianzas entre las variables.

  2. 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.

  3. Por esta razón, estos modelos también se conocen como modelos de estructura de covarianza (Covariance Structure Models).

22.0.2 Hipótesis fundamental

  1. 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.

  2. Expresado en notación:

\[Ho:\; \Sigma \,=\, \Sigma(\theta)\]

  1. 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\).

23 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)\)

24 Estimación: métodos

24.0.1 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:

  1. Máxima verosimilitud (ML).

  2. Mínimos cuadrados no ponderados (ULS).

  3. Mínimos cuadrados generalizados (GLS).

  4. Mínimos cuadrados ponderados (WLS) o de distribución asintóticamente libre (ADF).

24.0.2 Máxima verosimilitud (ML)

  1. 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.

  2. 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.

24.0.3 Mínimos cuadrados no ponderados (ULS)

  1. 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.

  2. No requiere que la matriz de covarianzas muestral sea definida positiva, lo que puede resultar ventajoso en situaciones problemáticas.

  3. Produce estimadores insesgados, aunque generalmente menos eficientes que los obtenidos mediante ML.

  4. Requiere que todas las variables observadas estén medidas en la misma escala.

  5. En la práctica, suele emplearse como método preliminar para obtener valores iniciales que posteriormente se utilizan en la estimación por ML.

24.0.4 Mínimos cuadrados generalizados (GLS)

  1. Al igual que ML, este método opera bajo el supuesto de normalidad multivariada.

  2. A diferencia de ULS, no exige que todas las variables estén en la misma escala, ya que incorpora una matriz de ponderación.

  3. 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.

24.0.5 Mínimos cuadrados ponderados (WLS) o de distribución asintóticamente libre (ADF)

  1. 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.

  2. 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.

25 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.

25.0.1 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.

25.0.2 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.

25.0.3 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.

25.0.4 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.

25.0.5 Resumen de las funciones de ajuste

Véase la figura 25.1.

**Funciones de bondad de ajuste**

Figure 25.1: Funciones de bondad de ajuste

26 Estimación con variables observadas ordinales o categóricas

26.0.1 Observaciones generales

  1. 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.

  2. 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.

26.0.2 Indicadores en escala Likert o similar

  1. 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.

  2. Este enfoque es válido únicamente bajo el supuesto de unidimensionalidad, es decir, que los indicadores agrupados midan un único constructo latente.

  3. Para evaluar este supuesto, se recomienda realizar previamente un Análisis Factorial Exploratorio (AFE).

  4. La agrupación de indicadores puede realizarse de forma aleatoria o, preferiblemente, atendiendo a criterios de contenido o afinidad conceptual.

26.0.3 Metodología de Muthén (1984) para variables continuas y categóricas (CVM)

  1. En este enfoque, las variables observadas pueden ser de cualquier tipo: dicotómicas, ordinales o continuas.

  2. 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).

  3. Esta metodología requiere un tamaño muestral considerable, dado el elevado número de parámetros involucrados en la matriz de ponderación.

  4. 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.

27 Evaluación del ajuste

27.0.1 Observaciones

  1. Se examina la significancia de los coeficientes, similar a un modelo de regresión, y se revisan las medidas de bondad de ajuste.

  2. 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.

27.0.2 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:

  1. 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.

  2. 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.

  3. 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.

27.0.3 Indices de ajuste

  1. La figura 27.1 resume los principales tipos de medidas de ajuste empleadas en SEM.
**Tipos de medidas de ajuste**

Figure 27.1: Tipos de medidas de ajuste

  1. 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.

  2. 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.

  3. 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.

28 Re-especificación del modelo

28.0.1 Descripción

  1. 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.

  2. Para ello, se examinan los índices de modificación, que corresponden a parámetros inicialmente fijados en cero (efectos no incluidos en el modelo).

  3. 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.

  4. 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.

  5. 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.

28.0.2 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:

  1. 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.

  2. 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.

  3. 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.

  4. 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).

  5. 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.

29 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.

29.0.1 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:

  1. Identifique todas las variables manifiestas del estudio.

  2. Identifique las variables latentes.

  3. Señale cuáles variables son exógenas, endógenas y *mediadoras**.

  4. Indique explícitamente los términos de error asociados.

  5. Identifique la variable de agrupación y explique su función en un análisis SEM multigrupo.

29.0.2 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:

  1. Explique por qué \(F_1\) se clasifica como variable exógena.

  2. Justifique por qué \(F_2\) es una variable endógena.

  3. Indique en qué sentido \(F_2\) puede considerarse una variable mediadora.

  4. Explique por qué los términos de error no deben interpretarse como “ruido irrelevante”.

29.0.3 Ejercicio 3. Escala de la variable latente

Considere un factor latente \(\eta\) medido por tres indicadores \(x_1, x_2, x_3\).

  1. Explique conceptualmente qué significa que el modelo no esté identificado si no se fija la escala de \(\eta\).

  2. Describa cómo se define la escala de \(\eta\) bajo cada uno de los siguientes métodos:

    • Variable latente estandarizada.

    • Variable marcador.

    • Codificación de efectos.

  3. Discuta una ventaja y una desventaja conceptual de cada método.

29.0.4 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\).

  1. Interprete \(\lambda_2 = 0.75\) en términos de unidades de cambio.

  2. Explique por qué esta interpretación depende del indicador marcador elegido.

  3. Discuta qué cambiaría (conceptualmente) si el modelo se estimara usando codificación de efectos.

29.0.5 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:

  1. Indicadores continuos aproximadamente normales, tamaño muestral moderado.

  2. Indicadores ordinales tipo Likert con cinco categorías y muestra grande.

  3. Indicadores dicotómicos con fuerte asimetría y curtosis elevada.

  4. Modelo preliminar usado únicamente para obtener valores iniciales.

29.0.6 Ejercicio 6. Evaluación del ajuste del modelo

Suponga que un modelo SEM arroja los siguientes resultados:

  • \(\chi^2\) significativo.

  • RMSEA = 0.045.

  • CFI = 0.97.

  • SRMR = 0.04.

Desarrolle los siguientes incisos:

  1. Evalúe el ajuste global del modelo considerando distintos tipos de índices.

  2. Explique por qué un \(\chi^2\) significativo no implica necesariamente un mal modelo.

  3. Discuta el papel del tamaño muestral en la interpretación del ajuste.

29.0.7 Ejercicio 7. Re-especificación responsable del modelo

Un modelo SEM presenta un ajuste insatisfactorio y varios índices de modificación superiores a 10.

  1. Explique por qué no es apropiado liberar automáticamente todos los parámetros sugeridos.

  2. Indique al menos tres criterios no estadísticos que deberían guiar una re-especificación.

  3. Discuta cómo la re-especificación puede afectar la replicabilidad del modelo.

29.0.8 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.

Bibliografía

Consultar el documento RPubs :: Análisis multivariado (bibliografía).

 

 
If you found any ERRORS or have SUGGESTIONS, please report them to my email. Thanks.  
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