Downloading packages

packages <- c('dplyr', 'ggplot2', 'readxl', 'readr', 'tidyverse', 'ggthemes', 'knitr', 'extrafont', 'dplyr', 'scales', 'lubridate', 'gghighlight') 
# Checking for package installations on the system and installing if not found.
if (length(setdiff(packages, rownames(installed.packages()))) > 0) {
  install.packages(setdiff(packages, rownames(installed.packages())))  
}
# Packages to use
for(package in packages){
  library(package, character.only = TRUE)
}

Downloading and cleaning data


u <- "bikesharedailydata.csv"
data <- as.data.frame(read_csv(u, col_names = TRUE))
data <- data%>%mutate(date = as.Date(dteday, "%m/%d/%Y"))
data <- data%>%mutate(Month = format(date,"%B"), year = format(date, "%Y"), Week_day = weekdays(date))

data2<- data%>%dplyr::select(date, casual, registered)
data2<- gather(data2, rental_type, count, casual:registered, factor_key=TRUE)

data3<- data%>%dplyr::select(date, casual, registered, cnt)%>%mutate(p_casual = casual/cnt, p_registered = registered/cnt)%>%dplyr::select(date, p_casual, p_registered)
colnames(data3) <- c("date", "casual", "registered")
data3<- gather(data3, rental_type, count, casual:registered, factor_key=TRUE)

Bar Chart


data1 <- data%>%filter(year == "2012")%>%mutate(High = ifelse(Month == "August"|Month == "September", "Yes", "No"))
ggplot(data = data1, aes(x= factor(Month, levels = month.name) ,y=cnt, fill = High)) +
  geom_bar(stat="identity") +  theme_bw() + 
  scale_fill_manual(values = c( "Yes"="#00FA9A", "No"="#C0C0C0" ), guide = FALSE ) +
  theme(
        text=element_text(size=17,  family="Comic Sans MS"),
        panel.border = element_blank(),
        panel.grid.major = element_blank(),
        panel.grid.minor =  element_blank(),
        axis.line = element_line(color = "gray"),
        axis.ticks.x = element_blank(),
        axis.ticks.y = element_blank()) + labs(title = "Bicycle rental by month in 2012", x = "Months", y = "Count",
       subtitle = "August and September are the months with the largest number of bicycle rentals in 2012",
                                               caption =  "Jose Vilardy | Source = Fanaee-T, Hadi, and Gama, J. (2013)")  + scale_y_continuous(labels = comma) 

Line Charts


data1 <- data%>%filter(year == "2012") 
ggplot(data = data1, aes(x= date ,y=casual)) +
  geom_line(color="#00BED8", size = 1) +  geom_point(color="#00BED8", size = 2)  + theme_bw() + 
  theme(
        text=element_text(size=17,  family="Comic Sans MS"),
        panel.border = element_blank(),
        panel.grid.major = element_blank(),
        panel.grid.minor =  element_blank(),
        axis.line = element_line(color = "gray"),
        axis.ticks.x = element_blank(),
        axis.ticks.y = element_blank()) + labs(title = "Daily rental of casual users in 2012", x = "Date", y = "Rentals", subtitle = "There is a periodic pattern in the days and a seasonal variation which increases with the level of the series",
                                               caption =  "Jose Vilardy | Source = Fanaee-T, Hadi, and Gama, J. (2013)")  + scale_y_continuous(labels = comma)


data1 <- data2%>%filter(year == "2012") 
ggplot(data = data1, aes(x= date ,y=count, color = rental_type)) +
  geom_line( size = 1) +  geom_point( size = 2)  + theme_bw() + 
   scale_color_manual(values = c("#00BED8","#696969")) +
  theme(
        text=element_text(size=17,  family="Comic Sans MS"),
        panel.border = element_blank(),
        panel.grid.major = element_blank(),
        panel.grid.minor =  element_blank(),
        axis.line = element_line(color = "gray"),
        axis.ticks.x = element_blank(),
        axis.ticks.y = element_blank()) + labs(color = "Rental type",title = "Daily bicycle rental of casual and registered users in 2012", x = "Date", y = "Rentals", subtitle = "There is a periodic pattern in the days for casual and registered bicycle users",
                                               caption =  "Jose Vilardy | Source = Fanaee-T, Hadi, and Gama, J. (2013)")  + scale_y_continuous(labels = comma) +
  facet_wrap(~rental_type, ncol = 1)

Area Chart


data1 <- data%>%filter(year == "2012") 
ggplot(data = data1, aes(x= date ,y=temp)) +
  geom_area(color="#3CB371", fill = "#3CB371")  + theme_bw() + 
  theme(
        text=element_text(size=17,  family="Comic Sans MS"),
        panel.border = element_blank(),
        panel.grid.major = element_blank(),
        panel.grid.minor =  element_blank(),
        axis.line = element_line(color = "gray"),
        axis.ticks.x = element_blank(),
        axis.ticks.y = element_blank()) + labs(title = "Daily temperature in 2012", x = "Date", y = "Temperature", subtitle = "July registered the highest temperature over 75F",
                                               caption =  "Jose Vilardy | Source = Fanaee-T, Hadi, and Gama, J. (2013)")  

Staked Area Charts


data2 <- data2%>%mutate(year = format(date, "%Y"))%>%filter(year == "2012") 
data2$Rental_type <- factor(data2$rental_type, levels = c('registered', 'casual'))
ggplot(data = data2, aes(x= date ,y=count)) +
  geom_area(aes(fill = Rental_type), position = 'stack')  + theme_bw() + 
  theme(
        text=element_text(size=17,  family="Comic Sans MS"),
        panel.border = element_blank(),
        panel.grid.major = element_blank(),
        panel.grid.minor =  element_blank(),
        axis.line = element_line(color = "gray"),
        axis.ticks.x = element_blank(),
        axis.ticks.y = element_blank()) + labs(title = "Bicycle rental by rental type and date in 2012", x = "Date", y = "Rentals", fill = "Rental Type", subtitle = "There were more bicycle registered users than casual users every day in 2012",
                                               caption =  "Jose Vilardy | Source = Fanaee-T, Hadi, and Gama, J. (2013)" )  + scale_y_continuous(labels = comma) + scale_fill_manual(values=c("#A9A9A9", "#00BED8")) 


data3 <- data3%>%mutate(year = format(date, "%Y"))%>%filter(year == "2012") 
data3$Rental_type <- factor(data3$rental_type, levels = c('casual', 'registered'))
ggplot(data = data3, aes(x= date ,y=count)) +
  geom_area(aes(fill = Rental_type), position = 'stack')  + theme_bw() + 
  theme(
        text=element_text(size=17,  family="Comic Sans MS"),
        panel.border = element_blank(),
        panel.grid.major = element_blank(),
        panel.grid.minor =  element_blank(),
        axis.line = element_line(color = "gray"),
        axis.ticks.x = element_blank(),
        axis.ticks.y = element_blank()) + labs(title = "Bicycle rental by rental type and date in 2012", x = "Date", y = "Rentals", fill = "Rental Type", subtitle = "There were more bicycle registered users than casual users every day in 2012",
                                               caption =  "Jose Vilardy | Source = Fanaee-T, Hadi, and Gama, J. (2013)")  + scale_y_continuous(labels = scales::percent) + scale_fill_manual(values=c("#A9A9A9", "#00BED8")) 

Histogram

data1 <- data%>%filter(year == "2012")
ggplot(data = data1, aes(x=cnt)) +
  geom_histogram(binwidth = 300, fill="#00BED8", color = "white") +  theme_bw() + 
  theme(
        text=element_text(size=17,  family="Comic Sans MS"),
        panel.border = element_blank(),
        panel.grid.major = element_blank(),
        panel.grid.minor =  element_blank(),
        axis.line = element_line(color = "gray"),
        axis.ticks.x = element_blank(),
        axis.ticks.y = element_blank()) + labs(title = "Frequency distribution of registered bicycle rentals in 2012", x = "Rentals", y = "Frequency", subtitle = "The graph indicates that the distribution of the data is negatively skewed",
                                               caption =  "Jose Vilardy | Source = Fanaee-T, Hadi, and Gama, J. (2013)")  + scale_y_continuous(labels = comma) + scale_x_continuous(labels = comma)

Density Plot

data1 <- data%>%filter(year == "2012")
ggplot(data = data1, aes(x=registered)) +
  geom_density(fill="#00BED8", color = "#00BED8") +  theme_bw() + 
  theme(
        text=element_text(size=17,  family="Comic Sans MS"),
        panel.border = element_blank(),
        panel.grid.major = element_blank(),
        panel.grid.minor =  element_blank(),
        axis.line = element_line(color = "gray"),
        axis.ticks.x = element_blank(),
        axis.ticks.y = element_blank()) + labs(title = "Probability densities and frequency distribution of registered bicycle rentals in 2012",x = "Rentals", y = "Density", subtitle = "The graph indicates that the distribution of the data is negatively skewed",
                                               caption =  "Jose Vilardy | Source = Fanaee-T, Hadi, and Gama, J. (2013)") + scale_x_continuous(labels = comma)  + scale_y_continuous(labels = scales::number_format(accuracy = 0.00001, decimal.mark = ',')) + geom_vline(aes(xintercept=round(mean(data$cnt),2)),
            color="#696969", linetype="dashed", size=1)

Boxplot


data1 <- data%>%filter(year == "2012") 
ggplot(data = data1, aes(x= factor(Month, levels = month.name) ,y=cnt)) +
  geom_boxplot(color="#00BED8", size = 1) +  theme_bw() + 
  theme(
        text=element_text(size=17,  family="Comic Sans MS"),
        panel.border = element_blank(),
        panel.grid.major = element_blank(),
        panel.grid.minor =  element_blank(),
        axis.line = element_line(color = "gray"),
        axis.ticks.x = element_blank(),
        axis.ticks.y = element_blank()) + labs(title = "Boxplot of bicycle rentals by month in 2012", x = "Months", y = "Rentals", subtitle = "Rentals at the end of the year have more variability. October and April have days with very few rentals",
                                               caption =  "Jose Vilardy | Source = Fanaee-T, Hadi, and Gama, J. (2013)")  + scale_y_continuous(labels = comma)

NA
NA

ScatterPlots


data1 <- data%>%mutate(Temperature = ifelse(temp>0.8, "Temperature > 0.8", "Temperature <= 0.8")) 
ggplot(data = data1, aes(y= temp ,x=cnt, color = Temperature)) +
  geom_point(size = 4) +  theme_bw() + 
  scale_color_manual(values = c( "#C0C0C0", "#3CB371")) +  geom_smooth(method=lm) +
  theme(
        text=element_text(size=17,  family="Comic Sans MS"),
        panel.border = element_blank(),
        panel.grid.major = element_blank(),
        panel.grid.minor =  element_blank(),
        axis.line = element_line(color = "gray"),
        axis.ticks.x = element_blank(),
        axis.ticks.y = element_blank()) + labs(color = " ", title = "Relationship between temperature and bicycle rentals",x = "Rentals", y = "Temperature", 
subtitle = "There is a positive relationship between temperature and rides, however, when the temperature peaks above 80 degrees, there is a decrease",
                                               caption =  "Jose Vilardy | Source = Fanaee-T, Hadi, and Gama, J. (2013)") + scale_x_continuous(labels = comma)

NA
NA

ggplot(data = data, aes(y= windspeed ,x=cnt)) +
  geom_point(color="#588BAE", size = 4) +  theme_bw() + geom_smooth(method=lm) +
  theme(
        text=element_text(size=17,  family="Comic Sans MS"),
        panel.border = element_blank(),
        panel.grid.major = element_blank(),
        panel.grid.minor =  element_blank(),
        axis.line = element_line(color = "gray"),
        axis.ticks.x = element_blank(),
        axis.ticks.y = element_blank()) + labs(title = "Relationship between humidity and bicycle rentals",x = "Rentals", y = "Humidity", 
subtitle = "There is a negative relationship between humidity and bicycle rides",
                                               caption =  "Jose Vilardy | Source = Fanaee-T, Hadi, and Gama, J. (2013)") + scale_x_continuous(labels = comma)

NA
NA
LS0tDQp0aXRsZTogIkRhdGEgVmlzdWFsaXphdGlvbiAtIExlc3NvbiA1OiBWaXN1YWxpemluZyBkYXRhIGluIFIiDQphdXRob3I6ICJKb3NlIEJlbHRyYW4gVmlsYXJkeSINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNCiMgRG93bmxvYWRpbmcgcGFja2FnZXMNCg0KYGBge3IsIGVjaG89IFRSVUUsICB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlID0gRkFMU0UsIHJlc3VsdHM9ICJoaWRlIn0NCnBhY2thZ2VzIDwtIGMoJ2RwbHlyJywgJ2dncGxvdDInLCAncmVhZHhsJywgJ3JlYWRyJywgJ3RpZHl2ZXJzZScsICdnZ3RoZW1lcycsICdrbml0cicsICdleHRyYWZvbnQnLCAnZHBseXInLCAnc2NhbGVzJywgJ2x1YnJpZGF0ZScsICdnZ2hpZ2hsaWdodCcpIA0KIyBDaGVja2luZyBmb3IgcGFja2FnZSBpbnN0YWxsYXRpb25zIG9uIHRoZSBzeXN0ZW0gYW5kIGluc3RhbGxpbmcgaWYgbm90IGZvdW5kLg0KaWYgKGxlbmd0aChzZXRkaWZmKHBhY2thZ2VzLCByb3duYW1lcyhpbnN0YWxsZWQucGFja2FnZXMoKSkpKSA+IDApIHsNCiAgaW5zdGFsbC5wYWNrYWdlcyhzZXRkaWZmKHBhY2thZ2VzLCByb3duYW1lcyhpbnN0YWxsZWQucGFja2FnZXMoKSkpKSAgDQp9DQojIFBhY2thZ2VzIHRvIHVzZQ0KZm9yKHBhY2thZ2UgaW4gcGFja2FnZXMpew0KICBsaWJyYXJ5KHBhY2thZ2UsIGNoYXJhY3Rlci5vbmx5ID0gVFJVRSkNCn0NCg0KYGBgDQoNCg0KIyBEb3dubG9hZGluZyBhbmQgY2xlYW5pbmcgZGF0YQ0KDQpgYGB7ciwgZWNobz0gVFJVRSwgIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSwgcmVzdWx0cz0gImhpZGUifQ0KDQp1IDwtICJiaWtlc2hhcmVkYWlseWRhdGEuY3N2Ig0KZGF0YSA8LSBhcy5kYXRhLmZyYW1lKHJlYWRfY3N2KHUsIGNvbF9uYW1lcyA9IFRSVUUpKQ0KZGF0YSA8LSBkYXRhJT4lbXV0YXRlKGRhdGUgPSBhcy5EYXRlKGR0ZWRheSwgIiVtLyVkLyVZIikpDQpkYXRhIDwtIGRhdGElPiVtdXRhdGUoTW9udGggPSBmb3JtYXQoZGF0ZSwiJUIiKSwgeWVhciA9IGZvcm1hdChkYXRlLCAiJVkiKSwgV2Vla19kYXkgPSB3ZWVrZGF5cyhkYXRlKSkNCg0KZGF0YTI8LSBkYXRhJT4lZHBseXI6OnNlbGVjdChkYXRlLCBjYXN1YWwsIHJlZ2lzdGVyZWQpDQpkYXRhMjwtIGdhdGhlcihkYXRhMiwgcmVudGFsX3R5cGUsIGNvdW50LCBjYXN1YWw6cmVnaXN0ZXJlZCwgZmFjdG9yX2tleT1UUlVFKQ0KDQpkYXRhMzwtIGRhdGElPiVkcGx5cjo6c2VsZWN0KGRhdGUsIGNhc3VhbCwgcmVnaXN0ZXJlZCwgY250KSU+JW11dGF0ZShwX2Nhc3VhbCA9IGNhc3VhbC9jbnQsIHBfcmVnaXN0ZXJlZCA9IHJlZ2lzdGVyZWQvY250KSU+JWRwbHlyOjpzZWxlY3QoZGF0ZSwgcF9jYXN1YWwsIHBfcmVnaXN0ZXJlZCkNCmNvbG5hbWVzKGRhdGEzKSA8LSBjKCJkYXRlIiwgImNhc3VhbCIsICJyZWdpc3RlcmVkIikNCmRhdGEzPC0gZ2F0aGVyKGRhdGEzLCByZW50YWxfdHlwZSwgY291bnQsIGNhc3VhbDpyZWdpc3RlcmVkLCBmYWN0b3Jfa2V5PVRSVUUpDQoNCmBgYA0KDQoNCiMgQmFyIENoYXJ0DQoNCmBgYHtyLCBlY2hvPSBUUlVFLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlID0gRkFMU0UsIGZpZy53aWR0aCA9IDE2LCBmaWcuaGVpZ2h0ID0gMTB9DQoNCmRhdGExIDwtIGRhdGElPiVmaWx0ZXIoeWVhciA9PSAiMjAxMiIpJT4lbXV0YXRlKEhpZ2ggPSBpZmVsc2UoTW9udGggPT0gIkF1Z3VzdCJ8TW9udGggPT0gIlNlcHRlbWJlciIsICJZZXMiLCAiTm8iKSkNCmdncGxvdChkYXRhID0gZGF0YTEsIGFlcyh4PSBmYWN0b3IoTW9udGgsIGxldmVscyA9IG1vbnRoLm5hbWUpICx5PWNudCwgZmlsbCA9IEhpZ2gpKSArDQogIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5IikgKyAgdGhlbWVfYncoKSArIA0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCAiWWVzIj0iIzAwRkE5QSIsICJObyI9IiNDMEMwQzAiICksIGd1aWRlID0gRkFMU0UgKSArDQogIHRoZW1lKA0KICAgICAgICB0ZXh0PWVsZW1lbnRfdGV4dChzaXplPTE3LCAgZmFtaWx5PSJDb21pYyBTYW5zIE1TIiksDQogICAgICAgIHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgcGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgcGFuZWwuZ3JpZC5taW5vciA9ICBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJncmF5IiksDQogICAgICAgIGF4aXMudGlja3MueCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50aWNrcy55ID0gZWxlbWVudF9ibGFuaygpKSArIGxhYnModGl0bGUgPSAiQmljeWNsZSByZW50YWwgYnkgbW9udGggaW4gMjAxMiIsIHggPSAiTW9udGhzIiwgeSA9ICJDb3VudCIsDQogICAgICAgc3VidGl0bGUgPSAiQXVndXN0IGFuZCBTZXB0ZW1iZXIgYXJlIHRoZSBtb250aHMgd2l0aCB0aGUgbGFyZ2VzdCBudW1iZXIgb2YgYmljeWNsZSByZW50YWxzIGluIDIwMTIiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXB0aW9uID0gICJKb3NlIFZpbGFyZHkgfCBTb3VyY2UgPSBGYW5hZWUtVCwgSGFkaSwgYW5kIEdhbWEsIEouICgyMDEzKSIpICArIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBjb21tYSkgDQpgYGANCg0KDQojIExpbmUgQ2hhcnRzDQoNCmBgYHtyLCBlY2hvPSBUUlVFLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlID0gRkFMU0UsIGZpZy53aWR0aCA9IDE2LCBmaWcuaGVpZ2h0ID0gMTB9DQoNCmRhdGExIDwtIGRhdGElPiVmaWx0ZXIoeWVhciA9PSAiMjAxMiIpIA0KZ2dwbG90KGRhdGEgPSBkYXRhMSwgYWVzKHg9IGRhdGUgLHk9Y2FzdWFsKSkgKw0KICBnZW9tX2xpbmUoY29sb3I9IiMwMEJFRDgiLCBzaXplID0gMSkgKyAgZ2VvbV9wb2ludChjb2xvcj0iIzAwQkVEOCIsIHNpemUgPSAyKSAgKyB0aGVtZV9idygpICsgDQogIHRoZW1lKA0KICAgICAgICB0ZXh0PWVsZW1lbnRfdGV4dChzaXplPTE3LCAgZmFtaWx5PSJDb21pYyBTYW5zIE1TIiksDQogICAgICAgIHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgcGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgcGFuZWwuZ3JpZC5taW5vciA9ICBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJncmF5IiksDQogICAgICAgIGF4aXMudGlja3MueCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50aWNrcy55ID0gZWxlbWVudF9ibGFuaygpKSArIGxhYnModGl0bGUgPSAiRGFpbHkgcmVudGFsIG9mIGNhc3VhbCB1c2VycyBpbiAyMDEyIiwgeCA9ICJEYXRlIiwgeSA9ICJSZW50YWxzIiwgc3VidGl0bGUgPSAiVGhlcmUgaXMgYSBwZXJpb2RpYyBwYXR0ZXJuIGluIHRoZSBkYXlzIGFuZCBhIHNlYXNvbmFsIHZhcmlhdGlvbiB3aGljaCBpbmNyZWFzZXMgd2l0aCB0aGUgbGV2ZWwgb2YgdGhlIHNlcmllcyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcHRpb24gPSAgIkpvc2UgVmlsYXJkeSB8IFNvdXJjZSA9IEZhbmFlZS1ULCBIYWRpLCBhbmQgR2FtYSwgSi4gKDIwMTMpIikgICsgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IGNvbW1hKQ0KYGBgDQoNCmBgYHtyLCBlY2hvPSBUUlVFLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlID0gRkFMU0UsIGZpZy53aWR0aCA9IDE2LCBmaWcuaGVpZ2h0ID0gMTB9DQoNCmRhdGExIDwtIGRhdGEyJT4lZmlsdGVyKHllYXIgPT0gIjIwMTIiKSANCmdncGxvdChkYXRhID0gZGF0YTEsIGFlcyh4PSBkYXRlICx5PWNvdW50LCBjb2xvciA9IHJlbnRhbF90eXBlKSkgKw0KICBnZW9tX2xpbmUoIHNpemUgPSAxKSArICBnZW9tX3BvaW50KCBzaXplID0gMikgICsgdGhlbWVfYncoKSArIA0KICAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoIiMwMEJFRDgiLCIjNjk2OTY5IikpICsNCiAgdGhlbWUoDQogICAgICAgIHRleHQ9ZWxlbWVudF90ZXh0KHNpemU9MTcsICBmYW1pbHk9IkNvbWljIFNhbnMgTVMiKSwNCiAgICAgICAgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBwYW5lbC5ncmlkLm1pbm9yID0gIGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKGNvbG9yID0gImdyYXkiKSwNCiAgICAgICAgYXhpcy50aWNrcy54ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRpY2tzLnkgPSBlbGVtZW50X2JsYW5rKCkpICsgbGFicyhjb2xvciA9ICJSZW50YWwgdHlwZSIsdGl0bGUgPSAiRGFpbHkgYmljeWNsZSByZW50YWwgb2YgY2FzdWFsIGFuZCByZWdpc3RlcmVkIHVzZXJzIGluIDIwMTIiLCB4ID0gIkRhdGUiLCB5ID0gIlJlbnRhbHMiLCBzdWJ0aXRsZSA9ICJUaGVyZSBpcyBhIHBlcmlvZGljIHBhdHRlcm4gaW4gdGhlIGRheXMgZm9yIGNhc3VhbCBhbmQgcmVnaXN0ZXJlZCBiaWN5Y2xlIHVzZXJzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwdGlvbiA9ICAiSm9zZSBWaWxhcmR5IHwgU291cmNlID0gRmFuYWVlLVQsIEhhZGksIGFuZCBHYW1hLCBKLiAoMjAxMykiKSAgKyBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gY29tbWEpICsNCiAgZmFjZXRfd3JhcCh+cmVudGFsX3R5cGUsIG5jb2wgPSAxKQ0KDQpgYGANCg0KDQoNCiMgQXJlYSBDaGFydA0KDQpgYGB7ciwgZWNobz0gVFJVRSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZSA9IEZBTFNFLCBmaWcud2lkdGggPSAxNiwgZmlnLmhlaWdodCA9IDEwfQ0KDQpkYXRhMSA8LSBkYXRhJT4lZmlsdGVyKHllYXIgPT0gIjIwMTIiKSANCmdncGxvdChkYXRhID0gZGF0YTEsIGFlcyh4PSBkYXRlICx5PXRlbXApKSArDQogIGdlb21fYXJlYShjb2xvcj0iIzNDQjM3MSIsIGZpbGwgPSAiIzNDQjM3MSIpICArIHRoZW1lX2J3KCkgKyANCiAgdGhlbWUoDQogICAgICAgIHRleHQ9ZWxlbWVudF90ZXh0KHNpemU9MTcsICBmYW1pbHk9IkNvbWljIFNhbnMgTVMiKSwNCiAgICAgICAgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBwYW5lbC5ncmlkLm1pbm9yID0gIGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKGNvbG9yID0gImdyYXkiKSwNCiAgICAgICAgYXhpcy50aWNrcy54ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRpY2tzLnkgPSBlbGVtZW50X2JsYW5rKCkpICsgbGFicyh0aXRsZSA9ICJEYWlseSB0ZW1wZXJhdHVyZSBpbiAyMDEyIiwgeCA9ICJEYXRlIiwgeSA9ICJUZW1wZXJhdHVyZSIsIHN1YnRpdGxlID0gIkp1bHkgcmVnaXN0ZXJlZCB0aGUgaGlnaGVzdCB0ZW1wZXJhdHVyZSBvdmVyIDc1RiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcHRpb24gPSAgIkpvc2UgVmlsYXJkeSB8IFNvdXJjZSA9IEZhbmFlZS1ULCBIYWRpLCBhbmQgR2FtYSwgSi4gKDIwMTMpIikgIA0KYGBgDQoNCg0KIyBTdGFrZWQgQXJlYSBDaGFydHMNCg0KYGBge3IsIGVjaG89IFRSVUUsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSwgZmlnLndpZHRoID0gMTYsIGZpZy5oZWlnaHQgPSAxMH0NCg0KZGF0YTIgPC0gZGF0YTIlPiVtdXRhdGUoeWVhciA9IGZvcm1hdChkYXRlLCAiJVkiKSklPiVmaWx0ZXIoeWVhciA9PSAiMjAxMiIpIA0KZGF0YTIkUmVudGFsX3R5cGUgPC0gZmFjdG9yKGRhdGEyJHJlbnRhbF90eXBlLCBsZXZlbHMgPSBjKCdyZWdpc3RlcmVkJywgJ2Nhc3VhbCcpKQ0KZ2dwbG90KGRhdGEgPSBkYXRhMiwgYWVzKHg9IGRhdGUgLHk9Y291bnQpKSArDQogIGdlb21fYXJlYShhZXMoZmlsbCA9IFJlbnRhbF90eXBlKSwgcG9zaXRpb24gPSAnc3RhY2snKSAgKyB0aGVtZV9idygpICsgDQogIHRoZW1lKA0KICAgICAgICB0ZXh0PWVsZW1lbnRfdGV4dChzaXplPTE3LCAgZmFtaWx5PSJDb21pYyBTYW5zIE1TIiksDQogICAgICAgIHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgcGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgcGFuZWwuZ3JpZC5taW5vciA9ICBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJncmF5IiksDQogICAgICAgIGF4aXMudGlja3MueCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50aWNrcy55ID0gZWxlbWVudF9ibGFuaygpKSArIGxhYnModGl0bGUgPSAiQmljeWNsZSByZW50YWwgYnkgcmVudGFsIHR5cGUgYW5kIGRhdGUgaW4gMjAxMiIsIHggPSAiRGF0ZSIsIHkgPSAiUmVudGFscyIsIGZpbGwgPSAiUmVudGFsIFR5cGUiLCBzdWJ0aXRsZSA9ICJUaGVyZSB3ZXJlIG1vcmUgYmljeWNsZSByZWdpc3RlcmVkIHVzZXJzIHRoYW4gY2FzdWFsIHVzZXJzIGV2ZXJ5IGRheSBpbiAyMDEyIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwdGlvbiA9ICAiSm9zZSBWaWxhcmR5IHwgU291cmNlID0gRmFuYWVlLVQsIEhhZGksIGFuZCBHYW1hLCBKLiAoMjAxMykiICkgICsgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IGNvbW1hKSArIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1jKCIjQTlBOUE5IiwgIiMwMEJFRDgiKSkgDQpgYGANCg0KDQpgYGB7ciwgZWNobz0gVFJVRSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZSA9IEZBTFNFLCBmaWcud2lkdGggPSAxNiwgZmlnLmhlaWdodCA9IDEwfQ0KDQpkYXRhMyA8LSBkYXRhMyU+JW11dGF0ZSh5ZWFyID0gZm9ybWF0KGRhdGUsICIlWSIpKSU+JWZpbHRlcih5ZWFyID09ICIyMDEyIikgDQpkYXRhMyRSZW50YWxfdHlwZSA8LSBmYWN0b3IoZGF0YTMkcmVudGFsX3R5cGUsIGxldmVscyA9IGMoJ2Nhc3VhbCcsICdyZWdpc3RlcmVkJykpDQpnZ3Bsb3QoZGF0YSA9IGRhdGEzLCBhZXMoeD0gZGF0ZSAseT1jb3VudCkpICsNCiAgZ2VvbV9hcmVhKGFlcyhmaWxsID0gUmVudGFsX3R5cGUpLCBwb3NpdGlvbiA9ICdzdGFjaycpICArIHRoZW1lX2J3KCkgKyANCiAgdGhlbWUoDQogICAgICAgIHRleHQ9ZWxlbWVudF90ZXh0KHNpemU9MTcsICBmYW1pbHk9IkNvbWljIFNhbnMgTVMiKSwNCiAgICAgICAgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBwYW5lbC5ncmlkLm1pbm9yID0gIGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKGNvbG9yID0gImdyYXkiKSwNCiAgICAgICAgYXhpcy50aWNrcy54ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRpY2tzLnkgPSBlbGVtZW50X2JsYW5rKCkpICsgbGFicyh0aXRsZSA9ICJCaWN5Y2xlIHJlbnRhbCBieSByZW50YWwgdHlwZSBhbmQgZGF0ZSBpbiAyMDEyIiwgeCA9ICJEYXRlIiwgeSA9ICJSZW50YWxzIiwgZmlsbCA9ICJSZW50YWwgVHlwZSIsIHN1YnRpdGxlID0gIlRoZXJlIHdlcmUgbW9yZSBiaWN5Y2xlIHJlZ2lzdGVyZWQgdXNlcnMgdGhhbiBjYXN1YWwgdXNlcnMgZXZlcnkgZGF5IGluIDIwMTIiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXB0aW9uID0gICJKb3NlIFZpbGFyZHkgfCBTb3VyY2UgPSBGYW5hZWUtVCwgSGFkaSwgYW5kIEdhbWEsIEouICgyMDEzKSIpICArIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnQpICsgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoIiNBOUE5QTkiLCAiIzAwQkVEOCIpKSANCmBgYA0KDQoNCg0KIyBIaXN0b2dyYW0NCg0KYGBge3IsIGVjaG89IFRSVUUsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSwgZmlnLndpZHRoID0gMTYsIGZpZy5oZWlnaHQgPSAxMH0NCmRhdGExIDwtIGRhdGElPiVmaWx0ZXIoeWVhciA9PSAiMjAxMiIpDQpnZ3Bsb3QoZGF0YSA9IGRhdGExLCBhZXMoeD1jbnQpKSArDQogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gMzAwLCBmaWxsPSIjMDBCRUQ4IiwgY29sb3IgPSAid2hpdGUiKSArICB0aGVtZV9idygpICsgDQogIHRoZW1lKA0KICAgICAgICB0ZXh0PWVsZW1lbnRfdGV4dChzaXplPTE3LCAgZmFtaWx5PSJDb21pYyBTYW5zIE1TIiksDQogICAgICAgIHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgcGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgcGFuZWwuZ3JpZC5taW5vciA9ICBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJncmF5IiksDQogICAgICAgIGF4aXMudGlja3MueCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50aWNrcy55ID0gZWxlbWVudF9ibGFuaygpKSArIGxhYnModGl0bGUgPSAiRnJlcXVlbmN5IGRpc3RyaWJ1dGlvbiBvZiByZWdpc3RlcmVkIGJpY3ljbGUgcmVudGFscyBpbiAyMDEyIiwgeCA9ICJSZW50YWxzIiwgeSA9ICJGcmVxdWVuY3kiLCBzdWJ0aXRsZSA9ICJUaGUgZ3JhcGggaW5kaWNhdGVzIHRoYXQgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgZGF0YSBpcyBuZWdhdGl2ZWx5IHNrZXdlZCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcHRpb24gPSAgIkpvc2UgVmlsYXJkeSB8IFNvdXJjZSA9IEZhbmFlZS1ULCBIYWRpLCBhbmQgR2FtYSwgSi4gKDIwMTMpIikgICsgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IGNvbW1hKSArIHNjYWxlX3hfY29udGludW91cyhsYWJlbHMgPSBjb21tYSkNCmBgYA0KDQojIERlbnNpdHkgUGxvdA0KDQpgYGB7ciwgZWNobz0gVFJVRSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZSA9IEZBTFNFLCBmaWcud2lkdGggPSAxNiwgZmlnLmhlaWdodCA9IDEwfQ0KZGF0YTEgPC0gZGF0YSU+JWZpbHRlcih5ZWFyID09ICIyMDEyIikNCmdncGxvdChkYXRhID0gZGF0YTEsIGFlcyh4PXJlZ2lzdGVyZWQpKSArDQogIGdlb21fZGVuc2l0eShmaWxsPSIjMDBCRUQ4IiwgY29sb3IgPSAiIzAwQkVEOCIpICsgIHRoZW1lX2J3KCkgKyANCiAgdGhlbWUoDQogICAgICAgIHRleHQ9ZWxlbWVudF90ZXh0KHNpemU9MTcsICBmYW1pbHk9IkNvbWljIFNhbnMgTVMiKSwNCiAgICAgICAgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBwYW5lbC5ncmlkLm1pbm9yID0gIGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKGNvbG9yID0gImdyYXkiKSwNCiAgICAgICAgYXhpcy50aWNrcy54ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRpY2tzLnkgPSBlbGVtZW50X2JsYW5rKCkpICsgbGFicyh0aXRsZSA9ICJQcm9iYWJpbGl0eSBkZW5zaXRpZXMgYW5kIGZyZXF1ZW5jeSBkaXN0cmlidXRpb24gb2YgcmVnaXN0ZXJlZCBiaWN5Y2xlIHJlbnRhbHMgaW4gMjAxMiIseCA9ICJSZW50YWxzIiwgeSA9ICJEZW5zaXR5Iiwgc3VidGl0bGUgPSAiVGhlIGdyYXBoIGluZGljYXRlcyB0aGF0IHRoZSBkaXN0cmlidXRpb24gb2YgdGhlIGRhdGEgaXMgbmVnYXRpdmVseSBza2V3ZWQiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXB0aW9uID0gICJKb3NlIFZpbGFyZHkgfCBTb3VyY2UgPSBGYW5hZWUtVCwgSGFkaSwgYW5kIEdhbWEsIEouICgyMDEzKSIpICsgc2NhbGVfeF9jb250aW51b3VzKGxhYmVscyA9IGNvbW1hKSAgKyBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpudW1iZXJfZm9ybWF0KGFjY3VyYWN5ID0gMC4wMDAwMSwgZGVjaW1hbC5tYXJrID0gJywnKSkgKyBnZW9tX3ZsaW5lKGFlcyh4aW50ZXJjZXB0PXJvdW5kKG1lYW4oZGF0YSRjbnQpLDIpKSwNCiAgICAgICAgICAgIGNvbG9yPSIjNjk2OTY5IiwgbGluZXR5cGU9ImRhc2hlZCIsIHNpemU9MSkNCmBgYA0KDQoNCiMgQm94cGxvdA0KDQpgYGB7ciwgY2hvPSBUUlVFLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlID0gRkFMU0UsIGZpZy53aWR0aCA9IDE2LCBmaWcuaGVpZ2h0ID0gMTB9DQoNCmRhdGExIDwtIGRhdGElPiVmaWx0ZXIoeWVhciA9PSAiMjAxMiIpIA0KZ2dwbG90KGRhdGEgPSBkYXRhMSwgYWVzKHg9IGZhY3RvcihNb250aCwgbGV2ZWxzID0gbW9udGgubmFtZSkgLHk9Y250KSkgKw0KICBnZW9tX2JveHBsb3QoY29sb3I9IiMwMEJFRDgiLCBzaXplID0gMSkgKyAgdGhlbWVfYncoKSArIA0KICB0aGVtZSgNCiAgICAgICAgdGV4dD1lbGVtZW50X3RleHQoc2l6ZT0xNywgIGZhbWlseT0iQ29taWMgU2FucyBNUyIpLA0KICAgICAgICBwYW5lbC5ib3JkZXIgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIHBhbmVsLmdyaWQubWlub3IgPSAgZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiZ3JheSIpLA0KICAgICAgICBheGlzLnRpY2tzLnggPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGlja3MueSA9IGVsZW1lbnRfYmxhbmsoKSkgKyBsYWJzKHRpdGxlID0gIkJveHBsb3Qgb2YgYmljeWNsZSByZW50YWxzIGJ5IG1vbnRoIGluIDIwMTIiLCB4ID0gIk1vbnRocyIsIHkgPSAiUmVudGFscyIsIHN1YnRpdGxlID0gIlJlbnRhbHMgYXQgdGhlIGVuZCBvZiB0aGUgeWVhciBoYXZlIG1vcmUgdmFyaWFiaWxpdHkuIE9jdG9iZXIgYW5kIEFwcmlsIGhhdmUgZGF5cyB3aXRoIHZlcnkgZmV3IHJlbnRhbHMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXB0aW9uID0gICJKb3NlIFZpbGFyZHkgfCBTb3VyY2UgPSBGYW5hZWUtVCwgSGFkaSwgYW5kIEdhbWEsIEouICgyMDEzKSIpICArIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBjb21tYSkNCg0KDQpgYGANCg0KDQojIFNjYXR0ZXJQbG90cw0KDQpgYGB7ciwgY2hvPSBUUlVFLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlID0gRkFMU0UsIGZpZy53aWR0aCA9IDE2LCBmaWcuaGVpZ2h0ID0gMTB9DQoNCmRhdGExIDwtIGRhdGElPiVtdXRhdGUoVGVtcGVyYXR1cmUgPSBpZmVsc2UodGVtcD4wLjgsICJUZW1wZXJhdHVyZSA+IDAuOCIsICJUZW1wZXJhdHVyZSA8PSAwLjgiKSkgDQpnZ3Bsb3QoZGF0YSA9IGRhdGExLCBhZXMoeT0gdGVtcCAseD1jbnQsIGNvbG9yID0gVGVtcGVyYXR1cmUpKSArDQogIGdlb21fcG9pbnQoc2l6ZSA9IDQpICsgIHRoZW1lX2J3KCkgKyANCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoICIjQzBDMEMwIiwgIiMzQ0IzNzEiKSkgKyAgZ2VvbV9zbW9vdGgobWV0aG9kPWxtKSArDQogIHRoZW1lKA0KICAgICAgICB0ZXh0PWVsZW1lbnRfdGV4dChzaXplPTE3LCAgZmFtaWx5PSJDb21pYyBTYW5zIE1TIiksDQogICAgICAgIHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgcGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgcGFuZWwuZ3JpZC5taW5vciA9ICBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJncmF5IiksDQogICAgICAgIGF4aXMudGlja3MueCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50aWNrcy55ID0gZWxlbWVudF9ibGFuaygpKSArIGxhYnMoY29sb3IgPSAiICIsIHRpdGxlID0gIlJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRlbXBlcmF0dXJlIGFuZCBiaWN5Y2xlIHJlbnRhbHMiLHggPSAiUmVudGFscyIsIHkgPSAiVGVtcGVyYXR1cmUiLCANCnN1YnRpdGxlID0gIlRoZXJlIGlzIGEgcG9zaXRpdmUgcmVsYXRpb25zaGlwIGJldHdlZW4gdGVtcGVyYXR1cmUgYW5kIHJpZGVzLCBob3dldmVyLCB3aGVuIHRoZSB0ZW1wZXJhdHVyZSBwZWFrcyBhYm92ZSA4MCBkZWdyZWVzLCB0aGVyZSBpcyBhIGRlY3JlYXNlIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwdGlvbiA9ICAiSm9zZSBWaWxhcmR5IHwgU291cmNlID0gRmFuYWVlLVQsIEhhZGksIGFuZCBHYW1hLCBKLiAoMjAxMykiKSArIHNjYWxlX3hfY29udGludW91cyhsYWJlbHMgPSBjb21tYSkNCg0KDQpgYGANCg0KYGBge3IsIGNobz0gVFJVRSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZSA9IEZBTFNFLCBmaWcud2lkdGggPSAxNiwgZmlnLmhlaWdodCA9IDEwfQ0KDQpnZ3Bsb3QoZGF0YSA9IGRhdGEsIGFlcyh5PSB3aW5kc3BlZWQgLHg9Y250KSkgKw0KICBnZW9tX3BvaW50KGNvbG9yPSIjNTg4QkFFIiwgc2l6ZSA9IDQpICsgIHRoZW1lX2J3KCkgKyBnZW9tX3Ntb290aChtZXRob2Q9bG0pICsNCiAgdGhlbWUoDQogICAgICAgIHRleHQ9ZWxlbWVudF90ZXh0KHNpemU9MTcsICBmYW1pbHk9IkNvbWljIFNhbnMgTVMiKSwNCiAgICAgICAgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBwYW5lbC5ncmlkLm1pbm9yID0gIGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKGNvbG9yID0gImdyYXkiKSwNCiAgICAgICAgYXhpcy50aWNrcy54ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRpY2tzLnkgPSBlbGVtZW50X2JsYW5rKCkpICsgbGFicyh0aXRsZSA9ICJSZWxhdGlvbnNoaXAgYmV0d2VlbiBodW1pZGl0eSBhbmQgYmljeWNsZSByZW50YWxzIix4ID0gIlJlbnRhbHMiLCB5ID0gIkh1bWlkaXR5IiwgDQpzdWJ0aXRsZSA9ICJUaGVyZSBpcyBhIG5lZ2F0aXZlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGh1bWlkaXR5IGFuZCBiaWN5Y2xlIHJpZGVzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwdGlvbiA9ICAiSm9zZSBWaWxhcmR5IHwgU291cmNlID0gRmFuYWVlLVQsIEhhZGksIGFuZCBHYW1hLCBKLiAoMjAxMykiKSArIHNjYWxlX3hfY29udGludW91cyhsYWJlbHMgPSBjb21tYSkNCg0KDQpgYGANCg==