## Warning: pakiet 'CVXR' został zbudowany w wersji R 4.4.2
## Warning: pakiet 'AER' został zbudowany w wersji R 4.4.2
## Warning: pakiet 'WRTDStidal' został zbudowany w wersji R 4.4.2
## Warning: pakiet 'tidyverse' został zbudowany w wersji R 4.4.2
## Warning: pakiet 'lubridate' został zbudowany w wersji R 4.4.2
## Warning: pakiet 'kableExtra' został zbudowany w wersji R 4.4.2
## Warning: pakiet 'PogromcyDanych' został zbudowany w wersji R 4.4.2
## Warning: pakiet 'SmarterPoland' został zbudowany w wersji R 4.4.2
## Warning: pakiet 'httr' został zbudowany w wersji R 4.4.2
Dlaczego kwantylowa?
Dlaczego potrzebujemy regresji kwantylowej (QR)?
W szczególności, QR:
jest odporna na punkty odstające i wpływowe
nie zakłada stałej wariancji (znanej jako homoskedastyczność) dla
zmiennej odpowiedzi lub reszt
nie zakłada normalności ale główną zaletą QR w porównaniu z
regresją liniową (LR) jest to, że QR bada różne wartości zmiennej
odpowiedzi, a nie tylko średnią, i dostarcza w związku z tym
pełniejszego obrazu związków między zmiennymi!
Wprowadzenie
Regresja kwantylowa (ang. quantile regression) została zaproponowana
przez Koenkera i Bassetta (1978). Szczególny przypadek regresji
kwantylowej dla kwantyla rzędu 0,5 (czyli mediany) jest równoważny
estymatorowi LAD (ang. Least Absolute Deviation) – minimalizuje sumę
bezwzględnych błędów.
Wprowadzenie różnych kwantyli regresji daje pełniejszy opis rozkładów
warunkowych zwłaszcza w przypadku rozkładów asymetrycznych lub
uciętych.
Regresja kwantylowa jest kolejną wariacją na temat najmniejszych
kwadratów . Stratą jest współczynnik \(l_1\) funkcji:
\[
\phi(u) = \tau\max(u,0) - (1-\tau)\max(-u,0) = \frac{1}{2}|u| +
\left(\tau - \frac{1}{2}\right)u,
\]
gdzie \(\tau \in (0,1)\) oznacza
konkretny kwantyl. Problemem jak poprzednio jest minimalizacja
całkowitej straty resztowej. Model ten jest powszechnie stosowany w
ekologii, ochronie zdrowia i innych dziedzinach, gdzie sama średnia nie
wystarcza do uchwycenia złożonych zależności między zmiennymi.
Wymagania
Wymagana jest jedna liczbowa zmienna zależna. Zmienna przewidywana
musi być zmienną ilościową. Predyktory mogą być zmiennymi ilościowymi
lub sztucznymi zmiennymi w przypadku predyktorów jakościowych. Aby można
było uruchomić analizę, wymagany jest wyraz wolny lub co najmniej jeden
predyktor.
Regresja kwantylowa nie czyni założeń dotyczących rozkładu zmiennej
przewidywanej i jest odporna na wpływ obserwacji odstających.
Analiza kwantylowa jest pokrewna regresji metodą najmniejszych
kwadratów.
Przykład 1.
Wykorzystamy przykład z pakietu quantreg.
Jaki jest związek między całkowitym dochodem gospodarstwa domowego a
odsetkiem dochodów wydatkowanych na żywność? Prawo Engela w ekonomii
głosi, że w miarę wzrostu dochodów, część dochodów wydatkowanych na
żywność spada, nawet jeśli wydatki na żywność bezwzględnie rosną.
Stosując regresję kwantylową do tych danych, można określić, jakie
wydatki na żywność ponosi 90% rodzin (dla 100 rodzin z danym dochodem),
gdy nie interesują nas średnie wydatki na żywność.
Dane, które wykorzystamy - to zbiór “engel” - dane dotyczące wydatków
na żywność. Jest to zbiór danych regresyjnych składający się z 235
obserwacji dotyczących dochodów i wydatków na żywność dla belgijskich
gospodarstw domowych klasy robotniczej.

Powyższy wykres przedstawia dopasowanie regresji kwantylowej dla
\(\tau = (0.1, 0.25, 0.5, 0.75, 0.90,
0.95)\). Dopasowanie KMNK to gruba czarna linia.
Poniżej znajduje się tabela z oszacowanymi współczynnikami.
knitr::kable(fits, format = "html", caption = "Oszacowania z KMNK oraz `quantreg`") %>%
kable_styling("striped") %>%
column_spec(1:8, background = "#ececec")
Oszacowania z KMNK oraz quantreg
|
|
OLS
|
\(\tau_{0.10}\)
|
\(\tau_{0.25}\)
|
\(\tau_{0.50}\)
|
\(\tau_{0.75}\)
|
\(\tau_{0.90}\)
|
\(\tau_{0.95}\)
|
|
(Intercept)
|
147.4753885
|
110.1415742
|
95.4835396
|
81.4822474
|
62.3965855
|
67.3508721
|
64.1039632
|
|
income
|
0.4851784
|
0.4017658
|
0.4741032
|
0.5601806
|
0.6440141
|
0.6862995
|
0.7090685
|
Ok, możemy to zrobić bardziej przejrzyście i sformatować w ładnej
tabeli wyników:
##
## Wyniki regresji kwantylowych
## ==========================================
## Dependent variable:
## -----------------------------
## foodexp
## (1) (2) (3)
## ------------------------------------------
## income 0.474*** 0.560*** 0.644***
## (0.029) (0.028) (0.023)
##
## Constant 95.484*** 81.482*** 62.397***
## (21.392) (19.251) (16.305)
##
## ------------------------------------------
## Observations 235 235 235
## ==========================================
## Note: *p<0.1; **p<0.05; ***p<0.01
Finalnie, zaprezentujmy wyłącznie te 3 modele na wykresie:

Przykład 2.
Tutaj przeprowadzimy testy użycia pakietu quantreg, wykorzystując
wbudowany zbiór danych “mtcars”. Zmienna
“mpg” oznacza spalanie samochodów
(mile/galon).
Zamodulejmy zależność regresyjną dla tej zmiennej od kilku
predyktorów.
Najpierw oszacujmy regresję KMNK:
kmnk <- lm(mpg ~ disp + hp + factor(am) + factor(vs), data = mtcars)
summary(kmnk)
##
## Call:
## lm(formula = mpg ~ disp + hp + factor(am) + factor(vs), data = mtcars)
##
## Residuals:
## Min 1Q Median 3Q Max
## -4.7981 -1.9532 0.0111 1.5665 5.6321
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 24.832119 2.890418 8.591 3.32e-09 ***
## disp -0.008304 0.010087 -0.823 0.41757
## hp -0.037623 0.013846 -2.717 0.01135 *
## factor(am)1 4.419257 1.493243 2.960 0.00634 **
## factor(vs)1 2.052472 1.627096 1.261 0.21794
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 2.812 on 27 degrees of freedom
## Multiple R-squared: 0.8104, Adjusted R-squared: 0.7823
## F-statistic: 28.85 on 4 and 27 DF, p-value: 2.13e-09
Teraz oszacujmy warunkowe regresje kwantylowe na różnych kwantylach,
błąd standardowy uzyskany przez bootstrap.
Zauważ, że istnieje gradient we współczynnikach kwantylowych
hp, jak również disp. Znak
disp odwraca się, również współczynnik na czynniku
am jest różny w zależności od kwantyli:
kwantyle <- c(0.25, 0.50, 0.75)
reg_kwantylowa <- rq(mpg ~ disp + hp + factor(am),tau = kwantyle,data = mtcars)
summary(reg_kwantylowa, se = "boot")
##
## Call: rq(formula = mpg ~ disp + hp + factor(am), tau = kwantyle, data = mtcars)
##
## tau: [1] 0.25
##
## Coefficients:
## Value Std. Error t value Pr(>|t|)
## (Intercept) 25.34665 1.56854 16.15940 0.00000
## disp -0.02441 0.00726 -3.36018 0.00226
## hp -0.01672 0.01525 -1.09584 0.28248
## factor(am)1 1.39719 1.31397 1.06334 0.29671
##
## Call: rq(formula = mpg ~ disp + hp + factor(am), tau = kwantyle, data = mtcars)
##
## tau: [1] 0.5
##
## Coefficients:
## Value Std. Error t value Pr(>|t|)
## (Intercept) 27.49722 1.90569 14.42904 0.00000
## disp -0.02253 0.01620 -1.39050 0.17533
## hp -0.02713 0.02537 -1.06954 0.29396
## factor(am)1 3.37328 2.09446 1.61058 0.11849
##
## Call: rq(formula = mpg ~ disp + hp + factor(am), tau = kwantyle, data = mtcars)
##
## tau: [1] 0.75
##
## Coefficients:
## Value Std. Error t value Pr(>|t|)
## (Intercept) 28.06384 1.71600 16.35419 0.00000
## disp 0.00445 0.01353 0.32899 0.74461
## hp -0.06662 0.01672 -3.98496 0.00044
## factor(am)1 7.91402 2.49779 3.16840 0.00369
Testy współczynników
Użyjemy funkcji rq.anova z pakietu regresji kwantylowej, aby
przeprowadzić test WALDA. Pamiętaj, że test WALDA mówi, że biorąc pod
uwagę nieograniczone oszacowania modelu, przetestujemy hipotezę zerową
mówiącą, że współczynniki spełniają pewne liniowe ograniczenia.
Aby ją przetestować, użyjemy obiektu zwróconego z uruchomienia
rq z różnymi liczbami kwantyli i ustawimy
opcję joint na true lub false. Gdy
joint jest true: “równość współczynników
kierunkowych powinna być wykonana jako wspólne testy na wszystkich
parametrach nachylenia”, gdy joint jest false:
“należy zgłaszać oddzielne testy na każdym z parametrów nachylenia”.
Zauważ, że testy kwantylowe są testami “linii równoległej”. Oznacza
to, że powinniśmy wyjąć różne x-wyrazy_wolne dla każdego kwantyla,
ponieważ reprezentują one poziomy rozkładów warunkowych. Jeśli jednak
współczynniki kwantyli dla współczynnikow są takie same, to nie ma
efektów specyficznych dla kwantyli, wystarczą efekty średnie.
Badanie statystycznej różnicy między 25. i 50. kwantylem
warunkowym:
Biorąc pod uwagę powyższe oszacowania kwantyli, różnica między
kwantylami 0,25 i 0,50 istnieje, ale czy są one wystarczająco duże, aby
być statystycznie różne? Jaka jest wartość p? Przeglądając poniższe
wyniki, nie są one statystycznie różne!
Po pierwsze, joint = TRUE. To nie jest testowanie, czy współczynnik
na disp jest taki sam jak współczynnik na hp. To jest wspólne
testowanie, czy współczynniki dla różnych kwantyli disp i różnych
kwantyli hp są takie same dla każdej zmiennej.
kwantyle <- c(0.25, 0.50)
reg_kwantylowa <- rq(mpg ~ disp + hp + factor(am),tau = kwantyle, data = mtcars)
anova(reg_kwantylowa, test = "Wald", joint=TRUE)
## Quantile Regression Analysis of Deviance Table
##
## Model: mpg ~ disp + hp + factor(am)
## Joint Test of Equality of Slopes: tau in { 0.25 0.5 }
##
## Df Resid Df F value Pr(>F)
## 1 3 61 0.8421 0.4761
Po drugie, joint = False:
anova(reg_kwantylowa, test = "Wald", joint=FALSE)
## Quantile Regression Analysis of Deviance Table
##
## Model: mpg ~ disp + hp + factor(am)
## Tests of Equality of Distinct Slopes: tau in { 0.25 0.5 }
##
## Df Resid Df F value Pr(>F)
## disp 1 63 0.0305 0.8619
## hp 1 63 0.5461 0.4627
## factor(am)1 1 63 1.3500 0.2497
Badanie statystycznej różnicy między 25, 50 i 75 kwantylem
warunkowym:
Pierwszy kwartyl i mediana nie wydają się być statystycznie różne,
teraz dołączymy trzeci kwartyl. Jak widać wcześniej, kwartyle wspólnie
wykazują gradient. Teraz możemy zobaczyć, że disp,
hp i am są oddzielnie statystycznie
różne.
Po pierwsze, joint = TRUE:
kwantyle <- c(0.25, 0.50, 0.75)
reg_kwantylowa <- rq(mpg ~ disp + hp + factor(am),tau = kwantyle, data = mtcars)
anova(reg_kwantylowa, test = "Wald", joint=TRUE)
## Quantile Regression Analysis of Deviance Table
##
## Model: mpg ~ disp + hp + factor(am)
## Joint Test of Equality of Slopes: tau in { 0.25 0.5 0.75 }
##
## Df Resid Df F value Pr(>F)
## 1 6 90 3.3173 0.005367 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Po drugie, joint = False:
anova(reg_kwantylowa, test = "Wald", joint=FALSE)
## Quantile Regression Analysis of Deviance Table
##
## Model: mpg ~ disp + hp + factor(am)
## Tests of Equality of Distinct Slopes: tau in { 0.25 0.5 0.75 }
##
## Df Resid Df F value Pr(>F)
## disp 2 94 5.4903 0.005558 **
## hp 2 94 6.7221 0.001868 **
## factor(am)1 2 94 7.2758 0.001154 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Dobroć dopasowania
Możemy obliczyć współczynniki dobroci dopasowania regresji
kwantylowej z wykorzystaniem reszt i reszt bezwarunkowych:
goodfit(resid, resid_nl, tau)
Miara dobroci dopasowania dla regresji kwantylowej jest szacowana
jako 1 minus stosunek sumy odchyleń bezwzględnych w modelach w pełni
sparametryzowanych do sumy odchyleń bezwzględnych w zerowym
(bezwarunkowym) modelu kwantylowym.
Wartości te są przydatne do porównań między modelami kwantylowymi,
ale nie są porównywalne ze standardowymi współczynnikami determinacji.
Te ostatnie oparte są na wariancji odchyleń kwadratowych, natomiast
wartości dobroci dopasowania dla regresji kwantylowej oparte są na
odchyleniach bezwzględnych. Wartości dobroci dopasowania zawsze będą
mniejsze niż wartości R2.
## model kwantylowy
model1 <- rq(mpg ~ disp + hp + factor(am),tau = 0.5, data = mtcars)
reszty1 <- resid(model1)
## bezwarunkowy (pusty) model kwantylowy
model2 <- rq(mpg ~ 1, tau = 0.5,data=mtcars)
reszty2 <- resid(model2)
goodfit(reszty1, reszty2, 0.5)
## [1] 0.5403311
## r2 modelu KMNK dla porównania
model_lm <- lm(mpg ~ disp + hp + factor(am), data = mtcars)
summary(model_lm)$r.squared
## [1] 0.7992061
Zadanie
Teraz Wasza kolej ;-)
Waszym zadaniem dzisiaj jest zamodelowanie - porównanie KMNK oraz
regresji kwantylowej (różno-poziomowej) dla zmiennej “earnings” -
wynagrodzenia.
Dobierz i przetestuj predyktory, kwantyle dla modeli. Wykonaj testy
różnic współczynnikow dla finalnych modeli.
W przypadku problemów - obejrzyj video tutorial (włącz polskie
napisy) oraz wejdź na jego stronę ze źródłami. Możesz również
wykorzystać w/w przykłady. # 1. Dane
data("CPSSW9298")
# ?CPSSW9298
head(CPSSW9298)
## year earnings degree gender age
## 1 1992 11.188811 bachelor male 29
## 2 1992 10.000000 bachelor male 33
## 3 1992 5.769231 highschool male 30
## 4 1992 14.957265 bachelor male 31
## 5 1992 8.660096 bachelor female 26
## 6 1992 7.788462 highschool female 31
Dane<-CPSSW9298
head(Dane)
## year earnings degree gender age
## 1 1992 11.188811 bachelor male 29
## 2 1992 10.000000 bachelor male 33
## 3 1992 5.769231 highschool male 30
## 4 1992 14.957265 bachelor male 31
## 5 1992 8.660096 bachelor female 26
## 6 1992 7.788462 highschool female 31
2. Zbudowanie modelu KMNK
ols_model <- lm(earnings ~ degree + gender + age,data = Dane)
summary(Dane)
## year earnings degree gender age
## 1992:7590 Min. : 1.840 highschool:7936 male :7815 Min. :25.00
## 1998:5911 1st Qu.: 8.173 bachelor :5565 female:5686 1st Qu.:27.00
## Median :11.538 Median :30.00
## Mean :12.663 Mean :29.71
## 3rd Qu.:15.865 3rd Qu.:32.00
## Max. :49.451 Max. :34.00
3. Regresja kwantylowa
Dopasowanie modeli dla kwantyli: 0.25, 0.5 (mediana), 0.75
rq_25 <- rq(earnings ~ degree + age + gender, data = Dane, tau = 0.25)
rq_50 <- rq(earnings ~ degree + age + gender, data = Dane, tau = 0.5)
rq_75 <- rq(earnings ~ degree + age + gender, data = Dane, tau = 0.75)
summary(rq_25)
##
## Call: rq(formula = earnings ~ degree + age + gender, tau = 0.25, data = Dane)
##
## tau: [1] 0.25
##
## Coefficients:
## Value Std. Error t value Pr(>|t|)
## (Intercept) 2.67308 0.42070 6.35386 0.00000
## degreebachelor 3.59188 0.08767 40.96855 0.00000
## age 0.17308 0.01449 11.94257 0.00000
## genderfemale -1.32265 0.08101 -16.32612 0.00000
summary(rq_50)
##
## Call: rq(formula = earnings ~ degree + age + gender, tau = 0.5, data = Dane)
##
## tau: [1] 0.5
##
## Coefficients:
## Value Std. Error t value Pr(>|t|)
## (Intercept) 1.45427 0.53081 2.73974 0.00616
## degreebachelor 4.70043 0.11477 40.95483 0.00000
## age 0.31389 0.01820 17.24663 0.00000
## genderfemale -2.12970 0.10171 -20.93992 0.00000
summary(rq_75)
##
## Call: rq(formula = earnings ~ degree + age + gender, tau = 0.75, data = Dane)
##
## tau: [1] 0.75
##
## Coefficients:
## Value Std. Error t value Pr(>|t|)
## (Intercept) 1.53846 0.66948 2.29801 0.02158
## degreebachelor 5.75962 0.15130 38.06842 0.00000
## age 0.43269 0.02271 19.05455 0.00000
## genderfemale -2.97009 0.12769 -23.26078 0.00000
##Ogólne zależności: Efekt wykształcenia (degreebachelor):
Poszczególne wartości dla degreebachelor wskazują, że osoby z
wykształceniem na poziomie licencjata (w porównaniu do grupy
referencyjnej, np. osób bez wyższego wykształcenia) zarabiają istotnie
więcej w każdym kwantylu (0.25, 0.5, 0.75). Wartość współczynnika
wzrasta wraz z kwantylem:
τ=0.25: +3.59 τ=0.5: +4.70 τ=0.75: +5.76
Im wyższy kwantyl (czyli wyższy poziom zarobków), tym większy wpływ
wykształcenia na zarobki. Efekt wieku (age):
Wiek ma pozytywny i statystycznie istotny wpływ na zarobki w każdym
kwantylu. Współczynniki rosną wraz z kwantylem: τ=0.25: +0.17 τ=0.5:
+0.31 τ=0.75: +0.43 Wyższe zarobki są bardziej zależne od wieku w
górnych kwantylach, co może sugerować większą korzyść z doświadczenia
zawodowego w lepiej płatnych grupach. Efekt płci (genderfemale):
Wartości współczynnika dla zmiennej genderfemale (w porównaniu do
mężczyzn) są ujemne we wszystkich kwantylach, co wskazuje na negatywny
wpływ bycia kobietą na zarobki. Efekt ten staje się bardziej wyraźny w
wyższych kwantylach: 𝜏=0.25τ=0.25: -1.32𝜏=0.5τ=0.5: -2.13𝜏=0.75τ=0.75:
-2.97 Różnica w zarobkach między płciami jest większa w górnych
kwantylach, co może sugerować tzw. “szklany sufit” lub różnice w
dostępie do lepiej płatnych stanowisk.
#Statystyczna istotność:
Wszystkie współczynniki są statystycznie istotne na poziomie
𝑝<0.05 p<0.05, co wskazuje na silne dowody dla ich wpływu na
zarobki w analizowanych kwantylach. Zmiany współczynników w
kwantylach:
Współczynniki różnią się między kwantylami, co podkreśla, że wpływ
poszczególnych zmiennych nie jest równomierny w różnych częściach
rozkładu zarobków. To jest główny cel stosowania regresji kwantylowej —
analiza wpływu zmiennych w różnych punktach rozkładu.
#Wnioski końcowe: Wykształcenie jest kluczowym czynnikiem
zwiększającym zarobki, szczególnie w wyższych kwantylach. Wiek ma
większe znaczenie w lepiej opłacanych grupach, co sugeruje, że
doświadczenie bardziej premiuje osoby o wyższych zarobkach. Płeć
pozostaje istotnym czynnikiem wpływającym na zarobki, przy czym różnice
na niekorzyść kobiet są większe w wyższych kwantylach.
4. Test różnic współczynników
anova(rq_25, rq_50, rq_75)
## Quantile Regression Analysis of Deviance Table
##
## Model: earnings ~ degree + age + gender
## Joint Test of Equality of Slopes: tau in { 0.25 0.5 0.75 }
##
## Df Resid Df F value Pr(>F)
## 1 6 40497 90.65 < 2.2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#Interpretacja wyniku: Hipoteza zerowa:
Test sprawdza hipotezę zerową, że nachylenia (współczynniki regresji)
dla różnych kwantyli są takie same, czyli: 𝐻0:𝛽𝜏= 0.25=𝛽𝜏=0.5=𝛽𝜏=0.75 H
0 :β τ=0.25=β τ=0.5=β τ=0.75 #Wartość p:
Wartość p wynosi <2.2x10^16, co oznacza, że różnice nachyleń są
wysoce statystycznie istotne. Hipotezę zerową należy odrzucić na każdym
typowym poziomie istotności (𝛼=0.05,α=0.01, etc.).
5. Wizualizacja porównania
Ekstrakcja współczynników dla różnych kwantyli
coeffs <- data.frame(
Variable = names(coef(rq_25)),
OLS = coef(ols_model),
Q25 = coef(rq_25),
Q50 = coef(rq_50),
Q75 = coef(rq_75)
)
print(coeffs)
## Variable OLS Q25 Q50 Q75
## (Intercept) (Intercept) 1.7047656 2.6730783 1.4542745 1.5384642
## degreebachelor degreebachelor 4.9112307 3.5918801 4.7004274 5.7596162
## genderfemale age -2.2421722 0.1730769 0.3138889 0.4326922
## age genderfemale 0.3324535 -1.3226488 -2.1297013 -2.9700855
#Wnioski
OLS dostarcza uśrednionego obrazu wpływu zmiennych niezależnych na
zarobki, co może prowadzić do utraty ważnych informacji o różnicach
między grupami (kwantylami). Regresja kwantylowa ujawnia różnice:
Wykształcenie i wiek mają większy wpływ na osoby w wyższych
kwantylach (z wyższymi zarobkami). Różnice płacowe między płciami są
mniejsze w dolnych kwantylach i rosną wraz z kwantylem.
Wykres współczynników
coeffs_long <- tidyr::pivot_longer(coeffs, cols = -Variable, names_to = "Model", values_to = "Coefficient")
ggplot(coeffs_long, aes(x = Variable, y = Coefficient, fill = Model)) +
geom_bar(stat = "identity", position = "dodge") +
theme_minimal() +
labs(title = "Porównanie współczynników regresji KMNK i kwantylowej",
x = "Zmienne", y = "Wartość współczynnika")

#interpretacja wykresu
Wyższa wartość w Q25 oznacza, że osoby o niskich zarobkach mają
względnie większe podstawowe wynagrodzenie (niezależnie od zmiennych), a
w Q75 różnice są mniej znaczące.
Efekt wykształcenia jest bardziej widoczny w wyższych kwantylach,
co wskazuje na rosnącą wartość wykształcenia w lepiej płatnych
stanowiskach.
Różnice płacowe między płciami są bardziej wyraźne w grupach o
wyższych zarobkach -> dla zmiennej genderfemale współczynnik jest
niższy w Q25 i najbardziej negatywny w Q75
Starsze osoby z grupy wysokich zarobków bardziej korzystają na
swoim doświadczeniu niż te z grupy o niższych zarobkach.
cat("KMNK: Średnia wartość zmiennej earnings w zależności od predyktorów.")
## KMNK: Średnia wartość zmiennej earnings w zależności od predyktorów.
cat("Regresja kwantylowa: Zmienne mają różny wpływ w zależności od pozycji w rozkładzie earnings.")
## Regresja kwantylowa: Zmienne mają różny wpływ w zależności od pozycji w rozkładzie earnings.
LS0tDQp0aXRsZTogJ05pZWtsYXN5Y3puZSBtZXRvZHkgc3RhdHlzdHlraScNCnN1YnRpdGxlOiAnUmVncmVzamEga3dhbnR5bG93YScNCmRhdGU6ICJgciBTeXMuRGF0ZSgpYCINCmF1dGhvcjogIlR3b2plIGltacSZIGkgbmF6d2lza28iDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6IA0KICAgIHRoZW1lOiBjZXJ1bGVhbg0KICAgIGhpZ2hsaWdodDogdGV4dG1hdGUNCiAgICBmb250c2l6ZTogMTBwdA0KICAgIHRvYzogeWVzDQogICAgY29kZV9kb3dubG9hZDogeWVzDQogICAgdG9jX2Zsb2F0Og0KICAgICAgY29sbGFwc2VkOiBubw0KICAgIGRmX3ByaW50OiBkZWZhdWx0DQogICAgdG9jX2RlcHRoOiA1DQplZGl0b3Jfb3B0aW9uczogDQogIG1hcmtkb3duOiANCiAgICB3cmFwOiA3Mg0KLS0tDQoNCmBgYHtyIHByZXJlcXMsIG1lc3NhZ2UgPSBGQUxTRSwgZWNobyA9IEZBTFNFfQ0KDQpsaWJyYXJ5KENWWFIpDQpsaWJyYXJ5KEFFUikNCmxpYnJhcnkoc3RhcmdhemVyKQ0KbGlicmFyeShXUlREU3RpZGFsKQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KGthYmxlRXh0cmEpDQpsaWJyYXJ5KHF1YW50cmVnKQ0KbGlicmFyeShQb2dyb21jeURhbnljaCkNCg0KZGF0YSgiQ1BTU1c5Mjk4IikNCiMgP0NQU1NXOTI5OCANCmBgYA0KDQojIyBEbGFjemVnbyBrd2FudHlsb3dhPw0KDQpEbGFjemVnbyBwb3RyemVidWplbXkgcmVncmVzamkga3dhbnR5bG93ZWogKFFSKT8NCg0KVyBzemN6ZWfDs2xub8WbY2ksIFFSOg0KDQotICAgamVzdCBvZHBvcm5hIG5hIHB1bmt0eSBvZHN0YWrEhWNlIGkgd3DFgnl3b3dlDQoNCi0gICBuaWUgemFrxYJhZGEgc3RhxYJlaiB3YXJpYW5jamkgKHpuYW5laiBqYWtvIGhvbW9za2VkYXN0eWN6bm/Fm8SHKSBkbGENCiAgICB6bWllbm5laiBvZHBvd2llZHppIGx1YiByZXN6dA0KDQotICAgbmllIHpha8WCYWRhIG5vcm1hbG5vxZtjaSBhbGUgZ8WCw7N3bsSFIHphbGV0xIUgUVIgdyBwb3LDs3duYW5pdSB6IHJlZ3Jlc2rEhQ0KICAgIGxpbmlvd8SFIChMUikgamVzdCB0bywgxbxlIFFSIGJhZGEgcsOzxbxuZSB3YXJ0b8WbY2kgem1pZW5uZWogb2Rwb3dpZWR6aSwNCiAgICBhIG5pZSB0eWxrbyDFm3JlZG5pxIUsIGkgZG9zdGFyY3phIHcgendpxIV6a3UgeiB0eW0gcGXFgm5pZWpzemVnbyBvYnJhenUNCiAgICB6d2nEhXprw7N3IG1pxJlkenkgem1pZW5ueW1pIQ0KDQojIyBXcHJvd2FkemVuaWUNCg0KUmVncmVzamEga3dhbnR5bG93YSAoYW5nLiBxdWFudGlsZSByZWdyZXNzaW9uKSB6b3N0YcWCYSB6YXByb3Bvbm93YW5hDQpwcnpleiBLb2Vua2VyYSBpIEJhc3NldHRhICgxOTc4KS4gU3pjemVnw7NsbnkgcHJ6eXBhZGVrIHJlZ3Jlc2ppDQprd2FudHlsb3dlaiBkbGEga3dhbnR5bGEgcnrEmWR1IDAsNSAoY3p5bGkgbWVkaWFueSkgamVzdCByw7N3bm93YcW8bnkNCmVzdHltYXRvcm93aSBMQUQgKGFuZy4gTGVhc3QgQWJzb2x1dGUgRGV2aWF0aW9uKSAtLSBtaW5pbWFsaXp1amUgc3VtxJkNCmJlend6Z2zEmWRueWNoIGLFgsSZZMOzdy5cDQpXcHJvd2FkemVuaWUgcsOzxbxueWNoIGt3YW50eWxpIHJlZ3Jlc2ppIGRhamUgcGXFgm5pZWpzenkgb3BpcyByb3prxYJhZMOzdw0Kd2FydW5rb3d5Y2ggenfFgmFzemN6YSB3IHByenlwYWRrdSByb3prxYJhZMOzdyBhc3ltZXRyeWN6bnljaCBsdWIgdWNpxJl0eWNoLg0KDQpSZWdyZXNqYSBrd2FudHlsb3dhIGplc3Qga29sZWpuxIUgd2FyaWFjasSFIG5hIHRlbWF0IG5ham1uaWVqc3p5Y2gNCmt3YWRyYXTDs3cgXGNpdGVwe3F1YW50aWxlfS4gU3RyYXTEhSBqZXN0IHdzcMOzxYJjenlubmlrICRsXzEkIGZ1bmtjamk6DQoNCiQkDQogICAgXHBoaSh1KSA9IFx0YXVcbWF4KHUsMCkgLSAoMS1cdGF1KVxtYXgoLXUsMCkgPSBcZnJhY3sxfXsyfXx1fCArIFxsZWZ0KFx0YXUgLSBcZnJhY3sxfXsyfVxyaWdodCl1LA0KJCQNCg0KZ2R6aWUgJFx0YXUgXGluICgwLDEpJCBvem5hY3phIGtvbmtyZXRueSBrd2FudHlsLiBQcm9ibGVtZW0gamFrDQpwb3ByemVkbmlvIGplc3QgbWluaW1hbGl6YWNqYSBjYcWCa293aXRlaiBzdHJhdHkgcmVzenRvd2VqLiBNb2RlbCB0ZW4NCmplc3QgcG93c3plY2huaWUgc3Rvc293YW55IHcgZWtvbG9naWksIG9jaHJvbmllIHpkcm93aWEgaSBpbm55Y2gNCmR6aWVkemluYWNoLCBnZHppZSBzYW1hIMWbcmVkbmlhIG5pZSB3eXN0YXJjemEgZG8gdWNod3ljZW5pYSB6xYJvxbxvbnljaA0KemFsZcW8bm/Fm2NpIG1pxJlkenkgem1pZW5ueW1pLg0KDQojIyBXeW1hZ2FuaWENCg0KV3ltYWdhbmEgamVzdCBqZWRuYSBsaWN6Ym93YSB6bWllbm5hIHphbGXFvG5hLiBabWllbm5hIHByemV3aWR5d2FuYSBtdXNpDQpiecSHIHptaWVubsSFIGlsb8WbY2lvd8SFLiBQcmVkeWt0b3J5IG1vZ8SFIGJ5xIcgem1pZW5ueW1pIGlsb8WbY2lvd3ltaSBsdWINCnN6dHVjem55bWkgem1pZW5ueW1pIHcgcHJ6eXBhZGt1IHByZWR5a3RvcsOzdyBqYWtvxZtjaW93eWNoLiBBYnkgbW/FvG5hDQpiecWCbyB1cnVjaG9tacSHIGFuYWxpesSZLCB3eW1hZ2FueSBqZXN0IHd5cmF6IHdvbG55IGx1YiBjbyBuYWptbmllaiBqZWRlbg0KcHJlZHlrdG9yLg0KDQpSZWdyZXNqYSBrd2FudHlsb3dhIG5pZSBjenluaSB6YcWCb8W8ZcWEIGRvdHljesSFY3ljaCByb3prxYJhZHUgem1pZW5uZWoNCnByemV3aWR5d2FuZWogaSBqZXN0IG9kcG9ybmEgbmEgd3DFgnl3IG9ic2Vyd2Fjamkgb2RzdGFqxIVjeWNoLg0KDQpBbmFsaXphIGt3YW50eWxvd2EgamVzdCBwb2tyZXduYSByZWdyZXNqaSBtZXRvZMSFIG5ham1uaWVqc3p5Y2gNCmt3YWRyYXTDs3cuDQoNCiMjIFByenlrxYJhZCAxLg0KDQpXeWtvcnp5c3RhbXkgcHJ6eWvFgmFkIHogcGFraWV0dSBxdWFudHJlZy4NCg0KSmFraSBqZXN0IHp3acSFemVrIG1pxJlkenkgY2HFgmtvd2l0eW0gZG9jaG9kZW0gZ29zcG9kYXJzdHdhIGRvbW93ZWdvIGENCm9kc2V0a2llbSBkb2Nob2TDs3cgd3lkYXRrb3dhbnljaCBuYSDFvHl3bm/Fm8SHPyBQcmF3byBFbmdlbGEgdyBla29ub21paQ0KZ8WCb3NpLCDFvGUgdyBtaWFyxJkgd3pyb3N0dSBkb2Nob2TDs3csIGN6xJnFm8SHIGRvY2hvZMOzdyB3eWRhdGtvd2FueWNoIG5hDQrFvHl3bm/Fm8SHIHNwYWRhLCBuYXdldCBqZcWbbGkgd3lkYXRraSBuYSDFvHl3bm/Fm8SHIGJlend6Z2zEmWRuaWUgcm9zbsSFLg0KU3Rvc3VqxIVjIHJlZ3Jlc2rEmSBrd2FudHlsb3fEhSBkbyB0eWNoIGRhbnljaCwgbW/FvG5hIG9rcmXFm2xpxIcsIGpha2llDQp3eWRhdGtpIG5hIMW8eXdub8WbxIcgcG9ub3NpIDkwJSByb2R6aW4gKGRsYSAxMDAgcm9kemluIHogZGFueW0gZG9jaG9kZW0pLA0KZ2R5IG5pZSBpbnRlcmVzdWrEhSBuYXMgxZtyZWRuaWUgd3lkYXRraSBuYSDFvHl3bm/Fm8SHLg0KDQpEYW5lLCBrdMOzcmUgd3lrb3J6eXN0YW15IC0gdG8gemJpw7NyICJlbmdlbCIgLSBkYW5lIGRvdHljesSFY2Ugd3lkYXRrw7N3IG5hDQrFvHl3bm/Fm8SHLiBKZXN0IHRvIHpiacOzciBkYW55Y2ggcmVncmVzeWpueWNoIHNrxYJhZGFqxIVjeSBzacSZIHogMjM1DQpvYnNlcndhY2ppIGRvdHljesSFY3ljaCBkb2Nob2TDs3cgaSB3eWRhdGvDs3cgbmEgxbx5d25vxZvEhyBkbGEgYmVsZ2lqc2tpY2gNCmdvc3BvZGFyc3R3IGRvbW93eWNoIGtsYXN5IHJvYm90bmljemVqLg0KDQpgYGB7ciBlY2hvPUZBTFNFfQ0KZGF0YShlbmdlbCkgI2RhbmUgDQpwIDwtIGdncGxvdChkYXRhID0gZW5nZWwpICsNCiAgICBnZW9tX3BvaW50KG1hcHBpbmcgPSBhZXMoeCA9IGluY29tZSwgeSA9IGZvb2RleHApLCBjb2xvciA9ICJibHVlIikNCnRhdXMgPC0gYygwLjEsIDAuMjUsIDAuNSwgMC43NSwgMC45MCwgMC45NSkNCmZpdHMgPC0gZGF0YS5mcmFtZSgNCiAgICBjb2VmKGxtKGZvb2RleHAgfiBpbmNvbWUsIGRhdGEgPSBlbmdlbCkpLA0KICAgIHNhcHBseSh0YXVzLCBmdW5jdGlvbih4KSBjb2VmKHJxKGZvcm11bGEgPSBmb29kZXhwIH4gaW5jb21lLCBkYXRhID0gZW5nZWwsIHRhdSA9IHgpKSkpDQpuYW1lcyhmaXRzKSA8LSBjKCJPTFMiLCBzcHJpbnRmKCIkXFx0YXVfeyUwLjJmfSQiLCB0YXVzKSkNCm5mIDwtIG5jb2woZml0cykNCmNvbG9ycyA8LSBjb2xvclJhbXBQYWxldHRlKGNvbG9ycyA9IGMoImJsYWNrIiwgInJlZCIpKShuZikNCnAgPC0gcCArIGdlb21fYWJsaW5lKGludGVyY2VwdCA9IGZpdHNbMSwgMV0sIHNsb3BlID0gZml0c1syLCAxXSwgY29sb3IgPSBjb2xvcnNbMV0sIGxpbmV3aWR0aCA9IDEuNSkNCmZvciAoaSBpbiBzZXFfbGVuKG5mKVstMV0pIHsNCiAgICBwIDwtIHAgKyBnZW9tX2FibGluZShpbnRlcmNlcHQgPSBmaXRzWzEsIGldLCBzbG9wZSA9IGZpdHNbMiwgaV0sIGNvbG9yID0gY29sb3JzW2ldKQ0KfQ0KcA0KYGBgDQoNClBvd3nFvHN6eSB3eWtyZXMgcHJ6ZWRzdGF3aWEgZG9wYXNvd2FuaWUgcmVncmVzamkga3dhbnR5bG93ZWogZGxhDQokXHRhdSA9ICgwLjEsIDAuMjUsIDAuNSwgMC43NSwgMC45MCwgMC45NSkkLiBEb3Bhc293YW5pZSBLTU5LIHRvIGdydWJhDQpjemFybmEgbGluaWEuDQoNClBvbmnFvGVqIHpuYWpkdWplIHNpxJkgdGFiZWxhIHogb3N6YWNvd2FueW1pIHdzcMOzxYJjenlubmlrYW1pLg0KDQpgYGB7cn0NCmtuaXRyOjprYWJsZShmaXRzLCBmb3JtYXQgPSAiaHRtbCIsIGNhcHRpb24gPSAiT3N6YWNvd2FuaWEgeiBLTU5LIG9yYXogYHF1YW50cmVnYCIpICU+JQ0KICAgIGthYmxlX3N0eWxpbmcoInN0cmlwZWQiKSAlPiUNCiAgICBjb2x1bW5fc3BlYygxOjgsIGJhY2tncm91bmQgPSAiI2VjZWNlYyIpDQpgYGANCg0KT2ssIG1vxbxlbXkgdG8genJvYmnEhyBiYXJkemllaiBwcnplanJ6ecWbY2llIGkgc2Zvcm1hdG93YcSHIHcgxYJhZG5laiB0YWJlbGkNCnd5bmlrw7N3Og0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBwYWdlZC5wcmludD1UUlVFfQ0KcTI1IDwtIHJxKGZvb2RleHAgfiBpbmNvbWUsIGRhdGEgPSBlbmdlbCwgdGF1ID0gMC4yNSkNCnE1MCA8LSBycShmb29kZXhwIH4gaW5jb21lLCBkYXRhID0gZW5nZWwsIHRhdSA9IDAuNTApDQpxNzUgPC0gcnEoZm9vZGV4cCB+IGluY29tZSwgZGF0YSA9IGVuZ2VsLCB0YXUgPSAwLjc1KQ0KDQojIFRhYmVsYSB6IHBvcsOzd25hbmllbSB3eW5pa8OzdyB0cnplY2ggbW9kZWxpOiANCg0Kc3RhcmdhemVyKHEyNSwgcTUwLCBxNzUsIHRpdGxlID0gIld5bmlraSByZWdyZXNqaSBrd2FudHlsb3d5Y2giLCB0eXBlID0gInRleHQiKQ0KYGBgDQoNCkZpbmFsbmllLCB6YXByZXplbnR1am15IHd5xYLEhWN6bmllIHRlIDMgbW9kZWxlIG5hIHd5a3Jlc2llOg0KDQpgYGB7ciBlY2hvPUZBTFNFfQ0KbXlfcXIgPC0gcnEoZm9vZGV4cCB+IGluY29tZSwgZGF0YSA9IGVuZ2VsLCB0YXUgPSBzZXEoMC4yNSwgMC43NSwgMC4yNSkpDQoNCmludGVyY2VwdF9zbG9wZSA8LSBteV9xciAlPiUgDQogIGNvZWYoKSAlPiUgDQogIHQoKSAlPiUgDQogIGRhdGEuZnJhbWUoKSAlPiUgDQogIHJlbmFtZShpbnRlcmNlcHQgPSBYLkludGVyY2VwdC4sIHNsb3BlID0gaW5jb21lKSAlPiUgDQogIG11dGF0ZShxdWFudGlsZSA9IHJvdy5uYW1lcyguKSkNCg0KZ2dwbG90KCkgKyANCiAgZ2VvbV9wb2ludChkYXRhID0gZW5nZWwsIGFlcyhpbmNvbWUsIGZvb2RleHApLCBhbHBoYSA9IDAuNSkgKyANCiAgZ2VvbV9hYmxpbmUoZGF0YSA9IGludGVyY2VwdF9zbG9wZSwgYWVzKGludGVyY2VwdCA9IGludGVyY2VwdCwgc2xvcGUgPSBzbG9wZSwgY29sb3IgPSBxdWFudGlsZSkpICsgDQogIHRoZW1lX21pbmltYWwoKSArIA0KICBsYWJzKHggPSAiRG9jaMOzZCIsIHkgPSAiV3lkYXRraSBuYSDFvHl3bm/Fm8SHIiwgdGl0bGUgPSAiUmVncmVzamUga3dhbnR5bG93ZSB6IHRhdSA9IDAuMjUsIDAuNTAgb3JheiAwLjc1IiwgDQogICAgICAgY2FwdGlvbiA9ICLFuXLDs2TFgm8gZGFueWNoOiBLb2Vua2VyIGFuZCBCYXNzZXR0ICgxOTgyKSIpDQpgYGANCg0KIyMgUHJ6eWvFgmFkIDIuDQoNClR1dGFqIHByemVwcm93YWR6aW15IHRlc3R5IHXFvHljaWEgcGFraWV0dSBxdWFudHJlZywgd3lrb3J6eXN0dWrEhWMNCndidWRvd2FueSB6YmnDs3IgZGFueWNoICIqKm10Y2FycyoqIi4gWm1pZW5uYSAiKiptcGcqKiIgb3puYWN6YSBzcGFsYW5pZQ0Kc2Ftb2Nob2TDs3cgKCptaWxlL2dhbG9uKikuDQoNClphbW9kdWxlam15IHphbGXFvG5vxZvEhyByZWdyZXN5am7EhSBkbGEgdGVqIHptaWVubmVqIG9kIGtpbGt1IHByZWR5a3RvcsOzdy4NCg0KTmFqcGllcncgb3N6YWN1am15IHJlZ3Jlc2rEmSBLTU5LOg0KDQpgYGB7cn0NCmttbmsgPC0gbG0obXBnIH4gZGlzcCArIGhwICsgZmFjdG9yKGFtKSArIGZhY3Rvcih2cyksIGRhdGEgPSBtdGNhcnMpDQpzdW1tYXJ5KGttbmspDQpgYGANCg0KVGVyYXogb3N6YWN1am15IHdhcnVua293ZSByZWdyZXNqZSBrd2FudHlsb3dlIG5hIHLDs8W8bnljaCBrd2FudHlsYWNoLA0KYsWCxIVkIHN0YW5kYXJkb3d5IHV6eXNrYW55IHByemV6ICoqKmJvb3RzdHJhcCoqKi4NCg0KWmF1d2HFvCwgxbxlIGlzdG5pZWplIGdyYWRpZW50IHdlIHdzcMOzxYJjenlubmlrYWNoIGt3YW50eWxvd3ljaCAqKmhwKiosIGphaw0KcsOzd25pZcW8ICoqZGlzcCoqLiBabmFrICoqZGlzcCoqIG9kd3JhY2Egc2nEmSwgcsOzd25pZcW8IHdzcMOzxYJjenlubmlrIG5hDQpjenlubmlrdSAqKmFtKiogamVzdCByw7PFvG55IHcgemFsZcW8bm/Fm2NpIG9kIGt3YW50eWxpOg0KDQpgYGB7cn0NCmt3YW50eWxlIDwtIGMoMC4yNSwgMC41MCwgMC43NSkNCnJlZ19rd2FudHlsb3dhIDwtIHJxKG1wZyB+IGRpc3AgKyBocCArIGZhY3RvcihhbSksdGF1ID0ga3dhbnR5bGUsZGF0YSA9IG10Y2FycykNCnN1bW1hcnkocmVnX2t3YW50eWxvd2EsIHNlID0gImJvb3QiKQ0KYGBgDQoNCiMjIyBUZXN0eSB3c3DDs8WCY3p5bm5pa8Ozdw0KDQpVxbx5amVteSBmdW5rY2ppIHJxLmFub3ZhIHogcGFraWV0dSByZWdyZXNqaSBrd2FudHlsb3dlaiwgYWJ5DQpwcnplcHJvd2FkemnEhyB0ZXN0IFdBTERBLiBQYW1pxJl0YWosIMW8ZSB0ZXN0IFdBTERBIG3Ds3dpLCDFvGUgYmlvcsSFYyBwb2QNCnV3YWfEmSBuaWVvZ3Jhbmljem9uZSBvc3phY293YW5pYSBtb2RlbHUsIHByemV0ZXN0dWplbXkgaGlwb3RlesSZIHplcm93xIUNCm3Ds3dpxIVjxIUsIMW8ZSB3c3DDs8WCY3p5bm5pa2kgc3BlxYJuaWFqxIUgcGV3bmUgbGluaW93ZSBvZ3JhbmljemVuaWEuDQoNCkFieSBqxIUgcHJ6ZXRlc3Rvd2HEhywgdcW8eWplbXkgb2JpZWt0dSB6d3LDs2NvbmVnbyB6IHVydWNob21pZW5pYSAqKipycSoqKg0KeiByw7PFvG55bWkgbGljemJhbWkga3dhbnR5bGkgaSB1c3Rhd2lteSBvcGNqxJkgKioqam9pbnQqKiogbmEgdHJ1ZSBsdWINCmZhbHNlLiBHZHkgKioqam9pbnQqKiogamVzdCB0cnVlOiAicsOzd25vxZvEhyB3c3DDs8WCY3p5bm5pa8OzdyBraWVydW5rb3d5Y2gNCnBvd2lubmEgYnnEhyB3eWtvbmFuYSBqYWtvIHdzcMOzbG5lIHRlc3R5IG5hIHdzenlzdGtpY2ggcGFyYW1ldHJhY2gNCm5hY2h5bGVuaWEiLCBnZHkgKioqam9pbnQqKiogamVzdCBmYWxzZTogIm5hbGXFvHkgemfFgmFzemHEhyBvZGR6aWVsbmUNCnRlc3R5IG5hIGthxbxkeW0geiBwYXJhbWV0csOzdyBuYWNoeWxlbmlhIi4NCg0KWmF1d2HFvCwgxbxlIHRlc3R5IGt3YW50eWxvd2Ugc8SFIHRlc3RhbWkgImxpbmlpIHLDs3dub2xlZ8WCZWoiLiBPem5hY3phIHRvLA0KxbxlIHBvd2lubmnFm215IHd5asSFxIcgcsOzxbxuZSB4LXd5cmF6eV93b2xuZSBkbGEga2HFvGRlZ28ga3dhbnR5bGEsIHBvbmlld2HFvA0KcmVwcmV6ZW50dWrEhSBvbmUgcG96aW9teSByb3prxYJhZMOzdyB3YXJ1bmtvd3ljaC4gSmXFm2xpIGplZG5haw0Kd3Nww7PFgmN6eW5uaWtpIGt3YW50eWxpIGRsYSB3c3DDs8WCY3p5bm5pa293IHPEhSB0YWtpZSBzYW1lLCB0byBuaWUgbWENCmVmZWt0w7N3IHNwZWN5Zmljem55Y2ggZGxhIGt3YW50eWxpLCB3eXN0YXJjesSFIGVmZWt0eSDFm3JlZG5pZS4NCg0KKipCYWRhbmllIHN0YXR5c3R5Y3puZWogcsOzxbxuaWN5IG1pxJlkenkgMjUuIGkgNTAuIGt3YW50eWxlbSB3YXJ1bmtvd3ltOioqDQoNCkJpb3LEhWMgcG9kIHV3YWfEmSBwb3d5xbxzemUgb3N6YWNvd2FuaWEga3dhbnR5bGksIHLDs8W8bmljYSBtacSZZHp5DQprd2FudHlsYW1pIDAsMjUgaSAwLDUwIGlzdG5pZWplLCBhbGUgY3p5IHPEhSBvbmUgd3lzdGFyY3phasSFY28gZHXFvGUsIGFieQ0KYnnEhyBzdGF0eXN0eWN6bmllIHLDs8W8bmU/IEpha2EgamVzdCB3YXJ0b8WbxIcgcD8gUHJ6ZWdsxIVkYWrEhWMgcG9uacW8c3plDQp3eW5pa2ksIG5pZSBzxIUgb25lIHN0YXR5c3R5Y3puaWUgcsOzxbxuZSENCg0KUG8gcGllcndzemUsIGpvaW50ID0gVFJVRS4gVG8gbmllIGplc3QgdGVzdG93YW5pZSwgY3p5IHdzcMOzxYJjenlubmlrIG5hDQpkaXNwIGplc3QgdGFraSBzYW0gamFrIHdzcMOzxYJjenlubmlrIG5hIGhwLiBUbyBqZXN0IHdzcMOzbG5lIHRlc3Rvd2FuaWUsDQpjenkgd3Nww7PFgmN6eW5uaWtpIGRsYSByw7PFvG55Y2gga3dhbnR5bGkgZGlzcCBpIHLDs8W8bnljaCBrd2FudHlsaSBocCBzxIUNCnRha2llIHNhbWUgZGxhIGthxbxkZWogem1pZW5uZWouDQoNCmBgYHtyfQ0Ka3dhbnR5bGUgPC0gYygwLjI1LCAwLjUwKQ0KcmVnX2t3YW50eWxvd2EgPC0gcnEobXBnIH4gZGlzcCArIGhwICsgZmFjdG9yKGFtKSx0YXUgPSBrd2FudHlsZSwgZGF0YSA9IG10Y2FycykNCmFub3ZhKHJlZ19rd2FudHlsb3dhLCB0ZXN0ID0gIldhbGQiLCBqb2ludD1UUlVFKQ0KYGBgDQoNClBvIGRydWdpZSwgam9pbnQgPSBGYWxzZToNCg0KYGBge3J9DQphbm92YShyZWdfa3dhbnR5bG93YSwgdGVzdCA9ICJXYWxkIiwgam9pbnQ9RkFMU0UpDQpgYGANCg0KKipCYWRhbmllIHN0YXR5c3R5Y3puZWogcsOzxbxuaWN5IG1pxJlkenkgMjUsIDUwIGkgNzUga3dhbnR5bGVtDQp3YXJ1bmtvd3ltOioqDQoNClBpZXJ3c3p5IGt3YXJ0eWwgaSBtZWRpYW5hIG5pZSB3eWRhasSFIHNpxJkgYnnEhyBzdGF0eXN0eWN6bmllIHLDs8W8bmUsIHRlcmF6DQpkb8WCxIVjenlteSB0cnplY2kga3dhcnR5bC4gSmFrIHdpZGHEhyB3Y3plxZtuaWVqLCBrd2FydHlsZSB3c3DDs2xuaWUNCnd5a2F6dWrEhSBncmFkaWVudC4gVGVyYXogbW/FvGVteSB6b2JhY3p5xIcsIMW8ZSAqKmRpc3AqKiwgKipocCoqIGkgKiphbSoqDQpzxIUgb2RkemllbG5pZSBzdGF0eXN0eWN6bmllIHLDs8W8bmUuDQoNClBvIHBpZXJ3c3plLCBqb2ludCA9IFRSVUU6DQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQprd2FudHlsZSA8LSBjKDAuMjUsIDAuNTAsIDAuNzUpDQoNCnJlZ19rd2FudHlsb3dhIDwtIHJxKG1wZyB+IGRpc3AgKyBocCArIGZhY3RvcihhbSksdGF1ID0ga3dhbnR5bGUsIGRhdGEgPSBtdGNhcnMpDQoNCmFub3ZhKHJlZ19rd2FudHlsb3dhLCB0ZXN0ID0gIldhbGQiLCBqb2ludD1UUlVFKQ0KYGBgDQoNClBvIGRydWdpZSwgam9pbnQgPSBGYWxzZToNCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmFub3ZhKHJlZ19rd2FudHlsb3dhLCB0ZXN0ID0gIldhbGQiLCBqb2ludD1GQUxTRSkNCmBgYA0KDQojIyMgRG9icm/EhyBkb3Bhc293YW5pYQ0KDQpNb8W8ZW15IG9ibGljennEhyB3c3DDs8WCY3p5bm5pa2kgZG9icm9jaSBkb3Bhc293YW5pYSByZWdyZXNqaSBrd2FudHlsb3dlaiB6DQp3eWtvcnp5c3RhbmllbSByZXN6dCBpIHJlc3p0IGJlendhcnVua293eWNoOg0KDQpgYGAgcg0KZ29vZGZpdChyZXNpZCwgcmVzaWRfbmwsIHRhdSkNCmBgYA0KDQpNaWFyYSBkb2Jyb2NpIGRvcGFzb3dhbmlhIGRsYSByZWdyZXNqaSBrd2FudHlsb3dlaiBqZXN0IHN6YWNvd2FuYSBqYWtvIDENCm1pbnVzIHN0b3N1bmVrIHN1bXkgb2RjaHlsZcWEIGJlend6Z2zEmWRueWNoIHcgbW9kZWxhY2ggdyBwZcWCbmkNCnNwYXJhbWV0cnl6b3dhbnljaCBkbyBzdW15IG9kY2h5bGXFhCBiZXp3emdsxJlkbnljaCB3IHplcm93eW0NCihiZXp3YXJ1bmtvd3ltKSBtb2RlbHUga3dhbnR5bG93eW0uDQoNCldhcnRvxZtjaSB0ZSBzxIUgcHJ6eWRhdG5lIGRvIHBvcsOzd25hxYQgbWnEmWR6eSBtb2RlbGFtaSBrd2FudHlsb3d5bWksIGFsZQ0KbmllIHPEhSBwb3LDs3dueXdhbG5lIHplIHN0YW5kYXJkb3d5bWkgd3Nww7PFgmN6eW5uaWthbWkgZGV0ZXJtaW5hY2ppLiBUZQ0Kb3N0YXRuaWUgb3BhcnRlIHPEhSBuYSB3YXJpYW5jamkgb2RjaHlsZcWEIGt3YWRyYXRvd3ljaCwgbmF0b21pYXN0DQp3YXJ0b8WbY2kgZG9icm9jaSBkb3Bhc293YW5pYSBkbGEgcmVncmVzamkga3dhbnR5bG93ZWogb3BhcnRlIHPEhSBuYQ0Kb2RjaHlsZW5pYWNoIGJlend6Z2zEmWRueWNoLiBXYXJ0b8WbY2kgZG9icm9jaSBkb3Bhc293YW5pYSB6YXdzemUgYsSZZMSFDQptbmllanN6ZSBuacW8IHdhcnRvxZtjaSBSXjJeLg0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KIyMgbW9kZWwga3dhbnR5bG93eQ0KbW9kZWwxIDwtIHJxKG1wZyB+IGRpc3AgKyBocCArIGZhY3RvcihhbSksdGF1ID0gMC41LCBkYXRhID0gbXRjYXJzKQ0KcmVzenR5MSA8LSByZXNpZChtb2RlbDEpDQoNCiMjIGJlendhcnVua293eSAocHVzdHkpIG1vZGVsIGt3YW50eWxvd3kNCm1vZGVsMiA8LSBycShtcGcgfiAxLCB0YXUgPSAwLjUsZGF0YT1tdGNhcnMpDQpyZXN6dHkyIDwtIHJlc2lkKG1vZGVsMikNCg0KZ29vZGZpdChyZXN6dHkxLCByZXN6dHkyLCAwLjUpDQoNCiMjIHIyIG1vZGVsdSBLTU5LIGRsYSBwb3LDs3duYW5pYQ0KbW9kZWxfbG0gPC0gbG0obXBnIH4gZGlzcCArIGhwICsgZmFjdG9yKGFtKSwgZGF0YSA9IG10Y2FycykNCg0Kc3VtbWFyeShtb2RlbF9sbSkkci5zcXVhcmVkDQpgYGANCg0KIyMgWmFkYW5pZQ0KDQpUZXJheiBXYXN6YSBrb2xlaiA7LSkNCg0KV2FzenltIHphZGFuaWVtIGR6aXNpYWogamVzdCB6YW1vZGVsb3dhbmllIC0gcG9yw7N3bmFuaWUgS01OSyBvcmF6DQpyZWdyZXNqaSBrd2FudHlsb3dlaiAocsOzxbxuby1wb3ppb21vd2VqKSBkbGEgem1pZW5uZWogImVhcm5pbmdzIiAtDQp3eW5hZ3JvZHplbmlhLg0KDQpEb2JpZXJ6IGkgcHJ6ZXRlc3R1aiBwcmVkeWt0b3J5LCBrd2FudHlsZSBkbGEgbW9kZWxpLiBXeWtvbmFqIHRlc3R5DQpyw7PFvG5pYyB3c3DDs8WCY3p5bm5pa293IGRsYSBmaW5hbG55Y2ggbW9kZWxpLg0KDQpXIHByenlwYWRrdSBwcm9ibGVtw7N3IC0gb2JlanJ6eWogdmlkZW8gdHV0b3JpYWwgKHfFgsSFY3ogcG9sc2tpZSBuYXBpc3kpDQpvcmF6IHdlamTFuiBuYSBqZWdvIHN0cm9uxJkgemUgxbpyw7NkxYJhbWkuIE1vxbxlc3ogcsOzd25pZcW8IHd5a29yenlzdGHEhyB3L3cNCnByenlrxYJhZHkuDQojIDEuIERhbmUNCmBgYHtyfQ0KZGF0YSgiQ1BTU1c5Mjk4IikNCiMgP0NQU1NXOTI5OCANCg0KaGVhZChDUFNTVzkyOTgpDQoNCkRhbmU8LUNQU1NXOTI5OA0KaGVhZChEYW5lKQ0KDQpgYGANCg0KIyAyLiBaYnVkb3dhbmllIG1vZGVsdSBLTU5LDQoNCmBgYHtyfQ0Kb2xzX21vZGVsIDwtIGxtKGVhcm5pbmdzIH4gZGVncmVlICsgZ2VuZGVyICsgYWdlLGRhdGEgPSBEYW5lKQ0Kc3VtbWFyeShEYW5lKQ0KYGBgDQoNCg0KDQojIDMuIFJlZ3Jlc2phIGt3YW50eWxvd2ENCiMgRG9wYXNvd2FuaWUgbW9kZWxpIGRsYSBrd2FudHlsaTogMC4yNSwgMC41IChtZWRpYW5hKSwgMC43NQ0KDQpgYGB7cn0NCg0KcnFfMjUgPC0gcnEoZWFybmluZ3MgfiBkZWdyZWUgKyBhZ2UgKyBnZW5kZXIsIGRhdGEgPSBEYW5lLCB0YXUgPSAwLjI1KQ0KcnFfNTAgPC0gcnEoZWFybmluZ3MgfiBkZWdyZWUgKyBhZ2UgKyBnZW5kZXIsIGRhdGEgPSBEYW5lLCB0YXUgPSAwLjUpDQpycV83NSA8LSBycShlYXJuaW5ncyB+IGRlZ3JlZSArIGFnZSArIGdlbmRlciwgZGF0YSA9IERhbmUsIHRhdSA9IDAuNzUpDQoNCg0Kc3VtbWFyeShycV8yNSkNCnN1bW1hcnkocnFfNTApDQpzdW1tYXJ5KHJxXzc1KQ0KDQpgYGANCg0KIyNPZ8OzbG5lIHphbGXFvG5vxZtjaToNCkVmZWt0IHd5a3N6dGHFgmNlbmlhIChkZWdyZWViYWNoZWxvcik6DQoNClBvc3pjemVnw7NsbmUgd2FydG/Fm2NpIGRsYSBkZWdyZWViYWNoZWxvciB3c2thenVqxIUsIMW8ZSBvc29ieSB6IHd5a3N6dGHFgmNlbmllbSBuYSBwb3ppb21pZSBsaWNlbmNqYXRhICh3IHBvcsOzd25hbml1IGRvIGdydXB5IHJlZmVyZW5jeWpuZWosIG5wLiBvc8OzYiBiZXogd3nFvHN6ZWdvIHd5a3N6dGHFgmNlbmlhKSB6YXJhYmlhasSFIGlzdG90bmllIHdpxJljZWogdyBrYcW8ZHltIGt3YW50eWx1ICgwLjI1LCAwLjUsIDAuNzUpLg0KV2FydG/Fm8SHIHdzcMOzxYJjenlubmlrYSB3enJhc3RhIHdyYXogeiBrd2FudHlsZW06DQoNCs+EPTAuMjU6ICszLjU5DQrPhD0wLjU6ICs0LjcwDQrPhD0wLjc1OiArNS43Ng0KDQpJbSB3ecW8c3p5IGt3YW50eWwgKGN6eWxpIHd5xbxzenkgcG96aW9tIHphcm9ia8OzdyksIHR5bSB3acSZa3N6eSB3cMWCeXcgd3lrc3p0YcWCY2VuaWEgbmEgemFyb2JraS4NCkVmZWt0IHdpZWt1IChhZ2UpOg0KDQpXaWVrIG1hIHBvenl0eXdueSBpIHN0YXR5c3R5Y3puaWUgaXN0b3RueSB3cMWCeXcgbmEgemFyb2JraSB3IGthxbxkeW0ga3dhbnR5bHUuDQpXc3DDs8WCY3p5bm5pa2kgcm9zbsSFIHdyYXogeiBrd2FudHlsZW06DQrPhD0wLjI1OiArMC4xNyDPhD0wLjU6ICswLjMxIM+EPTAuNzU6ICswLjQzDQpXecW8c3plIHphcm9ia2kgc8SFIGJhcmR6aWVqIHphbGXFvG5lIG9kIHdpZWt1IHcgZ8Ozcm55Y2gga3dhbnR5bGFjaCwgY28gbW/FvGUgc3VnZXJvd2HEhyB3acSZa3N6xIUga29yennFm8SHIHogZG/Fm3dpYWRjemVuaWEgemF3b2Rvd2VnbyB3IGxlcGllaiBwxYJhdG55Y2ggZ3J1cGFjaC4NCkVmZWt0IHDFgmNpIChnZW5kZXJmZW1hbGUpOg0KDQpXYXJ0b8WbY2kgd3Nww7PFgmN6eW5uaWthIGRsYSB6bWllbm5laiBnZW5kZXJmZW1hbGUgKHcgcG9yw7N3bmFuaXUgZG8gbcSZxbxjenl6bikgc8SFIHVqZW1uZSB3ZSB3c3p5c3RraWNoIGt3YW50eWxhY2gsIGNvIHdza2F6dWplIG5hIG5lZ2F0eXdueSB3cMWCeXcgYnljaWEga29iaWV0xIUgbmEgemFyb2JraS4NCkVmZWt0IHRlbiBzdGFqZSBzacSZIGJhcmR6aWVqIHd5cmHFum55IHcgd3nFvHN6eWNoIGt3YW50eWxhY2g6DQrwnZyPPTAuMjXPhD0wLjI1OiAtMS4zMvCdnI89MC41z4Q9MC41OiAtMi4xM/CdnI89MC43Nc+EPTAuNzU6IC0yLjk3DQpSw7PFvG5pY2EgdyB6YXJvYmthY2ggbWnEmWR6eSBwxYJjaWFtaSBqZXN0IHdpxJlrc3phIHcgZ8Ozcm55Y2gga3dhbnR5bGFjaCwgY28gbW/FvGUgc3VnZXJvd2HEhyB0encuICJzemtsYW55IHN1Zml0IiBsdWIgcsOzxbxuaWNlIHcgZG9zdMSZcGllIGRvIGxlcGllaiBwxYJhdG55Y2ggc3Rhbm93aXNrLg0KDQojU3RhdHlzdHljem5hIGlzdG90bm/Fm8SHOg0KDQpXc3p5c3RraWUgd3Nww7PFgmN6eW5uaWtpIHPEhSBzdGF0eXN0eWN6bmllIGlzdG90bmUgbmEgcG96aW9taWUgDQrwnZGdPDAuMDUNCnA8MC4wNSwgY28gd3NrYXp1amUgbmEgc2lsbmUgZG93b2R5IGRsYSBpY2ggd3DFgnl3dSBuYSB6YXJvYmtpIHcgYW5hbGl6b3dhbnljaCBrd2FudHlsYWNoLg0KWm1pYW55IHdzcMOzxYJjenlubmlrw7N3IHcga3dhbnR5bGFjaDoNCg0KV3Nww7PFgmN6eW5uaWtpIHLDs8W8bmnEhSBzacSZIG1pxJlkenkga3dhbnR5bGFtaSwgY28gcG9ka3JlxZtsYSwgxbxlIHdwxYJ5dyBwb3N6Y3plZ8OzbG55Y2ggem1pZW5ueWNoIG5pZSBqZXN0IHLDs3dub21pZXJueSB3IHLDs8W8bnljaCBjesSZxZtjaWFjaCByb3prxYJhZHUgemFyb2Jrw7N3LiBUbyBqZXN0IGfFgsOzd255IGNlbCBzdG9zb3dhbmlhIHJlZ3Jlc2ppIGt3YW50eWxvd2VqIOKAlCBhbmFsaXphIHdwxYJ5d3Ugem1pZW5ueWNoIHcgcsOzxbxueWNoIHB1bmt0YWNoIHJvemvFgmFkdS4NCg0KI1duaW9za2kga2/FhGNvd2U6DQpXeWtzenRhxYJjZW5pZSBqZXN0IGtsdWN6b3d5bSBjenlubmlraWVtIHp3acSZa3N6YWrEhWN5bSB6YXJvYmtpLCBzemN6ZWfDs2xuaWUgdyB3ecW8c3p5Y2gga3dhbnR5bGFjaC4NCldpZWsgbWEgd2nEmWtzemUgem5hY3plbmllIHcgbGVwaWVqIG9wxYJhY2FueWNoIGdydXBhY2gsIGNvIHN1Z2VydWplLCDFvGUgZG/Fm3dpYWRjemVuaWUgYmFyZHppZWogcHJlbWl1amUgb3NvYnkgbyB3ecW8c3p5Y2ggemFyb2JrYWNoLg0KUMWCZcSHIHBvem9zdGFqZSBpc3RvdG55bSBjenlubmlraWVtIHdwxYJ5d2FqxIVjeW0gbmEgemFyb2JraSwgcHJ6eSBjenltIHLDs8W8bmljZSBuYSBuaWVrb3J6ecWbxIcga29iaWV0IHPEhSB3acSZa3N6ZSB3IHd5xbxzenljaCBrd2FudHlsYWNoLg0KDQoNCiMgNC4gVGVzdCByw7PFvG5pYyB3c3DDs8WCY3p5bm5pa8Ozdw0KYGBge3J9DQoNCmFub3ZhKHJxXzI1LCBycV81MCwgcnFfNzUpDQoNCmBgYA0KDQojSW50ZXJwcmV0YWNqYSB3eW5pa3U6DQpIaXBvdGV6YSB6ZXJvd2E6DQoNClRlc3Qgc3ByYXdkemEgaGlwb3RlesSZIHplcm93xIUsIMW8ZSBuYWNoeWxlbmlhICh3c3DDs8WCY3p5bm5pa2kgcmVncmVzamkpIGRsYSByw7PFvG55Y2gga3dhbnR5bGkgc8SFIHRha2llIHNhbWUsIGN6eWxpOg0K8J2QuzA68J2bvfCdnI89IDAuMjU98J2bvfCdnI89MC41PfCdm73wnZyPPTAuNzUNCkggMCA6zrIgz4Q9MC4yNT3OsiDPhD0wLjU9zrIgz4Q9MC43NQ0KI1dhcnRvxZvEhyBwOg0KDQpXYXJ0b8WbxIcgcCB3eW5vc2kgPDIuMngxMF4xNiwgY28gb3puYWN6YSwgxbxlIHLDs8W8bmljZSBuYWNoeWxlxYQgc8SFIHd5c29jZSBzdGF0eXN0eWN6bmllIGlzdG90bmUuDQpIaXBvdGV6xJkgemVyb3fEhSBuYWxlxbx5IG9kcnp1Y2nEhyBuYSBrYcW8ZHltIHR5cG93eW0gcG96aW9taWUgaXN0b3Rub8WbY2kgKPCdm7w9MC4wNSzOsT0wLjAxLCBldGMuKS4NCg0KDQoNCg0KIyA1LiBXaXp1YWxpemFjamEgcG9yw7N3bmFuaWENCiMgRWtzdHJha2NqYSB3c3DDs8WCY3p5bm5pa8OzdyBkbGEgcsOzxbxueWNoIGt3YW50eWxpDQoNCmBgYHtyfQ0KDQpjb2VmZnMgPC0gZGF0YS5mcmFtZSgNCiAgVmFyaWFibGUgPSBuYW1lcyhjb2VmKHJxXzI1KSksDQogIE9MUyA9IGNvZWYob2xzX21vZGVsKSwNCiAgUTI1ID0gY29lZihycV8yNSksDQogIFE1MCA9IGNvZWYocnFfNTApLA0KICBRNzUgPSBjb2VmKHJxXzc1KQ0KKQ0KDQpwcmludChjb2VmZnMpDQoNCmBgYA0KDQojV25pb3NraQ0KDQpPTFMgZG9zdGFyY3phIHXFm3JlZG5pb25lZ28gb2JyYXp1IHdwxYJ5d3Ugem1pZW5ueWNoIG5pZXphbGXFvG55Y2ggbmEgemFyb2JraSwgY28gbW/FvGUgcHJvd2FkemnEhyBkbyB1dHJhdHkgd2HFvG55Y2ggaW5mb3JtYWNqaSBvIHLDs8W8bmljYWNoIG1pxJlkenkgZ3J1cGFtaSAoa3dhbnR5bGFtaSkuDQpSZWdyZXNqYSBrd2FudHlsb3dhIHVqYXduaWEgcsOzxbxuaWNlOg0KDQpXeWtzenRhxYJjZW5pZSBpIHdpZWsgbWFqxIUgd2nEmWtzenkgd3DFgnl3IG5hIG9zb2J5IHcgd3nFvHN6eWNoIGt3YW50eWxhY2ggKHogd3nFvHN6eW1pIHphcm9ia2FtaSkuDQpSw7PFvG5pY2UgcMWCYWNvd2UgbWnEmWR6eSBwxYJjaWFtaSBzxIUgbW5pZWpzemUgdyBkb2xueWNoIGt3YW50eWxhY2ggaSByb3NuxIUgd3JheiB6IGt3YW50eWxlbS4NCg0KDQoNCiMgV3lrcmVzIHdzcMOzxYJjenlubmlrw7N3DQpgYGB7cn0NCmNvZWZmc19sb25nIDwtIHRpZHlyOjpwaXZvdF9sb25nZXIoY29lZmZzLCBjb2xzID0gLVZhcmlhYmxlLCBuYW1lc190byA9ICJNb2RlbCIsIHZhbHVlc190byA9ICJDb2VmZmljaWVudCIpDQoNCmdncGxvdChjb2VmZnNfbG9uZywgYWVzKHggPSBWYXJpYWJsZSwgeSA9IENvZWZmaWNpZW50LCBmaWxsID0gTW9kZWwpKSArDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJkb2RnZSIpICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgbGFicyh0aXRsZSA9ICJQb3LDs3duYW5pZSB3c3DDs8WCY3p5bm5pa8OzdyByZWdyZXNqaSBLTU5LIGkga3dhbnR5bG93ZWoiLA0KICAgICAgIHggPSAiWm1pZW5uZSIsIHkgPSAiV2FydG/Fm8SHIHdzcMOzxYJjenlubmlrYSIpDQoNCmBgYA0KDQojaW50ZXJwcmV0YWNqYSB3eWtyZXN1DQoNCjEpIFd5xbxzemEgd2FydG/Fm8SHIHcgUTI1IG96bmFjemEsIMW8ZSBvc29ieSBvIG5pc2tpY2ggemFyb2JrYWNoIG1hasSFIHd6Z2zEmWRuaWUgd2nEmWtzemUgcG9kc3Rhd293ZSB3eW5hZ3JvZHplbmllIChuaWV6YWxlxbxuaWUgb2Qgem1pZW5ueWNoKSwgYSB3IFE3NSByw7PFvG5pY2Ugc8SFIG1uaWVqIHpuYWN6xIVjZS4NCg0KMikgRWZla3Qgd3lrc3p0YcWCY2VuaWEgamVzdCBiYXJkemllaiB3aWRvY3pueSB3IHd5xbxzenljaCBrd2FudHlsYWNoLCBjbyB3c2thenVqZSBuYSByb3NuxIVjxIUgd2FydG/Fm8SHIHd5a3N6dGHFgmNlbmlhIHcgbGVwaWVqIHDFgmF0bnljaCBzdGFub3dpc2thY2guDQoNCg0KMykgUsOzxbxuaWNlIHDFgmFjb3dlIG1pxJlkenkgcMWCY2lhbWkgc8SFIGJhcmR6aWVqIHd5cmHFum5lIHcgZ3J1cGFjaCBvIHd5xbxzenljaCB6YXJvYmthY2ggLT4gZGxhIHptaWVubmVqIGdlbmRlcmZlbWFsZSB3c3DDs8WCY3p5bm5payBqZXN0IG5pxbxzenkgdyBRMjUgaSBuYWpiYXJkemllaiBuZWdhdHl3bnkgdyBRNzUNCg0KNCkgU3RhcnN6ZSBvc29ieSB6IGdydXB5IHd5c29raWNoIHphcm9ia8OzdyBiYXJkemllaiBrb3J6eXN0YWrEhSBuYSBzd29pbSBkb8Wbd2lhZGN6ZW5pdSBuacW8IHRlIHogZ3J1cHkgbyBuacW8c3p5Y2ggemFyb2JrYWNoLg0KDQpgYGB7cn0NCg0KY2F0KCJLTU5LOiDFmnJlZG5pYSB3YXJ0b8WbxIcgem1pZW5uZWogZWFybmluZ3MgdyB6YWxlxbxub8WbY2kgb2QgcHJlZHlrdG9yw7N3LiIpDQpjYXQoIlJlZ3Jlc2phIGt3YW50eWxvd2E6IFptaWVubmUgbWFqxIUgcsOzxbxueSB3cMWCeXcgdyB6YWxlxbxub8WbY2kgb2QgcG96eWNqaSB3IHJvemvFgmFkemllIGVhcm5pbmdzLiIpDQoNCmBgYA0KDQo=