- REVIEW OF RSTUDIO BASICS
- CHAPTER 0: PDFs and CDFs and THE BINOMIAL DISTRIBUTION
- CHAPTER 1: PARAMETRIC TEST ON THE MEAN VS. NONPARAMETRIC TEST ON THE MEDIAN
INITIAL INFO ABOUT R NOTEBOOK
This is an R Markdown Notebook. When you execute code within the notebook, the results appear beneath the code.
Try executing this chunk by clicking the Run button within the chunk or by placing your cursor inside it and pressing Ctrl+Shift+Enter.
plot(cars)
Add a new chunk by clicking the Insert Chunk button on the toolbar or by pressing Ctrl+Alt+I.
When you save the notebook, an HTML file containing the code and output will be saved alongside it (click the Preview button or press Ctrl+Shift+K to preview the HTML file).
The preview shows you a rendered HTML copy of the contents of the editor. Consequently, unlike Knit, Preview does not run any R code chunks. Instead, the output of the chunk when it was last run in the editor is displayed.
======= SETTING A WORKING DIRECTORY
To end R code type the left single quote found under the tilde in the top left key of your keyboard.
## (The pound sign is for comments)
getwd() ### see what the current working directory is
[1] "C:/Users/shardy/Dropbox/Nonparametrics/BarneyLectureCode"
###setwd("C:/Users/bbarney2/Desktop") ### I changed the working directory to this folder
#setwd("C:\Users\shardy\Dropbox\Nonparametrics\\BarneyLectureCode") ### I changed the working directory to this folder
R CAN DO ARITHMETIC CALCULATIONS
5*8 ### just demonstrating five times eight
[1] 40
exp(-3^2) #### just demonstrating e^(-9)
[1] 0.0001234098
PRINTING DATA SETS: HEAD AND TAIL COMMANDS
Iris is a data set built into R.
iris ### One of the pre-installed data sets in R--this displays all of the data in iris
head(iris) ### Displaying the first six rows of the iris data set.
tail(iris) ###Displaying the last 6 rows of the data set.
str(iris) ### Information about the structure of iris
'data.frame': 150 obs. of 5 variables:
$ Sepal.Length: num 5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
$ Sepal.Width : num 3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
$ Petal.Length: num 1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
$ Petal.Width : num 0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
$ Species : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...
CREATING A HISTOGRAM IN R
hist(iris$Petal.Length) #### A histogram of the Petal.Length variable of the iris data set

CREATING A NEW VARIABLE
iris$Petal.Ratio <- iris$Petal.Length/iris$Petal.Width ### creating a new variable in the iris data set
head(iris) ### Again looking at the first several rows of iris
CREATING A BOXPLOT IN R
boxplot(iris$Petal.Ratio) ###Making a boxplot of my new variable

CALCULATING A MEAN
mean(iris$Petal.Ratio) ## Calculating the average of the Petal.Ratio variable
[1] 4.3105
PARAMETRIC T- TEST ON H0: mu=90 and Ha: mu not equal to 90
msas.expected <- c(85,120,70,95,85,60,85,90,80,90,70,50,125,95,100,60,85) ### in-class data
### on student guesses of the expected MSAS salary five years after graduation
msas.expected[1:5] ### displaying the first five numbers
[1] 85 120 70 95 85
length(msas.expected) ## 17 values
[1] 17
mean(msas.expected) ### the average
[1] 85
median(msas.expected) ### the median
[1] 85
sd(msas.expected) #### the standard deviation, s
[1] 19.76424
## PARAMETRIC T-TEST BY HAND
### the standard t-test for the mean if H0: mu=90 and Ha: mu not equal to 90
(85-90)/(19.76424/sqrt(17)) #### the test statistic for testing H0: mu=90 vs. HA: mu not equal to 90, which is about -1.04
[1] -1.043072
pvalue <- 2*(pt(-1.043072,16)) ### If assumptions hold, then the distribution of the test statistic is t with df=n-1=16 if the null hypothesis is actually true.
### Thus, I compute 2*Pr(T <= -1.04)
pvalue ### displaying the value stored as pvalue
[1] 0.3124198
#PARAMETRIC TEST WITH T.TEST PROCEDURE IN R
### Above was a hand calculation. Compare to the pvalue and parametric t test in R
t.test(msas.expected,mu=90)
One Sample t-test
data: msas.expected
t = -1.0431, df = 16, p-value = 0.3124
alternative hypothesis: true mean is not equal to 90
95 percent confidence interval:
74.83817 95.16183
sample estimates:
mean of x
85
NONPARAMETRIC TEST OF THE MEDIAN
H0: median=90 vs. Ha: median > 90 (note the one-sided nature of this test)
##### NON-PARAMETRIC TEST OF THE MEDIAN
# BINOMIAL TEST OF THE MEDIAN
#### H0: median=90 vs. Ha: median > 90 (note the one-sided nature of this test)
#### sort the values
sort(msas.expected)
[1] 50 60 60 70 70 80 85 85 85 85 90 90 95 95 100 120
[17] 125
CALCULATING THE SAMPLE SIZE (leave out the number of observations that equal the median) The two values in the sample data that exactly equal the null value are ignored. That leaves n=15 values that don’t equal the null median.
If the median were really 90, the chance of any given value exceeding 90 would be .5. Assuming “independence” of the 15 values, which seems reasonable, the count for how many of the 15 values exceed 90 would have a Binomial(n=15,p=.5) distribution if H0 is true.
BINOMIAL DISTRIBUTION Side Note: Among other properties, then, we would have expected half of these 15 values (or 7.5) to exceed 90, with a standard deviation of sqrt(np(1-p))=sqrt(15.5(1-.5))=sqrt(3.75), or about 1.94
TEST STATISTIC The test statistic: how many of the 15 values actually exceeded the null median of 90?
5 values exceed the null median of 90
P-VALUE Test statistic is 5. p-value=? The p-value is the chance of obtaining a test statistic at least as extreme as the observed test statistic if H0 is true.
Because Ha: median GREATER than 90, then what is considered “at least as extreme”?
The reasoning goes like this: if Ha is true, then the chance of any one value being above 90 would be even more than 0.5. Which would mean we would have on average even more than 7.5 of 15 values exceeding 90. Which suggests that in this instance (i.e., with Ha: median EXCEEDS null value), extremity is indicated by getting even LARGER values of the test statistic. So the p-value = Pr (X>= test statistic), where X~Binom(15,.5)
We need Pr(X>=5), and below I show three ways to compute this–each of them work fine.
pbinom(4,15,.5,lower=FALSE) ### Pr(X>4), which matches what we want: Pr(X>= 5)
[1] 0.9407654
1-pbinom(4,15,.5) ### 1-Pr(X<=4), which matches what we want: Pr(X>=5)
[1] 0.9407654
sum(dbinom(5:15,15,.5)) #### Pr(X>=5) by adding Pr(X=5)+Pr(X=6)+Pr(X=7)+...+Pr(X=15)
[1] 0.9407654
?pbinom ## If you want to bring up the help page for the pbinom function.
### The p-value is 0.941, which is not statistically significant. (Not even a little bit)
PLOTTING A PROBABILITY DISTRIBUTION
### The probabilities for each possible value of the test statistic if H0 is true:
### (we'll revisit this on Monday, June 6th).
plot(0:15,dbinom(0:15,15,.5))

LS0tDQp0aXRsZTogIkNoYXB0ZXIgMCINCm91dHB1dDoNCiAgaHRtbF9ub3RlYm9vazogZGVmYXVsdA0KICBwZGZfZG9jdW1lbnQ6IGRlZmF1bHQNCi0tLQ0KX19fX19fX19fX19fX19fX19fX19fX19fX18NCg0KSS4gICBSRVZJRVcgT0YgUlNUVURJTyBCQVNJQ1MNCklJLiAgIENIQVBURVIgMDogUERGcyBhbmQgQ0RGcyBhbmQgVEhFIEJJTk9NSUFMIERJU1RSSUJVVElPTg0KSUlJLiAgIENIQVBURVIgMTogUEFSQU1FVFJJQyBURVNUIE9OIFRIRSBNRUFOIFZTLiBOT05QQVJBTUVUUklDIFRFU1QgT04gVEhFIE1FRElBTg0KYGBge3J9DQpgYGANCl9fX19fX19fX19fX19fX19fDQoNCl9fX19fX19fXw0KSU5JVElBTCBJTkZPIEFCT1VUIFIgTk9URUJPT0sNCmBgYHtyfQ0KDQpgYGANCg0KVGhpcyBpcyBhbiBbUiBNYXJrZG93bl0oaHR0cDovL3JtYXJrZG93bi5yc3R1ZGlvLmNvbSkgTm90ZWJvb2suIFdoZW4geW91IGV4ZWN1dGUgY29kZSB3aXRoaW4gdGhlIG5vdGVib29rLCB0aGUgcmVzdWx0cyBhcHBlYXIgYmVuZWF0aCB0aGUgY29kZS4gDQoNClRyeSBleGVjdXRpbmcgdGhpcyBjaHVuayBieSBjbGlja2luZyB0aGUgKlJ1biogYnV0dG9uIHdpdGhpbiB0aGUgY2h1bmsgb3IgYnkgcGxhY2luZyB5b3VyIGN1cnNvciBpbnNpZGUgaXQgYW5kIHByZXNzaW5nICpDdHJsK1NoaWZ0K0VudGVyKi4gDQoNCmBgYHtyfQ0KcGxvdChjYXJzKQ0KYGBgDQoNCkFkZCBhIG5ldyBjaHVuayBieSBjbGlja2luZyB0aGUgKkluc2VydCBDaHVuayogYnV0dG9uIG9uIHRoZSB0b29sYmFyIG9yIGJ5IHByZXNzaW5nICpDdHJsK0FsdCtJKi4NCg0KV2hlbiB5b3Ugc2F2ZSB0aGUgbm90ZWJvb2ssIGFuIEhUTUwgZmlsZSBjb250YWluaW5nIHRoZSBjb2RlIGFuZCBvdXRwdXQgd2lsbCBiZSBzYXZlZCBhbG9uZ3NpZGUgaXQgKGNsaWNrIHRoZSAqUHJldmlldyogYnV0dG9uIG9yIHByZXNzICpDdHJsK1NoaWZ0K0sqIHRvIHByZXZpZXcgdGhlIEhUTUwgZmlsZSkuDQoNClRoZSBwcmV2aWV3IHNob3dzIHlvdSBhIHJlbmRlcmVkIEhUTUwgY29weSBvZiB0aGUgY29udGVudHMgb2YgdGhlIGVkaXRvci4gQ29uc2VxdWVudGx5LCB1bmxpa2UgKktuaXQqLCAqUHJldmlldyogZG9lcyBub3QgcnVuIGFueSBSIGNvZGUgY2h1bmtzLiBJbnN0ZWFkLCB0aGUgb3V0cHV0IG9mIHRoZSBjaHVuayB3aGVuIGl0IHdhcyBsYXN0IHJ1biBpbiB0aGUgZWRpdG9yIGlzIGRpc3BsYXllZC4NCg0KYGBge3J9DQoNCmBgYA0KPT09PT09PQ0KU0VUVElORyBBIFdPUktJTkcgRElSRUNUT1JZDQoNClRvIGVuZCBSIGNvZGUgdHlwZSB0aGUgbGVmdCBzaW5nbGUgcXVvdGUgZm91bmQgdW5kZXIgdGhlIHRpbGRlIGluIHRoZSB0b3AgbGVmdCBrZXkgb2YgeW91ciBrZXlib2FyZC4NCmBgYHtyfQ0KIyMgKFRoZSBwb3VuZCBzaWduIGlzIGZvciBjb21tZW50cykgDQpnZXR3ZCgpICAgIyMjIHNlZSB3aGF0IHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IGlzIA0KIyMjc2V0d2QoIkM6L1VzZXJzL2JiYXJuZXkyL0Rlc2t0b3AiKSAgICMjIyBJIGNoYW5nZWQgdGhlIHdvcmtpbmcgZGlyZWN0b3J5IHRvIHRoaXMgZm9sZGVyDQojc2V0d2QoIkM6XFVzZXJzXHNoYXJkeVxEcm9wYm94XE5vbnBhcmFtZXRyaWNzXFxCYXJuZXlMZWN0dXJlQ29kZSIpICAgIyMjIEkgY2hhbmdlZCB0aGUgd29ya2luZyBkaXJlY3RvcnkgdG8gdGhpcyBmb2xkZXINCmBgYA0KX19fX19fX19fX19fX18NClIgQ0FOIERPIEFSSVRITUVUSUMgQ0FMQ1VMQVRJT05TDQoNCmBgYHtyfQ0KNSo4ICAgIyMjIGp1c3QgZGVtb25zdHJhdGluZyBmaXZlIHRpbWVzIGVpZ2h0DQpleHAoLTNeMikgICAjIyMjIGp1c3QgZGVtb25zdHJhdGluZyBlXigtOSkNCg0KYGBgDQpfX19fX19fX19fX19fX19fX19fDQpQUklOVElORyBEQVRBIFNFVFM6IEhFQUQgQU5EIFRBSUwgQ09NTUFORFMNCg0KSXJpcyBpcyBhIGRhdGEgc2V0IGJ1aWx0IGludG8gUi4NCmBgYHtyfQ0KaXJpcyAgICAgIyMjIE9uZSBvZiB0aGUgcHJlLWluc3RhbGxlZCBkYXRhIHNldHMgaW4gUi0tdGhpcyBkaXNwbGF5cyBhbGwgb2YgdGhlIGRhdGEgaW4gaXJpcw0KaGVhZChpcmlzKSAgICMjIyBEaXNwbGF5aW5nIHRoZSBmaXJzdCBzaXggcm93cyBvZiB0aGUgaXJpcyBkYXRhIHNldC4NCnRhaWwoaXJpcykgICAjIyNEaXNwbGF5aW5nIHRoZSBsYXN0IDYgcm93cyBvZiB0aGUgZGF0YSBzZXQuDQpzdHIoaXJpcykgICAgIyMjIEluZm9ybWF0aW9uIGFib3V0IHRoZSBzdHJ1Y3R1cmUgb2YgaXJpcw0KYGBgDQpDUkVBVElORyBBIEhJU1RPR1JBTSBJTiBSDQoNCmBgYHtyfQ0KaGlzdChpcmlzJFBldGFsLkxlbmd0aCkgICAgIyMjIyBBIGhpc3RvZ3JhbSBvZiB0aGUgUGV0YWwuTGVuZ3RoIHZhcmlhYmxlIG9mIHRoZSBpcmlzIGRhdGEgc2V0DQpgYGANCl9fX19fX19fX19fX19fX19fXw0KQ1JFQVRJTkcgQSBORVcgVkFSSUFCTEUNCg0KYGBge3J9DQppcmlzJFBldGFsLlJhdGlvIDwtIGlyaXMkUGV0YWwuTGVuZ3RoL2lyaXMkUGV0YWwuV2lkdGggICAjIyMgY3JlYXRpbmcgYSBuZXcgdmFyaWFibGUgaW4gdGhlIGlyaXMgZGF0YSBzZXQNCmhlYWQoaXJpcykgICMjIyBBZ2FpbiBsb29raW5nIGF0IHRoZSBmaXJzdCBzZXZlcmFsIHJvd3Mgb2YgaXJpcw0KYGBgDQpfX19fX19fX19fX19fX19fDQpDUkVBVElORyBBIEJPWFBMT1QgSU4gUg0KDQpgYGB7cn0NCmJveHBsb3QoaXJpcyRQZXRhbC5SYXRpbykgICAjIyNNYWtpbmcgYSBib3hwbG90IG9mIG15IG5ldyB2YXJpYWJsZQ0KYGBgDQpfX19fX19fX19fX18NCkNBTENVTEFUSU5HIEEgTUVBTg0KYGBge3J9DQptZWFuKGlyaXMkUGV0YWwuUmF0aW8pICAgICAgIyMgQ2FsY3VsYXRpbmcgdGhlIGF2ZXJhZ2Ugb2YgdGhlIFBldGFsLlJhdGlvIHZhcmlhYmxlDQpgYGANCl9fX19fX19fX19fX19fX19fXw0KPGNlbnRlcj5QQVJBTUVUUklDIFQtIFRFU1QgT04gIEgwOiBtdT05MCBhbmQgSGE6IG11IG5vdCBlcXVhbCB0byA5MDwvY2VudGVyPg0KDQpgYGB7cn0NCm1zYXMuZXhwZWN0ZWQgPC0gYyg4NSwxMjAsNzAsOTUsODUsNjAsODUsOTAsODAsOTAsNzAsNTAsMTI1LDk1LDEwMCw2MCw4NSkgICMjIyBpbi1jbGFzcyBkYXRhDQogICAgICAgICAgICAgICAgICAgICAgICMjIyBvbiBzdHVkZW50IGd1ZXNzZXMgb2YgdGhlIGV4cGVjdGVkIE1TQVMgc2FsYXJ5IGZpdmUgeWVhcnMgYWZ0ZXIgZ3JhZHVhdGlvbg0KDQptc2FzLmV4cGVjdGVkWzE6NV0gICAgIyMjIGRpc3BsYXlpbmcgdGhlIGZpcnN0IGZpdmUgbnVtYmVycw0KbGVuZ3RoKG1zYXMuZXhwZWN0ZWQpICAgICAjIyAxNyB2YWx1ZXMNCm1lYW4obXNhcy5leHBlY3RlZCkgICAjIyMgdGhlIGF2ZXJhZ2UNCm1lZGlhbihtc2FzLmV4cGVjdGVkKSAgICMjIyB0aGUgbWVkaWFuDQpzZChtc2FzLmV4cGVjdGVkKSAgICAjIyMjIHRoZSBzdGFuZGFyZCBkZXZpYXRpb24sIHMNCg0KIyMgUEFSQU1FVFJJQyBULVRFU1QgQlkgSEFORA0KIyMjIHRoZSBzdGFuZGFyZCB0LXRlc3QgZm9yIHRoZSBtZWFuIGlmIEgwOiBtdT05MCBhbmQgSGE6IG11IG5vdCBlcXVhbCB0byA5MA0KDQooODUtOTApLygxOS43NjQyNC9zcXJ0KDE3KSkgICAgIyMjIyB0aGUgdGVzdCBzdGF0aXN0aWMgZm9yIHRlc3RpbmcgSDA6IG11PTkwIHZzLiBIQTogbXUgbm90IGVxdWFsIHRvIDkwLCB3aGljaCBpcyBhYm91dCAtMS4wNA0KDQpwdmFsdWUgPC0gMioocHQoLTEuMDQzMDcyLDE2KSkgICAjIyMgSWYgYXNzdW1wdGlvbnMgaG9sZCwgdGhlbiB0aGUgZGlzdHJpYnV0aW9uIG9mIHRoZSB0ZXN0IHN0YXRpc3RpYyBpcyB0IHdpdGggZGY9bi0xPTE2IGlmIHRoZSBudWxsIGh5cG90aGVzaXMgaXMgYWN0dWFsbHkgdHJ1ZS4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIyMgVGh1cywgSSBjb21wdXRlIDIqUHIoVCA8PSAgIC0xLjA0KQ0KcHZhbHVlICAgIyMjIGRpc3BsYXlpbmcgdGhlIHZhbHVlIHN0b3JlZCBhcyBwdmFsdWUNCg0KI1BBUkFNRVRSSUMgVEVTVCBXSVRIIFQuVEVTVCBQUk9DRURVUkUgSU4gUg0KIyMjIEFib3ZlIHdhcyBhIGhhbmQgY2FsY3VsYXRpb24uIENvbXBhcmUgdG8gdGhlIHB2YWx1ZSBhbmQgcGFyYW1ldHJpYyB0IHRlc3QgaW4gUg0KdC50ZXN0KG1zYXMuZXhwZWN0ZWQsbXU9OTApDQpgYGANCl9fX19fX19fX19fX19fX19fDQo8Y2VudGVyPk5PTlBBUkFNRVRSSUMgVEVTVCBPRiBUSEUgTUVESUFOPC9jZW50ZXI+DQo8Y2VudGVyPkgwOiBtZWRpYW49OTAgdnMuIEhhOiBtZWRpYW4gPiA5MCAobm90ZSB0aGUgb25lLXNpZGVkIG5hdHVyZSBvZiB0aGlzIHRlc3QpPC9jZW50ZXI+DQoNCmBgYHtyfQ0KIyMjIyMgTk9OLVBBUkFNRVRSSUMgVEVTVCBPRiBUSEUgTUVESUFODQojICAgICAgICAgICAgICAgICAgICAgIEJJTk9NSUFMIFRFU1QgT0YgVEhFIE1FRElBTiANCg0KIyMjIyBIMDogbWVkaWFuPTkwIHZzLiBIYTogbWVkaWFuID4gOTAgKG5vdGUgdGhlIG9uZS1zaWRlZCBuYXR1cmUgb2YgdGhpcyB0ZXN0KQ0KDQojIyMjIHNvcnQgdGhlIHZhbHVlcw0Kc29ydChtc2FzLmV4cGVjdGVkKSANCmBgYA0KX19fX19fX19fX18NCkNBTENVTEFUSU5HIFRIRSBTQU1QTEUgU0laRSAobGVhdmUgb3V0IHRoZSBudW1iZXIgb2Ygb2JzZXJ2YXRpb25zIHRoYXQgZXF1YWwgdGhlIG1lZGlhbikNClRoZSB0d28gdmFsdWVzIGluIHRoZSBzYW1wbGUgZGF0YSB0aGF0IGV4YWN0bHkgZXF1YWwgdGhlIG51bGwgdmFsdWUgYXJlIGlnbm9yZWQuIFRoYXQgbGVhdmVzIG49MTUgdmFsdWVzIHRoYXQgZG9uJ3QgZXF1YWwgdGhlIG51bGwgbWVkaWFuLg0KDQpJZiB0aGUgbWVkaWFuIHdlcmUgcmVhbGx5IDkwLCB0aGUgY2hhbmNlIG9mIGFueSBnaXZlbiB2YWx1ZSBleGNlZWRpbmcgOTAgd291bGQgYmUgLjUuIEFzc3VtaW5nICJpbmRlcGVuZGVuY2UiIG9mIHRoZSAxNSB2YWx1ZXMsIHdoaWNoIHNlZW1zIHJlYXNvbmFibGUsIHRoZSBjb3VudCBmb3IgaG93IG1hbnkgb2YgdGhlIDE1IHZhbHVlcyBleGNlZWQgOTAgd291bGQgaGF2ZSBhIEJpbm9taWFsKG49MTUscD0uNSkgZGlzdHJpYnV0aW9uIGlmIEgwIGlzIHRydWUuDQoNCkJJTk9NSUFMIERJU1RSSUJVVElPTg0KU2lkZSBOb3RlOiBBbW9uZyBvdGhlciBwcm9wZXJ0aWVzLCB0aGVuLCB3ZSB3b3VsZCBoYXZlIGV4cGVjdGVkIGhhbGYgb2YgdGhlc2UgMTUgdmFsdWVzIChvciA3LjUpIHRvIGV4Y2VlZCA5MCwgd2l0aCBhIHN0YW5kYXJkIGRldmlhdGlvbiBvZg0Kc3FydChucCgxLXApKT1zcXJ0KDE1Ki41KigxLS41KSk9c3FydCgzLjc1KSwgb3IgYWJvdXQgMS45NA0KDQpURVNUIFNUQVRJU1RJQw0KVGhlIHRlc3Qgc3RhdGlzdGljOiBob3cgbWFueSBvZiB0aGUgMTUgdmFsdWVzIGFjdHVhbGx5IGV4Y2VlZGVkIHRoZSBudWxsIG1lZGlhbiBvZiA5MD8NCjxjZW50ZXI+NSB2YWx1ZXMgZXhjZWVkIHRoZSBudWxsIG1lZGlhbiBvZiA5MDwvY2VudGVyPg0KDQpQLVZBTFVFDQpUZXN0IHN0YXRpc3RpYyBpcyA1LiBwLXZhbHVlPT8NClRoZSBwLXZhbHVlIGlzIHRoZSBjaGFuY2Ugb2Ygb2J0YWluaW5nIGEgdGVzdCBzdGF0aXN0aWMgYXQgbGVhc3QgYXMgZXh0cmVtZSBhcyB0aGUgb2JzZXJ2ZWQgdGVzdCBzdGF0aXN0aWMgaWYgSDAgaXMgdHJ1ZS4gIA0KDQpCZWNhdXNlIEhhOiBtZWRpYW4gR1JFQVRFUiB0aGFuIDkwLCB0aGVuIHdoYXQgaXMgY29uc2lkZXJlZCAiYXQgbGVhc3QgYXMgZXh0cmVtZSI/DQoNClRoZSByZWFzb25pbmcgZ29lcyBsaWtlIHRoaXM6IGlmIEhhIGlzIHRydWUsIHRoZW4gdGhlIGNoYW5jZSBvZiBhbnkgb25lIHZhbHVlIGJlaW5nIGFib3ZlIDkwIHdvdWxkIGJlIGV2ZW4gbW9yZSB0aGFuIDAuNS4gV2hpY2ggd291bGQgbWVhbiB3ZSB3b3VsZCBoYXZlIG9uIGF2ZXJhZ2UgZXZlbiBtb3JlIHRoYW4gNy41IG9mIDE1IHZhbHVlcyBleGNlZWRpbmcgOTAuIFdoaWNoIHN1Z2dlc3RzIHRoYXQgaW4gdGhpcyBpbnN0YW5jZSAoaS5lLiwgd2l0aCBIYTogbWVkaWFuIEVYQ0VFRFMgbnVsbCB2YWx1ZSksIA0KZXh0cmVtaXR5IGlzIGluZGljYXRlZCBieSBnZXR0aW5nIGV2ZW4gTEFSR0VSIHZhbHVlcyBvZiB0aGUgdGVzdCBzdGF0aXN0aWMuIFNvIHRoZSBwLXZhbHVlID0gUHIgKFg+PSB0ZXN0IHN0YXRpc3RpYyksIHdoZXJlIFh+Qmlub20oMTUsLjUpDQoNCldlIG5lZWQgUHIoWD49NSksIGFuZCBiZWxvdyBJIHNob3cgdGhyZWUgd2F5cyB0byBjb21wdXRlIHRoaXMtLWVhY2ggb2YgdGhlbSB3b3JrIGZpbmUuDQpgYGB7cn0NCnBiaW5vbSg0LDE1LC41LGxvd2VyPUZBTFNFKSAgIyMjIFByKFg+NCksIHdoaWNoIG1hdGNoZXMgd2hhdCB3ZSB3YW50OiBQcihYPj0gNSkNCg0KMS1wYmlub20oNCwxNSwuNSkgICAjIyMgMS1QcihYPD00KSwgd2hpY2ggbWF0Y2hlcyB3aGF0IHdlIHdhbnQ6IFByKFg+PTUpDQoNCnN1bShkYmlub20oNToxNSwxNSwuNSkpICAjIyMjIFByKFg+PTUpIGJ5IGFkZGluZyBQcihYPTUpK1ByKFg9NikrUHIoWD03KSsuLi4rUHIoWD0xNSkNCg0KP3BiaW5vbSAgICAgIyMgSWYgeW91IHdhbnQgdG8gYnJpbmcgdXAgdGhlIGhlbHAgcGFnZSBmb3IgdGhlIHBiaW5vbSBmdW5jdGlvbi4NCg0KIyMjIFRoZSBwLXZhbHVlIGlzIDAuOTQxLCB3aGljaCBpcyBub3Qgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudC4gKE5vdCBldmVuIGEgbGl0dGxlIGJpdCkNCmBgYA0KX19fX19fX19fX19fDQpQTE9UVElORyBBIFBST0JBQklMSVRZIERJU1RSSUJVVElPTg0KYGBge3J9DQojIyMgVGhlIHByb2JhYmlsaXRpZXMgZm9yIGVhY2ggcG9zc2libGUgdmFsdWUgb2YgdGhlIHRlc3Qgc3RhdGlzdGljIGlmIEgwIGlzIHRydWU6DQojIyMgICh3ZSdsbCByZXZpc2l0IHRoaXMgb24gTW9uZGF5LCBKdW5lIDZ0aCkuDQpwbG90KDA6MTUsZGJpbm9tKDA6MTUsMTUsLjUpKQ0KYGBg