knitr::opts_chunk$set(
echo = TRUE,
message = FALSE,
warning = FALSE
)
Úvod k zadaniu
Úlohou je:
- navrhnúť vlastný cvičebný dokument k práci s databázou,
- zvoliť databázu s údajmi zoradenými v čase, ktorú bude možné neskôr
použiť na ďalšie ekonometrické analýzy,
- ukázať základnú prácu s údajmi (import, úprava, grafy, jednoduché
modely)
V ďalšej časti preto podrobnejšie popisujem voľbu
databázy a následne demonštrujem prácu s ňou v prostredí R.
Voľba databázy – World Development Indicators (WDI)
Ako databázu som si zvolila World Development Indicators
(WDI) zo Svetovej banky. Ide o verejne dostupnú databázu, ktorá
obsahuje dlhé časové rady makroekonomických ukazovateľov pre množstvo
krajín sveta.
V rámci tohto zadania budem pracovať s týmito údajmi:
- krajiny: Slovensko, Česko, Poľsko,
- obdobie: roky 2000–2023 (ročné údaje),
- premenné:
- HDP na obyvateľa (konštantné ceny),
- miera nezamestnanosti,
- medziročná inflácia (CPI).
Tieto údaje sú zoradené v čase, takže sú vhodné na
ďalšiu analýzu (časové rady, porovnanie krajín, jednoduché regresné
modely a pod.).
Na sťahovanie dát použijem balík WDI a na následnú
prácu s údajmi balíky tidyverse, knitr
a kableExtra.
Načítanie knižníc
# inštalácia (iba raz, ak ešte nie sú nainštalované)
# install.packages("WDI")
# install.packages("tidyverse")
# install.packages("kableExtra")
library(WDI)
library(tidyverse)
library(knitr)
library(kableExtra)
Stiahnutie a príprava údajov z WDI
Voľba krajín a indikátorov
# ISO kódy krajín (3-písmenové kódy)
krajiny <- c("SVK", "CZE", "POL")
# Zvolené indikátory WDI (s vlastnými názvami stĺpcov)
indikatory <- c(
gdp_pc = "NY.GDP.PCAP.KD", # HDP na obyvateľa, konštantné ceny
unemployment = "SL.UEM.TOTL.ZS", # miera nezamestnanosti v %
inflation = "FP.CPI.TOTL.ZG" # medziročná inflácia CPI v %
)
# Stiahnutie údajov za roky 2000–2023
wdi_raw <- WDI(
country = krajiny,
indicator = indikatory,
start = 2000,
end = 2023
)
# Úprava a zoradenie údajov
wdi_data <- wdi_raw %>%
rename(
krajina = country,
rok = year
) %>%
arrange(krajina, rok)
head(wdi_data)
Základný popis zvolenej databázy
V tejto podsekcii krátko popíšem, aké údaje chcem do budúcna
spracovávať:
- HDP na obyvateľa (gdp_pc) – ukazovateľ ekonomickej
úrovne krajiny,
- nezamestnanosť (unemployment) – situácia na trhu
práce,
- inflácia (inflation) – stabilita cien.
V ďalších zadaniach by sa dali napríklad skúmať:
- rozdiely v úrovni HDP na obyvateľa medzi krajinami,
- vzťah medzi HDP a nezamestnanosťou (napr. Okunov zákon),
- vzťah medzi infláciou a nezamestnanosťou (Phillipsova krivka),
- jednoduché predikcie na základe trendu.
Prvé prehliadnutie dát
Ukážka prvých riadkov
kable(
head(wdi_data, 10),
caption = "Prvých 10 riadkov stiahnutých údajov z WDI"
) %>%
kable_styling(
full_width = FALSE,
bootstrap_options = c("striped", "hover", "condensed", "responsive")
)
Deskriptívna analýza
Základné štatistiky podľa krajín
summary_tbl <- wdi_data %>%
group_by(krajina) %>%
summarise(
pocet_rokov = n_distinct(rok),
priemer_gdp = mean(gdp_pc, na.rm = TRUE),
priemer_unemp = mean(unemployment, na.rm = TRUE),
priemer_infl = mean(inflation, na.rm = TRUE),
.groups = "drop"
)
summary_tbl %>%
kable(
digits = 2,
caption = "Základné štatistiky ukazovateľov podľa krajín (2000–2023)"
) %>%
kable_styling(
full_width = FALSE,
bootstrap_options = c("striped", "hover", "condensed")
)
Korelačná matica
cor_tbl <- wdi_data %>%
select(gdp_pc, unemployment, inflation) %>%
cor(use = "complete.obs")
kable(
cor_tbl,
digits = 2,
caption = "Korelačná matica ukazovateľov"
) %>%
kable_styling(full_width = FALSE)
Grafické znázornenie vývoja v čase
V tejto časti vykreslím časové rady všetkých troch
ukazovateľov pre zvolené krajiny. Grafy sa automaticky vykreslia pri
Knit → HTML.
HDP na obyvateľa
ggplot(wdi_data, aes(x = rok, y = gdp_pc, color = krajina)) +
geom_line(size = 1) +
labs(
title = "HDP na obyvateľa – Slovensko, Česko, Poľsko",
x = "Rok",
y = "HDP na obyvateľa (konštantné ceny, USD)",
color = "Krajina"
) +
theme_minimal()
Miera nezamestnanosti
ggplot(wdi_data, aes(x = rok, y = unemployment, color = krajina)) +
geom_line(size = 1) +
labs(
title = "Miera nezamestnanosti – Slovensko, Česko, Poľsko",
x = "Rok",
y = "Nezamestnanosť (%)",
color = "Krajina"
) +
theme_minimal()
Inflácia
ggplot(wdi_data, aes(x = rok, y = inflation, color = krajina)) +
geom_line(size = 1) +
labs(
title = "Inflácia (CPI) – Slovensko, Česko, Poľsko",
x = "Rok",
y = "Medziročná zmena CPI (%)",
color = "Krajina"
) +
theme_minimal()
Jednoduchý model – vzťah HDP a nezamestnanosti
Ako ilustráciu jednoduchého ekonometrického modelu odhadnem lineárny
vzťah medzi HDP na obyvateľa a mierou nezamestnanosti:
\[
\text{unemployment}_{it} = \beta_0 + \beta_1 \cdot \text{gdp\_pc}_{it} +
u_{it},
\]
kde \(i\) reprezentuje krajinu a
\(t\) rok.
model_unemp <- lm(unemployment ~ gdp_pc, data = wdi_data)
summary(model_unemp)
Grafická ilustrácia modelu
Pre jednoduchosť zobrazím vzťah pre všetky krajiny spolu:
ggplot(wdi_data, aes(x = gdp_pc, y = unemployment, color = krajina)) +
geom_point(alpha = 0.7) +
geom_smooth(method = "lm", se = FALSE, color = "black") +
labs(
title = "HDP na obyvateľa vs. miera nezamestnanosti",
x = "HDP na obyvateľa (konštantné ceny, USD)",
y = "Nezamestnanosť (%)",
color = "Krajina"
) +
theme_minimal()
Zhrnutie a plán na ďalšie hodiny
V tomto RMarkdown dokumente som:
- Zvolila databázu World Development Indicators
(WDI), ktorá obsahuje časovo zoradené makroekonomické
údaje.
- Stiahla údaje pre Slovensko, Česko a Poľsko za roky
2000–2023:
- HDP na obyvateľa,
- mieru nezamestnanosti,
- infláciu.
- Ukázala:
- základné tabuľkové prehliadnutie dát,
- deskriptívne štatistiky,
- korelačnú maticu,
- viacero grafov (časové rady, scatter plot s regresnou čiarou),
- jednoduchý lineárny model.
Čo plánujem robiť na budúcich hodinách
Na nasledujúcich cvičeniach by som chcela s týmito dátami ďalej
pracovať:
- skúmať trendy a cykly v jednotlivých
ukazovateľoch,
- porovnať dynamiku medzi krajinami,
- vytvoriť panelový dataset a odhadovať jednoduché
panelové modely,
- otestovať vzťah medzi nezamestnanosťou a rastom HDP (napr.
jednoduchá verzia Okunovho zákona),
- pokúsiť sa o krátkodobú predikciu jednotlivých
ukazovateľov.
LS0tCnRpdGxlOiAiWkFEQU5JRSAzIgphdXRob3I6ICJOYXTDoWxpYSBTb2xpZ292w6EiCmRhdGU6ICJOT1ZFTUJFUiAyMDI1IgpvdXRwdXQ6IAogIGh0bWxfbm90ZWJvb2s6CiAgICB0b2M6IHRydWUKICAgIHRvY19mbG9hdDogdHJ1ZQogICAgdGhlbWU6IHVuaXRlZAogICAgaGlnaGxpZ2h0OiB0YW5nbwplZGl0b3Jfb3B0aW9uczogCiAgbWFya2Rvd246IAogICAgd3JhcDogNzIKLS0tCgpgYGB7ciBzZXR1cCwgaW5jbHVkZT1UUlVFfQprbml0cjo6b3B0c19jaHVuayRzZXQoCiAgZWNobyA9IFRSVUUsCiAgbWVzc2FnZSA9IEZBTFNFLAogIHdhcm5pbmcgPSBGQUxTRQopCmBgYAoKIyDDmnZvZCBrIHphZGFuaXUKCiDDmmxvaG91IGplOgoKLSBuYXZyaG7DusWlIHZsYXN0bsO9IGN2acSNZWJuw70gZG9rdW1lbnQgayBwcsOhY2kgcyBkYXRhYsOhem91LAotIHp2b2xpxaUgZGF0YWLDoXp1IHMgw7pkYWptaSB6b3JhZGVuw71taSB2IMSNYXNlLCBrdG9yw7ogYnVkZSBtb8W+bsOpIG5lc2vDtHIKICBwb3XFvmnFpSBuYSDEj2FsxaFpZSBla29ub21ldHJpY2vDqSBhbmFsw716eSwKLSB1a8OhemHFpSB6w6FrbGFkbsO6IHByw6FjdSBzIMO6ZGFqbWkgKGltcG9ydCwgw7pwcmF2YSwgZ3JhZnksIGplZG5vZHVjaMOpIG1vZGVseSkKClYgxI9hbMWhZWogxI1hc3RpIHByZXRvIHBvZHJvYm5lasWhaWUgcG9waXN1amVtICoqdm/EvmJ1IGRhdGFiw6F6eSoqIGEgbsOhc2xlZG5lCmRlbW9uxaF0cnVqZW0gcHLDoWN1IHMgxYhvdSB2IHByb3N0cmVkw60gUi4KCi0tLQoKIyBWb8S+YmEgZGF0YWLDoXp5IOKAkyBXb3JsZCBEZXZlbG9wbWVudCBJbmRpY2F0b3JzIChXREkpCgpBa28gZGF0YWLDoXp1IHNvbSBzaSB6dm9saWxhICoqV29ybGQgRGV2ZWxvcG1lbnQgSW5kaWNhdG9ycyAoV0RJKSoqIHpvClN2ZXRvdmVqIGJhbmt5LiBJZGUgbyB2ZXJlam5lIGRvc3R1cG7DuiBkYXRhYsOhenUsIGt0b3LDoSBvYnNhaHVqZSBkbGjDqQrEjWFzb3bDqSByYWR5IG1ha3JvZWtvbm9taWNrw71jaCB1a2F6b3ZhdGXEvm92IHByZSBtbm/FvnN0dm8ga3JhasOtbiBzdmV0YS4KClYgcsOhbWNpIHRvaHRvIHphZGFuaWEgYnVkZW0gcHJhY292YcWlIHMgdMO9bWl0byDDumRham1pOgoKLSBrcmFqaW55OiAqKlNsb3ZlbnNrbywgxIxlc2tvLCBQb8S+c2tvKiosCi0gb2Jkb2JpZTogKipyb2t5IDIwMDDigJMyMDIzKiogKHJvxI1uw6kgw7pkYWplKSwKLSBwcmVtZW5uw6k6CiAgLSAqKkhEUCBuYSBvYnl2YXRlxL5hIChrb27FoXRhbnRuw6kgY2VueSkqKiwKICAtICoqbWllcmEgbmV6YW1lc3RuYW5vc3RpKiosCiAgLSAqKm1lZHppcm/EjW7DoSBpbmZsw6FjaWEgKENQSSkqKi4KClRpZXRvIMO6ZGFqZSBzw7ogKip6b3JhZGVuw6kgdiDEjWFzZSoqLCB0YWvFvmUgc8O6IHZob2Ruw6kgbmEgxI9hbMWhaXUgYW5hbMO9enUKKMSNYXNvdsOpIHJhZHksIHBvcm92bmFuaWUga3JhasOtbiwgamVkbm9kdWNow6kgcmVncmVzbsOpIG1vZGVseSBhIHBvZC4pLgoKTmEgc8WlYWhvdmFuaWUgZMOhdCBwb3XFvmlqZW0gYmFsw61rICoqV0RJKiogYSBuYSBuw6FzbGVkbsO6IHByw6FjdSBzIMO6ZGFqbWkKYmFsw61reSAqKnRpZHl2ZXJzZSoqLCAqKmtuaXRyKiogYSAqKmthYmxlRXh0cmEqKi4KCi0tLQoKIyBOYcSNw610YW5pZSBrbmnFvm7DrWMKCmBgYHtyIGxpYnJhcmllc30KIyBpbsWhdGFsw6FjaWEgKGliYSByYXosIGFrIGXFoXRlIG5pZSBzw7ogbmFpbsWhdGFsb3ZhbsOpKQojIGluc3RhbGwucGFja2FnZXMoIldESSIpCiMgaW5zdGFsbC5wYWNrYWdlcygidGlkeXZlcnNlIikKIyBpbnN0YWxsLnBhY2thZ2VzKCJrYWJsZUV4dHJhIikKCmxpYnJhcnkoV0RJKQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShrbml0cikKbGlicmFyeShrYWJsZUV4dHJhKQpgYGAKCi0tLQoKIyBTdGlhaG51dGllIGEgcHLDrXByYXZhIMO6ZGFqb3YgeiBXREkKCiMjIFZvxL5iYSBrcmFqw61uIGEgaW5kaWvDoXRvcm92CgpgYGB7ciB3ZGlfZG93bmxvYWR9CiMgSVNPIGvDs2R5IGtyYWrDrW4gKDMtcMOtc21lbm92w6kga8OzZHkpCmtyYWppbnkgPC0gYygiU1ZLIiwgIkNaRSIsICJQT0wiKQoKIyBadm9sZW7DqSBpbmRpa8OhdG9yeSBXREkgKHMgdmxhc3Ruw71taSBuw6F6dmFtaSBzdMS6cGNvdikKaW5kaWthdG9yeSA8LSBjKAogIGdkcF9wYyAgICAgID0gIk5ZLkdEUC5QQ0FQLktEIiwgICAjIEhEUCBuYSBvYnl2YXRlxL5hLCBrb27FoXRhbnRuw6kgY2VueQogIHVuZW1wbG95bWVudCA9ICJTTC5VRU0uVE9UTC5aUyIsICAjIG1pZXJhIG5lemFtZXN0bmFub3N0aSB2ICUKICBpbmZsYXRpb24gICAgPSAiRlAuQ1BJLlRPVEwuWkciICAgIyBtZWR6aXJvxI1uw6EgaW5mbMOhY2lhIENQSSB2ICUKKQoKIyBTdGlhaG51dGllIMO6ZGFqb3YgemEgcm9reSAyMDAw4oCTMjAyMwp3ZGlfcmF3IDwtIFdESSgKICBjb3VudHJ5ICAgPSBrcmFqaW55LAogIGluZGljYXRvciA9IGluZGlrYXRvcnksCiAgc3RhcnQgICAgID0gMjAwMCwKICBlbmQgICAgICAgPSAyMDIzCikKCiMgw5pwcmF2YSBhIHpvcmFkZW5pZSDDumRham92CndkaV9kYXRhIDwtIHdkaV9yYXcgJT4lCiAgcmVuYW1lKAogICAga3JhamluYSA9IGNvdW50cnksCiAgICByb2sgICAgID0geWVhcgogICkgJT4lCiAgYXJyYW5nZShrcmFqaW5hLCByb2spCgpoZWFkKHdkaV9kYXRhKQpgYGAKCi0tLQoKIyBaw6FrbGFkbsO9IHBvcGlzIHp2b2xlbmVqIGRhdGFiw6F6eQoKViB0ZWp0byBwb2RzZWtjaWkga3LDoXRrbyBwb3DDrcWhZW0sIGFrw6kgw7pkYWplIGNoY2VtIGRvIGJ1ZMO6Y25hIHNwcmFjb3bDoXZhxaU6CgotICoqSERQIG5hIG9ieXZhdGXEvmEgKGdkcF9wYykqKiDigJMgdWthem92YXRlxL4gZWtvbm9taWNrZWogw7pyb3ZuZSBrcmFqaW55LAotICoqbmV6YW1lc3RuYW5vc8WlICh1bmVtcGxveW1lbnQpKiog4oCTIHNpdHXDoWNpYSBuYSB0cmh1IHByw6FjZSwKLSAqKmluZmzDoWNpYSAoaW5mbGF0aW9uKSoqIOKAkyBzdGFiaWxpdGEgY2llbi4KClYgxI9hbMWhw61jaCB6YWRhbmlhY2ggYnkgc2EgZGFsaSBuYXByw61rbGFkIHNrw7ptYcWlOgoKLSByb3pkaWVseSB2IMO6cm92bmkgSERQIG5hIG9ieXZhdGXEvmEgbWVkemkga3JhamluYW1pLAotIHZ6xaVhaCBtZWR6aSBIRFAgYSBuZXphbWVzdG5hbm9zxaVvdSAobmFwci4gT2t1bm92IHrDoWtvbiksCi0gdnrFpWFoIG1lZHppIGluZmzDoWNpb3UgYSBuZXphbWVzdG5hbm9zxaVvdSAoUGhpbGxpcHNvdmEga3JpdmthKSwKLSBqZWRub2R1Y2jDqSBwcmVkaWtjaWUgbmEgesOha2xhZGUgdHJlbmR1LgoKLS0tCgojIFBydsOpIHByZWhsaWFkbnV0aWUgZMOhdAoKIyMgWsOha2xhZG7DoSDFoXRydWt0w7pyYQoKYGBge3IgZ2xpbXBzZV9kYXRhfQpnbGltcHNlKHdkaV9kYXRhKQpgYGAKCiMjIFVrw6HFvmthIHBydsO9Y2ggcmlhZGtvdgoKYGBge3IgaGVhZF9kYXRhfQprYWJsZSgKICBoZWFkKHdkaV9kYXRhLCAxMCksCiAgY2FwdGlvbiA9ICJQcnbDvWNoIDEwIHJpYWRrb3Ygc3RpYWhudXTDvWNoIMO6ZGFqb3YgeiBXREkiCikgJT4lCiAga2FibGVfc3R5bGluZygKICAgIGZ1bGxfd2lkdGggPSBGQUxTRSwKICAgIGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIsICJjb25kZW5zZWQiLCAicmVzcG9uc2l2ZSIpCiAgKQpgYGAKCi0tLQoKIyBEZXNrcmlwdMOtdm5hIGFuYWzDvXphCgojIyBaw6FrbGFkbsOpIMWhdGF0aXN0aWt5IHBvZMS+YSBrcmFqw61uCgpgYGB7ciBzdW1tYXJ5X2J5X2NvdW50cnl9CnN1bW1hcnlfdGJsIDwtIHdkaV9kYXRhICU+JQogIGdyb3VwX2J5KGtyYWppbmEpICU+JQogIHN1bW1hcmlzZSgKICAgIHBvY2V0X3Jva292ICAgPSBuX2Rpc3RpbmN0KHJvayksCiAgICBwcmllbWVyX2dkcCAgID0gbWVhbihnZHBfcGMsIG5hLnJtID0gVFJVRSksCiAgICBwcmllbWVyX3VuZW1wID0gbWVhbih1bmVtcGxveW1lbnQsIG5hLnJtID0gVFJVRSksCiAgICBwcmllbWVyX2luZmwgID0gbWVhbihpbmZsYXRpb24sIG5hLnJtID0gVFJVRSksCiAgICAuZ3JvdXBzID0gImRyb3AiCiAgKQoKc3VtbWFyeV90YmwgJT4lCiAga2FibGUoCiAgICBkaWdpdHMgPSAyLAogICAgY2FwdGlvbiA9ICJaw6FrbGFkbsOpIMWhdGF0aXN0aWt5IHVrYXpvdmF0ZcS+b3YgcG9kxL5hIGtyYWrDrW4gKDIwMDDigJMyMDIzKSIKICApICU+JQogIGthYmxlX3N0eWxpbmcoCiAgICBmdWxsX3dpZHRoID0gRkFMU0UsCiAgICBib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiLCAiY29uZGVuc2VkIikKICApCmBgYAoKIyMgS29yZWxhxI1uw6EgbWF0aWNhCgpgYGB7ciBjb3JyZWxhdGlvbl9tYXRyaXh9CmNvcl90YmwgPC0gd2RpX2RhdGEgJT4lCiAgc2VsZWN0KGdkcF9wYywgdW5lbXBsb3ltZW50LCBpbmZsYXRpb24pICU+JQogIGNvcih1c2UgPSAiY29tcGxldGUub2JzIikKCmthYmxlKAogIGNvcl90YmwsCiAgZGlnaXRzID0gMiwKICBjYXB0aW9uID0gIktvcmVsYcSNbsOhIG1hdGljYSB1a2F6b3ZhdGXEvm92IgopICU+JQogIGthYmxlX3N0eWxpbmcoZnVsbF93aWR0aCA9IEZBTFNFKQpgYGAKCi0tLQoKIyBHcmFmaWNrw6kgem7DoXpvcm5lbmllIHbDvXZvamEgdiDEjWFzZQoKViB0ZWp0byDEjWFzdGkgdnlrcmVzbMOtbSAqKsSNYXNvdsOpIHJhZHkqKiB2xaFldGvDvWNoIHRyb2NoIHVrYXpvdmF0ZcS+b3YKcHJlIHp2b2xlbsOpIGtyYWppbnkuIEdyYWZ5IHNhIGF1dG9tYXRpY2t5IHZ5a3Jlc2xpYSBwcmkgS25pdCDihpIgSFRNTC4KCiMjIEhEUCBuYSBvYnl2YXRlxL5hCgpgYGB7ciBwbG90X2dkcCwgZmlnLmNhcD0iVsO9dm9qIEhEUCBuYSBvYnl2YXRlxL5hIChrb27FoXRhbnRuw6kgY2VueSkgdiDEjWFzZSJ9CmdncGxvdCh3ZGlfZGF0YSwgYWVzKHggPSByb2ssIHkgPSBnZHBfcGMsIGNvbG9yID0ga3JhamluYSkpICsKICBnZW9tX2xpbmUoc2l6ZSA9IDEpICsKICBsYWJzKAogICAgdGl0bGUgPSAiSERQIG5hIG9ieXZhdGXEvmEg4oCTIFNsb3ZlbnNrbywgxIxlc2tvLCBQb8S+c2tvIiwKICAgIHggPSAiUm9rIiwKICAgIHkgPSAiSERQIG5hIG9ieXZhdGXEvmEgKGtvbsWhdGFudG7DqSBjZW55LCBVU0QpIiwKICAgIGNvbG9yID0gIktyYWppbmEiCiAgKSArCiAgdGhlbWVfbWluaW1hbCgpCmBgYAoKIyMgTWllcmEgbmV6YW1lc3RuYW5vc3RpCgpgYGB7ciBwbG90X3VuZW1wLCBmaWcuY2FwPSJWw712b2ogbWllcnkgbmV6YW1lc3RuYW5vc3RpIHYgxI1hc2UifQpnZ3Bsb3Qod2RpX2RhdGEsIGFlcyh4ID0gcm9rLCB5ID0gdW5lbXBsb3ltZW50LCBjb2xvciA9IGtyYWppbmEpKSArCiAgZ2VvbV9saW5lKHNpemUgPSAxKSArCiAgbGFicygKICAgIHRpdGxlID0gIk1pZXJhIG5lemFtZXN0bmFub3N0aSDigJMgU2xvdmVuc2tvLCDEjGVza28sIFBvxL5za28iLAogICAgeCA9ICJSb2siLAogICAgeSA9ICJOZXphbWVzdG5hbm9zxaUgKCUpIiwKICAgIGNvbG9yID0gIktyYWppbmEiCiAgKSArCiAgdGhlbWVfbWluaW1hbCgpCmBgYAoKIyMgSW5mbMOhY2lhCgpgYGB7ciBwbG90X2luZmxhdGlvbiwgZmlnLmNhcD0iVsO9dm9qIGluZmzDoWNpZSB2IMSNYXNlIn0KZ2dwbG90KHdkaV9kYXRhLCBhZXMoeCA9IHJvaywgeSA9IGluZmxhdGlvbiwgY29sb3IgPSBrcmFqaW5hKSkgKwogIGdlb21fbGluZShzaXplID0gMSkgKwogIGxhYnMoCiAgICB0aXRsZSA9ICJJbmZsw6FjaWEgKENQSSkg4oCTIFNsb3ZlbnNrbywgxIxlc2tvLCBQb8S+c2tvIiwKICAgIHggPSAiUm9rIiwKICAgIHkgPSAiTWVkemlyb8SNbsOhIHptZW5hIENQSSAoJSkiLAogICAgY29sb3IgPSAiS3JhamluYSIKICApICsKICB0aGVtZV9taW5pbWFsKCkKYGBgCgotLS0KCiMgSmVkbm9kdWNow70gbW9kZWwg4oCTIHZ6xaVhaCBIRFAgYSBuZXphbWVzdG5hbm9zdGkKCkFrbyBpbHVzdHLDoWNpdSBqZWRub2R1Y2jDqWhvIGVrb25vbWV0cmlja8OpaG8gbW9kZWx1IG9kaGFkbmVtIGxpbmXDoXJueQp2esWlYWggbWVkemkgSERQIG5hIG9ieXZhdGXEvmEgYSBtaWVyb3UgbmV6YW1lc3RuYW5vc3RpOgoKXFsKXHRleHR7dW5lbXBsb3ltZW50fV97aXR9ID0gXGJldGFfMCArIFxiZXRhXzEgXGNkb3QgXHRleHR7Z2RwXF9wY31fe2l0fSArIHVfe2l0fSwKXF0KCmtkZSBcKGlcKSByZXByZXplbnR1amUga3JhamludSBhIFwodFwpIHJvay4KCmBgYHtyIHNpbXBsZV9yZWdyZXNzaW9ufQptb2RlbF91bmVtcCA8LSBsbSh1bmVtcGxveW1lbnQgfiBnZHBfcGMsIGRhdGEgPSB3ZGlfZGF0YSkKc3VtbWFyeShtb2RlbF91bmVtcCkKYGBgCgojIyBHcmFmaWNrw6EgaWx1c3Ryw6FjaWEgbW9kZWx1CgpQcmUgamVkbm9kdWNob3PFpSB6b2JyYXrDrW0gdnrFpWFoIHByZSB2xaFldGt5IGtyYWppbnkgc3BvbHU6CgpgYGB7ciBzY2F0dGVyX3JlZ3Jlc3Npb24sIGZpZy5jYXA9IlZ6xaVhaCBtZWR6aSBIRFAgbmEgb2J5dmF0ZcS+YSBhIG5lemFtZXN0bmFub3PFpW91In0KZ2dwbG90KHdkaV9kYXRhLCBhZXMoeCA9IGdkcF9wYywgeSA9IHVuZW1wbG95bWVudCwgY29sb3IgPSBrcmFqaW5hKSkgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjcpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBzZSA9IEZBTFNFLCBjb2xvciA9ICJibGFjayIpICsKICBsYWJzKAogICAgdGl0bGUgPSAiSERQIG5hIG9ieXZhdGXEvmEgdnMuIG1pZXJhIG5lemFtZXN0bmFub3N0aSIsCiAgICB4ID0gIkhEUCBuYSBvYnl2YXRlxL5hIChrb27FoXRhbnRuw6kgY2VueSwgVVNEKSIsCiAgICB5ID0gIk5lemFtZXN0bmFub3PFpSAoJSkiLAogICAgY29sb3IgPSAiS3JhamluYSIKICApICsKICB0aGVtZV9taW5pbWFsKCkKYGBgCgotLS0KCiMgWmhybnV0aWUgYSBwbMOhbiBuYSDEj2FsxaFpZSBob2RpbnkKClYgdG9tdG8gUk1hcmtkb3duIGRva3VtZW50ZSBzb206CgoxLiBadm9saWxhIGRhdGFiw6F6dSAqKldvcmxkIERldmVsb3BtZW50IEluZGljYXRvcnMgKFdESSkqKiwga3RvcsOhIG9ic2FodWplCiAgIMSNYXNvdm8gem9yYWRlbsOpIG1ha3JvZWtvbm9taWNrw6kgw7pkYWplLgoyLiBTdGlhaGxhIMO6ZGFqZSBwcmUgKipTbG92ZW5za28sIMSMZXNrbyBhIFBvxL5za28qKiB6YSByb2t5ICoqMjAwMOKAkzIwMjMqKjoKICAgLSBIRFAgbmEgb2J5dmF0ZcS+YSwKICAgLSBtaWVydSBuZXphbWVzdG5hbm9zdGksCiAgIC0gaW5mbMOhY2l1LgozLiBVa8OhemFsYToKICAgLSB6w6FrbGFkbsOpIHRhYnXEvmtvdsOpIHByZWhsaWFkbnV0aWUgZMOhdCwKICAgLSBkZXNrcmlwdMOtdm5lIMWhdGF0aXN0aWt5LAogICAtIGtvcmVsYcSNbsO6IG1hdGljdSwKICAgLSB2aWFjZXJvIGdyYWZvdiAoxI1hc292w6kgcmFkeSwgc2NhdHRlciBwbG90IHMgcmVncmVzbm91IMSNaWFyb3UpLAogICAtIGplZG5vZHVjaMO9IGxpbmXDoXJueSBtb2RlbC4KCiMjIMSMbyBwbMOhbnVqZW0gcm9iacWlIG5hIGJ1ZMO6Y2ljaCBob2RpbsOhY2gKCk5hIG5hc2xlZHVqw7pjaWNoIGN2acSNZW5pYWNoIGJ5IHNvbSBjaGNlbGEgcyB0w71taXRvIGTDoXRhbWkgxI9hbGVqIHByYWNvdmHFpToKCi0gc2vDum1hxaUgKip0cmVuZHkgYSBjeWtseSoqIHYgamVkbm90bGl2w71jaCB1a2F6b3ZhdGXEvm9jaCwKLSBwb3Jvdm5hxaUgZHluYW1pa3UgbWVkemkga3JhamluYW1pLAotIHZ5dHZvcmnFpSAqKnBhbmVsb3bDvSBkYXRhc2V0KiogYSBvZGhhZG92YcWlIGplZG5vZHVjaMOpIHBhbmVsb3bDqSBtb2RlbHksCi0gb3Rlc3RvdmHFpSB2esWlYWggbWVkemkgbmV6YW1lc3RuYW5vc8Wlb3UgYSByYXN0b20gSERQCiAgKG5hcHIuIGplZG5vZHVjaMOhIHZlcnppYSBPa3Vub3ZobyB6w6Frb25hKSwKLSBwb2vDunNpxaUgc2EgbyAqKmtyw6F0a29kb2LDuiBwcmVkaWtjaXUqKiBqZWRub3RsaXbDvWNoIHVrYXpvdmF0ZcS+b3YuCgoK