# 0) Balíčky (len ak chýbajú, doinštalujú sa)
needs <- c("dplyr","ggplot2","tseries","car")
to_install <- needs[!needs %in% rownames(installed.packages())]
if (length(to_install)) install.packages(to_install, quiet = TRUE)
lapply(needs, library, character.only = TRUE)
[[1]]
[1] "dplyr"     "stats"     "graphics"  "grDevices" "utils"     "datasets" 
[7] "methods"   "base"     

[[2]]
[1] "ggplot2"   "dplyr"     "stats"     "graphics"  "grDevices" "utils"    
[7] "datasets"  "methods"   "base"     

[[3]]
 [1] "tseries"   "ggplot2"   "dplyr"     "stats"     "graphics"  "grDevices"
 [7] "utils"     "datasets"  "methods"   "base"     

[[4]]
 [1] "car"       "carData"   "tseries"   "ggplot2"   "dplyr"     "stats"    
 [7] "graphics"  "grDevices" "utils"     "datasets"  "methods"   "base"     
# 1) Robustné načítanie dát
safe_read <- function(path){
  df <- tryCatch(read.csv(path, header=TRUE, sep=";", dec=",",
                          check.names=FALSE, stringsAsFactors=FALSE), error=function(e) NULL)
  if (is.null(df) || ncol(df) == 1)
    df <- read.csv(path, header=TRUE, sep=",", dec=".",
                   check.names=FALSE, stringsAsFactors=FALSE)
  df
}
udaje <- safe_read("dataEKONOMETRIA.csv")
if (is.null(udaje)) stop("Súbor 'dataEKONOMETRIA.csv' sa nepodarilo načítať. Cesta: ", getwd())

cat("Nájdené stĺpce:\n"); print(colnames(udaje)); cat("\n")
Nájdené stĺpce:
[1] "Nazov"       "Kategoria"   "Forma"       "ROE"         "ROA"        
[6] "EBIT"        "EBITDAmarza" "M"           "Z"          
head(data)
                                                                            
1 function (..., list = character(), package = NULL, lib.loc = NULL,        
2     verbose = getOption("verbose"), envir = .GlobalEnv, overwrite = TRUE) 
3 {                                                                         
4     fileExt <- function(x) {                                              
5         db <- grepl("\\\\.[^.]+\\\\.(gz|bz2|xz)$", x)                     
6         ans <- sub(".*\\\\.", "", x)                                      
install.packages(c("readr", "dplyr", "ggplot2", "lmtest", "sandwich", "car", "tseries"))
trying URL 'http://rspm/default/__linux__/focal/latest/src/contrib/readr_2.1.5.tar.gz'
trying URL 'http://rspm/default/__linux__/focal/latest/src/contrib/dplyr_1.1.4.tar.gz'
trying URL 'http://rspm/default/__linux__/focal/latest/src/contrib/ggplot2_4.0.0.tar.gz'
trying URL 'http://rspm/default/__linux__/focal/latest/src/contrib/lmtest_0.9-40.tar.gz'
trying URL 'http://rspm/default/__linux__/focal/latest/src/contrib/sandwich_3.1-1.tar.gz'
trying URL 'http://rspm/default/__linux__/focal/latest/src/contrib/car_3.1-3.tar.gz'
trying URL 'http://rspm/default/__linux__/focal/latest/src/contrib/tseries_0.10-58.tar.gz'

The downloaded source packages are in
    ‘/tmp/RtmpUc0CYs/downloaded_packages’
# Načítanie potrebných balíčkov

library(readr)
library(dplyr)
library(ggplot2)
library(lmtest)
library(sandwich)
library(car)
library(tseries)

# Načítanie dát a základný opis

firmy <- read_csv("dataEKONOMETRIA.csv")

glimpse(firmy)
Rows: 53
Columns: 9
$ Nazov       <chr> "Accenture, s.r.o.", "Beiersdorf Slovakia, s.r.o.", "Be…
$ Kategoria   <dbl> 3, 1, 4, 5, 3, 4, 4, 3, 4, 4, 2, 4, 3, 4, 4, 3, 3, 3, 3…
$ Forma       <chr> "sro", "sro", "sro", "sro", "as", "sro", "as", "sro", "…
$ ROE         <dbl> 0.270192860, 0.293773272, 0.664287656, 0.095621306, 0.1…
$ ROA         <dbl> 0.078790333, 0.080062193, 0.055303738, 0.036313948, 0.0…
$ EBIT        <dbl> 1250080, 1072061, 12586000, 19677000, 8126000, 9582736,…
$ EBITDAmarza <dbl> 0.13899269, 0.03386505, 0.05668215, 0.08028712, 0.00000…
$ M           <dbl> 1, 2, 6, 5, 6, 4, 7, 0, 10, 1, 6, 4, 8, 5, 3, 11, 2, 1,…
$ Z           <dbl> 0, 1, 0, 3, 2, 0, 4, 2, 7, 0, 0, 0, 1, 2, 0, 2, 0, 1, 1…
summary(firmy)
    Nazov             Kategoria        Forma                ROE          
 Length:53          Min.   :1.000   Length:53          Min.   :-1.84304  
 Class :character   1st Qu.:2.000   Class :character   1st Qu.: 0.08053  
 Mode  :character   Median :3.000   Mode  :character   Median : 0.12639  
                    Mean   :3.057                      Mean   : 0.20327  
                    3rd Qu.:4.000                      3rd Qu.: 0.31271  
                    Max.   :5.000                      Max.   : 0.99781  
      ROA                EBIT            EBITDAmarza             M     
 Min.   :-0.16527   Min.   :  -790635   Min.   :-0.04082   Min.   : 0  
 1st Qu.: 0.02724   1st Qu.:  2008948   1st Qu.: 0.03528   1st Qu.: 2  
 Median : 0.06000   Median :  6643237   Median : 0.05559   Median : 4  
 Mean   : 0.09227   Mean   : 77168704   Mean   : 0.11727   Mean   : 6  
 3rd Qu.: 0.11555   3rd Qu.: 30844065   3rd Qu.: 0.13260   3rd Qu.: 9  
 Max.   : 0.70448   Max.   :932605000   Max.   : 0.83243   Max.   :23  
       Z        
 Min.   :0.000  
 1st Qu.:0.000  
 Median :1.000  
 Mean   :1.717  
 3rd Qu.:3.000  
 Max.   :7.000  
# Úprava premenných a vytvorenie nových ukazovateľov

firmy <- firmy %>%
mutate(
# Prevod EBIT na číselnú premennú odstránením oddeľovača tisícok
EBIT_num = as.numeric(gsub(",", "", EBIT)),
# Celkový počet členov vedenia
pocet_clenov = M + Z,
# Podiel žien vo vedení
podiel_zien = Z / pocet_clenov,
# Podiel mužov vo vedení
podiel_muzov = M / pocet_clenov,
# Kategória a forma ako faktorové premenné
Kategoria = factor(Kategoria),
Forma = factor(Forma)
)

# Kontrola upravených dát

firmy %>%
select(Nazov, Kategoria, Forma, ROE, ROA, EBIT_num, EBITDAmarza, M, Z, podiel_zien, podiel_muzov) %>%
head()
NA
# Základné vizualizácie vybraných premenných

ggplot(firmy, aes(x = ROE)) +
geom_histogram(bins = 15) +
labs(title = "Rozdelenie ukazovateľa ROE")


ggplot(firmy, aes(x = podiel_zien)) +
geom_histogram(bins = 10) +
labs(title = "Rozdelenie podielu žien vo vedení")


ggplot(firmy, aes(x = podiel_zien, y = ROE)) +
geom_point() +
labs(title = "Vzťah medzi ROE a podielom žien vo vedení")

# Odhad lineárneho regresného modelu s ROE ako závislou premennou

model1 <- lm(ROE ~ podiel_zien + ROA + EBITDAmarza, data = firmy)

# Výstup modelu obsahuje odhady parametrov, ich smerodajné odchýlky a štatistickú významnosť

summary(model1)

Call:
lm(formula = ROE ~ podiel_zien + ROA + EBITDAmarza, data = firmy)

Residuals:
     Min       1Q   Median       3Q      Max 
-2.25674 -0.07073 -0.00477  0.05133  0.82942 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)   
(Intercept)  0.05891    0.08947   0.658   0.5133   
podiel_zien  0.21318    0.28974   0.736   0.4654   
ROA          1.55811    0.50071   3.112   0.0031 **
EBITDAmarza -0.36215    0.41051  -0.882   0.3820   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.4214 on 49 degrees of freedom
Multiple R-squared:  0.2117,    Adjusted R-squared:  0.1634 
F-statistic: 4.385 on 3 and 49 DF,  p-value: 0.008219
# Rozšírený model s kategóriou a formou ako dodatočnými vysvetľujúcimi premennými

model2 <- lm(ROE ~ podiel_zien + ROA + EBITDAmarza + Kategoria + Forma, data = firmy)

summary(model2)

Call:
lm(formula = ROE ~ podiel_zien + ROA + EBITDAmarza + Kategoria + 
    Forma, data = firmy)

Residuals:
     Min       1Q   Median       3Q      Max 
-2.15800 -0.10117 -0.03845  0.10002  0.89147 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)   
(Intercept) -0.233991   0.275110  -0.851  0.39963   
podiel_zien  0.255261   0.301150   0.848  0.40124   
ROA          1.812357   0.536228   3.380  0.00153 **
EBITDAmarza -0.550542   0.445212  -1.237  0.22280   
Kategoria2   0.158131   0.249659   0.633  0.52976   
Kategoria3   0.299437   0.245102   1.222  0.22833   
Kategoria4   0.397898   0.254715   1.562  0.12542   
Kategoria5   0.226616   0.380624   0.595  0.55464   
Formasro     0.008296   0.142221   0.058  0.95375   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.4272 on 44 degrees of freedom
Multiple R-squared:  0.2726,    Adjusted R-squared:  0.1403 
F-statistic: 2.061 on 8 and 44 DF,  p-value: 0.06081
# Diagnostické grafy pre model1

par(mfrow = c(2, 2))
plot(model1)
par(mfrow = c(1, 1))

# Test normality rezíduí (Shapiro-Wilk)

shapiro.test(residuals(model1))

    Shapiro-Wilk normality test

data:  residuals(model1)
W = 0.65623, p-value = 7.067e-10
# Jarque-Bera test normality rezíduí

jarque.bera.test(residuals(model1))

    Jarque Bera Test

data:  residuals(model1)
X-squared = 661.83, df = 2, p-value < 2.2e-16
# Test heteroskedasticity rezíduí (Breusch-Paganov test)

bptest(model1)

    studentized Breusch-Pagan test

data:  model1
BP = 4.9401, df = 3, p-value = 0.1762
# Odhad koeficientov s robustnými smerodajnými chybami (HC1)

coeftest(model1, vcov = vcovHC(model1, type = "HC1"))

t test of coefficients:

             Estimate Std. Error t value Pr(>|t|)  
(Intercept)  0.058906   0.079550  0.7405  0.46254  
podiel_zien  0.213180   0.385813  0.5525  0.58308  
ROA          1.558106   0.738731  2.1092  0.04006 *
EBITDAmarza -0.362146   0.227874 -1.5892  0.11844  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
# Test prítomnosti autokorelácie rezíduí (Durbin-Watsonov test)

durbinWatsonTest(model1)
 lag Autocorrelation D-W Statistic p-value
   1       0.3252467      1.347163    0.03
 Alternative hypothesis: rho != 0
# Identifikácia pozorovaní s vysokou vplyvnosťou a odľahlosťou

influencePlot(model1, main = "Vplyvné a odľahlé pozorovania")
NA

# Prehľad vplyvných pozorovaní podľa Cookovej vzdialenosti

cooks <- cooks.distance(model1)

# Zobrazenie pozorovaní s vysokou hodnotou Cookovej vzdialenosti

vplyvne <- which(cooks > 4 * mean(cooks, na.rm = TRUE))
firmy[vplyvne, ]
NA
summary(model1)

Call:
lm(formula = ROE ~ podiel_zien + ROA + EBITDAmarza, data = firmy)

Residuals:
     Min       1Q   Median       3Q      Max 
-2.25674 -0.07073 -0.00477  0.05133  0.82942 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)   
(Intercept)  0.05891    0.08947   0.658   0.5133   
podiel_zien  0.21318    0.28974   0.736   0.4654   
ROA          1.55811    0.50071   3.112   0.0031 **
EBITDAmarza -0.36215    0.41051  -0.882   0.3820   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.4214 on 49 degrees of freedom
Multiple R-squared:  0.2117,    Adjusted R-squared:  0.1634 
F-statistic: 4.385 on 3 and 49 DF,  p-value: 0.008219

Zhrnutie výsledkov

Na základe výsledkov regresnej analýzy možno konštatovať, že:

Celkovo možno povedať, že rentabilita aktív (ROA) má preukázateľne najsilnejší vplyv na rentabilitu vlastného kapitálu, zatiaľ čo podiel žien vo vedení a EBITDA marža nevykazujú štatisticky významný efekt.

shapiro.test(residuals(model1))

    Shapiro-Wilk normality test

data:  residuals(model1)
W = 0.65623, p-value = 7.067e-10
jarque.bera.test(residuals(model1))

    Jarque Bera Test

data:  residuals(model1)
X-squared = 661.83, df = 2, p-value < 2.2e-16
bptest(model1)

    studentized Breusch-Pagan test

data:  model1
BP = 4.9401, df = 3, p-value = 0.1762
durbinWatsonTest(model1)
 lag Autocorrelation D-W Statistic p-value
   1       0.3252467      1.347163   0.036
 Alternative hypothesis: rho != 0

Diagnostika modelu

Na základe vykonaných diagnostických testov možno zhrnúť, že:

Celkovo možno konštatovať, že model ako celok je štatisticky významný, no niektoré predpoklady klasického lineárneho modelu (najmä normalita a nezávislosť rezíduí) nie sú úplne splnené. Tieto zistenia je potrebné zohľadniť pri interpretácii výsledkov.

Heteroskedasticita

Prítomnosť heteroskedasticity (nekonštantného rozptylu rezíduí) môže viesť k nespoľahlivým odhadom smerodajných chýb a následne k nesprávnym záverom o štatistickej významnosti regresných koeficientov.
V tejto časti overujeme, či je v modeli prítomná heteroskedasticita, a ak áno, ukážeme spôsoby jej riešenia.

library(lmtest)
library(sandwich)
library(ggplot2)
library(patchwork)

# vizuálne posúdenie - závislosť štvorcov rezíduí od vysvetľujúcich premenných
p1 <- ggplot(firmy, aes(x = ROA, y = resid(model1)^2)) +
  geom_point(alpha = 0.6) +
  geom_smooth(method = "loess", se = FALSE, color = "red") +
  labs(title = "Squared residuals vs ROA", x = "ROA", y = "Squared residuals") +
  theme_minimal()

p2 <- ggplot(firmy, aes(x = podiel_zien, y = resid(model1)^2)) +
  geom_point(alpha = 0.6) +
  geom_smooth(method = "loess", se = FALSE, color = "red") +
  labs(title = "Squared residuals vs podiel žien", x = "Podiel žien vo vedení", y = "Squared residuals") +
  theme_minimal()

p1 + p2

Z grafov je možné posúdiť, či existuje systematický trend medzi rozptylom rezíduí a vysvetľujúcimi premennými. Ak by červená krivka mala zreteľný rastúci alebo klesajúci tvar, mohlo by to naznačovať prítomnosť heteroskedasticity.

# Breusch–Paganov test heteroskedasticity
bptest(model1)

    studentized Breusch-Pagan test

data:  model1
BP = 4.9401, df = 3, p-value = 0.1762

Na základe výsledku testu (p = 0.1762) možno konštatovať, že heteroskedasticita v modeli nebola preukázaná. Pre účely demonštrácie však môžeme ukázať, ako by sa heteroskedasticita riešila, ak by bola prítomná.
Najčastejším postupom je použitie tzv. Whiteovho (robustného) odhadu kovariančnej matice, ktorý upravuje smerodajné chyby koeficientov.

# Odhad koeficientov s robustnými smerodajnými chybami
coeftest(model1, vcov = vcovHC(model1, type = "HC1"))

t test of coefficients:

             Estimate Std. Error t value Pr(>|t|)  
(Intercept)  0.058906   0.079550  0.7405  0.46254  
podiel_zien  0.213180   0.385813  0.5525  0.58308  
ROA          1.558106   0.738731  2.1092  0.04006 *
EBITDAmarza -0.362146   0.227874 -1.5892  0.11844  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
# Graf štvorcov rezíduí voči predikovaným hodnotám ROE
plot(
  fitted(model1),
  residuals(model1)^2,
  xlab = "Odhadované hodnoty ROE",
  ylab = "Štvorce rezíduí",
  main = "Štvorce rezíduí vs. odhadované hodnoty"
)

library(sandwich)
library(lmtest)

# Odhad koeficientov s robustnými smerodajnými chybami (Whiteova korekcia)
coeftest(model1, vcov = vcovHC(model1, type = "HC1"))

t test of coefficients:

             Estimate Std. Error t value Pr(>|t|)  
(Intercept)  0.058906   0.079550  0.7405  0.46254  
podiel_zien  0.213180   0.385813  0.5525  0.58308  
ROA          1.558106   0.738731  2.1092  0.04006 *
EBITDAmarza -0.362146   0.227874 -1.5892  0.11844  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

``` Na základe výsledku Breusch–Paganovho testu (p-hodnota 0.1762) možno konštatovať, že heteroskedasticita rezíduí v modeli nebola preukázaná. Z tohto dôvodu predpoklad konštantného rozptylu náhodnej zložky považujeme za splnený. Pre demonštráciu postupu však boli vypočítané aj robustné smerodajné chyby, ktoré by bolo vhodné používať v prípade, ak by heteroskedasticita bola prítomná.

LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQpgYGB7cn0KIyAwKSBCYWzDrcSNa3kgKGxlbiBhayBjaMO9YmFqw7osIGRvaW7FoXRhbHVqw7ogc2EpCm5lZWRzIDwtIGMoImRwbHlyIiwiZ2dwbG90MiIsInRzZXJpZXMiLCJjYXIiKQp0b19pbnN0YWxsIDwtIG5lZWRzWyFuZWVkcyAlaW4lIHJvd25hbWVzKGluc3RhbGxlZC5wYWNrYWdlcygpKV0KaWYgKGxlbmd0aCh0b19pbnN0YWxsKSkgaW5zdGFsbC5wYWNrYWdlcyh0b19pbnN0YWxsLCBxdWlldCA9IFRSVUUpCmxhcHBseShuZWVkcywgbGlicmFyeSwgY2hhcmFjdGVyLm9ubHkgPSBUUlVFKQpgYGAKYGBge3J9CiMgMSkgUm9idXN0bsOpIG5hxI3DrXRhbmllIGTDoXQKc2FmZV9yZWFkIDwtIGZ1bmN0aW9uKHBhdGgpewogIGRmIDwtIHRyeUNhdGNoKHJlYWQuY3N2KHBhdGgsIGhlYWRlcj1UUlVFLCBzZXA9IjsiLCBkZWM9IiwiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrLm5hbWVzPUZBTFNFLCBzdHJpbmdzQXNGYWN0b3JzPUZBTFNFKSwgZXJyb3I9ZnVuY3Rpb24oZSkgTlVMTCkKICBpZiAoaXMubnVsbChkZikgfHwgbmNvbChkZikgPT0gMSkKICAgIGRmIDwtIHJlYWQuY3N2KHBhdGgsIGhlYWRlcj1UUlVFLCBzZXA9IiwiLCBkZWM9Ii4iLAogICAgICAgICAgICAgICAgICAgY2hlY2submFtZXM9RkFMU0UsIHN0cmluZ3NBc0ZhY3RvcnM9RkFMU0UpCiAgZGYKfQp1ZGFqZSA8LSBzYWZlX3JlYWQoImRhdGFFS09OT01FVFJJQS5jc3YiKQppZiAoaXMubnVsbCh1ZGFqZSkpIHN0b3AoIlPDumJvciAnZGF0YUVLT05PTUVUUklBLmNzdicgc2EgbmVwb2RhcmlsbyBuYcSNw610YcWlLiBDZXN0YTogIiwgZ2V0d2QoKSkKCmNhdCgiTsOhamRlbsOpIHN0xLpwY2U6XG4iKTsgcHJpbnQoY29sbmFtZXModWRhamUpKTsgY2F0KCJcbiIpCmBgYApgYGB7cn0KaGVhZChkYXRhKQoKYGBgCmBgYHtyfQppbnN0YWxsLnBhY2thZ2VzKGMoInJlYWRyIiwgImRwbHlyIiwgImdncGxvdDIiLCAibG10ZXN0IiwgInNhbmR3aWNoIiwgImNhciIsICJ0c2VyaWVzIikpCmBgYApgYGB7cn0KIyBOYcSNw610YW5pZSBwb3RyZWJuw71jaCBiYWzDrcSNa292CgpsaWJyYXJ5KHJlYWRyKQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkobG10ZXN0KQpsaWJyYXJ5KHNhbmR3aWNoKQpsaWJyYXJ5KGNhcikKbGlicmFyeSh0c2VyaWVzKQoKIyBOYcSNw610YW5pZSBkw6F0IGEgesOha2xhZG7DvSBvcGlzCgpmaXJteSA8LSByZWFkX2NzdigiZGF0YUVLT05PTUVUUklBLmNzdiIpCgpnbGltcHNlKGZpcm15KQpzdW1tYXJ5KGZpcm15KQoKYGBgCmBgYHtyfQojIMOacHJhdmEgcHJlbWVubsO9Y2ggYSB2eXR2b3JlbmllIG5vdsO9Y2ggdWthem92YXRlxL5vdgoKZmlybXkgPC0gZmlybXkgJT4lCm11dGF0ZSgKIyBQcmV2b2QgRUJJVCBuYSDEjcOtc2VsbsO6IHByZW1lbm7DuiBvZHN0csOhbmVuw61tIG9kZGXEvm92YcSNYSB0aXPDrWNvawpFQklUX251bSA9IGFzLm51bWVyaWMoZ3N1YigiLCIsICIiLCBFQklUKSksCiMgQ2Vsa292w70gcG/EjWV0IMSNbGVub3YgdmVkZW5pYQpwb2NldF9jbGVub3YgPSBNICsgWiwKIyBQb2RpZWwgxb5pZW4gdm8gdmVkZW7DrQpwb2RpZWxfemllbiA9IFogLyBwb2NldF9jbGVub3YsCiMgUG9kaWVsIG11xb5vdiB2byB2ZWRlbsOtCnBvZGllbF9tdXpvdiA9IE0gLyBwb2NldF9jbGVub3YsCiMgS2F0ZWfDs3JpYSBhIGZvcm1hIGFrbyBmYWt0b3JvdsOpIHByZW1lbm7DqQpLYXRlZ29yaWEgPSBmYWN0b3IoS2F0ZWdvcmlhKSwKRm9ybWEgPSBmYWN0b3IoRm9ybWEpCikKCiMgS29udHJvbGEgdXByYXZlbsO9Y2ggZMOhdAoKZmlybXkgJT4lCnNlbGVjdChOYXpvdiwgS2F0ZWdvcmlhLCBGb3JtYSwgUk9FLCBST0EsIEVCSVRfbnVtLCBFQklUREFtYXJ6YSwgTSwgWiwgcG9kaWVsX3ppZW4sIHBvZGllbF9tdXpvdikgJT4lCmhlYWQoKQoKYGBgCmBgYHtyfQojIFrDoWtsYWRuw6kgdml6dWFsaXrDoWNpZSB2eWJyYW7DvWNoIHByZW1lbm7DvWNoCgpnZ3Bsb3QoZmlybXksIGFlcyh4ID0gUk9FKSkgKwpnZW9tX2hpc3RvZ3JhbShiaW5zID0gMTUpICsKbGFicyh0aXRsZSA9ICJSb3pkZWxlbmllIHVrYXpvdmF0ZcS+YSBST0UiKQoKZ2dwbG90KGZpcm15LCBhZXMoeCA9IHBvZGllbF96aWVuKSkgKwpnZW9tX2hpc3RvZ3JhbShiaW5zID0gMTApICsKbGFicyh0aXRsZSA9ICJSb3pkZWxlbmllIHBvZGllbHUgxb5pZW4gdm8gdmVkZW7DrSIpCgpnZ3Bsb3QoZmlybXksIGFlcyh4ID0gcG9kaWVsX3ppZW4sIHkgPSBST0UpKSArCmdlb21fcG9pbnQoKSArCmxhYnModGl0bGUgPSAiVnrFpWFoIG1lZHppIFJPRSBhIHBvZGllbG9tIMW+aWVuIHZvIHZlZGVuw60iKQoKYGBgCmBgYHtyfQojIE9kaGFkIGxpbmXDoXJuZWhvIHJlZ3Jlc27DqWhvIG1vZGVsdSBzIFJPRSBha28gesOhdmlzbG91IHByZW1lbm5vdQoKbW9kZWwxIDwtIGxtKFJPRSB+IHBvZGllbF96aWVuICsgUk9BICsgRUJJVERBbWFyemEsIGRhdGEgPSBmaXJteSkKCiMgVsO9c3R1cCBtb2RlbHUgb2JzYWh1amUgb2RoYWR5IHBhcmFtZXRyb3YsIGljaCBzbWVyb2Rham7DqSBvZGNow71sa3kgYSDFoXRhdGlzdGlja8O6IHbDvXpuYW1ub3PFpQoKc3VtbWFyeShtb2RlbDEpCgpgYGAKYGBge3J9CiMgUm96xaHDrXJlbsO9IG1vZGVsIHMga2F0ZWfDs3Jpb3UgYSBmb3Jtb3UgYWtvIGRvZGF0b8SNbsO9bWkgdnlzdmV0xL51asO6Y2ltaSBwcmVtZW5uw71taQoKbW9kZWwyIDwtIGxtKFJPRSB+IHBvZGllbF96aWVuICsgUk9BICsgRUJJVERBbWFyemEgKyBLYXRlZ29yaWEgKyBGb3JtYSwgZGF0YSA9IGZpcm15KQoKc3VtbWFyeShtb2RlbDIpCgpgYGAKYGBge3J9CiMgRGlhZ25vc3RpY2vDqSBncmFmeSBwcmUgbW9kZWwxCgpwYXIobWZyb3cgPSBjKDIsIDIpKQpwbG90KG1vZGVsMSkKcGFyKG1mcm93ID0gYygxLCAxKSkKCmBgYApgYGB7cn0KIyBUZXN0IG5vcm1hbGl0eSByZXrDrWR1w60gKFNoYXBpcm8tV2lsaykKCnNoYXBpcm8udGVzdChyZXNpZHVhbHMobW9kZWwxKSkKCiMgSmFycXVlLUJlcmEgdGVzdCBub3JtYWxpdHkgcmV6w61kdcOtCgpqYXJxdWUuYmVyYS50ZXN0KHJlc2lkdWFscyhtb2RlbDEpKQoKYGBgCmBgYHtyfQojIFRlc3QgaGV0ZXJvc2tlZGFzdGljaXR5IHJlesOtZHXDrSAoQnJldXNjaC1QYWdhbm92IHRlc3QpCgpicHRlc3QobW9kZWwxKQoKIyBPZGhhZCBrb2VmaWNpZW50b3YgcyByb2J1c3Ruw71taSBzbWVyb2Rham7DvW1pIGNoeWJhbWkgKEhDMSkKCmNvZWZ0ZXN0KG1vZGVsMSwgdmNvdiA9IHZjb3ZIQyhtb2RlbDEsIHR5cGUgPSAiSEMxIikpCgpgYGAKYGBge3J9CiMgVGVzdCBwcsOtdG9tbm9zdGkgYXV0b2tvcmVsw6FjaWUgcmV6w61kdcOtIChEdXJiaW4tV2F0c29ub3YgdGVzdCkKCmR1cmJpbldhdHNvblRlc3QobW9kZWwxKQoKYGBgCmBgYHtyfQojIElkZW50aWZpa8OhY2lhIHBvem9yb3ZhbsOtIHMgdnlzb2tvdSB2cGx5dm5vc8Wlb3UgYSBvZMS+YWhsb3PFpW91CgppbmZsdWVuY2VQbG90KG1vZGVsMSwgbWFpbiA9ICJWcGx5dm7DqSBhIG9kxL5haGzDqSBwb3pvcm92YW5pYSIpCgpgYGAKYGBge3J9CiMgUHJlaMS+YWQgdnBseXZuw71jaCBwb3pvcm92YW7DrSBwb2TEvmEgQ29va292ZWogdnpkaWFsZW5vc3RpCgpjb29rcyA8LSBjb29rcy5kaXN0YW5jZShtb2RlbDEpCgojIFpvYnJhemVuaWUgcG96b3JvdmFuw60gcyB2eXNva291IGhvZG5vdG91IENvb2tvdmVqIHZ6ZGlhbGVub3N0aQoKdnBseXZuZSA8LSB3aGljaChjb29rcyA+IDQgKiBtZWFuKGNvb2tzLCBuYS5ybSA9IFRSVUUpKQpmaXJteVt2cGx5dm5lLCBdCgpgYGAKYGBge3J9CnN1bW1hcnkobW9kZWwxKQoKYGBgCiMgWmhybnV0aWUgdsO9c2xlZGtvdgoKTmEgesOha2xhZGUgdsO9c2xlZGtvdiByZWdyZXNuZWogYW5hbMO9enkgbW/Fvm5vIGtvbsWhdGF0b3ZhxaUsIMW+ZToKCi0gUHJlbWVubsOhICoqcG9kaWVsIMW+aWVuIHZvIHZlZGVuw60qKiBtw6Egc8OtY2UgcG96aXTDrXZueSBrb2VmaWNpZW50LCBubyBqZWogdnBseXYgbmEgUk9FIG5pZSBqZSDFoXRhdGlzdGlja3kgdsO9em5hbW7DvSAocCA9IDAuNDY1NCkuICAKLSBQcmVtZW5uw6EgKipST0EqKiBtw6EgcG96aXTDrXZueSBhIMWhdGF0aXN0aWNreSB2w716bmFtbsO9IHZwbHl2IG5hIFJPRSAocCA9IDAuMDAzMSkuIFZ5xaHFoWlhIHJlbnRhYmlsaXRhIGFrdMOtdiB0ZWRhIHZlZGllIGsgdnnFocWhZWogcmVudGFiaWxpdGUgdmxhc3Ruw6lobyBrYXBpdMOhbHUuICAKLSBQcmVtZW5uw6EgKipFQklUREEgbWFyxb5hKiogbcOhIG5lZ2F0w612bnksIGFsZSDFoXRhdGlzdGlja3kgbmV2w716bmFtbsO9IHZwbHl2IG5hIFJPRSAocCA9IDAuMzgyMCkuICAKLSBNb2RlbCBha28gY2Vsb2sgamUgxaF0YXRpc3RpY2t5IHbDvXpuYW1uw70gKHAgPSAwLjAwODIpIGEgdnlzdmV0xL51amUgcHJpYmxpxb5uZSAqKjE2ICUgdmFyaWFiaWxpdHkgUk9FKiogKEFkanVzdGVkIFLCsiA9IDAuMTYzNCkuCgpDZWxrb3ZvIG1vxb5ubyBwb3ZlZGHFpSwgxb5lIHJlbnRhYmlsaXRhIGFrdMOtdiAoUk9BKSBtw6EgcHJldWvDoXphdGXEvm5lIG5hanNpbG5lasWhw60gdnBseXYgbmEgcmVudGFiaWxpdHUgdmxhc3Ruw6lobyBrYXBpdMOhbHUsIHphdGlhxL4gxI1vIHBvZGllbCDFvmllbiB2byB2ZWRlbsOtIGEgRUJJVERBIG1hcsW+YSBuZXZ5a2F6dWrDuiDFoXRhdGlzdGlja3kgdsO9em5hbW7DvSBlZmVrdC4KCmBgYHtyfQpzaGFwaXJvLnRlc3QocmVzaWR1YWxzKG1vZGVsMSkpCmphcnF1ZS5iZXJhLnRlc3QocmVzaWR1YWxzKG1vZGVsMSkpCmJwdGVzdChtb2RlbDEpCmR1cmJpbldhdHNvblRlc3QobW9kZWwxKQoKYGBgCiMgRGlhZ25vc3Rpa2EgbW9kZWx1CgpOYSB6w6FrbGFkZSB2eWtvbmFuw71jaCBkaWFnbm9zdGlja8O9Y2ggdGVzdG92IG1vxb5ubyB6aHJuw7rFpSwgxb5lOgoKLSBQb2TEvmEgKipTaGFwaXJvLVdpbGsqKiBhICoqSmFycXVlLUJlcmEgdGVzdHUqKiByZXrDrWR1w6EgbW9kZWx1ICoqbmllIHPDuiBub3Jtw6FsbmUgcm96ZGVsZW7DqSoqLCDEjW8gbmF6bmHEjXVqZSBwb3J1xaFlbmllIHByZWRwb2tsYWR1IG5vcm1hbGl0eS4KLSAqKkJyZXVzY2gtUGFnYW5vdiB0ZXN0KiogbmVwb3R2cmRpbCBwcsOtdG9tbm9zxaUgaGV0ZXJvc2tlZGFzdGljaXR5IChwID0gMC4xNzYyKSwgdGVkYSByb3pwdHlsIHJlesOtZHXDrSBtb8W+bm8gcG92YcW+b3ZhxaUgemEgcHJpYmxpxb5uZSBrb27FoXRhbnRuw70uCi0gKipEdXJiaW4tV2F0c29ub3YgdGVzdCoqIHVrw6F6YWwgaG9kbm90dSAxLjM1IHMgcC1ob2Rub3RvdSAwLjAzNiwgxI1vIG5hem5hxI11amUgKiphdXRva29yZWzDoWNpdSBwcnbDqWhvIHLDoWR1KiogbWVkemkgcmV6w61kdWFtaS4KCkNlbGtvdm8gbW/Fvm5vIGtvbsWhdGF0b3ZhxaUsIMW+ZSBtb2RlbCBha28gY2Vsb2sgamUgxaF0YXRpc3RpY2t5IHbDvXpuYW1uw70sIG5vIG5pZWt0b3LDqSBwcmVkcG9rbGFkeSBrbGFzaWNrw6lobyBsaW5lw6FybmVobyBtb2RlbHUgKG5ham3DpCBub3JtYWxpdGEgYSBuZXrDoXZpc2xvc8WlIHJlesOtZHXDrSkgbmllIHPDuiDDunBsbmUgc3BsbmVuw6kuIFRpZXRvIHppc3RlbmlhIGplIHBvdHJlYm7DqSB6b2jEvmFkbmnFpSBwcmkgaW50ZXJwcmV0w6FjaWkgdsO9c2xlZGtvdi4KCiMgSGV0ZXJvc2tlZGFzdGljaXRhCgpQcsOtdG9tbm9zxaUgaGV0ZXJvc2tlZGFzdGljaXR5IChuZWtvbsWhdGFudG7DqWhvIHJvenB0eWx1IHJlesOtZHXDrSkgbcO0xb5lIHZpZXPFpSBrIG5lc3BvxL5haGxpdsO9bSBvZGhhZG9tIHNtZXJvZGFqbsO9Y2ggY2jDvWIgYSBuw6FzbGVkbmUgayBuZXNwcsOhdm55bSB6w6F2ZXJvbSBvIMWhdGF0aXN0aWNrZWogdsO9em5hbW5vc3RpIHJlZ3Jlc27DvWNoIGtvZWZpY2llbnRvdi4gIApWIHRlanRvIMSNYXN0aSBvdmVydWplbWUsIMSNaSBqZSB2IG1vZGVsaSBwcsOtdG9tbsOhIGhldGVyb3NrZWRhc3RpY2l0YSwgYSBhayDDoW5vLCB1a8Ohxb5lbWUgc3DDtHNvYnkgamVqIHJpZcWhZW5pYS4KCmBgYHtyfQpsaWJyYXJ5KGxtdGVzdCkKbGlicmFyeShzYW5kd2ljaCkKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KHBhdGNod29yaykKCiMgdml6dcOhbG5lIHBvc8O6ZGVuaWUgLSB6w6F2aXNsb3PFpSDFoXR2b3Jjb3YgcmV6w61kdcOtIG9kIHZ5c3ZldMS+dWrDumNpY2ggcHJlbWVubsO9Y2gKcDEgPC0gZ2dwbG90KGZpcm15LCBhZXMoeCA9IFJPQSwgeSA9IHJlc2lkKG1vZGVsMSleMikpICsKICBnZW9tX3BvaW50KGFscGhhID0gMC42KSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxvZXNzIiwgc2UgPSBGQUxTRSwgY29sb3IgPSAicmVkIikgKwogIGxhYnModGl0bGUgPSAiU3F1YXJlZCByZXNpZHVhbHMgdnMgUk9BIiwgeCA9ICJST0EiLCB5ID0gIlNxdWFyZWQgcmVzaWR1YWxzIikgKwogIHRoZW1lX21pbmltYWwoKQoKcDIgPC0gZ2dwbG90KGZpcm15LCBhZXMoeCA9IHBvZGllbF96aWVuLCB5ID0gcmVzaWQobW9kZWwxKV4yKSkgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjYpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG9lc3MiLCBzZSA9IEZBTFNFLCBjb2xvciA9ICJyZWQiKSArCiAgbGFicyh0aXRsZSA9ICJTcXVhcmVkIHJlc2lkdWFscyB2cyBwb2RpZWwgxb5pZW4iLCB4ID0gIlBvZGllbCDFvmllbiB2byB2ZWRlbsOtIiwgeSA9ICJTcXVhcmVkIHJlc2lkdWFscyIpICsKICB0aGVtZV9taW5pbWFsKCkKCnAxICsgcDIKYGBgClogZ3JhZm92IGplIG1vxb5uw6kgcG9zw7pkacWlLCDEjWkgZXhpc3R1amUgc3lzdGVtYXRpY2vDvSB0cmVuZCBtZWR6aSByb3pwdHlsb20gcmV6w61kdcOtIGEgdnlzdmV0xL51asO6Y2ltaSBwcmVtZW5uw71taS4gQWsgYnkgxI1lcnZlbsOhIGtyaXZrYSBtYWxhIHpyZXRlxL5uw70gcmFzdMO6Y2kgYWxlYm8ga2xlc2Fqw7pjaSB0dmFyLCBtb2hsbyBieSB0byBuYXpuYcSNb3ZhxaUgcHLDrXRvbW5vc8WlIGhldGVyb3NrZWRhc3RpY2l0eS4KYGBge3IgaGV0ZXJvLWJwdGVzdH0KIyBCcmV1c2No4oCTUGFnYW5vdiB0ZXN0IGhldGVyb3NrZWRhc3RpY2l0eQpicHRlc3QobW9kZWwxKQpgYGAKTmEgesOha2xhZGUgdsO9c2xlZGt1IHRlc3R1IChwID0gMC4xNzYyKSBtb8W+bm8ga29uxaF0YXRvdmHFpSwgxb5lICoqaGV0ZXJvc2tlZGFzdGljaXRhIHYgbW9kZWxpIG5lYm9sYSBwcmV1a8OhemFuw6EqKi4KUHJlIMO6xI1lbHkgZGVtb27FoXRyw6FjaWUgdsWhYWsgbcO0xb5lbWUgdWvDoXphxaUsIGFrbyBieSBzYSBoZXRlcm9za2VkYXN0aWNpdGEgcmllxaFpbGEsIGFrIGJ5IGJvbGEgcHLDrXRvbW7DoS4gIApOYWrEjWFzdGVqxaHDrW0gcG9zdHVwb20gamUgcG91xb5pdGllIHR6di4gKipXaGl0ZW92aG8gKHJvYnVzdG7DqWhvKSBvZGhhZHUga292YXJpYW7EjW5laiBtYXRpY2UqKiwga3RvcsO9IHVwcmF2dWplIHNtZXJvZGFqbsOpIGNoeWJ5IGtvZWZpY2llbnRvdi4KYGBge3IgaGV0ZXJvLXJvYnVzdH0KIyBPZGhhZCBrb2VmaWNpZW50b3YgcyByb2J1c3Ruw71taSBzbWVyb2Rham7DvW1pIGNoeWJhbWkKY29lZnRlc3QobW9kZWwxLCB2Y292ID0gdmNvdkhDKG1vZGVsMSwgdHlwZSA9ICJIQzEiKSkKYGBgCmBgYHtyIGhldGVyby1wbG90fQojIEdyYWYgxaF0dm9yY292IHJlesOtZHXDrSB2b8SNaSBwcmVkaWtvdmFuw71tIGhvZG5vdMOhbSBST0UKcGxvdCgKICBmaXR0ZWQobW9kZWwxKSwKICByZXNpZHVhbHMobW9kZWwxKV4yLAogIHhsYWIgPSAiT2RoYWRvdmFuw6kgaG9kbm90eSBST0UiLAogIHlsYWIgPSAixaB0dm9yY2UgcmV6w61kdcOtIiwKICBtYWluID0gIsWgdHZvcmNlIHJlesOtZHXDrSB2cy4gb2RoYWRvdmFuw6kgaG9kbm90eSIKKQpgYGAKCmBgYHtyfQpsaWJyYXJ5KHNhbmR3aWNoKQpsaWJyYXJ5KGxtdGVzdCkKCiMgT2RoYWQga29lZmljaWVudG92IHMgcm9idXN0bsO9bWkgc21lcm9kYWpuw71taSBjaHliYW1pIChXaGl0ZW92YSBrb3Jla2NpYSkKY29lZnRlc3QobW9kZWwxLCB2Y292ID0gdmNvdkhDKG1vZGVsMSwgdHlwZSA9ICJIQzEiKSkKYGBgCgpgYGAKTmEgesOha2xhZGUgdsO9c2xlZGt1IEJyZXVzY2jigJNQYWdhbm92aG8gdGVzdHUgKHAtaG9kbm90YSAwLjE3NjIpIG1vxb5ubyBrb27FoXRhdG92YcWlLCDFvmUgaGV0ZXJvc2tlZGFzdGljaXRhIHJlesOtZHXDrSB2IG1vZGVsaSBuZWJvbGEgcHJldWvDoXphbsOhLiBaIHRvaHRvIGTDtHZvZHUgcHJlZHBva2xhZCBrb27FoXRhbnRuw6lobyByb3pwdHlsdSBuw6Fob2RuZWogemxvxb5reSBwb3Zhxb51amVtZSB6YSBzcGxuZW7DvS4gUHJlIGRlbW9uxaF0csOhY2l1IHBvc3R1cHUgdsWhYWsgYm9saSB2eXBvxI3DrXRhbsOpIGFqIHJvYnVzdG7DqSBzbWVyb2Rham7DqSBjaHlieSwga3RvcsOpIGJ5IGJvbG8gdmhvZG7DqSBwb3XFvsOtdmHFpSB2IHByw61wYWRlLCBhayBieSBoZXRlcm9za2VkYXN0aWNpdGEgYm9sYSBwcsOtdG9tbsOhLgoKCgo=