El modelo
Generalidades
Se exponen los principios fundamentales del análisis de correspondencia simple, junto con un ejemplo que destaca la relevancia de esta técnica en contextos específicos, ilustrando la relación entre variables nominales en un mapa perceptual y la interacción entre sus categorías.
El análisis de correspondencia simple aborda la exploración de tablas cruzadas, donde las celdas reflejan algún tipo de relación entre las filas y columnas de una matriz. Este método condensa la información contenida en una tabla de contingencia, ofreciendo dos enfoques interpretativos. Por un lado, se visualiza como una herramienta para representar las variables en un espacio de menor dimensión, y por otro, como un método objetivo para asignar valores numéricos a variables cualitativas.
Un ejemplo paradigmático de aplicación del análisis de correspondencia simple se encuentra en los cursos introductorios de estadística, particularmente en los problemas que abordan la independencia entre dos variables categóricas.
Supongamos la presencia de dos variables categóricas, X e Y, con I y J categorías respectivamente, definidas en una población. La pregunta clave es determinar si estas variables son independientes. Bajo la hipótesis nula:
H0:Las variables X y Y son estadísticamente independientes
versus la hipótesis alternativa:
H1:Las variables X y Y no son estadísticamente independientes.
Matrices de frecuencias absolutas
Supongamos que disponemos de una tabla de contingencia que surge de n elementos seleccionados de una población, donde las variables categóricas X y Y están definidas. La intersección entre una fila i y una columna j representa la frecuencia de individuos que pertenecen a la categoría i de la variable X y a la categoría j de la variable Y simultáneamente, con i=1,…,K y j=1,…,J. Esto se ilustra en la matriz de frecuencias absolutas siguiente, que será referida como F:
F=(X∖Y12…J1F11F12…F1J2F21F22…F2J⋮MFK1FK2…FKJ)=(Fij)I×J
Ejemplo.
Véase la Figura 2.1.
Matrices de frecuencias relativas
Sea
n:=J∑i=1K∑j=1Fij
Multiplicar la matriz F por 1n nos proporciona la matriz de frecuencias relativas P=1nF, donde P es la matriz de frecuencias relativas conocida como matriz de correspondencia y n=1TK×1F1J×1 representa el número total de individuos en la tabla.
Es claro que las frecuencias absolutas no son adecuadas para comparar filas o columnas, por lo que se recurre a la matriz de frecuencias relativas (matriz de correspondencia) P. Esta matriz se define explícitamente como la matriz de orden K×J que centra la tabla siguiente:
P=(X∖Y12…JMarginal fila1p11p12…p1Jf12p21p22…p2Jf2⋮⋮KpK1pK2…pKJfKMarginal columnac1c2…cJ1),
donde
pij=Fijn,fi=J∑j=1pij,cj=K∑i=1pijyJ∑j=1cj=K∑i=1fi=J∑i=1K∑j=1pij=1.
Ejemplo.
Véase la Figura 2.2.
Marginales
Denotaremos como fi la frecuencia marginal de la i-ésima fila y como cj la frecuencia marginal de la j-ésima columna, donde i=1,…,K y j=1,…,J, o de manera vectorial:
f=P1J×1yc=PT1K×1,
vectores que representan las frecuencias marginales de filas y columnas, respectivamente.
Independencia
El estadístico
Es conocido que el estadístico más frecuentemente empleado para analizar la independencia estadística entre dos variables categóricas es:
X2(K−1)×(J−1)=J∑i=1K∑j=1(Fij−E[Fij)]2E(Fij)=n2J∑i=1K∑j=1[Fijn−E(Fijn)]2E(Fij)=J∑i=1K∑j=1[Fijn−E(Fijn)]2E[Fijn]=n2J∑i=1K∑j=1(pij−eij)2eij,
donde:
E(Fij) representa la frecuencia absoluta esperada en la casilla (i,j) de la matriz F, y
eij es la frecuencia relativa esperada en la casilla (i,j) de la matriz de correspondencia P.
Observemos que, de (3.1), se tiene que
1nX2(K−1)×(J−1)=J∑i=1K∑j=1(pij−eij)2eij.
Para el ejemplo:
##
## Pearson's Chi-squared test
##
## data: tabla
## X-squared = 1240, df = 12, p-value < 2.2e-16
Matrices de residuos estandarizados
Si definimos Df y Dc como las matrices diagonales Df=diag(f)I×I y Dc=diag(c)J×J, representando las frecuencias marginales de filas y columnas respectivamente, entonces la matriz
S=D−1/2f(P−fcT)D−1/2c
es la matriz de residuos estandarizados. Se puede demostrar que
SSTySTS
son matrices simétricas, cuya traza es precisamente el estadístico de prueba en la prueba de independencia para dos variables categóricas, es decir,
traza(SST)=traza(STS)J∑i=1K∑j=1(pij−ficj)2eij.
Descomposición en valores singulares
Si realizamos la descomposición en valores singulares de la matriz S, obtenemos:
S=UDλVT,
donde
UUT=IK,VVT=IJyDλ=diag(λ1,λ2,…,)K×J,
siendo Dλ una matriz diagonal y los λi, i=1,…,rang(S)=t, las raíces cuadradas positivas de los t valores propios de las matrices simétricas SST y STS. Los t primeros vectores de las matrices ortogonales U y V son los vectores propios de las matrices S′S y SS′, respectivamente.
Base
Los t primeros vectores de U constituyen una base para el subespacio generado por las filas de P y los t primeros vectores de la matriz V constituyen una base para el subespacio generado por las columnas de P. Es decir, si construimos las matrices Ut×t, Vt×t y Dλ,t×t, la matriz
St×t=Ut×tDλ,t×tVt×t
será la matriz de rango mínimo que mejor se aproxima a la matriz S.
Problema CA
Así, el problema de análisis de correspondencia simple se puede expresar como un problema de mínimos cuadrados ponderados para determinar la matriz ˆe=(ˆeij)=fc, de rango reducido que minimiza la
traza(SST)=traza(STS)J∑i=1K∑j=1(pij−ficj)2eij.
Distancias chi-cuadradas
Distancia entre filas o columnas
Es la distancia entre filas y columnas de la matriz de datos. Para explicarla, nuevamente, consideremos la matriz P. Supongamos que las filas i y j tienen la siguiente configuración:
i
|
0.015
|
0.02
|
0.01
|
0.02
|
fi=0.075
|
j
|
0.0015
|
0.002
|
0.001
|
0.002
|
fj=0.0075
|
Aparentemente, la fila i parece más densa que la fila j. En la fila i se encuentra el 7.5 de la población, mientras que en la fila j solo el 0.75. Si no consideramos el tamaño, las frecuencias relativas intrafila son idénticas en cada fila. Por lo tanto, para analizar las diferencias relativas entre filas, debemos corregir el efecto tamaño. Esto se logra considerando la matriz cuyos elementos son de la forma pij/fi para las filas y pij/cj para las columnas, obteniendo así dos matrices.
Otro problema al que nos enfrentamos es si las filas i,j y k de la matriz ponderada por las marginales de las filas son:
i
|
0.15
|
0.02
|
0.10
|
0.43
|
0.30
|
j
|
0.15
|
0.02
|
0.10
|
0.44
|
0.29
|
k
|
0.15
|
0.01
|
0.10
|
0.44
|
0.30
|
Observe que la distancia euclidiana entre las filas i y j, y entre las filas i y k, se definen como:
d2e(i,j)=J∑l=1(pilfi−pjlfj)2=(0.43−0.44)2+(0.30−0.29)2=0.0002d2e(i,k)=J∑l=1(pilfi−pklfk)2=(0.43−0.44)2+(0.02−0.01)2=0.0002,
Esto es claramente problemático, ya que no es lo mismo una discrepancia de 0.01 entre 0.29 y 0.30, que entre 0.01 y 0.02.
Distancia entre filas
Una forma de corregir este problema es ponderando cada elemento de la suma por el marginal de la columna correspondiente:
d2(fi,fj)=J∑l=11cl(pilfi−pjlfj)2=(fi−fj)TD−1c(fi−fj),
Donde:
fi y fj son los vectores cuyos elementos son las filas i y j, respectivamente, de la matriz P; y
Dc es una matriz diagonal con elementos cl. A esta distancia se le conoce con el nombre de distancia chi-cuadrado.
Distancia entre columnas
Utilizando un procedimiento análogo se obtienen las distancias chi-cuadrado entre dos columnas j y k de esa matriz de datos, así:
d2(cj,ck)=K∑l=11fl(pljcj−plkck)2=(cj−ck)TD−1f(cj−ck),
donde:
fj y fk son los vector cuyos elementos son las columnas i y j, respectivamente, de la matriz P; y
Df, es una matriz diagonal con elementos fl.
Distancia (observaciones)
Primero.
Note que los valores de las distancias anteriores miden la distancia entre dos distribuciones multinomiales. Es decir, permiten comparar los histogramas (distribuciones empíricas) por cada par de filas o columnas.
Segundo.
Observe también que esta distancia chi-cuadrado es equivalente a la distancia euclidiana, si se toma como puntos en el caso de las filas, para las filas i y K, las de coordenadas:
Wi=(pi1fi√c1,…,piJfi√cJ)yWj=(pk1fk√c1,…,pkJfk√cJ),
respectivamente.
Centro de gravedad
Es importante resaltar que las distancias no se calculan entre las filas o las columnas, sino que se expresan en relación con su centro de masa, que podemos definir como el promedio ponderado de esa columna por su masa.
En el caso de las columnas, esto se convierte en el vector de columnas generado por las marginales de las filas, f.
De manera similar, en el caso de las filas, el vector de filas generado por las marginales de las columnas, c.
Esto es aplicable cuando se analiza la matriz de perfiles (distancia chi-cuadrado) para las filas.
Si el análisis se realiza con la matriz cuyos elementos son de la forma Wi, i=1,…,K (utilizando la distancia euclidiana), el centro de masa para las filas sería √√c, como se muestra a continuación:
Para calcular el centro de masa √c de la nube de puntos generada por las filas W1,…,WK, ponderando con los pesos de las columnas correspondientes, tendríamos para la i-ésima coordenada del vector √c, i=1,…,J:
√ci=f1(p1if1√ci)+f2(p2if2√ci)+⋯+fK(pKifK√ci)=1√ci(f1i+f2i+⋯+fKi)=1√cici=√ci
Distancia perfil al centro de gravedad
La distancia del perfil de fila i a su centro de gravedad (chi-cuadrado) se define como:
d2(fi,c)=K∑l=11cl(pilfi−cl)2=K∑l=1(pilfi√cl−√cl)2=de(fi,c).
Al calcular la distancia entre una fila y su centro de gravedad, en realidad estamos calculando una parte de la varianza o una covarianza. En resumen, la dispersión total de las filas es la suma ponderada de las diferencias al cuadrado de cada elemento de la fila respecto al centro de gravedad.
Inercia
La cantidad χ2/N se denomina inercia total. Esta inercia se descompone en un total de k valores característicos (propios), cada uno de los cuales constituye la inercia principal de una dimensión.
Inercia total de las filas
Si denotamos la inercia total de las filas como If, entonces puede calcularse de la siguiente manera:
If=K∑i=1fid2(fi,c)=K∑i=1J∑j=1fi1fj(pijfi−cj)2=K∑i=1J∑j=1(pij−fi×cj)2fi×cj=tra(STS).
Inercia total de las columnas
De manera análoga, la dispersión total de las columnas Ic, se define como:
Ic=J∑j=1cjd2(cj,f)=J∑j=1K∑i=1cj1ci(pijcj−fi)2=J∑j=1K∑i=1(pij−fi×cj)2fi×cj=tra(SST)=If.
Se observa que la dispersión total de las filas es igual a la de las columnas.
Matrices de inercia
Las matrices Σf=STS y Σc=SST se denominan matrices de inercia de las filas y columnas, respectivamente.
Varianzas de filas y columnas
Los elementos de la diagonal de la matriz Σ representan las varianzas de las filas o columnas. además, su suma constituye la dispersión explicada por cada factor en el nuevo espacio. Los autovalores indican qué parte de esa dispersión está explicada por cada factor.
Coordenadas de los puntos
i en RJ
Con el fin de obtener sus valores y vectores propios, que permitirán calcular las coordenadas de los puntos i en RJ, para el espacio de J dimensiones que definen los puntos fila, es necesario diagonalizar la matriz Σf. Estas coordenadas tienen la siguiente forma:
Fα(i)=J∑j=1μαj(fijfi√cj−√cj)
o en forma matricial como:
R=(Fα(i))K×t=D−1f(F−fc)D−1/2cU,
donde:
μα es el vector propio (columnas de la matriz U) de Σf, correspondiente al factor α, α=1,…,t.
Fα(i) es la proyección del punto fila
(fi1fi√c1−√c1,fi2fi√c2−√c2,…,fiQfi√cQ−√cQ)
sobre el vector uα.
j en RK
De manera similar, se obtienen las coordenadas para los puntos j de RK:
Cα(j)=∑i=1(pijcj√fi−√fi)ναi,
en forma matricial como:
C=(Cα(j))P×t=D−1c(F−fc)′D−1/2fV,
donde να es el vector propio (columnas de la matriz V) de Σc, correspondiente al factor α,α=1,…,t. También podemos expresar estas coordenadas como:
Fα(i)=√λα√fiναi
y
Cα(j)=√λα√cjυαj,
donde λα, es el valor propio asociado al factor α.
Reconstrucción de la matriz de correspondencia
Para reconstruir la matriz de correspondencia P, podemos resolver las ecuaciones (3.2) y (3.3) para P, obteniendo la siguiente ecuación:
P=fc+D1/2fUDVTD1/2c,
o en términos de sus elementos:
pij=ficj+(0,0,…,√fi⏟Posicióni,…,0)UDVT(0,0,…,√cj⏟Posiciónj,…,0)T=ficj[1+∑α=11√λαFα(i)Gα(j)]
LS0tDQp0aXRsZTogIkFOw4FMSVNJUyBERSBDT1JSRVNQT05ERU5DSUEiDQpzdWJ0aXRsZTogPGgxPioqVGVvcsOtYSoqPC9oMT4NCg0KYXV0aG9yOiANCiAgLSBuYW1lICAgICAgICAgIDogIkRyLiByZXIuIG5hdC4gSHVtYmVydG8gTExpbsOhcyBTb2xhbm8iDQogICAgYWZmaWxpYXRpb24gICA6ICJEZXBhcnRhbWVudG8gZGUgTWF0ZW3DoXRpY2FzIHkgRXN0YWTDrXN0aWNhLCBVbml2ZXJzaWRhZCBkZWwgTm9ydGUgKEJhcnJhbnF1aWxsYSwgQ29sb21iaWEpIg0KICAgICAjY29ycmVzcG9uZGluZyA6IHllcyAgICAjIERlZmluZSBvbmx5IG9uZSBjb3JyZXNwb25kaW5nIGF1dGhvcg0KICAgICAjYWRkcmVzcyAgICAgICA6ICJEZXBhcnRhbWVudG8gZGUgTWF0ZW3DoXRpY2FzIHkgRXN0YWTDrXN0aWNhIg0KICAgIGVtYWlsICAgICAgICAgOiB8DQogICAgICBobGxpbmFzQHVuaW5vcnRlLmVkdS5jbw0KICAgICAgDQogICAgICBbQmlvZ3JhcGhpY2FsIHNrZXRjaF0oaHR0cHM6Ly9ycHVicy5jb20vaGxsaW5hcy9CaW9fU2tldGNoKQ0KICAgICAgDQogICAgICBgciBmb3JtYXQoU3lzLnRpbWUoKSwgIiVkLyVtLyV5IilgIA0KICAgICAgDQogICAgICNyb2xlOiAgICAgICAgICMgQ29udHJpYnV0b3JzaGlwIHJvbGVzIChlLmcuLCBDUmVkaVQsIGh0dHBzOi8vY2FzcmFpLm9yZy9jcmVkaXQvKQ0KICAjICAgIC0gQ29uY2VwdHVhbGl6YXRpb24NCiAgIyAgICAtIFdyaXRpbmcgLSBPcmlnaW5hbCBEcmFmdCBQcmVwYXJhdGlvbg0KICAjICAgIC0gV3JpdGluZyAtIFJldmlldyAmIEVkaXRpbmcNCiAjIC0gbmFtZSAgICAgICAgICA6ICJBdXRvciBudW1lcm8gMiINCiAjICAgYWZmaWxpYXRpb24gICA6ICIxLDIiDQogIyAgIHJvbGU6DQogIyAgICAgLSBXcml0aW5nIC0gUmV2aWV3ICYgRWRpdGluZw0KICAgICAjYWZmaWxpYXRpb246DQogICMtIGlkICAgICAgICAgICAgOiAiMSINCiAgIyAgaW5zdGl0dXRpb24gICA6ICJVbml2ZXJzaWRhZCBkZWwgTm9ydGUgKEJhcnJhbnF1aWxsYSwgQ29sb21iaWEpIg0KICAjIVtdKGhsbGluYXMuanBnKXt3aWR0aD0xaW59IA0KICANCiNkYXRlOiAnYHIgZm9ybWF0KFN5cy50aW1lKCksICIlZC8lbS8leSIpYCcgICMgdmVyIGh0dHBzOi8vYm9va2Rvd24ub3JnL3lpaHVpL3JtYXJrZG93bi1jb29rYm9vay91cGRhdGUtZGF0ZS5odG1sDQpvdXRwdXQ6IA0KICAgIGJvb2tkb3duOjpodG1sX2RvY3VtZW50MjogDQogICAgICAgICAgI09KTyBTYWxlbiBjYXBpdHVsb3MsIHNlY2Npb25lcyB5IFRlb3JlbWFzDQogICAgI2Jvb2tkb3duOjpodG1sX2Jvb2s6DQogICAgICAgICAgI09KTyBFUlJPUiBTYWxlbiB0ZW9yZW1hcywgcGVybyBubyBzYWxlbiBsb3MgY2FwaXR1bG9zIA0KICAgICNodG1sX2RvY3VtZW50Og0KICAgICAgICAgIHRvYzogdHJ1ZSAgICAgICMgdGFibGUgb2YgY29udGVudCB0cnVlDQogICAgICAgICAgdG9jX2RlcHRoOiA0ICAgIyB1cHRvIHRocmVlIGRlcHRocyBvZiBoZWFkaW5ncyAoc3BlY2lmaWVkIGJ5ICMsICMjIGFuZCAjIyMpDQogICAgICAgICAgdG9jX2Zsb2F0OiB0cnVlICNDb24gdHJ1ZSwgdG9jIHNhbGUgYWwgbWFyZ2VuIGl6cXVpZXJkbyBkZSBsYSBww6FnaW5hOyBkZSBsbyBjb250cmFyaW8sIGFycmliYQ0KICAgICAgICAgIGNvbGxhcHNlZDogZmFsc2UNCiAgICAgICAgICBzbW9vdGhfc2Nyb2xsOiBmYWxzZQ0KICAgICAgICAgIG51bWJlcl9zZWN0aW9uczogdHJ1ZSAgICMgaWYgeW91IHdhbnQgbnVtYmVyIHNlY3Rpb25zIGF0IGVhY2ggdGFibGUgaGVhZGVyDQogICAgICAgICAgI3RoZW1lOiBzYW5kc3RvbmUNCiAgICAgICAgICAjdGhlbWU6IHVuaXRlZCAgIyBtYW55IG9wdGlvbnMgZm9yIHRoZW1lLCB0aGlzIG9uZSBpcyBteSBmYXZvcml0ZS4NCiAgICAgICAgICAjdGhlbWU6IGZsYXRseSAgIyANCiAgICAgICAgICAjdGhlbWU6IGNlcnVsZWFuICAjIA0KICAgICAgICAgICNoaWdobGlnaHQ6IHRhbmdvICAjIHNwZWNpZmllcyB0aGUgc3ludGF4IGhpZ2hsaWdodGluZyBzdHlsZQ0KICAgICAgICAgICNjc3M6IFNjcmlwdHMgYWNjZXNvcmlvcy9lc3RpbG9ib3Rvbi5jc3MNCiAgICAgICAgICAjY3NzOiBteS5jc3MgICAjIHlvdSBjYW4gYWRkIHlvdXIgY3VzdG9tIGNzcywgc2hvdWxkIGJlIGluIHNhbWUgZm9sZGVyDQogICAgICAgICAgY29kZV9kb3dubG9hZDogdHJ1ZQ0KICAgICAgICAgICNoaWdobGlnaHQ6IHRhbmdvICAjIGNhbWJpYXIgY29sb3IgZGUgbGlicmFyeSBlbiBhenVsDQogICAgIyBib29rZG93bjo6Z2l0Ym9vazoNCiAgICAjICAgICAgaW5jbHVkZXM6DQogICAgIyAgICAgICAgaW5faGVhZGVyOiBoZWFkZXIuaHRtbA0KICAgICMgYm9va2Rvd246OnBkZl9ib29rOg0KICAgICMgICAgICAga2VlcF90ZXg6IHllcw0KICAgICMgYm9va2Rvd246Omh0bWxfYm9vazoNCiAgICAjICAgICAgIGNzczogdG9jLmNzcw0KICAgICMgYm9va2Rvd246Omh0bWxfYm9vazoNCiAgICAjICAgICAgICAgaW5jbHVkZXM6DQogICAgIyAgICAgICAgICAgaW5faGVhZGVyOiBzdHlsZS5jc3MNCiAgICAjYm9va2Rvd246Omh0bWxfZG9jdW1lbnQyOiBkZWZhdWx0DQogICAgIyBib29rZG93bjo6cGRmX2RvY3VtZW50MjoNCiAgICAjICAgICAga2VlcF90ZXg6IHRydWUNCiAgICAjYmlibGlvZ3JhcGh5OiByZWZlcmVuY2VzLmJpYg0KICAgIG1hdGhqYXg6ICJodHRwOi8vZXhhbXBsZS5jb20vbWF0aGpheC9NYXRoSmF4LmpzP2NvbmZpZz1UZVgtQU1TLU1NTF9IVE1Mb3JNTUwiDQpoZWFkZXItaW5jbHVkZXM6DQogICAgXHVzZXBhY2thZ2VbeDExbmFtZXNde3hjb2xvcn0gDQogICAgDQpjc2w6IHNjaWVuY2UuY3NsDQojT2pvOiBTZSB1dGlsaXphIGxlbmd1YWplIFlBTUwNCg0KYWJzdHJhY3Q6IHwNCiAqKkVuIFtScHViczo6IHRvY10oaHR0cHM6Ly9ycHVicy5jb20vaGxsaW5hcy90b2MpIHNlIHB1ZWRlbiB2ZXIgb3Ryb3MgZG9jdW1lbnRvcyBkZSBwb3NpYmxlIGludGVyw6lzLioqDQogIA0KLS0tDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFLCBmaWcuYWxpZ249ImNlbnRlciIsICBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFIywNCiAgICAgICAgICAgICAgICAgICAgICAjc3R5bGUgPSAiY29sb3I6ZGFya2JsdWUiDQogICAgICAgICAgICAgICAgICAgICMgY2xhc3Muc291cmNlPSJiZy1kYW5nZXIiLCBjbGFzcy5vdXRwdXQ9ImJnLXdhcm5pbmciICAgI0NvbG9yZXMgZGVudHJvIGRlbCBjaHVuaw0KICAgICAgICAgICAgICAgICAgICAgKQ0KbGlicmFyeShyZ2wpDQprbml0cjo6a25pdF9ob29rcyRzZXQod2ViZ2wgPSBob29rX3dlYmdsKQ0KYGBgDQoNCg0KDQoNCmBgYHtyLCBlY2hvPUZBTFNFLCBldmFsPUZBTFNFfQ0KaHR0cHM6Ly9ib29rZG93bi5vcmcveWlodWkvcm1hcmtkb3duL2xhbmd1YWdlLWVuZ2luZXMuaHRtbA0KDQpodHRwczovL2Jvb2tkb3duLm9yZy95aWh1aS9ib29rZG93bi9tYXJrZG93bi1zeW50YXguaHRtbA0KDQpodHRwczovL2Jvb2tkb3duLm9yZy95aWh1aS9ib29rZG93bi9hLXNpbmdsZS1kb2N1bWVudC5odG1sDQoNCmh0dHBzOi8vYm9va2Rvd24ub3JnL3lpaHVpL2Jvb2tkb3duL21hcmtkb3duLWV4dGVuc2lvbnMtYnktYm9va2Rvd24uaHRtbA0KDQpodHRwczovL2Jvb2tkb3duLm9yZy95aWh1aS9ybWFya2Rvd24vYm9va2Rvd24tbWFya2Rvd24uaHRtbCAgIyBUZW9yZW1zIGFuZCBwcm9vZnMNCg0KaHR0cHM6Ly9ib29rZG93bi5vcmcveWlodWkvYm9va2Rvd24vbWFya2Rvd24tZXh0ZW5zaW9ucy1ieS1ib29rZG93bi5odG1sI3RoZW9yZW1zDQoNCmh0dHBzOi8vYm9va2Rvd24ub3JnL3lpaHVpL2Jvb2tkb3duL2h0bWwuaHRtbA0KDQpodHRwczovL3d3dy5kYXRhLXRvLXZpei5jb20vDQogIA0KW1JwdWJzXShsaW5rKQ0KICANCihcI2VxOmVjLSksICBFY3VhY2lvbiBcQHJlZihlcTplYy0pLCBGaWd1cmEgXEByZWYoZmlnOkZpZy0pLCBUYWJsZSBcQHJlZih0YWI6bXRjYXJzKSwgVGhlb3JlbSBcQHJlZih0aG06Ym9yaW5nKQ0KDQoNCiMgVGl0dWxvIHsjVGl0dWxvU2VjY2lvbn0gICBcQHJlZihUaXR1bG9TZWNjaW9uKQ0KICANCiMgRm9yIEhUTUwsIHdlIGNhbiBzZXQgY29sb3Igd2l0aCBDU1MsIGUuZy4sIDxzcGFuIHN0eWxlPSJjb2xvcjogcmVkOyI+dGV4dDwvc3Bhbj4NCiAgDQojIGh0dHBzOi8vcmFkaWFudC1yc3RhdHMuZ2l0aHViLmlvL2RvY3MvbW9kZWwvbG9naXN0aWMuaHRtbCBTaGlubnkgTG9naXQgIA0KICANCmBgYA0KDQoNCmBgYHtyLCBldmFsPUZBTFNFLCBlY2hvPUZBTFNFfQ0KI0xhIGZvdG8gdGFtYcOxbyBjw6lkdWxhDQoNCmh0bWx0b29sczo6aW1nKHNyYyA9IGtuaXRyOjppbWFnZV91cmkoZmlsZS5wYXRoKFIuaG9tZSgiZG9jIiksICJodG1sIiwgImxvZ28uanBnIikpLCANCiAgICAgICAgICAgICAgIGFsdCA9ICdobGxpbmFzJywgDQogICAgICAgICAgICAgICBzdHlsZSA9ICdwb3NpdGlvbjphYnNvbHV0ZTsgdG9wOjA7IHJpZ2h0OjA7IHBhZGRpbmc6MTBweDsnICMsDQogICAgICAgICAgICAgICB3aWR0aCA9ICIyMDBweCIpICAjIEFxdcOtIGVzcGVjaWZpY2FzIGVsIGFuY2hvIGRlc2VhZG8gZW4gcMOteGVsZXMgbyBwb3JjZW50YWplDQpgYGANCg0KDQoNCg0KYGBge3IsIGVjaG89RkFMU0UsIH0NCiMgTGEgZm90byBncmFuZGUNCg0KaHRtbHRvb2xzOjppbWcoc3JjID0ga25pdHI6OmltYWdlX3VyaSgiaGxsaW5hczIwMjMuanBnIiksIA0KICAgICAgICAgICAgICAgYWx0ID0gJ2hsbGluYXMyMDIzJywgDQogICAgICAgICAgICAgICBzdHlsZSA9ICdwb3NpdGlvbjphYnNvbHV0ZTsgdG9wOjA7IHJpZ2h0OjA7IHBhZGRpbmc6MXB4OycsDQogICAgICAgICAgICAgICB3aWR0aD0iMTUlIikNCmBgYA0KDQoNCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yICAtLT4NCg0KYGBge2NzcywgZWNobz1GQUxTRX0NCi5jb2x1bW5zIHtkaXNwbGF5OiBmbGV4O30NCmgxIHtjb2xvcjogZGFya2JsdWU7fQ0KaDMge2NvbG9yOiBkYXJrZ3JlZW47fQ0KaDQge2NvbG9yOiBncmVlbjt9DQpgYGANCg0KDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUgLS0+DQo8IS0tIENhcMOtdHVsbyAgLS0+DQoNCg0KYGBge2NzcywgZWNobz1GQUxTRSwgZXZhbD1GQUxTRX0NCiNodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy80MTAzMDQ3Ny9jaGFuZ2luZy1jaHVuay1iYWNrZ3JvdW5kLWNvbG9yLWluLXJtYXJrZG93bg0KDQouYmFkQ29kZSB7DQpiYWNrZ3JvdW5kLWNvbG9yOiByZWQ7DQp9DQpgYGANCg0KDQoNCg0KDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQojIEludHJvZHVjY2nDs24NCg0KDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQojIyMgUHJlbGltaW5hcmVzDQoNCkVsIGFuw6FsaXNpcyBkZSBjb3JyZXNwb25kZW5jaWEgKENBKSBlcyB1bmEgdMOpY25pY2EgcmVsYWNpb25hZGEgY29uIGVsIGFuw6FsaXNpcyBkZSBjb21wb25lbnRlcyBwcmluY2lwYWxlcyAoUENBKSBwZXJvIGFwbGljYWJsZSBhIHZhcmlhYmxlcyBjdWFsaXRhdGl2YXMuIFbDqWFzZSBsYSBGaWd1cmEgXEByZWYoZmlnOkNvcnJlc3AxKS4NCg0KDQo8Y2VudGVyPg0KYGBge3IgQ29ycmVzcDEsIGVjaG89RkFMU0UsIGZpZy5jYXAgPSAiKipSZXN1bWVuIHkgdmlzdWFsaXphY2nDs24gZGUgZGF0b3MgbXVsdGl2YXJpYWRvcyoqIiwgb3V0LndpZHRoID0gIjEwMCUifQ0KIyBmaWcud2lkdGggPSAyMCAjIE5vIGZ1bmNpb25hIGVzdGEgb3BjaW9uIGVuIGVsIGNodW5rDQoNCiNodHRwOi8vemV2cm9zcy5jb20vYmxvZy8yMDE3LzA2LzE5L3RpcHMtYW5kLXRyaWNrcy1mb3Itd29ya2luZy13aXRoLWltYWdlcy1hbmQtZmlndXJlcy1pbi1yLW1hcmtkb3duLWRvY3VtZW50cy8NCiMgUGFnaW5hIDM1OSBkZSBSMjAxNS1GcmllbmRseQ0KDQprbml0cjo6aW5jbHVkZV9ncmFwaGljcygiQ29ycmVzcDEucG5nIikNCg0KI090cmEgbWFuZXJhLCBwZXJvICBzYWxlIGVsIGNhcHRpb246DQojPGNlbnRlcj4NCiMhWygjZmlnOkZpZy1jYXB0aW9uKSBNaSBmaWd1cmFdKE5vbWJyZS5wbmcpe3dpZHRoPTQwMHB4fQ0KIzwvY2VudGVyPg0KYGBgDQo8L2NlbnRlcj4NCg0KDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQoNCiMjIyBQcm9ww7NzaXRvL29iamV0aXZvDQoNCjEuIEF5dWRhIGEgcmVzdW1pciB5IHZpc3VhbGl6YXIgZGF0b3MgZW4gZ3LDoWZpY29zIGJpZGltZW5zaW9uYWxlcywgZXNwZWNpYWxtZW50ZSBlbiB0YWJsYXMgZGUgY29udGluZ2VuY2lhLiANCg0KMi4gUHJvcG9yY2lvbmEgY29vcmRlbmFkYXMgcGFyYSBwdW50b3MgZGUgZmlsYSB5IGNvbHVtbmEsIGxvIHF1ZSBwZXJtaXRlIHZpc3VhbGl6YXIgYXNvY2lhY2lvbmVzIGVudHJlIGNhdGVnb3LDrWFzLiANCg0KMy4gRW4gZXN0ZSBkb2N1bWVudG8sIHNlIGV4cGxpY2EgbGEgdGVvcsOtYSBjb3JyZXNwb25kaWVudGUuIA0KDQo0LiBFbiBvdHJvIGRvY3VtZW50bywgc2UgZXhwbGljYSBjw7NtbyByZWFsaXphciBDQSB1dGlsaXphbmRvIHBhcXVldGVzIGRlIFIgY29tbyBgRmFjdG9NaW5lUmAgeSBgZmFjdG9leHRyYWAsIHkgY8OzbW8gaW50ZXJwcmV0YXIgbG9zIHJlc3VsdGFkb3MsIGluY2x1eWVuZG8gbGEgaWRlbnRpZmljYWNpw7NuIGRlIHZhcmlhYmxlcyBpbXBvcnRhbnRlcyB5IGxhIGdlc3Rpw7NuIGRlIHZhbG9yZXMgYXTDrXBpY29zLg0KDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQoNCiMgRWwgbW9kZWxvIA0KDQojIyMgR2VuZXJhbGlkYWRlcyANCg0KU2UgZXhwb25lbiBsb3MgcHJpbmNpcGlvcyBmdW5kYW1lbnRhbGVzIGRlbCBhbsOhbGlzaXMgZGUgY29ycmVzcG9uZGVuY2lhIHNpbXBsZSwganVudG8gY29uIHVuIGVqZW1wbG8gcXVlIGRlc3RhY2EgbGEgcmVsZXZhbmNpYSBkZSBlc3RhIHTDqWNuaWNhIGVuIGNvbnRleHRvcyBlc3BlY8OtZmljb3MsIGlsdXN0cmFuZG8gbGEgcmVsYWNpw7NuIGVudHJlIHZhcmlhYmxlcyBub21pbmFsZXMgZW4gdW4gbWFwYSBwZXJjZXB0dWFsIHkgbGEgaW50ZXJhY2Npw7NuIGVudHJlIHN1cyBjYXRlZ29yw61hcy4NCg0KRWwgYW7DoWxpc2lzIGRlIGNvcnJlc3BvbmRlbmNpYSBzaW1wbGUgYWJvcmRhIGxhIGV4cGxvcmFjacOzbiBkZSB0YWJsYXMgY3J1emFkYXMsIGRvbmRlIGxhcyBjZWxkYXMgcmVmbGVqYW4gYWxnw7puIHRpcG8gZGUgcmVsYWNpw7NuIGVudHJlIGxhcyBmaWxhcyB5IGNvbHVtbmFzIGRlIHVuYSBtYXRyaXouIEVzdGUgbcOpdG9kbyBjb25kZW5zYSBsYSBpbmZvcm1hY2nDs24gY29udGVuaWRhIGVuIHVuYSB0YWJsYSBkZSBjb250aW5nZW5jaWEsIG9mcmVjaWVuZG8gZG9zIGVuZm9xdWVzIGludGVycHJldGF0aXZvcy4gUG9yIHVuIGxhZG8sIHNlIHZpc3VhbGl6YSBjb21vIHVuYSBoZXJyYW1pZW50YSBwYXJhIHJlcHJlc2VudGFyIGxhcyB2YXJpYWJsZXMgZW4gdW4gZXNwYWNpbyBkZSBtZW5vciBkaW1lbnNpw7NuLCB5IHBvciBvdHJvLCBjb21vIHVuIG3DqXRvZG8gb2JqZXRpdm8gcGFyYSBhc2lnbmFyIHZhbG9yZXMgbnVtw6lyaWNvcyBhIHZhcmlhYmxlcyBjdWFsaXRhdGl2YXMuDQoNClVuIGVqZW1wbG8gcGFyYWRpZ23DoXRpY28gZGUgYXBsaWNhY2nDs24gZGVsIGFuw6FsaXNpcyBkZSBjb3JyZXNwb25kZW5jaWEgc2ltcGxlIHNlIGVuY3VlbnRyYSBlbiBsb3MgY3Vyc29zIGludHJvZHVjdG9yaW9zIGRlIGVzdGFkw61zdGljYSwgcGFydGljdWxhcm1lbnRlIGVuIGxvcyBwcm9ibGVtYXMgcXVlIGFib3JkYW4gbGEgaW5kZXBlbmRlbmNpYSBlbnRyZSBkb3MgdmFyaWFibGVzIGNhdGVnw7NyaWNhcy4NCg0KU3Vwb25nYW1vcyBsYSBwcmVzZW5jaWEgZGUgZG9zIHZhcmlhYmxlcyBjYXRlZ8OzcmljYXMsICRYJCBlICRZJCwgY29uICRJJCB5ICRKJCBjYXRlZ29yw61hcyByZXNwZWN0aXZhbWVudGUsIGRlZmluaWRhcyBlbiB1bmEgcG9ibGFjacOzbi4gTGEgcHJlZ3VudGEgY2xhdmUgZXMgZGV0ZXJtaW5hciBzaSBlc3RhcyB2YXJpYWJsZXMgc29uIGluZGVwZW5kaWVudGVzLiBCYWpvIGxhIGhpcMOzdGVzaXMgbnVsYToNCg0KJCQgSDAgOiBcO1xtYm94e0xhcyB2YXJpYWJsZXMgWCB5IFkgc29uIGVzdGFkw61zdGljYW1lbnRlIGluZGVwZW5kaWVudGVzfSQkDQoNCnZlcnN1cyBsYSBoaXDDs3Rlc2lzIGFsdGVybmF0aXZhOg0KDQokJEgxIDpcO1xtYm94e0xhcyB2YXJpYWJsZXMgWCB5IFkgbm8gc29uIGVzdGFkw61zdGljYW1lbnRlIGluZGVwZW5kaWVudGVzfS4kJA0KDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQojIyMgTWF0cmljZXMgZGUgZnJlY3VlbmNpYXMgYWJzb2x1dGFzDQoNClN1cG9uZ2Ftb3MgcXVlIGRpc3BvbmVtb3MgZGUgdW5hIHRhYmxhIGRlIGNvbnRpbmdlbmNpYSBxdWUgc3VyZ2UgZGUgJG4kIGVsZW1lbnRvcyBzZWxlY2Npb25hZG9zIGRlIHVuYSBwb2JsYWNpw7NuLCBkb25kZSBsYXMgdmFyaWFibGVzIGNhdGVnw7NyaWNhcyAkWCQgeSAkWSQgZXN0w6FuIGRlZmluaWRhcy4gTGEgaW50ZXJzZWNjacOzbiBlbnRyZSB1bmEgZmlsYSAkaSQgeSB1bmEgY29sdW1uYSAkaiQgcmVwcmVzZW50YSBsYSBmcmVjdWVuY2lhIGRlIGluZGl2aWR1b3MgcXVlIHBlcnRlbmVjZW4gYSBsYSBjYXRlZ29yw61hICRpJCBkZSBsYSB2YXJpYWJsZSAkWCQgeSBhIGxhIGNhdGVnb3LDrWEgJGokIGRlIGxhIHZhcmlhYmxlICRZJCBzaW11bHTDoW5lYW1lbnRlLCBjb24gJGkgPSAxLCBcbGRvdHMsIEskIHkgJGogPSAxLCBcbGRvdHMsIEokLiBFc3RvIHNlIGlsdXN0cmEgZW4gbGEgbWF0cml6IGRlIGZyZWN1ZW5jaWFzIGFic29sdXRhcyBzaWd1aWVudGUsIHF1ZSBzZXLDoSByZWZlcmlkYSBjb21vICRGJDoNCg0KJCRGPVxiZWdpbntwbWF0cml4fQ0KWCBcc2V0bWludXMgWSAmIDEgJiAyICYgXGxkb3RzICYgSlxcIA0KXGhsaW5lDQoxICYgRl97MTF9ICYgRl97MTJ9ICYgXGxkb3RzICAmIEZfezFKfSBcXCANCjIgJiBGX3syMX0gJiBGX3syMn0gJiBcbGRvdHMgICYgRl97Mkp9IFxcIA0KXHZkb3RzICYgICYgICYgICYgXFwgDQpNICYgRl97SzF9ICYgRl97SzJ9ICYgXGxkb3RzICYgRl97S0p9DQpcZW5ke3BtYXRyaXh9PSAoRl97aWp9KV97SSBcdGltZXMgSn0kJA0KDQoNCg0KDQpgYGB7ciwgZWNobz0gRkFMU0V9DQojIENyZWFyIGxvcyB2ZWN0b3JlcyBwYXJhIGNhZGEgZmlsYSB5IGNvbHVtbmENCkNvbG9yX2RlX29qb3MgPC0gYygiT19DbGFybyIsICJPX0F6dWwiLCAiT19NZWRpbyIsICJPX09zY3VybyIpDQpSdWJpbyA8LSBjKDY4OCwgMzI2LCAzNDMsIDk4KQ0KUm9qbyA8LSBjKDExNiwgMzgsIDg0LCA0OCkNCk1lZGlvIDwtIGMoNTg0LCAyNDEsIDkwOSwgNDAzKQ0KT3NjdXJvIDwtIGMoMTg4LCAxMTAsIDQxMiwgNjgxKQ0KTmVncm8gPC0gYyg0LCAzLCAyNiwgODUpDQojVG90YWxfbmkuIDwtIGMoMTU4MCwgNzE4LCAxNzc0LCAxMzE1KQ0KDQojIENhbGN1bGFyIGxvcyB0b3RhbGVzIHBvciBjb2x1bW5hDQojVG90YWxfbi5qIDwtIGMoIlRvdGFsIiwgc3VtKFJ1YmlvKSwgc3VtKFJvam8pLCBzdW0oTWVkaW8pLCBzdW0oT3NjdXJvKSwgc3VtKE5lZ3JvKSwgc3VtKFRvdGFsX25pLikpDQoNCiMgQ29uc3RydWlyIGVsIGRhdGEgZnJhbWUNCmRmIDwtIGRhdGEuZnJhbWUoQ29sb3JfZGVfb2pvcywgUnViaW8sIFJvam8sIE1lZGlvLCBPc2N1cm8sIE5lZ3JvDQogICAgICAgICAgICAgICAgICMsIFRvdGFsX25pLg0KICAgICAgICAgICAgICAgICApDQoNCiMgQcOxYWRpciBsYSBmaWxhIGRlIHRvdGFsZXMgYWwgZmluYWwgZGVsIGRhdGEgZnJhbWUNCiNkZiA8LSByYmluZChkZiwgVG90YWxfbi5qKQ0KDQojIENhbWJpYXIgbG9zIG5vbWJyZXMgZGUgbGFzIGNvbHVtbmFzDQpuYW1lcyhkZikgPC0gYygiQ29sb3IiLCAiQ19SdWJpbyIsICJDX1Jvam8iLCAiQ19NZWRpbyIsICJDX09zY3VybyIsICJDX05lZ3JvIg0KICAgICAgICAgICAgICAgIywgIlRvdGFsIg0KICAgICAgICAgICAgICAgKQ0KDQoNCmBgYA0KDQoNCioqRWplbXBsby4qKiANCg0KVsOpYXNlIGxhIEZpZ3VyYSBcQHJlZihmaWc6Q29sb3IxKS4NCg0KDQo8Y2VudGVyPg0KYGBge3IgQ29sb3IxLCBlY2hvPUZBTFNFLCBmaWcuY2FwID0gIioqTWF0cml6ICRGJCAoRnJlY3VlbmNpYXMgYWJzb2x1dGFzKSoqIiwgb3V0LndpZHRoID0gIjcwJSJ9DQojIGZpZy53aWR0aCA9IDIwICMgTm8gZnVuY2lvbmEgZXN0YSBvcGNpb24gZW4gZWwgY2h1bmsNCg0KI2h0dHA6Ly96ZXZyb3NzLmNvbS9ibG9nLzIwMTcvMDYvMTkvdGlwcy1hbmQtdHJpY2tzLWZvci13b3JraW5nLXdpdGgtaW1hZ2VzLWFuZC1maWd1cmVzLWluLXItbWFya2Rvd24tZG9jdW1lbnRzLw0KIyBQYWdpbmEgMzU5IGRlIFIyMDE1LUZyaWVuZGx5DQoNCmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKCJDb2xvcjEucG5nIikNCg0KI090cmEgbWFuZXJhLCBwZXJvICBzYWxlIGVsIGNhcHRpb246DQojPGNlbnRlcj4NCiMhWygjZmlnOkZpZy1jYXB0aW9uKSBNaSBmaWd1cmFdKE5vbWJyZS5wbmcpe3dpZHRoPTQwMHB4fQ0KIzwvY2VudGVyPg0KYGBgDQo8L2NlbnRlcj4NCg0KDQo8IS0tICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUgLS0+DQo8IS0tIFNlcGFyYWRvciAtLT4NCg0KIyMjIE1hdHJpY2VzIGRlIGZyZWN1ZW5jaWFzIHJlbGF0aXZhcw0KDQoNClNlYSANCg0KJCRuIFw7IDo9IFw7IFxzdW1cbGltaXRzX3tpPTF9XntKfSBcc3VtXGxpbWl0c197aj0xfV57S31GX3tpan0kJA0KDQpNdWx0aXBsaWNhciBsYSBtYXRyaXogJEYkIHBvciAkXGZyYWN7MX17bn0kIG5vcyBwcm9wb3JjaW9uYSBsYSBtYXRyaXogZGUgZnJlY3VlbmNpYXMgcmVsYXRpdmFzICRQPVxmcmFjezF9e259RiQsIGRvbmRlICRQJCBlcyBsYSBtYXRyaXogZGUgZnJlY3VlbmNpYXMgcmVsYXRpdmFzIGNvbm9jaWRhIGNvbW8gbWF0cml6IGRlIGNvcnJlc3BvbmRlbmNpYSB5ICRuID0gMV97S1x0aW1lcyAxfV5UXCwgRlwsIDFfe0ogXHRpbWVzIDF9JCByZXByZXNlbnRhIGVsIG7Dum1lcm8gdG90YWwgZGUgaW5kaXZpZHVvcyBlbiBsYSB0YWJsYS4NCg0KRXMgY2xhcm8gcXVlIGxhcyBmcmVjdWVuY2lhcyBhYnNvbHV0YXMgbm8gc29uIGFkZWN1YWRhcyBwYXJhIGNvbXBhcmFyIGZpbGFzIG8gY29sdW1uYXMsIHBvciBsbyBxdWUgc2UgcmVjdXJyZSBhIGxhIG1hdHJpeiBkZSBmcmVjdWVuY2lhcyByZWxhdGl2YXMgKG1hdHJpeiBkZSBjb3JyZXNwb25kZW5jaWEpICRQJC4gRXN0YSBtYXRyaXogc2UgZGVmaW5lIGV4cGzDrWNpdGFtZW50ZSBjb21vIGxhIG1hdHJpeiBkZSBvcmRlbiAkSyBcdGltZXMgSiQgcXVlIGNlbnRyYSBsYSB0YWJsYSBzaWd1aWVudGU6DQoNCg0KJCRQPSBcYmVnaW57cG1hdHJpeH0NClhcc2V0bWludXMgWSAmIDEgJiAyICYgXGxkb3RzICYgSiAmIFxtYm94e01hcmdpbmFsIGZpbGF9XFwgDQpcaGxpbmUNCjEgJiBwX3sxMX0gJiBwX3sxMn0gJiBcbGRvdHMgICYgcF97MUp9ICYgZl8xIFxcIA0KMiAmIHBfezIxfSAmIHBfezIyfSAmIFxsZG90cyAgJiBwX3sySn0gJiBmXzJcXCANClx2ZG90cyAgJiAgJiAgJiAgJiAgJiBcdmRvdHMgXFwgDQpLICYgcF97SzF9ICYgcF97SzJ9ICYgXGxkb3RzICYgcF97S0p9ICYgZl9LXFwgDQpcaGxpbmUNClxtYm94e01hcmdpbmFsIGNvbHVtbmF9ICYgY18xICYgY18yICYgXGxkb3RzICYgY19KICYgMQ0KXGVuZHtwbWF0cml4fSwkJA0KDQpkb25kZQ0KDQpcYmVnaW57YWxpZ24qfQ0KIHBfe2lqfSAmPSBcOyBcZnJhY3tGX3tpan19e259LFxcIA0KZl9pICY9IFxzdW1cbGltaXRzX3tqPTF9XntKfXBfe2lqfSxccXF1YWQgDQpjX2ogPSBcc3VtXGxpbWl0c197aT0xfV57S31wX3tpan0gXHF1YWQgXG1ib3h7eX1cXCANClxzdW1cbGltaXRzX3tqPTF9XntKfWNfaiAmPSBcc3VtXGxpbWl0c197aT0xfV57S31mX2kgXDs9IFw7IFxzdW1cbGltaXRzX3tpPTF9XntKfVxzdW1cbGltaXRzX3tqPTF9XntLfXBfe2lqfT0xLg0KXGVuZHthbGlnbip9DQoNCg0KDQoqKkVqZW1wbG8uKiogDQoNClbDqWFzZSBsYSBGaWd1cmEgXEByZWYoZmlnOkNvbG9yMikuDQoNCg0KPGNlbnRlcj4NCmBgYHtyIENvbG9yMiwgZWNobz1GQUxTRSwgZmlnLmNhcCA9ICIqKk1hdHJpeiAkUCQgKEZyZWN1ZW5jaWFzIHJlbGF0aXZhcykqKiIsIG91dC53aWR0aCA9ICI3MCUifQ0KIyBmaWcud2lkdGggPSAyMCAjIE5vIGZ1bmNpb25hIGVzdGEgb3BjaW9uIGVuIGVsIGNodW5rDQoNCiNodHRwOi8vemV2cm9zcy5jb20vYmxvZy8yMDE3LzA2LzE5L3RpcHMtYW5kLXRyaWNrcy1mb3Itd29ya2luZy13aXRoLWltYWdlcy1hbmQtZmlndXJlcy1pbi1yLW1hcmtkb3duLWRvY3VtZW50cy8NCiMgUGFnaW5hIDM1OSBkZSBSMjAxNS1GcmllbmRseQ0KDQprbml0cjo6aW5jbHVkZV9ncmFwaGljcygiQ29sb3IyLnBuZyIpDQoNCiNPdHJhIG1hbmVyYSwgcGVybyAgc2FsZSBlbCBjYXB0aW9uOg0KIzxjZW50ZXI+DQojIVsoI2ZpZzpGaWctY2FwdGlvbikgTWkgZmlndXJhXShOb21icmUucG5nKXt3aWR0aD00MDBweH0NCiM8L2NlbnRlcj4NCmBgYA0KPC9jZW50ZXI+DQoNCg0KDQo8IS0tICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUgLS0+DQo8IS0tIFNlcGFyYWRvciAtLT4NCg0KIyMjIE1hcmdpbmFsZXMNCg0KXG5vaW5kZW50IERlbm90YXJlbW9zIGNvbW8gJGZfaSQgbGEgZnJlY3VlbmNpYSBtYXJnaW5hbCBkZSBsYSBpLcOpc2ltYSBmaWxhIHkgY29tbyAkY19qJCBsYSBmcmVjdWVuY2lhIG1hcmdpbmFsIGRlIGxhICRqJC3DqXNpbWEgY29sdW1uYSwgZG9uZGUgJGk9MSxcbGRvdHMsIEskIHkgJGo9MSxcbGRvdHMsIEokLCBvIGRlIG1hbmVyYSB2ZWN0b3JpYWw6DQoNCiQkIGYgPSBQXCwgMV97Slx0aW1lcyAxfSBccXF1YWRcbWJveHt5fVxxcXVhZCBjID0gUF5UXCwgMV97S1x0aW1lcyAxfSwgJCQNCg0KdmVjdG9yZXMgcXVlIHJlcHJlc2VudGFuIGxhcyAqZnJlY3VlbmNpYXMgbWFyZ2luYWxlcyBkZSBmaWxhcyogeSAqY29sdW1uYXMqLCByZXNwZWN0aXZhbWVudGUuDQoNCg0KDQo8IS0tICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUgLS0+DQo8IS0tIFNlcGFyYWRvciAtLT4NCg0KIyBJbmRlcGVuZGVuY2lhDQoNCiMjIyBFbCBlc3RhZMOtc3RpY28NCg0KRXMgY29ub2NpZG8gcXVlIGVsIGVzdGFkw61zdGljbyBtw6FzIGZyZWN1ZW50ZW1lbnRlIGVtcGxlYWRvIHBhcmEgYW5hbGl6YXIgbGEgaW5kZXBlbmRlbmNpYSBlc3RhZMOtc3RpY2EgZW50cmUgZG9zIHZhcmlhYmxlcyBjYXRlZ8OzcmljYXMgZXM6DQoNClxiZWdpbnthbGlnbn0NClhfeyhLLTEpXHRpbWVzIChKLTEpfV4yICY9IFxzdW1fe2k9MX1ee0p9XHN1bV97aj0xfV57S30gXGZyYWN7KEZfe2lqfS1FXGxlZnRbRl97aWp9KVxyaWdodF1eMn17RShGX3tpan0pfSA9IG5eMiBcc3VtX3tpPTF9XntKfVxzdW1fe2o9MX1ee0t9IFxmcmFje1xsZWZ0W1xmcmFje0Zfe2lqfX17bn0tRSggXGZyYWN7Rl97aWp9fXtufSlccmlnaHRdXjJ9e0UoRl97aWp9KX0gXG5vdGFnXFwgDQomPSBcc3VtX3tpPTF9XntKfVxzdW1fe2o9MX1ee0t9IFxmcmFje1xsZWZ0W1xmcmFje0Zfe2lqfX17bn0gLSBFKFxmcmFje0Zfe2lqfX17bn0pXHJpZ2h0XV4yfXtFXGxlZnRbXGZyYWN7Rl97aWp9fXtufVxyaWdodF19ID0gbl4yIFxzdW1fe2k9MX1ee0p9XHN1bV97aj0xfV57S30gXGZyYWN7KHBfe2lqfSAtIGVfe2lqfSleMn17ZV97aWp9fSwgKFwjZXE6ZWMtNC0xKQ0KXGVuZHthbGlnbn0NCg0KXG5vaW5kZW50IGRvbmRlOiANCiAgDQogICsgJEUoRl97aWp9KSQgcmVwcmVzZW50YSBsYSBmcmVjdWVuY2lhIGFic29sdXRhIGVzcGVyYWRhIGVuIGxhIGNhc2lsbGEgJChpLGopJCBkZSBsYSBtYXRyaXogJEYkLCB5IA0KICANCiAgKyAkZV97aWp9JCBlcyBsYSBmcmVjdWVuY2lhIHJlbGF0aXZhIGVzcGVyYWRhIGVuIGxhIGNhc2lsbGEgJChpLCBqKSQgZGUgbGEgbWF0cml6IGRlIGNvcnJlc3BvbmRlbmNpYSAkUCQuDQoNCk9ic2VydmVtb3MgcXVlLCBkZSBcQHJlZihlcTplYy00LTEpLCBzZSB0aWVuZSBxdWUNCg0KJCQgXGZyYWN7MX17bn0gWF97KEstMSlcdGltZXMgKEotMSl9XjI9IFxzdW1fe2k9MX1ee0p9XHN1bV97aj0xfV57S30gXGZyYWN7KHBfe2lqfSAtIGVfe2lqfSleMn17ZV97aWp9fS4gJCQNCg0KDQoqKlBhcmEgZWwgZWplbXBsbzoqKg0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCnRhYmxhPC1kZlstMV0NCmNoaXNxX3Rlc3QgPC0gY2hpc3EudGVzdCh0YWJsYSkNCmNoaXNxX3Rlc3QNCmBgYA0KDQoNCg0KDQo8IS0tICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUgLS0+DQo8IS0tIFNlcGFyYWRvciAtLT4NCg0KIyMjIE1hdHJpY2VzIGRlIHJlc2lkdW9zIGVzdGFuZGFyaXphZG9zDQoNClNpIGRlZmluaW1vcyAkRF9mJCB5ICREX2MkIGNvbW8gbGFzIG1hdHJpY2VzIGRpYWdvbmFsZXMgJERfZiA9IFx0ZXh0e2RpYWd9KGYpX3tJXHRpbWVzIEl9JCB5ICREX2MgPSBcdGV4dHtkaWFnfShjKV97Slx0aW1lcyBKfSQsIHJlcHJlc2VudGFuZG8gbGFzIGZyZWN1ZW5jaWFzIG1hcmdpbmFsZXMgZGUgZmlsYXMgeSBjb2x1bW5hcyByZXNwZWN0aXZhbWVudGUsIGVudG9uY2VzIGxhIG1hdHJpeg0KDQpcYmVnaW57ZXF1YXRpb259IA0KUyA9IERfZl57LTEvMn0gKFAtZlw7IGNeVCkgRF9jXnstMS8yfSAgICAgKFwjZXE6ZWMtNC0yKQ0KXGVuZHtlcXVhdGlvbn0NCg0KXG5vaW5kZW50IGVzIGxhICptYXRyaXogZGUgcmVzaWR1b3MgZXN0YW5kYXJpemFkb3MqLiBTZSBwdWVkZSBkZW1vc3RyYXIgcXVlIA0KDQokJFNcLCBTXlRccXVhZCBcdGV4dHt5fSBccXVhZCBTXlRcLCBTJCQNCg0Kc29uIG1hdHJpY2VzIHNpbcOpdHJpY2FzLCBjdXlhIHRyYXphIGVzIHByZWNpc2FtZW50ZSBlbCBlc3RhZMOtc3RpY28gZGUgcHJ1ZWJhIGVuIGxhIHBydWViYSBkZSBpbmRlcGVuZGVuY2lhIHBhcmEgZG9zIHZhcmlhYmxlcyBjYXRlZ8OzcmljYXMsIGVzIGRlY2lyLA0KDQokJFx0ZXh0e3RyYXphfShTU15UKSA9IFx0ZXh0e3RyYXphfShTXlRTKSBcc3VtX3tpPTF9XntKfVwsIFxzdW1fe2o9MX1ee0t9IFxmcmFjeyhwX3tpan0gXDsgLSBcOyBmX2kgXCwgY19qKV4yfXtlX3tpan19LiQkDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQojIyMgRGVzY29tcG9zaWNpw7NuIGVuIHZhbG9yZXMgc2luZ3VsYXJlcw0KDQpcbm9pbmRlbnQgU2kgcmVhbGl6YW1vcyBsYSBkZXNjb21wb3NpY2nDs24gZW4gdmFsb3JlcyBzaW5ndWxhcmVzIGRlIGxhIG1hdHJpeiAkUyQsIG9idGVuZW1vczoNCg0KXGJlZ2lue2VxdWF0aW9ufQ0KUyBcOz1cOyAgVVwsRF97XGxhbWJkYX1cLCBWXlQsKFwjZXE6ZWMtNC0zKQ0KXGVuZHtlcXVhdGlvbn0NCg0KXG5vaW5kZW50IGRvbmRlDQoNCiQkVVVeVCA9IElfSywgXDsgVlZeVCA9IElfSiBccXVhZCBcdGV4dHt5fSBccXVhZCBEX1xsYW1iZGEgPSBcdGV4dHtkaWFnfShcbGFtYmRhXzEsXGxhbWJkYV8yLCBcbGRvdHMsKV97S1x0aW1lcyBKfSwkJA0KDQpcbm9pbmRlbnQgc2llbmRvICREX1xsYW1iZGEkIHVuYSBtYXRyaXogZGlhZ29uYWwgeSBsb3MgJFxsYW1iZGFfaSQsICRpID0gMSwgXGxkb3RzLCBcdGV4dHtyYW5nfShTKSA9IHQkLCBsYXMgcmHDrWNlcyBjdWFkcmFkYXMgcG9zaXRpdmFzIGRlIGxvcyAkdCQgdmFsb3JlcyBwcm9waW9zIGRlIGxhcyBtYXRyaWNlcyBzaW3DqXRyaWNhcyAkU1wsU15UJCB5ICRTXlRcLFMkLiBMb3MgJHQkIHByaW1lcm9zIHZlY3RvcmVzIGRlIGxhcyBtYXRyaWNlcyBvcnRvZ29uYWxlcyAkVSQgeSAkViQgc29uIGxvcyB2ZWN0b3JlcyBwcm9waW9zIGRlIGxhcyBtYXRyaWNlcyAkUydTJCB5ICRTUyckLCByZXNwZWN0aXZhbWVudGUuIA0KDQo8IS0tICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUgLS0+DQo8IS0tIFNlcGFyYWRvciAtLT4NCg0KIyMjIEJhc2UNCg0KTG9zICR0JCBwcmltZXJvcyB2ZWN0b3JlcyBkZSAkVSQgY29uc3RpdHV5ZW4gdW5hIGJhc2UgcGFyYSBlbCBzdWJlc3BhY2lvIGdlbmVyYWRvIHBvciBsYXMgZmlsYXMgZGUgJFAkIHkgbG9zICR0JCBwcmltZXJvcyB2ZWN0b3JlcyBkZSBsYSBtYXRyaXogJFYkIGNvbnN0aXR1eWVuIHVuYSBiYXNlIHBhcmEgZWwgc3ViZXNwYWNpbyBnZW5lcmFkbyBwb3IgbGFzIGNvbHVtbmFzIGRlICRQJC4gRXMgZGVjaXIsIHNpIGNvbnN0cnVpbW9zIGxhcyBtYXRyaWNlcyAkVV97dFx0aW1lcyB0fSQsICRWX3t0XHRpbWVzIHR9JCB5ICREX1xsYW1iZGEsX3t0XHRpbWVzIHR9JCwgbGEgbWF0cml6IA0KDQokJFNfe3RcdGltZXMgdH0gXDs9XDsgIFVfe3RcdGltZXMgdH1cLCBEX1xsYW1iZGEsX3t0XHRpbWVzIHR9XCwgVl97dFx0aW1lcyB0fSQkDQoNCnNlcsOhIGxhIG1hdHJpeiBkZSByYW5nbyBtw61uaW1vIHF1ZSBtZWpvciBzZSBhcHJveGltYSBhIGxhIG1hdHJpeiAkUyQuDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQojIyMgUHJvYmxlbWEgQ0ENCg0KQXPDrSwgZWwgcHJvYmxlbWEgZGUgYW7DoWxpc2lzIGRlIGNvcnJlc3BvbmRlbmNpYSBzaW1wbGUgc2UgcHVlZGUgZXhwcmVzYXIgY29tbyB1biBwcm9ibGVtYSBkZSBtw61uaW1vcyBjdWFkcmFkb3MgcG9uZGVyYWRvcyBwYXJhIGRldGVybWluYXIgbGEgbWF0cml6ICRcd2lkZWhhdHtlfSA9IChcd2lkZWhhdHtlfV97aWp9KSA9IGZcLGMkLCBkZSByYW5nbyByZWR1Y2lkbyBxdWUgbWluaW1pemEgbGENCg0KJCRcdGV4dHt0cmF6YX0oU1wsIFNeVCkgXDs9XDsgXHRleHR7dHJhemF9KFNeVFwsIFMpIFwsIFxzdW1fe2k9MX1ee0p9XHN1bV97aj0xfV57S30gXGZyYWN7KHBfe2lqfSBcOy1cOyBmX2kgXCxjX2opXjJ9e2Vfe2lqfX0uJCQNCg0KDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQoNCiMgUGVyZmlsZXMgZmlsYSB5IGNvbHVtbmFzDQoNClNlIGhhbGxhbiBkaXZpZGllbmRvIGxhIGZyZWN1ZW5jaWEgcmVsYXRpdmEgZW50cmUgZWwgdG90YWwgZGUgZmlsYSBvIGNvbHVtbmEgY29ycmVzcG9uZGllbnRlLiAgTG9zIHBlcmZpbGVzIGRlIGZpbGEgeSBjb2x1bW5hIHNlIHB1ZWRlbiBjb21wYXJhciBjb24gbGFzIGRpc3RyaWJ1Y2lvbmVzIGNvcnJlc3BvbmRpZW50ZXMgZGUgY29sdW1uYSB5IGZpbGEsIGNvbnNpZGVyYW5kbyBzdSByZXNwZWN0aXZhIGltcG9ydGFuY2lhLCBwYXJhIGV2YWx1YXIgc3UgZGVzdmlhY2nDs24gZGUgbGEgaW5kZXBlbmRlbmNpYS4NCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCiMgUGVyZmlsZXMgZmlsYSANCg0KIyMjIE1hdHJpeiBkZSBwZXJmaWxlcyBmaWxhcyANCg0KKipFamVtcGxvLioqIA0KDQpWw6lhc2UgbGEgRmlndXJhIFxAcmVmKGZpZzpDb2xvcjMpLg0KDQoNCjxjZW50ZXI+DQpgYGB7ciBDb2xvcjMsIGVjaG89RkFMU0UsIGZpZy5jYXAgPSAiKipNYXRyaXogZGUgcGVyZmlsZXMgZmlsYSoqIiwgb3V0LndpZHRoID0gIjcwJSJ9DQojIGZpZy53aWR0aCA9IDIwICMgTm8gZnVuY2lvbmEgZXN0YSBvcGNpb24gZW4gZWwgY2h1bmsNCg0KI2h0dHA6Ly96ZXZyb3NzLmNvbS9ibG9nLzIwMTcvMDYvMTkvdGlwcy1hbmQtdHJpY2tzLWZvci13b3JraW5nLXdpdGgtaW1hZ2VzLWFuZC1maWd1cmVzLWluLXItbWFya2Rvd24tZG9jdW1lbnRzLw0KIyBQYWdpbmEgMzU5IGRlIFIyMDE1LUZyaWVuZGx5DQoNCmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKCJDb2xvcjMucG5nIikNCg0KI090cmEgbWFuZXJhLCBwZXJvICBzYWxlIGVsIGNhcHRpb246DQojPGNlbnRlcj4NCiMhWygjZmlnOkZpZy1jYXB0aW9uKSBNaSBmaWd1cmFdKE5vbWJyZS5wbmcpe3dpZHRoPTQwMHB4fQ0KIzwvY2VudGVyPg0KYGBgDQo8L2NlbnRlcj4NCg0KDQo8IS0tICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUgLS0+DQo8IS0tIFNlcGFyYWRvciAtLT4NCg0KDQojIyMgRGlhZ3JhbWEgZGUgcGVyZmlsZXMgZmlsYSANCg0KIEVuIGxhIHJlcHJlc2VudGFjacOzbiBkZWwgcGVyZmlsIGRlbCAqKmNvbG9yIGRlIG9qb3MgZW4gcmVsYWNpw7NuIGNvbiBlbCBjb2xvciBkZWwgY2FiZWxsbyoqLCBzZSBvYnNlcnZhIHVuYSBzaW1pbGl0dWQgY29uc2lkZXJhYmxlIGVudHJlIGxvcyBwZXJmaWxlcyBkZSAqb2pvcyBjbGFyb3MqIHkgKm9qb3MgYXp1bGVzKiwgcXVlIGVzIHNpbWlsYXIgKGF1bnF1ZSBsaWdlcmFtZW50ZSBtZW5vcikgYSBsYSBzaW1pbGl0dWQgbyBwcm94aW1pZGFkIGVudHJlIGxvcyBwZXJmaWxlcyBkZSAqb2pvcyBtZWRpb3MqIHkgKm9zY3Vyb3MqICh2ZXIgRmlndXJhIFxAcmVmKGZpZzpDb2xvcjQpKS4NCg0KPGNlbnRlcj4NCmBgYHtyIENvbG9yNCwgZWNobz1GQUxTRSwgZmlnLmNhcCA9ICIqKkhpc3RvZ3JhbWEgZGUgcGVyZmlsZXMgZmlsYSoqIiwgb3V0LndpZHRoID0gIjcwJSJ9DQojIGZpZy53aWR0aCA9IDIwICMgTm8gZnVuY2lvbmEgZXN0YSBvcGNpb24gZW4gZWwgY2h1bmsNCg0KI2h0dHA6Ly96ZXZyb3NzLmNvbS9ibG9nLzIwMTcvMDYvMTkvdGlwcy1hbmQtdHJpY2tzLWZvci13b3JraW5nLXdpdGgtaW1hZ2VzLWFuZC1maWd1cmVzLWluLXItbWFya2Rvd24tZG9jdW1lbnRzLw0KIyBQYWdpbmEgMzU5IGRlIFIyMDE1LUZyaWVuZGx5DQoNCmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKCJDb2xvcjQucG5nIikNCg0KI090cmEgbWFuZXJhLCBwZXJvICBzYWxlIGVsIGNhcHRpb246DQojPGNlbnRlcj4NCiMhWygjZmlnOkZpZy1jYXB0aW9uKSBNaSBmaWd1cmFdKE5vbWJyZS5wbmcpe3dpZHRoPTQwMHB4fQ0KIzwvY2VudGVyPg0KYGBgDQo8L2NlbnRlcj4NCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQotPg0KDQojIFBlcmZpbGVzIGNvbHVtbmENCg0KIyMjIE1hdHJpeiBkZSBwZXJmaWxlcyBjb2x1bW5hDQoNCg0KKipFamVtcGxvLioqIA0KDQpWw6lhc2UgbGEgRmlndXJhIFxAcmVmKGZpZzpDb2xvcjUpLg0KDQoNCjxjZW50ZXI+DQpgYGB7ciBDb2xvcjUsIGVjaG89RkFMU0UsIGZpZy5jYXAgPSAiKipNYXRyaXogZGUgcGVyZmlsZXMgY29sdW1uYSoqIiwgb3V0LndpZHRoID0gIjcwJSJ9DQojIGZpZy53aWR0aCA9IDIwICMgTm8gZnVuY2lvbmEgZXN0YSBvcGNpb24gZW4gZWwgY2h1bmsNCg0KI2h0dHA6Ly96ZXZyb3NzLmNvbS9ibG9nLzIwMTcvMDYvMTkvdGlwcy1hbmQtdHJpY2tzLWZvci13b3JraW5nLXdpdGgtaW1hZ2VzLWFuZC1maWd1cmVzLWluLXItbWFya2Rvd24tZG9jdW1lbnRzLw0KIyBQYWdpbmEgMzU5IGRlIFIyMDE1LUZyaWVuZGx5DQoNCmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKCJDb2xvcjUucG5nIikNCg0KI090cmEgbWFuZXJhLCBwZXJvICBzYWxlIGVsIGNhcHRpb246DQojPGNlbnRlcj4NCiMhWygjZmlnOkZpZy1jYXB0aW9uKSBNaSBmaWd1cmFdKE5vbWJyZS5wbmcpe3dpZHRoPTQwMHB4fQ0KIzwvY2VudGVyPg0KYGBgDQo8L2NlbnRlcj4NCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCg0KIyMjIERpYWdyYW1hIGRlIHBlcmZpbGVzIGNvbHVtbmENCg0KRW4gZWwgYW7DoWxpc2lzIGRlbCAqKnBlcmZpbCBkZSBjb2xvciBkZWwgY2FiZWxsbyoqLCBzZSBvYnNlcnZhIHVuYSBzaW1pbGl0dWQgbm90YWJsZSBlbnRyZSBsb3MgcGVyZmlsZXMgZGUgKmNhYmVsbG8gcnViaW8qIHkgKnJvam8qLCBhc8OtIGNvbW8gZW50cmUgbG9zICpjYWJlbGxvcyBvc2N1cm8qIHkgKm5lZ3JvKi4gUG9yIG90cm8gbGFkbywgZWwgcGVyZmlsIGRlICpjYWJlbGxvIG1lZGlvKiBzZSBkaXN0aW5ndWUgbm90YWJsZW1lbnRlIGRlIGxvcyBkZW3DoXMgcGVyZmlsZXMuIEVzdG8gc2UgcHVlZGUgYXByZWNpYXIgZW4gbGEgRmlndXJhIFxAcmVmKGZpZzpDb2xvcjYpLg0KDQo8Y2VudGVyPg0KYGBge3IgQ29sb3I2LCBlY2hvPUZBTFNFLCBmaWcuY2FwID0gIioqSGlzdG9ncmFtYSBkZSBwZXJmaWxlcyBjb2x1bW5hKioiLCBvdXQud2lkdGggPSAiNzAlIn0NCiMgZmlnLndpZHRoID0gMjAgIyBObyBmdW5jaW9uYSBlc3RhIG9wY2lvbiBlbiBlbCBjaHVuaw0KDQojaHR0cDovL3pldnJvc3MuY29tL2Jsb2cvMjAxNy8wNi8xOS90aXBzLWFuZC10cmlja3MtZm9yLXdvcmtpbmctd2l0aC1pbWFnZXMtYW5kLWZpZ3VyZXMtaW4tci1tYXJrZG93bi1kb2N1bWVudHMvDQojIFBhZ2luYSAzNTkgZGUgUjIwMTUtRnJpZW5kbHkNCg0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoIkNvbG9yNi5wbmciKQ0KDQojT3RyYSBtYW5lcmEsIHBlcm8gIHNhbGUgZWwgY2FwdGlvbjoNCiM8Y2VudGVyPg0KIyFbKCNmaWc6RmlnLWNhcHRpb24pIE1pIGZpZ3VyYV0oTm9tYnJlLnBuZyl7d2lkdGg9NDAwcHh9DQojPC9jZW50ZXI+DQpgYGANCjwvY2VudGVyPg0KDQo8IS0tICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUgLS0+DQo8IS0tIFNlcGFyYWRvciAtLT4NCg0KDQojIERpc3RhbmNpYXMgY2hpLWN1YWRyYWRhcw0KDQojIyMgRGlzdGFuY2lhIGVudHJlIGZpbGFzIG8gY29sdW1uYXMNCg0KRXMgbGEgZGlzdGFuY2lhIGVudHJlIGZpbGFzIHkgY29sdW1uYXMgZGUgbGEgbWF0cml6IGRlIGRhdG9zLiBQYXJhIGV4cGxpY2FybGEsIG51ZXZhbWVudGUsIGNvbnNpZGVyZW1vcyBsYSBtYXRyaXogJFAkLiBTdXBvbmdhbW9zIHF1ZSBsYXMgZmlsYXMgJGkkIHkgJGokIHRpZW5lbiBsYSBzaWd1aWVudGUgY29uZmlndXJhY2nDs246DQoNCg0KPHRhYmxlIHN0eWxlPSJib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOyB3aWR0aDogNTAlOyBtYXJnaW4tbGVmdDogYXV0bzsgbWFyZ2luLXJpZ2h0OiBhdXRvOyI+DQogIDx0ciBzdHlsZT0idGV4dC1hbGlnbjogY2VudGVyOyI+DQogICAgPHRoIHN0eWxlPSJib3JkZXI6IDFweCBzb2xpZCBibGFjazsiPiRpJDwvdGg+DQogICAgPHRoIHN0eWxlPSJib3JkZXI6IDFweCBzb2xpZCBibGFjazsiPjAuMDE1PC90aD4NCiAgICA8dGggc3R5bGU9ImJvcmRlcjogMXB4IHNvbGlkIGJsYWNrOyI+MC4wMjwvdGg+DQogICAgPHRoIHN0eWxlPSJib3JkZXI6IDFweCBzb2xpZCBibGFjazsiPjAuMDE8L3RoPg0KICAgIDx0aCBzdHlsZT0iYm9yZGVyOiAxcHggc29saWQgYmxhY2s7Ij4wLjAyPC90aD4NCiAgICA8dGggc3R5bGU9ImJvcmRlcjogMXB4IHNvbGlkIGJsYWNrOyI+JGZfaT0wLjA3NSQ8L3RoPg0KICA8L3RyPg0KICA8dHIgc3R5bGU9InRleHQtYWxpZ246IGNlbnRlcjsiPg0KICAgIDx0aCBzdHlsZT0iYm9yZGVyOiAxcHggc29saWQgYmxhY2s7Ij4kaiQ8L3RoPg0KICAgIDx0ZCBzdHlsZT0iYm9yZGVyOiAxcHggc29saWQgYmxhY2s7Ij4wLjAwMTU8L3RkPg0KICAgIDx0ZCBzdHlsZT0iYm9yZGVyOiAxcHggc29saWQgYmxhY2s7Ij4wLjAwMjwvdGQ+DQogICAgPHRkIHN0eWxlPSJib3JkZXI6IDFweCBzb2xpZCBibGFjazsiPjAuMDAxPC90ZD4NCiAgICA8dGQgc3R5bGU9ImJvcmRlcjogMXB4IHNvbGlkIGJsYWNrOyI+MC4wMDI8L3RkPg0KICAgIDx0ZCBzdHlsZT0iYm9yZGVyOiAxcHggc29saWQgYmxhY2s7Ij4kZl9qPTAuMDA3NSQ8L3RkPg0KICA8L3RyPg0KPC90YWJsZT4NCg0KDQoNCkFwYXJlbnRlbWVudGUsIGxhIGZpbGEgJGkkIHBhcmVjZSBtw6FzIGRlbnNhIHF1ZSBsYSBmaWxhICRqJC4gRW4gbGEgZmlsYSAkaSQgc2UgZW5jdWVudHJhIGVsICQ3LjUlJCBkZSBsYSBwb2JsYWNpw7NuLCBtaWVudHJhcyBxdWUgZW4gbGEgZmlsYSAkaiQgc29sbyBlbCAkMC43NSUkLiBTaSBubyBjb25zaWRlcmFtb3MgZWwgdGFtYcOxbywgbGFzIGZyZWN1ZW5jaWFzIHJlbGF0aXZhcyBpbnRyYWZpbGEgc29uIGlkw6ludGljYXMgZW4gY2FkYSBmaWxhLiBQb3IgbG8gdGFudG8sIHBhcmEgYW5hbGl6YXIgbGFzIGRpZmVyZW5jaWFzIHJlbGF0aXZhcyBlbnRyZSBmaWxhcywgZGViZW1vcyBjb3JyZWdpciBlbCBlZmVjdG8gdGFtYcOxby4gRXN0byBzZSBsb2dyYSBjb25zaWRlcmFuZG8gbGEgbWF0cml6IGN1eW9zIGVsZW1lbnRvcyBzb24gZGUgbGEgZm9ybWEgJHBfe2lqfS9mX2kkIHBhcmEgbGFzIGZpbGFzIHkgJHBfe2lqfS9jX2okIHBhcmEgbGFzIGNvbHVtbmFzLCBvYnRlbmllbmRvIGFzw60gZG9zIG1hdHJpY2VzLg0KDQpPdHJvIHByb2JsZW1hIGFsIHF1ZSBub3MgZW5mcmVudGFtb3MgZXMgc2kgbGFzIGZpbGFzICRpLCBqJCB5ICRrJCBkZSBsYSBtYXRyaXogcG9uZGVyYWRhIHBvciBsYXMgbWFyZ2luYWxlcyBkZSBsYXMgZmlsYXMgc29uOg0KDQo8dGFibGUgc3R5bGU9ImJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7IHdpZHRoOiA1MCU7IG1hcmdpbi1sZWZ0OiBhdXRvOyBtYXJnaW4tcmlnaHQ6IGF1dG87Ij4NCiAgPHRyIHN0eWxlPSJ0ZXh0LWFsaWduOiBjZW50ZXI7Ij4NCiAgICA8dGggc3R5bGU9ImJvcmRlcjogMXB4IHNvbGlkIGJsYWNrOyI+JGkkPC90aD4NCiAgICA8dGggc3R5bGU9ImJvcmRlcjogMXB4IHNvbGlkIGJsYWNrOyI+MC4xNTwvdGg+DQogICAgPHRoIHN0eWxlPSJib3JkZXI6IDFweCBzb2xpZCBibGFjazsiPjAuMDI8L3RoPg0KICAgIDx0aCBzdHlsZT0iYm9yZGVyOiAxcHggc29saWQgYmxhY2s7Ij4wLjEwPC90aD4NCiAgICA8dGggc3R5bGU9ImJvcmRlcjogMXB4IHNvbGlkIGJsYWNrOyI+MC40MzwvdGg+DQogICAgPHRoIHN0eWxlPSJib3JkZXI6IDFweCBzb2xpZCBibGFjazsiPjAuMzA8L3RoPg0KICA8L3RyPg0KICA8dHIgc3R5bGU9InRleHQtYWxpZ246IGNlbnRlcjsiPg0KICAgIDx0aCBzdHlsZT0iYm9yZGVyOiAxcHggc29saWQgYmxhY2s7Ij4kaiQ8L3RoPg0KICAgIDx0ZCBzdHlsZT0iYm9yZGVyOiAxcHggc29saWQgYmxhY2s7Ij4wLjE1PC90ZD4NCiAgICA8dGQgc3R5bGU9ImJvcmRlcjogMXB4IHNvbGlkIGJsYWNrOyI+MC4wMjwvdGQ+DQogICAgPHRkIHN0eWxlPSJib3JkZXI6IDFweCBzb2xpZCBibGFjazsiPjAuMTA8L3RkPg0KICAgIDx0ZCBzdHlsZT0iYm9yZGVyOiAxcHggc29saWQgYmxhY2s7Ij4wLjQ0PC90ZD4NCiAgICA8dGQgc3R5bGU9ImJvcmRlcjogMXB4IHNvbGlkIGJsYWNrOyI+MC4yOTwvdGQ+DQogIDwvdHI+DQogIDx0ciBzdHlsZT0idGV4dC1hbGlnbjogY2VudGVyOyI+DQogICAgPHRoIHN0eWxlPSJib3JkZXI6IDFweCBzb2xpZCBibGFjazsiPiRrJDwvdGg+DQogICAgPHRkIHN0eWxlPSJib3JkZXI6IDFweCBzb2xpZCBibGFjazsiPjAuMTU8L3RkPg0KICAgIDx0ZCBzdHlsZT0iYm9yZGVyOiAxcHggc29saWQgYmxhY2s7Ij4wLjAxPC90ZD4NCiAgICA8dGQgc3R5bGU9ImJvcmRlcjogMXB4IHNvbGlkIGJsYWNrOyI+MC4xMDwvdGQ+DQogICAgPHRkIHN0eWxlPSJib3JkZXI6IDFweCBzb2xpZCBibGFjazsiPjAuNDQ8L3RkPg0KICAgIDx0ZCBzdHlsZT0iYm9yZGVyOiAxcHggc29saWQgYmxhY2s7Ij4wLjMwPC90ZD4NCiAgPC90cj4NCjwvdGFibGU+DQoNCk9ic2VydmUgcXVlIGxhIGRpc3RhbmNpYSBldWNsaWRpYW5hIGVudHJlIGxhcyBmaWxhcyAkaSQgeSAkaiQsIHkgZW50cmUgbGFzIGZpbGFzICRpJCB5ICRrJCwgc2UgZGVmaW5lbiBjb21vOg0KDQpcYmVnaW57YWxpZ24qfQ0KZF9lXjIoaSxqKSAmPSBcc3VtX3tsPTF9XntKfVxsZWZ0IChcZnJhY3twX3tpbH19e2ZfaX0gLSBcZnJhY3twX3tqbH19e2Zfan1ccmlnaHQpXjJcXA0KJj0gKDAuNDMtMC40NCleMiBcOytcOyAoMC4zMC0wLjI5KV4yIFw7PVw7IDAuMDAwMlxcDQomXFwNCmRfZV4yKGksaykgJj1cc3VtX3tsPTF9XntKfVxsZWZ0IChcZnJhY3twX3tpbH19e2ZfaX0gLSBcZnJhY3twX3trbH19e2Zfa31ccmlnaHQpXjIgXFwNCiY9ICgwLjQzLTAuNDQpXjIgXDsrXDsgKDAuMDItMC4wMSleMiBcOz1cOyAwLjAwMDIsDQpcZW5ke2FsaWduKn0NCg0KRXN0byBlcyBjbGFyYW1lbnRlIHByb2JsZW3DoXRpY28sIHlhIHF1ZSBubyBlcyBsbyBtaXNtbyB1bmEgZGlzY3JlcGFuY2lhIGRlIDAuMDEgZW50cmUgMC4yOSB5IDAuMzAsIHF1ZSBlbnRyZSAwLjAxIHkgMC4wMi4gDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQoNCiMjIyBEaXN0YW5jaWEgZW50cmUgZmlsYXMNCg0KVW5hIGZvcm1hIGRlIGNvcnJlZ2lyIGVzdGUgcHJvYmxlbWEgZXMgcG9uZGVyYW5kbyBjYWRhIGVsZW1lbnRvIGRlIGxhIHN1bWEgcG9yIGVsIG1hcmdpbmFsIGRlIGxhIGNvbHVtbmEgY29ycmVzcG9uZGllbnRlOg0KDQokJGReMiAoZl9pLCBmX2opID0gXHN1bV97bD0xfV57Sn1cZnJhY3sxfXtjX2x9XGxlZnQoXGZyYWN7cF97aWx9fXtmX2l9IC0gXGZyYWN7cF97amx9fXtmX2p9XHJpZ2h0ICleMiA9IChmX2kgLSBmX2opXlRcLCBEX2Neey0xfSBcLCAoZl9pIC0gZl9qKSwkJA0KDQpEb25kZToNCiAgDQogICsgJGZfaSQgeSAkZl9qJCBzb24gbG9zIHZlY3RvcmVzIGN1eW9zIGVsZW1lbnRvcyBzb24gbGFzIGZpbGFzICRpJCB5ICRqJCwgcmVzcGVjdGl2YW1lbnRlLCBkZSBsYSBtYXRyaXogJFAkOyB5IA0KICANCiAgKyAkRF9jJCBlcyB1bmEgbWF0cml6IGRpYWdvbmFsIGNvbiBlbGVtZW50b3MgJGNfbCQuIEEgZXN0YSBkaXN0YW5jaWEgc2UgbGUgY29ub2NlIGNvbiBlbCBub21icmUgZGUgKmRpc3RhbmNpYSBjaGktY3VhZHJhZG8qLg0KDQoNCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCiMjIyBEaXN0YW5jaWEgZW50cmUgY29sdW1uYXMNCg0KVXRpbGl6YW5kbyB1biBwcm9jZWRpbWllbnRvIGFuw6Fsb2dvIHNlIG9idGllbmVuIGxhcyBkaXN0YW5jaWFzIGNoaS1jdWFkcmFkbyBlbnRyZSBkb3MgY29sdW1uYXMgJGokIHkgJGskIGRlIGVzYSBtYXRyaXogZGUgZGF0b3MsIGFzw606DQoNCiQkZF4yIChjX2osIGNfaykgXDs9XDsgXHN1bV97bD0xfV57S31cZnJhY3sxfXtmX2x9XGxlZnQoXGZyYWN7cF97bGp9fXtjX2p9IC0gXGZyYWN7cF97bGt9fXtjX2t9XHJpZ2h0ICleMiBcOz1cOyAoY19qIC0gY19rKV5UIFwsRF9mXnstMX1cLCAoY19qIC0gY19rKSwkJA0KDQpkb25kZToNCiAgDQogICsgJGZfaiQgeSAkZl9rJCBzb24gbG9zIHZlY3RvciBjdXlvcyBlbGVtZW50b3Mgc29uIGxhcyBjb2x1bW5hcyAkaSQgeSAkaiQsIHJlc3BlY3RpdmFtZW50ZSwgZGUgbGEgbWF0cml6ICRQJDsgeSANCiAgDQogICsgJERfZiQsIGVzIHVuYSBtYXRyaXogZGlhZ29uYWwgY29uIGVsZW1lbnRvcyAkZl9sJC4NCiAgDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQojIyMgRGlzdGFuY2lhIChvYnNlcnZhY2lvbmVzKQ0KDQoqKlByaW1lcm8uKioNCg0KTm90ZSBxdWUgbG9zIHZhbG9yZXMgZGUgbGFzIGRpc3RhbmNpYXMgYW50ZXJpb3JlcyBtaWRlbiBsYSBkaXN0YW5jaWEgZW50cmUgZG9zIGRpc3RyaWJ1Y2lvbmVzIG11bHRpbm9taWFsZXMuIEVzIGRlY2lyLCBwZXJtaXRlbiBjb21wYXJhciBsb3MgaGlzdG9ncmFtYXMgKGRpc3RyaWJ1Y2lvbmVzIGVtcMOtcmljYXMpIHBvciBjYWRhIHBhciBkZSBmaWxhcyBvIGNvbHVtbmFzLg0KDQoNCioqU2VndW5kby4qKg0KDQpPYnNlcnZlIHRhbWJpw6luIHF1ZSBlc3RhIGRpc3RhbmNpYSBjaGktY3VhZHJhZG8gZXMgZXF1aXZhbGVudGUgYSBsYSBkaXN0YW5jaWEgZXVjbGlkaWFuYSwgc2kgc2UgdG9tYSBjb21vIHB1bnRvcyBlbiBlbCBjYXNvIGRlIGxhcyBmaWxhcywgcGFyYSBsYXMgZmlsYXMgJGkkIHkgJEskLCBsYXMgZGUgY29vcmRlbmFkYXM6IA0KDQokJFdfaSA9IFxsZWZ0KFxmcmFje3Bfe2kxfX17Zl9pIFwsIFxzcXJ0e2NfMX19LCBcbGRvdHMsIFxmcmFje3Bfe2lKfX17Zl9pXCxcc3FydHtjX0p9fVxyaWdodCkgXHF1YWQgXG1ib3h7eX1ccXVhZCBXX2ogPSBcbGVmdChcZnJhY3twX3trMX19e2ZfayBcLCBcc3FydHtjXzF9fSwgXGxkb3RzLCBcZnJhY3twX3trSn19e2ZfayBcLCBcc3FydHtjX0p9fVxyaWdodCksJCQgDQpyZXNwZWN0aXZhbWVudGUuDQoNCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCiMjIyBDZW50cm8gZGUgZ3JhdmVkYWQNCg0KRXMgaW1wb3J0YW50ZSByZXNhbHRhciBxdWUgbGFzIGRpc3RhbmNpYXMgbm8gc2UgY2FsY3VsYW4gZW50cmUgbGFzIGZpbGFzIG8gbGFzIGNvbHVtbmFzLCBzaW5vIHF1ZSBzZSBleHByZXNhbiBlbiByZWxhY2nDs24gY29uIHN1IGNlbnRybyBkZSBtYXNhLCBxdWUgcG9kZW1vcyBkZWZpbmlyIGNvbW8gZWwgcHJvbWVkaW8gcG9uZGVyYWRvIGRlIGVzYSBjb2x1bW5hIHBvciBzdSBtYXNhLiANCiAgDQogICsgRW4gZWwgY2FzbyBkZSBsYXMgY29sdW1uYXMsIGVzdG8gc2UgY29udmllcnRlIGVuIGVsIHZlY3RvciBkZSBjb2x1bW5hcyBnZW5lcmFkbyBwb3IgbGFzIG1hcmdpbmFsZXMgZGUgbGFzIGZpbGFzLCAkZiQuDQogIA0KICArIERlIG1hbmVyYSBzaW1pbGFyLCBlbiBlbCBjYXNvIGRlIGxhcyBmaWxhcywgZWwgdmVjdG9yIGRlIGZpbGFzIGdlbmVyYWRvIHBvciBsYXMgbWFyZ2luYWxlcyBkZSBsYXMgY29sdW1uYXMsICRjJC4gDQogIA0KDQpFc3RvIGVzIGFwbGljYWJsZSBjdWFuZG8gc2UgYW5hbGl6YSBsYSBtYXRyaXogZGUgcGVyZmlsZXMgKGRpc3RhbmNpYSBjaGktY3VhZHJhZG8pIHBhcmEgbGFzIGZpbGFzLg0KDQoNClNpIGVsIGFuw6FsaXNpcyBzZSByZWFsaXphIGNvbiBsYSBtYXRyaXogY3V5b3MgZWxlbWVudG9zIHNvbiBkZSBsYSBmb3JtYSAkV19pJCwgJGkgPSAxLFxsZG90cywgSyQgKHV0aWxpemFuZG8gbGEgZGlzdGFuY2lhIGV1Y2xpZGlhbmEpLCBlbCBjZW50cm8gZGUgbWFzYSBwYXJhIGxhcyBmaWxhcyBzZXLDrWEgJFxzcXJ0e1xzcXJ0e2N9fSQsIGNvbW8gc2UgbXVlc3RyYSBhIGNvbnRpbnVhY2nDs246DQoNClBhcmEgY2FsY3VsYXIgZWwgY2VudHJvIGRlIG1hc2EgJFxzcXJ0e2N9JCBkZSBsYSBudWJlIGRlIHB1bnRvcyBnZW5lcmFkYSBwb3IgbGFzIGZpbGFzICRXXzEsXGxkb3RzLCBXX0skLCBwb25kZXJhbmRvIGNvbiBsb3MgcGVzb3MgZGUgbGFzIGNvbHVtbmFzIGNvcnJlc3BvbmRpZW50ZXMsIHRlbmRyw61hbW9zIHBhcmEgbGEgaS3DqXNpbWEgY29vcmRlbmFkYSBkZWwgdmVjdG9yICRcc3FydHtjfSQsICRpPTEsXGxkb3RzLCBKJDoNCg0KXGJlZ2lue2FsaWduKn0NClxzcXJ0e2NfaX0gJj0gZl8xIFxsZWZ0KFxmcmFje3BfezFpfX17Zl8xXHNxcnR7Y19pfX1ccmlnaHQpICsgZl8yIFxsZWZ0KFxmcmFje3BfezJfaX19e2ZfMlxzcXJ0e2NfaX19XHJpZ2h0KSArIFxjZG90cyArIGZfS1xsZWZ0KFxmcmFje3Bfe0tpfX17Zl9LXHNxcnR7Y19pfX1ccmlnaHQpIFxcDQomPSBcZnJhY3sxfXtcc3FydHtjX2l9fSAoZl97MWl9K2ZfezJpfSArIFxjZG90cyArIGZfe0tpfSlcXA0KJj0gXGZyYWN7MX17XHNxcnR7Y19pfX1jX2lcXA0KJj0gIFxzcXJ0e2NfaX0NClxlbmR7YWxpZ24qfQ0KDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQojIyMgRGlzdGFuY2lhIHBlcmZpbCBhbCBjZW50cm8gZGUgZ3JhdmVkYWQNCg0KTGEgZGlzdGFuY2lhIGRlbCBwZXJmaWwgZGUgZmlsYSAkaSQgYSBzdSBjZW50cm8gZGUgZ3JhdmVkYWQgKGNoaS1jdWFkcmFkbykgc2UgZGVmaW5lIGNvbW86DQoNCiQkZF4yIFwsKGZfaSwgXDtjKSBcOyA9XDsgIFxzdW1fe2w9MX1ee0t9IFxmcmFjezF9e2NfbH1cbGVmdChcZnJhY3twX3tpbH19e2ZfaX0gLSBjX2xccmlnaHQpXjIgXDs9XDsgXHN1bV97bD0xfV57S30gXGxlZnQoXGZyYWN7cF97aWx9fXtmX2lcLCBcc3FydHtjX2x9fSAtIFxzcXJ0e2NfbH1ccmlnaHQpXjIgPSBkX2UgXCwoZl9pLFw7IGMpLiQkDQoNCkFsIGNhbGN1bGFyIGxhIGRpc3RhbmNpYSBlbnRyZSB1bmEgZmlsYSB5IHN1IGNlbnRybyBkZSBncmF2ZWRhZCwgZW4gcmVhbGlkYWQgZXN0YW1vcyBjYWxjdWxhbmRvIHVuYSBwYXJ0ZSBkZSBsYSB2YXJpYW56YSBvIHVuYSBjb3ZhcmlhbnphLiBFbiByZXN1bWVuLCBsYSBkaXNwZXJzacOzbiB0b3RhbCBkZSBsYXMgZmlsYXMgZXMgbGEgc3VtYSBwb25kZXJhZGEgZGUgbGFzIGRpZmVyZW5jaWFzIGFsIGN1YWRyYWRvIGRlIGNhZGEgZWxlbWVudG8gZGUgbGEgZmlsYSByZXNwZWN0byBhbCBjZW50cm8gZGUgZ3JhdmVkYWQuIA0KDQo8IS0tICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUgLS0+DQo8IS0tIFNlcGFyYWRvciAtLT4NCg0KIyBJbmVyY2lhDQoNCkxhIGNhbnRpZGFkICRcY2hpXjIvTiQgc2UgZGVub21pbmEgaW5lcmNpYSB0b3RhbC4gRXN0YSBpbmVyY2lhIHNlIGRlc2NvbXBvbmUgZW4gdW4gdG90YWwgZGUgJGskIHZhbG9yZXMgY2FyYWN0ZXLDrXN0aWNvcyAocHJvcGlvcyksIGNhZGEgdW5vIGRlIGxvcyBjdWFsZXMgY29uc3RpdHV5ZSBsYSBpbmVyY2lhIHByaW5jaXBhbCBkZSB1bmEgZGltZW5zacOzbi4NCg0KDQo8IS0tICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUgLS0+DQo8IS0tIFNlcGFyYWRvciAtLT4NCg0KIyMjIEluZXJjaWEgdG90YWwgZGUgbGFzIGZpbGFzDQoNClNpIGRlbm90YW1vcyBsYSBpbmVyY2lhIHRvdGFsIGRlIGxhcyBmaWxhcyBjb21vICRJX2YkLCBlbnRvbmNlcyBwdWVkZSBjYWxjdWxhcnNlIGRlIGxhIHNpZ3VpZW50ZSBtYW5lcmE6DQoNClxiZWdpbnthbGlnbip9DQpJX2YgJj0gXHN1bV97aT0xfV57S30gZl9pIFwsZF4yXCwgKGZfaSwgXDtjKVxcIA0KJj0gXHN1bV97aT0xfV57S30gXHN1bV97aj0xfV57Sn0gZl9pIFxmcmFjezF9e2Zfan1cbGVmdChcZnJhY3twX3tpan19e2ZfaX0gXDstXDsgY19qXHJpZ2h0KV4yXFwgDQogJj0gXHN1bV97aT0xfV57S30gXHN1bV97aj0xfV57Sn0gXGZyYWN7KHBfe2lqfS1mX2kgXHRpbWVzIGNfaileMn17Zl9pIFx0aW1lcyBjX2p9PSB0cmEoU15UXCwgUykuDQpcZW5ke2FsaWduKn0NCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCiMjIyBJbmVyY2lhIHRvdGFsIGRlIGxhcyBjb2x1bW5hcw0KDQpEZSBtYW5lcmEgYW7DoWxvZ2EsIGxhIGRpc3BlcnNpw7NuIHRvdGFsIGRlIGxhcyBjb2x1bW5hcyAkSV9jJCwgc2UgZGVmaW5lIGNvbW86DQoNClxiZWdpbnthbGlnbip9DQpJX2MgJj0gXHN1bV97aj0xfV57Sn0gY19qIFwsIGReMiAoY19qLCBcO2YpXFwgDQogJj0gXHN1bV97aj0xfV57Sn0gXHN1bV97aT0xfV57S30gY19qIFxmcmFjezF9e2NfaX1cbGVmdChcZnJhY3twX3tpan19e2Nfan1cOy1cOyBmX2lccmlnaHQpXjJcXCANCiAmPSBcc3VtX3tqPTF9XntKfSBcc3VtX3tpPTF9XntLfSBcZnJhY3socF97aWp9LWZfaSBcdGltZXMgY19qKV4yfXtmX2kgXHRpbWVzIGNfan09IHRyYShTXCwgU15UKSBcOyA9XDsgIElfZi4NClxlbmR7YWxpZ24qfQ0KDQpTZSBvYnNlcnZhIHF1ZSBsYSBkaXNwZXJzacOzbiB0b3RhbCBkZSBsYXMgZmlsYXMgZXMgaWd1YWwgYSBsYSBkZSBsYXMgY29sdW1uYXMuIA0KDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQojIyMgTWF0cmljZXMgZGUgaW5lcmNpYQ0KDQpMYXMgbWF0cmljZXMgJFxTaWdtYV9mID0gU15UXCwgUyQgeSAkXFNpZ21hX2MgPSBTXCwgU15UJCBzZSBkZW5vbWluYW4gKm1hdHJpY2VzIGRlIGluZXJjaWEgZGUgbGFzIGZpbGFzKiB5ICpjb2x1bW5hcyosIHJlc3BlY3RpdmFtZW50ZS4gDQogIA0KICArICRcU2lnbWFfZiQgZXMgcGFyYSBlbCBlc3BhY2lvIHF1ZSBkZWZpbmUgbG9zIHB1bnRvcyAkZl9pJCBkZSAkXG1hdGhiYntSfV5KJC4gDQogIA0KICArICRcU2lnbWFfYyQgZXMgcGFyYSBlbCBlc3BhY2lvIHF1ZSBkZWZpbmUgbG9zIHB1bnRvcyAkY19qJCBkZSAkXG1hdGhiYntSfV5LJC4NCiAgDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQojIyMgVmFyaWFuemFzIGRlIGZpbGFzIHkgY29sdW1uYXMNCg0KTG9zIGVsZW1lbnRvcyBkZSBsYSBkaWFnb25hbCBkZSBsYSBtYXRyaXogJFxTaWdtYSQgcmVwcmVzZW50YW4gbGFzIHZhcmlhbnphcyBkZSBsYXMgZmlsYXMgbyBjb2x1bW5hcy4gYWRlbcOhcywgc3Ugc3VtYSBjb25zdGl0dXllIGxhIGRpc3BlcnNpw7NuIGV4cGxpY2FkYSBwb3IgY2FkYSBmYWN0b3IgZW4gZWwgbnVldm8gZXNwYWNpby4gTG9zIGF1dG92YWxvcmVzIGluZGljYW4gcXXDqSBwYXJ0ZSBkZSBlc2EgZGlzcGVyc2nDs24gZXN0w6EgZXhwbGljYWRhIHBvciBjYWRhIGZhY3Rvci4gDQoNCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCiMgQ29vcmRlbmFkYXMgZGUgbG9zIHB1bnRvcw0KDQojIyMgICRpJCBlbiAkXG1hdGhiYntSfV5KJA0KDQpDb24gZWwgZmluIGRlIG9idGVuZXIgc3VzIHZhbG9yZXMgeSB2ZWN0b3JlcyBwcm9waW9zLCBxdWUgcGVybWl0aXLDoW4gY2FsY3VsYXIgbGFzIGNvb3JkZW5hZGFzIGRlIGxvcyBwdW50b3MgJGkkIGVuICRcbWF0aGJie1J9XkokLCBwYXJhIGVsIGVzcGFjaW8gZGUgJEokIGRpbWVuc2lvbmVzIHF1ZSBkZWZpbmVuIGxvcyBwdW50b3MgZmlsYSwgZXMgbmVjZXNhcmlvIGRpYWdvbmFsaXphciBsYSBtYXRyaXogJFxTaWdtYV9mJC4gRXN0YXMgY29vcmRlbmFkYXMgdGllbmVuIGxhIHNpZ3VpZW50ZSBmb3JtYToNCg0KJCRGXGFscGhhKGkpID0gXHN1bV97aj0xfV5KIFxtdV97XGFscGhhIFwsIGp9XGxlZnQoXGZyYWN7Zl97aWp9fXtmX2lcLCBcc3FydHtjX2p9fSAtIFxzcXJ0e2Nfan1ccmlnaHQpJCQNCg0KbyBlbiBmb3JtYSBtYXRyaWNpYWwgY29tbzoNCg0KJCRSXDs9XDsoRl9cYWxwaGEoaSkpX3tLXHRpbWVzIHR9IFw7PVw7IERfZl57LTF9XCwgKEZcOyAtXDsgZlwsIGMgKVwsIERfY157LTEvMn1cLCBVLCQkDQoNCmRvbmRlOiANCg0KKyAkXG11X1xhbHBoYSQgZXMgZWwgdmVjdG9yIHByb3BpbyAoY29sdW1uYXMgZGUgbGEgbWF0cml6ICRVJCkgZGUgJFxTaWdtYV9mJCwgY29ycmVzcG9uZGllbnRlIGFsIGZhY3RvciAkXGFscGhhJCwgJFxhbHBoYSA9IDEsIFxsZG90cywgdCQuIA0KDQorICRGX1xhbHBoYShpKSQgZXMgbGEgcHJveWVjY2nDs24gZGVsIHB1bnRvIGZpbGEgDQoNCiQkXGxlZnQoXGZyYWN7Zl97aTF9fXtmX2kgXHNxcnR7Y18xfX0gLSBcc3FydHtjXzF9LCBcZnJhY3tmX3tpMn19e2ZfaSBcc3FydHtjXzJ9fSAtIFxzcXJ0e2NfMn0sIFxsZG90cywgXGZyYWN7Zl97aVF9fXtmX2kgXHNxcnR7Y19RfX0gLSBcc3FydHtjX1F9XHJpZ2h0KSQkIA0KDQpzb2JyZSBlbCB2ZWN0b3IgJHVfXGFscGhhJC4gDQoNCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCiMjIyAkaiQgZW4gJFxtYXRoYmJ7Un1eSyQNCg0KDQpEZSBtYW5lcmEgc2ltaWxhciwgc2Ugb2J0aWVuZW4gbGFzIGNvb3JkZW5hZGFzIHBhcmEgbG9zIHB1bnRvcyAkaiQgZGUgJFxtYXRoYmJ7Un1eSyQ6DQoNCiQkQ19cYWxwaGEoaik9XHN1bV97aT0xfSBcbGVmdChcZnJhY3twX3tpan19e2NfalxzcXJ0e2ZfaX19LSBcc3FydHtmX2l9XHJpZ2h0KVxudV97XGFscGhhIGl9LCQkDQoNCiBlbiBmb3JtYSBtYXRyaWNpYWwgY29tbzoNCg0KJCRDPShDX1xhbHBoYSAoaikpX3tQXHRpbWVzIHR9ID1EX2Neey0xfShGLWZcOyBjKSdEX2Zeey0xLzJ9ViwkJA0KDQpkb25kZSAkXG51X1xhbHBoYSQgZXMgZWwgdmVjdG9yIHByb3BpbyAoY29sdW1uYXMgZGUgbGEgbWF0cml6ICRWJCkgZGUgJFxTaWdtYV9jJCwgY29ycmVzcG9uZGllbnRlIGFsIGZhY3RvciAkXGFscGhhLCBcYWxwaGEgPSAxLCBcbGRvdHMsIHQkLiBUYW1iacOpbiBwb2RlbW9zIGV4cHJlc2FyIGVzdGFzIGNvb3JkZW5hZGFzIGNvbW86DQoNCiQkRl9cYWxwaGEoaSk9IFxmcmFje1xzcXJ0e1xsYW1iZGFfXGFscGhhfX17XHNxcnR7Zl9pfX0gXDsgXG51X3tcYWxwaGEgaX0kJA0KeQ0KJCRDX1xhbHBoYShqKT0gXGZyYWN7XHNxcnR7XGxhbWJkYV9cYWxwaGF9fXtcc3FydHtjX2p9fSBcOyBcdXBzaWxvbl97XGFscGhhIGp9LCQkDQoNCmRvbmRlICRcbGFtYmRhX1xhbHBoYSQsIGVzIGVsIHZhbG9yIHByb3BpbyBhc29jaWFkbyBhbCBmYWN0b3IgJFxhbHBoYSQuDQoNCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCiMgUmVjb25zdHJ1Y2Npw7NuIGRlIGxhIG1hdHJpeiBkZSBjb3JyZXNwb25kZW5jaWENCg0KUGFyYSByZWNvbnN0cnVpciBsYSBtYXRyaXogZGUgY29ycmVzcG9uZGVuY2lhICRQJCwgcG9kZW1vcyByZXNvbHZlciBsYXMgZWN1YWNpb25lcyBcQHJlZihlcTplYy00LTIpIHkgXEByZWYoZXE6ZWMtNC0zKSBwYXJhICRQJCwgb2J0ZW5pZW5kbyBsYSBzaWd1aWVudGUgZWN1YWNpw7NuOg0KDQpcYmVnaW57ZXF1YXRpb259DQpQIFw7PVw7IGYgXCwgYyBcOytcOyBEX2ZeezEvMn0gVVwsIERcLCBWXlQgRF9jXnsxLzJ9LCAgICAoXCNlcTplYy00LTQpDQpcZW5ke2VxdWF0aW9ufQ0KDQpvIGVuIHTDqXJtaW5vcyBkZSBzdXMgZWxlbWVudG9zOg0KDQoNClxiZWdpbntlcW5hcnJheSp9DQpwX3tpan0gJj0mIGZfaSBjX2ogXDsrXDsgKDAsMCxcbGRvdHMsXHVuZGVyYnJhY2V7XHNxcnR7Zl9pfX1fe1x0ZXh0e1Bvc2ljacOzbn0gXCxpfSwgXGxkb3RzLDApIFw7IFVcLCAgRCBcLCBWXlQgXDsoMCwwLCBcbGRvdHMsIFx1bmRlcmJyYWNle1xzcXJ0e2Nfan19X3tcdGV4dHtQb3NpY2nDs259IFwsan0sIFxsZG90cywgMCleVFxcDQomPSYgZl9pIFwsIGNfalwsIFxsZWZ0WzFcOytcOyBcc3VtX3tcYWxwaGE9MX0gXGZyYWN7MX17XHNxcnR7XGxhbWJkYV9cYWxwaGF9fSBcLCBGX1xhbHBoYSAoaSkgXCwgR19cYWxwaGEoailccmlnaHRdDQpcZW5ke2VxbmFycmF5Kn0NCg0KDQpgYGB7ciwgZWNobz1GQUxTRSwgZXZhbD1GQUxTRX0NCmxpYnJhcnkoRmFjdG9NaW5lUikNCmxpYnJhcnkoZmFjdG9leHRyYSkNCnJlcy5jYSA8LSBDQSh0YWJsYSwgZ3JhcGggPSBGQUxTRSkNCnN1bW1hcnkocmVzLmNhKQ0KYGBgDQoNCg0KDQo8IS0tICUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUgLS0+DQo8IS0tIFNlcGFyYWRvciAtLT4NCg0KIyBDb250cmlidWNpb25lcyBhYnNvbHV0YXMgeSByZWxhdGl2YXMNCg0KIyMjIENvbnRyaWJ1Y2lvbmVzOiBnZW5lcmFsaWRhZGVzDQoNCkxhcyBjb250cmlidWNpb25lcyBheXVkYW4gYSBpbnRlcnByZXRhciBsb3MgZWplcy4gUG9yIGVqZW1wbG8sIA0KICANCiAgMS4gTGEgY29udHJpYnVjacOzbiBhYnNvbHV0YSBkZSBsYSBmaWxhICRpJCBhIHVuIGZhY3RvciAkXGFscGhhJCBpbmRpY2EgbGEgaW5lcmNpYSBleHBsaWNhZGEgcG9yIGVzZSBmYWN0b3IgZ2VuZXJhZG8gcG9yIGxhIGZpbGEgJGkkLg0KICANCiAgMi4gTGEgc3VtYSBkZSB0b2RhcyBsYXMgY29udHJpYnVjaW9uZXMgYWJzb2x1dGFzIGRlIGxhcyBmaWxhcyBwYXJhIHVuIGZhY3RvciBlcyBpZ3VhbCBhIGxhIGluZXJjaWEgZGVsIGZhY3Rvci4gDQogIA0KICAzLiBQb3IgbG8gdGFudG8sIGFsIGRpdmlkaXIgbGEgY29udHJpYnVjacOzbiBhYnNvbHV0YSBkZSBjYWRhIGZpbGEgZW50cmUgbGEgaW5lcmNpYSBjb3JyZXNwb25kaWVudGUgYWwgZmFjdG9yLCBvYnRlbmVtb3MgZWwgcG9yY2VudGFqZSBkZSB2YXJpYWJpbGlkYWQgZW4gZWwgZmFjdG9yIGRlYmlkbyBhIGVzYSBmaWxhLCBjb25vY2lkbyBjb21vICpjb250cmlidWNpw7NuIHJlbGF0aXZhIGRlIGxhIGZpbGEgYSBsYSBpbmVyY2lhIGRlbCBmYWN0b3IqOiANCiAgDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQojIyMgQ29udHJpYnVjaW9uZXM6IHJlc3VtZW46ICANCg0KDQogIA0KIExhIGNvbnRyaWJ1Y2nDs24gYWJzb2x1dGEgZGVsIHB1bnRvICRpJCBhIGxhIGluZXJjaWEgJFxsYW1iZGFfXGFscGhhJCBlcyAgDQogDQogJCRmX2kgXCwgRl9cYWxwaGFeMihpKSQkIA0KIExhIGNvbnRyaWJ1Y2nDs24gcmVsYXRpdmEgZGVsIHB1bnRvICRpJCBhIGxhIGluZXJjaWEgJFxsYW1iZGFfXGFscGhhJCBlcw0KIA0KJCRcZnJhY3tmX2kgXCwgRl9cYWxwaGFeMihpKX17XGxhbWJkYV9cYWxwaGF9JCQNCg0KTGEgY29udHJpYnVjacOzbiByZWxhdGl2YSBkZWwgZmFjdG9yICRcYWxwaGEkIGEgbGEgaW5lcmNpYSB0b3RhbCBlcw0KICAgICAgDQokJFxmcmFje1xsYW1iZGFfXGFscGhhfXtcc3VtXGxpbWl0c197aj0xfV50IFxsYW1iZGFfan0kJA0KICANCg0KPCEtLSAlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlIC0tPg0KPCEtLSBTZXBhcmFkb3IgLS0+DQoNCmBgYHtyLCBlY2hvPUZBTFNFLCBldmFsPSBGQUxTRX0NCiMgRkFMVEEgZWplbXBsb3MgZW4gTWFydGluIGNhcC4gNCANCg0KIyBGYWx0YSB0ZW9yw61hIHkgZWplbXBsb3MgZGUgdW5uYWwgY2FwLiAzDQpgYGANCg0KDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQoNCiMgRWplcmNpY2lvcw0KDQpQZW5kaWVudGUNCg0KDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQoNCg0KIyBCaWJsaW9ncmFmw61hIHsudW5saXN0ZWQgLnVubnVtYmVyZWR9DQogIA0KQ29uc3VsdGFyIGVsIGRvY3VtZW50byBbUlB1YnMgOjogQW7DoWxpc2lzIG11bHRpdmFyaWFkbyAoYmlibGlvZ3JhZsOtYSldKGh0dHBzOi8vcnB1YnMuY29tL2hsbGluYXMvUl9NdWx0aXZhcmlhZG9fQmlibGlvZ3JhZmlhKS4NCg0KDQoNCjwhLS0gJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSAtLT4NCjwhLS0gU2VwYXJhZG9yIC0tPg0KDQoNCiZuYnNwOw0KDQoNCiZuYnNwOw0KPGNlbnRlcj4NCn5+fg0KSWYgeW91IGZvdW5kIGFueSBFUlJPUlMgb3IgaGF2ZSBTVUdHRVNUSU9OUywgcGxlYXNlIHJlcG9ydCB0aGVtIHRvIG15IGVtYWlsLiBUaGFua3MuICANCn5+fg0KPC9jZW50ZXI+DQoNCg0K