library(tidyverse) library(moderndive) library(ggplot2) library(skimr) library(gapminder) library(infer)

set.seed(4869)

#bringing in dataframe, has 4969 entries with 7 columns movie_boxoffice.1 <- read.csv(“C:/Users/zahir/OneDrive/Desktop/Rutgers Semester Folders/2024 Fall Semester/Inference Data Science/HW 4 Lab/movie_boxoffice-1.csv”) View(movie_boxoffice.1)

#cleaning up dataframe of duplicates, has 4869 entries with 7 columns movie_boxoffice_distinct <- movie_boxoffice.1 %>% distinct() view(movie_boxoffice_distinct)

#0. How many duplicated records were removed from boxoffice data? What is your random seed number? #Answer: 100 dublicated records(entries) were removed, and my random seed number is set to 4869

#************************************************************************************************ #Part I: Sampling #1.Treat the box office data as population. Have a histogram of the global box office earning. Describe shape of distribution.

ggplot(movie_boxoffice_distinct, aes(x = Worldwide_Gross)) + geom_histogram(fill = "lightblue", color = "black") + 
labs(title = "Worldwide Box Office Earnings Distribution", x = "Worldwide Gross", y = "Count")

#Answer: Seems to be an exponential distribution with mode occuring at 0.

#2. In population, what is average global box earning? What is the std? What is the proportion of movies who global box earning exceeds budget?

average_globalbox_earning <- mean(movie_boxoffice_distinct$Worldwide_Gross)
print(average_globalbox_earning)
[1] 95.83149
std_globalbox_earning <- sd(movie_boxoffice_distinct$Worldwide_Gross)
print(std_globalbox_earning)
[1] 177.4594
global_earning_exceeds_budget <- movie_boxoffice_distinct %>%
  filter(Worldwide_Gross > Budget)
proportion_exceed <- nrow(global_earning_exceeds_budget) / nrow(movie_boxoffice_distinct)
print(proportion_exceed)
[1] 0.6461286

#Answer:Average global box earning is $95.83 million. Standard deviation is $177.46 million. Proportion of global box earning exceeding budget is 64.61%

#3. Take a random sample of 200 movies from the pop. Get histogram of global box earning, describe shape of distribution. set.seed(4869) movies_sample <- movie_boxoffice_distinct %>% sample_n(size = 200)

ggplot(movies_sample, aes(x = Worldwide_Gross)) + geom_histogram(fill = "lightblue", color = "black") + 
labs(title = "Worldwide Box Office Earnings Distribution", x = "Worldwide Gross", y = "Count")

#Answer: Seems to be an exponential distribution with mode occuring at 0. Also seems to be similar to the overall population histogram.

#4. In sample, what {is avg global box office earning? is std? is proportion of global box movie earning exceeding budget?} Are these summary stats from sample close to population paramets?

average_sample_earning <- mean(movies_sample$Worldwide_Gross)
print(average_sample_earning)
[1] 136.5527
std_sample_earning <- sd(movies_sample$Worldwide_Gross)
print(std_sample_earning)
[1] 231.5467
global_sample_earning_exceeds_budget <- movies_sample %>%
  filter(Worldwide_Gross > Budget)
proportion_sample_exceed <- nrow(global_sample_earning_exceeds_budget) / nrow(movie_boxoffice_distinct)
print(proportion_sample_exceed)
[1] 0.02813719

#Answer:Average global box earning is $136.55 million. Standard deviation is $231.55 million. Proportion of global box earning exceeding budget is 2.81%. These summary stats differ quite a bit from the population summary stats. Specifically about $40 million in avg, $54 million in std, and about 62% difference in proportion. This sample may contain more movies with lesser global box earnings than their budgets unlike the overall population explaining such low proportion.

#5.Take rand sample of n movies from the pop, calculate the avg global box office earning, and proportion of global box earning exceeding budget.

set.seed(4869)
sample_stats <- function(n, reps = 500) {
  movie_boxoffice_distinct %>%
    rep_sample_n(size = n, reps = reps) %>%
    group_by(replicate) %>%
    summarize(
      gross_avg = mean(Worldwide_Gross),
      proportion_ex = mean(Worldwide_Gross > Budget),
    )
}

n_val <- sample(50:500, 1)

output_ex <- sample_stats(n_val)
print(output_ex)

overall_avg <- mean(output_ex$gross_avg)
cat(
  "Sample Size =", n_val, 
  ": AVG Global Box Office Earnings =", round(overall_avg, 2),
  ", Proportion Exceeding Budget =", round(mean(output_ex$proportion_ex, na.rm = TRUE), 4)
  )
Sample Size = 78 : AVG Global Box Office Earnings = 95.06 , Proportion Exceeding Budget = 0.6478

#6 For each n=20, 50, 100, and 200, get histrogram of the avg global box earning using face_wrap(), also get mean and std error

set.seed(4869)
get_repetition_stats <- function(n, reps = 500) {
  movie_boxoffice_distinct %>%
    rep_sample_n(size = n, reps = reps) %>%
    group_by(replicate) %>%
      summarize(
        gross_mean = mean(Worldwide_Gross),
        proportion_exceed = mean(Worldwide_Gross > Budget)
      )
}

n_20 <- get_repetition_stats(20)
n_50 <- get_repetition_stats(50)
n_100 <- get_repetition_stats(100)
n_200 <- get_repetition_stats(200)

n_20$Sample_Size <- 20
n_50$Sample_Size <- 50
n_100$Sample_Size <- 100
n_200$Sample_Size <- 200
  
allSamplesDF <- bind_rows(n_20, n_50, n_100, n_200)

allSamplesDF$Sample_Size <- rep(c(20, 50, 100, 200), each = 500)

ggplot(allSamplesDF, aes(x = gross_mean)) + geom_histogram(fill = "lightblue", color = "black") + facet_wrap(~ Sample_Size, scales = "free") + labs(title = "Average Global Box Office Earnings Distribution by n Size", x = "Worldwide Gross Mean", y ="Count")

summary_stats <- allSamplesDF %>%
  group_by(Sample_Size) %>%
  summarize(
    mean_allgross = mean(gross_mean),
    std_err_allgross = sd(gross_mean) / sqrt(n())
  )
print(summary_stats)

#7. Compare distributions among the different n values, and also compare them to the distribution from the population in Q1 #Answer: For distrubtions among the different n values, starting at n = 20, more closely aligned with the distribution from the population in Q1, but mode no longer being at 0, but a value around $70 million. Going up the scale on the n values to 50, 100, and 200, the distribtuion was approaching normality, especially with n being 200. Although mode count decreased, the concisesness of it went up to around the value of $90 million.

#8. For each n = {20, 50, 100, 200}, get the histogram of the proportion of movies whose global box office earning exceeds budget, using face_wrap, also get mean and std error

set.seed(4869)
get_repetition_prop <- function(n, reps = 500) {
  movie_boxoffice_distinct %>%
    rep_sample_n(size = n, reps = reps) %>%
    group_by(replicate) %>%
      summarize(
        proportion_exceed = mean(Worldwide_Gross > Budget)
      )
}

pn_20 <- get_repetition_prop(20)
pn_50 <- get_repetition_prop(50)
pn_100 <- get_repetition_prop(100)
pn_200 <- get_repetition_prop(200)

pn_20$Sample_Size <- 20
pn_50$Sample_Size <- 50
pn_100$Sample_Size <- 100
pn_200$Sample_Size <- 200
  
allSamDF <- bind_rows(n_20, n_50, n_100, n_200)

allSamDF$Sample_Size <- rep(c(20, 50, 100, 200), each = 500)

ggplot(allSamDF, aes(x = proportion_exceed)) + geom_histogram(fill = "lightblue", color = "black") + facet_wrap(~ Sample_Size, scales = "free") + labs(title = "Proportion of Successful Movies by n Size", x = "Proportion of Worldwide Gross Exceeding Budget", y ="Count")

prop_summary_stats <- allSamDF %>%
  group_by(Sample_Size) %>%
  summarize(
    mean_proportion = mean(proportion_exceed),
    std_err_allgross = sd(proportion_exceed) / sqrt(n())
  )
print(prop_summary_stats)

#9. Compare the distributions among different n values. #Answer: For n = 20 describles a somewhat left-skewed distribtuion with mode being at 0.7. For n = 50, distribtuion appears to be normal, while at n = 100, repeating similarities with n = 20, but now there are two modes making it a bimodal left-skewed distribution. For N = 200, distribution appears to be more normal similar to n = 50.

#************************************************************************************************ #Part II: Bootstrapping

#10. Use data from Q3 as the initial sample, use bootstrapping method to resample once with 200 movies. Are there any duplicated movies, expected or not?

set.seed(4869)

bootstrap_samp <- movies_sample %>%
  rep_sample_n(size = 200, replace = TRUE) %>%
  summarize(gross_avg = mean(Worldwide_Gross))
print(bootstrap_samp)
set.seed(4869)
duplicateNum <- movies_sample %>%
  rep_sample_n(size = 200, replace = TRUE) %>%
  count(Movie) %>%
  filter(n > 1)
print(duplicateNum)

#Answer:Yes, there were duplicated movies, was this expected? Of course it was expected because we set replace to be TRUE allowing picked movies to be picked again.

#11.Get the histrogram of global box office earning in the bootstrap sample. Describe the shape of distribution and compare it to Q3

bootstrap2_samp <- movies_sample %>%
  rep_sample_n(size = 200, replace = TRUE)

ggplot(bootstrap2_samp, aes(x = Worldwide_Gross)) + geom_histogram(fill = "lightblue", color = "black") + labs(title = "Boostrap Sample Histogram of Worldwide Box Earnings", x = "Worldwide Gross", y ="Count")

#Answer: The shape of bootstrap sample histogram is closer to the exponential distribution, with mode still occuring at 0, and more variance with higher counts of outliers than as seen in Q3.

#12.In the bootstrap sample from Q10, what {is the avg global box earning, is the std, is the proportion of succesful movies?} Are they close enough to those in the intial sample?

avg_gross <- mean(bootstrap2_samp$Worldwide_Gross)
print(avg_gross)
[1] 127.9658
std_gross <- sd(bootstrap2_samp$Worldwide_Gross)
print(std_gross)
[1] 221.3411
prop_ex_bu <- mean(bootstrap2_samp$Worldwide_Gross > bootstrap2_samp$Budget)
print(prop_ex_bu)
[1] 0.69

#Answer: Average gross given is $127.97 million, Std dev is $221.34 million, and proportion of successful movies is 69%. These are pretty close to the intial values of avg gross being $136.55 million, std dev as $231.55 million, with the biggest defference being proportion from 2.81%. However, this is now closer to the overall population proportion of 64.61.

#13. Get the boostrapping distr of the avg global box earning, and proportion of movies whose global box earning exceeded budget, by resampling 500 times with bootstrapping method. Get the mean and std error of the average global box earning and mean and std error for proportion.

bootstrap_samples <- movies_sample %>%
  rep_sample_n(size = nrow(movies_sample), reps = 500, replace = TRUE)

bootstrap_stats <- bootstrap_samples %>%
  summarize(
    bootstrap_grossmean = mean(Worldwide_Gross),
    bootstrap_prop = mean(Worldwide_Gross > Budget)
  )
bootstrap_grossavg <- mean(bootstrap_stats$bootstrap_grossmean)
print(bootstrap_grossavg)
[1] 120.3005
bootstrap_std_grossavg <- sd(bootstrap_stats$bootstrap_grossmean)
print(bootstrap_std_grossavg)
[1] 14.59414
mean_prop <- mean(bootstrap_stats$bootstrap_prop)
print(mean_prop)
[1] 0.65442
se_prop <- sd(bootstrap_stats$bootstrap_prop) / sqrt(nrow(bootstrap_stats))
print(se_prop)
[1] 0.001605641
ggplot(bootstrap_stats, aes(x = bootstrap_grossmean)) + geom_histogram(fill = "lightblue", color = "black") + labs(title = "Average Global Box Office Earnings Distribution", x = "AVG Worldwide Gross", y = "Count")

ggplot(bootstrap_stats, aes(x = bootstrap_prop)) + geom_histogram(fill = "lightblue", color = "black") + labs(title = "Proportion of Successful Movies", x = "Successful Movies", y = "Count")

#Answer: Given mean of Average global office earning is $120.30 million, with std dev being $14.59 million. Proportion of succesful movies given is 65.44%, and the standard error for it is 0.16%. The distribution for Average Global Box Earnings is right leaning with occuring around $112 million, and for the poportion of succesful moves, distribution is more normal with a slight left skew and mode occuring around 67.5%.

LS0tDQp0aXRsZTogIlIgTm90ZWJvb2siDQpvdXRwdXQ6DQogIGh0bWxfbm90ZWJvb2s6IGRlZmF1bHQNCiAgcGRmX2RvY3VtZW50OiBkZWZhdWx0DQotLS0NCg0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KG1vZGVybmRpdmUpDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KHNraW1yKQ0KbGlicmFyeShnYXBtaW5kZXIpDQpsaWJyYXJ5KGluZmVyKQ0KDQpzZXQuc2VlZCg0ODY5KQ0KDQojYnJpbmdpbmcgaW4gZGF0YWZyYW1lLCBoYXMgNDk2OSBlbnRyaWVzIHdpdGggNyBjb2x1bW5zDQptb3ZpZV9ib3hvZmZpY2UuMSA8LSByZWFkLmNzdigiQzovVXNlcnMvemFoaXIvT25lRHJpdmUvRGVza3RvcC9SdXRnZXJzIFNlbWVzdGVyIEZvbGRlcnMvMjAyNCBGYWxsIFNlbWVzdGVyL0luZmVyZW5jZSBEYXRhIFNjaWVuY2UvSFcgNCBMYWIvbW92aWVfYm94b2ZmaWNlLTEuY3N2IikNCiAgVmlldyhtb3ZpZV9ib3hvZmZpY2UuMSkNCg0KI2NsZWFuaW5nIHVwIGRhdGFmcmFtZSBvZiBkdXBsaWNhdGVzLCBoYXMgNDg2OSBlbnRyaWVzIHdpdGggNyBjb2x1bW5zDQptb3ZpZV9ib3hvZmZpY2VfZGlzdGluY3QgPC0gbW92aWVfYm94b2ZmaWNlLjEgJT4lDQogIGRpc3RpbmN0KCkNCiAgdmlldyhtb3ZpZV9ib3hvZmZpY2VfZGlzdGluY3QpDQogIA0KIzAuIEhvdyBtYW55IGR1cGxpY2F0ZWQgcmVjb3JkcyB3ZXJlIHJlbW92ZWQgZnJvbSBib3hvZmZpY2UgZGF0YT8gV2hhdCBpcyB5b3VyIHJhbmRvbSBzZWVkIG51bWJlcj8NCiNBbnN3ZXI6IDEwMCBkdWJsaWNhdGVkIHJlY29yZHMoZW50cmllcykgd2VyZSByZW1vdmVkLCBhbmQgbXkgcmFuZG9tIHNlZWQgbnVtYmVyIGlzIHNldCB0byA0ODY5DQoNCiMqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiNQYXJ0IEk6IFNhbXBsaW5nDQojMS5UcmVhdCB0aGUgYm94IG9mZmljZSBkYXRhIGFzIHBvcHVsYXRpb24uIEhhdmUgYSBoaXN0b2dyYW0gb2YgdGhlIGdsb2JhbCBib3ggb2ZmaWNlIGVhcm5pbmcuIERlc2NyaWJlIHNoYXBlIG9mIGRpc3RyaWJ1dGlvbi4NCmBgYHtyIEhpc3RvZ3JhbSBvZiB0aGUgR2xvYmFsIEJveCBFYXJuaW5nfQ0KZ2dwbG90KG1vdmllX2JveG9mZmljZV9kaXN0aW5jdCwgYWVzKHggPSBXb3JsZHdpZGVfR3Jvc3MpKSArIGdlb21faGlzdG9ncmFtKGZpbGwgPSAibGlnaHRibHVlIiwgY29sb3IgPSAiYmxhY2siKSArIA0KbGFicyh0aXRsZSA9ICJXb3JsZHdpZGUgQm94IE9mZmljZSBFYXJuaW5ncyBEaXN0cmlidXRpb24iLCB4ID0gIldvcmxkd2lkZSBHcm9zcyIsIHkgPSAiQ291bnQiKQ0KYGBgDQojQW5zd2VyOiBTZWVtcyB0byBiZSBhbiBleHBvbmVudGlhbCBkaXN0cmlidXRpb24gd2l0aCBtb2RlIG9jY3VyaW5nIGF0IDAuDQoNCiMyLiBJbiBwb3B1bGF0aW9uLCB3aGF0IGlzIGF2ZXJhZ2UgZ2xvYmFsIGJveCBlYXJuaW5nPyBXaGF0IGlzIHRoZSBzdGQ/IFdoYXQgaXMgdGhlIHByb3BvcnRpb24gb2YgbW92aWVzIHdobyBnbG9iYWwgYm94IGVhcm5pbmcgZXhjZWVkcyBidWRnZXQ/DQpgYGB7ciBQYXJ0IDEgU3RlcCAyIENvZGV9DQphdmVyYWdlX2dsb2JhbGJveF9lYXJuaW5nIDwtIG1lYW4obW92aWVfYm94b2ZmaWNlX2Rpc3RpbmN0JFdvcmxkd2lkZV9Hcm9zcykNCnByaW50KGF2ZXJhZ2VfZ2xvYmFsYm94X2Vhcm5pbmcpDQoNCnN0ZF9nbG9iYWxib3hfZWFybmluZyA8LSBzZChtb3ZpZV9ib3hvZmZpY2VfZGlzdGluY3QkV29ybGR3aWRlX0dyb3NzKQ0KcHJpbnQoc3RkX2dsb2JhbGJveF9lYXJuaW5nKQ0KDQpnbG9iYWxfZWFybmluZ19leGNlZWRzX2J1ZGdldCA8LSBtb3ZpZV9ib3hvZmZpY2VfZGlzdGluY3QgJT4lDQogIGZpbHRlcihXb3JsZHdpZGVfR3Jvc3MgPiBCdWRnZXQpDQpwcm9wb3J0aW9uX2V4Y2VlZCA8LSBucm93KGdsb2JhbF9lYXJuaW5nX2V4Y2VlZHNfYnVkZ2V0KSAvIG5yb3cobW92aWVfYm94b2ZmaWNlX2Rpc3RpbmN0KQ0KcHJpbnQocHJvcG9ydGlvbl9leGNlZWQpDQpgYGANCiNBbnN3ZXI6QXZlcmFnZSBnbG9iYWwgYm94IGVhcm5pbmcgaXMgJDk1LjgzIG1pbGxpb24uIFN0YW5kYXJkIGRldmlhdGlvbiBpcyAkMTc3LjQ2IG1pbGxpb24uIFByb3BvcnRpb24gb2YgZ2xvYmFsIGJveCBlYXJuaW5nIGV4Y2VlZGluZyBidWRnZXQgaXMgNjQuNjElDQoNCiMzLiBUYWtlIGEgcmFuZG9tIHNhbXBsZSBvZiAyMDAgbW92aWVzIGZyb20gdGhlIHBvcC4gR2V0IGhpc3RvZ3JhbSBvZiBnbG9iYWwgYm94IGVhcm5pbmcsIGRlc2NyaWJlIHNoYXBlIG9mIGRpc3RyaWJ1dGlvbi4NCnNldC5zZWVkKDQ4NjkpDQptb3ZpZXNfc2FtcGxlIDwtIG1vdmllX2JveG9mZmljZV9kaXN0aW5jdCAlPiUNCiAgc2FtcGxlX24oc2l6ZSA9IDIwMCkNCmBgYHtyIFBhcnQgMSBTdGVwIDMgSGlzdG9ncmFtfQ0KZ2dwbG90KG1vdmllc19zYW1wbGUsIGFlcyh4ID0gV29ybGR3aWRlX0dyb3NzKSkgKyBnZW9tX2hpc3RvZ3JhbShmaWxsID0gImxpZ2h0Ymx1ZSIsIGNvbG9yID0gImJsYWNrIikgKyANCmxhYnModGl0bGUgPSAiV29ybGR3aWRlIEJveCBPZmZpY2UgRWFybmluZ3MgRGlzdHJpYnV0aW9uIiwgeCA9ICJXb3JsZHdpZGUgR3Jvc3MiLCB5ID0gIkNvdW50IikNCmBgYA0KI0Fuc3dlcjogU2VlbXMgdG8gYmUgYW4gZXhwb25lbnRpYWwgZGlzdHJpYnV0aW9uIHdpdGggbW9kZSBvY2N1cmluZyBhdCAwLiBBbHNvIHNlZW1zIHRvIGJlIHNpbWlsYXIgdG8gdGhlIG92ZXJhbGwgcG9wdWxhdGlvbiBoaXN0b2dyYW0uDQoNCiM0LiBJbiBzYW1wbGUsIHdoYXQge2lzIGF2ZyBnbG9iYWwgYm94IG9mZmljZSBlYXJuaW5nPyBpcyBzdGQ/IGlzIHByb3BvcnRpb24gb2YgZ2xvYmFsIGJveCBtb3ZpZSBlYXJuaW5nIGV4Y2VlZGluZyBidWRnZXQ/fSBBcmUgdGhlc2Ugc3VtbWFyeSBzdGF0cyBmcm9tIHNhbXBsZSBjbG9zZSB0byBwb3B1bGF0aW9uIHBhcmFtZXRzPw0KYGBge3IgUGFydCAxIFN0ZXAgNCBDb2RlfQ0KYXZlcmFnZV9zYW1wbGVfZWFybmluZyA8LSBtZWFuKG1vdmllc19zYW1wbGUkV29ybGR3aWRlX0dyb3NzKQ0KcHJpbnQoYXZlcmFnZV9zYW1wbGVfZWFybmluZykNCg0Kc3RkX3NhbXBsZV9lYXJuaW5nIDwtIHNkKG1vdmllc19zYW1wbGUkV29ybGR3aWRlX0dyb3NzKQ0KcHJpbnQoc3RkX3NhbXBsZV9lYXJuaW5nKQ0KDQpnbG9iYWxfc2FtcGxlX2Vhcm5pbmdfZXhjZWVkc19idWRnZXQgPC0gbW92aWVzX3NhbXBsZSAlPiUNCiAgZmlsdGVyKFdvcmxkd2lkZV9Hcm9zcyA+IEJ1ZGdldCkNCnByb3BvcnRpb25fc2FtcGxlX2V4Y2VlZCA8LSBucm93KGdsb2JhbF9zYW1wbGVfZWFybmluZ19leGNlZWRzX2J1ZGdldCkgLyBucm93KG1vdmllX2JveG9mZmljZV9kaXN0aW5jdCkNCnByaW50KHByb3BvcnRpb25fc2FtcGxlX2V4Y2VlZCkNCmBgYA0KI0Fuc3dlcjpBdmVyYWdlIGdsb2JhbCBib3ggZWFybmluZyBpcyAkMTM2LjU1IG1pbGxpb24uIFN0YW5kYXJkIGRldmlhdGlvbiBpcyAkMjMxLjU1IG1pbGxpb24uIFByb3BvcnRpb24gb2YgZ2xvYmFsIGJveCBlYXJuaW5nIGV4Y2VlZGluZyBidWRnZXQgaXMgMi44MSUuIFRoZXNlIHN1bW1hcnkgc3RhdHMgZGlmZmVyIHF1aXRlIGEgYml0IGZyb20gdGhlIHBvcHVsYXRpb24gc3VtbWFyeSBzdGF0cy4gU3BlY2lmaWNhbGx5IGFib3V0ICQ0MCBtaWxsaW9uIGluIGF2ZywgJDU0IG1pbGxpb24gaW4gc3RkLCBhbmQgYWJvdXQgNjIlIGRpZmZlcmVuY2UgaW4gcHJvcG9ydGlvbi4gVGhpcyBzYW1wbGUgbWF5IGNvbnRhaW4gbW9yZSBtb3ZpZXMgd2l0aCBsZXNzZXIgZ2xvYmFsIGJveCBlYXJuaW5ncyB0aGFuIHRoZWlyIGJ1ZGdldHMgdW5saWtlIHRoZSBvdmVyYWxsIHBvcHVsYXRpb24gZXhwbGFpbmluZyBzdWNoIGxvdyBwcm9wb3J0aW9uLg0KDQojNS5UYWtlIHJhbmQgc2FtcGxlIG9mIG4gbW92aWVzIGZyb20gdGhlIHBvcCwgY2FsY3VsYXRlIHRoZSBhdmcgZ2xvYmFsIGJveCBvZmZpY2UgZWFybmluZywgYW5kIHByb3BvcnRpb24gb2YgZ2xvYmFsIGJveCBlYXJuaW5nIGV4Y2VlZGluZyBidWRnZXQuDQpgYGB7ciA1MDAgSXRlcmF0aW9uc30NCnNldC5zZWVkKDQ4NjkpDQpzYW1wbGVfc3RhdHMgPC0gZnVuY3Rpb24obiwgcmVwcyA9IDUwMCkgew0KICBtb3ZpZV9ib3hvZmZpY2VfZGlzdGluY3QgJT4lDQogICAgcmVwX3NhbXBsZV9uKHNpemUgPSBuLCByZXBzID0gcmVwcykgJT4lDQogICAgZ3JvdXBfYnkocmVwbGljYXRlKSAlPiUNCiAgICBzdW1tYXJpemUoDQogICAgICBncm9zc19hdmcgPSBtZWFuKFdvcmxkd2lkZV9Hcm9zcyksDQogICAgICBwcm9wb3J0aW9uX2V4ID0gbWVhbihXb3JsZHdpZGVfR3Jvc3MgPiBCdWRnZXQpLA0KICAgICkNCn0NCg0Kbl92YWwgPC0gc2FtcGxlKDUwOjUwMCwgMSkNCg0Kb3V0cHV0X2V4IDwtIHNhbXBsZV9zdGF0cyhuX3ZhbCkNCnByaW50KG91dHB1dF9leCkNCg0Kb3ZlcmFsbF9hdmcgPC0gbWVhbihvdXRwdXRfZXgkZ3Jvc3NfYXZnKQ0KY2F0KA0KICAiU2FtcGxlIFNpemUgPSIsIG5fdmFsLCANCiAgIjogQVZHIEdsb2JhbCBCb3ggT2ZmaWNlIEVhcm5pbmdzID0iLCByb3VuZChvdmVyYWxsX2F2ZywgMiksDQogICIsIFByb3BvcnRpb24gRXhjZWVkaW5nIEJ1ZGdldCA9Iiwgcm91bmQobWVhbihvdXRwdXRfZXgkcHJvcG9ydGlvbl9leCwgbmEucm0gPSBUUlVFKSwgNCkNCiAgKQ0KYGBgDQoNCiM2IEZvciBlYWNoIG49MjAsIDUwLCAxMDAsIGFuZCAyMDAsIGdldCBoaXN0cm9ncmFtIG9mIHRoZSBhdmcgZ2xvYmFsIGJveCBlYXJuaW5nIHVzaW5nIGZhY2Vfd3JhcCgpLCBhbHNvIGdldCBtZWFuIGFuZCBzdGQgZXJyb3INCg0KYGBge3IgSGlzdG9ncmFtIGJ5IG4gU2l6ZX0NCnNldC5zZWVkKDQ4NjkpDQpnZXRfcmVwZXRpdGlvbl9zdGF0cyA8LSBmdW5jdGlvbihuLCByZXBzID0gNTAwKSB7DQogIG1vdmllX2JveG9mZmljZV9kaXN0aW5jdCAlPiUNCiAgICByZXBfc2FtcGxlX24oc2l6ZSA9IG4sIHJlcHMgPSByZXBzKSAlPiUNCiAgICBncm91cF9ieShyZXBsaWNhdGUpICU+JQ0KICAgICAgc3VtbWFyaXplKA0KICAgICAgICBncm9zc19tZWFuID0gbWVhbihXb3JsZHdpZGVfR3Jvc3MpLA0KICAgICAgICBwcm9wb3J0aW9uX2V4Y2VlZCA9IG1lYW4oV29ybGR3aWRlX0dyb3NzID4gQnVkZ2V0KQ0KICAgICAgKQ0KfQ0KDQpuXzIwIDwtIGdldF9yZXBldGl0aW9uX3N0YXRzKDIwKQ0Kbl81MCA8LSBnZXRfcmVwZXRpdGlvbl9zdGF0cyg1MCkNCm5fMTAwIDwtIGdldF9yZXBldGl0aW9uX3N0YXRzKDEwMCkNCm5fMjAwIDwtIGdldF9yZXBldGl0aW9uX3N0YXRzKDIwMCkNCg0Kbl8yMCRTYW1wbGVfU2l6ZSA8LSAyMA0Kbl81MCRTYW1wbGVfU2l6ZSA8LSA1MA0Kbl8xMDAkU2FtcGxlX1NpemUgPC0gMTAwDQpuXzIwMCRTYW1wbGVfU2l6ZSA8LSAyMDANCiAgDQphbGxTYW1wbGVzREYgPC0gYmluZF9yb3dzKG5fMjAsIG5fNTAsIG5fMTAwLCBuXzIwMCkNCg0KYWxsU2FtcGxlc0RGJFNhbXBsZV9TaXplIDwtIHJlcChjKDIwLCA1MCwgMTAwLCAyMDApLCBlYWNoID0gNTAwKQ0KDQpnZ3Bsb3QoYWxsU2FtcGxlc0RGLCBhZXMoeCA9IGdyb3NzX21lYW4pKSArIGdlb21faGlzdG9ncmFtKGZpbGwgPSAibGlnaHRibHVlIiwgY29sb3IgPSAiYmxhY2siKSArIGZhY2V0X3dyYXAofiBTYW1wbGVfU2l6ZSwgc2NhbGVzID0gImZyZWUiKSArIGxhYnModGl0bGUgPSAiQXZlcmFnZSBHbG9iYWwgQm94IE9mZmljZSBFYXJuaW5ncyBEaXN0cmlidXRpb24gYnkgbiBTaXplIiwgeCA9ICJXb3JsZHdpZGUgR3Jvc3MgTWVhbiIsIHkgPSJDb3VudCIpDQpgYGANCmBgYHtyIE1lYW4gYW5kIHN0ZCBlcnJvciBvZiBhdmVyYWdlIGdsb2JhbCBib3ggZWFybmluZ30NCnN1bW1hcnlfc3RhdHMgPC0gYWxsU2FtcGxlc0RGICU+JQ0KICBncm91cF9ieShTYW1wbGVfU2l6ZSkgJT4lDQogIHN1bW1hcml6ZSgNCiAgICBtZWFuX2FsbGdyb3NzID0gbWVhbihncm9zc19tZWFuKSwNCiAgICBzdGRfZXJyX2FsbGdyb3NzID0gc2QoZ3Jvc3NfbWVhbikgLyBzcXJ0KG4oKSkNCiAgKQ0KcHJpbnQoc3VtbWFyeV9zdGF0cykNCmBgYA0KDQojNy4gQ29tcGFyZSBkaXN0cmlidXRpb25zIGFtb25nIHRoZSBkaWZmZXJlbnQgbiB2YWx1ZXMsIGFuZCBhbHNvIGNvbXBhcmUgdGhlbSB0byB0aGUgZGlzdHJpYnV0aW9uIGZyb20gdGhlIHBvcHVsYXRpb24gaW4gUTENCiNBbnN3ZXI6IEZvciBkaXN0cnVidGlvbnMgYW1vbmcgdGhlIGRpZmZlcmVudCBuIHZhbHVlcywgc3RhcnRpbmcgYXQgbiA9IDIwLCBtb3JlIGNsb3NlbHkgYWxpZ25lZCB3aXRoIHRoZSBkaXN0cmlidXRpb24gZnJvbSB0aGUgcG9wdWxhdGlvbiBpbiBRMSwgYnV0IG1vZGUgbm8gbG9uZ2VyIGJlaW5nIGF0IDAsIGJ1dCBhIHZhbHVlIGFyb3VuZCAkNzAgbWlsbGlvbi4gR29pbmcgdXAgdGhlIHNjYWxlIG9uIHRoZSBuIHZhbHVlcyB0byA1MCwgMTAwLCBhbmQgMjAwLCB0aGUgZGlzdHJpYnR1aW9uIHdhcyBhcHByb2FjaGluZyBub3JtYWxpdHksIGVzcGVjaWFsbHkgd2l0aCBuIGJlaW5nIDIwMC4gQWx0aG91Z2ggbW9kZSBjb3VudCBkZWNyZWFzZWQsIHRoZSBjb25jaXNlc25lc3Mgb2YgaXQgd2VudCB1cCB0byBhcm91bmQgdGhlIHZhbHVlIG9mICQ5MCBtaWxsaW9uLg0KDQojOC4gRm9yIGVhY2ggbiA9IHsyMCwgNTAsIDEwMCwgMjAwfSwgZ2V0IHRoZSBoaXN0b2dyYW0gb2YgdGhlIHByb3BvcnRpb24gb2YgbW92aWVzIHdob3NlIGdsb2JhbCBib3ggb2ZmaWNlIGVhcm5pbmcgZXhjZWVkcyBidWRnZXQsIHVzaW5nIGZhY2Vfd3JhcCwgYWxzbyBnZXQgbWVhbiBhbmQgc3RkIGVycm9yDQpgYGB7ciBIaXN0b2dyYW1zIG9mIFByb3BvcnRpb24gb2YgU3VjY2Vzc2Z1bCBNb3ZpZXMgYnkgbiBTaXplfQ0Kc2V0LnNlZWQoNDg2OSkNCmdldF9yZXBldGl0aW9uX3Byb3AgPC0gZnVuY3Rpb24obiwgcmVwcyA9IDUwMCkgew0KICBtb3ZpZV9ib3hvZmZpY2VfZGlzdGluY3QgJT4lDQogICAgcmVwX3NhbXBsZV9uKHNpemUgPSBuLCByZXBzID0gcmVwcykgJT4lDQogICAgZ3JvdXBfYnkocmVwbGljYXRlKSAlPiUNCiAgICAgIHN1bW1hcml6ZSgNCiAgICAgICAgcHJvcG9ydGlvbl9leGNlZWQgPSBtZWFuKFdvcmxkd2lkZV9Hcm9zcyA+IEJ1ZGdldCkNCiAgICAgICkNCn0NCg0KcG5fMjAgPC0gZ2V0X3JlcGV0aXRpb25fcHJvcCgyMCkNCnBuXzUwIDwtIGdldF9yZXBldGl0aW9uX3Byb3AoNTApDQpwbl8xMDAgPC0gZ2V0X3JlcGV0aXRpb25fcHJvcCgxMDApDQpwbl8yMDAgPC0gZ2V0X3JlcGV0aXRpb25fcHJvcCgyMDApDQoNCnBuXzIwJFNhbXBsZV9TaXplIDwtIDIwDQpwbl81MCRTYW1wbGVfU2l6ZSA8LSA1MA0KcG5fMTAwJFNhbXBsZV9TaXplIDwtIDEwMA0KcG5fMjAwJFNhbXBsZV9TaXplIDwtIDIwMA0KICANCmFsbFNhbURGIDwtIGJpbmRfcm93cyhuXzIwLCBuXzUwLCBuXzEwMCwgbl8yMDApDQoNCmFsbFNhbURGJFNhbXBsZV9TaXplIDwtIHJlcChjKDIwLCA1MCwgMTAwLCAyMDApLCBlYWNoID0gNTAwKQ0KDQpnZ3Bsb3QoYWxsU2FtREYsIGFlcyh4ID0gcHJvcG9ydGlvbl9leGNlZWQpKSArIGdlb21faGlzdG9ncmFtKGZpbGwgPSAibGlnaHRibHVlIiwgY29sb3IgPSAiYmxhY2siKSArIGZhY2V0X3dyYXAofiBTYW1wbGVfU2l6ZSwgc2NhbGVzID0gImZyZWUiKSArIGxhYnModGl0bGUgPSAiUHJvcG9ydGlvbiBvZiBTdWNjZXNzZnVsIE1vdmllcyBieSBuIFNpemUiLCB4ID0gIlByb3BvcnRpb24gb2YgV29ybGR3aWRlIEdyb3NzIEV4Y2VlZGluZyBCdWRnZXQiLCB5ID0iQ291bnQiKQ0KYGBgDQpgYGB7cn0NCnByb3Bfc3VtbWFyeV9zdGF0cyA8LSBhbGxTYW1ERiAlPiUNCiAgZ3JvdXBfYnkoU2FtcGxlX1NpemUpICU+JQ0KICBzdW1tYXJpemUoDQogICAgbWVhbl9wcm9wb3J0aW9uID0gbWVhbihwcm9wb3J0aW9uX2V4Y2VlZCksDQogICAgc3RkX2Vycl9hbGxncm9zcyA9IHNkKHByb3BvcnRpb25fZXhjZWVkKSAvIHNxcnQobigpKQ0KICApDQpwcmludChwcm9wX3N1bW1hcnlfc3RhdHMpDQpgYGANCg0KIzkuIENvbXBhcmUgdGhlIGRpc3RyaWJ1dGlvbnMgYW1vbmcgZGlmZmVyZW50IG4gdmFsdWVzLiANCiNBbnN3ZXI6IEZvciBuID0gMjAgZGVzY3JpYmxlcyBhIHNvbWV3aGF0IGxlZnQtc2tld2VkIGRpc3RyaWJ0dWlvbiB3aXRoIG1vZGUgYmVpbmcgYXQgMC43LiBGb3IgbiA9IDUwLCBkaXN0cmlidHVpb24gYXBwZWFycyB0byBiZSBub3JtYWwsIHdoaWxlIGF0IG4gPSAxMDAsIHJlcGVhdGluZyBzaW1pbGFyaXRpZXMgd2l0aCBuID0gMjAsIGJ1dCBub3cgdGhlcmUgYXJlIHR3byBtb2RlcyBtYWtpbmcgaXQgYSBiaW1vZGFsIGxlZnQtc2tld2VkIGRpc3RyaWJ1dGlvbi4gRm9yIE4gPSAyMDAsIGRpc3RyaWJ1dGlvbiBhcHBlYXJzIHRvIGJlIG1vcmUgbm9ybWFsIHNpbWlsYXIgdG8gbiA9IDUwLg0KDQojKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQojUGFydCBJSTogQm9vdHN0cmFwcGluZw0KDQojMTAuIFVzZSBkYXRhIGZyb20gUTMgYXMgdGhlIGluaXRpYWwgc2FtcGxlLCB1c2UgYm9vdHN0cmFwcGluZyBtZXRob2QgdG8gcmVzYW1wbGUgb25jZSB3aXRoIDIwMCBtb3ZpZXMuIEFyZSB0aGVyZSBhbnkgZHVwbGljYXRlZCBtb3ZpZXMsIGV4cGVjdGVkIG9yIG5vdD8NCmBgYHtyfQ0Kc2V0LnNlZWQoNDg2OSkNCg0KYm9vdHN0cmFwX3NhbXAgPC0gbW92aWVzX3NhbXBsZSAlPiUNCiAgcmVwX3NhbXBsZV9uKHNpemUgPSAyMDAsIHJlcGxhY2UgPSBUUlVFKSAlPiUNCiAgc3VtbWFyaXplKGdyb3NzX2F2ZyA9IG1lYW4oV29ybGR3aWRlX0dyb3NzKSkNCnByaW50KGJvb3RzdHJhcF9zYW1wKQ0KYGBgDQpgYGB7cn0NCnNldC5zZWVkKDQ4NjkpDQpkdXBsaWNhdGVOdW0gPC0gbW92aWVzX3NhbXBsZSAlPiUNCiAgcmVwX3NhbXBsZV9uKHNpemUgPSAyMDAsIHJlcGxhY2UgPSBUUlVFKSAlPiUNCiAgY291bnQoTW92aWUpICU+JQ0KICBmaWx0ZXIobiA+IDEpDQpwcmludChkdXBsaWNhdGVOdW0pDQpgYGANCg0KI0Fuc3dlcjpZZXMsIHRoZXJlIHdlcmUgZHVwbGljYXRlZCBtb3ZpZXMsIHdhcyB0aGlzIGV4cGVjdGVkPyBPZiBjb3Vyc2UgaXQgd2FzIGV4cGVjdGVkIGJlY2F1c2Ugd2Ugc2V0IHJlcGxhY2UgdG8gYmUgVFJVRSBhbGxvd2luZyBwaWNrZWQgbW92aWVzIHRvIGJlIHBpY2tlZCBhZ2Fpbi4NCg0KIzExLkdldCB0aGUgaGlzdHJvZ3JhbSBvZiBnbG9iYWwgYm94IG9mZmljZSBlYXJuaW5nIGluIHRoZSBib290c3RyYXAgc2FtcGxlLiBEZXNjcmliZSB0aGUgc2hhcGUgb2YgZGlzdHJpYnV0aW9uIGFuZCBjb21wYXJlIGl0IHRvIFEzDQpgYGB7cn0NCmJvb3RzdHJhcDJfc2FtcCA8LSBtb3ZpZXNfc2FtcGxlICU+JQ0KICByZXBfc2FtcGxlX24oc2l6ZSA9IDIwMCwgcmVwbGFjZSA9IFRSVUUpDQoNCmdncGxvdChib290c3RyYXAyX3NhbXAsIGFlcyh4ID0gV29ybGR3aWRlX0dyb3NzKSkgKyBnZW9tX2hpc3RvZ3JhbShmaWxsID0gImxpZ2h0Ymx1ZSIsIGNvbG9yID0gImJsYWNrIikgKyBsYWJzKHRpdGxlID0gIkJvb3N0cmFwIFNhbXBsZSBIaXN0b2dyYW0gb2YgV29ybGR3aWRlIEJveCBFYXJuaW5ncyIsIHggPSAiV29ybGR3aWRlIEdyb3NzIiwgeSA9IkNvdW50IikNCmBgYA0KI0Fuc3dlcjogVGhlIHNoYXBlIG9mIGJvb3RzdHJhcCBzYW1wbGUgaGlzdG9ncmFtIGlzIGNsb3NlciB0byB0aGUgZXhwb25lbnRpYWwgZGlzdHJpYnV0aW9uLCB3aXRoIG1vZGUgc3RpbGwgb2NjdXJpbmcgYXQgMCwgYW5kIG1vcmUgdmFyaWFuY2Ugd2l0aCBoaWdoZXIgY291bnRzIG9mIG91dGxpZXJzIHRoYW4gYXMgc2VlbiBpbiBRMy4NCg0KIzEyLkluIHRoZSBib290c3RyYXAgc2FtcGxlIGZyb20gUTEwLCB3aGF0IHtpcyB0aGUgYXZnIGdsb2JhbCBib3ggZWFybmluZywgaXMgdGhlIHN0ZCwgaXMgdGhlIHByb3BvcnRpb24gb2Ygc3VjY2VzZnVsIG1vdmllcz99IEFyZSB0aGV5IGNsb3NlIGVub3VnaCB0byB0aG9zZSBpbiB0aGUgaW50aWFsIHNhbXBsZT8NCmBgYHtyfQ0KYXZnX2dyb3NzIDwtIG1lYW4oYm9vdHN0cmFwMl9zYW1wJFdvcmxkd2lkZV9Hcm9zcykNCnByaW50KGF2Z19ncm9zcykNCg0Kc3RkX2dyb3NzIDwtIHNkKGJvb3RzdHJhcDJfc2FtcCRXb3JsZHdpZGVfR3Jvc3MpDQpwcmludChzdGRfZ3Jvc3MpDQoNCnByb3BfZXhfYnUgPC0gbWVhbihib290c3RyYXAyX3NhbXAkV29ybGR3aWRlX0dyb3NzID4gYm9vdHN0cmFwMl9zYW1wJEJ1ZGdldCkNCnByaW50KHByb3BfZXhfYnUpDQpgYGANCiNBbnN3ZXI6IEF2ZXJhZ2UgZ3Jvc3MgZ2l2ZW4gaXMgJDEyNy45NyBtaWxsaW9uLCBTdGQgZGV2IGlzICQyMjEuMzQgbWlsbGlvbiwgYW5kIHByb3BvcnRpb24gb2Ygc3VjY2Vzc2Z1bCBtb3ZpZXMgaXMgNjklLiBUaGVzZSBhcmUgcHJldHR5IGNsb3NlIHRvIHRoZSBpbnRpYWwgdmFsdWVzIG9mIGF2ZyBncm9zcyBiZWluZyAkMTM2LjU1IG1pbGxpb24sIHN0ZCBkZXYgYXMgJDIzMS41NSBtaWxsaW9uLCB3aXRoIHRoZSBiaWdnZXN0IGRlZmZlcmVuY2UgYmVpbmcgcHJvcG9ydGlvbiBmcm9tIDIuODElLiBIb3dldmVyLCB0aGlzIGlzIG5vdyBjbG9zZXIgdG8gdGhlIG92ZXJhbGwgcG9wdWxhdGlvbiBwcm9wb3J0aW9uIG9mIDY0LjYxLg0KDQojMTMuIEdldCB0aGUgYm9vc3RyYXBwaW5nIGRpc3RyIG9mIHRoZSBhdmcgZ2xvYmFsIGJveCBlYXJuaW5nLCBhbmQgcHJvcG9ydGlvbiBvZiBtb3ZpZXMgd2hvc2UgZ2xvYmFsIGJveCBlYXJuaW5nIGV4Y2VlZGVkIGJ1ZGdldCwgYnkgcmVzYW1wbGluZyA1MDAgdGltZXMgd2l0aCBib290c3RyYXBwaW5nIG1ldGhvZC4gR2V0IHRoZSBtZWFuIGFuZCBzdGQgZXJyb3Igb2YgdGhlIGF2ZXJhZ2UgZ2xvYmFsIGJveCBlYXJuaW5nIGFuZCBtZWFuIGFuZCBzdGQgZXJyb3IgZm9yIHByb3BvcnRpb24uDQpgYGB7cn0NCmJvb3RzdHJhcF9zYW1wbGVzIDwtIG1vdmllc19zYW1wbGUgJT4lDQogIHJlcF9zYW1wbGVfbihzaXplID0gbnJvdyhtb3ZpZXNfc2FtcGxlKSwgcmVwcyA9IDUwMCwgcmVwbGFjZSA9IFRSVUUpDQoNCmJvb3RzdHJhcF9zdGF0cyA8LSBib290c3RyYXBfc2FtcGxlcyAlPiUNCiAgc3VtbWFyaXplKA0KICAgIGJvb3RzdHJhcF9ncm9zc21lYW4gPSBtZWFuKFdvcmxkd2lkZV9Hcm9zcyksDQogICAgYm9vdHN0cmFwX3Byb3AgPSBtZWFuKFdvcmxkd2lkZV9Hcm9zcyA+IEJ1ZGdldCkNCiAgKQ0KYm9vdHN0cmFwX2dyb3NzYXZnIDwtIG1lYW4oYm9vdHN0cmFwX3N0YXRzJGJvb3RzdHJhcF9ncm9zc21lYW4pDQpwcmludChib290c3RyYXBfZ3Jvc3NhdmcpDQoNCmJvb3RzdHJhcF9zdGRfZ3Jvc3NhdmcgPC0gc2QoYm9vdHN0cmFwX3N0YXRzJGJvb3RzdHJhcF9ncm9zc21lYW4pDQpwcmludChib290c3RyYXBfc3RkX2dyb3NzYXZnKQ0KDQptZWFuX3Byb3AgPC0gbWVhbihib290c3RyYXBfc3RhdHMkYm9vdHN0cmFwX3Byb3ApDQpwcmludChtZWFuX3Byb3ApDQoNCnNlX3Byb3AgPC0gc2QoYm9vdHN0cmFwX3N0YXRzJGJvb3RzdHJhcF9wcm9wKSAvIHNxcnQobnJvdyhib290c3RyYXBfc3RhdHMpKQ0KcHJpbnQoc2VfcHJvcCkNCmBgYA0KYGBge3IgRWFybmluZ3MgRGlzdHJpYnV0aW9uIH0NCmdncGxvdChib290c3RyYXBfc3RhdHMsIGFlcyh4ID0gYm9vdHN0cmFwX2dyb3NzbWVhbikpICsgZ2VvbV9oaXN0b2dyYW0oZmlsbCA9ICJsaWdodGJsdWUiLCBjb2xvciA9ICJibGFjayIpICsgbGFicyh0aXRsZSA9ICJBdmVyYWdlIEdsb2JhbCBCb3ggT2ZmaWNlIEVhcm5pbmdzIERpc3RyaWJ1dGlvbiIsIHggPSAiQVZHIFdvcmxkd2lkZSBHcm9zcyIsIHkgPSAiQ291bnQiKQ0KYGBgDQpgYGB7cn0NCmdncGxvdChib290c3RyYXBfc3RhdHMsIGFlcyh4ID0gYm9vdHN0cmFwX3Byb3ApKSArIGdlb21faGlzdG9ncmFtKGZpbGwgPSAibGlnaHRibHVlIiwgY29sb3IgPSAiYmxhY2siKSArIGxhYnModGl0bGUgPSAiUHJvcG9ydGlvbiBvZiBTdWNjZXNzZnVsIE1vdmllcyIsIHggPSAiU3VjY2Vzc2Z1bCBNb3ZpZXMiLCB5ID0gIkNvdW50IikNCg0KYGBgDQoNCiNBbnN3ZXI6IEdpdmVuIG1lYW4gb2YgQXZlcmFnZSBnbG9iYWwgb2ZmaWNlIGVhcm5pbmcgaXMgJDEyMC4zMCBtaWxsaW9uLCB3aXRoIHN0ZCBkZXYgYmVpbmcgJDE0LjU5IG1pbGxpb24uIFByb3BvcnRpb24gb2Ygc3VjY2VzZnVsIG1vdmllcyBnaXZlbiBpcyA2NS40NCUsIGFuZCB0aGUgc3RhbmRhcmQgZXJyb3IgZm9yIGl0IGlzIDAuMTYlLiBUaGUgZGlzdHJpYnV0aW9uIGZvciBBdmVyYWdlIEdsb2JhbCBCb3ggRWFybmluZ3MgaXMgcmlnaHQgbGVhbmluZyB3aXRoIG9jY3VyaW5nIGFyb3VuZCAkMTEyIG1pbGxpb24sIGFuZCBmb3IgdGhlIHBvcG9ydGlvbiBvZiBzdWNjZXNmdWwgbW92ZXMsIGRpc3RyaWJ1dGlvbiBpcyBtb3JlIG5vcm1hbCB3aXRoIGEgc2xpZ2h0IGxlZnQgc2tldyBhbmQgbW9kZSBvY2N1cmluZyBhcm91bmQgNjcuNSUuDQoNCg==