V tejto práci sa budeme zaoberať prvými krokmi v odhade regresnej
funkcie. Budeme využívať databázu Life
Expectancy (WHO) Fixed dataset, ktorá obsahuje ukazovatele na úrovni
krajín, ako je priemerná dĺžka života, HDP, školské vzdelávanie a
výdavky na zdravotníctvo.
Príprava údajov - import z csv súboru
Súbor Life_Expectancy_Data obsahuje databázu determinantov očakávanej
dĺžky života. Import údajov urobíme nasledovne
# import the dataset and create a data.frame udaje
#
udaje_svet <- read.csv("udaje/Life-Expectancy-Data-Updated.csv",header=TRUE,sep=",",dec=".",check.names = TRUE)
head(udaje_svet)
#
Databáza obsahuje údaje o 2938 pozorovaniach a 22 premenných. V tejto
práci sa budeme zaoberať len časťou z nich, konkrétne tými, ktoré
súvisia s dĺžkou dožitia. Na začiatku si vyberieme krajinu, ktorej
zdravotný stav chceme analyzovať. V tomto prípade ide o Portugalsko
(Slovensko v databáze nemá zastúpenie):
# z databázy udaje_svet si vyberieme len tie pozorovania, ktoré sa týkaj Portugalska
udaje <- subset(udaje_svet, Country == "Portugal")
Tabuľka uvedená nižšie nám poskuytuje základné popisné štatistiky
vybraných kvantitatívnych premenných.
# niektoré štatistiky a ich prehľad v tabuľke KableExtra
library(kableExtra)
udaje %>%
select(Adult_mortality,Alcohol_consumption, Hepatitis_B, Measles, BMI,Polio,Diphtheria,GDP_per_capita,Population_mln,Life_expectancy,Schooling) %>%
summary() %>%
kable() %>%
kable_styling(bootstrap_options = "striped", full_width = FALSE)
| |
Adult_mortality |
Alcohol_consumption |
Hepatitis_B |
Measles |
BMI |
Polio |
Diphtheria |
GDP_per_capita |
Population_mln |
Life_expectancy |
Schooling |
| |
Min. : 73.28 |
Min. : 9.52 |
Min. :58.00 |
Min. :48.00 |
Min. :25.50 |
Min. :93.00 |
Min. :93.00 |
Min. :18585 |
Min. :10.29 |
Min. :76.30 |
Min. :6.800 |
| |
1st Qu.: 83.07 |
1st Qu.:10.73 |
1st Qu.:94.00 |
1st Qu.:77.25 |
1st Qu.:25.70 |
1st Qu.:96.00 |
1st Qu.:96.75 |
1st Qu.:18830 |
1st Qu.:10.41 |
1st Qu.:77.58 |
1st Qu.:7.350 |
| |
Median : 90.46 |
Median :11.52 |
Median :97.00 |
Median :95.00 |
Median :25.75 |
Median :96.50 |
Median :97.00 |
Median :19167 |
Median :10.49 |
Median :78.45 |
Median :7.750 |
| |
Mean : 91.73 |
Mean :11.41 |
Mean :91.56 |
Mean :85.00 |
Mean :25.73 |
Mean :96.50 |
Mean :97.00 |
Mean :19199 |
Mean :10.47 |
Mean :78.74 |
Mean :7.831 |
| |
3rd Qu.:100.28 |
3rd Qu.:12.23 |
3rd Qu.:97.25 |
3rd Qu.:95.25 |
3rd Qu.:25.80 |
3rd Qu.:97.25 |
3rd Qu.:98.00 |
3rd Qu.:19399 |
3rd Qu.:10.54 |
3rd Qu.:80.42 |
3rd Qu.:8.350 |
| |
Max. :109.63 |
Max. :12.77 |
Max. :98.00 |
Max. :96.00 |
Max. :25.80 |
Max. :98.00 |
Max. :99.00 |
Max. :19986 |
Max. :10.57 |
Max. :81.10 |
Max. :9.100 |
Vyššie uvedená tabuľka nám poskytuje prehľad o základných
štatistických charakteristikách vybraných premenných, ako sú priemerné
hodnoty, rozptyl, minimum a maximum. Tieto informácie nám pomáhajú
lepšie pochopiť rozdelenie a rozsah hodnôt v našich dátach. Na druhej
strane je zaujímavá aj informácia o vzájomných vzťahoch medzi týmito
premennými, čo môžeme merať pomocou korelačnej matice.
# grafický prehľad o korelačných vzťahoch vyjadruje nasledovný obrázok
cor_matrix <- cor(udaje %>% select(Adult_mortality,Alcohol_consumption
,Hepatitis_B, Measles, BMI,Polio,Diphtheria,GDP_per_capita,Population_mln,Life_expectancy,Schooling), use = "complete.obs")
corrplot(cor_matrix, method = "color", type = "upper", tl.col =
"black", tl.srt = 45, title = "Korelačná matica vybraných premenných", mar = c(0,0,1,0))

Uvedený graf nám poskytuje vizuálny prehľad o korelačných vzťahoch
medzi vybranými premennými. Farby a intenzita farieb nám umožňujú rýchlo
identifikovať silné pozitívne alebo negatívne korelácie. Upozorňujeme,
že korelácia neznamená kauzalitu.
V nasledovnom je uvedený graf vývoja očakávanej dĺžky dožitia v
Portugalsku v rokoch 2000-2015. Vidíme, že očakávaná dĺžka života sa
zvyšovala, čo je pozitívny trend.
# graf vývoja očakávanej dĺžky dožitia v Portugalsku v rokoch 2000-2015.
library(ggplot2)
ggplot(udaje, aes(x = Year, y = Life_expectancy)) +
geom_line() +
geom_point() +
labs(title = "Vývoj očakávanej dĺžky dožitia v Portugalsku (2000-2015)",
x = "Rok",
y = "Očakávaná dĺžka dožitia") +
theme_minimal()

Na začiatku sa pokúsme o vyrovnanie priebehu tejto premennej v čase
pomocou lineárnej regresie, kde nezávislou premennou bude rok a závislou
premennou bude očakávaná dĺžka dožitia. Odhadneme koeficienty tejto
regresie a posúdime kvalitu vyrovnania pomocou ukazovateľov, ako je
R-squared a p-value.
# vyrovnanie priebehu očakávanej dĺžky dožitia v čase
model <- lm(Life_expectancy ~ Year, data = udaje)
library(broom)
library(knitr)
library(kableExtra)
# koeficienty regresie
tidy(model) %>%
kable(digits = 3, caption = "Odhadnuté koeficienty regresie") %>%
kable_styling(bootstrap_options = "striped", full_width = FALSE)
Odhadnuté koeficienty regresie
| term |
estimate |
std.error |
statistic |
p.value |
| (Intercept) |
-575.170 |
35.209 |
-16.336 |
0 |
| Year |
0.326 |
0.018 |
18.572 |
0 |
# kvalita vyrovnania
glance(model) %>%
kable(digits = 3, caption = "Ukazovatele kvality vyrovnania") %>%
kable_styling(bootstrap_options = "striped", full_width = FALSE)
Ukazovatele kvality vyrovnania
| r.squared |
adj.r.squared |
sigma |
statistic |
p.value |
df |
logLik |
AIC |
BIC |
deviance |
df.residual |
nobs |
| 0.961 |
0.958 |
0.323 |
344.936 |
0 |
1 |
-3.573 |
13.145 |
15.463 |
1.464 |
14 |
16 |
NA
Výsledky regresie nám ukazujú, že koeficient pre rok je pozitívny a
štatisticky významný, čo naznačuje, že očakávaná dĺžka dožitia v
Portugalsku sa zvyšovala v priebehu rokov 2000-2015. Jej priemerný ročný
nárast dosahoval až štyri roky. Hodnota R-squared hodnota nám hovorí, že
model vysvetľuje 96,1 % variability modelu. Podľa hodnoty p-value (
ktorý nám vyšiel 0) môžeme povedať, že model ako celok je štatisticky
významný.
# teraz vyššie uvedený obrázok doplníme o regresnú priamku
ggplot(udaje, aes(x = Year, y = Life_expectancy)) +
geom_line() +
geom_point() +
geom_smooth(method = "lm", se = FALSE, color = "red") +
labs(title = "Vývoj očakávanej dĺžky dožitia v Portugalsku (2000-2015) s regresnou priamkou",
x = "Rok",
y = "Očakávaná dĺžka dožitia") +
theme_minimal()

Vyvoj spotreby alkoholu
Alkohol je predpokladaný negatívny faktor, ktorý vplýva na celkové
zdravie a tým aj na dĺžku života.Zvyšuje krvný tlak, má negatívny vplyv
na pružnosť ciev.P- value nám vyšla 0, ciže nižšia ako 0,1 a hodnota
r-squared vyšla zhruba 0,88 - to znamemná,že v 88% prípadoch mala naozaj
konzumácia aloholu veľký vplyv na dĺžku dožitia.
model_alkohol <-lm(Alcohol_consumption ~ Year, data = udaje)
tidy(model_alkohol) %>%
kable(digits = 3, caption = "Odhadnuté koeficienty regresie pre spotrebu alkoholu") %>%
kable_styling(bootstrap_options = "striped", full_width = FALSE)
Odhadnuté koeficienty regresie pre spotrebu alkoholu
| term |
estimate |
std.error |
statistic |
p.value |
| (Intercept) |
416.781 |
38.734 |
10.760 |
0 |
| Year |
-0.202 |
0.019 |
-10.465 |
0 |
# and now the model quality statistics - just R sqared
r2 <- summary(model_alkohol)$r.squared
adj_r2 <- summary(model_alkohol)$adj.r.squared
r2
[1] 0.8866618
adj_r2
[1] 0.8785662
LS0tCnRpdGxlOiAiUHLDoWNhIHMgcmVncmVzaW91IgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKYXV0aG9yOiBWbGFkaW3DrXIgR2F6ZGEgKHMgcG9tb2NvdSB2eWJyYW7DvWNoIHpkcm9qb3YpCi0tLQoKViB0ZWp0byBwcsOhY2kgc2EgYnVkZW1lIHphb2JlcmHFpSBwcnbDvW1pIGtyb2ttaSB2IG9kaGFkZSByZWdyZXNuZWogZnVua2NpZS4gQnVkZW1lIHZ5dcW+w612YcWlIGRhdGFiw6F6dSBbTGlmZSBFeHBlY3RhbmN5IChXSE8pIEZpeGVkIGRhdGFzZXRdKGh0dHBzOi8vd3d3LmthZ2dsZS5jb20vZGF0YXNldHMvbGFzaGFnb2NoL2xpZmUtZXhwZWN0YW5jeS13aG8tdXBkYXRlZCksIGt0b3LDoSBvYnNhaHVqZSB1a2F6b3ZhdGVsZSBuYSDDunJvdm5pIGtyYWrDrW4sIGFrbyBqZSBwcmllbWVybsOhIGTEusW+a2Egxb5pdm90YSwgSERQLCDFoWtvbHNrw6kgdnpkZWzDoXZhbmllIGEgdsO9ZGF2a3kgbmEgemRyYXZvdG7DrWN0dm8uCgojIyBWeXXFvsOtdmFuaWUgbmlla3RvcsO9Y2gga25pxb5uw61jCgpgYGB7cn0Kcm0obGlzdD1scygpKQpsaWJyYXJ5KGxtdGVzdCkgICAjICBwb2Rwb3JhIHJlZ3Jlc2llCmxpYnJhcnkob3V0bGllcnMpICMgYW5hbHl6YSBvZGxhaGx5Y2ggaG9kbm90IChvdXRsaWVycykKbGlicmFyeShncHRzdHVkaW8pCmxpYnJhcnkoa2FibGVFeHRyYSkKbGlicmFyeShrbml0cikKbGlicmFyeShkcGx5cikKbGlicmFyeShicm9vbSkKbGlicmFyeShjb3JycGxvdCkKYGBgCgojIyBQcsOtcHJhdmEgw7pkYWpvdiAtIGltcG9ydCB6IGNzdiBzw7pib3J1CgpTw7pib3IgTGlmZV9FeHBlY3RhbmN5X0RhdGEgb2JzYWh1amUgZGF0YWLDoXp1IGRldGVybWluYW50b3Ygb8SNYWvDoXZhbmVqIGTEusW+a3kgxb5pdm90YS4gSW1wb3J0IMO6ZGFqb3YgdXJvYsOtbWUgbmFzbGVkb3ZuZQoKYGBge3J9CiMgaW1wb3J0IHRoZSBkYXRhc2V0IGFuZCBjcmVhdGUgYSBkYXRhLmZyYW1lIHVkYWplCiMKdWRhamVfc3ZldCA8LSByZWFkLmNzdigidWRhamUvTGlmZS1FeHBlY3RhbmN5LURhdGEtVXBkYXRlZC5jc3YiLGhlYWRlcj1UUlVFLHNlcD0iLCIsZGVjPSIuIixjaGVjay5uYW1lcyA9IFRSVUUpCmhlYWQodWRhamVfc3ZldCkKIwpgYGAKCkRhdGFiw6F6YSBvYnNhaHVqZSDDumRhamUgbyAyOTM4IHBvem9yb3ZhbmlhY2ggYSAyMiBwcmVtZW5uw71jaC4gViB0ZWp0byBwcsOhY2kgc2EgYnVkZW1lIHphb2JlcmHFpSBsZW4gxI1hc8Wlb3UgeiBuaWNoLCBrb25rcsOpdG5lIHTDvW1pLCBrdG9yw6kgc8O6dmlzaWEgcyBkxLrFvmtvdSBkb8W+aXRpYS4gTmEgemHEjWlhdGt1IHNpIHZ5YmVyaWVtZSBrcmFqaW51LCBrdG9yZWogemRyYXZvdG7DvSBzdGF2IGNoY2VtZSBhbmFseXpvdmHFpS4gViB0b210byBwcsOtcGFkZSBpZGUgbyBQb3J0dWdhbHNrbyAoU2xvdmVuc2tvIHYgZGF0YWLDoXplIG5lbcOhIHphc3TDunBlbmllKToKCmBgYHtyfQojIHogZGF0YWLDoXp5IHVkYWplX3N2ZXQgc2kgdnliZXJpZW1lIGxlbiB0aWUgcG96b3JvdmFuaWEsIGt0b3LDqSBzYSB0w71rYWogUG9ydHVnYWxza2EgCnVkYWplIDwtIHN1YnNldCh1ZGFqZV9zdmV0LCBDb3VudHJ5ID09ICJQb3J0dWdhbCIpCmBgYAoKVGFidcS+a2EgdXZlZGVuw6EgbmnFvsWhaWUgbsOhbSBwb3NrdXl0dWplIHrDoWtsYWRuw6kgcG9waXNuw6kgxaF0YXRpc3Rpa3kgdnlicmFuw71jaCBrdmFudGl0YXTDrXZueWNoIHByZW1lbm7DvWNoLgoKYGBge3J9CiMgbmlla3RvcsOpIMWhdGF0aXN0aWt5IGEgaWNoIHByZWjEvmFkIHYgdGFidcS+a2UgS2FibGVFeHRyYQpsaWJyYXJ5KGthYmxlRXh0cmEpCnVkYWplICU+JQogIHNlbGVjdChBZHVsdF9tb3J0YWxpdHksQWxjb2hvbF9jb25zdW1wdGlvbiwgSGVwYXRpdGlzX0IsIE1lYXNsZXMsIEJNSSxQb2xpbyxEaXBodGhlcmlhLEdEUF9wZXJfY2FwaXRhLFBvcHVsYXRpb25fbWxuLExpZmVfZXhwZWN0YW5jeSxTY2hvb2xpbmcpICU+JQogIHN1bW1hcnkoKSAlPiUKICBrYWJsZSgpICU+JQogIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSAic3RyaXBlZCIsIGZ1bGxfd2lkdGggPSBGQUxTRSkKYGBgCgpWecWhxaFpZSB1dmVkZW7DoSB0YWJ1xL5rYSBuw6FtIHBvc2t5dHVqZSBwcmVoxL5hZCBvIHrDoWtsYWRuw71jaCDFoXRhdGlzdGlja8O9Y2ggY2hhcmFrdGVyaXN0aWvDoWNoIHZ5YnJhbsO9Y2ggcHJlbWVubsO9Y2gsIGFrbyBzw7ogcHJpZW1lcm7DqSBob2Rub3R5LCByb3pwdHlsLCBtaW5pbXVtIGEgbWF4aW11bS4gVGlldG8gaW5mb3Jtw6FjaWUgbsOhbSBwb23DoWhhasO6IGxlcMWhaWUgcG9jaG9wacWlIHJvemRlbGVuaWUgYSByb3pzYWggaG9kbsO0dCB2IG5hxaFpY2ggZMOhdGFjaC4gTmEgZHJ1aGVqIHN0cmFuZSBqZSB6YXVqw61tYXbDoSBhaiBpbmZvcm3DoWNpYSBvIHZ6w6Fqb21uw71jaCB2esWlYWhvY2ggbWVkemkgdMO9bWl0byBwcmVtZW5uw71taSwgxI1vIG3DtMW+ZW1lIG1lcmHFpSBwb21vY291IGtvcmVsYcSNbmVqIG1hdGljZS4KCmBgYHtyfQojIGdyYWZpY2vDvSBwcmVoxL5hZCBvIGtvcmVsYcSNbsO9Y2ggdnrFpWFob2NoIHZ5amFkcnVqZSBuYXNsZWRvdm7DvSBvYnLDoXpvawoKY29yX21hdHJpeCA8LSBjb3IodWRhamUgJT4lIHNlbGVjdChBZHVsdF9tb3J0YWxpdHksQWxjb2hvbF9jb25zdW1wdGlvbgosSGVwYXRpdGlzX0IsIE1lYXNsZXMsIEJNSSxQb2xpbyxEaXBodGhlcmlhLEdEUF9wZXJfY2FwaXRhLFBvcHVsYXRpb25fbWxuLExpZmVfZXhwZWN0YW5jeSxTY2hvb2xpbmcpLCB1c2UgPSAiY29tcGxldGUub2JzIikKY29ycnBsb3QoY29yX21hdHJpeCwgbWV0aG9kID0gImNvbG9yIiwgdHlwZSA9ICJ1cHBlciIsIHRsLmNvbCA9CiJibGFjayIsIHRsLnNydCA9IDQ1LCB0aXRsZSA9ICJLb3JlbGHEjW7DoSBtYXRpY2EgdnlicmFuw71jaCBwcmVtZW5uw71jaCIsIG1hciA9IGMoMCwwLDEsMCkpCgpgYGAKClV2ZWRlbsO9IGdyYWYgbsOhbSBwb3NreXR1amUgdml6dcOhbG55IHByZWjEvmFkIG8ga29yZWxhxI1uw71jaCB2esWlYWhvY2ggbWVkemkgdnlicmFuw71taSBwcmVtZW5uw71taS4gRmFyYnkgYSBpbnRlbnppdGEgZmFyaWViIG7DoW0gdW1vxb7FiHVqw7ogcsO9Y2hsbyBpZGVudGlmaWtvdmHFpSBzaWxuw6kgcG96aXTDrXZuZSBhbGVibyBuZWdhdMOtdm5lIGtvcmVsw6FjaWUuIFVwb3pvcsWIdWplbWUsIMW+ZSBrb3JlbMOhY2lhIG5lem5hbWVuw6Ega2F1emFsaXR1LgoKViBuYXNsZWRvdm5vbSBqZSB1dmVkZW7DvSBncmFmIHbDvXZvamEgb8SNYWvDoXZhbmVqIGTEusW+a3kgZG/Fvml0aWEgdiBQb3J0dWdhbHNrdSB2IHJva29jaCAyMDAwLTIwMTUuIFZpZMOtbWUsIMW+ZSBvxI1ha8OhdmFuw6EgZMS6xb5rYSDFvml2b3RhIHNhIHp2ecWhb3ZhbGEsIMSNbyBqZSBwb3ppdMOtdm55IHRyZW5kLgoKYGBge3J9CiMgIGdyYWYgdsO9dm9qYSBvxI1ha8OhdmFuZWogZMS6xb5reSBkb8W+aXRpYSB2IFBvcnR1Z2Fsc2t1IHYgcm9rb2NoIDIwMDAtMjAxNS4KbGlicmFyeShnZ3Bsb3QyKQpnZ3Bsb3QodWRhamUsIGFlcyh4ID0gWWVhciwgeSA9IExpZmVfZXhwZWN0YW5jeSkpICsKICBnZW9tX2xpbmUoKSArCiAgZ2VvbV9wb2ludCgpICsKICBsYWJzKHRpdGxlID0gIlbDvXZvaiBvxI1ha8OhdmFuZWogZMS6xb5reSBkb8W+aXRpYSB2IFBvcnR1Z2Fsc2t1ICgyMDAwLTIwMTUpIiwKICAgICAgIHggPSAiUm9rIiwKICAgICAgIHkgPSAiT8SNYWvDoXZhbsOhIGTEusW+a2EgZG/Fvml0aWEiKSArCiAgdGhlbWVfbWluaW1hbCgpCmBgYAoKTmEgemHEjWlhdGt1IHNhIHBva8O6c21lIG8gdnlyb3ZuYW5pZSBwcmllYmVodSB0ZWp0byBwcmVtZW5uZWogdiDEjWFzZSBwb21vY291IGxpbmXDoXJuZWogcmVncmVzaWUsIGtkZSBuZXrDoXZpc2xvdSBwcmVtZW5ub3UgYnVkZSByb2sgYSB6w6F2aXNsb3UgcHJlbWVubm91IGJ1ZGUgb8SNYWvDoXZhbsOhIGTEusW+a2EgZG/Fvml0aWEuIE9kaGFkbmVtZSBrb2VmaWNpZW50eSB0ZWp0byByZWdyZXNpZSBhIHBvc8O6ZGltZSBrdmFsaXR1IHZ5cm92bmFuaWEgcG9tb2NvdSB1a2F6b3ZhdGXEvm92LCBha28gamUgUi1zcXVhcmVkIGEgcC12YWx1ZS4KCmBgYHtyfQojIHZ5cm92bmFuaWUgcHJpZWJlaHUgb8SNYWvDoXZhbmVqIGTEusW+a3kgZG/Fvml0aWEgdiDEjWFzZQptb2RlbCA8LSBsbShMaWZlX2V4cGVjdGFuY3kgfiBZZWFyLCBkYXRhID0gdWRhamUpCgpsaWJyYXJ5KGJyb29tKQpsaWJyYXJ5KGtuaXRyKQpsaWJyYXJ5KGthYmxlRXh0cmEpCgojIGtvZWZpY2llbnR5IHJlZ3Jlc2llCnRpZHkobW9kZWwpICU+JQogIGthYmxlKGRpZ2l0cyA9IDMsIGNhcHRpb24gPSAiT2RoYWRudXTDqSBrb2VmaWNpZW50eSByZWdyZXNpZSIpICU+JQogIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSAic3RyaXBlZCIsIGZ1bGxfd2lkdGggPSBGQUxTRSkKCiMga3ZhbGl0YSB2eXJvdm5hbmlhCmdsYW5jZShtb2RlbCkgJT4lCiAga2FibGUoZGlnaXRzID0gMywgY2FwdGlvbiA9ICJVa2F6b3ZhdGVsZSBrdmFsaXR5IHZ5cm92bmFuaWEiKSAlPiUKICBrYWJsZV9zdHlsaW5nKGJvb3RzdHJhcF9vcHRpb25zID0gInN0cmlwZWQiLCBmdWxsX3dpZHRoID0gRkFMU0UpCgpgYGAKClbDvXNsZWRreSByZWdyZXNpZSBuw6FtIHVrYXp1asO6LCDFvmUga29lZmljaWVudCBwcmUgcm9rIGplIHBveml0w612bnkgYSDFoXRhdGlzdGlja3kgdsO9em5hbW7DvSwgxI1vIG5hem5hxI11amUsIMW+ZSBvxI1ha8OhdmFuw6EgZMS6xb5rYSBkb8W+aXRpYSB2IFBvcnR1Z2Fsc2t1IHNhIHp2ecWhb3ZhbGEgdiBwcmllYmVodSByb2tvdiAyMDAwLTIwMTUuIEplaiBwcmllbWVybsO9IHJvxI1uw70gbsOhcmFzdCBkb3NhaG92YWwgYcW+IMWhdHlyaSByb2t5LiBIb2Rub3RhIFItc3F1YXJlZCBob2Rub3RhIG7DoW0gaG92b3LDrSwgxb5lIG1vZGVsIHZ5c3ZldMS+dWplIDk2LDEgJSB2YXJpYWJpbGl0eSBtb2RlbHUuIFBvZMS+YSBob2Rub3R5IHAtdmFsdWUgKCBrdG9yw70gbsOhbSB2ecWhaWVsIDApIG3DtMW+ZW1lIHBvdmVkYcWlLCDFvmUgbW9kZWwgYWtvIGNlbG9rIGplIMWhdGF0aXN0aWNreSB2w716bmFtbsO9LgoKYGBge3J9CiMgdGVyYXogdnnFocWhaWUgdXZlZGVuw70gb2Jyw6F6b2sgZG9wbG7DrW1lIG8gcmVncmVzbsO6IHByaWFta3UKZ2dwbG90KHVkYWplLCBhZXMoeCA9IFllYXIsIHkgPSBMaWZlX2V4cGVjdGFuY3kpKSArCiAgZ2VvbV9saW5lKCkgKwogIGdlb21fcG9pbnQoKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBGQUxTRSwgY29sb3IgPSAicmVkIikgKwogIGxhYnModGl0bGUgPSAiVsO9dm9qIG/EjWFrw6F2YW5laiBkxLrFvmt5IGRvxb5pdGlhIHYgUG9ydHVnYWxza3UgKDIwMDAtMjAxNSkgcyByZWdyZXNub3UgcHJpYW1rb3UiLAogICAgICAgeCA9ICJSb2siLAogICAgICAgeSA9ICJPxI1ha8OhdmFuw6EgZMS6xb5rYSBkb8W+aXRpYSIpICsKICB0aGVtZV9taW5pbWFsKCkKYGBgCiMjIyBWeXZvaiBzcG90cmVieSBhbGtvaG9sdQpBbGtvaG9sIGplIHByZWRwb2tsYWRhbsO9IG5lZ2F0w612bnkgZmFrdG9yLCBrdG9yw70gdnBsw712YSBuYSBjZWxrb3bDqSB6ZHJhdmllIGEgdMO9bSBhaiBuYSBkxLrFvmt1IMW+aXZvdGEuWnZ5xaF1amUga3J2bsO9IHRsYWssIG3DoSBuZWdhdMOtdm55IHZwbHl2IG5hIHBydcW+bm9zxaUgY2lldi5QLSB2YWx1ZSBuw6FtIHZ5xaFsYSAwLCBjacW+ZSBuacW+xaFpYSBha28gMCwxIGEgaG9kbm90YSByLXNxdWFyZWQgdnnFoWxhIHpocnViYSAwLDg4IC0gdG8gem5hbWVtbsOhLMW+ZSB2IDg4JSBwcsOtcGFkb2NoIG1hbGEgbmFvemFqIGtvbnp1bcOhY2lhIGFsb2hvbHUgdmXEvmvDvSB2cGx5diBuYSBkxLrFvmt1IGRvxb5pdGlhLgpgYGB7cn0KbW9kZWxfYWxrb2hvbCA8LWxtKEFsY29ob2xfY29uc3VtcHRpb24gfiBZZWFyLCBkYXRhID0gdWRhamUpCnRpZHkobW9kZWxfYWxrb2hvbCkgJT4lCiAga2FibGUoZGlnaXRzID0gMywgY2FwdGlvbiA9ICJPZGhhZG51dMOpIGtvZWZpY2llbnR5IHJlZ3Jlc2llIHByZSBzcG90cmVidSBhbGtvaG9sdSIpICU+JQogIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSAic3RyaXBlZCIsIGZ1bGxfd2lkdGggPSBGQUxTRSkKIyBhbmQgbm93IHRoZSBtb2RlbCBxdWFsaXR5IHN0YXRpc3RpY3MgLSBqdXN0IFIgc3FhcmVkCnIyIDwtIHN1bW1hcnkobW9kZWxfYWxrb2hvbCkkci5zcXVhcmVkCmFkal9yMiA8LSBzdW1tYXJ5KG1vZGVsX2Fsa29ob2wpJGFkai5yLnNxdWFyZWQKcjIKYWRqX3IyCmBgYAoKIyBPYnLDoXpvayBvIHNrdXRvxI1uw71jaCB2eXJvdm5hbsO9Y2ggaG9kbm90w6FjaCBzcG90cmVieSBhbGtvaG9sdSAgICAgCmBgYHtyfQpmaXR0ZWRfdmFscyA8LSBmaXR0ZWQobW9kZWxfYWxrb2hvbCkKIyB2eWtyZXNsZW5pZSBza3V0b8SNbsO9Y2ggYSB2eXJvdm5hbsO9Y2ggaG9kbsO0dCAtIEFsY29ob2xfY29uc3VtcHRpb24gYSBmaXR0ZWRfdmFsdWVzCmdncGxvdCh1ZGFqZSwgYWVzKHggPSBZZWFyKSkgKwogIGdlb21fbGluZShhZXMoeSA9IEFsY29ob2xfY29uc3VtcHRpb24pLCBjb2xvciA9ICJibHVlIiwgc2l6ZSA9IDEpICsKICBnZW9tX2xpbmUoYWVzKHkgPSBmaXR0ZWRfdmFscyksIGNvbG9yID0gInJlZCIsIHNpemUgPSAxLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArCiAgbGFicyh0aXRsZSA9ICJTa3V0b8SNbsOpIHZzLiBWeXJvdm5hbsOpIGhvZG5vdHkgc3BvdHJlYnkgYWxrb2hvbHUgdiBSYWvDunNrdSAoMjAwMC0yMDE1KSIsCiAgICAgICB4ID0gIlJvayIsCiAgICAgICB5ID0gIlNwb3RyZWJhIGFsa29ob2x1IikgKwogIHRoZW1lX21pbmltYWwoKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoMCwgbWF4KHVkYWplJEFsY29ob2xfY29uc3VtcHRpb24sIGZpdHRlZF92YWxzKSAqIDEuMSkpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpCmBgYAo=