library(zoo)
library(tseries)
library(lmtest)
library(sandwich)
library(car)
rm(list=ls())

#Import udajov

udaje <- read.csv("Employment_Unemployment_GDP_data.csv",
header = TRUE,
sep = ",",
dec = ".",
stringsAsFactors = FALSE)


udajeSlovakRepublic <- udaje[udaje$Country=="Slovak Republic",c("Unemployment.Rate","Employment.Sector..Agriculture", "Year","GDP..in.USD.", "Employment.Sector..Industry","Employment.Sector..Services")]
rownames(udajeSlovakRepublic)<-udajeSlovakRepublic$Year
udajeSlovakRepublic <- udajeSlovakRepublic[order(udajeSlovakRepublic$Year), ]
udajeSlovakRepublic$logGDP <- log(udajeSlovakRepublic$GDP..in.USD.)



udajeSlovakRepublic
NA

2. Lineárna regresia v základnom tvare

V tejto časti sme urobili základný regresný model, kde skúmame, čo ovplyvňuje mieru nezamestnanosti na Slovensku. Do modelu sme dali podiel zamestnanosti v jednotlivých sektoroch a logaritmus HDP, ktorý lepšie zachytáva ekonomický rast.

library(ggplot2)

# môj regresný logaritmovaný model
model_log <- lm(Unemployment.Rate ~ 
                  Employment.Sector..Agriculture +
                  Employment.Sector..Industry +
                  Employment.Sector..Services +
                  logGDP,
                data = udajeSlovakRepublic)

summary(model_log)

Call:
lm(formula = Unemployment.Rate ~ Employment.Sector..Agriculture + 
    Employment.Sector..Industry + Employment.Sector..Services + 
    logGDP, data = udajeSlovakRepublic)

Residuals:
    Min      1Q  Median      3Q     Max 
-5.3249 -2.3479  0.4943  1.6275  4.9565 

Coefficients:
                                 Estimate Std. Error t value Pr(>|t|)    
(Intercept)                     2.531e+06  2.243e+06   1.128 0.269106    
Employment.Sector..Agriculture -2.531e+04  2.243e+04  -1.128 0.269112    
Employment.Sector..Industry    -2.530e+04  2.243e+04  -1.128 0.269190    
Employment.Sector..Services    -2.530e+04  2.243e+04  -1.128 0.269175    
logGDP                         -1.427e+01  3.662e+00  -3.896 0.000583 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 2.895 on 27 degrees of freedom
Multiple R-squared:  0.4891,    Adjusted R-squared:  0.4134 
F-statistic: 6.461 on 4 and 27 DF,  p-value: 0.0008785

Z výsledkov vyšlo, že premenné Agriculture, Industry a Services nie sú štatisticky významné. To znamená, že podľa tohto modelu nevieme potvrdiť, že tieto sektory majú priamy vplyv na nezamestnanosť. Na druhú stranu, premenná logGDP je významná a jej koeficient je záporný, takže keď HDP rastie, nezamestnanosť má tendenciu klesať. F-test ukazuje, že model je ako celok významný, takže dáva zmysel ho ďalej používať.

3. Detekcia autokorelácie

Grafická informácia

library(ggplot2)

udajeSlovakRepublic$fitted <- fitted(model_log)

ggplot(udajeSlovakRepublic, aes(x = Year, y = Unemployment.Rate)) +
  geom_point(color = "steelblue", size = 3) +
  geom_line(aes(y = fitted), color = "red", size = 2) +
  labs(
    title = "Unemployment rate in Slovak Republic: Empirical (blue) vs. Fitted (red)",
    x = "Year",
    y = "Unemployment rate (%)"
  ) +
  theme_minimal()

V grafe porovnávame reálne hodnoty nezamestnanosti s hodnotami, ktoré predpovedal model. Na grafe môžeme vidieť, že červená čiara nie presne lemuje modré body. Toto naznačuje, že model nemusí úplne zachytávať časový vývoj nezamestnanosti.

Zároveň je možné vidieť, že hodnoty idú v čase „vlnovito“, čo môže byť znak, že medzi rokmi existuje nejaká závislosť. Práve preto budeme ďalej testovať, či v dátach nie je autokorelácia.

# ulosime si rezidua z povodneho modelu - nazvaneho model
res <- residuals(model_log)

ACF graf (Autocorrelation Function)

Táto funkcia priradzuje odhad korelácie, ktorá je medzi jednotlivými rezíduami v aktuálnom období a období posunutom (Lag) o \(k\) období späť.

acf(res, lag.max = 4,main = "Autokorelačná funkcia rezíduí")

Z ACF grafu vidíme, že reziduá nášho modelu sú výrazne autokorelované. Hodnota pri lag 1 je nad hranicou významnosti, čo znamená, že reziduá z jedného roka sú silne spojené s reziduami z predchádzajúceho roka. Podobne aj lag 2 a lag 3 sú stále relatívne vysoké.

Toto naznačuje, že model nezachytáva časovú závislosť v dátach a pravdepodobne v ňom vzniká autokorelácia, ktorú musíme ďalej otestovať aj formálnymi štatistickými testami.

Durbin–Watsonov test

Pri Durbin–Watsonovom teste pracujeme s týmito hypotézami:

  • H₀ : v reziduách nie je prítomná autokorelácia prvého rádu. Chyby medzi rokmi sú náhodné a nesúvisia spolu.
  • H₁ : v reziduách je prítomná autokorelácia prvého rádu. Chyby medzi rokmi sú navzájom závislé.
library(lmtest)
dwtest(model_log
       )

    Durbin-Watson test

data:  model_log
DW = 0.54927, p-value = 9.366e-09
alternative hypothesis: true autocorrelation is greater than 0

Výsledok testu nám v našom prípade ukazuje hodnotu DW = 0.549, čo je výrazne nižšie ako hodnota okolo 2, ktorá by znamenala žiadnu autokoreláciu. P-hodnota je extrémne malá (9.366e-09), takže nulovú hypotézu zamietame. Z toho vyplýva, že v našom modeli je prítomná pozitívna autokorelácia rezíduí.

Breusch–Godfreyov test (BG test)

Durbin–Watsonov test nám ukázal, že v našom modeli je problém s autokoreláciou. Na potvrdenie tohto výsledku použijeme Breusch–Godfreyov test, ktorý je všeobecnejší a vie zachytiť aj vyšší rád autokorelácie.

Pri BG teste pracujeme s týmito hypotézami:

  • H₀ : v reziduách nášho modelu nie je autokorelácia daného rádu. Chyby sú náhodné a medzi rokmi nie sú systematicky prepojené.
  • H₁ : v reziduách je prítomná autokorelácia daného rádu. Chyby medzi rokmi spolu súvisia a model nezachytáva časový priebeh úplne správne.
bgtest(model_log, order = 1)

    Breusch-Godfrey test for serial correlation of order up to 1

data:  model_log
LM test = 15.78, df = 1, p-value = 7.114e-05

Test nám vyšiel s p-hodnotou 7.114e-05, čo je oveľa menej ako hranica 0,05. Preto nulovú hypotézu zamietame a berieme to tak, že v našom modeli je prítomná autokorelácia prvého rádu.

Tento výsledok potvrdzuje to, čo sme videli aj v ACF grafe a v Durbin–Watsonovom teste. Chyby modelu sa v čase opakujú a nadväzujú na seba, takže model nezachytáva časový vývoj nezamestnanosti úplne správne. Ide o problém v špecifikácii modelu, nie o problém v samotných dátach.

Odstraňovanie problému autokorelácie rezíduí – Koyckov model

Keďže náš pôvodný model mal problém s autokoreláciou, pokúšame sa ho odstrániť pridaním oneskorenej závislej premennej. Ide o tzv. Koyckov model. Do modelu sme pridali nezamestnanosť z minulého roka (lag 1), keďže predpokladáme, že vývoj nezamestnanosti sa mení postupne a môže byť ovplyvnený hodnotami z predchádzajúceho obdobia.

Po pridaní tejto premennej odhadneme nový model a následne vykonáme Durbin–Watsonov test, aby sme skontrolovali, či autokorelácia zmizla. Ak je hodnota DW bližšie k číslu 2 a p-hodnota je väčšia ako 0,05, znamená to, že autokoreláciu sa podarilo odstrániť.

library(dplyr)

udajeSlovakRepublic <- udajeSlovakRepublic %>%
  arrange(Year) %>%
  mutate(
    Unemployment_lag1 = lag(Unemployment.Rate)
  )
model_koyck <- lm(Unemployment.Rate ~ 
                    Employment.Sector..Agriculture +
                    Employment.Sector..Industry +
                    Employment.Sector..Services +
                    logGDP +
                    Unemployment_lag1,
                  data = udajeSlovakRepublic)

summary(model_koyck)

Call:
lm(formula = Unemployment.Rate ~ Employment.Sector..Agriculture + 
    Employment.Sector..Industry + Employment.Sector..Services + 
    logGDP + Unemployment_lag1, data = udajeSlovakRepublic)

Residuals:
    Min      1Q  Median      3Q     Max 
-1.8401 -0.9695 -0.2207  0.9802  2.8456 

Coefficients:
                                 Estimate Std. Error t value Pr(>|t|)    
(Intercept)                     2.047e+06  1.098e+06   1.864   0.0741 .  
Employment.Sector..Agriculture -2.047e+04  1.098e+04  -1.864   0.0741 .  
Employment.Sector..Industry    -2.047e+04  1.098e+04  -1.864   0.0741 .  
Employment.Sector..Services    -2.047e+04  1.098e+04  -1.864   0.0741 .  
logGDP                         -3.746e+00  2.237e+00  -1.674   0.1065    
Unemployment_lag1               8.215e-01  9.572e-02   8.582 6.37e-09 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 1.414 on 25 degrees of freedom
  (1 observation deleted due to missingness)
Multiple R-squared:  0.8872,    Adjusted R-squared:  0.8646 
F-statistic: 39.31 on 5 and 25 DF,  p-value: 4.654e-11

Výsledky Koyckovho modelu

Keď sme do modelu pridali oneskorenú nezamestnanosť z minulého roka, tak sa výsledky zlepšili. Premenná Unemployment_lag1 vyšla veľmi významná, čo znamená, že nezamestnanosť z predchádzajúceho roka silno ovplyvňuje nezamestnanosť v aktuálnom roku. To dáva zmysel, keďže nezamestnanosť sa väčšinou nemení skokovo, ale postupne.

Ostatné premenné už nie sú také dôležité ako predtým, pretože veľkú časť zmeny v nezamestnanosti vysvetlí práve hodnota z minulého roka. Tým, že sme túto premennú pridali, model sa lepšie trafí do toho, ako sa nezamestnanosť správa v čase.

Hodnota R² sa zvýšila na približne 0.89, čo je veľmi dobré. Znamená to, že náš nový model už vie vysvetliť skoro celú zmenu v nezamestnanosti. Celkovo tento model pôsobí stabilnejšie a presnejšie než ten pôvodný.

Durbin–Watsonov test po odhade Koyckovho modelu

Na novom modeli sme spravili opäť Durbin–Watsonov test, aby sme zistili, či sa autokorelácia podarila odstrániť. V našom prípade sme dostali hodnotu DW = 1.3468, čo je síce bližšie k hodnote 2 ako predtým, ale stále to nie je úplne ideálne. P-hodnota je 0.003, takže nulovú hypotézu opäť zamietame.

To znamená, že aj keď sa autokorelácia znížila, stále tam je a model ju úplne neodstránil. Koyckov model síce pomohol zlepšiť výsledky a spravil model presnejší, ale autokorelácia sa nestratila úplne.

dwtest(model_koyck)

    Durbin-Watson test

data:  model_koyck
DW = 1.3468, p-value = 0.003055
alternative hypothesis: true autocorrelation is greater than 0

Na novom modeli sme spravili opäť Durbin–Watsonov test, aby sme zistili, či sa autokorelácia podarila odstrániť. V našom prípade sme dostali hodnotu DW = 1.3468, čo je síce bližšie k hodnote 2 ako predtým, ale stále to nie je úplne ideálne. P-hodnota je 0.003, takže nulovú hypotézu opäť zamietame.

Koyckov model síce pomohol zlepšiť výsledky a spravil model presnejší, ale autokorelácia sa nestratila úplne.

Newey–West robustné štandardné chyby

Keďže náš model má problémy s autokoreláciou a niektoré predpoklady klasickej regresie nie sú splnené, použili sme tzv. robustné smerodajné chyby. Tie nemenia samotné koeficienty, ale upravujú ich smerodajné chyby tak, aby boli výsledky spoľahlivejšie aj vtedy, keď sa model nespráva úplne ideálne.

coeftest(model_koyck, vcov = vcovHC(model_koyck, type = "HC3"))

t test of coefficients:

                                  Estimate  Std. Error t value  Pr(>|t|)    
(Intercept)                     2.0472e+06  9.4600e+05  2.1640   0.04022 *  
Employment.Sector..Agriculture -2.0471e+04  9.4859e+03 -2.1580   0.04073 *  
Employment.Sector..Industry    -2.0471e+04  9.4780e+03 -2.1598   0.04058 *  
Employment.Sector..Services    -2.0470e+04  9.4689e+03 -2.1619   0.04040 *  
logGDP                         -3.7461e+00  2.4370e+00 -1.5372   0.13681    
Unemployment_lag1               8.2149e-01  1.0563e-01  7.7771 3.918e-08 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Výsledky po použití robustných smerodajných chýb

Po použití robustných smerodajných chýb sa ukázalo, že náš model je stabilnejší a výsledky sú spoľahlivejšie. V porovnaní s predchádzajúcimi výsledkami vidíme, že oneskorená nezamestnanosť (Unemployment_lag1) zostáva výrazne významná, takže naozaj platí, že nezamestnanosť z minulého roka silno ovplyvňuje tú aktuálnu.

Zaujímavé je, že po úprave sa významnými stali aj premenné Agriculture, Industry a Services. Všetky tri majú veľmi podobné koeficienty aj p-hodnoty. Znamená to, že tieto premenné majú určitý vplyv na nezamestnanosť, ale tento vplyv sme videli až po tom, čo boli chyby „opravené“ robustným prístupom.

Premenná logGDP zostala nevýznamná, takže HDP samotné nemá v našom modeli až taký veľký vplyv, keď už berieme do úvahy oneskorenú nezamestnanosť.

Celkovo môžeme povedať, že robustné smerodajné chyby nám pomohli získať presnejší obraz o tom, ktoré premenné sú skutočne dôležité, aj keď model nemá úplne ideálne vlastnosti.

Zhrnutie

V našej analýze sme najskôr odhadli základný regresný model, aby sme zistili, čo ovplyvňuje mieru nezamestnanosti na Slovensku. Pôvodný model mal však problémy s autokoreláciou, čo sme videli v ACF grafe a potvrdili pomocou Durbin–Watsonovho a Breusch–Godfreyovho testu. To znamenalo, že model nezachytával časový vývoj dostatočne dobre a chyby sa v čase opakovali.

Preto sme vyskúšali Koyckov model, kde sme pridali nezamestnanosť z predchádzajúceho roka. Tento krok výrazne zlepšil kvalitu modelu a zvýšil R², takže model dokázal vysvetliť oveľa väčšiu časť zmien v nezamestnanosti. Autokorelácia sa síce znížila, ale úplne nezmizla.

Nakoniec sme použili robustné smerodajné chyby, ktoré upravujú výsledky tak, aby boli spoľahlivejšie aj vtedy, keď model nie je úplne ideálny. Po tejto úprave sa ukázalo, ktoré premenné sú naozaj dôležité a výsledky pôsobili stabilnejšie.

Celkovo môžeme povedať, že náš model po úpravách lepšie zachytáva vývoj nezamestnanosti v čase. Stále však platí, že časové rady sú špecifické a často si vyžadujú pokročilejšie modely, aby sme úplne odstránili autokoreláciu.

LS0tCnRpdGxlOiAiUHLDoWNhIHMgZGF0YWLDoXpvdSAtIGltcG9ydCDDumRham92LCBncmFmeSwgxaF0YXRpc3Rpa3kiCmF1dGhvcjogIkzDrXZpYSBNZWxpY2hvdsOhIgpkYXRlOiAiTm92ZW1iZXIgMjAyNSIKb3V0cHV0OiAKICBodG1sX25vdGVib29rOgogICAgdG9jOiB0cnVlCiAgICB0b2NfZmxvYXQ6IHRydWUKICAgIHRoZW1lOiB1bml0ZWQKICAgIGhpZ2hsaWdodDogdGFuZ28KZWRpdG9yX29wdGlvbnM6IAogIG1hcmtkb3duOiAKICAgIHdyYXA6IDcyCi0tLQoKYGBge3J9CmxpYnJhcnkoem9vKQpsaWJyYXJ5KHRzZXJpZXMpCmxpYnJhcnkobG10ZXN0KQpsaWJyYXJ5KHNhbmR3aWNoKQpsaWJyYXJ5KGNhcikKcm0obGlzdD1scygpKQpgYGAKCgojSW1wb3J0IHVkYWpvdgoKCmBgYHtyfQp1ZGFqZSA8LSByZWFkLmNzdigiRW1wbG95bWVudF9VbmVtcGxveW1lbnRfR0RQX2RhdGEuY3N2IiwKaGVhZGVyID0gVFJVRSwKc2VwID0gIiwiLApkZWMgPSAiLiIsCnN0cmluZ3NBc0ZhY3RvcnMgPSBGQUxTRSkKCgp1ZGFqZVNsb3Zha1JlcHVibGljIDwtIHVkYWplW3VkYWplJENvdW50cnk9PSJTbG92YWsgUmVwdWJsaWMiLGMoIlVuZW1wbG95bWVudC5SYXRlIiwiRW1wbG95bWVudC5TZWN0b3IuLkFncmljdWx0dXJlIiwgIlllYXIiLCJHRFAuLmluLlVTRC4iLCAiRW1wbG95bWVudC5TZWN0b3IuLkluZHVzdHJ5IiwiRW1wbG95bWVudC5TZWN0b3IuLlNlcnZpY2VzIildCnJvd25hbWVzKHVkYWplU2xvdmFrUmVwdWJsaWMpPC11ZGFqZVNsb3Zha1JlcHVibGljJFllYXIKdWRhamVTbG92YWtSZXB1YmxpYyA8LSB1ZGFqZVNsb3Zha1JlcHVibGljW29yZGVyKHVkYWplU2xvdmFrUmVwdWJsaWMkWWVhciksIF0KdWRhamVTbG92YWtSZXB1YmxpYyRsb2dHRFAgPC0gbG9nKHVkYWplU2xvdmFrUmVwdWJsaWMkR0RQLi5pbi5VU0QuKQoKCgp1ZGFqZVNsb3Zha1JlcHVibGljCgpgYGAKCgojIyAyLiBMaW5lw6FybmEgcmVncmVzaWEgdiB6w6FrbGFkbm9tIHR2YXJlCgpWIHRlanRvIMSNYXN0aSBzbWUgdXJvYmlsaSB6w6FrbGFkbsO9IHJlZ3Jlc27DvSBtb2RlbCwga2RlIHNrw7ptYW1lLCDEjW8gb3ZwbHl2xYh1amUgbWllcnUgbmV6YW1lc3RuYW5vc3RpIG5hIFNsb3ZlbnNrdS4gRG8gbW9kZWx1IHNtZSBkYWxpIHBvZGllbCB6YW1lc3RuYW5vc3RpIHYgamVkbm90bGl2w71jaCBzZWt0b3JvY2ggYSBsb2dhcml0bXVzIEhEUCwga3RvcsO9IGxlcMWhaWUgemFjaHl0w6F2YSBla29ub21pY2vDvSByYXN0LgoKCmBgYHtyfQpsaWJyYXJ5KGdncGxvdDIpCgojIG3DtGogcmVncmVzbsO9IGxvZ2FyaXRtb3ZhbsO9IG1vZGVsCm1vZGVsX2xvZyA8LSBsbShVbmVtcGxveW1lbnQuUmF0ZSB+IAogICAgICAgICAgICAgICAgICBFbXBsb3ltZW50LlNlY3Rvci4uQWdyaWN1bHR1cmUgKwogICAgICAgICAgICAgICAgICBFbXBsb3ltZW50LlNlY3Rvci4uSW5kdXN0cnkgKwogICAgICAgICAgICAgICAgICBFbXBsb3ltZW50LlNlY3Rvci4uU2VydmljZXMgKwogICAgICAgICAgICAgICAgICBsb2dHRFAsCiAgICAgICAgICAgICAgICBkYXRhID0gdWRhamVTbG92YWtSZXB1YmxpYykKCnN1bW1hcnkobW9kZWxfbG9nKQoKYGBgClogdsO9c2xlZGtvdiB2ecWhbG8sIMW+ZSBwcmVtZW5uw6kgQWdyaWN1bHR1cmUsIEluZHVzdHJ5IGEgU2VydmljZXMgbmllIHPDuiDFoXRhdGlzdGlja3kgdsO9em5hbW7DqS4gVG8gem5hbWVuw6EsIMW+ZSBwb2TEvmEgdG9odG8gbW9kZWx1IG5ldmllbWUgcG90dnJkacWlLCDFvmUgdGlldG8gc2VrdG9yeSBtYWrDuiBwcmlhbXkgdnBseXYgbmEgbmV6YW1lc3RuYW5vc8WlLiBOYSBkcnVow7ogc3RyYW51LCBwcmVtZW5uw6EgbG9nR0RQIGplIHbDvXpuYW1uw6EgYSBqZWoga29lZmljaWVudCBqZSB6w6Fwb3Juw70sIHRha8W+ZSBrZcSPIEhEUCByYXN0aWUsIG5lemFtZXN0bmFub3PFpSBtw6EgdGVuZGVuY2l1IGtsZXNhxaUuCiBGLXRlc3QgdWthenVqZSwgxb5lIG1vZGVsIGplIGFrbyBjZWxvayB2w716bmFtbsO9LCB0YWvFvmUgZMOhdmEgem15c2VsIGhvIMSPYWxlaiBwb3XFvsOtdmHFpS4KCgojIyMgMy4gRGV0ZWtjaWEgYXV0b2tvcmVsw6FjaWUgCgojIyMjIEdyYWZpY2vDoSBpbmZvcm3DoWNpYQoKYGBge3J9CmxpYnJhcnkoZ2dwbG90MikKCnVkYWplU2xvdmFrUmVwdWJsaWMkZml0dGVkIDwtIGZpdHRlZChtb2RlbF9sb2cpCgpnZ3Bsb3QodWRhamVTbG92YWtSZXB1YmxpYywgYWVzKHggPSBZZWFyLCB5ID0gVW5lbXBsb3ltZW50LlJhdGUpKSArCiAgZ2VvbV9wb2ludChjb2xvciA9ICJzdGVlbGJsdWUiLCBzaXplID0gMykgKwogIGdlb21fbGluZShhZXMoeSA9IGZpdHRlZCksIGNvbG9yID0gInJlZCIsIHNpemUgPSAyKSArCiAgbGFicygKICAgIHRpdGxlID0gIlVuZW1wbG95bWVudCByYXRlIGluIFNsb3ZhayBSZXB1YmxpYzogRW1waXJpY2FsIChibHVlKSB2cy4gRml0dGVkIChyZWQpIiwKICAgIHggPSAiWWVhciIsCiAgICB5ID0gIlVuZW1wbG95bWVudCByYXRlICglKSIKICApICsKICB0aGVtZV9taW5pbWFsKCkKYGBgCgoKViBncmFmZSBwb3Jvdm7DoXZhbWUgcmXDoWxuZSBob2Rub3R5IG5lemFtZXN0bmFub3N0aSBzIGhvZG5vdGFtaSwga3RvcsOpIHByZWRwb3ZlZGFsIG1vZGVsLiBOYSBncmFmZSBtw7TFvmVtZSB2aWRpZcWlLCDFvmUgxI1lcnZlbsOhIMSNaWFyYSBuaWUgcHJlc25lIGxlbXVqZSBtb2Ryw6kgYm9keS4gVG90byBuYXpuYcSNdWplLCDFvmUgbW9kZWwgbmVtdXPDrSDDunBsbmUgemFjaHl0w6F2YcWlIMSNYXNvdsO9IHbDvXZvaiBuZXphbWVzdG5hbm9zdGkuCgpaw6Fyb3ZlxYggamUgbW/Fvm7DqSB2aWRpZcWlLCDFvmUgaG9kbm90eSBpZMO6IHYgxI1hc2Ug4oCedmxub3ZpdG/igJwsIMSNbyBtw7TFvmUgYnnFpSB6bmFrLCDFvmUgbWVkemkgcm9rbWkgZXhpc3R1amUgbmVqYWvDoSB6w6F2aXNsb3PFpS4gUHLDoXZlIHByZXRvIGJ1ZGVtZSDEj2FsZWogdGVzdG92YcWlLCDEjWkgdiBkw6F0YWNoIG5pZSBqZSBhdXRva29yZWzDoWNpYS4KCgoKCmBgYHtyfQojIHVsb3NpbWUgc2kgcmV6aWR1YSB6IHBvdm9kbmVobyBtb2RlbHUgLSBuYXp2YW5laG8gbW9kZWwKcmVzIDwtIHJlc2lkdWFscyhtb2RlbF9sb2cpCmBgYAoKIyMjIyBBQ0YgZ3JhZiAoQXV0b2NvcnJlbGF0aW9uIEZ1bmN0aW9uKQoKVMOhdG8gZnVua2NpYSBwcmlyYWR6dWplIG9kaGFkIGtvcmVsw6FjaWUsIGt0b3LDoSBqZSBtZWR6aSBqZWRub3RsaXbDvW1pIHJlesOtZHVhbWkgdiBha3R1w6Fsbm9tIG9iZG9iw60gYSBvYmRvYsOtIHBvc3VudXRvbSAoTGFnKSBvICRrJCBvYmRvYsOtIHNww6TFpS4KCmBgYHtyfQphY2YocmVzLCBsYWcubWF4ID0gNCxtYWluID0gIkF1dG9rb3JlbGHEjW7DoSBmdW5rY2lhIHJlesOtZHXDrSIpCmBgYAoKWiBBQ0YgZ3JhZnUgdmlkw61tZSwgxb5lIHJlemlkdcOhIG7DocWhaG8gbW9kZWx1IHPDuiB2w71yYXpuZSBhdXRva29yZWxvdmFuw6kuIEhvZG5vdGEgcHJpIGxhZyAxIGplIG5hZCBocmFuaWNvdSB2w716bmFtbm9zdGksIMSNbyB6bmFtZW7DoSwgxb5lIHJlemlkdcOhIHogamVkbsOpaG8gcm9rYSBzw7ogc2lsbmUgc3BvamVuw6kgcyByZXppZHVhbWkgeiBwcmVkY2jDoWR6YWrDumNlaG8gcm9rYS4gUG9kb2JuZSBhaiBsYWcgMiBhIGxhZyAzIHPDuiBzdMOhbGUgcmVsYXTDrXZuZSB2eXNva8OpLgoKVG90byBuYXpuYcSNdWplLCDFvmUgbW9kZWwgbmV6YWNoeXTDoXZhIMSNYXNvdsO6IHrDoXZpc2xvc8WlIHYgZMOhdGFjaCBhIHByYXZkZXBvZG9ibmUgdiDFiG9tIHZ6bmlrw6EgYXV0b2tvcmVsw6FjaWEsIGt0b3LDuiBtdXPDrW1lIMSPYWxlaiBvdGVzdG92YcWlIGFqIGZvcm3DoWxueW1pIMWhdGF0aXN0aWNrw71taSB0ZXN0YW1pLgoKCiMjIyMgRHVyYmlu4oCTV2F0c29ub3YgdGVzdApQcmkgRHVyYmlu4oCTV2F0c29ub3ZvbSB0ZXN0ZSBwcmFjdWplbWUgcyB0w71taXRvIGh5cG90w6l6YW1pOgoKLSAqKkjigoAgOioqIHYgcmV6aWR1w6FjaCBuaWUgamUgcHLDrXRvbW7DoSBhdXRva29yZWzDoWNpYSBwcnbDqWhvIHLDoWR1LiBDaHlieSBtZWR6aSByb2ttaSBzw7ogbsOhaG9kbsOpIGEgbmVzw7p2aXNpYSBzcG9sdS4KLSAqKkjigoEgOioqIHYgcmV6aWR1w6FjaCBqZSBwcsOtdG9tbsOhIGF1dG9rb3JlbMOhY2lhIHBydsOpaG8gcsOhZHUuIENoeWJ5IG1lZHppIHJva21pIHPDuiBuYXZ6w6Fqb20gesOhdmlzbMOpLgoKYGBge3J9CmxpYnJhcnkobG10ZXN0KQpkd3Rlc3QobW9kZWxfbG9nCiAgICAgICApCmBgYAoKVsO9c2xlZG9rIHRlc3R1IG7DoW0gdiBuYcWhb20gcHLDrXBhZGUgdWthenVqZSBob2Rub3R1IERXID0gMC41NDksIMSNbyBqZSB2w71yYXpuZSBuacW+xaFpZSBha28gaG9kbm90YSBva29sbyAyLCBrdG9yw6EgYnkgem5hbWVuYWxhIMW+aWFkbnUgYXV0b2tvcmVsw6FjaXUuIFAtaG9kbm90YSBqZSBleHRyw6ltbmUgbWFsw6EgKDkuMzY2ZS0wOSksIHRha8W+ZSBudWxvdsO6IGh5cG90w6l6dSB6YW1pZXRhbWUuIFogdG9obyB2eXBsw712YSwgxb5lIHYgbmHFoW9tIG1vZGVsaSBqZSBwcsOtdG9tbsOhIHBveml0w612bmEgYXV0b2tvcmVsw6FjaWEgcmV6w61kdcOtLgoKCgoKIyMjIyBCcmV1c2No4oCTR29kZnJleW92IHRlc3QgKEJHIHRlc3QpCgpEdXJiaW7igJNXYXRzb25vdiB0ZXN0IG7DoW0gdWvDoXphbCwgxb5lIHYgbmHFoW9tIG1vZGVsaSBqZSBwcm9ibMOpbSBzIGF1dG9rb3JlbMOhY2lvdS4gTmEgcG90dnJkZW5pZSB0b2h0byB2w71zbGVka3UgcG91xb5pamVtZSBCcmV1c2No4oCTR29kZnJleW92IHRlc3QsIGt0b3LDvSBqZSB2xaFlb2JlY25lasWhw60gYSB2aWUgemFjaHl0acWlIGFqIHZ5xaHFocOtIHLDoWQgYXV0b2tvcmVsw6FjaWUuCgpQcmkgQkcgdGVzdGUgcHJhY3VqZW1lIHMgdMO9bWl0byBoeXBvdMOpemFtaToKCi0gKipI4oKAIDoqKiB2IHJlemlkdcOhY2ggbsOhxaFobyBtb2RlbHUgbmllIGplIGF1dG9rb3JlbMOhY2lhIGRhbsOpaG8gcsOhZHUuIENoeWJ5IHPDuiBuw6Fob2Ruw6kgYSBtZWR6aSByb2ttaSBuaWUgc8O6IHN5c3RlbWF0aWNreSBwcmVwb2plbsOpLgotICoqSOKCgSA6KiogdiByZXppZHXDoWNoIGplIHByw610b21uw6EgYXV0b2tvcmVsw6FjaWEgZGFuw6lobyByw6FkdS4gQ2h5YnkgbWVkemkgcm9rbWkgc3BvbHUgc8O6dmlzaWEgYSBtb2RlbCBuZXphY2h5dMOhdmEgxI1hc292w70gcHJpZWJlaCDDunBsbmUgc3Byw6F2bmUuCgoKCmBgYHtyfQpiZ3Rlc3QobW9kZWxfbG9nLCBvcmRlciA9IDEpCmBgYAoKVGVzdCBuw6FtIHZ5xaFpZWwgcyBwLWhvZG5vdG91IDcuMTE0ZS0wNSwgxI1vIGplIG92ZcS+YSBtZW5laiBha28gaHJhbmljYSAwLDA1LiBQcmV0byBudWxvdsO6IGh5cG90w6l6dSB6YW1pZXRhbWUgYSBiZXJpZW1lIHRvIHRhaywgxb5lIHYgbmHFoW9tIG1vZGVsaSBqZSBwcsOtdG9tbsOhIGF1dG9rb3JlbMOhY2lhIHBydsOpaG8gcsOhZHUuCgpUZW50byB2w71zbGVkb2sgcG90dnJkenVqZSB0bywgxI1vIHNtZSB2aWRlbGkgYWogdiBBQ0YgZ3JhZmUgYSB2IER1cmJpbuKAk1dhdHNvbm92b20gdGVzdGUuIENoeWJ5IG1vZGVsdSBzYSB2IMSNYXNlIG9wYWt1asO6IGEgbmFkdsOkenVqw7ogbmEgc2ViYSwgdGFrxb5lIG1vZGVsIG5lemFjaHl0w6F2YSDEjWFzb3bDvSB2w712b2ogbmV6YW1lc3RuYW5vc3RpIMO6cGxuZSBzcHLDoXZuZS4gSWRlIG8gcHJvYmzDqW0gdiDFoXBlY2lmaWvDoWNpaSBtb2RlbHUsIG5pZSBvIHByb2Jsw6ltIHYgc2Ftb3Ruw71jaCBkw6F0YWNoLgoKCiMjIyBPZHN0cmHFiG92YW5pZSBwcm9ibMOpbXUgYXV0b2tvcmVsw6FjaWUgcmV6w61kdcOtIOKAkyBLb3lja292IG1vZGVsCgpLZcSPxb5lIG7DocWhIHDDtHZvZG7DvSBtb2RlbCBtYWwgcHJvYmzDqW0gcyBhdXRva29yZWzDoWNpb3UsIHBva8O6xaFhbWUgc2EgaG8gb2RzdHLDoW5pxaUgcHJpZGFuw61tIG9uZXNrb3JlbmVqIHrDoXZpc2xlaiBwcmVtZW5uZWouIElkZSBvIHR6di4gS295Y2tvdiBtb2RlbC4gRG8gbW9kZWx1IHNtZSBwcmlkYWxpIG5lemFtZXN0bmFub3PFpSB6IG1pbnVsw6lobyByb2thIChsYWcgMSksIGtlxI/FvmUgcHJlZHBva2xhZMOhbWUsIMW+ZSB2w712b2ogbmV6YW1lc3RuYW5vc3RpIHNhIG1lbsOtIHBvc3R1cG5lIGEgbcO0xb5lIGJ5xaUgb3ZwbHl2bmVuw70gaG9kbm90YW1pIHogcHJlZGNow6FkemFqw7pjZWhvIG9iZG9iaWEuCgpQbyBwcmlkYW7DrSB0ZWp0byBwcmVtZW5uZWogb2RoYWRuZW1lIG5vdsO9IG1vZGVsIGEgbsOhc2xlZG5lIHZ5a29uw6FtZSBEdXJiaW7igJNXYXRzb25vdiB0ZXN0LCBhYnkgc21lIHNrb250cm9sb3ZhbGksIMSNaSBhdXRva29yZWzDoWNpYSB6bWl6bGEuIEFrIGplIGhvZG5vdGEgRFcgYmxpxb7FoWllIGsgxI3DrXNsdSAyIGEgcC1ob2Rub3RhIGplIHbDpMSNxaFpYSBha28gMCwwNSwgem5hbWVuw6EgdG8sIMW+ZSBhdXRva29yZWzDoWNpdSBzYSBwb2RhcmlsbyBvZHN0csOhbmnFpS4KCmBgYHtyfQpsaWJyYXJ5KGRwbHlyKQoKdWRhamVTbG92YWtSZXB1YmxpYyA8LSB1ZGFqZVNsb3Zha1JlcHVibGljICU+JQogIGFycmFuZ2UoWWVhcikgJT4lCiAgbXV0YXRlKAogICAgVW5lbXBsb3ltZW50X2xhZzEgPSBsYWcoVW5lbXBsb3ltZW50LlJhdGUpCiAgKQoKYGBgCmBgYHtyfQptb2RlbF9rb3ljayA8LSBsbShVbmVtcGxveW1lbnQuUmF0ZSB+IAogICAgICAgICAgICAgICAgICAgIEVtcGxveW1lbnQuU2VjdG9yLi5BZ3JpY3VsdHVyZSArCiAgICAgICAgICAgICAgICAgICAgRW1wbG95bWVudC5TZWN0b3IuLkluZHVzdHJ5ICsKICAgICAgICAgICAgICAgICAgICBFbXBsb3ltZW50LlNlY3Rvci4uU2VydmljZXMgKwogICAgICAgICAgICAgICAgICAgIGxvZ0dEUCArCiAgICAgICAgICAgICAgICAgICAgVW5lbXBsb3ltZW50X2xhZzEsCiAgICAgICAgICAgICAgICAgIGRhdGEgPSB1ZGFqZVNsb3Zha1JlcHVibGljKQoKc3VtbWFyeShtb2RlbF9rb3ljaykKCmBgYAojIyMgVsO9c2xlZGt5IEtveWNrb3ZobyBtb2RlbHUKCktlxI8gc21lIGRvIG1vZGVsdSBwcmlkYWxpIG9uZXNrb3JlbsO6IG5lemFtZXN0bmFub3PFpSB6IG1pbnVsw6lobyByb2thLCB0YWsgc2EgdsO9c2xlZGt5IHpsZXDFoWlsaS4gUHJlbWVubsOhIFVuZW1wbG95bWVudF9sYWcxIHZ5xaFsYSB2ZcS+bWkgdsO9em5hbW7DoSwgxI1vIHpuYW1lbsOhLCDFvmUgbmV6YW1lc3RuYW5vc8WlIHogcHJlZGNow6FkemFqw7pjZWhvIHJva2Egc2lsbm8gb3ZwbHl2xYh1amUgbmV6YW1lc3RuYW5vc8WlIHYgYWt0dcOhbG5vbSByb2t1LiBUbyBkw6F2YSB6bXlzZWwsIGtlxI/FvmUgbmV6YW1lc3RuYW5vc8WlIHNhIHbDpMSNxaFpbm91IG5lbWVuw60gc2tva292bywgYWxlIHBvc3R1cG5lLgoKT3N0YXRuw6kgcHJlbWVubsOpIHXFviBuaWUgc8O6IHRha8OpIGTDtGxlxb5pdMOpIGFrbyBwcmVkdMO9bSwgcHJldG/FvmUgdmXEvmvDuiDEjWFzxaUgem1lbnkgdiBuZXphbWVzdG5hbm9zdGkgdnlzdmV0bMOtIHByw6F2ZSBob2Rub3RhIHogbWludWzDqWhvIHJva2EuIFTDvW0sIMW+ZSBzbWUgdMO6dG8gcHJlbWVubsO6IHByaWRhbGksIG1vZGVsIHNhIGxlcMWhaWUgdHJhZsOtIGRvIHRvaG8sIGFrbyBzYSBuZXphbWVzdG5hbm9zxaUgc3Byw6F2YSB2IMSNYXNlLgoKSG9kbm90YSBSwrIgc2EgenbDvcWhaWxhIG5hIHByaWJsacW+bmUgMC44OSwgxI1vIGplIHZlxL5taSBkb2Jyw6kuIFpuYW1lbsOhIHRvLCDFvmUgbsOhxaEgbm92w70gbW9kZWwgdcW+IHZpZSB2eXN2ZXRsacWlIHNrb3JvIGNlbMO6IHptZW51IHYgbmV6YW1lc3RuYW5vc3RpLiBDZWxrb3ZvIHRlbnRvIG1vZGVsIHDDtHNvYsOtIHN0YWJpbG5lasWhaWUgYSBwcmVzbmVqxaFpZSBuZcW+IHRlbiBww7R2b2Ruw70uCgoKIyMjIER1cmJpbuKAk1dhdHNvbm92IHRlc3QgcG8gb2RoYWRlIEtveWNrb3ZobyBtb2RlbHUKCk5hIG5vdm9tIG1vZGVsaSBzbWUgc3ByYXZpbGkgb3DDpMWlIER1cmJpbuKAk1dhdHNvbm92IHRlc3QsIGFieSBzbWUgemlzdGlsaSwgxI1pIHNhIGF1dG9rb3JlbMOhY2lhIHBvZGFyaWxhIG9kc3Ryw6FuacWlLiBWIG5hxaFvbSBwcsOtcGFkZSBzbWUgZG9zdGFsaSBob2Rub3R1IERXID0gMS4zNDY4LCDEjW8gamUgc8OtY2UgYmxpxb7FoWllIGsgaG9kbm90ZSAyIGFrbyBwcmVkdMO9bSwgYWxlIHN0w6FsZSB0byBuaWUgamUgw7pwbG5lIGlkZcOhbG5lLiBQLWhvZG5vdGEgamUgMC4wMDMsIHRha8W+ZSBudWxvdsO6IGh5cG90w6l6dSBvcMOkxaUgemFtaWV0YW1lLgoKVG8gem5hbWVuw6EsIMW+ZSBhaiBrZcSPIHNhIGF1dG9rb3JlbMOhY2lhIHpuw63FvmlsYSwgc3TDoWxlIHRhbSBqZSBhIG1vZGVsIGp1IMO6cGxuZSBuZW9kc3Ryw6FuaWwuIEtveWNrb3YgbW9kZWwgc8OtY2UgcG9tb2hvbCB6bGVwxaFpxaUgdsO9c2xlZGt5IGEgc3ByYXZpbCBtb2RlbCBwcmVzbmVqxaHDrSwgYWxlIGF1dG9rb3JlbMOhY2lhIHNhIG5lc3RyYXRpbGEgw7pwbG5lLgoKYGBge3J9CmR3dGVzdChtb2RlbF9rb3ljaykKCmBgYAoKTmEgbm92b20gbW9kZWxpIHNtZSBzcHJhdmlsaSBvcMOkxaUgRHVyYmlu4oCTV2F0c29ub3YgdGVzdCwgYWJ5IHNtZSB6aXN0aWxpLCDEjWkgc2EgYXV0b2tvcmVsw6FjaWEgcG9kYXJpbGEgb2RzdHLDoW5pxaUuIFYgbmHFoW9tIHByw61wYWRlIHNtZSBkb3N0YWxpIGhvZG5vdHUgRFcgPSAxLjM0NjgsIMSNbyBqZSBzw61jZSBibGnFvsWhaWUgayBob2Rub3RlIDIgYWtvIHByZWR0w71tLCBhbGUgc3TDoWxlIHRvIG5pZSBqZSDDunBsbmUgaWRlw6FsbmUuIFAtaG9kbm90YSBqZSAwLjAwMywgdGFrxb5lIG51bG92w7ogaHlwb3TDqXp1IG9ww6TFpSB6YW1pZXRhbWUuCgpLb3lja292IG1vZGVsIHPDrWNlIHBvbW9ob2wgemxlcMWhacWlIHbDvXNsZWRreSBhIHNwcmF2aWwgbW9kZWwgcHJlc25lasWhw60sIGFsZSBhdXRva29yZWzDoWNpYSBzYSBuZXN0cmF0aWxhIMO6cGxuZS4KCiMjIyMgTmV3ZXnigJNXZXN0IHJvYnVzdG7DqSDFoXRhbmRhcmRuw6kgY2h5YnkKCktlxI/FvmUgbsOhxaEgbW9kZWwgbcOhIHByb2Jsw6lteSBzIGF1dG9rb3JlbMOhY2lvdSBhIG5pZWt0b3LDqSBwcmVkcG9rbGFkeSBrbGFzaWNrZWogcmVncmVzaWUgbmllIHPDuiBzcGxuZW7DqSwgcG91xb5pbGkgc21lIHR6di4gcm9idXN0bsOpIHNtZXJvZGFqbsOpIGNoeWJ5LiBUaWUgbmVtZW5pYSBzYW1vdG7DqSBrb2VmaWNpZW50eSwgYWxlIHVwcmF2dWrDuiBpY2ggc21lcm9kYWpuw6kgY2h5YnkgdGFrLCBhYnkgYm9saSB2w71zbGVka3kgc3BvxL5haGxpdmVqxaFpZSBhaiB2dGVkeSwga2XEjyBzYSBtb2RlbCBuZXNwcsOhdmEgw7pwbG5lIGlkZcOhbG5lLgoKCmBgYHtyfQpjb2VmdGVzdChtb2RlbF9rb3ljaywgdmNvdiA9IHZjb3ZIQyhtb2RlbF9rb3ljaywgdHlwZSA9ICJIQzMiKSkKCmBgYAojIyMgVsO9c2xlZGt5IHBvIHBvdcW+aXTDrSByb2J1c3Ruw71jaCBzbWVyb2Rham7DvWNoIGNow71iCgpQbyBwb3XFvml0w60gcm9idXN0bsO9Y2ggc21lcm9kYWpuw71jaCBjaMO9YiBzYSB1a8OhemFsbywgxb5lIG7DocWhIG1vZGVsIGplIHN0YWJpbG5lasWhw60gYSB2w71zbGVka3kgc8O6IHNwb8S+YWhsaXZlasWhaWUuIFYgcG9yb3ZuYW7DrSBzIHByZWRjaMOhZHphasO6Y2ltaSB2w71zbGVka2FtaSB2aWTDrW1lLCDFvmUgb25lc2tvcmVuw6EgbmV6YW1lc3RuYW5vc8WlIChVbmVtcGxveW1lbnRfbGFnMSkgem9zdMOhdmEgdsO9cmF6bmUgdsO9em5hbW7DoSwgdGFrxb5lIG5hb3phaiBwbGF0w60sIMW+ZSBuZXphbWVzdG5hbm9zxaUgeiBtaW51bMOpaG8gcm9rYSBzaWxubyBvdnBseXbFiHVqZSB0w7ogYWt0dcOhbG51LgoKWmF1asOtbWF2w6kgamUsIMW+ZSBwbyDDunByYXZlIHNhIHbDvXpuYW1uw71taSBzdGFsaSBhaiBwcmVtZW5uw6kgQWdyaWN1bHR1cmUsIEluZHVzdHJ5IGEgU2VydmljZXMuIFbFoWV0a3kgdHJpIG1hasO6IHZlxL5taSBwb2RvYm7DqSBrb2VmaWNpZW50eSBhaiBwLWhvZG5vdHkuIFpuYW1lbsOhIHRvLCDFvmUgdGlldG8gcHJlbWVubsOpIG1hasO6IHVyxI1pdMO9IHZwbHl2IG5hIG5lemFtZXN0bmFub3PFpSwgYWxlIHRlbnRvIHZwbHl2IHNtZSB2aWRlbGkgYcW+IHBvIHRvbSwgxI1vIGJvbGkgY2h5Ynkg4oCeb3ByYXZlbsOp4oCcIHJvYnVzdG7DvW0gcHLDrXN0dXBvbS4KClByZW1lbm7DoSBsb2dHRFAgem9zdGFsYSBuZXbDvXpuYW1uw6EsIHRha8W+ZSBIRFAgc2Ftb3Ruw6kgbmVtw6EgdiBuYcWhb20gbW9kZWxpIGHFviB0YWvDvSB2ZcS+a8O9IHZwbHl2LCBrZcSPIHXFviBiZXJpZW1lIGRvIMO6dmFoeSBvbmVza29yZW7DuiBuZXphbWVzdG5hbm9zxaUuCgpDZWxrb3ZvIG3DtMW+ZW1lIHBvdmVkYcWlLCDFvmUgcm9idXN0bsOpIHNtZXJvZGFqbsOpIGNoeWJ5IG7DoW0gcG9tb2hsaSB6w61za2HFpSBwcmVzbmVqxaHDrSBvYnJheiBvIHRvbSwga3RvcsOpIHByZW1lbm7DqSBzw7ogc2t1dG/EjW5lIGTDtGxlxb5pdMOpLCBhaiBrZcSPIG1vZGVsIG5lbcOhIMO6cGxuZSBpZGXDoWxuZSB2bGFzdG5vc3RpLgoKIyMjIFpocm51dGllCgpWIG5hxaFlaiBhbmFsw716ZSBzbWUgbmFqc2vDtHIgb2RoYWRsaSB6w6FrbGFkbsO9IHJlZ3Jlc27DvSBtb2RlbCwgYWJ5IHNtZSB6aXN0aWxpLCDEjW8gb3ZwbHl2xYh1amUgbWllcnUgbmV6YW1lc3RuYW5vc3RpIG5hIFNsb3ZlbnNrdS4gUMO0dm9kbsO9IG1vZGVsIG1hbCB2xaFhayBwcm9ibMOpbXkgcyBhdXRva29yZWzDoWNpb3UsIMSNbyBzbWUgdmlkZWxpIHYgQUNGIGdyYWZlIGEgcG90dnJkaWxpIHBvbW9jb3UgRHVyYmlu4oCTV2F0c29ub3ZobyBhIEJyZXVzY2jigJNHb2RmcmV5b3ZobyB0ZXN0dS4gVG8gem5hbWVuYWxvLCDFvmUgbW9kZWwgbmV6YWNoeXTDoXZhbCDEjWFzb3bDvSB2w712b2ogZG9zdGF0b8SNbmUgZG9icmUgYSBjaHlieSBzYSB2IMSNYXNlIG9wYWtvdmFsaS4KClByZXRvIHNtZSB2eXNrw7rFoWFsaSBLb3lja292IG1vZGVsLCBrZGUgc21lIHByaWRhbGkgbmV6YW1lc3RuYW5vc8WlIHogcHJlZGNow6FkemFqw7pjZWhvIHJva2EuIFRlbnRvIGtyb2sgdsO9cmF6bmUgemxlcMWhaWwga3ZhbGl0dSBtb2RlbHUgYSB6dsO9xaFpbCBSwrIsIHRha8W+ZSBtb2RlbCBkb2vDoXphbCB2eXN2ZXRsacWlIG92ZcS+YSB2w6TEjcWhaXUgxI1hc8WlIHptaWVuIHYgbmV6YW1lc3RuYW5vc3RpLiBBdXRva29yZWzDoWNpYSBzYSBzw61jZSB6bsOtxb5pbGEsIGFsZSDDunBsbmUgbmV6bWl6bGEuCgpOYWtvbmllYyBzbWUgcG91xb5pbGkgcm9idXN0bsOpIHNtZXJvZGFqbsOpIGNoeWJ5LCBrdG9yw6kgdXByYXZ1asO6IHbDvXNsZWRreSB0YWssIGFieSBib2xpIHNwb8S+YWhsaXZlasWhaWUgYWogdnRlZHksIGtlxI8gbW9kZWwgbmllIGplIMO6cGxuZSBpZGXDoWxueS4gUG8gdGVqdG8gw7pwcmF2ZSBzYSB1a8OhemFsbywga3RvcsOpIHByZW1lbm7DqSBzw7ogbmFvemFqIGTDtGxlxb5pdMOpIGEgdsO9c2xlZGt5IHDDtHNvYmlsaSBzdGFiaWxuZWrFoWllLgoKQ2Vsa292byBtw7TFvmVtZSBwb3ZlZGHFpSwgxb5lIG7DocWhIG1vZGVsIHBvIMO6cHJhdsOhY2ggbGVwxaFpZSB6YWNoeXTDoXZhIHbDvXZvaiBuZXphbWVzdG5hbm9zdGkgdiDEjWFzZS4gU3TDoWxlIHbFoWFrIHBsYXTDrSwgxb5lIMSNYXNvdsOpIHJhZHkgc8O6IMWhcGVjaWZpY2vDqSBhIMSNYXN0byBzaSB2ecW+YWR1asO6IHBva3JvxI1pbGVqxaFpZSBtb2RlbHksIGFieSBzbWUgw7pwbG5lIG9kc3Ryw6FuaWxpIGF1dG9rb3JlbMOhY2l1Lgo=