MUESTREO SISTEMÁTICO CON ARRANQUE ALEATORIO

Definición
Una muestra obtenida al seleccionar aleatoriamente un elemento de los
primeros k elementos en el marco y después cada k-ésimo elemento se
denomina muestra sistemática 1 de cada k elementos.
Ventajas del muestreo sistematico
- El muestreo sistemático es mas fácil de lleva a cabo en el campo, y
por lo tanto a diferencia del muestreo aleatorio simple esta menos
expuesto a los errores de selección que comenten los encuestadores.
Especialmente si no disponen de un marco adecuado.
- El muestreo sistemático puede proporcionar mas información por
unidad de costo que lo que proporciona el muestreo aleatorio simple para
poblaciones con determinados patrones en la organización de
elementos.
Ejemplos de encuestas que utilizan muestreo
sistemático
La Encuesta Gallup inicia su proceso de muestreo enumerando los
distritos electorales de los Estados Unidos y luego selecciona
sistematicamente 300 para un estudio complementario de
familias.
La mayoría de los planes de muestreo para el control de calidad
industrial suelen ser sistemáticos en su estructura. Un plan de
inspección para los artículos fabricados a lo largo de una cadena de
montaje en movimiento puede requerir la inspección de cada quincuagésimo
artículo. Una inspección de las cajas de los productos almacenados en un
depósito puede sugerir muestrear la segunda caja de la izquierda en la
tercera fila, de arriba hacia abajo, de cada cinco montones. En la
inspección del trabajo realizado en los puestos de operarios, el plan de
inspección puede requerir el ir y venir por las filas de los puestos e
inspeccionar la maquinaria en cada décimo puesto. La hora del día a
menudo es importante, para evaluar la calidad de la labor realizada por
el trabajador, y así un plan de inspección puede requerir el muestreo de
la producción de un puesto de operario en horas seleccionadas
sistemáticamente durante el día.
Los investigadores de mercado y los encuestadores, que muestrean
personas en movimiento, muy frecuentemente emplean un diseño
sistemático. A cada vigésimo cliente en una caja de pago se le puede
preguntar su opinión acerca del sabor, color o textura de un producto
alimenticio. A cada décima persona que suba a un autobús se le puede
pedir que llene un cuestionario acerca del servicio de autobús. Cada
centésimo automóvil que entra a un parque de atracciones puede ser
detenido y preguntarle al conductor acerca de los sistemas de publicidad
del parque o sobre el precio de los boletos. Todas estas muestras son
sistemáticas.
Pasos para realizar un muestreo sistemático
Los pasos para obtener una muestra sistemática de tamaño n de una
población N son:
- Enumere cada elemento de la población.
- Determine el valor de k tal que nk=N (ancho del intervalo).
- Elija un punto de partida aleatorio(menor o igual a k).
- Seleccione cada K-ésimo elemento a partir del punto de partida.
Ejemplo de selección sistemática
Seleccione una muestra sistematica de tamaño 8 del conjunto de datos
iris(N=150)
pob <- iris
N <- nrow(iris)
n <- 8 # tamaño de muestra
(intervalo <- ceiling(N/n)) # tamaño del intervalo k
## [1] 19
k <- intervalo
set.seed(1234) # reproducibilidad
arranque <- sample(1:intervalo,1) # posición inicial
indices <- seq(arranque,arranque+k*(n-1),k) # posiciones de la muestra
iris %>% # selección de la muestra
rowid_to_column() %>%
slice(indices)
## rowid Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1 16 5.7 4.4 1.5 0.4 setosa
## 2 35 4.9 3.1 1.5 0.2 setosa
## 3 54 5.5 2.3 4.0 1.3 versicolor
## 4 73 6.3 2.5 4.9 1.5 versicolor
## 5 92 6.1 3.0 4.6 1.4 versicolor
## 6 111 6.5 3.2 5.1 2.0 virginica
## 7 130 7.2 3.0 5.8 1.6 virginica
## 8 149 6.2 3.4 5.4 2.3 virginica
Población ordenada
Decimos que una población es aleatoria si el orden en el que se
encuentran los elementos es aleatoria.
Una población es ordenada si los elementos de la población tienden a
aumentar o disminuir cuando se enumeran.
Una población ordenada aparece por ejemplo en listados cronológicos
como el balance de hipotecas pendientes de pago, por lo general, las
hipotecas mas antiguas tienden a tener menor valor que las nuevas.
Tambien deben considerarse de forma especial los casos en los que una
poblacion tiene una tendencia periódica, como seria por ejemplo una
curva seonosoidal simple. Para trabajarlas adecuadamente el valor de K
debe ser un múltiplo impar del semiperiodo.
Las poblaciones periódicas senosiodales no se esperan en la práctica,
pero las poblaciones con una tendencia periódica sí son bastante
comunes, un ejemplo de ella son el flujo de trafico que pasa por un
punto dado en una carretera en un periodo de 24 horas, o las ventas de
un almacén en un periodo de 7 días.
Ejemplo:
En el siguiente ejemplo se realiza un muestreo sistemático sobre un
conjunto de datos de diferentes granos de café seleccionados de
diferentes lugares del mundo.
coffee <- readr::read_csv('https://raw.githubusercontent.com/rfordatascience/tidytuesday/master/data/2020/2020-07-07/coffee_ratings.csv')
coffee1 <- coffee %>%
rowid_to_column()
ggplot(coffee1,aes(x=rowid,y=aftertaste))+
geom_point()+
ylim(c(6,8))+
geom_smooth(method = "loess")

Cuando se observa que la variable aftertaste
tiende a
disminuir conforme el número de elemento aumenta, podemos decir que es
que tenemos una población ordenada.
coffee_desord<-coffee %>%
slice_sample(prop=1) %>% rowid_to_column() # población desordenada
ggplot(coffee_desord,aes(x=rowid,y=aftertaste))+
geom_point()+
ylim(c(5,9))+
geom_smooth(method = "loess")

Comparación de muestra sistemáticas población ordenada y
desordenada
pob_ord <-coffee$aftertaste
pob_des <- coffee_desord$aftertaste
N <- length(pob_ord)
n <- 60
k <- floor(N/n)
arranque <- sample(1:k,1)
indices <- seq(arranque,arranque+k*(n-1),k)
indices2 <- sample(1:N,length(indices))
muestras <- data.frame(
m_o = pob_ord[indices], # m.sis pob ordenada
m_d = pob_des[indices], # m.sis pob desdordenada
m_a = pob_ord[indices2] # m. aleatorio pob ordenada
)
muestras %>%
summarise_all(mean)
## m_o m_d m_a
## 1 7.389333 7.484833 7.4265
## [1] 7.401083
Al realizar una selección sistemática de los elementos de una
población, dichos elementos tenderán a estar mas separados numéricamente
que en una muestra aleatoria simple, si la población esta ordenada
entonces las muestras tendrán observaciones de los valores mas grandes y
mas pequeños por lo que la varianza de las medias muestrales serán
menores que las varianzas de de las medias muestrales cuando se realiza
muestreo aleatorio simple, de modo que utilizar la formula de muestreo
aleatorio simple produce una sobrestimación del verdadero error de
muestreo.
Inferencias con paquete survey
Para realizar inferencias con el paquete survey debemos suponer que
el la población es aleatoria o esta desordenada. Para realizar
inferencias primero se define el diseño para posteriormente aplicar los
comandos para media total o proporción.
require(survey)
svydesign(data=muestras,
ids=~1,
fpc=rep(N,
nrow(muestras)))->d_sis # Diseño aleatorio simple
svymean(x=~m_o,
design=d_sis,
deff=T) # Estimación de la media
## mean SE DEff
## m_o 7.389333 0.042579 1
Ejemplo
Utilizando el conjunto de datos BigLucy Realice lo siguiente:
- tome una muestra de 600 empresas
- Calcule una estimación una estimación del total de empleados
- Encuentra una estimación de la proporción de las empresas con
ISO=yes
- Realice una estimación de el ingreso promedio de las empresas
library(TeachingSampling)
data("BigLucy")
N <- nrow(BigLucy)
n <- 600 # tamaño de muestra
(intervalo <- ceiling(N/n)) # tamaño del intervalo k
## [1] 143
k <- intervalo
set.seed(1234) # reproducibilidad
arranque <- sample(1:intervalo,1) #posición inicial
indices <- seq(arranque,arranque+k*(n-1),k)
muestra<-BigLucy %>% slice(indices)
d<-svydesign(data=muestra,
id=~1,
fpc=rep(N,nrow(muestra)))
svytotal(~Employees,d)
## total SE
## Employees 5314498 111014
## mean SE
## ISOno 0.66332 0.0193
## ISOyes 0.33668 0.0193
## mean SE
## Income 431.75 10.694
Muestreo sistemático Repetido
Como en la mayoría de los casos el muestreo aleatorio sistemático no
es equivalente al muestreo aleatorio simple, un método alternativo para
realizar inferencias consiste en obtener varias replicas de muestreo
sistemático para luego obtener estimaciones de parámetros
poblacionales.
Diez muestras sistemáticas de 1 de cada 50 equivalen a una muestra
sistemática de 1 cada 5.
Las siguientes formulas se pueden utilizar para estimar media y error
para un muestreo sistemático repetido.
\[\widehat{\mu}=\sum_{i=1}^{n_s}\frac{\overline{y}_i}{n_s}
\] \[\widehat{V}(\widehat{\mu})=\frac{(N-n)}{N}\frac{S_{\overline{y}}^2}{n_s}\]
En donde
\[S_{\overline{y}}^2=\frac{\sum_{i=1}^{n_s}{(\overline{y}_i-\mu)}^2}{n_s-1}\]
\[\widehat\tau=N\widehat\mu\]
\[\widehat{V}(\widehat{\tau})=N^2\widehat{V}(\widehat{\tau})\]
Ejemplo muestreo sistemático repetido
Suponga que se tiene una población normal con media 50 y desviación
estándar 5 de 400 elementos y tomara una muestra de 80 elementos para
estimar la varianza de la distribución muestral de medias. Para esto
implemente un muestreo sistemático repetido. de 10 muestras de tamaño 8
cada una. Realice una estimación de la media
N <- 400 # tamaño de la población
n <- 8 # tamaño de la muestra
ns <- 10 # número de muestras
pob <- round(rnorm(N,mean =50,sd = 5)) # población normal
sist<-function(pob,n){
N <- length(pob)
k <- floor(N/n)
a <- sample(1:k,1)
indices <- seq(a,a+k*(n-1),k)
m <- pob[indices]
m
}
replicate(n=ns,
expr={
sist(pob,8)
}
) -> muestras
# muestras
medias <- apply(muestras,2,mean) # Medias de las muestras
mu=sum(medias)/ns # Estimación de la media poblacional
s_c <- sum((medias-mu)^2)/(ns-1)
fpc <- (N-n)/N
V <- fpc*s_c/ns
c(mu=mu,error_estandar=sqrt(V))
## mu error_estandar
## 50.937500 0.718057
Tamaño de las muestras
Para el cálculo del tamaño de muestras se utilizan las fórmulas de
muestreo aleatorio simple. Estas fórmulas podrian dar una muestra muy
grande para poblaciones ordenadas y muy pequeña para poblaciones
periódicas.
\[n=\frac{N\sigma^2}{(N-1)e^2/4+\sigma^2}\] |
\[n=\frac{Npq}{(N-1)e^2/4+pq}\] |
\[n=\frac{N\sigma^2}{(N-1)\frac{e^2}{4N^2}+\sigma^2}\] |
Ejemplo
Encuentre el tamaño de la muestra para estimar la proporción de
empresas que tienen certificación ISO con un error del 5%
B <- 0.05
D <- B^2/4
p <- 0.5
q <- 0.5
N <- nrow(BigLucy)
n <- ceiling(N*p*q/((N-1)*D+p*q))
n
## [1] 399
La muestra sistemática una muestra por
Conglomerados
Para aprender más acerca del comportamiento de V(sy), podemos
examinar una muestra sistemática de n elementos como una muestra por
conglomerados sencilla de k posibles muestras por conglomerados en la
población que se estudia. De forma esquemática, considere que la
población está organizada como una matriz rectangular, como muestra la
Tabla.

Aquí. N = nk. El muestreo sistemático, como se ha descrito
anteriormente, implica seleccionar aleatoriamente uno de los k
conglomerados (filas) y así, una de las k posibles medias muestrales. Es
decir tomar probabilidades iguales.
con lo que \[V(\overline{y}_s)=\frac{\sigma^2}{n}[1+(n-1)\rho]\]
donde \(\rho\) que mide la
interrelación entre las unidades dentro de las muestras.
Lógicamente,esta interrelación debe ser lo más pequeña posible, ya que
en el muestreo sistemático interesa la heterogeneidad intramuestral, con
la finalidad de que una única muestra sistemática represente lo mejor
posible a toda la población. Para que una muestra sistemática aspire a
ser fiel espejo de toda la población ha de ser heterogénea, y la
interrelación entre sus unidades ha de ser baja. Por lo tanto,
inicialmente parece lógico que interesen valores muy pequeños del
coeficiente de correlación intramuestral.
si se dispone de la población de mediciones, se pueden realizar
cálculos del tipo ANOVA calculando la suma de cuadrados del
error(adentro de conglomerados intravarianza), suma de cuadrados entre
conglomerados(suma de cuadrados del tratamiento intervarianza) y suma de
cuadrados totales (cuasivarianza).
Las ecuaciones son las siguientes.
\[\widehat
{S}²_T=\frac{TSS}{nk-1}=\frac{1}{nk-1}\sum_{i=1}^{k}{\sum_{j=1}^{n}{(y_{ij}-\overline{\overline{y}})^2}}=cuasivarianza\]
\[\widehat
{S}²_t=\frac{SST}{k-1}=\frac{n}{k-1}\sum_{j=1}^{k}{(\overline{y}_i-\overline{\overline
y})^2}=Intervarianza\] \[\widehat
{S}²_E=\frac{SSE}{k(n-1)}=\frac{1}{k(n-1)}\sum_{i=1}^{k}{\sum_{j=1}^{n}{(y_{ij}-\overline{y}_i)^2}}=intravarianza\]
con \[TSS=SSE+SST\] \[\rho=\frac{n\widehat {S}²_t-\widehat
{S}²_T}{(n-1)\widehat {S}²_T}=1-\frac{n}{n-1}\frac{SSE}{TSS}\]
TABLA ANOVA
factor |
k-1 |
SST |
error |
nk-k |
SSE |
total |
nk-1 |
TSS |
Ejemplo de cálculo de correlacion entre elementos del mismo
conglomerdado
considere la siguiente población:
Ingreso |
2000 |
3000 |
1000 |
5000 |
2500 |
3600 |
7000 |
8000 |
2900 |
7700 |
3500 |
5000 |
calcule el valor de \(\rho\) cuando
toman muestras sistemáticas de tamaño n=4.
Solución: como 12/4=3 entonces tenemos que k=3 osea que hay tres
conglomerados de muestras sistemáticas empezando con k=1,2,3
require(knitr)
N <- 12
n <- 4
k <- N/n
pob <- c(2000, 3000, 1000, 5000, 2500 ,3600, 7000, 8000, 2900, 7700, 3500 ,5000)
conglomerados <- data.frame(indices=1:12,
muestra=pob,
conglomerado=factor(rep(c("c1","c2","c3"),n)))
conglomerados %>%
spread(key = indices,
value = muestra,
fill="--") %>% kable() # Indices a columnas
c1 |
2000 |
– |
– |
5000 |
– |
– |
7000 |
– |
– |
7700 |
– |
– |
c2 |
– |
3000 |
– |
– |
2500 |
– |
– |
8000 |
– |
– |
3500 |
– |
c3 |
– |
– |
1000 |
– |
– |
3600 |
– |
– |
2900 |
– |
– |
5000 |
anova <- aov(muestra~conglomerado,
data=conglomerados) # ANOVA
summary(anova)[[1]]->tabla
tabla
## Df Sum Sq Mean Sq F value Pr(>F)
## conglomerado 2 10581667 5290833 1.0105 0.4019
## Residuals 9 47125000 5236111
SSE=tabla$`Sum Sq`[2]
TSS=tabla$`Sum Sq`[1]+SSE
(rho=1-n/(n-1)*SSE/TSS)
## [1] -0.08884011
Resumen
- El muestreo sistemático se presenta como una alternativa para el
muestreo aleatorio simple.
- Es más fácil de llevar a cabo y, por tanto, está menos expuesto que
el muestreo aleatorio simple a los errores del entrevistador. Además, el
muestreo sistemático frecuentemente proporciona más información que el
muestreo aleatorio simple por unidad de coste.
- Para seleccionar entre el muestreo aleatorio simple y el
sistemático, primero debemos considerar el tipo de población que se
investiga. Por ejemplo, cuando N es grande y ρ < 0, la varianza de
V(sy) es más pequeña que la varianza correspondiente de V(y) basada en
una muestra aleatoria simple.
- Una muestra sistemática es preferible cuando la población está
ordenada y N es grande. Cuando la población es aleatoria, los dos
procedimientos de muestreo son equivalentes y cualquiera de los dos
diseños puede ser utilizado.
- Debe tenerse cuidado en la aplicación del muestreo sistemático para
poblaciones periódicas. Las necesidades de tamaño de muestra para
estimar μ, τ y ρ, son determinadas usando las fórmulas presentadas para
el muestreo aleatorio simple.
- El muestreo sistemático repetido que s permite al investigador
estimar la media o el total poblacionales y la varianza del estimador,
sin establecer ningún supuesto acerca de la naturaleza de la
población.
Ejercicios
problema1: 7.5,7.6,
Problema2: 7.7,7.11
Problema3:
considere la siguiente población:
Ingreso |
2000 |
3000 |
7000 |
5000 |
5500 |
3600 |
7000 |
9000 |
2900 |
5700 |
2500 |
5000 |
calcule el valor de \(\rho\) cuando
toman muestras sistemáticas de tamaño n=3.
Problema4:
suponga que se tiene una población de 500 elementos y tomara una
muestra de 100 elementos para estimar la varianza de la distribución
muestral de medias. Para esto se implementará un muestreo sistemático
repetido. de 20 muestras de tamaño 5 cada una.(población normal
media=50,sd=5, semilla=edad)
Bibliografía
- Cochran, W. G. Técnicas de Muestreo.
- Lopez Cesar, Muestreo estadístico
- LUMLEY, Thomas. Complex surveys: a guide to analysis using R. John
Wiley & Sons, 2011.
- Scheaffer,Richard L. Elementos de muestreo.
- Valdivieso Serrano,Luis. Notas de Técnicas de Muestreo.
LS0tDQphdXRob3I6ICJMdWlzIENhcmxvcyBCb2xhw7FvcyINCmRhdGU6ICdgciBmb3JtYXQoU3lzLkRhdGUoKSlgJw0KdGl0bGU6IE1VRVNUUkVPIFNJU1RFTcOBVElDTw0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50Og0KICAgIHRvY19mbG9hdDogdHJ1ZQ0KICAgIG51bWJlcl9zZWN0aW9uczogZmFsc2UNCiAgICB0aGVtZTogc3BhY2VsYWINCiAgICB0b2M6IHRydWUNCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQogICAgaGlnaGxpZ2h0OiBlc3ByZXNzbyANCi0tLQ0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldCgNCgllY2hvID0gVFJVRSwNCgltZXNzYWdlID0gRkFMU0UsDQoJd2FybmluZyA9IEZBTFNFDQopDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmBgYA0KIyMgKipNVUVTVFJFTyBTSVNURU3DgVRJQ08gQ09OIEFSUkFOUVVFIEFMRUFUT1JJTyoqDQoNCjxpbWcgc3JjPSJzaXN0ZW1hdGljby5wbmciIGFsdD0iZHJhd2luZyIgd2lkdGg9IjQwMCIvPg0KDQoNCiMjICoqRGVmaW5pY2nDs24qKg0KVW5hIG11ZXN0cmEgb2J0ZW5pZGEgYWwgc2VsZWNjaW9uYXIgYWxlYXRvcmlhbWVudGUgdW4gZWxlbWVudG8gZGUgbG9zIHByaW1lcm9zIGsgZWxlbWVudG9zIGVuIGVsIG1hcmNvIHkgZGVzcHXDqXMgY2FkYSBrLcOpc2ltbyBlbGVtZW50byBzZSBkZW5vbWluYSAgbXVlc3RyYSBzaXN0ZW3DoXRpY2EgICAgMSBkZSBjYWRhIGsgZWxlbWVudG9zLg0KDQojIyAqKlZlbnRhamFzICBkZWwgbXVlc3RyZW8gc2lzdGVtYXRpY28qKg0KDQoxLiBFbCBtdWVzdHJlbyBzaXN0ZW3DoXRpY28gZXMgbWFzIGbDoWNpbCAgZGUgbGxldmEgYSBjYWJvIGVuIGVsIGNhbXBvLCAgeSBwb3IgbG8gdGFudG8gYSBkaWZlcmVuY2lhIGRlbCBtdWVzdHJlbyBhbGVhdG9yaW8gc2ltcGxlIGVzdGEgbWVub3MgZXhwdWVzdG8gYSBsb3MgZXJyb3JlcyBkZSBzZWxlY2Npw7NuIHF1ZSBjb21lbnRlbiBsb3MgZW5jdWVzdGFkb3Jlcy4gRXNwZWNpYWxtZW50ZSBzaSBubyBkaXNwb25lbiBkZSB1biBtYXJjbyBhZGVjdWFkby4NCjIuIEVsIG11ZXN0cmVvIHNpc3RlbcOhdGljbyAgcHVlZGUgcHJvcG9yY2lvbmFyICBtYXMgaW5mb3JtYWNpw7NuIHBvciB1bmlkYWQgZGUgY29zdG8gcXVlIGxvIHF1ZSBwcm9wb3JjaW9uYSBlbCBtdWVzdHJlbyBhbGVhdG9yaW8gc2ltcGxlIHBhcmEgcG9ibGFjaW9uZXMgY29uIGRldGVybWluYWRvcyBwYXRyb25lcyBlbiBsYSBvcmdhbml6YWNpw7NuIGRlIGVsZW1lbnRvcy4NCg0KIyMgKipFamVtcGxvcyBkZSBlbmN1ZXN0YXMgIHF1ZSB1dGlsaXphbiBtdWVzdHJlbyBzaXN0ZW3DoXRpY28qKg0KDQoqIExhIEVuY3Vlc3RhIEdhbGx1cCBpbmljaWEgc3UgcHJvY2VzbyAgZGUgbXVlc3RyZW8gZW51bWVyYW5kbyBsb3MgZGlzdHJpdG9zIGVsZWN0b3JhbGVzIGRlIGxvcyBFc3RhZG9zIFVuaWRvcyB5IGx1ZWdvIHNlbGVjY2lvbmEgc2lzdGVtYXRpY2FtZW50ZSAzMDAgIHBhcmEgdW4gZXN0dWRpbyBjb21wbGVtZW50YXJpbyBkZSBmYW1pbGlhcy4NCg0KKiBMYSBtYXlvcsOtYSBkZSBsb3MgcGxhbmVzIGRlIG11ZXN0cmVvIHBhcmEgZWwgY29udHJvbCBkZSBjYWxpZGFkIGluZHVzdHJpYWwgc3VlbGVuIHNlciBzaXN0ZW3DoXRpY29zIGVuIHN1IGVzdHJ1Y3R1cmEuIFVuIHBsYW4gZGUgaW5zcGVjY2nDs24gcGFyYSBsb3MgYXJ0w61jdWxvcyBmYWJyaWNhZG9zIGEgbG8gbGFyZ28gZGUgdW5hIGNhZGVuYSBkZSBtb250YWplIGVuIG1vdmltaWVudG8gcHVlZGUgcmVxdWVyaXIgbGEgaW5zcGVjY2nDs24gZGUgY2FkYSBxdWluY3VhZ8Opc2ltbyBhcnTDrWN1bG8uIFVuYSBpbnNwZWNjacOzbiBkZSBsYXMgY2FqYXMgZGUgbG9zIHByb2R1Y3RvcyBhbG1hY2VuYWRvcyBlbiB1biBkZXDDs3NpdG8gcHVlZGUgc3VnZXJpciBtdWVzdHJlYXIgbGEgc2VndW5kYSBjYWphIGRlIGxhIGl6cXVpZXJkYSBlbiBsYSB0ZXJjZXJhIGZpbGEsIGRlIGFycmliYSBoYWNpYSBhYmFqbywgZGUgY2FkYSBjaW5jbyBtb250b25lcy4gRW4gbGEgaW5zcGVjY2nDs24gZGVsIHRyYWJham8gcmVhbGl6YWRvIGVuIGxvcyBwdWVzdG9zIGRlIG9wZXJhcmlvcywgZWwgcGxhbiBkZSBpbnNwZWNjacOzbiBwdWVkZSByZXF1ZXJpciBlbCBpciB5IHZlbmlyIHBvciBsYXMgZmlsYXMgZGUgbG9zIHB1ZXN0b3MgZSBpbnNwZWNjaW9uYXIgbGEgbWFxdWluYXJpYSBlbiBjYWRhIGTDqWNpbW8gcHVlc3RvLiBMYSBob3JhIGRlbCBkw61hIGEgbWVudWRvIGVzIGltcG9ydGFudGUsIHBhcmEgZXZhbHVhciBsYSBjYWxpZGFkIGRlIGxhIGxhYm9yIHJlYWxpemFkYSBwb3IgZWwgdHJhYmFqYWRvciwgeSBhc8OtIHVuIHBsYW4gZGUgaW5zcGVjY2nDs24gcHVlZGUgcmVxdWVyaXIgZWwgbXVlc3RyZW8gZGUgbGEgcHJvZHVjY2nDs24gZGUgdW4gcHVlc3RvIGRlIG9wZXJhcmlvIGVuIGhvcmFzIHNlbGVjY2lvbmFkYXMgc2lzdGVtw6F0aWNhbWVudGUgZHVyYW50ZSBlbCBkw61hLg0KKiBMb3MgaW52ZXN0aWdhZG9yZXMgZGUgbWVyY2FkbyB5IGxvcyBlbmN1ZXN0YWRvcmVzLCBxdWUgbXVlc3RyZWFuIHBlcnNvbmFzIGVuIG1vdmltaWVudG8sIG11eSBmcmVjdWVudGVtZW50ZSBlbXBsZWFuIHVuIGRpc2XDsW8gc2lzdGVtw6F0aWNvLiBBIGNhZGEgdmlnw6lzaW1vIGNsaWVudGUgZW4gdW5hIGNhamEgZGUgcGFnbyBzZSBsZSBwdWVkZSBwcmVndW50YXIgc3Ugb3BpbmnDs24gYWNlcmNhIGRlbCBzYWJvciwgY29sb3IgbyB0ZXh0dXJhIGRlIHVuIHByb2R1Y3RvIGFsaW1lbnRpY2lvLiBBIGNhZGEgZMOpY2ltYSBwZXJzb25hIHF1ZSBzdWJhIGEgdW4gYXV0b2LDunMgc2UgbGUgcHVlZGUgcGVkaXIgcXVlIGxsZW5lIHVuIGN1ZXN0aW9uYXJpbyBhY2VyY2EgZGVsIHNlcnZpY2lvIGRlIGF1dG9iw7pzLiBDYWRhIGNlbnTDqXNpbW8gYXV0b23Ds3ZpbCBxdWUgZW50cmEgYSB1biBwYXJxdWUgZGUgYXRyYWNjaW9uZXMgcHVlZGUgc2VyIGRldGVuaWRvIHkgcHJlZ3VudGFybGUgYWwgY29uZHVjdG9yIGFjZXJjYSBkZSBsb3Mgc2lzdGVtYXMgZGUgcHVibGljaWRhZCBkZWwgcGFycXVlIG8gc29icmUgZWwgcHJlY2lvIGRlIGxvcyBib2xldG9zLiBUb2RhcyBlc3RhcyBtdWVzdHJhcyBzb24gc2lzdGVtw6F0aWNhcy4NCg0KIyMgKipQYXNvcyBwYXJhIHJlYWxpemFyIHVuIG11ZXN0cmVvIHNpc3RlbcOhdGljbyoqDQpMb3MgcGFzb3MgcGFyYSBvYnRlbmVyIHVuYSBtdWVzdHJhIHNpc3RlbcOhdGljYSBkZSB0YW1hw7FvIG4gICBkZSB1bmEgcG9ibGFjacOzbiAgTiBzb246DQoNCjEuIEVudW1lcmUgY2FkYSBlbGVtZW50byBkZSBsYSBwb2JsYWNpw7NuLg0KMi4gRGV0ZXJtaW5lIGVsIHZhbG9yIGRlIGsgdGFsIHF1ZSBuaz1OIChhbmNobyBkZWwgaW50ZXJ2YWxvKS4NCjMuIEVsaWphIHVuIHB1bnRvIGRlIHBhcnRpZGEgYWxlYXRvcmlvKG1lbm9yIG8gaWd1YWwgYSBrKS4NCjQuIFNlbGVjY2lvbmUgY2FkYSBLLcOpc2ltbyBlbGVtZW50byBhIHBhcnRpciBkZWwgIHB1bnRvIGRlIHBhcnRpZGEuDQoNCg0KDQojIyAqKkVqZW1wbG8gIGRlIHNlbGVjY2nDs24gc2lzdGVtw6F0aWNhKioNCg0KIFNlbGVjY2lvbmUgdW5hIG11ZXN0cmEgc2lzdGVtYXRpY2EgIGRlIHRhbWHDsW8gOCAgZGVsIGNvbmp1bnRvIGRlIGRhdG9zIGlyaXMoTj0xNTApDQogDQpgYGB7ciAgbXVlc3RyYSBzaXN0ZW1hdGljYTEgfQ0KcG9iIDwtICAgIGlyaXMNCk4gPC0gbnJvdyhpcmlzKQ0KbiA8LSA4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHRhbWHDsW8gZGUgbXVlc3RyYQ0KKGludGVydmFsbyA8LSBjZWlsaW5nKE4vbikpICAgICAgICAjIHRhbWHDsW8gZGVsIGludGVydmFsbyBrDQprIDwtIGludGVydmFsbw0Kc2V0LnNlZWQoMTIzNCkgICAgICAgICAgICAgICAgICAgIyByZXByb2R1Y2liaWxpZGFkIA0KYXJyYW5xdWUgPC0gc2FtcGxlKDE6aW50ZXJ2YWxvLDEpICMgcG9zaWNpw7NuIGluaWNpYWwNCmluZGljZXMgPC0gc2VxKGFycmFucXVlLGFycmFucXVlK2sqKG4tMSksaykgICAgICAgIyBwb3NpY2lvbmVzIGRlIGxhIG11ZXN0cmENCmlyaXMgJT4lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgc2VsZWNjacOzbiBkZSBsYSBtdWVzdHJhDQogIHJvd2lkX3RvX2NvbHVtbigpICU+JSANCiAgc2xpY2UoaW5kaWNlcykNCg0KYGBgDQoNCiMjICoqUG9ibGFjacOzbiBvcmRlbmFkYSoqIA0KDQoNCkRlY2ltb3MgcXVlIHVuYSBwb2JsYWNpw7NuIGVzIGFsZWF0b3JpYSBzaSBlbCBvcmRlbiBlbiBlbCBxdWUgc2UgZW5jdWVudHJhbiBsb3MgZWxlbWVudG9zIGVzIGFsZWF0b3JpYS4NCg0KVW5hIHBvYmxhY2nDs24gZXMgb3JkZW5hZGEgIHNpIGxvcyBlbGVtZW50b3MgIGRlIGxhIHBvYmxhY2nDs24gIHRpZW5kZW4gYSBhdW1lbnRhciBvIGRpc21pbnVpciAgY3VhbmRvIHNlIGVudW1lcmFuLg0KDQoNClVuYSBwb2JsYWNpw7NuIG9yZGVuYWRhIGFwYXJlY2UgcG9yIGVqZW1wbG8gZW4gbGlzdGFkb3MgY3Jvbm9sw7NnaWNvcyBjb21vIGVsIGJhbGFuY2UgZGUgaGlwb3RlY2FzIHBlbmRpZW50ZXMgZGUgcGFnbywgcG9yIGxvIGdlbmVyYWwsIGxhcyBoaXBvdGVjYXMgbWFzIGFudGlndWFzIHRpZW5kZW4gYSB0ZW5lciBtZW5vciB2YWxvciBxdWUgbGFzIG51ZXZhcy4NCg0KVGFtYmllbiAgZGViZW4gY29uc2lkZXJhcnNlIGRlIGZvcm1hIGVzcGVjaWFsIGxvcyBjYXNvcyBlbiBsb3MgcXVlIHVuYSBwb2JsYWNpb24gdGllbmUgdW5hIHRlbmRlbmNpYSBwZXJpw7NkaWNhLCBjb21vIHNlcmlhIHBvciBlamVtcGxvIHVuYSBjdXJ2YSBzZW9ub3NvaWRhbCBzaW1wbGUuICBQYXJhIHRyYWJhamFybGFzIGFkZWN1YWRhbWVudGUgIGVsIHZhbG9yIGRlIEsgZGViZSBzZXIgdW4gbcO6bHRpcGxvIGltcGFyIGRlbCBzZW1pcGVyaW9kby4NCg0KTGFzIHBvYmxhY2lvbmVzIHBlcmnDs2RpY2FzIHNlbm9zaW9kYWxlcyBubyBzZSBlc3BlcmFuIGVuIGxhIHByw6FjdGljYSwgcGVybyBsYXMgcG9ibGFjaW9uZXMgY29uIHVuYSB0ZW5kZW5jaWEgcGVyacOzZGljYSBzw60gc29uIGJhc3RhbnRlIGNvbXVuZXMsIHVuIGVqZW1wbG8gZGUgZWxsYSAgc29uIGVsIGZsdWpvIGRlIHRyYWZpY28gcXVlIHBhc2EgcG9yIHVuIHB1bnRvIGRhZG8gZW4gdW5hIGNhcnJldGVyYSBlbiB1biBwZXJpb2RvIGRlIDI0IGhvcmFzLCBvIGxhcyB2ZW50YXMgZGUgdW4gYWxtYWPDqW4gIGVuIHVuIHBlcmlvZG8gZGUgNyBkw61hcy4gDQoNCiMjIyBFamVtcGxvOg0KDQpFbiBlbCBzaWd1aWVudGUgZWplbXBsbyBzZSByZWFsaXphIHVuIG11ZXN0cmVvIHNpc3RlbcOhdGljbyBzb2JyZSB1biBjb25qdW50byBkZSBkYXRvcyBkZSBkaWZlcmVudGVzIGdyYW5vcyBkZSBjYWbDqSAgc2VsZWNjaW9uYWRvcyBkZSBkaWZlcmVudGVzIGx1Z2FyZXMgZGVsIG11bmRvLiANCg0KDQpgYGB7ciBtdWVzdHJlbyBzaXN0ZW3DoXRpY28gcG9ibGFjaW9uIG9yZGVuYWRhfQ0KY29mZmVlIDwtIHJlYWRyOjpyZWFkX2NzdignaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3Jmb3JkYXRhc2NpZW5jZS90aWR5dHVlc2RheS9tYXN0ZXIvZGF0YS8yMDIwLzIwMjAtMDctMDcvY29mZmVlX3JhdGluZ3MuY3N2JykNCmNvZmZlZTEgPC0gY29mZmVlICU+JSANCiAgcm93aWRfdG9fY29sdW1uKCkNCmdncGxvdChjb2ZmZWUxLGFlcyh4PXJvd2lkLHk9YWZ0ZXJ0YXN0ZSkpKw0KICBnZW9tX3BvaW50KCkrDQogIHlsaW0oYyg2LDgpKSsNCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxvZXNzIikNCmBgYA0KDQpDdWFuZG8gc2Ugb2JzZXJ2YSAgcXVlICBsYSB2YXJpYWJsZSBgYWZ0ZXJ0YXN0ZWAgdGllbmRlIGEgZGlzbWludWlyICBjb25mb3JtZSAgIGVsIG7Dum1lcm8gZGUgZWxlbWVudG8gIGF1bWVudGEsICAgIHBvZGVtb3MgZGVjaXIgcXVlIGVzICBxdWUgdGVuZW1vcyB1bmEgcG9ibGFjacOzbiBvcmRlbmFkYS4NCg0KDQoNCg0KYGBge3Igc2lzdGVtw6F0aWNvIHBvYmxhY2nDs24gZGVzb3JkZW5hZGF9DQpjb2ZmZWVfZGVzb3JkPC1jb2ZmZWUgJT4lIA0KICBzbGljZV9zYW1wbGUocHJvcD0xKSAlPiUgcm93aWRfdG9fY29sdW1uKCkgICMgcG9ibGFjacOzbiBkZXNvcmRlbmFkYQ0KDQpnZ3Bsb3QoY29mZmVlX2Rlc29yZCxhZXMoeD1yb3dpZCx5PWFmdGVydGFzdGUpKSsNCiAgZ2VvbV9wb2ludCgpKw0KICB5bGltKGMoNSw5KSkrDQogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsb2VzcyIpDQoNCg0KYGBgDQoNCiMjIyAqKkNvbXBhcmFjacOzbiBkZSBtdWVzdHJhIHNpc3RlbcOhdGljYXMgcG9ibGFjacOzbiBvcmRlbmFkYSB5IGRlc29yZGVuYWRhKioNCg0KYGBge3IgZXN0YWRpc3RpY2FzIG11ZXN0cmEgc2lzdGVtYXRpY2F9DQpwb2Jfb3JkIDwtY29mZmVlJGFmdGVydGFzdGUNCnBvYl9kZXMgPC0gY29mZmVlX2Rlc29yZCRhZnRlcnRhc3RlDQpOIDwtIGxlbmd0aChwb2Jfb3JkKQ0KbiA8LSA2MA0KayA8LSBmbG9vcihOL24pDQphcnJhbnF1ZSA8LSBzYW1wbGUoMTprLDEpDQppbmRpY2VzIDwtIHNlcShhcnJhbnF1ZSxhcnJhbnF1ZStrKihuLTEpLGspIA0KaW5kaWNlczIgPC0gc2FtcGxlKDE6TixsZW5ndGgoaW5kaWNlcykpDQptdWVzdHJhcyA8LSBkYXRhLmZyYW1lKA0KbV9vID0gcG9iX29yZFtpbmRpY2VzXSwgICMgbS5zaXMgcG9iIG9yZGVuYWRhDQptX2QgPSBwb2JfZGVzW2luZGljZXNdLCAgIyBtLnNpcyBwb2IgZGVzZG9yZGVuYWRhIA0KbV9hID0gcG9iX29yZFtpbmRpY2VzMl0gICMgbS4gYWxlYXRvcmlvIHBvYiBvcmRlbmFkYQ0KKQ0KbXVlc3RyYXMgJT4lIA0KICBzdW1tYXJpc2VfYWxsKG1lYW4pDQptZWFuKHBvYl9kZXMpDQpgYGANCkFsIHJlYWxpemFyIHVuYSBzZWxlY2Npw7NuIHNpc3RlbcOhdGljYSBkZSBsb3MgZWxlbWVudG9zICBkZSB1bmEgcG9ibGFjacOzbiwgZGljaG9zIGVsZW1lbnRvcyAgdGVuZGVyw6FuIGEgZXN0YXIgbWFzIHNlcGFyYWRvcyBudW3DqXJpY2FtZW50ZSAgcXVlIGVuIHVuYSBtdWVzdHJhIGFsZWF0b3JpYSBzaW1wbGUsICAgc2kgbGEgcG9ibGFjacOzbiBlc3RhIG9yZGVuYWRhICBlbnRvbmNlcyBsYXMgbXVlc3RyYXMgICB0ZW5kcsOhbiAgIG9ic2VydmFjaW9uZXMgZGUgbG9zIHZhbG9yZXMgbWFzIGdyYW5kZXMgeSBtYXMgcGVxdWXDsW9zIHBvciBsbyBxdWUgbGEgdmFyaWFuemEgZGUgbGFzIG1lZGlhcyBtdWVzdHJhbGVzICBzZXLDoW4gbWVub3JlcyBxdWUgbGFzIHZhcmlhbnphcyAgZGUgZGUgbGFzIG1lZGlhcyBtdWVzdHJhbGVzIGN1YW5kbyBzZSByZWFsaXphIG11ZXN0cmVvIGFsZWF0b3JpbyBzaW1wbGUsIGRlIG1vZG8gcXVlIHV0aWxpemFyIGxhIGZvcm11bGEgZGUgbXVlc3RyZW8gYWxlYXRvcmlvIHNpbXBsZSBwcm9kdWNlIHVuYSBzb2JyZXN0aW1hY2nDs24gZGVsIHZlcmRhZGVybyBlcnJvciBkZSBtdWVzdHJlby4NCg0KDQojIyAqKkluZmVyZW5jaWFzIGNvbiBwYXF1ZXRlIHN1cnZleSoqDQoNClBhcmEgcmVhbGl6YXIgaW5mZXJlbmNpYXMgY29uIGVsIHBhcXVldGUgc3VydmV5IGRlYmVtb3Mgc3Vwb25lciBxdWUgZWwgbGEgcG9ibGFjacOzbiBlcyBhbGVhdG9yaWEgIG8gZXN0YSBkZXNvcmRlbmFkYS4NClBhcmEgcmVhbGl6YXIgaW5mZXJlbmNpYXMgcHJpbWVybyBzZSBkZWZpbmUgZWwgZGlzZcOxbyBwYXJhIHBvc3Rlcmlvcm1lbnRlICBhcGxpY2FyIGxvcyBjb21hbmRvcyBwYXJhIG1lZGlhIHRvdGFsIG8gcHJvcG9yY2nDs24uDQpgYGB7ciBwYXF1ZXRlIHN1cnZleX0NCnJlcXVpcmUoc3VydmV5KQ0Kc3Z5ZGVzaWduKGRhdGE9bXVlc3RyYXMsDQogICAgICAgICAgaWRzPX4xLA0KICAgICAgICAgIGZwYz1yZXAoTiwgICAgIA0KICAgICAgICAgICAgICAgICAgbnJvdyhtdWVzdHJhcykpKS0+ZF9zaXMgICAjIERpc2XDsW8gYWxlYXRvcmlvIHNpbXBsZQ0Kc3Z5bWVhbih4PX5tX28sDQogICAgICAgIGRlc2lnbj1kX3NpcywNCiAgICAgICAgZGVmZj1UKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBFc3RpbWFjacOzbiBkZSBsYSBtZWRpYSAgICANCg0KYGBgDQoNCg0KIyMgRWplbXBsbw0KDQpVdGlsaXphbmRvIGVsIGNvbmp1bnRvIGRlIGRhdG9zICBCaWdMdWN5ICBSZWFsaWNlIGxvIHNpZ3VpZW50ZToNCg0KKiB0b21lIHVuYSBtdWVzdHJhIGRlIDYwMCBlbXByZXNhcw0KKiBDYWxjdWxlIHVuYSBlc3RpbWFjacOzbiAgdW5hIGVzdGltYWNpw7NuIGRlbCB0b3RhbCBkZSBlbXBsZWFkb3MNCiogRW5jdWVudHJhIHVuYSBlc3RpbWFjacOzbiBkZSBsYSBwcm9wb3JjacOzbiBkZSAgbGFzIGVtcHJlc2FzIGNvbiBJU089eWVzDQoqIFJlYWxpY2UgdW5hIGVzdGltYWNpw7NuICBkZSAgZWwgaW5ncmVzbyBwcm9tZWRpbyBkZSBsYXMgZW1wcmVzYXMNCg0KYGBge3J9DQpsaWJyYXJ5KFRlYWNoaW5nU2FtcGxpbmcpDQpkYXRhKCJCaWdMdWN5IikNCk4gPC0gbnJvdyhCaWdMdWN5KQ0KbiA8LSA2MDAgICAgICAgICAgICAgICAjIHRhbWHDsW8gZGUgbXVlc3RyYQ0KKGludGVydmFsbyA8LSBjZWlsaW5nKE4vbikpICAgICAgICAjIHRhbWHDsW8gZGVsIGludGVydmFsbyBrDQprIDwtIGludGVydmFsbw0Kc2V0LnNlZWQoMTIzNCkgICAgICAjIHJlcHJvZHVjaWJpbGlkYWQgDQphcnJhbnF1ZSA8LSBzYW1wbGUoMTppbnRlcnZhbG8sMSkgI3Bvc2ljacOzbiBpbmljaWFsDQppbmRpY2VzIDwtIHNlcShhcnJhbnF1ZSxhcnJhbnF1ZStrKihuLTEpLGspDQptdWVzdHJhPC1CaWdMdWN5ICU+JSBzbGljZShpbmRpY2VzKQ0KZDwtc3Z5ZGVzaWduKGRhdGE9bXVlc3RyYSwNCiAgICAgICAgICAgICBpZD1+MSwNCiAgICAgICAgICAgICBmcGM9cmVwKE4sbnJvdyhtdWVzdHJhKSkpDQpzdnl0b3RhbCh+RW1wbG95ZWVzLGQpDQpzdnltZWFuKH5JU08sZCkNCnN2eW1lYW4ofkluY29tZSxkKQ0KDQpgYGANCg0KDQoNCg0KDQojIyAqKk11ZXN0cmVvIHNpc3RlbcOhdGljbyBSZXBldGlkbyoqIA0KDQpDb21vIGVuIGxhIG1heW9yw61hIGRlIGxvcyBjYXNvcyAgZWwgbXVlc3RyZW8gYWxlYXRvcmlvIHNpc3RlbcOhdGljbyBubyBlcyBlcXVpdmFsZW50ZSBhbCBtdWVzdHJlbyBhbGVhdG9yaW8gc2ltcGxlLCAgdW4gbcOpdG9kbyBhbHRlcm5hdGl2byBwYXJhIHJlYWxpemFyIGluZmVyZW5jaWFzIGNvbnNpc3RlIGVuIG9idGVuZXIgdmFyaWFzIHJlcGxpY2FzIGRlIG11ZXN0cmVvIHNpc3RlbcOhdGljbyBwYXJhIGx1ZWdvICBvYnRlbmVyIGVzdGltYWNpb25lcyBkZSBwYXLDoW1ldHJvcyBwb2JsYWNpb25hbGVzLg0KDQoNCkRpZXogbXVlc3RyYXMgc2lzdGVtw6F0aWNhcyBkZSAxIGRlIGNhZGEgNTAgICBlcXVpdmFsZW4gYSB1bmEgbXVlc3RyYSBzaXN0ZW3DoXRpY2EgIGRlIDEgY2FkYSA1LiANCg0KTGFzIHNpZ3VpZW50ZXMgZm9ybXVsYXMgc2UgcHVlZGVuIHV0aWxpemFyIHBhcmEgIGVzdGltYXIgIG1lZGlhIHkgZXJyb3IgcGFyYSB1biBtdWVzdHJlbyBzaXN0ZW3DoXRpY28gcmVwZXRpZG8uDQoNCiQkXHdpZGVoYXR7XG11fT1cc3VtX3tpPTF9XntuX3N9XGZyYWN7XG92ZXJsaW5le3l9X2l9e25fc30gJCQNCiQkXHdpZGVoYXR7Vn0oXHdpZGVoYXR7XG11fSk9XGZyYWN7KE4tbil9e059XGZyYWN7U197XG92ZXJsaW5le3l9fV4yfXtuX3N9JCQNCkVuIGRvbmRlDQoNCiQkU197XG92ZXJsaW5le3l9fV4yPVxmcmFje1xzdW1fe2k9MX1ee25fc317KFxvdmVybGluZXt5fV9pLVxtdSl9XjJ9e25fcy0xfSQkDQoNCiAkJFx3aWRlaGF0XHRhdT1OXHdpZGVoYXRcbXUkJA0KDQogJCRcd2lkZWhhdHtWfShcd2lkZWhhdHtcdGF1fSk9Tl4yXHdpZGVoYXR7Vn0oXHdpZGVoYXR7XHRhdX0pJCQNCg0KDQojIyMgKipFamVtcGxvIG11ZXN0cmVvIHNpc3RlbcOhdGljbyByZXBldGlkbyoqDQoNClN1cG9uZ2EgcXVlIHNlIHRpZW5lIHVuYSBwb2JsYWNpw7NuIG5vcm1hbCBjb24gbWVkaWEgNTAgeSBkZXN2aWFjacOzbiBlc3TDoW5kYXIgNSBkZSA0MDAgZWxlbWVudG9zIHkgIHRvbWFyYSB1bmEgbXVlc3RyYSBkZSA4MCBlbGVtZW50b3MgIHBhcmEgZXN0aW1hciBsYSB2YXJpYW56YSBkZSBsYSBkaXN0cmlidWNpw7NuIG11ZXN0cmFsIGRlIG1lZGlhcy4NClBhcmEgZXN0byAgIGltcGxlbWVudGUgdW4gbXVlc3RyZW8gc2lzdGVtw6F0aWNvIHJlcGV0aWRvLiBkZSAxMCBtdWVzdHJhcyAgZGUgdGFtYcOxbyA4IGNhZGEgdW5hLiAgUmVhbGljZSB1bmEgZXN0aW1hY2nDs24gZGUgbGEgbWVkaWEgDQoNCmBgYHtyfQ0KDQpOIDwtIDQwMCAgIyB0YW1hw7FvIGRlIGxhIHBvYmxhY2nDs24NCm4gPC0gOCAgICAjIHRhbWHDsW8gZGUgbGEgbXVlc3RyYQ0KbnMgPC0gMTAgICMgbsO6bWVybyBkZSBtdWVzdHJhcw0KcG9iIDwtIHJvdW5kKHJub3JtKE4sbWVhbiA9NTAsc2QgPSA1KSkgIyBwb2JsYWNpw7NuIG5vcm1hbA0KDQoNCnNpc3Q8LWZ1bmN0aW9uKHBvYixuKXsNCiAgTiA8LSBsZW5ndGgocG9iKQ0KICBrIDwtIGZsb29yKE4vbikNCiAgYSA8LSBzYW1wbGUoMTprLDEpDQogIGluZGljZXMgPC0gc2VxKGEsYStrKihuLTEpLGspDQogIG0gPC0gcG9iW2luZGljZXNdDQogIG0NCn0NCg0KcmVwbGljYXRlKG49bnMsDQogICAgICAgICAgZXhwcj17DQogIHNpc3QocG9iLDgpDQp9DQopIC0+IG11ZXN0cmFzDQoNCiMgbXVlc3RyYXMNCm1lZGlhcyA8LSBhcHBseShtdWVzdHJhcywyLG1lYW4pICAjIE1lZGlhcyBkZSBsYXMgbXVlc3RyYXMNCm11PXN1bShtZWRpYXMpL25zICAgICAgICAgICAgICAjIEVzdGltYWNpw7NuIGRlIGxhIG1lZGlhIHBvYmxhY2lvbmFsDQpzX2MgPC0gc3VtKChtZWRpYXMtbXUpXjIpLyhucy0xKQ0KZnBjIDwtIChOLW4pL04NClYgPC0gZnBjKnNfYy9ucw0KYyhtdT1tdSxlcnJvcl9lc3RhbmRhcj1zcXJ0KFYpKQ0KDQpgYGANCg0KDQojIyAqKlRhbWHDsW8gZGUgbGFzIG11ZXN0cmFzKioNCg0KUGFyYSBlbCBjw6FsY3VsbyBkZWwgdGFtYcOxbyBkZSBtdWVzdHJhcyBzZSB1dGlsaXphbiBsYXMgZsOzcm11bGFzIGRlIG11ZXN0cmVvIGFsZWF0b3JpbyBzaW1wbGUuIEVzdGFzIGbDs3JtdWxhcyBwb2RyaWFuIGRhciB1bmEgbXVlc3RyYSBtdXkgZ3JhbmRlIHBhcmEgcG9ibGFjaW9uZXMgb3JkZW5hZGFzIHkgbXV5IHBlcXVlw7FhIHBhcmEgcG9ibGFjaW9uZXMgIHBlcmnDs2RpY2FzLiANCg0KfE1lZGlhfFByb3BvcmNpw7NufFRvdGFsfA0KfC18LXwtfA0KfCQkbj1cZnJhY3tOXHNpZ21hXjJ9eyhOLTEpZV4yLzQrXHNpZ21hXjJ9JCR8JCRuPVxmcmFje05wcX17KE4tMSllXjIvNCtwcX0kJHwkJG49XGZyYWN7TlxzaWdtYV4yfXsoTi0xKVxmcmFje2VeMn17NE5eMn0rXHNpZ21hXjJ9JCR8DQoNCg0KIyMjIEVqZW1wbG8NCg0KRW5jdWVudHJlIGVsIHRhbWHDsW8gZGUgbGEgbXVlc3RyYSAgIHBhcmEgIGVzdGltYXIgIGxhIHByb3BvcmNpw7NuIGRlIGVtcHJlc2FzIHF1ZSB0aWVuZW4gY2VydGlmaWNhY2nDs24gSVNPIGNvbiB1biBlcnJvciAgZGVsIDUlDQoNCmBgYHtyfQ0KQiA8LSAwLjA1DQpEIDwtIEJeMi80DQpwIDwtIDAuNQ0KcSA8LSAwLjUNCk4gPC0gbnJvdyhCaWdMdWN5KQ0KbiA8LSBjZWlsaW5nKE4qcCpxLygoTi0xKSpEK3AqcSkpDQpuDQpgYGANCg0KICANCg0KIyMgKipMYSBtdWVzdHJhIHNpc3RlbcOhdGljYSB1bmEgbXVlc3RyYSBwb3IgQ29uZ2xvbWVyYWRvcyoqDQoNClBhcmEgYXByZW5kZXIgbcOhcyBhY2VyY2EgZGVsIGNvbXBvcnRhbWllbnRvIGRlIFYoc3kpLCBwb2RlbW9zIGV4YW1pbmFyIHVuYSBtdWVzdHJhIHNpc3RlbcOhdGljYSBkZSBuIGVsZW1lbnRvcyBjb21vIHVuYSBtdWVzdHJhIHBvciBjb25nbG9tZXJhZG9zIHNlbmNpbGxhIGRlIGsgcG9zaWJsZXMgbXVlc3RyYXMgcG9yIGNvbmdsb21lcmFkb3MgZW4gbGEgcG9ibGFjacOzbiBxdWUgc2UgZXN0dWRpYS4gRGUgZm9ybWEgZXNxdWVtw6F0aWNhLCBjb25zaWRlcmUgcXVlIGxhIHBvYmxhY2nDs24gZXN0w6Egb3JnYW5pemFkYSBjb21vIHVuYSBtYXRyaXogcmVjdGFuZ3VsYXIsIGNvbW8gbXVlc3RyYSBsYSBUYWJsYS4gDQoNCiA8aW1nIHNyYz0idGFibGEucG5nIiBhbHQ9ImRyYXdpbmciIHdpZHRoPSI0MDAiLz4NCiANCiBBcXXDrS4gTiA9IG5rLiBFbCBtdWVzdHJlbyBzaXN0ZW3DoXRpY28sIGNvbW8gc2UgaGEgZGVzY3JpdG8gYW50ZXJpb3JtZW50ZSwgaW1wbGljYSBzZWxlY2Npb25hciBhbGVhdG9yaWFtZW50ZSB1bm8gZGUgbG9zIGsgY29uZ2xvbWVyYWRvcyAoZmlsYXMpIHkgYXPDrSwgdW5hIGRlIGxhcyBrIHBvc2libGVzIG1lZGlhcyBtdWVzdHJhbGVzLiBFcyBkZWNpciB0b21hciBwcm9iYWJpbGlkYWRlcyBpZ3VhbGVzLg0KIA0KDQogDQpjb24gbG8gcXVlICQkVihcb3ZlcmxpbmV7eX1fcyk9XGZyYWN7XHNpZ21hXjJ9e259WzErKG4tMSlccmhvXSQkIA0KZG9uZGUgJFxyaG8kICBxdWUgbWlkZSBsYSBpbnRlcnJlbGFjacOzbiBlbnRyZSBsYXMgdW5pZGFkZXMgZGVudHJvIGRlIGxhcyBtdWVzdHJhcy4gTMOzZ2ljYW1lbnRlLGVzdGEgaW50ZXJyZWxhY2nDs24gZGViZSBzZXIgbG8gbcOhcyBwZXF1ZcOxYSBwb3NpYmxlLCB5YSBxdWUgZW4gZWwgbXVlc3RyZW8gc2lzdGVtw6F0aWNvIGludGVyZXNhIGxhIGhldGVyb2dlbmVpZGFkIGludHJhbXVlc3RyYWwsIGNvbiBsYSBmaW5hbGlkYWQgZGUgcXVlIHVuYSDDum5pY2EgbXVlc3RyYSBzaXN0ZW3DoXRpY2EgcmVwcmVzZW50ZSBsbyBtZWpvciBwb3NpYmxlIGEgdG9kYSBsYSBwb2JsYWNpw7NuLiBQYXJhIHF1ZSB1bmEgbXVlc3RyYSBzaXN0ZW3DoXRpY2EgYXNwaXJlIGEgc2VyIGZpZWwgZXNwZWpvIGRlIHRvZGEgbGEgcG9ibGFjacOzbiBoYSBkZSBzZXIgaGV0ZXJvZ8OpbmVhLCB5IGxhIGludGVycmVsYWNpw7NuIGVudHJlIHN1cyB1bmlkYWRlcyBoYSBkZSBzZXIgYmFqYS4gUG9yIGxvIHRhbnRvLCBpbmljaWFsbWVudGUgcGFyZWNlIGzDs2dpY28gcXVlIGludGVyZXNlbiB2YWxvcmVzIG11eSBwZXF1ZcOxb3MgZGVsIGNvZWZpY2llbnRlIGRlIGNvcnJlbGFjacOzbiBpbnRyYW11ZXN0cmFsLg0KDQpzaSBzZSBkaXNwb25lIGRlIGxhIHBvYmxhY2nDs24gIGRlICBtZWRpY2lvbmVzLCBzZSBwdWVkZW4gcmVhbGl6YXIgY8OhbGN1bG9zIGRlbCB0aXBvIEFOT1ZBICBjYWxjdWxhbmRvIGxhIHN1bWEgZGUgY3VhZHJhZG9zIGRlbCBlcnJvcihhZGVudHJvIGRlIGNvbmdsb21lcmFkb3MgaW50cmF2YXJpYW56YSksIHN1bWEgZGUgY3VhZHJhZG9zIGVudHJlIGNvbmdsb21lcmFkb3Moc3VtYSBkZSBjdWFkcmFkb3MgZGVsIHRyYXRhbWllbnRvIGludGVydmFyaWFuemEpIHkgc3VtYSBkZSBjdWFkcmFkb3MgdG90YWxlcyAoY3Vhc2l2YXJpYW56YSkuDQoNCkxhcyBlY3VhY2lvbmVzIHNvbiBsYXMgc2lndWllbnRlcy4NCg0KJCRcd2lkZWhhdCB7U33Csl9UPVxmcmFje1RTU317bmstMX09XGZyYWN7MX17bmstMX1cc3VtX3tpPTF9XntrfXtcc3VtX3tqPTF9XntufXsoeV97aWp9LVxvdmVybGluZXtcb3ZlcmxpbmV7eX19KV4yfX09Y3Vhc2l2YXJpYW56YSQkDQokJFx3aWRlaGF0IHtTfcKyX3Q9XGZyYWN7U1NUfXtrLTF9PVxmcmFje259e2stMX1cc3VtX3tqPTF9XntrfXsoXG92ZXJsaW5le3l9X2ktXG92ZXJsaW5le1xvdmVybGluZSB5fSleMn09SW50ZXJ2YXJpYW56YSQkDQokJFx3aWRlaGF0IHtTfcKyX0U9XGZyYWN7U1NFfXtrKG4tMSl9PVxmcmFjezF9e2sobi0xKX1cc3VtX3tpPTF9XntrfXtcc3VtX3tqPTF9XntufXsoeV97aWp9LVxvdmVybGluZXt5fV9pKV4yfX09aW50cmF2YXJpYW56YSQkDQpjb24gDQokJFRTUz1TU0UrU1NUJCQNCiQkXHJobz1cZnJhY3tuXHdpZGVoYXQge1N9wrJfdC1cd2lkZWhhdCB7U33Csl9UfXsobi0xKVx3aWRlaGF0IHtTfcKyX1R9PTEtXGZyYWN7bn17bi0xfVxmcmFje1NTRX17VFNTfSQkDQogVEFCTEEgQU5PVkENCiANCiB8ZnVlbnRlfGRmIHxzdW1hIGRlIGN1YWRyYWRvc3wNCiB8LS18LS18LS18DQogfGZhY3RvcnxrLTF8U1NUfA0KIHxlcnJvcnxuay1rfFNTRXwNCiB8dG90YWx8bmstMXxUU1N8DQogDQogDQogDQoNCiMjIyAqKkVqZW1wbG8gZGUgY8OhbGN1bG8gZGUgY29ycmVsYWNpb24gZW50cmUgZWxlbWVudG9zIGRlbCBtaXNtbyBjb25nbG9tZXJkYWRvKioNCiANCiBjb25zaWRlcmUgbGEgc2lndWllbnRlIHBvYmxhY2nDs246DQogDQogfHN1amV0b3wxIHwyfCAzfCA0fDV8IDZ8IDd8IDh8IDl8IDEwfCAxMXwgMTJ8DQogfC0tfC0tfC0tfC0tfC0tfC0tfC0tfC0tfC0tfC0tfC0tfC0tfC0tfA0KIHxJbmdyZXNvfDIwMDB8IDMwMDB8IDEwMDB8IDUwMDB8IDI1MDAgfDM2MDB8IDcwMDB8IDgwMDB8IDI5MDB8IDc3MDB8IDM1MDAgfDUwMDB8DQogDQogY2FsY3VsZSBlbCB2YWxvciBkZSAgJFxyaG8kICBjdWFuZG8gdG9tYW4gIG11ZXN0cmFzIHNpc3RlbcOhdGljYXMgZGUgdGFtYcOxbyBuPTQuDQogDQoNClNvbHVjacOzbjogY29tbyAxMi80PTMgIGVudG9uY2VzIHRlbmVtb3MgcXVlIGs9MyAgb3NlYSBxdWUgaGF5IHRyZXMgY29uZ2xvbWVyYWRvcyBkZSBtdWVzdHJhcyBzaXN0ZW3DoXRpY2FzICBlbXBlemFuZG8gY29uIGs9MSwyLDMNCiANCmBgYHtyIGVqZW1wbG8gZGUgcmhvfQ0KcmVxdWlyZShrbml0cikNCk4gPC0gMTINCm4gPC0gNA0KayA8LSBOL24NCnBvYiA8LSBjKDIwMDAsIDMwMDAsIDEwMDAsIDUwMDAsIDI1MDAgLDM2MDAsIDcwMDAsIDgwMDAsIDI5MDAsIDc3MDAsIDM1MDAgLDUwMDApDQoNCmNvbmdsb21lcmFkb3MgPC0gZGF0YS5mcmFtZShpbmRpY2VzPTE6MTIsDQogICAgICAgICAgICAgICAgICBtdWVzdHJhPXBvYiwNCiAgICAgICAgICAgICAgICAgIGNvbmdsb21lcmFkbz1mYWN0b3IocmVwKGMoImMxIiwiYzIiLCJjMyIpLG4pKSkNCg0KDQpjb25nbG9tZXJhZG9zICU+JSANCiAgc3ByZWFkKGtleSA9IGluZGljZXMsDQogICAgICAgICB2YWx1ZSA9IG11ZXN0cmEsDQogICAgICAgICBmaWxsPSItLSIpICU+JSBrYWJsZSgpICAgICAgICAgICAgICMgSW5kaWNlcyBhIGNvbHVtbmFzDQoNCmFub3ZhIDwtIGFvdihtdWVzdHJhfmNvbmdsb21lcmFkbywNCiAgICAgICAgICAgZGF0YT1jb25nbG9tZXJhZG9zKSAgICMgQU5PVkENCg0Kc3VtbWFyeShhbm92YSlbWzFdXS0+dGFibGENCnRhYmxhDQpTU0U9dGFibGEkYFN1bSBTcWBbMl0NClRTUz10YWJsYSRgU3VtIFNxYFsxXStTU0UNCihyaG89MS1uLyhuLTEpKlNTRS9UU1MpDQpgYGANCiANCiANCiMjICoqUmVzdW1lbioqDQoNCiogRWwgbXVlc3RyZW8gc2lzdGVtw6F0aWNvIHNlIHByZXNlbnRhIGNvbW8gdW5hIGFsdGVybmF0aXZhIHBhcmEgZWwgbXVlc3RyZW8gYWxlYXRvcmlvIHNpbXBsZS4NCiogRXMgbcOhcyBmw6FjaWwgZGUgbGxldmFyIGEgY2FibyB5LCBwb3IgdGFudG8sIGVzdMOhIG1lbm9zIGV4cHVlc3RvIHF1ZSBlbCBtdWVzdHJlbyBhbGVhdG9yaW8gc2ltcGxlIGEgbG9zIGVycm9yZXMgZGVsIGVudHJldmlzdGFkb3IuIEFkZW3DoXMsIGVsIG11ZXN0cmVvIHNpc3RlbcOhdGljbyBmcmVjdWVudGVtZW50ZSBwcm9wb3JjaW9uYSBtw6FzIGluZm9ybWFjacOzbiBxdWUgZWwgbXVlc3RyZW8gYWxlYXRvcmlvIHNpbXBsZSBwb3IgdW5pZGFkIGRlIGNvc3RlLg0KKiBQYXJhIHNlbGVjY2lvbmFyIGVudHJlIGVsIG11ZXN0cmVvIGFsZWF0b3JpbyBzaW1wbGUgeSBlbCBzaXN0ZW3DoXRpY28sIHByaW1lcm8gZGViZW1vcyBjb25zaWRlcmFyIGVsIHRpcG8gZGUgcG9ibGFjacOzbiBxdWUgc2UgaW52ZXN0aWdhLiBQb3IgZWplbXBsbywgY3VhbmRvIE4gZXMgZ3JhbmRlIHkgz4EgPCAwLCBsYSB2YXJpYW56YSBkZSBWKHN5KSBlcyBtw6FzIHBlcXVlw7FhIHF1ZSBsYSB2YXJpYW56YSBjb3JyZXNwb25kaWVudGUgZGUgVih5KSBiYXNhZGEgZW4gdW5hIG11ZXN0cmEgYWxlYXRvcmlhIHNpbXBsZS4gDQoqIFVuYSBtdWVzdHJhIHNpc3RlbcOhdGljYSBlcyBwcmVmZXJpYmxlIGN1YW5kbyBsYSBwb2JsYWNpw7NuIGVzdMOhIG9yZGVuYWRhIHkgTiBlcyBncmFuZGUuIEN1YW5kbyBsYSBwb2JsYWNpw7NuIGVzIGFsZWF0b3JpYSwgbG9zIGRvcyBwcm9jZWRpbWllbnRvcyBkZSBtdWVzdHJlbyBzb24gZXF1aXZhbGVudGVzIHkgY3VhbHF1aWVyYSBkZSBsb3MgZG9zIGRpc2XDsW9zIHB1ZWRlIHNlciB1dGlsaXphZG8uIA0KKiBEZWJlIHRlbmVyc2UgY3VpZGFkbyBlbiBsYSBhcGxpY2FjacOzbiBkZWwgbXVlc3RyZW8gc2lzdGVtw6F0aWNvIHBhcmEgcG9ibGFjaW9uZXMgcGVyacOzZGljYXMuDQpMYXMgbmVjZXNpZGFkZXMgZGUgdGFtYcOxbyBkZSBtdWVzdHJhIHBhcmEgZXN0aW1hciDOvCwgz4QgeSDPgSwgc29uIGRldGVybWluYWRhcyB1c2FuZG8gbGFzIGbDs3JtdWxhcyBwcmVzZW50YWRhcyBwYXJhIGVsIG11ZXN0cmVvIGFsZWF0b3JpbyBzaW1wbGUuDQoqIEVsIG11ZXN0cmVvIHNpc3RlbcOhdGljbyByZXBldGlkbyBxdWUgcyBwZXJtaXRlIGFsIGludmVzdGlnYWRvciBlc3RpbWFyIGxhIG1lZGlhIG8gZWwgdG90YWwgcG9ibGFjaW9uYWxlcyB5IGxhIHZhcmlhbnphIGRlbCBlc3RpbWFkb3IsIHNpbiBlc3RhYmxlY2VyIG5pbmfDum4gc3VwdWVzdG8gYWNlcmNhIGRlIGxhIG5hdHVyYWxlemEgZGUgbGEgcG9ibGFjacOzbi4NCg0KIyMgKipFamVyY2ljaW9zKiogDQoNCg0KIyMjIyBwcm9ibGVtYTE6IDcuNSw3LjYsDQoNCiMjIyMgUHJvYmxlbWEyOiA3LjcsNy4xMQ0KDQojIyMjIFByb2JsZW1hMzoNCmNvbnNpZGVyZSBsYSBzaWd1aWVudGUgcG9ibGFjacOzbjoNCiANCiB8c3VqZXRvfDEgfDJ8IDN8IDR8NXwgNnwgN3wgOHwgOXwgMTB8IDExfCAxMnwNCiB8LS18LS18LS18LS18LS18LS18LS18LS18LS18LS18LS18LS18LS18DQogfEluZ3Jlc298MjAwMHwgMzAwMHwgNzAwMHwgNTAwMHwgNTUwMCB8MzYwMHwgNzAwMHwgOTAwMHwgMjkwMHwgNTcwMHwgMjUwMCB8NTAwMHwNCiANCmNhbGN1bGUgZWwgdmFsb3IgZGUgICRccmhvJCAgY3VhbmRvIHRvbWFuICBtdWVzdHJhcyBzaXN0ZW3DoXRpY2FzIGRlIHRhbWHDsW8gbj0zLg0KIA0KIyMjIyBQcm9ibGVtYTQ6DQpzdXBvbmdhIHF1ZSBzZSB0aWVuZSB1bmEgcG9ibGFjacOzbiBkZSA1MDAgZWxlbWVudG9zIHkgIHRvbWFyYSB1bmEgbXVlc3RyYSBkZSAxMDAgZWxlbWVudG9zICBwYXJhIGVzdGltYXIgbGEgdmFyaWFuemEgZGUgbGEgZGlzdHJpYnVjacOzbiBtdWVzdHJhbCBkZSBtZWRpYXMuICAgUGFyYSBlc3RvIHNlIGltcGxlbWVudGFyw6EgdW4gbXVlc3RyZW8gc2lzdGVtw6F0aWNvIHJlcGV0aWRvLiBkZSAyMCBtdWVzdHJhcyAgZGUgdGFtYcOxbyA1IGNhZGEgdW5hLihwb2JsYWNpw7NuIG5vcm1hbCBtZWRpYT01MCxzZD01LCBzZW1pbGxhPWVkYWQpDQoNCg0KDQoNCiMjICoqQmlibGlvZ3JhZsOtYSoqDQoNCiogQ29jaHJhbiwgVy4gRy4gVMOpY25pY2FzIGRlIE11ZXN0cmVvLg0KKiBMb3BleiBDZXNhciwgTXVlc3RyZW8gZXN0YWTDrXN0aWNvDQoqIExVTUxFWSwgVGhvbWFzLiBDb21wbGV4IHN1cnZleXM6IGEgZ3VpZGUgdG8gYW5hbHlzaXMgdXNpbmcgUi4gSm9obiBXaWxleSAmIFNvbnMsIDIwMTEuDQoqIFNjaGVhZmZlcixSaWNoYXJkIEwuIEVsZW1lbnRvcyBkZSBtdWVzdHJlby4gIA0KKiBWYWxkaXZpZXNvIFNlcnJhbm8sTHVpcy4gIE5vdGFzIGRlIFTDqWNuaWNhcyBkZSBNdWVzdHJlby4NCg0KDQogDQoNCg0KDQo=