library(tidyverse)
library(openintro)
library(infer)
Exercise 1
What are the counts within each category for the amount of days these students have texted while driving within the past 30 days?
# Insert code for Exercise 1 here
yrbss
## # A tibble: 13,583 x 13
## age gender grade hispanic race height weight helmet_12m text_while_driv~
## <int> <chr> <chr> <chr> <chr> <dbl> <dbl> <chr> <chr>
## 1 14 female 9 not Blac~ NA NA never 0
## 2 14 female 9 not Blac~ NA NA never <NA>
## 3 15 female 9 hispanic Nati~ 1.73 84.4 never 30
## 4 15 female 9 not Blac~ 1.6 55.8 never 0
## 5 15 female 9 not Blac~ 1.5 46.7 did not r~ did not drive
## 6 15 female 9 not Blac~ 1.57 67.1 did not r~ did not drive
## 7 15 female 9 not Blac~ 1.65 132. did not r~ <NA>
## 8 14 male 9 not Blac~ 1.88 71.2 never <NA>
## 9 15 male 9 not Blac~ 1.75 63.5 never <NA>
## 10 15 male 10 not Blac~ 1.37 97.1 did not r~ <NA>
## # ... with 13,573 more rows, and 4 more variables: physically_active_7d <int>,
## # hours_tv_per_school_day <chr>, strength_training_7d <int>,
## # school_night_hours_sleep <chr>
table (yrbss$text_while_driving_30d)
##
## 0 1-2 10-19 20-29 3-5
## 4792 925 373 298 493
## 30 6-9 did not drive
## 827 311 4646
0: 4792 1-2: 925 10-19: 373 20-29: 298 3-5: 493 30: 827 6-9: 311 did not drive: 4646
Exercise 2
What is the proportion of people who have texted while driving every day in the past 30 days and never wear helmets?
# Insert code for Exercise 2 here
yrbss %>%filter(text_while_driving_30d =="30" & helmet_12m =="never") %>%nrow()/nrow(yrbss)
## [1] 0.03408673
The proportion of people who have texted while driving every day in the past 30 days and never wear helmets is 0.03408673.
Exercise 3
What is the margin of error for the estimate of the proportion of non-helmet wearers that have texted while driving each day for the past 30 days based on this survey?
# Insert code for Exercise 3 here
p <-yrbss %>%filter(text_while_driving_30d =="30" & yrbss$helmet_12m =="never") %>%nrow()/nrow(yrbss)
ME<-1.96*sqrt(p*(1-p)/nrow(yrbss))
ME
## [1] 0.003051546
Margin of error = 0.003051546
Exercise 4
Using the infer package, calculate confidence intervals for two other categorical variables (you’ll need to decide which level to call “success”, and report the associated margins of error. Interpret the interval in context of the data. It may be helpful to create new data sets for each of the two countries first, and then use these data sets to construct the confidence intervals.
# Insert code for Exercise 4 here
table(yrbss$physically_active_7d)
##
## 0 1 2 3 4 5 6 7
## 2172 962 1270 1451 1265 1728 840 3622
n1 <-yrbss %>%filter( physically_active_7d > 6) %>%nrow(); n1
## [1] 3622
## [1] 13583
## [1] 0.2666569
ME<-1.96*sqrt(p*(1-p)/nrow(yrbss))
ME
## [1] 0.007436836
## [1] 0.2592200 0.2740937
We are testing how many people exercise everyday (success). The confidence interval for the proportion of the population who exercises every day is [ p - ME, p + ME] = 0.259 to 0.274; We are 95% confident that the true population proportion of individuals that exercise everyday is between 25.9% and 27.4%.
table(yrbss$strength_training_7d)
##
## 0 1 2 3 4 5 6 7
## 3632 1012 1305 1468 1059 1333 513 2085
n1 <-yrbss %>%filter( strength_training_7d > 3) %>%nrow(); n1
## [1] 4990
## [1] 13583
## [1] 0.367371
ME<-1.96*sqrt(p*(1-p)/nrow(yrbss))
ME
## [1] 0.008107467
## [1] 0.3592635 0.3754784
We are testing how many people do strength training more than 3 times a week (success). The confidence interval for the proportion of the population who exercises more than 3 times a week is [ p - ME, p + ME] = 0.359 to 0.375; We are 95% confident that the true population proportion of individuals that exercise everyday is between 35.9% and 37.5%.
Exercise 5
Describe the relationship between p and me. Include the margin of error vs. population proportion plot you constructed in your answer. For a given sample size, for which value of p is margin of error maximized?
# Insert code for Exercise 5 here
n <- 1000
p <- seq(from = 0, to = 1, by = 0.01)
me <- 2 * sqrt(p * (1 - p)/n)
dd <- data.frame(p = p, me = me)
ggplot(data = dd, aes(x = p, y = me)) +
geom_line() +
labs(x = "Population Proportion", y = "Margin of Error")

n <- 10
p <- seq(from = 0, to = 1, by = 0.01)
me <- 2 * sqrt(p * (1 - p)/n)
dd <- data.frame(p = p, me = me)
ggplot(data = dd, aes(x = p, y = me)) +
geom_line() +
labs(x = "Population Proportion", y = "Margin of Error")
The plot is symmetric and unimodal. It shows that the margin of error is maximized at 0.5 population proportion. The margin of error also vanishes if the population proportion is near to 0 or 1. The margin of error is inversely proportional to the square root of the sample size.
Exercise 6
Describe the sampling distribution of sample proportions at n=300 and p=0.1. Be sure to note the center, spread, and shape.
# Insert code for Exercise 6 here
set.seed(12)
n <- 300
p <- 0.1
reps = 1000
samples <- replicate(reps, rbinom(1,n,p))
hist(samples,
#ylim = c(0, 1.4),
col = "steelblue",
freq = F,
breaks = 25)
curve(dnorm(x, mean=n*p, sd=sqrt(p*(1-p)*n)),
col = "red",
lwd = "2",
add = T)

sample.proportions <- samples / n
hist(sample.proportions,
#ylim = c(0, 1.4),
col = "steelblue",
freq = F,
breaks = 25)
curve(dnorm(x, mean=p, sd=sqrt(p*(1-p)/n)),
col = "red",
lwd = "2",
add = T)

With reps = 1000, It is somewhat normally distributed. It’s center is about 0.1 or the p value.
Exercise 7
Keep n constant and change p. How does the shape, center, and spread of the sampling distribution vary as p changes. You might want to adjust min and max for the x-axis for a better view of the distribution.
# Insert code for Exercise 7 here
set.seed(1)
n <- 300
p <- 0.5
samples <- replicate(reps, rbinom(1,n,p))
hist(samples,
#ylim = c(0, 1.4),
col = "steelblue",
freq = F,
breaks = 25)
curve(dnorm(x, mean=n*p, sd=sqrt(p*(1-p)*n)),
col = "red",
lwd = "2",
add = T)

sample.proportions <- samples / n
hist(sample.proportions,
#ylim = c(0, 1.4),
col = "steelblue",
freq = F,
breaks = 25)
curve(dnorm(x, mean=p, sd=sqrt(p*(1-p)/n)),
col = "red",
lwd = "2",
add = T)

With reps = 1000, changing the p value to 0.5 creates a more normally distributed histogram. The center changes to the new p value.
Exercise 8
Now also change n. How does n appear to affect the distribution of p^?
# Insert code for Exercise 8 here
set.seed(2)
n <- 1000
p <- 0.1
samples <- replicate(reps, rbinom(1,n,p))
hist(samples,
#ylim = c(0, 1.4),
col = "steelblue",
freq = F,
breaks = 25)
curve(dnorm(x, mean=n*p, sd=sqrt(p*(1-p)*n)),
col = "red",
lwd = "2",
add = T)

sample.proportions <- samples / n
hist(sample.proportions,
#ylim = c(0, 1.4),
col = "steelblue",
freq = F,
breaks = 25)
curve(dnorm(x, mean=p, sd=sqrt(p*(1-p)/n)),
col = "red",
lwd = "2",
add = T)

with reps = 1000, making n larger made the histogram more bell shaped. The center is still 0.1 or the p value. A larger sample size makes p hat’s distribution smoother.
Exercise 9
Is there convincing evidence that those who sleep 10+ hours per day are more likely to strength train every day of the week? As always, write out the hypotheses for any tests you conduct and outline the status of the conditions for inference. If you find a significant difference, also quantify this difference with a confidence interval.
# Insert code for Exercise 9 here
yrbss %>%filter(school_night_hours_sleep >= 10 & strength_training_7d > 6) %>%nrow()/nrow(yrbss)
## [1] 0.1389973
HO: Those who sleep 10+ hours per day are more likely to strength train everyday of the week. HA: Those who sleep 10+ hours per day are not more likely to strength train everyday of the week.
Based on the p-value of 0.1389973 we would not reject the null hypothesis as it is greater than 0.05. Therefore, we can conclude that people who sleep 10+ hours per day are not more likely to strength train everyday of the week.
Exercise 10
Let’s say there has been no difference in likeliness to strength train every day of the week for those who sleep 10+ hours. What is the probability that you could detect a change (at a significance level of 0.05) simply by chance? Hint: Review the definition of the Type 1 error.
# Insert code for Exercise 10 here
#No code needed
A type I error is a false positive where we reject a true null hypothesis. 5% for alpha=0.05.
Exercise 11
Suppose you’re hired by the local government to estimate the proportion of residents that attend a religious service on a weekly basis. According to the guidelines, the estimate must have a margin of error no greater than 1% with 95% confidence. You have no idea what to expect for p. How many people would you have to sample to ensure that you are within the guidelines? Hint: Refer to your plot of the relationship between p and margin of error. This question does not require using a data set.
# Insert code for Exercise 11 here
P <-0.5
Z.alpha <-1.96
ME <-0.01
N<- Z.alpha^2*P*(1-P)/ME^2
N
## [1] 9604
A sample size of at least 9604.
LS0tDQp0aXRsZTogIkxhYiA2OkluZmVyZW5jZSBmb3IgY2F0ZWdvcmljYWwgZGF0YSINCmF1dGhvcjogIlRlcmVzYSBEb2xleSINCmRhdGU6ICJgciBTeXMuRGF0ZSgxMS85LzIwMjApIg0Kb3V0cHV0OiBvcGVuaW50cm86OmxhYl9yZXBvcnQNCi0tLQ0KDQpgYGB7ciBsb2FkLXBhY2thZ2VzLCBtZXNzYWdlPUZBTFNFfQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KG9wZW5pbnRybykNCmxpYnJhcnkoaW5mZXIpDQpgYGANCg0KDQojIyMgRXhlcmNpc2UgMQ0KDQpXaGF0IGFyZSB0aGUgY291bnRzIHdpdGhpbiBlYWNoIGNhdGVnb3J5IGZvciB0aGUgYW1vdW50IG9mIGRheXMgdGhlc2Ugc3R1ZGVudHMgaGF2ZSB0ZXh0ZWQgd2hpbGUgZHJpdmluZyB3aXRoaW4gdGhlIHBhc3QgMzAgZGF5cz8NCg0KYGBge3J9DQojIEluc2VydCBjb2RlIGZvciBFeGVyY2lzZSAxIGhlcmUNCnlyYnNzDQpgYGANCmBgYHtyfQ0KdGFibGUgKHlyYnNzJHRleHRfd2hpbGVfZHJpdmluZ18zMGQpDQpgYGANCjA6IDQ3OTINCjEtMjogOTI1DQoxMC0xOTogMzczDQoyMC0yOTogMjk4DQozLTU6IDQ5Mw0KMzA6IDgyNw0KNi05OiAzMTENCmRpZCBub3QgZHJpdmU6IDQ2NDYNCg0KIyMjIEV4ZXJjaXNlIDINCg0KV2hhdCBpcyB0aGUgcHJvcG9ydGlvbiBvZiBwZW9wbGUgd2hvIGhhdmUgdGV4dGVkIHdoaWxlIGRyaXZpbmcgZXZlcnkgZGF5IGluIHRoZSBwYXN0IDMwIGRheXMgYW5kIG5ldmVyIHdlYXIgaGVsbWV0cz8NCg0KYGBge3J9DQojIEluc2VydCBjb2RlIGZvciBFeGVyY2lzZSAyIGhlcmUNCg0KeXJic3MgJT4lZmlsdGVyKHRleHRfd2hpbGVfZHJpdmluZ18zMGQgPT0iMzAiICYgaGVsbWV0XzEybSA9PSJuZXZlciIpICU+JW5yb3coKS9ucm93KHlyYnNzKQ0KDQoNCmBgYA0KVGhlIHByb3BvcnRpb24gb2YgcGVvcGxlIHdobyBoYXZlIHRleHRlZCB3aGlsZSBkcml2aW5nIGV2ZXJ5IGRheSBpbiB0aGUgcGFzdCAzMCBkYXlzIGFuZCBuZXZlciB3ZWFyIGhlbG1ldHMgaXMgMC4wMzQwODY3My4NCg0KIyMjIEV4ZXJjaXNlIDMNCg0KV2hhdCBpcyB0aGUgbWFyZ2luIG9mIGVycm9yIGZvciB0aGUgZXN0aW1hdGUgb2YgdGhlIHByb3BvcnRpb24gb2Ygbm9uLWhlbG1ldCB3ZWFyZXJzIHRoYXQgaGF2ZSB0ZXh0ZWQgd2hpbGUgZHJpdmluZyBlYWNoIGRheSBmb3IgdGhlIHBhc3QgMzAgZGF5cyBiYXNlZCBvbiB0aGlzIHN1cnZleT8NCg0KYGBge3J9DQojIEluc2VydCBjb2RlIGZvciBFeGVyY2lzZSAzIGhlcmUNCg0KcCA8LXlyYnNzICU+JWZpbHRlcih0ZXh0X3doaWxlX2RyaXZpbmdfMzBkID09IjMwIiAmIHlyYnNzJGhlbG1ldF8xMm0gPT0ibmV2ZXIiKSAlPiVucm93KCkvbnJvdyh5cmJzcykNCg0KTUU8LTEuOTYqc3FydChwKigxLXApL25yb3coeXJic3MpKQ0KTUUNCmBgYA0KTWFyZ2luIG9mIGVycm9yID0gMC4wMDMwNTE1NDYNCg0KIyMjIEV4ZXJjaXNlIDQNCg0KVXNpbmcgdGhlIGluZmVyIHBhY2thZ2UsIGNhbGN1bGF0ZSBjb25maWRlbmNlIGludGVydmFscyBmb3IgdHdvIG90aGVyIGNhdGVnb3JpY2FsIHZhcmlhYmxlcyAoeW914oCZbGwgbmVlZCB0byBkZWNpZGUgd2hpY2ggbGV2ZWwgdG8gY2FsbCDigJxzdWNjZXNz4oCdLCBhbmQgcmVwb3J0IHRoZSBhc3NvY2lhdGVkIG1hcmdpbnMgb2YgZXJyb3IuIEludGVycHJldCB0aGUgaW50ZXJ2YWwgaW4gY29udGV4dCBvZiB0aGUgZGF0YS4gSXQgbWF5IGJlIGhlbHBmdWwgdG8gY3JlYXRlIG5ldyBkYXRhIHNldHMgZm9yIGVhY2ggb2YgdGhlIHR3byBjb3VudHJpZXMgZmlyc3QsIGFuZCB0aGVuIHVzZSB0aGVzZSBkYXRhIHNldHMgdG8gY29uc3RydWN0IHRoZSBjb25maWRlbmNlIGludGVydmFscy4NCg0KYGBge3J9DQojIEluc2VydCBjb2RlIGZvciBFeGVyY2lzZSA0IGhlcmUNCg0KdGFibGUoeXJic3MkcGh5c2ljYWxseV9hY3RpdmVfN2QpDQoNCm4xIDwteXJic3MgJT4lZmlsdGVyKCBwaHlzaWNhbGx5X2FjdGl2ZV83ZCA+IDYpICU+JW5yb3coKTsgbjENCm4gPSBucm93KHlyYnNzKTsgbg0KcCA8LSBuMS9uOyBwDQoNCk1FPC0xLjk2KnNxcnQocCooMS1wKS9ucm93KHlyYnNzKSkNCk1FDQoNCmMocCAtIE1FLCBwICsgTUUpDQpgYGAgDQpXZSBhcmUgdGVzdGluZyBob3cgbWFueSBwZW9wbGUgZXhlcmNpc2UgZXZlcnlkYXkgKHN1Y2Nlc3MpLiBUaGUgY29uZmlkZW5jZSBpbnRlcnZhbCBmb3IgdGhlIHByb3BvcnRpb24gb2YgdGhlIHBvcHVsYXRpb24gd2hvIGV4ZXJjaXNlcyBldmVyeSBkYXkgaXMgWyBwIC0gTUUsIHAgKyBNRV0gPSAwLjI1OSB0byAwLjI3NDsgV2UgYXJlIDk1JSBjb25maWRlbnQgdGhhdCB0aGUgdHJ1ZSBwb3B1bGF0aW9uIHByb3BvcnRpb24gb2YgaW5kaXZpZHVhbHMgdGhhdCBleGVyY2lzZSBldmVyeWRheSBpcyBiZXR3ZWVuIDI1LjklIGFuZCAyNy40JS4NCg0KYGBge3J9DQoNCnRhYmxlKHlyYnNzJHN0cmVuZ3RoX3RyYWluaW5nXzdkKQ0KbjEgPC15cmJzcyAlPiVmaWx0ZXIoIHN0cmVuZ3RoX3RyYWluaW5nXzdkID4gMykgJT4lbnJvdygpOyBuMQ0KbiA9IG5yb3coeXJic3MpOyBuDQpwIDwtIG4xL247IHANCg0KTUU8LTEuOTYqc3FydChwKigxLXApL25yb3coeXJic3MpKQ0KTUUNCmMocCAtIE1FLCBwICsgTUUpDQpgYGANCldlIGFyZSB0ZXN0aW5nIGhvdyBtYW55IHBlb3BsZSBkbyBzdHJlbmd0aCB0cmFpbmluZyBtb3JlIHRoYW4gMyB0aW1lcyBhIHdlZWsgKHN1Y2Nlc3MpLg0KVGhlIGNvbmZpZGVuY2UgaW50ZXJ2YWwgZm9yIHRoZSBwcm9wb3J0aW9uIG9mIHRoZSBwb3B1bGF0aW9uIHdobyBleGVyY2lzZXMgbW9yZSB0aGFuIDMgdGltZXMgYSB3ZWVrIGlzIFsgcCAtIE1FLCBwICsgTUVdID0gMC4zNTkgdG8gMC4zNzU7IFdlIGFyZSA5NSUgY29uZmlkZW50IHRoYXQgdGhlIHRydWUgcG9wdWxhdGlvbiBwcm9wb3J0aW9uIG9mIGluZGl2aWR1YWxzIHRoYXQgZXhlcmNpc2UgZXZlcnlkYXkgaXMgYmV0d2VlbiAzNS45JSBhbmQgMzcuNSUuDQoNCiMjIyBFeGVyY2lzZSA1DQoNCkRlc2NyaWJlIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBwIGFuZCBtZS4gSW5jbHVkZSB0aGUgbWFyZ2luIG9mIGVycm9yIHZzLiBwb3B1bGF0aW9uIHByb3BvcnRpb24gcGxvdCB5b3UgY29uc3RydWN0ZWQgaW4geW91ciBhbnN3ZXIuIEZvciBhIGdpdmVuIHNhbXBsZSBzaXplLCBmb3Igd2hpY2ggdmFsdWUgb2YgcCBpcyBtYXJnaW4gb2YgZXJyb3IgbWF4aW1pemVkPw0KDQpgYGB7cn0NCiMgSW5zZXJ0IGNvZGUgZm9yIEV4ZXJjaXNlIDUgaGVyZQ0KbiA8LSAxMDAwDQpwIDwtIHNlcShmcm9tID0gMCwgdG8gPSAxLCBieSA9IDAuMDEpDQptZSA8LSAyICogc3FydChwICogKDEgLSBwKS9uKQ0KZGQgPC0gZGF0YS5mcmFtZShwID0gcCwgbWUgPSBtZSkNCmdncGxvdChkYXRhID0gZGQsIGFlcyh4ID0gcCwgeSA9IG1lKSkgKyANCiAgZ2VvbV9saW5lKCkgKw0KICBsYWJzKHggPSAiUG9wdWxhdGlvbiBQcm9wb3J0aW9uIiwgeSA9ICJNYXJnaW4gb2YgRXJyb3IiKQ0KbiA8LSAxMA0KcCA8LSBzZXEoZnJvbSA9IDAsIHRvID0gMSwgYnkgPSAwLjAxKQ0KbWUgPC0gMiAqIHNxcnQocCAqICgxIC0gcCkvbikNCmRkIDwtIGRhdGEuZnJhbWUocCA9IHAsIG1lID0gbWUpDQpnZ3Bsb3QoZGF0YSA9IGRkLCBhZXMoeCA9IHAsIHkgPSBtZSkpICsgDQogIGdlb21fbGluZSgpICsNCiAgbGFicyh4ID0gIlBvcHVsYXRpb24gUHJvcG9ydGlvbiIsIHkgPSAiTWFyZ2luIG9mIEVycm9yIikNCmBgYA0KVGhlIHBsb3QgaXMgc3ltbWV0cmljIGFuZCB1bmltb2RhbC4gSXQgc2hvd3MgdGhhdCB0aGUgbWFyZ2luIG9mIGVycm9yIGlzIG1heGltaXplZCBhdCAwLjUgcG9wdWxhdGlvbiBwcm9wb3J0aW9uLiBUaGUgbWFyZ2luIG9mIGVycm9yIGFsc28gdmFuaXNoZXMgaWYgdGhlIHBvcHVsYXRpb24gcHJvcG9ydGlvbiBpcyBuZWFyIHRvIDAgb3IgMS4gVGhlIG1hcmdpbiBvZiBlcnJvciBpcyBpbnZlcnNlbHkgcHJvcG9ydGlvbmFsIHRvIHRoZSBzcXVhcmUgcm9vdCBvZiB0aGUgc2FtcGxlIHNpemUuDQoNCiMjIyBFeGVyY2lzZSA2DQoNCkRlc2NyaWJlIHRoZSBzYW1wbGluZyBkaXN0cmlidXRpb24gb2Ygc2FtcGxlIHByb3BvcnRpb25zIGF0IG49MzAwIGFuZCBwPTAuMS4gQmUgc3VyZSB0byBub3RlIHRoZSBjZW50ZXIsIHNwcmVhZCwgYW5kIHNoYXBlLg0KDQpgYGB7cn0NCiMgSW5zZXJ0IGNvZGUgZm9yIEV4ZXJjaXNlIDYgaGVyZQ0Kc2V0LnNlZWQoMTIpDQpuIDwtIDMwMCANCnAgPC0gMC4xDQpyZXBzID0gMTAwMA0Kc2FtcGxlcyA8LSByZXBsaWNhdGUocmVwcywgcmJpbm9tKDEsbixwKSkNCmhpc3Qoc2FtcGxlcywNCiAgICAgI3lsaW0gPSBjKDAsIDEuNCksDQogICAgIGNvbCA9ICJzdGVlbGJsdWUiLA0KICAgICBmcmVxID0gRiwNCiAgICAgYnJlYWtzID0gMjUpDQpjdXJ2ZShkbm9ybSh4LCBtZWFuPW4qcCwgc2Q9c3FydChwKigxLXApKm4pKSwNCiAgICAgIGNvbCA9ICJyZWQiLA0KICAgICAgbHdkID0gIjIiLA0KICAgICAgYWRkID0gVCkNCg0Kc2FtcGxlLnByb3BvcnRpb25zIDwtIHNhbXBsZXMgLyBuDQpoaXN0KHNhbXBsZS5wcm9wb3J0aW9ucywNCiAgICAgI3lsaW0gPSBjKDAsIDEuNCksDQogICAgIGNvbCA9ICJzdGVlbGJsdWUiLA0KICAgICBmcmVxID0gRiwNCiAgICAgYnJlYWtzID0gMjUpDQpjdXJ2ZShkbm9ybSh4LCBtZWFuPXAsIHNkPXNxcnQocCooMS1wKS9uKSksDQogICAgICBjb2wgPSAicmVkIiwNCiAgICAgIGx3ZCA9ICIyIiwNCiAgICAgIGFkZCA9IFQpDQoNCmBgYA0KDQpXaXRoIHJlcHMgPSAxMDAwLCBJdCBpcyBzb21ld2hhdCBub3JtYWxseSBkaXN0cmlidXRlZC4gSXQncyBjZW50ZXIgaXMgYWJvdXQgMC4xIG9yIHRoZSBwIHZhbHVlLg0KDQojIyMgRXhlcmNpc2UgNw0KDQpLZWVwIG4gY29uc3RhbnQgYW5kIGNoYW5nZSBwLiBIb3cgZG9lcyB0aGUgc2hhcGUsIGNlbnRlciwgYW5kIHNwcmVhZCBvZiB0aGUgc2FtcGxpbmcgZGlzdHJpYnV0aW9uIHZhcnkgYXMgcCBjaGFuZ2VzLiBZb3UgbWlnaHQgd2FudCB0byBhZGp1c3QgbWluIGFuZCBtYXggZm9yIHRoZSB4LWF4aXMgZm9yIGEgYmV0dGVyIHZpZXcgb2YgdGhlIGRpc3RyaWJ1dGlvbi4NCg0KYGBge3IgfQ0KIyBJbnNlcnQgY29kZSBmb3IgRXhlcmNpc2UgNyBoZXJlDQpzZXQuc2VlZCgxKQ0KbiA8LSAzMDAgDQpwIDwtIDAuNQ0Kc2FtcGxlcyA8LSByZXBsaWNhdGUocmVwcywgcmJpbm9tKDEsbixwKSkNCmhpc3Qoc2FtcGxlcywNCiAgICAgI3lsaW0gPSBjKDAsIDEuNCksDQogICAgIGNvbCA9ICJzdGVlbGJsdWUiLA0KICAgICBmcmVxID0gRiwNCiAgICAgYnJlYWtzID0gMjUpDQpjdXJ2ZShkbm9ybSh4LCBtZWFuPW4qcCwgc2Q9c3FydChwKigxLXApKm4pKSwNCiAgICAgIGNvbCA9ICJyZWQiLA0KICAgICAgbHdkID0gIjIiLA0KICAgICAgYWRkID0gVCkNCg0Kc2FtcGxlLnByb3BvcnRpb25zIDwtIHNhbXBsZXMgLyBuDQpoaXN0KHNhbXBsZS5wcm9wb3J0aW9ucywNCiAgICAgI3lsaW0gPSBjKDAsIDEuNCksDQogICAgIGNvbCA9ICJzdGVlbGJsdWUiLA0KICAgICBmcmVxID0gRiwNCiAgICAgYnJlYWtzID0gMjUpDQpjdXJ2ZShkbm9ybSh4LCBtZWFuPXAsIHNkPXNxcnQocCooMS1wKS9uKSksDQogICAgICBjb2wgPSAicmVkIiwNCiAgICAgIGx3ZCA9ICIyIiwNCiAgICAgIGFkZCA9IFQpDQpgYGANCg0KV2l0aCByZXBzID0gMTAwMCwgY2hhbmdpbmcgdGhlIHAgdmFsdWUgdG8gMC41IGNyZWF0ZXMgYSBtb3JlIG5vcm1hbGx5IGRpc3RyaWJ1dGVkIGhpc3RvZ3JhbS4gVGhlIGNlbnRlciBjaGFuZ2VzIHRvIHRoZSBuZXcgcCB2YWx1ZS4NCg0KIyMjIEV4ZXJjaXNlIDgNCg0KTm93IGFsc28gY2hhbmdlIG4uIEhvdyBkb2VzIG4gYXBwZWFyIHRvIGFmZmVjdCB0aGUgZGlzdHJpYnV0aW9uIG9mIHBePw0KDQpgYGB7cn0NCiMgSW5zZXJ0IGNvZGUgZm9yIEV4ZXJjaXNlIDggaGVyZQ0Kc2V0LnNlZWQoMikNCm4gPC0gMTAwMCANCnAgPC0gMC4xDQpzYW1wbGVzIDwtIHJlcGxpY2F0ZShyZXBzLCByYmlub20oMSxuLHApKQ0KaGlzdChzYW1wbGVzLA0KICAgICAjeWxpbSA9IGMoMCwgMS40KSwNCiAgICAgY29sID0gInN0ZWVsYmx1ZSIsDQogICAgIGZyZXEgPSBGLA0KICAgICBicmVha3MgPSAyNSkNCmN1cnZlKGRub3JtKHgsIG1lYW49bipwLCBzZD1zcXJ0KHAqKDEtcCkqbikpLA0KICAgICAgY29sID0gInJlZCIsDQogICAgICBsd2QgPSAiMiIsDQogICAgICBhZGQgPSBUKQ0KDQpzYW1wbGUucHJvcG9ydGlvbnMgPC0gc2FtcGxlcyAvIG4NCmhpc3Qoc2FtcGxlLnByb3BvcnRpb25zLA0KICAgICAjeWxpbSA9IGMoMCwgMS40KSwNCiAgICAgY29sID0gInN0ZWVsYmx1ZSIsDQogICAgIGZyZXEgPSBGLA0KICAgICBicmVha3MgPSAyNSkNCmN1cnZlKGRub3JtKHgsIG1lYW49cCwgc2Q9c3FydChwKigxLXApL24pKSwNCiAgICAgIGNvbCA9ICJyZWQiLA0KICAgICAgbHdkID0gIjIiLA0KICAgICAgYWRkID0gVCkNCmBgYA0KDQp3aXRoIHJlcHMgPSAxMDAwLCBtYWtpbmcgbiBsYXJnZXIgbWFkZSB0aGUgaGlzdG9ncmFtIG1vcmUgYmVsbCBzaGFwZWQuIFRoZSBjZW50ZXIgaXMgc3RpbGwgMC4xIG9yIHRoZSBwIHZhbHVlLiBBIGxhcmdlciBzYW1wbGUgc2l6ZSBtYWtlcyBwIGhhdCdzIGRpc3RyaWJ1dGlvbiBzbW9vdGhlci4NCg0KIyMjIEV4ZXJjaXNlIDkNCg0KSXMgdGhlcmUgY29udmluY2luZyBldmlkZW5jZSB0aGF0IHRob3NlIHdobyBzbGVlcCAxMCsgaG91cnMgcGVyIGRheSBhcmUgbW9yZSBsaWtlbHkgdG8gc3RyZW5ndGggdHJhaW4gZXZlcnkgZGF5IG9mIHRoZSB3ZWVrPyBBcyBhbHdheXMsIHdyaXRlIG91dCB0aGUgaHlwb3RoZXNlcyBmb3IgYW55IHRlc3RzIHlvdSBjb25kdWN0IGFuZCBvdXRsaW5lIHRoZSBzdGF0dXMgb2YgdGhlIGNvbmRpdGlvbnMgZm9yIGluZmVyZW5jZS4gSWYgeW91IGZpbmQgYSBzaWduaWZpY2FudCBkaWZmZXJlbmNlLCBhbHNvIHF1YW50aWZ5IHRoaXMgZGlmZmVyZW5jZSB3aXRoIGEgY29uZmlkZW5jZSBpbnRlcnZhbC4NCg0KYGBge3J9DQojIEluc2VydCBjb2RlIGZvciBFeGVyY2lzZSA5IGhlcmUNCnlyYnNzICU+JWZpbHRlcihzY2hvb2xfbmlnaHRfaG91cnNfc2xlZXAgPj0gMTAgJiBzdHJlbmd0aF90cmFpbmluZ183ZCA+IDYpICU+JW5yb3coKS9ucm93KHlyYnNzKQ0KDQpgYGANCkhPOiBUaG9zZSB3aG8gc2xlZXAgMTArIGhvdXJzIHBlciBkYXkgYXJlIG1vcmUgbGlrZWx5IHRvIHN0cmVuZ3RoIHRyYWluIGV2ZXJ5ZGF5IG9mIHRoZSB3ZWVrLg0KSEE6IFRob3NlIHdobyBzbGVlcCAxMCsgaG91cnMgcGVyIGRheSBhcmUgbm90IG1vcmUgbGlrZWx5IHRvIHN0cmVuZ3RoIHRyYWluIGV2ZXJ5ZGF5IG9mIHRoZSB3ZWVrLg0KDQpCYXNlZCBvbiB0aGUgcC12YWx1ZSBvZiAwLjEzODk5NzMgd2Ugd291bGQgbm90IHJlamVjdCB0aGUgbnVsbCBoeXBvdGhlc2lzIGFzIGl0IGlzIGdyZWF0ZXIgdGhhbiAwLjA1LiBUaGVyZWZvcmUsIHdlIGNhbiBjb25jbHVkZSB0aGF0IHBlb3BsZSB3aG8gc2xlZXAgMTArIGhvdXJzIHBlciBkYXkgYXJlIG5vdCBtb3JlIGxpa2VseSB0byBzdHJlbmd0aCB0cmFpbiBldmVyeWRheSBvZiB0aGUgd2Vlay4NCg0KDQojIyMgRXhlcmNpc2UgMTANCg0KTGV04oCZcyBzYXkgdGhlcmUgaGFzIGJlZW4gbm8gZGlmZmVyZW5jZSBpbiBsaWtlbGluZXNzIHRvIHN0cmVuZ3RoIHRyYWluIGV2ZXJ5IGRheSBvZiB0aGUgd2VlayBmb3IgdGhvc2Ugd2hvIHNsZWVwIDEwKyBob3Vycy4gV2hhdCBpcyB0aGUgcHJvYmFiaWxpdHkgdGhhdCB5b3UgY291bGQgZGV0ZWN0IGEgY2hhbmdlIChhdCBhIHNpZ25pZmljYW5jZSBsZXZlbCBvZiAwLjA1KSBzaW1wbHkgYnkgY2hhbmNlPyBIaW50OiBSZXZpZXcgdGhlIGRlZmluaXRpb24gb2YgdGhlIFR5cGUgMSBlcnJvci4NCg0KYGBge3J9DQojIEluc2VydCBjb2RlIGZvciBFeGVyY2lzZSAxMCBoZXJlDQojTm8gY29kZSBuZWVkZWQNCmBgYA0KDQpBIHR5cGUgSSBlcnJvciBpcyBhIGZhbHNlIHBvc2l0aXZlIHdoZXJlIHdlIHJlamVjdCBhIHRydWUgbnVsbCBoeXBvdGhlc2lzLiA1JSBmb3IgYWxwaGE9MC4wNS4NCg0KIyMjIEV4ZXJjaXNlIDExDQoNClN1cHBvc2UgeW914oCZcmUgaGlyZWQgYnkgdGhlIGxvY2FsIGdvdmVybm1lbnQgdG8gZXN0aW1hdGUgdGhlIHByb3BvcnRpb24gb2YgcmVzaWRlbnRzIHRoYXQgYXR0ZW5kIGEgcmVsaWdpb3VzIHNlcnZpY2Ugb24gYSB3ZWVrbHkgYmFzaXMuIEFjY29yZGluZyB0byB0aGUgZ3VpZGVsaW5lcywgdGhlIGVzdGltYXRlIG11c3QgaGF2ZSBhIG1hcmdpbiBvZiBlcnJvciBubyBncmVhdGVyIHRoYW4gMSUgd2l0aCA5NSUgY29uZmlkZW5jZS4gWW91IGhhdmUgbm8gaWRlYSB3aGF0IHRvIGV4cGVjdCBmb3IgcC4gSG93IG1hbnkgcGVvcGxlIHdvdWxkIHlvdSBoYXZlIHRvIHNhbXBsZSB0byBlbnN1cmUgdGhhdCB5b3UgYXJlIHdpdGhpbiB0aGUgZ3VpZGVsaW5lcz8NCkhpbnQ6IFJlZmVyIHRvIHlvdXIgcGxvdCBvZiB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gcCBhbmQgbWFyZ2luIG9mIGVycm9yLiBUaGlzIHF1ZXN0aW9uIGRvZXMgbm90IHJlcXVpcmUgdXNpbmcgYSBkYXRhIHNldC4NCg0KYGBge3J9DQojIEluc2VydCBjb2RlIGZvciBFeGVyY2lzZSAxMSBoZXJlDQpQIDwtMC41DQpaLmFscGhhIDwtMS45Ng0KTUUgPC0wLjAxDQpOPC0gWi5hbHBoYV4yKlAqKDEtUCkvTUVeMg0KTg0KYGBgDQpBIHNhbXBsZSBzaXplIG9mIGF0IGxlYXN0IDk2MDQuDQo=