library(zoo)
library(tseries)
library(lmtest)
library(sandwich)
library(car)
rm(list=ls())
1. Načítanie dát a predspracovanie
eco <- read.csv("economics.csv", stringsAsFactors = FALSE)
eco$date <- as.Date(eco$date)
str(eco)
'data.frame': 574 obs. of 7 variables:
$ X : int 1 2 3 4 5 6 7 8 9 10 ...
$ date : Date, format: "1967-07-01" "1967-08-01" "1967-09-01" ...
$ pce : num 507 510 516 512 517 ...
$ pop : num 198712 198911 199113 199311 199498 ...
$ psavert : num 12.6 12.6 11.9 12.9 12.8 11.8 11.7 12.3 11.7 12.3 ...
$ uempmed : num 4.5 4.7 4.6 4.9 4.7 4.8 5.1 4.5 4.1 4.6 ...
$ unemploy: int 2944 2945 2958 3143 3066 3018 2878 3001 2877 2709 ...
summary(eco)
X date pce pop psavert
Min. : 1.0 Min. :1967-07-01 Min. : 506.7 Min. :198712 Min. : 2.200
1st Qu.:144.2 1st Qu.:1979-06-08 1st Qu.: 1578.3 1st Qu.:224896 1st Qu.: 6.400
Median :287.5 Median :1991-05-16 Median : 3936.8 Median :253060 Median : 8.400
Mean :287.5 Mean :1991-05-17 Mean : 4820.1 Mean :257160 Mean : 8.567
3rd Qu.:430.8 3rd Qu.:2003-04-23 3rd Qu.: 7626.3 3rd Qu.:290291 3rd Qu.:11.100
Max. :574.0 Max. :2015-04-01 Max. :12193.8 Max. :320402 Max. :17.300
uempmed unemploy
Min. : 4.000 Min. : 2685
1st Qu.: 6.000 1st Qu.: 6284
Median : 7.500 Median : 7494
Mean : 8.609 Mean : 7771
3rd Qu.: 9.100 3rd Qu.: 8686
Max. :25.200 Max. :15352
pce_ts <- ts(eco$pce, start = c(as.numeric(format(min(eco$date), "%Y")), as.numeric(format(min(eco$date), "%m"))), frequency = 12)
plot(pce_ts, main = "PCE (Personal Consumption Expenditures) - časová rada", ylab = "pce")

2. Jednoduchá lineárna regresia
Ako príklad odhadnem model, kde závislá premenná je pce a
vysvetľujúce premenné sú unemploy (počet nezamestnaných) a psavert
(osobná miera úspor):
model <- lm(pce ~ unemploy + psavert, data = eco)
summary(model)
Call:
lm(formula = pce ~ unemploy + psavert, data = eco)
Residuals:
Min 1Q Median 3Q Max
-4908.2 -1051.0 -307.4 951.0 6577.6
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 7400.27144 353.89141 20.91 <2e-16 ***
unemploy 0.54969 0.02783 19.75 <2e-16 ***
psavert -799.79277 24.80336 -32.24 <2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 1674 on 571 degrees of freedom
Multiple R-squared: 0.7794, Adjusted R-squared: 0.7786
F-statistic: 1009 on 2 and 571 DF, p-value: < 2.2e-16
# uložím rezidua
res <- residuals(model)
# graf rezíduí
ts.plot(res, main = "Rezíduá z lineárneho modelu", ylab = "rezíduá")

3. Diagnostika rezíduí — autokorelácia
par(mfrow = c(1,2))
acf(res, main = "ACF rezíduí")
pacf(res, main = "PACF rezíduí")
par(mfrow = c(1,1))

Ljung–Box test
# test na náhodnosť rezíduí (Ljung-Box)
Box.test(res, lag = 12, type = "Ljung-Box")
Box-Ljung test
data: res
X-squared = 4038.3, df = 12, p-value < 2.2e-16
Durbin–Watson test (prvá kontrola autokorelácie)
library(lmtest)
dwtest(model)
Durbin-Watson test
data: model
DW = 0.12773, p-value < 2.2e-16
alternative hypothesis: true autocorrelation is greater than 0
Breusch–Godfrey test (viacnásobná autokorelácia)
# bgtest z balíka lmtest - test na autokorelaciu rádov 1..p
bgtest(model, order = 12) # testujeme autokoreláciu až do 12 periód
Breusch-Godfrey test for serial correlation of order up to 12
data: model
LM test = 509.81, df = 12, p-value < 2.2e-16
4. Robustné štandardné chyby — Newey–West
library(sandwich)
library(lmtest)
coeftest(model, vcov = NeweyWest(model, lag = 12, prewhite = FALSE))
t test of coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 7400.271439 906.339604 8.1650 2.068e-15 ***
unemploy 0.549694 0.093081 5.9056 6.038e-09 ***
psavert -799.792766 57.529831 -13.9022 < 2.2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
5. Alternatíva: dynamický model (lagy závislej premennej)
# pridám lag 1 z pce
eco$pce_lag1 <- dplyr::lag(eco$pce, 1)
# odstránime prvé NA pozorovanie
eco_dyn <- na.omit(eco[, c("date", "pce", "pce_lag1", "unemploy", "psavert")])
model_dyn <- lm(pce ~ pce_lag1 + unemploy + psavert, data = eco_dyn)
summary(model_dyn)
Call:
lm(formula = pce ~ pce_lag1 + unemploy + psavert, data = eco_dyn)
Residuals:
Min 1Q Median 3Q Max
-169.204 -7.954 0.067 9.415 159.690
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 39.8107519 6.8857547 5.782 1.22e-08 ***
pce_lag1 1.0004423 0.0006150 1626.833 < 2e-16 ***
unemploy 0.0003373 0.0005312 0.635 0.526
psavert -2.8229677 0.6108563 -4.621 4.72e-06 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 24.56 on 569 degrees of freedom
Multiple R-squared: 1, Adjusted R-squared: 1
F-statistic: 3.995e+06 on 3 and 569 DF, p-value: < 2.2e-16
# test autokorelácie rezíduí modelu_dyn
res_dyn <- residuals(model_dyn)
acf(res_dyn, main = "ACF rezíduí - dynamický model")

Box.test(res_dyn, lag = 12, type = "Ljung-Box")
Box-Ljung test
data: res_dyn
X-squared = 32.551, df = 12, p-value = 0.001137
dwtest(model_dyn)
Durbin-Watson test
data: model_dyn
DW = 2.0407, p-value = 0.6428
alternative hypothesis: true autocorrelation is greater than 0
6. Záver a komentár
V modeli, kde bola závislou premennou spotreba pce a
vysvetľujúcimi premennými unemploy a
psavert, sme dostali veľmi vysokú štatistickú
významnosť oboch koeficientov a relatívne vysoké R² (≈ 0.78). Samotné
odhady však nie je možné považovať za spoľahlivé, pretože diagnostika
rezíduí jednoznačne odhalila silnú pozitívnu
autokoreláciu:
- ACF aj PACF grafy rezíduí ukázali dlhú pomalú decay (typický prejav
trendovej časovej rady)
- Ljung–Box test (p < 2.2e-16) autokoreláciu potvrdil
- Durbin–Watson štatistika (DW = 0.1277) je extrémne vzdialená od 2 →
výrazná pozitívna autokorelácia
- Breusch–Godfrey test pre 12 periód taktiež zamietol nezávislosť
rezíduí (p < 2.2e-16)
Autokorelácia rezíduí znamená, že OLS odhady síce zostávajú
neskreslené, ale ich štandardné chyby sú podhodnotené, čo môže viesť k
mylným záverom o štatistickej významnosti koeficientov.
Robustné štandardné chyby – Newey–West
Po aplikácii Newey–West korekcie došlo k výraznému zvýšeniu
štandardných chýb pri všetkých koeficientoch, čo je očakávané pri
súčasnej autokorelácii aj heteroskedasticite.
- premenná unemploy zostala štatisticky významná, ale
jej t-hodnota sa znížila,
- premenná psavert zostala vysoko významná,
To znamená, že model je aj po korekcii štatisticky silný, ale pôvodný
bol príliš „optimistický“.
Dynamický model
Po pridaní jedného oneskorenia závislej premennej
(pce_lag1) sa situácia zásadne zmenila:
- koeficient pri pce_lag1 ≈ 1.0004 → spotreba je
silne autoregresívna,
- koeficient pri unemploy už nie je štatisticky
významný (p = 0.526),
- psavert zostáva významná, ale jej efekt je menší než v prvom
modeli,
- rezíduá sú dramaticky menšie (štandardná chyba prudko klesla z 1674
→ 24.56).
Diagnostika rezíduí dynamického modelu:
- ACF ukazuje už len mierne korelácie,
- Ljung–Box test (p = 0.0011) naznačuje slabú autokoreláciu,
- Durbin–Watson (≈ 2.04, p = 0.64).
To znamená, že dynamický model veľmi dobre odstránil
autokoreláciu.
Interpretácia výsledkov
- Pôvodný statický model bol síce štatisticky významný, ale trpel
veľmi silnou autokoreláciou rezíduí, čo spôsobovalo skreslené
závery.
- Newey–West korekcia poskytla realistickejšie štandardné chyby.
- Dynamický model s oneskorenou premennou pce_lag1:
- výrazne zlepšil kvalitu modelu,
- odstránil väčšinu autokorelácie,
- ukázal, že spotreba má takmer jednotkovú autoregresiu,
- zmenil významnosť premenných (unemploy prestal byť významný).
Z ekonomického hľadiska to znamená, že minulá spotreba je
dominantným prediktorom dnešnej spotreby, čo je typické pre
makroekonomické časové rady.
Zhrnutie
Autokorelácia bola v pôvodnom modeli extrémne silná, čo potvrdili
všetky testy. Po dynamizácii modelu sa autokorelácia odstránila a nový
model poskytuje spoľahlivejšie výsledky. Najlepší a najstabilnejší model
je preto dynamický model s pce_lag1.
LS0tCnRpdGxlOiAiQXV0b2tvcmVsw6FjaWEgcmV6w61kdcOtIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKYXV0aG9yOiBCYy4gQWxpY2EgVHZyZMOhCi0tLQoKPHN0eWxlPgovKiBSdcW+b3bDqSBwb3phZGllIHByZSBjZWzDvSBkb2t1bWVudCAqLwpib2R5IHsKICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmU2ZjA7CiAgICBmb250LWZhbWlseTogQXJpYWwsIHNhbnMtc2VyaWY7CiAgICBsaW5lLWhlaWdodDogMS42Owp9CgovKiBSdcW+b3bDqSBuYWRwaXN5ICovCmgxLCBoMiwgaDMsIGg0IHsKICAgIGNvbG9yOiAjZmY2OWI0Owp9CgovKiBDaXTDoXR5ICovCmJsb2NrcXVvdGUgewogICAgYm9yZGVyLWxlZnQ6IDRweCBzb2xpZCAjZmY2OWI0OwogICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjBmNTsKICAgIHBhZGRpbmc6IDEwcHggMTVweDsKICAgIG1hcmdpbjogMTBweCAwOwogICAgZm9udC1zdHlsZTogaXRhbGljOwp9CgovKiBadsO9cmF6bmVuaWUga8S+w7rEjW92w71jaCBzbG92ICovCnNwYW4uaGlnaGxpZ2h0IHsKICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmI2YzE7CiAgICBmb250LXdlaWdodDogYm9sZDsKICAgIHBhZGRpbmc6IDJweCA0cHg7CiAgICBib3JkZXItcmFkaXVzOiAzcHg7Cn0KPC9zdHlsZT4KCmBgYHtyfQpsaWJyYXJ5KHpvbykKbGlicmFyeSh0c2VyaWVzKQpsaWJyYXJ5KGxtdGVzdCkKbGlicmFyeShzYW5kd2ljaCkKbGlicmFyeShjYXIpCnJtKGxpc3Q9bHMoKSkKYGBgCgojIDEuIE5hxI3DrXRhbmllIGTDoXQgYSBwcmVkc3ByYWNvdmFuaWUKCmBgYHtyfQplY28gPC0gcmVhZC5jc3YoImVjb25vbWljcy5jc3YiLCBzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UpCmVjbyRkYXRlIDwtIGFzLkRhdGUoZWNvJGRhdGUpCnN0cihlY28pCnN1bW1hcnkoZWNvKQoKcGNlX3RzIDwtIHRzKGVjbyRwY2UsIHN0YXJ0ID0gYyhhcy5udW1lcmljKGZvcm1hdChtaW4oZWNvJGRhdGUpLCAiJVkiKSksIGFzLm51bWVyaWMoZm9ybWF0KG1pbihlY28kZGF0ZSksICIlbSIpKSksIGZyZXF1ZW5jeSA9IDEyKQoKCnBsb3QocGNlX3RzLCBtYWluID0gIlBDRSAoUGVyc29uYWwgQ29uc3VtcHRpb24gRXhwZW5kaXR1cmVzKSAtIMSNYXNvdsOhIHJhZGEiLCB5bGFiID0gInBjZSIpCmBgYAojIDIuIEplZG5vZHVjaMOhIGxpbmXDoXJuYSByZWdyZXNpYQoKQWtvIHByw61rbGFkIG9kaGFkbmVtIG1vZGVsLCBrZGUgesOhdmlzbMOhIHByZW1lbm7DoSBqZSBwY2UgYSB2eXN2ZXTEvnVqw7pjZSBwcmVtZW5uw6kgc8O6IHVuZW1wbG95IChwb8SNZXQgbmV6YW1lc3RuYW7DvWNoKSBhIHBzYXZlcnQgKG9zb2Juw6EgbWllcmEgw7pzcG9yKToKCmBgYHtyfQptb2RlbCA8LSBsbShwY2UgfiB1bmVtcGxveSArIHBzYXZlcnQsIGRhdGEgPSBlY28pCnN1bW1hcnkobW9kZWwpCgpyZXMgPC0gcmVzaWR1YWxzKG1vZGVsKQoKdHMucGxvdChyZXMsIG1haW4gPSAiUmV6w61kdcOhIHogbGluZcOhcm5laG8gbW9kZWx1IiwgeWxhYiA9ICJyZXrDrWR1w6EiKQpgYGAKCiMgMy4gRGlhZ25vc3Rpa2EgcmV6w61kdcOtIOKAlCBhdXRva29yZWzDoWNpYQoKYGBge3J9CnBhcihtZnJvdyA9IGMoMSwyKSkKYWNmKHJlcywgbWFpbiA9ICJBQ0YgcmV6w61kdcOtIikKcGFjZihyZXMsIG1haW4gPSAiUEFDRiByZXrDrWR1w60iKQpwYXIobWZyb3cgPSBjKDEsMSkpCmBgYAojIyMgTGp1bmfigJNCb3ggdGVzdAoKYGBge3J9CkJveC50ZXN0KHJlcywgbGFnID0gMTIsIHR5cGUgPSAiTGp1bmctQm94IikKYGBgCgojIyMgRHVyYmlu4oCTV2F0c29uIHRlc3QgKHBydsOhIGtvbnRyb2xhIGF1dG9rb3JlbMOhY2llKQoKYGBge3J9CmxpYnJhcnkobG10ZXN0KQpkd3Rlc3QobW9kZWwpCmBgYAojIyMgQnJldXNjaOKAk0dvZGZyZXkgdGVzdCAodmlhY27DoXNvYm7DoSBhdXRva29yZWzDoWNpYSkKCmBgYHtyfQpiZ3Rlc3QobW9kZWwsIG9yZGVyID0gMTIpICMgdGVzdHVqZW1lIGF1dG9rb3JlbMOhY2l1IGHFviBkbyAxMiBwZXJpw7NkCmBgYAojIDQuIFJvYnVzdG7DqSDFoXRhbmRhcmRuw6kgY2h5Ynkg4oCUIE5ld2V54oCTV2VzdAoKYGBge3J9CmxpYnJhcnkoc2FuZHdpY2gpCmxpYnJhcnkobG10ZXN0KQpjb2VmdGVzdChtb2RlbCwgdmNvdiA9IE5ld2V5V2VzdChtb2RlbCwgbGFnID0gMTIsIHByZXdoaXRlID0gRkFMU0UpKQpgYGAKCiMgNS4gQWx0ZXJuYXTDrXZhOiBkeW5hbWlja8O9IG1vZGVsIChsYWd5IHrDoXZpc2xlaiBwcmVtZW5uZWopCgpgYGB7cn0KZWNvJHBjZV9sYWcxIDwtIGRwbHlyOjpsYWcoZWNvJHBjZSwgMSkKZWNvX2R5biA8LSBuYS5vbWl0KGVjb1ssIGMoImRhdGUiLCAicGNlIiwgInBjZV9sYWcxIiwgInVuZW1wbG95IiwgInBzYXZlcnQiKV0pCgoKbW9kZWxfZHluIDwtIGxtKHBjZSB+IHBjZV9sYWcxICsgdW5lbXBsb3kgKyBwc2F2ZXJ0LCBkYXRhID0gZWNvX2R5bikKc3VtbWFyeShtb2RlbF9keW4pCgoKcmVzX2R5biA8LSByZXNpZHVhbHMobW9kZWxfZHluKQphY2YocmVzX2R5biwgbWFpbiA9ICJBQ0YgcmV6w61kdcOtIC0gZHluYW1pY2vDvSBtb2RlbCIpCkJveC50ZXN0KHJlc19keW4sIGxhZyA9IDEyLCB0eXBlID0gIkxqdW5nLUJveCIpCmR3dGVzdChtb2RlbF9keW4pCmBgYAojIDYuIFrDoXZlciBhIGtvbWVudMOhcgpWIG1vZGVsaSwga2RlIGJvbGEgesOhdmlzbG91IHByZW1lbm5vdSBzcG90cmViYSAqKnBjZSoqIGEgdnlzdmV0xL51asO6Y2ltaSBwcmVtZW5uw71taSAqKnVuZW1wbG95KiogYSAqKnBzYXZlcnQqKiwgc21lIGRvc3RhbGkgdmXEvm1pIHZ5c29rw7ogxaF0YXRpc3RpY2vDuiB2w716bmFtbm9zxaUgb2JvY2gga29lZmljaWVudG92IGEgcmVsYXTDrXZuZSB2eXNva8OpIFLCsiAo4omIIDAuNzgpLiBTYW1vdG7DqSBvZGhhZHkgdsWhYWsgbmllIGplIG1vxb5uw6kgcG92YcW+b3ZhxaUgemEgc3BvxL5haGxpdsOpLCBwcmV0b8W+ZSBkaWFnbm9zdGlrYSByZXrDrWR1w60gamVkbm96bmHEjW5lIG9kaGFsaWxhICoqc2lsbsO6IHBveml0w612bnUgYXV0b2tvcmVsw6FjaXUqKjoKCi0gQUNGIGFqIFBBQ0YgZ3JhZnkgcmV6w61kdcOtIHVrw6F6YWxpIGRsaMO6IHBvbWFsw7ogZGVjYXkgKHR5cGlja8O9IHByZWphdiB0cmVuZG92ZWogxI1hc292ZWogcmFkeSkKLSBManVuZ+KAk0JveCB0ZXN0IChwIDwgMi4yZS0xNikgYXV0b2tvcmVsw6FjaXUgcG90dnJkaWwKLSBEdXJiaW7igJNXYXRzb24gxaF0YXRpc3Rpa2EgKERXID0gMC4xMjc3KSBqZSBleHRyw6ltbmUgdnpkaWFsZW7DoSBvZCAyIOKGkiB2w71yYXpuw6EgcG96aXTDrXZuYSBhdXRva29yZWzDoWNpYQotIEJyZXVzY2jigJNHb2RmcmV5IHRlc3QgcHJlIDEyIHBlcmnDs2QgdGFrdGllxb4gemFtaWV0b2wgbmV6w6F2aXNsb3PFpSByZXrDrWR1w60gKHAgPCAyLjJlLTE2KQoKQXV0b2tvcmVsw6FjaWEgcmV6w61kdcOtIHpuYW1lbsOhLCDFvmUgT0xTIG9kaGFkeSBzw61jZSB6b3N0w6F2YWrDuiBuZXNrcmVzbGVuw6ksIGFsZSBpY2ggxaF0YW5kYXJkbsOpIGNoeWJ5IHPDuiBwb2Rob2Rub3RlbsOpLCDEjW8gbcO0xb5lIHZpZXPFpSBrIG15bG7DvW0gesOhdmVyb20gbyDFoXRhdGlzdGlja2VqIHbDvXpuYW1ub3N0aSBrb2VmaWNpZW50b3YuCgojIyMgUm9idXN0bsOpIMWhdGFuZGFyZG7DqSBjaHlieSDigJMgTmV3ZXnigJNXZXN0CgpQbyBhcGxpa8OhY2lpIE5ld2V54oCTV2VzdCBrb3Jla2NpZSBkb8WhbG8gayB2w71yYXpuw6ltdSB6dsO9xaFlbml1IMWhdGFuZGFyZG7DvWNoIGNow71iIHByaSB2xaFldGvDvWNoIGtvZWZpY2llbnRvY2gsIMSNbyBqZSBvxI1ha8OhdmFuw6kgcHJpIHPDusSNYXNuZWogYXV0b2tvcmVsw6FjaWkgYWogaGV0ZXJvc2tlZGFzdGljaXRlLgoKLSBwcmVtZW5uw6EgKip1bmVtcGxveSoqIHpvc3RhbGEgxaF0YXRpc3RpY2t5IHbDvXpuYW1uw6EsIGFsZSBqZWogdC1ob2Rub3RhIHNhIHpuw63FvmlsYSwKLSBwcmVtZW5uw6EgKipwc2F2ZXJ0Kiogem9zdGFsYSB2eXNva28gdsO9em5hbW7DoSwKClRvIHpuYW1lbsOhLCDFvmUgbW9kZWwgamUgYWogcG8ga29yZWtjaWkgxaF0YXRpc3RpY2t5IHNpbG7DvSwgYWxlIHDDtHZvZG7DvSBib2wgcHLDrWxpxaEg4oCeb3B0aW1pc3RpY2vDveKAnC4KCiMjIyBEeW5hbWlja8O9IG1vZGVsCgpQbyBwcmlkYW7DrSBqZWRuw6lobyBvbmVza29yZW5pYSB6w6F2aXNsZWogcHJlbWVubmVqICgqKnBjZV9sYWcxKiopIHNhIHNpdHXDoWNpYSB6w6FzYWRuZSB6bWVuaWxhOgoKLSBrb2VmaWNpZW50IHByaSBwY2VfbGFnMSDiiYggKioxLjAwMDQqKiDihpIgc3BvdHJlYmEgamUgc2lsbmUgYXV0b3JlZ3Jlc8Otdm5hLAotIGtvZWZpY2llbnQgcHJpIHVuZW1wbG95IHXFviAqKm5pZSBqZSDFoXRhdGlzdGlja3kgdsO9em5hbW7DvSoqIChwID0gMC41MjYpLAotIHBzYXZlcnQgem9zdMOhdmEgdsO9em5hbW7DoSwgYWxlIGplaiBlZmVrdCBqZSBtZW7FocOtIG5lxb4gdiBwcnZvbSBtb2RlbGksCi0gcmV6w61kdcOhIHPDuiBkcmFtYXRpY2t5IG1lbsWhaWUgKMWhdGFuZGFyZG7DoSBjaHliYSBwcnVka28ga2xlc2xhIHogMTY3NCDihpIgMjQuNTYpLgoKIyMjIyBEaWFnbm9zdGlrYSByZXrDrWR1w60gZHluYW1pY2vDqWhvIG1vZGVsdToKLSBBQ0YgdWthenVqZSB1xb4gbGVuIG1pZXJuZSBrb3JlbMOhY2llLAotIExqdW5n4oCTQm94IHRlc3QgKHAgPSAwLjAwMTEpIG5hem5hxI11amUgc2xhYsO6IGF1dG9rb3JlbMOhY2l1LAotIER1cmJpbuKAk1dhdHNvbiAo4omIIDIuMDQsIHAgPSAwLjY0KS4KClRvIHpuYW1lbsOhLCDFvmUgZHluYW1pY2vDvSBtb2RlbCAqKnZlxL5taSBkb2JyZSBvZHN0csOhbmlsIGF1dG9rb3JlbMOhY2l1KiouCgojIyMgSW50ZXJwcmV0w6FjaWEgdsO9c2xlZGtvdgoKLSBQw7R2b2Ruw70gc3RhdGlja8O9IG1vZGVsIGJvbCBzw61jZSDFoXRhdGlzdGlja3kgdsO9em5hbW7DvSwgYWxlIHRycGVsIHZlxL5taSBzaWxub3UgYXV0b2tvcmVsw6FjaW91IHJlesOtZHXDrSwgxI1vIHNww7Rzb2JvdmFsbyBza3Jlc2xlbsOpIHrDoXZlcnkuCi0gTmV3ZXnigJNXZXN0IGtvcmVrY2lhIHBvc2t5dGxhIHJlYWxpc3RpY2tlasWhaWUgxaF0YW5kYXJkbsOpIGNoeWJ5LgotIER5bmFtaWNrw70gbW9kZWwgcyBvbmVza29yZW5vdSBwcmVtZW5ub3UgKipwY2VfbGFnMSoqOgogIC0gdsO9cmF6bmUgemxlcMWhaWwga3ZhbGl0dSBtb2RlbHUsCiAgLSBvZHN0csOhbmlsIHbDpMSNxaFpbnUgYXV0b2tvcmVsw6FjaWUsCiAgLSB1a8OhemFsLCDFvmUgc3BvdHJlYmEgbcOhIHRha21lciBqZWRub3Rrb3bDuiBhdXRvcmVncmVzaXUsCiAgLSB6bWVuaWwgdsO9em5hbW5vc8WlIHByZW1lbm7DvWNoICh1bmVtcGxveSBwcmVzdGFsIGJ5xaUgdsO9em5hbW7DvSkuCgpaIGVrb25vbWlja8OpaG8gaMS+YWRpc2thIHRvIHpuYW1lbsOhLCDFvmUgKiptaW51bMOhIHNwb3RyZWJhIGplIGRvbWluYW50bsO9bSBwcmVkaWt0b3JvbSBkbmXFoW5laiBzcG90cmVieSoqLCDEjW8gamUgdHlwaWNrw6kgcHJlIG1ha3JvZWtvbm9taWNrw6kgxI1hc292w6kgcmFkeS4KCiMjIyBaaHJudXRpZQoKQXV0b2tvcmVsw6FjaWEgYm9sYSB2IHDDtHZvZG5vbSBtb2RlbGkgZXh0csOpbW5lIHNpbG7DoSwgxI1vIHBvdHZyZGlsaSB2xaFldGt5IHRlc3R5LiBQbyBkeW5hbWl6w6FjaWkgbW9kZWx1IHNhIGF1dG9rb3JlbMOhY2lhIG9kc3Ryw6FuaWxhIGEgbm92w70gbW9kZWwgcG9za3l0dWplIHNwb8S+YWhsaXZlasWhaWUgdsO9c2xlZGt5LiBOYWpsZXDFocOtIGEgbmFqc3RhYmlsbmVqxaHDrSBtb2RlbCBqZSBwcmV0byAqKmR5bmFtaWNrw70gbW9kZWwgcyBwY2VfbGFnMSoqLgoK