## Loading tidyverse: ggplot2
## Loading tidyverse: tibble
## Loading tidyverse: tidyr
## Loading tidyverse: readr
## Loading tidyverse: purrr
## Loading tidyverse: dplyr
## Conflicts with tidy packages ----------------------------------------------
## filter(): dplyr, stats
## lag(): dplyr, stats
The data
In this lab, we investigate the ways in which the statistics from a random sample of data can serve as point estimates for population parameters. We’re interested in formulating a sampling distribution of our estimate in order to learn about the properties of the estimate, such as its distribution.
Setting a seed: We will take some random samples and build sampling distributions in this lab, which means you should set a seed on top of your lab. If this concept is new to you, review the lab concerning probability.
We consider real estate data from the city of Ames, Iowa. Data set contains information from the Ames Assessor’s Office used in computing assessed values for individual residential properties sold in Ames, IA from 2006 to 2010. See for detailed variable descriptions.
The details of every real estate transaction in Ames is recorded by the City Assessor’s office. Our particular focus for this lab will be all residential home sales in Ames between 2006 and 2010. This collection represents our population of interest. In this lab we would like to learn about these home sales by taking smaller samples from the full population. Let’s load the data.
We see that there are quite a few variables in the data set, enough to do a very in-depth analysis. For this lab, we’ll restrict our attention to just two of the variables: the above ground living area of the house in square feet (area) and the sale price (price).
We can explore the distribution of areas of homes in the population of home sales visually and with summary statistics. Let’s first create a visualization, a histogram:
> # qplot(data = ames, x = area, binwidth = 250, geom = "histogram")
> ggplot(ames) +
+ ggtitle("Living area of houses in Ames (in square feet)") +
+ geom_histogram(aes(x = area), binwidth = 250)

Let’s also obtain some summary statistics. Note that we can do this using the summarise function. We can calculate as many statistics as we want using this function, and just combine the results. Some of the functions below should be self explanatory (likemean,median,sd,IQR,min, andmax`).
A new function here is the quantile function which we can use to calculate values corresponding to specific percentile cutoffs in the distribution. For example quantile(x, 0.25) will yield the cutoff value for the 25th percentile (Q1) in the distribution of x. Finding these values is useful for describing the distribution, as we can use them for descriptions like “the middle 50% of the homes have areas between such and such square feet”.
> ames %>%
+ summarise(mu = mean(area), pop_med = median(area),
+ sigma = sd(area), pop_iqr = IQR(area),
+ pop_min = min(area), pop_max = max(area),
+ pop_q1 = quantile(area, 0.25), # first quartile, 25th percentile
+ pop_q3 = quantile(area, 0.75)) # third quartile, 75th percentile
# A tibble: 1 × 8
mu pop_med sigma pop_iqr pop_min pop_max pop_q1 pop_q3
<dbl> <dbl> <dbl> <dbl> <int> <int> <dbl> <dbl>
1 1499.69 1442 505.5089 616.75 334 5642 1126 1742.75
Exercise (1)
Describe this population distribution using a visualization and these summary statistics. You don’t have to use all of the summary statistics in your description, you will need to decide which ones are relevant based on the shape of the distribution. Make sure to include the plot and the summary statistics output in your report along with your narrative.
> ggplot(ames) +
+ ggtitle("Living area of houses in Ames (in square feet)") +
+ geom_histogram(aes(x = area), binwidth = 250)


> ggplot(ames, aes(area)) +
+ geom_blank() +
+ geom_histogram(aes(y = ..density..), alpha = 0.25, fill = "blue", binwidth = 250) +
+ stat_function(fun = dnorm, args = c(mean = mean(ames$area), sd = sd(ames$area)), col = "tomato")

> big_houses <- filter(ames, area > 4000)
The living area distribution of Ames is a left skewed distribution, e.g. most of the living areas are small: Half of the houses have less than 1450 sq.feet, but there are also some houses with more than 4000 square feet living space. The middle 50 percent of the homes have areas between 1126 and 1742 sq.ft.
The unknown sampling distribution
In this lab we have access to the entire population, but this is rarely the case in real life. Gathering information on an entire population is often extremely costly or impossible. Because of this, we often take a sample of the population and use that to understand the properties of the population.
If we were interested in estimating the mean living area in Ames based on a sample, we can use the sample_n command to survey the population. It selects a specified number of random rows from a table. It currently only works for local tibbles.
> samp1 <- ames %>%
+ sample_n(50)
This command collects a simple random sample of size 50 from the ames dataset, and assigns the result to `samp1. This is like going into the City Assessor’s database and pulling up the files on 50 random home sales. Working with these 50 files would be considerably simpler than working with all 2930 home sales.
Exercise (2)
Describe the distribution of area in this sample. How does it compare to the distribution of the population? Hint: the sample_n function takes a random sample of observations (i.e. rows) from the dataset, you can still refer to the variables in the dataset with the same names. Code you used in the previous exercise will also be helpful for visualizing and summarizing the sample, however be careful to not label values mu and sigma anymore since these are sample statistics, not population parameters. You can customize the labels of any of the statistics to indicate that these come from the sample.
> ggplot(samp1) +
+ ggtitle("Sample of living areas of houses in Ames (in square feet)") +
+ geom_histogram(aes(x = area), binwidth = 250)


> ggplot(samp1, aes(area)) +
+ geom_blank() +
+ geom_histogram(aes(y = ..density..), alpha = 0.25, fill = "green", binwidth = 250) +
+ stat_function(fun = dnorm, args = c(mean = mean(ames$area), sd = sd(ames$area)), col = "tomato")

> samp1 %>%
+ summarise(mean = mean(area), samp_med = median(area),
+ sd = sd(area), samp_iqr = IQR(area),
+ samp_min = min(area), samp_max = max(area),
+ samp_q1 = quantile(area, 0.25), # first quartile, 25th percentile
+ samp_q3 = quantile(area, 0.75)) # third quartile, 75th percentile
# A tibble: 1 × 8
mean samp_med sd samp_iqr samp_min samp_max samp_q1 samp_q3
<dbl> <dbl> <dbl> <dbl> <int> <int> <dbl> <dbl>
1 1412.42 1333 496.1473 588 616 2726 1046.75 1634.75
LS0tCnRpdGxlOiAiTGFiIDU6IFNhbXBsaW5nIGRpc3RyaWJ1dGlvbiIKYXV0aG9yOiAiUGV0ZXIgQmF1bWdhcnRuZXIiCmRhdGU6ICIyMDE3LTAzLTEwIgpvdXRwdXQ6IG9pbGFiczo6bGFiX3JlcG9ydAotLS0KYGBge3IgbGFiZWwgPSAiZ2xvYmFsLW9wdGlvbnMiLCBlY2hvPUZBTFNFLCBoaWdobGlnaHQ9VFJVRX0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KAogICAgICAgIG1lc3NhZ2UgPSBGLAogICAgICAgIGVycm9yID0gRiwKICAgICAgICB3YXJuaW5nID0gRiwKICAgICAgICBjb21tZW50ID0gTkEsCiAgICAgICAgaGlnaGxpZ2h0ID0gVCwKICAgICAgICBwcm9tcHQgPSBUCiAgICAgICAgKQogICAgICAgIGxpYnJhcnkodGlkeXZlcnNlKQogICAgICAgIGxpYnJhcnkob2lsYWJzKQpgYGAKKioqCgojIFRoZSBkYXRhCkluIHRoaXMgbGFiLCB3ZSBpbnZlc3RpZ2F0ZSB0aGUgd2F5cyBpbiB3aGljaCB0aGUgc3RhdGlzdGljcyBmcm9tIGEgcmFuZG9tIHNhbXBsZSBvZiBkYXRhIGNhbiBzZXJ2ZSBhcyBwb2ludCBlc3RpbWF0ZXMgZm9yIHBvcHVsYXRpb24gcGFyYW1ldGVycy4gV2UncmUgaW50ZXJlc3RlZCBpbiBmb3JtdWxhdGluZyBhIHNhbXBsaW5nIGRpc3RyaWJ1dGlvbiBvZiBvdXIgZXN0aW1hdGUgaW4gb3JkZXIgdG8gbGVhcm4gYWJvdXQgdGhlIHByb3BlcnRpZXMgb2YgdGhlIGVzdGltYXRlLCBzdWNoIGFzIGl0cyBkaXN0cmlidXRpb24uCgoqKlNldHRpbmcgYSBzZWVkOioqIFdlIHdpbGwgdGFrZSBzb21lIHJhbmRvbSBzYW1wbGVzIGFuZCBidWlsZCBzYW1wbGluZyBkaXN0cmlidXRpb25zIGluIHRoaXMgbGFiLCB3aGljaCBtZWFucyB5b3Ugc2hvdWxkIHNldCBhIHNlZWQgb24gdG9wIG9mIHlvdXIgbGFiLiBJZiB0aGlzIGNvbmNlcHQgaXMgbmV3IHRvIHlvdSwgcmV2aWV3IHRoZSBsYWIgY29uY2VybmluZyBwcm9iYWJpbGl0eS4KCmBgYHtyIHNldHRpbmctYS1zZWVkfQpzZXQuc2VlZCgyMzIzMjMpCmBgYAoKV2UgY29uc2lkZXIgcmVhbCBlc3RhdGUgZGF0YSBmcm9tIHRoZSBjaXR5IG9mIEFtZXMsIElvd2EuIERhdGEgc2V0IGNvbnRhaW5zIGluZm9ybWF0aW9uIGZyb20gdGhlIEFtZXMgQXNzZXNzb3IncyBPZmZpY2UgdXNlZCBpbiBjb21wdXRpbmcgYXNzZXNzZWQgdmFsdWVzIGZvciBpbmRpdmlkdWFsIHJlc2lkZW50aWFsIHByb3BlcnRpZXMgc29sZCBpbiBBbWVzLCBJQSBmcm9tIDIwMDYgdG8gMjAxMC4gU2VlIGZvciBbZGV0YWlsZWQgdmFyaWFibGUgZGVzY3JpcHRpb25zXShodHRwOi8vd3d3LmFtc3RhdC5vcmcvcHVibGljYXRpb25zL2pzZS92MTluMy9kZWNvY2svZGF0YWRvY3VtZW50YXRpb24udHh0KS4KClRoZSBkZXRhaWxzIG9mIGV2ZXJ5IHJlYWwgZXN0YXRlIHRyYW5zYWN0aW9uIGluIEFtZXMgaXMgcmVjb3JkZWQgYnkgdGhlIENpdHkgQXNzZXNzb3IncyBvZmZpY2UuIE91ciBwYXJ0aWN1bGFyIGZvY3VzIGZvciB0aGlzIGxhYiB3aWxsIGJlIGFsbCByZXNpZGVudGlhbCBob21lIHNhbGVzIGluIEFtZXMgYmV0d2VlbiAyMDA2IGFuZCAyMDEwLiBUaGlzIGNvbGxlY3Rpb24gcmVwcmVzZW50cyBvdXIgcG9wdWxhdGlvbiBvZiBpbnRlcmVzdC4gSW4gdGhpcyBsYWIgd2Ugd291bGQgbGlrZSB0byBsZWFybiBhYm91dCB0aGVzZSBob21lIHNhbGVzIGJ5IHRha2luZyBzbWFsbGVyIHNhbXBsZXMgZnJvbSB0aGUgZnVsbCBwb3B1bGF0aW9uLiBMZXQncyBsb2FkIHRoZSBkYXRhLgoKYGBge3IgbG9hZC1kYXRhfQpkYXRhKGFtZXMpCj9hbWVzCmBgYAoKV2Ugc2VlIHRoYXQgdGhlcmUgYXJlIHF1aXRlIGEgZmV3IHZhcmlhYmxlcyBpbiB0aGUgZGF0YSBzZXQsIGVub3VnaCB0byBkbyBhIHZlcnkgaW4tZGVwdGggYW5hbHlzaXMuIEZvciB0aGlzIGxhYiwgd2UnbGwgcmVzdHJpY3Qgb3VyIGF0dGVudGlvbiB0byBqdXN0IHR3byBvZiB0aGUgdmFyaWFibGVzOiB0aGUgYWJvdmUgZ3JvdW5kIGxpdmluZyBhcmVhIG9mIHRoZSBob3VzZSBpbiBzcXVhcmUgZmVldCAoYGFyZWFgKSBhbmQgdGhlIHNhbGUgcHJpY2UgKGBwcmljZWApLgoKV2UgY2FuIGV4cGxvcmUgdGhlIGRpc3RyaWJ1dGlvbiBvZiBhcmVhcyBvZiBob21lcyBpbiB0aGUgcG9wdWxhdGlvbiBvZiBob21lIHNhbGVzIHZpc3VhbGx5IGFuZCB3aXRoIHN1bW1hcnkgc3RhdGlzdGljcy4gTGV0J3MgZmlyc3QgY3JlYXRlIGEgdmlzdWFsaXphdGlvbiwgYSBoaXN0b2dyYW06CgpgYGB7ciBsaXZpbmctYXJlYXMtaW4tYW1lc30KIyBxcGxvdChkYXRhID0gYW1lcywgeCA9IGFyZWEsIGJpbndpZHRoID0gMjUwLCBnZW9tID0gImhpc3RvZ3JhbSIpCmdncGxvdChhbWVzKSArCiAgICAgICAgZ2d0aXRsZSgiTGl2aW5nIGFyZWEgb2YgaG91c2VzIGluIEFtZXMgKGluIHNxdWFyZSBmZWV0KSIpICsKICAgICAgICBnZW9tX2hpc3RvZ3JhbShhZXMoeCA9IGFyZWEpLCBiaW53aWR0aCA9IDI1MCkKYGBgCgpMZXQncyBhbHNvIG9idGFpbiBzb21lIHN1bW1hcnkgc3RhdGlzdGljcy4gTm90ZSB0aGF0IHdlIGNhbiBkbyB0aGlzIHVzaW5nIHRoZSBgc3VtbWFyaXNlIGZ1bmN0aW9uLiBXZSBjYW4gY2FsY3VsYXRlIGFzIG1hbnkgc3RhdGlzdGljcyBhcyB3ZSB3YW50IHVzaW5nIHRoaXMgZnVuY3Rpb24sIGFuZCBqdXN0IGNvbWJpbmUgdGhlIHJlc3VsdHMuIFNvbWUgb2YgdGhlIGZ1bmN0aW9ucyBiZWxvdyBzaG91bGQgYmUgc2VsZiBleHBsYW5hdG9yeSAobGlrZSBgbWVhbmAsIGBtZWRpYW5gLCBgc2RgLCBgSVFSYCwgYG1pbmAsIGFuZCBgbWF4YCkuIAoKQSBuZXcgZnVuY3Rpb24gaGVyZSBpcyB0aGUgYHF1YW50aWxlYCBmdW5jdGlvbiB3aGljaCB3ZSBjYW4gdXNlIHRvIGNhbGN1bGF0ZSB2YWx1ZXMgY29ycmVzcG9uZGluZyB0byBzcGVjaWZpYyBwZXJjZW50aWxlIGN1dG9mZnMgaW4gdGhlIGRpc3RyaWJ1dGlvbi4gRm9yIGV4YW1wbGUgYHF1YW50aWxlKHgsIDAuMjUpYCB3aWxsIHlpZWxkIHRoZSBjdXRvZmYgdmFsdWUgZm9yIHRoZSAyNXRoIHBlcmNlbnRpbGUgKFExKSBpbiB0aGUgZGlzdHJpYnV0aW9uIG9mIGB4YC4gRmluZGluZyB0aGVzZSB2YWx1ZXMgaXMgdXNlZnVsIGZvciBkZXNjcmliaW5nIHRoZSBkaXN0cmlidXRpb24sIGFzIHdlIGNhbiB1c2UgdGhlbSBmb3IgZGVzY3JpcHRpb25zIGxpa2UgXyJ0aGUgbWlkZGxlIDUwJSBvZiB0aGUgaG9tZXMgaGF2ZSBhcmVhcyBiZXR3ZWVuIHN1Y2ggYW5kIHN1Y2ggc3F1YXJlIGZlZXQiXy4KCmBgYHtyIHN1bW1hcmlzZS1zb21lLXZhbHVlcy1vZi1hbWVzLWRhdGF9CmFtZXMgJT4lCiAgc3VtbWFyaXNlKG11ID0gbWVhbihhcmVhKSwgcG9wX21lZCA9IG1lZGlhbihhcmVhKSwgCiAgICAgICAgICAgIHNpZ21hID0gc2QoYXJlYSksIHBvcF9pcXIgPSBJUVIoYXJlYSksCiAgICAgICAgICAgIHBvcF9taW4gPSBtaW4oYXJlYSksIHBvcF9tYXggPSBtYXgoYXJlYSksCiAgICAgICAgICAgIHBvcF9xMSA9IHF1YW50aWxlKGFyZWEsIDAuMjUpLCAgIyBmaXJzdCBxdWFydGlsZSwgMjV0aCBwZXJjZW50aWxlCiAgICAgICAgICAgIHBvcF9xMyA9IHF1YW50aWxlKGFyZWEsIDAuNzUpKSAgIyB0aGlyZCBxdWFydGlsZSwgNzV0aCBwZXJjZW50aWxlCmBgYAoKIyMgRXhlcmNpc2UgKDEpCkRlc2NyaWJlIHRoaXMgcG9wdWxhdGlvbiBkaXN0cmlidXRpb24gdXNpbmcgYSB2aXN1YWxpemF0aW9uIGFuZCB0aGVzZSBzdW1tYXJ5IHN0YXRpc3RpY3MuIFlvdSBkb24ndCBoYXZlIHRvIHVzZSBhbGwgb2YgdGhlIHN1bW1hcnkgc3RhdGlzdGljcyBpbiB5b3VyIGRlc2NyaXB0aW9uLCB5b3Ugd2lsbCBuZWVkIHRvIGRlY2lkZSB3aGljaCBvbmVzIGFyZSByZWxldmFudCBiYXNlZCBvbiB0aGUgc2hhcGUgb2YgdGhlIGRpc3RyaWJ1dGlvbi4gTWFrZSBzdXJlIHRvIGluY2x1ZGUgdGhlIHBsb3QgYW5kIHRoZSBzdW1tYXJ5IHN0YXRpc3RpY3Mgb3V0cHV0IGluIHlvdXIgcmVwb3J0IGFsb25nIHdpdGggeW91ciBuYXJyYXRpdmUuCgpgYGB7ciBpbnNwZWN0aW5nLWxpdmluZy1hcmVhLWZyb20tcG9wdWxhdGlvbn0KZ2dwbG90KGFtZXMpICsKICAgICAgICBnZ3RpdGxlKCJMaXZpbmcgYXJlYSBvZiBob3VzZXMgaW4gQW1lcyAoaW4gc3F1YXJlIGZlZXQpIikgKwogICAgICAgIGdlb21faGlzdG9ncmFtKGFlcyh4ID0gYXJlYSksIGJpbndpZHRoID0gMjUwKQpxcW5vcm0oYW1lcyRhcmVhKQoKZ2dwbG90KGFtZXMsIGFlcyhhcmVhKSkgKwogICAgICAgIGdlb21fYmxhbmsoKSArCiAgICAgICAgZ2VvbV9oaXN0b2dyYW0oYWVzKHkgPSAuLmRlbnNpdHkuLiksIGFscGhhID0gMC4yNSwgZmlsbCA9ICJibHVlIiwgYmlud2lkdGggPSAyNTApICsKICAgICAgICBzdGF0X2Z1bmN0aW9uKGZ1biA9IGRub3JtLCBhcmdzID0gYyhtZWFuID0gbWVhbihhbWVzJGFyZWEpLCBzZCA9IHNkKGFtZXMkYXJlYSkpLCBjb2wgPSAidG9tYXRvIikKYmlnX2hvdXNlcyA8LSBmaWx0ZXIoYW1lcywgYXJlYSA+IDQwMDApCmBgYApUaGUgbGl2aW5nIGFyZWEgZGlzdHJpYnV0aW9uIG9mIEFtZXMgaXMgYSBsZWZ0IHNrZXdlZCBkaXN0cmlidXRpb24sIGUuZy4gbW9zdCBvZiB0aGUgbGl2aW5nIGFyZWFzIGFyZSBzbWFsbDogSGFsZiBvZiB0aGUgaG91c2VzIGhhdmUgbGVzcyB0aGFuIDE0NTAgc3EuZmVldCwgYnV0IHRoZXJlIGFyZSBhbHNvIHNvbWUgaG91c2VzIHdpdGggbW9yZSB0aGFuIDQwMDAgc3F1YXJlIGZlZXQgbGl2aW5nIHNwYWNlLiBUaGUgbWlkZGxlIDUwIHBlcmNlbnQgb2YgdGhlIGhvbWVzIGhhdmUgYXJlYXMgYmV0d2VlbiAxMTI2IGFuZCAxNzQyIHNxLmZ0LgoKIyBUaGUgdW5rbm93biBzYW1wbGluZyBkaXN0cmlidXRpb24KCkluIHRoaXMgbGFiIHdlIGhhdmUgYWNjZXNzIHRvIHRoZSBlbnRpcmUgcG9wdWxhdGlvbiwgYnV0IHRoaXMgaXMgcmFyZWx5IHRoZSBjYXNlIGluIHJlYWwgbGlmZS4gR2F0aGVyaW5nIGluZm9ybWF0aW9uIG9uIGFuIGVudGlyZSBwb3B1bGF0aW9uIGlzIG9mdGVuIGV4dHJlbWVseSBjb3N0bHkgb3IgaW1wb3NzaWJsZS4gQmVjYXVzZSBvZiB0aGlzLCB3ZSBvZnRlbiB0YWtlIGEgc2FtcGxlIG9mIHRoZSBwb3B1bGF0aW9uIGFuZCB1c2UgdGhhdCB0byB1bmRlcnN0YW5kIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBwb3B1bGF0aW9uLgoKSWYgd2Ugd2VyZSBpbnRlcmVzdGVkIGluIGVzdGltYXRpbmcgdGhlIG1lYW4gbGl2aW5nIGFyZWEgaW4gQW1lcyBiYXNlZCBvbiBhIHNhbXBsZSwgd2UgY2FuIHVzZSB0aGUgYHNhbXBsZV9uYCBjb21tYW5kIHRvIHN1cnZleSB0aGUgcG9wdWxhdGlvbi4gSXQgc2VsZWN0cyBhIHNwZWNpZmllZCBudW1iZXIgb2YgcmFuZG9tIHJvd3MgZnJvbSBhIHRhYmxlLiBJdCBjdXJyZW50bHkgb25seSB3b3JrcyBmb3IgbG9jYWwgdGliYmxlcy4KCmBgYHtyfQpzYW1wMSA8LSBhbWVzICU+JQogIHNhbXBsZV9uKDUwKQpgYGAKClRoaXMgY29tbWFuZCBjb2xsZWN0cyBhIHNpbXBsZSByYW5kb20gc2FtcGxlIG9mIHNpemUgNTAgZnJvbSB0aGUgYGFtZXNgIGRhdGFzZXQsIGFuZCBhc3NpZ25zIHRoZSByZXN1bHQgdG8gYHNhbXAxLiBUaGlzIGlzIGxpa2UgZ29pbmcgaW50byB0aGUgQ2l0eSBBc3Nlc3NvcidzIGRhdGFiYXNlIGFuZCBwdWxsaW5nIHVwIHRoZSBmaWxlcyBvbiA1MCByYW5kb20gaG9tZSBzYWxlcy4gV29ya2luZyB3aXRoIHRoZXNlIDUwIGZpbGVzIHdvdWxkIGJlIGNvbnNpZGVyYWJseSBzaW1wbGVyIHRoYW4gd29ya2luZyB3aXRoIGFsbCAyOTMwIGhvbWUgc2FsZXMuCgojIyBFeGVyY2lzZSAoMikKCkRlc2NyaWJlIHRoZSBkaXN0cmlidXRpb24gb2YgYXJlYSBpbiB0aGlzIHNhbXBsZS4gSG93IGRvZXMgaXQgY29tcGFyZSB0byB0aGUgZGlzdHJpYnV0aW9uIG9mIHRoZSBwb3B1bGF0aW9uPyBIaW50OiB0aGUgYHNhbXBsZV9uYCBmdW5jdGlvbiB0YWtlcyBhIHJhbmRvbSBzYW1wbGUgb2Ygb2JzZXJ2YXRpb25zIChpLmUuIHJvd3MpIGZyb20gdGhlIGRhdGFzZXQsIHlvdSBjYW4gc3RpbGwgcmVmZXIgdG8gdGhlIHZhcmlhYmxlcyBpbiB0aGUgZGF0YXNldCB3aXRoIHRoZSBzYW1lIG5hbWVzLiBDb2RlIHlvdSB1c2VkIGluIHRoZSBwcmV2aW91cyBleGVyY2lzZSB3aWxsIGFsc28gYmUgaGVscGZ1bCBmb3IgdmlzdWFsaXppbmcgYW5kIHN1bW1hcml6aW5nIHRoZSBzYW1wbGUsIGhvd2V2ZXIgYmUgY2FyZWZ1bCB0byBub3QgbGFiZWwgdmFsdWVzIGBtdWAgYW5kIGBzaWdtYWAgYW55bW9yZSBzaW5jZSB0aGVzZSBhcmUgc2FtcGxlIHN0YXRpc3RpY3MsIG5vdCBwb3B1bGF0aW9uIHBhcmFtZXRlcnMuIFlvdSBjYW4gY3VzdG9taXplIHRoZSBsYWJlbHMgb2YgYW55IG9mIHRoZSBzdGF0aXN0aWNzIHRvIGluZGljYXRlIHRoYXQgdGhlc2UgY29tZSBmcm9tIHRoZSBzYW1wbGUuCgpgYGB7ciBpbnNwZWN0aW5nLWxpdmluZy1hcmVhLWZyb20tc2FtcGxlfQpnZ3Bsb3Qoc2FtcDEpICsKICAgICAgICBnZ3RpdGxlKCJTYW1wbGUgb2YgbGl2aW5nIGFyZWFzIG9mIGhvdXNlcyBpbiBBbWVzIChpbiBzcXVhcmUgZmVldCkiKSArCiAgICAgICAgZ2VvbV9oaXN0b2dyYW0oYWVzKHggPSBhcmVhKSwgYmlud2lkdGggPSAyNTApCnFxbm9ybShhbWVzJGFyZWEpCgpnZ3Bsb3Qoc2FtcDEsIGFlcyhhcmVhKSkgKwogICAgICAgIGdlb21fYmxhbmsoKSArCiAgICAgICAgZ2VvbV9oaXN0b2dyYW0oYWVzKHkgPSAuLmRlbnNpdHkuLiksIGFscGhhID0gMC4yNSwgZmlsbCA9ICJncmVlbiIsIGJpbndpZHRoID0gMjUwKSArCiAgICAgICAgc3RhdF9mdW5jdGlvbihmdW4gPSBkbm9ybSwgYXJncyA9IGMobWVhbiA9IG1lYW4oYW1lcyRhcmVhKSwgc2QgPSBzZChhbWVzJGFyZWEpKSwgY29sID0gInRvbWF0byIpCgpzYW1wMSAlPiUKICBzdW1tYXJpc2UobWVhbiA9IG1lYW4oYXJlYSksIHNhbXBfbWVkID0gbWVkaWFuKGFyZWEpLCAKICAgICAgICAgICAgc2QgPSBzZChhcmVhKSwgc2FtcF9pcXIgPSBJUVIoYXJlYSksCiAgICAgICAgICAgIHNhbXBfbWluID0gbWluKGFyZWEpLCBzYW1wX21heCA9IG1heChhcmVhKSwKICAgICAgICAgICAgc2FtcF9xMSA9IHF1YW50aWxlKGFyZWEsIDAuMjUpLCAgIyBmaXJzdCBxdWFydGlsZSwgMjV0aCBwZXJjZW50aWxlCiAgICAgICAgICAgIHNhbXBfcTMgPSBxdWFudGlsZShhcmVhLCAwLjc1KSkgICMgdGhpcmQgcXVhcnRpbGUsIDc1dGggcGVyY2VudGlsZQpgYGAK