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?

0 — 4792 1-2 — 925 3-5 — 493 6-9 — 311 10-19 — 373 20-29 — 298 30 — 827 did not drive — 4646 NA — 918

library(dplyr)
yrbss |>
  count(text_while_driving_30d)
## # A tibble: 9 × 2
##   text_while_driving_30d     n
##   <chr>                  <int>
## 1 0                       4792
## 2 1-2                      925
## 3 10-19                    373
## 4 20-29                    298
## 5 3-5                      493
## 6 30                       827
## 7 6-9                      311
## 8 did not drive           4646
## 9 <NA>                     918
ggplot(yrbss, aes(x=text_while_driving_30d)) +
  geom_bar(fill='red') +  labs(x='Team') +
  labs(title = "Texting While Driving the Past 30 Days")

Exercise 2

What is the proportion of people who have texted while driving every day in the past 30 days and never wear helmets?

0.07214901 is the proportion of people who texted while driving all 30 days and never wore helmets.

allTextingAndNoHelmet <- nrow(yrbss[(yrbss$helmet_12m == 'never') & (yrbss$text_while_driving_30d == '30'), ])
totalPeople <- nrow(yrbss)
prop <- allTextingAndNoHelmet / totalPeople
prop
## [1] 0.07214901

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?

0.004440036 is the margin of error for the yrbss survey’s non-helmet wearers that texted while driving the past 30 days.

marginOfError <- 2 * sqrt(prop * (1 - prop)/totalPeople)
marginOfError
## [1] 0.004440036

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. Interpet 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.

Confidence Interval for less than 1 hour of TV per school day: (0.2951302, 0.3102341) Confidence Interval for American Indian or Alaska Native: (0.0267211, 0.03349415)

set.seed(12345)

yrbss <-
  yrbss |>
  mutate(lowTV = ifelse((hours_tv_per_school_day == "<1") | (hours_tv_per_school_day == "do not watch") , "yes", "no"))
yrbss |>
  filter(!is.na(lowTV)) |>
  specify(response = lowTV, success = "yes") |>
  generate(reps = 1000, type = "bootstrap") |>
  calculate(stat = "prop") |>
  get_ci(level = 0.95)
## # A tibble: 1 × 2
##   lower_ci upper_ci
##      <dbl>    <dbl>
## 1    0.295    0.310
yrbss <-
  yrbss |>
  mutate(amerIndianAlaskaNative = ifelse(race == "American Indian or Alaska Native" , "yes", "no"))
yrbss |>
  filter(!is.na(amerIndianAlaskaNative)) |>
  specify(response = amerIndianAlaskaNative, success = "yes") |>
  generate(reps = 1000, type = "bootstrap") |>
  calculate(stat = "prop") |>
  get_ci(level = 0.95)
## # A tibble: 1 × 2
##   lower_ci upper_ci
##      <dbl>    <dbl>
## 1   0.0267   0.0335

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?

p and me have a parabolic distribution. The margin of error is highest when p has a value of 0.50.

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(title = "Margin of Error for Population Proportions",
       x = "Population Proportion", y = "Margin of Error")

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.

The center is near 0.1. The spread is from about 0.05 to 0.15. The shape is a bell-curve but with two peaks close together.

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.

The shape and spread remained about the same, but the center shifted closer to the new p. 

Exercise 8

Now also change n. How does n appear to affect the distribution of p-hat?

When p was constant and n decreased, the spread got wider and the center remained about the same. The shape was also similar.

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.

H0: People who sleep 10+ hours strength train every day at the same percentage as people who sleep less than 10 hours. HA: People who sleep 10+ hours strength train every day more often than people who sleep less than 10 hours.

The two groups did not sleep the same. People who slept 10+ hours had a higher percentage of people strength training every day of the week. Therefore, I would reject the null hypothesis. The confidence interval is (0.005210003, 0.008257855). Since 0 is not part of the range, I would say the results support the alternate hypothesis. However, 0 is very close to the range, so I would want more evidence to claim the alternate hypothesis is true. It does not seem to be a significant difference.

set.seed(1001)
tenPlusStrength <- 
  yrbss |>
  filter(school_night_hours_sleep == "10+") |>
  count(strength_training_7d)

tenPlusStrength |>
  mutate(percent = tenPlusStrength$n / sum(tenPlusStrength$n))
## # A tibble: 9 × 3
##   strength_training_7d     n percent
##                  <int> <int>   <dbl>
## 1                    0   100  0.316 
## 2                    1    17  0.0538
## 3                    2    31  0.0981
## 4                    3    31  0.0981
## 5                    4    18  0.0570
## 6                    5    23  0.0728
## 7                    6     8  0.0253
## 8                    7    84  0.266 
## 9                   NA     4  0.0127
noTenPlusStrength <-
  yrbss |>
  filter(school_night_hours_sleep != "10+") |>
  count(strength_training_7d)

noTenPlusStrength |>
  mutate(percent = noTenPlusStrength$n / sum(noTenPlusStrength$n))
## # A tibble: 9 × 3
##   strength_training_7d     n percent
##                  <int> <int>   <dbl>
## 1                    0  3484 0.290  
## 2                    1   979 0.0815 
## 3                    2  1260 0.105  
## 4                    3  1418 0.118  
## 5                    4  1027 0.0854 
## 6                    5  1289 0.107  
## 7                    6   492 0.0409 
## 8                    7  1958 0.163  
## 9                   NA   112 0.00932
yrbss <-
  yrbss |>
  mutate(strengthTraning = ifelse((strength_training_7d == "7") & (school_night_hours_sleep == "10+") , "yes", "no"))
yrbss |>
  filter(!is.na(strengthTraning)) |>
  specify(response = strengthTraning, success = "yes") |>
  generate(reps = 1000, type = "bootstrap") |>
  calculate(stat = "prop") |>
  get_ci(level = 0.95)
## # A tibble: 1 × 2
##   lower_ci upper_ci
##      <dbl>    <dbl>
## 1  0.00521  0.00826

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 probablity 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.

Since the significance level is 0.05, the probability of a type 1 error is 5%.

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 dataset.

9604 people

#Z * Z * p * (1 - p) / ME^2
Z <- 1.96
p <- 0.5
ME <- 0.01
(Z * Z * p * (1 - p)) / (ME * ME)
## [1] 9604
LS0tDQp0aXRsZTogIkxhYiA2OiBJbmZlcmVuY2UgZm9yIENhdGVnb3JpY2FsIERhdGEiDQphdXRob3I6ICJKdWxpYSBGZXJyaXMiDQpkYXRlOiAiYHIgU3lzLkRhdGUoKWAiDQpvdXRwdXQ6IG9wZW5pbnRybzo6bGFiX3JlcG9ydA0KLS0tDQoNCmBgYHtyIGxvYWQtcGFja2FnZXMsIG1lc3NhZ2U9RkFMU0V9DQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkob3BlbmludHJvKQ0KbGlicmFyeShpbmZlcikNCmBgYA0KDQojIyBFeGVyY2lzZSAxDQojIyMgV2hhdCBhcmUgdGhlIGNvdW50cyB3aXRoaW4gZWFjaCBjYXRlZ29yeSBmb3IgdGhlIGFtb3VudCBvZiBkYXlzIHRoZXNlIHN0dWRlbnRzIGhhdmUgdGV4dGVkIHdoaWxlIGRyaXZpbmcgd2l0aGluIHRoZSBwYXN0IDMwIGRheXM/DQoNCjAgICAgICAgICAgICAgLS0tIDQ3OTINCjEtMiAgICAgICAgICAgLS0tIDkyNQ0KMy01ICAgICAgICAgICAtLS0gNDkzDQo2LTkgICAgICAgICAgIC0tLSAzMTENCjEwLTE5ICAgICAgICAgLS0tIDM3Mw0KMjAtMjkgICAgICAgICAtLS0gMjk4DQozMCAgICAgICAgICAgIC0tLSA4MjcNCmRpZCBub3QgZHJpdmUgLS0tIDQ2NDYNCk5BICAgICAgICAgICAgLS0tIDkxOA0KDQpgYGB7ciB2aWV3LWdpcmxzLWNvdW50c30NCmxpYnJhcnkoZHBseXIpDQp5cmJzcyB8Pg0KICBjb3VudCh0ZXh0X3doaWxlX2RyaXZpbmdfMzBkKQ0KZ2dwbG90KHlyYnNzLCBhZXMoeD10ZXh0X3doaWxlX2RyaXZpbmdfMzBkKSkgKw0KICBnZW9tX2JhcihmaWxsPSdyZWQnKSArICBsYWJzKHg9J1RlYW0nKSArDQogIGxhYnModGl0bGUgPSAiVGV4dGluZyBXaGlsZSBEcml2aW5nIHRoZSBQYXN0IDMwIERheXMiKQ0KYGBgDQoNCg0KIyMgRXhlcmNpc2UgMg0KIyMjIFdoYXQgaXMgdGhlIHByb3BvcnRpb24gb2YgcGVvcGxlIHdobyBoYXZlIHRleHRlZCB3aGlsZSBkcml2aW5nIGV2ZXJ5IGRheSBpbiB0aGUgcGFzdCAzMCBkYXlzIGFuZCBuZXZlciB3ZWFyIGhlbG1ldHM/DQoNCjAuMDcyMTQ5MDEgaXMgdGhlIHByb3BvcnRpb24gb2YgcGVvcGxlIHdobyB0ZXh0ZWQgd2hpbGUgZHJpdmluZyBhbGwgMzAgZGF5cyBhbmQgbmV2ZXIgd29yZSBoZWxtZXRzLg0KDQpgYGB7ciB0cmVuZC1naXJsc30NCmFsbFRleHRpbmdBbmROb0hlbG1ldCA8LSBucm93KHlyYnNzWyh5cmJzcyRoZWxtZXRfMTJtID09ICduZXZlcicpICYgKHlyYnNzJHRleHRfd2hpbGVfZHJpdmluZ18zMGQgPT0gJzMwJyksIF0pDQp0b3RhbFBlb3BsZSA8LSBucm93KHlyYnNzKQ0KcHJvcCA8LSBhbGxUZXh0aW5nQW5kTm9IZWxtZXQgLyB0b3RhbFBlb3BsZQ0KcHJvcA0KYGBgDQoNCg0KIyMgRXhlcmNpc2UgMw0KIyMjIFdoYXQgaXMgdGhlIG1hcmdpbiBvZiBlcnJvciBmb3IgdGhlIGVzdGltYXRlIG9mIHRoZSBwcm9wb3J0aW9uIG9mIG5vbi1oZWxtZXQgd2VhcmVycyB0aGF0IGhhdmUgdGV4dGVkIHdoaWxlIGRyaXZpbmcgZWFjaCBkYXkgZm9yIHRoZSBwYXN0IDMwIGRheXMgYmFzZWQgb24gdGhpcyBzdXJ2ZXk/DQoNCjAuMDA0NDQwMDM2IGlzIHRoZSBtYXJnaW4gb2YgZXJyb3IgZm9yIHRoZSB5cmJzcyBzdXJ2ZXkncyBub24taGVsbWV0IHdlYXJlcnMgdGhhdCB0ZXh0ZWQgd2hpbGUgZHJpdmluZyB0aGUgcGFzdCAzMCBkYXlzLg0KDQpgYGB7ciBwbG90LXByb3AtYm95cy1hcmJ1dGhub3R9DQptYXJnaW5PZkVycm9yIDwtIDIgKiBzcXJ0KHByb3AgKiAoMSAtIHByb3ApL3RvdGFsUGVvcGxlKQ0KbWFyZ2luT2ZFcnJvcg0KYGBgDQoNCg0KIyMgRXhlcmNpc2UgNA0KIyMjIFVzaW5nIHRoZSBpbmZlciBwYWNrYWdlLCBjYWxjdWxhdGUgY29uZmlkZW5jZSBpbnRlcnZhbHMgZm9yIHR3byBvdGhlciBjYXRlZ29yaWNhbCB2YXJpYWJsZXMgKHlvdSdsbCBuZWVkIHRvIGRlY2lkZSB3aGljaCBsZXZlbCB0byBjYWxsICJzdWNjZXNzIiwgYW5kIHJlcG9ydCB0aGUgYXNzb2NpYXRlZCBtYXJnaW5zIG9mIGVycm9yLiBJbnRlcnBldCB0aGUgaW50ZXJ2YWwgaW4gY29udGV4dCBvZiB0aGUgZGF0YS4gSXQgbWF5IGJlIGhlbHBmdWwgdG8gY3JlYXRlIG5ldyBkYXRhIHNldHMgZm9yIGVhY2ggb2YgdGhlIHR3byBjb3VudHJpZXMgZmlyc3QsIGFuZCB0aGVuIHVzZSB0aGVzZSBkYXRhIHNldHMgdG8gY29uc3RydWN0IHRoZSBjb25maWRlbmNlIGludGVydmFscy4NCg0KQ29uZmlkZW5jZSBJbnRlcnZhbCBmb3IgbGVzcyB0aGFuIDEgaG91ciBvZiBUViBwZXIgc2Nob29sIGRheTogKDAuMjk1MTMwMiwgMC4zMTAyMzQxKQ0KQ29uZmlkZW5jZSBJbnRlcnZhbCBmb3IgQW1lcmljYW4gSW5kaWFuIG9yIEFsYXNrYSBOYXRpdmU6ICAgICAgKDAuMDI2NzIxMSwgMC4wMzM0OTQxNSkNCg0KYGBge3IgZGltLXByZXNlbnR9DQpzZXQuc2VlZCgxMjM0NSkNCg0KeXJic3MgPC0NCiAgeXJic3MgfD4NCiAgbXV0YXRlKGxvd1RWID0gaWZlbHNlKChob3Vyc190dl9wZXJfc2Nob29sX2RheSA9PSAiPDEiKSB8IChob3Vyc190dl9wZXJfc2Nob29sX2RheSA9PSAiZG8gbm90IHdhdGNoIikgLCAieWVzIiwgIm5vIikpDQp5cmJzcyB8Pg0KICBmaWx0ZXIoIWlzLm5hKGxvd1RWKSkgfD4NCiAgc3BlY2lmeShyZXNwb25zZSA9IGxvd1RWLCBzdWNjZXNzID0gInllcyIpIHw+DQogIGdlbmVyYXRlKHJlcHMgPSAxMDAwLCB0eXBlID0gImJvb3RzdHJhcCIpIHw+DQogIGNhbGN1bGF0ZShzdGF0ID0gInByb3AiKSB8Pg0KICBnZXRfY2kobGV2ZWwgPSAwLjk1KQ0KDQp5cmJzcyA8LQ0KICB5cmJzcyB8Pg0KICBtdXRhdGUoYW1lckluZGlhbkFsYXNrYU5hdGl2ZSA9IGlmZWxzZShyYWNlID09ICJBbWVyaWNhbiBJbmRpYW4gb3IgQWxhc2thIE5hdGl2ZSIgLCAieWVzIiwgIm5vIikpDQp5cmJzcyB8Pg0KICBmaWx0ZXIoIWlzLm5hKGFtZXJJbmRpYW5BbGFza2FOYXRpdmUpKSB8Pg0KICBzcGVjaWZ5KHJlc3BvbnNlID0gYW1lckluZGlhbkFsYXNrYU5hdGl2ZSwgc3VjY2VzcyA9ICJ5ZXMiKSB8Pg0KICBnZW5lcmF0ZShyZXBzID0gMTAwMCwgdHlwZSA9ICJib290c3RyYXAiKSB8Pg0KICBjYWxjdWxhdGUoc3RhdCA9ICJwcm9wIikgfD4NCiAgZ2V0X2NpKGxldmVsID0gMC45NSkNCmBgYA0KDQoNCiMjIEV4ZXJjaXNlIDUNCiMjIyBEZXNjcmliZSB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gcCBhbmQgbWUuIEluY2x1ZGUgdGhlIG1hcmdpbiBvZiBlcnJvciB2cy4gcG9wdWxhdGlvbiBwcm9wb3J0aW9uIHBsb3QgeW91IGNvbnN0cnVjdGVkIGluIHlvdXIgYW5zd2VyLiBGb3IgYSBnaXZlbiBzYW1wbGUgc2l6ZSwgZm9yIHdoaWNoIHZhbHVlIG9mIHAgaXMgbWFyZ2luIG9mIGVycm9yIG1heGltaXplZD8NCg0KcCBhbmQgbWUgaGF2ZSBhIHBhcmFib2xpYyBkaXN0cmlidXRpb24uIFRoZSBtYXJnaW4gb2YgZXJyb3IgaXMgaGlnaGVzdCB3aGVuIHAgaGFzIGEgdmFsdWUgb2YgMC41MC4NCg0KYGBge3IgY291bnQtY29tcGFyZX0NCm4gPC0gMTAwMA0KcCA8LSBzZXEoZnJvbSA9IDAsIHRvID0gMSwgYnkgPSAwLjAxKQ0KbWUgPC0gMiAqIHNxcnQocCAqICgxIC0gcCkvbikNCmRkIDwtIGRhdGEuZnJhbWUocCA9IHAsIG1lID0gbWUpDQpnZ3Bsb3QoZGF0YSA9IGRkLCBhZXMoeCA9IHAsIHkgPSBtZSkpICsgDQogIGdlb21fbGluZSgpICsNCiAgbGFicyh0aXRsZSA9ICJNYXJnaW4gb2YgRXJyb3IgZm9yIFBvcHVsYXRpb24gUHJvcG9ydGlvbnMiLA0KICAgICAgIHggPSAiUG9wdWxhdGlvbiBQcm9wb3J0aW9uIiwgeSA9ICJNYXJnaW4gb2YgRXJyb3IiKQ0KYGBgDQoNCg0KIyMgRXhlcmNpc2UgNg0KIyMjIERlc2NyaWJlIHRoZSBzYW1wbGluZyBkaXN0cmlidXRpb24gb2Ygc2FtcGxlIHByb3BvcnRpb25zIGF0IG4gPSAzMDAgYW5kIHAgPSAwLjEuIEJlIHN1cmUgdG8gbm90ZSB0aGUgY2VudGVyLCBzcHJlYWQsIGFuZCBzaGFwZS4NCg0KVGhlIGNlbnRlciBpcyBuZWFyIDAuMS4gVGhlIHNwcmVhZCBpcyBmcm9tIGFib3V0IDAuMDUgdG8gMC4xNS4gVGhlIHNoYXBlIGlzIGEgYmVsbC1jdXJ2ZSBidXQgd2l0aCB0d28gcGVha3MgY2xvc2UgdG9nZXRoZXIuDQoNCg0KIyMgRXhlcmNpc2UgNw0KIyMjIEtlZXAgbiBjb25zdGFudCBhbmQgY2hhbmdlIHAuIEhvdyBkb2VzIHRoZSBzaGFwZSwgY2VudGVyLCBhbmQgc3ByZWFkIG9mIHRoZSBzYW1wbGluZyBkaXN0cmlidXRpb24gdmFyeSBhcyBwIGNoYW5nZXMuIFlvdSBtaWdodCB3YW50IHRvIGFkanVzdCBtaW4gYW5kIG1heCBmb3IgdGhlIHgtYXhpcyBmb3IgYSBiZXR0ZXIgdmlldyBvZiB0aGUgZGlzdHJpYnV0aW9uLg0KDQpUaGUgc2hhcGUgYW5kIHNwcmVhZCByZW1haW5lZCBhYm91dCB0aGUgc2FtZSwgYnV0IHRoZSBjZW50ZXIgc2hpZnRlZCBjbG9zZXIgdG8gdGhlIG5ldyBwLiANCg0KDQojIyBFeGVyY2lzZSA4DQojIyMgTm93IGFsc28gY2hhbmdlIG4uIEhvdyBkb2VzIG4gYXBwZWFyIHRvIGFmZmVjdCB0aGUgZGlzdHJpYnV0aW9uIG9mIHAtaGF0Pw0KDQpXaGVuIHAgd2FzIGNvbnN0YW50IGFuZCBuIGRlY3JlYXNlZCwgdGhlIHNwcmVhZCBnb3Qgd2lkZXIgYW5kIHRoZSBjZW50ZXIgcmVtYWluZWQgYWJvdXQgdGhlIHNhbWUuIFRoZSBzaGFwZSB3YXMgYWxzbyBzaW1pbGFyLg0KDQoNCiMjIEV4ZXJjaXNlIDkNCiMjIyBJcyB0aGVyZSBjb252aW5jaW5nIGV2aWRlbmNlIHRoYXQgdGhvc2Ugd2hvIHNsZWVwIDEwKyBob3VycyBwZXIgZGF5IGFyZSBtb3JlIGxpa2VseSB0byBzdHJlbmd0aCB0cmFpbiBldmVyeSBkYXkgb2YgdGhlIHdlZWs/IEFzIGFsd2F5cywgd3JpdGUgb3V0IHRoZSBoeXBvdGhlc2VzIGZvciBhbnkgdGVzdHMgeW91IGNvbmR1Y3QgYW5kIG91dGxpbmUgdGhlIHN0YXR1cyBvZiB0aGUgY29uZGl0aW9ucyBmb3IgaW5mZXJlbmNlLiBJZiB5b3UgZmluZCBhIHNpZ25pZmljYW50IGRpZmZlcmVuY2UsIGFsc28gcXVhbnRpZnkgdGhpcyBkaWZmZXJlbmNlIHdpdGggYSBjb25maWRlbmNlIGludGVydmFsLg0KDQpIMDogUGVvcGxlIHdobyBzbGVlcCAxMCsgaG91cnMgc3RyZW5ndGggdHJhaW4gZXZlcnkgZGF5IGF0IHRoZSBzYW1lIHBlcmNlbnRhZ2UgYXMgcGVvcGxlIHdobyBzbGVlcCBsZXNzIHRoYW4gMTAgaG91cnMuDQpIQTogUGVvcGxlIHdobyBzbGVlcCAxMCsgaG91cnMgc3RyZW5ndGggdHJhaW4gZXZlcnkgZGF5IG1vcmUgb2Z0ZW4gdGhhbiBwZW9wbGUgd2hvIHNsZWVwIGxlc3MgdGhhbiAxMCBob3Vycy4NCg0KVGhlIHR3byBncm91cHMgZGlkIG5vdCBzbGVlcCB0aGUgc2FtZS4gUGVvcGxlIHdobyBzbGVwdCAxMCsgaG91cnMgaGFkIGEgaGlnaGVyIHBlcmNlbnRhZ2Ugb2YgcGVvcGxlIHN0cmVuZ3RoIHRyYWluaW5nIGV2ZXJ5IGRheSBvZiB0aGUgd2Vlay4gVGhlcmVmb3JlLCBJIHdvdWxkIHJlamVjdCB0aGUgbnVsbCBoeXBvdGhlc2lzLiBUaGUgY29uZmlkZW5jZSBpbnRlcnZhbCBpcyAoMC4wMDUyMTAwMDMsIDAuMDA4MjU3ODU1KS4gU2luY2UgMCBpcyBub3QgcGFydCBvZiB0aGUgcmFuZ2UsIEkgd291bGQgc2F5IHRoZSByZXN1bHRzIHN1cHBvcnQgdGhlIGFsdGVybmF0ZSBoeXBvdGhlc2lzLiBIb3dldmVyLCAwIGlzIHZlcnkgY2xvc2UgdG8gdGhlIHJhbmdlLCBzbyBJIHdvdWxkIHdhbnQgbW9yZSBldmlkZW5jZSB0byBjbGFpbSB0aGUgYWx0ZXJuYXRlIGh5cG90aGVzaXMgaXMgdHJ1ZS4gSXQgZG9lcyBub3Qgc2VlbSB0byBiZSBhIHNpZ25pZmljYW50IGRpZmZlcmVuY2UuDQoNCmBgYHtyfQ0Kc2V0LnNlZWQoMTAwMSkNCnRlblBsdXNTdHJlbmd0aCA8LSANCiAgeXJic3MgfD4NCiAgZmlsdGVyKHNjaG9vbF9uaWdodF9ob3Vyc19zbGVlcCA9PSAiMTArIikgfD4NCiAgY291bnQoc3RyZW5ndGhfdHJhaW5pbmdfN2QpDQoNCnRlblBsdXNTdHJlbmd0aCB8Pg0KICBtdXRhdGUocGVyY2VudCA9IHRlblBsdXNTdHJlbmd0aCRuIC8gc3VtKHRlblBsdXNTdHJlbmd0aCRuKSkNCg0Kbm9UZW5QbHVzU3RyZW5ndGggPC0NCiAgeXJic3MgfD4NCiAgZmlsdGVyKHNjaG9vbF9uaWdodF9ob3Vyc19zbGVlcCAhPSAiMTArIikgfD4NCiAgY291bnQoc3RyZW5ndGhfdHJhaW5pbmdfN2QpDQoNCm5vVGVuUGx1c1N0cmVuZ3RoIHw+DQogIG11dGF0ZShwZXJjZW50ID0gbm9UZW5QbHVzU3RyZW5ndGgkbiAvIHN1bShub1RlblBsdXNTdHJlbmd0aCRuKSkNCg0KeXJic3MgPC0NCiAgeXJic3MgfD4NCiAgbXV0YXRlKHN0cmVuZ3RoVHJhbmluZyA9IGlmZWxzZSgoc3RyZW5ndGhfdHJhaW5pbmdfN2QgPT0gIjciKSAmIChzY2hvb2xfbmlnaHRfaG91cnNfc2xlZXAgPT0gIjEwKyIpICwgInllcyIsICJubyIpKQ0KeXJic3MgfD4NCiAgZmlsdGVyKCFpcy5uYShzdHJlbmd0aFRyYW5pbmcpKSB8Pg0KICBzcGVjaWZ5KHJlc3BvbnNlID0gc3RyZW5ndGhUcmFuaW5nLCBzdWNjZXNzID0gInllcyIpIHw+DQogIGdlbmVyYXRlKHJlcHMgPSAxMDAwLCB0eXBlID0gImJvb3RzdHJhcCIpIHw+DQogIGNhbGN1bGF0ZShzdGF0ID0gInByb3AiKSB8Pg0KICBnZXRfY2kobGV2ZWwgPSAwLjk1KQ0KYGBgDQoNCg0KIyMgRXhlcmNpc2UgMTANCiMjIyBMZXQncyBzYXkgdGhlcmUgaGFzIGJlZW4gbm8gZGlmZmVyZW5jZSBpbiBsaWtlbGluZXNzIHRvIHN0cmVuZ3RoIHRyYWluIGV2ZXJ5IGRheSBvZiB0aGUgd2VlayBmb3IgdGhvc2Ugd2hvIHNsZWVwIDEwKyBob3Vycy4gV2hhdCBpcyB0aGUgcHJvYmFibGl0eSB0aGF0IHlvdSBjb3VsZCBkZXRlY3QgYSBjaGFuZ2UgKGF0IGEgc2lnbmlmaWNhbmNlIGxldmVsIG9mIDAuMDUpIHNpbXBseSBieSBjaGFuY2U/IEhpbnQ6IFJldmlldyB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgVHlwZSAxIGVycm9yLg0KDQpTaW5jZSB0aGUgc2lnbmlmaWNhbmNlIGxldmVsIGlzIDAuMDUsIHRoZSBwcm9iYWJpbGl0eSBvZiBhIHR5cGUgMSBlcnJvciBpcyA1JS4NCg0KDQojIyBFeGVyY2lzZSAxMQ0KIyMjIFN1cHBvc2UgeW91J3JlIGhpcmVkIGJ5IHRoZSBsb2NhbCBnb3Zlcm5tZW50IHRvIGVzdGltYXRlIHRoZSBwcm9wb3J0aW9uIG9mIHJlc2lkZW50cyB0aGF0IGF0dGVuZCBhIHJlbGlnaW91cyBzZXJ2aWNlIG9uIGEgd2Vla2x5IGJhc2lzLiBBY2NvcmRpbmcgdG8gdGhlIGd1aWRlbGluZXMsIHRoZSBlc3RpbWF0ZSBtdXN0IGhhdmUgYSBtYXJnaW4gb2YgZXJyb3Igbm8gZ3JlYXRlciB0aGFuIDElIHdpdGggOTUlIGNvbmZpZGVuY2UuIFlvdSBoYXZlIG5vIGlkZWEgd2hhdCB0byBleHBlY3QgZm9yIHAuIEhvdyBtYW55IHBlb3BsZSB3b3VsZCB5b3UgaGF2ZSB0byBzYW1wbGUgdG8gZW5zdXJlIHRoYXQgeW91IGFyZSB3aXRoaW4gdGhlIGd1aWRlbGluZXM/IEhpbnQ6IFJlZmVyIHRvIHlvdXIgcGxvdCBvZiB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gcCBhbmQgbWFyZ2luIG9mIGVycm9yLiBUaGlzIHF1ZXN0aW9uIGRvZXMgbm90IHJlcXVpcmUgdXNpbmcgYSBkYXRhc2V0Lg0KDQo5NjA0IHBlb3BsZQ0KDQpgYGB7cn0NCiNaICogWiAqIHAgKiAoMSAtIHApIC8gTUVeMg0KWiA8LSAxLjk2DQpwIDwtIDAuNQ0KTUUgPC0gMC4wMQ0KKFogKiBaICogcCAqICgxIC0gcCkpIC8gKE1FICogTUUpDQpgYGANCg==