Task
This document will guide you through the process of pre-registration and subsequent analysis. It’s a part of exercise in Experiments seminar dedicated to quantitative evaluation of experiments. We will work with a made-up example of influence of vitamin E on IQ.
First, you need to answer the questions in pre-registration. Some options are pre-filled for you, others you can decide absolutely arbitrarily. Modify the scripts according to chosen options.
After you pre-registration is done, export it to pdf (click Knit). Then take data files with experiments’ results and do your analysis. There are three folders, control, treatment and treatment-high. There are five control data files and 15x5 treatment files. This time, take treatment file with the first number corresponding with the day you were born modulo 15 (e.g. 28th % 15 = 13). The second number in the filename goes from 1 to 5, you can use those if you are trying to replicate your study. After than is done, you can again export the whole notebook to pdf.
If you have time and want to reproduce your experiments with different dataset, or explore different hypotheses, or try out different analyses, fill free to do so just start fresh with empty template (or copy your notebook to a NEW file), ask for a new dataset and do it all over.
Text in italics are instructions and examples, normal text is what is pre-filled for you.
This document is written in R markdown, for details see [here] (https://blog.rstudio.com/2014/08/01/the-r-markdown-cheat-sheet/).
Pre-registration
What’s the main question being asked or hypothesis being tested in this study?
Decide for yourself. Some examples of hypotheses:
- Vitamin E influences IQ.
- Vitamin E does not influence IQ.
- Vitamin E increases IQ.
- Vitamin E does not increase IQ.
- Vitamin E increases IQ by at least two IQ points.
- Vitamin E decreases IQ by at least two IQ points.
- Vitamin E increases IQ, but less than two points.
- Vitamin E increases IQ by five points exactly.
Explicitly write both your H0 and H1.
Describe the key dependent variable(s) specifying how they will be measured.
Dependent variable is IQ, measured by a Wechsler Adult Intelligence Scale test in controlled environment.
How many and which conditions will participants be assigned to?
Choose one of two following options or think up your own:
Two conditions: control group and treatment group (100% of recommended daily intake take in form of a daily pill from company GoodVitamins for 30 days).
Three conditions: control group, treatment group with low doses of vitamin E (100% of recommended daily intake taken in form of a daily pill from company GoodVitamins for 30 days) and treatment group with high doses of vitamin E (300% of recommended daily intake, taken in form of three daily pills from GoodVitamins for 30 days).
Specify exactly which analyses you will conduct to examine the main question/hypothesis.
You can use Welch’s t-test for basic testing, but feel free to use something else if you find it more suitable to test your hypothesis. In any case specify the statistical test you want to use and its parameters, e.g. direction of effect, \(\alpha\) levels, etc.
Any secondary hypotheses and analyses?
Go for it, come up with another hypothesis that you would find interesting to examine. For example:
- Vitamin E influences IQ more with higher dose.
- Vitamin E does not influence IQ with lower dose, but it does with higher dose.
How many observations will be collected or what will determine sample size? No need to justify decision, but be precise about exactly how the number will be determined.
We were talking about this. You can determine the sample by:
- available resources (e.g. you have funding only to test 200 people together)
- estimated effect size and subsequent power analysis (you can pretend you estimate the effect size on other research or try and determine it in exploratory analysis beforehand - then you need to fill out exploratory template and do the analysis there before continuing this)
- the smallest effect size of interest and subsequent power analysis (you can argue that you are not interested in effects smaller than two IQ points)
if(!require(pwr)){install.packages('pwr')} #install necessary package if not available
library(pwr) #load the necessary package
wantedStatisticalPower <- 0.8 #assign the number between <0,1>
points <- 2 #estimated effect size in IQ points,
#if you expect lower IQ in treatment, if should be a negative number
SD <- 15 # standard deviaiton of IQ in population
estimatedEffectSize <- points/SD # estimated effect size in Cohen's d
alpha <- 0.05 # Type 1 error rate
direction <- "greater" # or "two.sided" or "less" depending on your hypothesis
sampleSize <- pwr.t.test(d=estimatedEffectSize,sig.level=alpha,type="two.sample",
alternative=direction, power=wantedStatisticalPower)$n
sampleSize <- ceiling(sampleSize) #round it up
#if you have determined your sample size in any other way, reassign the value here
sampleSize <- sampleSize
In any case, report here the estimated statistical power of your study in a form of power curve.
How will you treat data exclusions and outliers?
If anybody does not finish the IQ test, we omit their data from the study and they will not be included in studied dataset. If anybody in treatment group stops taking vitamin E before one-month period, we omit their data from the study and they will not be included in studied dataset. By outliers, we mean results outside 2.5 times standard deviation. These will be excluded from the datasets.
Will you use sequential analysis (gradual acquisition of data) or test the data in multiple ways? How will you control your false positive rate?
When you feel confident enough, try at least multiple testing in some form. You will encounter these techniques rather often in your own research. Some examples:
We will collect data with sequential analysis. First, we will gather data from 400 people per group at first and test. If we are not able to reject H0 at that point, we will gather data from addidtional 450 people per group and test. Our total Type 1 error rate is set to 0.05, and we will control it with Bonferroni correction/Pocock boundary/other method.
We will test the data two times. First, we will use Welch’s t-test to compare control and treatment group. Then we will compare people below 40 in control and treatment groups. Our total Type 1 error rate is set to 0.07, and we control it with Bonferroni correction/Holm correction.
We will test the data multiple times. We will divide both groups in two parts according to the following: age (below and above 40), socio-economic status (income below 150000 Kč per year per person in household and income above that), achieved education (university degree of some sort or not). For each division, we will compare corresponding control and treatment groups (i.e. control below 40 with treatment below 40, control above 40 and treatment above 40). That means 12 p-values. We will control false discovery rate with Benjamini–Hochberg procedure and our controlled \(\alpha = 0.17\).
Anything else you would like to pre-register?
Is there anything else to mention and prevent reviewers to think you misused the statistics?
Have any data been collected for this study already?
No, no data have been collected for this study yet.
Analysis
Set the sample size and load data.
sampleSize
controlFile <- "" #change to the actual file name of control group data
treatmentFile <- "" #change to the actual file name of treatment group data
# read the data, omitting the first line, reading samplesize number of data points
control <- read.csv(controlFile, skip=1, nrows = sampleSize+1)
control <- control[,1]
treatment <- read.csv(treatmentFile, skip=1, nrows = sampleSize+1)
treatment <- treatment[,1]
Exclude the outliers.
controlMean <- mean(control)
controlSD <- 15
treatmentMean <- mean(treatment)
treatmentSD <- sd(treatment)
control <- control[control > controlMean-2.5*controlSD &
control < controlMean+2.5*controlSD]
treatment <- treatment[treatment > treatmentMean - 2.5*treatmentSD &
treatment < treatmentMean + 2.5*treatmentSD]
Do the statistical test. Control your Type 1 error rate.
# for t-test, you don't need any special library, just type ?t.test into console for help
# for testing "bounded" hypotheses, i.e. vitamin E increases IQ by more than two points,
# you can use package TOSTER
# for Bonferroni correction, just divide your alpha
# a_i <- alpha/number_of_tests and use a_i in tests
# for FDR, there is library(astsa) and its function FDR,
# look into real-world example notebook for details
# for other tests and corrections, use google,
# R has packages for almost everything
#beware that the order of parameters control and treatment matters
#if your direction is "greater", that means you expect control > treatment
# and your estimated effect size is a positive number
#if your direction is "less", that means you expect control < treatment
# and your estimated effect size is a negative number
# if your direction is "two.sided", you made no claims
# about the direction of the effect,
# you just think the treatment and control are not the same
mean(control)
mean(treatment)
test <- t.test(control, y = treatment, type = "two.sample", alternative = direction)
test$p.value
test$p.value < alpha
Do the other analyses.
# just do what you promised in pre-registration
Interpretation
Interpret the results.
- Are you able to reject H0?
- If so, what that means?
- If not, what that means?
- What about the effect size? What’s its practical significance?
What would be your next steps?
- hypotheses to examine
- tests to conduct
- exploratory analyses to do
- limitations of your study (e.g. small sample size)
- modifications to the future study setup (e.g. including possible confounding variables)
Optional Exploratory Analysis of Available Data
Almost always, something will surprise you in your evaluation and you haven’t even thought about that so it’s not in your pre-registration. It’s okay, we can do a little exploratory analysis with it, as long as we don’t consider our hypotheses generated from that to be true. But you can, for example, make your pre-registration more detailed when you are reproducing your study or doing something similar next time.
So, if you have anything you would like to examine further in data you have available, you can do so here.
LS0tCnRpdGxlOiAiVml0YW1pbiBFIGFuZCBJUSAtIGNvbmZpcm1hdG9yeSBzdHVkeSIKYXV0aG9yOiBKYW5hIEhvenpvdsOhCm91dHB1dDoKICBwZGZfZG9jdW1lbnQ6IGRlZmF1bHQKICBodG1sX25vdGVib29rOiBkZWZhdWx0Ci0tLQoKIyBUYXNrCgpUaGlzIGRvY3VtZW50IHdpbGwgZ3VpZGUgeW91IHRocm91Z2ggdGhlIHByb2Nlc3Mgb2YgcHJlLXJlZ2lzdHJhdGlvbiBhbmQgc3Vic2VxdWVudCBhbmFseXNpcy4gSXQncyBhIHBhcnQgb2YgZXhlcmNpc2UgaW4gRXhwZXJpbWVudHMgc2VtaW5hciBkZWRpY2F0ZWQgdG8gcXVhbnRpdGF0aXZlIGV2YWx1YXRpb24gb2YgZXhwZXJpbWVudHMuIFdlIHdpbGwgd29yayB3aXRoIGEgbWFkZS11cCBleGFtcGxlIG9mIGluZmx1ZW5jZSBvZiB2aXRhbWluIEUgb24gSVEuCgpGaXJzdCwgeW91IG5lZWQgdG8gYW5zd2VyIHRoZSBxdWVzdGlvbnMgaW4gcHJlLXJlZ2lzdHJhdGlvbi4gU29tZSBvcHRpb25zIGFyZSBwcmUtZmlsbGVkIGZvciB5b3UsIG90aGVycyB5b3UgY2FuIGRlY2lkZSBhYnNvbHV0ZWx5IGFyYml0cmFyaWx5LiBNb2RpZnkgdGhlIHNjcmlwdHMgYWNjb3JkaW5nIHRvIGNob3NlbiBvcHRpb25zLgoKQWZ0ZXIgeW91IHByZS1yZWdpc3RyYXRpb24gaXMgZG9uZSwgZXhwb3J0IGl0IHRvIHBkZiAoY2xpY2sgS25pdCkuIFRoZW4gdGFrZSBkYXRhIGZpbGVzIHdpdGggZXhwZXJpbWVudHMnIHJlc3VsdHMgYW5kIGRvIHlvdXIgYW5hbHlzaXMuIFRoZXJlIGFyZSB0aHJlZSBmb2xkZXJzLCBjb250cm9sLCB0cmVhdG1lbnQgYW5kIHRyZWF0bWVudC1oaWdoLiBUaGVyZSBhcmUgZml2ZSBjb250cm9sIGRhdGEgZmlsZXMgYW5kIDE1eDUgdHJlYXRtZW50IGZpbGVzLiBUaGlzIHRpbWUsIHRha2UgdHJlYXRtZW50IGZpbGUgd2l0aCB0aGUgZmlyc3QgbnVtYmVyIGNvcnJlc3BvbmRpbmcgd2l0aCB0aGUgZGF5IHlvdSB3ZXJlIGJvcm4gbW9kdWxvIDE1IChlLmcuIDI4dGggXCUgMTUgPSAxMykuIFRoZSBzZWNvbmQgbnVtYmVyIGluIHRoZSBmaWxlbmFtZSBnb2VzIGZyb20gMSB0byA1LCB5b3UgY2FuIHVzZSB0aG9zZSBpZiB5b3UgYXJlIHRyeWluZyB0byByZXBsaWNhdGUgeW91ciBzdHVkeS4gQWZ0ZXIgdGhhbiBpcyBkb25lLCB5b3UgY2FuIGFnYWluIGV4cG9ydCB0aGUgd2hvbGUgbm90ZWJvb2sgdG8gcGRmLiAKCklmIHlvdSBoYXZlIHRpbWUgYW5kIHdhbnQgdG8gcmVwcm9kdWNlIHlvdXIgZXhwZXJpbWVudHMgd2l0aCBkaWZmZXJlbnQgZGF0YXNldCwgb3IgZXhwbG9yZSBkaWZmZXJlbnQgaHlwb3RoZXNlcywgb3IgdHJ5IG91dCBkaWZmZXJlbnQgYW5hbHlzZXMsIGZpbGwgZnJlZSB0byBkbyBzbyBqdXN0IHN0YXJ0IGZyZXNoIHdpdGggZW1wdHkgdGVtcGxhdGUgKG9yIGNvcHkgeW91ciBub3RlYm9vayB0byBhIE5FVyBmaWxlKSwgYXNrIGZvciBhIG5ldyBkYXRhc2V0IGFuZCBkbyBpdCBhbGwgb3Zlci4KCipUZXh0IGluIGl0YWxpY3MgYXJlIGluc3RydWN0aW9ucyBhbmQgZXhhbXBsZXMqLCBub3JtYWwgdGV4dCBpcyB3aGF0IGlzIHByZS1maWxsZWQgZm9yIHlvdS4KClRoaXMgZG9jdW1lbnQgaXMgd3JpdHRlbiBpbiBSIG1hcmtkb3duLCBmb3IgZGV0YWlscyBzZWUgW2hlcmVdIChodHRwczovL2Jsb2cucnN0dWRpby5jb20vMjAxNC8wOC8wMS90aGUtci1tYXJrZG93bi1jaGVhdC1zaGVldC8pLgoKIyBQcmUtcmVnaXN0cmF0aW9uCgojIyBXaGF0J3MgdGhlIG1haW4gcXVlc3Rpb24gYmVpbmcgYXNrZWQgb3IgaHlwb3RoZXNpcyBiZWluZyB0ZXN0ZWQgaW4gdGhpcyBzdHVkeT8KCipEZWNpZGUgZm9yIHlvdXJzZWxmLiBTb21lIGV4YW1wbGVzIG9mIGh5cG90aGVzZXM6KgoKLSAqVml0YW1pbiBFIGluZmx1ZW5jZXMgSVEuKgotICpWaXRhbWluIEUgZG9lcyBub3QgaW5mbHVlbmNlIElRLioKLSAqVml0YW1pbiBFIGluY3JlYXNlcyBJUS4qCi0gKlZpdGFtaW4gRSBkb2VzIG5vdCBpbmNyZWFzZSBJUS4qCi0gKlZpdGFtaW4gRSBpbmNyZWFzZXMgSVEgYnkgYXQgbGVhc3QgdHdvIElRIHBvaW50cy4qCi0gKlZpdGFtaW4gRSBkZWNyZWFzZXMgSVEgYnkgYXQgbGVhc3QgdHdvIElRIHBvaW50cy4qCi0gKlZpdGFtaW4gRSBpbmNyZWFzZXMgSVEsIGJ1dCBsZXNzIHRoYW4gdHdvIHBvaW50cy4qCi0gKlZpdGFtaW4gRSBpbmNyZWFzZXMgSVEgYnkgZml2ZSBwb2ludHMgZXhhY3RseS4qCgoqRXhwbGljaXRseSB3cml0ZSBib3RoIHlvdXIgSDAgYW5kIEgxLioKCiMjIERlc2NyaWJlIHRoZSBrZXkgZGVwZW5kZW50IHZhcmlhYmxlKHMpIHNwZWNpZnlpbmcgaG93IHRoZXkgd2lsbCBiZSBtZWFzdXJlZC4KCkRlcGVuZGVudCB2YXJpYWJsZSBpcyBJUSwgbWVhc3VyZWQgYnkgYSBXZWNoc2xlciBBZHVsdCBJbnRlbGxpZ2VuY2UgU2NhbGUgdGVzdCBpbiBjb250cm9sbGVkIGVudmlyb25tZW50LgoKIyMgSG93IG1hbnkgYW5kIHdoaWNoIGNvbmRpdGlvbnMgd2lsbCBwYXJ0aWNpcGFudHMgYmUgYXNzaWduZWQgdG8/CgoqQ2hvb3NlIG9uZSBvZiB0d28gZm9sbG93aW5nIG9wdGlvbnMgb3IgdGhpbmsgdXAgeW91ciBvd246KgoKKlR3byBjb25kaXRpb25zOiBjb250cm9sIGdyb3VwIGFuZCB0cmVhdG1lbnQgZ3JvdXAgKDEwMCUgb2YgcmVjb21tZW5kZWQgZGFpbHkgaW50YWtlIHRha2UgaW4gZm9ybSBvZiBhIGRhaWx5IHBpbGwgZnJvbSBjb21wYW55IEdvb2RWaXRhbWlucyBmb3IgMzAgZGF5cykuKgoKKlRocmVlIGNvbmRpdGlvbnM6IGNvbnRyb2wgZ3JvdXAsIHRyZWF0bWVudCBncm91cCB3aXRoIGxvdyBkb3NlcyBvZiB2aXRhbWluIEUgKDEwMCUgb2YgcmVjb21tZW5kZWQgZGFpbHkgaW50YWtlIHRha2VuIGluIGZvcm0gb2YgYSBkYWlseSBwaWxsIGZyb20gY29tcGFueSBHb29kVml0YW1pbnMgZm9yIDMwIGRheXMpIGFuZCB0cmVhdG1lbnQgZ3JvdXAgd2l0aCBoaWdoIGRvc2VzIG9mIHZpdGFtaW4gRSAoMzAwJSBvZiByZWNvbW1lbmRlZCBkYWlseSBpbnRha2UsIHRha2VuIGluIGZvcm0gb2YgdGhyZWUgZGFpbHkgcGlsbHMgZnJvbSBHb29kVml0YW1pbnMgZm9yIDMwIGRheXMpLioKCiMjIFNwZWNpZnkgZXhhY3RseSB3aGljaCBhbmFseXNlcyB5b3Ugd2lsbCBjb25kdWN0IHRvIGV4YW1pbmUgdGhlIG1haW4gcXVlc3Rpb24vaHlwb3RoZXNpcy4KCipZb3UgY2FuIHVzZSBXZWxjaCdzIHQtdGVzdCBmb3IgYmFzaWMgdGVzdGluZywgYnV0IGZlZWwgZnJlZSB0byB1c2Ugc29tZXRoaW5nIGVsc2UgaWYgeW91IGZpbmQgaXQgbW9yZSBzdWl0YWJsZSB0byB0ZXN0IHlvdXIgaHlwb3RoZXNpcy4gSW4gYW55IGNhc2Ugc3BlY2lmeSB0aGUgc3RhdGlzdGljYWwgdGVzdCB5b3Ugd2FudCB0byB1c2UgYW5kIGl0cyBwYXJhbWV0ZXJzLCBlLmcuIGRpcmVjdGlvbiBvZiBlZmZlY3QsICRcYWxwaGEkIGxldmVscywgZXRjLioKCiMjIEFueSBzZWNvbmRhcnkgaHlwb3RoZXNlcyBhbmQgYW5hbHlzZXM/CgoqR28gZm9yIGl0LCBjb21lIHVwIHdpdGggYW5vdGhlciBoeXBvdGhlc2lzIHRoYXQgeW91IHdvdWxkIGZpbmQgaW50ZXJlc3RpbmcgdG8gZXhhbWluZS4gRm9yIGV4YW1wbGU6KgoKLSAqVml0YW1pbiBFIGluZmx1ZW5jZXMgSVEgbW9yZSB3aXRoIGhpZ2hlciBkb3NlLioKLSAqVml0YW1pbiBFIGRvZXMgbm90IGluZmx1ZW5jZSBJUSB3aXRoIGxvd2VyIGRvc2UsIGJ1dCBpdCBkb2VzIHdpdGggaGlnaGVyIGRvc2UuKgoKIyMgSG93IG1hbnkgb2JzZXJ2YXRpb25zIHdpbGwgYmUgY29sbGVjdGVkIG9yIHdoYXQgd2lsbCBkZXRlcm1pbmUgc2FtcGxlIHNpemU/IE5vIG5lZWQgdG8ganVzdGlmeSBkZWNpc2lvbiwgYnV0IGJlIHByZWNpc2UgYWJvdXQgZXhhY3RseSBob3cgdGhlIG51bWJlciB3aWxsIGJlIGRldGVybWluZWQuCgoqV2Ugd2VyZSB0YWxraW5nIGFib3V0IHRoaXMuIFlvdSBjYW4gZGV0ZXJtaW5lIHRoZSBzYW1wbGUgYnk6KgoKLSAqYXZhaWxhYmxlIHJlc291cmNlcyAoZS5nLiB5b3UgaGF2ZSBmdW5kaW5nIG9ubHkgdG8gdGVzdCAyMDAgcGVvcGxlIHRvZ2V0aGVyKSoKLSAqZXN0aW1hdGVkIGVmZmVjdCBzaXplIGFuZCBzdWJzZXF1ZW50IHBvd2VyIGFuYWx5c2lzICh5b3UgY2FuIHByZXRlbmQgeW91IGVzdGltYXRlIHRoZSBlZmZlY3Qgc2l6ZSBvbiBvdGhlciByZXNlYXJjaCBvciB0cnkgYW5kIGRldGVybWluZSBpdCBpbiBleHBsb3JhdG9yeSBhbmFseXNpcyBiZWZvcmVoYW5kIC0gdGhlbiB5b3UgbmVlZCB0byBmaWxsIG91dCBleHBsb3JhdG9yeSB0ZW1wbGF0ZSBhbmQgZG8gdGhlIGFuYWx5c2lzIHRoZXJlIGJlZm9yZSBjb250aW51aW5nIHRoaXMpKgotICp0aGUgc21hbGxlc3QgZWZmZWN0IHNpemUgb2YgaW50ZXJlc3QgYW5kIHN1YnNlcXVlbnQgcG93ZXIgYW5hbHlzaXMgKHlvdSBjYW4gYXJndWUgdGhhdCB5b3UgYXJlIG5vdCBpbnRlcmVzdGVkIGluIGVmZmVjdHMgc21hbGxlciB0aGFuIHR3byBJUSBwb2ludHMpKgoKYGBge3J9CmlmKCFyZXF1aXJlKHB3cikpe2luc3RhbGwucGFja2FnZXMoJ3B3cicpfSAjaW5zdGFsbCBuZWNlc3NhcnkgcGFja2FnZSBpZiBub3QgYXZhaWxhYmxlCmxpYnJhcnkocHdyKSAjbG9hZCB0aGUgbmVjZXNzYXJ5IHBhY2thZ2UKd2FudGVkU3RhdGlzdGljYWxQb3dlciA8LSAwLjggI2Fzc2lnbiB0aGUgbnVtYmVyIGJldHdlZW4gPDAsMT4KcG9pbnRzIDwtIDIgI2VzdGltYXRlZCBlZmZlY3Qgc2l6ZSBpbiBJUSBwb2ludHMsCiAgICAgICAgICAgICNpZiB5b3UgZXhwZWN0IGxvd2VyIElRIGluIHRyZWF0bWVudCwgaWYgc2hvdWxkIGJlIGEgbmVnYXRpdmUgbnVtYmVyClNEIDwtIDE1ICMgc3RhbmRhcmQgZGV2aWFpdG9uIG9mIElRIGluIHBvcHVsYXRpb24KZXN0aW1hdGVkRWZmZWN0U2l6ZSA8LSBwb2ludHMvU0QgIyBlc3RpbWF0ZWQgZWZmZWN0IHNpemUgaW4gQ29oZW4ncyBkCmFscGhhIDwtIDAuMDUgIyBUeXBlIDEgZXJyb3IgcmF0ZQpkaXJlY3Rpb24gPC0gImdyZWF0ZXIiICMgb3IgInR3by5zaWRlZCIgb3IgImxlc3MiIGRlcGVuZGluZyBvbiB5b3VyIGh5cG90aGVzaXMKc2FtcGxlU2l6ZSA8LSBwd3IudC50ZXN0KGQ9ZXN0aW1hdGVkRWZmZWN0U2l6ZSxzaWcubGV2ZWw9YWxwaGEsdHlwZT0idHdvLnNhbXBsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICBhbHRlcm5hdGl2ZT1kaXJlY3Rpb24sIHBvd2VyPXdhbnRlZFN0YXRpc3RpY2FsUG93ZXIpJG4KCnNhbXBsZVNpemUgPC0gY2VpbGluZyhzYW1wbGVTaXplKSAjcm91bmQgaXQgdXAKYGBgCgpgYGB7cn0KI2lmIHlvdSBoYXZlIGRldGVybWluZWQgeW91ciBzYW1wbGUgc2l6ZSBpbiBhbnkgb3RoZXIgd2F5LCByZWFzc2lnbiB0aGUgdmFsdWUgaGVyZQpzYW1wbGVTaXplIDwtIHNhbXBsZVNpemUKYGBgCgoKKkluIGFueSBjYXNlLCByZXBvcnQgaGVyZSB0aGUgZXN0aW1hdGVkIHN0YXRpc3RpY2FsIHBvd2VyIG9mIHlvdXIgc3R1ZHkgaW4gYSBmb3JtIG9mIHBvd2VyIGN1cnZlLioKCmBgYHtyLCBlY2hvPUZBTFNFfQpOPC1zYW1wbGVTaXplCmQ8LWVzdGltYXRlZEVmZmVjdFNpemUKcF91cHBlciA8LSBhbHBoYQpkaXJlY3Rpb248LWRpcmVjdGlvbgojbmNwPC0oaW5wdXQkZCpzcXJ0KE4vMikpICNDYWxjdWxhdGUgbm9uLWNlbnRyYWxpdHkgcGFyYW1ldGVyIGQKcGxvdF9wb3dlcl9kIDwtIChmdW5jdGlvbihkLCBOLCBwX3VwcGVyLCBkaXJlY3Rpb24pCnsKICAgcG93ZXI8LXB3ci50LnRlc3QoZD1kLCBuPU4sc2lnLmxldmVsPXBfdXBwZXIsdHlwZT0idHdvLnNhbXBsZSIsCiAgICAgICAgICAgICAgICAgICAgIGFsdGVybmF0aXZlPWRpcmVjdGlvbikkcG93ZXIKfQopCnBhcihiZyA9ICJhbGljZWJsdWUiKQpwbG90KC0xMCx4bGFiPXN1YnN0aXR1dGUocGFzdGUoIkNvaGVuJ3MgIiwgZGVsdGEpKSwgeWxhYj0iUG93ZXIiLCBheGVzPUZBTFNFLAptYWluPShwYXN0ZSgiUG93ZXIgZm9yIHQtdGVzdCB3aXRoIE4gPSAiLGNlaWxpbmcoTiksIiBwZXIgZ3JvdXAiKSksIHhsaW09YygwLDIpLCAgeWxpbT1jKDAsIDEpKQphYmxpbmUodiA9IHNlcSgwLDIsIDAuMiksIGggPSBzZXEoMCwxLDAuMSksIGNvbCA9ICJsaWdodGdyYXkiLCBsdHkgPSAxKQpheGlzKHNpZGU9MSwgYXQ9c2VxKDAsMiwgMC4yKSwgbGFiZWxzPXNlcSgwLDIsMC4yKSkKYXhpcyhzaWRlPTIsIGF0PXNlcSgwLDEsIDAuMiksIGxhYmVscz1zZXEoMCwxLDAuMikpCmN1cnZlKHBsb3RfcG93ZXJfZChkPXgsIE49TiwgcF91cHBlcj1wX3VwcGVyLCBkaXJlY3Rpb249ZGlyZWN0aW9uKSwgMCwgMiwgdHlwZT0ibCIsIGx0eT0xLCBsd2Q9MiwgeWxpbT1jKDAsMSksIHhsaW09YygwLDIpLCBhZGQ9VFJVRSkKcG9pbnRzKHg9ZCwgeT1wbG90X3Bvd2VyX2QoZCwgTiwgcF91cHBlciwgZGlyZWN0aW9uPWRpcmVjdGlvbiksIGNleD0yLCBwY2g9MTksIGNvbD1yZ2IoMSwgMCwgMCwwLjUpKQpgYGAKCgojIyBIb3cgd2lsbCB5b3UgdHJlYXQgZGF0YSBleGNsdXNpb25zIGFuZCBvdXRsaWVycz8KCklmIGFueWJvZHkgZG9lcyBub3QgZmluaXNoIHRoZSBJUSB0ZXN0LCB3ZSBvbWl0IHRoZWlyIGRhdGEgZnJvbSAgdGhlIHN0dWR5IGFuZCB0aGV5IHdpbGwgbm90IGJlIGluY2x1ZGVkIGluIHN0dWRpZWQgZGF0YXNldC4gSWYgYW55Ym9keSBpbiB0cmVhdG1lbnQgZ3JvdXAgc3RvcHMgdGFraW5nIHZpdGFtaW4gRSBiZWZvcmUgb25lLW1vbnRoIHBlcmlvZCwgd2Ugb21pdCB0aGVpciBkYXRhIGZyb20gdGhlIHN0dWR5IGFuZCB0aGV5IHdpbGwgbm90IGJlIGluY2x1ZGVkIGluIHN0dWRpZWQgZGF0YXNldC4gQnkgb3V0bGllcnMsIHdlIG1lYW4gcmVzdWx0cyBvdXRzaWRlIDIuNSB0aW1lcyBzdGFuZGFyZCBkZXZpYXRpb24uIFRoZXNlIHdpbGwgYmUgZXhjbHVkZWQgZnJvbSB0aGUgZGF0YXNldHMuCgojIyBXaWxsIHlvdSB1c2Ugc2VxdWVudGlhbCBhbmFseXNpcyAoZ3JhZHVhbCBhY3F1aXNpdGlvbiBvZiBkYXRhKSBvciB0ZXN0IHRoZSBkYXRhIGluIG11bHRpcGxlIHdheXM/IEhvdyB3aWxsIHlvdSBjb250cm9sIHlvdXIgZmFsc2UgcG9zaXRpdmUgcmF0ZT8KCipXaGVuIHlvdSBmZWVsIGNvbmZpZGVudCBlbm91Z2gsIHRyeSBhdCBsZWFzdCBtdWx0aXBsZSB0ZXN0aW5nIGluIHNvbWUgZm9ybS4gWW91IHdpbGwgZW5jb3VudGVyIHRoZXNlIHRlY2huaXF1ZXMgcmF0aGVyIG9mdGVuIGluIHlvdXIgb3duIHJlc2VhcmNoLiBTb21lIGV4YW1wbGVzOioKCi0gKldlIHdpbGwgY29sbGVjdCBkYXRhIHdpdGggc2VxdWVudGlhbCBhbmFseXNpcy4gRmlyc3QsIHdlIHdpbGwgZ2F0aGVyIGRhdGEgZnJvbSA0MDAgcGVvcGxlIHBlciBncm91cCBhdCBmaXJzdCBhbmQgdGVzdC4gSWYgd2UgYXJlIG5vdCBhYmxlIHRvIHJlamVjdCBIMCBhdCB0aGF0IHBvaW50LCB3ZSB3aWxsIGdhdGhlciBkYXRhIGZyb20gYWRkaWR0aW9uYWwgNDUwIHBlb3BsZSBwZXIgZ3JvdXAgYW5kIHRlc3QuIE91ciB0b3RhbCBUeXBlIDEgZXJyb3IgcmF0ZSBpcyBzZXQgdG8gMC4wNSwgYW5kIHdlIHdpbGwgY29udHJvbCBpdCB3aXRoIEJvbmZlcnJvbmkgY29ycmVjdGlvbi9Qb2NvY2sgYm91bmRhcnkvb3RoZXIgbWV0aG9kLioKCi0gKldlIHdpbGwgdGVzdCB0aGUgZGF0YSB0d28gdGltZXMuIEZpcnN0LCB3ZSB3aWxsIHVzZSBXZWxjaCdzIHQtdGVzdCB0byBjb21wYXJlIGNvbnRyb2wgYW5kIHRyZWF0bWVudCBncm91cC4gVGhlbiB3ZSB3aWxsIGNvbXBhcmUgcGVvcGxlIGJlbG93IDQwIGluIGNvbnRyb2wgYW5kIHRyZWF0bWVudCBncm91cHMuIE91ciB0b3RhbCBUeXBlIDEgZXJyb3IgcmF0ZSBpcyBzZXQgdG8gMC4wNywgYW5kIHdlIGNvbnRyb2wgaXQgd2l0aCBCb25mZXJyb25pIGNvcnJlY3Rpb24vSG9sbSBjb3JyZWN0aW9uLioKCi0gKldlIHdpbGwgdGVzdCB0aGUgZGF0YSBtdWx0aXBsZSB0aW1lcy4gV2Ugd2lsbCBkaXZpZGUgYm90aCBncm91cHMgaW4gdHdvIHBhcnRzIGFjY29yZGluZyB0byB0aGUgZm9sbG93aW5nOiBhZ2UgKGJlbG93IGFuZCBhYm92ZSA0MCksIHNvY2lvLWVjb25vbWljIHN0YXR1cyAoaW5jb21lIGJlbG93IDE1MDAwMCBLxI0gcGVyIHllYXIgcGVyIHBlcnNvbiBpbiBob3VzZWhvbGQgYW5kIGluY29tZSBhYm92ZSB0aGF0KSwgYWNoaWV2ZWQgZWR1Y2F0aW9uICh1bml2ZXJzaXR5IGRlZ3JlZSBvZiBzb21lIHNvcnQgb3Igbm90KS4gRm9yIGVhY2ggZGl2aXNpb24sIHdlIHdpbGwgY29tcGFyZSBjb3JyZXNwb25kaW5nIGNvbnRyb2wgYW5kIHRyZWF0bWVudCBncm91cHMgKGkuZS4gY29udHJvbCBiZWxvdyA0MCB3aXRoIHRyZWF0bWVudCBiZWxvdyA0MCwgY29udHJvbCBhYm92ZSA0MCBhbmQgdHJlYXRtZW50IGFib3ZlIDQwKS4gVGhhdCBtZWFucyAxMiBwLXZhbHVlcy4gV2Ugd2lsbCBjb250cm9sIGZhbHNlIGRpc2NvdmVyeSByYXRlIHdpdGggQmVuamFtaW5p4oCTSG9jaGJlcmcgcHJvY2VkdXJlIGFuZCBvdXIgY29udHJvbGxlZCAkXGFscGhhID0gMC4xNyQuKgoKIyMgQW55dGhpbmcgZWxzZSB5b3Ugd291bGQgbGlrZSB0byBwcmUtcmVnaXN0ZXI/CgoqSXMgdGhlcmUgYW55dGhpbmcgZWxzZSB0byBtZW50aW9uIGFuZCBwcmV2ZW50IHJldmlld2VycyB0byB0aGluayB5b3UgbWlzdXNlZCB0aGUgc3RhdGlzdGljcz8qCgojIyBIYXZlIGFueSBkYXRhIGJlZW4gY29sbGVjdGVkIGZvciB0aGlzIHN0dWR5IGFscmVhZHk/CgpObywgbm8gZGF0YSBoYXZlIGJlZW4gY29sbGVjdGVkIGZvciB0aGlzIHN0dWR5IHlldC4KCiMgQW5hbHlzaXMKCmBgYHtyLCBpbmNsdWRlPUZBTFNFfQojIENPTU1FTlQgVEhJUyBDSFVOSyBPVVQgV0hFTiBZT1UgQVJFIERPSU5HIFlPVVIgQU5BTFlTSVMKIyBPVEhFUldJU0UgVEhFIENPREVTIEJFTE9XIFdJTEwgTk9UIEVYRUNVVEUKa25pdHI6Om9wdHNfY2h1bmskc2V0KGV2YWwgPSBGQUxTRSkKYGBgCgoqU2V0IHRoZSBzYW1wbGUgc2l6ZSBhbmQgbG9hZCBkYXRhLioKYGBge3J9CnNhbXBsZVNpemUKY29udHJvbEZpbGUgPC0gIiIgI2NoYW5nZSB0byB0aGUgYWN0dWFsIGZpbGUgbmFtZSBvZiBjb250cm9sIGdyb3VwIGRhdGEKdHJlYXRtZW50RmlsZSA8LSAiIiAjY2hhbmdlIHRvIHRoZSBhY3R1YWwgZmlsZSBuYW1lIG9mIHRyZWF0bWVudCBncm91cCBkYXRhCgojIHJlYWQgdGhlIGRhdGEsIG9taXR0aW5nIHRoZSBmaXJzdCBsaW5lLCByZWFkaW5nIHNhbXBsZXNpemUgbnVtYmVyIG9mIGRhdGEgcG9pbnRzCmNvbnRyb2wgPC0gcmVhZC5jc3YoY29udHJvbEZpbGUsIHNraXA9MSwgbnJvd3MgPSBzYW1wbGVTaXplKzEpCmNvbnRyb2wgPC0gY29udHJvbFssMV0KdHJlYXRtZW50IDwtIHJlYWQuY3N2KHRyZWF0bWVudEZpbGUsIHNraXA9MSwgbnJvd3MgPSBzYW1wbGVTaXplKzEpCnRyZWF0bWVudCA8LSB0cmVhdG1lbnRbLDFdCmBgYAoKKkV4Y2x1ZGUgdGhlIG91dGxpZXJzLioKYGBge3J9CmNvbnRyb2xNZWFuIDwtIG1lYW4oY29udHJvbCkKY29udHJvbFNEIDwtIDE1CnRyZWF0bWVudE1lYW4gPC0gbWVhbih0cmVhdG1lbnQpCnRyZWF0bWVudFNEIDwtIHNkKHRyZWF0bWVudCkKY29udHJvbCA8LSBjb250cm9sW2NvbnRyb2wgPiBjb250cm9sTWVhbi0yLjUqY29udHJvbFNEICYgCiAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgPCBjb250cm9sTWVhbisyLjUqY29udHJvbFNEXQp0cmVhdG1lbnQgPC0gdHJlYXRtZW50W3RyZWF0bWVudCA+IHRyZWF0bWVudE1lYW4gLSAyLjUqdHJlYXRtZW50U0QgJgogICAgICAgICAgICAgICAgICAgICAgICAgdHJlYXRtZW50IDwgdHJlYXRtZW50TWVhbiArIDIuNSp0cmVhdG1lbnRTRF0KYGBgCgoqRG8gdGhlIHN0YXRpc3RpY2FsIHRlc3QuIENvbnRyb2wgeW91ciBUeXBlIDEgZXJyb3IgcmF0ZS4qCmBgYHtyfQojIGZvciB0LXRlc3QsIHlvdSBkb24ndCBuZWVkIGFueSBzcGVjaWFsIGxpYnJhcnksIGp1c3QgdHlwZSA/dC50ZXN0IGludG8gY29uc29sZSBmb3IgaGVscAojIGZvciB0ZXN0aW5nICJib3VuZGVkIiBoeXBvdGhlc2VzLCBpLmUuIHZpdGFtaW4gRSBpbmNyZWFzZXMgSVEgYnkgbW9yZSB0aGFuIHR3byBwb2ludHMsIAojICAgICB5b3UgY2FuIHVzZSBwYWNrYWdlIFRPU1RFUgojIGZvciBCb25mZXJyb25pIGNvcnJlY3Rpb24sIGp1c3QgZGl2aWRlIHlvdXIgYWxwaGEgCiMgICAgIGFfaSA8LSBhbHBoYS9udW1iZXJfb2ZfdGVzdHMgYW5kIHVzZSBhX2kgaW4gdGVzdHMKIyBmb3IgRkRSLCB0aGVyZSBpcyBsaWJyYXJ5KGFzdHNhKSBhbmQgaXRzIGZ1bmN0aW9uIEZEUiwgCiMgICAgIGxvb2sgaW50byByZWFsLXdvcmxkIGV4YW1wbGUgbm90ZWJvb2sgZm9yIGRldGFpbHMKIyBmb3Igb3RoZXIgdGVzdHMgYW5kIGNvcnJlY3Rpb25zLCB1c2UgZ29vZ2xlLCAKIyAgICAgUiBoYXMgcGFja2FnZXMgZm9yIGFsbW9zdCBldmVyeXRoaW5nCgojYmV3YXJlIHRoYXQgdGhlIG9yZGVyIG9mIHBhcmFtZXRlcnMgY29udHJvbCBhbmQgdHJlYXRtZW50IG1hdHRlcnMKI2lmIHlvdXIgZGlyZWN0aW9uIGlzICJncmVhdGVyIiwgdGhhdCBtZWFucyB5b3UgZXhwZWN0IGNvbnRyb2wgPiB0cmVhdG1lbnQgCiMgICBhbmQgeW91ciBlc3RpbWF0ZWQgZWZmZWN0IHNpemUgaXMgYSBwb3NpdGl2ZSBudW1iZXIKI2lmIHlvdXIgZGlyZWN0aW9uIGlzICJsZXNzIiwgdGhhdCBtZWFucyB5b3UgZXhwZWN0IGNvbnRyb2wgPCB0cmVhdG1lbnQgCiMgICBhbmQgeW91ciBlc3RpbWF0ZWQgZWZmZWN0IHNpemUgaXMgYSBuZWdhdGl2ZSBudW1iZXIKIyBpZiB5b3VyIGRpcmVjdGlvbiBpcyAidHdvLnNpZGVkIiwgeW91IG1hZGUgbm8gY2xhaW1zIAojICAgYWJvdXQgdGhlIGRpcmVjdGlvbiBvZiB0aGUgZWZmZWN0LCAKIyAgIHlvdSBqdXN0IHRoaW5rIHRoZSB0cmVhdG1lbnQgYW5kIGNvbnRyb2wgYXJlIG5vdCB0aGUgc2FtZQptZWFuKGNvbnRyb2wpCm1lYW4odHJlYXRtZW50KQp0ZXN0IDwtIHQudGVzdChjb250cm9sLCB5ID0gdHJlYXRtZW50LCB0eXBlID0gInR3by5zYW1wbGUiLCBhbHRlcm5hdGl2ZSA9IGRpcmVjdGlvbikKdGVzdCRwLnZhbHVlCnRlc3QkcC52YWx1ZSA8IGFscGhhCmBgYAoKCipEbyB0aGUgb3RoZXIgYW5hbHlzZXMuKgpgYGB7cn0KIyBqdXN0IGRvIHdoYXQgeW91IHByb21pc2VkIGluIHByZS1yZWdpc3RyYXRpb24KYGBgCgogIAojIEludGVycHJldGF0aW9uCgojIyBJbnRlcnByZXQgdGhlIHJlc3VsdHMuCgotICpBcmUgeW91IGFibGUgdG8gcmVqZWN0IEgwPyoKLSAqSWYgc28sIHdoYXQgdGhhdCBtZWFucz8qCi0gKklmIG5vdCwgd2hhdCB0aGF0IG1lYW5zPyoKLSAqV2hhdCBhYm91dCB0aGUgZWZmZWN0IHNpemU/IFdoYXQncyBpdHMgcHJhY3RpY2FsIHNpZ25pZmljYW5jZT8qCgoKIyMgV2hhdCB3b3VsZCBiZSB5b3VyIG5leHQgc3RlcHM/CgotICpoeXBvdGhlc2VzIHRvIGV4YW1pbmUqCi0gKnRlc3RzIHRvIGNvbmR1Y3QgKgotICpleHBsb3JhdG9yeSBhbmFseXNlcyB0byBkbyoKLSAqbGltaXRhdGlvbnMgb2YgeW91ciBzdHVkeSAoZS5nLiBzbWFsbCBzYW1wbGUgc2l6ZSkqCi0gKm1vZGlmaWNhdGlvbnMgdG8gdGhlIGZ1dHVyZSBzdHVkeSBzZXR1cCAoZS5nLiBpbmNsdWRpbmcgcG9zc2libGUgY29uZm91bmRpbmcgdmFyaWFibGVzKSoKCiMgT3B0aW9uYWwgRXhwbG9yYXRvcnkgQW5hbHlzaXMgb2YgQXZhaWxhYmxlIERhdGEKKkFsbW9zdCBhbHdheXMsIHNvbWV0aGluZyB3aWxsIHN1cnByaXNlIHlvdSBpbiB5b3VyIGV2YWx1YXRpb24gYW5kIHlvdSBoYXZlbid0IGV2ZW4gdGhvdWdodCBhYm91dCB0aGF0IHNvIGl0J3Mgbm90IGluIHlvdXIgcHJlLXJlZ2lzdHJhdGlvbi4gSXQncyBva2F5LCB3ZSBjYW4gZG8gYSBsaXR0bGUgZXhwbG9yYXRvcnkgYW5hbHlzaXMgd2l0aCBpdCwgYXMgbG9uZyBhcyB3ZSBkb24ndCBjb25zaWRlciBvdXIgaHlwb3RoZXNlcyBnZW5lcmF0ZWQgZnJvbSB0aGF0IHRvIGJlIHRydWUuIEJ1dCB5b3UgY2FuLCBmb3IgZXhhbXBsZSwgbWFrZSB5b3VyIHByZS1yZWdpc3RyYXRpb24gbW9yZSBkZXRhaWxlZCB3aGVuIHlvdSBhcmUgcmVwcm9kdWNpbmcgeW91ciBzdHVkeSBvciBkb2luZyBzb21ldGhpbmcgc2ltaWxhciBuZXh0IHRpbWUuKgoKKlNvLCBpZiB5b3UgaGF2ZSBhbnl0aGluZyB5b3Ugd291bGQgbGlrZSB0byBleGFtaW5lIGZ1cnRoZXIgaW4gZGF0YSB5b3UgaGF2ZSBhdmFpbGFibGUsIHlvdSBjYW4gZG8gc28gaGVyZS4q