Motivation
In diesem Beispiel möchten wir uns die Funktionsweise von
Instrumentalvariablen genauer anschauen. Zu Beginn werden wir noch
einmal kurz Instrumentalvariablen in der Theorie beleuchten und diese
mit einem DAG darstellen. Anschließend möchten wir uns einen Datensatz
simulieren, bei dem wir der Frage nachgehen, ob Bildung das Einkommen
kausal beeinflusst. Dabei simulieren wir die Bildung so, dass
diese von der Nähe zur nächsten Universität, als auch den eigenen
Fähigkeiten abhängt.
Theorie
Folgende Fragestellung, welche wir in diesem Semester bereits
mehrfach beleuchtet haben, wollen wir hier noch einmal aufgreifen:
Gibt es einen kausalen Zusammenhang zwischen Bildung und
(späterem) Einkommen?
Bei dieser Frage stehen wir vor einem Problem, da die Bildung von
mehreren Faktoren abhängt, die auch das Einkommen beeinflussen. Einige
dieser Faktoren hatten Sie bereits in der Veranstaltung kennen gelernt
(und auch selbst genannt): Familieneinkommen, Bildung der Eltern, eigene
Fähigkeiten, Netzwerk …
Um uns die Wirkungsweise der Instrumentalvariablenregression näher
anzuschauen wollen wir eine vereinfachte Simulationsstudie durchführen.
In dieser Simulation konzentrieren wir uns auf den Zusammenhang zwischen
der Bildung und dem Einkommen, sowie einer (unbeobachtbaren)
Hintergrundvariablen, nennen wir sie “Fähigkeiten”, welche wir in
unserem simulierten Datensatz beobachten können. Durch unsere Simulation
können wir ergründen ob wir den (simulierten) kausalen Effekt der
Bildung auf das Einkommen mit unterschiedlichen
Regressionsspezifikationen erhalten können.
Wir sehen den Zusammenhang zwischen der Bildung und den
(unbeobachtbaren) Fähigkeiten, sowie zwischen Einkommen und
(unbeobachtbaren) Fähigkeiten in folgendem DAG:
\[\color{#0074D9}{\text{Einkommen}_i} =
\beta_0 + \beta_1 \color{darkorange}{\text{Bildung}_i} + \beta_2
\color{red}{\text{Fähigkeiten}_i} + \varepsilon_i\]
Die (unbeobachtbaren) Fähigkeiten sind eine Confounder, auf
welchen wir kontrollieren müssten. Kontrollieren wir nicht auf die
(unbeobachtbaren) Fähigkeiten, so würden wir die backdoor im
DAG nicht schließen und der Einfluss der Fähigkeiten wandert in
den Fehlerterm:
Der Fehlerterm besteht dann aus:
\(\color{red}{\eta_i} = \beta_2
\color{red}{\text{Fähigkeiten}_i} + \varepsilon_i\)
und damit ist die Bildung mit dem Fehlerterm \(\color{red}{\eta_i}\) korreliert:
\[\color{#0074D9}{\text{Einkommen}_i} =
\beta_0 + \beta_1 \color{darkorange}{\text{Bildung}_i} +
\color{red}{\eta_i}\] Folglich wäre die Bildungsentscheidung in
unserer Schätzung endogen und wir würden durch eine “naive” Schätzung
des Einkommens auf die Bildung (ohne auf die Fähigkeiten zu
kontrollieren) einen verzerrten Effekt der Bildung auf das Einkommen
erhalten. Da die Fähigkeiten einer Person sowohl seine
Bildungsentscheidung als auch sein späteres Einkommen positiv
beeinflussen, wäre der Koeffizient \(\beta_1\) in der naiven Schätzung
systematisch nach oben verzerrt. D.h. der Koeffizient \(\beta_1\), welchen wir in der naiven
Schätzung heraus bekommen würden, wäre größer als der wahre Wert.
Daten simulieren
Um das Prinzip der Instrumentalvariablenschätzung zu veranschaulichen
wollen wir eine kleine Simulationsstudie betrachten, bei der wir den
“wahren” Wert der Variable kennen und wissen, ob ein Schätzer in der
Regression verzerrt ist, oder den korrekten Wert wiedergibt.
Durch Simulationsstudien können wir Probleme oder Unklarheiten
untersuchen und bekommen dadurch eine Intuition vom
Datengenerierungsprozess in echten empirischen Datensätzen.
set.seed(2021)
nrows <- 50000
distance <- tibble(
faehigkeiten = rnorm(nrows, 0, 1), # Fähigkeit
naehe = runif(nrows, 0, 1), # Entfernung zur Uni (Instrumentalvariable)
error_eink = rnorm(nrows, 0, 100) # Fehlerterm
) %>%
mutate(bildung = 13 + 0.4*naehe + 2*faehigkeiten, # Bildung (Erklärende Variable)
eink = 100 + 40*bildung + 70*faehigkeiten - error_eink) # Einkommen (Ergebnisvariable)
Wir simulieren uns einen Datensatz aus 50000 Personen, die wir
untersuchen möchten (dies definieren wir in der zweiten Zeile). Danach
generieren wir uns einen Datensatz der folgende Variablen enthält:
faehigkeiten
= Fähigkeiten.
- Diese Variable ist standardnormalverteilt zwischen 0 und 1.
- Annahme: Die Fähigkeiten sind in der Bevölkerung normalverteilt
naehe
= Entfernung zur Uni.
- Diese Variable ist gleichverteilt.
- Kann als “Dummy-Variable” interpretiert werden und ist 1 für
Personen, welche Nahe an einer Uni wohnen und 0 für diejenigen die
weiter weg wohnen
error_eink
= Fehlerterm der Ergebnisvariablen
- Schließlich ist unsere Schätzung immer etwas ungenau im realen
Leben
bildung
= Bildung.
- Im Durchschnitt haben alle Personen bei uns eine Bildung von 13
Jahren
- Weiterhin ist die Bildung abhängig von der Distanz zur Uni und den
eigenen Fähigkeiten
eink
= wöchentliches Einkommen
- Das Basiseinkommen ist 100€ und es gibt eine Komponente für die
Bildung und die Fähigkeiten (+ den oben angesprochenen Fehlerterm)
- Je mehr Bildung eine Person hat, desto mehr Einkommen hat Sie ( für
jedes Jahr mehr Bildung gibt es 40€ mehr Wocheneinkommen )
- Je größer die Fähigkeiten einer Person sind, desto mehr Einkommen
bekommt diese ( für jede Einheit an Fähigkeiten mehr gibt es 70€ mehr
Wocheneinkommen )
Der Vorteil dieser Simultionsstudie gegenüber empirischen
Datensätzen: Wir kennen den Effekt der Bildung auf das Einkommen! In
unserer Simulationsstudie liegt er bei 40€!
Diese Kenntnis können wir nutzen um die Verzerrung des Koeffizienten
\(\beta_1\) näher zu betrachten. Wie
verändert sich der Koeffizient \(\beta_1\) ohne und mit der Kontrolle auf
die Hintergrundvariable “Fähigkeiten”:
ols_bias <- lm(eink ~ bildung, data = distance)
ols_correct <- lm(eink ~ bildung + faehigkeiten, data = distance)
cm <- c("bildung" = "Bildung",
"faehigkeiten" = "Fähigkeiten",
"(Intercept)" = "Konstante")
modelsummary(list(ols_bias, ols_correct),
type = "html",
fmt = 3,
statistic = 'conf.int',
conf_level = .99,
coef_map = cm,
gof_omit = 'DF|Deviance|RMSE|AIC|BIC|Log.Lik|F',
title = "Wocheneinkommen") %>%
add_header_above(c(" " = 1,"OLS Bias" = 1, "OLS Kontrolle" = 1))
Wocheneinkommen
|
OLS Bias
|
OLS Kontrolle
|
|
(1)
|
(2)
|
Bildung
|
74.720
|
39.646
|
|
[74.147, 75.292]
|
[29.649, 49.643]
|
Fähigkeiten
|
|
70.371
|
|
|
[50.346, 90.396]
|
Konstante
|
−358.240
|
104.744
|
|
[−365.889, −350.591]
|
[−27.225, 236.713]
|
Num.Obs.
|
50000
|
50000
|
R2
|
0.693
|
0.694
|
R2 Adj.
|
0.693
|
0.694
|
Wie von uns erwartet überschätzen wir den Effekt der Bildung auf das
Einkommen massiv, wenn wir nicht auf die Fähigkeiten kontrollieren. In
der naiven Schätzung in der ersten Spalte würden wir davon ausgehen,
dass ein Jahr mehr Bildung mit 74.72€ mehr Einkommen pro Woche
assoziiert ist. Wobei der wahre Effekt bei 40€ pro Woche liegt. Die
korrekte Effektgröße erhalten wir in unserer zweiten Schätzung, wenn wir
auf die Fähigkeiten kontrollieren! Hierbei liegt der wahre Wert (wie wir
diesen simuliert haben) im 99% Konfidenzintervall des Schätzers von
bildung
(Konfidenzintervall [29.649, 49.643]). Man beachte
das sowohl der Koeffizient \(\beta_1\)
von bildung
der naiven Schätzung aus der ersten Spalte, wie
auch der zweiten Spalte hoch signifikant sind. Das 99%
Konfidenzintervall in der ersten Regression ist deutlich kleiner als in
der zweiten Regression ([74.147,75.292] vs. [29.649,49.643]), obwohl nur
die zweite Regression ein korrektes Ergebnis liefert. Der Koeffizient
der ersten Schätzung ist stark nach oben verzerrt, d.h. auch wenn ein
Koeffizient statistisch signifikant ist, so heißt dies nicht
automatisch, dass dieser auch korrekt ist. Dafür muss erst das Modell
richtig spezifiziert sein!
Instrumentalvariablen
Da wir in einem realen Datensatz die Fähigkeiten nicht beobachten
können bleibt uns dieser direkte Weg mit der Kontrolle auf die
Fähigkeiten leider verschlossen. Allerdings sollten wir nicht verzagen.
Hier hilft uns die so genannte Instrumentalvariablenschätzung weiter.
Bei der Instrumentalvariablenschätzung nutzen wir die Variation einer
exogenen Variablen, welche unsere endogene Variable beeinflusst. Konkret
nutzen wir in unserem Fall den Teil der Bildung, welcher durch
die exogene Variable Nähe erklärt werden kann, um mittels
dieses exogenen Teils der Bildung dessen kausalen Effekt auf
das Einkommen zu bestimmen. Doch was genau bedeutet dies?
Wir wollen uns das Prinzip der Instrumentalvariablenschätzung anhand
eines DAG anschauen:
Hintergrund: X
sollte exogen sein um
kausal interpretiert werden zu können
Ziel der Instrumentalvariable: Exogene Variation von
X
finden, welche dann kausal interpretiert werden
kann
Wir können uns dies vorstellen als Gegenteil davon auf eine Variable
zu kontrollieren:
- Wir erklären
X
und Y
mit der Variablen
Z
, aber anstatt uns auf den Teil zu konzentrieren, welcher
nicht durch Z
erklärt werden kann, nehmen wir nur
den Anteil der durch Z
erklärt wird!
- Anstatt zu sagen “du bist auf einer backdoor, ich schließe
dich” sagen wir “du hast keine backdoor! Ich will, dass mein
X
genau so sein soll wie du! Ich nehme nur den Part von
X
, welcher von dir erklärt wird!”
- Dadurch nutzen wir nur noch die exogene Variation in
X
,
welche durch Z
erklärt wird
Folge: Wir nutzen nicht mehr die komplette
Information unseres Datensatzes, sondern nur noch einen Teil, d.h. wir
benötigen mehr Beobachtungen um Effekte messen zu können. Diese
ungenauere Schätzung des Effekts drückt sich in der Regression als
größerer Standardfehler des Schätzers aus!
Was sind gute Instrumentalvariablen?
Um abschätzen zu können, ob wir eine Variable als
Instrumentalvariable nutzen können müssen wir drei Eigenschaften
prüfen:
Relevanz:
- Die Instrumentalvariable muss mit der/den endogenen Variable/n
korreliert sein.
Ausschließlichkeit:
- Die Instrumentalvariable beeinflusst die exogene Variable nicht
direkt, sondern ausschließlich über die endogene
Variable
Exogenität:
- Die Instrumentalvariable ist nicht mit den ausgelassenen Variablen
(omitted variables) korreliert
Relevanz
Wir können die Relevanz unserer Instrumentalvariablen testen. Dies
machen wir für unseren simulierten Datensatz, indem wir die Variable
Bildung ( bildung
) auf die Instrumentalvariable (
naehe
) regressieren. Die Instrumentalvariable sollte einen
Einfluss auf die Bildung haben und Personen die näher an der Universität
wohnen sollten mehr Bildung in Anspruch nehmen. Sollte dies nicht der
Fall sein, so wäre unsere Instrumentalvariable nicht relevant und wir
sollten uns eine andere Instrumentalvariable suchen.
first_stage_basic <- lm(bildung ~ naehe, data = distance)
summary(first_stage_basic)
##
## Call:
## lm(formula = bildung ~ naehe, data = distance)
##
## Residuals:
## Min 1Q Median 3Q Max
## -9.0409 -1.3573 -0.0147 1.3581 9.4839
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 13.01219 0.01803 721.5 <2e-16 ***
## naehe 0.38714 0.03121 12.4 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 2.014 on 49998 degrees of freedom
## Multiple R-squared: 0.003068, Adjusted R-squared: 0.003048
## F-statistic: 153.8 on 1 and 49998 DF, p-value: < 2.2e-16
In unserem Fall ist die Instrumentalvariable naehe
hoch
signifikant. Die F-Statistik, welche angibt ob die getesteten Variablen
zusammen einen Effekt auf die Bildung haben liegt bei 153.8.
Als Faustregel können wir uns hier merken, dass diese F-Statistik größer
als 10 sein sollte (allerdings ist dies nur eine Faustregel und sollte
nicht das Maß aller Dinge sein). Falls die F-Statistik kleiner ist als
10, so wird in der Literatur oft von einem schwachen Instrument
gesprochen. Solche schwachen Instrumentalvariablen führen zu
einer Verzerrung unseres Schätzers in der
Instrumentalvariablenregression. Durch die Verwendung von schwachen
Instrumenten erhalten wir wieder einen Bias in unserer Regression,
welcher in Richtung des OLS Bias geht. Je stärker unser Instrument ist,
desto weniger groß ist der Bias in der Instrumentalvariablenregression.
Weiterhin sind Instrumentalvariablenregressionen weniger effizient als
OLS Regressionen, da wir einen kleineren Teil der Variation in den Daten
für unsere Schätzung nutzen (nur den Part, welcher durch das Instrument
erklärt werden kann), dies resultiert in einem größeren Standardfehler
des Schätzers, verglichen mit der OLS Regression. D.h. durch schwache
Instrumentalvariablen erhalten wir einen Bias in unserer Regression,
welcher in Richtung OLS-Bias geht + erhalten größere Konfidenzintervalle
durch die Instrumentalvariablenschätzung … wenn wir so wollen nehmen wir
die negativen Aspekte beider Welten durch schwache Instrumente mit,
weshalb wir diese nach Möglichkeit vermeiden sollten.
In der späteren Analyse der Instrumentalvariablenregression haben wir
zusätzlich die Verwendung eines schwachen Instruments simuliert um die
gerade beschriebenen Effekte zu zeigen.
Ausschließlichkeit
Leider könne wir die Ausschließlichkeit von naehe
nicht
prüfen, sondern müssen diese ökonomisch begründen. Wir sollten
erläutern, warum die Entfernung zur Universität das Einkommen
ausschließlich über die Bildung und nicht über einen anderen
Weg beeinflussen kann. Sobald wir einen Zusammenhang zwischen der Nähe
zur Universität und dem Einkommen hätten, wäre unser Instrument auch
endogen und wir könnten es nicht verwenden (bzw. nur bedingt). In
unserer Simulationsstudie ist dies kein Problem da wir die Variable
naehe
so simuliert haben, dass diese das Einkommen
ausschließlich über die Bildung beeinflusst.
Exogenität
Exogenität bedeutet, dass die Instrumentalvariable nicht mit der
(unbeobachtbaren) ausgelassenen Variable korreliert ist. Es gibt auch
für die Exogenität keinen statistischen Test der uns sagt, ob unsere
Instrumentalvariable(n) exogen sind, da wir keine Möglichkeit haben für
andere ausgelassenen Variablen zu kontrollieren (dies war ja gerade der
Grund, warum wir die Instrumentalvariable verwenden!). Wenn wir
Informationen zu den ausgelassenen Variablen hätten, dann könnten wir
auf diese kontrollieren und bräuchten die Instrumentalvariable gar nicht
(siehe DAG oben).
Der Vorteil in unserer Simulationsstudie: Wir haben die (eigentlich
unbeobachtbare) Variable “Fähigkeiten” und können nun tatsächlich
schauen, wie hoch die Korrelation zwischen der Instrumentalvariable
naehe
und der faehigkeiten
ist. Eine
Möglichkeit die uns in der Realität leider verwehrt bleibt:
round(cor(distance$naehe, distance$faehigkeiten),2)
## [1] 0
In unserer Simulation ist die Exogenitätsannahme erfüllt (schließlich
haben wir die Variablen entsprechend simuliert). In der Realität könnte
es Verbindungen zwischen der Nähe des Wohnorts zu einer Uni und den
Fähigkeiten einer Person geben. Fallen ihnen hierzu Beispiele ein?
Two-stage least squares
Two-stage least squares (2SLS) per Hand
Ok, wir wollen also mittels der Instrumentalvariablen
naehe
unsere eigentliche Variable bildung
beschreiben und dadurch den exogenen Teil von bildung
herausfinden. Mit diesem exogenen Teil von bildung
, welcher
nun nicht mehr von faehigkeiten
abhängt, können wir dann
den kausalen Effekt der Bildung auf das Einkommen bestimmen.
D.h. die Bildung, die nicht durch die Fähigkeiten bestimmt wird. Hört
sich nach einem einfachen Prozess mit mehreren Schritten an, den wir
hier durchführen können!
Genau das wollen wir nun tun:
- Wir regressieren die Bildung (
bildung
) auf die
Instrumentalvariable ( naehe
). Dies nennen wir
first_stage und sollte uns bekannt vorkommen, schließlich haben
wir das bereits gemacht um die Relevanz des Instruments zu
bestimmen:
first_stage <- lm(bildung ~ naehe, data = distance)
- Als nächstes extrahieren wir die Variation von
bildung
,
welche von naehe
erklärt werden kann. Dafür nutzen wir die
Ergebnisse aus unserer first_stage Regression und schauen uns
an, welche Werte wir für bildung
vorhergesagt hätten,
gegeben der jeweiligen naehe
zur Uni. Konkret nutzen wir
die gefitteten Werte unserer first_stage Regression (
.fitted
) und fügen diese unserem Datensatz hinzu (eine
einfache Methode bietet die Funktion augment_columns()
aus
dem Paket broom
).
distance <- augment_columns(first_stage, distance) %>%
select(eink, bildung, faehigkeiten, naehe, error_eink, `.fitted`)
head(distance)
## # A tibble: 6 × 6
## eink bildung faehigkeiten naehe error_eink .fitted
## <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 526. 12.9 -0.122 0.303 80.1 13.1
## 2 719. 14.3 0.552 0.563 -6.73 13.2
## 3 626. 13.8 0.349 0.242 50.4 13.1
## 4 443. 13.9 0.360 0.408 238. 13.2
## 5 806. 14.9 0.898 0.169 -48.4 13.1
## 6 300. 9.20 -1.92 0.118 33.6 13.1
Uns interessieren insbesondere die gefitteten Werte (
.fitted
), da dies die Variation in bildung
widerspiegelt, die exogen ist und damit ohne den Einfluss der
Fähigkeiten.
- Nun können wir die Spalte
.fitted
nutzen um den
kausalen Effekt der Bildung auf das Einkommen zu schätzen (in
einer zweiten Regression):
second_stage <- lm(eink ~ `.fitted`, data = distance)
summary(second_stage)
##
## Call:
## lm(formula = eink ~ .fitted, data = distance)
##
## Residuals:
## Min 1Q Median 3Q Max
## -756.98 -122.03 -0.35 121.66 798.90
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 120.376 95.670 1.258 0.208
## .fitted 38.477 7.244 5.312 1.09e-07 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 180.9 on 49998 degrees of freedom
## Multiple R-squared: 0.0005639, Adjusted R-squared: 0.000544
## F-statistic: 28.21 on 1 and 49998 DF, p-value: 1.092e-07
Die Ergebnisse dieser Regression sollten nun den tatsächlichen Effekt
der Bildung auf das Einkommen widerspiegeln, da wir durch unsere
Instrumentalvariable den endogenen Part der Bildung (beeinflusst von den
Fähigkeiten) entfernt haben. Und tatsächlich der Effekt der Bildung auf
das Einkommen entspricht 38,77€ für ein Jahr mehr Bildung (simuliert
hatten wir 40€)!
Two-stage least squares (2SLS) in R
Die händische Berechnung der einzelnen Regressionen ist hilfreich um
sich klar zu werden, was genau die so genannte “Two-stage least squares”
macht um eine Instrumentalvariablenregression durchzuführen:
Es gibt zwei “stages”, d.h. zwei Regressionen, die nacheinander
durchgeführt werden.
In der ersten “stage” erklären wir unsere endogene Variable durch das
Instrument und in der zweiten “stage” nutzen wir die
gefitteten/vorhergesagten Werte der ersten Regression um unsere
eigentliche Fragestellung zu beantworten. Jedoch gibt es einige
Nachteile, wenn wir eine solche 2SLS per Hand durchführen:
- Die Standardfehler sind nicht korrekt
- Das R² (und weitere Diagnostiken) der zweiten “stage” werden nicht
korrekt geschätzt.
Dies liegt daran das wir nicht die gemessene
bildung
in der zweiten “stage” verwenden, sondern die
geschätzen Werte .fitted
aus der ersten “stage”. Daher
müssen wir die Ergebnisse aus der zweiten “stage” anpassen. Dies wollen
wir jedoch nicht auch von Hand machen, sondern nutzen hierzu das Paket
AER
mit der Funktion ivreg()
, welche diese
Anpassungen für uns vornimmt.
Dies wollen wir nun tun und die Ergebnisse unserer unterschiedlicher
Regressionen gegenüberstellen.
ols_iv <- ivreg(eink ~ bildung | naehe , data = distance)
cm <- c("bildung" = "Bildung",
".fitted" = "Bildung_Dach",
"faehigkeiten" = "Fähigkeiten",
"(Intercept)" = "Konstante")
modelsummary(list(ols_bias, ols_correct, second_stage, ols_iv),
type = "html",
#keep = c("educ", "bildung_hat"),
fmt = 3,
statistic = 'conf.int',
conf_level = .99,
gof_omit = 'DF|Deviance|Log.Lik.|F|RMSE|AIC|BIC',
coef_map = cm,
#column.labels = c("OLS Bias", "OLS Kontrolle", "2SLS per Hand", "2SLS starkes Instrument"),
title = "Log(Einkommen) auf Bildung regressiert") %>%
add_header_above(c(" " = 1,"OLS Bias" = 1, "OLS Kontrolle" = 1, "2SLS\nhändisch" = 1, "2SLS\n starkes Instrument" = 1)) %>%
add_header_above(c(" " = 1,"OLS" = 3, "Instrumentalvariable" = 1))
Log(Einkommen) auf Bildung regressiert
|
OLS
|
Instrumentalvariable
|
|
OLS Bias
|
OLS Kontrolle
|
2SLS händisch
|
2SLS starkes Instrument
|
|
(1)
|
(2)
|
(3)
|
(4)
|
Bildung
|
74.720
|
39.646
|
|
38.477
|
|
[74.147, 75.292]
|
[29.649, 49.643]
|
|
[25.683, 51.272]
|
Bildung_Dach
|
|
|
38.477
|
|
|
|
|
[19.817, 57.138]
|
|
Fähigkeiten
|
|
70.371
|
|
|
|
|
[50.346, 90.396]
|
|
|
Konstante
|
−358.240
|
104.744
|
120.376
|
120.376
|
|
[−365.889, −350.591]
|
[−27.225, 236.713]
|
[−126.063, 366.814]
|
[−48.589, 289.341]
|
Num.Obs.
|
50000
|
50000
|
50000
|
50000
|
R2
|
0.693
|
0.694
|
0.001
|
0.530
|
R2 Adj.
|
0.693
|
0.694
|
0.001
|
0.530
|
In der ersten Spalte haben wir das naive Modell, welches den Effekt
der Bildung auf das Einkommen überschätzt. In der zweiten Spalte sehen
wir das Modell, wie wir es gerne schätzen möchten, mit der (in realen
Datensätzen unbeobachtbaren) Variablen Fähigkeiten (
faehigkeiten
). In dieser zweiten Spalte erhalten wir den
korrekten Koeffizienten für bildung
! In der dritten Spalte
berechnen wir die 2SLS von Hand. Hier erhalten wir auch den korrekten
Koeffizienten für bildung
(in diesem Modell
Bildung_Dach
genannt), wie auch in der automatisch von R
berechneten 2SLS in der 4. Spalte. Wir konnten mit der
Instrumentalvariable die exogene Variation von bildung
erfolgreich extrahieren und erhalten den kausalen Effekt von
einem Jahr mehr Bildung auf das Wocheneinkommen, welcher in unserer
Regression bei 38,477€ liegt. Ziemlich gut geschätzt würde ich sagen,
schließlich haben wir den wahren Effekt auf 40€ simuliert!
Im Vergleich der 3. und 4. Spalte sehen wir den vorhin erwähnten
Unterschied in den Standardfehlern und dem R², welche durch das
AER
Paket mit der Funktion ivreg()
automatisch
korrigiert wird.
Schwache Instrumente
Nun erhalten wir mit unserem Instrument den kausalen Effekt
der Bildung auf das Einkommen. Das ist toll! Doch unser Instrument war
mit einer F-Statistik von 153.8 in der first-stage sehr
relevant für die exogene Variation in bildung
. Angenommen
wir haben nur ein schwaches Instrument zur Verfügung, können wir dennoch
valide Ergebnisse schätzen, oder erhalten wir durch den Bias in der
Instrumentalvariablenregression stark verzerrte Ergebnisse?
#Zuerst generieren wir uns ein schwaches Instrumnte (0.001 * distance)
distance <- distance %>%
mutate(bildung_weak = 13 + 0.001*naehe + 2*faehigkeiten, # Distance als schwaches Instrument für Bildung
eink_weak = 100 + 40*bildung_weak + 70*faehigkeiten - error_eink)
#Um anschließend die IV Regression mit diesem Instrument durchlaufen zu lassen
ols_iv_weak <- ivreg(eink_weak ~ bildung_weak | naehe , data = distance)
#Wir speichern den Weak-Instruments Test aus der first-stage ab und fügen diese Spalte unserer Regression in stargazer hinzu (für starkes und schwaches Instrument)
ols_iv_test <- summary(ols_iv, diagnostics = T)$diagnostics[1,3] #starkes Instrument
ols_iv_weak_test <- summary(ols_iv_weak, diagnostics = T)$diagnostics[1,3] #schwaches Instrument
cm <- c("bildung" = "Bildung",
".fitted" = "Bildung_Dach",
"bildung_weak" = "Bildung",
"faehigkeiten" = "Fähigkeiten",
"(Intercept)" = "Konstante")
modelsummary(list(ols_bias, ols_correct, second_stage, ols_iv, ols_iv_weak),
type = "html",
#keep = c("educ", "bildung_hat"),
fmt = 3,
statistic = 'conf.int',
conf_level = .99,
gof_omit = 'DF|Deviance|Log.Lik.|F|RMSE|AIC|BIC',
coef_map = cm,
title = "Log(Einkommen) auf Bildung regressiert") %>%
add_header_above(c(" " = 1,"OLS Bias" = 1, "OLS Kontrolle" = 1, "2SLS\nhändisch" = 1, "2SLS\n starkes Instrument" = 1, "2SLS\n schwaches Instrument" = 1)) %>%
add_header_above(c(" " = 1,"OLS" = 3, "Instrumentalvariable" = 2))
Log(Einkommen) auf Bildung regressiert
|
OLS
|
Instrumentalvariable
|
|
OLS Bias
|
OLS Kontrolle
|
2SLS händisch
|
2SLS starkes Instrument
|
2SLS schwaches Instrument
|
|
(1)
|
(2)
|
(3)
|
(4)
|
(5)
|
Bildung
|
74.720
|
39.646
|
|
38.477
|
89.720
|
|
[74.147, 75.292]
|
[29.649, 49.643]
|
|
[25.683, 51.272]
|
[−262.367, 441.806]
|
Bildung_Dach
|
|
|
38.477
|
|
|
|
|
|
[19.817, 57.138]
|
|
|
Fähigkeiten
|
|
70.371
|
|
|
|
|
|
[50.346, 90.396]
|
|
|
|
Konstante
|
−358.240
|
104.744
|
120.376
|
120.376
|
−546.396
|
|
[−365.889, −350.591]
|
[−27.225, 236.713]
|
[−126.063, 366.814]
|
[−48.589, 289.341]
|
[−5125.724, 4032.932]
|
Num.Obs.
|
50000
|
50000
|
50000
|
50000
|
50000
|
R2
|
0.693
|
0.694
|
0.001
|
0.530
|
0.666
|
R2 Adj.
|
0.693
|
0.694
|
0.001
|
0.530
|
0.666
|
Wir sehen was wir bereits weiter oben im Text erwähnt hatten:
- Der Bias des IV Schätzers ist deutlich sichtbar und sehr groß. D.h.
durch ein schwaches Instrument driften wir sehr weit weg vom
eigentlichen kausalen Effekt
- Die Standardfehler in der IV Regression mit einem schwachen
Instrument sind sehr groß
LS0tCnRpdGxlOiAiU2ltdWxhdGlvbnNzdHVkaWUgenVyIEluc3RydW1lbnRhbHZhcmlhYmxlbnNjaMOkdHp1bmciCm91dHB1dDogCiAgaHRtbF9kb2N1bWVudDoKICAgIHRoZW1lOiBjb3NtbwogICAgY29kZV9kb3dubG9hZDogdHJ1ZQogICAgY29kZV9mb2xkaW5nOiBoaWRlCiAgICB0b2M6IHRydWUKICAgIHRvY19mbG9hdDogdHJ1ZQotLS0KCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShicm9vbSkKbGlicmFyeShnZ2RhZykKbGlicmFyeShrYWJsZUV4dHJhKQpsaWJyYXJ5KHNjYWxlcykKbGlicmFyeShtb2RlbHN1bW1hcnkpCmxpYnJhcnkoc3RhcmdhemVyKQpsaWJyYXJ5KEFFUikKa25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nID0gRkFMU0UpCmBgYAoKIyBNb3RpdmF0aW9uCgpJbiBkaWVzZW0gQmVpc3BpZWwgbcO2Y2h0ZW4gd2lyIHVucyBkaWUgRnVua3Rpb25zd2Vpc2Ugdm9uIEluc3RydW1lbnRhbHZhcmlhYmxlbiBnZW5hdWVyIGFuc2NoYXVlbi4gWnUgQmVnaW5uIHdlcmRlbiB3aXIgbm9jaCBlaW5tYWwga3VyeiBJbnN0cnVtZW50YWx2YXJpYWJsZW4gaW4gZGVyIFRoZW9yaWUgYmVsZXVjaHRlbiB1bmQgZGllc2UgbWl0IGVpbmVtIERBRyBkYXJzdGVsbGVuLiBBbnNjaGxpZcOfZW5kIG3DtmNodGVuIHdpciB1bnMgZWluZW4gRGF0ZW5zYXR6IHNpbXVsaWVyZW4sIGJlaSBkZW0gd2lyIGRlciBGcmFnZSBuYWNoZ2VoZW4sIG9iIEJpbGR1bmcgZGFzIEVpbmtvbW1lbiBfa2F1c2FsXyBiZWVpbmZsdXNzdC4gRGFiZWkgc2ltdWxpZXJlbiB3aXIgZGllIEJpbGR1bmcgc28sIGRhc3MgZGllc2Ugdm9uIGRlciBOw6RoZSB6dXIgbsOkY2hzdGVuIFVuaXZlcnNpdMOkdCwgYWxzIGF1Y2ggZGVuIGVpZ2VuZW4gRsOkaGlna2VpdGVuIGFiaMOkbmd0LiAKCiMgVGhlb3JpZQoKRm9sZ2VuZGUgRnJhZ2VzdGVsbHVuZywgd2VsY2hlIHdpciBpbiBkaWVzZW0gU2VtZXN0ZXIgYmVyZWl0cyBtZWhyZmFjaCBiZWxldWNodGV0IGhhYmVuLCB3b2xsZW4gd2lyIGhpZXIgbm9jaCBlaW5tYWwgYXVmZ3JlaWZlbjogCgpHaWJ0IGVzIGVpbmVuIF9rYXVzYWxlbl8gWnVzYW1tZW5oYW5nIHp3aXNjaGVuIEJpbGR1bmcgdW5kIChzcMOkdGVyZW0pIEVpbmtvbW1lbj8gCgpCZWkgZGllc2VyIEZyYWdlIHN0ZWhlbiB3aXIgdm9yIGVpbmVtIFByb2JsZW0sIGRhIGRpZSBCaWxkdW5nIHZvbiBtZWhyZXJlbiBGYWt0b3JlbiBhYmjDpG5ndCwgZGllIGF1Y2ggZGFzIEVpbmtvbW1lbiBiZWVpbmZsdXNzZW4uIEVpbmlnZSBkaWVzZXIgRmFrdG9yZW4gaGF0dGVuIFNpZSBiZXJlaXRzIGluIGRlciBWZXJhbnN0YWx0dW5nIGtlbm5lbiBnZWxlcm50ICh1bmQgYXVjaCBzZWxic3QgZ2VuYW5udCk6IEZhbWlsaWVuZWlua29tbWVuLCBCaWxkdW5nIGRlciBFbHRlcm4sIGVpZ2VuZSBGw6RoaWdrZWl0ZW4sIE5ldHp3ZXJrIC4uLgoKVW0gdW5zIGRpZSBXaXJrdW5nc3dlaXNlIGRlciBJbnN0cnVtZW50YWx2YXJpYWJsZW5yZWdyZXNzaW9uIG7DpGhlciBhbnp1c2NoYXVlbiB3b2xsZW4gd2lyIGVpbmUgdmVyZWluZmFjaHRlIFNpbXVsYXRpb25zc3R1ZGllIGR1cmNoZsO8aHJlbi4gSW4gZGllc2VyIFNpbXVsYXRpb24ga29uemVudHJpZXJlbiB3aXIgdW5zIGF1ZiBkZW4gWnVzYW1tZW5oYW5nIHp3aXNjaGVuIGRlciBCaWxkdW5nIHVuZCBkZW0gRWlua29tbWVuLCBzb3dpZSBlaW5lciAodW5iZW9iYWNodGJhcmVuKSBIaW50ZXJncnVuZHZhcmlhYmxlbiwgbmVubmVuIHdpciBzaWUgIkbDpGhpZ2tlaXRlbiIsIHdlbGNoZSB3aXIgaW4gdW5zZXJlbSBzaW11bGllcnRlbiBEYXRlbnNhdHogYmVvYmFjaHRlbiBrw7ZubmVuLiBEdXJjaCB1bnNlcmUgU2ltdWxhdGlvbiBrw7ZubmVuIHdpciBlcmdyw7xuZGVuIG9iIHdpciBkZW4gKHNpbXVsaWVydGVuKSBrYXVzYWxlbiBFZmZla3QgZGVyIEJpbGR1bmcgYXVmIGRhcyBFaW5rb21tZW4gbWl0IHVudGVyc2NoaWVkbGljaGVuIFJlZ3Jlc3Npb25zc3BlemlmaWthdGlvbmVuIGVyaGFsdGVuIGvDtm5uZW4uCgpXaXIgc2VoZW4gZGVuIFp1c2FtbWVuaGFuZyB6d2lzY2hlbiBkZXIgQmlsZHVuZyB1bmQgZGVuICh1bmJlb2JhY2h0YmFyZW4pIEbDpGhpZ2tlaXRlbiwgc293aWUgendpc2NoZW4gRWlua29tbWVuIHVuZCAodW5iZW9iYWNodGJhcmVuKSBGw6RoaWdrZWl0ZW4gaW4gZm9sZ2VuZGVtIERBRzoKCiQkXGNvbG9yeyMwMDc0RDl9e1x0ZXh0e0VpbmtvbW1lbn1faX0gPSBcYmV0YV8wICsgXGJldGFfMSBcY29sb3J7ZGFya29yYW5nZX17XHRleHR7QmlsZHVuZ31faX0gKyBcYmV0YV8yIFxjb2xvcntyZWR9e1x0ZXh0e0bDpGhpZ2tlaXRlbn1faX0gKyBcdmFyZXBzaWxvbl9pJCQKCmBgYHtyIGRhZ19lbmRvZ2VuX2l2MiwgZWNobz1GQUxTRSwgZmlnLndpZHRoPTcsIGZpZy5oZWlnaHQ9Mywgb3V0LndpZHRoPSIxMDAlIn0KZGFnaWZ5KAogIEVpbmsgfiBCICsgSCwKICBCIH4gSCwKICBjb29yZHMgPSBsaXN0KHggPSBjKEIgPSAxLCBFaW5rID0gMywgSCA9IDIpLAogICAgICAgICAgICAgICAgeSA9IGMoQiA9IDEsIEVpbmsgPSAxLCBIID0gMikpLAogIGV4cG9zdXJlID0gIkIiLAogIG91dGNvbWUgPSAiRWluayIsCiAgbGF0ZW50ID0gIkgiLAogIGxhYmVscyA9IGMoIkIiID0gIkJpbGR1bmciLCAiRWluayIgPSAiRWlua29tbWVuIiwKICAgICAgICAgICAgICJIIiA9ICJGw6RoaWdrZWl0ZW4iKQopICU+JSAKICB0aWR5X2RhZ2l0dHkoKSAlPiUgCiAgbm9kZV9zdGF0dXMoKSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0geCwgeSA9IHksIHhlbmQgPSB4ZW5kLCB5ZW5kID0geWVuZCkpICsKICBnZW9tX2RhZ19lZGdlcyhhZXMoZWRnZV9saW5ldHlwZSA9IGlmZWxzZSggeCA9PSB4WzJdICYgeSA9PSB5WzJdLCAiZGFzaGVkIiwgInNvbGlkIikpLCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArCiAgZ2VvbV9kYWdfcG9pbnQoYWVzKGNvbG9yID0gc3RhdHVzKSwgc2l6ZSA9IDE1KSArCiAgZ2VvbV9kYWdfdGV4dChjb2xvciA9ICJ3aGl0ZSIsIHNpemUgPSA1KSArCiAgZ2VvbV9kYWdfbGFiZWxfcmVwZWwoYWVzKGxhYmVsID0gbGFiZWwpLCBudWRnZV95ID0gYygwLjI1LCAtMC4yNSwgMC4yNSkpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiZGFya29yYW5nZSIsICJyZWQiLCAiIzAwNzREOSIpKSArCiAgZ3VpZGVzKGNvbG9yID0gRkFMU0UpICsKICB0aGVtZV9kYWcoKQpgYGAKCkRpZSAodW5iZW9iYWNodGJhcmVuKSBGw6RoaWdrZWl0ZW4gc2luZCBlaW5lIF9Db25mb3VuZGVyXywgYXVmIHdlbGNoZW4gd2lyIGtvbnRyb2xsaWVyZW4gbcO8c3N0ZW4uIEtvbnRyb2xsaWVyZW4gd2lyIG5pY2h0IGF1ZiBkaWUgKHVuYmVvYmFjaHRiYXJlbikgRsOkaGlna2VpdGVuLCBzbyB3w7xyZGVuIHdpciBkaWUgX2JhY2tkb29yXyBpbSBEQUcgbmljaHQgc2NobGllw59lbiB1bmQgZGVyIEVpbmZsdXNzIGRlciAqKkbDpGhpZ2tlaXRlbiB3YW5kZXJ0IGluIGRlbiBGZWhsZXJ0ZXJtKio6CgpEZXIgRmVobGVydGVybSBiZXN0ZWh0IGRhbm4gYXVzOgoKJFxjb2xvcntyZWR9e1xldGFfaX0gPSBcYmV0YV8yIFxjb2xvcntyZWR9e1x0ZXh0e0bDpGhpZ2tlaXRlbn1faX0gKyBcdmFyZXBzaWxvbl9pJCAKCnVuZCBkYW1pdCBpc3QgZGllIEJpbGR1bmcgbWl0IGRlbSBGZWhsZXJ0ZXJtICRcY29sb3J7cmVkfXtcZXRhX2l9JCBrb3JyZWxpZXJ0OgoKJCRcY29sb3J7IzAwNzREOX17XHRleHR7RWlua29tbWVufV9pfSA9IFxiZXRhXzAgKyBcYmV0YV8xIFxjb2xvcntkYXJrb3JhbmdlfXtcdGV4dHtCaWxkdW5nfV9pfSArIFxjb2xvcntyZWR9e1xldGFfaX0kJApGb2xnbGljaCB3w6RyZSBkaWUgQmlsZHVuZ3NlbnRzY2hlaWR1bmcgaW4gdW5zZXJlciBTY2jDpHR6dW5nIGVuZG9nZW4gdW5kIHdpciB3w7xyZGVuIGR1cmNoIGVpbmUgIm5haXZlIiBTY2jDpHR6dW5nIGRlcyBFaW5rb21tZW5zIGF1ZiBkaWUgQmlsZHVuZyAob2huZSBhdWYgZGllIEbDpGhpZ2tlaXRlbiB6dSBrb250cm9sbGllcmVuKSBlaW5lbiB2ZXJ6ZXJydGVuIEVmZmVrdCBkZXIgQmlsZHVuZyBhdWYgZGFzIEVpbmtvbW1lbiBlcmhhbHRlbi4gRGEgZGllIEbDpGhpZ2tlaXRlbiBlaW5lciBQZXJzb24gc293b2hsIHNlaW5lIEJpbGR1bmdzZW50c2NoZWlkdW5nIGFscyBhdWNoIHNlaW4gc3DDpHRlcmVzIEVpbmtvbW1lbiBwb3NpdGl2IGJlZWluZmx1c3Nlbiwgd8OkcmUgZGVyIEtvZWZmaXppZW50ICRcYmV0YV8xJCBpbiBkZXIgbmFpdmVuIFNjaMOkdHp1bmcgc3lzdGVtYXRpc2NoIG5hY2ggb2JlbiB2ZXJ6ZXJydC4gRC5oLiBkZXIgS29lZmZpemllbnQgJFxiZXRhXzEkLCB3ZWxjaGVuIHdpciBpbiBkZXIgbmFpdmVuIFNjaMOkdHp1bmcgaGVyYXVzIGJla29tbWVuIHfDvHJkZW4sIHfDpHJlIGdyw7bDn2VyIGFscyBkZXIgd2FocmUgV2VydC4KCiMgRGF0ZW4gc2ltdWxpZXJlbgoKVW0gZGFzIFByaW56aXAgZGVyIEluc3RydW1lbnRhbHZhcmlhYmxlbnNjaMOkdHp1bmcgenUgdmVyYW5zY2hhdWxpY2hlbiB3b2xsZW4gd2lyIGVpbmUga2xlaW5lIFNpbXVsYXRpb25zc3R1ZGllIGJldHJhY2h0ZW4sIGJlaSBkZXIgd2lyIGRlbiAid2FocmVuIiBXZXJ0IGRlciBWYXJpYWJsZSBrZW5uZW4gdW5kIHdpc3Nlbiwgb2IgZWluIFNjaMOkdHplciBpbiBkZXIgUmVncmVzc2lvbiB2ZXJ6ZXJydCBpc3QsIG9kZXIgZGVuIGtvcnJla3RlbiBXZXJ0IHdpZWRlcmdpYnQuCgpEdXJjaCBTaW11bGF0aW9uc3N0dWRpZW4ga8O2bm5lbiB3aXIgUHJvYmxlbWUgb2RlciBVbmtsYXJoZWl0ZW4gdW50ZXJzdWNoZW4gdW5kIGJla29tbWVuIGRhZHVyY2ggZWluZSBJbnR1aXRpb24gdm9tIERhdGVuZ2VuZXJpZXJ1bmdzcHJvemVzcyBpbiBlY2h0ZW4gZW1waXJpc2NoZW4gRGF0ZW5zw6R0emVuLgoKYGBge3J9CnNldC5zZWVkKDIwMjEpCm5yb3dzIDwtIDUwMDAwCmRpc3RhbmNlIDwtIHRpYmJsZSgKICBmYWVoaWdrZWl0ZW4gPSBybm9ybShucm93cywgMCwgMSksICAjIEbDpGhpZ2tlaXQKICBuYWVoZSA9IHJ1bmlmKG5yb3dzLCAwLCAxKSwgICMgRW50ZmVybnVuZyB6dXIgVW5pIChJbnN0cnVtZW50YWx2YXJpYWJsZSkKICBlcnJvcl9laW5rID0gcm5vcm0obnJvd3MsIDAsIDEwMCkgICMgRmVobGVydGVybQopICU+JSAKICBtdXRhdGUoYmlsZHVuZyA9IDEzICsgMC40Km5hZWhlICsgMipmYWVoaWdrZWl0ZW4sICAjIEJpbGR1bmcgKEVya2zDpHJlbmRlIFZhcmlhYmxlKQogICAgICAgICBlaW5rID0gMTAwICsgNDAqYmlsZHVuZyArIDcwKmZhZWhpZ2tlaXRlbiAtIGVycm9yX2VpbmspICMgRWlua29tbWVuIChFcmdlYm5pc3ZhcmlhYmxlKQpgYGAKCldpciBzaW11bGllcmVuIHVucyBlaW5lbiBEYXRlbnNhdHogYXVzIDUwMDAwIFBlcnNvbmVuLCBkaWUgd2lyIHVudGVyc3VjaGVuIG3DtmNodGVuIChkaWVzIGRlZmluaWVyZW4gd2lyIGluIGRlciB6d2VpdGVuIFplaWxlKS4KRGFuYWNoIGdlbmVyaWVyZW4gd2lyIHVucyBlaW5lbiBEYXRlbnNhdHogZGVyIGZvbGdlbmRlIFZhcmlhYmxlbiBlbnRow6RsdDoKCi0gYGZhZWhpZ2tlaXRlbmAgPSBGw6RoaWdrZWl0ZW4uIAogICAgLSBEaWVzZSBWYXJpYWJsZSBpc3Qgc3RhbmRhcmRub3JtYWx2ZXJ0ZWlsdCB6d2lzY2hlbiAwIHVuZCAxLiAKICAgIC0gQW5uYWhtZTogRGllIEbDpGhpZ2tlaXRlbiBzaW5kIGluIGRlciBCZXbDtmxrZXJ1bmcgbm9ybWFsdmVydGVpbHQKLSBgbmFlaGVgID0gRW50ZmVybnVuZyB6dXIgVW5pLiAKICAgIC0gRGllc2UgVmFyaWFibGUgaXN0IGdsZWljaHZlcnRlaWx0LiAKICAgIC0gS2FubiBhbHMgIkR1bW15LVZhcmlhYmxlIiBpbnRlcnByZXRpZXJ0IHdlcmRlbiB1bmQgaXN0IDEgZsO8ciBQZXJzb25lbiwgd2VsY2hlIE5haGUgYW4gZWluZXIgVW5pIHdvaG5lbiB1bmQgMCBmw7xyIGRpZWplbmlnZW4gZGllIHdlaXRlciB3ZWcgd29obmVuCi0gYGVycm9yX2VpbmtgID0gRmVobGVydGVybSBkZXIgRXJnZWJuaXN2YXJpYWJsZW4KICAgIC0gU2NobGllw59saWNoIGlzdCB1bnNlcmUgU2Now6R0enVuZyBpbW1lciBldHdhcyB1bmdlbmF1IGltIHJlYWxlbiBMZWJlbgotIGBiaWxkdW5nYCA9IEJpbGR1bmcuIAogICAgLSBJbSBEdXJjaHNjaG5pdHQgaGFiZW4gYWxsZSBQZXJzb25lbiBiZWkgdW5zIGVpbmUgQmlsZHVuZyB2b24gMTMgSmFocmVuCiAgICAtIFdlaXRlcmhpbiBpc3QgZGllIEJpbGR1bmcgYWJow6RuZ2lnIHZvbiBkZXIgRGlzdGFueiB6dXIgVW5pIHVuZCBkZW4gZWlnZW5lbiBGw6RoaWdrZWl0ZW4KLSBgZWlua2AgPSB3w7ZjaGVudGxpY2hlcyBFaW5rb21tZW4KICAgIC0gRGFzIEJhc2lzZWlua29tbWVuIGlzdCAxMDDigqwgdW5kIGVzIGdpYnQgZWluZSBLb21wb25lbnRlIGbDvHIgZGllIEJpbGR1bmcgdW5kIGRpZSBGw6RoaWdrZWl0ZW4gKCsgZGVuIG9iZW4gYW5nZXNwcm9jaGVuZW4gRmVobGVydGVybSkKICAgIC0gSmUgbWVociBCaWxkdW5nIGVpbmUgUGVyc29uIGhhdCwgZGVzdG8gbWVociBFaW5rb21tZW4gaGF0IFNpZSAoIGbDvHIgamVkZXMgSmFociBtZWhyIEJpbGR1bmcgZ2lidCBlcyA0MOKCrCBtZWhyIFdvY2hlbmVpbmtvbW1lbiApCiAgICAtIEplIGdyw7bDn2VyIGRpZSBGw6RoaWdrZWl0ZW4gZWluZXIgUGVyc29uIHNpbmQsIGRlc3RvIG1laHIgRWlua29tbWVuIGJla29tbXQgZGllc2UgKCBmw7xyIGplZGUgRWluaGVpdCBhbiBGw6RoaWdrZWl0ZW4gbWVociBnaWJ0IGVzIDcw4oKsIG1laHIgV29jaGVuZWlua29tbWVuICkKCkRlciBWb3J0ZWlsIGRpZXNlciBTaW11bHRpb25zc3R1ZGllIGdlZ2Vuw7xiZXIgZW1waXJpc2NoZW4gRGF0ZW5zw6R0emVuOiBXaXIga2VubmVuIGRlbiBFZmZla3QgZGVyIEJpbGR1bmcgYXVmIGRhcyBFaW5rb21tZW4hIEluIHVuc2VyZXIgU2ltdWxhdGlvbnNzdHVkaWUgbGllZ3QgZXIgYmVpIDQw4oKsIQoKRGllc2UgS2VubnRuaXMga8O2bm5lbiB3aXIgbnV0emVuIHVtIGRpZSBWZXJ6ZXJydW5nIGRlcyBLb2VmZml6aWVudGVuICRcYmV0YV8xJCBuw6RoZXIgenUgYmV0cmFjaHRlbi4gV2llIHZlcsOkbmRlcnQgc2ljaCBkZXIgS29lZmZpemllbnQgJFxiZXRhXzEkIG9obmUgdW5kIG1pdCBkZXIgS29udHJvbGxlIGF1ZiBkaWUgSGludGVyZ3J1bmR2YXJpYWJsZSAiRsOkaGlna2VpdGVuIjoKCmBgYHtyLCByZXN1bHRzID0gJ2FzaXMnfQpvbHNfYmlhcyA8LSBsbShlaW5rIH4gYmlsZHVuZywgZGF0YSA9IGRpc3RhbmNlKQpvbHNfY29ycmVjdCA8LSBsbShlaW5rIH4gYmlsZHVuZyArIGZhZWhpZ2tlaXRlbiwgZGF0YSA9IGRpc3RhbmNlKQoKY20gPC0gYygiYmlsZHVuZyIgPSAiQmlsZHVuZyIsCiAgICAgICAgImZhZWhpZ2tlaXRlbiIgPSAiRsOkaGlna2VpdGVuIiwKICAgICAgICAiKEludGVyY2VwdCkiID0gIktvbnN0YW50ZSIpCgptb2RlbHN1bW1hcnkobGlzdChvbHNfYmlhcywgb2xzX2NvcnJlY3QpLCAKICAgICAgICAgIHR5cGUgPSAiaHRtbCIsCiAgICAgICAgICBmbXQgPSAzLAogICAgICAgICAgc3RhdGlzdGljID0gJ2NvbmYuaW50JywgCiAgICAgICAgICBjb25mX2xldmVsID0gLjk5LAogICAgICAgICAgY29lZl9tYXAgPSBjbSwKICAgICAgICAgIGdvZl9vbWl0ID0gJ0RGfERldmlhbmNlfFJNU0V8QUlDfEJJQ3xMb2cuTGlrfEYnLAogICAgICAgICAgdGl0bGUgPSAiV29jaGVuZWlua29tbWVuIikgJT4lCiAgICAgICAgICBhZGRfaGVhZGVyX2Fib3ZlKGMoIiAiID0gMSwiT0xTIEJpYXMiID0gMSwgIk9MUyBLb250cm9sbGUiID0gMSkpCgpgYGAKCgpXaWUgdm9uIHVucyBlcndhcnRldCDDvGJlcnNjaMOkdHplbiB3aXIgZGVuIEVmZmVrdCBkZXIgQmlsZHVuZyBhdWYgZGFzIEVpbmtvbW1lbiBtYXNzaXYsIHdlbm4gd2lyIG5pY2h0IGF1ZiBkaWUgRsOkaGlna2VpdGVuIGtvbnRyb2xsaWVyZW4uIEluIGRlciBuYWl2ZW4gU2Now6R0enVuZyBpbiBkZXIgZXJzdGVuIFNwYWx0ZSB3w7xyZGVuIHdpciBkYXZvbiBhdXNnZWhlbiwgZGFzcyBlaW4gSmFociBtZWhyIEJpbGR1bmcgbWl0IDc0Ljcy4oKsIG1laHIgRWlua29tbWVuIHBybyBXb2NoZSBhc3NvemlpZXJ0IGlzdC4gV29iZWkgZGVyIHdhaHJlIEVmZmVrdCBiZWkgNDDigqwgcHJvIFdvY2hlIGxpZWd0LiBEaWUga29ycmVrdGUgRWZmZWt0Z3LDtsOfZSBlcmhhbHRlbiB3aXIgaW4gdW5zZXJlciB6d2VpdGVuIFNjaMOkdHp1bmcsIHdlbm4gd2lyIGF1ZiBkaWUgRsOkaGlna2VpdGVuIGtvbnRyb2xsaWVyZW4hCkhpZXJiZWkgbGllZ3QgZGVyIHdhaHJlIFdlcnQgKHdpZSB3aXIgZGllc2VuIHNpbXVsaWVydCBoYWJlbikgaW0gOTklIEtvbmZpZGVuemludGVydmFsbCBkZXMgU2Now6R0emVycyB2b24gYGJpbGR1bmdgIChLb25maWRlbnppbnRlcnZhbGwgWzI5LjY0OSwgNDkuNjQzXSkuIApNYW4gYmVhY2h0ZSBkYXMgc293b2hsIGRlciBLb2VmZml6aWVudCAkXGJldGFfMSQgdm9uIGBiaWxkdW5nYCBkZXIgbmFpdmVuIFNjaMOkdHp1bmcgYXVzIGRlciBlcnN0ZW4gU3BhbHRlLCB3aWUgYXVjaCBkZXIgendlaXRlbiBTcGFsdGUgaG9jaCBzaWduaWZpa2FudCBzaW5kLiBEYXMgOTklIEtvbmZpZGVuemludGVydmFsbCBpbiBkZXIgZXJzdGVuIFJlZ3Jlc3Npb24gaXN0IGRldXRsaWNoIGtsZWluZXIgYWxzIGluIGRlciB6d2VpdGVuIFJlZ3Jlc3Npb24gKFs3NC4xNDcsNzUuMjkyXSB2cy4gWzI5LjY0OSw0OS42NDNdKSwgb2J3b2hsIG51ciBkaWUgendlaXRlIFJlZ3Jlc3Npb24gZWluIGtvcnJla3RlcyBFcmdlYm5pcyBsaWVmZXJ0LiBEZXIgS29lZmZpemllbnQgZGVyIGVyc3RlbiBTY2jDpHR6dW5nIGlzdCBzdGFyayBuYWNoIG9iZW4gdmVyemVycnQsIGQuaC4gYXVjaCB3ZW5uIGVpbiBLb2VmZml6aWVudCBzdGF0aXN0aXNjaCBzaWduaWZpa2FudCBpc3QsIHNvIGhlacOfdCBkaWVzIG5pY2h0IGF1dG9tYXRpc2NoLCBkYXNzIGRpZXNlciBhdWNoIGtvcnJla3QgaXN0LiBEYWbDvHIgbXVzcyBlcnN0IGRhcyBNb2RlbGwgcmljaHRpZyBzcGV6aWZpemllcnQgc2VpbiEKCiMgSW5zdHJ1bWVudGFsdmFyaWFibGVuCgpEYSB3aXIgaW4gZWluZW0gcmVhbGVuIERhdGVuc2F0eiBkaWUgRsOkaGlna2VpdGVuIG5pY2h0IGJlb2JhY2h0ZW4ga8O2bm5lbiBibGVpYnQgdW5zIGRpZXNlciBkaXJla3RlIFdlZyBtaXQgZGVyIEtvbnRyb2xsZSBhdWYgZGllIEbDpGhpZ2tlaXRlbiBsZWlkZXIgdmVyc2NobG9zc2VuLiBBbGxlcmRpbmdzIHNvbGx0ZW4gd2lyIG5pY2h0IHZlcnphZ2VuLiBIaWVyIGhpbGZ0IHVucyBkaWUgc28gZ2VuYW5udGUgSW5zdHJ1bWVudGFsdmFyaWFibGVuc2Now6R0enVuZyB3ZWl0ZXIuIEJlaSBkZXIgSW5zdHJ1bWVudGFsdmFyaWFibGVuc2Now6R0enVuZyBudXR6ZW4gd2lyIGRpZSBWYXJpYXRpb24gZWluZXIgZXhvZ2VuZW4gVmFyaWFibGVuLCB3ZWxjaGUgdW5zZXJlIGVuZG9nZW5lIFZhcmlhYmxlIGJlZWluZmx1c3N0LiBLb25rcmV0IG51dHplbiB3aXIgaW4gdW5zZXJlbSBGYWxsIGRlbiBUZWlsIGRlciBfQmlsZHVuZ18sIHdlbGNoZXIgZHVyY2ggZGllIGV4b2dlbmUgVmFyaWFibGUgX07DpGhlXyBlcmtsw6RydCB3ZXJkZW4ga2FubiwgdW0gbWl0dGVscyBkaWVzZXMgZXhvZ2VuZW4gVGVpbHMgZGVyIEJpbGR1bmcgZGVzc2VuIF9rYXVzYWxlbl8gRWZmZWt0IGF1ZiBkYXMgRWlua29tbWVuIHp1IGJlc3RpbW1lbi4gRG9jaCB3YXMgZ2VuYXUgYmVkZXV0ZXQgZGllcz8gCgpXaXIgd29sbGVuIHVucyBkYXMgUHJpbnppcCBkZXIgSW5zdHJ1bWVudGFsdmFyaWFibGVuc2Now6R0enVuZyBhbmhhbmQgZWluZXMgREFHIGFuc2NoYXVlbjoKCmBgYHtyIGRhZ19pdl9leHBsYWluLCBlY2hvPUZBTFNFLCBmaWcud2lkdGg9NywgZmlnLmhlaWdodD0zLCBvdXQud2lkdGg9IjEwMCUifQpkYWdpZnkoCiAgWSB+IFggKyBILAogIFggfiBILAogIFggfiBaLAogIGNvb3JkcyA9IGxpc3QoeCA9IGMoWCA9IDEsIFkgPSAzLCBIID0gMiwgWiA9IDApLAogICAgICAgICAgICAgICAgeSA9IGMoWCA9IDEsIFkgPSAxLCBIID0gMiwgWiA9IDEpKSwKICBleHBvc3VyZSA9ICJYIiwKICBvdXRjb21lID0gIlkiLAogIGxhdGVudCA9ICJIIiwKICBsYWJlbHMgPSBjKCJYIiA9ICJJbnRlcnZlbnRpb24iLCAiWSIgPSAiRXJnZWJuaXMiLAogICAgICAgICAgICAgIkgiID0gIihVbmJlb2JhY2h0YmFyZSkgQ29uZm91bmRlciIsICJaIiA9ICJJbnN0cnVtZW50IikKKSAlPiUgCiAgdGlkeV9kYWdpdHR5KCkgJT4lIAogIG5vZGVfc3RhdHVzKCkgJT4lIAogIGdncGxvdChhZXMoeCA9IHgsIHkgPSB5LCB4ZW5kID0geGVuZCwgeWVuZCA9IHllbmQpKSArCiAgZ2VvbV9kYWdfZWRnZXMoYWVzKGVkZ2VfbGluZXR5cGUgPSBpZmVsc2UoIHggPT0geFsyXSAmIHkgPT0geVsyXSwgImRhc2hlZCIsICJzb2xpZCIpKSwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKwogIGdlb21fZGFnX3BvaW50KGFlcyhjb2xvciA9IHN0YXR1cyksIHNpemUgPSAxNSkgKwogIGdlb21fZGFnX3RleHQoY29sb3IgPSAid2hpdGUiLCBzaXplID0gNSkgKwogIGdlb21fZGFnX2xhYmVsX3JlcGVsKGFlcyhsYWJlbCA9IGxhYmVsKSwgbnVkZ2VfeSA9IGMoLTAuMjUsIDAuMjUsIDAuMjUsIDAuMjUpKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoImRhcmtvcmFuZ2UiLCAiZGFya3JlZCIsICIjMDA3NEQ5IiksIG5hLnZhbHVlID0gImJsYWNrIikgKwogIGd1aWRlcyhjb2xvciA9IEZBTFNFKSArCiAgdGhlbWVfZGFnKCkKYGBgCgoqKkhpbnRlcmdydW5kOioqIGBYYCBzb2xsdGUgZXhvZ2VuIHNlaW4gdW0gX2thdXNhbF8gaW50ZXJwcmV0aWVydCB3ZXJkZW4genUga8O2bm5lbgoKKipaaWVsIGRlciBJbnN0cnVtZW50YWx2YXJpYWJsZToqKiBFeG9nZW5lIFZhcmlhdGlvbiB2b24gYFhgIGZpbmRlbiwgd2VsY2hlIGRhbm4gX2thdXNhbF8gaW50ZXJwcmV0aWVydCB3ZXJkZW4ga2FubgoKV2lyIGvDtm5uZW4gdW5zIGRpZXMgdm9yc3RlbGxlbiBhbHMgR2VnZW50ZWlsIGRhdm9uIGF1ZiBlaW5lIFZhcmlhYmxlIHp1IGtvbnRyb2xsaWVyZW46CgotIFdpciBlcmtsw6RyZW4gYFhgIHVuZCBgWWAgbWl0IGRlciBWYXJpYWJsZW4gYFpgLCBhYmVyIGFuc3RhdHQgdW5zIGF1ZiBkZW4gVGVpbCB6dSBrb256ZW50cmllcmVuLCB3ZWxjaGVyIG5pY2h0IGR1cmNoIGBaYCBlcmtsw6RydCB3ZXJkZW4ga2FubiwgbmVobWVuIHdpciAqKm51ciBkZW4gQW50ZWlsIGRlciBkdXJjaCBgWmAgZXJrbMOkcnQgd2lyZCoqIQotIEFuc3RhdHQgenUgc2FnZW4gImR1IGJpc3QgYXVmIGVpbmVyIF9iYWNrZG9vcl8sIGljaCBzY2hsaWXDn2UgZGljaCIgc2FnZW4gd2lyICJkdSBoYXN0IGtlaW5lIF9iYWNrZG9vcl8hIEljaCB3aWxsLCBkYXNzIG1laW4gYFhgIGdlbmF1IHNvIHNlaW4gc29sbCB3aWUgZHUhIEljaCBuZWhtZSBudXIgZGVuIFBhcnQgdm9uIGBYYCwgd2VsY2hlciB2b24gZGlyIGVya2zDpHJ0IHdpcmQhIgotIERhZHVyY2ggbnV0emVuIHdpciBudXIgbm9jaCBkaWUgZXhvZ2VuZSBWYXJpYXRpb24gaW4gYFhgLCB3ZWxjaGUgZHVyY2ggYFpgIGVya2zDpHJ0IHdpcmQKCioqRm9sZ2U6KioKV2lyIG51dHplbiBuaWNodCBtZWhyIGRpZSBrb21wbGV0dGUgSW5mb3JtYXRpb24gdW5zZXJlcyBEYXRlbnNhdHplcywgc29uZGVybiBudXIgbm9jaCBlaW5lbiBUZWlsLCBkLmguIHdpciBiZW7DtnRpZ2VuIG1laHIgQmVvYmFjaHR1bmdlbiB1bSBFZmZla3RlIG1lc3NlbiB6dSBrw7ZubmVuLiBEaWVzZSB1bmdlbmF1ZXJlIFNjaMOkdHp1bmcgZGVzIEVmZmVrdHMgZHLDvGNrdCBzaWNoIGluIGRlciBSZWdyZXNzaW9uIGFscyBncsO2w59lcmVyIFN0YW5kYXJkZmVobGVyIGRlcyBTY2jDpHR6ZXJzIGF1cyEKCiMjIFdhcyBzaW5kIGd1dGUgSW5zdHJ1bWVudGFsdmFyaWFibGVuPwoKVW0gYWJzY2jDpHR6ZW4genUga8O2bm5lbiwgb2Igd2lyIGVpbmUgVmFyaWFibGUgYWxzIEluc3RydW1lbnRhbHZhcmlhYmxlIG51dHplbiBrw7ZubmVuIG3DvHNzZW4gd2lyIGRyZWkgRWlnZW5zY2hhZnRlbiBwcsO8ZmVuOgoKKipSZWxldmFueioqOgoKLSBEaWUgSW5zdHJ1bWVudGFsdmFyaWFibGUgbXVzcyBtaXQgZGVyL2RlbiBlbmRvZ2VuZW4gVmFyaWFibGUvbiBrb3JyZWxpZXJ0IHNlaW4uCgoqKkF1c3NjaGxpZcOfbGljaGtlaXQqKjoKCi0gRGllIEluc3RydW1lbnRhbHZhcmlhYmxlIGJlZWluZmx1c3N0IGRpZSBleG9nZW5lIFZhcmlhYmxlIG5pY2h0IGRpcmVrdCwgc29uZGVybiAqKmF1c3NjaGxpZcOfbGljaCoqIMO8YmVyIGRpZSBlbmRvZ2VuZSBWYXJpYWJsZQoKKipFeG9nZW5pdMOkdCoqOgoKLSBEaWUgSW5zdHJ1bWVudGFsdmFyaWFibGUgaXN0IG5pY2h0IG1pdCBkZW4gYXVzZ2VsYXNzZW5lbiBWYXJpYWJsZW4gKG9taXR0ZWQgdmFyaWFibGVzKSBrb3JyZWxpZXJ0CgoKIyMgUmVsZXZhbnoKCldpciBrw7ZubmVuIGRpZSBSZWxldmFueiB1bnNlcmVyIEluc3RydW1lbnRhbHZhcmlhYmxlbiB0ZXN0ZW4uIERpZXMgbWFjaGVuIHdpciBmw7xyIHVuc2VyZW4gc2ltdWxpZXJ0ZW4gRGF0ZW5zYXR6LCBpbmRlbSB3aXIgZGllIFZhcmlhYmxlIEJpbGR1bmcgKCBgYmlsZHVuZ2AgKSBhdWYgZGllIEluc3RydW1lbnRhbHZhcmlhYmxlICggYG5hZWhlYCApIHJlZ3Jlc3NpZXJlbi4gRGllIEluc3RydW1lbnRhbHZhcmlhYmxlIHNvbGx0ZSBlaW5lbiBFaW5mbHVzcyBhdWYgZGllIEJpbGR1bmcgaGFiZW4gdW5kIFBlcnNvbmVuIGRpZSBuw6RoZXIgYW4gZGVyIFVuaXZlcnNpdMOkdCB3b2huZW4gc29sbHRlbiBtZWhyIEJpbGR1bmcgaW4gQW5zcHJ1Y2ggbmVobWVuLiBTb2xsdGUgZGllcyBuaWNodCBkZXIgRmFsbCBzZWluLCBzbyB3w6RyZSB1bnNlcmUgSW5zdHJ1bWVudGFsdmFyaWFibGUgbmljaHQgcmVsZXZhbnQgdW5kIHdpciBzb2xsdGVuIHVucyBlaW5lIGFuZGVyZSBJbnN0cnVtZW50YWx2YXJpYWJsZSBzdWNoZW4uCgpgYGB7cn0KZmlyc3Rfc3RhZ2VfYmFzaWMgPC0gbG0oYmlsZHVuZyB+IG5hZWhlLCBkYXRhID0gZGlzdGFuY2UpCgpzdW1tYXJ5KGZpcnN0X3N0YWdlX2Jhc2ljKQpgYGAKCkluIHVuc2VyZW0gRmFsbCBpc3QgZGllIEluc3RydW1lbnRhbHZhcmlhYmxlIGBuYWVoZWAgaG9jaCBzaWduaWZpa2FudC4gRGllIEYtU3RhdGlzdGlrLCB3ZWxjaGUgYW5naWJ0IG9iIGRpZSBnZXRlc3RldGVuIFZhcmlhYmxlbiB6dXNhbW1lbiBlaW5lbiBFZmZla3QgYXVmIGRpZSBfQmlsZHVuZ18gaGFiZW4gbGllZ3QgYmVpIDE1My44LiBBbHMgRmF1c3RyZWdlbCBrw7ZubmVuIHdpciB1bnMgaGllciBtZXJrZW4sIGRhc3MgZGllc2UgRi1TdGF0aXN0aWsgZ3LDtsOfZXIgYWxzIDEwIHNlaW4gc29sbHRlIChhbGxlcmRpbmdzIGlzdCBkaWVzIG51ciBlaW5lIEZhdXN0cmVnZWwgdW5kIHNvbGx0ZSBuaWNodCBkYXMgTWHDnyBhbGxlciBEaW5nZSBzZWluKS4gRmFsbHMgZGllIEYtU3RhdGlzdGlrIGtsZWluZXIgaXN0IGFscyAxMCwgc28gd2lyZCBpbiBkZXIgTGl0ZXJhdHVyIG9mdCB2b24gZWluZW0gX3NjaHdhY2hlbiBJbnN0cnVtZW50XyBnZXNwcm9jaGVuLiBTb2xjaGUgX3NjaHdhY2hlbiBJbnN0cnVtZW50YWx2YXJpYWJsZW5fIGbDvGhyZW4genUgZWluZXIgVmVyemVycnVuZyB1bnNlcmVzIFNjaMOkdHplcnMgaW4gZGVyIEluc3RydW1lbnRhbHZhcmlhYmxlbnJlZ3Jlc3Npb24uIER1cmNoIGRpZSBWZXJ3ZW5kdW5nIHZvbiBfc2Nod2FjaGVuIEluc3RydW1lbnRlbl8gZXJoYWx0ZW4gd2lyIHdpZWRlciBlaW5lbiBCaWFzIGluIHVuc2VyZXIgUmVncmVzc2lvbiwgd2VsY2hlciBpbiBSaWNodHVuZyBkZXMgT0xTIEJpYXMgZ2VodC4gSmUgc3TDpHJrZXIgdW5zZXIgSW5zdHJ1bWVudCBpc3QsIGRlc3RvIHdlbmlnZXIgZ3Jvw58gaXN0IGRlciBCaWFzIGluIGRlciBJbnN0cnVtZW50YWx2YXJpYWJsZW5yZWdyZXNzaW9uLiBXZWl0ZXJoaW4gc2luZCBJbnN0cnVtZW50YWx2YXJpYWJsZW5yZWdyZXNzaW9uZW4gd2VuaWdlciBlZmZpemllbnQgYWxzIE9MUyBSZWdyZXNzaW9uZW4sIGRhIHdpciBlaW5lbiBrbGVpbmVyZW4gVGVpbCBkZXIgVmFyaWF0aW9uIGluIGRlbiBEYXRlbiBmw7xyIHVuc2VyZSBTY2jDpHR6dW5nIG51dHplbiAobnVyIGRlbiBQYXJ0LCB3ZWxjaGVyIGR1cmNoIGRhcyBJbnN0cnVtZW50IGVya2zDpHJ0IHdlcmRlbiBrYW5uKSwgZGllcyByZXN1bHRpZXJ0IGluIGVpbmVtIGdyw7bDn2VyZW4gU3RhbmRhcmRmZWhsZXIgZGVzIFNjaMOkdHplcnMsIHZlcmdsaWNoZW4gbWl0IGRlciBPTFMgUmVncmVzc2lvbi4gRC5oLiBkdXJjaCBzY2h3YWNoZSBJbnN0cnVtZW50YWx2YXJpYWJsZW4gZXJoYWx0ZW4gd2lyIGVpbmVuIEJpYXMgaW4gdW5zZXJlciBSZWdyZXNzaW9uLCB3ZWxjaGVyIGluIFJpY2h0dW5nIE9MUy1CaWFzIGdlaHQgKyBlcmhhbHRlbiBncsO2w59lcmUgS29uZmlkZW56aW50ZXJ2YWxsZSBkdXJjaCBkaWUgSW5zdHJ1bWVudGFsdmFyaWFibGVuc2Now6R0enVuZyAuLi4gd2VubiB3aXIgc28gd29sbGVuIG5laG1lbiB3aXIgZGllIG5lZ2F0aXZlbiBBc3Bla3RlIGJlaWRlciBXZWx0ZW4gZHVyY2ggc2Nod2FjaGUgSW5zdHJ1bWVudGUgbWl0LCB3ZXNoYWxiIHdpciBkaWVzZSBuYWNoIE3DtmdsaWNoa2VpdCB2ZXJtZWlkZW4gc29sbHRlbi4KCkluIGRlciBzcMOkdGVyZW4gQW5hbHlzZSBkZXIgSW5zdHJ1bWVudGFsdmFyaWFibGVucmVncmVzc2lvbiBoYWJlbiB3aXIgenVzw6R0emxpY2ggZGllIFZlcndlbmR1bmcgZWluZXMgc2Nod2FjaGVuIEluc3RydW1lbnRzIHNpbXVsaWVydCB1bSBkaWUgZ2VyYWRlIGJlc2NocmllYmVuZW4gRWZmZWt0ZSB6dSB6ZWlnZW4uCgojIyBBdXNzY2hsaWXDn2xpY2hrZWl0CgpMZWlkZXIga8O2bm5lIHdpciBkaWUgQXVzc2NobGllw59saWNoa2VpdCB2b24gYG5hZWhlYCBuaWNodCBwcsO8ZmVuLCBzb25kZXJuIG3DvHNzZW4gZGllc2Ugw7Zrb25vbWlzY2ggYmVncsO8bmRlbi4gV2lyIHNvbGx0ZW4gZXJsw6R1dGVybiwgX3dhcnVtXyBkaWUgRW50ZmVybnVuZyB6dXIgVW5pdmVyc2l0w6R0IGRhcyBFaW5rb21tZW4gX2F1c3NjaGxpZcOfbGljaF8gw7xiZXIgZGllIEJpbGR1bmcgdW5kIG5pY2h0IMO8YmVyIGVpbmVuIGFuZGVyZW4gV2VnIGJlZWluZmx1c3NlbiBrYW5uLiBTb2JhbGQgd2lyIGVpbmVuIFp1c2FtbWVuaGFuZyB6d2lzY2hlbiBkZXIgTsOkaGUgenVyIFVuaXZlcnNpdMOkdCB1bmQgZGVtIEVpbmtvbW1lbiBow6R0dGVuLCB3w6RyZSB1bnNlciBJbnN0cnVtZW50IGF1Y2ggZW5kb2dlbiB1bmQgd2lyIGvDtm5udGVuIGVzIG5pY2h0IHZlcndlbmRlbiAoYnp3LiBudXIgYmVkaW5ndCkuIEluIHVuc2VyZXIgU2ltdWxhdGlvbnNzdHVkaWUgaXN0IGRpZXMga2VpbiBQcm9ibGVtIGRhIHdpciBkaWUgVmFyaWFibGUgYG5hZWhlYCBzbyBzaW11bGllcnQgaGFiZW4sIGRhc3MgZGllc2UgZGFzIEVpbmtvbW1lbiBfYXVzc2NobGllw59saWNoXyDDvGJlciBkaWUgQmlsZHVuZyBiZWVpbmZsdXNzdC4KCiMjIEV4b2dlbml0w6R0CgpFeG9nZW5pdMOkdCBiZWRldXRldCwgZGFzcyBkaWUgSW5zdHJ1bWVudGFsdmFyaWFibGUgbmljaHQgbWl0IGRlciAodW5iZW9iYWNodGJhcmVuKSBhdXNnZWxhc3NlbmVuIFZhcmlhYmxlIGtvcnJlbGllcnQgaXN0LiBFcyBnaWJ0IGF1Y2ggZsO8ciBkaWUgRXhvZ2VuaXTDpHQga2VpbmVuIHN0YXRpc3Rpc2NoZW4gVGVzdCBkZXIgdW5zIHNhZ3QsIG9iIHVuc2VyZSBJbnN0cnVtZW50YWx2YXJpYWJsZShuKSBleG9nZW4gc2luZCwgZGEgd2lyIGtlaW5lIE3DtmdsaWNoa2VpdCBoYWJlbiBmw7xyIGFuZGVyZSBhdXNnZWxhc3NlbmVuIFZhcmlhYmxlbiB6dSBrb250cm9sbGllcmVuIChkaWVzIHdhciBqYSBnZXJhZGUgZGVyIEdydW5kLCB3YXJ1bSB3aXIgZGllIEluc3RydW1lbnRhbHZhcmlhYmxlIHZlcndlbmRlbiEpLiBXZW5uIHdpciBJbmZvcm1hdGlvbmVuIHp1IGRlbiBhdXNnZWxhc3NlbmVuIFZhcmlhYmxlbiBow6R0dGVuLCBkYW5uIGvDtm5udGVuIHdpciBhdWYgZGllc2Uga29udHJvbGxpZXJlbiB1bmQgYnLDpHVjaHRlbiBkaWUgSW5zdHJ1bWVudGFsdmFyaWFibGUgZ2FyIG5pY2h0IChzaWVoZSBEQUcgb2JlbikuIAoKRGVyIFZvcnRlaWwgaW4gdW5zZXJlciBTaW11bGF0aW9uc3N0dWRpZTogV2lyIGhhYmVuIGRpZSAoZWlnZW50bGljaCB1bmJlb2JhY2h0YmFyZSkgVmFyaWFibGUgIkbDpGhpZ2tlaXRlbiIgdW5kIGvDtm5uZW4gbnVuIHRhdHPDpGNobGljaCBzY2hhdWVuLCB3aWUgaG9jaCBkaWUgS29ycmVsYXRpb24gendpc2NoZW4gZGVyIEluc3RydW1lbnRhbHZhcmlhYmxlIGBuYWVoZWAgdW5kIGRlciBgZmFlaGlna2VpdGVuYCBpc3QuIEVpbmUgTcO2Z2xpY2hrZWl0IGRpZSB1bnMgaW4gZGVyIFJlYWxpdMOkdCBsZWlkZXIgdmVyd2VocnQgYmxlaWJ0OgoKYGBge3J9CnJvdW5kKGNvcihkaXN0YW5jZSRuYWVoZSwgZGlzdGFuY2UkZmFlaGlna2VpdGVuKSwyKQpgYGAKCkluIHVuc2VyZXIgU2ltdWxhdGlvbiBpc3QgZGllIEV4b2dlbml0w6R0c2FubmFobWUgZXJmw7xsbHQgKHNjaGxpZcOfbGljaCBoYWJlbiB3aXIgZGllIFZhcmlhYmxlbiBlbnRzcHJlY2hlbmQgc2ltdWxpZXJ0KS4gSW4gZGVyIFJlYWxpdMOkdCBrw7ZubnRlIGVzIFZlcmJpbmR1bmdlbiB6d2lzY2hlbiBkZXIgTsOkaGUgZGVzIFdvaG5vcnRzIHp1IGVpbmVyIFVuaSB1bmQgZGVuIEbDpGhpZ2tlaXRlbiBlaW5lciBQZXJzb24gZ2ViZW4uIEZhbGxlbiBpaG5lbiBoaWVyenUgQmVpc3BpZWxlIGVpbj8KCiMgVHdvLXN0YWdlIGxlYXN0IHNxdWFyZXMKCiMjIFR3by1zdGFnZSBsZWFzdCBzcXVhcmVzICgyU0xTKSBwZXIgSGFuZAoKT2ssIHdpciB3b2xsZW4gYWxzbyBtaXR0ZWxzIGRlciBJbnN0cnVtZW50YWx2YXJpYWJsZW4gYG5hZWhlYCB1bnNlcmUgZWlnZW50bGljaGUgVmFyaWFibGUgYGJpbGR1bmdgIGJlc2NocmVpYmVuIHVuZCBkYWR1cmNoIGRlbiBleG9nZW5lbiBUZWlsIHZvbiBgYmlsZHVuZ2AgaGVyYXVzZmluZGVuLiBNaXQgZGllc2VtIGV4b2dlbmVuIFRlaWwgdm9uIGBiaWxkdW5nYCwgd2VsY2hlciBudW4gbmljaHQgbWVociB2b24gYGZhZWhpZ2tlaXRlbmAgYWJow6RuZ3QsIGvDtm5uZW4gd2lyIGRhbm4gZGVuIF9rYXVzYWxlbl8gRWZmZWt0IGRlciBCaWxkdW5nIGF1ZiBkYXMgRWlua29tbWVuIGJlc3RpbW1lbi4gRC5oLiBkaWUgQmlsZHVuZywgZGllIG5pY2h0IGR1cmNoIGRpZSBGw6RoaWdrZWl0ZW4gYmVzdGltbXQgd2lyZC4KSMO2cnQgc2ljaCBuYWNoIGVpbmVtIGVpbmZhY2hlbiBQcm96ZXNzIG1pdCBtZWhyZXJlbiBTY2hyaXR0ZW4gYW4sIGRlbiB3aXIgaGllciBkdXJjaGbDvGhyZW4ga8O2bm5lbiEKCkdlbmF1IGRhcyB3b2xsZW4gd2lyIG51biB0dW46CgoxLiBXaXIgcmVncmVzc2llcmVuIGRpZSBCaWxkdW5nICggYGJpbGR1bmdgICkgYXVmIGRpZSBJbnN0cnVtZW50YWx2YXJpYWJsZSAoIGBuYWVoZWAgKS4gRGllcyBuZW5uZW4gd2lyICpmaXJzdF9zdGFnZSogdW5kIHNvbGx0ZSB1bnMgYmVrYW5udCB2b3Jrb21tZW4sIHNjaGxpZcOfbGljaCBoYWJlbiB3aXIgZGFzIGJlcmVpdHMgZ2VtYWNodCB1bSBkaWUgUmVsZXZhbnogZGVzIEluc3RydW1lbnRzIHp1IGJlc3RpbW1lbjoKCmBgYHtyfQpmaXJzdF9zdGFnZSA8LSBsbShiaWxkdW5nIH4gbmFlaGUsIGRhdGEgPSBkaXN0YW5jZSkKYGBgCgoyLiBBbHMgbsOkY2hzdGVzIGV4dHJhaGllcmVuIHdpciBkaWUgVmFyaWF0aW9uIHZvbiBgYmlsZHVuZ2AsIHdlbGNoZSB2b24gYG5hZWhlYCBlcmtsw6RydCB3ZXJkZW4ga2Fubi4gRGFmw7xyIG51dHplbiB3aXIgZGllIEVyZ2Vibmlzc2UgYXVzIHVuc2VyZXIgKmZpcnN0X3N0YWdlKiBSZWdyZXNzaW9uIHVuZCBzY2hhdWVuIHVucyBhbiwgd2VsY2hlIFdlcnRlIHdpciBmw7xyIGBiaWxkdW5nYCB2b3JoZXJnZXNhZ3QgaMOkdHRlbiwgZ2VnZWJlbiBkZXIgamV3ZWlsaWdlbiBgbmFlaGVgIHp1ciBVbmkuIEtvbmtyZXQgbnV0emVuIHdpciBkaWUgZ2VmaXR0ZXRlbiBXZXJ0ZSB1bnNlcmVyICpmaXJzdF9zdGFnZSogUmVncmVzc2lvbiAoIGAuZml0dGVkYCApIHVuZCBmw7xnZW4gZGllc2UgdW5zZXJlbSBEYXRlbnNhdHogaGluenUgKGVpbmUgZWluZmFjaGUgTWV0aG9kZSBiaWV0ZXQgZGllIEZ1bmt0aW9uIGBhdWdtZW50X2NvbHVtbnMoKWAgYXVzIGRlbSBQYWtldCBgYnJvb21gKS4KCmBgYHtyfQpkaXN0YW5jZSA8LSBhdWdtZW50X2NvbHVtbnMoZmlyc3Rfc3RhZ2UsIGRpc3RhbmNlKSAlPiUKICBzZWxlY3QoZWluaywgYmlsZHVuZywgZmFlaGlna2VpdGVuLCBuYWVoZSwgZXJyb3JfZWluaywgYC5maXR0ZWRgKQoKaGVhZChkaXN0YW5jZSkKYGBgCgpVbnMgaW50ZXJlc3NpZXJlbiBpbnNiZXNvbmRlcmUgZGllIGdlZml0dGV0ZW4gV2VydGUgKCBgLmZpdHRlZGAgKSwgZGEgZGllcyBkaWUgVmFyaWF0aW9uIGluIGBiaWxkdW5nYCB3aWRlcnNwaWVnZWx0LCBkaWUgZXhvZ2VuIGlzdCB1bmQgZGFtaXQgb2huZSBkZW4gRWluZmx1c3MgZGVyIEbDpGhpZ2tlaXRlbi4KCjMuIE51biBrw7ZubmVuIHdpciBkaWUgU3BhbHRlIGAuZml0dGVkYCBudXR6ZW4gdW0gZGVuIF9rYXVzYWxlbl8gRWZmZWt0IGRlciBCaWxkdW5nIGF1ZiBkYXMgRWlua29tbWVuIHp1IHNjaMOkdHplbiAoaW4gZWluZXIgendlaXRlbiBSZWdyZXNzaW9uKToKCmBgYHtyfQpzZWNvbmRfc3RhZ2UgPC0gbG0oZWluayB+IGAuZml0dGVkYCwgZGF0YSA9IGRpc3RhbmNlKQoKc3VtbWFyeShzZWNvbmRfc3RhZ2UpCmBgYAoKRGllIEVyZ2Vibmlzc2UgZGllc2VyIFJlZ3Jlc3Npb24gc29sbHRlbiBudW4gZGVuIHRhdHPDpGNobGljaGVuIEVmZmVrdCBkZXIgQmlsZHVuZyBhdWYgZGFzIEVpbmtvbW1lbiB3aWRlcnNwaWVnZWxuLCBkYSB3aXIgZHVyY2ggdW5zZXJlIEluc3RydW1lbnRhbHZhcmlhYmxlIGRlbiBlbmRvZ2VuZW4gUGFydCBkZXIgQmlsZHVuZyAoYmVlaW5mbHVzc3Qgdm9uIGRlbiBGw6RoaWdrZWl0ZW4pIGVudGZlcm50IGhhYmVuLiBVbmQgdGF0c8OkY2hsaWNoIGRlciBFZmZla3QgZGVyIEJpbGR1bmcgYXVmIGRhcyBFaW5rb21tZW4gZW50c3ByaWNodCAzOCw3N+KCrCBmw7xyIGVpbiBKYWhyIG1laHIgQmlsZHVuZyAoc2ltdWxpZXJ0IGhhdHRlbiB3aXIgNDDigqwpIQoKIyMgVHdvLXN0YWdlIGxlYXN0IHNxdWFyZXMgKDJTTFMpIGluIFIKCkRpZSBow6RuZGlzY2hlIEJlcmVjaG51bmcgZGVyIGVpbnplbG5lbiBSZWdyZXNzaW9uZW4gaXN0IGhpbGZyZWljaCB1bSBzaWNoIGtsYXIgenUgd2VyZGVuLCB3YXMgZ2VuYXUgZGllIHNvIGdlbmFubnRlICJUd28tc3RhZ2UgbGVhc3Qgc3F1YXJlcyIgbWFjaHQgdW0gZWluZSBJbnN0cnVtZW50YWx2YXJpYWJsZW5yZWdyZXNzaW9uIGR1cmNoenVmw7xocmVuOgoKRXMgZ2lidCB6d2VpICJzdGFnZXMiLCBkLmguIHp3ZWkgUmVncmVzc2lvbmVuLCBkaWUgbmFjaGVpbmFuZGVyIGR1cmNoZ2Vmw7xocnQgd2VyZGVuLiAKCkluIGRlciBlcnN0ZW4gInN0YWdlIiBlcmtsw6RyZW4gd2lyIHVuc2VyZSBlbmRvZ2VuZSBWYXJpYWJsZSBkdXJjaCBkYXMgSW5zdHJ1bWVudCB1bmQgaW4gZGVyIHp3ZWl0ZW4gInN0YWdlIiBudXR6ZW4gd2lyIGRpZSBnZWZpdHRldGVuL3Zvcmhlcmdlc2FndGVuIFdlcnRlIGRlciBlcnN0ZW4gUmVncmVzc2lvbiB1bSB1bnNlcmUgZWlnZW50bGljaGUgRnJhZ2VzdGVsbHVuZyB6dSBiZWFudHdvcnRlbi4gSmVkb2NoIGdpYnQgZXMgZWluaWdlIE5hY2h0ZWlsZSwgd2VubiB3aXIgZWluZSBzb2xjaGUgMlNMUyBwZXIgSGFuZCBkdXJjaGbDvGhyZW46CgotIERpZSBTdGFuZGFyZGZlaGxlciBzaW5kIG5pY2h0IGtvcnJla3QKLSBEYXMgUsKyICh1bmQgd2VpdGVyZSBEaWFnbm9zdGlrZW4pIGRlciB6d2VpdGVuICJzdGFnZSIgd2VyZGVuIG5pY2h0IGtvcnJla3QgZ2VzY2jDpHR6dC4KCkRpZXMgbGllZ3QgZGFyYW4gZGFzIHdpciBuaWNodCBkaWUgX2dlbWVzc2VuZV8gYGJpbGR1bmdgIGluIGRlciB6d2VpdGVuICJzdGFnZSIgdmVyd2VuZGVuLCBzb25kZXJuIGRpZSBnZXNjaMOkdHplbiBXZXJ0ZSBgLmZpdHRlZGAgYXVzIGRlciBlcnN0ZW4gInN0YWdlIi4gRGFoZXIgbcO8c3NlbiB3aXIgZGllIEVyZ2Vibmlzc2UgYXVzIGRlciB6d2VpdGVuICJzdGFnZSIgYW5wYXNzZW4uIERpZXMgd29sbGVuIHdpciBqZWRvY2ggbmljaHQgYXVjaCB2b24gSGFuZCBtYWNoZW4sIHNvbmRlcm4gbnV0emVuIGhpZXJ6dSBkYXMgUGFrZXQgYEFFUmAgbWl0IGRlciBGdW5rdGlvbiBgaXZyZWcoKWAsIHdlbGNoZSBkaWVzZSBBbnBhc3N1bmdlbiBmw7xyIHVucyB2b3JuaW1tdC4KCkRpZXMgd29sbGVuIHdpciBudW4gdHVuIHVuZCBkaWUgRXJnZWJuaXNzZSB1bnNlcmVyIHVudGVyc2NoaWVkbGljaGVyIFJlZ3Jlc3Npb25lbiBnZWdlbsO8YmVyc3RlbGxlbi4KCmBgYHtyLCByZXN1bHRzID0gJ2FzaXMnfQpvbHNfaXYgPC0gaXZyZWcoZWluayB+IGJpbGR1bmcgfCBuYWVoZSAsIGRhdGEgPSBkaXN0YW5jZSkKCmNtIDwtIGMoImJpbGR1bmciID0gIkJpbGR1bmciLAogICAgICAgICIuZml0dGVkIiA9ICJCaWxkdW5nX0RhY2giLAogICAgICAgICJmYWVoaWdrZWl0ZW4iID0gIkbDpGhpZ2tlaXRlbiIsCiAgICAgICAgIihJbnRlcmNlcHQpIiA9ICJLb25zdGFudGUiKQoKbW9kZWxzdW1tYXJ5KGxpc3Qob2xzX2JpYXMsIG9sc19jb3JyZWN0LCBzZWNvbmRfc3RhZ2UsIG9sc19pdiksCiAgICAgICAgICAgICB0eXBlID0gImh0bWwiLCAKICAgICAgICAgICNrZWVwID0gYygiZWR1YyIsICJiaWxkdW5nX2hhdCIpLAogICAgICAgICAgZm10ID0gMywKICAgICAgICAgIHN0YXRpc3RpYyA9ICdjb25mLmludCcsIAogICAgICAgICAgY29uZl9sZXZlbCA9IC45OSwKICAgICAgICAgIGdvZl9vbWl0ID0gJ0RGfERldmlhbmNlfExvZy5MaWsufEZ8Uk1TRXxBSUN8QklDJywKICAgICAgICAgIGNvZWZfbWFwID0gY20sCiAgICAgICAgICAjY29sdW1uLmxhYmVscyA9IGMoIk9MUyBCaWFzIiwgIk9MUyBLb250cm9sbGUiLCAiMlNMUyBwZXIgSGFuZCIsICIyU0xTIHN0YXJrZXMgSW5zdHJ1bWVudCIpLAogICAgICAgICAgdGl0bGUgPSAiTG9nKEVpbmtvbW1lbikgYXVmIEJpbGR1bmcgcmVncmVzc2llcnQiKSAlPiUKICBhZGRfaGVhZGVyX2Fib3ZlKGMoIiAiID0gMSwiT0xTIEJpYXMiID0gMSwgIk9MUyBLb250cm9sbGUiID0gMSwgIjJTTFNcbmjDpG5kaXNjaCIgPSAxLCAiMlNMU1xuIHN0YXJrZXMgSW5zdHJ1bWVudCIgPSAxKSkgJT4lCiAgYWRkX2hlYWRlcl9hYm92ZShjKCIgIiA9IDEsIk9MUyIgPSAzLCAiSW5zdHJ1bWVudGFsdmFyaWFibGUiID0gMSkpCmBgYAoKSW4gZGVyIGVyc3RlbiBTcGFsdGUgaGFiZW4gd2lyIGRhcyBuYWl2ZSBNb2RlbGwsIHdlbGNoZXMgZGVuIEVmZmVrdCBkZXIgQmlsZHVuZyBhdWYgZGFzIEVpbmtvbW1lbiDDvGJlcnNjaMOkdHp0LiBJbiBkZXIgendlaXRlbiBTcGFsdGUgc2VoZW4gd2lyIGRhcyBNb2RlbGwsIHdpZSB3aXIgZXMgZ2VybmUgc2Now6R0emVuIG3DtmNodGVuLCBtaXQgZGVyIChpbiByZWFsZW4gRGF0ZW5zw6R0emVuIHVuYmVvYmFjaHRiYXJlbikgVmFyaWFibGVuIEbDpGhpZ2tlaXRlbiAoIGBmYWVoaWdrZWl0ZW5gICkuIEluIGRpZXNlciB6d2VpdGVuIFNwYWx0ZSBlcmhhbHRlbiB3aXIgZGVuIGtvcnJla3RlbiBLb2VmZml6aWVudGVuIGbDvHIgYGJpbGR1bmdgIQpJbiBkZXIgZHJpdHRlbiBTcGFsdGUgYmVyZWNobmVuIHdpciBkaWUgMlNMUyB2b24gSGFuZC4gSGllciBlcmhhbHRlbiB3aXIgYXVjaCBkZW4ga29ycmVrdGVuIEtvZWZmaXppZW50ZW4gZsO8ciBgYmlsZHVuZ2AgKGluIGRpZXNlbSBNb2RlbGwgYEJpbGR1bmdfRGFjaGAgZ2VuYW5udCksIHdpZSBhdWNoIGluIGRlciBhdXRvbWF0aXNjaCB2b24gUiBiZXJlY2huZXRlbiAyU0xTIGluIGRlciA0LiBTcGFsdGUuIFdpciBrb25udGVuIG1pdCBkZXIgSW5zdHJ1bWVudGFsdmFyaWFibGUgZGllIGV4b2dlbmUgVmFyaWF0aW9uIHZvbiBgYmlsZHVuZ2AgZXJmb2xncmVpY2ggZXh0cmFoaWVyZW4gdW5kIGVyaGFsdGVuIGRlbiBfa2F1c2FsZW5fIEVmZmVrdCB2b24gZWluZW0gSmFociBtZWhyIEJpbGR1bmcgYXVmIGRhcyBXb2NoZW5laW5rb21tZW4sIHdlbGNoZXIgaW4gdW5zZXJlciBSZWdyZXNzaW9uIGJlaSAzOCw0NzfigqwgbGllZ3QuIFppZW1saWNoIGd1dCBnZXNjaMOkdHp0IHfDvHJkZSBpY2ggc2FnZW4sIHNjaGxpZcOfbGljaCBoYWJlbiB3aXIgZGVuIHdhaHJlbiBFZmZla3QgYXVmIDQw4oKsIHNpbXVsaWVydCEKCkltIFZlcmdsZWljaCBkZXIgMy4gdW5kIDQuIFNwYWx0ZSBzZWhlbiB3aXIgZGVuIHZvcmhpbiBlcnfDpGhudGVuIFVudGVyc2NoaWVkIGluIGRlbiBTdGFuZGFyZGZlaGxlcm4gdW5kIGRlbSBSwrIsIHdlbGNoZSBkdXJjaCBkYXMgYEFFUmAgUGFrZXQgbWl0IGRlciBGdW5rdGlvbiBgaXZyZWcoKWAgYXV0b21hdGlzY2gga29ycmlnaWVydCB3aXJkLgoKIyBTY2h3YWNoZSBJbnN0cnVtZW50ZQoKTnVuIGVyaGFsdGVuIHdpciBtaXQgdW5zZXJlbSBJbnN0cnVtZW50IGRlbiBfa2F1c2FsZW5fIEVmZmVrdCBkZXIgQmlsZHVuZyBhdWYgZGFzIEVpbmtvbW1lbi4gRGFzIGlzdCB0b2xsIQpEb2NoIHVuc2VyIEluc3RydW1lbnQgd2FyIG1pdCBlaW5lciBGLVN0YXRpc3RpayB2b24gMTUzLjggaW4gZGVyIF9maXJzdC1zdGFnZV8gc2VociByZWxldmFudCBmw7xyIGRpZSBleG9nZW5lIFZhcmlhdGlvbiBpbiBgYmlsZHVuZ2AuIEFuZ2Vub21tZW4gd2lyIGhhYmVuIG51ciBlaW4gc2Nod2FjaGVzIEluc3RydW1lbnQgenVyIFZlcmbDvGd1bmcsIGvDtm5uZW4gd2lyIGRlbm5vY2ggdmFsaWRlIEVyZ2Vibmlzc2Ugc2Now6R0emVuLCBvZGVyIGVyaGFsdGVuIHdpciBkdXJjaCBkZW4gQmlhcyBpbiBkZXIgSW5zdHJ1bWVudGFsdmFyaWFibGVucmVncmVzc2lvbiBzdGFyayB2ZXJ6ZXJydGUgRXJnZWJuaXNzZT8KCmBgYHtyLCByZXN1bHRzID0gJ2FzaXMnfQojWnVlcnN0IGdlbmVyaWVyZW4gd2lyIHVucyBlaW4gc2Nod2FjaGVzIEluc3RydW1udGUgKDAuMDAxICogZGlzdGFuY2UpCmRpc3RhbmNlIDwtIGRpc3RhbmNlICU+JQogIG11dGF0ZShiaWxkdW5nX3dlYWsgPSAxMyArIDAuMDAxKm5hZWhlICsgMipmYWVoaWdrZWl0ZW4sICAjIERpc3RhbmNlIGFscyBzY2h3YWNoZXMgSW5zdHJ1bWVudCBmw7xyIEJpbGR1bmcKICAgICAgICAgZWlua193ZWFrID0gMTAwICsgNDAqYmlsZHVuZ193ZWFrICsgNzAqZmFlaGlna2VpdGVuIC0gZXJyb3JfZWluaykKCiNVbSBhbnNjaGxpZcOfZW5kIGRpZSBJViBSZWdyZXNzaW9uIG1pdCBkaWVzZW0gSW5zdHJ1bWVudCBkdXJjaGxhdWZlbiB6dSBsYXNzZW4Kb2xzX2l2X3dlYWsgPC0gaXZyZWcoZWlua193ZWFrIH4gYmlsZHVuZ193ZWFrIHwgbmFlaGUgLCBkYXRhID0gZGlzdGFuY2UpCgojV2lyIHNwZWljaGVybiBkZW4gV2Vhay1JbnN0cnVtZW50cyBUZXN0IGF1cyBkZXIgZmlyc3Qtc3RhZ2UgYWIgdW5kIGbDvGdlbiBkaWVzZSBTcGFsdGUgdW5zZXJlciBSZWdyZXNzaW9uIGluIHN0YXJnYXplciBoaW56dSAoZsO8ciBzdGFya2VzIHVuZCBzY2h3YWNoZXMgSW5zdHJ1bWVudCkKb2xzX2l2X3Rlc3QgPC0gc3VtbWFyeShvbHNfaXYsIGRpYWdub3N0aWNzID0gVCkkZGlhZ25vc3RpY3NbMSwzXSAjc3RhcmtlcyBJbnN0cnVtZW50Cm9sc19pdl93ZWFrX3Rlc3QgPC0gc3VtbWFyeShvbHNfaXZfd2VhaywgZGlhZ25vc3RpY3MgPSBUKSRkaWFnbm9zdGljc1sxLDNdICNzY2h3YWNoZXMgSW5zdHJ1bWVudAoKY20gPC0gYygiYmlsZHVuZyIgPSAiQmlsZHVuZyIsCiAgICAgICAgIi5maXR0ZWQiID0gIkJpbGR1bmdfRGFjaCIsCiAgICAgICAgImJpbGR1bmdfd2VhayIgPSAiQmlsZHVuZyIsCiAgICAgICAgImZhZWhpZ2tlaXRlbiIgPSAiRsOkaGlna2VpdGVuIiwKICAgICAgICAiKEludGVyY2VwdCkiID0gIktvbnN0YW50ZSIpCgptb2RlbHN1bW1hcnkobGlzdChvbHNfYmlhcywgb2xzX2NvcnJlY3QsIHNlY29uZF9zdGFnZSwgb2xzX2l2LCBvbHNfaXZfd2VhayksCiAgICAgICAgICAgICB0eXBlID0gImh0bWwiLCAKICAgICAgICAgICNrZWVwID0gYygiZWR1YyIsICJiaWxkdW5nX2hhdCIpLAogICAgICAgICAgZm10ID0gMywKICAgICAgICAgIHN0YXRpc3RpYyA9ICdjb25mLmludCcsIAogICAgICAgICAgY29uZl9sZXZlbCA9IC45OSwKICAgICAgICAgIGdvZl9vbWl0ID0gJ0RGfERldmlhbmNlfExvZy5MaWsufEZ8Uk1TRXxBSUN8QklDJywKICAgICAgICAgIGNvZWZfbWFwID0gY20sCiAgICAgICAgICB0aXRsZSA9ICJMb2coRWlua29tbWVuKSBhdWYgQmlsZHVuZyByZWdyZXNzaWVydCIpICU+JQogIGFkZF9oZWFkZXJfYWJvdmUoYygiICIgPSAxLCJPTFMgQmlhcyIgPSAxLCAiT0xTIEtvbnRyb2xsZSIgPSAxLCAiMlNMU1xuaMOkbmRpc2NoIiA9IDEsICIyU0xTXG4gc3RhcmtlcyBJbnN0cnVtZW50IiA9IDEsICIyU0xTXG4gc2Nod2FjaGVzIEluc3RydW1lbnQiID0gMSkpICU+JQogIGFkZF9oZWFkZXJfYWJvdmUoYygiICIgPSAxLCJPTFMiID0gMywgIkluc3RydW1lbnRhbHZhcmlhYmxlIiA9IDIpKQoKYGBgCgpXaXIgc2VoZW4gd2FzIHdpciBiZXJlaXRzIHdlaXRlciBvYmVuIGltIFRleHQgZXJ3w6RobnQgaGF0dGVuOgoKMS4gRGVyIEJpYXMgZGVzIElWIFNjaMOkdHplcnMgaXN0IGRldXRsaWNoIHNpY2h0YmFyIHVuZCBzZWhyIGdyb8OfLiBELmguIGR1cmNoIGVpbiBzY2h3YWNoZXMgSW5zdHJ1bWVudCBkcmlmdGVuIHdpciBzZWhyIHdlaXQgd2VnIHZvbSBlaWdlbnRsaWNoZW4ga2F1c2FsZW4gRWZmZWt0CjIuIERpZSBTdGFuZGFyZGZlaGxlciBpbiBkZXIgSVYgUmVncmVzc2lvbiBtaXQgZWluZW0gc2Nod2FjaGVuIEluc3RydW1lbnQgc2luZCBzZWhyIGdyb8Of