Praxistipp: Vorgehen bei Hypothesentests für quantitative Daten

  1. Hypothesen \(H_0\) und \(H_A\) formulieren. Sind diese einseitig oder zweiseitig formuliert?
  2. Signifikanzniveau festlegen. Für alle Übungen wird \(\alpha < 0.05\) festgelegt.
  3. Sind die Daten gepaart (paired) oder unabhängig (independent)?
  4. Prüfgrösse bestimmen:
    • für unabhängige Daten: \(\mu_2 - \mu_1\) (Differenz der Mittelwerte)
    • für gepaarte Daten: \(\mu_{diff}\) (Mittelwert der paarweisen Differenzen)
    • wenn Sie sich für nicht-parametrische Tests entscheiden, ersetzen sie \(\mu\) durch \(Md\) (Median)
  5. Stichprobenumfang prüfen
    • \(n < 30\): nichparametrischen Test (Wilcoxon) wählen
    • unterschiedliche Stichprobenumfänge bei unabhängigen Daten: nichtparametrischen Test (Wilcoxon) wählen
  6. Verteilung der Prüfgrösse untersuchen
    • Daten sind annähernd normalverteilt: t-Test wählen
    • Daten sind nicht normalverteilt: nichtparametrischen Test (Wilcoxon) wählen
    • Unterschiedliche Varianzen bei unabhängigen Daten: nichtparametrischen Test (Wilcoxon) wählen.
  7. Vertrauensintervalle für die Prüfgrösse berechnen.
  8. Gewählten Test durchführen: t- und p-Wert bestimmen.
  9. Schlussfolgerung ziehen und das Ergebnis im Zusammenhang mit der Forschungsfrage interpretieren.


Übung 1

Eine Kaffeekette betreibt eine Filiale in Basel und eine Filiale in Bern. Die Berner Kolleginnen erzählen, dass sie mehr Caffè Latte (mittlere Grösse) in Bern als in Basel für das gleiche Geld erhalten. Sie können das nicht glauben und wollen der Sache auf den Grund gehen. Ihre Frage lautet: Unterscheiden sich die Kaffeemengen an den Standorten Basel und Bern?

Als erstes sammeln Sie Daten: Sie kaufen an beiden Standorten 20 Becher Caffè Latte mittlerer Grösse. Sie messen jeweils die Mengen in ml.

Laden Sie die Datei caffe.csv hier herunter.

Der Datensatz umfasst zwei Variablen:

Variable Beschreibung
Ort Ort der Datenerhebung: Bern, Basel
Menge Kaffeemenge in ml

Aufgabe

  1. Laden Sie den Datensatz herunter und importieren Sie ihn in R.
  2. Formulieren Sie die Null- und die Alternativhypothese.
  3. Beschreiben Sie die Daten deskriptiv. Erstellen Sie ein Boxplot für den Vergleich der Kaffeemengen in Bern und Basel.
  4. Wählen Sie den richtigen Hypothesentest aus.
  5. Berechnen Sie das 95%-Konfidenzintervall für die Differenz der Kaffeemenge zwischen Bern und Basel.
  6. Formulieren Sie ihr Resultat in ein bis zwei Sätzen.



Lösung

  1. Laden Sie den Datensatz herunter und importieren Sie ihn R.
library(rio)
caffe <- import("../data/caffe.csv")
caffe
##      Ort    Menge
## 1  Basel 305.0273
## 2  Basel 311.4508
## 3  Basel 303.7935
## 4  Basel 303.1087
## 5  Basel 306.6558
## 6  Basel 285.0107
## 7  Basel 299.3285
## 8  Basel 314.2387
## 9  Basel 302.2344
## 10 Basel 281.8530
## 11 Basel 299.9207
## 12 Basel 317.6032
## 13 Basel 303.3306
## 14 Basel 304.4187
## 15 Basel 304.4873
## 16 Basel 297.1018
## 17 Basel 292.4915
## 18 Basel 301.4013
## 19 Basel 302.3160
## 20 Basel 302.5607
## 21  Bern 312.6990
## 22  Bern 330.4950
## 23  Bern 349.8080
## 24  Bern 308.7820
## 25  Bern 329.2743
## 26  Bern 325.0282
## 27  Bern 306.2820
## 28  Bern 343.6620
## 29  Bern 344.7321
## 30  Bern 277.5935
## 31  Bern 279.7771
## 32  Bern 318.5638
## 33  Bern 279.1173
## 34  Bern 324.4203
## 35  Bern 292.6793
## 36  Bern 294.0034
## 37  Bern 276.2918
## 38  Bern 318.4481
## 39  Bern 308.1934
## 40  Bern 314.1120
  1. Formulieren Sie ihre Hypothese.
  • \(H_0\) : Die Kaffeemengen von Bern und Basel unterscheiden sich nicht. \(\mu_{Basel} = \mu_{Bern}\).
  • \(H_A\) : Die Kaffeemengen von Bern und Basel unterscheiden sich. \(\mu_{Basel} \neq \mu_{Bern}\).

Erläuterung: Die Fragestellung ist zweiseitig formuliert.


  1. Beschreiben Sie die Daten deskriptiv und erstellen Sie ein Boxplot für den Vergleich der Kaffeemengen in Bern und Basel.
# Teildatensätze (Subsets) erstellen
bern <- subset(caffe, Ort == "Bern")
basel <- subset(caffe, Ort == "Basel")

# Kennzahlen berechnen
summary(bern)
##      Ort                Menge      
##  Length:20          Min.   :276.3  
##  Class :character   1st Qu.:293.7  
##  Mode  :character   Median :313.4  
##                     Mean   :311.7  
##                     3rd Qu.:326.1  
##                     Max.   :349.8
summary(basel)
##      Ort                Menge      
##  Length:20          Min.   :281.9  
##  Class :character   1st Qu.:299.8  
##  Mode  :character   Median :302.8  
##                     Mean   :301.9  
##                     3rd Qu.:304.6  
##                     Max.   :317.6
# Boxplot erstellen
boxplot(caffe$Menge ~ caffe$Ort)

Die durchschnittliche Kaffeemenge in Bern beträgt 311.7 ml und in Basel 301.9 ml. Im Boxplot ist zu sehen, dass die Variationsbreite in Bern grösser ist, als in Basel.


  1. Wählen Sie den richtigen t-Test aus. Erstellen Sie auch eine Grafik für den Vergleich der 95%-Vertrauensintervalle.
  • Der Stichprobenumfang pro Gruppe ist n = 20.
  • Wir prüfen auf Normalverteilung der Daten in beiden Gruppen mit einem QQ-Plot:
# QQ-Plot für Bern
qqnorm(bern$Menge)
qqline(bern$Menge)

# QQ-Plot für Basel
qqnorm(basel$Menge)
qqline(basel$Menge)

  • Interpretation der QQ-Plots: Die zentralen Bereiche der Daten liegen weitgehend auf einer Linie. Wir dürfen schliessen, dass die Daten aus einer normalverteilten Population stammen.
  • Die Daten sind unabhängig.
  • Testwahl: Da n < 30, wählen wir ein nichtparametrisches Verfahren, den Mann-Whitney-U-Test (Wilcoxon Rangsummen-Test). Zum Vergleich führen wir aber auch einen Zweistichproben-t-Test für unabhängige Daten durch.
wilcox.test(caffe$Menge ~ caffe$Ort, alternative = "two.sided", paired = FALSE)
## 
##  Wilcoxon rank sum exact test
## 
## data:  caffe$Menge by caffe$Ort
## W = 128, p-value = 0.0524
## alternative hypothesis: true location shift is not equal to 0

Interpretation des Wilcoxon Rangsummentests: Die Teststatistik W interpretieren wir nicht! Die Wahrscheinlichkeit, für unsere Teststatistik oder noch eine extremere Teststatistik unter der Nullhypothese beträgt 5.24% (p = 0.0524)

t.test(caffe$Menge ~ caffe$Ort, alternative = "two.sided", paired = FALSE)
## 
##  Welch Two Sample t-test
## 
## data:  caffe$Menge by caffe$Ort
## t = -1.7984, df = 24.103, p-value = 0.08465
## alternative hypothesis: true difference in means between group Basel and group Bern is not equal to 0
## 95 percent confidence interval:
##  -21.004502   1.441587
## sample estimates:
## mean in group Basel  mean in group Bern 
##            301.9167            311.6981

Interpretation des Zweistichproben-t-Tests: Die Teststatistik t = -1.7984 ist weniger extrem als die “magische Grenze” um -/+ 2 und wir können bereits jetzt annehmen, dass wir keinen signifikanten Unterschied zwischen den Kaffeemengen in Basel und in Bern haben. Die Anzahl der Freiheitsgrade df = 24.103 wollen wir beim Welch-Test, einer Variante des Zweistichproben-t-Tests für unabhängige Daten, nicht interpretieren. Die Wahrscheinlichkeit für unserer Teststatistik t oder einen noch extremeren Wert für t unter der Nullhypothese beträgt 8.465% (p = 0.08465).


  1. Berechnen Sie das 95%-Konfidenzintervall für die Differenz der Kaffeemenge zwischen Bern und Basel.
  • Sie finden das 95%-Konfidenzintervall für die Differenz der durchschnittlichen Kaffeemengen im Output des t-Tests unter 95 percent confidence interval:. Das 95%-Konfidenzintervall für die durchschnittliche Differenz der Kaffeemengen zwischen Bern und Basel liegt somit zwischen [-21.005, 1.442] ml. Unter der Nullhypothese liegt die durchschnittliche Differenz bei Null. Null ist in diesem Konfidenzintervall enthalten und somit ein plausibler Wert. Das 95%-Konfidenzintervall bestätigt die Ergebnisse der Hypothesentests.
  1. Formulieren Sie ihr Resultat in ein bis zwei Sätzen.
  • Die durchschnittlichen Kaffeemengen in Bern (311.7 ml) und in Basel (301.9 ml) unterscheiden sich nicht signifikant voneinander, Mann-Whitney-U-Test W = 128, p = 0.0524. Die durchschnittliche Differenz der Kaffeemengen (Basel minus Bern) beträgt -9.8 [CI95: -21.005, 1.442] ml.


Übung 2

Welches Ergebnis erwarten Sie, wenn die Fragestellung bei Übung 1 lauten würde: Ist die durchschnittliche Kaffeemenge in Basel geringer als in Bern?

Aufgabe

  1. Formulieren Sie die Null- und die Alternativhypothese.
  2. Führen Sie einen Hypothesentest durch.
  3. Fassen Sie das Ergebnis zusammen.

Lösung

  1. Formulieren Sie die Null- und die Alternativhypothese.
  • \(H_0\) : Die Kaffeemengen von Bern und Basel unterscheiden sich nicht. \(\mu_{Basel} = \mu_{Bern}\).
  • \(H_A\) : Die Kaffeemenge in Basel ist kleiner als in Bern. \(\mu_{Basel} < \mu_{Bern}\).

Erläuterung: Die Fragestellung ist einseitig formuliert.

  1. Führen Sie einen Hypothesentest durch.
wilcox.test(caffe$Menge ~ caffe$Ort, alternative = "less", paired = FALSE)
## 
##  Wilcoxon rank sum exact test
## 
## data:  caffe$Menge by caffe$Ort
## W = 128, p-value = 0.0262
## alternative hypothesis: true location shift is less than 0
t.test(caffe$Menge ~ caffe$Ort, alternative = "less", paired = FALSE)
## 
##  Welch Two Sample t-test
## 
## data:  caffe$Menge by caffe$Ort
## t = -1.7984, df = 24.103, p-value = 0.04233
## alternative hypothesis: true difference in means between group Basel and group Bern is less than 0
## 95 percent confidence interval:
##        -Inf -0.4775344
## sample estimates:
## mean in group Basel  mean in group Bern 
##            301.9167            311.6981
  1. Vergleichen Sie den resultierenden p-Wert mit dem p-Wert aus Übung 1.
Test einseitig zweiseitig
Wilcox 0.0262 0.0524
t-Test 0.0423 0.0847

Wenn wir einseitig testen, ist der p-Wert halb so gross wie beim zweiseitigen Testen.

Übung 3

Ein Gefängnisaufenthalt ist mit psychischem Stress verbunden. Eine Möglichkeit, diesen Stress abzubauen ist sportliche Betätigung. Ein Studie hat den Stresslevel von 26 Gefängnissinsassen bei Ein- und Austritt mittels Fragebogen untersucht (je höher der Stresslevel desto grösser der Stress). Ein Teil der Gefangenen erhielt ein sportliches Training.

Laden Sie die Datei prisonStress.csv hier herunter.

Der Datensatz umfasst 5 Variablen

Variable Beschreibung
Subject anonyme ID
Group Gruppe sport oder control
PSSbefore Stresslevel (Assessment-Score) bei Eintritt
PSSafter Stresslevel (Assessment-Score) bei Austritt
Diff Paarweise Differenzen (PSSafter - PSSbefore)

Aufgabe

  1. Laden Sie den Datensatz in R und kategorisieren Sie die Variablen.
  2. Frage: Haben beide Gruppen bei Eintritt den gleichen Stresslevel?
  3. Frage: Haben beide Gruppen bei Austritt den gleichen Stresslevel?
  4. Frage: Besteht ein Unterschied im Stresslevel zwischen Ein- und Austritt in der Kontrollgruppe?
  5. Frage: Besteht ein Unterschied im Stresslevel zwischen Ein- und Austritt in der Sportgruppe?
  6. Frage: Hat Sport einen Effekt auf den Stresslevel im Vergleich zu einer Kontrollgruppe, die keinen Sport macht?

Führen Sie für alle Fragen sowohl einen nichtparametrischen (Wilcoxon) als auch einen parametrischen (t-Test) Test durch.

Lösung 1

prison <- import("../data/prisonStress.csv")
str(prison)
## 'data.frame':    26 obs. of  5 variables:
##  $ Subject  : chr  "A1" "A3" "A4" "A5" ...
##  $ Group    : chr  "Sport" "Sport" "Sport" "Sport" ...
##  $ PSSbefore: int  25 17 12 21 29 28 21 18 20 29 ...
##  $ PSSafter : int  13 15 13 22 25 24 19 19 24 21 ...
##  $ Diff     : int  -12 -2 1 1 -4 -4 -2 1 4 -8 ...
# Die Variable Group ist nominal und wird als factor kategorisiert
prison$Group <- factor(prison$Group)
str(prison)
## 'data.frame':    26 obs. of  5 variables:
##  $ Subject  : chr  "A1" "A3" "A4" "A5" ...
##  $ Group    : Factor w/ 2 levels "Control","Sport": 2 2 2 2 2 2 2 2 2 2 ...
##  $ PSSbefore: int  25 17 12 21 29 28 21 18 20 29 ...
##  $ PSSafter : int  13 15 13 22 25 24 19 19 24 21 ...
##  $ Diff     : int  -12 -2 1 1 -4 -4 -2 1 4 -8 ...

Lösung 2

Fragestellung: Haben die Gruppen Sport und Control bei Eintritt den gleichen Stresslevel?

  1. Hypothesen

    • \(H_0\) Es besteht kein Unterschied im Stresslevel der Gruppen Sport und Kontrolle bei Eintritt, \(\mu_{con,before} = \mu_{sport,before}\)
    • \(H_A\) Es besteht ein Unterschied im Stresslevel der Gruppen Sport und Kontrolle bei Eintritt, \(\mu_{con,before} \neq \mu_{sport,before}\)
# Deskriptive Statistik nach Subsets
sport <- subset(prison, Group == "Sport")
control <- subset(prison, Group == "Control")

summary(sport$PSSbefore)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   12.00   19.00   23.00   23.93   27.50   44.00
summary(control$PSSbefore)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    0.00    9.00   15.00   16.36   26.00   30.00
boxplot(prison$PSSbefore ~ prison$Group)

  1. Das Signifikanzniveau legen wir bei \(\alpha = 0.05\) fest.
  2. Die Daten sind unabhängig (wir vergleichen zwei unterschiedliche Gruppen).
  3. Die Prüfgrösse ist die Differenz der Mittelwerte der beiden Gruppen \(\mu_{con,before} - \mu_{sport,before}\)
  4. Der Stichprobenumfang pro Gruppe ist n < 30, was für den Man-Whitney-U-Test spricht.
  5. Die Verteilung der Prüfgrösse anhand der Box im Boxplot ergibt eine leicht rechtssteile Verteilung in der Kontrollgruppe und etwa Normalverteilung in der Sportgruppe. Die QQ-Plots sind wenig aussagekräftig. Die Streuung der Daten ist unterschiedlich.
# QQ-Plot für Sportgruppe
qqnorm(sport$PSSbefore)
qqline(sport$PSSbefore, col = "blue")

# QQ-Plot für Controlgruppe
qqnorm(control$PSSbefore)
qqline(control$PSSbefore, col = "blue")

  • Die Prüfung der Testbedingungen legt nichtparametrische Verfahren zur statistischen Analyse nahe.
  1. Vertrauensintervalle für die Prüfgrösse und Teststatistik bestimmen
wilcox.test(PSSbefore ~ Group, data = prison, alternative = "two.sided")
## Warning in wilcox.test.default(x = DATA[[1L]], y = DATA[[2L]], ...): kann bei
## Bindungen keinen exakten p-Wert Berechnen
## 
##  Wilcoxon rank sum test with continuity correction
## 
## data:  PSSbefore by Group
## W = 52.5, p-value = 0.1249
## alternative hypothesis: true location shift is not equal to 0

Interpretation des Wilcoxon Rangsummentests (= Mann-Whitney-U-Test): Die Warnung können Sie ignorieren ;). Die Teststatistik W interpretieren wir nicht. Die Wahrscheinlichkeit für den Wert der Teststatistik oder einen noch extremeren Wert beträgt 12.5% (p = 0.1249).

t.test(PSSbefore ~ Group, data = prison, alternative = "two.sided")
## 
##  Welch Two Sample t-test
## 
## data:  PSSbefore by Group
## t = -2.0064, df = 16.863, p-value = 0.06112
## alternative hypothesis: true difference in means between group Control and group Sport is not equal to 0
## 95 percent confidence interval:
##  -15.5344325   0.3950385
## sample estimates:
## mean in group Control   mean in group Sport 
##              16.36364              23.93333

Interpretation des Zweistichproben-t-Tests: Die Teststatistik beträgt t = -2.0064. Dieser Wert liegt in der Nähe der “magischen Grenze” von -2. Allerdings liegen hier kleine Stichprobenumfänge vor, wodurch die Kurve der t-Verteilung an den Enden sehr flach verläuft und der kritische Wert für die 2.5% Grenze weiter als -2.0 liegt. Anzahl Freiheitsgrade df interpretieren wir beim Welch-Test nicht. Die Wahrscheinlichkeit für den Wert der Teststatistik t oder einen noch extremeren Wert unter der Nullhypothese beträgt 6.1% (p = 0.06112). Die Sportgruppe hat bei Eintritt im Durchschnitt einen etwas höheren Stresslevel (23.9) als die Controlgruppe (16.4). Die durchschnittliche Differenz des Stresslevels zwischen den beiden Gruppen (Control minus Sport) beträgt -7.560 [95%-CI: -15.534, 0.395]. Dieses 95%-Konfidenzintervall schliesst 0 ein und unterstützt die Ergebnisse aus den Hypothesentests. Für die Formulierung des Resultats verwenden wir nur die Angaben zum 95%-Konfidenzintervall, da wir uns für den Mann-Whitney-U-Test als korrekten Test entschieden haben!


  1. Resultat, Schlussfolgerung

Der Stresslevel bei Eintritt ins Gefängnis ist in der Kontrollgruppe (n = 11) im Durchschnitt um -7.560 [-15.534, 0.395] Punkte tiefer als in der Sportgruppe (n = 15). Es liegt jedoch keine Evidenz dafür vor, dass sich die beiden Gruppen im Stresslevel bei Eintritt ins Gefängnis signifikant unterscheiden, Man-Whitney-U = 52.5, p = 0.1249.


Lösung 3

Fragestellung: Haben beide Gruppen bei Austritt den gleichen Stresslevel? Das ist die ähnliche Fragestellung wie Frage 2. Versuchen Sie diese Aufgabe möglichst ohne Hilfsmittel zu bearbeiten.

  1. Hypothesen

    • \(H_0\) Es besteht kein Unterschied im Stresslevel der Gruppen Sport und Kontrolle bei Austritt, \(\mu_{con,after} = \mu_{sport,after}\)
    • \(H_A\) Es besteht ein Unterschied im Stresslevel der Gruppen Sport und Kontrolle bei Austritt, \(\mu_{con,after} \neq \mu_{sport,after}\)
  2. Das Signifikanzniveau legen wir bei \(\alpha = .05\) fest.

  3. Die Daten sind unabhängig.

  4. Die Prüfgrösse ist \(\mu_{con,after} - \mu_{sport,after}\).

  5. Der Stichprobenumfang pro Gruppe ist n < 30, was für Man-Whitney-U-Test spricht.

# Die Subsets sport und control haben wir schon unter Lösung 1 gemacht
summary(sport$PSSafter)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##       8      14      21      20      24      33
summary(control$PSSafter)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    9.00   20.50   26.00   23.73   28.50   33.00
boxplot(prison$PSSafter ~ prison$Group)


  1. Die Verteilung der Prüfgrösse anhand der Box im Boxplot ergibt eine leicht rechtssteile Verteilung in beiden Gruppen. Die QQ-Plots sind wenig aussagekräftig. Die Streuung der Daten ist ähnlich.
# QQ-Plot für Sportgruppe
qqnorm(sport$PSSafter)
qqline(sport$PSSafter, col = "blue")

# QQ-Plot für Controlgruppe
qqnorm(control$PSSafter)
qqline(control$PSSafter, col = "blue")

  • Die Prüfung der Testbedingungen (n < 30, rechtssteile Verteilungen) legt nichtparametrische Verfahren zur statistischen Analyse nahe.

  1. Vertrauensintervalle für die Prüfgrösse und Teststatistik bestimmen
wilcox.test(PSSafter ~ Group, data = prison, alternative = "two.sided")
## Warning in wilcox.test.default(x = DATA[[1L]], y = DATA[[2L]], ...): kann bei
## Bindungen keinen exakten p-Wert Berechnen
## 
##  Wilcoxon rank sum test with continuity correction
## 
## data:  PSSafter by Group
## W = 108.5, p-value = 0.185
## alternative hypothesis: true location shift is not equal to 0
t.test(PSSafter ~ Group, data = prison, alternative = "two.sided")
## 
##  Welch Two Sample t-test
## 
## data:  PSSafter by Group
## t = 1.3361, df = 21.325, p-value = 0.1956
## alternative hypothesis: true difference in means between group Control and group Sport is not equal to 0
## 95 percent confidence interval:
##  -2.068912  9.523458
## sample estimates:
## mean in group Control   mean in group Sport 
##              23.72727              20.00000
  1. Schlussfolgerung

Der Stresslevel bei Austritt aus dem Gefängnis ist in der Kontrollgruppe (n = 11) im Durchschnitt um 3.727 [95%-CI: -2.069, 9.523] Punkte höher als in der Sportgruppe (n = 15). Es liegt keine Evidenz dafür vor, dass sich die beiden Gruppen im Stresslevel bei Austritt aus dem Gefängnis signifikant unterscheiden, Man-Whitney-U-Test W = 108.5, p = 0.185.


Lösung 4

Fragestellung: Besteht ein Unterschied im Stresslevel zwischen Ein- und Austritt in der Kontrollgruppe?


  1. Hypothesen

    • \(H_0\) Es besteht kein Unterschied im Stresslevel in der Kontrollgruppe zwischen Ein- und Austritt, \(\mu_{con,diff}=0}\) (Mittelwert der paarweisen Differenzen!)
    • \(H_A\) Es besteht ein Unterschied im Stresslevel in der Kontrollgruppe bei Eintritt, \(\mu_{con,diff} \neq 0\)$
  2. Das Signifikanzniveau legen wir bei \(\alpha = .05\) fest.

  3. Die Daten sind gepaart (2 Messungen pro Proband:in).

  4. Die Prüfgrösse ist \(\mu_{con,diff}\). Die paarweisen Differenzen sind in der Variablen prison$Diff berechnet. Wir arbeiten hier nur mit dem Subset control.

  5. Der Stichprobenumfang ist n = 11, was für den Wilcoxon-Vorzeichenrang-Test spricht. Hinweis: Bei gepaarten Daten darf ein parametrischer Test bereits bei einem Stichprobenumfang von n = 12 oder mehr durchgeführt werden.

# Das subset control wurde bereits in Lösung 1 erstellt
summary(control$Diff)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##  -8.000   0.500   7.000   7.364  15.000  20.000
boxplot(control$Diff)


  1. Die Verteilung der Prüfgrösse Diff anhand von Boxplot und QQ-Plot ist auf Grund der geringen Datenmenge wenig zuverlässig zu interpretieren; es scheint aber nichts dagegen zu sprechen, dass die Daten aus einer normalverteilten Population stammen.
## QQ-Plot für Diff in der Gruppe Control
qqnorm(control$Diff)
qqline(control$Diff, col = "blue")

  • Die Prüfung der Testbedingungen (n < 12) legt nichtparametrische Verfahren zur statistischen Analyse nahe. Wir führen aber auch den t-Test für gepaarte Daten durch, um das 95%-Konfidenzintervall zu berechnen.


  1. Vertrauensintervalle für die Prüfgrösse und Teststatistik bestimmen
wilcox.test(control$PSSafter, control$PSSbefore, 
            paired = TRUE, alternative = "two.sided")
## Warning in wilcox.test.default(control$PSSafter, control$PSSbefore, paired =
## TRUE, : kann bei Bindungen keinen exakten p-Wert Berechnen
## Warning in wilcox.test.default(control$PSSafter, control$PSSbefore, paired =
## TRUE, : kann den exakten p-Wert bei Nullen nicht berechnen
## 
##  Wilcoxon signed rank test with continuity correction
## 
## data:  control$PSSafter and control$PSSbefore
## V = 47.5, p-value = 0.04657
## alternative hypothesis: true location shift is not equal to 0
t.test(control$PSSafter, control$PSSbefore, 
       paired = TRUE, alternative = "two.sided")


  1. Schlussfolgerung

Der Stresslevel bei Austritt aus dem Gefängnis ist in der Kontrollgruppe (n = 11) im Durchschnitt um 7.634 [95%-CI: 1.161, 13.567] Punkte höher als beim Eintritt. Es liegt Evidenz dafür vor, dass sich der durchschnittliche Stresslevel in der Kontrollgruppe beim Aufenthalt im Gefängnis signifikant erhöht hat, Wilcoxon Vorzeichenrang-Test V = 47.5, p = 0.047.



Lösung 5

Fragestellung: Besteht ein Unterschied im Stresslevel zwischen Ein- und Austritt in der Sportgruppe? Das ist die ähnliche Fragestellung wie Frage 4. Versuchen Sie diese Aufgabe möglichst ohne Hilfsmittel zu bearbeiten.


  1. Hypothesen

    • \(H_0\) Es besteht kein Unterschied im Stresslevel in der Sportgruppe zwischen Ein- und Austritt, \(\mu_{sport,diff}=0}\) (Mittelwert der paarweisen Differenzen!)
    • \(H_A\) Es besteht ein Unterschied im Stresslevel in der Kontrollgruppe bei Eintritt, \(\mu_{sport,diff} \neq 0\)$
  2. Das Signifikanzniveau legen wir bei \(\alpha = .05\) fest.

  3. Die Daten sind gepaart (2 Messungen pro Proband)

  4. Die Prüfgrösse ist \(\mu_{sport,diff}\)

  5. Der Stichprobenumfang in der Sportgruppe ist n = 15. Bei gepaarten Daten darf ein parametrischer Test bereits bei einem Stichprobenumfang von n = 12 oder mehr durchgeführt werden.

# Das subset sport wurde bereits in Lösung 1 erstellt
summary(sport$Diff)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
## -15.000  -7.000  -4.000  -3.933   1.000   4.000
boxplot(sport$Diff)


  1. Die Verteilung der Prüfgrösse Diff anhand von Boxplot und QQ-Plot ist auf Grund der geringen Datenmenge wenig zuverlässig zu interpretieren; es scheint aber nichts dagegen zu sprechen, dass die Daten aus einer normalverteilten Population stammen.
# QQ-Plot für Diff in der Sportgruppe
qqnorm(sport$Diff)
qqline(sport$Diff, col = "blue")

  • Die Prüfung der Testbedingungen legt ein parametrisches Verfahren zur statistischen Analyse nahe.


  1. Vertrauensintervalle für die Prüfgrösse und Teststatistik bestimmen
t.test(sport$PSSafter, sport$PSSbefore, 
       paired = TRUE, alternative = "two.sided")
Paired t-test

data: sport\(PSSafter and sport\)PSSbefore t = -2.6842, df = 14, p-value = 0.0178 alternative hypothesis: true mean difference is not equal to 0 95 percent confidence interval: -7.0762338 -0.7904329 sample estimates: mean difference -3.933333


  1. Schlussfolgerung

Der Stresslevel bei Austritt aus dem Gefängnis ist in der Sportgruppe (n = 15) im Durchschnitt um -3.933 [95%-CI: -7.076, -0.790] Punkte tiefer als beim Eintritt. Es liegt Evidenz dafür vor, dass sich der Stresslevel beim Aufenthalt im Gefängnis in der Sportgruppe signifikant senkt, t = -2.684, df = 14, p = 0.0178.

Hinweis: Bei den Übungen 4 und 5 können Sie die Tests auch als Einstichproben-Test für die die paarweisen Differenzen Diff und den Nullwert 0 durchführen. Das Ergebnis ist identisch.

t.test(sport$Diff, mu = 0, alternative = "two.sided")
## 
##  One Sample t-test
## 
## data:  sport$Diff
## t = -2.6842, df = 14, p-value = 0.0178
## alternative hypothesis: true mean is not equal to 0
## 95 percent confidence interval:
##  -7.0762338 -0.7904329
## sample estimates:
## mean of x 
## -3.933333



Lösung 6

Fragestellung: Hat Sport einen Effekt auf den Stresslevel im Vergleich zu einer Kontrollgruppe, die keinen Sport macht?

  1. Hypothesen

    • \(H_0\) Sport hat keinen Effekt, \(\mu_{diff,sport} = \mu_{diff,con}\)
    • \(H_A\) Sport hat einen Effekt, \(\mu_{diff,sport} \neq \mu_{diff,con}\)
  2. Das Signifikanzniveau legen wir bei \(\alpha = .05\) fest.

  3. Die Daten sind unabhängig.

  4. Die Prüfgrösse ist \(\mu_{diff,sport} = \mu_{diff,con}\)

  5. Der Stichprobenumfang pro Gruppe ist n < 30, was für Man-Whitney-U-Test spricht. In diesem Fall ist es nicht mehr nötig QQ-Plots zu erstellen, wir machen es übungshalber trotzdem ;).

summary(control$Diff)

Min. 1st Qu. Median Mean 3rd Qu. Max. -8.000 0.500 7.000 7.364 15.000 20.000

summary(sport$Diff)

Min. 1st Qu. Median Mean 3rd Qu. Max. -15.000 -7.000 -4.000 -3.933 1.000 4.000

boxplot(prison$Diff ~ prison$Group)


  1. Die Verteilung der Daten in beiden Gruppen anhand von Boxplot und QQ-Plot ist auf Grund der geringen Datenmenge wenig zuverlässig zu interpretieren; es scheint aber nichts dagegen zu sprechen, dass die Daten aus einer normalverteilten Population stammen.
## QQ-Plot für Diff in der Controlgruppe
qqnorm(control$Diff)
qqline(control$Diff, col = "blue")

## QQ-Plot für Diff in der Controlgruppe
qqnorm(sport$Diff)
qqline(sport$Diff, col = "blue")

  • Die Prüfung der Testbedingungen legt nichtparametrische Verfahren zur statistischen Analyse nahe.


  1. Vertrauensintervalle für die Prüfgrösse und Teststatistik bestimmen
wilcox.test(Diff ~ Group, data = prison, alternative = "two.sided")
## Warning in wilcox.test.default(x = DATA[[1L]], y = DATA[[2L]], ...): kann bei
## Bindungen keinen exakten p-Wert Berechnen
## 
##  Wilcoxon rank sum test with continuity correction
## 
## data:  Diff by Group
## W = 138, p-value = 0.004218
## alternative hypothesis: true location shift is not equal to 0
t.test(Diff ~ Group, data = prison, alternative = "two.sided")
## 
##  Welch Two Sample t-test
## 
## data:  Diff by Group
## t = 3.5908, df = 15.461, p-value = 0.002565
## alternative hypothesis: true difference in means between group Control and group Sport is not equal to 0
## 95 percent confidence interval:
##   4.608668 17.985272
## sample estimates:
## mean in group Control   mean in group Sport 
##              7.363636             -3.933333


  1. Schlussfolgerung

Untersucht wurde der Effekt von Sport auf den Stresslevel bei Gefängnisinsassen, die in eine Sport- (n = 15) und eine Kontrollgruppe (n = 11) eingeteilt wurden. In der Kontrollgruppe hat der Stresslevel um 7.364 Punkte zugenommen und in der Sportgruppe um durchschnittlich -3.933 Punkte abgenommen. Im Durchschnitt vermindert sich der Stresslevel in der Sportgruppe um 11.297 [4.608, 17.985] Punkte im Vergleich zur Contorlgruppe. Die Daten liefern Evidenz dafür, dass sich Sport günstig auf den Stresslevel im Gefängnis auswirkt, Man-Whitney-U-Test W = 138, p = .0042.



LS0tDQp0aXRsZTogJ8OcYnVuZ2VuOiBNaXR0ZWx3ZXJ0c3ZlcmdsZWljaGUsIFRlaWwgMicNCmF1dGhvcjogIkx1a2FzIFN0YW1tbGVyIg0KZGF0ZTogImByIFN5cy5EYXRlKClgIg0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50Og0KICAgIGZpZ19oZWlnaHQ6IDYNCiAgICBmaWdfd2lkdGg6IDYNCiAgICBoaWdobGlnaHQ6IHB5Z21lbnRzDQogICAgdGhlbWU6IHlldGkNCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQogICAgY29kZV9mb2xkaW5nOiBoaWRlDQogICAgdG9jOiB0cnVlDQogICAgdG9jX2Zsb2F0OiB0cnVlDQotLS0NCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQpybShsaXN0ID0gbHMoKSkNCg0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFLCBtZXNzYWdlID0gRkFMU0UsIGZpZy5hbGlnbiA9ICJjZW50ZXIiKQ0KDQpsaWJyYXJ5KGtuaXRyKQ0KYGBgDQoNCg0KDQoNCiMgUHJheGlzdGlwcDogVm9yZ2VoZW4gYmVpIEh5cG90aGVzZW50ZXN0cyBmw7xyIHF1YW50aXRhdGl2ZSBEYXRlbg0KDQoxLiBIeXBvdGhlc2VuICRIXzAkIHVuZCAkSF9BJCBmb3JtdWxpZXJlbi4gU2luZCBkaWVzZSBlaW5zZWl0aWcgb2RlciB6d2Vpc2VpdGlnIGZvcm11bGllcnQ/ICANCjIuIFNpZ25pZmlrYW56bml2ZWF1IGZlc3RsZWdlbi4gRsO8ciBhbGxlIMOcYnVuZ2VuIHdpcmQgJFxhbHBoYSA8IDAuMDUkIGZlc3RnZWxlZ3QuDQozLiBTaW5kIGRpZSBEYXRlbiBnZXBhYXJ0IChwYWlyZWQpIG9kZXIgdW5hYmjDpG5naWcgKGluZGVwZW5kZW50KT8gDQo0LiBQcsO8Zmdyw7Zzc2UgYmVzdGltbWVuOiANCiAgICsgZsO8ciB1bmFiaMOkbmdpZ2UgRGF0ZW46ICRcbXVfMiAtIFxtdV8xJCAoRGlmZmVyZW56IGRlciBNaXR0ZWx3ZXJ0ZSkgICANCiAgICsgZsO8ciBnZXBhYXJ0ZSBEYXRlbjogJFxtdV97ZGlmZn0kIChNaXR0ZWx3ZXJ0IGRlciBwYWFyd2Vpc2VuIERpZmZlcmVuemVuKSANCiAgICsgd2VubiBTaWUgc2ljaCBmw7xyIG5pY2h0LXBhcmFtZXRyaXNjaGUgVGVzdHMgZW50c2NoZWlkZW4sIGVyc2V0emVuIHNpZSAkXG11JCBkdXJjaCAkTWQkIChNZWRpYW4pDQo1LiBTdGljaHByb2JlbnVtZmFuZyBwcsO8ZmVuICAgDQogICArICRuIDwgMzAkOiBuaWNocGFyYW1ldHJpc2NoZW4gVGVzdCAoV2lsY294b24pIHfDpGhsZW4gICAgDQogICArIHVudGVyc2NoaWVkbGljaGUgU3RpY2hwcm9iZW51bWbDpG5nZSBiZWkgdW5hYmjDpG5naWdlbiBEYXRlbjogbmljaHRwYXJhbWV0cmlzY2hlbiBUZXN0IChXaWxjb3hvbikgd8OkaGxlbiAgIA0KNi4gVmVydGVpbHVuZyBkZXIgUHLDvGZncsO2c3NlIHVudGVyc3VjaGVuICAgIA0KICAgKyBEYXRlbiBzaW5kIGFubsOkaGVybmQgbm9ybWFsdmVydGVpbHQ6IHQtVGVzdCB3w6RobGVuICAgIA0KICAgKyBEYXRlbiBzaW5kIG5pY2h0IG5vcm1hbHZlcnRlaWx0OiBuaWNodHBhcmFtZXRyaXNjaGVuIFRlc3QgKFdpbGNveG9uKSB3w6RobGVuICAgICANCiAgICsgVW50ZXJzY2hpZWRsaWNoZSBWYXJpYW56ZW4gYmVpIHVuYWJow6RuZ2lnZW4gRGF0ZW46IG5pY2h0cGFyYW1ldHJpc2NoZW4gVGVzdCAoV2lsY294b24pIHfDpGhsZW4uICAgIA0KNy4gVmVydHJhdWVuc2ludGVydmFsbGUgZsO8ciBkaWUgUHLDvGZncsO2c3NlIGJlcmVjaG5lbi4NCjguIEdld8OkaGx0ZW4gVGVzdCBkdXJjaGbDvGhyZW46IHQtIHVuZCBwLVdlcnQgYmVzdGltbWVuLiAgICANCjkuIFNjaGx1c3Nmb2xnZXJ1bmcgemllaGVuIHVuZCBkYXMgRXJnZWJuaXMgaW0gWnVzYW1tZW5oYW5nIG1pdCBkZXIgRm9yc2NodW5nc2ZyYWdlIGludGVycHJldGllcmVuLiAgICANCg0KPGJyPg0KDQojIMOcYnVuZyAxIHsudGFic2V0fQ0KDQpFaW5lIEthZmZlZWtldHRlIGJldHJlaWJ0IGVpbmUgRmlsaWFsZSBpbiBCYXNlbCB1bmQgZWluZSBGaWxpYWxlIGluIEJlcm4uIERpZSBCZXJuZXIgS29sbGVnaW5uZW4gZXJ6w6RobGVuLCBkYXNzIHNpZSBtZWhyIENhZmbDqCBMYXR0ZSAobWl0dGxlcmUgR3LDtnNzZSkgaW4gQmVybiBhbHMgaW4gQmFzZWwgZsO8ciBkYXMgZ2xlaWNoZSBHZWxkIGVyaGFsdGVuLiBTaWUga8O2bm5lbiBkYXMgbmljaHQgZ2xhdWJlbiB1bmQgd29sbGVuIGRlciBTYWNoZSBhdWYgZGVuIEdydW5kIGdlaGVuLiBJaHJlIEZyYWdlIGxhdXRldDogKlVudGVyc2NoZWlkZW4gc2ljaCBkaWUgS2FmZmVlbWVuZ2VuIGFuIGRlbiBTdGFuZG9ydGVuIEJhc2VsIHVuZCBCZXJuPyogICAgDQoNCkFscyBlcnN0ZXMgc2FtbWVsbiBTaWUgRGF0ZW46IFNpZSBrYXVmZW4gYW4gYmVpZGVuIFN0YW5kb3J0ZW4gMjAgQmVjaGVyIENhZmbDqCBMYXR0ZSBtaXR0bGVyZXIgR3LDtnNzZS4gU2llIG1lc3NlbiBqZXdlaWxzIGRpZSBNZW5nZW4gaW4gbWwuDQoNCkxhZGVuIFNpZSBkaWUgRGF0ZWkgYGNhZmZlLmNzdmAgIFtoaWVyXShodHRwczovL21vb2RsZS5iZmguY2gvbW9kL2ZvbGRlci92aWV3LnBocD9pZD0xNjkwNDMzKSBoZXJ1bnRlci4NCg0KDQpEZXIgRGF0ZW5zYXR6IHVtZmFzc3QgendlaSBWYXJpYWJsZW46ICAgICANCg0KVmFyaWFibGUgfCBCZXNjaHJlaWJ1bmcNCi0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tDQpPcnQgfCBPcnQgZGVyIERhdGVuZXJoZWJ1bmc6IEJlcm4sIEJhc2VsICAgIA0KTWVuZ2UgfCBLYWZmZWVtZW5nZSBpbiBtbCAgDQoNCg0KIyMgQXVmZ2FiZSAgDQoNCjEuIExhZGVuIFNpZSBkZW4gRGF0ZW5zYXR6IGhlcnVudGVyIHVuZCBpbXBvcnRpZXJlbiBTaWUgaWhuIGluIGBSYC4gICANCjIuIEZvcm11bGllcmVuIFNpZSBkaWUgTnVsbC0gdW5kIGRpZSBBbHRlcm5hdGl2aHlwb3RoZXNlLiAgIA0KMy4gQmVzY2hyZWliZW4gU2llIGRpZSBEYXRlbiBkZXNrcmlwdGl2LiBFcnN0ZWxsZW4gU2llIGVpbiBCb3hwbG90IGbDvHIgZGVuIFZlcmdsZWljaCBkZXIgS2FmZmVlbWVuZ2VuIGluIEJlcm4gdW5kIEJhc2VsLiAgIA0KNC4gV8OkaGxlbiBTaWUgZGVuIHJpY2h0aWdlbiBIeXBvdGhlc2VudGVzdCBhdXMuICANCjUuIEJlcmVjaG5lbiBTaWUgZGFzIDk1JS1Lb25maWRlbnppbnRlcnZhbGwgZsO8ciBkaWUgRGlmZmVyZW56IGRlciBLYWZmZWVtZW5nZSB6d2lzY2hlbiBCZXJuIHVuZCBCYXNlbC4NCjYuIEZvcm11bGllcmVuIFNpZSBpaHIgUmVzdWx0YXQgaW4gZWluIGJpcyB6d2VpIFPDpHR6ZW4uICANCg0KPGJyIC8+DQo8YnIgLz4NCg0KIyMgTMO2c3VuZyAgDQoNCjEuIExhZGVuIFNpZSBkZW4gRGF0ZW5zYXR6IGhlcnVudGVyIHVuZCBpbXBvcnRpZXJlbiBTaWUgaWhuIGBSYC4gDQoNCmBgYHtyfQ0KbGlicmFyeShyaW8pDQpjYWZmZSA8LSBpbXBvcnQoIi4uL2RhdGEvY2FmZmUuY3N2IikNCmNhZmZlDQpgYGANCg0KDQoyLiBGb3JtdWxpZXJlbiBTaWUgaWhyZSBIeXBvdGhlc2UuICAgDQoNCiogJEhfMCQgOiBEaWUgS2FmZmVlbWVuZ2VuIHZvbiBCZXJuIHVuZCBCYXNlbCB1bnRlcnNjaGVpZGVuIHNpY2ggbmljaHQuICRcbXVfe0Jhc2VsfSA9IFxtdV97QmVybn0kLiAgICANCiogJEhfQSQgOiBEaWUgS2FmZmVlbWVuZ2VuIHZvbiBCZXJuIHVuZCBCYXNlbCB1bnRlcnNjaGVpZGVuIHNpY2guICRcbXVfe0Jhc2VsfSBcbmVxIFxtdV97QmVybn0kLiANCg0KKkVybMOkdXRlcnVuZzogRGllIEZyYWdlc3RlbGx1bmcgaXN0IHp3ZWlzZWl0aWcgZm9ybXVsaWVydC4qDQoNCjxicj4NCg0KMy4gQmVzY2hyZWliZW4gU2llIGRpZSBEYXRlbiBkZXNrcmlwdGl2IHVuZCBlcnN0ZWxsZW4gU2llIGVpbiBCb3hwbG90IGbDvHIgZGVuIFZlcmdsZWljaCBkZXIgS2FmZmVlbWVuZ2VuIGluIEJlcm4gdW5kIEJhc2VsLiAgIA0KDQpgYGB7cn0NCiMgVGVpbGRhdGVuc8OkdHplIChTdWJzZXRzKSBlcnN0ZWxsZW4NCmJlcm4gPC0gc3Vic2V0KGNhZmZlLCBPcnQgPT0gIkJlcm4iKQ0KYmFzZWwgPC0gc3Vic2V0KGNhZmZlLCBPcnQgPT0gIkJhc2VsIikNCg0KIyBLZW5uemFobGVuIGJlcmVjaG5lbg0Kc3VtbWFyeShiZXJuKQ0Kc3VtbWFyeShiYXNlbCkNCg0KIyBCb3hwbG90IGVyc3RlbGxlbg0KYm94cGxvdChjYWZmZSRNZW5nZSB+IGNhZmZlJE9ydCkNCmBgYA0KDQpEaWUgZHVyY2hzY2huaXR0bGljaGUgS2FmZmVlbWVuZ2UgaW4gQmVybiBiZXRyw6RndCAzMTEuNyBtbCB1bmQgaW4gQmFzZWwgMzAxLjkgbWwuIEltIEJveHBsb3QgaXN0IHp1IHNlaGVuLCBkYXNzIGRpZSBWYXJpYXRpb25zYnJlaXRlIGluIEJlcm4gZ3LDtnNzZXIgaXN0LCBhbHMgaW4gQmFzZWwuDQoNCjxiciAvPg0KDQo0LiBXw6RobGVuIFNpZSBkZW4gcmljaHRpZ2VuIHQtVGVzdCBhdXMuIEVyc3RlbGxlbiBTaWUgYXVjaCBlaW5lIEdyYWZpayBmw7xyIGRlbiBWZXJnbGVpY2ggZGVyIDk1JS1WZXJ0cmF1ZW5zaW50ZXJ2YWxsZS4gIA0KDQoqIERlciBTdGljaHByb2JlbnVtZmFuZyBwcm8gR3J1cHBlIGlzdCBuID0gMjAuICANCiogV2lyIHByw7xmZW4gYXVmIE5vcm1hbHZlcnRlaWx1bmcgZGVyIERhdGVuIGluIGJlaWRlbiBHcnVwcGVuIG1pdCBlaW5lbSBRUS1QbG90OiAgDQoNCmBgYHtyfQ0KIyBRUS1QbG90IGbDvHIgQmVybg0KcXFub3JtKGJlcm4kTWVuZ2UpDQpxcWxpbmUoYmVybiRNZW5nZSkNCg0KIyBRUS1QbG90IGbDvHIgQmFzZWwNCnFxbm9ybShiYXNlbCRNZW5nZSkNCnFxbGluZShiYXNlbCRNZW5nZSkNCmBgYA0KDQoqIEludGVycHJldGF0aW9uIGRlciBRUS1QbG90czogRGllIHplbnRyYWxlbiBCZXJlaWNoZSBkZXIgRGF0ZW4gbGllZ2VuIHdlaXRnZWhlbmQgYXVmIGVpbmVyIExpbmllLiBXaXIgZMO8cmZlbiBzY2hsaWVzc2VuLCBkYXNzIGRpZSBEYXRlbiBhdXMgZWluZXIgbm9ybWFsdmVydGVpbHRlbiBQb3B1bGF0aW9uIHN0YW1tZW4uICAgDQoqIERpZSBEYXRlbiBzaW5kIHVuYWJow6RuZ2lnLiAgDQoqIFRlc3R3YWhsOiBEYSBuIDwgMzAsIHfDpGhsZW4gd2lyIGVpbiBuaWNodHBhcmFtZXRyaXNjaGVzIFZlcmZhaHJlbiwgZGVuICpNYW5uLVdoaXRuZXktVS1UZXN0IChXaWxjb3hvbiBSYW5nc3VtbWVuLVRlc3QpKi4gWnVtIFZlcmdsZWljaCBmw7xocmVuIHdpciBhYmVyIGF1Y2ggZWluZW4gKlp3ZWlzdGljaHByb2Jlbi10LVRlc3QgZsO8ciB1bmFiaMOkbmdpZ2UgRGF0ZW4qIGR1cmNoLiAgDQoNCg0KDQpgYGB7cn0NCndpbGNveC50ZXN0KGNhZmZlJE1lbmdlIH4gY2FmZmUkT3J0LCBhbHRlcm5hdGl2ZSA9ICJ0d28uc2lkZWQiLCBwYWlyZWQgPSBGQUxTRSkNCmBgYA0KDQpJbnRlcnByZXRhdGlvbiBkZXMgV2lsY294b24gUmFuZ3N1bW1lbnRlc3RzOiBEaWUgVGVzdHN0YXRpc3RpayAqKlcqKiBpbnRlcnByZXRpZXJlbiB3aXIgbmljaHQhIERpZSBXYWhyc2NoZWlubGljaGtlaXQsIGbDvHIgdW5zZXJlIFRlc3RzdGF0aXN0aWsgb2RlciBub2NoIGVpbmUgZXh0cmVtZXJlIFRlc3RzdGF0aXN0aWsgdW50ZXIgZGVyIE51bGxoeXBvdGhlc2UgYmV0csOkZ3QgNS4yNCUgKCoqcCA9IDAuMDUyNCoqKSAgDQoNCmBgYHtyfQ0KdC50ZXN0KGNhZmZlJE1lbmdlIH4gY2FmZmUkT3J0LCBhbHRlcm5hdGl2ZSA9ICJ0d28uc2lkZWQiLCBwYWlyZWQgPSBGQUxTRSkNCmBgYA0KDQpJbnRlcnByZXRhdGlvbiBkZXMgWndlaXN0aWNocHJvYmVuLXQtVGVzdHM6IERpZSBUZXN0c3RhdGlzdGlrICoqdCA9IC0xLjc5ODQqKiBpc3Qgd2VuaWdlciBleHRyZW0gYWxzIGRpZSAibWFnaXNjaGUgR3JlbnplIiB1bSAtLysgMiB1bmQgd2lyIGvDtm5uZW4gYmVyZWl0cyBqZXR6dCBhbm5laG1lbiwgZGFzcyB3aXIga2VpbmVuIHNpZ25pZmlrYW50ZW4gVW50ZXJzY2hpZWQgendpc2NoZW4gZGVuIEthZmZlZW1lbmdlbiBpbiBCYXNlbCB1bmQgaW4gQmVybiBoYWJlbi4gRGllIEFuemFobCBkZXIgRnJlaWhlaXRzZ3JhZGUgKipkZiA9IDI0LjEwMyoqIHdvbGxlbiB3aXIgYmVpbSBXZWxjaC1UZXN0LCBlaW5lciBWYXJpYW50ZSBkZXMgWndlaXN0aWNocHJvYmVuLXQtVGVzdHMgZsO8ciB1bmFiaMOkbmdpZ2UgRGF0ZW4sIG5pY2h0IGludGVycHJldGllcmVuLiBEaWUgV2FocnNjaGVpbmxpY2hrZWl0IGbDvHIgdW5zZXJlciBUZXN0c3RhdGlzdGlrICoqdCoqIG9kZXIgZWluZW4gbm9jaCBleHRyZW1lcmVuIFdlcnQgZsO8ciAqKnQqKiB1bnRlciBkZXIgTnVsbGh5cG90aGVzZSBiZXRyw6RndCA4LjQ2NSUgKCoqcCA9IDAuMDg0NjUqKikuICANCg0KPGJyIC8+DQoNCjUuIEJlcmVjaG5lbiBTaWUgZGFzIDk1JS1Lb25maWRlbnppbnRlcnZhbGwgZsO8ciBkaWUgRGlmZmVyZW56IGRlciBLYWZmZWVtZW5nZSB6d2lzY2hlbiBCZXJuIHVuZCBCYXNlbC4NCg0KKiBTaWUgZmluZGVuIGRhcyA5NSUtS29uZmlkZW56aW50ZXJ2YWxsIGbDvHIgZGllIERpZmZlcmVueiBkZXIgZHVyY2hzY2huaXR0bGljaGVuIEthZmZlZW1lbmdlbiBpbSBPdXRwdXQgZGVzIHQtVGVzdHMgdW50ZXIgKjk1IHBlcmNlbnQgY29uZmlkZW5jZSBpbnRlcnZhbDoqLiBEYXMgOTUlLUtvbmZpZGVuemludGVydmFsbCBmw7xyIGRpZSBkdXJjaHNjaG5pdHRsaWNoZSBEaWZmZXJlbnogZGVyIEthZmZlZW1lbmdlbiB6d2lzY2hlbiBCZXJuIHVuZCBCYXNlbCBsaWVndCBzb21pdCB6d2lzY2hlbiBbLTIxLjAwNSwgMS40NDJdIG1sLiBVbnRlciBkZXIgTnVsbGh5cG90aGVzZSBsaWVndCBkaWUgZHVyY2hzY2huaXR0bGljaGUgRGlmZmVyZW56IGJlaSBOdWxsLiBOdWxsIGlzdCBpbiBkaWVzZW0gS29uZmlkZW56aW50ZXJ2YWxsIGVudGhhbHRlbiB1bmQgc29taXQgZWluIHBsYXVzaWJsZXIgV2VydC4gRGFzIDk1JS1Lb25maWRlbnppbnRlcnZhbGwgYmVzdMOkdGlndCBkaWUgRXJnZWJuaXNzZSBkZXIgSHlwb3RoZXNlbnRlc3RzLg0KDQoNCjYuIEZvcm11bGllcmVuIFNpZSBpaHIgUmVzdWx0YXQgaW4gZWluIGJpcyB6d2VpIFPDpHR6ZW4uICAgDQoNCiogKkRpZSBkdXJjaHNjaG5pdHRsaWNoZW4gS2FmZmVlbWVuZ2VuIGluIEJlcm4gKDMxMS43IG1sKSB1bmQgaW4gQmFzZWwgKDMwMS45IG1sKSB1bnRlcnNjaGVpZGVuIHNpY2ggbmljaHQgc2lnbmlmaWthbnQgdm9uZWluYW5kZXIsIE1hbm4tV2hpdG5leS1VLVRlc3QgVyA9IDEyOCwgcCA9IDAuMDUyNC4gRGllIGR1cmNoc2Nobml0dGxpY2hlIERpZmZlcmVueiBkZXIgS2FmZmVlbWVuZ2VuIChCYXNlbCBtaW51cyBCZXJuKSBiZXRyw6RndCAtOS44IFtDSTk1OiAtMjEuMDA1LCAxLjQ0Ml0gbWwuKiAgDQoNCjxiciAvPg0KDQojIMOcYnVuZyAyIHsudGFic2V0fSAgDQoNCldlbGNoZXMgRXJnZWJuaXMgZXJ3YXJ0ZW4gU2llLCB3ZW5uIGRpZSBGcmFnZXN0ZWxsdW5nIGJlaSDDnGJ1bmcgMSBsYXV0ZW4gd8O8cmRlOiAqSXN0IGRpZSBkdXJjaHNjaG5pdHRsaWNoZSBLYWZmZWVtZW5nZSBpbiBCYXNlbCBnZXJpbmdlciBhbHMgaW4gQmVybj8qICANCg0KIyMgQXVmZ2FiZQ0KDQoxLiBGb3JtdWxpZXJlbiBTaWUgZGllIE51bGwtIHVuZCBkaWUgQWx0ZXJuYXRpdmh5cG90aGVzZS4gIA0KMi4gRsO8aHJlbiBTaWUgZWluZW4gSHlwb3RoZXNlbnRlc3QgZHVyY2guIA0KMy4gRmFzc2VuIFNpZSBkYXMgRXJnZWJuaXMgenVzYW1tZW4uDQoNCiMjIEzDtnN1bmcNCg0KMS4gRm9ybXVsaWVyZW4gU2llIGRpZSBOdWxsLSB1bmQgZGllIEFsdGVybmF0aXZoeXBvdGhlc2UuICANCg0KKiAkSF8wJCA6IERpZSBLYWZmZWVtZW5nZW4gdm9uIEJlcm4gdW5kIEJhc2VsIHVudGVyc2NoZWlkZW4gc2ljaCBuaWNodC4gJFxtdV97QmFzZWx9ID0gXG11X3tCZXJufSQuICAgIA0KKiAkSF9BJCA6IERpZSBLYWZmZWVtZW5nZSBpbiBCYXNlbCBpc3Qga2xlaW5lciBhbHMgaW4gQmVybi4gJFxtdV97QmFzZWx9IDwgXG11X3tCZXJufSQuIA0KDQoqRXJsw6R1dGVydW5nOiBEaWUgRnJhZ2VzdGVsbHVuZyBpc3QgZWluc2VpdGlnIGZvcm11bGllcnQuKg0KDQoNCjIuIEbDvGhyZW4gU2llIGVpbmVuIEh5cG90aGVzZW50ZXN0IGR1cmNoLiANCg0KYGBge3J9DQp3aWxjb3gudGVzdChjYWZmZSRNZW5nZSB+IGNhZmZlJE9ydCwgYWx0ZXJuYXRpdmUgPSAibGVzcyIsIHBhaXJlZCA9IEZBTFNFKQ0KYGBgDQoNCmBgYHtyfQ0KdC50ZXN0KGNhZmZlJE1lbmdlIH4gY2FmZmUkT3J0LCBhbHRlcm5hdGl2ZSA9ICJsZXNzIiwgcGFpcmVkID0gRkFMU0UpDQpgYGANCg0KDQozLiBWZXJnbGVpY2hlbiBTaWUgZGVuIHJlc3VsdGllcmVuZGVuIHAtV2VydCBtaXQgZGVtIHAtV2VydCBhdXMgw5xidW5nIDEuICANCg0KfFRlc3R8ZWluc2VpdGlnfHp3ZWlzZWl0aWd8DQp8LS0tLXwtLS0tLS0tLS18LS0tLS0tLS0tLXwNCnxXaWxjb3h8MC4wMjYyfDAuMDUyNHwNCnx0LVRlc3R8MC4wNDIzfDAuMDg0N3wNCg0KV2VubiB3aXIgZWluc2VpdGlnIHRlc3RlbiwgaXN0IGRlciBwLVdlcnQgaGFsYiBzbyBncm9zcyB3aWUgYmVpbSB6d2Vpc2VpdGlnZW4gVGVzdGVuLg0KDQoNCiMgw5xidW5nIDMgey50YWJzZXR9DQoNCkVpbiBHZWbDpG5nbmlzYXVmZW50aGFsdCBpc3QgbWl0IHBzeWNoaXNjaGVtIFN0cmVzcyB2ZXJidW5kZW4uIEVpbmUgTcO2Z2xpY2hrZWl0LCBkaWVzZW4gU3RyZXNzIGFienViYXVlbiBpc3Qgc3BvcnRsaWNoZSBCZXTDpHRpZ3VuZy4gRWluIFN0dWRpZSBoYXQgZGVuIFN0cmVzc2xldmVsIHZvbiAyNiBHZWbDpG5nbmlzc2luc2Fzc2VuIGJlaSBFaW4tIHVuZCBBdXN0cml0dCBtaXR0ZWxzIEZyYWdlYm9nZW4gdW50ZXJzdWNodCAoamUgaMO2aGVyIGRlciBTdHJlc3NsZXZlbCBkZXN0byBncsO2c3NlciBkZXIgU3RyZXNzKS4gRWluIFRlaWwgZGVyIEdlZmFuZ2VuZW4gZXJoaWVsdCBlaW4gc3BvcnRsaWNoZXMgVHJhaW5pbmcuICAgDQoNCkxhZGVuIFNpZSBkaWUgRGF0ZWkgYHByaXNvblN0cmVzcy5jc3ZgIFtoaWVyXShodHRwczovL21vb2RsZS5iZmguY2gvbW9kL2ZvbGRlci92aWV3LnBocD9pZD0xNjkwNDMzKSBoZXJ1bnRlci4gICANCg0KRGVyIERhdGVuc2F0eiB1bWZhc3N0IDUgVmFyaWFibGVuICAgIA0KDQpWYXJpYWJsZSB8IEJlc2NocmVpYnVuZw0KLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0NClN1YmplY3QgfCBhbm9ueW1lIElEDQpHcm91cCB8IEdydXBwZSBzcG9ydCBvZGVyIGNvbnRyb2wNClBTU2JlZm9yZSB8IFN0cmVzc2xldmVsIChBc3Nlc3NtZW50LVNjb3JlKSBiZWkgRWludHJpdHQNClBTU2FmdGVyIHwgU3RyZXNzbGV2ZWwgKEFzc2Vzc21lbnQtU2NvcmUpIGJlaSBBdXN0cml0dA0KRGlmZiB8IFBhYXJ3ZWlzZSBEaWZmZXJlbnplbiAoUFNTYWZ0ZXIgLSBQU1NiZWZvcmUpDQoNCiMjIEF1ZmdhYmUNCg0KMS4gTGFkZW4gU2llIGRlbiBEYXRlbnNhdHogaW4gYFJgIHVuZCBrYXRlZ29yaXNpZXJlbiBTaWUgZGllIFZhcmlhYmxlbi4gICAgDQoyLiBGcmFnZTogSGFiZW4gYmVpZGUgR3J1cHBlbiBiZWkgRWludHJpdHQgZGVuIGdsZWljaGVuIFN0cmVzc2xldmVsPyAgICANCjMuIEZyYWdlOiBIYWJlbiBiZWlkZSBHcnVwcGVuIGJlaSBBdXN0cml0dCBkZW4gZ2xlaWNoZW4gU3RyZXNzbGV2ZWw/ICAgICAgICANCjQuIEZyYWdlOiBCZXN0ZWh0IGVpbiBVbnRlcnNjaGllZCBpbSBTdHJlc3NsZXZlbCB6d2lzY2hlbiBFaW4tIHVuZCBBdXN0cml0dCBpbiBkZXIgS29udHJvbGxncnVwcGU/ICAgICAgDQo1LiBGcmFnZTogQmVzdGVodCBlaW4gVW50ZXJzY2hpZWQgaW0gU3RyZXNzbGV2ZWwgendpc2NoZW4gRWluLSB1bmQgQXVzdHJpdHQgaW4gZGVyIFNwb3J0Z3J1cHBlPyAgICANCjYuIEZyYWdlOiBIYXQgU3BvcnQgZWluZW4gRWZmZWt0IGF1ZiBkZW4gU3RyZXNzbGV2ZWwgaW0gVmVyZ2xlaWNoIHp1IGVpbmVyIEtvbnRyb2xsZ3J1cHBlLCBkaWUga2VpbmVuIFNwb3J0IG1hY2h0PyAgDQoNCkbDvGhyZW4gU2llIGbDvHIgYWxsZSBGcmFnZW4gc293b2hsIGVpbmVuIG5pY2h0cGFyYW1ldHJpc2NoZW4gKFdpbGNveG9uKSBhbHMgYXVjaCBlaW5lbiBwYXJhbWV0cmlzY2hlbiAodC1UZXN0KSBUZXN0IGR1cmNoLiAgDQoNCiMjIEzDtnN1bmcgMQ0KDQpgYGB7cn0NCnByaXNvbiA8LSBpbXBvcnQoIi4uL2RhdGEvcHJpc29uU3RyZXNzLmNzdiIpDQpzdHIocHJpc29uKQ0KDQojIERpZSBWYXJpYWJsZSBHcm91cCBpc3Qgbm9taW5hbCB1bmQgd2lyZCBhbHMgZmFjdG9yIGthdGVnb3Jpc2llcnQNCnByaXNvbiRHcm91cCA8LSBmYWN0b3IocHJpc29uJEdyb3VwKQ0Kc3RyKHByaXNvbikNCmBgYA0KDQojIyBMw7ZzdW5nIDINCg0KRnJhZ2VzdGVsbHVuZzogSGFiZW4gZGllIEdydXBwZW4gKlNwb3J0KiB1bmQgKkNvbnRyb2wqIGJlaSBFaW50cml0dCBkZW4gZ2xlaWNoZW4gU3RyZXNzbGV2ZWw/ICANCg0KMS4gSHlwb3RoZXNlbiAgICANCg0KICAgKyAkSF8wJCBFcyBiZXN0ZWh0IGtlaW4gVW50ZXJzY2hpZWQgaW0gU3RyZXNzbGV2ZWwgZGVyIEdydXBwZW4gU3BvcnQgdW5kIEtvbnRyb2xsZSBiZWkgRWludHJpdHQsICRcbXVfe2NvbixiZWZvcmV9ID0gXG11X3tzcG9ydCxiZWZvcmV9JCAgDQogICArICRIX0EkIEVzIGJlc3RlaHQgZWluIFVudGVyc2NoaWVkIGltIFN0cmVzc2xldmVsIGRlciBHcnVwcGVuIFNwb3J0IHVuZCBLb250cm9sbGUgYmVpIEVpbnRyaXR0LCAkXG11X3tjb24sYmVmb3JlfSBcbmVxIFxtdV97c3BvcnQsYmVmb3JlfSQgICAgDQogIA0KDQpgYGB7cn0NCiMgRGVza3JpcHRpdmUgU3RhdGlzdGlrIG5hY2ggU3Vic2V0cw0Kc3BvcnQgPC0gc3Vic2V0KHByaXNvbiwgR3JvdXAgPT0gIlNwb3J0IikNCmNvbnRyb2wgPC0gc3Vic2V0KHByaXNvbiwgR3JvdXAgPT0gIkNvbnRyb2wiKQ0KDQpzdW1tYXJ5KHNwb3J0JFBTU2JlZm9yZSkNCnN1bW1hcnkoY29udHJvbCRQU1NiZWZvcmUpDQoNCmJveHBsb3QocHJpc29uJFBTU2JlZm9yZSB+IHByaXNvbiRHcm91cCkNCmBgYA0KDQoyLiBEYXMgU2lnbmlmaWthbnpuaXZlYXUgbGVnZW4gd2lyIGJlaSAkXGFscGhhID0gMC4wNSQgZmVzdC4gIA0KMy4gRGllIERhdGVuIHNpbmQgdW5hYmjDpG5naWcgKHdpciB2ZXJnbGVpY2hlbiB6d2VpIHVudGVyc2NoaWVkbGljaGUgR3J1cHBlbikuICANCjQuIERpZSBQcsO8Zmdyw7Zzc2UgaXN0IGRpZSBEaWZmZXJlbnogZGVyIE1pdHRlbHdlcnRlIGRlciBiZWlkZW4gR3J1cHBlbiAkXG11X3tjb24sYmVmb3JlfSAtIFxtdV97c3BvcnQsYmVmb3JlfSQgICANCjUuIERlciBTdGljaHByb2JlbnVtZmFuZyBwcm8gR3J1cHBlIGlzdCBuIDwgMzAsIHdhcyBmw7xyIGRlbiBNYW4tV2hpdG5leS1VLVRlc3Qgc3ByaWNodC4gICANCjYuIERpZSBWZXJ0ZWlsdW5nIGRlciBQcsO8Zmdyw7Zzc2UgYW5oYW5kIGRlciBCb3ggaW0gQm94cGxvdCBlcmdpYnQgZWluZSBsZWljaHQgcmVjaHRzc3RlaWxlIFZlcnRlaWx1bmcgaW4gZGVyIEtvbnRyb2xsZ3J1cHBlIHVuZCBldHdhIE5vcm1hbHZlcnRlaWx1bmcgaW4gZGVyIFNwb3J0Z3J1cHBlLiBEaWUgUVEtUGxvdHMgc2luZCB3ZW5pZyBhdXNzYWdla3LDpGZ0aWcuIERpZSBTdHJldXVuZyBkZXIgRGF0ZW4gaXN0IHVudGVyc2NoaWVkbGljaC4gICANCg0KYGBge3J9DQojIFFRLVBsb3QgZsO8ciBTcG9ydGdydXBwZQ0KcXFub3JtKHNwb3J0JFBTU2JlZm9yZSkNCnFxbGluZShzcG9ydCRQU1NiZWZvcmUsIGNvbCA9ICJibHVlIikNCg0KIyBRUS1QbG90IGbDvHIgQ29udHJvbGdydXBwZQ0KcXFub3JtKGNvbnRyb2wkUFNTYmVmb3JlKQ0KcXFsaW5lKGNvbnRyb2wkUFNTYmVmb3JlLCBjb2wgPSAiYmx1ZSIpDQoNCmBgYA0KDQoqIERpZSBQcsO8ZnVuZyBkZXIgVGVzdGJlZGluZ3VuZ2VuIGxlZ3QgbmljaHRwYXJhbWV0cmlzY2hlIFZlcmZhaHJlbiB6dXIgc3RhdGlzdGlzY2hlbiBBbmFseXNlIG5haGUuICAgDQoNCjcuIFZlcnRyYXVlbnNpbnRlcnZhbGxlIGbDvHIgZGllIFByw7xmZ3LDtnNzZSB1bmQgVGVzdHN0YXRpc3RpayBiZXN0aW1tZW4gICANCg0KYGBge3J9DQp3aWxjb3gudGVzdChQU1NiZWZvcmUgfiBHcm91cCwgZGF0YSA9IHByaXNvbiwgYWx0ZXJuYXRpdmUgPSAidHdvLnNpZGVkIikNCmBgYA0KDQpJbnRlcnByZXRhdGlvbiBkZXMgV2lsY294b24gUmFuZ3N1bW1lbnRlc3RzICg9IE1hbm4tV2hpdG5leS1VLVRlc3QpOiBEaWUgV2FybnVuZyBrw7ZubmVuIFNpZSBpZ25vcmllcmVuIDspLiBEaWUgVGVzdHN0YXRpc3RpayAqKlcqKiBpbnRlcnByZXRpZXJlbiB3aXIgbmljaHQuIERpZSBXYWhyc2NoZWlubGljaGtlaXQgZsO8ciBkZW4gV2VydCBkZXIgVGVzdHN0YXRpc3RpayBvZGVyIGVpbmVuIG5vY2ggZXh0cmVtZXJlbiBXZXJ0IGJldHLDpGd0IDEyLjUlICgqKnAgPSAwLjEyNDkqKikuICANCg0KYGBge3J9DQp0LnRlc3QoUFNTYmVmb3JlIH4gR3JvdXAsIGRhdGEgPSBwcmlzb24sIGFsdGVybmF0aXZlID0gInR3by5zaWRlZCIpDQpgYGANCkludGVycHJldGF0aW9uIGRlcyBad2Vpc3RpY2hwcm9iZW4tdC1UZXN0czogRGllIFRlc3RzdGF0aXN0aWsgYmV0csOkZ3QgKip0ID0gLTIuMDA2NCoqLiBEaWVzZXIgV2VydCBsaWVndCBpbiBkZXIgTsOkaGUgZGVyICJtYWdpc2NoZW4gR3JlbnplIiB2b24gLTIuIEFsbGVyZGluZ3MgbGllZ2VuIGhpZXIga2xlaW5lIFN0aWNocHJvYmVudW1mw6RuZ2Ugdm9yLCB3b2R1cmNoIGRpZSBLdXJ2ZSBkZXIgdC1WZXJ0ZWlsdW5nIGFuIGRlbiBFbmRlbiBzZWhyIGZsYWNoIHZlcmzDpHVmdCB1bmQgZGVyIGtyaXRpc2NoZSBXZXJ0IGbDvHIgZGllIDIuNSUgR3JlbnplIHdlaXRlciBhbHMgLTIuMCBsaWVndC4gQW56YWhsIEZyZWloZWl0c2dyYWRlICoqZGYqKiBpbnRlcnByZXRpZXJlbiB3aXIgYmVpbSBXZWxjaC1UZXN0IG5pY2h0LiBEaWUgV2FocnNjaGVpbmxpY2hrZWl0IGbDvHIgZGVuIFdlcnQgZGVyIFRlc3RzdGF0aXN0aWsgdCBvZGVyIGVpbmVuIG5vY2ggZXh0cmVtZXJlbiBXZXJ0IHVudGVyIGRlciBOdWxsaHlwb3RoZXNlIGJldHLDpGd0IDYuMSUgKCoqcCA9IDAuMDYxMTIqKikuIERpZSBTcG9ydGdydXBwZSBoYXQgYmVpIEVpbnRyaXR0IGltIER1cmNoc2Nobml0dCBlaW5lbiBldHdhcyBow7ZoZXJlbiBTdHJlc3NsZXZlbCAoMjMuOSkgYWxzIGRpZSBDb250cm9sZ3J1cHBlICgxNi40KS4gRGllIGR1cmNoc2Nobml0dGxpY2hlIERpZmZlcmVueiBkZXMgU3RyZXNzbGV2ZWxzIHp3aXNjaGVuIGRlbiBiZWlkZW4gR3J1cHBlbiAoQ29udHJvbCBtaW51cyBTcG9ydCkgYmV0csOkZ3QgLTcuNTYwIFs5NSUtQ0k6IC0xNS41MzQsIDAuMzk1XS4gRGllc2VzIDk1JS1Lb25maWRlbnppbnRlcnZhbGwgc2NobGllc3N0IDAgZWluIHVuZCB1bnRlcnN0w7x0enQgZGllIEVyZ2Vibmlzc2UgYXVzIGRlbiBIeXBvdGhlc2VudGVzdHMuICpGw7xyIGRpZSBGb3JtdWxpZXJ1bmcgZGVzIFJlc3VsdGF0cyB2ZXJ3ZW5kZW4gd2lyIG51ciBkaWUgQW5nYWJlbiB6dW0gOTUlLUtvbmZpZGVuemludGVydmFsbCwgZGEgd2lyIHVucyBmw7xyIGRlbiBNYW5uLVdoaXRuZXktVS1UZXN0IGFscyBrb3JyZWt0ZW4gVGVzdCBlbnRzY2hpZWRlbiBoYWJlbiEqDQoNCjxiciAvPg0KDQo4LiBSZXN1bHRhdCwgU2NobHVzc2ZvbGdlcnVuZyAgICANCg0KKkRlciBTdHJlc3NsZXZlbCBiZWkgRWludHJpdHQgaW5zIEdlZsOkbmduaXMgaXN0IGluIGRlciBLb250cm9sbGdydXBwZSAobiA9IDExKSBpbSBEdXJjaHNjaG5pdHQgdW0gLTcuNTYwIFstMTUuNTM0LCAwLjM5NV0gUHVua3RlIHRpZWZlciBhbHMgaW4gZGVyIFNwb3J0Z3J1cHBlIChuID0gMTUpLiBFcyBsaWVndCBqZWRvY2gga2VpbmUgRXZpZGVueiBkYWbDvHIgdm9yLCBkYXNzIHNpY2ggZGllIGJlaWRlbiBHcnVwcGVuIGltIFN0cmVzc2xldmVsIGJlaSBFaW50cml0dCBpbnMgR2Vmw6RuZ25pcyBzaWduaWZpa2FudCB1bnRlcnNjaGVpZGVuLCBNYW4tV2hpdG5leS1VID0gNTIuNSwgcCA9IDAuMTI0OS4gKiAgICANCg0KPGJyIC8+DQoNCiMjIEzDtnN1bmcgMyAgDQoNCkZyYWdlc3RlbGx1bmc6IEhhYmVuIGJlaWRlIEdydXBwZW4gYmVpIEF1c3RyaXR0IGRlbiBnbGVpY2hlbiBTdHJlc3NsZXZlbD8gRGFzIGlzdCBkaWUgw6RobmxpY2hlIEZyYWdlc3RlbGx1bmcgd2llIEZyYWdlIDIuIFZlcnN1Y2hlbiBTaWUgZGllc2UgQXVmZ2FiZSBtw7ZnbGljaHN0IG9obmUgSGlsZnNtaXR0ZWwgenUgYmVhcmJlaXRlbi4gICAgDQoNCjEuIEh5cG90aGVzZW4gICAgDQoNCiAgICsgJEhfMCQgRXMgYmVzdGVodCBrZWluIFVudGVyc2NoaWVkIGltIFN0cmVzc2xldmVsIGRlciBHcnVwcGVuIFNwb3J0IHVuZCBLb250cm9sbGUgYmVpIEF1c3RyaXR0LCAkXG11X3tjb24sYWZ0ZXJ9ID0gXG11X3tzcG9ydCxhZnRlcn0kICANCiAgICsgJEhfQSQgRXMgYmVzdGVodCBlaW4gVW50ZXJzY2hpZWQgaW0gU3RyZXNzbGV2ZWwgZGVyIEdydXBwZW4gU3BvcnQgdW5kIEtvbnRyb2xsZSBiZWkgQXVzdHJpdHQsICRcbXVfe2NvbixhZnRlcn0gXG5lcSBcbXVfe3Nwb3J0LGFmdGVyfSQgICAgIA0KMi4gRGFzIFNpZ25pZmlrYW56bml2ZWF1IGxlZ2VuIHdpciBiZWkgJFxhbHBoYSA9IC4wNSQgZmVzdC4gIA0KMy4gRGllIERhdGVuIHNpbmQgdW5hYmjDpG5naWcuICAgDQo0LiBEaWUgUHLDvGZncsO2c3NlIGlzdCAkXG11X3tjb24sYWZ0ZXJ9IC0gXG11X3tzcG9ydCxhZnRlcn0kLiAgDQo1LiBEZXIgU3RpY2hwcm9iZW51bWZhbmcgcHJvIEdydXBwZSBpc3QgbiA8IDMwLCB3YXMgZsO8ciBNYW4tV2hpdG5leS1VLVRlc3Qgc3ByaWNodC4gICAgICAgICAgICAgICAgICAgIA0KDQpgYGB7cn0NCiMgRGllIFN1YnNldHMgc3BvcnQgdW5kIGNvbnRyb2wgaGFiZW4gd2lyIHNjaG9uIHVudGVyIEzDtnN1bmcgMSBnZW1hY2h0DQpzdW1tYXJ5KHNwb3J0JFBTU2FmdGVyKQ0Kc3VtbWFyeShjb250cm9sJFBTU2FmdGVyKQ0KDQpib3hwbG90KHByaXNvbiRQU1NhZnRlciB+IHByaXNvbiRHcm91cCkNCmBgYA0KDQo8YnIgLz4NCg0KNi4gRGllIFZlcnRlaWx1bmcgZGVyIFByw7xmZ3LDtnNzZSBhbmhhbmQgZGVyIEJveCBpbSBCb3hwbG90IGVyZ2lidCBlaW5lIGxlaWNodCByZWNodHNzdGVpbGUgVmVydGVpbHVuZyBpbiBiZWlkZW4gR3J1cHBlbi4gRGllIFFRLVBsb3RzIHNpbmQgd2VuaWcgYXVzc2FnZWtyw6RmdGlnLiBEaWUgU3RyZXV1bmcgZGVyIERhdGVuIGlzdCDDpGhubGljaC4gICAgDQoNCmBgYHtyfQ0KIyBRUS1QbG90IGbDvHIgU3BvcnRncnVwcGUNCnFxbm9ybShzcG9ydCRQU1NhZnRlcikNCnFxbGluZShzcG9ydCRQU1NhZnRlciwgY29sID0gImJsdWUiKQ0KDQojIFFRLVBsb3QgZsO8ciBDb250cm9sZ3J1cHBlDQpxcW5vcm0oY29udHJvbCRQU1NhZnRlcikNCnFxbGluZShjb250cm9sJFBTU2FmdGVyLCBjb2wgPSAiYmx1ZSIpDQoNCmBgYA0KDQoqIERpZSBQcsO8ZnVuZyBkZXIgVGVzdGJlZGluZ3VuZ2VuIChuIDwgMzAsIHJlY2h0c3N0ZWlsZSBWZXJ0ZWlsdW5nZW4pIGxlZ3QgbmljaHRwYXJhbWV0cmlzY2hlIFZlcmZhaHJlbiB6dXIgc3RhdGlzdGlzY2hlbiBBbmFseXNlIG5haGUuICAgDQo8YnIgLz4NCg0KNy4gVmVydHJhdWVuc2ludGVydmFsbGUgZsO8ciBkaWUgUHLDvGZncsO2c3NlIHVuZCBUZXN0c3RhdGlzdGlrIGJlc3RpbW1lbiAgIA0KDQoNCmBgYHtyfQ0Kd2lsY294LnRlc3QoUFNTYWZ0ZXIgfiBHcm91cCwgZGF0YSA9IHByaXNvbiwgYWx0ZXJuYXRpdmUgPSAidHdvLnNpZGVkIikNCnQudGVzdChQU1NhZnRlciB+IEdyb3VwLCBkYXRhID0gcHJpc29uLCBhbHRlcm5hdGl2ZSA9ICJ0d28uc2lkZWQiKQ0KYGBgDQoNCjguIFNjaGx1c3Nmb2xnZXJ1bmcgICAgDQoNCipEZXIgU3RyZXNzbGV2ZWwgYmVpIEF1c3RyaXR0IGF1cyBkZW0gR2Vmw6RuZ25pcyBpc3QgaW4gZGVyIEtvbnRyb2xsZ3J1cHBlIChuID0gMTEpIGltIER1cmNoc2Nobml0dCB1bSAzLjcyNyBbOTUlLUNJOiAtMi4wNjksIDkuNTIzXSBQdW5rdGUgaMO2aGVyIGFscyBpbiBkZXIgU3BvcnRncnVwcGUgKG4gPSAxNSkuIEVzIGxpZWd0IGtlaW5lIEV2aWRlbnogZGFmw7xyIHZvciwgZGFzcyBzaWNoIGRpZSBiZWlkZW4gR3J1cHBlbiBpbSBTdHJlc3NsZXZlbCBiZWkgQXVzdHJpdHQgYXVzIGRlbSBHZWbDpG5nbmlzIHNpZ25pZmlrYW50IHVudGVyc2NoZWlkZW4sIE1hbi1XaGl0bmV5LVUtVGVzdCBXID0gMTA4LjUsIHAgPSAwLjE4NS4qICANCg0KPGJyIC8+DQoNCiMjIEzDtnN1bmcgNA0KDQpGcmFnZXN0ZWxsdW5nOiBCZXN0ZWh0IGVpbiBVbnRlcnNjaGllZCBpbSBTdHJlc3NsZXZlbCB6d2lzY2hlbiBFaW4tIHVuZCBBdXN0cml0dCBpbiBkZXIgS29udHJvbGxncnVwcGU/ICAgDQoNCjxiciAvPg0KDQoNCjEuIEh5cG90aGVzZW4gICAgDQoNCiAgICsgJEhfMCQgRXMgYmVzdGVodCBrZWluIFVudGVyc2NoaWVkIGltIFN0cmVzc2xldmVsIGluIGRlciBLb250cm9sbGdydXBwZSB6d2lzY2hlbiBFaW4tIHVuZCBBdXN0cml0dCwgJFxtdV97Y29uLGRpZmZ9PTB9JCAoTWl0dGVsd2VydCBkZXIgcGFhcndlaXNlbiBEaWZmZXJlbnplbiEpICAgDQogICArICRIX0EkIEVzIGJlc3RlaHQgZWluIFVudGVyc2NoaWVkIGltIFN0cmVzc2xldmVsIGluIGRlciBLb250cm9sbGdydXBwZSBiZWkgRWludHJpdHQsICRcbXVfe2NvbixkaWZmfSBcbmVxIDAkJCAgICANCg0KMi4gRGFzIFNpZ25pZmlrYW56bml2ZWF1IGxlZ2VuIHdpciBiZWkgJFxhbHBoYSA9IC4wNSQgZmVzdC4gICAgDQozLiBEaWUgRGF0ZW4gc2luZCBnZXBhYXJ0ICgyIE1lc3N1bmdlbiBwcm8gUHJvYmFuZDppbikuICAgICAgDQo0LiBEaWUgUHLDvGZncsO2c3NlIGlzdCAkXG11X3tjb24sZGlmZn0kLiBEaWUgcGFhcndlaXNlbiBEaWZmZXJlbnplbiBzaW5kIGluIGRlciBWYXJpYWJsZW4gYHByaXNvbiREaWZmYCBiZXJlY2huZXQuIFdpciBhcmJlaXRlbiBoaWVyIG51ciBtaXQgZGVtIFN1YnNldCBgY29udHJvbGAuICANCjUuIERlciBTdGljaHByb2JlbnVtZmFuZyBpc3QgbiA9IDExLCB3YXMgZsO8ciBkZW4gV2lsY294b24tVm9yemVpY2hlbnJhbmctVGVzdCBzcHJpY2h0LiAqSGlud2VpczogQmVpIGdlcGFhcnRlbiBEYXRlbiBkYXJmIGVpbiBwYXJhbWV0cmlzY2hlciBUZXN0IGJlcmVpdHMgYmVpIGVpbmVtIFN0aWNocHJvYmVudW1mYW5nIHZvbiBuID0gMTIgb2RlciBtZWhyIGR1cmNoZ2Vmw7xocnQgd2VyZGVuLiogICAgICANCg0KYGBge3J9DQojIERhcyBzdWJzZXQgY29udHJvbCB3dXJkZSBiZXJlaXRzIGluIEzDtnN1bmcgMSBlcnN0ZWxsdA0Kc3VtbWFyeShjb250cm9sJERpZmYpDQoNCmJveHBsb3QoY29udHJvbCREaWZmKQ0KYGBgDQoNCjxiciAvPg0KDQo2LiBEaWUgVmVydGVpbHVuZyBkZXIgUHLDvGZncsO2c3NlIGBEaWZmYCBhbmhhbmQgdm9uIEJveHBsb3QgdW5kIFFRLVBsb3QgaXN0IGF1ZiBHcnVuZCBkZXIgZ2VyaW5nZW4gRGF0ZW5tZW5nZSB3ZW5pZyB6dXZlcmzDpHNzaWcgenUgaW50ZXJwcmV0aWVyZW47IGVzIHNjaGVpbnQgYWJlciBuaWNodHMgZGFnZWdlbiB6dSBzcHJlY2hlbiwgZGFzcyBkaWUgRGF0ZW4gYXVzIGVpbmVyIG5vcm1hbHZlcnRlaWx0ZW4gUG9wdWxhdGlvbiBzdGFtbWVuLiAgIA0KDQpgYGB7ciwgcmVzdWx0cz0nYXNpcyd9DQojIyBRUS1QbG90IGbDvHIgRGlmZiBpbiBkZXIgR3J1cHBlIENvbnRyb2wNCnFxbm9ybShjb250cm9sJERpZmYpDQpxcWxpbmUoY29udHJvbCREaWZmLCBjb2wgPSAiYmx1ZSIpDQpgYGANCg0KKiBEaWUgUHLDvGZ1bmcgZGVyIFRlc3RiZWRpbmd1bmdlbiAobiA8IDEyKSBsZWd0IG5pY2h0cGFyYW1ldHJpc2NoZSBWZXJmYWhyZW4genVyIHN0YXRpc3Rpc2NoZW4gQW5hbHlzZSBuYWhlLiBXaXIgZsO8aHJlbiBhYmVyIGF1Y2ggZGVuIHQtVGVzdCBmw7xyIGdlcGFhcnRlIERhdGVuIGR1cmNoLCB1bSBkYXMgOTUlLUtvbmZpZGVuemludGVydmFsbCB6dSBiZXJlY2huZW4uICANCg0KPGJyIC8+DQoNCjcuIFZlcnRyYXVlbnNpbnRlcnZhbGxlIGbDvHIgZGllIFByw7xmZ3LDtnNzZSB1bmQgVGVzdHN0YXRpc3RpayBiZXN0aW1tZW4gICANCiAgDQogICANCmBgYHtyfQ0Kd2lsY294LnRlc3QoY29udHJvbCRQU1NhZnRlciwgY29udHJvbCRQU1NiZWZvcmUsIA0KICAgICAgICAgICAgcGFpcmVkID0gVFJVRSwgYWx0ZXJuYXRpdmUgPSAidHdvLnNpZGVkIikNCmBgYA0KDQoNCmBgYHtyLCBldmFsPUZBTFNFfQ0KdC50ZXN0KGNvbnRyb2wkUFNTYWZ0ZXIsIGNvbnRyb2wkUFNTYmVmb3JlLCANCiAgICAgICBwYWlyZWQgPSBUUlVFLCBhbHRlcm5hdGl2ZSA9ICJ0d28uc2lkZWQiKQ0KYGBgDQoNCjxiciAvPg0KDQo4LiBTY2hsdXNzZm9sZ2VydW5nICAgIA0KDQoqRGVyIFN0cmVzc2xldmVsIGJlaSBBdXN0cml0dCBhdXMgZGVtIEdlZsOkbmduaXMgaXN0IGluIGRlciBLb250cm9sbGdydXBwZSAobiA9IDExKSBpbSBEdXJjaHNjaG5pdHQgdW0gNy42MzQgWzk1JS1DSTogMS4xNjEsIDEzLjU2N10gUHVua3RlIGjDtmhlciBhbHMgYmVpbSBFaW50cml0dC4gRXMgbGllZ3QgRXZpZGVueiBkYWbDvHIgdm9yLCBkYXNzIHNpY2ggZGVyIGR1cmNoc2Nobml0dGxpY2hlIFN0cmVzc2xldmVsIGluIGRlciBLb250cm9sbGdydXBwZSBiZWltIEF1ZmVudGhhbHQgaW0gR2Vmw6RuZ25pcyBzaWduaWZpa2FudCBlcmjDtmh0IGhhdCwgV2lsY294b24gVm9yemVpY2hlbnJhbmctVGVzdCBWID0gNDcuNSwgcCA9IDAuMDQ3LiogIA0KDQo8YnIgLz4NCjxiciAvPg0KDQojIyBMw7ZzdW5nIDUNCg0KRnJhZ2VzdGVsbHVuZzogQmVzdGVodCBlaW4gVW50ZXJzY2hpZWQgaW0gU3RyZXNzbGV2ZWwgendpc2NoZW4gRWluLSB1bmQgQXVzdHJpdHQgaW4gZGVyIFNwb3J0Z3J1cHBlPyBEYXMgaXN0IGRpZSDDpGhubGljaGUgRnJhZ2VzdGVsbHVuZyB3aWUgRnJhZ2UgNC4gVmVyc3VjaGVuIFNpZSBkaWVzZSBBdWZnYWJlIG3DtmdsaWNoc3Qgb2huZSBIaWxmc21pdHRlbCB6dSBiZWFyYmVpdGVuLiAgDQoNCjxiciAvPg0KDQoxLiBIeXBvdGhlc2VuICAgDQoNCiAgICsgJEhfMCQgRXMgYmVzdGVodCBrZWluIFVudGVyc2NoaWVkIGltIFN0cmVzc2xldmVsIGluIGRlciBTcG9ydGdydXBwZSB6d2lzY2hlbiBFaW4tIHVuZCBBdXN0cml0dCwgJFxtdV97c3BvcnQsZGlmZn09MH0kIChNaXR0ZWx3ZXJ0IGRlciBwYWFyd2Vpc2VuIERpZmZlcmVuemVuISkNCiAgICsgJEhfQSQgRXMgYmVzdGVodCBlaW4gVW50ZXJzY2hpZWQgaW0gU3RyZXNzbGV2ZWwgaW4gZGVyIEtvbnRyb2xsZ3J1cHBlIGJlaSBFaW50cml0dCwgJFxtdV97c3BvcnQsZGlmZn0gXG5lcSAwJCQgICANCg0KMi4gRGFzIFNpZ25pZmlrYW56bml2ZWF1IGxlZ2VuIHdpciBiZWkgJFxhbHBoYSA9IC4wNSQgZmVzdC4gIA0KMy4gRGllIERhdGVuIHNpbmQgZ2VwYWFydCAoMiBNZXNzdW5nZW4gcHJvIFByb2JhbmQpICAgDQo0LiBEaWUgUHLDvGZncsO2c3NlIGlzdCAkXG11X3tzcG9ydCxkaWZmfSQgICAgDQo1LiBEZXIgU3RpY2hwcm9iZW51bWZhbmcgaW4gZGVyIFNwb3J0Z3J1cHBlIGlzdCBuID0gMTUuIEJlaSBnZXBhYXJ0ZW4gRGF0ZW4gZGFyZiBlaW4gcGFyYW1ldHJpc2NoZXIgVGVzdCBiZXJlaXRzIGJlaSBlaW5lbSBTdGljaHByb2JlbnVtZmFuZyB2b24gbiA9IDEyIG9kZXIgbWVociBkdXJjaGdlZsO8aHJ0IHdlcmRlbi4gIA0KDQpgYGB7cn0NCiMgRGFzIHN1YnNldCBzcG9ydCB3dXJkZSBiZXJlaXRzIGluIEzDtnN1bmcgMSBlcnN0ZWxsdA0Kc3VtbWFyeShzcG9ydCREaWZmKQ0KDQpib3hwbG90KHNwb3J0JERpZmYpDQpgYGANCg0KPGJyIC8+DQoNCjYuIERpZSBWZXJ0ZWlsdW5nIGRlciBQcsO8Zmdyw7Zzc2UgYERpZmZgIGFuaGFuZCB2b24gQm94cGxvdCB1bmQgUVEtUGxvdCBpc3QgYXVmIEdydW5kIGRlciBnZXJpbmdlbiBEYXRlbm1lbmdlIHdlbmlnIHp1dmVybMOkc3NpZyB6dSBpbnRlcnByZXRpZXJlbjsgZXMgc2NoZWludCBhYmVyIG5pY2h0cyBkYWdlZ2VuIHp1IHNwcmVjaGVuLCBkYXNzIGRpZSBEYXRlbiBhdXMgZWluZXIgbm9ybWFsdmVydGVpbHRlbiBQb3B1bGF0aW9uIHN0YW1tZW4uICAgDQoNCmBgYHtyLCByZXN1bHRzPSdhc2lzJ30NCiMgUVEtUGxvdCBmw7xyIERpZmYgaW4gZGVyIFNwb3J0Z3J1cHBlDQpxcW5vcm0oc3BvcnQkRGlmZikNCnFxbGluZShzcG9ydCREaWZmLCBjb2wgPSAiYmx1ZSIpDQpgYGANCg0KKiBEaWUgUHLDvGZ1bmcgZGVyIFRlc3RiZWRpbmd1bmdlbiBsZWd0IGVpbiBwYXJhbWV0cmlzY2hlcyBWZXJmYWhyZW4genVyIHN0YXRpc3Rpc2NoZW4gQW5hbHlzZSBuYWhlLiAgIA0KDQo8YnIgLz4NCg0KNy4gVmVydHJhdWVuc2ludGVydmFsbGUgZsO8ciBkaWUgUHLDvGZncsO2c3NlIHVuZCBUZXN0c3RhdGlzdGlrIGJlc3RpbW1lbiAgDQoNCiAgIA0KYGBge3IsIHJlc3VsdHM9J2FzaXMnfQ0KdC50ZXN0KHNwb3J0JFBTU2FmdGVyLCBzcG9ydCRQU1NiZWZvcmUsIA0KICAgICAgIHBhaXJlZCA9IFRSVUUsIGFsdGVybmF0aXZlID0gInR3by5zaWRlZCIpDQpgYGANCg0KPGJyIC8+DQoNCjguIFNjaGx1c3Nmb2xnZXJ1bmcgICAgDQoNCipEZXIgU3RyZXNzbGV2ZWwgYmVpIEF1c3RyaXR0IGF1cyBkZW0gR2Vmw6RuZ25pcyBpc3QgaW4gZGVyIFNwb3J0Z3J1cHBlIChuID0gMTUpIGltIER1cmNoc2Nobml0dCAgdW0gLTMuOTMzIFs5NSUtQ0k6IC03LjA3NiwgLTAuNzkwXSBQdW5rdGUgdGllZmVyIGFscyBiZWltIEVpbnRyaXR0LiBFcyBsaWVndCBFdmlkZW56IGRhZsO8ciB2b3IsIGRhc3Mgc2ljaCBkZXIgU3RyZXNzbGV2ZWwgYmVpbSBBdWZlbnRoYWx0IGltIEdlZsOkbmduaXMgaW4gZGVyIFNwb3J0Z3J1cHBlIHNpZ25pZmlrYW50IHNlbmt0LCB0ID0gLTIuNjg0LCBkZiA9IDE0LCBwID0gMC4wMTc4LiogIA0KDQoqKkhpbndlaXM6KiogQmVpIGRlbiDDnGJ1bmdlbiA0IHVuZCA1IGvDtm5uZW4gU2llIGRpZSBUZXN0cyBhdWNoIGFscyBFaW5zdGljaHByb2Jlbi1UZXN0IGbDvHIgZGllIGRpZSBwYWFyd2Vpc2VuIERpZmZlcmVuemVuIGBEaWZmYCB1bmQgZGVuIE51bGx3ZXJ0IDAgZHVyY2hmw7xocmVuLiBEYXMgRXJnZWJuaXMgaXN0IGlkZW50aXNjaC4NCg0KYGBge3J9DQp0LnRlc3Qoc3BvcnQkRGlmZiwgbXUgPSAwLCBhbHRlcm5hdGl2ZSA9ICJ0d28uc2lkZWQiKQ0KYGBgDQoNCjxiciAvPg0KPGJyIC8+DQoNCiMjIEzDtnN1bmcgNg0KDQpGcmFnZXN0ZWxsdW5nOiBIYXQgU3BvcnQgZWluZW4gRWZmZWt0IGF1ZiBkZW4gU3RyZXNzbGV2ZWwgaW0gVmVyZ2xlaWNoIHp1IGVpbmVyIEtvbnRyb2xsZ3J1cHBlLCBkaWUga2VpbmVuIFNwb3J0IG1hY2h0PyAgIA0KDQoxLiBIeXBvdGhlc2VuICAgIA0KDQogICArICRIXzAkIFNwb3J0IGhhdCBrZWluZW4gRWZmZWt0LCAkXG11X3tkaWZmLHNwb3J0fSA9IFxtdV97ZGlmZixjb259JCAgIA0KICAgKyAkSF9BJCBTcG9ydCBoYXQgZWluZW4gRWZmZWt0LCAkXG11X3tkaWZmLHNwb3J0fSBcbmVxIFxtdV97ZGlmZixjb259JCAgIA0KDQoyLiBEYXMgU2lnbmlmaWthbnpuaXZlYXUgbGVnZW4gd2lyIGJlaSAkXGFscGhhID0gLjA1JCBmZXN0LiAgICANCg0KMy4gRGllIERhdGVuIHNpbmQgdW5hYmjDpG5naWcuICAgDQoNCjQuIERpZSBQcsO8Zmdyw7Zzc2UgaXN0ICRcbXVfe2RpZmYsc3BvcnR9ID0gXG11X3tkaWZmLGNvbn0kICAgIA0KDQo1LiBEZXIgU3RpY2hwcm9iZW51bWZhbmcgcHJvIEdydXBwZSBpc3QgbiA8IDMwLCB3YXMgZsO8ciBNYW4tV2hpdG5leS1VLVRlc3Qgc3ByaWNodC4gSW4gZGllc2VtIEZhbGwgaXN0IGVzIG5pY2h0IG1laHIgbsO2dGlnIFFRLVBsb3RzIHp1IGVyc3RlbGxlbiwgd2lyIG1hY2hlbiBlcyDDvGJ1bmdzaGFsYmVyIHRyb3R6ZGVtIDspLiAgICAgICANCg0KYGBge3IsIHJlc3VsdHM9J2FzaXMnfQ0Kc3VtbWFyeShjb250cm9sJERpZmYpDQpzdW1tYXJ5KHNwb3J0JERpZmYpDQoNCmJveHBsb3QocHJpc29uJERpZmYgfiBwcmlzb24kR3JvdXApDQpgYGANCg0KPGJyIC8+DQoNCjYuIERpZSBWZXJ0ZWlsdW5nIGRlciBEYXRlbiBpbiBiZWlkZW4gR3J1cHBlbiBhbmhhbmQgdm9uIEJveHBsb3QgdW5kIFFRLVBsb3QgaXN0IGF1ZiBHcnVuZCBkZXIgZ2VyaW5nZW4gRGF0ZW5tZW5nZSB3ZW5pZyB6dXZlcmzDpHNzaWcgenUgaW50ZXJwcmV0aWVyZW47IGVzIHNjaGVpbnQgYWJlciBuaWNodHMgZGFnZWdlbiB6dSBzcHJlY2hlbiwgZGFzcyBkaWUgRGF0ZW4gYXVzIGVpbmVyIG5vcm1hbHZlcnRlaWx0ZW4gUG9wdWxhdGlvbiBzdGFtbWVuLiAgIA0KDQpgYGB7ciwgcmVzdWx0cz0nYXNpcyd9DQojIyBRUS1QbG90IGbDvHIgRGlmZiBpbiBkZXIgQ29udHJvbGdydXBwZQ0KcXFub3JtKGNvbnRyb2wkRGlmZikNCnFxbGluZShjb250cm9sJERpZmYsIGNvbCA9ICJibHVlIikNCg0KIyMgUVEtUGxvdCBmw7xyIERpZmYgaW4gZGVyIENvbnRyb2xncnVwcGUNCnFxbm9ybShzcG9ydCREaWZmKQ0KcXFsaW5lKHNwb3J0JERpZmYsIGNvbCA9ICJibHVlIikNCmBgYA0KDQoqIERpZSBQcsO8ZnVuZyBkZXIgVGVzdGJlZGluZ3VuZ2VuIGxlZ3QgbmljaHRwYXJhbWV0cmlzY2hlIFZlcmZhaHJlbiB6dXIgc3RhdGlzdGlzY2hlbiBBbmFseXNlIG5haGUuICAgDQoNCjxiciAvPg0KDQo3LiBWZXJ0cmF1ZW5zaW50ZXJ2YWxsZSBmw7xyIGRpZSBQcsO8Zmdyw7Zzc2UgdW5kIFRlc3RzdGF0aXN0aWsgYmVzdGltbWVuICAgDQogIA0KYGBge3J9DQp3aWxjb3gudGVzdChEaWZmIH4gR3JvdXAsIGRhdGEgPSBwcmlzb24sIGFsdGVybmF0aXZlID0gInR3by5zaWRlZCIpDQp0LnRlc3QoRGlmZiB+IEdyb3VwLCBkYXRhID0gcHJpc29uLCBhbHRlcm5hdGl2ZSA9ICJ0d28uc2lkZWQiKQ0KYGBgDQoNCjxiciAvPg0KDQo4LiBTY2hsdXNzZm9sZ2VydW5nICAgIA0KDQoqVW50ZXJzdWNodCB3dXJkZSBkZXIgRWZmZWt0IHZvbiBTcG9ydCBhdWYgZGVuIFN0cmVzc2xldmVsIGJlaSBHZWbDpG5nbmlzaW5zYXNzZW4sIGRpZSBpbiBlaW5lIFNwb3J0LSAobiA9IDE1KSB1bmQgZWluZSBLb250cm9sbGdydXBwZSAobiA9IDExKSBlaW5nZXRlaWx0IHd1cmRlbi4gSW4gZGVyIEtvbnRyb2xsZ3J1cHBlIGhhdCBkZXIgU3RyZXNzbGV2ZWwgdW0gNy4zNjQgUHVua3RlIHp1Z2Vub21tZW4gdW5kIGluIGRlciBTcG9ydGdydXBwZSB1bSBkdXJjaHNjaG5pdHRsaWNoIC0zLjkzMyBQdW5rdGUgYWJnZW5vbW1lbi4gSW0gRHVyY2hzY2huaXR0IHZlcm1pbmRlcnQgc2ljaCBkZXIgU3RyZXNzbGV2ZWwgaW4gZGVyIFNwb3J0Z3J1cHBlIHVtIDExLjI5NyBbNC42MDgsIDE3Ljk4NV0gUHVua3RlIGltIFZlcmdsZWljaCB6dXIgQ29udG9ybGdydXBwZS4gRGllIERhdGVuIGxpZWZlcm4gRXZpZGVueiBkYWbDvHIsIGRhc3Mgc2ljaCBTcG9ydCBnw7xuc3RpZyBhdWYgZGVuIFN0cmVzc2xldmVsIGltIEdlZsOkbmduaXMgYXVzd2lya3QsIE1hbi1XaGl0bmV5LVUtVGVzdCBXID0gMTM4LCBwID0gLjAwNDIuKiANCg0KPGJyIC8+DQo8YnIgLz4NCg0K