## Warning: package 'ggplot2' was built under R version 4.0.4
library(openintro)
library(ggplot2)
library(lattice)
## Warning: package 'lattice' was built under R version 4.0.4
## Warning in data("i_COHb"): data set 'i_COHb' not found
## Warning in data("df"): data set 'df' not found
Question 1
Systolic blood pressure rates for treated hypertensive adults in the U.S. follow a roughly bell curve distribution with:mean = 130 mm HG and standard deviation = 7.1 mmHg
- Label the bell curve (to the left) with appropriate raw data values for systolic blood pressure rates.
b.Calculate the z-score (using z=(y-μ)/σ ) for a treated hypertensive American adult with systolic blood pressure of 148. Label this point on your curve above.
What percentage of this adult population have systolic blood pressure rates between 100 and 135? Draw/Label/Shade to show this answer. Show how you arrive at your solution, and use proper notation with your solution.
What blood pressure rate represents the top 5% or higher for this population of adults? Draw/Label/Shade to show this answer.
Answer
1A - 1C: See Below 1D: According to z-scores, the top 5% fall between 130 and 135.
# 1A. Bell curve and raw data
#population mean and standard deviation
population_mean <- 130
population_sd <- 7.1
#upper and lower bound
lower_bound <- population_mean - population_sd
upper_bound <- population_mean + population_sd
#Create a sequence of 50 x values based on population mean and standard deviation
x <- seq(-4, 4, length = 50) * population_sd + population_mean
#create a vector of values that shows the height of the probability distribution
#for each value in x
y <- dnorm(x, population_mean, population_sd)
#plot normal distribution with customized x-axis labels
plot(x,y, type = "l", lwd = 2, axes = FALSE, xlab = "mm HG", ylab = "")
sd_axis_bounds = 5
axis_bounds <- seq(-sd_axis_bounds * population_sd + population_mean,
sd_axis_bounds * population_sd + population_mean,
by = population_sd)
axis(side = 1, at = axis_bounds, pos = 0)

# 1B. p-value = z score of .005619 at 148
z <- (148 - population_mean) / population_sd
list(z) #The probability of a systolic pressure of 148 or greater according to the p-value of 2.535 is .005619 (very small).
## [[1]]
## [1] 2.535211
# 1c. What percentage of this adult population have systolic blood pressure rates between 100 and 135? Draw/Label/Shade to show this answer. Show how you arrive at your solution, and use proper notation with your solution.
z <- (100 - population_mean) / population_sd
list(z)
## [[1]]
## [1] -4.225352
z <- (135 - population_mean) / population_sd
list(z)
## [[1]]
## [1] 0.7042254
#With a Z score o (number of standard deviations from the mean) f -4.225, the probability of X<100 = .00001; x>100 = .99999 ; 100<X<130 =.4999
#With a z score of .704, the p(x)<135 = .759; p(x)>135 = .241; p(130<x<135)=.259
Question 2
A student researcher tries to determine the proportion of students with advanced degrees who take at least one class at Montgomery College. In a post-pandemic environment, she stands outside the MC library and asks the first 20 people who walk by whether they have advanced degrees or not. She found that 12/20 people said they did have advanced degrees, so she concluded that 60% of all students at Montgomery College have advanced degrees. Briefly describe at least three things that made this a poor study (use proper statistical terminology/vocabulary).
Answer
Sample size: The number of individuals included in the sample depends on various factors, including the size and variability of the MC population. Selecting the first 20 to enter a single building on a particular day at a particular time contributes to a poorly designed study. Other factors should be considered. As we recently learned, When the sample size increases, the distribution becomes more normal. The mean (center point of the distribution) is more accurate when the sample size is larger. A larger sample size has a smaller spread and is preferable for a sampling distribution
Number of Samples: In this case, there is only one sample from the entire MC population, and there is no account for any distribution data. With an increased number of samples (for example, 25 samples, each with 50 observations), each element would be the mean of the random samples. A histogram would display the sampling size and the distribution. By increasing the number of samples, there would be a more accurate estimate of the population proportion.
Data provided - 12/20 (60%) isn’t representative of the population. The student researcher should look at mean, standard deviation, 5-number summary, histograms, box-plots, and the Shapiro Wilkes test to determine if the sample data comes from a population that is normally distributed.
In summary, biased, small sample, non-representative population. The researcher placed herself in front of the library which is only where a few students will pass by. Finally, it is voluntary, because students do not need to respond to the questions. In summary, the study results are not useful.
Question 3 - SEE WRITTEN EXAM FOR SOLUTION
Question 4
SEE WRITTEN EXAM FOR Rest of SOLUTION - I attempted to do some of it in R.
The prevalence of color blindness in males is 3%. Let Y denote the number with color blindness out of a random sample of seven
What would the expected mean and standard deviation of this binomial distribution? Also, would it be appropriate to use normal distribution calculations for this type of sample – why or why not?
Complete the table above.
Find Pr{Y≥4} PR{Y<_2}
testB <- 0:7
plot(testB,dbinom(testB,size=7,prob=.03),
type='h',
main='Binomial Distribution (n=7, p=0.03)',
ylab='Color Blindness',
xlab ='',
lwd=3)

##display probability of success for each number of trials
#dbinom(success, size=7, prob=.3)
Question 5
- Twenty-one years of deaths due to the flu virus were recorded for a particular region.
The data below are given for each year from 1985 – 2005. 35 41 55 65 29 60 49 24 37 110 28 40 47 58 30 37 15 50 28 37 41
ANSWERSEE BELOW a. Create a histogram of the data including a scale for the vertical frequency axis.
b. Find the mean and standard deviation, and the 5-number summary for the data. Be sure to include appropriate symbols as well. c. Create a box plot of the data. .Show appropriate scale along number line. Also perform the outlier test for the upper fence (Q_3+1.5*IQR)d. d. Below, create a Normal Quantile Plot (qqnorm and qqline) for the flu data, then compute the Shapiro Wilkes test.
In a short paragraph, provide a detailed explanation of how these three components fit together to describe the shape of the distribution. Be sure to include any conclusions about the results of your findings
The histogram shows the distribution and the spread of the variable (deaths due to flu). In the image below, it tends to skew a bit to the left in its distributions. Since it uses area instead of height to represent values, the width of bars can vary. The box plot standardizes the distribution of data based on the five number summary (“minimum”, first quartile (Q1), median, third quartile (Q3), and “maximum (upper fence”). The Normal Quantile Plot was used to test the normality of the data by plotting the data against a standard normal distribution. The flu data was used to create a sample with standard normal distribution and then compared against the original input set. With the Shapiro Wilkes test, my final conclusion is that the sample data comes from a population that is normally distributed.
#Put deaths into a data frame and check data by printing
i_COHb <- c("35", "41","55", "65","29","60", "49", "24", "37", "110", "28", "40", "47", "58", "30", "37", "15", "50", "28", "37", "41")
df <-data.frame(i_COHb)
print(df)
## i_COHb
## 1 35
## 2 41
## 3 55
## 4 65
## 5 29
## 6 60
## 7 49
## 8 24
## 9 37
## 10 110
## 11 28
## 12 40
## 13 47
## 14 58
## 15 30
## 16 37
## 17 15
## 18 50
## 19 28
## 20 37
## 21 41
# 5B - Calculations
#Since I don't know how to draw symbols using R, I included extra calculations for the data.
#The 5 Number Summary gives us the distribution of the observations. We don't have to decide on the most appropriate summary statistic. The five-number summary gives information about the location (from the median), spread (from the quartiles) and range (from the sample minimum and maximum) of the observations.
i_COHb <- as.numeric(i_COHb)
mean(i_COHb) #mean
## [1] 43.61905
## [1] 40
sd(i_COHb) #standard deviation
## [1] 19.84055
## [1] 20
fivenum(i_COHb) #5-number summary (110 is the outlier upper fence)
## [1] 15 30 40 50 110
# 5C - Box Plot
df <- as.numeric(i_COHb)
boxplot(df, notch=TRUE)

boxplot(df,
main = "Deaths Due to Flu")
# legend
legend("topright", legend = "Boxplot",
fill = rgb(1, 0, 0, alpha = 0.4), # Color
inset = c(0.03, 0.05), # Modify margins
bg = "white") # Legend background color

#110 is the outlier upper fence of the box plot
# 5A - HISTOGRAM
hist(df, # Change number of histogram breaks
breaks = 50)

hist(df, # Change main title of histogram
main = "Flu Virus Deaths: 1985 - 2005")
lines(density(df), col = "red")

# 5D - qqnorm and qqline
set.seed(5332) # Set seed
x <- rnorm(df) #Create random normally distributed values
qqnorm(df) # QQplot of normally distributed values
qqline(df, col = "red") # Add qqline to plot

shapiro.test(x) #Shapiro Wilkes Test. Since the p-value is not less than .05, the sample data comes from a population that is normally distributed.
##
## Shapiro-Wilk normality test
##
## data: x
## W = 0.92051, p-value = 0.08884
Question 6
- Back to the breast cancer example…. (be sure to DRAW/LABEL/SHADE FOR PARTS (b) and (c) ) Suppose that it is known that in a certain country, 16% of women will develop breast cancer, if we select a random sample of 100 women from that country,
Use the binomial distribution calculations to find the probability that exactly 20 will develop breast cancer.
Now use the normal approximation to the binomial distribution with continuity correction to calculate that same probability that exactly 20 out of the 100 women will develop breast cancer.
Finally, use the sampling distribution for the normal approximation to the binomial distribution to calculate the probability that p ̂=0.16 is within ±0.05 of p. Do not use the continuity correction.
- The FEV, or forced expiratory volume of air in one second, is an important indicator of lung capacity. Assuming that the population distribution is normal, the mean for young women is 3,000 ml and the standard deviation is 400 ml.
With a random sample of 50 young women, what is the mean and standard error of this sampling distribution? Draw and label a curve to show that a random variable Y is approximately normally distributed with this mean and standard error.
For this sampling distribution, what proportion of the group would you expect to have FEV levels below 2900? Write proper notation. DRAW/LABEL/SHADE.
**Answer
See below
#population mean and standard deviation
population_mean <- 3000
population_sd <- 400
#upper and lower bound
lower_bound <- population_mean - population_sd
upper_bound <- population_mean + population_sd
#Create a sequence of 50 x values based on population mean and standard deviation
x <- seq(-4, 4, length = 50) * population_sd + population_mean
#create a vector of values that shows the height of the probability distribution
#for each value in x
y <- dnorm(x, population_mean, population_sd)
#plot normal distribution with customized x-axis labels
plot(x,y, type = "l", lwd = 2, axes = FALSE, xlab = "FEV/ml", ylab = "")
sd_axis_bounds = 5
axis_bounds <- seq(-sd_axis_bounds * population_sd + population_mean,
sd_axis_bounds * population_sd + population_mean,
by = population_sd)
axis(side = 1, at = axis_bounds, pos = 0)

#z score
z <- (2900 - population_mean) / population_sd
list(z) # The probability of x<2900 is 0.40129; that is, the probability of sample having FEV levels below 2900 is .401 or about 40%.
## [[1]]
## [1] -0.25
LS0tDQp0aXRsZTogIkV4YW0gMSINCmF1dGhvcjogIkFhcnluIFppbW1lcm1hbiINCmRhdGU6ICJgciBTeXMuRGF0ZSgpYCINCm91dHB1dDogb3BlbmludHJvOjpsYWJfcmVwb3J0DQotLS0NCg0KYGBge3IgbG9hZC1wYWNrYWdlcywgbWVzc2FnZT1GQUxTRX0NCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShvcGVuaW50cm8pDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KGxhdHRpY2UpDQpkYXRhKCJpX0NPSGIiKQ0KZGF0YSgiZGYiKQ0KDQpgYGANCg0KIyMjIFF1ZXN0aW9uIDENClN5c3RvbGljIGJsb29kIHByZXNzdXJlIHJhdGVzIGZvciB0cmVhdGVkIGh5cGVydGVuc2l2ZSBhZHVsdHMgaW4gdGhlIFUuUy4gZm9sbG93IGEgcm91Z2hseSBiZWxsIGN1cnZlIGRpc3RyaWJ1dGlvbiB3aXRoOm1lYW4gPSAxMzAgbW0gSEcgYW5kIHN0YW5kYXJkIGRldmlhdGlvbiA9IDcuMSBtbUhnDQoNCmEuICBMYWJlbCB0aGUgYmVsbCBjdXJ2ZSAodG8gdGhlIGxlZnQpIHdpdGggYXBwcm9wcmlhdGUgcmF3IGRhdGEgdmFsdWVzIGZvciBzeXN0b2xpYyBibG9vZCBwcmVzc3VyZSByYXRlcy4NCg0KDQpiLkNhbGN1bGF0ZSB0aGUgei1zY29yZSAodXNpbmcgICAgej0oeS3OvCkvz4MgICkgIGZvciBhIHRyZWF0ZWQgaHlwZXJ0ZW5zaXZlIEFtZXJpY2FuIGFkdWx0IHdpdGggc3lzdG9saWMgYmxvb2QgcHJlc3N1cmUgb2YgMTQ4LiBMYWJlbCB0aGlzIHBvaW50IG9uIHlvdXIgY3VydmUgYWJvdmUuDQoNCmMuCVdoYXQgcGVyY2VudGFnZSBvZiB0aGlzIGFkdWx0IHBvcHVsYXRpb24gaGF2ZSBzeXN0b2xpYyBibG9vZCBwcmVzc3VyZSByYXRlcyBiZXR3ZWVuIDEwMCBhbmQgMTM1PyAgRHJhdy9MYWJlbC9TaGFkZSB0byBzaG93IHRoaXMgYW5zd2VyLiBTaG93IGhvdyB5b3UgYXJyaXZlIGF0IHlvdXIgc29sdXRpb24sIGFuZCB1c2UgcHJvcGVyIG5vdGF0aW9uIHdpdGggeW91ciBzb2x1dGlvbi4gDQoNCg0KDQpkLglXaGF0IGJsb29kIHByZXNzdXJlIHJhdGUgcmVwcmVzZW50cyB0aGUgdG9wIDUlIG9yIGhpZ2hlciBmb3IgdGhpcyBwb3B1bGF0aW9uIG9mIGFkdWx0cz8gDQpEcmF3L0xhYmVsL1NoYWRlIHRvIHNob3cgdGhpcyBhbnN3ZXIuDQoNCg0KDQoNCioqQW5zd2VyKiogDQoNCjFBIC0gMUM6ICBTZWUgQmVsb3cgDQoxRDogIEFjY29yZGluZyB0byB6LXNjb3JlcywgdGhlIHRvcCA1JSBmYWxsIGJldHdlZW4gMTMwIGFuZCAxMzUuDQoNCg0KYGBge3J9DQoNCiMgMUEuICBCZWxsIGN1cnZlIGFuZCByYXcgZGF0YSANCiNwb3B1bGF0aW9uIG1lYW4gYW5kIHN0YW5kYXJkIGRldmlhdGlvbg0KcG9wdWxhdGlvbl9tZWFuIDwtIDEzMA0KcG9wdWxhdGlvbl9zZCA8LSA3LjENCg0KI3VwcGVyIGFuZCBsb3dlciBib3VuZA0KbG93ZXJfYm91bmQgPC0gcG9wdWxhdGlvbl9tZWFuIC0gcG9wdWxhdGlvbl9zZA0KdXBwZXJfYm91bmQgPC0gcG9wdWxhdGlvbl9tZWFuICsgcG9wdWxhdGlvbl9zZA0KDQojQ3JlYXRlIGEgc2VxdWVuY2Ugb2YgNTAgeCB2YWx1ZXMgYmFzZWQgb24gcG9wdWxhdGlvbiBtZWFuIGFuZCBzdGFuZGFyZCBkZXZpYXRpb24NCnggPC0gc2VxKC00LCA0LCBsZW5ndGggPSA1MCkgKiBwb3B1bGF0aW9uX3NkICsgcG9wdWxhdGlvbl9tZWFuDQoNCg0KI2NyZWF0ZSBhIHZlY3RvciBvZiB2YWx1ZXMgdGhhdCBzaG93cyB0aGUgaGVpZ2h0IG9mIHRoZSBwcm9iYWJpbGl0eSBkaXN0cmlidXRpb24NCiNmb3IgZWFjaCB2YWx1ZSBpbiB4DQp5IDwtIGRub3JtKHgsIHBvcHVsYXRpb25fbWVhbiwgcG9wdWxhdGlvbl9zZCkNCg0KI3Bsb3Qgbm9ybWFsIGRpc3RyaWJ1dGlvbiB3aXRoIGN1c3RvbWl6ZWQgeC1heGlzIGxhYmVscw0KcGxvdCh4LHksIHR5cGUgPSAibCIsIGx3ZCA9IDIsIGF4ZXMgPSBGQUxTRSwgeGxhYiA9ICJtbSBIRyIsIHlsYWIgPSAiIikNCnNkX2F4aXNfYm91bmRzID0gNQ0KYXhpc19ib3VuZHMgPC0gc2VxKC1zZF9heGlzX2JvdW5kcyAqIHBvcHVsYXRpb25fc2QgKyBwb3B1bGF0aW9uX21lYW4sDQogICAgICAgICAgICAgICAgICAgIHNkX2F4aXNfYm91bmRzICogcG9wdWxhdGlvbl9zZCArIHBvcHVsYXRpb25fbWVhbiwNCiAgICAgICAgICAgICAgICAgICAgYnkgPSBwb3B1bGF0aW9uX3NkKQ0KYXhpcyhzaWRlID0gMSwgYXQgPSBheGlzX2JvdW5kcywgcG9zID0gMCkNCg0KDQoNCg0KDQoNCg0KYGBgDQpgYGB7cn0NCiMgMUIuICBwLXZhbHVlID0geiBzY29yZSBvZiAuMDA1NjE5ICBhdCAxNDgNCnogPC0gKDE0OCAtIHBvcHVsYXRpb25fbWVhbikgLyBwb3B1bGF0aW9uX3NkDQpsaXN0KHopICAgI1RoZSBwcm9iYWJpbGl0eSBvZiBhIHN5c3RvbGljIHByZXNzdXJlIG9mIDE0OCBvciBncmVhdGVyIGFjY29yZGluZyB0byB0aGUgcC12YWx1ZSBvZiAyLjUzNSBpcyAuMDA1NjE5ICh2ZXJ5IHNtYWxsKS4gIA0KDQpgYGANCmBgYHtyfQ0KIyAxYy4JV2hhdCBwZXJjZW50YWdlIG9mIHRoaXMgYWR1bHQgcG9wdWxhdGlvbiBoYXZlIHN5c3RvbGljIGJsb29kIHByZXNzdXJlIHJhdGVzIGJldHdlZW4gMTAwIGFuZCAxMzU/ICBEcmF3L0xhYmVsL1NoYWRlIHRvIHNob3cgdGhpcyBhbnN3ZXIuIFNob3cgaG93IHlvdSBhcnJpdmUgYXQgeW91ciBzb2x1dGlvbiwgYW5kIHVzZSBwcm9wZXIgbm90YXRpb24gd2l0aCB5b3VyIHNvbHV0aW9uLiANCg0KDQp6IDwtICgxMDAgLSBwb3B1bGF0aW9uX21lYW4pIC8gcG9wdWxhdGlvbl9zZA0KbGlzdCh6KQ0KDQp6IDwtICgxMzUgLSBwb3B1bGF0aW9uX21lYW4pIC8gcG9wdWxhdGlvbl9zZA0KbGlzdCh6KQ0KDQojV2l0aCBhIFogc2NvcmUgbyAobnVtYmVyIG9mIHN0YW5kYXJkIGRldmlhdGlvbnMgZnJvbSB0aGUgbWVhbikgZiAtNC4yMjUsIHRoZSBwcm9iYWJpbGl0eSBvZiBYPDEwMCA9IC4wMDAwMTsgeD4xMDAgPSAuOTk5OTkgOyAxMDA8WDwxMzAgPS40OTk5DQoNCiNXaXRoIGEgeiBzY29yZSBvZiAuNzA0LCB0aGUgcCh4KTwxMzUgPSAuNzU5OyBwKHgpPjEzNSA9IC4yNDE7IHAoMTMwPHg8MTM1KT0uMjU5DQoNCmBgYA0KDQoNCiMjIyBRdWVzdGlvbiAyDQpBIHN0dWRlbnQgcmVzZWFyY2hlciB0cmllcyB0byBkZXRlcm1pbmUgdGhlIHByb3BvcnRpb24gb2Ygc3R1ZGVudHMgd2l0aCBhZHZhbmNlZCBkZWdyZWVzIHdobyB0YWtlIGF0IGxlYXN0IG9uZSBjbGFzcyBhdCBNb250Z29tZXJ5IENvbGxlZ2UuIEluIGEgcG9zdC1wYW5kZW1pYyBlbnZpcm9ubWVudCwgc2hlIHN0YW5kcyBvdXRzaWRlIHRoZSBNQyBsaWJyYXJ5IGFuZCBhc2tzIHRoZSBmaXJzdCAyMCBwZW9wbGUgd2hvIHdhbGsgYnkgd2hldGhlciB0aGV5IGhhdmUgYWR2YW5jZWQgZGVncmVlcyBvciBub3QuIFNoZSBmb3VuZCB0aGF0IDEyLzIwIHBlb3BsZSBzYWlkIHRoZXkgZGlkIGhhdmUgYWR2YW5jZWQgZGVncmVlcywgc28gc2hlIGNvbmNsdWRlZCB0aGF0IDYwJSBvZiBhbGwgc3R1ZGVudHMgYXQgTW9udGdvbWVyeSBDb2xsZWdlIGhhdmUgYWR2YW5jZWQgZGVncmVlcy4gQnJpZWZseSBkZXNjcmliZSBhdCBsZWFzdCB0aHJlZSB0aGluZ3MgdGhhdCBtYWRlIHRoaXMgYSBwb29yIHN0dWR5ICh1c2UgcHJvcGVyIHN0YXRpc3RpY2FsIHRlcm1pbm9sb2d5L3ZvY2FidWxhcnkpLg0KDQoNCioqQW5zd2VyKioNCg0KU2FtcGxlIHNpemU6DQpUaGUgbnVtYmVyIG9mIGluZGl2aWR1YWxzIGluY2x1ZGVkIGluIHRoZSBzYW1wbGUgZGVwZW5kcyBvbiB2YXJpb3VzIGZhY3RvcnMsIGluY2x1ZGluZyB0aGUgc2l6ZSBhbmQgdmFyaWFiaWxpdHkgb2YgdGhlIE1DIHBvcHVsYXRpb24uIFNlbGVjdGluZyB0aGUgZmlyc3QgMjAgdG8gZW50ZXIgYSBzaW5nbGUgYnVpbGRpbmcgb24gYSBwYXJ0aWN1bGFyIGRheSBhdCBhIHBhcnRpY3VsYXIgdGltZSBjb250cmlidXRlcyB0byBhIHBvb3JseSBkZXNpZ25lZCBzdHVkeS4gIE90aGVyIGZhY3RvcnMgc2hvdWxkIGJlIGNvbnNpZGVyZWQuICBBcyB3ZSByZWNlbnRseSBsZWFybmVkLCBXaGVuIHRoZSBzYW1wbGUgc2l6ZSBpbmNyZWFzZXMsIHRoZSBkaXN0cmlidXRpb24gYmVjb21lcyBtb3JlIG5vcm1hbC4gVGhlIG1lYW4gKGNlbnRlciBwb2ludCBvZiB0aGUgZGlzdHJpYnV0aW9uKSBpcyBtb3JlIGFjY3VyYXRlIHdoZW4gdGhlIHNhbXBsZSBzaXplIGlzIGxhcmdlci4gQSBsYXJnZXIgc2FtcGxlIHNpemUgaGFzIGEgc21hbGxlciBzcHJlYWQgYW5kIGlzIHByZWZlcmFibGUgZm9yIGEgc2FtcGxpbmcgZGlzdHJpYnV0aW9uDQoNCk51bWJlciBvZiBTYW1wbGVzOg0KSW4gdGhpcyBjYXNlLCB0aGVyZSBpcyBvbmx5IG9uZSBzYW1wbGUgZnJvbSB0aGUgZW50aXJlIE1DIHBvcHVsYXRpb24sIGFuZCB0aGVyZSBpcyBubyBhY2NvdW50IGZvciBhbnkgZGlzdHJpYnV0aW9uIGRhdGEuICBXaXRoIGFuIGluY3JlYXNlZCBudW1iZXIgb2Ygc2FtcGxlcyAoZm9yIGV4YW1wbGUsIDI1IHNhbXBsZXMsIGVhY2ggd2l0aCA1MCBvYnNlcnZhdGlvbnMpLCBlYWNoIGVsZW1lbnQgd291bGQgYmUgdGhlIG1lYW4gb2YgdGhlIHJhbmRvbSBzYW1wbGVzLiBBIGhpc3RvZ3JhbSB3b3VsZCBkaXNwbGF5IHRoZSBzYW1wbGluZyBzaXplIGFuZCB0aGUgZGlzdHJpYnV0aW9uLiAgIEJ5IGluY3JlYXNpbmcgdGhlIG51bWJlciBvZiBzYW1wbGVzLCB0aGVyZSB3b3VsZCBiZSBhIG1vcmUgYWNjdXJhdGUgZXN0aW1hdGUgb2YgdGhlIHBvcHVsYXRpb24gcHJvcG9ydGlvbi4gDQoNCkRhdGEgcHJvdmlkZWQgLSAxMi8yMCAoNjAlKSBpc24ndCByZXByZXNlbnRhdGl2ZSBvZiB0aGUgcG9wdWxhdGlvbi4gIFRoZSBzdHVkZW50IHJlc2VhcmNoZXIgc2hvdWxkIGxvb2sgYXQgbWVhbiwgc3RhbmRhcmQgZGV2aWF0aW9uLCA1LW51bWJlciBzdW1tYXJ5LCBoaXN0b2dyYW1zLCBib3gtcGxvdHMsIGFuZCB0aGUgU2hhcGlybyBXaWxrZXMgdGVzdCB0byBkZXRlcm1pbmUgaWYgdGhlIHNhbXBsZSBkYXRhIGNvbWVzIGZyb20gYSBwb3B1bGF0aW9uIHRoYXQgaXMgbm9ybWFsbHkgZGlzdHJpYnV0ZWQuDQoNCg0KSW4gc3VtbWFyeSwgYmlhc2VkLCBzbWFsbCBzYW1wbGUsIG5vbi1yZXByZXNlbnRhdGl2ZSBwb3B1bGF0aW9uLiAgVGhlIHJlc2VhcmNoZXIgcGxhY2VkIGhlcnNlbGYgaW4gZnJvbnQgb2YgdGhlIGxpYnJhcnkgd2hpY2ggaXMgb25seSB3aGVyZSBhIGZldyBzdHVkZW50cyB3aWxsIHBhc3MgYnkuICBGaW5hbGx5LCBpdCBpcyB2b2x1bnRhcnksIGJlY2F1c2Ugc3R1ZGVudHMgZG8gbm90IG5lZWQgdG8gcmVzcG9uZCB0byB0aGUgcXVlc3Rpb25zLiAgSW4gc3VtbWFyeSwgdGhlIHN0dWR5IHJlc3VsdHMgYXJlIG5vdCB1c2VmdWwuIA0KDQoNCg0KDQoNCg0KYGBge3J9DQoNCmBgYA0KDQoNCiMjIyBRdWVzdGlvbiAzIC0gU0VFIFdSSVRURU4gRVhBTSBGT1IgU09MVVRJT04NCg0KDQpgYGB7cn0NCg0KYGBgDQoNCg0KDQojIyMgUXVlc3Rpb24gNA0KDQpTRUUgV1JJVFRFTiBFWEFNIEZPUiBSZXN0IG9mIFNPTFVUSU9OIC0gSSBhdHRlbXB0ZWQgdG8gZG8gc29tZSBvZiBpdCBpbiBSLg0KDQpUaGUgcHJldmFsZW5jZSBvZiBjb2xvciBibGluZG5lc3MgaW4gbWFsZXMgaXMgMyUuIExldCBZIGRlbm90ZSB0aGUgbnVtYmVyIHdpdGggY29sb3IgYmxpbmRuZXNzIG91dCBvZiBhIHJhbmRvbSBzYW1wbGUgb2Ygc2V2ZW4NCg0KYS4JV2hhdCB3b3VsZCB0aGUgZXhwZWN0ZWQgbWVhbiBhbmQgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIHRoaXMgYmlub21pYWwgZGlzdHJpYnV0aW9uPyBBbHNvLCB3b3VsZCBpdCBiZSBhcHByb3ByaWF0ZSB0byB1c2Ugbm9ybWFsIGRpc3RyaWJ1dGlvbiBjYWxjdWxhdGlvbnMgZm9yIHRoaXMgdHlwZSBvZiBzYW1wbGUg4oCTIHdoeSBvciB3aHkgbm90Pw0KDQoNCmIuIENvbXBsZXRlIHRoZSB0YWJsZSBhYm92ZS4gDQoNCg0KYy4gRmluZCBQcuKBoXtZ4omlNH0NClBSe1k8XzJ9DQoNCg0KDQpgYGB7cn0NCnRlc3RCIDwtIDA6Nw0KDQpwbG90KHRlc3RCLGRiaW5vbSh0ZXN0QixzaXplPTcscHJvYj0uMDMpLA0KICAgICB0eXBlPSdoJywNCiAgICAgbWFpbj0nQmlub21pYWwgRGlzdHJpYnV0aW9uIChuPTcsIHA9MC4wMyknLA0KICAgICB5bGFiPSdDb2xvciBCbGluZG5lc3MnLA0KICAgICB4bGFiID0nJywNCiAgICAgbHdkPTMpDQoNCg0KIyNkaXNwbGF5IHByb2JhYmlsaXR5IG9mIHN1Y2Nlc3MgZm9yIGVhY2ggbnVtYmVyIG9mIHRyaWFscw0KI2RiaW5vbShzdWNjZXNzLCBzaXplPTcsIHByb2I9LjMpDQoNCg0KYGBgDQoNCg0KIyMjIFF1ZXN0aW9uIDUNCjUuCVR3ZW50eS1vbmUgeWVhcnMgb2YgZGVhdGhzIGR1ZSB0byB0aGUgZmx1IHZpcnVzIHdlcmUgcmVjb3JkZWQgZm9yIGEgcGFydGljdWxhciByZWdpb24uICANCiAgICBUaGUgZGF0YSBiZWxvdyBhcmUgZ2l2ZW4gZm9yIGVhY2ggeWVhciBmcm9tIDE5ODUg4oCTIDIwMDUuDQoJICAzNQk0MQk1NQk2NQkyOQk2MAk0OQkyNAkzNwkxMTAJMjgJNDAJCTQ3CTU4CTMwCTM3CTE1CTUwCTI4CTM3CTQxDQoJICANCgkgIA0KKipBTlNXRVIqKlNFRSBCRUxPVw0KYS4JQ3JlYXRlIGEgaGlzdG9ncmFtIG9mIHRoZSBkYXRhIGluY2x1ZGluZyBhIHNjYWxlIGZvciB0aGUgdmVydGljYWwgZnJlcXVlbmN5IGF4aXMuICANCmIuCUZpbmQgdGhlIG1lYW4gYW5kIHN0YW5kYXJkIGRldmlhdGlvbiwgYW5kIHRoZSA1LW51bWJlciBzdW1tYXJ5IGZvciB0aGUgZGF0YS4gQmUgc3VyZSB0byBpbmNsdWRlIGFwcHJvcHJpYXRlIHN5bWJvbHMgYXMgd2VsbC4NCmMuICBDcmVhdGUgYSBib3ggcGxvdCBvZiB0aGUgZGF0YS4gLlNob3cgYXBwcm9wcmlhdGUgc2NhbGUgYWxvbmcgbnVtYmVyIGxpbmUuIEFsc28gcGVyZm9ybSB0aGUgb3V0bGllciB0ZXN0IGZvciB0aGUgdXBwZXIgZmVuY2UgKFFfMysxLjUqSVFSKWQuCWQuICBCZWxvdywgY3JlYXRlIGEgTm9ybWFsIFF1YW50aWxlIFBsb3QgKHFxbm9ybSBhbmQgcXFsaW5lKSBmb3IgdGhlIGZsdSBkYXRhLCB0aGVuIGNvbXB1dGUgdGhlIFNoYXBpcm8gV2lsa2VzIHRlc3QuICANCg0KSW4gYSBzaG9ydCBwYXJhZ3JhcGgsIHByb3ZpZGUgYSBkZXRhaWxlZCBleHBsYW5hdGlvbiBvZiBob3cgdGhlc2UgdGhyZWUgY29tcG9uZW50cyBmaXQgdG9nZXRoZXIgdG8gZGVzY3JpYmUgdGhlIHNoYXBlIG9mIHRoZSBkaXN0cmlidXRpb24uICBCZSBzdXJlIHRvIGluY2x1ZGUgYW55IGNvbmNsdXNpb25zIGFib3V0IHRoZSByZXN1bHRzIG9mIHlvdXIgZmluZGluZ3MNCiAgICANCiAgICANClRoZSBoaXN0b2dyYW0gc2hvd3MgdGhlIGRpc3RyaWJ1dGlvbiBhbmQgdGhlIHNwcmVhZCBvZiB0aGUgdmFyaWFibGUgKGRlYXRocyBkdWUgdG8gZmx1KS4gIEluIHRoZSBpbWFnZSBiZWxvdywgaXQgdGVuZHMgdG8gc2tldyBhIGJpdCB0byB0aGUgbGVmdCBpbiBpdHMgZGlzdHJpYnV0aW9ucy4gU2luY2UgaXQgdXNlcyBhcmVhIGluc3RlYWQgb2YgaGVpZ2h0IHRvIHJlcHJlc2VudCB2YWx1ZXMsIHRoZSB3aWR0aCBvZiBiYXJzIGNhbiB2YXJ5LiAgVGhlIGJveCBwbG90IHN0YW5kYXJkaXplcyB0aGUgZGlzdHJpYnV0aW9uIG9mIGRhdGEgYmFzZWQgb24gdGhlIGZpdmUgbnVtYmVyIHN1bW1hcnkgKOKAnG1pbmltdW3igJ0sIGZpcnN0IHF1YXJ0aWxlIChRMSksIG1lZGlhbiwgdGhpcmQgcXVhcnRpbGUgKFEzKSwgYW5kIOKAnG1heGltdW0gKHVwcGVyIGZlbmNl4oCdKS4gVGhlIE5vcm1hbCBRdWFudGlsZSBQbG90IHdhcyB1c2VkIHRvIHRlc3QgdGhlIG5vcm1hbGl0eSBvZiB0aGUgZGF0YSBieSBwbG90dGluZyB0aGUgZGF0YSBhZ2FpbnN0IGEgc3RhbmRhcmQgbm9ybWFsIGRpc3RyaWJ1dGlvbi4gVGhlIGZsdSBkYXRhIHdhcyB1c2VkIHRvIGNyZWF0ZSBhIHNhbXBsZSB3aXRoIHN0YW5kYXJkIG5vcm1hbCBkaXN0cmlidXRpb24gYW5kIHRoZW4gY29tcGFyZWQgYWdhaW5zdCB0aGUgb3JpZ2luYWwgaW5wdXQgc2V0LiAgV2l0aCB0aGUgU2hhcGlybyBXaWxrZXMgdGVzdCwgbXkgZmluYWwgY29uY2x1c2lvbiBpcyB0aGF0IHRoZSBzYW1wbGUgZGF0YSBjb21lcyBmcm9tIGEgcG9wdWxhdGlvbiB0aGF0IGlzIG5vcm1hbGx5IGRpc3RyaWJ1dGVkLg0KICAgIA0KYGBge3J9DQojUHV0IGRlYXRocyBpbnRvIGEgZGF0YSBmcmFtZSBhbmQgY2hlY2sgZGF0YSBieSBwcmludGluZw0KaV9DT0hiIDwtIGMoIjM1IiwgIjQxIiwiNTUiLCAiNjUiLCIyOSIsIjYwIiwgIjQ5IiwgIjI0IiwgIjM3IiwgIjExMCIsICIyOCIsICI0MCIsICI0NyIsICI1OCIsICIzMCIsICIzNyIsICIxNSIsICI1MCIsICIyOCIsICIzNyIsICI0MSIpDQpkZiA8LWRhdGEuZnJhbWUoaV9DT0hiKQ0KcHJpbnQoZGYpDQpgYGANCmBgYHtyfQ0KIyA1QiAtIENhbGN1bGF0aW9ucw0KDQojU2luY2UgSSBkb24ndCBrbm93IGhvdyB0byBkcmF3IHN5bWJvbHMgdXNpbmcgUiwgSSBpbmNsdWRlZCBleHRyYSBjYWxjdWxhdGlvbnMgZm9yIHRoZSBkYXRhLiAgDQojVGhlIDUgTnVtYmVyIFN1bW1hcnkgZ2l2ZXMgdXMgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgb2JzZXJ2YXRpb25zLiBXZSBkb24ndCBoYXZlIHRvIGRlY2lkZSBvbiB0aGUgbW9zdCBhcHByb3ByaWF0ZSBzdW1tYXJ5IHN0YXRpc3RpYy4gVGhlIGZpdmUtbnVtYmVyIHN1bW1hcnkgZ2l2ZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGxvY2F0aW9uIChmcm9tIHRoZSBtZWRpYW4pLCBzcHJlYWQgKGZyb20gdGhlIHF1YXJ0aWxlcykgYW5kIHJhbmdlIChmcm9tIHRoZSBzYW1wbGUgbWluaW11bSBhbmQgbWF4aW11bSkgb2YgdGhlIG9ic2VydmF0aW9ucy4NCmlfQ09IYiA8LSBhcy5udW1lcmljKGlfQ09IYikNCm1lYW4oaV9DT0hiKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjbWVhbg0KbWVkaWFuKGlfQ09IYikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNtZWRpYW4NCnNkKGlfQ09IYikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjc3RhbmRhcmQgZGV2aWF0aW9uDQpJUVIoaV9DT0hiKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI0lRUiAtIA0KZml2ZW51bShpX0NPSGIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICM1LW51bWJlciBzdW1tYXJ5ICAoMTEwIGlzIHRoZSBvdXRsaWVyIHVwcGVyIGZlbmNlKQ0KYGBgDQoNCmBgYHtyfQ0KIyA1QyAtIEJveCBQbG90DQoNCmRmIDwtIGFzLm51bWVyaWMoaV9DT0hiKQ0KYm94cGxvdChkZiwgbm90Y2g9VFJVRSkNCg0KYm94cGxvdChkZiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICBtYWluID0gIkRlYXRocyBEdWUgdG8gRmx1IikNCiMgbGVnZW5kDQpsZWdlbmQoInRvcHJpZ2h0IiwgbGVnZW5kID0gIkJveHBsb3QiLCANCiAgICBmaWxsID0gcmdiKDEsIDAsIDAsIGFscGhhID0gMC40KSwgICMgQ29sb3INCiAgICBpbnNldCA9IGMoMC4wMywgMC4wNSksICMgTW9kaWZ5IG1hcmdpbnMNCiAgICBiZyA9ICJ3aGl0ZSIpICMgTGVnZW5kIGJhY2tncm91bmQgY29sb3INCg0KIzExMCBpcyB0aGUgb3V0bGllciB1cHBlciBmZW5jZSBvZiB0aGUgYm94IHBsb3QNCg0KYGBgDQoNCg0KYGBge3J9DQojIDVBIC0gSElTVE9HUkFNDQoNCmhpc3QoZGYsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBDaGFuZ2UgbnVtYmVyIG9mIGhpc3RvZ3JhbSBicmVha3MNCiAgICAgYnJlYWtzID0gNTApDQpoaXN0KGRmLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgQ2hhbmdlIG1haW4gdGl0bGUgb2YgaGlzdG9ncmFtDQogICAgIG1haW4gPSAiRmx1IFZpcnVzIERlYXRoczogIDE5ODUgLSAyMDA1IikNCmxpbmVzKGRlbnNpdHkoZGYpLCBjb2wgPSAicmVkIikgIA0KYGBgDQoNCmBgYHtyfQ0KIyA1RCAtIHFxbm9ybSBhbmQgcXFsaW5lDQpzZXQuc2VlZCg1MzMyKSAgICAgICAgICAgICAgICAgICAjIFNldCBzZWVkDQp4IDwtIHJub3JtKGRmKSAgICAgICAgICAgICAgICAgICAgI0NyZWF0ZSByYW5kb20gbm9ybWFsbHkgZGlzdHJpYnV0ZWQgdmFsdWVzDQpxcW5vcm0oZGYpICAgICAgICAgICAgICAgICAgICAgICAgIyBRUXBsb3Qgb2Ygbm9ybWFsbHkgZGlzdHJpYnV0ZWQgdmFsdWVzDQpxcWxpbmUoZGYsIGNvbCA9ICJyZWQiKSAgICAgICAgICAgIyBBZGQgcXFsaW5lIHRvIHBsb3QNCnNoYXBpcm8udGVzdCh4KSAgICAgICAgICAgICAgICAgICAjU2hhcGlybyBXaWxrZXMgVGVzdC4gU2luY2UgdGhlIHAtdmFsdWUgaXMgbm90IGxlc3MgdGhhbiAuMDUsIHRoZSBzYW1wbGUgZGF0YSBjb21lcyBmcm9tIGEgcG9wdWxhdGlvbiB0aGF0IGlzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbGx5IGRpc3RyaWJ1dGVkLg0KDQpgYGANCg0KYGBge3J9DQoNCmBgYA0KDQoNCiMjIyBRdWVzdGlvbiA2DQoNCjYuCUJhY2sgdG8gdGhlIGJyZWFzdCBjYW5jZXIgZXhhbXBsZeKApi4gKGJlIHN1cmUgdG8gRFJBVy9MQUJFTC9TSEFERSBGT1IgUEFSVFMgKGIpIGFuZCAoYykgICkNClN1cHBvc2UgdGhhdCBpdCBpcyBrbm93biB0aGF0IGluIGEgY2VydGFpbiBjb3VudHJ5LCAxNiUgb2Ygd29tZW4gd2lsbCBkZXZlbG9wIGJyZWFzdCBjYW5jZXIsIGlmIHdlIHNlbGVjdCBhIHJhbmRvbSBzYW1wbGUgb2YgMTAwIHdvbWVuIGZyb20gdGhhdCBjb3VudHJ5LA0KYS4JVXNlIHRoZSBiaW5vbWlhbCBkaXN0cmlidXRpb24gY2FsY3VsYXRpb25zIHRvIGZpbmQgdGhlIHByb2JhYmlsaXR5IHRoYXQgZXhhY3RseSAyMCB3aWxsIGRldmVsb3AgYnJlYXN0IGNhbmNlci4NCg0KDQpiLglOb3cgdXNlIHRoZSBub3JtYWwgYXBwcm94aW1hdGlvbiB0byB0aGUgYmlub21pYWwgZGlzdHJpYnV0aW9uIHdpdGggY29udGludWl0eSBjb3JyZWN0aW9uIHRvIGNhbGN1bGF0ZSB0aGF0IHNhbWUgcHJvYmFiaWxpdHkgdGhhdCBleGFjdGx5IDIwIG91dCBvZiB0aGUgMTAwIHdvbWVuIHdpbGwgZGV2ZWxvcCBicmVhc3QgY2FuY2VyLg0KDQoNCg0KCUZpbmFsbHksIHVzZSB0aGUgc2FtcGxpbmcgZGlzdHJpYnV0aW9uIGZvciB0aGUgbm9ybWFsIGFwcHJveGltYXRpb24gdG8gdGhlIGJpbm9taWFsIGRpc3RyaWJ1dGlvbiB0byBjYWxjdWxhdGUgdGhlIHByb2JhYmlsaXR5IHRoYXQgcCDMgj0wLjE2IGlzIHdpdGhpbiDCsTAuMDUgb2YgcC4gRG8gbm90IHVzZSB0aGUgY29udGludWl0eSBjb3JyZWN0aW9uLiANCg0KYGBge3J9DQoNCmBgYA0KDQoNCjcuCVRoZSBGRVYsIG9yIGZvcmNlZCBleHBpcmF0b3J5IHZvbHVtZSBvZiBhaXIgaW4gb25lIHNlY29uZCwgaXMgYW4gaW1wb3J0YW50IGluZGljYXRvciBvZiBsdW5nIGNhcGFjaXR5LiBBc3N1bWluZyB0aGF0IHRoZSBwb3B1bGF0aW9uIGRpc3RyaWJ1dGlvbiBpcyBub3JtYWwsIHRoZSBtZWFuIGZvciB5b3VuZyB3b21lbiBpcyAzLDAwMCBtbCBhbmQgdGhlIHN0YW5kYXJkIGRldmlhdGlvbiBpcyA0MDAgbWwuIA0KYS4JV2l0aCBhIHJhbmRvbSBzYW1wbGUgb2YgNTAgeW91bmcgd29tZW4sIHdoYXQgaXMgdGhlIG1lYW4gYW5kIHN0YW5kYXJkIGVycm9yIG9mIHRoaXMgc2FtcGxpbmcgZGlzdHJpYnV0aW9uPyAgRHJhdyBhbmQgbGFiZWwgYSBjdXJ2ZSB0byBzaG93IHRoYXQgYSByYW5kb20gdmFyaWFibGUgWSBpcyBhcHByb3hpbWF0ZWx5IG5vcm1hbGx5IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyBtZWFuIGFuZCBzdGFuZGFyZCBlcnJvci4NCg0KDQoNCmIuCUZvciB0aGlzIHNhbXBsaW5nIGRpc3RyaWJ1dGlvbiwgd2hhdCBwcm9wb3J0aW9uIG9mIHRoZSBncm91cCB3b3VsZCB5b3UgZXhwZWN0IHRvIGhhdmUgRkVWIGxldmVscyBiZWxvdyAyOTAwPyBXcml0ZSBwcm9wZXIgbm90YXRpb24uIERSQVcvTEFCRUwvU0hBREUuDQoNCioqQW5zd2VyDQoNClNlZSBiZWxvdw0KDQoNCg0KYGBge3J9DQoNCiNwb3B1bGF0aW9uIG1lYW4gYW5kIHN0YW5kYXJkIGRldmlhdGlvbg0KcG9wdWxhdGlvbl9tZWFuIDwtIDMwMDANCnBvcHVsYXRpb25fc2QgPC0gNDAwDQoNCiN1cHBlciBhbmQgbG93ZXIgYm91bmQNCmxvd2VyX2JvdW5kIDwtIHBvcHVsYXRpb25fbWVhbiAtIHBvcHVsYXRpb25fc2QNCnVwcGVyX2JvdW5kIDwtIHBvcHVsYXRpb25fbWVhbiArIHBvcHVsYXRpb25fc2QNCg0KI0NyZWF0ZSBhIHNlcXVlbmNlIG9mIDUwIHggdmFsdWVzIGJhc2VkIG9uIHBvcHVsYXRpb24gbWVhbiBhbmQgc3RhbmRhcmQgZGV2aWF0aW9uDQp4IDwtIHNlcSgtNCwgNCwgbGVuZ3RoID0gNTApICogcG9wdWxhdGlvbl9zZCArIHBvcHVsYXRpb25fbWVhbg0KDQoNCiNjcmVhdGUgYSB2ZWN0b3Igb2YgdmFsdWVzIHRoYXQgc2hvd3MgdGhlIGhlaWdodCBvZiB0aGUgcHJvYmFiaWxpdHkgZGlzdHJpYnV0aW9uDQojZm9yIGVhY2ggdmFsdWUgaW4geA0KeSA8LSBkbm9ybSh4LCBwb3B1bGF0aW9uX21lYW4sIHBvcHVsYXRpb25fc2QpDQoNCiNwbG90IG5vcm1hbCBkaXN0cmlidXRpb24gd2l0aCBjdXN0b21pemVkIHgtYXhpcyBsYWJlbHMNCnBsb3QoeCx5LCB0eXBlID0gImwiLCBsd2QgPSAyLCBheGVzID0gRkFMU0UsIHhsYWIgPSAiRkVWL21sIiwgeWxhYiA9ICIiKQ0Kc2RfYXhpc19ib3VuZHMgPSA1DQpheGlzX2JvdW5kcyA8LSBzZXEoLXNkX2F4aXNfYm91bmRzICogcG9wdWxhdGlvbl9zZCArIHBvcHVsYXRpb25fbWVhbiwNCiAgICAgICAgICAgICAgICAgICAgc2RfYXhpc19ib3VuZHMgKiBwb3B1bGF0aW9uX3NkICsgcG9wdWxhdGlvbl9tZWFuLA0KICAgICAgICAgICAgICAgICAgICBieSA9IHBvcHVsYXRpb25fc2QpDQpheGlzKHNpZGUgPSAxLCBhdCA9IGF4aXNfYm91bmRzLCBwb3MgPSAwKQ0KDQoNCg0KDQoNCg0KYGBgDQpgYGB7cn0NCiN6IHNjb3JlDQp6IDwtICgyOTAwIC0gcG9wdWxhdGlvbl9tZWFuKSAvIHBvcHVsYXRpb25fc2QNCmxpc3QoeikgICAgIyBUaGUgcHJvYmFiaWxpdHkgb2YgeDwyOTAwIGlzIDAuNDAxMjk7IHRoYXQgaXMsIHRoZSBwcm9iYWJpbGl0eSBvZiBzYW1wbGUgaGF2aW5nIEZFViBsZXZlbHMgYmVsb3cgMjkwMCBpcyAuNDAxIG9yIGFib3V0IDQwJS4NCg0KDQpgYGANCg0KDQoNCiMjIyBFeHRyYSBDcmVkaXQNCg0KSSBoYXZlIG5ldmVyIHdvcmtlZCB3aXRoIFIgYmVmb3JlLCBzbyBJIHdhcyBpbml0aWFsbHkgYSBiaXQgc2xvdy4gIEZvcnR1bmF0ZWx5LCB5b3UgcHJvdmlkZWQgdmVyeSwgdmVyeSBoZWxwZnVsIHJlY29yZGluZ3MgZm9yIGRvd25sb2FkaW5nIHRoZSB0b29sIGFuZCBnZXR0aW5nIHN0YXJ0ZWQuICBTb21lIG9mIHRoZSByZXNvdXJjZXMgYXJlIGEgYml0IGFkdmFuY2VkLCBidXQgSSBhbSBob3BlZnVsIEkgY2FuIGtlZXAgdGhlbSBpbiBteSByZXBvc2l0b3J5IGFuZCByZWZlciB0byB0aGVtIGdvaW5nIGZvcndhcmQuICBJIGhhdmUgdmVyeSBtdWNoIGVuam95ZWQgcmVzZWFyY2hpbmcgYW5kIGluY29ycG9yYXRpbmcgc29tZSBvZiB0aGUgbW9yZSBhZHZhbmNlZCBmdW5jdGlvbmFsaXR5IEkgd2Fzbid0IGZhbWlsaWFyIHdpdGguICBJIGxlYXJuZWQgdGhhdCBldmVuIGFmdGVyIGluc3RhbGxpbmcgdGhlIGxpYnJhcmllcyBhbmQgaW5jbHVkaW5nIGRhdGEgc2V0cywgc29tZXRpbWVzIHRoZXkgYXJlbid0IHJlY29nbml6ZWQsIHNvIEkgc3RhcnRlZCBpbmNsdWRpbmcgdGhlbSBhdCB0aGUgdG9wIG9mIG15IGFzc2lnbWVudHMgc28gdGhleSB3b3VsZCBiZSByZWNvZ25pemVkLiAgU29tZXRpbWVzIG15IGdncGxvdHMgZG9uJ3Qgd29yaywgc28gdGhhdCdzIGEgYml0IGZydXN0cmF0aW5nLCBidXQgSSByZWZlcnJlZCB0byB5b3VyIHJlY29yZGVkIGxhYnMgYW5kIGZvdW5kIHdvcmstYXJvdW5kcy4gIEknbSBub3Qgc3VyZSBob3cgbG9uZyBvdGhlciBzdHVkZW50cyBhcmUgc3BlbmRpbmcgb24gdGhlIGxhYnMsIGJ1dCBJIGZpbmQgaXQgdGFrZXMgbWUgYSBsb29vbm5ubm5uZ2dnZ2dnZ2dnZ2dnIHRpbWUgdG8gY29tcGxldGUuICBJIHRoaW5rIGl0IG11c3QgYmUgYSBjb21iaW5hdGlvbiBvZiBiZWluZyBuZXcgdG8gUiBhbmQgdGhlbiB0cnlpbmcgdG8gZmlndXJlIG91dCBob3cgdG8gaW50ZXJwcmV0IHRoZSBkaWZmZXJlbnQgcGxvdC10eXBlcy4gIEkgZG8gYXBwcmVjaWF0ZSBob3cgZW5nYWdlZCBhcmUgdG8gaGVscGluZyB5b3VyIHN0dWRlbnRzIGxlYXJuIHRoZSBtYXRlcmlhbC4gIEkgaGF2ZSBsZWFybmVkIGEgbG90IHNvIGZhciB3aXRoIFIsIGFuZCBJJ20gcXVpdGUgaGFwcHkuICBTbywgdGhhbmsgeW91IQ0KDQoNCi4uLg0KDQo=