library(tidyverse)
library(openintro)
##head shows a summary similar to glimpse
head(fastfood)
## # A tibble: 6 x 17
## restaurant item calories cal_fat total_fat sat_fat trans_fat cholesterol
## <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 Mcdonalds Artisan G~ 380 60 7 2 0 95
## 2 Mcdonalds Single Ba~ 840 410 45 17 1.5 130
## 3 Mcdonalds Double Ba~ 1130 600 67 27 3 220
## 4 Mcdonalds Grilled B~ 750 280 31 10 0.5 155
## 5 Mcdonalds Crispy Ba~ 920 410 45 12 0.5 120
## 6 Mcdonalds Big Mac 540 250 28 10 1 80
## # ... with 9 more variables: sodium <dbl>, total_carb <dbl>, fiber <dbl>,
## # sugar <dbl>, protein <dbl>, vit_a <dbl>, vit_c <dbl>, calcium <dbl>,
## # salad <chr>
#There are 17 measurements because there are 17 columns but for this part only the restaurants, calories, calories from fat are taken from McDonalds and Dairy Queen.
mcdonalds <- fastfood %>%
filter (restaurant == "Mcdonalds")
dairy_queen <- fastfood %>%
filter (restaurant == "Dairy Queen")
Exercise 1
Make a plot (or plots) to visualize the distributions of the amount of calories from fat of the options from these two restaurants. How do their centers, shapes, and spreads compare?
Based on the histograms below the centers of the plots are on similar places which is something over 200. The shape of the McDonalds histogram shows an extreme right skew and for Dairy Queen, while it is also right skewed it is not as skewed as the Mcdonalds graph. The spread for the Dairy Queen data is tighter because it only goes from 0 to 700 but in the McDonalds data it is 0 to 1400.
#Making histograms for the data
#histogram of McDonalds
hist(mcdonalds$cal_fat)

boxplot(mcdonalds$cal_fat, horizontal=TRUE)

#histogram of dairy queen
hist(dairy_queen$cal_fat)

boxplot(dairy_queen$cal_fat, horizontal=TRUE)

Exercise 2
Based on the this plot, does it appear that the data follow a nearly normal distribution?
While the data points don’t fall into the normal curve perfectly the data does have a bell shape, where the ends get closer to zero and in the middle there is a peak.
#This adds mean and sd for dairy queen so it is easier to access them when they are named
dqmean <- mean(dairy_queen$cal_fat)
dqsd<- sd(dairy_queen$cal_fat)
#Adding a density histogram and overlaying a curve on the histogram to see if it is relatively normal.
#the stat function adds the normal line on the curve using the same mean and sq and colors it to red
ggplot(data=dairy_queen, aes(x = cal_fat)) +
geom_blank() +
geom_histogram(aes(y=..density..)) +
stat_function(fun= dnorm, args = c(mean=dqmean, sd=dqsd), col = "tomato")
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

#adding a bins part to change the amount of bins on the histogram which gives another look into the data
ggplot(data=dairy_queen, aes(x = cal_fat)) +
geom_blank() +
geom_histogram(aes(y=..density..), bins=20) +
stat_function(fun= dnorm, args = c(mean=dqmean, sd=dqsd), col = "blue")

Exercise 3
Make a normal probability plot of sim_norm. Do all of the points fall on the line? How does this plot compare to the probability plot for the real data? (Since sim_norm is not a dataframe, it can be put directly into the sample argument and the data argument can be dropped.)
All points do not fall on the line and compared to the real data it is very similar to each other. The data could be relatively normal using the qqplot and comparing the simulated data to the actual data.
#This makes a qq plot to see if the graph is normal or not but unable to determine how close it really is
ggplot(data = dairy_queen, aes(sample = cal_fat)) +
geom_line(stat = "qq")

#this will make a simulated normal plot to compare the dairy queen data to and then gg plot with graph it
sim_norm <- rnorm(n = nrow(dairy_queen), mean = dqmean, sd = dqsd)
ggplot(data =NULL , aes(sample = sim_norm)) +
geom_line(stat="qq")

Exercise 4
Does the normal probability plot for the calories from fat look similar to the plots created for the simulated data? That is, do the plots provide evidence that the calories from fat are nearly normal?
Comparing the two plots (real vs simulated) it shows that it is very similar to each other for the most part and since the plot of the simulated data shows that it is relatively normal that means that the actual dairy queen data is relatively normal.
Exercise 5
Exercise 6
Write out two probability questions that you would like to answer about any of the restaurants in this dataset. Calculate those probabilities using both the theoretical normal distribution as well as the empirical distribution (four probabilities in all). Which one had a closer agreement between the two methods?
In the first question where it ask for the sodium content less than 1000 the numbers for pnorm and using the empirical method are fairly close to each other at 0.33. In the second question, the numbers are still fairly close at 0.113 compared to 0.119 which could indicate that this distribution is relatively normal.
Question 1
Question 2
What is the probability that an item in Dairy Queen has total fat above 50?
#show mean and sd of total fat for dq items
mean(dairy_queen$total_fat)
## [1] 28.85714
sd(dairy_queen$total_fat)
## [1] 17.51873
#using pnorm to find the probability
1- pnorm(50,28.857, 17.518)
## [1] 0.1137295
#using empirical method to find probability
dairy_queen %>%
filter(total_fat>50) %>%
summarise(percent = n() / nrow(dairy_queen))
## # A tibble: 1 x 1
## percent
## <dbl>
## 1 0.119
#showing how to use pnorm to find the area/probability that a Dairy Queen item has more than 600 calories from fat (1- is being used because it looking at the right side of the data)
1 - pnorm(q = 600, mean = dqmean, sd = dqsd)
## [1] 0.01501523
#this other way is the empirical version but seems way more complicated to code compared to just putting pnorm but it is like checking how many data points are more than 600 then dividing that by sample size
#The data is not reasonably close it is 1% compared to 5%
dairy_queen %>%
filter(cal_fat > 600) %>%
summarise(percent = n() / nrow(dairy_queen))
## # A tibble: 1 x 1
## percent
## <dbl>
## 1 0.0476
Exercise 7
Now let’s consider some of the other variables in the dataset. Out of all the different restaurants, which ones’ distribution is the closest to normal for sodium?
Burger King seems to have the closest to normal for sodium.
Insert any text here.
#Plotting a qqplot for all the restaurants sodium level and seeing which one is the most normal
qqnorm(mcdonalds$sodium, main = "McDonalds")

qqnorm(dairy_queen$sodium, main = "Dairy Queen")

#This basically looks at fast food and looks for arbys in the restaurants and then the
arbys<- fastfood %>%
filter(restaurant == "Arbys")
qqnorm(arbys$sodium, main="Arbys")

burger_king<- fastfood %>%
filter(restaurant == "Burger King")
qqnorm(burger_king$sodium, main="Burger King")

taco_bell<- fastfood %>%
filter(restaurant == "Taco Bell")
qqnorm(taco_bell$sodium, main="Taco Bell")

subway<- fastfood %>%
filter(restaurant == "Subway")
qqnorm(subway$sodium, main="Subway")

sonic<- fastfood %>%
filter(restaurant == "Sonic")
qqnorm(sonic$sodium, main="Sonic")

chickfila<- fastfood %>%
filter(restaurant == "Chick Fil-A")
qqnorm(chickfila$sodium, main="Chick Fil-A")

Exercise 8
Note that some of the normal probability plots for sodium distributions seem to have a stepwise pattern. why do you think this might be the case?
Exercise 9
As you can see, normal probability plots can be used both to assess normality and visualize skewness. Make a normal probability plot for the total carbohydrates from a restaurant of your choice. Based on this normal probability plot, is this variable left skewed, symmetric, or right skewed? Use a histogram to confirm your findings.
Based on the normal probability plot it could be symmetric because nothing really shoots up or down that much and based on the histogram the points tend to be all around the same frequency but on the right side it is much lower.
#I am going to use taco bell for total carbohydrates
qqnorm(taco_bell$total_carb, main="Taco Bell")

hist(taco_bell$total_carb)

LS0tDQp0aXRsZTogIkxhYiA0OiBUaGUgbm9ybWFsIGRpc3RyaWJ1dGlvbiINCmF1dGhvcjogIkxhbmNlIE51aXF1ZSINCmRhdGU6ICJgciBTeXMuRGF0ZSgpYCINCm91dHB1dDogb3BlbmludHJvOjpsYWJfcmVwb3J0DQotLS0NCg0KYGBge3IgbG9hZC1wYWNrYWdlcywgbWVzc2FnZT1GQUxTRX0NCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShvcGVuaW50cm8pDQoNCiMjaGVhZCBzaG93cyBhIHN1bW1hcnkgc2ltaWxhciB0byBnbGltcHNlDQpoZWFkKGZhc3Rmb29kKQ0KDQoNCmBgYA0KDQpgYGB7cn0NCiNUaGVyZSBhcmUgMTcgbWVhc3VyZW1lbnRzIGJlY2F1c2UgdGhlcmUgYXJlIDE3IGNvbHVtbnMgYnV0IGZvciB0aGlzIHBhcnQgb25seSB0aGUgcmVzdGF1cmFudHMsIGNhbG9yaWVzLCBjYWxvcmllcyBmcm9tIGZhdCBhcmUgdGFrZW4gZnJvbSBNY0RvbmFsZHMgYW5kIERhaXJ5IFF1ZWVuLg0KDQptY2RvbmFsZHMgPC0gZmFzdGZvb2QgJT4lDQogIGZpbHRlciAocmVzdGF1cmFudCA9PSAiTWNkb25hbGRzIikNCmRhaXJ5X3F1ZWVuIDwtIGZhc3Rmb29kICU+JQ0KICBmaWx0ZXIgKHJlc3RhdXJhbnQgPT0gIkRhaXJ5IFF1ZWVuIikNCg0KYGBgDQoNCg0KDQojIyMgRXhlcmNpc2UgMQ0KDQojIyMjIE1ha2UgYSBwbG90IChvciBwbG90cykgdG8gdmlzdWFsaXplIHRoZSBkaXN0cmlidXRpb25zIG9mIHRoZSBhbW91bnQgb2YgY2Fsb3JpZXMgZnJvbSBmYXQgb2YgdGhlIG9wdGlvbnMgZnJvbSB0aGVzZSB0d28gcmVzdGF1cmFudHMuIEhvdyBkbyB0aGVpciBjZW50ZXJzLCBzaGFwZXMsIGFuZCBzcHJlYWRzIGNvbXBhcmU/DQoNCiMjIyMjIEJhc2VkIG9uIHRoZSBoaXN0b2dyYW1zIGJlbG93IHRoZSBjZW50ZXJzIG9mIHRoZSBwbG90cyBhcmUgb24gc2ltaWxhciBwbGFjZXMgd2hpY2ggaXMgc29tZXRoaW5nIG92ZXIgMjAwLiBUaGUgc2hhcGUgb2YgdGhlIE1jRG9uYWxkcyBoaXN0b2dyYW0gc2hvd3MgYW4gZXh0cmVtZSByaWdodCBza2V3IGFuZCBmb3IgRGFpcnkgUXVlZW4sIHdoaWxlIGl0IGlzIGFsc28gcmlnaHQgc2tld2VkIGl0IGlzIG5vdCBhcyBza2V3ZWQgYXMgdGhlIE1jZG9uYWxkcyBncmFwaC4gVGhlIHNwcmVhZCBmb3IgdGhlIERhaXJ5IFF1ZWVuIGRhdGEgaXMgdGlnaHRlciBiZWNhdXNlIGl0IG9ubHkgZ29lcyBmcm9tIDAgdG8gNzAwIGJ1dCBpbiB0aGUgTWNEb25hbGRzIGRhdGEgaXQgaXMgMCB0byAxNDAwLg0KDQpgYGB7cn0NCiNNYWtpbmcgaGlzdG9ncmFtcyBmb3IgdGhlIGRhdGENCiNoaXN0b2dyYW0gb2YgTWNEb25hbGRzDQpoaXN0KG1jZG9uYWxkcyRjYWxfZmF0KQ0KYm94cGxvdChtY2RvbmFsZHMkY2FsX2ZhdCwgaG9yaXpvbnRhbD1UUlVFKSANCg0KI2hpc3RvZ3JhbSBvZiBkYWlyeSBxdWVlbg0KaGlzdChkYWlyeV9xdWVlbiRjYWxfZmF0KQ0KYm94cGxvdChkYWlyeV9xdWVlbiRjYWxfZmF0LCBob3Jpem9udGFsPVRSVUUpIA0KDQoNCmBgYA0KDQoNCg0KDQojIyMgRXhlcmNpc2UgMg0KDQojIyMjIEJhc2VkIG9uIHRoZSB0aGlzIHBsb3QsIGRvZXMgaXQgYXBwZWFyIHRoYXQgdGhlIGRhdGEgZm9sbG93IGEgbmVhcmx5IG5vcm1hbCBkaXN0cmlidXRpb24/DQoNCiMjIyMjIFdoaWxlIHRoZSBkYXRhIHBvaW50cyBkb24ndCBmYWxsIGludG8gdGhlIG5vcm1hbCBjdXJ2ZSBwZXJmZWN0bHkgdGhlIGRhdGEgZG9lcyBoYXZlIGEgYmVsbCBzaGFwZSwgd2hlcmUgdGhlIGVuZHMgZ2V0IGNsb3NlciB0byB6ZXJvIGFuZCBpbiB0aGUgbWlkZGxlIHRoZXJlIGlzIGEgcGVhay4gDQoNCmBgYHtyfQ0KI1RoaXMgYWRkcyBtZWFuIGFuZCBzZCBmb3IgZGFpcnkgcXVlZW4gc28gaXQgaXMgZWFzaWVyIHRvIGFjY2VzcyB0aGVtIHdoZW4gdGhleSBhcmUgbmFtZWQNCmRxbWVhbiA8LSBtZWFuKGRhaXJ5X3F1ZWVuJGNhbF9mYXQpDQpkcXNkPC0gc2QoZGFpcnlfcXVlZW4kY2FsX2ZhdCkNCg0KI0FkZGluZyBhIGRlbnNpdHkgaGlzdG9ncmFtIGFuZCBvdmVybGF5aW5nIGEgY3VydmUgb24gdGhlIGhpc3RvZ3JhbSB0byBzZWUgaWYgaXQgaXMgcmVsYXRpdmVseSBub3JtYWwuDQojdGhlIHN0YXQgZnVuY3Rpb24gYWRkcyB0aGUgbm9ybWFsIGxpbmUgb24gdGhlIGN1cnZlIHVzaW5nIHRoZSBzYW1lIG1lYW4gYW5kIHNxIGFuZCBjb2xvcnMgaXQgdG8gcmVkDQpnZ3Bsb3QoZGF0YT1kYWlyeV9xdWVlbiwgYWVzKHggPSBjYWxfZmF0KSkgKw0KICBnZW9tX2JsYW5rKCkgKw0KICBnZW9tX2hpc3RvZ3JhbShhZXMoeT0uLmRlbnNpdHkuLikpICsNCiAgc3RhdF9mdW5jdGlvbihmdW49IGRub3JtLCBhcmdzID0gYyhtZWFuPWRxbWVhbiwgc2Q9ZHFzZCksIGNvbCA9ICJ0b21hdG8iKQ0KDQojYWRkaW5nIGEgYmlucyBwYXJ0IHRvIGNoYW5nZSB0aGUgYW1vdW50IG9mIGJpbnMgb24gdGhlIGhpc3RvZ3JhbSB3aGljaCBnaXZlcyBhbm90aGVyIGxvb2sgaW50byB0aGUgZGF0YQ0KZ2dwbG90KGRhdGE9ZGFpcnlfcXVlZW4sIGFlcyh4ID0gY2FsX2ZhdCkpICsNCiAgZ2VvbV9ibGFuaygpICsNCiAgZ2VvbV9oaXN0b2dyYW0oYWVzKHk9Li5kZW5zaXR5Li4pLCBiaW5zPTIwKSArDQogIHN0YXRfZnVuY3Rpb24oZnVuPSBkbm9ybSwgYXJncyA9IGMobWVhbj1kcW1lYW4sIHNkPWRxc2QpLCBjb2wgPSAiYmx1ZSIpDQoNCmBgYA0KDQoNCg0KIyMjIEV4ZXJjaXNlIDMNCg0KIyMjIyBNYWtlIGEgbm9ybWFsIHByb2JhYmlsaXR5IHBsb3Qgb2Ygc2ltX25vcm0uIERvIGFsbCBvZiB0aGUgcG9pbnRzIGZhbGwgb24gdGhlIGxpbmU/IEhvdyBkb2VzIHRoaXMgcGxvdCBjb21wYXJlIHRvIHRoZSBwcm9iYWJpbGl0eSBwbG90IGZvciB0aGUgcmVhbCBkYXRhPyAoU2luY2Ugc2ltX25vcm0gaXMgbm90IGEgZGF0YWZyYW1lLCBpdCBjYW4gYmUgcHV0IGRpcmVjdGx5IGludG8gdGhlIHNhbXBsZSBhcmd1bWVudCBhbmQgdGhlIGRhdGEgYXJndW1lbnQgY2FuIGJlIGRyb3BwZWQuKQ0KDQojIyMjIyBBbGwgcG9pbnRzIGRvIG5vdCBmYWxsIG9uIHRoZSBsaW5lIGFuZCBjb21wYXJlZCB0byB0aGUgcmVhbCBkYXRhIGl0IGlzIHZlcnkgc2ltaWxhciB0byBlYWNoIG90aGVyLiBUaGUgZGF0YSBjb3VsZCBiZSByZWxhdGl2ZWx5IG5vcm1hbCB1c2luZyB0aGUgcXFwbG90IGFuZCBjb21wYXJpbmcgdGhlIHNpbXVsYXRlZCBkYXRhIHRvIHRoZSBhY3R1YWwgZGF0YS4NCg0KYGBge3J9DQojVGhpcyBtYWtlcyBhIHFxIHBsb3QgdG8gc2VlIGlmIHRoZSBncmFwaCBpcyBub3JtYWwgb3Igbm90IGJ1dCB1bmFibGUgdG8gZGV0ZXJtaW5lIGhvdyBjbG9zZSBpdCByZWFsbHkgaXMNCmdncGxvdChkYXRhID0gZGFpcnlfcXVlZW4sIGFlcyhzYW1wbGUgPSBjYWxfZmF0KSkgKyANCiAgZ2VvbV9saW5lKHN0YXQgPSAicXEiKQ0KDQojdGhpcyB3aWxsIG1ha2UgYSBzaW11bGF0ZWQgbm9ybWFsIHBsb3QgdG8gY29tcGFyZSB0aGUgZGFpcnkgcXVlZW4gZGF0YSB0byBhbmQgdGhlbiBnZyBwbG90IHdpdGggZ3JhcGggaXQNCnNpbV9ub3JtIDwtIHJub3JtKG4gPSBucm93KGRhaXJ5X3F1ZWVuKSwgbWVhbiA9IGRxbWVhbiwgc2QgPSBkcXNkKQ0KDQpnZ3Bsb3QoZGF0YSA9TlVMTCAsIGFlcyhzYW1wbGUgPSBzaW1fbm9ybSkpICsNCiAgZ2VvbV9saW5lKHN0YXQ9InFxIikNCmBgYA0KDQoNCg0KIyMjIEV4ZXJjaXNlIDQNCg0KIyMjIyBEb2VzIHRoZSBub3JtYWwgcHJvYmFiaWxpdHkgcGxvdCBmb3IgdGhlIGNhbG9yaWVzIGZyb20gZmF0IGxvb2sgc2ltaWxhciB0byB0aGUgcGxvdHMgY3JlYXRlZCBmb3IgdGhlIHNpbXVsYXRlZCBkYXRhPyBUaGF0IGlzLCBkbyB0aGUgcGxvdHMgcHJvdmlkZSBldmlkZW5jZSB0aGF0IHRoZSBjYWxvcmllcyBmcm9tIGZhdCBhcmUgbmVhcmx5IG5vcm1hbD8NCg0KIyMjIyMgQ29tcGFyaW5nIHRoZSB0d28gcGxvdHMgKHJlYWwgdnMgc2ltdWxhdGVkKSBpdCBzaG93cyB0aGF0IGl0IGlzIHZlcnkgc2ltaWxhciB0byBlYWNoIG90aGVyIGZvciB0aGUgbW9zdCBwYXJ0IGFuZCBzaW5jZSB0aGUgcGxvdCBvZiB0aGUgc2ltdWxhdGVkIGRhdGEgc2hvd3MgdGhhdCBpdCBpcyByZWxhdGl2ZWx5IG5vcm1hbCB0aGF0IG1lYW5zIHRoYXQgdGhlIGFjdHVhbCBkYWlyeSBxdWVlbiBkYXRhIGlzIHJlbGF0aXZlbHkgbm9ybWFsLg0KDQojIyMgRXhlcmNpc2UgNQ0KDQojIyMjIFVzaW5nIHRoZSBzYW1lIHRlY2huaXF1ZSwgZGV0ZXJtaW5lIHdoZXRoZXIgb3Igbm90IHRoZSBjYWxvcmllcyBmcm9tIE1jRG9uYWxk4oCZcyBtZW51IGFwcGVhciB0byBjb21lIGZyb20gYSBub3JtYWwgZGlzdHJpYnV0aW9uLg0KDQojIyMjIyBDb21wYXJpbmcgdGhlIHR3byBxcXBsb3RzIG9mIE1jRG9uYWxkcyBjYWxvcmllcyBhbmQgdGhlIHNpbXVsYXRlZCBncmFwaCBjbGVhcmx5IHNob3cgdGhhdCB0aGUgTWNkb25hbGRzIGNhbG9yaWVzIGRhdGEgaXMgbm90IHJlbGF0aXZlbHkgbm9ybWFsLiBUaGUgcXFwbG90IGRhdGEgb2YgdGhlIE1jRG9uYWxkcyBjYWxvcmllcyBzaG93cyBhIHJpZ2h0IHNrZXcgaW4gdGhlIGRhdGEuIA0KDQpgYGB7cn0NCiNJbiB0aGlzIGNodW5rIG9mIGNvZGUgaXQgaXMgZ29pbmcgdG8gbG9vayBhdCB0aGUgbWNkb25hbGRzIGRhdGEgb2YgY2Fsb3JpZXMgYW5kIHBsb3R0aW5nIGEgcXFwbG90IGZyb20gaXQNCmdncGxvdChkYXRhID0gbWNkb25hbGRzLCBhZXMoc2FtcGxlID0gY2Fsb3JpZXMpKSArIA0KICBnZW9tX2xpbmUoc3RhdCA9ICJxcSIpDQoNCiNJbiB0aGlzIGNodW5rIGl0IGlzIGdvaW5nIHRvIHNpbXVsYXRlIHRoZSBkYXRhIHVzaW5nIHRoZSBtZWFuIGFuZCBzZCBmcm9tIHRoZSBtY2RvbmFsZHMgZGF0YSBmb3IgY2Fsb3JpZXMNCm1jbWVhbjwtIG1lYW4obWNkb25hbGRzJGNhbG9yaWVzKQ0KbWNzZDwtIHNkKG1jZG9uYWxkcyRjYWxvcmllcykNCg0Kc2ltMV9ub3JtPC0gcm5vcm0obiA9bnJvdyhtY2RvbmFsZHMpLCBtZWFuPSBtY21lYW4sIHNkID1tY3NkICkNCg0KZ2dwbG90KGRhdGEgPSBOVUxMLCBhZXMoc2FtcGxlID0gc2ltMV9ub3JtKSkgKyANCiAgZ2VvbV9saW5lKHN0YXQgPSAicXEiKQ0KDQoNCmBgYA0KDQoNCg0KIyMjIEV4ZXJjaXNlIDYNCg0KIyMjIyBXcml0ZSBvdXQgdHdvIHByb2JhYmlsaXR5IHF1ZXN0aW9ucyB0aGF0IHlvdSB3b3VsZCBsaWtlIHRvIGFuc3dlciBhYm91dCBhbnkgb2YgdGhlIHJlc3RhdXJhbnRzIGluIHRoaXMgZGF0YXNldC4gQ2FsY3VsYXRlIHRob3NlIHByb2JhYmlsaXRpZXMgdXNpbmcgYm90aCB0aGUgdGhlb3JldGljYWwgbm9ybWFsIGRpc3RyaWJ1dGlvbiBhcyB3ZWxsIGFzIHRoZSBlbXBpcmljYWwgZGlzdHJpYnV0aW9uIChmb3VyIHByb2JhYmlsaXRpZXMgaW4gYWxsKS4gV2hpY2ggb25lIGhhZCBhIGNsb3NlciBhZ3JlZW1lbnQgYmV0d2VlbiB0aGUgdHdvIG1ldGhvZHM/DQoNCiMjIyMjIEluIHRoZSBmaXJzdCBxdWVzdGlvbiB3aGVyZSBpdCBhc2sgZm9yIHRoZSBzb2RpdW0gY29udGVudCBsZXNzIHRoYW4gMTAwMCB0aGUgbnVtYmVycyBmb3IgcG5vcm0gYW5kIHVzaW5nIHRoZSBlbXBpcmljYWwgbWV0aG9kIGFyZSBmYWlybHkgY2xvc2UgdG8gZWFjaCBvdGhlciBhdCAwLjMzLiBJbiB0aGUgc2Vjb25kIHF1ZXN0aW9uLCB0aGUgbnVtYmVycyBhcmUgc3RpbGwgZmFpcmx5IGNsb3NlIGF0IDAuMTEzIGNvbXBhcmVkIHRvIDAuMTE5IHdoaWNoIGNvdWxkIGluZGljYXRlIHRoYXQgdGhpcyBkaXN0cmlidXRpb24gaXMgcmVsYXRpdmVseSBub3JtYWwuDQoNCg0KIyMjIFF1ZXN0aW9uIDENCg0KIyMjIyBXaGF0IGlzIHRoZSBwcm9iYWJpbGl0eSB0aGF0IGEgTWNEb25hbGQncyBtZW51IGl0ZW0gaGFzIHNvZGl1bSBjb250ZW50IGxlc3MgdGhhbiAxMDAwPw0KDQpgYGB7cn0NCiN0aGlzIHdvdWxkIGNoZWNrIHRoZSBtZWFuIGFuZCBzdGFuZGFyZCBkZXZpYXRpb24gaW4gc29kaXVtIG9mIG1jZG9uYWxkcyBpdGVtDQptZWFuKG1jZG9uYWxkcyRzb2RpdW0pDQpzZChtY2RvbmFsZHMkc29kaXVtKQ0KDQojVXNpbmcgcG5vcm0gdG8gZmluZCB0aGUgcHJvYmFiaWxpdHkNCnBub3JtKDEwMDAsIDE0MzcuODk1LCAxMDM2LjE3MikNCg0KI1VzaW5nIGVtcGlyaWNhbCBtZXRob2QNCm1jZG9uYWxkcyAlPiUNCiAgZmlsdGVyKHNvZGl1bTwxMDAwKSAlPiUNCiAgc3VtbWFyaXNlKHBlcmNlbnQgPSBuKCkgLyBucm93KG1jZG9uYWxkcykpDQpgYGANCg0KIyMjIFF1ZXN0aW9uIDINCg0KIyMjIyBXaGF0IGlzIHRoZSBwcm9iYWJpbGl0eSB0aGF0IGFuIGl0ZW0gaW4gRGFpcnkgUXVlZW4gaGFzIHRvdGFsIGZhdCBhYm92ZSA1MD8NCg0KYGBge3J9DQojc2hvdyBtZWFuIGFuZCBzZCBvZiB0b3RhbCBmYXQgZm9yIGRxIGl0ZW1zDQptZWFuKGRhaXJ5X3F1ZWVuJHRvdGFsX2ZhdCkNCnNkKGRhaXJ5X3F1ZWVuJHRvdGFsX2ZhdCkNCg0KI3VzaW5nIHBub3JtIHRvIGZpbmQgdGhlIHByb2JhYmlsaXR5DQoxLSBwbm9ybSg1MCwyOC44NTcsIDE3LjUxOCkNCg0KI3VzaW5nIGVtcGlyaWNhbCBtZXRob2QgdG8gZmluZCBwcm9iYWJpbGl0eQ0KZGFpcnlfcXVlZW4gJT4lDQogICAgZmlsdGVyKHRvdGFsX2ZhdD41MCkgJT4lDQogIHN1bW1hcmlzZShwZXJjZW50ID0gbigpIC8gbnJvdyhkYWlyeV9xdWVlbikpDQpgYGANCg0KDQoNCg0KYGBge3J9DQojc2hvd2luZyBob3cgdG8gdXNlIHBub3JtIHRvIGZpbmQgdGhlIGFyZWEvcHJvYmFiaWxpdHkgdGhhdCBhIERhaXJ5IFF1ZWVuIGl0ZW0gaGFzIG1vcmUgdGhhbiA2MDAgY2Fsb3JpZXMgZnJvbSBmYXQgKDEtIGlzIGJlaW5nIHVzZWQgYmVjYXVzZSBpdCBsb29raW5nIGF0IHRoZSByaWdodCBzaWRlIG9mIHRoZSBkYXRhKQ0KMSAtIHBub3JtKHEgPSA2MDAsIG1lYW4gPSBkcW1lYW4sIHNkID0gZHFzZCkNCg0KI3RoaXMgb3RoZXIgd2F5IGlzIHRoZSBlbXBpcmljYWwgdmVyc2lvbiBidXQgc2VlbXMgd2F5IG1vcmUgY29tcGxpY2F0ZWQgdG8gY29kZSBjb21wYXJlZCB0byBqdXN0IHB1dHRpbmcgcG5vcm0gYnV0IGl0IGlzIGxpa2UgY2hlY2tpbmcgaG93IG1hbnkgZGF0YSBwb2ludHMgYXJlIG1vcmUgdGhhbiA2MDAgdGhlbiBkaXZpZGluZyB0aGF0IGJ5IHNhbXBsZSBzaXplDQoNCiNUaGUgZGF0YSBpcyBub3QgcmVhc29uYWJseSBjbG9zZSBpdCBpcyAxJSBjb21wYXJlZCB0byA1JSANCg0KZGFpcnlfcXVlZW4gJT4lIA0KICBmaWx0ZXIoY2FsX2ZhdCA+IDYwMCkgJT4lDQogIHN1bW1hcmlzZShwZXJjZW50ID0gbigpIC8gbnJvdyhkYWlyeV9xdWVlbikpDQpgYGANCg0KDQoNCg0KIyMjIEV4ZXJjaXNlIDcNCg0KIyMjIyBOb3cgbGV04oCZcyBjb25zaWRlciBzb21lIG9mIHRoZSBvdGhlciB2YXJpYWJsZXMgaW4gdGhlIGRhdGFzZXQuIE91dCBvZiBhbGwgdGhlIGRpZmZlcmVudCByZXN0YXVyYW50cywgd2hpY2ggb25lc+KAmSBkaXN0cmlidXRpb24gaXMgdGhlIGNsb3Nlc3QgdG8gbm9ybWFsIGZvciBzb2RpdW0/DQoNCiMjIyMjIEJ1cmdlciBLaW5nIHNlZW1zIHRvIGhhdmUgdGhlIGNsb3Nlc3QgdG8gbm9ybWFsIGZvciBzb2RpdW0uIA0KDQpJbnNlcnQgYW55IHRleHQgaGVyZS4NCmBgYHtyfQ0KI1Bsb3R0aW5nIGEgcXFwbG90IGZvciBhbGwgdGhlIHJlc3RhdXJhbnRzIHNvZGl1bSBsZXZlbCBhbmQgc2VlaW5nIHdoaWNoIG9uZSBpcyB0aGUgbW9zdCBub3JtYWwNCnFxbm9ybShtY2RvbmFsZHMkc29kaXVtLCBtYWluID0gIk1jRG9uYWxkcyIpDQoNCnFxbm9ybShkYWlyeV9xdWVlbiRzb2RpdW0sIG1haW4gPSAiRGFpcnkgUXVlZW4iKQ0KDQojVGhpcyBiYXNpY2FsbHkgbG9va3MgYXQgZmFzdCBmb29kIGFuZCBsb29rcyBmb3IgYXJieXMgaW4gdGhlIHJlc3RhdXJhbnRzIGFuZCB0aGVuIHRoZSANCg0KYXJieXM8LSBmYXN0Zm9vZCAlPiUNCiAgZmlsdGVyKHJlc3RhdXJhbnQgPT0gIkFyYnlzIikNCiAgcXFub3JtKGFyYnlzJHNvZGl1bSwgbWFpbj0iQXJieXMiKQ0KICANCmJ1cmdlcl9raW5nPC0gZmFzdGZvb2QgJT4lDQogIGZpbHRlcihyZXN0YXVyYW50ID09ICJCdXJnZXIgS2luZyIpDQogIHFxbm9ybShidXJnZXJfa2luZyRzb2RpdW0sIG1haW49IkJ1cmdlciBLaW5nIikNCiAgDQp0YWNvX2JlbGw8LSBmYXN0Zm9vZCAlPiUNCiAgZmlsdGVyKHJlc3RhdXJhbnQgPT0gIlRhY28gQmVsbCIpDQogIHFxbm9ybSh0YWNvX2JlbGwkc29kaXVtLCBtYWluPSJUYWNvIEJlbGwiKQ0KICANCnN1YndheTwtIGZhc3Rmb29kICU+JQ0KICBmaWx0ZXIocmVzdGF1cmFudCA9PSAiU3Vid2F5IikNCiAgcXFub3JtKHN1YndheSRzb2RpdW0sIG1haW49IlN1YndheSIpDQogIA0Kc29uaWM8LSBmYXN0Zm9vZCAlPiUNCiAgZmlsdGVyKHJlc3RhdXJhbnQgPT0gIlNvbmljIikNCiAgcXFub3JtKHNvbmljJHNvZGl1bSwgbWFpbj0iU29uaWMiKQ0KDQpjaGlja2ZpbGE8LSBmYXN0Zm9vZCAlPiUNCiAgZmlsdGVyKHJlc3RhdXJhbnQgPT0gIkNoaWNrIEZpbC1BIikNCiAgcXFub3JtKGNoaWNrZmlsYSRzb2RpdW0sIG1haW49IkNoaWNrIEZpbC1BIikNCiAgDQoNCmBgYA0KDQojIyMgRXhlcmNpc2UgOA0KDQojIyMjIE5vdGUgdGhhdCBzb21lIG9mIHRoZSBub3JtYWwgcHJvYmFiaWxpdHkgcGxvdHMgZm9yIHNvZGl1bSBkaXN0cmlidXRpb25zIHNlZW0gdG8gaGF2ZSBhIHN0ZXB3aXNlIHBhdHRlcm4uIHdoeSBkbyB5b3UgdGhpbmsgdGhpcyBtaWdodCBiZSB0aGUgY2FzZT8NCg0KIyMjIyMgVGhlcmUgaXMgYSBzdGVwd2lzZSB0byBzb21lIG9mIHRoZSBwbG90cyBiZWNhdXNlIG9mIHRoZSBkaXZlcnNlIG1lbnUgY2hvaWNlcyBmcm9tIHRoZXNlIHBsYWNlcyBmcm9tIGZyaWVzIHRvIGRyaW5rcyB0byBidXJnZXJzIHdoaWNoIGNvdWxkIGNhdXNlIHRoZSBwYXR0ZXJuLg0KDQojIyMgRXhlcmNpc2UgOQ0KDQojIyMjIEFzIHlvdSBjYW4gc2VlLCBub3JtYWwgcHJvYmFiaWxpdHkgcGxvdHMgY2FuIGJlIHVzZWQgYm90aCB0byBhc3Nlc3Mgbm9ybWFsaXR5IGFuZCB2aXN1YWxpemUgc2tld25lc3MuIE1ha2UgYSBub3JtYWwgcHJvYmFiaWxpdHkgcGxvdCBmb3IgdGhlIHRvdGFsIGNhcmJvaHlkcmF0ZXMgZnJvbSBhIHJlc3RhdXJhbnQgb2YgeW91ciBjaG9pY2UuIEJhc2VkIG9uIHRoaXMgbm9ybWFsIHByb2JhYmlsaXR5IHBsb3QsIGlzIHRoaXMgdmFyaWFibGUgbGVmdCBza2V3ZWQsIHN5bW1ldHJpYywgb3IgcmlnaHQgc2tld2VkPyBVc2UgYSBoaXN0b2dyYW0gdG8gY29uZmlybSB5b3VyIGZpbmRpbmdzLg0KDQojIyMjIyBCYXNlZCBvbiB0aGUgbm9ybWFsIHByb2JhYmlsaXR5IHBsb3QgaXQgY291bGQgYmUgc3ltbWV0cmljIGJlY2F1c2Ugbm90aGluZyByZWFsbHkgc2hvb3RzIHVwIG9yIGRvd24gdGhhdCBtdWNoIGFuZCBiYXNlZCBvbiB0aGUgaGlzdG9ncmFtIHRoZSBwb2ludHMgdGVuZCB0byBiZSBhbGwgYXJvdW5kIHRoZSBzYW1lIGZyZXF1ZW5jeSBidXQgb24gdGhlIHJpZ2h0IHNpZGUgaXQgaXMgbXVjaCBsb3dlci4NCg0KYGBge3J9DQojSSBhbSBnb2luZyB0byB1c2UgdGFjbyBiZWxsIGZvciB0b3RhbCBjYXJib2h5ZHJhdGVzDQpxcW5vcm0odGFjb19iZWxsJHRvdGFsX2NhcmIsIG1haW49IlRhY28gQmVsbCIpDQoNCmhpc3QodGFjb19iZWxsJHRvdGFsX2NhcmIpDQpgYGANCg0K