library(tidyverse)
library(openintro)
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"
glimpse(nycflights)
## Rows: 32,735
## Columns: 16
## $ year      <int> 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, 2013, ~
## $ month     <int> 6, 5, 12, 5, 7, 1, 12, 8, 9, 4, 6, 11, 4, 3, 10, 1, 2, 8, 10~
## $ day       <int> 30, 7, 8, 14, 21, 1, 9, 13, 26, 30, 17, 22, 26, 25, 21, 23, ~
## $ dep_time  <int> 940, 1657, 859, 1841, 1102, 1817, 1259, 1920, 725, 1323, 940~
## $ dep_delay <dbl> 15, -3, -1, -4, -3, -3, 14, 85, -10, 62, 5, 5, -2, 115, -4, ~
## $ arr_time  <int> 1216, 2104, 1238, 2122, 1230, 2008, 1617, 2032, 1027, 1549, ~
## $ arr_delay <dbl> -4, 10, 11, -34, -8, 3, 22, 71, -8, 60, -4, -2, 22, 91, -6, ~
## $ carrier   <chr> "VX", "DL", "DL", "DL", "9E", "AA", "WN", "B6", "AA", "EV", ~
## $ tailnum   <chr> "N626VA", "N3760C", "N712TW", "N914DL", "N823AY", "N3AXAA", ~
## $ flight    <int> 407, 329, 422, 2391, 3652, 353, 1428, 1407, 2279, 4162, 20, ~
## $ origin    <chr> "JFK", "JFK", "JFK", "JFK", "LGA", "LGA", "EWR", "JFK", "LGA~
## $ dest      <chr> "LAX", "SJU", "LAX", "TPA", "ORF", "ORD", "HOU", "IAD", "MIA~
## $ air_time  <dbl> 313, 216, 376, 135, 50, 138, 240, 48, 148, 110, 50, 161, 87,~
## $ distance  <dbl> 2475, 1598, 2475, 1005, 296, 733, 1411, 228, 1096, 820, 264,~
## $ hour      <dbl> 9, 16, 8, 18, 11, 18, 12, 19, 7, 13, 9, 13, 8, 20, 12, 20, 6~
## $ minute    <dbl> 40, 57, 59, 41, 2, 17, 59, 20, 25, 23, 40, 20, 9, 54, 17, 24~
### First histogram
ggplot(data = nycflights, aes(x = dep_delay)) +
  geom_histogram()

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

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

Exercise 1

Look carefully at these three histograms. How do they compare? Are features revealed in one that are obscured in another?

#The first histogram has a bin width of 30 and a value a bit smaller than 30000. 
#The second histogram has a bin width of 15 and a value a bit bigger 20000. 
#Finally, the third histogram has a bin width of 150 and a value a bit bigger 
#than 30000.We can see that the second histogram has the most narrow bin width,meaning 
#it has the most approximate/accurate depiction of delayed flights. 
#The third histogram has the biggest bin width but has the least approximate/accurate 
#depiction of flight delays. This is because each bin shows a very wide range 
#of flight delays. We can thus conclude that the second histogram has less obscurity 
#in flight delay information than the third one. However,the first histogram is 
#in the middle of the second and third histograms in terms of accuracy, having more 
#obscurity than the second but more obscurity than the third histogram.

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?

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.

# Creating a histogram of sfo_feb_flights with the bin width of 50
ggplot(data = sfo_feb_flights, aes(x = arr_delay)) +
  geom_histogram(binwidth = 15)

# Summarizing the results, finding the mean,median,sd,variance, and iqr of sfo_feb_flights
sfo_feb_flights %>%
  summarise( 
            min = min(arr_delay),
            max = max(arr_delay),        
            median = median(arr_delay),
            IQR = IQR(arr_delay)
            )
## # A tibble: 1 x 4
##     min   max median   IQR
##   <dbl> <dbl>  <dbl> <dbl>
## 1   -66   196    -11  23.2

From the summary above, we can see that most flights arrived early. We can also observe this from the graph because there are bars skewed right (100,200) away from the mean.

Exercise 4

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

sfo_feb_flights %>%
  group_by(carrier) %>%
  summarize(variance_arrival_delay = median(var(arr_delay))) %>%
  arrange(desc(variance_arrival_delay))
## # A tibble: 5 x 2
##   carrier variance_arrival_delay
##   <chr>                    <dbl>
## 1 UA                       2335.
## 2 VX                       1669.
## 3 AA                        868.
## 4 DL                        485.
## 5 B6                        121.

Upon calculating the median and interquartile range for sfo_feb_flights, I saw that United Airlines has the highest variance of arrival times. This in turn means that the United Airlines carrier has the most variable arrival delays.

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 pros of choosing the month with the lowest mean of departure delays would be
#that the flights delays do not have to be put in any specific order. The next 
#pro is that the mean value is pretty descriptive. The cons are that the mean 
#can be skewed because of an outlier number and requires you to take into account 
#all the flight departure delays.The pros of choosing the lowest median departure delay 
#is it is not affected by an outlier like the lowest mean departure is. 
#The con of finding the lowest median departure delay is the flight 
#departure delays need to be ordered from least to greatest.

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?

nycflights %>% 
  group_by(origin) %>%
  summarize(average_departure = mean(dep_delay)) %>%
  arrange(average_departure)
## # A tibble: 3 x 2
##   origin average_departure
##   <chr>              <dbl>
## 1 LGA                 10.1
## 2 JFK                 12.3
## 3 EWR                 15.3

I would choose to fly out of the Laguardia airport because it has the lowest time departure percentage.

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 scatter plot of avg_speed vs. distance. Describe the relationship between average speed and distance. Hint: Use geom_point()

nycflights %>% ggplot() +
  geom_point(aes(x = avg_speed, y = distance, color = carrier))

Looking at the scatter plot, as the distance increases the average speed increases. However, at the distance of about 2,500, the average speed remains constant.

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_delays <- nycflights %>%
  filter(carrier == 'AA' | carrier == 'DL' | carrier == 'UA')
ggplot(c_delays, aes(dep_delay, arr_delay, color = carrier)) + geom_point()

Looking at the replicated scatter plot, it looks like the cutoff is about half an hour.After that point the arrival and departure delays go up.

LS0tDQp0aXRsZTogIkxhYiAyOiBJbnRybyB0byBEYXRhIg0KYXV0aG9yOiAiVmxhZGltaXIgTmltY2hlbmtvIg0KZGF0ZTogImByIFN5cy5EYXRlKClgIg0Kb3V0cHV0OiBvcGVuaW50cm86OmxhYl9yZXBvcnQNCi0tLQ0KDQpgYGB7ciBsb2FkLXBhY2thZ2VzLCBtZXNzYWdlPUZBTFNFfQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KG9wZW5pbnRybykNCmBgYA0KDQpgYGB7ciB0aGUtZGF0YSwgbWVzc2FnZT1GQUxTRX0NCmRhdGEobnljZmxpZ2h0cykNCm5hbWVzKG55Y2ZsaWdodHMpDQpnbGltcHNlKG55Y2ZsaWdodHMpDQpgYGANCmBgYHtyIEFuYWx5c2lzLCBtZXNzYWdlPUZBTFNFfQ0KIyMjIEZpcnN0IGhpc3RvZ3JhbQ0KZ2dwbG90KGRhdGEgPSBueWNmbGlnaHRzLCBhZXMoeCA9IGRlcF9kZWxheSkpICsNCiAgZ2VvbV9oaXN0b2dyYW0oKQ0KIyMjIFNlY29uZCBoaXN0b2dyYW0NCmdncGxvdChkYXRhID0gbnljZmxpZ2h0cywgYWVzKHggPSBkZXBfZGVsYXkpKSArDQogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gMTUpDQojIyMgVGhpcmQgaGlzdG9ncmFtDQpnZ3Bsb3QoZGF0YSA9IG55Y2ZsaWdodHMsIGFlcyh4ID0gZGVwX2RlbGF5KSkgKw0KICBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IDE1MCkNCg0KYGBgDQoNCg0KDQoNCiMjIyBFeGVyY2lzZSAxDQpMb29rIGNhcmVmdWxseSBhdCB0aGVzZSB0aHJlZSBoaXN0b2dyYW1zLiBIb3cgZG8gdGhleSBjb21wYXJlPyBBcmUgZmVhdHVyZXMgcmV2ZWFsZWQgaW4gb25lIHRoYXQgYXJlIG9ic2N1cmVkIGluIGFub3RoZXI/DQoNCmBgYHtyIGhpc3RvZ3JhbS1jb21wYXJpc29ufQ0KI1RoZSBmaXJzdCBoaXN0b2dyYW0gaGFzIGEgYmluIHdpZHRoIG9mIDMwIGFuZCBhIHZhbHVlIGEgYml0IHNtYWxsZXIgdGhhbiAzMDAwMC4gDQojVGhlIHNlY29uZCBoaXN0b2dyYW0gaGFzIGEgYmluIHdpZHRoIG9mIDE1IGFuZCBhIHZhbHVlIGEgYml0IGJpZ2dlciAyMDAwMC4gDQojRmluYWxseSwgdGhlIHRoaXJkIGhpc3RvZ3JhbSBoYXMgYSBiaW4gd2lkdGggb2YgMTUwIGFuZCBhIHZhbHVlIGEgYml0IGJpZ2dlciANCiN0aGFuIDMwMDAwLldlIGNhbiBzZWUgdGhhdCB0aGUgc2Vjb25kIGhpc3RvZ3JhbSBoYXMgdGhlIG1vc3QgbmFycm93IGJpbiB3aWR0aCxtZWFuaW5nIA0KI2l0IGhhcyB0aGUgbW9zdCBhcHByb3hpbWF0ZS9hY2N1cmF0ZSBkZXBpY3Rpb24gb2YgZGVsYXllZCBmbGlnaHRzLiANCiNUaGUgdGhpcmQgaGlzdG9ncmFtIGhhcyB0aGUgYmlnZ2VzdCBiaW4gd2lkdGggYnV0IGhhcyB0aGUgbGVhc3QgYXBwcm94aW1hdGUvYWNjdXJhdGUgDQojZGVwaWN0aW9uIG9mIGZsaWdodCBkZWxheXMuIFRoaXMgaXMgYmVjYXVzZSBlYWNoIGJpbiBzaG93cyBhIHZlcnkgd2lkZSByYW5nZSANCiNvZiBmbGlnaHQgZGVsYXlzLiBXZSBjYW4gdGh1cyBjb25jbHVkZSB0aGF0IHRoZSBzZWNvbmQgaGlzdG9ncmFtIGhhcyBsZXNzIG9ic2N1cml0eSANCiNpbiBmbGlnaHQgZGVsYXkgaW5mb3JtYXRpb24gdGhhbiB0aGUgdGhpcmQgb25lLiBIb3dldmVyLHRoZSBmaXJzdCBoaXN0b2dyYW0gaXMgDQojaW4gdGhlIG1pZGRsZSBvZiB0aGUgc2Vjb25kIGFuZCB0aGlyZCBoaXN0b2dyYW1zIGluIHRlcm1zIG9mIGFjY3VyYWN5LCBoYXZpbmcgbW9yZSANCiNvYnNjdXJpdHkgdGhhbiB0aGUgc2Vjb25kIGJ1dCBtb3JlIG9ic2N1cml0eSB0aGFuIHRoZSB0aGlyZCBoaXN0b2dyYW0uDQpgYGANCg0KDQojIyMgRXhlcmNpc2UgMg0KQ3JlYXRlIGEgbmV3IGRhdGEgZnJhbWUgdGhhdCBpbmNsdWRlcyBmbGlnaHRzIGhlYWRlZCB0byBTRk8gaW4gRmVicnVhcnksIGFuZCBzYXZlIHRoaXMgZGF0YSBmcmFtZSBhcyBzZm9fZmViX2ZsaWdodHMuIEhvdyBtYW55IGZsaWdodHMgbWVldCB0aGVzZSBjcml0ZXJpYT8NCg0KYGBge3IgY3JlYXRlLWRhdGFmcmFtZX0NCnNmb19mZWJfZmxpZ2h0cyA8LSBueWNmbGlnaHRzICU+JQ0KICBmaWx0ZXIoZGVzdCA9PSAiU0ZPIiwgbW9udGggPT0gMikNCg0KY291bnQoc2ZvX2ZlYl9mbGlnaHRzKQ0KYGBgDQoNCg0KIyMjIEV4ZXJjaXNlIDMNCkRlc2NyaWJlIHRoZSBkaXN0cmlidXRpb24gb2YgdGhlIGFycml2YWwgZGVsYXlzIG9mIHRoZXNlIGZsaWdodHMgdXNpbmcgYSBoaXN0b2dyYW0gYW5kIGFwcHJvcHJpYXRlIHN1bW1hcnkgc3RhdGlzdGljcy4gSGludDogVGhlIHN1bW1hcnkgc3RhdGlzdGljcyB5b3UgdXNlIHNob3VsZCBkZXBlbmQgb24gdGhlIHNoYXBlIG9mIHRoZSBkaXN0cmlidXRpb24uDQoNCmBgYHtyIHN1bW1hcnktc3RhdGlzdGljc30NCiMgQ3JlYXRpbmcgYSBoaXN0b2dyYW0gb2Ygc2ZvX2ZlYl9mbGlnaHRzIHdpdGggdGhlIGJpbiB3aWR0aCBvZiA1MA0KZ2dwbG90KGRhdGEgPSBzZm9fZmViX2ZsaWdodHMsIGFlcyh4ID0gYXJyX2RlbGF5KSkgKw0KICBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IDE1KQ0KIyBTdW1tYXJpemluZyB0aGUgcmVzdWx0cywgZmluZGluZyB0aGUgbWVhbixtZWRpYW4sc2QsdmFyaWFuY2UsIGFuZCBpcXIgb2Ygc2ZvX2ZlYl9mbGlnaHRzDQpzZm9fZmViX2ZsaWdodHMgJT4lDQogIHN1bW1hcmlzZSggDQogICAgICAgICAgICBtaW4gPSBtaW4oYXJyX2RlbGF5KSwNCiAgICAgICAgICAgIG1heCA9IG1heChhcnJfZGVsYXkpLCAgICAgICAgDQogICAgICAgICAgICBtZWRpYW4gPSBtZWRpYW4oYXJyX2RlbGF5KSwNCiAgICAgICAgICAgIElRUiA9IElRUihhcnJfZGVsYXkpDQogICAgICAgICAgICApDQpgYGANCkZyb20gdGhlIHN1bW1hcnkgYWJvdmUsIHdlIGNhbiBzZWUgdGhhdCBtb3N0IGZsaWdodHMgYXJyaXZlZCBlYXJseS4gV2UgY2FuIGFsc28gb2JzZXJ2ZSB0aGlzIGZyb20gdGhlIGdyYXBoIGJlY2F1c2UgdGhlcmUgYXJlIGJhcnMgc2tld2VkIHJpZ2h0ICgxMDAsMjAwKSBhd2F5IGZyb20gdGhlIG1lYW4uDQoNCiMjIyBFeGVyY2lzZSA0DQpDYWxjdWxhdGUgdGhlIG1lZGlhbiBhbmQgaW50ZXJxdWFydGlsZSByYW5nZSBmb3IgYXJyX2RlbGF5cyBvZiBmbGlnaHRzIGluIHRoZSBzZm9fZmViX2ZsaWdodHMgZGF0YSBmcmFtZSwgZ3JvdXBlZCBieSBjYXJyaWVyLiBXaGljaCBjYXJyaWVyIGhhcyB0aGUgbW9zdCB2YXJpYWJsZSBhcnJpdmFsIGRlbGF5cz8NCg0KYGBge3Igc3VtbWFyeS0gbWVkaWFuIGFuZCBpbnRlcnF1YXJ0aWxlIHJhbmdlfQ0Kc2ZvX2ZlYl9mbGlnaHRzICU+JQ0KICBncm91cF9ieShjYXJyaWVyKSAlPiUNCiAgc3VtbWFyaXplKHZhcmlhbmNlX2Fycml2YWxfZGVsYXkgPSBtZWRpYW4odmFyKGFycl9kZWxheSkpKSAlPiUNCiAgYXJyYW5nZShkZXNjKHZhcmlhbmNlX2Fycml2YWxfZGVsYXkpKQ0KYGBgDQpVcG9uIGNhbGN1bGF0aW5nIHRoZSBtZWRpYW4gYW5kIGludGVycXVhcnRpbGUgcmFuZ2UgZm9yIHNmb19mZWJfZmxpZ2h0cywgSSBzYXcgdGhhdCBVbml0ZWQgQWlybGluZXMgaGFzIHRoZSBoaWdoZXN0IHZhcmlhbmNlIG9mIGFycml2YWwgdGltZXMuIFRoaXMgaW4gdHVybiBtZWFucyB0aGF0IHRoZSBVbml0ZWQgQWlybGluZXMgY2FycmllciBoYXMgdGhlIG1vc3QgdmFyaWFibGUgYXJyaXZhbCBkZWxheXMuDQoNCiMjIyBFeGVyY2lzZSA1DQpTdXBwb3NlIHlvdSByZWFsbHkgZGlzbGlrZSBkZXBhcnR1cmUgZGVsYXlzIGFuZCB5b3Ugd2FudCB0byBzY2hlZHVsZSB5b3VyIHRyYXZlbCBpbiBhIG1vbnRoIHRoYXQgbWluaW1pemVzIHlvdXIgcG90ZW50aWFsIGRlcGFydHVyZSBkZWxheSBsZWF2aW5nIE5ZQy4gT25lIG9wdGlvbiBpcyB0byBjaG9vc2UgdGhlIG1vbnRoIHdpdGggdGhlIGxvd2VzdCBtZWFuIGRlcGFydHVyZSBkZWxheS4gQW5vdGhlciBvcHRpb24gaXMgdG8gY2hvb3NlIHRoZSBtb250aCB3aXRoIHRoZSBsb3dlc3QgbWVkaWFuIGRlcGFydHVyZSBkZWxheS4gV2hhdCBhcmUgdGhlIHByb3MgYW5kIGNvbnMgb2YgdGhlc2UgdHdvIGNob2ljZXM/DQoNCmBgYHtyIGxvd2VzdCBkZXBhcnR1cmUgZGVsYXl9DQojVGhlIHByb3Mgb2YgY2hvb3NpbmcgdGhlIG1vbnRoIHdpdGggdGhlIGxvd2VzdCBtZWFuIG9mIGRlcGFydHVyZSBkZWxheXMgd291bGQgYmUNCiN0aGF0IHRoZSBmbGlnaHRzIGRlbGF5cyBkbyBub3QgaGF2ZSB0byBiZSBwdXQgaW4gYW55IHNwZWNpZmljIG9yZGVyLiBUaGUgbmV4dCANCiNwcm8gaXMgdGhhdCB0aGUgbWVhbiB2YWx1ZSBpcyBwcmV0dHkgZGVzY3JpcHRpdmUuIFRoZSBjb25zIGFyZSB0aGF0IHRoZSBtZWFuIA0KI2NhbiBiZSBza2V3ZWQgYmVjYXVzZSBvZiBhbiBvdXRsaWVyIG51bWJlciBhbmQgcmVxdWlyZXMgeW91IHRvIHRha2UgaW50byBhY2NvdW50IA0KI2FsbCB0aGUgZmxpZ2h0IGRlcGFydHVyZSBkZWxheXMuVGhlIHByb3Mgb2YgY2hvb3NpbmcgdGhlIGxvd2VzdCBtZWRpYW4gZGVwYXJ0dXJlIGRlbGF5IA0KI2lzIGl0IGlzIG5vdCBhZmZlY3RlZCBieSBhbiBvdXRsaWVyIGxpa2UgdGhlIGxvd2VzdCBtZWFuIGRlcGFydHVyZSBpcy4gDQojVGhlIGNvbiBvZiBmaW5kaW5nIHRoZSBsb3dlc3QgbWVkaWFuIGRlcGFydHVyZSBkZWxheSBpcyB0aGUgZmxpZ2h0IA0KI2RlcGFydHVyZSBkZWxheXMgbmVlZCB0byBiZSBvcmRlcmVkIGZyb20gbGVhc3QgdG8gZ3JlYXRlc3QuDQpgYGANCg0KIyMjIEV4ZXJjaXNlIDYNCklmIHlvdSB3ZXJlIHNlbGVjdGluZyBhbiBhaXJwb3J0IHNpbXBseSBiYXNlZCBvbiBvbiB0aW1lIGRlcGFydHVyZSBwZXJjZW50YWdlLCB3aGljaCBOWUMgYWlycG9ydCB3b3VsZCB5b3UgY2hvb3NlIHRvIGZseSBvdXQgb2Y/DQpgYGB7ciBOWUMgYWlycG9ydCBjaG9pY2V9DQpueWNmbGlnaHRzICU+JSANCiAgZ3JvdXBfYnkob3JpZ2luKSAlPiUNCiAgc3VtbWFyaXplKGF2ZXJhZ2VfZGVwYXJ0dXJlID0gbWVhbihkZXBfZGVsYXkpKSAlPiUNCiAgYXJyYW5nZShhdmVyYWdlX2RlcGFydHVyZSkNCmBgYA0KDQpJIHdvdWxkIGNob29zZSB0byBmbHkgb3V0IG9mIHRoZSBMYWd1YXJkaWEgYWlycG9ydCBiZWNhdXNlIGl0IGhhcyB0aGUgbG93ZXN0IHRpbWUgZGVwYXJ0dXJlIHBlcmNlbnRhZ2UuDQoNCiMjIyBFeGVyY2lzZSA3DQpNdXRhdGUgdGhlIGRhdGEgZnJhbWUgc28gdGhhdCBpdCBpbmNsdWRlcyBhIG5ldyB2YXJpYWJsZSB0aGF0IGNvbnRhaW5zIHRoZSBhdmVyYWdlIHNwZWVkLCBhdmdfc3BlZWQgdHJhdmVsZWQgYnkgdGhlIHBsYW5lIGZvciBlYWNoIGZsaWdodCAoaW4gbXBoKS4gSGludDogQXZlcmFnZSBzcGVlZCBjYW4gYmUgY2FsY3VsYXRlZCBhcyBkaXN0YW5jZSBkaXZpZGVkIGJ5IG51bWJlciBvZiBob3VycyBvZiB0cmF2ZWwsIGFuZCBub3RlIHRoYXQgYWlyX3RpbWUgaXMgZ2l2ZW4gaW4gbWludXRlcy4NCmBgYHtyIE11dGF0ZSBEYXRhIEZyYW1lfQ0KbnljZmxpZ2h0cyA8LSBueWNmbGlnaHRzICU+JQ0KICBtdXRhdGUoYXZnX3NwZWVkID0gZGlzdGFuY2UgLyBhaXJfdGltZSAqIDYwKQ0KYGBgDQoNCiMjIyBFeGVyY2lzZSA4DQpNYWtlIGEgc2NhdHRlciBwbG90IG9mIGF2Z19zcGVlZCB2cy4gZGlzdGFuY2UuIERlc2NyaWJlIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBhdmVyYWdlIHNwZWVkIGFuZCBkaXN0YW5jZS4gSGludDogVXNlIGdlb21fcG9pbnQoKQ0KDQpgYGB7ciBTY2F0dGVyIHBsb3R9DQpueWNmbGlnaHRzICU+JSBnZ3Bsb3QoKSArDQogIGdlb21fcG9pbnQoYWVzKHggPSBhdmdfc3BlZWQsIHkgPSBkaXN0YW5jZSwgY29sb3IgPSBjYXJyaWVyKSkNCmBgYA0KDQpMb29raW5nIGF0IHRoZSBzY2F0dGVyIHBsb3QsIGFzIHRoZSBkaXN0YW5jZSBpbmNyZWFzZXMgdGhlIGF2ZXJhZ2Ugc3BlZWQgaW5jcmVhc2VzLiBIb3dldmVyLCBhdCB0aGUgZGlzdGFuY2Ugb2YgYWJvdXQgMiw1MDAsIHRoZSBhdmVyYWdlIHNwZWVkIHJlbWFpbnMgY29uc3RhbnQuDQoNCiMjIyBFeGVyY2lzZSA5DQpSZXBsaWNhdGUgdGhlIGZvbGxvd2luZyBwbG90LiBIaW50OiBUaGUgZGF0YSBmcmFtZSBwbG90dGVkIG9ubHkgY29udGFpbnMgZmxpZ2h0cyBmcm9tIEFtZXJpY2FuIEFpcmxpbmVzLCBEZWx0YSBBaXJsaW5lcywgYW5kIFVuaXRlZCBBaXJsaW5lcywgYW5kIHRoZSBwb2ludHMgYXJlIGNvbG9yZWQgYnkgY2Fycmllci4gT25jZSB5b3UgcmVwbGljYXRlIHRoZSBwbG90LCBkZXRlcm1pbmUgKHJvdWdobHkpIHdoYXQgdGhlIGN1dG9mZiBwb2ludCBpcyBmb3IgZGVwYXJ0dXJlIGRlbGF5cyB3aGVyZSB5b3UgY2FuIHN0aWxsIGV4cGVjdCB0byBnZXQgdG8geW91ciBkZXN0aW5hdGlvbiBvbiB0aW1lLg0KDQpgYGB7ciBTY2F0dGVyIHBsb3QgcmVwbGljYXRpb259DQpjX2RlbGF5cyA8LSBueWNmbGlnaHRzICU+JQ0KICBmaWx0ZXIoY2FycmllciA9PSAnQUEnIHwgY2FycmllciA9PSAnREwnIHwgY2FycmllciA9PSAnVUEnKQ0KZ2dwbG90KGNfZGVsYXlzLCBhZXMoZGVwX2RlbGF5LCBhcnJfZGVsYXksIGNvbG9yID0gY2FycmllcikpICsgZ2VvbV9wb2ludCgpDQpgYGANCg0KTG9va2luZyBhdCB0aGUgcmVwbGljYXRlZCBzY2F0dGVyIHBsb3QsIGl0IGxvb2tzIGxpa2UgdGhlIGN1dG9mZiBpcyBhYm91dCBoYWxmIGFuIGhvdXIuQWZ0ZXIgdGhhdCBwb2ludCB0aGUgYXJyaXZhbCBhbmQgZGVwYXJ0dXJlIGRlbGF5cyBnbyB1cC4=