library(tidyverse)
library(openintro)

To load nyc flight data and view names of variables.

data(nycflights)
names(nycflights)
##  [1] "year"      "month"     "day"       "dep_time"  "dep_delay" "arr_time" 
##  [7] "arr_delay" "carrier"   "tailnum"   "flight"    "origin"    "dest"     
## [13] "air_time"  "distance"  "hour"      "minute"

Exercise 1

Let’s vary the bin widths on these three histograms and observe. How do they compare? Are features revealed in one that are obscured in another?

1st histogram (default bin width of 30): 6 bins, max value significantly above 20000. 2nd histogram (bin width of 15): 13 bins, max value just above 20000. 3rd histogram (bin width of 150): 3 bins, max value just above 30000.

The 2nd histogram, that with the narrowest bin width, gave the most accurate breakdown of the number of flights that fell into each delay category while the 3rd histogram, that with the widest bin width, was the most obscure since there were only 3 bins to represent 32735 observations worth of flight delay data and thus each bin represented a much larger range in delay.

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

Create a new data frame that includes flights headed to SFO in February, and save this data frame as sfo_feb_flights. How many flights meet these criteria?

68 flights meet this criteria.

sfo_feb_flights <- nycflights %>%
  filter(dest == "SFO", month == 2)

count(sfo_feb_flights)
## # A tibble: 1 x 1
##       n
##   <int>
## 1    68

Exercise 3

Describe the distribution of the arrival delays of these flights using a histogram and appropriate summary statistics. Hint: The summary statistics you use should depend on the shape of the distribution.

ggplot(data = sfo_feb_flights, aes(x = arr_delay)) +
  geom_histogram(binwidth = 15)

sfo_feb_flights %>%
  summarise( 
            min_ad = min(arr_delay),
            max_ad = max(arr_delay),        
            median_ad = median(arr_delay),
            IQR_ad = IQR(arr_delay)
            )
## # A tibble: 1 x 4
##   min_ad max_ad median_ad IQR_ad
##    <dbl>  <dbl>     <dbl>  <dbl>
## 1    -66    196       -11   23.2

Exercise 4

Calculate the median and interquartile range for arr_delays of flights in in the sfo_feb_flights data frame, grouped by carrier. Which carrier has the most variable arrival delays?

Delta (DL) and United Airlines (UA) have the largest IQR values (Q3 - Q1) and thus the most variable arrival delays.

sfo_feb_flights %>%
  group_by(carrier) %>%
  summarise(median_ad = median(arr_delay), iqrad = IQR(arr_delay), n_flights = n())
## `summarise()` ungrouping output (override with `.groups` argument)
## # A tibble: 5 x 4
##   carrier median_ad iqrad 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

Suppose you really dislike departure delays and you want to schedule your travel in a month that minimizes your potential departure delay leaving NYC. One option is to choose the month with the lowest mean departure delay. Another option is to choose the month with the lowest median departure delay. What are the pros and cons of these two choices?

The lowest mean would give the average departure delay while the median would give the observation that sits at the middle of the data set. The lowest mean accounts for outlier values and thus would be the better choice when accounting for delays that are well-above average while the median would not account for outlier values and thus give a better idea of departure delays without accounting for the extraneous cases. For this occasion, the mean could inform a better decision.

July (mo 7) is the month with the highest average departure delay.

nycflights %>%
  group_by(month) %>%
  summarise(mean_dd = mean(dep_delay)) %>%
  arrange(desc(mean_dd))
## `summarise()` ungrouping output (override with `.groups` argument)
## # A tibble: 12 x 2
##    month mean_dd
##    <int>   <dbl>
##  1     7   20.8 
##  2     6   20.4 
##  3    12   17.4 
##  4     4   14.6 
##  5     3   13.5 
##  6     5   13.3 
##  7     8   12.6 
##  8     2   10.7 
##  9     1   10.2 
## 10     9    6.87
## 11    11    6.10
## 12    10    5.88

Exercise 6

If you were selecting an airport simply based on on time departure percentage, which NYC airport would you choose to fly out of?

LaGuardia (LGA) airport.

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))
## `summarise()` ungrouping output (override with `.groups` argument)
## # A tibble: 3 x 2
##   origin ot_dep_rate
##   <chr>        <dbl>
## 1 LGA          0.728
## 2 JFK          0.694
## 3 EWR          0.637

Exercise 7

Mutate the data frame so that it includes a new variable that contains the average speed, avg_speed traveled by the plane for each flight (in mph). Hint: Average speed can be calculated as distance divided by number of hours of travel, and note that air_time is given in minutes.

nycflights <- nycflights %>%
  mutate(avg_speed = distance / (air_time / 60))

Exercise 8

Make a scatterplot of avg_speed vs. distance. Describe the relationship between average speed and distance. Hint: Use geom_point().

The average speed increases until the distance is in the range of 1000-1500 (miles) and then it stabilizes.

ggplot(data = nycflights, mapping = aes(x = distance, y = avg_speed)) +
        geom_point()

Exercise 9

Replicate the following plot. Hint: The data frame plotted only contains flights from American Airlines, Delta Airlines, and United Airlines, and the points are colored by carrier. Once you replicate the plot, determine (roughly) what the cutoff point is for departure delays where you can still expect to get to your destination on time.

c_delay <- nycflights %>%
  filter(carrier == 'AA' | carrier == 'DL' | carrier == 'UA')
ggplot(c_delay, aes(dep_delay, arr_delay, color = carrier)) + geom_point()

Based on the below plot, the cutoff point is approximately 20mins. After this point, as departure delays climb so do arrival delays.

ggplot(c_delay, aes(dep_delay, arr_delay, color = carrier)) +
        xlim(-10, 60) +
        ylim(-10, 60) +
        geom_point()
## Warning: Removed 7108 rows containing missing values (geom_point).

LS0tDQp0aXRsZTogIkRBVEEgNjA2IExhYiAyIg0KYXV0aG9yOiAiTWFnbnVzIFNrb25iZXJnIg0KZGF0ZTogImByIFN5cy5EYXRlKClgIg0Kb3V0cHV0OiBvcGVuaW50cm86OmxhYl9yZXBvcnQNCi0tLQ0KDQpgYGB7ciBsb2FkLXBhY2thZ2VzLCBtZXNzYWdlPUZBTFNFfQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KG9wZW5pbnRybykNCmBgYA0KDQpUbyBsb2FkIG55YyBmbGlnaHQgZGF0YSBhbmQgdmlldyBuYW1lcyBvZiB2YXJpYWJsZXMuDQpgYGB7ciBsb2FkLWRhdGEsIG1lc3NhZ2U9RkFMU0V9DQpkYXRhKG55Y2ZsaWdodHMpDQpgYGANCg0KYGBge3IgbmFtZXMsIG1lc3NhZ2U9RkFMU0V9DQpuYW1lcyhueWNmbGlnaHRzKQ0KYGBgDQojIyMgRXhlcmNpc2UgMQ0KDQoqKkxldCdzIHZhcnkgdGhlIGJpbiB3aWR0aHMgb24gdGhlc2UgdGhyZWUgaGlzdG9ncmFtcyBhbmQgb2JzZXJ2ZS4gSG93IGRvIHRoZXkgY29tcGFyZT8gQXJlIGZlYXR1cmVzIHJldmVhbGVkIGluIG9uZSB0aGF0IGFyZSBvYnNjdXJlZCBpbiBhbm90aGVyPyoqDQoNCjFzdCBoaXN0b2dyYW0gKGRlZmF1bHQgYmluIHdpZHRoIG9mIDMwKTogNiBiaW5zLCBtYXggdmFsdWUgc2lnbmlmaWNhbnRseSBhYm92ZSAyMDAwMC4NCjJuZCBoaXN0b2dyYW0gKGJpbiB3aWR0aCBvZiAxNSk6IDEzIGJpbnMsIG1heCB2YWx1ZSBqdXN0IGFib3ZlIDIwMDAwLg0KM3JkIGhpc3RvZ3JhbSAoYmluIHdpZHRoIG9mIDE1MCk6IDMgYmlucywgbWF4IHZhbHVlIGp1c3QgYWJvdmUgMzAwMDAuDQoNClRoZSAybmQgaGlzdG9ncmFtLCB0aGF0IHdpdGggdGhlIG5hcnJvd2VzdCBiaW4gd2lkdGgsIGdhdmUgdGhlIG1vc3QgYWNjdXJhdGUgYnJlYWtkb3duIG9mIHRoZSBudW1iZXIgb2YgZmxpZ2h0cyB0aGF0IGZlbGwgaW50byBlYWNoIGRlbGF5IGNhdGVnb3J5IHdoaWxlIHRoZSAzcmQgaGlzdG9ncmFtLCB0aGF0IHdpdGggdGhlIHdpZGVzdCBiaW4gd2lkdGgsIHdhcyB0aGUgbW9zdCBvYnNjdXJlIHNpbmNlIHRoZXJlIHdlcmUgb25seSAzIGJpbnMgdG8gcmVwcmVzZW50IDMyNzM1IG9ic2VydmF0aW9ucyB3b3J0aCBvZiBmbGlnaHQgZGVsYXkgZGF0YSBhbmQgdGh1cyBlYWNoIGJpbiByZXByZXNlbnRlZCBhIG11Y2ggbGFyZ2VyIHJhbmdlIGluIGRlbGF5Lg0KDQpgYGB7cn0NCmdncGxvdChkYXRhID0gbnljZmxpZ2h0cywgYWVzKHggPSBkZXBfZGVsYXkpKSArDQogIGdlb21faGlzdG9ncmFtKCkNCg0KZ2dwbG90KGRhdGEgPSBueWNmbGlnaHRzLCBhZXMoeCA9IGRlcF9kZWxheSkpICsNCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAxNSkNCg0KZ2dwbG90KGRhdGEgPSBueWNmbGlnaHRzLCBhZXMoeCA9IGRlcF9kZWxheSkpICsNCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAxNTApDQpgYGANCg0KIyMjIEV4ZXJjaXNlIDINCg0KKipDcmVhdGUgYSBuZXcgZGF0YSBmcmFtZSB0aGF0IGluY2x1ZGVzIGZsaWdodHMgaGVhZGVkIHRvIFNGTyBpbiBGZWJydWFyeSwgYW5kIHNhdmUgdGhpcyBkYXRhIGZyYW1lIGFzIHNmb19mZWJfZmxpZ2h0cy4gSG93IG1hbnkgZmxpZ2h0cyBtZWV0IHRoZXNlIGNyaXRlcmlhPyoqDQoNCjY4IGZsaWdodHMgbWVldCB0aGlzIGNyaXRlcmlhLg0KDQpgYGB7cn0NCnNmb19mZWJfZmxpZ2h0cyA8LSBueWNmbGlnaHRzICU+JQ0KICBmaWx0ZXIoZGVzdCA9PSAiU0ZPIiwgbW9udGggPT0gMikNCg0KY291bnQoc2ZvX2ZlYl9mbGlnaHRzKQ0KYGBgDQoNCiMjIyBFeGVyY2lzZSAzDQoNCioqRGVzY3JpYmUgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgYXJyaXZhbCBkZWxheXMgb2YgdGhlc2UgZmxpZ2h0cyB1c2luZyBhIGhpc3RvZ3JhbSBhbmQgYXBwcm9wcmlhdGUgc3VtbWFyeSBzdGF0aXN0aWNzLiBIaW50OiBUaGUgc3VtbWFyeSBzdGF0aXN0aWNzIHlvdSB1c2Ugc2hvdWxkIGRlcGVuZCBvbiB0aGUgc2hhcGUgb2YgdGhlIGRpc3RyaWJ1dGlvbi4qKg0KDQpgYGB7cn0NCmdncGxvdChkYXRhID0gc2ZvX2ZlYl9mbGlnaHRzLCBhZXMoeCA9IGFycl9kZWxheSkpICsNCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAxNSkNCg0KYGBgDQoNCmBgYHtyfQ0Kc2ZvX2ZlYl9mbGlnaHRzICU+JQ0KICBzdW1tYXJpc2UoIA0KICAgICAgICAgICAgbWluX2FkID0gbWluKGFycl9kZWxheSksDQogICAgICAgICAgICBtYXhfYWQgPSBtYXgoYXJyX2RlbGF5KSwgICAgICAgIA0KICAgICAgICAgICAgbWVkaWFuX2FkID0gbWVkaWFuKGFycl9kZWxheSksDQogICAgICAgICAgICBJUVJfYWQgPSBJUVIoYXJyX2RlbGF5KQ0KICAgICAgICAgICAgKQ0KYGBgDQoNCiMjIyBFeGVyY2lzZSA0DQoNCioqQ2FsY3VsYXRlIHRoZSBtZWRpYW4gYW5kIGludGVycXVhcnRpbGUgcmFuZ2UgZm9yIGFycl9kZWxheXMgb2YgZmxpZ2h0cyBpbiBpbiB0aGUgc2ZvX2ZlYl9mbGlnaHRzIGRhdGEgZnJhbWUsIGdyb3VwZWQgYnkgY2Fycmllci4gV2hpY2ggY2FycmllciBoYXMgdGhlIG1vc3QgdmFyaWFibGUgYXJyaXZhbCBkZWxheXM/KioNCg0KRGVsdGEgKERMKSBhbmQgVW5pdGVkIEFpcmxpbmVzIChVQSkgaGF2ZSB0aGUgbGFyZ2VzdCBJUVIgdmFsdWVzIChRMyAtIFExKSBhbmQgdGh1cyB0aGUgbW9zdCB2YXJpYWJsZSBhcnJpdmFsIGRlbGF5cy4NCg0KYGBge3J9DQpzZm9fZmViX2ZsaWdodHMgJT4lDQogIGdyb3VwX2J5KGNhcnJpZXIpICU+JQ0KICBzdW1tYXJpc2UobWVkaWFuX2FkID0gbWVkaWFuKGFycl9kZWxheSksIGlxcmFkID0gSVFSKGFycl9kZWxheSksIG5fZmxpZ2h0cyA9IG4oKSkNCmBgYA0KDQojIyMgRXhlcmNpc2UgNQ0KDQoqKlN1cHBvc2UgeW91IHJlYWxseSBkaXNsaWtlIGRlcGFydHVyZSBkZWxheXMgYW5kIHlvdSB3YW50IHRvIHNjaGVkdWxlIHlvdXIgdHJhdmVsIGluIGEgbW9udGggdGhhdCBtaW5pbWl6ZXMgeW91ciBwb3RlbnRpYWwgZGVwYXJ0dXJlIGRlbGF5IGxlYXZpbmcgTllDLiBPbmUgb3B0aW9uIGlzIHRvIGNob29zZSB0aGUgbW9udGggd2l0aCB0aGUgbG93ZXN0IG1lYW4gZGVwYXJ0dXJlIGRlbGF5LiBBbm90aGVyIG9wdGlvbiBpcyB0byBjaG9vc2UgdGhlIG1vbnRoIHdpdGggdGhlIGxvd2VzdCBtZWRpYW4gZGVwYXJ0dXJlIGRlbGF5LiBXaGF0IGFyZSB0aGUgcHJvcyBhbmQgY29ucyBvZiB0aGVzZSB0d28gY2hvaWNlcz8qKg0KDQpUaGUgbG93ZXN0IG1lYW4gd291bGQgZ2l2ZSB0aGUgYXZlcmFnZSBkZXBhcnR1cmUgZGVsYXkgd2hpbGUgdGhlIG1lZGlhbiB3b3VsZCBnaXZlIHRoZSBvYnNlcnZhdGlvbiB0aGF0IHNpdHMgYXQgdGhlIG1pZGRsZSBvZiB0aGUgZGF0YSBzZXQuIFRoZSBsb3dlc3QgbWVhbiBhY2NvdW50cyBmb3Igb3V0bGllciB2YWx1ZXMgYW5kIHRodXMgd291bGQgYmUgdGhlIGJldHRlciBjaG9pY2Ugd2hlbiBhY2NvdW50aW5nIGZvciBkZWxheXMgdGhhdCBhcmUgd2VsbC1hYm92ZSBhdmVyYWdlIHdoaWxlIHRoZSBtZWRpYW4gd291bGQgbm90IGFjY291bnQgZm9yIG91dGxpZXIgdmFsdWVzIGFuZCB0aHVzIGdpdmUgYSBiZXR0ZXIgaWRlYSBvZiBkZXBhcnR1cmUgZGVsYXlzIHdpdGhvdXQgYWNjb3VudGluZyBmb3IgdGhlIGV4dHJhbmVvdXMgY2FzZXMuIEZvciB0aGlzIG9jY2FzaW9uLCB0aGUgbWVhbiBjb3VsZCBpbmZvcm0gYSBiZXR0ZXIgZGVjaXNpb24uDQoNCkp1bHkgKG1vIDcpIGlzIHRoZSBtb250aCB3aXRoIHRoZSBoaWdoZXN0IGF2ZXJhZ2UgZGVwYXJ0dXJlIGRlbGF5Lg0KDQpgYGB7cn0NCm55Y2ZsaWdodHMgJT4lDQogIGdyb3VwX2J5KG1vbnRoKSAlPiUNCiAgc3VtbWFyaXNlKG1lYW5fZGQgPSBtZWFuKGRlcF9kZWxheSkpICU+JQ0KICBhcnJhbmdlKGRlc2MobWVhbl9kZCkpDQpgYGANCg0KIyMjIEV4ZXJjaXNlIDYNCg0KKipJZiB5b3Ugd2VyZSBzZWxlY3RpbmcgYW4gYWlycG9ydCBzaW1wbHkgYmFzZWQgb24gb24gdGltZSBkZXBhcnR1cmUgcGVyY2VudGFnZSwgd2hpY2ggTllDIGFpcnBvcnQgd291bGQgeW91IGNob29zZSB0byBmbHkgb3V0IG9mPyoqDQoNCkxhR3VhcmRpYSAoTEdBKSBhaXJwb3J0Lg0KDQpgYGB7cn0NCm55Y2ZsaWdodHMgPC0gbnljZmxpZ2h0cyAlPiUNCiAgbXV0YXRlKGRlcF90eXBlID0gaWZlbHNlKGRlcF9kZWxheSA8IDUsICJvbiB0aW1lIiwgImRlbGF5ZWQiKSkNCmBgYA0KDQpgYGB7cn0NCm55Y2ZsaWdodHMgJT4lDQogIGdyb3VwX2J5KG9yaWdpbikgJT4lDQogIHN1bW1hcmlzZShvdF9kZXBfcmF0ZSA9IHN1bShkZXBfdHlwZSA9PSAib24gdGltZSIpIC8gbigpKSAlPiUNCiAgYXJyYW5nZShkZXNjKG90X2RlcF9yYXRlKSkNCmBgYA0KDQojIyMgRXhlcmNpc2UgNw0KDQoqKk11dGF0ZSB0aGUgZGF0YSBmcmFtZSBzbyB0aGF0IGl0IGluY2x1ZGVzIGEgbmV3IHZhcmlhYmxlIHRoYXQgY29udGFpbnMgdGhlIGF2ZXJhZ2Ugc3BlZWQsIGBhdmdfc3BlZWRgIHRyYXZlbGVkIGJ5IHRoZSBwbGFuZSBmb3IgZWFjaCBmbGlnaHQgKGluIG1waCkuIEhpbnQ6IEF2ZXJhZ2Ugc3BlZWQgY2FuIGJlIGNhbGN1bGF0ZWQgYXMgZGlzdGFuY2UgZGl2aWRlZCBieSBudW1iZXIgb2YgaG91cnMgb2YgdHJhdmVsLCBhbmQgbm90ZSB0aGF0IGBhaXJfdGltZWAgaXMgZ2l2ZW4gaW4gbWludXRlcy4qKg0KDQpgYGB7cn0NCm55Y2ZsaWdodHMgPC0gbnljZmxpZ2h0cyAlPiUNCiAgbXV0YXRlKGF2Z19zcGVlZCA9IGRpc3RhbmNlIC8gKGFpcl90aW1lIC8gNjApKQ0KYGBgDQoNCiMjIyBFeGVyY2lzZSA4DQoNCioqTWFrZSBhIHNjYXR0ZXJwbG90IG9mIGF2Z19zcGVlZCB2cy4gZGlzdGFuY2UuIERlc2NyaWJlIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBhdmVyYWdlIHNwZWVkIGFuZCBkaXN0YW5jZS4gSGludDogVXNlIGdlb21fcG9pbnQoKS4qKg0KDQpUaGUgYXZlcmFnZSBzcGVlZCBpbmNyZWFzZXMgdW50aWwgdGhlIGRpc3RhbmNlIGlzIGluIHRoZSByYW5nZSBvZiAxMDAwLTE1MDAgKG1pbGVzKSBhbmQgdGhlbiBpdCBzdGFiaWxpemVzLiANCg0KYGBge3J9DQpnZ3Bsb3QoZGF0YSA9IG55Y2ZsaWdodHMsIG1hcHBpbmcgPSBhZXMoeCA9IGRpc3RhbmNlLCB5ID0gYXZnX3NwZWVkKSkgKw0KICAgICAgICBnZW9tX3BvaW50KCkNCmBgYA0KDQojIyMgRXhlcmNpc2UgOQ0KDQoqKlJlcGxpY2F0ZSB0aGUgZm9sbG93aW5nIHBsb3QuIEhpbnQ6IFRoZSBkYXRhIGZyYW1lIHBsb3R0ZWQgb25seSBjb250YWlucyBmbGlnaHRzIGZyb20gQW1lcmljYW4gQWlybGluZXMsIERlbHRhIEFpcmxpbmVzLCBhbmQgVW5pdGVkIEFpcmxpbmVzLCBhbmQgdGhlIHBvaW50cyBhcmUgY29sb3JlZCBieSBjYXJyaWVyLiBPbmNlIHlvdSByZXBsaWNhdGUgdGhlIHBsb3QsIGRldGVybWluZSAocm91Z2hseSkgd2hhdCB0aGUgY3V0b2ZmIHBvaW50IGlzIGZvciBkZXBhcnR1cmUgZGVsYXlzIHdoZXJlIHlvdSBjYW4gc3RpbGwgZXhwZWN0IHRvIGdldCB0byB5b3VyIGRlc3RpbmF0aW9uIG9uIHRpbWUuKioNCg0KYGBge3J9DQoNCmNfZGVsYXkgPC0gbnljZmxpZ2h0cyAlPiUNCiAgZmlsdGVyKGNhcnJpZXIgPT0gJ0FBJyB8IGNhcnJpZXIgPT0gJ0RMJyB8IGNhcnJpZXIgPT0gJ1VBJykNCmdncGxvdChjX2RlbGF5LCBhZXMoZGVwX2RlbGF5LCBhcnJfZGVsYXksIGNvbG9yID0gY2FycmllcikpICsgZ2VvbV9wb2ludCgpDQoNCmBgYA0KDQpCYXNlZCBvbiB0aGUgYmVsb3cgcGxvdCwgdGhlIGN1dG9mZiBwb2ludCBpcyBhcHByb3hpbWF0ZWx5IDIwbWlucy4gQWZ0ZXIgdGhpcyBwb2ludCwgYXMgZGVwYXJ0dXJlIGRlbGF5cyBjbGltYiBzbyBkbyBhcnJpdmFsIGRlbGF5cy4NCg0KYGBge3J9DQpnZ3Bsb3QoY19kZWxheSwgYWVzKGRlcF9kZWxheSwgYXJyX2RlbGF5LCBjb2xvciA9IGNhcnJpZXIpKSArDQogICAgICAgIHhsaW0oLTEwLCA2MCkgKw0KICAgICAgICB5bGltKC0xMCwgNjApICsNCiAgICAgICAgZ2VvbV9wb2ludCgpDQpgYGA=