library(tidyverse)
library(openintro)
## Warning: package 'openintro' was built under R version 4.3.3
## Warning: package 'usdata' was built under R version 4.3.3

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

The data is distributed differently because of the difference in widths. In the second histogram you can see more increments on the y axis and you can see te first bin that is below 5000 and the next one above 20,000. The other two histograms you don’t get to see as many variables.

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)

lax_flights <- nycflights %>%
  filter(dest == "LAX")
ggplot(data = lax_flights, aes(x = dep_delay)) +
  geom_histogram()
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

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 the criteria.

sfo_feb_flights <- nycflights %>%
  filter(dest == "SFO", month == 2)
dim(sfo_feb_flights)
## [1] 68 16

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.

The histogram is a unimodal graph with an outlier. Since there is an outlier using the mean or the median for statistics would leave a skewed answer.

lax_flights %>%
  summarise(mean_dd   = mean(arr_delay), 
            median_dd = median(arr_delay), 
            sddd      = sd(arr_delay),
            vardd     = var(arr_delay),
            IQRdd     = IQR(arr_delay),
            mindd     = min(arr_delay),
            maxdd     = max(arr_delay))
## # A tibble: 1 × 7
##   mean_dd median_dd  sddd vardd IQRdd mindd maxdd
##     <dbl>     <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1    1.46        -6  39.4 1553.  30.5   -62   319
ggplot(data = sfo_feb_flights, aes(x = arr_delay)) +
  geom_histogram(binwidth = 25)

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?

Dl has the most variable arrival delays becuase it has the highest IQR.

sfo_feb_flights %>%
  group_by(carrier) %>%
  summarise(median_ad = median(arr_delay), 
            iqr_ad = IQR(arr_delay))
## # A tibble: 5 × 3
##   carrier median_ad iqr_ad
##   <chr>       <dbl>  <dbl>
## 1 AA            5     17.5
## 2 B6          -10.5   12.2
## 3 DL          -15     22  
## 4 UA          -10     22  
## 5 VX          -22.5   21.2

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 month with the lowest mean departure delay is (10) which is october. The month with the lowest median departure delay is a tie for (9 and 10) which is september and october. The pros of using the mean is that you get a more exact answer. The cons is that it is similar to the next lowest month but still different. The pros for median is you get two answers for the lowest departure delays and more choices for flights. The cons are you have twice as much data and the median does not give decimals.

nycflights %>%
  group_by(month) %>%
  summarise(mean_dd = mean(dep_delay)) %>% 
  arrange(desc(mean_dd))
## # A tibble: 12 × 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
nycflights %>%
  group_by(month) %>%
  summarise(median_dd = median(dep_delay)) %>% 
  arrange(desc(median_dd))
## # A tibble: 12 × 2
##    month median_dd
##    <int>     <dbl>
##  1    12         1
##  2     6         0
##  3     7         0
##  4     3        -1
##  5     5        -1
##  6     8        -1
##  7     1        -2
##  8     2        -2
##  9     4        -2
## 10    11        -2
## 11     9        -3
## 12    10        -3

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?

##I would choose LGA based on the On time departure rate as it is 73% and higher than the other two.

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

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$air_hours <- nycflights$air_time / 60

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

head(nycflights)
## # A tibble: 6 × 19
##    year month   day dep_time dep_delay arr_time arr_delay carrier tailnum flight
##   <int> <int> <int>    <int>     <dbl>    <int>     <dbl> <chr>   <chr>    <int>
## 1  2013     6    30      940        15     1216        -4 VX      N626VA     407
## 2  2013     5     7     1657        -3     2104        10 DL      N3760C     329
## 3  2013    12     8      859        -1     1238        11 DL      N712TW     422
## 4  2013     5    14     1841        -4     2122       -34 DL      N914DL    2391
## 5  2013     7    21     1102        -3     1230        -8 9E      N823AY    3652
## 6  2013     1     1     1817        -3     2008         3 AA      N3AXAA     353
## # ℹ 9 more variables: origin <chr>, dest <chr>, air_time <dbl>, distance <dbl>,
## #   hour <dbl>, minute <dbl>, dep_type <chr>, air_hours <dbl>, avg_speed <dbl>

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 of most flights is between 300 and 500 mph. The most common distances for flights are 500-2500 miles.

ggplot(nycflights, aes(x=avg_speed, y=distance))+
  geom_point()+
  labs(title = "Average Speed vs. Distance",
       x="Average Speed",
       y="Distance")

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.

Roughly the cutoff for departure delays that still arrive on time is somewhere around 50-70.

nycflights1<- nycflights %>% filter(carrier %in% c("AA", "DL", "UA"))

ggplot(nycflights1, aes(x=dep_delay, y=arr_delay, colour = carrier))+
  geom_point()

LS0tCnRpdGxlOiAiTGFiIDI6IEludHJvIHRvIERhdGEiCmF1dGhvcjogIk1hcmkgTGVvbmFyZCIKZGF0ZTogImAyMDI0LTA5LTA0IgpvdXRwdXQ6IG9wZW5pbnRybzo6bGFiX3JlcG9ydAotLS0KCmBgYHtyIGxvYWQtcGFja2FnZXMsIG1lc3NhZ2U9RkFMU0V9CmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KG9wZW5pbnRybykKYGBgCgojIyMgRXhlcmNpc2UgMSAtIExvb2sgY2FyZWZ1bGx5IGF0IHRoZXNlIHRocmVlIGhpc3RvZ3JhbXMuIEhvdyBkbyB0aGV5IGNvbXBhcmU/IEFyZSBmZWF0dXJlcyByZXZlYWxlZCBpbiBvbmUgdGhhdCBhcmUgb2JzY3VyZWQgaW4gYW5vdGhlcj8KCiMgVGhlIGRhdGEgaXMgZGlzdHJpYnV0ZWQgZGlmZmVyZW50bHkgYmVjYXVzZSBvZiB0aGUgZGlmZmVyZW5jZSBpbiB3aWR0aHMuIEluIHRoZSBzZWNvbmQgaGlzdG9ncmFtIHlvdSBjYW4gc2VlIG1vcmUgaW5jcmVtZW50cyBvbiB0aGUgeSBheGlzIGFuZCB5b3UgY2FuIHNlZSB0ZSBmaXJzdCBiaW4gdGhhdCBpcyBiZWxvdyA1MDAwIGFuZCB0aGUgbmV4dCBvbmUgYWJvdmUgMjAsMDAwLiBUaGUgb3RoZXIgdHdvIGhpc3RvZ3JhbXMgeW91IGRvbid0IGdldCB0byBzZWUgYXMgbWFueSB2YXJpYWJsZXMuIAoKYGBge3J9CmdncGxvdChkYXRhID0gbnljZmxpZ2h0cywgYWVzKHggPSBkZXBfZGVsYXkpKSArCiAgZ2VvbV9oaXN0b2dyYW0oKQpnZ3Bsb3QoZGF0YSA9IG55Y2ZsaWdodHMsIGFlcyh4ID0gZGVwX2RlbGF5KSkgKwogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gMTUpCmdncGxvdChkYXRhID0gbnljZmxpZ2h0cywgYWVzKHggPSBkZXBfZGVsYXkpKSArCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAxNTApCgpsYXhfZmxpZ2h0cyA8LSBueWNmbGlnaHRzICU+JQogIGZpbHRlcihkZXN0ID09ICJMQVgiKQpnZ3Bsb3QoZGF0YSA9IGxheF9mbGlnaHRzLCBhZXMoeCA9IGRlcF9kZWxheSkpICsKICBnZW9tX2hpc3RvZ3JhbSgpCmBgYAoKCiMjIyBFeGVyY2lzZSAyIC0gQ3JlYXRlIGEgbmV3IGRhdGEgZnJhbWUgdGhhdCBpbmNsdWRlcyBmbGlnaHRzIGhlYWRlZCB0byBTRk8gaW4gRmVicnVhcnksIGFuZCBzYXZlIHRoaXMgZGF0YSBmcmFtZSBhcyBzZm9fZmViX2ZsaWdodHMuIEhvdyBtYW55IGZsaWdodHMgbWVldCB0aGVzZSBjcml0ZXJpYT8KCiMgNjggZmxpZ2h0cyBtZWV0IHRoZSBjcml0ZXJpYS4KCmBgYHtyfQpzZm9fZmViX2ZsaWdodHMgPC0gbnljZmxpZ2h0cyAlPiUKICBmaWx0ZXIoZGVzdCA9PSAiU0ZPIiwgbW9udGggPT0gMikKZGltKHNmb19mZWJfZmxpZ2h0cykKYGBgCgoKIyMjIEV4ZXJjaXNlIDMgLSBEZXNjcmliZSB0aGUgZGlzdHJpYnV0aW9uIG9mIHRoZSBhcnJpdmFsIGRlbGF5cyBvZiB0aGVzZSBmbGlnaHRzIHVzaW5nIGEgaGlzdG9ncmFtIGFuZCBhcHByb3ByaWF0ZSBzdW1tYXJ5IHN0YXRpc3RpY3MuIEhpbnQ6IFRoZSBzdW1tYXJ5IHN0YXRpc3RpY3MgeW91IHVzZSBzaG91bGQgZGVwZW5kIG9uIHRoZSBzaGFwZSBvZiB0aGUgZGlzdHJpYnV0aW9uLgoKIyBUaGUgaGlzdG9ncmFtIGlzIGEgdW5pbW9kYWwgZ3JhcGggd2l0aCBhbiBvdXRsaWVyLiBTaW5jZSB0aGVyZSBpcyBhbiBvdXRsaWVyIHVzaW5nIHRoZSBtZWFuIG9yIHRoZSBtZWRpYW4gZm9yIHN0YXRpc3RpY3Mgd291bGQgbGVhdmUgYSBza2V3ZWQgYW5zd2VyLgoKYGBge3J9CmxheF9mbGlnaHRzICU+JQogIHN1bW1hcmlzZShtZWFuX2RkICAgPSBtZWFuKGFycl9kZWxheSksIAogICAgICAgICAgICBtZWRpYW5fZGQgPSBtZWRpYW4oYXJyX2RlbGF5KSwgCiAgICAgICAgICAgIHNkZGQgICAgICA9IHNkKGFycl9kZWxheSksCiAgICAgICAgICAgIHZhcmRkICAgICA9IHZhcihhcnJfZGVsYXkpLAogICAgICAgICAgICBJUVJkZCAgICAgPSBJUVIoYXJyX2RlbGF5KSwKICAgICAgICAgICAgbWluZGQgICAgID0gbWluKGFycl9kZWxheSksCiAgICAgICAgICAgIG1heGRkICAgICA9IG1heChhcnJfZGVsYXkpKQoKZ2dwbG90KGRhdGEgPSBzZm9fZmViX2ZsaWdodHMsIGFlcyh4ID0gYXJyX2RlbGF5KSkgKwogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gMjUpCgoKCmBgYAoKCiMjIyBFeGVyY2lzZSA0IC0gQ2FsY3VsYXRlIHRoZSBtZWRpYW4gYW5kIGludGVycXVhcnRpbGUgcmFuZ2UgZm9yIGFycl9kZWxheXMgb2YgZmxpZ2h0cyBpbiBpbiB0aGUgc2ZvX2ZlYl9mbGlnaHRzIGRhdGEgZnJhbWUsIGdyb3VwZWQgYnkgY2Fycmllci4gV2hpY2ggY2FycmllciBoYXMgdGhlIG1vc3QgdmFyaWFibGUgYXJyaXZhbCBkZWxheXM/CgojIyBEbCBoYXMgdGhlIG1vc3QgdmFyaWFibGUgYXJyaXZhbCBkZWxheXMgYmVjdWFzZSBpdCBoYXMgdGhlIGhpZ2hlc3QgSVFSLgoKYGBge3J9CnNmb19mZWJfZmxpZ2h0cyAlPiUKICBncm91cF9ieShjYXJyaWVyKSAlPiUKICBzdW1tYXJpc2UobWVkaWFuX2FkID0gbWVkaWFuKGFycl9kZWxheSksIAogICAgICAgICAgICBpcXJfYWQgPSBJUVIoYXJyX2RlbGF5KSkKYGBgCgoKIyMjIEV4ZXJjaXNlIDUgLSBTdXBwb3NlIHlvdSByZWFsbHkgZGlzbGlrZSBkZXBhcnR1cmUgZGVsYXlzIGFuZCB5b3Ugd2FudCB0byBzY2hlZHVsZSB5b3VyIHRyYXZlbCBpbiBhIG1vbnRoIHRoYXQgbWluaW1pemVzIHlvdXIgcG90ZW50aWFsIGRlcGFydHVyZSBkZWxheSBsZWF2aW5nIE5ZQy4gT25lIG9wdGlvbiBpcyB0byBjaG9vc2UgdGhlIG1vbnRoIHdpdGggdGhlIGxvd2VzdCBtZWFuIGRlcGFydHVyZSBkZWxheS4gQW5vdGhlciBvcHRpb24gaXMgdG8gY2hvb3NlIHRoZSBtb250aCB3aXRoIHRoZSBsb3dlc3QgbWVkaWFuIGRlcGFydHVyZSBkZWxheS4gV2hhdCBhcmUgdGhlIHByb3MgYW5kIGNvbnMgb2YgdGhlc2UgdHdvIGNob2ljZXM/CgojIyBUaGUgbW9udGggd2l0aCB0aGUgbG93ZXN0IG1lYW4gZGVwYXJ0dXJlIGRlbGF5IGlzICgxMCkgd2hpY2ggaXMgb2N0b2Jlci4gVGhlIG1vbnRoIHdpdGggdGhlIGxvd2VzdCBtZWRpYW4gZGVwYXJ0dXJlIGRlbGF5IGlzIGEgdGllIGZvciAoOSBhbmQgMTApIHdoaWNoIGlzIHNlcHRlbWJlciBhbmQgb2N0b2Jlci4gVGhlIHByb3Mgb2YgdXNpbmcgdGhlIG1lYW4gaXMgdGhhdCB5b3UgZ2V0IGEgbW9yZSBleGFjdCBhbnN3ZXIuIFRoZSBjb25zIGlzIHRoYXQgaXQgaXMgc2ltaWxhciB0byB0aGUgbmV4dCBsb3dlc3QgbW9udGggYnV0IHN0aWxsIGRpZmZlcmVudC4gVGhlIHByb3MgZm9yIG1lZGlhbiBpcyB5b3UgZ2V0IHR3byBhbnN3ZXJzIGZvciB0aGUgbG93ZXN0IGRlcGFydHVyZSBkZWxheXMgYW5kIG1vcmUgY2hvaWNlcyBmb3IgZmxpZ2h0cy4gVGhlIGNvbnMgYXJlIHlvdSBoYXZlIHR3aWNlIGFzIG11Y2ggZGF0YSBhbmQgdGhlIG1lZGlhbiBkb2VzIG5vdCBnaXZlIGRlY2ltYWxzLgoKYGBge3J9Cm55Y2ZsaWdodHMgJT4lCiAgZ3JvdXBfYnkobW9udGgpICU+JQogIHN1bW1hcmlzZShtZWFuX2RkID0gbWVhbihkZXBfZGVsYXkpKSAlPiUgCiAgYXJyYW5nZShkZXNjKG1lYW5fZGQpKQoKbnljZmxpZ2h0cyAlPiUKICBncm91cF9ieShtb250aCkgJT4lCiAgc3VtbWFyaXNlKG1lZGlhbl9kZCA9IG1lZGlhbihkZXBfZGVsYXkpKSAlPiUgCiAgYXJyYW5nZShkZXNjKG1lZGlhbl9kZCkpCmBgYAoKCiMjIyBFeGVyY2lzZSA2IC0gSWYgeW91IHdlcmUgc2VsZWN0aW5nIGFuIGFpcnBvcnQgc2ltcGx5IGJhc2VkIG9uIG9uIHRpbWUgZGVwYXJ0dXJlIHBlcmNlbnRhZ2UsIHdoaWNoIE5ZQyBhaXJwb3J0IHdvdWxkIHlvdSBjaG9vc2UgdG8gZmx5IG91dCBvZj8KCgojI0kgd291bGQgY2hvb3NlIExHQSBiYXNlZCBvbiB0aGUgT24gdGltZSBkZXBhcnR1cmUgcmF0ZSBhcyBpdCBpcyA3MyUgYW5kIGhpZ2hlciB0aGFuIHRoZSBvdGhlciB0d28uIAoKYGBge3J9Cm55Y2ZsaWdodHMgPC0gbnljZmxpZ2h0cyAlPiUKICBtdXRhdGUoZGVwX3R5cGUgPSBpZmVsc2UoZGVwX2RlbGF5IDwgNSwgIm9uIHRpbWUiLCAiZGVsYXllZCIpKQoKbnljZmxpZ2h0cyAlPiUKICBncm91cF9ieShvcmlnaW4pICU+JQogIHN1bW1hcmlzZShvdF9kZXBfcmF0ZSA9IHN1bShkZXBfdHlwZSA9PSAib24gdGltZSIpIC8gbigpKSAlPiUKICBhcnJhbmdlKGRlc2Mob3RfZGVwX3JhdGUpKQoKYGBgCgoKCiMjIyBFeGVyY2lzZSA3IC0gTXV0YXRlIHRoZSBkYXRhIGZyYW1lIHNvIHRoYXQgaXQgaW5jbHVkZXMgYSBuZXcgdmFyaWFibGUgdGhhdCBjb250YWlucyB0aGUgYXZlcmFnZSBzcGVlZCwgYXZnX3NwZWVkIHRyYXZlbGVkIGJ5IHRoZSBwbGFuZSBmb3IgZWFjaCBmbGlnaHQgKGluIG1waCkuIEhpbnQ6IEF2ZXJhZ2Ugc3BlZWQgY2FuIGJlIGNhbGN1bGF0ZWQgYXMgZGlzdGFuY2UgZGl2aWRlZCBieSBudW1iZXIgb2YgaG91cnMgb2YgdHJhdmVsLCBhbmQgbm90ZSB0aGF0IGFpcl90aW1lIGlzIGdpdmVuIGluIG1pbnV0ZXMuCgoKYGBge3J9Cm55Y2ZsaWdodHMkYWlyX2hvdXJzIDwtIG55Y2ZsaWdodHMkYWlyX3RpbWUgLyA2MAoKbnljZmxpZ2h0cyA8LSBueWNmbGlnaHRzICU+JSAKICBtdXRhdGUoYXZnX3NwZWVkID0gZGlzdGFuY2UvYWlyX2hvdXJzKQoKaGVhZChueWNmbGlnaHRzKQpgYGAKCgoKIyMjIEV4ZXJjaXNlIDggLSBNYWtlIGEgc2NhdHRlcnBsb3Qgb2YgYXZnX3NwZWVkIHZzLiBkaXN0YW5jZS4gRGVzY3JpYmUgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGF2ZXJhZ2Ugc3BlZWQgYW5kIGRpc3RhbmNlLiBIaW50OiBVc2UgZ2VvbV9wb2ludCgpLgoKIyMgVGhlIGF2ZXJhZ2Ugc3BlZWQgb2YgbW9zdCBmbGlnaHRzIGlzIGJldHdlZW4gMzAwIGFuZCA1MDAgbXBoLiBUaGUgbW9zdCBjb21tb24gZGlzdGFuY2VzIGZvciBmbGlnaHRzIGFyZSA1MDAtMjUwMCBtaWxlcy4KYGBge3J9CmdncGxvdChueWNmbGlnaHRzLCBhZXMoeD1hdmdfc3BlZWQsIHk9ZGlzdGFuY2UpKSsKICBnZW9tX3BvaW50KCkrCiAgbGFicyh0aXRsZSA9ICJBdmVyYWdlIFNwZWVkIHZzLiBEaXN0YW5jZSIsCiAgICAgICB4PSJBdmVyYWdlIFNwZWVkIiwKICAgICAgIHk9IkRpc3RhbmNlIikKCmBgYAoKCiMjIyBFeGVyY2lzZSA5IC0gUmVwbGljYXRlIHRoZSBmb2xsb3dpbmcgcGxvdC4gSGludDogVGhlIGRhdGEgZnJhbWUgcGxvdHRlZCBvbmx5IGNvbnRhaW5zIGZsaWdodHMgZnJvbSBBbWVyaWNhbiBBaXJsaW5lcywgRGVsdGEgQWlybGluZXMsIGFuZCBVbml0ZWQgQWlybGluZXMsIGFuZCB0aGUgcG9pbnRzIGFyZSBjb2xvcmVkIGJ5IGNhcnJpZXIuIE9uY2UgeW91IHJlcGxpY2F0ZSB0aGUgcGxvdCwgZGV0ZXJtaW5lIChyb3VnaGx5KSB3aGF0IHRoZSBjdXRvZmYgcG9pbnQgaXMgZm9yIGRlcGFydHVyZSBkZWxheXMgd2hlcmUgeW91IGNhbiBzdGlsbCBleHBlY3QgdG8gZ2V0IHRvIHlvdXIgZGVzdGluYXRpb24gb24gdGltZS4KCiMjIFJvdWdobHkgdGhlIGN1dG9mZiBmb3IgZGVwYXJ0dXJlIGRlbGF5cyB0aGF0IHN0aWxsIGFycml2ZSBvbiB0aW1lIGlzIHNvbWV3aGVyZSBhcm91bmQgNTAtNzAuCgpgYGB7cn0KbnljZmxpZ2h0czE8LSBueWNmbGlnaHRzICU+JSBmaWx0ZXIoY2FycmllciAlaW4lIGMoIkFBIiwgIkRMIiwgIlVBIikpCgpnZ3Bsb3QobnljZmxpZ2h0czEsIGFlcyh4PWRlcF9kZWxheSwgeT1hcnJfZGVsYXksIGNvbG91ciA9IGNhcnJpZXIpKSsKICBnZW9tX3BvaW50KCkKCmBgYAoK