diff --git a/Code/JAGS/SCR_Allsites.txt b/Code/JAGS/SCR_Allsites.txt index 86b3327..20bdbd0 100644 --- a/Code/JAGS/SCR_Allsites.txt +++ b/Code/JAGS/SCR_Allsites.txt @@ -1,17 +1,26 @@ model { - for(g in 1:length(Sites)) { - - alpha1[g, t] ~ dnorm(mu_a1, 1 / sd_a1 / sd_a1 ) mu_a1 ~ dnorm(0, 1 / (25^2))I(0, ) ## half normal sd_a1 ~ dunif(0, 5) + mu_a2 ~ dnorm(0, 0.01) + # sd_a2 ~ dt(0, pow(5, -2), 1)T(0, ) # half cauchy prior with scale = 5 (25?) + sd_a2 ~ dunif(0, 5) + + for(g in 1:n_sites) { + +for(i in 1:M) { + Sex[g, i] ~ dbern(psi.sex[g]) + Sex2[g, i] <- Sex[g, i] + 1 +} for(t in 1:2){ - sigma[g, t] <- pow(1 / (2*alpha1[t]), 0.5) # sd of half normal + alpha1[g, t] ~ dnorm(0, 1 / (25^2))I(0, ) ## half normal independent across sites and sexes + # alpha1[g, t] ~ dnorm(mu_a1, 1 / sd_a1 / sd_a1 )I(0, ) # BUGS I(,) notation is only allowed if all parameters are fixed + sigma[g, t] <- pow(1 / (2*alpha1[g, t]), 0.5) # sd of half normal } # t - psi[g] ~ dunif(0, 1) # giving numbers between 0 and 1, + psi[g] ~ dunif(0, 1) # prob of individual being in the population (for augmentation since N unknown) # logit(psi[g]) ~ dnorm(mu_psi, 1 / sd_psi / sd_psi) # consider drawing from a normal distribution across sites # mu_psi ~ dnorm(0, 0.01) # sd_psi ~ dunif(0, 10) @@ -22,7 +31,7 @@ for(i in 1:M) { for(k in 1:K) { - eta[g,i,k] ~ dnorm(0, 1 / (sigma_ind * sigma_ind)) + eta[g,i,k] ~ dnorm(0, 1 / (sigma_ind[g] * sigma_ind[g])) } # i } # k @@ -34,9 +43,6 @@ for(i in 1:M) { alpha2[g, i] ~ dnorm(mu_a2, 1 / sd_a2 / sd_a2) # take out g here? Trap behavior universal b/w sites? } # m - mu_a2 ~ dnorm(0, 0.01) - # sd_a2 ~ dt(0, pow(5, -2), 1)T(0, ) # half cauchy prior with scale = 5 (25?) - sd_a2 ~ dunif(0, 5) for(i in 1:M) { z[g, i] ~ dbern(psi[g]) @@ -47,27 +53,25 @@ for(k in 1:K) { for(t in 1:2) { - logit(p0[g, i, j, k, t]) <- alpha0[t] + (alpha2[g, i] * C[i, k, g]) + eta[g, i, k] # alpha2*C to rep. global behav. response - } # i + logit(p0[g, i, j, k, t]) <- alpha0[g, t] + (alpha2[g, i] * C[i, k, g]) + eta[g, i, k] # alpha2*C to rep. global behav. response + } # t + } # k } # j - } # k - } # t #### error? + } # i for(i in 1:M) { - Sex[i] ~ dbern(psi.sex) - Sex2[i] <- Sex[i] + 1 for (j in 1:max_trap[g]) { for (k in 1:K) { - y[g, i, j, k] ~ dbern(p[g, i, j, k]) - p[g, i, j, k] <- z[i]*p0[g, i, j, k, Sex2[i]* exp(- alpha1[Sex2[i]] * d[g, i,j] * d[g, i,j]) + y[i, j, k, g] ~ dbern(p[g, i, j, k]) + p[g, i, j, k] <- z[g, i] * p0[g, i, j, k, Sex2[g, i]] * exp(- alpha1[g, Sex2[g, i]] * d[g, i,j] * d[g, i,j]) } # i } # j } # k # Derived parameters - N[g] <- sum(z[ , g]) + N[g] <- sum(z[g , ]) # N[g] <- inprod(z[1:M_allsites], sitedummy[ , t]) ## see panel 9.2 - density[g] <- N[g] / (xlim[[g]][2] - xlim[[g]][1]) # divided distances by 100 so calculates turtles per 100 m of canal + density[g] <- N[g] / (xlim[g, 2] - xlim[g, 1]) # divided distances by 100 so calculates turtles per 100 m of canal } # g } diff --git a/Code/MultiSessionModel_NHedits.R b/Code/MultiSessionModel_NHedits.R index 3e05b03..20296c7 100644 --- a/Code/MultiSessionModel_NHedits.R +++ b/Code/MultiSessionModel_NHedits.R @@ -149,7 +149,7 @@ trap_locs[i, 1:max_trap[i]] <- trap_dist_list[[i]] / 100 xlim <- matrix(NA, 12, 2) for(i in 1:12){ - xlim[i, 1:2] <- c(min(trap_dist_list[[i]]), max(trap_dist_list[[i]]) + 50) / 100 # need to have buffer on each side without being negative. Just added 50 to the end for testing but will have to think through + xlim[i, 1:2] <- c(min(trap_dist_list[[i]]) - 400, max(trap_dist_list[[i]]) + 400) / 100 # need to have buffer on each side without being negative. Just added 50 to the end for testing but will have to think through } diff --git a/Data/.DS_Store b/Data/.DS_Store index 6fc48b1..ae555e6 100644 Binary files a/Data/.DS_Store and b/Data/.DS_Store differ diff --git a/Haydt_Report.nb.html b/Haydt_Report.nb.html index 763825c..6399453 100644 --- a/Haydt_Report.nb.html +++ b/Haydt_Report.nb.html @@ -187,36 +187,8 @@
-Attaching package: ‘dplyr’
-
-The following object is masked from ‘package:bbmle’:
-
- slice
-
-The following objects are masked from ‘package:raster’:
-
- intersect, select, union
-
-The following objects are masked from ‘package:stats’:
-
- filter, lag
-
-The following objects are masked from ‘package:base’:
-
- intersect, setdiff, setequal, union
-
-
-Attaching package: ‘tidyr’
-
-The following object is masked from ‘package:raster’:
-
- extract
-
-Loading required package: coda
-Linked to JAGS 4.3.0
-Loaded modules: basemod,bugs
+
+package ‘plotrix’ was built under R version 3.5.2
@@ -226,9 +198,9 @@ EDF <- read.csv(file = "Data/EDF.csv", stringsAsFactors = FALSE)
-head(EDF)
+
+r
r EDF <- read.csv(file = /EDF.csv, stringsAsFactors = FALSE) head(EDF)
site trap day ind sex species carapace mass leeches date recap
@@ -630,7 +602,7 @@ Obtaining List of Activity Centers and Density Per Site and Species
As MCMC chains were run in parallel processing, I first combined rows of the resulting 3 list objects into one result object. I then obtained activity centers per individual and densities per site from each complete MCMC object after averaging the results from all chains.
-
+
####### Site A, CPIC ########
# Load MCMC Data
load("Results/JAGS/cpic_A_mcmc.RData")
@@ -655,6 +627,7 @@ Obtaining List of Activity Centers and Density Per Site and Species
#### Obtaining Density and N For Site A and CPICS from MCMC Output ####
densities_cpic_A <- df_mcmc_cpic_A$density[501:1000] #densities per iteration after burnin
+stderror_cpic_A <- std.error(as.vector(densities_cpic_A))
mean_density_cpic_A <- mean(densities_cpic_A) # Mean # turtles per 100 meters
estimated_N_cpic_A <- df_mcmc_cpic_A$N[501:1000]
@@ -686,6 +659,7 @@ Obtaining List of Activity Centers and Density Per Site and Species
#### Obtaining Density and N For Site A and CSER from MCMC Output ####
densities_cser_A <- df_mcmc_cser_A$density[501:1000] #densities per iteration after burnin
+stderror_cser_A <- std.error(as.vector(densities_cser_A))
mean_density_cser_A <- mean(densities_cser_A) # Mean # turtles per 100 meters
estimated_N_cser_A <- df_mcmc_cser_A$N[501:1000]
@@ -718,6 +692,7 @@ Obtaining List of Activity Centers and Density Per Site and Species
#### Obtaining Density and N
densities_cpic_C <- df_mcmc_cpic_C$density[501:1000] #densities per iteration after burnin
+stderror_cpic_C <- std.error(as.vector(densities_cpic_C))
mean_density_cpic_C <- mean(densities_cpic_C) # Mean # turtles per 100 meters
estimated_N_cpic_C <- df_mcmc_cpic_C$N[501:1000]
@@ -749,6 +724,7 @@ Obtaining List of Activity Centers and Density Per Site and Species
#### Obtaining Density For Site 1 and CPICS from MCMC Output ####
densities_cser_C <- df_mcmc_cser_C$density[501:1000] #densities per iteration after burnin
+stderror_cser_C <- std.error(as.vector(densities_cser_C))
mean_density_cser_C <- mean(densities_cser_C) # Mean # turtles per 100 meters
estimated_N_cser_C <- df_mcmc_cser_C$N[501:1000]
@@ -780,6 +756,7 @@ Obtaining List of Activity Centers and Density Per Site and Species
#### Obtaining Density For Site 1 and CPICS from MCMC Output ####
densities_cpic_D <- df_mcmc_cpic_D$density[501:1000] #densities per iteration after burnin
+stderror_cpic_D <- std.error(as.vector(densities_cpic_D))
mean_density_cpic_D <- mean(densities_cpic_D) # Mean # turtles per 100 meters
estimated_N_cpic_D <- df_mcmc_cpic_D$N[501:1000]
@@ -810,6 +787,7 @@ Obtaining List of Activity Centers and Density Per Site and Species
#### Obtaining Density and N
densities_cpic_E <- df_mcmc_cpic_E$density[501:1000] #densities per iteration after burnin
+stderror_cpic_E <- std.error(as.vector(densities_cpic_E))
mean_density_cpic_E <- mean(densities_cpic_E) # Mean # turtles per 100 meters
estimated_N_cpic_E <- df_mcmc_cpic_E$N[501:1000]
@@ -841,6 +819,7 @@ Obtaining List of Activity Centers and Density Per Site and Species
#### Obtaining Density and N
densities_cser_E <- df_mcmc_cser_E$density[501:1000] #densities per iteration after burnin
+stderror_cser_E <- std.error(as.vector(densities_cser_E))
mean_density_cser_E <- mean(densities_cser_E) # Mean # turtles per 100 meters
estimated_N_cser_E <- df_mcmc_cser_E$N[501:1000]
@@ -872,6 +851,7 @@ Obtaining List of Activity Centers and Density Per Site and Species
#### Obtaining Density and N
densities_cser_F <- df_mcmc_cser_F$density[501:1000] #densities per iteration after burnin
+stderror_cser_F <- std.error(as.vector(densities_cser_F))
mean_density_cser_F <- mean(densities_cser_F) # Mean # turtles per 100 meters
estimated_N_cser_F <- df_mcmc_cser_F$N[501:1000]
@@ -903,6 +883,7 @@ Obtaining List of Activity Centers and Density Per Site and Species
#### Obtaining Density and N
densities_cpic_F <- df_mcmc_cpic_F$density[501:1000] #densities per iteration after burnin
+stderror_cpic_F <- std.error(as.vector(densities_cpic_F))
mean_density_cpic_F <- mean(densities_cpic_F) # Mean # turtles per 100 meters
estimated_N_cpic_F <- df_mcmc_cpic_F$N[501:1000]
@@ -934,6 +915,7 @@ Obtaining List of Activity Centers and Density Per Site and Species
#### Obtaining Density and N
densities_cpic_G <- df_mcmc_cpic_G$density[501:1000] #densities per iteration after burnin
+stderror_cpic_G <- std.error(as.vector(densities_cpic_G))
mean_density_cpic_G <- mean(densities_cpic_G) # Mean # turtles per 100 meters
estimated_N_cpic_G <- df_mcmc_cpic_G$N[501:1000]
@@ -965,6 +947,7 @@ Obtaining List of Activity Centers and Density Per Site and Species
#### Obtaining Density and N
densities_cser_G <- df_mcmc_cser_G$density[501:1000] #densities per iteration after burnin
+stderror_cser_G <- std.error(as.vector(densities_cser_G))
mean_density_cser_G <- mean(densities_cser_G) # Mean # turtles per 100 meters
estimated_N_cser_G <- df_mcmc_cser_G$N[501:1000]
@@ -996,6 +979,7 @@ Obtaining List of Activity Centers and Density Per Site and Species
#### Obtaining Density and N
densities_cpic_J <- df_mcmc_cpic_J$density[501:1000] #densities per iteration after burnin
+stderror_cpic_J <- std.error(as.vector(densities_cpic_J))
mean_density_cpic_J <- mean(densities_cpic_J) # Mean # turtles per 100 meters
estimated_N_cpic_J <- df_mcmc_cpic_J$N[501:1000]
@@ -1027,6 +1011,7 @@ Obtaining List of Activity Centers and Density Per Site and Species
#### Obtaining Density and N
densities_cser_J <- df_mcmc_cser_J$density[501:1000] #densities per iteration after burnin
+stderror_cser_J <- std.error(as.vector(densities_cser_J))
mean_density_cser_J <- mean(densities_cser_J) # Mean # turtles per 100 meters
estimated_N_cser_J <- df_mcmc_cser_J$N[501:1000]
@@ -1058,6 +1043,7 @@ Obtaining List of Activity Centers and Density Per Site and Species
#### Obtaining Density and N
densities_cpic_K <- df_mcmc_cpic_K$density[501:1000] #densities per iteration after burnin
+stderror_cpic_K <- std.error(as.vector(densities_cpic_K))
mean_density_cpic_K <- mean(densities_cpic_K) # Mean # turtles per 100 meters
estimated_N_cpic_K <- df_mcmc_cpic_K$N[501:1000]
@@ -1089,6 +1075,7 @@ Obtaining List of Activity Centers and Density Per Site and Species
#### Obtaining Density and N
densities_cpic_L <- df_mcmc_cpic_L$density[501:1000] #densities per iteration after burnin
+stderror_cpic_L <- std.error(as.vector(densities_cpic_L))
mean_density_cpic_L <- mean(densities_cpic_L) # Mean # turtles per 100 meters
estimated_N_cpic_L <- df_mcmc_cpic_L$N[501:1000]
@@ -1120,6 +1107,7 @@ Obtaining List of Activity Centers and Density Per Site and Species
#### Obtaining Density and N
densities_cpic_M <- df_mcmc_cpic_M$density[501:1000] #densities per iteration after burnin
+stderror_cpic_M <- std.error(as.vector(densities_cpic_M))
mean_density_cpic_M <- mean(densities_cpic_M) # Mean # turtles per 100 meters
estimated_N_cpic_M <- df_mcmc_cpic_M$N[501:1000]
@@ -1151,6 +1139,7 @@ Obtaining List of Activity Centers and Density Per Site and Species
#### Obtaining Density and N
densities_cser_M <- df_mcmc_cser_M$density[501:1000] #densities per iteration after burnin
+stderror_cser_M <- std.error(as.vector(densities_cser_M))
mean_density_cser_M <- mean(densities_cser_M) # Mean # turtles per 100 meters
estimated_N_cser_M <- df_mcmc_cser_M$N[501:1000]
@@ -1181,6 +1170,7 @@ Obtaining List of Activity Centers and Density Per Site and Species
#### Obtaining Density and N
densities_cpic_N <- df_mcmc_cpic_N$density[501:1000] #densities per iteration after burnin
+stderror_cpic_N <- std.error(as.vector(densities_cpic_N))
mean_density_cpic_N <- mean(densities_cpic_N) # Mean # turtles per 100 meters
estimated_N_cpic_N <- df_mcmc_cpic_N$N[501:1000]
@@ -1211,6 +1201,7 @@ Obtaining List of Activity Centers and Density Per Site and Species
#### Obtaining Density and N
densities_cser_N <- df_mcmc_cser_N$density[501:1000] #densities per iteration after burnin
+stderror_cser_N <- std.error(as.vector(densities_cser_N))
mean_density_cser_N <- mean(densities_cser_N) # Mean # turtles per 100 meters
estimated_N_cser_N <- df_mcmc_cser_N$N[501:1000]
@@ -1241,6 +1232,7 @@ Obtaining List of Activity Centers and Density Per Site and Species
#### Obtaining Density and N
densities_cpic_O <- df_mcmc_cpic_O$density[501:1000] #densities per iteration after burnin
+stderror_cpic_O <- std.error(as.vector(densities_cpic_O))
mean_density_cpic_O <- mean(densities_cpic_O) # Mean # turtles per 100 meters
estimated_N_cpic_O <- df_mcmc_cpic_O$N[501:1000]
@@ -1272,6 +1264,7 @@ Obtaining List of Activity Centers and Density Per Site and Species
#### Obtaining Density and N
densities_cser_O <- df_mcmc_cser_O$density[501:1000] #densities per iteration after burnin
+stderror_cser_O <- std.error(as.vector(densities_cser_O))
mean_density_cser_O <- mean(densities_cser_O) # Mean # turtles per 100 meters
estimated_N_cser_O <- df_mcmc_cser_O$N[501:1000]
@@ -1311,9 +1304,9 @@ Plotting CPIC Activity Centers
-
-filepaths <- c("AC_Plots2.pdf","AC_Plots1.pdf")
-knitr::include_graphics(filepaths)
+
+r
r filepaths <- c(_Plots2.pdf,_Plots1.pdf) knitr::include_graphics(filepaths)
+
@@ -1360,9 +1353,9 @@ Histograms
-
-filepaths <- c("AC_Hist1_CPIC.pdf", "AC_Hist_CPIC.pdf", "AC_Hist1_CSER.pdf", "AC_Hist2_CSER.pdf")
-knitr::include_graphics(filepaths)
+
+r
r filepaths <- c(_Hist1_CPIC.pdf, _Hist_CPIC.pdf, _Hist1_CSER.pdf, _Hist2_CSER.pdf) knitr::include_graphics(filepaths)
+
@@ -1662,7 +1655,7 @@ Plotting Linear K Simulations with Envelopes
Graphing Density By Site
-
+
filepaths <- c("CPIC_Plot.pdf", "CSER_Plot.pdf")
knitr::include_graphics(filepaths)
@@ -1670,16 +1663,59 @@ Graphing Density By Site
x <- c("A","C","D","E","F","G","J","K","L","M","N","O")
density_list <- c(mean_density_cpic_A, mean_density_cpic_C, mean_density_cpic_D, mean_density_cpic_E, mean_density_cpic_F, mean_density_cpic_G, mean_density_cpic_J, mean_density_cpic_K, mean_density_cpic_L, mean_density_cpic_M, mean_density_cpic_N, mean_density_cpic_O)
-
-barplot(density_list, names.arg = c("A","C","E","F","G","J","M","N","O"), main = "CSER Density by Site", col = "brown", xlab = "Site", ylab = "Density")
+stderror_list_cpic <- c(stderror_cpic_A, stderror_cpic_C, stderror_cpic_D, stderror_cpic_E, stderror_cpic_F, stderror_cpic_G, stderror_cpic_J, stderror_cpic_K, stderror_cpic_L, stderror_cpic_M, stderror_cpic_N, stderror_cpic_O)
+
+# barplot(density_list, names.arg = c("A","C","D","E","F","G","J","K","L","M","N","O"), main = "CPIC Density by Site", col = "brown", xlab = "Site", ylab = "Density")
+
+cbind_cpic <- cbind(data.frame(site = x, density = density_list, stderror = stderror_list_cpic))
+
+p <- ggplot(cbind_cpic, aes(x=site, y=density)) +
+ geom_bar(stat="identity", color="darkorange3", fill = "darkorange3",
+ position=position_dodge()) +
+ geom_errorbar(aes(ymin=density-stderror, ymax=density+stderror), width=.2,
+ position=position_dodge(.9))
+print(p)
+
+p + labs(x="Site", y = "Density (Individuals Per 100m)")+
+ theme_classic() +
+ scale_fill_manual(values=c('#999999','#E69F00')) +
+ ggtitle("CPIC Site Densities") +
+ theme(plot.title = element_text(hjust = 0.5, size = 16),
+ axis.title.x = element_text(size=14),
+ axis.title.y = element_text(size=14)
+)
+
+x <- c("A","C","E","F","G","J","M","N","O")
+density_list_cser <- c(mean_density_cser_A, mean_density_cser_C, mean_density_cser_E, mean_density_cser_F, mean_density_cser_G, mean_density_cser_J, mean_density_cser_M, mean_density_cser_N, mean_density_cser_O)
+stderror_list_cser <- c(stderror_cser_A, stderror_cser_C, stderror_cser_E, stderror_cser_F, stderror_cser_G, stderror_cser_J, stderror_cser_M, stderror_cser_N, stderror_cser_O)
+
+# barplot(density_list_cser, names.arg = c("A","C","E","F","G","J","M","N","O"), main = "CSER Density by Site", col = "brown", xlab = "Site", ylab = "Density")
+
+cbind_cser <- cbind(data.frame(site = x, density = density_list_cser, stderror = stderror_list_cser))
+
+p <- ggplot(cbind_cser, aes(x=site, y=density)) +
+ geom_bar(stat="identity", color="darkorange3", fill = "darkorange3",
+ position=position_dodge()) +
+ geom_errorbar(aes(ymin=density-stderror, ymax=density+stderror), width=.2,
+ position=position_dodge(.9))
+print(p)
+
+p + labs(x="Site", y = "Density (Individuals Per 100m)")+
+ theme_classic() +
+ scale_fill_manual(values=c('#999999','#E69F00')) +
+ ggtitle("Snapping Turtle Site Densities") +
+ theme(plot.title = element_text(hjust = 0.5, size = 16),
+ axis.title.x = element_text(size=14),
+ axis.title.y = element_text(size=14)
+)
-
-filepaths <- c("CPIC_Plot.pdf", "CSER_Plot.pdf")
-knitr::include_graphics(filepaths)
+
+r
r filepaths <- c(_Plot.pdf, _Plot.pdf) knitr::include_graphics(filepaths)
+
@@ -1688,7 +1724,7 @@ Graphing Density By Site
-LS0tCnRpdGxlOiAiRmluYWwgTGFuZHNjYXBlIFByb2plY3QgUmVwb3J0IgphdXRob3I6ICczMDkzODE5JwpkYXRlOiAiMTIvMTEvMjAxOCIKb3V0cHV0OgogIHBkZl9kb2N1bWVudDogZGVmYXVsdAogIGh0bWxfbm90ZWJvb2s6IGRlZmF1bHQKLS0tCgoKRm9yIHRoaXMgcHJvamVjdCwgSSBjcmVhdGVkIGEgU3BhdGlhbCBDYXB0dXJlLVJlY2FwdHVyZSAoU0NSKSBtb2RlbCAobmFtZWQgIlNDUkFfSW5kX1RpbWUudHh0Ijsgd2l0aGluIHRoZSBmb2xkZXJzICJDb2RlL0pBR1MiKS4gU2FtcGxpbmcgZGVzaWduIGZvciBTQ1IgbW9kZWxzIGluY2x1ZGUgb2J0YWluaW5nIGVuY291bnRlciBoaXN0b3JpZXMgb2YgaW5kaXZpZHVhbCBvcmdhbmlzbXMgYXQgYSBzcGVjaWZpYyBzaXRlLiBUcmFwcyBhcmUgcGxhY2VkIGF0IGVxdWFsIGluY3JlbWVudHMgYXBhcnQgaW4gYW4gYXJyYXkuIFRoZSBzYW1wbGluZyBvY2Nhc2lvbiwgdHJhcCBJRCwgYW5kIHR1cnRsZSBJRCBhcmUgcmVjb3JkZWQgYW5kIHRoZSByZXN1bHRpbmcgZGF0YSBmcmFtZSBiZWNvbWVzIHRoZSBmb3VuZGF0aW9uIGZvciBtb3N0IG9iamVjdHMgY3JlYXRlZCBmb3IgYSBTQ1IgbW9kZWwuIFRoZSBtb2RlbCBvdXRwdXRzIGluY2x1ZGUgYW4gYWN0aXZpdHkgY2VudGVyIHBlciBpbmRpdmlkdWFsLCBkZW5zaXR5IHBlciBzaXRlLCBhbmQgbnVtYmVyIG9mIGluZGl2aWR1YWxzIGVzdGltYXRlZCBpbiBzaXRlIGFyZWEuIFRoZSBhY3Rpdml0eSBjZW50ZXJzIGFyZSBjZW50cm9pZHMgb2YgdGhlIHNwYWNlIGFuIGluZGl2aWR1YWwgdXNlZCBvdmVyIGEgc2FtcGxpbmcgc2Vzc2lvbiBhbmQgaXMgc2ltaWxhciB0byBhIGhvbWUgcmFuZ2UgY2VudGVyLiBBY3Rpdml0eSBjZW50ZXJzIHBlciBzaXRlIHJlcHJlc2VudCBhIHJlYWxpemF0aW9uIG9mIGEgYmlub21pYWwgcG9pbnQgcHJvY2VzcyAod2hlcmUgdG90YWwgbnVtYmVyIG9mIHBvaW50cyBpbiBzcGFjZSBpcyBmaXhlZCkuCgpEdXJpbmcgdGhlIFN1bW1lciBvZiAyMDE4IEkgc2FtcGxlZCBmb3IgdHVydGxlcyBhdCAxMiBzaXRlcyBmb3IgNCBkYXlzIGVhY2ggKHNhbXBsaW5nIG9jY2FzaW9uICA9IDQgZGF5cykgYnkgc2V0dGluZyBvdXQgNyB0byAxNCB0cmFwcyAoaG9vcCBuZXQgdHJhcHMpIGFsb25nIHRoZSBDaGVzYXBlYWtlIGFuZCBPaGlvIENhbmFsIChmcm9tIEN1bWJlcmxhbmQgdG8gdGhlIFRvd24gQ3JlZWsgQXF1ZWR1Y3QpLgoKT2JqZWN0aXZlcyBmb3IgdGhpcyBwcm9qZWN0IGluY2x1ZGVkOgoxKSBEZXZlbG9wIGEgU0NSIG1vZGVsIChpbiB0aGUgcHJvZ3JhbSBKQUdTKSB0aGF0IGluY29ycG9yYXRlcyBoZXRlcm9nZW5laXR5IG9mIGNhcHR1cmUgcHJvYmFiaWxpdHkgYnkgc2FtcGxpbmcgZGF5IGFuZCBpbmRpdmlkdWFsLiAKMikgT2J0YWluIGFjdGl2aXR5IGNlbnRlcnMgZm9yIDIgc3BlY2llcyAoQy4gcGljdGEgYW5kIEMuIHNlcnBlbnRpbmE7IGhlbmNlZm9ydGgsIENQSUMgYW5kIENTRVIpIGZyb20gdGhlIE1DTUMgb3V0cHV0IGZvciBlYWNoIG1vZGVsLgozKSBBbmFseXplIGRpc3BlcnNpb24gb2YgYWN0aXZpdHkgY2VudGVycyBmb3IgYWxsIHNpdGVzIGFuZCBjb21wYXJlLgo0KSBBbmFseXplIGRpc3BlcnNpb24gb2YgYWN0aXZpdHkgY2VudGVycyBmb3IgQ1BJQyBhbmQgQ1NFUiBhbmQgY29tcGFyZS4KNSkgT2J0YWluIGRlbnNpdGllcyBvZiBlYWNoIHNwZWNpZXMgYXQgZWFjaCBzaXRlIGFuZCBjb21wYXJlLgoKIyMgTGlicmFyaWVzCmBgYHtyLCBlY2hvID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRX0KbGlicmFyeShkcGx5cikKbGlicmFyeSh0aWR5cikKbGlicmFyeShyamFncykKbGlicmFyeShwYXJhbGxlbCkKbGlicmFyeSh0aWJibGUpCmxpYnJhcnkoc3BhdHN0YXQpCmxpYnJhcnkoc3BUaGluKQpsaWJyYXJ5KGdncGxvdDIpCmBgYAoKSSBmaXJzdCBkb3dubG9hZGVkIG15IHJhdyBkYXRhIGZyb20gdGhlIHN1bW1lci4KCiMjIExvYWQgTWFpbiBEYXRhIEZpbGUgZm9yIFNwYXRpYWwgQ2FwdHVyZSBSZWNhcHR1cmUgTW9kZWwgKFJhdyBkYXRhKQpgYGB7cn0KCkVERiA8LSByZWFkLmNzdihmaWxlID0gIkRhdGEvRURGLmNzdiIsIHN0cmluZ3NBc0ZhY3RvcnMgPSBGQUxTRSkKaGVhZChFREYpCgpgYGAKCkkgY3JlYXRlZCBwcmVsaW1pbmFyeSBvYmplY3RzIHRvIHVzZSBpbiBteSBTQ1IgbW9kZWwgZm9yIGVhY2ggc3BlY2llcyBhbmQgc2l0ZSBjb21iaW5hdGlvbi4gUHJlbGltaW5hcnkgb2JqZWN0cyBpbmNsdWRlZCBhIHRyYXAgbG9jYXRpb24gdmVjdG9yIGluZGljYXRpbmcgZGlzdGFuY2VzIGZyb20gbW9zdCB1cHN0cmVhbSB0byBtb3N0IGRvd25zdHJlYW0gdHJhcCwgdHJhcCBsb2NhdGlvbiBtYXRyaWNlcyByZWNvcmRpbmcgZGlzdGFuY2UgYmV0d2VlbiBhbGwgY29tYmluYXRpb25zIG9mIHRyYXBzIHBlciBzaXRlLCBhbmQgc3Vic2V0IHJhdyBkYXRhIGZvciBzcGVjaWZpYyBzcGVjaWVzIGFuZCBzaXRlcy4gSW4gYWRkaXRpb24sIHRyYXAgbG9jYXRpb25zIGFuZCBkaXN0YW5jZXMgd2VyZSBzY2FsZWQgKGRpdmlkZWQgYnkgMCkgdG8gbWFrZSBtb2RlbCBjb21wdXRhdGlvbiBydW4gc21vb3RobHkuCgojIyBTdWJzZXR0aW5nIERhdGEgYW5kIENyZWF0aW5nIFByZWxpbWluYXJ5IE9iamVjdHMgUGVyIFNpdGUgYW5kIFNwZWNpZXMKYGBge3IsIGV2YWwgPSBGQUxTRX0KCiMjQWRkIGEgbmV3IGNvbHVtbiBmb3IgaW50ZWdlciBzZXNzaW9uIHZhbHVlcyAoc2Vzc2lvbiA9IHNpdGUpCkVERiRzaXRlX251bSA8LSBhcy5pbnRlZ2VyKGFzLmZhY3RvcihFREYkc2l0ZSkpCnN1bW1hcnkoRURGKQoKIyBDcmVhdGUgdHJhcCBsb2NhdGlvbiB2ZWN0b3IKdHJhcGxvY3NBIDwtIGMoMCwyNSw1MCw3NSwxMDAsMTI1LDE1MCwxNzUpICMgY3JlYXRlIHRyYXAgbG9jYXRpb24gZmlsZQp0cmFwbG9jc0MgPC0gYygwLDI1LDUwLDc1LDEwMCwxMjUsMTUwLDE3NSwyMDAsMjI1KQp0cmFwbG9jc0QgPC0gYygwLDI1LDUwLDc1LDEwMCwxMjUsMTUwLDE3NSkKdHJhcGxvY3NFIDwtIGMoMCwyNSw1MCw3NSwxMDAsMTI1LDE1MCwxNzUsMjAwLDIyNSwyNTAsMjc1LDMwMCwzMjUpCnRyYXBsb2NzRiA8LSBjKDAsMjUsNTAsNzUsMTAwLDEyNSwxNTApCnRyYXBsb2NzRyA8LSBjKDAsMjUsNTAsNzUsMTAwLDEyNSwxNTApCnRyYXBsb2NzSiA8LSBjKDAsMjUsNTAsNzUsMTAwLDEyNSwxNTAsMTc1LDIwMCwyMjUpCnRyYXBsb2NzSyA8LSBjKDAsMjUsNTAsNzUsMTAwLDEyNSwxNTAsMTc1LDIwMCwyMjUpCnRyYXBsb2NzTCA8LSBjKDAsMjUsNTAsNzUsMTAwLDEyNSwxNTAsMTc1KQp0cmFwbG9jc00gPC0gYygwLDI1LDUwLDc1LDEwMCwxMjUsMTUwLDE3NSwyMDAsMjI1LDI1MCwyNzUpCnRyYXBsb2NzTiA8LSBjKDAsMjUsNTAsNzUsMTAwLDEyNSwxNTAsMTc1LDIwMCwyMjUpCnRyYXBsb2NzTyA8LSBjKDAsMjUsNTAsNzUsMTAwLDEyNSwxNTAsMTc1LDIwMCwyMjUpCiN0aGVzcyBhcmUgaW4gYSB2ZXJ0aWNhbCBmb3JtYXQKCiMgQ3JlYXRlIGEgVHJhcCBMb2NhdGlvbiBNYXRyaXggKGludGVnZXJzID0gZGlzdGFuY2UgYXBhcnQgaW4gbSk7IDEgTWF0cml4IHBlciBTaXRlCiMjIyMgTWF0cml4QQptYXRyaXhBIDwtIG1hdHJpeChOQSwgbmNvbCA9IGxlbmd0aCh0cmFwbG9jc0EpLCBucm93ID0gbGVuZ3RoKHRyYXBsb2NzQSkpCgptYXRyaXhBWyAsMV0gPC0gYygwLDI1LDUwLDc1LDEwMCwxMjUsMTUwLDE3NSkKbWF0cml4QVsgLDJdIDwtIGMoMjUsMCwyNSw1MCw3NSwxMDAsMTI1LDE1MCkKbWF0cml4QVsgLDNdIDwtIGMoNTAsMjUsMCwyNSw1MCw3NSwxMDAsMTI1KQptYXRyaXhBWyAsNF0gPC0gYyg3NSwgNTAsMjUsMCwyNSw1MCw3NSwxMDApCm1hdHJpeEFbICw1XSA8LSBjKDEwMCw3NSwgNTAsMjUsMCwyNSw1MCw3NSkKbWF0cml4QVsgLDZdIDwtIGMoMTI1LDEwMCw3NSwgNTAsMjUsMCwyNSw1MCkKbWF0cml4QVsgLDddIDwtIGMoMTUwLDEyNSwxMDAsNzUsIDUwLDI1LDAsMjUpCm1hdHJpeEFbICw4XSA8LSBjKDE3NSwxNTAsMTI1LDEwMCw3NSwgNTAsMjUsMCkKbWF0cml4QSAgIyB3aWxsIG5lZWQgdG8gdXNlIGNvb3JkaW5hdGVzIGlmIHVzZSBhbGwgc2l0ZXMgaW4gMSBtb2RlbCEgb3IgZmlndXJlIG91dCBkaXN0YW5jZSBiL3cgc2l0ZXMKCiMjIyMgTWF0cml4IEMKbWF0cml4QyA8LSBtYXRyaXgoTkEsIG5jb2wgPSBsZW5ndGgodHJhcGxvY3NDKSwgbnJvdyA9IGxlbmd0aCh0cmFwbG9jc0MpKQptYXRyaXhDWyAsMV0gPC0gYygwLDI1LDUwLDc1LDEwMCwxMjUsMTUwLDE3NSwyMDAsMjI1KQptYXRyaXhDWyAsMl0gPC0gYygyNSwwLDI1LDUwLDc1LDEwMCwxMjUsMTUwLDE3NSwyMDApCm1hdHJpeENbICwzXSA8LSBjKDUwLDI1LDAsMjUsNTAsNzUsMTAwLDEyNSwxNTAsMTc1KQptYXRyaXhDWyAsNF0gPC0gYyg3NSwgNTAsMjUsMCwyNSw1MCw3NSwxMDAsMTI1LDE1MCkKbWF0cml4Q1sgLDVdIDwtIGMoMTAwLDc1LDUwLDI1LDAsMjUsNTAsNzUsMTAwLDEyNSkKbWF0cml4Q1sgLDZdIDwtIGMoMTI1LDEwMCw3NSw1MCwyNSwwLDI1LDUwLDc1LDEwMCkKbWF0cml4Q1sgLDddIDwtIGMoMTUwLDEyNSwxMDAsNzUsNTAsMjUsMCwyNSw1MCw3NSkKbWF0cml4Q1sgLDhdIDwtIGMoMTc1LDE1MCwxMjUsMTAwLDc1LDUwLDI1LDAsMjUsNTApCm1hdHJpeENbICwgOV0gPC0gYygyMDAsMTc1LDE1MCwxMjUsMTAwLDc1LDUwLDI1LDAsMjUpCm1hdHJpeENbICwgMTBdIDwtIGMoMjI1LDIwMCwxNzUsMTUwLDEyNSwxMDAsNzUsNTAsMjUsMCkKCiMjIyMgTWF0cml4IEQKbWF0cml4RCA8LSBtYXRyaXhBCgojIyMjIE1hdHJpeCBFCm1hdHJpeEUgPC0gbWF0cml4KE5BLCBuY29sID0gbGVuZ3RoKHRyYXBsb2NzRSksIG5yb3cgPSBsZW5ndGgodHJhcGxvY3NFKSkKbWF0cml4RVsgLDFdIDwtIGMoMCwyNSw1MCw3NSwxMDAsMTI1LDE1MCwxNzUsMjAwLDIyNSwyNTAsMjc1LDMwMCwzMjUpCm1hdHJpeEVbICwyXSA8LSBjKDI1LDAsMjUsNTAsNzUsMTAwLDEyNSwxNTAsMTc1LDIwMCwyMjUsMjUwLDI3NSwzMDApCm1hdHJpeEVbICwzXSA8LSBjKDUwLDI1LDAsMjUsNTAsNzUsMTAwLDEyNSwxNTAsMTc1LDIwMCwyMjUsMjUwLDI3NSkKbWF0cml4RVsgLDRdIDwtIGMoNzUsIDUwLDI1LDAsMjUsNTAsNzUsMTAwLDEyNSwxNTAsMTc1LDIwMCwyMjUsMjUwKQptYXRyaXhFWyAsNV0gPC0gYygxMDAsNzUsNTAsMjUsMCwyNSw1MCw3NSwxMDAsMTI1LDE1MCwxNzUsMjAwLDIyNSkKbWF0cml4RVsgLDZdIDwtIGMoMTI1LDEwMCw3NSw1MCwyNSwwLDI1LDUwLDc1LDEwMCwxMjUsMTUwLDE3NSwyMDApCm1hdHJpeEVbICw3XSA8LSBjKDE1MCwxMjUsMTAwLDc1LDUwLDI1LDAsMjUsNTAsNzUsMTAwLDEyNSwxNTAsMTc1KQptYXRyaXhFWyAsOF0gPC0gYygxNzUsMTUwLDEyNSwxMDAsNzUsNTAsMjUsMCwyNSw1MCw3NSwxMDAsMTI1LDE1MCkKbWF0cml4RVsgLCA5XSA8LSBjKDIwMCwxNzUsMTUwLDEyNSwxMDAsNzUsNTAsMjUsMCwyNSw1MCw3NSwxMDAsMTI1KQptYXRyaXhFWyAsIDEwXSA8LSBjKDIyNSwyMDAsMTc1LDE1MCwxMjUsMTAwLDc1LDUwLDI1LDAsMjUsNTAsNzUsMTAwKQptYXRyaXhFWyAsIDExXSA8LSBjKDI1MCwyMjUsMjAwLDE3NSwxNTAsMTI1LDEwMCw3NSw1MCwyNSwwLDI1LDUwLDc1KQptYXRyaXhFWyAsIDEyXSA8LSBjKDI3NSwyNTAsMjI1LDIwMCwxNzUsMTUwLDEyNSwxMDAsNzUsNTAsMjUsMCwyNSw1MCkKbWF0cml4RVsgLCAxM10gPC0gYygzMDAsMjc1LDI1MCwyMjUsMjAwLDE3NSwxNTAsMTI1LDEwMCw3NSw1MCwyNSwwLDI1KQptYXRyaXhFWyAsIDE0XSA8LSBjKDMyNSwzMDAsMjc1LDI1MCwyMjUsMjAwLDE3NSwxNTAsMTI1LDEwMCw3NSw1MCwyNSwwKQoKCiMjIyMgTWF0cml4IEYKbWF0cml4RiA8LSBtYXRyaXgoTkEsIG5jb2wgPSBsZW5ndGgodHJhcGxvY3NGKSwgbnJvdyA9IGxlbmd0aCh0cmFwbG9jc0YpKQptYXRyaXhGWyAsMV0gPC0gYygwLDI1LDUwLDc1LDEwMCwxMjUsMTUwKQptYXRyaXhGWyAsMl0gPC0gYygyNSwwLDI1LDUwLDc1LDEwMCwxMjUpCm1hdHJpeEZbICwzXSA8LSBjKDUwLDI1LDAsMjUsNTAsNzUsMTAwKQptYXRyaXhGWyAsNF0gPC0gYyg3NSwgNTAsMjUsMCwyNSw1MCw3NSkKbWF0cml4RlsgLDVdIDwtIGMoMTAwLDc1LCA1MCwyNSwwLDI1LDUwKQptYXRyaXhGWyAsNl0gPC0gYygxMjUsMTAwLDc1LCA1MCwyNSwwLDI1KQptYXRyaXhGWyAsN10gPC0gYygxNTAsMTI1LDEwMCw3NSwgNTAsMjUsMCkKCiMjIyMgTWF0cml4IEcKbWF0cml4RyA8LSBtYXRyaXhGCgojIyMjIE1hdHJpeCBKCm1hdHJpeEogPC0gbWF0cml4QwoKIyMjIyBNYXRyaXggSwptYXRyaXhLIDwtIG1hdHJpeEMKCiMjIyMgTWF0cml4IEwKbWF0cml4TCA8LSBtYXRyaXhBCgojIyMjIE1hdHJpeCBNCm1hdHJpeE0gPC0gbWF0cml4KE5BLCBuY29sID0gbGVuZ3RoKHRyYXBsb2NzTSksIG5yb3cgPSBsZW5ndGgodHJhcGxvY3NNKSkKCm1hdHJpeE1bICwxXSA8LSBjKDAsMjUsNTAsNzUsMTAwLDEyNSwxNTAsMTc1LDIwMCwyMjUsMjUwLDI3NSkKbWF0cml4TVsgLDJdIDwtIGMoMjUsMCwyNSw1MCw3NSwxMDAsMTI1LDE1MCwxNzUsMjAwLDIyNSwyNTApCm1hdHJpeE1bICwzXSA8LSBjKDUwLDI1LDAsMjUsNTAsNzUsMTAwLDEyNSwxNTAsMTc1LDIwMCwyMjUpCm1hdHJpeE1bICw0XSA8LSBjKDc1LCA1MCwyNSwwLDI1LDUwLDc1LDEwMCwxMjUsMTUwLDE3NSwyMDApCm1hdHJpeE1bICw1XSA8LSBjKDEwMCw3NSw1MCwyNSwwLDI1LDUwLDc1LDEwMCwxMjUsMTUwLDE3NSkKbWF0cml4TVsgLDZdIDwtIGMoMTI1LDEwMCw3NSw1MCwyNSwwLDI1LDUwLDc1LDEwMCwxMjUsMTUwKQptYXRyaXhNWyAsN10gPC0gYygxNTAsMTI1LDEwMCw3NSw1MCwyNSwwLDI1LDUwLDc1LDEwMCwxMjUpCm1hdHJpeE1bICw4XSA8LSBjKDE3NSwxNTAsMTI1LDEwMCw3NSw1MCwyNSwwLDI1LDUwLDc1LDEwMCkKbWF0cml4TVsgLCA5XSA8LSBjKDIwMCwxNzUsMTUwLDEyNSwxMDAsNzUsNTAsMjUsMCwyNSw1MCw3NSkKbWF0cml4TVsgLCAxMF0gPC0gYygyMjUsMjAwLDE3NSwxNTAsMTI1LDEwMCw3NSw1MCwyNSwwLDI1LDUwKQptYXRyaXhNWyAsIDExXSA8LSBjKDI1MCwyMjUsMjAwLDE3NSwxNTAsMTI1LDEwMCw3NSw1MCwyNSwwLDI1KQptYXRyaXhNWyAsIDEyXSA8LSBjKDI3NSwyNTAsMjI1LDIwMCwxNzUsMTUwLDEyNSwxMDAsNzUsNTAsMjUsMCkKCiMjIyMgTWF0cml4IE4KbWF0cml4TiA8LSBtYXRyaXhDCgojIyMjIE1hdHJpeCBPCm1hdHJpeE8gPC0gbWF0cml4QwoKIyBUcmFwIGxvY2F0aW9uIGFuZCBkaXN0YW5jZSBtYXRyaWNlcyAvIDEwMAojIHNjYWxlIGZvciBjb21wdXRhdGlvbmFsIHB1cnBvc2VzCnRyYXBsb2NzQSA8LSB0cmFwbG9jc0EgLyAxMDAKdHJhcGxvY3NDIDwtIHRyYXBsb2NzQyAvIDEwMAp0cmFwbG9jc0QgPC0gdHJhcGxvY3NEIC8gMTAwCnRyYXBsb2NzRSA8LSB0cmFwbG9jc0UgLyAxMDAKdHJhcGxvY3NGIDwtIHRyYXBsb2NzRiAvIDEwMAp0cmFwbG9jc0cgPC0gdHJhcGxvY3NHIC8gMTAwCnRyYXBsb2NzSiA8LSB0cmFwbG9jc0ogLyAxMDAKdHJhcGxvY3NLIDwtIHRyYXBsb2NzSyAvIDEwMAp0cmFwbG9jc0wgPC0gdHJhcGxvY3NMIC8gMTAwCnRyYXBsb2NzTSA8LSB0cmFwbG9jc00gLyAxMDAKdHJhcGxvY3NOIDwtIHRyYXBsb2NzTiAvIDEwMAp0cmFwbG9jc08gPC0gdHJhcGxvY3NPIC8gMTAwCm1hdHJpeEEgPC0gbWF0cml4QSAvIDEwMAptYXRyaXhDIDwtIG1hdHJpeEMgLyAxMDAKbWF0cml4RCA8LSBtYXRyaXhEIC8gMTAwCm1hdHJpeEUgPC0gbWF0cml4RSAvIDEwMAptYXRyaXhGIDwtIG1hdHJpeEYgLyAxMDAKbWF0cml4RyA8LSBtYXRyaXhHIC8gMTAwCm1hdHJpeEogPC0gbWF0cml4SiAvIDEwMAptYXRyaXhLIDwtIG1hdHJpeEsgLyAxMDAKbWF0cml4TCA8LSBtYXRyaXhMIC8gMTAwCm1hdHJpeE0gPC0gbWF0cml4TSAvIDEwMAptYXRyaXhOIDwtIG1hdHJpeE4gLyAxMDAKbWF0cml4TyA8LSBtYXRyaXhPIC8gMTAwCgojIyBTdWJzZXQgRGF0YSBmb3IgU2l0ZXMgYW5kIFNwZWNpZXMgKERlbnNpdHkgb2YgYWxsIHR1cnRsZXMgcGVyIHNpdGUpCgojIFNpdGUgQSwgQ1BJQwpFREZBIDwtIEVERiAlPiUKICBmaWx0ZXIoc2l0ZV9udW0gPT0gMSAmIHNwZWNpZXMgPT0gIkNQSUMiKQpFREZBCgojIFNpdGUgQSwgQ1NFUgpFREZBX0NTRVIgPC0gRURGICU+JQogIGZpbHRlcihzaXRlX251bSA9PSAxICYgc3BlY2llcyA9PSAiQ1NFUiIpCkVERkFfQ1NFUls1LDRdIDwtIDU1NSAgIyMjIyBGaWxsaW5nIGluIGJsYW5rIElECgojIFNpdGUgQywgQ1BJQwpFREZDIDwtIEVERiAlPiUKICBmaWx0ZXIoc2l0ZV9udW0gPT0gMiAmIHNwZWNpZXMgPT0gIkNQSUMiKQpFREZDCgojIFNpdGUgQywgQ1NFUgpFREZDX0NTRVIgPC0gRURGICU+JQogIGZpbHRlcihzaXRlX251bSA9PSAyICYgc3BlY2llcyA9PSAiQ1NFUiIpCkVERkNfQ1NFUgoKIyBTaXRlIEQsIENQSUMKRURGRCA8LSBFREYgJT4lCiAgZmlsdGVyKHNpdGVfbnVtID09IDMgJiBzcGVjaWVzID09ICJDUElDIikKRURGRAoKIyBTaXRlIEQsIENTRVIKRURGRF9DU0VSIDwtIEVERiAlPiUKICBmaWx0ZXIoc2l0ZV9udW0gPT0gMyAmIHNwZWNpZXMgPT0gIkNTRVIiKQpFREZEX0NTRVIgICMjIyMjIyAyIGluZGl2aWR1YWxzCgojIFNpdGUgRSwgQ1BJQwpFREZFIDwtIEVERiAlPiUKICBmaWx0ZXIoc2l0ZV9udW0gPT0gNCAmIHNwZWNpZXMgPT0gIkNQSUMiKQpFREZFCgojIFNpdGUgRSwgQ1NFUgpFREZFX0NTRVIgPC0gRURGICU+JQogIGZpbHRlcihzaXRlX251bSA9PSA0ICYgc3BlY2llcyA9PSAiQ1NFUiIpCkVERkVfQ1NFUgoKIyBTaXRlIEYsIENQSUMKRURGRiA8LSBFREYgJT4lCiAgZmlsdGVyKHNpdGVfbnVtID09IDUgJiBzcGVjaWVzID09ICJDUElDIikKRURGRgoKIyBTaXRlIEYsIENTRVIKRURGRl9DU0VSIDwtIEVERiAlPiUKICBmaWx0ZXIoc2l0ZV9udW0gPT0gNSAmIHNwZWNpZXMgPT0gIkNTRVIiKQpFREZGX0NTRVIKCiMgU2l0ZSBHLCBDUElDCkVERkcgPC0gRURGICU+JQogIGZpbHRlcihzaXRlX251bSA9PSA2ICYgc3BlY2llcyA9PSAiQ1BJQyIpCkVERkcKCiMgU2l0ZSBHLCBDU0VSCkVERkdfQ1NFUiA8LSBFREYgJT4lCiAgZmlsdGVyKHNpdGVfbnVtID09IDYgJiBzcGVjaWVzID09ICJDU0VSIikKRURGR19DU0VSCgojIFNpdGUgSiwgQ1BJQwpFREZKIDwtIEVERiAlPiUKICBmaWx0ZXIoc2l0ZV9udW0gPT0gOSAmIHNwZWNpZXMgPT0gIkNQSUMiKQpFREZKCgojIFNpdGUgSiwgQ1NFUgpFREZKX0NTRVIgPC0gRURGICU+JQogIGZpbHRlcihzaXRlX251bSA9PSA5ICYgc3BlY2llcyA9PSAiQ1NFUiIpCkVERkpfQ1NFUgoKIyBTaXRlIEssIENQSUMKRURGSyA8LSBFREYgJT4lCiAgZmlsdGVyKHNpdGVfbnVtID09IDEwICYgc3BlY2llcyA9PSAiQ1BJQyIpCkVERksKCiMgU2l0ZSBLLCBDU0VSCkVERktfQ1NFUiA8LSBFREYgJT4lCiAgZmlsdGVyKHNpdGVfbnVtID09IDEwICYgc3BlY2llcyA9PSAiQ1NFUiIpCkVERktfQ1NFUiAgICMjIyMgT25seSAyIGluZGl2aWR1YWxzCgojIFNpdGUgTCwgQ1BJQwpFREZMIDwtIEVERiAlPiUKICBmaWx0ZXIoc2l0ZV9udW0gPT0gMTEgJiBzcGVjaWVzID09ICJDUElDIikKRURGTAoKIyBTaXRlIEwsIENTRVIKRURGTF9DU0VSIDwtIEVERiAlPiUKICBmaWx0ZXIoc2l0ZV9udW0gPT0gMTEgJiBzcGVjaWVzID09ICJDU0VSIikKRURGTF9DU0VSICAjIyMjIE9ubHkgMSBpbmRpdmlkdWFsCgojIFNpdGUgTSwgQ1BJQwpFREZNIDwtIEVERiAlPiUKICBmaWx0ZXIoc2l0ZV9udW0gPT0gMTIgJiBzcGVjaWVzID09ICJDUElDIikKRURGTQoKIyBTaXRlIE0sIENTRVIKRURGTV9DU0VSIDwtIEVERiAlPiUKICBmaWx0ZXIoc2l0ZV9udW0gPT0gMTIgJiBzcGVjaWVzID09ICJDU0VSIikKRURGTV9DU0VSCgojIFNpdGUgTiwgQ1BJQwpFREZOIDwtIEVERiAlPiUKICBmaWx0ZXIoc2l0ZV9udW0gPT0gMTMgJiBzcGVjaWVzID09ICJDUElDIikKRURGTgoKIyBTaXRlIE4sIENTRVIKRURGTl9DU0VSIDwtIEVERiAlPiUKICBmaWx0ZXIoc2l0ZV9udW0gPT0gMTMgJiBzcGVjaWVzID09ICJDU0VSIikKRURGTl9DU0VSCgojIFNpdGUgTywgQ1BJQwpFREZPIDwtIEVERiAlPiUKICBmaWx0ZXIoc2l0ZV9udW0gPT0gMTQgJiBzcGVjaWVzID09ICJDUElDIikKRURGTwoKIyBTaXRlIE8sIENTRVIKRURGT19DU0VSIDwtIEVERiAlPiUKICBmaWx0ZXIoc2l0ZV9udW0gPT0gMTQgJiBzcGVjaWVzID09ICJDU0VSIikKRURGT19DU0VSCgoKYGBgCgoKI01vZGVsIEluZm9ybWF0aW9uOgpJIGZpcnN0IGNyZWF0ZWQgYSBudWxsIG1vZGVsICh3aXRob3V0IGhldGVyb2dlbmVpdHkgaW4gY2FwdHVyZSBwcm9iYWJpbGl0eSBieSBkYXkgb3IgaW5kaXZpZHVhbCkgYW5kIGV2b2x2ZWQgdGhlIG1vZGVsIHVudGlsIGl0IGlzIHdoYXQgaXMgc2hvd24gYmVsb3cuCgphbHBoYTAgPSBzZXQgcHJvYi4gb2YgYmFzZWxpbmUgZW5jb3VudGVyCmxvZ2l0ID0gY29uc3RyYWluaW5nIHByb2IgYmV0d2VlbiAwIGFuZCAxCmFscGhhMSA9IHNldCBwcm9iYWJpbGl0eSBvZiBlbmNvdW50ZXIgYXQgMSB1bml0IGRpc3RhbmNlIGF3YXkgZnJvbSBhbHBoYTAKc2lnbWEgPSBzY2FsZSBwYXJhbWV0ZXIgb2YgYSBoYWxmLW5vcm1hbApGb3IgZWFjaCBpbmRpdmlkdWFsIGZvciBudW1iZXIgb2YgYXVnbWVudHMgKE0pLCBmaW5kIHpbaV0gLSBsaWtlbGlob29kIHRoYXQgYXVnbWVudCBpcyBwYXJ0IG9mIHNhbXBsZWQgcG9wdWxhdGlvbiwgYWN0aXZpdHkgY2VudGVyIChhY3MgYXNzdW1lZCB0byBiZSB1bmlmb3JtYWxseSBkaXN0cmlidXRlZCkgLCBhbmQgZm9yIGVhY2ggdHJhcC4KQ2FsY3VsYXRlIGRpc3RhbmNlIG9mIGVhY2ggaW5kaXZpZHVhbCBpIGZyb20gdHJhcCBqIHVzaW5nIGRpc3RhbmNlIGVxdWF0aW9uLgpFc3RpbWF0ZSBwYXJhbWV0ZXJzIGFmZmVjdGluZyB0aGUgb2JzZXJ2ZWQgbnVtYmVyIG9mIHRpbWVzIGNhdWdodCBwZXIgdHJhcCByZWZsZWN0aW5nIGEgICAgICBiaW5vbWlhbCBkaXN0cmlidXRpb24gd2l0aCBwcm9iYWJpbGl0eSBvZiBlbmNvdW50ZXIgY2hhbmdpbmcgYnkgaW5kaXZpZHVhbCBhbmQgZGF5LgpFc3RpbWF0ZSBlbmNvdW50ZXIgcHJvYmFiaWxpdHkgcGFyYW1ldGVycyBpbmNsdWRpbmcgbGlrZWxpaG9vZCBhbiBpbmRpdmlkdWFsIGlzIHBhcnQgb2YgcG9wdWxhdGlvbi4KCiMgQ2FsY3VsYXRlIHBvcHVsYXRpb24gc2l6ZSBieSBzdW1taW5nIGFsbCAxcyBhc3NvY2lhdGVkIHdpdGggaW5kaXZpZHVhbHMgd2l0aGluIHRoZSBwb3B1bGF0aW9uIHRoYXQgd2VyZSBzYW1wbGVkIChwcm9iLiBvZiB6ID0gMSkKIyBDYWxjdWxhdGUgZGVuc2l0eSBieSBkaXZpZGluZyBwb3B1bGF0aW9uIHNpemUgYnkgc3RhdGUgc3BhY2Ugc2l6ZSAodHJhcHBpbmcgbGVuZ3RoICsgYnVmZmVycykuCgojIyMjIFRIRSBNT0RFTAoKYGBge3IsIGV2YWwgPSBGQUxTRX0KCiMjIyMgTW9kZWwgd2l0aCBpbmRpdmlkdWFsIGhldGVyb2dlbmVpdHkgaW4gY2FwdHVyZSBwcm9iYWJpbGl0eSAjIyMjCmNhdCAoIgogIG1vZGVsIHsKICAgICAjIGFscGhhMSB+IGRnYW1tYSgwLjEsIDAuMSkgIyBjb25zaWRlciBhcHByb3ByaWF0ZSBwcmlvcgogICAgICMgYWxwaGExIH4gZHQoMCwgMSAvICg1XjIpLCAxKUkoMCwgKSAJIyMgaW1wbGllcyBoYWxmLWNhdWNoeSB3aXRoIHNjYWxlIG9mIDUKICAgICBhbHBoYTEgfiBkbm9ybSgwLCAxIC8gKDI1XjIpKUkoMCwgKSAJIyMgaGFsZiBub3JtYWwKICAgICBzaWdtYSA8LSBwb3coMSAvICgyKmFscGhhMSksIDAuNSkgIyBzZCBvZiBoYWxmIG5vcm1hbAogICAgIHBzaSB+IGR1bmlmKDAsIDEpCgpzaWdtYV9pbmQgfiBkdCgwLCAxIC8gKDI1XjIpLCAxKUkoMCwgKSAJIyMgaW1wbGllcyBoYWxmLWNhdWNoeSB3aXRoIHNjYWxlIG9mIDI1CmZvcihpIGluIDE6TSkgewpmb3IoayBpbiAxOkspIHsKZXRhW2ksa10gfiBkbm9ybSgwLCAxIC8gKHNpZ21hX2luZCAqIHNpZ21hX2luZCkpCn0KfQoKICAgICBmb3IoayBpbiAxOkspIHsKICAgICBhbHBoYTBba10gfiBkbm9ybSgwLCAwLjEpCiAgICAgfQogICAgIGZvcihpIGluIDE6TSkgewogICAgIHpbaV0gfiBkYmVybihwc2kpCiAgICAgc1tpXSB+IGR1bmlmKHhsaW1BWzFdLCB4bGltQVsyXSkKICAgICBmb3IoaiBpbiAxOm5fdHJhcHMpIHsKICAgICBkW2ksal0gPC0gYWJzKHNbaV0gLSB0cmFwbG9jc0Fbal0pCiAgICAgZm9yKGsgaW4gMTpLKSB7CmxvZ2l0KHAwW2ksaixrXSkgPC0gYWxwaGEwW2tdICsgZXRhW2ksa10KICAgICB5W2ksaiwga10gfiBkYmVybihwW2ksaixrXSkKICAgICBwW2ksaiwga10gPC0geltpXSpwMFtpLGosa10qZXhwKC0gYWxwaGExICogZFtpLGpdICogZFtpLGpdKQogICAgIH0KICAgICB9CiAgICAgfQogICAgICMgRGVyaXZlZCBwYXJhbWV0ZXJzCiAgICAgTiA8LSBzdW0oelsgXSkKICAgICBkZW5zaXR5IDwtIE4gLyAoeGxpbUFbMl0gLSB4bGltQVsxXSkgIyBkaXZpZGVkIGRpc3RhbmNlcyBieSAxMDAgc28gY2FsY3VsYXRlcyB0dXJ0bGVzIHBlciAxMDAgbSBvZiBjYW5hbAogICAgIH0KICAgICAiLCBmaWxlID0gIkNvZGUvSkFHUy9TQ1JfSW5kX1RpbWUudHh0IikKCgp0ZXN0aW5nIDwtIFRSVUUKaWYodGVzdGluZykgewogIG5hID0gNTAwCiAgbmkgPSA1MDAKICBudCA9IDEKICBuYyA9IDMKfSBlbHNlIHsKICBuYSA9IDEwMDAwMAogIG5pID0gNjAwMDAwCiAgbnQgPSA2MAogIG5jID0gNAp9CgpgYGAKCgojIyBDcmVhdGluZyBPYmplY3RzIFNwZWNpZmljIHRvIFNDUiBNb2RlbApPYmplY3RzIENyZWF0ZWQgUGVyIFNpdGUgYW5kIFNwZWNpZXMgRm91bmQgaW4gIlNpdGVfU3BlY2llc19Nb2RlbHMuUiIKCiMgRXhhbXBsZTogUnVubmluZyBtb2RlbCBvbiBvbmUgc2V0IG9mIG9iamVjdHMgZm9yIENQSUMgU2l0ZSBBCgpgYGB7ciwgZXZhbCA9IEZBTFNFfQpqYWdzX2RhdGEgPC0gbGlzdCh5ID0gRU1fYXJyYXlBLCB0cmFwbG9jc0EgPSB0cmFwbG9jc0EsIEs9SywgTT1NX0EsIHhsaW1BPXhsaW1BLCBuX3RyYXBzID0gbl90cmFwc0EpCmluaXRzIDwtIGZ1bmN0aW9uKCkgewogIGxpc3QoYWxwaGEwPXJub3JtKDQsLTIsLjQpLCBhbHBoYTE9cnVuaWYoMSwxLDIpLCBzPWFzLm51bWVyaWMoc3N0QVtdKSwgej16X0EsIHBzaSA9IHJ1bmlmKDEpKQp9CgpwYXJhbWV0ZXJzIDwtIGMoImFscGhhMCIsICJhbHBoYTEiLCAic2lnbWEiLCAiTiIsICJkZW5zaXR5IiwgInMiLCAic2lnbWFfaW5kIiwgInBzaSIsICJ6IikKCiMgcnVuIGluIHBhcmFsbGVsIGV4cGxpY2l0bHkKY2wgPC0gbWFrZUNsdXN0ZXIobmMpICAgICAgICAgICAgICAgICAgICAgICAjIFJlcXVlc3QgIyBjb3JlcwpjbHVzdGVyRXhwb3J0KGNsLCBjKCJqYWdzX2RhdGEiLCAiaW5pdHMiLCAicGFyYW1ldGVycyIsICJ6X0EiLCAic3N0QSIsICJuaSIsICJuYSIsICJudCIpKSAjIE1ha2UgdGhlc2UgYXZhaWxhYmxlCmNsdXN0ZXJTZXRSTkdTdHJlYW0oY2wgPSBjbCwgNTQzNTQzNTQpCgpzeXN0ZW0udGltZSh7ICMgbm8gc3RhdHVzIGJhciAoJSBjb21wbGV0ZSkgd2hlbiBydW4gaW4gcGFyYWxsZWwKICBvdXRfMV9jcGljIDwtIGNsdXN0ZXJFdmFsUShjbCwgewogICAgbGlicmFyeShyamFncykKICAgIGptIDwtIGphZ3MubW9kZWwoIkNvZGUvSkFHUy9TQ1JfSW5kX1RpbWUudHh0IiwgamFnc19kYXRhLCBpbml0cywgbi5hZGFwdCA9IG5hLCBuLmNoYWlucyA9IDEpICMgQ29tcGlsZSBtb2RlbCBhbmQgcnVuIGJ1cm5pbgogICAgb3V0XzFfY3BpYyA8LSBjb2RhLnNhbXBsZXMoam0sIHBhcmFtZXRlcnMsIG4uaXRlciA9IG5pLCB0aGluID0gbnQpICMgU2FtcGxlIGZyb20gcG9zdGVyaW9yIGRpc3RyaWJ1dGlvbgogICAgcmV0dXJuKGFzLm1jbWMob3V0XzFfY3BpYykpCiAgfSkKfSkgIwoKc3RvcENsdXN0ZXIoY2wpCgpjcGljX0FfbWNtYyA8LSBtY21jLmxpc3Qob3V0XzFfY3BpYykKCnNhdmUoY3BpY19BX21jbWMsIGZpbGUgPSAiUmVzdWx0cy9KQUdTL2NwaWNfQV9tY21jLlJEYXRhIikKClJ1biBNb2RlbCBPbiBPYmplY3RzIGZvciBlYWNoIFNpdGUgLSBTcGVjaWVzIENvbWJpbmF0aW9uLgpwYXJhbWV0ZXJzLCBpbml0aWFsIHZhbHVlcywgaXRlcmF0aW9ucyAtIGFkYXB0LCBpdGVyYXRpb25zIC0gc2F2ZWQgZWFjaCBtY21jIGZpbGUgdW5kZXIgZm9sZGVyICJSZXN1bHRzL0pBR1MiICJKQUdTIgpgYGAKCiNTRUUgUkVTVCBPRiBDT0RFIElOICJTaXRlX1NwZWNpZXNfTW9kZWwuUiIgKFRvbyBsYXJnZSBmb3IgTWFya2Rvd24gdG8ga25pdCkKCgojIyBPYnRhaW5pbmcgTGlzdCBvZiBBY3Rpdml0eSBDZW50ZXJzIGFuZCBEZW5zaXR5IFBlciBTaXRlIGFuZCBTcGVjaWVzCkFzIE1DTUMgY2hhaW5zIHdlcmUgcnVuIGluIHBhcmFsbGVsIHByb2Nlc3NpbmcsIEkgZmlyc3QgY29tYmluZWQgcm93cyBvZiB0aGUgcmVzdWx0aW5nIDMgbGlzdCBvYmplY3RzIGludG8gb25lIHJlc3VsdCBvYmplY3QuIEkgdGhlbiBvYnRhaW5lZCBhY3Rpdml0eSBjZW50ZXJzIHBlciBpbmRpdmlkdWFsIGFuZCBkZW5zaXRpZXMgcGVyIHNpdGUgZnJvbSBlYWNoIGNvbXBsZXRlIE1DTUMgb2JqZWN0IGFmdGVyIGF2ZXJhZ2luZyB0aGUgcmVzdWx0cyBmcm9tIGFsbCBjaGFpbnMuCgpgYGB7ciwgZXZhbCA9IEZBTFNFfQoKIyMjIyMjIyBTaXRlIEEsIENQSUMgIyMjIyMjIyMKIyBMb2FkIE1DTUMgRGF0YQpsb2FkKCJSZXN1bHRzL0pBR1MvY3BpY19BX21jbWMuUkRhdGEiKQoKIyBjb21iaW5lIGNoYWlucwpkZl9tY21jX2NwaWNfQSA8LSBhcy5kYXRhLmZyYW1lKGNwaWNfQV9tY21jW1sxXV0pCmZvcihpIGluIDI6bGVuZ3RoKGNwaWNfQV9tY21jKSkgewogIGRmX21jbWNfY3BpY19BIDwtIGJpbmRfcm93cyhkZl9tY21jX2NwaWNfQSwgYXMuZGF0YS5mcmFtZShjcGljX0FfbWNtY1tbaV1dKSkKfQoKIyBPYnRhaW4gQWN0aXZpdHkgQ2VudGVycwpjZW50ZXJzX2NwaWNfQSA8LSBkZl9tY21jX2NwaWNfQSAlPiUKICBzZWxlY3Qoc3RhcnRzX3dpdGgoInNbIikpICU+JQogIHN1bW1hcmlzZV9hbGwobWVhbikgJT4lCiAgdCgpCgpjZW50ZXJzX2NwaWNfQSA8LSBjZW50ZXJzX2NwaWNfQVsxOjM2LCBdCgpoaXN0KGNlbnRlcnNfY3BpY19BW10pICMgYWN0aXZpdHkgY2VudGVycyBmb3IgaW5kaXZpZHVhbHMgY2F1Z2h0IGF0IGxlYXN0IG9uY2UKCgojIyMjIE9idGFpbmluZyBEZW5zaXR5IGFuZCBOIEZvciBTaXRlIEEgYW5kIENQSUNTIGZyb20gTUNNQyBPdXRwdXQgIyMjIwoKZGVuc2l0aWVzX2NwaWNfQSA8LSBkZl9tY21jX2NwaWNfQSRkZW5zaXR5WzUwMToxMDAwXSAjZGVuc2l0aWVzIHBlciBpdGVyYXRpb24gYWZ0ZXIgYnVybmluCm1lYW5fZGVuc2l0eV9jcGljX0EgPC0gbWVhbihkZW5zaXRpZXNfY3BpY19BKSAjIE1lYW4gIyB0dXJ0bGVzIHBlciAxMDAgbWV0ZXJzCgplc3RpbWF0ZWRfTl9jcGljX0EgPC0gZGZfbWNtY19jcGljX0EkTls1MDE6MTAwMF0KbWVhbl9lc3RfTl9jcGljX0EgPC0gbWVhbihlc3RpbWF0ZWRfTl9jcGljX0EpICMgTWVhbiAjIHR1cnRsZXMgb3ZlciB0cmFwIGFyZWEgKCsgYm91bmRhcnkpCm1lYW5fZXN0X05fY3BpY19BL21lYW5fZGVuc2l0eV9jcGljX0EKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKIyMjIyMjIyMjIyMjIFNpdGUgQSwgQ1NFUiAjIyMjIyMjIyMjIyMjIwpsb2FkKCJSZXN1bHRzL0pBR1MvY3Nlcl9BX21jbWMuUkRhdGEiKQoKIyBjb21iaW5lIGNoYWlucwpkZl9tY21jX2NzZXJfQSA8LSBhcy5kYXRhLmZyYW1lKGNzZXJfQV9tY21jW1sxXV0pCmZvcihpIGluIDI6bGVuZ3RoKGNzZXJfQV9tY21jKSkgewogIGRmX21jbWNfY3Nlcl9BIDwtIGJpbmRfcm93cyhkZl9tY21jX2NzZXJfQSwgYXMuZGF0YS5mcmFtZShjc2VyX0FfbWNtY1tbaV1dKSkKfQoKIyBPYnRhaW4gQWN0aXZpdHkgQ2VudGVycwpjZW50ZXJzX2NzZXJfQSA8LSBkZl9tY21jX2NzZXJfQSAlPiUKICBzZWxlY3Qoc3RhcnRzX3dpdGgoInNbIikpICU+JQogIHN1bW1hcmlzZV9hbGwobWVhbikgJT4lCiAgdCgpCgpjZW50ZXJzX2NzZXJfQSA8LSBjZW50ZXJzX2NzZXJfQVsxOm5faW5kQSwgXQoKaGlzdChjZW50ZXJzX2NzZXJfQSkgIyBhY3Rpdml0eSBjZW50ZXJzIGZvciBpbmRpdmlkdWFscyBjYXVnaHQgYXQgbGVhc3Qgb25jZQoKCiMjIyMgT2J0YWluaW5nIERlbnNpdHkgYW5kIE4gRm9yIFNpdGUgQSBhbmQgQ1NFUiBmcm9tIE1DTUMgT3V0cHV0ICMjIyMKCmRlbnNpdGllc19jc2VyX0EgPC0gZGZfbWNtY19jc2VyX0EkZGVuc2l0eVs1MDE6MTAwMF0gI2RlbnNpdGllcyBwZXIgaXRlcmF0aW9uIGFmdGVyIGJ1cm5pbgptZWFuX2RlbnNpdHlfY3Nlcl9BIDwtIG1lYW4oZGVuc2l0aWVzX2NzZXJfQSkgIyBNZWFuICMgdHVydGxlcyBwZXIgMTAwIG1ldGVycwoKZXN0aW1hdGVkX05fY3Nlcl9BIDwtIGRmX21jbWNfY3Nlcl9BJE5bNTAxOjEwMDBdCm1lYW5fZXN0X05fY3Nlcl9BIDwtIG1lYW4oZXN0aW1hdGVkX05fY3Nlcl9BKSAjIE1lYW4gIyB0dXJ0bGVzIG92ZXIgdHJhcCBhcmVhICgrIGJvdW5kYXJ5KQptZWFuX2VzdF9OX2NzZXJfQS9tZWFuX2RlbnNpdHlfY3Nlcl9BCgoKIyMjIyMjIyBTaXRlIEMsIENQSUMgIyMjIyMjIyMKCiMgTG9hZCBNQ01DIERhdGEKbG9hZCgiUmVzdWx0cy9KQUdTL2NwaWNfQ19tY21jLlJEYXRhIikKCiMgY29tYmluZSBjaGFpbnMKZGZfbWNtY19jcGljX0MgPC0gYXMuZGF0YS5mcmFtZShjcGljX0NfbWNtY1tbMV1dKQpmb3IoaSBpbiAyOmxlbmd0aChjcGljX0NfbWNtYykpIHsKICBkZl9tY21jX2NwaWNfQyA8LSBiaW5kX3Jvd3MoZGZfbWNtY19jcGljX0MsIGFzLmRhdGEuZnJhbWUoY3BpY19DX21jbWNbW2ldXSkpCn0KCiMgT2J0YWluIEFjdGl2aXR5IENlbnRlcnMKY2VudGVyc19jcGljX0MgPC0gZGZfbWNtY19jcGljX0MgJT4lCiAgc2VsZWN0KHN0YXJ0c193aXRoKCJzWyIpKSAlPiUKICBzdW1tYXJpc2VfYWxsKG1lYW4pICU+JQogIHQoKQoKY2VudGVyc19jcGljX0MgPC0gY2VudGVyc19jcGljX0NbMTpuX2luZEMsIF0KCmhpc3QoY2VudGVyc19jcGljX0MpICMgYWN0aXZpdHkgY2VudGVycyBmb3IgaW5kaXZpZHVhbHMgY2F1Z2h0IGF0IGxlYXN0IG9uY2UKIyBoaXN0KGNlbnRlcnMpCgojIyMjIE9idGFpbmluZyBEZW5zaXR5IGFuZCBOCgpkZW5zaXRpZXNfY3BpY19DIDwtIGRmX21jbWNfY3BpY19DJGRlbnNpdHlbNTAxOjEwMDBdICNkZW5zaXRpZXMgcGVyIGl0ZXJhdGlvbiBhZnRlciBidXJuaW4KbWVhbl9kZW5zaXR5X2NwaWNfQyA8LSBtZWFuKGRlbnNpdGllc19jcGljX0MpICMgTWVhbiAjIHR1cnRsZXMgcGVyIDEwMCBtZXRlcnMKCmVzdGltYXRlZF9OX2NwaWNfQyA8LSBkZl9tY21jX2NwaWNfQyROWzUwMToxMDAwXQptZWFuX2VzdF9OX2NwaWNfQyA8LSBtZWFuKGVzdGltYXRlZF9OX2NwaWNfQykgIyBNZWFuICMgdHVydGxlcyBvdmVyIHRyYXAgYXJlYSAoKyBib3VuZGFyeSkKbWVhbl9lc3RfTl9jcGljX0MvbWVhbl9kZW5zaXR5X2NwaWNfQwoKIyMjIyMjIyBTaXRlIEMsIENTRVIgIyMjIyMjIyMKCiMgTG9hZCBNQ01DIERhdGEKbG9hZCgiUmVzdWx0cy9KQUdTL2NzZXJfQ19tY21jLlJEYXRhIikKCiMgY29tYmluZSBjaGFpbnMKZGZfbWNtY19jc2VyX0MgPC0gYXMuZGF0YS5mcmFtZShjc2VyX0NfbWNtY1tbMV1dKQpmb3IoaSBpbiAyOmxlbmd0aChjc2VyX0NfbWNtYykpIHsKICBkZl9tY21jX2NzZXJfQyA8LSBiaW5kX3Jvd3MoZGZfbWNtY19jc2VyX0MsIGFzLmRhdGEuZnJhbWUoY3Nlcl9DX21jbWNbW2ldXSkpCn0KCiMgT2J0YWluIEFjdGl2aXR5IENlbnRlcnMKY2VudGVyc19jc2VyX0MgPC0gZGZfbWNtY19jc2VyX0MgJT4lCiAgc2VsZWN0KHN0YXJ0c193aXRoKCJzWyIpKSAlPiUKICBzdW1tYXJpc2VfYWxsKG1lYW4pICU+JQogIHQoKQoKY2VudGVyc19jc2VyX0MgPC0gY2VudGVyc19jc2VyX0NbMTpuX2luZEMsIF0KCmhpc3QoY2VudGVyc19jc2VyX0MpICMgYWN0aXZpdHkgY2VudGVycyBmb3IgaW5kaXZpZHVhbHMgY2F1Z2h0IGF0IGxlYXN0IG9uY2UKIyBoaXN0KGNlbnRlcnMpCgojIyMjIE9idGFpbmluZyBEZW5zaXR5IEZvciBTaXRlIDEgYW5kIENQSUNTIGZyb20gTUNNQyBPdXRwdXQgIyMjIwoKZGVuc2l0aWVzX2NzZXJfQyA8LSBkZl9tY21jX2NzZXJfQyRkZW5zaXR5WzUwMToxMDAwXSAjZGVuc2l0aWVzIHBlciBpdGVyYXRpb24gYWZ0ZXIgYnVybmluCm1lYW5fZGVuc2l0eV9jc2VyX0MgPC0gbWVhbihkZW5zaXRpZXNfY3Nlcl9DKSAjIE1lYW4gIyB0dXJ0bGVzIHBlciAxMDAgbWV0ZXJzCgplc3RpbWF0ZWRfTl9jc2VyX0MgPC0gZGZfbWNtY19jc2VyX0MkTls1MDE6MTAwMF0KbWVhbl9lc3RfTl9jc2VyX0MgPC0gbWVhbihlc3RpbWF0ZWRfTl9jc2VyX0MpICMgTWVhbiAjIHR1cnRsZXMgb3ZlciB0cmFwIGFyZWEgKCsgYm91bmRhcnkpCm1lYW5fZXN0X05fY3Nlcl9DL21lYW5fZGVuc2l0eV9jc2VyX0MKCgojIyMjIyMjIFNpdGUgRCwgQ1BJQyAjIyMjIyMjIwoKbG9hZCgiUmVzdWx0cy9KQUdTL2NwaWNfRF9tY21jLlJEYXRhIikKCiMgY29tYmluZSBjaGFpbnMKZGZfbWNtY19jcGljX0QgPC0gYXMuZGF0YS5mcmFtZShjcGljX0RfbWNtY1tbMV1dKQpmb3IoaSBpbiAyOmxlbmd0aChjcGljX0RfbWNtYykpIHsKICBkZl9tY21jX2NwaWNfRCA8LSBiaW5kX3Jvd3MoZGZfbWNtY19jcGljX0QsIGFzLmRhdGEuZnJhbWUoY3BpY19EX21jbWNbW2ldXSkpCn0KCiMgT2J0YWluIEFjdGl2aXR5IENlbnRlcnMKY2VudGVyc19jcGljX0QgPC0gZGZfbWNtY19jcGljX0QgJT4lCiAgc2VsZWN0KHN0YXJ0c193aXRoKCJzWyIpKSAlPiUKICBzdW1tYXJpc2VfYWxsKG1lYW4pICU+JQogIHQoKQoKY2VudGVyc19jcGljX0QgPC0gY2VudGVyc19jcGljX0RbMTpuX2luZEQsIF0KCmhpc3QoY2VudGVyc19jcGljX0QpICMgYWN0aXZpdHkgY2VudGVycyBmb3IgaW5kaXZpZHVhbHMgY2F1Z2h0IGF0IGxlYXN0IG9uY2UKIyBoaXN0KGNlbnRlcnMpCgojIyMjIE9idGFpbmluZyBEZW5zaXR5IEZvciBTaXRlIDEgYW5kIENQSUNTIGZyb20gTUNNQyBPdXRwdXQgIyMjIwoKZGVuc2l0aWVzX2NwaWNfRCA8LSBkZl9tY21jX2NwaWNfRCRkZW5zaXR5WzUwMToxMDAwXSAjZGVuc2l0aWVzIHBlciBpdGVyYXRpb24gYWZ0ZXIgYnVybmluCm1lYW5fZGVuc2l0eV9jcGljX0QgPC0gbWVhbihkZW5zaXRpZXNfY3BpY19EKSAjIE1lYW4gIyB0dXJ0bGVzIHBlciAxMDAgbWV0ZXJzCgplc3RpbWF0ZWRfTl9jcGljX0QgPC0gZGZfbWNtY19jcGljX0QkTls1MDE6MTAwMF0KbWVhbl9lc3RfTl9jcGljX0QgPC0gbWVhbihlc3RpbWF0ZWRfTl9jcGljX0QpICMgTWVhbiAjIHR1cnRsZXMgb3ZlciB0cmFwIGFyZWEgKCsgYm91bmRhcnkpCm1lYW5fZXN0X05fY3BpY19EL21lYW5fZGVuc2l0eV9jcGljX0QKCiMjIyMjIyMgU2l0ZSBFLCBDUElDICMjIyMjIyMjCgpsb2FkKCJSZXN1bHRzL0pBR1MvY3BpY19FX21jbWMuUkRhdGEiKQoKIyBjb21iaW5lIGNoYWlucwpkZl9tY21jX2NwaWNfRSA8LSBhcy5kYXRhLmZyYW1lKGNwaWNfRV9tY21jW1sxXV0pCmZvcihpIGluIDI6bGVuZ3RoKGNwaWNfRV9tY21jKSkgewogIGRmX21jbWNfY3BpY19FIDwtIGJpbmRfcm93cyhkZl9tY21jX2NwaWNfRSwgYXMuZGF0YS5mcmFtZShjcGljX0VfbWNtY1tbaV1dKSkKfQoKIyBPYnRhaW4gQWN0aXZpdHkgQ2VudGVycwpjZW50ZXJzX2NwaWNfRSA8LSBkZl9tY21jX2NwaWNfRSAlPiUKICBzZWxlY3Qoc3RhcnRzX3dpdGgoInNbIikpICU+JQogIHN1bW1hcmlzZV9hbGwobWVhbikgJT4lCiAgdCgpCgpjZW50ZXJzX2NwaWNfRSA8LSBjZW50ZXJzX2NwaWNfRVsxOm5faW5kRSwgXQoKaGlzdChjZW50ZXJzX2NwaWNfRSkgIyBhY3Rpdml0eSBjZW50ZXJzIGZvciBpbmRpdmlkdWFscyBjYXVnaHQgYXQgbGVhc3Qgb25jZQoKCiMjIyMgT2J0YWluaW5nIERlbnNpdHkgYW5kIE4KCmRlbnNpdGllc19jcGljX0UgPC0gZGZfbWNtY19jcGljX0UkZGVuc2l0eVs1MDE6MTAwMF0gI2RlbnNpdGllcyBwZXIgaXRlcmF0aW9uIGFmdGVyIGJ1cm5pbgptZWFuX2RlbnNpdHlfY3BpY19FIDwtIG1lYW4oZGVuc2l0aWVzX2NwaWNfRSkgIyBNZWFuICMgdHVydGxlcyBwZXIgMTAwIG1ldGVycwoKZXN0aW1hdGVkX05fY3BpY19FIDwtIGRmX21jbWNfY3BpY19FJE5bNTAxOjEwMDBdCm1lYW5fZXN0X05fY3BpY19FIDwtIG1lYW4oZXN0aW1hdGVkX05fY3BpY19FKSAjIE1lYW4gIyB0dXJ0bGVzIG92ZXIgdHJhcCBhcmVhICgrIGJvdW5kYXJ5KQptZWFuX2VzdF9OX2NwaWNfRS9tZWFuX2RlbnNpdHlfY3BpY19FCgoKIyMjIyMjIyBTaXRlIEUsIENTRVIgIyMjIyMjIyMKCmxvYWQoIlJlc3VsdHMvSkFHUy9jc2VyX0VfbWNtYy5SRGF0YSIpCgojIGNvbWJpbmUgY2hhaW5zCmRmX21jbWNfY3Nlcl9FIDwtIGFzLmRhdGEuZnJhbWUoY3Nlcl9FX21jbWNbWzFdXSkKZm9yKGkgaW4gMjpsZW5ndGgoY3Nlcl9FX21jbWMpKSB7CiAgZGZfbWNtY19jc2VyX0UgPC0gYmluZF9yb3dzKGRmX21jbWNfY3Nlcl9FLCBhcy5kYXRhLmZyYW1lKGNzZXJfRV9tY21jW1tpXV0pKQp9CgojIE9idGFpbiBBY3Rpdml0eSBDZW50ZXJzCmNlbnRlcnNfY3Nlcl9FIDwtIGRmX21jbWNfY3Nlcl9FICU+JQogIHNlbGVjdChzdGFydHNfd2l0aCgic1siKSkgJT4lCiAgc3VtbWFyaXNlX2FsbChtZWFuKSAlPiUKICB0KCkKCmNlbnRlcnNfY3Nlcl9FIDwtIGNlbnRlcnNfY3Nlcl9FWzE6bl9pbmRFLCBdCgpoaXN0KGNlbnRlcnNfY3Nlcl9FKSAjIGFjdGl2aXR5IGNlbnRlcnMgZm9yIGluZGl2aWR1YWxzIGNhdWdodCBhdCBsZWFzdCBvbmNlCgoKIyMjIyBPYnRhaW5pbmcgRGVuc2l0eSBhbmQgTgoKZGVuc2l0aWVzX2NzZXJfRSA8LSBkZl9tY21jX2NzZXJfRSRkZW5zaXR5WzUwMToxMDAwXSAjZGVuc2l0aWVzIHBlciBpdGVyYXRpb24gYWZ0ZXIgYnVybmluCm1lYW5fZGVuc2l0eV9jc2VyX0UgPC0gbWVhbihkZW5zaXRpZXNfY3Nlcl9FKSAjIE1lYW4gIyB0dXJ0bGVzIHBlciAxMDAgbWV0ZXJzCgplc3RpbWF0ZWRfTl9jc2VyX0UgPC0gZGZfbWNtY19jc2VyX0UkTls1MDE6MTAwMF0KbWVhbl9lc3RfTl9jc2VyX0UgPC0gbWVhbihlc3RpbWF0ZWRfTl9jc2VyX0UpICMgTWVhbiAjIHR1cnRsZXMgb3ZlciB0cmFwIGFyZWEgKCsgYm91bmRhcnkpCm1lYW5fZXN0X05fY3Nlcl9FL21lYW5fZGVuc2l0eV9jc2VyX0UKCgojIyMjIyMjIFNpdGUgRiwgQ1NFUiAjIyMjIyMjIwoKbG9hZCgiUmVzdWx0cy9KQUdTL2NzZXJfRl9tY21jLlJEYXRhIikKCiMgY29tYmluZSBjaGFpbnMKZGZfbWNtY19jc2VyX0YgPC0gYXMuZGF0YS5mcmFtZShjc2VyX0ZfbWNtY1tbMV1dKQpmb3IoaSBpbiAyOmxlbmd0aChjc2VyX0ZfbWNtYykpIHsKICBkZl9tY21jX2NzZXJfRiA8LSBiaW5kX3Jvd3MoZGZfbWNtY19jc2VyX0YsIGFzLmRhdGEuZnJhbWUoY3Nlcl9GX21jbWNbW2ldXSkpCn0KCiMgT2J0YWluIEFjdGl2aXR5IENlbnRlcnMKY2VudGVyc19jc2VyX0YgPC0gZGZfbWNtY19jc2VyX0YgJT4lCiAgc2VsZWN0KHN0YXJ0c193aXRoKCJzWyIpKSAlPiUKICBzdW1tYXJpc2VfYWxsKG1lYW4pICU+JQogIHQoKQoKY2VudGVyc19jc2VyX0YgPC0gY2VudGVyc19jc2VyX0ZbMTpuX2luZEYsIF0KCmhpc3QoY2VudGVyc19jc2VyX0YpICMgYWN0aXZpdHkgY2VudGVycyBmb3IgaW5kaXZpZHVhbHMgY2F1Z2h0IGF0IGxlYXN0IG9uY2UKCgojIyMjIE9idGFpbmluZyBEZW5zaXR5IGFuZCBOCgpkZW5zaXRpZXNfY3Nlcl9GIDwtIGRmX21jbWNfY3Nlcl9GJGRlbnNpdHlbNTAxOjEwMDBdICNkZW5zaXRpZXMgcGVyIGl0ZXJhdGlvbiBhZnRlciBidXJuaW4KbWVhbl9kZW5zaXR5X2NzZXJfRiA8LSBtZWFuKGRlbnNpdGllc19jc2VyX0YpICMgTWVhbiAjIHR1cnRsZXMgcGVyIDEwMCBtZXRlcnMKCmVzdGltYXRlZF9OX2NzZXJfRiA8LSBkZl9tY21jX2NzZXJfRiROWzUwMToxMDAwXQptZWFuX2VzdF9OX2NzZXJfRiA8LSBtZWFuKGVzdGltYXRlZF9OX2NzZXJfRikgIyBNZWFuICMgdHVydGxlcyBvdmVyIHRyYXAgYXJlYSAoKyBib3VuZGFyeSkKbWVhbl9lc3RfTl9jc2VyX0YvbWVhbl9kZW5zaXR5X2NzZXJfRgoKCiMjIyMjIyMgU2l0ZSBGLCBDUElDICMjIyMjIyMjCgpsb2FkKCJSZXN1bHRzL0pBR1MvY3BpY19GX21jbWMuUkRhdGEiKQoKIyBjb21iaW5lIGNoYWlucwpkZl9tY21jX2NwaWNfRiA8LSBhcy5kYXRhLmZyYW1lKGNwaWNfRl9tY21jW1sxXV0pCmZvcihpIGluIDI6bGVuZ3RoKGNwaWNfRl9tY21jKSkgewogIGRmX21jbWNfY3BpY19GIDwtIGJpbmRfcm93cyhkZl9tY21jX2NwaWNfRiwgYXMuZGF0YS5mcmFtZShjcGljX0ZfbWNtY1tbaV1dKSkKfQoKIyBPYnRhaW4gQWN0aXZpdHkgQ2VudGVycwpjZW50ZXJzX2NwaWNfRiA8LSBkZl9tY21jX2NwaWNfRiAlPiUKICBzZWxlY3Qoc3RhcnRzX3dpdGgoInNbIikpICU+JQogIHN1bW1hcmlzZV9hbGwobWVhbikgJT4lCiAgdCgpCgpjZW50ZXJzX2NwaWNfRiA8LSBjZW50ZXJzX2NwaWNfRlsxOm5faW5kRiwgXQoKaGlzdChjZW50ZXJzX2NwaWNfRikgIyBhY3Rpdml0eSBjZW50ZXJzIGZvciBpbmRpdmlkdWFscyBjYXVnaHQgYXQgbGVhc3Qgb25jZQoKCiMjIyMgT2J0YWluaW5nIERlbnNpdHkgYW5kIE4KCmRlbnNpdGllc19jcGljX0YgPC0gZGZfbWNtY19jcGljX0YkZGVuc2l0eVs1MDE6MTAwMF0gI2RlbnNpdGllcyBwZXIgaXRlcmF0aW9uIGFmdGVyIGJ1cm5pbgptZWFuX2RlbnNpdHlfY3BpY19GIDwtIG1lYW4oZGVuc2l0aWVzX2NwaWNfRikgIyBNZWFuICMgdHVydGxlcyBwZXIgMTAwIG1ldGVycwoKZXN0aW1hdGVkX05fY3BpY19GIDwtIGRmX21jbWNfY3BpY19GJE5bNTAxOjEwMDBdCm1lYW5fZXN0X05fY3BpY19GIDwtIG1lYW4oZXN0aW1hdGVkX05fY3BpY19GKSAjIE1lYW4gIyB0dXJ0bGVzIG92ZXIgdHJhcCBhcmVhICgrIGJvdW5kYXJ5KQptZWFuX2VzdF9OX2NwaWNfRi9tZWFuX2RlbnNpdHlfY3BpY19GCgoKIyMjIyMjIyBTaXRlIEcsIENQSUMgIyMjIyMjIyMKCmxvYWQoIlJlc3VsdHMvSkFHUy9jcGljX0dfbWNtYy5SRGF0YSIpCgojIGNvbWJpbmUgY2hhaW5zCmRmX21jbWNfY3BpY19HIDwtIGFzLmRhdGEuZnJhbWUoY3BpY19HX21jbWNbWzFdXSkKZm9yKGkgaW4gMjpsZW5ndGgoY3BpY19HX21jbWMpKSB7CiAgZGZfbWNtY19jcGljX0cgPC0gYmluZF9yb3dzKGRmX21jbWNfY3BpY19HLCBhcy5kYXRhLmZyYW1lKGNwaWNfR19tY21jW1tpXV0pKQp9CgojIE9idGFpbiBBY3Rpdml0eSBDZW50ZXJzCmNlbnRlcnNfY3BpY19HIDwtIGRmX21jbWNfY3BpY19HICU+JQogIHNlbGVjdChzdGFydHNfd2l0aCgic1siKSkgJT4lCiAgc3VtbWFyaXNlX2FsbChtZWFuKSAlPiUKICB0KCkKCmNlbnRlcnNfY3BpY19HIDwtIGNlbnRlcnNfY3BpY19HWzE6bl9pbmRHLCBdCgpoaXN0KGNlbnRlcnNfY3BpY19HKSAjIGFjdGl2aXR5IGNlbnRlcnMgZm9yIGluZGl2aWR1YWxzIGNhdWdodCBhdCBsZWFzdCBvbmNlCgoKIyMjIyBPYnRhaW5pbmcgRGVuc2l0eSBhbmQgTgoKZGVuc2l0aWVzX2NwaWNfRyA8LSBkZl9tY21jX2NwaWNfRyRkZW5zaXR5WzUwMToxMDAwXSAjZGVuc2l0aWVzIHBlciBpdGVyYXRpb24gYWZ0ZXIgYnVybmluCm1lYW5fZGVuc2l0eV9jcGljX0cgPC0gbWVhbihkZW5zaXRpZXNfY3BpY19HKSAjIE1lYW4gIyB0dXJ0bGVzIHBlciAxMDAgbWV0ZXJzCgplc3RpbWF0ZWRfTl9jcGljX0cgPC0gZGZfbWNtY19jcGljX0ckTls1MDE6MTAwMF0KbWVhbl9lc3RfTl9jcGljX0cgPC0gbWVhbihlc3RpbWF0ZWRfTl9jcGljX0cpICMgTWVhbiAjIHR1cnRsZXMgb3ZlciB0cmFwIGFyZWEgKCsgYm91bmRhcnkpCm1lYW5fZXN0X05fY3BpY19HL21lYW5fZGVuc2l0eV9jcGljX0cKCgojIyMjIyMjIFNpdGUgRywgQ1NFUiAjIyMjIyMjIwoKbG9hZCgiUmVzdWx0cy9KQUdTL2NzZXJfR19tY21jLlJEYXRhIikKCiMgY29tYmluZSBjaGFpbnMKZGZfbWNtY19jc2VyX0cgPC0gYXMuZGF0YS5mcmFtZShjc2VyX0dfbWNtY1tbMV1dKQpmb3IoaSBpbiAyOmxlbmd0aChjc2VyX0dfbWNtYykpIHsKICBkZl9tY21jX2NzZXJfRyA8LSBiaW5kX3Jvd3MoZGZfbWNtY19jc2VyX0csIGFzLmRhdGEuZnJhbWUoY3Nlcl9HX21jbWNbW2ldXSkpCn0KCiMgT2J0YWluIEFjdGl2aXR5IENlbnRlcnMKY2VudGVyc19jc2VyX0cgPC0gZGZfbWNtY19jc2VyX0cgJT4lCiAgc2VsZWN0KHN0YXJ0c193aXRoKCJzWyIpKSAlPiUKICBzdW1tYXJpc2VfYWxsKG1lYW4pICU+JQogIHQoKQoKY2VudGVyc19jc2VyX0cgPC0gY2VudGVyc19jc2VyX0dbMTpuX2luZEcsIF0KCmhpc3QoY2VudGVyc19jc2VyX0cpICMgYWN0aXZpdHkgY2VudGVycyBmb3IgaW5kaXZpZHVhbHMgY2F1Z2h0IGF0IGxlYXN0IG9uY2UKCgojIyMjIE9idGFpbmluZyBEZW5zaXR5IGFuZCBOCgpkZW5zaXRpZXNfY3Nlcl9HIDwtIGRmX21jbWNfY3Nlcl9HJGRlbnNpdHlbNTAxOjEwMDBdICNkZW5zaXRpZXMgcGVyIGl0ZXJhdGlvbiBhZnRlciBidXJuaW4KbWVhbl9kZW5zaXR5X2NzZXJfRyA8LSBtZWFuKGRlbnNpdGllc19jc2VyX0cpICMgTWVhbiAjIHR1cnRsZXMgcGVyIDEwMCBtZXRlcnMKCmVzdGltYXRlZF9OX2NzZXJfRyA8LSBkZl9tY21jX2NzZXJfRyROWzUwMToxMDAwXQptZWFuX2VzdF9OX2NzZXJfRyA8LSBtZWFuKGVzdGltYXRlZF9OX2NzZXJfRykgIyBNZWFuICMgdHVydGxlcyBvdmVyIHRyYXAgYXJlYSAoKyBib3VuZGFyeSkKbWVhbl9lc3RfTl9jc2VyX0cvbWVhbl9kZW5zaXR5X2NzZXJfRwoKCiMjIyMjIyMgU2l0ZSBKLCBDUElDICMjIyMjIyMjCgpsb2FkKCJSZXN1bHRzL0pBR1MvY3BpY19KX21jbWMuUkRhdGEiKQoKIyBjb21iaW5lIGNoYWlucwpkZl9tY21jX2NwaWNfSiA8LSBhcy5kYXRhLmZyYW1lKGNwaWNfSl9tY21jW1sxXV0pCmZvcihpIGluIDI6bGVuZ3RoKGNwaWNfSl9tY21jKSkgewogIGRmX21jbWNfY3BpY19KIDwtIGJpbmRfcm93cyhkZl9tY21jX2NwaWNfSiwgYXMuZGF0YS5mcmFtZShjcGljX0pfbWNtY1tbaV1dKSkKfQoKIyBPYnRhaW4gQWN0aXZpdHkgQ2VudGVycwpjZW50ZXJzX2NwaWNfSiA8LSBkZl9tY21jX2NwaWNfSiAlPiUKICBzZWxlY3Qoc3RhcnRzX3dpdGgoInNbIikpICU+JQogIHN1bW1hcmlzZV9hbGwobWVhbikgJT4lCiAgdCgpCgpjZW50ZXJzX2NwaWNfSiA8LSBjZW50ZXJzX2NwaWNfSlsxOm5faW5kSiwgXQoKaGlzdChjZW50ZXJzX2NwaWNfSikgIyBhY3Rpdml0eSBjZW50ZXJzIGZvciBpbmRpdmlkdWFscyBjYXVnaHQgYXQgbGVhc3Qgb25jZQoKCiMjIyMgT2J0YWluaW5nIERlbnNpdHkgYW5kIE4KCmRlbnNpdGllc19jcGljX0ogPC0gZGZfbWNtY19jcGljX0okZGVuc2l0eVs1MDE6MTAwMF0gI2RlbnNpdGllcyBwZXIgaXRlcmF0aW9uIGFmdGVyIGJ1cm5pbgptZWFuX2RlbnNpdHlfY3BpY19KIDwtIG1lYW4oZGVuc2l0aWVzX2NwaWNfSikgIyBNZWFuICMgdHVydGxlcyBwZXIgMTAwIG1ldGVycwoKZXN0aW1hdGVkX05fY3BpY19KIDwtIGRmX21jbWNfY3BpY19KJE5bNTAxOjEwMDBdCm1lYW5fZXN0X05fY3BpY19KIDwtIG1lYW4oZXN0aW1hdGVkX05fY3BpY19KKSAjIE1lYW4gIyB0dXJ0bGVzIG92ZXIgdHJhcCBhcmVhICgrIGJvdW5kYXJ5KQptZWFuX2VzdF9OX2NwaWNfSi9tZWFuX2RlbnNpdHlfY3BpY19KCgoKIyMjIyMjIyBTaXRlIEosIENTRVIgIyMjIyMjIyMKCmxvYWQoIlJlc3VsdHMvSkFHUy9jc2VyX0pfbWNtYy5SRGF0YSIpCgojIGNvbWJpbmUgY2hhaW5zCmRmX21jbWNfY3Nlcl9KIDwtIGFzLmRhdGEuZnJhbWUoY3Nlcl9KX21jbWNbWzFdXSkKZm9yKGkgaW4gMjpsZW5ndGgoY3Nlcl9KX21jbWMpKSB7CiAgZGZfbWNtY19jc2VyX0ogPC0gYmluZF9yb3dzKGRmX21jbWNfY3Nlcl9KLCBhcy5kYXRhLmZyYW1lKGNzZXJfSl9tY21jW1tpXV0pKQp9CgojIE9idGFpbiBBY3Rpdml0eSBDZW50ZXJzCmNlbnRlcnNfY3Nlcl9KIDwtIGRmX21jbWNfY3Nlcl9KICU+JQogIHNlbGVjdChzdGFydHNfd2l0aCgic1siKSkgJT4lCiAgc3VtbWFyaXNlX2FsbChtZWFuKSAlPiUKICB0KCkKCmNlbnRlcnNfY3Nlcl9KIDwtIGNlbnRlcnNfY3Nlcl9KWzE6bl9pbmRKLCBdCgpoaXN0KGNlbnRlcnNfY3Nlcl9KKSAjIGFjdGl2aXR5IGNlbnRlcnMgZm9yIGluZGl2aWR1YWxzIGNhdWdodCBhdCBsZWFzdCBvbmNlCgoKIyMjIyBPYnRhaW5pbmcgRGVuc2l0eSBhbmQgTgoKZGVuc2l0aWVzX2NzZXJfSiA8LSBkZl9tY21jX2NzZXJfSiRkZW5zaXR5WzUwMToxMDAwXSAjZGVuc2l0aWVzIHBlciBpdGVyYXRpb24gYWZ0ZXIgYnVybmluCm1lYW5fZGVuc2l0eV9jc2VyX0ogPC0gbWVhbihkZW5zaXRpZXNfY3Nlcl9KKSAjIE1lYW4gIyB0dXJ0bGVzIHBlciAxMDAgbWV0ZXJzCgplc3RpbWF0ZWRfTl9jc2VyX0ogPC0gZGZfbWNtY19jc2VyX0okTls1MDE6MTAwMF0KbWVhbl9lc3RfTl9jc2VyX0ogPC0gbWVhbihlc3RpbWF0ZWRfTl9jc2VyX0opICMgTWVhbiAjIHR1cnRsZXMgb3ZlciB0cmFwIGFyZWEgKCsgYm91bmRhcnkpCm1lYW5fZXN0X05fY3Nlcl9KL21lYW5fZGVuc2l0eV9jc2VyX0oKCgojIyMjIyMjIFNpdGUgSywgQ1BJQyAjIyMjIyMjIwoKbG9hZCgiUmVzdWx0cy9KQUdTL2NwaWNfS19tY21jLlJEYXRhIikKCiMgY29tYmluZSBjaGFpbnMKZGZfbWNtY19jcGljX0sgPC0gYXMuZGF0YS5mcmFtZShjcGljX0tfbWNtY1tbMV1dKQpmb3IoaSBpbiAyOmxlbmd0aChjcGljX0tfbWNtYykpIHsKICBkZl9tY21jX2NwaWNfSyA8LSBiaW5kX3Jvd3MoZGZfbWNtY19jcGljX0ssIGFzLmRhdGEuZnJhbWUoY3BpY19LX21jbWNbW2ldXSkpCn0KCiMgT2J0YWluIEFjdGl2aXR5IENlbnRlcnMKY2VudGVyc19jcGljX0sgPC0gZGZfbWNtY19jcGljX0sgJT4lCiAgc2VsZWN0KHN0YXJ0c193aXRoKCJzWyIpKSAlPiUKICBzdW1tYXJpc2VfYWxsKG1lYW4pICU+JQogIHQoKQoKY2VudGVyc19jcGljX0sgPC0gY2VudGVyc19jcGljX0tbMTpuX2luZEssIF0KCmhpc3QoY2VudGVyc19jcGljX0spICMgYWN0aXZpdHkgY2VudGVycyBmb3IgaW5kaXZpZHVhbHMgY2F1Z2h0IGF0IGxlYXN0IG9uY2UKCgojIyMjIE9idGFpbmluZyBEZW5zaXR5IGFuZCBOCgpkZW5zaXRpZXNfY3BpY19LIDwtIGRmX21jbWNfY3BpY19LJGRlbnNpdHlbNTAxOjEwMDBdICNkZW5zaXRpZXMgcGVyIGl0ZXJhdGlvbiBhZnRlciBidXJuaW4KbWVhbl9kZW5zaXR5X2NwaWNfSyA8LSBtZWFuKGRlbnNpdGllc19jcGljX0spICMgTWVhbiAjIHR1cnRsZXMgcGVyIDEwMCBtZXRlcnMKCmVzdGltYXRlZF9OX2NwaWNfSyA8LSBkZl9tY21jX2NwaWNfSyROWzUwMToxMDAwXQptZWFuX2VzdF9OX2NwaWNfSyA8LSBtZWFuKGVzdGltYXRlZF9OX2NwaWNfSykgIyBNZWFuICMgdHVydGxlcyBvdmVyIHRyYXAgYXJlYSAoKyBib3VuZGFyeSkKbWVhbl9lc3RfTl9jcGljX0svbWVhbl9kZW5zaXR5X2NwaWNfSwoKCiMjIyMjIyMgU2l0ZSBMLCBDUElDICMjIyMjIyMjCgpsb2FkKCJSZXN1bHRzL0pBR1MvY3BpY19MX21jbWMuUkRhdGEiKQoKIyBjb21iaW5lIGNoYWlucwpkZl9tY21jX2NwaWNfTCA8LSBhcy5kYXRhLmZyYW1lKGNwaWNfTF9tY21jW1sxXV0pCmZvcihpIGluIDI6bGVuZ3RoKGNwaWNfTF9tY21jKSkgewogIGRmX21jbWNfY3BpY19MIDwtIGJpbmRfcm93cyhkZl9tY21jX2NwaWNfTCwgYXMuZGF0YS5mcmFtZShjcGljX0xfbWNtY1tbaV1dKSkKfQoKIyBPYnRhaW4gQWN0aXZpdHkgQ2VudGVycwpjZW50ZXJzX2NwaWNfTCA8LSBkZl9tY21jX2NwaWNfTCAlPiUKICBzZWxlY3Qoc3RhcnRzX3dpdGgoInNbIikpICU+JQogIHN1bW1hcmlzZV9hbGwobWVhbikgJT4lCiAgdCgpCgpjZW50ZXJzX2NwaWNfTCA8LSBjZW50ZXJzX2NwaWNfTFsxOm5faW5kTCwgXQoKaGlzdChjZW50ZXJzX2NwaWNfTCkgIyBhY3Rpdml0eSBjZW50ZXJzIGZvciBpbmRpdmlkdWFscyBjYXVnaHQgYXQgbGVhc3Qgb25jZQoKCiMjIyMgT2J0YWluaW5nIERlbnNpdHkgYW5kIE4KCmRlbnNpdGllc19jcGljX0wgPC0gZGZfbWNtY19jcGljX0wkZGVuc2l0eVs1MDE6MTAwMF0gI2RlbnNpdGllcyBwZXIgaXRlcmF0aW9uIGFmdGVyIGJ1cm5pbgptZWFuX2RlbnNpdHlfY3BpY19MIDwtIG1lYW4oZGVuc2l0aWVzX2NwaWNfTCkgIyBNZWFuICMgdHVydGxlcyBwZXIgMTAwIG1ldGVycwoKZXN0aW1hdGVkX05fY3BpY19MIDwtIGRmX21jbWNfY3BpY19MJE5bNTAxOjEwMDBdCm1lYW5fZXN0X05fY3BpY19MIDwtIG1lYW4oZXN0aW1hdGVkX05fY3BpY19MKSAjIE1lYW4gIyB0dXJ0bGVzIG92ZXIgdHJhcCBhcmVhICgrIGJvdW5kYXJ5KQptZWFuX2VzdF9OX2NwaWNfTC9tZWFuX2RlbnNpdHlfY3BpY19MCgoKIyMjIyMjIyBTaXRlIE0sIENQSUMgIyMjIyMjIyMKCmxvYWQoIlJlc3VsdHMvSkFHUy9jcGljX01fbWNtYy5SRGF0YSIpCgojIGNvbWJpbmUgY2hhaW5zCmRmX21jbWNfY3BpY19NIDwtIGFzLmRhdGEuZnJhbWUoY3BpY19NX21jbWNbWzFdXSkKZm9yKGkgaW4gMjpsZW5ndGgoY3BpY19NX21jbWMpKSB7CiAgZGZfbWNtY19jcGljX00gPC0gYmluZF9yb3dzKGRmX21jbWNfY3BpY19NLCBhcy5kYXRhLmZyYW1lKGNwaWNfTV9tY21jW1tpXV0pKQp9CgojIE9idGFpbiBBY3Rpdml0eSBDZW50ZXJzCmNlbnRlcnNfY3BpY19NIDwtIGRmX21jbWNfY3BpY19NICU+JQogIHNlbGVjdChzdGFydHNfd2l0aCgic1siKSkgJT4lCiAgc3VtbWFyaXNlX2FsbChtZWFuKSAlPiUKICB0KCkKCmNlbnRlcnNfY3BpY19NIDwtIGNlbnRlcnNfY3BpY19NWzE6bl9pbmRNLCBdCgpoaXN0KGNlbnRlcnNfY3BpY19NKSAjIGFjdGl2aXR5IGNlbnRlcnMgZm9yIGluZGl2aWR1YWxzIGNhdWdodCBhdCBsZWFzdCBvbmNlCgoKIyMjIyBPYnRhaW5pbmcgRGVuc2l0eSBhbmQgTgoKZGVuc2l0aWVzX2NwaWNfTSA8LSBkZl9tY21jX2NwaWNfTSRkZW5zaXR5WzUwMToxMDAwXSAjZGVuc2l0aWVzIHBlciBpdGVyYXRpb24gYWZ0ZXIgYnVybmluCm1lYW5fZGVuc2l0eV9jcGljX00gPC0gbWVhbihkZW5zaXRpZXNfY3BpY19NKSAjIE1lYW4gIyB0dXJ0bGVzIHBlciAxMDAgbWV0ZXJzCgplc3RpbWF0ZWRfTl9jcGljX00gPC0gZGZfbWNtY19jcGljX00kTls1MDE6MTAwMF0KbWVhbl9lc3RfTl9jcGljX00gPC0gbWVhbihlc3RpbWF0ZWRfTl9jcGljX00pICMgTWVhbiAjIHR1cnRsZXMgb3ZlciB0cmFwIGFyZWEgKCsgYm91bmRhcnkpCm1lYW5fZXN0X05fY3BpY19NL21lYW5fZGVuc2l0eV9jcGljX00KCgojIyMjIyMjIFNpdGUgTSwgQ1NFUiAjIyMjIyMjIwoKbG9hZCgiUmVzdWx0cy9KQUdTL2NzZXJfTV9tY21jLlJEYXRhIikKCiMgY29tYmluZSBjaGFpbnMKZGZfbWNtY19jc2VyX00gPC0gYXMuZGF0YS5mcmFtZShjc2VyX01fbWNtY1tbMV1dKQpmb3IoaSBpbiAyOmxlbmd0aChjc2VyX01fbWNtYykpIHsKICBkZl9tY21jX2NzZXJfTSA8LSBiaW5kX3Jvd3MoZGZfbWNtY19jc2VyX00sIGFzLmRhdGEuZnJhbWUoY3Nlcl9NX21jbWNbW2ldXSkpCn0KCiMgT2J0YWluIEFjdGl2aXR5IENlbnRlcnMKY2VudGVyc19jc2VyX00gPC0gZGZfbWNtY19jc2VyX00gJT4lCiAgc2VsZWN0KHN0YXJ0c193aXRoKCJzWyIpKSAlPiUKICBzdW1tYXJpc2VfYWxsKG1lYW4pICU+JQogIHQoKQoKY2VudGVyc19jc2VyX00gPC0gY2VudGVyc19jc2VyX01bMTpuX2luZE0sIF0KCmhpc3QoY2VudGVyc19jc2VyX00pICMgYWN0aXZpdHkgY2VudGVycyBmb3IgaW5kaXZpZHVhbHMgY2F1Z2h0IGF0IGxlYXN0IG9uY2UKCgojIyMjIE9idGFpbmluZyBEZW5zaXR5IGFuZCBOCgpkZW5zaXRpZXNfY3Nlcl9NIDwtIGRmX21jbWNfY3Nlcl9NJGRlbnNpdHlbNTAxOjEwMDBdICNkZW5zaXRpZXMgcGVyIGl0ZXJhdGlvbiBhZnRlciBidXJuaW4KbWVhbl9kZW5zaXR5X2NzZXJfTSA8LSBtZWFuKGRlbnNpdGllc19jc2VyX00pICMgTWVhbiAjIHR1cnRsZXMgcGVyIDEwMCBtZXRlcnMKCmVzdGltYXRlZF9OX2NzZXJfTSA8LSBkZl9tY21jX2NzZXJfTSROWzUwMToxMDAwXQptZWFuX2VzdF9OX2NzZXJfTSA8LSBtZWFuKGVzdGltYXRlZF9OX2NzZXJfTSkgIyBNZWFuICMgdHVydGxlcyBvdmVyIHRyYXAgYXJlYSAoKyBib3VuZGFyeSkKbWVhbl9lc3RfTl9jc2VyX00vbWVhbl9kZW5zaXR5X2NzZXJfTQoKCiMjIyMjIyMgU2l0ZSBOLCBDUElDICMjIyMjIyMjCgpsb2FkKCJSZXN1bHRzL0pBR1MvY3BpY19OX21jbWMuUkRhdGEiKQoKIyBjb21iaW5lIGNoYWlucwpkZl9tY21jX2NwaWNfTiA8LSBhcy5kYXRhLmZyYW1lKGNwaWNfTl9tY21jW1sxXV0pCmZvcihpIGluIDI6bGVuZ3RoKGNwaWNfTl9tY21jKSkgewogIGRmX21jbWNfY3BpY19OIDwtIGJpbmRfcm93cyhkZl9tY21jX2NwaWNfTiwgYXMuZGF0YS5mcmFtZShjcGljX05fbWNtY1tbaV1dKSkKfQoKIyBPYnRhaW4gQWN0aXZpdHkgQ2VudGVycwpjZW50ZXJzX2NwaWNfTiA8LSBkZl9tY21jX2NwaWNfTiAlPiUKICBzZWxlY3Qoc3RhcnRzX3dpdGgoInNbIikpICU+JQogIHN1bW1hcmlzZV9hbGwobWVhbikgJT4lCiAgdCgpCgpjZW50ZXJzX2NwaWNfTiA8LSBjZW50ZXJzX2NwaWNfTlsxOm5faW5kTiwgXQoKaGlzdChjZW50ZXJzX2NwaWNfTikgIyBhY3Rpdml0eSBjZW50ZXJzIGZvciBpbmRpdmlkdWFscyBjYXVnaHQgYXQgbGVhc3Qgb25jZQoKIyMjIyBPYnRhaW5pbmcgRGVuc2l0eSBhbmQgTgoKZGVuc2l0aWVzX2NwaWNfTiA8LSBkZl9tY21jX2NwaWNfTiRkZW5zaXR5WzUwMToxMDAwXSAjZGVuc2l0aWVzIHBlciBpdGVyYXRpb24gYWZ0ZXIgYnVybmluCm1lYW5fZGVuc2l0eV9jcGljX04gPC0gbWVhbihkZW5zaXRpZXNfY3BpY19OKSAjIE1lYW4gIyB0dXJ0bGVzIHBlciAxMDAgbWV0ZXJzCgplc3RpbWF0ZWRfTl9jcGljX04gPC0gZGZfbWNtY19jcGljX04kTls1MDE6MTAwMF0KbWVhbl9lc3RfTl9jcGljX04gPC0gbWVhbihlc3RpbWF0ZWRfTl9jcGljX04pICMgTWVhbiAjIHR1cnRsZXMgb3ZlciB0cmFwIGFyZWEgKCsgYm91bmRhcnkpCm1lYW5fZXN0X05fY3BpY19OL21lYW5fZGVuc2l0eV9jcGljX04KCgojIyMjIyMjIFNpdGUgTiwgQ1NFUiAjIyMjIyMjIwoKbG9hZCgiUmVzdWx0cy9KQUdTL2NzZXJfTl9tY21jLlJEYXRhIikKCiMgY29tYmluZSBjaGFpbnMKZGZfbWNtY19jc2VyX04gPC0gYXMuZGF0YS5mcmFtZShjc2VyX05fbWNtY1tbMV1dKQpmb3IoaSBpbiAyOmxlbmd0aChjc2VyX05fbWNtYykpIHsKICBkZl9tY21jX2NzZXJfTiA8LSBiaW5kX3Jvd3MoZGZfbWNtY19jc2VyX04sIGFzLmRhdGEuZnJhbWUoY3Nlcl9OX21jbWNbW2ldXSkpCn0KCiMgT2J0YWluIEFjdGl2aXR5IENlbnRlcnMKY2VudGVyc19jc2VyX04gPC0gZGZfbWNtY19jc2VyX04gJT4lCiAgc2VsZWN0KHN0YXJ0c193aXRoKCJzWyIpKSAlPiUKICBzdW1tYXJpc2VfYWxsKG1lYW4pICU+JQogIHQoKQoKY2VudGVyc19jc2VyX04gPC0gY2VudGVyc19jc2VyX05bMTpuX2luZE4sIF0KCmhpc3QoY2VudGVyc19jc2VyX04pICMgYWN0aXZpdHkgY2VudGVycyBmb3IgaW5kaXZpZHVhbHMgY2F1Z2h0IGF0IGxlYXN0IG9uY2UKCiMjIyMgT2J0YWluaW5nIERlbnNpdHkgYW5kIE4KCmRlbnNpdGllc19jc2VyX04gPC0gZGZfbWNtY19jc2VyX04kZGVuc2l0eVs1MDE6MTAwMF0gI2RlbnNpdGllcyBwZXIgaXRlcmF0aW9uIGFmdGVyIGJ1cm5pbgptZWFuX2RlbnNpdHlfY3Nlcl9OIDwtIG1lYW4oZGVuc2l0aWVzX2NzZXJfTikgIyBNZWFuICMgdHVydGxlcyBwZXIgMTAwIG1ldGVycwoKZXN0aW1hdGVkX05fY3Nlcl9OIDwtIGRmX21jbWNfY3Nlcl9OJE5bNTAxOjEwMDBdCm1lYW5fZXN0X05fY3Nlcl9OIDwtIG1lYW4oZXN0aW1hdGVkX05fY3Nlcl9OKSAjIE1lYW4gIyB0dXJ0bGVzIG92ZXIgdHJhcCBhcmVhICgrIGJvdW5kYXJ5KQptZWFuX2VzdF9OX2NzZXJfTi9tZWFuX2RlbnNpdHlfY3Nlcl9OCgoKIyMjIyMjIyBTaXRlIE8sIENQSUMgIyMjIyMjIyMKCmxvYWQoIlJlc3VsdHMvSkFHUy9jcGljX09fbWNtYy5SRGF0YSIpCgojIGNvbWJpbmUgY2hhaW5zCmRmX21jbWNfY3BpY19PIDwtIGFzLmRhdGEuZnJhbWUoY3BpY19PX21jbWNbWzFdXSkKZm9yKGkgaW4gMjpsZW5ndGgoY3BpY19PX21jbWMpKSB7CiAgZGZfbWNtY19jcGljX08gPC0gYmluZF9yb3dzKGRmX21jbWNfY3BpY19PLCBhcy5kYXRhLmZyYW1lKGNwaWNfT19tY21jW1tpXV0pKQp9CgojIE9idGFpbiBBY3Rpdml0eSBDZW50ZXJzCmNlbnRlcnNfY3BpY19PIDwtIGRmX21jbWNfY3BpY19PICU+JQogIHNlbGVjdChzdGFydHNfd2l0aCgic1siKSkgJT4lCiAgc3VtbWFyaXNlX2FsbChtZWFuKSAlPiUKICB0KCkKCmNlbnRlcnNfY3BpY19PIDwtIGNlbnRlcnNfY3BpY19PWzE6bl9pbmRPLCBdCgpoaXN0KGNlbnRlcnNfY3BpY19PKSAjIGFjdGl2aXR5IGNlbnRlcnMgZm9yIGluZGl2aWR1YWxzIGNhdWdodCBhdCBsZWFzdCBvbmNlCgojIyMjIE9idGFpbmluZyBEZW5zaXR5IGFuZCBOCgpkZW5zaXRpZXNfY3BpY19PIDwtIGRmX21jbWNfY3BpY19PJGRlbnNpdHlbNTAxOjEwMDBdICNkZW5zaXRpZXMgcGVyIGl0ZXJhdGlvbiBhZnRlciBidXJuaW4KbWVhbl9kZW5zaXR5X2NwaWNfTyA8LSBtZWFuKGRlbnNpdGllc19jcGljX08pICMgTWVhbiAjIHR1cnRsZXMgcGVyIDEwMCBtZXRlcnMKCmVzdGltYXRlZF9OX2NwaWNfTyA8LSBkZl9tY21jX2NwaWNfTyROWzUwMToxMDAwXQptZWFuX2VzdF9OX2NwaWNfTyA8LSBtZWFuKGVzdGltYXRlZF9OX2NwaWNfTykgIyBNZWFuICMgdHVydGxlcyBvdmVyIHRyYXAgYXJlYSAoKyBib3VuZGFyeSkKbWVhbl9lc3RfTl9jcGljX08vbWVhbl9kZW5zaXR5X2NwaWNfTwoKCiMjIyMjIyMgU2l0ZSBPLCBDU0VSICMjIyMjIyMjCgpsb2FkKCJSZXN1bHRzL0pBR1MvY3Nlcl9PX21jbWMuUkRhdGEiKQoKIyBjb21iaW5lIGNoYWlucwpkZl9tY21jX2NzZXJfTyA8LSBhcy5kYXRhLmZyYW1lKGNzZXJfT19tY21jW1sxXV0pCmZvcihpIGluIDI6bGVuZ3RoKGNzZXJfT19tY21jKSkgewogIGRmX21jbWNfY3Nlcl9PIDwtIGJpbmRfcm93cyhkZl9tY21jX2NzZXJfTywgYXMuZGF0YS5mcmFtZShjc2VyX09fbWNtY1tbaV1dKSkKfQoKIyBPYnRhaW4gQWN0aXZpdHkgQ2VudGVycwpjZW50ZXJzX2NzZXJfTyA8LSBkZl9tY21jX2NzZXJfTyAlPiUKICBzZWxlY3Qoc3RhcnRzX3dpdGgoInNbIikpICU+JQogIHN1bW1hcmlzZV9hbGwobWVhbikgJT4lCiAgdCgpCgpjZW50ZXJzX2NzZXJfTyA8LSBjZW50ZXJzX2NzZXJfT1sxOm5faW5kTywgXQoKaGlzdChjZW50ZXJzX2NzZXJfTykgIyBhY3Rpdml0eSBjZW50ZXJzIGZvciBpbmRpdmlkdWFscyBjYXVnaHQgYXQgbGVhc3Qgb25jZQoKCiMjIyMgT2J0YWluaW5nIERlbnNpdHkgYW5kIE4KCmRlbnNpdGllc19jc2VyX08gPC0gZGZfbWNtY19jc2VyX08kZGVuc2l0eVs1MDE6MTAwMF0gI2RlbnNpdGllcyBwZXIgaXRlcmF0aW9uIGFmdGVyIGJ1cm5pbgptZWFuX2RlbnNpdHlfY3Nlcl9PIDwtIG1lYW4oZGVuc2l0aWVzX2NzZXJfTykgIyBNZWFuICMgdHVydGxlcyBwZXIgMTAwIG1ldGVycwoKZXN0aW1hdGVkX05fY3Nlcl9PIDwtIGRmX21jbWNfY3Nlcl9PJE5bNTAxOjEwMDBdCm1lYW5fZXN0X05fY3Nlcl9PIDwtIG1lYW4oZXN0aW1hdGVkX05fY3Nlcl9PKSAjIE1lYW4gIyB0dXJ0bGVzIG92ZXIgdHJhcCBhcmVhICgrIGJvdW5kYXJ5KQptZWFuX2VzdF9OX2NzZXJfTy9tZWFuX2RlbnNpdHlfY3Nlcl9PCgpgYGAKCiMjIFBsb3R0aW5nIENQSUMgQWN0aXZpdHkgQ2VudGVycwpPbmx5IENQSUMgYWN0aXZpdHkgY2VudGVycyB3ZXJlIHBsb3R0ZWQgYXMgQ1NFUiBkZW5zaXRpZXMgd2VyZSB2ZXJ5IGxvdy4KYGBge3IsIGV2YWwgPSBGQUxTRX0KZmlsZXBhdGhzIDwtIGMoIkFDX1Bsb3RzMi5wZGYiLCJBQ19QbG90czEucGRmIikKa25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoZmlsZXBhdGhzKQoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIFBsb3R0aW5nIEFjdGl2aXR5IENlbnRlcnMgIyMjIyMjIyMjIyMjIyMjIwojIyMjIFNlZSBhbGwgcGxvdHMgYXQgZW5kISEKCnBhcihtZnJvdz1jKDMsMikpCnBsb3QoeHkuY29vcmRzKHggPSBjZW50ZXJzX2NwaWNfQVtdLCB5ID0gcmVwKDAsIDM2KSksIHBjaCA9ICIuIiwgY2V4ID0gNCwgeGxhYiA9ICJTdGFuZGFyZGl6ZWQgTG9jYXRpb24gaW4gU2l0ZSIsIHlsYWIgPSAiIiwgY29sID0gInJlZCIsIG1haW4gPSAiQ1BJQyBBY3Rpdml0eSBDZW50ZXJzOiBTaXRlIEEiKQpwbG90KHh5LmNvb3Jkcyh4ID0gY2VudGVyc19jcGljX0NbXSwgeSA9IHJlcCgwLCAzMCkpLCBwY2ggPSAiLiIsIGNleCA9IDQsIHhsYWIgPSAiU3RhbmRhcmRpemVkIExvY2F0aW9uIGluIFNpdGUiLCB5bGFiID0gIiIsIGNvbCA9ICJyZWQiLCBtYWluID0gIkNQSUMgQWN0aXZpdHkgQ2VudGVyczogU2l0ZSBDIikKcGxvdCh4eS5jb29yZHMoeCA9IGNlbnRlcnNfY3BpY19EW10sIHkgPSByZXAoMCwgMjIpKSwgcGNoID0gIi4iLCBjZXggPSA0LCB4bGFiID0gIlN0YW5kYXJkaXplZCBMb2NhdGlvbiBpbiBTaXRlIiwgeWxhYiA9ICIiLCBjb2wgPSAicmVkIiwgbWFpbiA9ICJDUElDIEFjdGl2aXR5IENlbnRlcnM6IFNpdGUgRCIpCnBsb3QoeHkuY29vcmRzKHggPSBjZW50ZXJzX2NwaWNfRVtdLCB5ID0gcmVwKDAsIDQyKSksIHBjaCA9ICIuIiwgY2V4ID0gNCwgeGxhYiA9ICJTdGFuZGFyZGl6ZWQgTG9jYXRpb24gaW4gU2l0ZSIsIHlsYWIgPSAiIiwgY29sID0gInJlZCIsIG1haW4gPSAiQ1BJQyBBY3Rpdml0eSBDZW50ZXJzOiBTaXRlIEUiKQpwbG90KHh5LmNvb3Jkcyh4ID0gY2VudGVyc19jcGljX0ZbXSwgeSA9IHJlcCgwLCAxMjgpKSwgcGNoID0gIi4iLCBjZXggPSA0LCB4bGFiID0gIlN0YW5kYXJkaXplZCBMb2NhdGlvbiBpbiBTaXRlIiwgeWxhYiA9ICIiLCBjb2wgPSAicmVkIiwgbWFpbiA9ICJDUElDIEFjdGl2aXR5IENlbnRlcnM6IFNpdGUgRiIpCnBsb3QoeHkuY29vcmRzKHggPSBjZW50ZXJzX2NwaWNfR1tdLCB5ID0gcmVwKDAsIDU0KSksIHBjaCA9ICIuIiwgY2V4ID0gNCwgeGxhYiA9ICJTdGFuZGFyZGl6ZWQgTG9jYXRpb24gaW4gU2l0ZSIsIHlsYWIgPSAiIiwgY29sID0gInJlZCIsIG1haW4gPSAiQ1BJQyBBY3Rpdml0eSBDZW50ZXJzOiBTaXRlIEciKQpwbG90KHh5LmNvb3Jkcyh4ID0gY2VudGVyc19jcGljX0pbXSwgeSA9IHJlcCgwLCA2OCkpLCBwY2ggPSAiLiIsIGNleCA9IDQsIHhsYWIgPSAiU3RhbmRhcmRpemVkIExvY2F0aW9uIGluIFNpdGUiLCB5bGFiID0gIiIsIGNvbCA9ICJyZWQiLCBtYWluID0gIkNQSUMgQWN0aXZpdHkgQ2VudGVyczogU2l0ZSBKIikKcGxvdCh4eS5jb29yZHMoeCA9IGNlbnRlcnNfY3BpY19LW10sIHkgPSByZXAoMCwgMzEpKSwgcGNoID0gIi4iLCBjZXggPSA0LCB4bGFiID0gIlN0YW5kYXJkaXplZCBMb2NhdGlvbiBpbiBTaXRlIiwgeWxhYiA9ICIiLCBjb2wgPSAicmVkIiwgbWFpbiA9ICJDUElDIEFjdGl2aXR5IENlbnRlcnM6IFNpdGUgSyIpCnBsb3QoeHkuY29vcmRzKHggPSBjZW50ZXJzX2NwaWNfTFtdLCB5ID0gcmVwKDAsIDI1KSksIHBjaCA9ICIuIiwgY2V4ID0gNCwgeGxhYiA9ICJTdGFuZGFyZGl6ZWQgTG9jYXRpb24gaW4gU2l0ZSIsIHlsYWIgPSAiIiwgY29sID0gInJlZCIsIG1haW4gPSAiQ1BJQyBBY3Rpdml0eSBDZW50ZXJzOiBTaXRlIEwiKQpwbG90KHh5LmNvb3Jkcyh4ID0gY2VudGVyc19jcGljX01bXSwgeSA9IHJlcCgwLCA4MikpLCBwY2ggPSAiLiIsIGNleCA9IDQsIHhsYWIgPSAiU3RhbmRhcmRpemVkIExvY2F0aW9uIGluIFNpdGUiLCB5bGFiID0gIiIsIGNvbCA9ICJyZWQiLCBtYWluID0gIkNQSUMgQWN0aXZpdHkgQ2VudGVyczogU2l0ZSBNIikKcGxvdCh4eS5jb29yZHMoeCA9IGNlbnRlcnNfY3BpY19OW10sIHkgPSByZXAoMCwgODQpKSwgcGNoID0gIi4iLCBjZXggPSA0LCB4bGFiID0gIlN0YW5kYXJkaXplZCBMb2NhdGlvbiBpbiBTaXRlIiwgeWxhYiA9ICIiLCBjb2wgPSAicmVkIiwgbWFpbiA9ICJDUElDIEFjdGl2aXR5IENlbnRlcnM6IFNpdGUgTiIpCnBsb3QoeHkuY29vcmRzKHggPSBjZW50ZXJzX2NwaWNfT1tdLCB5ID0gcmVwKDAsIDgwKSksIHBjaCA9ICIuIiwgY2V4ID0gNCwgeGxhYiA9ICJTdGFuZGFyZGl6ZWQgTG9jYXRpb24gaW4gU2l0ZSIsIHlsYWIgPSAiIiwgY29sID0gInJlZCIsIG1haW4gPSAiQ1BJQyBBY3Rpdml0eSBDZW50ZXJzOiBTaXRlIE8iKQoKYGBgCgpgYGB7cn0KZmlsZXBhdGhzIDwtIGMoIkFDX1Bsb3RzMi5wZGYiLCJBQ19QbG90czEucGRmIikKa25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoZmlsZXBhdGhzKQpgYGAKCgoKIyMgSGlzdG9ncmFtcwpJIHRoZW4gZXhhbWluZWQgdGhlIGRpc3RyaWJ1dGlvbiBvZiBhY3Rpdml0eSBjZW50ZXJzIGF0IGVhY2ggc2l0ZSBmb3IgZWFjaCBzcGVjaWVzIGJ5IHBsb3R0aW5nIGhpc3RvZ3JhbXMuCgpgYGB7ciwgZXZhbCA9IEZBTFNFfQoKZmlsZXBhdGhzIDwtIGMoIkFDX0hpc3QxX0NQSUMucGRmIiwgIkFDX0hpc3RfQ1BJQy5wZGYiLCAiQUNfSGlzdDFfQ1NFUi5wZGYiLCAiQUNfSGlzdDJfQ1NFUi5wZGYiKQprbml0cjo6aW5jbHVkZV9ncmFwaGljcyhmaWxlcGF0aHMpCgpwYXIobWZyb3cgPSBjKDMsMikpCmhpc3QoY2VudGVyc19jcGljX0EsIG1haW4gPSAiQ1BJQyBBIiwgeGxhYiA9ICJBY3Rpdml0eSBDZW50ZXJzIikKaGlzdChjZW50ZXJzX2NwaWNfQywgbWFpbiA9ICJDUElDIEMiLCB4bGFiID0gIkFjdGl2aXR5IENlbnRlcnMiKQpoaXN0KGNlbnRlcnNfY3BpY19ELCBtYWluID0gIkNQSUMgRCIsIHhsYWIgPSAiQWN0aXZpdHkgQ2VudGVycyIpCmhpc3QoY2VudGVyc19jcGljX0UsIG1haW4gPSAiQ1BJQyBFIiwgeGxhYiA9ICJBY3Rpdml0eSBDZW50ZXJzIikKaGlzdChjZW50ZXJzX2NwaWNfRiwgbWFpbiA9ICJDUElDIEYiLCB4bGFiID0gIkFjdGl2aXR5IENlbnRlcnMiKQpoaXN0KGNlbnRlcnNfY3BpY19HLCBtYWluID0gIkNQSUMgRyIsIHhsYWIgPSAiQWN0aXZpdHkgQ2VudGVycyIpCgpoaXN0KGNlbnRlcnNfY3BpY19KLCBtYWluID0gIkNQSUMgSiIsIHhsYWIgPSAiQWN0aXZpdHkgQ2VudGVycyIpCmhpc3QoY2VudGVyc19jcGljX0ssIG1haW4gPSAiQ1BJQyBLIiwgeGxhYiA9ICJBY3Rpdml0eSBDZW50ZXJzIikKaGlzdChjZW50ZXJzX2NwaWNfTCwgbWFpbiA9ICJDUElDIEwiLCB4bGFiID0gIkFjdGl2aXR5IENlbnRlcnMiKQpoaXN0KGNlbnRlcnNfY3BpY19NLCBtYWluID0gIkNQSUMgTSIsIHhsYWIgPSAiQWN0aXZpdHkgQ2VudGVycyIpCmhpc3QoY2VudGVyc19jcGljX04sIG1haW4gPSAiQ1BJQyBOIiwgeGxhYiA9ICJBY3Rpdml0eSBDZW50ZXJzIikKaGlzdChjZW50ZXJzX2NwaWNfTywgbWFpbiA9ICJDUElDIE8iLCB4bGFiID0gIkFjdGl2aXR5IENlbnRlcnMiKQoKIyMjIyMjIyMKCmhpc3QoY2VudGVyc19jc2VyX0EsIG1haW4gPSAiQ1NFUiBBIiwgeGxhYiA9ICJBY3Rpdml0eSBDZW50ZXJzIikKaGlzdChjZW50ZXJzX2NzZXJfQywgbWFpbiA9ICJDU0VSIEMiLCB4bGFiID0gIkFjdGl2aXR5IENlbnRlcnMiKQpoaXN0KGNlbnRlcnNfY3Nlcl9FLCBtYWluID0gIkNTRVIgRSIsIHhsYWIgPSAiQWN0aXZpdHkgQ2VudGVycyIpCmhpc3QoY2VudGVyc19jc2VyX0YsIG1haW4gPSAiQ1NFUiBGIiwgeGxhYiA9ICJBY3Rpdml0eSBDZW50ZXJzIikKaGlzdChjZW50ZXJzX2NzZXJfRywgbWFpbiA9ICJDU0VSIEciLCB4bGFiID0gIkFjdGl2aXR5IENlbnRlcnMiKQpoaXN0KGNlbnRlcnNfY3Nlcl9KLCBtYWluID0gIkNTRVIgSiIsIHhsYWIgPSAiQWN0aXZpdHkgQ2VudGVycyIpCgpwYXIobWZyb3cgPSBjKDMsMikpCmhpc3QoY2VudGVyc19jc2VyX00sIG1haW4gPSAiQ1NFUiBNIiwgeGxhYiA9ICJBY3Rpdml0eSBDZW50ZXJzIikKaGlzdChjZW50ZXJzX2NzZXJfTiwgbWFpbiA9ICJDU0VSIE4iLCB4bGFiID0gIkFjdGl2aXR5IENlbnRlcnMiKQpoaXN0KGNlbnRlcnNfY3Nlcl9PLCBtYWluID0gIkNTRVIgTyIsIHhsYWIgPSAiQWN0aXZpdHkgQ2VudGVycyIpCgpgYGAKCmBgYHtyfQpmaWxlcGF0aHMgPC0gYygiQUNfSGlzdDFfQ1BJQy5wZGYiLCAiQUNfSGlzdF9DUElDLnBkZiIsICJBQ19IaXN0MV9DU0VSLnBkZiIsICJBQ19IaXN0Ml9DU0VSLnBkZiIpCmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKGZpbGVwYXRocykKYGBgCgojIyMjIEkgZXhhbWluZWQgd2hldGhlciBhY3Rpdml0eSBjZW50ZXJzIHBlciBzcGVjaWVzIGF0IGVhY2ggc2l0ZSBzaG93ZWQgZXZpZGVuY2Ugb2YgY2x1c3RlcmluZyBvciBzZWdyZWdhdGlvbi4gSSBmaXJzdCBoYWQgdG8gY3JlYXRlIGEgcG9pbnQgcHJvY2VzcyBhbG9uZyBhIGxpbmVhciBuZXR3b3JrLiBJZiBJIGhhZCBleGFtaW5lZCBteSByZXN1bHRpbmcgcG9pbnQgcHJvY2Vzc2VzIGFzIDJELCB0aGUgc2Vjb25kIGRpbWVuc2lvbiB3b3VsZCBoYXZlIGNoYW5nZWQgZGlzdGFuY2VzIGJldHdlZW4gcG9pbnRzIGFuZCBiaWFzZWQgZGlzcGVyc2lvbiBhbmFseXNlcy4gSSBmaXJzdCBjcmVhdGVkIGEgbGluZWFyIG5ldHdvcmsgdXNpbmcgdGhlIGNvbW1hbmQgKmxpbm5ldCouIEkgdGhlbiB1c2VkIHRoZSBmdW5jdGlvbiAqYXMubHBwKiB0byBjcmVhdGUgYSBwb2ludCBwcm9jZXNzIGZvciBlYWNoIHNwZWNpZXMgYW5kIHNpdGUgYWxvbmcgYSBsaW5lICh0aGUgY2FuYWwpLgoKQWZ0ZXIgY29lcmluZyBhY3Rpdml0eSBjZW50ZXJzIGludG8gbHBwIG9iamVjdHMsIEkgcmFuIG1vbnRlIGNhcm8gaW50ZXJhdGlvbnMgb2YgdGhlIExpbmVhciBLIGZ1bmN0aW9uIHRvIGNyZWF0ZSBhIHNpbXVsYXRpb24gZW52ZWxvcGUgYW5kIHRoZW4gY29tcGFyZWQgdGhlIG9ic2VydmVkIGxpbmVhciBLIGRpc3RyaWJ1dGlvbiB0byB0aGUgZXhwZWN0ZWQgZGlzdHJpYnV0aW9ucy4KCiMjIyBFWEFNSU5JTkcgRElTUEVSU0lPTjogTGluZWFyIEsgRnVuY3Rpb24gZm9yIGxpbmVhciBwb2ludCBwcm9jZXNzZXMKYGBge3IsIGV2YWwgPSBGQUxTRX0KCiMjIENyZWF0ZSBMaW5lYXIgTmV0d29yawojIGxpbmVhciBuZXR3b3JrCgpjYW5hbF9saW5lIDwtIHBzcCgwLCAwLCAzLCAwLCB3aW5kb3cgPSBvd2luKHhyYW5nZSA9IGMoMCwzKSwgeXJhbmdlID0gYygtMSwxKSkpCnBsb3QoY2FuYWxfbGluZSkKY2FuYWxfbGluZSA8LSBhcy5saW5uZXQoY2FuYWxfbGluZSkKIyMjIyBDaGVjayB2YWxpZGl0eQpwbG90KGNhbmFsX2xpbmUpCnRleHQodmVydGljZXMoY2FuYWxfbGluZSksIGxhYmVscyA9IHZlcnRleGRlZ3JlZShjYW5hbF9saW5lKSkKCgojIyMjIyBDcmVhdGluZyBscHAgb2JqZWN0cyAtIHBvaW50IHByb2Nlc3MgYWxvbmcgYSBsaW5lYXIgbmV0d29yayAjIyMjIwoKQUNQSUNfWCA8LSBsaXN0KHg9YyhjZW50ZXJzX2NwaWNfQSksIHkgPSBjKHJlcCgwLDM2KSkpCkFDUElDX1ggPC0gYXMubHBwKEFDUElDX1gsIEwgPSBjYW5hbF9saW5lKQoKQ0NQSUNfWCA8LSBsaXN0KHg9YyhjZW50ZXJzX2NwaWNfQyksIHkgPSBjKHJlcCgwLDMwKSkpCkNDUElDX1ggPC0gYXMubHBwKENDUElDX1gsIEwgPSBjYW5hbF9saW5lKQoKRENQSUNfWCA8LSBsaXN0KHg9YyhjZW50ZXJzX2NwaWNfRCksIHkgPSBjKHJlcCgwLDIyKSkpCkRDUElDX1ggPC0gYXMubHBwKERDUElDX1gsIEwgPSBjYW5hbF9saW5lKQoKRUNQSUNfWCA8LSBsaXN0KHg9YyhjZW50ZXJzX2NwaWNfRSksIHkgPSBjKHJlcCgwLDQyKSkpCkVDUElDX1ggPC0gYXMubHBwKEVDUElDX1gsIEwgPSBjYW5hbF9saW5lKQoKRkNQSUNfWCA8LSBsaXN0KHg9YyhjZW50ZXJzX2NwaWNfRiksIHkgPSBjKHJlcCgwLDEyOCkpKQpGQ1BJQ19YIDwtIGFzLmxwcChGQ1BJQ19YLCBMID0gY2FuYWxfbGluZSkKCkdDUElDX1ggPC0gbGlzdCh4PWMoY2VudGVyc19jcGljX0cpLCB5ID0gYyhyZXAoMCw1NCkpKQpHQ1BJQ19YIDwtIGFzLmxwcChHQ1BJQ19YLCBMID0gY2FuYWxfbGluZSkKCkpDUElDX1ggPC0gbGlzdCh4PWMoY2VudGVyc19jcGljX0opLCB5ID0gYyhyZXAoMCw2OCkpKQpKQ1BJQ19YIDwtIGFzLmxwcChKQ1BJQ19YLCBMID0gY2FuYWxfbGluZSkKCktDUElDX1ggPC0gbGlzdCh4PWMoY2VudGVyc19jcGljX0spLCB5ID0gYyhyZXAoMCwzMSkpKQpLQ1BJQ19YIDwtIGFzLmxwcChLQ1BJQ19YLCBMID0gY2FuYWxfbGluZSkKCkxDUElDX1ggPC0gbGlzdCh4PWMoY2VudGVyc19jcGljX0wpLCB5ID0gYyhyZXAoMCwyNSkpKQpMQ1BJQ19YIDwtIGFzLmxwcChMQ1BJQ19YLCBMID0gY2FuYWxfbGluZSkKCk1DUElDX1ggPC0gbGlzdCh4PWMoY2VudGVyc19jcGljX00pLCB5ID0gYyhyZXAoMCw4MikpKQpNQ1BJQ19YIDwtIGFzLmxwcChNQ1BJQ19YLCBMID0gY2FuYWxfbGluZSkKCk5DUElDX1ggPC0gbGlzdCh4PWMoY2VudGVyc19jcGljX04pLCB5ID0gYyhyZXAoMCw4NCkpKQpOQ1BJQ19YIDwtIGFzLmxwcChOQ1BJQ19YLCBMID0gY2FuYWxfbGluZSkKCk9DUElDX1ggPC0gbGlzdCh4PWMoY2VudGVyc19jcGljX08pLCB5ID0gYyhyZXAoMCw4MCkpKQpPQ1BJQ19YIDwtIGFzLmxwcChPQ1BJQ19YLCBMID0gY2FuYWxfbGluZSkKCiMjIyMjIyMjCgpBQ1NFUl9YIDwtIGxpc3QoeD1jKGNlbnRlcnNfY3Nlcl9BKSwgeSA9IGMocmVwKDAsNSkpKQpBQ1NFUl9YIDwtIGFzLmxwcChBQ1NFUl9YLCBMID0gY2FuYWxfbGluZSkKCkNDU0VSX1ggPC0gbGlzdCh4PWMoY2VudGVyc19jc2VyX0MpLCB5ID0gYyhyZXAoMCw2KSkpCkNDU0VSX1ggPC0gYXMubHBwKENDU0VSX1gsIEwgPSBjYW5hbF9saW5lKQoKRUNTRVJfWCA8LSBsaXN0KHg9YyhjZW50ZXJzX2NzZXJfRSksIHkgPSBjKHJlcCgwLDExKSkpCkVDU0VSX1ggPC0gYXMubHBwKEVDU0VSX1gsIEwgPSBjYW5hbF9saW5lKQoKRkNTRVJfWCA8LSBsaXN0KHg9YyhjZW50ZXJzX2NzZXJfRiksIHkgPSBjKHJlcCgwLDgpKSkKRkNTRVJfWCA8LSBhcy5scHAoRkNTRVJfWCwgTCA9IGNhbmFsX2xpbmUpCgpHQ1NFUl9YIDwtIGxpc3QoeD1jKGNlbnRlcnNfY3Nlcl9HKSwgeSA9IGMocmVwKDAsNSkpKQpHQ1NFUl9YIDwtIGFzLmxwcChHQ1NFUl9YLCBMID0gY2FuYWxfbGluZSkKCkpDU0VSX1ggPC0gbGlzdCh4PWMoY2VudGVyc19jc2VyX0opLCB5ID0gYyhyZXAoMCw1KSkpCkpDU0VSX1ggPC0gYXMubHBwKEpDU0VSX1gsIEwgPSBjYW5hbF9saW5lKQoKTUNTRVJfWCA8LSBsaXN0KHg9YyhjZW50ZXJzX2NzZXJfTSksIHkgPSBjKHJlcCgwLDgpKSkKTUNTRVJfWCA8LSBhcy5scHAoTUNTRVJfWCwgTCA9IGNhbmFsX2xpbmUpCgpOQ1NFUl9YIDwtIGxpc3QoeD1jKGNlbnRlcnNfY3Nlcl9OKSwgeSA9IGMocmVwKDAsNSkpKQpOQ1NFUl9YIDwtIGFzLmxwcChOQ1NFUl9YLCBMID0gY2FuYWxfbGluZSkKCk9DU0VSX1ggPC0gbGlzdCh4PWMoY2VudGVyc19jc2VyX08pLCB5ID0gYyhyZXAoMCw1KSkpCk9DU0VSX1ggPC0gYXMubHBwKE9DU0VSX1gsIEwgPSBjYW5hbF9saW5lKQoKIyMjIyMjIyMjIyMjIExpbmVhciBLIE1vbnRlIENhcmxvIEFuYWx5c2lzIFBlciBTcGVjaWVzIFBlciBTaXRlICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiMjIENQSUMsIEEKbGluZWFyS19BX0NQSUMgPC0gbGluZWFySyhYID0gQUNQSUNfWCkKc3VtbWFyeShsaW5lYXJLX0FfQ1BJQykKCmxpbktfQV9DUElDIDwtIGVudmVsb3BlKEFDUElDX1gsIGxpbmVhckssIG5zaW0gPSA5OSwgbnJhbmsgPSAxKQpwbG90KGxpbktfQV9DUElDLCBtYWluID0gIkxpbmVhciBLIFRlc3Qgb24gQ1BJQyBTaXRlIEEiKQoKIyMgQ1BJQywgQwpsaW5lYXJLX0NfQ1BJQyA8LSBsaW5lYXJLKFggPSBDQ1BJQ19YKQpzdW1tYXJ5KGxpbmVhcktfQ19DUElDKQoKbGluS19DX0NQSUMgPC0gZW52ZWxvcGUoQ0NQSUNfWCwgbGluZWFySywgbnNpbSA9IDk5LCBucmFuayA9IDEpCnBsb3QobGluS19DX0NQSUMsIG1haW4gPSAiTGluZWFyIEsgVGVzdCBvbiBDUElDIFNpdGUgQyIpCgojIyBDUElDLCBECmxpbmVhcktfRF9DUElDIDwtIGxpbmVhcksoWCA9IERDUElDX1gpCnN1bW1hcnkobGluZWFyS19EX0NQSUMpCgpsaW5LX0RfQ1BJQyA8LSBlbnZlbG9wZShEQ1BJQ19YLCBsaW5lYXJLLCBuc2ltID0gOTksIG5yYW5rID0gMSkKcGxvdChsaW5LX0RfQ1BJQywgbWFpbiA9ICJMaW5lYXIgSyBUZXN0IG9uIENQSUMgU2l0ZSBEIikKCiMjIENQSUMsIEUKbGluZWFyS19FX0NQSUMgPC0gbGluZWFySyhYID0gRUNQSUNfWCkKc3VtbWFyeShsaW5lYXJLX0VfQ1BJQykKCmxpbktfRV9DUElDIDwtIGVudmVsb3BlKEVDUElDX1gsIGxpbmVhckssIG5zaW0gPSA5OSwgbnJhbmsgPSAxKQpwbG90KGxpbktfRV9DUElDLCBtYWluID0gIkxpbmVhciBLIFRlc3Qgb24gQ1BJQyBTaXRlIEUiKQoKIyMgQ1BJQywgRgpsaW5lYXJLX0ZfQ1BJQyA8LSBsaW5lYXJLKFggPSBGQ1BJQ19YKQpzdW1tYXJ5KGxpbmVhcktfRl9DUElDKQoKbGluS19GX0NQSUMgPC0gZW52ZWxvcGUoRkNQSUNfWCwgbGluZWFySywgbnNpbSA9IDk5LCBucmFuayA9IDEpCnBsb3QobGluS19GX0NQSUMsIG1haW4gPSAiTGluZWFyIEsgVGVzdCBvbiBDUElDIFNpdGUgRiIpCgojIyBDUElDLCBHCmxpbmVhcktfR19DUElDIDwtIGxpbmVhcksoWCA9IEdDUElDX1gpCnN1bW1hcnkobGluZWFyS19HX0NQSUMpCgpsaW5LX0dfQ1BJQyA8LSBlbnZlbG9wZShHQ1BJQ19YLCBsaW5lYXJLLCBuc2ltID0gOTksIG5yYW5rID0gMSkKcGxvdChsaW5LX0dfQ1BJQywgbWFpbiA9ICJMaW5lYXIgSyBUZXN0IG9uIENQSUMgU2l0ZSBHIikKCiMjIENQSUMsIEoKbGluZWFyS19KX0NQSUMgPC0gbGluZWFySyhYID0gSkNQSUNfWCkKc3VtbWFyeShsaW5lYXJLX0pfQ1BJQykKCmxpbktfSl9DUElDIDwtIGVudmVsb3BlKEpDUElDX1gsIGxpbmVhckssIG5zaW0gPSA5OSwgbnJhbmsgPSAxKQpwbG90KGxpbktfSl9DUElDLCBtYWluID0gIkxpbmVhciBLIFRlc3Qgb24gQ1BJQyBTaXRlIEoiKQoKIyMgQ1BJQywgSwpsaW5lYXJLX0tfQ1BJQyA8LSBsaW5lYXJLKFggPSBLQ1BJQ19YKQpzdW1tYXJ5KGxpbmVhcktfS19DUElDKQoKbGluS19LX0NQSUMgPC0gZW52ZWxvcGUoS0NQSUNfWCwgbGluZWFySywgbnNpbSA9IDk5LCBucmFuayA9IDEpCnBsb3QobGluS19LX0NQSUMsIG1haW4gPSAiTGluZWFyIEsgVGVzdCBvbiBDUElDIFNpdGUgSyIpCgojIyBDUElDLCBMCmxpbmVhcktfTF9DUElDIDwtIGxpbmVhcksoWCA9IExDUElDX1gpCnN1bW1hcnkobGluZWFyS19MX0NQSUMpCgpsaW5LX0xfQ1BJQyA8LSBlbnZlbG9wZShMQ1BJQ19YLCBsaW5lYXJLLCBuc2ltID0gOTksIG5yYW5rID0gMSkKcGxvdChsaW5LX0xfQ1BJQywgbWFpbiA9ICJMaW5lYXIgSyBUZXN0IG9uIENQSUMgU2l0ZSBMIikKCiMjIENQSUMsIE0KbGluZWFyS19NX0NQSUMgPC0gbGluZWFySyhYID0gTUNQSUNfWCkKc3VtbWFyeShsaW5lYXJLX01fQ1BJQykKCmxpbktfTV9DUElDIDwtIGVudmVsb3BlKE1DUElDX1gsIGxpbmVhckssIG5zaW0gPSA5OSwgbnJhbmsgPSAxKQpwbG90KGxpbktfTV9DUElDLCBtYWluID0gIkxpbmVhciBLIFRlc3Qgb24gQ1BJQyBTaXRlIE0iKQoKIyMgQ1BJQywgTgpsaW5lYXJLX05fQ1BJQyA8LSBsaW5lYXJLKFggPSBOQ1BJQ19YKQpzdW1tYXJ5KGxpbmVhcktfTl9DUElDKQoKbGluS19OX0NQSUMgPC0gZW52ZWxvcGUoTkNQSUNfWCwgbGluZWFySywgbnNpbSA9IDk5LCBucmFuayA9IDEpCnBsb3QobGluS19OX0NQSUMsIG1haW4gPSAiTGluZWFyIEsgVGVzdCBvbiBDUElDIFNpdGUgTiIpCgojIyBDUElDLCBPCmxpbmVhcktfT19DUElDIDwtIGxpbmVhcksoWCA9IE9DUElDX1gpCnN1bW1hcnkobGluZWFyS19PX0NQSUMpCgpsaW5LX09fQ1BJQyA8LSBlbnZlbG9wZShPQ1BJQ19YLCBsaW5lYXJLLCBuc2ltID0gOTksIG5yYW5rID0gMSkKcGxvdChsaW5LX09fQ1BJQywgbWFpbiA9ICJMaW5lYXIgSyBUZXN0IG9uIENQSUMgU2l0ZSBPIikKCiMjIENTRVIsIEEKbGluZWFyS19BX0NTRVIgPC0gbGluZWFySyhYID0gQUNTRVJfWCkKc3VtbWFyeShsaW5lYXJLX0FfQ1NFUikKCmxpbktfQV9DU0VSIDwtIGVudmVsb3BlKEFDU0VSX1gsIGxpbmVhckssIG5zaW0gPSA5OSwgbnJhbmsgPSAxKQpwbG90KGxpbktfQV9DU0VSLCBtYWluID0gIkxpbmVhciBLIFRlc3Qgb24gQ1NFUiBTaXRlIEEiKQoKIyMgQ1NFUiwgQwpsaW5lYXJLX0NfQ1NFUiA8LSBsaW5lYXJLKFggPSBDQ1NFUl9YKQpzdW1tYXJ5KGxpbmVhcktfQ19DU0VSKQoKbGluS19DX0NTRVIgPC0gZW52ZWxvcGUoQ0NTRVJfWCwgbGluZWFySywgbnNpbSA9IDk5LCBucmFuayA9IDEpCnBsb3QobGluS19DX0NTRVIsIG1haW4gPSAiTGluZWFyIEsgVGVzdCBvbiBDU0VSIFNpdGUgQyIpCgojIyBDU0VSLCBFCmxpbmVhcktfRV9DU0VSIDwtIGxpbmVhcksoWCA9IEVDU0VSX1gpCnN1bW1hcnkobGluZWFyS19FX0NTRVIpCgpsaW5LX0VfQ1NFUiA8LSBlbnZlbG9wZShFQ1NFUl9YLCBsaW5lYXJLLCBuc2ltID0gOTksIG5yYW5rID0gMSkKcGxvdChsaW5LX0VfQ1NFUiwgbWFpbiA9ICJMaW5lYXIgSyBUZXN0IG9uIENTRVIgU2l0ZSBFIikKCiMjIENTRVIsIEYKbGluZWFyS19GX0NTRVIgPC0gbGluZWFySyhYID0gRkNTRVJfWCkKc3VtbWFyeShsaW5lYXJLX0ZfQ1NFUikKCmxpbktfRl9DU0VSIDwtIGVudmVsb3BlKEZDU0VSX1gsIGxpbmVhckssIG5zaW0gPSA5OSwgbnJhbmsgPSAxKQpwbG90KGxpbktfRl9DU0VSLCBtYWluID0gIkxpbmVhciBLIFRlc3Qgb24gQ1NFUiBTaXRlIEYiKQoKIyMgQ1NFUiwgRwpsaW5lYXJLX0dfQ1NFUiA8LSBsaW5lYXJLKFggPSBHQ1NFUl9YKQpzdW1tYXJ5KGxpbmVhcktfR19DU0VSKQoKbGluS19HX0NTRVIgPC0gZW52ZWxvcGUoR0NTRVJfWCwgbGluZWFySywgbnNpbSA9IDk5LCBucmFuayA9IDEpCnBsb3QobGluS19HX0NTRVIsIG1haW4gPSAiTGluZWFyIEsgVGVzdCBvbiBDU0VSIFNpdGUgRyIpCgojIyBDU0VSLCBKCmxpbmVhcktfSl9DU0VSIDwtIGxpbmVhcksoWCA9IEpDU0VSX1gpCnN1bW1hcnkobGluZWFyS19KX0NTRVIpCgpsaW5LX0pfQ1NFUiA8LSBlbnZlbG9wZShKQ1NFUl9YLCBsaW5lYXJLLCBuc2ltID0gOTksIG5yYW5rID0gMSkKcGxvdChsaW5LX0pfQ1NFUiwgbWFpbiA9ICJMaW5lYXIgSyBUZXN0IG9uIENTRVIgU2l0ZSBKIikKCiMjIENTRVIsIE0KbGluZWFyS19NX0NTRVIgPC0gbGluZWFySyhYID0gTUNTRVJfWCkKc3VtbWFyeShsaW5lYXJLX01fQ1NFUikKCmxpbktfTV9DU0VSIDwtIGVudmVsb3BlKE1DU0VSX1gsIGxpbmVhckssIG5zaW0gPSA5OSwgbnJhbmsgPSAxKQpwbG90KGxpbktfTV9DU0VSLCBtYWluID0gIkxpbmVhciBLIFRlc3Qgb24gQ1NFUiBTaXRlIE0iKQoKIyMgQ1NFUiwgTgpsaW5lYXJLX05fQ1NFUiA8LSBsaW5lYXJLKFggPSBOQ1NFUl9YKQpzdW1tYXJ5KGxpbmVhcktfTl9DU0VSKQoKbGluS19OX0NTRVIgPC0gZW52ZWxvcGUoTkNTRVJfWCwgbGluZWFySywgbnNpbSA9IDk5LCBucmFuayA9IDEpCnBsb3QobGluS19OX0NTRVIsIG1haW4gPSAiTGluZWFyIEsgVGVzdCBvbiBDU0VSIFNpdGUgTiIpCgojIyBDU0VSLCBPCmxpbmVhcktfT19DU0VSIDwtIGxpbmVhcksoWCA9IE9DU0VSX1gpCnN1bW1hcnkobGluZWFyS19PX0NTRVIpCgpsaW5LX09fQ1NFUiA8LSBlbnZlbG9wZShPQ1NFUl9YLCBsaW5lYXJLLCBuc2ltID0gOTksIG5yYW5rID0gMSkKcGxvdChsaW5LX09fQ1NFUiwgbWFpbiA9ICJMaW5lYXIgSyBUZXN0IG9uIENTRVIgU2l0ZSBPIikKCgpgYGAKCiMjIFBsb3R0aW5nIExpbmVhciBLIFNpbXVsYXRpb25zIHdpdGggRW52ZWxvcGVzCmBgYHtyLCBldmFsID0gRkFMU0V9CmZpbGVwYXRocyA8LSBjKCJBQ19MaW5LMV9DUElDLnBkZiIsICJBQ19MaW5LMl9DUElDLnBkZiIsICJBQ19MaW5LM19DUElDLnBkZiIsICJBQ19MaW5LMV9DU0VSLnBkZiIsICJBQ19MaW5LMl9DU0VSLnBkZiIsICJBQ19MaW5LM19DU0VSLnBkZiIpCmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKGZpbGVwYXRocykKCgpwYXIobWZyb3cgPSBjKDIsMikpCnBsb3QobGluS19BX0NQSUMsIG1haW4gPSAiQ1BJQyBBIiwgbGVnZW5kID0gIiIpCnBsb3QobGluS19DX0NQSUMsIG1haW4gPSAiQ1BJQyBDIiwgbGVnZW5kID0gIiIpCnBsb3QobGluS19EX0NQSUMsIG1haW4gPSAiQ1BJQyBEIiwgbGVnZW5kID0gIiIpCnBsb3QobGluS19FX0NQSUMsIG1haW4gPSAiQ1BJQyBFIiwgbGVnZW5kID0gIiIpCgpwbG90KGxpbktfRl9DUElDLCBtYWluID0gIkNQSUMgRiIsIGxlZ2VuZCA9ICIiKQpwbG90KGxpbktfR19DUElDLCBtYWluID0gIkNQSUMgRyIsIGxlZ2VuZCA9ICIiKQpwbG90KGxpbktfSl9DUElDLCBtYWluID0gIkNQSUMgSiIsIGxlZ2VuZCA9ICIiKQpwbG90KGxpbktfS19DUElDLCBtYWluID0gIkNQSUMgSyIsIGxlZ2VuZCA9ICIiKQoKcGxvdChsaW5LX0xfQ1BJQywgbWFpbiA9ICJDUElDIEwiLCBsZWdlbmQgPSAiIikKcGxvdChsaW5LX01fQ1BJQywgbWFpbiA9ICJDUElDIE0iLCBsZWdlbmQgPSAiIikKcGxvdChsaW5LX05fQ1BJQywgbWFpbiA9ICJDUElDIE4iLCBsZWdlbmQgPSAiIikKcGxvdChsaW5LX09fQ1BJQywgbWFpbiA9ICJDUElDIE8iLCBsZWdlbmQgPSAiIikKCiMjIyMjIyMjCgpwbG90KGxpbktfQV9DU0VSLCBtYWluID0gIkNTRVIgQSIsIGxlZ2VuZCA9ICIiKQpwbG90KGxpbktfQ19DU0VSLCBtYWluID0gIkNTRVIgQyIsIGxlZ2VuZCA9ICIiKQpwbG90KGxpbktfRV9DU0VSLCBtYWluID0gIkNTRVIgRSIsIGxlZ2VuZCA9ICIiKQpwbG90KGxpbktfRl9DU0VSLCBtYWluID0gIkNTRVIgRiIsIGxlZ2VuZCA9ICIiKQoKcGxvdChsaW5LX0dfQ1NFUiwgbWFpbiA9ICJDU0VSIEciLCBsZWdlbmQgPSAiIikKcGxvdChsaW5LX0pfQ1NFUiwgbWFpbiA9ICJDU0VSIEoiLCBsZWdlbmQgPSAiIikKcGxvdChsaW5LX01fQ1NFUiwgbWFpbiA9ICJDU0VSIE0iLCBsZWdlbmQgPSAiIikKcGxvdChsaW5LX05fQ1NFUiwgbWFpbiA9ICJDU0VSIE4iLCBsZWdlbmQgPSAiIikKCnBsb3QobGluS19PX0NTRVIsIG1haW4gPSAiQ1NFUiBPIiwgbGVnZW5kID0gIiIpCgpgYGAKCkRpc3BlcnNpb24gYW5hbHlzaXMgb24gYWN0aXZpdHkgY2VudGVycyBmb3IgbW9zdCBDUElDIGFuZCBzaXRlIGNvbWJpbmF0aW9ucyBwcm92aWRlZCBldmlkZW5jZSBvZiBzbWFsbCBhbW91bnRzIG9mIGNsdXN0ZXJpbmcuIFNpdGVzIEEsIEUsIEYsIGFuZCBKIHNlZW1lZCB0byBoYXZlIHRoZSBtb3N0IGNsdXN0ZXJlZCBDUElDIGFjdGl2aXR5IGNlbnRlcnMsIHNpdGVzIEwsIE4sIGFuZCBPIGhhZCBsZXNzIGNsdXN0ZXJlZCBhY3Rpdml0eSBjZW50ZXJzLCBhbmQgc2l0ZXMgQywgRCwgRywgSywgYW5kIE0gc2VlbWVkIHRvIGhhdmUgdGhlIHJhbmRvbSBDUElDIGFjdGl2aXR5IGNlbnRlcnMuCgpEdWUgdG8gbG93IHNhbXBsZSBzaXplIG9mIENTRVIgYXQgYWxsIHNpdGVzLCBkaXNwZXJzaW9uIGFuYWx5c2lzIHdhcyB1bmFibGUgdG8gZGV0ZWN0IGEgc2lnbmlmaWNhbnQgZGlmZmVyZW5jZSBmcm9tIGEgcmFuZG9tIHBvaW50IHByb2Nlc3MuIFNpdGVzIEYsIE4sIGFuZCBPIGRpZCBzZWVtIHRvIGhhdmUgdmVyeSBzbGlnaHQgY2x1c3RlcmluZyBpbiBhY3Rpdml0eSBjZW50ZXJzIGF0IHZlcnkgYnJpZWYgciB3aW5kb3dzLgoKYGBge3J9CmZpbGVwYXRocyA8LSBjKCJBQ19MaW5LMV9DUElDLnBkZiIsICJBQ19MaW5LMl9DUElDLnBkZiIsICJBQ19MaW5LM19DUElDLnBkZiIsICJBQ19MaW5LMV9DU0VSLnBkZiIsICJBQ19MaW5LMl9DU0VSLnBkZiIsICJBQ19MaW5LM19DU0VSLnBkZiIpCmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKGZpbGVwYXRocykKYGBgCgoKIyMgR3JhcGhpbmcgRGVuc2l0eSBCeSBTaXRlCmBgYHtyLCBldmFsID0gRkFMU0V9CmZpbGVwYXRocyA8LSBjKCJDUElDX1Bsb3QucGRmIiwgIkNTRVJfUGxvdC5wZGYiKQprbml0cjo6aW5jbHVkZV9ncmFwaGljcyhmaWxlcGF0aHMpCgojIyMjIyMjIyMjIyMjIyMgIEdyYXBoaW5nIERlbnNpdHkgQnkgU2l0ZSAjIyMjIyMjIyMjIyMjIyMjCgp4IDwtIGMoIkEiLCJDIiwiRCIsIkUiLCJGIiwiRyIsIkoiLCJLIiwiTCIsIk0iLCJOIiwiTyIpCmRlbnNpdHlfbGlzdCA8LSBjKG1lYW5fZGVuc2l0eV9jcGljX0EsIG1lYW5fZGVuc2l0eV9jcGljX0MsIG1lYW5fZGVuc2l0eV9jcGljX0QsIG1lYW5fZGVuc2l0eV9jcGljX0UsIG1lYW5fZGVuc2l0eV9jcGljX0YsIG1lYW5fZGVuc2l0eV9jcGljX0csIG1lYW5fZGVuc2l0eV9jcGljX0osIG1lYW5fZGVuc2l0eV9jcGljX0ssIG1lYW5fZGVuc2l0eV9jcGljX0wsIG1lYW5fZGVuc2l0eV9jcGljX00sIG1lYW5fZGVuc2l0eV9jcGljX04sIG1lYW5fZGVuc2l0eV9jcGljX08pCgpiYXJwbG90KGRlbnNpdHlfbGlzdCwgbmFtZXMuYXJnID0gYygiQSIsIkMiLCJFIiwiRiIsIkciLCJKIiwiTSIsIk4iLCJPIiksIG1haW4gPSAiQ1NFUiBEZW5zaXR5IGJ5IFNpdGUiLCBjb2wgPSAiYnJvd24iLCB4bGFiID0gIlNpdGUiLCB5bGFiID0gIkRlbnNpdHkiKQoKYGBgCgoKYGBge3J9CmZpbGVwYXRocyA8LSBjKCJDUElDX1Bsb3QucGRmIiwgIkNTRVJfUGxvdC5wZGYiKQprbml0cjo6aW5jbHVkZV9ncmFwaGljcyhmaWxlcGF0aHMpCmBgYAoKSSBhbHNvIGNyZWF0ZWQgMiBHSVMgbWFwcyBpbGx1c3RyYXRpbmcgc2l0ZSBsb2NhdGlvbnMgaW4gcmVsYXRpb24gdG8gcG90ZW50aWFsIGxhbmQgdXNlIGNoYXJhY3RlcmlzdGljcyAobmVhcmJ5IGxhbmQgdXNlIHR5cGVzIHRoYXQgbWlnaHQgZ3JlYXRseSBpbXBhY3QgdHVydGxlIGRlbnNpdGllczogZGV2ZWxvcG1lbnQsIGN1bHRpdmF0ZWQgY3JvcHMsIHBhc3R1cmUsIHdldGxhbmQgdmVnZXRhdGlvbikuIEZ1dHVyZSBkaXJlY3Rpb25zIGZvciB0aGlzIHByb2plY3QgY291bGQgaW5jbHVkZSBpbnRlcnBvbGF0aW5nIHR1cnRsZSBkZW5zaXRpZXMgYmV0d2VlbiBzaXRlcyB1c2luZyBzcGVjaWVzIGRpc3RyaWJ1dGlvbiBtb2RlbGluZyBPUiBjYWxjdWxhdGluZyBkaXN0YW5jZSB0byBsYW5kIHVzZSB0eXBlIGFuZCBleGFtaW5pbmcgd2hldGhlciBkaXN0YW5jZXMgaW1wYWN0IGRlbnNpdGllcyBvciBkaXNwZXJzYWwgYmV0d2VlbiBzaXRlcy4gCg==
+LS0tCnRpdGxlOiAiRmluYWwgTGFuZHNjYXBlIFByb2plY3QgUmVwb3J0IgphdXRob3I6ICczMDkzODE5JwpkYXRlOiAiMTIvMTEvMjAxOCIKb3V0cHV0OgogIHBkZl9kb2N1bWVudDogZGVmYXVsdAogIGh0bWxfbm90ZWJvb2s6IGRlZmF1bHQKLS0tCgoKRm9yIHRoaXMgcHJvamVjdCwgSSBjcmVhdGVkIGEgU3BhdGlhbCBDYXB0dXJlLVJlY2FwdHVyZSAoU0NSKSBtb2RlbCAobmFtZWQgIlNDUkFfSW5kX1RpbWUudHh0Ijsgd2l0aGluIHRoZSBmb2xkZXJzICJDb2RlL0pBR1MiKS4gU2FtcGxpbmcgZGVzaWduIGZvciBTQ1IgbW9kZWxzIGluY2x1ZGUgb2J0YWluaW5nIGVuY291bnRlciBoaXN0b3JpZXMgb2YgaW5kaXZpZHVhbCBvcmdhbmlzbXMgYXQgYSBzcGVjaWZpYyBzaXRlLiBUcmFwcyBhcmUgcGxhY2VkIGF0IGVxdWFsIGluY3JlbWVudHMgYXBhcnQgaW4gYW4gYXJyYXkuIFRoZSBzYW1wbGluZyBvY2Nhc2lvbiwgdHJhcCBJRCwgYW5kIHR1cnRsZSBJRCBhcmUgcmVjb3JkZWQgYW5kIHRoZSByZXN1bHRpbmcgZGF0YSBmcmFtZSBiZWNvbWVzIHRoZSBmb3VuZGF0aW9uIGZvciBtb3N0IG9iamVjdHMgY3JlYXRlZCBmb3IgYSBTQ1IgbW9kZWwuIFRoZSBtb2RlbCBvdXRwdXRzIGluY2x1ZGUgYW4gYWN0aXZpdHkgY2VudGVyIHBlciBpbmRpdmlkdWFsLCBkZW5zaXR5IHBlciBzaXRlLCBhbmQgbnVtYmVyIG9mIGluZGl2aWR1YWxzIGVzdGltYXRlZCBpbiBzaXRlIGFyZWEuIFRoZSBhY3Rpdml0eSBjZW50ZXJzIGFyZSBjZW50cm9pZHMgb2YgdGhlIHNwYWNlIGFuIGluZGl2aWR1YWwgdXNlZCBvdmVyIGEgc2FtcGxpbmcgc2Vzc2lvbiBhbmQgaXMgc2ltaWxhciB0byBhIGhvbWUgcmFuZ2UgY2VudGVyLiBBY3Rpdml0eSBjZW50ZXJzIHBlciBzaXRlIHJlcHJlc2VudCBhIHJlYWxpemF0aW9uIG9mIGEgYmlub21pYWwgcG9pbnQgcHJvY2VzcyAod2hlcmUgdG90YWwgbnVtYmVyIG9mIHBvaW50cyBpbiBzcGFjZSBpcyBmaXhlZCkuCgpEdXJpbmcgdGhlIFN1bW1lciBvZiAyMDE4IEkgc2FtcGxlZCBmb3IgdHVydGxlcyBhdCAxMiBzaXRlcyBmb3IgNCBkYXlzIGVhY2ggKHNhbXBsaW5nIG9jY2FzaW9uICA9IDQgZGF5cykgYnkgc2V0dGluZyBvdXQgNyB0byAxNCB0cmFwcyAoaG9vcCBuZXQgdHJhcHMpIGFsb25nIHRoZSBDaGVzYXBlYWtlIGFuZCBPaGlvIENhbmFsIChmcm9tIEN1bWJlcmxhbmQgdG8gdGhlIFRvd24gQ3JlZWsgQXF1ZWR1Y3QpLgoKT2JqZWN0aXZlcyBmb3IgdGhpcyBwcm9qZWN0IGluY2x1ZGVkOgoxKSBEZXZlbG9wIGEgU0NSIG1vZGVsIChpbiB0aGUgcHJvZ3JhbSBKQUdTKSB0aGF0IGluY29ycG9yYXRlcyBoZXRlcm9nZW5laXR5IG9mIGNhcHR1cmUgcHJvYmFiaWxpdHkgYnkgc2FtcGxpbmcgZGF5IGFuZCBpbmRpdmlkdWFsLiAKMikgT2J0YWluIGFjdGl2aXR5IGNlbnRlcnMgZm9yIDIgc3BlY2llcyAoQy4gcGljdGEgYW5kIEMuIHNlcnBlbnRpbmE7IGhlbmNlZm9ydGgsIENQSUMgYW5kIENTRVIpIGZyb20gdGhlIE1DTUMgb3V0cHV0IGZvciBlYWNoIG1vZGVsLgozKSBBbmFseXplIGRpc3BlcnNpb24gb2YgYWN0aXZpdHkgY2VudGVycyBmb3IgYWxsIHNpdGVzIGFuZCBjb21wYXJlLgo0KSBBbmFseXplIGRpc3BlcnNpb24gb2YgYWN0aXZpdHkgY2VudGVycyBmb3IgQ1BJQyBhbmQgQ1NFUiBhbmQgY29tcGFyZS4KNSkgT2J0YWluIGRlbnNpdGllcyBvZiBlYWNoIHNwZWNpZXMgYXQgZWFjaCBzaXRlIGFuZCBjb21wYXJlLgoKIyMgTGlicmFyaWVzCmBgYHtyLCBlY2hvID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRX0KbGlicmFyeShkcGx5cikKbGlicmFyeSh0aWR5cikKbGlicmFyeShyamFncykKbGlicmFyeShwYXJhbGxlbCkKbGlicmFyeSh0aWJibGUpCmxpYnJhcnkoc3BhdHN0YXQpCmxpYnJhcnkoc3BUaGluKQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkocGxvdHJpeCkKbGlicmFyeShyZXNoYXBlMikKYGBgCgpJIGZpcnN0IGRvd25sb2FkZWQgbXkgcmF3IGRhdGEgZnJvbSB0aGUgc3VtbWVyLgoKIyMgTG9hZCBNYWluIERhdGEgRmlsZSBmb3IgU3BhdGlhbCBDYXB0dXJlIFJlY2FwdHVyZSBNb2RlbCAoUmF3IGRhdGEpCmBgYHtyfQoKRURGIDwtIHJlYWQuY3N2KGZpbGUgPSAiRGF0YS9FREYuY3N2Iiwgc3RyaW5nc0FzRmFjdG9ycyA9IEZBTFNFKQpoZWFkKEVERikKCmBgYAoKSSBjcmVhdGVkIHByZWxpbWluYXJ5IG9iamVjdHMgdG8gdXNlIGluIG15IFNDUiBtb2RlbCBmb3IgZWFjaCBzcGVjaWVzIGFuZCBzaXRlIGNvbWJpbmF0aW9uLiBQcmVsaW1pbmFyeSBvYmplY3RzIGluY2x1ZGVkIGEgdHJhcCBsb2NhdGlvbiB2ZWN0b3IgaW5kaWNhdGluZyBkaXN0YW5jZXMgZnJvbSBtb3N0IHVwc3RyZWFtIHRvIG1vc3QgZG93bnN0cmVhbSB0cmFwLCB0cmFwIGxvY2F0aW9uIG1hdHJpY2VzIHJlY29yZGluZyBkaXN0YW5jZSBiZXR3ZWVuIGFsbCBjb21iaW5hdGlvbnMgb2YgdHJhcHMgcGVyIHNpdGUsIGFuZCBzdWJzZXQgcmF3IGRhdGEgZm9yIHNwZWNpZmljIHNwZWNpZXMgYW5kIHNpdGVzLiBJbiBhZGRpdGlvbiwgdHJhcCBsb2NhdGlvbnMgYW5kIGRpc3RhbmNlcyB3ZXJlIHNjYWxlZCAoZGl2aWRlZCBieSAwKSB0byBtYWtlIG1vZGVsIGNvbXB1dGF0aW9uIHJ1biBzbW9vdGhseS4KCiMjIFN1YnNldHRpbmcgRGF0YSBhbmQgQ3JlYXRpbmcgUHJlbGltaW5hcnkgT2JqZWN0cyBQZXIgU2l0ZSBhbmQgU3BlY2llcwpgYGB7ciwgZXZhbCA9IEZBTFNFfQoKIyNBZGQgYSBuZXcgY29sdW1uIGZvciBpbnRlZ2VyIHNlc3Npb24gdmFsdWVzIChzZXNzaW9uID0gc2l0ZSkKRURGJHNpdGVfbnVtIDwtIGFzLmludGVnZXIoYXMuZmFjdG9yKEVERiRzaXRlKSkKc3VtbWFyeShFREYpCgojIENyZWF0ZSB0cmFwIGxvY2F0aW9uIHZlY3Rvcgp0cmFwbG9jc0EgPC0gYygwLDI1LDUwLDc1LDEwMCwxMjUsMTUwLDE3NSkgIyBjcmVhdGUgdHJhcCBsb2NhdGlvbiBmaWxlCnRyYXBsb2NzQyA8LSBjKDAsMjUsNTAsNzUsMTAwLDEyNSwxNTAsMTc1LDIwMCwyMjUpCnRyYXBsb2NzRCA8LSBjKDAsMjUsNTAsNzUsMTAwLDEyNSwxNTAsMTc1KQp0cmFwbG9jc0UgPC0gYygwLDI1LDUwLDc1LDEwMCwxMjUsMTUwLDE3NSwyMDAsMjI1LDI1MCwyNzUsMzAwLDMyNSkKdHJhcGxvY3NGIDwtIGMoMCwyNSw1MCw3NSwxMDAsMTI1LDE1MCkKdHJhcGxvY3NHIDwtIGMoMCwyNSw1MCw3NSwxMDAsMTI1LDE1MCkKdHJhcGxvY3NKIDwtIGMoMCwyNSw1MCw3NSwxMDAsMTI1LDE1MCwxNzUsMjAwLDIyNSkKdHJhcGxvY3NLIDwtIGMoMCwyNSw1MCw3NSwxMDAsMTI1LDE1MCwxNzUsMjAwLDIyNSkKdHJhcGxvY3NMIDwtIGMoMCwyNSw1MCw3NSwxMDAsMTI1LDE1MCwxNzUpCnRyYXBsb2NzTSA8LSBjKDAsMjUsNTAsNzUsMTAwLDEyNSwxNTAsMTc1LDIwMCwyMjUsMjUwLDI3NSkKdHJhcGxvY3NOIDwtIGMoMCwyNSw1MCw3NSwxMDAsMTI1LDE1MCwxNzUsMjAwLDIyNSkKdHJhcGxvY3NPIDwtIGMoMCwyNSw1MCw3NSwxMDAsMTI1LDE1MCwxNzUsMjAwLDIyNSkKI3RoZXNzIGFyZSBpbiBhIHZlcnRpY2FsIGZvcm1hdAoKIyBDcmVhdGUgYSBUcmFwIExvY2F0aW9uIE1hdHJpeCAoaW50ZWdlcnMgPSBkaXN0YW5jZSBhcGFydCBpbiBtKTsgMSBNYXRyaXggcGVyIFNpdGUKIyMjIyBNYXRyaXhBCm1hdHJpeEEgPC0gbWF0cml4KE5BLCBuY29sID0gbGVuZ3RoKHRyYXBsb2NzQSksIG5yb3cgPSBsZW5ndGgodHJhcGxvY3NBKSkKCm1hdHJpeEFbICwxXSA8LSBjKDAsMjUsNTAsNzUsMTAwLDEyNSwxNTAsMTc1KQptYXRyaXhBWyAsMl0gPC0gYygyNSwwLDI1LDUwLDc1LDEwMCwxMjUsMTUwKQptYXRyaXhBWyAsM10gPC0gYyg1MCwyNSwwLDI1LDUwLDc1LDEwMCwxMjUpCm1hdHJpeEFbICw0XSA8LSBjKDc1LCA1MCwyNSwwLDI1LDUwLDc1LDEwMCkKbWF0cml4QVsgLDVdIDwtIGMoMTAwLDc1LCA1MCwyNSwwLDI1LDUwLDc1KQptYXRyaXhBWyAsNl0gPC0gYygxMjUsMTAwLDc1LCA1MCwyNSwwLDI1LDUwKQptYXRyaXhBWyAsN10gPC0gYygxNTAsMTI1LDEwMCw3NSwgNTAsMjUsMCwyNSkKbWF0cml4QVsgLDhdIDwtIGMoMTc1LDE1MCwxMjUsMTAwLDc1LCA1MCwyNSwwKQptYXRyaXhBICAjIHdpbGwgbmVlZCB0byB1c2UgY29vcmRpbmF0ZXMgaWYgdXNlIGFsbCBzaXRlcyBpbiAxIG1vZGVsISBvciBmaWd1cmUgb3V0IGRpc3RhbmNlIGIvdyBzaXRlcwoKIyMjIyBNYXRyaXggQwptYXRyaXhDIDwtIG1hdHJpeChOQSwgbmNvbCA9IGxlbmd0aCh0cmFwbG9jc0MpLCBucm93ID0gbGVuZ3RoKHRyYXBsb2NzQykpCm1hdHJpeENbICwxXSA8LSBjKDAsMjUsNTAsNzUsMTAwLDEyNSwxNTAsMTc1LDIwMCwyMjUpCm1hdHJpeENbICwyXSA8LSBjKDI1LDAsMjUsNTAsNzUsMTAwLDEyNSwxNTAsMTc1LDIwMCkKbWF0cml4Q1sgLDNdIDwtIGMoNTAsMjUsMCwyNSw1MCw3NSwxMDAsMTI1LDE1MCwxNzUpCm1hdHJpeENbICw0XSA8LSBjKDc1LCA1MCwyNSwwLDI1LDUwLDc1LDEwMCwxMjUsMTUwKQptYXRyaXhDWyAsNV0gPC0gYygxMDAsNzUsNTAsMjUsMCwyNSw1MCw3NSwxMDAsMTI1KQptYXRyaXhDWyAsNl0gPC0gYygxMjUsMTAwLDc1LDUwLDI1LDAsMjUsNTAsNzUsMTAwKQptYXRyaXhDWyAsN10gPC0gYygxNTAsMTI1LDEwMCw3NSw1MCwyNSwwLDI1LDUwLDc1KQptYXRyaXhDWyAsOF0gPC0gYygxNzUsMTUwLDEyNSwxMDAsNzUsNTAsMjUsMCwyNSw1MCkKbWF0cml4Q1sgLCA5XSA8LSBjKDIwMCwxNzUsMTUwLDEyNSwxMDAsNzUsNTAsMjUsMCwyNSkKbWF0cml4Q1sgLCAxMF0gPC0gYygyMjUsMjAwLDE3NSwxNTAsMTI1LDEwMCw3NSw1MCwyNSwwKQoKIyMjIyBNYXRyaXggRAptYXRyaXhEIDwtIG1hdHJpeEEKCiMjIyMgTWF0cml4IEUKbWF0cml4RSA8LSBtYXRyaXgoTkEsIG5jb2wgPSBsZW5ndGgodHJhcGxvY3NFKSwgbnJvdyA9IGxlbmd0aCh0cmFwbG9jc0UpKQptYXRyaXhFWyAsMV0gPC0gYygwLDI1LDUwLDc1LDEwMCwxMjUsMTUwLDE3NSwyMDAsMjI1LDI1MCwyNzUsMzAwLDMyNSkKbWF0cml4RVsgLDJdIDwtIGMoMjUsMCwyNSw1MCw3NSwxMDAsMTI1LDE1MCwxNzUsMjAwLDIyNSwyNTAsMjc1LDMwMCkKbWF0cml4RVsgLDNdIDwtIGMoNTAsMjUsMCwyNSw1MCw3NSwxMDAsMTI1LDE1MCwxNzUsMjAwLDIyNSwyNTAsMjc1KQptYXRyaXhFWyAsNF0gPC0gYyg3NSwgNTAsMjUsMCwyNSw1MCw3NSwxMDAsMTI1LDE1MCwxNzUsMjAwLDIyNSwyNTApCm1hdHJpeEVbICw1XSA8LSBjKDEwMCw3NSw1MCwyNSwwLDI1LDUwLDc1LDEwMCwxMjUsMTUwLDE3NSwyMDAsMjI1KQptYXRyaXhFWyAsNl0gPC0gYygxMjUsMTAwLDc1LDUwLDI1LDAsMjUsNTAsNzUsMTAwLDEyNSwxNTAsMTc1LDIwMCkKbWF0cml4RVsgLDddIDwtIGMoMTUwLDEyNSwxMDAsNzUsNTAsMjUsMCwyNSw1MCw3NSwxMDAsMTI1LDE1MCwxNzUpCm1hdHJpeEVbICw4XSA8LSBjKDE3NSwxNTAsMTI1LDEwMCw3NSw1MCwyNSwwLDI1LDUwLDc1LDEwMCwxMjUsMTUwKQptYXRyaXhFWyAsIDldIDwtIGMoMjAwLDE3NSwxNTAsMTI1LDEwMCw3NSw1MCwyNSwwLDI1LDUwLDc1LDEwMCwxMjUpCm1hdHJpeEVbICwgMTBdIDwtIGMoMjI1LDIwMCwxNzUsMTUwLDEyNSwxMDAsNzUsNTAsMjUsMCwyNSw1MCw3NSwxMDApCm1hdHJpeEVbICwgMTFdIDwtIGMoMjUwLDIyNSwyMDAsMTc1LDE1MCwxMjUsMTAwLDc1LDUwLDI1LDAsMjUsNTAsNzUpCm1hdHJpeEVbICwgMTJdIDwtIGMoMjc1LDI1MCwyMjUsMjAwLDE3NSwxNTAsMTI1LDEwMCw3NSw1MCwyNSwwLDI1LDUwKQptYXRyaXhFWyAsIDEzXSA8LSBjKDMwMCwyNzUsMjUwLDIyNSwyMDAsMTc1LDE1MCwxMjUsMTAwLDc1LDUwLDI1LDAsMjUpCm1hdHJpeEVbICwgMTRdIDwtIGMoMzI1LDMwMCwyNzUsMjUwLDIyNSwyMDAsMTc1LDE1MCwxMjUsMTAwLDc1LDUwLDI1LDApCgoKIyMjIyBNYXRyaXggRgptYXRyaXhGIDwtIG1hdHJpeChOQSwgbmNvbCA9IGxlbmd0aCh0cmFwbG9jc0YpLCBucm93ID0gbGVuZ3RoKHRyYXBsb2NzRikpCm1hdHJpeEZbICwxXSA8LSBjKDAsMjUsNTAsNzUsMTAwLDEyNSwxNTApCm1hdHJpeEZbICwyXSA8LSBjKDI1LDAsMjUsNTAsNzUsMTAwLDEyNSkKbWF0cml4RlsgLDNdIDwtIGMoNTAsMjUsMCwyNSw1MCw3NSwxMDApCm1hdHJpeEZbICw0XSA8LSBjKDc1LCA1MCwyNSwwLDI1LDUwLDc1KQptYXRyaXhGWyAsNV0gPC0gYygxMDAsNzUsIDUwLDI1LDAsMjUsNTApCm1hdHJpeEZbICw2XSA8LSBjKDEyNSwxMDAsNzUsIDUwLDI1LDAsMjUpCm1hdHJpeEZbICw3XSA8LSBjKDE1MCwxMjUsMTAwLDc1LCA1MCwyNSwwKQoKIyMjIyBNYXRyaXggRwptYXRyaXhHIDwtIG1hdHJpeEYKCiMjIyMgTWF0cml4IEoKbWF0cml4SiA8LSBtYXRyaXhDCgojIyMjIE1hdHJpeCBLCm1hdHJpeEsgPC0gbWF0cml4QwoKIyMjIyBNYXRyaXggTAptYXRyaXhMIDwtIG1hdHJpeEEKCiMjIyMgTWF0cml4IE0KbWF0cml4TSA8LSBtYXRyaXgoTkEsIG5jb2wgPSBsZW5ndGgodHJhcGxvY3NNKSwgbnJvdyA9IGxlbmd0aCh0cmFwbG9jc00pKQoKbWF0cml4TVsgLDFdIDwtIGMoMCwyNSw1MCw3NSwxMDAsMTI1LDE1MCwxNzUsMjAwLDIyNSwyNTAsMjc1KQptYXRyaXhNWyAsMl0gPC0gYygyNSwwLDI1LDUwLDc1LDEwMCwxMjUsMTUwLDE3NSwyMDAsMjI1LDI1MCkKbWF0cml4TVsgLDNdIDwtIGMoNTAsMjUsMCwyNSw1MCw3NSwxMDAsMTI1LDE1MCwxNzUsMjAwLDIyNSkKbWF0cml4TVsgLDRdIDwtIGMoNzUsIDUwLDI1LDAsMjUsNTAsNzUsMTAwLDEyNSwxNTAsMTc1LDIwMCkKbWF0cml4TVsgLDVdIDwtIGMoMTAwLDc1LDUwLDI1LDAsMjUsNTAsNzUsMTAwLDEyNSwxNTAsMTc1KQptYXRyaXhNWyAsNl0gPC0gYygxMjUsMTAwLDc1LDUwLDI1LDAsMjUsNTAsNzUsMTAwLDEyNSwxNTApCm1hdHJpeE1bICw3XSA8LSBjKDE1MCwxMjUsMTAwLDc1LDUwLDI1LDAsMjUsNTAsNzUsMTAwLDEyNSkKbWF0cml4TVsgLDhdIDwtIGMoMTc1LDE1MCwxMjUsMTAwLDc1LDUwLDI1LDAsMjUsNTAsNzUsMTAwKQptYXRyaXhNWyAsIDldIDwtIGMoMjAwLDE3NSwxNTAsMTI1LDEwMCw3NSw1MCwyNSwwLDI1LDUwLDc1KQptYXRyaXhNWyAsIDEwXSA8LSBjKDIyNSwyMDAsMTc1LDE1MCwxMjUsMTAwLDc1LDUwLDI1LDAsMjUsNTApCm1hdHJpeE1bICwgMTFdIDwtIGMoMjUwLDIyNSwyMDAsMTc1LDE1MCwxMjUsMTAwLDc1LDUwLDI1LDAsMjUpCm1hdHJpeE1bICwgMTJdIDwtIGMoMjc1LDI1MCwyMjUsMjAwLDE3NSwxNTAsMTI1LDEwMCw3NSw1MCwyNSwwKQoKIyMjIyBNYXRyaXggTgptYXRyaXhOIDwtIG1hdHJpeEMKCiMjIyMgTWF0cml4IE8KbWF0cml4TyA8LSBtYXRyaXhDCgojIFRyYXAgbG9jYXRpb24gYW5kIGRpc3RhbmNlIG1hdHJpY2VzIC8gMTAwCiMgc2NhbGUgZm9yIGNvbXB1dGF0aW9uYWwgcHVycG9zZXMKdHJhcGxvY3NBIDwtIHRyYXBsb2NzQSAvIDEwMAp0cmFwbG9jc0MgPC0gdHJhcGxvY3NDIC8gMTAwCnRyYXBsb2NzRCA8LSB0cmFwbG9jc0QgLyAxMDAKdHJhcGxvY3NFIDwtIHRyYXBsb2NzRSAvIDEwMAp0cmFwbG9jc0YgPC0gdHJhcGxvY3NGIC8gMTAwCnRyYXBsb2NzRyA8LSB0cmFwbG9jc0cgLyAxMDAKdHJhcGxvY3NKIDwtIHRyYXBsb2NzSiAvIDEwMAp0cmFwbG9jc0sgPC0gdHJhcGxvY3NLIC8gMTAwCnRyYXBsb2NzTCA8LSB0cmFwbG9jc0wgLyAxMDAKdHJhcGxvY3NNIDwtIHRyYXBsb2NzTSAvIDEwMAp0cmFwbG9jc04gPC0gdHJhcGxvY3NOIC8gMTAwCnRyYXBsb2NzTyA8LSB0cmFwbG9jc08gLyAxMDAKbWF0cml4QSA8LSBtYXRyaXhBIC8gMTAwCm1hdHJpeEMgPC0gbWF0cml4QyAvIDEwMAptYXRyaXhEIDwtIG1hdHJpeEQgLyAxMDAKbWF0cml4RSA8LSBtYXRyaXhFIC8gMTAwCm1hdHJpeEYgPC0gbWF0cml4RiAvIDEwMAptYXRyaXhHIDwtIG1hdHJpeEcgLyAxMDAKbWF0cml4SiA8LSBtYXRyaXhKIC8gMTAwCm1hdHJpeEsgPC0gbWF0cml4SyAvIDEwMAptYXRyaXhMIDwtIG1hdHJpeEwgLyAxMDAKbWF0cml4TSA8LSBtYXRyaXhNIC8gMTAwCm1hdHJpeE4gPC0gbWF0cml4TiAvIDEwMAptYXRyaXhPIDwtIG1hdHJpeE8gLyAxMDAKCiMjIFN1YnNldCBEYXRhIGZvciBTaXRlcyBhbmQgU3BlY2llcyAoRGVuc2l0eSBvZiBhbGwgdHVydGxlcyBwZXIgc2l0ZSkKCiMgU2l0ZSBBLCBDUElDCkVERkEgPC0gRURGICU+JQogIGZpbHRlcihzaXRlX251bSA9PSAxICYgc3BlY2llcyA9PSAiQ1BJQyIpCkVERkEKCiMgU2l0ZSBBLCBDU0VSCkVERkFfQ1NFUiA8LSBFREYgJT4lCiAgZmlsdGVyKHNpdGVfbnVtID09IDEgJiBzcGVjaWVzID09ICJDU0VSIikKRURGQV9DU0VSWzUsNF0gPC0gNTU1ICAjIyMjIEZpbGxpbmcgaW4gYmxhbmsgSUQKCiMgU2l0ZSBDLCBDUElDCkVERkMgPC0gRURGICU+JQogIGZpbHRlcihzaXRlX251bSA9PSAyICYgc3BlY2llcyA9PSAiQ1BJQyIpCkVERkMKCiMgU2l0ZSBDLCBDU0VSCkVERkNfQ1NFUiA8LSBFREYgJT4lCiAgZmlsdGVyKHNpdGVfbnVtID09IDIgJiBzcGVjaWVzID09ICJDU0VSIikKRURGQ19DU0VSCgojIFNpdGUgRCwgQ1BJQwpFREZEIDwtIEVERiAlPiUKICBmaWx0ZXIoc2l0ZV9udW0gPT0gMyAmIHNwZWNpZXMgPT0gIkNQSUMiKQpFREZECgojIFNpdGUgRCwgQ1NFUgpFREZEX0NTRVIgPC0gRURGICU+JQogIGZpbHRlcihzaXRlX251bSA9PSAzICYgc3BlY2llcyA9PSAiQ1NFUiIpCkVERkRfQ1NFUiAgIyMjIyMjIDIgaW5kaXZpZHVhbHMKCiMgU2l0ZSBFLCBDUElDCkVERkUgPC0gRURGICU+JQogIGZpbHRlcihzaXRlX251bSA9PSA0ICYgc3BlY2llcyA9PSAiQ1BJQyIpCkVERkUKCiMgU2l0ZSBFLCBDU0VSCkVERkVfQ1NFUiA8LSBFREYgJT4lCiAgZmlsdGVyKHNpdGVfbnVtID09IDQgJiBzcGVjaWVzID09ICJDU0VSIikKRURGRV9DU0VSCgojIFNpdGUgRiwgQ1BJQwpFREZGIDwtIEVERiAlPiUKICBmaWx0ZXIoc2l0ZV9udW0gPT0gNSAmIHNwZWNpZXMgPT0gIkNQSUMiKQpFREZGCgojIFNpdGUgRiwgQ1NFUgpFREZGX0NTRVIgPC0gRURGICU+JQogIGZpbHRlcihzaXRlX251bSA9PSA1ICYgc3BlY2llcyA9PSAiQ1NFUiIpCkVERkZfQ1NFUgoKIyBTaXRlIEcsIENQSUMKRURGRyA8LSBFREYgJT4lCiAgZmlsdGVyKHNpdGVfbnVtID09IDYgJiBzcGVjaWVzID09ICJDUElDIikKRURGRwoKIyBTaXRlIEcsIENTRVIKRURGR19DU0VSIDwtIEVERiAlPiUKICBmaWx0ZXIoc2l0ZV9udW0gPT0gNiAmIHNwZWNpZXMgPT0gIkNTRVIiKQpFREZHX0NTRVIKCiMgU2l0ZSBKLCBDUElDCkVERkogPC0gRURGICU+JQogIGZpbHRlcihzaXRlX251bSA9PSA5ICYgc3BlY2llcyA9PSAiQ1BJQyIpCkVERkoKCiMgU2l0ZSBKLCBDU0VSCkVERkpfQ1NFUiA8LSBFREYgJT4lCiAgZmlsdGVyKHNpdGVfbnVtID09IDkgJiBzcGVjaWVzID09ICJDU0VSIikKRURGSl9DU0VSCgojIFNpdGUgSywgQ1BJQwpFREZLIDwtIEVERiAlPiUKICBmaWx0ZXIoc2l0ZV9udW0gPT0gMTAgJiBzcGVjaWVzID09ICJDUElDIikKRURGSwoKIyBTaXRlIEssIENTRVIKRURGS19DU0VSIDwtIEVERiAlPiUKICBmaWx0ZXIoc2l0ZV9udW0gPT0gMTAgJiBzcGVjaWVzID09ICJDU0VSIikKRURGS19DU0VSICAgIyMjIyBPbmx5IDIgaW5kaXZpZHVhbHMKCiMgU2l0ZSBMLCBDUElDCkVERkwgPC0gRURGICU+JQogIGZpbHRlcihzaXRlX251bSA9PSAxMSAmIHNwZWNpZXMgPT0gIkNQSUMiKQpFREZMCgojIFNpdGUgTCwgQ1NFUgpFREZMX0NTRVIgPC0gRURGICU+JQogIGZpbHRlcihzaXRlX251bSA9PSAxMSAmIHNwZWNpZXMgPT0gIkNTRVIiKQpFREZMX0NTRVIgICMjIyMgT25seSAxIGluZGl2aWR1YWwKCiMgU2l0ZSBNLCBDUElDCkVERk0gPC0gRURGICU+JQogIGZpbHRlcihzaXRlX251bSA9PSAxMiAmIHNwZWNpZXMgPT0gIkNQSUMiKQpFREZNCgojIFNpdGUgTSwgQ1NFUgpFREZNX0NTRVIgPC0gRURGICU+JQogIGZpbHRlcihzaXRlX251bSA9PSAxMiAmIHNwZWNpZXMgPT0gIkNTRVIiKQpFREZNX0NTRVIKCiMgU2l0ZSBOLCBDUElDCkVERk4gPC0gRURGICU+JQogIGZpbHRlcihzaXRlX251bSA9PSAxMyAmIHNwZWNpZXMgPT0gIkNQSUMiKQpFREZOCgojIFNpdGUgTiwgQ1NFUgpFREZOX0NTRVIgPC0gRURGICU+JQogIGZpbHRlcihzaXRlX251bSA9PSAxMyAmIHNwZWNpZXMgPT0gIkNTRVIiKQpFREZOX0NTRVIKCiMgU2l0ZSBPLCBDUElDCkVERk8gPC0gRURGICU+JQogIGZpbHRlcihzaXRlX251bSA9PSAxNCAmIHNwZWNpZXMgPT0gIkNQSUMiKQpFREZPCgojIFNpdGUgTywgQ1NFUgpFREZPX0NTRVIgPC0gRURGICU+JQogIGZpbHRlcihzaXRlX251bSA9PSAxNCAmIHNwZWNpZXMgPT0gIkNTRVIiKQpFREZPX0NTRVIKCgpgYGAKCgojTW9kZWwgSW5mb3JtYXRpb246CkkgZmlyc3QgY3JlYXRlZCBhIG51bGwgbW9kZWwgKHdpdGhvdXQgaGV0ZXJvZ2VuZWl0eSBpbiBjYXB0dXJlIHByb2JhYmlsaXR5IGJ5IGRheSBvciBpbmRpdmlkdWFsKSBhbmQgZXZvbHZlZCB0aGUgbW9kZWwgdW50aWwgaXQgaXMgd2hhdCBpcyBzaG93biBiZWxvdy4KCmFscGhhMCA9IHNldCBwcm9iLiBvZiBiYXNlbGluZSBlbmNvdW50ZXIKbG9naXQgPSBjb25zdHJhaW5pbmcgcHJvYiBiZXR3ZWVuIDAgYW5kIDEKYWxwaGExID0gc2V0IHByb2JhYmlsaXR5IG9mIGVuY291bnRlciBhdCAxIHVuaXQgZGlzdGFuY2UgYXdheSBmcm9tIGFscGhhMApzaWdtYSA9IHNjYWxlIHBhcmFtZXRlciBvZiBhIGhhbGYtbm9ybWFsCkZvciBlYWNoIGluZGl2aWR1YWwgZm9yIG51bWJlciBvZiBhdWdtZW50cyAoTSksIGZpbmQgeltpXSAtIGxpa2VsaWhvb2QgdGhhdCBhdWdtZW50IGlzIHBhcnQgb2Ygc2FtcGxlZCBwb3B1bGF0aW9uLCBhY3Rpdml0eSBjZW50ZXIgKGFjcyBhc3N1bWVkIHRvIGJlIHVuaWZvcm1hbGx5IGRpc3RyaWJ1dGVkKSAsIGFuZCBmb3IgZWFjaCB0cmFwLgpDYWxjdWxhdGUgZGlzdGFuY2Ugb2YgZWFjaCBpbmRpdmlkdWFsIGkgZnJvbSB0cmFwIGogdXNpbmcgZGlzdGFuY2UgZXF1YXRpb24uCkVzdGltYXRlIHBhcmFtZXRlcnMgYWZmZWN0aW5nIHRoZSBvYnNlcnZlZCBudW1iZXIgb2YgdGltZXMgY2F1Z2h0IHBlciB0cmFwIHJlZmxlY3RpbmcgYSAgICAgIGJpbm9taWFsIGRpc3RyaWJ1dGlvbiB3aXRoIHByb2JhYmlsaXR5IG9mIGVuY291bnRlciBjaGFuZ2luZyBieSBpbmRpdmlkdWFsIGFuZCBkYXkuCkVzdGltYXRlIGVuY291bnRlciBwcm9iYWJpbGl0eSBwYXJhbWV0ZXJzIGluY2x1ZGluZyBsaWtlbGlob29kIGFuIGluZGl2aWR1YWwgaXMgcGFydCBvZiBwb3B1bGF0aW9uLgoKIyBDYWxjdWxhdGUgcG9wdWxhdGlvbiBzaXplIGJ5IHN1bW1pbmcgYWxsIDFzIGFzc29jaWF0ZWQgd2l0aCBpbmRpdmlkdWFscyB3aXRoaW4gdGhlIHBvcHVsYXRpb24gdGhhdCB3ZXJlIHNhbXBsZWQgKHByb2IuIG9mIHogPSAxKQojIENhbGN1bGF0ZSBkZW5zaXR5IGJ5IGRpdmlkaW5nIHBvcHVsYXRpb24gc2l6ZSBieSBzdGF0ZSBzcGFjZSBzaXplICh0cmFwcGluZyBsZW5ndGggKyBidWZmZXJzKS4KCiMjIyMgVEhFIE1PREVMCgpgYGB7ciwgZXZhbCA9IEZBTFNFfQoKIyMjIyBNb2RlbCB3aXRoIGluZGl2aWR1YWwgaGV0ZXJvZ2VuZWl0eSBpbiBjYXB0dXJlIHByb2JhYmlsaXR5ICMjIyMKY2F0ICgiCiAgbW9kZWwgewogICAgICMgYWxwaGExIH4gZGdhbW1hKDAuMSwgMC4xKSAjIGNvbnNpZGVyIGFwcHJvcHJpYXRlIHByaW9yCiAgICAgIyBhbHBoYTEgfiBkdCgwLCAxIC8gKDVeMiksIDEpSSgwLCApIAkjIyBpbXBsaWVzIGhhbGYtY2F1Y2h5IHdpdGggc2NhbGUgb2YgNQogICAgIGFscGhhMSB+IGRub3JtKDAsIDEgLyAoMjVeMikpSSgwLCApIAkjIyBoYWxmIG5vcm1hbAogICAgIHNpZ21hIDwtIHBvdygxIC8gKDIqYWxwaGExKSwgMC41KSAjIHNkIG9mIGhhbGYgbm9ybWFsCiAgICAgcHNpIH4gZHVuaWYoMCwgMSkKCnNpZ21hX2luZCB+IGR0KDAsIDEgLyAoMjVeMiksIDEpSSgwLCApIAkjIyBpbXBsaWVzIGhhbGYtY2F1Y2h5IHdpdGggc2NhbGUgb2YgMjUKZm9yKGkgaW4gMTpNKSB7CmZvcihrIGluIDE6SykgewpldGFbaSxrXSB+IGRub3JtKDAsIDEgLyAoc2lnbWFfaW5kICogc2lnbWFfaW5kKSkKfQp9CgogICAgIGZvcihrIGluIDE6SykgewogICAgIGFscGhhMFtrXSB+IGRub3JtKDAsIDAuMSkKICAgICB9CiAgICAgZm9yKGkgaW4gMTpNKSB7CiAgICAgeltpXSB+IGRiZXJuKHBzaSkKICAgICBzW2ldIH4gZHVuaWYoeGxpbUFbMV0sIHhsaW1BWzJdKQogICAgIGZvcihqIGluIDE6bl90cmFwcykgewogICAgIGRbaSxqXSA8LSBhYnMoc1tpXSAtIHRyYXBsb2NzQVtqXSkKICAgICBmb3IoayBpbiAxOkspIHsKbG9naXQocDBbaSxqLGtdKSA8LSBhbHBoYTBba10gKyBldGFbaSxrXQogICAgIHlbaSxqLCBrXSB+IGRiZXJuKHBbaSxqLGtdKQogICAgIHBbaSxqLCBrXSA8LSB6W2ldKnAwW2ksaixrXSpleHAoLSBhbHBoYTEgKiBkW2ksal0gKiBkW2ksal0pCiAgICAgfQogICAgIH0KICAgICB9CiAgICAgIyBEZXJpdmVkIHBhcmFtZXRlcnMKICAgICBOIDwtIHN1bSh6WyBdKQogICAgIGRlbnNpdHkgPC0gTiAvICh4bGltQVsyXSAtIHhsaW1BWzFdKSAjIGRpdmlkZWQgZGlzdGFuY2VzIGJ5IDEwMCBzbyBjYWxjdWxhdGVzIHR1cnRsZXMgcGVyIDEwMCBtIG9mIGNhbmFsCiAgICAgfQogICAgICIsIGZpbGUgPSAiQ29kZS9KQUdTL1NDUl9JbmRfVGltZS50eHQiKQoKCnRlc3RpbmcgPC0gVFJVRQppZih0ZXN0aW5nKSB7CiAgbmEgPSA1MDAKICBuaSA9IDUwMAogIG50ID0gMQogIG5jID0gMwp9IGVsc2UgewogIG5hID0gMTAwMDAwCiAgbmkgPSA2MDAwMDAKICBudCA9IDYwCiAgbmMgPSA0Cn0KCmBgYAoKCiMjIENyZWF0aW5nIE9iamVjdHMgU3BlY2lmaWMgdG8gU0NSIE1vZGVsCk9iamVjdHMgQ3JlYXRlZCBQZXIgU2l0ZSBhbmQgU3BlY2llcyBGb3VuZCBpbiAiU2l0ZV9TcGVjaWVzX01vZGVscy5SIgoKIyBFeGFtcGxlOiBSdW5uaW5nIG1vZGVsIG9uIG9uZSBzZXQgb2Ygb2JqZWN0cyBmb3IgQ1BJQyBTaXRlIEEKCmBgYHtyLCBldmFsID0gRkFMU0V9CmphZ3NfZGF0YSA8LSBsaXN0KHkgPSBFTV9hcnJheUEsIHRyYXBsb2NzQSA9IHRyYXBsb2NzQSwgSz1LLCBNPU1fQSwgeGxpbUE9eGxpbUEsIG5fdHJhcHMgPSBuX3RyYXBzQSkKaW5pdHMgPC0gZnVuY3Rpb24oKSB7CiAgbGlzdChhbHBoYTA9cm5vcm0oNCwtMiwuNCksIGFscGhhMT1ydW5pZigxLDEsMiksIHM9YXMubnVtZXJpYyhzc3RBW10pLCB6PXpfQSwgcHNpID0gcnVuaWYoMSkpCn0KCnBhcmFtZXRlcnMgPC0gYygiYWxwaGEwIiwgImFscGhhMSIsICJzaWdtYSIsICJOIiwgImRlbnNpdHkiLCAicyIsICJzaWdtYV9pbmQiLCAicHNpIiwgInoiKQoKIyBydW4gaW4gcGFyYWxsZWwgZXhwbGljaXRseQpjbCA8LSBtYWtlQ2x1c3RlcihuYykgICAgICAgICAgICAgICAgICAgICAgICMgUmVxdWVzdCAjIGNvcmVzCmNsdXN0ZXJFeHBvcnQoY2wsIGMoImphZ3NfZGF0YSIsICJpbml0cyIsICJwYXJhbWV0ZXJzIiwgInpfQSIsICJzc3RBIiwgIm5pIiwgIm5hIiwgIm50IikpICMgTWFrZSB0aGVzZSBhdmFpbGFibGUKY2x1c3RlclNldFJOR1N0cmVhbShjbCA9IGNsLCA1NDM1NDM1NCkKCnN5c3RlbS50aW1lKHsgIyBubyBzdGF0dXMgYmFyICglIGNvbXBsZXRlKSB3aGVuIHJ1biBpbiBwYXJhbGxlbAogIG91dF8xX2NwaWMgPC0gY2x1c3RlckV2YWxRKGNsLCB7CiAgICBsaWJyYXJ5KHJqYWdzKQogICAgam0gPC0gamFncy5tb2RlbCgiQ29kZS9KQUdTL1NDUl9JbmRfVGltZS50eHQiLCBqYWdzX2RhdGEsIGluaXRzLCBuLmFkYXB0ID0gbmEsIG4uY2hhaW5zID0gMSkgIyBDb21waWxlIG1vZGVsIGFuZCBydW4gYnVybmluCiAgICBvdXRfMV9jcGljIDwtIGNvZGEuc2FtcGxlcyhqbSwgcGFyYW1ldGVycywgbi5pdGVyID0gbmksIHRoaW4gPSBudCkgIyBTYW1wbGUgZnJvbSBwb3N0ZXJpb3IgZGlzdHJpYnV0aW9uCiAgICByZXR1cm4oYXMubWNtYyhvdXRfMV9jcGljKSkKICB9KQp9KSAjCgpzdG9wQ2x1c3RlcihjbCkKCmNwaWNfQV9tY21jIDwtIG1jbWMubGlzdChvdXRfMV9jcGljKQoKc2F2ZShjcGljX0FfbWNtYywgZmlsZSA9ICJSZXN1bHRzL0pBR1MvY3BpY19BX21jbWMuUkRhdGEiKQoKUnVuIE1vZGVsIE9uIE9iamVjdHMgZm9yIGVhY2ggU2l0ZSAtIFNwZWNpZXMgQ29tYmluYXRpb24uCnBhcmFtZXRlcnMsIGluaXRpYWwgdmFsdWVzLCBpdGVyYXRpb25zIC0gYWRhcHQsIGl0ZXJhdGlvbnMgLSBzYXZlZCBlYWNoIG1jbWMgZmlsZSB1bmRlciBmb2xkZXIgIlJlc3VsdHMvSkFHUyIgIkpBR1MiCmBgYAoKI1NFRSBSRVNUIE9GIENPREUgSU4gIlNpdGVfU3BlY2llc19Nb2RlbC5SIiAoVG9vIGxhcmdlIGZvciBNYXJrZG93biB0byBrbml0KQoKCiMjIE9idGFpbmluZyBMaXN0IG9mIEFjdGl2aXR5IENlbnRlcnMgYW5kIERlbnNpdHkgUGVyIFNpdGUgYW5kIFNwZWNpZXMKQXMgTUNNQyBjaGFpbnMgd2VyZSBydW4gaW4gcGFyYWxsZWwgcHJvY2Vzc2luZywgSSBmaXJzdCBjb21iaW5lZCByb3dzIG9mIHRoZSByZXN1bHRpbmcgMyBsaXN0IG9iamVjdHMgaW50byBvbmUgcmVzdWx0IG9iamVjdC4gSSB0aGVuIG9idGFpbmVkIGFjdGl2aXR5IGNlbnRlcnMgcGVyIGluZGl2aWR1YWwgYW5kIGRlbnNpdGllcyBwZXIgc2l0ZSBmcm9tIGVhY2ggY29tcGxldGUgTUNNQyBvYmplY3QgYWZ0ZXIgYXZlcmFnaW5nIHRoZSByZXN1bHRzIGZyb20gYWxsIGNoYWlucy4KCmBgYHtyLCBldmFsID0gRkFMU0V9CgojIyMjIyMjIFNpdGUgQSwgQ1BJQyAjIyMjIyMjIwojIExvYWQgTUNNQyBEYXRhCmxvYWQoIlJlc3VsdHMvSkFHUy9jcGljX0FfbWNtYy5SRGF0YSIpCgojIGNvbWJpbmUgY2hhaW5zCmRmX21jbWNfY3BpY19BIDwtIGFzLmRhdGEuZnJhbWUoY3BpY19BX21jbWNbWzFdXSkKZm9yKGkgaW4gMjpsZW5ndGgoY3BpY19BX21jbWMpKSB7CiAgZGZfbWNtY19jcGljX0EgPC0gYmluZF9yb3dzKGRmX21jbWNfY3BpY19BLCBhcy5kYXRhLmZyYW1lKGNwaWNfQV9tY21jW1tpXV0pKQp9CgojIE9idGFpbiBBY3Rpdml0eSBDZW50ZXJzCmNlbnRlcnNfY3BpY19BIDwtIGRmX21jbWNfY3BpY19BICU+JQogIHNlbGVjdChzdGFydHNfd2l0aCgic1siKSkgJT4lCiAgc3VtbWFyaXNlX2FsbChtZWFuKSAlPiUKICB0KCkKCmNlbnRlcnNfY3BpY19BIDwtIGNlbnRlcnNfY3BpY19BWzE6MzYsIF0KCmhpc3QoY2VudGVyc19jcGljX0FbXSkgIyBhY3Rpdml0eSBjZW50ZXJzIGZvciBpbmRpdmlkdWFscyBjYXVnaHQgYXQgbGVhc3Qgb25jZQoKCiMjIyMgT2J0YWluaW5nIERlbnNpdHkgYW5kIE4gRm9yIFNpdGUgQSBhbmQgQ1BJQ1MgZnJvbSBNQ01DIE91dHB1dCAjIyMjCgpkZW5zaXRpZXNfY3BpY19BIDwtIGRmX21jbWNfY3BpY19BJGRlbnNpdHlbNTAxOjEwMDBdICNkZW5zaXRpZXMgcGVyIGl0ZXJhdGlvbiBhZnRlciBidXJuaW4Kc3RkZXJyb3JfY3BpY19BIDwtIHN0ZC5lcnJvcihhcy52ZWN0b3IoZGVuc2l0aWVzX2NwaWNfQSkpCm1lYW5fZGVuc2l0eV9jcGljX0EgPC0gbWVhbihkZW5zaXRpZXNfY3BpY19BKSAjIE1lYW4gIyB0dXJ0bGVzIHBlciAxMDAgbWV0ZXJzCgplc3RpbWF0ZWRfTl9jcGljX0EgPC0gZGZfbWNtY19jcGljX0EkTls1MDE6MTAwMF0KbWVhbl9lc3RfTl9jcGljX0EgPC0gbWVhbihlc3RpbWF0ZWRfTl9jcGljX0EpICMgTWVhbiAjIHR1cnRsZXMgb3ZlciB0cmFwIGFyZWEgKCsgYm91bmRhcnkpCm1lYW5fZXN0X05fY3BpY19BL21lYW5fZGVuc2l0eV9jcGljX0EKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKIyMjIyMjIyMjIyMjIFNpdGUgQSwgQ1NFUiAjIyMjIyMjIyMjIyMjIwpsb2FkKCJSZXN1bHRzL0pBR1MvY3Nlcl9BX21jbWMuUkRhdGEiKQoKIyBjb21iaW5lIGNoYWlucwpkZl9tY21jX2NzZXJfQSA8LSBhcy5kYXRhLmZyYW1lKGNzZXJfQV9tY21jW1sxXV0pCmZvcihpIGluIDI6bGVuZ3RoKGNzZXJfQV9tY21jKSkgewogIGRmX21jbWNfY3Nlcl9BIDwtIGJpbmRfcm93cyhkZl9tY21jX2NzZXJfQSwgYXMuZGF0YS5mcmFtZShjc2VyX0FfbWNtY1tbaV1dKSkKfQoKIyBPYnRhaW4gQWN0aXZpdHkgQ2VudGVycwpjZW50ZXJzX2NzZXJfQSA8LSBkZl9tY21jX2NzZXJfQSAlPiUKICBzZWxlY3Qoc3RhcnRzX3dpdGgoInNbIikpICU+JQogIHN1bW1hcmlzZV9hbGwobWVhbikgJT4lCiAgdCgpCgpjZW50ZXJzX2NzZXJfQSA8LSBjZW50ZXJzX2NzZXJfQVsxOm5faW5kQSwgXQoKaGlzdChjZW50ZXJzX2NzZXJfQSkgIyBhY3Rpdml0eSBjZW50ZXJzIGZvciBpbmRpdmlkdWFscyBjYXVnaHQgYXQgbGVhc3Qgb25jZQoKCiMjIyMgT2J0YWluaW5nIERlbnNpdHkgYW5kIE4gRm9yIFNpdGUgQSBhbmQgQ1NFUiBmcm9tIE1DTUMgT3V0cHV0ICMjIyMKCmRlbnNpdGllc19jc2VyX0EgPC0gZGZfbWNtY19jc2VyX0EkZGVuc2l0eVs1MDE6MTAwMF0gI2RlbnNpdGllcyBwZXIgaXRlcmF0aW9uIGFmdGVyIGJ1cm5pbgpzdGRlcnJvcl9jc2VyX0EgPC0gc3RkLmVycm9yKGFzLnZlY3RvcihkZW5zaXRpZXNfY3Nlcl9BKSkKbWVhbl9kZW5zaXR5X2NzZXJfQSA8LSBtZWFuKGRlbnNpdGllc19jc2VyX0EpICMgTWVhbiAjIHR1cnRsZXMgcGVyIDEwMCBtZXRlcnMKCmVzdGltYXRlZF9OX2NzZXJfQSA8LSBkZl9tY21jX2NzZXJfQSROWzUwMToxMDAwXQptZWFuX2VzdF9OX2NzZXJfQSA8LSBtZWFuKGVzdGltYXRlZF9OX2NzZXJfQSkgIyBNZWFuICMgdHVydGxlcyBvdmVyIHRyYXAgYXJlYSAoKyBib3VuZGFyeSkKbWVhbl9lc3RfTl9jc2VyX0EvbWVhbl9kZW5zaXR5X2NzZXJfQQoKCiMjIyMjIyMgU2l0ZSBDLCBDUElDICMjIyMjIyMjCgojIExvYWQgTUNNQyBEYXRhCmxvYWQoIlJlc3VsdHMvSkFHUy9jcGljX0NfbWNtYy5SRGF0YSIpCgojIGNvbWJpbmUgY2hhaW5zCmRmX21jbWNfY3BpY19DIDwtIGFzLmRhdGEuZnJhbWUoY3BpY19DX21jbWNbWzFdXSkKZm9yKGkgaW4gMjpsZW5ndGgoY3BpY19DX21jbWMpKSB7CiAgZGZfbWNtY19jcGljX0MgPC0gYmluZF9yb3dzKGRmX21jbWNfY3BpY19DLCBhcy5kYXRhLmZyYW1lKGNwaWNfQ19tY21jW1tpXV0pKQp9CgojIE9idGFpbiBBY3Rpdml0eSBDZW50ZXJzCmNlbnRlcnNfY3BpY19DIDwtIGRmX21jbWNfY3BpY19DICU+JQogIHNlbGVjdChzdGFydHNfd2l0aCgic1siKSkgJT4lCiAgc3VtbWFyaXNlX2FsbChtZWFuKSAlPiUKICB0KCkKCmNlbnRlcnNfY3BpY19DIDwtIGNlbnRlcnNfY3BpY19DWzE6bl9pbmRDLCBdCgpoaXN0KGNlbnRlcnNfY3BpY19DKSAjIGFjdGl2aXR5IGNlbnRlcnMgZm9yIGluZGl2aWR1YWxzIGNhdWdodCBhdCBsZWFzdCBvbmNlCiMgaGlzdChjZW50ZXJzKQoKIyMjIyBPYnRhaW5pbmcgRGVuc2l0eSBhbmQgTgoKZGVuc2l0aWVzX2NwaWNfQyA8LSBkZl9tY21jX2NwaWNfQyRkZW5zaXR5WzUwMToxMDAwXSAjZGVuc2l0aWVzIHBlciBpdGVyYXRpb24gYWZ0ZXIgYnVybmluCnN0ZGVycm9yX2NwaWNfQyA8LSBzdGQuZXJyb3IoYXMudmVjdG9yKGRlbnNpdGllc19jcGljX0MpKQptZWFuX2RlbnNpdHlfY3BpY19DIDwtIG1lYW4oZGVuc2l0aWVzX2NwaWNfQykgIyBNZWFuICMgdHVydGxlcyBwZXIgMTAwIG1ldGVycwoKZXN0aW1hdGVkX05fY3BpY19DIDwtIGRmX21jbWNfY3BpY19DJE5bNTAxOjEwMDBdCm1lYW5fZXN0X05fY3BpY19DIDwtIG1lYW4oZXN0aW1hdGVkX05fY3BpY19DKSAjIE1lYW4gIyB0dXJ0bGVzIG92ZXIgdHJhcCBhcmVhICgrIGJvdW5kYXJ5KQptZWFuX2VzdF9OX2NwaWNfQy9tZWFuX2RlbnNpdHlfY3BpY19DCgojIyMjIyMjIFNpdGUgQywgQ1NFUiAjIyMjIyMjIwoKIyBMb2FkIE1DTUMgRGF0YQpsb2FkKCJSZXN1bHRzL0pBR1MvY3Nlcl9DX21jbWMuUkRhdGEiKQoKIyBjb21iaW5lIGNoYWlucwpkZl9tY21jX2NzZXJfQyA8LSBhcy5kYXRhLmZyYW1lKGNzZXJfQ19tY21jW1sxXV0pCmZvcihpIGluIDI6bGVuZ3RoKGNzZXJfQ19tY21jKSkgewogIGRmX21jbWNfY3Nlcl9DIDwtIGJpbmRfcm93cyhkZl9tY21jX2NzZXJfQywgYXMuZGF0YS5mcmFtZShjc2VyX0NfbWNtY1tbaV1dKSkKfQoKIyBPYnRhaW4gQWN0aXZpdHkgQ2VudGVycwpjZW50ZXJzX2NzZXJfQyA8LSBkZl9tY21jX2NzZXJfQyAlPiUKICBzZWxlY3Qoc3RhcnRzX3dpdGgoInNbIikpICU+JQogIHN1bW1hcmlzZV9hbGwobWVhbikgJT4lCiAgdCgpCgpjZW50ZXJzX2NzZXJfQyA8LSBjZW50ZXJzX2NzZXJfQ1sxOm5faW5kQywgXQoKaGlzdChjZW50ZXJzX2NzZXJfQykgIyBhY3Rpdml0eSBjZW50ZXJzIGZvciBpbmRpdmlkdWFscyBjYXVnaHQgYXQgbGVhc3Qgb25jZQojIGhpc3QoY2VudGVycykKCiMjIyMgT2J0YWluaW5nIERlbnNpdHkgRm9yIFNpdGUgMSBhbmQgQ1BJQ1MgZnJvbSBNQ01DIE91dHB1dCAjIyMjCgpkZW5zaXRpZXNfY3Nlcl9DIDwtIGRmX21jbWNfY3Nlcl9DJGRlbnNpdHlbNTAxOjEwMDBdICNkZW5zaXRpZXMgcGVyIGl0ZXJhdGlvbiBhZnRlciBidXJuaW4Kc3RkZXJyb3JfY3Nlcl9DIDwtIHN0ZC5lcnJvcihhcy52ZWN0b3IoZGVuc2l0aWVzX2NzZXJfQykpCm1lYW5fZGVuc2l0eV9jc2VyX0MgPC0gbWVhbihkZW5zaXRpZXNfY3Nlcl9DKSAjIE1lYW4gIyB0dXJ0bGVzIHBlciAxMDAgbWV0ZXJzCgplc3RpbWF0ZWRfTl9jc2VyX0MgPC0gZGZfbWNtY19jc2VyX0MkTls1MDE6MTAwMF0KbWVhbl9lc3RfTl9jc2VyX0MgPC0gbWVhbihlc3RpbWF0ZWRfTl9jc2VyX0MpICMgTWVhbiAjIHR1cnRsZXMgb3ZlciB0cmFwIGFyZWEgKCsgYm91bmRhcnkpCm1lYW5fZXN0X05fY3Nlcl9DL21lYW5fZGVuc2l0eV9jc2VyX0MKCgojIyMjIyMjIFNpdGUgRCwgQ1BJQyAjIyMjIyMjIwoKbG9hZCgiUmVzdWx0cy9KQUdTL2NwaWNfRF9tY21jLlJEYXRhIikKCiMgY29tYmluZSBjaGFpbnMKZGZfbWNtY19jcGljX0QgPC0gYXMuZGF0YS5mcmFtZShjcGljX0RfbWNtY1tbMV1dKQpmb3IoaSBpbiAyOmxlbmd0aChjcGljX0RfbWNtYykpIHsKICBkZl9tY21jX2NwaWNfRCA8LSBiaW5kX3Jvd3MoZGZfbWNtY19jcGljX0QsIGFzLmRhdGEuZnJhbWUoY3BpY19EX21jbWNbW2ldXSkpCn0KCiMgT2J0YWluIEFjdGl2aXR5IENlbnRlcnMKY2VudGVyc19jcGljX0QgPC0gZGZfbWNtY19jcGljX0QgJT4lCiAgc2VsZWN0KHN0YXJ0c193aXRoKCJzWyIpKSAlPiUKICBzdW1tYXJpc2VfYWxsKG1lYW4pICU+JQogIHQoKQoKY2VudGVyc19jcGljX0QgPC0gY2VudGVyc19jcGljX0RbMTpuX2luZEQsIF0KCmhpc3QoY2VudGVyc19jcGljX0QpICMgYWN0aXZpdHkgY2VudGVycyBmb3IgaW5kaXZpZHVhbHMgY2F1Z2h0IGF0IGxlYXN0IG9uY2UKIyBoaXN0KGNlbnRlcnMpCgojIyMjIE9idGFpbmluZyBEZW5zaXR5IEZvciBTaXRlIDEgYW5kIENQSUNTIGZyb20gTUNNQyBPdXRwdXQgIyMjIwoKZGVuc2l0aWVzX2NwaWNfRCA8LSBkZl9tY21jX2NwaWNfRCRkZW5zaXR5WzUwMToxMDAwXSAjZGVuc2l0aWVzIHBlciBpdGVyYXRpb24gYWZ0ZXIgYnVybmluCnN0ZGVycm9yX2NwaWNfRCA8LSBzdGQuZXJyb3IoYXMudmVjdG9yKGRlbnNpdGllc19jcGljX0QpKQptZWFuX2RlbnNpdHlfY3BpY19EIDwtIG1lYW4oZGVuc2l0aWVzX2NwaWNfRCkgIyBNZWFuICMgdHVydGxlcyBwZXIgMTAwIG1ldGVycwoKZXN0aW1hdGVkX05fY3BpY19EIDwtIGRmX21jbWNfY3BpY19EJE5bNTAxOjEwMDBdCm1lYW5fZXN0X05fY3BpY19EIDwtIG1lYW4oZXN0aW1hdGVkX05fY3BpY19EKSAjIE1lYW4gIyB0dXJ0bGVzIG92ZXIgdHJhcCBhcmVhICgrIGJvdW5kYXJ5KQptZWFuX2VzdF9OX2NwaWNfRC9tZWFuX2RlbnNpdHlfY3BpY19ECgojIyMjIyMjIFNpdGUgRSwgQ1BJQyAjIyMjIyMjIwoKbG9hZCgiUmVzdWx0cy9KQUdTL2NwaWNfRV9tY21jLlJEYXRhIikKCiMgY29tYmluZSBjaGFpbnMKZGZfbWNtY19jcGljX0UgPC0gYXMuZGF0YS5mcmFtZShjcGljX0VfbWNtY1tbMV1dKQpmb3IoaSBpbiAyOmxlbmd0aChjcGljX0VfbWNtYykpIHsKICBkZl9tY21jX2NwaWNfRSA8LSBiaW5kX3Jvd3MoZGZfbWNtY19jcGljX0UsIGFzLmRhdGEuZnJhbWUoY3BpY19FX21jbWNbW2ldXSkpCn0KCiMgT2J0YWluIEFjdGl2aXR5IENlbnRlcnMKY2VudGVyc19jcGljX0UgPC0gZGZfbWNtY19jcGljX0UgJT4lCiAgc2VsZWN0KHN0YXJ0c193aXRoKCJzWyIpKSAlPiUKICBzdW1tYXJpc2VfYWxsKG1lYW4pICU+JQogIHQoKQoKY2VudGVyc19jcGljX0UgPC0gY2VudGVyc19jcGljX0VbMTpuX2luZEUsIF0KCmhpc3QoY2VudGVyc19jcGljX0UpICMgYWN0aXZpdHkgY2VudGVycyBmb3IgaW5kaXZpZHVhbHMgY2F1Z2h0IGF0IGxlYXN0IG9uY2UKCgojIyMjIE9idGFpbmluZyBEZW5zaXR5IGFuZCBOCgpkZW5zaXRpZXNfY3BpY19FIDwtIGRmX21jbWNfY3BpY19FJGRlbnNpdHlbNTAxOjEwMDBdICNkZW5zaXRpZXMgcGVyIGl0ZXJhdGlvbiBhZnRlciBidXJuaW4Kc3RkZXJyb3JfY3BpY19FIDwtIHN0ZC5lcnJvcihhcy52ZWN0b3IoZGVuc2l0aWVzX2NwaWNfRSkpCm1lYW5fZGVuc2l0eV9jcGljX0UgPC0gbWVhbihkZW5zaXRpZXNfY3BpY19FKSAjIE1lYW4gIyB0dXJ0bGVzIHBlciAxMDAgbWV0ZXJzCgplc3RpbWF0ZWRfTl9jcGljX0UgPC0gZGZfbWNtY19jcGljX0UkTls1MDE6MTAwMF0KbWVhbl9lc3RfTl9jcGljX0UgPC0gbWVhbihlc3RpbWF0ZWRfTl9jcGljX0UpICMgTWVhbiAjIHR1cnRsZXMgb3ZlciB0cmFwIGFyZWEgKCsgYm91bmRhcnkpCm1lYW5fZXN0X05fY3BpY19FL21lYW5fZGVuc2l0eV9jcGljX0UKCgojIyMjIyMjIFNpdGUgRSwgQ1NFUiAjIyMjIyMjIwoKbG9hZCgiUmVzdWx0cy9KQUdTL2NzZXJfRV9tY21jLlJEYXRhIikKCiMgY29tYmluZSBjaGFpbnMKZGZfbWNtY19jc2VyX0UgPC0gYXMuZGF0YS5mcmFtZShjc2VyX0VfbWNtY1tbMV1dKQpmb3IoaSBpbiAyOmxlbmd0aChjc2VyX0VfbWNtYykpIHsKICBkZl9tY21jX2NzZXJfRSA8LSBiaW5kX3Jvd3MoZGZfbWNtY19jc2VyX0UsIGFzLmRhdGEuZnJhbWUoY3Nlcl9FX21jbWNbW2ldXSkpCn0KCiMgT2J0YWluIEFjdGl2aXR5IENlbnRlcnMKY2VudGVyc19jc2VyX0UgPC0gZGZfbWNtY19jc2VyX0UgJT4lCiAgc2VsZWN0KHN0YXJ0c193aXRoKCJzWyIpKSAlPiUKICBzdW1tYXJpc2VfYWxsKG1lYW4pICU+JQogIHQoKQoKY2VudGVyc19jc2VyX0UgPC0gY2VudGVyc19jc2VyX0VbMTpuX2luZEUsIF0KCmhpc3QoY2VudGVyc19jc2VyX0UpICMgYWN0aXZpdHkgY2VudGVycyBmb3IgaW5kaXZpZHVhbHMgY2F1Z2h0IGF0IGxlYXN0IG9uY2UKCgojIyMjIE9idGFpbmluZyBEZW5zaXR5IGFuZCBOCgpkZW5zaXRpZXNfY3Nlcl9FIDwtIGRmX21jbWNfY3Nlcl9FJGRlbnNpdHlbNTAxOjEwMDBdICNkZW5zaXRpZXMgcGVyIGl0ZXJhdGlvbiBhZnRlciBidXJuaW4Kc3RkZXJyb3JfY3Nlcl9FIDwtIHN0ZC5lcnJvcihhcy52ZWN0b3IoZGVuc2l0aWVzX2NzZXJfRSkpCm1lYW5fZGVuc2l0eV9jc2VyX0UgPC0gbWVhbihkZW5zaXRpZXNfY3Nlcl9FKSAjIE1lYW4gIyB0dXJ0bGVzIHBlciAxMDAgbWV0ZXJzCgplc3RpbWF0ZWRfTl9jc2VyX0UgPC0gZGZfbWNtY19jc2VyX0UkTls1MDE6MTAwMF0KbWVhbl9lc3RfTl9jc2VyX0UgPC0gbWVhbihlc3RpbWF0ZWRfTl9jc2VyX0UpICMgTWVhbiAjIHR1cnRsZXMgb3ZlciB0cmFwIGFyZWEgKCsgYm91bmRhcnkpCm1lYW5fZXN0X05fY3Nlcl9FL21lYW5fZGVuc2l0eV9jc2VyX0UKCgojIyMjIyMjIFNpdGUgRiwgQ1NFUiAjIyMjIyMjIwoKbG9hZCgiUmVzdWx0cy9KQUdTL2NzZXJfRl9tY21jLlJEYXRhIikKCiMgY29tYmluZSBjaGFpbnMKZGZfbWNtY19jc2VyX0YgPC0gYXMuZGF0YS5mcmFtZShjc2VyX0ZfbWNtY1tbMV1dKQpmb3IoaSBpbiAyOmxlbmd0aChjc2VyX0ZfbWNtYykpIHsKICBkZl9tY21jX2NzZXJfRiA8LSBiaW5kX3Jvd3MoZGZfbWNtY19jc2VyX0YsIGFzLmRhdGEuZnJhbWUoY3Nlcl9GX21jbWNbW2ldXSkpCn0KCiMgT2J0YWluIEFjdGl2aXR5IENlbnRlcnMKY2VudGVyc19jc2VyX0YgPC0gZGZfbWNtY19jc2VyX0YgJT4lCiAgc2VsZWN0KHN0YXJ0c193aXRoKCJzWyIpKSAlPiUKICBzdW1tYXJpc2VfYWxsKG1lYW4pICU+JQogIHQoKQoKY2VudGVyc19jc2VyX0YgPC0gY2VudGVyc19jc2VyX0ZbMTpuX2luZEYsIF0KCmhpc3QoY2VudGVyc19jc2VyX0YpICMgYWN0aXZpdHkgY2VudGVycyBmb3IgaW5kaXZpZHVhbHMgY2F1Z2h0IGF0IGxlYXN0IG9uY2UKCgojIyMjIE9idGFpbmluZyBEZW5zaXR5IGFuZCBOCgpkZW5zaXRpZXNfY3Nlcl9GIDwtIGRmX21jbWNfY3Nlcl9GJGRlbnNpdHlbNTAxOjEwMDBdICNkZW5zaXRpZXMgcGVyIGl0ZXJhdGlvbiBhZnRlciBidXJuaW4Kc3RkZXJyb3JfY3Nlcl9GIDwtIHN0ZC5lcnJvcihhcy52ZWN0b3IoZGVuc2l0aWVzX2NzZXJfRikpCm1lYW5fZGVuc2l0eV9jc2VyX0YgPC0gbWVhbihkZW5zaXRpZXNfY3Nlcl9GKSAjIE1lYW4gIyB0dXJ0bGVzIHBlciAxMDAgbWV0ZXJzCgplc3RpbWF0ZWRfTl9jc2VyX0YgPC0gZGZfbWNtY19jc2VyX0YkTls1MDE6MTAwMF0KbWVhbl9lc3RfTl9jc2VyX0YgPC0gbWVhbihlc3RpbWF0ZWRfTl9jc2VyX0YpICMgTWVhbiAjIHR1cnRsZXMgb3ZlciB0cmFwIGFyZWEgKCsgYm91bmRhcnkpCm1lYW5fZXN0X05fY3Nlcl9GL21lYW5fZGVuc2l0eV9jc2VyX0YKCgojIyMjIyMjIFNpdGUgRiwgQ1BJQyAjIyMjIyMjIwoKbG9hZCgiUmVzdWx0cy9KQUdTL2NwaWNfRl9tY21jLlJEYXRhIikKCiMgY29tYmluZSBjaGFpbnMKZGZfbWNtY19jcGljX0YgPC0gYXMuZGF0YS5mcmFtZShjcGljX0ZfbWNtY1tbMV1dKQpmb3IoaSBpbiAyOmxlbmd0aChjcGljX0ZfbWNtYykpIHsKICBkZl9tY21jX2NwaWNfRiA8LSBiaW5kX3Jvd3MoZGZfbWNtY19jcGljX0YsIGFzLmRhdGEuZnJhbWUoY3BpY19GX21jbWNbW2ldXSkpCn0KCiMgT2J0YWluIEFjdGl2aXR5IENlbnRlcnMKY2VudGVyc19jcGljX0YgPC0gZGZfbWNtY19jcGljX0YgJT4lCiAgc2VsZWN0KHN0YXJ0c193aXRoKCJzWyIpKSAlPiUKICBzdW1tYXJpc2VfYWxsKG1lYW4pICU+JQogIHQoKQoKY2VudGVyc19jcGljX0YgPC0gY2VudGVyc19jcGljX0ZbMTpuX2luZEYsIF0KCmhpc3QoY2VudGVyc19jcGljX0YpICMgYWN0aXZpdHkgY2VudGVycyBmb3IgaW5kaXZpZHVhbHMgY2F1Z2h0IGF0IGxlYXN0IG9uY2UKCgojIyMjIE9idGFpbmluZyBEZW5zaXR5IGFuZCBOCgpkZW5zaXRpZXNfY3BpY19GIDwtIGRmX21jbWNfY3BpY19GJGRlbnNpdHlbNTAxOjEwMDBdICNkZW5zaXRpZXMgcGVyIGl0ZXJhdGlvbiBhZnRlciBidXJuaW4Kc3RkZXJyb3JfY3BpY19GIDwtIHN0ZC5lcnJvcihhcy52ZWN0b3IoZGVuc2l0aWVzX2NwaWNfRikpCm1lYW5fZGVuc2l0eV9jcGljX0YgPC0gbWVhbihkZW5zaXRpZXNfY3BpY19GKSAjIE1lYW4gIyB0dXJ0bGVzIHBlciAxMDAgbWV0ZXJzCgplc3RpbWF0ZWRfTl9jcGljX0YgPC0gZGZfbWNtY19jcGljX0YkTls1MDE6MTAwMF0KbWVhbl9lc3RfTl9jcGljX0YgPC0gbWVhbihlc3RpbWF0ZWRfTl9jcGljX0YpICMgTWVhbiAjIHR1cnRsZXMgb3ZlciB0cmFwIGFyZWEgKCsgYm91bmRhcnkpCm1lYW5fZXN0X05fY3BpY19GL21lYW5fZGVuc2l0eV9jcGljX0YKCgojIyMjIyMjIFNpdGUgRywgQ1BJQyAjIyMjIyMjIwoKbG9hZCgiUmVzdWx0cy9KQUdTL2NwaWNfR19tY21jLlJEYXRhIikKCiMgY29tYmluZSBjaGFpbnMKZGZfbWNtY19jcGljX0cgPC0gYXMuZGF0YS5mcmFtZShjcGljX0dfbWNtY1tbMV1dKQpmb3IoaSBpbiAyOmxlbmd0aChjcGljX0dfbWNtYykpIHsKICBkZl9tY21jX2NwaWNfRyA8LSBiaW5kX3Jvd3MoZGZfbWNtY19jcGljX0csIGFzLmRhdGEuZnJhbWUoY3BpY19HX21jbWNbW2ldXSkpCn0KCiMgT2J0YWluIEFjdGl2aXR5IENlbnRlcnMKY2VudGVyc19jcGljX0cgPC0gZGZfbWNtY19jcGljX0cgJT4lCiAgc2VsZWN0KHN0YXJ0c193aXRoKCJzWyIpKSAlPiUKICBzdW1tYXJpc2VfYWxsKG1lYW4pICU+JQogIHQoKQoKY2VudGVyc19jcGljX0cgPC0gY2VudGVyc19jcGljX0dbMTpuX2luZEcsIF0KCmhpc3QoY2VudGVyc19jcGljX0cpICMgYWN0aXZpdHkgY2VudGVycyBmb3IgaW5kaXZpZHVhbHMgY2F1Z2h0IGF0IGxlYXN0IG9uY2UKCgojIyMjIE9idGFpbmluZyBEZW5zaXR5IGFuZCBOCgpkZW5zaXRpZXNfY3BpY19HIDwtIGRmX21jbWNfY3BpY19HJGRlbnNpdHlbNTAxOjEwMDBdICNkZW5zaXRpZXMgcGVyIGl0ZXJhdGlvbiBhZnRlciBidXJuaW4Kc3RkZXJyb3JfY3BpY19HIDwtIHN0ZC5lcnJvcihhcy52ZWN0b3IoZGVuc2l0aWVzX2NwaWNfRykpCm1lYW5fZGVuc2l0eV9jcGljX0cgPC0gbWVhbihkZW5zaXRpZXNfY3BpY19HKSAjIE1lYW4gIyB0dXJ0bGVzIHBlciAxMDAgbWV0ZXJzCgplc3RpbWF0ZWRfTl9jcGljX0cgPC0gZGZfbWNtY19jcGljX0ckTls1MDE6MTAwMF0KbWVhbl9lc3RfTl9jcGljX0cgPC0gbWVhbihlc3RpbWF0ZWRfTl9jcGljX0cpICMgTWVhbiAjIHR1cnRsZXMgb3ZlciB0cmFwIGFyZWEgKCsgYm91bmRhcnkpCm1lYW5fZXN0X05fY3BpY19HL21lYW5fZGVuc2l0eV9jcGljX0cKCgojIyMjIyMjIFNpdGUgRywgQ1NFUiAjIyMjIyMjIwoKbG9hZCgiUmVzdWx0cy9KQUdTL2NzZXJfR19tY21jLlJEYXRhIikKCiMgY29tYmluZSBjaGFpbnMKZGZfbWNtY19jc2VyX0cgPC0gYXMuZGF0YS5mcmFtZShjc2VyX0dfbWNtY1tbMV1dKQpmb3IoaSBpbiAyOmxlbmd0aChjc2VyX0dfbWNtYykpIHsKICBkZl9tY21jX2NzZXJfRyA8LSBiaW5kX3Jvd3MoZGZfbWNtY19jc2VyX0csIGFzLmRhdGEuZnJhbWUoY3Nlcl9HX21jbWNbW2ldXSkpCn0KCiMgT2J0YWluIEFjdGl2aXR5IENlbnRlcnMKY2VudGVyc19jc2VyX0cgPC0gZGZfbWNtY19jc2VyX0cgJT4lCiAgc2VsZWN0KHN0YXJ0c193aXRoKCJzWyIpKSAlPiUKICBzdW1tYXJpc2VfYWxsKG1lYW4pICU+JQogIHQoKQoKY2VudGVyc19jc2VyX0cgPC0gY2VudGVyc19jc2VyX0dbMTpuX2luZEcsIF0KCmhpc3QoY2VudGVyc19jc2VyX0cpICMgYWN0aXZpdHkgY2VudGVycyBmb3IgaW5kaXZpZHVhbHMgY2F1Z2h0IGF0IGxlYXN0IG9uY2UKCgojIyMjIE9idGFpbmluZyBEZW5zaXR5IGFuZCBOCgpkZW5zaXRpZXNfY3Nlcl9HIDwtIGRmX21jbWNfY3Nlcl9HJGRlbnNpdHlbNTAxOjEwMDBdICNkZW5zaXRpZXMgcGVyIGl0ZXJhdGlvbiBhZnRlciBidXJuaW4Kc3RkZXJyb3JfY3Nlcl9HIDwtIHN0ZC5lcnJvcihhcy52ZWN0b3IoZGVuc2l0aWVzX2NzZXJfRykpCm1lYW5fZGVuc2l0eV9jc2VyX0cgPC0gbWVhbihkZW5zaXRpZXNfY3Nlcl9HKSAjIE1lYW4gIyB0dXJ0bGVzIHBlciAxMDAgbWV0ZXJzCgplc3RpbWF0ZWRfTl9jc2VyX0cgPC0gZGZfbWNtY19jc2VyX0ckTls1MDE6MTAwMF0KbWVhbl9lc3RfTl9jc2VyX0cgPC0gbWVhbihlc3RpbWF0ZWRfTl9jc2VyX0cpICMgTWVhbiAjIHR1cnRsZXMgb3ZlciB0cmFwIGFyZWEgKCsgYm91bmRhcnkpCm1lYW5fZXN0X05fY3Nlcl9HL21lYW5fZGVuc2l0eV9jc2VyX0cKCgojIyMjIyMjIFNpdGUgSiwgQ1BJQyAjIyMjIyMjIwoKbG9hZCgiUmVzdWx0cy9KQUdTL2NwaWNfSl9tY21jLlJEYXRhIikKCiMgY29tYmluZSBjaGFpbnMKZGZfbWNtY19jcGljX0ogPC0gYXMuZGF0YS5mcmFtZShjcGljX0pfbWNtY1tbMV1dKQpmb3IoaSBpbiAyOmxlbmd0aChjcGljX0pfbWNtYykpIHsKICBkZl9tY21jX2NwaWNfSiA8LSBiaW5kX3Jvd3MoZGZfbWNtY19jcGljX0osIGFzLmRhdGEuZnJhbWUoY3BpY19KX21jbWNbW2ldXSkpCn0KCiMgT2J0YWluIEFjdGl2aXR5IENlbnRlcnMKY2VudGVyc19jcGljX0ogPC0gZGZfbWNtY19jcGljX0ogJT4lCiAgc2VsZWN0KHN0YXJ0c193aXRoKCJzWyIpKSAlPiUKICBzdW1tYXJpc2VfYWxsKG1lYW4pICU+JQogIHQoKQoKY2VudGVyc19jcGljX0ogPC0gY2VudGVyc19jcGljX0pbMTpuX2luZEosIF0KCmhpc3QoY2VudGVyc19jcGljX0opICMgYWN0aXZpdHkgY2VudGVycyBmb3IgaW5kaXZpZHVhbHMgY2F1Z2h0IGF0IGxlYXN0IG9uY2UKCgojIyMjIE9idGFpbmluZyBEZW5zaXR5IGFuZCBOCgpkZW5zaXRpZXNfY3BpY19KIDwtIGRmX21jbWNfY3BpY19KJGRlbnNpdHlbNTAxOjEwMDBdICNkZW5zaXRpZXMgcGVyIGl0ZXJhdGlvbiBhZnRlciBidXJuaW4Kc3RkZXJyb3JfY3BpY19KIDwtIHN0ZC5lcnJvcihhcy52ZWN0b3IoZGVuc2l0aWVzX2NwaWNfSikpCm1lYW5fZGVuc2l0eV9jcGljX0ogPC0gbWVhbihkZW5zaXRpZXNfY3BpY19KKSAjIE1lYW4gIyB0dXJ0bGVzIHBlciAxMDAgbWV0ZXJzCgplc3RpbWF0ZWRfTl9jcGljX0ogPC0gZGZfbWNtY19jcGljX0okTls1MDE6MTAwMF0KbWVhbl9lc3RfTl9jcGljX0ogPC0gbWVhbihlc3RpbWF0ZWRfTl9jcGljX0opICMgTWVhbiAjIHR1cnRsZXMgb3ZlciB0cmFwIGFyZWEgKCsgYm91bmRhcnkpCm1lYW5fZXN0X05fY3BpY19KL21lYW5fZGVuc2l0eV9jcGljX0oKCgojIyMjIyMjIFNpdGUgSiwgQ1NFUiAjIyMjIyMjIwoKbG9hZCgiUmVzdWx0cy9KQUdTL2NzZXJfSl9tY21jLlJEYXRhIikKCiMgY29tYmluZSBjaGFpbnMKZGZfbWNtY19jc2VyX0ogPC0gYXMuZGF0YS5mcmFtZShjc2VyX0pfbWNtY1tbMV1dKQpmb3IoaSBpbiAyOmxlbmd0aChjc2VyX0pfbWNtYykpIHsKICBkZl9tY21jX2NzZXJfSiA8LSBiaW5kX3Jvd3MoZGZfbWNtY19jc2VyX0osIGFzLmRhdGEuZnJhbWUoY3Nlcl9KX21jbWNbW2ldXSkpCn0KCiMgT2J0YWluIEFjdGl2aXR5IENlbnRlcnMKY2VudGVyc19jc2VyX0ogPC0gZGZfbWNtY19jc2VyX0ogJT4lCiAgc2VsZWN0KHN0YXJ0c193aXRoKCJzWyIpKSAlPiUKICBzdW1tYXJpc2VfYWxsKG1lYW4pICU+JQogIHQoKQoKY2VudGVyc19jc2VyX0ogPC0gY2VudGVyc19jc2VyX0pbMTpuX2luZEosIF0KCmhpc3QoY2VudGVyc19jc2VyX0opICMgYWN0aXZpdHkgY2VudGVycyBmb3IgaW5kaXZpZHVhbHMgY2F1Z2h0IGF0IGxlYXN0IG9uY2UKCgojIyMjIE9idGFpbmluZyBEZW5zaXR5IGFuZCBOCgpkZW5zaXRpZXNfY3Nlcl9KIDwtIGRmX21jbWNfY3Nlcl9KJGRlbnNpdHlbNTAxOjEwMDBdICNkZW5zaXRpZXMgcGVyIGl0ZXJhdGlvbiBhZnRlciBidXJuaW4Kc3RkZXJyb3JfY3Nlcl9KIDwtIHN0ZC5lcnJvcihhcy52ZWN0b3IoZGVuc2l0aWVzX2NzZXJfSikpCm1lYW5fZGVuc2l0eV9jc2VyX0ogPC0gbWVhbihkZW5zaXRpZXNfY3Nlcl9KKSAjIE1lYW4gIyB0dXJ0bGVzIHBlciAxMDAgbWV0ZXJzCgplc3RpbWF0ZWRfTl9jc2VyX0ogPC0gZGZfbWNtY19jc2VyX0okTls1MDE6MTAwMF0KbWVhbl9lc3RfTl9jc2VyX0ogPC0gbWVhbihlc3RpbWF0ZWRfTl9jc2VyX0opICMgTWVhbiAjIHR1cnRsZXMgb3ZlciB0cmFwIGFyZWEgKCsgYm91bmRhcnkpCm1lYW5fZXN0X05fY3Nlcl9KL21lYW5fZGVuc2l0eV9jc2VyX0oKCgojIyMjIyMjIFNpdGUgSywgQ1BJQyAjIyMjIyMjIwoKbG9hZCgiUmVzdWx0cy9KQUdTL2NwaWNfS19tY21jLlJEYXRhIikKCiMgY29tYmluZSBjaGFpbnMKZGZfbWNtY19jcGljX0sgPC0gYXMuZGF0YS5mcmFtZShjcGljX0tfbWNtY1tbMV1dKQpmb3IoaSBpbiAyOmxlbmd0aChjcGljX0tfbWNtYykpIHsKICBkZl9tY21jX2NwaWNfSyA8LSBiaW5kX3Jvd3MoZGZfbWNtY19jcGljX0ssIGFzLmRhdGEuZnJhbWUoY3BpY19LX21jbWNbW2ldXSkpCn0KCiMgT2J0YWluIEFjdGl2aXR5IENlbnRlcnMKY2VudGVyc19jcGljX0sgPC0gZGZfbWNtY19jcGljX0sgJT4lCiAgc2VsZWN0KHN0YXJ0c193aXRoKCJzWyIpKSAlPiUKICBzdW1tYXJpc2VfYWxsKG1lYW4pICU+JQogIHQoKQoKY2VudGVyc19jcGljX0sgPC0gY2VudGVyc19jcGljX0tbMTpuX2luZEssIF0KCmhpc3QoY2VudGVyc19jcGljX0spICMgYWN0aXZpdHkgY2VudGVycyBmb3IgaW5kaXZpZHVhbHMgY2F1Z2h0IGF0IGxlYXN0IG9uY2UKCgojIyMjIE9idGFpbmluZyBEZW5zaXR5IGFuZCBOCgpkZW5zaXRpZXNfY3BpY19LIDwtIGRmX21jbWNfY3BpY19LJGRlbnNpdHlbNTAxOjEwMDBdICNkZW5zaXRpZXMgcGVyIGl0ZXJhdGlvbiBhZnRlciBidXJuaW4Kc3RkZXJyb3JfY3BpY19LIDwtIHN0ZC5lcnJvcihhcy52ZWN0b3IoZGVuc2l0aWVzX2NwaWNfSykpCm1lYW5fZGVuc2l0eV9jcGljX0sgPC0gbWVhbihkZW5zaXRpZXNfY3BpY19LKSAjIE1lYW4gIyB0dXJ0bGVzIHBlciAxMDAgbWV0ZXJzCgplc3RpbWF0ZWRfTl9jcGljX0sgPC0gZGZfbWNtY19jcGljX0skTls1MDE6MTAwMF0KbWVhbl9lc3RfTl9jcGljX0sgPC0gbWVhbihlc3RpbWF0ZWRfTl9jcGljX0spICMgTWVhbiAjIHR1cnRsZXMgb3ZlciB0cmFwIGFyZWEgKCsgYm91bmRhcnkpCm1lYW5fZXN0X05fY3BpY19LL21lYW5fZGVuc2l0eV9jcGljX0sKCgojIyMjIyMjIFNpdGUgTCwgQ1BJQyAjIyMjIyMjIwoKbG9hZCgiUmVzdWx0cy9KQUdTL2NwaWNfTF9tY21jLlJEYXRhIikKCiMgY29tYmluZSBjaGFpbnMKZGZfbWNtY19jcGljX0wgPC0gYXMuZGF0YS5mcmFtZShjcGljX0xfbWNtY1tbMV1dKQpmb3IoaSBpbiAyOmxlbmd0aChjcGljX0xfbWNtYykpIHsKICBkZl9tY21jX2NwaWNfTCA8LSBiaW5kX3Jvd3MoZGZfbWNtY19jcGljX0wsIGFzLmRhdGEuZnJhbWUoY3BpY19MX21jbWNbW2ldXSkpCn0KCiMgT2J0YWluIEFjdGl2aXR5IENlbnRlcnMKY2VudGVyc19jcGljX0wgPC0gZGZfbWNtY19jcGljX0wgJT4lCiAgc2VsZWN0KHN0YXJ0c193aXRoKCJzWyIpKSAlPiUKICBzdW1tYXJpc2VfYWxsKG1lYW4pICU+JQogIHQoKQoKY2VudGVyc19jcGljX0wgPC0gY2VudGVyc19jcGljX0xbMTpuX2luZEwsIF0KCmhpc3QoY2VudGVyc19jcGljX0wpICMgYWN0aXZpdHkgY2VudGVycyBmb3IgaW5kaXZpZHVhbHMgY2F1Z2h0IGF0IGxlYXN0IG9uY2UKCgojIyMjIE9idGFpbmluZyBEZW5zaXR5IGFuZCBOCgpkZW5zaXRpZXNfY3BpY19MIDwtIGRmX21jbWNfY3BpY19MJGRlbnNpdHlbNTAxOjEwMDBdICNkZW5zaXRpZXMgcGVyIGl0ZXJhdGlvbiBhZnRlciBidXJuaW4Kc3RkZXJyb3JfY3BpY19MIDwtIHN0ZC5lcnJvcihhcy52ZWN0b3IoZGVuc2l0aWVzX2NwaWNfTCkpCm1lYW5fZGVuc2l0eV9jcGljX0wgPC0gbWVhbihkZW5zaXRpZXNfY3BpY19MKSAjIE1lYW4gIyB0dXJ0bGVzIHBlciAxMDAgbWV0ZXJzCgplc3RpbWF0ZWRfTl9jcGljX0wgPC0gZGZfbWNtY19jcGljX0wkTls1MDE6MTAwMF0KbWVhbl9lc3RfTl9jcGljX0wgPC0gbWVhbihlc3RpbWF0ZWRfTl9jcGljX0wpICMgTWVhbiAjIHR1cnRsZXMgb3ZlciB0cmFwIGFyZWEgKCsgYm91bmRhcnkpCm1lYW5fZXN0X05fY3BpY19ML21lYW5fZGVuc2l0eV9jcGljX0wKCgojIyMjIyMjIFNpdGUgTSwgQ1BJQyAjIyMjIyMjIwoKbG9hZCgiUmVzdWx0cy9KQUdTL2NwaWNfTV9tY21jLlJEYXRhIikKCiMgY29tYmluZSBjaGFpbnMKZGZfbWNtY19jcGljX00gPC0gYXMuZGF0YS5mcmFtZShjcGljX01fbWNtY1tbMV1dKQpmb3IoaSBpbiAyOmxlbmd0aChjcGljX01fbWNtYykpIHsKICBkZl9tY21jX2NwaWNfTSA8LSBiaW5kX3Jvd3MoZGZfbWNtY19jcGljX00sIGFzLmRhdGEuZnJhbWUoY3BpY19NX21jbWNbW2ldXSkpCn0KCiMgT2J0YWluIEFjdGl2aXR5IENlbnRlcnMKY2VudGVyc19jcGljX00gPC0gZGZfbWNtY19jcGljX00gJT4lCiAgc2VsZWN0KHN0YXJ0c193aXRoKCJzWyIpKSAlPiUKICBzdW1tYXJpc2VfYWxsKG1lYW4pICU+JQogIHQoKQoKY2VudGVyc19jcGljX00gPC0gY2VudGVyc19jcGljX01bMTpuX2luZE0sIF0KCmhpc3QoY2VudGVyc19jcGljX00pICMgYWN0aXZpdHkgY2VudGVycyBmb3IgaW5kaXZpZHVhbHMgY2F1Z2h0IGF0IGxlYXN0IG9uY2UKCgojIyMjIE9idGFpbmluZyBEZW5zaXR5IGFuZCBOCgpkZW5zaXRpZXNfY3BpY19NIDwtIGRmX21jbWNfY3BpY19NJGRlbnNpdHlbNTAxOjEwMDBdICNkZW5zaXRpZXMgcGVyIGl0ZXJhdGlvbiBhZnRlciBidXJuaW4Kc3RkZXJyb3JfY3BpY19NIDwtIHN0ZC5lcnJvcihhcy52ZWN0b3IoZGVuc2l0aWVzX2NwaWNfTSkpCm1lYW5fZGVuc2l0eV9jcGljX00gPC0gbWVhbihkZW5zaXRpZXNfY3BpY19NKSAjIE1lYW4gIyB0dXJ0bGVzIHBlciAxMDAgbWV0ZXJzCgplc3RpbWF0ZWRfTl9jcGljX00gPC0gZGZfbWNtY19jcGljX00kTls1MDE6MTAwMF0KbWVhbl9lc3RfTl9jcGljX00gPC0gbWVhbihlc3RpbWF0ZWRfTl9jcGljX00pICMgTWVhbiAjIHR1cnRsZXMgb3ZlciB0cmFwIGFyZWEgKCsgYm91bmRhcnkpCm1lYW5fZXN0X05fY3BpY19NL21lYW5fZGVuc2l0eV9jcGljX00KCgojIyMjIyMjIFNpdGUgTSwgQ1NFUiAjIyMjIyMjIwoKbG9hZCgiUmVzdWx0cy9KQUdTL2NzZXJfTV9tY21jLlJEYXRhIikKCiMgY29tYmluZSBjaGFpbnMKZGZfbWNtY19jc2VyX00gPC0gYXMuZGF0YS5mcmFtZShjc2VyX01fbWNtY1tbMV1dKQpmb3IoaSBpbiAyOmxlbmd0aChjc2VyX01fbWNtYykpIHsKICBkZl9tY21jX2NzZXJfTSA8LSBiaW5kX3Jvd3MoZGZfbWNtY19jc2VyX00sIGFzLmRhdGEuZnJhbWUoY3Nlcl9NX21jbWNbW2ldXSkpCn0KCiMgT2J0YWluIEFjdGl2aXR5IENlbnRlcnMKY2VudGVyc19jc2VyX00gPC0gZGZfbWNtY19jc2VyX00gJT4lCiAgc2VsZWN0KHN0YXJ0c193aXRoKCJzWyIpKSAlPiUKICBzdW1tYXJpc2VfYWxsKG1lYW4pICU+JQogIHQoKQoKY2VudGVyc19jc2VyX00gPC0gY2VudGVyc19jc2VyX01bMTpuX2luZE0sIF0KCmhpc3QoY2VudGVyc19jc2VyX00pICMgYWN0aXZpdHkgY2VudGVycyBmb3IgaW5kaXZpZHVhbHMgY2F1Z2h0IGF0IGxlYXN0IG9uY2UKCgojIyMjIE9idGFpbmluZyBEZW5zaXR5IGFuZCBOCgpkZW5zaXRpZXNfY3Nlcl9NIDwtIGRmX21jbWNfY3Nlcl9NJGRlbnNpdHlbNTAxOjEwMDBdICNkZW5zaXRpZXMgcGVyIGl0ZXJhdGlvbiBhZnRlciBidXJuaW4Kc3RkZXJyb3JfY3Nlcl9NIDwtIHN0ZC5lcnJvcihhcy52ZWN0b3IoZGVuc2l0aWVzX2NzZXJfTSkpCm1lYW5fZGVuc2l0eV9jc2VyX00gPC0gbWVhbihkZW5zaXRpZXNfY3Nlcl9NKSAjIE1lYW4gIyB0dXJ0bGVzIHBlciAxMDAgbWV0ZXJzCgplc3RpbWF0ZWRfTl9jc2VyX00gPC0gZGZfbWNtY19jc2VyX00kTls1MDE6MTAwMF0KbWVhbl9lc3RfTl9jc2VyX00gPC0gbWVhbihlc3RpbWF0ZWRfTl9jc2VyX00pICMgTWVhbiAjIHR1cnRsZXMgb3ZlciB0cmFwIGFyZWEgKCsgYm91bmRhcnkpCm1lYW5fZXN0X05fY3Nlcl9NL21lYW5fZGVuc2l0eV9jc2VyX00KCgojIyMjIyMjIFNpdGUgTiwgQ1BJQyAjIyMjIyMjIwoKbG9hZCgiUmVzdWx0cy9KQUdTL2NwaWNfTl9tY21jLlJEYXRhIikKCiMgY29tYmluZSBjaGFpbnMKZGZfbWNtY19jcGljX04gPC0gYXMuZGF0YS5mcmFtZShjcGljX05fbWNtY1tbMV1dKQpmb3IoaSBpbiAyOmxlbmd0aChjcGljX05fbWNtYykpIHsKICBkZl9tY21jX2NwaWNfTiA8LSBiaW5kX3Jvd3MoZGZfbWNtY19jcGljX04sIGFzLmRhdGEuZnJhbWUoY3BpY19OX21jbWNbW2ldXSkpCn0KCiMgT2J0YWluIEFjdGl2aXR5IENlbnRlcnMKY2VudGVyc19jcGljX04gPC0gZGZfbWNtY19jcGljX04gJT4lCiAgc2VsZWN0KHN0YXJ0c193aXRoKCJzWyIpKSAlPiUKICBzdW1tYXJpc2VfYWxsKG1lYW4pICU+JQogIHQoKQoKY2VudGVyc19jcGljX04gPC0gY2VudGVyc19jcGljX05bMTpuX2luZE4sIF0KCmhpc3QoY2VudGVyc19jcGljX04pICMgYWN0aXZpdHkgY2VudGVycyBmb3IgaW5kaXZpZHVhbHMgY2F1Z2h0IGF0IGxlYXN0IG9uY2UKCiMjIyMgT2J0YWluaW5nIERlbnNpdHkgYW5kIE4KCmRlbnNpdGllc19jcGljX04gPC0gZGZfbWNtY19jcGljX04kZGVuc2l0eVs1MDE6MTAwMF0gI2RlbnNpdGllcyBwZXIgaXRlcmF0aW9uIGFmdGVyIGJ1cm5pbgpzdGRlcnJvcl9jcGljX04gPC0gc3RkLmVycm9yKGFzLnZlY3RvcihkZW5zaXRpZXNfY3BpY19OKSkKbWVhbl9kZW5zaXR5X2NwaWNfTiA8LSBtZWFuKGRlbnNpdGllc19jcGljX04pICMgTWVhbiAjIHR1cnRsZXMgcGVyIDEwMCBtZXRlcnMKCmVzdGltYXRlZF9OX2NwaWNfTiA8LSBkZl9tY21jX2NwaWNfTiROWzUwMToxMDAwXQptZWFuX2VzdF9OX2NwaWNfTiA8LSBtZWFuKGVzdGltYXRlZF9OX2NwaWNfTikgIyBNZWFuICMgdHVydGxlcyBvdmVyIHRyYXAgYXJlYSAoKyBib3VuZGFyeSkKbWVhbl9lc3RfTl9jcGljX04vbWVhbl9kZW5zaXR5X2NwaWNfTgoKCiMjIyMjIyMgU2l0ZSBOLCBDU0VSICMjIyMjIyMjCgpsb2FkKCJSZXN1bHRzL0pBR1MvY3Nlcl9OX21jbWMuUkRhdGEiKQoKIyBjb21iaW5lIGNoYWlucwpkZl9tY21jX2NzZXJfTiA8LSBhcy5kYXRhLmZyYW1lKGNzZXJfTl9tY21jW1sxXV0pCmZvcihpIGluIDI6bGVuZ3RoKGNzZXJfTl9tY21jKSkgewogIGRmX21jbWNfY3Nlcl9OIDwtIGJpbmRfcm93cyhkZl9tY21jX2NzZXJfTiwgYXMuZGF0YS5mcmFtZShjc2VyX05fbWNtY1tbaV1dKSkKfQoKIyBPYnRhaW4gQWN0aXZpdHkgQ2VudGVycwpjZW50ZXJzX2NzZXJfTiA8LSBkZl9tY21jX2NzZXJfTiAlPiUKICBzZWxlY3Qoc3RhcnRzX3dpdGgoInNbIikpICU+JQogIHN1bW1hcmlzZV9hbGwobWVhbikgJT4lCiAgdCgpCgpjZW50ZXJzX2NzZXJfTiA8LSBjZW50ZXJzX2NzZXJfTlsxOm5faW5kTiwgXQoKaGlzdChjZW50ZXJzX2NzZXJfTikgIyBhY3Rpdml0eSBjZW50ZXJzIGZvciBpbmRpdmlkdWFscyBjYXVnaHQgYXQgbGVhc3Qgb25jZQoKIyMjIyBPYnRhaW5pbmcgRGVuc2l0eSBhbmQgTgoKZGVuc2l0aWVzX2NzZXJfTiA8LSBkZl9tY21jX2NzZXJfTiRkZW5zaXR5WzUwMToxMDAwXSAjZGVuc2l0aWVzIHBlciBpdGVyYXRpb24gYWZ0ZXIgYnVybmluCnN0ZGVycm9yX2NzZXJfTiA8LSBzdGQuZXJyb3IoYXMudmVjdG9yKGRlbnNpdGllc19jc2VyX04pKQptZWFuX2RlbnNpdHlfY3Nlcl9OIDwtIG1lYW4oZGVuc2l0aWVzX2NzZXJfTikgIyBNZWFuICMgdHVydGxlcyBwZXIgMTAwIG1ldGVycwoKZXN0aW1hdGVkX05fY3Nlcl9OIDwtIGRmX21jbWNfY3Nlcl9OJE5bNTAxOjEwMDBdCm1lYW5fZXN0X05fY3Nlcl9OIDwtIG1lYW4oZXN0aW1hdGVkX05fY3Nlcl9OKSAjIE1lYW4gIyB0dXJ0bGVzIG92ZXIgdHJhcCBhcmVhICgrIGJvdW5kYXJ5KQptZWFuX2VzdF9OX2NzZXJfTi9tZWFuX2RlbnNpdHlfY3Nlcl9OCgoKIyMjIyMjIyBTaXRlIE8sIENQSUMgIyMjIyMjIyMKCmxvYWQoIlJlc3VsdHMvSkFHUy9jcGljX09fbWNtYy5SRGF0YSIpCgojIGNvbWJpbmUgY2hhaW5zCmRmX21jbWNfY3BpY19PIDwtIGFzLmRhdGEuZnJhbWUoY3BpY19PX21jbWNbWzFdXSkKZm9yKGkgaW4gMjpsZW5ndGgoY3BpY19PX21jbWMpKSB7CiAgZGZfbWNtY19jcGljX08gPC0gYmluZF9yb3dzKGRmX21jbWNfY3BpY19PLCBhcy5kYXRhLmZyYW1lKGNwaWNfT19tY21jW1tpXV0pKQp9CgojIE9idGFpbiBBY3Rpdml0eSBDZW50ZXJzCmNlbnRlcnNfY3BpY19PIDwtIGRmX21jbWNfY3BpY19PICU+JQogIHNlbGVjdChzdGFydHNfd2l0aCgic1siKSkgJT4lCiAgc3VtbWFyaXNlX2FsbChtZWFuKSAlPiUKICB0KCkKCmNlbnRlcnNfY3BpY19PIDwtIGNlbnRlcnNfY3BpY19PWzE6bl9pbmRPLCBdCgpoaXN0KGNlbnRlcnNfY3BpY19PKSAjIGFjdGl2aXR5IGNlbnRlcnMgZm9yIGluZGl2aWR1YWxzIGNhdWdodCBhdCBsZWFzdCBvbmNlCgojIyMjIE9idGFpbmluZyBEZW5zaXR5IGFuZCBOCgpkZW5zaXRpZXNfY3BpY19PIDwtIGRmX21jbWNfY3BpY19PJGRlbnNpdHlbNTAxOjEwMDBdICNkZW5zaXRpZXMgcGVyIGl0ZXJhdGlvbiBhZnRlciBidXJuaW4Kc3RkZXJyb3JfY3BpY19PIDwtIHN0ZC5lcnJvcihhcy52ZWN0b3IoZGVuc2l0aWVzX2NwaWNfTykpCm1lYW5fZGVuc2l0eV9jcGljX08gPC0gbWVhbihkZW5zaXRpZXNfY3BpY19PKSAjIE1lYW4gIyB0dXJ0bGVzIHBlciAxMDAgbWV0ZXJzCgplc3RpbWF0ZWRfTl9jcGljX08gPC0gZGZfbWNtY19jcGljX08kTls1MDE6MTAwMF0KbWVhbl9lc3RfTl9jcGljX08gPC0gbWVhbihlc3RpbWF0ZWRfTl9jcGljX08pICMgTWVhbiAjIHR1cnRsZXMgb3ZlciB0cmFwIGFyZWEgKCsgYm91bmRhcnkpCm1lYW5fZXN0X05fY3BpY19PL21lYW5fZGVuc2l0eV9jcGljX08KCgojIyMjIyMjIFNpdGUgTywgQ1NFUiAjIyMjIyMjIwoKbG9hZCgiUmVzdWx0cy9KQUdTL2NzZXJfT19tY21jLlJEYXRhIikKCiMgY29tYmluZSBjaGFpbnMKZGZfbWNtY19jc2VyX08gPC0gYXMuZGF0YS5mcmFtZShjc2VyX09fbWNtY1tbMV1dKQpmb3IoaSBpbiAyOmxlbmd0aChjc2VyX09fbWNtYykpIHsKICBkZl9tY21jX2NzZXJfTyA8LSBiaW5kX3Jvd3MoZGZfbWNtY19jc2VyX08sIGFzLmRhdGEuZnJhbWUoY3Nlcl9PX21jbWNbW2ldXSkpCn0KCiMgT2J0YWluIEFjdGl2aXR5IENlbnRlcnMKY2VudGVyc19jc2VyX08gPC0gZGZfbWNtY19jc2VyX08gJT4lCiAgc2VsZWN0KHN0YXJ0c193aXRoKCJzWyIpKSAlPiUKICBzdW1tYXJpc2VfYWxsKG1lYW4pICU+JQogIHQoKQoKY2VudGVyc19jc2VyX08gPC0gY2VudGVyc19jc2VyX09bMTpuX2luZE8sIF0KCmhpc3QoY2VudGVyc19jc2VyX08pICMgYWN0aXZpdHkgY2VudGVycyBmb3IgaW5kaXZpZHVhbHMgY2F1Z2h0IGF0IGxlYXN0IG9uY2UKCgojIyMjIE9idGFpbmluZyBEZW5zaXR5IGFuZCBOCgpkZW5zaXRpZXNfY3Nlcl9PIDwtIGRmX21jbWNfY3Nlcl9PJGRlbnNpdHlbNTAxOjEwMDBdICNkZW5zaXRpZXMgcGVyIGl0ZXJhdGlvbiBhZnRlciBidXJuaW4Kc3RkZXJyb3JfY3Nlcl9PIDwtIHN0ZC5lcnJvcihhcy52ZWN0b3IoZGVuc2l0aWVzX2NzZXJfTykpCm1lYW5fZGVuc2l0eV9jc2VyX08gPC0gbWVhbihkZW5zaXRpZXNfY3Nlcl9PKSAjIE1lYW4gIyB0dXJ0bGVzIHBlciAxMDAgbWV0ZXJzCgplc3RpbWF0ZWRfTl9jc2VyX08gPC0gZGZfbWNtY19jc2VyX08kTls1MDE6MTAwMF0KbWVhbl9lc3RfTl9jc2VyX08gPC0gbWVhbihlc3RpbWF0ZWRfTl9jc2VyX08pICMgTWVhbiAjIHR1cnRsZXMgb3ZlciB0cmFwIGFyZWEgKCsgYm91bmRhcnkpCm1lYW5fZXN0X05fY3Nlcl9PL21lYW5fZGVuc2l0eV9jc2VyX08KCmBgYAoKIyMgUGxvdHRpbmcgQ1BJQyBBY3Rpdml0eSBDZW50ZXJzCk9ubHkgQ1BJQyBhY3Rpdml0eSBjZW50ZXJzIHdlcmUgcGxvdHRlZCBhcyBDU0VSIGRlbnNpdGllcyB3ZXJlIHZlcnkgbG93LgpgYGB7ciwgZXZhbCA9IEZBTFNFfQpmaWxlcGF0aHMgPC0gYygiQUNfUGxvdHMyLnBkZiIsIkFDX1Bsb3RzMS5wZGYiKQprbml0cjo6aW5jbHVkZV9ncmFwaGljcyhmaWxlcGF0aHMpCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMgUGxvdHRpbmcgQWN0aXZpdHkgQ2VudGVycyAjIyMjIyMjIyMjIyMjIyMjCiMjIyMgU2VlIGFsbCBwbG90cyBhdCBlbmQhIQoKcGFyKG1mcm93PWMoMywyKSkKcGxvdCh4eS5jb29yZHMoeCA9IGNlbnRlcnNfY3BpY19BW10sIHkgPSByZXAoMCwgMzYpKSwgcGNoID0gIi4iLCBjZXggPSA0LCB4bGFiID0gIlN0YW5kYXJkaXplZCBMb2NhdGlvbiBpbiBTaXRlIiwgeWxhYiA9ICIiLCBjb2wgPSAicmVkIiwgbWFpbiA9ICJDUElDIEFjdGl2aXR5IENlbnRlcnM6IFNpdGUgQSIpCnBsb3QoeHkuY29vcmRzKHggPSBjZW50ZXJzX2NwaWNfQ1tdLCB5ID0gcmVwKDAsIDMwKSksIHBjaCA9ICIuIiwgY2V4ID0gNCwgeGxhYiA9ICJTdGFuZGFyZGl6ZWQgTG9jYXRpb24gaW4gU2l0ZSIsIHlsYWIgPSAiIiwgY29sID0gInJlZCIsIG1haW4gPSAiQ1BJQyBBY3Rpdml0eSBDZW50ZXJzOiBTaXRlIEMiKQpwbG90KHh5LmNvb3Jkcyh4ID0gY2VudGVyc19jcGljX0RbXSwgeSA9IHJlcCgwLCAyMikpLCBwY2ggPSAiLiIsIGNleCA9IDQsIHhsYWIgPSAiU3RhbmRhcmRpemVkIExvY2F0aW9uIGluIFNpdGUiLCB5bGFiID0gIiIsIGNvbCA9ICJyZWQiLCBtYWluID0gIkNQSUMgQWN0aXZpdHkgQ2VudGVyczogU2l0ZSBEIikKcGxvdCh4eS5jb29yZHMoeCA9IGNlbnRlcnNfY3BpY19FW10sIHkgPSByZXAoMCwgNDIpKSwgcGNoID0gIi4iLCBjZXggPSA0LCB4bGFiID0gIlN0YW5kYXJkaXplZCBMb2NhdGlvbiBpbiBTaXRlIiwgeWxhYiA9ICIiLCBjb2wgPSAicmVkIiwgbWFpbiA9ICJDUElDIEFjdGl2aXR5IENlbnRlcnM6IFNpdGUgRSIpCnBsb3QoeHkuY29vcmRzKHggPSBjZW50ZXJzX2NwaWNfRltdLCB5ID0gcmVwKDAsIDEyOCkpLCBwY2ggPSAiLiIsIGNleCA9IDQsIHhsYWIgPSAiU3RhbmRhcmRpemVkIExvY2F0aW9uIGluIFNpdGUiLCB5bGFiID0gIiIsIGNvbCA9ICJyZWQiLCBtYWluID0gIkNQSUMgQWN0aXZpdHkgQ2VudGVyczogU2l0ZSBGIikKcGxvdCh4eS5jb29yZHMoeCA9IGNlbnRlcnNfY3BpY19HW10sIHkgPSByZXAoMCwgNTQpKSwgcGNoID0gIi4iLCBjZXggPSA0LCB4bGFiID0gIlN0YW5kYXJkaXplZCBMb2NhdGlvbiBpbiBTaXRlIiwgeWxhYiA9ICIiLCBjb2wgPSAicmVkIiwgbWFpbiA9ICJDUElDIEFjdGl2aXR5IENlbnRlcnM6IFNpdGUgRyIpCnBsb3QoeHkuY29vcmRzKHggPSBjZW50ZXJzX2NwaWNfSltdLCB5ID0gcmVwKDAsIDY4KSksIHBjaCA9ICIuIiwgY2V4ID0gNCwgeGxhYiA9ICJTdGFuZGFyZGl6ZWQgTG9jYXRpb24gaW4gU2l0ZSIsIHlsYWIgPSAiIiwgY29sID0gInJlZCIsIG1haW4gPSAiQ1BJQyBBY3Rpdml0eSBDZW50ZXJzOiBTaXRlIEoiKQpwbG90KHh5LmNvb3Jkcyh4ID0gY2VudGVyc19jcGljX0tbXSwgeSA9IHJlcCgwLCAzMSkpLCBwY2ggPSAiLiIsIGNleCA9IDQsIHhsYWIgPSAiU3RhbmRhcmRpemVkIExvY2F0aW9uIGluIFNpdGUiLCB5bGFiID0gIiIsIGNvbCA9ICJyZWQiLCBtYWluID0gIkNQSUMgQWN0aXZpdHkgQ2VudGVyczogU2l0ZSBLIikKcGxvdCh4eS5jb29yZHMoeCA9IGNlbnRlcnNfY3BpY19MW10sIHkgPSByZXAoMCwgMjUpKSwgcGNoID0gIi4iLCBjZXggPSA0LCB4bGFiID0gIlN0YW5kYXJkaXplZCBMb2NhdGlvbiBpbiBTaXRlIiwgeWxhYiA9ICIiLCBjb2wgPSAicmVkIiwgbWFpbiA9ICJDUElDIEFjdGl2aXR5IENlbnRlcnM6IFNpdGUgTCIpCnBsb3QoeHkuY29vcmRzKHggPSBjZW50ZXJzX2NwaWNfTVtdLCB5ID0gcmVwKDAsIDgyKSksIHBjaCA9ICIuIiwgY2V4ID0gNCwgeGxhYiA9ICJTdGFuZGFyZGl6ZWQgTG9jYXRpb24gaW4gU2l0ZSIsIHlsYWIgPSAiIiwgY29sID0gInJlZCIsIG1haW4gPSAiQ1BJQyBBY3Rpdml0eSBDZW50ZXJzOiBTaXRlIE0iKQpwbG90KHh5LmNvb3Jkcyh4ID0gY2VudGVyc19jcGljX05bXSwgeSA9IHJlcCgwLCA4NCkpLCBwY2ggPSAiLiIsIGNleCA9IDQsIHhsYWIgPSAiU3RhbmRhcmRpemVkIExvY2F0aW9uIGluIFNpdGUiLCB5bGFiID0gIiIsIGNvbCA9ICJyZWQiLCBtYWluID0gIkNQSUMgQWN0aXZpdHkgQ2VudGVyczogU2l0ZSBOIikKcGxvdCh4eS5jb29yZHMoeCA9IGNlbnRlcnNfY3BpY19PW10sIHkgPSByZXAoMCwgODApKSwgcGNoID0gIi4iLCBjZXggPSA0LCB4bGFiID0gIlN0YW5kYXJkaXplZCBMb2NhdGlvbiBpbiBTaXRlIiwgeWxhYiA9ICIiLCBjb2wgPSAicmVkIiwgbWFpbiA9ICJDUElDIEFjdGl2aXR5IENlbnRlcnM6IFNpdGUgTyIpCgpgYGAKCmBgYHtyfQpmaWxlcGF0aHMgPC0gYygiQUNfUGxvdHMyLnBkZiIsIkFDX1Bsb3RzMS5wZGYiKQprbml0cjo6aW5jbHVkZV9ncmFwaGljcyhmaWxlcGF0aHMpCmBgYAoKCgojIyBIaXN0b2dyYW1zCkkgdGhlbiBleGFtaW5lZCB0aGUgZGlzdHJpYnV0aW9uIG9mIGFjdGl2aXR5IGNlbnRlcnMgYXQgZWFjaCBzaXRlIGZvciBlYWNoIHNwZWNpZXMgYnkgcGxvdHRpbmcgaGlzdG9ncmFtcy4KCmBgYHtyLCBldmFsID0gRkFMU0V9CgpmaWxlcGF0aHMgPC0gYygiQUNfSGlzdDFfQ1BJQy5wZGYiLCAiQUNfSGlzdF9DUElDLnBkZiIsICJBQ19IaXN0MV9DU0VSLnBkZiIsICJBQ19IaXN0Ml9DU0VSLnBkZiIpCmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKGZpbGVwYXRocykKCnBhcihtZnJvdyA9IGMoMywyKSkKaGlzdChjZW50ZXJzX2NwaWNfQSwgbWFpbiA9ICJDUElDIEEiLCB4bGFiID0gIkFjdGl2aXR5IENlbnRlcnMiKQpoaXN0KGNlbnRlcnNfY3BpY19DLCBtYWluID0gIkNQSUMgQyIsIHhsYWIgPSAiQWN0aXZpdHkgQ2VudGVycyIpCmhpc3QoY2VudGVyc19jcGljX0QsIG1haW4gPSAiQ1BJQyBEIiwgeGxhYiA9ICJBY3Rpdml0eSBDZW50ZXJzIikKaGlzdChjZW50ZXJzX2NwaWNfRSwgbWFpbiA9ICJDUElDIEUiLCB4bGFiID0gIkFjdGl2aXR5IENlbnRlcnMiKQpoaXN0KGNlbnRlcnNfY3BpY19GLCBtYWluID0gIkNQSUMgRiIsIHhsYWIgPSAiQWN0aXZpdHkgQ2VudGVycyIpCmhpc3QoY2VudGVyc19jcGljX0csIG1haW4gPSAiQ1BJQyBHIiwgeGxhYiA9ICJBY3Rpdml0eSBDZW50ZXJzIikKCmhpc3QoY2VudGVyc19jcGljX0osIG1haW4gPSAiQ1BJQyBKIiwgeGxhYiA9ICJBY3Rpdml0eSBDZW50ZXJzIikKaGlzdChjZW50ZXJzX2NwaWNfSywgbWFpbiA9ICJDUElDIEsiLCB4bGFiID0gIkFjdGl2aXR5IENlbnRlcnMiKQpoaXN0KGNlbnRlcnNfY3BpY19MLCBtYWluID0gIkNQSUMgTCIsIHhsYWIgPSAiQWN0aXZpdHkgQ2VudGVycyIpCmhpc3QoY2VudGVyc19jcGljX00sIG1haW4gPSAiQ1BJQyBNIiwgeGxhYiA9ICJBY3Rpdml0eSBDZW50ZXJzIikKaGlzdChjZW50ZXJzX2NwaWNfTiwgbWFpbiA9ICJDUElDIE4iLCB4bGFiID0gIkFjdGl2aXR5IENlbnRlcnMiKQpoaXN0KGNlbnRlcnNfY3BpY19PLCBtYWluID0gIkNQSUMgTyIsIHhsYWIgPSAiQWN0aXZpdHkgQ2VudGVycyIpCgojIyMjIyMjIwoKaGlzdChjZW50ZXJzX2NzZXJfQSwgbWFpbiA9ICJDU0VSIEEiLCB4bGFiID0gIkFjdGl2aXR5IENlbnRlcnMiKQpoaXN0KGNlbnRlcnNfY3Nlcl9DLCBtYWluID0gIkNTRVIgQyIsIHhsYWIgPSAiQWN0aXZpdHkgQ2VudGVycyIpCmhpc3QoY2VudGVyc19jc2VyX0UsIG1haW4gPSAiQ1NFUiBFIiwgeGxhYiA9ICJBY3Rpdml0eSBDZW50ZXJzIikKaGlzdChjZW50ZXJzX2NzZXJfRiwgbWFpbiA9ICJDU0VSIEYiLCB4bGFiID0gIkFjdGl2aXR5IENlbnRlcnMiKQpoaXN0KGNlbnRlcnNfY3Nlcl9HLCBtYWluID0gIkNTRVIgRyIsIHhsYWIgPSAiQWN0aXZpdHkgQ2VudGVycyIpCmhpc3QoY2VudGVyc19jc2VyX0osIG1haW4gPSAiQ1NFUiBKIiwgeGxhYiA9ICJBY3Rpdml0eSBDZW50ZXJzIikKCnBhcihtZnJvdyA9IGMoMywyKSkKaGlzdChjZW50ZXJzX2NzZXJfTSwgbWFpbiA9ICJDU0VSIE0iLCB4bGFiID0gIkFjdGl2aXR5IENlbnRlcnMiKQpoaXN0KGNlbnRlcnNfY3Nlcl9OLCBtYWluID0gIkNTRVIgTiIsIHhsYWIgPSAiQWN0aXZpdHkgQ2VudGVycyIpCmhpc3QoY2VudGVyc19jc2VyX08sIG1haW4gPSAiQ1NFUiBPIiwgeGxhYiA9ICJBY3Rpdml0eSBDZW50ZXJzIikKCmBgYAoKYGBge3J9CmZpbGVwYXRocyA8LSBjKCJBQ19IaXN0MV9DUElDLnBkZiIsICJBQ19IaXN0X0NQSUMucGRmIiwgIkFDX0hpc3QxX0NTRVIucGRmIiwgIkFDX0hpc3QyX0NTRVIucGRmIikKa25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoZmlsZXBhdGhzKQpgYGAKCiMjIyMgSSBleGFtaW5lZCB3aGV0aGVyIGFjdGl2aXR5IGNlbnRlcnMgcGVyIHNwZWNpZXMgYXQgZWFjaCBzaXRlIHNob3dlZCBldmlkZW5jZSBvZiBjbHVzdGVyaW5nIG9yIHNlZ3JlZ2F0aW9uLiBJIGZpcnN0IGhhZCB0byBjcmVhdGUgYSBwb2ludCBwcm9jZXNzIGFsb25nIGEgbGluZWFyIG5ldHdvcmsuIElmIEkgaGFkIGV4YW1pbmVkIG15IHJlc3VsdGluZyBwb2ludCBwcm9jZXNzZXMgYXMgMkQsIHRoZSBzZWNvbmQgZGltZW5zaW9uIHdvdWxkIGhhdmUgY2hhbmdlZCBkaXN0YW5jZXMgYmV0d2VlbiBwb2ludHMgYW5kIGJpYXNlZCBkaXNwZXJzaW9uIGFuYWx5c2VzLiBJIGZpcnN0IGNyZWF0ZWQgYSBsaW5lYXIgbmV0d29yayB1c2luZyB0aGUgY29tbWFuZCAqbGlubmV0Ki4gSSB0aGVuIHVzZWQgdGhlIGZ1bmN0aW9uICphcy5scHAqIHRvIGNyZWF0ZSBhIHBvaW50IHByb2Nlc3MgZm9yIGVhY2ggc3BlY2llcyBhbmQgc2l0ZSBhbG9uZyBhIGxpbmUgKHRoZSBjYW5hbCkuCgpBZnRlciBjb2VyaW5nIGFjdGl2aXR5IGNlbnRlcnMgaW50byBscHAgb2JqZWN0cywgSSByYW4gbW9udGUgY2FybyBpbnRlcmF0aW9ucyBvZiB0aGUgTGluZWFyIEsgZnVuY3Rpb24gdG8gY3JlYXRlIGEgc2ltdWxhdGlvbiBlbnZlbG9wZSBhbmQgdGhlbiBjb21wYXJlZCB0aGUgb2JzZXJ2ZWQgbGluZWFyIEsgZGlzdHJpYnV0aW9uIHRvIHRoZSBleHBlY3RlZCBkaXN0cmlidXRpb25zLgoKIyMjIEVYQU1JTklORyBESVNQRVJTSU9OOiBMaW5lYXIgSyBGdW5jdGlvbiBmb3IgbGluZWFyIHBvaW50IHByb2Nlc3NlcwpgYGB7ciwgZXZhbCA9IEZBTFNFfQoKIyMgQ3JlYXRlIExpbmVhciBOZXR3b3JrCiMgbGluZWFyIG5ldHdvcmsKCmNhbmFsX2xpbmUgPC0gcHNwKDAsIDAsIDMsIDAsIHdpbmRvdyA9IG93aW4oeHJhbmdlID0gYygwLDMpLCB5cmFuZ2UgPSBjKC0xLDEpKSkKcGxvdChjYW5hbF9saW5lKQpjYW5hbF9saW5lIDwtIGFzLmxpbm5ldChjYW5hbF9saW5lKQojIyMjIENoZWNrIHZhbGlkaXR5CnBsb3QoY2FuYWxfbGluZSkKdGV4dCh2ZXJ0aWNlcyhjYW5hbF9saW5lKSwgbGFiZWxzID0gdmVydGV4ZGVncmVlKGNhbmFsX2xpbmUpKQoKCiMjIyMjIENyZWF0aW5nIGxwcCBvYmplY3RzIC0gcG9pbnQgcHJvY2VzcyBhbG9uZyBhIGxpbmVhciBuZXR3b3JrICMjIyMjCgpBQ1BJQ19YIDwtIGxpc3QoeD1jKGNlbnRlcnNfY3BpY19BKSwgeSA9IGMocmVwKDAsMzYpKSkKQUNQSUNfWCA8LSBhcy5scHAoQUNQSUNfWCwgTCA9IGNhbmFsX2xpbmUpCgpDQ1BJQ19YIDwtIGxpc3QoeD1jKGNlbnRlcnNfY3BpY19DKSwgeSA9IGMocmVwKDAsMzApKSkKQ0NQSUNfWCA8LSBhcy5scHAoQ0NQSUNfWCwgTCA9IGNhbmFsX2xpbmUpCgpEQ1BJQ19YIDwtIGxpc3QoeD1jKGNlbnRlcnNfY3BpY19EKSwgeSA9IGMocmVwKDAsMjIpKSkKRENQSUNfWCA8LSBhcy5scHAoRENQSUNfWCwgTCA9IGNhbmFsX2xpbmUpCgpFQ1BJQ19YIDwtIGxpc3QoeD1jKGNlbnRlcnNfY3BpY19FKSwgeSA9IGMocmVwKDAsNDIpKSkKRUNQSUNfWCA8LSBhcy5scHAoRUNQSUNfWCwgTCA9IGNhbmFsX2xpbmUpCgpGQ1BJQ19YIDwtIGxpc3QoeD1jKGNlbnRlcnNfY3BpY19GKSwgeSA9IGMocmVwKDAsMTI4KSkpCkZDUElDX1ggPC0gYXMubHBwKEZDUElDX1gsIEwgPSBjYW5hbF9saW5lKQoKR0NQSUNfWCA8LSBsaXN0KHg9YyhjZW50ZXJzX2NwaWNfRyksIHkgPSBjKHJlcCgwLDU0KSkpCkdDUElDX1ggPC0gYXMubHBwKEdDUElDX1gsIEwgPSBjYW5hbF9saW5lKQoKSkNQSUNfWCA8LSBsaXN0KHg9YyhjZW50ZXJzX2NwaWNfSiksIHkgPSBjKHJlcCgwLDY4KSkpCkpDUElDX1ggPC0gYXMubHBwKEpDUElDX1gsIEwgPSBjYW5hbF9saW5lKQoKS0NQSUNfWCA8LSBsaXN0KHg9YyhjZW50ZXJzX2NwaWNfSyksIHkgPSBjKHJlcCgwLDMxKSkpCktDUElDX1ggPC0gYXMubHBwKEtDUElDX1gsIEwgPSBjYW5hbF9saW5lKQoKTENQSUNfWCA8LSBsaXN0KHg9YyhjZW50ZXJzX2NwaWNfTCksIHkgPSBjKHJlcCgwLDI1KSkpCkxDUElDX1ggPC0gYXMubHBwKExDUElDX1gsIEwgPSBjYW5hbF9saW5lKQoKTUNQSUNfWCA8LSBsaXN0KHg9YyhjZW50ZXJzX2NwaWNfTSksIHkgPSBjKHJlcCgwLDgyKSkpCk1DUElDX1ggPC0gYXMubHBwKE1DUElDX1gsIEwgPSBjYW5hbF9saW5lKQoKTkNQSUNfWCA8LSBsaXN0KHg9YyhjZW50ZXJzX2NwaWNfTiksIHkgPSBjKHJlcCgwLDg0KSkpCk5DUElDX1ggPC0gYXMubHBwKE5DUElDX1gsIEwgPSBjYW5hbF9saW5lKQoKT0NQSUNfWCA8LSBsaXN0KHg9YyhjZW50ZXJzX2NwaWNfTyksIHkgPSBjKHJlcCgwLDgwKSkpCk9DUElDX1ggPC0gYXMubHBwKE9DUElDX1gsIEwgPSBjYW5hbF9saW5lKQoKIyMjIyMjIyMKCkFDU0VSX1ggPC0gbGlzdCh4PWMoY2VudGVyc19jc2VyX0EpLCB5ID0gYyhyZXAoMCw1KSkpCkFDU0VSX1ggPC0gYXMubHBwKEFDU0VSX1gsIEwgPSBjYW5hbF9saW5lKQoKQ0NTRVJfWCA8LSBsaXN0KHg9YyhjZW50ZXJzX2NzZXJfQyksIHkgPSBjKHJlcCgwLDYpKSkKQ0NTRVJfWCA8LSBhcy5scHAoQ0NTRVJfWCwgTCA9IGNhbmFsX2xpbmUpCgpFQ1NFUl9YIDwtIGxpc3QoeD1jKGNlbnRlcnNfY3Nlcl9FKSwgeSA9IGMocmVwKDAsMTEpKSkKRUNTRVJfWCA8LSBhcy5scHAoRUNTRVJfWCwgTCA9IGNhbmFsX2xpbmUpCgpGQ1NFUl9YIDwtIGxpc3QoeD1jKGNlbnRlcnNfY3Nlcl9GKSwgeSA9IGMocmVwKDAsOCkpKQpGQ1NFUl9YIDwtIGFzLmxwcChGQ1NFUl9YLCBMID0gY2FuYWxfbGluZSkKCkdDU0VSX1ggPC0gbGlzdCh4PWMoY2VudGVyc19jc2VyX0cpLCB5ID0gYyhyZXAoMCw1KSkpCkdDU0VSX1ggPC0gYXMubHBwKEdDU0VSX1gsIEwgPSBjYW5hbF9saW5lKQoKSkNTRVJfWCA8LSBsaXN0KHg9YyhjZW50ZXJzX2NzZXJfSiksIHkgPSBjKHJlcCgwLDUpKSkKSkNTRVJfWCA8LSBhcy5scHAoSkNTRVJfWCwgTCA9IGNhbmFsX2xpbmUpCgpNQ1NFUl9YIDwtIGxpc3QoeD1jKGNlbnRlcnNfY3Nlcl9NKSwgeSA9IGMocmVwKDAsOCkpKQpNQ1NFUl9YIDwtIGFzLmxwcChNQ1NFUl9YLCBMID0gY2FuYWxfbGluZSkKCk5DU0VSX1ggPC0gbGlzdCh4PWMoY2VudGVyc19jc2VyX04pLCB5ID0gYyhyZXAoMCw1KSkpCk5DU0VSX1ggPC0gYXMubHBwKE5DU0VSX1gsIEwgPSBjYW5hbF9saW5lKQoKT0NTRVJfWCA8LSBsaXN0KHg9YyhjZW50ZXJzX2NzZXJfTyksIHkgPSBjKHJlcCgwLDUpKSkKT0NTRVJfWCA8LSBhcy5scHAoT0NTRVJfWCwgTCA9IGNhbmFsX2xpbmUpCgojIyMjIyMjIyMjIyMgTGluZWFyIEsgTW9udGUgQ2FybG8gQW5hbHlzaXMgUGVyIFNwZWNpZXMgUGVyIFNpdGUgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKIyMgQ1BJQywgQQpsaW5lYXJLX0FfQ1BJQyA8LSBsaW5lYXJLKFggPSBBQ1BJQ19YKQpzdW1tYXJ5KGxpbmVhcktfQV9DUElDKQoKbGluS19BX0NQSUMgPC0gZW52ZWxvcGUoQUNQSUNfWCwgbGluZWFySywgbnNpbSA9IDk5LCBucmFuayA9IDEpCnBsb3QobGluS19BX0NQSUMsIG1haW4gPSAiTGluZWFyIEsgVGVzdCBvbiBDUElDIFNpdGUgQSIpCgojIyBDUElDLCBDCmxpbmVhcktfQ19DUElDIDwtIGxpbmVhcksoWCA9IENDUElDX1gpCnN1bW1hcnkobGluZWFyS19DX0NQSUMpCgpsaW5LX0NfQ1BJQyA8LSBlbnZlbG9wZShDQ1BJQ19YLCBsaW5lYXJLLCBuc2ltID0gOTksIG5yYW5rID0gMSkKcGxvdChsaW5LX0NfQ1BJQywgbWFpbiA9ICJMaW5lYXIgSyBUZXN0IG9uIENQSUMgU2l0ZSBDIikKCiMjIENQSUMsIEQKbGluZWFyS19EX0NQSUMgPC0gbGluZWFySyhYID0gRENQSUNfWCkKc3VtbWFyeShsaW5lYXJLX0RfQ1BJQykKCmxpbktfRF9DUElDIDwtIGVudmVsb3BlKERDUElDX1gsIGxpbmVhckssIG5zaW0gPSA5OSwgbnJhbmsgPSAxKQpwbG90KGxpbktfRF9DUElDLCBtYWluID0gIkxpbmVhciBLIFRlc3Qgb24gQ1BJQyBTaXRlIEQiKQoKIyMgQ1BJQywgRQpsaW5lYXJLX0VfQ1BJQyA8LSBsaW5lYXJLKFggPSBFQ1BJQ19YKQpzdW1tYXJ5KGxpbmVhcktfRV9DUElDKQoKbGluS19FX0NQSUMgPC0gZW52ZWxvcGUoRUNQSUNfWCwgbGluZWFySywgbnNpbSA9IDk5LCBucmFuayA9IDEpCnBsb3QobGluS19FX0NQSUMsIG1haW4gPSAiTGluZWFyIEsgVGVzdCBvbiBDUElDIFNpdGUgRSIpCgojIyBDUElDLCBGCmxpbmVhcktfRl9DUElDIDwtIGxpbmVhcksoWCA9IEZDUElDX1gpCnN1bW1hcnkobGluZWFyS19GX0NQSUMpCgpsaW5LX0ZfQ1BJQyA8LSBlbnZlbG9wZShGQ1BJQ19YLCBsaW5lYXJLLCBuc2ltID0gOTksIG5yYW5rID0gMSkKcGxvdChsaW5LX0ZfQ1BJQywgbWFpbiA9ICJMaW5lYXIgSyBUZXN0IG9uIENQSUMgU2l0ZSBGIikKCiMjIENQSUMsIEcKbGluZWFyS19HX0NQSUMgPC0gbGluZWFySyhYID0gR0NQSUNfWCkKc3VtbWFyeShsaW5lYXJLX0dfQ1BJQykKCmxpbktfR19DUElDIDwtIGVudmVsb3BlKEdDUElDX1gsIGxpbmVhckssIG5zaW0gPSA5OSwgbnJhbmsgPSAxKQpwbG90KGxpbktfR19DUElDLCBtYWluID0gIkxpbmVhciBLIFRlc3Qgb24gQ1BJQyBTaXRlIEciKQoKIyMgQ1BJQywgSgpsaW5lYXJLX0pfQ1BJQyA8LSBsaW5lYXJLKFggPSBKQ1BJQ19YKQpzdW1tYXJ5KGxpbmVhcktfSl9DUElDKQoKbGluS19KX0NQSUMgPC0gZW52ZWxvcGUoSkNQSUNfWCwgbGluZWFySywgbnNpbSA9IDk5LCBucmFuayA9IDEpCnBsb3QobGluS19KX0NQSUMsIG1haW4gPSAiTGluZWFyIEsgVGVzdCBvbiBDUElDIFNpdGUgSiIpCgojIyBDUElDLCBLCmxpbmVhcktfS19DUElDIDwtIGxpbmVhcksoWCA9IEtDUElDX1gpCnN1bW1hcnkobGluZWFyS19LX0NQSUMpCgpsaW5LX0tfQ1BJQyA8LSBlbnZlbG9wZShLQ1BJQ19YLCBsaW5lYXJLLCBuc2ltID0gOTksIG5yYW5rID0gMSkKcGxvdChsaW5LX0tfQ1BJQywgbWFpbiA9ICJMaW5lYXIgSyBUZXN0IG9uIENQSUMgU2l0ZSBLIikKCiMjIENQSUMsIEwKbGluZWFyS19MX0NQSUMgPC0gbGluZWFySyhYID0gTENQSUNfWCkKc3VtbWFyeShsaW5lYXJLX0xfQ1BJQykKCmxpbktfTF9DUElDIDwtIGVudmVsb3BlKExDUElDX1gsIGxpbmVhckssIG5zaW0gPSA5OSwgbnJhbmsgPSAxKQpwbG90KGxpbktfTF9DUElDLCBtYWluID0gIkxpbmVhciBLIFRlc3Qgb24gQ1BJQyBTaXRlIEwiKQoKIyMgQ1BJQywgTQpsaW5lYXJLX01fQ1BJQyA8LSBsaW5lYXJLKFggPSBNQ1BJQ19YKQpzdW1tYXJ5KGxpbmVhcktfTV9DUElDKQoKbGluS19NX0NQSUMgPC0gZW52ZWxvcGUoTUNQSUNfWCwgbGluZWFySywgbnNpbSA9IDk5LCBucmFuayA9IDEpCnBsb3QobGluS19NX0NQSUMsIG1haW4gPSAiTGluZWFyIEsgVGVzdCBvbiBDUElDIFNpdGUgTSIpCgojIyBDUElDLCBOCmxpbmVhcktfTl9DUElDIDwtIGxpbmVhcksoWCA9IE5DUElDX1gpCnN1bW1hcnkobGluZWFyS19OX0NQSUMpCgpsaW5LX05fQ1BJQyA8LSBlbnZlbG9wZShOQ1BJQ19YLCBsaW5lYXJLLCBuc2ltID0gOTksIG5yYW5rID0gMSkKcGxvdChsaW5LX05fQ1BJQywgbWFpbiA9ICJMaW5lYXIgSyBUZXN0IG9uIENQSUMgU2l0ZSBOIikKCiMjIENQSUMsIE8KbGluZWFyS19PX0NQSUMgPC0gbGluZWFySyhYID0gT0NQSUNfWCkKc3VtbWFyeShsaW5lYXJLX09fQ1BJQykKCmxpbktfT19DUElDIDwtIGVudmVsb3BlKE9DUElDX1gsIGxpbmVhckssIG5zaW0gPSA5OSwgbnJhbmsgPSAxKQpwbG90KGxpbktfT19DUElDLCBtYWluID0gIkxpbmVhciBLIFRlc3Qgb24gQ1BJQyBTaXRlIE8iKQoKIyMgQ1NFUiwgQQpsaW5lYXJLX0FfQ1NFUiA8LSBsaW5lYXJLKFggPSBBQ1NFUl9YKQpzdW1tYXJ5KGxpbmVhcktfQV9DU0VSKQoKbGluS19BX0NTRVIgPC0gZW52ZWxvcGUoQUNTRVJfWCwgbGluZWFySywgbnNpbSA9IDk5LCBucmFuayA9IDEpCnBsb3QobGluS19BX0NTRVIsIG1haW4gPSAiTGluZWFyIEsgVGVzdCBvbiBDU0VSIFNpdGUgQSIpCgojIyBDU0VSLCBDCmxpbmVhcktfQ19DU0VSIDwtIGxpbmVhcksoWCA9IENDU0VSX1gpCnN1bW1hcnkobGluZWFyS19DX0NTRVIpCgpsaW5LX0NfQ1NFUiA8LSBlbnZlbG9wZShDQ1NFUl9YLCBsaW5lYXJLLCBuc2ltID0gOTksIG5yYW5rID0gMSkKcGxvdChsaW5LX0NfQ1NFUiwgbWFpbiA9ICJMaW5lYXIgSyBUZXN0IG9uIENTRVIgU2l0ZSBDIikKCiMjIENTRVIsIEUKbGluZWFyS19FX0NTRVIgPC0gbGluZWFySyhYID0gRUNTRVJfWCkKc3VtbWFyeShsaW5lYXJLX0VfQ1NFUikKCmxpbktfRV9DU0VSIDwtIGVudmVsb3BlKEVDU0VSX1gsIGxpbmVhckssIG5zaW0gPSA5OSwgbnJhbmsgPSAxKQpwbG90KGxpbktfRV9DU0VSLCBtYWluID0gIkxpbmVhciBLIFRlc3Qgb24gQ1NFUiBTaXRlIEUiKQoKIyMgQ1NFUiwgRgpsaW5lYXJLX0ZfQ1NFUiA8LSBsaW5lYXJLKFggPSBGQ1NFUl9YKQpzdW1tYXJ5KGxpbmVhcktfRl9DU0VSKQoKbGluS19GX0NTRVIgPC0gZW52ZWxvcGUoRkNTRVJfWCwgbGluZWFySywgbnNpbSA9IDk5LCBucmFuayA9IDEpCnBsb3QobGluS19GX0NTRVIsIG1haW4gPSAiTGluZWFyIEsgVGVzdCBvbiBDU0VSIFNpdGUgRiIpCgojIyBDU0VSLCBHCmxpbmVhcktfR19DU0VSIDwtIGxpbmVhcksoWCA9IEdDU0VSX1gpCnN1bW1hcnkobGluZWFyS19HX0NTRVIpCgpsaW5LX0dfQ1NFUiA8LSBlbnZlbG9wZShHQ1NFUl9YLCBsaW5lYXJLLCBuc2ltID0gOTksIG5yYW5rID0gMSkKcGxvdChsaW5LX0dfQ1NFUiwgbWFpbiA9ICJMaW5lYXIgSyBUZXN0IG9uIENTRVIgU2l0ZSBHIikKCiMjIENTRVIsIEoKbGluZWFyS19KX0NTRVIgPC0gbGluZWFySyhYID0gSkNTRVJfWCkKc3VtbWFyeShsaW5lYXJLX0pfQ1NFUikKCmxpbktfSl9DU0VSIDwtIGVudmVsb3BlKEpDU0VSX1gsIGxpbmVhckssIG5zaW0gPSA5OSwgbnJhbmsgPSAxKQpwbG90KGxpbktfSl9DU0VSLCBtYWluID0gIkxpbmVhciBLIFRlc3Qgb24gQ1NFUiBTaXRlIEoiKQoKIyMgQ1NFUiwgTQpsaW5lYXJLX01fQ1NFUiA8LSBsaW5lYXJLKFggPSBNQ1NFUl9YKQpzdW1tYXJ5KGxpbmVhcktfTV9DU0VSKQoKbGluS19NX0NTRVIgPC0gZW52ZWxvcGUoTUNTRVJfWCwgbGluZWFySywgbnNpbSA9IDk5LCBucmFuayA9IDEpCnBsb3QobGluS19NX0NTRVIsIG1haW4gPSAiTGluZWFyIEsgVGVzdCBvbiBDU0VSIFNpdGUgTSIpCgojIyBDU0VSLCBOCmxpbmVhcktfTl9DU0VSIDwtIGxpbmVhcksoWCA9IE5DU0VSX1gpCnN1bW1hcnkobGluZWFyS19OX0NTRVIpCgpsaW5LX05fQ1NFUiA8LSBlbnZlbG9wZShOQ1NFUl9YLCBsaW5lYXJLLCBuc2ltID0gOTksIG5yYW5rID0gMSkKcGxvdChsaW5LX05fQ1NFUiwgbWFpbiA9ICJMaW5lYXIgSyBUZXN0IG9uIENTRVIgU2l0ZSBOIikKCiMjIENTRVIsIE8KbGluZWFyS19PX0NTRVIgPC0gbGluZWFySyhYID0gT0NTRVJfWCkKc3VtbWFyeShsaW5lYXJLX09fQ1NFUikKCmxpbktfT19DU0VSIDwtIGVudmVsb3BlKE9DU0VSX1gsIGxpbmVhckssIG5zaW0gPSA5OSwgbnJhbmsgPSAxKQpwbG90KGxpbktfT19DU0VSLCBtYWluID0gIkxpbmVhciBLIFRlc3Qgb24gQ1NFUiBTaXRlIE8iKQoKCmBgYAoKIyMgUGxvdHRpbmcgTGluZWFyIEsgU2ltdWxhdGlvbnMgd2l0aCBFbnZlbG9wZXMKYGBge3IsIGV2YWwgPSBGQUxTRX0KZmlsZXBhdGhzIDwtIGMoIkFDX0xpbksxX0NQSUMucGRmIiwgIkFDX0xpbksyX0NQSUMucGRmIiwgIkFDX0xpbkszX0NQSUMucGRmIiwgIkFDX0xpbksxX0NTRVIucGRmIiwgIkFDX0xpbksyX0NTRVIucGRmIiwgIkFDX0xpbkszX0NTRVIucGRmIikKa25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoZmlsZXBhdGhzKQoKCnBhcihtZnJvdyA9IGMoMiwyKSkKcGxvdChsaW5LX0FfQ1BJQywgbWFpbiA9ICJDUElDIEEiLCBsZWdlbmQgPSAiIikKcGxvdChsaW5LX0NfQ1BJQywgbWFpbiA9ICJDUElDIEMiLCBsZWdlbmQgPSAiIikKcGxvdChsaW5LX0RfQ1BJQywgbWFpbiA9ICJDUElDIEQiLCBsZWdlbmQgPSAiIikKcGxvdChsaW5LX0VfQ1BJQywgbWFpbiA9ICJDUElDIEUiLCBsZWdlbmQgPSAiIikKCnBsb3QobGluS19GX0NQSUMsIG1haW4gPSAiQ1BJQyBGIiwgbGVnZW5kID0gIiIpCnBsb3QobGluS19HX0NQSUMsIG1haW4gPSAiQ1BJQyBHIiwgbGVnZW5kID0gIiIpCnBsb3QobGluS19KX0NQSUMsIG1haW4gPSAiQ1BJQyBKIiwgbGVnZW5kID0gIiIpCnBsb3QobGluS19LX0NQSUMsIG1haW4gPSAiQ1BJQyBLIiwgbGVnZW5kID0gIiIpCgpwbG90KGxpbktfTF9DUElDLCBtYWluID0gIkNQSUMgTCIsIGxlZ2VuZCA9ICIiKQpwbG90KGxpbktfTV9DUElDLCBtYWluID0gIkNQSUMgTSIsIGxlZ2VuZCA9ICIiKQpwbG90KGxpbktfTl9DUElDLCBtYWluID0gIkNQSUMgTiIsIGxlZ2VuZCA9ICIiKQpwbG90KGxpbktfT19DUElDLCBtYWluID0gIkNQSUMgTyIsIGxlZ2VuZCA9ICIiKQoKIyMjIyMjIyMKCnBsb3QobGluS19BX0NTRVIsIG1haW4gPSAiQ1NFUiBBIiwgbGVnZW5kID0gIiIpCnBsb3QobGluS19DX0NTRVIsIG1haW4gPSAiQ1NFUiBDIiwgbGVnZW5kID0gIiIpCnBsb3QobGluS19FX0NTRVIsIG1haW4gPSAiQ1NFUiBFIiwgbGVnZW5kID0gIiIpCnBsb3QobGluS19GX0NTRVIsIG1haW4gPSAiQ1NFUiBGIiwgbGVnZW5kID0gIiIpCgpwbG90KGxpbktfR19DU0VSLCBtYWluID0gIkNTRVIgRyIsIGxlZ2VuZCA9ICIiKQpwbG90KGxpbktfSl9DU0VSLCBtYWluID0gIkNTRVIgSiIsIGxlZ2VuZCA9ICIiKQpwbG90KGxpbktfTV9DU0VSLCBtYWluID0gIkNTRVIgTSIsIGxlZ2VuZCA9ICIiKQpwbG90KGxpbktfTl9DU0VSLCBtYWluID0gIkNTRVIgTiIsIGxlZ2VuZCA9ICIiKQoKcGxvdChsaW5LX09fQ1NFUiwgbWFpbiA9ICJDU0VSIE8iLCBsZWdlbmQgPSAiIikKCmBgYAoKRGlzcGVyc2lvbiBhbmFseXNpcyBvbiBhY3Rpdml0eSBjZW50ZXJzIGZvciBtb3N0IENQSUMgYW5kIHNpdGUgY29tYmluYXRpb25zIHByb3ZpZGVkIGV2aWRlbmNlIG9mIHNtYWxsIGFtb3VudHMgb2YgY2x1c3RlcmluZy4gU2l0ZXMgQSwgRSwgRiwgYW5kIEogc2VlbWVkIHRvIGhhdmUgdGhlIG1vc3QgY2x1c3RlcmVkIENQSUMgYWN0aXZpdHkgY2VudGVycywgc2l0ZXMgTCwgTiwgYW5kIE8gaGFkIGxlc3MgY2x1c3RlcmVkIGFjdGl2aXR5IGNlbnRlcnMsIGFuZCBzaXRlcyBDLCBELCBHLCBLLCBhbmQgTSBzZWVtZWQgdG8gaGF2ZSB0aGUgcmFuZG9tIENQSUMgYWN0aXZpdHkgY2VudGVycy4KCkR1ZSB0byBsb3cgc2FtcGxlIHNpemUgb2YgQ1NFUiBhdCBhbGwgc2l0ZXMsIGRpc3BlcnNpb24gYW5hbHlzaXMgd2FzIHVuYWJsZSB0byBkZXRlY3QgYSBzaWduaWZpY2FudCBkaWZmZXJlbmNlIGZyb20gYSByYW5kb20gcG9pbnQgcHJvY2Vzcy4gU2l0ZXMgRiwgTiwgYW5kIE8gZGlkIHNlZW0gdG8gaGF2ZSB2ZXJ5IHNsaWdodCBjbHVzdGVyaW5nIGluIGFjdGl2aXR5IGNlbnRlcnMgYXQgdmVyeSBicmllZiByIHdpbmRvd3MuCgpgYGB7cn0KZmlsZXBhdGhzIDwtIGMoIkFDX0xpbksxX0NQSUMucGRmIiwgIkFDX0xpbksyX0NQSUMucGRmIiwgIkFDX0xpbkszX0NQSUMucGRmIiwgIkFDX0xpbksxX0NTRVIucGRmIiwgIkFDX0xpbksyX0NTRVIucGRmIiwgIkFDX0xpbkszX0NTRVIucGRmIikKa25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoZmlsZXBhdGhzKQpgYGAKCgojIyBHcmFwaGluZyBEZW5zaXR5IEJ5IFNpdGUKYGBge3IsIGV2YWwgPSBGQUxTRX0KZmlsZXBhdGhzIDwtIGMoIkNQSUNfUGxvdC5wZGYiLCAiQ1NFUl9QbG90LnBkZiIpCmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKGZpbGVwYXRocykKCiMjIyMjIyMjIyMjIyMjIyAgR3JhcGhpbmcgRGVuc2l0eSBCeSBTaXRlICMjIyMjIyMjIyMjIyMjIyMKCnggPC0gYygiQSIsIkMiLCJEIiwiRSIsIkYiLCJHIiwiSiIsIksiLCJMIiwiTSIsIk4iLCJPIikKZGVuc2l0eV9saXN0IDwtIGMobWVhbl9kZW5zaXR5X2NwaWNfQSwgbWVhbl9kZW5zaXR5X2NwaWNfQywgbWVhbl9kZW5zaXR5X2NwaWNfRCwgbWVhbl9kZW5zaXR5X2NwaWNfRSwgbWVhbl9kZW5zaXR5X2NwaWNfRiwgbWVhbl9kZW5zaXR5X2NwaWNfRywgbWVhbl9kZW5zaXR5X2NwaWNfSiwgbWVhbl9kZW5zaXR5X2NwaWNfSywgbWVhbl9kZW5zaXR5X2NwaWNfTCwgbWVhbl9kZW5zaXR5X2NwaWNfTSwgbWVhbl9kZW5zaXR5X2NwaWNfTiwgbWVhbl9kZW5zaXR5X2NwaWNfTykKc3RkZXJyb3JfbGlzdF9jcGljIDwtIGMoc3RkZXJyb3JfY3BpY19BLCBzdGRlcnJvcl9jcGljX0MsIHN0ZGVycm9yX2NwaWNfRCwgc3RkZXJyb3JfY3BpY19FLCBzdGRlcnJvcl9jcGljX0YsIHN0ZGVycm9yX2NwaWNfRywgc3RkZXJyb3JfY3BpY19KLCBzdGRlcnJvcl9jcGljX0ssIHN0ZGVycm9yX2NwaWNfTCwgc3RkZXJyb3JfY3BpY19NLCBzdGRlcnJvcl9jcGljX04sIHN0ZGVycm9yX2NwaWNfTykKCiMgYmFycGxvdChkZW5zaXR5X2xpc3QsIG5hbWVzLmFyZyA9IGMoIkEiLCJDIiwiRCIsIkUiLCJGIiwiRyIsIkoiLCJLIiwiTCIsIk0iLCJOIiwiTyIpLCBtYWluID0gIkNQSUMgRGVuc2l0eSBieSBTaXRlIiwgY29sID0gImJyb3duIiwgeGxhYiA9ICJTaXRlIiwgeWxhYiA9ICJEZW5zaXR5IikKCmNiaW5kX2NwaWMgPC0gY2JpbmQoZGF0YS5mcmFtZShzaXRlID0geCwgZGVuc2l0eSA9IGRlbnNpdHlfbGlzdCwgc3RkZXJyb3IgPSBzdGRlcnJvcl9saXN0X2NwaWMpKQoKcCA8LSBnZ3Bsb3QoY2JpbmRfY3BpYywgYWVzKHg9c2l0ZSwgeT1kZW5zaXR5KSkgKyAKICBnZW9tX2JhcihzdGF0PSJpZGVudGl0eSIsIGNvbG9yPSJkYXJrb3JhbmdlMyIsIGZpbGwgPSAiZGFya29yYW5nZTMiLCAKICAgICAgICAgICBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgpKSArCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbj1kZW5zaXR5LXN0ZGVycm9yLCB5bWF4PWRlbnNpdHkrc3RkZXJyb3IpLCB3aWR0aD0uMiwKICAgICAgICAgICAgICAgICBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSguOSkpIApwcmludChwKQoKcCArIGxhYnMoeD0iU2l0ZSIsIHkgPSAiRGVuc2l0eSAoSW5kaXZpZHVhbHMgUGVyIDEwMG0pIikrCiAgIHRoZW1lX2NsYXNzaWMoKSArCiAgIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1jKCcjOTk5OTk5JywnI0U2OUYwMCcpKSArCiAgZ2d0aXRsZSgiQ1BJQyBTaXRlIERlbnNpdGllcyIpICsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBzaXplID0gMTYpLAogICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplPTE0KSwKICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZT0xNCkKKQoKeCA8LSBjKCJBIiwiQyIsIkUiLCJGIiwiRyIsIkoiLCJNIiwiTiIsIk8iKQpkZW5zaXR5X2xpc3RfY3NlciA8LSBjKG1lYW5fZGVuc2l0eV9jc2VyX0EsIG1lYW5fZGVuc2l0eV9jc2VyX0MsIG1lYW5fZGVuc2l0eV9jc2VyX0UsIG1lYW5fZGVuc2l0eV9jc2VyX0YsIG1lYW5fZGVuc2l0eV9jc2VyX0csIG1lYW5fZGVuc2l0eV9jc2VyX0osIG1lYW5fZGVuc2l0eV9jc2VyX00sIG1lYW5fZGVuc2l0eV9jc2VyX04sIG1lYW5fZGVuc2l0eV9jc2VyX08pCnN0ZGVycm9yX2xpc3RfY3NlciA8LSBjKHN0ZGVycm9yX2NzZXJfQSwgc3RkZXJyb3JfY3Nlcl9DLCBzdGRlcnJvcl9jc2VyX0UsIHN0ZGVycm9yX2NzZXJfRiwgc3RkZXJyb3JfY3Nlcl9HLCBzdGRlcnJvcl9jc2VyX0osIHN0ZGVycm9yX2NzZXJfTSwgc3RkZXJyb3JfY3Nlcl9OLCBzdGRlcnJvcl9jc2VyX08pCgojIGJhcnBsb3QoZGVuc2l0eV9saXN0X2NzZXIsIG5hbWVzLmFyZyA9IGMoIkEiLCJDIiwiRSIsIkYiLCJHIiwiSiIsIk0iLCJOIiwiTyIpLCBtYWluID0gIkNTRVIgRGVuc2l0eSBieSBTaXRlIiwgY29sID0gImJyb3duIiwgeGxhYiA9ICJTaXRlIiwgeWxhYiA9ICJEZW5zaXR5IikKCmNiaW5kX2NzZXIgPC0gY2JpbmQoZGF0YS5mcmFtZShzaXRlID0geCwgZGVuc2l0eSA9IGRlbnNpdHlfbGlzdF9jc2VyLCBzdGRlcnJvciA9IHN0ZGVycm9yX2xpc3RfY3NlcikpCgpwIDwtIGdncGxvdChjYmluZF9jc2VyLCBhZXMoeD1zaXRlLCB5PWRlbnNpdHkpKSArIAogIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5IiwgY29sb3I9ImRhcmtvcmFuZ2UzIiwgZmlsbCA9ICJkYXJrb3JhbmdlMyIsIAogICAgICAgICAgIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKCkpICsKICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluPWRlbnNpdHktc3RkZXJyb3IsIHltYXg9ZGVuc2l0eStzdGRlcnJvciksIHdpZHRoPS4yLAogICAgICAgICAgICAgICAgIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKC45KSkgCnByaW50KHApCgpwICsgbGFicyh4PSJTaXRlIiwgeSA9ICJEZW5zaXR5IChJbmRpdmlkdWFscyBQZXIgMTAwbSkiKSsKICAgdGhlbWVfY2xhc3NpYygpICsKICAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoJyM5OTk5OTknLCcjRTY5RjAwJykpICsKICBnZ3RpdGxlKCJTbmFwcGluZyBUdXJ0bGUgU2l0ZSBEZW5zaXRpZXMiKSArCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgc2l6ZSA9IDE2KSwKICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZT0xNCksCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemU9MTQpCikKCmBgYAoKCmBgYHtyfQpmaWxlcGF0aHMgPC0gYygiQ1BJQ19QbG90LnBkZiIsICJDU0VSX1Bsb3QucGRmIikKa25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoZmlsZXBhdGhzKQpgYGAKCkkgYWxzbyBjcmVhdGVkIDIgR0lTIG1hcHMgaWxsdXN0cmF0aW5nIHNpdGUgbG9jYXRpb25zIGluIHJlbGF0aW9uIHRvIHBvdGVudGlhbCBsYW5kIHVzZSBjaGFyYWN0ZXJpc3RpY3MgKG5lYXJieSBsYW5kIHVzZSB0eXBlcyB0aGF0IG1pZ2h0IGdyZWF0bHkgaW1wYWN0IHR1cnRsZSBkZW5zaXRpZXM6IGRldmVsb3BtZW50LCBjdWx0aXZhdGVkIGNyb3BzLCBwYXN0dXJlLCB3ZXRsYW5kIHZlZ2V0YXRpb24pLiBGdXR1cmUgZGlyZWN0aW9ucyBmb3IgdGhpcyBwcm9qZWN0IGNvdWxkIGluY2x1ZGUgaW50ZXJwb2xhdGluZyB0dXJ0bGUgZGVuc2l0aWVzIGJldHdlZW4gc2l0ZXMgdXNpbmcgc3BlY2llcyBkaXN0cmlidXRpb24gbW9kZWxpbmcgT1IgY2FsY3VsYXRpbmcgZGlzdGFuY2UgdG8gbGFuZCB1c2UgdHlwZSBhbmQgZXhhbWluaW5nIHdoZXRoZXIgZGlzdGFuY2VzIGltcGFjdCBkZW5zaXRpZXMgb3IgZGlzcGVyc2FsIGJldHdlZW4gc2l0ZXMuIAo=