1.1Introducción
Los modelos ocultos de Markov (HMM) son modelos en los cuales se tiene la atribución de que el sistema que se está trabajando es un proceso de Markov, cuyos parametros no se conocen. Esto permite que el proceso se vuelva de proposito general y sirva para series de tiempo: univariadas y multivariadas.
Para ilustrar al lector sobre las aplicaciones que tienen las HMM, se usará un archivo llamado “EarthQuakeDataCH1.csv”; este archivo contiene informacion de terremotos de magnitud mayor a 7 desde 1900 al 2007.
Para ello se procede a leer el CSV con la librería “readr”:
library(readr)
library(htmltools)
data_terremotos <- data.frame(read_csv('EarthQuakeDataCH1.csv'))
Parsed with column specification:
cols(
Anio = col_integer(),
cantidadTerremotos = col_integer()
)
#graficacion de datos
plot(x = data_terremotos[,1],y = data_terremotos[,2], type = "b", col = "#33d6ff", lwd = 4, xlab = "Años", ylab = "Magnitud")

Figura 1.1
Para darnos una idea sobre que distrubucion puede seguir la data, utilizamos un histograma que se muestra a continuación:
#se utiliza la columna 2 debido a que alli se encuentran las magnitudes
magnitudes <- data_terremotos[,2]
#creacion del histograma
h <- hist(magnitudes, breaks = 10, density = 10,
col = "#0099cc", xlab = "Accuracy", main = "Terremotos - Distribucion")
#definicion de limites X y Y
xfit <- seq(min(magnitudes), max(magnitudes), length = 40)
yfit <- dnorm(xfit, mean = mean(magnitudes), sd = sd(magnitudes))
yfit <- yfit * diff(h$mids[1:2]) * length(magnitudes)
lines(xfit, yfit, col = "#ff4775", lwd = 2)

Tal como se puede observar la dispersión corresponde a un podelo de Poisson. Las cadenas ocultas de Markov(HMM) se han usado desde hace mas de tres decadas, el mayor campo de operación ha sido el analisis de señales, tales como:
- Reconocimiento: voz, facial, gestos, firmas.
- Ambiente: terremotos, direccion del viento, lluvia.
- Finanzas
- Biofisica: modelacion de canales de iones.
Una de las grandes caracteristicas del HMM es que es simple se realizar y debido a su trasfondo matematico tambien es adecuado para tener una respuesta computacional rapida.
1.2 Modelos de mezcla independientes
1.2.1 Definicion y propiedades
Considere nuevamente la serie de cuentas de terremotos ilustrada en la Figura 1.1. Un modelo estándar para cuentas ilimitadas es la distribución de Poisson, con su función de probabilidad \[p(x)=e^{-λ}*λ^x/x!\] y la propiedad que indica que la varianza equivale a la media. Sin embargo, para la serie de terremotos, la muestra de varianza, \(s^2≈52\), es mucho mas grande que la muestra de la media, \[\bar{x} ≈19\], lo cual indica una fuerte sobre dispersión relativa a la distribución de Poisson. La falta de semejanza es confirmada por la Figura 1.2, la cual ilustra la distribución de Poisson ajustada y un diagrama de barras de las frecuencias relativas de las cuentas. Un método para resolver observaciones sobre dispersas con una distribución binodo o (más generalmente) distribución multimodo es usar un modelo de mezcla. Los modelos de mezcla son diseñados para acomodar heterogeneidad inobservada en la población; eso es, la población puede consistir de grupos inobservados, cada uno teniendo una distribución distinta para la variable observada. Considérese el ejemplo, la distribución del número, X, de paquetes de cigarrillos comprados por los consumidores de un supermercado. Los consumidores pueden ser divididos en grupos, por ejemplo, no fumadores, fumadores ocasionales, y fumadores regulares. Ahora aun si el numero de paquetes comprado por los consumidores entre cada grupo fuera distribuible por Poisson, la distribución X no seria Poisson; seria sobre dispersa relativa a Poisson, y talvez aun multimodo. Análogamente, supóngase que cada cuenta en la serie de terremotos es generada por una de dos distribuciones de Poisson, con medias \(λ_1\) y \(λ_2\), donde la elección de media es determinada por otros mecanismos aleatorios que llamaremos el proceso de parámetro. Supóngase también que \(λ_1\) es seleccionado con probabilidad \(δ_1\) y \(λ_2\) con probabilidad \(δ_2=1-δ_1\). Veremos mas adelante en este capitulo que la varianza de la distribución resultante excede la media por \(δ_1 δ_2 (λ_1-λ_2 )^2\). Si el proceso de parámetro es una serie de variables aleatorias independientes, las cuentas también son independientes, de ahí el término “mezcla independiente”. En general, una distribución de mezcla independiente consiste de un numero finito, dígase \(m\), de distribuciones de componente y una “distribución de mezcla” la cual selecciona de estas componentes. Las distribuciones de componente pueden ser tanto discretas como continuas. En el caso de dos componentes, la mezcla de distribución depende de dos probabilidades o funciones de densidad:
\[
Componente \qquad \qquad\qquad\qquad\qquad1 \qquad\qquad 2 \\
Probabilidad o función de densidad \qquad p_1(x) \qquad p_2(x)
\]
Para especificar la componente, una necesita una variable aleatoria discreta C la cual realiza la mezcla:
\[
C=
\begin{cases}
1 \quad con \quad probabilidad \quad\delta_1\\
2 \quad con \quad probabilidad \quad\delta_2 = 1-\delta_1
\end{cases}
\]
La estructura de ese proceso para el caso de dos distribuciones de componentes continuas es ilustrada en la Figura 1.3. En ese ejemplo uno puede pensar de C como el resultado de lanzar una moneda con probabilidad 0.75 de “cara”: si el resultado es “cara”, entonces C = 1 y una observación es tomada de p_1: si es “cruz”, entonces C = 2 y una observación es tomada de \(p_2\). Suponemos que no sabemos el valor de C, eso es, cual de \(p_1\) o \(p_2\) estaba activo cuando la observación fue generada.
La extensión de m componentes es sencilla. Que \(δ_1,…,δ_m\) denote las probabilidades asignadas a las diferentes componentes, y que \(p_1,…,p_m\) denote sus probabilidades o funciones de densidad. Que X denote la variable aleatoria la cual tiene la distribución de mezcla. En el caso discreto, la función de probabilidad de X es dada por:
\[
p(x) = \sum_{i=1}^{m} Pr(X=x|C=i)Pr(C=i)\\
=\sum_{i=1}^{m}\delta_ip_i(x)
\] El caso continuo es análogo. La expectativa de la mezcla puede ser dada en términos de las expectaciones de las distribuciones de componentes. Dejando que Y, denote la variable aleatoria con función de probabilidad \(p_i\), tenemos:
\[
E(X) = \sum_{i=1}^{m} Pr(C=i) E(X|C=i) = \sum_{i=1}^{m} \delta_iE(Y_i)
\]
El mismo resultado aguarda para una mezcla de distribuciones continuas. Mas generalmente, para una mezcla del k-esimo momento del origen es simplemente una combinación lineal de los k-esimos momentos de sus componentes \(Y_i\):
\[
E(X^k) = \sum_{i=1}^{m} \delta_iE(Y_i^k), k=1,2,...
\]
Nótese que el resultado análogo no cuenta para momentos centrales. En particular, la varianza X no es una combinación linear de las varianzas de sus componentes \(Yi\). El Ejercicio 1 le pide al lector probar eso, en el caso de dos componentes, la varianza de la mezcla está dada por:
\[
Var(X) = \delta_1Var(Y_1)+\delta_2Var(Y_2)+\delta_1\delta_2(E(Y_1)-E(Y_2))^2
\]
1.2.2 Estimación de parámetros
La estimación de parámetros de una distribución de mezclas es a menudo realizada por una probabilidad máxima (ML). La probabilidad de un modelo de mezcla con m componentes esta dada, para tanto casos discretos como continuos, por:
\[
L(\theta_1,...,\theta_m,\delta_1,...,\delta_m|x_1,...,x_n) = \prod_{j=1}^{n}\sum_{i=1}^{m}\delta_ip_i(x_j,\theta_i)
\]
Aquí \(θ_1,…,θ_m\) son los vectores de parametros de las distribuciones de componentes, \(δ_1,…,δ_m\) son los parametros de mezcla, totalizando 1, y \(x_1,…,x_n\) son las n observaciones. Entonces, en el caso de distribuciones de componentes cada una especificada por un parámetro, \(2m-1\) parametros independientes tienen que ser estimados. Excepto talvez en casos especiales, maximización analítica de tal probabilidad no es posible, pero es generalmente sencillo de evaluarlo rápidamente; ver Ejercicio 3. Maximización numérica será ilustrada aquí al considerar el caso de una mezcla de distribuciones de Poisson. Supongase que m=2 y las dos componentes son distribuibles por Poisson con medias \(λ_1\) y \(λ_2\). Que \(δ_1\) y \(δ_2\) sean los parámetros de mezcla (con \(δ_1 + δ_2 = 1\). La distribución de mezcla p esta dada por:
\[
p(x) = \delta_1 \frac{\lambda_1^xe^{-\lambda_1}}{x!}+\delta_2 \frac{\lambda_2^xe^{-\lambda_2}}{x!}
\] Desde que \(δ_2=1-δ_1\), hay solamente tres parámetros a estimar: \(λ_1\), \(λ_2\) y \(δ_1\). La probabilidad es:
\[
L(\lambda_1,\lambda_2,\delta_1|x_1,...,x_n) = \prod_{i=1}^n(\delta_1\frac{\lambda_1^{x_i}e^{-\lambda_1}}{x_i!}+(1-\delta_1)\frac{\lambda_2^{x_i}e^{-\lambda_2}}{x_i!})
\] La maximización analítica de L con respecto a \(λ_1\), \(λ_2\) y \(δ_1\) seria rara, ya que L es el producto de n factores, del cual cada uno es una suma. Primero tomar el logaritmo y luego la diferenciación no simplifica mucho las cosas tampoco. Por lo tanto, la estimación de parámetros es mas convenientemente llevada a cabo por maximización numérica directa de la probabilidad (o su logaritmo), aunque el logaritmo EM es comúnmente usado como alternativa; véase, por ejemplo, McLachlan y Peel (2000) o Fruhwirth-Schnatter (2006). Un paquete útil de R para estimación en modelos de mezcla es \(flexmix\) (Leisch, 2004). Sin embargo, es sencillo escribir nuestro propio código de R para evaluar, y luego maximizar, probabilidades de mezcla en casos sencillos. Esta probabilidad puede ser luego maximizada al usar (por ejemplo) la función de R nlm. Sin embargo, los parámetros \(\delta\) y \(\lambda\) son sujetos por (ecuación rara) y (para \(i = 1, …, m\)) \(δ_i > 0\) y \(λ_i>0\). Es entonces necesario Re parametrizar si uno así lo desea para utilizar un optimizador sin restricciones tal como nlm. Una posibilidad para maximizar la probabilidad con respecto a los 2m-1 “parámetros funcionales” sin restricción.
\[
\eta_i = log\lambda_i (i=1,...m)
\] y
\[
\tau_i = log(\frac{\delta_i}{1-\sum_{j=2}^m \delta_j}) (i=2,...,m)
\]
Se recuperan los “parámetros naturales” originales por medio de:
\[
\lambda_i = e^{\eta_i} \quad (i=1,...,m) \\
\delta_i = \frac{e^{\tau_i}}{1+\sum_{j=2}^me^{\eta_j}} \quad (i=2,...,m)
\]
Y \(δ_1=1-\sum_{j=2}^{m}δ_i\) . El siguiente código implementa las ideas anteriores en orden para que encajen un modelo de cuatro distribuciones de Poisson a las cuentas de terremotos. Los resultados están dados por m = 1,2,3,4 en la Tabla 1.2
mllk <- function(wpar,x){ zzz <- w2n(wpar)
-sum(log(outer(x,zzz$lambda,dpois)%*%zzz$delta)) }
n2w <- function(lambda,delta)log(c(lambda,delta[-1]/(1-sum(delta[-1]))))
w2n <- function(wpar){m <- (length(wpar)+1)/2
lambda <- exp(wpar[1:m])
delta <- exp(c(0,wpar[(m+1):(2*m-1)]))
return(list(lambda=lambda,delta=delta/sum(delta))) }
x <- read.table("/Users/bracruz/Documents/8vo. Trimestre IO/Sist. Expertos y Redes Prob./earthquakes.txt")[,2]# Set your own path.
wpar <- n2w(c(10,20,25,30),c(1,1,1,1)/4)
w2n(nlm(mllk,wpar,x)$estimate)
NA/Inf replaced by maximum positive value
$lambda
[1] 15.52750 10.58416 20.96911 32.07922
$delta
[1] 0.35429030 0.09302729 0.43662984 0.11605257
Notese como, en este código, el uso de la función outer hace posible el evaluar la probabilidad de mezcla de Poisson en una simple y compacta expresión en vez de en un ciclo. Pero si la distribución siendo mezclada fueran distribuciones con mas de un parámetro (dígase, normal), un enfoque un poco distinto seria necesario.
Los resultados anteriores pueden ser verificados en la siguiente tabla:
1.2.3 Probabilidad ilimitada en mezclas
Hay un aspecto en mezclas de distribuciones continuas que difieren del caso discreto y vale la pena resaltarlo. Es el siguiente: puede pasar que: en la vecinidad de ciertas combinaciones de parámetros, la probabilidad es ilimitada. Por ejemplo, en el caso de una mezcla de distribuciones normales, la probabilidad se vuelve arbitrariamente grande si uno asigna la media componente igual a una de las observaciones y permite que la varianza correspondiente tienda a cero. El problema ha sido ampliamente discutido en la literatura de modelos de mezcla, y hay aquellos que sugieren que si la probabilidad es entonces ilimitada, la ML estima simplemente que “no existe”.
La fuente del problema, sin embargo, es solamente el uso de densidades en vez de probabilidades en la posibilidad; no surgiría si se remplazara cada valor de densidad en una posibilidad por la probabilidad del intervalo correspondiente al valor registrado. (Por ejemplo, una observación registrada como “12.4” esta asociada con el intervalo [12.35, 12.45]). En el contexto de mezclas independientes se remplaza la expresión:
\[
\prod_{j=1}^n\sum_{i=1}^m\delta_i p_i(x_j,\theta_i)
\]
de la posibilidad (véase ecuación anterior) por la posibilidad dicreta:
\[
L = \prod_{j=1}^n\sum_{i=1}^m\delta_i \int_{a_j}^{b_j} p_i(x,\theta_i)dx
\]
Donde el intervalo \((a_j, b_j)\) consiste de aquellos valores los cuales, si son observados, serian registrados como \(x_j\). Esto simplemente equivale a reconocer explícitamente la naturaleza del intervalo de todas las supuestas observaciones continuas. Mas generalmente, la posibilidad discreta de observaciones en un conjunto de variables aleatorias \(X_1, X_2,…, X_n\) es la probabilidad de la forma \(Pr(a_i < X_i < b_i \quad para\quad toda \quad i)\). Utilizaremos el termino posibilidad continua para la densidad conjunta evaluada en la observación. Otra manera de evitar este problema es el imponer un limite inferior en las varianzas y buscar el mejor sujeto máximo local para ese límite. Puede suceder, sin embargo, que se puede ser tan afortunado para evitar los “picos” de posibilidad al buscar por un máximo local; en este aspecto, valores buenos de inicio pueden ayudar. El fenómeno de posibilidades ilimitadas no surge para observaciones de valores discretos porque la posibilidad en ese caso es una probabilidad y por ende, limitada a valores entre 0 y 1.
1.2.4. Ejemplos de modelos de mezcla ajustados
Mezcla de distribuciones de Poisson
Si uno utiliza nlm para ajustar una mezcla de m distribuciones de Poisson (m=1,2,3,4) a los datos del terremoto, uno obtiene los resultados desplegados en la Tabla 1.2. Notese que hay una clara mejora en la posibilidad resultante de la adicion de una segunda componente, y muy poca mejora de la adicion de una cuarta – aparentemente insuficiente para justificar los dos parámetros adicionales. La Figura 1.4 presenta un histograma de las cuentas observadas y los cuatro modelos ajustados. Es claro que las mezclas encajan las observaciones mucho mejor a como lo hace una sola distribución de Poisson, y visualmente los modelos de tres y cuatro estados parecen adecuados. El mejor ajuste para las mezclas es también evidente de las varianzas de los cuatro modelos como esta presentada en la Tabla 1.2. Al computar las medias y varianzas de los modelos hemos usado \(E(X)=\sum_iδ_i λ_i\) y \(Var(X)=E(X^2 )-(E(X))^2\), con \(E(X^2 )=\sum_iδ_i (λ_i+λ_i^2)\). Para comparación también hemos usado el paquete de R flexmix para ajustar los cuatro modelos. Los resultados correspondieron mucho a excepción de laso del modelo de cuatro componentes, donde el valor de posibilidad mas grande que encontramos por flexmix fue 356.7759 y las medias de los componentes difirieron un poco. Notese también, que la discusión superior ignora la posibilidad de dependencia serial en los datos del terremoto, un punto el cual se retomara en el Capítulo 2.
1.3 Cadenas de Markov
Ahora introduciremos las cadenas de Markov. Nuestro análisis se restringe a aquellos aspectos de cadenas de Markov discretas los cuales necesitaremos. Asi, sin embargo haremos referencia a propiedades tales como la irreductibilidad y aperiodicidad, no lidiaremos con cuestiones técnicas. 1.3.1 Definiciones y ejemplos Una secuencia de variables aleatorias discretas \({C_t:t ∈ N} \)se dice que es una (tiempo discreto) Cadena de Markov (CM) si, para todo t ∈N, satisface la propiedad de Markov:
\[
Pr(C_{t+1} | C_t,...,C_1) = Pr((C_{t+1}|C_t)
\] Eso es, condicionando a la historia del proceso hasta el tiempo t es equivalente a condicionar solo el valor mas reciente \(C_t\). Para hacerlo más compacto, definimos \(C^t\) como la historia \((C_1,C_2,…,C_t )\), en cual caso, la propiedad de Markov se puede escribir como:
\[
Pr(C_{t+1} | C^{(t)} = Pr(C_{t+1} | C_t)
\] La propiedad de Markov puede ser interpretada como la primera relajación de la suposicion de independencia. Las variables aleatorias \({C_t}\) son dependientes de una manera que es matemáticamente conveniente, como es mostrado en el siguiente grafico en el cual el pasado y el futuro son dependientes solo a través del presente.
Cantidades importantes asociadas con una cadena de Markov son las probabilidades conditionales, también llamadas probabilidades de transición:
\[
Pr(C_{s+t}=j | C_s = i)
\] Si estas probabilidades no dependen de s, la cadena de Markov es llamada homogénea, de otra manera seria no-homogenea. A no ser que haya una indicación explicita al contrario, asumiremos que la cadena de Markov en discusión es homogénea, en cual caso las probabilidades de transición serán denotadas por:
\[
\gamma_{ij}(t)= Pr(C_{s+t}|C_s=i)
\] Notese que la notación \(γ_{ij} (t)\) no involucra a s. La matriz \(Γ(t)\) esta definida como la matriz con elementos \(γ_{ij} (t)\).
Una importante propiedad de todas las cadenas de Markov homogéneas y de estado y espacio finito es la que satisface las ecuaciones Chapman-Kolmogorov:
\[
\Gamma(t+u) = \Gamma(t) \Gamma(u)
\] La solución requiere solamente la definición de probabilidad condicional y la aplicación de la propiedad de Markov. Las ecuaciónes Chapman-Kolmogorov implican que, para todo \(t ∈N\):
\[\Gamma(t)=\Gamma(1)^t\] Esto es, la matriz de probabilidades de transición con paso-t es la t-esima potencia de \(Γ(1)\), la matriz de probabilidades de transición de un paso. La matriz \(Γ(1)\), la cual será abreviada como \(Γ\), es una matriz cuadrada de probabilidades con la suma de sus filas igual a 1:
\[
\quad
\] Donde m denota el numero de estados de la cadena de Markov. La declaración de que la suma de las filas es igual a 1 puede ser escrito como \(Γ1'=1'\); eso es, el vector columna \(1’\) es un eigenvector derecho de \(Γ\) y corresponde al eigenvalor 1. Nos referiremos a \(Γ\) como la matriz de transición de probabilidad (t.p.m). Muchos autores utilizan en vez del termino “matriz de transición”; evitaremos este termino debido a posibles confusiones con cuentas de matriz de transición, o intensidades de una matriz de transición.
Las probabilidades incondicionales \(Pra(C_t=j)\) de una cadena de Markov siendo en un estado dado en un tiempo dado t son a menudo de interés. Denotamos estos por el vector fila:
\[u(t) = (Pr(C_t=1),...,Pr(C_t=m)), t∈N\]
Nos referimos a u(1) como la distribución inicial de una cadena de Markov Para deducir la distribución en el tiempo t+1 desde el cual en t post multiplicamos por la matriz de transición de probabilidad \(Γ\):
\[u(t+1)=u(t)\Gamma \] Ejemplo. Imaginese que la declaración de días soleados y lluviosos es tal que el clima del dia depende solamente en el del dia anterior, y las probabilidades de transición están dadas por la siguiente tabla:
\[
\quad
\]
Esto es, si hoy fue un dia lluvioso, la probabilidad que mañana sea lluvioso es de 0.9; si hoy estuvo soleado, la probabilidad de es 0.6. El clima es entonces una cadena de Markov homogénea de dos estados, con t.p.m. \(Γ\) dado por
\[
\Gamma =
0.9 \quad 0.1\\
\qquad0.6 \quad 0.4
\]
Ahora suponga que hoy (tiempo 1) es un dia soleado. Esto significa que la distribución del clima del dia de hoy es:
\[u(1) = (Pr(C_1 = 1),Pr(C_1 = 2)) = (0,1)\]
La distribución del clima de mañana, del pasado mañana, y asi, puede ser calculada post multiplicando repetidamente \(u(1)\) por
\(Γ\), el t.p.m:
\[
u(2) = (Pr(C_2 = 1),Pr(C_2 = 2)) = u(1)\Gamma = (0.6,0.4)\\
u(3) = (Pr(C_3 = 1),Pr(C_3 = 2)) = u(2)\Gamma = (0.78,0.22)
\]
1.3.2. Distribuciones estacionarias
Una cadena de Markov con matriz de transición de probabilidad Γ se dice que tiene una distribución estacionaria δ (un vector fila con elementos no negativos) si δΓ=δ y δ1’ = 1. El primero de estos requerimientos expresa la estacionariedad, la segunda es el requerimiento que δ es una distribución de probabilidad. Por ejemplo, la cadena de Markov con t.p.m dado por
\[
\Gamma = 1/3 | \quad 1/3| \quad 1/3\\
\quad 2/3| \quad 0| \quad 1/3 \\
\quad 1/2| \quad 1/2| \quad 0
\] Tiene una distribución estacionaria \(δ=1/32 (15,9,8)\).
Desde que \(u(t+1) = u(t)Γ\), una cadena de Markov iniciada desde su distribución estacionaria continuara teniendo esa distribución en todos lo puntos de tiempo subsecuente, y nos referiremos a tal proceso como una cadena de Markov estacionaria. Es talvez valioso resaltar que esto asume mas que solamente homogeneidad. Solo la homogeneidad no seria suficiente para volver la cadena de Markov un proceso estacionario, y preferimos reservar el adjetivo “estacionario” para cadenas de Markov estacionarias que tienen la propiedad adicional que la distribución inicial \(u(1)\) es la distribución estacionaria y por ende procesos estacionarios.
Una cadena de Markov irreducible (homogénea, tiempo discreto, estado-espacio finito) tiene una distribución estacionaria, única y estrictamente positiva. Nótese sin embargo la suposición de irreductibilidad es necesaria para esta conclusión, la aperiodicidad no. Si, sin embargo, uno añade la suposición de aperiodicidad, una única distribución limitante existe, y es precisamente la distribución estacionaria. Desde que siempre debemos asumir aperiodicidad e irreductibilidad, los términos “distribución limitante” y “distribución estacionaria” son sinónimos para nuestros propósitos.
Un resultado general que puede ser convenientemente usado para computar una distribución estacionaria. El vector \(δ\) con elementos no negativos es una distribución estacionaria de la cadena de Markov con t.p.m Γ si y solo si:
\[\delta(I_m - \Gamma + U) = 1\]
Donde 1 es un vector fila de unos, \(I_m\) es la matriz identidad m x m, y U es la matriz m x m de unos. Alternativamente, una distribución estacionaria puede ser encontrada al borrar una de las ecuaciones en el sistema \(δΓ=δ\) y reemplazándola por \(\sum_iδ_i=1\).
1.3.3 Función de autocorrelación
Tendremos una oportunidad, por ejemplo en la Seccion 2.2.3 y en el Ejercicio 4(f) en el Capitulo 2, para comparar las funciones de autocorrelación (ACF) de uno modelo oculto de Markov con su cadena de Markov subyacente \({C_t}\), en los estados \(1, 2, …, m\). Asumiremos que estos estados son cuantitativos y no solamente categóricos. La ACF de \({C_t}\), asumida estacionaria e irreducible, puede ser obtenida de la siguiente manera. Primero, definiendo \(v = (1, 2, …, m)\) y \(V = diag(1, 2, …, m)\), tenemos, para todos los enteros k no negativos, \[
Cov(C_t,C_{t+k}) = \delta V\Gamma^kv' - (\delta v')^2
\] Segundo, si Γ es diagonizable, y sus eigenvalores (otro de 1) son denotados por w_2, w_3, …, w_m, entonces Γ puede ser escrito como:
\[\Gamma = U \Omega U^{-1} \] Donde \(Ω\) es \(diag(1, w_2, w_3, …, w_m)\) y las columnas de U son eigenvectores derechos correspondientes de \(Γ\). Entonces tenemos, para enteros no negativos k,
\[
Cov(C_t,C_{t+k}) = \delta V U \Omega^k U^{-1} v' - (\delta v')^2 \\
= a\Omega^k b' - a_1b_1 \\
=\sum_{i=2}^m a_ib_iw_i^k
\] donde a = \(\delta VU\) y b’ = \(U^{-1}\). Por lo tanto \(Var(C_t )=\sum_{i=2}^m a_i b_i\) y, para enteros no negativos k:
\[
\rho(k) = Corr(C_t,C_{t+k}) = \sum_{i=2}^m a_ib_iw_i^k / \sum_{i=2}^m a_ib_i
\]
Esto es un peso promedio de las k-esimas potencias de los eigenvalores \(w_2, w_3, …, w_m\), y de alguna manera similares a la ACF de un proceso auto regresivo Gaussiano de orden m-1. Nótese que la ecuación anterior implica en el caso m=2 que \(ρ(k)=ρ(1)^k\) para todos los enteros no negativos k, y que \(ρ(1)\) es el eigenvalor distinto a 1 de \(Γ\).
1.3.4. Estimando probabilidades de transición
Si nos dan una realización de una cadena de Markov, y deseamos estimar las probabilidades de transición, un enfoque – pero no solo el único – es el encontrar las cuentas de transición y estimar las probabilidades de transición como frecuencias relativas. Por ejemplo, si la CM tiene tres estados y la secuencia observada es:
( 2332111112 3132332122 3232332222 3132332212 3232132232 3132332223 3232331232 3232331222 3232132123 3132332121 )
Entonces la matriz de cuentas de transición es:
\[
(f_{ij}) = 4 \quad 7 \quad 6 \\
\qquad\qquad8 \quad 10 \quad 24 \\
\qquad\qquad 6 \quad 24 \quad 10
\]
Donde \(f_ij\) denota el numero de transiciones observadas del estado i al estado j. Desde que el numero de transiciones del estado 2 al estado 3 es 24, y el numero total de transiciones del estado 2 es 8+10+24, un estimado de frecuencia relativa de \(γ_23\) es 24/42. El t.p.m \(Γ\) es entonces estimado por:
\[
(f_{ij}) = 4/17 \quad 7/17 \quad 6/17 \\
\qquad\qquad8/42 \quad 10/42 \quad 24/42 \\
\qquad\qquad 6/40 \quad 24/40 \quad 10/40
\]
Ahora mostraremos que esto es de hecho el estimado condicional ML de \(Γ\), condicionada en la primera observación. Supongamos entonces que deseamos estimar los \(m^2-m\) parámetros \(γ_{ij} (i≠j)\) de una cadena e Markov de estado m \({C_t}\) de una realización c_1, c_2, …, c_T. La posibilidad condicionada en la primera observación es:
\[
L = \prod_{i=1}^m\prod_{j=1}^m \gamma_{ij}^{f_{ij}}
\] El registro de probabilidad es entonces:
\[
l = \sum_{i=1}^m(\sum_{j=1}^m f_{ij} log \gamma_{ij}) = \sum_{i=1}^m l_i()
\]
Y podemos maximizar l al maximizar cada \(l_i\) por separado. Sustituyendo \(1-\sum_{(k≠i)}γ_{ik}\) para \(γ_ii\) diferenciando \(l_i\) con respecto a una posibilidad de transición fuera de la diagonal \(γ_ij\) e igualando la derivada a cero rendimientos
\[
0 = \frac{-f_{ii}}{1-\sum_{k≠i}\gamma_{ik} +\frac{f_{ij}}{\gamma_{ij}} = -\frac{f_{ii}}{\gamma_{ii}}+\frac{f_{ij}}{\gamma_{ij}}}
\]
Entonces, a menos que un denominador sea cero en la ecuación superior,( f_{ij} γ_{ii}=f_{ii} γ_{ij} )y entonces \(γ_{ii} \sum_{(j=1)}^mf_{ij}=f_{ii}\). Esto implica que, en un máximo de la posibilidad,
\[
\gamma_{ii} = f_{ii}/\sum_{j=1}^m f_{ij} \quad y \quad \gamma_{ij} = f_{ij}/\sum_{j=1}^m f_{ij}
\]
(Podríamos utilizar multiplicadores de Lagrange para expresar las restricciones \(\sum_{j=1}^mγ_{ij}=1\) sujeto al cual buscamos maximizar los términos \(l_i\) y por ende la posibilidad; es solo la probabilidad de transición empírica – es entonces visto a ser un estimador condicional ML de \(γ_ij\). El estimador \(Γ\) satisface el requerimiento que la suma de las filas es igual a 1.
La suposicion de estacionariedad de la cadena de Markov no fue usada en la derivación superior. Si deseamos asumir la estacionariedad, podemos usar la posibilidad incondicional. Esta es la posibilidad condicional mostrada anteriormente, multiplicada por la probabilidad estacionaria δ_c1. La posibilidad incondicional o su logaritmo pueden ser entonces maximizados numéricamente, sujeto a restricciones no negativas y suma de filas, en orden para estimar las probabilidades de transición \(γ_{ij}\). Bisgaard y Travis (1991) muestran en el caso de una cadena de Markov de dos estados que, excepto en algunos casos extremos, ecuaciones de posibilidad incondicional tienen una única solución. Para algunos casos especiales no triviales de la cadena de dos estados, también derivan expresiones explicitas para los estimados incondicionales de posibilidad máxima (MLEs) de las probabilidades de transición. Desde que usamos tal resultado luego, lo declaramos aquí. Suponga que la cadena de Markov \({C_t}\) toma los valores 0 y 1, y que deseamos estimar las probabilidades de transición \(γ_{ij}\) de una secuencia de observaciones en el cual hay \(f_{ij}\)transiciones del estado i al estado j (i,j=0,1), y \(f_{11}>0\) pero \(f_{00}=0\). Asi que en las observaciones un cero siempre es seguido por un uno. Definase \(c=f_{10}+(1-c_1)\) y \(d=f_{11}\). Entonces las MLEs incondicionales de las probabilidades de transición están dadas por:
\[
\gamma_{01} = 1 \quad y \quad \gamma_{10} = \frac{-(1+d)+((1+d))^2 + 4c(c+d-1))^{1/2}}{2(c+d+1)}
\]
1.3.5. Cadenas de Markov de orden superior
En casos donde observaciones en un proceso con espacio y estado finito aparecen no satisfacer la propiedad de Markov, una posibilidad que sugiere a si misma es el utilizar una cadena de Markov de orden superior, esto es, un modelo \({C_t}\) satisfaciendo la siguiente generalización de la propiedad de Markov para algunos l≥2:
\[
Pr(C_t | C_{t-1} = j_1,...,C_{t-l}=j_l) = \sum_{i=1}^l \lambda_i q(j_i,j_o)
\] Un registro de tal orden de cadenas de Markov puede ser encontrado, por ejemplo, el Lloyd (1980, Sección 19.9). Aunque tal modelo no es en un sentido usual una cadena de Markov, podemos redefinir el modelo de tal manera como para producir un proceso equivalente. Si permitimos que \(Y_t=(C_{(t-l+1)},C_{(t-l+2)},…,C_t)\), entonces {Y_t} es una cadena de Markov de primer orden en M^l, donde M es el espacio de estado de {C_t}. Aunque algunas propiedades pueden ser raras de establecer, ninguna nueva teoría es involucrada en analizar una cadena de Markov de orden superior mas que una de primer orden. Una cadena de Markov de segundo orden, si es estacionaria, esta caracterizada por las probabilidades de transición:
\[
\gamma(i,j,k) = Pr(C_t=k | C_{t-1} = j, C_{t-2} = i)
\]
Y tiene una distribución estacionaria de variable doble \(u(j,k)=Pra(C_{t-1}=j,C_t=k)\) que satisface
\[
u(j,k) = \sum_{i=1}^m u(i,j)\gamma(i,j,k) \quad y \quad \sum_{j=1}^m\sum_{k=1}^m u(j,k) =1
\]
Por ejemplo, la cadena de Markov estacionaria de segundo orden mas general \({C_t}\), en los dos estados 1 y 2, esta caracterizada por las siguientes cuatro probabilidades de transición:
\[
a = Pr(C_t=2 | C_{t-1}=1, C_{t-2} = 1) \\
b = Pr(C_t=1 | C_{t-1}=2, C_{t-2} = 2) \\
c = Pr(C_t=1 | C_{t-1}=2, C_{t-2} = 1) \\
d = Pr(C_t=2 | C_{t-1}=1, C_{t-2} = 2) \\
\] El proceso \({Y_t }={(C_{t-1},C_t )}\) es entonces una cadena de Markov de primer orden, con los cuatro estados (1,1), (1,2), (2,1), (2,2), con matriz de transición de probabilidades
\[
\left(\begin{array}{cc}
1-a & a & 0 & 0\\
0 & 0 & c & 1-c \\
1-d & d & 0 & 0 \\
0 & 0 & b & 1-b
\end{array}\right)
\]
Note los ceros estructurales que aparecen en la matriz. No es posible, por ejemplo, hacer una transición directa de (2,1) a (2,2); por lo tanto, el cero en la fila 3 y columna 4 en el t.p.m. Los parámetros a, b, c y d están limitados a 0 y 1 pero son sin restricciones en otro caso. La distribución estacionaria de \({Y_t}\) es proporcional al vector
\[(b(1-d),ab,ab,a(1-c))\]
Del cual se dice que la matriz \(u(j,k)\) de probabilidades bi-variable estacionaria para \({C_t }\) es:
\[
\frac{1}{b(1-d)+2ab+a(1-c)}
\left(\begin{array}{cc}
b(1-d) & ab\\
ab & a(1-c)
\end{array}\right)
\]
El uso de una cadena de Markov general de orden superior incrementa el número de parámetros del modelo; una cadena de Markov general de orden l en m estados tiene \(m^l (m-1)\) probabilidades de transicion independientes. Pegram (1980) y Raftery (1985) han por lo tanto propuesto ciertas clases de modelos para cadenas de orden superior. El modelo de Pegram tiene m+l-1 parametros, y aquellos de Raftery m(m-1)+l-1. Para m=2 los modelos son equivalentes, pero para m>2 aquellos de Raftery son mas generales y pueden representar un rango mas amplio de patrones de dependencia y estructuras de autocorrelación. En ambos casos un incremento de uno en el orden de la cadena de Markov requiere solamente de un parámetro adicional. Modelos de Raftery, a los cuales el se refiere como modelos de “distribución de transición de la mezcla” (MTD), son definidos como sigue. El proceso \({C_t}\) toma valores \(M={1,2,…,m}\) y satisface
\[Pr(C_t = j_0 | C_{t-1} = j_1,..., C_{t-l} = j_l) = \sum_{i-1}^l \lambda_i q(j_i,j_0)\] Donde \(\sum_{i=1}^l λ_i=1\), y \(Q=(q(j,k))\) es una matriz m×m con entradas no negativas y la suma de sus filas equivale a uno, tal que el lado derecho de la ecuación anterior esta limitada por cero y uno para todo \(j_o,j_1,…,j_l∈M\). Este último requerimiento, el cual general m^(l+1) pares de restricciones no lineares en los parámetros, asegura que las probabilidades condicionales en la ecuación anterior son en efecto probabilidades, y la condición en la suma de filas de Q asegura que la suma sobre \(j_0\) de estas probabilidades condicionales es uno. Note que Raftery no asume que los parámetros \(λ_i\), son no negativos.
LS0tCnRpdGxlOiAnUHJlbGltaW5hcmVzOiBtZXpjbGFzIHkgY2FkZW5hcyBkZSBNYXJrb3YnCmF1dGhvcjogJ0JyYXlhbiBJdmFuIENydXogQ29yb25hJwpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgojIzEuMUludHJvZHVjY2nDs24KCkxvcyBtb2RlbG9zIG9jdWx0b3MgZGUgTWFya292IChITU0pIHNvbiBtb2RlbG9zIGVuIGxvcyBjdWFsZXMgc2UgdGllbmUgbGEgYXRyaWJ1Y2nDs24gZGUgcXVlIGVsIHNpc3RlbWEgcXVlIHNlIGVzdMOhIHRyYWJhamFuZG8gZXMgdW4gcHJvY2VzbyBkZSBNYXJrb3YsIGN1eW9zIHBhcmFtZXRyb3Mgbm8gc2UgY29ub2Nlbi4gRXN0byBwZXJtaXRlIHF1ZSBlbCBwcm9jZXNvIHNlIHZ1ZWx2YSBkZSBwcm9wb3NpdG8gZ2VuZXJhbCB5IHNpcnZhIHBhcmEgc2VyaWVzIGRlIHRpZW1wbzogdW5pdmFyaWFkYXMgeSBtdWx0aXZhcmlhZGFzLiAKClBhcmEgaWx1c3RyYXIgYWwgbGVjdG9yIHNvYnJlIGxhcyBhcGxpY2FjaW9uZXMgcXVlIHRpZW5lbiBsYXMgSE1NLCBzZSB1c2Fyw6EgdW4gYXJjaGl2byBsbGFtYWRvICJFYXJ0aFF1YWtlRGF0YUNIMS5jc3YiOyBlc3RlIGFyY2hpdm8gY29udGllbmUgaW5mb3JtYWNpb24gZGUgdGVycmVtb3RvcyBkZSBtYWduaXR1ZCBtYXlvciBhIDcgZGVzZGUgMTkwMCBhbCAyMDA3LgoKUGFyYSBlbGxvIHNlIHByb2NlZGUgYSBsZWVyIGVsIENTViBjb24gbGEgbGlicmVyw61hICJyZWFkciI6CgpgYGB7cn0KbGlicmFyeShyZWFkcikKbGlicmFyeShodG1sdG9vbHMpCmRhdGFfdGVycmVtb3RvcyA8LSBkYXRhLmZyYW1lKHJlYWRfY3N2KCdFYXJ0aFF1YWtlRGF0YUNIMS5jc3YnKSkKCiNncmFmaWNhY2lvbiBkZSBkYXRvcwpwbG90KHggPSBkYXRhX3RlcnJlbW90b3NbLDFdLHkgPSBkYXRhX3RlcnJlbW90b3NbLDJdLCB0eXBlID0gImIiLCBjb2wgPSAiIzMzZDZmZiIsIGx3ZCA9IDQsIHhsYWIgPSAiQcOxb3MiLCB5bGFiID0gIk1hZ25pdHVkIikKYGBgCkZpZ3VyYSAxLjEKClBhcmEgZGFybm9zIHVuYSBpZGVhIHNvYnJlIHF1ZSBkaXN0cnVidWNpb24gcHVlZGUgc2VndWlyIGxhIGRhdGEsIHV0aWxpemFtb3MgdW4gaGlzdG9ncmFtYSBxdWUgc2UgbXVlc3RyYSBhIGNvbnRpbnVhY2nDs246CgpgYGB7cn0KI3NlIHV0aWxpemEgbGEgY29sdW1uYSAyIGRlYmlkbyBhIHF1ZSBhbGxpIHNlIGVuY3VlbnRyYW4gbGFzIG1hZ25pdHVkZXMKbWFnbml0dWRlcyA8LSBkYXRhX3RlcnJlbW90b3NbLDJdCgojY3JlYWNpb24gZGVsIGhpc3RvZ3JhbWEKaCA8LSBoaXN0KG1hZ25pdHVkZXMsIGJyZWFrcyA9IDEwLCBkZW5zaXR5ID0gMTAsCiAgICAgICAgICBjb2wgPSAiIzAwOTljYyIsIHhsYWIgPSAiQWNjdXJhY3kiLCBtYWluID0gIlRlcnJlbW90b3MgLSBEaXN0cmlidWNpb24iKSAKCiNkZWZpbmljaW9uIGRlIGxpbWl0ZXMgWCB5IFkKCnhmaXQgPC0gc2VxKG1pbihtYWduaXR1ZGVzKSwgbWF4KG1hZ25pdHVkZXMpLCBsZW5ndGggPSA0MCkgCnlmaXQgPC0gZG5vcm0oeGZpdCwgbWVhbiA9IG1lYW4obWFnbml0dWRlcyksIHNkID0gc2QobWFnbml0dWRlcykpIAp5Zml0IDwtIHlmaXQgKiBkaWZmKGgkbWlkc1sxOjJdKSAqIGxlbmd0aChtYWduaXR1ZGVzKSAKCmxpbmVzKHhmaXQsIHlmaXQsIGNvbCA9ICIjZmY0Nzc1IiwgbHdkID0gMikKYGBgCgoKVGFsIGNvbW8gc2UgcHVlZGUgb2JzZXJ2YXIgbGEgZGlzcGVyc2nDs24gY29ycmVzcG9uZGUgYSB1biBwb2RlbG8gZGUgUG9pc3Nvbi4gTGFzIGNhZGVuYXMgb2N1bHRhcyBkZSBNYXJrb3YoSE1NKSBzZSBoYW4gdXNhZG8gZGVzZGUgaGFjZSBtYXMgZGUgdHJlcyBkZWNhZGFzLCBlbCBtYXlvciBjYW1wbyBkZSBvcGVyYWNpw7NuIGhhIHNpZG8gZWwgYW5hbGlzaXMgZGUgc2XDsWFsZXMsIHRhbGVzIGNvbW86IAoKKiBSZWNvbm9jaW1pZW50bzogdm96LCBmYWNpYWwsIGdlc3RvcywgZmlybWFzLgoqIEFtYmllbnRlOiB0ZXJyZW1vdG9zLCBkaXJlY2Npb24gZGVsIHZpZW50bywgbGx1dmlhLgoqIEZpbmFuemFzCiogQmlvZmlzaWNhOiBtb2RlbGFjaW9uIGRlIGNhbmFsZXMgZGUgaW9uZXMuIAoKVW5hIGRlIGxhcyBncmFuZGVzIGNhcmFjdGVyaXN0aWNhcyBkZWwgSE1NIGVzIHF1ZSBlcyBzaW1wbGUgc2UgcmVhbGl6YXIgeSBkZWJpZG8gYSBzdSB0cmFzZm9uZG8gbWF0ZW1hdGljbyB0YW1iaWVuIGVzIGFkZWN1YWRvIHBhcmEgdGVuZXIgdW5hIHJlc3B1ZXN0YSBjb21wdXRhY2lvbmFsIHJhcGlkYS4gCgojIzEuMiBNb2RlbG9zIGRlIG1lemNsYSBpbmRlcGVuZGllbnRlcwoKCiMjIzEuMi4xIERlZmluaWNpb24geSBwcm9waWVkYWRlcwoKQ29uc2lkZXJlIG51ZXZhbWVudGUgbGEgc2VyaWUgZGUgY3VlbnRhcyBkZSB0ZXJyZW1vdG9zIGlsdXN0cmFkYSBlbiBsYSBGaWd1cmEgMS4xLiBVbiBtb2RlbG8gZXN0w6FuZGFyIHBhcmEgY3VlbnRhcyBpbGltaXRhZGFzIGVzIGxhIGRpc3RyaWJ1Y2nDs24gZGUgUG9pc3NvbiwgY29uIHN1IGZ1bmNpw7NuIGRlIHByb2JhYmlsaWRhZCAkJHAoeCk9ZV57Lc67fSrOu154L3ghJCQgICB5IGxhIHByb3BpZWRhZCBxdWUgaW5kaWNhIHF1ZSBsYSB2YXJpYW56YSBlcXVpdmFsZSBhIGxhIG1lZGlhLiBTaW4gZW1iYXJnbywgcGFyYSBsYSBzZXJpZSBkZSB0ZXJyZW1vdG9zLCBsYSBtdWVzdHJhIGRlIHZhcmlhbnphLCBcKHNeMuKJiDUyXCksIGVzIG11Y2hvIG1hcyBncmFuZGUgcXVlIGxhIG11ZXN0cmEgZGUgbGEgbWVkaWEsICQkXGJhcnt4fSDiiYgxOSQkLCBsbyBjdWFsIGluZGljYSB1bmEgZnVlcnRlIHNvYnJlIGRpc3BlcnNpw7NuIHJlbGF0aXZhIGEgbGEgZGlzdHJpYnVjacOzbiBkZSBQb2lzc29uLiBMYSBmYWx0YSBkZSBzZW1lamFuemEgZXMgY29uZmlybWFkYSBwb3IgbGEgRmlndXJhIDEuMiwgbGEgY3VhbCBpbHVzdHJhIGxhIGRpc3RyaWJ1Y2nDs24gZGUgUG9pc3NvbiBhanVzdGFkYSB5IHVuIGRpYWdyYW1hIGRlIGJhcnJhcyBkZSBsYXMgZnJlY3VlbmNpYXMgcmVsYXRpdmFzIGRlIGxhcyBjdWVudGFzLgpVbiBtw6l0b2RvIHBhcmEgcmVzb2x2ZXIgb2JzZXJ2YWNpb25lcyBzb2JyZSBkaXNwZXJzYXMgY29uIHVuYSBkaXN0cmlidWNpw7NuIGJpbm9kbyBvIChtw6FzIGdlbmVyYWxtZW50ZSkgZGlzdHJpYnVjacOzbiBtdWx0aW1vZG8gZXMgdXNhciB1biBtb2RlbG8gZGUgbWV6Y2xhLiBMb3MgbW9kZWxvcyBkZSBtZXpjbGEgc29uIGRpc2XDsWFkb3MgcGFyYSBhY29tb2RhciBoZXRlcm9nZW5laWRhZCBpbm9ic2VydmFkYSBlbiBsYSBwb2JsYWNpw7NuOyBlc28gZXMsIGxhIHBvYmxhY2nDs24gcHVlZGUgY29uc2lzdGlyIGRlIGdydXBvcyBpbm9ic2VydmFkb3MsIGNhZGEgdW5vIHRlbmllbmRvIHVuYSBkaXN0cmlidWNpw7NuIGRpc3RpbnRhIHBhcmEgbGEgdmFyaWFibGUgb2JzZXJ2YWRhLgpDb25zaWTDqXJlc2UgZWwgZWplbXBsbywgbGEgZGlzdHJpYnVjacOzbiBkZWwgbsO6bWVybywgWCwgZGUgcGFxdWV0ZXMgZGUgY2lnYXJyaWxsb3MgY29tcHJhZG9zIHBvciBsb3MgY29uc3VtaWRvcmVzIGRlIHVuIHN1cGVybWVyY2Fkby4gTG9zIGNvbnN1bWlkb3JlcyBwdWVkZW4gc2VyIGRpdmlkaWRvcyBlbiBncnVwb3MsIHBvciBlamVtcGxvLCBubyBmdW1hZG9yZXMsIGZ1bWFkb3JlcyBvY2FzaW9uYWxlcywgeSBmdW1hZG9yZXMgcmVndWxhcmVzLiBBaG9yYSBhdW4gc2kgZWwgbnVtZXJvIGRlIHBhcXVldGVzIGNvbXByYWRvIHBvciBsb3MgY29uc3VtaWRvcmVzIGVudHJlIGNhZGEgZ3J1cG8gZnVlcmEgZGlzdHJpYnVpYmxlIHBvciBQb2lzc29uLCBsYSBkaXN0cmlidWNpw7NuIFggbm8gc2VyaWEgUG9pc3Nvbjsgc2VyaWEgc29icmUgZGlzcGVyc2EgcmVsYXRpdmEgYSBQb2lzc29uLCB5IHRhbHZleiBhdW4gbXVsdGltb2RvLgpBbsOhbG9nYW1lbnRlLCBzdXDDs25nYXNlIHF1ZSBjYWRhIGN1ZW50YSBlbiBsYSBzZXJpZSBkZSB0ZXJyZW1vdG9zIGVzIGdlbmVyYWRhIHBvciB1bmEgZGUgZG9zIGRpc3RyaWJ1Y2lvbmVzIGRlIFBvaXNzb24sIGNvbiBtZWRpYXMgXCjOu18xXCkgeSBcKM67XzJcKSwgZG9uZGUgbGEgZWxlY2Npw7NuIGRlIG1lZGlhIGVzIGRldGVybWluYWRhIHBvciBvdHJvcyBtZWNhbmlzbW9zIGFsZWF0b3Jpb3MgcXVlIGxsYW1hcmVtb3MgZWwgcHJvY2VzbyBkZSBwYXLDoW1ldHJvLiBTdXDDs25nYXNlIHRhbWJpw6luIHF1ZSBcKM67XzFcKSBlcyBzZWxlY2Npb25hZG8gY29uIHByb2JhYmlsaWRhZCBcKM60XzFcKSB5IFwozrtfMlwpIGNvbiBwcm9iYWJpbGlkYWQgXCjOtF8yPTEtzrRfMVwpLiBWZXJlbW9zIG1hcyBhZGVsYW50ZSBlbiBlc3RlIGNhcGl0dWxvIHF1ZSBsYSB2YXJpYW56YSBkZSBsYSBkaXN0cmlidWNpw7NuIHJlc3VsdGFudGUgZXhjZWRlIGxhIG1lZGlhIHBvciBcKM60XzEgzrRfMiAozrtfMS3Ou18yICleMlwpLiBTaSBlbCBwcm9jZXNvIGRlIHBhcsOhbWV0cm8gZXMgdW5hIHNlcmllIGRlIHZhcmlhYmxlcyBhbGVhdG9yaWFzIGluZGVwZW5kaWVudGVzLCBsYXMgY3VlbnRhcyB0YW1iacOpbiBzb24gaW5kZXBlbmRpZW50ZXMsIGRlIGFow60gZWwgdMOpcm1pbm8g4oCcbWV6Y2xhIGluZGVwZW5kaWVudGXigJ0uCkVuIGdlbmVyYWwsIHVuYSBkaXN0cmlidWNpw7NuIGRlIG1lemNsYSBpbmRlcGVuZGllbnRlIGNvbnNpc3RlIGRlIHVuIG51bWVybyBmaW5pdG8sIGTDrWdhc2UgXChtXCksIGRlIGRpc3RyaWJ1Y2lvbmVzIGRlIGNvbXBvbmVudGUgeSB1bmEg4oCcZGlzdHJpYnVjacOzbiBkZSBtZXpjbGHigJ0gbGEgY3VhbCBzZWxlY2Npb25hIGRlIGVzdGFzIGNvbXBvbmVudGVzLiBMYXMgZGlzdHJpYnVjaW9uZXMgZGUgY29tcG9uZW50ZSBwdWVkZW4gc2VyIHRhbnRvIGRpc2NyZXRhcyBjb21vIGNvbnRpbnVhcy4gRW4gZWwgY2FzbyBkZSBkb3MgY29tcG9uZW50ZXMsIGxhIG1lemNsYSBkZSBkaXN0cmlidWNpw7NuIGRlcGVuZGUgZGUgZG9zIHByb2JhYmlsaWRhZGVzIG8gZnVuY2lvbmVzIGRlIGRlbnNpZGFkOgoKJCQKQ29tcG9uZW50ZSBccXF1YWQgXHFxdWFkXHFxdWFkXHFxdWFkXHFxdWFkMSBccXF1YWRccXF1YWQgMiBcXApQcm9iYWJpbGlkYWQgbyBmdW5jacOzbiBkZSBkZW5zaWRhZCBccXF1YWQgcF8xKHgpIFxxcXVhZCBwXzIoeCkgCiQkCgoKUGFyYSBlc3BlY2lmaWNhciBsYSBjb21wb25lbnRlLCB1bmEgbmVjZXNpdGEgdW5hIHZhcmlhYmxlIGFsZWF0b3JpYSBkaXNjcmV0YSBDIGxhIGN1YWwgcmVhbGl6YSBsYSBtZXpjbGE6CgokJApDPQpcYmVnaW57Y2FzZXN9CiAgMSBccXVhZCBjb24gXHF1YWQgcHJvYmFiaWxpZGFkIFxxdWFkXGRlbHRhXzFcXCAgICAKICAyIFxxdWFkIGNvbiBccXVhZCBwcm9iYWJpbGlkYWQgXHF1YWRcZGVsdGFfMiA9IDEtXGRlbHRhXzEKXGVuZHtjYXNlc30KJCQKCgpMYSBlc3RydWN0dXJhIGRlIGVzZSBwcm9jZXNvIHBhcmEgZWwgY2FzbyBkZSBkb3MgZGlzdHJpYnVjaW9uZXMgZGUgY29tcG9uZW50ZXMgY29udGludWFzIGVzIGlsdXN0cmFkYSBlbiBsYSBGaWd1cmEgMS4zLiBFbiBlc2UgZWplbXBsbyB1bm8gcHVlZGUgcGVuc2FyIGRlIEMgY29tbyBlbCByZXN1bHRhZG8gZGUgbGFuemFyIHVuYSBtb25lZGEgY29uIHByb2JhYmlsaWRhZCAwLjc1IGRlIOKAnGNhcmHigJ06IHNpIGVsIHJlc3VsdGFkbyBlcyDigJxjYXJh4oCdLCBlbnRvbmNlcyBDID0gMSB5IHVuYSBvYnNlcnZhY2nDs24gZXMgdG9tYWRhIGRlIHBfMTogc2kgZXMg4oCcY3J1euKAnSwgZW50b25jZXMgQyA9IDIgeSB1bmEgb2JzZXJ2YWNpw7NuIGVzIHRvbWFkYSBkZSBcKHBfMlwpLiBTdXBvbmVtb3MgcXVlIG5vIHNhYmVtb3MgZWwgdmFsb3IgZGUgQywgZXNvIGVzLCBjdWFsIGRlIFwocF8xXCkgbyBcKHBfMlwpIGVzdGFiYSBhY3Rpdm8gY3VhbmRvIGxhIG9ic2VydmFjacOzbiBmdWUgZ2VuZXJhZGEuCgohW0ZpZ3VyYSAxLjNdKC9Vc2Vycy9icmFjcnV6L0RvY3VtZW50cy84dm8uIFRyaW1lc3RyZSBJTy9TaXN0LiBFeHBlcnRvcyB5IFJlZGVzIFByb2IuL0NIMS9GaWd1cmExLTMucG5nKQoKCkxhIGV4dGVuc2nDs24gZGUgbSBjb21wb25lbnRlcyBlcyBzZW5jaWxsYS4gUXVlIFwozrRfMSzigKYszrRfbVwpIGRlbm90ZSBsYXMgcHJvYmFiaWxpZGFkZXMgYXNpZ25hZGFzIGEgbGFzIGRpZmVyZW50ZXMgY29tcG9uZW50ZXMsIHkgcXVlIFwocF8xLOKApixwX21cKSBkZW5vdGUgc3VzIHByb2JhYmlsaWRhZGVzIG8gZnVuY2lvbmVzIGRlIGRlbnNpZGFkLiBRdWUgWCBkZW5vdGUgbGEgdmFyaWFibGUgYWxlYXRvcmlhIGxhIGN1YWwgdGllbmUgbGEgZGlzdHJpYnVjacOzbiBkZSBtZXpjbGEuIEVuIGVsIGNhc28gZGlzY3JldG8sIGxhIGZ1bmNpw7NuIGRlIHByb2JhYmlsaWRhZCBkZSBYIGVzIGRhZGEgcG9yOgoKJCQKcCh4KSA9IFxzdW1fe2k9MX1ee219IFByKFg9eHxDPWkpUHIoQz1pKVxcCj1cc3VtX3tpPTF9XnttfVxkZWx0YV9pcF9pKHgpCiQkCkVsIGNhc28gY29udGludW8gZXMgYW7DoWxvZ28uIExhIGV4cGVjdGF0aXZhIGRlIGxhIG1lemNsYSBwdWVkZSBzZXIgZGFkYSBlbiB0w6lybWlub3MgZGUgbGFzIGV4cGVjdGFjaW9uZXMgZGUgbGFzIGRpc3RyaWJ1Y2lvbmVzIGRlIGNvbXBvbmVudGVzLiBEZWphbmRvIHF1ZSBZLCBkZW5vdGUgbGEgdmFyaWFibGUgYWxlYXRvcmlhIGNvbiBmdW5jacOzbiBkZSBwcm9iYWJpbGlkYWQgXChwX2lcKSwgdGVuZW1vczoKCiQkCkUoWCkgPSBcc3VtX3tpPTF9XnttfSBQcihDPWkpIEUoWHxDPWkpID0gXHN1bV97aT0xfV57bX0gXGRlbHRhX2lFKFlfaSkKJCQKCkVsIG1pc21vIHJlc3VsdGFkbyBhZ3VhcmRhIHBhcmEgdW5hIG1lemNsYSBkZSBkaXN0cmlidWNpb25lcyBjb250aW51YXMuIE1hcyBnZW5lcmFsbWVudGUsIHBhcmEgdW5hIG1lemNsYSBkZWwgay1lc2ltbyBtb21lbnRvIGRlbCBvcmlnZW4gZXMgc2ltcGxlbWVudGUgdW5hIGNvbWJpbmFjacOzbiBsaW5lYWwgZGUgbG9zIGstZXNpbW9zIG1vbWVudG9zIGRlIHN1cyBjb21wb25lbnRlcyBcKFlfaVwpOgoKJCQKRShYXmspID0gXHN1bV97aT0xfV57bX0gXGRlbHRhX2lFKFlfaV5rKSwgaz0xLDIsLi4uCiQkCgpOw7N0ZXNlIHF1ZSBlbCByZXN1bHRhZG8gYW7DoWxvZ28gbm8gY3VlbnRhIHBhcmEgbW9tZW50b3MgY2VudHJhbGVzLiBFbiBwYXJ0aWN1bGFyLCBsYSB2YXJpYW56YSBYIG5vIGVzIHVuYSBjb21iaW5hY2nDs24gbGluZWFyIGRlIGxhcyB2YXJpYW56YXMgZGUgc3VzIGNvbXBvbmVudGVzIFwoWWlcKS4gRWwgRWplcmNpY2lvIDEgbGUgcGlkZSBhbCBsZWN0b3IgcHJvYmFyIGVzbywgZW4gZWwgY2FzbyBkZSBkb3MgY29tcG9uZW50ZXMsIGxhIHZhcmlhbnphIGRlIGxhIG1lemNsYSBlc3TDoSBkYWRhIHBvcjoKCiQkClZhcihYKSA9IFxkZWx0YV8xVmFyKFlfMSkrXGRlbHRhXzJWYXIoWV8yKStcZGVsdGFfMVxkZWx0YV8yKEUoWV8xKS1FKFlfMikpXjIKJCQKCgojIyMxLjIuMiBFc3RpbWFjacOzbiBkZSBwYXLDoW1ldHJvcwoKTGEgZXN0aW1hY2nDs24gZGUgcGFyw6FtZXRyb3MgZGUgdW5hIGRpc3RyaWJ1Y2nDs24gZGUgbWV6Y2xhcyBlcyBhIG1lbnVkbyByZWFsaXphZGEgcG9yIHVuYSBwcm9iYWJpbGlkYWQgbcOheGltYSAoTUwpLiBMYSBwcm9iYWJpbGlkYWQgZGUgdW4gbW9kZWxvIGRlIG1lemNsYSBjb24gbSBjb21wb25lbnRlcyBlc3RhIGRhZGEsIHBhcmEgdGFudG8gY2Fzb3MgZGlzY3JldG9zIGNvbW8gY29udGludW9zLCBwb3I6CgokJApMKFx0aGV0YV8xLC4uLixcdGhldGFfbSxcZGVsdGFfMSwuLi4sXGRlbHRhX218eF8xLC4uLix4X24pID0gXHByb2Rfe2o9MX1ee259XHN1bV97aT0xfV57bX1cZGVsdGFfaXBfaSh4X2osXHRoZXRhX2kpCiQkCgpBcXXDrSBcKM64XzEs4oCmLM64X21cKSBzb24gbG9zIHZlY3RvcmVzIGRlIHBhcmFtZXRyb3MgZGUgbGFzIGRpc3RyaWJ1Y2lvbmVzIGRlIGNvbXBvbmVudGVzLCBcKM60XzEs4oCmLM60X21cKSBzb24gbG9zIHBhcmFtZXRyb3MgZGUgbWV6Y2xhLCB0b3RhbGl6YW5kbyAxLCB5IFwoeF8xLOKApix4X25cKSBzb24gbGFzIG4gb2JzZXJ2YWNpb25lcy4gRW50b25jZXMsIGVuIGVsIGNhc28gZGUgZGlzdHJpYnVjaW9uZXMgZGUgY29tcG9uZW50ZXMgY2FkYSB1bmEgZXNwZWNpZmljYWRhIHBvciB1biBwYXLDoW1ldHJvLCBcKDJtLTFcKSBwYXJhbWV0cm9zIGluZGVwZW5kaWVudGVzIHRpZW5lbiBxdWUgc2VyIGVzdGltYWRvcy4gRXhjZXB0byB0YWx2ZXogZW4gY2Fzb3MgZXNwZWNpYWxlcywgbWF4aW1pemFjacOzbiBhbmFsw610aWNhIGRlIHRhbCBwcm9iYWJpbGlkYWQgbm8gZXMgcG9zaWJsZSwgcGVybyBlcyBnZW5lcmFsbWVudGUgc2VuY2lsbG8gZGUgZXZhbHVhcmxvIHLDoXBpZGFtZW50ZTsgdmVyIEVqZXJjaWNpbyAzLiBNYXhpbWl6YWNpw7NuIG51bcOpcmljYSBzZXLDoSBpbHVzdHJhZGEgYXF1w60gYWwgY29uc2lkZXJhciBlbCBjYXNvIGRlIHVuYSBtZXpjbGEgZGUgZGlzdHJpYnVjaW9uZXMgZGUgUG9pc3Nvbi4gU3Vwb25nYXNlIHF1ZSBtPTIgeSBsYXMgZG9zIGNvbXBvbmVudGVzIHNvbiBkaXN0cmlidWlibGVzIHBvciBQb2lzc29uIGNvbiBtZWRpYXMgXCjOu18xXCkgeSBcKM67XzJcKS4gUXVlIFwozrRfMVwpIHkgXCjOtF8yXCkgc2VhbiBsb3MgcGFyw6FtZXRyb3MgZGUgbWV6Y2xhIChjb24gXCjOtF8xICsgzrRfMiA9IDFcKS4gTGEgZGlzdHJpYnVjacOzbiBkZSBtZXpjbGEgcCBlc3RhIGRhZGEgcG9yOgoKJCQKcCh4KSA9IFxkZWx0YV8xIFxmcmFje1xsYW1iZGFfMV54ZV57LVxsYW1iZGFfMX19e3ghfStcZGVsdGFfMiBcZnJhY3tcbGFtYmRhXzJeeGVeey1cbGFtYmRhXzJ9fXt4IX0KJCQKRGVzZGUgcXVlIFwozrRfMj0xLc60XzFcKSwgaGF5IHNvbGFtZW50ZSB0cmVzIHBhcsOhbWV0cm9zIGEgZXN0aW1hcjogXCjOu18xXCksIFwozrtfMlwpIHkgXCjOtF8xXCkuIExhIHByb2JhYmlsaWRhZCBlczoKCiQkCkwoXGxhbWJkYV8xLFxsYW1iZGFfMixcZGVsdGFfMXx4XzEsLi4uLHhfbikgPSBccHJvZF97aT0xfV5uKFxkZWx0YV8xXGZyYWN7XGxhbWJkYV8xXnt4X2l9ZV57LVxsYW1iZGFfMX19e3hfaSF9KygxLVxkZWx0YV8xKVxmcmFje1xsYW1iZGFfMl57eF9pfWVeey1cbGFtYmRhXzJ9fXt4X2khfSkKJCQKTGEgbWF4aW1pemFjacOzbiBhbmFsw610aWNhIGRlIEwgY29uIHJlc3BlY3RvIGEgXCjOu18xXCksIFwozrtfMlwpIHkgXCjOtF8xXCkgc2VyaWEgcmFyYSwgeWEgcXVlIEwgZXMgZWwgcHJvZHVjdG8gZGUgbiBmYWN0b3JlcywgZGVsIGN1YWwgY2FkYSB1bm8gZXMgdW5hIHN1bWEuIFByaW1lcm8gdG9tYXIgZWwgbG9nYXJpdG1vIHkgbHVlZ28gbGEgZGlmZXJlbmNpYWNpw7NuIG5vIHNpbXBsaWZpY2EgbXVjaG8gbGFzIGNvc2FzIHRhbXBvY28uIFBvciBsbyB0YW50bywgbGEgZXN0aW1hY2nDs24gZGUgcGFyw6FtZXRyb3MgZXMgbWFzIGNvbnZlbmllbnRlbWVudGUgbGxldmFkYSBhIGNhYm8gcG9yIG1heGltaXphY2nDs24gbnVtw6lyaWNhIGRpcmVjdGEgZGUgbGEgcHJvYmFiaWxpZGFkIChvIHN1IGxvZ2FyaXRtbyksIGF1bnF1ZSBlbCBsb2dhcml0bW8gRU0gZXMgY29tw7pubWVudGUgdXNhZG8gY29tbyBhbHRlcm5hdGl2YTsgdsOpYXNlLCBwb3IgZWplbXBsbywgTWNMYWNobGFuIHkgUGVlbCAoMjAwMCkgbyBGcnVod2lydGgtU2NobmF0dGVyICgyMDA2KS4gVW4gcGFxdWV0ZSDDunRpbCBkZSBSIHBhcmEgZXN0aW1hY2nDs24gZW4gbW9kZWxvcyBkZSBtZXpjbGEgZXMgXChmbGV4bWl4XCkgKExlaXNjaCwgMjAwNCkuIFNpbiBlbWJhcmdvLCBlcyBzZW5jaWxsbyBlc2NyaWJpciBudWVzdHJvIHByb3BpbyBjw7NkaWdvIGRlIFIgcGFyYSBldmFsdWFyLCB5IGx1ZWdvIG1heGltaXphciwgcHJvYmFiaWxpZGFkZXMgZGUgbWV6Y2xhIGVuIGNhc29zIHNlbmNpbGxvcy4KRXN0YSBwcm9iYWJpbGlkYWQgcHVlZGUgc2VyIGx1ZWdvIG1heGltaXphZGEgYWwgdXNhciAocG9yIGVqZW1wbG8pIGxhIGZ1bmNpw7NuIGRlIFIgbmxtLiBTaW4gZW1iYXJnbywgbG9zIHBhcsOhbWV0cm9zIFwoXGRlbHRhXCkgeSBcKFxsYW1iZGFcKSBzb24gc3VqZXRvcyBwb3IgKGVjdWFjacOzbiByYXJhKSB5IChwYXJhIFwoaSA9IDEsIOKApiwgbVwpKSBcKM60X2kgPiAwXCkgeSBcKM67X2k+MFwpLiBFcyBlbnRvbmNlcyBuZWNlc2FyaW8gUmUgcGFyYW1ldHJpemFyIHNpIHVubyBhc8OtIGxvIGRlc2VhIHBhcmEgdXRpbGl6YXIgdW4gb3B0aW1pemFkb3Igc2luIHJlc3RyaWNjaW9uZXMgdGFsIGNvbW8gbmxtLiBVbmEgcG9zaWJpbGlkYWQgcGFyYSBtYXhpbWl6YXIgbGEgcHJvYmFiaWxpZGFkIGNvbiByZXNwZWN0byBhIGxvcyAybS0xIOKAnHBhcsOhbWV0cm9zIGZ1bmNpb25hbGVz4oCdIHNpbiByZXN0cmljY2nDs24uCgokJApcZXRhX2kgPSBsb2dcbGFtYmRhX2kgKGk9MSwuLi5tKQokJAp5CgokJApcdGF1X2kgPSBsb2coXGZyYWN7XGRlbHRhX2l9ezEtXHN1bV97aj0yfV5tIFxkZWx0YV9qfSkgKGk9MiwuLi4sbSkKJCQKClNlIHJlY3VwZXJhbiBsb3Mg4oCccGFyw6FtZXRyb3MgbmF0dXJhbGVz4oCdIG9yaWdpbmFsZXMgcG9yIG1lZGlvIGRlOgoKJCQKXGxhbWJkYV9pID0gZV57XGV0YV9pfSBccXVhZCAoaT0xLC4uLixtKSBcXApcZGVsdGFfaSA9IFxmcmFje2Vee1x0YXVfaX19ezErXHN1bV97aj0yfV5tZV57XGV0YV9qfX0gXHF1YWQgKGk9MiwuLi4sbSkKJCQKClkgXCjOtF8xPTEtXHN1bV97aj0yfV57bX3OtF9pXCkgLiBFbCBzaWd1aWVudGUgY8OzZGlnbyBpbXBsZW1lbnRhIGxhcyBpZGVhcyBhbnRlcmlvcmVzIGVuIG9yZGVuIHBhcmEgcXVlIGVuY2FqZW4gdW4gbW9kZWxvIGRlIGN1YXRybyBkaXN0cmlidWNpb25lcyBkZSBQb2lzc29uIGEgbGFzIGN1ZW50YXMgZGUgdGVycmVtb3Rvcy4gTG9zIHJlc3VsdGFkb3MgZXN0w6FuIGRhZG9zIHBvciBtID0gMSwyLDMsNCBlbiBsYSBUYWJsYSAxLjIKCmBgYHtyIGluY2x1ZGU9VFJVRSwgZWNobz1UUlVFfQptbGxrIDwtIGZ1bmN0aW9uKHdwYXIseCl7IHp6eiA8LSB3Mm4od3BhcikKICAgICAgICAtc3VtKGxvZyhvdXRlcih4LHp6eiRsYW1iZGEsZHBvaXMpJSolenp6JGRlbHRhKSkgfQoKbjJ3ICA8LSBmdW5jdGlvbihsYW1iZGEsZGVsdGEpbG9nKGMobGFtYmRhLGRlbHRhWy0xXS8oMS1zdW0oZGVsdGFbLTFdKSkpKQoKdzJuICA8LSBmdW5jdGlvbih3cGFyKXttIDwtIChsZW5ndGgod3BhcikrMSkvMgogICAgICAgIGxhbWJkYSA8LSBleHAod3BhclsxOm1dKQogICAgICAgIGRlbHRhICA8LSBleHAoYygwLHdwYXJbKG0rMSk6KDIqbS0xKV0pKQpyZXR1cm4obGlzdChsYW1iZGE9bGFtYmRhLGRlbHRhPWRlbHRhL3N1bShkZWx0YSkpKSB9Cgp4ICAgICAgICA8LSByZWFkLnRhYmxlKCIvVXNlcnMvYnJhY3J1ei9Eb2N1bWVudHMvOHZvLiBUcmltZXN0cmUgSU8vU2lzdC4gRXhwZXJ0b3MgeSBSZWRlcyBQcm9iLi9lYXJ0aHF1YWtlcy50eHQiKVssMl0Kd3BhciAgICAgPC0gbjJ3KGMoMTAsMjAsMjUsMzApLGMoMSwxLDEsMSkvNCkKdzJuKG5sbShtbGxrLHdwYXIseCkkZXN0aW1hdGUpCmBgYAoKTm90ZXNlIGNvbW8sIGVuIGVzdGUgY8OzZGlnbywgZWwgdXNvIGRlIGxhIGZ1bmNpw7NuIG91dGVyIGhhY2UgcG9zaWJsZSBlbCBldmFsdWFyIGxhIHByb2JhYmlsaWRhZCBkZSBtZXpjbGEgZGUgUG9pc3NvbiBlbiB1bmEgc2ltcGxlIHkgY29tcGFjdGEgZXhwcmVzacOzbiBlbiB2ZXogZGUgZW4gdW4gY2ljbG8uIFBlcm8gc2kgbGEgZGlzdHJpYnVjacOzbiBzaWVuZG8gbWV6Y2xhZGEgZnVlcmFuIGRpc3RyaWJ1Y2lvbmVzIGNvbiBtYXMgZGUgdW4gcGFyw6FtZXRybyAoZMOtZ2FzZSwgbm9ybWFsKSwgdW4gZW5mb3F1ZSB1biBwb2NvIGRpc3RpbnRvIHNlcmlhIG5lY2VzYXJpby4KCkxvcyByZXN1bHRhZG9zIGFudGVyaW9yZXMgcHVlZGVuIHNlciB2ZXJpZmljYWRvcyBlbiBsYSBzaWd1aWVudGUgdGFibGE6CgoKIVtUYWJsYSAxLjJdKC9Vc2Vycy9icmFjcnV6L0RvY3VtZW50cy84dm8uIFRyaW1lc3RyZSBJTy9TaXN0LiBFeHBlcnRvcyB5IFJlZGVzIFByb2IuL0NIMS9UYWJsYTEtMi5wbmcpCgoKIyMjIDEuMi4zIFByb2JhYmlsaWRhZCBpbGltaXRhZGEgZW4gbWV6Y2xhcwoKSGF5IHVuIGFzcGVjdG8gZW4gbWV6Y2xhcyBkZSBkaXN0cmlidWNpb25lcyBjb250aW51YXMgcXVlIGRpZmllcmVuIGRlbCBjYXNvIGRpc2NyZXRvIHkgdmFsZSBsYSBwZW5hIHJlc2FsdGFybG8uIEVzIGVsIHNpZ3VpZW50ZTogcHVlZGUgcGFzYXIgcXVlOiBlbiBsYSB2ZWNpbmlkYWQgZGUgY2llcnRhcyBjb21iaW5hY2lvbmVzIGRlIHBhcsOhbWV0cm9zLCBsYSBwcm9iYWJpbGlkYWQgZXMgaWxpbWl0YWRhLiBQb3IgZWplbXBsbywgZW4gZWwgY2FzbyBkZSB1bmEgbWV6Y2xhIGRlIGRpc3RyaWJ1Y2lvbmVzIG5vcm1hbGVzLCBsYSBwcm9iYWJpbGlkYWQgc2UgdnVlbHZlIGFyYml0cmFyaWFtZW50ZSBncmFuZGUgc2kgdW5vIGFzaWduYSBsYSBtZWRpYSBjb21wb25lbnRlIGlndWFsIGEgdW5hIGRlIGxhcyBvYnNlcnZhY2lvbmVzIHkgcGVybWl0ZSBxdWUgbGEgdmFyaWFuemEgY29ycmVzcG9uZGllbnRlIHRpZW5kYSBhIGNlcm8uIEVsIHByb2JsZW1hIGhhIHNpZG8gYW1wbGlhbWVudGUgZGlzY3V0aWRvIGVuIGxhIGxpdGVyYXR1cmEgZGUgbW9kZWxvcyBkZSBtZXpjbGEsIHkgaGF5IGFxdWVsbG9zIHF1ZSBzdWdpZXJlbiBxdWUgc2kgbGEgcHJvYmFiaWxpZGFkIGVzIGVudG9uY2VzIGlsaW1pdGFkYSwgbGEgTUwgZXN0aW1hIHNpbXBsZW1lbnRlIHF1ZSDigJxubyBleGlzdGXigJ0uCgpMYSBmdWVudGUgZGVsIHByb2JsZW1hLCBzaW4gZW1iYXJnbywgZXMgc29sYW1lbnRlIGVsIHVzbyBkZSBkZW5zaWRhZGVzIGVuIHZleiBkZSBwcm9iYWJpbGlkYWRlcyBlbiBsYSBwb3NpYmlsaWRhZDsgbm8gc3VyZ2lyw61hIHNpIHNlIHJlbXBsYXphcmEgY2FkYSB2YWxvciBkZSBkZW5zaWRhZCBlbiB1bmEgcG9zaWJpbGlkYWQgcG9yIGxhIHByb2JhYmlsaWRhZCBkZWwgaW50ZXJ2YWxvIGNvcnJlc3BvbmRpZW50ZSBhbCB2YWxvciByZWdpc3RyYWRvLiAoUG9yIGVqZW1wbG8sIHVuYSBvYnNlcnZhY2nDs24gcmVnaXN0cmFkYSBjb21vIOKAnDEyLjTigJ0gZXN0YSBhc29jaWFkYSBjb24gZWwgaW50ZXJ2YWxvIFsxMi4zNSwgMTIuNDVdKS4gRW4gZWwgY29udGV4dG8gZGUgbWV6Y2xhcyBpbmRlcGVuZGllbnRlcyBzZSByZW1wbGF6YSBsYSBleHByZXNpw7NuOgoKJCQKXHByb2Rfe2o9MX1eblxzdW1fe2k9MX1ebVxkZWx0YV9pIHBfaSh4X2osXHRoZXRhX2kpCiQkCgpkZSBsYSBwb3NpYmlsaWRhZCAodsOpYXNlIGVjdWFjacOzbiBhbnRlcmlvcikgcG9yIGxhIHBvc2liaWxpZGFkIGRpY3JldGE6CgokJApMID0gXHByb2Rfe2o9MX1eblxzdW1fe2k9MX1ebVxkZWx0YV9pIFxpbnRfe2Ffan1ee2Jfan0gcF9pKHgsXHRoZXRhX2kpZHgKJCQKCkRvbmRlIGVsIGludGVydmFsbyBcKChhX2osIGJfailcKSBjb25zaXN0ZSBkZSBhcXVlbGxvcyB2YWxvcmVzIGxvcyBjdWFsZXMsIHNpIHNvbiBvYnNlcnZhZG9zLCBzZXJpYW4gcmVnaXN0cmFkb3MgY29tbyBcKHhfalwpLiBFc3RvIHNpbXBsZW1lbnRlIGVxdWl2YWxlIGEgcmVjb25vY2VyIGV4cGzDrWNpdGFtZW50ZSBsYSBuYXR1cmFsZXphIGRlbCBpbnRlcnZhbG8gZGUgdG9kYXMgbGFzIHN1cHVlc3RhcyBvYnNlcnZhY2lvbmVzIGNvbnRpbnVhcy4gTWFzIGdlbmVyYWxtZW50ZSwgbGEgcG9zaWJpbGlkYWQgZGlzY3JldGEgZGUgb2JzZXJ2YWNpb25lcyBlbiB1biBjb25qdW50byBkZSB2YXJpYWJsZXMgYWxlYXRvcmlhcyBcKFhfMSwgWF8yLOKApiwgWF9uXCkgZXMgbGEgcHJvYmFiaWxpZGFkIGRlIGxhIGZvcm1hIFwoUHIoYV9pIDwgWF9pIDwgYl9pIFxxdWFkIHBhcmFccXVhZCB0b2RhIFxxdWFkIGkpXCkuIFV0aWxpemFyZW1vcyBlbCB0ZXJtaW5vIHBvc2liaWxpZGFkIGNvbnRpbnVhIHBhcmEgbGEgZGVuc2lkYWQgY29uanVudGEgZXZhbHVhZGEgZW4gbGEgb2JzZXJ2YWNpw7NuLgpPdHJhIG1hbmVyYSBkZSBldml0YXIgZXN0ZSBwcm9ibGVtYSBlcyBlbCBpbXBvbmVyIHVuIGxpbWl0ZSBpbmZlcmlvciBlbiBsYXMgdmFyaWFuemFzIHkgYnVzY2FyIGVsIG1lam9yIHN1amV0byBtw6F4aW1vIGxvY2FsIHBhcmEgZXNlIGzDrW1pdGUuIFB1ZWRlIHN1Y2VkZXIsIHNpbiBlbWJhcmdvLCBxdWUgc2UgcHVlZGUgc2VyIHRhbiBhZm9ydHVuYWRvIHBhcmEgZXZpdGFyIGxvcyDigJxwaWNvc+KAnSBkZSBwb3NpYmlsaWRhZCBhbCBidXNjYXIgcG9yIHVuIG3DoXhpbW8gbG9jYWw7IGVuIGVzdGUgYXNwZWN0bywgdmFsb3JlcyBidWVub3MgZGUgaW5pY2lvIHB1ZWRlbiBheXVkYXIuIEVsIGZlbsOzbWVubyBkZSBwb3NpYmlsaWRhZGVzIGlsaW1pdGFkYXMgbm8gc3VyZ2UgcGFyYSBvYnNlcnZhY2lvbmVzIGRlIHZhbG9yZXMgZGlzY3JldG9zIHBvcnF1ZSBsYSBwb3NpYmlsaWRhZCBlbiBlc2UgY2FzbyBlcyB1bmEgcHJvYmFiaWxpZGFkIHkgcG9yIGVuZGUsIGxpbWl0YWRhIGEgdmFsb3JlcyBlbnRyZSAwIHkgMS4KCgojIyMxLjIuNC4gRWplbXBsb3MgZGUgbW9kZWxvcyBkZSBtZXpjbGEgYWp1c3RhZG9zCgojIyMjTWV6Y2xhIGRlIGRpc3RyaWJ1Y2lvbmVzIGRlIFBvaXNzb24KClNpIHVubyB1dGlsaXphIG5sbSBwYXJhIGFqdXN0YXIgdW5hIG1lemNsYSBkZSBtIGRpc3RyaWJ1Y2lvbmVzIGRlIFBvaXNzb24gKG09MSwyLDMsNCkgYSBsb3MgZGF0b3MgZGVsIHRlcnJlbW90bywgdW5vIG9idGllbmUgbG9zIHJlc3VsdGFkb3MgZGVzcGxlZ2Fkb3MgZW4gbGEgVGFibGEgMS4yLiBOb3Rlc2UgcXVlIGhheSB1bmEgY2xhcmEgbWVqb3JhIGVuIGxhIHBvc2liaWxpZGFkIHJlc3VsdGFudGUgZGUgbGEgYWRpY2lvbiBkZSB1bmEgc2VndW5kYSBjb21wb25lbnRlLCB5IG11eSBwb2NhIG1lam9yYSBkZSBsYSBhZGljaW9uIGRlIHVuYSBjdWFydGEg4oCTIGFwYXJlbnRlbWVudGUgaW5zdWZpY2llbnRlIHBhcmEganVzdGlmaWNhciBsb3MgZG9zIHBhcsOhbWV0cm9zIGFkaWNpb25hbGVzLiAgTGEgRmlndXJhIDEuNCBwcmVzZW50YSB1biBoaXN0b2dyYW1hIGRlIGxhcyBjdWVudGFzIG9ic2VydmFkYXMgeSBsb3MgY3VhdHJvIG1vZGVsb3MgYWp1c3RhZG9zLiBFcyBjbGFybyBxdWUgbGFzIG1lemNsYXMgZW5jYWphbiBsYXMgb2JzZXJ2YWNpb25lcyBtdWNobyBtZWpvciBhIGNvbW8gbG8gaGFjZSB1bmEgc29sYSBkaXN0cmlidWNpw7NuIGRlIFBvaXNzb24sIHkgdmlzdWFsbWVudGUgbG9zIG1vZGVsb3MgZGUgdHJlcyB5IGN1YXRybyBlc3RhZG9zIHBhcmVjZW4gYWRlY3VhZG9zLiBFbCBtZWpvciBhanVzdGUgcGFyYSBsYXMgbWV6Y2xhcyBlcyB0YW1iacOpbiBldmlkZW50ZSBkZSBsYXMgdmFyaWFuemFzIGRlIGxvcyBjdWF0cm8gbW9kZWxvcyBjb21vIGVzdGEgcHJlc2VudGFkYSBlbiBsYSBUYWJsYSAxLjIuIEFsIGNvbXB1dGFyIGxhcyBtZWRpYXMgeSB2YXJpYW56YXMgZGUgbG9zIG1vZGVsb3MgaGVtb3MgdXNhZG8gXChFKFgpPVxzdW1fac60X2kgzrtfaVwpIHkgXChWYXIoWCk9RShYXjIgKS0oRShYKSleMlwpLCBjb24gXChFKFheMiApPVxzdW1fac60X2kgKM67X2krzrtfaV4yKVwpLiBQYXJhIGNvbXBhcmFjacOzbiB0YW1iacOpbiBoZW1vcyB1c2FkbyBlbCBwYXF1ZXRlIGRlIFIgZmxleG1peCBwYXJhIGFqdXN0YXIgbG9zIGN1YXRybyBtb2RlbG9zLiBMb3MgcmVzdWx0YWRvcyBjb3JyZXNwb25kaWVyb24gbXVjaG8gYSBleGNlcGNpw7NuIGRlIGxhc28gZGVsIG1vZGVsbyBkZSBjdWF0cm8gY29tcG9uZW50ZXMsIGRvbmRlIGVsIHZhbG9yIGRlIHBvc2liaWxpZGFkIG1hcyBncmFuZGUgcXVlIGVuY29udHJhbW9zIHBvciBmbGV4bWl4IGZ1ZSAzNTYuNzc1OSB5IGxhcyBtZWRpYXMgZGUgbG9zIGNvbXBvbmVudGVzIGRpZmlyaWVyb24gdW4gcG9jby4KTm90ZXNlIHRhbWJpw6luLCBxdWUgbGEgZGlzY3VzacOzbiBzdXBlcmlvciBpZ25vcmEgbGEgcG9zaWJpbGlkYWQgZGUgZGVwZW5kZW5jaWEgc2VyaWFsIGVuIGxvcyBkYXRvcyBkZWwgdGVycmVtb3RvLCB1biBwdW50byBlbCBjdWFsIHNlIHJldG9tYXJhIGVuIGVsIENhcMOtdHVsbyAyLgoKIVtGaWd1cmEgMS40XSgvVXNlcnMvYnJhY3J1ei9Eb2N1bWVudHMvOHZvLiBUcmltZXN0cmUgSU8vU2lzdC4gRXhwZXJ0b3MgeSBSZWRlcyBQcm9iLi9DSDEvRmlndXJhMS00LnBuZykKCiMjMS4zIENhZGVuYXMgZGUgTWFya292CkFob3JhIGludHJvZHVjaXJlbW9zIGxhcyBjYWRlbmFzIGRlIE1hcmtvdi4gTnVlc3RybyBhbsOhbGlzaXMgc2UgcmVzdHJpbmdlIGEgYXF1ZWxsb3MgYXNwZWN0b3MgZGUgY2FkZW5hcyBkZSBNYXJrb3YgZGlzY3JldGFzIGxvcyBjdWFsZXMgbmVjZXNpdGFyZW1vcy4gQXNpLCBzaW4gZW1iYXJnbyBoYXJlbW9zIHJlZmVyZW5jaWEgYSBwcm9waWVkYWRlcyB0YWxlcyBjb21vIGxhIGlycmVkdWN0aWJpbGlkYWQgeSBhcGVyaW9kaWNpZGFkLCBubyBsaWRpYXJlbW9zIGNvbiBjdWVzdGlvbmVzIHTDqWNuaWNhcy4KMS4zLjEgRGVmaW5pY2lvbmVzIHkgZWplbXBsb3MKVW5hIHNlY3VlbmNpYSBkZSB2YXJpYWJsZXMgYWxlYXRvcmlhcyBkaXNjcmV0YXMgXCh7Q190OnQg4oiIIE59IFwpc2UgZGljZSBxdWUgZXMgdW5hICh0aWVtcG8gZGlzY3JldG8pIENhZGVuYSBkZSBNYXJrb3YgKENNKSBzaSwgcGFyYSB0b2RvIHQg4oiITiwgc2F0aXNmYWNlIGxhIHByb3BpZWRhZCBkZSBNYXJrb3Y6CgokJApQcihDX3t0KzF9IHwgQ190LC4uLixDXzEpID0gUHIoKENfe3QrMX18Q190KQokJApFc28gZXMsIGNvbmRpY2lvbmFuZG8gYSBsYSBoaXN0b3JpYSBkZWwgcHJvY2VzbyBoYXN0YSBlbCB0aWVtcG8gdCBlcyBlcXVpdmFsZW50ZSBhIGNvbmRpY2lvbmFyIHNvbG8gZWwgdmFsb3IgbWFzIHJlY2llbnRlIFwoQ190XCkuIFBhcmEgaGFjZXJsbyBtw6FzIGNvbXBhY3RvLCBkZWZpbmltb3MgXChDXnRcKSBjb21vIGxhIGhpc3RvcmlhIFwoKENfMSxDXzIs4oCmLENfdCApXCksIGVuIGN1YWwgY2FzbywgbGEgcHJvcGllZGFkIGRlIE1hcmtvdiBzZSBwdWVkZSBlc2NyaWJpciBjb21vOgoKJCQKUHIoQ197dCsxfSB8IENeeyh0KX0gPSBQcihDX3t0KzF9IHwgQ190KQokJApMYSBwcm9waWVkYWQgZGUgTWFya292IHB1ZWRlIHNlciBpbnRlcnByZXRhZGEgY29tbyBsYSBwcmltZXJhIHJlbGFqYWNpw7NuIGRlIGxhIHN1cG9zaWNpb24gZGUgaW5kZXBlbmRlbmNpYS4gTGFzIHZhcmlhYmxlcyBhbGVhdG9yaWFzIFwoe0NfdH1cKSBzb24gZGVwZW5kaWVudGVzIGRlIHVuYSBtYW5lcmEgcXVlIGVzIG1hdGVtw6F0aWNhbWVudGUgY29udmVuaWVudGUsIGNvbW8gZXMgbW9zdHJhZG8gZW4gZWwgc2lndWllbnRlIGdyYWZpY28gZW4gZWwgY3VhbCBlbCBwYXNhZG8geSBlbCBmdXR1cm8gc29uIGRlcGVuZGllbnRlcyBzb2xvIGEgdHJhdsOpcyBkZWwgcHJlc2VudGUuCgohW10oL1VzZXJzL2JyYWNydXovRG9jdW1lbnRzLzh2by4gVHJpbWVzdHJlIElPL1Npc3QuIEV4cGVydG9zIHkgUmVkZXMgUHJvYi4vQ0gxL0dyYWZpY2ExLnBuZykKCgpDYW50aWRhZGVzIGltcG9ydGFudGVzIGFzb2NpYWRhcyBjb24gdW5hIGNhZGVuYSBkZSBNYXJrb3Ygc29uIGxhcyBwcm9iYWJpbGlkYWRlcyBjb25kaXRpb25hbGVzLCB0YW1iacOpbiBsbGFtYWRhcyBwcm9iYWJpbGlkYWRlcyBkZSB0cmFuc2ljacOzbjoKCiQkClByKENfe3MrdH09aiB8IENfcyA9IGkpCiQkClNpIGVzdGFzIHByb2JhYmlsaWRhZGVzIG5vIGRlcGVuZGVuIGRlIHMsIGxhIGNhZGVuYSBkZSBNYXJrb3YgZXMgbGxhbWFkYSBob21vZ8OpbmVhLCBkZSBvdHJhIG1hbmVyYSBzZXJpYSBuby1ob21vZ2VuZWEuIEEgbm8gc2VyIHF1ZSBoYXlhIHVuYSBpbmRpY2FjacOzbiBleHBsaWNpdGEgYWwgY29udHJhcmlvLCBhc3VtaXJlbW9zIHF1ZSBsYSBjYWRlbmEgZGUgTWFya292IGVuIGRpc2N1c2nDs24gZXMgaG9tb2fDqW5lYSwgZW4gY3VhbCBjYXNvIGxhcyBwcm9iYWJpbGlkYWRlcyBkZSB0cmFuc2ljacOzbiBzZXLDoW4gZGVub3RhZGFzIHBvcjoKCiQkClxnYW1tYV97aWp9KHQpPSBQcihDX3tzK3R9fENfcz1pKQokJApOb3Rlc2UgcXVlIGxhIG5vdGFjacOzbiBcKM6zX3tpan0gKHQpXCkgbm8gaW52b2x1Y3JhIGEgcy4gTGEgbWF0cml6IFwozpModClcKSAgZXN0YSBkZWZpbmlkYSBjb21vIGxhIG1hdHJpeiBjb24gZWxlbWVudG9zIFwozrNfe2lqfSAodClcKS4KClVuYSBpbXBvcnRhbnRlIHByb3BpZWRhZCBkZSB0b2RhcyBsYXMgY2FkZW5hcyBkZSBNYXJrb3YgaG9tb2fDqW5lYXMgeSBkZSBlc3RhZG8geSBlc3BhY2lvIGZpbml0byBlcyBsYSBxdWUgc2F0aXNmYWNlIGxhcyBlY3VhY2lvbmVzIENoYXBtYW4tS29sbW9nb3JvdjoKCiQkClxHYW1tYSh0K3UpID0gXEdhbW1hKHQpIFxHYW1tYSh1KQokJApMYSBzb2x1Y2nDs24gcmVxdWllcmUgc29sYW1lbnRlIGxhIGRlZmluaWNpw7NuIGRlIHByb2JhYmlsaWRhZCBjb25kaWNpb25hbCB5IGxhIGFwbGljYWNpw7NuIGRlIGxhIHByb3BpZWRhZCBkZSBNYXJrb3YuIExhcyBlY3VhY2nDs25lcyBDaGFwbWFuLUtvbG1vZ29yb3YgaW1wbGljYW4gcXVlLCBwYXJhIHRvZG8gXCh0IOKIiE5cKToKCiQkXEdhbW1hKHQpPVxHYW1tYSgxKV50JCQKRXN0byBlcywgbGEgbWF0cml6IGRlIHByb2JhYmlsaWRhZGVzIGRlIHRyYW5zaWNpw7NuIGNvbiBwYXNvLXQgZXMgbGEgdC1lc2ltYSBwb3RlbmNpYSBkZSBcKM6TKDEpXCksIGxhIG1hdHJpeiBkZSBwcm9iYWJpbGlkYWRlcyBkZSB0cmFuc2ljacOzbiBkZSB1biBwYXNvLiBMYSBtYXRyaXogXCjOkygxKVwpLCBsYSBjdWFsIHNlcsOhIGFicmV2aWFkYSBjb21vIFwozpNcKSwgZXMgdW5hIG1hdHJpeiBjdWFkcmFkYSBkZSBwcm9iYWJpbGlkYWRlcyBjb24gbGEgc3VtYSBkZSBzdXMgZmlsYXMgaWd1YWwgYSAxOgoKIVtdKC9Vc2Vycy9icmFjcnV6L0RvY3VtZW50cy84dm8uIFRyaW1lc3RyZSBJTy9TaXN0LiBFeHBlcnRvcyB5IFJlZGVzIFByb2IuL0NIMS9NYXRyaXoxLnBuZykKJCQKXHF1YWQKJCQKRG9uZGUgbSBkZW5vdGEgZWwgbnVtZXJvIGRlIGVzdGFkb3MgZGUgbGEgY2FkZW5hIGRlIE1hcmtvdi4gTGEgZGVjbGFyYWNpw7NuIGRlIHF1ZSBsYSBzdW1hIGRlIGxhcyBmaWxhcyBlcyBpZ3VhbCBhIDEgcHVlZGUgc2VyIGVzY3JpdG8gY29tbyBcKM6TMSc9MSdcKTsgZXNvIGVzLCBlbCB2ZWN0b3IgY29sdW1uYSBcKDHigJlcKSBlcyB1biBlaWdlbnZlY3RvciBkZXJlY2hvIGRlIFwozpNcKSB5IGNvcnJlc3BvbmRlIGFsIGVpZ2VudmFsb3IgMS4gTm9zIHJlZmVyaXJlbW9zIGEgXCjOk1wpIGNvbW8gbGEgbWF0cml6IGRlIHRyYW5zaWNpw7NuIGRlIHByb2JhYmlsaWRhZCAodC5wLm0pLiBNdWNob3MgYXV0b3JlcyB1dGlsaXphbiBlbiB2ZXogZGVsIHRlcm1pbm8g4oCcbWF0cml6IGRlIHRyYW5zaWNpw7Nu4oCdOyBldml0YXJlbW9zIGVzdGUgdGVybWlubyBkZWJpZG8gYSBwb3NpYmxlcyBjb25mdXNpb25lcyBjb24gY3VlbnRhcyBkZSBtYXRyaXogZGUgdHJhbnNpY2nDs24sIG8gaW50ZW5zaWRhZGVzIGRlIHVuYSBtYXRyaXogZGUgdHJhbnNpY2nDs24uCgpMYXMgcHJvYmFiaWxpZGFkZXMgaW5jb25kaWNpb25hbGVzIFwoUHJhKENfdD1qKVwpIGRlIHVuYSBjYWRlbmEgZGUgTWFya292IHNpZW5kbyBlbiB1biBlc3RhZG8gZGFkbyBlbiB1biB0aWVtcG8gZGFkbyB0IHNvbiBhIG1lbnVkbyBkZSBpbnRlcsOpcy4gRGVub3RhbW9zIGVzdG9zIHBvciBlbCB2ZWN0b3IgZmlsYToKCiQkdSh0KSA9IChQcihDX3Q9MSksLi4uLFByKENfdD1tKSksIHTiiIhOJCQKCk5vcyByZWZlcmltb3MgYSB1KDEpIGNvbW8gbGEgZGlzdHJpYnVjacOzbiBpbmljaWFsIGRlIHVuYSBjYWRlbmEgZGUgTWFya292IFBhcmEgZGVkdWNpciBsYSBkaXN0cmlidWNpw7NuIGVuIGVsIHRpZW1wbyB0KzEgZGVzZGUgZWwgY3VhbCBlbiB0IHBvc3QgbXVsdGlwbGljYW1vcyBwb3IgbGEgbWF0cml6IGRlIHRyYW5zaWNpw7NuIGRlIHByb2JhYmlsaWRhZCBcKM6TXCk6CgokJHUodCsxKT11KHQpXEdhbW1hICQkCkVqZW1wbG8uIEltYWdpbmVzZSBxdWUgbGEgZGVjbGFyYWNpw7NuIGRlIGTDrWFzIHNvbGVhZG9zIHkgbGx1dmlvc29zIGVzIHRhbCBxdWUgZWwgY2xpbWEgZGVsIGRpYSBkZXBlbmRlIHNvbGFtZW50ZSBlbiBlbCBkZWwgZGlhIGFudGVyaW9yLCB5IGxhcyBwcm9iYWJpbGlkYWRlcyBkZSB0cmFuc2ljacOzbiBlc3TDoW4gZGFkYXMgcG9yIGxhIHNpZ3VpZW50ZSB0YWJsYToKCiFbXSgvVXNlcnMvYnJhY3J1ei9Eb2N1bWVudHMvOHZvLiBUcmltZXN0cmUgSU8vU2lzdC4gRXhwZXJ0b3MgeSBSZWRlcyBQcm9iLi9DSDEvRWplbXBsbzFUYWJsYS5wbmcpCiQkClxxdWFkCiQkCgpFc3RvIGVzLCBzaSBob3kgZnVlIHVuIGRpYSBsbHV2aW9zbywgbGEgcHJvYmFiaWxpZGFkIHF1ZSBtYcOxYW5hIHNlYSBsbHV2aW9zbyBlcyBkZSAwLjk7IHNpIGhveSBlc3R1dm8gc29sZWFkbywgbGEgcHJvYmFiaWxpZGFkIGRlIGVzIDAuNi4gRWwgY2xpbWEgZXMgZW50b25jZXMgdW5hIGNhZGVuYSBkZSBNYXJrb3YgaG9tb2fDqW5lYSBkZSBkb3MgZXN0YWRvcywgY29uIHQucC5tLiBcKM6TXCkgZGFkbyBwb3IKCiQkClxHYW1tYSA9IAowLjkgIFxxdWFkIDAuMVxcClxxcXVhZDAuNiAgXHF1YWQgMC40IAokJAoKQWhvcmEgc3Vwb25nYSBxdWUgaG95ICh0aWVtcG8gMSkgZXMgdW4gZGlhIHNvbGVhZG8uIEVzdG8gc2lnbmlmaWNhIHF1ZSBsYSBkaXN0cmlidWNpw7NuIGRlbCBjbGltYSBkZWwgZGlhIGRlIGhveSBlczoKCiQkdSgxKSA9IChQcihDXzEgPSAxKSxQcihDXzEgPSAyKSkgPSAoMCwxKSQkCgpMYSBkaXN0cmlidWNpw7NuIGRlbCBjbGltYSBkZSBtYcOxYW5hLCBkZWwgcGFzYWRvIG1hw7FhbmEsIHkgYXNpLCBwdWVkZSBzZXIgY2FsY3VsYWRhIHBvc3QgbXVsdGlwbGljYW5kbyByZXBldGlkYW1lbnRlIFwodSgxKVwpIHBvciAgClwozpNcKSwgZWwgdC5wLm06CgokJAp1KDIpID0gKFByKENfMiA9IDEpLFByKENfMiA9IDIpKSA9IHUoMSlcR2FtbWEgPSAoMC42LDAuNClcXAp1KDMpID0gKFByKENfMyA9IDEpLFByKENfMyA9IDIpKSA9IHUoMilcR2FtbWEgPSAoMC43OCwwLjIyKQokJAoKIyMjMS4zLjIuIERpc3RyaWJ1Y2lvbmVzIGVzdGFjaW9uYXJpYXMKClVuYSBjYWRlbmEgZGUgTWFya292IGNvbiBtYXRyaXogZGUgdHJhbnNpY2nDs24gZGUgcHJvYmFiaWxpZGFkIM6TIHNlIGRpY2UgcXVlIHRpZW5lIHVuYSBkaXN0cmlidWNpw7NuIGVzdGFjaW9uYXJpYSDOtCAodW4gdmVjdG9yIGZpbGEgY29uIGVsZW1lbnRvcyBubyBuZWdhdGl2b3MpIHNpIM60zpM9zrQgeSDOtDHigJkgPSAxLiBFbCBwcmltZXJvIGRlIGVzdG9zIHJlcXVlcmltaWVudG9zIGV4cHJlc2EgbGEgZXN0YWNpb25hcmllZGFkLCBsYSBzZWd1bmRhIGVzIGVsIHJlcXVlcmltaWVudG8gcXVlIM60IGVzIHVuYSBkaXN0cmlidWNpw7NuIGRlIHByb2JhYmlsaWRhZC4gUG9yIGVqZW1wbG8sIGxhIGNhZGVuYSBkZSBNYXJrb3YgY29uIHQucC5tIGRhZG8gcG9yCgokJApcR2FtbWEgPSAxLzMgfCBccXVhZCAxLzN8IFxxdWFkIDEvM1xcClxxdWFkIDIvM3wgXHF1YWQgMHwgXHF1YWQgMS8zIFxcClxxdWFkIDEvMnwgXHF1YWQgMS8yfCBccXVhZCAwCiQkClRpZW5lIHVuYSBkaXN0cmlidWNpw7NuIGVzdGFjaW9uYXJpYSBcKM60PTEvMzIgKDE1LDksOClcKS4KCkRlc2RlIHF1ZSBcKHUodCsxKSA9IHUodCnOk1wpLCB1bmEgY2FkZW5hIGRlIE1hcmtvdiBpbmljaWFkYSBkZXNkZSBzdSBkaXN0cmlidWNpw7NuIGVzdGFjaW9uYXJpYSBjb250aW51YXJhIHRlbmllbmRvIGVzYSBkaXN0cmlidWNpw7NuIGVuIHRvZG9zIGxvIHB1bnRvcyBkZSB0aWVtcG8gc3Vic2VjdWVudGUsIHkgbm9zIHJlZmVyaXJlbW9zIGEgdGFsIHByb2Nlc28gY29tbyB1bmEgY2FkZW5hIGRlIE1hcmtvdiBlc3RhY2lvbmFyaWEuIEVzIHRhbHZleiB2YWxpb3NvIHJlc2FsdGFyIHF1ZSBlc3RvIGFzdW1lIG1hcyBxdWUgc29sYW1lbnRlIGhvbW9nZW5laWRhZC4gU29sbyBsYSBob21vZ2VuZWlkYWQgbm8gc2VyaWEgc3VmaWNpZW50ZSBwYXJhIHZvbHZlciBsYSBjYWRlbmEgZGUgTWFya292IHVuIHByb2Nlc28gZXN0YWNpb25hcmlvLCB5IHByZWZlcmltb3MgcmVzZXJ2YXIgZWwgYWRqZXRpdm8g4oCcZXN0YWNpb25hcmlv4oCdIHBhcmEgY2FkZW5hcyBkZSBNYXJrb3YgZXN0YWNpb25hcmlhcyBxdWUgdGllbmVuIGxhIHByb3BpZWRhZCBhZGljaW9uYWwgcXVlIGxhIGRpc3RyaWJ1Y2nDs24gaW5pY2lhbCBcKHUoMSlcKSBlcyBsYSBkaXN0cmlidWNpw7NuIGVzdGFjaW9uYXJpYSB5IHBvciBlbmRlIHByb2Nlc29zIGVzdGFjaW9uYXJpb3MuIAoKVW5hIGNhZGVuYSBkZSBNYXJrb3YgaXJyZWR1Y2libGUgKGhvbW9nw6luZWEsIHRpZW1wbyBkaXNjcmV0bywgZXN0YWRvLWVzcGFjaW8gZmluaXRvKSB0aWVuZSB1bmEgZGlzdHJpYnVjacOzbiBlc3RhY2lvbmFyaWEsIMO6bmljYSB5IGVzdHJpY3RhbWVudGUgcG9zaXRpdmEuIE7Ds3Rlc2Ugc2luIGVtYmFyZ28gbGEgc3Vwb3NpY2nDs24gZGUgaXJyZWR1Y3RpYmlsaWRhZCBlcyBuZWNlc2FyaWEgcGFyYSBlc3RhIGNvbmNsdXNpw7NuLCBsYSBhcGVyaW9kaWNpZGFkIG5vLgpTaSwgc2luIGVtYmFyZ28sIHVubyBhw7FhZGUgbGEgc3Vwb3NpY2nDs24gZGUgYXBlcmlvZGljaWRhZCwgdW5hIMO6bmljYSBkaXN0cmlidWNpw7NuIGxpbWl0YW50ZSBleGlzdGUsIHkgZXMgcHJlY2lzYW1lbnRlIGxhIGRpc3RyaWJ1Y2nDs24gZXN0YWNpb25hcmlhLiBEZXNkZSBxdWUgc2llbXByZSBkZWJlbW9zIGFzdW1pciBhcGVyaW9kaWNpZGFkIGUgaXJyZWR1Y3RpYmlsaWRhZCwgbG9zIHTDqXJtaW5vcyDigJxkaXN0cmlidWNpw7NuIGxpbWl0YW50ZeKAnSB5IOKAnGRpc3RyaWJ1Y2nDs24gZXN0YWNpb25hcmlh4oCdIHNvbiBzaW7Ds25pbW9zIHBhcmEgbnVlc3Ryb3MgcHJvcMOzc2l0b3MuCgpVbiByZXN1bHRhZG8gZ2VuZXJhbCBxdWUgcHVlZGUgc2VyIGNvbnZlbmllbnRlbWVudGUgdXNhZG8gcGFyYSBjb21wdXRhciB1bmEgZGlzdHJpYnVjacOzbiBlc3RhY2lvbmFyaWEuIEVsIHZlY3RvciBcKM60XCkgY29uIGVsZW1lbnRvcyBubyBuZWdhdGl2b3MgZXMgdW5hIGRpc3RyaWJ1Y2nDs24gZXN0YWNpb25hcmlhIGRlIGxhIGNhZGVuYSBkZSBNYXJrb3YgY29uIHQucC5tIM6TIHNpIHkgc29sbyBzaToKCiQkXGRlbHRhKElfbSAtIFxHYW1tYSArIFUpID0gMSQkCgpEb25kZSAxIGVzIHVuIHZlY3RvciBmaWxhIGRlIHVub3MsIFwoSV9tXCkgZXMgbGEgbWF0cml6IGlkZW50aWRhZCBtIHggbSwgeSBVIGVzIGxhIG1hdHJpeiBtIHggbSBkZSB1bm9zLiBBbHRlcm5hdGl2YW1lbnRlLCB1bmEgZGlzdHJpYnVjacOzbiBlc3RhY2lvbmFyaWEgcHVlZGUgc2VyIGVuY29udHJhZGEgYWwgYm9ycmFyIHVuYSBkZSBsYXMgZWN1YWNpb25lcyBlbiBlbCBzaXN0ZW1hIFwozrTOkz3OtFwpIHkgcmVlbXBsYXrDoW5kb2xhIHBvciBcKFxzdW1fac60X2k9MVwpLgoKIyMjMS4zLjMgRnVuY2nDs24gZGUgYXV0b2NvcnJlbGFjacOzbgoKVGVuZHJlbW9zIHVuYSBvcG9ydHVuaWRhZCwgcG9yIGVqZW1wbG8gZW4gbGEgU2VjY2lvbiAyLjIuMyB5IGVuIGVsIEVqZXJjaWNpbyA0KGYpIGVuIGVsIENhcGl0dWxvIDIsIHBhcmEgY29tcGFyYXIgbGFzIGZ1bmNpb25lcyBkZSBhdXRvY29ycmVsYWNpw7NuIChBQ0YpIGRlIHVubyBtb2RlbG8gb2N1bHRvIGRlIE1hcmtvdiBjb24gc3UgY2FkZW5hIGRlIE1hcmtvdiBzdWJ5YWNlbnRlIFwoe0NfdH1cKSwgZW4gbG9zIGVzdGFkb3MgXCgxLCAyLCDigKYsIG1cKS4gQXN1bWlyZW1vcyBxdWUgZXN0b3MgZXN0YWRvcyBzb24gY3VhbnRpdGF0aXZvcyB5IG5vIHNvbGFtZW50ZSBjYXRlZ8Ozcmljb3MuIExhIEFDRiBkZSBcKHtDX3R9XCksIGFzdW1pZGEgZXN0YWNpb25hcmlhIGUgaXJyZWR1Y2libGUsIHB1ZWRlIHNlciBvYnRlbmlkYSBkZSBsYSBzaWd1aWVudGUgbWFuZXJhLgpQcmltZXJvLCBkZWZpbmllbmRvIFwodiA9ICgxLCAyLCDigKYsIG0pXCkgeSBcKFYgPSBkaWFnKDEsIDIsIOKApiwgbSlcKSwgdGVuZW1vcywgcGFyYSB0b2RvcyBsb3MgZW50ZXJvcyBrIG5vIG5lZ2F0aXZvcywKJCQKQ292KENfdCxDX3t0K2t9KSA9IFxkZWx0YSBWXEdhbW1hXmt2JyAtIChcZGVsdGEgdicpXjIKJCQKU2VndW5kbywgc2kgzpMgZXMgZGlhZ29uaXphYmxlLCB5IHN1cyBlaWdlbnZhbG9yZXMgKG90cm8gZGUgMSkgc29uIGRlbm90YWRvcyBwb3Igd18yLCB3XzMsIOKApiwgd19tLCBlbnRvbmNlcyDOkyBwdWVkZSBzZXIgZXNjcml0byBjb21vOgoKJCRcR2FtbWEgPSBVIFxPbWVnYSBVXnstMX0gICQkCkRvbmRlIFwozqlcKSBlcyBcKGRpYWcoMSwgd18yLCB3XzMsIOKApiwgd19tKVwpIHkgbGFzIGNvbHVtbmFzIGRlIFUgc29uIGVpZ2VudmVjdG9yZXMgZGVyZWNob3MgY29ycmVzcG9uZGllbnRlcyBkZSBcKM6TXCkuIEVudG9uY2VzIHRlbmVtb3MsIHBhcmEgZW50ZXJvcyBubyBuZWdhdGl2b3MgaywKCiQkCkNvdihDX3QsQ197dCtrfSkgPSBcZGVsdGEgViBVIFxPbWVnYV5rIFVeey0xfSB2JyAtIChcZGVsdGEgdicpXjIgXFwKPSBhXE9tZWdhXmsgYicgLSBhXzFiXzEgXFwKPVxzdW1fe2k9Mn1ebSBhX2liX2l3X2leawokJApkb25kZSBhID0gXChcZGVsdGEgVlVcKSB5IGInID0gXChVXnstMX1cKS4gUG9yIGxvIHRhbnRvIFwoVmFyKENfdCApPVxzdW1fe2k9Mn1ebSBhX2kgYl9pXCkgeSwgcGFyYSBlbnRlcm9zIG5vIG5lZ2F0aXZvcyBrOgoKJCQKXHJobyhrKSA9IENvcnIoQ190LENfe3Qra30pID0gXHN1bV97aT0yfV5tIGFfaWJfaXdfaV5rIC8gXHN1bV97aT0yfV5tIGFfaWJfaQokJAoKRXN0byBlcyB1biBwZXNvIHByb21lZGlvIGRlIGxhcyBrLWVzaW1hcyBwb3RlbmNpYXMgZGUgbG9zIGVpZ2VudmFsb3JlcyBcKHdfMiwgd18zLCDigKYsIHdfbVwpLCB5IGRlIGFsZ3VuYSBtYW5lcmEgc2ltaWxhcmVzIGEgbGEgQUNGIGRlIHVuIHByb2Nlc28gYXV0byByZWdyZXNpdm8gR2F1c3NpYW5vIGRlIG9yZGVuIG0tMS4gTsOzdGVzZSBxdWUgbGEgZWN1YWNpw7NuIGFudGVyaW9yIGltcGxpY2EgZW4gZWwgY2FzbyBtPTIgcXVlIFwoz4Eoayk9z4EoMSlea1wpIHBhcmEgdG9kb3MgbG9zIGVudGVyb3Mgbm8gbmVnYXRpdm9zIGssIHkgcXVlIFwoz4EoMSlcKSBlcyBlbCBlaWdlbnZhbG9yIGRpc3RpbnRvIGEgMSBkZSBcKM6TXCkuCgojIyMxLjMuNC4gRXN0aW1hbmRvIHByb2JhYmlsaWRhZGVzIGRlIHRyYW5zaWNpw7NuCgpTaSBub3MgZGFuIHVuYSByZWFsaXphY2nDs24gZGUgdW5hIGNhZGVuYSBkZSBNYXJrb3YsIHkgZGVzZWFtb3MgZXN0aW1hciBsYXMgcHJvYmFiaWxpZGFkZXMgZGUgdHJhbnNpY2nDs24sIHVuIGVuZm9xdWUg4oCTIHBlcm8gbm8gc29sbyBlbCDDum5pY28g4oCTIGVzIGVsIGVuY29udHJhciBsYXMgY3VlbnRhcyBkZSB0cmFuc2ljacOzbiB5IGVzdGltYXIgbGFzIHByb2JhYmlsaWRhZGVzIGRlIHRyYW5zaWNpw7NuIGNvbW8gZnJlY3VlbmNpYXMgcmVsYXRpdmFzLiBQb3IgZWplbXBsbywgc2kgbGEgQ00gdGllbmUgdHJlcyBlc3RhZG9zIHkgbGEgc2VjdWVuY2lhIG9ic2VydmFkYSBlczoKClwoCjIzMzIxMTExMTIgMzEzMjMzMjEyMiAzMjMyMzMyMjIyIDMxMzIzMzIyMTIgMzIzMjEzMjIzMiAzMTMyMzMyMjIzIDMyMzIzMzEyMzIgMzIzMjMzMTIyMiAzMjMyMTMyMTIzIDMxMzIzMzIxMjEKXCkKCkVudG9uY2VzIGxhIG1hdHJpeiBkZSBjdWVudGFzIGRlIHRyYW5zaWNpw7NuIGVzOgoKJCQKKGZfe2lqfSkgPSA0IFxxdWFkIDcgXHF1YWQgNiBcXApccXF1YWRccXF1YWQ4IFxxdWFkIDEwIFxxdWFkIDI0IFxcClxxcXVhZFxxcXVhZCA2IFxxdWFkIDI0IFxxdWFkIDEwCiQkCgpEb25kZSBcKGZfaWpcKSBkZW5vdGEgZWwgbnVtZXJvIGRlIHRyYW5zaWNpb25lcyBvYnNlcnZhZGFzIGRlbCBlc3RhZG8gaSBhbCBlc3RhZG8gai4gRGVzZGUgcXVlIGVsIG51bWVybyBkZSB0cmFuc2ljaW9uZXMgZGVsIGVzdGFkbyAyIGFsIGVzdGFkbyAzIGVzIDI0LCB5IGVsIG51bWVybyB0b3RhbCBkZSB0cmFuc2ljaW9uZXMgZGVsIGVzdGFkbyAyIGVzIDgrMTArMjQsIHVuIGVzdGltYWRvIGRlIGZyZWN1ZW5jaWEgcmVsYXRpdmEgZGUgXCjOs18yM1wpIGVzIDI0LzQyLiBFbCB0LnAubSBcKM6TXCkgZXMgZW50b25jZXMgZXN0aW1hZG8gcG9yOgoKJCQKKGZfe2lqfSkgPSA0LzE3IFxxdWFkIDcvMTcgXHF1YWQgNi8xNyBcXApccXF1YWRccXF1YWQ4LzQyIFxxdWFkIDEwLzQyIFxxdWFkIDI0LzQyIFxcClxxcXVhZFxxcXVhZCA2LzQwIFxxdWFkIDI0LzQwIFxxdWFkIDEwLzQwCiQkCgpBaG9yYSBtb3N0cmFyZW1vcyBxdWUgZXN0byBlcyBkZSBoZWNobyBlbCBlc3RpbWFkbyBjb25kaWNpb25hbCBNTCBkZSBcKM6TXCksIGNvbmRpY2lvbmFkYSBlbiBsYSBwcmltZXJhIG9ic2VydmFjacOzbi4KU3Vwb25nYW1vcyBlbnRvbmNlcyBxdWUgZGVzZWFtb3MgZXN0aW1hciBsb3MgXChtXjItbVwpIHBhcsOhbWV0cm9zIFwozrNfe2lqfSAoaeKJoGopXCkgZGUgdW5hIGNhZGVuYSBlIE1hcmtvdiBkZSBlc3RhZG8gbSBcKHtDX3R9XCkgZGUgdW5hIHJlYWxpemFjacOzbiBjXzEsIGNfMiwg4oCmLCBjX1QuIExhIHBvc2liaWxpZGFkIGNvbmRpY2lvbmFkYSBlbiBsYSBwcmltZXJhIG9ic2VydmFjacOzbiBlczoKCiQkCkwgPSBccHJvZF97aT0xfV5tXHByb2Rfe2o9MX1ebSBcZ2FtbWFfe2lqfV57Zl97aWp9fQokJApFbCByZWdpc3RybyBkZSBwcm9iYWJpbGlkYWQgZXMgZW50b25jZXM6CgokJApsID0gXHN1bV97aT0xfV5tKFxzdW1fe2o9MX1ebSBmX3tpan0gbG9nIFxnYW1tYV97aWp9KSA9IFxzdW1fe2k9MX1ebSBsX2koKQokJAoKWSBwb2RlbW9zIG1heGltaXphciBsIGFsIG1heGltaXphciBjYWRhIFwobF9pXCkgcG9yIHNlcGFyYWRvLiBTdXN0aXR1eWVuZG8gXCgxLVxzdW1feyhr4omgaSl9zrNfe2lrfVwpICAgcGFyYSBcKM6zX2lpXCkgZGlmZXJlbmNpYW5kbyBcKGxfaVwpIGNvbiByZXNwZWN0byBhIHVuYSBwb3NpYmlsaWRhZCBkZSB0cmFuc2ljacOzbiBmdWVyYSBkZSBsYSBkaWFnb25hbCBcKM6zX2lqXCkgZSBpZ3VhbGFuZG8gbGEgZGVyaXZhZGEgYSBjZXJvIHJlbmRpbWllbnRvcwoKJCQKMCA9IFxmcmFjey1mX3tpaX19ezEtXHN1bV97a+KJoGl9XGdhbW1hX3tpa30gK1xmcmFje2Zfe2lqfX17XGdhbW1hX3tpan19ID0gIC1cZnJhY3tmX3tpaX19e1xnYW1tYV97aWl9fStcZnJhY3tmX3tpan19e1xnYW1tYV97aWp9fX0KJCQKCkVudG9uY2VzLCBhIG1lbm9zIHF1ZSB1biBkZW5vbWluYWRvciBzZWEgY2VybyBlbiBsYSBlY3VhY2nDs24gc3VwZXJpb3IsXCggZl97aWp9IM6zX3tpaX09Zl97aWl9IM6zX3tpan0gXCl5IGVudG9uY2VzIFwozrNfe2lpfSBcc3VtX3soaj0xKX1ebWZfe2lqfT1mX3tpaX1cKS4gRXN0byBpbXBsaWNhIHF1ZSwgZW4gdW4gbcOheGltbyBkZSBsYSBwb3NpYmlsaWRhZCwKCiQkClxnYW1tYV97aWl9ID0gZl97aWl9L1xzdW1fe2o9MX1ebSBmX3tpan0gXHF1YWQgeSBccXVhZCBcZ2FtbWFfe2lqfSA9IGZfe2lqfS9cc3VtX3tqPTF9Xm0gZl97aWp9CiQkCgooUG9kcsOtYW1vcyB1dGlsaXphciBtdWx0aXBsaWNhZG9yZXMgZGUgTGFncmFuZ2UgcGFyYSBleHByZXNhciBsYXMgcmVzdHJpY2Npb25lcyBcKFxzdW1fe2o9MX1ebc6zX3tpan09MVwpIHN1amV0byBhbCBjdWFsIGJ1c2NhbW9zIG1heGltaXphciBsb3MgdMOpcm1pbm9zIFwobF9pXCkgeSBwb3IgZW5kZSBsYSBwb3NpYmlsaWRhZDsgZXMgc29sbyBsYSBwcm9iYWJpbGlkYWQgZGUgdHJhbnNpY2nDs24gZW1ww61yaWNhIOKAkyBlcyBlbnRvbmNlcyB2aXN0byBhIHNlciB1biBlc3RpbWFkb3IgY29uZGljaW9uYWwgTUwgZGUgXCjOs19palwpLiBFbCBlc3RpbWFkb3IgXCjOk1wpIHNhdGlzZmFjZSBlbCByZXF1ZXJpbWllbnRvIHF1ZSBsYSBzdW1hIGRlIGxhcyBmaWxhcyBlcyBpZ3VhbCBhIDEuCgpMYSBzdXBvc2ljaW9uIGRlIGVzdGFjaW9uYXJpZWRhZCBkZSBsYSBjYWRlbmEgZGUgTWFya292IG5vIGZ1ZSB1c2FkYSBlbiBsYSBkZXJpdmFjacOzbiBzdXBlcmlvci4gU2kgZGVzZWFtb3MgYXN1bWlyIGxhIGVzdGFjaW9uYXJpZWRhZCwgcG9kZW1vcyB1c2FyIGxhIHBvc2liaWxpZGFkIGluY29uZGljaW9uYWwuIEVzdGEgZXMgbGEgcG9zaWJpbGlkYWQgY29uZGljaW9uYWwgbW9zdHJhZGEgYW50ZXJpb3JtZW50ZSwgbXVsdGlwbGljYWRhIHBvciBsYSBwcm9iYWJpbGlkYWQgZXN0YWNpb25hcmlhIM60X2MxLiBMYSBwb3NpYmlsaWRhZCBpbmNvbmRpY2lvbmFsIG8gc3UgbG9nYXJpdG1vIHB1ZWRlbiBzZXIgZW50b25jZXMgbWF4aW1pemFkb3MgbnVtw6lyaWNhbWVudGUsIHN1amV0byBhIHJlc3RyaWNjaW9uZXMgbm8gbmVnYXRpdmFzIHkgc3VtYSBkZSBmaWxhcywgZW4gb3JkZW4gcGFyYSBlc3RpbWFyIGxhcyBwcm9iYWJpbGlkYWRlcyBkZSB0cmFuc2ljacOzbiBcKM6zX3tpan1cKS4gQmlzZ2FhcmQgeSBUcmF2aXMgKDE5OTEpIG11ZXN0cmFuIGVuIGVsIGNhc28gZGUgdW5hIGNhZGVuYSBkZSBNYXJrb3YgZGUgZG9zIGVzdGFkb3MgcXVlLCBleGNlcHRvIGVuIGFsZ3Vub3MgY2Fzb3MgZXh0cmVtb3MsIGVjdWFjaW9uZXMgZGUgcG9zaWJpbGlkYWQgaW5jb25kaWNpb25hbCB0aWVuZW4gdW5hIMO6bmljYSBzb2x1Y2nDs24uIFBhcmEgYWxndW5vcyBjYXNvcyBlc3BlY2lhbGVzIG5vIHRyaXZpYWxlcyBkZSBsYSBjYWRlbmEgZGUgZG9zIGVzdGFkb3MsIHRhbWJpw6luIGRlcml2YW4gZXhwcmVzaW9uZXMgZXhwbGljaXRhcyBwYXJhIGxvcyBlc3RpbWFkb3MgaW5jb25kaWNpb25hbGVzIGRlIHBvc2liaWxpZGFkIG3DoXhpbWEgKE1MRXMpIGRlIGxhcyBwcm9iYWJpbGlkYWRlcyBkZSB0cmFuc2ljacOzbi4gRGVzZGUgcXVlIHVzYW1vcyB0YWwgcmVzdWx0YWRvIGx1ZWdvLCBsbyBkZWNsYXJhbW9zIGFxdcOtLgpTdXBvbmdhIHF1ZSBsYSBjYWRlbmEgZGUgTWFya292IFwoe0NfdH1cKSB0b21hIGxvcyB2YWxvcmVzIDAgeSAxLCB5IHF1ZSBkZXNlYW1vcyBlc3RpbWFyIGxhcyBwcm9iYWJpbGlkYWRlcyBkZSB0cmFuc2ljacOzbiBcKM6zX3tpan1cKSBkZSB1bmEgc2VjdWVuY2lhIGRlIG9ic2VydmFjaW9uZXMgZW4gZWwgY3VhbCBoYXkgXChmX3tpan1cKXRyYW5zaWNpb25lcyBkZWwgZXN0YWRvIGkgYWwgZXN0YWRvIGogKGksaj0wLDEpLCB5IFwoZl97MTF9PjBcKSBwZXJvIFwoZl97MDB9PTBcKS4gQXNpIHF1ZSBlbiBsYXMgb2JzZXJ2YWNpb25lcyB1biBjZXJvIHNpZW1wcmUgZXMgc2VndWlkbyBwb3IgdW4gdW5vLiBEZWZpbmFzZSBcKGM9Zl97MTB9KygxLWNfMSlcKSB5IFwoZD1mX3sxMX1cKS4gRW50b25jZXMgbGFzIE1MRXMgaW5jb25kaWNpb25hbGVzIGRlIGxhcyBwcm9iYWJpbGlkYWRlcyBkZSB0cmFuc2ljacOzbiBlc3TDoW4gZGFkYXMgcG9yOgoKJCQKXGdhbW1hX3swMX0gPSAxIFxxdWFkIHkgXHF1YWQgXGdhbW1hX3sxMH0gPSBcZnJhY3stKDErZCkrKCgxK2QpKV4yICsgNGMoYytkLTEpKV57MS8yfX17MihjK2QrMSl9CiQkCgojIyMxLjMuNS4gQ2FkZW5hcyBkZSBNYXJrb3YgZGUgb3JkZW4gc3VwZXJpb3IKCgpFbiBjYXNvcyBkb25kZSBvYnNlcnZhY2lvbmVzIGVuIHVuIHByb2Nlc28gY29uIGVzcGFjaW8geSBlc3RhZG8gZmluaXRvIGFwYXJlY2VuIG5vIHNhdGlzZmFjZXIgbGEgcHJvcGllZGFkIGRlIE1hcmtvdiwgdW5hIHBvc2liaWxpZGFkIHF1ZSBzdWdpZXJlIGEgc2kgbWlzbWEgZXMgZWwgdXRpbGl6YXIgdW5hIGNhZGVuYSBkZSBNYXJrb3YgZGUgb3JkZW4gc3VwZXJpb3IsIGVzdG8gZXMsIHVuIG1vZGVsbyBcKHtDX3R9XCkgc2F0aXNmYWNpZW5kbyBsYSBzaWd1aWVudGUgZ2VuZXJhbGl6YWNpw7NuIGRlIGxhIHByb3BpZWRhZCBkZSBNYXJrb3YgcGFyYSBhbGd1bm9zIGziiaUyOiAKCiQkClByKENfdCB8IENfe3QtMX0gPSBqXzEsLi4uLENfe3QtbH09al9sKSA9IFxzdW1fe2k9MX1ebCBcbGFtYmRhX2kgcShqX2ksal9vKQokJApVbiByZWdpc3RybyBkZSB0YWwgb3JkZW4gZGUgY2FkZW5hcyBkZSBNYXJrb3YgcHVlZGUgc2VyIGVuY29udHJhZG8sIHBvciBlamVtcGxvLCBlbCBMbG95ZCAoMTk4MCwgU2VjY2nDs24gMTkuOSkuIEF1bnF1ZSB0YWwgbW9kZWxvIG5vIGVzIGVuIHVuIHNlbnRpZG8gdXN1YWwgdW5hIGNhZGVuYSBkZSBNYXJrb3YsIHBvZGVtb3MgcmVkZWZpbmlyIGVsIG1vZGVsbyBkZSB0YWwgbWFuZXJhIGNvbW8gcGFyYSBwcm9kdWNpciB1biBwcm9jZXNvIGVxdWl2YWxlbnRlLiBTaSBwZXJtaXRpbW9zIHF1ZSBcKFlfdD0oQ197KHQtbCsxKX0sQ197KHQtbCsyKX0s4oCmLENfdClcKSwgZW50b25jZXMge1lfdH0gZXMgdW5hIGNhZGVuYSBkZSBNYXJrb3YgZGUgcHJpbWVyIG9yZGVuIGVuIE1ebCwgZG9uZGUgTSBlcyBlbCBlc3BhY2lvIGRlIGVzdGFkbyBkZSB7Q190fS4KQXVucXVlIGFsZ3VuYXMgcHJvcGllZGFkZXMgcHVlZGVuIHNlciByYXJhcyBkZSBlc3RhYmxlY2VyLCBuaW5ndW5hIG51ZXZhIHRlb3LDrWEgZXMgaW52b2x1Y3JhZGEgZW4gYW5hbGl6YXIgdW5hIGNhZGVuYSBkZSBNYXJrb3YgZGUgb3JkZW4gc3VwZXJpb3IgbWFzIHF1ZSB1bmEgZGUgcHJpbWVyIG9yZGVuLgpVbmEgY2FkZW5hIGRlIE1hcmtvdiBkZSBzZWd1bmRvIG9yZGVuLCBzaSBlcyBlc3RhY2lvbmFyaWEsIGVzdGEgY2FyYWN0ZXJpemFkYSBwb3IgbGFzIHByb2JhYmlsaWRhZGVzIGRlIHRyYW5zaWNpw7NuOgoKJCQKXGdhbW1hKGksaixrKSA9IFByKENfdD1rIHwgQ197dC0xfSA9IGosIENfe3QtMn0gPSBpKQokJAoKWSB0aWVuZSB1bmEgZGlzdHJpYnVjacOzbiBlc3RhY2lvbmFyaWEgZGUgdmFyaWFibGUgZG9ibGUgXCh1KGosayk9UHJhKENfe3QtMX09aixDX3Q9aylcKSBxdWUgc2F0aXNmYWNlCgokJAp1KGosaykgPSBcc3VtX3tpPTF9Xm0gdShpLGopXGdhbW1hKGksaixrKSBccXVhZCB5IFxxdWFkIFxzdW1fe2o9MX1ebVxzdW1fe2s9MX1ebSB1KGosaykgPTEKJCQKClBvciBlamVtcGxvLCBsYSBjYWRlbmEgZGUgTWFya292IGVzdGFjaW9uYXJpYSBkZSBzZWd1bmRvIG9yZGVuIG1hcyBnZW5lcmFsIFwoe0NfdH1cKSwgZW4gbG9zIGRvcyBlc3RhZG9zIDEgeSAyLCBlc3RhIGNhcmFjdGVyaXphZGEgcG9yIGxhcyBzaWd1aWVudGVzIGN1YXRybyBwcm9iYWJpbGlkYWRlcyBkZSB0cmFuc2ljacOzbjoKCiQkCmEgPSBQcihDX3Q9MiB8IENfe3QtMX09MSwgQ197dC0yfSA9IDEpIFxcCmIgPSBQcihDX3Q9MSB8IENfe3QtMX09MiwgQ197dC0yfSA9IDIpIFxcCmMgPSBQcihDX3Q9MSB8IENfe3QtMX09MiwgQ197dC0yfSA9IDEpIFxcCmQgPSBQcihDX3Q9MiB8IENfe3QtMX09MSwgQ197dC0yfSA9IDIpIFxcCiQkCkVsIHByb2Nlc28gXCh7WV90IH09eyhDX3t0LTF9LENfdCApfVwpIGVzIGVudG9uY2VzIHVuYSBjYWRlbmEgZGUgTWFya292IGRlIHByaW1lciBvcmRlbiwgY29uIGxvcyBjdWF0cm8gZXN0YWRvcyAoMSwxKSwgKDEsMiksICgyLDEpLCAoMiwyKSwgY29uIG1hdHJpeiBkZSB0cmFuc2ljacOzbiBkZSBwcm9iYWJpbGlkYWRlcwoKJCQKXGxlZnQoXGJlZ2lue2FycmF5fXtjY30gCjEtYSAmIGEgJiAwICYgMFxcIAowICYgMCAmIGMgJiAxLWMgXFwKMS1kICYgZCAmIDAgJiAwIFxcCjAgJiAwICYgYiAmIDEtYgpcZW5ke2FycmF5fVxyaWdodCkKJCQKCk5vdGUgbG9zIGNlcm9zIGVzdHJ1Y3R1cmFsZXMgcXVlIGFwYXJlY2VuIGVuIGxhIG1hdHJpei4gTm8gZXMgcG9zaWJsZSwgcG9yIGVqZW1wbG8sIGhhY2VyIHVuYSB0cmFuc2ljacOzbiBkaXJlY3RhIGRlICgyLDEpIGEgKDIsMik7IHBvciBsbyB0YW50bywgZWwgY2VybyBlbiBsYSBmaWxhIDMgeSBjb2x1bW5hIDQgZW4gZWwgdC5wLm0uIExvcyBwYXLDoW1ldHJvcyBhLCBiLCBjIHkgZCBlc3TDoW4gbGltaXRhZG9zIGEgMCB5IDEgcGVybyBzb24gc2luIHJlc3RyaWNjaW9uZXMgZW4gb3RybyBjYXNvLiBMYSBkaXN0cmlidWNpw7NuIGVzdGFjaW9uYXJpYSBkZSBcKHtZX3R9XCkgZXMgcHJvcG9yY2lvbmFsIGFsIHZlY3RvcgoKJCQoYigxLWQpLGFiLGFiLGEoMS1jKSkkJAoKRGVsIGN1YWwgc2UgZGljZSBxdWUgbGEgbWF0cml6IFwodShqLGspXCkgZGUgcHJvYmFiaWxpZGFkZXMgYmktdmFyaWFibGUgZXN0YWNpb25hcmlhIHBhcmEgXCh7Q190IH1cKSBlczoKCiQkClxmcmFjezF9e2IoMS1kKSsyYWIrYSgxLWMpfQpcbGVmdChcYmVnaW57YXJyYXl9e2NjfSAKYigxLWQpICYgYWJcXCAKYWIgJiBhKDEtYykKXGVuZHthcnJheX1ccmlnaHQpCiQkCgoKRWwgdXNvIGRlIHVuYSBjYWRlbmEgZGUgTWFya292IGdlbmVyYWwgZGUgb3JkZW4gc3VwZXJpb3IgaW5jcmVtZW50YSBlbCBuw7ptZXJvIGRlIHBhcsOhbWV0cm9zIGRlbCBtb2RlbG87IHVuYSBjYWRlbmEgZGUgTWFya292IGdlbmVyYWwgZGUgb3JkZW4gbCBlbiBtIGVzdGFkb3MgdGllbmUgXChtXmwgKG0tMSlcKSBwcm9iYWJpbGlkYWRlcyBkZSB0cmFuc2ljaW9uIGluZGVwZW5kaWVudGVzLiBQZWdyYW0gKDE5ODApIHkgUmFmdGVyeSAoMTk4NSkgaGFuIHBvciBsbyB0YW50byBwcm9wdWVzdG8gY2llcnRhcyBjbGFzZXMgZGUgbW9kZWxvcyBwYXJhIGNhZGVuYXMgZGUgb3JkZW4gc3VwZXJpb3IuIEVsIG1vZGVsbyBkZSBQZWdyYW0gdGllbmUgbStsLTEgcGFyYW1ldHJvcywgeSBhcXVlbGxvcyBkZSBSYWZ0ZXJ5IG0obS0xKStsLTEuIFBhcmEgbT0yIGxvcyBtb2RlbG9zIHNvbiBlcXVpdmFsZW50ZXMsIHBlcm8gcGFyYSBtPjIgYXF1ZWxsb3MgZGUgUmFmdGVyeSBzb24gbWFzIGdlbmVyYWxlcyB5IHB1ZWRlbiByZXByZXNlbnRhciB1biByYW5nbyBtYXMgYW1wbGlvIGRlIHBhdHJvbmVzIGRlIGRlcGVuZGVuY2lhIHkgZXN0cnVjdHVyYXMgZGUgYXV0b2NvcnJlbGFjacOzbi4gRW4gYW1ib3MgY2Fzb3MgdW4gaW5jcmVtZW50byBkZSB1bm8gZW4gZWwgb3JkZW4gZGUgbGEgY2FkZW5hIGRlIE1hcmtvdiByZXF1aWVyZSBzb2xhbWVudGUgZGUgdW4gcGFyw6FtZXRybyBhZGljaW9uYWwuCk1vZGVsb3MgZGUgUmFmdGVyeSwgYSBsb3MgY3VhbGVzIGVsIHNlIHJlZmllcmUgY29tbyBtb2RlbG9zIGRlIOKAnGRpc3RyaWJ1Y2nDs24gZGUgdHJhbnNpY2nDs24gZGUgbGEgbWV6Y2xh4oCdIChNVEQpLCBzb24gZGVmaW5pZG9zIGNvbW8gc2lndWUuIEVsIHByb2Nlc28gXCh7Q190fVwpIHRvbWEgdmFsb3JlcyBcKE09ezEsMizigKYsbX1cKSB5IHNhdGlzZmFjZQoKJCRQcihDX3QgPSBqXzAgfCBDX3t0LTF9ID0gal8xLC4uLiwgQ197dC1sfSA9IGpfbCkgPSBcc3VtX3tpLTF9XmwgXGxhbWJkYV9pIHEoal9pLGpfMCkkJApEb25kZSBcKFxzdW1fe2k9MX1ebCDOu19pPTFcKSwgeSBcKFE9KHEoaixrKSlcKSBlcyB1bmEgbWF0cml6IG3Dl20gY29uIGVudHJhZGFzIG5vIG5lZ2F0aXZhcyB5IGxhIHN1bWEgZGUgc3VzIGZpbGFzIGVxdWl2YWxlIGEgdW5vLCB0YWwgcXVlIGVsIGxhZG8gZGVyZWNobyBkZSBsYSBlY3VhY2nDs24gYW50ZXJpb3IgZXN0YSBsaW1pdGFkYSBwb3IgY2VybyB5IHVubyBwYXJhIHRvZG8gXChqX28sal8xLOKApixqX2ziiIhNXCkuIEVzdGUgw7psdGltbyByZXF1ZXJpbWllbnRvLCBlbCBjdWFsIGdlbmVyYWwgbV4obCsxKSBwYXJlcyBkZSByZXN0cmljY2lvbmVzIG5vIGxpbmVhcmVzIGVuIGxvcyBwYXLDoW1ldHJvcywgYXNlZ3VyYSBxdWUgbGFzIHByb2JhYmlsaWRhZGVzIGNvbmRpY2lvbmFsZXMgZW4gbGEgZWN1YWNpw7NuIGFudGVyaW9yIHNvbiBlbiBlZmVjdG8gcHJvYmFiaWxpZGFkZXMsIHkgbGEgY29uZGljacOzbiBlbiBsYSBzdW1hIGRlIGZpbGFzIGRlIFEgYXNlZ3VyYSBxdWUgbGEgc3VtYSBzb2JyZSBcKGpfMFwpIGRlIGVzdGFzIHByb2JhYmlsaWRhZGVzIGNvbmRpY2lvbmFsZXMgZXMgdW5vLiBOb3RlIHF1ZSBSYWZ0ZXJ5IG5vIGFzdW1lIHF1ZSBsb3MgcGFyw6FtZXRyb3MgXCjOu19pXCksIHNvbiBubyBuZWdhdGl2b3MuCgoKCgoKCgoKCgoKCgoKCgo=