Úvod do problému, stanovenie hypotéz

V tejto úlohe skúmame ako sa logaritmické výnosnosti akcie Apple (APPL) menia v závislosti od logaritmických výnosností troch vybraných aktív, GLD, XLE a SPY.
H₁: Log-výnos akcie AAPL závisí štatisticky významne od log-výnosov GLD, XLE a SPY.
H₀: Medzi log-výnosom AAPL a výnosmi týchto aktív neexistuje štatisticky významný vzťah.

knitr::opts_chunk$set(
    echo = TRUE,
    message = FALSE,
    warning = FALSE
)
library(zoo)
library(tseries)
library(lmtest)
library(sandwich)
library(car)
library(quantmod)

Príprava databázy, čistenie a úprava údajov

Na začiatok si stiahneme naše dáta a z nich vypočítame logaritmické výnosnosti, s ktorými následne budeme pracovať.


tickers <- c("AAPL", "GLD", "XLE", "SPY")   # Apple, Gold ETF, Energy ETF, S&P500 ETF
getSymbols(tickers, from = "2024-01-01", to = "2025-01-01")

data <- merge(Cl(AAPL), Cl(GLD), Cl(XLE), Cl(SPY))
colnames(data) <- tickers

ret <- na.omit(diff(log(data)))
colnames(ret) <- paste0(colnames(ret), "_ret")

ret_df <- na.omit(as.data.frame(ret))
head(ret_df)

Boxploty zobrazené na obrázku znázorňujú rozdelenie denných logaritmických výnosov štyroch finančných aktív – akcie spoločnosti Apple (AAPL), zlatého ETF fondu (GLD), energetického sektora (XLE) a trhového indexu S&P 500 (SPY) – v období od januára 2024 do januára 2025. Tieto grafy boli vytvorené s cieľom vizuálne preskúmať základné štatistické charakteristiky dát, identifikovať možné odľahlé hodnoty a overiť, či sú dáta vhodné na následnú regresnú analýzu.

num_plots <- length(names(ret_df))
op <- par(mfrow = c(2, 2), mar = c(4, 4, 2, 1))
for (col in names(ret_df)) {
  boxplot(ret_df[[col]], main = col, xlab = "Value", col = "lightblue")
}
par(op)

Z grafov možno pozorovať, že výnosy všetkých štyroch aktív sa koncentrujú v blízkosti nuly, čo je typické pre denné finančné výnosy. Rozpätie medzi horným a dolným kvartilom (interkvartilové rozpätie) je pomerne úzke, čo naznačuje relatívne nízku volatilitu vo vybranom období. Na každom grafe sa zároveň objavujú jednotlivé body nad a pod boxom, ktoré predstavujú odľahlé hodnoty – dni s výraznejším rastom alebo poklesom cien, spôsobeným trhovými výkyvmi či ekonomickými udalosťami.

Celkovo možno konštatovať, že rozdelenia všetkých sledovaných premenných sú približne symetrické a neobsahujú systematické odchýlky. Dáta preto považujeme za čisté a vhodné na ďalšie spracovanie v rámci regresnej analýzy, pričom prítomnosť niekoľkých extrémnych hodnôt nepredstavuje významnú prekážku pre pokračovanie v modelovaní.

Lineárna regresia

model <- lm(AAPL_ret ~ GLD_ret + XLE_ret + SPY_ret, data = ret_df)

cat("\nSúhrn modelu (model):\n")
print(summary(model))

Model ako celok je štatisticky významny (p-hodnota < 0,001), čo potvrdzuje, že aspoň jedna z vysvetľujúcich premenných významne ovplyvňuje výnosy akcie AAPL. Hodnota koeficientu determinácie R^2=0,312 znamená, že približne 31,2 % variability výnosov akcie Apple možno vysvetliť zmenami vo výnosoch uvedených troch aktív.

Z hľadiska jednotlivých premenných sa ukázalo, že najvýznamnejším faktorom je vývoj trhu reprezentovaný indexom SPY, ktorého koeficient (1,0396) je pozitívny a vysoko štatisticky významný (p < 0,001). Tento výsledok potvrdzuje, že akcie Apple sa pohybujú v súlade s celkovým trhovým trendom a rast trhu vedie k rastu výnosu akcie AAPL.

Premenná XLE (energetický sektor) má záporný a štatisticky významný koeficient (-0,1954; p = 0,0061). To naznačuje, že v sledovanom období existoval mierne negatívny vzťah medzi výnosmi energetického sektora a výnosmi spoločnosti Apple. Inými slovami, rast cien energetických spoločností bol spojený s miernym poklesom akcií Apple, čo možno vysvetliť tým, že rast cien energií zvyšuje náklady technologických firiem.

Naopak, výnos zlata (GLD) sa v modeli neukázal ako štatisticky významný (p = 0,9722), čo naznačuje, že pohyb cien zlata nemal v tomto období relevantný lineárny vplyv na výnosy Apple.

Celkovo možno konštatovať, že výnos akcie Apple je silno ovplyvnený vývojom celkového trhu (SPY), zatiaľ čo vplyv energetického sektora je slabší a opačného smeru. Vplyv zlata je zanedbateľný. Model má primeranú vysvetľovaciu schopnosť a spĺňa predpoklady pre ďalšie overovanie prostredníctvom diagnostických testov.

op <- par(mfrow = c(2, 2))
plot(model)
par(op)

Na obrázku sú zobrazené diagnostické grafy regresného modelu, ktoré slúžia na overenie splnenia základných predpokladov lineárnej regresie. Ich cieľom je posúdiť, či sú reziduá náhodne rozdelené, majú konštantnú varianciu, nevykazujú systematické vzory a či neexistujú odľahlé alebo vplyvné pozorovania, ktoré by mohli skresliť výsledky modelu.

Prvý graf Residuals vs Fitted zobrazuje vzťah medzi vypočítanými (predikovanými) hodnotami a reziduami. Väčšina bodov sa nachádza v okolí horizontálnej osi a červená vyhladzovacia čiara je relatívne rovná, čo naznačuje, že reziduá sú približne rovnomerne rozložené a model nemá výrazné systematické skreslenie. Malé odchýlky od nuly naznačujú, že model je dobre špecifikovaný a že neexistuje závažný problém heteroskedasticity.

Druhý graf Q-Q Residuals (kvantil-kvantilový graf) porovnáva rozdelenie štandardizovaných reziduí s teoretickým normálnym rozdelením. Väčšina bodov sa nachádza blízko diagonálnej čiary, čo znamená, že predpoklad normality reziduí je v zásade splnený. Odchýlky na oboch koncoch (napr. dátumy 2024-05-03 a 2024-06-11) však poukazujú na prítomnosť niekoľkých extrémnych hodnôt, ktoré môžu predstavovať dni s neštandardným trhovým správaním.

Tretí graf Scale-Location (alebo Spread-Location plot) skúma, či má rozptyl reziduí tendenciu meniť sa so zmenou predikovaných hodnôt. Väčšina bodov je rozptýlená rovnomerne okolo červenej čiary, ktorá je takmer vodorovná, čo naznačuje, že predpoklad homoskedasticity (konštantnej variability chýb) je vo všeobecnosti splnený.

Posledný graf Residuals vs Leverage slúži na identifikáciu vplyvných pozorovaní, ktoré majú potenciál výrazne ovplyvniť odhad regresných koeficientov. Väčšina pozorovaní má nízku hodnotu pákového efektu (leverage), pričom iba niekoľko bodov (napr. 2024-05-03, 2024-08-05 a 2024-11-06) sa nachádza bližšie k vonkajším obrysom Cookovej vzdialenosti. Tieto body možno považovať za mierne vplyvné, no ich počet a rozsah neohrozujú stabilitu modelu.

Celkovo možno konštatovať, že diagnostické grafy potvrdzujú vhodnosť zvoleného modelu. Reziduá nevykazujú systematické odchýlky, majú približne konštantný rozptyl a ich rozdelenie je blízke normálnemu. Model preto spĺňa základné predpoklady lineárnej regresie a možno ho považovať za štatisticky spoľahlivý.

residuals_vec <- residuals(model)

cat("\nJarque–Bera test normality (model):\n")
print(tseries::jarque.bera.test(residuals_vec))

cat("\nOutlier test (Bonferroni p-value) – car::outlierTest (model):\n")
print(car::outlierTest(model))

Výsledky testu odľahlých hodnôt (outlier test) ukazujú, že dni 2024-06-11, 2024-05-03 a 2024-03-21 predstavujú štatisticky významné odľahlé pozorovania, ktoré mali najväčší vplyv na odhady regresného modelu.

model2 <- lm(AAPL_ret ~ I(log(1 + SPY_ret)) + XLE_ret, data = ret_df)

cat("\nSúhrn modelu (model2):\n")
print(summary(model2))

Výsledky druhého regresného modelu (model2) predstavujú upravenú verziu pôvodného modelu, v ktorej bola premená SPY_ret logaritmicky transformovaná a premenná GLD_ret vylúčená z analýzy, pretože sa v predchádzajúcom modeli ukázala ako štatisticky nevýznamná. Cieľom tejto úpravy bolo zlepšiť interpretovateľnosť modelu a eliminovať vplyv odľahlých hodnôt. Model ako celok je vysoko štatisticky významný (p < 0,001), čo potvrdzuje, že vysvetľujúce premenné majú významný vplyv na výnos akcie Apple. Hodnota koeficientu determinácie R2=0,313R^2 = 0,313R2=0,313 znamená, že približne 31,3 % variability výnosov AAPL možno vysvetliť zmenami v trhovom indexe SPY a v energetickom sektore XLE, čo je porovnateľné s pôvodným modelom. Premenná I(log(1 + SPY_ret)) má pozitívny a vysoko štatisticky významný vplyv (koeficient 1,04; p < 0,001), čo znamená, že výnosy akcie Apple rastú v súlade s rastom celkového trhu reprezentovaného indexom S&P 500. Tento výsledok potvrdzuje silnú väzbu medzi akciou Apple a trhovým indexom, čo je typické pre technologické spoločnosti s vysokou trhovou kapitalizáciou. Premenná XLE_ret má záporný a štatisticky významný koeficient (-0,1954; p = 0,0054), čo naznačuje mierne negatívny vzťah medzi výnosmi energetického sektora a výnosmi akcie Apple. Tento vzťah možno interpretovať tak, že rast cien energií a energetických spoločností býva sprevádzaný poklesom výnosov technologických akcií, ktoré sú citlivé na rast nákladov a pokles spotrebiteľského dopytu. Konštanta modelu (Intercept) nie je štatisticky významná, čo znamená, že pri nulových výnosoch vysvetľujúcich premenných je očakávaný výnos akcie AAPL zanedbateľný. Celkovo možno konštatovať, že druhý model potvrdil robustnosť vzťahu medzi akciou Apple a trhovým indexom SPY, pričom negatívny vplyv energetického sektora ostal zachovaný. Model spĺňa požadované štatistické predpoklady a poskytuje interpretovateľné a stabilné výsledky.

op <- par(mfrow = c(2, 2))
plot(model2)
par(op)

Diagnostické grafy pre druhý model potvrdzujú, že predpoklady lineárnej regresie sú vo všeobecnosti splnené. Reziduá sú rovnomerne rozložené okolo nuly a neprejavuje sa žiadny systematický vzor, čo naznačuje správnu špecifikáciu modelu. Q-Q graf ukazuje, že rozdelenie reziduí je blízke normálnemu, pričom malé odchýlky na koncoch (najmä dátumy 2024-05-03 a 2024-06-11) poukazujú na prítomnosť niekoľkých extrémnych pozorovaní. Scale-Location graf naznačuje približne konštantný rozptyl reziduí, čo znamená, že nedochádza k výraznej heteroskedasticite. Graf Residuals vs Leverage identifikuje len niekoľko mierne vplyvných bodov, ktoré však neohrozujú stabilitu modelu. Celkovo možno konštatovať, že model je dobre špecifikovaný a spĺňa požiadavky na spoľahlivú regresnú analýzu.

residuals2 <- residuals(model2)

cat("\nJarque–Bera test normality (model2):\n")
print(tseries::jarque.bera.test(residuals2))

cat("\nOutlier test (Bonferroni p-value) – car::outlierTest (model2):\n")
print(car::outlierTest(model2))

Test odľahlých hodnôt potvrdil, že pozorovania z 11. júna 2024, 3. mája 2024 a 21. marca 2024 sú štatisticky významné odľahlé body, ktoré môžu mať mierny vplyv na presnosť modelu.

cat("\nBreusch–Pagan test heteroskedasticity (model2):\n")
print(lmtest::bptest(model2))

Výsledky Breusch–Paganovho testu heteroskedasticity (p = 0,7845) ukazujú, že nezamietame nulovú hypotézu o konštantnom rozptyle reziduí, čo znamená, že v modeli sa nepreukázala prítomnosť heteroskedasticity a rozptyl chýb je približne rovnaký pre všetky pozorovania.

cat("\nDurbin–Watson test autokorelácie (model2):\n")
print(lmtest::dwtest(model2))

Hodnota Durbin–Watsonovho testu (DW = 2,04; p = 0,6239) naznačuje, že medzi reziduami modelu neexistuje autokorelácia, čo znamená, že chyby sú navzájom nezávislé a model spĺňa predpoklad nezávislosti reziduí.

cat("\nRESET test nelinearity (model2):\n")
print(lmtest::resettest(model2, power = 2:3, type = "fitted"))

Výsledky RESET testu (p = 0,2701) naznačujú, že nezamietame nulovú hypotézu o správnej špecifikácii modelu, čo znamená, že v modeli sa nepreukázala prítomnosť nelinearity a jeho funkčná forma je zvolená vhodne.

cat("\nKoeficienty s robustnými smerodajnými chybami (HC1) (model2):\n")
print(lmtest::coeftest(model2, vcov = sandwich::vcovHC(model2, type = "HC1")))

Výsledky regresie s robustnými smerodajnými chybami (HC1) potvrdzujú stabilitu a spoľahlivosť odhadnutých koeficientov. Premenná I(log(1 + SPY_ret)) zostáva vysoko štatisticky významná (p < 0,001), čo opätovne potvrdzuje silný pozitívny vplyv trhového indexu S&P 500 na výnosy akcie Apple. Premenná XLE_ret si zachováva štatistickú významnosť (p = 0,0013) aj po zohľadnení robustných smerodajných chýb, čo potvrdzuje negatívny vzťah medzi výnosmi energetického sektora a akciou Apple. Konštanta modelu (Intercept) nie je štatisticky významná, a preto nemá praktický vplyv na interpretáciu výsledkov. Celkovo možno konštatovať, že aj po úprave o heteroskedasticitu zostávajú hlavné závery modelu nezmenené a štatisticky silné.

cat("\nVIF (multikolinearita) (model2):\n")
print(car::vif(model2))

Hodnoty faktora inflácie rozptylu (VIF) sú nízke a pohybujú sa okolo 1,1, čo znamená, že medzi vysvetľujúcimi premennými I(log(1 + SPY_ret)) a XLE_ret neexistuje multikolinearita. Premenné teda nie sú navzájom silne korelované a model je z tohto hľadiska stabilný a spoľahlivý.

Bonus- CAPM

Ako doplnok k viacnásobnej regresii odhadujeme CAPM (market model), v ktorom je logaritmická výnosnosť akcie Apple vysvetlená výnosnosťou trhového indexu S&P 500 (SPY).

# ====== CAPM / Market model: AAPL vs. SPY ======
# AAPL_ret = alpha + beta * SPY_ret + u_t

capm <- lm(AAPL_ret ~ SPY_ret, data = ret_df)
summary(capm)

# robustné smerodajné chyby (HC1)
lmtest::coeftest(capm, vcov = sandwich::vcovHC(capm, type = "HC1"))

# 95 % interval spoľahlivosti pre beta
confint(capm, "SPY_ret", level = 0.95)

# užitočné veličiny
alpha_capm <- coef(capm)[1]
beta_capm  <- coef(capm)[2]
r2_capm    <- summary(capm)$r.squared
c(alpha_capm = alpha_capm, beta_capm = beta_capm, r2 = r2_capm)

Výsledky modelu CAPM potvrdzujú silnú väzbu medzi výnosmi akcie Apple (AAPL) a vývojom celkového trhu, ktorý reprezentuje index S&P 500 (SPY). Odhadnutý koeficient β=0,95 naznačuje, že akcie Apple reagujú veľmi podobne ako samotný trh – ak trh stúpne o 1 %, výnos Apple sa v priemere zvýši približne o 0,95 %. Ide teda o titul s takmer priemerným trhovým rizikom, čo je pre veľkú a stabilnú technologickú spoločnosť typické.

Koeficient α (intercept) nie je štatisticky významný, čo znamená, že akcie Apple v sledovanom období nedosahovali systematicky vyššie ani nižšie výnosy oproti očakávaniam na základe trhového vývoja. Hodnota R^2=0,29 ukazuje, že približne 29 % variability výnosov akcie Apple možno vysvetliť pohybom trhu, zvyšok závisí od faktorov špecifických pre samotnú firmu alebo technologický sektor.

Záverom možno povedať, že model CAPM potvrdzuje očakávanie, že najsilnejšia závislosť výnosov Apple je od celkového trhového vývoja (SPY). To znamená, že výkonnosť akcie je úzko prepojená s náladou na finančných trhoch a zmenami v širšom ekonomickom prostredí.

LS0tCnRpdGxlOiAiUGlhdGEgw7psb2hhIgphdXRob3I6ICcgTWlyb3NsYXZhIE1lZHZlY2vDoSAgPGJyPicKZGF0ZTogIlNlcHRlbWJlciAyMDI1IgpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazoKICAgIHRvYzogdHJ1ZQogICAgdG9jX2Zsb2F0OiB0cnVlCiAgICB0aGVtZTogdW5pdGVkCiAgICBoaWdobGlnaHQ6IHRhbmdvCiAgaHRtbF9kb2N1bWVudDoKICAgIHRvYzogdHJ1ZQogICAgZGZfcHJpbnQ6IHBhZ2VkCmVkaXRvcl9vcHRpb25zOgogIG1hcmtkb3duOgogICAgd3JhcDogNzIKLS0tCiMgw5p2b2QgZG8gcHJvYmzDqW11LCBzdGFub3ZlbmllIGh5cG90w6l6ClYgdGVqdG8gw7psb2hlIHNrw7ptYW1lIGFrbyBzYSBsb2dhcml0bWlja8OpIHbDvW5vc25vc3RpIGFrY2llIEFwcGxlIChBUFBMKSBtZW5pYSB2IHrDoXZpc2xvc3RpIG9kIGxvZ2FyaXRtaWNrw71jaCB2w71ub3Nub3N0w60gdHJvY2ggdnlicmFuw71jaCBha3TDrXYsIEdMRCwgWExFIGEgU1BZLiAgICAgIAoqKkjigoE6KiogTG9nLXbDvW5vcyBha2NpZSAqQUFQTCogesOhdmlzw60gxaF0YXRpc3RpY2t5IHbDvXpuYW1uZSBvZCBsb2ctdsO9bm9zb3YgKkdMRCosICpYTEUqIGEgKlNQWSouICAgICAgIAoqKkjigoA6KiogTWVkemkgbG9nLXbDvW5vc29tICpBQVBMKiBhIHbDvW5vc21pIHTDvWNodG8gYWt0w612IG5lZXhpc3R1amUgxaF0YXRpc3RpY2t5IHbDvXpuYW1uw70gdnrFpWFoLgogICAgIApgYGB7cn0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KAogICAgZWNobyA9IFRSVUUsCiAgICBtZXNzYWdlID0gRkFMU0UsCiAgICB3YXJuaW5nID0gRkFMU0UKKQpgYGAKCgo8c3R5bGU+Ci8qIENlbGtvdsOpIHBvemFkaWUgKi8KYm9keSB7CiAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDEzNWRlZywgI2U5ZjdlYywgI2QxZjdkMiwgI2JkZWNiNik7CiAgZm9udC1mYW1pbHk6ICdIZWx2ZXRpY2EgTmV1ZScsIEhlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWY7CiAgY29sb3I6ICMxYjQzMzI7CiAgbGluZS1oZWlnaHQ6IDEuNzsKICBwYWRkaW5nOiAyNXB4Owp9CgovKiBIbGF2bsOpIG5hZHBpc3kg4oCTICovCmgxLCBoMiwgaDMgewogIGZvbnQtZmFtaWx5OiAnSGVsdmV0aWNhIE5ldWUnLCBIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmOwogIGxldHRlci1zcGFjaW5nOiAwLjVweDsKICBjb2xvcjogIzE0NWEzMjsKICB0ZXh0LXNoYWRvdzogMHB4IDFweCAycHggI2ZiY2ZlODsKfQo8L3N0eWxlPgoKCmBgYHtyfQpsaWJyYXJ5KHpvbykKbGlicmFyeSh0c2VyaWVzKQpsaWJyYXJ5KGxtdGVzdCkKbGlicmFyeShzYW5kd2ljaCkKbGlicmFyeShjYXIpCmxpYnJhcnkocXVhbnRtb2QpCgpgYGAKCiAgICAgICAgICAKIyBQcsOtcHJhdmEgZGF0YWLDoXp5LCDEjWlzdGVuaWUgYSDDunByYXZhIMO6ZGFqb3YgICAgICAgICAgCk5hIHphxI1pYXRvayBzaSBzdGlhaG5lbWUgbmHFoWUgZMOhdGEgYSB6IG5pY2ggdnlwb8SNw610YW1lIGxvZ2FyaXRtaWNrw6kgdsO9bm9zbm9zdGksIHMga3RvcsO9bWkgbsOhc2xlZG5lIGJ1ZGVtZSBwcmFjb3ZhxaUuIApgYGB7cn0KCnRpY2tlcnMgPC0gYygiQUFQTCIsICJHTEQiLCAiWExFIiwgIlNQWSIpICAgIyBBcHBsZSwgR29sZCBFVEYsIEVuZXJneSBFVEYsIFMmUDUwMCBFVEYKZ2V0U3ltYm9scyh0aWNrZXJzLCBmcm9tID0gIjIwMjQtMDEtMDEiLCB0byA9ICIyMDI1LTAxLTAxIikKCmRhdGEgPC0gbWVyZ2UoQ2woQUFQTCksIENsKEdMRCksIENsKFhMRSksIENsKFNQWSkpCmNvbG5hbWVzKGRhdGEpIDwtIHRpY2tlcnMKCnJldCA8LSBuYS5vbWl0KGRpZmYobG9nKGRhdGEpKSkKY29sbmFtZXMocmV0KSA8LSBwYXN0ZTAoY29sbmFtZXMocmV0KSwgIl9yZXQiKQoKcmV0X2RmIDwtIG5hLm9taXQoYXMuZGF0YS5mcmFtZShyZXQpKQpoZWFkKHJldF9kZikKYGBgCiAgICAgCkJveHBsb3R5IHpvYnJhemVuw6kgbmEgb2Jyw6F6a3Ugem7DoXpvcsWIdWrDuiByb3pkZWxlbmllIGRlbm7DvWNoIGxvZ2FyaXRtaWNrw71jaCB2w71ub3NvdiDFoXR5cm9jaCBmaW5hbsSNbsO9Y2ggYWt0w612IOKAkyBha2NpZSBzcG9sb8SNbm9zdGkgQXBwbGUgKEFBUEwpLCB6bGF0w6lobyBFVEYgZm9uZHUgKEdMRCksIGVuZXJnZXRpY2vDqWhvIHNla3RvcmEgKFhMRSkgYSB0cmhvdsOpaG8gaW5kZXh1IFMmUCA1MDAgKFNQWSkg4oCTIHYgb2Jkb2LDrSBvZCBqYW51w6FyYSAyMDI0IGRvIGphbnXDoXJhIDIwMjUuIFRpZXRvIGdyYWZ5IGJvbGkgdnl0dm9yZW7DqSBzIGNpZcS+b20gdml6dcOhbG5lIHByZXNrw7ptYcWlIHrDoWtsYWRuw6kgxaF0YXRpc3RpY2vDqSBjaGFyYWt0ZXJpc3Rpa3kgZMOhdCwgaWRlbnRpZmlrb3ZhxaUgbW/Fvm7DqSBvZMS+YWhsw6kgaG9kbm90eSBhIG92ZXJpxaUsIMSNaSBzw7ogZMOhdGEgdmhvZG7DqSBuYSBuw6FzbGVkbsO6IHJlZ3Jlc27DuiBhbmFsw716dS4gICAgIAoKYGBge3J9Cm51bV9wbG90cyA8LSBsZW5ndGgobmFtZXMocmV0X2RmKSkKb3AgPC0gcGFyKG1mcm93ID0gYygyLCAyKSwgbWFyID0gYyg0LCA0LCAyLCAxKSkKZm9yIChjb2wgaW4gbmFtZXMocmV0X2RmKSkgewogIGJveHBsb3QocmV0X2RmW1tjb2xdXSwgbWFpbiA9IGNvbCwgeGxhYiA9ICJWYWx1ZSIsIGNvbCA9ICJsaWdodGJsdWUiKQp9CnBhcihvcCkKYGBgCgpaIGdyYWZvdiBtb8W+bm8gcG96b3JvdmHFpSwgxb5lIHbDvW5vc3kgdsWhZXRrw71jaCDFoXR5cm9jaCBha3TDrXYgc2Ega29uY2VudHJ1asO6IHYgYmzDrXprb3N0aSBudWx5LCDEjW8gamUgdHlwaWNrw6kgcHJlIGRlbm7DqSBmaW5hbsSNbsOpIHbDvW5vc3kuIFJvenDDpHRpZSBtZWR6aSBob3Juw71tIGEgZG9sbsO9bSBrdmFydGlsb20gKGludGVya3ZhcnRpbG92w6kgcm96cMOkdGllKSBqZSBwb21lcm5lIMO6emtlLCDEjW8gbmF6bmHEjXVqZSByZWxhdMOtdm5lIG7DrXprdSB2b2xhdGlsaXR1IHZvIHZ5YnJhbm9tIG9iZG9iw60uIE5hIGthxb5kb20gZ3JhZmUgc2EgesOhcm92ZcWIIG9iamF2dWrDuiBqZWRub3RsaXbDqSBib2R5IG5hZCBhIHBvZCBib3hvbSwga3RvcsOpIHByZWRzdGF2dWrDuiBvZMS+YWhsw6kgaG9kbm90eSDigJMgZG5pIHMgdsO9cmF6bmVqxaHDrW0gcmFzdG9tIGFsZWJvIHBva2xlc29tIGNpZW4sIHNww7Rzb2JlbsO9bSB0cmhvdsO9bWkgdsO9a3l2bWkgxI1pIGVrb25vbWlja8O9bWkgdWRhbG9zxaVhbWkuCiAgICAgCkNlbGtvdm8gbW/Fvm5vIGtvbsWhdGF0b3ZhxaUsIMW+ZSByb3pkZWxlbmlhIHbFoWV0a8O9Y2ggc2xlZG92YW7DvWNoIHByZW1lbm7DvWNoIHPDuiBwcmlibGnFvm5lIHN5bWV0cmlja8OpIGEgbmVvYnNhaHVqw7ogc3lzdGVtYXRpY2vDqSBvZGNow71sa3kuIETDoXRhIHByZXRvIHBvdmHFvnVqZW1lIHphIMSNaXN0w6kgYSB2aG9kbsOpIG5hIMSPYWzFoWllIHNwcmFjb3ZhbmllIHYgcsOhbWNpIHJlZ3Jlc25laiBhbmFsw716eSwgcHJpxI1vbSBwcsOtdG9tbm9zxaUgbmlla2/EvmvDvWNoIGV4dHLDqW1ueWNoIGhvZG7DtHQgbmVwcmVkc3RhdnVqZSB2w716bmFtbsO6IHByZWvDocW+a3UgcHJlIHBva3JhxI1vdmFuaWUgdiBtb2RlbG92YW7DrS4KICAgICAgICAKIyBMaW5lw6FybmEgcmVncmVzaWEgCiAgICAgCmBgYHtyfQptb2RlbCA8LSBsbShBQVBMX3JldCB+IEdMRF9yZXQgKyBYTEVfcmV0ICsgU1BZX3JldCwgZGF0YSA9IHJldF9kZikKCmNhdCgiXG5Tw7pocm4gbW9kZWx1IChtb2RlbCk6XG4iKQpwcmludChzdW1tYXJ5KG1vZGVsKSkKYGBgCgpNb2RlbCBha28gY2Vsb2sgamUgxaF0YXRpc3RpY2t5IHbDvXpuYW1ueSAocC1ob2Rub3RhIDwgMCwwMDEpLCDEjW8gcG90dnJkenVqZSwgxb5lIGFzcG/FiCBqZWRuYSB6IHZ5c3ZldMS+dWrDumNpY2ggcHJlbWVubsO9Y2ggdsO9em5hbW5lIG92cGx5dsWIdWplIHbDvW5vc3kgYWtjaWUgQUFQTC4gSG9kbm90YSBrb2VmaWNpZW50dSBkZXRlcm1pbsOhY2llIFJeMj0wLDMxMiB6bmFtZW7DoSwgxb5lIHByaWJsacW+bmUgMzEsMiAlIHZhcmlhYmlsaXR5IHbDvW5vc292IGFrY2llIEFwcGxlIG1vxb5ubyB2eXN2ZXRsacWlIHptZW5hbWkgdm8gdsO9bm9zb2NoIHV2ZWRlbsO9Y2ggdHJvY2ggYWt0w612LgogICAgIApaIGjEvmFkaXNrYSBqZWRub3RsaXbDvWNoIHByZW1lbm7DvWNoIHNhIHVrw6F6YWxvLCDFvmUgbmFqdsO9em5hbW5lasWhw61tIGZha3Rvcm9tIGplIHbDvXZvaiB0cmh1IHJlcHJlemVudG92YW7DvSBpbmRleG9tIFNQWSwga3RvcsOpaG8ga29lZmljaWVudCAoMSwwMzk2KSBqZSBwb3ppdMOtdm55IGEgdnlzb2tvIMWhdGF0aXN0aWNreSB2w716bmFtbsO9IChwIDwgMCwwMDEpLiBUZW50byB2w71zbGVkb2sgcG90dnJkenVqZSwgxb5lIGFrY2llIEFwcGxlIHNhIHBvaHlidWrDuiB2IHPDumxhZGUgcyBjZWxrb3bDvW0gdHJob3bDvW0gdHJlbmRvbSBhIHJhc3QgdHJodSB2ZWRpZSBrIHJhc3R1IHbDvW5vc3UgYWtjaWUgQUFQTC4KICAgICAKUHJlbWVubsOhIFhMRSAoZW5lcmdldGlja8O9IHNla3RvcikgbcOhIHrDoXBvcm7DvSBhIMWhdGF0aXN0aWNreSB2w716bmFtbsO9IGtvZWZpY2llbnQgKC0wLDE5NTQ7IHAgPSAwLDAwNjEpLiBUbyBuYXpuYcSNdWplLCDFvmUgdiBzbGVkb3Zhbm9tIG9iZG9iw60gZXhpc3RvdmFsIG1pZXJuZSBuZWdhdMOtdm55IHZ6xaVhaCBtZWR6aSB2w71ub3NtaSBlbmVyZ2V0aWNrw6lobyBzZWt0b3JhIGEgdsO9bm9zbWkgc3BvbG/EjW5vc3RpIEFwcGxlLiBJbsO9bWkgc2xvdmFtaSwgcmFzdCBjaWVuIGVuZXJnZXRpY2vDvWNoIHNwb2xvxI1ub3N0w60gYm9sIHNwb2plbsO9IHMgbWllcm55bSBwb2tsZXNvbSBha2Npw60gQXBwbGUsIMSNbyBtb8W+bm8gdnlzdmV0bGnFpSB0w71tLCDFvmUgcmFzdCBjaWVuIGVuZXJnacOtIHp2ecWhdWplIG7DoWtsYWR5IHRlY2hub2xvZ2lja8O9Y2ggZmlyaWVtLgogICAgCk5hb3BhaywgdsO9bm9zIHpsYXRhIChHTEQpIHNhIHYgbW9kZWxpIG5ldWvDoXphbCBha28gxaF0YXRpc3RpY2t5IHbDvXpuYW1uw70gKHAgPSAwLDk3MjIpLCDEjW8gbmF6bmHEjXVqZSwgxb5lIHBvaHliIGNpZW4gemxhdGEgbmVtYWwgdiB0b210byBvYmRvYsOtIHJlbGV2YW50bsO9IGxpbmXDoXJueSB2cGx5diBuYSB2w71ub3N5IEFwcGxlLgogICAgIApDZWxrb3ZvIG1vxb5ubyBrb27FoXRhdG92YcWlLCDFvmUgdsO9bm9zIGFrY2llIEFwcGxlIGplIHNpbG5vIG92cGx5dm5lbsO9IHbDvXZvam9tIGNlbGtvdsOpaG8gdHJodSAoU1BZKSwgemF0aWHEviDEjW8gdnBseXYgZW5lcmdldGlja8OpaG8gc2VrdG9yYSBqZSBzbGFixaHDrSBhIG9wYcSNbsOpaG8gc21lcnUuIFZwbHl2IHpsYXRhIGplIHphbmVkYmF0ZcS+bsO9LiBNb2RlbCBtw6EgcHJpbWVyYW7DuiB2eXN2ZXTEvm92YWNpdSBzY2hvcG5vc8WlIGEgc3DEusWIYSBwcmVkcG9rbGFkeSBwcmUgxI9hbMWhaWUgb3Zlcm92YW5pZSBwcm9zdHJlZG7DrWN0dm9tIGRpYWdub3N0aWNrw71jaCB0ZXN0b3YuCiAgICAgCmBgYHtyfQpvcCA8LSBwYXIobWZyb3cgPSBjKDIsIDIpKQpwbG90KG1vZGVsKQpwYXIob3ApCmBgYAogICAgIApOYSBvYnLDoXprdSBzw7ogem9icmF6ZW7DqSBkaWFnbm9zdGlja8OpIGdyYWZ5IHJlZ3Jlc27DqWhvIG1vZGVsdSwga3RvcsOpIHNsw7rFvmlhIG5hIG92ZXJlbmllIHNwbG5lbmlhIHrDoWtsYWRuw71jaCBwcmVkcG9rbGFkb3YgbGluZcOhcm5laiByZWdyZXNpZS4gSWNoIGNpZcS+b20gamUgcG9zw7pkacWlLCDEjWkgc8O6IHJlemlkdcOhIG7DoWhvZG5lIHJvemRlbGVuw6ksIG1hasO6IGtvbsWhdGFudG7DuiB2YXJpYW5jaXUsIG5ldnlrYXp1asO6IHN5c3RlbWF0aWNrw6kgdnpvcnkgYSDEjWkgbmVleGlzdHVqw7ogb2TEvmFobMOpIGFsZWJvIHZwbHl2bsOpIHBvem9yb3ZhbmlhLCBrdG9yw6kgYnkgbW9obGkgc2tyZXNsacWlIHbDvXNsZWRreSBtb2RlbHUuCgpQcnbDvSBncmFmIFJlc2lkdWFscyB2cyBGaXR0ZWQgem9icmF6dWplIHZ6xaVhaCBtZWR6aSB2eXBvxI3DrXRhbsO9bWkgKHByZWRpa292YW7DvW1pKSBob2Rub3RhbWkgYSByZXppZHVhbWkuIFbDpMSNxaFpbmEgYm9kb3Ygc2EgbmFjaMOhZHphIHYgb2tvbMOtIGhvcml6b250w6FsbmVqIG9zaSBhIMSNZXJ2ZW7DoSB2eWhsYWR6b3ZhY2lhIMSNaWFyYSBqZSByZWxhdMOtdm5lIHJvdm7DoSwgxI1vIG5hem5hxI11amUsIMW+ZSByZXppZHXDoSBzw7ogcHJpYmxpxb5uZSByb3Zub21lcm5lIHJvemxvxb5lbsOpIGEgbW9kZWwgbmVtw6EgdsO9cmF6bsOpIHN5c3RlbWF0aWNrw6kgc2tyZXNsZW5pZS4gTWFsw6kgb2RjaMO9bGt5IG9kIG51bHkgbmF6bmHEjXVqw7osIMW+ZSBtb2RlbCBqZSBkb2JyZSDFoXBlY2lmaWtvdmFuw70gYSDFvmUgbmVleGlzdHVqZSB6w6F2YcW+bsO9IHByb2Jsw6ltIGhldGVyb3NrZWRhc3RpY2l0eS4KCkRydWjDvSBncmFmIFEtUSBSZXNpZHVhbHMgKGt2YW50aWwta3ZhbnRpbG92w70gZ3JhZikgcG9yb3Zuw6F2YSByb3pkZWxlbmllIMWhdGFuZGFyZGl6b3ZhbsO9Y2ggcmV6aWR1w60gcyB0ZW9yZXRpY2vDvW0gbm9ybcOhbG55bSByb3pkZWxlbsOtbS4gVsOkxI3FoWluYSBib2RvdiBzYSBuYWNow6FkemEgYmzDrXprbyBkaWFnb27DoWxuZWogxI1pYXJ5LCDEjW8gem5hbWVuw6EsIMW+ZSBwcmVkcG9rbGFkIG5vcm1hbGl0eSByZXppZHXDrSBqZSB2IHrDoXNhZGUgc3BsbmVuw70uIE9kY2jDvWxreSBuYSBvYm9jaCBrb25jb2NoIChuYXByLiBkw6F0dW15IDIwMjQtMDUtMDMgYSAyMDI0LTA2LTExKSB2xaFhayBwb3VrYXp1asO6IG5hIHByw610b21ub3PFpSBuaWVrb8S+a8O9Y2ggZXh0csOpbW55Y2ggaG9kbsO0dCwga3RvcsOpIG3DtMW+dSBwcmVkc3Rhdm92YcWlIGRuaSBzIG5lxaF0YW5kYXJkbsO9bSB0cmhvdsO9bSBzcHLDoXZhbsOtbS4KClRyZXTDrSBncmFmIFNjYWxlLUxvY2F0aW9uIChhbGVibyBTcHJlYWQtTG9jYXRpb24gcGxvdCkgc2vDum1hLCDEjWkgbcOhIHJvenB0eWwgcmV6aWR1w60gdGVuZGVuY2l1IG1lbmnFpSBzYSBzbyB6bWVub3UgcHJlZGlrb3ZhbsO9Y2ggaG9kbsO0dC4gVsOkxI3FoWluYSBib2RvdiBqZSByb3pwdMO9bGVuw6Egcm92bm9tZXJuZSBva29sbyDEjWVydmVuZWogxI1pYXJ5LCBrdG9yw6EgamUgdGFrbWVyIHZvZG9yb3Zuw6EsIMSNbyBuYXpuYcSNdWplLCDFvmUgcHJlZHBva2xhZCBob21vc2tlZGFzdGljaXR5IChrb27FoXRhbnRuZWogdmFyaWFiaWxpdHkgY2jDvWIpIGplIHZvIHbFoWVvYmVjbm9zdGkgc3BsbmVuw70uCgpQb3NsZWRuw70gZ3JhZiBSZXNpZHVhbHMgdnMgTGV2ZXJhZ2Ugc2zDusW+aSBuYSBpZGVudGlmaWvDoWNpdSB2cGx5dm7DvWNoIHBvem9yb3ZhbsOtLCBrdG9yw6kgbWFqw7ogcG90ZW5jacOhbCB2w71yYXpuZSBvdnBseXZuacWlIG9kaGFkIHJlZ3Jlc27DvWNoIGtvZWZpY2llbnRvdi4gVsOkxI3FoWluYSBwb3pvcm92YW7DrSBtw6EgbsOtemt1IGhvZG5vdHUgcMOha292w6lobyBlZmVrdHUgKGxldmVyYWdlKSwgcHJpxI1vbSBpYmEgbmlla2/EvmtvIGJvZG92IChuYXByLiAyMDI0LTA1LTAzLCAyMDI0LTA4LTA1IGEgMjAyNC0xMS0wNikgc2EgbmFjaMOhZHphIGJsacW+xaFpZSBrIHZvbmthasWhw61tIG9icnlzb20gQ29va292ZWogdnpkaWFsZW5vc3RpLiBUaWV0byBib2R5IG1vxb5ubyBwb3Zhxb5vdmHFpSB6YSBtaWVybmUgdnBseXZuw6ksIG5vIGljaCBwb8SNZXQgYSByb3pzYWggbmVvaHJvenVqw7ogc3RhYmlsaXR1IG1vZGVsdS4KCkNlbGtvdm8gbW/Fvm5vIGtvbsWhdGF0b3ZhxaUsIMW+ZSBkaWFnbm9zdGlja8OpIGdyYWZ5IHBvdHZyZHp1asO6IHZob2Rub3PFpSB6dm9sZW7DqWhvIG1vZGVsdS4gUmV6aWR1w6EgbmV2eWthenVqw7ogc3lzdGVtYXRpY2vDqSBvZGNow71sa3ksIG1hasO6IHByaWJsacW+bmUga29uxaF0YW50bsO9IHJvenB0eWwgYSBpY2ggcm96ZGVsZW5pZSBqZSBibMOtemtlIG5vcm3DoWxuZW11LiBNb2RlbCBwcmV0byBzcMS6xYhhIHrDoWtsYWRuw6kgcHJlZHBva2xhZHkgbGluZcOhcm5laiByZWdyZXNpZSBhIG1vxb5ubyBobyBwb3Zhxb5vdmHFpSB6YSDFoXRhdGlzdGlja3kgc3BvxL5haGxpdsO9LiAgICAgCgpgYGB7cn0KcmVzaWR1YWxzX3ZlYyA8LSByZXNpZHVhbHMobW9kZWwpCgpjYXQoIlxuSmFycXVl4oCTQmVyYSB0ZXN0IG5vcm1hbGl0eSAobW9kZWwpOlxuIikKcHJpbnQodHNlcmllczo6amFycXVlLmJlcmEudGVzdChyZXNpZHVhbHNfdmVjKSkKCmNhdCgiXG5PdXRsaWVyIHRlc3QgKEJvbmZlcnJvbmkgcC12YWx1ZSkg4oCTIGNhcjo6b3V0bGllclRlc3QgKG1vZGVsKTpcbiIpCnByaW50KGNhcjo6b3V0bGllclRlc3QobW9kZWwpKQpgYGAKICAgICAKVsO9c2xlZGt5IHRlc3R1IG9kxL5haGzDvWNoIGhvZG7DtHQgKG91dGxpZXIgdGVzdCkgdWthenVqw7osIMW+ZSBkbmkgMjAyNC0wNi0xMSwgMjAyNC0wNS0wMyBhIDIwMjQtMDMtMjEgcHJlZHN0YXZ1asO6IMWhdGF0aXN0aWNreSB2w716bmFtbsOpIG9kxL5haGzDqSBwb3pvcm92YW5pYSwga3RvcsOpIG1hbGkgbmFqdsOkxI3FocOtIHZwbHl2IG5hIG9kaGFkeSByZWdyZXNuw6lobyBtb2RlbHUuCiAgICAgCmBgYHtyfQptb2RlbDIgPC0gbG0oQUFQTF9yZXQgfiBJKGxvZygxICsgU1BZX3JldCkpICsgWExFX3JldCwgZGF0YSA9IHJldF9kZikKCmNhdCgiXG5Tw7pocm4gbW9kZWx1IChtb2RlbDIpOlxuIikKcHJpbnQoc3VtbWFyeShtb2RlbDIpKQpgYGAKCiAgICAKVsO9c2xlZGt5IGRydWjDqWhvIHJlZ3Jlc27DqWhvIG1vZGVsdSAobW9kZWwyKSBwcmVkc3RhdnVqw7ogdXByYXZlbsO6IHZlcnppdSBww7R2b2Ruw6lobyBtb2RlbHUsIHYga3RvcmVqIGJvbGEgcHJlbWVuw6EgU1BZX3JldCBsb2dhcml0bWlja3kgdHJhbnNmb3Jtb3ZhbsOhIGEgcHJlbWVubsOhIEdMRF9yZXQgdnlsw7rEjWVuw6EgeiBhbmFsw716eSwgcHJldG/FvmUgc2EgdiBwcmVkY2jDoWR6YWrDumNvbSBtb2RlbGkgdWvDoXphbGEgYWtvIMWhdGF0aXN0aWNreSBuZXbDvXpuYW1uw6EuIENpZcS+b20gdGVqdG8gw7pwcmF2eSBib2xvIHpsZXDFoWnFpSBpbnRlcnByZXRvdmF0ZcS+bm9zxaUgbW9kZWx1IGEgZWxpbWlub3ZhxaUgdnBseXYgb2TEvmFobMO9Y2ggaG9kbsO0dC4KTW9kZWwgYWtvIGNlbG9rIGplIHZ5c29rbyDFoXRhdGlzdGlja3kgdsO9em5hbW7DvSAocCA8IDAsMDAxKSwgxI1vIHBvdHZyZHp1amUsIMW+ZSB2eXN2ZXTEvnVqw7pjZSBwcmVtZW5uw6kgbWFqw7ogdsO9em5hbW7DvSB2cGx5diBuYSB2w71ub3MgYWtjaWUgQXBwbGUuIEhvZG5vdGEga29lZmljaWVudHUgZGV0ZXJtaW7DoWNpZSBSMj0wLDMxM1JeMiA9IDAsMzEzUjI9MCwzMTMgem5hbWVuw6EsIMW+ZSBwcmlibGnFvm5lIDMxLDMgJSB2YXJpYWJpbGl0eSB2w71ub3NvdiBBQVBMIG1vxb5ubyB2eXN2ZXRsacWlIHptZW5hbWkgdiB0cmhvdm9tIGluZGV4ZSBTUFkgYSB2IGVuZXJnZXRpY2tvbSBzZWt0b3JlIFhMRSwgxI1vIGplIHBvcm92bmF0ZcS+bsOpIHMgcMO0dm9kbsO9bSBtb2RlbG9tLgpQcmVtZW5uw6EgSShsb2coMSArIFNQWV9yZXQpKSBtw6EgcG96aXTDrXZueSBhIHZ5c29rbyDFoXRhdGlzdGlja3kgdsO9em5hbW7DvSB2cGx5diAoa29lZmljaWVudCAxLDA0OyBwIDwgMCwwMDEpLCDEjW8gem5hbWVuw6EsIMW+ZSB2w71ub3N5IGFrY2llIEFwcGxlIHJhc3TDuiB2IHPDumxhZGUgcyByYXN0b20gY2Vsa292w6lobyB0cmh1IHJlcHJlemVudG92YW7DqWhvIGluZGV4b20gUyZQIDUwMC4gVGVudG8gdsO9c2xlZG9rIHBvdHZyZHp1amUgc2lsbsO6IHbDpHpidSBtZWR6aSBha2Npb3UgQXBwbGUgYSB0cmhvdsO9bSBpbmRleG9tLCDEjW8gamUgdHlwaWNrw6kgcHJlIHRlY2hub2xvZ2lja8OpIHNwb2xvxI1ub3N0aSBzIHZ5c29rb3UgdHJob3ZvdSBrYXBpdGFsaXrDoWNpb3UuClByZW1lbm7DoSBYTEVfcmV0IG3DoSB6w6Fwb3Juw70gYSDFoXRhdGlzdGlja3kgdsO9em5hbW7DvSBrb2VmaWNpZW50ICgtMCwxOTU0OyBwID0gMCwwMDU0KSwgxI1vIG5hem5hxI11amUgbWllcm5lIG5lZ2F0w612bnkgdnrFpWFoIG1lZHppIHbDvW5vc21pIGVuZXJnZXRpY2vDqWhvIHNla3RvcmEgYSB2w71ub3NtaSBha2NpZSBBcHBsZS4gVGVudG8gdnrFpWFoIG1vxb5ubyBpbnRlcnByZXRvdmHFpSB0YWssIMW+ZSByYXN0IGNpZW4gZW5lcmdpw60gYSBlbmVyZ2V0aWNrw71jaCBzcG9sb8SNbm9zdMOtIGLDvXZhIHNwcmV2w6FkemFuw70gcG9rbGVzb20gdsO9bm9zb3YgdGVjaG5vbG9naWNrw71jaCBha2Npw60sIGt0b3LDqSBzw7ogY2l0bGl2w6kgbmEgcmFzdCBuw6FrbGFkb3YgYSBwb2tsZXMgc3BvdHJlYml0ZcS+c2vDqWhvIGRvcHl0dS4KS29uxaF0YW50YSBtb2RlbHUgKEludGVyY2VwdCkgbmllIGplIMWhdGF0aXN0aWNreSB2w716bmFtbsOhLCDEjW8gem5hbWVuw6EsIMW+ZSBwcmkgbnVsb3bDvWNoIHbDvW5vc29jaCB2eXN2ZXTEvnVqw7pjaWNoIHByZW1lbm7DvWNoIGplIG/EjWFrw6F2YW7DvSB2w71ub3MgYWtjaWUgQUFQTCB6YW5lZGJhdGXEvm7DvS4gQ2Vsa292byBtb8W+bm8ga29uxaF0YXRvdmHFpSwgxb5lIGRydWjDvSBtb2RlbCBwb3R2cmRpbCByb2J1c3Rub3PFpSB2esWlYWh1IG1lZHppIGFrY2lvdSBBcHBsZSBhIHRyaG92w71tIGluZGV4b20gU1BZLCBwcmnEjW9tIG5lZ2F0w612bnkgdnBseXYgZW5lcmdldGlja8OpaG8gc2VrdG9yYSBvc3RhbCB6YWNob3ZhbsO9LiBNb2RlbCBzcMS6xYhhIHBvxb5hZG92YW7DqSDFoXRhdGlzdGlja8OpIHByZWRwb2tsYWR5IGEgcG9za3l0dWplIGludGVycHJldG92YXRlxL5uw6kgYSBzdGFiaWxuw6kgdsO9c2xlZGt5LgogICAgIApgYGB7cn0Kb3AgPC0gcGFyKG1mcm93ID0gYygyLCAyKSkKcGxvdChtb2RlbDIpCnBhcihvcCkKYGBgCiAgICAgCkRpYWdub3N0aWNrw6kgZ3JhZnkgcHJlIGRydWjDvSBtb2RlbCBwb3R2cmR6dWrDuiwgxb5lIHByZWRwb2tsYWR5IGxpbmXDoXJuZWogcmVncmVzaWUgc8O6IHZvIHbFoWVvYmVjbm9zdGkgc3BsbmVuw6kuIFJlemlkdcOhIHPDuiByb3Zub21lcm5lIHJvemxvxb5lbsOpIG9rb2xvIG51bHkgYSBuZXByZWphdnVqZSBzYSDFvmlhZG55IHN5c3RlbWF0aWNrw70gdnpvciwgxI1vIG5hem5hxI11amUgc3Byw6F2bnUgxaFwZWNpZmlrw6FjaXUgbW9kZWx1LiBRLVEgZ3JhZiB1a2F6dWplLCDFvmUgcm96ZGVsZW5pZSByZXppZHXDrSBqZSBibMOtemtlIG5vcm3DoWxuZW11LCBwcmnEjW9tIG1hbMOpIG9kY2jDvWxreSBuYSBrb25jb2NoIChuYWptw6QgZMOhdHVteSAyMDI0LTA1LTAzIGEgMjAyNC0wNi0xMSkgcG91a2F6dWrDuiBuYSBwcsOtdG9tbm9zxaUgbmlla2/EvmvDvWNoIGV4dHLDqW1ueWNoIHBvem9yb3ZhbsOtLiBTY2FsZS1Mb2NhdGlvbiBncmFmIG5hem5hxI11amUgcHJpYmxpxb5uZSBrb27FoXRhbnRuw70gcm96cHR5bCByZXppZHXDrSwgxI1vIHpuYW1lbsOhLCDFvmUgbmVkb2Now6FkemEgayB2w71yYXpuZWogaGV0ZXJvc2tlZGFzdGljaXRlLiBHcmFmIFJlc2lkdWFscyB2cyBMZXZlcmFnZSBpZGVudGlmaWt1amUgbGVuIG5pZWtvxL5rbyBtaWVybmUgdnBseXZuw71jaCBib2Rvdiwga3RvcsOpIHbFoWFrIG5lb2hyb3p1asO6IHN0YWJpbGl0dSBtb2RlbHUuIENlbGtvdm8gbW/Fvm5vIGtvbsWhdGF0b3ZhxaUsIMW+ZSBtb2RlbCBqZSBkb2JyZSDFoXBlY2lmaWtvdmFuw70gYSBzcMS6xYhhIHBvxb5pYWRhdmt5IG5hIHNwb8S+YWhsaXbDuiByZWdyZXNuw7ogYW5hbMO9enUuCmBgYHtyfQpyZXNpZHVhbHMyIDwtIHJlc2lkdWFscyhtb2RlbDIpCgpjYXQoIlxuSmFycXVl4oCTQmVyYSB0ZXN0IG5vcm1hbGl0eSAobW9kZWwyKTpcbiIpCnByaW50KHRzZXJpZXM6OmphcnF1ZS5iZXJhLnRlc3QocmVzaWR1YWxzMikpCgpjYXQoIlxuT3V0bGllciB0ZXN0IChCb25mZXJyb25pIHAtdmFsdWUpIOKAkyBjYXI6Om91dGxpZXJUZXN0IChtb2RlbDIpOlxuIikKcHJpbnQoY2FyOjpvdXRsaWVyVGVzdChtb2RlbDIpKQpgYGAKICAgICAKVGVzdCBvZMS+YWhsw71jaCBob2Ruw7R0IHBvdHZyZGlsLCDFvmUgcG96b3JvdmFuaWEgeiAxMS4gasO6bmEgMjAyNCwgMy4gbcOhamEgMjAyNCBhIDIxLiBtYXJjYSAyMDI0IHPDuiDFoXRhdGlzdGlja3kgdsO9em5hbW7DqSBvZMS+YWhsw6kgYm9keSwga3RvcsOpIG3DtMW+dSBtYcWlIG1pZXJueSB2cGx5diBuYSBwcmVzbm9zxaUgbW9kZWx1LgogICAgIApgYGB7cn0KY2F0KCJcbkJyZXVzY2jigJNQYWdhbiB0ZXN0IGhldGVyb3NrZWRhc3RpY2l0eSAobW9kZWwyKTpcbiIpCnByaW50KGxtdGVzdDo6YnB0ZXN0KG1vZGVsMikpCmBgYAoKVsO9c2xlZGt5IEJyZXVzY2jigJNQYWdhbm92aG8gdGVzdHUgaGV0ZXJvc2tlZGFzdGljaXR5IChwID0gMCw3ODQ1KSB1a2F6dWrDuiwgxb5lIG5lemFtaWV0YW1lIG51bG92w7ogaHlwb3TDqXp1IG8ga29uxaF0YW50bm9tIHJvenB0eWxlIHJlemlkdcOtLCDEjW8gem5hbWVuw6EsIMW+ZSB2IG1vZGVsaSBzYSBuZXByZXVrw6F6YWxhIHByw610b21ub3PFpSBoZXRlcm9za2VkYXN0aWNpdHkgYSByb3pwdHlsIGNow71iIGplIHByaWJsacW+bmUgcm92bmFrw70gcHJlIHbFoWV0a3kgcG96b3JvdmFuaWEuCiAgICAgCmBgYHtyfQpjYXQoIlxuRHVyYmlu4oCTV2F0c29uIHRlc3QgYXV0b2tvcmVsw6FjaWUgKG1vZGVsMik6XG4iKQpwcmludChsbXRlc3Q6OmR3dGVzdChtb2RlbDIpKQpgYGAKCkhvZG5vdGEgRHVyYmlu4oCTV2F0c29ub3ZobyB0ZXN0dSAoRFcgPSAyLDA0OyBwID0gMCw2MjM5KSBuYXpuYcSNdWplLCDFvmUgbWVkemkgcmV6aWR1YW1pIG1vZGVsdSBuZWV4aXN0dWplIGF1dG9rb3JlbMOhY2lhLCDEjW8gem5hbWVuw6EsIMW+ZSBjaHlieSBzw7ogbmF2esOham9tIG5lesOhdmlzbMOpIGEgbW9kZWwgc3DEusWIYSBwcmVkcG9rbGFkIG5lesOhdmlzbG9zdGkgcmV6aWR1w60uCiAgICAgCmBgYHtyfQpjYXQoIlxuUkVTRVQgdGVzdCBuZWxpbmVhcml0eSAobW9kZWwyKTpcbiIpCnByaW50KGxtdGVzdDo6cmVzZXR0ZXN0KG1vZGVsMiwgcG93ZXIgPSAyOjMsIHR5cGUgPSAiZml0dGVkIikpCmBgYAoKVsO9c2xlZGt5IFJFU0VUIHRlc3R1IChwID0gMCwyNzAxKSBuYXpuYcSNdWrDuiwgxb5lIG5lemFtaWV0YW1lIG51bG92w7ogaHlwb3TDqXp1IG8gc3Byw6F2bmVqIMWhcGVjaWZpa8OhY2lpIG1vZGVsdSwgxI1vIHpuYW1lbsOhLCDFvmUgdiBtb2RlbGkgc2EgbmVwcmV1a8OhemFsYSBwcsOtdG9tbm9zxaUgbmVsaW5lYXJpdHkgYSBqZWhvIGZ1bmvEjW7DoSBmb3JtYSBqZSB6dm9sZW7DoSB2aG9kbmUuICAgICAKCgpgYGB7cn0KY2F0KCJcbktvZWZpY2llbnR5IHMgcm9idXN0bsO9bWkgc21lcm9kYWpuw71taSBjaHliYW1pIChIQzEpIChtb2RlbDIpOlxuIikKcHJpbnQobG10ZXN0Ojpjb2VmdGVzdChtb2RlbDIsIHZjb3YgPSBzYW5kd2ljaDo6dmNvdkhDKG1vZGVsMiwgdHlwZSA9ICJIQzEiKSkpCmBgYAoKVsO9c2xlZGt5IHJlZ3Jlc2llIHMgcm9idXN0bsO9bWkgc21lcm9kYWpuw71taSBjaHliYW1pIChIQzEpIHBvdHZyZHp1asO6IHN0YWJpbGl0dSBhIHNwb8S+YWhsaXZvc8WlIG9kaGFkbnV0w71jaCBrb2VmaWNpZW50b3YuIFByZW1lbm7DoSBJKGxvZygxICsgU1BZX3JldCkpIHpvc3TDoXZhIHZ5c29rbyDFoXRhdGlzdGlja3kgdsO9em5hbW7DoSAocCA8IDAsMDAxKSwgxI1vIG9ww6R0b3ZuZSBwb3R2cmR6dWplIHNpbG7DvSBwb3ppdMOtdm55IHZwbHl2IHRyaG92w6lobyBpbmRleHUgUyZQIDUwMCBuYSB2w71ub3N5IGFrY2llIEFwcGxlLiBQcmVtZW5uw6EgWExFX3JldCBzaSB6YWNob3bDoXZhIMWhdGF0aXN0aWNrw7ogdsO9em5hbW5vc8WlIChwID0gMCwwMDEzKSBhaiBwbyB6b2jEvmFkbmVuw60gcm9idXN0bsO9Y2ggc21lcm9kYWpuw71jaCBjaMO9YiwgxI1vIHBvdHZyZHp1amUgbmVnYXTDrXZueSB2esWlYWggbWVkemkgdsO9bm9zbWkgZW5lcmdldGlja8OpaG8gc2VrdG9yYSBhIGFrY2lvdSBBcHBsZS4gS29uxaF0YW50YSBtb2RlbHUgKEludGVyY2VwdCkgbmllIGplIMWhdGF0aXN0aWNreSB2w716bmFtbsOhLCBhIHByZXRvIG5lbcOhIHByYWt0aWNrw70gdnBseXYgbmEgaW50ZXJwcmV0w6FjaXUgdsO9c2xlZGtvdi4gQ2Vsa292byBtb8W+bm8ga29uxaF0YXRvdmHFpSwgxb5lIGFqIHBvIMO6cHJhdmUgbyBoZXRlcm9za2VkYXN0aWNpdHUgem9zdMOhdmFqw7ogaGxhdm7DqSB6w6F2ZXJ5IG1vZGVsdSBuZXptZW5lbsOpIGEgxaF0YXRpc3RpY2t5IHNpbG7DqS4KICAgIApgYGB7cn0KY2F0KCJcblZJRiAobXVsdGlrb2xpbmVhcml0YSkgKG1vZGVsMik6XG4iKQpwcmludChjYXI6OnZpZihtb2RlbDIpKQpgYGAKCkhvZG5vdHkgZmFrdG9yYSBpbmZsw6FjaWUgcm96cHR5bHUgKFZJRikgc8O6IG7DrXprZSBhIHBvaHlidWrDuiBzYSBva29sbyAxLDEsIMSNbyB6bmFtZW7DoSwgxb5lIG1lZHppIHZ5c3ZldMS+dWrDumNpbWkgcHJlbWVubsO9bWkgSShsb2coMSArIFNQWV9yZXQpKSBhIFhMRV9yZXQgbmVleGlzdHVqZSBtdWx0aWtvbGluZWFyaXRhLiBQcmVtZW5uw6kgdGVkYSBuaWUgc8O6IG5hdnrDoWpvbSBzaWxuZSBrb3JlbG92YW7DqSBhIG1vZGVsIGplIHogdG9odG8gaMS+YWRpc2thIHN0YWJpbG7DvSBhIHNwb8S+YWhsaXbDvS4KICAgIAogICAgCiMgQm9udXMtIENBUE0gCkFrbyBkb3Bsbm9rIGsgdmlhY27DoXNvYm5laiByZWdyZXNpaSBvZGhhZHVqZW1lIENBUE0gKG1hcmtldCBtb2RlbCksIHYga3Rvcm9tIGplIGxvZ2FyaXRtaWNrw6EgdsO9bm9zbm9zxaUgYWtjaWUgQXBwbGUgdnlzdmV0bGVuw6EgdsO9bm9zbm9zxaVvdSB0cmhvdsOpaG8gaW5kZXh1IFMmUCA1MDAgKFNQWSkuCiAgICAKYGBge3J9CiMgPT09PT09IENBUE0gLyBNYXJrZXQgbW9kZWw6IEFBUEwgdnMuIFNQWSA9PT09PT0KIyBBQVBMX3JldCA9IGFscGhhICsgYmV0YSAqIFNQWV9yZXQgKyB1X3QKCmNhcG0gPC0gbG0oQUFQTF9yZXQgfiBTUFlfcmV0LCBkYXRhID0gcmV0X2RmKQpzdW1tYXJ5KGNhcG0pCgojIHJvYnVzdG7DqSBzbWVyb2Rham7DqSBjaHlieSAoSEMxKQpsbXRlc3Q6OmNvZWZ0ZXN0KGNhcG0sIHZjb3YgPSBzYW5kd2ljaDo6dmNvdkhDKGNhcG0sIHR5cGUgPSAiSEMxIikpCgojIDk1ICUgaW50ZXJ2YWwgc3BvxL5haGxpdm9zdGkgcHJlIGJldGEKY29uZmludChjYXBtLCAiU1BZX3JldCIsIGxldmVsID0gMC45NSkKCiMgdcW+aXRvxI1uw6kgdmVsacSNaW55CmFscGhhX2NhcG0gPC0gY29lZihjYXBtKVsxXQpiZXRhX2NhcG0gIDwtIGNvZWYoY2FwbSlbMl0KcjJfY2FwbSAgICA8LSBzdW1tYXJ5KGNhcG0pJHIuc3F1YXJlZApjKGFscGhhX2NhcG0gPSBhbHBoYV9jYXBtLCBiZXRhX2NhcG0gPSBiZXRhX2NhcG0sIHIyID0gcjJfY2FwbSkKCmBgYAogICAgIApWw71zbGVka3kgbW9kZWx1IENBUE0gcG90dnJkenVqw7ogc2lsbsO6IHbDpHpidSBtZWR6aSB2w71ub3NtaSBha2NpZSBBcHBsZSAoQUFQTCkgYSB2w712b2pvbSBjZWxrb3bDqWhvIHRyaHUsIGt0b3LDvSByZXByZXplbnR1amUgaW5kZXggUyZQIDUwMCAoU1BZKS4gT2RoYWRudXTDvSBrb2VmaWNpZW50IM6yPTAsOTUgbmF6bmHEjXVqZSwgxb5lIGFrY2llIEFwcGxlIHJlYWd1asO6IHZlxL5taSBwb2RvYm5lIGFrbyBzYW1vdG7DvSB0cmgg4oCTIGFrIHRyaCBzdMO6cG5lIG8gMSAlLCB2w71ub3MgQXBwbGUgc2EgdiBwcmllbWVyZSB6dsO9xaFpIHByaWJsacW+bmUgbyAwLDk1ICUuIElkZSB0ZWRhIG8gdGl0dWwgcyB0YWttZXIgcHJpZW1lcm7DvW0gdHJob3bDvW0gcml6aWtvbSwgxI1vIGplIHByZSB2ZcS+a8O6IGEgc3RhYmlsbsO6IHRlY2hub2xvZ2lja8O6IHNwb2xvxI1ub3PFpSB0eXBpY2vDqS4KCktvZWZpY2llbnQgzrEgKGludGVyY2VwdCkgbmllIGplIMWhdGF0aXN0aWNreSB2w716bmFtbsO9LCDEjW8gem5hbWVuw6EsIMW+ZSBha2NpZSBBcHBsZSB2IHNsZWRvdmFub20gb2Jkb2LDrSBuZWRvc2Fob3ZhbGkgc3lzdGVtYXRpY2t5IHZ5xaHFoWllIGFuaSBuacW+xaFpZSB2w71ub3N5IG9wcm90aSBvxI1ha8OhdmFuaWFtIG5hIHrDoWtsYWRlIHRyaG92w6lobyB2w712b2phLiBIb2Rub3RhIFJeMj0wLDI5IHVrYXp1amUsIMW+ZSBwcmlibGnFvm5lIDI5ICUgdmFyaWFiaWxpdHkgdsO9bm9zb3YgYWtjaWUgQXBwbGUgbW/Fvm5vIHZ5c3ZldGxpxaUgcG9oeWJvbSB0cmh1LCB6dnnFoW9rIHrDoXZpc8OtIG9kIGZha3Rvcm92IMWhcGVjaWZpY2vDvWNoIHByZSBzYW1vdG7DuiBmaXJtdSBhbGVibyB0ZWNobm9sb2dpY2vDvSBzZWt0b3IuCgpaw6F2ZXJvbSBtb8W+bm8gcG92ZWRhxaUsIMW+ZSBtb2RlbCBDQVBNIHBvdHZyZHp1amUgb8SNYWvDoXZhbmllLCDFvmUgbmFqc2lsbmVqxaFpYSB6w6F2aXNsb3PFpSB2w71ub3NvdiBBcHBsZSBqZSBvZCBjZWxrb3bDqWhvIHRyaG92w6lobyB2w712b2phIChTUFkpLiBUbyB6bmFtZW7DoSwgxb5lIHbDvWtvbm5vc8WlIGFrY2llIGplIMO6emtvIHByZXBvamVuw6EgcyBuw6FsYWRvdSBuYSBmaW5hbsSNbsO9Y2ggdHJob2NoIGEgem1lbmFtaSB2IMWhaXLFoW9tIGVrb25vbWlja29tIHByb3N0cmVkw60u