Quanteda is notoriously unstable in terms of functions being updated frequently and breaking pipelines. Hence hard requiring a stable version of quanteda that was used for initial analysis for full replicability.
library(readtext)
library(quanteda)
library(tidyverse)
library(stm)
library(tidytext)
library(haven)
library(data.table)
library(ggridges)
library(viridis)
UNGD data are available on the Harvard Dataverse at https://doi.org/10.7910/DVN/0TJX8Y
DATA_DIR <- "~/Dropbox/Research/UNGDC projects/UN Data/"
ungd_files <- readtext(paste0(DATA_DIR, "TXT/*"),
docvarsfrom = "filenames",
dvsep="_",
docvarnames = c("Country", "Session", "Year"))
ungd_corpus <- corpus(ungd_files, text_field = "text")
#Analysis
###Wordscore based positions
tok <- tokens(ungd_corpus, what = "word",
remove_punct = TRUE,
remove_symbols = TRUE,
remove_numbers = TRUE,
remove_twitter = TRUE,
remove_url = TRUE,
remove_hyphens = TRUE,
verbose = TRUE)
dfm <- dfm(tok,
tolower = TRUE,
remove=stopwords("english"),
stem=TRUE,
verbose = TRUE)
#Removing any digits. `dfm` picks up any separated digits, not digits that are part of tokens.
#Removing any punctuation. `dfm` picks up any punctuation unless it's part of a token.
#Removing any tokens less than four characters.
dfm.m <- dfm_select(dfm, c("[\\d-]", "[[:punct:]]", "^.{1,3}$"), selection = "remove",
valuetype="regex", verbose = TRUE)
#Dropping words that appear less than 5 times and in less than 3 documents.
dfm.trim <- dfm_trim(dfm.m, min_termfreq = 5, min_docfreq = 3, verbose = TRUE)
#group documents by year in dfm
dfm.year <- dfm_group(dfm.trim, dfm.trim@docvars$Year)
# get names of variables to be dropped
dfm.year.trimmed <- dfm_trim(dfm.year, max_docfreq=1, verbose = TRUE)
df.year.trimmed <- as.data.frame(dfm.year.trimmed)
variables_drop <- names(df.year.trimmed)
variables_drop <- variables_drop[2:length(variables_drop)]
#group documents by year in dfm
dfm.year_all <- dfm_group(dfm.m, dfm@docvars$Year)
# get names of variables to be dropped
df.year.trimmed_all <- as.data.frame(dfm_trim(dfm.year_all, max_docfreq=1))
#Logicals for EU member states
EU <- c("BEL", "FRA", "DEU", "ITA", "LUX", "NLD")
wave1 <- c("DNK", "IRL", "GBR")
wave2 <- "GRC"
wave3 <- c("ESP", "PRT")
wave4 <- c("AUT", "FIN", "SWE")
wave5 <- c("CZE", "HUN", "POL", "EST", "LVA", "LTU", "CYP", "MLT", "SVK", "SVN")
wave6 <- c("BGR", "ROU")
wave7 <- "HRV"
presus2 <- presus
presus2 <- presus2 %>% mutate(is.eu = Country %in% EU)
presus2$waves <- presus2$is.eu
presus2$waves <- presus2$is.eu
#first wave
presus2$is.eu[presus2$Country== "DNK" & presus2$Year >1972] <- TRUE
presus2$is.eu[presus2$Country== "IRL" & presus2$Year >1972] <- TRUE
presus2$is.eu[presus2$Country== "GBR" & presus2$Year >1972] <- TRUE
#second wave
presus2$is.eu[presus2$Country== "GRC" & presus2$Year >1980] <- TRUE
#third wave
presus2$is.eu[presus2$Country== "ESP" & presus2$Year >1985] <- TRUE
presus2$is.eu[presus2$Country== "PRT" & presus2$Year >1985] <- TRUE
#fourth wave
presus2$is.eu[presus2$Country== "AUT" & presus2$Year >1994] <- TRUE
presus2$is.eu[presus2$Country== "FIN" & presus2$Year >1994] <- TRUE
presus2$is.eu[presus2$Country== "SWE" & presus2$Year >1994] <- TRUE
#fifth wave
presus2$is.eu[presus2$Country== "CZE" & presus2$Year >2003] <- TRUE
presus2$is.eu[presus2$Country== "HUN" & presus2$Year >2003] <- TRUE
presus2$is.eu[presus2$Country== "POL" & presus2$Year >2003] <- TRUE
presus2$is.eu[presus2$Country== "EST" & presus2$Year >2003] <- TRUE
presus2$is.eu[presus2$Country== "LVA" & presus2$Year >2003] <- TRUE
presus2$is.eu[presus2$Country== "LTU" & presus2$Year >2003] <- TRUE
presus2$is.eu[presus2$Country== "CYP" & presus2$Year >2003] <- TRUE
presus2$is.eu[presus2$Country== "MLT" & presus2$Year >2003] <- TRUE
presus2$is.eu[presus2$Country== "SVK" & presus2$Year >2003] <- TRUE
presus2$is.eu[presus2$Country== "SVN" & presus2$Year >2003] <- TRUE
#sixth wave
presus2$is.eu[presus2$Country== "BGR" & presus2$Year >2006] <- TRUE
presus2$is.eu[presus2$Country== "ROU" & presus2$Year >2006] <- TRUE
#seventh wave
presus2$is.eu[presus2$Country== "HRV" & presus2$Year >2012] <- TRUE
presrus2 <- presrus
presrus2 <- presrus2 %>% mutate(is.eu = Country %in% EU)
#first wave
presrus2$is.eu[presrus2$Country== "DNK" & presrus2$Year >1972] <- TRUE
presrus2$is.eu[presrus2$Country== "IRL" & presrus2$Year >1972] <- TRUE
presrus2$is.eu[presrus2$Country== "GBR" & presrus2$Year >1972] <- TRUE
#second wave
presrus2$is.eu[presrus2$Country== "GRC" & presrus2$Year >1980] <- TRUE
#third wave
presrus2$is.eu[presrus2$Country== "ESP" & presrus2$Year >1985] <- TRUE
presrus2$is.eu[presrus2$Country== "PRT" & presrus2$Year >1985] <- TRUE
#fourth wave
presrus2$is.eu[presrus2$Country== "AUT" & presrus2$Year >1994] <- TRUE
presrus2$is.eu[presrus2$Country== "FIN" & presrus2$Year >1994] <- TRUE
presrus2$is.eu[presrus2$Country== "SWE" & presrus2$Year >1994] <- TRUE
#fifth wave
presrus2$is.eu[presrus2$Country== "CZE" & presrus2$Year >2003] <- TRUE
presrus2$is.eu[presrus2$Country== "HUN" & presrus2$Year >2003] <- TRUE
presrus2$is.eu[presrus2$Country== "POL" & presrus2$Year >2003] <- TRUE
presrus2$is.eu[presrus2$Country== "EST" & presrus2$Year >2003] <- TRUE
presrus2$is.eu[presrus2$Country== "LVA" & presrus2$Year >2003] <- TRUE
presrus2$is.eu[presrus2$Country== "LTU" & presrus2$Year >2003] <- TRUE
presrus2$is.eu[presrus2$Country== "CYP" & presrus2$Year >2003] <- TRUE
presrus2$is.eu[presrus2$Country== "MLT" & presrus2$Year >2003] <- TRUE
presrus2$is.eu[presrus2$Country== "SVK" & presrus2$Year >2003] <- TRUE
presrus2$is.eu[presrus2$Country== "SVN" & presrus2$Year >2003] <- TRUE
#sixth wave
presrus2$is.eu[presrus2$Country== "BGR" & presrus2$Year >2006] <- TRUE
presrus2$is.eu[presrus2$Country== "ROU" & presrus2$Year >2006] <- TRUE
#seventh wave
presrus2$is.eu[presrus2$Country== "HRV" & presrus2$Year >2012] <- TRUE
presus2 <- mutate(presus2, originals = Country %in% EU)
presus2 <- mutate(presus2, wave1 = Country %in% wave1)
presus2 <- mutate(presus2, wave2 = Country %in% wave2)
presus2 <- mutate(presus2, wave3 = Country %in% wave3)
presus2 <- mutate(presus2, wave4 = Country %in% wave4)
presus2 <- mutate(presus2, wave5 = Country %in% wave5)
presus2 <- mutate(presus2, wave6 = Country %in% wave6)
presus2 <- mutate(presus2, wave7 = Country %in% wave7)
names(presus2)[4] <- "PRESUS_wscore"
names(presrus2)[4] <- "PRESRUS_wscore"
names(presus2)[5] <- "EU"
scores <- full_join(presus2, presrus2, by=c("Country", "Year"))
scores <- mutate(scores, eu9 = originals)
scores$eu9[scores$Country== "DNK" & scores$Year >1972] <- TRUE
scores$eu9[scores$Country== "IRL" & scores$Year >1972] <- TRUE
scores$eu9[scores$Country== "GBR" & scores$Year >1972] <- TRUE
scores <- mutate(scores, eu12 = eu9)
scores$eu12[scores$Country== "GRC" & scores$Year >1980] <- TRUE
scores$eu12[scores$Country== "ESP" & scores$Year >1985] <- TRUE
scores$eu12[scores$Country== "PRT" & scores$Year >1985] <- TRUE
scores <- mutate(scores, eu15 = eu12)
scores$eu15[scores$Country== "AUT" & scores$Year >1994] <- TRUE
scores$eu15[scores$Country== "FIN" & scores$Year >1994] <- TRUE
scores$eu15[scores$Country== "SWE" & scores$Year >1994] <- TRUE
Calculating average scores and standard deviations for EU member states.
eu6 <- filter(scores, originals==TRUE) %>%
group_by( . , Year) %>%
summarise(. , score_presus_eu6 = mean(PRESUS_wscore), sd_presus_eu6 = sd(PRESUS_wscore),
score_presrus_eu6 = mean(PRESRUS_wscore), sd_presrus_eu6 = sd(PRESRUS_wscore))
eu10 <- filter(scores, wave5==TRUE) %>%
group_by( . , Year) %>%
summarise(. , score_presus_eu10 = mean(PRESUS_wscore, na.rm = TRUE), sd_presus_eu10 = sd(PRESUS_wscore, na.rm = TRUE), score_presrus_eu10 = mean(PRESRUS_wscore, na.rm = TRUE), sd_presrus_eu10 = sd(PRESRUS_wscore, na.rm = TRUE))
eu9 <- filter(scores, eu9==TRUE) %>%
group_by( . , Year) %>%
summarise(. , score_presus_eu9 = mean(PRESUS_wscore), sd_presus_eu9 = sd(PRESUS_wscore),
score_presrus_eu9 = mean(PRESRUS_wscore), sd_presrus_eu9 = sd(PRESRUS_wscore))
eu12 <- filter(scores, eu12==TRUE) %>%
group_by( . , Year) %>%
summarise(. , score_presus_eu12 = mean(PRESUS_wscore), sd_presus_eu12 = sd(PRESUS_wscore),
score_presrus_eu12 = mean(PRESRUS_wscore), sd_presrus_eu12 = sd(PRESRUS_wscore))
eu15 <- filter(scores, eu15==TRUE) %>%
group_by( . , Year) %>%
summarise(. , score_presus_eu15 = mean(PRESUS_wscore), sd_presus_eu15 = sd(PRESUS_wscore),
score_presrus_eu15 = mean(PRESRUS_wscore), sd_presrus_eu15 = sd(PRESRUS_wscore))
eu_presus <- summarise(group_by(filter(scores, EU==TRUE), Year),
score_presus = mean(PRESUS_wscore, na.rm = TRUE),
sd_presus = sd(PRESUS_wscore, na.rm = TRUE))
eu_presrus <- summarise(group_by(filter(scores, EU==TRUE), Year),
score_presrus = mean(PRESRUS_wscore, na.rm = TRUE),
sd_presrus = sd(PRESRUS_wscore, na.rm = TRUE))
av_scores <- left_join(eu6, eu9, by="Year" )
av_scores <- left_join(av_scores, eu12, by="Year" )
av_scores <- left_join(av_scores, eu15, by="Year" )
av_scores <- left_join(av_scores, eu10, by="Year" )
av_scores <- left_join(av_scores, eu_presus, by="Year" )
av_scores <- left_join(av_scores, eu_presrus, by="Year" )
Combining files for output:
readr::write_csv(av_scores, "average_estimates_v1_2_jeffreys.csv")
readr::write_csv(scores, "estimates_v1_2_jeffreys.csv")
readr::write_csv(presrus_words, "presrus_words.csv")
readr::write_csv(presus_words, "presus_words.csv")
LS0tCnRpdGxlOiAiRG8gSW50ZXJnb3Zlcm5tZW50YWwgT3JnYW5pemF0aW9ucyBIYXZlIGEgU29jaWFsaXphdGlvbiBFZmZlY3Qgb24gTWVtYmVyIFN0YXRlIFByZWZlcmVuY2VzPyBFdmlkZW5jZSBmcm9tIHRoZSBVTiBHZW5lcmFsIERlYmF0ZSIKYXV0aG9yOgotIGFmZmlsaWF0aW9uOiBMb3VnaGJvcm91Z2ggVW5pdmVyc2l0eQogIGVtYWlsOiBuLmNoZWxvdHRpQGxib3JvLmFjLnVrCiAgbmFtZTogTmljb2xhIENoZWxvdHRpCi0gYWZmaWxpYXRpb246IFVuaXZlcnNpdHkgb2YgQmlybWluZ2hhbQogIGVtYWlsOiBuLmRhc2FuZGlAYmhhbS5hYy51awogIG5hbWU6IE5paGVlciBEYXNhbmRpCi0gYWZmaWxpYXRpb246IERhdGEgU2NpZW5jZSBMYWIgYXQgdGhlIEhlcnRpZSBTY2hvb2wKICBlbWFpbDogamFua2luQGhlcnRpZS1zY2hvb2wub3JnCiAgbmFtZTogU2xhdmEgSmFua2luCmRhdGU6IDI2IE9jdG9iZXIgMjAxOApvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazoKICAgIHRvYzogeWVzCiAgaHRtbF9kb2N1bWVudDogZGVmYXVsdAogIHBkZl9kb2N1bWVudDogCiAgICB0b2M6IHllcwogIHdvcmRfZG9jdW1lbnQ6IAogICAgdG9jOiB5ZXMKI2JpYmxpby1zdHlsZTogYXBzcgojYmlibGlvZ3JhcGh5OiBldS5iaWIKdGhhbmtzOiBGb3J0aGNvbWluZyBpbiBJU1EuCmFic3RyYWN0OiBUaGUgcXVlc3Rpb24gb2Ygd2hldGhlciBJbnRlcmdvdmVybm1lbnRhbCBPcmdhbml6YXRpb25zIChJR09zKSBoYXZlIGEgc29jaWFsaXphdGlvbiBlZmZlY3Qgb24gbWVtYmVyIHN0YXRlIHByZWZlcmVuY2VzIGlzIGNlbnRyYWwgdG8gSW50ZXJuYXRpb25hbCBSZWxhdGlvbnMuIEhvd2V2ZXIsIGVtcGlyaWNhbCBzdHVkaWVzIGhhdmUgc3RydWdnbGVkIHRvIHNlcGFyYXRlIHRoZSBzb2NpYWxpemluZyBlZmZlY3RzIG9mIElHT3Mgb24gcHJlZmVyZW5jZXMgZnJvbSB0aGUgY29lcmNpb24gYW5kIGluY2VudGl2ZXMgYXNzb2NpYXRlZCB3aXRoIElHT3MgdGhhdCBtYXkgbGVhZCB0byBmb3JlaWduIHBvbGljeSBhbGlnbm1lbnQgd2l0aG91dCBhbHRlcmluZyBwcmVmZXJlbmNlcy4gVGhpcyBwYXBlciBhZGRyZXNzZXMgdGhpcyBpc3N1ZS4gV2UgYWRvcHQgYSBub3ZlbCBhcHByb2FjaCB0byBtZWFzdXJpbmcgc3RhdGUgcHJlZmVyZW5jZXMgYnkgYXBwbHlpbmcgdGV4dCBhbmFseXRpYyBtZXRob2RzIHRvIGNvdW50cnkgc3RhdGVtZW50cyBpbiB0aGUgYW5udWFsIFVOIEdlbmVyYWwgRGViYXRlIChVTkdEKS4gVGhlIGFic2VuY2Ugb2YgaW50ZXItc3RhdGUgY29vcmRpbmF0aW9uIHdpdGggVU5HRCBzdGF0ZW1lbnRzIG1ha2VzIHRoZW0gcGFydGljdWxhcmx5IHdlbGwgc3VpdGVkIGZvciB0ZXN0aW5nIHNvY2lhbGl6YXRpb24gZWZmZWN0cyBvbiBzdGF0ZSBwcmVmZXJlbmNlcy4gV2UgZm9jdXMgb24gdGhlIEV1cm9wZWFuIFVuaW9uIChFVSksIGVuYWJsaW5nIHVzIHRvIGluY29ycG9yYXRlIHRoZSBwcmUtYWNjZXNzaW9uIHBlcmlvZCAtLSB3aGVuIHN0YXRlcyBoYXZlIHRoZSBzdHJvbmdlc3QgaW5jZW50aXZlcyBmb3IgZm9yZWlnbiBwb2xpY3kgYWxpZ25tZW50IC0tIGludG8gb3VyIGFuYWx5c2lzLiBUaGUgcmVzdWx0cyBvZiBvdXIgYW5hbHlzaXMgc2hvdyB0aGF0IEVVIG1lbWJlcnNoaXAgaGFzIGEgc29jaWFsaXphdGlvbiBlZmZlY3QgdGhhdCBwcm9kdWNlcyBwcmVmZXJlbmNlIGNvbnZlcmdlbmNlLCBjb250cm9sbGluZyBmb3IgY29lcmNpb24gYW5kIGluY2VudGl2ZSBlZmZlY3RzLiAKLS0tCgoKUXVhbnRlZGEgaXMgbm90b3Jpb3VzbHkgdW5zdGFibGUgaW4gdGVybXMgb2YgZnVuY3Rpb25zIGJlaW5nIHVwZGF0ZWQgZnJlcXVlbnRseSBhbmQgYnJlYWtpbmcgcGlwZWxpbmVzLiBIZW5jZSBoYXJkIHJlcXVpcmluZyBhIHN0YWJsZSB2ZXJzaW9uIG9mIHF1YW50ZWRhIHRoYXQgd2FzIHVzZWQgZm9yIGluaXRpYWwgYW5hbHlzaXMgZm9yIGZ1bGwgcmVwbGljYWJpbGl0eS4KCmBgYHtyIGV2YWw9RkFMU0UsIGluY2x1ZGU9RkFMU0V9CnJlcXVpcmUoZGV2dG9vbHMpCmluc3RhbGxfdmVyc2lvbigicXVhbnRlZGEiLCB2ZXJzaW9uID0gIjEuMi4wIiwgcmVwb3MgPSAiaHR0cDovL2NyYW4udXMuci1wcm9qZWN0Lm9yZyIpCmBgYAoKCmBgYHtyLCBtZXNzYWdlPUZBTFNFfQpsaWJyYXJ5KHJlYWR0ZXh0KQpsaWJyYXJ5KHF1YW50ZWRhKQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShzdG0pCmxpYnJhcnkodGlkeXRleHQpCmxpYnJhcnkoaGF2ZW4pCmxpYnJhcnkoZGF0YS50YWJsZSkKbGlicmFyeShnZ3JpZGdlcykKbGlicmFyeSh2aXJpZGlzKQpgYGAKCgpVTkdEIGRhdGEgYXJlIGF2YWlsYWJsZSBvbiB0aGUgSGFydmFyZCBEYXRhdmVyc2UgYXQgaHR0cHM6Ly9kb2kub3JnLzEwLjc5MTAvRFZOLzBUSlg4WQoKYGBge3J9CgpEQVRBX0RJUiA8LSAifi9Ecm9wYm94L1Jlc2VhcmNoL1VOR0RDIHByb2plY3RzL1VOIERhdGEvIiAKCnVuZ2RfZmlsZXMgPC0gcmVhZHRleHQocGFzdGUwKERBVEFfRElSLCAiVFhULyoiKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3ZhcnNmcm9tID0gImZpbGVuYW1lcyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdnNlcD0iXyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N2YXJuYW1lcyA9IGMoIkNvdW50cnkiLCAiU2Vzc2lvbiIsICJZZWFyIikpCgoKdW5nZF9jb3JwdXMgPC0gY29ycHVzKHVuZ2RfZmlsZXMsIHRleHRfZmllbGQgPSAidGV4dCIpIAoKYGBgCgoKCiNBbmFseXNpcwoKCiMjI1dvcmRzY29yZSBiYXNlZCBwb3NpdGlvbnMKCgpgYGB7ciBFVSBwcmVzaWRlbnQsIGluY2x1ZGU9RkFMU0V9CnByZXNpZGVuY3kgPC0gcmVhZHhsOjpyZWFkX2V4Y2VsKCIuLi9wcmVzaWRlbmN5Lnhsc3giKQoKYGBgCgoKYGBge3IgZHJvcHBpbmcgZmVhdHVyZXN9CnRvayA8LSB0b2tlbnModW5nZF9jb3JwdXMsIHdoYXQgPSAid29yZCIsCiAgICAgICAgICAgICAgcmVtb3ZlX3B1bmN0ID0gVFJVRSwKICAgICAgICAgICAgICByZW1vdmVfc3ltYm9scyA9IFRSVUUsCiAgICAgICAgICAgICAgcmVtb3ZlX251bWJlcnMgPSBUUlVFLAogICAgICAgICAgICAgIHJlbW92ZV90d2l0dGVyID0gVFJVRSwKICAgICAgICAgICAgICByZW1vdmVfdXJsID0gVFJVRSwKICAgICAgICAgICAgICByZW1vdmVfaHlwaGVucyA9IFRSVUUsCiAgICAgICAgICAgICAgdmVyYm9zZSA9IFRSVUUpCgoKZGZtIDwtIGRmbSh0b2ssIAogICAgICAgICAgIHRvbG93ZXIgPSBUUlVFLAogICAgICAgICAgIHJlbW92ZT1zdG9wd29yZHMoImVuZ2xpc2giKSwKICAgICAgICAgICBzdGVtPVRSVUUsIAogICAgICAgICAgIHZlcmJvc2UgPSBUUlVFKQoKCiNSZW1vdmluZyBhbnkgZGlnaXRzLiBgZGZtYCBwaWNrcyB1cCBhbnkgc2VwYXJhdGVkIGRpZ2l0cywgbm90IGRpZ2l0cyB0aGF0IGFyZSBwYXJ0IG9mIHRva2Vucy4KI1JlbW92aW5nIGFueSBwdW5jdHVhdGlvbi4gYGRmbWAgcGlja3MgdXAgYW55IHB1bmN0dWF0aW9uIHVubGVzcyBpdCdzIHBhcnQgb2YgYSB0b2tlbi4KI1JlbW92aW5nIGFueSB0b2tlbnMgbGVzcyB0aGFuIGZvdXIgY2hhcmFjdGVycy4KZGZtLm0gPC0gZGZtX3NlbGVjdChkZm0sIGMoIltcXGQtXSIsICJbWzpwdW5jdDpdXSIsICJeLnsxLDN9JCIpLCBzZWxlY3Rpb24gPSAicmVtb3ZlIiwgCiAgICAgICAgICAgICAgICAgICAgdmFsdWV0eXBlPSJyZWdleCIsIHZlcmJvc2UgPSBUUlVFKQoKI0Ryb3BwaW5nIHdvcmRzIHRoYXQgYXBwZWFyIGxlc3MgdGhhbiA1IHRpbWVzIGFuZCBpbiBsZXNzIHRoYW4gMyBkb2N1bWVudHMuCmRmbS50cmltIDwtIGRmbV90cmltKGRmbS5tLCBtaW5fdGVybWZyZXEgPSA1LCBtaW5fZG9jZnJlcSA9IDMsIHZlcmJvc2UgPSBUUlVFKQoKI2dyb3VwIGRvY3VtZW50cyBieSB5ZWFyIGluIGRmbQpkZm0ueWVhciA8LSBkZm1fZ3JvdXAoZGZtLnRyaW0sIGRmbS50cmltQGRvY3ZhcnMkWWVhcikKCiMgZ2V0IG5hbWVzIG9mIHZhcmlhYmxlcyB0byBiZSBkcm9wcGVkCmRmbS55ZWFyLnRyaW1tZWQgPC0gZGZtX3RyaW0oZGZtLnllYXIsIG1heF9kb2NmcmVxPTEsIHZlcmJvc2UgPSBUUlVFKQpkZi55ZWFyLnRyaW1tZWQgPC0gYXMuZGF0YS5mcmFtZShkZm0ueWVhci50cmltbWVkKQoKdmFyaWFibGVzX2Ryb3AgPC0gbmFtZXMoZGYueWVhci50cmltbWVkKQp2YXJpYWJsZXNfZHJvcCA8LSB2YXJpYWJsZXNfZHJvcFsyOmxlbmd0aCh2YXJpYWJsZXNfZHJvcCldCgoKI2dyb3VwIGRvY3VtZW50cyBieSB5ZWFyIGluIGRmbQpkZm0ueWVhcl9hbGwgPC0gZGZtX2dyb3VwKGRmbS5tLCBkZm1AZG9jdmFycyRZZWFyKQoKIyBnZXQgbmFtZXMgb2YgdmFyaWFibGVzIHRvIGJlIGRyb3BwZWQKZGYueWVhci50cmltbWVkX2FsbCA8LSBhcy5kYXRhLmZyYW1lKGRmbV90cmltKGRmbS55ZWFyX2FsbCwgbWF4X2RvY2ZyZXE9MSkpCgoKYGBgCgoKCgpgYGB7ciBQcmVzaWRlbmN5VVNBLCBpbmNsdWRlPUZBTFNFfQoKcHJlc3VzIDwtIGRhdGEuZnJhbWUoKQoKcHJlc3VzX3dvcmRzIDwtIGRhdGEuZnJhbWUoKQoKZm9yIChpIGluIGMoMTk3MDoyMDE3KSkgewogIAojQ3JlYXRpbmcgY29ycHVzIGZvciBlYWNoIHllYXIKdW5nZGMuaSA8LSBjb3JwdXNfc3Vic2V0KHVuZ2RfY29ycHVzLCBZZWFyPT1pKQoKdG9rIDwtIHRva2Vucyh1bmdkYy5pLCB3aGF0ID0gIndvcmQiLAogICAgICAgICAgICAgIHJlbW92ZV9wdW5jdCA9IFRSVUUsCiAgICAgICAgICAgICAgcmVtb3ZlX3N5bWJvbHMgPSBUUlVFLAogICAgICAgICAgICAgIHJlbW92ZV9udW1iZXJzID0gVFJVRSwKICAgICAgICAgICAgICByZW1vdmVfdHdpdHRlciA9IFRSVUUsCiAgICAgICAgICAgICAgcmVtb3ZlX3VybCA9IFRSVUUsCiAgICAgICAgICAgICAgcmVtb3ZlX2h5cGhlbnMgPSBUUlVFLAogICAgICAgICAgICAgIHZlcmJvc2UgPSBUUlVFKQoKCmRmbSA8LSBkZm0odG9rLCAKICAgICAgICAgICB0b2xvd2VyID0gVFJVRSwKICAgICAgICAgICByZW1vdmU9c3RvcHdvcmRzKCJlbmdsaXNoIiksCiAgICAgICAgICAgc3RlbT1UUlVFLCAKICAgICAgICAgICB2ZXJib3NlID0gVFJVRSkKCgojUmVtb3ZpbmcgYW55IGRpZ2l0cy4gYGRmbWAgcGlja3MgdXAgYW55IHNlcGFyYXRlZCBkaWdpdHMsIG5vdCBkaWdpdHMgdGhhdCBhcmUgcGFydCBvZiB0b2tlbnMuCiNSZW1vdmluZyBhbnkgcHVuY3R1YXRpb24uIGBkZm1gIHBpY2tzIHVwIGFueSBwdW5jdHVhdGlvbiB1bmxlc3MgaXQncyBwYXJ0IG9mIGEgdG9rZW4uCiNSZW1vdmluZyBhbnkgdG9rZW5zIGxlc3MgdGhhbiBmb3VyIGNoYXJhY3RlcnMuCmRmbS5tIDwtIGRmbV9zZWxlY3QoZGZtLCBjKCJbXFxkLV0iLCAiW1s6cHVuY3Q6XV0iLCAiXi57MSwzfSQiKSwgc2VsZWN0aW9uID0gInJlbW92ZSIsIAogICAgICAgICAgICAgICAgICAgIHZhbHVldHlwZT0icmVnZXgiLCB2ZXJib3NlID0gVFJVRSkKCgojRHJvcHBpbmcgd29yZHMgdGhhdCBhcHBlYXIgbGVzcyB0aGFuIDUgdGltZXMgYW5kIGluIGxlc3MgdGhhbiAzIGRvY3VtZW50cy4KZGZtLnRyaW0gPC0gZGZtX3RyaW0oZGZtLm0sIG1pbl90ZXJtZnJlcSA9IDUsIG1pbl9kb2NmcmVxID0gMywgdmVyYm9zZSA9IFRSVUUpCgoKIyBkcm9wcGluZyB3b3JkcyB0aGF0IG9ubHkgYXBwZWFyIGluIG9uZSB5ZWFyCmRmbS50cmltIDwtIGRmbV9zZWxlY3QoZGZtLnRyaW0sIHZhcmlhYmxlc19kcm9wLCBzZWxlY3Rpb24gPSAicmVtb3ZlIiwgdmFsdWV0eXBlPSJmaXhlZCIsIHZlcmJvc2UgPSBUUlVFKQoKCiN0ZmlkZiB3ZWlnaHRpbmcKZGZtLncgPC0gZGZtX3RmaWRmKGRmbS50cmltKQoKCiNob2xkZXJzIGZvciBjb3VudHJ5IG5hbWVzIGluIGRpc3RhbmNlIG1lYXN1cmVzIGJlbG93CnByZXMgPC0gcGFzdGUwKHByZXNpZGVuY3kkQ291bnRyeV9hbHRbcHJlc2lkZW5jeSRZZWFyPT1pXSkKCgojUmVmZXJlbmNlIHNjb3JlcwpyZWZzY29yZXMgPC0gcmVwKE5BLG5yb3coZGZtLncpKQoKcmVmc2NvcmVzW2RmbS53QGRvY3ZhcnMkQ291bnRyeT09IlVTQSJdIDwtIC0xCnJlZnNjb3Jlc1tkZm0ud0Bkb2N2YXJzJENvdW50cnk9PXByZXMgXSA8LSAxCgoKI1dvcmRzY29yZSBtb2RlbAp3cyA8LSB0ZXh0bW9kZWxfd29yZHNjb3JlcyhkZm0udywgcmVmc2NvcmVzLCBzY2FsZT0ibGluZWFyIiwgc21vb3RoPTAuNSkKd29yZHNjb3JlIDwtIHByZWRpY3Qod3MsIHJlc2NhbGluZz0ibm9uZSIpCgojV3JpdGluZyB0aGUgcmVzdWx0cyBpbnRvIGRhdGEgZnJhbWUKd29yZHNjb3Jlcy5pIDwtIGRhdGEuZnJhbWUoY2JpbmQoZG9jdmFycyh1bmdkYy5pKSwgd29yZHNjb3JlKSkKCnByZXN1cyA8LSByYmluZChwcmVzdXMsd29yZHNjb3Jlcy5pKQoKCndvcmRzIDwtIGFzLmRhdGEuZnJhbWUoY29lZih3cykpCndvcmRzJFllYXIgPC0gaQp3b3JkcyR3b3JkcyA8LSByb3cubmFtZXMod29yZHMpCgpoZWFkX3cgPC0gd29yZHMgJT4lIHRvcF9uKDUsIGNvZWYod3MpKQp0YWlsX3cgPC0gd29yZHMgJT4lIHRvcF9uKC01LCBjb2VmKHdzKSkKCndvcmRzLmkgPC0gcmJpbmQoaGVhZF93LCB0YWlsX3cpCgpwcmVzdXNfd29yZHMgPC0gcmJpbmQocHJlc3VzX3dvcmRzLHdvcmRzLmkpCgp9CgpgYGAKCgoKCgoKYGBge3IgUHJlc2lkZW5jeVJ1c3NpYSwgaW5jbHVkZT1GQUxTRX0KI0VVIHByZXNpZGVudAoKcHJlc3J1cyA8LSBkYXRhLmZyYW1lKCkKCnByZXNydXNfd29yZHMgPC0gZGF0YS5mcmFtZSgpCgpmb3IgKGkgaW4gMTk3MToyMDE3KSB7CiAgCiNDcmVhdGluZyBjb3JwdXMgZm9yIGVhY2ggeWVhcgp1bmdkYy5pIDwtIGNvcnB1c19zdWJzZXQodW5nZF9jb3JwdXMsIFllYXI9PWkpCgp0b2sgPC0gdG9rZW5zKHVuZ2RjLmksIHdoYXQgPSAid29yZCIsCiAgICAgICAgICAgICAgcmVtb3ZlX3B1bmN0ID0gVFJVRSwKICAgICAgICAgICAgICByZW1vdmVfc3ltYm9scyA9IFRSVUUsCiAgICAgICAgICAgICAgcmVtb3ZlX251bWJlcnMgPSBUUlVFLAogICAgICAgICAgICAgIHJlbW92ZV90d2l0dGVyID0gVFJVRSwKICAgICAgICAgICAgICByZW1vdmVfdXJsID0gVFJVRSwKICAgICAgICAgICAgICByZW1vdmVfaHlwaGVucyA9IFRSVUUsCiAgICAgICAgICAgICAgdmVyYm9zZSA9IFRSVUUpCgoKZGZtIDwtIGRmbSh0b2ssIAogICAgICAgICAgIHRvbG93ZXIgPSBUUlVFLAogICAgICAgICAgIHJlbW92ZT1zdG9wd29yZHMoImVuZ2xpc2giKSwKICAgICAgICAgICBzdGVtPVRSVUUsIAogICAgICAgICAgIHZlcmJvc2UgPSBUUlVFKQoKI1JlbW92aW5nIGFueSBkaWdpdHMuIGBkZm1gIHBpY2tzIHVwIGFueSBzZXBhcmF0ZWQgZGlnaXRzLCBub3QgZGlnaXRzIHRoYXQgYXJlIHBhcnQgb2YgdG9rZW5zLgojUmVtb3ZpbmcgYW55IHB1bmN0dWF0aW9uLiBgZGZtYCBwaWNrcyB1cCBhbnkgcHVuY3R1YXRpb24gdW5sZXNzIGl0J3MgcGFydCBvZiBhIHRva2VuLgojUmVtb3ZpbmcgYW55IHRva2VucyBsZXNzIHRoYW4gZm91ciBjaGFyYWN0ZXJzLgpkZm0ubSA8LSBkZm1fc2VsZWN0KGRmbSwgYygiW1xcZC1dIiwgIltbOnB1bmN0Ol1dIiwgIl4uezEsM30kIiksIHNlbGVjdGlvbiA9ICJyZW1vdmUiLCAKICAgICAgICAgICAgICAgICAgICB2YWx1ZXR5cGU9InJlZ2V4IiwgdmVyYm9zZSA9IFRSVUUpCgoKI0Ryb3BwaW5nIHdvcmRzIHRoYXQgYXBwZWFyIGxlc3MgdGhhbiA1IHRpbWVzIGFuZCBpbiBsZXNzIHRoYW4gMyBkb2N1bWVudHMuCmRmbS50cmltIDwtIGRmbV90cmltKGRmbS5tLCBtaW5fdGVybWZyZXEgPSA1LCBtaW5fZG9jZnJlcSA9IDMsIHZlcmJvc2UgPSBUUlVFKQoKIyBkcm9wcGluZyB3b3JkcyB0aGF0IG9ubHkgYXBwZWFyIGluIG9uZSB5ZWFyCmRmbS50cmltIDwtIGRmbV9zZWxlY3QoZGZtLnRyaW0sIHZhcmlhYmxlc19kcm9wLCBzZWxlY3Rpb24gPSAicmVtb3ZlIiwgdmFsdWV0eXBlPSJmaXhlZCIsIHZlcmJvc2UgPSBUUlVFKQoKI3RmaWRmIHdlaWdodGluZwpkZm0udyA8LSBkZm1fdGZpZGYoZGZtLnRyaW0pCgojaG9sZGVycyBmb3IgY291bnRyeSBuYW1lcyBpbiBkaXN0YW5jZSBtZWFzdXJlcyBiZWxvdwpwcmVzIDwtIHBhc3RlMChwcmVzaWRlbmN5JENvdW50cnlfYWx0W3ByZXNpZGVuY3kkWWVhcj09aV0pCgoKI1JlZmVyZW5jZSBzY29yZXMKcmVmc2NvcmVzIDwtIHJlcChOQSxucm93KGRmbS53KSkKCnJlZnNjb3Jlc1tkZm0ud0Bkb2N2YXJzJENvdW50cnk9PSJSVVMiXSA8LSAtMQpyZWZzY29yZXNbZGZtLndAZG9jdmFycyRDb3VudHJ5PT1wcmVzIF0gPC0gMQoKI1dvcmRzY29yZSBtb2RlbAp3cyA8LSB0ZXh0bW9kZWxfd29yZHNjb3JlcyhkZm0udywgcmVmc2NvcmVzLCBzY2FsZT0ibGluZWFyIiwgc21vb3RoPTAuNSkKd29yZHNjb3JlIDwtIHByZWRpY3Qod3MsIHJlc2NhbGluZz0ibm9uZSIpCgojV3JpdGluZyB0aGUgcmVzdWx0cyBpbnRvIGRhdGEgZnJhbWUKd29yZHNjb3Jlcy5pIDwtIGRhdGEuZnJhbWUoY2JpbmQoZG9jdmFycyh1bmdkYy5pKSwgd29yZHNjb3JlKSkKCnByZXNydXMgPC0gcmJpbmQocHJlc3J1cyx3b3Jkc2NvcmVzLmkpCgp3b3JkcyA8LSBhcy5kYXRhLmZyYW1lKGNvZWYod3MpKQp3b3JkcyRZZWFyIDwtIGkKd29yZHMkd29yZHMgPC0gcm93Lm5hbWVzKHdvcmRzKQoKaGVhZF93IDwtIHdvcmRzICU+JSB0b3Bfbig1LCBjb2VmKHdzKSkKdGFpbF93IDwtIHdvcmRzICU+JSB0b3BfbigtNSwgY29lZih3cykpCgp3b3Jkcy5pIDwtIHJiaW5kKGhlYWRfdywgdGFpbF93KQoKcHJlc3J1c193b3JkcyA8LSByYmluZChwcmVzcnVzX3dvcmRzLHdvcmRzLmkpCgp9CgpgYGAKCgoKCmBgYHtyfQojTG9naWNhbHMgZm9yIEVVIG1lbWJlciBzdGF0ZXMKRVUgPC0gYygiQkVMIiwgIkZSQSIsICJERVUiLCAiSVRBIiwgIkxVWCIsICJOTEQiKQp3YXZlMSA8LSBjKCJETksiLCAiSVJMIiwgIkdCUiIpCndhdmUyIDwtICJHUkMiIAp3YXZlMyA8LSBjKCJFU1AiLCAiUFJUIikgCndhdmU0IDwtIGMoIkFVVCIsICJGSU4iLCAiU1dFIikgCndhdmU1IDwtIGMoIkNaRSIsICJIVU4iLCAiUE9MIiwgIkVTVCIsICJMVkEiLCAiTFRVIiwgIkNZUCIsICJNTFQiLCAiU1ZLIiwgIlNWTiIpCndhdmU2IDwtIGMoIkJHUiIsICJST1UiKSAKd2F2ZTcgPC0gIkhSViIgCmBgYAoKCgoKCmBgYHtyfQpwcmVzdXMyIDwtIHByZXN1cwoKcHJlc3VzMiA8LSBwcmVzdXMyICU+JSBtdXRhdGUoaXMuZXUgPSBDb3VudHJ5ICVpbiUgRVUpCgpwcmVzdXMyJHdhdmVzIDwtIHByZXN1czIkaXMuZXUKCnByZXN1czIkd2F2ZXMgPC0gcHJlc3VzMiRpcy5ldQoKI2ZpcnN0IHdhdmUKcHJlc3VzMiRpcy5ldVtwcmVzdXMyJENvdW50cnk9PSAiRE5LIiAmIHByZXN1czIkWWVhciA+MTk3Ml0gPC0gVFJVRQpwcmVzdXMyJGlzLmV1W3ByZXN1czIkQ291bnRyeT09ICJJUkwiICYgcHJlc3VzMiRZZWFyID4xOTcyXSA8LSBUUlVFCnByZXN1czIkaXMuZXVbcHJlc3VzMiRDb3VudHJ5PT0gIkdCUiIgJiBwcmVzdXMyJFllYXIgPjE5NzJdIDwtIFRSVUUKCiNzZWNvbmQgd2F2ZQpwcmVzdXMyJGlzLmV1W3ByZXN1czIkQ291bnRyeT09ICJHUkMiICYgcHJlc3VzMiRZZWFyID4xOTgwXSA8LSBUUlVFCgojdGhpcmQgd2F2ZQpwcmVzdXMyJGlzLmV1W3ByZXN1czIkQ291bnRyeT09ICJFU1AiICYgcHJlc3VzMiRZZWFyID4xOTg1XSA8LSBUUlVFCnByZXN1czIkaXMuZXVbcHJlc3VzMiRDb3VudHJ5PT0gIlBSVCIgJiBwcmVzdXMyJFllYXIgPjE5ODVdIDwtIFRSVUUKCiNmb3VydGggd2F2ZQpwcmVzdXMyJGlzLmV1W3ByZXN1czIkQ291bnRyeT09ICJBVVQiICYgcHJlc3VzMiRZZWFyID4xOTk0XSA8LSBUUlVFCnByZXN1czIkaXMuZXVbcHJlc3VzMiRDb3VudHJ5PT0gIkZJTiIgJiBwcmVzdXMyJFllYXIgPjE5OTRdIDwtIFRSVUUKcHJlc3VzMiRpcy5ldVtwcmVzdXMyJENvdW50cnk9PSAiU1dFIiAmIHByZXN1czIkWWVhciA+MTk5NF0gPC0gVFJVRQoKI2ZpZnRoIHdhdmUKcHJlc3VzMiRpcy5ldVtwcmVzdXMyJENvdW50cnk9PSAiQ1pFIiAmIHByZXN1czIkWWVhciA+MjAwM10gPC0gVFJVRQpwcmVzdXMyJGlzLmV1W3ByZXN1czIkQ291bnRyeT09ICJIVU4iICYgcHJlc3VzMiRZZWFyID4yMDAzXSA8LSBUUlVFCnByZXN1czIkaXMuZXVbcHJlc3VzMiRDb3VudHJ5PT0gIlBPTCIgJiBwcmVzdXMyJFllYXIgPjIwMDNdIDwtIFRSVUUKcHJlc3VzMiRpcy5ldVtwcmVzdXMyJENvdW50cnk9PSAiRVNUIiAmIHByZXN1czIkWWVhciA+MjAwM10gPC0gVFJVRQpwcmVzdXMyJGlzLmV1W3ByZXN1czIkQ291bnRyeT09ICJMVkEiICYgcHJlc3VzMiRZZWFyID4yMDAzXSA8LSBUUlVFCnByZXN1czIkaXMuZXVbcHJlc3VzMiRDb3VudHJ5PT0gIkxUVSIgJiBwcmVzdXMyJFllYXIgPjIwMDNdIDwtIFRSVUUKcHJlc3VzMiRpcy5ldVtwcmVzdXMyJENvdW50cnk9PSAiQ1lQIiAmIHByZXN1czIkWWVhciA+MjAwM10gPC0gVFJVRQpwcmVzdXMyJGlzLmV1W3ByZXN1czIkQ291bnRyeT09ICJNTFQiICYgcHJlc3VzMiRZZWFyID4yMDAzXSA8LSBUUlVFCnByZXN1czIkaXMuZXVbcHJlc3VzMiRDb3VudHJ5PT0gIlNWSyIgJiBwcmVzdXMyJFllYXIgPjIwMDNdIDwtIFRSVUUKcHJlc3VzMiRpcy5ldVtwcmVzdXMyJENvdW50cnk9PSAiU1ZOIiAmIHByZXN1czIkWWVhciA+MjAwM10gPC0gVFJVRQoKI3NpeHRoIHdhdmUKcHJlc3VzMiRpcy5ldVtwcmVzdXMyJENvdW50cnk9PSAiQkdSIiAmIHByZXN1czIkWWVhciA+MjAwNl0gPC0gVFJVRQpwcmVzdXMyJGlzLmV1W3ByZXN1czIkQ291bnRyeT09ICJST1UiICYgcHJlc3VzMiRZZWFyID4yMDA2XSA8LSBUUlVFCgojc2V2ZW50aCB3YXZlCnByZXN1czIkaXMuZXVbcHJlc3VzMiRDb3VudHJ5PT0gIkhSViIgJiBwcmVzdXMyJFllYXIgPjIwMTJdIDwtIFRSVUUKYGBgCgoKCgpgYGB7cn0KcHJlc3J1czIgPC0gcHJlc3J1cwoKcHJlc3J1czIgPC0gcHJlc3J1czIgJT4lIG11dGF0ZShpcy5ldSA9IENvdW50cnkgJWluJSBFVSkKCiNmaXJzdCB3YXZlCnByZXNydXMyJGlzLmV1W3ByZXNydXMyJENvdW50cnk9PSAiRE5LIiAmIHByZXNydXMyJFllYXIgPjE5NzJdIDwtIFRSVUUKcHJlc3J1czIkaXMuZXVbcHJlc3J1czIkQ291bnRyeT09ICJJUkwiICYgcHJlc3J1czIkWWVhciA+MTk3Ml0gPC0gVFJVRQpwcmVzcnVzMiRpcy5ldVtwcmVzcnVzMiRDb3VudHJ5PT0gIkdCUiIgJiBwcmVzcnVzMiRZZWFyID4xOTcyXSA8LSBUUlVFCgojc2Vjb25kIHdhdmUKcHJlc3J1czIkaXMuZXVbcHJlc3J1czIkQ291bnRyeT09ICJHUkMiICYgcHJlc3J1czIkWWVhciA+MTk4MF0gPC0gVFJVRQoKI3RoaXJkIHdhdmUKcHJlc3J1czIkaXMuZXVbcHJlc3J1czIkQ291bnRyeT09ICJFU1AiICYgcHJlc3J1czIkWWVhciA+MTk4NV0gPC0gVFJVRQpwcmVzcnVzMiRpcy5ldVtwcmVzcnVzMiRDb3VudHJ5PT0gIlBSVCIgJiBwcmVzcnVzMiRZZWFyID4xOTg1XSA8LSBUUlVFCgojZm91cnRoIHdhdmUKcHJlc3J1czIkaXMuZXVbcHJlc3J1czIkQ291bnRyeT09ICJBVVQiICYgcHJlc3J1czIkWWVhciA+MTk5NF0gPC0gVFJVRQpwcmVzcnVzMiRpcy5ldVtwcmVzcnVzMiRDb3VudHJ5PT0gIkZJTiIgJiBwcmVzcnVzMiRZZWFyID4xOTk0XSA8LSBUUlVFCnByZXNydXMyJGlzLmV1W3ByZXNydXMyJENvdW50cnk9PSAiU1dFIiAmIHByZXNydXMyJFllYXIgPjE5OTRdIDwtIFRSVUUKCiNmaWZ0aCB3YXZlCnByZXNydXMyJGlzLmV1W3ByZXNydXMyJENvdW50cnk9PSAiQ1pFIiAmIHByZXNydXMyJFllYXIgPjIwMDNdIDwtIFRSVUUKcHJlc3J1czIkaXMuZXVbcHJlc3J1czIkQ291bnRyeT09ICJIVU4iICYgcHJlc3J1czIkWWVhciA+MjAwM10gPC0gVFJVRQpwcmVzcnVzMiRpcy5ldVtwcmVzcnVzMiRDb3VudHJ5PT0gIlBPTCIgJiBwcmVzcnVzMiRZZWFyID4yMDAzXSA8LSBUUlVFCnByZXNydXMyJGlzLmV1W3ByZXNydXMyJENvdW50cnk9PSAiRVNUIiAmIHByZXNydXMyJFllYXIgPjIwMDNdIDwtIFRSVUUKcHJlc3J1czIkaXMuZXVbcHJlc3J1czIkQ291bnRyeT09ICJMVkEiICYgcHJlc3J1czIkWWVhciA+MjAwM10gPC0gVFJVRQpwcmVzcnVzMiRpcy5ldVtwcmVzcnVzMiRDb3VudHJ5PT0gIkxUVSIgJiBwcmVzcnVzMiRZZWFyID4yMDAzXSA8LSBUUlVFCnByZXNydXMyJGlzLmV1W3ByZXNydXMyJENvdW50cnk9PSAiQ1lQIiAmIHByZXNydXMyJFllYXIgPjIwMDNdIDwtIFRSVUUKcHJlc3J1czIkaXMuZXVbcHJlc3J1czIkQ291bnRyeT09ICJNTFQiICYgcHJlc3J1czIkWWVhciA+MjAwM10gPC0gVFJVRQpwcmVzcnVzMiRpcy5ldVtwcmVzcnVzMiRDb3VudHJ5PT0gIlNWSyIgJiBwcmVzcnVzMiRZZWFyID4yMDAzXSA8LSBUUlVFCnByZXNydXMyJGlzLmV1W3ByZXNydXMyJENvdW50cnk9PSAiU1ZOIiAmIHByZXNydXMyJFllYXIgPjIwMDNdIDwtIFRSVUUKCiNzaXh0aCB3YXZlCnByZXNydXMyJGlzLmV1W3ByZXNydXMyJENvdW50cnk9PSAiQkdSIiAmIHByZXNydXMyJFllYXIgPjIwMDZdIDwtIFRSVUUKcHJlc3J1czIkaXMuZXVbcHJlc3J1czIkQ291bnRyeT09ICJST1UiICYgcHJlc3J1czIkWWVhciA+MjAwNl0gPC0gVFJVRQoKI3NldmVudGggd2F2ZQpwcmVzcnVzMiRpcy5ldVtwcmVzcnVzMiRDb3VudHJ5PT0gIkhSViIgJiBwcmVzcnVzMiRZZWFyID4yMDEyXSA8LSBUUlVFCmBgYAoKCgpgYGB7cn0KcHJlc3VzMiA8LSAgbXV0YXRlKHByZXN1czIsIG9yaWdpbmFscyA9IENvdW50cnkgJWluJSBFVSkKcHJlc3VzMiA8LSAgbXV0YXRlKHByZXN1czIsIHdhdmUxID0gQ291bnRyeSAlaW4lIHdhdmUxKQpwcmVzdXMyIDwtICBtdXRhdGUocHJlc3VzMiwgd2F2ZTIgPSBDb3VudHJ5ICVpbiUgd2F2ZTIpCnByZXN1czIgPC0gIG11dGF0ZShwcmVzdXMyLCB3YXZlMyA9IENvdW50cnkgJWluJSB3YXZlMykKcHJlc3VzMiA8LSAgbXV0YXRlKHByZXN1czIsIHdhdmU0ID0gQ291bnRyeSAlaW4lIHdhdmU0KQpwcmVzdXMyIDwtICBtdXRhdGUocHJlc3VzMiwgd2F2ZTUgPSBDb3VudHJ5ICVpbiUgd2F2ZTUpCnByZXN1czIgPC0gIG11dGF0ZShwcmVzdXMyLCB3YXZlNiA9IENvdW50cnkgJWluJSB3YXZlNikKcHJlc3VzMiA8LSAgbXV0YXRlKHByZXN1czIsIHdhdmU3ID0gQ291bnRyeSAlaW4lIHdhdmU3KQpgYGAKCgoKYGBge3J9Cm5hbWVzKHByZXN1czIpWzRdIDwtICJQUkVTVVNfd3Njb3JlIgpuYW1lcyhwcmVzcnVzMilbNF0gPC0gIlBSRVNSVVNfd3Njb3JlIgpuYW1lcyhwcmVzdXMyKVs1XSA8LSAiRVUiCgpzY29yZXMgPC0gZnVsbF9qb2luKHByZXN1czIsIHByZXNydXMyLCBieT1jKCJDb3VudHJ5IiwgIlllYXIiKSkKCmBgYAoKCgoKYGBge3J9CnNjb3JlcyA8LSAgbXV0YXRlKHNjb3JlcywgZXU5ID0gb3JpZ2luYWxzKQpzY29yZXMkZXU5W3Njb3JlcyRDb3VudHJ5PT0gIkROSyIgJiBzY29yZXMkWWVhciA+MTk3Ml0gPC0gVFJVRQpzY29yZXMkZXU5W3Njb3JlcyRDb3VudHJ5PT0gIklSTCIgJiBzY29yZXMkWWVhciA+MTk3Ml0gPC0gVFJVRQpzY29yZXMkZXU5W3Njb3JlcyRDb3VudHJ5PT0gIkdCUiIgJiBzY29yZXMkWWVhciA+MTk3Ml0gPC0gVFJVRQoKc2NvcmVzIDwtICBtdXRhdGUoc2NvcmVzLCBldTEyID0gZXU5KQpzY29yZXMkZXUxMltzY29yZXMkQ291bnRyeT09ICJHUkMiICYgc2NvcmVzJFllYXIgPjE5ODBdIDwtIFRSVUUKc2NvcmVzJGV1MTJbc2NvcmVzJENvdW50cnk9PSAiRVNQIiAmIHNjb3JlcyRZZWFyID4xOTg1XSA8LSBUUlVFCnNjb3JlcyRldTEyW3Njb3JlcyRDb3VudHJ5PT0gIlBSVCIgJiBzY29yZXMkWWVhciA+MTk4NV0gPC0gVFJVRQoKc2NvcmVzIDwtICBtdXRhdGUoc2NvcmVzLCBldTE1ID0gZXUxMikKc2NvcmVzJGV1MTVbc2NvcmVzJENvdW50cnk9PSAiQVVUIiAmIHNjb3JlcyRZZWFyID4xOTk0XSA8LSBUUlVFCnNjb3JlcyRldTE1W3Njb3JlcyRDb3VudHJ5PT0gIkZJTiIgJiBzY29yZXMkWWVhciA+MTk5NF0gPC0gVFJVRQpzY29yZXMkZXUxNVtzY29yZXMkQ291bnRyeT09ICJTV0UiICYgc2NvcmVzJFllYXIgPjE5OTRdIDwtIFRSVUUKCmBgYAoKQ2FsY3VsYXRpbmcgYXZlcmFnZSBzY29yZXMgYW5kIHN0YW5kYXJkIGRldmlhdGlvbnMgZm9yIEVVIG1lbWJlciBzdGF0ZXMuCgoKCmBgYHtyfQpldTYgPC0gZmlsdGVyKHNjb3Jlcywgb3JpZ2luYWxzPT1UUlVFKSAlPiUgCiAgZ3JvdXBfYnkoIC4gLCAgWWVhcikgJT4lICAKICBzdW1tYXJpc2UoLiAsIHNjb3JlX3ByZXN1c19ldTYgPSBtZWFuKFBSRVNVU193c2NvcmUpLCBzZF9wcmVzdXNfZXU2ID0gc2QoUFJFU1VTX3dzY29yZSksIAogICAgICAgICAgICBzY29yZV9wcmVzcnVzX2V1NiA9IG1lYW4oUFJFU1JVU193c2NvcmUpLCBzZF9wcmVzcnVzX2V1NiA9IHNkKFBSRVNSVVNfd3Njb3JlKSkKCmV1MTAgPC0gZmlsdGVyKHNjb3Jlcywgd2F2ZTU9PVRSVUUpICU+JSAKICBncm91cF9ieSggLiAsICBZZWFyKSAlPiUgIAogIHN1bW1hcmlzZSguICwgc2NvcmVfcHJlc3VzX2V1MTAgPSBtZWFuKFBSRVNVU193c2NvcmUsIG5hLnJtID0gVFJVRSksIHNkX3ByZXN1c19ldTEwID0gc2QoUFJFU1VTX3dzY29yZSwgbmEucm0gPSBUUlVFKSwgc2NvcmVfcHJlc3J1c19ldTEwID0gbWVhbihQUkVTUlVTX3dzY29yZSwgbmEucm0gPSBUUlVFKSwgc2RfcHJlc3J1c19ldTEwID0gc2QoUFJFU1JVU193c2NvcmUsIG5hLnJtID0gVFJVRSkpCgpldTkgPC0gZmlsdGVyKHNjb3JlcywgZXU5PT1UUlVFKSAlPiUgCiAgZ3JvdXBfYnkoIC4gLCAgWWVhcikgJT4lICAKICBzdW1tYXJpc2UoLiAsIHNjb3JlX3ByZXN1c19ldTkgPSBtZWFuKFBSRVNVU193c2NvcmUpLCBzZF9wcmVzdXNfZXU5ID0gc2QoUFJFU1VTX3dzY29yZSksIAogICAgICAgICAgICBzY29yZV9wcmVzcnVzX2V1OSA9IG1lYW4oUFJFU1JVU193c2NvcmUpLCBzZF9wcmVzcnVzX2V1OSA9IHNkKFBSRVNSVVNfd3Njb3JlKSkKCmV1MTIgPC0gZmlsdGVyKHNjb3JlcywgZXUxMj09VFJVRSkgJT4lIAogIGdyb3VwX2J5KCAuICwgIFllYXIpICU+JSAgCiAgc3VtbWFyaXNlKC4gLCBzY29yZV9wcmVzdXNfZXUxMiA9IG1lYW4oUFJFU1VTX3dzY29yZSksIHNkX3ByZXN1c19ldTEyID0gc2QoUFJFU1VTX3dzY29yZSksIAogICAgICAgICAgICBzY29yZV9wcmVzcnVzX2V1MTIgPSBtZWFuKFBSRVNSVVNfd3Njb3JlKSwgc2RfcHJlc3J1c19ldTEyID0gc2QoUFJFU1JVU193c2NvcmUpKQoKZXUxNSA8LSBmaWx0ZXIoc2NvcmVzLCBldTE1PT1UUlVFKSAlPiUgCiAgZ3JvdXBfYnkoIC4gLCAgWWVhcikgJT4lICAKICBzdW1tYXJpc2UoLiAsIHNjb3JlX3ByZXN1c19ldTE1ID0gbWVhbihQUkVTVVNfd3Njb3JlKSwgc2RfcHJlc3VzX2V1MTUgPSBzZChQUkVTVVNfd3Njb3JlKSwgCiAgICAgICAgICAgIHNjb3JlX3ByZXNydXNfZXUxNSA9IG1lYW4oUFJFU1JVU193c2NvcmUpLCBzZF9wcmVzcnVzX2V1MTUgPSBzZChQUkVTUlVTX3dzY29yZSkpCgpldV9wcmVzdXMgPC0gc3VtbWFyaXNlKGdyb3VwX2J5KGZpbHRlcihzY29yZXMsIEVVPT1UUlVFKSwgWWVhciksIAogICAgICAgICAgICAgICAgICAgICAgc2NvcmVfcHJlc3VzID0gbWVhbihQUkVTVVNfd3Njb3JlLCBuYS5ybSA9IFRSVUUpLCAKICAgICAgICAgICAgICAgICAgICAgIHNkX3ByZXN1cyA9IHNkKFBSRVNVU193c2NvcmUsIG5hLnJtID0gVFJVRSkpCgpldV9wcmVzcnVzIDwtIHN1bW1hcmlzZShncm91cF9ieShmaWx0ZXIoc2NvcmVzLCBFVT09VFJVRSksIFllYXIpLCAKICAgICAgICAgICAgICAgICAgICAgIHNjb3JlX3ByZXNydXMgPSBtZWFuKFBSRVNSVVNfd3Njb3JlLCBuYS5ybSA9IFRSVUUpLCAKICAgICAgICAgICAgICAgICAgICAgIHNkX3ByZXNydXMgPSBzZChQUkVTUlVTX3dzY29yZSwgbmEucm0gPSBUUlVFKSkKCmBgYAoKCmBgYHtyfQphdl9zY29yZXMgPC0gbGVmdF9qb2luKGV1NiwgZXU5LCBieT0iWWVhciIgKQphdl9zY29yZXMgPC0gbGVmdF9qb2luKGF2X3Njb3JlcywgZXUxMiwgYnk9IlllYXIiICkKYXZfc2NvcmVzIDwtIGxlZnRfam9pbihhdl9zY29yZXMsIGV1MTUsIGJ5PSJZZWFyIiApCmF2X3Njb3JlcyA8LSBsZWZ0X2pvaW4oYXZfc2NvcmVzLCBldTEwLCBieT0iWWVhciIgKQphdl9zY29yZXMgPC0gbGVmdF9qb2luKGF2X3Njb3JlcywgZXVfcHJlc3VzLCBieT0iWWVhciIgKQphdl9zY29yZXMgPC0gbGVmdF9qb2luKGF2X3Njb3JlcywgZXVfcHJlc3J1cywgYnk9IlllYXIiICkKCmBgYAoKCkNvbWJpbmluZyBmaWxlcyBmb3Igb3V0cHV0OgoKYGBge3J9CnJlYWRyOjp3cml0ZV9jc3YoYXZfc2NvcmVzLCAiYXZlcmFnZV9lc3RpbWF0ZXNfdjFfMl9qZWZmcmV5cy5jc3YiKQoKcmVhZHI6OndyaXRlX2NzdihzY29yZXMsICAiZXN0aW1hdGVzX3YxXzJfamVmZnJleXMuY3N2IikKCnJlYWRyOjp3cml0ZV9jc3YocHJlc3J1c193b3JkcywgICJwcmVzcnVzX3dvcmRzLmNzdiIpCnJlYWRyOjp3cml0ZV9jc3YocHJlc3VzX3dvcmRzLCAgInByZXN1c193b3Jkcy5jc3YiKQoKYGBgCgoKCgoKCiMjIyMjIyMjIyMjIyMjIyMjIyMjCiMjIyMjIEZpZ3VyZSAxCiMjIyMjIyMjIyMjIyMjIyMjIyMjCgoKCgoKCmBgYHtyfQoKZ2dwbG90KCkgKyAKICBnZW9tX2RlbnNpdHlfcmlkZ2VzX2dyYWRpZW50KGRhdGEgPSBzdWJzZXQoc2NvcmVzLCAoRVU9PVRSVUUgfCBDb3VudHJ5PT0iVVNBIiB8IENvdW50cnk9PSJFVSIpICYgWWVhcjwyMDE1KSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZXMoeD1QUkVTVVNfd3Njb3JlLCB5PSBZZWFyLCBncm91cCA9IFllYXIsICBmaWxsID0gLi54Li4pLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbF9taW5faGVpZ2h0ID0gMC4wMDEsIHNjYWxlID0gNSkgKwogIHNjYWxlX2ZpbGxfdmlyaWRpcyhuYW1lID0gIldvcmRzY29yZSIsIG9wdGlvbiA9ICJDIiwgYWxwaGEgPSAuNSkgKwogIHRoZW1lX2J3KCkgKyB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemU9MTIpKSArCiAgZ2d0aXRsZSgiRVUgKCspIC0gVVNBICgtKSBkaW1lbnNpb24iKSArIAogIHhsYWIoIldvcmRzY29yZSBwb3NpdGlvbnMiKSArIHlsYWIoIlllYXIiKSArCiAgIHNjYWxlX3lfZGlzY3JldGUobGltaXRzID0gYygxOTcwLCAxOTgwLCAxOTkwLCAyMDAwLCAyMDEwLCAyMDE0KSkgCgpnZ3NhdmUoInByZXN1c19kZW5zaXR5X05FVy5wZGYiKQpgYGAKCgoKCmBgYHtyfQoKZ2dwbG90KCkgKyAKICBnZW9tX2RlbnNpdHlfcmlkZ2VzX2dyYWRpZW50KGRhdGEgPSBzdWJzZXQoc2NvcmVzLCAoRVU9PVRSVUUgfCBDb3VudHJ5PT0iUlVTIiB8IENvdW50cnk9PSJFVSIpICYgWWVhcjwyMDE1KSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZXMoeD1QUkVTUlVTX3dzY29yZSwgeT0gWWVhciwgZ3JvdXAgPSBZZWFyLCAgZmlsbCA9IC4ueC4uKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxfbWluX2hlaWdodCA9IDAuMDAxLCBzY2FsZSA9IDUpICsKICBzY2FsZV9maWxsX3ZpcmlkaXMobmFtZSA9ICJXb3Jkc2NvcmUiLCBvcHRpb24gPSAiQyIsIGFscGhhID0gLjUpICsKICB0aGVtZV9idygpICsgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplPTEyKSkgKwogIGdndGl0bGUoIkVVICgrKSAtIFJVUyAoLSkgZGltZW5zaW9uIikgKyAKICB4bGFiKCJXb3Jkc2NvcmUgcG9zaXRpb25zIikgKyB5bGFiKCJZZWFyIikgKwogICBzY2FsZV95X2Rpc2NyZXRlKGxpbWl0cyA9IGMoMTk3MCwgMTk4MCwgMTk5MCwgMjAwMCwgMjAxMCwgMjAxNCkpIAoKZ2dzYXZlKCJwcmVzcnVzX2RlbnNpdHlfTkVXLnBkZiIpCmBgYAoKCgoKCgoKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyMjIyMgRmlndXJlIDQKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKCmBgYHtyfQojUGxvdCBvZiBhdmVyYWdlIHNjb3JlcwpnZ3Bsb3QoZGF0YSA9IGZpbHRlcihzY29yZXMsIHdhdmU1PT1UUlVFICYgWWVhcj4xOTkwKSwgCiAgICAgICBhZXMoeD1ZZWFyLCB5PVBSRVNSVVNfd3Njb3JlLCBncm91cCA9IENvdW50cnksIGNvbG91ciA9IENvdW50cnkpKSArCiAgZ2VvbV9zbW9vdGgoc2U9RkFMU0UpICsKICB5bGFiKCJXb3Jkc2NvcmUiKSArCiAgZ2d0aXRsZSgiRVUgKCspIC0gUnVzc2lhICgtKSBkaW1lbnNpb246IEVVMTAiKSArCiAgdGhlbWVfYncoKQoKZ2dzYXZlKCJTQ09SRV9FVTEwX3ByZXNydXMucGRmIikKYGBgCgoKCmBgYHtyfQojUGxvdCBvZiBhdmVyYWdlIHNjb3JlcwpnZ3Bsb3QoZGF0YSA9IGZpbHRlcihzY29yZXMsIHdhdmU1PT1UUlVFICYgWWVhcj4xOTkwKSwgCiAgICAgICBhZXMoeD1ZZWFyLCB5PVBSRVNVU193c2NvcmUsIGdyb3VwID0gQ291bnRyeSwgY29sb3VyID0gQ291bnRyeSkpICsKICBnZW9tX3Ntb290aChzZT1GQUxTRSkgKwogIHlsYWIoIldvcmRzY29yZSIpICsKICBnZ3RpdGxlKCJFVSAoKykgLSBVU0EgKC0pIGRpbWVuc2lvbjogRVUxMCIpICsKICB0aGVtZV9idygpCgpnZ3NhdmUoIlNDT1JFX0VVMTBfcHJlc3VzLnBkZiIpCmBgYAoKCgoKCgoKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMjIyMjIyBGaWd1cmUgMwojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKYGBge3J9Cgpwb3NpdGl2ZV9jdyA8LSBwcmVzdXNfd29yZHMgJT4lIAogIGZpbHRlcihZZWFyPjE5NzAgJiBZZWFyPDE5OTEpICU+JSAKICBmaWx0ZXIod3M+MCkgJT4lIAogIGFycmFuZ2UoZGVzYyh3cykpICU+JSAKICBkaXN0aW5jdCh3b3JkcywgLmtlZXBfYWxsID0gVFJVRSkKCmdncGxvdChwb3NpdGl2ZV9jd1sxOjMwLCBdLCBhZXMoeCA9IHJlb3JkZXIod29yZHMsIHdzKSwgeSA9IHdzKSkgKwogICAgZ2VvbV9wb2ludCgpICsKICAgIGNvb3JkX2ZsaXAoKSArCiAgICBsYWJzKHggPSBOVUxMLCB5ID0gIldvcmRzY29yZSIpICsgZ2d0aXRsZSgiRVUgKCspIC0gVVNBICgtKTogQ29sZCBXYXIgUGVyaW9kIikgKwogIHRoZW1lX2J3KCkKCmdnc2F2ZSgiUFJFU1VTX3Bvc2l0aXZlX0NXLnBkZiIpCgpwb3NpdGl2ZV9wY3cgPC0gcHJlc3VzX3dvcmRzICU+JSAKICBmaWx0ZXIoWWVhcj4xOTkwICYgWWVhcjwyMDE1KSAlPiUgCiAgZmlsdGVyKHdzPjApICU+JSAKICBhcnJhbmdlKGRlc2Mod3MpKSAlPiUgCiAgZGlzdGluY3Qod29yZHMsIC5rZWVwX2FsbCA9IFRSVUUpCgpnZ3Bsb3QocG9zaXRpdmVfcGN3WzE6MzAsIF0sIGFlcyh4ID0gcmVvcmRlcih3b3Jkcywgd3MpLCB5ID0gd3MpKSArCiAgICBnZW9tX3BvaW50KCkgKwogICAgY29vcmRfZmxpcCgpICsKICAgIGxhYnMoeCA9IE5VTEwsIHkgPSAiV29yZHNjb3JlIikgKyBnZ3RpdGxlKCJFVSAoKykgLSBVU0EgKC0pOiBQb3N0LUNvbGQgV2FyIFBlcmlvZCIpICsKICB0aGVtZV9idygpCgpnZ3NhdmUoIlBSRVNVU19wb3NpdGl2ZV9QQ1cucGRmIikKCgoKbmVnYXRpdmVfY3cgPC0gcHJlc3VzX3dvcmRzICU+JSAKICBmaWx0ZXIoWWVhcj4xOTcwICYgWWVhcjwxOTkxKSAlPiUgCiAgZmlsdGVyKHdzPDApICU+JSAKICBhcnJhbmdlKGRlc2MoLXdzKSkgJT4lIAogIGRpc3RpbmN0KHdvcmRzLCAua2VlcF9hbGwgPSBUUlVFKQoKCmdncGxvdChuZWdhdGl2ZV9jd1sxOjMwLCBdLCBhZXMoeCA9IHJlb3JkZXIod29yZHMsIC13cyksIHkgPSB3cykpICsKICAgIGdlb21fcG9pbnQoKSArCiAgICBjb29yZF9mbGlwKCkgKwogICAgbGFicyh4ID0gTlVMTCwgeSA9ICJXb3Jkc2NvcmUiKSArIGdndGl0bGUoIkVVICgrKSAtIFVTQSAoLSk6IDogQ29sZCBXYXIgUGVyaW9kIikgKwogIHRoZW1lX2J3KCkKCmdnc2F2ZSgiUFJFU1VTX25lZ2F0aXZlX0NXLnBkZiIpCgoKbmVnYXRpdmVfcGN3IDwtIHByZXN1c193b3JkcyAlPiUgCiAgZmlsdGVyKFllYXI+MTk5MCAmIFllYXI8MjAxNSkgJT4lIAogIGZpbHRlcih3czwwKSAlPiUgCiAgYXJyYW5nZShkZXNjKC13cykpICU+JSAKICBkaXN0aW5jdCh3b3JkcywgLmtlZXBfYWxsID0gVFJVRSkKCgpnZ3Bsb3QobmVnYXRpdmVfcGN3WzE6MzAsIF0sIGFlcyh4ID0gcmVvcmRlcih3b3JkcywgLXdzKSwgeSA9IHdzKSkgKwogICAgZ2VvbV9wb2ludCgpICsKICAgIGNvb3JkX2ZsaXAoKSArCiAgICBsYWJzKHggPSBOVUxMLCB5ID0gIldvcmRzY29yZSIpICsgZ2d0aXRsZSgiRVUgKCspIC0gVVNBICgtKTogOiBQb3N0LUNvbGQgV2FyIFBlcmlvZCIpICsKICB0aGVtZV9idygpCgpnZ3NhdmUoIlBSRVNVU19uZWdhdGl2ZV9QQ1cucGRmIikKCgpgYGAKCgoKCgoKCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIyMjIyMgRmlndXJlcyA2LTEwIFN1cHBsZW1lbnRhcnkgTWF0ZXJpYWxzCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgoKCmBgYHtyfQoKcG9zaXRpdmVfYW5udWFsIDwtIHByZXN1c193b3JkcyAlPiUgCiAgZmlsdGVyKFllYXI+MTk3MCAmIFllYXI8MTk4MSkgJT4lIAogIGZpbHRlcih3cz4wKSAlPiUgCiAgYXJyYW5nZShZZWFyLCBkZXNjKHdzKSkgCgpnZ3Bsb3QocG9zaXRpdmVfYW5udWFsLCBhZXMoeCA9IHJlb3JkZXIod29yZHMsIHdzKSwgeSA9IHdzKSkgKwogICAgZ2VvbV9wb2ludCgpICsKICAgIGNvb3JkX2ZsaXAoKSArCiAgZmFjZXRfZ3JpZChjb2xzID0gdmFycyhZZWFyKSkgKwogICAgbGFicyh4ID0gTlVMTCwgeSA9ICJXb3Jkc2NvcmUiKSArIGdndGl0bGUoIkVVICgrKSAtIFVTQSAoLSk6IDE5NzEtMTk4MCIpICsKICB0aGVtZV9idygpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCBoanVzdCA9IDEsIHZqdXN0ID0gMC41KSkgCgpnZ3NhdmUoIlBSRVNVU19wb3NpdGl2ZV8xOTcxLTE5ODAucGRmIikKCnBvc2l0aXZlX2FubnVhbCA8LSBwcmVzdXNfd29yZHMgJT4lIAogIGZpbHRlcihZZWFyPjE5ODAgJiBZZWFyPDE5OTEpICU+JSAKICBmaWx0ZXIod3M+MCkgJT4lIAogIGFycmFuZ2UoWWVhciwgZGVzYyh3cykpIAoKZ2dwbG90KHBvc2l0aXZlX2FubnVhbCwgYWVzKHggPSByZW9yZGVyKHdvcmRzLCB3cyksIHkgPSB3cykpICsKICAgIGdlb21fcG9pbnQoKSArCiAgICBjb29yZF9mbGlwKCkgKwogIGZhY2V0X2dyaWQoY29scyA9IHZhcnMoWWVhcikpICsKICAgIGxhYnMoeCA9IE5VTEwsIHkgPSAiV29yZHNjb3JlIikgKyBnZ3RpdGxlKCJFVSAoKykgLSBVU0EgKC0pOiAxOTgxLTE5OTAiKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgaGp1c3QgPSAxLCB2anVzdCA9IDAuNSkpIAoKZ2dzYXZlKCJQUkVTVVNfcG9zaXRpdmVfMTk4MS0xOTkwLnBkZiIpCgoKCnBvc2l0aXZlX2FubnVhbCA8LSBwcmVzdXNfd29yZHMgJT4lIAogIGZpbHRlcihZZWFyPjE5OTAgJiBZZWFyPDIwMDEpICU+JSAKICBmaWx0ZXIod3M+MCkgJT4lIAogIGFycmFuZ2UoWWVhciwgZGVzYyh3cykpIAoKZ2dwbG90KHBvc2l0aXZlX2FubnVhbCwgYWVzKHggPSByZW9yZGVyKHdvcmRzLCB3cyksIHkgPSB3cykpICsKICAgIGdlb21fcG9pbnQoKSArCiAgICBjb29yZF9mbGlwKCkgKwogIGZhY2V0X2dyaWQoY29scyA9IHZhcnMoWWVhcikpICsKICAgIGxhYnMoeCA9IE5VTEwsIHkgPSAiV29yZHNjb3JlIikgKyBnZ3RpdGxlKCJFVSAoKykgLSBVU0EgKC0pOiAxOTkxLTIwMDAiKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgaGp1c3QgPSAxLCB2anVzdCA9IDAuNSkpIAoKZ2dzYXZlKCJQUkVTVVNfcG9zaXRpdmVfMTk5MS0yMDAwLnBkZiIpCgoKcG9zaXRpdmVfYW5udWFsIDwtIHByZXN1c193b3JkcyAlPiUgCiAgZmlsdGVyKFllYXI+MjAwMCAmIFllYXI8MjAxMSkgJT4lIAogIGZpbHRlcih3cz4wKSAlPiUgCiAgYXJyYW5nZShZZWFyLCBkZXNjKHdzKSkgCgpnZ3Bsb3QocG9zaXRpdmVfYW5udWFsLCBhZXMoeCA9IHJlb3JkZXIod29yZHMsIHdzKSwgeSA9IHdzKSkgKwogICAgZ2VvbV9wb2ludCgpICsKICAgIGNvb3JkX2ZsaXAoKSArCiAgZmFjZXRfZ3JpZChjb2xzID0gdmFycyhZZWFyKSkgKwogICAgbGFicyh4ID0gTlVMTCwgeSA9ICJXb3Jkc2NvcmUiKSArIGdndGl0bGUoIkVVICgrKSAtIFVTQSAoLSk6IDIwMDEtMjAxMCIpICsKICB0aGVtZV9idygpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCBoanVzdCA9IDEsIHZqdXN0ID0gMC41KSkgCgpnZ3NhdmUoIlBSRVNVU19wb3NpdGl2ZV8yMDAxLTIwMTAucGRmIikKCgoKcG9zaXRpdmVfYW5udWFsIDwtIHByZXN1c193b3JkcyAlPiUgCiAgZmlsdGVyKFllYXI+MjAxMCAmIFllYXI8MjAxNSkgJT4lIAogIGZpbHRlcih3cz4wKSAlPiUgCiAgYXJyYW5nZShZZWFyLCBkZXNjKHdzKSkgCgpnZ3Bsb3QocG9zaXRpdmVfYW5udWFsLCBhZXMoeCA9IHJlb3JkZXIod29yZHMsIHdzKSwgeSA9IHdzKSkgKwogICAgZ2VvbV9wb2ludCgpICsKICAgIGNvb3JkX2ZsaXAoKSArCiAgZmFjZXRfZ3JpZChjb2xzID0gdmFycyhZZWFyKSkgKwogICAgbGFicyh4ID0gTlVMTCwgeSA9ICJXb3Jkc2NvcmUiKSArIGdndGl0bGUoIkVVICgrKSAtIFVTQSAoLSk6IDIwMTEtMjAxNCIpICsKICB0aGVtZV9idygpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCBoanVzdCA9IDEsIHZqdXN0ID0gMC41KSkgCgpnZ3NhdmUoIlBSRVNVU19wb3NpdGl2ZV8yMDExLTIwMTQucGRmIikKCgoKCiMjIyMjIyMjIyMjIyMjIyMjIyMgbmVnYXRpdmUKCm5lZ2F0aXZlX2FubnVhbCA8LSBwcmVzdXNfd29yZHMgJT4lIAogIGZpbHRlcihZZWFyPjE5NzAgJiBZZWFyPDE5ODEpICU+JSAKICBmaWx0ZXIod3M8MCkgJT4lIAogIGFycmFuZ2UoWWVhciwgZGVzYygtd3MpKSAKCmdncGxvdChuZWdhdGl2ZV9hbm51YWwsIGFlcyh4ID0gcmVvcmRlcih3b3JkcywgLXdzKSwgeSA9IHdzKSkgKwogICAgZ2VvbV9wb2ludCgpICsKICAgIGNvb3JkX2ZsaXAoKSArCiAgZmFjZXRfZ3JpZChjb2xzID0gdmFycyhZZWFyKSkgKwogICAgbGFicyh4ID0gTlVMTCwgeSA9ICJXb3Jkc2NvcmUiKSArIGdndGl0bGUoIkVVICgrKSAtIFVTQSAoLSk6IDE5NzEtMTk4MCIpICsKICB0aGVtZV9idygpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCBoanVzdCA9IDEsIHZqdXN0ID0gMC41KSkgCgpnZ3NhdmUoIlBSRVNVU19uZWdhdGl2ZV8xOTcxLTE5ODAucGRmIikKCm5lZ2F0aXZlX2FubnVhbCA8LSBwcmVzdXNfd29yZHMgJT4lIAogIGZpbHRlcihZZWFyPjE5ODAgJiBZZWFyPDE5OTEpICU+JSAKICBmaWx0ZXIod3M8MCkgJT4lIAogIGFycmFuZ2UoWWVhciwgZGVzYygtd3MpKSAKCmdncGxvdChuZWdhdGl2ZV9hbm51YWwsIGFlcyh4ID0gcmVvcmRlcih3b3JkcywgLXdzKSwgeSA9IHdzKSkgKwogICAgZ2VvbV9wb2ludCgpICsKICAgIGNvb3JkX2ZsaXAoKSArCiAgZmFjZXRfZ3JpZChjb2xzID0gdmFycyhZZWFyKSkgKwogICAgbGFicyh4ID0gTlVMTCwgeSA9ICJXb3Jkc2NvcmUiKSArIGdndGl0bGUoIkVVICgrKSAtIFVTQSAoLSk6IDE5ODEtMTk5MCIpICsKICB0aGVtZV9idygpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCBoanVzdCA9IDEsIHZqdXN0ID0gMC41KSkgCgpnZ3NhdmUoIlBSRVNVU19uZWdhdGl2ZV8xOTgxLTE5OTAucGRmIikKCgoKbmVnYXRpdmVfYW5udWFsIDwtIHByZXN1c193b3JkcyAlPiUgCiAgZmlsdGVyKFllYXI+MTk5MCAmIFllYXI8MjAwMSkgJT4lIAogIGZpbHRlcih3czwwKSAlPiUgCiAgYXJyYW5nZShZZWFyLCBkZXNjKC13cykpIAoKZ2dwbG90KG5lZ2F0aXZlX2FubnVhbCwgYWVzKHggPSByZW9yZGVyKHdvcmRzLCAtd3MpLCB5ID0gd3MpKSArCiAgICBnZW9tX3BvaW50KCkgKwogICAgY29vcmRfZmxpcCgpICsKICBmYWNldF9ncmlkKGNvbHMgPSB2YXJzKFllYXIpKSArCiAgICBsYWJzKHggPSBOVUxMLCB5ID0gIldvcmRzY29yZSIpICsgZ2d0aXRsZSgiRVUgKCspIC0gVVNBICgtKTogMTk5MS0yMDAwIikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIGhqdXN0ID0gMSwgdmp1c3QgPSAwLjUpKSAKCmdnc2F2ZSgiUFJFU1VTX25lZ2F0aXZlXzE5OTEtMjAwMC5wZGYiKQoKCm5lZ2F0aXZlX2FubnVhbCA8LSBwcmVzdXNfd29yZHMgJT4lIAogIGZpbHRlcihZZWFyPjIwMDAgJiBZZWFyPDIwMTEpICU+JSAKICBmaWx0ZXIod3M8MCkgJT4lIAogIGFycmFuZ2UoWWVhciwgZGVzYygtd3MpKSAKCmdncGxvdChuZWdhdGl2ZV9hbm51YWwsIGFlcyh4ID0gcmVvcmRlcih3b3JkcywgLXdzKSwgeSA9IHdzKSkgKwogICAgZ2VvbV9wb2ludCgpICsKICAgIGNvb3JkX2ZsaXAoKSArCiAgZmFjZXRfZ3JpZChjb2xzID0gdmFycyhZZWFyKSkgKwogICAgbGFicyh4ID0gTlVMTCwgeSA9ICJXb3Jkc2NvcmUiKSArIGdndGl0bGUoIkVVICgrKSAtIFVTQSAoLSk6IDIwMDEtMjAxMCIpICsKICB0aGVtZV9idygpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCBoanVzdCA9IDEsIHZqdXN0ID0gMC41KSkgCgpnZ3NhdmUoIlBSRVNVU19uZWdhdGl2ZV8yMDAxLTIwMTAucGRmIikKCgoKbmVnYXRpdmVfYW5udWFsIDwtIHByZXN1c193b3JkcyAlPiUgCiAgZmlsdGVyKFllYXI+MjAxMCAmIFllYXI8MjAxNSkgJT4lIAogIGZpbHRlcih3czwwKSAlPiUgCiAgYXJyYW5nZShZZWFyLCBkZXNjKC13cykpIAoKZ2dwbG90KG5lZ2F0aXZlX2FubnVhbCwgYWVzKHggPSByZW9yZGVyKHdvcmRzLCAtd3MpLCB5ID0gd3MpKSArCiAgICBnZW9tX3BvaW50KCkgKwogICAgY29vcmRfZmxpcCgpICsKICBmYWNldF9ncmlkKGNvbHMgPSB2YXJzKFllYXIpKSArCiAgICBsYWJzKHggPSBOVUxMLCB5ID0gIldvcmRzY29yZSIpICsgZ2d0aXRsZSgiRVUgKCspIC0gVVNBICgtKTogMjAxMS0yMDE0IikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIGhqdXN0ID0gMSwgdmp1c3QgPSAwLjUpKSAKCmdnc2F2ZSgiUFJFU1VTX25lZ2F0aXZlXzIwMTEtMjAxNC5wZGYiKQoKCgpgYGAKCgoKCgoKCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIyMjIyMgRmlndXJlIDIKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCmBgYHtyfQoKcG9zaXRpdmVfY3cgPC0gcHJlc3J1c193b3JkcyAlPiUgCiAgZmlsdGVyKFllYXI+MTk3MCAmIFllYXI8MTk5MSkgJT4lIAogIGZpbHRlcih3cz4wKSAlPiUgCiAgYXJyYW5nZShkZXNjKHdzKSkgJT4lIAogIGRpc3RpbmN0KHdvcmRzLCAua2VlcF9hbGwgPSBUUlVFKQoKZ2dwbG90KHBvc2l0aXZlX2N3WzE6MzAsIF0sIGFlcyh4ID0gcmVvcmRlcih3b3Jkcywgd3MpLCB5ID0gd3MpKSArCiAgICBnZW9tX3BvaW50KCkgKwogICAgY29vcmRfZmxpcCgpICsKICAgIGxhYnMoeCA9IE5VTEwsIHkgPSAiV29yZHNjb3JlIikgKyBnZ3RpdGxlKCJFVSAoKykgLSBSVVMgKC0pOiBDb2xkIFdhciBQZXJpb2QiKSArCiAgdGhlbWVfYncoKQoKZ2dzYXZlKCJQUkVTUlVTX3Bvc2l0aXZlX0NXLnBkZiIpCgpwb3NpdGl2ZV9wY3cgPC0gcHJlc3J1c193b3JkcyAlPiUgCiAgZmlsdGVyKFllYXI+MTk5MCAmIFllYXI8MjAxNSkgJT4lIAogIGZpbHRlcih3cz4wKSAlPiUgCiAgYXJyYW5nZShkZXNjKHdzKSkgJT4lIAogIGRpc3RpbmN0KHdvcmRzLCAua2VlcF9hbGwgPSBUUlVFKQoKZ2dwbG90KHBvc2l0aXZlX3Bjd1sxOjMwLCBdLCBhZXMoeCA9IHJlb3JkZXIod29yZHMsIHdzKSwgeSA9IHdzKSkgKwogICAgZ2VvbV9wb2ludCgpICsKICAgIGNvb3JkX2ZsaXAoKSArCiAgICBsYWJzKHggPSBOVUxMLCB5ID0gIldvcmRzY29yZSIpICsgZ2d0aXRsZSgiRVUgKCspIC0gUlVTICgtKTogUG9zdC1Db2xkIFdhciBQZXJpb2QiKSArCiAgdGhlbWVfYncoKQoKZ2dzYXZlKCJQUkVTUlVTX3Bvc2l0aXZlX1BDVy5wZGYiKQoKCgpuZWdhdGl2ZV9jdyA8LSBwcmVzcnVzX3dvcmRzICU+JSAKICBmaWx0ZXIoWWVhcj4xOTcwICYgWWVhcjwxOTkxKSAlPiUgCiAgZmlsdGVyKHdzPDApICU+JSAKICBhcnJhbmdlKGRlc2MoLXdzKSkgJT4lIAogIGRpc3RpbmN0KHdvcmRzLCAua2VlcF9hbGwgPSBUUlVFKQoKCmdncGxvdChuZWdhdGl2ZV9jd1sxOjMwLCBdLCBhZXMoeCA9IHJlb3JkZXIod29yZHMsIC13cyksIHkgPSB3cykpICsKICAgIGdlb21fcG9pbnQoKSArCiAgICBjb29yZF9mbGlwKCkgKwogICAgbGFicyh4ID0gTlVMTCwgeSA9ICJXb3Jkc2NvcmUiKSArIGdndGl0bGUoIkVVICgrKSAtIFJVUyAoLSk6IDogQ29sZCBXYXIgUGVyaW9kIikgKwogIHRoZW1lX2J3KCkKCmdnc2F2ZSgiUFJFU1JVU19uZWdhdGl2ZV9DVy5wZGYiKQoKCm5lZ2F0aXZlX3BjdyA8LSBwcmVzcnVzX3dvcmRzICU+JSAKICBmaWx0ZXIoWWVhcj4xOTkwICYgWWVhcjwyMDE1KSAlPiUgCiAgZmlsdGVyKHdzPDApICU+JSAKICBhcnJhbmdlKGRlc2MoLXdzKSkgJT4lIAogIGRpc3RpbmN0KHdvcmRzLCAua2VlcF9hbGwgPSBUUlVFKQoKCmdncGxvdChuZWdhdGl2ZV9wY3dbMTozMCwgXSwgYWVzKHggPSByZW9yZGVyKHdvcmRzLCAtd3MpLCB5ID0gd3MpKSArCiAgICBnZW9tX3BvaW50KCkgKwogICAgY29vcmRfZmxpcCgpICsKICAgIGxhYnMoeCA9IE5VTEwsIHkgPSAiV29yZHNjb3JlIikgKyBnZ3RpdGxlKCJFVSAoKykgLSBSVVMgKC0pOiA6IFBvc3QtQ29sZCBXYXIgUGVyaW9kIikgKwogIHRoZW1lX2J3KCkKCmdnc2F2ZSgiUFJFU1JVU19uZWdhdGl2ZV9QQ1cucGRmIikKCgpgYGAKCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIyMjIyMgRmlndXJlcyAxLTUgU3VwcGxlbWVudGFyeSBNYXRlcmlhbHMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCmBgYHtyfQoKcG9zaXRpdmVfYW5udWFsIDwtIHByZXNydXNfd29yZHMgJT4lIAogIGZpbHRlcihZZWFyPjE5NzAgJiBZZWFyPDE5ODEpICU+JSAKICBmaWx0ZXIod3M+MCkgJT4lIAogIGFycmFuZ2UoWWVhciwgZGVzYyh3cykpIAoKZ2dwbG90KHBvc2l0aXZlX2FubnVhbCwgYWVzKHggPSByZW9yZGVyKHdvcmRzLCB3cyksIHkgPSB3cykpICsKICAgIGdlb21fcG9pbnQoKSArCiAgICBjb29yZF9mbGlwKCkgKwogIGZhY2V0X2dyaWQoY29scyA9IHZhcnMoWWVhcikpICsKICAgIGxhYnMoeCA9IE5VTEwsIHkgPSAiV29yZHNjb3JlIikgKyBnZ3RpdGxlKCJFVSAoKykgLSBSVVMgKC0pOiAxOTcxLTE5ODAiKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgaGp1c3QgPSAxLCB2anVzdCA9IDAuNSkpIAoKZ2dzYXZlKCJwcmVzcnVzX3Bvc2l0aXZlXzE5NzEtMTk4MC5wZGYiKQoKcG9zaXRpdmVfYW5udWFsIDwtIHByZXNydXNfd29yZHMgJT4lIAogIGZpbHRlcihZZWFyPjE5ODAgJiBZZWFyPDE5OTEpICU+JSAKICBmaWx0ZXIod3M+MCkgJT4lIAogIGFycmFuZ2UoWWVhciwgZGVzYyh3cykpIAoKZ2dwbG90KHBvc2l0aXZlX2FubnVhbCwgYWVzKHggPSByZW9yZGVyKHdvcmRzLCB3cyksIHkgPSB3cykpICsKICAgIGdlb21fcG9pbnQoKSArCiAgICBjb29yZF9mbGlwKCkgKwogIGZhY2V0X2dyaWQoY29scyA9IHZhcnMoWWVhcikpICsKICAgIGxhYnMoeCA9IE5VTEwsIHkgPSAiV29yZHNjb3JlIikgKyBnZ3RpdGxlKCJFVSAoKykgLSBSVVMgKC0pOiAxOTgxLTE5OTAiKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgaGp1c3QgPSAxLCB2anVzdCA9IDAuNSkpIAoKZ2dzYXZlKCJwcmVzcnVzX3Bvc2l0aXZlXzE5ODEtMTk5MC5wZGYiKQoKCgpwb3NpdGl2ZV9hbm51YWwgPC0gcHJlc3J1c193b3JkcyAlPiUgCiAgZmlsdGVyKFllYXI+MTk5MCAmIFllYXI8MjAwMSkgJT4lIAogIGZpbHRlcih3cz4wKSAlPiUgCiAgYXJyYW5nZShZZWFyLCBkZXNjKHdzKSkgCgpnZ3Bsb3QocG9zaXRpdmVfYW5udWFsLCBhZXMoeCA9IHJlb3JkZXIod29yZHMsIHdzKSwgeSA9IHdzKSkgKwogICAgZ2VvbV9wb2ludCgpICsKICAgIGNvb3JkX2ZsaXAoKSArCiAgZmFjZXRfZ3JpZChjb2xzID0gdmFycyhZZWFyKSkgKwogICAgbGFicyh4ID0gTlVMTCwgeSA9ICJXb3Jkc2NvcmUiKSArIGdndGl0bGUoIkVVICgrKSAtIFJVUyAoLSk6IDE5OTEtMjAwMCIpICsKICB0aGVtZV9idygpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCBoanVzdCA9IDEsIHZqdXN0ID0gMC41KSkgCgpnZ3NhdmUoInByZXNydXNfcG9zaXRpdmVfMTk5MS0yMDAwLnBkZiIpCgoKcG9zaXRpdmVfYW5udWFsIDwtIHByZXNydXNfd29yZHMgJT4lIAogIGZpbHRlcihZZWFyPjIwMDAgJiBZZWFyPDIwMTEpICU+JSAKICBmaWx0ZXIod3M+MCkgJT4lIAogIGFycmFuZ2UoWWVhciwgZGVzYyh3cykpIAoKZ2dwbG90KHBvc2l0aXZlX2FubnVhbCwgYWVzKHggPSByZW9yZGVyKHdvcmRzLCB3cyksIHkgPSB3cykpICsKICAgIGdlb21fcG9pbnQoKSArCiAgICBjb29yZF9mbGlwKCkgKwogIGZhY2V0X2dyaWQoY29scyA9IHZhcnMoWWVhcikpICsKICAgIGxhYnMoeCA9IE5VTEwsIHkgPSAiV29yZHNjb3JlIikgKyBnZ3RpdGxlKCJFVSAoKykgLSBSVVMgKC0pOiAyMDAxLTIwMTAiKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgaGp1c3QgPSAxLCB2anVzdCA9IDAuNSkpIAoKZ2dzYXZlKCJwcmVzcnVzX3Bvc2l0aXZlXzIwMDEtMjAxMC5wZGYiKQoKCgpwb3NpdGl2ZV9hbm51YWwgPC0gcHJlc3J1c193b3JkcyAlPiUgCiAgZmlsdGVyKFllYXI+MjAxMCAmIFllYXI8MjAxNSkgJT4lIAogIGZpbHRlcih3cz4wKSAlPiUgCiAgYXJyYW5nZShZZWFyLCBkZXNjKHdzKSkgCgpnZ3Bsb3QocG9zaXRpdmVfYW5udWFsLCBhZXMoeCA9IHJlb3JkZXIod29yZHMsIHdzKSwgeSA9IHdzKSkgKwogICAgZ2VvbV9wb2ludCgpICsKICAgIGNvb3JkX2ZsaXAoKSArCiAgZmFjZXRfZ3JpZChjb2xzID0gdmFycyhZZWFyKSkgKwogICAgbGFicyh4ID0gTlVMTCwgeSA9ICJXb3Jkc2NvcmUiKSArIGdndGl0bGUoIkVVICgrKSAtIFJVUyAoLSk6IDIwMTEtMjAxNCIpICsKICB0aGVtZV9idygpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCBoanVzdCA9IDEsIHZqdXN0ID0gMC41KSkgCgpnZ3NhdmUoInByZXNydXNfcG9zaXRpdmVfMjAxMS0yMDE0LnBkZiIpCgoKCgojIyMjIyMjIyMjIyMjIyMjIyMjIG5lZ2F0aXZlCgpuZWdhdGl2ZV9hbm51YWwgPC0gcHJlc3J1c193b3JkcyAlPiUgCiAgZmlsdGVyKFllYXI+MTk3MCAmIFllYXI8MTk4MSkgJT4lIAogIGZpbHRlcih3czwwKSAlPiUgCiAgYXJyYW5nZShZZWFyLCBkZXNjKC13cykpIAoKZ2dwbG90KG5lZ2F0aXZlX2FubnVhbCwgYWVzKHggPSByZW9yZGVyKHdvcmRzLCAtd3MpLCB5ID0gd3MpKSArCiAgICBnZW9tX3BvaW50KCkgKwogICAgY29vcmRfZmxpcCgpICsKICBmYWNldF9ncmlkKGNvbHMgPSB2YXJzKFllYXIpKSArCiAgICBsYWJzKHggPSBOVUxMLCB5ID0gIldvcmRzY29yZSIpICsgZ2d0aXRsZSgiRVUgKCspIC0gUlVTICgtKTogMTk3MS0xOTgwIikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIGhqdXN0ID0gMSwgdmp1c3QgPSAwLjUpKSAKCmdnc2F2ZSgicHJlc3J1c19uZWdhdGl2ZV8xOTcxLTE5ODAucGRmIikKCm5lZ2F0aXZlX2FubnVhbCA8LSBwcmVzcnVzX3dvcmRzICU+JSAKICBmaWx0ZXIoWWVhcj4xOTgwICYgWWVhcjwxOTkxKSAlPiUgCiAgZmlsdGVyKHdzPDApICU+JSAKICBhcnJhbmdlKFllYXIsIGRlc2MoLXdzKSkgCgpnZ3Bsb3QobmVnYXRpdmVfYW5udWFsLCBhZXMoeCA9IHJlb3JkZXIod29yZHMsIC13cyksIHkgPSB3cykpICsKICAgIGdlb21fcG9pbnQoKSArCiAgICBjb29yZF9mbGlwKCkgKwogIGZhY2V0X2dyaWQoY29scyA9IHZhcnMoWWVhcikpICsKICAgIGxhYnMoeCA9IE5VTEwsIHkgPSAiV29yZHNjb3JlIikgKyBnZ3RpdGxlKCJFVSAoKykgLSBSVVMgKC0pOiAxOTgxLTE5OTAiKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgaGp1c3QgPSAxLCB2anVzdCA9IDAuNSkpIAoKZ2dzYXZlKCJwcmVzcnVzX25lZ2F0aXZlXzE5ODEtMTk5MC5wZGYiKQoKCgpuZWdhdGl2ZV9hbm51YWwgPC0gcHJlc3J1c193b3JkcyAlPiUgCiAgZmlsdGVyKFllYXI+MTk5MCAmIFllYXI8MjAwMSkgJT4lIAogIGZpbHRlcih3czwwKSAlPiUgCiAgYXJyYW5nZShZZWFyLCBkZXNjKC13cykpIAoKZ2dwbG90KG5lZ2F0aXZlX2FubnVhbCwgYWVzKHggPSByZW9yZGVyKHdvcmRzLCAtd3MpLCB5ID0gd3MpKSArCiAgICBnZW9tX3BvaW50KCkgKwogICAgY29vcmRfZmxpcCgpICsKICBmYWNldF9ncmlkKGNvbHMgPSB2YXJzKFllYXIpKSArCiAgICBsYWJzKHggPSBOVUxMLCB5ID0gIldvcmRzY29yZSIpICsgZ2d0aXRsZSgiRVUgKCspIC0gUlVTICgtKTogMTk5MS0yMDAwIikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIGhqdXN0ID0gMSwgdmp1c3QgPSAwLjUpKSAKCmdnc2F2ZSgicHJlc3J1c19uZWdhdGl2ZV8xOTkxLTIwMDAucGRmIikKCgpuZWdhdGl2ZV9hbm51YWwgPC0gcHJlc3J1c193b3JkcyAlPiUgCiAgZmlsdGVyKFllYXI+MjAwMCAmIFllYXI8MjAxMSkgJT4lIAogIGZpbHRlcih3czwwKSAlPiUgCiAgYXJyYW5nZShZZWFyLCBkZXNjKC13cykpIAoKZ2dwbG90KG5lZ2F0aXZlX2FubnVhbCwgYWVzKHggPSByZW9yZGVyKHdvcmRzLCAtd3MpLCB5ID0gd3MpKSArCiAgICBnZW9tX3BvaW50KCkgKwogICAgY29vcmRfZmxpcCgpICsKICBmYWNldF9ncmlkKGNvbHMgPSB2YXJzKFllYXIpKSArCiAgICBsYWJzKHggPSBOVUxMLCB5ID0gIldvcmRzY29yZSIpICsgZ2d0aXRsZSgiRVUgKCspIC0gUlVTICgtKTogMjAwMS0yMDEwIikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIGhqdXN0ID0gMSwgdmp1c3QgPSAwLjUpKSAKCmdnc2F2ZSgicHJlc3J1c19uZWdhdGl2ZV8yMDAxLTIwMTAucGRmIikKCgoKbmVnYXRpdmVfYW5udWFsIDwtIHByZXNydXNfd29yZHMgJT4lIAogIGZpbHRlcihZZWFyPjIwMTAgJiBZZWFyPDIwMTUpICU+JSAKICBmaWx0ZXIod3M8MCkgJT4lIAogIGFycmFuZ2UoWWVhciwgZGVzYygtd3MpKSAKCmdncGxvdChuZWdhdGl2ZV9hbm51YWwsIGFlcyh4ID0gcmVvcmRlcih3b3JkcywgLXdzKSwgeSA9IHdzKSkgKwogICAgZ2VvbV9wb2ludCgpICsKICAgIGNvb3JkX2ZsaXAoKSArCiAgZmFjZXRfZ3JpZChjb2xzID0gdmFycyhZZWFyKSkgKwogICAgbGFicyh4ID0gTlVMTCwgeSA9ICJXb3Jkc2NvcmUiKSArIGdndGl0bGUoIkVVICgrKSAtIFJVUyAoLSk6IDIwMTEtMjAxNCIpICsKICB0aGVtZV9idygpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCBoanVzdCA9IDEsIHZqdXN0ID0gMC41KSkgCgpnZ3NhdmUoInByZXNydXNfbmVnYXRpdmVfMjAxMS0yMDE0LnBkZiIpCgoKCmBgYAoKCgoKCgoKCgoKCgoKCg==