E1U1

Nombre: Andrea Borboa Ramírez Matricula 00000164926

Fecha: 29/10/2021

1. ¿Qué es la estadística y que aplicaciones tiene en la Ingeniería en software?

La estadística son métodos, procedimientos y fórmulas que permiten recolectar información para luego analizarla y extraer de ella conclusiones relevantes. Su principal objetivo es mejorar la comprensión de los hechos a partir de la información disponible.

La estadística es importante en la ingeniería en software ya que ayuda a decidir entre diferentes variables para resolver ecuaciones complejas, se puede aplicar en diferentes especialidades del software como:

  • Software de aplicación: Son programas especialmente disectados para resolver problemas de estadística, hay muchos programas que no son específicamente estadísticos, pero ayudan a realizar cálculos aplicables a la estadística. Algunos ejemplos de ellos pueden ser: Excel, MiniTab, RStudio, Stata, SAS, Matlab, etc.

  • Minado de datos: La minería de datos es el proceso de hallar anomalías, patrones y correlaciones en grandes conjuntos de datos para predecir resultados.

  • Inteligencia de negocios: Son procesos, aplicaciones y tecnologías que facilitan la obtención de datos provenientes de los sistemas de gestión empresarial para su análisis e interpretación.

  • Inteligencia Artificial Integran distintos contrastes, estimaciones, transformaciones y modelos para conseguir una aproximación coherente y total en Análisis de Datos, estableciendo estrategias que dirijan el proceso de modelización, de elección de técnicas y transformaciones a aplicar, y de ayuda a la interpretación de los resultados.

2. Enliste y defina los tipos de variables usados en estadística, de 2 ejemplos de cada uno.

  • Cuantitativa: Las variables cuantitativas son aquellas variables estadísticas que otorgan, como resultado, un valor numérico.

    • Ejemplos de variables cuantitativas:

      • El peso, la altura o la cantidad de miembros en una familia.

      • La remuneración de los empleados en una empresa.

  • Cualitativa: La variable cualitativa es aquella variable estadística que expresa una cualidad, o característica, del objeto o individuo en cuestión.

    • Ejemplos de variables cualitativas:

      • Etnia o rasa

      • Profesión

3. Defina distribución de frecuencia y explique que es la distribución normal

  • Distribución de frecuencia: La distribución de frecuencias es la forma en la que un conjunto de datos se clasifica en distintos grupos excluyentes entre sí. Es decir, si un dato pertenece a un grupo no puede pertenecer a otro.

    • Tipos de distribuciones de frecuencia: los tipos de distribuciones de frecuencia son los siguientes:

      • Frecuencia absoluta(fi): Es la cantidad de observaciones que pertenecen a cada grupo. También, se interpreta como la cantidad de veces que se repite un suceso.

      • Frecuencia relativa(hi): Se calcula dividiendo la frecuencia absoluta entre el número de datos.

      • Frecuencia absoluta acumulada (Fi): Resulta de sumar las frecuencias absolutas de una clase o grupo de la muestra (o población) con la anterior o las anteriores.

      • Frecuencia relativa acumulada (Hi): Es el resultado de sumar las frecuencias relativas.

  • Distribución Normal: La distribución normal es una distribución con forma de campana donde las desviaciones estándar sucesivas con respecto a la media establecen valores de referencia para estimar el porcentaje de observaciones de los datos.

4. Importe los datos del archivo de Excel ‘pozos’ y conteste lo siguiente usando R:

## a) Ordene los datos de menor a mayor, indique el valor máximo / minimo y el rango total de datos:

  • Importación de datos:
library(pacman)
p_load("readxl", "prettydoc", "DT")
pozos <- read_excel("pozos.xlsx", col_types = c("numeric"))
library(readxl)
pozos <- read_excel("pozos.xlsx")
View(pozos)
Temp <- pozos$TEMP

PH <- pozos$PH
  • Ordenamos los datos de mayor a menor:

    • Datos de PH:
sort(PH)
##   [1] 6.1 6.3 6.4 6.4 6.4 6.4 6.4 6.4 6.4 6.5 6.5 6.5 6.5 6.5 6.5 6.5 6.5 6.5
##  [19] 6.5 6.5 6.5 6.5 6.5 6.5 6.5 6.5 6.6 6.6 6.6 6.6 6.6 6.6 6.6 6.6 6.6 6.6
##  [37] 6.6 6.6 6.6 6.6 6.6 6.6 6.6 6.6 6.6 6.6 6.6 6.6 6.6 6.7 6.7 6.7 6.7 6.7
##  [55] 6.7 6.7 6.7 6.7 6.8 6.8 6.8 6.8 6.8 6.8 6.8 6.8 6.8 6.8 6.8 6.8 6.8 6.8
##  [73] 6.8 6.8 6.8 6.8 6.8 6.8 6.8 6.8 6.8 6.8 6.8 6.8 6.8 6.8 6.8 6.8 6.8 6.8
##  [91] 6.8 6.8 6.8 6.8 6.8 6.8 6.8 6.8 6.8 6.8 6.8 6.8 6.8 6.8 6.8 6.8 6.8 6.8
## [109] 6.8 6.8 6.8 6.8 6.8 6.8 6.8 6.8 6.9 6.9 6.9 6.9 6.9 6.9 6.9 6.9 6.9 6.9
## [127] 6.9 6.9 6.9 6.9 6.9 6.9 6.9 6.9 6.9 6.9 6.9 6.9 6.9 6.9 6.9 6.9 6.9 6.9
## [145] 6.9 6.9 6.9 6.9 6.9 6.9 6.9 6.9 6.9 6.9 6.9 6.9 6.9 6.9 6.9 6.9 7.0 7.0
## [163] 7.0 7.0 7.0 7.0 7.0 7.0 7.0 7.0 7.0 7.0 7.0 7.0 7.0 7.0 7.0 7.0 7.0 7.0
## [181] 7.0 7.0 7.0 7.0 7.0 7.0 7.0 7.0 7.0 7.0 7.0 7.0 7.0 7.0 7.0 7.0 7.0 7.0
## [199] 7.0 7.0 7.0 7.0 7.0 7.0 7.0 7.0 7.0 7.0 7.0 7.0 7.0 7.0 7.0 7.0 7.0 7.0
## [217] 7.0 7.0 7.0 7.0 7.0 7.0 7.0 7.0 7.0 7.0 7.0 7.0 7.0 7.0 7.0 7.0 7.0 7.0
## [235] 7.0 7.0 7.0 7.0 7.1 7.1 7.1 7.1 7.1 7.1 7.1 7.1 7.1 7.1 7.1 7.1 7.1 7.1
## [253] 7.1 7.1 7.1 7.1 7.1 7.1 7.1 7.1 7.1 7.1 7.1 7.1 7.1 7.1 7.1 7.1 7.2 7.2
## [271] 7.2 7.2 7.2 7.2 7.2 7.2 7.2 7.2 7.2 7.2 7.3 7.3 7.3 7.3 7.3 7.3 7.4 7.4
## [289] 7.4 7.4 7.4 7.4 7.5
* Datos de TEMP:
sort(Temp)
##   [1] 25.6 25.8 26.2 26.3 26.3 26.4 26.4 26.8 26.8 26.9 27.0 27.0 27.1 27.2 27.2
##  [16] 27.3 27.3 27.3 27.3 27.4 27.4 27.4 27.4 27.4 27.5 27.5 27.5 27.5 27.5 27.5
##  [31] 27.5 27.5 27.5 27.5 27.5 27.5 27.6 27.7 27.7 27.7 27.7 27.8 27.8 27.8 27.8
##  [46] 27.8 27.8 27.8 27.8 27.8 27.8 27.8 27.9 27.9 27.9 27.9 27.9 27.9 27.9 27.9
##  [61] 27.9 27.9 27.9 27.9 27.9 27.9 28.0 28.0 28.0 28.0 28.0 28.0 28.0 28.0 28.0
##  [76] 28.0 28.0 28.0 28.0 28.0 28.0 28.0 28.0 28.0 28.1 28.1 28.1 28.2 28.2 28.2
##  [91] 28.2 28.2 28.2 28.2 28.2 28.2 28.2 28.2 28.2 28.3 28.3 28.3 28.3 28.3 28.3
## [106] 28.3 28.4 28.4 28.4 28.4 28.4 28.4 28.4 28.5 28.5 28.5 28.5 28.5 28.5 28.5
## [121] 28.5 28.5 28.6 28.6 28.6 28.6 28.6 28.6 28.6 28.6 28.6 28.6 28.6 28.6 28.6
## [136] 28.6 28.6 28.6 28.6 28.6 28.6 28.7 28.7 28.7 28.7 28.7 28.7 28.7 28.7 28.7
## [151] 28.7 28.7 28.7 28.7 28.8 28.8 28.8 28.8 28.8 28.8 28.8 28.8 28.8 28.8 28.8
## [166] 28.8 28.9 28.9 28.9 28.9 28.9 28.9 28.9 28.9 28.9 28.9 28.9 28.9 28.9 28.9
## [181] 28.9 28.9 28.9 28.9 29.0 29.0 29.0 29.0 29.0 29.0 29.0 29.0 29.0 29.0 29.0
## [196] 29.0 29.0 29.0 29.1 29.1 29.1 29.1 29.1 29.1 29.1 29.1 29.1 29.1 29.1 29.2
## [211] 29.2 29.2 29.2 29.2 29.2 29.2 29.2 29.2 29.2 29.2 29.2 29.2 29.2 29.3 29.3
## [226] 29.3 29.3 29.4 29.4 29.4 29.4 29.4 29.4 29.4 29.4 29.4 29.4 29.4 29.5 29.5
## [241] 29.5 29.5 29.5 29.5 29.5 29.5 29.5 29.6 29.6 29.6 29.7 29.7 29.8 29.8 29.8
## [256] 29.8 29.8 29.8 29.9 29.9 29.9 29.9 30.0 30.0 30.0 30.0 30.0 30.0 30.1 30.1
## [271] 30.1 30.1 30.2 30.2 30.2 30.3 30.3 30.3 30.3 30.4 30.5 30.6 30.8 30.9 31.1
## [286] 31.1 31.1 31.2 31.4 31.5 31.7 31.9 32.1
* Maximos y minimos de PH:
PHmax <- max(PH)
PHmin <-min(PH)
* Maximos y minimos de TEMP:
Tempmax <- max(Temp)
Tempmin <-min(Temp)
* Rango de Temp:
rango <-(Tempmax-Tempmin)
rango
## [1] 6.5
* Rango de PH:
rango <-(PHmax-PHmin)
rango
## [1] 1.4

b. Obtenga (el número de) los intervalos (o clases) usando la fórmula según Sturges y el ancho de clase.

  • Intervalos:

    *PH:

nclass.Sturges(PH)
## [1] 10
*Temp:
nclass.Sturges(Temp)
## [1] 10
  • Ancho de la clase:
A =(rango/10)
A
## [1] 0.14

c. Construya una tabla de frecuencias que incluya: límites de clases, frecuencia absoluta,frecuencia relativa, frecuencia relativa porcentual, frecuencia acumulada y explique a detalle que refleja esta tabla.

  • Tabla de frecuencia para Temp:
library(fdth)
## 
## Attaching package: 'fdth'
## The following objects are masked from 'package:stats':
## 
##     sd, var
tSturges <-fdt(Temp, breaks= "Sturges")
tSturges
##     Class limits  f   rf rf(%)  cf  cf(%)
##  [25.344,26.052)  2 0.01  0.68   2   0.68
##  [26.052,26.759)  5 0.02  1.71   7   2.39
##  [26.759,27.467) 17 0.06  5.80  24   8.19
##  [27.467,28.175) 63 0.22 21.50  87  29.69
##  [28.175,28.883) 79 0.27 26.96 166  56.66
##   [28.883,29.59) 81 0.28 27.65 247  84.30
##   [29.59,30.298) 28 0.10  9.56 275  93.86
##  [30.298,31.006)  9 0.03  3.07 284  96.93
##  [31.006,31.713)  7 0.02  2.39 291  99.32
##  [31.713,32.421)  2 0.01  0.68 293 100.00

El intervalo con una mayor frecuencia es [28.883 - 29.59] con una frecuencia de 81 y la menor frecuencia es de 2, esto se puede observar en 2 intervalos: [25.344 - 26.052] y [31.713 - 32.421]

  • Tabla de frecuencia para PH:
phSturges <-fdt(PH, breaks= "Sturges")
phSturges
##   Class limits   f   rf rf(%)  cf  cf(%)
##  [6.039,6.193)   1 0.00  0.34   1   0.34
##  [6.193,6.346)   1 0.00  0.34   2   0.68
##    [6.346,6.5)   7 0.02  2.39   9   3.07
##    [6.5,6.653)  40 0.14 13.65  49  16.72
##  [6.653,6.807)  67 0.23 22.87 116  39.59
##  [6.807,6.961)  44 0.15 15.02 160  54.61
##  [6.961,7.114) 108 0.37 36.86 268  91.47
##  [7.114,7.268)  12 0.04  4.10 280  95.56
##  [7.268,7.421)  12 0.04  4.10 292  99.66
##  [7.421,7.575)   1 0.00  0.34 293 100.00

En el intervalo de [6.961 - 7.114] se muestra una mayor frecuencia de datos con una frecuencia de 108, la menor frecuencia es de 1, esto se puede observar en 3 intervalos: [1.039 - 6.193], [6.193 - 6.346] y [7.421-7.575]

d. Elabore un histograma, polígono de frecuencias, histograma de frecuencias acumulado.

  • Histograma para el PH:
hist(x = pozos$PH, main = "Histograma de PH", 
     xlab = "Datos de PH", ylab = "Frecuencia", col="purple")

  • Histograma para el Temp:
hist(x = pozos$TEMP, main = "Histograma de Temperatura de pozos", 
     xlab = "Temperatura de pozos de agua subterranea", ylab = "Frecuencia", col="Blue")

  • Polígono de frecuencias PH:
plot(phSturges, type ="fp", main = "Polígono de frecuencias PH", 
     xlab = "Datos de PH", ylab = "Frecuencia", col="purple")

  • Polígono de frecuencias Temp:
plot(tSturges, type ="fp", main = "Polígono de frecuencias de Temperatura", 
     xlab = "Temperatura de los pozos de agua subterraneos", ylab = "Frecuencia", col="blue")

  • Histograma de frecuencia acumulado para PH:
plot(phSturges, type ="cfh", main = "Histograma de frecuencia acumulado PH", 
     xlab = "Datos de PH",ylab = "Frecuencia" , col="purple")

  • Histograma de frecuencia acumulada para Temp:
plot(tSturges, type ="cfh", main = "Histograma de frecuencia acumulado
de la temperatura de pozos subterraneos", 
     xlab = "Temperatura de pozos subterraneos",ylab = "Frecuencia" , col="blue")

e. Obtenga la mediana, la media y la moda

  • Media mediana y moda de PH:
mean(PH)
## [1] 6.890444
median(PH)
## [1] 6.9
mfv(PH)
## [1] 7
  • Media mediana y moda de Temp:
mean(Temp)
## [1] 28.69795
median(Temp)
## [1] 28.7
mfv(PH)
## [1] 7

f. Obtenga la varianza y la desviación estándar, interprete los resultados. ¿Pueden estas medidas ser negativas?

la Desviación Estándar y la varianza no pueden ser negativas, el valor mas bajo que pueden tomar ambas es de 0

  • Varianza de PH:
var(PH)
## [1] 0.04908645
  • Desviación estándar de PH:
sd(PH)
## [1] 0.2215546
  • Varianza de Temp:
var(Temp)
## [1] 1.035407
  • Desviación estándar de Temp:
sd(Temp)
## [1] 1.017549

g. Elabore gráfico de caja y bigote

  • Gráfico de caja y bigote PH:
boxplot(PH, main = "Gráfico de caja y bigote de PH", ylab="Datos de PH", col="Purple")

  • Gráfico de caja y bigote de Temp:
boxplot(PH, main = "Gráfico de caja y bigote de Temperatura", ylab="Temperatura de los pozos de agua", col="Blue")

h. Elabora una gráfica de dispersión de PH versus temperatura, use ggplot aquí. En base a esta gráfica: ¿Considera que estas 2 variables están relacionadas?

  • Diagrama de dispersión Ph vs Temperatura:
library(ggplot2)
ggplot(data = pozos)+geom_point(mapping = aes(x=Temp, y=PH),col='Blue',lwd=2)

  • Regresión TEMP vs PH
regresion <- lm(PH ~ TEMP, data=pozos)
summary(regresion)
## 
## Call:
## lm(formula = PH ~ TEMP, data = pozos)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -0.78955 -0.09220  0.01089  0.11089  0.59587 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  7.017231   0.366448  19.149   <2e-16 ***
## TEMP        -0.004418   0.012761  -0.346    0.729    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.2219 on 291 degrees of freedom
## Multiple R-squared:  0.0004117,  Adjusted R-squared:  -0.003023 
## F-statistic: 0.1199 on 1 and 291 DF,  p-value: 0.7294
plot(pozos$TEMP, pozos$PH, xlab="Temperatura del pozo", ylab="pH", col="Purple", lwd=2, main="Regresion Temp vs Ph")
abline(regresion)

*¿Considera que estas dos están relacionadas?

En base a las gráficas se puede concluir que si están ligeramente relacionadas ya que cuando sube la temperatura el PH acido aumenta.

LS0tDQp0aXRsZTogIkUxVTEiDQphdXRob3I6ICJOb21icmU6IEFuZHJlYSBCb3Jib2EgUmFtw61yZXogIE1hdHJpY3VsYSAwMDAwMDE2NDkyNiINCmRhdGU6ICJGZWNoYTogMjkvMTAvMjAyMSINCm91dHB1dDogIA0KICBybWRmb3JtYXRzOjpkb3duY3V0ZTogDQogICAgaGlnaGxpZ2h0OiB0YW5nbyANCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUgDQogICAgY29kZV9kb3dubG9hZDogVFJVRQ0KLS0tDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFKQ0KYGBgDQoNCg0KIyMgMS4Jwr9RdcOpIGVzIGxhIGVzdGFkw61zdGljYSB5IHF1ZSBhcGxpY2FjaW9uZXMgdGllbmUgZW4gbGEgSW5nZW5pZXLDrWEgZW4gc29mdHdhcmU/DQoNCkxhIGVzdGFkw61zdGljYSBzb24gbcOpdG9kb3MsIHByb2NlZGltaWVudG9zIHkgZsOzcm11bGFzIHF1ZSBwZXJtaXRlbiByZWNvbGVjdGFyIGluZm9ybWFjacOzbiBwYXJhIGx1ZWdvIGFuYWxpemFybGEgeSBleHRyYWVyIGRlIGVsbGEgY29uY2x1c2lvbmVzIHJlbGV2YW50ZXMuIFN1IHByaW5jaXBhbCBvYmpldGl2byBlcyBtZWpvcmFyIGxhIGNvbXByZW5zacOzbiBkZSBsb3MgaGVjaG9zIGEgcGFydGlyIGRlIGxhIGluZm9ybWFjacOzbiBkaXNwb25pYmxlLg0KDQpMYSBlc3RhZMOtc3RpY2EgZXMgaW1wb3J0YW50ZSBlbiBsYSBpbmdlbmllcsOtYSBlbiBzb2Z0d2FyZSB5YSBxdWUgYXl1ZGEgYSBkZWNpZGlyIGVudHJlIGRpZmVyZW50ZXMgdmFyaWFibGVzIHBhcmEgcmVzb2x2ZXIgZWN1YWNpb25lcyBjb21wbGVqYXMsIHNlIHB1ZWRlIGFwbGljYXIgZW4gZGlmZXJlbnRlcyBlc3BlY2lhbGlkYWRlcyBkZWwgc29mdHdhcmUgY29tbzoNCg0KKiBTb2Z0d2FyZSBkZSBhcGxpY2FjacOzbjogU29uIHByb2dyYW1hcyBlc3BlY2lhbG1lbnRlIGRpc2VjdGFkb3MgcGFyYSByZXNvbHZlciBwcm9ibGVtYXMgZGUgZXN0YWTDrXN0aWNhLCBoYXkgbXVjaG9zIHByb2dyYW1hcyBxdWUgbm8gc29uIGVzcGVjw61maWNhbWVudGUgZXN0YWTDrXN0aWNvcywgcGVybyBheXVkYW4gYSByZWFsaXphciBjw6FsY3Vsb3MgYXBsaWNhYmxlcyBhIGxhIGVzdGFkw61zdGljYS4gQWxndW5vcyBlamVtcGxvcyBkZSBlbGxvcyBwdWVkZW4gc2VyOiBFeGNlbCwgTWluaVRhYiwgUlN0dWRpbywgU3RhdGEsIFNBUywgTWF0bGFiLCBldGMuDQoNCiogTWluYWRvIGRlIGRhdG9zOiBMYSBtaW5lcsOtYSBkZSBkYXRvcyBlcyBlbCBwcm9jZXNvIGRlIGhhbGxhciBhbm9tYWzDrWFzLCBwYXRyb25lcyB5IGNvcnJlbGFjaW9uZXMgZW4gZ3JhbmRlcyBjb25qdW50b3MgZGUgZGF0b3MgcGFyYSBwcmVkZWNpciByZXN1bHRhZG9zLg0KDQoqIEludGVsaWdlbmNpYSBkZSBuZWdvY2lvczogU29uIHByb2Nlc29zLCBhcGxpY2FjaW9uZXMgeSB0ZWNub2xvZ8OtYXMgcXVlIGZhY2lsaXRhbiBsYSBvYnRlbmNpw7NuIGRlIGRhdG9zIHByb3ZlbmllbnRlcyBkZSBsb3Mgc2lzdGVtYXMgZGUgZ2VzdGnDs24gZW1wcmVzYXJpYWwgcGFyYSBzdSBhbsOhbGlzaXMgZSBpbnRlcnByZXRhY2nDs24uDQoNCiogSW50ZWxpZ2VuY2lhIEFydGlmaWNpYWwgSW50ZWdyYW4gZGlzdGludG9zIGNvbnRyYXN0ZXMsIGVzdGltYWNpb25lcywgdHJhbnNmb3JtYWNpb25lcyB5IG1vZGVsb3MgcGFyYSBjb25zZWd1aXIgdW5hIGFwcm94aW1hY2nDs24gY29oZXJlbnRlIHkgdG90YWwgZW4gQW7DoWxpc2lzIGRlIERhdG9zLCBlc3RhYmxlY2llbmRvIGVzdHJhdGVnaWFzIHF1ZSBkaXJpamFuIGVsIHByb2Nlc28gZGUgbW9kZWxpemFjacOzbiwgZGUgZWxlY2Npw7NuIGRlIHTDqWNuaWNhcyB5IHRyYW5zZm9ybWFjaW9uZXMgYSBhcGxpY2FyLCB5IGRlIGF5dWRhIGEgbGEgaW50ZXJwcmV0YWNpw7NuIGRlIGxvcyByZXN1bHRhZG9zLg0KDQojIyAyLglFbmxpc3RlIHkgZGVmaW5hIGxvcyB0aXBvcyBkZSB2YXJpYWJsZXMgdXNhZG9zIGVuIGVzdGFkw61zdGljYSwgZGUgMiBlamVtcGxvcyBkZSBjYWRhIHVuby4NCg0KKiBDdWFudGl0YXRpdmE6IExhcyB2YXJpYWJsZXMgY3VhbnRpdGF0aXZhcyBzb24gYXF1ZWxsYXMgdmFyaWFibGVzIGVzdGFkw61zdGljYXMgcXVlIG90b3JnYW4sIGNvbW8gcmVzdWx0YWRvLCB1biB2YWxvciBudW3DqXJpY28uDQoNCiAgICAqIEVqZW1wbG9zIGRlIHZhcmlhYmxlcyBjdWFudGl0YXRpdmFzOg0KDQogICAgICAgICogRWwgcGVzbywgbGEgYWx0dXJhIG8gbGEgY2FudGlkYWQgZGUgbWllbWJyb3MgZW4gdW5hIGZhbWlsaWEuDQoNCiAgICAgICAgKiBMYSByZW11bmVyYWNpw7NuIGRlIGxvcyBlbXBsZWFkb3MgZW4gdW5hIGVtcHJlc2EuDQoNCioJQ3VhbGl0YXRpdmE6IExhIHZhcmlhYmxlIGN1YWxpdGF0aXZhIGVzIGFxdWVsbGEgdmFyaWFibGUgZXN0YWTDrXN0aWNhIHF1ZSBleHByZXNhIHVuYSBjdWFsaWRhZCwgbyBjYXJhY3RlcsOtc3RpY2EsIGRlbCBvYmpldG8gbyBpbmRpdmlkdW8gZW4gY3Vlc3Rpw7NuLg0KDQogICAgKiBFamVtcGxvcyBkZSB2YXJpYWJsZXMgY3VhbGl0YXRpdmFzOg0KICAgIA0KICAgICAgICAqIEV0bmlhIG8gcmFzYQ0KICAgICAgICANCiAgICAgICAgKiBQcm9mZXNpw7NuDQoNCiMjIDMuCURlZmluYSBkaXN0cmlidWNpw7NuIGRlIGZyZWN1ZW5jaWEgeSBleHBsaXF1ZSBxdWUgZXMgbGEgZGlzdHJpYnVjacOzbiBub3JtYWwNCg0KKiBEaXN0cmlidWNpw7NuIGRlIGZyZWN1ZW5jaWE6DQpMYSBkaXN0cmlidWNpw7NuIGRlIGZyZWN1ZW5jaWFzIGVzIGxhIGZvcm1hIGVuIGxhIHF1ZSB1biBjb25qdW50byBkZSBkYXRvcyBzZSBjbGFzaWZpY2EgZW4gZGlzdGludG9zIGdydXBvcyBleGNsdXllbnRlcyBlbnRyZSBzw60uIEVzIGRlY2lyLCBzaSB1biBkYXRvIHBlcnRlbmVjZSBhIHVuIGdydXBvIG5vIHB1ZWRlIHBlcnRlbmVjZXIgYSBvdHJvLg0KDQogICAgKiBUaXBvcyBkZSBkaXN0cmlidWNpb25lcyBkZSBmcmVjdWVuY2lhOiBsb3MgdGlwb3MgZGUgZGlzdHJpYnVjaW9uZXMgZGUgZnJlY3VlbmNpYSBzb24gbG9zIHNpZ3VpZW50ZXM6DQoNCiAgICAgICAgKiBGcmVjdWVuY2lhIGFic29sdXRhKGZpKTogRXMgbGEgY2FudGlkYWQgZGUgb2JzZXJ2YWNpb25lcyBxdWUgcGVydGVuZWNlbiBhIGNhZGEgZ3J1cG8uIFRhbWJpw6luLCBzZSBpbnRlcnByZXRhIGNvbW8gbGEgY2FudGlkYWQgZGUgdmVjZXMgcXVlIHNlIHJlcGl0ZSB1biBzdWNlc28uIA0KIA0KICAgICAgICAqIEZyZWN1ZW5jaWEgcmVsYXRpdmEoaGkpOiBTZSBjYWxjdWxhIGRpdmlkaWVuZG8gbGEgZnJlY3VlbmNpYSBhYnNvbHV0YSBlbnRyZSBlbCBuw7ptZXJvIGRlIGRhdG9zLg0KIA0KICAgICAgICAqIEZyZWN1ZW5jaWEgYWJzb2x1dGEgYWN1bXVsYWRhIChGaSk6IFJlc3VsdGEgZGUgc3VtYXIgbGFzIGZyZWN1ZW5jaWFzIGFic29sdXRhcyBkZSB1bmEgY2xhc2UgbyBncnVwbyBkZSBsYSBtdWVzdHJhIChvIHBvYmxhY2nDs24pIGNvbiBsYSBhbnRlcmlvciBvIGxhcyBhbnRlcmlvcmVzLiANCiANCiAgICAgICAgKiBGcmVjdWVuY2lhIHJlbGF0aXZhIGFjdW11bGFkYSAoSGkpOiBFcyBlbCByZXN1bHRhZG8gZGUgc3VtYXIgbGFzIGZyZWN1ZW5jaWFzIHJlbGF0aXZhcy4NCiANCg0KKiBEaXN0cmlidWNpw7NuIE5vcm1hbDoNCkxhIGRpc3RyaWJ1Y2nDs24gbm9ybWFsIGVzIHVuYSBkaXN0cmlidWNpw7NuIGNvbiBmb3JtYSBkZSBjYW1wYW5hIGRvbmRlIGxhcyBkZXN2aWFjaW9uZXMgZXN0w6FuZGFyIHN1Y2VzaXZhcyBjb24gcmVzcGVjdG8gYSBsYSBtZWRpYSBlc3RhYmxlY2VuIHZhbG9yZXMgZGUgcmVmZXJlbmNpYSBwYXJhIGVzdGltYXIgZWwgcG9yY2VudGFqZSBkZSBvYnNlcnZhY2lvbmVzIGRlIGxvcyBkYXRvcy4gDQoNCiMjIDQuIEltcG9ydGUgbG9zIGRhdG9zIGRlbCBhcmNoaXZvIGRlIEV4Y2VsICdwb3pvcycgeSBjb250ZXN0ZSBsbyBzaWd1aWVudGUgdXNhbmRvIFI6DQoNCiAjIyBhKSBPcmRlbmUgbG9zIGRhdG9zIGRlIG1lbm9yIGEgbWF5b3IsIGluZGlxdWUgZWwgdmFsb3IgbcOheGltbyAvIG1pbmltbyB5IGVsIHJhbmdvIHRvdGFsIGRlIGRhdG9zOg0KIA0KKiBJbXBvcnRhY2nDs24gZGUgZGF0b3M6DQoNCmBgYHtyfQ0KbGlicmFyeShwYWNtYW4pDQpwX2xvYWQoInJlYWR4bCIsICJwcmV0dHlkb2MiLCAiRFQiKQ0KcG96b3MgPC0gcmVhZF9leGNlbCgicG96b3MueGxzeCIsIGNvbF90eXBlcyA9IGMoIm51bWVyaWMiKSkNCmxpYnJhcnkocmVhZHhsKQ0KcG96b3MgPC0gcmVhZF9leGNlbCgicG96b3MueGxzeCIpDQpWaWV3KHBvem9zKQ0KVGVtcCA8LSBwb3pvcyRURU1QDQoNClBIIDwtIHBvem9zJFBIDQpgYGANCg0KKiBPcmRlbmFtb3MgbG9zIGRhdG9zIGRlIG1heW9yIGEgbWVub3I6DQoNCiAgICAqIERhdG9zIGRlIFBIOg0KDQpgYGB7cn0NCnNvcnQoUEgpDQpgYGANCiAgICAqIERhdG9zIGRlIFRFTVA6DQoNCmBgYHtyfQ0Kc29ydChUZW1wKQ0KYGBgDQogICAgKiBNYXhpbW9zIHkgbWluaW1vcyBkZSBQSDoNCiAgICANCg0KYGBge3J9DQpQSG1heCA8LSBtYXgoUEgpDQpQSG1pbiA8LW1pbihQSCkNCmBgYA0KICAgICogTWF4aW1vcyB5IG1pbmltb3MgZGUgVEVNUDoNCiAgICANCg0KYGBge3J9DQoNClRlbXBtYXggPC0gbWF4KFRlbXApDQpUZW1wbWluIDwtbWluKFRlbXApDQoNCmBgYA0KICAgICogUmFuZ28gZGUgVGVtcDoNCg0KYGBge3J9DQpyYW5nbyA8LShUZW1wbWF4LVRlbXBtaW4pDQpyYW5nbw0KYGBgDQogICAgKiBSYW5nbyBkZSBQSDoNCg0KYGBge3J9DQpyYW5nbyA8LShQSG1heC1QSG1pbikNCnJhbmdvDQpgYGANCiMjIGIuIE9idGVuZ2EgKGVsIG7Dum1lcm8gZGUpIGxvcyBpbnRlcnZhbG9zIChvIGNsYXNlcykgdXNhbmRvIGxhIGbDs3JtdWxhIHNlZ8O6biBTdHVyZ2VzIHkgZWwgYW5jaG8gZGUgY2xhc2UuDQoNCiogSW50ZXJ2YWxvczoNCg0KICAgICpQSDoNCiAgICANCmBgYHtyfQ0KbmNsYXNzLlN0dXJnZXMoUEgpDQpgYGANCiAgICAqVGVtcDoNCiAgICANCmBgYHtyfQ0KbmNsYXNzLlN0dXJnZXMoVGVtcCkNCmBgYA0KKiBBbmNobyBkZSBsYSBjbGFzZToNCg0KYGBge3J9DQpBID0ocmFuZ28vMTApDQpBDQpgYGANCiMjIGMuIENvbnN0cnV5YSB1bmEgdGFibGEgZGUgZnJlY3VlbmNpYXMgcXVlIGluY2x1eWE6IGzDrW1pdGVzIGRlIGNsYXNlcywgZnJlY3VlbmNpYSBhYnNvbHV0YSxmcmVjdWVuY2lhIHJlbGF0aXZhLCBmcmVjdWVuY2lhIHJlbGF0aXZhIHBvcmNlbnR1YWwsIGZyZWN1ZW5jaWEgYWN1bXVsYWRhIHkgZXhwbGlxdWUgYSBkZXRhbGxlIHF1ZSByZWZsZWphIGVzdGEgdGFibGEuDQoNCiogVGFibGEgZGUgZnJlY3VlbmNpYSBwYXJhIFRlbXA6DQoNCmBgYHtyfQ0KbGlicmFyeShmZHRoKQ0KYGBgDQoNCmBgYHtyfQ0KdFN0dXJnZXMgPC1mZHQoVGVtcCwgYnJlYWtzPSAiU3R1cmdlcyIpDQp0U3R1cmdlcw0KYGBgDQpFbCBpbnRlcnZhbG8gY29uIHVuYSBtYXlvciBmcmVjdWVuY2lhIGVzIFsyOC44ODMgLSAyOS41OV0gY29uIHVuYSBmcmVjdWVuY2lhIGRlIDgxIHkgbGEgbWVub3IgZnJlY3VlbmNpYSBlcyBkZSAyLCBlc3RvIHNlIHB1ZWRlIG9ic2VydmFyIGVuIDIgaW50ZXJ2YWxvczogWzI1LjM0NCAtIDI2LjA1Ml0geSBbMzEuNzEzIC0gMzIuNDIxXQ0KDQoNCg0KKiBUYWJsYSBkZSBmcmVjdWVuY2lhIHBhcmEgUEg6DQoNCmBgYHtyfQ0KcGhTdHVyZ2VzIDwtZmR0KFBILCBicmVha3M9ICJTdHVyZ2VzIikNCnBoU3R1cmdlcw0KYGBgDQoNCkVuIGVsIGludGVydmFsbyBkZSBbNi45NjEgLSA3LjExNF0gc2UgbXVlc3RyYSB1bmEgbWF5b3IgZnJlY3VlbmNpYSBkZSBkYXRvcyBjb24gdW5hIGZyZWN1ZW5jaWEgZGUgMTA4LCBsYSBtZW5vciBmcmVjdWVuY2lhIGVzIGRlIDEsIGVzdG8gc2UgcHVlZGUgb2JzZXJ2YXIgZW4gMyBpbnRlcnZhbG9zOiBbMS4wMzkgLSA2LjE5M10sIFs2LjE5MyAtIDYuMzQ2XSB5IFs3LjQyMS03LjU3NV0gDQoNCg0KIyMgZC4gRWxhYm9yZSB1biBoaXN0b2dyYW1hLCBwb2zDrWdvbm8gZGUgZnJlY3VlbmNpYXMsIGhpc3RvZ3JhbWEgZGUgZnJlY3VlbmNpYXMgYWN1bXVsYWRvLg0KDQoqIEhpc3RvZ3JhbWEgcGFyYSBlbCBQSDoNCg0KYGBge3J9DQpoaXN0KHggPSBwb3pvcyRQSCwgbWFpbiA9ICJIaXN0b2dyYW1hIGRlIFBIIiwgDQogICAgIHhsYWIgPSAiRGF0b3MgZGUgUEgiLCB5bGFiID0gIkZyZWN1ZW5jaWEiLCBjb2w9InB1cnBsZSIpDQpgYGANCg0KKiBIaXN0b2dyYW1hIHBhcmEgZWwgVGVtcDoNCg0KYGBge3J9DQpoaXN0KHggPSBwb3pvcyRURU1QLCBtYWluID0gIkhpc3RvZ3JhbWEgZGUgVGVtcGVyYXR1cmEgZGUgcG96b3MiLCANCiAgICAgeGxhYiA9ICJUZW1wZXJhdHVyYSBkZSBwb3pvcyBkZSBhZ3VhIHN1YnRlcnJhbmVhIiwgeWxhYiA9ICJGcmVjdWVuY2lhIiwgY29sPSJCbHVlIikNCmBgYA0KDQoqIFBvbMOtZ29ubyBkZSBmcmVjdWVuY2lhcyBQSDoNCg0KYGBge3J9DQpwbG90KHBoU3R1cmdlcywgdHlwZSA9ImZwIiwgbWFpbiA9ICJQb2zDrWdvbm8gZGUgZnJlY3VlbmNpYXMgUEgiLCANCiAgICAgeGxhYiA9ICJEYXRvcyBkZSBQSCIsIHlsYWIgPSAiRnJlY3VlbmNpYSIsIGNvbD0icHVycGxlIikNCmBgYA0KDQoqIFBvbMOtZ29ubyBkZSBmcmVjdWVuY2lhcyBUZW1wOg0KDQpgYGB7cn0NCnBsb3QodFN0dXJnZXMsIHR5cGUgPSJmcCIsIG1haW4gPSAiUG9sw61nb25vIGRlIGZyZWN1ZW5jaWFzIGRlIFRlbXBlcmF0dXJhIiwgDQogICAgIHhsYWIgPSAiVGVtcGVyYXR1cmEgZGUgbG9zIHBvem9zIGRlIGFndWEgc3VidGVycmFuZW9zIiwgeWxhYiA9ICJGcmVjdWVuY2lhIiwgY29sPSJibHVlIikNCmBgYA0KDQoqIEhpc3RvZ3JhbWEgZGUgZnJlY3VlbmNpYSBhY3VtdWxhZG8gcGFyYSBQSDoNCg0KYGBge3J9DQpwbG90KHBoU3R1cmdlcywgdHlwZSA9ImNmaCIsIG1haW4gPSAiSGlzdG9ncmFtYSBkZSBmcmVjdWVuY2lhIGFjdW11bGFkbyBQSCIsIA0KICAgICB4bGFiID0gIkRhdG9zIGRlIFBIIix5bGFiID0gIkZyZWN1ZW5jaWEiICwgY29sPSJwdXJwbGUiKQ0KYGBgDQoNCg0KKiBIaXN0b2dyYW1hIGRlIGZyZWN1ZW5jaWEgYWN1bXVsYWRhIHBhcmEgVGVtcDoNCg0KYGBge3J9DQpwbG90KHRTdHVyZ2VzLCB0eXBlID0iY2ZoIiwgbWFpbiA9ICJIaXN0b2dyYW1hIGRlIGZyZWN1ZW5jaWEgYWN1bXVsYWRvDQpkZSBsYSB0ZW1wZXJhdHVyYSBkZSBwb3pvcyBzdWJ0ZXJyYW5lb3MiLCANCiAgICAgeGxhYiA9ICJUZW1wZXJhdHVyYSBkZSBwb3pvcyBzdWJ0ZXJyYW5lb3MiLHlsYWIgPSAiRnJlY3VlbmNpYSIgLCBjb2w9ImJsdWUiKQ0KYGBgDQoNCg0KIyMgZS4gT2J0ZW5nYSBsYSBtZWRpYW5hLCBsYSBtZWRpYSB5IGxhIG1vZGENCg0KKiBNZWRpYSBtZWRpYW5hIHkgbW9kYSBkZSBQSDoNCg0KYGBge3J9DQptZWFuKFBIKQ0KbWVkaWFuKFBIKQ0KbWZ2KFBIKQ0KYGBgDQoqIE1lZGlhIG1lZGlhbmEgeSBtb2RhIGRlIFRlbXA6DQoNCmBgYHtyfQ0KbWVhbihUZW1wKQ0KbWVkaWFuKFRlbXApDQptZnYoUEgpDQpgYGANCg0KIyMgZi4gT2J0ZW5nYSBsYSB2YXJpYW56YSB5IGxhIGRlc3ZpYWNpw7NuIGVzdMOhbmRhciwgaW50ZXJwcmV0ZSBsb3MgcmVzdWx0YWRvcy4gwr9QdWVkZW4gZXN0YXMgbWVkaWRhcyBzZXIgbmVnYXRpdmFzPw0KDQpsYSBEZXN2aWFjacOzbiBFc3TDoW5kYXIgeSBsYSB2YXJpYW56YSBubyBwdWVkZW4gc2VyIG5lZ2F0aXZhcywgZWwgdmFsb3IgbWFzIGJham8gcXVlIHB1ZWRlbiB0b21hciBhbWJhcyBlcyBkZSAwDQoNCiogVmFyaWFuemEgZGUgUEg6DQoNCmBgYHtyfQ0KdmFyKFBIKQ0KYGBgDQoqIERlc3ZpYWNpw7NuIGVzdMOhbmRhciBkZSBQSDoNCg0KYGBge3J9DQpzZChQSCkNCmBgYA0KKiBWYXJpYW56YSBkZSBUZW1wOg0KDQpgYGB7cn0NCnZhcihUZW1wKQ0KYGBgDQoqIERlc3ZpYWNpw7NuIGVzdMOhbmRhciBkZSBUZW1wOg0KDQpgYGB7cn0NCnNkKFRlbXApDQpgYGANCiMjIGcuIEVsYWJvcmUgZ3LDoWZpY28gZGUgY2FqYSB5IGJpZ290ZQ0KDQoqIEdyw6FmaWNvIGRlIGNhamEgeSBiaWdvdGUgUEg6DQoNCmBgYHtyfQ0KYm94cGxvdChQSCwgbWFpbiA9ICJHcsOhZmljbyBkZSBjYWphIHkgYmlnb3RlIGRlIFBIIiwgeWxhYj0iRGF0b3MgZGUgUEgiLCBjb2w9IlB1cnBsZSIpDQpgYGANCg0KKiBHcsOhZmljbyBkZSBjYWphIHkgYmlnb3RlIGRlIFRlbXA6DQoNCmBgYHtyfQ0KYm94cGxvdChQSCwgbWFpbiA9ICJHcsOhZmljbyBkZSBjYWphIHkgYmlnb3RlIGRlIFRlbXBlcmF0dXJhIiwgeWxhYj0iVGVtcGVyYXR1cmEgZGUgbG9zIHBvem9zIGRlIGFndWEiLCBjb2w9IkJsdWUiKQ0KYGBgDQoNCiMjIGguIEVsYWJvcmEgdW5hIGdyw6FmaWNhIGRlIGRpc3BlcnNpw7NuIGRlIFBIIHZlcnN1cyB0ZW1wZXJhdHVyYSwgdXNlIGdncGxvdCBhcXXDrS4gRW4gYmFzZSBhIGVzdGEgZ3LDoWZpY2E6IMK/Q29uc2lkZXJhIHF1ZSBlc3RhcyAyIHZhcmlhYmxlcyBlc3TDoW4gcmVsYWNpb25hZGFzPyANCg0KKiBEaWFncmFtYSBkZSBkaXNwZXJzacOzbiBQaCB2cyBUZW1wZXJhdHVyYToNCg0KYGBge3J9DQpsaWJyYXJ5KGdncGxvdDIpDQpnZ3Bsb3QoZGF0YSA9IHBvem9zKStnZW9tX3BvaW50KG1hcHBpbmcgPSBhZXMoeD1UZW1wLCB5PVBIKSxjb2w9J0JsdWUnLGx3ZD0yKQ0KYGBgDQoNCiogUmVncmVzacOzbiBURU1QIHZzIFBIDQoNCmBgYHtyfQ0KcmVncmVzaW9uIDwtIGxtKFBIIH4gVEVNUCwgZGF0YT1wb3pvcykNCnN1bW1hcnkocmVncmVzaW9uKQ0KYGBgDQpgYGB7cn0NCnBsb3QocG96b3MkVEVNUCwgcG96b3MkUEgsIHhsYWI9IlRlbXBlcmF0dXJhIGRlbCBwb3pvIiwgeWxhYj0icEgiLCBjb2w9IlB1cnBsZSIsIGx3ZD0yLCBtYWluPSJSZWdyZXNpb24gVGVtcCB2cyBQaCIpDQphYmxpbmUocmVncmVzaW9uKQ0KYGBgDQoNCg0KKsK/Q29uc2lkZXJhIHF1ZSBlc3RhcyBkb3MgZXN0w6FuIHJlbGFjaW9uYWRhcz8gDQoNCkVuIGJhc2UgYSBsYXMgZ3LDoWZpY2FzIHNlIHB1ZWRlIGNvbmNsdWlyIHF1ZSBzaSBlc3TDoW4gbGlnZXJhbWVudGUgcmVsYWNpb25hZGFzIHlhIHF1ZSBjdWFuZG8gc3ViZSBsYSB0ZW1wZXJhdHVyYSBlbCBQSCBhY2lkbyBhdW1lbnRhLiANCg0KDQoNCg0K