Universidad Nacional del Oeste

Introducción

El presente trabajo práctico aborda el cálculo de probabilidades sobre distribuciones teóricas (Normal y t de Student) y el análisis de normalidad e intervalos de confianza sobre datos reales de composición corporal, siguiendo los lineamientos de inferencia estadística de las Clases 2 y 3 (Pérez, 2026).


Parte 1 — Distribuciones teóricas

Ejercicio 1 — Valor mínimo del 10% que más gana

Los ingresos mensuales (en millones de $) siguen una distribución Normal con media 1 y desvío 0,3. Se busca el percentil 90, es decir, el valor mínimo que separa al 10% de mayores ingresos.

valor_min <- qnorm(0.90, mean = 1, sd = 0.3)
valor_min
## [1] 1.384465

El valor mínimo para pertenecer al 10% que más gana es 1.3845 millones de $.


Ejercicio 2 — Probabilidad de cobrar más de $900.000

Se calcula P(X > 0,9) bajo la misma distribución Normal(1 ; 0,3).

prob <- 1 - pnorm(0.9, mean = 1, sd = 0.3)
prob
## [1] 0.6305587

La probabilidad de que un trabajador cobre más de $900.000 es 63.06%.


Ejercicio 3 — Probabilidad en t-Student con 4 gl

Se calcula P(-2 < T < 2) bajo una distribución t de Student con 4 grados de libertad.

prob_t <- pt(2, df = 4) - pt(-2, df = 4)
prob_t
## [1] 0.8838835

La probabilidad del intervalo (-2 ; 2) es 88.39%.


Parte 2 — Dataset obesidad

Carga de datos

datos <- read.csv("obesidad_tp1.csv", sep = ";", dec = ",")
str(datos)
## 'data.frame':    249 obs. of  2 variables:
##  $ grc : num  10.4 6.3 20.9 18.8 27 4.1 11.7 7.1 7.8 25.4 ...
##  $ peso: num  185 155 210 171 168 ...
summary(datos)
##       grc             peso      
##  Min.   : 0.00   Min.   :118.5  
##  1st Qu.:12.50   1st Qu.:159.2  
##  Median :19.20   Median :176.8  
##  Mean   :19.21   Mean   :179.1  
##  3rd Qu.:25.30   3rd Qu.:197.0  
##  Max.   :47.50   Max.   :363.1

Ejercicio 4 — Pruebas de normalidad

Dado que n = 249, se utilizan los tests de Lilliefors y Anderson-Darling, apropiados para muestras grandes (Diapositiva 18, Clase 3). Shapiro-Wilk no corresponde ya que está indicado para n < 50.

Tests estadísticos

lt_grc  <- lillie.test(datos$grc)
lt_peso <- lillie.test(datos$peso)
ad_grc  <- ad.test(datos$grc)
ad_peso <- ad.test(datos$peso)

lt_grc;  lt_peso
## 
##  Lilliefors (Kolmogorov-Smirnov) normality test
## 
## data:  datos$grc
## D = 0.041844, p-value = 0.3583
## 
##  Lilliefors (Kolmogorov-Smirnov) normality test
## 
## data:  datos$peso
## D = 0.058731, p-value = 0.03699
ad_grc;  ad_peso
## 
##  Anderson-Darling normality test
## 
## data:  datos$grc
## A = 0.41153, p-value = 0.3383
## 
##  Anderson-Darling normality test
## 
## data:  datos$peso
## A = 1.2248, p-value = 0.003373

Tabla resumen

resultados_norm <- data.frame(
  Variable = c("grc", "grc", "peso", "peso"),
  Test     = c("Lilliefors", "Anderson-Darling",
               "Lilliefors", "Anderson-Darling"),
  p_valor  = c(round(lt_grc$p.value,  4),
               round(ad_grc$p.value,  4),
               round(lt_peso$p.value, 4),
               round(ad_peso$p.value, 4)),
  Decisión = c(
    ifelse(lt_grc$p.value  > 0.05, "No se rechaza H₀ → Normal", "Se rechaza H₀ → No normal"),
    ifelse(ad_grc$p.value  > 0.05, "No se rechaza H₀ → Normal", "Se rechaza H₀ → No normal"),
    ifelse(lt_peso$p.value > 0.05, "No se rechaza H₀ → Normal", "Se rechaza H₀ → No normal"),
    ifelse(ad_peso$p.value > 0.05, "No se rechaza H₀ → Normal", "Se rechaza H₀ → No normal")
  )
)

kable(resultados_norm,
      col.names = c("Variable", "Test", "p-valor", "Decisión (α = 0.05)"),
      align = c("l", "l", "c", "l"))
Variable Test p-valor Decisión (α = 0.05)
grc Lilliefors 0.3583 No se rechaza H₀ → Normal
grc Anderson-Darling 0.3383 No se rechaza H₀ → Normal
peso Lilliefors 0.0370 Se rechaza H₀ → No normal
peso Anderson-Darling 0.0034 Se rechaza H₀ → No normal

QQ-Plots

p1 <- ggplot(datos, aes(sample = grc)) +
  stat_qq(color = "steelblue") +
  stat_qq_line(color = "red") +
  labs(title = "QQ-Plot — GRC",
       x = "Cuantiles teóricos", y = "Cuantiles observados") +
  theme_minimal()

p2 <- ggplot(datos, aes(sample = peso)) +
  stat_qq(color = "darkorange") +
  stat_qq_line(color = "red") +
  labs(title = "QQ-Plot — PESO",
       x = "Cuantiles teóricos", y = "Cuantiles observados") +
  theme_minimal()

grid.arrange(p1, p2, ncol = 2)

Histogramas con curva normal

p3 <- ggplot(datos, aes(x = grc)) +
  geom_histogram(aes(y = after_stat(density)),
                 fill = "steelblue", color = "white", bins = 20) +
  stat_function(fun = dnorm,
                args = list(mean = mean(datos$grc), sd = sd(datos$grc)),
                color = "red", linewidth = 1) +
  labs(title = "Histograma — GRC", x = "grc", y = "Densidad") +
  theme_minimal()

p4 <- ggplot(datos, aes(x = peso)) +
  geom_histogram(aes(y = after_stat(density)),
                 fill = "darkorange", color = "white", bins = 20) +
  stat_function(fun = dnorm,
                args = list(mean = mean(datos$peso), sd = sd(datos$peso)),
                color = "red", linewidth = 1) +
  labs(title = "Histograma — PESO", x = "peso", y = "Densidad") +
  theme_minimal()

grid.arrange(p3, p4, ncol = 2)

Nota: los histogramas con curva normal superpuesta permiten visualizar claramente por qué peso no puede considerarse normal: presenta una cola derecha pronunciada producto de valores extremos.

Conclusión: La variable grc presenta p-valores mayores a 0,05 en ambos tests por lo que puede considerarse normal. La variable peso presenta p-valores menores a 0,05 por lo que no puede considerarse normal.


Ejercicio 5 — IC 95% para la media de grasa corporal

Dado que grc es normal y la varianza poblacional es desconocida, se utiliza la distribución t-Student con n-1 grados de libertad (Diapositiva 14-15, Clase 2).

ic_grc <- t.test(datos$grc, conf.level = 0.95)
ic_grc
## 
##  One Sample t-test
## 
## data:  datos$grc
## t = 36.262, df = 248, p-value < 2.2e-16
## alternative hypothesis: true mean is not equal to 0
## 95 percent confidence interval:
##  18.16284 20.24921
## sample estimates:
## mean of x 
##  19.20602
tabla_ic <- data.frame(
  Media     = round(ic_grc$estimate, 4),
  LI        = round(ic_grc$conf.int[1], 4),
  LS        = round(ic_grc$conf.int[2], 4),
  Confianza = "95%",
  gl        = ic_grc$parameter
)
rownames(tabla_ic) <- NULL

kable(tabla_ic,
      col.names = c("Media muestral", "Límite inferior",
                    "Límite superior", "Confianza", "gl"),
      align = c("c", "c", "c", "c", "c"))
Media muestral Límite inferior Límite superior Confianza gl
19.206 18.1628 20.2492 95% 248

Conclusión: Se tiene una confianza del 95% de que el intervalo [18.16 ; 20.25] contiene a la verdadera media poblacional de grasa corporal, utilizando el estadístico t con 248 grados de libertad.


Referencias

Pérez, S. N. (2026). Fundamentos de Estadística [Diapositivas de las Clases 2 y 3]. Especialización en Ciencia de Datos, Universidad Nacional del Oeste.

Devore, J. L. (2008). Probabilidad y estadística para ingeniería y ciencias (7ma ed.). Cengage Learning.

LS0tDQp0aXRsZTogIlRQMSDigJQgRnVuZGFtZW50b3MgZGUgRXN0YWTDrXN0aWNhIg0KYXV0aG9yOiAiW0VkdWFyZG8gw4FybmljYV0oaHR0cHM6Ly9saW5rdHIuZWUvZWR1YXJkb2FybmljYSkiDQpkYXRlOiAiQ29ob3J0ZSAyMDI2Ig0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50Og0KICAgIHRvYzogdHJ1ZQ0KICAgIHRvY19mbG9hdDogdHJ1ZQ0KICAgIGNvZGVfZm9sZGluZzogc2hvdw0KICAgIGRmX3ByaW50OiBwYWdlZA0KICAgIHRoZW1lOiB1bml0ZWQNCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQogIHBkZl9kb2N1bWVudDoNCiAgICB0b2M6IHRydWUNCi0tLQ0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSwgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UpDQoNCnJtKGxpc3QgPSBscygpKQ0KZ3JhcGhpY3Mub2ZmKCkNCg0KbGlicmFyeShub3J0ZXN0KQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkoa25pdHIpDQpsaWJyYXJ5KGdyaWRFeHRyYSkNCmBgYA0KDQo8Y2VudGVyPg0KICA8aW1nIHNyYz0iRXNjdWRvLnBuZyIgYWx0PSJVbml2ZXJzaWRhZCBOYWNpb25hbCBkZWwgT2VzdGUiIHdpZHRoPSIyMDBweCI+DQogIDxicj48YnI+DQo8L2NlbnRlcj4NCg0KIyMgSW50cm9kdWNjacOzbg0KDQpFbCBwcmVzZW50ZSB0cmFiYWpvIHByw6FjdGljbyBhYm9yZGEgZWwgY8OhbGN1bG8gZGUgcHJvYmFiaWxpZGFkZXMgc29icmUNCmRpc3RyaWJ1Y2lvbmVzIHRlw7NyaWNhcyAoTm9ybWFsIHkgdCBkZSBTdHVkZW50KSB5IGVsIGFuw6FsaXNpcyBkZSBub3JtYWxpZGFkDQplIGludGVydmFsb3MgZGUgY29uZmlhbnphIHNvYnJlIGRhdG9zIHJlYWxlcyBkZSBjb21wb3NpY2nDs24gY29ycG9yYWwsDQpzaWd1aWVuZG8gbG9zIGxpbmVhbWllbnRvcyBkZSBpbmZlcmVuY2lhIGVzdGFkw61zdGljYSBkZSBsYXMgQ2xhc2VzIDIgeSAzDQooUMOpcmV6LCAyMDI2KS4NCg0KLS0tDQoNCiMgUGFydGUgMSDigJQgRGlzdHJpYnVjaW9uZXMgdGXDs3JpY2FzDQoNCiMjIEVqZXJjaWNpbyAxIOKAlCBWYWxvciBtw61uaW1vIGRlbCAxMCUgcXVlIG3DoXMgZ2FuYQ0KDQpMb3MgaW5ncmVzb3MgbWVuc3VhbGVzIChlbiBtaWxsb25lcyBkZSAkKSBzaWd1ZW4gdW5hIGRpc3RyaWJ1Y2nDs24gTm9ybWFsDQpjb24gbWVkaWEgMSB5IGRlc3bDrW8gMCwzLiBTZSBidXNjYSBlbCAqKnBlcmNlbnRpbCA5MCoqLCBlcyBkZWNpciwgZWwgdmFsb3INCm3DrW5pbW8gcXVlIHNlcGFyYSBhbCAxMCUgZGUgbWF5b3JlcyBpbmdyZXNvcy4NCg0KYGBge3IgZWoxfQ0KdmFsb3JfbWluIDwtIHFub3JtKDAuOTAsIG1lYW4gPSAxLCBzZCA9IDAuMykNCnZhbG9yX21pbg0KYGBgDQoNCkVsIHZhbG9yIG3DrW5pbW8gcGFyYSBwZXJ0ZW5lY2VyIGFsIDEwJSBxdWUgbcOhcyBnYW5hIGVzDQoqKmByIHJvdW5kKHZhbG9yX21pbiwgNClgKiogbWlsbG9uZXMgZGUgJC4NCg0KLS0tDQoNCiMjIEVqZXJjaWNpbyAyIOKAlCBQcm9iYWJpbGlkYWQgZGUgY29icmFyIG3DoXMgZGUgJDkwMC4wMDANCg0KU2UgY2FsY3VsYSBQKFggPiAwLDkpIGJham8gbGEgbWlzbWEgZGlzdHJpYnVjacOzbiBOb3JtYWwoMSA7IDAsMykuDQoNCmBgYHtyIGVqMn0NCnByb2IgPC0gMSAtIHBub3JtKDAuOSwgbWVhbiA9IDEsIHNkID0gMC4zKQ0KcHJvYg0KYGBgDQoNCkxhIHByb2JhYmlsaWRhZCBkZSBxdWUgdW4gdHJhYmFqYWRvciBjb2JyZSBtw6FzIGRlICQ5MDAuMDAwIGVzDQoqKmByIHJvdW5kKHByb2IgKiAxMDAsIDIpYCUqKi4NCg0KLS0tDQoNCiMjIEVqZXJjaWNpbyAzIOKAlCBQcm9iYWJpbGlkYWQgZW4gdC1TdHVkZW50IGNvbiA0IGdsDQoNClNlIGNhbGN1bGEgUCgtMiA8IFQgPCAyKSBiYWpvIHVuYSBkaXN0cmlidWNpw7NuIHQgZGUgU3R1ZGVudCBjb24NCjQgZ3JhZG9zIGRlIGxpYmVydGFkLg0KDQpgYGB7ciBlajN9DQpwcm9iX3QgPC0gcHQoMiwgZGYgPSA0KSAtIHB0KC0yLCBkZiA9IDQpDQpwcm9iX3QNCmBgYA0KDQpMYSBwcm9iYWJpbGlkYWQgZGVsIGludGVydmFsbyAoLTIgOyAyKSBlcyAqKmByIHJvdW5kKHByb2JfdCAqIDEwMCwgMilgJSoqLg0KDQotLS0NCg0KIyBQYXJ0ZSAyIOKAlCBEYXRhc2V0IG9iZXNpZGFkDQoNCiMjIENhcmdhIGRlIGRhdG9zDQoNCmBgYHtyIGRhdG9zX3N0cn0NCmRhdG9zIDwtIHJlYWQuY3N2KCJvYmVzaWRhZF90cDEuY3N2Iiwgc2VwID0gIjsiLCBkZWMgPSAiLCIpDQpzdHIoZGF0b3MpDQpgYGANCg0KYGBge3IgZGF0b3Nfc3VtbWFyeX0NCnN1bW1hcnkoZGF0b3MpDQpgYGANCg0KLS0tDQoNCiMjIEVqZXJjaWNpbyA0IOKAlCBQcnVlYmFzIGRlIG5vcm1hbGlkYWQNCg0KRGFkbyBxdWUgbiA9IDI0OSwgc2UgdXRpbGl6YW4gbG9zIHRlc3RzIGRlICoqTGlsbGllZm9ycyoqIHkNCioqQW5kZXJzb24tRGFybGluZyoqLCBhcHJvcGlhZG9zIHBhcmEgbXVlc3RyYXMgZ3JhbmRlcw0KKERpYXBvc2l0aXZhIDE4LCBDbGFzZSAzKS4gU2hhcGlyby1XaWxrIG5vIGNvcnJlc3BvbmRlIHlhIHF1ZQ0KZXN0w6EgaW5kaWNhZG8gcGFyYSBuIDwgNTAuDQoNCiMjIyBUZXN0cyBlc3RhZMOtc3RpY29zDQoNCmBgYHtyIG5vcm1hbGlkYWR9DQpsdF9ncmMgIDwtIGxpbGxpZS50ZXN0KGRhdG9zJGdyYykNCmx0X3Blc28gPC0gbGlsbGllLnRlc3QoZGF0b3MkcGVzbykNCmFkX2dyYyAgPC0gYWQudGVzdChkYXRvcyRncmMpDQphZF9wZXNvIDwtIGFkLnRlc3QoZGF0b3MkcGVzbykNCg0KbHRfZ3JjOyAgbHRfcGVzbw0KYWRfZ3JjOyAgYWRfcGVzbw0KYGBgDQoNCiMjIyBUYWJsYSByZXN1bWVuDQoNCmBgYHtyIHRhYmxhX25vcm1hbGlkYWR9DQpyZXN1bHRhZG9zX25vcm0gPC0gZGF0YS5mcmFtZSgNCiAgVmFyaWFibGUgPSBjKCJncmMiLCAiZ3JjIiwgInBlc28iLCAicGVzbyIpLA0KICBUZXN0ICAgICA9IGMoIkxpbGxpZWZvcnMiLCAiQW5kZXJzb24tRGFybGluZyIsDQogICAgICAgICAgICAgICAiTGlsbGllZm9ycyIsICJBbmRlcnNvbi1EYXJsaW5nIiksDQogIHBfdmFsb3IgID0gYyhyb3VuZChsdF9ncmMkcC52YWx1ZSwgIDQpLA0KICAgICAgICAgICAgICAgcm91bmQoYWRfZ3JjJHAudmFsdWUsICA0KSwNCiAgICAgICAgICAgICAgIHJvdW5kKGx0X3Blc28kcC52YWx1ZSwgNCksDQogICAgICAgICAgICAgICByb3VuZChhZF9wZXNvJHAudmFsdWUsIDQpKSwNCiAgRGVjaXNpw7NuID0gYygNCiAgICBpZmVsc2UobHRfZ3JjJHAudmFsdWUgID4gMC4wNSwgIk5vIHNlIHJlY2hhemEgSOKCgCDihpIgTm9ybWFsIiwgIlNlIHJlY2hhemEgSOKCgCDihpIgTm8gbm9ybWFsIiksDQogICAgaWZlbHNlKGFkX2dyYyRwLnZhbHVlICA+IDAuMDUsICJObyBzZSByZWNoYXphIEjigoAg4oaSIE5vcm1hbCIsICJTZSByZWNoYXphIEjigoAg4oaSIE5vIG5vcm1hbCIpLA0KICAgIGlmZWxzZShsdF9wZXNvJHAudmFsdWUgPiAwLjA1LCAiTm8gc2UgcmVjaGF6YSBI4oKAIOKGkiBOb3JtYWwiLCAiU2UgcmVjaGF6YSBI4oKAIOKGkiBObyBub3JtYWwiKSwNCiAgICBpZmVsc2UoYWRfcGVzbyRwLnZhbHVlID4gMC4wNSwgIk5vIHNlIHJlY2hhemEgSOKCgCDihpIgTm9ybWFsIiwgIlNlIHJlY2hhemEgSOKCgCDihpIgTm8gbm9ybWFsIikNCiAgKQ0KKQ0KDQprYWJsZShyZXN1bHRhZG9zX25vcm0sDQogICAgICBjb2wubmFtZXMgPSBjKCJWYXJpYWJsZSIsICJUZXN0IiwgInAtdmFsb3IiLCAiRGVjaXNpw7NuICjOsSA9IDAuMDUpIiksDQogICAgICBhbGlnbiA9IGMoImwiLCAibCIsICJjIiwgImwiKSkNCmBgYA0KDQojIyMgUVEtUGxvdHMNCg0KYGBge3IgcXFwbG90cywgZmlnLndpZHRoPTEwLCBmaWcuaGVpZ2h0PTR9DQpwMSA8LSBnZ3Bsb3QoZGF0b3MsIGFlcyhzYW1wbGUgPSBncmMpKSArDQogIHN0YXRfcXEoY29sb3IgPSAic3RlZWxibHVlIikgKw0KICBzdGF0X3FxX2xpbmUoY29sb3IgPSAicmVkIikgKw0KICBsYWJzKHRpdGxlID0gIlFRLVBsb3Qg4oCUIEdSQyIsDQogICAgICAgeCA9ICJDdWFudGlsZXMgdGXDs3JpY29zIiwgeSA9ICJDdWFudGlsZXMgb2JzZXJ2YWRvcyIpICsNCiAgdGhlbWVfbWluaW1hbCgpDQoNCnAyIDwtIGdncGxvdChkYXRvcywgYWVzKHNhbXBsZSA9IHBlc28pKSArDQogIHN0YXRfcXEoY29sb3IgPSAiZGFya29yYW5nZSIpICsNCiAgc3RhdF9xcV9saW5lKGNvbG9yID0gInJlZCIpICsNCiAgbGFicyh0aXRsZSA9ICJRUS1QbG90IOKAlCBQRVNPIiwNCiAgICAgICB4ID0gIkN1YW50aWxlcyB0ZcOzcmljb3MiLCB5ID0gIkN1YW50aWxlcyBvYnNlcnZhZG9zIikgKw0KICB0aGVtZV9taW5pbWFsKCkNCg0KZ3JpZC5hcnJhbmdlKHAxLCBwMiwgbmNvbCA9IDIpDQpgYGANCg0KIyMjIEhpc3RvZ3JhbWFzIGNvbiBjdXJ2YSBub3JtYWwNCg0KYGBge3IgaGlzdG9ncmFtYXMsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD00fQ0KcDMgPC0gZ2dwbG90KGRhdG9zLCBhZXMoeCA9IGdyYykpICsNCiAgZ2VvbV9oaXN0b2dyYW0oYWVzKHkgPSBhZnRlcl9zdGF0KGRlbnNpdHkpKSwNCiAgICAgICAgICAgICAgICAgZmlsbCA9ICJzdGVlbGJsdWUiLCBjb2xvciA9ICJ3aGl0ZSIsIGJpbnMgPSAyMCkgKw0KICBzdGF0X2Z1bmN0aW9uKGZ1biA9IGRub3JtLA0KICAgICAgICAgICAgICAgIGFyZ3MgPSBsaXN0KG1lYW4gPSBtZWFuKGRhdG9zJGdyYyksIHNkID0gc2QoZGF0b3MkZ3JjKSksDQogICAgICAgICAgICAgICAgY29sb3IgPSAicmVkIiwgbGluZXdpZHRoID0gMSkgKw0KICBsYWJzKHRpdGxlID0gIkhpc3RvZ3JhbWEg4oCUIEdSQyIsIHggPSAiZ3JjIiwgeSA9ICJEZW5zaWRhZCIpICsNCiAgdGhlbWVfbWluaW1hbCgpDQoNCnA0IDwtIGdncGxvdChkYXRvcywgYWVzKHggPSBwZXNvKSkgKw0KICBnZW9tX2hpc3RvZ3JhbShhZXMoeSA9IGFmdGVyX3N0YXQoZGVuc2l0eSkpLA0KICAgICAgICAgICAgICAgICBmaWxsID0gImRhcmtvcmFuZ2UiLCBjb2xvciA9ICJ3aGl0ZSIsIGJpbnMgPSAyMCkgKw0KICBzdGF0X2Z1bmN0aW9uKGZ1biA9IGRub3JtLA0KICAgICAgICAgICAgICAgIGFyZ3MgPSBsaXN0KG1lYW4gPSBtZWFuKGRhdG9zJHBlc28pLCBzZCA9IHNkKGRhdG9zJHBlc28pKSwNCiAgICAgICAgICAgICAgICBjb2xvciA9ICJyZWQiLCBsaW5ld2lkdGggPSAxKSArDQogIGxhYnModGl0bGUgPSAiSGlzdG9ncmFtYSDigJQgUEVTTyIsIHggPSAicGVzbyIsIHkgPSAiRGVuc2lkYWQiKSArDQogIHRoZW1lX21pbmltYWwoKQ0KDQpncmlkLmFycmFuZ2UocDMsIHA0LCBuY29sID0gMikNCmBgYA0KDQoqKk5vdGE6KiogbG9zIGhpc3RvZ3JhbWFzIGNvbiBjdXJ2YSBub3JtYWwgc3VwZXJwdWVzdGEgcGVybWl0ZW4gdmlzdWFsaXphcg0KY2xhcmFtZW50ZSBwb3IgcXXDqSBgcGVzb2Agbm8gcHVlZGUgY29uc2lkZXJhcnNlIG5vcm1hbDogcHJlc2VudGEgdW5hIGNvbGENCmRlcmVjaGEgcHJvbnVuY2lhZGEgcHJvZHVjdG8gZGUgdmFsb3JlcyBleHRyZW1vcy4NCg0KKipDb25jbHVzacOzbjoqKiBMYSB2YXJpYWJsZSBgZ3JjYCBwcmVzZW50YSBwLXZhbG9yZXMgbWF5b3JlcyBhIDAsMDUgZW4NCmFtYm9zIHRlc3RzIHBvciBsbyBxdWUgcHVlZGUgY29uc2lkZXJhcnNlIG5vcm1hbC4gTGEgdmFyaWFibGUgYHBlc29gDQpwcmVzZW50YSBwLXZhbG9yZXMgbWVub3JlcyBhIDAsMDUgcG9yIGxvIHF1ZSBubyBwdWVkZSBjb25zaWRlcmFyc2Ugbm9ybWFsLg0KDQotLS0NCg0KIyMgRWplcmNpY2lvIDUg4oCUIElDIDk1JSBwYXJhIGxhIG1lZGlhIGRlIGdyYXNhIGNvcnBvcmFsDQoNCkRhZG8gcXVlIGBncmNgIGVzIG5vcm1hbCB5IGxhIHZhcmlhbnphIHBvYmxhY2lvbmFsIGVzIGRlc2Nvbm9jaWRhLA0Kc2UgdXRpbGl6YSBsYSBkaXN0cmlidWNpw7NuIHQtU3R1ZGVudCBjb24gbi0xIGdyYWRvcyBkZSBsaWJlcnRhZA0KKERpYXBvc2l0aXZhIDE0LTE1LCBDbGFzZSAyKS4NCg0KYGBge3IgaWNfZ3JjfQ0KaWNfZ3JjIDwtIHQudGVzdChkYXRvcyRncmMsIGNvbmYubGV2ZWwgPSAwLjk1KQ0KaWNfZ3JjDQpgYGANCg0KYGBge3IgdGFibGFfaWN9DQp0YWJsYV9pYyA8LSBkYXRhLmZyYW1lKA0KICBNZWRpYSAgICAgPSByb3VuZChpY19ncmMkZXN0aW1hdGUsIDQpLA0KICBMSSAgICAgICAgPSByb3VuZChpY19ncmMkY29uZi5pbnRbMV0sIDQpLA0KICBMUyAgICAgICAgPSByb3VuZChpY19ncmMkY29uZi5pbnRbMl0sIDQpLA0KICBDb25maWFuemEgPSAiOTUlIiwNCiAgZ2wgICAgICAgID0gaWNfZ3JjJHBhcmFtZXRlcg0KKQ0Kcm93bmFtZXModGFibGFfaWMpIDwtIE5VTEwNCg0Ka2FibGUodGFibGFfaWMsDQogICAgICBjb2wubmFtZXMgPSBjKCJNZWRpYSBtdWVzdHJhbCIsICJMw61taXRlIGluZmVyaW9yIiwNCiAgICAgICAgICAgICAgICAgICAgIkzDrW1pdGUgc3VwZXJpb3IiLCAiQ29uZmlhbnphIiwgImdsIiksDQogICAgICBhbGlnbiA9IGMoImMiLCAiYyIsICJjIiwgImMiLCAiYyIpKQ0KYGBgDQoNCioqQ29uY2x1c2nDs246KiogU2UgdGllbmUgdW5hIGNvbmZpYW56YSBkZWwgOTUlIGRlIHF1ZSBlbCBpbnRlcnZhbG8NCltgciByb3VuZChpY19ncmMkY29uZi5pbnRbMV0sIDIpYCA7IGByIHJvdW5kKGljX2dyYyRjb25mLmludFsyXSwgMilgXQ0KY29udGllbmUgYSBsYSB2ZXJkYWRlcmEgbWVkaWEgcG9ibGFjaW9uYWwgZGUgZ3Jhc2EgY29ycG9yYWwsIHV0aWxpemFuZG8NCmVsIGVzdGFkw61zdGljbyB0IGNvbiBgciBpY19ncmMkcGFyYW1ldGVyYCBncmFkb3MgZGUgbGliZXJ0YWQuDQoNCi0tLQ0KDQojIyBSZWZlcmVuY2lhcw0KDQpQw6lyZXosIFMuIE4uICgyMDI2KS4gKkZ1bmRhbWVudG9zIGRlIEVzdGFkw61zdGljYSogW0RpYXBvc2l0aXZhcyBkZSBsYXMNCkNsYXNlcyAyIHkgM10uIEVzcGVjaWFsaXphY2nDs24gZW4gQ2llbmNpYSBkZSBEYXRvcywgVW5pdmVyc2lkYWQgTmFjaW9uYWwNCmRlbCBPZXN0ZS4NCg0KRGV2b3JlLCBKLiBMLiAoMjAwOCkuICpQcm9iYWJpbGlkYWQgeSBlc3RhZMOtc3RpY2EgcGFyYSBpbmdlbmllcsOtYSB5DQpjaWVuY2lhcyogKDdtYSBlZC4pLiBDZW5nYWdlIExlYXJuaW5nLg==