library(tidyverse)
library(openintro)

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?

Shapes of both histograms look the same as each set is unimodel and right skewed. Mcdonald’s fat colories is higer in Min, Max, mean(center) amount than that of Dairy Queen’s products. And, each increment of 200 cal can be seen on x-axis of Mcdonald’s plot and 100 cal interval on that of Dairy Queen’s graph.

Mcdonalds <- fastfood %>%
  filter(restaurant == "Mcdonalds")
summary(Mcdonalds$cal_fat)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    50.0   160.0   240.0   285.6   320.0  1270.0
hist(Mcdonalds$cal_fat)

dairy_queen <- fastfood %>%
  filter(restaurant == "Dairy Queen")

summary(dairy_queen$cal_fat)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##     0.0   160.0   220.0   260.5   310.0   670.0
hist(dairy_queen$cal_fat)

Exercise 2

Based on this plot, does it apper that the data follow a nearly normal distribution?

Answe: Yes. it is not exactly normal distribution because the peaks are higher as they approach to 0 on x-axis. The highest peak should be around 330 cal_fat at the mid of between min and max, it is said to be normal distribution.

dqmean = mean(dairy_queen$cal_fat)
dqsd = sd(dairy_queen$cal_fat)

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")
## Warning: The dot-dot notation (`..density..`) was deprecated in ggplot2 3.4.0.
## ℹ Please use `after_stat(density)` instead.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

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?

Answer: No. all the points do not fall on the line. The simulated plot has a larger slope between -2 and 1, but a lesser slope from 1 to 2. Apart from that, the normal distribution plot and simulated data plots are similar in the range between -1 to 1.

# Draw a normal probability plot (Q-Q Plot)
ggplot(data = dairy_queen, aes(sample = cal_fat)) + 
  geom_line(stat = "qq")

#data from normal distribution is simulated
sim_norm <- rnorm(n = nrow(dairy_queen), mean = dqmean, sd = dqsd)
# contruct a simulated data from single normal distribution
ggplot(data = NULL, aes(sample = sim_norm)) +
  geom_line(stat = "qq")

Exercise 4

Does the normal distribution plot for the calories from fat look similar to the plots created for simulated data? That is, do the plots provide evidence that the caloies are nearly normal.

Yes. Most all of the points on the normal probability (Q - Q ploat) fall on a diagonal line that stands out a data set is nearly normal according to the plots generated from previous exercise.

#simulate 8 different normal distribution data
qqnormsim(sample = cal_fat, data = dairy_queen) 

Exercise 5

Using the same technique, determine whether or not the calories from McDonald’s menu appear to come from a normal distribution. A data set of calories from McDonald’s menu is nearly normal too. Because the line generated from thicker points look diagonal although the slope is a little lesser at the starting and end points on the plot.

qqnormsim(sample = cal_fat, data = Mcdonalds)

### Exercise 6 Write out two probability questions that you would like to answer about any of the restaurants in this data set. Calculate those probabilities using both the theoretical normal distribution as well as the empirical distribution (four probabilities in all). Which one has a closer agreement between two methods?

Q1: What is the probability that Sonic restaurant has more than 50gs of cholesterol? Q2: What is the probability that Subway has less than that 35gs of total_fat?

1 - pnorm(q = 600, mean = dqmean, sd = dqsd)
## [1] 0.01501523
dairy_queen %>%
  filter(cal_fat > 600) %>%
  summarise(percent = n() / nrow(dairy_queen))
## # A tibble: 1 × 1
##   percent
##     <dbl>
## 1  0.0476
#Sonic > 50gs cholesterol calculations: 
Sonic <- fastfood %>%
  filter(restaurant == "Sonic")
s_mean <- mean(Sonic$cholesterol)
s_sd <- sd(Sonic$cholesterol)

1 - pnorm(q = 50, mean = s_mean, sd = s_sd)
## [1] 0.7190123
Sonic %>% 
  filter(cholesterol > 50) %>%
  summarise(percent = n() / nrow(Sonic))
## # A tibble: 1 × 1
##   percent
##     <dbl>
## 1   0.660
#Subway > 35gs total_fat calculations: 
Subway <- fastfood %>%
  filter(restaurant == "Subway")
s_mean <- mean(Subway$total_fat)
s_sd <- sd(Subway$total_fat)

1 - pnorm(q = 35, mean = s_mean, sd = s_sd)
## [1] 0.1290602
Subway %>% 
  filter(total_fat > 35) %>%
  summarise(percent = n() / nrow(Subway))
## # A tibble: 1 × 1
##   percent
##     <dbl>
## 1   0.135

Exercise 7

Now let’s consider some of the other variables in the data set. Out of all the different restaurants, which ones’ distribution is the closet to normal for sodium?

Answer: Burger King & Chick Fil-A

#Arbys sodium plot
arbys <- fastfood %>%
  filter(restaurant == "Arbys")
qqnorm(arbys$sodium, main = "Arbys")

#Burger King sodium plot
bk <- fastfood %>%
  filter(restaurant == "Burger King")

qqnorm(bk$sodium, main = "Burger King")

#Chick Fil-A sodium plot **
cfa <- fastfood %>%
  filter(restaurant == "Chick Fil-A")

qqnorm(cfa$sodium, main = "Chick Fil-A")

#Dairy Queen sodium plot
dq <- fastfood %>%
  filter(restaurant == "Dairy Queen")

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

#McDonald's sodium plot
mcd <- fastfood %>%
  filter(restaurant == "Mcdonalds")

qqnorm(mcd$sodium, main = "McDonald's")

#Sonic sodium plot
s <- fastfood %>%
  filter(restaurant == "Sonic")

qqnorm(s$sodium, main = "Sonic")

#Subway sodium plot
sw <- fastfood %>%
  filter(restaurant == "Subway")

qqnorm(sw$sodium, main = "Subway")

#Taco Bell sodium plot
tb <- fastfood %>%
  filter(restaurant == "Taco Bell")

qqnorm(tb$sodium, main = "Taco Bell")

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? A stepwise pattern of probability plots means data or vaiable is discrete ( as not categorical) that happens different levels of groups of food categories under the distribution.

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.

Answer: This variable, “sodium” is right skewed and the histogram confirms the frequencies of observations are lower than the frequencies of observations to the left side.

#Normal plot for sodium from fastfood
qqnorm(dq$sodium, main = "fastfood")
qqline(dq$sodium)

hist(dq$sodium)

LS0tCnRpdGxlOiAiTGFiXzRfTm9ybWFsX0Rpc3RyaWJ1dGlvbiIKYXV0aG9yOiAiTHdpbl9OYW5kYXJfU2h3ZSIKZGF0ZTogImByIFN5cy5EYXRlKClgIgpvdXRwdXQ6CiAgb3BlbmludHJvOjpsYWJfcmVwb3J0OiBkZWZhdWx0CiAgb3BlbmludHJvOjpsYWIzX3JlcG9ydDogZGVmYXVsdAotLS0KCmBgYHtyIGxvYWQtcGFja2FnZXMsIG1lc3NhZ2U9RkFMU0V9CmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KG9wZW5pbnRybykKYGBgCgojIyMgRXhlcmNpc2UgMQoKTWFrZSBhIHBsb3Qgb3IgcGxvdHMgdG8gdmlzdWFsaXplIHRoZSBkaXN0cmlidXRpb25zIG9mIHRoZSBhbW91bnQgb2YgY2Fsb3JpZXMgZnJvbSBmYXQgb2YgdGhlIG9wdGlvbnMgZnJvbSB0aGVzZSB0d28gcmVzdGF1cmFudHMuIEhvdyBkbyB0aGVpciBjZW50ZXJzLCBzaGFwZXMsIGFuZCBzcHJlYWRzIGNvbXBhcmU/CgpTaGFwZXMgb2YgYm90aCBoaXN0b2dyYW1zIGxvb2sgdGhlIHNhbWUgYXMgZWFjaCBzZXQgaXMgdW5pbW9kZWwgYW5kIHJpZ2h0IHNrZXdlZC4gTWNkb25hbGQncyBmYXQgY29sb3JpZXMgaXMgaGlnZXIgaW4gTWluLCBNYXgsIG1lYW4oY2VudGVyKSBhbW91bnQgdGhhbiB0aGF0IG9mIERhaXJ5IFF1ZWVuJ3MgcHJvZHVjdHMuIEFuZCwgZWFjaCBpbmNyZW1lbnQgb2YgMjAwIGNhbCBjYW4gYmUgc2VlbiBvbiB4LWF4aXMgb2YgTWNkb25hbGQncyBwbG90IGFuZCAxMDAgY2FsIGludGVydmFsIG9uIHRoYXQgb2YgRGFpcnkgUXVlZW4ncyBncmFwaC4KCmBgYHtyIGNvZGUgY2h1bmsgbGFiZWx9Ck1jZG9uYWxkcyA8LSBmYXN0Zm9vZCAlPiUKICBmaWx0ZXIocmVzdGF1cmFudCA9PSAiTWNkb25hbGRzIikKc3VtbWFyeShNY2RvbmFsZHMkY2FsX2ZhdCkKaGlzdChNY2RvbmFsZHMkY2FsX2ZhdCkKYGBgCmBgYHtyIENvZGUgdG8gZHJhd30KZGFpcnlfcXVlZW4gPC0gZmFzdGZvb2QgJT4lCiAgZmlsdGVyKHJlc3RhdXJhbnQgPT0gIkRhaXJ5IFF1ZWVuIikKCnN1bW1hcnkoZGFpcnlfcXVlZW4kY2FsX2ZhdCkKaGlzdChkYWlyeV9xdWVlbiRjYWxfZmF0KQpgYGAKCiMjIyBFeGVyY2lzZSAyCkJhc2VkIG9uIHRoaXMgcGxvdCwgZG9lcyBpdCBhcHBlciB0aGF0IHRoZSBkYXRhIGZvbGxvdyBhIG5lYXJseSBub3JtYWwgZGlzdHJpYnV0aW9uPwoKQW5zd2U6IFllcy4gaXQgaXMgbm90IGV4YWN0bHkgbm9ybWFsIGRpc3RyaWJ1dGlvbiBiZWNhdXNlIHRoZSBwZWFrcyBhcmUgaGlnaGVyIGFzIHRoZXkgYXBwcm9hY2ggdG8gMCBvbiB4LWF4aXMuIFRoZSBoaWdoZXN0IHBlYWsgc2hvdWxkIGJlIGFyb3VuZCAzMzAgY2FsX2ZhdCBhdCB0aGUgbWlkIG9mIGJldHdlZW4gbWluIGFuZCBtYXgsIGl0IGlzIHNhaWQgdG8gYmUgbm9ybWFsIGRpc3RyaWJ1dGlvbi4gCgpgYGB7ciBjb2RlLW5vcm1hbGRpc3RyaWJ1dGlvbn0KZHFtZWFuID0gbWVhbihkYWlyeV9xdWVlbiRjYWxfZmF0KQpkcXNkID0gc2QoZGFpcnlfcXVlZW4kY2FsX2ZhdCkKCmdncGxvdChkYXRhID0gZGFpcnlfcXVlZW4sIGFlcyh4ID0gY2FsX2ZhdCkpICsKICAgICAgICBnZW9tX2JsYW5rKCkgKwogICAgICAgIGdlb21faGlzdG9ncmFtKGFlcyh5ID0gLi5kZW5zaXR5Li4pKSArCiAgICAgICAgc3RhdF9mdW5jdGlvbihmdW4gPSBkbm9ybSwgYXJncyA9IGMobWVhbiA9IGRxbWVhbiwgc2QgPSBkcXNkKSwgY29sID0gInRvbWF0byIpCmBgYAoKIyMjIEV4ZXJjaXNlIDMKTWFrZSBhIG5vcm1hbCBwcm9iYWJpbGl0eSBwbG90IG9mIHNpbV9ub3JtLiBEbyBhbGwgb2YgdGhlIHBvaW50cyBmYWxsIG9uIHRoZSBsaW5lPyBIb3cgZG9lcyB0aGlzIHBsb3QgY29tcGFyZSB0byB0aGUgcHJvYmFiaWxpdHkgcGxvdCBmb3IgdGhlIHJlYWwgZGF0YT8gCgpBbnN3ZXI6IE5vLiBhbGwgdGhlIHBvaW50cyBkbyBub3QgZmFsbCBvbiB0aGUgbGluZS4gVGhlIHNpbXVsYXRlZCBwbG90IGhhcyBhIGxhcmdlciBzbG9wZSBiZXR3ZWVuIC0yIGFuZCAxLCBidXQgYSBsZXNzZXIgc2xvcGUgZnJvbSAxIHRvIDIuIEFwYXJ0IGZyb20gdGhhdCwgdGhlIG5vcm1hbCBkaXN0cmlidXRpb24gcGxvdCAgYW5kIHNpbXVsYXRlZCBkYXRhIHBsb3RzIGFyZSBzaW1pbGFyIGluIHRoZSByYW5nZSBiZXR3ZWVuIC0xIHRvIDEuCgpgYGB7ciBjb2RlLWV2YWx1YXRlLW5vcm1hbC1kaXN0cmlidXRpb259CiMgRHJhdyBhIG5vcm1hbCBwcm9iYWJpbGl0eSBwbG90IChRLVEgUGxvdCkKZ2dwbG90KGRhdGEgPSBkYWlyeV9xdWVlbiwgYWVzKHNhbXBsZSA9IGNhbF9mYXQpKSArIAogIGdlb21fbGluZShzdGF0ID0gInFxIikKI2RhdGEgZnJvbSBub3JtYWwgZGlzdHJpYnV0aW9uIGlzIHNpbXVsYXRlZApzaW1fbm9ybSA8LSBybm9ybShuID0gbnJvdyhkYWlyeV9xdWVlbiksIG1lYW4gPSBkcW1lYW4sIHNkID0gZHFzZCkKIyBjb250cnVjdCBhIHNpbXVsYXRlZCBkYXRhIGZyb20gc2luZ2xlIG5vcm1hbCBkaXN0cmlidXRpb24KZ2dwbG90KGRhdGEgPSBOVUxMLCBhZXMoc2FtcGxlID0gc2ltX25vcm0pKSArCiAgZ2VvbV9saW5lKHN0YXQgPSAicXEiKQoKYGBgCgojIyMgRXhlcmNpc2UgNApEb2VzIHRoZSBub3JtYWwgZGlzdHJpYnV0aW9uIHBsb3QgZm9yIHRoZSBjYWxvcmllcyBmcm9tIGZhdCBsb29rIHNpbWlsYXIgdG8gdGhlIHBsb3RzIGNyZWF0ZWQgZm9yIHNpbXVsYXRlZCBkYXRhPyBUaGF0IGlzLCBkbyB0aGUgcGxvdHMgcHJvdmlkZSBldmlkZW5jZSB0aGF0IHRoZSBjYWxvaWVzIGFyZSBuZWFybHkgbm9ybWFsLgoKWWVzLiBNb3N0IGFsbCBvZiB0aGUgcG9pbnRzIG9uIHRoZSBub3JtYWwgcHJvYmFiaWxpdHkgKFEgLSBRIHBsb2F0KSBmYWxsIG9uIGEgZGlhZ29uYWwgbGluZSB0aGF0IHN0YW5kcyBvdXQgYSBkYXRhIHNldCBpcyBuZWFybHkgbm9ybWFsIGFjY29yZGluZyB0byB0aGUgcGxvdHMgZ2VuZXJhdGVkIGZyb20gcHJldmlvdXMgZXhlcmNpc2UuCgpgYGB7ciBjb2RlLWNhbG9yaWVzLURhaXJ5UXVlZW59CiNzaW11bGF0ZSA4IGRpZmZlcmVudCBub3JtYWwgZGlzdHJpYnV0aW9uIGRhdGEKcXFub3Jtc2ltKHNhbXBsZSA9IGNhbF9mYXQsIGRhdGEgPSBkYWlyeV9xdWVlbikgCmBgYAoKIyMjIEV4ZXJjaXNlIDUKVXNpbmcgdGhlIHNhbWUgdGVjaG5pcXVlLCBkZXRlcm1pbmUgd2hldGhlciBvciBub3QgdGhlIGNhbG9yaWVzIGZyb20gTWNEb25hbGQncyBtZW51IGFwcGVhciB0byBjb21lIGZyb20gYSBub3JtYWwgZGlzdHJpYnV0aW9uLgpBIGRhdGEgc2V0IG9mIGNhbG9yaWVzIGZyb20gTWNEb25hbGQncyBtZW51IGlzIG5lYXJseSBub3JtYWwgdG9vLiBCZWNhdXNlIHRoZSBsaW5lIGdlbmVyYXRlZCBmcm9tIHRoaWNrZXIgcG9pbnRzIGxvb2sgZGlhZ29uYWwgYWx0aG91Z2ggdGhlIHNsb3BlIGlzIGEgbGl0dGxlIGxlc3NlciBhdCB0aGUgc3RhcnRpbmcgYW5kIGVuZCBwb2ludHMgb24gdGhlIHBsb3QuCgpgYGB7ciBjb2RlLWNhbG9yaWVzLU1jZG9uYWxzfQpxcW5vcm1zaW0oc2FtcGxlID0gY2FsX2ZhdCwgZGF0YSA9IE1jZG9uYWxkcykKYGBgCiMjIyBFeGVyY2lzZSA2CldyaXRlIG91dCB0d28gcHJvYmFiaWxpdHkgcXVlc3Rpb25zIHRoYXQgeW91IHdvdWxkIGxpa2UgdG8gYW5zd2VyIGFib3V0IGFueSBvZiB0aGUgcmVzdGF1cmFudHMgaW4gdGhpcyBkYXRhIHNldC4gQ2FsY3VsYXRlIHRob3NlIHByb2JhYmlsaXRpZXMgdXNpbmcgYm90aCB0aGUgdGhlb3JldGljYWwgbm9ybWFsIGRpc3RyaWJ1dGlvbiBhcyB3ZWxsIGFzIHRoZSBlbXBpcmljYWwgZGlzdHJpYnV0aW9uIChmb3VyIHByb2JhYmlsaXRpZXMgaW4gYWxsKS4gV2hpY2ggb25lIGhhcyBhIGNsb3NlciBhZ3JlZW1lbnQgYmV0d2VlbiB0d28gbWV0aG9kcz8KClExOiBXaGF0IGlzIHRoZSBwcm9iYWJpbGl0eSB0aGF0IFNvbmljIHJlc3RhdXJhbnQgaGFzIG1vcmUgdGhhbiA1MGdzIG9mIGNob2xlc3Rlcm9sPwpRMjogV2hhdCBpcyB0aGUgcHJvYmFiaWxpdHkgdGhhdCBTdWJ3YXkgaGFzIGxlc3MgdGhhbiB0aGF0IDM1Z3Mgb2YgdG90YWxfZmF0PwoKCmBgYHtyIGNvZGUtbm9ybWFscHJvYmFiaWxpdHl9CjEgLSBwbm9ybShxID0gNjAwLCBtZWFuID0gZHFtZWFuLCBzZCA9IGRxc2QpCmRhaXJ5X3F1ZWVuICU+JQogIGZpbHRlcihjYWxfZmF0ID4gNjAwKSAlPiUKICBzdW1tYXJpc2UocGVyY2VudCA9IG4oKSAvIG5yb3coZGFpcnlfcXVlZW4pKQoKI1NvbmljID4gNTBncyBjaG9sZXN0ZXJvbCBjYWxjdWxhdGlvbnM6IApTb25pYyA8LSBmYXN0Zm9vZCAlPiUKICBmaWx0ZXIocmVzdGF1cmFudCA9PSAiU29uaWMiKQpzX21lYW4gPC0gbWVhbihTb25pYyRjaG9sZXN0ZXJvbCkKc19zZCA8LSBzZChTb25pYyRjaG9sZXN0ZXJvbCkKCjEgLSBwbm9ybShxID0gNTAsIG1lYW4gPSBzX21lYW4sIHNkID0gc19zZCkKClNvbmljICU+JSAKICBmaWx0ZXIoY2hvbGVzdGVyb2wgPiA1MCkgJT4lCiAgc3VtbWFyaXNlKHBlcmNlbnQgPSBuKCkgLyBucm93KFNvbmljKSkKCiNTdWJ3YXkgPiAzNWdzIHRvdGFsX2ZhdCBjYWxjdWxhdGlvbnM6IApTdWJ3YXkgPC0gZmFzdGZvb2QgJT4lCiAgZmlsdGVyKHJlc3RhdXJhbnQgPT0gIlN1YndheSIpCnNfbWVhbiA8LSBtZWFuKFN1YndheSR0b3RhbF9mYXQpCnNfc2QgPC0gc2QoU3Vid2F5JHRvdGFsX2ZhdCkKCjEgLSBwbm9ybShxID0gMzUsIG1lYW4gPSBzX21lYW4sIHNkID0gc19zZCkKClN1YndheSAlPiUgCiAgZmlsdGVyKHRvdGFsX2ZhdCA+IDM1KSAlPiUKICBzdW1tYXJpc2UocGVyY2VudCA9IG4oKSAvIG5yb3coU3Vid2F5KSkKYGBgCgojIyMgRXhlcmNpc2UgNwpOb3cgbGV0J3MgY29uc2lkZXIgc29tZSBvZiB0aGUgb3RoZXIgdmFyaWFibGVzIGluIHRoZSBkYXRhIHNldC4gT3V0IG9mIGFsbCB0aGUgZGlmZmVyZW50IHJlc3RhdXJhbnRzLCB3aGljaCBvbmVzJyBkaXN0cmlidXRpb24gaXMgdGhlIGNsb3NldCB0byBub3JtYWwgZm9yIHNvZGl1bT8KCkFuc3dlcjogQnVyZ2VyIEtpbmcgJiBDaGljayBGaWwtQQoKYGBge3IgY29kZS1zb2RpdW1kaXN0cmlidXRpb259CiNBcmJ5cyBzb2RpdW0gcGxvdAphcmJ5cyA8LSBmYXN0Zm9vZCAlPiUKICBmaWx0ZXIocmVzdGF1cmFudCA9PSAiQXJieXMiKQpxcW5vcm0oYXJieXMkc29kaXVtLCBtYWluID0gIkFyYnlzIikKI0J1cmdlciBLaW5nIHNvZGl1bSBwbG90CmJrIDwtIGZhc3Rmb29kICU+JQogIGZpbHRlcihyZXN0YXVyYW50ID09ICJCdXJnZXIgS2luZyIpCgpxcW5vcm0oYmskc29kaXVtLCBtYWluID0gIkJ1cmdlciBLaW5nIikKI0NoaWNrIEZpbC1BIHNvZGl1bSBwbG90ICoqCmNmYSA8LSBmYXN0Zm9vZCAlPiUKICBmaWx0ZXIocmVzdGF1cmFudCA9PSAiQ2hpY2sgRmlsLUEiKQoKcXFub3JtKGNmYSRzb2RpdW0sIG1haW4gPSAiQ2hpY2sgRmlsLUEiKQojRGFpcnkgUXVlZW4gc29kaXVtIHBsb3QKZHEgPC0gZmFzdGZvb2QgJT4lCiAgZmlsdGVyKHJlc3RhdXJhbnQgPT0gIkRhaXJ5IFF1ZWVuIikKCnFxbm9ybShkcSRzb2RpdW0sIG1haW4gPSAiRGFpcnkgUXVlZW4iKQojTWNEb25hbGQncyBzb2RpdW0gcGxvdAptY2QgPC0gZmFzdGZvb2QgJT4lCiAgZmlsdGVyKHJlc3RhdXJhbnQgPT0gIk1jZG9uYWxkcyIpCgpxcW5vcm0obWNkJHNvZGl1bSwgbWFpbiA9ICJNY0RvbmFsZCdzIikKCiNTb25pYyBzb2RpdW0gcGxvdApzIDwtIGZhc3Rmb29kICU+JQogIGZpbHRlcihyZXN0YXVyYW50ID09ICJTb25pYyIpCgpxcW5vcm0ocyRzb2RpdW0sIG1haW4gPSAiU29uaWMiKQojU3Vid2F5IHNvZGl1bSBwbG90CnN3IDwtIGZhc3Rmb29kICU+JQogIGZpbHRlcihyZXN0YXVyYW50ID09ICJTdWJ3YXkiKQoKcXFub3JtKHN3JHNvZGl1bSwgbWFpbiA9ICJTdWJ3YXkiKQojVGFjbyBCZWxsIHNvZGl1bSBwbG90CnRiIDwtIGZhc3Rmb29kICU+JQogIGZpbHRlcihyZXN0YXVyYW50ID09ICJUYWNvIEJlbGwiKQoKcXFub3JtKHRiJHNvZGl1bSwgbWFpbiA9ICJUYWNvIEJlbGwiKQpgYGAKCgojIyMgRXhlcmNpc2UgOApOb3RlIHRoYXQgc29tZSBvZiB0aGUgbm9ybWFsIHByb2JhYmlsaXR5IHBsb3RzIGZvciBzb2RpdW0gZGlzdHJpYnV0aW9ucyBzZWVtIHRvIGhhdmUgYSBzdGVwd2lzZSBwYXR0ZXJuLiBXaHkgZG8geW91IHRoaW5rIHRoaXMgbWlnaHQgYmUgdGhlIGNhc2U/CkEgc3RlcHdpc2UgcGF0dGVybiBvZiBwcm9iYWJpbGl0eSBwbG90cyBtZWFucyBkYXRhIG9yIHZhaWFibGUgaXMgZGlzY3JldGUgKCBhcyBub3QgY2F0ZWdvcmljYWwpIHRoYXQgaGFwcGVucyBkaWZmZXJlbnQgbGV2ZWxzIG9mIGdyb3VwcyBvZiBmb29kIGNhdGVnb3JpZXMgdW5kZXIgdGhlIGRpc3RyaWJ1dGlvbi4KCiMjIyBFeGVyY2lzZSA5CkFzIHlvdSBjYW4gc2VlLCBub3JtYWwgcHJvYmFiaWxpdHkgcGxvdHMgY2FuIGJlIHVzZWQgYm90aCB0byBhc3Nlc3Mgbm9ybWFsaXR5IGFuZCB2aXN1YWxpemUgc2tld25lc3MuIE1ha2UgYSBub3JtYWwgcHJvYmFiaWxpdHkgcGxvdCBmb3IgdGhlIHRvdGFsIGNhcmJvaHlkcmF0ZXMgZnJvbSBhIHJlc3RhdXJhbnQgb2YgeW91ciBjaG9pY2UuIEJhc2VkIG9uIHRoaXMgbm9ybWFsIHByb2JhYmlsaXR5IHBsb3QsIGlzIHRoaXMgdmFyaWFibGUgbGVmdCBza2V3ZWQsIHN5bW1ldHJpYywgb3IgcmlnaHQgc2tld2VkPyBVc2UgYSBoaXN0b2dyYW0gdG8gY29uZmlybSB5b3VyIGZpbmRpbmdzLgoKQW5zd2VyOiBUaGlzIHZhcmlhYmxlLCAic29kaXVtIiBpcyByaWdodCBza2V3ZWQgYW5kIHRoZSBoaXN0b2dyYW0gY29uZmlybXMgdGhlIGZyZXF1ZW5jaWVzIG9mIG9ic2VydmF0aW9ucyBhcmUgbG93ZXIgdGhhbiB0aGUgZnJlcXVlbmNpZXMgb2Ygb2JzZXJ2YXRpb25zIHRvIHRoZSBsZWZ0IHNpZGUuCgpgYGB7ciBjb2RlLXNrZXduZXNzfQojTm9ybWFsIHBsb3QgZm9yIHNvZGl1bSBmcm9tIGZhc3Rmb29kCnFxbm9ybShkcSRzb2RpdW0sIG1haW4gPSAiZmFzdGZvb2QiKQpxcWxpbmUoZHEkc29kaXVtKQpoaXN0KGRxJHNvZGl1bSkKYGBgCgoK