Zadanie

Stwórz model objaśniający średnie wybagrodzenia.

Wykonaj:

  1. porównanie KMNK oraz regresji kwantylowej (różno-poziomowej) dla zmiennej “earnings” - wynagrodzenia.
  2. Dobierz i przetestuj predyktory, kwantyle dla modeli.
  3. Wykonaj testy różnic współczynnikow dla finalnych modeli.

Dane z CPSSW9298:

  • earnings - średnie wynagrodzenie w $/godzine - (average hourly earnings (sum of annual pretax wages, salaries, tips, and bonuses, divided by the number of hours worked annually).)
  • degree - stopień edukacji - szkoła średnia lub licencjat (factor indicating highest educational degree (“bachelor” or”highschool”).)
  • age - wiek w latach

Wynagrodzenia zostaną zamodelowane oddzielnie dla roku 1992 (ankieta1) oraz 1998 (ankieta2).

ankieta1 <- subset(CPSSW9298, year=="1992")
ankieta2 <- subset(CPSSW9298, year=="1998")

MODELE - PORÓWNANIE

Model KNMK

Na podstawie modelu KMNK stwierdzamy, że w 1992 i 1998 wszystkie zmienne objaśniające - stopień edukacji, płeć oraz wiek istotnie wpływały na poziom wynagrodzeń.

  • Wraz z zwiększeniem poziomu swojej edukacji i zdobyciem licencjatu, przeciętne wynagrodzenia zwiększały się średnio w 1992 roku o 37% , a w 1998 o 38%.

  • W 1992 roku Kobiety względem mężczyzn w przepadanej próbie, zarabiały przeciętnie mniej o 17%. Natomiast w 1998 ta różnica w zarobkach się zwiększyła i średnie wynagrodzenie kobiet było przeciętnie niższe o 18% od wynagrodzenia męzczyzn.

  • W 1992 roku Wraz z wiekiem, przeciętne wynagrodzenia zwiększają się o 26%. W 1998 r. wraz ze starzeniem się tzn. z każdnym kolejnym rokiem, ankietowani zarabiali śrendio o 21% więcej.

dla 1992 roku

lm1 <- lm(log(earnings) ~ degree + gender + age, data = ankieta1)  # const nie jest istotna czyli rozkład jest skośny, więcej ludzi zarabia więcej niż mniej, DLATEGO  zmienna earnings jest w logarytmie !!
summary(lm1)
## 
## Call:
## lm(formula = log(earnings) ~ degree + gender + age, data = ankieta1)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1.80573 -0.26371  0.02737  0.29516  1.53710 
## 
## Coefficients:
##                 Estimate Std. Error t value Pr(>|t|)    
## (Intercept)     1.486349   0.053186   27.95   <2e-16 ***
## degreebachelor  0.375044   0.010162   36.91   <2e-16 ***
## genderfemale   -0.167263   0.010009  -16.71   <2e-16 ***
## age             0.026398   0.001764   14.97   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.4305 on 7586 degrees of freedom
## Multiple R-squared:  0.1872, Adjusted R-squared:  0.1869 
## F-statistic: 582.3 on 3 and 7586 DF,  p-value: < 2.2e-16

dla 1998 roku

## 
## Call:
## lm(formula = log(earnings) ~ degree + gender + age, data = ankieta2)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1.96583 -0.27644  0.02536  0.30209  1.50215 
## 
## Coefficients:
##                Estimate Std. Error t value Pr(>|t|)    
## (Intercept)     1.78845    0.06230   28.71   <2e-16 ***
## degreebachelor  0.38277    0.01173   32.64   <2e-16 ***
## genderfemale   -0.18003    0.01182  -15.23   <2e-16 ***
## age             0.02142    0.00207   10.35   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.4457 on 5907 degrees of freedom
## Multiple R-squared:  0.1828, Adjusted R-squared:  0.1824 
## F-statistic: 440.5 on 3 and 5907 DF,  p-value: < 2.2e-16

Model regresji kwantylowej

dla 1992 roku

## Warning in rq.fit.br(x, y, tau = tau, ...): Solution may be nonunique

## Warning in rq.fit.br(x, y, tau = tau, ...): Solution may be nonunique

## Warning in rq.fit.br(x, y, tau = tau, ...): Solution may be nonunique
## 
## Call: rq(formula = log(earnings) ~ degree + gender + age, tau = kwantyle1, 
##     data = ankieta1)
## 
## tau: [1] 0.25
## 
## Coefficients:
##                Value     Std. Error t value   Pr(>|t|) 
## (Intercept)      1.32454   0.07633   17.35368   0.00000
## degreebachelor   0.41185   0.01357   30.35236   0.00000
## genderfemale    -0.14206   0.01416  -10.03079   0.00000
## age              0.02206   0.00249    8.87098   0.00000
## 
## Call: rq(formula = log(earnings) ~ degree + gender + age, tau = kwantyle1, 
##     data = ankieta1)
## 
## tau: [1] 0.5
## 
## Coefficients:
##                Value     Std. Error t value   Pr(>|t|) 
## (Intercept)      1.41968   0.06021   23.57894   0.00000
## degreebachelor   0.39768   0.01159   34.31471   0.00000
## genderfemale    -0.18271   0.01200  -15.23177   0.00000
## age              0.02955   0.00205   14.38757   0.00000
## 
## Call: rq(formula = log(earnings) ~ degree + gender + age, tau = kwantyle1, 
##     data = ankieta1)
## 
## tau: [1] 0.75
## 
## Coefficients:
##                Value     Std. Error t value   Pr(>|t|) 
## (Intercept)      1.69431   0.06590   25.70880   0.00000
## degreebachelor   0.35528   0.01217   29.18287   0.00000
## genderfemale    -0.18447   0.01360  -13.56140   0.00000
## age              0.02978   0.00210   14.17697   0.00000

dla 1998 roku

## Warning in rq.fit.br(x, y, tau = tau, ...): Solution may be nonunique
## 
## Call: rq(formula = log(earnings) ~ degree + gender + age, tau = kwantyle2, 
##     data = ankieta2)
## 
## tau: [1] 0.25
## 
## Coefficients:
##                Value     Std. Error t value   Pr(>|t|) 
## (Intercept)      1.53975   0.09458   16.27957   0.00000
## degreebachelor   0.39850   0.01674   23.80190   0.00000
## genderfemale    -0.18133   0.01728  -10.49616   0.00000
## age              0.02026   0.00312    6.50131   0.00000
## 
## Call: rq(formula = log(earnings) ~ degree + gender + age, tau = kwantyle2, 
##     data = ankieta2)
## 
## tau: [1] 0.5
## 
## Coefficients:
##                Value     Std. Error t value   Pr(>|t|) 
## (Intercept)      1.71413   0.07286   23.52507   0.00000
## degreebachelor   0.39563   0.01418   27.91005   0.00000
## genderfemale    -0.19526   0.01392  -14.02939   0.00000
## age              0.02479   0.00242   10.25211   0.00000
## 
## Call: rq(formula = log(earnings) ~ degree + gender + age, tau = kwantyle2, 
##     data = ankieta2)
## 
## tau: [1] 0.75
## 
## Coefficients:
##                Value     Std. Error t value   Pr(>|t|) 
## (Intercept)      1.94914   0.07408   26.30978   0.00000
## degreebachelor   0.36898   0.01402   26.32117   0.00000
## genderfemale    -0.21198   0.01445  -14.66584   0.00000
## age              0.02666   0.00250   10.65240   0.00000

Interpretacja oszacowań (0.25,0.5,0.75)

## 
## Wyniki regresji kwantylowych w 1992r.
## ============================================
##                     Dependent variable:     
##                -----------------------------
##                        log(earnings)        
##                   (1)       (2)       (3)   
## --------------------------------------------
## degreebachelor 0.412***  0.398***  0.355*** 
##                 (0.015)   (0.012)   (0.011) 
##                                             
## genderfemale   -0.142*** -0.183*** -0.184***
##                 (0.015)   (0.012)   (0.011) 
##                                             
## age            0.022***  0.030***  0.030*** 
##                 (0.003)   (0.002)   (0.002) 
##                                             
## Constant       1.325***  1.420***  1.694*** 
##                 (0.080)   (0.062)   (0.058) 
##                                             
## --------------------------------------------
## Observations     7,590     7,590     7,590  
## ============================================
## Note:            *p<0.1; **p<0.05; ***p<0.01

Wszystkie zmienne istotnie wpływają na przeciętne wynagrodzenia w 1992r.

Regresja kwantylowa pozwola dostrzec różnice między zależnościami dla zarabiających najmniej i najwięcej.

  • W przypadku wpływu płci na zarobki, widzimy, że dla zarabiających w pierwszej ćwiartce, kobiety zarabiały średnio mniej o 14,2% w stostunku do mężczyz. Natomiast rozpartując grupe zarabiających najwięcej, tzn. ankietowanych z ostatniej ćwiatki, kobiety zarabiały przeciętnie mniej o 18,4% niż mężczyźni. Zatem im wyższe zarobki tym różnice w wynagrodzeniach kobiet i mężczyzn są większe. Inaczej można powiedzieć, że przy niższych stawkach dyskrymiacja ze względu na płeć jest mniejsza.

  • Rozważając wpływ poziomu edukacji, W przypadku osób zarabiających najmniej (pierwsza ćwiartka), jeżeli ankietowany posiadał stopień licencjata śrendie zarobki były przeciętnie wyższe o 41% w porówaniu do osób o średnim wykształceniu. Dla osób zarabiających najwięcej ta różnica w zależności od posiomu wykształcenia była mniejsza, gdyż stopnień licenccjata dawał przeciętnie wyższe zarobki o 35%. Zatem można wnioskować, że gdy się zarabia więcej, stopień wykształcenia w mniejszym stopniu przyczynia się do wzrostu zaraobków niż na poziomie niskich wynagrodzeń.

  • Rozpatrując wpływ wieku na zarobki widzimy, że dla osób młodych każdny kolejny rok kiedy stają się starsi, zarobki były większe o 2,2%. Natomiast dla grupy zarabiajacych w przedziale środkowym (30lat i więcej), wraz z wiekiem wynagrodzenia były wyższe o 3%. Zatem można dostrzec, że dla grupy osób najmłodszych wśród badanych, wzrost dochodów był mniejszy wraz wiekiem, niż dla osób które miały więcej niż 30 lat.

## [1] 30
## 
## Wyniki regresji kwantylowych w 1998r.
## ============================================
##                     Dependent variable:     
##                -----------------------------
##                        log(earnings)        
##                   (1)       (2)       (3)   
## --------------------------------------------
## degreebachelor 0.398***  0.396***  0.369*** 
##                 (0.016)   (0.014)   (0.015) 
##                                             
## genderfemale   -0.181*** -0.195*** -0.212***
##                 (0.016)   (0.014)   (0.015) 
##                                             
## age            0.020***  0.025***  0.027*** 
##                 (0.003)   (0.002)   (0.003) 
##                                             
## Constant       1.540***  1.714***  1.949*** 
##                 (0.085)   (0.075)   (0.079) 
##                                             
## --------------------------------------------
## Observations     5,911     5,911     5,911  
## ============================================
## Note:            *p<0.1; **p<0.05; ***p<0.01

Tabela. Porównanie współczynników

Porównanie współczynników w modelu KMNK i regresji kwantylowej (0.1, 0.25, 0.5, 0.75, 0.90, 0.95))

Oszacowania z KMNK oraz quantreg dla roku 1992
OLS \(\tau_{0.10}\) \(\tau_{0.25}\) \(\tau_{0.50}\) \(\tau_{0.75}\) \(\tau_{0.90}\) \(\tau_{0.95}\)
(Intercept) 1.4863490 1.1233290 1.3245402 1.4196786 1.6943127 1.9324262 2.1211185
degreebachelor 0.3750441 0.3897862 0.4118489 0.3976830 0.3552754 0.3369236 0.3226939
genderfemale -0.1672629 -0.1140067 -0.1420630 -0.1827112 -0.1844718 -0.1827728 -0.1965213
age 0.0263975 0.0186965 0.0220623 0.0295486 0.0297762 0.0296363 0.0280745
Oszacowania z KMNK oraz quantreg dla 1998 roku
OLS \(\tau_{0.10}\) \(\tau_{0.25}\) \(\tau_{0.50}\) \(\tau_{0.75}\) \(\tau_{0.90}\) \(\tau_{0.95}\)
(Intercept) 1.7884485 1.1233290 1.3245402 1.4196786 1.6943127 1.9324262 2.1211185
degreebachelor 0.3827709 0.3897862 0.4118489 0.3976830 0.3552754 0.3369236 0.3226939
genderfemale -0.1800279 -0.1140067 -0.1420630 -0.1827112 -0.1844718 -0.1827728 -0.1965213
age 0.0214183 0.0186965 0.0220623 0.0295486 0.0297762 0.0296363 0.0280745

TESTY RÓŻNIC WSPÓŁCZYNNIKÓW

Badanie statystycznej różnicy między 25. i 50. kwantylem warunkowym - Test Walda.

testowanie wspólne (joint=TRUE)

  • Dla roku 1992 (dane=ankieta1) Na podstawie poniższego testu na istotność różnicy między 25 i 50 kwantylem warunkowym, odrzucamy hipotezę zerową, na rzecz H1, ponieważ p-value< alfa=0.05. Zatem różnica pomiędzy współczynnikami dla 25 i 50 kwantylu jest statystycznie istotna.
  • Dla roku 1998 (dane=ankieta2) Na podstwie testu Walda stwierdzamy brak podstaw do odrzucenia hipotezy zerowej, ponieważ p-value=0.210 > alfa=0.05. Co jest równoznanczne z tym, że współczynniki dla oszacowań w modelu dla 25 i 50 kwantyla spełniają pewne liniowe ograniczenia. Brak isotności statystycznej.
## Warning in rq.fit.br(x, y, tau = tau, ...): Solution may be nonunique

## Warning in rq.fit.br(x, y, tau = tau, ...): Solution may be nonunique
## Quantile Regression Analysis of Deviance Table
## 
## Model: log(earnings) ~ degree + gender + age
## Joint Test of Equality of Slopes: tau in {  0.25 0.5  }
## 
##   Df Resid Df F value    Pr(>F)    
## 1  3    15177  8.1014 2.178e-05 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## Warning in rq.fit.br(x, y, tau = tau, ...): Solution may be nonunique
## Quantile Regression Analysis of Deviance Table
## 
## Model: log(earnings) ~ degree + gender + age
## Joint Test of Equality of Slopes: tau in {  0.25 0.5  }
## 
##   Df Resid Df F value Pr(>F)
## 1  3    11819  1.5073 0.2104

Badanie statystycznej różnicy między 25, 50 i 75 kwantylem warunkowym - Test Walda

testowanie wspólne (joint=TRUE)

  • dla 1992r
## Warning in rq.fit.br(x, y, tau = tau, ...): Solution may be nonunique

## Warning in rq.fit.br(x, y, tau = tau, ...): Solution may be nonunique

## Warning in rq.fit.br(x, y, tau = tau, ...): Solution may be nonunique
## Quantile Regression Analysis of Deviance Table
## 
## Model: log(earnings) ~ degree + gender + age
## Joint Test of Equality of Slopes: tau in {  0.25 0.5 0.75  }
## 
##   Df Resid Df F value    Pr(>F)    
## 1  6    22764  7.1177 1.356e-07 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
  • dla 1998r
## Warning in rq.fit.br(x, y, tau = tau, ...): Solution may be nonunique
## Quantile Regression Analysis of Deviance Table
## 
## Model: log(earnings) ~ degree + gender + age
## Joint Test of Equality of Slopes: tau in {  0.25 0.5 0.75  }
## 
##   Df Resid Df F value  Pr(>F)  
## 1  6    17727  2.0933 0.05064 .
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Uzyskano wyniki podobne co dla testów dla dwoch kwantyli.

Dla roku 1992 odrzucamy Ho, na rzecz hipotezy alternatywnej (p-value<0.05), zatem istnieją istotne różnice pomiędzy współczynnikami dla osób zarabiających w pierwszym kwantylu 0.25, medianie i tych zarabiających najwięcej. Natomiast takie różnice w roku 1998 “osłabiły się” i występlują przy założeniu istotności alfa=10% (p-value=0.05064).

Test WALDA - Testowanie oddzielne (joint=FALSE)

Test dla różnic między dwoma kwantylami 25 i 50

## Quantile Regression Analysis of Deviance Table
## 
## Model: log(earnings) ~ degree + gender + age
## Tests of Equality of Distinct Slopes: tau in {  0.25 0.5  }
## 
##                Df Resid Df F value    Pr(>F)    
## degreebachelor  1    15179  1.2313 0.2671772    
## genderfemale    1    15179 10.4838 0.0012068 ** 
## age             1    15179 11.1764 0.0008304 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## Quantile Regression Analysis of Deviance Table
## 
## Model: log(earnings) ~ degree + gender + age
## Tests of Equality of Distinct Slopes: tau in {  0.25 0.5  }
## 
##                Df Resid Df F value  Pr(>F)  
## degreebachelor  1    11821  0.0416 0.83830  
## genderfemale    1    11821  0.9879 0.32028  
## age             1    11821  3.3290 0.06809 .
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Test dla różnic między trzema kwantylami 25,50 i 75

## Quantile Regression Analysis of Deviance Table
## 
## Model: log(earnings) ~ degree + gender + age
## Tests of Equality of Distinct Slopes: tau in {  0.25 0.5 0.75  }
## 
##                Df Resid Df F value    Pr(>F)    
## degreebachelor  2    22768  9.1631 0.0001052 ***
## genderfemale    2    22768  5.4138 0.0044606 ** 
## age             2    22768  5.7401 0.0032191 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## Quantile Regression Analysis of Deviance Table
## 
## Model: log(earnings) ~ degree + gender + age
## Tests of Equality of Distinct Slopes: tau in {  0.25 0.5 0.75  }
## 
##                Df Resid Df F value Pr(>F)
## degreebachelor  2    17731  2.1488 0.1167
## genderfemale    2    17731  1.4965 0.2239
## age             2    17731  2.2269 0.1079

Na podstawie powyższych testów zauważamy, że dla oszacowań dla 1998 roku występuje brak istotnych różnic pomiędzy współczynnikami dla wybranych kwantyli, w przeciwieństwie do roku 1992, kiedy taki różnice były statystycznie istotne.

Dobroć dopasowania vs R-kwadrat

Porówanie R^2 i dobroci dopasowania w modelach KMNK i regresji kwantylowej dla danych z roku 1992

Dobroć dopasowania dla modelu kwantylowego (1992)

## Warning in rq.fit.br(x, y, tau = tau, ...): Solution may be nonunique

## Warning in rq.fit.br(x, y, tau = tau, ...): Solution may be nonunique
## [1] 0.1598034

R-kwadrat (model KMNK)

## [1] 0.1871756

Lepiej wypada regresja liniowa niż regresja kwantylowa, ponieważ R-kwadrat jest wyższe.

Porówanie R^2 i dobroci dopasowania w modelach KMNK i regresji kwantylowej dla danych z roku 1998

Dobroć dopasowania dla modelu kwantylowego (1998)

## [1] 0.1410847

R-kwadrat (model KMNK)

## [1] 0.1828058

Dl adanych z roku 1998 również lepiej wypada regresja liniowa KMNK niż regresja kwantylowa, ponieważ R^2=18,28% jest większe od miernika dobrocji dopasowania.

Kryterium AIC

## Warning in AIC.default(model_lm_1992, model_kwantylowy_1992, model_lm_1998, :
## nie wszystkie modele są dopasowane do tej samej liczby obserwacji
##                       df      AIC
## model_lm_1992          5 8750.943
## model_kwantylowy_1992  4 9249.473
## model_lm_1998          5 7228.160
## model_kwantylowy_1998  4 7555.391

Kryterium AIC również potwierdza, że lepszym modelem w obu latach okazał się model regresji liniowej (KMNK).

DODATKOWE PORÓWNANIE MODELI

Model KMNK vs Model Medianowy

## Warning: pakiet 'sjPlot' został zbudowany w wersji R 4.3.3
## Learn more about sjPlot with 'browseVignettes("sjPlot")'.

Poniższe graficzne porównanie modeli pozawala na zobarazowanie różnic oszacowań parametrów. Dzięki temeu można zidentyfikować czy model liniowy niedoszacowywał lub przeszacowywał parametry względem mediany, która może być lepszą miarą w omawianym przykładzie.

śrendia, mediana, histogram wynagrodzeń
## [1] 11.65373
## [1] 10.57692

## Warning in rq.fit.br(x, y, tau = tau, ...): Solution may be nonunique

Graficzne prównanie jak objaśniane zjawisko różni się w zależności od decyla oraz jakie wnioski można wysnuć z porówanania wyników do śrendiej (KMNK).

Dla uproszczenia na osi X są zarobki w [$/h]. Oś OY odzwierciedlają współczynniki dla poszczególnych decyli. Czerwona ciągła linia to poziom średniej (OLS).

## Warning in rq.fit.br(x, y, tau = tau, ...): Solution may be nonunique

  • Wykres poziomu edukacji (degree)

Na wykresie widzimy , że im więcej ankietowani zarabiali, tym wpłw stopnia edukacji był silniejszy dodatnio - Czarna linia jest rosnąca. Różnice pomiędzy zarobkami, a w wpływem posiadania licencjatu były większe przy wyższych poziomach płac.

Dodaktowo dla wynagrodzeń poniżej mediany estymacja modelem regresji liniowej jest przeszacowana, a dla zarbiających powyżej mediany model KMNK niedoszacowaywał paramtery. (czerwona prosta poniżej czarnej).

  • Wykres wynagrodzenia~płeć

Regresja prosta, która wyznacza parametry modelu na podstawie wartości średnich (mean), przeszacowywały negatywny wpływ płci na zarobiki w grupie zarabaijących najmniej. Na wykresie można zaonserwowac, że w grupie 10% najmniej zarabiających, kobiety zarabiały jedynie średnio 0,5$/h mniej niż mężczyźni. Jednowcześnie KMNK niedoszacowywało negatywnego wpływu płci na zarobki, inaczej klasyczny model zaniżał dyskryminacje płciową.W grupie 10% osób najwiecej zarabiających, tam średnio kobiety zarabiały mniej o 3,4-3,6dolarów/h.

Nie ma takiego przedziału zarobków, w którym kobiety zarabiły by więcej niż mężczyźni.

  • Wykres zależności wynagrodzeń i wieku

W oparciu o powyższy wykres dostrzegamy, że model KMNK zawyżał parametr dla zmiennej wiek dla grup ankietowanych zarabiających poniżej mediany, natomiast zaniżał ten parametr w przedziałach wynagrodzeń powyżej mediany.

LS0tDQp0aXRsZTogJ05pZWtsYXN5Y3puZSBtZXRvZHkgc3RhdHlzdHlraScNCnN1YnRpdGxlOiAnUmVncmVzamEga3dhbnR5bG93YScNCmRhdGU6ICJgciBTeXMuRGF0ZSgpYCINCmF1dGhvcjogIkFnYXRhIFdpxIVjZWsiDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6IA0KICAgIHRoZW1lOiBjZXJ1bGVhbg0KICAgIGhpZ2hsaWdodDogdGV4dG1hdGUNCiAgICBmb250c2l6ZTogMTBwdA0KICAgIHRvYzogeWVzDQogICAgY29kZV9kb3dubG9hZDogeWVzDQogICAgdG9jX2Zsb2F0Og0KICAgICAgY29sbGFwc2VkOiBubw0KICAgIGRmX3ByaW50OiBkZWZhdWx0DQogICAgdG9jX2RlcHRoOiA1DQplZGl0b3Jfb3B0aW9uczogDQogIG1hcmtkb3duOiANCiAgICB3cmFwOiA3Mg0KLS0tDQoNCmBgYHtyIHNldHVwLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBwYWdlZC5wcmludD1UUlVFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBGQUxTRSkNCg0KYGBgDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGluY2x1ZGU9RkFMU0UsIHBhZ2VkLnByaW50PUZBTFNFfQ0KbGlicmFyeShDVlhSKQ0KbGlicmFyeShBRVIpDQpsaWJyYXJ5KHN0YXJnYXplcikNCmxpYnJhcnkoV1JURFN0aWRhbCkNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShrYWJsZUV4dHJhKQ0KbGlicmFyeShxdWFudHJlZykNCmxpYnJhcnkoUG9ncm9tY3lEYW55Y2gpDQpsaWJyYXJ5KGRwbHlyKSANCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkocm1kZm9ybWF0cykNCmxpYnJhcnkoIHN0cmluZ3IpDQoNCmBgYA0KDQojIFphZGFuaWUNCg0KKipTdHfDs3J6IG1vZGVsIG9iamHFm25pYWrEhWN5IMWbcmVkbmllIHd5YmFncm9kemVuaWEuKioNCg0KKipXeWtvbmFqOioqDQoNCjEpICBwb3LDs3duYW5pZSBLTU5LIG9yYXogcmVncmVzamkga3dhbnR5bG93ZWogKHLDs8W8bm8tcG96aW9tb3dlaikgZGxhDQogICAgem1pZW5uZWogImVhcm5pbmdzIiAtIHd5bmFncm9kemVuaWEuDQoyKSAgRG9iaWVyeiBpIHByemV0ZXN0dWogcHJlZHlrdG9yeSwga3dhbnR5bGUgZGxhIG1vZGVsaS4NCjMpICBXeWtvbmFqIHRlc3R5IHLDs8W8bmljIHdzcMOzxYJjenlubmlrb3cgZGxhIGZpbmFsbnljaCBtb2RlbGkuDQoNCioqRGFuZSB6IENQU1NXOTI5ODoqKg0KDQotICAgZWFybmluZ3MgLSAqKsWbcmVkbmllIHd5bmFncm9kemVuaWUgdyBcJC9nb2R6aW5lIC0qKiAoYXZlcmFnZSBob3VybHkNCiAgICBlYXJuaW5ncyAoc3VtIG9mIGFubnVhbCBwcmV0YXggd2FnZXMsIHNhbGFyaWVzLCB0aXBzLCBhbmQgYm9udXNlcywNCiAgICBkaXZpZGVkIGJ5IHRoZSBudW1iZXIgb2YgaG91cnMgd29ya2VkIGFubnVhbGx5KS4pDQotICAgZGVncmVlIC0gKipzdG9waWXFhCBlZHVrYWNqKippIC0gc3prb8WCYSDFm3JlZG5pYSBsdWIgbGljZW5jamF0IChmYWN0b3INCiAgICBpbmRpY2F0aW5nIGhpZ2hlc3QgZWR1Y2F0aW9uYWwgZGVncmVlICgiYmFjaGVsb3IiIG9yImhpZ2hzY2hvb2wiKS4pDQotICAgKiphZ2UqKiAtIHdpZWsgdyBsYXRhY2gNCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgaW5jbHVkZT1GQUxTRX0NCmRhdGEoIkNQU1NXOTI5OCIpDQpgYGANCg0KKipXeW5hZ3JvZHplbmlhIHpvc3RhbsSFIHphbW9kZWxvd2FuZSBvZGR6aWVsbmllIGRsYSByb2t1IDE5OTIgKGFua2lldGExKQ0Kb3JheiAxOTk4IChhbmtpZXRhMikuKioNCg0KYGBge3IgZWNobz1UUlVFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KYW5raWV0YTEgPC0gc3Vic2V0KENQU1NXOTI5OCwgeWVhcj09IjE5OTIiKQ0KYW5raWV0YTIgPC0gc3Vic2V0KENQU1NXOTI5OCwgeWVhcj09IjE5OTgiKQ0KYGBgDQoNCiMgTU9ERUxFIC0gUE9Sw5NXTkFOSUUNCg0KIyMgTW9kZWwgS05NSw0KDQoqKk5hIHBvZHN0YXdpZSBtb2RlbHUgS01OSyBzdHdpZXJkemFteSwgxbxlIHcgMTk5MiBpIDE5OTggd3N6eXN0a2llDQp6bWllbm5lIG9iamHFm25pYWrEhWNlIC0gc3RvcGllxYQgZWR1a2FjamksIHDFgmXEhyBvcmF6IHdpZWsgaXN0b3RuaWUNCndwxYJ5d2HFgnkgbmEgcG96aW9tIHd5bmFncm9kemXFhCoqLg0KDQotICAgV3JheiB6IHp3acSZa3N6ZW5pZW0gcG96aW9tdSBzd29qZWogZWR1a2FjamkgaSB6ZG9ieWNpZW0gbGljZW5jamF0dSwNCiAgICBwcnplY2nEmXRuZSB3eW5hZ3JvZHplbmlhIHp3acSZa3N6YcWCeSBzacSZIMWbcmVkbmlvIHcgMTk5MiByb2t1IG8gMzclICwNCiAgICBhIHcgMTk5OCBvIDM4JS4NCg0KLSAgIFcgMTk5MiByb2t1IEtvYmlldHkgd3pnbMSZZGVtIG3EmcW8Y3p5em4gdyBwcnplcGFkYW5laiBwcsOzYmllLA0KICAgIHphcmFiaWHFgnkgcHJ6ZWNpxJl0bmllIG1uaWVqIG8gMTclLiBOYXRvbWlhc3QgdyAxOTk4IHRhIHLDs8W8bmljYSB3DQogICAgemFyb2JrYWNoIHNpxJkgendpxJlrc3p5xYJhIGkgxZtyZWRuaWUgd3luYWdyb2R6ZW5pZSBrb2JpZXQgYnnFgm8NCiAgICBwcnplY2nEmXRuaWUgbmnFvHN6ZSBvIDE4JSBvZCB3eW5hZ3JvZHplbmlhIG3EmXpjenl6bi4NCg0KLSAgIFcgMTk5MiByb2t1IFdyYXogeiB3aWVraWVtLCBwcnplY2nEmXRuZSB3eW5hZ3JvZHplbmlhIHp3acSZa3N6YWrEhSBzacSZDQogICAgbyAyNiUuIFcgMTk5OCByLiB3cmF6IHplIHN0YXJ6ZW5pZW0gc2nEmSB0em4uIHoga2HFvGRueW0ga29sZWpueW0NCiAgICByb2tpZW0sIGFua2lldG93YW5pIHphcmFiaWFsaSDFm3JlbmRpbyBvIDIxJSB3acSZY2VqLg0KDQojIyMgZGxhIDE5OTIgcm9rdQ0KDQpgYGB7ciBlY2hvPVRSVUV9DQpsbTEgPC0gbG0obG9nKGVhcm5pbmdzKSB+IGRlZ3JlZSArIGdlbmRlciArIGFnZSwgZGF0YSA9IGFua2lldGExKSAgIyBjb25zdCBuaWUgamVzdCBpc3RvdG5hIGN6eWxpIHJvemvFgmFkIGplc3Qgc2tvxZtueSwgd2nEmWNlaiBsdWR6aSB6YXJhYmlhIHdpxJljZWogbmnFvCBtbmllaiwgRExBVEVHTyAgem1pZW5uYSBlYXJuaW5ncyBqZXN0IHcgbG9nYXJ5dG1pZSAhIQ0Kc3VtbWFyeShsbTEpDQpgYGANCg0KIyMjIGRsYSAxOTk4IHJva3UNCg0KYGBge3J9DQpsbTIgPC0gbG0obG9nKGVhcm5pbmdzKSB+IGRlZ3JlZSArIGdlbmRlciArIGFnZSwgZGF0YSA9IGFua2lldGEyKQ0Kc3VtbWFyeShsbTIpDQpgYGANCg0KIyMgTW9kZWwgcmVncmVzamkga3dhbnR5bG93ZWoNCg0KIyMjIGRsYSAxOTkyIHJva3UNCg0KYGBge3J9DQprd2FudHlsZTEgPC0gYygwLjI1LCAwLjUwLCAwLjc1KQ0KcmVnX2t3YW50eWxvd2ExIDwtIHJxKGxvZyhlYXJuaW5ncykgfiBkZWdyZWUgKyBnZW5kZXIgKyBhZ2UsdGF1ID0ga3dhbnR5bGUxLGRhdGEgPSBhbmtpZXRhMSkNCnN1bW1hcnkocmVnX2t3YW50eWxvd2ExLCBzZSA9ICJib290IikNCmBgYA0KDQojIyMgZGxhIDE5OTggcm9rdQ0KDQpgYGB7cn0NCmt3YW50eWxlMiA8LSBjKDAuMjUsIDAuNTAsIDAuNzUpDQpyZWdfa3dhbnR5bG93YTIgPC0gcnEobG9nKGVhcm5pbmdzKSB+IGRlZ3JlZSArIGdlbmRlciArIGFnZSx0YXUgPSBrd2FudHlsZTIsZGF0YSA9IGFua2lldGEyKQ0Kc3VtbWFyeShyZWdfa3dhbnR5bG93YTIsIHNlID0gImJvb3QiKQ0KYGBgDQoNCiMjIyBJbnRlcnByZXRhY2phIG9zemFjb3dhxYQgKDAuMjUsMC41LDAuNzUpDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHBhZ2VkLnByaW50PVRSVUV9DQpxMjUgPC0gcnEobG9nKGVhcm5pbmdzKSB+IGRlZ3JlZSArIGdlbmRlciArIGFnZSwgZGF0YSA9IGFua2lldGExLCB0YXUgPSAwLjI1KQ0KcTUwIDwtIHJxKGxvZyhlYXJuaW5ncykgfiBkZWdyZWUgKyBnZW5kZXIgKyBhZ2UsIGRhdGEgPSBhbmtpZXRhMSwgdGF1ID0gMC41MCkNCnE3NSA8LSBycShsb2coZWFybmluZ3MpIH4gZGVncmVlICsgZ2VuZGVyICsgYWdlLCBkYXRhID0gYW5raWV0YTEsIHRhdSA9IDAuNzUpDQoNCnN0YXJnYXplcihxMjUsIHE1MCwgcTc1LCB0aXRsZSA9ICJXeW5pa2kgcmVncmVzamkga3dhbnR5bG93eWNoIHcgMTk5MnIuIiwgdHlwZSA9ICJ0ZXh0IikNCmBgYA0KDQpXc3p5c3RraWUgem1pZW5uZSBpc3RvdG5pZSB3cMWCeXdhasSFIG5hIHByemVjacSZdG5lIHd5bmFncm9kemVuaWEgdyAxOTkyci4NCg0KUmVncmVzamEga3dhbnR5bG93YSBwb3p3b2xhIGRvc3RyemVjIHLDs8W8bmljZSBtacSZZHp5IHphbGXFvG5vxZtjaWFtaSBkbGENCnphcmFiaWFqxIVjeWNoIG5ham1uaWVqIGkgbmFqd2nEmWNlai4NCg0KLSAgIFcgcHJ6eXBhZGt1IHdwxYJ5d3UgcMWCY2kgbmEgemFyb2JraSwgd2lkemlteSwgxbxlIGRsYSB6YXJhYmlhasSFY3ljaCB3DQogICAgcGllcndzemVqIMSHd2lhcnRjZSwga29iaWV0eSB6YXJhYmlhxYJ5IMWbcmVkbmlvIG1uaWVqIG8gMTQsMiUgdw0KICAgIHN0b3N0dW5rdSBkbyBtxJnFvGN6eXouIE5hdG9taWFzdCByb3pwYXJ0dWrEhWMgZ3J1cGUgemFyYWJpYWrEhWN5Y2gNCiAgICBuYWp3acSZY2VqLCB0em4uIGFua2lldG93YW55Y2ggeiBvc3RhdG5pZWogxId3aWF0a2ksIGtvYmlldHkgemFyYWJpYcWCeQ0KICAgIHByemVjacSZdG5pZSBtbmllaiBvIDE4LDQlIG5pxbwgbcSZxbxjennFum5pLiBaYXRlbSBpbSB3ecW8c3plIHphcm9ia2kgdHltDQogICAgcsOzxbxuaWNlIHcgd3luYWdyb2R6ZW5pYWNoIGtvYmlldCBpIG3EmcW8Y3p5em4gc8SFIHdpxJlrc3plLiBJbmFjemVqDQogICAgbW/FvG5hIHBvd2llZHppZcSHLCDFvGUgcHJ6eSBuacW8c3p5Y2ggc3Rhd2thY2ggZHlza3J5bWlhY2phIHplIHd6Z2zEmWR1DQogICAgbmEgcMWCZcSHIGplc3QgbW5pZWpzemEuDQoNCi0gICBSb3p3YcW8YWrEhWMgd3DFgnl3IHBvemlvbXUgZWR1a2FjamksIFcgcHJ6eXBhZGt1IG9zw7NiIHphcmFiaWFqxIVjeWNoDQogICAgbmFqbW5pZWogKHBpZXJ3c3phIMSHd2lhcnRrYSksIGplxbxlbGkgYW5raWV0b3dhbnkgcG9zaWFkYcWCIHN0b3BpZcWEDQogICAgbGljZW5jamF0YSDFm3JlbmRpZSB6YXJvYmtpIGJ5xYJ5IHByemVjacSZdG5pZSB3ecW8c3plIG8gNDElIHcgcG9yw7N3YW5pdQ0KICAgIGRvIG9zw7NiIG8gxZtyZWRuaW0gd3lrc3p0YcWCY2VuaXUuIERsYSBvc8OzYiB6YXJhYmlhasSFY3ljaCBuYWp3acSZY2VqIHRhDQogICAgcsOzxbxuaWNhIHcgemFsZcW8bm/Fm2NpIG9kIHBvc2lvbXUgd3lrc3p0YcWCY2VuaWEgYnnFgmEgbW5pZWpzemEsIGdkecW8DQogICAgc3RvcG5pZcWEIGxpY2VuY2NqYXRhIGRhd2HFgiBwcnplY2nEmXRuaWUgd3nFvHN6ZSB6YXJvYmtpIG8gMzUlLiBaYXRlbQ0KICAgIG1vxbxuYSB3bmlvc2tvd2HEhywgxbxlIGdkeSBzacSZIHphcmFiaWEgd2nEmWNlaiwgc3RvcGllxYQgd3lrc3p0YcWCY2VuaWEgdw0KICAgIG1uaWVqc3p5bSBzdG9wbml1IHByenljenluaWEgc2nEmSBkbyB3enJvc3R1IHphcmFvYmvDs3cgbmnFvCBuYQ0KICAgIHBvemlvbWllIG5pc2tpY2ggd3luYWdyb2R6ZcWELg0KDQotICAgUm96cGF0cnVqxIVjIHdwxYJ5dyB3aWVrdSBuYSB6YXJvYmtpIHdpZHppbXksIMW8ZSBkbGEgb3PDs2IgbcWCb2R5Y2gNCiAgICBrYcW8ZG55IGtvbGVqbnkgcm9rIGtpZWR5IHN0YWrEhSBzacSZIHN0YXJzaSwgemFyb2JraSBiecWCeSB3acSZa3N6ZSBvDQogICAgMiwyJS4gTmF0b21pYXN0IGRsYSBncnVweSB6YXJhYmlhamFjeWNoIHcgcHJ6ZWR6aWFsZSDFm3JvZGtvd3ltDQogICAgKDMwbGF0IGkgd2nEmWNlaiksIHdyYXogeiB3aWVraWVtIHd5bmFncm9kemVuaWEgYnnFgnkgd3nFvHN6ZSBvIDMlLg0KICAgIFphdGVtIG1vxbxuYSBkb3N0cnplYywgxbxlIGRsYSBncnVweSBvc8OzYiBuYWptxYJvZHN6eWNoIHfFm3LDs2QgYmFkYW55Y2gsDQogICAgd3pyb3N0IGRvY2hvZMOzdyBiecWCIG1uaWVqc3p5IHdyYXogd2lla2llbSwgbmnFvCBkbGEgb3PDs2Iga3TDs3JlIG1pYcWCeQ0KICAgIHdpxJljZWogbmnFvCAzMCBsYXQuDQoNCmBgYHtyfQ0KbWVkaWFuKGFua2lldGExJGFnZSkNCmBgYA0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBwYWdlZC5wcmludD1UUlVFfQ0KcXEyNSA8LSBycShsb2coZWFybmluZ3MpIH4gZGVncmVlICsgZ2VuZGVyICsgYWdlLCBkYXRhID0gYW5raWV0YTIsIHRhdSA9IDAuMjUpDQpxcTUwIDwtIHJxKGxvZyhlYXJuaW5ncykgfiBkZWdyZWUgKyBnZW5kZXIgKyBhZ2UsIGRhdGEgPSBhbmtpZXRhMiwgdGF1ID0gMC41MCkNCnFxNzUgPC0gcnEobG9nKGVhcm5pbmdzKSB+IGRlZ3JlZSArIGdlbmRlciArIGFnZSwgZGF0YSA9IGFua2lldGEyLCB0YXUgPSAwLjc1KQ0KDQpzdGFyZ2F6ZXIocXEyNSwgcXE1MCwgcXE3NSwgdGl0bGUgPSAiV3luaWtpIHJlZ3Jlc2ppIGt3YW50eWxvd3ljaCB3IDE5OThyLiIsIHR5cGUgPSAidGV4dCIpDQpgYGANCg0KIyMjIFRhYmVsYS4gUG9yw7N3bmFuaWUgd3Nww7PFgmN6eW5uaWvDs3cNCg0KUG9yw7N3bmFuaWUgd3Nww7PFgmN6eW5uaWvDs3cgdyBtb2RlbHUgS01OSyBpIHJlZ3Jlc2ppIGt3YW50eWxvd2VqICgwLjEsDQowLjI1LCAwLjUsIDAuNzUsIDAuOTAsIDAuOTUpKQ0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KdGF1cyA8LSBjKDAuMSwgMC4yNSwgMC41LCAwLjc1LCAwLjkwLCAwLjk1KQ0KZml0czEgPC0gZGF0YS5mcmFtZSgNCiAgICBjb2VmKGxtKGxvZyhlYXJuaW5ncykgfiBkZWdyZWUgKyBnZW5kZXIgKyBhZ2UsIGRhdGEgPSBhbmtpZXRhMSkpLA0KICAgIHNhcHBseSh0YXVzLCBmdW5jdGlvbih4KSBjb2VmKHJxKGZvcm11bGEgPSBsb2coZWFybmluZ3MpIH4gZGVncmVlICsgZ2VuZGVyICsgYWdlLCBkYXRhID0gYW5raWV0YTEsIHRhdSA9IHgpKSkpDQpuYW1lcyhmaXRzMSkgPC0gYygiT0xTIiwgc3ByaW50ZigiJFxcdGF1X3slMC4yZn0kIiwgdGF1cykpDQpuZiA8LSBuY29sKGZpdHMxKQ0Ka25pdHI6OmthYmxlKGZpdHMxLCBmb3JtYXQgPSAiaHRtbCIsIGNhcHRpb24gPSAiT3N6YWNvd2FuaWEgeiBLTU5LIG9yYXogYHF1YW50cmVnYCBkbGEgcm9rdSAxOTkyIikgJT4lDQogICAga2FibGVfc3R5bGluZygic3RyaXBlZCIpICU+JQ0KICAgIGNvbHVtbl9zcGVjKDE6OCwgYmFja2dyb3VuZCA9ICIjZWNlY2VjIikNCmBgYA0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBwYWdlZC5wcmludD1GQUxTRX0NCmZpdHMyIDwtIGRhdGEuZnJhbWUoDQogICAgY29lZihsbShsb2coZWFybmluZ3MpIH4gZGVncmVlICsgZ2VuZGVyICsgYWdlLCBkYXRhID0gYW5raWV0YTIpKSwNCiAgICBzYXBwbHkodGF1cywgZnVuY3Rpb24oeCkgY29lZihycShmb3JtdWxhID0gbG9nKGVhcm5pbmdzKSB+IGRlZ3JlZSArIGdlbmRlciArIGFnZSwgZGF0YSA9IGFua2lldGExLCB0YXUgPSB4KSkpKQ0KbmFtZXMoZml0czIpIDwtIGMoIk9MUyIsIHNwcmludGYoIiRcXHRhdV97JTAuMmZ9JCIsIHRhdXMpKQ0KbmYgPC0gbmNvbChmaXRzMikNCmtuaXRyOjprYWJsZShmaXRzMiwgZm9ybWF0ID0gImh0bWwiLCBjYXB0aW9uID0gIk9zemFjb3dhbmlhIHogS01OSyBvcmF6IGBxdWFudHJlZ2AgZGxhIDE5OTggcm9rdSAiKSAlPiUNCiAgICBrYWJsZV9zdHlsaW5nKCJob3ZlciIpICU+JQ0KICAgIGNvbHVtbl9zcGVjKDE6OCwgYmFja2dyb3VuZCA9ICIjZWNlY2VjIikNCmBgYA0KDQojIFRFU1RZIFLDk8W7TklDIFdTUMOTxYFDWllOTklLw5NXDQoNCiMjIEJhZGFuaWUgc3RhdHlzdHljem5laiByw7PFvG5pY3kgbWnEmWR6eSAyNS4gaSA1MC4ga3dhbnR5bGVtIHdhcnVua293eW0gLSBUZXN0IFdhbGRhLg0KDQojIyMgdGVzdG93YW5pZSB3c3DDs2xuZSAoam9pbnQ9VFJVRSkNCg0KLSAgIERsYSByb2t1IDE5OTIgKGRhbmU9YW5raWV0YTEpIE5hIHBvZHN0YXdpZSBwb25pxbxzemVnbyB0ZXN0dSBuYQ0KICAgIGlzdG90bm/Fm8SHIHLDs8W8bmljeSBtacSZZHp5IDI1IGkgNTAga3dhbnR5bGVtIHdhcnVua293eW0sIG9kcnp1Y2FteQ0KICAgIGhpcG90ZXrEmSB6ZXJvd8SFLCBuYSByemVjeiBIMSwgcG9uaWV3YcW8IHAtdmFsdWVcPCBhbGZhPTAuMDUuIFphdGVtDQogICAgcsOzxbxuaWNhIHBvbWnEmWR6eSB3c3DDs8WCY3p5bm5pa2FtaSBkbGEgMjUgaSA1MCBrd2FudHlsdSBqZXN0DQogICAgc3RhdHlzdHljem5pZSBpc3RvdG5hLg0KLSAgIERsYSByb2t1IDE5OTggKGRhbmU9YW5raWV0YTIpIE5hIHBvZHN0d2llIHRlc3R1IFdhbGRhIHN0d2llcmR6YW15DQogICAgYnJhayBwb2RzdGF3IGRvIG9kcnp1Y2VuaWEgaGlwb3RlenkgemVyb3dlaiwgcG9uaWV3YcW8IHAtdmFsdWU9MC4yMTANCiAgICBcPiBhbGZhPTAuMDUuIENvIGplc3QgcsOzd25vem5hbmN6bmUgeiB0eW0sIMW8ZSB3c3DDs8WCY3p5bm5pa2kgZGxhDQogICAgb3N6YWNvd2HFhCB3IG1vZGVsdSBkbGEgMjUgaSA1MCBrd2FudHlsYSBzcGXFgm5pYWrEhSBwZXduZSBsaW5pb3dlDQogICAgb2dyYW5pY3plbmlhLiBCcmFrIGlzb3Rub8WbY2kgc3RhdHlzdHljem5lai4NCg0KYGBge3J9DQprd2FudHlsZTI8LSBjKDAuMjUsIDAuNTApDQpyZWdfa3dhbnR5bG93YTEgPC0gcnEobG9nKGVhcm5pbmdzKSB+IGRlZ3JlZSArIGdlbmRlciArIGFnZSx0YXUgPSBrd2FudHlsZTIsIGRhdGEgPSBhbmtpZXRhMSkNCmFub3ZhKHJlZ19rd2FudHlsb3dhMSwgdGVzdCA9ICJXYWxkIiwgam9pbnQ9VFJVRSkNCg0KcmVnX2t3YW50eWxvd2EyIDwtIHJxKGxvZyhlYXJuaW5ncykgfiBkZWdyZWUgKyBnZW5kZXIgKyBhZ2UsdGF1ID0ga3dhbnR5bGUyLCBkYXRhID0gYW5raWV0YTIpDQphbm92YShyZWdfa3dhbnR5bG93YTIsIHRlc3QgPSAiV2FsZCIsIGpvaW50PVRSVUUpDQoNCmBgYA0KDQojIyBCYWRhbmllIHN0YXR5c3R5Y3puZWogcsOzxbxuaWN5IG1pxJlkenkgMjUsIDUwIGkgNzUga3dhbnR5bGVtIHdhcnVua293eW0gLSBUZXN0IFdhbGRhDQoNCiMjIyB0ZXN0b3dhbmllIHdzcMOzbG5lIChqb2ludD1UUlVFKQ0KDQotICAgZGxhIDE5OTJyDQoNCmBgYHtyfQ0Ka3dhbnR5bGUzIDwtIGMoMC4yNSwgMC41MCwgMC43NSkNCg0KcmVnX2t3YW50eWxvd2EzIDwtIHJxKGxvZyhlYXJuaW5ncykgfiBkZWdyZWUgKyBnZW5kZXIgKyBhZ2UsIHRhdSA9IGt3YW50eWxlMywgZGF0YSA9IGFua2lldGExKQ0KYW5vdmEocmVnX2t3YW50eWxvd2EzLCB0ZXN0ID0gIldhbGQiLCBqb2ludD1UUlVFKQ0KDQpgYGANCg0KLSAgIGRsYSAxOTk4cg0KDQpgYGB7cn0NCnJlZ19rd2FudHlsb3dhNCA8LSBycShsb2coZWFybmluZ3MpIH4gZGVncmVlICsgZ2VuZGVyICsgYWdlLCB0YXUgPSBrd2FudHlsZTMsIGRhdGEgPSBhbmtpZXRhMikNCmFub3ZhKHJlZ19rd2FudHlsb3dhNCwgdGVzdCA9ICJXYWxkIiwgam9pbnQ9VFJVRSkNCg0KYGBgDQoNClV6eXNrYW5vIHd5bmlraSBwb2RvYm5lIGNvIGRsYSB0ZXN0w7N3IGRsYSBkd29jaCBrd2FudHlsaS4NCg0KRGxhIHJva3UgMTk5MiBvZHJ6dWNhbXkgSG8sIG5hIHJ6ZWN6IGhpcG90ZXp5IGFsdGVybmF0eXduZWoNCihwLXZhbHVlXDwwLjA1KSwgemF0ZW0gaXN0bmllasSFIGlzdG90bmUgcsOzxbxuaWNlIHBvbWnEmWR6eSB3c3DDs8WCY3p5bm5pa2FtaQ0KZGxhIG9zw7NiIHphcmFiaWFqxIVjeWNoIHcgcGllcndzenltIGt3YW50eWx1IDAuMjUsIG1lZGlhbmllIGkgdHljaA0KemFyYWJpYWrEhWN5Y2ggbmFqd2nEmWNlai4gTmF0b21pYXN0IHRha2llIHLDs8W8bmljZSB3IHJva3UgMTk5OCAib3PFgmFiacWCeQ0Kc2nEmSIgaSB3eXN0xJlwbHVqxIUgcHJ6eSB6YcWCb8W8ZW5pdSBpc3RvdG5vxZtjaSBhbGZhPTEwJSAocC12YWx1ZT0wLjA1MDY0KS4NCg0KIyMgVGVzdCBXQUxEQSAtIFRlc3Rvd2FuaWUgb2RkemllbG5lIChqb2ludD1GQUxTRSkNCg0KIyMjIyBUZXN0IGRsYSByw7PFvG5pYyBtacSZZHp5IGR3b21hIGt3YW50eWxhbWkgMjUgaSA1MA0KDQpgYGB7cn0NCmFub3ZhKHJlZ19rd2FudHlsb3dhMSwgdGVzdCA9ICJXYWxkIiwgam9pbnQ9RkFMU0UpDQphbm92YShyZWdfa3dhbnR5bG93YTIsIHRlc3QgPSAiV2FsZCIsIGpvaW50PUZBTFNFKQ0KYGBgDQoNCiMjIyMgVGVzdCBkbGEgcsOzxbxuaWMgbWnEmWR6eSB0cnplbWEga3dhbnR5bGFtaSAyNSw1MCBpIDc1DQoNCmBgYHtyfQ0KYW5vdmEocmVnX2t3YW50eWxvd2EzLCB0ZXN0ID0gIldhbGQiLCBqb2ludD1GQUxTRSkNCmFub3ZhKHJlZ19rd2FudHlsb3dhNCwgdGVzdCA9ICJXYWxkIiwgam9pbnQ9RkFMU0UpDQpgYGANCg0KTmEgcG9kc3Rhd2llIHBvd3nFvHN6eWNoIHRlc3TDs3cgemF1d2HFvGFteSwgxbxlIGRsYSBvc3phY293YcWEIGRsYSAxOTk4IHJva3UNCnd5c3TEmXB1amUgYnJhayBpc3RvdG55Y2ggcsOzxbxuaWMgcG9tacSZZHp5IHdzcMOzxYJjenlubmlrYW1pIGRsYSB3eWJyYW55Y2gNCmt3YW50eWxpLCB3IHByemVjaXdpZcWEc3R3aWUgZG8gcm9rdSAxOTkyLCBraWVkeSB0YWtpIHLDs8W8bmljZSBiecWCeQ0Kc3RhdHlzdHljem5pZSBpc3RvdG5lLg0KDQojIERvYnJvxIcgZG9wYXNvd2FuaWEgdnMgUi1rd2FkcmF0DQoNCiMjIyMgUG9yw7N3YW5pZSBSXF4yIGkgZG9icm9jaSBkb3Bhc293YW5pYSB3IG1vZGVsYWNoIEtNTksgaSByZWdyZXNqaSBrd2FudHlsb3dlaiBkbGEgZGFueWNoIHogcm9rdSAxOTkyDQoNCkRvYnJvxIcgZG9wYXNvd2FuaWEgZGxhIG1vZGVsdSBrd2FudHlsb3dlZ28gKDE5OTIpDQoNCmBgYHtyfQ0KIyMgbW9kZWwga3dhbnR5bG93eSBkbGEgMTk5MiANCm1vZGVsX2t3YW50eWxvd3lfMTk5MiA8LSBycShsb2coZWFybmluZ3MpIH4gZGVncmVlICsgZ2VuZGVyICsgYWdlLHRhdSA9IDAuNSwgZGF0YSA9IGFua2lldGExKQ0KcmVzenR5MSA8LSByZXNpZChtb2RlbF9rd2FudHlsb3d5XzE5OTIpDQoNCiMjIGJlendhcnVua293eSAocHVzdHkpIG1vZGVsIGt3YW50eWxvd3kNCm1vZGVsMiA8LSBycShsb2coZWFybmluZ3MpIH4gMSwgdGF1ID0gMC41LGRhdGE9YW5raWV0YTEpICAgIyBtcGd+MSB0byBtb2RlbCB0eWxrbyB6IHN0YcWCxIUgY29uc3QgDQpyZXN6dHkyIDwtIHJlc2lkKG1vZGVsMikNCg0KZ29vZGZpdChyZXN6dHkxLCByZXN6dHkyLCAwLjk5OTk5OTkpDQpgYGANCg0KUi1rd2FkcmF0IChtb2RlbCBLTU5LKQ0KDQpgYGB7cn0NCiMjIHIyIG1vZGVsdSBLTU5LIGRsYSBwb3LDs3duYW5pYQ0KbW9kZWxfbG1fMTk5MjwtIGxtKGxvZyhlYXJuaW5ncykgfiBkZWdyZWUgKyBnZW5kZXIgKyBhZ2UsIGRhdGEgPSBhbmtpZXRhMSkNCg0Kc3VtbWFyeShtb2RlbF9sbV8xOTkyKSRyLnNxdWFyZWQNCmBgYA0KDQpMZXBpZWogd3lwYWRhIHJlZ3Jlc2phIGxpbmlvd2EgbmnFvCByZWdyZXNqYSBrd2FudHlsb3dhLCBwb25pZXdhxbwNClIta3dhZHJhdCBqZXN0IHd5xbxzemUuDQoNCiMjIFBvcsOzd2FuaWUgUlxeMiBpIGRvYnJvY2kgZG9wYXNvd2FuaWEgdyBtb2RlbGFjaCBLTU5LIGkgcmVncmVzamkga3dhbnR5bG93ZWogZGxhIGRhbnljaCB6IHJva3UgMTk5OA0KDQpEb2Jyb8SHIGRvcGFzb3dhbmlhIGRsYSBtb2RlbHUga3dhbnR5bG93ZWdvICgxOTk4KQ0KDQpgYGB7cn0NCiMjIG1vZGVsIGt3YW50eWxvd3kgZGxhIDE5OTgNCm1vZGVsX2t3YW50eWxvd3lfMTk5OCA8LSBycShsb2coZWFybmluZ3MpIH4gZGVncmVlICsgZ2VuZGVyICsgYWdlLHRhdSA9IDAuNSwgZGF0YSA9IGFua2lldGEyKQ0KDQpyZXN6dHkzIDwtIHJlc2lkKG1vZGVsX2t3YW50eWxvd3lfMTk5OCkNCg0KIyMgYmV6d2FydW5rb3d5IChwdXN0eSkgbW9kZWwga3dhbnR5bG93eQ0KbW9kZWw0IDwtIHJxKGxvZyhlYXJuaW5ncykgfiAxLCB0YXUgPSAwLjUsZGF0YT1hbmtpZXRhMikgICAjIG1wZ34xIHRvIG1vZGVsIHR5bGtvIHogc3RhxYLEhSBjb25zdCANCnJlc3p0eTQgPC0gcmVzaWQobW9kZWw0KQ0KDQpnb29kZml0KHJlc3p0eTMsIHJlc3p0eTQsIDAuOTk5OTApDQpgYGANCg0KUi1rd2FkcmF0IChtb2RlbCBLTU5LKQ0KDQpgYGB7cn0NCiMjIHIyIG1vZGVsdSBLTU5LIGRsYSBwb3LDs3duYW5pYQ0KbW9kZWxfbG1fMTk5OCA8LSBsbShsb2coZWFybmluZ3MpIH4gZGVncmVlICsgZ2VuZGVyICsgYWdlLCBkYXRhID0gYW5raWV0YTIpDQoNCnN1bW1hcnkobW9kZWxfbG1fMTk5OCkkci5zcXVhcmVkDQpgYGANCg0KRGwgYWRhbnljaCB6IHJva3UgMTk5OCByw7N3bmllxbwgbGVwaWVqIHd5cGFkYSByZWdyZXNqYSBsaW5pb3dhIEtNTksgbmnFvA0KcmVncmVzamEga3dhbnR5bG93YSwgcG9uaWV3YcW8IFJcXjI9MTgsMjglIGplc3Qgd2nEmWtzemUgb2QgbWllcm5pa2ENCmRvYnJvY2ppIGRvcGFzb3dhbmlhLg0KDQojIyBLcnl0ZXJpdW0gQUlDDQoNCmBgYHtyfQ0KQUlDKG1vZGVsX2xtXzE5OTIsbW9kZWxfa3dhbnR5bG93eV8xOTkyLG1vZGVsX2xtXzE5OTgsbW9kZWxfa3dhbnR5bG93eV8xOTk4KQ0KYGBgDQoNCktyeXRlcml1bSBBSUMgcsOzd25pZcW8IHBvdHdpZXJkemEsIMW8ZSBsZXBzenltIG1vZGVsZW0gdyBvYnUgbGF0YWNoIG9rYXphxYINCnNpxJkgbW9kZWwgcmVncmVzamkgbGluaW93ZWogKEtNTkspLg0KDQojIERPREFUS09XRSBQT1LDk1dOQU5JRSBNT0RFTEkNCg0KIyMgTW9kZWwgS01OSyB2cyBNb2RlbCBNZWRpYW5vd3kNCg0KYGBge3J9DQojaW5zdGFsbC5wYWNrYWdlcygic2pQbG90IikNCmxpYnJhcnkoc2pQbG90KQ0KYGBgDQoNClBvbmnFvHN6ZSBncmFmaWN6bmUgcG9yw7N3bmFuaWUgbW9kZWxpIHBvemF3YWxhIG5hIHpvYmFyYXpvd2FuaWUgcsOzxbxuaWMNCm9zemFjb3dhxYQgcGFyYW1ldHLDs3cuIER6acSZa2kgdGVtZXUgbW/FvG5hIHppZGVudHlmaWtvd2HEhyBjenkgbW9kZWwNCmxpbmlvd3kgbmllZG9zemFjb3d5d2HFgiBsdWIgcHJ6ZXN6YWNvd3l3YcWCIHBhcmFtZXRyeSB3emdsxJlkZW0gbWVkaWFueSwNCmt0w7NyYSBtb8W8ZSBiecSHIGxlcHN6xIUgbWlhcsSFIHcgb21hd2lhbnltIHByenlrxYJhZHppZS4NCg0KIyMjIyMgxZtyZW5kaWEsIG1lZGlhbmEsIGhpc3RvZ3JhbSB3eW5hZ3JvZHplxYQNCg0KYGBge3J9DQptZWFuKGFua2lldGExJGVhcm5pbmdzKQ0KbWVkaWFuKGFua2lldGExJGVhcm5pbmdzKQ0KaGlzdChhbmtpZXRhMSRlYXJuaW5ncykNCg0KYGBgDQoNCmBgYHtyfQ0KdGhlbWVfc2V0KHRoZW1lX2J3KCkpDQpwbG90X21vZGVscygNCiAgbW9kZWxfbG1fMTk5Mixtb2RlbF9rd2FudHlsb3d5XzE5OTIsDQogIHNob3cudmFsdWVzID0gVFJVRSwNCiAgbS5sYWJlbHMgPSBjKCJtb2RlbCBsaW5pb3d5IiwgIm1vZGVsIG1lZGlhbm93eSIpLA0KIGxlZ2VuZC50aXRsZT0gIlR5cCBtb2RlbHUiLA0KICB0aXRsZSA9ICJQb3LDs3duYW5pZSBtb2RlbGkgcHJ6ZWNpxJl0bnljaCB3eW5hZ3JvZHplxYQgZGxhIHJva3UgMTk5MiINCikNCmBgYA0KDQpgYGB7cn0NCnRoZW1lX3NldCh0aGVtZV9idygpKQ0KcGxvdF9tb2RlbHMoDQogIG1vZGVsX2xtXzE5OTgsbW9kZWxfa3dhbnR5bG93eV8xOTk4LA0KICBzaG93LnZhbHVlcyA9IFRSVUUsDQogIG0ubGFiZWxzID0gYygibW9kZWwgbGluaW93eSIsICJtb2RlbCBtZWRpYW5vd3kiKSwNCiAgbGVnZW5kLnRpdGxlPSAiVHlwIG1vZGVsdSIsDQogIHRpdGxlID0gIlBvcsOzd25hbmllIG1vZGVsaSBwcnplY2nEmXRueWNoIHd5bmFncm9kemXFhCBkbGEgcm9rdSAxOTk4Ig0KKQ0KYGBgDQoNCmBgYHtyfQ0KcXcyNSA8LSBycShsb2coZWFybmluZ3MpIH4gZGVncmVlICsgZ2VuZGVyICsgYWdlLCBkYXRhID0gYW5raWV0YTIsIHRhdSA9IDAuMjUpDQpxdzUwIDwtIHJxKGxvZyhlYXJuaW5ncykgfiBkZWdyZWUgKyBnZW5kZXIgKyBhZ2UsIGRhdGEgPSBhbmtpZXRhMix0YXUgPSAwLjUwKQ0KcXc3NSA8LSBycShsb2coZWFybmluZ3MpIH4gZGVncmVlICsgZ2VuZGVyICsgYWdlLCBkYXRhID0gYW5raWV0YTIsdGF1ID0gMC43NSkNCnRoZW1lX3NldCh0aGVtZV9idygpKQ0KcGxvdF9tb2RlbHMoDQogIG1vZGVsX2xtXzE5OTIscTI1LHE1MCxxNzUsDQogIHNob3cudmFsdWVzID0gVFJVRSwNCiAgbS5sYWJlbHMgPSBjKCJtb2RlbCBsaW5pb3d5IiwgIlEyNSUiLCAiUTUwJSIsICJRNzUlIiksDQogIGxlZ2VuZC50aXRsZT0gIlR5cCBtb2RlbHUiLA0KICB0aXRsZSA9ICJQb3LDs3duYW5pZSBtb2RlbGkgcHJ6ZWNpxJl0bnljaCB3eW5hZ3JvZHplxYQgZGxhIHJva3UgMTk5MiB6IHV6Z2zEmWRuaWVuZWllbSBtb2RlbGkga3dhbnR5bG93eWNoIGRsYSBRMjUsIFE1MCBpIFE3NSIpKw0KICB5bGFiKCJQcnplY2nEmXRuZSB3eW5hZ3JvZHplbmlhICIpDQoNCg0KdGhlbWVfc2V0KHRoZW1lX2J3KCkpDQpwbG90X21vZGVscygNCiAgbW9kZWxfbG1fMTk5OCxxdzI1LHF3NTAscXc3NSwNCiAgc2hvdy52YWx1ZXMgPSBUUlVFLA0KICBtLmxhYmVscyA9IGMoIm1vZGVsIGxpbmlvd3kiLCAiUTI1JSIsICJRNTAlIiwgIlE3NSUiKSwNCiAgbGVnZW5kLnRpdGxlPSAiVHlwIG1vZGVsdSIsDQogIHRpdGxlID0gIlBvcsOzd25hbmllIG1vZGVsaSBwcnplY2nEmXRueWNoIHd5bmFncm9kemXFhCBkbGEgcm9rdSAxOTk4IHogdXpnbMSZZG5pZW5laWVtIG1vZGVsaSBrd2FudHlsb3d5Y2ggZGxhIFEyNSwgUTUwIGkgUTc1IikrDQogIHlsYWIoIlByemVjacSZdG5lIHd5bmFncm9kemVuaWEgIikNCmBgYA0KDQojIyBHcmFmaWN6bmUgcHLDs3duYW5pZSBqYWsgb2JqYcWbbmlhbmUgemphd2lza28gcsOzxbxuaSBzacSZIHcgemFsZcW8bm/Fm2NpIG9kIGRlY3lsYSBvcmF6IGpha2llIHduaW9za2kgbW/FvG5hIHd5c251xIcgeiBwb3LDs3dhbmFuaWEgd3luaWvDs3cgZG8gxZtyZW5kaWVqIChLTU5LKS4NCg0KRGxhIHVwcm9zemN6ZW5pYSBuYSBvc2kgWCBzxIUgemFyb2JraSB3IFtcJC9oXS4gT8WbIE9ZIG9kendpZXJjaWVkbGFqxIUNCndzcMOzxYJjenlubmlraSBkbGEgcG9zemN6ZWfDs2xueWNoIGRlY3lsaS4gQ3plcndvbmEgY2nEhWfFgmEgbGluaWEgdG8gcG96aW9tDQrFm3JlZG5pZWogKE9MUykuDQoNCmBgYHtyfQ0KcSA8LSBycShlYXJuaW5ncyB+IGRlZ3JlZSsgKyBnZW5kZXIgKyBhZ2UsIGRhdGEgPSBhbmtpZXRhMSwgdGF1ID0gc2VxKDAuMSwwLjksYnk9MC4xKSkNCg0Kc3VtbWFyeShxKSU+JQ0KICBwbG90KCkNCg0KYGBgDQoNCi0gICBXeWtyZXMgcG96aW9tdSBlZHVrYWNqaSAoZGVncmVlKQ0KDQpOYSB3eWtyZXNpZSB3aWR6aW15ICwgxbxlIGltIHdpxJljZWogYW5raWV0b3dhbmkgemFyYWJpYWxpLCB0eW0gd3DFgncNCnN0b3BuaWEgZWR1a2FjamkgYnnFgiBzaWxuaWVqc3p5IGRvZGF0bmlvIC0gQ3phcm5hIGxpbmlhIGplc3Qgcm9zbsSFY2EuDQpSw7PFvG5pY2UgcG9tacSZZHp5IHphcm9ia2FtaSwgYSB3IHdwxYJ5d2VtIHBvc2lhZGFuaWEgbGljZW5jamF0dSBiecWCeQ0Kd2nEmWtzemUgcHJ6eSB3ecW8c3p5Y2ggcG96aW9tYWNoIHDFgmFjLg0KDQpEb2Rha3Rvd28gZGxhIHd5bmFncm9kemXFhCBwb25pxbxlaiBtZWRpYW55IGVzdHltYWNqYSBtb2RlbGVtIHJlZ3Jlc2ppDQpsaW5pb3dlaiBqZXN0IHByemVzemFjb3dhbmEsIGEgZGxhIHphcmJpYWrEhWN5Y2ggcG93ecW8ZWogbWVkaWFueSBtb2RlbA0KS01OSyBuaWVkb3N6YWNvd2F5d2HFgiBwYXJhbXRlcnkuIChjemVyd29uYSBwcm9zdGEgcG9uacW8ZWogY3phcm5laikuDQoNCi0gICAqKld5a3JlcyB3eW5hZ3JvZHplbmlhXH5wxYJlxIcqKg0KDQpSZWdyZXNqYSBwcm9zdGEsIGt0w7NyYSB3eXpuYWN6YSBwYXJhbWV0cnkgbW9kZWx1IG5hIHBvZHN0YXdpZSB3YXJ0b8WbY2kNCsWbcmVkbmljaCAobWVhbiksIHByemVzemFjb3d5d2HFgnkgbmVnYXR5d255IHdwxYJ5dyBwxYJjaSBuYSB6YXJvYmlraSB3DQpncnVwaWUgemFyYWJhaWrEhWN5Y2ggbmFqbW5pZWouIE5hIHd5a3Jlc2llIG1vxbxuYSB6YW9uc2Vyd293YWMsIMW8ZSB3DQpncnVwaWUgMTAlIG5ham1uaWVqIHphcmFiaWFqxIVjeWNoLCBrb2JpZXR5IHphcmFiaWHFgnkgamVkeW5pZSDFm3JlZG5pbw0KMCw1XCQvaCBtbmllaiBuacW8IG3EmcW8Y3p5xbpuaS4gSmVkbm93Y3plxZtuaWUgS01OSyBuaWVkb3N6YWNvd3l3YcWCbw0KbmVnYXR5d25lZ28gd3DFgnl3dSBwxYJjaSBuYSB6YXJvYmtpLCBpbmFjemVqIGtsYXN5Y3pueSBtb2RlbCB6YW5pxbxhxYINCmR5c2tyeW1pbmFjamUgcMWCY2lvd8SFLlcgZ3J1cGllIDEwJSBvc8OzYiBuYWp3aWVjZWogemFyYWJpYWrEhWN5Y2gsIHRhbQ0KxZtyZWRuaW8ga29iaWV0eSB6YXJhYmlhxYJ5IG1uaWVqIG8gMyw0LTMsNmRvbGFyw7N3L2guDQoNCk5pZSBtYSB0YWtpZWdvIHByemVkemlhxYJ1IHphcm9ia8OzdywgdyBrdMOzcnltIGtvYmlldHkgemFyYWJpxYJ5IGJ5IHdpxJljZWoNCm5pxbwgbcSZxbxjennFum5pLg0KDQotICAgKipXeWtyZXMgemFsZcW8bm/Fm2NpIHd5bmFncm9kemXFhCBpIHdpZWt1KioNCg0KVyBvcGFyY2l1IG8gcG93ecW8c3p5IHd5a3JlcyBkb3N0cnplZ2FteSwgxbxlIG1vZGVsIEtNTksgemF3ecW8YcWCIHBhcmFtZXRyDQpkbGEgem1pZW5uZWogd2llayBkbGEgZ3J1cCBhbmtpZXRvd2FueWNoIHphcmFiaWFqxIVjeWNoIHBvbmnFvGVqIG1lZGlhbnksDQpuYXRvbWlhc3QgemFuacW8YcWCIHRlbiBwYXJhbWV0ciB3IHByemVkemlhxYJhY2ggd3luYWdyb2R6ZcWEIHBvd3nFvGVqDQptZWRpYW55Lg0K