knitr::opts_chunk$set(echo = TRUE, message = FALSE, warning = FALSE, cache = FALSE)
install.packages(c("tidyverse","lubridate","scales","corrplot","GGally","kableExtra","broom","rmarkdown","knitr"))
library(tidyverse)
library(lubridate)
library(scales)
library(corrplot)
library(GGally)
library(kableExtra)
library(broom)
Import udajov
df <- read_csv("economic_indicators_dataset_2010_2023.csv")
glimpse(df)
knitr::kable(head(df, 10)) %>% kable_styling(full_width = FALSE)
kable_styling(full_width = FALSE)
Dataset obsahuje makroekonomické premenné: infláciu, rast HDP,
nezamestnanosť, úrokové sadzby a hodnotu akciového indexu. Premenná Date
predstavuje časovú os.
Prevod dátumu
df <- df %>%
mutate(Date = parse_date_time(Date, orders = c("Ymd","Y-m-d","Y")),
Year = year(Date))
Filtrovanie rokov 2010–2023
df <- df %>% filter(Year >= 2010 & Year <= 2023)
Vyčistenie číselných stĺpcov
num_cols <- c("Inflation Rate (%)", "GDP Growth Rate (%)",
"Unemployment Rate (%)", "Interest Rate (%)", "Stock Index Value")
clean_num <- function(x) {
if(is.character(x)) x <- gsub("%|,", ".", x)
as.numeric(x)
}
for(col in num_cols) {
if(col %in% names(df)) df[[col]] <- clean_num(df[[col]])
}
Počet chýbajúcich hodnôt
missing_tbl <- df %>%
summarise(across(all_of(num_cols), ~sum(is.na(.)))) %>%
pivot_longer(everything(), names_to = "Premenná", values_to = "Počet chýbajúcich")
kable(missing_tbl, caption = "Chýbajúce hodnoty podľa premenných") %>%
kable_styling(full_width = FALSE)
Dátum bol prevedený na formát YYYY, číselné údaje boli vyčistené od
znakov „%“.Tabuľka ukazuje, či dataset obsahuje prázdne hodnoty, ktoré
môžu ovplyvniť analýzu.
Popisna statistica
Popisná štatistika (2010–2023)
| Premenná |
n |
mean |
sd |
min |
q25 |
median |
q75 |
max |
| Inflation Rate (%) |
500 |
5.085 |
2.956 |
0.00 |
2.525 |
5.205 |
7.710 |
9.99 |
| GDP Growth Rate (%) |
500 |
2.415 |
4.075 |
-5.00 |
-1.170 |
2.580 |
5.445 |
9.93 |
| Unemployment Rate (%) |
500 |
6.907 |
2.982 |
2.00 |
4.258 |
6.865 |
9.502 |
11.97 |
| Interest Rate (%) |
500 |
4.698 |
3.153 |
-0.98 |
2.027 |
4.975 |
7.352 |
10.00 |
| Stock Index Value |
500 |
20926.227 |
11066.259 |
1017.27 |
11587.863 |
20996.210 |
30824.847 |
39982.21 |
Priemerná inflácia, rast HDP a nezamestnanosť poskytujú prehľad o
ekonomickej stabilite. Ak je mean oveľa vyšší než median, znamená to
prítomnosť extrémnych hodnôt. Vysoké sd indikuje volatilitu danej
premennej.
Casove trendy

Grafy zobrazujú, ako sa menila inflácia, úrokové sadzby,
nezamestnanosť či rast HDP. Možno si všimnúť napríklad rast inflácie po
roku 2020.
Vztahy medzi premennymi

Vidno, že rast HDP má často pozitívny vzťah k výkonnosti akciového
trhu — ekonomický rast podporuje investície.
Korelačná matica (heatmap)
Korelačná matica
| |
Inflation Rate (%) |
GDP Growth Rate (%) |
Unemployment Rate (%) |
Interest Rate (%) |
Stock Index Value |
| Inflation Rate (%) |
1.000 |
0.005 |
0.013 |
0.014 |
-0.011 |
| GDP Growth Rate (%) |
0.005 |
1.000 |
0.030 |
0.040 |
-0.013 |
| Unemployment Rate (%) |
0.013 |
0.030 |
1.000 |
0.020 |
-0.043 |
| Interest Rate (%) |
0.014 |
0.040 |
0.020 |
1.000 |
-0.051 |
| Stock Index Value |
-0.011 |
-0.013 |
-0.043 |
-0.051 |
1.000 |
corr_mat <- cor(df %>% select(all_of(num_cols)), use = "pairwise.complete.obs")
kable(round(corr_mat, 3), caption = "Korelačná matica") %>%
kable_styling(full_width = FALSE)
corrplot(corr_mat, method = "color", type = "upper", addCoef.col = "black",
tl.col = "black", tl.srt = 45, number.cex = 0.7)

Hodnoty blízke +1 ukazujú silnú pozitívnu väzbu (napr. inflácia a
úroková sadzba).Hodnoty blízke –1 znamenajú negatívnu koreláciu (napr.
nezamestnanosť a akciový index).Ak sú niektoré prediktory vysoko
korelované, treba dávať pozor na multikolinearitu v regresii.
Test hypotézy (t-test)
x2010 <- df %>% filter(Year == 2010) %>% pull(`Inflation Rate (%)`)
x2020 <- df %>% filter(Year == 2020) %>% pull(`Inflation Rate (%)`)
t_res <- t.test(x2010, x2020, var.equal = FALSE)
t_res
Welch Two Sample t-test
data: x2010 and x2020
t = 1.5598, df = 67.535, p-value = 0.1235
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
-0.3038695 2.4786652
sample estimates:
mean of x mean of y
6.138485 5.051087
Ak p-hodnota < 0.05 → rozdiel medzi infláciou v rokoch 2010 a
2020 je štatisticky významný.To môže naznačovať vplyv hospodárskej krízy
alebo pandemického obdobia.
Jednoduchá lineárna regresia
model <- lm(`Stock Index Value` ~ `GDP Growth Rate (%)` + `Interest Rate (%)`, data = df)
summary(model)
Call:
lm(formula = `Stock Index Value` ~ `GDP Growth Rate (%)` + `Interest Rate (%)`,
data = df)
Residuals:
Min 1Q Median 3Q Max
-20775.4 -9394.0 173.8 9852.3 19765.5
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 21837.54 927.78 23.537 <2e-16 ***
`GDP Growth Rate (%)` -29.81 121.75 -0.245 0.807
`Interest Rate (%)` -178.65 157.35 -1.135 0.257
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 11070 on 497 degrees of freedom
Multiple R-squared: 0.002756, Adjusted R-squared: -0.001257
F-statistic: 0.6867 on 2 and 497 DF, p-value: 0.5037
tidy(model, conf.int = TRUE) %>%
kable(digits = 4, caption = "Koeficienty regresie") %>%
kable_styling(full_width = FALSE)
Koeficienty regresie
| term |
estimate |
std.error |
statistic |
p.value |
conf.low |
conf.high |
| (Intercept) |
21837.5404 |
927.7771 |
23.5375 |
0.0000 |
20014.6916 |
23660.3893 |
| `GDP Growth Rate (%)` |
-29.8139 |
121.7501 |
-0.2449 |
0.8067 |
-269.0221 |
209.3944 |
| `Interest Rate (%)` |
-178.6479 |
157.3491 |
-1.1354 |
0.2568 |
-487.7994 |
130.5036 |
glance(model) %>%
select(r.squared, adj.r.squared, AIC, BIC, nobs) %>%
kable(digits = 3, caption = "Kvalita modelu") %>%
kable_styling(full_width = FALSE)
Kvalita modelu
| r.squared |
adj.r.squared |
AIC |
BIC |
nobs |
| 0.003 |
-0.001 |
10736.21 |
10753.07 |
500 |
Ak je koeficient pri GDP Growth pozitívny a významný → rast HDP
zvyšuje hodnotu akciového indexu.Ak je Interest Rate negatívny → vyššie
úrokové sadzby znižujú trhové ceny akcií.R² ukazuje, koľko variability
akciového indexu model vysvetľuje.
Zhrnutie a odporúčania
Najvyššia korelácia bola medzi Inflation Rate a Interest Rate –
očakávaný vzťah menovej politiky.
• Rast HDP má kladný vplyv na akciové trhy.
• Inflácia v roku 2020 sa štatisticky líšila od roku 2010.
• Pre lepšie predikcie možno odporučiť rozšírenie modelu o časové
oneskorenia (ARIMA, VAR).
LS0tCnRpdGxlOiAiUHLDoWNhIHMgZGF0YWLDoXpvdSAtIGltcG9ydCDDumRham92LCBncmFmeSwgxaF0YXRpc3Rpa3kiCmF1dGhvcjogIll1bGlpYSBMeXN5dHNpYSAgPGJyPgoocyB2eXXFvml0w61tIHZlcmVqbmUgZG9zdHVwbsO9Y2gga8OzZG92IGEgQ2hhdEdQVCkiCmRhdGU6ICJTZXB0ZW1iZXIgMjAyNSIKb3V0cHV0OiAKICBodG1sX25vdGVib29rOgogICAgdG9jOiB0cnVlCiAgICB0b2NfZmxvYXQ6IHRydWUKICAgIHRoZW1lOiB1bml0ZWQKICAgIGhpZ2hsaWdodDogdGFuZ28KZWRpdG9yX29wdGlvbnM6IAogIG1hcmtkb3duOiAKICAgIHdyYXA6IDcyCi0tLQpgYGB7cn0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFLCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgY2FjaGUgPSBGQUxTRSkKIGluc3RhbGwucGFja2FnZXMoYygidGlkeXZlcnNlIiwibHVicmlkYXRlIiwic2NhbGVzIiwiY29ycnBsb3QiLCJHR2FsbHkiLCJrYWJsZUV4dHJhIiwiYnJvb20iLCJybWFya2Rvd24iLCJrbml0ciIpKQogCiBsaWJyYXJ5KHRpZHl2ZXJzZSkKIGxpYnJhcnkobHVicmlkYXRlKQogbGlicmFyeShzY2FsZXMpCiBsaWJyYXJ5KGNvcnJwbG90KQogbGlicmFyeShHR2FsbHkpCiBsaWJyYXJ5KGthYmxlRXh0cmEpCiBsaWJyYXJ5KGJyb29tKQpgYGAKIAojIyBJbXBvcnQgdWRham92CmBgYHtyfQpkZiA8LSByZWFkX2NzdigiZWNvbm9taWNfaW5kaWNhdG9yc19kYXRhc2V0XzIwMTBfMjAyMy5jc3YiKQpnbGltcHNlKGRmKQprbml0cjo6a2FibGUoaGVhZChkZiwgMTApKSAlPiUga2FibGVfc3R5bGluZyhmdWxsX3dpZHRoID0gRkFMU0UpCmthYmxlX3N0eWxpbmcoZnVsbF93aWR0aCA9IEZBTFNFKQoKYGBgCiMjIyMgRGF0YXNldCBvYnNhaHVqZSBtYWtyb2Vrb25vbWlja8OpIHByZW1lbm7DqTogaW5mbMOhY2l1LCByYXN0IEhEUCwgbmV6YW1lc3RuYW5vc8WlLCDDunJva292w6kgc2FkemJ5IGEgaG9kbm90dSBha2Npb3bDqWhvIGluZGV4dS4gUHJlbWVubsOhIERhdGUgcHJlZHN0YXZ1amUgxI1hc292w7ogb3MuCgojIyBQcmV2b2QgZMOhdHVtdQpgYGB7cn0KZGYgPC0gZGYgJT4lCiBtdXRhdGUoRGF0ZSA9IHBhcnNlX2RhdGVfdGltZShEYXRlLCBvcmRlcnMgPSBjKCJZbWQiLCJZLW0tZCIsIlkiKSksCiAgICAgICAgWWVhciA9IHllYXIoRGF0ZSkpCmBgYAoKIyMgRmlsdHJvdmFuaWUgcm9rb3YgMjAxMOKAkzIwMjMKYGBge3J9CmRmIDwtIGRmICU+JSBmaWx0ZXIoWWVhciA+PSAyMDEwICYgWWVhciA8PSAyMDIzKQpgYGAKCiMjIFZ5xI1pc3RlbmllIMSNw61zZWxuw71jaCBzdMS6cGNvdgpgYGB7cn0KbnVtX2NvbHMgPC0gYygiSW5mbGF0aW9uIFJhdGUgKCUpIiwgIkdEUCBHcm93dGggUmF0ZSAoJSkiLAogICAgICAgICAgICAgIlVuZW1wbG95bWVudCBSYXRlICglKSIsICJJbnRlcmVzdCBSYXRlICglKSIsICJTdG9jayBJbmRleCBWYWx1ZSIpCmNsZWFuX251bSA8LSBmdW5jdGlvbih4KSB7CiBpZihpcy5jaGFyYWN0ZXIoeCkpIHggPC0gZ3N1YigiJXwsIiwgIi4iLCB4KQogYXMubnVtZXJpYyh4KQp9CmZvcihjb2wgaW4gbnVtX2NvbHMpIHsKIGlmKGNvbCAlaW4lIG5hbWVzKGRmKSkgZGZbW2NvbF1dIDwtIGNsZWFuX251bShkZltbY29sXV0pCn0KYGBgCgojIyBQb8SNZXQgY2jDvWJhasO6Y2ljaCBob2Ruw7R0CgpgYGB7cn0KbWlzc2luZ190YmwgPC0gZGYgJT4lCiBzdW1tYXJpc2UoYWNyb3NzKGFsbF9vZihudW1fY29scyksIH5zdW0oaXMubmEoLikpKSkgJT4lCiBwaXZvdF9sb25nZXIoZXZlcnl0aGluZygpLCBuYW1lc190byA9ICJQcmVtZW5uw6EiLCB2YWx1ZXNfdG8gPSAiUG/EjWV0IGNow71iYWrDumNpY2giKQprYWJsZShtaXNzaW5nX3RibCwgY2FwdGlvbiA9ICJDaMO9YmFqw7pjZSBob2Rub3R5IHBvZMS+YSBwcmVtZW5uw71jaCIpICU+JQoga2FibGVfc3R5bGluZyhmdWxsX3dpZHRoID0gRkFMU0UpCmBgYAogCiMjIyMgRMOhdHVtIGJvbCBwcmV2ZWRlbsO9IG5hIGZvcm3DoXQgWVlZWSwgxI3DrXNlbG7DqSDDumRhamUgYm9saSB2ecSNaXN0ZW7DqSBvZCB6bmFrb3Yg4oCeJeKAnC5UYWJ1xL5rYSB1a2F6dWplLCDEjWkgZGF0YXNldCBvYnNhaHVqZSBwcsOhemRuZSBob2Rub3R5LCBrdG9yw6kgbcO0xb51IG92cGx5dm5pxaUgYW5hbMO9enUuCgojIFBvcGlzbmEgc3RhdGlzdGljYSAKYGBge3J9CmRlc2MgPC0gZGYgJT4lCiBzdW1tYXJpc2UoYWNyb3NzKGFsbF9vZihudW1fY29scyksCiAgICAgICAgICAgICAgICAgIGxpc3QobiA9IH5zdW0oIWlzLm5hKC4pKSwKICAgICAgICAgICAgICAgICAgICAgICBtZWFuID0gfm1lYW4oLiwgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgICAgICAgICAgICBzZCA9IH5zZCguLCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICAgICAgICAgICAgIG1pbiA9IH5taW4oLiwgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgICAgICAgICAgICBxMjUgPSB+cXVhbnRpbGUoLiwgMC4yNSwgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgICAgICAgICAgICBtZWRpYW4gPSB+bWVkaWFuKC4sIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgICAgICAgICAgICAgcTc1ID0gfnF1YW50aWxlKC4sIDAuNzUsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgICAgICAgICAgICAgbWF4ID0gfm1heCguLCBuYS5ybSA9IFRSVUUpKSwKICAgICAgICAgICAgICAgICAgLm5hbWVzID0gInsuY29sfV97LmZufSIpKSAlPiUKIHBpdm90X2xvbmdlcihldmVyeXRoaW5nKCksIG5hbWVzX3RvID0gYygiUHJlbWVubsOhIiwixaB0YXRpc3Rpa2EiKSwgbmFtZXNfc2VwID0gIl8iKSAlPiUKIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSAixaB0YXRpc3Rpa2EiLCB2YWx1ZXNfZnJvbSA9ICJ2YWx1ZSIpCmthYmxlKGRlc2MsIGRpZ2l0cyA9IDMsIGNhcHRpb24gPSAiUG9waXNuw6EgxaF0YXRpc3Rpa2EgKDIwMTDigJMyMDIzKSIpICU+JQoga2FibGVfc3R5bGluZyhmdWxsX3dpZHRoID0gRkFMU0UpCmBgYAojIyMjIFByaWVtZXJuw6EgaW5mbMOhY2lhLCByYXN0IEhEUCBhIG5lemFtZXN0bmFub3PFpSBwb3NreXR1asO6IHByZWjEvmFkIG8gZWtvbm9taWNrZWogc3RhYmlsaXRlLiBBayBqZSBtZWFuIG92ZcS+YSB2ecWhxaHDrSBuZcW+IG1lZGlhbiwgem5hbWVuw6EgdG8gcHLDrXRvbW5vc8WlIGV4dHLDqW1ueWNoIGhvZG7DtHQuIFZ5c29rw6kgc2QgaW5kaWt1amUgdm9sYXRpbGl0dSBkYW5laiBwcmVtZW5uZWouCgojIENhc292ZSB0cmVuZHkKYGBge3J9CnRzX2xvbmcgPC0gZGYgJT4lCiBwaXZvdF9sb25nZXIoY29scyA9IGFsbF9vZihudW1fY29scyksIG5hbWVzX3RvID0gIlByZW1lbm7DoSIsIHZhbHVlc190byA9ICJIb2Rub3RhIikKZ2dwbG90KHRzX2xvbmcsIGFlcyh4ID0gRGF0ZSwgeSA9IEhvZG5vdGEpKSArCiBnZW9tX2xpbmUoKSArCiBmYWNldF93cmFwKH5QcmVtZW5uw6EsIHNjYWxlcyA9ICJmcmVlX3kiLCBuY29sID0gMSkgKwogbGFicyh0aXRsZSA9ICJWw712b2ogZWtvbm9taWNrw71jaCB1a2F6b3ZhdGXEvm92ICgyMDEw4oCTMjAyMykiLAogICAgICB4ID0gIlJvayIsIHkgPSAiIikgKwogdGhlbWVfbWluaW1hbCgpCmBgYAojIyMjIEdyYWZ5IHpvYnJhenVqw7osIGFrbyBzYSBtZW5pbGEgaW5mbMOhY2lhLCDDunJva292w6kgc2FkemJ5LCBuZXphbWVzdG5hbm9zxaUgxI1pIHJhc3QgSERQLiBNb8W+bm8gc2kgdsWhaW1uw7rFpSBuYXByw61rbGFkIHJhc3QgaW5mbMOhY2llIHBvIHJva3UgMjAyMC4KCiMgVnp0YWh5IG1lZHppIHByZW1lbm55bWkgCmBgYHtyfQpnZ3Bsb3QoZGYsIGFlcyh4ID0gYEdEUCBHcm93dGggUmF0ZSAoJSlgLCB5ID0gYFN0b2NrIEluZGV4IFZhbHVlYCkpICsKIGdlb21fcG9pbnQoYWxwaGEgPSAwLjYpICsKIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlID0gVFJVRSkgKwogbGFicyh0aXRsZSA9ICJWesWlYWg6IFJhc3QgSERQIGEgYWtjaW92w70gaW5kZXgiLAogICAgICB4ID0gIlJhc3QgSERQICglKSIsIHkgPSAiSG9kbm90YSBha2Npb3bDqWhvIGluZGV4dSIpICsKIHRoZW1lX21pbmltYWwoKQpgYGAKCiMjIyMgVmlkbm8sIMW+ZSByYXN0IEhEUCBtw6EgxI1hc3RvIHBveml0w612bnkgdnrFpWFoIGsgdsO9a29ubm9zdGkgYWtjaW92w6lobyB0cmh1IOKAlCBla29ub21pY2vDvSByYXN0IHBvZHBvcnVqZSBpbnZlc3TDrWNpZS4KCiMgS29yZWxhxI1uw6EgbWF0aWNhIChoZWF0bWFwKQpgYGB7cn0KY29ycl9tYXQgPC0gY29yKGRmICU+JSBzZWxlY3QoYWxsX29mKG51bV9jb2xzKSksIHVzZSA9ICJwYWlyd2lzZS5jb21wbGV0ZS5vYnMiKQprYWJsZShyb3VuZChjb3JyX21hdCwgMyksIGNhcHRpb24gPSAiS29yZWxhxI1uw6EgbWF0aWNhIikgJT4lCiBrYWJsZV9zdHlsaW5nKGZ1bGxfd2lkdGggPSBGQUxTRSkKY29ycnBsb3QoY29ycl9tYXQsIG1ldGhvZCA9ICJjb2xvciIsIHR5cGUgPSAidXBwZXIiLCBhZGRDb2VmLmNvbCA9ICJibGFjayIsCiAgICAgICAgdGwuY29sID0gImJsYWNrIiwgdGwuc3J0ID0gNDUsIG51bWJlci5jZXggPSAwLjcpCmBgYAojIyMjIEhvZG5vdHkgYmzDrXprZSArMSB1a2F6dWrDuiBzaWxuw7ogcG96aXTDrXZudSB2w6R6YnUgKG5hcHIuIGluZmzDoWNpYSBhIMO6cm9rb3bDoSBzYWR6YmEpLkhvZG5vdHkgYmzDrXprZSDigJMxIHpuYW1lbmFqw7ogbmVnYXTDrXZudSBrb3JlbMOhY2l1IChuYXByLiBuZXphbWVzdG5hbm9zxaUgYSBha2Npb3bDvSBpbmRleCkuQWsgc8O6IG5pZWt0b3LDqSBwcmVkaWt0b3J5IHZ5c29rbyBrb3JlbG92YW7DqSwgdHJlYmEgZMOhdmHFpSBwb3pvciBuYSBtdWx0aWtvbGluZWFyaXR1IHYgcmVncmVzaWkuCgojIFRlc3QgaHlwb3TDqXp5ICh0LXRlc3QpCmBgYHtyfQp4MjAxMCA8LSBkZiAlPiUgZmlsdGVyKFllYXIgPT0gMjAxMCkgJT4lIHB1bGwoYEluZmxhdGlvbiBSYXRlICglKWApCngyMDIwIDwtIGRmICU+JSBmaWx0ZXIoWWVhciA9PSAyMDIwKSAlPiUgcHVsbChgSW5mbGF0aW9uIFJhdGUgKCUpYCkKdF9yZXMgPC0gdC50ZXN0KHgyMDEwLCB4MjAyMCwgdmFyLmVxdWFsID0gRkFMU0UpCnRfcmVzCmBgYAojIyMjIEFrIHAtaG9kbm90YSA8IDAuMDUg4oaSIHJvemRpZWwgbWVkemkgaW5mbMOhY2lvdSB2IHJva29jaCAyMDEwIGEgMjAyMCBqZSDFoXRhdGlzdGlja3kgdsO9em5hbW7DvS5UbyBtw7TFvmUgbmF6bmHEjW92YcWlIHZwbHl2IGhvc3BvZMOhcnNrZWoga3LDrXp5IGFsZWJvIHBhbmRlbWlja8OpaG8gb2Jkb2JpYS4KCiMgSmVkbm9kdWNow6EgbGluZcOhcm5hIHJlZ3Jlc2lhCmBgYHtyfQptb2RlbCA8LSBsbShgU3RvY2sgSW5kZXggVmFsdWVgIH4gYEdEUCBHcm93dGggUmF0ZSAoJSlgICsgYEludGVyZXN0IFJhdGUgKCUpYCwgZGF0YSA9IGRmKQpzdW1tYXJ5KG1vZGVsKQp0aWR5KG1vZGVsLCBjb25mLmludCA9IFRSVUUpICU+JQoga2FibGUoZGlnaXRzID0gNCwgY2FwdGlvbiA9ICJLb2VmaWNpZW50eSByZWdyZXNpZSIpICU+JQoga2FibGVfc3R5bGluZyhmdWxsX3dpZHRoID0gRkFMU0UpCmdsYW5jZShtb2RlbCkgJT4lCiBzZWxlY3Qoci5zcXVhcmVkLCBhZGouci5zcXVhcmVkLCBBSUMsIEJJQywgbm9icykgJT4lCiBrYWJsZShkaWdpdHMgPSAzLCBjYXB0aW9uID0gIkt2YWxpdGEgbW9kZWx1IikgJT4lCiBrYWJsZV9zdHlsaW5nKGZ1bGxfd2lkdGggPSBGQUxTRSkKYGBgCgojIyMjIEFrIGplIGtvZWZpY2llbnQgcHJpIEdEUCBHcm93dGggcG96aXTDrXZueSBhIHbDvXpuYW1uw70g4oaSIHJhc3QgSERQIHp2ecWhdWplIGhvZG5vdHUgYWtjaW92w6lobyBpbmRleHUuQWsgamUgSW50ZXJlc3QgUmF0ZSBuZWdhdMOtdm55IOKGkiB2ecWhxaFpZSDDunJva292w6kgc2FkemJ5IHpuacW+dWrDuiB0cmhvdsOpIGNlbnkgYWtjacOtLlLCsiB1a2F6dWplLCBrb8S+a28gdmFyaWFiaWxpdHkgYWtjaW92w6lobyBpbmRleHUgbW9kZWwgdnlzdmV0xL51amUuCgojIFpocm51dGllIGEgb2Rwb3LDusSNYW5pYQojIyMjIE5hanZ5xaHFoWlhIGtvcmVsw6FjaWEgYm9sYSBtZWR6aSBJbmZsYXRpb24gUmF0ZSBhIEludGVyZXN0IFJhdGUg4oCTIG/EjWFrw6F2YW7DvSB2esWlYWggbWVub3ZlaiBwb2xpdGlreS4KIyMjIyDigKIgUmFzdCBIRFAgbcOhIGtsYWRuw70gdnBseXYgbmEgYWtjaW92w6kgdHJoeS4KIyMjIyDigKIgSW5mbMOhY2lhIHYgcm9rdSAyMDIwIHNhIMWhdGF0aXN0aWNreSBsw63FoWlsYSBvZCByb2t1IDIwMTAuCiMjIyMg4oCiIFByZSBsZXDFoWllIHByZWRpa2NpZSBtb8W+bm8gb2Rwb3J1xI1pxaUgcm96xaHDrXJlbmllIG1vZGVsdSBvIMSNYXNvdsOpIG9uZXNrb3JlbmlhIChBUklNQSwgVkFSKS4=