1 Case study: oksel microbiome

  • Okselgeur wordt niet veroorzaakt door zweet zelf. De geur wordt veroorzaakt door specifieke micro-organismen die behoren tot de groep van Corynebacterium spp. die zweet metaboliseren. Een andere groep van bacteriën zijn de Staphylococcus spp., deze bacteriën metaboliseren zweet niet in stinkende metabolieten.

  • De CMET-groep aan de UGent doet onderzoek naar het transplanteren van het okselmicrobioom om mensen met stinkende oksels te redden.

  • Voorgestelde therapie:

    1. Verwijder oksel-microbioom met antibiotica
    2. Beïnvloed okselmicrobioom met microbiële transplantatie (https://youtu.be/9RIFyqLXdVw)

1.1 Experiment:

  • de personen worden at random verdeeld over twee behandelingsgroepen:

    • placebo (enkel antibiotica)
    • transplantie (antibiotica en microbiële transplantatie).
    • Zes weken na de behandeling worden stalen genomen.
    • De relatieve abundantie van Staphylococcus spp. op Corynebacterium spp. + Staphylococcus spp. In het microbioom wordt gemeten via DGGE (Denaturing Gradient Gel Electrophoresis).

1.2 Importeer de data

ap<-read_csv("https://raw.githubusercontent.com/GTPB/PSLS20/master/data/armpit.csv")
ap
# A tibble: 20 x 2
   trt          rel
   <chr>      <dbl>
 1 placebo     55.0
 2 placebo     31.8
 3 placebo     41.1
 4 placebo     59.5
 5 placebo     63.6
 6 placebo     41.5
 7 placebo     30.4
 8 placebo     43.0
 9 placebo     41.7
10 placebo     33.9
11 transplant  57.2
12 transplant  72.5
13 transplant  61.9
14 transplant  56.7
15 transplant  76  
16 transplant  71.7
17 transplant  57.8
18 transplant  65.1
19 transplant  67.5
20 transplant  77.6

1.3 Data exploratie

We plotten de relatieve abundanties in functie van de behandelde groep.

ap %>%  
  ggplot(aes(x=trt,y=rel)) +
  geom_boxplot(outlier.shape=NA) + geom_point(position="jitter")

ap %>% ggplot(aes(sample=rel)) +
  geom_qq() +
  geom_qq_line() +
  facet_wrap(~trt)


2 Two-sample t-test

2.1 Notatie

Stel dat \(Y_{ij}\) de response is voor subjecten \(i=1,\ldots, n_j\) van de populatie \(j=1,2\).

Gebruik van de term behandeling of groep in plaats van populatie

Hier is de behandeling \(j=1\) microbiële transplantatie versus j=2$ placebo.

We nemen aan dat

\[Y_{ij}\text{ i.i.d. } N(\mu_j,\sigma^2)\;\;\;i=1,\ldots,n_i\;j=1,2.\]

Merk op dat we gelijke varianties aannemen, dit wordt homoscedastisch genoemd.

(Ongelijke varianties worden heteroscedastisch genoemd)


2.2 Hypotheses

Test \[ H_0: \mu_1 = \mu_2 \] tegen \[ H_1: \mu_1 \neq \mu_2 .\]

\(H_1\) is opnieuw de onderzoekshypothese: de gemiddelde relatieve abundantie van Staphylococcus spp. is anders bij microbiële transplantatie dan bij placebobehandeling

\(H_0\) en \(H_1\) kunnen ook worden gespecificeerd in termen van de effectgrootte tussen de twee behandelingen, \(\mu_1-\mu_2\) \[H_0: \mu_1-\mu_2 = 0,\] \[H_1: \mu_1-\mu_2 \neq 0.\]

We kunnen de effectgrootte schatten met behulp van het verschil in steekproefgemiddelden: \[\hat \mu_1-\hat \mu_2=\bar Y_1 -\bar Y_2.\]


2.3 Variantie schatter

De experimentele eenheden zijn onafhankelijk, dus de steekproefgemiddelden zijn ook onafhankelijk en de variantie op het verschil is \[\text{Var}_{\bar Y_1 -\bar Y_2}=\frac{\sigma^2}{n_1}+\frac{\sigma^2}{n_2}=\sigma^2 \left(\frac{1}{n_1}+\frac{1}{n_2}\right).\]

en de standaard error wordt: \[\sigma_{\bar Y_1 -\bar Y_2}=\sigma\sqrt{\frac{1}{n_1}+\frac{1}{n_2}}.\]

De variantie kan binnen elke groep geschat worden met behulp van de steekproefvariantie:

\[S_1^2 = \frac{1}{n_1-1}\sum_{i=1}^{n_1} (Y_{i1}-\bar{Y}_1)^2.\]

\[S_2^2 = \frac{1}{n_2-1}\sum_{i=1}^{n_2} (Y_{i2}-\bar{Y}_2)^2.\]

Maar als we gelijke varianties \(\sigma_1^2=\sigma_2^2=\sigma^2\) aannemen, dan kunnen we de variantie nauwkeuriger schatten door alle waarnemingen in beide groepen te gebruiken. Deze variantieschatter wordt ook wel de gepoolde variantie schatter: \(S^2_p\) genoemd.

Dus \(S_1^2\) en \(S_2^2\) zijn schatters van dezelfde parameter \(\sigma^2\).

En we kunnen ze combineren tot één schatter op basis van alle \(n_1+n_2\) observaties:

\[ S_p^2 = \frac{n_1-1}{n_1+n_2-2} S_1^2 + \frac{n_2-1}{n_1+n_2-2} S_2^2 = \frac{1}{n_1+n_2-2}\sum_{j=1}^2\sum_{i=1}^{n_j} (Y_{ij} - \bar{Y}_j)^2.\]

\[ S_p^2= \sum\limits_{j=1}^2\sum\limits_{i=1}^{n_j} \frac{(Y_{ij}-\bar{Y}_{.j})^2}{n_1+n_2-2}\]

De gepoolde variantieschatter gebruikt de kwadratische afwijkingen van de observaties van hun groepsgemiddelde en heeft \(n_1+n_2-2\) vrijheidsgraden.


2.4 Test statistiek

Two-sample \(t\)-teststatistiek:

\[T = \frac{\bar{Y}_1-\bar{Y}_2}{\sqrt{\frac{S_p^2}{n_1}+\frac{S_p^2}{n_2}}} = \frac{\bar{Y}_1 - \bar{Y}_2}{S_p\sqrt{\frac{1}{n_1}+\frac{1}{n_2}}}.\]

De statistiek T volgt een t-verdeling met \(n_1+n_2-2\). Onder \(H_0\) zijn alle gegevens onafhankelijk, normaal verdeeld en hebben gelijke varianties.


2.5 Oksel voorbeeld

We kunnen de test implementeren in R:

t.test(rel~trt,data=ap,var.equal=TRUE)

    Two Sample t-test

data:  rel by trt
t = -5.0334, df = 18, p-value = 8.638e-05
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -31.53191 -12.96072
sample estimates:
   mean in group placebo mean in group transplant 
                44.15496                 66.40127 

Op het \(5\%\) significantieniveau verwerpen we de nulhypothese ten gunste van de alternatieve hypothese en concluderen we dat de relatieve abundantie van Staphylococcus spp. gemiddeld extreem significant groter is in de transplantatiegroep dan in de placebogroep.

Als er geen effect is van de transplantatie, hebben we een kans van minder dan 9 op \(100000\) om een teststatistiek te observeren in een willekeurige steekproef die minstens zo extreem is als wat we in de okselmicrobioom studie hebben waargenomen.

Dit is uiterst zeldzaam onder \(H_0\).

Indien \(H_1\) correct is, verwachten we dat de teststatistiek groter is in absolute waarde en verwachten we kleine p-waarden. Daarom besluiten we dat er veel bewijs is tegen \(H_0\) in het voordeel van \(H_1\).

Goede statistische praktijk is om de \(p\)-waarde te rapporteren, maar ook de effectgrootte samen met het betrouwbaarheidsinterval. Zodat we de statistische significantie en de biologische relevantie kunnen beoordelen.

2.5.1 Conclusie

Gemiddeld is de relatieve abundantie van Staphylococcus spp. in het microbioom van de oksel in de transplantatiegroep zeer significant verschillend van die in de placebogroep (\(p<<0.001\)). De relatieve abundantie van Staphylococcus spp. is gemiddeld 22.2% groter in de transplantatiegroep dan in de placebo groep (95% CI [13.0,31.5]%).


3 Aannames

De geldigheid van de t-toets hangt af van de assumpties over de verdeling:

  • Onafhankelijkheid (design)
  • One-sample t-test: normaliteit van de waarnemingen
  • Gepaarde t-test: normaliteit van het verschil
  • Two-sample t-test: Normaliteit van de waarnemingen in beide groepen, en gelijke varianties.

Als niet aan de aannames wordt voldaan, volgt de nulverdeling geen t-verdeling en zijn de p-waarden en kritische waarden onjuist.

Om betrouwbaarheidsintervallen te construeren, vertrouwen we ook op deze aannames.

  • We hebben kwantielen uit de t-verdeling gebruikt om de onder- en bovengrens te berekenen.

  • De correcte coverage van het CI hangt af van deze assumpties.


3.1 Evalueer normaliteit

  • Boxplots en histogrammen: vorm van de verdeling en outliers

  • QQ-plots

Er bestaan ook hypothesetests (goodness-of-fit-test), maar hun nulhypothese is dat de gegevens normaal verdeeld zijn, dus we trekken een zwakke conclusie!

  • Kolmogorov-Smirnov, Shapiro-Wilk en Anderson-Darling.
  • In kleine monsters hebben ze een lage power
  • In grote steekproeven signaleren ze vaak zeer kleine afwijkingen als significant

Aanbeveling

  • Begin met grafische verkenning van de gegevens en houd rekening met de steekproefomvang om overinterpretatie van de plots te voorkomen.

  • Indien je twijfelt, gebruik dan simulatie waarbij u gegevens simuleert met dezelfde steekproefomvang uit een normale verdeling met hetzelfde gemiddelde en dezelfde variantie als degene die u in de steekproef hebt waargenomen

  • Als u afwijkingen van normaliteit hebt waargenomen, controleer dan in de literatuur hoe gevoelig uw methode is voor dergelijke afwijkingen van normaliteit. (Zo zijn T-tests bijvoorbeeld nogal ongevoelig voor afwijkingen, zolang de verdeling van de gegevens maar symmetrisch is.)

  • In grote steekproeven kun je terugvallen op de centrale limietstelling.

  • Het is een mogelijkheid om de response te transformeren.


3.2 Homoscedasticiteit

  • Boxplots: de boxgrootte is het interkwartielbereik (IQR), een robuste schatter van de variantie.

  • Als de verschillen niet groot zijn \(\rightarrow\) homoscedasticiteit

  • Ook hier kun je simulatie gebruiken om inzicht te krijgen in de verschillen die je kunt verwachten.

  • Formele F-toets kan worden gebruikt om de varianties te vergelijken, maar onder de nul ga je hier ook uit van gelijke varianties, dus hier geldt dezelfde kritiek als voor normaliteitstesten.


3.3 Welch modified t-test

Als de gegevens heteroscedastisch zijn, kunt u een Welch two-sample T-test gebruiken, die niet langer de gepoolde variantie-schatter gebruikt.

\[T = \frac{\bar{Y}_1 - \bar{Y}_2}{\sqrt{\frac{S^2_1}{n_1}+\frac{S^2_2}{n_2}}}\] met \(S^2_1\) en \(S^2_2\) de steekproefvarianties in beide groepen.

Deze statistiek volgt ongeveer een t-verdeling met een aantal vrijheidsgraden tussen \(\text{min}(n_1-1,n_2-1)\) en \(n_1+n_2-2\).

In R the degrees of freedom are estimated using the Welch- Satterthwaite approximation. In R worden de vrijheidsgraden geschat met behulp van de Welch-Satterthwaite benadering. U kunt dit doen door de functie t.test te gebruiken met het argument var.equal = FALSE.

t.test(rel~trt,data=ap,var.equal=FALSE)

    Welch Two Sample t-test

data:  rel by trt
t = -5.0334, df = 15.892, p-value = 0.0001249
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -31.62100 -12.87163
sample estimates:
   mean in group placebo mean in group transplant 
                44.15496                 66.40127 

Merk op dat de Welch T-test in de titel is overgenomen. De aangepaste vrijheidsgraden zijn \(df = 17.876\) \(\pm\) in vergelijking met de conventionele t-test, omdat de varianties ongeveer gelijk zijn.


4 Hoe rapporteren?

  • In de wetenschappelijke literatuur is er teveel aandacht voor p-waarden

  • Het is veel informatiever om een schatting te combineren met zijn betrouwbaarheidsinterval.

Rule of thumb:

Rapporteer een schatting samen met het betrouwbaarheidsinterval (en de p-waarde)

  1. Het resultaat van de test kan worden afgeleid uit het betrouwbaarheidsinterval
  2. Het staat de lezer toe om de wetenschappelijke relevatie te beoordelen.
t.test(rel~trt,data=ap)

    Welch Two Sample t-test

data:  rel by trt
t = -5.0334, df = 15.892, p-value = 0.0001249
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -31.62100 -12.87163
sample estimates:
   mean in group placebo mean in group transplant 
                44.15496                 66.40127 

Het resultaat van een \(\alpha\)-level t-test komt overeen met het vergelijken van de effectgrootte onder \(H_0\) met het \(1-\alpha\) CI.

Een effect kan statistisch zeer significant zijn, maar wetenschappelijk irrelevant. Met een CI zie je dit.


LS0tCnRpdGxlOiAiNS4gU3RhdGlzdGljYWwgSW5mZXJlbmNlOiBUd28tc2FtcGxlIHQtdGVzdCIgICAKYXV0aG9yOiAiTGlldmVuIENsZW1lbnQiCmRhdGU6ICJzdGF0T21pY3MsIEdoZW50IFVuaXZlcnNpdHkgKGh0dHBzOi8vc3RhdG9taWNzLmdpdGh1Yi5pbykiCm91dHB1dDoKICAgIGh0bWxfZG9jdW1lbnQ6CiAgICAgIGNvZGVfZG93bmxvYWQ6IHRydWUgICAgCiAgICAgIHRoZW1lOiBjb3NtbwogICAgICB0b2M6IHRydWUKICAgICAgdG9jX2Zsb2F0OiB0cnVlCiAgICAgIGhpZ2hsaWdodDogdGFuZ28KICAgICAgbnVtYmVyX3NlY3Rpb25zOiB0cnVlCi0tLQoKYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9CmtuaXRyOjpvcHRzX2NodW5rJHNldChpbmNsdWRlID0gVFJVRSwgY29tbWVudCA9IE5BLCBlY2hvID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFKQpsaWJyYXJ5KHRpZHl2ZXJzZSkKYGBgCgojIENhc2Ugc3R1ZHk6IG9rc2VsIG1pY3JvYmlvbWUKCi0gT2tzZWxnZXVyIHdvcmR0IG5pZXQgdmVyb29yemFha3QgZG9vciB6d2VldCB6ZWxmLiBEZSBnZXVyIHdvcmR0IHZlcm9vcnphYWt0IGRvb3Igc3BlY2lmaWVrZSBtaWNyby1vcmdhbmlzbWVuIGRpZSBiZWhvcmVuIHRvdCBkZSBncm9lcCB2YW4gKkNvcnluZWJhY3Rlcml1bSBzcHAuKiBkaWUgendlZXQgbWV0YWJvbGlzZXJlbi4KRWVuIGFuZGVyZSBncm9lcCB2YW4gYmFjdGVyacOrbiB6aWpuIGRlICpTdGFwaHlsb2NvY2N1cyBzcHAuKiwgZGV6ZSBiYWN0ZXJpw6tuIG1ldGFib2xpc2VyZW4gendlZXQgbmlldCBpbiBzdGlua2VuZGUgbWV0YWJvbGlldGVuLgoKLSBEZSBDTUVULWdyb2VwIGFhbiBkZSBVR2VudCBkb2V0IG9uZGVyem9layBuYWFyIGhldCB0cmFuc3BsYW50ZXJlbiB2YW4gaGV0IG9rc2VsbWljcm9iaW9vbSBvbSBtZW5zZW4gbWV0IHN0aW5rZW5kZSBva3NlbHMgdGUgcmVkZGVuLgoKLSBWb29yZ2VzdGVsZGUgdGhlcmFwaWU6CiAgCTEuIFZlcndpamRlciBva3NlbC1taWNyb2Jpb29tIG1ldCBhbnRpYmlvdGljYQogICAgMi4gQmXDr252bG9lZCBva3NlbG1pY3JvYmlvb20gbWV0IG1pY3JvYmnDq2xlIHRyYW5zcGxhbnRhdGllICAoaHR0cHM6Ly95b3V0dS5iZS85UklGeXFMWGRWdykKCiMjIEV4cGVyaW1lbnQ6CgotIGRlIHBlcnNvbmVuIHdvcmRlbiBhdCByYW5kb20gdmVyZGVlbGQgb3ZlciB0d2VlIGJlaGFuZGVsaW5nc2dyb2VwZW46CgogICAgLSBwbGFjZWJvIChlbmtlbCBhbnRpYmlvdGljYSkKICAgIC0gdHJhbnNwbGFudGllIChhbnRpYmlvdGljYSBlbiBtaWNyb2Jpw6tsZSB0cmFuc3BsYW50YXRpZSkuCiAgICAtIFplcyB3ZWtlbiBuYSBkZSBiZWhhbmRlbGluZyB3b3JkZW4gc3RhbGVuIGdlbm9tZW4uCiAgICAtIERlIHJlbGF0aWV2ZSBhYnVuZGFudGllIHZhbiAqU3RhcGh5bG9jb2NjdXMgc3BwLiogb3AgKkNvcnluZWJhY3Rlcml1bSBzcHAuKiArICpTdGFwaHlsb2NvY2N1cyBzcHAuKiBJbiBoZXQgbWljcm9iaW9vbSB3b3JkdCBnZW1ldGVuIHZpYSBER0dFICgqRGVuYXR1cmluZyBHcmFkaWVudCBHZWwgRWxlY3Ryb3Bob3Jlc2lzKikuCgotLS0KCiMjIEltcG9ydGVlciBkZSBkYXRhCgpgYGB7cn0KYXA8LXJlYWRfY3N2KCJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vR1RQQi9QU0xTMjAvbWFzdGVyL2RhdGEvYXJtcGl0LmNzdiIpCmFwCmBgYAoKIyMgRGF0YSBleHBsb3JhdGllCgpXZSBwbG90dGVuIGRlIHJlbGF0aWV2ZSBhYnVuZGFudGllcyBpbiBmdW5jdGllIHZhbiBkZSBiZWhhbmRlbGRlIGdyb2VwLgoKYGBge3J9CmFwICU+JSAgCiAgZ2dwbG90KGFlcyh4PXRydCx5PXJlbCkpICsKICBnZW9tX2JveHBsb3Qob3V0bGllci5zaGFwZT1OQSkgKyBnZW9tX3BvaW50KHBvc2l0aW9uPSJqaXR0ZXIiKQoKYXAgJT4lIGdncGxvdChhZXMoc2FtcGxlPXJlbCkpICsKICBnZW9tX3FxKCkgKwogIGdlb21fcXFfbGluZSgpICsKICBmYWNldF93cmFwKH50cnQpCmBgYAoKLS0tCgojIFR3by1zYW1wbGUgdC10ZXN0CiMjIE5vdGF0aWUKClN0ZWwgZGF0ICRZX3tpan0kIGRlIHJlc3BvbnNlIGlzIHZvb3Igc3ViamVjdGVuICRpPTEsXGxkb3RzLCBuX2okIHZhbiBkZSBwb3B1bGF0aWUgJGo9MSwyJC4KCkdlYnJ1aWsgdmFuIGRlIHRlcm0gKipiZWhhbmRlbGluZyoqIG9mICoqZ3JvZXAqKiBpbiBwbGFhdHMgdmFuIHBvcHVsYXRpZQoKSGllciBpcyBkZSBiZWhhbmRlbGluZyAkaj0xJCBtaWNyb2Jpw6tsZSB0cmFuc3BsYW50YXRpZSB2ZXJzdXMgaj0yJCBwbGFjZWJvLgoKV2UgbmVtZW4gYWFuIGRhdAoKJCRZX3tpan1cdGV4dHsgaS5pLmQuIH0gTihcbXVfaixcc2lnbWFeMilcO1w7XDtpPTEsXGxkb3RzLG5faVw7aj0xLDIuJCQKCk1lcmsgb3AgZGF0IHdlIGdlbGlqa2UgdmFyaWFudGllcyBhYW5uZW1lbiwgZGl0IHdvcmR0ICoqaG9tb3NjZWRhc3Rpc2NoKiogZ2Vub2VtZC4KCihPbmdlbGlqa2UgdmFyaWFudGllcyB3b3JkZW4gICoqaGV0ZXJvc2NlZGFzdGlzY2gqKiBnZW5vZW1kKQoKLS0tCgojIyBIeXBvdGhlc2VzCgpUZXN0ICQkIEhfMDogXG11XzEgPSBcbXVfMiAkJAp0ZWdlbgokJCAgSF8xOiBcbXVfMSBcbmVxIFxtdV8yIC4kJAoKJEhfMSQgaXMgb3BuaWV1dyBkZSBvbmRlcnpvZWtzaHlwb3RoZXNlOiBkZSBnZW1pZGRlbGRlIHJlbGF0aWV2ZSBhYnVuZGFudGllIHZhbiAqU3RhcGh5bG9jb2NjdXMgc3BwLiogaXMgYW5kZXJzIGJpaiBtaWNyb2Jpw6tsZSB0cmFuc3BsYW50YXRpZSBkYW4gYmlqIHBsYWNlYm9iZWhhbmRlbGluZwoKJEhfMCQgZW4gJEhfMSQga3VubmVuIG9vayB3b3JkZW4gZ2VzcGVjaWZpY2VlcmQgaW4gdGVybWVuIHZhbiBkZSBlZmZlY3Rncm9vdHRlIHR1c3NlbiBkZSB0d2VlIGJlaGFuZGVsaW5nZW4sICRcbXVfMS1cbXVfMiQKJCRIXzA6IFxtdV8xLVxtdV8yID0gMCwkJAokJEhfMTogXG11XzEtXG11XzIgXG5lcSAwLiQkCgpXZSBrdW5uZW4gZGUgZWZmZWN0Z3Jvb3R0ZSBzY2hhdHRlbiBtZXQgYmVodWxwIHZhbiBoZXQgdmVyc2NoaWwgaW4gc3RlZWtwcm9lZmdlbWlkZGVsZGVuOgokJFxoYXQgXG11XzEtXGhhdCBcbXVfMj1cYmFyIFlfMSAtXGJhciBZXzIuJCQKCi0tLQoKIyMgVmFyaWFudGllIHNjaGF0dGVyCgpEZSBleHBlcmltZW50ZWxlIGVlbmhlZGVuIHppam4gb25hZmhhbmtlbGlqaywgZHVzIGRlIHN0ZWVrcHJvZWZnZW1pZGRlbGRlbiB6aWpuIG9vayBvbmFmaGFua2VsaWprIGVuIGRlIHZhcmlhbnRpZSBvcCBoZXQgdmVyc2NoaWwgaXMKJCRcdGV4dHtWYXJ9X3tcYmFyIFlfMSAtXGJhciBZXzJ9PVxmcmFje1xzaWdtYV4yfXtuXzF9K1xmcmFje1xzaWdtYV4yfXtuXzJ9PVxzaWdtYV4yIFxsZWZ0KFxmcmFjezF9e25fMX0rXGZyYWN7MX17bl8yfVxyaWdodCkuJCQKCmVuIGRlIHN0YW5kYWFyZCBlcnJvciB3b3JkdDoKJCRcc2lnbWFfe1xiYXIgWV8xIC1cYmFyIFlfMn09XHNpZ21hXHNxcnR7XGZyYWN7MX17bl8xfStcZnJhY3sxfXtuXzJ9fS4kJAoKRGUgdmFyaWFudGllIGthbiBiaW5uZW4gZWxrZSBncm9lcCBnZXNjaGF0IHdvcmRlbiBtZXQgYmVodWxwIHZhbiBkZSBzdGVla3Byb2VmdmFyaWFudGllOgoKJCRTXzFeMiA9IFxmcmFjezF9e25fMS0xfVxzdW1fe2k9MX1ee25fMX0gKFlfe2kxfS1cYmFye1l9XzEpXjIuJCQKCiQkU18yXjIgPSBcZnJhY3sxfXtuXzItMX1cc3VtX3tpPTF9XntuXzJ9IChZX3tpMn0tXGJhcntZfV8yKV4yLiQkCgpNYWFyIGFscyB3ZSBnZWxpamtlIHZhcmlhbnRpZXMgJFxzaWdtYV8xXjI9XHNpZ21hXzJeMj1cc2lnbWFeMiQgYWFubmVtZW4sIGRhbiBrdW5uZW4gd2UgZGUgdmFyaWFudGllIG5hdXdrZXVyaWdlciBzY2hhdHRlbiBkb29yIGFsbGUgd2Fhcm5lbWluZ2VuIGluIGJlaWRlIGdyb2VwZW4gdGUgZ2VicnVpa2VuLiBEZXplIHZhcmlhbnRpZXNjaGF0dGVyIHdvcmR0IG9vayB3ZWwgZGUgKmdlcG9vbGRlIHZhcmlhbnRpZSBzY2hhdHRlcjogJFNeMl9wJCogZ2Vub2VtZC4KCkR1cyAkU18xXjIkIGVuICRTXzJeMiQgemlqbiBzY2hhdHRlcnMgdmFuIGRlemVsZmRlIHBhcmFtZXRlciAkXHNpZ21hXjIkLgoKRW4gd2Uga3VubmVuIHplIGNvbWJpbmVyZW4gdG90IMOpw6luIHNjaGF0dGVyIG9wIGJhc2lzIHZhbiBhbGxlICRuXzErbl8yJCBvYnNlcnZhdGllczoKCiQkICBTX3BeMiA9IFxmcmFje25fMS0xfXtuXzErbl8yLTJ9IFNfMV4yICsgXGZyYWN7bl8yLTF9e25fMStuXzItMn0gU18yXjIgPSBcZnJhY3sxfXtuXzErbl8yLTJ9XHN1bV97aj0xfV4yXHN1bV97aT0xfV57bl9qfSAoWV97aWp9IC0gXGJhcntZfV9qKV4yLiQkCgokJCBTX3BeMj0gXHN1bVxsaW1pdHNfe2o9MX1eMlxzdW1cbGltaXRzX3tpPTF9XntuX2p9IFxmcmFjeyhZX3tpan0tXGJhcntZfV97Lmp9KV4yfXtuXzErbl8yLTJ9JCQKCgpEZSBnZXBvb2xkZSB2YXJpYW50aWVzY2hhdHRlciBnZWJydWlrdCBkZSBrd2FkcmF0aXNjaGUgYWZ3aWpraW5nZW4gdmFuIGRlIG9ic2VydmF0aWVzIHZhbiBodW4gZ3JvZXBzZ2VtaWRkZWxkZSBlbiBoZWVmdCAkbl8xK25fMi0yJCB2cmlqaGVpZHNncmFkZW4uCgotLS0KCiMjIFRlc3Qgc3RhdGlzdGllawpUd28tc2FtcGxlICR0JC10ZXN0c3RhdGlzdGllazoKCiQkVCA9IFxmcmFje1xiYXJ7WX1fMS1cYmFye1l9XzJ9e1xzcXJ0e1xmcmFje1NfcF4yfXtuXzF9K1xmcmFje1NfcF4yfXtuXzJ9fX0gPQogIFxmcmFje1xiYXJ7WX1fMSAtIFxiYXJ7WX1fMn17U19wXHNxcnR7XGZyYWN7MX17bl8xfStcZnJhY3sxfXtuXzJ9fX0uJCQKCkRlIHN0YXRpc3RpZWsgVCB2b2xndCBlZW4gdC12ZXJkZWxpbmcgbWV0ICRuXzErbl8yLTIkLiBPbmRlciAkSF8wJCB6aWpuIGFsbGUgZ2VnZXZlbnMgb25hZmhhbmtlbGlqaywgbm9ybWFhbCB2ZXJkZWVsZCBlbiBoZWJiZW4gZ2VsaWprZSB2YXJpYW50aWVzLgoKLS0tCgojIyBPa3NlbCB2b29yYmVlbGQKCgpXZSBrdW5uZW4gZGUgdGVzdCBpbXBsZW1lbnRlcmVuIGluIFI6CgpgYGB7cn0KdC50ZXN0KHJlbH50cnQsZGF0YT1hcCx2YXIuZXF1YWw9VFJVRSkKYGBgCgpPcCBoZXQgJDVcJSQgc2lnbmlmaWNhbnRpZW5pdmVhdSB2ZXJ3ZXJwZW4gd2UgZGUgbnVsaHlwb3RoZXNlIHRlbiBndW5zdGUgdmFuIGRlIGFsdGVybmF0aWV2ZSBoeXBvdGhlc2UgZW4gY29uY2x1ZGVyZW4gd2UgZGF0IGRlIHJlbGF0aWV2ZSBhYnVuZGFudGllIHZhbiAgKlN0YXBoeWxvY29jY3VzIHNwcC4qIGdlbWlkZGVsZCBleHRyZWVtIHNpZ25pZmljYW50IGdyb3RlciBpcyBpbiBkZSB0cmFuc3BsYW50YXRpZWdyb2VwIGRhbiBpbiBkZSBwbGFjZWJvZ3JvZXAuCgpBbHMgZXIgZ2VlbiBlZmZlY3QgaXMgdmFuIGRlIHRyYW5zcGxhbnRhdGllLCBoZWJiZW4gd2UgZWVuIGthbnMgdmFuIG1pbmRlciBkYW4gOSBvcCAkMTAwMDAwJCBvbSBlZW4gdGVzdHN0YXRpc3RpZWsgdGUgb2JzZXJ2ZXJlbiBpbiBlZW4gd2lsbGVrZXVyaWdlIHN0ZWVrcHJvZWYgZGllIG1pbnN0ZW5zIHpvIGV4dHJlZW0gaXMgYWxzIHdhdCB3ZSBpbiBkZSBva3NlbG1pY3JvYmlvb20gc3R1ZGllIGhlYmJlbiB3YWFyZ2Vub21lbi4KCkRpdCBpcyB1aXRlcnN0IHplbGR6YWFtIG9uZGVyICRIXzAkLgoKSW5kaWVuICRIXzEkIGNvcnJlY3QgaXMsIHZlcndhY2h0ZW4gd2UgZGF0IGRlIHRlc3RzdGF0aXN0aWVrIGdyb3RlciBpcyBpbiBhYnNvbHV0ZSB3YWFyZGUgZW4gdmVyd2FjaHRlbiB3ZSBrbGVpbmUgcC13YWFyZGVuLiBEYWFyb20gYmVzbHVpdGVuIHdlIGRhdCBlciB2ZWVsIGJld2lqcyBpcyB0ZWdlbiAkSF8wJCBpbiBoZXQgdm9vcmRlZWwgdmFuICRIXzEkLiAgCgoqKkdvZWRlIHN0YXRpc3Rpc2NoZSBwcmFrdGlqayoqIGlzIG9tIGRlICRwJC13YWFyZGUgdGUgcmFwcG9ydGVyZW4sIG1hYXIgb29rIGRlIGVmZmVjdGdyb290dGUgc2FtZW4gbWV0IGhldCBiZXRyb3V3YmFhcmhlaWRzaW50ZXJ2YWwuIFpvZGF0IHdlIGRlIHN0YXRpc3Rpc2NoZSBzaWduaWZpY2FudGllIGVuIGRlIGJpb2xvZ2lzY2hlIHJlbGV2YW50aWUga3VubmVuIGJlb29yZGVsZW4uCgojIyMgQ29uY2x1c2llCgpHZW1pZGRlbGQgaXMgZGUgcmVsYXRpZXZlIGFidW5kYW50aWUgdmFuICpTdGFwaHlsb2NvY2N1cyBzcHAuKiBpbiBoZXQgbWljcm9iaW9vbSB2YW4gZGUgb2tzZWwgaW4gZGUgdHJhbnNwbGFudGF0aWVncm9lcCB6ZWVyIHNpZ25pZmljYW50IHZlcnNjaGlsbGVuZCB2YW4gZGllIGluIGRlIHBsYWNlYm9ncm9lcCAoJHA8PDAuMDAxJCkuIERlIHJlbGF0aWV2ZSBhYnVuZGFudGllIHZhbiAqU3RhcGh5bG9jb2NjdXMgc3BwLiogaXMgZ2VtaWRkZWxkICBgciByb3VuZChkaWZmKHQudGVzdChyZWx+dHJ0LGRhdGE9YXAsdmFyLmVxdWFsPVRSVUUpJGVzdGltYXRlKSwxKWAlIGdyb3RlciBpbiBkZSB0cmFuc3BsYW50YXRpZWdyb2VwIGRhbiBpbiBkZSBwbGFjZWJvIGdyb2VwICg5NVwlIENJIFtgciBwYXN0ZShmb3JtYXQoLXQudGVzdChyZWx+dHJ0LGRhdGE9YXAsdmFyLmVxdWFsPVRSVUUpJGNvbmYuaW50WzI6MV0sZGlnaXRzPTIsbnNtYWxsPTEpLGNvbGxhcHNlPSIsIilgXSUpLgoKLS0tCgojIEFhbm5hbWVzCgpEZSBnZWxkaWdoZWlkIHZhbiBkZSB0LXRvZXRzIGhhbmd0IGFmIHZhbiBkZSBhc3N1bXB0aWVzIG92ZXIgZGUgdmVyZGVsaW5nOgoKLSBPbmFmaGFua2VsaWpraGVpZCAgKGRlc2lnbikKLSBPbmUtc2FtcGxlIHQtdGVzdDogbm9ybWFsaXRlaXQgdmFuIGRlIHdhYXJuZW1pbmdlbgotIEdlcGFhcmRlIHQtdGVzdDogbm9ybWFsaXRlaXQgdmFuIGhldCB2ZXJzY2hpbCAgCi0gVHdvLXNhbXBsZSB0LXRlc3Q6IE5vcm1hbGl0ZWl0IHZhbiBkZSB3YWFybmVtaW5nZW4gaW4gYmVpZGUgZ3JvZXBlbiwgZW4gZ2VsaWprZSB2YXJpYW50aWVzLgoKQWxzIG5pZXQgYWFuIGRlIGFhbm5hbWVzIHdvcmR0IHZvbGRhYW4sIHZvbGd0IGRlIG51bHZlcmRlbGluZyBnZWVuIHQtdmVyZGVsaW5nIGVuIHppam4gZGUgcC13YWFyZGVuIGVuIGtyaXRpc2NoZSB3YWFyZGVuIG9uanVpc3QuCgoKT20gYmV0cm91d2JhYXJoZWlkc2ludGVydmFsbGVuIHRlIGNvbnN0cnVlcmVuLCB2ZXJ0cm91d2VuIHdlIG9vayBvcCBkZXplIGFhbm5hbWVzLgoKLSBXZSBoZWJiZW4ga3dhbnRpZWxlbiB1aXQgZGUgdC12ZXJkZWxpbmcgZ2VicnVpa3Qgb20gZGUgb25kZXItIGVuIGJvdmVuZ3JlbnMgdGUgYmVyZWtlbmVuLgoKLSBEZSBjb3JyZWN0ZSBjb3ZlcmFnZSB2YW4gaGV0IENJIGhhbmd0IGFmIHZhbiBkZXplIGFzc3VtcHRpZXMuCgotLS0KCiMjIEV2YWx1ZWVyIG5vcm1hbGl0ZWl0CgogLSBCb3hwbG90cyBlbiBoaXN0b2dyYW1tZW46IHZvcm0gdmFuIGRlIHZlcmRlbGluZyBlbiBvdXRsaWVycwoKIC0gUVEtcGxvdHMKCkVyIGJlc3RhYW4gb29rIGh5cG90aGVzZXRlc3RzIChnb29kbmVzcy1vZi1maXQtdGVzdCksIG1hYXIgaHVuIG51bGh5cG90aGVzZSBpcyBkYXQgZGUgZ2VnZXZlbnMgbm9ybWFhbCB2ZXJkZWVsZCB6aWpuLCBkdXMgd2UgdHJla2tlbiBlZW4gendha2tlIGNvbmNsdXNpZSEKCiAgLSBLb2xtb2dvcm92LVNtaXJub3YsIFNoYXBpcm8tV2lsayBlbiBBbmRlcnNvbi1EYXJsaW5nLgogIC0gSW4ga2xlaW5lIG1vbnN0ZXJzIGhlYmJlbiB6ZSBlZW4gbGFnZSBwb3dlcgogIC0gSW4gZ3JvdGUgc3RlZWtwcm9ldmVuIHNpZ25hbGVyZW4gemUgdmFhayB6ZWVyIGtsZWluZSBhZndpamtpbmdlbiBhbHMgc2lnbmlmaWNhbnQKCkFhbmJldmVsaW5nCgotIEJlZ2luIG1ldCBncmFmaXNjaGUgdmVya2VubmluZyB2YW4gZGUgZ2VnZXZlbnMgZW4gaG91ZCByZWtlbmluZyBtZXQgZGUgc3RlZWtwcm9lZm9tdmFuZyBvbSBvdmVyaW50ZXJwcmV0YXRpZSB2YW4gZGUgcGxvdHMgdGUgdm9vcmtvbWVuLgoKLSBJbmRpZW4gamUgdHdpamZlbHQsIGdlYnJ1aWsgZGFuIHNpbXVsYXRpZSB3YWFyYmlqIHUgZ2VnZXZlbnMgc2ltdWxlZXJ0IG1ldCBkZXplbGZkZSBzdGVla3Byb2Vmb212YW5nIHVpdCBlZW4gbm9ybWFsZSB2ZXJkZWxpbmcgbWV0IGhldHplbGZkZSBnZW1pZGRlbGRlIGVuIGRlemVsZmRlIHZhcmlhbnRpZSBhbHMgZGVnZW5lIGRpZSB1IGluIGRlIHN0ZWVrcHJvZWYgaGVidCB3YWFyZ2Vub21lbgoKLSBBbHMgdSBhZndpamtpbmdlbiB2YW4gbm9ybWFsaXRlaXQgaGVidCB3YWFyZ2Vub21lbiwgY29udHJvbGVlciBkYW4gaW4gZGUgbGl0ZXJhdHV1ciBob2UgZ2V2b2VsaWcgdXcgbWV0aG9kZSBpcyB2b29yIGRlcmdlbGlqa2UgYWZ3aWpraW5nZW4gdmFuIG5vcm1hbGl0ZWl0LiAoWm8gemlqbiBULXRlc3RzIGJpanZvb3JiZWVsZCBub2dhbCBvbmdldm9lbGlnIHZvb3IgYWZ3aWpraW5nZW4sIHpvbGFuZyBkZSB2ZXJkZWxpbmcgdmFuIGRlIGdlZ2V2ZW5zIG1hYXIgc3ltbWV0cmlzY2ggaXMuKQoKLSAgSW4gZ3JvdGUgc3RlZWtwcm9ldmVuIGt1biBqZSB0ZXJ1Z3ZhbGxlbiBvcCBkZSBjZW50cmFsZSBsaW1pZXRzdGVsbGluZy4KCi0gSGV0IGlzIGVlbiBtb2dlbGlqa2hlaWQgb20gZGUgcmVzcG9uc2UgdGUgdHJhbnNmb3JtZXJlbi4KCi0tLQoKIyMgSG9tb3NjZWRhc3RpY2l0ZWl0CgotIEJveHBsb3RzOiBkZSBib3hncm9vdHRlIGlzIGhldCBpbnRlcmt3YXJ0aWVsYmVyZWlrIChJUVIpLCBlZW4gcm9idXN0ZSBzY2hhdHRlciB2YW4gZGUgdmFyaWFudGllLgoKLSBBbHMgZGUgdmVyc2NoaWxsZW4gbmlldCBncm9vdCB6aWpuICRccmlnaHRhcnJvdyQgaG9tb3NjZWRhc3RpY2l0ZWl0CgotIE9vayBoaWVyIGt1biBqZSBzaW11bGF0aWUgZ2VicnVpa2VuIG9tIGluemljaHQgdGUga3JpamdlbiBpbiBkZSB2ZXJzY2hpbGxlbiBkaWUgamUga3VudCB2ZXJ3YWNodGVuLgoKLSBGb3JtZWxlIEYtdG9ldHMga2FuIHdvcmRlbiBnZWJydWlrdCBvbSBkZSB2YXJpYW50aWVzIHRlIHZlcmdlbGlqa2VuLCBtYWFyIG9uZGVyIGRlIG51bCBnYSBqZSBoaWVyIG9vayB1aXQgdmFuIGdlbGlqa2UgdmFyaWFudGllcywgZHVzIGhpZXIgZ2VsZHQgZGV6ZWxmZGUga3JpdGllayBhbHMgdm9vciBub3JtYWxpdGVpdHN0ZXN0ZW4uCgotLS0KCiMjIFdlbGNoIG1vZGlmaWVkIHQtdGVzdAoKQWxzIGRlIGdlZ2V2ZW5zIGhldGVyb3NjZWRhc3Rpc2NoIHppam4sIGt1bnQgdSBlZW4gV2VsY2ggdHdvLXNhbXBsZSBULXRlc3QgZ2VicnVpa2VuLCBkaWUgbmlldCBsYW5nZXIgZGUgZ2Vwb29sZGUgdmFyaWFudGllLXNjaGF0dGVyIGdlYnJ1aWt0LgoKJCRUID0gIFxmcmFje1xiYXJ7WX1fMSAtIFxiYXJ7WX1fMn17XHNxcnR7XGZyYWN7U14yXzF9e25fMX0rXGZyYWN7U14yXzJ9e25fMn19fSQkCm1ldCAkU14yXzEkIGVuICRTXjJfMiQgZGUgc3RlZWtwcm9lZnZhcmlhbnRpZXMgaW4gYmVpZGUgZ3JvZXBlbi4KCkRlemUgc3RhdGlzdGllayB2b2xndCBvbmdldmVlciBlZW4gdC12ZXJkZWxpbmcgbWV0IGVlbiBhYW50YWwgdnJpamhlaWRzZ3JhZGVuIHR1c3NlbiAkXHRleHR7bWlufShuXzEtMSxuXzItMSkkIGVuICRuXzErbl8yLTIkLgoKSW4gUiB0aGUgZGVncmVlcyBvZiBmcmVlZG9tIGFyZSBlc3RpbWF0ZWQgdXNpbmcgdGhlIFdlbGNoLSBTYXR0ZXJ0aHdhaXRlIGFwcHJveGltYXRpb24uIEluIFIgd29yZGVuIGRlIHZyaWpoZWlkc2dyYWRlbiBnZXNjaGF0IG1ldCBiZWh1bHAgdmFuIGRlIFdlbGNoLVNhdHRlcnRod2FpdGUgYmVuYWRlcmluZy4gVSBrdW50IGRpdCBkb2VuIGRvb3IgZGUgZnVuY3RpZSBgdC50ZXN0YCB0ZSBnZWJydWlrZW4gbWV0IGhldCBhcmd1bWVudCBgdmFyLmVxdWFsID0gRkFMU0VgLgoKYGBge3J9CnQudGVzdChyZWx+dHJ0LGRhdGE9YXAsdmFyLmVxdWFsPUZBTFNFKQpgYGAKCk1lcmsgb3AgZGF0IGRlIFdlbGNoIFQtdGVzdCBpbiBkZSB0aXRlbCBpcyBvdmVyZ2Vub21lbi4gRGUgYWFuZ2VwYXN0ZSB2cmlqaGVpZHNncmFkZW4gemlqbiAkZGYgPSAxNy44NzYkICRccG0kIGluIHZlcmdlbGlqa2luZyBtZXQgZGUgY29udmVudGlvbmVsZSB0LXRlc3QsIG9tZGF0IGRlIHZhcmlhbnRpZXMgb25nZXZlZXIgZ2VsaWprIHppam4uCgotLS0KCiMgSG9lIHJhcHBvcnRlcmVuPwoKLSBJbiBkZSB3ZXRlbnNjaGFwcGVsaWprZSBsaXRlcmF0dXVyIGlzIGVyIHRldmVlbCBhYW5kYWNodCB2b29yIHAtd2FhcmRlbgoKLSAgSGV0IGlzIHZlZWwgaW5mb3JtYXRpZXZlciBvbSBlZW4gc2NoYXR0aW5nIHRlIGNvbWJpbmVyZW4gbWV0IHppam4gYmV0cm91d2JhYXJoZWlkc2ludGVydmFsLgoKKipSdWxlIG9mIHRodW1iKio6CgpSYXBwb3J0ZWVyIGVlbiBzY2hhdHRpbmcgc2FtZW4gbWV0IGhldCBiZXRyb3V3YmFhcmhlaWRzaW50ZXJ2YWwgKGVuIGRlIHAtd2FhcmRlKQoKMS4gSGV0IHJlc3VsdGFhdCB2YW4gZGUgdGVzdCBrYW4gd29yZGVuIGFmZ2VsZWlkIHVpdCBoZXQgYmV0cm91d2JhYXJoZWlkc2ludGVydmFsCjIuIEhldCBzdGFhdCBkZSBsZXplciB0b2Ugb20gZGUgKip3ZXRlbnNjaGFwcGVsaWprZSByZWxldmF0aWUqKiB0ZSBiZW9vcmRlbGVuLgoKYGBge3J9CnQudGVzdChyZWx+dHJ0LGRhdGE9YXApCmBgYAoKSGV0IHJlc3VsdGFhdCB2YW4gZWVuICRcYWxwaGEkLWxldmVsIHQtdGVzdCBrb210IG92ZXJlZW4gbWV0IGhldCB2ZXJnZWxpamtlbiB2YW4gZGUgZWZmZWN0Z3Jvb3R0ZSBvbmRlciAkSF8wJCBtZXQgaGV0ICQxLVxhbHBoYSQgQ0kuCgpFZW4gZWZmZWN0IGthbiBzdGF0aXN0aXNjaCB6ZWVyIHNpZ25pZmljYW50IHppam4sIG1hYXIgd2V0ZW5zY2hhcHBlbGlqayBpcnJlbGV2YW50LiBNZXQgZWVuIENJIHppZSBqZSBkaXQuCgotLS0KCiMgW0hvbWVdKGh0dHBzOi8vc3RhdG9taWNzLmdpdGh1Yi5pby9zYmMyMCkgey19Cg==