¿Qué son los SEM?
Los modelos de ecuaciones estructurales (SEM, Structural Equation Models) constituyen una familia de modelos estadísticos multivariados que permiten estimar simultáneamente múltiples relaciones entre variables.
Surgieron como respuesta a la necesidad de ampliar la flexibilidad de los modelos clásicos de regresión, especialmente en contextos donde las relaciones entre variables son complejas.
Una de sus principales ventajas es que permiten incorporar explícitamente errores de medición tanto en variables dependientes como independientes.
Los SEM integran elementos de la regresión múltiple con técnicas de análisis factorial, lo que posibilita el estudio de variables observadas y latentes dentro de un mismo marco analítico.
De este modo, facilitan la representación y estimación de efectos directos, indirectos y mediadores entre las variables del modelo.
Desde el punto de vista matemático y computacional, los SEM son modelos altamente complejos, lo que requiere procedimientos de estimación avanzados.
Más que una técnica específica, los SEM representan una forma integral de concebir, formular y contrastar modelos teóricos a partir de datos empíricos.
¿Para qué sirven los SEM?
Formular modelos teóricos que permitan una comprensión más profunda de fenómenos complejos.
Evaluar empíricamente en qué medida los datos respaldan un modelo teórico que plantea múltiples relaciones de dependencia entre variables.
Analizar de forma simultánea relaciones directas, indirectas, mediadoras y potencialmente espurias entre un conjunto de variables.
Estudiar constructos latentes, es decir, variables que no pueden observarse directamente, pero que se infieren a partir de indicadores observables.
Antecedentes
En 1934, el biometrista Sewall Wright introdujo el análisis de trayectoria (path analysis), aplicándolo al estudio de relaciones causales en mediciones biológicas.
Posteriormente, sociólogos como Blalock (1964, 1971), Boudon (1965) y Duncan (1966) reconocieron su utilidad para el análisis de datos no experimentales, lo que impulsó su difusión en las ciencias sociales.
En la década de 1970, estadísticos como Jöreskog (1973), Keesling (1972) y Wiley (1973) desarrollaron el primer modelo general de ecuaciones estructurales, conocido como LISREL (Linear Structural Relations), también denominado modelo JKW.
Posteriormente, Jöreskog refinó el enfoque LISREL y desarrolló métodos para distintos tipos de datos: transversales, longitudinales, multigrupo y multinivel.
Diversos investigadores ampliaron este marco metodológico:
Sörbom (1974): modelos multigrupo con medias latentes.
Muthén (1977): inclusión de variables categóricas observadas.
Hägglund (1985): mínimos cuadrados en dos etapas.
Quiroga (1992): robustez mediante correlaciones policóricas.
Yang-Wallentin (1997): relaciones no lineales.
Extensiones recientes incluyen muestras complejas, modelos generalizados y series temporales.
¿Softwares para SEM?
LISREL (Linear Structural Relations), desarrollado por Jöreskog y Sörbom desde la década de 1970. Fue el primer software especializado en SEM y sentó las bases del enfoque moderno.
EQS, desarrollado por Bentler, orientado específicamente a SEM y ampliamente utilizado en las décadas de 1980 y 1990.
AMOS (Analysis of Moment Structures), desarrollado por Arbuckle, con énfasis en interfaces gráficas y uso integrado con SPSS.
Mplus, desarrollado por Muthén y Muthén, destaca por su flexibilidad para manejar variables categóricas, modelos multigrupo y extensiones como ESEM.
Mx / OpenMx, software libre basado en matrices, ampliamente usado en genética del comportamiento y modelos avanzados.
Otros: CALIS (SAS), RAMONA (SYSTAT), SEPATH (STATISTICA), lavaan (R), Stata y MATLAB.
La causalidad en SEM
Definición de causalidad
Antes de discutir el papel de la causalidad en los modelos de ecuaciones estructurales, es importante aclarar qué se entiende por causalidad en este contexto.
En SEM, una relación causal se concibe como una hipótesis teórica direccional que establece que una variable ejerce influencia sistemática sobre otra, bajo ciertos supuestos sobre el proceso generador de los datos. Estas hipótesis se formulan a priori y luego se contrastan empíricamente mediante el ajuste del modelo a los datos.
Causalidad en SEM
Una característica distintiva de los SEM es su capacidad para representar explícitamente hipótesis causales mediante relaciones direccionales entre variables.
Si bien los parámetros asociados a estas relaciones pueden estimarse estadísticamente, su estimación no implica automáticamente causalidad.
Toda interpretación causal debe estar sustentada en la teoría subyacente, el diseño del estudio y el conocimiento del fenómeno, no únicamente en el ajuste del modelo.
Los SEM no prueban la causalidad; permiten evaluar la plausibilidad empírica de hipótesis causales previamente formuladas.
En este enfoque, se especifica un conjunto de relaciones teóricas y se examina en qué medida estas relaciones son compatibles con la estructura de covarianzas observada en los datos.
Tipos de variables en SEM
Tipos de variables
Antes de introducir la notación formal y las ecuaciones matriciales de los modelos SEM, es fundamental comprender los tipos de variables involucradas y cómo se define la escala de los constructos latentes.
Variables manifistas (observadas, indicadoras): son variables observables, generalmente ítems o preguntas en un cuestionario.
Variables latentes (no observadas): son constructos teóricos que solo pueden medirse indirectamente a través de variables observables que actúan como sus manifestaciones. Similar al análisis factorial, se pueden utilizar múltiples medidas para representar un constructo, lo que ayuda a controlar el error de medición específico de cada variable.
Variables de error: representan tanto los errores asociados a la medición de una variable como aquellas variables no consideradas en el modelo que pueden influir en la medición de una variable observable. Al igual que las variables latentes, no son observables directamente.
Variables exógenas: Son variables que influyen en otras variables del modelo pero no son afectadas por ninguna otra variable. Son similares a las variables independientes en un modelo de regresión.
Variables endógenas: Son variables que son influenciadas por otras variables dentro del modelo. Corresponden a las variables dependientes en los modelos de regresión. Cada variable endógena debe estar acompañada de un término de error.
Variables mediadoras: Son las variables endógenas que a su vez influyen en otras endógenas.
Variables de agrupación o moderadoras: Son variables categóricas que indican la pertenencia de las observaciones a diferentes subpoblaciones. Se utilizan principalmente en análisis de comparaciones entre grupos.
Tipos de variables en un diagrama SEM
La figura siguiente presenta un diagrama SEM conceptual con fines explicativos. En él se muestran variables manifiestas e indicadores, factores latentes y sus términos de error, así como una relación estructural entre factores. Además, se asume un contexto multigrupo, donde una variable de agrupación (por ejemplo, school) define subpoblaciones para comparar el modelo entre grupos. El objetivo del diagrama es clarificar los roles conceptuales de los elementos, no interpretar estimaciones numéricas.
| x1, x2, x3, y1, y2, z1, z2 |
Manifiestas (observadas) |
Indicadores observados |
| F1, F2, F3 |
Latentes |
Constructos no observados |
| errores en x1–x3, y1–y2, z1–z2 (p.ej., e1–e7) |
Errores de medición |
Parte no explicada del indicador |
| error en F2 y F3 (disturbance) |
Error estructural |
Residuo de latentes endógenas |
| F1 |
Exógena |
No recibe flechas (no es explicada por otras latentes) |
| F2, F3 |
Endógenas |
Reciben flechas (son explicadas por otras latentes) |
| F2 |
Mediadora |
Transmite el efecto: (F1 → F2 → F3) |
| school |
Agrupación / moderadora |
Define subpoblaciones (no necesariamente aparece como nodo) |
Grupo (school)
↓
┌───────┐
│ F1 │ ← exógena
└───────┘
↑ ↑ ↑
e1 e2 e3
x1 x2 x3
↓
┌───────┐
│ F2 │ ← mediadora / endógena
└───────┘
↑ ↑
e4 e5
y1 y2
↓
┌───────┐
│ F3 │ ← endógena
└───────┘
↑ ↑
e6 e7
z1 z2
Escala de las variables latentes
Antes de introducir la notación matricial formal de los modelos de ecuaciones estructurales, es fundamental comprender cómo se define la escala de las variables latentes. Dado que las variables latentes no se observan directamente, no poseen unidades de medida inherentes, por lo que el modelo no está identificado a menos que se imponga alguna restricción para fijar su escala.
Escala: métodos
Existen tres métodos comunes para establecer la escala de una variable latente:
Variable latente estandarizada.
Variable marcador.
Codificación de efectos.
A continuación se ilustra cada método utilizando un mismo modelo conceptual base, con el objetivo de resaltar que el modelo no cambia, sino únicamente la forma en que se define la escala del factor latente.
Modelo conceptual base (común a los tres métodos)
Consideremos una variable latente \(\eta\) medida por tres indicadores observados \(x_1, x_2, x_3\):
x1
↑
|
┌───────┐
│ η │ ← variable latente
└───────┘
|
↓
x2
|
↓
x3
Este modelo de medición es idéntico en los tres métodos de escalamiento. Lo único que varía es la restricción utilizada para definir la unidad de medida de \(\eta\).
Escala: variable latente estandarizada
Restricción
En este método se impone la siguiente restricción:
\[Var(\eta)= 1\]
Interpretación conceptual
La variable latente se define en unidades de desviación estándar, de forma análoga a una variable tipificada.
Todas las cargas factoriales se estiman libremente.
La varianza del factor no se estima, sino que se fija en 1.
Interpretación de las cargas
Una carga factorial indica:
Cuántas desviaciones estándar cambia el indicador cuando la variable latente aumenta una desviación estándar.
Por ejemplo, si \(\lambda=0.70\), un aumento de una desviación estándar en \(\eta\) implica un aumento de \(0.70\) desviaciones estándar en \(x_2\).
Comentario pedagógico
Este método es útil para comparar magnitudes relativas, aunque las cargas fijadas a 1 en la métrica original no permanecen iguales a 1 cuando se muestran coeficientes estandarizados en diagramas SEM.
Carga factorial estandarizada
Definición
En un modelo CFA/SEM, la carga factorial estandarizada se define como:
\[
\lambda_{\text{std}} = \lambda_{\text{est}} \cdot \frac{\sigma_{\eta}}{\sigma_x},
\]
donde:
\(\lambda_{\text{est}}\) es la carga no estandarizada,
\(\sigma_{\eta}\) es la desviación estándar del factor latente y
\(\sigma_x\) es la desviación estándar del indicador observado.
Comentarios importantes
Este método establece la varianza de la variable latente en 1.0, convirtiéndola así en una variable estandarizada (similar a una puntuación \(Z\)).
Si las variables indicadoras también están estandarizadas, las cargas pueden interpretarse igual que un coeficiente de regresión estandarizado:
- El número de desviaciones estándar que cambia la variable manifiesta cuando la variable latente aumenta en una desviación estándar.
- Además, si hay más de una variable latente, la covarianza entre ellas se convierte en una correlación.
Estimaciones mostradas en summary() y en los diagramas SEM
Por defecto, la función summary() de lavaan presenta estimaciones no estandarizadas (columna Estimate). Estas estimaciones reflejan directamente el esquema de identificación del modelo, en el cual una carga factorial por factor suele fijarse en 1 (por ejemplo, x1 = 1, x4 = 1, x7 = 1) con el fin de definir la escala de las variables latentes.
En contraste, cuando se utiliza semPaths(..., what = "std", whatLabels = "std") del paquete semPlot, el diagrama SEM muestra coeficientes estandarizados. En este caso, las cargas factoriales fijadas a 1 en la métrica original no permanecen iguales a 1, ya que la estandarización transforma los parámetros. Por tanto, aun cuando \(\lambda_{\text{est}} = 1\), si \(\sigma_{\eta} \neq \sigma_x\), se obtiene necesariamente que
\[
\lambda_{\text{std}} \neq 1.
\]
Esto explica por qué en la salida de summary() se van a observar cargas iguales a 1, mientras que en los diagramas estandarizados dichas cargas van tomar valores distintos (si no se escriben los argumentos apropiados).
Escala: variable marcador
Definición
Este método implica restringir una carga factorial de cada variable latente a un valor arbitrario (usualmente \(\lambda_1=1.0\)).
La variable indicadora cuya carga está restringida se conoce como la variable marcador.
Este método define la varianza de la variable latente usando la variable marcador.
x1 ← variable marcador
↑
| λ1 = 1
┌───────┐
│ η │
└───────┘
|
↓
x2
|
↓
x3
Interpretación conceptual
La escala del factor queda definida en las unidades del indicador marcador.
La varianza de la variable latente se estima libremente.
Las demás cargas factoriales se interpretan relativamente al marcador.
Interpretación de las cargas
Si la carga factorial del segundo indicador es
\[
\lambda_2 = 0.80,
\]
entonces, por cada unidad de cambio en la variable latente \(\eta\) (medida en las unidades del indicador marcador \(x_1\)), el indicador \(x_2\) cambia 0.80 unidades.
Comentario pedagógico
Este es el método más utilizado en la práctica y corresponde al esquema por defecto de lavaan. Esto explica la presencia habitual de cargas factoriales fijadas en 1 en la salida de summary(), ya que dicha restricción se emplea para definir la escala del factor latente.
Escala: codificación de efectos
En este método se imponen restricciones sobre todas las cargas factoriales, de modo que su promedio sea igual a 1.
Para un factor con \(p\) indicadores, la restricción se expresa como:
\[
\frac{1}{p} \sum_{j=1}^{p} \lambda_j = 1.
\]
De manera equivalente, la suma de las cargas factoriales es igual al número de indicadores:
\[
\lambda_1 + \lambda_2 + \cdots + \lambda_p = p.
\]
En este ejemplo, \(p=3\).
x1
↑
| λ1
┌───────┐
│ η │ con promedio(λ) = 1
└───────┘
|
↓
x2
|
↓
x3
Interpretación conceptual
La variable latente se define en la escala promedio de sus indicadores.
Ningún indicador actúa como referencia privilegiada.
Todas las cargas factoriales se interpretan respecto al indicador promedio.
Comentario pedagógico
Este método es conceptualmente simétrico y elegante, aunque menos frecuente en aplicaciones estándar y en software que adopta por defecto el enfoque de variable marcador.
Comparación de los métodos de escala
| Latente estandarizada |
\(\mathrm{Var}(\eta) = 1\) |
Desviación estándar |
| Variable marcador |
\(\lambda = 1\) |
Indicador de referencia |
| Codificación de efectos |
\(\mathrm{Promedio}(\lambda) = 1\) |
Promedio de los indicadores |
Mensaje clave
En los tres casos, el modelo es el mismo.
Lo único que cambia es la convención utilizada para definir la escala de la variable latente.
Estas decisiones afectan la interpretación numérica de los parámetros, pero no alteran el ajuste del modelo ni las relaciones sustantivas entre las variables.
Tipos de relaciones entre variables
En un SEM, se pueden definir varios tipos de relaciones entre variables. A continuación se describen estos tipos de relaciones.
Covariación
Se refiere a la relación entre dos variables que varían juntas, pero sin implicar causalidad. Indica que cuando una variable cambia, la otra también lo hace, pero no necesariamente porque una cause a la otra.
Ejemplo.
La relación entre la cantidad de helados vendidos y el número de personas que van a la playa. Estas dos variables covarían porque ambas aumentan durante el verano, pero una no causa directamente a la otra. Véase la figura 8.1.
Causalidad:
Se refiere a una relación en la que un cambio en una variable provoca un cambio en otra. En SEM, la causalidad implica una dirección de influencia.
Ejemplo.
El nivel de educación y el salario. Una mayor educación (variable independiente) puede causar un aumento en el salario (variable dependiente). Véase la figura 8.2.
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 8.3.
Causalidad directa
Ocurre cuando una variable directamente afecta a otra sin la intervención de otras variables. En el diagrama de SEM, esto se representa con una flecha que va directamente de la variable causa a la variable efecto.
Ejemplo.
El tenre un empleo (variable independiente) incrementa los ingresos (variable dependiente). Véase la figura 8.4.
Causalidad indirecta
Se refiere a una situación en la que una variable afecta a otra a través de una o más variables intermedias (mediadoras). En un diagrama SEM, esto se muestra como una cadena de flechas que pasan por una o más variables mediadoras antes de llegar a la variable objetivo.
Ejemplo.
La educación afecta los ingresos a través del empleo. La educación (variable independiente) aumenta la probabilidad de obtener un empleo (variable mediadora), lo cual a su vez incrementa los ingresos (variable dependiente). Véase la figura 8.5.
Causalidad recíproca
Se presenta cuando dos variables se afectan mutuamente. Cada variable es a la vez causa y efecto de la otra. En un diagrama SEM, esto se representa con flechas bidireccionales entre las dos variables.
Ejemplo.
Estrés y problemas de salud. El estrés puede causar problemas de salud, y a su vez, los problemas de salud pueden aumentar el nivel de estrés. Esta relación es bidireccional. Véase la figura 8.6.
Diagramas estructurales
Como ejemplo, véase la figura 8.7.
Observaciones.
Los efectos directos se indican con flechas rechas.
El final de la flecha es la variable dependiente.
Las estimaciones delos parámetros siempre aparecen sobre la flecha correspondiente.
Cualquier variable que sea influenciada por otra variable del modelo debe tener un término de error.
Algunos programas también suelen mostrar:
Junto a cada variable, su varianza.
En el caso de las variables dependientes, la proporción de varianza explicada correspondiente.
Componentes de un SEM
Tipos
Son dos: Modelo de medida y modelo estructural. Más adelante, se explica cada uno de ellos.
Al sustituir en el modelo de medida las relaciones de covarianza por las relaciones causales de la parte estructural, se obtiene el modelo estructural completo, también denominado modelo de regresión estructural.
Modelo de medida
Compuesto por las relaciones entre las variables indicadoras del modelo y sus constructos latentes.
Así como por las relaciones de covarianza entre las variables latentes.
Cada constructo latente y sus indicadores forman una parte del modelo de medida.
También conocido como instrumento de medida y es el modelo propuesto para “medir” las variables latentes.
Este modelo corresponde a un análisis factorial confirmatorio,en el que cada variable latente se asocia con un grupo de variables observadas, y además se permite que las variables latentes estén correlacionadas entre sí.
Véase la figura 9.1.
Modelo estructural
Se refiere a las interrelaciones causales propuestas entre las variables latentes del modelo.
Es la parte del modelo que emplea el análisis de caminos (path analysis), pero con variables alatentes.
Es similar a un análisis de regresión.
Véase la figura 9.2.
Modelo estructural completo
Véase la figura 9.3.
Otros tipos de modelos
Modelo factorial exploratorio vs confirmatorio
El modelo de variables latentes (LVM) crea las variables latentes (LVs) empleadas en el modelo estructural.
Cuando un LVM se examina sin un modelo estructural, se conoce ocasionalmente como análisis factorial confirmatorio (CFA).
Si no se tuviera una estructura hipotética para el modelo de variables latentes, se trataría de un análisis factorial exploratorio (EFA).
Véase la figura 10.1.
Modelos de segundo orden
Véase la figura 10.3.
Procedimiento para ejecutar un SEM
Etapa 1: Validación del modelo de medida
Implica realizar un Análisis factorial Confirmatorio (AFC), proponiendo los indicadores de cada variable latente y
evaluando en forma conjunta la bondad de ajuste de los instrumentos de medida empleados para cada factor.
Significa reemplazar los efectos directos e indirectos del componente estructural propuestos según la teoría por relaciones de covarianza entre las variables latentes.
Si el ajuste es rechazado se aplican herramientas de reespecificación.
Etapa 2: Ajuste del modelo completo de ecuaciones estructurales
Es el ajuste del SEM incorporando las modificaciones de la etapa anterior.
Incluye la comparación con otros modelos alternativos que difieran en la parte estructural, si los hubiera, utilizando para esto contrastes de comparación de modelos.
Pasos en cada una de las etapas
Son los siguientes (cada uno se explicará más adelante):
Especificación.
Identificación.
Evaluación de la calidad de la base de datos.
Estimación de parámetros.
Evaluación de la bondad de ajuste.
Re-especificación del modelo.
Véase la figura 12.1.
Especificación
El modelo se define con base en los conocimientos teóricos y antecedentes empíricos del tema estudiado.
Se deben incluir únicamente las variables esenciales que cuenten con un fuerte respaldo teórico y empírico.
Es crucial determinar las relaciones entre variables latentes e indicadoras, asumiendo que cualquier relación no especificada no existe.
Es recomendable realizar un análisis factorial exploratorio (AFE) previo para validar o revalidar las escalas utilizadas en la medición de cada variable latente.
Según la regla de Kenny (1979), el número de factores por factor debe ser: mínimo 2, 3 es bueno, 4 es óptimo, y 5 o más es excesivo, pero no se deben exceder los 20 factores para todo el SEM.
En esta etapa se determina qué parámetros serán estimados y cuáles se mantendrán constantes.
Además, se asume la forma de la distribución conjunta, usualmente una normalidad multivariada.
Lo más común es diseñar el modelo utilizando un diagrama estructural.
A partir de este gráfico, el software genera las ecuaciones del modelo automáticamente.
La interfaz gráfica también permite añadir directamente en el diagrama las restricciones que se imponen habitualmente sobre los parámetros para los siguientes pasos del análisis.
Identificación
Identificación (definición)
Un modelo está identificado cuando todos y cada uno de sus parámetros pueden ser estimados de manera única a partir de la matriz de varianzas y covarianzas muestrales.
Identificación (condiciones)
Se deben cumplir las siguientes condiciones necesarias para la identificación:
Condición 1.
Si tenemos \(K\) variables observables, entonces, la cantidad de datos \(p\) (es decir, la cantidad de varianzas y covarianzas muestrales) debe ser suficiente para estimar el número de parámetros (\(q\)) del modelo. Esta es la regla clásica de conteo según la cual los grados de libertad deben ser mayores o iguales a cero:
\[\text{Grados de libertad} \;=\; p - q \;=\; \frac{K(K + 1)}{2} - q \; \geq \; 0\]
Condición 2.
Debe definirse la escala de los errores (véase la figura 14.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 14.1):
La carga factorial asociada a una de las variables observadas (de referencia) de cada latente o
La varianza de las variables latentes exógenas.
Identificación (observaciones)
Que se haya identificado completamente el modelo de ecuaciones estructurales (SEM) no asegura que el modelo de medida también lo esté.
Para los modelos de medida basados en análisis factorial confirmatorio (AFC) convencionales, donde cada indicador se asocia únicamente a un factor y los errores de medición no están correlacionados, es necesario cumplir con las siguientes reglas que se describen en la sección siguiente:
Identificación (Regla de los tres indicadores)
Si el modelo tiene una sola variable latente, debe incluir al menos tres indicadores (véase la figura 14.2).
Identificación (Regla de los dos indicadores)
Si el modelo incluye dos o más variables latentes, cada una de ellas debe tener al menos dos indicadores (véase la figura 14.3).
Evaluación de la calidad de la base de datos
En las siguientes secciones se van a proponer recomendaciones con respecto a los siguientes puntos:
Tamaño de la muestra.
Multicolinealidad.
Valores extremos univariados y multivariados.
4.Normalidad multivariada.
Tamaño de la muestra
Se recomienda tener:
Al menos 200 observaciones.
Al menos 10 observaciones por cada variable observada.
Multicolinealidad
Una colinealidad bivariada extrema (\(r > 0.85\)) y multivariada puede indicar la presencia de variables redundantes y que la matriz de correlación no sea definida positiva.
Es importante examinar los coeficientes de correlación, así como el determinante y los autovalores de la matriz de correlación.
Valores extremos univariados y multivariados
Se deben eliminar observaciones cuyos valores se desvíen más de 3 desviaciones estándar de la media.
En el caso de valores extremos multivariados, se deben calcular las distancias de Mahalanobis y descartar las observaciones con distancias significativas al 1%.
Normalidad multivariada
Se deben examinar los coeficientes de asimetría y curtosis para evaluar la normalidad univariada.
Se consideran normales las variables cuyos coeficientes en valor absoluto sean menores a 3 y 10 respectivamente.
Es importante aplicar pruebas de normalidad univariada (como la prueba conjunta de asimetría y curtosis) y algún test de normalidad multivariada (como el de Mardia). Lo más relevante es que se cumpla la curtosis multivariada.
Normalidad multivariada: comentario
Si la distribución no es normal pero presenta mesocurtosis, las propiedades de los estimadores de máxima verosimilitud son equivalentes a las que se tienen bajo la hipótesis de normalidad.
Sin embargo, si la curtosis difiere significativamente de la normal, estos estimadores son consistentes pero no eficientes asintóticamente.
Lo anterior puede generar dificultades en las pruebas de significación individual de los parámetros y en la prueba de validez global del modelo.
Estimación de parámetros
Objetivos
En los modelos de ecuaciones estructurales (SEM), el objetivo es ajustar las covarianzas entre las variables.
En lugar de reducir la diferencia entre los valores pronosticados y los observados a nivel individual, se busca minimizar la discrepancia entre las covarianzas observadas en la muestra y las covarianzas previstas por el modelo estructural.
Por esta razón, estos modelos también se conocen como modelos de estructura de covarianza (Covariance Structure Models).
Hipótesis fundamental
La hipótesis principal sostiene que, si el modelo es preciso, la matriz de varianzas y covarianzas de la población puede ser representada de manera exacta mediante una combinación de los parámetros del modelo.
Expresado en notación:
\[Ho:\; \Sigma \,=\, \Sigma(\theta)\]
- En la expresión anterior, \(\Sigma\) representa la matriz de varianzas y covarianzas de la población entre las variables observadas, y \(\Sigma(\theta)\) es la matriz de varianzas y covarianzas obtenida como una función de los parámetros contenidos en el vector \(\theta\).
Estimación: ejemplo
Consideremos el siguiente modelo de regresión:
\[ y \;=\; \beta x + \varepsilon\]
La matriz de varianzas y covarianzas entre \(X\) y \(Y\) es:
\[\Sigma \;= \; \begin{pmatrix}
V(X)& Cov(X,Y)\\
Cov(X,Y) & V(Y)
\end{pmatrix}\]
Aplicando propiedades de varianza y covarianza (y suponiendo que \(V(\varepsilon)=\sigma^2\)) se puede demostrar que:
\[Cov(X,Y) \;=\; \beta \,V(X), \qquad V(Y) \;=\; \beta^2\, V(X) \;+\; V(\varepsilon)\;=\; \beta^2\, V(X) \;+\; \sigma^2\]
Al reemplazar estas expresiones en la matriz de varianzas y covarianzas poblacional, se puede expresar en términos de los parámetros del modelo, obteniendo así la matriz implícita de varianzas y covarianzas:
\[\Sigma(\theta) \;= \; \begin{pmatrix}
V(X) & \beta \,V(X)\\
\beta \,V(X) & \beta^2\, V(X) \;+\; \sigma^2
\end{pmatrix}, \qquad \theta=(\beta, \sigma^2)^T\]
La estimación de los parámetros se lleva a cabo buscando maximizar la precisión del modelo. Para lograr esto, se intenta reducir al mínimo las diferencias entre las varianzas y covarianzas observadas, \(S\), y las que el modelo reproduce, \(S\big(\widehat{\theta}\big)\)
Estimación: métodos
Algunos métodos de estimación
En los modelos de ecuaciones estructurales (SEM) existen distintos métodos para estimar los parámetros del modelo, los cuales difieren en los supuestos estadísticos que adoptan, en la forma como tratan la matriz de covarianzas y en sus propiedades inferenciales. En las secciones siguientes se presentan y discuten los métodos más utilizados en la práctica aplicada:
Máxima verosimilitud (ML).
Mínimos cuadrados no ponderados (ULS).
Mínimos cuadrados generalizados (GLS).
Mínimos cuadrados ponderados (WLS) o de distribución asintóticamente libre (ADF).
Máxima verosimilitud (ML)
Es el método de estimación más utilizado en SEM y constituye la opción preferida bajo el supuesto de normalidad multivariada, debido a sus propiedades de insesgadez y eficiencia asintótica.
En la práctica, ML es relativamente robusto frente a desviaciones moderadas de la normalidad. Sin embargo, cuando la falta de normalidad es severa, se recomienda el uso de errores estándar robustos (por ejemplo, Quasi-Maximum Likelihood o correcciones tipo Huber–White) o procedimientos de bootstrap.
Mínimos cuadrados no ponderados (ULS)
Es conceptualmente similar al método de Mínimos Cuadrados Ordinarios (OLS) en regresión, en el sentido de que minimiza las discrepancias entre las covarianzas observadas y las reproducidas por el modelo.
No requiere que la matriz de covarianzas muestral sea definida positiva, lo que puede resultar ventajoso en situaciones problemáticas.
Produce estimadores insesgados, aunque generalmente menos eficientes que los obtenidos mediante ML.
Requiere que todas las variables observadas estén medidas en la misma escala.
En la práctica, suele emplearse como método preliminar para obtener valores iniciales que posteriormente se utilizan en la estimación por ML.
Mínimos cuadrados generalizados (GLS)
Al igual que ML, este método opera bajo el supuesto de normalidad multivariada.
A diferencia de ULS, no exige que todas las variables estén en la misma escala, ya que incorpora una matriz de ponderación.
En términos computacionales, suele ser más eficiente que ML y ULS, aunque en la práctica es menos utilizado que ML en aplicaciones estándar.
Mínimos cuadrados ponderados (WLS) o de distribución asintóticamente libre (ADF)
Este método no requiere el supuesto de normalidad multivariada, pero sí demanda un tamaño muestral elevado, típicamente entre 200 y 500 observaciones o más.
Es especialmente adecuado cuando se trabaja con variables ordinales o categóricas, estimadas a partir de matrices de correlaciones policóricas, tetracóricas o poliseriales.
Estimación: función de ajuste
En los modelos de ecuaciones estructurales, la estimación de los parámetros se realiza minimizando una función de ajuste, la cual mide la discrepancia entre la matriz de varianzas y covarianzas observada en la muestra, \(S\), y la matriz de varianzas y covarianzas implícita en el modelo, \(\Sigma(\theta)\).
Cada método de estimación se asocia con una función de ajuste particular, cuya minimización produce los estimadores de los parámetros del modelo.
Máxima verosimilitud (ML)
La función de ajuste de máxima verosimilitud se define como:
\[
F_{ML} \; = \; \log|\Sigma(\theta)| \;+\; \mathrm{tr}\!\left(S\,\Sigma^{-1}(\theta)\right) \;-\; \log|S| \;-\; (p+q),
\]
donde \(S\) es la matriz de covarianzas muestral, \(\Sigma(\theta)\) la matriz implícita del modelo, y \(p\) y \(q\) constantes que dependen del número de variables observadas.
Interpretación.
Este criterio evalúa qué tan probable es observar la matriz \(S\) bajo el supuesto de normalidad multivariada y dado el modelo especificado. Minimizar \(F_{ML}\) equivale a maximizar la verosimilitud del modelo, por lo que este método es el más utilizado cuando se asume normalidad multivariada.
Mínimos cuadrados no ponderados (ULS)
La función de ajuste ULS está dada por:
\[
F_{ULS} \; = \; \frac{1}{2}\,\mathrm{tr}\!\left(\big[S - \Sigma(\theta)\big]^2\right).
\]
Interpretación.
Este método minimiza directamente la suma de los cuadrados de las diferencias entre las covarianzas observadas y las reproducidas por el modelo, otorgando el mismo peso a todas ellas. Es conceptualmente simple y no requiere normalidad multivariada, aunque puede ser menos eficiente que ML.
Mínimos cuadrados generalizados (GLS)
La función de ajuste GLS se define como:
\[
F_{GLS} \; = \; \frac{1}{2}\,\mathrm{tr}\!\left(\left\{\big[S - \Sigma(\theta)\big] W^{-1}\right\}^2\right),
\]
donde \(W\) es una matriz de ponderación, usualmente relacionada con \(\Sigma(\theta)\).
Interpretación.
GLS extiende el método ULS incorporando ponderaciones, de modo que las discrepancias entre covarianzas no contribuyen todas por igual a la función de ajuste. Bajo normalidad multivariada, puede ser más eficiente que ULS, aunque suele ser computacionalmente menos estable que ML.
Mínimos cuadrados ponderados (WLS) o distribución asintóticamente libre (ADF)
La función de ajuste WLS (o ADF) se expresa como:
\[
F_{WLS} \; = \; \frac{1}{2}\,\mathrm{tr}\!\left(\left\{\big[S - \Sigma(\theta)\big] V^{-1}\right\}^2\right),
\]
donde \(V\) es la matriz de varianzas y covarianzas asintóticas de los elementos de \(S\).
Interpretación.
Este método pondera las discrepancias utilizando información sobre la variabilidad de las covarianzas muestrales. No requiere normalidad multivariada y es especialmente apropiado para variables ordinales o categóricas, aunque demanda tamaños muestrales grandes para un desempeño adecuado.
Comentario pedagógico
En todos los casos, el objetivo es el mismo: encontrar el conjunto de parámetros \(\theta\) que haga que la matriz implícita del modelo, \(\Sigma(\theta)\), se aproxime lo mejor posible a la matriz observada \(S\). Las diferencias entre los métodos radican en cómo se miden y ponderan esas discrepancias, no en la lógica general del enfoque.
Resumen de las funciones de ajuste
Véase la figura 19.1.
Estimación con variables observadas ordinales o categóricas
Observaciones generales
Cuando los indicadores asociados a una variable latente son ordinales o categóricos, el supuesto de normalidad multivariada suele verse comprometido. En estas condiciones, el uso del método de Máxima Verosimilitud (ML) no es recomendable en su forma estándar.
En su lugar, se deben emplear métodos de estimación que tengan en cuenta la falta de normalidad, ya sea mediante funciones de ajuste alternativas o a través de correcciones robustas en los errores estándar.
Indicadores en escala Likert o similar
Cuando los indicadores constituyen un conjunto homogéneo de variables medidas en escala Likert (u otras escalas ordinales similares), es posible agrupar los ítems (mediante la suma o el promedio de los puntajes) con el objetivo de aproximar la normalidad y así poder aplicar el método ML.
Este enfoque es válido únicamente bajo el supuesto de unidimensionalidad, es decir, que los indicadores agrupados midan un único constructo latente.
Para evaluar este supuesto, se recomienda realizar previamente un Análisis Factorial Exploratorio (AFE).
La agrupación de indicadores puede realizarse de forma aleatoria o, preferiblemente, atendiendo a criterios de contenido o afinidad conceptual.
Metodología de Muthén (1984) para variables continuas y categóricas (CVM)
En este enfoque, las variables observadas pueden ser de cualquier tipo: dicotómicas, ordinales o continuas.
El método se basa en el uso de una matriz de correlaciones policóricas (o tetracóricas, según corresponda), seguida de la estimación del modelo mediante Mínimos Cuadrados Ponderados (WLS) o el método Asintóticamente Libre de Distribución (ADF).
Esta metodología requiere un tamaño muestral considerable, dado el elevado número de parámetros involucrados en la matriz de ponderación.
Cuando se presentan dificultades asociadas a muestras pequeñas o problemas de convergencia, es posible complementar este enfoque con métodos de estimación robusta, que mejoren la estabilidad de los resultados.
Evaluación del ajuste
Observaciones
Se examina la significancia de los coeficientes, similar a un modelo de regresión, y se revisan las medidas de bondad de ajuste.
Ninguna medida por sí sola proporciona toda la información necesaria para evaluar el modelo, por lo que generalmente se utiliza un conjunto de medidas que se informa simultáneamente.
Tipos de medidas de ajuste
Las medidas de bondad de ajuste en los modelos de ecuaciones estructurales se agrupan, de manera general, en tres categorías principales, cada una de las cuales evalúa un aspecto distinto del desempeño del modelo:
Medidas absolutas. Evalúan directamente el grado de discrepancia entre la matriz de varianzas y covarianzas observada y la reproducida por el modelo, es decir, analizan el tamaño de los residuos sin realizar comparaciones con otros modelos.
Medidas de ajuste comparativo o incremental. Comparan el ajuste del modelo propuesto con el de un modelo de referencia más restrictivo (usualmente el modelo nulo o independiente), permitiendo valorar la mejora relativa del modelo especificado.
Medidas de parsimonia. Evalúan el ajuste del modelo teniendo en cuenta su complejidad, penalizando la inclusión excesiva de parámetros y favoreciendo modelos más simples que expliquen adecuadamente los datos.
Indices de ajuste
- La figura 21.1 resume los principales tipos de medidas de ajuste empleadas en SEM.
El estadístico \(\chi^2\) evalúa la discrepancia global entre la matriz observada y la matriz reproducida por el modelo. Idealmente, este estadístico debería resultar no significativo.
Un valor significativo de \(\chi^2\) indica que el modelo teórico propuesto difiere de manera significativa de la estructura de covarianzas observada en los datos.
En este contexto, la hipótesis nula establece que los residuos del modelo son nulos, es decir, que el modelo reproduce exactamente la matriz de varianzas y covarianzas poblacional.
Re-especificación del modelo
Descripción
Cuando el ajuste del modelo no es satisfactorio, puede ser necesario proceder a su re-especificación, siempre guiada por criterios teóricos y sustantivos.
Para ello, se examinan los índices de modificación, que corresponden a parámetros inicialmente fijados en cero (efectos no incluidos en el modelo).
Cada índice de modificación indica la reducción esperada en el estadístico \(\chi^2\) si el parámetro correspondiente fuera liberado y estimado.
Un valor superior a 3.84 (valor crítico de una \(\chi^2\) con 1 grado de libertad y \(\alpha = 0.05\)) sugiere que la inclusión de dicho parámetro produciría una mejora estadísticamente significativa en el ajuste del modelo.
En consecuencia, un índice de modificación elevado señala que la incorporación del efecto adicional podría mejorar de forma sustantiva el ajuste del modelo a los datos, siempre que exista una justificación teórica para ello.
Nota pedagógica: sobre la re-especificación de modelos
Aunque los índices de modificación constituyen una herramienta útil para diagnosticar fuentes de mal ajuste, no deben utilizarse como un mecanismo automático de corrección del modelo. En particular, es importante que el estudiante tenga en cuenta lo siguiente:
Los índices de modificación se calculan condicionalmente al modelo estimado y a la muestra analizada. Por tanto, reflejan posibles mejoras específicas de los datos y no necesariamente relaciones estructurales reales en la población.
Re-especificar un modelo basándose únicamente en criterios estadísticos puede conducir a sobreajuste (overfitting), es decir, a un modelo que reproduce muy bien los datos observados, pero que tiene escasa capacidad de generalización.
La inclusión indiscriminada de parámetros adicionales suele aumentar artificialmente el ajuste, pero debilita la interpretabilidad y la parsimonia del modelo, dos principios centrales en SEM.
Todo parámetro liberado debe contar con una justificación teórica, sustantiva o metodológica clara (por ejemplo, similitud de contenido entre ítems, efectos de método o fundamentos conceptuales previos).
En la práctica recomendada, los índices de modificación deben utilizarse como herramientas exploratorias, no como reglas de decisión automáticas.
En consecuencia, la re-especificación de un modelo SEM debe entenderse como un proceso iterativo guiado por la teoría, en el que la evidencia empírica complementa (pero no sustituye) al razonamiento conceptual.
Ejercicios
Los siguientes ejercicios tienen como objetivo reforzar la comprensión conceptual de los modelos de ecuaciones estructurales antes de introducir formalmente la notación matricial y los desarrollos algebraicos. En todos los casos, el énfasis debe ponerse en la interpretación, no en la optimización automática del ajuste.
Ejercicio 1. Identificación de tipos de variables
Considere el siguiente escenario:
Un investigador desea estudiar el efecto de la motivación académica sobre el rendimiento estudiantil, considerando además el rol de la autoeficacia como variable intermedia.
La motivación se mide mediante cuatro ítems tipo Likert, la autoeficacia mediante tres ítems y el rendimiento mediante el promedio de calificaciones. El estudio se realiza comparando estudiantes de colegios públicos y privados.
Desarrolle los siguientes incisos:
Identifique todas las variables manifiestas del estudio.
Identifique las variables latentes.
Señale cuáles variables son exógenas, endógenas y *mediadoras**.
Indique explícitamente los términos de error asociados.
Identifique la variable de agrupación y explique su función en un análisis SEM multigrupo.
Ejercicio 2. Lectura conceptual de un diagrama SEM
Considere un diagrama SEM conceptual que contiene:
Dos factores latentes \(F_1\) y \(F_2\).
Tres indicadores para \(F_1\) y dos para \(F_2\)
Una relación estructural \(F_2 \leftarrow F_1\).
Términos de error para todos los indicadores.
Desarrolle los siguientes incisos:
Explique por qué \(F_1\) se clasifica como variable exógena.
Justifique por qué \(F_2\) es una variable endógena.
Indique en qué sentido \(F_2\) puede considerarse una variable mediadora.
Explique por qué los términos de error no deben interpretarse como “ruido irrelevante”.
Ejercicio 3. Escala de la variable latente
Considere un factor latente \(\eta\) medido por tres indicadores \(x_1, x_2, x_3\).
Explique conceptualmente qué significa que el modelo no esté identificado si no se fija la escala de \(\eta\).
Describa cómo se define la escala de \(\eta\) bajo cada uno de los siguientes métodos:
Discuta una ventaja y una desventaja conceptual de cada método.
Ejercicio 4. Interpretación de cargas factoriales
Suponga que en un modelo con variable marcador se fija \(\lambda_1 = 1\) para el indicador \(x_1\), y se estima \(\lambda_2 = 0.75\) para \(x_2\).
Interprete \(\lambda_2 = 0.75\) en términos de unidades de cambio.
Explique por qué esta interpretación depende del indicador marcador elegido.
Discuta qué cambiaría (conceptualmente) si el modelo se estimara usando codificación de efectos.
Ejercicio 5. Métodos de estimación
Para cada uno de los siguientes escenarios, indique qué método de estimación sería más apropiado y justifique su respuesta:
Indicadores continuos aproximadamente normales, tamaño muestral moderado.
Indicadores ordinales tipo Likert con cinco categorías y muestra grande.
Indicadores dicotómicos con fuerte asimetría y curtosis elevada.
Modelo preliminar usado únicamente para obtener valores iniciales.
Ejercicio 6. Evaluación del ajuste del modelo
Suponga que un modelo SEM arroja los siguientes resultados:
Desarrolle los siguientes incisos:
Evalúe el ajuste global del modelo considerando distintos tipos de índices.
Explique por qué un \(\chi^2\) significativo no implica necesariamente un mal modelo.
Discuta el papel del tamaño muestral en la interpretación del ajuste.
Ejercicio 7. Re-especificación responsable del modelo
Un modelo SEM presenta un ajuste insatisfactorio y varios índices de modificación superiores a 10.
Explique por qué no es apropiado liberar automáticamente todos los parámetros sugeridos.
Indique al menos tres criterios no estadísticos que deberían guiar una re-especificación.
Discuta cómo la re-especificación puede afectar la replicabilidad del modelo.
Ejercicio 8. Integrador
Construya un diagrama SEM conceptual que incluya explícitamente los siete tipos de variables discutidos en el capítulo:
Manifiestas.
Latentes.
Errores.
Exógenas.
Endógenas.
Mediadoras.
Variable de agrupación.
Explique brevemente el rol de cada elemento en el diagrama.
LS0tDQp0aXRsZTogIk1PREVMT1MgREUgRUNVQUNJT05FUyBFU1RSVUNUVVJBTEVTIChTRU0pIg0Kc3VidGl0bGU6IDxoMT4qKlRlb3LDrWEqKjwvaDE+DQoNCmF1dGhvcjogDQogIC0gbmFtZSAgICAgICAgICA6ICJEci4gcmVyLiBuYXQuIEh1bWJlcnRvIExMaW7DoXMgU29sYW5vIg0KICAgIGFmZmlsaWF0aW9uICAgOiAiRGVwYXJ0YW1lbnRvIGRlIE1hdGVtw6F0aWNhcyB5IEVzdGFkw61zdGljYSwgVW5pdmVyc2lkYWQgZGVsIE5vcnRlIChCYXJyYW5xdWlsbGEsIENvbG9tYmlhKSINCiAgICAgI2NvcnJlc3BvbmRpbmcgOiB5ZXMgICAgIyBEZWZpbmUgb25seSBvbmUgY29ycmVzcG9uZGluZyBhdXRob3INCiAgICAgI2FkZHJlc3MgICAgICAgOiAiRGVwYXJ0YW1lbnRvIGRlIE1hdGVtw6F0aWNhcyB5IEVzdGFkw61zdGljYSINCiAgICBlbWFpbCAgICAgICAgIDogfA0KICAgICAgaGxsaW5hc0B1bmlub3J0ZS5lZHUuY28NCiAgICAgIA0KICAgICAgW0Jpb2dyYXBoaWNhbCBza2V0Y2hdKGh0dHBzOi8vcnB1YnMuY29tL2hsbGluYXMvQmlvX1NrZXRjaCkNCiAgICAgIA0KICAgICAgYHIgZm9ybWF0KFN5cy50aW1lKCksICIlZC8lbS8leSIpYCANCiAgICAgIA0KICAgICAjcm9sZTogICAgICAgICAjIENvbnRyaWJ1dG9yc2hpcCByb2xlcyAoZS5nLiwgQ1JlZGlULCBodHRwczovL2Nhc3JhaS5vcmcvY3JlZGl0LykNCiAgIyAgICAtIENvbmNlcHR1YWxpemF0aW9uDQogICMgICAgLSBXcml0aW5nIC0gT3JpZ2luYWwgRHJhZnQgUHJlcGFyYXRpb24NCiAgIyAgICAtIFdyaXRpbmcgLSBSZXZpZXcgJiBFZGl0aW5nDQogIyAtIG5hbWUgICAgICAgICAgOiAiQXV0b3IgbnVtZXJvIDIiDQogIyAgIGFmZmlsaWF0aW9uICAgOiAiMSwyIg0KICMgICByb2xlOg0KICMgICAgIC0gV3JpdGluZyAtIFJldmlldyAmIEVkaXRpbmcNCiAgICAgI2FmZmlsaWF0aW9uOg0KICAjLSBpZCAgICAgICAgICAgIDogIjEiDQogICMgIGluc3RpdHV0aW9uICAgOiAiVW5pdmVyc2lkYWQgZGVsIE5vcnRlIChCYXJyYW5xdWlsbGEsIENvbG9tYmlhKSINCiAgIyFbXShobGxpbmFzLmpwZyl7d2lkdGg9MWlufSANCiAgDQojZGF0ZTogJ2ByIGZvcm1hdChTeXMudGltZSgpLCAiJWQvJW0vJXkiKWAnICAjIHZlciBodHRwczovL2Jvb2tkb3duLm9yZy95aWh1aS9ybWFya2Rvd24tY29va2Jvb2svdXBkYXRlLWRhdGUuaHRtbA0Kb3V0cHV0OiANCiAgICBib29rZG93bjo6aHRtbF9kb2N1bWVudDI6IA0KICAgICAgICAgICNPSk8gU2FsZW4gY2FwaXR1bG9zLCBzZWNjaW9uZXMgeSBUZW9yZW1hcw0KICAgICNib29rZG93bjo6aHRtbF9ib29rOg0KICAgICAgICAgICNPSk8gRVJST1IgU2FsZW4gdGVvcmVtYXMsIHBlcm8gbm8gc2FsZW4gbG9zIGNhcGl0dWxvcyANCiAgICAjaHRtbF9kb2N1bWVudDoNCiAgICAgICAgICB0b2M6IHRydWUgICAgICAjIHRhYmxlIG9mIGNvbnRlbnQgdHJ1ZQ0KICAgICAgICAgIHRvY19kZXB0aDogNCAgICMgdXB0byB0aHJlZSBkZXB0aHMgb2YgaGVhZGluZ3MgKHNwZWNpZmllZCBieSAjLCAjIyBhbmQgIyMjKQ0KICAgICAgICAgIHRvY19mbG9hdDogdHJ1ZSAjQ29uIHRydWUsIHRvYyBzYWxlIGFsIG1hcmdlbiBpenF1aWVyZG8gZGUgbGEgcMOhZ2luYTsgZGUgbG8gY29udHJhcmlvLCBhcnJpYmENCiAgICAgICAgICBjb2xsYXBzZWQ6IGZhbHNlDQogICAgICAgICAgc21vb3RoX3Njcm9sbDogZmFsc2UNCiAgICAgICAgICBudW1iZXJfc2VjdGlvbnM6IHRydWUgICAjIGlmIHlvdSB3YW50IG51bWJlciBzZWN0aW9ucyBhdCBlYWNoIHRhYmxlIGhlYWRlcg0KICAgICAgICAgICN0aGVtZTogc2FuZHN0b25lDQogICAgICAgICAgI3RoZW1lOiB1bml0ZWQgICMgbWFueSBvcHRpb25zIGZvciB0aGVtZSwgdGhpcyBvbmUgaXMgbXkgZmF2b3JpdGUuDQogICAgICAgICAgI3RoZW1lOiBmbGF0bHkgICMgDQogICAgICAgICAgI3RoZW1lOiBjZXJ1bGVhbiAgIyANCiAgICAgICAgICAjaGlnaGxpZ2h0OiB0YW5nbyAgIyBzcGVjaWZpZXMgdGhlIHN5bnRheCBoaWdobGlnaHRpbmcgc3R5bGUNCiAgICAgICAgICAjY3NzOiBTY3JpcHRzIGFjY2Vzb3Jpb3MvZXN0aWxvYm90b24uY3NzDQogICAgICAgICAgI2NzczogbXkuY3NzICAgIyB5b3UgY2FuIGFkZCB5b3VyIGN1c3RvbSBjc3MsIHNob3VsZCBiZSBpbiBzYW1lIGZvbGRlcg0KICAgICAgICAgIGNvZGVfZG93bmxvYWQ6IHRydWUNCiAgICAgICAgICAjaGlnaGxpZ2h0OiB0YW5nbyAgIyBjYW1iaWFyIGNvbG9yIGRlIGxpYnJhcnkgZW4gYXp1bA0KICAgICMgYm9va2Rvd246OmdpdGJvb2s6DQogICAgIyAgICAgIGluY2x1ZGVzOg0KICAgICMgICAgICAgIGluX2hlYWRlcjogaGVhZGVyLmh0bWwNCiAgICAjIGJvb2tkb3duOjpwZGZfYm9vazoNCiAgICAjICAgICAgIGtlZXBfdGV4OiB5ZXMNCiAgICAjIGJvb2tkb3duOjpodG1sX2Jvb2s6DQogICAgIyAgICAgICBjc3M6IHRvYy5jc3MNCiAgICAjIGJvb2tkb3duOjpodG1sX2Jvb2s6DQogICAgIyAgICAgICAgIGluY2x1ZGVzOg0KICAgICMgICAgICAgICAgIGluX2hlYWRlcjogc3R5bGUuY3NzDQogICAgI2Jvb2tkb3duOjpodG1sX2RvY3VtZW50MjogZGVmYXVsdA0KICAgICMgYm9va2Rvd246OnBkZl9kb2N1bWVudDI6DQogICAgIyAgICAgIGtlZXBfdGV4OiB0cnVlDQogICAgI2JpYmxpb2dyYXBoeTogcmVmZXJlbmNlcy5iaWINCiAgICBtYXRoamF4OiAiaHR0cDovL2V4YW1wbGUuY29tL21hdGhqYXgvTWF0aEpheC5qcz9jb25maWc9VGVYLUFNUy1NTUxfSFRNTG9yTU1MIg0KaGVhZGVyLWluY2x1ZGVzOg0KICAgIFx1c2VwYWNrYWdlW3gxMW5hbWVzXXt4Y29sb3J9IA0KICAgIA0KY3NsOiBzY2llbmNlLmNzbA0KI09qbzogU2UgdXRpbGl6YSBsZW5ndWFqZSBZQU1MDQoNCmFic3RyYWN0OiB8DQogKipFbiBbUnB1YnM6OiB0b2NdKGh0dHBzOi8vcnB1YnMuY29tL2hsbGluYXMvdG9jKSBzZSBwdWVkZW4gdmVyIG90cm9zIGRvY3VtZW50b3MgZGUgcG9zaWJsZSBpbnRlcsOpcy4qKg0KICANCi0tLQ0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSwgZmlnLmFsaWduPSJjZW50ZXIiLCAgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSMsDQogICAgICAgICAgICAgICAgICAgICAgI3N0eWxlID0gImNvbG9yOmRhcmtibHVlIg0KICAgICAgICAgICAgICAgICAgICAjIGNsYXNzLnNvdXJjZT0iYmctZGFuZ2VyIiwgY2xhc3Mub3V0cHV0PSJiZy13YXJuaW5nIiAgICNDb2xvcmVzIGRlbnRybyBkZWwgY2h1bmsNCiAgICAgICAgICAgICAgICAgICAgICkNCmxpYnJhcnkocmdsKQ0Ka25pdHI6OmtuaXRfaG9va3Mkc2V0KHdlYmdsID0gaG9va193ZWJnbCkNCmBgYA0KDQoNCg0KDQpgYGB7ciwgZWNobz1GQUxTRSwgZXZhbD1GQUxTRX0NCmh0dHBzOi8vYm9va2Rvd24ub3JnL3lpaHVpL3JtYXJrZG93bi9sYW5ndWFnZS1lbmdpbmVzLmh0bWwNCg0KaHR0cHM6Ly9ib29rZG93bi5vcmcveWlodWkvYm9va2Rvd24vbWFya2Rvd24tc3ludGF4Lmh0bWwNCg0KaHR0cHM6Ly9ib29rZG93bi5vcmcveWlodWkvYm9va2Rvd24vYS1zaW5nbGUtZG9jdW1lbnQuaHRtbA0KDQpodHRwczovL2Jvb2tkb3duLm9yZy95aWh1aS9ib29rZG93bi9tYXJrZG93bi1leHRlbnNpb25zLWJ5LWJvb2tkb3duLmh0bWwNCg0KaHR0cHM6Ly9ib29rZG93bi5vcmcveWlodWkvcm1hcmtkb3duL2Jvb2tkb3duLW1hcmtkb3duLmh0bWwgICMgVGVvcmVtcyBhbmQgcHJvb2ZzDQoNCmh0dHBzOi8vYm9va2Rvd24ub3JnL3lpaHVpL2Jvb2tkb3duL21hcmtkb3duLWV4dGVuc2lvbnMtYnktYm9va2Rvd24uaHRtbCN0aGVvcmVtcw0KDQpodHRwczovL2Jvb2tkb3duLm9yZy95aWh1aS9ib29rZG93bi9odG1sLmh0bWwNCg0KaHR0cHM6Ly93d3cuZGF0YS10by12aXouY29tLw0KICANCltScHVic10obGluaykNCiAgDQooXCNlcTplYy0pLCAgRWN1YWNpb24gXEByZWYoZXE6ZWMtKSwgRmlndXJhIFxAcmVmKGZpZzpGaWctKSwgVGFibGUgXEByZWYodGFiOm10Y2FycyksIFRoZW9yZW0gXEByZWYodGhtOmJvcmluZykNCg0KDQojIFRpdHVsbyB7I1RpdHVsb1NlY2Npb259ICAgXEByZWYoVGl0dWxvU2VjY2lvbikNCiAgDQojIEZvciBIVE1MLCB3ZSBjYW4gc2V0IGNvbG9yIHdpdGggQ1NTLCBlLmcuLCA8c3BhbiBzdHlsZT0iY29sb3I6IHJlZDsiPnRleHQ8L3NwYW4+DQogIA0KIyBodHRwczovL3JhZGlhbnQtcnN0YXRzLmdpdGh1Yi5pby9kb2NzL21vZGVsL2xvZ2lzdGljLmh0bWwgU2hpbm55IExvZ2l0ICANCiAgDQpgYGANCg0KDQpgYGB7ciwgZXZhbD1GQUxTRSwgZWNobz1GQUxTRX0NCiNMYSBmb3RvIHRhbWHDsW8gY8OpZHVsYQ0KDQpodG1sdG9vbHM6OmltZyhzcmMgPSBrbml0cjo6aW1hZ2VfdXJpKGZpbGUucGF0aChSLmhvbWUoImRvYyIpLCAiaHRtbCIsICJsb2dvLmpwZyIpKSwgDQogICAgICAgICAgICAgICBhbHQgPSAnaGxsaW5hcycsIA0KICAgICAgICAgICAgICAgc3R5bGUgPSAncG9zaXRpb246YWJzb2x1dGU7IHRvcDowOyByaWdodDowOyBwYWRkaW5nOjEwcHg7JyAjLA0KICAgICAgICAgICAgICAgd2lkdGggPSAiMjAwcHgiKSAgIyBBcXXDrSBlc3BlY2lmaWNhcyBlbCBhbmNobyBkZXNlYWRvIGVuIHDDrXhlbGVzIG8gcG9yY2VudGFqZQ0KYGBgDQoNCg0KDQoNCmBgYHtyLCBlY2hvPUZBTFNFLCB9DQojIExhIGZvdG8gZ3JhbmRlDQoNCmh0bWx0b29sczo6aW1nKHNyYyA9IGtuaXRyOjppbWFnZV91cmkoImhsbGluYXMyMDIzLmpwZyIpLCANCiAgICAgICAgICAgICAgIGFsdCA9ICdobGxpbmFzMjAyMycsIA0KICAgICAgICAgICAgICAgc3R5bGUgPSAncG9zaXRpb246YWJzb2x1dGU7IHRvcDowOyByaWdodDowOyBwYWRkaW5nOjFweDsnLA0KICAgICAgICAgICAgICAgd2lkdGg9IjE1JSIpDQpgYGANCg0KDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUgLS0+DQo8IS0tIFNlcGFyYWRvciAgLS0+DQoNCmBgYHtjc3MsIGVjaG89RkFMU0V9DQouY29sdW1ucyB7ZGlzcGxheTogZmxleDt9DQpoMSB7Y29sb3I6IGRhcmtibHVlO30NCmgzIHtjb2xvcjogZGFya2dyZWVuO30NCmg0IHtjb2xvcjogZ3JlZW47fQ0KYGBgDQoNCg0KDQo8IS0tICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBDYXDDrXR1bG8gIC0tPg0KDQoNCmBgYHtjc3MsIGVjaG89RkFMU0UsIGV2YWw9RkFMU0V9DQojaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNDEwMzA0NzcvY2hhbmdpbmctY2h1bmstYmFja2dyb3VuZC1jb2xvci1pbi1ybWFya2Rvd24NCg0KLmJhZENvZGUgew0KYmFja2dyb3VuZC1jb2xvcjogcmVkOw0KfQ0KYGBgDQoNCg0KDQo8IS0tICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUgLS0+DQo8IS0tIFNlcGFyYWRvciAtLT4NCg0KIyDCv1F1w6kgc29uIGxvcyBTRU0/DQoNCg0KMS4gTG9zIG1vZGVsb3MgZGUgZWN1YWNpb25lcyBlc3RydWN0dXJhbGVzIChTRU0sICpTdHJ1Y3R1cmFsIEVxdWF0aW9uIE1vZGVscyopIGNvbnN0aXR1eWVuIHVuYSBmYW1pbGlhIGRlIG1vZGVsb3MgZXN0YWTDrXN0aWNvcyBtdWx0aXZhcmlhZG9zIHF1ZSBwZXJtaXRlbiBlc3RpbWFyIHNpbXVsdMOhbmVhbWVudGUgbcO6bHRpcGxlcyByZWxhY2lvbmVzIGVudHJlIHZhcmlhYmxlcy4NCg0KMi4gU3VyZ2llcm9uIGNvbW8gcmVzcHVlc3RhIGEgbGEgbmVjZXNpZGFkIGRlIGFtcGxpYXIgbGEgZmxleGliaWxpZGFkIGRlIGxvcyBtb2RlbG9zIGNsw6FzaWNvcyBkZSByZWdyZXNpw7NuLCBlc3BlY2lhbG1lbnRlIGVuIGNvbnRleHRvcyBkb25kZSBsYXMgcmVsYWNpb25lcyBlbnRyZSB2YXJpYWJsZXMgc29uIGNvbXBsZWphcy4NCg0KMy4gVW5hIGRlIHN1cyBwcmluY2lwYWxlcyB2ZW50YWphcyBlcyBxdWUgcGVybWl0ZW4gaW5jb3Jwb3JhciBleHBsw61jaXRhbWVudGUgZXJyb3JlcyBkZSBtZWRpY2nDs24gdGFudG8gZW4gdmFyaWFibGVzIGRlcGVuZGllbnRlcyBjb21vIGluZGVwZW5kaWVudGVzLg0KDQo0LiBMb3MgU0VNIGludGVncmFuIGVsZW1lbnRvcyBkZSBsYSByZWdyZXNpw7NuIG3Dumx0aXBsZSBjb24gdMOpY25pY2FzIGRlIGFuw6FsaXNpcyBmYWN0b3JpYWwsIGxvIHF1ZSBwb3NpYmlsaXRhIGVsIGVzdHVkaW8gZGUgdmFyaWFibGVzIG9ic2VydmFkYXMgeSBsYXRlbnRlcyBkZW50cm8gZGUgdW4gbWlzbW8gbWFyY28gYW5hbMOtdGljby4NCg0KNS4gRGUgZXN0ZSBtb2RvLCBmYWNpbGl0YW4gbGEgcmVwcmVzZW50YWNpw7NuIHkgZXN0aW1hY2nDs24gZGUgZWZlY3RvcyBkaXJlY3RvcywgaW5kaXJlY3RvcyB5IG1lZGlhZG9yZXMgZW50cmUgbGFzIHZhcmlhYmxlcyBkZWwgbW9kZWxvLg0KDQo2LiBEZXNkZSBlbCBwdW50byBkZSB2aXN0YSBtYXRlbcOhdGljbyB5IGNvbXB1dGFjaW9uYWwsIGxvcyBTRU0gc29uIG1vZGVsb3MgYWx0YW1lbnRlIGNvbXBsZWpvcywgbG8gcXVlIHJlcXVpZXJlIHByb2NlZGltaWVudG9zIGRlIGVzdGltYWNpw7NuIGF2YW56YWRvcy4NCg0KNy4gTcOhcyBxdWUgdW5hIHTDqWNuaWNhIGVzcGVjw61maWNhLCBsb3MgU0VNIHJlcHJlc2VudGFuIHVuYSBmb3JtYSBpbnRlZ3JhbCBkZSBjb25jZWJpciwgZm9ybXVsYXIgeSBjb250cmFzdGFyIG1vZGVsb3MgdGXDs3JpY29zIGEgcGFydGlyIGRlIGRhdG9zIGVtcMOtcmljb3MuDQoNCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCiMgwr9QYXJhIHF1w6kgc2lydmVuIGxvcyBTRU0/DQoNCjEuIEZvcm11bGFyIG1vZGVsb3MgdGXDs3JpY29zIHF1ZSBwZXJtaXRhbiB1bmEgY29tcHJlbnNpw7NuIG3DoXMgcHJvZnVuZGEgZGUgZmVuw7NtZW5vcyBjb21wbGVqb3MuDQoNCjIuIEV2YWx1YXIgZW1ww61yaWNhbWVudGUgZW4gcXXDqSBtZWRpZGEgbG9zIGRhdG9zIHJlc3BhbGRhbiB1biBtb2RlbG8gdGXDs3JpY28gcXVlIHBsYW50ZWEgbcO6bHRpcGxlcyByZWxhY2lvbmVzIGRlIGRlcGVuZGVuY2lhIGVudHJlIHZhcmlhYmxlcy4NCg0KMy4gQW5hbGl6YXIgZGUgZm9ybWEgc2ltdWx0w6FuZWEgcmVsYWNpb25lcyBkaXJlY3RhcywgaW5kaXJlY3RhcywgbWVkaWFkb3JhcyB5IHBvdGVuY2lhbG1lbnRlIGVzcHVyaWFzIGVudHJlIHVuIGNvbmp1bnRvIGRlIHZhcmlhYmxlcy4NCg0KNC4gRXN0dWRpYXIgY29uc3RydWN0b3MgbGF0ZW50ZXMsIGVzIGRlY2lyLCB2YXJpYWJsZXMgcXVlIG5vIHB1ZWRlbiBvYnNlcnZhcnNlIGRpcmVjdGFtZW50ZSwgcGVybyBxdWUgc2UgaW5maWVyZW4gYSBwYXJ0aXIgZGUgaW5kaWNhZG9yZXMgb2JzZXJ2YWJsZXMuDQoNCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCg0KIyBBbnRlY2VkZW50ZXMNCg0KMS4gRW4gMTkzNCwgZWwgYmlvbWV0cmlzdGEgU2V3YWxsIFdyaWdodCBpbnRyb2R1am8gZWwgYW7DoWxpc2lzIGRlIHRyYXllY3RvcmlhICgqcGF0aCBhbmFseXNpcyopLCBhcGxpY8OhbmRvbG8gYWwgZXN0dWRpbyBkZSByZWxhY2lvbmVzIGNhdXNhbGVzIGVuIG1lZGljaW9uZXMgYmlvbMOzZ2ljYXMuDQoNCjIuIFBvc3Rlcmlvcm1lbnRlLCBzb2Npw7Nsb2dvcyBjb21vIEJsYWxvY2sgKDE5NjQsIDE5NzEpLCBCb3Vkb24gKDE5NjUpIHkgRHVuY2FuICgxOTY2KSByZWNvbm9jaWVyb24gc3UgdXRpbGlkYWQgcGFyYSBlbCBhbsOhbGlzaXMgZGUgZGF0b3Mgbm8gZXhwZXJpbWVudGFsZXMsIGxvIHF1ZSBpbXB1bHPDsyBzdSBkaWZ1c2nDs24gZW4gbGFzIGNpZW5jaWFzIHNvY2lhbGVzLg0KDQozLiBFbiBsYSBkw6ljYWRhIGRlIDE5NzAsIGVzdGFkw61zdGljb3MgY29tbyBKw7ZyZXNrb2cgKDE5NzMpLCBLZWVzbGluZyAoMTk3MikgeSBXaWxleSAoMTk3MykgZGVzYXJyb2xsYXJvbiBlbCBwcmltZXIgbW9kZWxvIGdlbmVyYWwgZGUgZWN1YWNpb25lcyBlc3RydWN0dXJhbGVzLCBjb25vY2lkbyBjb21vIExJU1JFTCAoKkxpbmVhciBTdHJ1Y3R1cmFsIFJlbGF0aW9ucyopLCB0YW1iacOpbiBkZW5vbWluYWRvIG1vZGVsbyBKS1cuDQoNCjQuIFBvc3Rlcmlvcm1lbnRlLCBKw7ZyZXNrb2cgcmVmaW7DsyBlbCBlbmZvcXVlIExJU1JFTCB5IGRlc2Fycm9sbMOzIG3DqXRvZG9zIHBhcmEgZGlzdGludG9zIHRpcG9zIGRlIGRhdG9zOiB0cmFuc3ZlcnNhbGVzLCBsb25naXR1ZGluYWxlcywgbXVsdGlncnVwbyB5IG11bHRpbml2ZWwuDQoNCjUuIERpdmVyc29zIGludmVzdGlnYWRvcmVzIGFtcGxpYXJvbiBlc3RlIG1hcmNvIG1ldG9kb2zDs2dpY286DQogICAgDQogICAtIFPDtnJib20gKDE5NzQpOiBtb2RlbG9zIG11bHRpZ3J1cG8gY29uIG1lZGlhcyBsYXRlbnRlcy4NCiAgICANCiAgIC0gTXV0aMOpbiAoMTk3Nyk6IGluY2x1c2nDs24gZGUgdmFyaWFibGVzIGNhdGVnw7NyaWNhcyBvYnNlcnZhZGFzLg0KICAgDQogICAtIEjDpGdnbHVuZCAoMTk4NSk6IG3DrW5pbW9zIGN1YWRyYWRvcyBlbiBkb3MgZXRhcGFzLg0KICAgDQogICAtIFF1aXJvZ2EgKDE5OTIpOiByb2J1c3RleiBtZWRpYW50ZSBjb3JyZWxhY2lvbmVzIHBvbGljw7NyaWNhcy4NCiAgIA0KICAgLSBZYW5nLVdhbGxlbnRpbiAoMTk5Nyk6IHJlbGFjaW9uZXMgbm8gbGluZWFsZXMuDQogICANCiAgIC0gRXh0ZW5zaW9uZXMgcmVjaWVudGVzIGluY2x1eWVuIG11ZXN0cmFzIGNvbXBsZWphcywgbW9kZWxvcyBnZW5lcmFsaXphZG9zIHkgc2VyaWVzIHRlbXBvcmFsZXMuDQogICAgDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQojIMK/U29mdHdhcmVzIHBhcmEgU0VNPw0KDQoxLiAqKkxJU1JFTCoqICgqTGluZWFyIFN0cnVjdHVyYWwgUmVsYXRpb25zKiksIGRlc2Fycm9sbGFkbyBwb3IgSsO2cmVza29nIHkgU8O2cmJvbSBkZXNkZSBsYSBkw6ljYWRhIGRlIDE5NzAuIEZ1ZSBlbCBwcmltZXIgc29mdHdhcmUgZXNwZWNpYWxpemFkbyBlbiBTRU0geSBzZW50w7MgbGFzIGJhc2VzIGRlbCBlbmZvcXVlIG1vZGVybm8uDQoNCjIuICoqRVFTKiosIGRlc2Fycm9sbGFkbyBwb3IgQmVudGxlciwgb3JpZW50YWRvIGVzcGVjw61maWNhbWVudGUgYSBTRU0geSBhbXBsaWFtZW50ZSB1dGlsaXphZG8gZW4gbGFzIGTDqWNhZGFzIGRlIDE5ODAgeSAxOTkwLg0KDQozLiAqKkFNT1MqKiAoKkFuYWx5c2lzIG9mIE1vbWVudCBTdHJ1Y3R1cmVzKiksIGRlc2Fycm9sbGFkbyBwb3IgQXJidWNrbGUsIGNvbiDDqW5mYXNpcyBlbiBpbnRlcmZhY2VzIGdyw6FmaWNhcyB5IHVzbyBpbnRlZ3JhZG8gY29uIFNQU1MuDQoNCjQuICoqTXBsdXMqKiwgZGVzYXJyb2xsYWRvIHBvciBNdXRow6luIHkgTXV0aMOpbiwgZGVzdGFjYSBwb3Igc3UgZmxleGliaWxpZGFkIHBhcmEgbWFuZWphciB2YXJpYWJsZXMgY2F0ZWfDs3JpY2FzLCBtb2RlbG9zIG11bHRpZ3J1cG8geSBleHRlbnNpb25lcyBjb21vIEVTRU0uDQoNCjUuICoqTXggLyBPcGVuTXgqKiwgc29mdHdhcmUgbGlicmUgYmFzYWRvIGVuIG1hdHJpY2VzLCBhbXBsaWFtZW50ZSB1c2FkbyBlbiBnZW7DqXRpY2EgZGVsIGNvbXBvcnRhbWllbnRvIHkgbW9kZWxvcyBhdmFuemFkb3MuDQoNCjYuICoqT3Ryb3MqKjogQ0FMSVMgKFNBUyksIFJBTU9OQSAoU1lTVEFUKSwgU0VQQVRIIChTVEFUSVNUSUNBKSwgbGF2YWFuIChSKSwgU3RhdGEgeSBNQVRMQUIuDQoNCiAgDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQojIExhIGNhdXNhbGlkYWQgZW4gU0VNDQoNCiMjIyBEZWZpbmljacOzbiBkZSBjYXVzYWxpZGFkDQoNCkFudGVzIGRlIGRpc2N1dGlyIGVsIHBhcGVsIGRlIGxhIGNhdXNhbGlkYWQgZW4gbG9zIG1vZGVsb3MgZGUgZWN1YWNpb25lcyBlc3RydWN0dXJhbGVzLCBlcyBpbXBvcnRhbnRlIGFjbGFyYXIgcXXDqSBzZSBlbnRpZW5kZSBwb3IgKmNhdXNhbGlkYWQqIGVuIGVzdGUgY29udGV4dG8uDQoNCkVuIFNFTSwgdW5hICoqcmVsYWNpw7NuIGNhdXNhbCoqIHNlIGNvbmNpYmUgY29tbyB1bmEgKmhpcMOzdGVzaXMgdGXDs3JpY2EgZGlyZWNjaW9uYWwqIHF1ZSBlc3RhYmxlY2UgcXVlIHVuYSB2YXJpYWJsZSBlamVyY2UgaW5mbHVlbmNpYSBzaXN0ZW3DoXRpY2Egc29icmUgb3RyYSwgYmFqbyBjaWVydG9zIHN1cHVlc3RvcyBzb2JyZSBlbCBwcm9jZXNvIGdlbmVyYWRvciBkZSBsb3MgZGF0b3MuIEVzdGFzIGhpcMOzdGVzaXMgc2UgZm9ybXVsYW4gKmEgcHJpb3JpKiB5IGx1ZWdvIHNlIGNvbnRyYXN0YW4gZW1ww61yaWNhbWVudGUgbWVkaWFudGUgZWwgYWp1c3RlIGRlbCBtb2RlbG8gYSBsb3MgZGF0b3MuDQoNCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCiMjIyBDYXVzYWxpZGFkIGVuIFNFTQ0KDQoxLiBVbmEgY2FyYWN0ZXLDrXN0aWNhIGRpc3RpbnRpdmEgZGUgbG9zIFNFTSBlcyBzdSBjYXBhY2lkYWQgcGFyYSAqcmVwcmVzZW50YXIgZXhwbMOtY2l0YW1lbnRlIGhpcMOzdGVzaXMgY2F1c2FsZXMqIG1lZGlhbnRlIHJlbGFjaW9uZXMgZGlyZWNjaW9uYWxlcyBlbnRyZSB2YXJpYWJsZXMuDQoNCjIuIFNpIGJpZW4gbG9zIHBhcsOhbWV0cm9zIGFzb2NpYWRvcyBhIGVzdGFzIHJlbGFjaW9uZXMgcHVlZGVuIGVzdGltYXJzZSBlc3RhZMOtc3RpY2FtZW50ZSwgKnN1IGVzdGltYWNpw7NuIG5vIGltcGxpY2EgYXV0b23DoXRpY2FtZW50ZSBjYXVzYWxpZGFkKi4NCg0KMy4gVG9kYSBpbnRlcnByZXRhY2nDs24gY2F1c2FsIGRlYmUgZXN0YXIgc3VzdGVudGFkYSBlbiBsYSAqdGVvcsOtYSBzdWJ5YWNlbnRlKiwgZWwgKmRpc2XDsW8gZGVsIGVzdHVkaW8qIHkgZWwgKmNvbm9jaW1pZW50byBkZWwgZmVuw7NtZW5vKiwgbm8gw7puaWNhbWVudGUgZW4gZWwgYWp1c3RlIGRlbCBtb2RlbG8uDQoNCjQuIExvcyBTRU0gbm8gcHJ1ZWJhbiBsYSBjYXVzYWxpZGFkOyBwZXJtaXRlbiAqZXZhbHVhciBsYSBwbGF1c2liaWxpZGFkIGVtcMOtcmljYSogZGUgaGlww7N0ZXNpcyBjYXVzYWxlcyBwcmV2aWFtZW50ZSBmb3JtdWxhZGFzLg0KDQo1LiBFbiBlc3RlIGVuZm9xdWUsIHNlIGVzcGVjaWZpY2EgdW4gY29uanVudG8gZGUgcmVsYWNpb25lcyB0ZcOzcmljYXMgeSBzZSBleGFtaW5hIGVuIHF1w6kgbWVkaWRhIGVzdGFzIHJlbGFjaW9uZXMgc29uICpjb21wYXRpYmxlcyBjb24gbGEgZXN0cnVjdHVyYSBkZSBjb3ZhcmlhbnphcyBvYnNlcnZhZGEgZW4gbG9zIGRhdG9zKi4NCg0KDQoNCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCiMgVGlwb3MgZGUgdmFyaWFibGVzIGVuIFNFTQ0KDQoNCiMjIyBUaXBvcyBkZSB2YXJpYWJsZXMNCg0KQW50ZXMgZGUgaW50cm9kdWNpciBsYSBub3RhY2nDs24gZm9ybWFsIHkgbGFzIGVjdWFjaW9uZXMgbWF0cmljaWFsZXMgZGUgbG9zIG1vZGVsb3MgU0VNLCBlcyBmdW5kYW1lbnRhbCBjb21wcmVuZGVyIGxvcyB0aXBvcyBkZSB2YXJpYWJsZXMgaW52b2x1Y3JhZGFzIHkgY8OzbW8gc2UgZGVmaW5lIGxhIGVzY2FsYSBkZSBsb3MgY29uc3RydWN0b3MgbGF0ZW50ZXMuDQoNCjEuICoqVmFyaWFibGVzIG1hbmlmaXN0YXMgKG9ic2VydmFkYXMsIGluZGljYWRvcmFzKSoqOiBzb24gdmFyaWFibGVzIG9ic2VydmFibGVzLCBnZW5lcmFsbWVudGUgw610ZW1zIG8gcHJlZ3VudGFzIGVuIHVuIGN1ZXN0aW9uYXJpby4NCg0KMi4gKipWYXJpYWJsZXMgbGF0ZW50ZXMgKG5vIG9ic2VydmFkYXMpKio6IHNvbiBjb25zdHJ1Y3RvcyB0ZcOzcmljb3MgcXVlIHNvbG8gcHVlZGVuIG1lZGlyc2UgaW5kaXJlY3RhbWVudGUgYSB0cmF2w6lzIGRlIHZhcmlhYmxlcyBvYnNlcnZhYmxlcyBxdWUgYWN0w7phbiBjb21vIHN1cyBtYW5pZmVzdGFjaW9uZXMuIFNpbWlsYXIgYWwgYW7DoWxpc2lzIGZhY3RvcmlhbCwgc2UgcHVlZGVuIHV0aWxpemFyIG3Dumx0aXBsZXMgbWVkaWRhcyBwYXJhIHJlcHJlc2VudGFyIHVuIGNvbnN0cnVjdG8sIGxvIHF1ZSBheXVkYSBhIGNvbnRyb2xhciBlbCBlcnJvciBkZSBtZWRpY2nDs24gZXNwZWPDrWZpY28gZGUgY2FkYSB2YXJpYWJsZS4NCg0KMy4gKipWYXJpYWJsZXMgZGUgZXJyb3IqKjogcmVwcmVzZW50YW4gdGFudG8gbG9zIGVycm9yZXMgYXNvY2lhZG9zIGEgbGEgbWVkaWNpw7NuIGRlIHVuYSB2YXJpYWJsZSBjb21vIGFxdWVsbGFzIHZhcmlhYmxlcyBubyBjb25zaWRlcmFkYXMgZW4gZWwgbW9kZWxvIHF1ZSBwdWVkZW4gaW5mbHVpciBlbiBsYSBtZWRpY2nDs24gZGUgdW5hIHZhcmlhYmxlIG9ic2VydmFibGUuIEFsIGlndWFsIHF1ZSBsYXMgdmFyaWFibGVzIGxhdGVudGVzLCBubyBzb24gb2JzZXJ2YWJsZXMgZGlyZWN0YW1lbnRlLg0KDQo0LiAqKlZhcmlhYmxlcyBleMOzZ2VuYXMqKjogU29uIHZhcmlhYmxlcyBxdWUgaW5mbHV5ZW4gZW4gb3RyYXMgdmFyaWFibGVzIGRlbCBtb2RlbG8gcGVybyBubyBzb24gYWZlY3RhZGFzIHBvciBuaW5ndW5hIG90cmEgdmFyaWFibGUuIFNvbiBzaW1pbGFyZXMgYSBsYXMgdmFyaWFibGVzIGluZGVwZW5kaWVudGVzIGVuIHVuIG1vZGVsbyBkZSByZWdyZXNpw7NuLg0KDQo1LiAqKlZhcmlhYmxlcyBlbmTDs2dlbmFzKio6IFNvbiB2YXJpYWJsZXMgcXVlIHNvbiBpbmZsdWVuY2lhZGFzIHBvciBvdHJhcyB2YXJpYWJsZXMgZGVudHJvIGRlbCBtb2RlbG8uIENvcnJlc3BvbmRlbiBhIGxhcyB2YXJpYWJsZXMgZGVwZW5kaWVudGVzIGVuIGxvcyBtb2RlbG9zIGRlIHJlZ3Jlc2nDs24uIENhZGEgdmFyaWFibGUgZW5kw7NnZW5hIGRlYmUgZXN0YXIgYWNvbXBhw7FhZGEgZGUgdW4gdMOpcm1pbm8gZGUgZXJyb3IuIA0KDQo2LiAqKlZhcmlhYmxlcyBtZWRpYWRvcmFzKio6IFNvbiBsYXMgdmFyaWFibGVzIGVuZMOzZ2VuYXMgcXVlIGEgc3UgdmV6IGluZmx1eWVuIGVuIG90cmFzIGVuZMOzZ2VuYXMuDQoNCjcuICoqVmFyaWFibGVzIGRlIGFncnVwYWNpw7NuKiogbyAqKm1vZGVyYWRvcmFzKio6IFNvbiB2YXJpYWJsZXMgY2F0ZWfDs3JpY2FzIHF1ZSBpbmRpY2FuIGxhIHBlcnRlbmVuY2lhIGRlIGxhcyBvYnNlcnZhY2lvbmVzIGEgZGlmZXJlbnRlcyBzdWJwb2JsYWNpb25lcy4gU2UgdXRpbGl6YW4gcHJpbmNpcGFsbWVudGUgZW4gYW7DoWxpc2lzIGRlIGNvbXBhcmFjaW9uZXMgZW50cmUgZ3J1cG9zLg0KDQo8IS0tICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUgLS0+DQo8IS0tIFNlcGFyYWRvciAtLT4NCg0KIyMjIFRpcG9zIGRlIHZhcmlhYmxlcyBlbiB1biBkaWFncmFtYSBTRU0NCg0KTGEgZmlndXJhIHNpZ3VpZW50ZSBwcmVzZW50YSB1biBkaWFncmFtYSBTRU0gY29uY2VwdHVhbCBjb24gZmluZXMgZXhwbGljYXRpdm9zLiBFbiDDqWwgc2UgbXVlc3RyYW4gdmFyaWFibGVzIG1hbmlmaWVzdGFzIGUgaW5kaWNhZG9yZXMsIGZhY3RvcmVzIGxhdGVudGVzIHkgc3VzIHTDqXJtaW5vcyBkZSBlcnJvciwgYXPDrSBjb21vIHVuYSByZWxhY2nDs24gZXN0cnVjdHVyYWwgZW50cmUgZmFjdG9yZXMuIEFkZW3DoXMsIHNlIGFzdW1lIHVuIGNvbnRleHRvIG11bHRpZ3J1cG8sIGRvbmRlIHVuYSB2YXJpYWJsZSBkZSBhZ3J1cGFjacOzbiAocG9yIGVqZW1wbG8sIGBzY2hvb2xgKSBkZWZpbmUgc3VicG9ibGFjaW9uZXMgcGFyYSBjb21wYXJhciBlbCBtb2RlbG8gZW50cmUgZ3J1cG9zLiBFbCBvYmpldGl2byBkZWwgZGlhZ3JhbWEgZXMgY2xhcmlmaWNhciBsb3Mgcm9sZXMgY29uY2VwdHVhbGVzIGRlIGxvcyBlbGVtZW50b3MsIG5vIGludGVycHJldGFyIGVzdGltYWNpb25lcyBudW3DqXJpY2FzLg0KDQoNCnwgRWxlbWVudG8gZW4gbGEgZmlndXJhICAgICAgICAgICAgICAgICAgICAgICAgIHwgVGlwbyBkZSB2YXJpYWJsZSAgICAgICAgIHwgRGVzY3JpcGNpw7NuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCnwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfA0KfCB4MSwgeDIsIHgzLCB5MSwgeTIsIHoxLCB6MiAgICAgICAgICAgICAgICAgICAgfCBNYW5pZmllc3RhcyAob2JzZXJ2YWRhcykgfCBJbmRpY2Fkb3JlcyBvYnNlcnZhZG9zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQp8IEYxLCBGMiwgRjMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IExhdGVudGVzICAgICAgICAgICAgICAgICB8IENvbnN0cnVjdG9zIG5vIG9ic2VydmFkb3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCnwgZXJyb3JlcyBlbiB4MeKAk3gzLCB5MeKAk3kyLCB6MeKAk3oyIChwLmVqLiwgZTHigJNlNykgfCBFcnJvcmVzIGRlIG1lZGljacOzbiAgICAgIHwgUGFydGUgbm8gZXhwbGljYWRhIGRlbCBpbmRpY2Fkb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCBlcnJvciBlbiBGMiB5IEYzIChkaXN0dXJiYW5jZSkgICAgICAgICAgICAgICAgfCBFcnJvciBlc3RydWN0dXJhbCAgICAgICAgfCBSZXNpZHVvIGRlIGxhdGVudGVzIGVuZMOzZ2VuYXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCBGMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBFeMOzZ2VuYSAgICAgICAgICAgICAgICAgIHwgTm8gcmVjaWJlIGZsZWNoYXMgKG5vIGVzIGV4cGxpY2FkYSBwb3Igb3RyYXMgbGF0ZW50ZXMpICAgICAgfA0KfCBGMiwgRjMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBFbmTDs2dlbmFzICAgICAgICAgICAgICAgIHwgUmVjaWJlbiBmbGVjaGFzIChzb24gZXhwbGljYWRhcyBwb3Igb3RyYXMgbGF0ZW50ZXMpICAgICAgICAgfA0KfCBGMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBNZWRpYWRvcmEgICAgICAgICAgICAgICAgfCBUcmFuc21pdGUgZWwgZWZlY3RvOiAoRjEg4oaSIEYyIOKGkiBGMykgICAgIHwNCnwgc2Nob29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQWdydXBhY2nDs24gLyBtb2RlcmFkb3JhICB8IERlZmluZSBzdWJwb2JsYWNpb25lcyAobm8gbmVjZXNhcmlhbWVudGUgYXBhcmVjZSBjb21vIG5vZG8pIHwNCg0KDQpgYGB7ciBzZW0tY29uY2VwdHVhbC03dHlwZXMsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsICBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9NywgZmlnLmNhcD0iKipEaWFncmFtYSBTRU0gY29uY2VwdHVhbCBpbHVzdHJhbmRvIGxvcyBzaWV0ZSB0aXBvcyBkZSB2YXJpYWJsZXMqKi4gIn0NCg0KbGlicmFyeShsYXZhYW4pDQpsaWJyYXJ5KHNlbVBsb3QpDQoNCiMgTW9kZWxvIFNFTSBjb25jZXB0dWFsIChlc3RydWN0dXJhIGNvbXBsZXRhKQ0KbW9kZWxfY29uY2VwdHVhbCA8LSAnDQogICMgTW9kZWxvIGRlIG1lZGljacOzbg0KICBGMSA9fiB4MSArIHgyICsgeDMNCiAgRjIgPX4geTEgKyB5Mg0KICBGMyA9fiB6MSArIHoyDQoNCiAgIyBNb2RlbG8gZXN0cnVjdHVyYWwNCiAgRjIgfiBGMQ0KICBGMyB+IEYyDQonDQoNCiMgU2ltdWxhY2nDs24gc29sbyBwYXJhIHBvZGVyIGRpYnVqYXIgZWwgbW9kZWxvDQpzZXQuc2VlZCgxMjMpDQpkYXRfc2ltIDwtIHNpbXVsYXRlRGF0YShtb2RlbF9jb25jZXB0dWFsLCBzYW1wbGUubm9icyA9IDMwMCkNCg0KZml0X2NvbmNlcHR1YWwgPC0gc2VtKG1vZGVsX2NvbmNlcHR1YWwsIGRhdGEgPSBkYXRfc2ltKQ0KDQojIEdyw6FmaWNvIGNvbmNlcHR1YWwgKHNpbiBjb2VmaWNpZW50ZXMpDQpzZW1QYXRocygNCiAgZml0X2NvbmNlcHR1YWwsDQogIHdoYXQgPSAicGF0aCIsDQogIHdoYXRMYWJlbHMgPSAibm9uZSIsDQogIHN0eWxlID0gImxpc3JlbCIsDQogIGxheW91dCA9ICJ0cmVlIiwNCiAgcm90YXRpb24gPSAyLA0KICByZXNpZHVhbHMgPSBUUlVFLA0KICBpbnRlcmNlcHRzID0gRkFMU0UsDQogIGV4b0NvdiA9IEZBTFNFLA0KICBuQ2hhck5vZGVzID0gMCwNCiAgc2l6ZU1hbiA9IDcsDQogIHNpemVMYXQgPSA5LA0KICBlZGdlLmNvbG9yID0gImJsYWNrIiwNCiAgY29sb3IgPSBsaXN0KA0KICAgIGxhdCA9ICJvcmFuZ2UiLA0KICAgIG1hbiA9ICJsaWdodGdyZWVuIg0KICApDQopDQpgYGANCg0KDQoNCmBgYHtyLCBldmFsPUZBTFNFfQ0KR3J1cG8gKHNjaG9vbCkNCiAgICAgICAg4oaTDQogICAgIOKUjOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUkA0KICAgICDilIIgIEYxICAg4pSCICDihpAgZXjDs2dlbmENCiAgICAg4pSU4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSYDQogICAgICDihpEgICDihpEgICDihpENCiAgICAgZTEgIGUyICBlMw0KICAgICB4MSAgeDIgIHgzDQoNCiAgICAgICAg4oaTDQogICAgIOKUjOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUkA0KICAgICDilIIgIEYyICAg4pSCICDihpAgbWVkaWFkb3JhIC8gZW5kw7NnZW5hDQogICAgIOKUlOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUmA0KICAgICAg4oaRICAg4oaRDQogICAgIGU0ICBlNQ0KICAgICB5MSAgeTINCg0KICAgICAgICDihpMNCiAgICAg4pSM4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSQDQogICAgIOKUgiAgRjMgICDilIIgIOKGkCBlbmTDs2dlbmENCiAgICAg4pSU4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSYDQogICAgICDihpEgICDihpENCiAgICAgZTYgIGU3DQogICAgIHoxICB6Mg0KYGBgDQoNCg0KDQoNCmBgYHtyIHNlbS1jb25jZXB0dWFsLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBmaWcud2lkdGg9OSwgZmlnLmhlaWdodD02LCBlY2hvPUZBTFNFLCBldmFsPUZBTFNFfQ0KbGlicmFyeShsYXZhYW4pDQpsaWJyYXJ5KHNlbVBsb3QpDQoNCiMgTW9kZWxvIFNFTSBjb25jZXB0dWFsIChzb2xvIGVzdHJ1Y3R1cmEpDQptb2RlbF9jb25jZXB0dWFsIDwtICcNCiAgIyBNb2RlbG8gZGUgbWVkaWNpw7NuDQogIEYxID1+IHgxICsgeDIgKyB4Mw0KICBGMiA9fiB5MSArIHkyDQogIA0KICAjIFJlbGFjacOzbiBlc3RydWN0dXJhbA0KICBGMiB+IEYxDQonDQoNCiMgU2ltdWxhY2nDs24gc2ltcGxlIGRlIGRhdG9zIChzb2xvIHBhcmEgcG9kZXIgZGlidWphciBlbCBtb2RlbG8pDQpzZXQuc2VlZCgxMjMpDQpkYXRfc2ltIDwtIHNpbXVsYXRlRGF0YShtb2RlbF9jb25jZXB0dWFsLCBzYW1wbGUubm9icyA9IDIwMCkNCg0KZml0X2NvbmNlcHR1YWwgPC0gc2VtKG1vZGVsX2NvbmNlcHR1YWwsIGRhdGEgPSBkYXRfc2ltKQ0KDQojIEdyw6FmaWNvIGNvbmNlcHR1YWwgKHNpbiDDqW5mYXNpcyBlbiB2YWxvcmVzKQ0Kc2VtUGF0aHMoZml0X2NvbmNlcHR1YWwsDQogICAgICAgICB3aGF0ID0gInBhdGgiLCAgICAgICAgIyBzb2xvIGVzdHJ1Y3R1cmENCiAgICAgICAgIHdoYXRMYWJlbHMgPSAibm9uZSIsICAjIHNpbiBjb2VmaWNpZW50ZXMNCiAgICAgICAgIHN0eWxlID0gImxpc3JlbCIsDQogICAgICAgICBsYXlvdXQgPSAidHJlZSIsDQogICAgICAgICByZXNpZHVhbHMgPSBUUlVFLA0KICAgICAgICAgaW50ZXJjZXB0cyA9IEZBTFNFLA0KICAgICAgICAgZXhvQ292ID0gRkFMU0UsDQogICAgICAgICBuQ2hhck5vZGVzID0gMCwNCiAgICAgICAgIHNpemVNYW4gPSA3LA0KICAgICAgICAgc2l6ZUxhdCA9IDksDQogICAgICAgICBlZGdlLmNvbG9yID0gImJsYWNrIiwNCiAgICAgICAgIGNvbG9yID0gbGlzdCgNCiAgICAgICAgICAgbGF0ID0gIm9yYW5nZSIsDQogICAgICAgICAgIG1hbiA9ICJsaWdodGdyZWVuIg0KICAgICAgICAgKQ0KKQ0KYGBgDQoNCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCiMgRXNjYWxhIGRlIGxhcyB2YXJpYWJsZXMgbGF0ZW50ZXMNCg0KQW50ZXMgZGUgaW50cm9kdWNpciBsYSBub3RhY2nDs24gbWF0cmljaWFsIGZvcm1hbCBkZSBsb3MgbW9kZWxvcyBkZSBlY3VhY2lvbmVzIGVzdHJ1Y3R1cmFsZXMsIGVzIGZ1bmRhbWVudGFsIGNvbXByZW5kZXIgY8OzbW8gc2UgZGVmaW5lIGxhICoqZXNjYWxhIGRlIGxhcyB2YXJpYWJsZXMgbGF0ZW50ZXMqKi4gIERhZG8gcXVlIGxhcyB2YXJpYWJsZXMgbGF0ZW50ZXMgbm8gc2Ugb2JzZXJ2YW4gZGlyZWN0YW1lbnRlLCAqKm5vIHBvc2VlbiB1bmlkYWRlcyBkZSBtZWRpZGEgaW5oZXJlbnRlcyoqLCBwb3IgbG8gcXVlIGVsIG1vZGVsbyBubyBlc3TDoSBpZGVudGlmaWNhZG8gYSBtZW5vcyBxdWUgc2UgaW1wb25nYSBhbGd1bmEgcmVzdHJpY2Npw7NuIHBhcmEgZmlqYXIgc3UgZXNjYWxhLg0KDQo8IS0tICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUgLS0+DQo8IS0tIFNlcGFyYWRvciAtLT4NCg0KIyMjIEVzY2FsYTogbcOpdG9kb3MgDQoNCkV4aXN0ZW4gdHJlcyBtw6l0b2RvcyBjb211bmVzIHBhcmEgZXN0YWJsZWNlciBsYSBlc2NhbGEgZGUgdW5hIHZhcmlhYmxlIGxhdGVudGU6DQogIA0KICAxLiAqVmFyaWFibGUgbGF0ZW50ZSBlc3RhbmRhcml6YWRhKi4NCiAgDQogIDIuICpWYXJpYWJsZSBtYXJjYWRvciouDQogIA0KICAzLiAqQ29kaWZpY2FjacOzbiBkZSBlZmVjdG9zKi4NCg0KQSBjb250aW51YWNpw7NuIHNlIGlsdXN0cmEgY2FkYSBtw6l0b2RvIHV0aWxpemFuZG8gdW4gKiptaXNtbyBtb2RlbG8gY29uY2VwdHVhbCBiYXNlKiosIGNvbiBlbCBvYmpldGl2byBkZSByZXNhbHRhciBxdWUgKiplbCBtb2RlbG8gbm8gY2FtYmlhKiosIHNpbm8gw7puaWNhbWVudGUgbGEgZm9ybWEgZW4gcXVlIHNlIGRlZmluZSBsYSBlc2NhbGEgZGVsIGZhY3RvciBsYXRlbnRlLg0KDQo8IS0tICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUgLS0+DQo8IS0tIFNlcGFyYWRvciAtLT4NCg0KIyMjIE1vZGVsbyBjb25jZXB0dWFsIGJhc2UgKGNvbcO6biBhIGxvcyB0cmVzIG3DqXRvZG9zKQ0KDQpDb25zaWRlcmVtb3MgdW5hIHZhcmlhYmxlIGxhdGVudGUgXChcZXRhXCkgbWVkaWRhIHBvciB0cmVzIGluZGljYWRvcmVzIG9ic2VydmFkb3MgXCh4XzEsIHhfMiwgeF8zXCk6DQoNCmBgYHtyLCBldmFsPUZBTFNFfQ0KICAgICAgICB4MQ0KICAgICAgICDihpENCiAgICAgICAgfA0KICAgICDilIzilIDilIDilIDilIDilIDilIDilIDilJANCiAgICAg4pSCICAgzrcgICDilIIgIOKGkCB2YXJpYWJsZSBsYXRlbnRlDQogICAgIOKUlOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUmA0KICAgICAgICB8DQogICAgICAgIOKGkw0KICAgICAgICB4Mg0KICAgICAgICB8DQogICAgICAgIOKGkw0KICAgICAgICB4Mw0KYGBgDQoNCkVzdGUgbW9kZWxvIGRlIG1lZGljacOzbiBlcyBpZMOpbnRpY28gZW4gbG9zIHRyZXMgbcOpdG9kb3MgZGUgZXNjYWxhbWllbnRvLiBMbyDDum5pY28gcXVlIHZhcsOtYSBlcyBsYSByZXN0cmljY2nDs24gdXRpbGl6YWRhIHBhcmEgZGVmaW5pciBsYSB1bmlkYWQgZGUgbWVkaWRhIGRlICRcZXRhJC4NCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCiMjIyBFc2NhbGE6IHZhcmlhYmxlIGxhdGVudGUgZXN0YW5kYXJpemFkYQ0KDQojIyMjIFJlc3RyaWNjacOzbiB7LnVubGlzdGVkIC51bm51bWJlcmVkfQ0KDQpFbiBlc3RlIG3DqXRvZG8gc2UgaW1wb25lIGxhIHNpZ3VpZW50ZSByZXN0cmljY2nDs246DQoNCiQkVmFyKFxldGEpPSAxJCQgDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQoNCiMjIyMgSW50ZXJwcmV0YWNpw7NuIGNvbmNlcHR1YWwgey51bmxpc3RlZCAudW5udW1iZXJlZH0NCg0KDQotIExhIHZhcmlhYmxlIGxhdGVudGUgc2UgZGVmaW5lIGVuIHVuaWRhZGVzIGRlIGRlc3ZpYWNpw7NuIGVzdMOhbmRhciwgZGUgZm9ybWEgYW7DoWxvZ2EgYSB1bmEgdmFyaWFibGUgdGlwaWZpY2FkYS4NCg0KLSBUb2RhcyBsYXMgY2FyZ2FzIGZhY3RvcmlhbGVzIHNlIGVzdGltYW4gbGlicmVtZW50ZS4NCg0KLSBMYSB2YXJpYW56YSBkZWwgZmFjdG9yIG5vIHNlIGVzdGltYSwgc2lubyBxdWUgc2UgZmlqYSBlbiAxLg0KDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQojIyMjIEludGVycHJldGFjacOzbiBkZSBsYXMgY2FyZ2FzIHsudW5saXN0ZWQgLnVubnVtYmVyZWR9DQoNCg0KVW5hIGNhcmdhIGZhY3RvcmlhbCBpbmRpY2E6DQoNCmBgYHtyLCBldmFsPUZBTFNFfQ0KQ3XDoW50YXMgZGVzdmlhY2lvbmVzIGVzdMOhbmRhciBjYW1iaWEgZWwgaW5kaWNhZG9yIGN1YW5kbyBsYSB2YXJpYWJsZSBsYXRlbnRlIGF1bWVudGEgdW5hIGRlc3ZpYWNpw7NuIGVzdMOhbmRhci4NCmBgYA0KDQoNClBvciBlamVtcGxvLCBzaSAkXGxhbWJkYT0wLjcwJCwgdW4gYXVtZW50byBkZSB1bmEgZGVzdmlhY2nDs24gZXN0w6FuZGFyIGVuICRcZXRhJCBpbXBsaWNhIHVuIGF1bWVudG8gZGUgJDAuNzAkIGRlc3ZpYWNpb25lcyBlc3TDoW5kYXIgZW4gJHhfMiQuDQoNCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCiMjIyMgQ29tZW50YXJpbyBwZWRhZ8OzZ2ljbyB7LnVubGlzdGVkIC51bm51bWJlcmVkfQ0KDQoNCkVzdGUgbcOpdG9kbyBlcyDDunRpbCBwYXJhIGNvbXBhcmFyIG1hZ25pdHVkZXMgcmVsYXRpdmFzLCBhdW5xdWUgbGFzIGNhcmdhcyBmaWphZGFzIGEgMSBlbiBsYSBtw6l0cmljYSBvcmlnaW5hbCBubyBwZXJtYW5lY2VuIGlndWFsZXMgYSAxIGN1YW5kbyBzZSBtdWVzdHJhbiBjb2VmaWNpZW50ZXMgZXN0YW5kYXJpemFkb3MgZW4gZGlhZ3JhbWFzIFNFTS4NCg0KDQo8IS0tICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUgLS0+DQo8IS0tIFNlcGFyYWRvciAtLT4NCg0KIyMjIENhcmdhIGZhY3RvcmlhbCBlc3RhbmRhcml6YWRhIA0KDQoNCiMjIyMgRGVmaW5pY2nDs24gey51bmxpc3RlZCAudW5udW1iZXJlZH0NCg0KDQpFbiB1biBtb2RlbG8gQ0ZBL1NFTSwgbGEgKipjYXJnYSBmYWN0b3JpYWwgZXN0YW5kYXJpemFkYSoqIHNlIGRlZmluZSBjb21vOg0KDQpcWw0KXGxhbWJkYV97XHRleHR7c3RkfX0gPSBcbGFtYmRhX3tcdGV4dHtlc3R9fSBcY2RvdCBcZnJhY3tcc2lnbWFfe1xldGF9fXtcc2lnbWFfeH0sDQpcXQ0KDQpkb25kZToNCg0KLSBcKFxsYW1iZGFfe1x0ZXh0e2VzdH19XCkgZXMgbGEgY2FyZ2Egbm8gZXN0YW5kYXJpemFkYSwgDQoNCi0gXChcc2lnbWFfe1xldGF9XCkgZXMgbGEgZGVzdmlhY2nDs24gZXN0w6FuZGFyIGRlbCBmYWN0b3IgbGF0ZW50ZSB5IA0KDQotIFwoXHNpZ21hX3hcKSBlcyBsYSBkZXN2aWFjacOzbiBlc3TDoW5kYXIgZGVsIGluZGljYWRvciBvYnNlcnZhZG8uDQoNCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCg0KIyMjIyBDb21lbnRhcmlvcyBpbXBvcnRhbnRlcyB7LnVubGlzdGVkIC51bm51bWJlcmVkfQ0KDQoNCjEuIEVzdGUgbcOpdG9kbyBlc3RhYmxlY2UgbGEgdmFyaWFuemEgZGUgbGEgdmFyaWFibGUgbGF0ZW50ZSBlbiAxLjAsIGNvbnZpcnRpw6luZG9sYSBhc8OtIGVuIHVuYSB2YXJpYWJsZSBlc3RhbmRhcml6YWRhIChzaW1pbGFyIGEgdW5hIHB1bnR1YWNpw7NuICRaJCkuIA0KDQoyLiBTaSBsYXMgdmFyaWFibGVzIGluZGljYWRvcmFzIHRhbWJpw6luIGVzdMOhbiBlc3RhbmRhcml6YWRhcywgbGFzIGNhcmdhcyBwdWVkZW4gaW50ZXJwcmV0YXJzZSBpZ3VhbCBxdWUgdW4gY29lZmljaWVudGUgZGUgcmVncmVzacOzbiBlc3RhbmRhcml6YWRvOiANCg0KICArICpFbCBuw7ptZXJvIGRlIGRlc3ZpYWNpb25lcyBlc3TDoW5kYXIgcXVlIGNhbWJpYSBsYSB2YXJpYWJsZSBtYW5pZmllc3RhIGN1YW5kbyBsYSB2YXJpYWJsZSBsYXRlbnRlIGF1bWVudGEgZW4gdW5hIGRlc3ZpYWNpw7NuIGVzdMOhbmRhci4qIA0KDQo0LiBBZGVtw6FzLCBzaSBoYXkgbcOhcyBkZSB1bmEgdmFyaWFibGUgbGF0ZW50ZSwgbGEgY292YXJpYW56YSBlbnRyZSBlbGxhcyBzZSBjb252aWVydGUgZW4gdW5hIGNvcnJlbGFjacOzbi4NCg0KDQo8IS0tICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUgLS0+DQo8IS0tIFNlcGFyYWRvciAtLT4NCg0KDQojIyMjIEVzdGltYWNpb25lcyBtb3N0cmFkYXMgZW4gYHN1bW1hcnkoKWAgeSBlbiBsb3MgZGlhZ3JhbWFzIFNFTSB7LnVubGlzdGVkIC51bm51bWJlcmVkfQ0KDQpQb3IgZGVmZWN0bywgbGEgZnVuY2nDs24gYHN1bW1hcnkoKWAgZGUgYGxhdmFhbmAgcHJlc2VudGEgKiplc3RpbWFjaW9uZXMgbm8gZXN0YW5kYXJpemFkYXMqKiAoY29sdW1uYSBgRXN0aW1hdGVgKS4gRXN0YXMgZXN0aW1hY2lvbmVzIHJlZmxlamFuIGRpcmVjdGFtZW50ZSBlbCBlc3F1ZW1hIGRlICppZGVudGlmaWNhY2nDs24gZGVsIG1vZGVsbyosIGVuIGVsIGN1YWwgdW5hIGNhcmdhIGZhY3RvcmlhbCBwb3IgZmFjdG9yIHN1ZWxlIGZpamFyc2UgZW4gMSAocG9yIGVqZW1wbG8sIGB4MSA9IDFgLCBgeDQgPSAxYCwgYHg3ID0gMWApIGNvbiBlbCBmaW4gZGUgZGVmaW5pciBsYSBlc2NhbGEgZGUgbGFzIHZhcmlhYmxlcyBsYXRlbnRlcy4NCg0KRW4gY29udHJhc3RlLCBjdWFuZG8gc2UgdXRpbGl6YSBgc2VtUGF0aHMoLi4uLCB3aGF0ID0gInN0ZCIsIHdoYXRMYWJlbHMgPSAic3RkIilgIGRlbCBwYXF1ZXRlIGBzZW1QbG90YCwgZWwgZGlhZ3JhbWEgU0VNIG11ZXN0cmEgKipjb2VmaWNpZW50ZXMgZXN0YW5kYXJpemFkb3MqKi4gRW4gZXN0ZSBjYXNvLCBsYXMgY2FyZ2FzIGZhY3RvcmlhbGVzIGZpamFkYXMgYSAxIGVuIGxhIG3DqXRyaWNhIG9yaWdpbmFsICoqbm8gcGVybWFuZWNlbiBpZ3VhbGVzIGEgMSoqLCB5YSBxdWUgbGEgZXN0YW5kYXJpemFjacOzbiB0cmFuc2Zvcm1hIGxvcyBwYXLDoW1ldHJvcy4gIFBvciB0YW50bywgYXVuIGN1YW5kbyBcKFxsYW1iZGFfe1x0ZXh0e2VzdH19ID0gMVwpLCBzaSBcKFxzaWdtYV97XGV0YX0gXG5lcSBcc2lnbWFfeFwpLCBzZSBvYnRpZW5lIG5lY2VzYXJpYW1lbnRlIHF1ZQ0KDQoNClxbDQpcbGFtYmRhX3tcdGV4dHtzdGR9fSBcbmVxIDEuDQpcXQ0KDQpFc3RvIGV4cGxpY2EgcG9yIHF1w6kgZW4gbGEgc2FsaWRhIGRlIGBzdW1tYXJ5KClgIHNlIHZhbiBhIG9ic2VydmFyIGNhcmdhcyBpZ3VhbGVzIGEgMSwgbWllbnRyYXMgcXVlIGVuIGxvcyBkaWFncmFtYXMgZXN0YW5kYXJpemFkb3MgZGljaGFzIGNhcmdhcyB2YW4gdG9tYXIgdmFsb3JlcyBkaXN0aW50b3MgKHNpIG5vIHNlIGVzY3JpYmVuIGxvcyBhcmd1bWVudG9zIGFwcm9waWFkb3MpLg0KDQoNCg0KDQo8IS0tICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUgLS0+DQo8IS0tIFNlcGFyYWRvciAtLT4NCg0KIyMjIEVzY2FsYTogdmFyaWFibGUgbWFyY2Fkb3INCg0KIyMjIyBEZWZpbmljacOzbiB7LnVubGlzdGVkIC51bm51bWJlcmVkfQ0KDQoxLiBFc3RlIG3DqXRvZG8gaW1wbGljYSByZXN0cmluZ2lyIHVuYSBjYXJnYSBmYWN0b3JpYWwgZGUgY2FkYSB2YXJpYWJsZSBsYXRlbnRlIGEgdW4gdmFsb3IgYXJiaXRyYXJpbyAodXN1YWxtZW50ZSAkXGxhbWJkYV8xPTEuMCQpLiANCg0KMi4gTGEgdmFyaWFibGUgaW5kaWNhZG9yYSBjdXlhIGNhcmdhIGVzdMOhIHJlc3RyaW5naWRhIHNlIGNvbm9jZSBjb21vIGxhICp2YXJpYWJsZSBtYXJjYWRvciouIA0KDQozLiBFc3RlIG3DqXRvZG8gZGVmaW5lIGxhIHZhcmlhbnphIGRlIGxhIHZhcmlhYmxlIGxhdGVudGUgdXNhbmRvIGxhIHZhcmlhYmxlIG1hcmNhZG9yLg0KDQoNCmBgYHtyLCBldmFsPUZBTFNFfQ0KICAgICAgICB4MSAgIOKGkCB2YXJpYWJsZSBtYXJjYWRvcg0KICAgICAgICDihpENCiAgICAgICAgfCAgzrsxID0gMQ0KICAgICDilIzilIDilIDilIDilIDilIDilIDilIDilJANCiAgICAg4pSCICAgzrcgICDilIINCiAgICAg4pSU4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSYDQogICAgICAgIHwNCiAgICAgICAg4oaTDQogICAgICAgIHgyDQogICAgICAgIHwNCiAgICAgICAg4oaTDQogICAgICAgIHgzDQpgYGANCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCiMjIyMgSW50ZXJwcmV0YWNpw7NuIGNvbmNlcHR1YWwgey51bmxpc3RlZCAudW5udW1iZXJlZH0NCg0KLSBMYSAqZXNjYWxhIGRlbCBmYWN0b3IqIHF1ZWRhIGRlZmluaWRhIGVuIGxhcyAqdW5pZGFkZXMgZGVsIGluZGljYWRvciBtYXJjYWRvciouDQoNCi0gTGEgKnZhcmlhbnphIGRlIGxhIHZhcmlhYmxlIGxhdGVudGUqIHNlIGVzdGltYSBsaWJyZW1lbnRlLg0KDQotIExhcyAqZGVtw6FzIGNhcmdhcyBmYWN0b3JpYWxlcyogc2UgaW50ZXJwcmV0YW4gKnJlbGF0aXZhbWVudGUgYWwgbWFyY2Fkb3IqLg0KDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQoNCiMjIyMgSW50ZXJwcmV0YWNpw7NuIGRlIGxhcyBjYXJnYXMgey51bmxpc3RlZCAudW5udW1iZXJlZH0NCg0KU2kgbGEgY2FyZ2EgZmFjdG9yaWFsIGRlbCBzZWd1bmRvIGluZGljYWRvciBlcw0KDQpcWw0KXGxhbWJkYV8yID0gMC44MCwNClxdDQoNCmVudG9uY2VzLCBwb3IgY2FkYSAqdW5pZGFkIGRlIGNhbWJpbyBlbiBsYSB2YXJpYWJsZSBsYXRlbnRlKiBcKFxldGFcKSAobWVkaWRhIGVuIGxhcyB1bmlkYWRlcyBkZWwgaW5kaWNhZG9yIG1hcmNhZG9yIFwoeF8xXCkpLCBlbCBpbmRpY2Fkb3IgXCh4XzJcKSBjYW1iaWEgKjAuODAgdW5pZGFkZXMqLg0KDQo8IS0tICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUgLS0+DQo8IS0tIFNlcGFyYWRvciAtLT4NCg0KIyMjIyBDb21lbnRhcmlvIHBlZGFnw7NnaWNvIHsudW5saXN0ZWQgLnVubnVtYmVyZWR9DQoNCkVzdGUgZXMgZWwgKm3DqXRvZG8gbcOhcyB1dGlsaXphZG8gZW4gbGEgcHLDoWN0aWNhKiB5IGNvcnJlc3BvbmRlIGFsICplc3F1ZW1hIHBvciBkZWZlY3RvKiBkZSBgbGF2YWFuYC4gRXN0byBleHBsaWNhIGxhIHByZXNlbmNpYSBoYWJpdHVhbCBkZSAqY2FyZ2FzIGZhY3RvcmlhbGVzIGZpamFkYXMgZW4gMSogZW4gbGEgc2FsaWRhIGRlIGBzdW1tYXJ5KClgLCB5YSBxdWUgZGljaGEgcmVzdHJpY2Npw7NuIHNlIGVtcGxlYSBwYXJhIGRlZmluaXIgbGEgZXNjYWxhIGRlbCBmYWN0b3IgbGF0ZW50ZS4NCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCiMjIyBFc2NhbGE6IGNvZGlmaWNhY2nDs24gZGUgZWZlY3Rvcw0KDQpFbiBlc3RlIG3DqXRvZG8gc2UgaW1wb25lbiByZXN0cmljY2lvbmVzIHNvYnJlICp0b2RhcyBsYXMgY2FyZ2FzIGZhY3RvcmlhbGVzKiwgZGUgbW9kbyBxdWUgc3UgKnByb21lZGlvIHNlYSBpZ3VhbCBhIDEqLg0KDQpQYXJhIHVuIGZhY3RvciBjb24gXChwXCkgaW5kaWNhZG9yZXMsIGxhIHJlc3RyaWNjacOzbiBzZSBleHByZXNhIGNvbW86DQoNClxbDQpcZnJhY3sxfXtwfSBcc3VtX3tqPTF9XntwfSBcbGFtYmRhX2ogPSAxLg0KXF0NCg0KRGUgbWFuZXJhIGVxdWl2YWxlbnRlLCBsYSAqc3VtYSBkZSBsYXMgY2FyZ2FzIGZhY3RvcmlhbGVzKiBlcyBpZ3VhbCBhbCBuw7ptZXJvIGRlIGluZGljYWRvcmVzOg0KDQpcWw0KXGxhbWJkYV8xICsgXGxhbWJkYV8yICsgXGNkb3RzICsgXGxhbWJkYV9wID0gcC4NClxdDQoNCkVuIGVzdGUgZWplbXBsbywgJHA9MyQuDQoNCmBgYHtyLCBldmFsPUZBTFNFfQ0KICAgICAgICB4MQ0KICAgICAgICDihpENCiAgICAgICAgfCAgzrsxDQogICAgIOKUjOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUkA0KICAgICDilIIgICDOtyAgIOKUgiAgIGNvbiBwcm9tZWRpbyjOuykgPSAxDQogICAgIOKUlOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUmA0KICAgICAgICB8DQogICAgICAgIOKGkw0KICAgICAgICB4Mg0KICAgICAgICB8DQogICAgICAgIOKGkw0KICAgICAgICB4Mw0KYGBgDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQojIyMjIEludGVycHJldGFjacOzbiBjb25jZXB0dWFsIHsudW5saXN0ZWQgLnVubnVtYmVyZWR9DQoNCi0gTGEgKnZhcmlhYmxlIGxhdGVudGUqIHNlIGRlZmluZSBlbiBsYSAqZXNjYWxhIHByb21lZGlvIGRlIHN1cyBpbmRpY2Fkb3JlcyouDQoNCi0gTmluZ8O6biBpbmRpY2Fkb3IgYWN0w7phIGNvbW8gKnJlZmVyZW5jaWEgcHJpdmlsZWdpYWRhKi4NCg0KLSBUb2RhcyBsYXMgKmNhcmdhcyBmYWN0b3JpYWxlcyogc2UgaW50ZXJwcmV0YW4gKnJlc3BlY3RvIGFsIGluZGljYWRvciBwcm9tZWRpbyouDQoNCiMjIyMgQ29tZW50YXJpbyBwZWRhZ8OzZ2ljbyB7LnVubGlzdGVkIC51bm51bWJlcmVkfQ0KDQpFc3RlIG3DqXRvZG8gZXMgKmNvbmNlcHR1YWxtZW50ZSBzaW3DqXRyaWNvIHkgZWxlZ2FudGUqLCBhdW5xdWUgKm1lbm9zIGZyZWN1ZW50ZSBlbiBhcGxpY2FjaW9uZXMgZXN0w6FuZGFyKiB5IGVuIHNvZnR3YXJlIHF1ZSBhZG9wdGEgcG9yIGRlZmVjdG8gZWwgZW5mb3F1ZSBkZSB2YXJpYWJsZSBtYXJjYWRvci4NCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCiMjIyBDb21wYXJhY2nDs24gZGUgbG9zIG3DqXRvZG9zIGRlIGVzY2FsYQ0KDQp8IE3DqXRvZG8gZGUgZXNjYWxhICAgICAgICAgICAgfCBSZXN0cmljY2nDs24gaW1wdWVzdGEgICAgICAgICAgICAgICAgICAgICAgICAgIHwgVW5pZGFkIGRlbCBmYWN0b3IgICAgICAgICAgICAgICB8DQp8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18DQp8IExhdGVudGUgZXN0YW5kYXJpemFkYSAgICAgIHwgXChcbWF0aHJte1Zhcn0oXGV0YSkgPSAxXCkgICAgICAgICAgICAgICAgICAgICB8IERlc3ZpYWNpw7NuIGVzdMOhbmRhciAgICAgICAgICAgICB8DQp8IFZhcmlhYmxlIG1hcmNhZG9yICAgICAgICAgIHwgXChcbGFtYmRhID0gMVwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEluZGljYWRvciBkZSByZWZlcmVuY2lhICAgICAgICAgfA0KfCBDb2RpZmljYWNpw7NuIGRlIGVmZWN0b3MgICAgfCBcKFxtYXRocm17UHJvbWVkaW99KFxsYW1iZGEpID0gMVwpICAgICAgICAgICAgIHwgUHJvbWVkaW8gZGUgbG9zIGluZGljYWRvcmVzICAgICB8DQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQojIyMgTWVuc2FqZSBjbGF2ZQ0KDQotIEVuIGxvcyAqdHJlcyBjYXNvcyosIGVsICptb2RlbG8gZXMgZWwgbWlzbW8qLg0KDQotIExvIMO6bmljbyBxdWUgY2FtYmlhIGVzIGxhICpjb252ZW5jacOzbiB1dGlsaXphZGEgcGFyYSBkZWZpbmlyIGxhIGVzY2FsYSogZGUgbGEgdmFyaWFibGUgbGF0ZW50ZS4NCg0KLSBFc3RhcyBkZWNpc2lvbmVzICphZmVjdGFuIGxhIGludGVycHJldGFjacOzbiBudW3DqXJpY2EgZGUgbG9zIHBhcsOhbWV0cm9zKiwgcGVybyAqbm8gYWx0ZXJhbiBlbCBhanVzdGUgZGVsIG1vZGVsbyogbmkgbGFzICpyZWxhY2lvbmVzIHN1c3RhbnRpdmFzIGVudHJlIGxhcyB2YXJpYWJsZXMqLg0KDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQojIFRpcG9zIGRlIHJlbGFjaW9uZXMgZW50cmUgdmFyaWFibGVzDQoNCkVuIHVuIFNFTSwgc2UgcHVlZGVuIGRlZmluaXIgdmFyaW9zIHRpcG9zIGRlIHJlbGFjaW9uZXMgZW50cmUgdmFyaWFibGVzLiBBIGNvbnRpbnVhY2nDs24gc2UgZGVzY3JpYmVuIGVzdG9zIHRpcG9zIGRlIHJlbGFjaW9uZXMuDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQojIyMgQ292YXJpYWNpw7NuDQoNClNlIHJlZmllcmUgYSBsYSByZWxhY2nDs24gZW50cmUgZG9zIHZhcmlhYmxlcyBxdWUgdmFyw61hbiBqdW50YXMsIHBlcm8gc2luIGltcGxpY2FyIGNhdXNhbGlkYWQuIEluZGljYSBxdWUgY3VhbmRvIHVuYSB2YXJpYWJsZSBjYW1iaWEsIGxhIG90cmEgdGFtYmnDqW4gbG8gaGFjZSwgcGVybyBubyBuZWNlc2FyaWFtZW50ZSBwb3JxdWUgdW5hIGNhdXNlIGEgbGEgb3RyYS4NCg0KKipFamVtcGxvLioqDQoNCkxhIHJlbGFjacOzbiBlbnRyZSBsYSBjYW50aWRhZCBkZSBoZWxhZG9zIHZlbmRpZG9zIHkgZWwgbsO6bWVybyBkZSBwZXJzb25hcyBxdWUgdmFuIGEgbGEgcGxheWEuIEVzdGFzIGRvcyB2YXJpYWJsZXMgY292YXLDrWFuIHBvcnF1ZSBhbWJhcyBhdW1lbnRhbiBkdXJhbnRlIGVsIHZlcmFubywgcGVybyB1bmEgbm8gY2F1c2EgZGlyZWN0YW1lbnRlIGEgbGEgb3RyYS4gVsOpYXNlIGxhIGZpZ3VyYSBcQHJlZihmaWc6UmVsYWNpb24xKS4gDQoNCg0KPGNlbnRlcj4NCmBgYHtyIFJlbGFjaW9uMSwgZWNobz1GQUxTRSwgZmlnLmNhcCA9ICIqKkNvdmFyaWFjacOzbioqIiwgb3V0LndpZHRoID0gIjUwJSJ9DQojIGZpZy53aWR0aCA9IDIwICMgTm8gZnVuY2lvbmEgZXN0YSBvcGNpb24gZW4gZWwgY2h1bmsNCg0KI2h0dHA6Ly96ZXZyb3NzLmNvbS9ibG9nLzIwMTcvMDYvMTkvdGlwcy1hbmQtdHJpY2tzLWZvci13b3JraW5nLXdpdGgtaW1hZ2VzLWFuZC1maWd1cmVzLWluLXItbWFya2Rvd24tZG9jdW1lbnRzLw0KIyBQYWdpbmEgMzU5IGRlIFIyMDE1LUZyaWVuZGx5DQoNCmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKCJSZWxhY2lvbjEucG5nIikNCg0KI090cmEgbWFuZXJhLCBwZXJvICBzYWxlIGVsIGNhcHRpb246DQojPGNlbnRlcj4NCiMhWygjZmlnOkZpZy1jYXB0aW9uKSBNaSBmaWd1cmFdKE5vbWJyZS5wbmcpe3dpZHRoPTQwMHB4fQ0KIzwvY2VudGVyPg0KYGBgDQo8L2NlbnRlcj4NCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCiMjIyBDYXVzYWxpZGFkOg0KDQpTZSByZWZpZXJlIGEgdW5hIHJlbGFjacOzbiBlbiBsYSBxdWUgdW4gY2FtYmlvIGVuIHVuYSB2YXJpYWJsZSBwcm92b2NhIHVuIGNhbWJpbyBlbiBvdHJhLiBFbiBTRU0sIGxhIGNhdXNhbGlkYWQgaW1wbGljYSB1bmEgZGlyZWNjacOzbiBkZSBpbmZsdWVuY2lhLg0KDQoqKkVqZW1wbG8uKioNCg0KRWwgbml2ZWwgZGUgZWR1Y2FjacOzbiB5IGVsIHNhbGFyaW8uIFVuYSBtYXlvciBlZHVjYWNpw7NuICh2YXJpYWJsZSBpbmRlcGVuZGllbnRlKSBwdWVkZSBjYXVzYXIgdW4gYXVtZW50byBlbiBlbCBzYWxhcmlvICh2YXJpYWJsZSBkZXBlbmRpZW50ZSkuIFbDqWFzZSBsYSBmaWd1cmEgXEByZWYoZmlnOlJlbGFjaW9uMikuIA0KDQoNCjxjZW50ZXI+DQpgYGB7ciBSZWxhY2lvbjIsIGVjaG89RkFMU0UsIGZpZy5jYXAgPSAiKipDYXVzYWxpZGFkKioiLCBvdXQud2lkdGggPSAiNTAlIn0NCiMgZmlnLndpZHRoID0gMjAgIyBObyBmdW5jaW9uYSBlc3RhIG9wY2lvbiBlbiBlbCBjaHVuaw0KDQojaHR0cDovL3pldnJvc3MuY29tL2Jsb2cvMjAxNy8wNi8xOS90aXBzLWFuZC10cmlja3MtZm9yLXdvcmtpbmctd2l0aC1pbWFnZXMtYW5kLWZpZ3VyZXMtaW4tci1tYXJrZG93bi1kb2N1bWVudHMvDQojIFBhZ2luYSAzNTkgZGUgUjIwMTUtRnJpZW5kbHkNCg0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoIlJlbGFjaW9uMi5wbmciKQ0KDQojT3RyYSBtYW5lcmEsIHBlcm8gIHNhbGUgZWwgY2FwdGlvbjoNCiM8Y2VudGVyPg0KIyFbKCNmaWc6RmlnLWNhcHRpb24pIE1pIGZpZ3VyYV0oTm9tYnJlLnBuZyl7d2lkdGg9NDAwcHh9DQojPC9jZW50ZXI+DQpgYGANCjwvY2VudGVyPg0KDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQojIyMgUmVsYWNpw7NuIGVzcHVyaWENCg0KU2UgZGEgY3VhbmRvIGRvcyB2YXJpYWJsZXMgcGFyZWNlbiBlc3RhciByZWxhY2lvbmFkYXMsIHBlcm8gZXN0YSByZWxhY2nDs24gZXMgY2F1c2FkYSBwb3IgdW5hIHRlcmNlcmEgdmFyaWFibGUgcXVlIGFmZWN0YSBhIGFtYmFzLiBMYSByZWxhY2nDs24gZW50cmUgbGFzIGRvcyB2YXJpYWJsZXMgbm8gZXMgZGlyZWN0YSBzaW5vIHF1ZSBlcyBtZWRpYWRhIHBvciBlc3RhIHRlcmNlcmEgdmFyaWFibGUuDQoNCioqRWplbXBsby4qKg0KDQpFbCB0YW1hw7FvIGRlbCBwaWUgeSBsYSBoYWJpbGlkYWQgcGFyYSBsZWVyIGVuIG5pw7Fvcy4gQXVucXVlIHB1ZWRlbiBwYXJlY2VyIHJlbGFjaW9uYWRvcywgYW1ib3MgZXN0w6FuIGluZmx1ZW5jaWFkb3MgcG9yIGxhIGVkYWQgZGVsIG5pw7FvLCBxdWUgZXMgbGEgdmVyZGFkZXJhIGNhdXNhIHN1YnlhY2VudGUgZGUgbGEgcmVsYWNpw7NuLiBWw6lhc2UgbGEgZmlndXJhIFxAcmVmKGZpZzpSZWxhY2lvbjMpLiANCg0KDQo8Y2VudGVyPg0KYGBge3IgUmVsYWNpb24zLCBlY2hvPUZBTFNFLCBmaWcuY2FwID0gIioqUmVsYWNpw7NuIGVzcHVyaWEqKiIsIG91dC53aWR0aCA9ICI0MCUifQ0KIyBmaWcud2lkdGggPSAyMCAjIE5vIGZ1bmNpb25hIGVzdGEgb3BjaW9uIGVuIGVsIGNodW5rDQoNCiNodHRwOi8vemV2cm9zcy5jb20vYmxvZy8yMDE3LzA2LzE5L3RpcHMtYW5kLXRyaWNrcy1mb3Itd29ya2luZy13aXRoLWltYWdlcy1hbmQtZmlndXJlcy1pbi1yLW1hcmtkb3duLWRvY3VtZW50cy8NCiMgUGFnaW5hIDM1OSBkZSBSMjAxNS1GcmllbmRseQ0KDQprbml0cjo6aW5jbHVkZV9ncmFwaGljcygiUmVsYWNpb24zLnBuZyIpDQoNCiNPdHJhIG1hbmVyYSwgcGVybyAgc2FsZSBlbCBjYXB0aW9uOg0KIzxjZW50ZXI+DQojIVsoI2ZpZzpGaWctY2FwdGlvbikgTWkgZmlndXJhXShOb21icmUucG5nKXt3aWR0aD00MDBweH0NCiM8L2NlbnRlcj4NCmBgYA0KPC9jZW50ZXI+DQoNCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCiMjIyBDYXVzYWxpZGFkIGRpcmVjdGENCg0KT2N1cnJlIGN1YW5kbyB1bmEgdmFyaWFibGUgZGlyZWN0YW1lbnRlIGFmZWN0YSBhIG90cmEgc2luIGxhIGludGVydmVuY2nDs24gZGUgb3RyYXMgdmFyaWFibGVzLiBFbiBlbCBkaWFncmFtYSBkZSBTRU0sIGVzdG8gc2UgcmVwcmVzZW50YSBjb24gdW5hIGZsZWNoYSBxdWUgdmEgZGlyZWN0YW1lbnRlIGRlIGxhIHZhcmlhYmxlIGNhdXNhIGEgbGEgdmFyaWFibGUgZWZlY3RvLg0KDQoqKkVqZW1wbG8uKioNCg0KRWwgdGVucmUgdW4gZW1wbGVvICh2YXJpYWJsZSBpbmRlcGVuZGllbnRlKSBpbmNyZW1lbnRhIGxvcyBpbmdyZXNvcyAodmFyaWFibGUgZGVwZW5kaWVudGUpLiBWw6lhc2UgbGEgZmlndXJhIFxAcmVmKGZpZzpSZWxhY2lvbjQpLiANCg0KPGNlbnRlcj4NCmBgYHtyIFJlbGFjaW9uNCwgZWNobz1GQUxTRSwgZmlnLmNhcCA9ICIqKkNhdXNhbGlkYWQgZGlyZWN0YSoqIiwgb3V0LndpZHRoID0gIjYwJSJ9DQojIGZpZy53aWR0aCA9IDIwICMgTm8gZnVuY2lvbmEgZXN0YSBvcGNpb24gZW4gZWwgY2h1bmsNCg0KI2h0dHA6Ly96ZXZyb3NzLmNvbS9ibG9nLzIwMTcvMDYvMTkvdGlwcy1hbmQtdHJpY2tzLWZvci13b3JraW5nLXdpdGgtaW1hZ2VzLWFuZC1maWd1cmVzLWluLXItbWFya2Rvd24tZG9jdW1lbnRzLw0KIyBQYWdpbmEgMzU5IGRlIFIyMDE1LUZyaWVuZGx5DQoNCmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKCJSZWxhY2lvbjQucG5nIikNCg0KI090cmEgbWFuZXJhLCBwZXJvICBzYWxlIGVsIGNhcHRpb246DQojPGNlbnRlcj4NCiMhWygjZmlnOkZpZy1jYXB0aW9uKSBNaSBmaWd1cmFdKE5vbWJyZS5wbmcpe3dpZHRoPTQwMHB4fQ0KIzwvY2VudGVyPg0KYGBgDQo8L2NlbnRlcj4NCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCiMjIyBDYXVzYWxpZGFkIGluZGlyZWN0YQ0KDQpTZSByZWZpZXJlIGEgdW5hIHNpdHVhY2nDs24gZW4gbGEgcXVlIHVuYSB2YXJpYWJsZSBhZmVjdGEgYSBvdHJhIGEgdHJhdsOpcyBkZSB1bmEgbyBtw6FzIHZhcmlhYmxlcyBpbnRlcm1lZGlhcyAobWVkaWFkb3JhcykuIEVuIHVuIGRpYWdyYW1hIFNFTSwgZXN0byBzZSBtdWVzdHJhIGNvbW8gdW5hIGNhZGVuYSBkZSBmbGVjaGFzIHF1ZSBwYXNhbiBwb3IgdW5hIG8gbcOhcyB2YXJpYWJsZXMgbWVkaWFkb3JhcyBhbnRlcyBkZSBsbGVnYXIgYSBsYSB2YXJpYWJsZSBvYmpldGl2by4NCg0KKipFamVtcGxvLioqDQoNCkxhIGVkdWNhY2nDs24gYWZlY3RhIGxvcyBpbmdyZXNvcyBhIHRyYXbDqXMgZGVsIGVtcGxlby4gTGEgZWR1Y2FjacOzbiAodmFyaWFibGUgaW5kZXBlbmRpZW50ZSkgYXVtZW50YSBsYSBwcm9iYWJpbGlkYWQgZGUgb2J0ZW5lciB1biBlbXBsZW8gKHZhcmlhYmxlIG1lZGlhZG9yYSksIGxvIGN1YWwgYSBzdSB2ZXogaW5jcmVtZW50YSBsb3MgaW5ncmVzb3MgKHZhcmlhYmxlIGRlcGVuZGllbnRlKS4gVsOpYXNlIGxhIGZpZ3VyYSBcQHJlZihmaWc6UmVsYWNpb241KS4gDQoNCg0KPGNlbnRlcj4NCmBgYHtyIFJlbGFjaW9uNSwgZWNobz1GQUxTRSwgZmlnLmNhcCA9ICIqKkNhdXNhbGlkYWQgaW5kaXJlY3RhKioiLCBvdXQud2lkdGggPSAiNDAlIn0NCiMgZmlnLndpZHRoID0gMjAgIyBObyBmdW5jaW9uYSBlc3RhIG9wY2lvbiBlbiBlbCBjaHVuaw0KDQojaHR0cDovL3pldnJvc3MuY29tL2Jsb2cvMjAxNy8wNi8xOS90aXBzLWFuZC10cmlja3MtZm9yLXdvcmtpbmctd2l0aC1pbWFnZXMtYW5kLWZpZ3VyZXMtaW4tci1tYXJrZG93bi1kb2N1bWVudHMvDQojIFBhZ2luYSAzNTkgZGUgUjIwMTUtRnJpZW5kbHkNCg0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoIlJlbGFjaW9uNS5wbmciKQ0KDQojT3RyYSBtYW5lcmEsIHBlcm8gIHNhbGUgZWwgY2FwdGlvbjoNCiM8Y2VudGVyPg0KIyFbKCNmaWc6RmlnLWNhcHRpb24pIE1pIGZpZ3VyYV0oTm9tYnJlLnBuZyl7d2lkdGg9NDAwcHh9DQojPC9jZW50ZXI+DQpgYGANCjwvY2VudGVyPg0KDQo8IS0tICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUgLS0+DQo8IS0tIFNlcGFyYWRvciAtLT4NCg0KIyMjIENhdXNhbGlkYWQgcmVjw61wcm9jYQ0KDQpTZSBwcmVzZW50YSBjdWFuZG8gZG9zIHZhcmlhYmxlcyBzZSBhZmVjdGFuIG11dHVhbWVudGUuIENhZGEgdmFyaWFibGUgZXMgYSBsYSB2ZXogY2F1c2EgeSBlZmVjdG8gZGUgbGEgb3RyYS4gRW4gdW4gZGlhZ3JhbWEgU0VNLCBlc3RvIHNlIHJlcHJlc2VudGEgY29uIGZsZWNoYXMgYmlkaXJlY2Npb25hbGVzIGVudHJlIGxhcyBkb3MgdmFyaWFibGVzLg0KDQoqKkVqZW1wbG8uKioNCg0KRXN0csOpcyB5IHByb2JsZW1hcyBkZSBzYWx1ZC4gRWwgZXN0csOpcyBwdWVkZSBjYXVzYXIgcHJvYmxlbWFzIGRlIHNhbHVkLCB5IGEgc3UgdmV6LCBsb3MgcHJvYmxlbWFzIGRlIHNhbHVkIHB1ZWRlbiBhdW1lbnRhciBlbCBuaXZlbCBkZSBlc3Ryw6lzLiBFc3RhIHJlbGFjacOzbiBlcyBiaWRpcmVjY2lvbmFsLiBWw6lhc2UgbGEgZmlndXJhIFxAcmVmKGZpZzpSZWxhY2lvbjYpLiANCg0KDQo8Y2VudGVyPg0KYGBge3IgUmVsYWNpb242LCBlY2hvPUZBTFNFLCBmaWcuY2FwID0gIioqQ2F1c2FsaWRhZCByZWPDrXByb2NhKioiLCBvdXQud2lkdGggPSAiNjAlIn0NCiMgZmlnLndpZHRoID0gMjAgIyBObyBmdW5jaW9uYSBlc3RhIG9wY2lvbiBlbiBlbCBjaHVuaw0KDQojaHR0cDovL3pldnJvc3MuY29tL2Jsb2cvMjAxNy8wNi8xOS90aXBzLWFuZC10cmlja3MtZm9yLXdvcmtpbmctd2l0aC1pbWFnZXMtYW5kLWZpZ3VyZXMtaW4tci1tYXJrZG93bi1kb2N1bWVudHMvDQojIFBhZ2luYSAzNTkgZGUgUjIwMTUtRnJpZW5kbHkNCg0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoIlJlbGFjaW9uNi5wbmciKQ0KDQojT3RyYSBtYW5lcmEsIHBlcm8gIHNhbGUgZWwgY2FwdGlvbjoNCiM8Y2VudGVyPg0KIyFbKCNmaWc6RmlnLWNhcHRpb24pIE1pIGZpZ3VyYV0oTm9tYnJlLnBuZyl7d2lkdGg9NDAwcHh9DQojPC9jZW50ZXI+DQpgYGANCjwvY2VudGVyPg0KDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQojIyMgRGlhZ3JhbWFzIGVzdHJ1Y3R1cmFsZXMNCg0KQ29tbyBlamVtcGxvLCB2w6lhc2UgbGEgZmlndXJhIFxAcmVmKGZpZzpSZWxhY2lvbjcpLiANCg0KDQo8Y2VudGVyPg0KYGBge3IgUmVsYWNpb243LCBlY2hvPUZBTFNFLCBmaWcuY2FwID0gIioqRWplbXBsbyBkZSB1biBkaWFncmFtYSBlc3RydWN0dXJhbCoqIiwgb3V0LndpZHRoID0gIjgwJSJ9DQojIGZpZy53aWR0aCA9IDIwICMgTm8gZnVuY2lvbmEgZXN0YSBvcGNpb24gZW4gZWwgY2h1bmsNCg0KI2h0dHA6Ly96ZXZyb3NzLmNvbS9ibG9nLzIwMTcvMDYvMTkvdGlwcy1hbmQtdHJpY2tzLWZvci13b3JraW5nLXdpdGgtaW1hZ2VzLWFuZC1maWd1cmVzLWluLXItbWFya2Rvd24tZG9jdW1lbnRzLw0KIyBQYWdpbmEgMzU5IGRlIFIyMDE1LUZyaWVuZGx5DQoNCmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKCJSZWxhY2lvbjcucG5nIikNCg0KI090cmEgbWFuZXJhLCBwZXJvICBzYWxlIGVsIGNhcHRpb246DQojPGNlbnRlcj4NCiMhWygjZmlnOkZpZy1jYXB0aW9uKSBNaSBmaWd1cmFdKE5vbWJyZS5wbmcpe3dpZHRoPTQwMHB4fQ0KIzwvY2VudGVyPg0KYGBgDQo8L2NlbnRlcj4NCg0KDQoqKk9ic2VydmFjaW9uZXMuKioNCg0KMS4gTG9zIGVmZWN0b3MgZGlyZWN0b3Mgc2UgaW5kaWNhbiBjb24gZmxlY2hhcyByZWNoYXMuIA0KDQoyLiBFbCBmaW5hbCBkZSBsYSBmbGVjaGEgZXMgbGEgdmFyaWFibGUgZGVwZW5kaWVudGUuDQoNCjMuIExhcyBlc3RpbWFjaW9uZXMgZGVsb3MgcGFyw6FtZXRyb3Mgc2llbXByZSBhcGFyZWNlbiBzb2JyZSBsYSBmbGVjaGEgY29ycmVzcG9uZGllbnRlLg0KDQo0LiBDdWFscXVpZXIgdmFyaWFibGUgcXVlIHNlYSBpbmZsdWVuY2lhZGEgcG9yIG90cmEgdmFyaWFibGUgZGVsIG1vZGVsbyBkZWJlIHRlbmVyIHVuIHTDqXJtaW5vIGRlIGVycm9yLiANCg0KNS4gQWxndW5vcyBwcm9ncmFtYXMgdGFtYmnDqW4gc3VlbGVuIG1vc3RyYXI6IA0KICAgIA0KICAgICsgSnVudG8gYSBjYWRhIHZhcmlhYmxlLCBzdSB2YXJpYW56YS4NCiAgICANCiAgICArIEVuIGVsIGNhc28gZGUgbGFzIHZhcmlhYmxlcyBkZXBlbmRpZW50ZXMsIGxhIHByb3BvcmNpw7NuIGRlIHZhcmlhbnphIGV4cGxpY2FkYSBjb3JyZXNwb25kaWVudGUuDQogICAgDQoNCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCiMgQ29tcG9uZW50ZXMgZGUgdW4gU0VNDQoNCiMjIyBUaXBvcw0KDQoxLiBTb24gZG9zOiAqTW9kZWxvIGRlIG1lZGlkYSogeSAqbW9kZWxvIGVzdHJ1Y3R1cmFsKi4gTcOhcyBhZGVsYW50ZSwgc2UgZXhwbGljYSBjYWRhIHVubyBkZSBlbGxvcy4gDQoNCjIuIEFsIHN1c3RpdHVpciBlbiBlbCBtb2RlbG8gZGUgbWVkaWRhIGxhcyByZWxhY2lvbmVzIGRlIGNvdmFyaWFuemEgcG9yIGxhcyByZWxhY2lvbmVzIGNhdXNhbGVzIGRlIGxhIHBhcnRlIGVzdHJ1Y3R1cmFsLCBzZSBvYnRpZW5lIGVsICptb2RlbG8gZXN0cnVjdHVyYWwgY29tcGxldG8qLCB0YW1iacOpbiBkZW5vbWluYWRvICptb2RlbG8gZGUgcmVncmVzacOzbiBlc3RydWN0dXJhbCouDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQojIyMgTW9kZWxvIGRlIG1lZGlkYQ0KICANCiAgDQoxLiBDb21wdWVzdG8gcG9yIGxhcyByZWxhY2lvbmVzIGVudHJlIGxhcyB2YXJpYWJsZXMgaW5kaWNhZG9yYXMgZGVsIG1vZGVsbyB5IHN1cyBjb25zdHJ1Y3RvcyBsYXRlbnRlcy4gDQoNCjIuIEFzw60gY29tbyBwb3IgbGFzIHJlbGFjaW9uZXMgZGUgY292YXJpYW56YSBlbnRyZSBsYXMgdmFyaWFibGVzIGxhdGVudGVzLiANCg0KMy4gQ2FkYSBjb25zdHJ1Y3RvIGxhdGVudGUgeSBzdXMgaW5kaWNhZG9yZXMgZm9ybWFuIHVuYSBwYXJ0ZSBkZWwgbW9kZWxvIGRlIG1lZGlkYS4NCg0KNC4gVGFtYmnDqW4gY29ub2NpZG8gY29tbyBpbnN0cnVtZW50byBkZSBtZWRpZGEgeSBlcyBlbCBtb2RlbG8gcHJvcHVlc3RvIHBhcmEgIm1lZGlyIiBsYXMgdmFyaWFibGVzIGxhdGVudGVzLiANCg0KNS4gRXN0ZSBtb2RlbG8gY29ycmVzcG9uZGUgYSB1biBhbsOhbGlzaXMgZmFjdG9yaWFsIGNvbmZpcm1hdG9yaW8sZW4gZWwgcXVlIGNhZGEgdmFyaWFibGUgbGF0ZW50ZSBzZSBhc29jaWEgY29uIHVuIGdydXBvIGRlIHZhcmlhYmxlcyBvYnNlcnZhZGFzLCB5IGFkZW3DoXMgc2UgcGVybWl0ZSBxdWUgbGFzIHZhcmlhYmxlcyBsYXRlbnRlcyBlc3TDqW4gY29ycmVsYWNpb25hZGFzIGVudHJlIHPDrS4NCg0KNi4gVsOpYXNlIGxhIGZpZ3VyYSBcQHJlZihmaWc6UmVsYWNpb244KS4gDQoNCg0KPGNlbnRlcj4NCmBgYHtyIFJlbGFjaW9uOCwgZWNobz1GQUxTRSwgZmlnLmNhcCA9ICIqKk1vZGVsbyBkZSBtZWRpZGEqKiIsIG91dC53aWR0aCA9ICI1MCUifQ0KIyBmaWcud2lkdGggPSAyMCAjIE5vIGZ1bmNpb25hIGVzdGEgb3BjaW9uIGVuIGVsIGNodW5rDQoNCiNodHRwOi8vemV2cm9zcy5jb20vYmxvZy8yMDE3LzA2LzE5L3RpcHMtYW5kLXRyaWNrcy1mb3Itd29ya2luZy13aXRoLWltYWdlcy1hbmQtZmlndXJlcy1pbi1yLW1hcmtkb3duLWRvY3VtZW50cy8NCiMgUGFnaW5hIDM1OSBkZSBSMjAxNS1GcmllbmRseQ0KDQprbml0cjo6aW5jbHVkZV9ncmFwaGljcygiUmVsYWNpb244LnBuZyIpDQoNCiNPdHJhIG1hbmVyYSwgcGVybyAgc2FsZSBlbCBjYXB0aW9uOg0KIzxjZW50ZXI+DQojIVsoI2ZpZzpGaWctY2FwdGlvbikgTWkgZmlndXJhXShOb21icmUucG5nKXt3aWR0aD00MDBweH0NCiM8L2NlbnRlcj4NCmBgYA0KPC9jZW50ZXI+DQoNCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCiMjIyBNb2RlbG8gZXN0cnVjdHVyYWwNCg0KMS4gU2UgcmVmaWVyZSBhIGxhcyBpbnRlcnJlbGFjaW9uZXMgY2F1c2FsZXMgcHJvcHVlc3RhcyBlbnRyZSBsYXMgdmFyaWFibGVzIGxhdGVudGVzIGRlbCBtb2RlbG8uDQoNCjIuIEVzIGxhIHBhcnRlIGRlbCBtb2RlbG8gcXVlIGVtcGxlYSBlbCBhbsOhbGlzaXMgZGUgY2FtaW5vcyAocGF0aCBhbmFseXNpcyksIHBlcm8gY29uIHZhcmlhYmxlcyBhbGF0ZW50ZXMuIA0KDQozLiBFcyBzaW1pbGFyIGEgdW4gYW7DoWxpc2lzIGRlIHJlZ3Jlc2nDs24uIA0KDQo0LiBWw6lhc2UgbGEgZmlndXJhIFxAcmVmKGZpZzpSZWxhY2lvbjkpLiANCg0KDQo8Y2VudGVyPg0KYGBge3IgUmVsYWNpb245LCBlY2hvPUZBTFNFLCBmaWcuY2FwID0gIioqTW9kZWxvIGVzdHJ1Y3R1cmFsKioiLCBvdXQud2lkdGggPSAiMjAlIn0NCiMgZmlnLndpZHRoID0gMjAgIyBObyBmdW5jaW9uYSBlc3RhIG9wY2lvbiBlbiBlbCBjaHVuaw0KDQojaHR0cDovL3pldnJvc3MuY29tL2Jsb2cvMjAxNy8wNi8xOS90aXBzLWFuZC10cmlja3MtZm9yLXdvcmtpbmctd2l0aC1pbWFnZXMtYW5kLWZpZ3VyZXMtaW4tci1tYXJrZG93bi1kb2N1bWVudHMvDQojIFBhZ2luYSAzNTkgZGUgUjIwMTUtRnJpZW5kbHkNCg0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoIlJlbGFjaW9uOS5wbmciKQ0KDQojT3RyYSBtYW5lcmEsIHBlcm8gIHNhbGUgZWwgY2FwdGlvbjoNCiM8Y2VudGVyPg0KIyFbKCNmaWc6RmlnLWNhcHRpb24pIE1pIGZpZ3VyYV0oTm9tYnJlLnBuZyl7d2lkdGg9NDAwcHh9DQojPC9jZW50ZXI+DQpgYGANCjwvY2VudGVyPg0KDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQojIyMgTW9kZWxvIGVzdHJ1Y3R1cmFsIGNvbXBsZXRvDQoNClbDqWFzZSBsYSBmaWd1cmEgXEByZWYoZmlnOlJlbGFjaW9uMTApLiANCg0KDQo8Y2VudGVyPg0KYGBge3IgUmVsYWNpb24xMCwgZWNobz1GQUxTRSwgZmlnLmNhcCA9ICIqKk1vZGVsbyBlc3RydWN0dXJhbCBjb21wbGV0byoqIiwgb3V0LndpZHRoID0gIjUwJSJ9DQojIGZpZy53aWR0aCA9IDIwICMgTm8gZnVuY2lvbmEgZXN0YSBvcGNpb24gZW4gZWwgY2h1bmsNCg0KI2h0dHA6Ly96ZXZyb3NzLmNvbS9ibG9nLzIwMTcvMDYvMTkvdGlwcy1hbmQtdHJpY2tzLWZvci13b3JraW5nLXdpdGgtaW1hZ2VzLWFuZC1maWd1cmVzLWluLXItbWFya2Rvd24tZG9jdW1lbnRzLw0KIyBQYWdpbmEgMzU5IGRlIFIyMDE1LUZyaWVuZGx5DQoNCmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKCJSZWxhY2lvbjEwLnBuZyIpDQoNCiNPdHJhIG1hbmVyYSwgcGVybyAgc2FsZSBlbCBjYXB0aW9uOg0KIzxjZW50ZXI+DQojIVsoI2ZpZzpGaWctY2FwdGlvbikgTWkgZmlndXJhXShOb21icmUucG5nKXt3aWR0aD00MDBweH0NCiM8L2NlbnRlcj4NCmBgYA0KPC9jZW50ZXI+DQoNCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCiMgT3Ryb3MgdGlwb3MgZGUgbW9kZWxvcw0KDQojIyMgTW9kZWxvIGZhY3RvcmlhbCBleHBsb3JhdG9yaW8gdnMgY29uZmlybWF0b3Jpbw0KDQoxLiBFbCBtb2RlbG8gZGUgdmFyaWFibGVzIGxhdGVudGVzIChMVk0pIGNyZWEgbGFzIHZhcmlhYmxlcyBsYXRlbnRlcyAoTFZzKSBlbXBsZWFkYXMgZW4gZWwgbW9kZWxvIGVzdHJ1Y3R1cmFsLiANCg0KMi4gQ3VhbmRvIHVuIExWTSBzZSBleGFtaW5hIHNpbiB1biBtb2RlbG8gZXN0cnVjdHVyYWwsIHNlIGNvbm9jZSBvY2FzaW9uYWxtZW50ZSBjb21vICoqYW7DoWxpc2lzIGZhY3RvcmlhbCBjb25maXJtYXRvcmlvKiogKENGQSkuIA0KDQozLiBTaSBubyBzZSB0dXZpZXJhIHVuYSBlc3RydWN0dXJhIGhpcG90w6l0aWNhIHBhcmEgZWwgbW9kZWxvIGRlIHZhcmlhYmxlcyBsYXRlbnRlcywgc2UgdHJhdGFyw61hIGRlIHVuICoqYW7DoWxpc2lzIGZhY3RvcmlhbCBleHBsb3JhdG9yaW8qKiAoRUZBKS4NCg0KNC4gVsOpYXNlIGxhIGZpZ3VyYSBcQHJlZihmaWc6UmVsYWNpb24xMSkuIA0KDQoNCjxjZW50ZXI+DQpgYGB7ciBSZWxhY2lvbjExLCBlY2hvPUZBTFNFLCBmaWcuY2FwID0gIioqTW9kZWxvIGZhY3RvcmlhbCBleHBsb3JhdG9yaW8gdnMgY29uZmlybWF0b3JpbyoqIiwgb3V0LndpZHRoID0gIjgwJSJ9DQojIGZpZy53aWR0aCA9IDIwICMgTm8gZnVuY2lvbmEgZXN0YSBvcGNpb24gZW4gZWwgY2h1bmsNCg0KI2h0dHA6Ly96ZXZyb3NzLmNvbS9ibG9nLzIwMTcvMDYvMTkvdGlwcy1hbmQtdHJpY2tzLWZvci13b3JraW5nLXdpdGgtaW1hZ2VzLWFuZC1maWd1cmVzLWluLXItbWFya2Rvd24tZG9jdW1lbnRzLw0KIyBQYWdpbmEgMzU5IGRlIFIyMDE1LUZyaWVuZGx5DQoNCmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKCJSZWxhY2lvbjExLnBuZyIpDQoNCiNPdHJhIG1hbmVyYSwgcGVybyAgc2FsZSBlbCBjYXB0aW9uOg0KIzxjZW50ZXI+DQojIVsoI2ZpZzpGaWctY2FwdGlvbikgTWkgZmlndXJhXShOb21icmUucG5nKXt3aWR0aD00MDBweH0NCiM8L2NlbnRlcj4NCmBgYA0KPC9jZW50ZXI+DQoNCg0KDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQojIyMgTW9kZWxvIGZvcm1hdGl2byB2cyByZWZsZWN0aXZvDQoNCjEuIEV4aXN0ZW4gZG9zIHRpcG9zIGRlIHZhcmlhYmxlcyBsYXRlbnRlczogKnJlZmxlY3RpdmFzKiB5ICpmb3JtYXRpdmFzKi4gDQoNCjIuIFNlIGNvbnNpZGVyYSBxdWUgbGFzIHZhcmlhYmxlcyBsYXRlbnRlcyAqKnJlZmxlY3RpdmFzKiogY2F1c2FuIGxhIGNvdmFyaWFjacOzbiBkZSBvdHJhcyB2YXJpYWJsZXMuIA0KDQozLiBMYXMgdmFyaWFibGVzIGxhdGVudGVzICoqZm9ybWF0aXZhcyoqIHNvbiBlbCByZXN1bHRhZG8gZGUgbGEgY292YXJpYWNpw7NuIGRlIG90cmFzIHZhcmlhYmxlcyAoc2ltaWxhciBhIHVuIG1vZGVsbyBkZSByZWdyZXNpw7NuKS4NCg0KNC4gVsOpYXNlIGxhIGZpZ3VyYSBcQHJlZihmaWc6UmVsYWNpb24xMikuIA0KDQoNCjxjZW50ZXI+DQpgYGB7ciBSZWxhY2lvbjEyLCBlY2hvPUZBTFNFLCBmaWcuY2FwID0gIioqTW9kZWxvIGZvcm1hdGl2byB2cyByZWZsZWN0aXZvKioiLCBvdXQud2lkdGggPSAiODAlIn0NCiMgZmlnLndpZHRoID0gMjAgIyBObyBmdW5jaW9uYSBlc3RhIG9wY2lvbiBlbiBlbCBjaHVuaw0KDQojaHR0cDovL3pldnJvc3MuY29tL2Jsb2cvMjAxNy8wNi8xOS90aXBzLWFuZC10cmlja3MtZm9yLXdvcmtpbmctd2l0aC1pbWFnZXMtYW5kLWZpZ3VyZXMtaW4tci1tYXJrZG93bi1kb2N1bWVudHMvDQojIFBhZ2luYSAzNTkgZGUgUjIwMTUtRnJpZW5kbHkNCg0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoIlJlbGFjaW9uMTIucG5nIikNCg0KI090cmEgbWFuZXJhLCBwZXJvICBzYWxlIGVsIGNhcHRpb246DQojPGNlbnRlcj4NCiMhWygjZmlnOkZpZy1jYXB0aW9uKSBNaSBmaWd1cmFdKE5vbWJyZS5wbmcpe3dpZHRoPTQwMHB4fQ0KIzwvY2VudGVyPg0KYGBgDQo8L2NlbnRlcj4NCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCiMjIyBNb2RlbG9zIGRlIHNlZ3VuZG8gb3JkZW4NCg0KVsOpYXNlIGxhIGZpZ3VyYSBcQHJlZihmaWc6UmVsYWNpb24xMykuIA0KDQoNCjxjZW50ZXI+DQpgYGB7ciBSZWxhY2lvbjEzLCBlY2hvPUZBTFNFLCBmaWcuY2FwID0gIioqTW9kZWxvcyBkZSBzZWd1bmRvIG9yZGVuKioiLCBvdXQud2lkdGggPSAiMTAwJSJ9DQojIGZpZy53aWR0aCA9IDIwICMgTm8gZnVuY2lvbmEgZXN0YSBvcGNpb24gZW4gZWwgY2h1bmsNCg0KI2h0dHA6Ly96ZXZyb3NzLmNvbS9ibG9nLzIwMTcvMDYvMTkvdGlwcy1hbmQtdHJpY2tzLWZvci13b3JraW5nLXdpdGgtaW1hZ2VzLWFuZC1maWd1cmVzLWluLXItbWFya2Rvd24tZG9jdW1lbnRzLw0KIyBQYWdpbmEgMzU5IGRlIFIyMDE1LUZyaWVuZGx5DQoNCmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKCJSZWxhY2lvbjEzLnBuZyIpDQoNCiNPdHJhIG1hbmVyYSwgcGVybyAgc2FsZSBlbCBjYXB0aW9uOg0KIzxjZW50ZXI+DQojIVsoI2ZpZzpGaWctY2FwdGlvbikgTWkgZmlndXJhXShOb21icmUucG5nKXt3aWR0aD00MDBweH0NCiM8L2NlbnRlcj4NCmBgYA0KPC9jZW50ZXI+DQoNCg0KDQoNCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCiMgUHJvY2VkaW1pZW50byBwYXJhIGVqZWN1dGFyIHVuIFNFTQ0KDQojIyMgRXRhcGEgMTogVmFsaWRhY2nDs24gZGVsIG1vZGVsbyBkZSBtZWRpZGENCg0KMS4gSW1wbGljYSByZWFsaXphciB1biBBbsOhbGlzaXMgZmFjdG9yaWFsIENvbmZpcm1hdG9yaW8gKEFGQyksIHByb3BvbmllbmRvIGxvcyBpbmRpY2Fkb3JlcyBkZSBjYWRhIHZhcmlhYmxlIGxhdGVudGUgeQ0KZXZhbHVhbmRvIGVuIGZvcm1hIGNvbmp1bnRhIGxhIGJvbmRhZCBkZSBhanVzdGUgZGUgbG9zIGluc3RydW1lbnRvcyBkZSBtZWRpZGEgZW1wbGVhZG9zIHBhcmEgY2FkYSBmYWN0b3IuDQoNCjIuIFNpZ25pZmljYSByZWVtcGxhemFyIGxvcyBlZmVjdG9zIGRpcmVjdG9zIGUgaW5kaXJlY3RvcyBkZWwgY29tcG9uZW50ZSBlc3RydWN0dXJhbCBwcm9wdWVzdG9zIHNlZ8O6biBsYSB0ZW9yw61hIHBvciByZWxhY2lvbmVzIGRlIGNvdmFyaWFuemEgZW50cmUgbGFzIHZhcmlhYmxlcyBsYXRlbnRlcy4NCg0KMy4gU2kgZWwgYWp1c3RlIGVzIHJlY2hhemFkbyBzZSBhcGxpY2FuIGhlcnJhbWllbnRhcyBkZSByZWVzcGVjaWZpY2FjacOzbi4NCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCiMjIyBFdGFwYSAyOiBBanVzdGUgZGVsIG1vZGVsbyBjb21wbGV0byBkZSBlY3VhY2lvbmVzIGVzdHJ1Y3R1cmFsZXMNCg0KMS4gRXMgZWwgYWp1c3RlIGRlbCBTRU0gaW5jb3Jwb3JhbmRvIGxhcyBtb2RpZmljYWNpb25lcyBkZSBsYSBldGFwYSBhbnRlcmlvci4NCg0KMi4gSW5jbHV5ZSBsYSBjb21wYXJhY2nDs24gY29uIG90cm9zIG1vZGVsb3MgYWx0ZXJuYXRpdm9zIHF1ZSBkaWZpZXJhbiBlbiBsYSBwYXJ0ZSBlc3RydWN0dXJhbCwgc2kgbG9zIGh1YmllcmEsIHV0aWxpemFuZG8gcGFyYSBlc3RvIGNvbnRyYXN0ZXMgZGUgY29tcGFyYWNpw7NuIGRlIG1vZGVsb3MuDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQojIFBhc29zIGVuIGNhZGEgdW5hIGRlIGxhcyBldGFwYXMNCg0KU29uIGxvcyBzaWd1aWVudGVzIChjYWRhIHVubyBzZSBleHBsaWNhcsOhIG3DoXMgYWRlbGFudGUpOiANCg0KMS4gRXNwZWNpZmljYWNpw7NuLg0KDQoyLiBJZGVudGlmaWNhY2nDs24uDQoNCjMuIEV2YWx1YWNpw7NuIGRlIGxhIGNhbGlkYWQgZGUgbGEgYmFzZSBkZSBkYXRvcy4NCg0KNC4gRXN0aW1hY2nDs24gZGUgcGFyw6FtZXRyb3MuDQoNCjUuIEV2YWx1YWNpw7NuIGRlIGxhIGJvbmRhZCBkZSBhanVzdGUuDQoNCjYuIFJlLWVzcGVjaWZpY2FjacOzbiBkZWwgbW9kZWxvLg0KDQoNClbDqWFzZSBsYSBmaWd1cmEgXEByZWYoZmlnOlJlbGFjaW9uMTcpLiANCg0KDQo8Y2VudGVyPg0KYGBge3IgUmVsYWNpb24xNywgZWNobz1GQUxTRSwgZmlnLmNhcCA9ICIqKlBhc29zIGVuIGNhZGEgdW5hIGRlIGxhcyBldGFwYXMqKiIsIG91dC53aWR0aCA9ICI3MCUifQ0KIyBmaWcud2lkdGggPSAyMCAjIE5vIGZ1bmNpb25hIGVzdGEgb3BjaW9uIGVuIGVsIGNodW5rDQoNCiNodHRwOi8vemV2cm9zcy5jb20vYmxvZy8yMDE3LzA2LzE5L3RpcHMtYW5kLXRyaWNrcy1mb3Itd29ya2luZy13aXRoLWltYWdlcy1hbmQtZmlndXJlcy1pbi1yLW1hcmtkb3duLWRvY3VtZW50cy8NCiMgUGFnaW5hIDM1OSBkZSBSMjAxNS1GcmllbmRseQ0KDQprbml0cjo6aW5jbHVkZV9ncmFwaGljcygiUmVsYWNpb24xNy5wbmciKQ0KDQojT3RyYSBtYW5lcmEsIHBlcm8gIHNhbGUgZWwgY2FwdGlvbjoNCiM8Y2VudGVyPg0KIyFbKCNmaWc6RmlnLWNhcHRpb24pIE1pIGZpZ3VyYV0oTm9tYnJlLnBuZyl7d2lkdGg9NDAwcHh9DQojPC9jZW50ZXI+DQpgYGANCjwvY2VudGVyPg0KDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQojIEVzcGVjaWZpY2FjacOzbg0KDQoNCjEuIEVsIG1vZGVsbyBzZSBkZWZpbmUgY29uIGJhc2UgZW4gbG9zIGNvbm9jaW1pZW50b3MgdGXDs3JpY29zIHkgYW50ZWNlZGVudGVzIGVtcMOtcmljb3MgZGVsIHRlbWEgZXN0dWRpYWRvLiANCg0KMi4gU2UgZGViZW4gaW5jbHVpciDDum5pY2FtZW50ZSBsYXMgdmFyaWFibGVzIGVzZW5jaWFsZXMgcXVlIGN1ZW50ZW4gY29uIHVuIGZ1ZXJ0ZSByZXNwYWxkbyB0ZcOzcmljbyB5IGVtcMOtcmljby4gDQoNCjMuIEVzIGNydWNpYWwgZGV0ZXJtaW5hciBsYXMgcmVsYWNpb25lcyBlbnRyZSB2YXJpYWJsZXMgbGF0ZW50ZXMgZSBpbmRpY2Fkb3JhcywgYXN1bWllbmRvIHF1ZSBjdWFscXVpZXIgcmVsYWNpw7NuIG5vIGVzcGVjaWZpY2FkYSBubyBleGlzdGUuIA0KDQo0LiBFcyByZWNvbWVuZGFibGUgcmVhbGl6YXIgdW4gYW7DoWxpc2lzIGZhY3RvcmlhbCBleHBsb3JhdG9yaW8gKEFGRSkgcHJldmlvIHBhcmEgdmFsaWRhciBvIHJldmFsaWRhciBsYXMgZXNjYWxhcyB1dGlsaXphZGFzIGVuIGxhIG1lZGljacOzbiBkZSBjYWRhIHZhcmlhYmxlIGxhdGVudGUuIA0KDQo1LiBTZWfDum4gbGEgcmVnbGEgZGUgS2VubnkgKDE5NzkpLCBlbCBuw7ptZXJvIGRlIGZhY3RvcmVzIHBvciBmYWN0b3IgZGViZSBzZXI6IG3DrW5pbW8gMiwgMyBlcyBidWVubywgNCBlcyDDs3B0aW1vLCB5IDUgbyBtw6FzIGVzIGV4Y2VzaXZvLCBwZXJvIG5vIHNlIGRlYmVuIGV4Y2VkZXIgbG9zIDIwIGZhY3RvcmVzIHBhcmEgdG9kbyBlbCBTRU0uDQoNCjYuIEVuIGVzdGEgZXRhcGEgc2UgZGV0ZXJtaW5hIHF1w6kgcGFyw6FtZXRyb3Mgc2Vyw6FuIGVzdGltYWRvcyB5IGN1w6FsZXMgc2UgbWFudGVuZHLDoW4gY29uc3RhbnRlcy4NCg0KNy4gQWRlbcOhcywgc2UgYXN1bWUgbGEgZm9ybWEgZGUgbGEgZGlzdHJpYnVjacOzbiBjb25qdW50YSwgdXN1YWxtZW50ZSB1bmEgbm9ybWFsaWRhZCBtdWx0aXZhcmlhZGEuDQoNCjguIExvIG3DoXMgY29tw7puIGVzIGRpc2XDsWFyIGVsIG1vZGVsbyB1dGlsaXphbmRvIHVuIGRpYWdyYW1hIGVzdHJ1Y3R1cmFsLiANCg0KOS4gQSBwYXJ0aXIgZGUgZXN0ZSBncsOhZmljbywgZWwgc29mdHdhcmUgZ2VuZXJhIGxhcyBlY3VhY2lvbmVzIGRlbCBtb2RlbG8gYXV0b23DoXRpY2FtZW50ZS4NCg0KMTAuIExhIGludGVyZmF6IGdyw6FmaWNhIHRhbWJpw6luIHBlcm1pdGUgYcOxYWRpciBkaXJlY3RhbWVudGUgZW4gZWwgZGlhZ3JhbWEgbGFzIHJlc3RyaWNjaW9uZXMgcXVlIHNlIGltcG9uZW4gaGFiaXR1YWxtZW50ZSBzb2JyZSBsb3MgcGFyw6FtZXRyb3MgcGFyYSBsb3Mgc2lndWllbnRlcyBwYXNvcyBkZWwgYW7DoWxpc2lzLg0KDQo8IS0tICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUgLS0+DQo8IS0tIFNlcGFyYWRvciAtLT4NCg0KIyBJZGVudGlmaWNhY2nDs24NCg0KIyMjIElkZW50aWZpY2FjacOzbiAoZGVmaW5pY2nDs24pDQoNClVuIG1vZGVsbyBlc3TDoSBpZGVudGlmaWNhZG8gY3VhbmRvIHRvZG9zIHkgY2FkYSB1bm8gZGUgc3VzIHBhcsOhbWV0cm9zIHB1ZWRlbiBzZXIgZXN0aW1hZG9zIGRlIG1hbmVyYSDDum5pY2EgYSBwYXJ0aXIgZGUgbGEgbWF0cml6IGRlIHZhcmlhbnphcyB5IGNvdmFyaWFuemFzIG11ZXN0cmFsZXMuDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQojIyMgSWRlbnRpZmljYWNpw7NuIChjb25kaWNpb25lcykNCg0KU2UgZGViZW4gY3VtcGxpciBsYXMgc2lndWllbnRlcyBjb25kaWNpb25lcyBuZWNlc2FyaWFzIHBhcmEgbGEgaWRlbnRpZmljYWNpw7NuOg0KDQoqKkNvbmRpY2nDs24gMS4qKg0KDQpTaSB0ZW5lbW9zICRLJCB2YXJpYWJsZXMgb2JzZXJ2YWJsZXMsIGVudG9uY2VzLCBsYSBjYW50aWRhZCBkZSBkYXRvcyAkcCQgKGVzIGRlY2lyLCBsYSBjYW50aWRhZCBkZSB2YXJpYW56YXMgeSBjb3ZhcmlhbnphcyBtdWVzdHJhbGVzKSBkZWJlIHNlciBzdWZpY2llbnRlIHBhcmEgZXN0aW1hciBlbCBuw7ptZXJvIGRlIHBhcsOhbWV0cm9zICgkcSQpIGRlbCBtb2RlbG8uIEVzdGEgZXMgbGEgcmVnbGEgY2zDoXNpY2EgZGUgY29udGVvIHNlZ8O6biBsYSBjdWFsIGxvcyBncmFkb3MgZGUgbGliZXJ0YWQgZGViZW4gc2VyIG1heW9yZXMgbyBpZ3VhbGVzIGEgY2VybzogDQokJFx0ZXh0e0dyYWRvcyBkZSBsaWJlcnRhZH0gXDs9XDsgcCAtIHEgXDs9XDsgXGZyYWN7SyhLICsgMSl9ezJ9IC0gcSBcOyBcZ2VxIFw7IDAkJA0KDQoqKkNvbmRpY2nDs24gMi4qKg0KDQpEZWJlIGRlZmluaXJzZSBsYSBlc2NhbGEgZGUgbG9zIGVycm9yZXMgKHbDqWFzZSBsYSBmaWd1cmEgXEByZWYoZmlnOlJlbGFjaW9uMTQpKTogIA0KICAgIA0KICAxLiBMb3MgY29lZmljaWVudGVzIGRlIHN1cyBlZmVjdG9zIGRpcmVjdG9zIHNvYnJlIGxhcyBpbmRpY2Fkb3JhcyB5IGxhcyBsYXRlbnRlcyBlbmTDs2dlbmFzIHNlIGZpamFuIGVuIDEuIA0KICAgIA0KIA0KKipDb25kaWNpw7NuIDMuKiogDQoNClRhbWJpw6luIGRlYmUgZGVmaW5pZXJzZSBsYSBlc2NhbGEgZGUgbG9zIGZhY3RvcmVzIGxhdGVudGVzLiBMYXMgb3BjaW9uZXMgaGFiaXR1YWxlcyBzb24gZmlqYXIgZW4gMSAodsOpYXNlIGxhIGZpZ3VyYSBcQHJlZihmaWc6UmVsYWNpb24xNCkpOg0KICAgICAgDQogIDEuIExhIGNhcmdhIGZhY3RvcmlhbCBhc29jaWFkYSBhIHVuYSBkZSBsYXMgdmFyaWFibGVzIG9ic2VydmFkYXMgKGRlIHJlZmVyZW5jaWEpIGRlIGNhZGEgbGF0ZW50ZSBvIA0KICAgICAgDQogIDIuIExhIHZhcmlhbnphIGRlIGxhcyB2YXJpYWJsZXMgbGF0ZW50ZXMgZXjDs2dlbmFzLg0KDQoNCg0KPGNlbnRlcj4NCmBgYHtyIFJlbGFjaW9uMTQsIGVjaG89RkFMU0UsIGZpZy5jYXAgPSAiKipJZGVudGlmaWNhY2nDs24gKGNvbmRpY2lvbmVzIDIgeSAzKSoqIiwgb3V0LndpZHRoID0gIjQwJSJ9DQojIGZpZy53aWR0aCA9IDIwICMgTm8gZnVuY2lvbmEgZXN0YSBvcGNpb24gZW4gZWwgY2h1bmsNCg0KI2h0dHA6Ly96ZXZyb3NzLmNvbS9ibG9nLzIwMTcvMDYvMTkvdGlwcy1hbmQtdHJpY2tzLWZvci13b3JraW5nLXdpdGgtaW1hZ2VzLWFuZC1maWd1cmVzLWluLXItbWFya2Rvd24tZG9jdW1lbnRzLw0KIyBQYWdpbmEgMzU5IGRlIFIyMDE1LUZyaWVuZGx5DQoNCmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKCJSZWxhY2lvbjE0LnBuZyIpDQoNCiNPdHJhIG1hbmVyYSwgcGVybyAgc2FsZSBlbCBjYXB0aW9uOg0KIzxjZW50ZXI+DQojIVsoI2ZpZzpGaWctY2FwdGlvbikgTWkgZmlndXJhXShOb21icmUucG5nKXt3aWR0aD00MDBweH0NCiM8L2NlbnRlcj4NCmBgYA0KPC9jZW50ZXI+DQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQojIyMgSWRlbnRpZmljYWNpw7NuIChvYnNlcnZhY2lvbmVzKQ0KIA0KDQoxLiBRdWUgc2UgaGF5YSBpZGVudGlmaWNhZG8gY29tcGxldGFtZW50ZSBlbCBtb2RlbG8gZGUgZWN1YWNpb25lcyBlc3RydWN0dXJhbGVzIChTRU0pIG5vIGFzZWd1cmEgcXVlIGVsIG1vZGVsbyBkZSBtZWRpZGEgdGFtYmnDqW4gbG8gZXN0w6kuIA0KDQoyLiBQYXJhIGxvcyBtb2RlbG9zIGRlIG1lZGlkYSBiYXNhZG9zIGVuIGFuw6FsaXNpcyBmYWN0b3JpYWwgY29uZmlybWF0b3JpbyAoQUZDKSBjb252ZW5jaW9uYWxlcywgZG9uZGUgY2FkYSBpbmRpY2Fkb3Igc2UgYXNvY2lhIMO6bmljYW1lbnRlIGEgdW4gZmFjdG9yIHkgbG9zIGVycm9yZXMgZGUgbWVkaWNpw7NuIG5vIGVzdMOhbiBjb3JyZWxhY2lvbmFkb3MsIGVzIG5lY2VzYXJpbyBjdW1wbGlyIGNvbiBsYXMgc2lndWllbnRlcyByZWdsYXMgcXVlIHNlIGRlc2NyaWJlbiBlbiBsYSBzZWNjacOzbiBzaWd1aWVudGU6DQogICAgDQogICAgKyBSZWdsYSBkZSBsb3MgdHJlcyBpbmRpY2Fkb3Jlcy4NCiAgICANCiAgICArIFJlZ2xhIGRlIGxvcyBkb3MgaW5kaWNhZG9yZXMuDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQojIyMgSWRlbnRpZmljYWNpw7NuIChSZWdsYSBkZSBsb3MgdHJlcyBpbmRpY2Fkb3JlcykNCg0KU2kgZWwgbW9kZWxvIHRpZW5lIHVuYSBzb2xhIHZhcmlhYmxlIGxhdGVudGUsIGRlYmUgaW5jbHVpciBhbCBtZW5vcyB0cmVzIGluZGljYWRvcmVzICh2w6lhc2UgbGEgZmlndXJhIFxAcmVmKGZpZzpSZWxhY2lvbjE1KSkuDQoNCjxjZW50ZXI+DQpgYGB7ciBSZWxhY2lvbjE1LCBlY2hvPUZBTFNFLCBmaWcuY2FwID0gIioqSWRlbnRpZmljYWNpw7NuIChyZWdsYSBkZSBsb3MgdHJlcyBpbmRpY2Fkb3JlcykqKiIsIG91dC53aWR0aCA9ICI3MCUifQ0KIyBmaWcud2lkdGggPSAyMCAjIE5vIGZ1bmNpb25hIGVzdGEgb3BjaW9uIGVuIGVsIGNodW5rDQoNCiNodHRwOi8vemV2cm9zcy5jb20vYmxvZy8yMDE3LzA2LzE5L3RpcHMtYW5kLXRyaWNrcy1mb3Itd29ya2luZy13aXRoLWltYWdlcy1hbmQtZmlndXJlcy1pbi1yLW1hcmtkb3duLWRvY3VtZW50cy8NCiMgUGFnaW5hIDM1OSBkZSBSMjAxNS1GcmllbmRseQ0KDQprbml0cjo6aW5jbHVkZV9ncmFwaGljcygiUmVsYWNpb24xNS5wbmciKQ0KDQojT3RyYSBtYW5lcmEsIHBlcm8gIHNhbGUgZWwgY2FwdGlvbjoNCiM8Y2VudGVyPg0KIyFbKCNmaWc6RmlnLWNhcHRpb24pIE1pIGZpZ3VyYV0oTm9tYnJlLnBuZyl7d2lkdGg9NDAwcHh9DQojPC9jZW50ZXI+DQpgYGANCjwvY2VudGVyPg0KDQoNCg0KDQo8IS0tICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUgLS0+DQo8IS0tIFNlcGFyYWRvciAtLT4NCg0KIyMjIElkZW50aWZpY2FjacOzbiAoUmVnbGEgZGUgbG9zIGRvcyBpbmRpY2Fkb3JlcykNCg0KU2kgZWwgbW9kZWxvIGluY2x1eWUgZG9zIG8gbcOhcyB2YXJpYWJsZXMgbGF0ZW50ZXMsIGNhZGEgdW5hIGRlIGVsbGFzIGRlYmUgdGVuZXIgYWwgbWVub3MgZG9zIGluZGljYWRvcmVzICh2w6lhc2UgbGEgZmlndXJhIFxAcmVmKGZpZzpSZWxhY2lvbjE2KSkuDQoNCjxjZW50ZXI+DQpgYGB7ciBSZWxhY2lvbjE2LCBlY2hvPUZBTFNFLCBmaWcuY2FwID0gIioqSWRlbnRpZmljYWNpw7NuIChyZWdsYSBkZSBsb3MgZG9zIGluZGljYWRvcmVzKSoqIiwgb3V0LndpZHRoID0gIjcwJSJ9DQojIGZpZy53aWR0aCA9IDIwICMgTm8gZnVuY2lvbmEgZXN0YSBvcGNpb24gZW4gZWwgY2h1bmsNCg0KI2h0dHA6Ly96ZXZyb3NzLmNvbS9ibG9nLzIwMTcvMDYvMTkvdGlwcy1hbmQtdHJpY2tzLWZvci13b3JraW5nLXdpdGgtaW1hZ2VzLWFuZC1maWd1cmVzLWluLXItbWFya2Rvd24tZG9jdW1lbnRzLw0KIyBQYWdpbmEgMzU5IGRlIFIyMDE1LUZyaWVuZGx5DQoNCmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKCJSZWxhY2lvbjE2LnBuZyIpDQoNCiNPdHJhIG1hbmVyYSwgcGVybyAgc2FsZSBlbCBjYXB0aW9uOg0KIzxjZW50ZXI+DQojIVsoI2ZpZzpGaWctY2FwdGlvbikgTWkgZmlndXJhXShOb21icmUucG5nKXt3aWR0aD00MDBweH0NCiM8L2NlbnRlcj4NCmBgYA0KPC9jZW50ZXI+DQoNCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCmBgYHtyIGV2YWw9RkFMU0UsIGVjaG89RkFMU0V9DQpOTyBFU1TDgSBQQVJBRlJBU0VBRE8NCg0KSWRlbnRpZmljYWNpw7NuIChjb250LikgDQoNClJlZ2xhcyBkZSBLZW5ueSwgS2FzaHkgeSBCb2xnZXIgKDE5OTgpIHBhcmEgQUZDIG5vIGNvbnZlbmNpb25hbGVzIChpbmRpY2Fkb3JlcyBjb24NCmNhcmdhcyBmYWN0b3JpYWxlcyBlbiBtYXMgZGUgdW4gZmFjdG9yIHkvbyBjb24gZXJyb3JlcyBkZSBtZWRpY2nDs24gY29ycmVsYWNpb25hZG9zKToNCu+CpyBFbiBtb2RlbG9zIGNvbiBlc2NhbGFzIHVuaWRpbWVuc2lvbmFsZXMgKGVzdHJ1Y3R1cmEgZmFjdG9yaWFsIHNpbXBsZSkgY29uIHTDqXJtaW5vcyBkZQ0KZXJyb3IgY29ycmVsYWNpb25hZG9zOg0K74KnIFBhcmEgY2FkYSBmYWN0b3IgZGViZSBjdW1wbGlyc2UgYWxndW5hIGRlIGxhcyBzaWd1aWVudGVzIHNpdHVhY2lvbmVzOg0KMS4gVGVuZXIgYWwgbWVub3MgdHJlcyBpbmRpY2Fkb3JlcyBjdXlvcyBlcnJvcmVzIG5vIGVzdMOpbiBjb3JyZWxhY2lvbmFkb3MgZW50cmUgc8OtLg0KMi4gVGVuZXIgYWwgbWVub3MgZG9zIGluZGljYWRvcmVzIGN1eW9zIGVycm9yZXMgbm8gZXN0w6luIGNvcnJlbGFjaW9uYWRvcyBlbnRyZSBzw60geSBxdWU6DQphLiBMb3MgZXJyb3JlcyBkZSBhbWJvcyBpbmRpY2Fkb3JlcyBubyBlc3TDqW4gY29ycmVsYWNpb25hZG9zIGNvbiBlbCBlcnJvciBkZSB1biB0ZXJjZXINCmluZGljYWRvciBkZSB1biBmYWN0b3IgZGlmZXJlbnRlLg0KYi4gVW5hIHJlc3RyaWNjacOzbiBkZSBpZ3VhbGRhZCBzZWEgaW1wdWVzdGEgc29icmUgbGFzIGNhcmdhcyBmYWN0b3JpYWxlcyBkZSBhbWJvcyBpbmRpY2Fkb3Jlcy4NCu+CpyBQYXJhIGNhZGEgcGFyIGRlIGZhY3RvcmVzIGRlYmUgaGFiZXIgYWwgbWVub3MgZG9zIGluZGljYWRvcmVzLCB1bm8gZGUgY2FkYSBmYWN0b3IsDQpjdXlvcyB0w6lybWlub3MgZGUgZXJyb3Igbm8gZXN0w6luIGNvcnJlbGFjaW9uYWRvcy4NCu+CpyBQYXJhIGNhZGEgaW5kaWNhZG9yIGRlYmUgaGFiZXIgYWwgbWVub3Mgb3RybyBpbmRpY2Fkb3IgKG5vIG5lY2VzYXJpYW1lbnRlIGRlbA0KbWlzbW8gZmFjdG9yKSBjb24gZWwgY3VhbCBlbnRyZSBzdXMgZXJyb3JlcyBubyBoYXlhIGNvcnJlbGFjacOzbi4NCg0K74KnIEVuIG1vZGVsb3MgY29uIGVzY2FsYXMgbXVsdGlkaW1lbnNpb25hbGVzIChjb24gaW5kaWNhZG9yZXMgY29tcGxlam9zLCBxdWUgc2F0dXJhbiBlbg0KbcOhcyBkZSB1biBmYWN0b3IpIHkgY29uIHTDqXJtaW5vcyBkZSBlcnJvciBjb3JyZWxhY2lvbmFkb3M6DQrvgqcgQ2FyZ2FzIGZhY3RvcmlhbGVzLiBQYXJhIGNhZGEgaW5kaWNhZG9yIGNvbXBsZWpvIGRlYmVuIGN1bXBsaXJzZSBsYXMgc2lndWllbnRlcyBkb3MgY29uZGljaW9uZXM6DQoxLiBDYWRhIGZhY3RvciBlbiBlbCBxdWUgc2F0dXJlIHVuIGluZGljYWRvciBjb21wbGVqbyBkZWJlIGN1bXBsaXIgYWxndW5hIGRlIGxhcyBzaWd1aWVudGVzIHNpdHVhY2lvbmVzOg0KMSkgVGVuZXIgYWwgbWVub3MgdHJlcyBpbmRpY2Fkb3JlcyBjdXlvcyBlcnJvcmVzIG5vIGVzdMOpbiBjb3JyZWxhY2lvbmFkb3MgZW50cmUgc8OtLg0KMikgVGVuZXIgYWwgbWVub3MgZG9zIGluZGljYWRvcmVzIGN1eW9zIGVycm9yZXMgbm8gZXN0w6luIGNvcnJlbGFjaW9uYWRvcyBlbnRyZSBzw60geSBhZGVtw6FzIHF1ZToNCmEuIExvcyBlcnJvcmVzIGRlIGFtYm9zIGluZGljYWRvcmVzIG5vIGVzdMOpbiBjb3JyZWxhY2lvbmFkb3MgY29uIGVsIGVycm9yIGRlIHVuIHRlcmNlciBpbmRpY2Fkb3IgZGUgb3RybyBmYWN0b3IuDQpiLiBVbmEgcmVzdHJpY2Npw7NuIGRlIGlndWFsZGFkIHNlYSBpbXB1ZXN0YSBzb2JyZSBsYXMgY2FyZ2FzIGZhY3RvcmlhbGVzIGRlIGFtYm9zIGluZGljYWRvcmVzLg0KMi4gVG9kbyBwYXIgZGUgZmFjdG9yZXMgZW4gbG9zIHF1ZSBzYXR1cmUgZWwgaW5kaWNhZG9yIGNvbXBsZWpvIGRlYmUgdGVuZXIgYWwgbWVub3MgZG9zIGluZGljYWRvcmVzLCB1bm8gZGUgY2FkYQ0KZmFjdG9yLCBjdXlvcyB0w6lybWlub3MgZGUgZXJyb3Igbm8gZXN0w6luIGNvcnJlbGFjaW9uYWRvcy4NCu+CpyBDb3JyZWxhY2lvbmVzIGVudHJlIGxvcyBlcnJvcmVzIGRlIGluZGljYWRvcmVzIGNvbXBsZWpvcy4gRGViZW4gY3VtcGxpcnNlIGxhcyBzaWd1aWVudGVzIGRvcw0KY29uZGljaW9uZXM6DQoxLiBMYXMgbWlzbWFzIHJlZ2xhcyBhbnRlcmlvcmVzIHF1ZSBkZWJlbiBjdW1wbGlyc2UgcGFyYSBjYXJnYXMgZmFjdG9yaWFsZXMuDQoyLiBQYXJhIGNhZGEgZmFjdG9yIGVuIGVsIHF1ZSBjYXJndWUgdW4gaW5kaWNhZG9yIGNvbXBsZWpvIGRlYmUgaGFiZXIgYWwgbWVub3MgdW4gaW5kaWNhZG9yIGNvbiB1bmEgc29sYSBjYXJnYQ0KZmFjdG9yaWFsIHF1ZSBubyBlc3TDqSBjb3JyZWxhY2lvbmFkbyBjb24gZWwgaW5kaWNhZG9yIGNvbXBsZWpvLg0KYGBgDQoNCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCiMgRXZhbHVhY2nDs24gZGUgbGEgY2FsaWRhZCBkZSBsYSBiYXNlIGRlIGRhdG9zDQoNCkVuIGxhcyBzaWd1aWVudGVzIHNlY2Npb25lcyBzZSB2YW4gYSBwcm9wb25lciByZWNvbWVuZGFjaW9uZXMgY29uIHJlc3BlY3RvIGEgbG9zIHNpZ3VpZW50ZXMgcHVudG9zOiANCg0KMS4gVGFtYcOxbyBkZSBsYSBtdWVzdHJhLg0KDQoyLiBNdWx0aWNvbGluZWFsaWRhZC4NCg0KMy4gVmFsb3JlcyBleHRyZW1vcyB1bml2YXJpYWRvcyB5IG11bHRpdmFyaWFkb3MuDQoNCjQuTm9ybWFsaWRhZCBtdWx0aXZhcmlhZGEuDQoNCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCiMjIyBUYW1hw7FvIGRlIGxhIG11ZXN0cmENCg0KU2UgcmVjb21pZW5kYSB0ZW5lcjoNCg0KMS4gQWwgbWVub3MgMjAwIG9ic2VydmFjaW9uZXMuIA0KDQoyLiBBbCBtZW5vcyAxMCBvYnNlcnZhY2lvbmVzIHBvciBjYWRhIHZhcmlhYmxlIG9ic2VydmFkYS4NCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCiMjIyBNdWx0aWNvbGluZWFsaWRhZA0KDQoxLiBVbmEgY29saW5lYWxpZGFkIGJpdmFyaWFkYSBleHRyZW1hICgkciA+IDAuODUkKSB5IG11bHRpdmFyaWFkYSBwdWVkZSBpbmRpY2FyIGxhIHByZXNlbmNpYSBkZSB2YXJpYWJsZXMgcmVkdW5kYW50ZXMgeSBxdWUgbGEgbWF0cml6IGRlIGNvcnJlbGFjacOzbiBubyBzZWEgZGVmaW5pZGEgcG9zaXRpdmEuIA0KDQoyLiBFcyBpbXBvcnRhbnRlIGV4YW1pbmFyIGxvcyBjb2VmaWNpZW50ZXMgZGUgY29ycmVsYWNpw7NuLCBhc8OtIGNvbW8gZWwgZGV0ZXJtaW5hbnRlIHkgbG9zIGF1dG92YWxvcmVzIGRlIGxhIG1hdHJpeiBkZSBjb3JyZWxhY2nDs24uDQoNCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCiMjIyBWYWxvcmVzIGV4dHJlbW9zIHVuaXZhcmlhZG9zIHkgbXVsdGl2YXJpYWRvcw0KDQoxLiBTZSBkZWJlbiBlbGltaW5hciBvYnNlcnZhY2lvbmVzIGN1eW9zIHZhbG9yZXMgc2UgZGVzdsOtZW4gbcOhcyBkZSAzIGRlc3ZpYWNpb25lcyBlc3TDoW5kYXIgZGUgbGEgbWVkaWEuIA0KDQoyLiBFbiBlbCBjYXNvIGRlIHZhbG9yZXMgZXh0cmVtb3MgbXVsdGl2YXJpYWRvcywgc2UgZGViZW4gY2FsY3VsYXIgbGFzIGRpc3RhbmNpYXMgZGUgTWFoYWxhbm9iaXMgeSBkZXNjYXJ0YXIgbGFzIG9ic2VydmFjaW9uZXMgY29uIGRpc3RhbmNpYXMgc2lnbmlmaWNhdGl2YXMgYWwgMSUuDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQojIyMgTm9ybWFsaWRhZCBtdWx0aXZhcmlhZGENCg0KMS4gU2UgZGViZW4gZXhhbWluYXIgbG9zIGNvZWZpY2llbnRlcyBkZSBhc2ltZXRyw61hIHkgY3VydG9zaXMgcGFyYSBldmFsdWFyIGxhIG5vcm1hbGlkYWQgdW5pdmFyaWFkYS4NCg0KMi4gU2UgY29uc2lkZXJhbiBub3JtYWxlcyBsYXMgdmFyaWFibGVzIGN1eW9zIGNvZWZpY2llbnRlcyBlbiB2YWxvciBhYnNvbHV0byBzZWFuIG1lbm9yZXMgYSAzIHkgMTAgcmVzcGVjdGl2YW1lbnRlLiANCg0KMy4gRXMgaW1wb3J0YW50ZSBhcGxpY2FyIHBydWViYXMgZGUgbm9ybWFsaWRhZCB1bml2YXJpYWRhIChjb21vIGxhIHBydWViYSBjb25qdW50YSBkZSBhc2ltZXRyw61hIHkgY3VydG9zaXMpIHkgYWxnw7puIHRlc3QgZGUgbm9ybWFsaWRhZCBtdWx0aXZhcmlhZGEgKGNvbW8gZWwgZGUgTWFyZGlhKS4gTG8gbcOhcyByZWxldmFudGUgZXMgcXVlIHNlIGN1bXBsYSBsYSBjdXJ0b3NpcyBtdWx0aXZhcmlhZGEuDQoNCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCiMjIyBOb3JtYWxpZGFkIG11bHRpdmFyaWFkYTogY29tZW50YXJpbw0KDQoxLiBTaSBsYSBkaXN0cmlidWNpw7NuIG5vIGVzIG5vcm1hbCBwZXJvIHByZXNlbnRhIG1lc29jdXJ0b3NpcywgbGFzIHByb3BpZWRhZGVzIGRlIGxvcyBlc3RpbWFkb3JlcyBkZSBtw6F4aW1hIHZlcm9zaW1pbGl0dWQgIHNvbiBlcXVpdmFsZW50ZXMgYSBsYXMgcXVlIHNlIHRpZW5lbiBiYWpvIGxhIGhpcMOzdGVzaXMgZGUgbm9ybWFsaWRhZC4gDQoNCjIuIFNpbiBlbWJhcmdvLCBzaSBsYSBjdXJ0b3NpcyBkaWZpZXJlIHNpZ25pZmljYXRpdmFtZW50ZSBkZSBsYSBub3JtYWwsIGVzdG9zIGVzdGltYWRvcmVzIHNvbiBjb25zaXN0ZW50ZXMgcGVybyBubyBlZmljaWVudGVzIGFzaW50w7N0aWNhbWVudGUuDQoNCjMuIExvIGFudGVyaW9yIHB1ZWRlIGdlbmVyYXIgZGlmaWN1bHRhZGVzIGVuIGxhcyBwcnVlYmFzIGRlIHNpZ25pZmljYWNpw7NuIGluZGl2aWR1YWwgZGUgbG9zIHBhcsOhbWV0cm9zIHkgZW4gbGEgcHJ1ZWJhIGRlIHZhbGlkZXogZ2xvYmFsIGRlbCBtb2RlbG8uDQoNCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCiMgRXN0aW1hY2nDs24gZGUgcGFyw6FtZXRyb3MNCg0KIyMjIE9iamV0aXZvcw0KDQoxLiBFbiBsb3MgbW9kZWxvcyBkZSBlY3VhY2lvbmVzIGVzdHJ1Y3R1cmFsZXMgKFNFTSksIGVsIG9iamV0aXZvIGVzIGFqdXN0YXIgbGFzIGNvdmFyaWFuemFzIGVudHJlIGxhcyB2YXJpYWJsZXMuIA0KDQoyLiBFbiBsdWdhciBkZSByZWR1Y2lyIGxhIGRpZmVyZW5jaWEgZW50cmUgbG9zIHZhbG9yZXMgcHJvbm9zdGljYWRvcyB5IGxvcyBvYnNlcnZhZG9zIGEgbml2ZWwgaW5kaXZpZHVhbCwgc2UgYnVzY2EgbWluaW1pemFyIGxhIGRpc2NyZXBhbmNpYSBlbnRyZSBsYXMgY292YXJpYW56YXMgb2JzZXJ2YWRhcyBlbiBsYSBtdWVzdHJhIHkgbGFzIGNvdmFyaWFuemFzIHByZXZpc3RhcyBwb3IgZWwgbW9kZWxvIGVzdHJ1Y3R1cmFsLiANCg0KMy4gUG9yIGVzdGEgcmF6w7NuLCBlc3RvcyBtb2RlbG9zIHRhbWJpw6luIHNlIGNvbm9jZW4gY29tbyAqbW9kZWxvcyBkZSBlc3RydWN0dXJhIGRlIGNvdmFyaWFuemEqIChDb3ZhcmlhbmNlIFN0cnVjdHVyZSBNb2RlbHMpLg0KDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQojIyMgSGlww7N0ZXNpcyBmdW5kYW1lbnRhbA0KDQoxLiBMYSBoaXDDs3Rlc2lzIHByaW5jaXBhbCBzb3N0aWVuZSBxdWUsIHNpIGVsIG1vZGVsbyBlcyBwcmVjaXNvLCBsYSBtYXRyaXogZGUgdmFyaWFuemFzIHkgY292YXJpYW56YXMgZGUgbGEgcG9ibGFjacOzbiBwdWVkZSBzZXIgcmVwcmVzZW50YWRhIGRlIG1hbmVyYSBleGFjdGEgbWVkaWFudGUgdW5hIGNvbWJpbmFjacOzbiBkZSBsb3MgcGFyw6FtZXRyb3MgZGVsIG1vZGVsby4gDQoNCjIuIEV4cHJlc2FkbyBlbiBub3RhY2nDs246DQoNCiQkSG86XDsgIFxTaWdtYSBcLD1cLCBcU2lnbWEoXHRoZXRhKSQkDQoNCjMuIEVuIGxhIGV4cHJlc2nDs24gYW50ZXJpb3IsICRcU2lnbWEkIHJlcHJlc2VudGEgbGEgbWF0cml6IGRlIHZhcmlhbnphcyB5IGNvdmFyaWFuemFzIGRlIGxhIHBvYmxhY2nDs24gZW50cmUgbGFzIHZhcmlhYmxlcyBvYnNlcnZhZGFzLCB5ICRcU2lnbWEoXHRoZXRhKSQgZXMgbGEgbWF0cml6IGRlIHZhcmlhbnphcyB5IGNvdmFyaWFuemFzIG9idGVuaWRhIGNvbW8gdW5hIGZ1bmNpw7NuIGRlIGxvcyBwYXLDoW1ldHJvcyBjb250ZW5pZG9zIGVuIGVsIHZlY3RvciAkXHRoZXRhJC4NCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCiMgRXN0aW1hY2nDs246IGVqZW1wbG8NCg0KDQpDb25zaWRlcmVtb3MgZWwgc2lndWllbnRlIG1vZGVsbyBkZSByZWdyZXNpw7NuOiANCg0KJCQgeSBcOz1cOyBcYmV0YSB4ICsgXHZhcmVwc2lsb24kJA0KDQpMYSBtYXRyaXogZGUgdmFyaWFuemFzIHkgY292YXJpYW56YXMgZW50cmUgJFgkIHkgJFkkIGVzOiANCg0KJCRcU2lnbWEgXDs9IFw7IFxiZWdpbntwbWF0cml4fQ0KIFYoWCkmIENvdihYLFkpXFwgDQpDb3YoWCxZKSAmIFYoWSkNClxlbmR7cG1hdHJpeH0kJA0KDQpBcGxpY2FuZG8gcHJvcGllZGFkZXMgZGUgdmFyaWFuemEgeSBjb3ZhcmlhbnphICh5IHN1cG9uaWVuZG8gcXVlICRWKFx2YXJlcHNpbG9uKT1cc2lnbWFeMiQpIHNlIHB1ZWRlIGRlbW9zdHJhciBxdWU6DQoNCiQkQ292KFgsWSkgXDs9XDsgXGJldGEgXCxWKFgpLCBccXF1YWQgVihZKSBcOz1cOyBcYmV0YV4yXCwgVihYKSBcOytcOyBWKFx2YXJlcHNpbG9uKVw7PVw7IFxiZXRhXjJcLCBWKFgpIFw7K1w7IFxzaWdtYV4yJCQNCg0KQWwgcmVlbXBsYXphciBlc3RhcyBleHByZXNpb25lcyBlbiBsYSBtYXRyaXogZGUgdmFyaWFuemFzIHkgY292YXJpYW56YXMgcG9ibGFjaW9uYWwsIHNlIHB1ZWRlIGV4cHJlc2FyIGVuIHTDqXJtaW5vcyBkZSBsb3MgcGFyw6FtZXRyb3MgZGVsIG1vZGVsbywgb2J0ZW5pZW5kbyBhc8OtIGxhIG1hdHJpeiBpbXBsw61jaXRhIGRlIHZhcmlhbnphcyB5IGNvdmFyaWFuemFzOg0KDQoNCiQkXFNpZ21hKFx0aGV0YSkgXDs9IFw7IFxiZWdpbntwbWF0cml4fQ0KVihYKSAmIFxiZXRhIFwsVihYKVxcIA0KXGJldGEgXCxWKFgpICYgXGJldGFeMlwsIFYoWCkgXDsrXDsgXHNpZ21hXjINClxlbmR7cG1hdHJpeH0sIFxxcXVhZCBcdGhldGE9KFxiZXRhLCBcc2lnbWFeMileVCQkDQoNCkxhIGVzdGltYWNpw7NuIGRlIGxvcyBwYXLDoW1ldHJvcyBzZSBsbGV2YSBhIGNhYm8gYnVzY2FuZG8gbWF4aW1pemFyIGxhIHByZWNpc2nDs24gZGVsIG1vZGVsby4gUGFyYSBsb2dyYXIgZXN0bywgc2UgaW50ZW50YSByZWR1Y2lyIGFsIG3DrW5pbW8gbGFzIGRpZmVyZW5jaWFzIGVudHJlIGxhcyB2YXJpYW56YXMgeSBjb3ZhcmlhbnphcyBvYnNlcnZhZGFzLCAkUyQsIHkgbGFzIHF1ZSBlbCBtb2RlbG8gcmVwcm9kdWNlLCAkU1xiaWcoXHdpZGVoYXR7XHRoZXRhfVxiaWcpJA0KDQo8IS0tICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUgLS0+DQo8IS0tIFNlcGFyYWRvciAtLT4NCg0KIyBFc3RpbWFjacOzbjogbcOpdG9kb3MNCg0KIyMjIEFsZ3Vub3MgbcOpdG9kb3MgZGUgZXN0aW1hY2nDs24NCg0KRW4gbG9zIG1vZGVsb3MgZGUgZWN1YWNpb25lcyBlc3RydWN0dXJhbGVzIChTRU0pIGV4aXN0ZW4gZGlzdGludG9zIG3DqXRvZG9zIHBhcmEgZXN0aW1hciBsb3MgcGFyw6FtZXRyb3MgZGVsIG1vZGVsbywgbG9zIGN1YWxlcyBkaWZpZXJlbiBlbiBsb3Mgc3VwdWVzdG9zIGVzdGFkw61zdGljb3MgcXVlIGFkb3B0YW4sIGVuIGxhIGZvcm1hIGNvbW8gdHJhdGFuIGxhIG1hdHJpeiBkZSBjb3ZhcmlhbnphcyB5IGVuIHN1cyBwcm9waWVkYWRlcyBpbmZlcmVuY2lhbGVzLiAgRW4gbGFzIHNlY2Npb25lcyBzaWd1aWVudGVzIHNlIHByZXNlbnRhbiB5IGRpc2N1dGVuIGxvcyBtw6l0b2RvcyBtw6FzIHV0aWxpemFkb3MgZW4gbGEgcHLDoWN0aWNhIGFwbGljYWRhOg0KDQoxLiAqTcOheGltYSB2ZXJvc2ltaWxpdHVkIChNTCkuKg0KDQoyLiAqTcOtbmltb3MgY3VhZHJhZG9zIG5vIHBvbmRlcmFkb3MgKFVMUykuKg0KDQozLiAqTcOtbmltb3MgY3VhZHJhZG9zIGdlbmVyYWxpemFkb3MgKEdMUykuKg0KDQo0LiAqTcOtbmltb3MgY3VhZHJhZG9zIHBvbmRlcmFkb3MgKFdMUykqIG8gKmRlIGRpc3RyaWJ1Y2nDs24gYXNpbnTDs3RpY2FtZW50ZSBsaWJyZSAoQURGKSouIA0KDQo8IS0tICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUgLS0+DQo8IS0tIFNlcGFyYWRvciAtLT4NCg0KIyMjIE3DoXhpbWEgdmVyb3NpbWlsaXR1ZCAoTUwpDQoNCjEuIEVzIGVsIG3DqXRvZG8gZGUgZXN0aW1hY2nDs24gbcOhcyB1dGlsaXphZG8gZW4gU0VNIHkgY29uc3RpdHV5ZSBsYSBvcGNpw7NuIHByZWZlcmlkYSBiYWpvIGVsIHN1cHVlc3RvIGRlICoqbm9ybWFsaWRhZCBtdWx0aXZhcmlhZGEqKiwgZGViaWRvIGEgc3VzIHByb3BpZWRhZGVzIGRlIGluc2VzZ2FkZXogeSBlZmljaWVuY2lhIGFzaW50w7N0aWNhLg0KDQoyLiBFbiBsYSBwcsOhY3RpY2EsIE1MIGVzIHJlbGF0aXZhbWVudGUgcm9idXN0byBmcmVudGUgYSBkZXN2aWFjaW9uZXMgbW9kZXJhZGFzIGRlIGxhIG5vcm1hbGlkYWQuIFNpbiBlbWJhcmdvLCBjdWFuZG8gbGEgZmFsdGEgZGUgbm9ybWFsaWRhZCBlcyBzZXZlcmEsIHNlIHJlY29taWVuZGEgZWwgdXNvIGRlICoqZXJyb3JlcyBlc3TDoW5kYXIgcm9idXN0b3MqKiAocG9yIGVqZW1wbG8sIFF1YXNpLU1heGltdW0gTGlrZWxpaG9vZCBvIGNvcnJlY2Npb25lcyB0aXBvIEh1YmVy4oCTV2hpdGUpIG8gcHJvY2VkaW1pZW50b3MgZGUgKipib290c3RyYXAqKi4NCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCiMjIyBNw61uaW1vcyBjdWFkcmFkb3Mgbm8gcG9uZGVyYWRvcyAoVUxTKQ0KDQoxLiBFcyBjb25jZXB0dWFsbWVudGUgc2ltaWxhciBhbCBtw6l0b2RvIGRlICoqTcOtbmltb3MgQ3VhZHJhZG9zIE9yZGluYXJpb3MgKE9MUykqKiBlbiByZWdyZXNpw7NuLCBlbiBlbCBzZW50aWRvIGRlIHF1ZSBtaW5pbWl6YSBsYXMgZGlzY3JlcGFuY2lhcyBlbnRyZSBsYXMgY292YXJpYW56YXMgb2JzZXJ2YWRhcyB5IGxhcyByZXByb2R1Y2lkYXMgcG9yIGVsIG1vZGVsby4NCg0KMi4gTm8gcmVxdWllcmUgcXVlIGxhIG1hdHJpeiBkZSBjb3ZhcmlhbnphcyBtdWVzdHJhbCBzZWEgZGVmaW5pZGEgcG9zaXRpdmEsIGxvIHF1ZSBwdWVkZSByZXN1bHRhciB2ZW50YWpvc28gZW4gc2l0dWFjaW9uZXMgcHJvYmxlbcOhdGljYXMuDQoNCjMuIFByb2R1Y2UgZXN0aW1hZG9yZXMgaW5zZXNnYWRvcywgYXVucXVlIGdlbmVyYWxtZW50ZSBtZW5vcyBlZmljaWVudGVzIHF1ZSBsb3Mgb2J0ZW5pZG9zIG1lZGlhbnRlIE1MLg0KDQo0LiBSZXF1aWVyZSBxdWUgdG9kYXMgbGFzIHZhcmlhYmxlcyBvYnNlcnZhZGFzIGVzdMOpbiBtZWRpZGFzIGVuIGxhIG1pc21hIGVzY2FsYS4NCg0KNS4gRW4gbGEgcHLDoWN0aWNhLCBzdWVsZSBlbXBsZWFyc2UgY29tbyBtw6l0b2RvIHByZWxpbWluYXIgcGFyYSBvYnRlbmVyICoqdmFsb3JlcyBpbmljaWFsZXMqKiBxdWUgcG9zdGVyaW9ybWVudGUgc2UgdXRpbGl6YW4gZW4gbGEgZXN0aW1hY2nDs24gcG9yIE1MLg0KDQo8IS0tICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUgLS0+DQo8IS0tIFNlcGFyYWRvciAtLT4NCg0KIyMjIE3DrW5pbW9zIGN1YWRyYWRvcyBnZW5lcmFsaXphZG9zIChHTFMpDQoNCjEuIEFsIGlndWFsIHF1ZSBNTCwgZXN0ZSBtw6l0b2RvIG9wZXJhIGJham8gZWwgc3VwdWVzdG8gZGUgKipub3JtYWxpZGFkIG11bHRpdmFyaWFkYSoqLg0KDQoyLiBBIGRpZmVyZW5jaWEgZGUgVUxTLCBubyBleGlnZSBxdWUgdG9kYXMgbGFzIHZhcmlhYmxlcyBlc3TDqW4gZW4gbGEgbWlzbWEgZXNjYWxhLCB5YSBxdWUgaW5jb3Jwb3JhIHVuYSBtYXRyaXogZGUgcG9uZGVyYWNpw7NuLg0KDQozLiBFbiB0w6lybWlub3MgY29tcHV0YWNpb25hbGVzLCBzdWVsZSBzZXIgbcOhcyBlZmljaWVudGUgcXVlIE1MIHkgVUxTLCBhdW5xdWUgZW4gbGEgcHLDoWN0aWNhIGVzIG1lbm9zIHV0aWxpemFkbyBxdWUgTUwgZW4gYXBsaWNhY2lvbmVzIGVzdMOhbmRhci4NCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCiMjIyBNw61uaW1vcyBjdWFkcmFkb3MgcG9uZGVyYWRvcyAoV0xTKSBvIGRlIGRpc3RyaWJ1Y2nDs24gYXNpbnTDs3RpY2FtZW50ZSBsaWJyZSAoQURGKQ0KDQoxLiBFc3RlIG3DqXRvZG8gbm8gcmVxdWllcmUgZWwgc3VwdWVzdG8gZGUgbm9ybWFsaWRhZCBtdWx0aXZhcmlhZGEsIHBlcm8gc8OtIGRlbWFuZGEgdW4gKip0YW1hw7FvIG11ZXN0cmFsIGVsZXZhZG8qKiwgdMOtcGljYW1lbnRlIGVudHJlIDIwMCB5IDUwMCBvYnNlcnZhY2lvbmVzIG8gbcOhcy4NCg0KMi4gRXMgZXNwZWNpYWxtZW50ZSBhZGVjdWFkbyBjdWFuZG8gc2UgdHJhYmFqYSBjb24gKip2YXJpYWJsZXMgb3JkaW5hbGVzIG8gY2F0ZWfDs3JpY2FzKiosIGVzdGltYWRhcyBhIHBhcnRpciBkZSBtYXRyaWNlcyBkZSBjb3JyZWxhY2lvbmVzIHBvbGljw7NyaWNhcywgdGV0cmFjw7NyaWNhcyBvIHBvbGlzZXJpYWxlcy4NCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCiMgRXN0aW1hY2nDs246IGZ1bmNpw7NuIGRlIGFqdXN0ZQ0KDQoNCkVuIGxvcyBtb2RlbG9zIGRlIGVjdWFjaW9uZXMgZXN0cnVjdHVyYWxlcywgbGEgZXN0aW1hY2nDs24gZGUgbG9zIHBhcsOhbWV0cm9zIHNlIHJlYWxpemEgbWluaW1pemFuZG8gdW5hICoqZnVuY2nDs24gZGUgYWp1c3RlKiosIGxhIGN1YWwgbWlkZSBsYSBkaXNjcmVwYW5jaWEgZW50cmUgbGEgbWF0cml6IGRlIHZhcmlhbnphcyB5IGNvdmFyaWFuemFzIG9ic2VydmFkYSBlbiBsYSBtdWVzdHJhLCBcKFNcKSwgeSBsYSBtYXRyaXogZGUgdmFyaWFuemFzIHkgY292YXJpYW56YXMgaW1wbMOtY2l0YSBlbiBlbCBtb2RlbG8sIFwoXFNpZ21hKFx0aGV0YSlcKS4gIA0KDQpDYWRhIG3DqXRvZG8gZGUgZXN0aW1hY2nDs24gc2UgYXNvY2lhIGNvbiB1bmEgZnVuY2nDs24gZGUgYWp1c3RlIHBhcnRpY3VsYXIsIGN1eWEgbWluaW1pemFjacOzbiBwcm9kdWNlIGxvcyBlc3RpbWFkb3JlcyBkZSBsb3MgcGFyw6FtZXRyb3MgZGVsIG1vZGVsby4NCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCiMjIyBNw6F4aW1hIHZlcm9zaW1pbGl0dWQgKE1MKQ0KDQpMYSBmdW5jacOzbiBkZSBhanVzdGUgZGUgbcOheGltYSB2ZXJvc2ltaWxpdHVkIHNlIGRlZmluZSBjb21vOg0KDQpcWw0KRl97TUx9IFw7ID0gXDsgXGxvZ3xcU2lnbWEoXHRoZXRhKXwgXDsrXDsgXG1hdGhybXt0cn1cIVxsZWZ0KFNcLFxTaWdtYV57LTF9KFx0aGV0YSlccmlnaHQpIFw7LVw7IFxsb2d8U3wgXDstXDsgKHArcSksDQpcXQ0KDQpkb25kZSBcKFNcKSBlcyBsYSBtYXRyaXogZGUgY292YXJpYW56YXMgbXVlc3RyYWwsIFwoXFNpZ21hKFx0aGV0YSlcKSBsYSBtYXRyaXogaW1wbMOtY2l0YSBkZWwgbW9kZWxvLCB5IFwocFwpIHkgXChxXCkgY29uc3RhbnRlcyBxdWUgZGVwZW5kZW4gZGVsIG7Dum1lcm8gZGUgdmFyaWFibGVzIG9ic2VydmFkYXMuDQoNCioqSW50ZXJwcmV0YWNpw7NuLioqICANCg0KRXN0ZSBjcml0ZXJpbyBldmFsw7phIHF1w6kgdGFuIHByb2JhYmxlIGVzIG9ic2VydmFyIGxhIG1hdHJpeiBcKFNcKSBiYWpvIGVsIHN1cHVlc3RvIGRlIG5vcm1hbGlkYWQgbXVsdGl2YXJpYWRhIHkgZGFkbyBlbCBtb2RlbG8gZXNwZWNpZmljYWRvLiBNaW5pbWl6YXIgXChGX3tNTH1cKSBlcXVpdmFsZSBhIG1heGltaXphciBsYSB2ZXJvc2ltaWxpdHVkIGRlbCBtb2RlbG8sIHBvciBsbyBxdWUgZXN0ZSBtw6l0b2RvIGVzIGVsIG3DoXMgdXRpbGl6YWRvIGN1YW5kbyBzZSBhc3VtZSBub3JtYWxpZGFkIG11bHRpdmFyaWFkYS4NCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCiMjIyBNw61uaW1vcyBjdWFkcmFkb3Mgbm8gcG9uZGVyYWRvcyAoVUxTKQ0KDQpMYSBmdW5jacOzbiBkZSBhanVzdGUgVUxTIGVzdMOhIGRhZGEgcG9yOg0KDQpcWw0KRl97VUxTfSBcOyA9IFw7IFxmcmFjezF9ezJ9XCxcbWF0aHJte3RyfVwhXGxlZnQoXGJpZ1tTIC0gXFNpZ21hKFx0aGV0YSlcYmlnXV4yXHJpZ2h0KS4NClxdDQoNCioqSW50ZXJwcmV0YWNpw7NuLioqICANCg0KRXN0ZSBtw6l0b2RvIG1pbmltaXphIGRpcmVjdGFtZW50ZSBsYSBzdW1hIGRlIGxvcyBjdWFkcmFkb3MgZGUgbGFzIGRpZmVyZW5jaWFzIGVudHJlIGxhcyBjb3ZhcmlhbnphcyBvYnNlcnZhZGFzIHkgbGFzIHJlcHJvZHVjaWRhcyBwb3IgZWwgbW9kZWxvLCBvdG9yZ2FuZG8gZWwgbWlzbW8gcGVzbyBhIHRvZGFzIGVsbGFzLiBFcyBjb25jZXB0dWFsbWVudGUgc2ltcGxlIHkgbm8gcmVxdWllcmUgbm9ybWFsaWRhZCBtdWx0aXZhcmlhZGEsIGF1bnF1ZSBwdWVkZSBzZXIgbWVub3MgZWZpY2llbnRlIHF1ZSBNTC4NCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCiMjIyBNw61uaW1vcyBjdWFkcmFkb3MgZ2VuZXJhbGl6YWRvcyAoR0xTKQ0KDQpMYSBmdW5jacOzbiBkZSBhanVzdGUgR0xTIHNlIGRlZmluZSBjb21vOg0KDQpcWw0KRl97R0xTfSBcOyA9IFw7IFxmcmFjezF9ezJ9XCxcbWF0aHJte3RyfVwhXGxlZnQoXGxlZnRce1xiaWdbUyAtIFxTaWdtYShcdGhldGEpXGJpZ10gV157LTF9XHJpZ2h0XH1eMlxyaWdodCksDQpcXQ0KDQpkb25kZSBcKFdcKSBlcyB1bmEgbWF0cml6IGRlIHBvbmRlcmFjacOzbiwgdXN1YWxtZW50ZSByZWxhY2lvbmFkYSBjb24gXChcU2lnbWEoXHRoZXRhKVwpLg0KDQoqKkludGVycHJldGFjacOzbi4qKiAgDQoNCkdMUyBleHRpZW5kZSBlbCBtw6l0b2RvIFVMUyBpbmNvcnBvcmFuZG8gcG9uZGVyYWNpb25lcywgZGUgbW9kbyBxdWUgbGFzIGRpc2NyZXBhbmNpYXMgZW50cmUgY292YXJpYW56YXMgbm8gY29udHJpYnV5ZW4gdG9kYXMgcG9yIGlndWFsIGEgbGEgZnVuY2nDs24gZGUgYWp1c3RlLiBCYWpvIG5vcm1hbGlkYWQgbXVsdGl2YXJpYWRhLCBwdWVkZSBzZXIgbcOhcyBlZmljaWVudGUgcXVlIFVMUywgYXVucXVlIHN1ZWxlIHNlciBjb21wdXRhY2lvbmFsbWVudGUgbWVub3MgZXN0YWJsZSBxdWUgTUwuDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQojIyMgTcOtbmltb3MgY3VhZHJhZG9zIHBvbmRlcmFkb3MgKFdMUykgbyBkaXN0cmlidWNpw7NuIGFzaW50w7N0aWNhbWVudGUgbGlicmUgKEFERikNCg0KTGEgZnVuY2nDs24gZGUgYWp1c3RlIFdMUyAobyBBREYpIHNlIGV4cHJlc2EgY29tbzoNCg0KXFsNCkZfe1dMU30gXDsgPSBcOyBcZnJhY3sxfXsyfVwsXG1hdGhybXt0cn1cIVxsZWZ0KFxsZWZ0XHtcYmlnW1MgLSBcU2lnbWEoXHRoZXRhKVxiaWddIFZeey0xfVxyaWdodFx9XjJccmlnaHQpLA0KXF0NCg0KZG9uZGUgXChWXCkgZXMgbGEgbWF0cml6IGRlIHZhcmlhbnphcyB5IGNvdmFyaWFuemFzIGFzaW50w7N0aWNhcyBkZSBsb3MgZWxlbWVudG9zIGRlIFwoU1wpLg0KDQoqKkludGVycHJldGFjacOzbi4qKiAgDQoNCkVzdGUgbcOpdG9kbyBwb25kZXJhIGxhcyBkaXNjcmVwYW5jaWFzIHV0aWxpemFuZG8gaW5mb3JtYWNpw7NuIHNvYnJlIGxhIHZhcmlhYmlsaWRhZCBkZSBsYXMgY292YXJpYW56YXMgbXVlc3RyYWxlcy4gTm8gcmVxdWllcmUgbm9ybWFsaWRhZCBtdWx0aXZhcmlhZGEgeSBlcyBlc3BlY2lhbG1lbnRlIGFwcm9waWFkbyBwYXJhIHZhcmlhYmxlcyBvcmRpbmFsZXMgbyBjYXRlZ8OzcmljYXMsIGF1bnF1ZSBkZW1hbmRhIHRhbWHDsW9zIG11ZXN0cmFsZXMgZ3JhbmRlcyBwYXJhIHVuIGRlc2VtcGXDsW8gYWRlY3VhZG8uDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQojIyMjIENvbWVudGFyaW8gcGVkYWfDs2dpY28gey51bmxpc3RlZCAudW5udW1iZXJlZH0NCg0KRW4gdG9kb3MgbG9zIGNhc29zLCBlbCBvYmpldGl2byBlcyBlbCBtaXNtbzogZW5jb250cmFyIGVsIGNvbmp1bnRvIGRlIHBhcsOhbWV0cm9zIFwoXHRoZXRhXCkgcXVlIGhhZ2EgcXVlIGxhIG1hdHJpeiBpbXBsw61jaXRhIGRlbCBtb2RlbG8sIFwoXFNpZ21hKFx0aGV0YSlcKSwgc2UgYXByb3hpbWUgbG8gbWVqb3IgcG9zaWJsZSBhIGxhIG1hdHJpeiBvYnNlcnZhZGEgXChTXCkuIExhcyBkaWZlcmVuY2lhcyBlbnRyZSBsb3MgbcOpdG9kb3MgcmFkaWNhbiBlbiAqKmPDs21vIHNlIG1pZGVuIHkgcG9uZGVyYW4gZXNhcyBkaXNjcmVwYW5jaWFzKiosIG5vIGVuIGxhIGzDs2dpY2EgZ2VuZXJhbCBkZWwgZW5mb3F1ZS4NCg0KDQo8IS0tICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUgLS0+DQo8IS0tIFNlcGFyYWRvciAtLT4NCg0KIyMjIFJlc3VtZW4gZGUgbGFzIGZ1bmNpb25lcyBkZSBhanVzdGUNCg0KDQpWw6lhc2UgbGEgZmlndXJhIFxAcmVmKGZpZzpSZWxhY2lvbjE4KS4NCg0KPGNlbnRlcj4NCmBgYHtyIFJlbGFjaW9uMTgsIGVjaG89RkFMU0UsIGZpZy5jYXAgPSAiKipGdW5jaW9uZXMgZGUgYm9uZGFkIGRlIGFqdXN0ZSoqIiwgb3V0LndpZHRoID0gIjEwMCUifQ0KIyBmaWcud2lkdGggPSAyMCAjIE5vIGZ1bmNpb25hIGVzdGEgb3BjaW9uIGVuIGVsIGNodW5rDQoNCiNodHRwOi8vemV2cm9zcy5jb20vYmxvZy8yMDE3LzA2LzE5L3RpcHMtYW5kLXRyaWNrcy1mb3Itd29ya2luZy13aXRoLWltYWdlcy1hbmQtZmlndXJlcy1pbi1yLW1hcmtkb3duLWRvY3VtZW50cy8NCiMgUGFnaW5hIDM1OSBkZSBSMjAxNS1GcmllbmRseQ0KDQprbml0cjo6aW5jbHVkZV9ncmFwaGljcygiUmVsYWNpb24xOC5wbmciKQ0KDQojT3RyYSBtYW5lcmEsIHBlcm8gIHNhbGUgZWwgY2FwdGlvbjoNCiM8Y2VudGVyPg0KIyFbKCNmaWc6RmlnLWNhcHRpb24pIE1pIGZpZ3VyYV0oTm9tYnJlLnBuZyl7d2lkdGg9NDAwcHh9DQojPC9jZW50ZXI+DQpgYGANCjwvY2VudGVyPg0KDQo8IS0tICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUgLS0+DQo8IS0tIFNlcGFyYWRvciAtLT4NCg0KIyBFc3RpbWFjacOzbiBjb24gdmFyaWFibGVzIG9ic2VydmFkYXMgb3JkaW5hbGVzIG8gY2F0ZWfDs3JpY2FzIA0KDQojIyMgT2JzZXJ2YWNpb25lcyBnZW5lcmFsZXMNCg0KMS4gQ3VhbmRvIGxvcyBpbmRpY2Fkb3JlcyBhc29jaWFkb3MgYSB1bmEgdmFyaWFibGUgbGF0ZW50ZSBzb24gKipvcmRpbmFsZXMgbyBjYXRlZ8Ozcmljb3MqKiwgZWwgc3VwdWVzdG8gZGUgKm5vcm1hbGlkYWQgbXVsdGl2YXJpYWRhKiBzdWVsZSB2ZXJzZSBjb21wcm9tZXRpZG8uIEVuIGVzdGFzIGNvbmRpY2lvbmVzLCBlbCB1c28gZGVsIG3DqXRvZG8gZGUgKk3DoXhpbWEgVmVyb3NpbWlsaXR1ZCAoTUwpKiBubyBlcyByZWNvbWVuZGFibGUgZW4gc3UgZm9ybWEgZXN0w6FuZGFyLg0KDQoyLiBFbiBzdSBsdWdhciwgc2UgZGViZW4gZW1wbGVhciAqbcOpdG9kb3MgZGUgZXN0aW1hY2nDs24gcXVlIHRlbmdhbiBlbiBjdWVudGEgbGEgZmFsdGEgZGUgbm9ybWFsaWRhZCosIHlhIHNlYSBtZWRpYW50ZSBmdW5jaW9uZXMgZGUgYWp1c3RlIGFsdGVybmF0aXZhcyBvIGEgdHJhdsOpcyBkZSBjb3JyZWNjaW9uZXMgcm9idXN0YXMgZW4gbG9zIGVycm9yZXMgZXN0w6FuZGFyLg0KDQo8IS0tICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUgLS0+DQo8IS0tIFNlcGFyYWRvciAtLT4NCg0KIyMjIEluZGljYWRvcmVzIGVuIGVzY2FsYSBMaWtlcnQgbyBzaW1pbGFyDQoNCjEuIEN1YW5kbyBsb3MgaW5kaWNhZG9yZXMgY29uc3RpdHV5ZW4gdW4gY29uanVudG8gKmhvbW9nw6luZW8qIGRlIHZhcmlhYmxlcyBtZWRpZGFzIGVuIGVzY2FsYSBMaWtlcnQgKHUgb3RyYXMgZXNjYWxhcyBvcmRpbmFsZXMgc2ltaWxhcmVzKSwgZXMgcG9zaWJsZSAqYWdydXBhciBsb3Mgw610ZW1zKiAgKG1lZGlhbnRlIGxhIHN1bWEgbyBlbCBwcm9tZWRpbyBkZSBsb3MgcHVudGFqZXMpIGNvbiBlbCBvYmpldGl2byBkZSBhcHJveGltYXIgbGEgbm9ybWFsaWRhZCB5IGFzw60gcG9kZXIgYXBsaWNhciBlbCBtw6l0b2RvIE1MLg0KDQoyLiBFc3RlIGVuZm9xdWUgZXMgdsOhbGlkbyDDum5pY2FtZW50ZSBiYWpvIGVsIHN1cHVlc3RvIGRlICp1bmlkaW1lbnNpb25hbGlkYWQqLCBlcyBkZWNpciwgcXVlIGxvcyBpbmRpY2Fkb3JlcyBhZ3J1cGFkb3MgbWlkYW4gdW4gw7puaWNvIGNvbnN0cnVjdG8gbGF0ZW50ZS4NCg0KMy4gUGFyYSBldmFsdWFyIGVzdGUgc3VwdWVzdG8sIHNlIHJlY29taWVuZGEgcmVhbGl6YXIgcHJldmlhbWVudGUgdW4gKkFuw6FsaXNpcyBGYWN0b3JpYWwgRXhwbG9yYXRvcmlvIChBRkUpKi4NCg0KNC4gTGEgYWdydXBhY2nDs24gZGUgaW5kaWNhZG9yZXMgcHVlZGUgcmVhbGl6YXJzZSBkZSBmb3JtYSAqYWxlYXRvcmlhKiBvLCBwcmVmZXJpYmxlbWVudGUsIGF0ZW5kaWVuZG8gYSAqY3JpdGVyaW9zIGRlIGNvbnRlbmlkbyBvIGFmaW5pZGFkIGNvbmNlcHR1YWwqLg0KDQo8IS0tICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUgLS0+DQo8IS0tIFNlcGFyYWRvciAtLT4NCg0KIyMjIE1ldG9kb2xvZ8OtYSBkZSBNdXRow6luICgxOTg0KSBwYXJhIHZhcmlhYmxlcyBjb250aW51YXMgeSBjYXRlZ8OzcmljYXMgKENWTSkNCg0KMS4gRW4gZXN0ZSBlbmZvcXVlLCBsYXMgdmFyaWFibGVzIG9ic2VydmFkYXMgcHVlZGVuIHNlciBkZSAqY3VhbHF1aWVyIHRpcG8qOiBkaWNvdMOzbWljYXMsIG9yZGluYWxlcyBvIGNvbnRpbnVhcy4NCg0KMi4gRWwgbcOpdG9kbyBzZSBiYXNhIGVuIGVsIHVzbyBkZSB1bmEgKm1hdHJpeiBkZSBjb3JyZWxhY2lvbmVzIHBvbGljw7NyaWNhcyogKG8gdGV0cmFjw7NyaWNhcywgc2Vnw7puIGNvcnJlc3BvbmRhKSwgc2VndWlkYSBkZSBsYSBlc3RpbWFjacOzbiBkZWwgbW9kZWxvIG1lZGlhbnRlICpNw61uaW1vcyBDdWFkcmFkb3MgUG9uZGVyYWRvcyAoV0xTKSogbyBlbCBtw6l0b2RvICpBc2ludMOzdGljYW1lbnRlIExpYnJlIGRlIERpc3RyaWJ1Y2nDs24gKEFERikqLg0KDQozLiBFc3RhIG1ldG9kb2xvZ8OtYSByZXF1aWVyZSB1biAqdGFtYcOxbyBtdWVzdHJhbCBjb25zaWRlcmFibGUqLCBkYWRvIGVsIGVsZXZhZG8gbsO6bWVybyBkZSBwYXLDoW1ldHJvcyBpbnZvbHVjcmFkb3MgZW4gbGEgbWF0cml6IGRlIHBvbmRlcmFjacOzbi4NCg0KNC4gQ3VhbmRvIHNlIHByZXNlbnRhbiBkaWZpY3VsdGFkZXMgYXNvY2lhZGFzIGEgbXVlc3RyYXMgcGVxdWXDsWFzIG8gcHJvYmxlbWFzIGRlIGNvbnZlcmdlbmNpYSwgZXMgcG9zaWJsZSBjb21wbGVtZW50YXIgZXN0ZSBlbmZvcXVlIGNvbiAqbcOpdG9kb3MgZGUgZXN0aW1hY2nDs24gcm9idXN0YSosIHF1ZSBtZWpvcmVuIGxhIGVzdGFiaWxpZGFkIGRlIGxvcyByZXN1bHRhZG9zLg0KDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQojIEV2YWx1YWNpw7NuIGRlbCBhanVzdGUNCg0KIyMjIE9ic2VydmFjaW9uZXMNCg0KMS4gU2UgZXhhbWluYSBsYSBzaWduaWZpY2FuY2lhIGRlIGxvcyBjb2VmaWNpZW50ZXMsIHNpbWlsYXIgYSB1biBtb2RlbG8gZGUgcmVncmVzacOzbiwgeSBzZSByZXZpc2FuIGxhcyBtZWRpZGFzIGRlIGJvbmRhZCBkZSBhanVzdGUuIA0KDQoyLiBOaW5ndW5hIG1lZGlkYSBwb3Igc8OtIHNvbGEgcHJvcG9yY2lvbmEgdG9kYSBsYSBpbmZvcm1hY2nDs24gbmVjZXNhcmlhIHBhcmEgZXZhbHVhciBlbCBtb2RlbG8sIHBvciBsbyBxdWUgZ2VuZXJhbG1lbnRlIHNlIHV0aWxpemEgdW4gY29uanVudG8gZGUgbWVkaWRhcyBxdWUgc2UgaW5mb3JtYSBzaW11bHTDoW5lYW1lbnRlLg0KDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQojIyMgVGlwb3MgZGUgbWVkaWRhcyBkZSBhanVzdGUNCg0KTGFzIG1lZGlkYXMgZGUgYm9uZGFkIGRlIGFqdXN0ZSBlbiBsb3MgbW9kZWxvcyBkZSBlY3VhY2lvbmVzIGVzdHJ1Y3R1cmFsZXMgc2UgYWdydXBhbiwgZGUgbWFuZXJhIGdlbmVyYWwsIGVuIHRyZXMgY2F0ZWdvcsOtYXMgcHJpbmNpcGFsZXMsIGNhZGEgdW5hIGRlIGxhcyBjdWFsZXMgZXZhbMO6YSB1biBhc3BlY3RvIGRpc3RpbnRvIGRlbCBkZXNlbXBlw7FvIGRlbCBtb2RlbG86DQoNCjEuICoqTWVkaWRhcyBhYnNvbHV0YXMuKiogIEV2YWzDumFuIGRpcmVjdGFtZW50ZSBlbCBncmFkbyBkZSBkaXNjcmVwYW5jaWEgZW50cmUgbGEgbWF0cml6IGRlIHZhcmlhbnphcyB5IGNvdmFyaWFuemFzIG9ic2VydmFkYSB5IGxhIHJlcHJvZHVjaWRhIHBvciBlbCBtb2RlbG8sIGVzIGRlY2lyLCBhbmFsaXphbiBlbCB0YW1hw7FvIGRlIGxvcyByZXNpZHVvcyBzaW4gcmVhbGl6YXIgY29tcGFyYWNpb25lcyBjb24gb3Ryb3MgbW9kZWxvcy4NCg0KMi4gKipNZWRpZGFzIGRlIGFqdXN0ZSBjb21wYXJhdGl2byBvIGluY3JlbWVudGFsLioqICAgIENvbXBhcmFuIGVsIGFqdXN0ZSBkZWwgbW9kZWxvIHByb3B1ZXN0byBjb24gZWwgZGUgdW4gbW9kZWxvIGRlIHJlZmVyZW5jaWEgbcOhcyByZXN0cmljdGl2byAodXN1YWxtZW50ZSBlbCBtb2RlbG8gbnVsbyBvIGluZGVwZW5kaWVudGUpLCBwZXJtaXRpZW5kbyB2YWxvcmFyIGxhIG1lam9yYSByZWxhdGl2YSBkZWwgbW9kZWxvIGVzcGVjaWZpY2Fkby4NCg0KMy4gKipNZWRpZGFzIGRlIHBhcnNpbW9uaWEuKiogICAgRXZhbMO6YW4gZWwgYWp1c3RlIGRlbCBtb2RlbG8gdGVuaWVuZG8gZW4gY3VlbnRhIHN1IGNvbXBsZWppZGFkLCBwZW5hbGl6YW5kbyBsYSBpbmNsdXNpw7NuIGV4Y2VzaXZhIGRlIHBhcsOhbWV0cm9zIHkgZmF2b3JlY2llbmRvIG1vZGVsb3MgbcOhcyBzaW1wbGVzIHF1ZSBleHBsaXF1ZW4gYWRlY3VhZGFtZW50ZSBsb3MgZGF0b3MuDQoNCg0KYGBge3IgZXZhbD1GQUxTRSwgaW5jbHVkZT1GQUxTRX0NClxiZWdpbnt0YWJsZX1baHRdDQpcY2VudGVyaW5nDQpcYmVnaW57dGFidWxhcn17fGx8Y3xjfH0NClxobGluZQ0KXHRleHRiZntGaXQgTWVhc3VyZX0gJiBcdGV4dGJme0dvb2QgRml0fSAmIFx0ZXh0YmZ7QWNjZXB0YWJsZSBGaXR9IFxcDQpcaGxpbmUNCiRcY2hpXjIkICYgJDAgXGxlcSBcY2hpXjIgXGxlcSAyZGYkICYgJDJkZiBcbGVxIFxjaGleMiBcbGVxIDNkZiQgXFwNClxobGluZQ0KJHAkIHZhbHVlICYgJC4wNSA8IHAgXGxlcSAxLjAwJCAmICQuMDEgXGxlcSBwIFxsZXEgLjA1JCBcXA0KXGhsaW5lDQokXGNoaV4yL2RmJCAmICQwIFxsZXEgXGNoaV4yL2RmIFxsZXEgMiQgJiAkMiA8IFxjaGleMi9kZiBcbGVxIDMkIFxcDQpcaGxpbmUNClJNU0VBICYgJDAgXGxlcSBcdGV4dHtSTVNFQX0gXGxlcSAuMDUkICYgJC4wNSA8IFx0ZXh0e1JNU0VBfSBcbGVxIC4wOCQgXFwNClxobGluZQ0KJHAkIHZhbHVlIGZvciB0ZXN0IG9mIGNsb3NlIGZpdCAoUk1TRUEgJDwgLjA1JCkgJiAkLjEwIDwgcCBcbGVxIDEuMDAkICYgJC4wNSBcbGVxIHAgXGxlcSAuMTAkIFxcDQpcaGxpbmUNCkNvbmZpZGVuY2UgaW50ZXJ2YWwgKENJKSAmIGNsb3NlIHRvIFJNU0VBLCBsZWZ0IGJvdW5kYXJ5IG9mIENJID0gLjAwICYgY2xvc2UgdG8gUk1TRUEgXFwNClxobGluZQ0KU1JNUiAmICQwIFxsZXEgXHRleHR7U1JNUn0gXGxlcSAuMDUkICYgJDAgXGxlcSBcdGV4dHtTUk1SfSBcbGVxIC4xMCQgXFwNClxobGluZQ0KTkZJICYgJC45NSBcbGVxIFx0ZXh0e05GSX0gXGxlcSAxLjAwJCAmICQuOTAgXGxlcSBcdGV4dHtORkl9IDwgLjk1JCBcXA0KXGhsaW5lDQpOTkZJICYgJC45NyBcbGVxIFx0ZXh0e05ORkl9IFxsZXEgMS4wMCQgJiAkLjk1IFxsZXEgXHRleHR7Tk5GSX0gPCAuOTckIFxcDQpcaGxpbmUNClxobGluZQ0KVExJICYgJC45NyBcbGVxIFx0ZXh0e0NGSX0gXGxlcSAxLjAwJCAmICQuOTUgXGxlcSBcdGV4dHtDRkl9IDwgLjk3JCBcXA0KQ0ZJICYgJC45NyBcbGVxIFx0ZXh0e0NGSX0gXGxlcSAxLjAwJCAmICQuOTUgXGxlcSBcdGV4dHtDRkl9IDwgLjk3JCBcXA0KXGhsaW5lDQpHRkkgJiAkLjk1IFxsZXEgXHRleHR7R0ZJfSBcbGVxIDEuMDAkICYgJC45MCBcbGVxIFx0ZXh0e0dGSX0gPCAuOTUkIFxcDQpcaGxpbmUNCkFHRkkgJiAkLjkwIFxsZXEgXHRleHR7QUdGSX0gXGxlcSAxLjAwLCBcdGV4dHtjbG9zZSB0byBHRkl9JCAmICQuODUgXGxlcSBcdGV4dHtBR0ZJfSA8IC45MCwgXHRleHR7Y2xvc2UgdG8gR0ZJfSQgXFwNClxobGluZQ0KQUlDICYgXG11bHRpY29sdW1uezJ9e2N8fXtzbWFsbGVyIHRoYW4gQUlDIGZvciBjb21wYXJpc29uIG1vZGVsfSBcXA0KXGhsaW5lDQpDQUlDICYgXG11bHRpY29sdW1uezJ9e2N8fXtzbWFsbGVyIHRoYW4gQ0FJQyBmb3IgY29tcGFyaXNvbiBtb2RlbH0gXFwNClxobGluZQ0KRUNWSSAmIFxtdWx0aWNvbHVtbnsyfXtjfH17c21hbGxlciB0aGFuIEVDVkkgZm9yIGNvbXBhcmlzb24gbW9kZWx9IFxcDQpcaGxpbmUNClxlbmR7dGFidWxhcn0NClxjYXB0aW9ue0dvb2RuZXNzIG9mIEZpdCBJbmRpY2VzfQ0KXGVuZHt0YWJsZX0NCg0KYGBgDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQojIyMgSW5kaWNlcyBkZSBhanVzdGUNCg0KMS4gTGEgZmlndXJhIFxAcmVmKGZpZzpSZWxhY2lvbjE5KSByZXN1bWUgbG9zIHByaW5jaXBhbGVzIHRpcG9zIGRlIG1lZGlkYXMgZGUgYWp1c3RlIGVtcGxlYWRhcyBlbiBTRU0uDQoNCjxjZW50ZXI+DQpgYGB7ciBSZWxhY2lvbjE5LCBlY2hvPUZBTFNFLCBmaWcuY2FwID0gIioqVGlwb3MgZGUgbWVkaWRhcyBkZSBhanVzdGUqKiIsIG91dC53aWR0aCA9ICI4MCUifQ0KIyBmaWcud2lkdGggPSAyMCAjIE5vIGZ1bmNpb25hIGVzdGEgb3BjaW9uIGVuIGVsIGNodW5rDQoNCiNodHRwOi8vemV2cm9zcy5jb20vYmxvZy8yMDE3LzA2LzE5L3RpcHMtYW5kLXRyaWNrcy1mb3Itd29ya2luZy13aXRoLWltYWdlcy1hbmQtZmlndXJlcy1pbi1yLW1hcmtkb3duLWRvY3VtZW50cy8NCiMgUGFnaW5hIDM1OSBkZSBSMjAxNS1GcmllbmRseQ0KDQprbml0cjo6aW5jbHVkZV9ncmFwaGljcygiUmVsYWNpb24xOS5wbmciKQ0KDQojT3RyYSBtYW5lcmEsIHBlcm8gIHNhbGUgZWwgY2FwdGlvbjoNCiM8Y2VudGVyPg0KIyFbKCNmaWc6RmlnLWNhcHRpb24pIE1pIGZpZ3VyYV0oTm9tYnJlLnBuZyl7d2lkdGg9NDAwcHh9DQojPC9jZW50ZXI+DQpgYGANCjwvY2VudGVyPg0KDQoNCjIuIEVsIGVzdGFkw61zdGljbyAkXGNoaV4yJCBldmFsw7phIGxhIGRpc2NyZXBhbmNpYSBnbG9iYWwgZW50cmUgbGEgbWF0cml6IG9ic2VydmFkYSB5IGxhIG1hdHJpeiByZXByb2R1Y2lkYSBwb3IgZWwgbW9kZWxvLiBJZGVhbG1lbnRlLCBlc3RlIGVzdGFkw61zdGljbyBkZWJlcsOtYSByZXN1bHRhciBubyBzaWduaWZpY2F0aXZvLg0KDQozLiBVbiB2YWxvciBzaWduaWZpY2F0aXZvIGRlICRcY2hpXjIkIGluZGljYSBxdWUgZWwgbW9kZWxvIHRlw7NyaWNvIHByb3B1ZXN0byBkaWZpZXJlIGRlIG1hbmVyYSBzaWduaWZpY2F0aXZhIGRlIGxhIGVzdHJ1Y3R1cmEgZGUgY292YXJpYW56YXMgb2JzZXJ2YWRhIGVuIGxvcyBkYXRvcy4NCg0KNC4gRW4gZXN0ZSBjb250ZXh0bywgbGEgaGlww7N0ZXNpcyBudWxhIGVzdGFibGVjZSBxdWUgbG9zIHJlc2lkdW9zIGRlbCBtb2RlbG8gc29uIG51bG9zLCBlcyBkZWNpciwgcXVlIGVsIG1vZGVsbyByZXByb2R1Y2UgZXhhY3RhbWVudGUgbGEgbWF0cml6IGRlIHZhcmlhbnphcyB5IGNvdmFyaWFuemFzIHBvYmxhY2lvbmFsLg0KDQo8IS0tICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUgLS0+DQo8IS0tIFNlcGFyYWRvciAtLT4NCg0KIyBSZS1lc3BlY2lmaWNhY2nDs24gZGVsIG1vZGVsbw0KDQojIyMgRGVzY3JpcGNpw7NuDQoNCjEuIEN1YW5kbyBlbCBhanVzdGUgZGVsIG1vZGVsbyBubyBlcyBzYXRpc2ZhY3RvcmlvLCBwdWVkZSBzZXIgbmVjZXNhcmlvIHByb2NlZGVyIGEgc3UgcmUtZXNwZWNpZmljYWNpw7NuLCBzaWVtcHJlIGd1aWFkYSBwb3IgY3JpdGVyaW9zIHRlw7NyaWNvcyB5IHN1c3RhbnRpdm9zLg0KDQoyLiBQYXJhIGVsbG8sIHNlIGV4YW1pbmFuIGxvcyDDrW5kaWNlcyBkZSBtb2RpZmljYWNpw7NuLCBxdWUgY29ycmVzcG9uZGVuIGEgcGFyw6FtZXRyb3MgaW5pY2lhbG1lbnRlIGZpamFkb3MgZW4gY2VybyAoZWZlY3RvcyBubyBpbmNsdWlkb3MgZW4gZWwgbW9kZWxvKS4NCg0KMy4gQ2FkYSDDrW5kaWNlIGRlIG1vZGlmaWNhY2nDs24gaW5kaWNhIGxhIHJlZHVjY2nDs24gZXNwZXJhZGEgZW4gZWwgZXN0YWTDrXN0aWNvICRcY2hpXjIkIHNpIGVsIHBhcsOhbWV0cm8gY29ycmVzcG9uZGllbnRlIGZ1ZXJhIGxpYmVyYWRvIHkgZXN0aW1hZG8uDQoNCjQuIFVuIHZhbG9yIHN1cGVyaW9yIGEgMy44NCAodmFsb3IgY3LDrXRpY28gZGUgdW5hICRcY2hpXjIkIGNvbiAxIGdyYWRvIGRlIGxpYmVydGFkIHkgJFxhbHBoYSA9IDAuMDUkKSBzdWdpZXJlIHF1ZSBsYSBpbmNsdXNpw7NuIGRlIGRpY2hvIHBhcsOhbWV0cm8gcHJvZHVjaXLDrWEgdW5hIG1lam9yYSBlc3RhZMOtc3RpY2FtZW50ZSBzaWduaWZpY2F0aXZhIGVuIGVsIGFqdXN0ZSBkZWwgbW9kZWxvLg0KDQo1LiBFbiBjb25zZWN1ZW5jaWEsIHVuIMOtbmRpY2UgZGUgbW9kaWZpY2FjacOzbiBlbGV2YWRvIHNlw7FhbGEgcXVlIGxhIGluY29ycG9yYWNpw7NuIGRlbCBlZmVjdG8gYWRpY2lvbmFsIHBvZHLDrWEgbWVqb3JhciBkZSBmb3JtYSBzdXN0YW50aXZhIGVsIGFqdXN0ZSBkZWwgbW9kZWxvIGEgbG9zIGRhdG9zLCBzaWVtcHJlIHF1ZSBleGlzdGEgdW5hIGp1c3RpZmljYWNpw7NuIHRlw7NyaWNhIHBhcmEgZWxsby4NCg0KDQo8IS0tICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUgLS0+DQo8IS0tIFNlcGFyYWRvciAtLT4NCg0KIyMjIE5vdGEgcGVkYWfDs2dpY2E6IHNvYnJlIGxhIHJlLWVzcGVjaWZpY2FjacOzbiBkZSBtb2RlbG9zIA0KDQpBdW5xdWUgbG9zIMOtbmRpY2VzIGRlIG1vZGlmaWNhY2nDs24gY29uc3RpdHV5ZW4gdW5hIGhlcnJhbWllbnRhIMO6dGlsIHBhcmEgZGlhZ25vc3RpY2FyIGZ1ZW50ZXMgZGUgbWFsIGFqdXN0ZSwgKm5vIGRlYmVuIHV0aWxpemFyc2UgY29tbyB1biBtZWNhbmlzbW8gYXV0b23DoXRpY28gZGUgY29ycmVjY2nDs24gZGVsIG1vZGVsbyouIEVuIHBhcnRpY3VsYXIsIGVzIGltcG9ydGFudGUgcXVlIGVsIGVzdHVkaWFudGUgdGVuZ2EgZW4gY3VlbnRhIGxvIHNpZ3VpZW50ZToNCg0KMS4gTG9zIMOtbmRpY2VzIGRlIG1vZGlmaWNhY2nDs24gc2UgY2FsY3VsYW4gKmNvbmRpY2lvbmFsbWVudGUgYWwgbW9kZWxvIGVzdGltYWRvIHkgYSBsYSBtdWVzdHJhIGFuYWxpemFkYSouIFBvciB0YW50bywgcmVmbGVqYW4gcG9zaWJsZXMgbWVqb3JhcyAqZXNwZWPDrWZpY2FzIGRlIGxvcyBkYXRvcyogeSBubyBuZWNlc2FyaWFtZW50ZSByZWxhY2lvbmVzIGVzdHJ1Y3R1cmFsZXMgcmVhbGVzIGVuIGxhIHBvYmxhY2nDs24uDQoNCjIuIFJlLWVzcGVjaWZpY2FyIHVuIG1vZGVsbyBiYXPDoW5kb3NlIMO6bmljYW1lbnRlIGVuIGNyaXRlcmlvcyBlc3RhZMOtc3RpY29zIHB1ZWRlIGNvbmR1Y2lyIGEgKnNvYnJlYWp1c3RlIChvdmVyZml0dGluZykqLCBlcyBkZWNpciwgYSB1biBtb2RlbG8gcXVlIHJlcHJvZHVjZSBtdXkgYmllbiBsb3MgZGF0b3Mgb2JzZXJ2YWRvcywgcGVybyBxdWUgdGllbmUgKmVzY2FzYSBjYXBhY2lkYWQgZGUgZ2VuZXJhbGl6YWNpw7NuKi4NCg0KMy4gTGEgaW5jbHVzacOzbiBpbmRpc2NyaW1pbmFkYSBkZSBwYXLDoW1ldHJvcyBhZGljaW9uYWxlcyBzdWVsZSBhdW1lbnRhciBhcnRpZmljaWFsbWVudGUgZWwgYWp1c3RlLCBwZXJvICpkZWJpbGl0YSBsYSBpbnRlcnByZXRhYmlsaWRhZCB5IGxhIHBhcnNpbW9uaWEgZGVsIG1vZGVsbyosIGRvcyBwcmluY2lwaW9zIGNlbnRyYWxlcyBlbiBTRU0uDQoNCjQuIFRvZG8gcGFyw6FtZXRybyBsaWJlcmFkbyBkZWJlIGNvbnRhciBjb24gdW5hICpqdXN0aWZpY2FjacOzbiB0ZcOzcmljYSwgc3VzdGFudGl2YSBvIG1ldG9kb2zDs2dpY2EgY2xhcmEqIChwb3IgZWplbXBsbywgc2ltaWxpdHVkIGRlIGNvbnRlbmlkbyBlbnRyZSDDrXRlbXMsIGVmZWN0b3MgZGUgbcOpdG9kbyBvIGZ1bmRhbWVudG9zIGNvbmNlcHR1YWxlcyBwcmV2aW9zKS4NCg0KNS4gRW4gbGEgcHLDoWN0aWNhIHJlY29tZW5kYWRhLCBsb3Mgw61uZGljZXMgZGUgbW9kaWZpY2FjacOzbiBkZWJlbiB1dGlsaXphcnNlIGNvbW8gKmhlcnJhbWllbnRhcyBleHBsb3JhdG9yaWFzKiwgbm8gY29tbyByZWdsYXMgZGUgZGVjaXNpw7NuIGF1dG9tw6F0aWNhcy4NCg0KRW4gY29uc2VjdWVuY2lhLCBsYSByZS1lc3BlY2lmaWNhY2nDs24gZGUgdW4gbW9kZWxvIFNFTSBkZWJlIGVudGVuZGVyc2UgY29tbyB1biAqcHJvY2VzbyBpdGVyYXRpdm8gZ3VpYWRvIHBvciBsYSB0ZW9yw61hKiwgZW4gZWwgcXVlIGxhIGV2aWRlbmNpYSBlbXDDrXJpY2EgY29tcGxlbWVudGEgKHBlcm8gbm8gc3VzdGl0dXllKSBhbCByYXpvbmFtaWVudG8gY29uY2VwdHVhbC4NCg0KDQoNCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBDYXDDrXR1bG8gRWplcmNpY2lvcyAtLT4NCg0KIyBFamVyY2ljaW9zDQoNCg0KTG9zIHNpZ3VpZW50ZXMgZWplcmNpY2lvcyB0aWVuZW4gY29tbyBvYmpldGl2byByZWZvcnphciBsYSBjb21wcmVuc2nDs24gY29uY2VwdHVhbCBkZSBsb3MgbW9kZWxvcyBkZSBlY3VhY2lvbmVzIGVzdHJ1Y3R1cmFsZXMgYW50ZXMgZGUgaW50cm9kdWNpciBmb3JtYWxtZW50ZSBsYSBub3RhY2nDs24gbWF0cmljaWFsIHkgbG9zIGRlc2Fycm9sbG9zIGFsZ2VicmFpY29zLiBFbiB0b2RvcyBsb3MgY2Fzb3MsIGVsIMOpbmZhc2lzIGRlYmUgcG9uZXJzZSBlbiBsYSAqKmludGVycHJldGFjacOzbioqLCBubyBlbiBsYSBvcHRpbWl6YWNpw7NuIGF1dG9tw6F0aWNhIGRlbCBhanVzdGUuDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQojIyMgRWplcmNpY2lvIDEuIElkZW50aWZpY2FjacOzbiBkZSB0aXBvcyBkZSB2YXJpYWJsZXMNCg0KQ29uc2lkZXJlIGVsIHNpZ3VpZW50ZSBlc2NlbmFyaW86DQoNCi0gVW4gaW52ZXN0aWdhZG9yIGRlc2VhIGVzdHVkaWFyIGVsIGVmZWN0byBkZSBsYSAqbW90aXZhY2nDs24gYWNhZMOpbWljYSogc29icmUgZWwgKnJlbmRpbWllbnRvIGVzdHVkaWFudGlsKiwgY29uc2lkZXJhbmRvIGFkZW3DoXMgZWwgcm9sIGRlIGxhICphdXRvZWZpY2FjaWEqIGNvbW8gdmFyaWFibGUgaW50ZXJtZWRpYS4gIA0KIA0KLSBMYSBtb3RpdmFjacOzbiBzZSBtaWRlIG1lZGlhbnRlIGN1YXRybyDDrXRlbXMgdGlwbyBMaWtlcnQsIGxhIGF1dG9lZmljYWNpYSBtZWRpYW50ZSB0cmVzIMOtdGVtcyB5IGVsIHJlbmRpbWllbnRvIG1lZGlhbnRlIGVsIHByb21lZGlvIGRlIGNhbGlmaWNhY2lvbmVzLiBFbCBlc3R1ZGlvIHNlIHJlYWxpemEgY29tcGFyYW5kbyBlc3R1ZGlhbnRlcyBkZSBjb2xlZ2lvcyBww7pibGljb3MgeSBwcml2YWRvcy4NCg0KRGVzYXJyb2xsZSBsb3Mgc2lndWllbnRlcyBpbmNpc29zOiANCg0KYS4gSWRlbnRpZmlxdWUgdG9kYXMgbGFzICp2YXJpYWJsZXMgbWFuaWZpZXN0YXMqIGRlbCBlc3R1ZGlvLg0KDQpiLiBJZGVudGlmaXF1ZSBsYXMgKnZhcmlhYmxlcyBsYXRlbnRlcyouDQoNCmMuIFNlw7FhbGUgY3XDoWxlcyB2YXJpYWJsZXMgc29uICpleMOzZ2VuYXMqLCAqZW5kw7NnZW5hcyogeSAqbWVkaWFkb3JhcyoqLg0KDQpkLiBJbmRpcXVlIGV4cGzDrWNpdGFtZW50ZSBsb3MgKnTDqXJtaW5vcyBkZSBlcnJvciogYXNvY2lhZG9zLg0KDQplLiBJZGVudGlmaXF1ZSBsYSAqdmFyaWFibGUgZGUgYWdydXBhY2nDs24qIHkgZXhwbGlxdWUgc3UgZnVuY2nDs24gZW4gdW4gYW7DoWxpc2lzIFNFTSBtdWx0aWdydXBvLg0KDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQojIyMgRWplcmNpY2lvIDIuIExlY3R1cmEgY29uY2VwdHVhbCBkZSB1biBkaWFncmFtYSBTRU0NCg0KQ29uc2lkZXJlIHVuIGRpYWdyYW1hIFNFTSBjb25jZXB0dWFsIHF1ZSBjb250aWVuZToNCg0KLSBEb3MgZmFjdG9yZXMgbGF0ZW50ZXMgXChGXzFcKSB5IFwoRl8yXCkuDQoNCi0gVHJlcyBpbmRpY2Fkb3JlcyBwYXJhIFwoRl8xXCkgeSBkb3MgcGFyYSBcKEZfMlwpDQoNCi0gVW5hIHJlbGFjacOzbiBlc3RydWN0dXJhbCBcKEZfMiBcbGVmdGFycm93IEZfMVwpLg0KDQotIFTDqXJtaW5vcyBkZSBlcnJvciBwYXJhIHRvZG9zIGxvcyBpbmRpY2Fkb3Jlcy4NCg0KRGVzYXJyb2xsZSBsb3Mgc2lndWllbnRlcyBpbmNpc29zOiANCg0KYS4gRXhwbGlxdWUgcG9yIHF1w6kgXChGXzFcKSBzZSBjbGFzaWZpY2EgY29tbyB2YXJpYWJsZSAqZXjDs2dlbmEqLg0KDQpiLiBKdXN0aWZpcXVlIHBvciBxdcOpIFwoRl8yXCkgZXMgdW5hIHZhcmlhYmxlICplbmTDs2dlbmEqLg0KDQpjLiBJbmRpcXVlIGVuIHF1w6kgc2VudGlkbyBcKEZfMlwpIHB1ZWRlIGNvbnNpZGVyYXJzZSB1bmEgKnZhcmlhYmxlIG1lZGlhZG9yYSouDQoNCmQuIEV4cGxpcXVlIHBvciBxdcOpIGxvcyB0w6lybWlub3MgZGUgZXJyb3Igbm8gZGViZW4gaW50ZXJwcmV0YXJzZSBjb21vIOKAnHJ1aWRvIGlycmVsZXZhbnRl4oCdLg0KDQoNCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCiMjIyBFamVyY2ljaW8gMy4gRXNjYWxhIGRlIGxhIHZhcmlhYmxlIGxhdGVudGUNCg0KQ29uc2lkZXJlIHVuIGZhY3RvciBsYXRlbnRlIFwoXGV0YVwpIG1lZGlkbyBwb3IgdHJlcyBpbmRpY2Fkb3JlcyBcKHhfMSwgeF8yLCB4XzNcKS4NCg0KDQphLiBFeHBsaXF1ZSBjb25jZXB0dWFsbWVudGUgcXXDqSBzaWduaWZpY2EgcXVlIGVsIG1vZGVsbyAqbm8gZXN0w6kgaWRlbnRpZmljYWRvKiBzaSBubyBzZSBmaWphIGxhIGVzY2FsYSBkZSBcKFxldGFcKS4NCg0KYi4gRGVzY3JpYmEgY8OzbW8gc2UgZGVmaW5lIGxhIGVzY2FsYSBkZSBcKFxldGFcKSBiYWpvIGNhZGEgdW5vIGRlIGxvcyBzaWd1aWVudGVzIG3DqXRvZG9zOg0KDQogICAtIFZhcmlhYmxlIGxhdGVudGUgZXN0YW5kYXJpemFkYS4NCiAgIA0KICAgLSBWYXJpYWJsZSBtYXJjYWRvci4NCiAgIA0KICAgLSBDb2RpZmljYWNpw7NuIGRlIGVmZWN0b3MuDQogICANCmMuIERpc2N1dGEgdW5hIHZlbnRhamEgeSB1bmEgZGVzdmVudGFqYSBjb25jZXB0dWFsIGRlIGNhZGEgbcOpdG9kby4NCg0KDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQojIyMgRWplcmNpY2lvIDQuIEludGVycHJldGFjacOzbiBkZSBjYXJnYXMgZmFjdG9yaWFsZXMNCg0KU3Vwb25nYSBxdWUgZW4gdW4gbW9kZWxvIGNvbiAqdmFyaWFibGUgbWFyY2Fkb3IqIHNlIGZpamEgXChcbGFtYmRhXzEgPSAxXCkgcGFyYSBlbCBpbmRpY2Fkb3IgXCh4XzFcKSwgeSBzZSBlc3RpbWEgXChcbGFtYmRhXzIgPSAwLjc1XCkgcGFyYSBcKHhfMlwpLiAgDQoNCmEuIEludGVycHJldGUgXChcbGFtYmRhXzIgPSAwLjc1XCkgZW4gdMOpcm1pbm9zIGRlIHVuaWRhZGVzIGRlIGNhbWJpby4NCg0KYi4gRXhwbGlxdWUgcG9yIHF1w6kgZXN0YSBpbnRlcnByZXRhY2nDs24gZGVwZW5kZSBkZWwgaW5kaWNhZG9yIG1hcmNhZG9yIGVsZWdpZG8uDQoNCmMuIERpc2N1dGEgcXXDqSBjYW1iaWFyw61hIChjb25jZXB0dWFsbWVudGUpIHNpIGVsIG1vZGVsbyBzZSBlc3RpbWFyYSB1c2FuZG8gKmNvZGlmaWNhY2nDs24gZGUgZWZlY3RvcyouDQoNCg0KDQo8IS0tICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUgLS0+DQo8IS0tIFNlcGFyYWRvciAtLT4NCg0KIyMjIEVqZXJjaWNpbyA1LiBNw6l0b2RvcyBkZSBlc3RpbWFjacOzbg0KDQpQYXJhIGNhZGEgdW5vIGRlIGxvcyBzaWd1aWVudGVzIGVzY2VuYXJpb3MsIGluZGlxdWUgKnF1w6kgbcOpdG9kbyBkZSBlc3RpbWFjacOzbiBzZXLDrWEgbcOhcyBhcHJvcGlhZG8qIHkganVzdGlmaXF1ZSBzdSByZXNwdWVzdGE6DQoNCmEuIEluZGljYWRvcmVzIGNvbnRpbnVvcyBhcHJveGltYWRhbWVudGUgbm9ybWFsZXMsIHRhbWHDsW8gbXVlc3RyYWwgbW9kZXJhZG8uDQoNCmIuIEluZGljYWRvcmVzIG9yZGluYWxlcyB0aXBvIExpa2VydCBjb24gY2luY28gY2F0ZWdvcsOtYXMgeSBtdWVzdHJhIGdyYW5kZS4NCg0KYy4gSW5kaWNhZG9yZXMgZGljb3TDs21pY29zIGNvbiBmdWVydGUgYXNpbWV0csOtYSB5IGN1cnRvc2lzIGVsZXZhZGEuDQoNCmQuIE1vZGVsbyBwcmVsaW1pbmFyIHVzYWRvIMO6bmljYW1lbnRlIHBhcmEgb2J0ZW5lciB2YWxvcmVzIGluaWNpYWxlcy4NCg0KDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQojIyMgRWplcmNpY2lvIDYuIEV2YWx1YWNpw7NuIGRlbCBhanVzdGUgZGVsIG1vZGVsbw0KDQpTdXBvbmdhIHF1ZSB1biBtb2RlbG8gU0VNIGFycm9qYSBsb3Mgc2lndWllbnRlcyByZXN1bHRhZG9zOg0KDQotIFwoXGNoaV4yXCkgc2lnbmlmaWNhdGl2by4NCg0KLSBSTVNFQSA9IDAuMDQ1Lg0KDQotIENGSSA9IDAuOTcuDQoNCi0gU1JNUiA9IDAuMDQuDQoNCkRlc2Fycm9sbGUgbG9zIHNpZ3VpZW50ZXMgaW5jaXNvczogDQoNCmEuIEV2YWzDumUgZWwgYWp1c3RlIGdsb2JhbCBkZWwgbW9kZWxvIGNvbnNpZGVyYW5kbyBkaXN0aW50b3MgdGlwb3MgZGUgw61uZGljZXMuDQoNCmIuIEV4cGxpcXVlIHBvciBxdcOpIHVuIFwoXGNoaV4yXCkgc2lnbmlmaWNhdGl2byBubyBpbXBsaWNhIG5lY2VzYXJpYW1lbnRlIHVuIG1hbCBtb2RlbG8uDQoNCmMuIERpc2N1dGEgZWwgcGFwZWwgZGVsIHRhbWHDsW8gbXVlc3RyYWwgZW4gbGEgaW50ZXJwcmV0YWNpw7NuIGRlbCBhanVzdGUuDQoNCg0KDQo8IS0tICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUgLS0+DQo8IS0tIFNlcGFyYWRvciAtLT4NCg0KIyMjIEVqZXJjaWNpbyA3LiBSZS1lc3BlY2lmaWNhY2nDs24gcmVzcG9uc2FibGUgZGVsIG1vZGVsbw0KDQpVbiBtb2RlbG8gU0VNIHByZXNlbnRhIHVuIGFqdXN0ZSBpbnNhdGlzZmFjdG9yaW8geSB2YXJpb3Mgw61uZGljZXMgZGUgbW9kaWZpY2FjacOzbiBzdXBlcmlvcmVzIGEgMTAuIA0KDQphLiBFeHBsaXF1ZSBwb3IgcXXDqSAqbm8gZXMgYXByb3BpYWRvKiBsaWJlcmFyIGF1dG9tw6F0aWNhbWVudGUgdG9kb3MgbG9zIHBhcsOhbWV0cm9zIHN1Z2VyaWRvcy4NCg0KYi4gSW5kaXF1ZSBhbCBtZW5vcyB0cmVzIGNyaXRlcmlvcyAqbm8gZXN0YWTDrXN0aWNvcyogcXVlIGRlYmVyw61hbiBndWlhciB1bmEgcmUtZXNwZWNpZmljYWNpw7NuLg0KDQpjLiBEaXNjdXRhIGPDs21vIGxhIHJlLWVzcGVjaWZpY2FjacOzbiBwdWVkZSBhZmVjdGFyIGxhIHJlcGxpY2FiaWxpZGFkIGRlbCBtb2RlbG8uDQoNCg0KDQo8IS0tICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUgLS0+DQo8IS0tIFNlcGFyYWRvciAtLT4NCg0KIyMjIEVqZXJjaWNpbyA4LiBJbnRlZ3JhZG9yIA0KDQpDb25zdHJ1eWEgdW4gKmRpYWdyYW1hIFNFTSBjb25jZXB0dWFsKiBxdWUgaW5jbHV5YSBleHBsw61jaXRhbWVudGUgbG9zIHNpZXRlIHRpcG9zIGRlIHZhcmlhYmxlcyBkaXNjdXRpZG9zIGVuIGVsIGNhcMOtdHVsbzoNCg0KLSBNYW5pZmllc3Rhcy4gIA0KDQotIExhdGVudGVzLg0KDQotIEVycm9yZXMuIA0KDQotIEV4w7NnZW5hcy4gIA0KDQotIEVuZMOzZ2VuYXMuICANCg0KLSBNZWRpYWRvcmFzLg0KDQotIFZhcmlhYmxlIGRlIGFncnVwYWNpw7NuLiAgDQoNCkV4cGxpcXVlIGJyZXZlbWVudGUgZWwgcm9sIGRlIGNhZGEgZWxlbWVudG8gZW4gZWwgZGlhZ3JhbWEuDQoNCg0KDQo8IS0tICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KDQo8IS0tIENhcMOtdHVsbyBCaWJsaW9ncmFmw61hLS0+DQoNCg0KIyBCaWJsaW9ncmFmw61hIHsudW5saXN0ZWQgLnVubnVtYmVyZWR9DQogIA0KQ29uc3VsdGFyIGVsIGRvY3VtZW50byBbUlB1YnMgOjogQW7DoWxpc2lzIG11bHRpdmFyaWFkbyAoYmlibGlvZ3JhZsOtYSldKGh0dHBzOi8vcnB1YnMuY29tL2hsbGluYXMvUl9NdWx0aXZhcmlhZG9fQmlibGlvZ3JhZmlhKS4NCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCg0KJm5ic3A7DQoNCg0KJm5ic3A7DQo8Y2VudGVyPg0Kfn5+DQpJZiB5b3UgZm91bmQgYW55IEVSUk9SUyBvciBoYXZlIFNVR0dFU1RJT05TLCBwbGVhc2UgcmVwb3J0IHRoZW0gdG8gbXkgZW1haWwuIFRoYW5rcy4gIA0Kfn5+DQo8L2NlbnRlcj4NCg0KDQo=