Fase 1 [Descripciones Multivariantes]

1.1. Objetivos

-Detectar cómo se relacionan múltiples variables entre sí y medir la fuerza e importancia de esas relaciones.

-Asegurarse de que los datos provengan de una fuente confiable, lo que respalda su validez para análisis complejos y fundamentados.

-Identificar y categorizar las variables según su tipo y escala de medición, para elegir los métodos estadísticos más apropiados.

1.2. Descripción de los datos

fuente del conjunto de datos

El conjunto de trabajo se obtuvo casi totalmente de kaggle: https://www.kaggle.com/datasets/canggih/upvoted-kaggle-kernels/data. Cabe aclarar que Kaggle comenzó en 2010 ofreciendo concursos de aprendizaje automático y ahora también ofrece una plataforma de datos públicos, un banco de trabajo basado en la nube para ciencia de datos y educación en inteligencia artificial.

Contexto del conjunto de datos.

Además de los conjuntos de datos, los kernels en Kaggle son características interesantes. Podemos aprender, compartir y, además, contribuir a otros. Teniendo estos en cuenta este conjunto de datos es una recopilación de distintos kernels depositados en Kaggle.

Descripción del conjunto de datos

El conjunto de datos contiene 10 campos y 957 registros. Los campos están clasificados de dos maneras (variables cualitativas y cuantitativas) que se subdividen en medidas de escala ordinal, nominal para las variables cualitativas y de escala razón para las variables cuantitativas. El tipo de variable y su escala de medición con base en la nomenclatura (tipo_de_variable::escala_de_medicion[ordenamiento]):

. Votes (cuantitativa::razón): Registra el número de votos que tiene cada kernel en este conjunto de datos, esta columna esta ordenada de menor a mayor.

. Owner (cualitativa::nominal): registra el nombre de usuario del autor del respectivo conjunto de datos.

. Kernel (cualitativa::nominal): registra el nombre identificador de cada kernel del respectivo conjunto de datos.

.Version_History (cualitativa::nominal): Registra las diferentes actualizaciones que recibio cada kernel del respectivo conjunto de datos, hasta la ultima version la cual fue aquella antes de realizar este conjunto de datos.

.tags (cualitativa1::nominal): Registra las diferentes palabras clave que identifican a cada kernel del respectivo conjunto de datos.

.output (cualitativa::nominal) Registra el numero de temas o secciones de cada documento presente en cada kernel del respectivo conjunto de datos.

. Dataset (cualitativa::nominal): registra el nombre que el autor asigno a su respectivo conjunto de datos.

. Code type (cualitativa::nominal(dicotómica)) :registra el tipo de código el cual fue implementado en los diferentes kernels en el conjunto de datos, donde existen las variables notebook y script.

. Language (cualitativa::nominal) : registra el tipo de lenguaje de programación o de entrada con que trabaja el respectivo conjunto de datos.

. Comments (cuantitativa::ordinal): registra el número de comentarios que tiene cada kernel en el respectivo conjunto de datos.

. Views (cuantitativa::razón): registra el numero de visitas que tiene cada kernel en el respectivo conjunto de datos.

. Forks (cuantitativa::razón): Registra el número de personas que poseen cada kernel de este respectivo conjunto de datos.

. Country (cualitativa::nominal): registra la nacionalidad de cada usuario propietario de cada kernel en el respectivo conjunto de datos.

Cabe aclarar que el ultimo campo (Country) es una variable artificial, lo que significa que no esta prensente en el conjunto de datos original, pero tampoco es algo inventado. Esta misma se agregó después de recopilar información confiable sobre la nacionalidad de los usuarios. La idea de incluirla es dar más contexto y mejorar los análisis para que sean más útiles y completos según las necesidades del proyecto.

Es de tener en consideracion que el conjunto de datos original cuenta principalemente con 12 campos, entre los cuales en el conjunto de datos depurado se suprimieron 3 de estos ya que no se consideraron que aportaran informacion importante para realizar el estudio; Los 3 campos suprimidos son “version_History, tags, output”. De igual forma, se suprimieron un total de 14 registros.

estructura del conjunto de datos original
str(Dataset_original)
## tibble [971 × 12] (S3: tbl_df/tbl/data.frame)
##  $ Votes          : num [1:971] 2130 1395 1363 1316 1078 ...
##  $ Owner          : chr [1:971] "Megan Risdal" "Guido Zuidhof" "Pedro Marcelino" "Anisotropic" ...
##  $ Kernel         : chr [1:971] "Exploring Survival on the Titanic" "Full Preprocessing Tutorial" "Comprehensive data exploration with Python" "Introduction to Ensembling/Stacking in Python" ...
##  $ Dataset        : chr [1:971] "Titanic: Machine Learning from Disaster" "Data Science Bowl 2017" "House Prices: Advanced Regression Techniques" "Titanic: Machine Learning from Disaster" ...
##  $ Version_History: chr [1:971] "Version 8,2017-12-27|Version 7,2017-02-24|Version 6,2017-02-01|Version 5,2016-04-05|Version 4,2016-03-07|Versio"| __truncated__ "Version 19,2017-02-24|Version 18,2017-02-24|Version 17,2017-02-06|Version 16,2017-01-27|Version 15,2017-01-16|V"| __truncated__ "Version 47,2018-02-23|Version 46,2018-02-16|Version 45,2018-02-09|Version 44,2018-02-03|Version 43,2018-01-26|V"| __truncated__ "Version 93,2018-02-07|Version 92,2018-01-15|Version 91,2017-12-26|Version 90,2017-12-23|Version 89,2017-12-21|V"| __truncated__ ...
##  $ Tags           : chr [1:971] "tutorial, beginner, feature engineering," "tutorial, preprocessing" "beginner, eda, data cleaning" "tutorial, ensembling, xgboost" ...
##  $ Output         : chr [1:971] "This script outputs 9 visualizations and 28 data file." "This script outputs 8 visualizations." "This script doesn't output any visualizations or data files." "This script outputs 2 visualizations and 1 data file." ...
##  $ Code_Type      : chr [1:971] "Script" "Notebook" "Notebook" "Notebook" ...
##  $ Language       : chr [1:971] "markdown" "Python" "Python" "Python" ...
##  $ Comments       : num [1:971] 749 288 361 395 397 143 371 352 125 108 ...
##  $ Views          : num [1:971] 345590 132387 130419 147540 68256 ...
##  $ Forks          : num [1:971] 3370 1992 2754 3360 2229 ...
conjunto de datos original
Dataset_original
## # A tibble: 971 × 12
##    Votes Owner    Kernel Dataset Version_History Tags  Output Code_Type Language
##    <dbl> <chr>    <chr>  <chr>   <chr>           <chr> <chr>  <chr>     <chr>   
##  1  2130 Megan R… Explo… Titani… Version 8,2017… tuto… This … Script    markdown
##  2  1395 Guido Z… Full … Data S… Version 19,201… tuto… This … Notebook  Python  
##  3  1363 Pedro M… Compr… House … Version 47,201… begi… This … Notebook  Python  
##  4  1316 Anisotr… Intro… Titani… Version 93,201… tuto… This … Notebook  Python  
##  5  1078 Kaan Can Data … Pokemo… Version 389,20… begi… This … Notebook  Python  
##  6  1003 Philipp… Explo… Zillow… Version 44,201… begi… This … Script    markdown
##  7   946 Manav S… Titan… Titani… Version 16,201… tuto… This … Notebook  Python  
##  8   826 Omar El… A Jou… Titani… Version 6,2016… begi… This … Notebook  Python  
##  9   814 anokas   Data … Quora … <NA>            inte… This … Notebook  Python  
## 10   726 SRK      Simpl… Zillow… Version 19,201… eda,… This … Notebook  Python  
## # ℹ 961 more rows
## # ℹ 3 more variables: Comments <dbl>, Views <dbl>, Forks <dbl>
estructura del conjunto de datos depurado
str(Dataset)
## tibble [957 × 10] (S3: tbl_df/tbl/data.frame)
##  $ Votes    : num [1:957] 33 33 33 33 33 33 33 33 33 33 ...
##  $ Owner    : chr [1:957] "Eric Hamers" "Shannon McNish" "VijayBJ" "Jonathan Bouchet" ...
##  $ Kernel   : chr [1:957] "Is The Real Estate Market Going to Crash Again?" "What Should Job Seekers do to Get a Job?" "Basic U-net using Tensorflow" "Overwatch: who should I main ?" ...
##  $ Dataset  : chr [1:957] "Zillow Economics Data" "Kaggle ML and Data Science Survey, 2017" "2018 Data Science Bowl" "Overwatch" ...
##  $ Code_Type: chr [1:957] "Notebook" "Script" "Notebook" "Script" ...
##  $ Language : chr [1:957] "Python" "markdown" "Python" "markdown" ...
##  $ Comments : num [1:957] 8 2 12 9 23 11 17 3 8 2 ...
##  $ Views    : num [1:957] 2482 582 4790 1272 2429 ...
##  $ Forks    : num [1:957] 1 1 3 3 4 5 7 7 11 18 ...
##  $ Country  : chr [1:957] "Ukraine" "United States" "United States" "United States" ...
conjunto de datos depurado
Dataset
## # A tibble: 957 × 10
##    Votes Owner    Kernel Dataset Code_Type Language Comments Views Forks Country
##    <dbl> <chr>    <chr>  <chr>   <chr>     <chr>       <dbl> <dbl> <dbl> <chr>  
##  1    33 Eric Ha… Is Th… Zillow… Notebook  Python          8  2482     1 Ukraine
##  2    33 Shannon… What … Kaggle… Script    markdown        2   582     1 United…
##  3    33 VijayBJ  Basic… 2018 D… Notebook  Python         12  4790     3 United…
##  4    33 Jonatha… Overw… Overwa… Script    markdown        9  1272     3 United…
##  5    33 tomcwal… Keras… Porto … Notebook  Python         23  2429     4 Poland 
##  6    33 armamut  ps_ca… Porto … Notebook  Python         11  1103     5 United…
##  7    33 Tilii    You w… Merced… Script    Python         17  2733     7 United…
##  8    33 ZFTurbo  PageR… Quora … Script    Python          3  1881     7 England
##  9    33 CVxTz    Audio… Tensor… Notebook  Python          8  2248    11 Canada 
## 10    33 ZFTurbo  Greed… Santa … Script    Python          2  1351    18 Germany
## # ℹ 947 more rows

1.3. Estimaciones multivariadas

Estamos trabajando con un conjunto de datos sobre kernels y utilizamos herramientas de estadística descriptiva y gráficas, como boxplots y el cálculo de medias, para analizar la distribución de las variables y sus relaciones. El propósito es reconocer patrones, descubrir conexiones entre las variables y localizar valores atípicos (outliers) que puedan afectar los resultados del análisis.

Para analizar la distribución de variables como votes, comments, views y forks, utilizamos boxplots. Estos gráficos destacan la mediana (indicada por la línea negra dentro de la caja), los cuartiles (los bordes de la caja) y los valores extremos o outliers (puntos que aparecen fuera del bigote). Los outliers son importantes porque pueden influir notablemente en los resultados de análisis estadísticos, como las medias y las varianzas. También se utilizaron la matriz de covarianzas y la matriz de correlaciones para explorar las relaciones entre las variables.

Al analizar el boxplot con el conjunto completo no se puede hacer una interpretación clara del conjunto ya que hay datos muy atípicos que hace que sea imposible la interpretación de esta, por ello hemos seleccionada una muestra del 10% de todos los datos y con ella se puede hacer un mejor análisis en la cual aun podemos evidenciar estos datos atípicos y que sigue habiendo un sesgó de cola derecha lo que evidencia que hay una mayor agrupación de los datos en el lado izquierdo así, las medianas tienden a ser bajas,además, todos los datos atípicos se presentan en los extremos superiores.

Como podemos evidenciar en la pestaña de varianzas y covarianzas vemos que Views tiene la varianza más alta, lo que puede indicar que los datos de views están muy dispersos, en lo contrario de Comments que tiene una varianza más baja y por ello los datos son menos dispersos. Pero en lo que efectivamente podemos inferir es que existe una relación positiva entre todas las variables, lo que implica que están correlacionadas entre sí en cierta medida.

Interpretando la matriz de correlaciones y teniendo en cuenta la pestaña de varianzas y covarianzas se da a notar que entre las variables estudiadas votes, comments, views y forks todas las correlaciones presentes son positivas y de valores altos (considerando alto todo arriba de 0.5); donde la corealción con el valor mas alto es votes-comments con un 0.86 y la relación con el valor mas bajo es votes-forks con un 0.63.

Vector de Medias y Boxplots

set.seed(780757)
Dataset_Muestreado4 = Dataset[sample(1:nrow(Dataset),95),-c(2,3,4,5,6,10)]


par(mfrow = c(1, ncol(Dataset_Muestreado4)))
invisible(lapply(1:ncol(Dataset_Muestreado4), function(i)
  


boxplot(Dataset_Muestreado4[, i])))

Vector de Medias y Boxplots original
set.seed(780757)
Dataset_Muestreado. = Dataset[sample(1:nrow(Dataset),957),-c(2,3,4,5,6,10)]


par(mfrow = c(1, ncol(Dataset_Muestreado.)))
invisible(lapply(1:ncol(Dataset_Muestreado.), function(i)
  


boxplot(Dataset_Muestreado.[, i])))

Matriz de Varianzas-covarianzas

round(cov(Dataset[,-c(2,3,4,5,6,10)]),2)
##               Votes  Comments       Views      Forks
## Votes      20536.03   5659.04   2354704.7   44842.04
## Comments    5659.04   2104.39    717112.5   15304.93
## Views    2354704.68 717112.52 425041335.5 7990201.43
## Forks      44842.04  15304.93   7990201.4  247986.46

Matriz de corelaciones

round(cor(Dataset[,-c(2,3,4,5,6,10)]),2)
##          Votes Comments Views Forks
## Votes     1.00     0.86  0.80  0.63
## Comments  0.86     1.00  0.76  0.67
## Views     0.80     0.76  1.00  0.78
## Forks     0.63     0.67  0.78  1.00

1.4. Gráficas multivariadas

En esta parte se busca estudiar e identificar diferentes patrones, relaciones y tendencias entre las variables por medio de graficas como lo son el Diagrama de dispersión y correlaciones, Diagrama de estrellas y el Diagrama de las caras de chernoff. Se debe tener en cuenta que se trabajó con las variables cuantitativas con escala de medición razón, las cuales son votes, comments, views y forks.

Cada uno de los tres gráficos estudia estos 4 campos cuantitativos de escala razon del conjunto de datos desde diferentes perspectivas. Es de destacar que nuestro conjunto de datos en su forma depurada no era suficiente para darnos una visualización más cómoda para su estudio, por lo cual se decide trabajar con semillas para cada uno de estos gráficos.

El Diagrama de dispersión y correlaciones nos muestra gráficamente la dispersión que presenta cada una de estas variables junto a el nivel de correlación existente entre estas mismas. En este mismo apartado se puede visualizar el Diagrama de dispersión y correlaciones[filtro:Code_Type] en el cual se hace el mismo estudio de dispersión y el nivel de correlación, pero ahora tomando en cuenta la variable clasificadora de nuestro conjunto de datos la cual es code_type.

El Diagrama de estrellas representa diferentes observaciones (cada figura o estrella) y los diferentes colores y tamaños reflejan valores asociados a diferentes variables. En este grafico por necesidad de interpretación se redujo la semilla utilizada con el fin de hacer más practico el estudio del gráfico.

El Diagrama de las caras de chernoff presenta cada observación en forma de rostro en donde cada uno de los rasgos faciales como tamaño, forma, boca, sonrisa y otras características están determinadas por los valores de las variables asociadas a esa observación.

conclusion

Se puede concluir en el estudio de cada gráfica, que la correlación existente entre las variables es en general de valores altos y sus dispersiones presentan en la mayor parte de los datos una cercanía. De igual forma el diagrama de estrellas acentúa la idea de que en nuestro conjunto de datos se presenta valores muy altos o valores muy bajos por medio de la casi aparición de algunas visualizaciones (estrellas) y algunas otras de forma muy grandes. Finalmente en el diagrama de caras de chernoff se presentan visualizaciones (caras) sin ninguna relación (valores muy altos o bajos en las variables que definen las cualidades).

Diagrama Conjunto de Dispersion, distribucion y correlaciones

set.seed(780757)
Dataset_Muestreado3 = Dataset[sample(1:nrow(Dataset),50),-c(2,3,4,5,6,10)]


ggpairs(Dataset_Muestreado3)

Diagrama Conjunto de Dispersion, distribucion y correlacioness

set.seed(780757)
Dataset_Muestreado = Dataset[sample(1:nrow(Dataset),957),-c(2,3,4,5,6,10)]


ggpairs(Dataset_Muestreado)

Diagrama Conjunto de Dispersión, Distribución y Correlaciones [filtro:Code_Type]

Dataset$Code_Type <- as.factor(Dataset$Code_Type)
Dataset_Muestreado3 = Dataset[sample(1:nrow(Dataset),95),c(1,5,7,8,9)]


ggpairs(Dataset_Muestreado3, aes(color = Code_Type, alpha = 0.5), upper = list(continuous = wrap("cor", size = 2.5)))
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

Diagrama de Estrellas

set.seed(780720)
Dataset_Muestreado = Dataset[sample(1:nrow(Dataset),23),-c(2,3,4,5,6,10)]
stars(Dataset_Muestreado, len = 1, cex = 0.7, key.loc = c(2,3,4,5,6,10), draw.segments = TRUE)

Caras de Chernoff

set.seed(780728)
Dataset_Muestreado = Dataset[sample(1:nrow(Dataset),25),-c(2,3,4,5,6,10)]
faces(Dataset_Muestreado)

## effect of variables:
##  modified item       Var       
##  "height of face   " "Votes"   
##  "width of face    " "Comments"
##  "structure of face" "Views"   
##  "height of mouth  " "Forks"   
##  "width of mouth   " "Votes"   
##  "smiling          " "Comments"
##  "height of eyes   " "Views"   
##  "width of eyes    " "Forks"   
##  "height of hair   " "Votes"   
##  "width of hair   "  "Comments"
##  "style of hair   "  "Views"   
##  "height of nose  "  "Forks"   
##  "width of nose   "  "Votes"   
##  "width of ear    "  "Comments"
##  "height of ear   "  "Views"

1.5. Normalidad multivariada

En el análisis de datos multivariados relacionados con Los kernels , es fundamental evaluar la normalidad de las variables para garantizar la validez de los modelos estadísticos que se aplicarán. En este estudio, se dispone de un conjunto de datos con aproximadamente 957 registros, de las cuales solo se le va hacer el estudio a los campos cuantitativos. Se llevarán a cabo diferentes pruebas de normalidad multivariada, tales como las pruebas de Mardia, Henze-Zirkler, Doornik-Hansen y Royston, con el fin de determinar si las variables cuantitativas siguen una distribución normal multivariada, lo cual es crucial para la aplicación de técnicas estadísticas avanzadas.

Para determinar si las variables cuantitativas de nuestro conjunto de datos siguen una distribución normal, se llevarán a cabo diversas pruebas de normalidad. Entre estas, se incluyen la prueba de Mardia, que evalúa la normalidad multivariada mediante la asimetría y curtosis; la prueba de Henze-Zirkler, que combina información sobre la distancia de las observaciones a la media; la prueba de Doornik-Henze, que se basa en el análisis de momentos; y la prueba de Rosettón, que utiliza una metodología gráfica para evaluar la normalidad. La aplicación de estas pruebas nos permitirá obtener una comprensión más clara del comportamiento de nuestros datos.

conclusion

Los resultados obtenidos a partir de las pruebas de normalidad, incluyendo Mardia, Henze-Zirkler, Doornik-Henze y Rosettón, indican de manera consistente que los datos analizados no siguen una distribución normal. Esta conclusión sugiere la presencia de asimetrías y/o curtosis que se desvían de las características esperadas en una distribución normal, lo que puede reflejar variaciones significativas en la naturaleza de los datos. La asimetría podría indicar que hay una tendencia hacia valores extremos en una dirección, mientras que la curtosis elevada podría señalar la presencia de outliers o una concentración inusual de datos en torno a la media.

PNM Mardia

mvn(Dataset[,-c(2,3,4,5,6,10)], mvnTest="mardia")
## $multivariateNormality
##              Test        Statistic p value Result
## 1 Mardia Skewness 52422.0890297622       0     NO
## 2 Mardia Kurtosis 1172.23684297287       0     NO
## 3             MVN             <NA>    <NA>     NO
## 
## $univariateNormality
##               Test  Variable Statistic   p value Normality
## 1 Anderson-Darling   Votes    154.5401  <0.001      NO    
## 2 Anderson-Darling Comments   119.7650  <0.001      NO    
## 3 Anderson-Darling   Views    135.3486  <0.001      NO    
## 4 Anderson-Darling   Forks    222.3385  <0.001      NO    
## 
## $Descriptives
##            n        Mean     Std.Dev Median Min    Max 25th  75th      Skew
## Votes    957    99.39498   143.30397     57  33   2130   41   101  6.817008
## Comments 957    30.67398    45.87367     19   1    749   11    33  7.183988
## Views    957 12346.91118 20616.53064   7429 582 345590 3898 13469  8.233301
## Forks    957   151.61860   497.98239     52   1   9879   23   122 11.951835
##           Kurtosis
## Votes     66.29937
## Comments  80.57958
## Views     99.47097
## Forks    189.34977

PNM Henze-Zirkler

mvn(Dataset[,-c(2,3,4,5,6,10)], mvnTest="hz")
## $multivariateNormality
##            Test       HZ p value MVN
## 1 Henze-Zirkler 184.7474       0  NO
## 
## $univariateNormality
##               Test  Variable Statistic   p value Normality
## 1 Anderson-Darling   Votes    154.5401  <0.001      NO    
## 2 Anderson-Darling Comments   119.7650  <0.001      NO    
## 3 Anderson-Darling   Views    135.3486  <0.001      NO    
## 4 Anderson-Darling   Forks    222.3385  <0.001      NO    
## 
## $Descriptives
##            n        Mean     Std.Dev Median Min    Max 25th  75th      Skew
## Votes    957    99.39498   143.30397     57  33   2130   41   101  6.817008
## Comments 957    30.67398    45.87367     19   1    749   11    33  7.183988
## Views    957 12346.91118 20616.53064   7429 582 345590 3898 13469  8.233301
## Forks    957   151.61860   497.98239     52   1   9879   23   122 11.951835
##           Kurtosis
## Votes     66.29937
## Comments  80.57958
## Views     99.47097
## Forks    189.34977

PNM Doornik-Hansen

mvn(Dataset[,-c(2,3,4,5,6,10)], mvnTest="dh")
## $multivariateNormality
##             Test        E df p value MVN
## 1 Doornik-Hansen 2712.848  8       0  NO
## 
## $univariateNormality
##               Test  Variable Statistic   p value Normality
## 1 Anderson-Darling   Votes    154.5401  <0.001      NO    
## 2 Anderson-Darling Comments   119.7650  <0.001      NO    
## 3 Anderson-Darling   Views    135.3486  <0.001      NO    
## 4 Anderson-Darling   Forks    222.3385  <0.001      NO    
## 
## $Descriptives
##            n        Mean     Std.Dev Median Min    Max 25th  75th      Skew
## Votes    957    99.39498   143.30397     57  33   2130   41   101  6.817008
## Comments 957    30.67398    45.87367     19   1    749   11    33  7.183988
## Views    957 12346.91118 20616.53064   7429 582 345590 3898 13469  8.233301
## Forks    957   151.61860   497.98239     52   1   9879   23   122 11.951835
##           Kurtosis
## Votes     66.29937
## Comments  80.57958
## Views     99.47097
## Forks    189.34977

PNM Royston

mvn(Dataset[,-c(2,3,4,5,6,10)], mvnTest="royston")
## $multivariateNormality
##      Test        H       p value MVN
## 1 Royston 693.9903 7.838133e-150  NO
## 
## $univariateNormality
##               Test  Variable Statistic   p value Normality
## 1 Anderson-Darling   Votes    154.5401  <0.001      NO    
## 2 Anderson-Darling Comments   119.7650  <0.001      NO    
## 3 Anderson-Darling   Views    135.3486  <0.001      NO    
## 4 Anderson-Darling   Forks    222.3385  <0.001      NO    
## 
## $Descriptives
##            n        Mean     Std.Dev Median Min    Max 25th  75th      Skew
## Votes    957    99.39498   143.30397     57  33   2130   41   101  6.817008
## Comments 957    30.67398    45.87367     19   1    749   11    33  7.183988
## Views    957 12346.91118 20616.53064   7429 582 345590 3898 13469  8.233301
## Forks    957   151.61860   497.98239     52   1   9879   23   122 11.951835
##           Kurtosis
## Votes     66.29937
## Comments  80.57958
## Views     99.47097
## Forks    189.34977

Fase 2 [Componentes Principales]

2.1. Objetivos

-Hacer más sencillo el análisis reemplazando las variables originales por un grupo más pequeño de componentes principales que concentran lo más importante.

-Mostrar datos complejos en gráficos 2D o 3D para entender mejor los patrones y las relaciones de forma más clara.

-Encontrar las dimensiones clave que explican la mayor parte de las diferencias en los datos, enfocándose en lo más relevante.

2.2. Selección de Componentes

En este estudio, realizaremos un análisis de componentes principales (ACP) para explorar un conjunto de variables cuantitativas. calculando una matriz de correlaciones que nos ayudará a entender cómo se relacionan las variables entre sí. extraeremos los valores y vectores propios, que nos mostrarán qué tanto contribuye cada componente a la variabilidad total de los datos. También utilizaremos gráficos como el de Cattell-Kaiser para y el gráfico de Cattell para visualizar cómo se comportan las variables en este nuevo espacio. Este enfoque nos permitirá simplificar el análisis y descubrir patrones interesantes en los datos.

Durante el análisis de componentes principales (ACP), los resultados de la matriz de correlaciones revelaron relaciones significativas entre las variables cuantitativas, lo que sugiere que algunas de ellas comparten información similar. A partir de los valores y vectores propios, identificamos los componentes más relevantes que capturan la mayor parte de la variabilidad en los datos. Al aplicar el gráfico de Cattell-Kaiser, se hizo evidente el número óptimo de componentes a retener. Además, el gráfico de Cattell nos proporcionó una visualización clara del comportamiento de las variables en el nuevo espacio dimensional.

conclusion

muestra 4 dimensiones donde solo la primera retiene el 81.24369 %, la siguiente el 10.77191% y las demás solo porcentajes con parte entera de una cifra. En este sentido, la representatividad de la combinación lineal que define a la dimensión 1 es significativamente alta en comparación con las demás. Como esta matriz es muda en relación con las variables originales se sigue indagando la identificación de las variables que más contribuyan a la dimensión de valor propio más alto. Matriz de correlaciones: Las variables presentan relaciones significativas entre sí, con correlaciones particularmente altas entre votos, comentarios y visualizaciones. Esto sugiere que estas métricas pueden estar asociadas con la popularidad o el interés general que generan las publicaciones. Sin embargo, los forks parecen tener una relación menos fuerte con las otras métricas, lo que podría indicar que dependen de factores adicionales. Como en la pestaña anterior esta muestra las relaciones que se obtienen al comparar las variables por ejemplo las variables que tienen más relación son comments y votes por lo contrario a forks y votes esto se ve reflejado en el diagrama por la intensidad de los colores El Gráfico de Cattell muestra que los cambios en la pendiente indican que la capacidad explicativa de la dimensión 1 es alta comparada con el resto. Así, el de Cattell-Kaiser al conjugar el instrumento gráfico anterior con el criterio de Kaiser en la misma gráfica apoya que la cantidad de dimensiones suficientes por retener es una, aclarando que esta elección retenga un porcentaje de variabilidad adecuado para estudiar el problema.

Matriz ACP

get_eigenvalue(PCA(Dataset[,-c(2,3,4,5,6,10)], ncp = 6, scale.unit = TRUE, graph = F))
##       eigenvalue variance.percent cumulative.variance.percent
## Dim.1  3.2497475        81.243687                    81.24369
## Dim.2  0.4310348        10.775870                    92.01956
## Dim.3  0.2019606         5.049016                    97.06857
## Dim.4  0.1172571         2.931427                   100.00000

Matriz de Correlaciones

round(cor(Dataset[,-c(2,3,4,5,6,10)]),2)
##          Votes Comments Views Forks
## Votes     1.00     0.86  0.80  0.63
## Comments  0.86     1.00  0.76  0.67
## Views     0.80     0.76  1.00  0.78
## Forks     0.63     0.67  0.78  1.00

Correlaciones Comparadas

par(mfrow=c(1,2))
corrplot::corrplot(cor(Dataset[,-c(2,3,4,5,6,10)]), method = "color", type = "upper", number.cex = 0.4)
corrplot::corrplot(cor(princomp(Dataset[,-c(2,3,4,5,6,10)], cor = TRUE)$scores), method = "color", type = "upper", number.cex = 0.4)

Gráfico de Cattell

fviz_eig(PCA(Dataset[,-c(2,3,4,5,6,10)], scale.unit = T, graph = F), addlabels = T, ylim=c(0,90), main = "")

Gráfico de Cattell-Kaiser

scree(Dataset[,-c(2,3,4,5,6,10)],factors = FALSE, pc = TRUE, main ="")

Valores y Vectores Propios

princomp(Dataset[,-c(2,3,4,5,6,10)], cor = TRUE)$sdev^2
##    Comp.1    Comp.2    Comp.3    Comp.4 
## 3.2497475 0.4310348 0.2019606 0.1172571
princomp(Dataset[,-c(2,3,4,5,6,10)], cor = TRUE)$loadings[ ,1:4]
##             Comp.1     Comp.2     Comp.3     Comp.4
## Votes    0.5074678  0.4856239  0.1557430  0.6945430
## Comments 0.5073601  0.4037361 -0.5459676 -0.5305678
## Views    0.5135306 -0.1901153  0.7314758 -0.4063073
## Forks    0.4704769 -0.7516799 -0.3776329  0.2664998

2.3. Calidad de Representación

El estudio de la calidad de representación es esencial para comprender cómo la información de alta dimensionalidad puede ser transformada y simplificada sin perder propiedades significativas. Este proceso permite garantizar que las relaciones y los patrones importantes dentro de los datos originales se mantengan intactos, incluso cuando se reducen las dimensiones o se realizan representaciones alternativas.

Entre las distintas representaciones alternativas se presenta el circulo de correlaciones en este diagrama cada variable se representa como un vector en un círculo, donde Los vectores están orientados de acuerdo con las correlaciones entre las variables y la longitud del vector indica cuán fuerte es la correlación de esa variable con el conjunto de datos en general. Por otro lado la matriz de representación tiene filas que representan observaciones (o puntos de datos) y columnas que representan las nuevas variables o componentes (que resultan de la transformación) Coordenadas individuales

conclusion

Al realizarse los diferentes análisis para cada grafica en concordancia con nuestro conjunto de datos. se puede extraer que al reducirse las dimensiones para estudiar este conjunto de datos de otra forma más simplificada, las variables en gran parte conservan su estructura y las relaciones existentes entre si; por ejemplo, en el grafico de correlaciones las variables comments y votes mantienen una cercanía en cuanto a sus vectores, lo que indica que están altamente correlacionadas, situación que se podía visualizar en la sección 1.3 en el apartado de matriz de correlaciones donde este mismo indicaba que la mayor correlación se presentaba en los campos antes mencionados. De igual forma, en esta misma sección 1.3 se presentaba que el campo forks y comments eran aquellos que tenían la menor correlación, situación también presente en la gráfica circulo de correlaciones, en donde se puede visualizar que los vectores que representan a cada una de estas están bastante apartados entre sí. En cuanto a la matriz de representación muestra que tan bien representado este cada campo en las diferentes dimensiones, en donde se puede destacar que el campo forks es mejor representado en 2 dimensiones a comparación del resto de campos en esta misma dimensión, por otro lado, el campo comments es aquel que posee el menor nivel de representación en cada dimensión, donde su valor más alto en relación de los otros campos es en las dimensiones 3 y 4.

Círculo de Correlaciones

fviz_pca_var(PCA(Dataset[,-c(2,3,4,5,6,10)], scale.unit = T, graph = F),col.var="#3B83BD", repel = T, col.circle = "#CDCDCD", ggtheme = theme_bw())

Matriz de Representación

(get_pca_var(PCA(Dataset[,-c(2,3,4,5,6,10)], ncp = 4, scale.unit = TRUE, graph = F)))$cos2
##              Dim.1      Dim.2       Dim.3      Dim.4
## Votes    0.8368864 0.10165119 0.004898732 0.05656365
## Comments 0.8365314 0.07025990 0.060200554 0.03300813
## Views    0.8570029 0.01557925 0.108060421 0.01935746
## Forks    0.7193268 0.24354446 0.028800924 0.00832785

Calidad de Representaciónn

fviz_pca_var(PCA(Dataset[,-c(2,3,4,5,6,10)], ncp = 4, scale.unit = TRUE, graph = F), col.var="cos2", gradient.cols=c("#00AFBB","#E7B800","#FC4E07"), repel = TRUE)

Coordenadas Individuales

head((PCA(Dataset[,-c(2,3,4,5,6,10)], ncp = 4, scale.unit = TRUE, graph = F))$ind$coord, n = 23L)
##         Dim.1       Dim.2        Dim.3        Dim.4
## 1  -0.8743689  0.10628678  0.038112345  0.054290639
## 2  -0.9881145  0.14159063  0.034113096  0.161186480
## 3  -0.7706962  0.09537903  0.005330064 -0.036435539
## 4  -0.8915680  0.08933776  0.094490883  0.067648578
## 5  -0.7068681 -0.02175616  0.220886481 -0.116636396
## 6  -0.8717578  0.07318771  0.125823133  0.048908034
## 7  -0.7628505  0.03841323  0.140924452 -0.051593030
## 8  -0.9390039  0.15383142  0.004460499  0.127213349
## 9  -0.8707480  0.11923022  0.054006244  0.064259074
## 10 -0.9528803  0.17435975  0.019712941  0.155125688
## 11 -0.7818159  0.09808506  0.084626488 -0.008637619
## 12 -0.9096936  0.16686399  0.017747490  0.117889524
## 13 -0.8513259  0.22936084 -0.093364367  0.094025454
## 14 -0.6227836  0.10971452  0.078853169 -0.117997828
## 15 -0.7224183  0.12545899  0.163025706 -0.015316547
## 16 -0.7906254  0.16458034  0.172657665  0.064032461
## 17 -0.9397109  0.11610108  0.052135683  0.122091882
## 18 -0.9245598  0.10996819  0.060329349  0.108570940
## 19 -0.8999158  0.12141230  0.029436559  0.091639151
## 20 -0.7115387  0.16998836 -0.175128484 -0.057905471
## 21 -0.6314081  0.00611902  0.125780788 -0.163554874
## 22 -0.8774669  0.09565738  0.088890449  0.070560903
## 23 -0.6994774  0.14980928 -0.134863834 -0.071798400

2.4 Contribuciones

En esta sección se busca analizar cuánto aporta cada campo al modelo estadístico y cómo influye en los resultados obtenidos. El objetivo es identificar qué campos requieren mayor atención, detectar patrones significativos y eliminar posibles redundancias, facilitando así la interpretación y el uso eficiente de los datos. Esto no solo ayudará a entender cómo interactúan los diferentes campos entre sí, sino también a evaluar su impacto en el comportamiento general del sistema, ofreciendo información clave para tomar decisiones estratégicas y bien fundamentadas.

El objetivo antes mencionado de “identificar campos que requieran mayor atención, detectar patrones significativos y eliminar posibles redundancias” se alcanza mediante el uso de métodos de reducción de dimensionalidad. Estos métodos permiten representar gráficamente, a través de diagramas de barras, el nivel de contribución de cada campo en cada dimensión. Para lograr esto, se elabora un gráfico para cada dimensión identificada en el análisis, en el cual cada campo contribuye como una dimensión en sí misma. Por lo tanto, al trabajar con 4 variables cuantitativas en escala razón, surgen 4 dimensiones a analizar. Este enfoque proporciona una representación visual clara y comprensible de cómo cada campo influye en las distintas dimensiones, facilitando la interpretación de los resultados y la toma de decisiones fundamentadas.   conclusion

Gracias al estudio de matriz de contribuciones es posible identificar en forma de porcentajes cuanto contribuye cada una de las variables a las distintas dimensiones, en donde el campo comments no se presenta en ninguna dimensión como el mayor contribuyente frente a los otros campos, su mayor contribución es en la dimensión 3 con un 29.8081%. Por otro lado, contrario a comments el campo views se presenta en 2 dimensiones como el mayor contribuyente frente a los otros campos con porcentajes de 53.5057 - 26.3714 . Mediante los gráficos de barras para cada dimensión “D1,D2,D3,D4”, se puede visualizar de forma más representativa lo antes mencionado, además a esto, también se puede visualizar que los campos forks y votes tienen una mayor contribución en las dimensiones D2 y D4 respectivamente. De esto se puede concluir que al estudiar estos distintos campos votes, comments, views y forks en una sola dimensión, se pueden tener un análisis satisfactorio ya que en esta dimensión es donde todos los campos contribuyen en medidas proporcionales.

Matriz de Contribuciones

round((get_pca_var(PCA(Dataset[,-c(2,3,4,5,6,10)], ncp = 4, scale.unit = TRUE, graph = F)))$contrib,4)
##            Dim.1   Dim.2   Dim.3   Dim.4
## Votes    25.7524 23.5831  2.4256 48.2390
## Comments 25.7414 16.3003 29.8081 28.1502
## Views    26.3714  3.6144 53.5057 16.5086
## Forks    22.1349 56.5023 14.2607  7.1022

Contribuciones a D1

fviz_contrib(PCA(Dataset[,-c(2,3,4,5,6,10)], ncp = 4, scale.unit = TRUE, graph = F), choice = "var", axes = 1, top = 10)

Contribuciones a D2

fviz_contrib(PCA(Dataset[,-c(2,3,4,5,6,10)], ncp = 4, scale.unit = TRUE, graph = F), choice = "var", axes = 2, top = 10)

Contribuciones a D3

fviz_contrib(PCA(Dataset[,-c(2,3,4,5,6,10)], ncp = 4, scale.unit = TRUE, graph = F), choice = "var", axes = 3, top = 10)

Contribuciones a D4

fviz_contrib(PCA(Dataset[,-c(2,3,4,5,6,10)], ncp = 4, scale.unit = TRUE, graph = F), choice = "var", axes = 4, top = 10)

2.5 Interpretacion

En esta sección se busca entender cómo se relacionan varios campos y observaciones dentro de un conjunto de datos, Para interpretar mejor esta información, se utilizan herramientas como las coordenadas individuales, que nos muestran cómo se posicionan las observaciones en un espacio más simple, y el biplot de variables y registros, que junta en un mismo gráfico las conexiones entre registros y variables. Estas herramientas nos permiten descubrir patrones, tendencias y relaciones importantes, haciendo más fácil comprender la estructura de los datos y tomar decisiones basadas en ellos.

El apartado de coordenadas individuales muestra un listado de coordenadas de las distintas observaciones de este conjunto de datos en las respectivas dimensiones (los campos cuantitativos de escala razón), donde cada coordenada corresponde a la posición de una observación en estas dimensiones clave lo cual permite identificar agrupamientos, similitudes y patrones entre los registros. Por otro lado, el Biplot de Variables y Registros es una gráfica que combina en un mismo espacio las relaciones entre las observaciones (registros) y los campos de un conjunto de datos, permitiendo analizar cómo estas interacciones se asocian con una variable categórica, como code_type. Este enfoque visual muestra si las categorías de la variable dicotómica influyen en la distribución de los registros, revelando posibles agrupaciones según dichas categorías. Además, los vectores de las variables originales indican cuáles tienen mayor impacto en la separación entre categorías. Esto facilita la identificación de patrones clave en cada grupo y ayuda a comprender cómo los diversos campos interactúan con la variable categórica en el conjunto de datos.

conclusion

El diagrama de Coordenadas individuales muestra como muchos registros tienen valores muy similares o idénticos en las diferentes dimensiones, especialmente alrededor de valores cercanos a cero. Esto sugiere que podría haber poca variabilidad entre las observaciones proyectadas en estas dimensiones, indicando que estas dimensiones no capturan información significativa o diferenciadora en la mayoría de los casos. En cuanto al Biplot de Variables y Registros se puede visualizar que la mayoría de los registros están agrupados cerca del origen, lo que sugiere que comparten características similares sin valores extremos en las variables representadas; además a esto, se puede soportar más lo presentado en sección 2.4, donde mediante los gráficos presentes se realizó una inferencia de que en la dimencion1 (Dim1) era la más destacada para diferenciar registros, ya que esta explica el 69.4% de la variabilidad.

Biplot de Variables y Registros Code_Type

set.seed(780754)
Dataset_Muestreado2 = Dataset[sample(1:nrow(Dataset),100),-c(2,3,4,6,10)]

Dataset_Muestreado2$Code_Type <- as.factor(Dataset_Muestreado2$Code_Type)

fviz_pca_biplot(PCA(Dataset_Muestreado2[,], ncp = 4, scale.unit = TRUE, graph = F, quali.sup = "Code_Type"), axes = c(1,2), repel = TRUE, habillage = "Code_Type")

Coordenadas Individuales [Subconjunto Code_Type]

set.seed(780728)
Dataset_Muestreado_coor <- Dataset[sample(1:nrow(Dataset), 100), -c(2,3,4,6,10)]
set.seed(780728)
sampled_rows <- sample(1:nrow(Dataset), 100)

Data_coor <- cbind(Dataset_Muestreado_coor[sampled_rows,])
suppressWarnings(head(PCA(Data_coor, ncp = 6, scale.unit = T, graph = F, quali.sup = 2)$ind$coord, n = 61L))
##            Dim.1         Dim.2         Dim.3         Dim.4
## 1   8.913352e-15 -1.377115e-15  1.617447e-15 -2.477177e-15
## 2   1.693063e-15 -2.277324e-15 -1.776275e-15 -1.781116e-15
## 3   5.377124e-16  4.350735e-16 -2.412408e-15 -2.948469e-15
## 4  -1.227647e+00  9.062372e-01  8.838714e-01 -2.912382e-01
## 5   1.759412e-15 -1.244774e-15 -1.486010e-15 -1.940180e-15
## 6   1.759412e-15 -1.244774e-15 -1.486010e-15 -1.940180e-15
## 7   1.759412e-15 -1.244774e-15 -1.486010e-15 -1.940180e-15
## 8   1.759412e-15 -1.244774e-15 -1.486010e-15 -1.940180e-15
## 9   1.759412e-15 -1.244774e-15 -1.486010e-15 -1.940180e-15
## 10  1.759412e-15 -1.244774e-15 -1.486010e-15 -1.940180e-15
## 11  1.759412e-15 -1.244774e-15 -1.486010e-15 -1.940180e-15
## 12  1.759412e-15 -1.244774e-15 -1.486010e-15 -1.940180e-15
## 13  1.759412e-15 -1.244774e-15 -1.486010e-15 -1.940180e-15
## 14  1.759412e-15 -1.244774e-15 -1.486010e-15 -1.940180e-15
## 15  1.759412e-15 -1.244774e-15 -1.486010e-15 -1.940180e-15
## 16  6.154184e+00  5.942662e+00  8.211837e-01  5.456037e-02
## 17  1.759412e-15 -1.244774e-15 -1.486010e-15 -1.940180e-15
## 18  1.759412e-15 -1.244774e-15 -1.486010e-15 -1.940180e-15
## 19  1.759412e-15 -1.244774e-15 -1.486010e-15 -1.940180e-15
## 20  1.759412e-15 -1.244774e-15 -1.486010e-15 -1.940180e-15
## 21 -1.742735e+00 -1.048767e+00 -5.142518e-01 -3.027832e-01
## 22  1.759412e-15 -1.244774e-15 -1.486010e-15 -1.940180e-15
## 23 -3.106623e+00 -4.682208e-01 -5.907296e-01 -4.415453e-01
## 24  1.759412e-15 -1.244774e-15 -1.486010e-15 -1.940180e-15
## 25  1.759412e-15 -1.244774e-15 -1.486010e-15 -1.940180e-15
## 26  1.759412e-15 -1.244774e-15 -1.486010e-15 -1.940180e-15
## 27  1.759412e-15 -1.244774e-15 -1.486010e-15 -1.940180e-15
## 28 -2.018879e+00  4.965015e-01  1.622776e-01 -6.301985e-02
## 29  1.759412e-15 -1.244774e-15 -1.486010e-15 -1.940180e-15
## 30  1.759412e-15 -1.244774e-15 -1.486010e-15 -1.940180e-15
## 31  3.366253e+00 -2.731181e+00  2.943564e+00  8.222237e-02
## 32  1.759412e-15 -1.244774e-15 -1.486010e-15 -1.940180e-15
## 33  1.759412e-15 -1.244774e-15 -1.486010e-15 -1.940180e-15
## 34  1.759412e-15 -1.244774e-15 -1.486010e-15 -1.940180e-15
## 35  1.759412e-15 -1.244774e-15 -1.486010e-15 -1.940180e-15
## 36  1.759412e-15 -1.244774e-15 -1.486010e-15 -1.940180e-15
## 37  1.759412e-15 -1.244774e-15 -1.486010e-15 -1.940180e-15
## 38 -3.315962e+00 -5.760180e-01 -4.812919e-01  3.324999e-01
## 39  1.759412e-15 -1.244774e-15 -1.486010e-15 -1.940180e-15
## 40  1.759412e-15 -1.244774e-15 -1.486010e-15 -1.940180e-15
## 41  1.759412e-15 -1.244774e-15 -1.486010e-15 -1.940180e-15
## 42  1.759412e-15 -1.244774e-15 -1.486010e-15 -1.940180e-15
## 43  1.759412e-15 -1.244774e-15 -1.486010e-15 -1.940180e-15
## 44  1.759412e-15 -1.244774e-15 -1.486010e-15 -1.940180e-15
## 45  1.759412e-15 -1.244774e-15 -1.486010e-15 -1.940180e-15
## 46  1.759412e-15 -1.244774e-15 -1.486010e-15 -1.940180e-15
## 47  1.759412e-15 -1.244774e-15 -1.486010e-15 -1.940180e-15
## 48  1.759412e-15 -1.244774e-15 -1.486010e-15 -1.940180e-15
## 49  1.759412e-15 -1.244774e-15 -1.486010e-15 -1.940180e-15
## 50  1.759412e-15 -1.244774e-15 -1.486010e-15 -1.940180e-15
## 51  1.759412e-15 -1.244774e-15 -1.486010e-15 -1.940180e-15
## 52  1.759412e-15 -1.244774e-15 -1.486010e-15 -1.940180e-15
## 53  1.759412e-15 -1.244774e-15 -1.486010e-15 -1.940180e-15
## 54  1.759412e-15 -1.244774e-15 -1.486010e-15 -1.940180e-15
## 55  1.759412e-15 -1.244774e-15 -1.486010e-15 -1.940180e-15
## 56 -3.669457e+00 -6.136423e-01 -3.813606e-01  1.038962e-01
## 57  1.759412e-15 -1.244774e-15 -1.486010e-15 -1.940180e-15
## 58  1.759412e-15 -1.244774e-15 -1.486010e-15 -1.940180e-15
## 59  1.759412e-15 -1.244774e-15 -1.486010e-15 -1.940180e-15
## 60  1.759412e-15 -1.244774e-15 -1.486010e-15 -1.940180e-15
## 61  1.759412e-15 -1.244774e-15 -1.486010e-15 -1.940180e-15

Biplot de Variables y Registros [Subconjunto Code_Type]

set.seed(780720)

Dataset_Muestreado_biplot = Dataset[sample(1:nrow(Dataset),100),-c(2,3,4,6,10)]
Dataset_Muestreado_biplot$Code_Type <- as.factor(Dataset_Muestreado_biplot$Code_Type)
fviz_pca_biplot(PCA(Dataset_Muestreado_biplot, ncp = , scale.unit = TRUE, graph = F, quali.sup = "Code_Type"), axes = c(1, 2), repel = TRUE, habillage = "Code_Type")

Fase 3 [Correspondencias]

3.1. Objetivos

-Realizar pruebas de hipótesis, como la prueba de chi-cuadrado, para confirmar si las variables categóricas son independientes o están asociadas.

-Representar Variables del conjunto de datos en procesos estadísticos como la tabla de contingencia, tabla de probabilidades.

3.2. Correspondencias Simples

“En el análisis de datos, las variables cualitativas juegan un papel fundamental para la comprensión de patrones y relaciones dentro de un conjunto del datos. Este estudio se centra en la aplicación de diversas técnicas estadísticas para explorar y analizar las variables cualitativas, utilizando herramientas como tablas de contingencia, probabilidades, frecuencias y perfiles. Además, se llevarán a cabo pruebas de hipótesis para validar las suposiciones formuladas. A través de este enfoque, se busca obtener una visión más clara sobre la interrelación de las variables estudiadas, contribuyendo así a una interpretación más robusta de los resultados.”

“El análisis de las variables cualitativas permite identificar tendencias y patrones que son esenciales para la toma de decisiones informadas. En este estudio, se procederá a la construcción de tablas de contingencia que permitirán visualizar las relaciones entre diferentes categorías, facilitando así la identificación de correlaciones significativas. A través del cálculo de probabilidades y frecuencias, se determinarán las distribuciones de las variables, lo que ofrecerá una comprensión más profunda de su comportamiento. Así mismo, se elaborarán perfiles descriptivos que resuman las características clave de cada categoría, proporcionando un contexto valioso para las pruebas de hipótesis que se llevarán a cabo.

conclusion

En conclusión, En la primera tabla, que cruza la variable “code_type” con “language”, se destaca que el nombre que más frecuentemente aparece es “notebook” en combinación con “Python”. De un total de 957 registros, 540 corresponden a esta combinación específica. Esto indica que más del 56% corresponde a esta combinación y esto se puede evidenciar en la tabla de probabilidades. En la segunda tabla de contingencia, que cruza la variable “country” con “language”, se observa que la combinación más prominente es la de “United States” con “Python”. De un total de 957 registros, esta combinación alcanza un total de 196 casos, lo que representa más del 20% del total. Este dato es particularmente significativo, ya que sugiere que una quinta parte de los registros proviene de usuarios en Estados Unidos que utilizan Python como su lenguaje de programación preferido. En la tercera tabla de contingencia, donde se cruzan las variables “country” y “code_type”, se evidencia una vez más la prominencia de Estados Unidos en el uso de “notebooks”. Específicamente, esta combinación registra un total de 165 casos de un total de 957, lo que representa más del 17% de todos los registros analizados. Con base en el análisis realizado a través de tablas de contingencia y el cálculo de probabilidades, se puede concluir que las combinaciones de las variables cualitativas estudiadas—“country”, “language” y “code_type”—revelan patrones claros y significativos. En particular, se evidencia que el país que más se destaca es “United States”, mientras que el lenguaje más utilizado es “Python” y el tipo de código más frecuente es “notebook”.

El estudio de perfiles complementa y respalda las conclusiones anteriores al proporcionar una representación visual clara de las tendencias identificadas en los análisis previos. A través de gráficos, se evidencia de manera contundente que las combinaciones de variables más influyentes en este contexto son “United States”, “Python” y “notebook”. Prueba de hipótesis H0:Las variables categóricas son independientes H1:las variables categóricas son dependientes Relación entre Code_Type y Language Dado que el p-valor es mucho menor que 0.05, se rechaza la hipótesis nula de independencia entre Code_Type y Language. Esto indica que hay una relación estadísticamente significativa entre ambos. Relación entre Country y Language Con un p-valor de 0.9891 (muy mayor que 0.05), no se rechaza la hipótesis nula. Esto sugiere que no hay evidencia estadística suficiente para afirmar que existe una relación entre Country y Language. Ambos parecen ser independientes. Relación entre Country y Code_Type con un p-valor de 0.899 (mucho mayor que 0.05), no se rechaza la hipótesis nula. Esto indica que no hay evidencia estadística de una relación entre Country y Code_Type. Parecen ser independientes.

Analisis de Correspondencias

Tabla de Contingencia
addmargins(table(Dataset$Code_Type, Dataset$Language))
##           
##            markdown Python   R SQLite Sum
##   Notebook        0    540  41      0 581
##   Script        144    178  53      1 376
##   Sum           144    718  94      1 957
addmargins(table(Dataset$Country, Dataset$Language))
##                
##                 markdown Python   R SQLite Sum
##   Argentina            1     12   0      0  13
##   Australia            5     18   4      0  27
##   Bangladesh           4     21   4      0  29
##   Belgium              0      5   2      0   7
##   Brazil               4     25   3      0  32
##   Canada               1     21   3      0  25
##   China                3     14   1      0  18
##   England             14     62   8      1  85
##   France               5     24   2      0  31
##   Germany             10     83  10      0 103
##   India               21     78  10      0 109
##   Israel               3     12   1      0  16
##   Lebanon              1      8   1      0  10
##   Netherlands          2      8   3      0  13
##   Norway               3     10   0      0  13
##   Poland               5     21   2      0  28
##   Portugal             2     11   0      0  13
##   Russia               5     16   2      0  23
##   South Africa         1      6   1      0   8
##   Spain                3     34   3      0  40
##   Taiwan               2      2   2      0   6
##   Ukraine              2     25   3      0  30
##   United States       46    196  29      0 271
##   Vietnam              1      6   0      0   7
##   Sum                144    718  94      1 957
addmargins(table(Dataset$Country, Dataset$Code_Type))
##                
##                 Notebook Script Sum
##   Argentina            7      6  13
##   Australia           18      9  27
##   Bangladesh          17     12  29
##   Belgium              3      4   7
##   Brazil              21     11  32
##   Canada              18      7  25
##   China               10      8  18
##   England             50     35  85
##   France              22      9  31
##   Germany             58     45 103
##   India               61     48 109
##   Israel               7      9  16
##   Lebanon              5      5  10
##   Netherlands          8      5  13
##   Norway               8      5  13
##   Poland              18     10  28
##   Portugal             7      6  13
##   Russia              15      8  23
##   South Africa         6      2   8
##   Spain               27     13  40
##   Taiwan               3      3   6
##   Ukraine             23      7  30
##   United States      165    106 271
##   Vietnam              4      3   7
##   Sum                581    376 957
Probabilidades
round(addmargins(prop.table(table(Dataset$Code_Type, Dataset$Language))*100),2)
##           
##            markdown Python      R SQLite    Sum
##   Notebook     0.00  56.43   4.28   0.00  60.71
##   Script      15.05  18.60   5.54   0.10  39.29
##   Sum         15.05  75.03   9.82   0.10 100.00
round(addmargins(prop.table(table(Dataset$Country, Dataset$Language))*100),2)
##                
##                 markdown Python      R SQLite    Sum
##   Argentina         0.10   1.25   0.00   0.00   1.36
##   Australia         0.52   1.88   0.42   0.00   2.82
##   Bangladesh        0.42   2.19   0.42   0.00   3.03
##   Belgium           0.00   0.52   0.21   0.00   0.73
##   Brazil            0.42   2.61   0.31   0.00   3.34
##   Canada            0.10   2.19   0.31   0.00   2.61
##   China             0.31   1.46   0.10   0.00   1.88
##   England           1.46   6.48   0.84   0.10   8.88
##   France            0.52   2.51   0.21   0.00   3.24
##   Germany           1.04   8.67   1.04   0.00  10.76
##   India             2.19   8.15   1.04   0.00  11.39
##   Israel            0.31   1.25   0.10   0.00   1.67
##   Lebanon           0.10   0.84   0.10   0.00   1.04
##   Netherlands       0.21   0.84   0.31   0.00   1.36
##   Norway            0.31   1.04   0.00   0.00   1.36
##   Poland            0.52   2.19   0.21   0.00   2.93
##   Portugal          0.21   1.15   0.00   0.00   1.36
##   Russia            0.52   1.67   0.21   0.00   2.40
##   South Africa      0.10   0.63   0.10   0.00   0.84
##   Spain             0.31   3.55   0.31   0.00   4.18
##   Taiwan            0.21   0.21   0.21   0.00   0.63
##   Ukraine           0.21   2.61   0.31   0.00   3.13
##   United States     4.81  20.48   3.03   0.00  28.32
##   Vietnam           0.10   0.63   0.00   0.00   0.73
##   Sum              15.05  75.03   9.82   0.10 100.00
round(addmargins(prop.table(table(Dataset$Country, Dataset$Code_Type))*100),2)
##                
##                 Notebook Script    Sum
##   Argentina         0.73   0.63   1.36
##   Australia         1.88   0.94   2.82
##   Bangladesh        1.78   1.25   3.03
##   Belgium           0.31   0.42   0.73
##   Brazil            2.19   1.15   3.34
##   Canada            1.88   0.73   2.61
##   China             1.04   0.84   1.88
##   England           5.22   3.66   8.88
##   France            2.30   0.94   3.24
##   Germany           6.06   4.70  10.76
##   India             6.37   5.02  11.39
##   Israel            0.73   0.94   1.67
##   Lebanon           0.52   0.52   1.04
##   Netherlands       0.84   0.52   1.36
##   Norway            0.84   0.52   1.36
##   Poland            1.88   1.04   2.93
##   Portugal          0.73   0.63   1.36
##   Russia            1.57   0.84   2.40
##   South Africa      0.63   0.21   0.84
##   Spain             2.82   1.36   4.18
##   Taiwan            0.31   0.31   0.63
##   Ukraine           2.40   0.73   3.13
##   United States    17.24  11.08  28.32
##   Vietnam           0.42   0.31   0.73
##   Sum              60.71  39.29 100.00
Frecuencias
round(addmargins(prop.table(table(Dataset$Code_Type, Dataset$Language), 1)*100, 2), 2)
##           
##            markdown Python      R SQLite    Sum
##   Notebook     0.00  92.94   7.06   0.00 100.00
##   Script      38.30  47.34  14.10   0.27 100.00
round(addmargins(prop.table(table(Dataset$Country, Dataset$Language), 1)*100, 2), 2)
##                
##                 markdown Python      R SQLite    Sum
##   Argentina         7.69  92.31   0.00   0.00 100.00
##   Australia        18.52  66.67  14.81   0.00 100.00
##   Bangladesh       13.79  72.41  13.79   0.00 100.00
##   Belgium           0.00  71.43  28.57   0.00 100.00
##   Brazil           12.50  78.12   9.38   0.00 100.00
##   Canada            4.00  84.00  12.00   0.00 100.00
##   China            16.67  77.78   5.56   0.00 100.00
##   England          16.47  72.94   9.41   1.18 100.00
##   France           16.13  77.42   6.45   0.00 100.00
##   Germany           9.71  80.58   9.71   0.00 100.00
##   India            19.27  71.56   9.17   0.00 100.00
##   Israel           18.75  75.00   6.25   0.00 100.00
##   Lebanon          10.00  80.00  10.00   0.00 100.00
##   Netherlands      15.38  61.54  23.08   0.00 100.00
##   Norway           23.08  76.92   0.00   0.00 100.00
##   Poland           17.86  75.00   7.14   0.00 100.00
##   Portugal         15.38  84.62   0.00   0.00 100.00
##   Russia           21.74  69.57   8.70   0.00 100.00
##   South Africa     12.50  75.00  12.50   0.00 100.00
##   Spain             7.50  85.00   7.50   0.00 100.00
##   Taiwan           33.33  33.33  33.33   0.00 100.00
##   Ukraine           6.67  83.33  10.00   0.00 100.00
##   United States    16.97  72.32  10.70   0.00 100.00
##   Vietnam          14.29  85.71   0.00   0.00 100.00
round(addmargins(prop.table(table(Dataset$Country, Dataset$Code_Type), 1)*100, 2), 2)
##                
##                 Notebook Script    Sum
##   Argentina        53.85  46.15 100.00
##   Australia        66.67  33.33 100.00
##   Bangladesh       58.62  41.38 100.00
##   Belgium          42.86  57.14 100.00
##   Brazil           65.62  34.38 100.00
##   Canada           72.00  28.00 100.00
##   China            55.56  44.44 100.00
##   England          58.82  41.18 100.00
##   France           70.97  29.03 100.00
##   Germany          56.31  43.69 100.00
##   India            55.96  44.04 100.00
##   Israel           43.75  56.25 100.00
##   Lebanon          50.00  50.00 100.00
##   Netherlands      61.54  38.46 100.00
##   Norway           61.54  38.46 100.00
##   Poland           64.29  35.71 100.00
##   Portugal         53.85  46.15 100.00
##   Russia           65.22  34.78 100.00
##   South Africa     75.00  25.00 100.00
##   Spain            67.50  32.50 100.00
##   Taiwan           50.00  50.00 100.00
##   Ukraine          76.67  23.33 100.00
##   United States    60.89  39.11 100.00
##   Vietnam          57.14  42.86 100.00
Perfiles
plotct(table(Dataset$Code_Type, Dataset$Language),"row")

plotct(table(Dataset$Country, Dataset$Language),"row")

plotct(table(Dataset$Country, Dataset$Code_Type),"row")

Pruebas de Hipotesis
suppressWarnings(chisq.test(table(Dataset$Code_Type, Dataset$Language)))
## 
##  Pearson's Chi-squared test
## 
## data:  table(Dataset$Code_Type, Dataset$Language)
## X-squared = 298.84, df = 3, p-value < 2.2e-16
suppressWarnings(chisq.test(table(Dataset$Country, Dataset$Language)))
## 
##  Pearson's Chi-squared test
## 
## data:  table(Dataset$Country, Dataset$Language)
## X-squared = 44.932, df = 69, p-value = 0.9891
suppressWarnings(chisq.test(table(Dataset$Country, Dataset$Code_Type)))
## 
##  Pearson's Chi-squared test
## 
## data:  table(Dataset$Country, Dataset$Code_Type)
## X-squared = 14.877, df = 23, p-value = 0.899

Pareja unica

El análisis Chi-cuadrado sugiere que existe una asociación significativa entre el tipo de código (Code_Type) y el lenguaje (Language), ya que se observan desviaciones importantes entre los valores observados y esperados. Esto indica que ciertas combinaciones (por ejemplo, “Notebook” con “Python”) ocurren más frecuentemente de lo que se esperaría bajo independencia, mientras que otras (por ejemplo, “Script” con “R”) ocurren menos frecuentemente.

Contribuciones La tabla muestra las contribuciones al estadístico chi-cuadrado (χ²) de dos variables categóricas: Code_Type y Language. Se destaca que Markdown tiene la mayor contribución en ambos tipos de documentos (Notebook y Script), sugiriendo una asociación más fuerte con este lenguaje. Sin embargo, para una conclusión definitiva, se necesita conocer el valor del χ² y su p-valor, así como el contexto de los datos. En resumen, Markdown parece ser el lenguaje más relevante en esta comparación.

Correspondecia simple La tabla presenta los resultados de un análisis que relaciona el tipo de código (Code_Type) y el lenguaje (Language): * $eig: La primera dimensión explica el 31.23% de la varianza total. * $coord: Muestra las coordenadas para cada lenguaje: - Markdown, - Python, - R, - SQLite.

Las coordenadas indican la dirección y fuerza de la relación con la dimensión principal. * $contrib: La contribución a la varianza total en la primera dimensión es: - Markdown: 74.46% - Python: menor contribución - SQLite: contribución mínima * $cos2: Todos los puntos tienen un coseno cuadrado (cos²) de 1, lo que indica una excelente representación en la dimensión principal. * $inertia: Muestra la inercia asociada a las dimensiones, reflejando la varianza capturada. En resumen, el análisis muestra que Markdown es el mayor contribuyente a la varianza en la primera dimensión, con una representación perfecta en el espacio reducido. El análisis de correspondencia revela que existe una relación significativa entre el tipo de código (Code_Type) y el lenguaje utilizado (Language). En particular, Markdown es el principal contribuyente a la varianza en la primera dimensión, lo que sugiere que se utiliza de manera predominante en comparación con otros lenguajes como Python y SQLite. Además, todos los puntos están perfectamente representados en la dimensión principal, lo que indica que el modelo captura adecuadamente la estructura de los datos. En resumen, este análisis proporciona información valiosa sobre cómo se relacionan diferentes tipos de código con los lenguajes utilizados en el conjunto de datos.

Contingencias y Residuales
suppressWarnings(chisq.test(table(Dataset$Code_Type, Dataset$Language))$observed)
##           
##            markdown Python   R SQLite
##   Notebook        0    540  41      0
##   Script        144    178  53      1
suppressWarnings(chisq.test(table(Dataset$Code_Type, Dataset$Language))$expected)
##           
##            markdown   Python        R    SQLite
##   Notebook  87.4232 435.9018 57.06792 0.6071055
##   Script    56.5768 282.0982 36.93208 0.3928945
suppressWarnings(chisq.test(table(Dataset$Code_Type, Dataset$Language))$residuals)
##           
##              markdown     Python          R     SQLite
##   Notebook -9.3500373  4.9859624 -2.1269812 -0.7791698
##   Script   11.6227123 -6.1978797  2.6439778  0.9685594
suppressWarnings(chisq.test(table(Dataset$Code_Type, Dataset$Language))$stdres)
##           
##              markdown     Python          R     SQLite
##   Notebook -16.184008  15.917251  -3.573356  -1.243716
##   Script    16.184008 -15.917251   3.573356   1.243716
Contribucioness
suppressWarnings(chisq.test(table(Dataset$Code_Type, Dataset$Language))$residuals^2/chisq.test(table(Dataset$Code_Type, Dataset$Language))$statistic*100)
##           
##              markdown     Python          R     SQLite
##   Notebook 29.2537853  8.3186601  1.5138495  0.2031513
##   Script   45.2033225 12.8540998  2.3392195  0.3139120
Correspondencia Simple Unidimensional
CA(table(Dataset$Code_Type, Dataset$Language), graph = FALSE)$eig
##       eigenvalue percentage of variance cumulative percentage of variance
## dim 1  0.3122717                    100                               100
CA(table(Dataset$Code_Type, Dataset$Language), graph = FALSE)$col
## $coord
##                [,1]
## markdown  1.2430659
## Python   -0.2968580
## R         0.3499949
## SQLite    1.2430659
## 
## $contrib
##                [,1]
## markdown 74.4571078
## Python   21.1727600
## R         3.8530690
## SQLite    0.5170632
## 
## $cos2
##          [,1]
## markdown    1
## Python      1
## R           1
## SQLite      1
## 
## $inertia
## [1] 0.232508504 0.066116545 0.012032045 0.001614642
CA(table(Dataset$Code_Type, Dataset$Language), graph = FALSE)$row
## $coord
##   Notebook     Script 
## -0.4495440  0.6946411 
## 
## $contrib
## Notebook   Script 
## 39.28945 60.71055 
## 
## $cos2
## Notebook   Script 
##        1        1 
## 
## $inertia
## [1] 0.1226898 0.1895819

3.3. Correspondencias Múltiples

En el análisis de datos, las variables cualitativas clasificadoras ofrecen una valiosa perspectiva sobre las diferencias y similitudes entre grupos. En este estudio, nos enfocaremos en una única variable cualitativa clasificadora: “country”, que nos permitirá explorar un conjunto diverso de naciones. A través de la aplicación de diversas pruebas de Análisis de Componentes Múltiples (ACM), bitplo ACM, calidad de representaciones, contribuciones y bitplo de contribuciones, buscaremos desentrañar patrones significativos en cómo cada país se presenta y contribuye a su respectivo ámbito. Este enfoque nos permitirá identificar variaciones entre los países.

Al profundizar en el análisis de la variable “country”, se revela la complejidad de las pruebas, como el Análisis de Componentes Múltiples (ACM) y el bitplo ACM, nos permiten visualizar y comprender cómo cada país se posiciona en relación con las métricas de calidad de representación y contribuciones. A través del análisis de estas variables, emergen patrones que reflejan la diversidad en la forma en que los países presentan sus datos, también la variabilidad

conclusion

ACM: La tabla ayuda a entender qué cantidad de información (varianza) se retiene al reducir la dimensionalidad de los datos usando ACP. Se puede observar que la parte de la varianza mas alta se concentra en el prime campo (dim 1, principalmente). Los últimos componentes principales contribuyen muy poco a la varianza total. Esto sugiere que la reducción de la dimensionalidad a un número menor de componentes principales, manteniendo una alta proporción de la varianza, podría ser posible sin una pérdida significativa de información. El biplot del Análisis de Componentes Múltiples (ACM) ofrece una representación visual clara de las interrelaciones entre las diversas observaciones (las cinco variables) y la variable categórica “country”. Al analizar la distribución de los puntos y los vectores en la gráfica, se pueden identificar patrones relevantes en los datos. Los puntos que se agrupan indican que comparten características comunes, mientras que la dirección y longitud de los vectores revelan cuáles variables ejercen mayor influencia. Un vector largo que se orienta hacia un grupo particular de puntos sugiere que esa variable desempeña un papel significativo en el análisis. La calidad de representación se manifiesta en un plano que ilustra las relaciones entre las variables, utilizando un concepto de proximidad para destacar cómo se agrupan los nombres de la variable “country” junto con los de “code_type”. Esta visualización permite observar la cercanía entre los diferentes grupos, revelando el grado de relación que existe entre estas variables cualitativas. Cuanto más próximos estén los nombres en el gráfico, mayor será la similitud en sus características y comportamientos. Así, esta representación no solo facilita la identificación de patrones y agrupaciones significativas, sino que también proporciona una comprensión más clara de cómo interactúan estas variables en el contexto del análisis. El gráfico de contribuciones del Análisis de Componentes Múltiples (ACM) es súper útil para entender qué variables tienen más peso en la primera dimensión del análisis. Básicamente, te muestra cuáles factores realmente importan y cómo están relacionados entre sí. Esto ayuda a tener una idea más clara de qué está influyendo más en los datos y, a partir de ahí, decidir en qué enfocarse. Es una herramienta muy práctica porque te permite priorizar lo importante y planear estrategias o investigaciones basadas en lo que realmente está moviendo los resultados. Bitplo de contribuciones: Esta pestaña refleja aspectos similares a los presentados en la sección de calidad de representación, ya que también ilustra las contribuciones y las relaciones entre las variables dentro del conjunto de datos. Al analizar esta información, se puede apreciar cómo cada variable interactúa con las demás y qué tan influyentes son en el contexto general del análisis. Esta visualización permite identificar no solo la fuerza de estas relaciones, sino también su relevancia en la interpretación de los datos.

ACM

round(MCA(Dataset[1:400, -c(1,2,3,4,6,7,8,9)], graph = FALSE)$eig,2)
##        eigenvalue percentage of variance cumulative percentage of variance
## dim 1        0.61                   5.04                              5.04
## dim 2        0.50                   4.17                              9.21
## dim 3        0.50                   4.17                             13.38
## dim 4        0.50                   4.17                             17.54
## dim 5        0.50                   4.17                             21.71
## dim 6        0.50                   4.17                             25.88
## dim 7        0.50                   4.17                             30.04
## dim 8        0.50                   4.17                             34.21
## dim 9        0.50                   4.17                             38.38
## dim 10       0.50                   4.17                             42.54
## dim 11       0.50                   4.17                             46.71
## dim 12       0.50                   4.17                             50.88
## dim 13       0.50                   4.17                             55.04
## dim 14       0.50                   4.17                             59.21
## dim 15       0.50                   4.17                             63.38
## dim 16       0.50                   4.17                             67.54
## dim 17       0.50                   4.17                             71.71
## dim 18       0.50                   4.17                             75.88
## dim 19       0.50                   4.17                             80.04
## dim 20       0.50                   4.17                             84.21
## dim 21       0.50                   4.17                             88.38
## dim 22       0.50                   4.17                             92.54
## dim 23       0.50                   4.17                             96.71
## dim 24       0.39                   3.29                            100.00

Biplot ACM

fviz_mca_biplot(MCA(Dataset[1:400, -c(1,2,3,4,6,7,8,9)], graph = FALSE), repel = TRUE)

Calidad de Representación

fviz_mca_var(MCA(Dataset[1:400, -c(1,2,3,4,6,7,8,9)], graph = FALSE), col.var ="cos2", gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"), repel = TRUE)

Contribuciones

fviz_contrib(MCA(Dataset[1:400, -c(1,2,3,4,6,7,8,9)], graph = FALSE), choice = "var", axes = 1, top = 15)

Biplot con Contribuciones

fviz_mca_var(MCA(Dataset[1:400, -c(1,2,3,4,6,7,8,9)], graph = FALSE), col.var ="contrib", gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"), repel = TRUE)

Fase 4 [Conglomerados]

4.1. Objetivos

-Agrupar los datos en categorías o grupos donde los elementos dentro de cada grupo sean similares entre sí, basándose en las variables analizadas.

-Usar estos grupos como base para predecir comportamientos o características futuras de nuevas observaciones.

-Analizar las características comunes o las diferencias significativas entre los grupos, con el fin de extraer conclusiones útiles o relevantes.

4.2. Agrupación Jerárquica

Esta fase está diseñada para organizar el conjunto de datos en una estructura jerárquica de grupos similares, el cual permite identificar patrones en los datos mediante la construcción de conglomerados basados en la medida de disimilaridad entre las observaciones, lo que facilita la clasificación en niveles jerárquicos progresivos. Lo cual se puede lograr con el uso de herramientas, algunas de estas son los dendogramas optimizados y la optimización de Mojena. Este enfoque permite profundizar en la estructura de los datos.

Para esta fase cada apartado desempeña un rol clave para garantizar una clasificación eficiente y precisa de los datos. El campo clasificador proporciona un marco que define las características y criterios relevantes que serán utilizados para medir similitudes o diferencias entre las observaciones, asegurando que los conglomerados formados sean consistentes con los objetivos del análisis. La disimilaridad, por su parte, actúa como una métrica cuantitativa que mide las diferencias entre los elementos del conjunto de datos, siendo crucial para determinar qué elementos deben agruparse. La optimización de Mojena interviene como una herramienta estadística para identificar el número óptimo de conglomerados mediante el análisis del dendograma, evitando tanto la subagrupación como la sobreagrupación de los datos. Finalmente, los dendogramas optimizados ofrecen una representación visual jerárquica que facilita la interpretación del proceso de agrupación, mostrando las relaciones entre los grupos y ayudando a validar la calidad de la clasificación. Juntos, estos componentes integran un enfoque robusto que permite obtener agrupaciones jerárquicas coherentes y de alta calidad.   conclusion

Al aplicar los distintos estudios al conjunto de datos, se puede extraer infromacion diversa de cada uno; el grafico de Disimilaridad muestra con base en una escala de colores las distancias entre las observaciones(disimilaridad) En este mismo puede observarse que el valor viethnam presenta una gran disimilaridad (colores muy rojizos) con el resto de valores presentes en este conjunto de datos, esto podría reflejar diferencias en cuanto a cómo se relacionan estos mismos valores con los diversos campos presentes en el conjunto de datos, contrario a esto, el valor ukraine presenta un poco disimilaridad con la gran parte de los otros valores presentes, lo cual indica que ukraine tiene mayor similitud en cuanto a como se relaciona este country con el resto de valores presentes. De forma general se puede extraer que se presentan mayor numero de no dimilaridad que de disimilaridad en el gráfico. Teniendo en cuenta que la optimización de Mojena muestra el número óptimo de conglomerados jerárquicos que deberían configurarse, donde la “unión simple” por medio del vecino más cercano muestra que el numero optimo de grupos es 2, la “unión completa” por medio del vecino más lejano y la “unión promedio” muestran un total de 3 grupos óptimos; situación que se complementa con los dendogramas optimizados en donde para el primer dendograma optimizado ”Enlace simple” no se muestran los diversos conglomerados de formas tan representativas ya que una de estas agrupaciones solo está contenida la variable vietnam y en la otra agrupación se representan los valores restantes. El segundo dendograma optimizado ”Enlace completo” por medio del vecino más lejano, representa la agrupación más significativa, ya que, aunque se presenta la misma situación de la variable vietham, en esta a diferencia del primer dendograma el resto de los datos están divididos en 2 grupos más., situación también presente en el tercer dendograma optimizado ”Enlace promedio” nada más que en este ultimo la agrupación de los valores restantes no abarca gran significancia para el estudio.

Campo Clasificador

cdd_UpvotedKernels_COUN_promedio  <- read_excel("D:/Curso GdD_2024_[G2]/cdd_UpvotedKernels_COUN_promedio.xlsx")


as.data.frame(cdd_UpvotedKernels_COUN_promedio)[1:24,-c(2,3,4)]
##          Country   Forks_S01
## 1      Argentina 0.020947872
## 2      Australia 0.007078956
## 3     Bangladesh 0.011191711
## 4        Belgium 0.028938767
## 5         Brazil 0.016498152
## 6         Canada 0.014399676
## 7          China 0.024386403
## 8        England 0.010002025
## 9         France 0.027816784
## 10       Germany 0.014037274
## 11         India 0.012768621
## 12        Israel 0.008408838
## 13       Lebanon 0.007471148
## 14   Netherlands 0.009298052
## 15        Norway 0.006089679
## 16        Poland 0.005900558
## 17      Portugal 0.009648481
## 18        Russia 0.023957499
## 19  South Africa 0.012996052
## 20         Spain 0.022054060
## 21        Taiwan 0.013430519
## 22       Ukraine 0.014382129
## 23 United States 0.015839366
## 24       Vietnam 0.097576143

Disimilaridad

data_ = as.data.frame(cdd_UpvotedKernels_COUN_promedio)[, -c(1)]
rownames(data_) = unclass(cdd_UpvotedKernels_COUN_promedio$Country)
fviz_dist(get_dist(data_, stand = T, method = "euclidean"), gradient = list(low = "#00AFBB", mid = "white", high = "#FC4E07"))

Conjunto Modificado

head(as.data.frame(cdd_UpvotedKernels_COUN_promedio))
##      Country  Votes_S01 Comments_S01  Views_S01   Forks_S01
## 1  Argentina 0.05817835   0.04535171 0.04713358 0.020947872
## 2  Australia 0.01845670   0.02579719 0.03268298 0.007078956
## 3 Bangladesh 0.02829987   0.03522036 0.02579520 0.011191711
## 4    Belgium 0.01927924   0.03017571 0.05752869 0.028938767
## 5     Brazil 0.02341142   0.04875501 0.02606815 0.016498152
## 6     Canada 0.01751073   0.03283422 0.03382403 0.014399676
str(as.data.frame(cdd_UpvotedKernels_COUN_promedio))
## 'data.frame':    24 obs. of  5 variables:
##  $ Country     : chr  "Argentina" "Australia" "Bangladesh" "Belgium" ...
##  $ Votes_S01   : num  0.0582 0.0185 0.0283 0.0193 0.0234 ...
##  $ Comments_S01: num  0.0454 0.0258 0.0352 0.0302 0.0488 ...
##  $ Views_S01   : num  0.0471 0.0327 0.0258 0.0575 0.0261 ...
##  $ Forks_S01   : num  0.02095 0.00708 0.01119 0.02894 0.0165 ...

Optimizacion de Mojena

Union Simple
hc_single = hclust(get_dist(data_, stand = T, method = "euclidean"), method = "single")

mojena = function(hc){
  n_hd = length(hc$height)
  alp_g = 0 ; alpha = hc$height[n_hd:1]
  for(i in 1:(n_hd-1)){
    alp_g[i] = mean(alpha[(n_hd-i+1):1])+1.25*sd(alpha[(n_hd-i+1):1])
  }
  nog = sum(alp_g<= alpha[-n_hd]) + 1
  plot(alpha[-n_hd], pch=20, col=(alp_g>alpha[-n_hd])+1, main = paste("Optimal number of groups =",nog),
       ylab = expression(alpha[g]), xlab="Nodes")}

mojena(hc_single)

Union Completa
hc_complete = hclust(get_dist(data_, stand = T, method = "euclidean"), method = "complete")

mojena = function(hc){
  n_hd = length(hc$height)
  alp_g = 0 ; alpha = hc$height[n_hd:1]
  for(i in 1:(n_hd-1)){
    alp_g[i] = mean(alpha[(n_hd-i+1):1])+1.25*sd(alpha[(n_hd-i+1):1])
  }
  nog = sum(alp_g<= alpha[-n_hd]) + 1
  plot(alpha[-n_hd], pch=20, col=(alp_g>alpha[-n_hd])+1, main = paste("Optimal number of groups =",nog),
       ylab = expression(alpha[g]), xlab="Nodes")}

mojena(hc_complete)

Union Promedio
hc_average = hclust(get_dist(data_, stand = T, method = "euclidean"), method = "average")

mojena = function(hc){
  n_hd = length(hc$height)
  alp_g = 0 ; alpha = hc$height[n_hd:1]
  for(i in 1:(n_hd-1)){
    alp_g[i] = mean(alpha[(n_hd-i+1):1])+1.25*sd(alpha[(n_hd-i+1):1])
  }
  nog = sum(alp_g<= alpha[-n_hd]) + 1
  plot(alpha[-n_hd], pch=20, col=(alp_g>alpha[-n_hd])+1, main = paste("Optimal number of groups =",nog),
       ylab = expression(alpha[g]), xlab="Nodes")}

mojena(hc_average)

Dendogramas Optimizados

Enlace Simple
suppressWarnings(fviz_dend(hc_single, k = 2, cex = 0.5, k_colors = "npg", color_labels_by_k = T, rect = T))

Enlace Completo
fviz_dend(hc_complete, k = 3, cex = 0.5, k_colors = "npg", color_labels_by_k = T, rect = T)

Enlace Promedio
fviz_dend(hc_average, k = 3, cex = 0.5, k_colors = "npg", color_labels_by_k = T, rect = T)

4.3. Agrupación No-Jerárquica

La agrupación no jerárquica es crucial para identificar patrones o estructuras subyacentes en un conjunto de datos. A diferencia de los métodos jerárquicos, que generan una jerarquía de grupos, los algoritmos de agrupación no jerárquica, como el K-means, buscan dividir los datos en un número fijo de clusters o conglomerados, definidos por su proximidad en un espacio multidimensional. Para determinar el número ideal de conglomerados (K), se utilizan diversas técnicas de validación, como los metodos Elbow, Silhouette, Gap Statistic, Majority Rule, cada una con sus ventajas para evaluar la calidad y estabilidad de los grupos formados. Una vez aplicado el algoritmo K-means, los resultados se visualizan mediante gráficos que permiten interpretar de manera efectiva la distribución de los puntos en cada conglomerado, proporcionando una base sólida para tomar decisiones basadas en los patrones de comportamiento o características comunes dentro del conjunto de datos.

Para realizar una conclusión adecuada sobre esta sección, es importante conocer brevemente cada uno de los métodos. El método Elbow es una técnica utilizada para determinar el número óptimo de conglomerados (K) en un análisis de agrupación. Este método calcula la variabilidad dentro de los clusters para diferentes valores de K y traza una gráfica de la suma de los errores cuadráticos (SSE) en función de K. El punto conocido como “codo” en la curva, donde la disminución de SSE se vuelve menos pronunciada, indica el número ideal de clusters. Por su parte, el método de Silhouette evalúa la calidad de los conglomerados, midiendo tanto la cohesión interna como la separación entre los grupos. Un valor cercano a +1 indica que las observaciones están bien agrupadas, mientras que valores cercanos a -1 sugieren que los puntos están mal asignados. La Gap Statistic compara la variabilidad observada de los conglomerados con la que se esperaría bajo un modelo aleatorio, proporcionando una medida robusta para seleccionar el número adecuado de clusters, siendo particularmente útil cuando la distribución de los datos no es uniforme. Finalmente, Majority Rule se utiliza para consolidar los resultados obtenidos por diferentes algoritmos de clustering. Este enfoque es útil cuando se emplean varias técnicas de agrupación y se busca llegar a un consenso sobre el número y la calidad de los conglomerados, ya que asigna a cada punto el conglomerado más frecuente entre los métodos aplicados. Una vez determinado el número óptimo de clusters, el K-means se encarga de asignar cada observación a su conglomerado correspondiente. Los gráficos resultantes del K-means permiten visualizar cómo se distribuyen los puntos en el espacio multidimensional, facilitando la interpretación de los resultados y proporcionando una representación visual de las relaciones y patrones presentes en los datos.

conclusion

En las 3 pestañas presentes K-óptimos, Resultados K-means y Gráficos K-means se pueden llegar a diversos análisis frente al estudio que se está realizando; en la primer pestaña K-óptimos junto a sus subpestañas se pueden determinar: EL numero optimo que minimiza la variación por medio del método Elbow donde arroja como resultado un 3, por otro lado el Silhouette nos muestra que las la calidad de la asignación de las observaciones a medida que aumenta el número de grupos disminuye, de este modo el numero optimo de agrupamientos es de 2, el método Gap Statistic nos da un numero optimo (teniendo en cuenta la estadística de brecha) de 1, finalmente, el método Majority Rule mediante el cálculo de 30 índices para determinar el número óptimo de conglomerados al variar todas las combinaciones de número de conglomerados, medidas de distancia y métodos de conglomerado, determinó que tal número es 3 (situación no muy visible en la gráfica como en los anteriores métodos, pero si presente en la conclusión generada por el mismo código del método en la “R console”); Gracias a este apartado en la primer pestaña, se sabe que los números de grupos más óptimos y pertinentes para realizar la siguiente pestaña Resultados k-means son de 2 y 3. En la segunda pestaña Resultados K-means se es necesario establecer una estructura para facilitar así la forma en la cual se refiere a cada resultado en los chunks, en donde se tomará 4 partes, donde cada una de estas sera 1.K-means clustering 2.Cluster means 3.Clustering vector 4.sum of squares by cluster.Para la parte 1 en el primer k-optimo (generado con un numero optimo de 2 agrupaciones), el algoritmo ha agrupado las observaciones en 2 cluster de tamaños 23 y 1 en donde la asignación desigual sugiere que el segundo cluster representa un “caso atípico” o “especial” en comparación con el resto de los datos; en la parte 2 El Cluster 2 tiene valores significativamente más altos en todas las variables (casi el doble o más) en comparación con el Cluster 1, lo cual indica que el único miembro del Cluster 2 presenta una actividad muy superior en términos de votos, comentarios, vistas y forks;parte 3 en esta se asigna los países a los cluster en donde se asigna únicamente Vietnam en el cluster 2; Para la parte 4 la suma de cuadrados dentro de los cluster es 0.0112 y 0.000(Este resultado es de esperar ya que este cluster contiene solo una observación, por lo que no hay variabilidad interna). Con esta misma secuencia para la parte 1 en el segundo k-optimo (generado con un numero optimo de 3 agrupaciones), el algoritmo ha agrupado las observaciones en 3 clusters de tamaños 1, 19 y 4 Esto sugiere y apoya la idea que hay un cluster (en este caso el primer cluster) contiene un caso único, mientras que los demás agrupan países con comportamientos similares; en la parte 2 el Cluster 1 contiene los valores más altos en todas las variables, lo que lo diferencia significativamente de los demás clusters, el Cluster 2 representa países con los valores más bajos en las variables, posiblemente reflejando menor actividad o participación y por último el Cluster 3 tiene valores intermedios entre los dos clusters anteriores, indicando un nivel moderado de actividad en las métricas analizadas. parte 3 en esta se asigna los países al clúster en donde la asignación de importancia es Vietnam ya que esta se asigna únicamente en el cluster 1 reafirmando que es un caso atípico con un comportamiento destacado en las variables; Para la parte 4 la suma de cuadrados dentro de los cluster es 0.0000(sin variabilidad interna por solo contener a viethnam), 0.0043 (muestra algo de dispersión, pero sigue siendo compacto)y finalmente 0.0009 (la baja suma de cuadrados se puede interpretar como que las observaciones están más concentradas en el espacio de las variables).

Finalmente, en la pestaña Gráficos K-means, se apoya lo mencionado anteriormente, ya que en ambas gráficas se representa que Vietnam es el único país en este cluster, lo cual coincide con el resultado del análisis, donde el cluster que representa a vietnam tenía un tamaño de 1. Esto sugiere que Vietnam es un caso atípico en las dimensiones analizadas (Votes, Comments, Views, Forks), con valores significativamente diferentes al resto. En la gráfica, Vietnam está aislado en el extremo izquierdo de Dim1, reflejando su singularidad.

K-optimos

Elbow
fviz_nbclust(data_, kmeans, method = "wss") + geom_vline(xintercept = 3, linetype = 2)

Silhouette
fviz_nbclust(data_, kmeans, method = "silhouette")

Gap Statistic
fviz_nbclust(data_, kmeans, method = "gap_stat")

Majority Rule
suppressWarnings(NbClust(data = data_, diss = NULL, distance = "euclidean", min.nc = 2, max.nc = 10, method = "kmeans")$Best.nc)

## *** : The Hubert index is a graphical method of determining the number of clusters.
##                 In the plot of Hubert index, we seek a significant knee that corresponds to a 
##                 significant increase of the value of the measure i.e the significant peak in Hubert
##                 index second differences plot. 
## 

## *** : The D index is a graphical method of determining the number of clusters. 
##                 In the plot of D index, we seek a significant knee (the significant peak in Dindex
##                 second differences plot) that corresponds to a significant increase of the value of
##                 the measure. 
##  
## ******************************************************************* 
## * Among all indices:                                                
## * 7 proposed 2 as the best number of clusters 
## * 11 proposed 3 as the best number of clusters 
## * 3 proposed 5 as the best number of clusters 
## * 1 proposed 8 as the best number of clusters 
## * 2 proposed 10 as the best number of clusters 
## 
##                    ***** Conclusion *****                            
##  
## * According to the majority rule, the best number of clusters is  3 
##  
##  
## *******************************************************************
##                     KL      CH Hartigan    CCC   Scott Marriot TrCovW TraceW
## Number_clusters 5.0000  3.0000   3.0000 3.0000  3.0000       3      3 3.0000
## Value_Index     7.7838 40.8058  20.3169 6.3096 52.2383       0      0 0.0051
##                 Friedman   Rubin Cindex     DB Silhouette   Duda PseudoT2
## Number_clusters    8.000  5.0000  1e+01 3.0000     2.0000 2.0000   2.0000
## Value_Index      180.617 -9.8313  6e-03 0.5219     0.6232 0.8373   4.0812
##                  Beale Ratkowsky  Ball PtBiserial   Frey McClain  Dunn Hubert
## Number_clusters 2.0000    2.0000 3.000     2.0000  5.000  2.0000 3.000      0
## Value_Index     0.4457    0.5231 0.004     0.7481 33.635  0.0878 0.426      0
##                  SDindex Dindex    SDbw
## Number_clusters   3.0000      0 10.0000
## Value_Index     101.6843      0  0.0479

Resultados K-means

K-óptimo [El]
set.seed(780728)
print(kmeans(data_, 2, nstart = 25))
## K-means clustering with 2 clusters of sizes 23, 1
## 
## Cluster means:
##    Votes_S01 Comments_S01  Views_S01  Forks_S01
## 1 0.03255877   0.04041055 0.03687265 0.01467577
## 2 0.06771578   0.08346066 0.10660540 0.09757614
## 
## Clustering vector:
##     Argentina     Australia    Bangladesh       Belgium        Brazil 
##             1             1             1             1             1 
##        Canada         China       England        France       Germany 
##             1             1             1             1             1 
##         India        Israel       Lebanon   Netherlands        Norway 
##             1             1             1             1             1 
##        Poland      Portugal        Russia  South Africa         Spain 
##             1             1             1             1             1 
##        Taiwan       Ukraine United States       Vietnam 
##             1             1             1             2 
## 
## Within cluster sum of squares by cluster:
## [1] 0.01120638 0.00000000
##  (between_SS / total_SS =  55.9 %)
## 
## Available components:
## 
## [1] "cluster"      "centers"      "totss"        "withinss"     "tot.withinss"
## [6] "betweenss"    "size"         "iter"         "ifault"
K-óptimo [Sil]
set.seed(780728)
print(kmeans(data_, 3, nstart = 25))
## K-means clustering with 3 clusters of sizes 1, 19, 4
## 
## Cluster means:
##    Votes_S01 Comments_S01  Views_S01  Forks_S01
## 1 0.06771578   0.08346066 0.10660540 0.09757614
## 2 0.02721395   0.03789107 0.03287651 0.01265442
## 3 0.05794663   0.05237807 0.05585434 0.02427714
## 
## Clustering vector:
##     Argentina     Australia    Bangladesh       Belgium        Brazil 
##             3             2             2             2             2 
##        Canada         China       England        France       Germany 
##             2             3             2             3             2 
##         India        Israel       Lebanon   Netherlands        Norway 
##             2             2             2             2             2 
##        Poland      Portugal        Russia  South Africa         Spain 
##             2             2             3             2             2 
##        Taiwan       Ukraine United States       Vietnam 
##             2             2             2             1 
## 
## Within cluster sum of squares by cluster:
## [1] 0.0000000000 0.0043053069 0.0008956218
##  (between_SS / total_SS =  79.5 %)
## 
## Available components:
## 
## [1] "cluster"      "centers"      "totss"        "withinss"     "tot.withinss"
## [6] "betweenss"    "size"         "iter"         "ifault"

Gráficos K-means

K-óptimo [El]
fviz_cluster(kmeans(data_, 2, nstart = 25), data = data_, palette = c("#2E9FDF", "#00AFBB", "#E7B800", "#E7B801"), ellipse.type = "euclid", star.plot = TRUE, repel = TRUE, ggtheme = theme_minimal()
)
## Too few points to calculate an ellipse

K-óptimo [Sil]
fviz_cluster(kmeans(data_, 3, nstart = 25), data = data_, palette = c("#2E9FDF", "#00AFBB", "#E7B800", "#E7B801"), ellipse.type = "euclid", star.plot = TRUE, repel = TRUE, ggtheme = theme_minimal()
)
## Too few points to calculate an ellipse

Fase 5 [Análisis de Regresión]

5.1. Objetivos

-Identificar las variables más influyentes en el comportamiento de la variable dependiente, para poder tomar decisiones más informadas.

-Usar métodos de análisis para entender cómo se relacionan las variables entre sí, con el objetivo de hacer predicciones, ver qué tan importantes son algunas variables en el resultado de otras, y comprobar si el modelo que hemos creado es bueno o no.

-Realizar predicciones precisas sobre el comportamiento de una variable dependiente, utilizando las relaciones descubiertas entre variables independientes.

5.2. Regresión Lineal Simple

El análisis que se llevará a cabo en este estudio tiene como objetivo explorar la relación entre las variables cuantitativas y la variable cualitativa clasificadora, utilizando un enfoque estadístico detallado. Se emplearán diversas técnicas para analizar el comportamiento de las variables y su interacción, incluyendo el resumen de las votaciones (“Votes”) y visualizaciones a través de gráficos como el diagrama de dispersión entre votos y vistas (“Views”). Además, se calcularán los coeficientes del modelo de regresión lineal simple (RLS), se presentarán resúmenes estadísticos del mismo, y se realizará una tabla ANOVA para evaluar la significancia de los factores involucrados. El análisis también incluirá la estimación de intervalos de confianza para los coeficientes del modelo, así como las predicciones realizadas y sus correspondientes intervalos de predicción y de confianza. Este enfoque permitirá entender mejor las relaciones entre las variables y proporcionar un marco robusto para la toma de decisiones basada en los datos.

En el desarrollo del análisis, se utilizarán las variables cuantitativas y cualitativas clasificadoras para comprender la relación y el comportamiento de las mismas a través de diversos métodos estadísticos. Se iniciará con un resumen descriptivo de las variables “Votes” y “Views”, lo que permitirá obtener una visión general de su distribución y características clave. Posteriormente, se analizará la relación entre estas dos variables mediante un diagrama de dispersión, lo cual ayudará a visualizar su posible correlación. A continuación, se abordará un análisis más profundo mediante la construcción del modelo de regresión lineal simple (RLS), en el cual se examinarán los coeficientes estimados del modelo, y se incluirá un resumen estadístico detallado de sus resultados. La significancia de los factores involucrados en el modelo será evaluada a través de una tabla ANOVA, lo que permitirá verificar si las variables explicativas tienen un efecto relevante sobre la variable dependiente. También se calcularán intervalos de confianza para el coeficiente B1, lo que proporcionará una estimación precisa de su rango de valores posibles. Finalmente, se realizarán predicciones basadas en el modelo ajustado, con sus respectivos intervalos de predicción e intervalos de confianza, con el objetivo de ofrecer una visión robusta sobre el comportamiento futuro de las variables estudiadas. Este enfoque integral garantizará un análisis exhaustivo y detallado de los datos.

Conclusion

Regresión Lineal Simple tiene como objetivo analizar la relación entre dos variables clave en el conjunto de datos: Votes y Views. Este análisis comienza con un resumen estadístico de las variables bajo estudio, que incluye una revisión de las características básicas de cada variable como (media, mediana, mínimo, máximo, entre otros) a través de la función summary(). Esta herramienta proporciona una visión preliminar de la distribución de Votes y Views, permitiendo identificar posibles tendencias o anomalías en los datos. Además, se presenta un diagrama de dispersión entre ambas variables, que visualiza la relación potencial entre Votes y Views, ayudando a evaluar si es adecuada la aplicación de un modelo de regresión lineal simple. Una vez analizadas las variables, se procede a la formulación del modelo de regresión lineal simple (RLS) entre Votes y Views. Para ello, se usa la función lm(), la cual ajusta un modelo de regresión lineal, representando a Votes en función de Views. Los coeficientes del modelo obtenidos mediante coef() nos indican la pendiente y la intersección de la recta ajustada, lo que define la relación entre las dos variables. A continuación, se utiliza summary() para obtener un resumen estadístico del modelo, que proporciona información crucial sobre la calidad del ajuste y la significancia de las variables involucradas. También se emplea el análisis de varianza (ANOVA) con la función anova() para verificar la validez del modelo, observando si la variabilidad explicada por el modelo es significativa frente a la variabilidad no explicada.En esta etapa, es importante destacar el uso de la función suppressWarnings() en ciertos códigos. Este comando se utiliza para suprimir advertencias que podrían surgir durante el cálculo de predicciones o intervalos. Esto se hace para evitar que mensajes innecesarios interrumpan la visualización de los resultados, especialmente cuando no son relevantes para el análisis que se está realizando. Finalmente, se lleva a cabo un análisis más detallado del modelo RLS, que incluye la estimación del intervalo de confianza para el coeficiente de pendiente (B1), utilizando la función confint(). Este intervalo nos da una idea de la precisión con la que se estima la pendiente del modelo. Luego, se realizan predicciones utilizando la función predict(), tanto con intervalos de predicción como intervalos de confianza. Los intervalos de predicción nos permiten estimar el rango dentro del cual se espera que caigan futuras observaciones, mientras que los intervalos de confianza proporcionan un rango en el que es probable que se encuentre la verdadera media de las respuestas. En resumen, este capítulo proporciona una visión integral del análisis de regresión lineal simple, desde el resumen inicial de las variables hasta la evaluación final del modelo y sus predicciones. Los métodos y funciones de R empleados a lo largo del análisis permiten realizar un estudio exhaustivo y preciso de la relación entre Votes y Views, proporcionando herramientas valiosas para la toma de decisiones informadas basadas en los datos.

Resumen Estadistico de las Variables por Estudiar

Resumen de Votes

summary(Dataset_Muestreado3$Votes)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    33.0    40.5    57.0   127.6    92.5  2130.0
boxplot(Dataset_Muestreado3$Votes, main = "Diagrama de Caja de Votes", col = c("brown4"))

Resumen de Views

summary(Dataset_Muestreado3$Views)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    1295    3995    7145   16947   12562  345590
boxplot(Dataset_Muestreado3$Views, main = "Diagrama de Caja de Views", col = c("brown4"))

Diagrama de Dispersion Vot v.s Views

plot(Dataset_Muestreado3$Votes, Dataset_Muestreado3$Views, main = "Diagrama de Dispersión Vot v.s Views")

Diagramas Total de Dispersion

pairs(~Comments + Views + Votes + Forks, data = Dataset_Muestreado3)

Formulación del modelo de RLS entre las variables de estudio

Coeficientes del Modelo RLS

modelo_RL_Simple = lm(Dataset$Votes~Dataset$Views)
coef(modelo_RL_Simple)
##   (Intercept) Dataset$Views 
##  30.993802950   0.005539943

Resumen Estadístico del Modelo RLS

summary(modelo_RL_Simple)
## 
## Call:
## lm(formula = Dataset$Votes ~ Dataset$Views)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -479.19  -25.99   -8.01   13.50  668.87 
## 
## Coefficients:
##                Estimate Std. Error t value Pr(>|t|)    
## (Intercept)   3.099e+01  3.263e+00   9.498   <2e-16 ***
## Dataset$Views 5.540e-03  1.358e-04  40.780   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 86.6 on 955 degrees of freedom
## Multiple R-squared:  0.6352, Adjusted R-squared:  0.6348 
## F-statistic:  1663 on 1 and 955 DF,  p-value: < 2.2e-16

Tabla ANOVA para el Modelo RLS

anova(modelo_RL_Simple)
## Analysis of Variance Table
## 
## Response: Dataset$Votes
##                Df   Sum Sq  Mean Sq F value    Pr(>F)    
## Dataset$Views   1 12470952 12470952    1663 < 2.2e-16 ***
## Residuals     955  7161490     7499                      
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Análisis del modelo RLS

Intervalo de Confianza para B1

confint(modelo_RL_Simple, level = 0.95)
##                      2.5 %       97.5 %
## (Intercept)   24.589695831 37.397910069
## Dataset$Views  0.005273346  0.005806539

Predicciones y sus Intervalos de Predicción

suppressWarnings(predict(modelo_RL_Simple, data.frame(seq(1,400)), interval='prediction', level = 0.95))
##            fit          lwr       upr
## 1     44.74394 -125.3064383  214.7943
## 2     34.21805 -135.8409177  204.2770
## 3     57.53013 -112.5118473  227.5721
## 4     38.04061 -132.0150639  208.0963
## 5     44.45032 -125.6002744  214.5009
## 6     37.10436 -132.9521025  207.1608
## 7     46.13447 -123.9148910  216.1838
## 8     41.41444 -128.6384974  211.4674
## 9     43.44759 -126.6037612  213.4989
## 10    38.47827 -131.5770441  208.5336
## 11    49.02632 -121.0210003  219.0736
## 12    42.73848 -127.3134176  212.7904
## 13    57.90131 -112.1404604  227.9431
## 14    64.15590 -105.8825969  234.1944
## 15    46.86574 -123.1830918  216.9146
## 16    39.23170 -130.8229907  209.2864
## 17    36.81074 -133.2459691  206.8675
## 18    37.50878 -132.5473447  207.5649
## 19    42.56674 -127.4852885  212.6188
## 20    78.68163  -91.3513324  248.7146
## 21    59.59653 -110.4442995  229.6374
## 22    39.33696 -130.7176457  209.3916
## 23    76.23298  -93.8007187  246.2667
## 24    43.19276 -126.8587932  213.2443
## 25    51.59131 -118.4542921  221.6369
## 26    81.59564  -88.4365582  251.6278
## 27    91.17420  -78.8562999  261.2047
## 28    35.25956 -134.7984915  205.3176
## 29    46.09015 -123.9592427  216.1395
## 30    86.71455  -83.3165886  256.7457
## 31    65.00905 -105.0290412  235.0471
## 32    51.83507 -118.2103763  221.8805
## 33    75.34104  -94.6929363  245.3750
## 34    44.47802 -125.5725540  214.5286
## 35    49.64125 -120.4056474  219.6881
## 36    45.16498 -124.8850905  215.2150
## 37    74.89785  -95.1362782  244.9320
## 38    45.22038 -124.8296502  215.2704
## 39    69.28035 -100.7558693  239.3166
## 40    48.86566 -121.1817690  218.9131
## 41    65.62953 -104.4082797  235.6673
## 42    45.78545 -124.2641613  215.8351
## 43    55.10363 -114.9397658  225.1470
## 44    48.32274 -121.7250590  218.3705
## 45    47.79091 -122.2572653  217.8391
## 46    54.48870 -115.5550729  224.5325
## 47    59.57437 -110.4664713  229.6152
## 48   129.17267  -40.8634105  299.2087
## 49    87.41812  -82.6128978  257.4491
## 50    85.04148  -84.9899594  255.0729
## 51    87.66742  -82.3635601  257.6984
## 52    67.33583 -102.7012125  237.3729
## 53    41.12082 -128.9323468  211.1740
## 54    40.81612 -129.2372861  210.8695
## 55    44.47802 -125.5725540  214.5286
## 56    41.40890 -128.6440417  211.4618
## 57    42.64430 -127.4076693  212.6963
## 58    41.94627 -128.1062449  211.9988
## 59    69.07537 -100.9609315  239.1117
## 60    37.83563 -132.2202134  207.8915
## 61    71.88966  -98.1455324  241.9249
## 62    47.46959 -122.5788085  217.5180
## 63    40.40063 -129.6531144  210.4544
## 64    77.17477  -92.8586374  247.2082
## 65    44.39492 -125.6557153  214.4456
## 66    40.53912 -129.5145047  210.5928
## 67    46.67738 -123.3715848  216.7263
## 68    56.75454 -113.2878856  226.7970
## 69    64.83731 -105.2008601  234.8755
## 70    64.40520 -105.6331803  234.4436
## 71    43.13182 -126.9197792  213.1834
## 72    52.87658 -117.1681999  222.9214
## 73    40.35077 -129.7030140  210.4045
## 74    81.00841  -89.0239369  251.0407
## 75    54.52748 -115.5162696  224.5712
## 76    74.94217  -95.0919439  244.9763
## 77    59.07577 -110.9653383  229.1169
## 78    58.26140 -111.7801615  228.3030
## 79    54.18954 -115.8544134  224.2335
## 80    51.53037 -118.5152712  221.5760
## 81   114.51952  -55.5120786  284.5511
## 82   159.37090  -10.6836385  329.4254
## 83    62.56040 -107.4788835  232.5997
## 84    43.60271 -126.4485248  213.6540
## 85    35.38144 -134.6765064  205.4394
## 86    35.79139 -134.2661944  205.8490
## 87    59.94554 -110.0950948  229.9862
## 88    37.89103 -132.1647675  207.9468
## 89    54.66044 -115.3832299  224.7041
## 90    51.36417 -118.6815780  221.4099
## 91    59.98986 -110.0507515  230.0305
## 92    51.53591 -118.5097276  221.5815
## 93    59.84028 -110.2004103  229.8810
## 94    56.98721 -113.0550732  227.0295
## 95    87.97211  -82.0588152  258.0030
## 96    46.48902 -123.5600783  216.5381
## 97    55.91247 -114.1304507  225.9554
## 98    67.28043 -102.7566361  237.3175
## 99    45.76883 -124.2807933  215.8185
## 100   45.97935 -124.0701220  216.0288
## 101   55.23659 -114.8067271  225.2799
## 102   51.75751 -118.2879858  221.8030
## 103   81.72306  -88.3091088  251.7552
## 104   61.14217 -108.8978340  231.1822
## 105   96.93020  -73.0998805  266.9603
## 106   45.30902 -124.7409458  215.3590
## 107   47.12612 -122.9225286  217.1748
## 108   52.27826 -117.7668952  222.3234
## 109   41.18176 -128.8713591  211.2349
## 110   51.35863 -118.6871215  221.4044
## 111   41.66373 -128.3890036  211.7165
## 112   58.00656 -112.0351421  228.0483
## 113   40.65546 -129.3980727  210.7090
## 114   56.52740 -113.5151555  226.5700
## 115   83.77838  -86.2533241  253.8101
## 116   56.06758 -113.9752406  226.1104
## 117   96.86926  -73.1608220  266.8993
## 118   91.85561  -78.1748138  261.8860
## 119  138.05320  -31.9870208  308.0934
## 120   62.98697 -107.0520952  233.0260
## 121   48.93214 -121.1152439  218.9795
## 122   46.76602 -123.2828821  216.8149
## 123   81.67320  -88.3589803  251.7054
## 124   62.18368 -107.8557896  232.2232
## 125   36.20689 -133.8503400  206.2641
## 126   56.05096 -113.9918703  226.0938
## 127   50.79910 -119.2470239  220.8452
## 128   79.29656  -90.7362278  249.3294
## 129   48.15101 -121.8969168  218.1989
## 130   56.38890 -113.6537350  226.4315
## 131   52.76024 -117.2846125  222.8051
## 132   55.14795 -114.8954195  225.1913
## 133   49.87947 -120.1672688  219.9262
## 134   79.21900  -90.8138083  249.2518
## 135   92.69769  -77.3326609  262.7280
## 136   45.57493 -124.4748332  215.6247
## 137   70.05040  -99.9855055  240.0863
## 138   59.94554 -110.0950948  229.9862
## 139   58.43314 -111.6083273  228.4746
## 140   38.82728 -131.2277390  208.8823
## 141   35.99083 -134.0665840  206.0482
## 142   43.29802 -126.7534538  213.3495
## 143   44.52788 -125.5226572  214.5784
## 144   89.30170  -80.7290341  259.3324
## 145   49.28669 -120.7604448  219.3338
## 146   44.60544 -125.4450401  214.6559
## 147   42.43932 -127.6128059  212.4915
## 148   47.46405 -122.5843524  217.5125
## 149   56.97059 -113.0717027  227.0129
## 150   52.42784 -117.6172209  222.4729
## 151   48.63852 -121.4090633  218.6861
## 152   74.32170  -95.7126268  244.3560
## 153   46.93222 -123.1165649  216.9810
## 154   52.28380 -117.7613517  222.3290
## 155   99.42872  -70.6013250  269.4588
## 156   41.95735 -128.0951563  212.0099
## 157   49.80745 -120.2393367  219.8542
## 158   51.13149 -118.9144081  221.1774
## 159   90.29889  -79.7317141  260.3295
## 160   46.96546 -123.0833015  217.0142
## 161   54.80448 -115.2391037  224.8481
## 162   83.90026  -86.1314195  253.9319
## 163  167.25978   -2.8016268  337.3212
## 164   48.46678 -121.5809204  218.5145
## 165  106.45336  -63.5770168  276.4837
## 166  103.73879  -66.2913780  273.7690
## 167   64.45506 -105.5832971  234.4934
## 168   98.84702  -71.1830210  268.8771
## 169   39.54747 -130.5069560  209.6019
## 170   43.20938 -126.8421606  213.2609
## 171   85.68966  -84.3416622  255.7210
## 172   62.27232 -107.7671056  232.3117
## 173   44.63314 -125.4173197  214.6836
## 174   41.44214 -128.6107758  211.4950
## 175   53.19789 -116.8466804  223.2425
## 176   62.57702 -107.4622553  232.6163
## 177   46.60536 -123.4436558  216.6544
## 178   52.58850 -117.4564600  222.6335
## 179   42.88806 -127.1637239  212.9398
## 180   57.95670 -112.0850297  227.9984
## 181   43.24262 -126.8088955  213.2941
## 182   58.51070 -111.5307249  228.5521
## 183  107.88267  -62.1478629  277.9132
## 184   54.27818 -115.7657198  224.3221
## 185  133.35533  -36.6825692  303.3932
## 186  116.53052  -53.5015212  286.5626
## 187   64.89271 -105.1454346  234.9309
## 188   47.55269 -122.4956506  217.6010
## 189  106.24285  -63.7875147  276.2732
## 190  132.97861  -37.0591120  303.0163
## 191   37.84117 -132.2146688  207.8970
## 192   43.27032 -126.7811746  213.3218
## 193   38.16803 -131.8875389  208.2236
## 194   53.00400 -117.0407006  223.0487
## 195   43.12074 -126.9308676  213.1723
## 196   61.36931 -108.6705784  231.4092
## 197   49.59693 -120.4499970  219.6439
## 198   60.84855 -109.1916045  230.8887
## 199   47.53607 -122.5122822  217.5844
## 200   45.42535 -124.6245214  215.4752
## 201   49.75759 -120.2892298  219.8044
## 202   58.77108 -111.2702031  228.8124
## 203   72.04478  -97.9903561  242.0799
## 204   49.76313 -120.2836862  219.8099
## 205   56.58834 -113.4541806  226.6309
## 206   49.22021 -120.8269695  219.2674
## 207   51.84615 -118.1992893  221.8916
## 208  105.74425  -64.2860647  275.7746
## 209   87.44582  -82.5851935  257.4768
## 210   61.55767 -108.4821230  231.5975
## 211   43.08750 -126.9641327  213.1391
## 212   50.08445 -119.9621530  220.1310
## 213   59.46911 -110.5717874  229.5100
## 214   35.97975 -134.0776734  206.0372
## 215   43.45867 -126.5926729  213.5100
## 216   62.33880 -107.7005927  232.3782
## 217   62.56040 -107.4788835  232.5997
## 218   47.77429 -122.2738968  217.8225
## 219   37.86333 -132.1924904  207.9192
## 220   46.31174 -123.7374844  216.3610
## 221   45.63587 -124.4138491  215.6856
## 222   44.80488 -125.2454536  214.8552
## 223   53.54691 -116.4974452  223.5913
## 224   44.27305 -125.7776854  214.3238
## 225   79.71760  -90.3150781  249.7503
## 226   36.81074 -133.2459691  206.8675
## 227   44.68300 -125.3674231  214.7334
## 228   40.58344 -129.4701496  210.6370
## 229   72.67079  -97.3641120  242.7057
## 230   60.11728 -109.9232645  230.1578
## 231  100.74168  -69.2883709  270.7717
## 232   58.87633 -111.1648860  228.9176
## 233   55.20335 -114.8399867  225.2467
## 234   48.13993 -121.9080045  218.1879
## 235   53.91255 -116.1315816  223.9567
## 236   67.38015 -102.6568736  237.4172
## 237   48.73824 -121.3092755  218.7858
## 238   56.90412 -113.1382204  226.9465
## 239  143.93108  -26.1124714  313.9746
## 240  358.37118  187.8850192  528.8573
## 241   68.70973 -101.3267197  238.7462
## 242   44.53896 -125.5115691  214.5895
## 243   49.63017 -120.4167348  219.6771
## 244   72.99211  -97.0426791  243.0269
## 245   66.16690 -103.8706601  236.2045
## 246  102.47568  -67.5544211  272.5058
## 247   73.42422  -96.6104095  243.4589
## 248  222.82540   52.6916423  392.9592
## 249   48.28396 -121.7638656  218.3318
## 250   65.97854 -104.0591036  236.0162
## 251   66.61563 -103.4217230  236.6530
## 252  117.46677  -52.5654953  287.4990
## 253   56.41106 -113.6315623  226.4537
## 254  115.73831  -54.2935524  285.7702
## 255   44.33399 -125.7167004  214.3847
## 256   38.07939 -131.9762519  208.1350
## 257   66.13366 -103.9039148  236.1712
## 258   55.06485 -114.9785688  225.1083
## 259   48.08453 -121.9634426  218.1325
## 260   54.00673 -116.0373443  224.0508
## 261  104.81354  -65.2167005  274.8438
## 262   55.22551 -114.8178136  225.2688
## 263   59.41925 -110.6216740  229.4602
## 264   51.19797 -118.8478852  221.2438
## 265  107.70539  -62.3251208  277.7359
## 266   54.89866 -115.1448676  224.9422
## 267   61.95654 -108.0830427  231.9961
## 268   69.00335 -101.0329806  239.0397
## 269  109.15686  -60.8738344  279.1875
## 270   53.49705 -116.5473358  223.5414
## 271   38.84944 -131.2055610  208.9044
## 272   75.08067  -94.9533994  245.1147
## 273   38.27329 -131.7821923  208.3288
## 274   50.08445 -119.9621530  220.1310
## 275   50.90990 -119.1361518  220.9559
## 276   60.95935 -109.0807476  230.9995
## 277  130.29728  -39.7392669  300.3338
## 278   62.03964 -107.9999012  232.0792
## 279   89.46236  -80.5683539  259.4931
## 280   61.21419 -108.8257773  231.2542
## 281   87.88902  -82.1419273  257.9200
## 282   58.80986 -111.2314020  228.8511
## 283   54.02335 -116.0207142  224.0674
## 284   51.75197 -118.2935293  221.7975
## 285  135.99234  -34.0468234  306.0315
## 286   70.23322  -99.8026145  240.2690
## 287   47.18152 -122.8670898  217.2301
## 288   57.64647 -112.3954422  227.6884
## 289   58.12290 -111.9187378  228.1645
## 290   40.43387 -129.6198481  210.4876
## 291   75.33550  -94.6984780  245.3695
## 292   64.23346 -105.8050005  234.2719
## 293   44.62760 -125.4228638  214.6781
## 294   69.72908 -100.3069513  239.7651
## 295  104.49776  -65.5324547  274.5280
## 296   58.67136 -111.3699773  228.7127
## 297   71.11407  -98.9214191  241.1496
## 298   88.58705  -81.4437885  258.6179
## 299  195.29743   25.2047635  365.3901
## 300   48.38368 -121.6640772  218.4314
## 301   52.67714 -117.3677645  222.7220
## 302   43.23708 -126.8144397  213.2886
## 303  144.00310  -26.0404958  314.0467
## 304   43.00440 -127.0472956  213.0561
## 305   50.88220 -119.1638698  220.9283
## 306   44.57220 -125.4783046  214.6227
## 307   44.95446 -125.0957641  215.0047
## 308   48.92106 -121.1263314  218.9684
## 309   63.34153 -106.6973639  233.3804
## 310   55.66871 -114.3743529  225.7118
## 311  124.77395  -45.2604729  294.8084
## 312   96.04381  -73.9863065  266.0739
## 313   64.87055 -105.1676048  234.9087
## 314   50.54426 -119.5020304  220.5906
## 315   72.39934  -97.6356685  242.4343
## 316   64.93703 -105.1010943  234.9752
## 317  172.65014    2.5835584  342.7167
## 318   65.97300 -104.0646461  236.0106
## 319   75.09729  -94.9367740  245.1313
## 320   60.94827 -109.0918333  230.9884
## 321  110.00447  -60.0263408  280.0353
## 322   48.75486 -121.2926442  218.8024
## 323   63.98970 -106.0488752  234.0283
## 324   66.87601 -103.1612299  236.9133
## 325   79.52370  -90.5090284  249.5564
## 326   56.31134 -113.7313397  226.3540
## 327   43.40881 -126.6425704  213.4602
## 328   40.88814 -129.1652094  210.9415
## 329   80.01676  -90.0158417  250.0494
## 330  123.78784  -46.2462485  293.8219
## 331   89.17428  -80.8564704  259.2050
## 332   43.96281 -126.0881558  214.0138
## 333  103.85513  -66.1750462  273.8853
## 334   83.22992  -86.8018971  253.2617
## 335   71.74562  -98.2896250  241.7809
## 336   51.46943 -118.5762503  221.5151
## 337   50.27280 -119.7736687  220.3193
## 338   76.88115  -93.1523438  246.9146
## 339  209.68466   39.5718016  379.7975
## 340   53.34193 -116.7025514  223.3864
## 341   48.20641 -121.8414788  218.2543
## 342   41.23716 -128.8159158  211.2902
## 343   54.65490 -115.3887732  224.6986
## 344   95.34024  -74.6899147  265.3704
## 345   72.34394  -97.6910884  242.3790
## 346   68.56015 -101.4763608  238.5967
## 347   98.34843  -71.6816213  268.3785
## 348   58.30572 -111.7358172  228.3473
## 349   65.04783 -104.9902435  235.0859
## 350  165.73629   -4.3237189  335.7963
## 351   79.53478  -90.4979455  249.5675
## 352   48.16209 -121.8858292  218.2100
## 353   45.66357 -124.3861292  215.7133
## 354   44.12347 -125.9273763  214.1743
## 355   35.12106 -134.9371111  205.1792
## 356   43.85755 -126.1934942  213.9086
## 357   77.79524  -92.2379786  247.8285
## 358   43.03210 -127.0195746  213.0838
## 359   44.97108 -125.0791320  215.0213
## 360   47.86293 -122.1851955  217.9111
## 361   46.43916 -123.6099737  216.4883
## 362   70.00608 -100.0298427  240.0420
## 363   81.28540  -88.7468709  251.3177
## 364  109.91029  -60.1205062  279.9411
## 365   68.72081 -101.3156351  238.7573
## 366   66.28324 -103.7542687  236.3207
## 367  119.86556  -50.1673297  289.8985
## 368  125.99828  -44.0365790  296.0331
## 369   53.55245 -116.4919018  223.5968
## 370   60.59372 -109.4465761  230.6340
## 371   50.35590 -119.6905140  220.4023
## 372   54.28926 -115.7546331  224.3332
## 373   51.94587 -118.0995058  221.9912
## 374   48.15655 -121.8913730  218.2045
## 375   46.47240 -123.5767101  216.5215
## 376   85.01932  -85.0121235  255.0508
## 377  111.18447  -58.8465129  281.2155
## 378   72.83145  -97.2033954  242.8663
## 379   92.07167  -77.9587342  262.1021
## 380   45.58047 -124.4692892  215.6302
## 381   88.69785  -81.3329734  258.7287
## 382   61.55767 -108.4821230  231.5975
## 383   75.54602  -94.4878915  245.5799
## 384   93.24614  -76.7841586  263.2764
## 385   40.46711 -129.5865817  210.5208
## 386   66.49930 -103.5381139  236.5367
## 387   59.53559 -110.5052720  229.5764
## 388   87.39042  -82.6406020  257.4214
## 389  136.94521  -33.0944344  306.9849
## 390   57.03707 -113.0051850  227.0793
## 391   94.02173  -76.0085057  264.0520
## 392   77.06951  -92.9639282  247.1029
## 393  124.87367  -45.1607885  294.9081
## 394   79.20792  -90.8248912  249.2407
## 395   47.35325 -122.6952297  217.4017
## 396   42.63876 -127.4132135  212.6907
## 397   38.04615 -132.0095194  208.1018
## 398   53.15911 -116.8854844  223.2037
## 399  102.13775  -67.8923442  272.1678
## 400   44.17333 -125.8774793  214.2241
## 401  137.47150  -32.5684108  307.5114
## 402   52.79902 -117.2458083  222.8438
## 403   79.56802  -90.4646968  249.6007
## 404   50.05121 -119.9954150  220.0978
## 405   67.28597 -102.7510938  237.3230
## 406   79.25778  -90.7750181  249.2906
## 407   74.56545  -95.4687865  244.5997
## 408   41.15406 -128.8990808  211.2072
## 409   42.04045 -128.0119922  212.0929
## 410   76.47119  -93.5624264  246.5048
## 411   63.17533 -106.8636439  233.2143
## 412   48.07899 -121.9689864  218.1270
## 413   48.72162 -121.3259067  218.7691
## 414   44.28413 -125.7665972  214.3348
## 415   43.35342 -126.6980120  213.4048
## 416   46.67184 -123.3771287  216.7208
## 417   73.47962  -96.5549905  243.5142
## 418   70.27754  -99.7582774  240.3134
## 419   53.16465 -116.8799409  223.2092
## 420   55.17011 -114.8732464  225.2135
## 421   52.36136 -117.6837428  222.4065
## 422   85.97220  -84.0590729  256.0035
## 423   63.56313 -106.4756577  233.6019
## 424   67.76240 -102.2744519  237.7993
## 425   44.51680 -125.5337454  214.5674
## 426  111.53349  -58.4975534  281.5645
## 427   64.32210 -105.7163191  234.3605
## 428   48.02359 -122.0244246  218.0716
## 429   53.66879 -116.3754905  223.7131
## 430   72.94225  -97.0925565  242.9771
## 431   85.50130  -84.5300557  255.5327
## 432   58.63812 -111.4032354  228.6795
## 433   69.67368 -100.3623731  239.7097
## 434   56.08974 -113.9530678  226.1326
## 435  110.97396  -59.0569973  281.0049
## 436   50.49440 -119.5519231  220.5407
## 437   65.28605 -104.7519149  235.3240
## 438  111.62767  -58.4033900  281.6587
## 439   97.55068  -72.4793887  267.5807
## 440  174.34536    4.2770703  344.4137
## 441   51.34201 -118.7037522  221.3878
## 442   51.10380 -118.9421261  221.1497
## 443   54.86542 -115.1781274  224.9090
## 444   46.69400 -123.3549530  216.7430
## 445   46.61644 -123.4325679  216.6655
## 446   99.29022  -70.7398236  269.3203
## 447   79.01957  -91.0133013  249.0524
## 448   49.94041 -120.1062884  219.9871
## 449   65.36915 -104.6687772  235.4071
## 450   57.39717 -112.6448818  227.4392
## 451  169.00486   -1.0581782  339.0679
## 452   88.51503  -81.5158184  258.5459
## 453   47.21476 -122.8338265  217.2633
## 454   43.09304 -126.9585885  213.1447
## 455   71.66252  -98.3727555  241.6978
## 456   93.96079  -76.0694496  263.9910
## 457   53.20897 -116.8355935  223.2535
## 458   73.36883  -96.6658285  243.4035
## 459   62.55486 -107.4844262  232.5941
## 460  123.47761  -46.5563829  293.5116
## 461   69.60720 -100.4288793  239.6433
## 462   59.64085 -110.3999560  229.6817
## 463   99.52844  -70.5016061  269.5585
## 464   53.62447 -116.4198376  223.6688
## 465  209.61264   39.4998904  379.7254
## 466   51.90709 -118.1383105  221.9525
## 467   43.33680 -126.7146446  213.3882
## 468   48.88228 -121.1651377  218.9297
## 469   80.40455  -89.6279444  250.4370
## 470   57.41933 -112.6227094  227.4614
## 471   76.62077  -93.4128014  246.6543
## 472   58.79878 -111.2424880  228.8400
## 473   94.91920  -75.1109748  264.9494
## 474   84.72017  -85.3113396  254.7517
## 475   52.92090 -117.1238523  222.9656
## 476   46.03475 -124.0146823  216.0842
## 477   48.57204 -121.4755886  218.6197
## 478   85.39050  -84.6408756  255.4219
## 479   72.34948  -97.6855464  242.3845
## 480  116.98479  -53.0473533  287.0169
## 481   47.66349 -122.3847736  217.7118
## 482   55.05377 -114.9896554  225.0972
## 483   65.31375 -104.7242023  235.3517
## 484   73.57380  -96.4607782  243.6084
## 485   52.59958 -117.4453730  222.6445
## 486   55.85153 -114.1914262  225.8945
## 487  147.54866  -22.4971720  317.5945
## 488   54.51640 -115.5273563  224.5602
## 489  162.59514   -7.4620959  332.6524
## 490   49.64125 -120.4056474  219.6881
## 491   92.24895  -77.7814386  262.2793
## 492   42.14017 -127.9121955  212.1925
## 493   55.24767 -114.7956405  225.2910
## 494   38.28991 -131.7655586  208.3454
## 495   57.60215 -112.4397870  227.6441
## 496   47.99035 -122.0576875  218.0384
## 497  123.52747  -46.5065398  293.5615
## 498   48.01251 -122.0355122  218.0605
## 499  202.33869   32.2364997  372.4409
## 500   99.47304  -70.5570055  269.5031
## 501  156.24637  -13.8056807  326.2984
## 502  108.48652  -61.5440814  278.5171
## 503   90.24903  -79.7815798  260.2796
## 504   79.06389  -90.9689695  249.0967
## 505   45.15390 -124.8961786  215.2040
## 506   44.56666 -125.4838487  214.6172
## 507   80.39901  -89.6334857  250.4315
## 508   48.06791 -121.9800740  218.1159
## 509  101.87737  -68.1527122  271.9075
## 510   46.00151 -124.0479462  216.0510
## 511   82.84767  -87.1842383  252.8796
## 512   73.86188  -96.1726005  243.8964
## 513   73.66798  -96.3665662  243.7025
## 514  108.56962  -61.4609926  278.6002
## 515   88.13277  -81.8981320  258.1637
## 516   85.60656  -84.4247769  255.6379
## 517   46.88790 -123.1609161  216.9367
## 518   46.01813 -124.0313142  216.0676
## 519   57.84037 -112.2014343  227.8822
## 520   99.31792  -70.7121239  269.3480
## 521   53.71865 -116.3255999  223.7629
## 522   56.02326 -114.0195863  226.0661
## 523   74.90893  -95.1251947  244.9431
## 524   84.72017  -85.3113396  254.7517
## 525   65.91760 -104.1200708  235.9553
## 526  189.85166   19.7659085  359.9374
## 527   44.17887 -125.8719352  214.2297
## 528  152.87254  -17.1769713  322.9221
## 529   83.18560  -86.8462264  253.2174
## 530   65.10877 -104.9292756  235.1468
## 531   86.54281  -83.4883567  256.5740
## 532   83.83378  -86.1979129  253.8655
## 533  128.91229  -41.1236827  298.9483
## 534   72.15004  -97.8850580  242.1851
## 535  287.99175  117.7196590  458.2638
## 536   48.41138 -121.6363583  218.4591
## 537   68.20006 -101.8366092  238.2367
## 538   55.31969 -114.7235780  225.3630
## 539   43.58609 -126.4651572  213.6373
## 540   57.94562 -112.0961159  227.9874
## 541  100.28187  -69.7481791  270.3119
## 542   81.57902  -88.4531821  251.6112
## 543  102.22085  -67.8092482  272.2509
## 544   46.41700 -123.6321495  216.4662
## 545   57.26975 -112.7723735  227.3119
## 546   73.63474  -96.3998175  243.6693
## 547   63.95092 -106.0876735  233.9895
## 548   55.76289 -114.2801179  225.8059
## 549   70.57669  -99.4590025  240.6124
## 550   82.19395  -87.8381018  252.2260
## 551   82.47649  -87.5554991  252.5085
## 552   66.03394 -104.0036790  236.0716
## 553  138.45761  -31.5828190  308.4980
## 554   63.57421 -106.4645724  233.6130
## 555   48.11777 -121.9301797  218.1657
## 556   45.17052 -124.8795465  215.2206
## 557  140.60157  -29.4400330  310.6432
## 558   94.85826  -75.1719179  264.8884
## 559   50.58304 -119.4632250  220.6293
## 560   88.97484  -81.0559364  259.0056
## 561   52.98184 -117.0628744  223.0265
## 562   72.03924  -97.9958981  242.0744
## 563   44.69962 -125.3507909  214.7500
## 564   43.12628 -126.9253234  213.1779
## 565  153.74785  -16.3023030  323.7980
## 566   61.36377 -108.6761212  231.4037
## 567  108.49760  -61.5330029  278.5282
## 568  346.22763  175.7831866  516.6721
## 569  118.22574  -51.8067139  288.2582
## 570   53.48043 -116.5639661  223.5248
## 571   90.45401  -79.5765767  260.4846
## 572   45.66911 -124.3805852  215.7188
## 573   72.33840  -97.6966303  242.3734
## 574   81.85048  -88.1816595  251.8826
## 575   74.14442  -95.8899657  244.1788
## 576   78.23289  -91.8001957  248.2660
## 577  103.69447  -66.3356949  273.7246
## 578   84.07199  -85.9596453  254.1036
## 579   78.07778  -91.9553590  248.1109
## 580   66.67657 -103.3607565  236.7139
## 581   72.98657  -97.0482210  243.0214
## 582   51.98465 -118.0607011  222.0300
## 583   72.34394  -97.6910884  242.3790
## 584   60.92611 -109.1140047  230.9662
## 585   52.88766 -117.1571130  222.9324
## 586   93.62840  -76.4018715  263.6587
## 587   48.35598 -121.6917962  218.4038
## 588   58.80986 -111.2314020  228.8511
## 589  128.39154  -41.6442298  298.4273
## 590  223.20766   53.0732551  393.3421
## 591   65.84558 -104.1921229  235.8833
## 592   81.76738  -88.2647786  251.7995
## 593   95.57292  -74.4572246  265.6031
## 594  291.92511  121.6428243  462.2074
## 595   65.35807 -104.6798622  235.3960
## 596   45.59155 -124.4582012  215.6413
## 597   63.50219 -106.5366268  233.5410
## 598   48.10669 -121.9412673  218.1546
## 599   85.51238  -84.5189737  255.5437
## 600  137.08925  -32.9504697  307.1290
## 601   82.27705  -87.7549833  252.3091
## 602   60.15606 -109.8844642  230.1966
## 603   50.40022 -119.6461649  220.4466
## 604  113.09575  -56.9355644  283.1271
## 605   51.53037 -118.5152712  221.5760
## 606   65.95638 -104.0812735  235.9940
## 607   87.04140  -82.9896763  257.0725
## 608  153.03874  -17.0108942  323.0884
## 609  106.64172  -63.3886771  276.6721
## 610   51.02624 -119.0197363  221.0722
## 611   52.07329 -117.9720049  222.1186
## 612  105.61129  -64.4190120  275.6416
## 613   46.54996 -123.4990951  216.5990
## 614   71.09191  -98.9435874  241.1274
## 615   90.04959  -79.9810428  260.0802
## 616  159.62573  -10.4290097  329.6805
## 617  143.65408  -26.3893010  313.6975
## 618   61.20311 -108.8368629  231.2431
## 619   56.65482 -113.3876625  226.6973
## 620   43.28694 -126.7645421  213.3384
## 621   53.85161 -116.1925587  223.8958
## 622  103.43963  -66.5905178  273.4698
## 623   80.25497  -89.7775616  250.2875
## 624   93.19074  -76.8395627  263.2210
## 625   99.62815  -70.4018874  269.6582
## 626   41.75237 -128.3002948  211.8050
## 627  105.93815  -64.0921838  275.9685
## 628   40.22335 -129.8305352  210.2772
## 629   57.94008 -112.1016589  227.9818
## 630   73.97822  -96.0562213  244.0127
## 631   60.49954 -109.5408050  230.5399
## 632   64.80407 -105.2341154  234.8423
## 633   87.19652  -82.8345320  257.2276
## 634   88.50949  -81.5213591  258.5403
## 635   88.04413  -81.9867848  258.0751
## 636  232.03833   61.8885118  402.1881
## 637  131.01193  -39.0249185  301.0488
## 638   46.17879 -123.8705393  216.2281
## 639   57.00383 -113.0384438  227.0461
## 640   57.54675 -112.4952180  227.5887
## 641   73.83972  -96.1947680  243.8742
## 642   61.64631 -108.3934383  231.6861
## 643   57.46919 -112.5728214  227.5112
## 644   53.47489 -116.5695095  223.5193
## 645   70.59885  -99.4368340  240.6345
## 646   88.34883  -81.6820415  258.3797
## 647   60.05634 -109.9842365  230.0969
## 648  111.65537  -58.3756949  281.6864
## 649   59.53559 -110.5052720  229.5764
## 650   56.21162 -113.8311173  226.2544
## 651   47.94603 -122.1020381  217.9941
## 652   85.27970  -84.7516956  255.3111
## 653  200.72657   30.6266181  370.8265
## 654   48.21749 -121.8303912  218.2654
## 655  104.03795  -65.9922394  274.0681
## 656   58.20600 -111.8355920  228.2476
## 657   94.10483  -75.9254006  264.1351
## 658  106.24839  -63.7819753  276.2787
## 659   72.06694  -97.9681881  242.1021
## 660  144.36873  -25.6750827  314.4125
## 661   55.38617 -114.6570588  225.4294
## 662   61.19203 -108.8479486  231.2320
## 663   61.18649 -108.8534914  231.2265
## 664   97.34016  -72.6899122  267.3702
## 665   89.77814  -80.2525351  259.8088
## 666   65.07553 -104.9625308  235.1136
## 667   87.22422  -82.8068276  257.2553
## 668   40.57236 -129.4812384  210.6260
## 669   89.35156  -80.6791678  259.3823
## 670  192.68811   22.5988111  362.7774
## 671  317.59720  147.2432343  487.9512
## 672   53.98457 -116.0595178  224.0286
## 673   95.99395  -74.0361683  266.0241
## 674  113.83811  -56.1933544  283.8696
## 675   78.28829  -91.7447803  248.3214
## 676   58.22262 -111.8189629  228.2642
## 677   70.07256  -99.9633368  240.1085
## 678   83.75068  -86.2810297  253.7824
## 679   50.89328 -119.1527826  220.9393
## 680  182.55002   12.4728939  352.6271
## 681   84.83097  -85.2005186  254.8625
## 682  108.32586  -61.7047200  278.3564
## 683   55.13133 -114.9120494  225.1747
## 684   53.05386 -116.9908096  223.0985
## 685   58.63258 -111.4087784  228.6739
## 686   60.98151 -109.0585762  231.0216
## 687   70.73181  -99.3038233  240.7674
## 688  130.28620  -39.7503421  300.3227
## 689   73.74554  -96.2889798  243.7801
## 690  166.43986   -3.6207852  336.5005
## 691   80.32145  -89.7110650  250.3540
## 692   65.61845 -104.4193647  235.6563
## 693  216.08883   45.9660814  386.2116
## 694  109.25103  -60.7796680  279.2817
## 695  191.79064   21.7024748  361.8788
## 696   61.73495 -108.3047537  231.7746
## 697  116.08178  -53.9501532  286.1137
## 698   77.01411  -93.0193445  247.0476
## 699   60.12282 -109.9177216  230.1634
## 700   74.60423  -95.4299937  244.6385
## 701   88.80311  -81.2276992  258.8339
## 702  187.97916   17.8956902  358.0626
## 703   93.66164  -76.3686293  263.6919
## 704   75.40198  -94.6319770  245.4359
## 705   97.24598  -72.7840939  267.2761
## 706  151.69254  -18.3561292  321.7412
## 707  140.07528  -29.9660341  310.1166
## 708   61.50227 -108.5375510  231.5421
## 709  193.05929   22.9695148  363.1491
## 710  112.95726  -57.0740373  282.9885
## 711   62.46068 -107.5786526  232.5000
## 712   91.88331  -78.1471113  261.9137
## 713   71.45201  -98.5833532  241.4874
## 714  250.35892   80.1737477  420.5441
## 715   73.74554  -96.2889798  243.7801
## 716   72.21098  -97.8240961  242.2461
## 717  104.75814  -65.2720959  274.7884
## 718   89.88893  -80.1417218  259.9196
## 719   54.10090 -115.9431071  224.1449
## 720   69.34129 -100.6949050  239.3775
## 721   82.02776  -88.0043392  252.0599
## 722   76.02800  -94.0057615  246.0618
## 723  142.76769  -27.2751629  312.8105
## 724   67.83442 -102.2024016  237.8712
## 725   69.11969 -100.9165937  239.1560
## 726  111.83265  -58.1984466  281.8637
## 727   99.09632  -70.9337221  269.1264
## 728   85.34064  -84.6907446  255.3720
## 729   57.28637 -112.7557442  227.3285
## 730  114.71896  -55.3126820  284.7506
## 731   68.10588 -101.9308283  238.1426
## 732  109.37291  -60.6578057  279.4036
## 733   72.28854  -97.7465082  242.3236
## 734   82.85321  -87.1786971  252.8851
## 735  101.26244  -68.7676277  271.2925
## 736  157.31558  -12.7373073  327.3685
## 737   80.92531  -89.1070569  250.9577
## 738   67.96184 -102.0749283  237.9986
## 739  144.93935  -25.1048203  314.9835
## 740  176.45054    6.3800699  346.5210
## 741   82.06100  -87.9710917  252.0931
## 742   75.30781  -94.7261868  245.3418
## 743  236.06586   65.9086690  406.2231
## 744   93.56746  -76.4628157  263.5977
## 745   95.34024  -74.6899147  265.3704
## 746   96.80278  -73.2273036  266.8329
## 747  194.90963   24.8174728  365.0018
## 748   71.37999  -98.6553999  241.4154
## 749  127.55501  -42.4804356  297.5904
## 750  105.36199  -64.6682887  275.3923
## 751  111.16785  -58.8631301  281.1988
## 752   51.41403 -118.6316859  221.4597
## 753   97.01884  -73.0112385  267.0489
## 754   84.88637  -85.1451082  254.9178
## 755   42.51134 -127.5407308  212.5634
## 756   75.64020  -94.3936820  245.6741
## 757   55.14795 -114.8954195  225.1913
## 758  154.42927  -15.6213976  324.4799
## 759  149.34914  -20.6978934  319.3962
## 760   86.43755  -83.5936341  256.4687
## 761  129.88178  -40.1545889  299.9182
## 762   92.17693  -77.8534649  262.2073
## 763  123.63827  -46.3957775  293.6723
## 764   85.93896  -84.0923187  255.9702
## 765  117.29503  -52.7371915  287.3273
## 766   81.47930  -88.5529253  251.5115
## 767   94.23225  -75.7979728  264.2625
## 768  107.27328  -62.7571887  277.3037
## 769   47.05964 -122.9890553  217.1083
## 770  103.46179  -66.5683593  273.4919
## 771   80.33807  -89.6944409  250.3706
## 772   84.99717  -85.0342876  255.0286
## 773  118.49166  -51.5408653  288.5242
## 774  407.06174  236.3882948  577.7352
## 775  121.29487  -48.7384369  291.3282
## 776  159.53710  -10.5175761  329.5918
## 777  111.05152  -58.9794503  281.0825
## 778  142.57379  -27.4689467  312.6165
## 779  136.77901  -33.2605478  306.8186
## 780  132.10330  -37.9340278  302.1406
## 781  133.00631  -37.0314250  303.0440
## 782  234.66980   64.5151869  404.8244
## 783   52.85996 -117.1848303  222.9047
## 784   58.42760 -111.6138703  228.4691
## 785  132.77363  -37.2639964  302.8113
## 786   87.34610  -82.6849288  257.3771
## 787   57.36393 -112.6781405  227.4060
## 788   87.66188  -82.3691009  257.6929
## 789   75.53494  -94.4989750  245.5689
## 790   70.75397  -99.2816549  240.7896
## 791   83.13574  -86.8960970  253.1676
## 792  196.88185   26.7871012  366.9766
## 793   79.76192  -90.2707467  249.7946
## 794   73.15831  -96.8764212  243.1930
## 795  120.98463  -49.0485818  291.0178
## 796  161.11044   -8.9455378  331.1664
## 797  255.11219   84.9171009  425.3073
## 798   87.49014  -82.5408668  257.5211
## 799   62.46622 -107.5731098  232.5055
## 800   51.98465 -118.0607011  222.0300
## 801   83.39058  -86.6412036  253.4224
## 802  113.24533  -56.7860141  283.2767
## 803  169.64749   -0.4161568  339.7111
## 804  115.26741  -54.7643442  285.2992
## 805  155.94167  -14.1101423  325.9935
## 806   62.29448 -107.7449346  232.3339
## 807   82.91415  -87.1177441  252.9460
## 808  105.02960  -65.0006590  275.0599
## 809   74.18320  -95.8511728  244.2176
## 810  133.14481  -36.8929899  303.1826
## 811   85.44590  -84.5854656  255.4773
## 812   87.86686  -82.1640906  257.8978
## 813  105.13486  -64.8954083  275.1651
## 814   71.62374  -98.4115498  241.6590
## 815   92.73093  -77.2994182  262.7613
## 816   48.92106 -121.1263314  218.9684
## 817   95.05216  -74.9780082  265.0823
## 818   98.33735  -71.6927013  268.3674
## 819  111.14016  -58.8908254  281.1711
## 820   84.13847  -85.8931521  254.1701
## 821   54.48316 -115.5606163  224.5269
## 822  252.84081   82.6505019  423.0311
## 823   77.24679  -92.7865964  247.2802
## 824  137.50474  -32.5351884  307.5447
## 825  139.67640  -30.3646901  309.7175
## 826  138.56287  -31.4776162  308.6034
## 827  173.82461    3.7568453  343.8924
## 828   90.27673  -79.7538766  260.3073
## 829   96.64212  -73.3879678  266.6722
## 830  192.94849   22.8588572  363.0381
## 831  155.49848  -14.5529977  325.5500
## 832  131.92048  -38.1167647  301.9577
## 833  116.43080  -53.6012170  286.4628
## 834   82.45433  -87.5776640  252.4863
## 835   50.82126 -119.2248495  220.8674
## 836   96.10475  -73.9253644  266.1349
## 837   98.88026  -71.1497811  268.9103
## 838   86.50957  -83.5216022  256.5407
## 839  183.99594   13.9171676  354.0747
## 840  638.18815  466.1925619  810.1837
## 841   96.24325  -73.7868597  266.2734
## 842  194.33348   24.2420657  364.4249
## 843   70.00608 -100.0298427  240.0420
## 844  148.76191  -21.2847302  318.8085
## 845  153.52626  -16.5237370  323.5763
## 846   72.94225  -97.0925565  242.9771
## 847  111.62213  -58.4089290  281.6532
## 848  118.75204  -51.2805562  288.7846
## 849  130.18094  -39.8555568  300.2174
## 850  209.56278   39.4501058  379.6755
## 851  121.23947  -48.7938198  291.2728
## 852  126.48580  -43.5492423  296.5208
## 853  207.14736   37.0382735  377.2565
## 854  176.04612    5.9760773  346.1162
## 855  101.92723  -68.1028545  271.9573
## 856   94.32089  -75.7093275  264.3511
## 857  128.60759  -41.4282577  298.6434
## 858   75.02527  -95.0088171  245.0594
## 859   95.07986  -74.9503069  265.1100
## 860  122.93469  -47.0991212  292.9685
## 861  193.90690   23.8160403  363.9978
## 862  134.24726  -35.7910563  304.2856
## 863  235.10191   64.9465056  405.2573
## 864  105.99355  -64.0367893  276.0239
## 865  157.27126  -12.7815919  327.3241
## 866  314.57239  144.2273359  484.9175
## 867  225.80589   55.6670637  395.9447
## 868  178.01834    7.9462120  348.0905
## 869   78.38247  -91.6505743  248.4155
## 870   89.14104  -80.8897147  259.1718
## 871   90.95260  -79.0779228  260.9831
## 872  120.51374  -49.5193400  290.5468
## 873  198.27238   28.1757681  368.3690
## 874  187.40855   17.3257621  357.4913
## 875  118.49720  -51.5353268  288.5297
## 876  256.62459   86.4262853  426.8229
## 877  253.60532   83.4134138  423.7972
## 878  253.54992   83.3581306  423.7417
## 879   75.72330  -94.3105560  245.7572
## 880   92.99130  -77.0390177  263.0216
## 881  153.57058  -16.4794502  323.6206
## 882  137.98118  -32.0590022  308.0214
## 883   77.08059  -92.9528450  247.1140
## 884   94.27657  -75.7536502  264.3068
## 885  148.09157  -21.9546157  318.1378
## 886  117.04573  -52.9864286  287.0779
## 887  124.04268  -45.9914963  294.0769
## 888   94.90812  -75.1220554  264.9383
## 889  137.15573  -32.8840245  307.1955
## 890  190.58847   20.5018097  360.6751
## 891  305.59215  135.2728120  475.9115
## 892  139.68194  -30.3591532  309.7230
## 893  453.54186  282.6598505  624.4239
## 894  596.99314  425.2852095  768.7011
## 895  223.04146   52.9073368  393.1756
## 896  156.22421  -13.8278233  326.2762
## 897  295.36541  125.0740407  465.6568
## 898  114.35886  -55.6727041  284.3904
## 899  171.08234    1.0173017  341.1474
## 900  294.59536  124.3060368  464.8847
## 901  346.21655  175.7721439  516.6609
## 902   97.73349  -72.2965663  267.7636
## 903  221.96117   51.8288581  392.0935
## 904  131.85954  -38.1776771  301.8968
## 905  307.93554  137.6096006  478.2615
## 906   85.31848  -84.7129086  255.3499
## 907  151.72024  -18.3284492  321.7689
## 908  417.67627  246.9577556  588.3948
## 909  442.95503  272.1230779  613.7870
## 910  117.10667  -52.9255039  287.1389
## 911   81.82278  -88.2093659  251.8549
## 912  160.58414   -9.4713919  330.6397
## 913  193.35291   23.2627568  363.4431
## 914  174.40630    4.3379474  344.4747
## 915  143.47126  -26.5720092  313.5145
## 916  151.54296  -18.5056013  321.5915
## 917  109.25103  -60.7796680  279.2817
## 918  103.72217  -66.3079968  273.7523
## 919   60.83747 -109.2026902  230.8776
## 920  177.61947    7.5477620  347.6912
## 921  139.37724  -30.6636835  309.4182
## 922  144.27455  -25.7692041  314.3183
## 923  150.16905  -19.8785442  320.2166
## 924  170.09069    0.0266133  340.1548
## 925  142.81755  -27.2253329  312.8604
## 926  271.23896  101.0079395  441.4700
## 927  100.23755  -69.7924982  270.2676
## 928  224.59818   54.4614242  394.7349
## 929  170.62806    0.5634685  340.6927
## 930  117.25071  -52.7815002  287.2829
## 931  303.95786  133.6430927  474.2726
## 932  171.71943    1.6537705  341.7851
## 933  213.36318   43.2447087  383.4816
## 934  474.77646  303.7895151  645.7634
## 935  167.31517   -2.7462786  337.3766
## 936  156.62309  -13.4292572  326.6754
## 937  176.78848    6.7176510  346.8593
## 938  577.69198  406.1111136  749.2728
## 939  151.62606  -18.4225612  321.6747
## 940  200.33877   30.2393560  370.4382
## 941  208.18333   38.0727159  378.2939
## 942  311.81904  141.4819872  482.1561
## 943  165.83047   -4.2296250  335.8906
## 944  582.82750  411.2133136  754.4417
## 945  224.23255   54.0964102  394.3687
## 946  189.05391   18.9691349  359.1387
## 947  836.99454  663.2990434 1010.6900
## 948  249.79938   79.6153608  419.9834
## 949  276.54623  106.3026066  446.7898
## 950 1123.57024  946.5410809 1300.5994
## 951 1369.48830 1188.8065531 1550.1700
## 952  360.76444  190.2698169  531.2591
## 953  409.12814  238.4460384  579.8102
## 954  848.35696  674.5489038 1022.1650
## 955  753.50760  580.5883871  926.4268
## 956  764.41021  591.3947178  937.4257
## 957 1945.54263 1753.7015125 2137.3837

Predicciones y sus Intervalos de Confianza

suppressWarnings(predict(modelo_RL_Simple, data.frame(seq(1,400)), interval='confidence', level = 0.95))
##            fit        lwr        upr
## 1     44.74394   38.65343   50.83445
## 2     34.21805   27.89229   40.54381
## 3     57.53013   51.67893   63.38132
## 4     38.04061   31.80401   44.27721
## 5     44.45032   38.35370   50.54695
## 6     37.10436   30.84631   43.36241
## 7     46.13447   40.07255   52.19638
## 8     41.41444   35.25304   47.57583
## 9     43.44759   37.32989   49.56530
## 10    38.47827   32.25161   44.70492
## 11    49.02632   43.02192   55.03072
## 12    42.73848   36.60568   48.87128
## 13    57.90131   52.05624   63.74637
## 14    64.15590   58.40669   69.90511
## 15    46.86574   40.81862   52.91286
## 16    39.23170   33.02203   45.44136
## 17    36.81074   30.54591   43.07557
## 18    37.50878   31.26002   43.75753
## 19    42.56674   36.43026   48.70322
## 20    78.68163   73.09851   84.26475
## 21    59.59653   53.77882   65.41423
## 22    39.33696   33.12965   45.54426
## 23    76.23298   70.62762   81.83833
## 24    43.19276   37.06964   49.31587
## 25    51.59131   45.63567   57.54695
## 26    81.59564   76.03584   87.15544
## 27    91.17420   85.66655   96.68185
## 28    35.25956   28.95850   41.56062
## 29    46.09015   40.02733   52.15296
## 30    86.71455   81.18734   92.24176
## 31    65.00905   59.27182   70.74628
## 32    51.83507   45.88395   57.78619
## 33    75.34104   69.72699   80.95510
## 34    44.47802   38.38198   50.57407
## 35    49.64125   43.64873   55.63377
## 36    45.16498   39.08319   51.24677
## 37    74.89785   69.27936   80.51634
## 38    45.22038   39.13973   51.30102
## 39    69.28035   63.59899   74.96171
## 40    48.86566   42.85813   54.87318
## 41    65.62953   59.90083   71.35822
## 42    45.78545   39.71641   51.85449
## 43    55.10363   49.21121   60.99605
## 44    48.32274   42.30460   54.34089
## 45    47.79091   41.76226   53.81955
## 46    54.48870   48.58551   60.39189
## 47    59.57437   53.75631   65.39242
## 48   129.17267  123.49542  134.84991
## 49    87.41812   81.89455   92.94169
## 50    85.04148   79.50481   90.57816
## 51    87.66742   82.14508   93.18975
## 52    67.33583   61.62988   73.04177
## 53    41.12082   34.95301   47.28862
## 54    40.81612   34.64164   46.99061
## 55    44.47802   38.38198   50.57407
## 56    41.40890   35.24738   47.57041
## 57    42.64430   36.50949   48.77912
## 58    41.94627   35.79643   48.09611
## 59    69.07537   63.39149   74.75925
## 60    37.83563   31.59436   44.07690
## 61    71.88966   66.23903   77.54029
## 62    47.46959   41.43456   53.50462
## 63    40.40063   34.21699   46.58426
## 64    77.17477   71.57824   82.77129
## 65    44.39492   38.29714   50.49271
## 66    40.53912   34.35854   46.71971
## 67    46.67738   40.62647   52.72830
## 68    56.75454   50.89039   62.61869
## 69    64.83731   59.09769   70.57694
## 70    64.40520   58.65952   70.15088
## 71    43.13182   37.00741   49.25623
## 72    52.87658   46.94455   58.80860
## 73    40.35077   34.16603   46.53551
## 74    81.00841   75.44418   86.57263
## 75    54.52748   48.62497   60.42998
## 76    74.94217   69.32413   80.56021
## 77    59.07577   53.24977   64.90178
## 78    58.26140   52.42223   64.10057
## 79    54.18954   48.28107   60.09802
## 80    51.53037   45.57359   57.48715
## 81   114.51952  108.97809  120.06095
## 82   159.37090  153.16543  165.57636
## 83    62.56040   56.78807   68.33272
## 84    43.60271   37.48829   49.71714
## 85    35.38144   29.08325   41.67962
## 86    35.79139   29.50283   42.07995
## 87    59.94554   54.13335   65.75774
## 88    37.89103   31.65103   44.13104
## 89    54.66044   48.76027   60.56061
## 90    51.36417   45.40430   57.32405
## 91    59.98986   54.17836   65.80136
## 92    51.53591   45.57924   57.49258
## 93    59.84028   54.02643   65.65414
## 94    56.98721   51.12697   62.84746
## 95    87.97211   82.45126   93.49297
## 96    46.48902   40.43430   52.54374
## 97    55.91247   50.03401   61.79092
## 98    67.28043   61.57376   72.98710
## 99    45.76883   39.69945   51.83821
## 100   45.97935   39.91427   52.04442
## 101   55.23659   49.34648   61.12670
## 102   51.75751   45.80495   57.71007
## 103   81.72306   76.16420   87.28192
## 104   61.14217   55.34853   66.93582
## 105   96.93020   91.43550  102.42490
## 106   45.30902   39.23020   51.38783
## 107   47.12612   41.08422   53.16801
## 108   52.27826   46.33531   58.22122
## 109   41.18176   35.01529   47.34823
## 110   51.35863   45.39866   57.31861
## 111   41.66373   35.50776   47.81970
## 112   58.00656   52.16322   63.84990
## 113   40.65546   34.47745   46.83348
## 114   56.52740   50.65942   62.39538
## 115   83.77838   78.23379   89.32296
## 116   56.06758   50.19178   61.94338
## 117   96.86926   91.37450  102.36403
## 118   91.85561   86.35022   97.36100
## 119  138.05320  132.25332  143.85307
## 120   62.98697   57.22092   68.75302
## 121   48.93214   42.92591   54.93837
## 122   46.76602   40.71689   52.81515
## 123   81.67320   76.11398   87.23242
## 124   62.18368   56.40577   67.96160
## 125   36.20689   29.92804   42.48574
## 126   56.05096   50.17488   61.92705
## 127   50.79910   44.82863   56.76957
## 128   79.29656   73.71865   84.87448
## 129   48.15101   42.12948   54.17253
## 130   56.38890   50.51857   62.25923
## 131   52.76024   46.82610   58.69438
## 132   55.14795   49.25631   61.03960
## 133   49.87947   43.89152   55.86741
## 134   79.21900   73.64044   84.79757
## 135   92.69769   87.19482   98.20055
## 136   45.57493   39.50158   51.64828
## 137   70.05040   64.37838   75.72242
## 138   59.94554   54.13335   65.75774
## 139   58.43314   52.59676   64.26951
## 140   38.82728   32.60852   45.04604
## 141   35.99083   29.70694   42.27473
## 142   43.29802   37.17714   49.41889
## 143   44.52788   38.43288   50.62289
## 144   89.30170   83.78685   94.81655
## 145   49.28669   43.28734   55.28605
## 146   44.60544   38.51205   50.69883
## 147   42.43932   36.30011   48.57854
## 148   47.46405   41.42891   53.49919
## 149   56.97059   51.11007   62.83111
## 150   52.42784   46.48763   58.36805
## 151   48.63852   42.62656   54.65048
## 152   74.32170   68.69733   79.94607
## 153   46.93222   40.88643   52.97800
## 154   52.28380   46.34095   58.22665
## 155   99.42872   93.93529  104.92214
## 156   41.95735   35.80774   48.10695
## 157   49.80745   43.81812   55.79677
## 158   51.13149   45.16727   57.09572
## 159   90.29889   84.78806   95.80972
## 160   46.96546   40.92034   53.01057
## 161   54.80448   48.90683   60.70212
## 162   83.90026   78.35646   89.44405
## 163  167.25978  160.86890  173.65065
## 164   48.46678   42.45146   54.48210
## 165  106.45336  100.94945  111.95728
## 166  103.73879   98.24139  109.23619
## 167   64.45506   58.71008   70.20004
## 168   98.84702   93.35354  104.34051
## 169   39.54747   33.34488   45.75007
## 170   43.20938   37.08662   49.33214
## 171   85.68966   80.15679   91.22253
## 172   62.27232   56.49573   68.04891
## 173   44.63314   38.54033   50.72596
## 174   41.44214   35.28135   47.60292
## 175   53.19789   47.27168   59.12410
## 176   62.57702   56.80494   68.34909
## 177   46.60536   40.55299   52.65773
## 178   52.58850   46.65123   58.52577
## 179   42.88806   36.75846   49.01766
## 180   57.95670   52.11255   63.80086
## 181   43.24262   37.12056   49.36467
## 182   58.51070   52.67558   64.34581
## 183  107.88267  102.37408  113.39125
## 184   54.27818   48.37128   60.18509
## 185  133.35533  127.62397  139.08669
## 186  116.53052  110.97555  122.08549
## 187   64.89271   59.15386   70.63156
## 188   47.55269   41.51932   53.58607
## 189  106.24285  100.73955  111.74614
## 190  132.97861  127.25239  138.70483
## 191   37.84117   31.60003   44.08232
## 192   43.27032   37.14885   49.39178
## 193   38.16803   31.93433   44.40172
## 194   53.00400   47.07428   58.93371
## 195   43.12074   36.99609   49.24538
## 196   61.36931   55.57913   67.15949
## 197   49.59693   43.60356   55.59030
## 198   60.84855   55.05041   66.64670
## 199   47.53607   41.50236   53.56978
## 200   45.42535   39.34893   51.50178
## 201   49.75759   43.76731   55.74787
## 202   58.77108   52.94017   64.60198
## 203   72.04478   66.39589   77.69367
## 204   49.76313   43.77295   55.75330
## 205   56.58834   50.72139   62.45529
## 206   49.22021   43.21957   55.22085
## 207   51.84615   45.89523   57.79706
## 208  105.74425  100.24234  111.24616
## 209   87.44582   81.92239   92.96925
## 210   61.55767   55.77034   67.34499
## 211   43.08750   36.96215   49.21285
## 212   50.08445   44.10042   56.06847
## 213   59.46911   53.64938   65.28883
## 214   35.97975   29.69560   42.26390
## 215   43.45867   37.34120   49.57615
## 216   62.33880   56.56319   68.11440
## 217   62.56040   56.78807   68.33272
## 218   47.77429   41.74531   53.80326
## 219   37.86333   31.62269   44.10397
## 220   46.31174   40.25343   52.37006
## 221   45.63587   39.56377   51.70797
## 222   44.80488   38.71564   50.89412
## 223   53.54691   47.62698   59.46684
## 224   44.27305   38.17272   50.37338
## 225   79.71760   74.14316   85.29204
## 226   36.81074   30.54591   43.07557
## 227   44.68300   38.59122   50.77478
## 228   40.58344   34.40384   46.76305
## 229   72.67079   67.02885   78.31274
## 230   60.11728   54.30778   65.92679
## 231  100.74168   95.24788  106.23549
## 232   58.87633   53.04713   64.70554
## 233   55.20335   49.31267   61.09404
## 234   48.13993   42.11818   54.16167
## 235   53.91255   47.99915   59.82594
## 236   67.38015   61.67478   73.08552
## 237   48.73824   42.72823   54.74825
## 238   56.90412   51.04248   62.76575
## 239  143.93108  138.03439  149.82777
## 240  358.37118  344.75155  371.99081
## 241   68.70973   63.02131   74.39816
## 242   44.53896   38.44419   50.63374
## 243   49.63017   43.63744   55.62290
## 244   72.99211   67.35367   78.63055
## 245   66.16690   60.44549   71.88831
## 246  102.47568   96.98026  107.97111
## 247   73.42422   67.79043   79.05802
## 248  222.82540  214.73474  230.91606
## 249   48.28396   42.26505   54.30287
## 250   65.97854   60.25459   71.70249
## 251   66.61563   60.90022   72.33105
## 252  117.46677  111.90494  123.02860
## 253   56.41106   50.54111   62.28101
## 254  115.73831  110.18887  121.28774
## 255   44.33399   38.23493   50.43304
## 256   38.07939   31.84368   44.31510
## 257   66.13366   60.41180   71.85552
## 258   55.06485   49.17176   60.95795
## 259   48.08453   42.06169   54.10737
## 260   54.00673   48.09501   59.91844
## 261  104.81354   99.31393  110.31315
## 262   55.22551   49.33521   61.11581
## 263   59.41925   53.59873   65.23977
## 264   51.19797   45.23499   57.16095
## 265  107.70539  102.19743  113.21335
## 266   54.89866   49.00266   60.79465
## 267   61.95654   56.17523   67.73785
## 268   69.00335   63.31858   74.68812
## 269  109.15686  103.64338  114.67033
## 270   53.49705   47.57623   59.41787
## 271   38.84944   32.63118   45.06770
## 272   75.08067   69.46402   80.69732
## 273   38.27329   32.04199   44.50459
## 274   50.08445   44.10042   56.06847
## 275   50.90990   44.94151   56.87828
## 276   60.95935   55.16291   66.75580
## 277  130.29728  124.60613  135.98842
## 278   62.03964   56.25958   67.81971
## 279   89.46236   83.94818   94.97654
## 280   61.21419   55.42165   67.00673
## 281   87.88902   82.36776   93.41027
## 282   58.80986   52.97958   64.64013
## 283   54.02335   48.11192   59.93477
## 284   51.75197   45.79931   57.70463
## 285  135.99234  130.22351  141.76116
## 286   70.23322   64.56338   75.90305
## 287   47.18152   41.14073   53.22230
## 288   57.64647   51.79720   63.49574
## 289   58.12290   52.28147   63.96434
## 290   40.43387   34.25096   46.61677
## 291   75.33550   69.72140   80.94961
## 292   64.23346   58.48535   69.98157
## 293   44.62760   38.53467   50.72053
## 294   69.72908   64.05319   75.40497
## 295  104.49776   98.99886  109.99667
## 296   58.67136   52.83884   64.50387
## 297   71.11407   65.45458   76.77356
## 298   88.58705   83.06906   94.10504
## 299  195.29743  188.12271  202.47214
## 300   48.38368   42.36673   54.40063
## 301   52.67714   46.74148   58.61279
## 302   43.23708   37.11490   49.35925
## 303  144.00310  138.10515  149.90105
## 304   43.00440   36.87728   49.13152
## 305   50.88220   44.91329   56.85110
## 306   44.57220   38.47812   50.66629
## 307   44.95446   38.86832   51.04060
## 308   48.92106   42.91461   54.92751
## 309   63.34153   57.58064   69.10242
## 310   55.66871   49.78607   61.55135
## 311  124.77395  119.14641  130.40150
## 312   96.04381   90.54802  101.53960
## 313   64.87055   59.13139   70.60971
## 314   50.54426   44.56897   56.51955
## 315   72.39934   66.75440   78.04427
## 316   64.93703   59.19880   70.67527
## 317  172.65014  166.12290  179.17738
## 318   65.97300   60.24898   71.69703
## 319   75.09729   69.48081   80.71377
## 320   60.94827   55.15166   66.74489
## 321  110.00447  104.48737  115.52156
## 322   48.75486   42.74517   54.76455
## 323   63.98970   58.23813   69.74128
## 324   66.87601   61.16404   72.58798
## 325   79.52370   73.94767   85.09973
## 326   56.31134   50.43969   62.18299
## 327   43.40881   37.29029   49.52734
## 328   40.88814   34.71524   47.06104
## 329   80.01676   74.44475   85.58877
## 330  123.78784  118.17041  129.40528
## 331   89.17428   83.65889   94.68968
## 332   43.96281   37.85597   50.06965
## 333  103.85513   98.35752  109.35274
## 334   83.22992   77.68170   88.77815
## 335   71.74562   66.09336   77.39788
## 336   51.46943   45.51152   57.42734
## 337   50.27280   44.29237   56.25324
## 338   76.88115   71.28191   82.48039
## 339  209.68466  202.04617  217.32314
## 340   53.34193   47.41832   59.26554
## 341   48.20641   42.18597   54.22684
## 342   41.23716   35.07190   47.40242
## 343   54.65490   48.75463   60.55516
## 344   95.34024   89.84335  100.83712
## 345   72.34394   66.69838   77.98949
## 346   68.56015   62.86986   74.25045
## 347   98.34843   92.85478  103.84208
## 348   58.30572   52.46727   64.14417
## 349   65.04783   59.31114   70.78453
## 350  165.73629  159.38256  172.09002
## 351   79.53478   73.95884   85.11072
## 352   48.16209   42.14078   54.18340
## 353   45.66357   39.59204   51.73510
## 354   44.12347   38.02000   50.22693
## 355   35.12106   28.81674   41.42538
## 356   43.85755   37.74850   49.96660
## 357   77.79524   72.20434   83.38613
## 358   43.03210   36.90557   49.15863
## 359   44.97108   38.88528   51.05688
## 360   47.86293   41.83571   53.89015
## 361   46.43916   40.38343   52.49489
## 362   70.00608   64.33353   75.67863
## 363   81.28540   75.72329   86.84752
## 364  109.91029  104.39361  115.42697
## 365   68.72081   63.03253   74.40910
## 366   66.28324   60.56339   72.00309
## 367  119.86556  114.28452  125.44661
## 368  125.99828  120.35766  131.63891
## 369   53.55245   47.63262   59.47228
## 370   60.59372   54.79163   66.39580
## 371   50.35590   44.37704   56.33476
## 372   54.28926   48.38255   60.19597
## 373   51.94587   45.99679   57.89494
## 374   48.15655   42.13513   54.17796
## 375   46.47240   40.41735   52.52746
## 376   85.01932   79.48252   90.55613
## 377  111.18447  105.66183  116.70711
## 378   72.83145   67.19126   78.47164
## 379   92.07167   86.56696   97.57639
## 380   45.58047   39.50724   51.65371
## 381   88.69785   83.18036   94.21533
## 382   61.55767   55.77034   67.34499
## 383   75.54602   69.93400   81.15805
## 384   93.24614   87.74476   98.74752
## 385   40.46711   34.28494   46.64928
## 386   66.49930   60.78233   72.21626
## 387   59.53559   53.71692   65.35426
## 388   87.39042   81.86671   92.91413
## 389  136.94521  131.16222  142.72820
## 390   57.03707   51.17767   62.89648
## 391   94.02173   88.52223   99.52124
## 392   77.06951   71.47201   82.66700
## 393  124.87367  119.24509  130.50226
## 394   79.20792   73.62927   84.78658
## 395   47.35325   41.31590   53.39061
## 396   42.63876   36.50383   48.77370
## 397   38.04615   31.80968   44.28262
## 398   53.15911   47.23220   59.08602
## 399  102.13775   96.64274  107.63275
## 400   44.17333   38.07091   50.27574
## 401  137.47150  131.68055  143.26246
## 402   52.79902   46.86558   58.73245
## 403   79.56802   73.99236   85.14369
## 404   50.05121   44.06654   56.03587
## 405   67.28597   61.57937   72.99256
## 406   79.25778   73.67955   84.83602
## 407   74.56545   68.94359   80.18732
## 408   41.15406   34.98698   47.32113
## 409   42.04045   35.89264   48.18826
## 410   76.47119   70.86810   82.07428
## 411   63.17533   57.41203   68.93863
## 412   48.07899   42.05604   54.10193
## 413   48.72162   42.71128   54.73195
## 414   44.28413   38.18403   50.38422
## 415   43.35342   37.23371   49.47312
## 416   46.67184   40.62081   52.72287
## 417   73.47962   67.84642   79.11283
## 418   70.27754   64.60823   75.94685
## 419   53.16465   47.23784   59.09146
## 420   55.17011   49.27885   61.06138
## 421   52.36136   46.41993   58.30279
## 422   85.97220   80.44093   91.50346
## 423   63.56313   57.80544   69.32081
## 424   67.76240   62.06197   73.46283
## 425   44.51680   38.42157   50.61204
## 426  111.53349  106.00910  117.05788
## 427   64.32210   58.57524   70.06895
## 428   48.02359   41.99955   54.04763
## 429   53.66879   47.75104   59.58653
## 430   72.94225   67.30327   78.58123
## 431   85.50130   79.96734   91.03526
## 432   58.63812   52.80507   64.47117
## 433   69.67368   63.99712   75.35024
## 434   56.08974   50.21432   61.96516
## 435  110.97396  105.45235  116.49557
## 436   50.49440   44.51817   56.47063
## 437   65.28605   59.55265   71.01945
## 438  111.62767  106.10280  117.15254
## 439   97.55068   92.05654  103.04481
## 440  174.34536  167.77370  180.91702
## 441   51.34201   45.38173   57.30230
## 442   51.10380   45.13905   57.06854
## 443   54.86542   48.96884   60.76199
## 444   46.69400   40.64342   52.74458
## 445   46.61644   40.56430   52.66859
## 446   99.29022   93.79679  104.78364
## 447   79.01957   73.43933   84.59981
## 448   49.94041   43.95363   55.92719
## 449   65.36915   59.63689   71.10141
## 450   57.39717   51.54377   63.25057
## 451  169.00486  162.57066  175.43905
## 452   88.51503   82.99671   94.03334
## 453   47.21476   41.17464   53.25487
## 454   43.09304   36.96780   49.21827
## 455   71.66252   66.00932   77.31573
## 456   93.96079   88.46115   99.46043
## 457   53.20897   47.28296   59.13498
## 458   73.36883   67.73444   79.00321
## 459   62.55486   56.78245   68.32726
## 460  123.47761  117.86327  129.09194
## 461   69.60720   63.92984   75.28457
## 462   59.64085   53.82384   65.45785
## 463   99.52844   94.03501  105.02186
## 464   53.62447   47.70593   59.54301
## 465  209.61264  201.97656  217.24871
## 466   51.90709   45.95730   57.85688
## 467   43.33680   37.21674   49.45685
## 468   48.88228   42.87508   54.88948
## 469   80.40455   74.83564   85.97347
## 470   57.41933   51.56630   63.27236
## 471   76.62077   71.01909   82.22245
## 472   58.79878   52.96832   64.62923
## 473   94.91920   89.42156  100.41684
## 474   84.72017   79.18154   90.25879
## 475   52.92090   46.98967   58.85212
## 476   46.03475   39.97080   52.09869
## 477   48.57204   42.55878   54.58530
## 478   85.39050   79.85590   90.92511
## 479   72.34948   66.70398   77.99497
## 480  116.98479  111.42654  122.54305
## 481   47.66349   41.63232   53.69466
## 482   55.05377   49.16049   60.94706
## 483   65.31375   59.58073   71.04677
## 484   73.57380   67.94160   79.20600
## 485   52.59958   46.66251   58.53665
## 486   55.85153   49.97203   61.73102
## 487  147.54866  141.58649  153.51083
## 488   54.51640   48.61370   60.41910
## 489  162.59514  156.31601  168.87428
## 490   49.64125   43.64873   55.63377
## 491   92.24895   86.74478   97.75312
## 492   42.14017   35.99451   48.28582
## 493   55.24767   49.35776   61.13759
## 494   38.28991   32.05898   44.52083
## 495   57.60215   51.75215   63.45215
## 496   47.99035   41.96565   54.01505
## 497  123.52747  117.91264  129.14230
## 498   48.01251   41.98825   54.03677
## 499  202.33869  194.94146  209.73592
## 500   99.47304   93.97961  104.96646
## 501  156.24637  150.10939  162.38335
## 502  108.48652  102.97571  113.99734
## 503   90.24903   84.73801   95.76006
## 504   79.06389   73.48402   84.64375
## 505   45.15390   39.07188   51.23591
## 506   44.56666   38.47246   50.66086
## 507   80.39901   74.83005   85.96797
## 508   48.06791   42.04474   54.09107
## 509  101.87737   96.38265  107.37209
## 510   46.00151   39.93688   52.06613
## 511   82.84767   77.29683   88.39850
## 512   73.86188   68.23272   79.49104
## 513   73.66798   68.03678   79.29918
## 514  108.56962  103.05849  114.08076
## 515   88.13277   82.61268   93.65286
## 516   85.60656   80.07321   91.13991
## 517   46.88790   40.84122   52.93457
## 518   46.01813   39.95384   52.08241
## 519   57.84037   51.99429   63.68644
## 520   99.31792   93.82449  104.81134
## 521   53.71865   47.80179   59.63550
## 522   56.02326   50.14671   61.89982
## 523   74.90893   69.29055   80.52730
## 524   84.72017   79.18154   90.25879
## 525   65.91760   60.19283   71.64238
## 526  189.85166  182.84264  196.86068
## 527   44.17887   38.07657   50.28117
## 528  152.87254  146.80620  158.93888
## 529   83.18560   77.63708   88.73413
## 530   65.10877   59.37292   70.84462
## 531   86.54281   81.01468   92.07094
## 532   83.83378   78.28955   89.37800
## 533  128.91229  123.23820  134.58639
## 534   72.15004   66.50233   77.79775
## 535  287.99175  277.38292  298.60058
## 536   48.41138   42.39498   54.42779
## 537   68.20006   62.50522   73.89490
## 538   55.31969   49.43103   61.20836
## 539   43.58609   37.47132   49.70087
## 540   57.94562   52.10128   63.78996
## 541  100.28187   94.78828  105.77545
## 542   81.57902   76.01910   87.13894
## 543  102.22085   96.72574  107.71595
## 544   46.41700   40.36082   52.47318
## 545   57.26975   51.41423   63.12527
## 546   73.63474   68.00319   79.26630
## 547   63.95092   58.19880   69.70305
## 548   55.76289   49.88187   61.64391
## 549   70.57669   64.91093   76.24246
## 550   82.19395   76.63852   87.74939
## 551   82.47649   76.92307   88.02992
## 552   66.03394   60.31074   71.75714
## 553  138.45761  132.65147  144.26376
## 554   63.57421   57.81668   69.33173
## 555   48.11777   42.09558   54.13995
## 556   45.17052   39.08884   51.25219
## 557  140.60157  134.76121  146.44193
## 558   94.85826   89.36051  100.35602
## 559   50.58304   44.60849   56.55759
## 560   88.97484   83.45858   94.49110
## 561   52.98184   47.05172   58.91195
## 562   72.03924   66.39029   77.68819
## 563   44.69962   38.60819   50.79105
## 564   43.12628   37.00175   49.25081
## 565  153.74785  147.66353  159.83218
## 566   61.36377   55.57350   67.15403
## 567  108.49760  102.98674  114.00846
## 568  346.22763  333.14061  359.31464
## 569  118.22574  112.65808  123.79340
## 570   53.48043   47.55931   59.40155
## 571   90.45401   84.94376   95.96425
## 572   45.66911   39.59769   51.74053
## 573   72.33840   66.69278   77.98401
## 574   81.85048   76.29256   87.40840
## 575   74.14442   68.51821   79.77062
## 576   78.23289   72.64588   83.81991
## 577  103.69447   98.19716  109.19179
## 578   84.07199   78.52930   89.61468
## 579   78.07778   72.48939   83.66616
## 580   66.67657   60.96197   72.39118
## 581   72.98657   67.34807   78.62507
## 582   51.98465   46.03629   57.93300
## 583   72.34394   66.69838   77.98949
## 584   60.92611   55.12916   66.72307
## 585   52.88766   46.95583   58.81948
## 586   93.62840   88.12797   99.12882
## 587   48.35598   42.33849   54.37348
## 588   58.80986   52.97958   64.64013
## 589  128.39154  122.72366  134.05941
## 590  223.20766  215.10348  231.31183
## 591   65.84558   60.11983   71.57134
## 592   81.76738   76.20885   87.32591
## 593   95.57292   90.07642  101.06942
## 594  291.92511  281.15390  302.69631
## 595   65.35807   59.62566   71.09048
## 596   45.59155   39.51854   51.66456
## 597   63.50219   57.74362   69.26075
## 598   48.10669   42.08428   54.12909
## 599   85.51238   79.97849   91.04627
## 600  137.08925  131.30409  142.87441
## 601   82.27705   76.72221   87.83189
## 602   60.15606   54.34717   65.96496
## 603   50.40022   44.42221   56.37824
## 604  113.09575  107.56291  118.62860
## 605   51.53037   45.57359   57.48715
## 606   65.95638   60.23213   71.68063
## 607   87.04140   81.51591   92.56690
## 608  153.03874  146.96901  159.10848
## 609  106.64172  101.13724  112.14620
## 610   51.02624   45.06004   56.99244
## 611   52.07329   46.12656   58.02001
## 612  105.61129  100.10973  111.11285
## 613   46.54996   40.49647   52.60345
## 614   71.09191   65.43216   76.75166
## 615   90.04959   84.53779   95.56139
## 616  159.62573  153.41455  165.83691
## 617  143.65408  137.76222  149.54594
## 618   61.20311   55.41040   66.99582
## 619   56.65482   50.78899   62.52065
## 620   43.28694   37.16582   49.40805
## 621   53.85161   47.93713   59.76609
## 622  103.43963   97.94277  108.93650
## 623   80.25497   74.68487   85.82508
## 624   93.19074   87.68921   98.69227
## 625   99.62815   94.13472  105.12159
## 626   41.75237   35.59833   47.90642
## 627  105.93815  100.43571  111.44059
## 628   40.22335   34.03579   46.41091
## 629   57.94008   52.09565   63.78452
## 630   73.97822   68.35028   79.60616
## 631   60.49954   54.69599   66.30308
## 632   64.80407   59.06399   70.54416
## 633   87.19652   81.67183   92.72122
## 634   88.50949   82.99115   94.02783
## 635   88.04413   82.52362   93.56465
## 636  232.03833  223.61680  240.45986
## 637  131.01193  125.31170  136.71216
## 638   46.17879   40.11777   52.23980
## 639   57.00383   51.14387   62.86380
## 640   57.54675   51.69583   63.39767
## 641   73.83972   68.21033   79.46911
## 642   61.64631   55.86032   67.43229
## 643   57.46919   51.61698   63.32139
## 644   53.47489   47.55367   59.39611
## 645   70.59885   64.93335   76.26436
## 646   88.34883   82.82975   93.86791
## 647   60.05634   54.24588   65.86680
## 648  111.65537  106.13036  117.18038
## 649   59.53559   53.71692   65.35426
## 650   56.21162   50.33828   62.08497
## 651   47.94603   41.92045   53.97160
## 652   85.27970   79.74444   90.81496
## 653  200.72657  193.38107  208.07207
## 654   48.21749   42.19727   54.23770
## 655  104.03795   98.53999  109.53591
## 656   58.20600   52.36593   64.04608
## 657   94.10483   88.60551   99.60415
## 658  106.24839  100.74507  111.75170
## 659   72.06694   66.41830   77.71558
## 660  144.36873  138.46435  150.27311
## 661   55.38617   49.49866   61.27369
## 662   61.19203   55.39915   66.98491
## 663   61.18649   55.39352   66.97946
## 664   97.34016   91.84585  102.83447
## 665   89.77814   84.26526   95.29102
## 666   65.07553   59.33922   70.81184
## 667   87.22422   81.69967   92.74878
## 668   40.57236   34.39252   46.75221
## 669   89.35156   83.83692   94.86620
## 670  192.68811  185.59351  199.78271
## 671  317.59720  305.74658  329.44783
## 672   53.98457   48.07245   59.89668
## 673   95.99395   90.49809  101.48981
## 674  113.83811  108.30089  119.37532
## 675   78.28829   72.70176   83.87483
## 676   58.22262   52.38282   64.06243
## 677   70.07256   64.40080   75.74431
## 678   83.75068   78.20591   89.29545
## 679   50.89328   44.92458   56.86198
## 680  182.55002  175.75364  189.34640
## 681   84.83097   79.29302   90.36892
## 682  108.32586  102.81566  113.83607
## 683   55.13133   49.23940   61.02327
## 684   53.05386   47.12504   58.98267
## 685   58.63258   52.79944   64.46572
## 686   60.98151   55.18541   66.77762
## 687   70.73181   65.06787   76.39576
## 688  130.28620  124.59519  135.97720
## 689   73.74554   68.11516   79.37592
## 690  166.43986  160.06906  172.81067
## 691   80.32145   74.75188   85.89103
## 692   65.61845   59.88960   71.34729
## 693  216.08883  208.23308  223.94458
## 694  109.25103  103.73718  114.76489
## 695  191.79064  184.72329  198.85799
## 696   61.73495   55.95030   67.51959
## 697  116.08178  110.52998  121.63359
## 698   77.01411   71.41610   82.61211
## 699   60.12282   54.31341   65.93224
## 700   74.60423   68.98276   80.22570
## 701   88.80311   83.28609   94.32012
## 702  187.97916  181.02574  194.93258
## 703   93.66164   88.16129   99.16198
## 704   75.40198   69.78854   81.01543
## 705   97.24598   91.75158  102.74037
## 706  151.69254  145.65007  157.73500
## 707  140.07528  134.24346  145.90709
## 708   61.50227   55.71411   67.29043
## 709  193.05929  185.95337  200.16521
## 710  112.95726  107.42520  118.48931
## 711   62.46068   56.68688   68.23448
## 712   91.88331   86.37801   97.38862
## 713   71.45201   65.79640   77.10761
## 714  250.35892  241.25097  259.46686
## 715   73.74554   68.11516   79.37592
## 716   72.21098   66.56394   77.85801
## 717  104.75814   99.25866  110.25762
## 718   89.88893   84.37650   95.40137
## 719   54.10090   48.19086   60.01095
## 720   69.34129   63.66067   75.02190
## 721   82.02776   76.47112   87.58439
## 722   76.02800   70.42067   81.63533
## 723  142.76769  136.89112  148.64426
## 724   67.83442   62.13492   73.53393
## 725   69.11969   63.43635   74.80303
## 726  111.83265  106.30672  117.35858
## 727   99.09632   93.60288  104.58976
## 728   85.34064   79.80574   90.87554
## 729   57.28637   51.43113   63.14161
## 730  114.71896  109.17626  120.26165
## 731   68.10588   62.40984   73.80192
## 732  109.37291  103.85855  114.88728
## 733   72.28854   66.64237   77.93471
## 734   82.85321   77.30241   88.40400
## 735  101.26244   95.76828  106.75659
## 736  157.31558  151.15549  163.47566
## 737   80.92531   75.36045   86.49017
## 738   67.96184   62.26397   73.65972
## 739  144.93935  139.02485  150.85384
## 740  176.45054  169.82274  183.07834
## 741   82.06100   76.50460   87.61739
## 742   75.30781   69.69342   80.92219
## 743  236.06586  227.49650  244.63523
## 744   93.56746   88.06688   99.06803
## 745   95.34024   89.84335  100.83712
## 746   96.80278   91.30795  102.29762
## 747  194.90963  187.74690  202.07236
## 748   71.37999   65.72356   77.03642
## 749  127.55501  121.89691  133.21310
## 750  105.36199   99.86107  110.86292
## 751  111.16785  105.64530  116.69041
## 752   51.41403   45.45509   57.37298
## 753   97.01884   91.52423  102.51345
## 754   84.88637   79.34875   90.42398
## 755   42.51134   36.37368   48.64901
## 756   75.64020   70.02910   81.25130
## 757   55.14795   49.25631   61.03960
## 758  154.42927  148.33077  160.52776
## 759  149.34914  143.35276  155.34552
## 760   86.43755   80.90885   91.96625
## 761  129.88178  124.19583  135.56774
## 762   92.17693   86.67254   97.68132
## 763  123.63827  118.02233  129.25420
## 764   85.93896   80.40750   91.47041
## 765  117.29503  111.73448  122.85558
## 766   81.47930   75.91864   87.03996
## 767   94.23225   88.73321   99.73129
## 768  107.27328  101.76679  112.77976
## 769   47.05964   41.01641   53.10286
## 770  103.46179   97.96489  108.95870
## 771   80.33807   74.76863   85.90752
## 772   84.99717   79.46022   90.53411
## 773  118.49166  112.92190  124.06142
## 774  407.06174  391.26974  422.85373
## 775  121.29487  115.70127  126.88847
## 776  159.53710  153.32791  165.74629
## 777  111.05152  105.52953  116.57350
## 778  142.57379  136.70052  148.44706
## 779  136.77901  130.99851  142.55951
## 780  132.10330  126.38883  137.81777
## 781  133.00631  127.27972  138.73290
## 782  234.66980  226.15189  243.18771
## 783   52.85996   46.92763   58.79229
## 784   58.42760   52.59113   64.26406
## 785  132.77363  127.05019  138.49707
## 786   87.34610   81.82216   92.87004
## 787   57.36393   51.50998   63.21788
## 788   87.66188   82.13952   93.18424
## 789   75.53494   69.92281   81.14708
## 790   70.75397   65.09029   76.41766
## 791   83.13574   77.58688   88.68461
## 792  196.88185  189.65785  204.10585
## 793   79.76192   74.18784   85.33599
## 794   73.15831   67.52166   78.79495
## 795  120.98463  115.39383  126.57544
## 796  161.11044  154.86560  167.35528
## 797  255.11219  245.82077  264.40361
## 798   87.49014   81.96693   93.01335
## 799   62.46622   56.69250   68.23993
## 800   51.98465   46.03629   57.93300
## 801   83.39058   77.84343   88.93773
## 802  113.24533  107.71163  118.77904
## 803  169.64749  163.19714  176.09784
## 804  115.26741  109.72114  120.81368
## 805  155.94167  149.81122  162.07213
## 806   62.29448   56.51822   68.07074
## 807   82.91415   77.36377   88.46452
## 808  105.02960   99.52949  110.52971
## 809   74.18320   68.55739   79.80900
## 810  133.14481  127.41633  138.87329
## 811   85.44590   79.91162   90.98018
## 812   87.86686   82.34549   93.38822
## 813  105.13486   99.63450  110.63522
## 814   71.62374   65.97010   77.27739
## 815   92.73093   87.22815   98.23370
## 816   48.92106   42.91461   54.92751
## 817   95.05216   89.55477  100.54956
## 818   98.33735   92.84369  103.83100
## 819  111.14016  105.61773  116.66258
## 820   84.13847   78.59621   89.68074
## 821   54.48316   48.57987   60.38645
## 822  252.84081  243.63732  262.04430
## 823   77.24679   71.65092   82.84265
## 824  137.50474  131.71328  143.29620
## 825  139.67640  133.85100  145.50180
## 826  138.56287  132.75509  144.37066
## 827  173.82461  167.26667  180.38255
## 828   90.27673   84.76581   95.78765
## 829   96.64212   91.14711  102.13714
## 830  192.94849  185.84595  200.05103
## 831  155.49848  149.37746  161.61949
## 832  131.92048  126.20843  137.63253
## 833  116.43080  110.87654  121.98506
## 834   82.45433   76.90075   88.00791
## 835   50.82126   44.85120   56.79131
## 836   96.10475   90.60905  101.60045
## 837   98.88026   93.38678  104.37374
## 838   86.50957   80.98126   92.03788
## 839  183.99594  177.15836  190.83352
## 840  638.18815  611.68446  664.69184
## 841   96.24325   90.74773  101.73876
## 842  194.33348  187.18851  201.47844
## 843   70.00608   64.33353   75.67863
## 844  148.76191  142.77680  154.74701
## 845  153.52626  147.44651  159.60601
## 846   72.94225   67.30327   78.58123
## 847  111.62213  106.09729  117.14697
## 848  118.75204  113.18020  124.32388
## 849  130.18094  124.49125  135.87062
## 850  209.56278  201.92837  217.19719
## 851  121.23947  115.64637  126.83257
## 852  126.48580  120.83980  132.13179
## 853  207.14736  199.59321  214.70152
## 854  176.04612  169.42919  182.66306
## 855  101.92723   96.43246  107.42200
## 856   94.32089   88.82204   99.81973
## 857  128.60759  122.93715  134.27804
## 858   75.02527   69.40806   80.64247
## 859   95.07986   89.58252  100.57721
## 860  122.93469  117.32569  128.54369
## 861  193.90690  186.77504  201.03876
## 862  134.24726  128.50351  139.99100
## 863  235.10191  226.56810  243.63573
## 864  105.99355  100.49096  111.49614
## 865  157.27126  151.11214  163.43038
## 866  314.57239  302.85055  326.29423
## 867  225.80589  217.60935  234.00243
## 868  178.01834  171.34804  184.68865
## 869   78.38247   72.79676   83.96818
## 870   89.14104   83.62550   94.65658
## 871   90.95260   85.44418   96.46103
## 872  120.51374  114.92710  126.10038
## 873  198.27238  191.00474  205.54001
## 874  187.40855  180.47193  194.34516
## 875  118.49720  112.92740  124.06700
## 876  256.62459  247.27438  265.97481
## 877  253.60532  244.37229  262.83836
## 878  253.54992  244.31903  262.78082
## 879   75.72330   70.11301   81.33359
## 880   92.99130   87.48924   98.49336
## 881  153.57058  147.48991  159.65124
## 882  137.98118  132.18242  143.77994
## 883   77.08059   71.48320   82.67798
## 884   94.27657   88.77763   99.77551
## 885  148.09157  142.11920  154.06395
## 886  117.04573  111.48703  122.60444
## 887  124.04268  118.42267  129.66269
## 888   94.90812   89.41046  100.40579
## 889  137.15573  131.36956  142.94189
## 890  190.58847  183.55738  197.61957
## 891  305.59215  294.25025  316.93404
## 892  139.68194  133.85645  145.50743
## 893  453.54186  435.63590  471.44782
## 894  596.99314  572.42537  621.56090
## 895  223.04146  214.94316  231.13976
## 896  156.22421  150.08771  162.36071
## 897  295.36541  284.45148  306.27935
## 898  114.35886  108.81844  119.89928
## 899  171.08234  164.59553  177.56914
## 900  294.59536  283.71343  305.47729
## 901  346.21655  333.13002  359.30308
## 902   97.73349   92.23949  103.22750
## 903  221.96117  213.90099  230.02135
## 904  131.85954  126.14829  137.57079
## 905  307.93554  296.49486  319.37622
## 906   85.31848   79.78345   90.85351
## 907  151.72024  145.67721  157.76326
## 908  417.67627  401.40441  433.94813
## 909  442.95503  425.53326  460.37679
## 910  117.10667  111.54752  122.66582
## 911   81.82278   76.26465   87.38090
## 912  160.58414  154.35131  166.81698
## 913  193.35291  186.23802  200.46779
## 914  174.40630  167.83303  180.97957
## 915  143.47126  137.58258  149.35994
## 916  151.54296  145.50348  157.58243
## 917  109.25103  103.73718  114.76489
## 918  103.72217   98.22481  109.21954
## 919   60.83747   55.03915   66.63579
## 920  177.61947  170.96003  184.27891
## 921  139.37724  133.55662  145.19787
## 922  144.27455  138.37184  150.17727
## 923  150.16905  144.15675  156.18135
## 924  170.09069  163.62913  176.55224
## 925  142.81755  136.94012  148.69497
## 926  271.23896  261.31104  281.16688
## 927  100.23755   94.74398  105.73112
## 928  224.59818  216.44468  232.75168
## 929  170.62806  164.15285  177.10327
## 930  117.25071  111.69050  122.81093
## 931  303.95786  292.68471  315.23101
## 932  171.71943  165.21627  178.22259
## 933  213.36318  205.60065  221.12571
## 934  474.77646  455.89531  493.65761
## 935  167.31517  160.92293  173.70742
## 936  156.62309  150.47801  162.76816
## 937  176.78848  170.15156  183.42539
## 938  577.69198  554.02861  601.35535
## 939  151.62606  145.58492  157.66719
## 940  200.33877  193.00565  207.67190
## 941  208.18333  200.59487  215.77180
## 942  311.81904  300.21408  323.42400
## 943  165.83047  159.47447  172.18647
## 944  582.82750  558.92368  606.73132
## 945  224.23255  216.09204  232.37305
## 946  189.05391  182.06867  196.03915
## 947  836.99454  801.07675  872.91232
## 948  249.79938  240.71290  258.88586
## 949  276.54623  266.40458  286.68787
## 950 1123.57024 1073.97906 1173.16141
## 951 1369.48830 1308.12173 1430.85486
## 952  360.76444  347.03934  374.48953
## 953  409.12814  393.24287  425.01340
## 954  848.35696  811.89872  884.81520
## 955  753.50760  721.55424  785.46095
## 956  764.41021  731.93988  796.88054
## 957 1945.54263 1856.53153 2034.55373

5.3. Regresión Lineal Múltiple

Resumen estadístico de las variables de estudio

En el análisis de datos, las variables cualitativas clasificadoras ofrecen una valiosa perspectiva sobre las diferencias y similitudes entre grupos. En este estudio, nos enfocaremos en una única variable cualitativa clasificadora: “country”, que nos permitirá explorar un conjunto diverso de naciones. A través de la aplicación de diversas pruebas de Análisis de Componentes Múltiples (ACM), bitplo ACM, calidad de representaciones, contribuciones y bitplo de contribuciones, buscaremos desentrañar patrones significativos en cómo cada país se presenta y contribuye a su respectivo ámbito. Este enfoque nos permitirá identificar variaciones entre los países.

Al profundizar en el análisis de la variable “country”, se revela la complejidad de las pruebas, como el Análisis de Componentes Múltiples (ACM) y el bitplo ACM, nos permiten visualizar y comprender cómo cada país se posiciona en relación con las métricas de calidad de representación y contribuciones. A través del análisis de estas variables, emergen patrones que reflejan la diversidad en la forma en que los países presentan sus datos, también la variabilidad conclusion

ACM: La tabla ayuda a entender qué cantidad de información (varianza) se retiene al reducir la dimensionalidad de los datos usando ACP. Se puede observar que la parte de la varianza mas alta se concentra en el prime campo (dim 1, principalmente). Los últimos componentes principales contribuyen muy poco a la varianza total. Esto sugiere que la reducción de la dimensionalidad a un número menor de componentes principales, manteniendo una alta proporción de la varianza, podría ser posible sin una pérdida significativa de información. El biplot del Análisis de Componentes Múltiples (ACM) ofrece una representación visual clara de las interrelaciones entre las diversas observaciones (las cinco variables) y la variable categórica “country”. Al analizar la distribución de los puntos y los vectores en la gráfica, se pueden identificar patrones relevantes en los datos. Los puntos que se agrupan indican que comparten características comunes, mientras que la dirección y longitud de los vectores revelan cuáles variables ejercen mayor influencia. Un vector largo que se orienta hacia un grupo particular de puntos sugiere que esa variable desempeña un papel significativo en el análisis.

La calidad de representación se manifiesta en un plano que ilustra las relaciones entre las variables, utilizando un concepto de proximidad para destacar cómo se agrupan los nombres de la variable “country” junto con los de “code_type”. Esta visualización permite observar la cercanía entre los diferentes grupos, revelando el grado de relación que existe entre estas variables cualitativas. Cuanto más próximos estén los nombres en el gráfico, mayor será la similitud en sus características y comportamientos. Así, esta representación no solo facilita la identificación de patrones y agrupaciones significativas, sino que también proporciona una comprensión más clara de cómo interactúan estas variables en el contexto del análisis. El gráfico de contribuciones del Análisis de Componentes Múltiples (ACM) es súper útil para entender qué variables tienen más peso en la primera dimensión del análisis. Básicamente, te muestra cuáles factores realmente importan y cómo están relacionados entre sí. Esto ayuda a tener una idea más clara de qué está influyendo más en los datos y, a partir de ahí, decidir en qué enfocarse. Es una herramienta muy práctica porque te permite priorizar lo importante y planear estrategias o investigaciones basadas en lo que realmente está moviendo los resultados. Bitplo de contribuciones: Esta pestaña refleja aspectos similares a los presentados en la sección de calidad de representación, ya que también ilustra las contribuciones y las relaciones entre las variables dentro del conjunto de datos. Al analizar esta información, se puede apreciar cómo cada variable interactúa con las demás y qué tan influyentes son en el contexto general del análisis. Esta visualización permite identificar no solo la fuerza de estas relaciones, sino también su relevancia en la interpretación de los datos.

Resumen Variables Cuantitativas

summary(Dataset$Votes)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   33.00   41.00   57.00   99.39  101.00 2130.00
summary(Dataset$Comments)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    1.00   11.00   19.00   30.67   33.00  749.00
summary(Dataset$Views)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##     582    3898    7429   12347   13469  345590
summary(Dataset$Forks)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##     1.0    23.0    52.0   151.6   122.0  9879.0

Resumen Variables Cualitativas

Code_Type
table(Dataset$Code_Type)
## 
## Notebook   Script 
##      581      376
prop.table(table(Dataset$Code_Type))
## 
##  Notebook    Script 
## 0.6071055 0.3928945
barplot(table(Dataset$Code_Type))

Language
table(Dataset$Language)
## 
## markdown   Python        R   SQLite 
##      144      718       94        1
prop.table(table(Dataset$Language))
## 
##    markdown      Python           R      SQLite 
## 0.150470219 0.750261233 0.098223615 0.001044932
barplot(table(Dataset$Language))

Country
table(Dataset$Country)
## 
##     Argentina     Australia    Bangladesh       Belgium        Brazil 
##            13            27            29             7            32 
##        Canada         China       England        France       Germany 
##            25            18            85            31           103 
##         India        Israel       Lebanon   Netherlands        Norway 
##           109            16            10            13            13 
##        Poland      Portugal        Russia  South Africa         Spain 
##            28            13            23             8            40 
##        Taiwan       Ukraine United States       Vietnam 
##             6            30           271             7
prop.table(table(Dataset$Country))
## 
##     Argentina     Australia    Bangladesh       Belgium        Brazil 
##   0.013584117   0.028213166   0.030303030   0.007314525   0.033437827 
##        Canada         China       England        France       Germany 
##   0.026123302   0.018808777   0.088819227   0.032392894   0.107628004 
##         India        Israel       Lebanon   Netherlands        Norway 
##   0.113897597   0.016718913   0.010449321   0.013584117   0.013584117 
##        Poland      Portugal        Russia  South Africa         Spain 
##   0.029258098   0.013584117   0.024033438   0.008359457   0.041797283 
##        Taiwan       Ukraine United States       Vietnam 
##   0.006269592   0.031347962   0.283176594   0.007314525
barplot(table(Dataset$Country))

Diagramas de Dispersión Variables Cuantitativas

pairs(~Comments + Views + Votes + Forks, data = Dataset_Muestreado3)

Formulación del modelo de RLM entre las variables de estudio

En el presente estudio, se analizará un conjunto de datos que incluye variables cuantitativas y variables cualitativas clasificadoras. El objetivo principal es realizar un análisis descriptivo y aplicar un análisis de varianza (ANOVA) para el modelo de regresión lineal múltiple (RLM) total. Se calcularán los coeficientes del modelo RLM total para comprender la relación entre las variables y, posteriormente, se depurará el modelo para obtener los coeficientes del modelo RLM ajustado. Este enfoque permitirá identificar los factores significativos que influyen en la variable dependiente y proporcionará una visión clara de la estructura del conjunto de datos.

El análisis de los datos se centrará en las variables cuantitativas, las cuales permitirán evaluar numéricamente las relaciones existentes entre las distintas observaciones. A través del modelo de regresión lineal múltiple (RLM) total, se llevará a cabo un análisis de varianza (ANOVA) que facilitará la identificación de diferencias significativas entre los grupos definidos por las variables cualitativas clasificadoras. Este proceso no solo permitirá calcular los coeficientes del modelo RLM total, sino que también se procederá a depurar el modelo para optimizar su precisión y relevancia. Al obtener los coeficientes del modelo RLM depurado, se espera poder ofrecer una interpretación más clara y fundamentada de cómo las variables independientes impactan en la variable dependiente estudiada.

conclusion

Resumen y anova: Este muestra los coeficientes y que factores son significativas para seguir el estudio, teniendo en cuenta que las variables cauantitativas y las cualitativas para tomarlas en cuente las debe convertir en factor

Corficientes del modelo RLM: El número de comentarios (Comments) parece ser el factor que más contribuye positivamente a los votos. Un incremento de una unidad en Comments está asociado con un aumento promedio de 1.90485895 en Votes. Algunas categorías específicas de Country y Code_Type parecen influir negativamente en la cantidad de votos, lo que podría indicar sesgos en la audiencia.

Coeficientes del modelo reducido - Comments y Views tienen un efecto positivo en los votos, siendo Comments el factor con mayor impacto. - Forks tiene un efecto negativo en los votos, aunque el impacto es pequeño. - El tipo de código (Code_Type) juega un papel importante, y ser del tipo Script reduce significativamente los votos en comparación con el nivel de referencia.

Resumen y ANOVA del Modelo RLM Total

summary(lm(Dataset$Votes~Dataset$Comments+Dataset$Views+Dataset$Forks+as.factor(Dataset$Code_Type)+as.factor(Dataset$Language)+as.factor(Dataset$Country)))
## 
## Call:
## lm(formula = Dataset$Votes ~ Dataset$Comments + Dataset$Views + 
##     Dataset$Forks + as.factor(Dataset$Code_Type) + as.factor(Dataset$Language) + 
##     as.factor(Dataset$Country))
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -270.10  -26.19   -3.48   20.11  553.86 
## 
## Coefficients:
##                                           Estimate Std. Error t value Pr(>|t|)
## (Intercept)                              7.717e+01  1.952e+01   3.954 8.27e-05
## Dataset$Comments                         1.904e+00  7.126e-02  26.718  < 2e-16
## Dataset$Views                            2.976e-03  1.914e-04  15.548  < 2e-16
## Dataset$Forks                           -3.494e-02  6.950e-03  -5.027 5.97e-07
## as.factor(Dataset$Code_Type)Script      -2.961e+01  5.156e+00  -5.743 1.26e-08
## as.factor(Dataset$Language)Python       -1.935e+01  7.082e+00  -2.732  0.00641
## as.factor(Dataset$Language)R            -3.778e+01  8.806e+00  -4.291 1.97e-05
## as.factor(Dataset$Language)SQLite       -1.530e+01  6.400e+01  -0.239  0.81109
## as.factor(Dataset$Country)Australia     -4.855e+01  2.150e+01  -2.258  0.02416
## as.factor(Dataset$Country)Bangladesh    -2.973e+01  2.123e+01  -1.401  0.16166
## as.factor(Dataset$Country)Belgium       -5.786e+01  2.982e+01  -1.940  0.05266
## as.factor(Dataset$Country)Brazil        -6.035e+01  2.094e+01  -2.882  0.00405
## as.factor(Dataset$Country)Canada        -5.849e+01  2.173e+01  -2.692  0.00724
## as.factor(Dataset$Country)China         -9.701e+00  2.311e+01  -0.420  0.67480
## as.factor(Dataset$Country)England       -3.770e+01  1.896e+01  -1.988  0.04711
## as.factor(Dataset$Country)France        -3.529e+01  2.101e+01  -1.679  0.09341
## as.factor(Dataset$Country)Germany       -3.723e+01  1.869e+01  -1.992  0.04670
## as.factor(Dataset$Country)India         -3.431e+01  1.867e+01  -1.838  0.06638
## as.factor(Dataset$Country)Israel        -6.016e+01  2.372e+01  -2.537  0.01136
## as.factor(Dataset$Country)Lebanon       -6.148e+01  2.672e+01  -2.301  0.02163
## as.factor(Dataset$Country)Netherlands   -4.968e+01  2.497e+01  -1.990  0.04691
## as.factor(Dataset$Country)Norway        -5.715e+01  2.492e+01  -2.293  0.02206
## as.factor(Dataset$Country)Poland        -3.466e+01  2.134e+01  -1.624  0.10465
## as.factor(Dataset$Country)Portugal      -4.953e+01  2.489e+01  -1.989  0.04694
## as.factor(Dataset$Country)Russia        -3.942e+01  2.209e+01  -1.785  0.07464
## as.factor(Dataset$Country)South Africa  -5.441e+00  2.858e+01  -0.190  0.84907
## as.factor(Dataset$Country)Spain         -3.561e+01  2.028e+01  -1.755  0.07954
## as.factor(Dataset$Country)Taiwan        -4.302e+01  3.151e+01  -1.365  0.17247
## as.factor(Dataset$Country)Ukraine       -2.964e+01  2.112e+01  -1.403  0.16084
## as.factor(Dataset$Country)United States -3.508e+01  1.808e+01  -1.940  0.05264
## as.factor(Dataset$Country)Vietnam       -7.115e+01  2.993e+01  -2.377  0.01766
##                                            
## (Intercept)                             ***
## Dataset$Comments                        ***
## Dataset$Views                           ***
## Dataset$Forks                           ***
## as.factor(Dataset$Code_Type)Script      ***
## as.factor(Dataset$Language)Python       ** 
## as.factor(Dataset$Language)R            ***
## as.factor(Dataset$Language)SQLite          
## as.factor(Dataset$Country)Australia     *  
## as.factor(Dataset$Country)Bangladesh       
## as.factor(Dataset$Country)Belgium       .  
## as.factor(Dataset$Country)Brazil        ** 
## as.factor(Dataset$Country)Canada        ** 
## as.factor(Dataset$Country)China            
## as.factor(Dataset$Country)England       *  
## as.factor(Dataset$Country)France        .  
## as.factor(Dataset$Country)Germany       *  
## as.factor(Dataset$Country)India         .  
## as.factor(Dataset$Country)Israel        *  
## as.factor(Dataset$Country)Lebanon       *  
## as.factor(Dataset$Country)Netherlands   *  
## as.factor(Dataset$Country)Norway        *  
## as.factor(Dataset$Country)Poland           
## as.factor(Dataset$Country)Portugal      *  
## as.factor(Dataset$Country)Russia        .  
## as.factor(Dataset$Country)South Africa     
## as.factor(Dataset$Country)Spain         .  
## as.factor(Dataset$Country)Taiwan           
## as.factor(Dataset$Country)Ukraine          
## as.factor(Dataset$Country)United States .  
## as.factor(Dataset$Country)Vietnam       *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 63.42 on 926 degrees of freedom
## Multiple R-squared:  0.8103, Adjusted R-squared:  0.8041 
## F-statistic: 131.8 on 30 and 926 DF,  p-value: < 2.2e-16

Coeficientes del Modelo RLM Total

coefficients(lm(Dataset$Votes~Dataset$Comments+Dataset$Views+Dataset$Forks+as.factor(Dataset$Code_Type)+as.factor(Dataset$Language)+as.factor(Dataset$Country)))
##                             (Intercept)                        Dataset$Comments 
##                             77.16720104                              1.90405895 
##                           Dataset$Views                           Dataset$Forks 
##                              0.00297632                             -0.03494092 
##      as.factor(Dataset$Code_Type)Script       as.factor(Dataset$Language)Python 
##                            -29.60954671                            -19.35198089 
##            as.factor(Dataset$Language)R       as.factor(Dataset$Language)SQLite 
##                            -37.78336149                            -15.30198108 
##     as.factor(Dataset$Country)Australia    as.factor(Dataset$Country)Bangladesh 
##                            -48.55479575                            -29.73372467 
##       as.factor(Dataset$Country)Belgium        as.factor(Dataset$Country)Brazil 
##                            -57.86493529                            -60.34814058 
##        as.factor(Dataset$Country)Canada         as.factor(Dataset$Country)China 
##                            -58.49423708                             -9.70116335 
##       as.factor(Dataset$Country)England        as.factor(Dataset$Country)France 
##                            -37.69854863                            -35.29060596 
##       as.factor(Dataset$Country)Germany         as.factor(Dataset$Country)India 
##                            -37.22967472                            -34.30764260 
##        as.factor(Dataset$Country)Israel       as.factor(Dataset$Country)Lebanon 
##                            -60.15906269                            -61.48134464 
##   as.factor(Dataset$Country)Netherlands        as.factor(Dataset$Country)Norway 
##                            -49.67554458                            -57.15233261 
##        as.factor(Dataset$Country)Poland      as.factor(Dataset$Country)Portugal 
##                            -34.66318276                            -49.52617638 
##        as.factor(Dataset$Country)Russia  as.factor(Dataset$Country)South Africa 
##                            -39.41881745                             -5.44060608 
##         as.factor(Dataset$Country)Spain        as.factor(Dataset$Country)Taiwan 
##                            -35.60605924                            -43.01642695 
##       as.factor(Dataset$Country)Ukraine as.factor(Dataset$Country)United States 
##                            -29.63660617                            -35.07722205 
##       as.factor(Dataset$Country)Vietnam 
##                            -71.14915784

Coeficientes del Modelo RLM Reducido

coefficients(lm(Dataset$Votes~Dataset$Comments+Dataset$Views+Dataset$Forks+as.factor(Dataset$Code_Type)))
##                        (Intercept)                   Dataset$Comments 
##                       18.195429766                        1.932182162 
##                      Dataset$Views                      Dataset$Forks 
##                        0.002993868                       -0.037476669 
## as.factor(Dataset$Code_Type)Script 
##                      -23.800366384

Análisis del modelo RLM

En este estudio, se analizará un conjunto de datos que incluye variables cuantitativas y variables cualitativas clasificadoras, con el objetivo de identificar el mejor modelo mediante un proceso iterativo basado en el Índice de Calidad Total (ICT). Se evaluarán las bondades del estudio significativo, así como los criterios de información para la comparación de modelos. Este enfoque permitirá seleccionar el modelo que no solo se ajuste adecuadamente a los datos, sino que también ofrezca una interpretación clara y fundamentada de las relaciones entre las variables. A través de este análisis, se espera contribuir a una comprensión más precisa de los factores que influyen en la variable dependiente, optimizando así la interpretación de los resultados.

El análisis se centrará en seleccionar el modelo más adecuado utilizando únicamente variables cuantitativas y cualitativas clasificadoras. Para ello, se empleará un enfoque iterativo basado en el Índice de Calidad Total (ICT), evaluando distintas opciones de modelado para identificar la que ofrezca el mejor equilibrio entre ajuste y relevancia estadística. Además, se utilizarán criterios de información para comparar los modelos, asegurando una evaluación completa y objetiva. Este procedimiento no solo permitirá una selección sólida del modelo, sino que también aportará información valiosa sobre cómo las variables se relacionan entre sí y cómo influyen en la variable dependiente.

conclusion

Mejor modelo iterado

el modelo final recomendado por este análisis stepwise, basado en el AIC, es aquel que incluye Dataset\(Comments, Dataset\)Views, Dataset\(Forks, Dataset\)Code_Type y Dataset\(Language como predictores de Dataset\)Votes, excluyendo Dataset$Country. La tabla muestra el Sum of Squares, RSS y AIC para cada paso y la inclusión/exclusión de cada variable. este modelo sugiere que mientras más comentarios se tengan, mayor será la predicción positiva sobre la variable dependiente, pero ciertos lenguajes y tipos de código tienen efectos negativos significativos sobre ella, siendo R y Script los que más reducen su valor esperado.

Bondades de ajustes

Los resultados sugieren que existe una relación significativa entre las variables independientes y la variable dependiente analizada. En particular, la cantidad de comentarios y votos parecen influir en el modelo de manera notable. Además, el uso de diferentes lenguajes de programación y estructuras de base de datos también se considera en la evaluación del modelo, lo que indica que las preferencias y elecciones de lenguaje pueden tener un impacto en el comportamiento observado en la variable dependiente. Se recomienda un análisis adicional para explorar estas relaciones en profundidad y considerar otros factores que podrían influir en los resultados. Basándonos en los valores AIC y BIC presentados para tres modelos diferentes (modelo_RLM_TOTAL, modelo_RLM_REDUCIDO y modelo_Iterado_STEP), se observa que el modelo_RLM_TOTAL presenta los valores AIC y BIC más bajos. Esto sugiere que, según estos criterios de información, el modelo_RLM_TOTAL es el modelo que mejor se ajusta a los datos, penalizando la complejidad del modelo. A pesar de que el modelo_Iterado_STEP tiene un AIC ligeramente inferior al modelo_RLM_REDUCIDO, ambos presentan valores AIC y BIC significativamente superiores al modelo_RLM_TOTAL. Por lo tanto, se recomienda el modelo_RLM_TOTAL como el mejor modelo entre los tres evaluados.

Mejor Modelo Iterado según AIC

modelo_Iterado_STEP = step(lm(Dataset$Votes~Dataset$Comments+Dataset$Views+Dataset$Forks+as.factor(Dataset$Code_Type)+as.factor(Dataset$Language)+as.factor(Dataset$Country)))
## Start:  AIC=7973.23
## Dataset$Votes ~ Dataset$Comments + Dataset$Views + Dataset$Forks + 
##     as.factor(Dataset$Code_Type) + as.factor(Dataset$Language) + 
##     as.factor(Dataset$Country)
## 
##                                Df Sum of Sq     RSS    AIC
## - as.factor(Dataset$Country)   23    112017 3836738 7955.6
## <none>                                      3724721 7973.2
## - as.factor(Dataset$Language)   3     74184 3798905 7986.1
## - Dataset$Forks                 1    101663 3826384 7997.0
## - as.factor(Dataset$Code_Type)  1    132665 3857386 8004.7
## - Dataset$Views                 1    972350 4697071 8193.2
## - Dataset$Comments              1   2871471 6596192 8518.2
## 
## Step:  AIC=7955.59
## Dataset$Votes ~ Dataset$Comments + Dataset$Views + Dataset$Forks + 
##     as.factor(Dataset$Code_Type) + as.factor(Dataset$Language)
## 
##                                Df Sum of Sq     RSS    AIC
## <none>                                      3836738 7955.6
## - as.factor(Dataset$Language)   3     78442 3915180 7969.0
## - Dataset$Forks                 1    108392 3945129 7980.2
## - as.factor(Dataset$Code_Type)  1    137680 3974418 7987.3
## - Dataset$Views                 1   1017722 4854459 8178.7
## - Dataset$Comments              1   2971539 6808277 8502.4
coefficients(modelo_Iterado_STEP)
##                        (Intercept)                   Dataset$Comments 
##                        39.60773061                         1.90836196 
##                      Dataset$Views                      Dataset$Forks 
##                         0.00298039                        -0.03558517 
## as.factor(Dataset$Code_Type)Script  as.factor(Dataset$Language)Python 
##                       -29.80324069                       -19.51339911 
##       as.factor(Dataset$Language)R  as.factor(Dataset$Language)SQLite 
##                       -38.55885966                       -15.28883919

Bondades de Ajuste, Significancias y Criterios de Información Comparados

modelo_RLM_TOTAL = lm(Dataset$Comments~Dataset$Views+Dataset$Votes+Dataset$Forks+as.factor(Dataset$Code_Type)+as.factor(Dataset$Language))

modelo_RLM_REDUCIDO = lm(Dataset$Votes~Dataset$Comments+Dataset$Views+Dataset$Forks+as.factor(Dataset$Code_Type))

stargazer(modelo_RLM_TOTAL, modelo_RLM_REDUCIDO, modelo_Iterado_STEP, type = "text", df = TRUE)
## 
## ==============================================================================================
##                                                Dependent variable:                            
##                     --------------------------------------------------------------------------
##                             Comments                               Votes                      
##                               (1)                      (2)                      (3)           
## ----------------------------------------------------------------------------------------------
## Comments                                             1.932***                 1.908***        
##                                                      (0.071)                  (0.070)         
##                                                                                               
## Views                        0.0001                  0.003***                 0.003***        
##                             (0.0001)                 (0.0002)                 (0.0002)        
##                                                                                               
## Votes                       0.229***                                                          
##                             (0.008)                                                           
##                                                                                               
## Forks                       0.018***                -0.037***                -0.036***        
##                             (0.002)                  (0.007)                  (0.007)         
##                                                                                               
## Code_Type)Script            5.030***                -23.800***               -29.803***       
##                             (1.792)                  (4.333)                  (5.107)         
##                                                                                               
## Language)Python              2.528                                           -19.513***       
##                             (2.434)                                           (7.007)         
##                                                                                               
## Language)R                   3.391                                           -38.559***       
##                             (3.061)                                           (8.759)         
##                                                                                               
## Language)SQLite              -8.476                                           -15.289         
##                             (22.094)                                          (63.825)        
##                                                                                               
## Constant                     0.028                  18.195***                39.608***        
##                             (2.687)                  (3.057)                  (7.654)         
##                                                                                               
## ----------------------------------------------------------------------------------------------
## Observations                  957                      957                      957           
## R2                           0.771                    0.801                    0.805          
## Adjusted R2                  0.770                    0.800                    0.803          
## Residual Std. Error    22.012 (df = 949)        64.129 (df = 952)        63.584 (df = 949)    
## F Statistic         457.584*** (df = 7; 949) 955.437*** (df = 4; 952) 558.142*** (df = 7; 949)
## ==============================================================================================
## Note:                                                              *p<0.1; **p<0.05; ***p<0.01
AIC(modelo_RLM_TOTAL, modelo_RLM_REDUCIDO, modelo_Iterado_STEP)
##                     df       AIC
## modelo_RLM_TOTAL     9  8643.113
## modelo_RLM_REDUCIDO  6 10686.804
## modelo_Iterado_STEP  9 10673.436
BIC(modelo_RLM_TOTAL, modelo_RLM_REDUCIDO, modelo_Iterado_STEP)
##                     df       BIC
## modelo_RLM_TOTAL     9  8686.887
## modelo_RLM_REDUCIDO  6 10715.987
## modelo_Iterado_STEP  9 10717.210

5.4. Regresión Logística Simple

En esta fase regresión logística simple se busca examinar la relación entre una variable dependiente dicotómica (binaria) y una o más variables independientes. Este tipo de análisis es particularmente útil cuando se desea predecir la probabilidad de que ocurra un evento, como la presencia o ausencia de una característica; con esto se busca modelar esta relación para comprender cómo las variables de estudio afectan las probabilidades de un resultado determinado. El proceso comienza con un análisis estadístico preliminar de los datos, que incluye la obtención de resúmenes descriptivos y gráficos. A través de estos, se evalúa la distribución de las variables y se identifican posibles problemas en los datos, como valores atípicos o sesgos.

Para realizar una conclusión adecuada sobre esta sección, es importante comprender brevemente los pasos realizados en el análisis de Regresión Logística Simple. En primer lugar, se obtiene un resumen estadístico de las variables de estudio, lo que permite explorar las características de los datos y detectar posibles problemas como valores atípicos. Luego, se formula el modelo de RLogS, que establece la relación entre las variables independientes y la probabilidad del evento de interés. A continuación, se utilizan diagramas de cajas para visualizar la dispersión de los datos y detectar posibles valores extremos que puedan influir en el modelo. Además, se complementa el análisis con diagramas de barras que permiten examinar la distribución de las variables categóricas, y histogramas para estudiar la distribución de las variables continuas. Estos pasos permiten validar el modelo, interpretar los resultados de manera efectiva y asegurar que los datos sean adecuados para el análisis, garantizando así la robustez y fiabilidad del modelo de regresión logística simple.   conclusion

Luego de realizar los diferentes estudios para cada pestaña en esta fase, se puede decir de cada una de estas lo siguiente; El Resumen estadístico de las variables de estudio El diagrama de caja, combinado con el resumen estadístico de la variable “Comments”, confirma una fuerte presencia de valores extremos en los datos situacion antes presentada en la sección 1.3, solo que adiferencia del estudio realizado en esta seccion se sabe que el valor máximo de 749 se encuentra muy alejado de la media (41.08) y del tercer cuartil (31.00), lo que refuerza la identificación de valores atípicos que podrían influir significativamente en el análisis. En cuanto al histograma de Comments refuerza las observaciones derivadas del análisis estadístico y del diagrama de caja antes realizado, mostrando una distribución altamente sesgada hacia la izquierda. La mayor parte de las observaciones se concentran en valores bajos, específicamente entre 0 y 50, como lo evidencia la barra más alta en el histograma. Esto coincide con el primer cuartil (11.50) y la mediana (20.00), lo que indica que la mayoría de los kernels depositados en nuestro conjunto de datos tienen pocos comentarios. En cuanto a el análisis del diagrama de barras Muestra que el tipo de codigo Notebooks se utilizan con mayor frecuencia en comparación con los Scripts en este contexto, lo que podría reflejar una preferencia general de los usuarios por este formato debido a sus ventajas para tareas específicas, como la visualización de resultados o la integración de texto y código; diferente a este, el Resumen y Diagrama de Cajas Conjunto muestra que aunque ambos formatos tienen distribuciones similares en términos de sus valores centrales, los Notebooks tienden a tener más variabilidad y valores atípicos extremos en comparación con los Scripts. Esto podría indicar que los Notebooks son más propensos a registrar valores altos en ciertas situaciones específicas.

Resumen estadístico de las variables de estudio

En esta fase regresión logística simple se busca examinar la relación entre una variable dependiente dicotómica (binaria) y una o más variables independientes. Este tipo de análisis es particularmente útil cuando se desea predecir la probabilidad de que ocurra un evento, como la presencia o ausencia de una característica; con esto se busca modelar esta relación para comprender cómo las variables de estudio afectan las probabilidades de un resultado determinado. El proceso comienza con un análisis estadístico preliminar de los datos, que incluye la obtención de resúmenes descriptivos y gráficos. A través de estos, se evalúa la distribución de las variables y se identifican posibles problemas en los datos, como valores atípicos o sesgos.

Para realizar una conclusión adecuada sobre esta sección, es importante comprender brevemente los pasos realizados en el análisis de Regresión Logística Simple. En primer lugar, se obtiene un resumen estadístico de las variables de estudio, lo que permite explorar las características de los datos y detectar posibles problemas como valores atípicos. Luego, se formula el modelo de RLogS, que establece la relación entre las variables independientes y la probabilidad del evento de interés. A continuación, se utilizan diagramas de cajas para visualizar la dispersión de los datos y detectar posibles valores extremos que puedan influir en el modelo. Además, se complementa el análisis con diagramas de barras que permiten examinar la distribución de las variables categóricas, y histogramas para estudiar la distribución de las variables continuas. Estos pasos permiten validar el modelo, interpretar los resultados de manera efectiva y asegurar que los datos sean adecuados para el análisis, garantizando así la robustez y fiabilidad del modelo de regresión logística simple.   conclusion

Luego de realizar los diferentes estudios para cada pestaña en esta fase, se puede decir de cada una de estas lo siguiente; El Resumen estadístico de las variables de estudio El diagrama de caja, combinado con el resumen estadístico de la variable “votes”, confirma una fuerte presencia de valores extremos en los datos situacion antes presentada en la sección 1.3, solo que adiferencia del estudio realizado en esta seccion se sabe que el valor máximo de 2130 se encuentra muy alejado de la media (127.6) y del tercer cuartil (92.5), lo que refuerza la identificación de valores atípicos que podrían influir significativamente en el análisis. En cuanto al histograma de votes refuerza las observaciones derivadas del análisis estadístico y del diagrama de caja antes realizado, mostrando una distribución altamente sesgada hacia la izquierda. La mayor parte de las observaciones se concentran en valores bajos, específicamente entre 0 y 50, como lo evidencia la barra más alta en el histograma. Esto coincide con el primer cuartil (40.5) y la mediana (57.00), lo que indica que la mayoría de los kernels depositados en nuestro conjunto de datos tienen pocos comentarios. En cuanto a el análisis del diagrama de barras Muestra que el tipo de codigo Notebooks se utilizan con mayor frecuencia en comparación con los Scripts en este contexto, lo que podría reflejar una preferencia general de los usuarios por este formato debido a sus ventajas para tareas específicas, como la visualización de resultados o la integración de texto y código; diferente a este, el Resumen y Diagrama de Cajas Conjunto muestra que aunque ambos formatos tienen distribuciones similares en términos de sus valores centrales, los Notebooks tienden a tener más variabilidad y valores atípicos extremos en comparación con los Scripts. Esto podría indicar que los Notebooks son más propensos a registrar valores altos en ciertas situaciones específicas.

Resumen y Boxplot de Votes

summary(Dataset_Muestreado3$Votes)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    33.0    40.5    57.0   127.6    92.5  2130.0
boxplot(Dataset_Muestreado3$Votes, main = "Diagrama de Caja de Votes", col = c("brown4"))

Histograma de Votes

summary(Dataset_Muestreado3$Votes)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    33.0    40.5    57.0   127.6    92.5  2130.0
hist(Dataset_Muestreado3$Votes, main = "Histograma de Votes", col = c("gold"))

Resumen y Diagrama de Barras de Code_Type

table(Dataset$Code_Type)
## 
## Notebook   Script 
##      581      376
prop.table(table(Dataset$Code_Type))
## 
##  Notebook    Script 
## 0.6071055 0.3928945
barplot(table(Dataset$Code_Type))

Resumen y Diagrama de Cajas Conjunto

tapply(Dataset$Votes, Dataset$Code_Type, mean)
## Notebook   Script 
## 108.8812  84.7367
tapply(Dataset$Votes, Dataset$Code_Type, median)
## Notebook   Script 
##       60       53
boxplot(Dataset_Muestreado3$Votes~Dataset_Muestreado3$Code_Type, main = "Boxplot Conjunto: Votes-Code_Type", col = c("orange", "gold"))

Formulación del modelo de RLogS entre las variables de estudio

En esta fase regresión logística simple se busca examinar la relación entre una variable dependiente dicotómica (binaria) y una o más variables independientes. Este tipo de análisis es particularmente útil cuando se desea predecir la probabilidad de que ocurra un evento, como la presencia o ausencia de una característica; con esto se busca modelar esta relación para comprender cómo las variables de estudio afectan las probabilidades de un resultado determinado. El proceso comienza con un análisis estadístico preliminar de los datos, que incluye la obtención de resúmenes descriptivos y gráficos. A través de estos, se evalúa la distribución de las variables y se identifican posibles problemas en los datos, como valores atípicos o sesgos.

En esta etapa, se emplean herramientas clave para la formulación del modelo de RLogS, como el cálculo de los coeficientes del modelo, que cuantifican la influencia de cada variable independiente en la probabilidad del evento de interés. Estos coeficientes permiten identificar la dirección y magnitud de los efectos, lo que facilita la interpretación de los resultados. Además, se realiza un resumen estadístico del modelo, que incluye métricas como el estadístico de verosimilitud y los valores p asociados a cada variable, ayudando a determinar su relevancia y significancia en el modelo. Estos pasos aseguran que el modelo sea matemáticamente robusto y estadísticamente válido, proporcionando una representación clara de las relaciones entre las variables de estudio y el evento analizado.   conclusion

En el estudio de Coeficientes del Modelo RLogS se muestra el coeficiente de **Dataset\(Votes** como negativo, de lo cual se puede inferir que un aumento en los votos está asociado con una disminución en la probabilidad de que ocurra el evento de interés (en este caso, el evento asociado a la variable Code_Type). Sin embargo, el valor absoluto del coeficiente es pequeño (-0.0016), lo que sugiere que el efecto de los votos sobre la probabilidad de que ocurra el evento es relativamente débil. Por otro lado,de el **Resumen Estadístico del Modelo RLogS** se puede extraer que el número de votos tiene una relación significativa con la probabilidad de que ocurra el evento de interés, dado que el coeficiente de Dataset\)Votes es negativo y su p-valor es menor que 0.05. Este resultado sugiere que, a medida que aumenta el número de votos, la probabilidad de que ocurra el evento de interés disminuye.El intercepto del modelo también es significativo y negativo, lo que indica que cuando el número de votos es cero, la probabilidad de que ocurra el evento es baja. Además, se observa que el AIC del modelo es 1278.7, lo que proporciona una medida de la bondad de ajuste del modelo. Un AIC más bajo generalmente indica un mejor ajuste, y este valor puede ser utilizado para comparar con otros modelos, aunque en este caso solo se presenta un modelo para la variable Code_Type.

Coeficientes del Modelo RLogS

Dataset$Code_Type <- as.factor(Dataset$Code_Type)
modelo_RLog_Simple = glm (Dataset$Code_Type~Dataset$Votes, family = "binomial", data = data.frame(Dataset$Code_Type, Dataset$Votes))
coef(modelo_RLog_Simple)
##   (Intercept) Dataset$Votes 
##  -0.285495547  -0.001586158

Resumen Estadístico del Modelo RLogS

Dataset$Language <- as.factor(Dataset$Language)
summary(modelo_RLog_Simple)
## 
## Call:
## glm(formula = Dataset$Code_Type ~ Dataset$Votes, family = "binomial", 
##     data = data.frame(Dataset$Code_Type, Dataset$Votes))
## 
## Coefficients:
##                 Estimate Std. Error z value Pr(>|z|)   
## (Intercept)   -0.2854955  0.0882906  -3.234  0.00122 **
## Dataset$Votes -0.0015862  0.0006517  -2.434  0.01494 * 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 1282.4  on 956  degrees of freedom
## Residual deviance: 1274.7  on 955  degrees of freedom
## AIC: 1278.7
## 
## Number of Fisher Scoring iterations: 4
modelo_RLog_Simple_S = glm(Dataset$Language~Dataset$Votes, family = "binomial", data = data.frame(Dataset$Language, Dataset$Votes))
summary(modelo_RLog_Simple_S)
## 
## Call:
## glm(formula = Dataset$Language ~ Dataset$Votes, family = "binomial", 
##     data = data.frame(Dataset$Language, Dataset$Votes))
## 
## Coefficients:
##                 Estimate Std. Error z value Pr(>|z|)    
## (Intercept)    1.8186523  0.1069357  17.007   <2e-16 ***
## Dataset$Votes -0.0008318  0.0005117  -1.625    0.104    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 810.62  on 956  degrees of freedom
## Residual deviance: 808.24  on 955  degrees of freedom
## AIC: 812.24
## 
## Number of Fisher Scoring iterations: 4

Análisis del modelo RLogS

En esta fase regresión logística simple se busca examinar la relación entre una variable dependiente dicotómica (binaria) y una o más variables independientes. Este tipo de análisis es particularmente útil cuando se desea predecir la probabilidad de que ocurra un evento, como la presencia o ausencia de una característica; con esto se busca modelar esta relación para comprender cómo las variables de estudio afectan las probabilidades de un resultado determinado. El proceso comienza con un análisis estadístico preliminar de los datos, que incluye la obtención de resúmenes descriptivos y gráficos. A través de estos, se evalúa la distribución de las variables y se identifican posibles problemas en los datos, como valores atípicos o sesgos.

En el análisis del modelo RLogS, se emplean procesos clave como la consideración de la Variable Predictora igual a Cero, las Probabilidades Estimadas y la Gráfica del Modelo RLogS. El primer método establece un punto de referencia al evaluar el modelo en condiciones iniciales, es decir, cuando las variables predictoras toman un valor de cero. Esto ayuda a identificar la probabilidad base de ocurrencia del evento estudiado. Por otro lado, las Probabilidades Estimadas se calculan para predecir la probabilidad de un evento en función de los valores de las variables independientes, proporcionando una medida numérica clave para la interpretación del modelo. Finalmente, la Gráfica del Modelo RLogS ofrece una representación visual que permite observar cómo varían las probabilidades en función de los cambios en las variables predictoras, facilitando la validación y comunicación de los resultados obtenidos.

conclusion

En el análisis realizado referente al apartado Variable Predictora igual a Cero, se observó que el número de votos tiene una relación negativa con la probabilidad de que ocurra el evento de interés (Code_Type = 1). Esto se refleja en el coeficiente de Dataset$Votes en log-odds, que es negativo (-0.001586), y en el odds ratio de 0.998415, que indica que, por cada incremento unitario en el número de votos, las odds de que ocurra el evento disminuyen en un 0.15%. Aunque este efecto es significativo, el odds ratio cercano a 1 sugiere que el impacto de los votos sobre la probabilidad de que ocurra el evento es débil. En resumen, el número de votos tiene una influencia negativa y pequeña sobre la probabilidad del evento de interés, pero la magnitud de este efecto es moderada. En analizar la pestaña Probabilidad Estimadas se observa que la probabilidad estimada comienza en 0.41633 y disminuye progresivamente hasta su menor valor de 0.02499; Este patrón sugiere una tendencia descendente en la probabilidad a lo largo de las observaciones, aunque la disminución es gradual y leve. además, Las probabilidades se mantienen bastante constantes en algunos intervalos, con pequeños descensos entre algunas observaciones lo que puede indicar que el modelo predice probabilidades similares a lo largo de una gran parte del rango de entrada.

Finalmente teniendo en cuenta que en la Gráfica del Modelo RLogS los puntos amarillos corresponden a los datos observados, mientras que la curva naranja ilustra las probabilidades predichas por el modelo. La forma casi horizontal de la curva sugiere que no hay una relación clara entre las visualizaciones y el tipo de código, indicando que las visualizaciones no parecen ser un factor determinante para predecir el tipo de código

Variable Predictora igual a Cero

coef(modelo_RLog_Simple)
##   (Intercept) Dataset$Votes 
##  -0.285495547  -0.001586158
round(exp(coef(modelo_RLog_Simple)),5)
##   (Intercept) Dataset$Votes 
##       0.75164       0.99842

Probabilidades Estimadas

round(suppressWarnings(predict(modelo_RLog_Simple, data.frame(seq(1, 400)), type = "response")),5)
##       1       2       3       4       5       6       7       8       9      10 
## 0.41633 0.41633 0.41633 0.41633 0.41633 0.41633 0.41633 0.41633 0.41633 0.41633 
##      11      12      13      14      15      16      17      18      19      20 
## 0.41633 0.41633 0.41633 0.41633 0.41633 0.41633 0.41595 0.41595 0.41595 0.41595 
##      21      22      23      24      25      26      27      28      29      30 
## 0.41595 0.41595 0.41595 0.41595 0.41595 0.41595 0.41595 0.41595 0.41595 0.41595 
##      31      32      33      34      35      36      37      38      39      40 
## 0.41595 0.41595 0.41595 0.41595 0.41595 0.41595 0.41595 0.41595 0.41595 0.41595 
##      41      42      43      44      45      46      47      48      49      50 
## 0.41595 0.41595 0.41595 0.41595 0.41595 0.41595 0.41595 0.41595 0.41595 0.41595 
##      51      52      53      54      55      56      57      58      59      60 
## 0.41595 0.41595 0.41556 0.41556 0.41556 0.41556 0.41556 0.41556 0.41556 0.41556 
##      61      62      63      64      65      66      67      68      69      70 
## 0.41556 0.41556 0.41556 0.41556 0.41556 0.41556 0.41556 0.41556 0.41556 0.41556 
##      71      72      73      74      75      76      77      78      79      80 
## 0.41556 0.41556 0.41556 0.41556 0.41556 0.41556 0.41556 0.41556 0.41556 0.41556 
##      81      82      83      84      85      86      87      88      89      90 
## 0.41556 0.41556 0.41556 0.41556 0.41518 0.41518 0.41518 0.41518 0.41518 0.41518 
##      91      92      93      94      95      96      97      98      99     100 
## 0.41518 0.41518 0.41518 0.41518 0.41518 0.41518 0.41518 0.41518 0.41518 0.41518 
##     101     102     103     104     105     106     107     108     109     110 
## 0.41518 0.41518 0.41518 0.41518 0.41518 0.41518 0.41518 0.41479 0.41479 0.41479 
##     111     112     113     114     115     116     117     118     119     120 
## 0.41479 0.41479 0.41479 0.41479 0.41479 0.41479 0.41479 0.41479 0.41479 0.41479 
##     121     122     123     124     125     126     127     128     129     130 
## 0.41479 0.41479 0.41479 0.41479 0.41479 0.41479 0.41479 0.41479 0.41479 0.41479 
##     131     132     133     134     135     136     137     138     139     140 
## 0.41479 0.41479 0.41479 0.41479 0.41479 0.41479 0.41479 0.41479 0.41479 0.41441 
##     141     142     143     144     145     146     147     148     149     150 
## 0.41441 0.41441 0.41441 0.41441 0.41441 0.41441 0.41441 0.41441 0.41441 0.41441 
##     151     152     153     154     155     156     157     158     159     160 
## 0.41441 0.41441 0.41441 0.41441 0.41441 0.41441 0.41441 0.41441 0.41441 0.41441 
##     161     162     163     164     165     166     167     168     169     170 
## 0.41441 0.41441 0.41441 0.41441 0.41441 0.41441 0.41441 0.41441 0.41402 0.41402 
##     171     172     173     174     175     176     177     178     179     180 
## 0.41402 0.41402 0.41402 0.41402 0.41402 0.41402 0.41402 0.41402 0.41402 0.41402 
##     181     182     183     184     185     186     187     188     189     190 
## 0.41402 0.41402 0.41402 0.41402 0.41402 0.41402 0.41402 0.41402 0.41402 0.41402 
##     191     192     193     194     195     196     197     198     199     200 
## 0.41364 0.41364 0.41364 0.41364 0.41364 0.41364 0.41364 0.41364 0.41364 0.41364 
##     201     202     203     204     205     206     207     208     209     210 
## 0.41364 0.41364 0.41364 0.41364 0.41364 0.41364 0.41364 0.41364 0.41364 0.41364 
##     211     212     213     214     215     216     217     218     219     220 
## 0.41364 0.41364 0.41364 0.41364 0.41364 0.41364 0.41364 0.41364 0.41364 0.41325 
##     221     222     223     224     225     226     227     228     229     230 
## 0.41325 0.41325 0.41325 0.41325 0.41325 0.41325 0.41325 0.41325 0.41325 0.41325 
##     231     232     233     234     235     236     237     238     239     240 
## 0.41325 0.41325 0.41325 0.41325 0.41325 0.41325 0.41325 0.41325 0.41325 0.41325 
##     241     242     243     244     245     246     247     248     249     250 
## 0.41287 0.41287 0.41287 0.41287 0.41287 0.41287 0.41287 0.41287 0.41287 0.41287 
##     251     252     253     254     255     256     257     258     259     260 
## 0.41287 0.41287 0.41287 0.41287 0.41287 0.41249 0.41249 0.41249 0.41249 0.41249 
##     261     262     263     264     265     266     267     268     269     270 
## 0.41249 0.41249 0.41249 0.41249 0.41249 0.41249 0.41249 0.41249 0.41249 0.41249 
##     271     272     273     274     275     276     277     278     279     280 
## 0.41210 0.41210 0.41210 0.41210 0.41210 0.41210 0.41210 0.41210 0.41210 0.41210 
##     281     282     283     284     285     286     287     288     289     290 
## 0.41210 0.41210 0.41210 0.41210 0.41210 0.41210 0.41172 0.41172 0.41172 0.41172 
##     291     292     293     294     295     296     297     298     299     300 
## 0.41172 0.41172 0.41172 0.41172 0.41172 0.41172 0.41172 0.41172 0.41172 0.41172 
##     301     302     303     304     305     306     307     308     309     310 
## 0.41172 0.41172 0.41172 0.41133 0.41133 0.41133 0.41133 0.41133 0.41133 0.41133 
##     311     312     313     314     315     316     317     318     319     320 
## 0.41133 0.41133 0.41133 0.41133 0.41133 0.41133 0.41133 0.41133 0.41133 0.41133 
##     321     322     323     324     325     326     327     328     329     330 
## 0.41133 0.41133 0.41133 0.41133 0.41133 0.41133 0.41095 0.41095 0.41095 0.41095 
##     331     332     333     334     335     336     337     338     339     340 
## 0.41095 0.41095 0.41095 0.41095 0.41095 0.41095 0.41095 0.41095 0.41095 0.41056 
##     341     342     343     344     345     346     347     348     349     350 
## 0.41056 0.41056 0.41056 0.41056 0.41056 0.41056 0.41056 0.41056 0.41056 0.41056 
##     351     352     353     354     355     356     357     358     359     360 
## 0.41056 0.41018 0.41018 0.41018 0.41018 0.41018 0.41018 0.41018 0.41018 0.41018 
##     361     362     363     364     365     366     367     368     369     370 
## 0.41018 0.41018 0.41018 0.41018 0.41018 0.41018 0.41018 0.41018 0.40980 0.40980 
##     371     372     373     374     375     376     377     378     379     380 
## 0.40980 0.40980 0.40980 0.40980 0.40980 0.40980 0.40980 0.40980 0.40980 0.40980 
##     381     382     383     384     385     386     387     388     389     390 
## 0.40980 0.40980 0.40980 0.40980 0.40980 0.40980 0.40980 0.40980 0.40980 0.40980 
##     391     392     393     394     395     396     397     398     399     400 
## 0.40980 0.40980 0.40980 0.40980 0.40941 0.40941 0.40941 0.40941 0.40941 0.40941 
##     401     402     403     404     405     406     407     408     409     410 
## 0.40941 0.40941 0.40941 0.40941 0.40941 0.40941 0.40941 0.40903 0.40903 0.40903 
##     411     412     413     414     415     416     417     418     419     420 
## 0.40903 0.40903 0.40903 0.40903 0.40903 0.40903 0.40903 0.40903 0.40903 0.40903 
##     421     422     423     424     425     426     427     428     429     430 
## 0.40903 0.40903 0.40903 0.40903 0.40865 0.40865 0.40865 0.40865 0.40865 0.40865 
##     431     432     433     434     435     436     437     438     439     440 
## 0.40865 0.40865 0.40865 0.40865 0.40865 0.40865 0.40865 0.40865 0.40865 0.40865 
##     441     442     443     444     445     446     447     448     449     450 
## 0.40865 0.40826 0.40826 0.40826 0.40826 0.40826 0.40826 0.40826 0.40826 0.40826 
##     451     452     453     454     455     456     457     458     459     460 
## 0.40826 0.40826 0.40788 0.40788 0.40788 0.40788 0.40788 0.40788 0.40788 0.40788 
##     461     462     463     464     465     466     467     468     469     470 
## 0.40788 0.40788 0.40788 0.40788 0.40788 0.40750 0.40750 0.40750 0.40750 0.40750 
##     471     472     473     474     475     476     477     478     479     480 
## 0.40750 0.40750 0.40750 0.40750 0.40750 0.40711 0.40711 0.40711 0.40711 0.40711 
##     481     482     483     484     485     486     487     488     489     490 
## 0.40711 0.40711 0.40711 0.40711 0.40711 0.40711 0.40711 0.40711 0.40711 0.40673 
##     491     492     493     494     495     496     497     498     499     500 
## 0.40673 0.40635 0.40635 0.40635 0.40635 0.40635 0.40635 0.40635 0.40635 0.40635 
##     501     502     503     504     505     506     507     508     509     510 
## 0.40635 0.40635 0.40635 0.40635 0.40597 0.40597 0.40597 0.40597 0.40597 0.40597 
##     511     512     513     514     515     516     517     518     519     520 
## 0.40597 0.40597 0.40597 0.40597 0.40597 0.40597 0.40558 0.40558 0.40558 0.40558 
##     521     522     523     524     525     526     527     528     529     530 
## 0.40558 0.40558 0.40558 0.40558 0.40558 0.40558 0.40520 0.40520 0.40520 0.40520 
##     531     532     533     534     535     536     537     538     539     540 
## 0.40520 0.40520 0.40520 0.40520 0.40520 0.40520 0.40520 0.40520 0.40482 0.40482 
##     541     542     543     544     545     546     547     548     549     550 
## 0.40482 0.40482 0.40482 0.40482 0.40482 0.40482 0.40482 0.40482 0.40482 0.40482 
##     551     552     553     554     555     556     557     558     559     560 
## 0.40482 0.40482 0.40482 0.40444 0.40444 0.40406 0.40406 0.40406 0.40367 0.40367 
##     561     562     563     564     565     566     567     568     569     570 
## 0.40367 0.40367 0.40367 0.40367 0.40367 0.40329 0.40329 0.40329 0.40291 0.40291 
##     571     572     573     574     575     576     577     578     579     580 
## 0.40291 0.40291 0.40291 0.40291 0.40291 0.40291 0.40253 0.40253 0.40253 0.40253 
##     581     582     583     584     585     586     587     588     589     590 
## 0.40253 0.40253 0.40215 0.40215 0.40215 0.40215 0.40215 0.40215 0.40215 0.40215 
##     591     592     593     594     595     596     597     598     599     600 
## 0.40177 0.40177 0.40177 0.40177 0.40177 0.40138 0.40138 0.40138 0.40138 0.40138 
##     601     602     603     604     605     606     607     608     609     610 
## 0.40138 0.40100 0.40100 0.40100 0.40100 0.40062 0.40062 0.40062 0.40062 0.40024 
##     611     612     613     614     615     616     617     618     619     620 
## 0.40024 0.40024 0.40024 0.40024 0.40024 0.40024 0.40024 0.40024 0.39986 0.39986 
##     621     622     623     624     625     626     627     628     629     630 
## 0.39986 0.39986 0.39986 0.39986 0.39986 0.39948 0.39948 0.39948 0.39948 0.39948 
##     631     632     633     634     635     636     637     638     639     640 
## 0.39948 0.39948 0.39948 0.39948 0.39948 0.39948 0.39910 0.39910 0.39910 0.39910 
##     641     642     643     644     645     646     647     648     649     650 
## 0.39872 0.39872 0.39872 0.39872 0.39834 0.39834 0.39834 0.39834 0.39796 0.39796 
##     651     652     653     654     655     656     657     658     659     660 
## 0.39758 0.39758 0.39758 0.39758 0.39758 0.39720 0.39720 0.39682 0.39682 0.39682 
##     661     662     663     664     665     666     667     668     669     670 
## 0.39644 0.39644 0.39644 0.39644 0.39606 0.39606 0.39606 0.39568 0.39568 0.39568 
##     671     672     673     674     675     676     677     678     679     680 
## 0.39568 0.39530 0.39530 0.39492 0.39492 0.39492 0.39492 0.39492 0.39492 0.39454 
##     681     682     683     684     685     686     687     688     689     690 
## 0.39454 0.39454 0.39417 0.39417 0.39417 0.39417 0.39417 0.39417 0.39417 0.39417 
##     691     692     693     694     695     696     697     698     699     700 
## 0.39379 0.39379 0.39379 0.39341 0.39341 0.39341 0.39341 0.39341 0.39303 0.39303 
##     701     702     703     704     705     706     707     708     709     710 
## 0.39303 0.39303 0.39303 0.39190 0.39190 0.39152 0.39152 0.39152 0.39114 0.39114 
##     711     712     713     714     715     716     717     718     719     720 
## 0.39076 0.39076 0.39076 0.39076 0.39076 0.39076 0.39038 0.39038 0.39038 0.39001 
##     721     722     723     724     725     726     727     728     729     730 
## 0.39001 0.38963 0.38963 0.38963 0.38925 0.38925 0.38925 0.38888 0.38888 0.38888 
##     731     732     733     734     735     736     737     738     739     740 
## 0.38888 0.38888 0.38888 0.38888 0.38850 0.38812 0.38812 0.38775 0.38775 0.38737 
##     741     742     743     744     745     746     747     748     749     750 
## 0.38699 0.38699 0.38699 0.38699 0.38662 0.38624 0.38624 0.38549 0.38511 0.38511 
##     751     752     753     754     755     756     757     758     759     760 
## 0.38511 0.38474 0.38474 0.38474 0.38436 0.38436 0.38436 0.38436 0.38399 0.38361 
##     761     762     763     764     765     766     767     768     769     770 
## 0.38361 0.38361 0.38361 0.38361 0.38361 0.38324 0.38324 0.38286 0.38249 0.38249 
##     771     772     773     774     775     776     777     778     779     780 
## 0.38249 0.38249 0.38211 0.38211 0.38174 0.38174 0.38174 0.38136 0.38136 0.38136 
##     781     782     783     784     785     786     787     788     789     790 
## 0.38136 0.38136 0.38099 0.38099 0.38099 0.38062 0.38024 0.38024 0.38024 0.37949 
##     791     792     793     794     795     796     797     798     799     800 
## 0.37949 0.37949 0.37875 0.37875 0.37875 0.37875 0.37763 0.37726 0.37688 0.37614 
##     801     802     803     804     805     806     807     808     809     810 
## 0.37577 0.37577 0.37577 0.37577 0.37539 0.37539 0.37502 0.37502 0.37465 0.37428 
##     811     812     813     814     815     816     817     818     819     820 
## 0.37428 0.37354 0.37354 0.37317 0.37317 0.37242 0.37242 0.37242 0.37242 0.37205 
##     821     822     823     824     825     826     827     828     829     830 
## 0.37205 0.37168 0.37168 0.37168 0.37168 0.37168 0.37131 0.37131 0.37131 0.37094 
##     831     832     833     834     835     836     837     838     839     840 
## 0.37094 0.37057 0.37057 0.37020 0.36983 0.36983 0.36983 0.36909 0.36872 0.36872 
##     841     842     843     844     845     846     847     848     849     850 
## 0.36762 0.36762 0.36725 0.36725 0.36725 0.36688 0.36651 0.36614 0.36578 0.36541 
##     851     852     853     854     855     856     857     858     859     860 
## 0.36504 0.36467 0.36467 0.36467 0.36394 0.36394 0.36357 0.36284 0.36247 0.36247 
##     861     862     863     864     865     866     867     868     869     870 
## 0.36247 0.36174 0.36137 0.36064 0.36064 0.36027 0.35991 0.35991 0.35954 0.35954 
##     871     872     873     874     875     876     877     878     879     880 
## 0.35918 0.35845 0.35845 0.35772 0.35699 0.35663 0.35626 0.35590 0.35554 0.35554 
##     881     882     883     884     885     886     887     888     889     890 
## 0.35554 0.35481 0.35082 0.34974 0.34938 0.34902 0.34830 0.34830 0.34722 0.34722 
##     891     892     893     894     895     896     897     898     899     900 
## 0.34543 0.34507 0.34399 0.34328 0.34292 0.34042 0.33971 0.33616 0.33545 0.33369 
##     901     902     903     904     905     906     907     908     909     910 
## 0.33298 0.33017 0.33017 0.32982 0.32772 0.32632 0.32423 0.32423 0.32354 0.32181 
##     911     912     913     914     915     916     917     918     919     920 
## 0.32111 0.32042 0.31973 0.31561 0.31492 0.31287 0.31185 0.31083 0.30981 0.30408 
##     921     922     923     924     925     926     927     928     929     930 
## 0.30307 0.30207 0.30140 0.30140 0.30073 0.29873 0.29476 0.29476 0.29115 0.29049 
##     931     932     933     934     935     936     937     938     939     940 
## 0.28821 0.28626 0.28594 0.21836 0.28142 0.28046 0.25498 0.25498 0.25438 0.25228 
##     941     942     943     944     945     946     947     948     949     950 
## 0.24989 0.23675 0.23589 0.22108 0.21972 0.21593 0.20538 0.20255 0.19200 0.16859 
##     951     952     953     954     955     956     957 
## 0.14356 0.13280 0.11969 0.08526 0.07963 0.07599 0.02499

Gráfica del Modelo RLogS

Dataset$Code_Type <- as.factor(Dataset$Code_Type)

Code_Type <- Dataset$Code_Type
Views <- Dataset$Views


dataPlot <- data.frame(Views, Code_Type)
plot(Code_Type~Views, data = dataPlot, main = "Modelo RLogS: Views-Code_Type", xlab = "Views", ylab = "Code_Type = 0 | Code_Type = 1", col = "gold", pch = "I")


curve(predict(glm(Code_Type~Views, family = "binomial", data = dataPlot), data.frame(Views = x), type = "response"), col = "orange", lwd = 3, add = TRUE)

6. Conclusiones

Se realizó un análisis estadístico con los datos de Kaggle, encontrando patrones interesantes y relaciones importantes entre las variables. Se utilizaron varias técnicas, como análisis descriptivo, Análisis de Componentes Principales (ACP), Análisis de Correspondencias Múltiples (ACM), agrupamiento y regresión. En primer lugar, se detectaron algunos valores atípicos y sesgos en los datos. Se observó que existían relaciones positivas entre los votos, comentarios, vistas y forks, aunque la distribución no era normal.

El ACP permitió simplificar las variables cuantitativas, revelando que la primera dimensión explicaba la mayor parte de la variabilidad. Con el ACM, se identificaron agrupaciones interesantes entre países y tipos de código, lo que proporcionó una buena representación visual para entender sus interacciones. Además, los análisis de agrupamiento jerárquico y no jerárquico señalaron a Vietnam como un caso especial, debido a su alta actividad en las variables clave. Esto sugiere que se requieren enfoques personalizados para este campo.

Finalmente, las regresiones lineales múltiples y logísticas simples ofrecieron información adicional sobre cómo las variables afectan los resultados. La regresión lineal múltiple mostró que los comentarios y vistas tienen un impacto positivo en los votos, mientras que los forks presentan una relación débilmente negativa. Por otro lado, el análisis de regresión logística indicó que el número de votos tenía una pequeña influencia negativa en la probabilidad de eventos binarios relacionados con el tipo de código. En resumen, estas conclusiones proporcionan una comprensión valiosa de las relaciones en los datos, ayudando a tomar decisiones informadas al aplicar modelos estadísticos en situaciones donde la variabilidad y la estructura de los datos son relevantes.

LS0tDQp0aXRsZTogJyoqUk1EX0cyKionDQphdXRob3I6ICJzYW50aWFnby5iZWNlcnJhOjpqdWFuLnBhYmxvLmJ1aXRyYWdvOjpzYW50aWFnby50b3JyZXMub3NvcmlvOjpAY29ycmVvdW5pdmFsbGUuZWR1LmNvIg0KZGF0ZTogIkVzdHVkaW8gaGVjaG8gZHVyYW50ZSBlbCBwZXJpb2RvIGFjYWRlbWljbyBhZ29zdG8tZGljaWVtYnJlIGRlIDIwMjQiDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6DQogICAgdG9jOiB0cnVlDQogICAgdG9jX2Zsb2F0OiB0cnVlDQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQ0KICAgIHRoZW1lOiBsdW1lbg0KICBwZGZfZG9jdW1lbnQ6DQogICAgdG9jOiB0cnVlDQpzdWJ0aXRsZTogRXN0dWRpbyBkZSBBbsOhbGlzaXMgTXVsdGl2YXJpYWRvIGNvbiBiYXNlIGVuIHVuIGNvbmp1bnRvIGRlIGRhdG9zIHNvYnJlIGtlcm5lbHMgdG9kb3MgZGUgYWx0byB1c28gZGUga2FnZ2xlLg0KYmlibGlvZ3JhcGh5OiBiaWJsaW9ncmFmaWFfTUUuYmliDQpjc2w6IGFwYS5jc2wNCmxpbmstY2l0YXRpb25zOiB0cnVlDQotLS0NCjwhLS0gQ29uZmlndXJhY2nDs24gR2xvYmFsIGRlIFIgLS0+DQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCiNpbnN0YWxsLnBhY2thZ2VzKCJzdGFyZ2F6ZXIiKQ0KbGlicmFyeShyZWFkeGwpDQpsaWJyYXJ5KGNvcnJwbG90KQ0KbGlicmFyeShHR2FsbHkpDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KGFuZHJld3MpDQpsaWJyYXJ5KHRjbHRrKQ0KbGlicmFyeShhcGxwYWNrKQ0KbGlicmFyeShncmFwaGljcykNCmxpYnJhcnkoTVZOKQ0KbGlicmFyeShyZXNoYXBlMikNCmxpYnJhcnkoRmFjdG9NaW5lUikNCmxpYnJhcnkoZmFjdG9leHRyYSkNCmxpYnJhcnkocHN5Y2gpDQpsaWJyYXJ5KEZhY3RvQ2xhc3MpDQpsaWJyYXJ5KGNsdXN0ZXIpDQpsaWJyYXJ5KGRlbmRleHRlbmQpDQpsaWJyYXJ5KG1hZ3JpdHRyKQ0KbGlicmFyeShOYkNsdXN0KQ0KbGlicmFyeShzdGFyZ2F6ZXIpDQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobz1UUlVFKQ0KDQoNCkRhdGFzZXQgPC0gcmVhZF9leGNlbCgiRGF0YXNldC54bHN4IikNClZpZXcoRGF0YXNldCkNCg0KRGF0YXNldF9vcmlnaW5hbCA8LSByZWFkX2V4Y2VsKCJEYXRhc2V0X29yaWdpbmFsLnhsc3giKQ0KVmlldyhEYXRhc2V0KQ0KDQoNCmBgYA0KDQojIyAqKkZhc2UgMSBbRGVzY3JpcGNpb25lcyBNdWx0aXZhcmlhbnRlc10qKg0KDQojIyMgKioxLjEuIE9iamV0aXZvcyoqDQotRGV0ZWN0YXIgY8OzbW8gc2UgcmVsYWNpb25hbiBtw7psdGlwbGVzIHZhcmlhYmxlcyBlbnRyZSBzw60geSBtZWRpciBsYSBmdWVyemEgZSBpbXBvcnRhbmNpYSBkZSBlc2FzIHJlbGFjaW9uZXMuDQoNCi1Bc2VndXJhcnNlIGRlIHF1ZSBsb3MgZGF0b3MgcHJvdmVuZ2FuIGRlIHVuYSBmdWVudGUgY29uZmlhYmxlLCBsbyBxdWUgcmVzcGFsZGEgc3UgdmFsaWRleiBwYXJhIGFuw6FsaXNpcyBjb21wbGVqb3MgeSBmdW5kYW1lbnRhZG9zLg0KDQotSWRlbnRpZmljYXIgeSBjYXRlZ29yaXphciBsYXMgdmFyaWFibGVzIHNlZ8O6biBzdSB0aXBvIHkgZXNjYWxhIGRlIG1lZGljacOzbiwgcGFyYSBlbGVnaXIgbG9zIG3DqXRvZG9zIGVzdGFkw61zdGljb3MgbcOhcyBhcHJvcGlhZG9zLg0KDQojIyMgKioxLjIuIERlc2NyaXBjacOzbiBkZSBsb3MgZGF0b3MqKg0KDQojIyMjICoqZnVlbnRlIGRlbCBjb25qdW50byBkZSBkYXRvcyoqICB7LnRhYnNldCAgLnRhYnNldC1waWxsc30NCg0KRWwgY29uanVudG8gZGUgdHJhYmFqbyBzZSBvYnR1dm8gY2FzaSB0b3RhbG1lbnRlIGRlIGthZ2dsZToNCmh0dHBzOi8vd3d3LmthZ2dsZS5jb20vZGF0YXNldHMvY2FuZ2dpaC91cHZvdGVkLWthZ2dsZS1rZXJuZWxzL2RhdGEuIENhYmUgYWNsYXJhciBxdWUgS2FnZ2xlIGNvbWVuesOzIGVuIDIwMTAgb2ZyZWNpZW5kbyBjb25jdXJzb3MgZGUgYXByZW5kaXphamUgYXV0b23DoXRpY28geSBhaG9yYSB0YW1iacOpbiBvZnJlY2UgdW5hIHBsYXRhZm9ybWEgZGUgZGF0b3MgcMO6YmxpY29zLCB1biBiYW5jbyBkZSB0cmFiYWpvIGJhc2FkbyBlbiBsYSBudWJlIHBhcmEgY2llbmNpYSBkZSBkYXRvcyB5IGVkdWNhY2nDs24gZW4gaW50ZWxpZ2VuY2lhIGFydGlmaWNpYWwuDQoNCiMjIyMgKipDb250ZXh0byBkZWwgY29uanVudG8gZGUgZGF0b3MuKioNCkFkZW3DoXMgZGUgbG9zIGNvbmp1bnRvcyBkZSBkYXRvcywgbG9zIGtlcm5lbHMgZW4gS2FnZ2xlIHNvbiBjYXJhY3RlcsOtc3RpY2FzIGludGVyZXNhbnRlcy4gUG9kZW1vcyBhcHJlbmRlciwgY29tcGFydGlyIHksIGFkZW3DoXMsIGNvbnRyaWJ1aXIgYSBvdHJvcy4gVGVuaWVuZG8gZXN0b3MgZW4gY3VlbnRhIGVzdGUgY29uanVudG8gZGUgZGF0b3MgZXMgdW5hIHJlY29waWxhY2nDs24gZGUgZGlzdGludG9zIGtlcm5lbHMgZGVwb3NpdGFkb3MgZW4gS2FnZ2xlLg0KDQoNCiMjIyMgKipEZXNjcmlwY2nDs24gZGVsIGNvbmp1bnRvIGRlIGRhdG9zKiogey50YWJzZXQgIC50YWJzZXQtcGlsbHN9DQpFbCBjb25qdW50byBkZSBkYXRvcyBjb250aWVuZSAxMCBjYW1wb3MgeSA5NTcgcmVnaXN0cm9zLiBMb3MgY2FtcG9zIGVzdMOhbiBjbGFzaWZpY2Fkb3MgZGUgZG9zIG1hbmVyYXMgKHZhcmlhYmxlcyBjdWFsaXRhdGl2YXMgeSBjdWFudGl0YXRpdmFzKSBxdWUgc2Ugc3ViZGl2aWRlbiBlbiBtZWRpZGFzIGRlIGVzY2FsYSBvcmRpbmFsLCBub21pbmFsIHBhcmEgbGFzIHZhcmlhYmxlcyBjdWFsaXRhdGl2YXMgeSBkZSBlc2NhbGEgcmF6w7NuIHBhcmEgbGFzIHZhcmlhYmxlcyBjdWFudGl0YXRpdmFzLiBFbCB0aXBvIGRlIHZhcmlhYmxlIHkgc3UgZXNjYWxhIGRlIG1lZGljacOzbiBjb24gYmFzZSBlbiBsYSBub21lbmNsYXR1cmEgKioodGlwb19kZV92YXJpYWJsZTo6ZXNjYWxhX2RlX21lZGljaW9uW29yZGVuYW1pZW50b10pKio6DQoNCi4gKipWb3RlcyoqIChjdWFudGl0YXRpdmE6OnJhesOzbik6IFJlZ2lzdHJhIGVsIG7Dum1lcm8gZGUgdm90b3MgcXVlIHRpZW5lIGNhZGEga2VybmVsIGVuIGVzdGUgY29uanVudG8gZGUgZGF0b3MsIGVzdGEgY29sdW1uYSBlc3RhIG9yZGVuYWRhIGRlIG1lbm9yIGEgbWF5b3IuDQoNCi4gKipPd25lcioqIChjdWFsaXRhdGl2YTo6bm9taW5hbCk6IHJlZ2lzdHJhIGVsIG5vbWJyZSBkZSB1c3VhcmlvIGRlbCBhdXRvciBkZWwgcmVzcGVjdGl2byBjb25qdW50byBkZSBkYXRvcy4NCg0KLiAqKktlcm5lbCoqIChjdWFsaXRhdGl2YTo6bm9taW5hbCk6IHJlZ2lzdHJhIGVsIG5vbWJyZSBpZGVudGlmaWNhZG9yIGRlIGNhZGEga2VybmVsIGRlbCByZXNwZWN0aXZvIGNvbmp1bnRvIGRlIGRhdG9zLg0KDQouKipWZXJzaW9uX0hpc3RvcnkqKiAoY3VhbGl0YXRpdmE6Om5vbWluYWwpOiBSZWdpc3RyYSBsYXMgZGlmZXJlbnRlcyBhY3R1YWxpemFjaW9uZXMgcXVlIHJlY2liaW8gY2FkYSBrZXJuZWwgZGVsIHJlc3BlY3Rpdm8gY29uanVudG8gZGUgZGF0b3MsIGhhc3RhIGxhIHVsdGltYSB2ZXJzaW9uIGxhIGN1YWwgZnVlIGFxdWVsbGEgYW50ZXMgZGUgcmVhbGl6YXIgZXN0ZSBjb25qdW50byBkZSBkYXRvcy4gDQoNCi4qKnRhZ3MqKiAoY3VhbGl0YXRpdmExOjpub21pbmFsKTogUmVnaXN0cmEgbGFzIGRpZmVyZW50ZXMgcGFsYWJyYXMgY2xhdmUgcXVlIGlkZW50aWZpY2FuIGEgY2FkYSBrZXJuZWwgZGVsIHJlc3BlY3Rpdm8gY29uanVudG8gZGUgZGF0b3MuIA0KDQouKipvdXRwdXQqKiAoY3VhbGl0YXRpdmE6Om5vbWluYWwpIFJlZ2lzdHJhIGVsIG51bWVybyBkZSB0ZW1hcyBvIHNlY2Npb25lcyBkZSBjYWRhIGRvY3VtZW50byBwcmVzZW50ZSBlbiBjYWRhIGtlcm5lbCBkZWwgcmVzcGVjdGl2byBjb25qdW50byBkZSBkYXRvcy4NCg0KLiAqKkRhdGFzZXQqKiAoY3VhbGl0YXRpdmE6Om5vbWluYWwpOiByZWdpc3RyYSBlbCBub21icmUgcXVlIGVsIGF1dG9yIGFzaWdubyBhIHN1IHJlc3BlY3Rpdm8gY29uanVudG8gZGUgZGF0b3MuDQoNCi4gKipDb2RlIHR5cGUqKiAoY3VhbGl0YXRpdmE6Om5vbWluYWwoZGljb3TDs21pY2EpKSA6cmVnaXN0cmEgZWwgdGlwbyBkZSBjw7NkaWdvIGVsIGN1YWwgZnVlIGltcGxlbWVudGFkbyBlbiBsb3MgZGlmZXJlbnRlcyBrZXJuZWxzIGVuIGVsIGNvbmp1bnRvIGRlIGRhdG9zLCBkb25kZSBleGlzdGVuIGxhcyB2YXJpYWJsZXMgbm90ZWJvb2sgeSBzY3JpcHQuDQoNCi4gKipMYW5ndWFnZSoqIChjdWFsaXRhdGl2YTo6bm9taW5hbCkgOiByZWdpc3RyYSBlbCB0aXBvIGRlIGxlbmd1YWplIGRlIHByb2dyYW1hY2nDs24gbyBkZSBlbnRyYWRhIGNvbiBxdWUgdHJhYmFqYSBlbCByZXNwZWN0aXZvIGNvbmp1bnRvIGRlIGRhdG9zLg0KDQouICoqQ29tbWVudHMqKiAoY3VhbnRpdGF0aXZhOjpvcmRpbmFsKTogcmVnaXN0cmEgZWwgbsO6bWVybyBkZSBjb21lbnRhcmlvcyBxdWUgdGllbmUgY2FkYSBrZXJuZWwgZW4gZWwgcmVzcGVjdGl2byBjb25qdW50byBkZSBkYXRvcy4NCg0KLiAqKlZpZXdzKiogKGN1YW50aXRhdGl2YTo6cmF6w7NuKTogcmVnaXN0cmEgZWwgbnVtZXJvIGRlIHZpc2l0YXMgcXVlIHRpZW5lIGNhZGEga2VybmVsIGVuIGVsIHJlc3BlY3Rpdm8gY29uanVudG8gZGUgZGF0b3MuDQoNCi4gKipGb3JrcyoqIChjdWFudGl0YXRpdmE6OnJhesOzbik6IFJlZ2lzdHJhIGVsIG7Dum1lcm8gZGUgcGVyc29uYXMgcXVlIHBvc2VlbiBjYWRhIGtlcm5lbCBkZSBlc3RlIHJlc3BlY3Rpdm8gY29uanVudG8gZGUgZGF0b3MuDQoNCi4gKipDb3VudHJ5KiogKGN1YWxpdGF0aXZhOjpub21pbmFsKTogcmVnaXN0cmEgbGEgbmFjaW9uYWxpZGFkIGRlIGNhZGEgdXN1YXJpbyBwcm9waWV0YXJpbyBkZSBjYWRhIGtlcm5lbCBlbiBlbCByZXNwZWN0aXZvIGNvbmp1bnRvIGRlIGRhdG9zLg0KDQpDYWJlIGFjbGFyYXIgcXVlIGVsIHVsdGltbyBjYW1wbyAqKihDb3VudHJ5KSoqIGVzIHVuYSB2YXJpYWJsZSBhcnRpZmljaWFsLCBsbyBxdWUgc2lnbmlmaWNhIHF1ZSBubyBlc3RhIHByZW5zZW50ZSBlbiBlbCBjb25qdW50byBkZSBkYXRvcyBvcmlnaW5hbCwgcGVybyB0YW1wb2NvIGVzIGFsZ28gaW52ZW50YWRvLiBFc3RhIG1pc21hIHNlIGFncmVnw7MgZGVzcHXDqXMgZGUgcmVjb3BpbGFyIGluZm9ybWFjacOzbiBjb25maWFibGUgc29icmUgbGEgbmFjaW9uYWxpZGFkIGRlIGxvcyB1c3Vhcmlvcy4gTGEgaWRlYSBkZSBpbmNsdWlybGEgZXMgZGFyIG3DoXMgY29udGV4dG8geSBtZWpvcmFyIGxvcyBhbsOhbGlzaXMgcGFyYSBxdWUgc2VhbiBtw6FzIMO6dGlsZXMgeSBjb21wbGV0b3Mgc2Vnw7puIGxhcyBuZWNlc2lkYWRlcyBkZWwgcHJveWVjdG8uDQoNCkVzIGRlIHRlbmVyIGVuIGNvbnNpZGVyYWNpb24gcXVlIGVsIGNvbmp1bnRvIGRlIGRhdG9zIG9yaWdpbmFsIGN1ZW50YSBwcmluY2lwYWxlbWVudGUgY29uIDEyIGNhbXBvcywgZW50cmUgbG9zIGN1YWxlcyBlbiBlbCBjb25qdW50byBkZSBkYXRvcyBkZXB1cmFkbyBzZSBzdXByaW1pZXJvbiAzIGRlIGVzdG9zIHlhIHF1ZSBubyBzZSBjb25zaWRlcmFyb24gcXVlIGFwb3J0YXJhbiBpbmZvcm1hY2lvbiBpbXBvcnRhbnRlIHBhcmEgcmVhbGl6YXIgZWwgZXN0dWRpbzsgTG9zIDMgY2FtcG9zIHN1cHJpbWlkb3Mgc29uICJ2ZXJzaW9uX0hpc3RvcnksIHRhZ3MsIG91dHB1dCIuIERlIGlndWFsIGZvcm1hLCBzZSBzdXByaW1pZXJvbiB1biB0b3RhbCBkZSAxNCByZWdpc3Ryb3MuDQoNCg0KIyMjIyMgZXN0cnVjdHVyYSBkZWwgY29uanVudG8gZGUgZGF0b3Mgb3JpZ2luYWwgey50YWJzZXQgIC50YWJzZXQtcGlsbHN9DQpgYGB7ciBFc3RydWN0dXJhX2RlbF9jb25qdW50b19kZV9kYXRvc19vcmlnaW5hbCwgZmlnLmFsaWduID0gJ2NlbnRlcid9DQpzdHIoRGF0YXNldF9vcmlnaW5hbCkNCmBgYA0KDQojIyMjIyBjb25qdW50byBkZSBkYXRvcyBvcmlnaW5hbCB7LnRhYnNldCAgLnRhYnNldC1waWxsc30NCmBgYHtyIGNvbmp1bnRvX2RlX2RhdG9zX29yaWdpbmFsLCBmaWcuYWxpZ24gPSAnY2VudGVyJ30NCkRhdGFzZXRfb3JpZ2luYWwNCmBgYA0KDQojIyMjIyBlc3RydWN0dXJhIGRlbCBjb25qdW50byBkZSBkYXRvcyBkZXB1cmFkbyB7LnRhYnNldCAgLnRhYnNldC1waWxsc30NCmBgYHtyIEVzdHJ1Y3R1cmFfZGVsX2Nvbmp1bnRvX2RlX2RhdG9zX2RlcHVyYWRvLCBmaWcuYWxpZ24gPSAnY2VudGVyJ30NCnN0cihEYXRhc2V0KQ0KDQpgYGANCg0KDQojIyMjIyBjb25qdW50byBkZSBkYXRvcyBkZXB1cmFkbyB7LnRhYnNldCAgLnRhYnNldC1waWxsc30NCmBgYHtyIGNvbmp1bnRvX2RlX2RhdG9zX2RlcHVyYWRvLCBmaWcuYWxpZ24gPSAnY2VudGVyJ30NCg0KRGF0YXNldA0KDQoNCmBgYA0KDQoNCg0KIyMjICoqMS4zLiBFc3RpbWFjaW9uZXMgbXVsdGl2YXJpYWRhcyoqIHsudGFic2V0ICAudGFic2V0LXBpbGxzfQ0KDQpFc3RhbW9zIHRyYWJhamFuZG8gY29uIHVuIGNvbmp1bnRvIGRlIGRhdG9zIHNvYnJlIGtlcm5lbHMgeSB1dGlsaXphbW9zIGhlcnJhbWllbnRhcyBkZSBlc3RhZMOtc3RpY2EgZGVzY3JpcHRpdmEgeSBncsOhZmljYXMsIGNvbW8gYm94cGxvdHMgeSBlbCBjw6FsY3VsbyBkZSBtZWRpYXMsIHBhcmEgYW5hbGl6YXIgbGEgZGlzdHJpYnVjacOzbiBkZSBsYXMgdmFyaWFibGVzIHkgc3VzIHJlbGFjaW9uZXMuIEVsIHByb3DDs3NpdG8gZXMgcmVjb25vY2VyIHBhdHJvbmVzLCBkZXNjdWJyaXIgY29uZXhpb25lcyBlbnRyZSBsYXMgdmFyaWFibGVzIHkgbG9jYWxpemFyIHZhbG9yZXMgYXTDrXBpY29zIChvdXRsaWVycykgcXVlIHB1ZWRhbiBhZmVjdGFyIGxvcyByZXN1bHRhZG9zIGRlbCBhbsOhbGlzaXMuDQoNCg0KUGFyYSBhbmFsaXphciBsYSBkaXN0cmlidWNpw7NuIGRlIHZhcmlhYmxlcyBjb21vICoqdm90ZXMsIGNvbW1lbnRzLCB2aWV3cyB5IGZvcmtzKiosIHV0aWxpemFtb3MgYm94cGxvdHMuIEVzdG9zIGdyw6FmaWNvcyBkZXN0YWNhbiBsYSBtZWRpYW5hIChpbmRpY2FkYSBwb3IgbGEgbMOtbmVhIG5lZ3JhIGRlbnRybyBkZSBsYSBjYWphKSwgbG9zIGN1YXJ0aWxlcyAobG9zIGJvcmRlcyBkZSBsYSBjYWphKSB5IGxvcyB2YWxvcmVzIGV4dHJlbW9zIG8gb3V0bGllcnMgKHB1bnRvcyBxdWUgYXBhcmVjZW4gZnVlcmEgZGVsIGJpZ290ZSkuIExvcyAqKm91dGxpZXJzKiogc29uIGltcG9ydGFudGVzIHBvcnF1ZSBwdWVkZW4gaW5mbHVpciBub3RhYmxlbWVudGUgZW4gbG9zIHJlc3VsdGFkb3MgZGUgYW7DoWxpc2lzIGVzdGFkw61zdGljb3MsIGNvbW8gbGFzIG1lZGlhcyB5IGxhcyB2YXJpYW56YXMuIFRhbWJpw6luIHNlIHV0aWxpemFyb24gbGEgbWF0cml6IGRlIGNvdmFyaWFuemFzIHkgbGEgbWF0cml6IGRlIGNvcnJlbGFjaW9uZXMgcGFyYSBleHBsb3JhciBsYXMgcmVsYWNpb25lcyBlbnRyZSBsYXMgdmFyaWFibGVzLg0KDQoNCkFsIGFuYWxpemFyIGVsICoqYm94cGxvdCoqIGNvbiBlbCBjb25qdW50byBjb21wbGV0byBubyBzZSBwdWVkZSBoYWNlciB1bmEgaW50ZXJwcmV0YWNpw7NuIGNsYXJhIGRlbCBjb25qdW50byB5YSBxdWUgaGF5IGRhdG9zIG11eSBhdMOtcGljb3MgcXVlIGhhY2UgcXVlIHNlYSBpbXBvc2libGUgbGEgaW50ZXJwcmV0YWNpw7NuIGRlIGVzdGEsIHBvciBlbGxvIGhlbW9zIHNlbGVjY2lvbmFkYSB1bmEgbXVlc3RyYSBkZWwgMTAlIGRlIHRvZG9zIGxvcyBkYXRvcyB5IGNvbiBlbGxhIHNlIHB1ZWRlIGhhY2VyIHVuIG1lam9yIGFuw6FsaXNpcyBlbiBsYSBjdWFsIGF1biBwb2RlbW9zIGV2aWRlbmNpYXIgZXN0b3MgZGF0b3MgYXTDrXBpY29zIHkgcXVlIHNpZ3VlIGhhYmllbmRvIHVuIHNlc2fDsyBkZSBjb2xhIGRlcmVjaGEgbG8gcXVlIGV2aWRlbmNpYSBxdWUgaGF5IHVuYSBtYXlvciBhZ3J1cGFjacOzbiBkZSBsb3MgZGF0b3MgZW4gZWwgbGFkbyBpenF1aWVyZG8gYXPDrSwgbGFzIG1lZGlhbmFzIHRpZW5kZW4gYSBzZXIgYmFqYXMsYWRlbcOhcywgdG9kb3MgbG9zIGRhdG9zIGF0w61waWNvcyBzZSBwcmVzZW50YW4gZW4gbG9zIGV4dHJlbW9zIHN1cGVyaW9yZXMuDQoNCkNvbW8gcG9kZW1vcyBldmlkZW5jaWFyIGVuIGxhIHBlc3Rhw7FhIGRlICoqdmFyaWFuemFzIHkgY292YXJpYW56YXMqKiB2ZW1vcyBxdWUgVmlld3MgdGllbmUgbGEgdmFyaWFuemEgbcOhcyBhbHRhLCBsbyBxdWUgcHVlZGUgaW5kaWNhciBxdWUgbG9zIGRhdG9zIGRlIHZpZXdzIGVzdMOhbiBtdXkgZGlzcGVyc29zLCBlbiBsbyBjb250cmFyaW8gZGUgQ29tbWVudHMgcXVlIHRpZW5lIHVuYSB2YXJpYW56YSBtw6FzIGJhamEgeSBwb3IgZWxsbyBsb3MgZGF0b3Mgc29uIG1lbm9zIGRpc3BlcnNvcy4gUGVybyBlbiBsbyBxdWUgZWZlY3RpdmFtZW50ZSBwb2RlbW9zIGluZmVyaXIgZXMgcXVlIGV4aXN0ZSB1bmEgcmVsYWNpw7NuIHBvc2l0aXZhIGVudHJlIHRvZGFzIGxhcyB2YXJpYWJsZXMsIGxvIHF1ZSBpbXBsaWNhIHF1ZSBlc3TDoW4gY29ycmVsYWNpb25hZGFzIGVudHJlIHPDrSBlbiBjaWVydGEgbWVkaWRhLg0KDQpJbnRlcnByZXRhbmRvIGxhICoqbWF0cml6IGRlIGNvcnJlbGFjaW9uZXMqKiB5IHRlbmllbmRvIGVuIGN1ZW50YSBsYSBwZXN0YcOxYSBkZSAqKnZhcmlhbnphcyB5IGNvdmFyaWFuemFzKiogc2UgZGEgYSBub3RhciBxdWUgZW50cmUgbGFzIHZhcmlhYmxlcyBlc3R1ZGlhZGFzICoqdm90ZXMsIGNvbW1lbnRzLCB2aWV3cyB5IGZvcmtzKiogdG9kYXMgbGFzIGNvcnJlbGFjaW9uZXMgcHJlc2VudGVzIHNvbiBwb3NpdGl2YXMgeSBkZSB2YWxvcmVzIGFsdG9zIChjb25zaWRlcmFuZG8gYWx0byB0b2RvIGFycmliYSBkZSAwLjUpOyBkb25kZSBsYSBjb3JlYWxjacOzbiBjb24gZWwgdmFsb3IgbWFzIGFsdG8gZXMgKip2b3Rlcy1jb21tZW50cyoqIGNvbiB1biAwLjg2IHkgbGEgcmVsYWNpw7NuIGNvbiBlbCB2YWxvciBtYXMgYmFqbyBlcyAqKnZvdGVzLWZvcmtzKiogY29uIHVuIDAuNjMuDQoNCg0KIyMjIyBWZWN0b3IgZGUgTWVkaWFzIHkgQm94cGxvdHMgey50YWJzZXQgIC50YWJzZXQtcGlsbHN9DQoNCmBgYHtyIFZlY3Rvcl9kZV9NZWRpYXNfeV9Cb3hwbG90cywgZmlnLmFsaWduID0gJ2NlbnRlcid9DQoNCnNldC5zZWVkKDc4MDc1NykNCkRhdGFzZXRfTXVlc3RyZWFkbzQgPSBEYXRhc2V0W3NhbXBsZSgxOm5yb3coRGF0YXNldCksOTUpLC1jKDIsMyw0LDUsNiwxMCldDQoNCg0KcGFyKG1mcm93ID0gYygxLCBuY29sKERhdGFzZXRfTXVlc3RyZWFkbzQpKSkNCmludmlzaWJsZShsYXBwbHkoMTpuY29sKERhdGFzZXRfTXVlc3RyZWFkbzQpLCBmdW5jdGlvbihpKQ0KICANCg0KDQpib3hwbG90KERhdGFzZXRfTXVlc3RyZWFkbzRbLCBpXSkpKQ0KDQoNCg0KYGBgDQoNCiMjIyMjIFZlY3RvciBkZSBNZWRpYXMgeSBCb3hwbG90cyBvcmlnaW5hbA0KDQpgYGB7ciBWZWN0b3JfZGVfTWVkaWFzX3lfQm94cGxvdHNfb3JpZ2luYWwsIGZpZy5hbGlnbiA9ICdjZW50ZXInfQ0KDQpzZXQuc2VlZCg3ODA3NTcpDQpEYXRhc2V0X011ZXN0cmVhZG8uID0gRGF0YXNldFtzYW1wbGUoMTpucm93KERhdGFzZXQpLDk1NyksLWMoMiwzLDQsNSw2LDEwKV0NCg0KDQpwYXIobWZyb3cgPSBjKDEsIG5jb2woRGF0YXNldF9NdWVzdHJlYWRvLikpKQ0KaW52aXNpYmxlKGxhcHBseSgxOm5jb2woRGF0YXNldF9NdWVzdHJlYWRvLiksIGZ1bmN0aW9uKGkpDQogIA0KDQoNCmJveHBsb3QoRGF0YXNldF9NdWVzdHJlYWRvLlssIGldKSkpDQoNCmBgYA0KDQojIyMjIE1hdHJpeiBkZSBWYXJpYW56YXMtY292YXJpYW56YXMNCmBgYHtyIE1hdHJpel9kZV9WYXJpYW56YXMtY292YXJpYW56YXMsIGZpZy5hbGlnbiA9ICdjZW50ZXInfQ0KDQpyb3VuZChjb3YoRGF0YXNldFssLWMoMiwzLDQsNSw2LDEwKV0pLDIpDQoNCmBgYA0KDQojIyMjIE1hdHJpeiBkZSBjb3JlbGFjaW9uZXMNCmBgYHtyIE1hdHJpel9kZV9jb3JlbGFjaW9uZXMsIGZpZy5hbGlnbiA9ICdjZW50ZXInfQ0Kcm91bmQoY29yKERhdGFzZXRbLC1jKDIsMyw0LDUsNiwxMCldKSwyKQ0KDQoNCmBgYA0KDQoNCg0KIyMjICoqMS40LiBHcsOhZmljYXMgbXVsdGl2YXJpYWRhcyoqIHsudGFic2V0ICAudGFic2V0LXBpbGxzfQ0KDQoNCg0KRW4gZXN0YSBwYXJ0ZSBzZSBidXNjYSBlc3R1ZGlhciBlIGlkZW50aWZpY2FyIGRpZmVyZW50ZXMgcGF0cm9uZXMsIHJlbGFjaW9uZXMgeSB0ZW5kZW5jaWFzIGVudHJlIGxhcyB2YXJpYWJsZXMgcG9yIG1lZGlvIGRlIGdyYWZpY2FzIGNvbW8gbG8gc29uIGVsICoqRGlhZ3JhbWEgZGUgZGlzcGVyc2nDs24geSBjb3JyZWxhY2lvbmVzKiosICoqRGlhZ3JhbWEgZGUgZXN0cmVsbGFzKiogeSBlbCAqKkRpYWdyYW1hIGRlIGxhcyBjYXJhcyBkZSBjaGVybm9mZioqLiBTZSBkZWJlIHRlbmVyIGVuIGN1ZW50YSBxdWUgc2UgdHJhYmFqw7MgY29uIGxhcyB2YXJpYWJsZXMgY3VhbnRpdGF0aXZhcyBjb24gZXNjYWxhIGRlIG1lZGljacOzbiByYXrDs24sIGxhcyBjdWFsZXMgc29uICoqdm90ZXMsIGNvbW1lbnRzLCB2aWV3cyB5IGZvcmtzKiouDQoNCg0KQ2FkYSB1bm8gZGUgbG9zIHRyZXMgZ3LDoWZpY29zIGVzdHVkaWEgZXN0b3MgNCBjYW1wb3MgY3VhbnRpdGF0aXZvcyBkZSBlc2NhbGEgcmF6b24gZGVsIGNvbmp1bnRvIGRlIGRhdG9zIGRlc2RlIGRpZmVyZW50ZXMgcGVyc3BlY3RpdmFzLiBFcyBkZSBkZXN0YWNhciBxdWUgbnVlc3RybyBjb25qdW50byBkZSBkYXRvcyBlbiBzdSBmb3JtYSBkZXB1cmFkYSBubyBlcmEgc3VmaWNpZW50ZSBwYXJhIGRhcm5vcyB1bmEgdmlzdWFsaXphY2nDs24gbcOhcyBjw7Ntb2RhIHBhcmEgc3UgZXN0dWRpbywgcG9yIGxvIGN1YWwgc2UgZGVjaWRlIHRyYWJhamFyIGNvbiBzZW1pbGxhcyBwYXJhIGNhZGEgdW5vIGRlIGVzdG9zIGdyw6FmaWNvcy4NCg0KRWwgKipEaWFncmFtYSBkZSBkaXNwZXJzacOzbiB5IGNvcnJlbGFjaW9uZXMqKiBub3MgbXVlc3RyYSBncsOhZmljYW1lbnRlIGxhIGRpc3BlcnNpw7NuIHF1ZSBwcmVzZW50YSBjYWRhIHVuYSBkZSBlc3RhcyB2YXJpYWJsZXMganVudG8gYSBlbCBuaXZlbCBkZSBjb3JyZWxhY2nDs24gZXhpc3RlbnRlIGVudHJlIGVzdGFzIG1pc21hcy4gRW4gZXN0ZSBtaXNtbyBhcGFydGFkbyBzZSBwdWVkZSB2aXN1YWxpemFyIGVsICoqRGlhZ3JhbWEgZGUgZGlzcGVyc2nDs24geSBjb3JyZWxhY2lvbmVzW2ZpbHRybzpDb2RlX1R5cGVdKiogZW4gZWwgY3VhbCBzZSBoYWNlIGVsIG1pc21vIGVzdHVkaW8gZGUgZGlzcGVyc2nDs24geSBlbCBuaXZlbCBkZSBjb3JyZWxhY2nDs24sIHBlcm8gYWhvcmEgdG9tYW5kbyBlbiBjdWVudGEgbGEgdmFyaWFibGUgY2xhc2lmaWNhZG9yYSBkZSBudWVzdHJvIGNvbmp1bnRvIGRlIGRhdG9zIGxhIGN1YWwgZXMgKipjb2RlX3R5cGUqKi4NCg0KRWwgKipEaWFncmFtYSBkZSBlc3RyZWxsYXMqKiByZXByZXNlbnRhIGRpZmVyZW50ZXMgb2JzZXJ2YWNpb25lcyAoY2FkYSBmaWd1cmEgbyBlc3RyZWxsYSkgeSBsb3MgZGlmZXJlbnRlcyBjb2xvcmVzIHkgdGFtYcOxb3MgcmVmbGVqYW4gdmFsb3JlcyBhc29jaWFkb3MgYSBkaWZlcmVudGVzIHZhcmlhYmxlcy4gRW4gZXN0ZSBncmFmaWNvIHBvciBuZWNlc2lkYWQgZGUgaW50ZXJwcmV0YWNpw7NuIHNlIHJlZHVqbyBsYSBzZW1pbGxhIHV0aWxpemFkYSBjb24gZWwgZmluIGRlIGhhY2VyIG3DoXMgcHJhY3RpY28gZWwgZXN0dWRpbyBkZWwgZ3LDoWZpY28uDQoNCkVsICoqRGlhZ3JhbWEgZGUgbGFzIGNhcmFzIGRlIGNoZXJub2ZmKiogcHJlc2VudGEgY2FkYSBvYnNlcnZhY2nDs24gZW4gZm9ybWEgZGUgcm9zdHJvIGVuIGRvbmRlIGNhZGEgdW5vIGRlIGxvcyByYXNnb3MgZmFjaWFsZXMgY29tbyAqKnRhbWHDsW8sIGZvcm1hLCBib2NhLCBzb25yaXNhKiogeSBvdHJhcyBjYXJhY3RlcsOtc3RpY2FzIGVzdMOhbiBkZXRlcm1pbmFkYXMgcG9yIGxvcyB2YWxvcmVzIGRlIGxhcyB2YXJpYWJsZXMgYXNvY2lhZGFzIGEgZXNhIG9ic2VydmFjacOzbi4NCg0KDQoqKmNvbmNsdXNpb24qKiANCg0KU2UgcHVlZGUgY29uY2x1aXIgZW4gZWwgZXN0dWRpbyBkZSBjYWRhIGdyw6FmaWNhLCBxdWUgbGEgY29ycmVsYWNpw7NuIGV4aXN0ZW50ZSBlbnRyZSBsYXMgdmFyaWFibGVzIGVzIGVuIGdlbmVyYWwgZGUgdmFsb3JlcyBhbHRvcyB5IHN1cyBkaXNwZXJzaW9uZXMgcHJlc2VudGFuIGVuIGxhIG1heW9yIHBhcnRlIGRlIGxvcyBkYXRvcyB1bmEgY2VyY2Fuw61hLiBEZSBpZ3VhbCBmb3JtYSBlbCAqKmRpYWdyYW1hIGRlIGVzdHJlbGxhcyoqIGFjZW50w7phIGxhIGlkZWEgZGUgcXVlIGVuIG51ZXN0cm8gY29uanVudG8gZGUgZGF0b3Mgc2UgcHJlc2VudGEgdmFsb3JlcyBtdXkgYWx0b3MgbyB2YWxvcmVzIG11eSBiYWpvcyBwb3IgbWVkaW8gZGUgbGEgY2FzaSBhcGFyaWNpw7NuIGRlIGFsZ3VuYXMgdmlzdWFsaXphY2lvbmVzIChlc3RyZWxsYXMpIHkgYWxndW5hcyBvdHJhcyBkZSBmb3JtYSBtdXkgZ3JhbmRlcy4gRmluYWxtZW50ZSBlbiBlbCBkaWFncmFtYSBkZSAqKmNhcmFzIGRlIGNoZXJub2ZmKiogc2UgcHJlc2VudGFuIHZpc3VhbGl6YWNpb25lcyAoY2FyYXMpIHNpbiBuaW5ndW5hIHJlbGFjacOzbiAodmFsb3JlcyBtdXkgYWx0b3MgbyBiYWpvcyBlbiBsYXMgdmFyaWFibGVzIHF1ZSBkZWZpbmVuIGxhcyBjdWFsaWRhZGVzKS4NCg0KDQojIyMjIERpYWdyYW1hIENvbmp1bnRvIGRlIERpc3BlcnNpb24sIGRpc3RyaWJ1Y2lvbiB5IGNvcnJlbGFjaW9uZXMNCmBgYHtyIERpYWdyYW1hX0Nvbmp1bnRvX2RlX0Rpc3BlcnNpb25fZGlzdHJpYnVjaW9uX3lfY29ycmVsYWNpb25lcywgZmlnLmFsaWduPSdjZW50ZXInfQ0KDQpzZXQuc2VlZCg3ODA3NTcpDQpEYXRhc2V0X011ZXN0cmVhZG8zID0gRGF0YXNldFtzYW1wbGUoMTpucm93KERhdGFzZXQpLDUwKSwtYygyLDMsNCw1LDYsMTApXQ0KDQoNCmdncGFpcnMoRGF0YXNldF9NdWVzdHJlYWRvMykNCg0KDQoNCg0KYGBgDQoNCiMjIyMgRGlhZ3JhbWEgQ29uanVudG8gZGUgRGlzcGVyc2lvbiwgZGlzdHJpYnVjaW9uIHkgY29ycmVsYWNpb25lc3MNCmBgYHtyIERpYWdyYW1hX0Nvbmp1bnRvX2RlX0Rpc3BlcnNpb25fZGlzdHJpYnVjaW9uX3lfY29ycmVsYWNpb25lc3MsIGZpZy5hbGlnbj0nY2VudGVyJ30NCg0Kc2V0LnNlZWQoNzgwNzU3KQ0KRGF0YXNldF9NdWVzdHJlYWRvID0gRGF0YXNldFtzYW1wbGUoMTpucm93KERhdGFzZXQpLDk1NyksLWMoMiwzLDQsNSw2LDEwKV0NCg0KDQpnZ3BhaXJzKERhdGFzZXRfTXVlc3RyZWFkbykNCg0KDQoNCmBgYA0KDQojIyMjIERpYWdyYW1hIENvbmp1bnRvIGRlIERpc3BlcnNpw7NuLCBEaXN0cmlidWNpw7NuIHkgQ29ycmVsYWNpb25lcyBbZmlsdHJvOkNvZGVfVHlwZV0NCmBgYHtyIERpYWdyYW1hX0Nvbmp1bnRvX2RlX0Rpc3BlcnNpw7NuX0Rpc3RyaWJ1Y2nDs25feV9Db3JyZWxhY2lvbmVzX0NvZGVfVHlwZSwgZmlnLmFsaWduPSdjZW50ZXInfQ0KDQoNCg0KDQpEYXRhc2V0JENvZGVfVHlwZSA8LSBhcy5mYWN0b3IoRGF0YXNldCRDb2RlX1R5cGUpDQpEYXRhc2V0X011ZXN0cmVhZG8zID0gRGF0YXNldFtzYW1wbGUoMTpucm93KERhdGFzZXQpLDk1KSxjKDEsNSw3LDgsOSldDQoNCg0KZ2dwYWlycyhEYXRhc2V0X011ZXN0cmVhZG8zLCBhZXMoY29sb3IgPSBDb2RlX1R5cGUsIGFscGhhID0gMC41KSwgdXBwZXIgPSBsaXN0KGNvbnRpbnVvdXMgPSB3cmFwKCJjb3IiLCBzaXplID0gMi41KSkpDQoNCg0KYGBgDQoNCiMjIyMgRGlhZ3JhbWEgZGUgRXN0cmVsbGFzDQpgYGB7ciBEaWFncmFtYV9kZV9Fc3RyZWxsYXMsIGZpZy5hbGlnbj0nY2VudGVyJ30NCnNldC5zZWVkKDc4MDcyMCkNCkRhdGFzZXRfTXVlc3RyZWFkbyA9IERhdGFzZXRbc2FtcGxlKDE6bnJvdyhEYXRhc2V0KSwyMyksLWMoMiwzLDQsNSw2LDEwKV0NCnN0YXJzKERhdGFzZXRfTXVlc3RyZWFkbywgbGVuID0gMSwgY2V4ID0gMC43LCBrZXkubG9jID0gYygyLDMsNCw1LDYsMTApLCBkcmF3LnNlZ21lbnRzID0gVFJVRSkNCg0KDQoNCg0KYGBgDQoNCiMjIyMgQ2FyYXMgZGUgQ2hlcm5vZmYNCmBgYHtyIENhcmFzX2RlX0NoZXJub2ZmLCBmaWcuYWxpZ249J2NlbnRlcid9DQoNCnNldC5zZWVkKDc4MDcyOCkNCkRhdGFzZXRfTXVlc3RyZWFkbyA9IERhdGFzZXRbc2FtcGxlKDE6bnJvdyhEYXRhc2V0KSwyNSksLWMoMiwzLDQsNSw2LDEwKV0NCmZhY2VzKERhdGFzZXRfTXVlc3RyZWFkbykNCg0KDQoNCmBgYA0KDQoNCiMjIyAqKjEuNS4gTm9ybWFsaWRhZCBtdWx0aXZhcmlhZGEqKiB7LnRhYnNldCAgLnRhYnNldC1waWxsc30NCg0KDQpFbiBlbCBhbsOhbGlzaXMgZGUgZGF0b3MgbXVsdGl2YXJpYWRvcyByZWxhY2lvbmFkb3MgY29uIExvcyBrZXJuZWxzICwgZXMgZnVuZGFtZW50YWwgZXZhbHVhciBsYSBub3JtYWxpZGFkIGRlIGxhcyB2YXJpYWJsZXMgcGFyYSBnYXJhbnRpemFyIGxhIHZhbGlkZXogZGUgbG9zIG1vZGVsb3MgZXN0YWTDrXN0aWNvcyBxdWUgc2UgYXBsaWNhcsOhbi4gRW4gZXN0ZSBlc3R1ZGlvLCBzZSBkaXNwb25lIGRlIHVuIGNvbmp1bnRvIGRlIGRhdG9zIGNvbiBhcHJveGltYWRhbWVudGUgOTU3IHJlZ2lzdHJvcywgZGUgbGFzIGN1YWxlcyBzb2xvIHNlIGxlIHZhIGhhY2VyIGVsIGVzdHVkaW8gYSBsb3MgY2FtcG9zIGN1YW50aXRhdGl2b3MuIFNlIGxsZXZhcsOhbiBhIGNhYm8gZGlmZXJlbnRlcyBwcnVlYmFzIGRlIG5vcm1hbGlkYWQgbXVsdGl2YXJpYWRhLCB0YWxlcyBjb21vIGxhcyBwcnVlYmFzIGRlIE1hcmRpYSwgSGVuemUtWmlya2xlciwgRG9vcm5pay1IYW5zZW4geSBSb3lzdG9uLCBjb24gZWwgZmluIGRlIGRldGVybWluYXIgc2kgbGFzIHZhcmlhYmxlcyBjdWFudGl0YXRpdmFzIHNpZ3VlbiB1bmEgZGlzdHJpYnVjacOzbiBub3JtYWwgbXVsdGl2YXJpYWRhLCBsbyBjdWFsIGVzIGNydWNpYWwgcGFyYSBsYSBhcGxpY2FjacOzbiBkZSB0w6ljbmljYXMgZXN0YWTDrXN0aWNhcyBhdmFuemFkYXMuDQoNClBhcmEgZGV0ZXJtaW5hciBzaSBsYXMgdmFyaWFibGVzIGN1YW50aXRhdGl2YXMgZGUgbnVlc3RybyBjb25qdW50byBkZSBkYXRvcyBzaWd1ZW4gdW5hIGRpc3RyaWJ1Y2nDs24gbm9ybWFsLCBzZSBsbGV2YXLDoW4gYSBjYWJvIGRpdmVyc2FzIHBydWViYXMgZGUgbm9ybWFsaWRhZC4gRW50cmUgZXN0YXMsIHNlIGluY2x1eWVuIGxhIHBydWViYSBkZSBNYXJkaWEsIHF1ZSBldmFsw7phIGxhIG5vcm1hbGlkYWQgbXVsdGl2YXJpYWRhIG1lZGlhbnRlIGxhIGFzaW1ldHLDrWEgeSBjdXJ0b3NpczsgbGEgcHJ1ZWJhIGRlIEhlbnplLVppcmtsZXIsIHF1ZSBjb21iaW5hIGluZm9ybWFjacOzbiBzb2JyZSBsYSBkaXN0YW5jaWEgZGUgbGFzIG9ic2VydmFjaW9uZXMgYSBsYSBtZWRpYTsgbGEgcHJ1ZWJhIGRlIERvb3JuaWstSGVuemUsIHF1ZSBzZSBiYXNhIGVuIGVsIGFuw6FsaXNpcyBkZSBtb21lbnRvczsgeSBsYSBwcnVlYmEgZGUgUm9zZXR0w7NuLCBxdWUgdXRpbGl6YSB1bmEgbWV0b2RvbG9nw61hIGdyw6FmaWNhIHBhcmEgZXZhbHVhciBsYSBub3JtYWxpZGFkLiBMYSBhcGxpY2FjacOzbiBkZSBlc3RhcyBwcnVlYmFzIG5vcyBwZXJtaXRpcsOhIG9idGVuZXIgdW5hIGNvbXByZW5zacOzbiBtw6FzIGNsYXJhIGRlbCBjb21wb3J0YW1pZW50byBkZSBudWVzdHJvcyBkYXRvcy4NCg0KKipjb25jbHVzaW9uKiogDQoNCkxvcyByZXN1bHRhZG9zIG9idGVuaWRvcyBhIHBhcnRpciBkZSBsYXMgcHJ1ZWJhcyBkZSBub3JtYWxpZGFkLCBpbmNsdXllbmRvIE1hcmRpYSwgSGVuemUtWmlya2xlciwgRG9vcm5pay1IZW56ZSB5IFJvc2V0dMOzbiwgaW5kaWNhbiBkZSBtYW5lcmEgY29uc2lzdGVudGUgcXVlIGxvcyBkYXRvcyBhbmFsaXphZG9zIG5vIHNpZ3VlbiB1bmEgZGlzdHJpYnVjacOzbiBub3JtYWwuIEVzdGEgY29uY2x1c2nDs24gc3VnaWVyZSBsYSBwcmVzZW5jaWEgZGUgYXNpbWV0csOtYXMgeS9vIGN1cnRvc2lzIHF1ZSBzZSBkZXN2w61hbiBkZSBsYXMgY2FyYWN0ZXLDrXN0aWNhcyBlc3BlcmFkYXMgZW4gdW5hIGRpc3RyaWJ1Y2nDs24gbm9ybWFsLCBsbyBxdWUgcHVlZGUgcmVmbGVqYXIgdmFyaWFjaW9uZXMgc2lnbmlmaWNhdGl2YXMgZW4gbGEgbmF0dXJhbGV6YSBkZSBsb3MgZGF0b3MuIExhIGFzaW1ldHLDrWEgcG9kcsOtYSBpbmRpY2FyIHF1ZSBoYXkgdW5hIHRlbmRlbmNpYSBoYWNpYSB2YWxvcmVzIGV4dHJlbW9zIGVuIHVuYSBkaXJlY2Npw7NuLCBtaWVudHJhcyBxdWUgbGEgY3VydG9zaXMgZWxldmFkYSBwb2Ryw61hIHNlw7FhbGFyIGxhIHByZXNlbmNpYSBkZSBvdXRsaWVycyBvIHVuYSBjb25jZW50cmFjacOzbiBpbnVzdWFsIGRlIGRhdG9zIGVuIHRvcm5vIGEgbGEgbWVkaWEuDQoNCg0KIyMjIyBQTk0gTWFyZGlhDQpgYGB7ciBQTk1fTWFyZGlhLCBmaWcuYWxpZ249J2NlbnRlcid9DQptdm4oRGF0YXNldFssLWMoMiwzLDQsNSw2LDEwKV0sIG12blRlc3Q9Im1hcmRpYSIpDQoNCg0KDQpgYGANCg0KIyMjIyBQTk0gSGVuemUtWmlya2xlcg0KYGBge3IgUE5NX0hlbnplLVppcmtsZXIsIGZpZy5hbGlnbj0nY2VudGVyJ30NCg0KbXZuKERhdGFzZXRbLC1jKDIsMyw0LDUsNiwxMCldLCBtdm5UZXN0PSJoeiIpDQoNCg0KYGBgDQoNCiMjIyMgUE5NIERvb3JuaWstSGFuc2VuDQpgYGB7ciBQTk1fRG9vcm5pay1IYW5zZW4sIGZpZy5hbGlnbj0nY2VudGVyJ30NCg0KbXZuKERhdGFzZXRbLC1jKDIsMyw0LDUsNiwxMCldLCBtdm5UZXN0PSJkaCIpDQoNCg0KDQpgYGANCg0KIyMjIyBQTk0gUm95c3Rvbg0KYGBge3IgUE5NX1JveXN0b24sIGZpZy5hbGlnbj0nY2VudGVyJ30NCg0KbXZuKERhdGFzZXRbLC1jKDIsMyw0LDUsNiwxMCldLCBtdm5UZXN0PSJyb3lzdG9uIikNCg0KYGBgDQoNCg0KIyMgKipGYXNlIDIgW0NvbXBvbmVudGVzIFByaW5jaXBhbGVzXSoqDQoNCiMjIyAqKjIuMS4gT2JqZXRpdm9zKioNCg0KLUhhY2VyIG3DoXMgc2VuY2lsbG8gZWwgYW7DoWxpc2lzIHJlZW1wbGF6YW5kbyBsYXMgdmFyaWFibGVzIG9yaWdpbmFsZXMgcG9yIHVuIGdydXBvIG3DoXMgcGVxdWXDsW8gZGUgY29tcG9uZW50ZXMgcHJpbmNpcGFsZXMgcXVlIGNvbmNlbnRyYW4gbG8gbcOhcyBpbXBvcnRhbnRlLg0KDQotTW9zdHJhciBkYXRvcyBjb21wbGVqb3MgZW4gZ3LDoWZpY29zIDJEIG8gM0QgcGFyYSBlbnRlbmRlciBtZWpvciBsb3MgcGF0cm9uZXMgeSBsYXMgcmVsYWNpb25lcyBkZSBmb3JtYSBtw6FzIGNsYXJhLg0KDQotRW5jb250cmFyIGxhcyBkaW1lbnNpb25lcyBjbGF2ZSBxdWUgZXhwbGljYW4gbGEgbWF5b3IgcGFydGUgZGUgbGFzIGRpZmVyZW5jaWFzIGVuIGxvcyBkYXRvcywgZW5mb2PDoW5kb3NlIGVuIGxvIG3DoXMgcmVsZXZhbnRlLg0KDQojIyMgKioyLjIuIFNlbGVjY2nDs24gZGUgQ29tcG9uZW50ZXMqKiB7LnRhYnNldCAgLnRhYnNldC1waWxsc30NCg0KDQoNCkVuIGVzdGUgZXN0dWRpbywgcmVhbGl6YXJlbW9zIHVuIGFuw6FsaXNpcyBkZSBjb21wb25lbnRlcyBwcmluY2lwYWxlcyAoQUNQKSBwYXJhIGV4cGxvcmFyIHVuIGNvbmp1bnRvIGRlIHZhcmlhYmxlcyBjdWFudGl0YXRpdmFzLiAgY2FsY3VsYW5kbyB1bmEgbWF0cml6IGRlIGNvcnJlbGFjaW9uZXMgcXVlIG5vcyBheXVkYXLDoSBhIGVudGVuZGVyIGPDs21vIHNlIHJlbGFjaW9uYW4gbGFzIHZhcmlhYmxlcyBlbnRyZSBzw60uIGV4dHJhZXJlbW9zIGxvcyB2YWxvcmVzIHkgdmVjdG9yZXMgcHJvcGlvcywgcXVlIG5vcyBtb3N0cmFyw6FuIHF1w6kgdGFudG8gY29udHJpYnV5ZSBjYWRhIGNvbXBvbmVudGUgYSBsYSB2YXJpYWJpbGlkYWQgdG90YWwgZGUgbG9zIGRhdG9zLiBUYW1iacOpbiB1dGlsaXphcmVtb3MgZ3LDoWZpY29zIGNvbW8gZWwgZGUgQ2F0dGVsbC1LYWlzZXIgcGFyYSB5IGVsIGdyw6FmaWNvIGRlIENhdHRlbGwgcGFyYSB2aXN1YWxpemFyIGPDs21vIHNlIGNvbXBvcnRhbiBsYXMgdmFyaWFibGVzIGVuIGVzdGUgbnVldm8gZXNwYWNpby4gRXN0ZSBlbmZvcXVlIG5vcyBwZXJtaXRpcsOhIHNpbXBsaWZpY2FyIGVsIGFuw6FsaXNpcyB5IGRlc2N1YnJpciBwYXRyb25lcyBpbnRlcmVzYW50ZXMgZW4gbG9zIGRhdG9zLg0KDQoNCkR1cmFudGUgZWwgYW7DoWxpc2lzIGRlIGNvbXBvbmVudGVzIHByaW5jaXBhbGVzIChBQ1ApLCBsb3MgcmVzdWx0YWRvcyBkZSBsYSBtYXRyaXogZGUgY29ycmVsYWNpb25lcyByZXZlbGFyb24gcmVsYWNpb25lcyBzaWduaWZpY2F0aXZhcyBlbnRyZSBsYXMgdmFyaWFibGVzIGN1YW50aXRhdGl2YXMsIGxvIHF1ZSBzdWdpZXJlIHF1ZSBhbGd1bmFzIGRlIGVsbGFzIGNvbXBhcnRlbiBpbmZvcm1hY2nDs24gc2ltaWxhci4gQSBwYXJ0aXIgZGUgbG9zIHZhbG9yZXMgeSB2ZWN0b3JlcyBwcm9waW9zLCBpZGVudGlmaWNhbW9zIGxvcyBjb21wb25lbnRlcyBtw6FzIHJlbGV2YW50ZXMgcXVlIGNhcHR1cmFuIGxhIG1heW9yIHBhcnRlIGRlIGxhIHZhcmlhYmlsaWRhZCBlbiBsb3MgZGF0b3MuIEFsIGFwbGljYXIgZWwgZ3LDoWZpY28gZGUgQ2F0dGVsbC1LYWlzZXIsIHNlIGhpem8gZXZpZGVudGUgZWwgbsO6bWVybyDDs3B0aW1vIGRlIGNvbXBvbmVudGVzIGEgcmV0ZW5lci4gQWRlbcOhcywgZWwgZ3LDoWZpY28gZGUgQ2F0dGVsbCBub3MgcHJvcG9yY2lvbsOzIHVuYSB2aXN1YWxpemFjacOzbiBjbGFyYSBkZWwgY29tcG9ydGFtaWVudG8gZGUgbGFzIHZhcmlhYmxlcyBlbiBlbCBudWV2byBlc3BhY2lvIGRpbWVuc2lvbmFsLg0KDQoqKmNvbmNsdXNpb24qKg0KDQptdWVzdHJhIDQgZGltZW5zaW9uZXMgZG9uZGUgc29sbyBsYSBwcmltZXJhIHJldGllbmUgZWwgODEuMjQzNjkgJSwgbGEgc2lndWllbnRlIGVsIDEwLjc3MTkxJSB5IGxhcyBkZW3DoXMgc29sbyBwb3JjZW50YWplcyBjb24gcGFydGUgZW50ZXJhIGRlIHVuYSBjaWZyYS4gRW4gZXN0ZSBzZW50aWRvLCBsYSByZXByZXNlbnRhdGl2aWRhZCBkZSBsYSBjb21iaW5hY2nDs24gbGluZWFsIHF1ZSBkZWZpbmUgYSBsYSBkaW1lbnNpw7NuIDEgZXMgc2lnbmlmaWNhdGl2YW1lbnRlIGFsdGEgZW4gY29tcGFyYWNpw7NuIGNvbiBsYXMgZGVtw6FzLiBDb21vIGVzdGEgbWF0cml6IGVzIG11ZGEgZW4gcmVsYWNpw7NuIGNvbiBsYXMgdmFyaWFibGVzIG9yaWdpbmFsZXMgc2Ugc2lndWUgaW5kYWdhbmRvIGxhIGlkZW50aWZpY2FjacOzbiBkZSBsYXMgdmFyaWFibGVzIHF1ZSBtw6FzIGNvbnRyaWJ1eWFuIGEgbGEgZGltZW5zacOzbiBkZSB2YWxvciBwcm9waW8gbcOhcyBhbHRvLiANCk1hdHJpeiBkZSBjb3JyZWxhY2lvbmVzOiBMYXMgdmFyaWFibGVzIHByZXNlbnRhbiByZWxhY2lvbmVzIHNpZ25pZmljYXRpdmFzIGVudHJlIHPDrSwgY29uIGNvcnJlbGFjaW9uZXMgcGFydGljdWxhcm1lbnRlIGFsdGFzIGVudHJlIHZvdG9zLCBjb21lbnRhcmlvcyB5IHZpc3VhbGl6YWNpb25lcy4gRXN0byBzdWdpZXJlIHF1ZSBlc3RhcyBtw6l0cmljYXMgcHVlZGVuIGVzdGFyIGFzb2NpYWRhcyBjb24gbGEgcG9wdWxhcmlkYWQgbyBlbCBpbnRlcsOpcyBnZW5lcmFsIHF1ZSBnZW5lcmFuIGxhcyBwdWJsaWNhY2lvbmVzLiBTaW4gZW1iYXJnbywgbG9zIGZvcmtzIHBhcmVjZW4gdGVuZXIgdW5hIHJlbGFjacOzbiBtZW5vcyBmdWVydGUgY29uIGxhcyBvdHJhcyBtw6l0cmljYXMsIGxvIHF1ZSBwb2Ryw61hIGluZGljYXIgcXVlIGRlcGVuZGVuIGRlIGZhY3RvcmVzIGFkaWNpb25hbGVzLg0KQ29tbyBlbiBsYSBwZXN0YcOxYSBhbnRlcmlvciBlc3RhIG11ZXN0cmEgbGFzIHJlbGFjaW9uZXMgcXVlIHNlIG9idGllbmVuIGFsIGNvbXBhcmFyIGxhcyB2YXJpYWJsZXMgcG9yIGVqZW1wbG8gbGFzIHZhcmlhYmxlcyBxdWUgdGllbmVuIG3DoXMgcmVsYWNpw7NuIHNvbiBjb21tZW50cyB5IHZvdGVzIHBvciBsbyBjb250cmFyaW8gYSBmb3JrcyB5IHZvdGVzIGVzdG8gc2UgdmUgcmVmbGVqYWRvIGVuIGVsIGRpYWdyYW1hIHBvciBsYSBpbnRlbnNpZGFkIGRlIGxvcyBjb2xvcmVzDQpFbCBHcsOhZmljbyBkZSBDYXR0ZWxsIG11ZXN0cmEgcXVlIGxvcyBjYW1iaW9zIGVuIGxhIHBlbmRpZW50ZSBpbmRpY2FuIHF1ZSBsYSBjYXBhY2lkYWQgZXhwbGljYXRpdmEgZGUgbGEgZGltZW5zacOzbiAxIGVzIGFsdGEgY29tcGFyYWRhIGNvbiBlbCByZXN0by4gQXPDrSwgZWwgZGUgQ2F0dGVsbC1LYWlzZXIgYWwgY29uanVnYXIgZWwgaW5zdHJ1bWVudG8gZ3LDoWZpY28gYW50ZXJpb3IgY29uIGVsIGNyaXRlcmlvIGRlIEthaXNlciBlbiBsYSBtaXNtYSBncsOhZmljYSBhcG95YSBxdWUgbGEgY2FudGlkYWQgZGUgZGltZW5zaW9uZXMgc3VmaWNpZW50ZXMgcG9yIHJldGVuZXIgZXMgdW5hLCBhY2xhcmFuZG8gcXVlIGVzdGEgZWxlY2Npw7NuIHJldGVuZ2EgdW4gcG9yY2VudGFqZSBkZSB2YXJpYWJpbGlkYWQgYWRlY3VhZG8gcGFyYSBlc3R1ZGlhciBlbCBwcm9ibGVtYS4NCg0KIyMjIyBNYXRyaXogQUNQDQpgYGB7ciBNYXRyaXpfQUNQLCBmaWcuYWxpZ249J2NlbnRlcid9DQoNCmdldF9laWdlbnZhbHVlKFBDQShEYXRhc2V0WywtYygyLDMsNCw1LDYsMTApXSwgbmNwID0gNiwgc2NhbGUudW5pdCA9IFRSVUUsIGdyYXBoID0gRikpDQoNCg0KYGBgDQojIyMjIE1hdHJpeiBkZSBDb3JyZWxhY2lvbmVzDQoNCmBgYHtyIE1hdHJpel9kZV9Db3JyZWxhY2lvbmVzLCBmaWcuYWxpZ249J2NlbnRlcid9DQpyb3VuZChjb3IoRGF0YXNldFssLWMoMiwzLDQsNSw2LDEwKV0pLDIpDQoNCg0KYGBgDQoNCiMjIyMgQ29ycmVsYWNpb25lcyBDb21wYXJhZGFzDQpgYGB7ciBDb3JyZWxhY2lvbmVzX0NvbXBhcmFkYXMsIGZpZy5hbGlnbj0nY2VudGVyJ30NCg0KcGFyKG1mcm93PWMoMSwyKSkNCmNvcnJwbG90Ojpjb3JycGxvdChjb3IoRGF0YXNldFssLWMoMiwzLDQsNSw2LDEwKV0pLCBtZXRob2QgPSAiY29sb3IiLCB0eXBlID0gInVwcGVyIiwgbnVtYmVyLmNleCA9IDAuNCkNCmNvcnJwbG90Ojpjb3JycGxvdChjb3IocHJpbmNvbXAoRGF0YXNldFssLWMoMiwzLDQsNSw2LDEwKV0sIGNvciA9IFRSVUUpJHNjb3JlcyksIG1ldGhvZCA9ICJjb2xvciIsIHR5cGUgPSAidXBwZXIiLCBudW1iZXIuY2V4ID0gMC40KQ0KDQpgYGANCg0KIyMjIyBHcsOhZmljbyBkZSBDYXR0ZWxsDQpgYGB7ciBHcsOhZmljb19kZV9DYXR0ZWxsLCBmaWcuYWxpZ249J2NlbnRlcid9DQoNCmZ2aXpfZWlnKFBDQShEYXRhc2V0WywtYygyLDMsNCw1LDYsMTApXSwgc2NhbGUudW5pdCA9IFQsIGdyYXBoID0gRiksIGFkZGxhYmVscyA9IFQsIHlsaW09YygwLDkwKSwgbWFpbiA9ICIiKQ0KDQpgYGANCg0KIyMjIyBHcsOhZmljbyBkZSBDYXR0ZWxsLUthaXNlcg0KDQpgYGB7ciBHcsOhZmljb19kZV9DYXR0ZWxsLUthaXNlciwgZmlnLmFsaWduPSdjZW50ZXInfQ0Kc2NyZWUoRGF0YXNldFssLWMoMiwzLDQsNSw2LDEwKV0sZmFjdG9ycyA9IEZBTFNFLCBwYyA9IFRSVUUsIG1haW4gPSIiKQ0KYGBgDQoNCiMjIyMgVmFsb3JlcyB5IFZlY3RvcmVzIFByb3Bpb3MNCmBgYHtyIFZhbG9yZXNfeV9WZWN0b3JlcyBQcm9waW9zLCBmaWcuYWxpZ249J2NlbnRlcid9DQpwcmluY29tcChEYXRhc2V0WywtYygyLDMsNCw1LDYsMTApXSwgY29yID0gVFJVRSkkc2Rldl4yDQpgYGANCg0KYGBge3J9DQpwcmluY29tcChEYXRhc2V0WywtYygyLDMsNCw1LDYsMTApXSwgY29yID0gVFJVRSkkbG9hZGluZ3NbICwxOjRdDQpgYGANCg0KDQojIyMgKioyLjMuIENhbGlkYWQgZGUgUmVwcmVzZW50YWNpw7NuKiogey50YWJzZXQgIC50YWJzZXQtcGlsbHN9DQoNCkVsIGVzdHVkaW8gZGUgbGEgY2FsaWRhZCBkZSByZXByZXNlbnRhY2nDs24gZXMgZXNlbmNpYWwgcGFyYSBjb21wcmVuZGVyIGPDs21vIGxhIGluZm9ybWFjacOzbiBkZSBhbHRhIGRpbWVuc2lvbmFsaWRhZCBwdWVkZSBzZXIgdHJhbnNmb3JtYWRhIHkgc2ltcGxpZmljYWRhIHNpbiBwZXJkZXIgcHJvcGllZGFkZXMgc2lnbmlmaWNhdGl2YXMuIEVzdGUgcHJvY2VzbyBwZXJtaXRlIGdhcmFudGl6YXIgcXVlIGxhcyByZWxhY2lvbmVzIHkgbG9zIHBhdHJvbmVzIGltcG9ydGFudGVzIGRlbnRybyBkZSBsb3MgZGF0b3Mgb3JpZ2luYWxlcyBzZSBtYW50ZW5nYW4gaW50YWN0b3MsIGluY2x1c28gY3VhbmRvIHNlIHJlZHVjZW4gbGFzIGRpbWVuc2lvbmVzIG8gc2UgcmVhbGl6YW4gcmVwcmVzZW50YWNpb25lcyBhbHRlcm5hdGl2YXMuDQoNCg0KRW50cmUgbGFzIGRpc3RpbnRhcyByZXByZXNlbnRhY2lvbmVzIGFsdGVybmF0aXZhcyBzZSBwcmVzZW50YSBlbCAqKmNpcmN1bG8gZGUgY29ycmVsYWNpb25lcyoqIGVuIGVzdGUgZGlhZ3JhbWEgY2FkYSB2YXJpYWJsZSBzZSByZXByZXNlbnRhIGNvbW8gdW4gdmVjdG9yIGVuIHVuIGPDrXJjdWxvLCBkb25kZSBMb3MgdmVjdG9yZXMgZXN0w6FuIG9yaWVudGFkb3MgZGUgYWN1ZXJkbyBjb24gbGFzIGNvcnJlbGFjaW9uZXMgZW50cmUgbGFzIHZhcmlhYmxlcyB5IGxhIGxvbmdpdHVkIGRlbCB2ZWN0b3IgaW5kaWNhIGN1w6FuIGZ1ZXJ0ZSBlcyBsYSBjb3JyZWxhY2nDs24gZGUgZXNhIHZhcmlhYmxlIGNvbiBlbCBjb25qdW50byBkZSBkYXRvcyBlbiBnZW5lcmFsLiBQb3Igb3RybyBsYWRvIGxhICoqbWF0cml6IGRlIHJlcHJlc2VudGFjacOzbioqICB0aWVuZSBmaWxhcyBxdWUgcmVwcmVzZW50YW4gb2JzZXJ2YWNpb25lcyAobyBwdW50b3MgZGUgZGF0b3MpIHkgY29sdW1uYXMgcXVlIHJlcHJlc2VudGFuIGxhcyBudWV2YXMgdmFyaWFibGVzIG8gY29tcG9uZW50ZXMgKHF1ZSByZXN1bHRhbiBkZSBsYSB0cmFuc2Zvcm1hY2nDs24pICoqQ29vcmRlbmFkYXMgaW5kaXZpZHVhbGVzKiogDQoNCioqY29uY2x1c2lvbioqIA0KDQpBbCByZWFsaXphcnNlIGxvcyBkaWZlcmVudGVzIGFuw6FsaXNpcyBwYXJhIGNhZGEgZ3JhZmljYSBlbiBjb25jb3JkYW5jaWEgY29uIG51ZXN0cm8gY29uanVudG8gZGUgZGF0b3MuIHNlIHB1ZWRlIGV4dHJhZXIgcXVlIGFsIHJlZHVjaXJzZSBsYXMgZGltZW5zaW9uZXMgcGFyYSBlc3R1ZGlhciBlc3RlIGNvbmp1bnRvIGRlIGRhdG9zIGRlIG90cmEgZm9ybWEgbcOhcyBzaW1wbGlmaWNhZGEsIGxhcyB2YXJpYWJsZXMgZW4gZ3JhbiBwYXJ0ZSBjb25zZXJ2YW4gc3UgZXN0cnVjdHVyYSB5IGxhcyByZWxhY2lvbmVzIGV4aXN0ZW50ZXMgZW50cmUgc2k7IHBvciBlamVtcGxvLCBlbiBlbCAqKmdyYWZpY28gZGUgY29ycmVsYWNpb25lcyoqIGxhcyB2YXJpYWJsZXMgKipjb21tZW50cyoqIHkgKip2b3RlcyoqIG1hbnRpZW5lbiB1bmEgY2VyY2Fuw61hIGVuIGN1YW50byBhIHN1cyB2ZWN0b3JlcywgbG8gcXVlIGluZGljYSBxdWUgZXN0w6FuIGFsdGFtZW50ZSBjb3JyZWxhY2lvbmFkYXMsIHNpdHVhY2nDs24gcXVlIHNlIHBvZMOtYSB2aXN1YWxpemFyIGVuIGxhIFtzZWNjacOzbiAxLjNdKCNzZWMxKSBlbiBlbCBhcGFydGFkbyBkZSAqKm1hdHJpeiBkZSBjb3JyZWxhY2lvbmVzKiogZG9uZGUgZXN0ZSBtaXNtbyBpbmRpY2FiYSBxdWUgbGEgbWF5b3IgY29ycmVsYWNpw7NuIHNlIHByZXNlbnRhYmEgZW4gbG9zIGNhbXBvcyBhbnRlcyBtZW5jaW9uYWRvcy4gRGUgaWd1YWwgZm9ybWEsIGVuIGVzdGEgbWlzbWEgc2VjY2nDs24gMS4zIHNlIHByZXNlbnRhYmEgcXVlIGVsIGNhbXBvICoqZm9ya3MqKiB5ICoqY29tbWVudHMqKiBlcmFuIGFxdWVsbG9zIHF1ZSB0ZW7DrWFuIGxhIG1lbm9yIGNvcnJlbGFjacOzbiwgc2l0dWFjacOzbiB0YW1iacOpbiBwcmVzZW50ZSBlbiBsYSBncsOhZmljYSAqKmNpcmN1bG8gZGUgY29ycmVsYWNpb25lcyoqLCBlbiBkb25kZSBzZSBwdWVkZSB2aXN1YWxpemFyIHF1ZSBsb3MgdmVjdG9yZXMgcXVlIHJlcHJlc2VudGFuIGEgY2FkYSB1bmEgZGUgZXN0YXMgZXN0w6FuIGJhc3RhbnRlIGFwYXJ0YWRvcyBlbnRyZSBzw60uIEVuIGN1YW50byBhIGxhICoqbWF0cml6IGRlIHJlcHJlc2VudGFjacOzbioqIG11ZXN0cmEgcXVlIHRhbiBiaWVuIHJlcHJlc2VudGFkbyBlc3RlIGNhZGEgY2FtcG8gZW4gbGFzIGRpZmVyZW50ZXMgZGltZW5zaW9uZXMsIGVuIGRvbmRlIHNlIHB1ZWRlIGRlc3RhY2FyIHF1ZSBlbCBjYW1wbyAqKmZvcmtzKiogZXMgbWVqb3IgcmVwcmVzZW50YWRvIGVuIDIgZGltZW5zaW9uZXMgYSBjb21wYXJhY2nDs24gZGVsIHJlc3RvIGRlIGNhbXBvcyBlbiBlc3RhIG1pc21hIGRpbWVuc2nDs24sIHBvciBvdHJvIGxhZG8sIGVsIGNhbXBvICoqY29tbWVudHMqKiBlcyBhcXVlbCBxdWUgcG9zZWUgZWwgbWVub3Igbml2ZWwgZGUgcmVwcmVzZW50YWNpw7NuIGVuIGNhZGEgZGltZW5zacOzbiwgZG9uZGUgc3UgdmFsb3IgbcOhcyBhbHRvIGVuIHJlbGFjacOzbiBkZSBsb3Mgb3Ryb3MgY2FtcG9zIGVzIGVuIGxhcyBkaW1lbnNpb25lcyAzIHkgNC4NCg0KIyMjIyBDw61yY3VsbyBkZSBDb3JyZWxhY2lvbmVzDQoNCmBgYHtyIENpcmN1bG9fZGVfQ29ycmVsYWNpb25lcywgZmlnLmFsaWduID0gJ2NlbnRlcid9DQoNCmZ2aXpfcGNhX3ZhcihQQ0EoRGF0YXNldFssLWMoMiwzLDQsNSw2LDEwKV0sIHNjYWxlLnVuaXQgPSBULCBncmFwaCA9IEYpLGNvbC52YXI9IiMzQjgzQkQiLCByZXBlbCA9IFQsIGNvbC5jaXJjbGUgPSAiI0NEQ0RDRCIsIGdndGhlbWUgPSB0aGVtZV9idygpKQ0KDQoNCmBgYA0KDQoNCiMjIyMgTWF0cml6IGRlIFJlcHJlc2VudGFjacOzbg0KDQpgYGB7ciBNYXRyaXpfZGVfUmVwcmVzZW50YWNpw7NuLCBmaWcuYWxpZ249J2NlbnRlcid9DQooZ2V0X3BjYV92YXIoUENBKERhdGFzZXRbLC1jKDIsMyw0LDUsNiwxMCldLCBuY3AgPSA0LCBzY2FsZS51bml0ID0gVFJVRSwgZ3JhcGggPSBGKSkpJGNvczINCg0KYGBgDQoNCiMjIyMgQ2FsaWRhZCBkZSBSZXByZXNlbnRhY2nDs25uDQoNCmBgYHtyIENhbGlkYWRfZGVfUmVwcmVzZW50YWNpw7NubiwgZmlnLmFsaWduPSdjZW50ZXInfQ0KZnZpel9wY2FfdmFyKFBDQShEYXRhc2V0WywtYygyLDMsNCw1LDYsMTApXSwgbmNwID0gNCwgc2NhbGUudW5pdCA9IFRSVUUsIGdyYXBoID0gRiksIGNvbC52YXI9ImNvczIiLCBncmFkaWVudC5jb2xzPWMoIiMwMEFGQkIiLCIjRTdCODAwIiwiI0ZDNEUwNyIpLCByZXBlbCA9IFRSVUUpDQoNCmBgYA0KDQojIyMjIENvb3JkZW5hZGFzIEluZGl2aWR1YWxlcw0KDQpgYGB7ciBDb29yZGVuYWRhc19JbmRpdmlkdWFsZXMsIGZpZy5hbGlnbj0nY2VudGVyJ30NCmhlYWQoKFBDQShEYXRhc2V0WywtYygyLDMsNCw1LDYsMTApXSwgbmNwID0gNCwgc2NhbGUudW5pdCA9IFRSVUUsIGdyYXBoID0gRikpJGluZCRjb29yZCwgbiA9IDIzTCkNCg0KYGBgDQoNCiMjIyAqKjIuNCBDb250cmlidWNpb25lcyoqIHsudGFic2V0ICAudGFic2V0LXBpbGxzfQ0KDQpFbiBlc3RhIHNlY2Npw7NuIHNlIGJ1c2NhIGFuYWxpemFyIGN1w6FudG8gYXBvcnRhIGNhZGEgY2FtcG8gYWwgbW9kZWxvIGVzdGFkw61zdGljbyB5IGPDs21vIGluZmx1eWUgZW4gbG9zIHJlc3VsdGFkb3Mgb2J0ZW5pZG9zLiBFbCBvYmpldGl2byBlcyBpZGVudGlmaWNhciBxdcOpIGNhbXBvcyByZXF1aWVyZW4gbWF5b3IgYXRlbmNpw7NuLCBkZXRlY3RhciBwYXRyb25lcyBzaWduaWZpY2F0aXZvcyB5IGVsaW1pbmFyIHBvc2libGVzIHJlZHVuZGFuY2lhcywgZmFjaWxpdGFuZG8gYXPDrSBsYSBpbnRlcnByZXRhY2nDs24geSBlbCB1c28gZWZpY2llbnRlIGRlIGxvcyBkYXRvcy4NCkVzdG8gbm8gc29sbyBheXVkYXLDoSBhIGVudGVuZGVyIGPDs21vIGludGVyYWN0w7phbiBsb3MgZGlmZXJlbnRlcyBjYW1wb3MgZW50cmUgc8OtLCBzaW5vIHRhbWJpw6luIGEgZXZhbHVhciBzdSBpbXBhY3RvIGVuIGVsIGNvbXBvcnRhbWllbnRvIGdlbmVyYWwgZGVsIHNpc3RlbWEsIG9mcmVjaWVuZG8gaW5mb3JtYWNpw7NuIGNsYXZlIHBhcmEgdG9tYXIgZGVjaXNpb25lcyBlc3RyYXTDqWdpY2FzIHkgYmllbiBmdW5kYW1lbnRhZGFzLg0KDQoNCkVsIG9iamV0aXZvIGFudGVzIG1lbmNpb25hZG8gZGUgImlkZW50aWZpY2FyIGNhbXBvcyBxdWUgcmVxdWllcmFuIG1heW9yIGF0ZW5jacOzbiwgZGV0ZWN0YXIgcGF0cm9uZXMgc2lnbmlmaWNhdGl2b3MgeSBlbGltaW5hciBwb3NpYmxlcyByZWR1bmRhbmNpYXMiICBzZSBhbGNhbnphIG1lZGlhbnRlIGVsIHVzbyBkZSBtw6l0b2RvcyBkZSByZWR1Y2Npw7NuIGRlIGRpbWVuc2lvbmFsaWRhZC4gRXN0b3MgbcOpdG9kb3MgcGVybWl0ZW4gcmVwcmVzZW50YXIgZ3LDoWZpY2FtZW50ZSwgYSB0cmF2w6lzIGRlIGRpYWdyYW1hcyBkZSBiYXJyYXMsIGVsIG5pdmVsIGRlIGNvbnRyaWJ1Y2nDs24gZGUgY2FkYSBjYW1wbyBlbiBjYWRhIGRpbWVuc2nDs24uDQpQYXJhIGxvZ3JhciBlc3RvLCBzZSBlbGFib3JhIHVuIGdyw6FmaWNvIHBhcmEgY2FkYSBkaW1lbnNpw7NuIGlkZW50aWZpY2FkYSBlbiBlbCBhbsOhbGlzaXMsIGVuIGVsIGN1YWwgY2FkYSBjYW1wbyBjb250cmlidXllIGNvbW8gdW5hIGRpbWVuc2nDs24gZW4gc8OtIG1pc21hLiBQb3IgbG8gdGFudG8sIGFsIHRyYWJhamFyIGNvbiA0IHZhcmlhYmxlcyBjdWFudGl0YXRpdmFzIGVuIGVzY2FsYSByYXrDs24sIHN1cmdlbiA0IGRpbWVuc2lvbmVzIGEgYW5hbGl6YXIuIEVzdGUgZW5mb3F1ZSBwcm9wb3JjaW9uYSB1bmEgcmVwcmVzZW50YWNpw7NuIHZpc3VhbCBjbGFyYSB5IGNvbXByZW5zaWJsZSBkZSBjw7NtbyBjYWRhIGNhbXBvIGluZmx1eWUgZW4gbGFzIGRpc3RpbnRhcyBkaW1lbnNpb25lcywgZmFjaWxpdGFuZG8gbGEgaW50ZXJwcmV0YWNpw7NuIGRlIGxvcyByZXN1bHRhZG9zIHkgbGEgdG9tYSBkZSBkZWNpc2lvbmVzIGZ1bmRhbWVudGFkYXMuDQrigIMNCioqY29uY2x1c2lvbioqDQoNCkdyYWNpYXMgYWwgZXN0dWRpbyBkZSAqKm1hdHJpeiBkZSBjb250cmlidWNpb25lcyoqIGVzIHBvc2libGUgaWRlbnRpZmljYXIgZW4gZm9ybWEgZGUgcG9yY2VudGFqZXMgY3VhbnRvIGNvbnRyaWJ1eWUgY2FkYSB1bmEgZGUgbGFzIHZhcmlhYmxlcyBhIGxhcyBkaXN0aW50YXMgZGltZW5zaW9uZXMsIGVuIGRvbmRlIGVsIGNhbXBvICoqY29tbWVudHMqKiBubyBzZSBwcmVzZW50YSBlbiBuaW5ndW5hIGRpbWVuc2nDs24gY29tbyBlbCBtYXlvciBjb250cmlidXllbnRlIGZyZW50ZSBhIGxvcyBvdHJvcyBjYW1wb3MsIHN1IG1heW9yIGNvbnRyaWJ1Y2nDs24gZXMgZW4gbGEgZGltZW5zacOzbiAzIGNvbiB1biAqKjI5LjgwODElKiouIFBvciBvdHJvIGxhZG8sIGNvbnRyYXJpbyBhICoqY29tbWVudHMqKiBlbCBjYW1wbyAqKnZpZXdzKiogc2UgcHJlc2VudGEgZW4gMiBkaW1lbnNpb25lcyBjb21vIGVsIG1heW9yIGNvbnRyaWJ1eWVudGUgZnJlbnRlIGEgbG9zIG90cm9zIGNhbXBvcyBjb24gcG9yY2VudGFqZXMgZGUgKio1My41MDU3IC0gMjYuMzcxNCoqIC4NCk1lZGlhbnRlIGxvcyBncsOhZmljb3MgZGUgYmFycmFzIHBhcmEgY2FkYSBkaW1lbnNpw7NuICJEMSxEMixEMyxENCIsIHNlIHB1ZWRlIHZpc3VhbGl6YXIgZGUgZm9ybWEgbcOhcyByZXByZXNlbnRhdGl2YSBsbyBhbnRlcyBtZW5jaW9uYWRvLCBhZGVtw6FzIGEgZXN0bywgdGFtYmnDqW4gc2UgcHVlZGUgdmlzdWFsaXphciBxdWUgbG9zIGNhbXBvcyAqKmZvcmtzKiogeSAqKnZvdGVzKiogdGllbmVuIHVuYSBtYXlvciBjb250cmlidWNpw7NuIGVuIGxhcyBkaW1lbnNpb25lcyAqKkQyKiogeSAqKkQ0KiogcmVzcGVjdGl2YW1lbnRlLiANCkRlIGVzdG8gc2UgcHVlZGUgY29uY2x1aXIgcXVlIGFsIGVzdHVkaWFyIGVzdG9zIGRpc3RpbnRvcyBjYW1wb3MgKip2b3RlcywgY29tbWVudHMsIHZpZXdzIHkgZm9ya3MqKiBlbiB1bmEgc29sYSBkaW1lbnNpw7NuLCBzZSBwdWVkZW4gdGVuZXIgdW4gYW7DoWxpc2lzIHNhdGlzZmFjdG9yaW8geWEgcXVlIGVuIGVzdGEgZGltZW5zacOzbiBlcyBkb25kZSB0b2RvcyBsb3MgY2FtcG9zIGNvbnRyaWJ1eWVuIGVuIG1lZGlkYXMgcHJvcG9yY2lvbmFsZXMuDQoNCiMjIyMgTWF0cml6IGRlIENvbnRyaWJ1Y2lvbmVzIHsudGFic2V0ICAudGFic2V0LXBpbGxzfQ0KDQpgYGB7ciBNYXRyaXpfZGVfQ29udHJpYnVjaW9uZXMsIGZpZy5hbGlnbj0nY2VudGVyJ30NCg0Kcm91bmQoKGdldF9wY2FfdmFyKFBDQShEYXRhc2V0WywtYygyLDMsNCw1LDYsMTApXSwgbmNwID0gNCwgc2NhbGUudW5pdCA9IFRSVUUsIGdyYXBoID0gRikpKSRjb250cmliLDQpDQoNCmBgYA0KDQojIyMjIENvbnRyaWJ1Y2lvbmVzIGEgRDEgDQpgYGB7ciBDb250cmlidWNpb25lc19hX0QxLCBmaWcuYWxpZ249J2NlbnRlcid9DQpmdml6X2NvbnRyaWIoUENBKERhdGFzZXRbLC1jKDIsMyw0LDUsNiwxMCldLCBuY3AgPSA0LCBzY2FsZS51bml0ID0gVFJVRSwgZ3JhcGggPSBGKSwgY2hvaWNlID0gInZhciIsIGF4ZXMgPSAxLCB0b3AgPSAxMCkNCg0KYGBgDQoNCiMjIyMgQ29udHJpYnVjaW9uZXMgYSBEMiANCmBgYHtyIENvbnRyaWJ1Y2lvbmVzX2FfRDIsIGZpZy5hbGlnbj0nY2VudGVyJ30NCmZ2aXpfY29udHJpYihQQ0EoRGF0YXNldFssLWMoMiwzLDQsNSw2LDEwKV0sIG5jcCA9IDQsIHNjYWxlLnVuaXQgPSBUUlVFLCBncmFwaCA9IEYpLCBjaG9pY2UgPSAidmFyIiwgYXhlcyA9IDIsIHRvcCA9IDEwKQ0KDQpgYGANCg0KIyMjIyBDb250cmlidWNpb25lcyBhIEQzIA0KYGBge3IgQ29udHJpYnVjaW9uZXNfYV9EMywgZmlnLmFsaWduPSdjZW50ZXInfQ0KZnZpel9jb250cmliKFBDQShEYXRhc2V0WywtYygyLDMsNCw1LDYsMTApXSwgbmNwID0gNCwgc2NhbGUudW5pdCA9IFRSVUUsIGdyYXBoID0gRiksIGNob2ljZSA9ICJ2YXIiLCBheGVzID0gMywgdG9wID0gMTApDQoNCmBgYA0KDQojIyMjIENvbnRyaWJ1Y2lvbmVzIGEgRDQgDQpgYGB7ciBDb250cmlidWNpb25lc19hX0Q0LCBmaWcuYWxpZ249J2NlbnRlcid9DQpmdml6X2NvbnRyaWIoUENBKERhdGFzZXRbLC1jKDIsMyw0LDUsNiwxMCldLCBuY3AgPSA0LCBzY2FsZS51bml0ID0gVFJVRSwgZ3JhcGggPSBGKSwgY2hvaWNlID0gInZhciIsIGF4ZXMgPSA0LCB0b3AgPSAxMCkNCg0KYGBgDQoNCiMjIyAqKjIuNSBJbnRlcnByZXRhY2lvbioqIHsudGFic2V0ICAudGFic2V0LXBpbGxzfQ0KDQpFbiBlc3RhIHNlY2Npw7NuIHNlIGJ1c2NhIGVudGVuZGVyIGPDs21vIHNlIHJlbGFjaW9uYW4gdmFyaW9zIGNhbXBvcyB5IG9ic2VydmFjaW9uZXMgZGVudHJvIGRlIHVuIGNvbmp1bnRvIGRlIGRhdG9zLCBQYXJhIGludGVycHJldGFyIG1lam9yIGVzdGEgaW5mb3JtYWNpw7NuLCBzZSB1dGlsaXphbiBoZXJyYW1pZW50YXMgY29tbyBsYXMgY29vcmRlbmFkYXMgaW5kaXZpZHVhbGVzLCBxdWUgbm9zIG11ZXN0cmFuIGPDs21vIHNlIHBvc2ljaW9uYW4gbGFzIG9ic2VydmFjaW9uZXMgZW4gdW4gZXNwYWNpbyBtw6FzIHNpbXBsZSwgeSBlbCBiaXBsb3QgZGUgdmFyaWFibGVzIHkgcmVnaXN0cm9zLCBxdWUganVudGEgZW4gdW4gbWlzbW8gZ3LDoWZpY28gbGFzIGNvbmV4aW9uZXMgZW50cmUgcmVnaXN0cm9zIHkgdmFyaWFibGVzLiBFc3RhcyBoZXJyYW1pZW50YXMgbm9zIHBlcm1pdGVuIGRlc2N1YnJpciBwYXRyb25lcywgdGVuZGVuY2lhcyB5IHJlbGFjaW9uZXMgaW1wb3J0YW50ZXMsIGhhY2llbmRvIG3DoXMgZsOhY2lsIGNvbXByZW5kZXIgbGEgZXN0cnVjdHVyYSBkZSBsb3MgZGF0b3MgeSB0b21hciBkZWNpc2lvbmVzIGJhc2FkYXMgZW4gZWxsb3MuDQoNCg0KRWwgYXBhcnRhZG8gZGUgKipjb29yZGVuYWRhcyBpbmRpdmlkdWFsZXMqKiBtdWVzdHJhIHVuIGxpc3RhZG8gZGUgY29vcmRlbmFkYXMgZGUgbGFzIGRpc3RpbnRhcyBvYnNlcnZhY2lvbmVzIGRlIGVzdGUgY29uanVudG8gZGUgZGF0b3MgZW4gbGFzIHJlc3BlY3RpdmFzIGRpbWVuc2lvbmVzIChsb3MgY2FtcG9zIGN1YW50aXRhdGl2b3MgZGUgZXNjYWxhIHJhesOzbiksIGRvbmRlIGNhZGEgY29vcmRlbmFkYSBjb3JyZXNwb25kZSBhIGxhIHBvc2ljacOzbiBkZSB1bmEgb2JzZXJ2YWNpw7NuIGVuIGVzdGFzIGRpbWVuc2lvbmVzIGNsYXZlIGxvIGN1YWwgcGVybWl0ZSBpZGVudGlmaWNhciBhZ3J1cGFtaWVudG9zLCBzaW1pbGl0dWRlcyB5IHBhdHJvbmVzIGVudHJlIGxvcyByZWdpc3Ryb3MuIA0KUG9yIG90cm8gbGFkbywgZWwgKipCaXBsb3QgZGUgVmFyaWFibGVzIHkgUmVnaXN0cm9zKiogZXMgdW5hIGdyw6FmaWNhIHF1ZSBjb21iaW5hIGVuIHVuIG1pc21vIGVzcGFjaW8gbGFzIHJlbGFjaW9uZXMgZW50cmUgbGFzIG9ic2VydmFjaW9uZXMgKHJlZ2lzdHJvcykgeSBsb3MgY2FtcG9zIGRlIHVuIGNvbmp1bnRvIGRlIGRhdG9zLCBwZXJtaXRpZW5kbyBhbmFsaXphciBjw7NtbyBlc3RhcyBpbnRlcmFjY2lvbmVzIHNlIGFzb2NpYW4gY29uIHVuYSB2YXJpYWJsZSBjYXRlZ8OzcmljYSwgY29tbyAqKmNvZGVfdHlwZSoqLiBFc3RlIGVuZm9xdWUgdmlzdWFsIG11ZXN0cmEgc2kgbGFzIGNhdGVnb3LDrWFzIGRlIGxhIHZhcmlhYmxlIGRpY290w7NtaWNhIGluZmx1eWVuIGVuIGxhIGRpc3RyaWJ1Y2nDs24gZGUgbG9zIHJlZ2lzdHJvcywgcmV2ZWxhbmRvIHBvc2libGVzIGFncnVwYWNpb25lcyBzZWfDum4gZGljaGFzIGNhdGVnb3LDrWFzLiBBZGVtw6FzLCBsb3MgdmVjdG9yZXMgZGUgbGFzIHZhcmlhYmxlcyBvcmlnaW5hbGVzIGluZGljYW4gY3XDoWxlcyB0aWVuZW4gbWF5b3IgaW1wYWN0byBlbiBsYSBzZXBhcmFjacOzbiBlbnRyZSBjYXRlZ29yw61hcy4gRXN0byBmYWNpbGl0YSBsYSBpZGVudGlmaWNhY2nDs24gZGUgcGF0cm9uZXMgY2xhdmUgZW4gY2FkYSBncnVwbyB5IGF5dWRhIGEgY29tcHJlbmRlciBjw7NtbyBsb3MgZGl2ZXJzb3MgY2FtcG9zIGludGVyYWN0w7phbiBjb24gbGEgdmFyaWFibGUgY2F0ZWfDs3JpY2EgZW4gZWwgY29uanVudG8gZGUgZGF0b3MuIA0KDQoqKmNvbmNsdXNpb24qKg0KDQpFbCBkaWFncmFtYSBkZSAqKkNvb3JkZW5hZGFzIGluZGl2aWR1YWxlcyoqIG11ZXN0cmEgY29tbyBtdWNob3MgcmVnaXN0cm9zIHRpZW5lbiB2YWxvcmVzIG11eSBzaW1pbGFyZXMgbyBpZMOpbnRpY29zIGVuIGxhcyBkaWZlcmVudGVzIGRpbWVuc2lvbmVzLCBlc3BlY2lhbG1lbnRlIGFscmVkZWRvciBkZSB2YWxvcmVzIGNlcmNhbm9zIGEgY2Vyby4gRXN0byBzdWdpZXJlIHF1ZSBwb2Ryw61hIGhhYmVyIHBvY2EgdmFyaWFiaWxpZGFkIGVudHJlIGxhcyBvYnNlcnZhY2lvbmVzIHByb3llY3RhZGFzIGVuIGVzdGFzIGRpbWVuc2lvbmVzLCBpbmRpY2FuZG8gcXVlIGVzdGFzIGRpbWVuc2lvbmVzIG5vIGNhcHR1cmFuIGluZm9ybWFjacOzbiBzaWduaWZpY2F0aXZhIG8gZGlmZXJlbmNpYWRvcmEgZW4gbGEgbWF5b3LDrWEgZGUgbG9zIGNhc29zLg0KRW4gY3VhbnRvIGFsICoqQmlwbG90IGRlIFZhcmlhYmxlcyB5IFJlZ2lzdHJvcyoqIHNlIHB1ZWRlIHZpc3VhbGl6YXIgcXVlIGxhIG1heW9yw61hIGRlIGxvcyByZWdpc3Ryb3MgZXN0w6FuIGFncnVwYWRvcyBjZXJjYSBkZWwgb3JpZ2VuLCBsbyBxdWUgc3VnaWVyZSBxdWUgY29tcGFydGVuIGNhcmFjdGVyw61zdGljYXMgc2ltaWxhcmVzIHNpbiB2YWxvcmVzIGV4dHJlbW9zIGVuIGxhcyB2YXJpYWJsZXMgcmVwcmVzZW50YWRhczsgYWRlbcOhcyBhIGVzdG8sIHNlIHB1ZWRlIHNvcG9ydGFyIG3DoXMgbG8gcHJlc2VudGFkbyBlbiBbc2VjY2nDs24gMi40XSgjc2VjMiksIGRvbmRlIG1lZGlhbnRlIGxvcyBncsOhZmljb3MgcHJlc2VudGVzIHNlIHJlYWxpesOzIHVuYSBpbmZlcmVuY2lhIGRlIHF1ZSBlbiBsYSBkaW1lbmNpb24xIChEaW0xKSBlcmEgbGEgbcOhcyBkZXN0YWNhZGEgcGFyYSBkaWZlcmVuY2lhciByZWdpc3Ryb3MsIHlhIHF1ZSBlc3RhIGV4cGxpY2EgZWwgNjkuNCUgZGUgbGEgdmFyaWFiaWxpZGFkLg0KDQojIyMjIEJpcGxvdCBkZSBWYXJpYWJsZXMgeSBSZWdpc3Ryb3MgW0NvZGVfVHlwZV0NCg0KYGBge3IgQmlwbG90X2RlX1ZhcmlhYmxlc195X1JlZ2lzdHJvc19bQ29kZV9UeXBlXSwgZmlnLmFsaWduPSdjZW50ZXInfQ0KDQpzZXQuc2VlZCg3ODA3NTQpDQpEYXRhc2V0X011ZXN0cmVhZG8yID0gRGF0YXNldFtzYW1wbGUoMTpucm93KERhdGFzZXQpLDEwMCksLWMoMiwzLDQsNiwxMCldDQoNCkRhdGFzZXRfTXVlc3RyZWFkbzIkQ29kZV9UeXBlIDwtIGFzLmZhY3RvcihEYXRhc2V0X011ZXN0cmVhZG8yJENvZGVfVHlwZSkNCg0KZnZpel9wY2FfYmlwbG90KFBDQShEYXRhc2V0X011ZXN0cmVhZG8yWyxdLCBuY3AgPSA0LCBzY2FsZS51bml0ID0gVFJVRSwgZ3JhcGggPSBGLCBxdWFsaS5zdXAgPSAiQ29kZV9UeXBlIiksIGF4ZXMgPSBjKDEsMiksIHJlcGVsID0gVFJVRSwgaGFiaWxsYWdlID0gIkNvZGVfVHlwZSIpDQpgYGANCg0KDQojIyMjIENvb3JkZW5hZGFzIEluZGl2aWR1YWxlcyBbU3ViY29uanVudG8gQ29kZV9UeXBlXQ0KYGBge3IgQ29vcmRlbmFkYXNfSW5kaXZpZHVhbGVzX1tTdWJjb25qdW50b19Db2RlX1R5cGVdLCBmaWcuYWxpZ249J2NlbnRlcid9DQoNCg0KDQpzZXQuc2VlZCg3ODA3MjgpDQpEYXRhc2V0X011ZXN0cmVhZG9fY29vciA8LSBEYXRhc2V0W3NhbXBsZSgxOm5yb3coRGF0YXNldCksIDEwMCksIC1jKDIsMyw0LDYsMTApXQ0Kc2V0LnNlZWQoNzgwNzI4KQ0Kc2FtcGxlZF9yb3dzIDwtIHNhbXBsZSgxOm5yb3coRGF0YXNldCksIDEwMCkNCg0KRGF0YV9jb29yIDwtIGNiaW5kKERhdGFzZXRfTXVlc3RyZWFkb19jb29yW3NhbXBsZWRfcm93cyxdKQ0Kc3VwcHJlc3NXYXJuaW5ncyhoZWFkKFBDQShEYXRhX2Nvb3IsIG5jcCA9IDYsIHNjYWxlLnVuaXQgPSBULCBncmFwaCA9IEYsIHF1YWxpLnN1cCA9IDIpJGluZCRjb29yZCwgbiA9IDYxTCkpDQoNCg0KDQpgYGANCg0KIyMjIyBCaXBsb3QgZGUgVmFyaWFibGVzIHkgUmVnaXN0cm9zIFtTdWJjb25qdW50byBDb2RlX1R5cGVdDQoNCmBgYHtyIEJpcGxvdF9kZV9WYXJpYWJsZXNfeV9SZWdpc3Ryb3NfW1N1YmNvbmp1bnRvIENvZGVfVHlwZV0sIGZpZy5hbGlnbj0nY2VudGVyJ30NCg0Kc2V0LnNlZWQoNzgwNzIwKQ0KDQpEYXRhc2V0X011ZXN0cmVhZG9fYmlwbG90ID0gRGF0YXNldFtzYW1wbGUoMTpucm93KERhdGFzZXQpLDEwMCksLWMoMiwzLDQsNiwxMCldDQpEYXRhc2V0X011ZXN0cmVhZG9fYmlwbG90JENvZGVfVHlwZSA8LSBhcy5mYWN0b3IoRGF0YXNldF9NdWVzdHJlYWRvX2JpcGxvdCRDb2RlX1R5cGUpDQpmdml6X3BjYV9iaXBsb3QoUENBKERhdGFzZXRfTXVlc3RyZWFkb19iaXBsb3QsIG5jcCA9ICwgc2NhbGUudW5pdCA9IFRSVUUsIGdyYXBoID0gRiwgcXVhbGkuc3VwID0gIkNvZGVfVHlwZSIpLCBheGVzID0gYygxLCAyKSwgcmVwZWwgPSBUUlVFLCBoYWJpbGxhZ2UgPSAiQ29kZV9UeXBlIikNCg0KDQpgYGANCg0KIyMgKipGYXNlIDMgW0NvcnJlc3BvbmRlbmNpYXNdKioNCg0KIyMjICoqMy4xLiBPYmpldGl2b3MqKg0KDQotUmVhbGl6YXIgcHJ1ZWJhcyBkZSBoaXDDs3Rlc2lzLCBjb21vIGxhIHBydWViYSBkZSBjaGktY3VhZHJhZG8sIHBhcmEgY29uZmlybWFyIHNpIGxhcyB2YXJpYWJsZXMgY2F0ZWfDs3JpY2FzIHNvbiBpbmRlcGVuZGllbnRlcyBvIGVzdMOhbiBhc29jaWFkYXMuDQoNCi1SZXByZXNlbnRhciBWYXJpYWJsZXMgZGVsIGNvbmp1bnRvIGRlIGRhdG9zIGVuIHByb2Nlc29zIGVzdGFkw61zdGljb3MgY29tbyBsYSB0YWJsYSBkZSBjb250aW5nZW5jaWEsIHRhYmxhIGRlIHByb2JhYmlsaWRhZGVzLiANCg0KIyMjICoqMy4yLiBDb3JyZXNwb25kZW5jaWFzIFNpbXBsZXMqKiB7LnRhYnNldCAgLnRhYnNldC1waWxsc30NCg0KIkVuIGVsIGFuw6FsaXNpcyBkZSBkYXRvcywgbGFzIHZhcmlhYmxlcyBjdWFsaXRhdGl2YXMganVlZ2FuIHVuIHBhcGVsIGZ1bmRhbWVudGFsIHBhcmEgbGEgY29tcHJlbnNpw7NuIGRlIHBhdHJvbmVzIHkgcmVsYWNpb25lcyBkZW50cm8gZGUgdW4gY29uanVudG8gZGVsIGRhdG9zLiBFc3RlIGVzdHVkaW8gc2UgY2VudHJhIGVuIGxhIGFwbGljYWNpw7NuIGRlIGRpdmVyc2FzIHTDqWNuaWNhcyBlc3RhZMOtc3RpY2FzIHBhcmEgZXhwbG9yYXIgeSBhbmFsaXphciBsYXMgdmFyaWFibGVzIGN1YWxpdGF0aXZhcywgdXRpbGl6YW5kbyBoZXJyYW1pZW50YXMgY29tbyB0YWJsYXMgZGUgY29udGluZ2VuY2lhLCBwcm9iYWJpbGlkYWRlcywgZnJlY3VlbmNpYXMgeSBwZXJmaWxlcy4gQWRlbcOhcywgc2UgbGxldmFyw6FuIGEgY2FibyBwcnVlYmFzIGRlIGhpcMOzdGVzaXMgcGFyYSB2YWxpZGFyIGxhcyBzdXBvc2ljaW9uZXMgZm9ybXVsYWRhcy4gQSB0cmF2w6lzIGRlIGVzdGUgZW5mb3F1ZSwgc2UgYnVzY2Egb2J0ZW5lciB1bmEgdmlzacOzbiBtw6FzIGNsYXJhIHNvYnJlIGxhIGludGVycmVsYWNpw7NuIGRlIGxhcyB2YXJpYWJsZXMgZXN0dWRpYWRhcywgY29udHJpYnV5ZW5kbyBhc8OtIGEgdW5hIGludGVycHJldGFjacOzbiBtw6FzIHJvYnVzdGEgZGUgbG9zIHJlc3VsdGFkb3MuIg0KDQoiRWwgYW7DoWxpc2lzIGRlIGxhcyB2YXJpYWJsZXMgY3VhbGl0YXRpdmFzIHBlcm1pdGUgaWRlbnRpZmljYXIgdGVuZGVuY2lhcyB5IHBhdHJvbmVzIHF1ZSBzb24gZXNlbmNpYWxlcyBwYXJhIGxhIHRvbWEgZGUgZGVjaXNpb25lcyBpbmZvcm1hZGFzLiBFbiBlc3RlIGVzdHVkaW8sIHNlIHByb2NlZGVyw6EgYSBsYSBjb25zdHJ1Y2Npw7NuIGRlIHRhYmxhcyBkZSBjb250aW5nZW5jaWEgcXVlIHBlcm1pdGlyw6FuIHZpc3VhbGl6YXIgbGFzIHJlbGFjaW9uZXMgZW50cmUgZGlmZXJlbnRlcyBjYXRlZ29yw61hcywgZmFjaWxpdGFuZG8gYXPDrSBsYSBpZGVudGlmaWNhY2nDs24gZGUgY29ycmVsYWNpb25lcyBzaWduaWZpY2F0aXZhcy4gQSB0cmF2w6lzIGRlbCBjw6FsY3VsbyBkZSBwcm9iYWJpbGlkYWRlcyB5IGZyZWN1ZW5jaWFzLCBzZSBkZXRlcm1pbmFyw6FuIGxhcyBkaXN0cmlidWNpb25lcyBkZSBsYXMgdmFyaWFibGVzLCBsbyBxdWUgb2ZyZWNlcsOhIHVuYSBjb21wcmVuc2nDs24gbcOhcyBwcm9mdW5kYSBkZSBzdSBjb21wb3J0YW1pZW50by4gQXPDrSBtaXNtbywgc2UgZWxhYm9yYXLDoW4gcGVyZmlsZXMgZGVzY3JpcHRpdm9zIHF1ZSByZXN1bWFuIGxhcyBjYXJhY3RlcsOtc3RpY2FzIGNsYXZlIGRlIGNhZGEgY2F0ZWdvcsOtYSwgcHJvcG9yY2lvbmFuZG8gdW4gY29udGV4dG8gdmFsaW9zbyBwYXJhIGxhcyBwcnVlYmFzIGRlIGhpcMOzdGVzaXMgcXVlIHNlIGxsZXZhcsOhbiBhIGNhYm8uDQoNCioqY29uY2x1c2lvbioqDQoNCkVuIGNvbmNsdXNpw7NuLCBFbiBsYSBwcmltZXJhIHRhYmxhLCBxdWUgY3J1emEgbGEgdmFyaWFibGUgImNvZGVfdHlwZSIgY29uICJsYW5ndWFnZSIsIHNlIGRlc3RhY2EgcXVlIGVsIG5vbWJyZSBxdWUgbcOhcyBmcmVjdWVudGVtZW50ZSBhcGFyZWNlIGVzICJub3RlYm9vayIgZW4gY29tYmluYWNpw7NuIGNvbiAiUHl0aG9uIi4gRGUgdW4gdG90YWwgZGUgOTU3IHJlZ2lzdHJvcywgNTQwIGNvcnJlc3BvbmRlbiBhIGVzdGEgY29tYmluYWNpw7NuIGVzcGVjw61maWNhLiBFc3RvIGluZGljYSBxdWUgbcOhcyBkZWwgNTYlIGNvcnJlc3BvbmRlIGEgZXN0YSBjb21iaW5hY2nDs24geSBlc3RvIHNlIHB1ZWRlIGV2aWRlbmNpYXIgZW4gbGEgdGFibGEgZGUgcHJvYmFiaWxpZGFkZXMuDQpFbiBsYSBzZWd1bmRhIHRhYmxhIGRlIGNvbnRpbmdlbmNpYSwgcXVlIGNydXphIGxhIHZhcmlhYmxlICJjb3VudHJ5IiBjb24gImxhbmd1YWdlIiwgc2Ugb2JzZXJ2YSBxdWUgbGEgY29tYmluYWNpw7NuIG3DoXMgcHJvbWluZW50ZSBlcyBsYSBkZSAiVW5pdGVkIFN0YXRlcyIgY29uICJQeXRob24iLiBEZSB1biB0b3RhbCBkZSA5NTcgcmVnaXN0cm9zLCBlc3RhIGNvbWJpbmFjacOzbiBhbGNhbnphIHVuIHRvdGFsIGRlIDE5NiBjYXNvcywgbG8gcXVlIHJlcHJlc2VudGEgbcOhcyBkZWwgMjAlIGRlbCB0b3RhbC4gRXN0ZSBkYXRvIGVzIHBhcnRpY3VsYXJtZW50ZSBzaWduaWZpY2F0aXZvLCB5YSBxdWUgc3VnaWVyZSBxdWUgdW5hIHF1aW50YSBwYXJ0ZSBkZSBsb3MgcmVnaXN0cm9zIHByb3ZpZW5lIGRlIHVzdWFyaW9zIGVuIEVzdGFkb3MgVW5pZG9zIHF1ZSB1dGlsaXphbiBQeXRob24gY29tbyBzdSBsZW5ndWFqZSBkZSBwcm9ncmFtYWNpw7NuIHByZWZlcmlkby4NCkVuIGxhIHRlcmNlcmEgdGFibGEgZGUgY29udGluZ2VuY2lhLCBkb25kZSBzZSBjcnV6YW4gbGFzIHZhcmlhYmxlcyAiY291bnRyeSIgeSAiY29kZV90eXBlIiwgc2UgZXZpZGVuY2lhIHVuYSB2ZXogbcOhcyBsYSBwcm9taW5lbmNpYSBkZSBFc3RhZG9zIFVuaWRvcyBlbiBlbCB1c28gZGUgIm5vdGVib29rcyIuIEVzcGVjw61maWNhbWVudGUsIGVzdGEgY29tYmluYWNpw7NuIHJlZ2lzdHJhIHVuIHRvdGFsIGRlIDE2NSBjYXNvcyBkZSB1biB0b3RhbCBkZSA5NTcsIGxvIHF1ZSByZXByZXNlbnRhIG3DoXMgZGVsIDE3JSBkZSB0b2RvcyBsb3MgcmVnaXN0cm9zIGFuYWxpemFkb3MuIA0KQ29uIGJhc2UgZW4gZWwgYW7DoWxpc2lzIHJlYWxpemFkbyBhIHRyYXbDqXMgZGUgdGFibGFzIGRlIGNvbnRpbmdlbmNpYSB5IGVsIGPDoWxjdWxvIGRlIHByb2JhYmlsaWRhZGVzLCBzZSBwdWVkZSBjb25jbHVpciBxdWUgbGFzIGNvbWJpbmFjaW9uZXMgZGUgbGFzIHZhcmlhYmxlcyBjdWFsaXRhdGl2YXMgZXN0dWRpYWRhc+KAlCJjb3VudHJ5IiwgImxhbmd1YWdlIiB5ICJjb2RlX3R5cGUi4oCUcmV2ZWxhbiBwYXRyb25lcyBjbGFyb3MgeSBzaWduaWZpY2F0aXZvcy4gRW4gcGFydGljdWxhciwgc2UgZXZpZGVuY2lhIHF1ZSBlbCBwYcOtcyBxdWUgbcOhcyBzZSBkZXN0YWNhIGVzICJVbml0ZWQgU3RhdGVzIiwgbWllbnRyYXMgcXVlIGVsIGxlbmd1YWplIG3DoXMgdXRpbGl6YWRvIGVzICJQeXRob24iIHkgZWwgdGlwbyBkZSBjw7NkaWdvIG3DoXMgZnJlY3VlbnRlIGVzICJub3RlYm9vayIuIA0KDQoNCkVsIGVzdHVkaW8gZGUgcGVyZmlsZXMgY29tcGxlbWVudGEgeSByZXNwYWxkYSBsYXMgY29uY2x1c2lvbmVzIGFudGVyaW9yZXMgYWwgcHJvcG9yY2lvbmFyIHVuYSByZXByZXNlbnRhY2nDs24gdmlzdWFsIGNsYXJhIGRlIGxhcyB0ZW5kZW5jaWFzIGlkZW50aWZpY2FkYXMgZW4gbG9zIGFuw6FsaXNpcyBwcmV2aW9zLiBBIHRyYXbDqXMgZGUgZ3LDoWZpY29zLCBzZSBldmlkZW5jaWEgZGUgbWFuZXJhIGNvbnR1bmRlbnRlIHF1ZSBsYXMgY29tYmluYWNpb25lcyBkZSB2YXJpYWJsZXMgbcOhcyBpbmZsdXllbnRlcyBlbiBlc3RlIGNvbnRleHRvIHNvbiAiVW5pdGVkIFN0YXRlcyIsICJQeXRob24iIHkgIm5vdGVib29rIi4gDQpQcnVlYmEgZGUgaGlww7N0ZXNpcw0KSDA6TGFzIHZhcmlhYmxlcyBjYXRlZ8OzcmljYXMgc29uIGluZGVwZW5kaWVudGVzDQpIMTpsYXMgdmFyaWFibGVzIGNhdGVnw7NyaWNhcyBzb24gZGVwZW5kaWVudGVzDQpSZWxhY2nDs24gZW50cmUgQ29kZV9UeXBlIHkgTGFuZ3VhZ2UNCkRhZG8gcXVlIGVsIHAtdmFsb3IgZXMgbXVjaG8gbWVub3IgcXVlIDAuMDUsIHNlIHJlY2hhemEgbGEgaGlww7N0ZXNpcyBudWxhIGRlIGluZGVwZW5kZW5jaWEgZW50cmUgQ29kZV9UeXBlIHkgTGFuZ3VhZ2UuIEVzdG8gaW5kaWNhIHF1ZSBoYXkgdW5hIHJlbGFjacOzbiBlc3RhZMOtc3RpY2FtZW50ZSBzaWduaWZpY2F0aXZhIGVudHJlIGFtYm9zLg0KUmVsYWNpw7NuIGVudHJlIENvdW50cnkgeSBMYW5ndWFnZQ0KQ29uIHVuIHAtdmFsb3IgZGUgMC45ODkxIChtdXkgbWF5b3IgcXVlIDAuMDUpLCBubyBzZSByZWNoYXphIGxhIGhpcMOzdGVzaXMgbnVsYS4gRXN0byBzdWdpZXJlIHF1ZSBubyBoYXkgZXZpZGVuY2lhIGVzdGFkw61zdGljYSBzdWZpY2llbnRlIHBhcmEgYWZpcm1hciBxdWUgZXhpc3RlIHVuYSByZWxhY2nDs24gZW50cmUgQ291bnRyeSB5IExhbmd1YWdlLiBBbWJvcyBwYXJlY2VuIHNlciBpbmRlcGVuZGllbnRlcy4NClJlbGFjacOzbiBlbnRyZSBDb3VudHJ5IHkgQ29kZV9UeXBlDQpjb24gdW4gcC12YWxvciBkZSAwLjg5OSAobXVjaG8gbWF5b3IgcXVlIDAuMDUpLCBubyBzZSByZWNoYXphIGxhIGhpcMOzdGVzaXMgbnVsYS4gRXN0byBpbmRpY2EgcXVlIG5vIGhheSBldmlkZW5jaWEgZXN0YWTDrXN0aWNhIGRlIHVuYSByZWxhY2nDs24gZW50cmUgQ291bnRyeSB5IENvZGVfVHlwZS4gUGFyZWNlbiBzZXIgaW5kZXBlbmRpZW50ZXMuDQoNCiMjIyMgQW5hbGlzaXMgZGUgQ29ycmVzcG9uZGVuY2lhcyB7LnRhYnNldCAudGFic2V0LXBpbGxzfQ0KDQojIyMjIyBUYWJsYSBkZSBDb250aW5nZW5jaWENCmBgYHtyIFRhYmxhX2RlX0NvbnRpbmdlbmNpYSwgZmlnLmFsaWduPSdjZW50ZXInfQ0KDQoNCmFkZG1hcmdpbnModGFibGUoRGF0YXNldCRDb2RlX1R5cGUsIERhdGFzZXQkTGFuZ3VhZ2UpKQ0KDQphZGRtYXJnaW5zKHRhYmxlKERhdGFzZXQkQ291bnRyeSwgRGF0YXNldCRMYW5ndWFnZSkpDQoNCmFkZG1hcmdpbnModGFibGUoRGF0YXNldCRDb3VudHJ5LCBEYXRhc2V0JENvZGVfVHlwZSkpDQpgYGANCiMjIyMjIFByb2JhYmlsaWRhZGVzIA0KYGBge3IgUHJvYmFiaWxpZGFkZXMsIGZpZy5hbGlnbj0nY2VudGVyJ30NCg0Kcm91bmQoYWRkbWFyZ2lucyhwcm9wLnRhYmxlKHRhYmxlKERhdGFzZXQkQ29kZV9UeXBlLCBEYXRhc2V0JExhbmd1YWdlKSkqMTAwKSwyKQ0KDQpyb3VuZChhZGRtYXJnaW5zKHByb3AudGFibGUodGFibGUoRGF0YXNldCRDb3VudHJ5LCBEYXRhc2V0JExhbmd1YWdlKSkqMTAwKSwyKQ0KDQpyb3VuZChhZGRtYXJnaW5zKHByb3AudGFibGUodGFibGUoRGF0YXNldCRDb3VudHJ5LCBEYXRhc2V0JENvZGVfVHlwZSkpKjEwMCksMikNCmBgYA0KDQoNCiMjIyMjIEZyZWN1ZW5jaWFzIA0KYGBge3IgRnJlY3VlbmNpYXMsIGZpZy5hbGlnbj0nY2VudGVyJ30NCg0Kcm91bmQoYWRkbWFyZ2lucyhwcm9wLnRhYmxlKHRhYmxlKERhdGFzZXQkQ29kZV9UeXBlLCBEYXRhc2V0JExhbmd1YWdlKSwgMSkqMTAwLCAyKSwgMikNCg0Kcm91bmQoYWRkbWFyZ2lucyhwcm9wLnRhYmxlKHRhYmxlKERhdGFzZXQkQ291bnRyeSwgRGF0YXNldCRMYW5ndWFnZSksIDEpKjEwMCwgMiksIDIpDQoNCnJvdW5kKGFkZG1hcmdpbnMocHJvcC50YWJsZSh0YWJsZShEYXRhc2V0JENvdW50cnksIERhdGFzZXQkQ29kZV9UeXBlKSwgMSkqMTAwLCAyKSwgMikNCmBgYA0KDQojIyMjIyBQZXJmaWxlcyANCmBgYHtyIFBlcmZpbGVzLCBmaWcuYWxpZ249J2NlbnRlcid9ICAgDQpwbG90Y3QodGFibGUoRGF0YXNldCRDb2RlX1R5cGUsIERhdGFzZXQkTGFuZ3VhZ2UpLCJyb3ciKQ0KDQpwbG90Y3QodGFibGUoRGF0YXNldCRDb3VudHJ5LCBEYXRhc2V0JExhbmd1YWdlKSwicm93IikNCg0KcGxvdGN0KHRhYmxlKERhdGFzZXQkQ291bnRyeSwgRGF0YXNldCRDb2RlX1R5cGUpLCJyb3ciKQ0KDQpgYGANCg0KDQojIyMjIyBQcnVlYmFzIGRlIEhpcG90ZXNpcw0KYGBge3IgUHJ1ZWJhc19kZV9IaXBvdGVzaXMsIGZpZy5hbGlnbj0nY2VudGVyJ30NCg0Kc3VwcHJlc3NXYXJuaW5ncyhjaGlzcS50ZXN0KHRhYmxlKERhdGFzZXQkQ29kZV9UeXBlLCBEYXRhc2V0JExhbmd1YWdlKSkpDQoNCnN1cHByZXNzV2FybmluZ3MoY2hpc3EudGVzdCh0YWJsZShEYXRhc2V0JENvdW50cnksIERhdGFzZXQkTGFuZ3VhZ2UpKSkNCg0Kc3VwcHJlc3NXYXJuaW5ncyhjaGlzcS50ZXN0KHRhYmxlKERhdGFzZXQkQ291bnRyeSwgRGF0YXNldCRDb2RlX1R5cGUpKSkNCg0KDQpgYGANCiMjIyMgUGFyZWphIHVuaWNhIHsudGFic2V0IC50YWJzZXQtcGlsbHN9DQoNCkVsIGFuw6FsaXNpcyBDaGktY3VhZHJhZG8gc3VnaWVyZSBxdWUgZXhpc3RlIHVuYSBhc29jaWFjacOzbiBzaWduaWZpY2F0aXZhIGVudHJlIGVsIHRpcG8gZGUgY8OzZGlnbyAoQ29kZV9UeXBlKSB5IGVsIGxlbmd1YWplIChMYW5ndWFnZSksIHlhIHF1ZSBzZSBvYnNlcnZhbiBkZXN2aWFjaW9uZXMgaW1wb3J0YW50ZXMgZW50cmUgbG9zIHZhbG9yZXMgb2JzZXJ2YWRvcyB5IGVzcGVyYWRvcy4gRXN0byBpbmRpY2EgcXVlIGNpZXJ0YXMgY29tYmluYWNpb25lcyAocG9yIGVqZW1wbG8sICJOb3RlYm9vayIgY29uICJQeXRob24iKSBvY3VycmVuIG3DoXMgZnJlY3VlbnRlbWVudGUgZGUgbG8gcXVlIHNlIGVzcGVyYXLDrWEgYmFqbyBpbmRlcGVuZGVuY2lhLCBtaWVudHJhcyBxdWUgb3RyYXMgKHBvciBlamVtcGxvLCAiU2NyaXB0IiBjb24gIlIiKSBvY3VycmVuIG1lbm9zIGZyZWN1ZW50ZW1lbnRlLg0KDQoNCkNvbnRyaWJ1Y2lvbmVzDQpMYSB0YWJsYSBtdWVzdHJhIGxhcyBjb250cmlidWNpb25lcyBhbCBlc3RhZMOtc3RpY28gY2hpLWN1YWRyYWRvICjPh8KyKSBkZSBkb3MgdmFyaWFibGVzIGNhdGVnw7NyaWNhczogQ29kZV9UeXBlIHkgTGFuZ3VhZ2UuIFNlIGRlc3RhY2EgcXVlIE1hcmtkb3duIHRpZW5lIGxhIG1heW9yIGNvbnRyaWJ1Y2nDs24gZW4gYW1ib3MgdGlwb3MgZGUgZG9jdW1lbnRvcyAoTm90ZWJvb2sgeSBTY3JpcHQpLCBzdWdpcmllbmRvIHVuYSBhc29jaWFjacOzbiBtw6FzIGZ1ZXJ0ZSBjb24gZXN0ZSBsZW5ndWFqZS4gU2luIGVtYmFyZ28sIHBhcmEgdW5hIGNvbmNsdXNpw7NuIGRlZmluaXRpdmEsIHNlIG5lY2VzaXRhIGNvbm9jZXIgZWwgdmFsb3IgZGVsIM+HwrIgeSBzdSBwLXZhbG9yLCBhc8OtIGNvbW8gZWwgY29udGV4dG8gZGUgbG9zIGRhdG9zLiBFbiByZXN1bWVuLCBNYXJrZG93biBwYXJlY2Ugc2VyIGVsIGxlbmd1YWplIG3DoXMgcmVsZXZhbnRlIGVuIGVzdGEgY29tcGFyYWNpw7NuLg0KDQoNCkNvcnJlc3BvbmRlY2lhIHNpbXBsZQ0KTGEgdGFibGEgcHJlc2VudGEgbG9zIHJlc3VsdGFkb3MgZGUgdW4gYW7DoWxpc2lzIHF1ZSByZWxhY2lvbmEgZWwgdGlwbyBkZSBjw7NkaWdvIChDb2RlX1R5cGUpIHkgZWwgbGVuZ3VhamUgKExhbmd1YWdlKToNCiogJGVpZzogTGEgcHJpbWVyYSBkaW1lbnNpw7NuIGV4cGxpY2EgZWwgMzEuMjMlIGRlIGxhIHZhcmlhbnphIHRvdGFsLg0KKiAkY29vcmQ6IE11ZXN0cmEgbGFzIGNvb3JkZW5hZGFzIHBhcmEgY2FkYSBsZW5ndWFqZToNCiAgLSBNYXJrZG93biwgIC0gUHl0aG9uLCAgLSBSLCAgLSBTUUxpdGUuDQogIA0KICBMYXMgY29vcmRlbmFkYXMgaW5kaWNhbiBsYSBkaXJlY2Npw7NuIHkgZnVlcnphIGRlIGxhIHJlbGFjacOzbiBjb24gbGEgZGltZW5zacOzbiBwcmluY2lwYWwuDQoqICRjb250cmliOiBMYSBjb250cmlidWNpw7NuIGEgbGEgdmFyaWFuemEgdG90YWwgZW4gbGEgcHJpbWVyYSBkaW1lbnNpw7NuIGVzOg0KICAtIE1hcmtkb3duOiA3NC40NiUNCiAgLSBQeXRob246IG1lbm9yIGNvbnRyaWJ1Y2nDs24NCiAgLSBTUUxpdGU6IGNvbnRyaWJ1Y2nDs24gbcOtbmltYQ0KKiAkY29zMjogVG9kb3MgbG9zIHB1bnRvcyB0aWVuZW4gdW4gY29zZW5vIGN1YWRyYWRvIChjb3PCsikgZGUgMSwgbG8gcXVlIGluZGljYSB1bmEgZXhjZWxlbnRlIHJlcHJlc2VudGFjacOzbiBlbiBsYSBkaW1lbnNpw7NuIHByaW5jaXBhbC4NCiogJGluZXJ0aWE6IE11ZXN0cmEgbGEgaW5lcmNpYSBhc29jaWFkYSBhIGxhcyBkaW1lbnNpb25lcywgcmVmbGVqYW5kbyBsYSB2YXJpYW56YSBjYXB0dXJhZGEuDQpFbiByZXN1bWVuLCBlbCBhbsOhbGlzaXMgbXVlc3RyYSBxdWUgTWFya2Rvd24gZXMgZWwgbWF5b3IgY29udHJpYnV5ZW50ZSBhIGxhIHZhcmlhbnphIGVuIGxhIHByaW1lcmEgZGltZW5zacOzbiwgY29uIHVuYSByZXByZXNlbnRhY2nDs24gcGVyZmVjdGEgZW4gZWwgZXNwYWNpbyByZWR1Y2lkby4NCkVsIGFuw6FsaXNpcyBkZSBjb3JyZXNwb25kZW5jaWEgcmV2ZWxhIHF1ZSBleGlzdGUgdW5hIHJlbGFjacOzbiBzaWduaWZpY2F0aXZhIGVudHJlIGVsIHRpcG8gZGUgY8OzZGlnbyAoQ29kZV9UeXBlKSB5IGVsIGxlbmd1YWplIHV0aWxpemFkbyAoTGFuZ3VhZ2UpLiBFbiBwYXJ0aWN1bGFyLCBNYXJrZG93biBlcyBlbCBwcmluY2lwYWwgY29udHJpYnV5ZW50ZSBhIGxhIHZhcmlhbnphIGVuIGxhIHByaW1lcmEgZGltZW5zacOzbiwgbG8gcXVlIHN1Z2llcmUgcXVlIHNlIHV0aWxpemEgZGUgbWFuZXJhIHByZWRvbWluYW50ZSBlbiBjb21wYXJhY2nDs24gY29uIG90cm9zIGxlbmd1YWplcyBjb21vIFB5dGhvbiB5IFNRTGl0ZS4gQWRlbcOhcywgdG9kb3MgbG9zIHB1bnRvcyBlc3TDoW4gcGVyZmVjdGFtZW50ZSByZXByZXNlbnRhZG9zIGVuIGxhIGRpbWVuc2nDs24gcHJpbmNpcGFsLCBsbyBxdWUgaW5kaWNhIHF1ZSBlbCBtb2RlbG8gY2FwdHVyYSBhZGVjdWFkYW1lbnRlIGxhIGVzdHJ1Y3R1cmEgZGUgbG9zIGRhdG9zLiBFbiByZXN1bWVuLCBlc3RlIGFuw6FsaXNpcyBwcm9wb3JjaW9uYSBpbmZvcm1hY2nDs24gdmFsaW9zYSBzb2JyZSBjw7NtbyBzZSByZWxhY2lvbmFuIGRpZmVyZW50ZXMgdGlwb3MgZGUgY8OzZGlnbyBjb24gbG9zIGxlbmd1YWplcyB1dGlsaXphZG9zIGVuIGVsIGNvbmp1bnRvIGRlIGRhdG9zLg0KDQoNCiMjIyMjIENvbnRpbmdlbmNpYXMgeSBSZXNpZHVhbGVzIA0KYGBge3IgQ29udGluZ2VuY2lhc195X1Jlc2lkdWFsZXMsIGZpZy5hbGlnbj0nY2VudGVyJ30NCg0Kc3VwcHJlc3NXYXJuaW5ncyhjaGlzcS50ZXN0KHRhYmxlKERhdGFzZXQkQ29kZV9UeXBlLCBEYXRhc2V0JExhbmd1YWdlKSkkb2JzZXJ2ZWQpDQpzdXBwcmVzc1dhcm5pbmdzKGNoaXNxLnRlc3QodGFibGUoRGF0YXNldCRDb2RlX1R5cGUsIERhdGFzZXQkTGFuZ3VhZ2UpKSRleHBlY3RlZCkNCnN1cHByZXNzV2FybmluZ3MoY2hpc3EudGVzdCh0YWJsZShEYXRhc2V0JENvZGVfVHlwZSwgRGF0YXNldCRMYW5ndWFnZSkpJHJlc2lkdWFscykNCnN1cHByZXNzV2FybmluZ3MoY2hpc3EudGVzdCh0YWJsZShEYXRhc2V0JENvZGVfVHlwZSwgRGF0YXNldCRMYW5ndWFnZSkpJHN0ZHJlcykNCg0KYGBgDQoNCiMjIyMjIENvbnRyaWJ1Y2lvbmVzcyANCmBgYHtyIENvbnRyaWJ1Y2lvbmVzcywgZmlnLmFsaWduPSdjZW50ZXInfQ0Kc3VwcHJlc3NXYXJuaW5ncyhjaGlzcS50ZXN0KHRhYmxlKERhdGFzZXQkQ29kZV9UeXBlLCBEYXRhc2V0JExhbmd1YWdlKSkkcmVzaWR1YWxzXjIvY2hpc3EudGVzdCh0YWJsZShEYXRhc2V0JENvZGVfVHlwZSwgRGF0YXNldCRMYW5ndWFnZSkpJHN0YXRpc3RpYyoxMDApDQpgYGANCg0KIyMjIyMgQ29ycmVzcG9uZGVuY2lhIFNpbXBsZSBVbmlkaW1lbnNpb25hbCANCmBgYHtyIENvcnJlc3BvbmRlbmNpYV9TaW1wbGVfVW5pZGltZW5zaW9uYWx9DQpDQSh0YWJsZShEYXRhc2V0JENvZGVfVHlwZSwgRGF0YXNldCRMYW5ndWFnZSksIGdyYXBoID0gRkFMU0UpJGVpZw0KDQpgYGANCg0KYGBge3J9DQpDQSh0YWJsZShEYXRhc2V0JENvZGVfVHlwZSwgRGF0YXNldCRMYW5ndWFnZSksIGdyYXBoID0gRkFMU0UpJGNvbA0KYGBgDQoNCmBgYHtyfQ0KQ0EodGFibGUoRGF0YXNldCRDb2RlX1R5cGUsIERhdGFzZXQkTGFuZ3VhZ2UpLCBncmFwaCA9IEZBTFNFKSRyb3cNCmBgYA0KDQoNCg0KDQojIyMgKiozLjMuIENvcnJlc3BvbmRlbmNpYXMgTcO6bHRpcGxlcyoqIHsudGFic2V0ICAudGFic2V0LXBpbGxzfQ0KDQpFbiBlbCBhbsOhbGlzaXMgZGUgZGF0b3MsIGxhcyB2YXJpYWJsZXMgY3VhbGl0YXRpdmFzIGNsYXNpZmljYWRvcmFzIG9mcmVjZW4gdW5hIHZhbGlvc2EgcGVyc3BlY3RpdmEgc29icmUgbGFzIGRpZmVyZW5jaWFzIHkgc2ltaWxpdHVkZXMgZW50cmUgZ3J1cG9zLiBFbiBlc3RlIGVzdHVkaW8sIG5vcyBlbmZvY2FyZW1vcyBlbiB1bmEgw7puaWNhIHZhcmlhYmxlIGN1YWxpdGF0aXZhIGNsYXNpZmljYWRvcmE6ICJjb3VudHJ5IiwgcXVlIG5vcyBwZXJtaXRpcsOhIGV4cGxvcmFyIHVuIGNvbmp1bnRvIGRpdmVyc28gZGUgbmFjaW9uZXMuIEEgdHJhdsOpcyBkZSBsYSBhcGxpY2FjacOzbiBkZSBkaXZlcnNhcyBwcnVlYmFzIGRlIEFuw6FsaXNpcyBkZSBDb21wb25lbnRlcyBNw7psdGlwbGVzIChBQ00pLCBiaXRwbG8gQUNNLCBjYWxpZGFkIGRlIHJlcHJlc2VudGFjaW9uZXMsIGNvbnRyaWJ1Y2lvbmVzIHkgYml0cGxvIGRlIGNvbnRyaWJ1Y2lvbmVzLCBidXNjYXJlbW9zIGRlc2VudHJhw7FhciBwYXRyb25lcyBzaWduaWZpY2F0aXZvcyBlbiBjw7NtbyBjYWRhIHBhw61zIHNlIHByZXNlbnRhIHkgY29udHJpYnV5ZSBhIHN1IHJlc3BlY3Rpdm8gw6FtYml0by4gRXN0ZSBlbmZvcXVlIG5vcyBwZXJtaXRpcsOhIGlkZW50aWZpY2FyIHZhcmlhY2lvbmVzIGVudHJlIGxvcyBwYcOtc2VzLg0KDQpBbCBwcm9mdW5kaXphciBlbiBlbCBhbsOhbGlzaXMgZGUgbGEgdmFyaWFibGUgImNvdW50cnkiLCBzZSByZXZlbGEgbGEgY29tcGxlamlkYWQgZGUgbGFzIHBydWViYXMsIGNvbW8gZWwgQW7DoWxpc2lzIGRlIENvbXBvbmVudGVzIE3Dumx0aXBsZXMgKEFDTSkgeSBlbCBiaXRwbG8gQUNNLCBub3MgcGVybWl0ZW4gdmlzdWFsaXphciB5IGNvbXByZW5kZXIgY8OzbW8gY2FkYSBwYcOtcyBzZSBwb3NpY2lvbmEgZW4gcmVsYWNpw7NuIGNvbiBsYXMgbcOpdHJpY2FzIGRlIGNhbGlkYWQgZGUgcmVwcmVzZW50YWNpw7NuIHkgY29udHJpYnVjaW9uZXMuIEEgdHJhdsOpcyBkZWwgYW7DoWxpc2lzIGRlIGVzdGFzIHZhcmlhYmxlcywgZW1lcmdlbiBwYXRyb25lcyBxdWUgcmVmbGVqYW4gbGEgZGl2ZXJzaWRhZCBlbiBsYSBmb3JtYSBlbiBxdWUgbG9zIHBhw61zZXMgcHJlc2VudGFuIHN1cyBkYXRvcywgdGFtYmnDqW4gbGEgdmFyaWFiaWxpZGFkIA0KDQoqKmNvbmNsdXNpb24qKiANCg0KQUNNOiBMYSB0YWJsYSBheXVkYSBhIGVudGVuZGVyIHF1w6kgY2FudGlkYWQgZGUgaW5mb3JtYWNpw7NuICh2YXJpYW56YSkgc2UgcmV0aWVuZSBhbCByZWR1Y2lyIGxhIGRpbWVuc2lvbmFsaWRhZCBkZSBsb3MgZGF0b3MgdXNhbmRvIEFDUC4gU2UgcHVlZGUgb2JzZXJ2YXIgcXVlIGxhIHBhcnRlIGRlIGxhIHZhcmlhbnphIG1hcyBhbHRhIHNlIGNvbmNlbnRyYSBlbiBlbCBwcmltZSBjYW1wbyAoZGltIDEsIHByaW5jaXBhbG1lbnRlKS4gTG9zIMO6bHRpbW9zIGNvbXBvbmVudGVzIHByaW5jaXBhbGVzIGNvbnRyaWJ1eWVuIG11eSBwb2NvIGEgbGEgdmFyaWFuemEgdG90YWwuIEVzdG8gc3VnaWVyZSBxdWUgbGEgcmVkdWNjacOzbiBkZSBsYSBkaW1lbnNpb25hbGlkYWQgYSB1biBuw7ptZXJvIG1lbm9yIGRlIGNvbXBvbmVudGVzIHByaW5jaXBhbGVzLCBtYW50ZW5pZW5kbyB1bmEgYWx0YSBwcm9wb3JjacOzbiBkZSBsYSB2YXJpYW56YSwgcG9kcsOtYSBzZXIgcG9zaWJsZSBzaW4gdW5hIHDDqXJkaWRhIHNpZ25pZmljYXRpdmEgZGUgaW5mb3JtYWNpw7NuLg0KRWwgYmlwbG90IGRlbCBBbsOhbGlzaXMgZGUgQ29tcG9uZW50ZXMgTcO6bHRpcGxlcyAoQUNNKSBvZnJlY2UgdW5hIHJlcHJlc2VudGFjacOzbiB2aXN1YWwgY2xhcmEgZGUgbGFzIGludGVycmVsYWNpb25lcyBlbnRyZSBsYXMgZGl2ZXJzYXMgb2JzZXJ2YWNpb25lcyAobGFzIGNpbmNvIHZhcmlhYmxlcykgeSBsYSB2YXJpYWJsZSBjYXRlZ8OzcmljYSAiY291bnRyeSIuIEFsIGFuYWxpemFyIGxhIGRpc3RyaWJ1Y2nDs24gZGUgbG9zIHB1bnRvcyB5IGxvcyB2ZWN0b3JlcyBlbiBsYSBncsOhZmljYSwgc2UgcHVlZGVuIGlkZW50aWZpY2FyIHBhdHJvbmVzIHJlbGV2YW50ZXMgZW4gbG9zIGRhdG9zLiBMb3MgcHVudG9zIHF1ZSBzZSBhZ3J1cGFuIGluZGljYW4gcXVlIGNvbXBhcnRlbiBjYXJhY3RlcsOtc3RpY2FzIGNvbXVuZXMsIG1pZW50cmFzIHF1ZSBsYSBkaXJlY2Npw7NuIHkgbG9uZ2l0dWQgZGUgbG9zIHZlY3RvcmVzIHJldmVsYW4gY3XDoWxlcyB2YXJpYWJsZXMgZWplcmNlbiBtYXlvciBpbmZsdWVuY2lhLiBVbiB2ZWN0b3IgbGFyZ28gcXVlIHNlIG9yaWVudGEgaGFjaWEgdW4gZ3J1cG8gcGFydGljdWxhciBkZSBwdW50b3Mgc3VnaWVyZSBxdWUgZXNhIHZhcmlhYmxlIGRlc2VtcGXDsWEgdW4gcGFwZWwgc2lnbmlmaWNhdGl2byBlbiBlbCBhbsOhbGlzaXMuDQpMYSBjYWxpZGFkIGRlIHJlcHJlc2VudGFjacOzbiBzZSBtYW5pZmllc3RhIGVuIHVuIHBsYW5vIHF1ZSBpbHVzdHJhIGxhcyByZWxhY2lvbmVzIGVudHJlIGxhcyB2YXJpYWJsZXMsIHV0aWxpemFuZG8gdW4gY29uY2VwdG8gZGUgcHJveGltaWRhZCBwYXJhIGRlc3RhY2FyIGPDs21vIHNlIGFncnVwYW4gbG9zIG5vbWJyZXMgZGUgbGEgdmFyaWFibGUgImNvdW50cnkiIGp1bnRvIGNvbiBsb3MgZGUgImNvZGVfdHlwZSIuIEVzdGEgdmlzdWFsaXphY2nDs24gcGVybWl0ZSBvYnNlcnZhciBsYSBjZXJjYW7DrWEgZW50cmUgbG9zIGRpZmVyZW50ZXMgZ3J1cG9zLCByZXZlbGFuZG8gZWwgZ3JhZG8gZGUgcmVsYWNpw7NuIHF1ZSBleGlzdGUgZW50cmUgZXN0YXMgdmFyaWFibGVzIGN1YWxpdGF0aXZhcy4gQ3VhbnRvIG3DoXMgcHLDs3hpbW9zIGVzdMOpbiBsb3Mgbm9tYnJlcyBlbiBlbCBncsOhZmljbywgbWF5b3Igc2Vyw6EgbGEgc2ltaWxpdHVkIGVuIHN1cyBjYXJhY3RlcsOtc3RpY2FzIHkgY29tcG9ydGFtaWVudG9zLiBBc8OtLCBlc3RhIHJlcHJlc2VudGFjacOzbiBubyBzb2xvIGZhY2lsaXRhIGxhIGlkZW50aWZpY2FjacOzbiBkZSBwYXRyb25lcyB5IGFncnVwYWNpb25lcyBzaWduaWZpY2F0aXZhcywgc2lubyBxdWUgdGFtYmnDqW4gcHJvcG9yY2lvbmEgdW5hIGNvbXByZW5zacOzbiBtw6FzIGNsYXJhIGRlIGPDs21vIGludGVyYWN0w7phbiBlc3RhcyB2YXJpYWJsZXMgZW4gZWwgY29udGV4dG8gZGVsIGFuw6FsaXNpcy4NCkVsIGdyw6FmaWNvIGRlIGNvbnRyaWJ1Y2lvbmVzIGRlbCBBbsOhbGlzaXMgZGUgQ29tcG9uZW50ZXMgTcO6bHRpcGxlcyAoQUNNKSBlcyBzw7pwZXIgw7p0aWwgcGFyYSBlbnRlbmRlciBxdcOpIHZhcmlhYmxlcyB0aWVuZW4gbcOhcyBwZXNvIGVuIGxhIHByaW1lcmEgZGltZW5zacOzbiBkZWwgYW7DoWxpc2lzLiBCw6FzaWNhbWVudGUsIHRlIG11ZXN0cmEgY3XDoWxlcyBmYWN0b3JlcyByZWFsbWVudGUgaW1wb3J0YW4geSBjw7NtbyBlc3TDoW4gcmVsYWNpb25hZG9zIGVudHJlIHPDrS4gRXN0byBheXVkYSBhIHRlbmVyIHVuYSBpZGVhIG3DoXMgY2xhcmEgZGUgcXXDqSBlc3TDoSBpbmZsdXllbmRvIG3DoXMgZW4gbG9zIGRhdG9zIHksIGEgcGFydGlyIGRlIGFow60sIGRlY2lkaXIgZW4gcXXDqSBlbmZvY2Fyc2UuIEVzIHVuYSBoZXJyYW1pZW50YSBtdXkgcHLDoWN0aWNhIHBvcnF1ZSB0ZSBwZXJtaXRlIHByaW9yaXphciBsbyBpbXBvcnRhbnRlIHkgcGxhbmVhciBlc3RyYXRlZ2lhcyBvIGludmVzdGlnYWNpb25lcyBiYXNhZGFzIGVuIGxvIHF1ZSByZWFsbWVudGUgZXN0w6EgbW92aWVuZG8gbG9zIHJlc3VsdGFkb3MuDQpCaXRwbG8gZGUgY29udHJpYnVjaW9uZXM6IEVzdGEgcGVzdGHDsWEgcmVmbGVqYSBhc3BlY3RvcyBzaW1pbGFyZXMgYSBsb3MgcHJlc2VudGFkb3MgZW4gbGEgc2VjY2nDs24gZGUgY2FsaWRhZCBkZSByZXByZXNlbnRhY2nDs24sIHlhIHF1ZSB0YW1iacOpbiBpbHVzdHJhIGxhcyBjb250cmlidWNpb25lcyB5IGxhcyByZWxhY2lvbmVzIGVudHJlIGxhcyB2YXJpYWJsZXMgZGVudHJvIGRlbCBjb25qdW50byBkZSBkYXRvcy4gQWwgYW5hbGl6YXIgZXN0YSBpbmZvcm1hY2nDs24sIHNlIHB1ZWRlIGFwcmVjaWFyIGPDs21vIGNhZGEgdmFyaWFibGUgaW50ZXJhY3TDumEgY29uIGxhcyBkZW3DoXMgeSBxdcOpIHRhbiBpbmZsdXllbnRlcyBzb24gZW4gZWwgY29udGV4dG8gZ2VuZXJhbCBkZWwgYW7DoWxpc2lzLiBFc3RhIHZpc3VhbGl6YWNpw7NuIHBlcm1pdGUgaWRlbnRpZmljYXIgbm8gc29sbyBsYSBmdWVyemEgZGUgZXN0YXMgcmVsYWNpb25lcywgc2lubyB0YW1iacOpbiBzdSByZWxldmFuY2lhIGVuIGxhIGludGVycHJldGFjacOzbiBkZSBsb3MgZGF0b3MuDQoNCiMjIyMgQUNNDQpgYGB7ciBBQ00sIGZpZy5hbGlnbj0nY2VudGVyJ30NCnJvdW5kKE1DQShEYXRhc2V0WzE6NDAwLCAtYygxLDIsMyw0LDYsNyw4LDkpXSwgZ3JhcGggPSBGQUxTRSkkZWlnLDIpDQoNCmBgYA0KDQojIyMjIEJpcGxvdCBBQ00NCmBgYHtyIEJpcGxvdF9BQ00sIGZpZy5hbGlnbj0nY2VudGVyJ30NCmZ2aXpfbWNhX2JpcGxvdChNQ0EoRGF0YXNldFsxOjQwMCwgLWMoMSwyLDMsNCw2LDcsOCw5KV0sIGdyYXBoID0gRkFMU0UpLCByZXBlbCA9IFRSVUUpDQpgYGANCg0KIyMjIyBDYWxpZGFkIGRlIFJlcHJlc2VudGFjacOzbg0KYGBge3IgQ2FsaWRhZF9kZV9SZXByZXNlbnRhY2nDs24sIGZpZy5hbGlnbj0nY2VudGVyJ30NCg0KZnZpel9tY2FfdmFyKE1DQShEYXRhc2V0WzE6NDAwLCAtYygxLDIsMyw0LDYsNyw4LDkpXSwgZ3JhcGggPSBGQUxTRSksIGNvbC52YXIgPSJjb3MyIiwgZ3JhZGllbnQuY29scyA9IGMoIiMwMEFGQkIiLCAiI0U3QjgwMCIsICIjRkM0RTA3IiksIHJlcGVsID0gVFJVRSkNCg0KYGBgDQoNCiMjIyMgQ29udHJpYnVjaW9uZXMNCmBgYHtyIENvbnRyaWJ1Y2lvbmVzLCBmaWcuYWxpZ249J2NlbnRlcid9DQpmdml6X2NvbnRyaWIoTUNBKERhdGFzZXRbMTo0MDAsIC1jKDEsMiwzLDQsNiw3LDgsOSldLCBncmFwaCA9IEZBTFNFKSwgY2hvaWNlID0gInZhciIsIGF4ZXMgPSAxLCB0b3AgPSAxNSkNCg0KYGBgDQoNCg0KIyMjIyBCaXBsb3QgY29uIENvbnRyaWJ1Y2lvbmVzDQpgYGB7ciBCaXBsb3RfY29uX0NvbnRyaWJ1Y2lvbmVzLCBmaWcuYWxpZ249J2NlbnRlcid9DQoNCg0KZnZpel9tY2FfdmFyKE1DQShEYXRhc2V0WzE6NDAwLCAtYygxLDIsMyw0LDYsNyw4LDkpXSwgZ3JhcGggPSBGQUxTRSksIGNvbC52YXIgPSJjb250cmliIiwgZ3JhZGllbnQuY29scyA9IGMoIiMwMEFGQkIiLCAiI0U3QjgwMCIsICIjRkM0RTA3IiksIHJlcGVsID0gVFJVRSkNCg0KYGBgDQoNCiMjICoqRmFzZSA0IFtDb25nbG9tZXJhZG9zXSoqDQoNCiMjIyAqKjQuMS4gT2JqZXRpdm9zKioNCi1BZ3J1cGFyIGxvcyBkYXRvcyBlbiBjYXRlZ29yw61hcyBvIGdydXBvcyBkb25kZSBsb3MgZWxlbWVudG9zIGRlbnRybyBkZSBjYWRhIGdydXBvIHNlYW4gc2ltaWxhcmVzIGVudHJlIHPDrSwgYmFzw6FuZG9zZSBlbiBsYXMgdmFyaWFibGVzIGFuYWxpemFkYXMuDQoNCi1Vc2FyIGVzdG9zIGdydXBvcyBjb21vIGJhc2UgcGFyYSBwcmVkZWNpciBjb21wb3J0YW1pZW50b3MgbyBjYXJhY3RlcsOtc3RpY2FzIGZ1dHVyYXMgZGUgbnVldmFzIG9ic2VydmFjaW9uZXMuDQoNCi1BbmFsaXphciBsYXMgY2FyYWN0ZXLDrXN0aWNhcyBjb211bmVzIG8gbGFzIGRpZmVyZW5jaWFzIHNpZ25pZmljYXRpdmFzIGVudHJlIGxvcyBncnVwb3MsIGNvbiBlbCBmaW4gZGUgZXh0cmFlciBjb25jbHVzaW9uZXMgw7p0aWxlcyBvIHJlbGV2YW50ZXMuDQoNCiMjIyAqKjQuMi4gQWdydXBhY2nDs24gSmVyw6FycXVpY2EqKiB7LnRhYnNldCAgLnRhYnNldC1waWxsc30NCg0KDQpFc3RhIGZhc2UgZXN0w6EgZGlzZcOxYWRhIHBhcmEgb3JnYW5pemFyIGVsIGNvbmp1bnRvIGRlIGRhdG9zIGVuIHVuYSBlc3RydWN0dXJhIGplcsOhcnF1aWNhIGRlIGdydXBvcyBzaW1pbGFyZXMsIGVsIGN1YWwgcGVybWl0ZSBpZGVudGlmaWNhciBwYXRyb25lcyBlbiBsb3MgZGF0b3MgbWVkaWFudGUgbGEgY29uc3RydWNjacOzbiBkZSBjb25nbG9tZXJhZG9zIGJhc2Fkb3MgZW4gbGEgbWVkaWRhIGRlIGRpc2ltaWxhcmlkYWQgZW50cmUgbGFzIG9ic2VydmFjaW9uZXMsIGxvIHF1ZSBmYWNpbGl0YSBsYSBjbGFzaWZpY2FjacOzbiBlbiBuaXZlbGVzIGplcsOhcnF1aWNvcyBwcm9ncmVzaXZvcy4gTG8gY3VhbCBzZSBwdWVkZSBsb2dyYXIgY29uIGVsIHVzbyBkZSBoZXJyYW1pZW50YXMsIGFsZ3VuYXMgZGUgZXN0YXMgc29uIGxvcyBkZW5kb2dyYW1hcyBvcHRpbWl6YWRvcyB5IGxhIG9wdGltaXphY2nDs24gZGUgTW9qZW5hLiBFc3RlIGVuZm9xdWUgcGVybWl0ZSBwcm9mdW5kaXphciBlbiBsYSBlc3RydWN0dXJhIGRlIGxvcyBkYXRvcy4NCg0KDQpQYXJhIGVzdGEgZmFzZSBjYWRhIGFwYXJ0YWRvIGRlc2VtcGXDsWEgdW4gcm9sIGNsYXZlIHBhcmEgZ2FyYW50aXphciB1bmEgY2xhc2lmaWNhY2nDs24gZWZpY2llbnRlIHkgcHJlY2lzYSBkZSBsb3MgZGF0b3MuIEVsICoqY2FtcG8gY2xhc2lmaWNhZG9yKiogcHJvcG9yY2lvbmEgdW4gbWFyY28gcXVlIGRlZmluZSBsYXMgY2FyYWN0ZXLDrXN0aWNhcyB5IGNyaXRlcmlvcyByZWxldmFudGVzIHF1ZSBzZXLDoW4gdXRpbGl6YWRvcyBwYXJhIG1lZGlyIHNpbWlsaXR1ZGVzIG8gZGlmZXJlbmNpYXMgZW50cmUgbGFzIG9ic2VydmFjaW9uZXMsIGFzZWd1cmFuZG8gcXVlIGxvcyBjb25nbG9tZXJhZG9zIGZvcm1hZG9zIHNlYW4gY29uc2lzdGVudGVzIGNvbiBsb3Mgb2JqZXRpdm9zIGRlbCBhbsOhbGlzaXMuIExhICoqZGlzaW1pbGFyaWRhZCoqLCBwb3Igc3UgcGFydGUsIGFjdMO6YSBjb21vIHVuYSBtw6l0cmljYSBjdWFudGl0YXRpdmEgcXVlIG1pZGUgbGFzIGRpZmVyZW5jaWFzIGVudHJlIGxvcyBlbGVtZW50b3MgZGVsIGNvbmp1bnRvIGRlIGRhdG9zLCBzaWVuZG8gY3J1Y2lhbCBwYXJhIGRldGVybWluYXIgcXXDqSBlbGVtZW50b3MgZGViZW4gYWdydXBhcnNlLiBMYSAqKm9wdGltaXphY2nDs24gZGUgTW9qZW5hKiogaW50ZXJ2aWVuZSBjb21vIHVuYSBoZXJyYW1pZW50YSBlc3RhZMOtc3RpY2EgcGFyYSBpZGVudGlmaWNhciBlbCBuw7ptZXJvIMOzcHRpbW8gZGUgY29uZ2xvbWVyYWRvcyBtZWRpYW50ZSBlbCBhbsOhbGlzaXMgZGVsIGRlbmRvZ3JhbWEsIGV2aXRhbmRvIHRhbnRvIGxhIHN1YmFncnVwYWNpw7NuIGNvbW8gbGEgc29icmVhZ3J1cGFjacOzbiBkZSBsb3MgZGF0b3MuIEZpbmFsbWVudGUsIGxvcyAqKmRlbmRvZ3JhbWFzIG9wdGltaXphZG9zKiogb2ZyZWNlbiB1bmEgcmVwcmVzZW50YWNpw7NuIHZpc3VhbCBqZXLDoXJxdWljYSBxdWUgZmFjaWxpdGEgbGEgaW50ZXJwcmV0YWNpw7NuIGRlbCBwcm9jZXNvIGRlIGFncnVwYWNpw7NuLCBtb3N0cmFuZG8gbGFzIHJlbGFjaW9uZXMgZW50cmUgbG9zIGdydXBvcyB5IGF5dWRhbmRvIGEgdmFsaWRhciBsYSBjYWxpZGFkIGRlIGxhIGNsYXNpZmljYWNpw7NuLiBKdW50b3MsIGVzdG9zIGNvbXBvbmVudGVzIGludGVncmFuIHVuIGVuZm9xdWUgcm9idXN0byBxdWUgcGVybWl0ZSBvYnRlbmVyIGFncnVwYWNpb25lcyBqZXLDoXJxdWljYXMgY29oZXJlbnRlcyB5IGRlIGFsdGEgY2FsaWRhZC4NCuKAgw0KKipjb25jbHVzaW9uKioNCg0KQWwgYXBsaWNhciBsb3MgZGlzdGludG9zIGVzdHVkaW9zIGFsIGNvbmp1bnRvIGRlIGRhdG9zLCBzZSBwdWVkZSBleHRyYWVyIGluZnJvbWFjaW9uIGRpdmVyc2EgZGUgY2FkYSB1bm87IGVsIGdyYWZpY28gZGUgRGlzaW1pbGFyaWRhZCBtdWVzdHJhIGNvbiBiYXNlIGVuIHVuYSBlc2NhbGEgZGUgY29sb3JlcyBsYXMgZGlzdGFuY2lhcyBlbnRyZSBsYXMgb2JzZXJ2YWNpb25lcyhkaXNpbWlsYXJpZGFkKSBFbiBlc3RlIG1pc21vIHB1ZWRlIG9ic2VydmFyc2UgcXVlIGVsIHZhbG9yIHZpZXRobmFtIHByZXNlbnRhIHVuYSBncmFuIGRpc2ltaWxhcmlkYWQgKGNvbG9yZXMgbXV5IHJvaml6b3MpIGNvbiBlbCByZXN0byBkZSB2YWxvcmVzIHByZXNlbnRlcyBlbiBlc3RlIGNvbmp1bnRvIGRlIGRhdG9zLCBlc3RvIHBvZHLDrWEgcmVmbGVqYXIgZGlmZXJlbmNpYXMgZW4gY3VhbnRvIGEgY8OzbW8gc2UgcmVsYWNpb25hbiBlc3RvcyBtaXNtb3MgdmFsb3JlcyBjb24gbG9zIGRpdmVyc29zIGNhbXBvcyBwcmVzZW50ZXMgZW4gZWwgY29uanVudG8gZGUgZGF0b3MsIGNvbnRyYXJpbyBhIGVzdG8sIGVsIHZhbG9yIHVrcmFpbmUgcHJlc2VudGEgdW4gcG9jbyBkaXNpbWlsYXJpZGFkIGNvbiBsYSBncmFuIHBhcnRlIGRlIGxvcyBvdHJvcyB2YWxvcmVzIHByZXNlbnRlcywgbG8gY3VhbCBpbmRpY2EgcXVlIHVrcmFpbmUgdGllbmUgbWF5b3Igc2ltaWxpdHVkIGVuIGN1YW50byBhIGNvbW8gc2UgcmVsYWNpb25hIGVzdGUgY291bnRyeSBjb24gZWwgcmVzdG8gZGUgdmFsb3JlcyBwcmVzZW50ZXMuIERlIGZvcm1hIGdlbmVyYWwgc2UgcHVlZGUgZXh0cmFlciBxdWUgc2UgcHJlc2VudGFuIG1heW9yIG51bWVybyBkZSBubyBkaW1pbGFyaWRhZCBxdWUgZGUgZGlzaW1pbGFyaWRhZCBlbiBlbCBncsOhZmljby4gDQpUZW5pZW5kbyBlbiBjdWVudGEgcXVlIGxhICoqb3B0aW1pemFjacOzbiBkZSBNb2plbmEqKiBtdWVzdHJhIGVsIG7Dum1lcm8gw7NwdGltbyBkZSBjb25nbG9tZXJhZG9zIGplcsOhcnF1aWNvcyBxdWUgZGViZXLDrWFuIGNvbmZpZ3VyYXJzZSwgZG9uZGUgbGEg4oCcdW5pw7NuIHNpbXBsZeKAnSBwb3IgbWVkaW8gZGVsIHZlY2lubyBtw6FzIGNlcmNhbm8gbXVlc3RyYSBxdWUgZWwgbnVtZXJvIG9wdGltbyBkZSBncnVwb3MgZXMgMiwgbGEg4oCcdW5pw7NuIGNvbXBsZXRh4oCdIHBvciBtZWRpbyBkZWwgdmVjaW5vIG3DoXMgbGVqYW5vIHkgbGEg4oCcdW5pw7NuIHByb21lZGlv4oCdIG11ZXN0cmFuIHVuIHRvdGFsIGRlIDMgZ3J1cG9zIMOzcHRpbW9zOyBzaXR1YWNpw7NuIHF1ZSBzZSBjb21wbGVtZW50YSBjb24gbG9zICoqZGVuZG9ncmFtYXMgb3B0aW1pemFkb3MqKiBlbiBkb25kZSBwYXJhIGVsIHByaW1lciAqKmRlbmRvZ3JhbWEgb3B0aW1pemFkbyDigJ1FbmxhY2Ugc2ltcGxl4oCdICoqICBubyBzZSBtdWVzdHJhbiBsb3MgZGl2ZXJzb3MgY29uZ2xvbWVyYWRvcyBkZSBmb3JtYXMgdGFuIHJlcHJlc2VudGF0aXZhcyB5YSBxdWUgdW5hIGRlIGVzdGFzIGFncnVwYWNpb25lcyBzb2xvIGVzdMOhIGNvbnRlbmlkYSBsYSB2YXJpYWJsZSB2aWV0bmFtIHkgZW4gbGEgb3RyYSBhZ3J1cGFjacOzbiAgc2UgcmVwcmVzZW50YW4gbG9zIHZhbG9yZXMgcmVzdGFudGVzLiANCkVsIHNlZ3VuZG8gKipkZW5kb2dyYW1hIG9wdGltaXphZG8g4oCdRW5sYWNlIGNvbXBsZXRv4oCdICoqICBwb3IgbWVkaW8gZGVsIHZlY2lubyBtw6FzIGxlamFubywgcmVwcmVzZW50YSBsYSBhZ3J1cGFjacOzbiBtw6FzIHNpZ25pZmljYXRpdmEsICB5YSBxdWUsIGF1bnF1ZSBzZSBwcmVzZW50YSBsYSBtaXNtYSBzaXR1YWNpw7NuIGRlIGxhIHZhcmlhYmxlIHZpZXRoYW0sIGVuIGVzdGEgYSBkaWZlcmVuY2lhIGRlbCBwcmltZXIgZGVuZG9ncmFtYSBlbCByZXN0byBkZSBsb3MgZGF0b3MgZXN0w6FuIGRpdmlkaWRvcyBlbiAyIGdydXBvcyBtw6FzLiwgc2l0dWFjacOzbiB0YW1iacOpbiBwcmVzZW50ZSBlbiBlbCB0ZXJjZXIgKipkZW5kb2dyYW1hIG9wdGltaXphZG8g4oCdRW5sYWNlIHByb21lZGlv4oCdICoqIG5hZGEgbcOhcyBxdWUgZW4gZXN0ZSB1bHRpbW8gbGEgYWdydXBhY2nDs24gZGUgbG9zIHZhbG9yZXMgcmVzdGFudGVzIG5vIGFiYXJjYSBncmFuIHNpZ25pZmljYW5jaWEgcGFyYSBlbCBlc3R1ZGlvLiANCg0KDQojIyMjIENhbXBvIENsYXNpZmljYWRvcg0KYGBge3IgQ2FtcG9fQ2xhc2lmaWNhZG9yLCBmaWcuYWxpZ249J2NlbnRlcid9DQoNCmNkZF9VcHZvdGVkS2VybmVsc19DT1VOX3Byb21lZGlvICA8LSByZWFkX2V4Y2VsKCJEOi9DdXJzbyBHZERfMjAyNF9bRzJdL2NkZF9VcHZvdGVkS2VybmVsc19DT1VOX3Byb21lZGlvLnhsc3giKQ0KDQoNCmFzLmRhdGEuZnJhbWUoY2RkX1Vwdm90ZWRLZXJuZWxzX0NPVU5fcHJvbWVkaW8pWzE6MjQsLWMoMiwzLDQpXQ0KDQpgYGANCiMjIyMgRGlzaW1pbGFyaWRhZA0KYGBge3IgRGlzaW1pbGFyaWRhZCwgZmlnLmFsaWduPSdjZW50ZXInfQ0KDQpkYXRhXyA9IGFzLmRhdGEuZnJhbWUoY2RkX1Vwdm90ZWRLZXJuZWxzX0NPVU5fcHJvbWVkaW8pWywgLWMoMSldDQpyb3duYW1lcyhkYXRhXykgPSB1bmNsYXNzKGNkZF9VcHZvdGVkS2VybmVsc19DT1VOX3Byb21lZGlvJENvdW50cnkpDQpmdml6X2Rpc3QoZ2V0X2Rpc3QoZGF0YV8sIHN0YW5kID0gVCwgbWV0aG9kID0gImV1Y2xpZGVhbiIpLCBncmFkaWVudCA9IGxpc3QobG93ID0gIiMwMEFGQkIiLCBtaWQgPSAid2hpdGUiLCBoaWdoID0gIiNGQzRFMDciKSkNCg0KYGBgDQoNCiMjIyMgQ29uanVudG8gTW9kaWZpY2Fkbw0KYGBge3IgQ29uanVudG9fTW9kaWZpY2Fkb30NCmhlYWQoYXMuZGF0YS5mcmFtZShjZGRfVXB2b3RlZEtlcm5lbHNfQ09VTl9wcm9tZWRpbykpDQoNCmBgYA0KDQpgYGB7cn0NCnN0cihhcy5kYXRhLmZyYW1lKGNkZF9VcHZvdGVkS2VybmVsc19DT1VOX3Byb21lZGlvKSkNCmBgYA0KDQoNCg0KIyMjIyBPcHRpbWl6YWNpb24gZGUgTW9qZW5hIHsudGFic2V0ICAudGFic2V0LXBpbGxzfQ0KDQojIyMjIyBVbmlvbiBTaW1wbGUNCmBgYHtyIFVuaW9uX1NpbXBsZSxmaWcuYWxpZ249J2NlbnRlcid9DQoNCmhjX3NpbmdsZSA9IGhjbHVzdChnZXRfZGlzdChkYXRhXywgc3RhbmQgPSBULCBtZXRob2QgPSAiZXVjbGlkZWFuIiksIG1ldGhvZCA9ICJzaW5nbGUiKQ0KDQptb2plbmEgPSBmdW5jdGlvbihoYyl7DQogIG5faGQgPSBsZW5ndGgoaGMkaGVpZ2h0KQ0KICBhbHBfZyA9IDAgOyBhbHBoYSA9IGhjJGhlaWdodFtuX2hkOjFdDQogIGZvcihpIGluIDE6KG5faGQtMSkpew0KICAgIGFscF9nW2ldID0gbWVhbihhbHBoYVsobl9oZC1pKzEpOjFdKSsxLjI1KnNkKGFscGhhWyhuX2hkLWkrMSk6MV0pDQogIH0NCiAgbm9nID0gc3VtKGFscF9nPD0gYWxwaGFbLW5faGRdKSArIDENCiAgcGxvdChhbHBoYVstbl9oZF0sIHBjaD0yMCwgY29sPShhbHBfZz5hbHBoYVstbl9oZF0pKzEsIG1haW4gPSBwYXN0ZSgiT3B0aW1hbCBudW1iZXIgb2YgZ3JvdXBzID0iLG5vZyksDQogICAgICAgeWxhYiA9IGV4cHJlc3Npb24oYWxwaGFbZ10pLCB4bGFiPSJOb2RlcyIpfQ0KDQptb2plbmEoaGNfc2luZ2xlKQ0KDQpgYGANCg0KIyMjIyMgVW5pb24gQ29tcGxldGENCmBgYHtyIFVuaW9uX0NvbXBsZXRhLCBmaWcuYWxpZ249J2NlbnRlcid9DQoNCmhjX2NvbXBsZXRlID0gaGNsdXN0KGdldF9kaXN0KGRhdGFfLCBzdGFuZCA9IFQsIG1ldGhvZCA9ICJldWNsaWRlYW4iKSwgbWV0aG9kID0gImNvbXBsZXRlIikNCg0KbW9qZW5hID0gZnVuY3Rpb24oaGMpew0KICBuX2hkID0gbGVuZ3RoKGhjJGhlaWdodCkNCiAgYWxwX2cgPSAwIDsgYWxwaGEgPSBoYyRoZWlnaHRbbl9oZDoxXQ0KICBmb3IoaSBpbiAxOihuX2hkLTEpKXsNCiAgICBhbHBfZ1tpXSA9IG1lYW4oYWxwaGFbKG5faGQtaSsxKToxXSkrMS4yNSpzZChhbHBoYVsobl9oZC1pKzEpOjFdKQ0KICB9DQogIG5vZyA9IHN1bShhbHBfZzw9IGFscGhhWy1uX2hkXSkgKyAxDQogIHBsb3QoYWxwaGFbLW5faGRdLCBwY2g9MjAsIGNvbD0oYWxwX2c+YWxwaGFbLW5faGRdKSsxLCBtYWluID0gcGFzdGUoIk9wdGltYWwgbnVtYmVyIG9mIGdyb3VwcyA9Iixub2cpLA0KICAgICAgIHlsYWIgPSBleHByZXNzaW9uKGFscGhhW2ddKSwgeGxhYj0iTm9kZXMiKX0NCg0KbW9qZW5hKGhjX2NvbXBsZXRlKQ0KDQpgYGANCg0KIyMjIyMgVW5pb24gUHJvbWVkaW8NCmBgYHtyIFVuaW9uX1Byb21lZGlvLCBmaWcuYWxpZ249J2NlbnRlcid9DQoNCmhjX2F2ZXJhZ2UgPSBoY2x1c3QoZ2V0X2Rpc3QoZGF0YV8sIHN0YW5kID0gVCwgbWV0aG9kID0gImV1Y2xpZGVhbiIpLCBtZXRob2QgPSAiYXZlcmFnZSIpDQoNCm1vamVuYSA9IGZ1bmN0aW9uKGhjKXsNCiAgbl9oZCA9IGxlbmd0aChoYyRoZWlnaHQpDQogIGFscF9nID0gMCA7IGFscGhhID0gaGMkaGVpZ2h0W25faGQ6MV0NCiAgZm9yKGkgaW4gMToobl9oZC0xKSl7DQogICAgYWxwX2dbaV0gPSBtZWFuKGFscGhhWyhuX2hkLWkrMSk6MV0pKzEuMjUqc2QoYWxwaGFbKG5faGQtaSsxKToxXSkNCiAgfQ0KICBub2cgPSBzdW0oYWxwX2c8PSBhbHBoYVstbl9oZF0pICsgMQ0KICBwbG90KGFscGhhWy1uX2hkXSwgcGNoPTIwLCBjb2w9KGFscF9nPmFscGhhWy1uX2hkXSkrMSwgbWFpbiA9IHBhc3RlKCJPcHRpbWFsIG51bWJlciBvZiBncm91cHMgPSIsbm9nKSwNCiAgICAgICB5bGFiID0gZXhwcmVzc2lvbihhbHBoYVtnXSksIHhsYWI9Ik5vZGVzIil9DQoNCm1vamVuYShoY19hdmVyYWdlKQ0KDQpgYGANCg0KIyMjIyBEZW5kb2dyYW1hcyBPcHRpbWl6YWRvcyB7LnRhYnNldCAgLnRhYnNldC1waWxsc30NCg0KIyMjIyMgRW5sYWNlIFNpbXBsZQ0KYGBge3IgRW5sYWNlX1NpbXBsZSwgZmlnLmFsaWduPSdjZW50ZXInfQ0KDQpzdXBwcmVzc1dhcm5pbmdzKGZ2aXpfZGVuZChoY19zaW5nbGUsIGsgPSAyLCBjZXggPSAwLjUsIGtfY29sb3JzID0gIm5wZyIsIGNvbG9yX2xhYmVsc19ieV9rID0gVCwgcmVjdCA9IFQpKQ0KDQpgYGANCg0KIyMjIyMgRW5sYWNlIENvbXBsZXRvDQpgYGB7ciBFbmxhY2VfQ29tcGxldG8sIGZpZy5hbGlnbj0nY2VudGVyJ30NCg0KZnZpel9kZW5kKGhjX2NvbXBsZXRlLCBrID0gMywgY2V4ID0gMC41LCBrX2NvbG9ycyA9ICJucGciLCBjb2xvcl9sYWJlbHNfYnlfayA9IFQsIHJlY3QgPSBUKQ0KDQpgYGANCg0KIyMjIyMgRW5sYWNlIFByb21lZGlvDQpgYGB7ciBFbmxhY2VfUHJvbWVkaW8sIGZpZy5hbGlnbj0nY2VudGVyJ30NCg0KZnZpel9kZW5kKGhjX2F2ZXJhZ2UsIGsgPSAzLCBjZXggPSAwLjUsIGtfY29sb3JzID0gIm5wZyIsIGNvbG9yX2xhYmVsc19ieV9rID0gVCwgcmVjdCA9IFQpDQpgYGANCg0KDQojIyMgKio0LjMuIEFncnVwYWNpw7NuIE5vLUplcsOhcnF1aWNhKiogey50YWJzZXQgIC50YWJzZXQtcGlsbHN9DQoNCg0KTGEgYWdydXBhY2nDs24gbm8gamVyw6FycXVpY2EgZXMgY3J1Y2lhbCBwYXJhIGlkZW50aWZpY2FyIHBhdHJvbmVzIG8gZXN0cnVjdHVyYXMgc3VieWFjZW50ZXMgZW4gdW4gY29uanVudG8gZGUgZGF0b3MuIEEgZGlmZXJlbmNpYSBkZSBsb3MgbcOpdG9kb3MgamVyw6FycXVpY29zLCBxdWUgZ2VuZXJhbiB1bmEgamVyYXJxdcOtYSBkZSBncnVwb3MsIGxvcyBhbGdvcml0bW9zIGRlIGFncnVwYWNpw7NuIG5vIGplcsOhcnF1aWNhLCBjb21vIGVsIEstbWVhbnMsIGJ1c2NhbiBkaXZpZGlyIGxvcyBkYXRvcyBlbiB1biBuw7ptZXJvIGZpam8gZGUgY2x1c3RlcnMgbyBjb25nbG9tZXJhZG9zLCBkZWZpbmlkb3MgcG9yIHN1IHByb3hpbWlkYWQgZW4gdW4gZXNwYWNpbyBtdWx0aWRpbWVuc2lvbmFsLiBQYXJhIGRldGVybWluYXIgZWwgbsO6bWVybyBpZGVhbCBkZSBjb25nbG9tZXJhZG9zIChLKSwgc2UgdXRpbGl6YW4gZGl2ZXJzYXMgdMOpY25pY2FzIGRlIHZhbGlkYWNpw7NuLCBjb21vIGxvcyBtZXRvZG9zICoqRWxib3csIFNpbGhvdWV0dGUsIEdhcCBTdGF0aXN0aWMsIE1ham9yaXR5IFJ1bGUqKiwgY2FkYSB1bmEgY29uIHN1cyB2ZW50YWphcyBwYXJhIGV2YWx1YXIgbGEgY2FsaWRhZCB5IGVzdGFiaWxpZGFkIGRlIGxvcyBncnVwb3MgZm9ybWFkb3MuIFVuYSB2ZXogYXBsaWNhZG8gZWwgYWxnb3JpdG1vIEstbWVhbnMsIGxvcyByZXN1bHRhZG9zIHNlIHZpc3VhbGl6YW4gbWVkaWFudGUgZ3LDoWZpY29zIHF1ZSBwZXJtaXRlbiBpbnRlcnByZXRhciBkZSBtYW5lcmEgZWZlY3RpdmEgbGEgZGlzdHJpYnVjacOzbiBkZSBsb3MgcHVudG9zIGVuIGNhZGEgY29uZ2xvbWVyYWRvLCBwcm9wb3JjaW9uYW5kbyB1bmEgYmFzZSBzw7NsaWRhIHBhcmEgdG9tYXIgZGVjaXNpb25lcyBiYXNhZGFzIGVuIGxvcyBwYXRyb25lcyBkZSBjb21wb3J0YW1pZW50byBvIGNhcmFjdGVyw61zdGljYXMgY29tdW5lcyBkZW50cm8gZGVsIGNvbmp1bnRvIGRlIGRhdG9zLg0KDQoNCg0KUGFyYSByZWFsaXphciB1bmEgY29uY2x1c2nDs24gYWRlY3VhZGEgc29icmUgZXN0YSBzZWNjacOzbiwgZXMgaW1wb3J0YW50ZSBjb25vY2VyIGJyZXZlbWVudGUgY2FkYSB1bm8gZGUgbG9zIG3DqXRvZG9zLiBFbCAgbcOpdG9kbyAqKkVsYm93KiogZXMgdW5hIHTDqWNuaWNhIHV0aWxpemFkYSBwYXJhIGRldGVybWluYXIgZWwgbsO6bWVybyDDs3B0aW1vIGRlIGNvbmdsb21lcmFkb3MgKEspIGVuIHVuIGFuw6FsaXNpcyBkZSBhZ3J1cGFjacOzbi4gRXN0ZSBtw6l0b2RvIGNhbGN1bGEgbGEgdmFyaWFiaWxpZGFkIGRlbnRybyBkZSBsb3MgY2x1c3RlcnMgcGFyYSBkaWZlcmVudGVzIHZhbG9yZXMgZGUgSyB5IHRyYXphIHVuYSBncsOhZmljYSBkZSBsYSBzdW1hIGRlIGxvcyBlcnJvcmVzIGN1YWRyw6F0aWNvcyAoU1NFKSBlbiBmdW5jacOzbiBkZSBLLiBFbCBwdW50byBjb25vY2lkbyBjb21vICJjb2RvIiBlbiBsYSBjdXJ2YSwgZG9uZGUgbGEgZGlzbWludWNpw7NuIGRlIFNTRSBzZSB2dWVsdmUgbWVub3MgcHJvbnVuY2lhZGEsIGluZGljYSBlbCBuw7ptZXJvIGlkZWFsIGRlIGNsdXN0ZXJzLiBQb3Igc3UgcGFydGUsIGVsIG3DqXRvZG8gZGUgKipTaWxob3VldHRlKiogIGV2YWzDumEgbGEgY2FsaWRhZCBkZSBsb3MgY29uZ2xvbWVyYWRvcywgbWlkaWVuZG8gdGFudG8gbGEgY29oZXNpw7NuIGludGVybmEgY29tbyBsYSBzZXBhcmFjacOzbiBlbnRyZSBsb3MgZ3J1cG9zLiBVbiB2YWxvciBjZXJjYW5vIGEgKzEgaW5kaWNhIHF1ZSBsYXMgb2JzZXJ2YWNpb25lcyBlc3TDoW4gYmllbiBhZ3J1cGFkYXMsIG1pZW50cmFzIHF1ZSB2YWxvcmVzIGNlcmNhbm9zIGEgLTEgc3VnaWVyZW4gcXVlIGxvcyBwdW50b3MgZXN0w6FuIG1hbCBhc2lnbmFkb3MuDQpMYSAqKkdhcCBTdGF0aXN0aWMqKiBjb21wYXJhIGxhIHZhcmlhYmlsaWRhZCBvYnNlcnZhZGEgZGUgbG9zIGNvbmdsb21lcmFkb3MgY29uIGxhIHF1ZSBzZSBlc3BlcmFyw61hIGJham8gdW4gbW9kZWxvIGFsZWF0b3JpbywgcHJvcG9yY2lvbmFuZG8gdW5hIG1lZGlkYSByb2J1c3RhIHBhcmEgc2VsZWNjaW9uYXIgZWwgbsO6bWVybyBhZGVjdWFkbyBkZSBjbHVzdGVycywgc2llbmRvIHBhcnRpY3VsYXJtZW50ZSDDunRpbCBjdWFuZG8gbGEgZGlzdHJpYnVjacOzbiBkZSBsb3MgZGF0b3Mgbm8gZXMgdW5pZm9ybWUuIEZpbmFsbWVudGUsICoqTWFqb3JpdHkgUnVsZSoqIHNlIHV0aWxpemEgcGFyYSBjb25zb2xpZGFyIGxvcyByZXN1bHRhZG9zIG9idGVuaWRvcyBwb3IgZGlmZXJlbnRlcyBhbGdvcml0bW9zIGRlIGNsdXN0ZXJpbmcuIEVzdGUgZW5mb3F1ZSBlcyDDunRpbCBjdWFuZG8gc2UgZW1wbGVhbiB2YXJpYXMgdMOpY25pY2FzIGRlIGFncnVwYWNpw7NuIHkgc2UgYnVzY2EgbGxlZ2FyIGEgdW4gY29uc2Vuc28gc29icmUgZWwgbsO6bWVybyB5IGxhIGNhbGlkYWQgZGUgbG9zIGNvbmdsb21lcmFkb3MsIHlhIHF1ZSBhc2lnbmEgYSBjYWRhIHB1bnRvIGVsIGNvbmdsb21lcmFkbyBtw6FzIGZyZWN1ZW50ZSBlbnRyZSBsb3MgbcOpdG9kb3MgYXBsaWNhZG9zLiBVbmEgdmV6IGRldGVybWluYWRvIGVsIG7Dum1lcm8gw7NwdGltbyBkZSBjbHVzdGVycywgZWwgKipLLW1lYW5zKiogIHNlIGVuY2FyZ2EgZGUgYXNpZ25hciBjYWRhIG9ic2VydmFjacOzbiBhIHN1IGNvbmdsb21lcmFkbyBjb3JyZXNwb25kaWVudGUuIExvcyBncsOhZmljb3MgcmVzdWx0YW50ZXMgZGVsICoqSy1tZWFucyoqIHBlcm1pdGVuIHZpc3VhbGl6YXIgY8OzbW8gc2UgZGlzdHJpYnV5ZW4gbG9zIHB1bnRvcyBlbiBlbCBlc3BhY2lvIG11bHRpZGltZW5zaW9uYWwsIGZhY2lsaXRhbmRvIGxhIGludGVycHJldGFjacOzbiBkZSBsb3MgcmVzdWx0YWRvcyB5IHByb3BvcmNpb25hbmRvIHVuYSByZXByZXNlbnRhY2nDs24gdmlzdWFsIGRlIGxhcyByZWxhY2lvbmVzIHkgcGF0cm9uZXMgcHJlc2VudGVzIGVuIGxvcyBkYXRvcy4NCg0KDQoqKmNvbmNsdXNpb24qKg0KDQpFbiBsYXMgMyBwZXN0YcOxYXMgcHJlc2VudGVzICoqSy3Ds3B0aW1vcywgUmVzdWx0YWRvcyBLLW1lYW5zIHkgR3LDoWZpY29zIEstbWVhbnMqKiBzZSBwdWVkZW4gbGxlZ2FyIGEgZGl2ZXJzb3MgYW7DoWxpc2lzIGZyZW50ZSBhbCBlc3R1ZGlvIHF1ZSBzZSBlc3TDoSByZWFsaXphbmRvOyBlbiBsYSBwcmltZXIgcGVzdGHDsWEgKipLLcOzcHRpbW9zKioganVudG8gYSBzdXMgKipzdWJwZXN0YcOxYXMqKiBzZSBwdWVkZW4gZGV0ZXJtaW5hcjogRUwgbnVtZXJvIG9wdGltbyBxdWUgbWluaW1pemEgbGEgdmFyaWFjacOzbiBwb3IgbWVkaW8gZGVsIG3DqXRvZG8gKipFbGJvdyoqIGRvbmRlIGFycm9qYSBjb21vIHJlc3VsdGFkbyB1biAzLCBwb3Igb3RybyBsYWRvIGVsICoqU2lsaG91ZXR0ZSoqIG5vcyBtdWVzdHJhIHF1ZSBsYXMgbGEgY2FsaWRhZCBkZSBsYSBhc2lnbmFjacOzbiBkZSBsYXMgb2JzZXJ2YWNpb25lcyBhIG1lZGlkYSBxdWUgYXVtZW50YSBlbCBuw7ptZXJvIGRlIGdydXBvcyBkaXNtaW51eWUsIGRlIGVzdGUgbW9kbyBlbCBudW1lcm8gb3B0aW1vIGRlIGFncnVwYW1pZW50b3MgZXMgZGUgMiwgZWwgbcOpdG9kbyAqKkdhcCBTdGF0aXN0aWMqKiBub3MgZGEgdW4gbnVtZXJvIG9wdGltbyAodGVuaWVuZG8gZW4gY3VlbnRhIGxhIGVzdGFkw61zdGljYSBkZSBicmVjaGEpIGRlIDEsIGZpbmFsbWVudGUsIGVsIG3DqXRvZG8gKipNYWpvcml0eSBSdWxlKiogbWVkaWFudGUgZWwgY8OhbGN1bG8gZGUgMzAgw61uZGljZXMgcGFyYSBkZXRlcm1pbmFyIGVsIG7Dum1lcm8gw7NwdGltbyBkZSBjb25nbG9tZXJhZG9zIGFsIHZhcmlhciB0b2RhcyBsYXMgY29tYmluYWNpb25lcyBkZSBuw7ptZXJvIGRlIGNvbmdsb21lcmFkb3MsIG1lZGlkYXMgZGUgZGlzdGFuY2lhIHkgbcOpdG9kb3MgZGUgY29uZ2xvbWVyYWRvLCBkZXRlcm1pbsOzIHF1ZSB0YWwgbsO6bWVybyBlcyAzIChzaXR1YWNpw7NuIG5vIG11eSB2aXNpYmxlIGVuIGxhIGdyw6FmaWNhIGNvbW8gZW4gbG9zIGFudGVyaW9yZXMgbcOpdG9kb3MsIHBlcm8gc2kgcHJlc2VudGUgZW4gbGEgY29uY2x1c2nDs24gZ2VuZXJhZGEgcG9yIGVsIG1pc21vIGPDs2RpZ28gZGVsIG3DqXRvZG8gZW4gbGEgIlIgY29uc29sZSIpOyBHcmFjaWFzIGEgZXN0ZSBhcGFydGFkbyBlbiBsYSBwcmltZXIgcGVzdGHDsWEsIHNlIHNhYmUgcXVlIGxvcyBuw7ptZXJvcyBkZSBncnVwb3MgbcOhcyDDs3B0aW1vcyB5IHBlcnRpbmVudGVzIHBhcmEgcmVhbGl6YXIgbGEgc2lndWllbnRlIHBlc3Rhw7FhICoqUmVzdWx0YWRvcyBrLW1lYW5zKiogc29uIGRlIDIgeSAzLg0KRW4gbGEgc2VndW5kYSBwZXN0YcOxYSAqKlJlc3VsdGFkb3MgSy1tZWFucyoqIHNlIGVzIG5lY2VzYXJpbyBlc3RhYmxlY2VyIHVuYSBlc3RydWN0dXJhIHBhcmEgZmFjaWxpdGFyIGFzw60gbGEgZm9ybWEgZW4gbGEgY3VhbCBzZSByZWZpZXJlIGEgY2FkYSByZXN1bHRhZG8gZW4gbG9zIGNodW5rcywgZW4gZG9uZGUgc2UgdG9tYXLDoSA0IHBhcnRlcywgZG9uZGUgY2FkYSB1bmEgZGUgZXN0YXMgc2VyYSAqKjEuSy1tZWFucyBjbHVzdGVyaW5nKiogKioyLkNsdXN0ZXIgbWVhbnMqKiAqKjMuQ2x1c3RlcmluZyB2ZWN0b3IqKiAqKjQuc3VtIG9mIHNxdWFyZXMgYnkgY2x1c3RlcioqLlBhcmEgIGxhICoqcGFydGUgMSoqIGVuIGVsICoqcHJpbWVyIGstb3B0aW1vKiogKGdlbmVyYWRvIGNvbiB1biBudW1lcm8gb3B0aW1vIGRlIDIgYWdydXBhY2lvbmVzKSwgZWwgYWxnb3JpdG1vIGhhIGFncnVwYWRvIGxhcyBvYnNlcnZhY2lvbmVzIGVuIDIgY2x1c3RlciBkZSB0YW1hw7FvcyAqKjIzKiogeSAqKjEqKiBlbiBkb25kZSBsYSBhc2lnbmFjacOzbiBkZXNpZ3VhbCBzdWdpZXJlIHF1ZSBlbCBzZWd1bmRvIGNsdXN0ZXIgcmVwcmVzZW50YSB1biAiY2FzbyBhdMOtcGljbyIgbyAiZXNwZWNpYWwiIGVuIGNvbXBhcmFjacOzbiBjb24gZWwgcmVzdG8gZGUgbG9zIGRhdG9zOyBlbiBsYSAqKnBhcnRlIDIqKiBFbCBDbHVzdGVyIDIgdGllbmUgdmFsb3JlcyBzaWduaWZpY2F0aXZhbWVudGUgbcOhcyBhbHRvcyBlbiB0b2RhcyBsYXMgdmFyaWFibGVzIChjYXNpIGVsIGRvYmxlIG8gbcOhcykgZW4gY29tcGFyYWNpw7NuIGNvbiBlbCBDbHVzdGVyIDEsIGxvIGN1YWwgaW5kaWNhIHF1ZSBlbCDDum5pY28gbWllbWJybyBkZWwgQ2x1c3RlciAyIHByZXNlbnRhIHVuYSBhY3RpdmlkYWQgbXV5IHN1cGVyaW9yIGVuIHTDqXJtaW5vcyBkZSB2b3RvcywgY29tZW50YXJpb3MsIHZpc3RhcyB5IGZvcmtzOyoqcGFydGUgMyoqIGVuIGVzdGEgc2UgYXNpZ25hIGxvcyBwYcOtc2VzIGEgbG9zIGNsdXN0ZXIgZW4gZG9uZGUgc2UgYXNpZ25hIMO6bmljYW1lbnRlICoqVmlldG5hbSoqIGVuIGVsIGNsdXN0ZXIgMjsgUGFyYSBsYSAqKnBhcnRlIDQqKiBsYSBzdW1hIGRlIGN1YWRyYWRvcyBkZW50cm8gZGUgbG9zIGNsdXN0ZXIgZXMgMC4wMTEyIHkgMC4wMDAoRXN0ZSByZXN1bHRhZG8gZXMgZGUgZXNwZXJhciB5YSBxdWUgZXN0ZSBjbHVzdGVyIGNvbnRpZW5lIHNvbG8gdW5hIG9ic2VydmFjacOzbiwgcG9yIGxvIHF1ZSBubyBoYXkgdmFyaWFiaWxpZGFkIGludGVybmEpLg0KQ29uIGVzdGEgbWlzbWEgc2VjdWVuY2lhIHBhcmEgIGxhICoqcGFydGUgMSoqIGVuIGVsICoqc2VndW5kbyBrLW9wdGltbyoqIChnZW5lcmFkbyBjb24gdW4gbnVtZXJvIG9wdGltbyBkZSAzIGFncnVwYWNpb25lcyksIGVsIGFsZ29yaXRtbyBoYSBhZ3J1cGFkbyBsYXMgb2JzZXJ2YWNpb25lcyBlbiAzIGNsdXN0ZXJzIGRlIHRhbWHDsW9zICoqMSoqLCAqKjE5KiogeSAqKjQqKiBFc3RvIHN1Z2llcmUgeSBhcG95YSBsYSBpZGVhIHF1ZSBoYXkgdW4gY2x1c3RlciAoZW4gZXN0ZSBjYXNvIGVsIHByaW1lciBjbHVzdGVyKSBjb250aWVuZSB1biBjYXNvIMO6bmljbywgbWllbnRyYXMgcXVlIGxvcyBkZW3DoXMgYWdydXBhbiBwYcOtc2VzIGNvbiBjb21wb3J0YW1pZW50b3Mgc2ltaWxhcmVzOyBlbiBsYSAqKnBhcnRlIDIqKiBlbCBDbHVzdGVyIDEgY29udGllbmUgbG9zIHZhbG9yZXMgbcOhcyBhbHRvcyBlbiB0b2RhcyBsYXMgdmFyaWFibGVzLCBsbyBxdWUgbG8gZGlmZXJlbmNpYSBzaWduaWZpY2F0aXZhbWVudGUgZGUgbG9zIGRlbcOhcyBjbHVzdGVycywgZWwgQ2x1c3RlciAyIHJlcHJlc2VudGEgcGHDrXNlcyBjb24gbG9zIHZhbG9yZXMgbcOhcyBiYWpvcyBlbiBsYXMgdmFyaWFibGVzLCBwb3NpYmxlbWVudGUgcmVmbGVqYW5kbyBtZW5vciBhY3RpdmlkYWQgbyBwYXJ0aWNpcGFjacOzbiB5IHBvciDDumx0aW1vIGVsIENsdXN0ZXIgMyB0aWVuZSB2YWxvcmVzIGludGVybWVkaW9zIGVudHJlIGxvcyBkb3MgY2x1c3RlcnMgYW50ZXJpb3JlcywgaW5kaWNhbmRvIHVuIG5pdmVsIG1vZGVyYWRvIGRlIGFjdGl2aWRhZCBlbiBsYXMgbcOpdHJpY2FzIGFuYWxpemFkYXMuICoqcGFydGUgMyoqIGVuIGVzdGEgc2UgYXNpZ25hIGxvcyBwYcOtc2VzIGFsIGNsw7pzdGVyIGVuIGRvbmRlIGxhIGFzaWduYWNpw7NuIGRlIGltcG9ydGFuY2lhIGVzICoqVmlldG5hbSoqIHlhIHF1ZSBlc3RhIHNlIGFzaWduYSDDum5pY2FtZW50ZSBlbiBlbCBjbHVzdGVyIDEgcmVhZmlybWFuZG8gcXVlIGVzIHVuIGNhc28gYXTDrXBpY28gY29uIHVuIGNvbXBvcnRhbWllbnRvIGRlc3RhY2FkbyBlbiBsYXMgdmFyaWFibGVzOyBQYXJhIGxhICoqcGFydGUgNCoqIGxhIHN1bWEgZGUgY3VhZHJhZG9zIGRlbnRybyBkZSBsb3MgY2x1c3RlciBlcyAwLjAwMDAoc2luIHZhcmlhYmlsaWRhZCBpbnRlcm5hIHBvciBzb2xvIGNvbnRlbmVyIGEgdmlldGhuYW0pLCAwLjAwNDMgKG11ZXN0cmEgYWxnbyBkZSBkaXNwZXJzacOzbiwgcGVybyBzaWd1ZSBzaWVuZG8gY29tcGFjdG8peSBmaW5hbG1lbnRlIDAuMDAwOSAobGEgYmFqYSBzdW1hIGRlIGN1YWRyYWRvcyBzZSBwdWVkZSBpbnRlcnByZXRhciBjb21vIHF1ZSBsYXMgb2JzZXJ2YWNpb25lcyBlc3TDoW4gbcOhcyBjb25jZW50cmFkYXMgZW4gZWwgZXNwYWNpbyBkZSBsYXMgdmFyaWFibGVzKS4NCg0KRmluYWxtZW50ZSwgZW4gbGEgcGVzdGHDsWEgKipHcsOhZmljb3MgSy1tZWFucyoqLCBzZSBhcG95YSBsbyBtZW5jaW9uYWRvIGFudGVyaW9ybWVudGUsIHlhIHF1ZSBlbiBhbWJhcyBncsOhZmljYXMgc2UgcmVwcmVzZW50YSBxdWUgVmlldG5hbSBlcyBlbCDDum5pY28gcGHDrXMgZW4gZXN0ZSBjbHVzdGVyLCBsbyBjdWFsIGNvaW5jaWRlIGNvbiBlbCByZXN1bHRhZG8gZGVsIGFuw6FsaXNpcywgZG9uZGUgZWwgY2x1c3RlciBxdWUgcmVwcmVzZW50YSBhIHZpZXRuYW0gdGVuw61hIHVuIHRhbWHDsW8gZGUgMS4gRXN0byBzdWdpZXJlIHF1ZSBWaWV0bmFtIGVzIHVuIGNhc28gYXTDrXBpY28gZW4gbGFzIGRpbWVuc2lvbmVzIGFuYWxpemFkYXMgKFZvdGVzLCBDb21tZW50cywgVmlld3MsIEZvcmtzKSwgY29uIHZhbG9yZXMgc2lnbmlmaWNhdGl2YW1lbnRlIGRpZmVyZW50ZXMgYWwgcmVzdG8uIEVuIGxhIGdyw6FmaWNhLCBWaWV0bmFtIGVzdMOhIGFpc2xhZG8gZW4gZWwgZXh0cmVtbyBpenF1aWVyZG8gZGUgRGltMSwgcmVmbGVqYW5kbyBzdSBzaW5ndWxhcmlkYWQuDQoNCg0KIyMjIyBLLW9wdGltb3Mgey50YWJzZXQgIC50YWJzZXQtcGlsbHN9DQoNCiMjIyMjIEVsYm93DQpgYGB7ciBFbGJvdywgZmlnLmFsaWduPSdjZW50ZXInfQ0KZnZpel9uYmNsdXN0KGRhdGFfLCBrbWVhbnMsIG1ldGhvZCA9ICJ3c3MiKSArIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDMsIGxpbmV0eXBlID0gMikNCmBgYA0KDQojIyMjIyBTaWxob3VldHRlDQpgYGB7ciBTaWxob3VldHRlLCBmaWcuYWxpZ249J2NlbnRlcid9DQpmdml6X25iY2x1c3QoZGF0YV8sIGttZWFucywgbWV0aG9kID0gInNpbGhvdWV0dGUiKQ0KYGBgDQoNCiMjIyMjIEdhcCBTdGF0aXN0aWMNCmBgYHtyIEdhcF9TdGF0aXN0aWMsIGZpZy5hbGlnbj0nY2VudGVyJ30NCmZ2aXpfbmJjbHVzdChkYXRhXywga21lYW5zLCBtZXRob2QgPSAiZ2FwX3N0YXQiKQ0KDQpgYGANCg0KIyMjIyMgTWFqb3JpdHkgUnVsZQ0KYGBge3IgTWFqb3JpdHlfUnVsZSwgZmlnLmFsaWduPSdjZW50ZXInfQ0Kc3VwcHJlc3NXYXJuaW5ncyhOYkNsdXN0KGRhdGEgPSBkYXRhXywgZGlzcyA9IE5VTEwsIGRpc3RhbmNlID0gImV1Y2xpZGVhbiIsIG1pbi5uYyA9IDIsIG1heC5uYyA9IDEwLCBtZXRob2QgPSAia21lYW5zIikkQmVzdC5uYykNCmBgYA0KDQojIyMjIFJlc3VsdGFkb3MgSy1tZWFucyB7LnRhYnNldCAgLnRhYnNldC1waWxsc30NCg0KIyMjIyMgSy3Ds3B0aW1vIFtFbF0NCmBgYHtyICwgZmlnLmFsaWduPSdjZW50ZXInfQ0Kc2V0LnNlZWQoNzgwNzI4KQ0KcHJpbnQoa21lYW5zKGRhdGFfLCAyLCBuc3RhcnQgPSAyNSkpDQoNCmBgYA0KDQojIyMjIyBLLcOzcHRpbW8gW1NpbF0NCmBgYHtyICwgZmlnLmFsaWduPSdjZW50ZXInfQ0Kc2V0LnNlZWQoNzgwNzI4KQ0KcHJpbnQoa21lYW5zKGRhdGFfLCAzLCBuc3RhcnQgPSAyNSkpDQpgYGANCg0KIyMjIyBHcsOhZmljb3MgSy1tZWFucyB7LnRhYnNldCAgLnRhYnNldC1waWxsc30NCg0KIyMjIyMgSy3Ds3B0aW1vIFtFbF0NCmBgYHtyICxmaWcuYWxpZ249J2NlbnRlcid9DQpmdml6X2NsdXN0ZXIoa21lYW5zKGRhdGFfLCAyLCBuc3RhcnQgPSAyNSksIGRhdGEgPSBkYXRhXywgcGFsZXR0ZSA9IGMoIiMyRTlGREYiLCAiIzAwQUZCQiIsICIjRTdCODAwIiwgIiNFN0I4MDEiKSwgZWxsaXBzZS50eXBlID0gImV1Y2xpZCIsIHN0YXIucGxvdCA9IFRSVUUsIHJlcGVsID0gVFJVRSwgZ2d0aGVtZSA9IHRoZW1lX21pbmltYWwoKQ0KKQ0KYGBgDQoNCiMjIyMjIEstw7NwdGltbyBbU2lsXQ0KYGBge3IgLGZpZy5hbGlnbj0nY2VudGVyJ30NCmZ2aXpfY2x1c3RlcihrbWVhbnMoZGF0YV8sIDMsIG5zdGFydCA9IDI1KSwgZGF0YSA9IGRhdGFfLCBwYWxldHRlID0gYygiIzJFOUZERiIsICIjMDBBRkJCIiwgIiNFN0I4MDAiLCAiI0U3QjgwMSIpLCBlbGxpcHNlLnR5cGUgPSAiZXVjbGlkIiwgc3Rhci5wbG90ID0gVFJVRSwgcmVwZWwgPSBUUlVFLCBnZ3RoZW1lID0gdGhlbWVfbWluaW1hbCgpDQopDQoNCmBgYA0KDQoNCiMjICoqRmFzZSA1IFtBbsOhbGlzaXMgZGUgUmVncmVzacOzbl0qKg0KDQojIyMgKio1LjEuIE9iamV0aXZvcyoqDQotSWRlbnRpZmljYXIgbGFzIHZhcmlhYmxlcyBtw6FzIGluZmx1eWVudGVzIGVuIGVsIGNvbXBvcnRhbWllbnRvIGRlIGxhIHZhcmlhYmxlIGRlcGVuZGllbnRlLCBwYXJhIHBvZGVyIHRvbWFyIGRlY2lzaW9uZXMgbcOhcyBpbmZvcm1hZGFzLg0KDQotVXNhciBtw6l0b2RvcyBkZSBhbsOhbGlzaXMgcGFyYSBlbnRlbmRlciBjw7NtbyBzZSByZWxhY2lvbmFuIGxhcyB2YXJpYWJsZXMgZW50cmUgc8OtLCBjb24gZWwgb2JqZXRpdm8gZGUgaGFjZXIgcHJlZGljY2lvbmVzLCB2ZXIgcXXDqSB0YW4gaW1wb3J0YW50ZXMgc29uIGFsZ3VuYXMgdmFyaWFibGVzIGVuIGVsIHJlc3VsdGFkbyBkZSBvdHJhcywgeSBjb21wcm9iYXIgc2kgZWwgbW9kZWxvIHF1ZSBoZW1vcyBjcmVhZG8gZXMgYnVlbm8gbyBuby4NCg0KLVJlYWxpemFyIHByZWRpY2Npb25lcyBwcmVjaXNhcyBzb2JyZSBlbCBjb21wb3J0YW1pZW50byBkZSB1bmEgdmFyaWFibGUgZGVwZW5kaWVudGUsIHV0aWxpemFuZG8gbGFzIHJlbGFjaW9uZXMgZGVzY3ViaWVydGFzIGVudHJlIHZhcmlhYmxlcyBpbmRlcGVuZGllbnRlcy4NCg0KIyMjICoqNS4yLiBSZWdyZXNpw7NuIExpbmVhbCBTaW1wbGUqKiANCg0KRWwgYW7DoWxpc2lzIHF1ZSBzZSBsbGV2YXLDoSBhIGNhYm8gZW4gZXN0ZSBlc3R1ZGlvIHRpZW5lIGNvbW8gb2JqZXRpdm8gZXhwbG9yYXIgbGEgcmVsYWNpw7NuIGVudHJlIGxhcyB2YXJpYWJsZXMgY3VhbnRpdGF0aXZhcyB5IGxhIHZhcmlhYmxlIGN1YWxpdGF0aXZhIGNsYXNpZmljYWRvcmEsIHV0aWxpemFuZG8gdW4gZW5mb3F1ZSBlc3RhZMOtc3RpY28gZGV0YWxsYWRvLiBTZSBlbXBsZWFyw6FuIGRpdmVyc2FzIHTDqWNuaWNhcyBwYXJhIGFuYWxpemFyIGVsIGNvbXBvcnRhbWllbnRvIGRlIGxhcyB2YXJpYWJsZXMgeSBzdSBpbnRlcmFjY2nDs24sIGluY2x1eWVuZG8gZWwgcmVzdW1lbiBkZSBsYXMgdm90YWNpb25lcyAqKigiVm90ZXMiKSoqIHkgdmlzdWFsaXphY2lvbmVzIGEgdHJhdsOpcyBkZSBncsOhZmljb3MgY29tbyBlbCBkaWFncmFtYSBkZSBkaXNwZXJzacOzbiBlbnRyZSB2b3RvcyB5IHZpc3RhcyAqKigiVmlld3MiKSoqLiBBZGVtw6FzLCBzZSBjYWxjdWxhcsOhbiBsb3MgY29lZmljaWVudGVzIGRlbA0KbW9kZWxvIGRlIHJlZ3Jlc2nDs24gbGluZWFsIHNpbXBsZSAqKihSTFMpKiosIHNlIHByZXNlbnRhcsOhbiByZXPDum1lbmVzIGVzdGFkw61zdGljb3MgZGVsIG1pc21vLCB5IHNlIHJlYWxpemFyw6EgdW5hIHRhYmxhICoqQU5PVkEqKiBwYXJhIGV2YWx1YXIgbGEgc2lnbmlmaWNhbmNpYSBkZSBsb3MgZmFjdG9yZXMgaW52b2x1Y3JhZG9zLiBFbCBhbsOhbGlzaXMgdGFtYmnDqW4gaW5jbHVpcsOhIGxhIGVzdGltYWNpw7NuIGRlIGludGVydmFsb3MgZGUgY29uZmlhbnphIHBhcmEgbG9zIGNvZWZpY2llbnRlcyBkZWwgbW9kZWxvLCBhc8OtIGNvbW8gbGFzIHByZWRpY2Npb25lcyByZWFsaXphZGFzIHkgc3VzIGNvcnJlc3BvbmRpZW50ZXMgaW50ZXJ2YWxvcyBkZSBwcmVkaWNjacOzbiB5IGRlIGNvbmZpYW56YS4gRXN0ZSBlbmZvcXVlIHBlcm1pdGlyw6EgZW50ZW5kZXIgbWVqb3IgbGFzIHJlbGFjaW9uZXMgZW50cmUgbGFzIHZhcmlhYmxlcyB5IHByb3BvcmNpb25hciB1biBtYXJjbyByb2J1c3RvIHBhcmEgbGEgdG9tYSBkZSBkZWNpc2lvbmVzIGJhc2FkYSBlbiBsb3MgZGF0b3MuDQoNCkVuIGVsIGRlc2Fycm9sbG8gZGVsIGFuw6FsaXNpcywgc2UgdXRpbGl6YXLDoW4gbGFzIHZhcmlhYmxlcyBjdWFudGl0YXRpdmFzIHkgY3VhbGl0YXRpdmFzIGNsYXNpZmljYWRvcmFzIHBhcmEgY29tcHJlbmRlciBsYSByZWxhY2nDs24geSBlbCBjb21wb3J0YW1pZW50byBkZSBsYXMgbWlzbWFzIGEgdHJhdsOpcyBkZSBkaXZlcnNvcyBtw6l0b2RvcyBlc3RhZMOtc3RpY29zLiBTZSBpbmljaWFyw6EgY29uIHVuIHJlc3VtZW4gZGVzY3JpcHRpdm8gZGUgbGFzIHZhcmlhYmxlcyAqKiJWb3RlcyIgeSAiVmlld3MiKiosIGxvIHF1ZSBwZXJtaXRpcsOhIG9idGVuZXIgdW5hIHZpc2nDs24gZ2VuZXJhbCBkZSBzdSBkaXN0cmlidWNpw7NuIHkgY2FyYWN0ZXLDrXN0aWNhcyBjbGF2ZS4gUG9zdGVyaW9ybWVudGUsIHNlIGFuYWxpemFyw6EgbGEgcmVsYWNpw7NuIGVudHJlIGVzdGFzIGRvcyB2YXJpYWJsZXMgbWVkaWFudGUgdW4gZGlhZ3JhbWEgZGUgZGlzcGVyc2nDs24sIGxvIGN1YWwgYXl1ZGFyw6EgYSB2aXN1YWxpemFyIHN1IHBvc2libGUgY29ycmVsYWNpw7NuLiBBIGNvbnRpbnVhY2nDs24sIHNlIGFib3JkYXLDoSB1biBhbsOhbGlzaXMgbcOhcyBwcm9mdW5kbyBtZWRpYW50ZSBsYSBjb25zdHJ1Y2Npw7NuIGRlbCBtb2RlbG8gZGUgcmVncmVzacOzbiBsaW5lYWwgc2ltcGxlIChSTFMpLCBlbiBlbCBjdWFsIHNlIGV4YW1pbmFyw6FuIGxvcyBjb2VmaWNpZW50ZXMgZXN0aW1hZG9zIGRlbCBtb2RlbG8sIHkgc2UgaW5jbHVpcsOhIHVuIHJlc3VtZW4gZXN0YWTDrXN0aWNvIGRldGFsbGFkbyBkZSBzdXMgcmVzdWx0YWRvcy4gTGEgc2lnbmlmaWNhbmNpYSBkZSBsb3MgZmFjdG9yZXMgaW52b2x1Y3JhZG9zIGVuIGVsIG1vZGVsbyBzZXLDoSBldmFsdWFkYSBhIHRyYXbDqXMgZGUgdW5hIHRhYmxhIEFOT1ZBLCBsbyBxdWUgcGVybWl0aXLDoSB2ZXJpZmljYXIgc2kgbGFzIHZhcmlhYmxlcyBleHBsaWNhdGl2YXMgdGllbmVuIHVuIGVmZWN0byByZWxldmFudGUgc29icmUgbGEgdmFyaWFibGUgZGVwZW5kaWVudGUuIFRhbWJpw6luIHNlIGNhbGN1bGFyw6FuIGludGVydmFsb3MgZGUgY29uZmlhbnphIHBhcmEgZWwgY29lZmljaWVudGUgQjEsIGxvIHF1ZSBwcm9wb3JjaW9uYXLDoSB1bmEgZXN0aW1hY2nDs24gcHJlY2lzYSBkZSBzdSByYW5nbyBkZSB2YWxvcmVzIHBvc2libGVzLiBGaW5hbG1lbnRlLCBzZSByZWFsaXphcsOhbiBwcmVkaWNjaW9uZXMgYmFzYWRhcyBlbiBlbCBtb2RlbG8gYWp1c3RhZG8sIGNvbiBzdXMgcmVzcGVjdGl2b3MgaW50ZXJ2YWxvcyBkZSBwcmVkaWNjacOzbiBlIGludGVydmFsb3MgZGUgY29uZmlhbnphLCBjb24gZWwgb2JqZXRpdm8gZGUgb2ZyZWNlciB1bmEgdmlzacOzbiByb2J1c3RhIHNvYnJlIGVsIGNvbXBvcnRhbWllbnRvIGZ1dHVybyBkZSBsYXMgdmFyaWFibGVzIGVzdHVkaWFkYXMuIEVzdGUgZW5mb3F1ZSBpbnRlZ3JhbCBnYXJhbnRpemFyw6EgdW4gYW7DoWxpc2lzIGV4aGF1c3Rpdm8geSBkZXRhbGxhZG8gZGUgbG9zIGRhdG9zLg0KDQoqKkNvbmNsdXNpb24qKg0KDQpSZWdyZXNpw7NuIExpbmVhbCBTaW1wbGUgdGllbmUgY29tbyBvYmpldGl2byBhbmFsaXphciBsYSByZWxhY2nDs24gZW50cmUgZG9zIHZhcmlhYmxlcyBjbGF2ZSBlbiBlbCBjb25qdW50byBkZSBkYXRvczogVm90ZXMgeSBWaWV3cy4gRXN0ZSBhbsOhbGlzaXMgY29taWVuemEgY29uIHVuIHJlc3VtZW4gZXN0YWTDrXN0aWNvIGRlIGxhcyB2YXJpYWJsZXMgYmFqbyBlc3R1ZGlvLCBxdWUgaW5jbHV5ZSB1bmEgcmV2aXNpw7NuIGRlIGxhcyBjYXJhY3RlcsOtc3RpY2FzIGLDoXNpY2FzIGRlIGNhZGEgdmFyaWFibGUgY29tbyAobWVkaWEsIG1lZGlhbmEsIG3DrW5pbW8sIG3DoXhpbW8sIGVudHJlIG90cm9zKSBhIHRyYXbDqXMgZGUgbGEgZnVuY2nDs24gKipzdW1tYXJ5KCkqKi4gRXN0YSBoZXJyYW1pZW50YSBwcm9wb3JjaW9uYSB1bmEgdmlzacOzbiBwcmVsaW1pbmFyIGRlIGxhIGRpc3RyaWJ1Y2nDs24gZGUgVm90ZXMgeSBWaWV3cywgcGVybWl0aWVuZG8gaWRlbnRpZmljYXIgcG9zaWJsZXMgdGVuZGVuY2lhcyBvIGFub21hbMOtYXMgZW4gbG9zIGRhdG9zLiBBZGVtw6FzLCBzZSBwcmVzZW50YSB1biBkaWFncmFtYSBkZSBkaXNwZXJzacOzbiBlbnRyZSBhbWJhcyB2YXJpYWJsZXMsIHF1ZSB2aXN1YWxpemEgbGEgcmVsYWNpw7NuIHBvdGVuY2lhbCBlbnRyZSBWb3RlcyB5IFZpZXdzLCBheXVkYW5kbyBhIGV2YWx1YXIgc2kgZXMgYWRlY3VhZGEgbGEgYXBsaWNhY2nDs24gZGUgdW4gbW9kZWxvIGRlIHJlZ3Jlc2nDs24gbGluZWFsIHNpbXBsZS4NClVuYSB2ZXogYW5hbGl6YWRhcyBsYXMgdmFyaWFibGVzLCBzZSBwcm9jZWRlIGEgbGEgZm9ybXVsYWNpw7NuIGRlbCBtb2RlbG8gZGUgcmVncmVzacOzbiBsaW5lYWwgc2ltcGxlIChSTFMpIGVudHJlIFZvdGVzIHkgVmlld3MuIFBhcmEgZWxsbywgc2UgdXNhIGxhIGZ1bmNpw7NuICoqbG0oKSoqLCBsYSBjdWFsIGFqdXN0YSB1biBtb2RlbG8gZGUgcmVncmVzacOzbiBsaW5lYWwsIHJlcHJlc2VudGFuZG8gYSBWb3RlcyBlbiBmdW5jacOzbiBkZSBWaWV3cy4NCkxvcyBjb2VmaWNpZW50ZXMgZGVsIG1vZGVsbyBvYnRlbmlkb3MgbWVkaWFudGUgY29lZigpIG5vcyBpbmRpY2FuIGxhIHBlbmRpZW50ZSB5IGxhIGludGVyc2VjY2nDs24gZGUgbGEgcmVjdGEgYWp1c3RhZGEsIGxvIHF1ZSBkZWZpbmUgbGEgcmVsYWNpw7NuIGVudHJlIGxhcyBkb3MgdmFyaWFibGVzLiBBIGNvbnRpbnVhY2nDs24sIHNlIHV0aWxpemEgc3VtbWFyeSgpIHBhcmEgb2J0ZW5lciB1biByZXN1bWVuIGVzdGFkw61zdGljbyBkZWwgbW9kZWxvLA0KcXVlIHByb3BvcmNpb25hIGluZm9ybWFjacOzbiBjcnVjaWFsIHNvYnJlIGxhIGNhbGlkYWQgZGVsIGFqdXN0ZSB5IGxhIHNpZ25pZmljYW5jaWEgZGUgbGFzIHZhcmlhYmxlcyBpbnZvbHVjcmFkYXMuIFRhbWJpw6luIHNlIGVtcGxlYSBlbCBhbsOhbGlzaXMgZGUgdmFyaWFuemEgKEFOT1ZBKSBjb24gbGEgZnVuY2nDs24gYW5vdmEoKSBwYXJhIHZlcmlmaWNhciBsYSB2YWxpZGV6IGRlbCBtb2RlbG8sIG9ic2VydmFuZG8gc2kgbGEgdmFyaWFiaWxpZGFkIGV4cGxpY2FkYSBwb3IgZWwgbW9kZWxvIGVzIHNpZ25pZmljYXRpdmEgZnJlbnRlIGEgbGEgdmFyaWFiaWxpZGFkIG5vIGV4cGxpY2FkYS5FbiBlc3RhIGV0YXBhLCBlcyBpbXBvcnRhbnRlIGRlc3RhY2FyIGVsIHVzbyBkZSBsYSBmdW5jacOzbiAqKnN1cHByZXNzV2FybmluZ3MoKSoqIGVuIGNpZXJ0b3MgY8OzZGlnb3MuIEVzdGUgY29tYW5kbyBzZSB1dGlsaXphIHBhcmEgc3VwcmltaXIgYWR2ZXJ0ZW5jaWFzIHF1ZSBwb2Ryw61hbiBzdXJnaXIgZHVyYW50ZSBlbCBjw6FsY3VsbyBkZSBwcmVkaWNjaW9uZXMgbyBpbnRlcnZhbG9zLiBFc3RvIHNlIGhhY2UgcGFyYSBldml0YXIgcXVlIG1lbnNhamVzIGlubmVjZXNhcmlvcyBpbnRlcnJ1bXBhbiBsYSB2aXN1YWxpemFjacOzbiBkZSBsb3MgcmVzdWx0YWRvcywgZXNwZWNpYWxtZW50ZSBjdWFuZG8gbm8gc29uIHJlbGV2YW50ZXMgcGFyYSBlbCBhbsOhbGlzaXMgcXVlIHNlIGVzdMOhIHJlYWxpemFuZG8uDQpGaW5hbG1lbnRlLCBzZSBsbGV2YSBhIGNhYm8gdW4gYW7DoWxpc2lzIG3DoXMgZGV0YWxsYWRvIGRlbCBtb2RlbG8gUkxTLCBxdWUgaW5jbHV5ZSBsYSBlc3RpbWFjacOzbiBkZWwgaW50ZXJ2YWxvIGRlIGNvbmZpYW56YSBwYXJhIGVsIGNvZWZpY2llbnRlIGRlIHBlbmRpZW50ZSAoQjEpLCB1dGlsaXphbmRvIGxhIGZ1bmNpw7NuICoqY29uZmludCgpKiouIEVzdGUgaW50ZXJ2YWxvIG5vcyBkYSB1bmEgaWRlYSBkZSBsYSBwcmVjaXNpw7NuIGNvbiBsYSBxdWUgc2UgZXN0aW1hIGxhIHBlbmRpZW50ZSBkZWwgbW9kZWxvLiBMdWVnbywgc2UgcmVhbGl6YW4gcHJlZGljY2lvbmVzIHV0aWxpemFuZG8gbGEgZnVuY2nDs24gKipwcmVkaWN0KCkqKiwgdGFudG8gY29uIGludGVydmFsb3MgZGUgcHJlZGljY2nDs24gY29tbyBpbnRlcnZhbG9zIGRlIGNvbmZpYW56YS4gTG9zIGludGVydmFsb3MgZGUgcHJlZGljY2nDs24gbm9zIHBlcm1pdGVuIGVzdGltYXIgZWwgcmFuZ28gZGVudHJvIGRlbCBjdWFsIHNlIGVzcGVyYSBxdWUgY2FpZ2FuIGZ1dHVyYXMgb2JzZXJ2YWNpb25lcywgbWllbnRyYXMgcXVlIGxvcyBpbnRlcnZhbG9zIGRlIGNvbmZpYW56YSBwcm9wb3JjaW9uYW4gdW4gcmFuZ28gZW4gZWwgcXVlIGVzIHByb2JhYmxlIHF1ZSBzZSBlbmN1ZW50cmUgbGEgdmVyZGFkZXJhIG1lZGlhIGRlIGxhcyByZXNwdWVzdGFzLg0KRW4gcmVzdW1lbiwgZXN0ZSBjYXDDrXR1bG8gcHJvcG9yY2lvbmEgdW5hIHZpc2nDs24gaW50ZWdyYWwgZGVsIGFuw6FsaXNpcyBkZSByZWdyZXNpw7NuIGxpbmVhbCBzaW1wbGUsIGRlc2RlIGVsIHJlc3VtZW4gaW5pY2lhbCBkZSBsYXMgdmFyaWFibGVzIGhhc3RhIGxhIGV2YWx1YWNpw7NuIGZpbmFsIGRlbCBtb2RlbG8geSBzdXMgcHJlZGljY2lvbmVzLiBMb3MgbcOpdG9kb3MgeSBmdW5jaW9uZXMgZGUgUiBlbXBsZWFkb3MgYSBsbyBsYXJnbyBkZWwNCmFuw6FsaXNpcyBwZXJtaXRlbiByZWFsaXphciB1biBlc3R1ZGlvIGV4aGF1c3Rpdm8geSBwcmVjaXNvIGRlIGxhIHJlbGFjacOzbiBlbnRyZSBWb3RlcyB5IFZpZXdzLCBwcm9wb3JjaW9uYW5kbyBoZXJyYW1pZW50YXMgdmFsaW9zYXMgcGFyYSBsYSB0b21hIGRlIGRlY2lzaW9uZXMgaW5mb3JtYWRhcyBiYXNhZGFzIGVuIGxvcyBkYXRvcy4NCg0KDQojIyMgKipSZXN1bWVuIEVzdGFkaXN0aWNvIGRlIGxhcyBWYXJpYWJsZXMgcG9yIEVzdHVkaWFyKiogey50YWJzZXQgIC50YWJzZXQtcGlsbHN9DQojIyMjIFJlc3VtZW4gZGUgVm90ZXMNCmBgYHtyIFJlc3VtZW5fZGVfVm90ZXMsIGZpZy5hbGlnbj0nY2VudGVyJ30NCg0KDQpzdW1tYXJ5KERhdGFzZXRfTXVlc3RyZWFkbzMkVm90ZXMpDQoNCmJveHBsb3QoRGF0YXNldF9NdWVzdHJlYWRvMyRWb3RlcywgbWFpbiA9ICJEaWFncmFtYSBkZSBDYWphIGRlIFZvdGVzIiwgY29sID0gYygiYnJvd240IikpDQpgYGANCg0KIyMjIyBSZXN1bWVuIGRlIFZpZXdzDQoNCmBgYHtyIFJlc3VtZW5fZGVfVmlld3MsIGZpZy5hbGlnbj0nY2VudGVyJ30NCnN1bW1hcnkoRGF0YXNldF9NdWVzdHJlYWRvMyRWaWV3cykNCg0KYm94cGxvdChEYXRhc2V0X011ZXN0cmVhZG8zJFZpZXdzLCBtYWluID0gIkRpYWdyYW1hIGRlIENhamEgZGUgVmlld3MiLCBjb2wgPSBjKCJicm93bjQiKSkNCg0KDQpgYGANCg0KIyMjIyBEaWFncmFtYSBkZSBEaXNwZXJzaW9uIFZvdCB2LnMgVmlld3MNCmBgYHtyICBEaWFncmFtYV9kZV9EaXNwZXJzaW9uX1ZvdF92LnNfVmlld3MsZmlnLmFsaWduPSdjZW50ZXInfQ0KcGxvdChEYXRhc2V0X011ZXN0cmVhZG8zJFZvdGVzLCBEYXRhc2V0X011ZXN0cmVhZG8zJFZpZXdzLCBtYWluID0gIkRpYWdyYW1hIGRlIERpc3BlcnNpw7NuIFZvdCB2LnMgVmlld3MiKQ0KDQpgYGANCg0KIyMjIyBEaWFncmFtYXMgVG90YWwgZGUgRGlzcGVyc2lvbg0KYGBge3IgRGlhZ3JhbWFzX1RvdGFsX2RlX0Rpc3BlcnNpb24sIGZpZy5hbGlnbj0nY2VudGVyJ30NCg0KcGFpcnMofkNvbW1lbnRzICsgVmlld3MgKyBWb3RlcyArIEZvcmtzLCBkYXRhID0gRGF0YXNldF9NdWVzdHJlYWRvMykNCmBgYA0KDQojIyMgRm9ybXVsYWNpw7NuIGRlbCBtb2RlbG8gZGUgUkxTIGVudHJlIGxhcyB2YXJpYWJsZXMgZGUgZXN0dWRpbyB7LnRhYnNldCAgLnRhYnNldC1waWxsc30NCg0KIyMjIyBDb2VmaWNpZW50ZXMgZGVsIE1vZGVsbyBSTFMgDQpgYGB7ciBDb2VmaWNpZW50ZXNfZGVsX01vZGVsb19STFMsIGZpZy5hbGlnbj0nY2VudGVyJ30NCg0KbW9kZWxvX1JMX1NpbXBsZSA9IGxtKERhdGFzZXQkVm90ZXN+RGF0YXNldCRWaWV3cykNCmNvZWYobW9kZWxvX1JMX1NpbXBsZSkNCg0KYGBgDQoNCiMjIyMgUmVzdW1lbiBFc3RhZMOtc3RpY28gZGVsIE1vZGVsbyBSTFMNCmBgYHtyIFJlc3VtZW5fRXN0YWTDrXN0aWNvX2RlbF9Nb2RlbG9fUkxTfQ0KDQpzdW1tYXJ5KG1vZGVsb19STF9TaW1wbGUpDQoNCg0KYGBgDQoNCiMjIyMgVGFibGEgQU5PVkEgcGFyYSBlbCBNb2RlbG8gUkxTDQpgYGB7ciBUYWJsYV9BTk9WQV9wYXJhX2VsX01vZGVsb19STFN9DQphbm92YShtb2RlbG9fUkxfU2ltcGxlKQ0KDQoNCmBgYA0KDQojIyMgQW7DoWxpc2lzIGRlbCBtb2RlbG8gUkxTIHsudGFic2V0ICAudGFic2V0LXBpbGxzfQ0KDQojIyMjIEludGVydmFsbyBkZSBDb25maWFuemEgcGFyYSBCMQ0KYGBge3IgSW50ZXJ2YWxvX2RlX0NvbmZpYW56YV9wYXJhX0IxfQ0KDQpjb25maW50KG1vZGVsb19STF9TaW1wbGUsIGxldmVsID0gMC45NSkNCg0KYGBgDQoNCiMjIyMgUHJlZGljY2lvbmVzIHkgc3VzIEludGVydmFsb3MgZGUgUHJlZGljY2nDs24NCmBgYHtyIFByZWRpY2Npb25lc195X3N1c19JbnRlcnZhbG9zX2RlX1ByZWRpY2Npw7NufQ0KDQpzdXBwcmVzc1dhcm5pbmdzKHByZWRpY3QobW9kZWxvX1JMX1NpbXBsZSwgZGF0YS5mcmFtZShzZXEoMSw0MDApKSwgaW50ZXJ2YWw9J3ByZWRpY3Rpb24nLCBsZXZlbCA9IDAuOTUpKQ0KDQpgYGANCg0KIyMjIyBQcmVkaWNjaW9uZXMgeSBzdXMgSW50ZXJ2YWxvcyBkZSBDb25maWFuemENCmBgYHtyIFByZWRpY2Npb25lc195X3N1c19JbnRlcnZhbG9zX2RlX0NvbmZpYW56YSwgZmlnLmFsaWduPSdjZW50ZXInfQ0Kc3VwcHJlc3NXYXJuaW5ncyhwcmVkaWN0KG1vZGVsb19STF9TaW1wbGUsIGRhdGEuZnJhbWUoc2VxKDEsNDAwKSksIGludGVydmFsPSdjb25maWRlbmNlJywgbGV2ZWwgPSAwLjk1KSkNCg0KYGBgDQoNCg0KIyMjICoqNS4zLiBSZWdyZXNpw7NuIExpbmVhbCBNw7psdGlwbGUqKiB7LnRhYnNldCAgLnRhYnNldC1waWxsc30NCg0KIyMjICoqUmVzdW1lbiBlc3RhZMOtc3RpY28gZGUgbGFzIHZhcmlhYmxlcyBkZSBlc3R1ZGlvKiogey50YWJzZXQgIC50YWJzZXQtcGlsbHN9DQoNCkVuIGVsIGFuw6FsaXNpcyBkZSBkYXRvcywgbGFzIHZhcmlhYmxlcyBjdWFsaXRhdGl2YXMgY2xhc2lmaWNhZG9yYXMgb2ZyZWNlbiB1bmEgdmFsaW9zYSBwZXJzcGVjdGl2YSBzb2JyZSBsYXMgZGlmZXJlbmNpYXMgeSBzaW1pbGl0dWRlcyBlbnRyZSBncnVwb3MuIEVuIGVzdGUgZXN0dWRpbywgbm9zIGVuZm9jYXJlbW9zIGVuIHVuYSDDum5pY2EgdmFyaWFibGUgY3VhbGl0YXRpdmEgY2xhc2lmaWNhZG9yYTogImNvdW50cnkiLCBxdWUgbm9zIHBlcm1pdGlyw6EgZXhwbG9yYXIgdW4gY29uanVudG8gZGl2ZXJzbyBkZSBuYWNpb25lcy4gQSB0cmF2w6lzIGRlIGxhIGFwbGljYWNpw7NuIGRlIGRpdmVyc2FzIHBydWViYXMgZGUgQW7DoWxpc2lzIGRlIENvbXBvbmVudGVzIE3Dumx0aXBsZXMgKEFDTSksIGJpdHBsbyBBQ00sIGNhbGlkYWQgZGUgcmVwcmVzZW50YWNpb25lcywgY29udHJpYnVjaW9uZXMgeSBiaXRwbG8gZGUgY29udHJpYnVjaW9uZXMsIGJ1c2NhcmVtb3MgZGVzZW50cmHDsWFyIHBhdHJvbmVzIHNpZ25pZmljYXRpdm9zIGVuIGPDs21vIGNhZGEgcGHDrXMgc2UgcHJlc2VudGEgeSBjb250cmlidXllIGEgc3UgcmVzcGVjdGl2byDDoW1iaXRvLiBFc3RlIGVuZm9xdWUgbm9zIHBlcm1pdGlyw6EgaWRlbnRpZmljYXIgdmFyaWFjaW9uZXMgZW50cmUgbG9zIHBhw61zZXMuDQoNCkFsIHByb2Z1bmRpemFyIGVuIGVsIGFuw6FsaXNpcyBkZSBsYSB2YXJpYWJsZSAiY291bnRyeSIsIHNlIHJldmVsYSBsYSBjb21wbGVqaWRhZCBkZSBsYXMgcHJ1ZWJhcywgY29tbyBlbCBBbsOhbGlzaXMgZGUgQ29tcG9uZW50ZXMgTcO6bHRpcGxlcyAoQUNNKSB5IGVsIGJpdHBsbyBBQ00sIG5vcyBwZXJtaXRlbiB2aXN1YWxpemFyIHkgY29tcHJlbmRlciBjw7NtbyBjYWRhIHBhw61zIHNlIHBvc2ljaW9uYSBlbiByZWxhY2nDs24gY29uIGxhcyBtw6l0cmljYXMgZGUgY2FsaWRhZCBkZSByZXByZXNlbnRhY2nDs24geSBjb250cmlidWNpb25lcy4gQSB0cmF2w6lzIGRlbCBhbsOhbGlzaXMgZGUgZXN0YXMgdmFyaWFibGVzLCBlbWVyZ2VuIHBhdHJvbmVzIHF1ZSByZWZsZWphbiBsYSBkaXZlcnNpZGFkIGVuIGxhIGZvcm1hIGVuIHF1ZSBsb3MgcGHDrXNlcyBwcmVzZW50YW4gc3VzIGRhdG9zLCB0YW1iacOpbiBsYSB2YXJpYWJpbGlkYWQgDQoqKmNvbmNsdXNpb24qKg0KDQpBQ006IExhIHRhYmxhIGF5dWRhIGEgZW50ZW5kZXIgcXXDqSBjYW50aWRhZCBkZSBpbmZvcm1hY2nDs24gKHZhcmlhbnphKSBzZSByZXRpZW5lIGFsIHJlZHVjaXIgbGEgZGltZW5zaW9uYWxpZGFkIGRlIGxvcyBkYXRvcyB1c2FuZG8gQUNQLiBTZSBwdWVkZSBvYnNlcnZhciBxdWUgbGEgcGFydGUgZGUgbGEgdmFyaWFuemEgbWFzIGFsdGEgc2UgY29uY2VudHJhIGVuIGVsIHByaW1lIGNhbXBvIChkaW0gMSwgcHJpbmNpcGFsbWVudGUpLiBMb3Mgw7psdGltb3MgY29tcG9uZW50ZXMgcHJpbmNpcGFsZXMgY29udHJpYnV5ZW4gbXV5IHBvY28gYSBsYSB2YXJpYW56YSB0b3RhbC4gRXN0byBzdWdpZXJlIHF1ZSBsYSByZWR1Y2Npw7NuIGRlIGxhIGRpbWVuc2lvbmFsaWRhZCBhIHVuIG7Dum1lcm8gbWVub3IgZGUgY29tcG9uZW50ZXMgcHJpbmNpcGFsZXMsIG1hbnRlbmllbmRvIHVuYSBhbHRhIHByb3BvcmNpw7NuIGRlIGxhIHZhcmlhbnphLCBwb2Ryw61hIHNlciBwb3NpYmxlIHNpbiB1bmEgcMOpcmRpZGEgc2lnbmlmaWNhdGl2YSBkZSBpbmZvcm1hY2nDs24uDQpFbCBiaXBsb3QgZGVsIEFuw6FsaXNpcyBkZSBDb21wb25lbnRlcyBNw7psdGlwbGVzIChBQ00pIG9mcmVjZSB1bmEgcmVwcmVzZW50YWNpw7NuIHZpc3VhbCBjbGFyYSBkZSBsYXMgaW50ZXJyZWxhY2lvbmVzIGVudHJlIGxhcyBkaXZlcnNhcyBvYnNlcnZhY2lvbmVzIChsYXMgY2luY28gdmFyaWFibGVzKSB5IGxhIHZhcmlhYmxlIGNhdGVnw7NyaWNhICJjb3VudHJ5Ii4gQWwgYW5hbGl6YXIgbGEgZGlzdHJpYnVjacOzbiBkZSBsb3MgcHVudG9zIHkgbG9zIHZlY3RvcmVzIGVuIGxhIGdyw6FmaWNhLCBzZSBwdWVkZW4gaWRlbnRpZmljYXIgcGF0cm9uZXMgcmVsZXZhbnRlcyBlbiBsb3MgZGF0b3MuIExvcyBwdW50b3MgcXVlIHNlIGFncnVwYW4gaW5kaWNhbiBxdWUgY29tcGFydGVuIGNhcmFjdGVyw61zdGljYXMgY29tdW5lcywgbWllbnRyYXMgcXVlIGxhIGRpcmVjY2nDs24geSBsb25naXR1ZCBkZSBsb3MgdmVjdG9yZXMgcmV2ZWxhbiBjdcOhbGVzIHZhcmlhYmxlcyBlamVyY2VuIG1heW9yIGluZmx1ZW5jaWEuIFVuIHZlY3RvciBsYXJnbyBxdWUgc2Ugb3JpZW50YSBoYWNpYSB1biBncnVwbyBwYXJ0aWN1bGFyIGRlIHB1bnRvcyBzdWdpZXJlIHF1ZSBlc2EgdmFyaWFibGUgZGVzZW1wZcOxYSB1biBwYXBlbCBzaWduaWZpY2F0aXZvIGVuIGVsIGFuw6FsaXNpcy4NCg0KTGEgY2FsaWRhZCBkZSByZXByZXNlbnRhY2nDs24gc2UgbWFuaWZpZXN0YSBlbiB1biBwbGFubyBxdWUgaWx1c3RyYSBsYXMgcmVsYWNpb25lcyBlbnRyZSBsYXMgdmFyaWFibGVzLCB1dGlsaXphbmRvIHVuIGNvbmNlcHRvIGRlIHByb3hpbWlkYWQgcGFyYSBkZXN0YWNhciBjw7NtbyBzZSBhZ3J1cGFuIGxvcyBub21icmVzIGRlIGxhIHZhcmlhYmxlICJjb3VudHJ5IiBqdW50byBjb24gbG9zIGRlICJjb2RlX3R5cGUiLiBFc3RhIHZpc3VhbGl6YWNpw7NuIHBlcm1pdGUgb2JzZXJ2YXIgbGEgY2VyY2Fuw61hIGVudHJlIGxvcyBkaWZlcmVudGVzIGdydXBvcywgcmV2ZWxhbmRvIGVsIGdyYWRvIGRlIHJlbGFjacOzbiBxdWUgZXhpc3RlIGVudHJlIGVzdGFzIHZhcmlhYmxlcyBjdWFsaXRhdGl2YXMuIEN1YW50byBtw6FzIHByw7N4aW1vcyBlc3TDqW4gbG9zIG5vbWJyZXMgZW4gZWwgZ3LDoWZpY28sIG1heW9yIHNlcsOhIGxhIHNpbWlsaXR1ZCBlbiBzdXMgY2FyYWN0ZXLDrXN0aWNhcyB5IGNvbXBvcnRhbWllbnRvcy4gQXPDrSwgZXN0YSByZXByZXNlbnRhY2nDs24gbm8gc29sbyBmYWNpbGl0YSBsYSBpZGVudGlmaWNhY2nDs24gZGUgcGF0cm9uZXMgeSBhZ3J1cGFjaW9uZXMgc2lnbmlmaWNhdGl2YXMsIHNpbm8gcXVlIHRhbWJpw6luIHByb3BvcmNpb25hIHVuYSBjb21wcmVuc2nDs24gbcOhcyBjbGFyYSBkZSBjw7NtbyBpbnRlcmFjdMO6YW4gZXN0YXMgdmFyaWFibGVzIGVuIGVsIGNvbnRleHRvIGRlbCBhbsOhbGlzaXMuDQpFbCBncsOhZmljbyBkZSBjb250cmlidWNpb25lcyBkZWwgQW7DoWxpc2lzIGRlIENvbXBvbmVudGVzIE3Dumx0aXBsZXMgKEFDTSkgZXMgc8O6cGVyIMO6dGlsIHBhcmEgZW50ZW5kZXIgcXXDqSB2YXJpYWJsZXMgdGllbmVuIG3DoXMgcGVzbyBlbiBsYSBwcmltZXJhIGRpbWVuc2nDs24gZGVsIGFuw6FsaXNpcy4gQsOhc2ljYW1lbnRlLCB0ZSBtdWVzdHJhIGN1w6FsZXMgZmFjdG9yZXMgcmVhbG1lbnRlIGltcG9ydGFuIHkgY8OzbW8gZXN0w6FuIHJlbGFjaW9uYWRvcyBlbnRyZSBzw60uIEVzdG8gYXl1ZGEgYSB0ZW5lciB1bmEgaWRlYSBtw6FzIGNsYXJhIGRlIHF1w6kgZXN0w6EgaW5mbHV5ZW5kbyBtw6FzIGVuIGxvcyBkYXRvcyB5LCBhIHBhcnRpciBkZSBhaMOtLCBkZWNpZGlyIGVuIHF1w6kgZW5mb2NhcnNlLiBFcyB1bmEgaGVycmFtaWVudGEgbXV5IHByw6FjdGljYSBwb3JxdWUgdGUgcGVybWl0ZSBwcmlvcml6YXIgbG8gaW1wb3J0YW50ZSB5IHBsYW5lYXIgZXN0cmF0ZWdpYXMgbyBpbnZlc3RpZ2FjaW9uZXMgYmFzYWRhcyBlbiBsbyBxdWUgcmVhbG1lbnRlIGVzdMOhIG1vdmllbmRvIGxvcyByZXN1bHRhZG9zLg0KQml0cGxvIGRlIGNvbnRyaWJ1Y2lvbmVzOiBFc3RhIHBlc3Rhw7FhIHJlZmxlamEgYXNwZWN0b3Mgc2ltaWxhcmVzIGEgbG9zIHByZXNlbnRhZG9zIGVuIGxhIHNlY2Npw7NuIGRlIGNhbGlkYWQgZGUgcmVwcmVzZW50YWNpw7NuLCB5YSBxdWUgdGFtYmnDqW4gaWx1c3RyYSBsYXMgY29udHJpYnVjaW9uZXMgeSBsYXMgcmVsYWNpb25lcyBlbnRyZSBsYXMgdmFyaWFibGVzIGRlbnRybyBkZWwgY29uanVudG8gZGUgZGF0b3MuIEFsIGFuYWxpemFyIGVzdGEgaW5mb3JtYWNpw7NuLCBzZSBwdWVkZSBhcHJlY2lhciBjw7NtbyBjYWRhIHZhcmlhYmxlIGludGVyYWN0w7phIGNvbiBsYXMgZGVtw6FzIHkgcXXDqSB0YW4gaW5mbHV5ZW50ZXMgc29uIGVuIGVsIGNvbnRleHRvIGdlbmVyYWwgZGVsIGFuw6FsaXNpcy4gRXN0YSB2aXN1YWxpemFjacOzbiBwZXJtaXRlIGlkZW50aWZpY2FyIG5vIHNvbG8gbGEgZnVlcnphIGRlIGVzdGFzIHJlbGFjaW9uZXMsIHNpbm8gdGFtYmnDqW4gc3UgcmVsZXZhbmNpYSBlbiBsYSBpbnRlcnByZXRhY2nDs24gZGUgbG9zIGRhdG9zLg0KDQoNCiMjIyMgUmVzdW1lbiBWYXJpYWJsZXMgQ3VhbnRpdGF0aXZhcyANCmBgYHtyIFJlc3VtZW5fVmFyaWFibGVzX0N1YW50aXRhdGl2YXMsZmlnLmFsaWduPSdjZW50ZXInfQ0KDQpzdW1tYXJ5KERhdGFzZXQkVm90ZXMpDQpzdW1tYXJ5KERhdGFzZXQkQ29tbWVudHMpDQpzdW1tYXJ5KERhdGFzZXQkVmlld3MpDQpzdW1tYXJ5KERhdGFzZXQkRm9ya3MpDQoNCmBgYA0KDQojIyMjICoqUmVzdW1lbiBWYXJpYWJsZXMgQ3VhbGl0YXRpdmFzKiogey50YWJzZXQgIC50YWJzZXQtcGlsbHN9IA0KDQojIyMjIyBDb2RlX1R5cGUNCmBgYHtyIENvZGVfVHlwZSwgZmlnLmFsaWduPSdjZW50ZXInfQ0KDQp0YWJsZShEYXRhc2V0JENvZGVfVHlwZSkNCnByb3AudGFibGUodGFibGUoRGF0YXNldCRDb2RlX1R5cGUpKQ0KYmFycGxvdCh0YWJsZShEYXRhc2V0JENvZGVfVHlwZSkpDQoNCmBgYA0KDQojIyMjIyBMYW5ndWFnZQ0KYGBge3IgTGFuZ3VhZ2UsIGZpZy5hbGlnbj0nY2VudGVyJ30NCnRhYmxlKERhdGFzZXQkTGFuZ3VhZ2UpDQpwcm9wLnRhYmxlKHRhYmxlKERhdGFzZXQkTGFuZ3VhZ2UpKQ0KYmFycGxvdCh0YWJsZShEYXRhc2V0JExhbmd1YWdlKSkNCmBgYA0KDQojIyMjIyBDb3VudHJ5DQpgYGB7ciBDb3VudHJ5LCBmaWcuYWxpZ249J2NlbnRlcid9DQp0YWJsZShEYXRhc2V0JENvdW50cnkpDQpwcm9wLnRhYmxlKHRhYmxlKERhdGFzZXQkQ291bnRyeSkpDQpiYXJwbG90KHRhYmxlKERhdGFzZXQkQ291bnRyeSkpDQoNCmBgYA0KDQojIyMjIERpYWdyYW1hcyBkZSBEaXNwZXJzacOzbiBWYXJpYWJsZXMgQ3VhbnRpdGF0aXZhcyB7LnRhYnNldCAgLnRhYnNldC1waWxsc30NCmBgYHtyIERpYWdyYW1hc19kZV9EaXNwZXJzacOzbl9WYXJpYWJsZXNfQ3VhbnRpdGF0aXZhcywgZmlnLmFsaWduPSdjZW50ZXInfQ0KDQpwYWlycyh+Q29tbWVudHMgKyBWaWV3cyArIFZvdGVzICsgRm9ya3MsIGRhdGEgPSBEYXRhc2V0X011ZXN0cmVhZG8zKQ0KYGBgDQoNCiMjIyAqKkZvcm11bGFjacOzbiBkZWwgbW9kZWxvIGRlIFJMTSBlbnRyZSBsYXMgdmFyaWFibGVzIGRlIGVzdHVkaW8qKiB7LnRhYnNldCAgLnRhYnNldC1waWxsc30NCg0KRW4gZWwgcHJlc2VudGUgZXN0dWRpbywgc2UgYW5hbGl6YXLDoSB1biBjb25qdW50byBkZSBkYXRvcyBxdWUgaW5jbHV5ZSB2YXJpYWJsZXMgY3VhbnRpdGF0aXZhcyB5IHZhcmlhYmxlcyBjdWFsaXRhdGl2YXMgY2xhc2lmaWNhZG9yYXMuIEVsIG9iamV0aXZvIHByaW5jaXBhbCBlcyByZWFsaXphciB1biBhbsOhbGlzaXMgZGVzY3JpcHRpdm8geSBhcGxpY2FyIHVuIGFuw6FsaXNpcyBkZSB2YXJpYW56YSAoQU5PVkEpIHBhcmEgZWwgbW9kZWxvIGRlIHJlZ3Jlc2nDs24gbGluZWFsIG3Dumx0aXBsZSAoUkxNKSB0b3RhbC4gU2UgY2FsY3VsYXLDoW4gbG9zIGNvZWZpY2llbnRlcyBkZWwgbW9kZWxvIFJMTSB0b3RhbCBwYXJhIGNvbXByZW5kZXIgbGEgcmVsYWNpw7NuIGVudHJlIGxhcyB2YXJpYWJsZXMgeSwgcG9zdGVyaW9ybWVudGUsIHNlIGRlcHVyYXLDoSBlbCBtb2RlbG8gcGFyYSBvYnRlbmVyIGxvcyBjb2VmaWNpZW50ZXMgZGVsIG1vZGVsbyBSTE0gYWp1c3RhZG8uIEVzdGUgZW5mb3F1ZSBwZXJtaXRpcsOhIGlkZW50aWZpY2FyIGxvcyBmYWN0b3JlcyBzaWduaWZpY2F0aXZvcyBxdWUgaW5mbHV5ZW4gZW4gbGEgdmFyaWFibGUgZGVwZW5kaWVudGUgeSBwcm9wb3JjaW9uYXLDoSB1bmEgdmlzacOzbiBjbGFyYSBkZSBsYSBlc3RydWN0dXJhIGRlbCBjb25qdW50byBkZSBkYXRvcy4NCg0KDQpFbCBhbsOhbGlzaXMgZGUgbG9zIGRhdG9zIHNlIGNlbnRyYXLDoSBlbiBsYXMgdmFyaWFibGVzIGN1YW50aXRhdGl2YXMsIGxhcyBjdWFsZXMgcGVybWl0aXLDoW4gZXZhbHVhciBudW3DqXJpY2FtZW50ZSBsYXMgcmVsYWNpb25lcyBleGlzdGVudGVzIGVudHJlIGxhcyBkaXN0aW50YXMgb2JzZXJ2YWNpb25lcy4gQSB0cmF2w6lzIGRlbCBtb2RlbG8gZGUgcmVncmVzacOzbiBsaW5lYWwgbcO6bHRpcGxlIChSTE0pIHRvdGFsLCBzZSBsbGV2YXLDoSBhIGNhYm8gdW4gYW7DoWxpc2lzIGRlIHZhcmlhbnphIChBTk9WQSkgcXVlIGZhY2lsaXRhcsOhIGxhIGlkZW50aWZpY2FjacOzbiBkZSBkaWZlcmVuY2lhcyBzaWduaWZpY2F0aXZhcyBlbnRyZSBsb3MgZ3J1cG9zIGRlZmluaWRvcyBwb3IgbGFzIHZhcmlhYmxlcyBjdWFsaXRhdGl2YXMgY2xhc2lmaWNhZG9yYXMuIEVzdGUgcHJvY2VzbyBubyBzb2xvIHBlcm1pdGlyw6EgY2FsY3VsYXIgbG9zIGNvZWZpY2llbnRlcyBkZWwgbW9kZWxvIFJMTSB0b3RhbCwgc2lubyBxdWUgdGFtYmnDqW4gc2UgcHJvY2VkZXLDoSBhIGRlcHVyYXIgZWwgbW9kZWxvIHBhcmEgb3B0aW1pemFyIHN1IHByZWNpc2nDs24geSByZWxldmFuY2lhLiBBbCBvYnRlbmVyIGxvcyBjb2VmaWNpZW50ZXMgZGVsIG1vZGVsbyBSTE0gZGVwdXJhZG8sIHNlIGVzcGVyYSBwb2RlciBvZnJlY2VyIHVuYSBpbnRlcnByZXRhY2nDs24gbcOhcyBjbGFyYSB5IGZ1bmRhbWVudGFkYSBkZSBjw7NtbyBsYXMgdmFyaWFibGVzIGluZGVwZW5kaWVudGVzIGltcGFjdGFuIGVuIGxhIHZhcmlhYmxlIGRlcGVuZGllbnRlIGVzdHVkaWFkYS4NCg0KKipjb25jbHVzaW9uKioNCg0KUmVzdW1lbiB5IGFub3ZhOiBFc3RlIG11ZXN0cmEgbG9zIGNvZWZpY2llbnRlcyB5IHF1ZSBmYWN0b3JlcyBzb24gc2lnbmlmaWNhdGl2YXMgcGFyYSBzZWd1aXIgZWwgZXN0dWRpbywgdGVuaWVuZG8gZW4gY3VlbnRhIHF1ZSBsYXMgdmFyaWFibGVzIGNhdWFudGl0YXRpdmFzIHkgbGFzIGN1YWxpdGF0aXZhcyBwYXJhIHRvbWFybGFzIGVuIGN1ZW50ZSBsYXMgZGViZSBjb252ZXJ0aXIgZW4gZmFjdG9yIA0KDQpDb3JmaWNpZW50ZXMgZGVsIG1vZGVsbyBSTE06DQogRWwgbsO6bWVybyBkZSBjb21lbnRhcmlvcyAoQ29tbWVudHMpIHBhcmVjZSBzZXIgZWwgZmFjdG9yIHF1ZSBtw6FzIGNvbnRyaWJ1eWUgcG9zaXRpdmFtZW50ZSBhIGxvcyB2b3Rvcy4gVW4gaW5jcmVtZW50byBkZSB1bmEgdW5pZGFkIGVuIENvbW1lbnRzIGVzdMOhIGFzb2NpYWRvIGNvbiB1biBhdW1lbnRvIHByb21lZGlvIGRlIDEuOTA0ODU4OTUgZW4gVm90ZXMuDQpBbGd1bmFzIGNhdGVnb3LDrWFzIGVzcGVjw61maWNhcyBkZSBDb3VudHJ5IHkgQ29kZV9UeXBlIHBhcmVjZW4gaW5mbHVpciBuZWdhdGl2YW1lbnRlIGVuIGxhIGNhbnRpZGFkIGRlIHZvdG9zLCBsbyBxdWUgcG9kcsOtYSBpbmRpY2FyIHNlc2dvcyBlbiBsYSBhdWRpZW5jaWEuDQoNCg0KDQpDb2VmaWNpZW50ZXMgZGVsIG1vZGVsbyByZWR1Y2lkbw0KLSBDb21tZW50cyB5IFZpZXdzIHRpZW5lbiB1biBlZmVjdG8gcG9zaXRpdm8gZW4gbG9zIHZvdG9zLCBzaWVuZG8gQ29tbWVudHMgZWwgZmFjdG9yIGNvbiBtYXlvciBpbXBhY3RvLg0KLSBGb3JrcyB0aWVuZSB1biBlZmVjdG8gbmVnYXRpdm8gZW4gbG9zIHZvdG9zLCBhdW5xdWUgZWwgaW1wYWN0byBlcyBwZXF1ZcOxby4NCi0gRWwgdGlwbyBkZSBjw7NkaWdvIChDb2RlX1R5cGUpIGp1ZWdhIHVuIHBhcGVsIGltcG9ydGFudGUsIHkgc2VyIGRlbCB0aXBvIFNjcmlwdCByZWR1Y2Ugc2lnbmlmaWNhdGl2YW1lbnRlIGxvcyB2b3RvcyBlbiBjb21wYXJhY2nDs24gY29uIGVsIG5pdmVsIGRlIHJlZmVyZW5jaWEuDQoNCiMjIyMgUmVzdW1lbiB5IEFOT1ZBIGRlbCBNb2RlbG8gUkxNIFRvdGFsDQpgYGB7ciBSZXN1bWVuX3lfQU5PVkFfZGVsX01vZGVsb19STE1fVG90YWwsIGZpZy5hbGlnbj0nY2VudGVyJ30NCg0Kc3VtbWFyeShsbShEYXRhc2V0JFZvdGVzfkRhdGFzZXQkQ29tbWVudHMrRGF0YXNldCRWaWV3cytEYXRhc2V0JEZvcmtzK2FzLmZhY3RvcihEYXRhc2V0JENvZGVfVHlwZSkrYXMuZmFjdG9yKERhdGFzZXQkTGFuZ3VhZ2UpK2FzLmZhY3RvcihEYXRhc2V0JENvdW50cnkpKSkNCg0KYGBgDQoNCiMjIyMgQ29lZmljaWVudGVzIGRlbCBNb2RlbG8gUkxNIFRvdGFsDQpgYGB7ciBDb2VmaWNpZW50ZXNfZGVsX01vZGVsb19STE1fVG90YWwsIGZpZy5hbGlnbj0nY2VudGVyJ30NCmNvZWZmaWNpZW50cyhsbShEYXRhc2V0JFZvdGVzfkRhdGFzZXQkQ29tbWVudHMrRGF0YXNldCRWaWV3cytEYXRhc2V0JEZvcmtzK2FzLmZhY3RvcihEYXRhc2V0JENvZGVfVHlwZSkrYXMuZmFjdG9yKERhdGFzZXQkTGFuZ3VhZ2UpK2FzLmZhY3RvcihEYXRhc2V0JENvdW50cnkpKSkNCmBgYA0KDQojIyMjIENvZWZpY2llbnRlcyBkZWwgTW9kZWxvIFJMTSBSZWR1Y2lkbw0KYGBge3IgQ29lZmljaWVudGVzX2RlbF9Nb2RlbG9fUkxNX1JlZHVjaWRvLCBmaWcuYWxpZ249J2NlbnRlcid9DQoNCmNvZWZmaWNpZW50cyhsbShEYXRhc2V0JFZvdGVzfkRhdGFzZXQkQ29tbWVudHMrRGF0YXNldCRWaWV3cytEYXRhc2V0JEZvcmtzK2FzLmZhY3RvcihEYXRhc2V0JENvZGVfVHlwZSkpKQ0KDQpgYGANCg0KIyMjICoqQW7DoWxpc2lzIGRlbCBtb2RlbG8gUkxNKiogey50YWJzZXQgIC50YWJzZXQtcGlsbHN9DQoNCkVuIGVzdGUgZXN0dWRpbywgc2UgYW5hbGl6YXLDoSB1biBjb25qdW50byBkZSBkYXRvcyBxdWUgaW5jbHV5ZSB2YXJpYWJsZXMgY3VhbnRpdGF0aXZhcyB5IHZhcmlhYmxlcyBjdWFsaXRhdGl2YXMgY2xhc2lmaWNhZG9yYXMsIGNvbiBlbCBvYmpldGl2byBkZSBpZGVudGlmaWNhciBlbCBtZWpvciBtb2RlbG8gbWVkaWFudGUgdW4gcHJvY2VzbyBpdGVyYXRpdm8gYmFzYWRvIGVuIGVsIMONbmRpY2UgZGUgQ2FsaWRhZCBUb3RhbCAoSUNUKS4gU2UgZXZhbHVhcsOhbiBsYXMgYm9uZGFkZXMgZGVsIGVzdHVkaW8gc2lnbmlmaWNhdGl2bywgYXPDrSBjb21vIGxvcyBjcml0ZXJpb3MgZGUgaW5mb3JtYWNpw7NuIHBhcmEgbGEgY29tcGFyYWNpw7NuIGRlIG1vZGVsb3MuIEVzdGUgZW5mb3F1ZSBwZXJtaXRpcsOhIHNlbGVjY2lvbmFyIGVsIG1vZGVsbyBxdWUgbm8gc29sbyBzZSBhanVzdGUgYWRlY3VhZGFtZW50ZSBhIGxvcyBkYXRvcywgc2lubyBxdWUgdGFtYmnDqW4gb2ZyZXpjYSB1bmEgaW50ZXJwcmV0YWNpw7NuIGNsYXJhIHkgZnVuZGFtZW50YWRhIGRlIGxhcyByZWxhY2lvbmVzIGVudHJlIGxhcyB2YXJpYWJsZXMuIEEgdHJhdsOpcyBkZSBlc3RlIGFuw6FsaXNpcywgc2UgZXNwZXJhIGNvbnRyaWJ1aXIgYSB1bmEgY29tcHJlbnNpw7NuIG3DoXMgcHJlY2lzYSBkZSBsb3MgZmFjdG9yZXMgcXVlIGluZmx1eWVuIGVuIGxhIHZhcmlhYmxlIGRlcGVuZGllbnRlLCBvcHRpbWl6YW5kbyBhc8OtIGxhIGludGVycHJldGFjacOzbiBkZSBsb3MgcmVzdWx0YWRvcy4NCg0KRWwgYW7DoWxpc2lzIHNlIGNlbnRyYXLDoSBlbiBzZWxlY2Npb25hciBlbCBtb2RlbG8gbcOhcyBhZGVjdWFkbyB1dGlsaXphbmRvIMO6bmljYW1lbnRlIHZhcmlhYmxlcyBjdWFudGl0YXRpdmFzIHkgY3VhbGl0YXRpdmFzIGNsYXNpZmljYWRvcmFzLiBQYXJhIGVsbG8sIHNlIGVtcGxlYXLDoSB1biBlbmZvcXVlIGl0ZXJhdGl2byBiYXNhZG8gZW4gZWwgw41uZGljZSBkZSBDYWxpZGFkIFRvdGFsIChJQ1QpLCBldmFsdWFuZG8gZGlzdGludGFzIG9wY2lvbmVzIGRlIG1vZGVsYWRvIHBhcmEgaWRlbnRpZmljYXIgbGEgcXVlIG9mcmV6Y2EgZWwgbWVqb3IgZXF1aWxpYnJpbyBlbnRyZSBhanVzdGUgeSByZWxldmFuY2lhIGVzdGFkw61zdGljYS4gQWRlbcOhcywgc2UgdXRpbGl6YXLDoW4gY3JpdGVyaW9zIGRlIGluZm9ybWFjacOzbiBwYXJhIGNvbXBhcmFyIGxvcyBtb2RlbG9zLCBhc2VndXJhbmRvIHVuYSBldmFsdWFjacOzbiBjb21wbGV0YSB5IG9iamV0aXZhLiBFc3RlIHByb2NlZGltaWVudG8gbm8gc29sbyBwZXJtaXRpcsOhIHVuYSBzZWxlY2Npw7NuIHPDs2xpZGEgZGVsIG1vZGVsbywgc2lubyBxdWUgdGFtYmnDqW4gYXBvcnRhcsOhIGluZm9ybWFjacOzbiB2YWxpb3NhIHNvYnJlIGPDs21vIGxhcyB2YXJpYWJsZXMgc2UgcmVsYWNpb25hbiBlbnRyZSBzw60geSBjw7NtbyBpbmZsdXllbiBlbiBsYSB2YXJpYWJsZSBkZXBlbmRpZW50ZS4NCg0KKipjb25jbHVzaW9uKioNCg0KKipNZWpvciBtb2RlbG8gaXRlcmFkbyoqDQoNCmVsIG1vZGVsbyBmaW5hbCByZWNvbWVuZGFkbyBwb3IgZXN0ZSBhbsOhbGlzaXMgc3RlcHdpc2UsIGJhc2FkbyBlbiBlbCBBSUMsIGVzIGFxdWVsIHF1ZSBpbmNsdXllIERhdGFzZXQkQ29tbWVudHMsIERhdGFzZXQkVmlld3MsIERhdGFzZXQkRm9ya3MsIERhdGFzZXQkQ29kZV9UeXBlIHkgRGF0YXNldCRMYW5ndWFnZSBjb21vIHByZWRpY3RvcmVzIGRlIERhdGFzZXQkVm90ZXMsIGV4Y2x1eWVuZG8gRGF0YXNldCRDb3VudHJ5LiAgTGEgdGFibGEgbXVlc3RyYSBlbCBTdW0gb2YgU3F1YXJlcywgUlNTIHkgQUlDIHBhcmEgY2FkYSBwYXNvIHkgbGEgaW5jbHVzacOzbi9leGNsdXNpw7NuIGRlIGNhZGEgdmFyaWFibGUuIA0KZXN0ZSBtb2RlbG8gc3VnaWVyZSBxdWUgbWllbnRyYXMgbcOhcyBjb21lbnRhcmlvcyBzZSB0ZW5nYW4sIG1heW9yIHNlcsOhIGxhIHByZWRpY2Npw7NuIHBvc2l0aXZhIHNvYnJlIGxhIHZhcmlhYmxlIGRlcGVuZGllbnRlLCBwZXJvIGNpZXJ0b3MgbGVuZ3VhamVzIHkgdGlwb3MgZGUgY8OzZGlnbyB0aWVuZW4gZWZlY3RvcyBuZWdhdGl2b3Mgc2lnbmlmaWNhdGl2b3Mgc29icmUgZWxsYSwgc2llbmRvIFIgeSBTY3JpcHQgbG9zIHF1ZSBtw6FzIHJlZHVjZW4gc3UgdmFsb3IgZXNwZXJhZG8uDQoNCioqQm9uZGFkZXMgZGUgYWp1c3RlcyoqDQoNCkxvcyByZXN1bHRhZG9zIHN1Z2llcmVuIHF1ZSBleGlzdGUgdW5hIHJlbGFjacOzbiBzaWduaWZpY2F0aXZhIGVudHJlIGxhcyB2YXJpYWJsZXMgaW5kZXBlbmRpZW50ZXMgeSBsYSB2YXJpYWJsZSBkZXBlbmRpZW50ZSBhbmFsaXphZGEuIEVuIHBhcnRpY3VsYXIsIGxhIGNhbnRpZGFkIGRlIGNvbWVudGFyaW9zIHkgdm90b3MgcGFyZWNlbiBpbmZsdWlyIGVuIGVsIG1vZGVsbyBkZSBtYW5lcmEgbm90YWJsZS4gQWRlbcOhcywgZWwgdXNvIGRlIGRpZmVyZW50ZXMgbGVuZ3VhamVzIGRlIHByb2dyYW1hY2nDs24geSBlc3RydWN0dXJhcyBkZSBiYXNlIGRlIGRhdG9zIHRhbWJpw6luIHNlIGNvbnNpZGVyYSBlbiBsYSBldmFsdWFjacOzbiBkZWwgbW9kZWxvLCBsbyBxdWUgaW5kaWNhIHF1ZSBsYXMgcHJlZmVyZW5jaWFzIHkgZWxlY2Npb25lcyBkZSBsZW5ndWFqZSBwdWVkZW4gdGVuZXIgdW4gaW1wYWN0byBlbiBlbCBjb21wb3J0YW1pZW50byBvYnNlcnZhZG8gZW4gbGEgdmFyaWFibGUgZGVwZW5kaWVudGUuIFNlIHJlY29taWVuZGEgdW4gYW7DoWxpc2lzIGFkaWNpb25hbCBwYXJhIGV4cGxvcmFyIGVzdGFzIHJlbGFjaW9uZXMgZW4gcHJvZnVuZGlkYWQgeSBjb25zaWRlcmFyIG90cm9zIGZhY3RvcmVzIHF1ZSBwb2Ryw61hbiBpbmZsdWlyIGVuIGxvcyByZXN1bHRhZG9zLg0KQmFzw6FuZG9ub3MgZW4gbG9zIHZhbG9yZXMgQUlDIHkgQklDIHByZXNlbnRhZG9zIHBhcmEgdHJlcyBtb2RlbG9zIGRpZmVyZW50ZXMgKG1vZGVsb19STE1fVE9UQUwsIG1vZGVsb19STE1fUkVEVUNJRE8geSBtb2RlbG9fSXRlcmFkb19TVEVQKSwgc2Ugb2JzZXJ2YSBxdWUgZWwgbW9kZWxvX1JMTV9UT1RBTCBwcmVzZW50YSBsb3MgdmFsb3JlcyBBSUMgeSBCSUMgbcOhcyBiYWpvcy4gIEVzdG8gc3VnaWVyZSBxdWUsIHNlZ8O6biBlc3RvcyBjcml0ZXJpb3MgZGUgaW5mb3JtYWNpw7NuLCBlbCBtb2RlbG9fUkxNX1RPVEFMIGVzIGVsIG1vZGVsbyBxdWUgbWVqb3Igc2UgYWp1c3RhIGEgbG9zIGRhdG9zLCBwZW5hbGl6YW5kbyBsYSBjb21wbGVqaWRhZCBkZWwgbW9kZWxvLiAgQSBwZXNhciBkZSBxdWUgZWwgbW9kZWxvX0l0ZXJhZG9fU1RFUCB0aWVuZSB1biBBSUMgbGlnZXJhbWVudGUgaW5mZXJpb3IgYWwgbW9kZWxvX1JMTV9SRURVQ0lETywgYW1ib3MgcHJlc2VudGFuIHZhbG9yZXMgQUlDIHkgQklDIHNpZ25pZmljYXRpdmFtZW50ZSBzdXBlcmlvcmVzIGFsIG1vZGVsb19STE1fVE9UQUwuICBQb3IgbG8gdGFudG8sIHNlIHJlY29taWVuZGEgZWwgbW9kZWxvX1JMTV9UT1RBTCBjb21vIGVsIG1lam9yIG1vZGVsbyBlbnRyZSBsb3MgdHJlcyBldmFsdWFkb3MuDQoNCiMjIyMgTWVqb3IgTW9kZWxvIEl0ZXJhZG8gc2Vnw7puIEFJQw0KYGBge3IgTWVqb3JfTW9kZWxvX0l0ZXJhZG9fc2Vnw7puX0FJQywgZmlnLmFsaWduPSdjZW50ZXInfQ0KDQptb2RlbG9fSXRlcmFkb19TVEVQID0gc3RlcChsbShEYXRhc2V0JFZvdGVzfkRhdGFzZXQkQ29tbWVudHMrRGF0YXNldCRWaWV3cytEYXRhc2V0JEZvcmtzK2FzLmZhY3RvcihEYXRhc2V0JENvZGVfVHlwZSkrYXMuZmFjdG9yKERhdGFzZXQkTGFuZ3VhZ2UpK2FzLmZhY3RvcihEYXRhc2V0JENvdW50cnkpKSkNCmNvZWZmaWNpZW50cyhtb2RlbG9fSXRlcmFkb19TVEVQKQ0KYGBgDQoNCiMjIyMgQm9uZGFkZXMgZGUgQWp1c3RlLCBTaWduaWZpY2FuY2lhcyB5IENyaXRlcmlvcyBkZSBJbmZvcm1hY2nDs24gQ29tcGFyYWRvcw0KYGBge3IgQm9uZGFkZXNfZGVfQWp1c3RlLF9TaWduaWZpY2FuY2lhc195X0NyaXRlcmlvc19kZV9JbmZvcm1hY2nDs25fQ29tcGFyYWRvcywgZmlnLmFsaWduPSdjZW50ZXInfQ0KDQoNCm1vZGVsb19STE1fVE9UQUwgPSBsbShEYXRhc2V0JENvbW1lbnRzfkRhdGFzZXQkVmlld3MrRGF0YXNldCRWb3RlcytEYXRhc2V0JEZvcmtzK2FzLmZhY3RvcihEYXRhc2V0JENvZGVfVHlwZSkrYXMuZmFjdG9yKERhdGFzZXQkTGFuZ3VhZ2UpKQ0KDQptb2RlbG9fUkxNX1JFRFVDSURPID0gbG0oRGF0YXNldCRWb3Rlc35EYXRhc2V0JENvbW1lbnRzK0RhdGFzZXQkVmlld3MrRGF0YXNldCRGb3Jrcythcy5mYWN0b3IoRGF0YXNldCRDb2RlX1R5cGUpKQ0KDQpzdGFyZ2F6ZXIobW9kZWxvX1JMTV9UT1RBTCwgbW9kZWxvX1JMTV9SRURVQ0lETywgbW9kZWxvX0l0ZXJhZG9fU1RFUCwgdHlwZSA9ICJ0ZXh0IiwgZGYgPSBUUlVFKQ0KDQpBSUMobW9kZWxvX1JMTV9UT1RBTCwgbW9kZWxvX1JMTV9SRURVQ0lETywgbW9kZWxvX0l0ZXJhZG9fU1RFUCkNCg0KQklDKG1vZGVsb19STE1fVE9UQUwsIG1vZGVsb19STE1fUkVEVUNJRE8sIG1vZGVsb19JdGVyYWRvX1NURVApDQpgYGANCg0KDQoNCiMjIyAqKjUuNC4gUmVncmVzacOzbiBMb2fDrXN0aWNhIFNpbXBsZSoqIHsudGFic2V0ICAudGFic2V0LXBpbGxzfQ0KDQoNCkVuIGVzdGEgZmFzZSAqKnJlZ3Jlc2nDs24gbG9nw61zdGljYSBzaW1wbGUqKiBzZSBidXNjYSBleGFtaW5hciBsYSByZWxhY2nDs24gZW50cmUgdW5hIHZhcmlhYmxlIGRlcGVuZGllbnRlIGRpY290w7NtaWNhIChiaW5hcmlhKSB5IHVuYSBvIG3DoXMgdmFyaWFibGVzIGluZGVwZW5kaWVudGVzLiBFc3RlIHRpcG8gZGUgYW7DoWxpc2lzIGVzIHBhcnRpY3VsYXJtZW50ZSDDunRpbCBjdWFuZG8gc2UgZGVzZWEgcHJlZGVjaXIgbGEgcHJvYmFiaWxpZGFkIGRlIHF1ZSBvY3VycmEgdW4gZXZlbnRvLCBjb21vIGxhIHByZXNlbmNpYSBvIGF1c2VuY2lhIGRlIHVuYSBjYXJhY3RlcsOtc3RpY2E7IGNvbiBlc3RvIHNlIGJ1c2NhIG1vZGVsYXIgZXN0YSByZWxhY2nDs24gcGFyYSBjb21wcmVuZGVyIGPDs21vIGxhcyB2YXJpYWJsZXMgZGUgZXN0dWRpbyBhZmVjdGFuIGxhcyBwcm9iYWJpbGlkYWRlcyBkZSB1biByZXN1bHRhZG8gZGV0ZXJtaW5hZG8uIEVsIHByb2Nlc28gY29taWVuemEgY29uIHVuIGFuw6FsaXNpcyBlc3RhZMOtc3RpY28gcHJlbGltaW5hciBkZSBsb3MgZGF0b3MsIHF1ZSBpbmNsdXllIGxhIG9idGVuY2nDs24gZGUgcmVzw7ptZW5lcyBkZXNjcmlwdGl2b3MgeSBncsOhZmljb3MuIEEgdHJhdsOpcyBkZSBlc3Rvcywgc2UgZXZhbMO6YSBsYSBkaXN0cmlidWNpw7NuIGRlIGxhcyB2YXJpYWJsZXMgeSBzZSBpZGVudGlmaWNhbiBwb3NpYmxlcyBwcm9ibGVtYXMgZW4gbG9zIGRhdG9zLCBjb21vIHZhbG9yZXMgYXTDrXBpY29zIG8gc2VzZ29zLiANCg0KDQoNClBhcmEgcmVhbGl6YXIgdW5hIGNvbmNsdXNpw7NuIGFkZWN1YWRhIHNvYnJlIGVzdGEgc2VjY2nDs24sIGVzIGltcG9ydGFudGUgY29tcHJlbmRlciBicmV2ZW1lbnRlIGxvcyBwYXNvcyByZWFsaXphZG9zIGVuIGVsIGFuw6FsaXNpcyBkZSAqKlJlZ3Jlc2nDs24gTG9nw61zdGljYSBTaW1wbGUqKi4gRW4gcHJpbWVyIGx1Z2FyLCBzZSBvYnRpZW5lIHVuICoqcmVzdW1lbiBlc3RhZMOtc3RpY28gZGUgbGFzIHZhcmlhYmxlcyBkZSBlc3R1ZGlvKiosIGxvIHF1ZSBwZXJtaXRlIGV4cGxvcmFyIGxhcyBjYXJhY3RlcsOtc3RpY2FzIGRlIGxvcyBkYXRvcyB5IGRldGVjdGFyIHBvc2libGVzIHByb2JsZW1hcyBjb21vIHZhbG9yZXMgYXTDrXBpY29zLiBMdWVnbywgc2UgKipmb3JtdWxhIGVsIG1vZGVsbyBkZSBSTG9nUyoqLCBxdWUgZXN0YWJsZWNlIGxhIHJlbGFjacOzbiBlbnRyZSBsYXMgdmFyaWFibGVzIGluZGVwZW5kaWVudGVzIHkgbGEgcHJvYmFiaWxpZGFkIGRlbCBldmVudG8gZGUgaW50ZXLDqXMuIEEgY29udGludWFjacOzbiwgc2UgdXRpbGl6YW4gKipkaWFncmFtYXMgZGUgY2FqYXMqKiBwYXJhIHZpc3VhbGl6YXIgbGEgZGlzcGVyc2nDs24gZGUgbG9zIGRhdG9zIHkgZGV0ZWN0YXIgcG9zaWJsZXMgdmFsb3JlcyBleHRyZW1vcyBxdWUgcHVlZGFuIGluZmx1aXIgZW4gZWwgbW9kZWxvLiBBZGVtw6FzLCBzZSBjb21wbGVtZW50YSBlbCBhbsOhbGlzaXMgY29uICoqZGlhZ3JhbWFzIGRlIGJhcnJhcyoqIHF1ZSBwZXJtaXRlbiBleGFtaW5hciBsYSBkaXN0cmlidWNpw7NuIGRlIGxhcyB2YXJpYWJsZXMgY2F0ZWfDs3JpY2FzLCB5IGhpc3RvZ3JhbWFzIHBhcmEgZXN0dWRpYXIgbGEgZGlzdHJpYnVjacOzbiBkZSBsYXMgdmFyaWFibGVzIGNvbnRpbnVhcy4gRXN0b3MgcGFzb3MgcGVybWl0ZW4gdmFsaWRhciBlbCBtb2RlbG8sIGludGVycHJldGFyIGxvcyByZXN1bHRhZG9zIGRlIG1hbmVyYSBlZmVjdGl2YSB5IGFzZWd1cmFyIHF1ZSBsb3MgZGF0b3Mgc2VhbiBhZGVjdWFkb3MgcGFyYSBlbCBhbsOhbGlzaXMsIGdhcmFudGl6YW5kbyBhc8OtIGxhIHJvYnVzdGV6IHkgZmlhYmlsaWRhZCBkZWwgbW9kZWxvIGRlIHJlZ3Jlc2nDs24gbG9nw61zdGljYSBzaW1wbGUuDQrigIMNCioqY29uY2x1c2lvbioqDQoNCkx1ZWdvIGRlIHJlYWxpemFyIGxvcyBkaWZlcmVudGVzIGVzdHVkaW9zIHBhcmEgY2FkYSBwZXN0YcOxYSBlbiBlc3RhIGZhc2UsIHNlIHB1ZWRlIGRlY2lyIGRlIGNhZGEgdW5hIGRlIGVzdGFzIGxvIHNpZ3VpZW50ZTsgRWwgKipSZXN1bWVuIGVzdGFkw61zdGljbyBkZSBsYXMgdmFyaWFibGVzIGRlIGVzdHVkaW8qKiAgRWwgZGlhZ3JhbWEgZGUgY2FqYSwgY29tYmluYWRvIGNvbiBlbCByZXN1bWVuIGVzdGFkw61zdGljbyBkZSBsYSB2YXJpYWJsZSAiQ29tbWVudHMiLCBjb25maXJtYSB1bmEgZnVlcnRlIHByZXNlbmNpYSBkZSB2YWxvcmVzIGV4dHJlbW9zIGVuIGxvcyBkYXRvcyBzaXR1YWNpb24gYW50ZXMgcHJlc2VudGFkYSBlbiBsYSBbc2VjY2nDs24gMS4zXSgjc2VjMSksIHNvbG8gcXVlIGFkaWZlcmVuY2lhIGRlbCBlc3R1ZGlvIHJlYWxpemFkbyBlbiBlc3RhIHNlY2Npb24gc2Ugc2FiZSBxdWUgZWwgdmFsb3IgbcOheGltbyBkZSA3NDkgc2UgZW5jdWVudHJhIG11eSBhbGVqYWRvIGRlIGxhIG1lZGlhICg0MS4wOCkgeSBkZWwgdGVyY2VyIGN1YXJ0aWwgKDMxLjAwKSwgbG8gcXVlIHJlZnVlcnphIGxhIGlkZW50aWZpY2FjacOzbiBkZSB2YWxvcmVzIGF0w61waWNvcyBxdWUgcG9kcsOtYW4gaW5mbHVpciBzaWduaWZpY2F0aXZhbWVudGUgZW4gZWwgYW7DoWxpc2lzLiBFbiBjdWFudG8gYWwgKipoaXN0b2dyYW1hIGRlIENvbW1lbnRzKiogcmVmdWVyemEgbGFzIG9ic2VydmFjaW9uZXMgZGVyaXZhZGFzIGRlbCBhbsOhbGlzaXMgZXN0YWTDrXN0aWNvIHkgZGVsIGRpYWdyYW1hIGRlIGNhamEgYW50ZXMgcmVhbGl6YWRvLCBtb3N0cmFuZG8gdW5hIGRpc3RyaWJ1Y2nDs24gYWx0YW1lbnRlIHNlc2dhZGEgaGFjaWEgbGEgaXpxdWllcmRhLiBMYSBtYXlvciBwYXJ0ZSBkZSBsYXMgb2JzZXJ2YWNpb25lcyBzZSBjb25jZW50cmFuIGVuIHZhbG9yZXMgYmFqb3MsIGVzcGVjw61maWNhbWVudGUgZW50cmUgMCB5IDUwLCBjb21vIGxvIGV2aWRlbmNpYSBsYSBiYXJyYSBtw6FzIGFsdGEgZW4gZWwgaGlzdG9ncmFtYS4gRXN0byBjb2luY2lkZSBjb24gZWwgcHJpbWVyIGN1YXJ0aWwgKDExLjUwKSB5IGxhIG1lZGlhbmEgKDIwLjAwKSwgbG8gcXVlIGluZGljYSBxdWUgbGEgbWF5b3LDrWEgZGUgbG9zIGtlcm5lbHMgZGVwb3NpdGFkb3MgZW4gbnVlc3RybyBjb25qdW50byBkZSBkYXRvcyB0aWVuZW4gcG9jb3MgY29tZW50YXJpb3MuDQpFbiBjdWFudG8gYSBlbCBhbsOhbGlzaXMgZGVsICoqZGlhZ3JhbWEgZGUgYmFycmFzKiogTXVlc3RyYSBxdWUgZWwgdGlwbyBkZSBjb2RpZ28gKipOb3RlYm9va3MqKiBzZSB1dGlsaXphbiBjb24gbWF5b3IgZnJlY3VlbmNpYSBlbiBjb21wYXJhY2nDs24gY29uIGxvcyAqKlNjcmlwdHMqKiBlbiBlc3RlIGNvbnRleHRvLCBsbyBxdWUgcG9kcsOtYSByZWZsZWphciB1bmEgcHJlZmVyZW5jaWEgZ2VuZXJhbCBkZSBsb3MgdXN1YXJpb3MgcG9yIGVzdGUgZm9ybWF0byBkZWJpZG8gYSBzdXMgdmVudGFqYXMgcGFyYSB0YXJlYXMgZXNwZWPDrWZpY2FzLCBjb21vIGxhIHZpc3VhbGl6YWNpw7NuIGRlIHJlc3VsdGFkb3MgbyBsYSBpbnRlZ3JhY2nDs24gZGUgdGV4dG8geSBjw7NkaWdvOyBkaWZlcmVudGUgYSBlc3RlLCBlbCAqKlJlc3VtZW4geSBEaWFncmFtYSBkZSBDYWphcyBDb25qdW50byoqIG11ZXN0cmEgcXVlIGF1bnF1ZSBhbWJvcyBmb3JtYXRvcyB0aWVuZW4gZGlzdHJpYnVjaW9uZXMgc2ltaWxhcmVzIGVuIHTDqXJtaW5vcyBkZSBzdXMgdmFsb3JlcyBjZW50cmFsZXMsIGxvcyBOb3RlYm9va3MgdGllbmRlbiBhIHRlbmVyIG3DoXMgdmFyaWFiaWxpZGFkIHkgdmFsb3JlcyBhdMOtcGljb3MgZXh0cmVtb3MgZW4gY29tcGFyYWNpw7NuIGNvbiBsb3MgU2NyaXB0cy4gRXN0byBwb2Ryw61hIGluZGljYXIgcXVlIGxvcyBOb3RlYm9va3Mgc29uIG3DoXMgcHJvcGVuc29zIGEgcmVnaXN0cmFyIHZhbG9yZXMgYWx0b3MgZW4gY2llcnRhcyBzaXR1YWNpb25lcyBlc3BlY8OtZmljYXMuDQoNCiMjIyAgKipSZXN1bWVuIGVzdGFkw61zdGljbyBkZSBsYXMgdmFyaWFibGVzIGRlIGVzdHVkaW8qKiB7LnRhYnNldCAgLnRhYnNldC1waWxsc30NCg0KRW4gZXN0YSBmYXNlICoqcmVncmVzacOzbiBsb2fDrXN0aWNhIHNpbXBsZSoqIHNlIGJ1c2NhIGV4YW1pbmFyIGxhIHJlbGFjacOzbiBlbnRyZSB1bmEgdmFyaWFibGUgZGVwZW5kaWVudGUgZGljb3TDs21pY2EgKGJpbmFyaWEpIHkgdW5hIG8gbcOhcyB2YXJpYWJsZXMgaW5kZXBlbmRpZW50ZXMuIEVzdGUgdGlwbyBkZSBhbsOhbGlzaXMgZXMgcGFydGljdWxhcm1lbnRlIMO6dGlsIGN1YW5kbyBzZSBkZXNlYSBwcmVkZWNpciBsYSBwcm9iYWJpbGlkYWQgZGUgcXVlIG9jdXJyYSB1biBldmVudG8sIGNvbW8gbGEgcHJlc2VuY2lhIG8gYXVzZW5jaWEgZGUgdW5hIGNhcmFjdGVyw61zdGljYTsgY29uIGVzdG8gc2UgYnVzY2EgbW9kZWxhciBlc3RhIHJlbGFjacOzbiBwYXJhIGNvbXByZW5kZXIgY8OzbW8gbGFzIHZhcmlhYmxlcyBkZSBlc3R1ZGlvIGFmZWN0YW4gbGFzIHByb2JhYmlsaWRhZGVzIGRlIHVuIHJlc3VsdGFkbyBkZXRlcm1pbmFkby4gRWwgcHJvY2VzbyBjb21pZW56YSBjb24gdW4gYW7DoWxpc2lzIGVzdGFkw61zdGljbyBwcmVsaW1pbmFyIGRlIGxvcyBkYXRvcywgcXVlIGluY2x1eWUgbGEgb2J0ZW5jacOzbiBkZSByZXPDum1lbmVzIGRlc2NyaXB0aXZvcyB5IGdyw6FmaWNvcy4gQSB0cmF2w6lzIGRlIGVzdG9zLCBzZSBldmFsw7phIGxhIGRpc3RyaWJ1Y2nDs24gZGUgbGFzIHZhcmlhYmxlcyB5IHNlIGlkZW50aWZpY2FuIHBvc2libGVzIHByb2JsZW1hcyBlbiBsb3MgZGF0b3MsIGNvbW8gdmFsb3JlcyBhdMOtcGljb3MgbyBzZXNnb3MuIA0KDQoNCg0KUGFyYSByZWFsaXphciB1bmEgY29uY2x1c2nDs24gYWRlY3VhZGEgc29icmUgZXN0YSBzZWNjacOzbiwgZXMgaW1wb3J0YW50ZSBjb21wcmVuZGVyIGJyZXZlbWVudGUgbG9zIHBhc29zIHJlYWxpemFkb3MgZW4gZWwgYW7DoWxpc2lzIGRlICoqUmVncmVzacOzbiBMb2fDrXN0aWNhIFNpbXBsZSoqLiBFbiBwcmltZXIgbHVnYXIsIHNlIG9idGllbmUgdW4gKipyZXN1bWVuIGVzdGFkw61zdGljbyBkZSBsYXMgdmFyaWFibGVzIGRlIGVzdHVkaW8qKiwgbG8gcXVlIHBlcm1pdGUgZXhwbG9yYXIgbGFzIGNhcmFjdGVyw61zdGljYXMgZGUgbG9zIGRhdG9zIHkgZGV0ZWN0YXIgcG9zaWJsZXMgcHJvYmxlbWFzIGNvbW8gdmFsb3JlcyBhdMOtcGljb3MuIEx1ZWdvLCBzZSAqKmZvcm11bGEgZWwgbW9kZWxvIGRlIFJMb2dTKiosIHF1ZSBlc3RhYmxlY2UgbGEgcmVsYWNpw7NuIGVudHJlIGxhcyB2YXJpYWJsZXMgaW5kZXBlbmRpZW50ZXMgeSBsYSBwcm9iYWJpbGlkYWQgZGVsIGV2ZW50byBkZSBpbnRlcsOpcy4gQSBjb250aW51YWNpw7NuLCBzZSB1dGlsaXphbiAqKmRpYWdyYW1hcyBkZSBjYWphcyoqIHBhcmEgdmlzdWFsaXphciBsYSBkaXNwZXJzacOzbiBkZSBsb3MgZGF0b3MgeSBkZXRlY3RhciBwb3NpYmxlcyB2YWxvcmVzIGV4dHJlbW9zIHF1ZSBwdWVkYW4gaW5mbHVpciBlbiBlbCBtb2RlbG8uIEFkZW3DoXMsIHNlIGNvbXBsZW1lbnRhIGVsIGFuw6FsaXNpcyBjb24gKipkaWFncmFtYXMgZGUgYmFycmFzKiogcXVlIHBlcm1pdGVuIGV4YW1pbmFyIGxhIGRpc3RyaWJ1Y2nDs24gZGUgbGFzIHZhcmlhYmxlcyBjYXRlZ8OzcmljYXMsIHkgaGlzdG9ncmFtYXMgcGFyYSBlc3R1ZGlhciBsYSBkaXN0cmlidWNpw7NuIGRlIGxhcyB2YXJpYWJsZXMgY29udGludWFzLiBFc3RvcyBwYXNvcyBwZXJtaXRlbiB2YWxpZGFyIGVsIG1vZGVsbywgaW50ZXJwcmV0YXIgbG9zIHJlc3VsdGFkb3MgZGUgbWFuZXJhIGVmZWN0aXZhIHkgYXNlZ3VyYXIgcXVlIGxvcyBkYXRvcyBzZWFuIGFkZWN1YWRvcyBwYXJhIGVsIGFuw6FsaXNpcywgZ2FyYW50aXphbmRvIGFzw60gbGEgcm9idXN0ZXogeSBmaWFiaWxpZGFkIGRlbCBtb2RlbG8gZGUgcmVncmVzacOzbiBsb2fDrXN0aWNhIHNpbXBsZS4NCuKAgw0KKipjb25jbHVzaW9uKioNCg0KTHVlZ28gZGUgcmVhbGl6YXIgbG9zIGRpZmVyZW50ZXMgZXN0dWRpb3MgcGFyYSBjYWRhIHBlc3Rhw7FhIGVuIGVzdGEgZmFzZSwgc2UgcHVlZGUgZGVjaXIgZGUgY2FkYSB1bmEgZGUgZXN0YXMgbG8gc2lndWllbnRlOyBFbCAqKlJlc3VtZW4gZXN0YWTDrXN0aWNvIGRlIGxhcyB2YXJpYWJsZXMgZGUgZXN0dWRpbyoqICBFbCBkaWFncmFtYSBkZSBjYWphLCBjb21iaW5hZG8gY29uIGVsIHJlc3VtZW4gZXN0YWTDrXN0aWNvIGRlIGxhIHZhcmlhYmxlICJ2b3RlcyIsIGNvbmZpcm1hIHVuYSBmdWVydGUgcHJlc2VuY2lhIGRlIHZhbG9yZXMgZXh0cmVtb3MgZW4gbG9zIGRhdG9zIHNpdHVhY2lvbiBhbnRlcyBwcmVzZW50YWRhIGVuIGxhIFtzZWNjacOzbiAxLjNdKCNzZWMxKSwgc29sbyBxdWUgYWRpZmVyZW5jaWEgZGVsIGVzdHVkaW8gcmVhbGl6YWRvIGVuIGVzdGEgc2VjY2lvbiBzZSBzYWJlIHF1ZSBlbCB2YWxvciBtw6F4aW1vIGRlIDIxMzAgc2UgZW5jdWVudHJhIG11eSBhbGVqYWRvIGRlIGxhIG1lZGlhICgxMjcuNikgeSBkZWwgdGVyY2VyIGN1YXJ0aWwgKDkyLjUpLCBsbyBxdWUgcmVmdWVyemEgbGEgaWRlbnRpZmljYWNpw7NuIGRlIHZhbG9yZXMgYXTDrXBpY29zIHF1ZSBwb2Ryw61hbiBpbmZsdWlyIHNpZ25pZmljYXRpdmFtZW50ZSBlbiBlbCBhbsOhbGlzaXMuIEVuIGN1YW50byBhbCAqKmhpc3RvZ3JhbWEgZGUgdm90ZXMqKiByZWZ1ZXJ6YSBsYXMgb2JzZXJ2YWNpb25lcyBkZXJpdmFkYXMgZGVsIGFuw6FsaXNpcyBlc3RhZMOtc3RpY28geSBkZWwgZGlhZ3JhbWEgZGUgY2FqYSBhbnRlcyByZWFsaXphZG8sIG1vc3RyYW5kbyB1bmEgZGlzdHJpYnVjacOzbiBhbHRhbWVudGUgc2VzZ2FkYSBoYWNpYSBsYSBpenF1aWVyZGEuIExhIG1heW9yIHBhcnRlIGRlIGxhcyBvYnNlcnZhY2lvbmVzIHNlIGNvbmNlbnRyYW4gZW4gdmFsb3JlcyBiYWpvcywgZXNwZWPDrWZpY2FtZW50ZSBlbnRyZSAwIHkgNTAsIGNvbW8gbG8gZXZpZGVuY2lhIGxhIGJhcnJhIG3DoXMgYWx0YSBlbiBlbCBoaXN0b2dyYW1hLiBFc3RvIGNvaW5jaWRlIGNvbiBlbCBwcmltZXIgY3VhcnRpbCAoNDAuNSkgeSBsYSBtZWRpYW5hICg1Ny4wMCksIGxvIHF1ZSBpbmRpY2EgcXVlIGxhIG1heW9yw61hIGRlIGxvcyBrZXJuZWxzIGRlcG9zaXRhZG9zIGVuIG51ZXN0cm8gY29uanVudG8gZGUgZGF0b3MgdGllbmVuIHBvY29zIGNvbWVudGFyaW9zLg0KRW4gY3VhbnRvIGEgZWwgYW7DoWxpc2lzIGRlbCAqKmRpYWdyYW1hIGRlIGJhcnJhcyoqIE11ZXN0cmEgcXVlIGVsIHRpcG8gZGUgY29kaWdvICoqTm90ZWJvb2tzKiogc2UgdXRpbGl6YW4gY29uIG1heW9yIGZyZWN1ZW5jaWEgZW4gY29tcGFyYWNpw7NuIGNvbiBsb3MgKipTY3JpcHRzKiogZW4gZXN0ZSBjb250ZXh0bywgbG8gcXVlIHBvZHLDrWEgcmVmbGVqYXIgdW5hIHByZWZlcmVuY2lhIGdlbmVyYWwgZGUgbG9zIHVzdWFyaW9zIHBvciBlc3RlIGZvcm1hdG8gZGViaWRvIGEgc3VzIHZlbnRhamFzIHBhcmEgdGFyZWFzIGVzcGVjw61maWNhcywgY29tbyBsYSB2aXN1YWxpemFjacOzbiBkZSByZXN1bHRhZG9zIG8gbGEgaW50ZWdyYWNpw7NuIGRlIHRleHRvIHkgY8OzZGlnbzsgZGlmZXJlbnRlIGEgZXN0ZSwgZWwgKipSZXN1bWVuIHkgRGlhZ3JhbWEgZGUgQ2FqYXMgQ29uanVudG8qKiBtdWVzdHJhIHF1ZSBhdW5xdWUgYW1ib3MgZm9ybWF0b3MgdGllbmVuIGRpc3RyaWJ1Y2lvbmVzIHNpbWlsYXJlcyBlbiB0w6lybWlub3MgZGUgc3VzIHZhbG9yZXMgY2VudHJhbGVzLCBsb3MgTm90ZWJvb2tzIHRpZW5kZW4gYSB0ZW5lciBtw6FzIHZhcmlhYmlsaWRhZCB5IHZhbG9yZXMgYXTDrXBpY29zIGV4dHJlbW9zIGVuIGNvbXBhcmFjacOzbiBjb24gbG9zIFNjcmlwdHMuIEVzdG8gcG9kcsOtYSBpbmRpY2FyIHF1ZSBsb3MgTm90ZWJvb2tzIHNvbiBtw6FzIHByb3BlbnNvcyBhIHJlZ2lzdHJhciB2YWxvcmVzIGFsdG9zIGVuIGNpZXJ0YXMgc2l0dWFjaW9uZXMgZXNwZWPDrWZpY2FzLg0KDQojIyMjIFJlc3VtZW4geSBCb3hwbG90IGRlIFZvdGVzDQpgYGB7ciBSZXN1bWVuX3lfQm94cGxvdF9kZV9Wb3RlcywgZmlnLmFsaWduPSdjZW50ZXInfQ0KDQoNCnN1bW1hcnkoRGF0YXNldF9NdWVzdHJlYWRvMyRWb3RlcykNCg0KYm94cGxvdChEYXRhc2V0X011ZXN0cmVhZG8zJFZvdGVzLCBtYWluID0gIkRpYWdyYW1hIGRlIENhamEgZGUgVm90ZXMiLCBjb2wgPSBjKCJicm93bjQiKSkNCmBgYA0KDQojIyMjIEhpc3RvZ3JhbWEgZGUgVm90ZXMNCmBgYHtyIEhpc3RvZ3JhbWFfZGVfVm90ZXMsIGZpZy5hbGlnbj0nY2VudGVyJ30NCg0Kc3VtbWFyeShEYXRhc2V0X011ZXN0cmVhZG8zJFZvdGVzKQ0KaGlzdChEYXRhc2V0X011ZXN0cmVhZG8zJFZvdGVzLCBtYWluID0gIkhpc3RvZ3JhbWEgZGUgVm90ZXMiLCBjb2wgPSBjKCJnb2xkIikpDQoNCmBgYA0KDQojIyMjIFJlc3VtZW4geSBEaWFncmFtYSBkZSBCYXJyYXMgZGUgQ29kZV9UeXBlDQpgYGB7ciBSZXN1bWVuX3lfRGlhZ3JhbWFfZGVfQmFycmFzX2RlX0NvZGVfVHlwZSwgZmlnLmFsaWduPSdjZW50ZXInfQ0KDQp0YWJsZShEYXRhc2V0JENvZGVfVHlwZSkNCg0KcHJvcC50YWJsZSh0YWJsZShEYXRhc2V0JENvZGVfVHlwZSkpDQoNCmJhcnBsb3QodGFibGUoRGF0YXNldCRDb2RlX1R5cGUpKQ0KDQpgYGANCg0KIyMjIyBSZXN1bWVuIHkgRGlhZ3JhbWEgZGUgQ2FqYXMgQ29uanVudG8NCmBgYHtyIFJlc3VtZW5feV9EaWFncmFtYV9kZV9DYWphc19Db25qdW50bywgZmlnLmFsaWduPSdjZW50ZXInfQ0KdGFwcGx5KERhdGFzZXQkVm90ZXMsIERhdGFzZXQkQ29kZV9UeXBlLCBtZWFuKQ0KdGFwcGx5KERhdGFzZXQkVm90ZXMsIERhdGFzZXQkQ29kZV9UeXBlLCBtZWRpYW4pDQoNCmJveHBsb3QoRGF0YXNldF9NdWVzdHJlYWRvMyRWb3Rlc35EYXRhc2V0X011ZXN0cmVhZG8zJENvZGVfVHlwZSwgbWFpbiA9ICJCb3hwbG90IENvbmp1bnRvOiBWb3Rlcy1Db2RlX1R5cGUiLCBjb2wgPSBjKCJvcmFuZ2UiLCAiZ29sZCIpKQ0KDQpgYGANCg0KIyMjICoqRm9ybXVsYWNpw7NuIGRlbCBtb2RlbG8gZGUgUkxvZ1MgZW50cmUgbGFzIHZhcmlhYmxlcyBkZSBlc3R1ZGlvKiogey50YWJzZXQgIC50YWJzZXQtcGlsbHN9DQoNCkVuIGVzdGEgZmFzZSAqKnJlZ3Jlc2nDs24gbG9nw61zdGljYSBzaW1wbGUqKiBzZSBidXNjYSBleGFtaW5hciBsYSByZWxhY2nDs24gZW50cmUgdW5hIHZhcmlhYmxlIGRlcGVuZGllbnRlIGRpY290w7NtaWNhIChiaW5hcmlhKSB5IHVuYSBvIG3DoXMgdmFyaWFibGVzIGluZGVwZW5kaWVudGVzLiBFc3RlIHRpcG8gZGUgYW7DoWxpc2lzIGVzIHBhcnRpY3VsYXJtZW50ZSDDunRpbCBjdWFuZG8gc2UgZGVzZWEgcHJlZGVjaXIgbGEgcHJvYmFiaWxpZGFkIGRlIHF1ZSBvY3VycmEgdW4gZXZlbnRvLCBjb21vIGxhIHByZXNlbmNpYSBvIGF1c2VuY2lhIGRlIHVuYSBjYXJhY3RlcsOtc3RpY2E7IGNvbiBlc3RvIHNlIGJ1c2NhIG1vZGVsYXIgZXN0YSByZWxhY2nDs24gcGFyYSBjb21wcmVuZGVyIGPDs21vIGxhcyB2YXJpYWJsZXMgZGUgZXN0dWRpbyBhZmVjdGFuIGxhcyBwcm9iYWJpbGlkYWRlcyBkZSB1biByZXN1bHRhZG8gZGV0ZXJtaW5hZG8uIEVsIHByb2Nlc28gY29taWVuemEgY29uIHVuIGFuw6FsaXNpcyBlc3RhZMOtc3RpY28gcHJlbGltaW5hciBkZSBsb3MgZGF0b3MsIHF1ZSBpbmNsdXllIGxhIG9idGVuY2nDs24gZGUgcmVzw7ptZW5lcyBkZXNjcmlwdGl2b3MgeSBncsOhZmljb3MuIEEgdHJhdsOpcyBkZSBlc3Rvcywgc2UgZXZhbMO6YSBsYSBkaXN0cmlidWNpw7NuIGRlIGxhcyB2YXJpYWJsZXMgeSBzZSBpZGVudGlmaWNhbiBwb3NpYmxlcyBwcm9ibGVtYXMgZW4gbG9zIGRhdG9zLCBjb21vIHZhbG9yZXMgYXTDrXBpY29zIG8gc2VzZ29zLiANCg0KDQoNCkVuIGVzdGEgZXRhcGEsIHNlIGVtcGxlYW4gaGVycmFtaWVudGFzIGNsYXZlIHBhcmEgbGEgZm9ybXVsYWNpw7NuIGRlbCBtb2RlbG8gZGUgUkxvZ1MsIGNvbW8gZWwgY8OhbGN1bG8gZGUgbG9zICoqY29lZmljaWVudGVzIGRlbCBtb2RlbG8qKiwgcXVlIGN1YW50aWZpY2FuIGxhIGluZmx1ZW5jaWEgZGUgY2FkYSB2YXJpYWJsZSBpbmRlcGVuZGllbnRlIGVuIGxhIHByb2JhYmlsaWRhZCBkZWwgZXZlbnRvIGRlIGludGVyw6lzLiBFc3RvcyBjb2VmaWNpZW50ZXMgcGVybWl0ZW4gaWRlbnRpZmljYXIgbGEgZGlyZWNjacOzbiB5IG1hZ25pdHVkIGRlIGxvcyBlZmVjdG9zLCBsbyBxdWUgZmFjaWxpdGEgbGEgaW50ZXJwcmV0YWNpw7NuIGRlIGxvcyByZXN1bHRhZG9zLiBBZGVtw6FzLCBzZSByZWFsaXphIHVuICoqcmVzdW1lbiBlc3RhZMOtc3RpY28gZGVsIG1vZGVsbyoqLCBxdWUgaW5jbHV5ZSBtw6l0cmljYXMgY29tbyBlbCBlc3RhZMOtc3RpY28gZGUgdmVyb3NpbWlsaXR1ZCB5IGxvcyB2YWxvcmVzIHAgYXNvY2lhZG9zIGEgY2FkYSB2YXJpYWJsZSwgYXl1ZGFuZG8gYSBkZXRlcm1pbmFyIHN1IHJlbGV2YW5jaWEgeSBzaWduaWZpY2FuY2lhIGVuIGVsIG1vZGVsby4gRXN0b3MgcGFzb3MgYXNlZ3VyYW4gcXVlIGVsIG1vZGVsbyBzZWEgbWF0ZW3DoXRpY2FtZW50ZSByb2J1c3RvIHkgZXN0YWTDrXN0aWNhbWVudGUgdsOhbGlkbywgcHJvcG9yY2lvbmFuZG8gdW5hIHJlcHJlc2VudGFjacOzbiBjbGFyYSBkZSBsYXMgcmVsYWNpb25lcyBlbnRyZSBsYXMgdmFyaWFibGVzIGRlIGVzdHVkaW8geSBlbCBldmVudG8gYW5hbGl6YWRvLg0K4oCDDQoqKmNvbmNsdXNpb24qKg0KDQpFbiBlbCBlc3R1ZGlvIGRlICoqQ29lZmljaWVudGVzIGRlbCBNb2RlbG8gUkxvZ1MqKiBzZSBtdWVzdHJhIGVsIGNvZWZpY2llbnRlIGRlICoqRGF0YXNldCRWb3RlcyoqIGNvbW8gbmVnYXRpdm8sIGRlIGxvIGN1YWwgc2UgcHVlZGUgaW5mZXJpciBxdWUgdW4gYXVtZW50byBlbiBsb3Mgdm90b3MgZXN0w6EgYXNvY2lhZG8gY29uIHVuYSBkaXNtaW51Y2nDs24gZW4gbGEgcHJvYmFiaWxpZGFkIGRlIHF1ZSBvY3VycmEgZWwgZXZlbnRvIGRlIGludGVyw6lzIChlbiBlc3RlIGNhc28sIGVsIGV2ZW50byBhc29jaWFkbyBhIGxhIHZhcmlhYmxlIENvZGVfVHlwZSkuDQpTaW4gZW1iYXJnbywgZWwgdmFsb3IgYWJzb2x1dG8gZGVsIGNvZWZpY2llbnRlIGVzIHBlcXVlw7FvICgtMC4wMDE2KSwgbG8gcXVlIHN1Z2llcmUgcXVlIGVsIGVmZWN0byBkZSBsb3Mgdm90b3Mgc29icmUgbGEgcHJvYmFiaWxpZGFkIGRlIHF1ZSBvY3VycmEgZWwgZXZlbnRvIGVzIHJlbGF0aXZhbWVudGUgZMOpYmlsLg0KUG9yIG90cm8gbGFkbyxkZSBlbCAqKlJlc3VtZW4gRXN0YWTDrXN0aWNvIGRlbCBNb2RlbG8gUkxvZ1MqKiBzZSBwdWVkZSBleHRyYWVyIHF1ZSBlbCBuw7ptZXJvIGRlIHZvdG9zIHRpZW5lIHVuYSByZWxhY2nDs24gc2lnbmlmaWNhdGl2YSBjb24gbGEgcHJvYmFiaWxpZGFkIGRlIHF1ZSBvY3VycmEgZWwgZXZlbnRvIGRlIGludGVyw6lzLCBkYWRvIHF1ZSBlbCBjb2VmaWNpZW50ZSBkZSBEYXRhc2V0JFZvdGVzIGVzIG5lZ2F0aXZvIHkgc3UgcC12YWxvciBlcyBtZW5vciBxdWUgMC4wNS4gRXN0ZSByZXN1bHRhZG8gc3VnaWVyZSBxdWUsIGEgbWVkaWRhIHF1ZSBhdW1lbnRhIGVsIG7Dum1lcm8gZGUgdm90b3MsIGxhIHByb2JhYmlsaWRhZCBkZSBxdWUgb2N1cnJhIGVsIGV2ZW50byBkZSBpbnRlcsOpcyBkaXNtaW51eWUuRWwgaW50ZXJjZXB0byBkZWwgbW9kZWxvIHRhbWJpw6luIGVzIHNpZ25pZmljYXRpdm8geSBuZWdhdGl2bywgbG8gcXVlIGluZGljYSBxdWUgY3VhbmRvIGVsIG7Dum1lcm8gZGUgdm90b3MgZXMgY2VybywgbGEgcHJvYmFiaWxpZGFkIGRlIHF1ZSBvY3VycmEgZWwgZXZlbnRvIGVzIGJhamEuIEFkZW3DoXMsIHNlIG9ic2VydmEgcXVlIGVsIEFJQyBkZWwgbW9kZWxvIGVzIDEyNzguNywgbG8gcXVlIHByb3BvcmNpb25hIHVuYSBtZWRpZGEgZGUgbGEgYm9uZGFkIGRlIGFqdXN0ZSBkZWwgbW9kZWxvLiBVbiBBSUMgbcOhcyBiYWpvIGdlbmVyYWxtZW50ZSBpbmRpY2EgdW4gbWVqb3IgYWp1c3RlLCB5IGVzdGUgdmFsb3IgcHVlZGUgc2VyIHV0aWxpemFkbyBwYXJhIGNvbXBhcmFyIGNvbiBvdHJvcyBtb2RlbG9zLCBhdW5xdWUgZW4gZXN0ZSBjYXNvIHNvbG8gc2UgcHJlc2VudGEgdW4gbW9kZWxvIHBhcmEgbGEgdmFyaWFibGUgQ29kZV9UeXBlLg0KDQojIyMjIENvZWZpY2llbnRlcyBkZWwgTW9kZWxvIFJMb2dTDQpgYGB7ciBDb2VmaWNpZW50ZXNfZGVsX01vZGVsb19STG9nUywgZmlnLmFsaWduPSdjZW50ZXInfQ0KDQoNCkRhdGFzZXQkQ29kZV9UeXBlIDwtIGFzLmZhY3RvcihEYXRhc2V0JENvZGVfVHlwZSkNCm1vZGVsb19STG9nX1NpbXBsZSA9IGdsbSAoRGF0YXNldCRDb2RlX1R5cGV+RGF0YXNldCRWb3RlcywgZmFtaWx5ID0gImJpbm9taWFsIiwgZGF0YSA9IGRhdGEuZnJhbWUoRGF0YXNldCRDb2RlX1R5cGUsIERhdGFzZXQkVm90ZXMpKQ0KY29lZihtb2RlbG9fUkxvZ19TaW1wbGUpDQoNCg0KDQpgYGANCg0KIyMjIyBSZXN1bWVuIEVzdGFkw61zdGljbyBkZWwgTW9kZWxvIFJMb2dTIHsudGFic2V0ICAudGFic2V0LXBpbGxzfQ0KYGBge3IgUmVzdW1lbl9Fc3RhZMOtc3RpY29fZGVsX01vZGVsb19STG9nUywgZmlnLmFsaWduPSdjZW50ZXInfQ0KDQoNCkRhdGFzZXQkTGFuZ3VhZ2UgPC0gYXMuZmFjdG9yKERhdGFzZXQkTGFuZ3VhZ2UpDQpzdW1tYXJ5KG1vZGVsb19STG9nX1NpbXBsZSkNCg0KbW9kZWxvX1JMb2dfU2ltcGxlX1MgPSBnbG0oRGF0YXNldCRMYW5ndWFnZX5EYXRhc2V0JFZvdGVzLCBmYW1pbHkgPSAiYmlub21pYWwiLCBkYXRhID0gZGF0YS5mcmFtZShEYXRhc2V0JExhbmd1YWdlLCBEYXRhc2V0JFZvdGVzKSkNCnN1bW1hcnkobW9kZWxvX1JMb2dfU2ltcGxlX1MpDQoNCmBgYA0KDQoNCg0KDQoNCiMjIyAqKkFuw6FsaXNpcyBkZWwgbW9kZWxvIFJMb2dTKiogey50YWJzZXQgIC50YWJzZXQtcGlsbHN9DQoNCg0KRW4gZXN0YSBmYXNlICoqcmVncmVzacOzbiBsb2fDrXN0aWNhIHNpbXBsZSoqIHNlIGJ1c2NhIGV4YW1pbmFyIGxhIHJlbGFjacOzbiBlbnRyZSB1bmEgdmFyaWFibGUgZGVwZW5kaWVudGUgZGljb3TDs21pY2EgKGJpbmFyaWEpIHkgdW5hIG8gbcOhcyB2YXJpYWJsZXMgaW5kZXBlbmRpZW50ZXMuIEVzdGUgdGlwbyBkZSBhbsOhbGlzaXMgZXMgcGFydGljdWxhcm1lbnRlIMO6dGlsIGN1YW5kbyBzZSBkZXNlYSBwcmVkZWNpciBsYSBwcm9iYWJpbGlkYWQgZGUgcXVlIG9jdXJyYSB1biBldmVudG8sIGNvbW8gbGEgcHJlc2VuY2lhIG8gYXVzZW5jaWEgZGUgdW5hIGNhcmFjdGVyw61zdGljYTsgY29uIGVzdG8gc2UgYnVzY2EgbW9kZWxhciBlc3RhIHJlbGFjacOzbiBwYXJhIGNvbXByZW5kZXIgY8OzbW8gbGFzIHZhcmlhYmxlcyBkZSBlc3R1ZGlvIGFmZWN0YW4gbGFzIHByb2JhYmlsaWRhZGVzIGRlIHVuIHJlc3VsdGFkbyBkZXRlcm1pbmFkby4gRWwgcHJvY2VzbyBjb21pZW56YSBjb24gdW4gYW7DoWxpc2lzIGVzdGFkw61zdGljbyBwcmVsaW1pbmFyIGRlIGxvcyBkYXRvcywgcXVlIGluY2x1eWUgbGEgb2J0ZW5jacOzbiBkZSByZXPDum1lbmVzIGRlc2NyaXB0aXZvcyB5IGdyw6FmaWNvcy4gQSB0cmF2w6lzIGRlIGVzdG9zLCBzZSBldmFsw7phIGxhIGRpc3RyaWJ1Y2nDs24gZGUgbGFzIHZhcmlhYmxlcyB5IHNlIGlkZW50aWZpY2FuIHBvc2libGVzIHByb2JsZW1hcyBlbiBsb3MgZGF0b3MsIGNvbW8gdmFsb3JlcyBhdMOtcGljb3MgbyBzZXNnb3MuIA0KDQoNCg0KRW4gZWwgYW7DoWxpc2lzIGRlbCBtb2RlbG8gUkxvZ1MsIHNlIGVtcGxlYW4gcHJvY2Vzb3MgY2xhdmUgY29tbyBsYSBjb25zaWRlcmFjacOzbiBkZSBsYSBWYXJpYWJsZSBQcmVkaWN0b3JhIGlndWFsIGEgQ2VybywgbGFzIFByb2JhYmlsaWRhZGVzIEVzdGltYWRhcyB5IGxhIEdyw6FmaWNhIGRlbCBNb2RlbG8gUkxvZ1MuIEVsIHByaW1lciBtw6l0b2RvIGVzdGFibGVjZSB1biBwdW50byBkZSByZWZlcmVuY2lhIGFsIGV2YWx1YXIgZWwgbW9kZWxvIGVuIGNvbmRpY2lvbmVzIGluaWNpYWxlcywgZXMgZGVjaXIsIGN1YW5kbyBsYXMgdmFyaWFibGVzIHByZWRpY3RvcmFzIHRvbWFuIHVuIHZhbG9yIGRlIGNlcm8uIEVzdG8gYXl1ZGEgYSBpZGVudGlmaWNhciBsYSBwcm9iYWJpbGlkYWQgYmFzZSBkZSBvY3VycmVuY2lhIGRlbCBldmVudG8gZXN0dWRpYWRvLiBQb3Igb3RybyBsYWRvLCBsYXMgUHJvYmFiaWxpZGFkZXMgRXN0aW1hZGFzIHNlIGNhbGN1bGFuIHBhcmEgcHJlZGVjaXIgbGEgcHJvYmFiaWxpZGFkIGRlIHVuIGV2ZW50byBlbiBmdW5jacOzbiBkZSBsb3MgdmFsb3JlcyBkZSBsYXMgdmFyaWFibGVzIGluZGVwZW5kaWVudGVzLCBwcm9wb3JjaW9uYW5kbyB1bmEgbWVkaWRhIG51bcOpcmljYSBjbGF2ZSBwYXJhIGxhIGludGVycHJldGFjacOzbiBkZWwgbW9kZWxvLiBGaW5hbG1lbnRlLCBsYSBHcsOhZmljYSBkZWwgTW9kZWxvIFJMb2dTIG9mcmVjZSB1bmEgcmVwcmVzZW50YWNpw7NuIHZpc3VhbCBxdWUgcGVybWl0ZSBvYnNlcnZhciBjw7NtbyB2YXLDrWFuIGxhcyBwcm9iYWJpbGlkYWRlcyBlbiBmdW5jacOzbiBkZSBsb3MgY2FtYmlvcyBlbiBsYXMgdmFyaWFibGVzIHByZWRpY3RvcmFzLCBmYWNpbGl0YW5kbyBsYSB2YWxpZGFjacOzbiB5IGNvbXVuaWNhY2nDs24gZGUgbG9zIHJlc3VsdGFkb3Mgb2J0ZW5pZG9zLg0KDQoqKmNvbmNsdXNpb24qKg0KDQpFbiBlbCBhbsOhbGlzaXMgcmVhbGl6YWRvIHJlZmVyZW50ZSBhbCBhcGFydGFkbyAqKlZhcmlhYmxlIFByZWRpY3RvcmEgaWd1YWwgYSBDZXJvKiosIHNlIG9ic2VydsOzIHF1ZSBlbCBuw7ptZXJvIGRlIHZvdG9zIHRpZW5lIHVuYSByZWxhY2nDs24gbmVnYXRpdmEgY29uIGxhIHByb2JhYmlsaWRhZCBkZSBxdWUgb2N1cnJhIGVsIGV2ZW50byBkZSBpbnRlcsOpcyAoQ29kZV9UeXBlID0gMSkuIEVzdG8gc2UgcmVmbGVqYSBlbiBlbCBjb2VmaWNpZW50ZSBkZSBEYXRhc2V0JFZvdGVzIGVuIGxvZy1vZGRzLCBxdWUgZXMgbmVnYXRpdm8gKC0wLjAwMTU4NiksIHkgZW4gZWwgb2RkcyByYXRpbyBkZSAwLjk5ODQxNSwgcXVlIGluZGljYSBxdWUsIHBvciBjYWRhIGluY3JlbWVudG8gdW5pdGFyaW8gZW4gZWwgbsO6bWVybyBkZSB2b3RvcywgbGFzIG9kZHMgZGUgcXVlIG9jdXJyYSBlbCBldmVudG8gZGlzbWludXllbiBlbiB1biAwLjE1JS4gQXVucXVlIGVzdGUgZWZlY3RvIGVzIHNpZ25pZmljYXRpdm8sIGVsIG9kZHMgcmF0aW8gY2VyY2FubyBhIDEgc3VnaWVyZSBxdWUgZWwgaW1wYWN0byBkZSBsb3Mgdm90b3Mgc29icmUgbGEgcHJvYmFiaWxpZGFkIGRlIHF1ZSBvY3VycmEgZWwgZXZlbnRvIGVzIGTDqWJpbC4gRW4gcmVzdW1lbiwgZWwgbsO6bWVybyBkZSB2b3RvcyB0aWVuZSB1bmEgaW5mbHVlbmNpYSBuZWdhdGl2YSB5IHBlcXVlw7FhIHNvYnJlIGxhIHByb2JhYmlsaWRhZCBkZWwgZXZlbnRvIGRlIGludGVyw6lzLCBwZXJvIGxhIG1hZ25pdHVkIGRlIGVzdGUgZWZlY3RvIGVzIG1vZGVyYWRhLg0KRW4gYW5hbGl6YXIgbGEgcGVzdGHDsWEgKipQcm9iYWJpbGlkYWQgRXN0aW1hZGFzKiogc2Ugb2JzZXJ2YSBxdWUgbGEgcHJvYmFiaWxpZGFkIGVzdGltYWRhIGNvbWllbnphIGVuIDAuNDE2MzMgeSBkaXNtaW51eWUgcHJvZ3Jlc2l2YW1lbnRlIGhhc3RhIHN1IG1lbm9yIHZhbG9yIGRlIDAuMDI0OTk7IEVzdGUgcGF0csOzbiBzdWdpZXJlIHVuYSB0ZW5kZW5jaWEgZGVzY2VuZGVudGUgZW4gbGEgcHJvYmFiaWxpZGFkIGEgbG8gbGFyZ28gZGUgbGFzIG9ic2VydmFjaW9uZXMsIGF1bnF1ZSBsYSBkaXNtaW51Y2nDs24gZXMgZ3JhZHVhbCB5IGxldmUuIGFkZW3DoXMsIExhcyBwcm9iYWJpbGlkYWRlcyBzZSBtYW50aWVuZW4gYmFzdGFudGUgY29uc3RhbnRlcyBlbiBhbGd1bm9zIGludGVydmFsb3MsIGNvbiBwZXF1ZcOxb3MgZGVzY2Vuc29zIGVudHJlIGFsZ3VuYXMgb2JzZXJ2YWNpb25lcyBsbyBxdWUgcHVlZGUgaW5kaWNhciBxdWUgZWwgbW9kZWxvIHByZWRpY2UgcHJvYmFiaWxpZGFkZXMgc2ltaWxhcmVzIGEgbG8gbGFyZ28gZGUgdW5hIGdyYW4gcGFydGUgZGVsIHJhbmdvIGRlIGVudHJhZGEuDQoNCkZpbmFsbWVudGUgdGVuaWVuZG8gZW4gY3VlbnRhIHF1ZSBlbiBsYSAqKkdyw6FmaWNhIGRlbCBNb2RlbG8gUkxvZ1MqKiBsb3MgcHVudG9zIGFtYXJpbGxvcyBjb3JyZXNwb25kZW4gYSBsb3MgZGF0b3Mgb2JzZXJ2YWRvcywgbWllbnRyYXMgcXVlIGxhIGN1cnZhIG5hcmFuamEgaWx1c3RyYSBsYXMgcHJvYmFiaWxpZGFkZXMgcHJlZGljaGFzIHBvciBlbCBtb2RlbG8uIExhIGZvcm1hIGNhc2kgaG9yaXpvbnRhbCBkZSBsYSBjdXJ2YSBzdWdpZXJlIHF1ZSBubyBoYXkgdW5hIHJlbGFjacOzbiBjbGFyYSBlbnRyZSBsYXMgdmlzdWFsaXphY2lvbmVzIHkgZWwgdGlwbyBkZSBjw7NkaWdvLCBpbmRpY2FuZG8gcXVlIGxhcyB2aXN1YWxpemFjaW9uZXMgbm8gcGFyZWNlbiBzZXIgdW4gZmFjdG9yIGRldGVybWluYW50ZSBwYXJhIHByZWRlY2lyIGVsIHRpcG8gZGUgY8OzZGlnbw0KDQojIyMjIFZhcmlhYmxlIFByZWRpY3RvcmEgaWd1YWwgYSBDZXJvDQpgYGB7ciBWYXJpYWJsZV9QcmVkaWN0b3JhX2lndWFsX2FfQ2VybywgZmlnLmFsaWduPSdjZW50ZXInfQ0KDQpjb2VmKG1vZGVsb19STG9nX1NpbXBsZSkNCnJvdW5kKGV4cChjb2VmKG1vZGVsb19STG9nX1NpbXBsZSkpLDUpDQoNCg0KYGBgDQoNCiMjIyMgUHJvYmFiaWxpZGFkZXMgRXN0aW1hZGFzDQpgYGB7ciBQcm9iYWJpbGlkYWRlc19Fc3RpbWFkYXMsIGZpZy5hbGlnbj0nY2VudGVyJ30NCnJvdW5kKHN1cHByZXNzV2FybmluZ3MocHJlZGljdChtb2RlbG9fUkxvZ19TaW1wbGUsIGRhdGEuZnJhbWUoc2VxKDEsIDQwMCkpLCB0eXBlID0gInJlc3BvbnNlIikpLDUpDQoNCmBgYA0KDQojIyMjIEdyw6FmaWNhIGRlbCBNb2RlbG8gUkxvZ1MNCmBgYHtyIEdyw6FmaWNhX2RlbF9Nb2RlbG9fUkxvZ1MsIGZpZy5hbGlnbj0nY2VudGVyJ30NCg0KDQpEYXRhc2V0JENvZGVfVHlwZSA8LSBhcy5mYWN0b3IoRGF0YXNldCRDb2RlX1R5cGUpDQoNCkNvZGVfVHlwZSA8LSBEYXRhc2V0JENvZGVfVHlwZQ0KVmlld3MgPC0gRGF0YXNldCRWaWV3cw0KDQoNCmRhdGFQbG90IDwtIGRhdGEuZnJhbWUoVmlld3MsIENvZGVfVHlwZSkNCnBsb3QoQ29kZV9UeXBlflZpZXdzLCBkYXRhID0gZGF0YVBsb3QsIG1haW4gPSAiTW9kZWxvIFJMb2dTOiBWaWV3cy1Db2RlX1R5cGUiLCB4bGFiID0gIlZpZXdzIiwgeWxhYiA9ICJDb2RlX1R5cGUgPSAwIHwgQ29kZV9UeXBlID0gMSIsIGNvbCA9ICJnb2xkIiwgcGNoID0gIkkiKQ0KDQoNCmN1cnZlKHByZWRpY3QoZ2xtKENvZGVfVHlwZX5WaWV3cywgZmFtaWx5ID0gImJpbm9taWFsIiwgZGF0YSA9IGRhdGFQbG90KSwgZGF0YS5mcmFtZShWaWV3cyA9IHgpLCB0eXBlID0gInJlc3BvbnNlIiksIGNvbCA9ICJvcmFuZ2UiLCBsd2QgPSAzLCBhZGQgPSBUUlVFKQ0KDQoNCg0KYGBgDQoNCiMjICoqNi4gQ29uY2x1c2lvbmVzKiogey50YWJzZXQgIC50YWJzZXQtcGlsbHN9DQoNClNlIHJlYWxpesOzIHVuIGFuw6FsaXNpcyBlc3RhZMOtc3RpY28gY29uIGxvcyBkYXRvcyBkZSBLYWdnbGUsIGVuY29udHJhbmRvIHBhdHJvbmVzIGludGVyZXNhbnRlcyB5IHJlbGFjaW9uZXMgaW1wb3J0YW50ZXMgZW50cmUgbGFzIHZhcmlhYmxlcy4gU2UgdXRpbGl6YXJvbiB2YXJpYXMgdMOpY25pY2FzLCBjb21vIGFuw6FsaXNpcyBkZXNjcmlwdGl2bywgQW7DoWxpc2lzIGRlIENvbXBvbmVudGVzIFByaW5jaXBhbGVzIChBQ1ApLCBBbsOhbGlzaXMgZGUgQ29ycmVzcG9uZGVuY2lhcyBNw7psdGlwbGVzIChBQ00pLCBhZ3J1cGFtaWVudG8geSByZWdyZXNpw7NuLiBFbiBwcmltZXIgbHVnYXIsIHNlIGRldGVjdGFyb24gYWxndW5vcyB2YWxvcmVzIGF0w61waWNvcyB5IHNlc2dvcyBlbiBsb3MgZGF0b3MuIFNlIG9ic2VydsOzIHF1ZSBleGlzdMOtYW4gcmVsYWNpb25lcyBwb3NpdGl2YXMgZW50cmUgbG9zIHZvdG9zLCBjb21lbnRhcmlvcywgdmlzdGFzIHkgZm9ya3MsIGF1bnF1ZSBsYSBkaXN0cmlidWNpw7NuIG5vIGVyYSBub3JtYWwuDQoNCkVsIEFDUCBwZXJtaXRpw7Mgc2ltcGxpZmljYXIgbGFzIHZhcmlhYmxlcyBjdWFudGl0YXRpdmFzLCByZXZlbGFuZG8gcXVlIGxhIHByaW1lcmEgZGltZW5zacOzbiBleHBsaWNhYmEgbGEgbWF5b3IgcGFydGUgZGUgbGEgdmFyaWFiaWxpZGFkLiBDb24gZWwgQUNNLCBzZSBpZGVudGlmaWNhcm9uIGFncnVwYWNpb25lcyBpbnRlcmVzYW50ZXMgZW50cmUgcGHDrXNlcyB5IHRpcG9zIGRlIGPDs2RpZ28sIGxvIHF1ZSBwcm9wb3JjaW9uw7MgdW5hIGJ1ZW5hIHJlcHJlc2VudGFjacOzbiB2aXN1YWwgcGFyYSBlbnRlbmRlciBzdXMgaW50ZXJhY2Npb25lcy4gQWRlbcOhcywgbG9zIGFuw6FsaXNpcyBkZSBhZ3J1cGFtaWVudG8gamVyw6FycXVpY28geSBubyBqZXLDoXJxdWljbyBzZcOxYWxhcm9uIGEgVmlldG5hbSBjb21vIHVuIGNhc28gZXNwZWNpYWwsIGRlYmlkbyBhIHN1IGFsdGEgYWN0aXZpZGFkIGVuIGxhcyB2YXJpYWJsZXMgY2xhdmUuIEVzdG8gc3VnaWVyZSBxdWUgc2UgcmVxdWllcmVuIGVuZm9xdWVzIHBlcnNvbmFsaXphZG9zIHBhcmEgZXN0ZSBjYW1wby4gDQoNCkZpbmFsbWVudGUsIGxhcyByZWdyZXNpb25lcyBsaW5lYWxlcyBtw7psdGlwbGVzIHkgbG9nw61zdGljYXMgc2ltcGxlcyBvZnJlY2llcm9uIGluZm9ybWFjacOzbiBhZGljaW9uYWwgc29icmUgY8OzbW8gbGFzIHZhcmlhYmxlcyBhZmVjdGFuIGxvcyByZXN1bHRhZG9zLiBMYSByZWdyZXNpw7NuIGxpbmVhbCBtw7psdGlwbGUgbW9zdHLDsyBxdWUgbG9zIGNvbWVudGFyaW9zIHkgdmlzdGFzIHRpZW5lbiB1biBpbXBhY3RvIHBvc2l0aXZvIGVuIGxvcyB2b3RvcywgbWllbnRyYXMgcXVlIGxvcyBmb3JrcyBwcmVzZW50YW4gdW5hIHJlbGFjacOzbiBkw6liaWxtZW50ZSBuZWdhdGl2YS4gUG9yIG90cm8gbGFkbywgZWwgYW7DoWxpc2lzIGRlIHJlZ3Jlc2nDs24gbG9nw61zdGljYSBpbmRpY8OzIHF1ZSBlbCBuw7ptZXJvIGRlIHZvdG9zIHRlbsOtYSB1bmEgcGVxdWXDsWEgaW5mbHVlbmNpYSBuZWdhdGl2YSBlbiBsYSBwcm9iYWJpbGlkYWQgZGUgZXZlbnRvcyBiaW5hcmlvcyByZWxhY2lvbmFkb3MgY29uIGVsIHRpcG8gZGUgY8OzZGlnby4gRW4gcmVzdW1lbiwgZXN0YXMgY29uY2x1c2lvbmVzIHByb3BvcmNpb25hbiB1bmEgY29tcHJlbnNpw7NuIHZhbGlvc2EgZGUgbGFzIHJlbGFjaW9uZXMgZW4gbG9zIGRhdG9zLCBheXVkYW5kbyBhIHRvbWFyIGRlY2lzaW9uZXMgaW5mb3JtYWRhcyBhbCBhcGxpY2FyIG1vZGVsb3MgZXN0YWTDrXN0aWNvcyBlbiBzaXR1YWNpb25lcyBkb25kZSBsYSB2YXJpYWJpbGlkYWQgeSBsYSBlc3RydWN0dXJhIGRlIGxvcyBkYXRvcyBzb24gcmVsZXZhbnRlcy4NCg0KIyMgKio3LiBCaWJsaW9ncmFmw61hKiogey50YWJzZXQgIC50YWJzZXQtcGlsbHN9DQpodHRwczovL2dsaWJyZXJvc2wuZ2l0aHViLmlvL0FwcGxpZWQtU3RhdGlzdGljcy1GVUxMLyNbQ29uZ2xvbWVyYWRvc10NCg0KaHR0cHM6Ly9ycHVicy5jb20vZ2xpYnJlcm9zbC9BcHBsaWVkLVN0YXRpc3RpY3MtRlVMTA0KDQpodHRwczovL2RvY3VtZW50Y2xvdWQuYWRvYmUuY29tL2dzdWl0ZWludGVncmF0aW9uL2luZGV4Lmh0bWw/c3RhdGU9JTdCImlkcyIlM0ElNUIiMUhqOXBOT1M3bWN3WlZOdTZPNHJpZGY2ZW8taGUwOFozIiU1RCUyQyJhY3Rpb24iJTNBIm9wZW4iJTJDInVzZXJJZCIlM0EiMTE2MzA2MTY5Mjk5NDQzNDcyMTAyIiUyQyJyZXNvdXJjZUtleXMiJTNBJTdCJTdEJTdEDQoNCmh0dHBzOi8vd3d3LmthZ2dsZS5jb20vZGF0YXNldHMvY2FuZ2dpaC91cHZvdGVkLWthZ2dsZS1rZXJuZWxzDQoNCg0K