Case-scenario 1
This is the fourth season of outfielder Luis Robert with the Chicago
White Socks
If during the first three seasons he hit 11, 13, and 12 home runs
##how many does he need on this season for his overall average to be at
least 20?
# Solution
#Given that x1=11,x2=13,x3=12
#we want to find x4
#such that the mean (average) number of home-runs is x¯>=20
#Notice that in this case n=4
#According to the information above: 20×4=11+13+12+x4
#so when x4=44. the home-runs average will be 20
#Answer Here
#Home-runs so far
HR_before <- c(11, 13, 12) # We declare the variable HR_before and convert it to a vector by assigning c(11, 13, 12)
#Average Number of Home-runs per season wanted
wanted_HR <- 20 # We declare the variable wanted_HR and assign 20
#Number of seasons
n_seasons <- 4 # We declare the variable n_seasons and assign 4
#Needed Home-runs on season 4
x_4 <- n_seasons*wanted_HR - sum(HR_before) # We declare the variable X_4 and assign the result of the following calculation
# 4*20 - (11+13+12)
#The result will be 44
#Minimum number of Home-runs needed by Robert
#In this code we are printing the contents of the variable X_4
x_4
[1] 44
According to the calculations above, Robert must hit 44 home-runs or
better on this season to get an average number of home-runs per season
of at least 20.
We could confirm this, by using the function mean() in R
#Robert's performance
Robert_HRs <- c(11, 13, 12,44) #We declared the variable Robert_HRs and convert it to a vector by assigning c(11, 13, 12,44)
#In this case we added the contents of HR_before and x_4
#Find mean
#In this code we are using the function mean() to find the average of the contents of Robert_HRs
#The results should be 20. This confirm the calculation on the priverious code chunck
mean(Robert_HRs)
[1] 20
#Find standard deviation
#In this code we are using the function sd() to find the standard deviation of the contents of Robert_HRs
sd(Robert_HRs)
[1] 16.02082
#Find the maximum number of home-runs during the four seasons period.
#In this code we are using the function max() to find the highest value in the contents of Robert_HRs
max(Robert_HRs)
[1] 44
#Find the minimum number of home-runs during the four seasons period
#In this code we are using the function min() to find the lowest value in the contents of Robert_HRs
min(Robert_HRs)
[1] 11
#We can also use the summary() function to find basic statistics, including the median!
#In This code we use the function summary() to find the following statistical values in the variable Robert_HRs
#Minimum (Min): The smallest value in the vector.
#1st Quartile (1st Qu): The value below which 25% of the data falls (also known as Q1 or the lower quartile).
#Median (Median or 50th percentile): The middle value in the sorted vector (Q2).
#Mean (Mean): The average value of the vector.
#3rd Quartile (3rd Qu): The value below which 75% of the data falls (Q3 or the upper quartile).
#Maximum (Max): The largest value in the vector.
#Number of non-missing values (NA's): The count of missing or NA values in the vector.
summary(Robert_HRs)
Min. 1st Qu. Median Mean 3rd Qu. Max.
11.00 11.75 12.50 20.00 20.75 44.00
Question 1
Now, you must complete the problem below which represents a similar
case scenario. You may use the steps that we executed in Case-scenario 1
as a template for your solution.
This is the sixth season of outfielder Juan Soto in the majors. If
during the first five seasons he received 79, 108,41,145, and 135 walks,
how many does he need on this season for his overall number of walks per
season to be at least 100?
#Home-runs so far
Walks_before <- c(79, 108, 41,145,135) #In this code we declare the variable Walks_before then convert it to a vector by adding c(79, 108, 41,145,135)
#Average Number of Walks per season wanted
wanted_Walks <- 100 #In this code we declare the variable wanted_Walks and assign 100
#Number of seasons
n_seasons <- 6 #In this code we declare the variable n_seasons and assign 100
#Needed Walks on season 6
x_6 <- n_seasons*wanted_Walks - sum(Walks_before) # In this code we declare the variable x_6 and assign the results of the following calculation
#6*100 - (79+108+41+145+135)
#600 - 508
#The result will be 92
#Minimum number of walks needed by Juan
x_6
[1] 92
Case-scenario
The average salary of 10 baseball players is 72,000 dollars a week
and the average salary of 4 soccer players is 84,000. Find the mean
salary of all 14 professional players.
Solution
We can easily find the joined mean by adding both mean and dividing
by the total number of people.
Let n1=10 denote the number of baseball players, and y1=72000 their
mean salary. Let n2=4 the number of soccer players and y2=84000 their
mean salary. Then the mean salary of all 16 individuals is:
n1x1+n2x2n1+n2
We can compute this in R as follows:
n_1 <- 10 # Declare the variable n_1 and assign 10 (Baseball Players)
n_2 <- 4 # Declare the variable n_2 and assign 4 (Soccer Players)
y_1 <- 72000 # Declare the variable y_1 and assign 72000 (Baseball Players Salaries)
y_2 <- 84000 # Declare the variable y_2 and assign 84000 (Soccer Players Salaries)
#Mean salary overall
salary_ave <- (n_1*y_1 + n_2*y_2)/(n_1+n_2) # Declare the variable salary_ave and assign the values of the following calculation
#10*72000 + 4*84000 / 10+4
#720000 + 336000 / 14
# The answer will be 75428.57
salary_ave #We are printing the contents of the variable salary_ave
[1] 75428.57
Question 2
The average salary of 7 basketball players is 102,000 dollars a week
and the average salary of 9 NFL players is 91,000. Find the mean salary
of all 16 professional players.
n_1 <- 7 # Declare the variable n_1 and assign 7 (Baseball Players)
n_2 <- 9 # Declare the variable n_2 and assign 9 (NFL Players)
y_1 <- 102000 # Declare the variable y_1 and assign 102000 (Baseball Players Salaries)
y_2 <- 91000 # Declare the variable y_2 and assign 91000 (NFL Players Salaries)
##Mean salary overall
salary_ave <- (n_1*y_1 + n_2*y_2)/(n_1+n_2) # Declare the variable salary_ave and assign the values of the following calculation
#7*102000 + 9*91000 / 7+9
#714000 + 819000 / 16
# The answer will be 95812.5
salary_ave #We are printing the contents of the variable salary_ave
[1] 95812.5
Case-scenario 3
The frequency distribution below lists the number of active players
in the Barclays Premier League and the time left in their contract.
Years Number of Players 6 28 5 72 4 201
3 109 2 56 1 34
Find the mean,the median and the standard deviation.
What percentage of the data lies within one standard deviation of the
mean?
What percentage of the data lies within two standard deviations of
the mean?
What percent of the data lies within three standard deviations of the
mean?
Draw a histogram to illustrate the data.
Solution
#The allcontracts.csv file contains all the players’ contracts length.
#We can read this file in R using the read.csv() function.
contract_length <- read.table("C:/Users/erlan/OneDrive/Desktop/School/CAP 4936 Sports Analytics/allcontracts.csv", header = TRUE, sep = ",")
#In This code we declare the variable contract_length
#Then use the read.table() function to read the file allcontracts.csv in the provided path including the heather and separated by comma to the variable contract_length
contract_years <- contract_length$years
#In The above line of code we are extracting the values stored in the column named years from the data frame or list contract_length and assigning them to a new variable named contract_years
Make comments about the code we just ran above.
contract_length: This variable holds a data frame that contains all
the data read from “allcontracts.csv”. Each row corresponds to a record
from the CSV file, and each column represents a different attribute
(such as contract details).
contract_years: This variable is a vector that contains only the
values from the years column of the contract_length data frame. Each
element in contract_years represents the length of a contract in years
as specified in the CSV file.
After executing this code, we can further analyze or manipulate the
data stored in contract_length and contract_years using various R
functions and operations. For example, you could calculate summary
statistics like mean, median, or maximum contract length using functions
like mean(contract_years), median(contract_years), or
max(contract_years).
To find the mean and the standard deviation
#Mean
#In This code we declare the variable contracts_mean
#Then use the function mean() to calculate the average of the contents in the variable contract_years
#Then assign the results to contracts_mean
contracts_mean <- mean(contract_years)
#in this code we are printing the contents of the variable contracts_mean
contracts_mean
[1] 3.458918
#Median
#In This code we declare the variable contracts_median
#Then use the function median() to calculate the median of the contents in the variable contract_years
#Then assign the results to contracts_median
contracts_median <- median(contract_years)
#in this code we are printing the contents of the variable contracts_median
contracts_median
[1] 3
#Find number of observations
#In this code we declare the variable contracts_n
#Then use the function length() to calculate the size of the contents in the variable contract_years and assign to contracts_n
contracts_n <- length(contract_years)
contracts_n # Printing the results. In this case 499
[1] 499
#Find standard deviation
#In this code we declare the variable contracts_sd
#Then use the function sd() to calculate the standard deviation of the contents in the variable contract_years and assign to contracts_sd
contracts_sd <- sd(contract_years)
contracts_sd # Printing the results. In this case 1.69686
[1] 1.69686
#What percentage of the data lies within one standard deviation of the mean?
#Declare the variable contracts_w1sd and assign the results of the following calculation
#We add the contents of contract_years minus the contents of contracts_mean divided by the contents of contracts_sd that are less than 1 (For 1 Standard Deviations)
#Then divide the previous calculation by the contents of contracts_n
contracts_w1sd <- sum((contract_years - contracts_mean)/contracts_sd < 1)/ contracts_n
#Percentage of observation within one standard deviation of the mean
contracts_w1sd # Printing the results. In this case 0.8416834
[1] 0.8416834
#Difference from empirical
#Subtracting 0.68 from the contents of the variable contracts_w1sd to find the Difference from empirical. In this case the result is 0.1616834
contracts_w1sd - 0.68
[1] 0.1616834
What percentage of the data lies within two standard deviations of
the mean?
#Within 2 sd
#Declare the variable contracts_w2sd and assign the results of the following calculation
#We add the contents of contract_years minus the contents of contracts_mean divided by the contents of contracts_sd that are less than 2 (For 2 Standard Deviations)
#Then divide the previous calculation by the contents of contracts_n
contracts_w2sd <- sum((contract_years - contracts_mean)/ contracts_sd < 2)/contracts_n
contracts_w2sd # Printing the results. In this case 1
[1] 1
#Difference from empirical
#Subtracting 0.95 from the contents of the variable contracts_w2sd to find the Difference from empirical. In this case the result is 0.05
contracts_w2sd - 0.95
[1] 0.05
What percent of the data lies within three standard deviations of the
mean?
#Within 3 sd
#Declare the variable contracts_w3sd and assign the results of the following calculation
#We add the contents of contract_years minus the contents of contracts_mean divided by the contents of contracts_sd that are less than 3 (For 3 Standard Deviations)
#Then divide the previous calculation by the contents of contracts_n
contracts_w3sd <- sum((contract_years - contracts_mean)/ contracts_sd < 3)/contracts_n
contracts_w3sd # Printing the results. In this case 1
[1] 1
#Difference from empirical
#Subtracting 0.9973 from the contents of the variable contracts_w3sd to find the Difference from empirical. In this case the result is 0.0027
contracts_w3sd - 0.9973
[1] 0.0027
Draw a histogram
#Create histogram
#Use the function hist() to create a histogram using the contents of contract_years
#With X axis lable Years Left in Contract
#Coloring the bars with green and the border with red
# 0,8 Limits for the x-axis
# 0,225 Limits for the y-axis
# breaks = 5 Number of bins (breaks) in the histogram
hist(contract_years,xlab = "Years Left in Contract",col = "green",border = "red", xlim = c(0,8), ylim = c(0,225),
breaks = 5)

Question 3
Use the skills learned in case scenario number 3 on one the following
data sets. You may choose only one dataset. They are both available in
Canvas.
doubles_hit.csv and triples_hit.csv
#The triples_hit.csv file contains all the players’ triple hits.
#We can read this file in R using the read.csv() function.
triples_data <- read.table("C:/Users/erlan/OneDrive/Desktop/School/CAP 4936 Sports Analytics/triples_hit.csv", header = TRUE, sep = ",")
#In This code we declare the variable triples_data
#Then use the read.table() function to read the file triples_hit.csv in the provided path including the heather and separated by comma to the variable contract_length
triples_hit <- triples_data$triples_hit
#In The above line of code we are extracting the values stored in the column named triples_hit from the data frame or list triples_data and assigning them to a new variable named triples_hit
Make comments about the code we just ran above.
Players: This variable holds a data frame that contains all the data
read from “allcontracts.csv”. Each row corresponds to a record from the
CSV file, and each column represents a different attribute.
triple_hits: This variable is a vector that contains only the values
from the triples_hit column of the Player data frame.
After executing this code, we can further analyze or manipulate the
data stored in Player and triple_hits using various R functions and
operations. For example, you could calculate summary statistics like
mean, median, or maximum triple hits using functions like
mean(triple_hits), median(triple_hits), or max(triple_hits).
To find the mean and the standard deviation
#Mean
#In This code we declare the variable triple_mean
#Then use the function mean() to calculate the average of the contents in the variable triples_hit
#Then assign the results to triple_mean
triple_mean <- mean(triples_hit)
#in this code we are printing the contents of the variable triple_mean
triple_mean
[1] 4.96
#Median
#In This code we declare the variable triple_mean
#Then use the function median() to calculate the median of the contents in the variable triples_hit
#Then assign the results to triple_mean
triple_median <- median(triples_hit)
#in this code we are printing the contents of the variable triple_mean
triple_median
[1] 5
#Find number of observations
#In this code we declare the variable triple_n
#Then use the function length() to calculate the size of the contents in the variable triples_hit and assign to triple_n
triple_n <- length(triples_hit)
triple_n # Printing the results. In this case 100
[1] 100
#Find standard deviation
#In this code we declare the variable triple_sd
#Then use the function sd() to calculate the standard deviation of the contents in the variable triples_hit and assign to triple_sd
triple_sd <- sd(triples_hit)
triple_sd # Printing the results. In this case 2.884721
[1] 2.884721
What percentage of the data lies within one standard deviation of the
mean?
#What percentage of the data lies within one standard deviation of the mean?
#Declare the variable triple_w1sd and assign the results of the following calculation
#We add the contents of triples_hit minus the contents of triple_mean divided by the contents of triple_sd that are less than 1 (For 1 Standard Deviations)
#Then divide the previous calculation by the contents of triple_n
triple_w1sd <- sum((triples_hit - triple_mean)/triple_sd < 1)/ triple_n
#Percentage of observation within one standard deviation of the mean
triple_w1sd # Printing the results. In this case 0.88
[1] 0.88
#Difference from empirical
#Subtracting 0.68 from the contents of the variable contracts_w1sd to find the Difference from empirical. In this case the result is 0.2
triple_w1sd - 0.68
[1] 0.2
What percentage of the data lies within two standard deviations of
the mean?
#Within 2 sd
#Declare the variable triple_w2sd and assign the results of the following calculation
#We add the contents of triples_hit minus the contents of triple_mean divided by the contents of triple_sd that are less than 2 (For 2 Standard Deviations)
#Then divide the previous calculation by the contents of triple_n
triple_w1sd <- sum((triples_hit - triple_mean)/triple_sd < 2)/ triple_n
#Percentage of observation within one standard deviation of the mean
triple_w1sd # Printing the results. In this case 0.93
[1] 0.93
##Difference from empirical
#Subtracting 0.95 from the contents of the variable contracts_w2sd to find the Difference from empirical. In this case the result is 0.91
triple_w1sd - 0.02
[1] 0.91
What percent of the data lies within three standard deviations of the
mean?
#Within 3 sd
#Declare the variable triple_w3sd and assign the results of the following calculation
#We add the contents of triples_hit minus the contents of triple_mean divided by the contents of triple_sd that are less than 3 (For 3 Standard Deviations)
#Then divide the previous calculation by the contents of triple_n
triple_w1sd <- sum((triples_hit - triple_mean)/triple_sd < 3)/ triple_n
#Percentage of observation within one standard deviation of the mean
triple_w1sd # Printing the results. In this case 0.98
[1] 0.98
#Difference from empirical
#Subtracting 0.9973 from the contents of the variable contracts_w3sd to find the Difference from empirical. In this case the result is -0.0173
triple_w3sd - 0.9973
[1] -0.0173
Draw a histogram
#Create histogram
#Use the function hist() to create a histogram using the contents of triples_hit
#With X axis lable Players Triples
#Coloring the bars with green and the border with red
# 0,8 Limits for the x-axis
# 0,225 Limits for the y-axis
# breaks = 5 Number of bins (breaks) in the histogram
hist(triples_hit,xlab = "Players Triples",col = "green",border = "red", xlim = c(0,8), ylim = c(0,225),
breaks = 5)

LS0tDQp0aXRsZTogIkFjdGl2aXR5XzUiDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQoqKkNhc2Utc2NlbmFyaW8gMSoqDQoNClRoaXMgaXMgdGhlIGZvdXJ0aCBzZWFzb24gb2Ygb3V0ZmllbGRlciBMdWlzIFJvYmVydCB3aXRoIHRoZSBDaGljYWdvIFdoaXRlIFNvY2tzIA0KDQpJZiBkdXJpbmcgdGhlIGZpcnN0IHRocmVlIHNlYXNvbnMgaGUgaGl0IDExLCAxMywgYW5kIDEyIGhvbWUgcnVucyAjI2hvdyBtYW55IGRvZXMgaGUgbmVlZCBvbiB0aGlzIHNlYXNvbiBmb3IgaGlzIG92ZXJhbGwgYXZlcmFnZSB0byBiZSBhdCBsZWFzdCAyMD8NCg0KDQpgYGB7cn0NCiMgU29sdXRpb24NCg0KI0dpdmVuIHRoYXQgeDE9MTEseDI9MTMseDM9MTINCiN3ZSB3YW50IHRvIGZpbmQgeDQNCiNzdWNoIHRoYXQgdGhlIG1lYW4gKGF2ZXJhZ2UpIG51bWJlciBvZiBob21lLXJ1bnMgaXMgeMKvPj0yMA0KDQojTm90aWNlIHRoYXQgaW4gdGhpcyBjYXNlIG49NA0KDQojQWNjb3JkaW5nIHRvIHRoZSBpbmZvcm1hdGlvbiBhYm92ZTogMjDDlzQ9MTErMTMrMTIreDQNCg0KI3NvIHdoZW4geDQ9NDQuIHRoZSBob21lLXJ1bnMgYXZlcmFnZSB3aWxsIGJlIDIwDQoNCiNBbnN3ZXIgSGVyZQ0KDQojSG9tZS1ydW5zIHNvIGZhcg0KDQpIUl9iZWZvcmUgPC0gYygxMSwgMTMsIDEyKSAjIFdlIGRlY2xhcmUgdGhlIHZhcmlhYmxlIEhSX2JlZm9yZSBhbmQgY29udmVydCBpdCB0byBhIHZlY3RvciBieSBhc3NpZ25pbmcgYygxMSwgMTMsIDEyKQ0KDQojQXZlcmFnZSBOdW1iZXIgb2YgSG9tZS1ydW5zIHBlciBzZWFzb24gd2FudGVkDQoNCndhbnRlZF9IUiA8LSAyMCAjIFdlIGRlY2xhcmUgdGhlIHZhcmlhYmxlIHdhbnRlZF9IUiBhbmQgYXNzaWduIDIwIA0KDQojTnVtYmVyIG9mIHNlYXNvbnMNCg0Kbl9zZWFzb25zIDwtIDQgIyBXZSBkZWNsYXJlIHRoZSB2YXJpYWJsZSBuX3NlYXNvbnMgYW5kIGFzc2lnbiA0IA0KDQojTmVlZGVkIEhvbWUtcnVucyBvbiBzZWFzb24gNA0KDQp4XzQgPC0gbl9zZWFzb25zKndhbnRlZF9IUiAtIHN1bShIUl9iZWZvcmUpICMgV2UgZGVjbGFyZSB0aGUgdmFyaWFibGUgWF80IGFuZCBhc3NpZ24gdGhlIHJlc3VsdCBvZiB0aGUgZm9sbG93aW5nIGNhbGN1bGF0aW9uDQojIDQqMjAgLSAoMTErMTMrMTIpIA0KI1RoZSByZXN1bHQgd2lsbCBiZSA0NA0KDQojTWluaW11bSBudW1iZXIgb2YgSG9tZS1ydW5zIG5lZWRlZCBieSBSb2JlcnQNCiNJbiB0aGlzIGNvZGUgd2UgYXJlIHByaW50aW5nIHRoZSBjb250ZW50cyBvZiB0aGUgdmFyaWFibGUgWF80DQp4XzQNCmBgYA0KQWNjb3JkaW5nIHRvIHRoZSBjYWxjdWxhdGlvbnMgYWJvdmUsIA0KUm9iZXJ0IG11c3QgaGl0IDQ0IGhvbWUtcnVucyBvciBiZXR0ZXIgb24gdGhpcyBzZWFzb24gDQp0byBnZXQgYW4gYXZlcmFnZSBudW1iZXIgb2YgaG9tZS1ydW5zIHBlciBzZWFzb24gb2YgYXQgbGVhc3QgMjAuDQoNCldlIGNvdWxkIGNvbmZpcm0gdGhpcywgYnkgdXNpbmcgdGhlIGZ1bmN0aW9uIG1lYW4oKSBpbiBSDQoNCmBgYHtyfQ0KI1JvYmVydCdzIHBlcmZvcm1hbmNlDQoNClJvYmVydF9IUnMgPC0gYygxMSwgMTMsIDEyLDQ0KSAjV2UgZGVjbGFyZWQgdGhlIHZhcmlhYmxlIFJvYmVydF9IUnMgYW5kIGNvbnZlcnQgaXQgdG8gYSB2ZWN0b3IgYnkgYXNzaWduaW5nIGMoMTEsIDEzLCAxMiw0NCkNCiNJbiB0aGlzIGNhc2Ugd2UgYWRkZWQgdGhlIGNvbnRlbnRzIG9mIEhSX2JlZm9yZSBhbmQgeF80DQoNCiNGaW5kIG1lYW4NCiNJbiB0aGlzIGNvZGUgd2UgYXJlIHVzaW5nIHRoZSBmdW5jdGlvbiBtZWFuKCkgdG8gZmluZCB0aGUgYXZlcmFnZSBvZiB0aGUgY29udGVudHMgb2YgUm9iZXJ0X0hScw0KI1RoZSByZXN1bHRzIHNob3VsZCBiZSAyMC4gVGhpcyBjb25maXJtIHRoZSBjYWxjdWxhdGlvbiBvbiB0aGUgcHJpdmVyaW91cyBjb2RlIGNodW5jaw0KbWVhbihSb2JlcnRfSFJzKQ0KYGBgDQpgYGB7cn0NCiNGaW5kIHN0YW5kYXJkIGRldmlhdGlvbg0KI0luIHRoaXMgY29kZSB3ZSBhcmUgdXNpbmcgdGhlIGZ1bmN0aW9uIHNkKCkgdG8gZmluZCB0aGUgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIHRoZSBjb250ZW50cyBvZiBSb2JlcnRfSFJzDQpzZChSb2JlcnRfSFJzKQ0KYGBgDQpgYGB7cn0NCiNGaW5kIHRoZSBtYXhpbXVtIG51bWJlciBvZiBob21lLXJ1bnMgZHVyaW5nIHRoZSBmb3VyIHNlYXNvbnMgcGVyaW9kLg0KI0luIHRoaXMgY29kZSB3ZSBhcmUgdXNpbmcgdGhlIGZ1bmN0aW9uIG1heCgpIHRvIGZpbmQgdGhlIGhpZ2hlc3QgdmFsdWUgaW4gdGhlIGNvbnRlbnRzIG9mIFJvYmVydF9IUnMNCm1heChSb2JlcnRfSFJzKQ0KYGBgDQpgYGB7cn0NCiNGaW5kIHRoZSBtaW5pbXVtIG51bWJlciBvZiBob21lLXJ1bnMgZHVyaW5nIHRoZSBmb3VyIHNlYXNvbnMgcGVyaW9kDQojSW4gdGhpcyBjb2RlIHdlIGFyZSB1c2luZyB0aGUgZnVuY3Rpb24gbWluKCkgdG8gZmluZCB0aGUgbG93ZXN0IHZhbHVlIGluIHRoZSBjb250ZW50cyBvZiBSb2JlcnRfSFJzDQptaW4oUm9iZXJ0X0hScykNCmBgYA0KYGBge3J9DQojV2UgY2FuIGFsc28gdXNlIHRoZSBzdW1tYXJ5KCkgZnVuY3Rpb24gdG8gZmluZCBiYXNpYyBzdGF0aXN0aWNzLCBpbmNsdWRpbmcgdGhlIG1lZGlhbiENCg0KI0luIFRoaXMgY29kZSB3ZSB1c2UgdGhlIGZ1bmN0aW9uIHN1bW1hcnkoKSB0byBmaW5kIHRoZSBmb2xsb3dpbmcgc3RhdGlzdGljYWwgdmFsdWVzIGluIHRoZSB2YXJpYWJsZSBSb2JlcnRfSFJzDQoNCiNNaW5pbXVtIChNaW4pOiBUaGUgc21hbGxlc3QgdmFsdWUgaW4gdGhlIHZlY3Rvci4NCiMxc3QgUXVhcnRpbGUgKDFzdCBRdSk6IFRoZSB2YWx1ZSBiZWxvdyB3aGljaCAyNSUgb2YgdGhlIGRhdGEgZmFsbHMgKGFsc28ga25vd24gYXMgUTEgb3IgdGhlIGxvd2VyIHF1YXJ0aWxlKS4NCiNNZWRpYW4gKE1lZGlhbiBvciA1MHRoIHBlcmNlbnRpbGUpOiBUaGUgbWlkZGxlIHZhbHVlIGluIHRoZSBzb3J0ZWQgdmVjdG9yIChRMikuDQojTWVhbiAoTWVhbik6IFRoZSBhdmVyYWdlIHZhbHVlIG9mIHRoZSB2ZWN0b3IuDQojM3JkIFF1YXJ0aWxlICgzcmQgUXUpOiBUaGUgdmFsdWUgYmVsb3cgd2hpY2ggNzUlIG9mIHRoZSBkYXRhIGZhbGxzIChRMyBvciB0aGUgdXBwZXIgcXVhcnRpbGUpLg0KI01heGltdW0gKE1heCk6IFRoZSBsYXJnZXN0IHZhbHVlIGluIHRoZSB2ZWN0b3IuDQojTnVtYmVyIG9mIG5vbi1taXNzaW5nIHZhbHVlcyAoTkEncyk6IFRoZSBjb3VudCBvZiBtaXNzaW5nIG9yIE5BIHZhbHVlcyBpbiB0aGUgdmVjdG9yLg0KDQpzdW1tYXJ5KFJvYmVydF9IUnMpDQpgYGANCioqUXVlc3Rpb24gMSoqDQoNCk5vdywgeW91IG11c3QgY29tcGxldGUgdGhlIHByb2JsZW0gYmVsb3cgd2hpY2ggcmVwcmVzZW50cyBhIHNpbWlsYXIgY2FzZSBzY2VuYXJpby4gDQpZb3UgbWF5IHVzZSB0aGUgc3RlcHMgdGhhdCB3ZSBleGVjdXRlZCBpbiBDYXNlLXNjZW5hcmlvIDEgYXMgYSB0ZW1wbGF0ZSBmb3IgeW91ciBzb2x1dGlvbi4NCg0KVGhpcyBpcyB0aGUgc2l4dGggc2Vhc29uIG9mIG91dGZpZWxkZXIgSnVhbiBTb3RvIGluIHRoZSBtYWpvcnMuIA0KSWYgZHVyaW5nIHRoZSBmaXJzdCBmaXZlIHNlYXNvbnMgaGUgcmVjZWl2ZWQgNzksIDEwOCw0MSwxNDUsIGFuZCAxMzUgd2Fsa3MsIA0KaG93IG1hbnkgZG9lcyBoZSBuZWVkIG9uIHRoaXMgc2Vhc29uIGZvciBoaXMgb3ZlcmFsbCBudW1iZXIgb2Ygd2Fsa3MgcGVyIHNlYXNvbiB0byBiZSBhdCBsZWFzdCAxMDA/DQoNCmBgYHtyfQ0KI0hvbWUtcnVucyBzbyBmYXINCg0KV2Fsa3NfYmVmb3JlIDwtIGMoNzksIDEwOCwgNDEsMTQ1LDEzNSkgI0luIHRoaXMgY29kZSB3ZSBkZWNsYXJlIHRoZSB2YXJpYWJsZSBXYWxrc19iZWZvcmUgdGhlbiBjb252ZXJ0IGl0IHRvIGEgdmVjdG9yIGJ5IGFkZGluZyBjKDc5LCAxMDgsIDQxLDE0NSwxMzUpDQoNCiNBdmVyYWdlIE51bWJlciBvZiBXYWxrcyBwZXIgc2Vhc29uIHdhbnRlZA0KDQp3YW50ZWRfV2Fsa3MgPC0gMTAwICNJbiB0aGlzIGNvZGUgd2UgZGVjbGFyZSB0aGUgdmFyaWFibGUgd2FudGVkX1dhbGtzIGFuZCBhc3NpZ24gMTAwDQoNCiNOdW1iZXIgb2Ygc2Vhc29ucw0KDQpuX3NlYXNvbnMgPC0gNiAjSW4gdGhpcyBjb2RlIHdlIGRlY2xhcmUgdGhlIHZhcmlhYmxlIG5fc2Vhc29ucyBhbmQgYXNzaWduIDEwMA0KDQojTmVlZGVkIFdhbGtzIG9uIHNlYXNvbiA2DQoNCnhfNiA8LSBuX3NlYXNvbnMqd2FudGVkX1dhbGtzIC0gc3VtKFdhbGtzX2JlZm9yZSkgIyBJbiB0aGlzIGNvZGUgd2UgZGVjbGFyZSB0aGUgdmFyaWFibGUgeF82IGFuZCBhc3NpZ24gdGhlIHJlc3VsdHMgb2YgdGhlIGZvbGxvd2luZyBjYWxjdWxhdGlvbg0KIzYqMTAwIC0gKDc5KzEwOCs0MSsxNDUrMTM1KQ0KIzYwMCAtIDUwOA0KI1RoZSByZXN1bHQgd2lsbCBiZSA5Mg0KDQojTWluaW11bSBudW1iZXIgb2Ygd2Fsa3MgbmVlZGVkIGJ5IEp1YW4NCg0KeF82DQpgYGANCioqQ2FzZS1zY2VuYXJpbyoqDQoNClRoZSBhdmVyYWdlIHNhbGFyeSBvZiAxMCBiYXNlYmFsbCBwbGF5ZXJzIGlzIDcyLDAwMCBkb2xsYXJzIGEgd2VlayBhbmQgdGhlIGF2ZXJhZ2Ugc2FsYXJ5IG9mIDQgc29jY2VyIHBsYXllcnMgDQppcyA4NCwwMDAuIEZpbmQgdGhlIG1lYW4gc2FsYXJ5IG9mIGFsbCAxNCBwcm9mZXNzaW9uYWwgcGxheWVycy4NCg0KKipTb2x1dGlvbioqDQoNCldlIGNhbiBlYXNpbHkgZmluZCB0aGUgam9pbmVkIG1lYW4gYnkgYWRkaW5nIGJvdGggbWVhbiBhbmQgZGl2aWRpbmcgYnkgdGhlIHRvdGFsIG51bWJlciBvZiBwZW9wbGUuDQoNCkxldCBuMT0xMA0KZGVub3RlIHRoZSBudW1iZXIgb2YgYmFzZWJhbGwgcGxheWVycywgYW5kIHkxPTcyMDAwDQp0aGVpciBtZWFuIHNhbGFyeS4gTGV0IG4yPTQNCnRoZSBudW1iZXIgb2Ygc29jY2VyIHBsYXllcnMgYW5kIHkyPTg0MDAwDQp0aGVpciBtZWFuIHNhbGFyeS4gVGhlbiB0aGUgbWVhbiBzYWxhcnkgb2YgYWxsIDE2IGluZGl2aWR1YWxzIGlzOiBuMXgxK24yeDJuMStuMg0KDQpXZSBjYW4gY29tcHV0ZSB0aGlzIGluIFIgYXMgZm9sbG93czoNCg0KYGBge3J9DQpuXzEgPC0gMTAgIyBEZWNsYXJlIHRoZSB2YXJpYWJsZSBuXzEgYW5kIGFzc2lnbiAxMCAoQmFzZWJhbGwgUGxheWVycykNCm5fMiA8LSA0ICMgRGVjbGFyZSB0aGUgdmFyaWFibGUgbl8yIGFuZCBhc3NpZ24gNCAoU29jY2VyIFBsYXllcnMpDQp5XzEgPC0gNzIwMDAgIyBEZWNsYXJlIHRoZSB2YXJpYWJsZSB5XzEgYW5kIGFzc2lnbiA3MjAwMCAoQmFzZWJhbGwgUGxheWVycyBTYWxhcmllcykNCnlfMiA8LSA4NDAwMCAjIERlY2xhcmUgdGhlIHZhcmlhYmxlIHlfMiBhbmQgYXNzaWduIDg0MDAwIChTb2NjZXIgUGxheWVycyBTYWxhcmllcykNCiNNZWFuIHNhbGFyeSBvdmVyYWxsDQpzYWxhcnlfYXZlIDwtICAobl8xKnlfMSArIG5fMip5XzIpLyhuXzErbl8yKSAjIERlY2xhcmUgdGhlIHZhcmlhYmxlIHNhbGFyeV9hdmUgYW5kIGFzc2lnbiB0aGUgdmFsdWVzIG9mIHRoZSBmb2xsb3dpbmcgY2FsY3VsYXRpb24NCiMxMCo3MjAwMCArIDQqODQwMDAgLyAxMCs0DQojNzIwMDAwICsgMzM2MDAwIC8gMTQNCiMgVGhlIGFuc3dlciB3aWxsIGJlIDc1NDI4LjU3DQoNCnNhbGFyeV9hdmUgI1dlIGFyZSBwcmludGluZyB0aGUgY29udGVudHMgb2YgdGhlIHZhcmlhYmxlIHNhbGFyeV9hdmUNCmBgYA0KKipRdWVzdGlvbiAyKioNCg0KVGhlIGF2ZXJhZ2Ugc2FsYXJ5IG9mIDcgYmFza2V0YmFsbCBwbGF5ZXJzIGlzIDEwMiwwMDAgZG9sbGFycyBhIHdlZWsgYW5kIHRoZSBhdmVyYWdlIHNhbGFyeSBvZiA5IE5GTCBwbGF5ZXJzIGlzIDkxLDAwMC4gDQpGaW5kIHRoZSBtZWFuIHNhbGFyeSBvZiBhbGwgMTYgcHJvZmVzc2lvbmFsIHBsYXllcnMuDQoNCmBgYHtyfQ0Kbl8xIDwtIDcgIyBEZWNsYXJlIHRoZSB2YXJpYWJsZSBuXzEgYW5kIGFzc2lnbiA3IChCYXNlYmFsbCBQbGF5ZXJzKQ0Kbl8yIDwtIDkgIyBEZWNsYXJlIHRoZSB2YXJpYWJsZSBuXzIgYW5kIGFzc2lnbiA5IChORkwgUGxheWVycykNCnlfMSA8LSAxMDIwMDAgIyBEZWNsYXJlIHRoZSB2YXJpYWJsZSB5XzEgYW5kIGFzc2lnbiAxMDIwMDAgKEJhc2ViYWxsIFBsYXllcnMgU2FsYXJpZXMpDQp5XzIgPC0gOTEwMDAgIyBEZWNsYXJlIHRoZSB2YXJpYWJsZSB5XzIgYW5kIGFzc2lnbiA5MTAwMCAoTkZMIFBsYXllcnMgU2FsYXJpZXMpDQojI01lYW4gc2FsYXJ5IG92ZXJhbGwNCnNhbGFyeV9hdmUgPC0gIChuXzEqeV8xICsgbl8yKnlfMikvKG5fMStuXzIpICMgRGVjbGFyZSB0aGUgdmFyaWFibGUgc2FsYXJ5X2F2ZSBhbmQgYXNzaWduIHRoZSB2YWx1ZXMgb2YgdGhlIGZvbGxvd2luZyBjYWxjdWxhdGlvbg0KIzcqMTAyMDAwICsgOSo5MTAwMCAvIDcrOQ0KIzcxNDAwMCArIDgxOTAwMCAvIDE2DQojIFRoZSBhbnN3ZXIgd2lsbCBiZSA5NTgxMi41DQoNCg0Kc2FsYXJ5X2F2ZSAjV2UgYXJlIHByaW50aW5nIHRoZSBjb250ZW50cyBvZiB0aGUgdmFyaWFibGUgc2FsYXJ5X2F2ZQ0KYGBgDQoqKkNhc2Utc2NlbmFyaW8gMyoqDQoNClRoZSBmcmVxdWVuY3kgZGlzdHJpYnV0aW9uIGJlbG93IGxpc3RzIHRoZSBudW1iZXIgb2YgYWN0aXZlIHBsYXllcnMgaW4gdGhlIEJhcmNsYXlzIFByZW1pZXIgTGVhZ3VlIGFuZCB0aGUgdGltZSBsZWZ0IGluIHRoZWlyIGNvbnRyYWN0Lg0KDQpZZWFycyAgICAgTnVtYmVyIG9mIFBsYXllcnMNCjYgICAgICAgICAyOA0KNSAgICAgICAgIDcyDQo0ICAgICAgICAgMjAxICANCjMgICAgICAgICAxMDkNCjIgICAgICAgICA1Ng0KMSAgICAgICAgIDM0DQoNCkZpbmQgdGhlIG1lYW4sdGhlIG1lZGlhbiBhbmQgdGhlIHN0YW5kYXJkIGRldmlhdGlvbi4NCg0KV2hhdCBwZXJjZW50YWdlIG9mIHRoZSBkYXRhIGxpZXMgd2l0aGluIG9uZSBzdGFuZGFyZCBkZXZpYXRpb24gb2YgdGhlIG1lYW4/DQoNCldoYXQgcGVyY2VudGFnZSBvZiB0aGUgZGF0YSBsaWVzIHdpdGhpbiB0d28gc3RhbmRhcmQgZGV2aWF0aW9ucyBvZiB0aGUgbWVhbj8NCg0KV2hhdCBwZXJjZW50IG9mIHRoZSBkYXRhIGxpZXMgd2l0aGluIHRocmVlIHN0YW5kYXJkIGRldmlhdGlvbnMgb2YgdGhlIG1lYW4/DQoNCkRyYXcgYSBoaXN0b2dyYW0gdG8gaWxsdXN0cmF0ZSB0aGUgZGF0YS4NCg0KKipTb2x1dGlvbioqDQoNCmBgYHtyfQ0KI1RoZSBhbGxjb250cmFjdHMuY3N2IGZpbGUgY29udGFpbnMgYWxsIHRoZSBwbGF5ZXJz4oCZIGNvbnRyYWN0cyBsZW5ndGguIA0KI1dlIGNhbiByZWFkIHRoaXMgZmlsZSBpbiBSIHVzaW5nIHRoZSByZWFkLmNzdigpIGZ1bmN0aW9uLg0KDQpjb250cmFjdF9sZW5ndGggPC0gcmVhZC50YWJsZSgiQzovVXNlcnMvZXJsYW4vT25lRHJpdmUvRGVza3RvcC9TY2hvb2wvQ0FQIDQ5MzYgU3BvcnRzIEFuYWx5dGljcy9hbGxjb250cmFjdHMuY3N2IiwgaGVhZGVyID0gVFJVRSwgc2VwID0gIiwiKQ0KI0luIFRoaXMgY29kZSB3ZSBkZWNsYXJlIHRoZSB2YXJpYWJsZSBjb250cmFjdF9sZW5ndGggDQojVGhlbiB1c2UgdGhlIHJlYWQudGFibGUoKSBmdW5jdGlvbiB0byByZWFkIHRoZSBmaWxlIGFsbGNvbnRyYWN0cy5jc3YgaW4gdGhlIHByb3ZpZGVkIHBhdGggaW5jbHVkaW5nIHRoZSBoZWF0aGVyIGFuZCBzZXBhcmF0ZWQgYnkgY29tbWEgdG8gdGhlIHZhcmlhYmxlIGNvbnRyYWN0X2xlbmd0aA0KY29udHJhY3RfeWVhcnMgPC0gY29udHJhY3RfbGVuZ3RoJHllYXJzDQojSW4gVGhlIGFib3ZlIGxpbmUgb2YgY29kZSB3ZSBhcmUgZXh0cmFjdGluZyB0aGUgdmFsdWVzIHN0b3JlZCBpbiB0aGUgY29sdW1uIG5hbWVkIHllYXJzIGZyb20gdGhlIGRhdGEgZnJhbWUgb3IgbGlzdCBjb250cmFjdF9sZW5ndGggYW5kIGFzc2lnbmluZyB0aGVtIHRvIGEgbmV3IHZhcmlhYmxlIG5hbWVkIGNvbnRyYWN0X3llYXJzDQpgYGANCg0KTWFrZSBjb21tZW50cyBhYm91dCB0aGUgY29kZSB3ZSBqdXN0IHJhbiBhYm92ZS4NCg0KY29udHJhY3RfbGVuZ3RoOiBUaGlzIHZhcmlhYmxlIGhvbGRzIGEgZGF0YSBmcmFtZSB0aGF0IGNvbnRhaW5zIGFsbCB0aGUgZGF0YSByZWFkIGZyb20gImFsbGNvbnRyYWN0cy5jc3YiLiANCkVhY2ggcm93IGNvcnJlc3BvbmRzIHRvIGEgcmVjb3JkIGZyb20gdGhlIENTViBmaWxlLCBhbmQgZWFjaCBjb2x1bW4gcmVwcmVzZW50cyBhIGRpZmZlcmVudCBhdHRyaWJ1dGUgKHN1Y2ggYXMgY29udHJhY3QgZGV0YWlscykuDQoNCmNvbnRyYWN0X3llYXJzOiBUaGlzIHZhcmlhYmxlIGlzIGEgdmVjdG9yIHRoYXQgY29udGFpbnMgb25seSB0aGUgdmFsdWVzIGZyb20gdGhlIHllYXJzIGNvbHVtbiBvZiB0aGUgY29udHJhY3RfbGVuZ3RoIGRhdGEgZnJhbWUuIA0KRWFjaCBlbGVtZW50IGluIGNvbnRyYWN0X3llYXJzIHJlcHJlc2VudHMgdGhlIGxlbmd0aCBvZiBhIGNvbnRyYWN0IGluIHllYXJzIGFzIHNwZWNpZmllZCBpbiB0aGUgQ1NWIGZpbGUuDQoNCg0KQWZ0ZXIgZXhlY3V0aW5nIHRoaXMgY29kZSwgd2UgY2FuIGZ1cnRoZXIgYW5hbHl6ZSBvciBtYW5pcHVsYXRlIHRoZSBkYXRhIHN0b3JlZCBpbiBjb250cmFjdF9sZW5ndGggYW5kIGNvbnRyYWN0X3llYXJzIHVzaW5nIHZhcmlvdXMgUiBmdW5jdGlvbnMgYW5kIG9wZXJhdGlvbnMuIEZvciBleGFtcGxlLCB5b3UgY291bGQgY2FsY3VsYXRlIHN1bW1hcnkgc3RhdGlzdGljcyBsaWtlIG1lYW4sIG1lZGlhbiwgb3IgbWF4aW11bSBjb250cmFjdCBsZW5ndGggdXNpbmcgZnVuY3Rpb25zIGxpa2UgbWVhbihjb250cmFjdF95ZWFycyksIG1lZGlhbihjb250cmFjdF95ZWFycyksIG9yIG1heChjb250cmFjdF95ZWFycykuDQoNClRvIGZpbmQgdGhlIG1lYW4gYW5kIHRoZSBzdGFuZGFyZCBkZXZpYXRpb24NCg0KYGBge3J9DQojTWVhbiANCiNJbiBUaGlzIGNvZGUgd2UgZGVjbGFyZSB0aGUgdmFyaWFibGUgY29udHJhY3RzX21lYW4NCiNUaGVuIHVzZSB0aGUgZnVuY3Rpb24gbWVhbigpIHRvIGNhbGN1bGF0ZSB0aGUgYXZlcmFnZSBvZiB0aGUgY29udGVudHMgaW4gdGhlIHZhcmlhYmxlIGNvbnRyYWN0X3llYXJzDQojVGhlbiBhc3NpZ24gdGhlIHJlc3VsdHMgdG8gY29udHJhY3RzX21lYW4NCmNvbnRyYWN0c19tZWFuICA8LSBtZWFuKGNvbnRyYWN0X3llYXJzKQ0KI2luIHRoaXMgY29kZSB3ZSBhcmUgcHJpbnRpbmcgdGhlIGNvbnRlbnRzIG9mIHRoZSB2YXJpYWJsZSBjb250cmFjdHNfbWVhbg0KY29udHJhY3RzX21lYW4NCg0KYGBgDQpgYGB7cn0NCiNNZWRpYW4NCiNJbiBUaGlzIGNvZGUgd2UgZGVjbGFyZSB0aGUgdmFyaWFibGUgY29udHJhY3RzX21lZGlhbg0KI1RoZW4gdXNlIHRoZSBmdW5jdGlvbiBtZWRpYW4oKSB0byBjYWxjdWxhdGUgdGhlIG1lZGlhbiBvZiB0aGUgY29udGVudHMgaW4gdGhlIHZhcmlhYmxlIGNvbnRyYWN0X3llYXJzDQojVGhlbiBhc3NpZ24gdGhlIHJlc3VsdHMgdG8gY29udHJhY3RzX21lZGlhbg0KY29udHJhY3RzX21lZGlhbiA8LSBtZWRpYW4oY29udHJhY3RfeWVhcnMpDQojaW4gdGhpcyBjb2RlIHdlIGFyZSBwcmludGluZyB0aGUgY29udGVudHMgb2YgdGhlIHZhcmlhYmxlIGNvbnRyYWN0c19tZWRpYW4NCmNvbnRyYWN0c19tZWRpYW4NCmBgYA0KYGBge3J9DQojRmluZCBudW1iZXIgb2Ygb2JzZXJ2YXRpb25zDQojSW4gdGhpcyBjb2RlIHdlIGRlY2xhcmUgdGhlIHZhcmlhYmxlIGNvbnRyYWN0c19uDQojVGhlbiB1c2UgdGhlIGZ1bmN0aW9uIGxlbmd0aCgpIHRvIGNhbGN1bGF0ZSB0aGUgc2l6ZSBvZiB0aGUgY29udGVudHMgaW4gdGhlIHZhcmlhYmxlIGNvbnRyYWN0X3llYXJzIGFuZCBhc3NpZ24gdG8gY29udHJhY3RzX24NCmNvbnRyYWN0c19uIDwtIGxlbmd0aChjb250cmFjdF95ZWFycykNCmNvbnRyYWN0c19uICMgUHJpbnRpbmcgdGhlIHJlc3VsdHMuIEluIHRoaXMgY2FzZSA0OTkNCiNGaW5kIHN0YW5kYXJkIGRldmlhdGlvbg0KI0luIHRoaXMgY29kZSB3ZSBkZWNsYXJlIHRoZSB2YXJpYWJsZSBjb250cmFjdHNfc2QNCiNUaGVuIHVzZSB0aGUgZnVuY3Rpb24gc2QoKSB0byBjYWxjdWxhdGUgdGhlIHN0YW5kYXJkIGRldmlhdGlvbiBvZiB0aGUgY29udGVudHMgaW4gdGhlIHZhcmlhYmxlIGNvbnRyYWN0X3llYXJzIGFuZCBhc3NpZ24gdG8gY29udHJhY3RzX3NkDQpjb250cmFjdHNfc2QgPC0gc2QoY29udHJhY3RfeWVhcnMpDQpjb250cmFjdHNfc2QgIyBQcmludGluZyB0aGUgcmVzdWx0cy4gSW4gdGhpcyBjYXNlIDEuNjk2ODYNCmBgYA0KDQpgYGB7cn0NCiNXaGF0IHBlcmNlbnRhZ2Ugb2YgdGhlIGRhdGEgbGllcyB3aXRoaW4gb25lIHN0YW5kYXJkIGRldmlhdGlvbiBvZiB0aGUgbWVhbj8NCiNEZWNsYXJlIHRoZSB2YXJpYWJsZSBjb250cmFjdHNfdzFzZCBhbmQgYXNzaWduIHRoZSByZXN1bHRzIG9mIHRoZSBmb2xsb3dpbmcgY2FsY3VsYXRpb24NCiNXZSBhZGQgdGhlIGNvbnRlbnRzIG9mIGNvbnRyYWN0X3llYXJzIG1pbnVzIHRoZSBjb250ZW50cyBvZiBjb250cmFjdHNfbWVhbiBkaXZpZGVkIGJ5IHRoZSBjb250ZW50cyBvZiBjb250cmFjdHNfc2QgdGhhdCBhcmUgbGVzcyB0aGFuIDEgKEZvciAxIFN0YW5kYXJkIERldmlhdGlvbnMpDQojVGhlbiBkaXZpZGUgdGhlIHByZXZpb3VzIGNhbGN1bGF0aW9uIGJ5IHRoZSBjb250ZW50cyBvZiBjb250cmFjdHNfbg0KY29udHJhY3RzX3cxc2QgPC0gc3VtKChjb250cmFjdF95ZWFycyAtIGNvbnRyYWN0c19tZWFuKS9jb250cmFjdHNfc2QgPCAxKS8gY29udHJhY3RzX24NCiNQZXJjZW50YWdlIG9mIG9ic2VydmF0aW9uIHdpdGhpbiBvbmUgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIHRoZSBtZWFuDQpjb250cmFjdHNfdzFzZCAgIyBQcmludGluZyB0aGUgcmVzdWx0cy4gSW4gdGhpcyBjYXNlIDAuODQxNjgzNA0KYGBgDQpgYGB7cn0NCiNEaWZmZXJlbmNlIGZyb20gZW1waXJpY2FsIA0KI1N1YnRyYWN0aW5nIDAuNjggZnJvbSB0aGUgY29udGVudHMgb2YgdGhlIHZhcmlhYmxlIGNvbnRyYWN0c193MXNkIHRvIGZpbmQgdGhlIERpZmZlcmVuY2UgZnJvbSBlbXBpcmljYWwuIEluIHRoaXMgY2FzZSB0aGUgcmVzdWx0IGlzIDAuMTYxNjgzNA0KY29udHJhY3RzX3cxc2QgLSAwLjY4DQpgYGANCldoYXQgcGVyY2VudGFnZSBvZiB0aGUgZGF0YSBsaWVzIHdpdGhpbiB0d28gc3RhbmRhcmQgZGV2aWF0aW9ucyBvZiB0aGUgbWVhbj8NCg0KYGBge3J9DQojV2l0aGluIDIgc2QNCiNEZWNsYXJlIHRoZSB2YXJpYWJsZSBjb250cmFjdHNfdzJzZCBhbmQgYXNzaWduIHRoZSByZXN1bHRzIG9mIHRoZSBmb2xsb3dpbmcgY2FsY3VsYXRpb24NCiNXZSBhZGQgdGhlIGNvbnRlbnRzIG9mIGNvbnRyYWN0X3llYXJzIG1pbnVzIHRoZSBjb250ZW50cyBvZiBjb250cmFjdHNfbWVhbiBkaXZpZGVkIGJ5IHRoZSBjb250ZW50cyBvZiBjb250cmFjdHNfc2QgdGhhdCBhcmUgbGVzcyB0aGFuIDIgKEZvciAyIFN0YW5kYXJkIERldmlhdGlvbnMpDQojVGhlbiBkaXZpZGUgdGhlIHByZXZpb3VzIGNhbGN1bGF0aW9uIGJ5IHRoZSBjb250ZW50cyBvZiBjb250cmFjdHNfbg0KY29udHJhY3RzX3cyc2QgPC0gc3VtKChjb250cmFjdF95ZWFycyAtIGNvbnRyYWN0c19tZWFuKS8gY29udHJhY3RzX3NkIDwgMikvY29udHJhY3RzX24NCg0KY29udHJhY3RzX3cyc2QgIyBQcmludGluZyB0aGUgcmVzdWx0cy4gSW4gdGhpcyBjYXNlIDENCmBgYA0KYGBge3J9DQojRGlmZmVyZW5jZSBmcm9tIGVtcGlyaWNhbCANCiNTdWJ0cmFjdGluZyAwLjk1IGZyb20gdGhlIGNvbnRlbnRzIG9mIHRoZSB2YXJpYWJsZSBjb250cmFjdHNfdzJzZCB0byBmaW5kIHRoZSBEaWZmZXJlbmNlIGZyb20gZW1waXJpY2FsLiBJbiB0aGlzIGNhc2UgdGhlIHJlc3VsdCBpcyAwLjA1DQpjb250cmFjdHNfdzJzZCAtIDAuOTUNCmBgYA0KV2hhdCBwZXJjZW50IG9mIHRoZSBkYXRhIGxpZXMgd2l0aGluIHRocmVlIHN0YW5kYXJkIGRldmlhdGlvbnMgb2YgdGhlIG1lYW4/DQoNCmBgYHtyfQ0KI1dpdGhpbiAzIHNkIA0KI0RlY2xhcmUgdGhlIHZhcmlhYmxlIGNvbnRyYWN0c193M3NkIGFuZCBhc3NpZ24gdGhlIHJlc3VsdHMgb2YgdGhlIGZvbGxvd2luZyBjYWxjdWxhdGlvbg0KI1dlIGFkZCB0aGUgY29udGVudHMgb2YgY29udHJhY3RfeWVhcnMgbWludXMgdGhlIGNvbnRlbnRzIG9mIGNvbnRyYWN0c19tZWFuIGRpdmlkZWQgYnkgdGhlIGNvbnRlbnRzIG9mIGNvbnRyYWN0c19zZCB0aGF0IGFyZSBsZXNzIHRoYW4gMyAoRm9yIDMgU3RhbmRhcmQgRGV2aWF0aW9ucykNCiNUaGVuIGRpdmlkZSB0aGUgcHJldmlvdXMgY2FsY3VsYXRpb24gYnkgdGhlIGNvbnRlbnRzIG9mIGNvbnRyYWN0c19uDQpjb250cmFjdHNfdzNzZCA8LSBzdW0oKGNvbnRyYWN0X3llYXJzIC0gY29udHJhY3RzX21lYW4pLyBjb250cmFjdHNfc2QgPCAzKS9jb250cmFjdHNfbg0KDQpjb250cmFjdHNfdzNzZCAjIFByaW50aW5nIHRoZSByZXN1bHRzLiBJbiB0aGlzIGNhc2UgMQ0KYGBgDQpgYGB7cn0NCiNEaWZmZXJlbmNlIGZyb20gZW1waXJpY2FsIA0KI1N1YnRyYWN0aW5nIDAuOTk3MyBmcm9tIHRoZSBjb250ZW50cyBvZiB0aGUgdmFyaWFibGUgY29udHJhY3RzX3czc2QgdG8gZmluZCB0aGUgRGlmZmVyZW5jZSBmcm9tIGVtcGlyaWNhbC4gSW4gdGhpcyBjYXNlIHRoZSByZXN1bHQgaXMgMC4wMDI3DQpjb250cmFjdHNfdzNzZCAtIDAuOTk3Mw0KYGBgDQoqKkRyYXcgYSBoaXN0b2dyYW0qKg0KDQpgYGB7cn0NCiNDcmVhdGUgaGlzdG9ncmFtDQojVXNlIHRoZSBmdW5jdGlvbiBoaXN0KCkgdG8gY3JlYXRlIGEgaGlzdG9ncmFtIHVzaW5nIHRoZSBjb250ZW50cyBvZiBjb250cmFjdF95ZWFycw0KI1dpdGggWCBheGlzIGxhYmxlIFllYXJzIExlZnQgaW4gQ29udHJhY3QNCiNDb2xvcmluZyB0aGUgYmFycyB3aXRoIGdyZWVuIGFuZCB0aGUgYm9yZGVyIHdpdGggcmVkDQojIDAsOCBMaW1pdHMgZm9yIHRoZSB4LWF4aXMNCiMgMCwyMjUgTGltaXRzIGZvciB0aGUgeS1heGlzDQojIGJyZWFrcyA9IDUgTnVtYmVyIG9mIGJpbnMgKGJyZWFrcykgaW4gdGhlIGhpc3RvZ3JhbQ0KDQpoaXN0KGNvbnRyYWN0X3llYXJzLHhsYWIgPSAiWWVhcnMgTGVmdCBpbiBDb250cmFjdCIsY29sID0gImdyZWVuIixib3JkZXIgPSAicmVkIiwgeGxpbSA9IGMoMCw4KSwgeWxpbSA9IGMoMCwyMjUpLA0KICAgICBicmVha3MgPSA1KQ0KYGBgDQoNCg0KKipRdWVzdGlvbiAzKioNCg0KVXNlIHRoZSBza2lsbHMgbGVhcm5lZCBpbiBjYXNlIHNjZW5hcmlvIG51bWJlciAzIG9uIG9uZSB0aGUgZm9sbG93aW5nIGRhdGEgc2V0cy4gDQpZb3UgbWF5IGNob29zZSBvbmx5IG9uZSBkYXRhc2V0LiBUaGV5IGFyZSBib3RoIGF2YWlsYWJsZSBpbiBDYW52YXMuDQoNCmRvdWJsZXNfaGl0LmNzdiBhbmQgdHJpcGxlc19oaXQuY3N2DQoNCmBgYHtyfQ0KI1RoZSB0cmlwbGVzX2hpdC5jc3YgZmlsZSBjb250YWlucyBhbGwgdGhlIHBsYXllcnPigJkgdHJpcGxlIGhpdHMuIA0KI1dlIGNhbiByZWFkIHRoaXMgZmlsZSBpbiBSIHVzaW5nIHRoZSByZWFkLmNzdigpIGZ1bmN0aW9uLg0KDQp0cmlwbGVzX2RhdGEgPC0gcmVhZC50YWJsZSgiQzovVXNlcnMvZXJsYW4vT25lRHJpdmUvRGVza3RvcC9TY2hvb2wvQ0FQIDQ5MzYgU3BvcnRzIEFuYWx5dGljcy90cmlwbGVzX2hpdC5jc3YiLCBoZWFkZXIgPSBUUlVFLCBzZXAgPSAiLCIpDQojSW4gVGhpcyBjb2RlIHdlIGRlY2xhcmUgdGhlIHZhcmlhYmxlIHRyaXBsZXNfZGF0YQ0KI1RoZW4gdXNlIHRoZSByZWFkLnRhYmxlKCkgZnVuY3Rpb24gdG8gcmVhZCB0aGUgZmlsZSB0cmlwbGVzX2hpdC5jc3YgaW4gdGhlIHByb3ZpZGVkIHBhdGggaW5jbHVkaW5nIHRoZSBoZWF0aGVyIGFuZCBzZXBhcmF0ZWQgYnkgY29tbWEgdG8gdGhlIHZhcmlhYmxlIGNvbnRyYWN0X2xlbmd0aA0KdHJpcGxlc19oaXQgPC0gdHJpcGxlc19kYXRhJHRyaXBsZXNfaGl0DQojSW4gVGhlIGFib3ZlIGxpbmUgb2YgY29kZSB3ZSBhcmUgZXh0cmFjdGluZyB0aGUgdmFsdWVzIHN0b3JlZCBpbiB0aGUgY29sdW1uIG5hbWVkIHRyaXBsZXNfaGl0IGZyb20gdGhlIGRhdGEgZnJhbWUgb3IgbGlzdCB0cmlwbGVzX2RhdGEgYW5kIGFzc2lnbmluZyB0aGVtIHRvIGEgbmV3IHZhcmlhYmxlIG5hbWVkIHRyaXBsZXNfaGl0DQoNCmBgYA0KDQpNYWtlIGNvbW1lbnRzIGFib3V0IHRoZSBjb2RlIHdlIGp1c3QgcmFuIGFib3ZlLg0KDQpQbGF5ZXJzOiBUaGlzIHZhcmlhYmxlIGhvbGRzIGEgZGF0YSBmcmFtZSB0aGF0IGNvbnRhaW5zIGFsbCB0aGUgZGF0YSByZWFkIGZyb20gImFsbGNvbnRyYWN0cy5jc3YiLiANCkVhY2ggcm93IGNvcnJlc3BvbmRzIHRvIGEgcmVjb3JkIGZyb20gdGhlIENTViBmaWxlLCBhbmQgZWFjaCBjb2x1bW4gcmVwcmVzZW50cyBhIGRpZmZlcmVudCBhdHRyaWJ1dGUuDQoNCnRyaXBsZV9oaXRzOiBUaGlzIHZhcmlhYmxlIGlzIGEgdmVjdG9yIHRoYXQgY29udGFpbnMgb25seSB0aGUgdmFsdWVzIGZyb20gdGhlIHRyaXBsZXNfaGl0IGNvbHVtbiBvZiB0aGUgUGxheWVyIGRhdGEgZnJhbWUuIA0KDQoNCkFmdGVyIGV4ZWN1dGluZyB0aGlzIGNvZGUsIHdlIGNhbiBmdXJ0aGVyIGFuYWx5emUgb3IgbWFuaXB1bGF0ZSB0aGUgZGF0YSBzdG9yZWQgaW4gUGxheWVyIGFuZCB0cmlwbGVfaGl0cyB1c2luZyB2YXJpb3VzIFIgZnVuY3Rpb25zIGFuZCBvcGVyYXRpb25zLiBGb3IgZXhhbXBsZSwgeW91IGNvdWxkIGNhbGN1bGF0ZSBzdW1tYXJ5IHN0YXRpc3RpY3MgbGlrZSBtZWFuLCBtZWRpYW4sIG9yIG1heGltdW0gdHJpcGxlIGhpdHMgdXNpbmcgZnVuY3Rpb25zIGxpa2UgbWVhbih0cmlwbGVfaGl0cyksIG1lZGlhbih0cmlwbGVfaGl0cyksIG9yIG1heCh0cmlwbGVfaGl0cykuDQoNClRvIGZpbmQgdGhlIG1lYW4gYW5kIHRoZSBzdGFuZGFyZCBkZXZpYXRpb24NCg0KYGBge3J9DQojTWVhbiANCiNJbiBUaGlzIGNvZGUgd2UgZGVjbGFyZSB0aGUgdmFyaWFibGUgdHJpcGxlX21lYW4NCiNUaGVuIHVzZSB0aGUgZnVuY3Rpb24gbWVhbigpIHRvIGNhbGN1bGF0ZSB0aGUgYXZlcmFnZSBvZiB0aGUgY29udGVudHMgaW4gdGhlIHZhcmlhYmxlIHRyaXBsZXNfaGl0DQojVGhlbiBhc3NpZ24gdGhlIHJlc3VsdHMgdG8gdHJpcGxlX21lYW4NCnRyaXBsZV9tZWFuICA8LSBtZWFuKHRyaXBsZXNfaGl0KQ0KI2luIHRoaXMgY29kZSB3ZSBhcmUgcHJpbnRpbmcgdGhlIGNvbnRlbnRzIG9mIHRoZSB2YXJpYWJsZSB0cmlwbGVfbWVhbg0KdHJpcGxlX21lYW4NCmBgYA0KYGBge3J9DQojTWVkaWFuDQojSW4gVGhpcyBjb2RlIHdlIGRlY2xhcmUgdGhlIHZhcmlhYmxlIHRyaXBsZV9tZWFuDQojVGhlbiB1c2UgdGhlIGZ1bmN0aW9uIG1lZGlhbigpIHRvIGNhbGN1bGF0ZSB0aGUgbWVkaWFuIG9mIHRoZSBjb250ZW50cyBpbiB0aGUgdmFyaWFibGUgdHJpcGxlc19oaXQNCiNUaGVuIGFzc2lnbiB0aGUgcmVzdWx0cyB0byB0cmlwbGVfbWVhbg0KdHJpcGxlX21lZGlhbiA8LSBtZWRpYW4odHJpcGxlc19oaXQpDQojaW4gdGhpcyBjb2RlIHdlIGFyZSBwcmludGluZyB0aGUgY29udGVudHMgb2YgdGhlIHZhcmlhYmxlIHRyaXBsZV9tZWFuDQp0cmlwbGVfbWVkaWFuDQpgYGANCmBgYHtyfQ0KI0ZpbmQgbnVtYmVyIG9mIG9ic2VydmF0aW9ucw0KI0luIHRoaXMgY29kZSB3ZSBkZWNsYXJlIHRoZSB2YXJpYWJsZSB0cmlwbGVfbg0KI1RoZW4gdXNlIHRoZSBmdW5jdGlvbiBsZW5ndGgoKSB0byBjYWxjdWxhdGUgdGhlIHNpemUgb2YgdGhlIGNvbnRlbnRzIGluIHRoZSB2YXJpYWJsZSB0cmlwbGVzX2hpdCBhbmQgYXNzaWduIHRvIHRyaXBsZV9uDQp0cmlwbGVfbiA8LSBsZW5ndGgodHJpcGxlc19oaXQpDQp0cmlwbGVfbiAjIFByaW50aW5nIHRoZSByZXN1bHRzLiBJbiB0aGlzIGNhc2UgMTAwDQojRmluZCBzdGFuZGFyZCBkZXZpYXRpb24NCiNJbiB0aGlzIGNvZGUgd2UgZGVjbGFyZSB0aGUgdmFyaWFibGUgdHJpcGxlX3NkDQojVGhlbiB1c2UgdGhlIGZ1bmN0aW9uIHNkKCkgdG8gY2FsY3VsYXRlIHRoZSBzdGFuZGFyZCBkZXZpYXRpb24gb2YgdGhlIGNvbnRlbnRzIGluIHRoZSB2YXJpYWJsZSB0cmlwbGVzX2hpdCBhbmQgYXNzaWduIHRvIHRyaXBsZV9zZA0KdHJpcGxlX3NkIDwtIHNkKHRyaXBsZXNfaGl0KQ0KdHJpcGxlX3NkICMgUHJpbnRpbmcgdGhlIHJlc3VsdHMuIEluIHRoaXMgY2FzZSAyLjg4NDcyMQ0KYGBgDQoNCldoYXQgcGVyY2VudGFnZSBvZiB0aGUgZGF0YSBsaWVzIHdpdGhpbiBvbmUgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIHRoZSBtZWFuPw0KDQpgYGB7cn0NCiNXaGF0IHBlcmNlbnRhZ2Ugb2YgdGhlIGRhdGEgbGllcyB3aXRoaW4gb25lIHN0YW5kYXJkIGRldmlhdGlvbiBvZiB0aGUgbWVhbj8NCiNEZWNsYXJlIHRoZSB2YXJpYWJsZSB0cmlwbGVfdzFzZCBhbmQgYXNzaWduIHRoZSByZXN1bHRzIG9mIHRoZSBmb2xsb3dpbmcgY2FsY3VsYXRpb24NCiNXZSBhZGQgdGhlIGNvbnRlbnRzIG9mIHRyaXBsZXNfaGl0IG1pbnVzIHRoZSBjb250ZW50cyBvZiB0cmlwbGVfbWVhbiBkaXZpZGVkIGJ5IHRoZSBjb250ZW50cyBvZiB0cmlwbGVfc2QgdGhhdCBhcmUgbGVzcyB0aGFuIDEgKEZvciAxIFN0YW5kYXJkIERldmlhdGlvbnMpDQojVGhlbiBkaXZpZGUgdGhlIHByZXZpb3VzIGNhbGN1bGF0aW9uIGJ5IHRoZSBjb250ZW50cyBvZiB0cmlwbGVfbg0KdHJpcGxlX3cxc2QgPC0gc3VtKCh0cmlwbGVzX2hpdCAtIHRyaXBsZV9tZWFuKS90cmlwbGVfc2QgPCAxKS8gdHJpcGxlX24NCiNQZXJjZW50YWdlIG9mIG9ic2VydmF0aW9uIHdpdGhpbiBvbmUgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIHRoZSBtZWFuDQp0cmlwbGVfdzFzZCAjIFByaW50aW5nIHRoZSByZXN1bHRzLiBJbiB0aGlzIGNhc2UgMC44OA0KYGBgDQpgYGB7cn0NCiNEaWZmZXJlbmNlIGZyb20gZW1waXJpY2FsIA0KI1N1YnRyYWN0aW5nIDAuNjggZnJvbSB0aGUgY29udGVudHMgb2YgdGhlIHZhcmlhYmxlIGNvbnRyYWN0c193MXNkIHRvIGZpbmQgdGhlIERpZmZlcmVuY2UgZnJvbSBlbXBpcmljYWwuIEluIHRoaXMgY2FzZSB0aGUgcmVzdWx0IGlzIDAuMg0KdHJpcGxlX3cxc2QgLSAwLjY4DQpgYGANCldoYXQgcGVyY2VudGFnZSBvZiB0aGUgZGF0YSBsaWVzIHdpdGhpbiB0d28gc3RhbmRhcmQgZGV2aWF0aW9ucyBvZiB0aGUgbWVhbj8NCg0KYGBge3J9DQojV2l0aGluIDIgc2QNCiNEZWNsYXJlIHRoZSB2YXJpYWJsZSB0cmlwbGVfdzJzZCBhbmQgYXNzaWduIHRoZSByZXN1bHRzIG9mIHRoZSBmb2xsb3dpbmcgY2FsY3VsYXRpb24NCiNXZSBhZGQgdGhlIGNvbnRlbnRzIG9mIHRyaXBsZXNfaGl0IG1pbnVzIHRoZSBjb250ZW50cyBvZiB0cmlwbGVfbWVhbiBkaXZpZGVkIGJ5IHRoZSBjb250ZW50cyBvZiB0cmlwbGVfc2QgdGhhdCBhcmUgbGVzcyB0aGFuIDIgKEZvciAyIFN0YW5kYXJkIERldmlhdGlvbnMpDQojVGhlbiBkaXZpZGUgdGhlIHByZXZpb3VzIGNhbGN1bGF0aW9uIGJ5IHRoZSBjb250ZW50cyBvZiB0cmlwbGVfbg0KdHJpcGxlX3cxc2QgPC0gc3VtKCh0cmlwbGVzX2hpdCAtIHRyaXBsZV9tZWFuKS90cmlwbGVfc2QgPCAyKS8gdHJpcGxlX24NCiNQZXJjZW50YWdlIG9mIG9ic2VydmF0aW9uIHdpdGhpbiBvbmUgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIHRoZSBtZWFuDQp0cmlwbGVfdzFzZCAjIFByaW50aW5nIHRoZSByZXN1bHRzLiBJbiB0aGlzIGNhc2UgMC45Mw0KDQpgYGANCg0KYGBge3J9DQojI0RpZmZlcmVuY2UgZnJvbSBlbXBpcmljYWwgDQojU3VidHJhY3RpbmcgMC45NSBmcm9tIHRoZSBjb250ZW50cyBvZiB0aGUgdmFyaWFibGUgY29udHJhY3RzX3cyc2QgdG8gZmluZCB0aGUgRGlmZmVyZW5jZSBmcm9tIGVtcGlyaWNhbC4gSW4gdGhpcyBjYXNlIHRoZSByZXN1bHQgaXMgMC45MQ0KdHJpcGxlX3cxc2QgLSAwLjAyDQpgYGANCldoYXQgcGVyY2VudCBvZiB0aGUgZGF0YSBsaWVzIHdpdGhpbiB0aHJlZSBzdGFuZGFyZCBkZXZpYXRpb25zIG9mIHRoZSBtZWFuPw0KDQpgYGB7cn0NCiNXaXRoaW4gMyBzZCANCiNEZWNsYXJlIHRoZSB2YXJpYWJsZSB0cmlwbGVfdzNzZCBhbmQgYXNzaWduIHRoZSByZXN1bHRzIG9mIHRoZSBmb2xsb3dpbmcgY2FsY3VsYXRpb24NCiNXZSBhZGQgdGhlIGNvbnRlbnRzIG9mIHRyaXBsZXNfaGl0IG1pbnVzIHRoZSBjb250ZW50cyBvZiB0cmlwbGVfbWVhbiBkaXZpZGVkIGJ5IHRoZSBjb250ZW50cyBvZiB0cmlwbGVfc2QgdGhhdCBhcmUgbGVzcyB0aGFuIDMgKEZvciAzIFN0YW5kYXJkIERldmlhdGlvbnMpDQojVGhlbiBkaXZpZGUgdGhlIHByZXZpb3VzIGNhbGN1bGF0aW9uIGJ5IHRoZSBjb250ZW50cyBvZiB0cmlwbGVfbg0KdHJpcGxlX3cxc2QgPC0gc3VtKCh0cmlwbGVzX2hpdCAtIHRyaXBsZV9tZWFuKS90cmlwbGVfc2QgPCAzKS8gdHJpcGxlX24NCiNQZXJjZW50YWdlIG9mIG9ic2VydmF0aW9uIHdpdGhpbiBvbmUgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIHRoZSBtZWFuDQoNCnRyaXBsZV93MXNkICMgUHJpbnRpbmcgdGhlIHJlc3VsdHMuIEluIHRoaXMgY2FzZSAwLjk4DQpgYGANCmBgYHtyfQ0KI0RpZmZlcmVuY2UgZnJvbSBlbXBpcmljYWwgDQojU3VidHJhY3RpbmcgMC45OTczIGZyb20gdGhlIGNvbnRlbnRzIG9mIHRoZSB2YXJpYWJsZSBjb250cmFjdHNfdzNzZCB0byBmaW5kIHRoZSBEaWZmZXJlbmNlIGZyb20gZW1waXJpY2FsLiBJbiB0aGlzIGNhc2UgdGhlIHJlc3VsdCBpcyAtMC4wMTczDQp0cmlwbGVfdzNzZCAtIDAuOTk3Mw0KYGBgDQoqKkRyYXcgYSBoaXN0b2dyYW0qKg0KDQpgYGB7cn0NCiNDcmVhdGUgaGlzdG9ncmFtDQojVXNlIHRoZSBmdW5jdGlvbiBoaXN0KCkgdG8gY3JlYXRlIGEgaGlzdG9ncmFtIHVzaW5nIHRoZSBjb250ZW50cyBvZiB0cmlwbGVzX2hpdA0KI1dpdGggWCBheGlzIGxhYmxlIFBsYXllcnMgVHJpcGxlcw0KI0NvbG9yaW5nIHRoZSBiYXJzIHdpdGggZ3JlZW4gYW5kIHRoZSBib3JkZXIgd2l0aCByZWQNCiMgMCw4IExpbWl0cyBmb3IgdGhlIHgtYXhpcw0KIyAwLDIyNSBMaW1pdHMgZm9yIHRoZSB5LWF4aXMNCiMgYnJlYWtzID0gNSBOdW1iZXIgb2YgYmlucyAoYnJlYWtzKSBpbiB0aGUgaGlzdG9ncmFtDQpoaXN0KHRyaXBsZXNfaGl0LHhsYWIgPSAiUGxheWVycyBUcmlwbGVzIixjb2wgPSAiZ3JlZW4iLGJvcmRlciA9ICJyZWQiLCB4bGltID0gYygwLDgpLCB5bGltID0gYygwLDIyNSksDQogICAgIGJyZWFrcyA9IDUpDQoNCmBgYA0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQo=