2. Ejercicios Regresión Lineal Simple (primera parte)
Ejercicio 2.1 Medidas del cuerpo, Parte II.
Datos publicados en Heinz, Peterson, Johnson, y Kerk {2003}, base de datos bdims del paquete openintro.
- Realizar un diagrama de dispersión que muestre la relación entre el peso medido en kilogramos (wgt)y la circunferencia de la cadera medida en centímetros (hip.gi), ponga el peso en el eje vertical. Describa la relación entre la circunferencia de la cadera y el peso.
plot(bdims$hip.gi,bdims$wgt, col = colores)
Es una relación lineal, positiva y fuerte
¿Cómo cambiaría la relación si el peso se midiera en libras mientras que las unidades para la circunferencia de la cadera permanecieran en centímetros? no cambia.
Ajuste un modelo lineal para explicar el peso por la circunferencia de cadera, con las variables en las unidades originales. Escriba el modelo. Luego, escriba el modelo ajustado. Interprete la pendiente estimada en términos del problema. Su respuesta debería contener una frase que comience así: “Si una persona aumenta un cm. de contorno de cadera, en promedio su peso aumentará … kilogramos”.
lm.ajustado <- lm(wgt~hip.gi,data = bdims)
summary(lm.ajustado)
Call:
lm(formula = wgt ~ hip.gi, data = bdims)
Residuals:
Min 1Q Median 3Q Max
-19.449 -7.111 -0.367 7.264 22.353
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -78.21054 5.56902 -14.04 <2e-16 ***
hip.gi 1.52417 0.05747 26.52 <2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 8.636 on 505 degrees of freedom
Multiple R-squared: 0.5821, Adjusted R-squared: 0.5813
F-statistic: 703.5 on 1 and 505 DF, p-value: < 2.2e-16
\[
E(wgt/hip.gi)= \beta_0 + \beta_1 .hip.gi +\epsilon
\] \[
E(wgt/hip.gi)= -78.21 + 1.52 .hip.gi
\]
“Si una persona aumenta un cm. de contorno de cadera, en promedio su peso aumentará 1.52417 kilogramos”.
- Superponga la recta ajustada al scatterplot. Observe el gráfco. ¿Diría que la recta describe bien la relación entre ambas variables?
plot(bdims$hip.gi,bdims$wgt)
abline(lm.ajustado, col = "red")
Describe bien
- Elegimos una persona adulta físicamente activa entre los estudiantes de primer año de la facultad. Su contorno de cadera mide 100 cm. Prediga su peso en kilogramos.
alumno <- data.frame(hip.gi = 100, wgt=NA)
predict(lm.ajustado,newdata = alumno)
1
74.20646
- Esa persona elegida al azar pesa 81kg. Calcule el residuo.
(predict(lm.ajustado,newdata = alumno) -81)^2
1
46.15224
- Estime el peso esperado para la población de adultos cuyo contorno de cadera mide 100 cm. El del punto E
Ejercicio 2.2 Medidas del cuerpo, Parte III. Base de datos bdims del paquete openintro.
- Realizar un diagrama de dispersión que muestre la relación entre el peso medido en kilogramos {wgt)y la altura hgt).
plot(bdims$hgt, bdims$wgt)
- Ajuste un modelo lineal para explicar el peso por la altura. Escriba el modelo . Luego, escriba el modelo ajustado. interprete la pendiente estimada en términos del problema. Interprete la pendiente. ¿Es razonable el signo obtenido para la pendiente estimada? Superponer al scatterplot anterior la recta estimada.
lm.ajustado <- lm(wgt~hgt,data = bdims)
summary(lm.ajustado)
Call:
lm(formula = wgt ~ hgt, data = bdims)
Residuals:
Min 1Q Median 3Q Max
-18.743 -6.402 -1.231 5.059 41.103
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -105.01125 7.53941 -13.93 <2e-16 ***
hgt 1.01762 0.04399 23.14 <2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 9.308 on 505 degrees of freedom
Multiple R-squared: 0.5145, Adjusted R-squared: 0.5136
F-statistic: 535.2 on 1 and 505 DF, p-value: < 2.2e-16
\[
E(wgt/hip.gi)= \beta_0 + \beta_1 .hgt +\epsilon
\] \[
E(wgt/hip.gi)= -105.01 + 1.02 . hgt
\]
Es razonable. Si una persona aumenta un cm. de altura, en promedio su peso aumentará 1.02 kilogramos“.
plot(bdims$hgt, bdims$wgt)
abline(lm.ajustado, col = "red")
- La persona elegida en el ejercicio anterior, medía 187 cm. de alto, y pesaba 81 kg. Prediga su peso con el modelo que tiene a la altura como covariable. Calcule el residuo de dicha observación.
alumno$hgt <- 187
predict(lm.ajustado,newdata = alumno)
1
85.28308
(predict(lm.ajustado,newdata = alumno) -81)^2
1
18.3448
Ejercicio 2.3 Mamíferos, Parte III. Base de datos mammals del paquete openintro.
Ajuste un modelo lineal para explicar a log10 (BrainWt) en función del log10 (BodyWt) : Como antes, escriba el modelo teórico y el ajustado.
library(openintro, warn.conflicts = FALSE)
lm_fitted <- lm(log10(mammals$BrainWt) ~ log10(mammals$BodyWt))
summary(lm_fitted)
Call:
lm(formula = log10(mammals$BrainWt) ~ log10(mammals$BodyWt))
Residuals:
Min 1Q Median 3Q Max
-0.74503 -0.21380 -0.02676 0.18934 0.84613
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 0.92713 0.04171 22.23 <2e-16 ***
log10(mammals$BodyWt) 0.75169 0.02846 26.41 <2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.3015 on 60 degrees of freedom
Multiple R-squared: 0.9208, Adjusted R-squared: 0.9195
F-statistic: 697.4 on 1 and 60 DF, p-value: < 2.2e-16
modelo teórico:
\[
\log_{10}BrainWt = \beta_0 + \beta_1*\log_{10}BrainWt + \epsilon
\] Modelo ajustado
\[
\widehat{\log_{10}BrainWt} = 0.92713 + 0.75169*\log_{10}BrainWt
\]
- Repita el scatterplot de las variables transformadas y superpóngale la recta ajustada.
plot(log10(mammals$BrainWt) ~ log10(mammals$BodyWt))
abline(lm_fitted)
c)La observación 45 corresponde a un chancho. Prediga el peso del cerebro del chancho con el modelo ajustado, sabiendo que pesa 192 kilos.
10^(predict(lm_fitted)[45])
45
439.9997
plot(log10(mammals$BrainWt) ~ log10(mammals$BodyWt))
abline(lm_fitted)
points(x= log10(mammals$BodyWt)[45],y= log10(mammals$BrainWt)[45], col= "violet", pch = 19)
- La observación 34 corresponde a un ser humano. Prediga el peso del cerebro de un ser humano con el modelo ajustado, sabiendo que pesa 62 kilos.
10^(predict(lm_fitted)[34])
34
188.1233
plot(log10(mammals$BrainWt) ~ log10(mammals$BodyWt))
abline(lm_fitted)
points(x= log10(mammals$BodyWt)[45],y= log10(mammals$BrainWt)[45], col= "violet", pch = 19)
points(x= log10(mammals$BodyWt)[34],y= log10(mammals$BrainWt)[34], col= "red", pch = 19)
Otras opciones para graficar
#devtools::install_github('hadley/ggplot2')
library(ggplot2)
library(ggrepel)
ggplot(mammals, aes(log10(BodyWt), log10(BrainWt), label = Species))+
geom_text_repel()+
geom_smooth(method = "lm", alpha = 0.5)
library(plotly)
graf <- ggplot(mammals, aes(log10(BodyWt), log10(BrainWt), label =Species ))+
geom_point()+
geom_smooth(method = "lm", alpha = 0.5)
ggplotly(graf, tooltip = c("label"))
LS0tCnRpdGxlOiAiRWplcmNpY2lvcyBtb2RlbG8gbGluZWFsLiBJSSIKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6CiAgICB0b2M6IHllcwogICAgdG9jX2Zsb2F0OiB5ZXMKLS0tCgpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgaW5jbHVkZT1GQUxTRX0KbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkob3BlbmludHJvLHdhcm4uY29uZmxpY3RzID0gRkFMU0UpCgpjb2xvcmVzIDwtIGJkaW1zJHNleApjb2xvcmVzIDwtIGlmZWxzZShjb2xvcmVzID09IDEsImJsdWUiLCAicmVkIikKYGBgCgoKIyAyLiBFamVyY2ljaW9zIFJlZ3Jlc2nDs24gTGluZWFsIFNpbXBsZSAocHJpbWVyYSBwYXJ0ZSkKICAgCiMjIyBFamVyY2ljaW8gMi4xIE1lZGlkYXMgZGVsIGN1ZXJwbywgUGFydGUgSUkuIApEYXRvcyBwdWJsaWNhZG9zIGVuIEhlaW56LCBQZXRlcnNvbiwgSm9obnNvbiwgeSBLZXJrIHsyMDAzfSwgYmFzZSBkZSBkYXRvcyBiZGltcyBkZWwgcGFxdWV0ZSBvcGVuaW50cm8uCgphKSBSZWFsaXphciB1biBkaWFncmFtYSBkZSBkaXNwZXJzacOzbiBxdWUgbXVlc3RyZSBsYSByZWxhY2nDs24gZW50cmUgZWwgcGVzbyBtZWRpZG8gZW4ga2lsb2dyYW1vcyAod2d0KXkgbGEgY2lyY3VuZmVyZW5jaWEgZGUgbGEgY2FkZXJhIG1lZGlkYSBlbiBjZW50w61tZXRyb3MgKGhpcC5naSksIHBvbmdhIGVsIHBlc28gZW4gZWwgZWplIHZlcnRpY2FsLiBEZXNjcmliYSBsYSByZWxhY2nDs24gZW50cmUgbGEgY2lyY3VuZmVyZW5jaWEgZGUgbGEgY2FkZXJhIHkgZWwgcGVzby4KCmBgYHtyfQpwbG90KGJkaW1zJGhpcC5naSxiZGltcyR3Z3QsIGNvbCA9IGNvbG9yZXMpCmBgYApFcyB1bmEgcmVsYWNpw7NuIGxpbmVhbCwgcG9zaXRpdmEgeSBmdWVydGUKCgpiKSDCv0PDs21vIGNhbWJpYXLDrWEgbGEgcmVsYWNpw7NuIHNpIGVsIHBlc28gc2UgbWlkaWVyYSBlbiBsaWJyYXMgbWllbnRyYXMgcXVlIGxhcyB1bmlkYWRlcyBwYXJhIGxhIGNpcmN1bmZlcmVuY2lhIGRlIGxhIGNhZGVyYSBwZXJtYW5lY2llcmFuIGVuIGNlbnTDrW1ldHJvcz8KX19ubyBjYW1iaWEuX18KCmMpIEFqdXN0ZSB1biBtb2RlbG8gbGluZWFsIHBhcmEgZXhwbGljYXIgZWwgcGVzbyBwb3IgbGEgY2lyY3VuZmVyZW5jaWEgZGUgY2FkZXJhLCBjb24gbGFzIHZhcmlhYmxlcyBlbiBsYXMgdW5pZGFkZXMgb3JpZ2luYWxlcy4gRXNjcmliYSBlbCBtb2RlbG8uIEx1ZWdvLCBlc2NyaWJhIGVsIG1vZGVsbyBhanVzdGFkby4gSW50ZXJwcmV0ZSBsYSBwZW5kaWVudGUgZXN0aW1hZGEgZW4gdMOpcm1pbm9zIGRlbCBwcm9ibGVtYS4gU3UgcmVzcHVlc3RhIGRlYmVyw61hIGNvbnRlbmVyIHVuYSBmcmFzZSBxdWUgY29taWVuY2UgYXPDrTogIlNpIHVuYSBwZXJzb25hIGF1bWVudGEgdW4gY20uIGRlIGNvbnRvcm5vIGRlIGNhZGVyYSwgZW4gcHJvbWVkaW8gc3UgcGVzbyBhdW1lbnRhcsOhIC4uLiBraWxvZ3JhbW9zIi4KCmBgYHtyfQpsbS5hanVzdGFkbyA8LSBsbSh3Z3R+aGlwLmdpLGRhdGEgPSBiZGltcykKc3VtbWFyeShsbS5hanVzdGFkbykKCmBgYAoKJCQKRSh3Z3QvaGlwLmdpKT0gXGJldGFfMCArIFxiZXRhXzEgLmhpcC5naSArXGVwc2lsb24KJCQKJCQKRSh3Z3QvaGlwLmdpKT0gLTc4LjIxICsgMS41MiAuaGlwLmdpCiQkCgoiU2kgdW5hIHBlcnNvbmEgYXVtZW50YSB1biBjbS4gZGUgY29udG9ybm8gZGUgY2FkZXJhLCBlbiBwcm9tZWRpbyBzdSBwZXNvIGF1bWVudGFyw6EgMS41MjQxNyBraWxvZ3JhbW9zIi4KCmQpIFN1cGVycG9uZ2EgbGEgcmVjdGEgYWp1c3RhZGEgYWwgc2NhdHRlcnBsb3QuIE9ic2VydmUgZWwgZ3LDoWZjby4gwr9EaXLDrWEgcXVlIGxhIHJlY3RhIGRlc2NyaWJlIGJpZW4gbGEgcmVsYWNpw7NuIGVudHJlIGFtYmFzIHZhcmlhYmxlcz8KCmBgYHtyfQpwbG90KGJkaW1zJGhpcC5naSxiZGltcyR3Z3QpCmFibGluZShsbS5hanVzdGFkbywgY29sID0gInJlZCIpCgpgYGAKCkRlc2NyaWJlIGJpZW4KCmUpIEVsZWdpbW9zIHVuYSBwZXJzb25hIGFkdWx0YSBmw61zaWNhbWVudGUgYWN0aXZhIGVudHJlIGxvcyBlc3R1ZGlhbnRlcyBkZSBwcmltZXIgYcOxbyBkZSBsYSBmYWN1bHRhZC4gU3UgY29udG9ybm8gZGUgY2FkZXJhIG1pZGUgMTAwIGNtLiBQcmVkaWdhIHN1IHBlc28gZW4ga2lsb2dyYW1vcy4KCgpgYGB7cn0KYWx1bW5vIDwtIGRhdGEuZnJhbWUoaGlwLmdpID0gIDEwMCwgd2d0PU5BKQpwcmVkaWN0KGxtLmFqdXN0YWRvLG5ld2RhdGEgPSBhbHVtbm8pCgpgYGAKCmYpIEVzYSBwZXJzb25hIGVsZWdpZGEgYWwgYXphciBwZXNhIDgxa2cuIENhbGN1bGUgZWwgcmVzaWR1by4KCmBgYHtyfQoocHJlZGljdChsbS5hanVzdGFkbyxuZXdkYXRhID0gYWx1bW5vKSAtODEpXjIKCmBgYAoKCmcpIEVzdGltZSBlbCBwZXNvIGVzcGVyYWRvIHBhcmEgbGEgcG9ibGFjacOzbiBkZSBhZHVsdG9zIGN1eW8gY29udG9ybm8gZGUgY2FkZXJhIG1pZGUgMTAwIGNtLiBfX0VsIGRlbCBwdW50byBFX18KCiMjIyBFamVyY2ljaW8gMi4yIE1lZGlkYXMgZGVsIGN1ZXJwbywgUGFydGUgSUlJLiBCYXNlIGRlIGRhdG9zIGJkaW1zIGRlbCBwYXF1ZXRlIG9wZW5pbnRyby4KCmEpIFJlYWxpemFyIHVuIGRpYWdyYW1hIGRlIGRpc3BlcnNpw7NuIHF1ZSBtdWVzdHJlIGxhIHJlbGFjacOzbiBlbnRyZSBlbCBwZXNvIG1lZGlkbyBlbiBraWxvZ3JhbW9zIHt3Z3QpeSBsYSBhbHR1cmEgaGd0KS4KCmBgYHtyfQpwbG90KGJkaW1zJGhndCwgYmRpbXMkd2d0KQpgYGAKCgpiKSBBanVzdGUgdW4gbW9kZWxvIGxpbmVhbCBwYXJhIGV4cGxpY2FyIGVsIHBlc28gcG9yIGxhIGFsdHVyYS4gRXNjcmliYSBlbCBtb2RlbG8gLiBMdWVnbywgZXNjcmliYSBlbCBtb2RlbG8gYWp1c3RhZG8uIGludGVycHJldGUgbGEgcGVuZGllbnRlIGVzdGltYWRhIGVuIHTDqXJtaW5vcyBkZWwgcHJvYmxlbWEuIEludGVycHJldGUgbGEgcGVuZGllbnRlLiDCv0VzIHJhem9uYWJsZSBlbCBzaWdubyBvYnRlbmlkbyBwYXJhIGxhIHBlbmRpZW50ZSBlc3RpbWFkYT8gU3VwZXJwb25lciBhbCBzY2F0dGVycGxvdCBhbnRlcmlvciBsYSByZWN0YSBlc3RpbWFkYS4KCmBgYHtyfQpsbS5hanVzdGFkbyA8LSBsbSh3Z3R+aGd0LGRhdGEgPSBiZGltcykKc3VtbWFyeShsbS5hanVzdGFkbykKCmBgYAokJApFKHdndC9oaXAuZ2kpPSBcYmV0YV8wICsgXGJldGFfMSAuaGd0ICtcZXBzaWxvbgokJAokJApFKHdndC9oaXAuZ2kpPSAtMTA1LjAxICsgMS4wMiAgLiBoZ3QKJCQKCkVzIHJhem9uYWJsZS4gU2kgdW5hIHBlcnNvbmEgYXVtZW50YSB1biBjbS4gZGUgYWx0dXJhLCBlbiBwcm9tZWRpbyBzdSBwZXNvIGF1bWVudGFyw6EgMS4wMiBraWxvZ3JhbW9zIi4KCgpgYGB7cn0KcGxvdChiZGltcyRoZ3QsIGJkaW1zJHdndCkKYWJsaW5lKGxtLmFqdXN0YWRvLCBjb2wgPSAicmVkIikKYGBgCgoKYykgTGEgcGVyc29uYSBlbGVnaWRhIGVuIGVsIGVqZXJjaWNpbyBhbnRlcmlvciwgbWVkw61hIDE4NyBjbS4gZGUgYWx0bywgeSBwZXNhYmEgODEga2cuIFByZWRpZ2Egc3UgcGVzbyBjb24gZWwgbW9kZWxvIHF1ZSB0aWVuZSBhIGxhIGFsdHVyYSBjb21vIGNvdmFyaWFibGUuIENhbGN1bGUgZWwgcmVzaWR1byBkZSBkaWNoYSBvYnNlcnZhY2nDs24uCgpgYGB7cn0KYWx1bW5vJGhndCA8LSAxODcKcHJlZGljdChsbS5hanVzdGFkbyxuZXdkYXRhID0gYWx1bW5vKQoocHJlZGljdChsbS5hanVzdGFkbyxuZXdkYXRhID0gYWx1bW5vKSAtODEpXjIKCgpgYGAKCgojIyMgRWplcmNpY2lvIDIuMyBNYW3DrWZlcm9zLCBQYXJ0ZSBJSUkuIEJhc2UgZGUgZGF0b3MgbWFtbWFscyBkZWwgcGFxdWV0ZSBvcGVuaW50cm8uCkFqdXN0ZSB1biBtb2RlbG8gbGluZWFsIHBhcmEgZXhwbGljYXIgYSBsb2cxMCAoQnJhaW5XdCkgZW4gZnVuY2nDs24gZGVsIGxvZzEwIChCb2R5V3QpIDogQ29tbyBhbnRlcywgZXNjcmliYSBlbCBtb2RlbG8gdGXDs3JpY28geSBlbCBhanVzdGFkby4KCmBgYHtyfQpsaWJyYXJ5KG9wZW5pbnRybywgd2Fybi5jb25mbGljdHMgPSBGQUxTRSkKbG1fZml0dGVkIDwtIGxtKGxvZzEwKG1hbW1hbHMkQnJhaW5XdCkgfiBsb2cxMChtYW1tYWxzJEJvZHlXdCkpCnN1bW1hcnkobG1fZml0dGVkKQpgYGAKCm1vZGVsbyB0ZcOzcmljbzoKCiQkClxsb2dfezEwfUJyYWluV3QgPSBcYmV0YV8wICsgXGJldGFfMSpcbG9nX3sxMH1CcmFpbld0ICsgXGVwc2lsb24KJCQKTW9kZWxvIGFqdXN0YWRvCgokJApcd2lkZWhhdHtcbG9nX3sxMH1CcmFpbld0fSA9IDAuOTI3MTMgKyAwLjc1MTY5Klxsb2dfezEwfUJyYWluV3QKJCQKCgpiKSBSZXBpdGEgZWwgc2NhdHRlcnBsb3QgZGUgbGFzIHZhcmlhYmxlcyB0cmFuc2Zvcm1hZGFzIHkgc3VwZXJww7NuZ2FsZSBsYSByZWN0YSBhanVzdGFkYS4KCgpgYGB7cn0KcGxvdChsb2cxMChtYW1tYWxzJEJyYWluV3QpIH4gbG9nMTAobWFtbWFscyRCb2R5V3QpKQphYmxpbmUobG1fZml0dGVkKSAKYGBgCgpjKUxhIG9ic2VydmFjacOzbiA0NSBjb3JyZXNwb25kZSBhIHVuIGNoYW5jaG8uIFByZWRpZ2EgZWwgcGVzbyBkZWwgY2VyZWJybyBkZWwgY2hhbmNobyBjb24gZWwgbW9kZWxvIGFqdXN0YWRvLCBzYWJpZW5kbyBxdWUgcGVzYSAxOTIga2lsb3MuCgpgYGB7cn0KMTBeKHByZWRpY3QobG1fZml0dGVkKVs0NV0pCgpwbG90KGxvZzEwKG1hbW1hbHMkQnJhaW5XdCkgfiBsb2cxMChtYW1tYWxzJEJvZHlXdCkpCmFibGluZShsbV9maXR0ZWQpIApwb2ludHMoeD0gbG9nMTAobWFtbWFscyRCb2R5V3QpWzQ1XSx5PSBsb2cxMChtYW1tYWxzJEJyYWluV3QpWzQ1XSwgY29sPSAidmlvbGV0IiwgIHBjaCA9IDE5KQpgYGAKCgpkKSBMYSBvYnNlcnZhY2nDs24gMzQgY29ycmVzcG9uZGUgYSB1biBzZXIgaHVtYW5vLiBQcmVkaWdhIGVsIHBlc28gZGVsIGNlcmVicm8gZGUgdW4gc2VyIGh1bWFubyBjb24gZWwgbW9kZWxvIGFqdXN0YWRvLCBzYWJpZW5kbyBxdWUgcGVzYSA2MiBraWxvcy4KCmBgYHtyfQoKMTBeKHByZWRpY3QobG1fZml0dGVkKVszNF0pCgpwbG90KGxvZzEwKG1hbW1hbHMkQnJhaW5XdCkgfiBsb2cxMChtYW1tYWxzJEJvZHlXdCkpCmFibGluZShsbV9maXR0ZWQpIApwb2ludHMoeD0gbG9nMTAobWFtbWFscyRCb2R5V3QpWzQ1XSx5PSBsb2cxMChtYW1tYWxzJEJyYWluV3QpWzQ1XSwgY29sPSAidmlvbGV0IiwgIHBjaCA9IDE5KQpwb2ludHMoeD0gbG9nMTAobWFtbWFscyRCb2R5V3QpWzM0XSx5PSBsb2cxMChtYW1tYWxzJEJyYWluV3QpWzM0XSwgY29sPSAicmVkIiwgIHBjaCA9IDE5KQpgYGAKICAKT3RyYXMgb3BjaW9uZXMgcGFyYSBncmFmaWNhcgoKYGBge3J9CgojZGV2dG9vbHM6Omluc3RhbGxfZ2l0aHViKCdoYWRsZXkvZ2dwbG90MicpCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShnZ3JlcGVsKQoKZ2dwbG90KG1hbW1hbHMsIGFlcyhsb2cxMChCb2R5V3QpLCBsb2cxMChCcmFpbld0KSwgbGFiZWwgPSBTcGVjaWVzKSkrCiAgZ2VvbV90ZXh0X3JlcGVsKCkrCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgYWxwaGEgPSAwLjUpCmBgYAoKYGBge3J9CmxpYnJhcnkocGxvdGx5KQoKZ3JhZiA8LSBnZ3Bsb3QobWFtbWFscywgYWVzKGxvZzEwKEJvZHlXdCksIGxvZzEwKEJyYWluV3QpLCBsYWJlbCA9U3BlY2llcyApKSsKICBnZW9tX3BvaW50KCkrCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgYWxwaGEgPSAwLjUpCgpnZ3Bsb3RseShncmFmLCB0b29sdGlwID0gYygibGFiZWwiKSkKYGBgCgogIAo=