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

Import údajov

Na začiatok si importujeme údaje. Vybrala som si dáta o cene akcií spoločnosti Apple a ETF’s, ktoré opisujú vývoj trhu zlata (GLD), energetického sektora (XLE) a (SPY), ktoré kopíruje trh S&P 500. Dáta sú za obdobie 1.1.2024-1.1.2025. Údaje sú stiahnuté priamo z internetu, z databázy YahooFinance. Tieto hodnoty predstavujú vývoj cien, na ktorom budeme následne analyzovať výnosnosti a vzájomné vzťahy medzi výnosnosťami daných aktív.

tickers <- c("AAPL", "GLD", "XLE", "SPY")   # Apple, Gold ETF, Energy ETF, S&P500 ETF
getSymbols(tickers, from = "2024-01-01", to = "2025-01-01")
[1] "AAPL" "GLD"  "XLE"  "SPY" 
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)

Deskriptívna štatistika

V nasledujúcej časti vykonávame deskriptívnu štatistiku denných logaritmických výnosov štyroch finančných aktív, aby sme získali základný prehľad o ich rozdelení a volatilite.

summary(ret_df)
    AAPL_ret            GLD_ret              XLE_ret              SPY_ret         
 Min.   :-0.049366   Min.   :-0.0363355   Min.   :-3.276e-02   Min.   :-0.030257  
 1st Qu.:-0.006736   1st Qu.:-0.0042584   1st Qu.:-6.372e-03   1st Qu.:-0.003000  
 Median : 0.001595   Median : 0.0016010   Median : 1.543e-03   Median : 0.001093  
 Mean   : 0.001193   Mean   : 0.0009509   Mean   : 4.302e-05   Mean   : 0.000857  
 3rd Qu.: 0.009288   3rd Qu.: 0.0073401   3rd Qu.: 6.793e-03   3rd Qu.: 0.005756  
 Max.   : 0.070131   Max.   : 0.0221408   Max.   : 3.691e-02   Max.   : 0.024561  

Apple

Rozpätie výnosov sa pohybuje od –4,94 % po +7,01 %, čo z aktív robí najvolatilnejšie. Priemerný denný výnos (0,12 %) aj medián (0,16 %) sú pozitívne a naznačujú mierny rastový trend, zatiaľ čo bežné denné pohyby (IQR) sa pohybujú do ±1 %.

Gold

Výnosy zlata kolíšu medzi –3,63 % a +2,21 %, čo je menej ako pri AAPL. Priemer (0,095 %) aj medián (0,16 %) sú mierne pozitívne. Nižší IQR potvrdzuje stabilnejší charakter zlata ako defenzívneho aktíva.

XLE

Rozpätie od –3,28 % do +3,69 % naznačuje výraznejšiu volatilitu typickú pre energetický sektor. Priemerný výnos je takmer nulový, čo odráža neutrálne dlhodobé smerovanie. Medián (0,15 %) je pozitívny, no variabilita je vyššia ako pri SPY či GLD.

SPY

S&P 500 má najnižšie rozpätie výnosov (–3,02 % až +2,45 %) aj najmenšie medzikvartilové rozpätie, čo potvrdzuje jeho stabilitu. Priemerný denný výnos (0,085 %) aj medián (0,11 %) zostávajú pozitívne a zodpovedajú širokému diverzifikovanému portfóliu.

Testovanie hypotézy

Budeme testovať hypotézu

\(H_0:\) model je správne špecifikovaný (\(\gamma_2 = \gamma_3 = 0\))

oproti

\(H_1:\) model je nesprávne špecifikovaný (\(\gamma_2 \ne 0 \quad \text{alebo} \quad \gamma_3 \ne 0\))

RESET test

Tvar môjho pôvodného regresného modelu bol:

\[AAPL\_ret = \beta_0 + \beta_1 \cdot GLD\_ret + \beta_2 \cdot XLE\_ret + \beta_3 \cdot SPY\_ret + u\]

Tento model opisuje vzťah medzi dennými logaritmickými výnosmi akcie Apple a výnosmi zlata (GLD), energetického sektora (XLE) a indexu S&P 500 (SPY). Koeficienty pri jednotlivých premenných zachytávajú, ako citlivo reaguje výnos Apple na pohyby týchto trhových faktorov.

Rozšírený model použitý v RESET teste má tvar:

\[ AAPL\_ret = \beta_0 + \beta_1 GLD\_ret + \beta_2 XLE\_ret + \beta_3 SPY\_ret + \gamma_2 AAPL\_ret^2 + \gamma_3 AAPL\_ret^3 + u \]

RESET test rozširuje pôvodný regresný model o druhú a tretiu mocninu odhadnutých hodnôt závislej premennej. Tieto dodatočné členy testujú, či pôvodná špecifikácia modelu nezanedbala nelineárne vzťahy alebo interakcie, ktoré by mohli zlepšiť jeho vysvetľovaciu schopnosť. Ak sú koeficienty \(\gamma_2\) a \(\gamma_3\) štatisticky významné, znamená to, že pôvodný model bol nesprávne špecifikovaný.

# Lineárny model:
model <- lm(AAPL_ret ~ GLD_ret + XLE_ret + SPY_ret, data = ret_df)
summary(model)

Call:
lm(formula = AAPL_ret ~ GLD_ret + XLE_ret + SPY_ret, data = ret_df)

Residuals:
      Min        1Q    Median        3Q       Max 
-0.044288 -0.006673 -0.000362  0.005717  0.066928 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept)  0.0003073  0.0007477   0.411   0.6814    
GLD_ret      0.0028525  0.0818840   0.035   0.9722    
XLE_ret     -0.1950403  0.0705065  -2.766   0.0061 ** 
SPY_ret      1.0396059  0.1007431  10.319   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.01173 on 247 degrees of freedom
Multiple R-squared:  0.3122,    Adjusted R-squared:  0.3038 
F-statistic: 37.37 on 3 and 247 DF,  p-value: < 2.2e-16
# RESET test:
library(lmtest)
resettest(model, power = 2:3, type = "regressor")

    RESET test

data:  model
RESET = 1.1337, df1 = 6, df2 = 241, p-value = 0.3433

Interpretácia regresného modelu

Konštanta modelu nie je štatisticky významná, čo znamená, že pri nulových hodnotách všetkých vysvetľujúcich premenných sa očakávanýá výnosnosť akcie Apple výrazne nelíši od nuly.

Premenná GLD_ret nevykazuje štatisticky významný vplyv (p = 0.9722), čo naznačuje, že denné pohyby ceny zlata nie sú systematicky prepojené s výnosnosťami akcie Apple.

Premenná XLE_ret je štatisticky významná na 1% hladine (p = 0.0061) a jej koeficient je negatívny. To znamená, že rast energetického sektora je spojený s poklesom výnosností Apple, čo môže naznačovať sektorové presuny kapitálu alebo cyklické efekty v ekonomike.

Najvýraznejší vplyv má premenná SPY_ret, ktorá je vysoko štatisticky významná (p < 2e-16). Jej koeficient (1.0396) naznačuje, že Apple sa správa veľmi podobne ako širší trh reprezentovaný indexom S&P 500. To je konzistentné s tým, že Apple je veľkou súčasťou tohto trhu a jeho vývoj je s indexom úzko spätý.

Hodnota R² = 0.3122 a Adjusted R² = 0.3038 znamená, že model vysvetľuje približne 31 % variability denných výnosov Apple. V kontexte finančných časových radov, ktoré sú prirodzene veľmi volatilné a ovplyvnené veľkým množstvom náhodných faktorov, ide o bežnú a akceptovateľnú úroveň vysvetlenia.

Model ako celok je štatisticky významný (F-statistic = 37.37; p < 2.2e-16), čo znamená, že vysvetľujúce premenné spoločně významne ovplyvňujú výnosnosť Apple.

Interpretácia RESET testu

Cieľom RESET testu je overiť správnu špecifikáciu modelu, teda posúdiť, či pôvodný model nezanedbáva nelineárne vzťahy alebo iné dôležité funkčné väzby.

Výsledok testu je:

RESET = 1.1337

p-hodnota = 0.3433

Keďže p-hodnota je výrazne vyššia ako bežne používaná hladina významnosti 0.05, nezamietame nulovú hypotézu správnej špecifikácie modelu. To znamená, že nie je dôkaz o tom, že by model trpel závažnou chybnou špecifikáciou a jeho funkčná forma sa javí ako vhodná.

Grafická analýza

Graf Residuals vs. Fitted

Grafická analýza vzťahu medzi vyrovnanými hodnotami náhodnej premennej a rezíduami:

plot(model, which = 1)

Graf Residuals vs. Fitted zobrazuje vzťah medzi vyrovnanými hodnotami modelu a jeho rezíduami. Body sú rozmiestnené relatívne náhodne okolo horizontálnej osi, čo naznačuje, že model nespôsobuje systematické chyby vo vysvetľovaní variácie výnosov Apple. Trendová čiara (červená) je takmer vodorovná, čo podporuje predpoklad, že vzťah medzi premennými je približne lineárny.

Viditeľné sú však jednotlivé odľahlé pozorovania (napr. 2024-05-03, 2024-06-11 či 2024-03-21), ktoré majú väčšie rezíduá než priemer. Tieto body môžu znižovať presnosť modelu, ale nepredstavujú jasný vzor, ktorý by naznačoval porušenie linearity alebo heteroskedasticitu. Celkovo graf nepreukazuje výrazne systematické problémy v špecifikácii modelu.

Grafy C+R

Táto analýza nám umožňuje preskúmať, či je vzťah medzi jednotlivými vysvetľujúcimi premennými a závislou premennou skutočne lineárny. Vychádzame z pôvodného modelu \[AAPL\_ret = \beta_0 + \beta_1 \cdot GLD\_ret + \beta_2 \cdot XLE\_ret + \beta_3 \cdot SPY\_ret + u\] Po odhadnutí tohto modelu vykresľujeme component + residual plots (C+R grafy), v ktorých sa na zvislej osi nachádza výraz \[ \hat{\beta}_i x_i + e \] a na vodorovnej osi hodnoty premenných x_i. Tieto grafy slúžia na identifikáciu prípadných nelineárnych vzťahov medzi závislou premennou a jednotlivými regresormi.

car::crPlots(model)

Gold

Krivka (ružová) je takmer vodorovná a drží sa veľmi blízko priamky lineárneho vzťahu (modrá čiara). Body sú rozptýlené náhodne a bez výrazného zakrivenia. To naznačuje, že medzi výnosmi Apple a cenou zlata neexistuje nelineárny vzťah a lineárna špecifikácia je postačujúca.

XLE

Pri tejto premennej sa nachádza najmiernejší náznak zakrivenia – krivka má jemný konkávny tvar. Tento odklon však nie je výrazný a je spôsobený najmä väčšou variabilitou rezíduí pri vyšších hodnotách XLE_ret. Aj napriek tomu krivka neukazuje na potrebu transformácie, keďže celkový priebeh zostáva z veľkej časti lineárny.

SPY

V tomto prípade pozorujeme jednoznačne najsilnejší lineárny vzťah. Obidve krivky sa nachádzajú takmer presne na sebe a majú stúpajúci tvar, čo potvrdzuje silnú lineárnu väzbu medzi výnosmi Apple a výnosmi širokého trhu reprezentovaného indexom S&P 500. Neexistuje dôvod na uvažovanie o transformácii tejto premennej.

C+R grafy nepreukazujú prítomnosť výraznej nelinearity v prípade žiadnej zo sledovaných premenných. Mierny náznak zakrivenia pri XLE_ret nie je dostatočne výrazný na to, aby odôvodnil transformáciu. Pre naše dáta je preto lineárna špecifikácia modelu adekvátna a transformácie premenných nie sú potrebné.

Nelineárna špecifikácia

Hoci v našom prípade component + residual grafy ani RESET test nenaznačili prítomnosť výrazných nelineárnych vzťahov medzi vysvetľujúcimi premennými a výnosmi akcie Apple, pre účely pochopenia metodiky a jej praktického precvičenia sa v nasledujúcej časti pokúsime aplikovať rovnaké postupy, aké boli uvedené vo vzorovom príklade.

Cieľom teda nie je korigovať skutočnú chybu v špecifikácii modelu (keďže základný lineárny model vyhovuje), ale demonštrovať, ako možno pri potrebe nelineárne upraviť pôvodnú regresnú rovnicu, zavádzať kvadratické členy, dummy premenné či lineárne lomené funkcie a porovnávať modely pomocou ANOVA a RESET testov.

V našom prípade by rozšírený model mohol mať tvar: \[ AAPL\_ret = \beta_0 + \beta_1 GLD\_ret + \beta_2 XLE\_ret + \beta_3 SPY\_ret + \gamma_1 GLD\_ret^{2} + \gamma_2 XLE\_ret^{2} + \gamma_3 SPY\_ret^{2} + u \] Tento tvar modelu sme zvolili preto, aby sme umožnili zachytiť prípadné nelineárne vzťahy medzi výnosom akcie Apple a jednotlivými vysvetľujúcimi premennými. Zaradenie kvadratických členov rozširuje pôvodnú rovnicu o možnosť, že účinok premenných sa môže pri rôznych úrovniach ich hodnôt meniť a nemusí mať striktne lineárny priebeh. Vďaka tomu môžeme preskúmať, či takáto úprava vedie k zlepšeniu štatistických vlastností modelu.

Porovnanie základného a modifikovaného modelu

V nadväznosti na uvedenú nelineárnu špecifikáciu sme rozšírili pôvodný lineárny model o kvadratické členy všetkých vysvetľujúcich premenných. Takto upravený model umožňuje preskúmať, či výkon regresie zlepší doplnenie nelineárnych efektov.

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

model_kvadr <- lm(AAPL_ret ~ GLD_ret + XLE_ret + SPY_ret +
                     I(GLD_ret^2) + I(XLE_ret^2) + I(SPY_ret^2),
                   data = ret_df)

summary(model_kvadr)

Call:
lm(formula = AAPL_ret ~ GLD_ret + XLE_ret + SPY_ret + I(GLD_ret^2) + 
    I(XLE_ret^2) + I(SPY_ret^2), data = ret_df)

Residuals:
      Min        1Q    Median        3Q       Max 
-0.045105 -0.007012 -0.000015  0.005256  0.065866 

Coefficients:
               Estimate Std. Error t value Pr(>|t|)    
(Intercept)   0.0015526  0.0009993   1.554  0.12155    
GLD_ret      -0.0289654  0.0848839  -0.341  0.73322    
XLE_ret      -0.2145706  0.0717309  -2.991  0.00306 ** 
SPY_ret       1.0150168  0.1018409   9.967  < 2e-16 ***
I(GLD_ret^2) -0.6260170  5.1560194  -0.121  0.90346    
I(XLE_ret^2) -4.8924614  4.1630691  -1.175  0.24106    
I(SPY_ret^2) -8.2685599  6.8904579  -1.200  0.23130    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.0117 on 244 degrees of freedom
Multiple R-squared:  0.3248,    Adjusted R-squared:  0.3082 
F-statistic: 19.56 on 6 and 244 DF,  p-value: < 2.2e-16
anova(model_zakladny, model_kvadr)
Analysis of Variance Table

Model 1: AAPL_ret ~ GLD_ret + XLE_ret + SPY_ret
Model 2: AAPL_ret ~ GLD_ret + XLE_ret + SPY_ret + I(GLD_ret^2) + I(XLE_ret^2) + 
    I(SPY_ret^2)
  Res.Df      RSS Df  Sum of Sq      F Pr(>F)
1    247 0.034014                            
2    244 0.033390  3 0.00062431 1.5207 0.2097
resettest(model_kvadr)

    RESET test

data:  model_kvadr
RESET = 0.054828, df1 = 2, df2 = 242, p-value = 0.9467

Po rozšírení základného modelu o kvadratické členy sa ukázalo, že žiadny z nich nie je štatisticky významný. Lineárne koeficienty si pritom zachovali rovnaké vlastnosti ako v pôvodnom modeli – najvyššiu významnosť má trhový faktor, kým ostatné premenné sa zásadne nemenia.

Upravený koeficient determinácie sa po pridaní kvadratických členov zvýšil len minimálne (zhruba o 0.004), čo predstavuje veľmi malý posun. ANOVA test naznačil, že rozdiel medzi modelmi nie je štatisticky významný, takže rozšírenie neprinieslo citeľné zlepšenie.

RESET test modifikovaného modelu má vysokú p-hodnotu, čo opäť potvrdzuje, že model neobsahuje chybnú špecifikáciu. Kvadratické členy teda nezachytili žiadnu dodatočnú nelinearitu, ktorá by bola z hľadiska týchto dát relevantná.

Transformácia pomocou dummy premennej a lineárnej lomenej funkcie

V ďalšom kroku sme sa pokúsili zachytiť prípadnú zmenu správania modelu pri odlišných podmienkach na trhu. Na to sme zaviedli jednoduchú dummy premennú, ktorá odlišuje dni s výraznejším pohybom trhu od bežných dní. Táto premenná nám umožňuje testovať, či sa vývoj závislej premennej líši medzi dvoma skupinami pozorovaní – buď posunom v autonómnom členovi, alebo zmenou sklonu pri jednej z vysvetľujúcich premenných. Odhadli sme preto dva modely: jeden s možným posunom celej rovnice a druhý s možnou zmenou sklonu. Nasledujúce výsledky ukazujú, či tieto úpravy prinášajú zlepšenie oproti pôvodnému lineárnemu modelu.

Model so zlomom v autonómnom člene

Tento model umožňuje, aby sa celý vzťah posunul nahor alebo nadol v dňoch, keď dummy premenná nadobúda hodnotu 1. Ide teda o test, či sa úroveň závislej premennej líši medzi dvoma skupinami pozorovaní.

\[ AAPL\_ret = \beta_0 + \beta_D DUM + \beta_1 GLD\_ret + \beta_2 XLE\_ret + \beta_3 SPY\_ret + u \]

Model so zlomom v sklone

V tomto prípade sa skúma, či je sklon regresnej priamky rozdielny v závislosti od hodnoty dummy premennej. Koeficient pri interakčnom členovi určuje, či sa reakcia závislej premennej na danej vysvetľujúcej premennnej mení medzi dvoma sledovanými stavmi. \[ AAPL\_ret = \beta_0 + \beta_1 GLD\_ret + \beta_2 XLE\_ret + \beta_3 SPY\_ret + \beta_{D} (DUM \cdot SPY\_ret) + u \]

Príklad zavedenia dummy premennej podľa veľkosti trhového pohybu (napr. SPY_ret väčší ako 1 %):

ret_df$DUM <- ifelse(ret_df$SPY_ret > 0.01, 1, 0)

modelD_auto <- lm(AAPL_ret ~ DUM + GLD_ret + XLE_ret + SPY_ret,
                  data = ret_df)
summary(modelD_auto)

Call:
lm(formula = AAPL_ret ~ DUM + GLD_ret + XLE_ret + SPY_ret, data = ret_df)

Residuals:
      Min        1Q    Median        3Q       Max 
-0.044874 -0.006895  0.000012  0.005504  0.066427 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept)  0.0006296  0.0007856   0.801  0.42370    
DUM         -0.0038638  0.0029317  -1.318  0.18874    
GLD_ret     -0.0045309  0.0819538  -0.055  0.95596    
XLE_ret     -0.1971241  0.0704193  -2.799  0.00553 ** 
SPY_ret      1.1209476  0.1180172   9.498  < 2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.01172 on 246 degrees of freedom
Multiple R-squared:  0.317, Adjusted R-squared:  0.3059 
F-statistic: 28.54 on 4 and 246 DF,  p-value: < 2.2e-16
modelD_sklon <- lm(AAPL_ret ~ GLD_ret + XLE_ret +
                     SPY_ret + I(DUM * SPY_ret),
                   data = ret_df)
summary(modelD_sklon)

Call:
lm(formula = AAPL_ret ~ GLD_ret + XLE_ret + SPY_ret + I(DUM * 
    SPY_ret), data = ret_df)

Residuals:
      Min        1Q    Median        3Q       Max 
-0.044954 -0.006976  0.000349  0.005471  0.066416 

Coefficients:
                   Estimate Std. Error t value Pr(>|t|)    
(Intercept)       0.0006418  0.0007833   0.819  0.41336    
GLD_ret          -0.0106854  0.0822896  -0.130  0.89679    
XLE_ret          -0.1926553  0.0703886  -2.737  0.00665 ** 
SPY_ret           1.1314720  0.1199475   9.433  < 2e-16 ***
I(DUM * SPY_ret) -0.2954226  0.2103348  -1.405  0.16142    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.01171 on 246 degrees of freedom
Multiple R-squared:  0.3177,    Adjusted R-squared:  0.3066 
F-statistic: 28.63 on 4 and 246 DF,  p-value: < 2.2e-16
anova(model_zakladny, modelD_sklon)
Analysis of Variance Table

Model 1: AAPL_ret ~ GLD_ret + XLE_ret + SPY_ret
Model 2: AAPL_ret ~ GLD_ret + XLE_ret + SPY_ret + I(DUM * SPY_ret)
  Res.Df      RSS Df  Sum of Sq      F Pr(>F)
1    247 0.034014                            
2    246 0.033743  1 0.00027059 1.9727 0.1614
resettest(modelD_sklon)

    RESET test

data:  modelD_sklon
RESET = 0.73388, df1 = 2, df2 = 244, p-value = 0.4811

Interpretácia modelu so zlomom v autonómnom člene

Po doplnení dummy premennej (DUM), ktorá oddeľuje dni s vyšším pohybom trhu od ostatných, sa ukázalo, že tento dodatočný člen nie je štatisticky významný. Jeho koeficient má pomerne vysokú p-hodnotu, takže nemožno tvrdiť, že by sa vývoj závislej premennej významne líšil medzi dvoma skupinami pozorovaní. Ostatné premenné si zachovali správanie podobné pôvodnému modelu – najvýraznejší vplyv má trhový faktor, kým ostatné zostávajú slabšie alebo nevýznamné. Hodnota upraveného koeficientu determinácie sa takmer nezmenila, čo naznačuje, že posun celej rovnice nepriniesol zlepšenie.

Interpretácia modelu so zlomom v sklone

V druhom kroku sme skúmali, či sa môže meniť sklon regresnej priamky v závislosti od dummy premennej. Interakčný člen, ktorý by mal zachytávať rozdielne správanie v dňoch s vyšším trhovým pohybom, však nie je štatisticky významný. Samotné koeficienty základných premenných sa oproti prvému modelu takmer nezmenili a vysvetľovacia schopnosť modelu sa zvýšila len minimálne.

ANOVA porovnanie základného a rozšíreného modelu opäť nepreukázalo štatisticky významné zlepšenie. To znamená, že doplnenie tejto interakcie modelu nepomohlo zachytiť žiadny dôležitý dodatočný vzťah.

RESET test

RESET test pre rozšírený model má vysokú p-hodnotu. Znamená to, že model neobsahuje chybnú špecifikáciu a doplnenie zlomu v sklone nie je potrebné. Výsledok je konzistentný s predchádzajúcimi zisteniami – lineárny model v našom prípade postačuje.

LS0tCnRpdGxlOiAiU2llZG1hIMO6bG9oYSIKYXV0aG9yOiAnIE1pcm9zbGF2YSBNZWR2ZWNrw6EgIDxicj4nCmRhdGU6ICJTZXB0ZW1iZXIgMjAyNSIKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6CiAgICB0b2M6IHRydWUKICAgIHRvY19mbG9hdDogdHJ1ZQogICAgdGhlbWU6IHVuaXRlZAogICAgaGlnaGxpZ2h0OiB0YW5nbwogIGh0bWxfZG9jdW1lbnQ6CiAgICB0b2M6IHRydWUKICAgIGRmX3ByaW50OiBwYWdlZAplZGl0b3Jfb3B0aW9uczoKICBtYXJrZG93bjoKICAgIHdyYXA6IDcyCi0tLQoKYGBge3J9CmtuaXRyOjpvcHRzX2NodW5rJHNldCgKICAgIGVjaG8gPSBUUlVFLAogICAgbWVzc2FnZSA9IEZBTFNFLAogICAgd2FybmluZyA9IEZBTFNFCikKYGBgCgo8c3R5bGU+Ci8qIENlbGtvdsOpIHBvemFkaWUgKi8KYm9keSB7CiAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDEzNWRlZywgI2YzZThmZiwgI2U5ZDVmZiwgI2VkZTlmZSk7CiAgZm9udC1mYW1pbHk6ICdIZWx2ZXRpY2EgTmV1ZScsIEhlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWY7CiAgY29sb3I6ICMyZTA4NTQ7CiAgbGluZS1oZWlnaHQ6IDEuNzsKICBwYWRkaW5nOiAyNXB4Owp9CgovKiBIbGF2bsOpIG5hZHBpc3kgKi8KaDEsIGgyLCBoMyB7CiAgZm9udC1mYW1pbHk6ICdIZWx2ZXRpY2EgTmV1ZScsIEhlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWY7CiAgbGV0dGVyLXNwYWNpbmc6IDAuNXB4OwogIGNvbG9yOiAjNGIwMDgyOyAvKiB0bWF2b2ZpYWxvdsOhICovCiAgdGV4dC1zaGFkb3c6IDBweCAxcHggMnB4ICNlOWQ1ZmY7Cn0KPC9zdHlsZT4KCmBgYHtyfQpsaWJyYXJ5KHpvbykKbGlicmFyeSh0c2VyaWVzKQpsaWJyYXJ5KGxtdGVzdCkKbGlicmFyeShzYW5kd2ljaCkKbGlicmFyeShjYXIpCnJtKGxpc3Q9bHMoKSkKbGlicmFyeShxdWFudG1vZCkKYGBgCgojIyBJbXBvcnQgw7pkYWpvdiAgICAgIApOYSB6YcSNaWF0b2sgc2kgaW1wb3J0dWplbWUgw7pkYWplLiBWeWJyYWxhIHNvbSBzaSBkw6F0YSBvIGNlbmUgYWtjacOtIHNwb2xvxI1ub3N0aSBBcHBsZSBhIEVURidzLCBrdG9yw6kgb3Bpc3Vqw7ogdsO9dm9qIHRyaHUgemxhdGEgKEdMRCksIGVuZXJnZXRpY2vDqWhvIHNla3RvcmEgKFhMRSkgYSAoU1BZKSwga3RvcsOpIGtvcMOtcnVqZSB0cmggUyZQIDUwMC4gRMOhdGEgc8O6IHphIG9iZG9iaWUgMS4xLjIwMjQtMS4xLjIwMjUuIMOaZGFqZSBzw7ogc3RpYWhudXTDqSBwcmlhbW8geiBpbnRlcm5ldHUsIHogZGF0YWLDoXp5IFlhaG9vRmluYW5jZS4gVGlldG8gaG9kbm90eSBwcmVkc3RhdnVqw7ogdsO9dm9qIGNpZW4sIG5hIGt0b3JvbSBidWRlbWUgbsOhc2xlZG5lIGFuYWx5em92YcWlIHbDvW5vc25vc3RpIGEgdnrDoWpvbW7DqSB2esWlYWh5IG1lZHppIHbDvW5vc25vc8WlYW1pIGRhbsO9Y2ggYWt0w612LgpgYGB7cn0KdGlja2VycyA8LSBjKCJBQVBMIiwgIkdMRCIsICJYTEUiLCAiU1BZIikgICAjIEFwcGxlLCBHb2xkIEVURiwgRW5lcmd5IEVURiwgUyZQNTAwIEVURgpnZXRTeW1ib2xzKHRpY2tlcnMsIGZyb20gPSAiMjAyNC0wMS0wMSIsIHRvID0gIjIwMjUtMDEtMDEiKQoKZGF0YSA8LSBtZXJnZShDbChBQVBMKSwgQ2woR0xEKSwgQ2woWExFKSwgQ2woU1BZKSkKY29sbmFtZXMoZGF0YSkgPC0gdGlja2VycwoKcmV0IDwtIG5hLm9taXQoZGlmZihsb2coZGF0YSkpKQpjb2xuYW1lcyhyZXQpIDwtIHBhc3RlMChjb2xuYW1lcyhyZXQpLCAiX3JldCIpCgpyZXRfZGYgPC0gbmEub21pdChhcy5kYXRhLmZyYW1lKHJldCkpCmhlYWQocmV0X2RmKQpgYGAKIyMjIERlc2tyaXB0w612bmEgxaF0YXRpc3Rpa2EgICAgIApWIG5hc2xlZHVqw7pjZWogxI1hc3RpIHZ5a29uw6F2YW1lIGRlc2tyaXB0w612bnUgxaF0YXRpc3Rpa3UgZGVubsO9Y2ggbG9nYXJpdG1pY2vDvWNoIHbDvW5vc292IMWhdHlyb2NoIGZpbmFuxI1uw71jaCBha3TDrXYsIGFieSBzbWUgesOtc2thbGkgesOha2xhZG7DvSBwcmVoxL5hZCBvIGljaCByb3pkZWxlbsOtIGEgdm9sYXRpbGl0ZS4KICAgICAKYGBge3J9CnN1bW1hcnkocmV0X2RmKQpgYGAKIyMjICpBcHBsZSogICAgClJvenDDpHRpZSB2w71ub3NvdiBzYSBwb2h5YnVqZSBvZCDigJM0LDk0ICUgcG8gKzcsMDEgJSwgxI1vIHogYWt0w612IHJvYsOtIG5hanZvbGF0aWxuZWrFoWllLiBQcmllbWVybsO9IGRlbm7DvSB2w71ub3MgKDAsMTIgJSkgYWogbWVkacOhbiAoMCwxNiAlKSBzw7ogcG96aXTDrXZuZSBhIG5hem5hxI11asO6IG1pZXJueSByYXN0b3bDvSB0cmVuZCwgemF0aWHEviDEjW8gYmXFvm7DqSBkZW5uw6kgcG9oeWJ5IChJUVIpIHNhIHBvaHlidWrDuiBkbyDCsTEgJS4gIAoKIyMjICpHb2xkKiAgICAgClbDvW5vc3kgemxhdGEga29sw63FoXUgbWVkemkg4oCTMyw2MyAlIGEgKzIsMjEgJSwgxI1vIGplIG1lbmVqIGFrbyBwcmkgQUFQTC4gUHJpZW1lciAoMCwwOTUgJSkgYWogbWVkacOhbiAoMCwxNiAlKSBzw7ogbWllcm5lIHBveml0w612bmUuIE5pxb7FocOtIElRUiBwb3R2cmR6dWplIHN0YWJpbG5lasWhw60gY2hhcmFrdGVyIHpsYXRhIGFrbyBkZWZlbnrDrXZuZWhvIGFrdMOtdmEuICAgICAKCiMjIyAqWExFKiAgICAgClJvenDDpHRpZSBvZCDigJMzLDI4ICUgZG8gKzMsNjkgJSBuYXpuYcSNdWplIHbDvXJhem5lasWhaXUgdm9sYXRpbGl0dSB0eXBpY2vDuiBwcmUgZW5lcmdldGlja8O9IHNla3Rvci4gUHJpZW1lcm7DvSB2w71ub3MgamUgdGFrbWVyIG51bG92w70sIMSNbyBvZHLDocW+YSBuZXV0csOhbG5lIGRsaG9kb2LDqSBzbWVyb3ZhbmllLiBNZWRpw6FuICgwLDE1ICUpIGplIHBveml0w612bnksIG5vIHZhcmlhYmlsaXRhIGplIHZ5xaHFoWlhIGFrbyBwcmkgU1BZIMSNaSBHTEQuICAgCgojIyMgKlNQWSogICAgIApTJlAgNTAwIG3DoSBuYWpuacW+xaFpZSByb3pww6R0aWUgdsO9bm9zb3YgKOKAkzMsMDIgJSBhxb4gKzIsNDUgJSkgYWogbmFqbWVuxaFpZSBtZWR6aWt2YXJ0aWxvdsOpIHJvenDDpHRpZSwgxI1vIHBvdHZyZHp1amUgamVobyBzdGFiaWxpdHUuIFByaWVtZXJuw70gZGVubsO9IHbDvW5vcyAoMCwwODUgJSkgYWogbWVkacOhbiAoMCwxMSAlKSB6b3N0w6F2YWrDuiBwb3ppdMOtdm5lIGEgem9kcG92ZWRhasO6IMWhaXJva8OpbXUgZGl2ZXJ6aWZpa292YW7DqW11IHBvcnRmw7NsaXUuICAgICAKCiMjIFRlc3RvdmFuaWUgaHlwb3TDqXp5ICAgICAKQnVkZW1lIHRlc3RvdmHFpSBoeXBvdMOpenUgCgokSF8wOiQgbW9kZWwgamUgc3Byw6F2bmUgxaFwZWNpZmlrb3ZhbsO9ICgkXGdhbW1hXzIgPSBcZ2FtbWFfMyA9IDAkKQoKb3Byb3RpCgokSF8xOiQgbW9kZWwgamUgbmVzcHLDoXZuZSDFoXBlY2lmaWtvdmFuw70gKCRcZ2FtbWFfMiBcbmUgMCAgXHF1YWQgXHRleHR7YWxlYm99ICBccXVhZCBcZ2FtbWFfMyBcbmUgMCQpCgojIyBSRVNFVCB0ZXN0IApUdmFyIG3DtGpobyBww7R2b2Ruw6lobyByZWdyZXNuw6lobyBtb2RlbHUgYm9sOgoKXFtBQVBMXF9yZXQgPSBcYmV0YV8wICsgXGJldGFfMSBcY2RvdCBHTERcX3JldCArIFxiZXRhXzIgXGNkb3QgWExFXF9yZXQgKyBcYmV0YV8zIFxjZG90IFNQWVxfcmV0ICsgdVxdCgpUZW50byBtb2RlbCBvcGlzdWplIHZ6xaVhaCBtZWR6aSBkZW5uw71taSBsb2dhcml0bWlja8O9bWkgdsO9bm9zbWkgYWtjaWUgQXBwbGUgYSB2w71ub3NtaSB6bGF0YSAoR0xEKSwgZW5lcmdldGlja8OpaG8gc2VrdG9yYSAoWExFKSBhIGluZGV4dSBTJlAgNTAwIChTUFkpLiBLb2VmaWNpZW50eSBwcmkgamVkbm90bGl2w71jaCBwcmVtZW5uw71jaCB6YWNoeXTDoXZhasO6LCBha28gY2l0bGl2byByZWFndWplIHbDvW5vcyBBcHBsZSBuYSBwb2h5YnkgdMO9Y2h0byB0cmhvdsO9Y2ggZmFrdG9yb3YuICAgIAoKUm96xaHDrXJlbsO9IG1vZGVsIHBvdcW+aXTDvSB2IFJFU0VUIHRlc3RlIG3DoSB0dmFyOgoKJCQKQUFQTFxfcmV0ID0gXGJldGFfMCArIFxiZXRhXzEgR0xEXF9yZXQgKyBcYmV0YV8yIFhMRVxfcmV0ICsgXGJldGFfMyBTUFlcX3JldCArIFxnYW1tYV8yIEFBUExcX3JldF4yICsgXGdhbW1hXzMgQUFQTFxfcmV0XjMgKyB1CiQkCgoKICAgIAoKUkVTRVQgdGVzdCByb3rFoWlydWplIHDDtHZvZG7DvSByZWdyZXNuw70gbW9kZWwgbyBkcnVow7ogYSB0cmV0aXUgbW9jbmludSBvZGhhZG51dMO9Y2ggaG9kbsO0dCB6w6F2aXNsZWogcHJlbWVubmVqLiBUaWV0byBkb2RhdG/EjW7DqSDEjWxlbnkgdGVzdHVqw7osIMSNaSBww7R2b2Ruw6EgxaFwZWNpZmlrw6FjaWEgbW9kZWx1IG5lemFuZWRiYWxhIG5lbGluZcOhcm5lIHZ6xaVhaHkgYWxlYm8gaW50ZXJha2NpZSwga3RvcsOpIGJ5IG1vaGxpIHpsZXDFoWnFpSBqZWhvIHZ5c3ZldMS+b3ZhY2l1IHNjaG9wbm9zxaUuIEFrIHPDuiBrb2VmaWNpZW50eSBcKFxnYW1tYV8yXCkgYSBcKFxnYW1tYV8zXCkgxaF0YXRpc3RpY2t5IHbDvXpuYW1uw6ksIHpuYW1lbsOhIHRvLCDFvmUgcMO0dm9kbsO9IG1vZGVsIGJvbCBuZXNwcsOhdm5lIMWhcGVjaWZpa292YW7DvS4gICAgIAoKYGBge3J9CiMgTGluZcOhcm55IG1vZGVsOgptb2RlbCA8LSBsbShBQVBMX3JldCB+IEdMRF9yZXQgKyBYTEVfcmV0ICsgU1BZX3JldCwgZGF0YSA9IHJldF9kZikKc3VtbWFyeShtb2RlbCkKCiMgUkVTRVQgdGVzdDoKbGlicmFyeShsbXRlc3QpCnJlc2V0dGVzdChtb2RlbCwgcG93ZXIgPSAyOjMsIHR5cGUgPSAicmVncmVzc29yIikKCmBgYAojIyMgKkludGVycHJldMOhY2lhIHJlZ3Jlc27DqWhvIG1vZGVsdSogICAgCgpLb27FoXRhbnRhIG1vZGVsdSBuaWUgamUgxaF0YXRpc3RpY2t5IHbDvXpuYW1uw6EsIMSNbyB6bmFtZW7DoSwgxb5lIHByaSBudWxvdsO9Y2ggaG9kbm90w6FjaCB2xaFldGvDvWNoIHZ5c3ZldMS+dWrDumNpY2ggcHJlbWVubsO9Y2ggc2Egb8SNYWvDoXZhbsO9w6EgdsO9bm9zbm9zxaUgYWtjaWUgQXBwbGUgdsO9cmF6bmUgbmVsw63FoWkgb2QgbnVseS4KClByZW1lbm7DoSBHTERfcmV0IG5ldnlrYXp1amUgxaF0YXRpc3RpY2t5IHbDvXpuYW1uw70gdnBseXYgKHAgPSAwLjk3MjIpLCDEjW8gbmF6bmHEjXVqZSwgxb5lIGRlbm7DqSBwb2h5YnkgY2VueSB6bGF0YSBuaWUgc8O6IHN5c3RlbWF0aWNreSBwcmVwb2plbsOpIHMgdsO9bm9zbm9zxaVhbWkgYWtjaWUgQXBwbGUuCgpQcmVtZW5uw6EgWExFX3JldCBqZSDFoXRhdGlzdGlja3kgdsO9em5hbW7DoSBuYSAxJSBobGFkaW5lIChwID0gMC4wMDYxKSBhIGplaiBrb2VmaWNpZW50IGplIG5lZ2F0w612bnkuIFRvIHpuYW1lbsOhLCDFvmUgcmFzdCBlbmVyZ2V0aWNrw6lobyBzZWt0b3JhIGplIHNwb2plbsO9IHMgcG9rbGVzb20gdsO9bm9zbm9zdMOtIEFwcGxlLCDEjW8gbcO0xb5lIG5hem5hxI1vdmHFpSBzZWt0b3JvdsOpIHByZXN1bnkga2FwaXTDoWx1IGFsZWJvIGN5a2xpY2vDqSBlZmVrdHkgdiBla29ub21pa2UuCgpOYWp2w71yYXpuZWrFocOtIHZwbHl2IG3DoSBwcmVtZW5uw6EgU1BZX3JldCwga3RvcsOhIGplIHZ5c29rbyDFoXRhdGlzdGlja3kgdsO9em5hbW7DoSAocCA8IDJlLTE2KS4gSmVqIGtvZWZpY2llbnQgKDEuMDM5NikgbmF6bmHEjXVqZSwgxb5lIEFwcGxlIHNhIHNwcsOhdmEgdmXEvm1pIHBvZG9ibmUgYWtvIMWhaXLFocOtIHRyaCByZXByZXplbnRvdmFuw70gaW5kZXhvbSBTJlAgNTAwLiBUbyBqZSBrb256aXN0ZW50bsOpIHMgdMO9bSwgxb5lIEFwcGxlIGplIHZlxL5rb3Ugc8O6xI1hc8Wlb3UgdG9odG8gdHJodSBhIGplaG8gdsO9dm9qIGplIHMgaW5kZXhvbSDDunprbyBzcMOkdMO9LgoKSG9kbm90YSBSwrIgPSAwLjMxMjIgYSBBZGp1c3RlZCBSwrIgPSAwLjMwMzggem5hbWVuw6EsIMW+ZSBtb2RlbCB2eXN2ZXTEvnVqZSBwcmlibGnFvm5lIDMxICUgdmFyaWFiaWxpdHkgZGVubsO9Y2ggdsO9bm9zb3YgQXBwbGUuIFYga29udGV4dGUgZmluYW7EjW7DvWNoIMSNYXNvdsO9Y2ggcmFkb3YsIGt0b3LDqSBzw7ogcHJpcm9kemVuZSB2ZcS+bWkgdm9sYXRpbG7DqSBhIG92cGx5dm5lbsOpIHZlxL5rw71tIG1ub8W+c3R2b20gbsOhaG9kbsO9Y2ggZmFrdG9yb3YsIGlkZSBvIGJlxb5uw7ogYSBha2NlcHRvdmF0ZcS+bsO6IMO6cm92ZcWIIHZ5c3ZldGxlbmlhLgoKTW9kZWwgYWtvIGNlbG9rIGplIMWhdGF0aXN0aWNreSB2w716bmFtbsO9IChGLXN0YXRpc3RpYyA9IDM3LjM3OyBwIDwgMi4yZS0xNiksIMSNbyB6bmFtZW7DoSwgxb5lIHZ5c3ZldMS+dWrDumNlIHByZW1lbm7DqSBzcG9sb8SNbsSbIHbDvXpuYW1uZSBvdnBseXbFiHVqw7ogdsO9bm9zbm9zxaUgQXBwbGUuCiAgICAgCiMjIyAqSW50ZXJwcmV0w6FjaWEgUkVTRVQgdGVzdHUqICAgICAKQ2llxL5vbSBSRVNFVCB0ZXN0dSBqZSBvdmVyacWlIHNwcsOhdm51IMWhcGVjaWZpa8OhY2l1IG1vZGVsdSwgdGVkYSBwb3PDumRpxaUsIMSNaSBww7R2b2Ruw70gbW9kZWwgbmV6YW5lZGLDoXZhIG5lbGluZcOhcm5lIHZ6xaVhaHkgYWxlYm8gaW7DqSBkw7RsZcW+aXTDqSBmdW5rxI1uw6kgdsOkemJ5LgoKVsO9c2xlZG9rIHRlc3R1IGplOgoKUkVTRVQgPSAxLjEzMzcKCnAtaG9kbm90YSA9IDAuMzQzMwoKS2XEj8W+ZSBwLWhvZG5vdGEgamUgdsO9cmF6bmUgdnnFocWhaWEgYWtvIGJlxb5uZSBwb3XFvsOtdmFuw6EgaGxhZGluYSB2w716bmFtbm9zdGkgMC4wNSwgbmV6YW1pZXRhbWUgbnVsb3bDuiBoeXBvdMOpenUgc3Byw6F2bmVqIMWhcGVjaWZpa8OhY2llIG1vZGVsdS4gVG8gem5hbWVuw6EsIMW+ZSBuaWUgamUgZMO0a2F6IG8gdG9tLCDFvmUgYnkgbW9kZWwgdHJwZWwgesOhdmHFvm5vdSBjaHlibm91IMWhcGVjaWZpa8OhY2lvdSBhIGplaG8gZnVua8SNbsOhIGZvcm1hIHNhIGphdsOtIGFrbyB2aG9kbsOhLgoKIyMgR3JhZmlja8OhIGFuYWzDvXphCgojIyMgR3JhZiAqUmVzaWR1YWxzIHZzLiBGaXR0ZWQqCgpHcmFmaWNrw6EgYW5hbMO9emEgdnrFpWFodSBtZWR6aSB2eXJvdm5hbsO9bWkgaG9kbm90YW1pIG7DoWhvZG5laiBwcmVtZW5uZWogYSByZXrDrWR1YW1pOgoKYGBge3J9CnBsb3QobW9kZWwsIHdoaWNoID0gMSkKYGBgCkdyYWYgUmVzaWR1YWxzIHZzLiBGaXR0ZWQgem9icmF6dWplIHZ6xaVhaCBtZWR6aSB2eXJvdm5hbsO9bWkgaG9kbm90YW1pIG1vZGVsdSBhIGplaG8gcmV6w61kdWFtaS4gQm9keSBzw7ogcm96bWllc3RuZW7DqSByZWxhdMOtdm5lIG7DoWhvZG5lIG9rb2xvIGhvcml6b250w6FsbmVqIG9zaSwgxI1vIG5hem5hxI11amUsIMW+ZSBtb2RlbCBuZXNww7Rzb2J1amUgc3lzdGVtYXRpY2vDqSBjaHlieSB2byB2eXN2ZXTEvm92YW7DrSB2YXJpw6FjaWUgdsO9bm9zb3YgQXBwbGUuIFRyZW5kb3bDoSDEjWlhcmEgKMSNZXJ2ZW7DoSkgamUgdGFrbWVyIHZvZG9yb3Zuw6EsIMSNbyBwb2Rwb3J1amUgcHJlZHBva2xhZCwgxb5lIHZ6xaVhaCBtZWR6aSBwcmVtZW5uw71taSBqZSBwcmlibGnFvm5lIGxpbmXDoXJueS4KClZpZGl0ZcS+bsOpIHPDuiB2xaFhayBqZWRub3RsaXbDqSBvZMS+YWhsw6kgcG96b3JvdmFuaWEgKG5hcHIuIDIwMjQtMDUtMDMsIDIwMjQtMDYtMTEgxI1pIDIwMjQtMDMtMjEpLCBrdG9yw6kgbWFqw7ogdsOkxI3FoWllIHJlesOtZHXDoSBuZcW+IHByaWVtZXIuIFRpZXRvIGJvZHkgbcO0xb51IHpuacW+b3ZhxaUgcHJlc25vc8WlIG1vZGVsdSwgYWxlIG5lcHJlZHN0YXZ1asO6IGphc27DvSB2em9yLCBrdG9yw70gYnkgbmF6bmHEjW92YWwgcG9ydcWhZW5pZSBsaW5lYXJpdHkgYWxlYm8gaGV0ZXJvc2tlZGFzdGljaXR1LiBDZWxrb3ZvIGdyYWYgbmVwcmV1a2F6dWplIHbDvXJhem5lIHN5c3RlbWF0aWNrw6kgcHJvYmzDqW15IHYgxaFwZWNpZmlrw6FjaWkgbW9kZWx1LgoKIyMjIEdyYWZ5ICpDK1IqICAKVMOhdG8gYW5hbMO9emEgbsOhbSB1bW/FvsWIdWplIHByZXNrw7ptYcWlLCDEjWkgamUgdnrFpWFoIG1lZHppIGplZG5vdGxpdsO9bWkgdnlzdmV0xL51asO6Y2ltaSBwcmVtZW5uw71taSBhIHrDoXZpc2xvdSBwcmVtZW5ub3Ugc2t1dG/EjW5lIGxpbmXDoXJueS4gVnljaMOhZHphbWUgeiBww7R2b2Ruw6lobyBtb2RlbHUKXFtBQVBMXF9yZXQgPSBcYmV0YV8wICsgXGJldGFfMSBcY2RvdCBHTERcX3JldCArIFxiZXRhXzIgXGNkb3QgWExFXF9yZXQgKyBcYmV0YV8zIFxjZG90IFNQWVxfcmV0ICsgdVxdClBvIG9kaGFkbnV0w60gdG9odG8gbW9kZWx1IHZ5a3Jlc8S+dWplbWUgY29tcG9uZW50ICsgcmVzaWR1YWwgcGxvdHMgKEMrUiBncmFmeSksIHYga3RvcsO9Y2ggc2EgbmEgenZpc2xlaiBvc2kgbmFjaMOhZHphIHbDvXJheiAKJCQKXGhhdHtcYmV0YX1faSB4X2kgKyBlCiQkCmEgbmEgdm9kb3Jvdm5laiBvc2kgaG9kbm90eSBwcmVtZW5uw71jaCB4X2kuIFRpZXRvIGdyYWZ5IHNsw7rFvmlhIG5hIGlkZW50aWZpa8OhY2l1IHByw61wYWRuw71jaCBuZWxpbmXDoXJueWNoIHZ6xaVhaG92IG1lZHppIHrDoXZpc2xvdSBwcmVtZW5ub3UgYSBqZWRub3RsaXbDvW1pIHJlZ3Jlc29ybWkuCmBgYHtyfQpjYXI6OmNyUGxvdHMobW9kZWwpCgpgYGAKCiMjIyMgKkdvbGQqICAgICAKS3JpdmthIChydcW+b3bDoSkgamUgdGFrbWVyIHZvZG9yb3Zuw6EgYSBkcsW+w60gc2EgdmXEvm1pIGJsw616a28gcHJpYW1reSBsaW5lw6FybmVobyB2esWlYWh1IChtb2Ryw6EgxI1pYXJhKS4gQm9keSBzw7ogcm96cHTDvWxlbsOpIG7DoWhvZG5lIGEgYmV6IHbDvXJhem7DqWhvIHpha3JpdmVuaWEuIFRvIG5hem5hxI11amUsIMW+ZSBtZWR6aSB2w71ub3NtaSBBcHBsZSBhIGNlbm91IHpsYXRhIG5lZXhpc3R1amUgbmVsaW5lw6FybnkgdnrFpWFoIGEgbGluZcOhcm5hIMWhcGVjaWZpa8OhY2lhIGplIHBvc3RhxI11asO6Y2EuCgojIyMjICpYTEUqIApQcmkgdGVqdG8gcHJlbWVubmVqIHNhIG5hY2jDoWR6YSBuYWptaWVybmVqxaHDrSBuw6F6bmFrIHpha3JpdmVuaWEg4oCTIGtyaXZrYSBtw6EgamVtbsO9IGtvbmvDoXZueSB0dmFyLiBUZW50byBvZGtsb24gdsWhYWsgbmllIGplIHbDvXJhem7DvSBhIGplIHNww7Rzb2JlbsO9IG5ham3DpCB2w6TEjcWhb3UgdmFyaWFiaWxpdG91IHJlesOtZHXDrSBwcmkgdnnFocWhw61jaCBob2Rub3TDoWNoIFhMRV9yZXQuIEFqIG5hcHJpZWsgdG9tdSBrcml2a2EgbmV1a2F6dWplIG5hIHBvdHJlYnUgdHJhbnNmb3Jtw6FjaWUsIGtlxI/FvmUgY2Vsa292w70gcHJpZWJlaCB6b3N0w6F2YSB6IHZlxL5rZWogxI1hc3RpIGxpbmXDoXJueS4KCiMjIyMgKlNQWSogClYgdG9tdG8gcHLDrXBhZGUgcG96b3J1amVtZSBqZWRub3puYcSNbmUgbmFqc2lsbmVqxaHDrSBsaW5lw6FybnkgdnrFpWFoLiBPYmlkdmUga3Jpdmt5IHNhIG5hY2jDoWR6YWrDuiB0YWttZXIgcHJlc25lIG5hIHNlYmUgYSBtYWrDuiBzdMO6cGFqw7pjaSB0dmFyLCDEjW8gcG90dnJkenVqZSBzaWxuw7ogbGluZcOhcm51IHbDpHpidSBtZWR6aSB2w71ub3NtaSBBcHBsZSBhIHbDvW5vc21pIMWhaXJva8OpaG8gdHJodSByZXByZXplbnRvdmFuw6lobyBpbmRleG9tIFMmUCA1MDAuIE5lZXhpc3R1amUgZMO0dm9kIG5hIHV2YcW+b3ZhbmllIG8gdHJhbnNmb3Jtw6FjaWkgdGVqdG8gcHJlbWVubmVqLgoKQytSIGdyYWZ5IG5lcHJldWthenVqw7ogcHLDrXRvbW5vc8WlIHbDvXJhem5laiBuZWxpbmVhcml0eSB2IHByw61wYWRlIMW+aWFkbmVqIHpvIHNsZWRvdmFuw71jaCBwcmVtZW5uw71jaC4gTWllcm55IG7DoXpuYWsgemFrcml2ZW5pYSBwcmkgWExFX3JldCBuaWUgamUgZG9zdGF0b8SNbmUgdsO9cmF6bsO9IG5hIHRvLCBhYnkgb2TDtHZvZG5pbCB0cmFuc2Zvcm3DoWNpdS4gUHJlIG5hxaFlIGTDoXRhIGplIHByZXRvIGxpbmXDoXJuYSDFoXBlY2lmaWvDoWNpYSBtb2RlbHUgYWRla3bDoXRuYSBhIHRyYW5zZm9ybcOhY2llIHByZW1lbm7DvWNoIG5pZSBzw7ogcG90cmVibsOpLgoKIyMgTmVsaW5lw6FybmEgxaFwZWNpZmlrw6FjaWEgCkhvY2kgdiBuYcWhb20gcHLDrXBhZGUgY29tcG9uZW50ICsgcmVzaWR1YWwgZ3JhZnkgYW5pIFJFU0VUIHRlc3QgbmVuYXpuYcSNaWxpIHByw610b21ub3PFpSB2w71yYXpuw71jaCBuZWxpbmXDoXJueWNoIHZ6xaVhaG92IG1lZHppIHZ5c3ZldMS+dWrDumNpbWkgcHJlbWVubsO9bWkgYSB2w71ub3NtaSBha2NpZSBBcHBsZSwgcHJlIMO6xI1lbHkgcG9jaG9wZW5pYSBtZXRvZGlreSBhIGplaiBwcmFrdGlja8OpaG8gcHJlY3ZpxI1lbmlhIHNhIHYgbmFzbGVkdWrDumNlaiDEjWFzdGkgcG9rw7pzaW1lIGFwbGlrb3ZhxaUgcm92bmFrw6kgcG9zdHVweSwgYWvDqSBib2xpIHV2ZWRlbsOpIHZvIHZ6b3Jvdm9tIHByw61rbGFkZS4KCkNpZcS+b20gdGVkYSBuaWUgamUga29yaWdvdmHFpSBza3V0b8SNbsO6IGNoeWJ1IHYgxaFwZWNpZmlrw6FjaWkgbW9kZWx1IChrZcSPxb5lIHrDoWtsYWRuw70gbGluZcOhcm55IG1vZGVsIHZ5aG92dWplKSwgYWxlIGRlbW9uxaF0cm92YcWlLCBha28gbW/Fvm5vIHByaSBwb3RyZWJlIG5lbGluZcOhcm5lIHVwcmF2acWlIHDDtHZvZG7DuiByZWdyZXNuw7ogcm92bmljdSwgemF2w6FkemHFpSBrdmFkcmF0aWNrw6kgxI1sZW55LCBkdW1teSBwcmVtZW5uw6kgxI1pIGxpbmXDoXJuZSBsb21lbsOpIGZ1bmtjaWUgYSBwb3Jvdm7DoXZhxaUgbW9kZWx5IHBvbW9jb3UgQU5PVkEgYSBSRVNFVCB0ZXN0b3YuCgpWIG5hxaFvbSBwcsOtcGFkZSBieSByb3rFocOtcmVuw70gbW9kZWwgbW9ob2wgbWHFpSB0dmFyOgokJCBBQVBMXF9yZXQgPSBcYmV0YV8wICsgXGJldGFfMSBHTERcX3JldCArIFxiZXRhXzIgWExFXF9yZXQgKyBcYmV0YV8zIFNQWVxfcmV0ICsgXGdhbW1hXzEgR0xEXF9yZXReezJ9ICsgXGdhbW1hXzIgWExFXF9yZXReezJ9ICsgXGdhbW1hXzMgU1BZXF9yZXReezJ9ICsgdSAkJApUZW50byB0dmFyIG1vZGVsdSBzbWUgenZvbGlsaSBwcmV0bywgYWJ5IHNtZSB1bW/Fvm5pbGkgemFjaHl0acWlIHByw61wYWRuw6kgbmVsaW5lw6FybmUgdnrFpWFoeSBtZWR6aSB2w71ub3NvbSBha2NpZSBBcHBsZSBhIGplZG5vdGxpdsO9bWkgdnlzdmV0xL51asO6Y2ltaSBwcmVtZW5uw71taS4gWmFyYWRlbmllIGt2YWRyYXRpY2vDvWNoIMSNbGVub3Ygcm96xaFpcnVqZSBww7R2b2Ruw7ogcm92bmljdSBvIG1vxb5ub3PFpSwgxb5lIMO6xI1pbm9rIHByZW1lbm7DvWNoIHNhIG3DtMW+ZSBwcmkgcsO0em55Y2ggw7pyb3ZuaWFjaCBpY2ggaG9kbsO0dCBtZW5pxaUgYSBuZW11c8OtIG1hxaUgc3RyaWt0bmUgbGluZcOhcm55IHByaWViZWguIFbEj2FrYSB0b211IG3DtMW+ZW1lIHByZXNrw7ptYcWlLCDEjWkgdGFrw6F0byDDunByYXZhIHZlZGllIGsgemxlcMWhZW5pdSDFoXRhdGlzdGlja8O9Y2ggdmxhc3Rub3N0w60gbW9kZWx1LgoKIyMjIFBvcm92bmFuaWUgesOha2xhZG7DqWhvIGEgbW9kaWZpa292YW7DqWhvIG1vZGVsdQpWIG5hZHbDpHpub3N0aSBuYSB1dmVkZW7DuiBuZWxpbmXDoXJudSDFoXBlY2lmaWvDoWNpdSBzbWUgcm96xaHDrXJpbGkgcMO0dm9kbsO9IGxpbmXDoXJueSBtb2RlbCBvIGt2YWRyYXRpY2vDqSDEjWxlbnkgdsWhZXRrw71jaCB2eXN2ZXTEvnVqw7pjaWNoIHByZW1lbm7DvWNoLiBUYWt0byB1cHJhdmVuw70gbW9kZWwgdW1vxb7FiHVqZSBwcmVza8O6bWHFpSwgxI1pIHbDvWtvbiByZWdyZXNpZSB6bGVwxaHDrSBkb3BsbmVuaWUgbmVsaW5lw6FybnljaCBlZmVrdG92LiAKYGBge3J9Cm1vZGVsX3pha2xhZG55IDwtIGxtKEFBUExfcmV0IH4gR0xEX3JldCArIFhMRV9yZXQgKyBTUFlfcmV0LAogICAgICAgICAgICAgICAgICAgICBkYXRhID0gcmV0X2RmKQoKbW9kZWxfa3ZhZHIgPC0gbG0oQUFQTF9yZXQgfiBHTERfcmV0ICsgWExFX3JldCArIFNQWV9yZXQgKwogICAgICAgICAgICAgICAgICAgICBJKEdMRF9yZXReMikgKyBJKFhMRV9yZXReMikgKyBJKFNQWV9yZXReMiksCiAgICAgICAgICAgICAgICAgICBkYXRhID0gcmV0X2RmKQoKc3VtbWFyeShtb2RlbF9rdmFkcikKYW5vdmEobW9kZWxfemFrbGFkbnksIG1vZGVsX2t2YWRyKQpyZXNldHRlc3QobW9kZWxfa3ZhZHIpCgpgYGAKUG8gcm96xaHDrXJlbsOtIHrDoWtsYWRuw6lobyBtb2RlbHUgbyBrdmFkcmF0aWNrw6kgxI1sZW55IHNhIHVrw6F6YWxvLCDFvmUgxb5pYWRueSB6IG5pY2ggbmllIGplIMWhdGF0aXN0aWNreSB2w716bmFtbsO9LiBMaW5lw6FybmUga29lZmljaWVudHkgc2kgcHJpdG9tIHphY2hvdmFsaSByb3ZuYWvDqSB2bGFzdG5vc3RpIGFrbyB2IHDDtHZvZG5vbSBtb2RlbGkg4oCTIG5hanZ5xaHFoWl1IHbDvXpuYW1ub3PFpSBtw6EgdHJob3bDvSBmYWt0b3IsIGvDvW0gb3N0YXRuw6kgcHJlbWVubsOpIHNhIHrDoXNhZG5lIG5lbWVuaWEuCgpVcHJhdmVuw70ga29lZmljaWVudCBkZXRlcm1pbsOhY2llIHNhIHBvIHByaWRhbsOtIGt2YWRyYXRpY2vDvWNoIMSNbGVub3YgenbDvcWhaWwgbGVuIG1pbmltw6FsbmUgKHpocnViYSBvIDAuMDA0KSwgxI1vIHByZWRzdGF2dWplIHZlxL5taSBtYWzDvSBwb3N1bi4gQU5PVkEgdGVzdCBuYXpuYcSNaWwsIMW+ZSByb3pkaWVsIG1lZHppIG1vZGVsbWkgbmllIGplIMWhdGF0aXN0aWNreSB2w716bmFtbsO9LCB0YWvFvmUgcm96xaHDrXJlbmllIG5lcHJpbmllc2xvIGNpdGXEvm7DqSB6bGVwxaFlbmllLgoKUkVTRVQgdGVzdCBtb2RpZmlrb3ZhbsOpaG8gbW9kZWx1IG3DoSB2eXNva8O6IHAtaG9kbm90dSwgxI1vIG9ww6TFpSBwb3R2cmR6dWplLCDFvmUgbW9kZWwgbmVvYnNhaHVqZSBjaHlibsO6IMWhcGVjaWZpa8OhY2l1LiBLdmFkcmF0aWNrw6kgxI1sZW55IHRlZGEgbmV6YWNoeXRpbGkgxb5pYWRudSBkb2RhdG/EjW7DuiBuZWxpbmVhcml0dSwga3RvcsOhIGJ5IGJvbGEgeiBoxL5hZGlza2EgdMO9Y2h0byBkw6F0IHJlbGV2YW50bsOhLgoKIyMjIFRyYW5zZm9ybcOhY2lhIHBvbW9jb3UgZHVtbXkgcHJlbWVubmVqIGEgbGluZcOhcm5laiBsb21lbmVqIGZ1bmtjaWUKViDEj2FsxaFvbSBrcm9rdSBzbWUgc2EgcG9rw7pzaWxpIHphY2h5dGnFpSBwcsOtcGFkbsO6IHptZW51IHNwcsOhdmFuaWEgbW9kZWx1IHByaSBvZGxpxaFuw71jaCBwb2RtaWVua2FjaCBuYSB0cmh1LiBOYSB0byBzbWUgemF2aWVkbGkgamVkbm9kdWNow7ogZHVtbXkgcHJlbWVubsO6LCBrdG9yw6Egb2RsacWhdWplIGRuaSBzIHbDvXJhem5lasWhw61tIHBvaHlib20gdHJodSBvZCBiZcW+bsO9Y2ggZG7DrS4gVMOhdG8gcHJlbWVubsOhIG7DoW0gdW1vxb7FiHVqZSB0ZXN0b3ZhxaUsIMSNaSBzYSB2w712b2ogesOhdmlzbGVqIHByZW1lbm5laiBsw63FoWkgbWVkemkgZHZvbWEgc2t1cGluYW1pIHBvem9yb3ZhbsOtIOKAkyBidcSPIHBvc3Vub20gdiBhdXRvbsOzbW5vbSDEjWxlbm92aSwgYWxlYm8gem1lbm91IHNrbG9udSBwcmkgamVkbmVqIHogdnlzdmV0xL51asO6Y2ljaCBwcmVtZW5uw71jaC4gT2RoYWRsaSBzbWUgcHJldG8gZHZhIG1vZGVseTogamVkZW4gcyBtb8W+bsO9bSBwb3N1bm9tIGNlbGVqIHJvdm5pY2UgYSBkcnVow70gcyBtb8W+bm91IHptZW5vdSBza2xvbnUuIE5hc2xlZHVqw7pjZSB2w71zbGVka3kgdWthenVqw7osIMSNaSB0aWV0byDDunByYXZ5IHByaW7DocWhYWrDuiB6bGVwxaFlbmllIG9wcm90aSBww7R2b2Ruw6ltdSBsaW5lw6FybmVtdSBtb2RlbHUuCgojIyMjICpNb2RlbCBzbyB6bG9tb20gdiBhdXRvbsOzbW5vbSDEjWxlbmUqIApUZW50byBtb2RlbCB1bW/FvsWIdWplLCBhYnkgc2EgY2Vsw70gdnrFpWFoIHBvc3VudWwgbmFob3IgYWxlYm8gbmFkb2wgdiBkxYhvY2gsIGtlxI8gZHVtbXkgcHJlbWVubsOhIG5hZG9iw7pkYSBob2Rub3R1IDEuIElkZSB0ZWRhIG8gdGVzdCwgxI1pIHNhIMO6cm92ZcWIIHrDoXZpc2xlaiBwcmVtZW5uZWogbMOtxaFpIG1lZHppIGR2b21hIHNrdXBpbmFtaSBwb3pvcm92YW7DrS4KCiQkCkFBUExcX3JldCA9IFxiZXRhXzAgKyBcYmV0YV9EIERVTSArIFxiZXRhXzEgR0xEXF9yZXQKKyBcYmV0YV8yIFhMRVxfcmV0ICsgXGJldGFfMyBTUFlcX3JldCArIHUKJCQKCiMjIyMgKk1vZGVsIHNvIHpsb21vbSB2IHNrbG9uZSoKViB0b210byBwcsOtcGFkZSBzYSBza8O6bWEsIMSNaSBqZSBza2xvbiByZWdyZXNuZWogcHJpYW1reSByb3pkaWVsbnkgdiB6w6F2aXNsb3N0aSBvZCBob2Rub3R5IGR1bW15IHByZW1lbm5lai4gS29lZmljaWVudCBwcmkgaW50ZXJha8SNbm9tIMSNbGVub3ZpIHVyxI11amUsIMSNaSBzYSByZWFrY2lhIHrDoXZpc2xlaiBwcmVtZW5uZWogbmEgZGFuZWogdnlzdmV0xL51asO6Y2VqIHByZW1lbm5uZWogbWVuw60gbWVkemkgZHZvbWEgc2xlZG92YW7DvW1pIHN0YXZtaS4KJCQKQUFQTFxfcmV0ID0gXGJldGFfMCArIFxiZXRhXzEgR0xEXF9yZXQgKyBcYmV0YV8yIFhMRVxfcmV0CisgXGJldGFfMyBTUFlcX3JldCArIFxiZXRhX3tEfSAoRFVNIFxjZG90IFNQWVxfcmV0KSArIHUKJCQKClByw61rbGFkIHphdmVkZW5pYSBkdW1teSBwcmVtZW5uZWogcG9kxL5hIHZlxL5rb3N0aSB0cmhvdsOpaG8gcG9oeWJ1IChuYXByLiBTUFlfcmV0IHbDpMSNxaHDrSBha28gMSAlKToKCmBgYHtyfQpyZXRfZGYkRFVNIDwtIGlmZWxzZShyZXRfZGYkU1BZX3JldCA+IDAuMDEsIDEsIDApCgptb2RlbERfYXV0byA8LSBsbShBQVBMX3JldCB+IERVTSArIEdMRF9yZXQgKyBYTEVfcmV0ICsgU1BZX3JldCwKICAgICAgICAgICAgICAgICAgZGF0YSA9IHJldF9kZikKc3VtbWFyeShtb2RlbERfYXV0bykKCm1vZGVsRF9za2xvbiA8LSBsbShBQVBMX3JldCB+IEdMRF9yZXQgKyBYTEVfcmV0ICsKICAgICAgICAgICAgICAgICAgICAgU1BZX3JldCArIEkoRFVNICogU1BZX3JldCksCiAgICAgICAgICAgICAgICAgICBkYXRhID0gcmV0X2RmKQpzdW1tYXJ5KG1vZGVsRF9za2xvbikKCmFub3ZhKG1vZGVsX3pha2xhZG55LCBtb2RlbERfc2tsb24pCnJlc2V0dGVzdChtb2RlbERfc2tsb24pCgpgYGAKIyMjIyAqSW50ZXJwcmV0w6FjaWEgbW9kZWx1IHNvIHpsb21vbSB2IGF1dG9uw7Ntbm9tIMSNbGVuZSoKUG8gZG9wbG5lbsOtIGR1bW15IHByZW1lbm5laiAoRFVNKSwga3RvcsOhIG9kZGXEvnVqZSBkbmkgcyB2ecWhxaHDrW0gcG9oeWJvbSB0cmh1IG9kIG9zdGF0bsO9Y2gsIHNhIHVrw6F6YWxvLCDFvmUgdGVudG8gZG9kYXRvxI1uw70gxI1sZW4gbmllIGplIMWhdGF0aXN0aWNreSB2w716bmFtbsO9LiBKZWhvIGtvZWZpY2llbnQgbcOhIHBvbWVybmUgdnlzb2vDuiBwLWhvZG5vdHUsIHRha8W+ZSBuZW1vxb5ubyB0dnJkacWlLCDFvmUgYnkgc2EgdsO9dm9qIHrDoXZpc2xlaiBwcmVtZW5uZWogdsO9em5hbW5lIGzDrcWhaWwgbWVkemkgZHZvbWEgc2t1cGluYW1pIHBvem9yb3ZhbsOtLiBPc3RhdG7DqSBwcmVtZW5uw6kgc2kgemFjaG92YWxpIHNwcsOhdmFuaWUgcG9kb2Juw6kgcMO0dm9kbsOpbXUgbW9kZWx1IOKAkyBuYWp2w71yYXpuZWrFocOtIHZwbHl2IG3DoSB0cmhvdsO9IGZha3Rvciwga8O9bSBvc3RhdG7DqSB6b3N0w6F2YWrDuiBzbGFixaFpZSBhbGVibyBuZXbDvXpuYW1uw6kuIEhvZG5vdGEgdXByYXZlbsOpaG8ga29lZmljaWVudHUgZGV0ZXJtaW7DoWNpZSBzYSB0YWttZXIgbmV6bWVuaWxhLCDEjW8gbmF6bmHEjXVqZSwgxb5lIHBvc3VuIGNlbGVqIHJvdm5pY2UgbmVwcmluaWVzb2wgemxlcMWhZW5pZS4KCiMjIyMgKkludGVycHJldMOhY2lhIG1vZGVsdSBzbyB6bG9tb20gdiBza2xvbmUqClYgZHJ1aG9tIGtyb2t1IHNtZSBza8O6bWFsaSwgxI1pIHNhIG3DtMW+ZSBtZW5pxaUgc2tsb24gcmVncmVzbmVqIHByaWFta3kgdiB6w6F2aXNsb3N0aSBvZCBkdW1teSBwcmVtZW5uZWouIEludGVyYWvEjW7DvSDEjWxlbiwga3RvcsO9IGJ5IG1hbCB6YWNoeXTDoXZhxaUgcm96ZGllbG5lIHNwcsOhdmFuaWUgdiBkxYhvY2ggcyB2ecWhxaHDrW0gdHJob3bDvW0gcG9oeWJvbSwgdsWhYWsgbmllIGplIMWhdGF0aXN0aWNreSB2w716bmFtbsO9LiBTYW1vdG7DqSBrb2VmaWNpZW50eSB6w6FrbGFkbsO9Y2ggcHJlbWVubsO9Y2ggc2Egb3Byb3RpIHBydsOpbXUgbW9kZWx1IHRha21lciBuZXptZW5pbGkgYSB2eXN2ZXTEvm92YWNpYSBzY2hvcG5vc8WlIG1vZGVsdSBzYSB6dsO9xaFpbGEgbGVuIG1pbmltw6FsbmUuCgpBTk9WQSBwb3Jvdm5hbmllIHrDoWtsYWRuw6lobyBhIHJvesWhw61yZW7DqWhvIG1vZGVsdSBvcMOkxaUgbmVwcmV1a8OhemFsbyDFoXRhdGlzdGlja3kgdsO9em5hbW7DqSB6bGVwxaFlbmllLiBUbyB6bmFtZW7DoSwgxb5lIGRvcGxuZW5pZSB0ZWp0byBpbnRlcmFrY2llIG1vZGVsdSBuZXBvbW9obG8gemFjaHl0acWlIMW+aWFkbnkgZMO0bGXFvml0w70gZG9kYXRvxI1uw70gdnrFpWFoLgoKIyMjIyAqUkVTRVQgdGVzdCoKUkVTRVQgdGVzdCBwcmUgcm96xaHDrXJlbsO9IG1vZGVsIG3DoSB2eXNva8O6IHAtaG9kbm90dS4gWm5hbWVuw6EgdG8sIMW+ZSBtb2RlbCBuZW9ic2FodWplIGNoeWJuw7ogxaFwZWNpZmlrw6FjaXUgYSBkb3BsbmVuaWUgemxvbXUgdiBza2xvbmUgbmllIGplIHBvdHJlYm7DqS4gVsO9c2xlZG9rIGplIGtvbnppc3RlbnRuw70gcyBwcmVkY2jDoWR6YWrDumNpbWkgemlzdGVuaWFtaSDigJMgbGluZcOhcm55IG1vZGVsIHYgbmHFoW9tIHByw61wYWRlIHBvc3RhxI11amUuCg==