library(tidyverse)
library(openintro)
library(ggplot2)

Exercise 1

All three histograms are right-skewed. In the first histogram, the first bin has the highest count, and the counts decrease with each bin. A bin width smaller than the default 30 would provide more information. In the second histogram, the second bin has the highest count.The first bin shows negative values, which represent early departures. Since more bins are present, this histogram shows that some departures were early, most departures had a short delay, and the rest had longer delays, but those longer delays were rare. When comparing these first two histograms, the second histogram shows more information, and it is a better model for the data. In the third histogram, the bin width is much too large, but it still shows right-skewed data, and some useful information can be taken from it. Overall, the second histogram is the best visualization of the departure delay variable as it displays the most features to understand the data.

ggplot(data = nycflights, aes(x = dep_delay)) +
  geom_histogram()
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

ggplot(data = nycflights, aes(x = dep_delay)) +
  geom_histogram(binwidth = 15)

ggplot(data = nycflights, aes(x = dep_delay)) +
  geom_histogram(binwidth = 150)

Exercise 2

68 flights meet the criteria of heading to SFO in February.

sfo_feb_flights <- nycflights %>%
  filter(dest == "SFO", month == 2)
glimpse(sfo_feb_flights)
## Rows: 68
## Columns: 16
## $ year      <int> 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, …
## $ month     <int> 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, …
## $ day       <int> 18, 3, 15, 18, 24, 25, 7, 15, 13, 8, 11, 13, 25, 20, 12, 27,…
## $ dep_time  <int> 1527, 613, 955, 1928, 1340, 1415, 1032, 1805, 1056, 656, 191…
## $ dep_delay <dbl> 57, 14, -5, 15, 2, -10, 1, 20, -4, -4, 40, -2, -1, -6, -7, 2…
## $ arr_time  <int> 1903, 1008, 1313, 2239, 1644, 1737, 1352, 2122, 1412, 1039, …
## $ arr_delay <dbl> 48, 38, -28, -6, -21, -13, -10, 2, -13, -6, 2, -5, -30, -22,…
## $ carrier   <chr> "DL", "UA", "DL", "UA", "UA", "UA", "B6", "AA", "UA", "DL", …
## $ tailnum   <chr> "N711ZX", "N502UA", "N717TW", "N24212", "N76269", "N532UA", …
## $ flight    <int> 1322, 691, 1765, 1214, 1111, 394, 641, 177, 642, 1865, 272, …
## $ origin    <chr> "JFK", "JFK", "JFK", "EWR", "EWR", "JFK", "JFK", "JFK", "JFK…
## $ dest      <chr> "SFO", "SFO", "SFO", "SFO", "SFO", "SFO", "SFO", "SFO", "SFO…
## $ air_time  <dbl> 358, 367, 338, 353, 341, 355, 359, 338, 347, 361, 332, 351, …
## $ distance  <dbl> 2586, 2586, 2586, 2565, 2565, 2586, 2586, 2586, 2586, 2586, …
## $ hour      <dbl> 15, 6, 9, 19, 13, 14, 10, 18, 10, 6, 19, 8, 10, 18, 7, 17, 1…
## $ minute    <dbl> 27, 13, 55, 28, 40, 15, 32, 5, 56, 56, 10, 33, 48, 49, 23, 2…

Exercise 3

The distribution of the arrival delays is skewed to the right with one peak. Also, the data are centered around -10 minutes, and the range is approximately -120 to 185 minutes. The data contains a few potential outliers.

library(ggeasy)
ggplot(sfo_feb_flights, aes(arr_delay)) +
  geom_histogram(binwidth = 8) +
  labs(title = "NYC Flights Arrival Delay") +
  xlab("Arrival Delay (in minutes)") +
  ylab("Count") +
  ggeasy::easy_center_title()

Exercise 4

Delta Air Lines (DL) and United Air Lines (UA) had the highest interquartile ranges. Since Delta Air Lines had fewer flights, it appears that the arrival delays varied more than United Air Lines. The same spread occurred over a smaller number of flights, so it had more variability overall.

However, since the difference in number of flights was only two, one could argue that they had nearly the same variability.

sfo_feb_flights %>%
  group_by(carrier) %>%
  summarise(median_dd = median(arr_delay), iqr_dd = IQR(arr_delay), n_flights = n())
## # A tibble: 5 × 4
##   carrier median_dd iqr_dd n_flights
##   <chr>       <dbl>  <dbl>     <int>
## 1 AA            5     17.5        10
## 2 B6          -10.5   12.2         6
## 3 DL          -15     22          19
## 4 UA          -10     22          21
## 5 VX          -22.5   21.2        12

Exercise 5

Without knowing this information, one benefit of using the month with the lowest mean is the mean typically shows the center of the data. It shows the average departure delay. A low average departure delay indicates that particular month will likely be low in the future. One con of using the month with the lowest mean is that the data is not symmetrical - it is right-skewed - so the mean might not show the best center of the data. One benefit of using the month with the lowest median is the median is a robust statistic when the data are skewed. A low median departure delay indicates that future departure delays will be around that value. One con of using the median is that different months have different numbers of flights, so those differences in numbers of flights might affect the median. Another con of using the median is that all the numbers are extremely similar, so the differences between months seem insignificant.

However, the months with the lowest mean and median were determined below, and both results showed October. September and October tied for the lowest median, but September did not have the lowest mean. Therefore, it does not matter which statistic is used in this case because October had the lowest mean and one of the lowest median departure delays.

ggplot(nycflights, aes(dep_delay)) +
  geom_histogram(binwidth = 15) +
  labs(title = "NYC Flights Arrival Delay") +
  xlab("Arrival Delay (in minutes)") +
  ylab("Count") +
  ggeasy::easy_center_title()

nycflights %>%
  group_by(month) %>%
  summarise(mean_dd = mean(dep_delay)) %>%
  arrange(mean_dd)
## # A tibble: 12 × 2
##    month mean_dd
##    <int>   <dbl>
##  1    10    5.88
##  2    11    6.10
##  3     9    6.87
##  4     1   10.2 
##  5     2   10.7 
##  6     8   12.6 
##  7     5   13.3 
##  8     3   13.5 
##  9     4   14.6 
## 10    12   17.4 
## 11     6   20.4 
## 12     7   20.8
nycflights %>%
  group_by(month) %>%
  summarise(median_dd = median(dep_delay), ) %>%
  arrange(median_dd)
## # A tibble: 12 × 2
##    month median_dd
##    <int>     <dbl>
##  1     9        -3
##  2    10        -3
##  3     1        -2
##  4     2        -2
##  5     4        -2
##  6    11        -2
##  7     3        -1
##  8     5        -1
##  9     8        -1
## 10     6         0
## 11     7         0
## 12    12         1
nrow(nycflights |> filter(month == 1))
## [1] 2610
nrow(nycflights |> filter(month == 2))
## [1] 2286
nrow(nycflights |> filter(month == 3))
## [1] 2869
nrow(nycflights |> filter(month == 4))
## [1] 2781
nrow(nycflights |> filter(month == 5))
## [1] 2821
nrow(nycflights |> filter(month == 6))
## [1] 2732
nrow(nycflights |> filter(month == 7))
## [1] 2742
nrow(nycflights |> filter(month == 8))
## [1] 2880
nrow(nycflights |> filter(month == 9))
## [1] 2681
nrow(nycflights |> filter(month == 10))
## [1] 2884
nrow(nycflights |> filter(month == 11))
## [1] 2733
nrow(nycflights |> filter(month == 12))
## [1] 2716

Exercise 6

La Guardia (LGA) had the best time departure percentage, so I would choose to fly out of there.

nycflights <- nycflights %>%
  mutate(dep_type = ifelse(dep_delay < 5, "on time", "delayed"))
nycflights %>%
  group_by(origin) %>%
  summarise(ot_dep_rate = sum(dep_type == "on time") / n()) %>%
  arrange(desc(ot_dep_rate))
## # A tibble: 3 × 2
##   origin ot_dep_rate
##   <chr>        <dbl>
## 1 LGA          0.728
## 2 JFK          0.694
## 3 EWR          0.637
library(nycflights13)
airports %>%
  filter(faa == 'LGA')
## # A tibble: 1 × 8
##   faa   name         lat   lon   alt    tz dst   tzone           
##   <chr> <chr>      <dbl> <dbl> <dbl> <dbl> <chr> <chr>           
## 1 LGA   La Guardia  40.8 -73.9    22    -5 A     America/New_York

Exercise 7

The following code creates a new data frame that includes the average speed in miles per hour. Table 1 shows the average speed for a few of the flights.

nycflights <- mutate(nycflights, avg_speed = distance/(air_time/60))
head(nycflights$avg_speed)
## [1] 474.4409 443.8889 394.9468 446.6667 355.2000 318.6957
library(gt)
## 
## Attaching package: 'gt'
## The following object is masked from 'package:openintro':
## 
##     sp500
nycflights |>
  select(avg_speed) |>
  gt_preview() |>
  tab_header(title = "Table 1",
             subtitle = "Preview of Average Speed (mph)")
Table 1
Preview of Average Speed (mph)
avg_speed
1 474.4409
2 443.8889
3 394.9468
4 446.6667
5 355.2000
6..32734
32735 410.8475

Exercise 8

Average speed and distance have a positive non-linear relationship as seen in the graph below. In general, as average speed of the planes increased, distance of the flights increased exponentially.

ggplot(nycflights, aes(x = avg_speed, y = distance, color = month)) +
  geom_point() +
  labs(title = "Average Speed vs. Distance of NYC Flights") +
  xlab("Average Speed (in mph)") +
  ylab("Distance (in miles)") +
  ggeasy::easy_center_title()

Exercise 9

The cutoff point where one can still expect to arrive on time is about 60 minutes. After about a 60-minute departure delay, none of the flights arrived on time.

LS0tDQp0aXRsZTogIkxhYiAyOiBJbnRybyB0byBEYXRhIg0KYXV0aG9yOiAiSnVsaWEgRmVycmlzIg0KZGF0ZTogImByIFN5cy5EYXRlKClgIg0Kb3V0cHV0OiBvcGVuaW50cm86OmxhYl9yZXBvcnQNCi0tLQ0KDQpgYGB7ciBsb2FkLXBhY2thZ2VzLCBtZXNzYWdlPUZBTFNFfQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KG9wZW5pbnRybykNCmxpYnJhcnkoZ2dwbG90MikNCmBgYA0KDQojIyMgRXhlcmNpc2UgMQ0KDQpBbGwgdGhyZWUgaGlzdG9ncmFtcyBhcmUgcmlnaHQtc2tld2VkLiBJbiB0aGUgZmlyc3QgaGlzdG9ncmFtLCB0aGUgZmlyc3QgYmluIGhhcyB0aGUgaGlnaGVzdCBjb3VudCwgYW5kIHRoZSBjb3VudHMgZGVjcmVhc2Ugd2l0aCBlYWNoIGJpbi4gQSBiaW4gd2lkdGggc21hbGxlciB0aGFuIHRoZSBkZWZhdWx0IDMwIHdvdWxkIHByb3ZpZGUgbW9yZSBpbmZvcm1hdGlvbi4gSW4gdGhlIHNlY29uZCBoaXN0b2dyYW0sIHRoZSBzZWNvbmQgYmluIGhhcyB0aGUgaGlnaGVzdCBjb3VudC5UaGUgZmlyc3QgYmluIHNob3dzIG5lZ2F0aXZlIHZhbHVlcywgd2hpY2ggcmVwcmVzZW50IGVhcmx5IGRlcGFydHVyZXMuIFNpbmNlIG1vcmUgYmlucyBhcmUgcHJlc2VudCwgdGhpcyBoaXN0b2dyYW0gc2hvd3MgdGhhdCBzb21lIGRlcGFydHVyZXMgd2VyZSBlYXJseSwgbW9zdCBkZXBhcnR1cmVzIGhhZCBhIHNob3J0IGRlbGF5LCBhbmQgdGhlIHJlc3QgaGFkIGxvbmdlciBkZWxheXMsIGJ1dCB0aG9zZSBsb25nZXIgZGVsYXlzIHdlcmUgcmFyZS4gV2hlbiBjb21wYXJpbmcgdGhlc2UgZmlyc3QgdHdvIGhpc3RvZ3JhbXMsIHRoZSBzZWNvbmQgaGlzdG9ncmFtIHNob3dzIG1vcmUgaW5mb3JtYXRpb24sIGFuZCBpdCBpcyBhIGJldHRlciBtb2RlbCBmb3IgdGhlIGRhdGEuIEluIHRoZSB0aGlyZCBoaXN0b2dyYW0sIHRoZSBiaW4gd2lkdGggaXMgbXVjaCB0b28gbGFyZ2UsIGJ1dCBpdCBzdGlsbCBzaG93cyByaWdodC1za2V3ZWQgZGF0YSwgYW5kIHNvbWUgdXNlZnVsIGluZm9ybWF0aW9uIGNhbiBiZSB0YWtlbiBmcm9tIGl0LiBPdmVyYWxsLCB0aGUgc2Vjb25kIGhpc3RvZ3JhbSBpcyB0aGUgYmVzdCB2aXN1YWxpemF0aW9uIG9mIHRoZSBkZXBhcnR1cmUgZGVsYXkgdmFyaWFibGUgYXMgaXQgZGlzcGxheXMgdGhlIG1vc3QgZmVhdHVyZXMgdG8gdW5kZXJzdGFuZCB0aGUgZGF0YS4NCg0KYGBge3IgY29tcGFyaW5nIGhpc3RvZ3JhbXN9DQpnZ3Bsb3QoZGF0YSA9IG55Y2ZsaWdodHMsIGFlcyh4ID0gZGVwX2RlbGF5KSkgKw0KICBnZW9tX2hpc3RvZ3JhbSgpDQpnZ3Bsb3QoZGF0YSA9IG55Y2ZsaWdodHMsIGFlcyh4ID0gZGVwX2RlbGF5KSkgKw0KICBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IDE1KQ0KZ2dwbG90KGRhdGEgPSBueWNmbGlnaHRzLCBhZXMoeCA9IGRlcF9kZWxheSkpICsNCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAxNTApDQpgYGANCg0KDQojIyMgRXhlcmNpc2UgMg0KDQo2OCBmbGlnaHRzIG1lZXQgdGhlIGNyaXRlcmlhIG9mIGhlYWRpbmcgdG8gU0ZPIGluIEZlYnJ1YXJ5Lg0KDQpgYGB7ciBzZm8tZmViLWZsaWdodHN9DQpzZm9fZmViX2ZsaWdodHMgPC0gbnljZmxpZ2h0cyAlPiUNCiAgZmlsdGVyKGRlc3QgPT0gIlNGTyIsIG1vbnRoID09IDIpDQpnbGltcHNlKHNmb19mZWJfZmxpZ2h0cykNCmBgYA0KDQoNCiMjIyBFeGVyY2lzZSAzDQoNClRoZSBkaXN0cmlidXRpb24gb2YgdGhlIGFycml2YWwgZGVsYXlzIGlzIHNrZXdlZCB0byB0aGUgcmlnaHQgd2l0aCBvbmUgcGVhay4gQWxzbywgdGhlIGRhdGEgYXJlIGNlbnRlcmVkIGFyb3VuZCAtMTAgbWludXRlcywgYW5kIHRoZSByYW5nZSBpcyBhcHByb3hpbWF0ZWx5IC0xMjAgdG8gMTg1IG1pbnV0ZXMuIFRoZSBkYXRhIGNvbnRhaW5zIGEgZmV3IHBvdGVudGlhbCBvdXRsaWVycy4NCg0KYGBge3IgYXJyaXZhbC1kZWxheXN9DQpsaWJyYXJ5KGdnZWFzeSkNCmdncGxvdChzZm9fZmViX2ZsaWdodHMsIGFlcyhhcnJfZGVsYXkpKSArDQogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gOCkgKw0KICBsYWJzKHRpdGxlID0gIk5ZQyBGbGlnaHRzIEFycml2YWwgRGVsYXkiKSArDQogIHhsYWIoIkFycml2YWwgRGVsYXkgKGluIG1pbnV0ZXMpIikgKw0KICB5bGFiKCJDb3VudCIpICsNCiAgZ2dlYXN5OjplYXN5X2NlbnRlcl90aXRsZSgpDQpgYGANCg0KDQojIyMgRXhlcmNpc2UgNA0KDQpEZWx0YSBBaXIgTGluZXMgKERMKSBhbmQgVW5pdGVkIEFpciBMaW5lcyAoVUEpIGhhZCB0aGUgaGlnaGVzdCBpbnRlcnF1YXJ0aWxlIHJhbmdlcy4gU2luY2UgRGVsdGEgQWlyIExpbmVzIGhhZCBmZXdlciBmbGlnaHRzLCBpdCBhcHBlYXJzIHRoYXQgdGhlIGFycml2YWwgZGVsYXlzIHZhcmllZCBtb3JlIHRoYW4gVW5pdGVkIEFpciBMaW5lcy4gVGhlIHNhbWUgc3ByZWFkIG9jY3VycmVkIG92ZXIgYSBzbWFsbGVyIG51bWJlciBvZiBmbGlnaHRzLCBzbyBpdCBoYWQgbW9yZSB2YXJpYWJpbGl0eSBvdmVyYWxsLiANCg0KSG93ZXZlciwgc2luY2UgdGhlIGRpZmZlcmVuY2UgaW4gbnVtYmVyIG9mIGZsaWdodHMgd2FzIG9ubHkgdHdvLCBvbmUgY291bGQgYXJndWUgdGhhdCB0aGV5IGhhZCBuZWFybHkgdGhlIHNhbWUgdmFyaWFiaWxpdHkuDQoNCmBgYHtyIGZlYl9mbGlnaHRzLXN0YXRpc3RpY3N9DQpzZm9fZmViX2ZsaWdodHMgJT4lDQogIGdyb3VwX2J5KGNhcnJpZXIpICU+JQ0KICBzdW1tYXJpc2UobWVkaWFuX2RkID0gbWVkaWFuKGFycl9kZWxheSksIGlxcl9kZCA9IElRUihhcnJfZGVsYXkpLCBuX2ZsaWdodHMgPSBuKCkpDQpgYGANCg0KDQojIyMgRXhlcmNpc2UgNQ0KDQpXaXRob3V0IGtub3dpbmcgdGhpcyBpbmZvcm1hdGlvbiwgb25lIGJlbmVmaXQgb2YgdXNpbmcgdGhlIG1vbnRoIHdpdGggdGhlIGxvd2VzdCBtZWFuIGlzIHRoZSBtZWFuIHR5cGljYWxseSBzaG93cyB0aGUgY2VudGVyIG9mIHRoZSBkYXRhLiBJdCBzaG93cyB0aGUgYXZlcmFnZSBkZXBhcnR1cmUgZGVsYXkuIEEgbG93IGF2ZXJhZ2UgZGVwYXJ0dXJlIGRlbGF5IGluZGljYXRlcyB0aGF0IHBhcnRpY3VsYXIgbW9udGggd2lsbCBsaWtlbHkgYmUgbG93IGluIHRoZSBmdXR1cmUuIE9uZSBjb24gb2YgdXNpbmcgdGhlIG1vbnRoIHdpdGggdGhlIGxvd2VzdCBtZWFuIGlzIHRoYXQgdGhlIGRhdGEgaXMgbm90IHN5bW1ldHJpY2FsIC0gaXQgaXMgcmlnaHQtc2tld2VkIC0gc28gdGhlIG1lYW4gbWlnaHQgbm90IHNob3cgdGhlIGJlc3QgY2VudGVyIG9mIHRoZSBkYXRhLiBPbmUgYmVuZWZpdCBvZiB1c2luZyB0aGUgbW9udGggd2l0aCB0aGUgbG93ZXN0IG1lZGlhbiBpcyB0aGUgbWVkaWFuIGlzIGEgcm9idXN0IHN0YXRpc3RpYyB3aGVuIHRoZSBkYXRhIGFyZSBza2V3ZWQuIEEgbG93IG1lZGlhbiBkZXBhcnR1cmUgZGVsYXkgaW5kaWNhdGVzIHRoYXQgZnV0dXJlIGRlcGFydHVyZSBkZWxheXMgd2lsbCBiZSBhcm91bmQgdGhhdCB2YWx1ZS4gT25lIGNvbiBvZiB1c2luZyB0aGUgbWVkaWFuIGlzIHRoYXQgZGlmZmVyZW50IG1vbnRocyBoYXZlIGRpZmZlcmVudCBudW1iZXJzIG9mIGZsaWdodHMsIHNvIHRob3NlIGRpZmZlcmVuY2VzIGluIG51bWJlcnMgb2YgZmxpZ2h0cyBtaWdodCBhZmZlY3QgdGhlIG1lZGlhbi4gQW5vdGhlciBjb24gb2YgdXNpbmcgdGhlIG1lZGlhbiBpcyB0aGF0IGFsbCB0aGUgbnVtYmVycyBhcmUgZXh0cmVtZWx5IHNpbWlsYXIsIHNvIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIG1vbnRocyBzZWVtIGluc2lnbmlmaWNhbnQuDQoNCkhvd2V2ZXIsIHRoZSBtb250aHMgd2l0aCB0aGUgbG93ZXN0IG1lYW4gYW5kIG1lZGlhbiB3ZXJlIGRldGVybWluZWQgYmVsb3csIGFuZCBib3RoIHJlc3VsdHMgc2hvd2VkIE9jdG9iZXIuIFNlcHRlbWJlciBhbmQgT2N0b2JlciB0aWVkIGZvciB0aGUgbG93ZXN0IG1lZGlhbiwgYnV0IFNlcHRlbWJlciBkaWQgbm90IGhhdmUgdGhlIGxvd2VzdCBtZWFuLiBUaGVyZWZvcmUsIGl0IGRvZXMgbm90IG1hdHRlciB3aGljaCBzdGF0aXN0aWMgaXMgdXNlZCBpbiB0aGlzIGNhc2UgYmVjYXVzZSBPY3RvYmVyIGhhZCB0aGUgbG93ZXN0IG1lYW4gYW5kIG9uZSBvZiB0aGUgbG93ZXN0IG1lZGlhbiBkZXBhcnR1cmUgZGVsYXlzLg0KDQpgYGB7ciBkZXBhcnR1cmUtZGVsYXlzfQ0KZ2dwbG90KG55Y2ZsaWdodHMsIGFlcyhkZXBfZGVsYXkpKSArDQogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gMTUpICsNCiAgbGFicyh0aXRsZSA9ICJOWUMgRmxpZ2h0cyBBcnJpdmFsIERlbGF5IikgKw0KICB4bGFiKCJBcnJpdmFsIERlbGF5IChpbiBtaW51dGVzKSIpICsNCiAgeWxhYigiQ291bnQiKSArDQogIGdnZWFzeTo6ZWFzeV9jZW50ZXJfdGl0bGUoKQ0KDQpueWNmbGlnaHRzICU+JQ0KICBncm91cF9ieShtb250aCkgJT4lDQogIHN1bW1hcmlzZShtZWFuX2RkID0gbWVhbihkZXBfZGVsYXkpKSAlPiUNCiAgYXJyYW5nZShtZWFuX2RkKQ0KDQpueWNmbGlnaHRzICU+JQ0KICBncm91cF9ieShtb250aCkgJT4lDQogIHN1bW1hcmlzZShtZWRpYW5fZGQgPSBtZWRpYW4oZGVwX2RlbGF5KSwgKSAlPiUNCiAgYXJyYW5nZShtZWRpYW5fZGQpDQoNCm5yb3cobnljZmxpZ2h0cyB8PiBmaWx0ZXIobW9udGggPT0gMSkpDQpucm93KG55Y2ZsaWdodHMgfD4gZmlsdGVyKG1vbnRoID09IDIpKQ0KbnJvdyhueWNmbGlnaHRzIHw+IGZpbHRlcihtb250aCA9PSAzKSkNCm5yb3cobnljZmxpZ2h0cyB8PiBmaWx0ZXIobW9udGggPT0gNCkpDQpucm93KG55Y2ZsaWdodHMgfD4gZmlsdGVyKG1vbnRoID09IDUpKQ0KbnJvdyhueWNmbGlnaHRzIHw+IGZpbHRlcihtb250aCA9PSA2KSkNCm5yb3cobnljZmxpZ2h0cyB8PiBmaWx0ZXIobW9udGggPT0gNykpDQpucm93KG55Y2ZsaWdodHMgfD4gZmlsdGVyKG1vbnRoID09IDgpKQ0KbnJvdyhueWNmbGlnaHRzIHw+IGZpbHRlcihtb250aCA9PSA5KSkNCm5yb3cobnljZmxpZ2h0cyB8PiBmaWx0ZXIobW9udGggPT0gMTApKQ0KbnJvdyhueWNmbGlnaHRzIHw+IGZpbHRlcihtb250aCA9PSAxMSkpDQpucm93KG55Y2ZsaWdodHMgfD4gZmlsdGVyKG1vbnRoID09IDEyKSkNCmBgYA0KDQoNCiMjIyBFeGVyY2lzZSA2DQoNCkxhIEd1YXJkaWEgKExHQSkgaGFkIHRoZSBiZXN0IHRpbWUgZGVwYXJ0dXJlIHBlcmNlbnRhZ2UsIHNvIEkgd291bGQgY2hvb3NlIHRvIGZseSBvdXQgb2YgdGhlcmUuDQoNCmBgYHtyIGJlc3QtYWlycG9ydH0NCm55Y2ZsaWdodHMgPC0gbnljZmxpZ2h0cyAlPiUNCiAgbXV0YXRlKGRlcF90eXBlID0gaWZlbHNlKGRlcF9kZWxheSA8IDUsICJvbiB0aW1lIiwgImRlbGF5ZWQiKSkNCm55Y2ZsaWdodHMgJT4lDQogIGdyb3VwX2J5KG9yaWdpbikgJT4lDQogIHN1bW1hcmlzZShvdF9kZXBfcmF0ZSA9IHN1bShkZXBfdHlwZSA9PSAib24gdGltZSIpIC8gbigpKSAlPiUNCiAgYXJyYW5nZShkZXNjKG90X2RlcF9yYXRlKSkNCg0KbGlicmFyeShueWNmbGlnaHRzMTMpDQphaXJwb3J0cyAlPiUNCiAgZmlsdGVyKGZhYSA9PSAnTEdBJykNCmBgYA0KDQoNCiMjIyBFeGVyY2lzZSA3DQoNClRoZSBmb2xsb3dpbmcgY29kZSBjcmVhdGVzIGEgbmV3IGRhdGEgZnJhbWUgdGhhdCBpbmNsdWRlcyB0aGUgYXZlcmFnZSBzcGVlZCBpbiBtaWxlcyBwZXIgaG91ci4gVGFibGUgMSBzaG93cyB0aGUgYXZlcmFnZSBzcGVlZCBmb3IgYSBmZXcgb2YgdGhlIGZsaWdodHMuDQoNCmBgYHtyIG5ldy12YXJpYWJsZX0NCm55Y2ZsaWdodHMgPC0gbXV0YXRlKG55Y2ZsaWdodHMsIGF2Z19zcGVlZCA9IGRpc3RhbmNlLyhhaXJfdGltZS82MCkpDQpoZWFkKG55Y2ZsaWdodHMkYXZnX3NwZWVkKQ0KDQpsaWJyYXJ5KGd0KQ0KbnljZmxpZ2h0cyB8Pg0KICBzZWxlY3QoYXZnX3NwZWVkKSB8Pg0KICBndF9wcmV2aWV3KCkgfD4NCiAgdGFiX2hlYWRlcih0aXRsZSA9ICJUYWJsZSAxIiwNCiAgICAgICAgICAgICBzdWJ0aXRsZSA9ICJQcmV2aWV3IG9mIEF2ZXJhZ2UgU3BlZWQgKG1waCkiKQ0KYGBgDQoNCiMjIyBFeGVyY2lzZSA4DQoNCkF2ZXJhZ2Ugc3BlZWQgYW5kIGRpc3RhbmNlIGhhdmUgYSBwb3NpdGl2ZSBub24tbGluZWFyIHJlbGF0aW9uc2hpcCBhcyBzZWVuIGluIHRoZSBncmFwaCBiZWxvdy4gSW4gZ2VuZXJhbCwgYXMgYXZlcmFnZSBzcGVlZCBvZiB0aGUgcGxhbmVzIGluY3JlYXNlZCwgZGlzdGFuY2Ugb2YgdGhlIGZsaWdodHMgaW5jcmVhc2VkIGV4cG9uZW50aWFsbHkuDQoNCmBgYHtyfQ0KZ2dwbG90KG55Y2ZsaWdodHMsIGFlcyh4ID0gYXZnX3NwZWVkLCB5ID0gZGlzdGFuY2UsIGNvbG9yID0gbW9udGgpKSArDQogIGdlb21fcG9pbnQoKSArDQogIGxhYnModGl0bGUgPSAiQXZlcmFnZSBTcGVlZCB2cy4gRGlzdGFuY2Ugb2YgTllDIEZsaWdodHMiKSArDQogIHhsYWIoIkF2ZXJhZ2UgU3BlZWQgKGluIG1waCkiKSArDQogIHlsYWIoIkRpc3RhbmNlIChpbiBtaWxlcykiKSArDQogIGdnZWFzeTo6ZWFzeV9jZW50ZXJfdGl0bGUoKQ0KYGBgDQoNCiMjIyBFeGVyY2lzZSA5DQoNClRoZSBjdXRvZmYgcG9pbnQgd2hlcmUgb25lIGNhbiBzdGlsbCBleHBlY3QgdG8gYXJyaXZlIG9uIHRpbWUgaXMgYWJvdXQgNjAgbWludXRlcy4gQWZ0ZXIgYWJvdXQgYSA2MC1taW51dGUgZGVwYXJ0dXJlIGRlbGF5LCBub25lIG9mIHRoZSBmbGlnaHRzIGFycml2ZWQgb24gdGltZS4NCg0KYGBge3IgcGxvdC10by1yZXBsaWNhdGUsIGVjaG89RkFMU0UsIGZpZy5zaG93PSJhc2lzIiwgZmlnLndpZHRoPTcsIGZpZy5oZWlnaHQ9NH0NCmRsX2FhX3VhIDwtIG55Y2ZsaWdodHMgJT4lDQogIGZpbHRlcihjYXJyaWVyID09ICJBQSIgfCBjYXJyaWVyID09ICJETCIgfCBjYXJyaWVyID09ICJVQSIpDQpnZ3Bsb3QoZGF0YSA9IGRsX2FhX3VhLCBhZXMoeCA9IGRlcF9kZWxheSwgeSA9IGFycl9kZWxheSwgY29sb3IgPSBjYXJyaWVyKSkgKw0KICBnZW9tX3BvaW50KCkNCmBgYA0KDQo=