library(tidyverse)
library(completejourney)
library(tidyr)
transactions <- transactions_sample %>%
  mutate(
    regular_price = (sales_value + retail_disc + coupon_match_disc) / quantity,
    loyalty_price = (sales_value + coupon_match_disc) / quantity, 
    coupon_price = (sales_value - coupon_disc) / quantity
  ) %>%
  select(regular_price, loyalty_price, coupon_price, product_id, everything())
transactions %>% 
  slice_max(order_by = loyalty_price, n = 5)
transactions %>%
  filter(quantity > 0) %>%
  slice_max(order_by = loyalty_price, n = 5) 
products %>%
  filter(product_id == '12484608')
transactions %>%
  filter(regular_price <= 1) %>%
  select(product_id) %>%
  n_distinct()
[1] 2748
transactions %>%
  filter(loyalty_price <= 1) %>% 
  select(product_id) %>%
  n_distinct()
[1] 4648
transactions %>%
  filter(coupon_price <= 1) %>%
  select(product_id) %>% 
  n_distinct()
[1] 4844
transactions %>%
  summarise(prop_over_10 = mean(sales_value > 10),
            prop_over_20 = mean(sales_value > 20))
transactions %>%
  group_by(store_id) %>% 
  summarise(total_sales_value = sum(sales_value, na.rm = TRUE)) %>%
  arrange(desc(total_sales_value))
transactions %>%
  mutate(pct_loyalty_disc = 1 - (loyalty_price / regular_price)) %>%
  group_by(store_id) %>%
  summarise(avg_pct_loyalty_disc = mean(pct_loyalty_disc, na.rm = TRUE)) %>%
  arrange(desc(avg_pct_loyalty_disc))
library(readxl)
excel_sheets(path = "./mbta.xlsx")
[1] "Sheet1"
mbta <- read_excel(path = "./mbta.xlsx", sheet = 1, skip = 1, na = "NA")
New names:
str(mbta)
tibble [11 × 60] (S3: tbl_df/tbl/data.frame)
 $ ...1   : num [1:11] 1 2 3 4 5 6 7 8 9 10 ...
 $ mode   : chr [1:11] "All Modes by Qtr" "Boat" "Bus" "Commuter Rail" ...
 $ 2007-01: num [1:11] NA 4 336 142 435 ...
 $ 2007-02: num [1:11] NA 3.6 338.7 138.5 448.3 ...
 $ 2007-03: num [1:11] 1188 40 340 138 459 ...
 $ 2007-04: num [1:11] NA 4.3 352.2 139.5 472.2 ...
 $ 2007-05: num [1:11] NA 4.9 354.4 139 474.6 ...
 $ 2007-06: num [1:11] 1246 5.8 350.5 143 477 ...
 $ 2007-07: num [1:11] NA 6.52 357.52 142.39 471.74 ...
 $ 2007-08: num [1:11] NA 6.57 355.48 142.36 461.61 ...
 $ 2007-09: num [1:11] 1256.57 5.47 372.6 143.05 499.57 ...
 $ 2007-10: num [1:11] NA 5.14 368.85 146.54 457.74 ...
 $ 2007-11: num [1:11] NA 3.76 330.83 145.09 488.35 ...
 $ 2007-12: num [1:11] 1216.89 2.98 312.92 141.59 448.27 ...
 $ 2008-01: num [1:11] NA 3.17 340.32 142.15 472.62 ...
 $ 2008-02: num [1:11] NA 3.11 352.9 142.61 492.1 ...
 $ 2008-03: num [1:11] 1253.52 3.51 361.15 137.45 494.05 ...
 $ 2008-04: num [1:11] NA 4.16 368.19 140.39 513.2 ...
 $ 2008-05: num [1:11] NA 4.01 363.9 142.59 507.95 ...
 $ 2008-06: num [1:11] 1314.82 5.19 362.96 142.06 518.35 ...
 $ 2008-07: num [1:11] NA 6.02 370.92 145.73 512.31 ...
 $ 2008-08: num [1:11] NA 5.8 361.1 144.6 477 ...
 $ 2008-09: num [1:11] 1307.04 4.59 389.54 141.91 517.32 ...
 $ 2008-10: num [1:11] NA 4.29 357.97 151.96 523.64 ...
 $ 2008-11: num [1:11] NA 3.49 345.42 152.95 487.12 ...
 $ 2008-12: num [1:11] 1232.65 3.01 325.77 140.81 446.74 ...
 $ 2009-01: num [1:11] NA 3.01 338.53 141.45 461 ...
 $ 2009-02: num [1:11] NA 3.2 360.4 143.5 482.4 ...
 $ 2009-03: num [1:11] 1209.79 3.33 353.69 142.89 467.22 ...
 $ 2009-04: num [1:11] NA 4.05 359.38 142.34 493.15 ...
 $ 2009-05: num [1:11] NA 4.12 354.75 144.22 475.63 ...
 $ 2009-06: num [1:11] 1233.1 4.9 347.9 142 473.1 ...
 $ 2009-07: num [1:11] NA 6.44 339.48 137.69 470.83 ...
 $ 2009-08: num [1:11] NA 5.9 332.7 139.2 466.7 ...
 $ 2009-09: num [1:11] 1230.5 4.7 374.3 139.1 500.4 ...
 $ 2009-10: num [1:11] NA 4.21 385.87 137.1 513.41 ...
 $ 2009-11: num [1:11] NA 3.58 366.98 129.34 480.28 ...
 $ 2009-12: num [1:11] 1207.85 3.11 332.39 126.07 440.93 ...
 $ 2010-01: num [1:11] NA 3.21 362.23 130.91 464.07 ...
 $ 2010-02: num [1:11] NA 3.19 361.14 131.92 480.12 ...
 $ 2010-03: num [1:11] 1208.86 3.48 373.44 131.25 483.4 ...
 $ 2010-04: num [1:11] NA 4.45 378.61 131.72 502.37 ...
 $ 2010-05: num [1:11] NA 4.42 380.17 128.8 487.4 ...
 $ 2010-06: num [1:11] 1244.41 5.41 363.27 129.14 490.26 ...
 $ 2010-07: num [1:11] NA 6.51 353.04 122.94 488.59 ...
 $ 2010-08: num [1:11] NA 6.27 343.69 129.73 473.73 ...
 $ 2010-09: num [1:11] 1225.5 4.7 381.6 132.9 521.1 ...
 $ 2010-10: num [1:11] NA 4.4 385 131 532.4 ...
 $ 2010-11: num [1:11] NA 3.73 367.95 130.89 502.89 ...
 $ 2010-12: num [1:11] 1216.26 3.16 326.34 121.42 450.43 ...
 $ 2011-01: num [1:11] NA 3.14 334.96 128.4 468.42 ...
 $ 2011-02: num [1:11] NA 3.28 346.23 125.46 504.07 ...
 $ 2011-03: num [1:11] 1223.45 3.67 380.4 134.37 516.73 ...
 $ 2011-04: num [1:11] NA 4.25 380.45 134.17 528.63 ...
 $ 2011-05: num [1:11] NA 4.43 385.29 136.14 528.12 ...
 $ 2011-06: num [1:11] 1302.41 5.47 376.32 135.58 529.53 ...
 $ 2011-07: num [1:11] NA 6.58 361.58 132.41 532.89 ...
 $ 2011-08: num [1:11] NA 6.73 353.79 130.62 508.14 ...
 $ 2011-09: num [1:11] 1291 5 388 137 550 ...
 $ 2011-10: num [1:11] NA 4.48 398.46 128.72 554.93 ...
head(mbta, 6)
summary(mbta)
      ...1          mode              2007-01            2007-02            2007-03            2007-04            2007-05        
 Min.   : 1.0   Length:11          Min.   :   0.020   Min.   :  -0.040   Min.   :   0.114   Min.   :  -0.002   Min.   :   0.049  
 1st Qu.: 3.5   Class :character   1st Qu.:   4.804   1st Qu.:   4.563   1st Qu.:   9.278   1st Qu.:   4.756   1st Qu.:   5.025  
 Median : 6.0   Mode  :character   Median :  77.478   Median :  75.707   Median : 137.700   Median :  76.472   Median :  76.240  
 Mean   : 6.0                      Mean   : 233.397   Mean   : 238.324   Mean   : 330.293   Mean   : 249.421   Mean   : 248.956  
 3rd Qu.: 8.5                      3rd Qu.: 308.672   3rd Qu.: 314.072   3rd Qu.: 399.225   3rd Qu.: 328.011   3rd Qu.: 327.841  
 Max.   :11.0                      Max.   :1166.974   Max.   :1191.639   Max.   :1204.725   Max.   :1247.105   Max.   :1244.755  
                                   NA's   :1          NA's   :1                             NA's   :1          NA's   :1         
    2007-06            2007-07            2007-08            2007-09            2007-10            2007-11            2007-12        
 Min.   :   0.096   Min.   :  -0.037   Min.   :   0.004   Min.   :  -0.007   Min.   :  -0.064   Min.   :  -0.077   Min.   :  -0.060  
 1st Qu.:   5.700   1st Qu.:   5.570   1st Qu.:   5.624   1st Qu.:   5.539   1st Qu.:   5.310   1st Qu.:   4.478   1st Qu.:   4.385  
 Median : 143.000   Median :  77.851   Median :  77.753   Median : 143.051   Median :  80.582   Median :  79.356   Median : 141.585  
 Mean   : 339.846   Mean   : 248.787   Mean   : 244.665   Mean   : 352.554   Mean   : 248.884   Mean   : 248.371   Mean   : 321.588  
 3rd Qu.: 413.788   3rd Qu.: 328.961   3rd Qu.: 325.336   3rd Qu.: 436.082   3rd Qu.: 336.994   3rd Qu.: 310.744   3rd Qu.: 380.594  
 Max.   :1246.129   Max.   :1243.952   Max.   :1223.323   Max.   :1310.764   Max.   :1244.453   Max.   :1241.895   Max.   :1216.890  
                    NA's   :1          NA's   :1                             NA's   :1          NA's   :1                            
    2008-01            2008-02            2008-03            2008-04            2008-05            2008-06            2008-07        
 Min.   :   0.048   Min.   :   0.061   Min.   :   0.058   Min.   :   0.060   Min.   :   0.046   Min.   :   0.060   Min.   :   0.069  
 1st Qu.:   4.475   1st Qu.:   4.485   1st Qu.:   5.170   1st Qu.:   4.689   1st Qu.:   4.629   1st Qu.:   5.742   1st Qu.:   6.019  
 Median :  78.023   Median :  78.389   Median : 137.453   Median :  77.555   Median :  78.506   Median : 142.057   Median :  80.061  
 Mean   : 244.615   Mean   : 252.803   Mean   : 345.604   Mean   : 264.435   Mean   : 260.323   Mean   : 359.667   Mean   : 266.027  
 3rd Qu.: 315.549   3rd Qu.: 327.005   3rd Qu.: 427.601   3rd Qu.: 343.909   3rd Qu.: 337.515   3rd Qu.: 440.656   3rd Qu.: 345.730  
 Max.   :1223.050   Max.   :1263.983   Max.   :1274.031   Max.   :1322.146   Max.   :1301.591   Max.   :1320.728   Max.   :1330.103  
 NA's   :1          NA's   :1                             NA's   :1          NA's   :1                             NA's   :1         
    2008-08            2008-09            2008-10            2008-11            2008-12            2009-01            2009-02       
 Min.   :   0.023   Min.   :   0.021   Min.   :   0.054   Min.   :   0.002   Min.   :  -0.015   Min.   :  -0.034   Min.   :  -0.02  
 1st Qu.:   5.887   1st Qu.:   5.691   1st Qu.:   5.087   1st Qu.:   4.829   1st Qu.:   4.689   1st Qu.:   4.186   1st Qu.:   4.38  
 Median :  79.141   Median : 141.907   Median :  82.486   Median :  82.774   Median : 140.810   Median :  76.874   Median :  76.59  
 Mean   : 250.383   Mean   : 362.099   Mean   : 262.440   Mean   : 248.871   Mean   : 319.882   Mean   : 236.303   Mean   : 247.65  
 3rd Qu.: 330.629   3rd Qu.: 453.430   3rd Qu.: 330.996   3rd Qu.: 317.084   3rd Qu.: 386.255   3rd Qu.: 307.814   3rd Qu.: 327.49  
 Max.   :1251.905   Max.   :1338.015   Max.   :1312.172   Max.   :1244.354   Max.   :1232.655   Max.   :1181.534   Max.   :1238.24  
 NA's   :1                             NA's   :1          NA's   :1                             NA's   :1          NA's   :1        
    2009-03            2009-04            2009-05            2009-06            2009-07            2009-08            2009-09        
 Min.   :  -0.050   Min.   :  -0.048   Min.   :  -0.058   Min.   :  -0.079   Min.   :  -0.094   Min.   :  -0.044   Min.   :  -0.035  
 1st Qu.:   5.003   1st Qu.:   4.720   1st Qu.:   4.763   1st Qu.:   5.845   1st Qu.:   6.298   1st Qu.:   6.033   1st Qu.:   5.693  
 Median : 142.893   Median :  76.833   Median :  78.358   Median : 142.006   Median :  74.558   Median :  75.604   Median : 139.087  
 Mean   : 330.142   Mean   : 251.603   Mean   : 245.116   Mean   : 333.194   Mean   : 241.006   Mean   : 239.427   Mean   : 346.687  
 3rd Qu.: 410.455   3rd Qu.: 329.093   3rd Qu.: 322.303   3rd Qu.: 410.482   3rd Qu.: 312.185   3rd Qu.: 307.442   3rd Qu.: 437.332  
 Max.   :1210.912   Max.   :1258.037   Max.   :1225.608   Max.   :1233.085   Max.   :1205.079   Max.   :1197.158   Max.   :1291.564  
                    NA's   :1          NA's   :1                             NA's   :1          NA's   :1                            
    2009-10            2009-11            2009-12            2010-01            2010-02            2010-03            2010-04        
 Min.   :  -0.014   Min.   :  -0.022   Min.   :  -0.022   Min.   :   0.004   Min.   :  -0.022   Min.   :   0.012   Min.   :   0.007  
 1st Qu.:   4.883   1st Qu.:   4.323   1st Qu.:   4.784   1st Qu.:   4.034   1st Qu.:   4.062   1st Qu.:   5.274   1st Qu.:   5.130  
 Median :  75.178   Median :  70.997   Median : 126.066   Median :  71.588   Median :  72.238   Median : 131.252   Median :  72.370  
 Mean   : 258.811   Mean   : 243.363   Mean   : 312.962   Mean   : 237.255   Mean   : 242.244   Mean   : 332.726   Mean   : 253.446  
 3rd Qu.: 347.086   3rd Qu.: 328.913   3rd Qu.: 386.659   3rd Qu.: 322.769   3rd Qu.: 324.137   3rd Qu.: 428.420   3rd Qu.: 340.770  
 Max.   :1294.064   Max.   :1216.824   Max.   :1207.845   Max.   :1186.271   Max.   :1211.228   Max.   :1225.556   Max.   :1267.226  
 NA's   :1          NA's   :1                             NA's   :1          NA's   :1                             NA's   :1         
    2010-05            2010-06            2010-07            2010-08            2010-09            2010-10            2010-11        
 Min.   :   0.013   Min.   :   0.008   Min.   :   0.001   Min.   :  -0.015   Min.   :   0.001   Min.   :   0.009   Min.   :   0.022  
 1st Qu.:   5.086   1st Qu.:   6.436   1st Qu.:   6.531   1st Qu.:   6.281   1st Qu.:   5.567   1st Qu.:   5.006   1st Qu.:   4.402  
 Median :  70.785   Median : 129.144   Median :  64.950   Median :  68.388   Median : 132.892   Median :  69.340   Median :  69.166  
 Mean   : 248.231   Mean   : 335.964   Mean   : 241.180   Mean   : 235.947   Mean   : 346.524   Mean   : 261.255   Mean   : 248.748  
 3rd Qu.: 339.579   3rd Qu.: 426.769   3rd Qu.: 319.462   3rd Qu.: 310.399   3rd Qu.: 451.361   3rd Qu.: 347.832   3rd Qu.: 331.437  
 Max.   :1241.148   Max.   :1244.409   Max.   :1205.901   Max.   :1179.745   Max.   :1293.117   Max.   :1306.271   Max.   :1243.730  
 NA's   :1                             NA's   :1          NA's   :1                             NA's   :1          NA's   :1         
    2010-12            2011-01            2011-02            2011-03           2011-04            2011-05            2011-06        
 Min.   :  -0.004   Min.   :  -0.028   Min.   :   0.008   Min.   :   0.05   Min.   :   0.036   Min.   :   0.050   Min.   :   0.054  
 1st Qu.:   4.466   1st Qu.:   4.039   1st Qu.:   4.329   1st Qu.:   6.03   1st Qu.:   5.224   1st Qu.:   5.338   1st Qu.:   6.926  
 Median : 121.422   Median :  69.750   Median :  68.579   Median : 134.37   Median :  73.384   Median :  74.216   Median : 135.581  
 Mean   : 312.917   Mean   : 230.680   Mean   : 244.133   Mean   : 345.17   Mean   : 262.660   Mean   : 260.582   Mean   : 353.331  
 3rd Qu.: 388.385   3rd Qu.: 300.831   3rd Qu.: 314.647   3rd Qu.: 448.56   3rd Qu.: 345.904   3rd Qu.: 345.411   3rd Qu.: 452.923  
 Max.   :1216.262   Max.   :1153.413   Max.   :1220.663   Max.   :1286.66   Max.   :1313.283   Max.   :1302.884   Max.   :1302.414  
                    NA's   :1          NA's   :1                            NA's   :1          NA's   :1                            
    2011-07            2011-08            2011-09            2011-10        
 Min.   :   0.067   Min.   :   0.052   Min.   :   0.043   Min.   :   0.032  
 1st Qu.:   6.911   1st Qu.:   7.067   1st Qu.:   6.660   1st Qu.:   5.513  
 Median :  71.735   Median :  70.853   Median : 136.901   Median :  70.508  
 Mean   : 257.228   Mean   : 248.259   Mean   : 362.555   Mean   : 269.648  
 3rd Qu.: 328.941   3rd Qu.: 320.386   3rd Qu.: 469.204   3rd Qu.: 358.284  
 Max.   :1286.107   Max.   :1241.268   Max.   :1348.754   Max.   :1348.222  
 NA's   :1          NA's   :1                             NA's   :1         
sapply(mbta, function(x) sum(is.na(x)))
   ...1    mode 2007-01 2007-02 2007-03 2007-04 2007-05 2007-06 2007-07 2007-08 2007-09 2007-10 2007-11 2007-12 2008-01 2008-02 
      0       0       1       1       0       1       1       0       1       1       0       1       1       0       1       1 
2008-03 2008-04 2008-05 2008-06 2008-07 2008-08 2008-09 2008-10 2008-11 2008-12 2009-01 2009-02 2009-03 2009-04 2009-05 2009-06 
      0       1       1       0       1       1       0       1       1       0       1       1       0       1       1       0 
2009-07 2009-08 2009-09 2009-10 2009-11 2009-12 2010-01 2010-02 2010-03 2010-04 2010-05 2010-06 2010-07 2010-08 2010-09 2010-10 
      1       1       0       1       1       0       1       1       0       1       1       0       1       1       0       1 
2010-11 2010-12 2011-01 2011-02 2011-03 2011-04 2011-05 2011-06 2011-07 2011-08 2011-09 2011-10 
      1       0       1       1       0       1       1       0       1       1       0       1 
library(tidyverse)
mbta <- mbta %>%
  slice(-c(1, 7, 11))
mbta <- mbta %>%
  select(-1)
dim(mbta)
[1]  8 59
mbta <- mbta %>%
  pivot_longer(cols = -mode, names_to = "date", values_to = "thou_riders")
dim(mbta)
[1] 464   3
library(tidyverse)
mbta <- mbta %>%
  separate(date, into = c("year", "month"), sep = "-") 
head(mbta)
mbta$thou_riders[mbta$mode=="Boat" & mbta$month=="Jul" & mbta$year=="2006"] <- 4
mbta %>%
  group_by(mode) %>%
  summarise(avg_ridership = mean(thou_riders))
mbta %>%
  filter(month == "01") %>%
  group_by(mode) %>%
  summarise(avg_ridership = mean(thou_riders))
mbta %>%
  filter(mode == "Boat") %>%
  group_by(year) %>%
  summarise(total_riders = sum(thou_riders)) 
mbta %>%
  group_by(month) %>% 
  summarise(avg_heavy_rail = mean(thou_riders[mode == "Heavy Rail"])) %>%
  slice_max(avg_heavy_rail)
LS0tDQp0aXRsZTogIk1vZHVsZSAzIFZpc2hlc2giDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KYGBge3J9DQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkoY29tcGxldGVqb3VybmV5KQ0KbGlicmFyeSh0aWR5cikNCmBgYA0KYGBge3J9DQp0cmFuc2FjdGlvbnMgPC0gdHJhbnNhY3Rpb25zX3NhbXBsZSAlPiUNCiAgbXV0YXRlKA0KICAgIHJlZ3VsYXJfcHJpY2UgPSAoc2FsZXNfdmFsdWUgKyByZXRhaWxfZGlzYyArIGNvdXBvbl9tYXRjaF9kaXNjKSAvIHF1YW50aXR5LA0KICAgIGxveWFsdHlfcHJpY2UgPSAoc2FsZXNfdmFsdWUgKyBjb3Vwb25fbWF0Y2hfZGlzYykgLyBxdWFudGl0eSwgDQogICAgY291cG9uX3ByaWNlID0gKHNhbGVzX3ZhbHVlIC0gY291cG9uX2Rpc2MpIC8gcXVhbnRpdHkNCiAgKSAlPiUNCiAgc2VsZWN0KHJlZ3VsYXJfcHJpY2UsIGxveWFsdHlfcHJpY2UsIGNvdXBvbl9wcmljZSwgcHJvZHVjdF9pZCwgZXZlcnl0aGluZygpKQ0KYGBgDQpgYGB7cn0NCnRyYW5zYWN0aW9ucyAlPiUgDQogIHNsaWNlX21heChvcmRlcl9ieSA9IGxveWFsdHlfcHJpY2UsIG4gPSA1KQ0KYGBgDQpgYGB7cn0NCnRyYW5zYWN0aW9ucyAlPiUNCiAgZmlsdGVyKHF1YW50aXR5ID4gMCkgJT4lDQogIHNsaWNlX21heChvcmRlcl9ieSA9IGxveWFsdHlfcHJpY2UsIG4gPSA1KSANCmBgYA0KYGBge3J9DQpwcm9kdWN0cyAlPiUNCiAgZmlsdGVyKHByb2R1Y3RfaWQgPT0gJzEyNDg0NjA4JykNCmBgYA0KYGBge3J9DQp0cmFuc2FjdGlvbnMgJT4lDQogIGZpbHRlcihyZWd1bGFyX3ByaWNlIDw9IDEpICU+JQ0KICBzZWxlY3QocHJvZHVjdF9pZCkgJT4lDQogIG5fZGlzdGluY3QoKQ0KYGBgDQpgYGB7cn0NCnRyYW5zYWN0aW9ucyAlPiUNCiAgZmlsdGVyKGxveWFsdHlfcHJpY2UgPD0gMSkgJT4lIA0KICBzZWxlY3QocHJvZHVjdF9pZCkgJT4lDQogIG5fZGlzdGluY3QoKQ0KYGBgDQpgYGB7cn0NCnRyYW5zYWN0aW9ucyAlPiUNCiAgZmlsdGVyKGNvdXBvbl9wcmljZSA8PSAxKSAlPiUNCiAgc2VsZWN0KHByb2R1Y3RfaWQpICU+JSANCiAgbl9kaXN0aW5jdCgpDQpgYGANCmBgYHtyfQ0KdHJhbnNhY3Rpb25zICU+JQ0KICBzdW1tYXJpc2UocHJvcF9vdmVyXzEwID0gbWVhbihzYWxlc192YWx1ZSA+IDEwKSwNCiAgICAgICAgICAgIHByb3Bfb3Zlcl8yMCA9IG1lYW4oc2FsZXNfdmFsdWUgPiAyMCkpDQpgYGANCmBgYHtyfQ0KdHJhbnNhY3Rpb25zICU+JQ0KICBncm91cF9ieShzdG9yZV9pZCkgJT4lIA0KICBzdW1tYXJpc2UodG90YWxfc2FsZXNfdmFsdWUgPSBzdW0oc2FsZXNfdmFsdWUsIG5hLnJtID0gVFJVRSkpICU+JQ0KICBhcnJhbmdlKGRlc2ModG90YWxfc2FsZXNfdmFsdWUpKQ0KYGBgDQpgYGB7cn0NCnRyYW5zYWN0aW9ucyAlPiUNCiAgbXV0YXRlKHBjdF9sb3lhbHR5X2Rpc2MgPSAxIC0gKGxveWFsdHlfcHJpY2UgLyByZWd1bGFyX3ByaWNlKSkgJT4lDQogIGdyb3VwX2J5KHN0b3JlX2lkKSAlPiUNCiAgc3VtbWFyaXNlKGF2Z19wY3RfbG95YWx0eV9kaXNjID0gbWVhbihwY3RfbG95YWx0eV9kaXNjLCBuYS5ybSA9IFRSVUUpKSAlPiUNCiAgYXJyYW5nZShkZXNjKGF2Z19wY3RfbG95YWx0eV9kaXNjKSkNCmBgYA0KYGBge3J9DQpsaWJyYXJ5KHJlYWR4bCkNCmV4Y2VsX3NoZWV0cyhwYXRoID0gIi4vbWJ0YS54bHN4IikNCm1idGEgPC0gcmVhZF9leGNlbChwYXRoID0gIi4vbWJ0YS54bHN4Iiwgc2hlZXQgPSAxLCBza2lwID0gMSwgbmEgPSAiTkEiKQ0KYGBgDQpgYGB7cn0NCnN0cihtYnRhKQ0KYGBgDQpgYGB7cn0NCmhlYWQobWJ0YSwgNikNCnN1bW1hcnkobWJ0YSkNCnNhcHBseShtYnRhLCBmdW5jdGlvbih4KSBzdW0oaXMubmEoeCkpKQ0KYGBgDQpgYGB7cn0NCmxpYnJhcnkodGlkeXZlcnNlKQ0KbWJ0YSA8LSBtYnRhICU+JQ0KICBzbGljZSgtYygxLCA3LCAxMSkpDQptYnRhIDwtIG1idGEgJT4lDQogIHNlbGVjdCgtMSkNCmRpbShtYnRhKQ0KYGBgDQpgYGB7cn0NCm1idGEgPC0gbWJ0YSAlPiUNCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSAtbW9kZSwgbmFtZXNfdG8gPSAiZGF0ZSIsIHZhbHVlc190byA9ICJ0aG91X3JpZGVycyIpDQpgYGANCmBgYHtyfQ0KZGltKG1idGEpDQpgYGANCmBgYHtyfQ0KbGlicmFyeSh0aWR5dmVyc2UpDQptYnRhIDwtIG1idGEgJT4lDQogIHNlcGFyYXRlKGRhdGUsIGludG8gPSBjKCJ5ZWFyIiwgIm1vbnRoIiksIHNlcCA9ICItIikgDQpoZWFkKG1idGEpDQpgYGANCmBgYHtyfQ0KbWJ0YSR0aG91X3JpZGVyc1ttYnRhJG1vZGU9PSJCb2F0IiAmIG1idGEkbW9udGg9PSJKdWwiICYgbWJ0YSR5ZWFyPT0iMjAwNiJdIDwtIDQNCmBgYA0KYGBge3J9DQptYnRhICU+JQ0KICBncm91cF9ieShtb2RlKSAlPiUNCiAgc3VtbWFyaXNlKGF2Z19yaWRlcnNoaXAgPSBtZWFuKHRob3VfcmlkZXJzKSkNCmBgYA0KYGBge3J9DQptYnRhICU+JQ0KICBmaWx0ZXIobW9udGggPT0gIjAxIikgJT4lDQogIGdyb3VwX2J5KG1vZGUpICU+JQ0KICBzdW1tYXJpc2UoYXZnX3JpZGVyc2hpcCA9IG1lYW4odGhvdV9yaWRlcnMpKQ0KYGBgDQpgYGB7cn0NCm1idGEgJT4lDQogIGZpbHRlcihtb2RlID09ICJCb2F0IikgJT4lDQogIGdyb3VwX2J5KHllYXIpICU+JQ0KICBzdW1tYXJpc2UodG90YWxfcmlkZXJzID0gc3VtKHRob3VfcmlkZXJzKSkgDQpgYGANCmBgYHtyfQ0KbWJ0YSAlPiUNCiAgZ3JvdXBfYnkobW9udGgpICU+JSANCiAgc3VtbWFyaXNlKGF2Z19oZWF2eV9yYWlsID0gbWVhbih0aG91X3JpZGVyc1ttb2RlID09ICJIZWF2eSBSYWlsIl0pKSAlPiUNCiAgc2xpY2VfbWF4KGF2Z19oZWF2eV9yYWlsKQ0KYGBg