library(tidyverse)
library(plyr)
library(kableExtra)
library(plotly)
library(corrplot)
library(PerformanceAnalytics)
## Warning: package 'xts' was built under R version 4.1.2
library(stats)

Problem Statement and background

For my final project, I will study the number of cases and deaths of covid-19 in various states in the United States, and visualize the CDC Moderna covid-19-vaccine-distribution-by-state, CDC Pfizer covid-19-vaccine-distribution-by-state and other data. Next, I will study the relationship between vaccination in the United States and the number of covid-19 cases and deaths, In order to find out whether vaccination can significantly reduce the number of covid-19 cases and deaths, And whether there are differences among different vaccine manufacturers

First I would like to intuitively show the number of covid-19 cases and deaths in U.S States. Then, I would show the vaccination situation in U.S States. Most of the data can be accurate to the daily data of U.S States. I would also show a diagram of the relationship between covid-19 cases, deaths and vaccination.

I will decide what data to use and not to use when starting the project. As the project continues, more data may be added, such as the population of each state in the United States, so as to facilitate the study of the proportion of cases, mortality and vaccination rate of covid-19 in the United States, since this is what I interested in study during this period of time.

The data will come from various sources:

  1. https://covid19-lake.s3.us-east-2.amazonaws.com/cdc-moderna-vaccine-distribution/csv/cdc-moderna-covid-19-vaccine-distribution-by-state.csv

  2. https://covid19-lake.s3.us-east-2.amazonaws.com/cdc-pfizer-vaccine-distribution/csv/cdc-pfizer-covid-19-vaccine-distribution-by-state.csv

  3. https://covid19-lake.s3.us-east-2.amazonaws.com/rearc-covid-19-nyt-data-in-usa/csv/us-states/us-states.csv

Firstly, we analyze the change trend of the number of confirmed cases. It can be seen that the number of confirmed cases in the United States shows an exponential upward trend,From February to July 2021, the Pandemic was relatively mild, and after July 2021, it showed a rapid upward trend.

Work process

us_states<-read.csv("us-states.csv",header = TRUE)

View(us_states)

library(ggplot2)
library(dplyr)
cases1<-us_states%>%
  group_by(date) %>% 
  summarise(casessum = sum(cases, 
                        na.rm=T) 
            
            )
cases1$date<-as.Date(cases1$date)
options(scipen = 100)
ggplot(data = cases1,aes(x=date,y=casessum))+
         geom_point(color="blue",size=1)+
  labs(title = "date vs  cases",x="date",y="cases")

In terms of the number of deaths in the United States, the growth curve of the number of deaths is similar to the trend of the number of confirmed cases, indicating that the more confirmed cases, the more deaths.

options(scipen = 100)
deaths1<-us_states%>%
  group_by(date) %>% 
  summarise(deathssum = sum(deaths, 
                        na.rm=T) )

deaths1$date<-as.Date(deaths1$date)

ggplot(data = deaths1,aes(x=date,y=deathssum))+
         geom_point(color="red",size=1)+
  labs(title = "date vs  deaths",x="date",y="deaths")

Mortality over time

In terms of mortality in the United States, it once reached 8% in February 2020, but with the improvement of treatment methods in the United States, the overall mortality showed a downward trend.

casedeath<-us_states%>%
  group_by(date) %>% 
  summarise(
    casesum=sum(cases, 
                        na.rm=T) ,
    deathsum = sum(deaths, 
                        na.rm=T) )




casedeath$date<-as.Date(casedeath$date)

casedeath$mortality<-casedeath$deathsum/casedeath$casesum



ggplot(data =casedeath,aes(x=date,y=mortality) )+
  geom_line(size=1)+labs(title = "Mortality over time ",x="date",y="mortality")

From the combination of confirmed cases and deaths in the United States, the death toll is still at a relatively low level relative to the confirmed number.

options(scipen = 100)

ggplot(data=casedeath)+geom_line(aes(x=date,y=casesum),color="green")+
  geom_point(aes(x=date,y=casesum),color="green",size=0.8)+
  geom_line(aes(x=date,y=deathsum),color="blue")+
  geom_point(aes(x=date,y=deathsum),color="blue",size=0.8)+
  labs(title = "date  vs  cases vs  deaths",x="Date")

From the number of confirmed cases in the states of the United States, California, Texas and Florida are the states with the largest number of confirmed cases, of which California and Texas are more than 4 million

maxdate<-max(us_states$date)

state1<-us_states%>%
  group_by(state) %>% 
  filter(date==maxdate)%>%
  summarise(
            casesum=sum(cases, 
                        na.rm=T) ,
    deathsum = sum(deaths, 
                        na.rm=T)
    
            )
state1$mortality<-state1$deathsum/state1$casesum


ggplot(data=state1,aes(x=reorder(state,casesum),y=casesum))+
  geom_bar(stat = 'identity',fill='red') + coord_flip()

California and Texas have caused the most deaths, with more than 60000 people

ggplot(data=state1,aes(x=reorder(state,deathsum),y=deathsum))+
   geom_bar(stat = 'identity',fill='blue')+ coord_flip()

New York is an area where the Pandemic occurred earlier, and the mortality caused by the Pandemic is relatively high

ggplot(data=state1,aes(x=reorder(state,mortality),y=mortality))+
   geom_bar(stat = 'identity',fill='green')+ coord_flip()

state1
## # A tibble: 56 x 4
##    state                casesum deathsum mortality
##    <chr>                  <int>    <int>     <dbl>
##  1 Alabama               806560    14756   0.0183 
##  2 Alaska                120496      574   0.00476
##  3 American Samoa             1        0   0      
##  4 Arizona              1114061    20319   0.0182 
##  5 Arkansas              501518     7810   0.0156 
##  6 California           4789773    70132   0.0146 
##  7 Colorado              692082     7913   0.0114 
##  8 Connecticut           394008     8667   0.0220 
##  9 Delaware              136682     1997   0.0146 
## 10 District of Columbia   62266     1182   0.0190 
## # ... with 46 more rows
library(plotly)



data1<-read.csv("state-abbrevs1.csv",header = TRUE)

state2<-inner_join(state1,data1,by='state')


w <- list(color = toRGB("white"), width = 2)
g <- list(
  scope = 'usa',
  projection = list(type = 'albers usa'),
  showlakes = TRUE,
  lakecolor = toRGB('white')
)
p <- plot_geo(state2, locationmode = 'USA-states') %>%
  add_trace(
    z = ~mortality, locations = ~code,
    color = ~mortality, colors = 'Purples'
  ) %>%
  colorbar(title = "mortality") %>%
  layout(
    title = 'mortality',
    geo = g
  )
p

vaccine-distribution-by-state

According to the CDC Moderna covid-19-vaccine-distribution-by-state data, Moderna vaccine is more popular and has been at a high level since May.

moderna<-read.csv("cdc-moderna-covid-19-vaccine-distribution-by-state.csv",header = TRUE)
pfizer<-read.csv("cdc-pfizer-covid-19-vaccine-distribution-by-state.csv",header = TRUE)




moderna1<-moderna%>%
  group_by(week_of_allocations) %>% 
  summarise(
            X_2nd_dose_allocations_sum=sum(X_2nd_dose_allocations, 
                        na.rm=T) ,
  
                )

moderna1$week_of_allocations<-as.Date(moderna1$week_of_allocations)

ggplot(data = moderna1,aes(x=week_of_allocations,y=X_2nd_dose_allocations_sum))+
  geom_line(size=1,color="blue")+
  labs(title = "cdc-moderna-covid-19-vaccine-distribution-by-state")

From the CDC Pfizer covid-19-vaccine-distribution-by-state, Pfizer’s vaccine was in a relatively stable state after the vaccination peak in April.

pfizer1<-pfizer%>%
  group_by(week_of_allocations) %>% 
  summarise(
            X_2nd_dose_allocations_sum=sum(X_2nd_dose_allocations, 
                        na.rm=T) ,
  
                )

pfizer1$week_of_allocations<-as.Date(pfizer1$week_of_allocations)

ggplot(data = pfizer1,aes(x=week_of_allocations,y=X_2nd_dose_allocations_sum))+
  geom_line(size=1,color="red")+
  labs(title = "cdc-pfizer-covid-19-vaccine-distribution-by-state")

moderna2<-moderna%>%
  group_by(jurisdiction) %>% 
  summarise(
            X_2nd_dose_allocations_sum=sum(X_2nd_dose_allocations, 
                        na.rm=T) ,
  
                )
moderna2<-moderna2%>%
   rename(moderna_2nd_dose_allocations_sum = X_2nd_dose_allocations_sum)
moderna2
## # A tibble: 63 x 2
##    jurisdiction   moderna_2nd_dose_allocations_sum
##    <chr>                                     <int>
##  1 Alabama                                  834960
##  2 Alaska                                   151860
##  3 American Samoa                                0
##  4 Arizona                                 1183560
##  5 Arkansas                                 506920
##  6 California                              6658300
##  7 Chicago                                  464120
##  8 Colorado                                 946800
##  9 Connecticut                              626920
## 10 Delaware                                 166240
## # ... with 53 more rows
ggplot(data=moderna2,aes(x=reorder(jurisdiction,moderna_2nd_dose_allocations_sum),y=moderna_2nd_dose_allocations_sum))+
   geom_bar(stat = 'identity',fill='blue')+ coord_flip()

pfizer2<-pfizer%>%
  group_by(jurisdiction) %>% 
  summarise(
            X_2nd_dose_allocations_sum=sum(X_2nd_dose_allocations, 
                        na.rm=T) ,
  
                )

pfizer2<-pfizer2%>%
   rename(pfizer_2nd_dose_allocations_sum = X_2nd_dose_allocations_sum)
pfizer2
## # A tibble: 63 x 2
##    jurisdiction   pfizer_2nd_dose_allocations_sum
##    <chr>                                    <int>
##  1 Alabama                                1131930
##  2 Alaska                                  214740
##  3 American Samoa                               0
##  4 Arizona                                1603440
##  5 Arkansas                                691470
##  6 California                             8980920
##  7 Chicago                                 636930
##  8 Colorado                               1283220
##  9 Connecticut                             855090
## 10 Delaware                                236340
## # ... with 53 more rows
ggplot(data=pfizer2,aes(x=reorder(jurisdiction,pfizer_2nd_dose_allocations_sum),y=pfizer_2nd_dose_allocations_sum))+
   geom_bar(stat = 'identity',fill='red')+ coord_flip()

vaccines<-inner_join(moderna2,pfizer2,by=c("jurisdiction"))
vaccines
## # A tibble: 63 x 3
##    jurisdiction   moderna_2nd_dose_allocations_sum pfizer_2nd_dose_allocations_~
##    <chr>                                     <int>                         <int>
##  1 Alabama                                  834960                       1131930
##  2 Alaska                                   151860                        214740
##  3 American Samoa                                0                             0
##  4 Arizona                                 1183560                       1603440
##  5 Arkansas                                 506920                        691470
##  6 California                              6658300                       8980920
##  7 Chicago                                  464120                        636930
##  8 Colorado                                 946800                       1283220
##  9 Connecticut                              626920                        855090
## 10 Delaware                                 166240                        236340
## # ... with 53 more rows
vaccines<-vaccines%>%
   rename(state = jurisdiction)
vaccines
## # A tibble: 63 x 3
##    state          moderna_2nd_dose_allocations_sum pfizer_2nd_dose_allocations_~
##    <chr>                                     <int>                         <int>
##  1 Alabama                                  834960                       1131930
##  2 Alaska                                   151860                        214740
##  3 American Samoa                                0                             0
##  4 Arizona                                 1183560                       1603440
##  5 Arkansas                                 506920                        691470
##  6 California                              6658300                       8980920
##  7 Chicago                                  464120                        636930
##  8 Colorado                                 946800                       1283220
##  9 Connecticut                              626920                        855090
## 10 Delaware                                 166240                        236340
## # ... with 53 more rows
state_2<-inner_join(state1,vaccines,by=c("state"))

data2<-data1%>%
  rename(ID = code)
data_3<-inner_join(state_2,data2,by=c("state"))
data_3
## # A tibble: 51 x 7
##    state   casesum deathsum mortality moderna_2nd_dose_~ pfizer_2nd_dose_~ ID   
##    <chr>     <int>    <int>     <dbl>              <int>             <int> <chr>
##  1 Alabama  806560    14756   0.0183              834960           1131930 AL   
##  2 Alaska   120496      574   0.00476             151860            214740 AK   
##  3 Arizona 1114061    20319   0.0182             1183560           1603440 AZ   
##  4 Arkans~  501518     7810   0.0156              506920            691470 AR   
##  5 Califo~ 4789773    70132   0.0146             6658300           8980920 CA   
##  6 Colora~  692082     7913   0.0114              946800           1283220 CO   
##  7 Connec~  394008     8667   0.0220              626920            855090 CT   
##  8 Delawa~  136682     1997   0.0146              166240            236340 DE   
##  9 Distri~   62266     1182   0.0190              126120            180630 DC   
## 10 Florida 3601755    56667   0.0157             3642160           4910130 FL   
## # ... with 41 more rows
nst_est2020<-read.csv("nst-est2020.csv",header = TRUE)

nst_est2020_1<-subset(nst_est2020,select = c(NAME,POPESTIMATE2020))

nst_est2020_1<-nst_est2020_1%>%
  rename(state = NAME)

state_3<-inner_join(data_3,nst_est2020_1,by=c("state"))
state_3
## # A tibble: 51 x 8
##    state   casesum deathsum mortality moderna_2nd_dose_~ pfizer_2nd_dose_~ ID   
##    <chr>     <int>    <int>     <dbl>              <int>             <int> <chr>
##  1 Alabama  806560    14756   0.0183              834960           1131930 AL   
##  2 Alaska   120496      574   0.00476             151860            214740 AK   
##  3 Arizona 1114061    20319   0.0182             1183560           1603440 AZ   
##  4 Arkans~  501518     7810   0.0156              506920            691470 AR   
##  5 Califo~ 4789773    70132   0.0146             6658300           8980920 CA   
##  6 Colora~  692082     7913   0.0114              946800           1283220 CO   
##  7 Connec~  394008     8667   0.0220              626920            855090 CT   
##  8 Delawa~  136682     1997   0.0146              166240            236340 DE   
##  9 Distri~   62266     1182   0.0190              126120            180630 DC   
## 10 Florida 3601755    56667   0.0157             3642160           4910130 FL   
## # ... with 41 more rows, and 1 more variable: POPESTIMATE2020 <int>
state_3<-state_3%>%
  mutate(pfizer_2nd_dose_allocations_rate=pfizer_2nd_dose_allocations_sum/POPESTIMATE2020,
         moderna_2nd_dose_allocations_rate=moderna_2nd_dose_allocations_sum/POPESTIMATE2020)
state_3
## # A tibble: 51 x 10
##    state   casesum deathsum mortality moderna_2nd_dose_~ pfizer_2nd_dose_~ ID   
##    <chr>     <int>    <int>     <dbl>              <int>             <int> <chr>
##  1 Alabama  806560    14756   0.0183              834960           1131930 AL   
##  2 Alaska   120496      574   0.00476             151860            214740 AK   
##  3 Arizona 1114061    20319   0.0182             1183560           1603440 AZ   
##  4 Arkans~  501518     7810   0.0156              506920            691470 AR   
##  5 Califo~ 4789773    70132   0.0146             6658300           8980920 CA   
##  6 Colora~  692082     7913   0.0114              946800           1283220 CO   
##  7 Connec~  394008     8667   0.0220              626920            855090 CT   
##  8 Delawa~  136682     1997   0.0146              166240            236340 DE   
##  9 Distri~   62266     1182   0.0190              126120            180630 DC   
## 10 Florida 3601755    56667   0.0157             3642160           4910130 FL   
## # ... with 41 more rows, and 3 more variables: POPESTIMATE2020 <int>,
## #   pfizer_2nd_dose_allocations_rate <dbl>,
## #   moderna_2nd_dose_allocations_rate <dbl>
#export csv
write.csv(state_3,"data.csv")

vaccine and mortality

ggplot(data = state_3,aes(x=pfizer_2nd_dose_allocations_rate,y=mortality))+
  geom_point(color="blue")

ggplot(data = state_3,aes(x=moderna_2nd_dose_allocations_rate,y=mortality))+
  geom_point(color="red")

Conclusion

From the above analysis, the Pandemic in the United States shows an exponential upward trend. After vaccination, there is a certain gentle trend. With the vaccination. There has been a significant decline in mortality, and vaccines can effectively reduce mortality. California is the worst Pandemic area in the United States, with the largest number of confirmed cases and deaths. Pfizer vaccine is more popular with American residents than Moderna vaccine, and the number of vaccinations is higher. Vaccination can effectively reduce mortality

LS0tDQp0aXRsZTogIkZpbmFsIFByb2plY3QiDQphdXRob3I6ICJaaG91eGluICBTaGkiDQpkYXRlOiAiMTIvMTIvMjAyMSINCm91dHB1dDogDQogIG9wZW5pbnRybzo6bGFiX3JlcG9ydDogZGVmYXVsdA0KICBodG1sX2RvY3VtZW50Og0KICAgIG51bWJlcl9zZWN0aW9uczogeWVzDQotLS0NCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpDQpvcHRpb25zKHdhcm49MCkNCmBgYA0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFfQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KHBseXIpDQpsaWJyYXJ5KGthYmxlRXh0cmEpDQpsaWJyYXJ5KHBsb3RseSkNCmxpYnJhcnkoY29ycnBsb3QpDQpsaWJyYXJ5KFBlcmZvcm1hbmNlQW5hbHl0aWNzKQ0KbGlicmFyeShzdGF0cykNCmBgYA0KDQojIyBQcm9ibGVtIFN0YXRlbWVudCBhbmQgYmFja2dyb3VuZA0KDQo8c3R5bGU+DQpkaXYuYXF1YW1hcmluZSB7IGJhY2tncm91bmQtY29sb3I6IzdmZmZkNDsgYm9yZGVyLXJhZGl1czogMTBweDsgcGFkZGluZzogNXB4O30NCjwvc3R5bGU+DQo8ZGl2IGNsYXNzID0gImFxdWFtYXJpbmUiPg0KDQpGb3IgbXkgZmluYWwgcHJvamVjdCwgSSB3aWxsIHN0dWR5IHRoZSBudW1iZXIgb2YgY2FzZXMgYW5kIGRlYXRocyBvZiBjb3ZpZC0xOSBpbiB2YXJpb3VzIHN0YXRlcyBpbiB0aGUgVW5pdGVkIFN0YXRlcywgYW5kIHZpc3VhbGl6ZSB0aGUgQ0RDIE1vZGVybmEgY292aWQtMTktdmFjY2luZS1kaXN0cmlidXRpb24tYnktc3RhdGUsIENEQyBQZml6ZXIgY292aWQtMTktdmFjY2luZS1kaXN0cmlidXRpb24tYnktc3RhdGUgYW5kIG90aGVyIGRhdGEuIE5leHQsIEkgd2lsbCBzdHVkeSB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gdmFjY2luYXRpb24gaW4gdGhlIFVuaXRlZCBTdGF0ZXMgYW5kIHRoZSBudW1iZXIgb2YgY292aWQtMTkgY2FzZXMgYW5kIGRlYXRocywgSW4gb3JkZXIgdG8gZmluZCBvdXQgd2hldGhlciB2YWNjaW5hdGlvbiBjYW4gc2lnbmlmaWNhbnRseSByZWR1Y2UgdGhlIG51bWJlciBvZiBjb3ZpZC0xOSBjYXNlcyBhbmQgZGVhdGhzLCBBbmQgd2hldGhlciB0aGVyZSBhcmUgZGlmZmVyZW5jZXMgYW1vbmcgZGlmZmVyZW50IHZhY2NpbmUgbWFudWZhY3R1cmVycw0KDQogRmlyc3QgSSB3b3VsZCBsaWtlIHRvIGludHVpdGl2ZWx5IHNob3cgdGhlIG51bWJlciBvZiBjb3ZpZC0xOSBjYXNlcyBhbmQgZGVhdGhzIGluIFUuUyBTdGF0ZXMuIFRoZW4sIEkgd291bGQgc2hvdyB0aGUgdmFjY2luYXRpb24gc2l0dWF0aW9uIGluIFUuUyBTdGF0ZXMuIE1vc3Qgb2YgdGhlIGRhdGEgY2FuIGJlIGFjY3VyYXRlIHRvIHRoZSBkYWlseSBkYXRhIG9mIFUuUyBTdGF0ZXMuIEkgd291bGQgYWxzbyBzaG93IGEgZGlhZ3JhbSBvZiB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gY292aWQtMTkgY2FzZXMsIGRlYXRocyBhbmQgdmFjY2luYXRpb24uDQoNCkkgd2lsbCBkZWNpZGUgd2hhdCBkYXRhIHRvIHVzZSBhbmQgbm90IHRvIHVzZSB3aGVuIHN0YXJ0aW5nIHRoZSBwcm9qZWN0LiBBcyB0aGUgcHJvamVjdCBjb250aW51ZXMsIG1vcmUgZGF0YSBtYXkgYmUgYWRkZWQsIHN1Y2ggYXMgdGhlIHBvcHVsYXRpb24gb2YgZWFjaCBzdGF0ZSBpbiB0aGUgVW5pdGVkIFN0YXRlcywgc28gYXMgdG8gZmFjaWxpdGF0ZSB0aGUgc3R1ZHkgb2YgdGhlIHByb3BvcnRpb24gb2YgY2FzZXMsIG1vcnRhbGl0eSBhbmQgdmFjY2luYXRpb24gcmF0ZSBvZiBjb3ZpZC0xOSBpbiB0aGUgVW5pdGVkIFN0YXRlcywgc2luY2UgdGhpcyBpcyB3aGF0IEkgaW50ZXJlc3RlZCBpbiBzdHVkeSBkdXJpbmcgdGhpcyBwZXJpb2Qgb2YgdGltZS4NCg0KDQo8L2Rpdj4gXGhmaWxsXGJyZWFrDQoNCg0KIyMgVGhlIGRhdGEgd2lsbCBjb21lIGZyb20gdmFyaW91cyBzb3VyY2VzOg0KDQotIEFtYXpvbiBXZWIgU2VydmljZXMgKEFXUykgZGF0YSBsYWtlIGZvciBhbmFseXNpcyBvZiBDT1ZJRC0xOSBkYXRhKGh0dHBzOi8vZGF0YXNjaWVuY2UubmloLmdvdi9jb3ZpZC0xOS1vcGVuLWFjY2Vzcy1yZXNvdXJjZXMpLFJvb3QgZm9sZGVyKGh0dHBzOi8vZGoydGFhOWk2NTJyZi5jbG91ZGZyb250Lm5ldC8pDQoxLiBodHRwczovL2NvdmlkMTktbGFrZS5zMy51cy1lYXN0LTIuYW1hem9uYXdzLmNvbS9jZGMtbW9kZXJuYS12YWNjaW5lLWRpc3RyaWJ1dGlvbi9jc3YvY2RjLW1vZGVybmEtY292aWQtMTktdmFjY2luZS1kaXN0cmlidXRpb24tYnktc3RhdGUuY3N2DQogDQoyLiBodHRwczovL2NvdmlkMTktbGFrZS5zMy51cy1lYXN0LTIuYW1hem9uYXdzLmNvbS9jZGMtcGZpemVyLXZhY2NpbmUtZGlzdHJpYnV0aW9uL2Nzdi9jZGMtcGZpemVyLWNvdmlkLTE5LXZhY2NpbmUtZGlzdHJpYnV0aW9uLWJ5LXN0YXRlLmNzdg0KIA0KMy4gaHR0cHM6Ly9jb3ZpZDE5LWxha2UuczMudXMtZWFzdC0yLmFtYXpvbmF3cy5jb20vcmVhcmMtY292aWQtMTktbnl0LWRhdGEtaW4tdXNhL2Nzdi91cy1zdGF0ZXMvdXMtc3RhdGVzLmNzdg0KDQoNCkZpcnN0bHksIHdlIGFuYWx5emUgdGhlIGNoYW5nZSB0cmVuZCBvZiB0aGUgbnVtYmVyIG9mIGNvbmZpcm1lZCBjYXNlcy4gSXQgY2FuIGJlIHNlZW4gdGhhdCB0aGUgbnVtYmVyIG9mIGNvbmZpcm1lZCBjYXNlcyBpbiB0aGUgVW5pdGVkIFN0YXRlcyBzaG93cyBhbiBleHBvbmVudGlhbCB1cHdhcmQgdHJlbmTvvIxGcm9tIEZlYnJ1YXJ5IHRvIEp1bHkgMjAyMSwgdGhlIFBhbmRlbWljIHdhcyByZWxhdGl2ZWx5IG1pbGQsIGFuZCBhZnRlciBKdWx5IDIwMjEsIGl0IHNob3dlZCBhIHJhcGlkIHVwd2FyZCB0cmVuZC4NCg0KDQoNCg0KIyMgV29yayBwcm9jZXNzIA0KDQoNCg0KYGBge3J9DQp1c19zdGF0ZXM8LXJlYWQuY3N2KCJ1cy1zdGF0ZXMuY3N2IixoZWFkZXIgPSBUUlVFKQ0KDQpWaWV3KHVzX3N0YXRlcykNCg0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShkcGx5cikNCmNhc2VzMTwtdXNfc3RhdGVzJT4lDQogIGdyb3VwX2J5KGRhdGUpICU+JSANCiAgc3VtbWFyaXNlKGNhc2Vzc3VtID0gc3VtKGNhc2VzLCANCiAgICAgICAgICAgICAgICAgICAgICAgIG5hLnJtPVQpIA0KICAgICAgICAgICAgDQogICAgICAgICAgICApDQpjYXNlczEkZGF0ZTwtYXMuRGF0ZShjYXNlczEkZGF0ZSkNCm9wdGlvbnMoc2NpcGVuID0gMTAwKQ0KZ2dwbG90KGRhdGEgPSBjYXNlczEsYWVzKHg9ZGF0ZSx5PWNhc2Vzc3VtKSkrDQogICAgICAgICBnZW9tX3BvaW50KGNvbG9yPSJibHVlIixzaXplPTEpKw0KICBsYWJzKHRpdGxlID0gImRhdGUgdnMgIGNhc2VzIix4PSJkYXRlIix5PSJjYXNlcyIpDQoNCg0KDQoNCmBgYA0KDQoqSW4gdGVybXMgb2YgdGhlIG51bWJlciBvZiBkZWF0aHMgaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIHRoZSBncm93dGggY3VydmUgb2YgdGhlIG51bWJlciBvZiBkZWF0aHMgaXMgc2ltaWxhciB0byB0aGUgdHJlbmQgb2YgdGhlIG51bWJlciBvZiBjb25maXJtZWQgY2FzZXMsIGluZGljYXRpbmcgdGhhdCB0aGUgbW9yZSBjb25maXJtZWQgY2FzZXMsIHRoZSBtb3JlIGRlYXRocy4qDQoNCmBgYHtyfQ0KDQpvcHRpb25zKHNjaXBlbiA9IDEwMCkNCmRlYXRoczE8LXVzX3N0YXRlcyU+JQ0KICBncm91cF9ieShkYXRlKSAlPiUgDQogIHN1bW1hcmlzZShkZWF0aHNzdW0gPSBzdW0oZGVhdGhzLCANCiAgICAgICAgICAgICAgICAgICAgICAgIG5hLnJtPVQpICkNCg0KZGVhdGhzMSRkYXRlPC1hcy5EYXRlKGRlYXRoczEkZGF0ZSkNCg0KZ2dwbG90KGRhdGEgPSBkZWF0aHMxLGFlcyh4PWRhdGUseT1kZWF0aHNzdW0pKSsNCiAgICAgICAgIGdlb21fcG9pbnQoY29sb3I9InJlZCIsc2l6ZT0xKSsNCiAgbGFicyh0aXRsZSA9ICJkYXRlIHZzICBkZWF0aHMiLHg9ImRhdGUiLHk9ImRlYXRocyIpDQoNCmBgYA0KDQojIyBNb3J0YWxpdHkgb3ZlciB0aW1lDQoNCkluIHRlcm1zIG9mIG1vcnRhbGl0eSBpbiB0aGUgVW5pdGVkIFN0YXRlcywgaXQgb25jZSByZWFjaGVkIDglIGluIEZlYnJ1YXJ5IDIwMjAsIGJ1dCB3aXRoIHRoZSBpbXByb3ZlbWVudCBvZiB0cmVhdG1lbnQgbWV0aG9kcyBpbiB0aGUgVW5pdGVkIFN0YXRlcywgdGhlIG92ZXJhbGwgbW9ydGFsaXR5IHNob3dlZCBhIGRvd253YXJkIHRyZW5kLg0KDQpgYGB7cn0NCg0KY2FzZWRlYXRoPC11c19zdGF0ZXMlPiUNCiAgZ3JvdXBfYnkoZGF0ZSkgJT4lIA0KICBzdW1tYXJpc2UoDQogICAgY2FzZXN1bT1zdW0oY2FzZXMsIA0KICAgICAgICAgICAgICAgICAgICAgICAgbmEucm09VCkgLA0KICAgIGRlYXRoc3VtID0gc3VtKGRlYXRocywgDQogICAgICAgICAgICAgICAgICAgICAgICBuYS5ybT1UKSApDQoNCg0KDQoNCmNhc2VkZWF0aCRkYXRlPC1hcy5EYXRlKGNhc2VkZWF0aCRkYXRlKQ0KDQpjYXNlZGVhdGgkbW9ydGFsaXR5PC1jYXNlZGVhdGgkZGVhdGhzdW0vY2FzZWRlYXRoJGNhc2VzdW0NCg0KDQoNCmdncGxvdChkYXRhID1jYXNlZGVhdGgsYWVzKHg9ZGF0ZSx5PW1vcnRhbGl0eSkgKSsNCiAgZ2VvbV9saW5lKHNpemU9MSkrbGFicyh0aXRsZSA9ICJNb3J0YWxpdHkgb3ZlciB0aW1lICIseD0iZGF0ZSIseT0ibW9ydGFsaXR5IikNCiAgDQoNCmBgYA0KDQoNCg0KDQoqRnJvbSB0aGUgY29tYmluYXRpb24gb2YgY29uZmlybWVkIGNhc2VzIGFuZCBkZWF0aHMgaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIHRoZSBkZWF0aCB0b2xsIGlzIHN0aWxsIGF0IGEgcmVsYXRpdmVseSBsb3cgbGV2ZWwgcmVsYXRpdmUgdG8gdGhlIGNvbmZpcm1lZCBudW1iZXIuKg0KYGBge3J9DQoNCm9wdGlvbnMoc2NpcGVuID0gMTAwKQ0KDQpnZ3Bsb3QoZGF0YT1jYXNlZGVhdGgpK2dlb21fbGluZShhZXMoeD1kYXRlLHk9Y2FzZXN1bSksY29sb3I9ImdyZWVuIikrDQogIGdlb21fcG9pbnQoYWVzKHg9ZGF0ZSx5PWNhc2VzdW0pLGNvbG9yPSJncmVlbiIsc2l6ZT0wLjgpKw0KICBnZW9tX2xpbmUoYWVzKHg9ZGF0ZSx5PWRlYXRoc3VtKSxjb2xvcj0iYmx1ZSIpKw0KICBnZW9tX3BvaW50KGFlcyh4PWRhdGUseT1kZWF0aHN1bSksY29sb3I9ImJsdWUiLHNpemU9MC44KSsNCiAgbGFicyh0aXRsZSA9ICJkYXRlICB2cyAgY2FzZXMgdnMgIGRlYXRocyIseD0iRGF0ZSIpDQoNCg0KYGBgDQoNCg0KDQoNCipGcm9tIHRoZSBudW1iZXIgb2YgY29uZmlybWVkIGNhc2VzIGluIHRoZSBzdGF0ZXMgb2YgdGhlIFVuaXRlZCBTdGF0ZXMsIENhbGlmb3JuaWEsIFRleGFzIGFuZCBGbG9yaWRhIGFyZSB0aGUgc3RhdGVzIHdpdGggdGhlIGxhcmdlc3QgbnVtYmVyIG9mIGNvbmZpcm1lZCBjYXNlcywgb2Ygd2hpY2ggQ2FsaWZvcm5pYSBhbmQgVGV4YXMgYXJlIG1vcmUgdGhhbiA0IG1pbGxpb24qDQoNCg0KYGBge3J9DQoNCm1heGRhdGU8LW1heCh1c19zdGF0ZXMkZGF0ZSkNCg0Kc3RhdGUxPC11c19zdGF0ZXMlPiUNCiAgZ3JvdXBfYnkoc3RhdGUpICU+JSANCiAgZmlsdGVyKGRhdGU9PW1heGRhdGUpJT4lDQogIHN1bW1hcmlzZSgNCiAgICAgICAgICAgIGNhc2VzdW09c3VtKGNhc2VzLCANCiAgICAgICAgICAgICAgICAgICAgICAgIG5hLnJtPVQpICwNCiAgICBkZWF0aHN1bSA9IHN1bShkZWF0aHMsIA0KICAgICAgICAgICAgICAgICAgICAgICAgbmEucm09VCkNCiAgICANCiAgICAgICAgICAgICkNCnN0YXRlMSRtb3J0YWxpdHk8LXN0YXRlMSRkZWF0aHN1bS9zdGF0ZTEkY2FzZXN1bQ0KDQoNCmdncGxvdChkYXRhPXN0YXRlMSxhZXMoeD1yZW9yZGVyKHN0YXRlLGNhc2VzdW0pLHk9Y2FzZXN1bSkpKw0KICBnZW9tX2JhcihzdGF0ID0gJ2lkZW50aXR5JyxmaWxsPSdyZWQnKSArIGNvb3JkX2ZsaXAoKQ0KDQoNCg0KYGBgDQoNCg0KKkNhbGlmb3JuaWEgYW5kIFRleGFzIGhhdmUgY2F1c2VkIHRoZSBtb3N0IGRlYXRocywgd2l0aCBtb3JlIHRoYW4gNjAwMDAgcGVvcGxlKg0KDQpgYGB7cn0NCmdncGxvdChkYXRhPXN0YXRlMSxhZXMoeD1yZW9yZGVyKHN0YXRlLGRlYXRoc3VtKSx5PWRlYXRoc3VtKSkrDQogICBnZW9tX2JhcihzdGF0ID0gJ2lkZW50aXR5JyxmaWxsPSdibHVlJykrIGNvb3JkX2ZsaXAoKQ0KDQoNCg0KYGBgDQoqTmV3IFlvcmsgaXMgYW4gYXJlYSB3aGVyZSB0aGUgUGFuZGVtaWMgb2NjdXJyZWQgZWFybGllciwgYW5kIHRoZSBtb3J0YWxpdHkgY2F1c2VkIGJ5IHRoZSBQYW5kZW1pYyBpcyByZWxhdGl2ZWx5IGhpZ2gqDQoNCg0KYGBge3J9DQpnZ3Bsb3QoZGF0YT1zdGF0ZTEsYWVzKHg9cmVvcmRlcihzdGF0ZSxtb3J0YWxpdHkpLHk9bW9ydGFsaXR5KSkrDQogICBnZW9tX2JhcihzdGF0ID0gJ2lkZW50aXR5JyxmaWxsPSdncmVlbicpKyBjb29yZF9mbGlwKCkNCnN0YXRlMQ0KDQoNCmxpYnJhcnkocGxvdGx5KQ0KDQoNCg0KZGF0YTE8LXJlYWQuY3N2KCJzdGF0ZS1hYmJyZXZzMS5jc3YiLGhlYWRlciA9IFRSVUUpDQoNCnN0YXRlMjwtaW5uZXJfam9pbihzdGF0ZTEsZGF0YTEsYnk9J3N0YXRlJykNCg0KDQp3IDwtIGxpc3QoY29sb3IgPSB0b1JHQigid2hpdGUiKSwgd2lkdGggPSAyKQ0KZyA8LSBsaXN0KA0KICBzY29wZSA9ICd1c2EnLA0KICBwcm9qZWN0aW9uID0gbGlzdCh0eXBlID0gJ2FsYmVycyB1c2EnKSwNCiAgc2hvd2xha2VzID0gVFJVRSwNCiAgbGFrZWNvbG9yID0gdG9SR0IoJ3doaXRlJykNCikNCnAgPC0gcGxvdF9nZW8oc3RhdGUyLCBsb2NhdGlvbm1vZGUgPSAnVVNBLXN0YXRlcycpICU+JQ0KICBhZGRfdHJhY2UoDQogICAgeiA9IH5tb3J0YWxpdHksIGxvY2F0aW9ucyA9IH5jb2RlLA0KICAgIGNvbG9yID0gfm1vcnRhbGl0eSwgY29sb3JzID0gJ1B1cnBsZXMnDQogICkgJT4lDQogIGNvbG9yYmFyKHRpdGxlID0gIm1vcnRhbGl0eSIpICU+JQ0KICBsYXlvdXQoDQogICAgdGl0bGUgPSAnbW9ydGFsaXR5JywNCiAgICBnZW8gPSBnDQogICkNCnANCg0KDQoNCmBgYA0KDQojIyB2YWNjaW5lLWRpc3RyaWJ1dGlvbi1ieS1zdGF0ZQ0KPHN0eWxlPg0KZGl2LmFxdWFtYXJpbmUgeyBiYWNrZ3JvdW5kLWNvbG9yOiM3ZmZmZDQ7IGJvcmRlci1yYWRpdXM6IDEwcHg7IHBhZGRpbmc6IDVweDt9DQo8L3N0eWxlPg0KPGRpdiBjbGFzcyA9ICJhcXVhbWFyaW5lIj4NCg0KQWNjb3JkaW5nIHRvIHRoZSBDREMgTW9kZXJuYSBjb3ZpZC0xOS12YWNjaW5lLWRpc3RyaWJ1dGlvbi1ieS1zdGF0ZSBkYXRhLCBNb2Rlcm5hIHZhY2NpbmUgaXMgbW9yZSBwb3B1bGFyIGFuZCBoYXMgYmVlbiBhdCBhIGhpZ2ggbGV2ZWwgc2luY2UgTWF5Lg0KPC9kaXY+IFxoZmlsbFxicmVhaw0KDQpgYGB7cn0NCg0KDQptb2Rlcm5hPC1yZWFkLmNzdigiY2RjLW1vZGVybmEtY292aWQtMTktdmFjY2luZS1kaXN0cmlidXRpb24tYnktc3RhdGUuY3N2IixoZWFkZXIgPSBUUlVFKQ0KcGZpemVyPC1yZWFkLmNzdigiY2RjLXBmaXplci1jb3ZpZC0xOS12YWNjaW5lLWRpc3RyaWJ1dGlvbi1ieS1zdGF0ZS5jc3YiLGhlYWRlciA9IFRSVUUpDQoNCg0KDQoNCm1vZGVybmExPC1tb2Rlcm5hJT4lDQogIGdyb3VwX2J5KHdlZWtfb2ZfYWxsb2NhdGlvbnMpICU+JSANCiAgc3VtbWFyaXNlKA0KICAgICAgICAgICAgWF8ybmRfZG9zZV9hbGxvY2F0aW9uc19zdW09c3VtKFhfMm5kX2Rvc2VfYWxsb2NhdGlvbnMsIA0KICAgICAgICAgICAgICAgICAgICAgICAgbmEucm09VCkgLA0KICANCiAgICAgICAgICAgICAgICApDQoNCm1vZGVybmExJHdlZWtfb2ZfYWxsb2NhdGlvbnM8LWFzLkRhdGUobW9kZXJuYTEkd2Vla19vZl9hbGxvY2F0aW9ucykNCg0KZ2dwbG90KGRhdGEgPSBtb2Rlcm5hMSxhZXMoeD13ZWVrX29mX2FsbG9jYXRpb25zLHk9WF8ybmRfZG9zZV9hbGxvY2F0aW9uc19zdW0pKSsNCiAgZ2VvbV9saW5lKHNpemU9MSxjb2xvcj0iYmx1ZSIpKw0KICBsYWJzKHRpdGxlID0gImNkYy1tb2Rlcm5hLWNvdmlkLTE5LXZhY2NpbmUtZGlzdHJpYnV0aW9uLWJ5LXN0YXRlIikNCg0KDQoNCg0KDQpgYGANCg0KDQoNCipGcm9tIHRoZSBDREMgUGZpemVyIGNvdmlkLTE5LXZhY2NpbmUtZGlzdHJpYnV0aW9uLWJ5LXN0YXRlLCBQZml6ZXIncyB2YWNjaW5lIHdhcyBpbiBhIHJlbGF0aXZlbHkgc3RhYmxlIHN0YXRlIGFmdGVyIHRoZSB2YWNjaW5hdGlvbiBwZWFrIGluIEFwcmlsLioNCg0KYGBge3J9DQoNCg0KcGZpemVyMTwtcGZpemVyJT4lDQogIGdyb3VwX2J5KHdlZWtfb2ZfYWxsb2NhdGlvbnMpICU+JSANCiAgc3VtbWFyaXNlKA0KICAgICAgICAgICAgWF8ybmRfZG9zZV9hbGxvY2F0aW9uc19zdW09c3VtKFhfMm5kX2Rvc2VfYWxsb2NhdGlvbnMsIA0KICAgICAgICAgICAgICAgICAgICAgICAgbmEucm09VCkgLA0KICANCiAgICAgICAgICAgICAgICApDQoNCnBmaXplcjEkd2Vla19vZl9hbGxvY2F0aW9uczwtYXMuRGF0ZShwZml6ZXIxJHdlZWtfb2ZfYWxsb2NhdGlvbnMpDQoNCmdncGxvdChkYXRhID0gcGZpemVyMSxhZXMoeD13ZWVrX29mX2FsbG9jYXRpb25zLHk9WF8ybmRfZG9zZV9hbGxvY2F0aW9uc19zdW0pKSsNCiAgZ2VvbV9saW5lKHNpemU9MSxjb2xvcj0icmVkIikrDQogIGxhYnModGl0bGUgPSAiY2RjLXBmaXplci1jb3ZpZC0xOS12YWNjaW5lLWRpc3RyaWJ1dGlvbi1ieS1zdGF0ZSIpDQoNCg0KYGBgDQoNCg0KYGBge3J9DQoNCm1vZGVybmEyPC1tb2Rlcm5hJT4lDQogIGdyb3VwX2J5KGp1cmlzZGljdGlvbikgJT4lIA0KICBzdW1tYXJpc2UoDQogICAgICAgICAgICBYXzJuZF9kb3NlX2FsbG9jYXRpb25zX3N1bT1zdW0oWF8ybmRfZG9zZV9hbGxvY2F0aW9ucywgDQogICAgICAgICAgICAgICAgICAgICAgICBuYS5ybT1UKSAsDQogIA0KICAgICAgICAgICAgICAgICkNCm1vZGVybmEyPC1tb2Rlcm5hMiU+JQ0KICAgcmVuYW1lKG1vZGVybmFfMm5kX2Rvc2VfYWxsb2NhdGlvbnNfc3VtID0gWF8ybmRfZG9zZV9hbGxvY2F0aW9uc19zdW0pDQptb2Rlcm5hMg0KDQpnZ3Bsb3QoZGF0YT1tb2Rlcm5hMixhZXMoeD1yZW9yZGVyKGp1cmlzZGljdGlvbixtb2Rlcm5hXzJuZF9kb3NlX2FsbG9jYXRpb25zX3N1bSkseT1tb2Rlcm5hXzJuZF9kb3NlX2FsbG9jYXRpb25zX3N1bSkpKw0KICAgZ2VvbV9iYXIoc3RhdCA9ICdpZGVudGl0eScsZmlsbD0nYmx1ZScpKyBjb29yZF9mbGlwKCkNCg0KDQpgYGANCg0KDQoNCg0KYGBge3J9DQpwZml6ZXIyPC1wZml6ZXIlPiUNCiAgZ3JvdXBfYnkoanVyaXNkaWN0aW9uKSAlPiUgDQogIHN1bW1hcmlzZSgNCiAgICAgICAgICAgIFhfMm5kX2Rvc2VfYWxsb2NhdGlvbnNfc3VtPXN1bShYXzJuZF9kb3NlX2FsbG9jYXRpb25zLCANCiAgICAgICAgICAgICAgICAgICAgICAgIG5hLnJtPVQpICwNCiAgDQogICAgICAgICAgICAgICAgKQ0KDQpwZml6ZXIyPC1wZml6ZXIyJT4lDQogICByZW5hbWUocGZpemVyXzJuZF9kb3NlX2FsbG9jYXRpb25zX3N1bSA9IFhfMm5kX2Rvc2VfYWxsb2NhdGlvbnNfc3VtKQ0KcGZpemVyMg0KDQpnZ3Bsb3QoZGF0YT1wZml6ZXIyLGFlcyh4PXJlb3JkZXIoanVyaXNkaWN0aW9uLHBmaXplcl8ybmRfZG9zZV9hbGxvY2F0aW9uc19zdW0pLHk9cGZpemVyXzJuZF9kb3NlX2FsbG9jYXRpb25zX3N1bSkpKw0KICAgZ2VvbV9iYXIoc3RhdCA9ICdpZGVudGl0eScsZmlsbD0ncmVkJykrIGNvb3JkX2ZsaXAoKQ0KDQpgYGANCg0KDQpgYGB7cn0NCg0KdmFjY2luZXM8LWlubmVyX2pvaW4obW9kZXJuYTIscGZpemVyMixieT1jKCJqdXJpc2RpY3Rpb24iKSkNCnZhY2NpbmVzDQoNCg0KdmFjY2luZXM8LXZhY2NpbmVzJT4lDQogICByZW5hbWUoc3RhdGUgPSBqdXJpc2RpY3Rpb24pDQp2YWNjaW5lcw0KDQoNCnN0YXRlXzI8LWlubmVyX2pvaW4oc3RhdGUxLHZhY2NpbmVzLGJ5PWMoInN0YXRlIikpDQoNCmRhdGEyPC1kYXRhMSU+JQ0KICByZW5hbWUoSUQgPSBjb2RlKQ0KZGF0YV8zPC1pbm5lcl9qb2luKHN0YXRlXzIsZGF0YTIsYnk9Yygic3RhdGUiKSkNCmRhdGFfMw0KDQpuc3RfZXN0MjAyMDwtcmVhZC5jc3YoIm5zdC1lc3QyMDIwLmNzdiIsaGVhZGVyID0gVFJVRSkNCg0KbnN0X2VzdDIwMjBfMTwtc3Vic2V0KG5zdF9lc3QyMDIwLHNlbGVjdCA9IGMoTkFNRSxQT1BFU1RJTUFURTIwMjApKQ0KDQpuc3RfZXN0MjAyMF8xPC1uc3RfZXN0MjAyMF8xJT4lDQogIHJlbmFtZShzdGF0ZSA9IE5BTUUpDQoNCnN0YXRlXzM8LWlubmVyX2pvaW4oZGF0YV8zLG5zdF9lc3QyMDIwXzEsYnk9Yygic3RhdGUiKSkNCnN0YXRlXzMNCg0KDQpzdGF0ZV8zPC1zdGF0ZV8zJT4lDQogIG11dGF0ZShwZml6ZXJfMm5kX2Rvc2VfYWxsb2NhdGlvbnNfcmF0ZT1wZml6ZXJfMm5kX2Rvc2VfYWxsb2NhdGlvbnNfc3VtL1BPUEVTVElNQVRFMjAyMCwNCiAgICAgICAgIG1vZGVybmFfMm5kX2Rvc2VfYWxsb2NhdGlvbnNfcmF0ZT1tb2Rlcm5hXzJuZF9kb3NlX2FsbG9jYXRpb25zX3N1bS9QT1BFU1RJTUFURTIwMjApDQpzdGF0ZV8zDQojZXhwb3J0IGNzdg0Kd3JpdGUuY3N2KHN0YXRlXzMsImRhdGEuY3N2IikNCg0KDQpgYGANCg0KDQojIyB2YWNjaW5lIGFuZCBtb3J0YWxpdHkNCjxzdHlsZT4NCmRpdi5hcXVhbWFyaW5lIHsgYmFja2dyb3VuZC1jb2xvcjojN2ZmZmQ0OyBib3JkZXItcmFkaXVzOiAxMHB4OyBwYWRkaW5nOiA1cHg7fQ0KPC9zdHlsZT4NCjxkaXYgY2xhc3MgPSAiYXF1YW1hcmluZSI+DQoNCjwvZGl2PiBcaGZpbGxcYnJlYWsNCg0KYGBge3J9DQoNCmdncGxvdChkYXRhID0gc3RhdGVfMyxhZXMoeD1wZml6ZXJfMm5kX2Rvc2VfYWxsb2NhdGlvbnNfcmF0ZSx5PW1vcnRhbGl0eSkpKw0KICBnZW9tX3BvaW50KGNvbG9yPSJibHVlIikNCg0KYGBgDQoNCg0KDQpgYGB7cn0NCg0KZ2dwbG90KGRhdGEgPSBzdGF0ZV8zLGFlcyh4PW1vZGVybmFfMm5kX2Rvc2VfYWxsb2NhdGlvbnNfcmF0ZSx5PW1vcnRhbGl0eSkpKw0KICBnZW9tX3BvaW50KGNvbG9yPSJyZWQiKQ0KDQpgYGANCg0KIyMgTGluayB0byBzaGlueSBBcHBzDQpodHRwczovL2pvc2VwaC1zaGkuc2hpbnlhcHBzLmlvL0ZpbmFsUHJvamVjdC8NCg0KDQojIyBDb25jbHVzaW9uDQoqRnJvbSB0aGUgYWJvdmUgYW5hbHlzaXMsIHRoZSBQYW5kZW1pYyBpbiB0aGUgVW5pdGVkIFN0YXRlcyBzaG93cyBhbiBleHBvbmVudGlhbCB1cHdhcmQgdHJlbmQuIEFmdGVyIHZhY2NpbmF0aW9uLCB0aGVyZSBpcyBhIGNlcnRhaW4gZ2VudGxlIHRyZW5kLiBXaXRoIHRoZSB2YWNjaW5hdGlvbi4qDQoqVGhlcmUgaGFzIGJlZW4gYSBzaWduaWZpY2FudCBkZWNsaW5lIGluIG1vcnRhbGl0eSwgYW5kIHZhY2NpbmVzIGNhbiBlZmZlY3RpdmVseSByZWR1Y2UgbW9ydGFsaXR5LioNCipDYWxpZm9ybmlhIGlzIHRoZSB3b3JzdCBQYW5kZW1pYyBhcmVhIGluIHRoZSBVbml0ZWQgU3RhdGVzLCB3aXRoIHRoZSBsYXJnZXN0IG51bWJlciBvZiBjb25maXJtZWQgY2FzZXMgYW5kIGRlYXRocy4qDQoqUGZpemVyIHZhY2NpbmUgaXMgbW9yZSBwb3B1bGFyIHdpdGggQW1lcmljYW4gcmVzaWRlbnRzIHRoYW4gTW9kZXJuYSB2YWNjaW5lLCBhbmQgdGhlIG51bWJlciBvZiB2YWNjaW5hdGlvbnMgaXMgaGlnaGVyLioNCipWYWNjaW5hdGlvbiBjYW4gZWZmZWN0aXZlbHkgcmVkdWNlIG1vcnRhbGl0eSoNCg0KDQoNCg0KDQoNCg==