install.packages(“ggpubr”)

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?

Both the plots for calories from fat of mcdonlads and dairy queens appears right skewed. Both hit there most frequent points at around 200 calories[appear most often]. Dairy queen has a max reach for calories from fat at about 700. McDonalds reaches well over 1000 calories from fat.

library(tidyverse)
library(openintro)
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  Arti~      380      60         7       2       0            95
## 2 Mcdonalds  Sing~      840     410        45      17       1.5         130
## 3 Mcdonalds  Doub~     1130     600        67      27       3           220
## 4 Mcdonalds  Gril~      750     280        31      10       0.5         155
## 5 Mcdonalds  Cris~      920     410        45      12       0.5         120
## 6 Mcdonalds  Big ~      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>
fastfood
## # A tibble: 515 x 17
##    restaurant item  calories cal_fat total_fat sat_fat trans_fat cholesterol
##    <chr>      <chr>    <dbl>   <dbl>     <dbl>   <dbl>     <dbl>       <dbl>
##  1 Mcdonalds  Arti~      380      60         7       2       0            95
##  2 Mcdonalds  Sing~      840     410        45      17       1.5         130
##  3 Mcdonalds  Doub~     1130     600        67      27       3           220
##  4 Mcdonalds  Gril~      750     280        31      10       0.5         155
##  5 Mcdonalds  Cris~      920     410        45      12       0.5         120
##  6 Mcdonalds  Big ~      540     250        28      10       1            80
##  7 Mcdonalds  Chee~      300     100        12       5       0.5          40
##  8 Mcdonalds  Clas~      510     210        24       4       0            65
##  9 Mcdonalds  Doub~      430     190        21      11       1            85
## 10 Mcdonalds  Doub~      770     400        45      21       2.5         175
## # ... with 505 more rows, and 9 more variables: sodium <dbl>, total_carb <dbl>,
## #   fiber <dbl>, sugar <dbl>, protein <dbl>, vit_a <dbl>, vit_c <dbl>,
## #   calcium <dbl>, salad <chr>
mcdonalds <- fastfood %>%
  dplyr::filter(restaurant == "Mcdonalds")
dairy_queen <- fastfood %>%
  dplyr::filter(restaurant == "Dairy Queen")
mcdonalds %>%
  ggplot() +
  geom_histogram(aes(x = cal_fat), bins = 6) +
  ggtitle("McDonalds fat calories") +
  xlab("Calories from Fat") +
  ylab("Frequency")

dairy_queen %>%
  ggplot() +
  geom_histogram(aes(x = cal_fat), bins = 6) +
  ggtitle("Dairy queen fat calories") +
  xlab("Calories from Fat") +
  ylab("Frequency")

Exercise 2

  1. Based on the this plot, does it appear that the data follow a nearly normal distribution? I believe the data follow a close to nearly normal distribution however not exact. Up until the 200-250 calories mark for both mcdonalds and dairy queen, it appears normal, but then after 250+ we witness the large right skew/flattening.
ggplot(data = mcdonalds, aes(sample = cal_fat)) + 
  geom_line(stat = "qq")

dqmean <- mean(dairy_queen$cal_fat)
dqsd   <- sd(dairy_queen$cal_fat)

ggplot(data = dairy_queen, aes(sample = cal_fat)) + 
  geom_line(stat = "qq")

sim_norm <- rnorm(n = nrow(dairy_queen), mean = dqmean, sd = dqsd)

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

Upon observing the plots, not all of the points fall on the line. When using qqnormsim function for a cal_fat sample for mcdonalds data, we are able to compare the original data with 8 other sim data plots.

qqnorm(sim_norm)

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 female heights are nearly normal? We witness that the normal probability plot for the calories from the fat look similar to the plots created for the simulated data. Overall we do see some dissimilarities as the cal_fat amount increases though

library(ggpubr)
ggqqplot(mcdonalds$cal_fat)

Exercise 5

Using the same technique, determine whether or not the calories from McDonald’s menu appear to come from a normal distribution. Similar to above question, we do see that the calories from McDonald’s menu appear to come from close to a normal distribution. We do see on the original data plot a upward position further right, however overall it is similar to the sim1-8

qqnormsim(sample = cal_fat, data = mcdonalds)

qqnorm(sim_norm)

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?
Probability for cholestrol greater than 20 at burger king?
burgerking <- fastfood %>% 
  dplyr::filter(restaurant == "Burger King")
head(burgerking)
## # 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 Burger Ki~ Amer~     1550    1134       126      47       8           805
## 2 Burger Ki~ Baco~     1000     585        65      24       3           200
## 3 Burger Ki~ Baco~      330     140        16       7       0            55
## 4 Burger Ki~ Baco~      290     120        14       6       0.5          40
## 5 Burger Ki~ Baco~     1040     630        48      28       2.5         220
## 6 Burger Ki~ Baco~      730     351        39       9       0            90
## # ... 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>
chols_mean <- mean(burgerking$cholesterol)
chols_sd <- sd(burgerking$cholesterol)


1-pnorm(20, mean = chols_mean, sd = chols_sd)
## [1] 0.7743965
#empirical
burgerking %>% 
  dplyr::filter(cholesterol > 20) %>%
  dplyr::summarise(percent = n() / nrow(burgerking))
## # A tibble: 1 x 1
##   percent
##     <dbl>
## 1   0.914

Probability for sat_fat greater than 5 at burger king?

burgerking <- fastfood %>% 
  dplyr::filter(restaurant == "Burger King")
head(burgerking)
## # 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 Burger Ki~ Amer~     1550    1134       126      47       8           805
## 2 Burger Ki~ Baco~     1000     585        65      24       3           200
## 3 Burger Ki~ Baco~      330     140        16       7       0            55
## 4 Burger Ki~ Baco~      290     120        14       6       0.5          40
## 5 Burger Ki~ Baco~     1040     630        48      28       2.5         220
## 6 Burger Ki~ Baco~      730     351        39       9       0            90
## # ... 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>
sat_fat_mean <- mean(burgerking$sat_fat)
sat_fat_sd <- sd(burgerking$sat_fat)


2-pnorm(5, mean = sat_fat_mean, sd = sat_fat_sd)
## [1] 1.758486
#empirical
burgerking %>% 
  dplyr::filter(sat_fat > 5) %>%
  dplyr::summarise(percent = n() / nrow(burgerking))
## # A tibble: 1 x 1
##   percent
##     <dbl>
## 1     0.7

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? Based on the plots below, Burger King had the distributions closest to normal for sodium. For me, taco bell would possibly be included in closest to normal, although this may be reconsidered.

fastfood %>% 
  group_by(restaurant) %>% 
  ggplot() +
  geom_histogram(aes(x = sodium), bins = 11) +
  ggtitle("Rest. Sodium") +
  xlab("Sodium") +
  ylab("Freq") +
  facet_wrap(. ~restaurant)

fastfood %>% 
group_by(restaurant) %>% 
ggplot(aes(sample = sodium)) + 
  geom_line(stat = "qq") +
  facet_wrap(.~restaurant)

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? My assumption would possibly be that the stepwise pattern may be in correlation to different food items offered. Certain foods offered may be highly produced then others. For example comparing BK cheeseburger to rodeo kings, we see a huge difference in sodium value

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.

We see a left skew in our burger plot for total carb. Upon viewing the histogram we do confirm this

burgerkingplot <- burgerking %>% 
  ggplot() +
  geom_line(aes(sample = total_carb), stat = "qq") +
  ggtitle("burgerking - Carbohydrates")
burgerkingplot

burgerking_hist <- burgerking%>% 
  ggplot() +
  geom_histogram(aes(x = total_carb), binwidth = 11) +
  xlab("total carbohydrates") + 
  ylab("frequency") +
  ggtitle("burgerking Carbohydrates")
burgerking_hist

LS0tDQp0aXRsZTogIkxhYiA0IC0gRGlzdHJpYnV0aW9ucyBvZiBSYW5kb20gVmFyaWFibGVzIg0KYXV0aG9yOiAiSm9obiBNYXpvbiINCmRhdGU6ICJgciBTeXMuRGF0ZSgpYCINCm91dHB1dDogb3BlbmludHJvOjpsYWJfcmVwb3J0DQotLS0NCmluc3RhbGwucGFja2FnZXMoImdncHViciIpDQpgYGB7ciBsb2FkLXBhY2thZ2VzLCBtZXNzYWdlPUZBTFNFfQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KG9wZW5pbnRybykNCmBgYA0KDQojIyMgRXhlcmNpc2UgMQ0KDQpNYWtlIGEgcGxvdCAob3IgcGxvdHMpIHRvIHZpc3VhbGl6ZSB0aGUgZGlzdHJpYnV0aW9ucyBvZiB0aGUgYW1vdW50IG9mIGNhbG9yaWVzDQpmcm9tIGZhdCBvZiB0aGUgb3B0aW9ucyBmcm9tIHRoZXNlIHR3byByZXN0YXVyYW50cy4gIEhvdyBkbyB0aGVpciBjZW50ZXJzLCBzaGFwZXMsDQphbmQgc3ByZWFkcyBjb21wYXJlPw0KDQpCb3RoIHRoZSBwbG90cyBmb3IgY2Fsb3JpZXMgZnJvbSBmYXQgb2YgbWNkb25sYWRzIGFuZCBkYWlyeSBxdWVlbnMgYXBwZWFycyByaWdodCBza2V3ZWQuIEJvdGggaGl0IHRoZXJlIG1vc3QgZnJlcXVlbnQgcG9pbnRzIGF0IGFyb3VuZCAyMDAgY2Fsb3JpZXNbYXBwZWFyIG1vc3Qgb2Z0ZW5dLiBEYWlyeSBxdWVlbiBoYXMgYSBtYXggcmVhY2ggZm9yIGNhbG9yaWVzIGZyb20gZmF0IGF0IGFib3V0IDcwMC4gTWNEb25hbGRzIHJlYWNoZXMgd2VsbCBvdmVyIDEwMDAgY2Fsb3JpZXMgZnJvbSBmYXQuDQoNCmBgYHtyIGxvYWQtZGF0YSwgcmVzdWx0cz1UUlVFfQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KG9wZW5pbnRybykNCmhlYWQoZmFzdGZvb2QpDQpmYXN0Zm9vZA0KDQptY2RvbmFsZHMgPC0gZmFzdGZvb2QgJT4lDQogIGRwbHlyOjpmaWx0ZXIocmVzdGF1cmFudCA9PSAiTWNkb25hbGRzIikNCmRhaXJ5X3F1ZWVuIDwtIGZhc3Rmb29kICU+JQ0KICBkcGx5cjo6ZmlsdGVyKHJlc3RhdXJhbnQgPT0gIkRhaXJ5IFF1ZWVuIikNCg0KYGBgDQoNCmBgYHtyfQ0KDQptY2RvbmFsZHMgJT4lDQogIGdncGxvdCgpICsNCiAgZ2VvbV9oaXN0b2dyYW0oYWVzKHggPSBjYWxfZmF0KSwgYmlucyA9IDYpICsNCiAgZ2d0aXRsZSgiTWNEb25hbGRzIGZhdCBjYWxvcmllcyIpICsNCiAgeGxhYigiQ2Fsb3JpZXMgZnJvbSBGYXQiKSArDQogIHlsYWIoIkZyZXF1ZW5jeSIpDQoNCmBgYA0KYGBge3J9DQpkYWlyeV9xdWVlbiAlPiUNCiAgZ2dwbG90KCkgKw0KICBnZW9tX2hpc3RvZ3JhbShhZXMoeCA9IGNhbF9mYXQpLCBiaW5zID0gNikgKw0KICBnZ3RpdGxlKCJEYWlyeSBxdWVlbiBmYXQgY2Fsb3JpZXMiKSArDQogIHhsYWIoIkNhbG9yaWVzIGZyb20gRmF0IikgKw0KICB5bGFiKCJGcmVxdWVuY3kiKQ0KYGBgDQoNCg0KDQoNCiMjIyBFeGVyY2lzZSAyDQoNCjIuICBCYXNlZCBvbiB0aGUgdGhpcyBwbG90LCBkb2VzIGl0IGFwcGVhciB0aGF0IHRoZSBkYXRhIGZvbGxvdyBhIG5lYXJseSBub3JtYWwgDQogICAgZGlzdHJpYnV0aW9uPw0KICAgIEkgYmVsaWV2ZSB0aGUgZGF0YSBmb2xsb3cgYSBjbG9zZSB0byBuZWFybHkgbm9ybWFsIGRpc3RyaWJ1dGlvbiBob3dldmVyIG5vdCBleGFjdC4gVXAgdW50aWwgdGhlIDIwMC0yNTAgY2Fsb3JpZXMgbWFyayBmb3IgYm90aCBtY2RvbmFsZHMgYW5kIGRhaXJ5IHF1ZWVuLCBpdCBhcHBlYXJzIG5vcm1hbCwgYnV0IHRoZW4gYWZ0ZXIgMjUwKyB3ZSB3aXRuZXNzIHRoZSBsYXJnZSByaWdodCBza2V3L2ZsYXR0ZW5pbmcuIA0KICAgIA0KYGBge3J9DQpnZ3Bsb3QoZGF0YSA9IG1jZG9uYWxkcywgYWVzKHNhbXBsZSA9IGNhbF9mYXQpKSArIA0KICBnZW9tX2xpbmUoc3RhdCA9ICJxcSIpDQpgYGANCg0KYGBge3J9DQoNCmRxbWVhbiA8LSBtZWFuKGRhaXJ5X3F1ZWVuJGNhbF9mYXQpDQpkcXNkICAgPC0gc2QoZGFpcnlfcXVlZW4kY2FsX2ZhdCkNCg0KZ2dwbG90KGRhdGEgPSBkYWlyeV9xdWVlbiwgYWVzKHNhbXBsZSA9IGNhbF9mYXQpKSArIA0KICBnZW9tX2xpbmUoc3RhdCA9ICJxcSIpDQoNCnNpbV9ub3JtIDwtIHJub3JtKG4gPSBucm93KGRhaXJ5X3F1ZWVuKSwgbWVhbiA9IGRxbWVhbiwgc2QgPSBkcXNkKQ0KDQpgYGANCg0KDQoNCiMjIyBFeGVyY2lzZSAzDQpNYWtlIGEgbm9ybWFsIHByb2JhYmlsaXR5IHBsb3Qgb2Ygc2ltX25vcm0uIERvIGFsbCBvZiB0aGUgcG9pbnRzIGZhbGwgb24gdGhlIGxpbmU/IEhvdyBkb2VzIHRoaXMgcGxvdCBjb21wYXJlIHRvIHRoZSBwcm9iYWJpbGl0eSBwbG90IGZvciB0aGUgcmVhbCBkYXRhPyAoU2luY2Ugc2ltX25vcm0gaXMgbm90IGEgZGF0YWZyYW1lLCBpdCBjYW4gYmUgcHV0IGRpcmVjdGx5IGludG8gdGhlIHNhbXBsZSBhcmd1bWVudCBhbmQgdGhlIGRhdGEgYXJndW1lbnQgY2FuIGJlIGRyb3BwZWQuKQ0KDQpVcG9uIG9ic2VydmluZyB0aGUgcGxvdHMsIG5vdCBhbGwgb2YgdGhlIHBvaW50cyBmYWxsIG9uIHRoZSBsaW5lLiBXaGVuIHVzaW5nIHFxbm9ybXNpbSBmdW5jdGlvbiBmb3IgYSBjYWxfZmF0IHNhbXBsZSBmb3IgbWNkb25hbGRzIGRhdGEsIHdlIGFyZSBhYmxlIHRvIGNvbXBhcmUgdGhlIG9yaWdpbmFsIGRhdGEgd2l0aCA4IG90aGVyIHNpbSBkYXRhIHBsb3RzLiAgDQpgYGB7cn0NCg0KcXFub3JtKHNpbV9ub3JtKQ0KYGBgDQoNCiMjIyBFeGVyY2lzZSA0IA0KRG9lcyB0aGUgbm9ybWFsIHByb2JhYmlsaXR5IHBsb3QgZm9yIHRoZSBjYWxvcmllcyBmcm9tIGZhdCBsb29rIHNpbWlsYXIgdG8gdGhlIHBsb3RzIGNyZWF0ZWQgZm9yIHRoZSBzaW11bGF0ZWQgZGF0YT8gVGhhdCBpcywgZG8gdGhlIHBsb3RzIHByb3ZpZGUgZXZpZGVuY2UgdGhhdCB0aGUgZmVtYWxlIGhlaWdodHMgYXJlIG5lYXJseSBub3JtYWw/DQpXZSB3aXRuZXNzIHRoYXQgdGhlIG5vcm1hbCBwcm9iYWJpbGl0eSBwbG90IGZvciB0aGUgY2Fsb3JpZXMgZnJvbSB0aGUgZmF0IGxvb2sgc2ltaWxhciB0byB0aGUgcGxvdHMgY3JlYXRlZCBmb3IgdGhlIHNpbXVsYXRlZCBkYXRhLiBPdmVyYWxsIHdlIGRvIHNlZSBzb21lIGRpc3NpbWlsYXJpdGllcyBhcyB0aGUgY2FsX2ZhdCBhbW91bnQgaW5jcmVhc2VzIHRob3VnaA0KYGBge3J9DQpsaWJyYXJ5KGdncHVicikNCmdncXFwbG90KG1jZG9uYWxkcyRjYWxfZmF0KQ0KYGBgDQoNCiMjIyBFeGVyY2lzZSA1DQpVc2luZyB0aGUgc2FtZSB0ZWNobmlxdWUsIGRldGVybWluZSB3aGV0aGVyIG9yIG5vdCB0aGUgY2Fsb3JpZXMgZnJvbSBNY0RvbmFsZOKAmXMgbWVudSBhcHBlYXIgdG8gY29tZSBmcm9tIGEgbm9ybWFsIGRpc3RyaWJ1dGlvbi4NClNpbWlsYXIgdG8gYWJvdmUgcXVlc3Rpb24sIHdlIGRvIHNlZSB0aGF0IHRoZSBjYWxvcmllcyBmcm9tIE1jRG9uYWxkJ3MgbWVudSBhcHBlYXIgdG8gY29tZSBmcm9tIGNsb3NlIHRvIGEgbm9ybWFsIGRpc3RyaWJ1dGlvbi4gV2UgZG8gc2VlIG9uIHRoZSBvcmlnaW5hbCBkYXRhIHBsb3QgYSB1cHdhcmQgcG9zaXRpb24gZnVydGhlciByaWdodCwgaG93ZXZlciBvdmVyYWxsIGl0IGlzIHNpbWlsYXIgdG8gdGhlIHNpbTEtOCANCg0KYGBge3J9DQpxcW5vcm1zaW0oc2FtcGxlID0gY2FsX2ZhdCwgZGF0YSA9IG1jZG9uYWxkcykNCnFxbm9ybShzaW1fbm9ybSkNCmBgYA0KDQoNCiMjIyBFeGVyY2lzZSA2IA0KDQogICAgV3JpdGUgb3V0IHR3byBwcm9iYWJpbGl0eSBxdWVzdGlvbnMgdGhhdCB5b3Ugd291bGQgbGlrZSB0byBhbnN3ZXIgYWJvdXQgYW55IG9mIHRoZSByZXN0YXVyYW50cyBpbiB0aGlzIGRhdGFzZXQuIENhbGN1bGF0ZSB0aG9zZSBwcm9iYWJpbGl0aWVzIHVzaW5nIGJvdGggdGhlIHRoZW9yZXRpY2FsIG5vcm1hbCBkaXN0cmlidXRpb24gYXMgd2VsbCBhcyB0aGUgZW1waXJpY2FsIGRpc3RyaWJ1dGlvbiAoZm91ciBwcm9iYWJpbGl0aWVzIGluIGFsbCkuIFdoaWNoIG9uZSBoYWQgYSBjbG9zZXIgYWdyZWVtZW50IGJldHdlZW4gdGhlIHR3byBtZXRob2RzPw0KICAgIFByb2JhYmlsaXR5IGZvciBjaG9sZXN0cm9sIGdyZWF0ZXIgdGhhbiAyMCBhdCBidXJnZXIga2luZz8NCmBgYHtyfQ0KYnVyZ2Vya2luZyA8LSBmYXN0Zm9vZCAlPiUgDQogIGRwbHlyOjpmaWx0ZXIocmVzdGF1cmFudCA9PSAiQnVyZ2VyIEtpbmciKQ0KaGVhZChidXJnZXJraW5nKQ0KDQoNCmNob2xzX21lYW4gPC0gbWVhbihidXJnZXJraW5nJGNob2xlc3Rlcm9sKQ0KY2hvbHNfc2QgPC0gc2QoYnVyZ2Vya2luZyRjaG9sZXN0ZXJvbCkNCg0KDQoxLXBub3JtKDIwLCBtZWFuID0gY2hvbHNfbWVhbiwgc2QgPSBjaG9sc19zZCkNCg0KDQojZW1waXJpY2FsDQpidXJnZXJraW5nICU+JSANCiAgZHBseXI6OmZpbHRlcihjaG9sZXN0ZXJvbCA+IDIwKSAlPiUNCiAgZHBseXI6OnN1bW1hcmlzZShwZXJjZW50ID0gbigpIC8gbnJvdyhidXJnZXJraW5nKSkNCmBgYA0KDQpQcm9iYWJpbGl0eSBmb3Igc2F0X2ZhdCBncmVhdGVyIHRoYW4gNSBhdCBidXJnZXIga2luZz8NCmBgYHtyfQ0KYnVyZ2Vya2luZyA8LSBmYXN0Zm9vZCAlPiUgDQogIGRwbHlyOjpmaWx0ZXIocmVzdGF1cmFudCA9PSAiQnVyZ2VyIEtpbmciKQ0KaGVhZChidXJnZXJraW5nKQ0KDQoNCnNhdF9mYXRfbWVhbiA8LSBtZWFuKGJ1cmdlcmtpbmckc2F0X2ZhdCkNCnNhdF9mYXRfc2QgPC0gc2QoYnVyZ2Vya2luZyRzYXRfZmF0KQ0KDQoNCjItcG5vcm0oNSwgbWVhbiA9IHNhdF9mYXRfbWVhbiwgc2QgPSBzYXRfZmF0X3NkKQ0KDQoNCiNlbXBpcmljYWwNCmJ1cmdlcmtpbmcgJT4lIA0KICBkcGx5cjo6ZmlsdGVyKHNhdF9mYXQgPiA1KSAlPiUNCiAgZHBseXI6OnN1bW1hcmlzZShwZXJjZW50ID0gbigpIC8gbnJvdyhidXJnZXJraW5nKSkNCmBgYA0KDQojIyMgRXhlcmNpc2UgNyANCk5vdyBsZXTigJlzIGNvbnNpZGVyIHNvbWUgb2YgdGhlIG90aGVyIHZhcmlhYmxlcyBpbiB0aGUgZGF0YXNldC4gT3V0IG9mIGFsbCB0aGUgZGlmZmVyZW50IHJlc3RhdXJhbnRzLCB3aGljaCBvbmVz4oCZIGRpc3RyaWJ1dGlvbiBpcyB0aGUgY2xvc2VzdCB0byBub3JtYWwgZm9yIHNvZGl1bT8NCkJhc2VkIG9uIHRoZSBwbG90cyBiZWxvdywgQnVyZ2VyIEtpbmcgaGFkIHRoZSBkaXN0cmlidXRpb25zIGNsb3Nlc3QgdG8gbm9ybWFsIGZvciBzb2RpdW0uIEZvciBtZSwgdGFjbyBiZWxsIHdvdWxkIHBvc3NpYmx5IGJlIGluY2x1ZGVkIGluIGNsb3Nlc3QgdG8gbm9ybWFsLCBhbHRob3VnaCB0aGlzIG1heSBiZSByZWNvbnNpZGVyZWQuDQpgYGB7cn0NCmZhc3Rmb29kICU+JSANCiAgZ3JvdXBfYnkocmVzdGF1cmFudCkgJT4lIA0KICBnZ3Bsb3QoKSArDQogIGdlb21faGlzdG9ncmFtKGFlcyh4ID0gc29kaXVtKSwgYmlucyA9IDExKSArDQogIGdndGl0bGUoIlJlc3QuIFNvZGl1bSIpICsNCiAgeGxhYigiU29kaXVtIikgKw0KICB5bGFiKCJGcmVxIikgKw0KICBmYWNldF93cmFwKC4gfnJlc3RhdXJhbnQpDQoNCmZhc3Rmb29kICU+JSANCmdyb3VwX2J5KHJlc3RhdXJhbnQpICU+JSANCmdncGxvdChhZXMoc2FtcGxlID0gc29kaXVtKSkgKyANCiAgZ2VvbV9saW5lKHN0YXQgPSAicXEiKSArDQogIGZhY2V0X3dyYXAoLn5yZXN0YXVyYW50KQ0KDQpgYGANCg0KIyMjIEV4ZXJjaXNlIDggDQpOb3RlIHRoYXQgc29tZSBvZiB0aGUgbm9ybWFsIHByb2JhYmlsaXR5IHBsb3RzIGZvciBzb2RpdW0gZGlzdHJpYnV0aW9ucyBzZWVtIHRvIGhhdmUgYSBzdGVwd2lzZSBwYXR0ZXJuLiB3aHkgZG8geW91IHRoaW5rIHRoaXMgbWlnaHQgYmUgdGhlIGNhc2U/DQpNeSBhc3N1bXB0aW9uIHdvdWxkIHBvc3NpYmx5IGJlIHRoYXQgdGhlIHN0ZXB3aXNlIHBhdHRlcm4gbWF5IGJlIGluIGNvcnJlbGF0aW9uIHRvIGRpZmZlcmVudCBmb29kIGl0ZW1zIG9mZmVyZWQuIENlcnRhaW4gZm9vZHMgb2ZmZXJlZCBtYXkgYmUgaGlnaGx5IHByb2R1Y2VkIHRoZW4gb3RoZXJzLiBGb3IgZXhhbXBsZSBjb21wYXJpbmcgQksgY2hlZXNlYnVyZ2VyIHRvIHJvZGVvIGtpbmdzLCB3ZSBzZWUgYSBodWdlIGRpZmZlcmVuY2UgaW4gc29kaXVtIHZhbHVlDQoNCg0KIyMjIEV4ZXJjaXNlIDkgDQpBcyB5b3UgY2FuIHNlZSwgbm9ybWFsIHByb2JhYmlsaXR5IHBsb3RzIGNhbiBiZSB1c2VkIGJvdGggdG8gYXNzZXNzIG5vcm1hbGl0eSBhbmQgdmlzdWFsaXplIHNrZXduZXNzLiBNYWtlIGEgbm9ybWFsIHByb2JhYmlsaXR5IHBsb3QgZm9yIHRoZSB0b3RhbCBjYXJib2h5ZHJhdGVzIGZyb20gYSByZXN0YXVyYW50IG9mIHlvdXIgY2hvaWNlLiBCYXNlZCBvbiB0aGlzIG5vcm1hbCBwcm9iYWJpbGl0eSBwbG90LCBpcyB0aGlzIHZhcmlhYmxlIGxlZnQgc2tld2VkLCBzeW1tZXRyaWMsIG9yIHJpZ2h0IHNrZXdlZD8NClVzZSBhIGhpc3RvZ3JhbSB0byBjb25maXJtIHlvdXIgZmluZGluZ3MuDQoNCldlIHNlZSBhIGxlZnQgc2tldyBpbiBvdXIgYnVyZ2VyIHBsb3QgZm9yIHRvdGFsIGNhcmIuIFVwb24gdmlld2luZyB0aGUgaGlzdG9ncmFtIHdlIGRvIGNvbmZpcm0gdGhpcw0KYGBge3J9DQoNCmJ1cmdlcmtpbmdwbG90IDwtIGJ1cmdlcmtpbmcgJT4lIA0KICBnZ3Bsb3QoKSArDQogIGdlb21fbGluZShhZXMoc2FtcGxlID0gdG90YWxfY2FyYiksIHN0YXQgPSAicXEiKSArDQogIGdndGl0bGUoImJ1cmdlcmtpbmcgLSBDYXJib2h5ZHJhdGVzIikNCmJ1cmdlcmtpbmdwbG90DQoNCmJ1cmdlcmtpbmdfaGlzdCA8LSBidXJnZXJraW5nJT4lIA0KICBnZ3Bsb3QoKSArDQogIGdlb21faGlzdG9ncmFtKGFlcyh4ID0gdG90YWxfY2FyYiksIGJpbndpZHRoID0gMTEpICsNCiAgeGxhYigidG90YWwgY2FyYm9oeWRyYXRlcyIpICsgDQogIHlsYWIoImZyZXF1ZW5jeSIpICsNCiAgZ2d0aXRsZSgiYnVyZ2Vya2luZyBDYXJib2h5ZHJhdGVzIikNCmJ1cmdlcmtpbmdfaGlzdA0KDQpgYGANCg0KLi4uDQoNCg==