# Read in data
#The firstbasestats.csv file contains all the first base players’ stats. 
#We can read this file in R using the read.csv() function.

firstbase = read.csv("firstbasestats.csv")
#Declared the variable firstbase 
#Use the function read.csv() to read the file "firstbasestats.csv" and assign the contens to the variable firstbase
str(firstbase)
'data.frame':   23 obs. of  15 variables:
 $ Player            : chr  "Freddie Freeman" "Jose Abreu" "Nate Lowe" "Paul Goldschmidt" ...
 $ Pos               : chr  "1B" "1B" "1B" "1B" ...
 $ Team              : chr  "LAD" "CHW" "TEX" "STL" ...
 $ GP                : int  159 157 157 151 160 140 160 145 146 143 ...
 $ AB                : int  612 601 593 561 638 551 583 555 545 519 ...
 $ H                 : int  199 183 179 178 175 152 141 139 132 124 ...
 $ X2B               : int  47 40 26 41 35 27 25 28 40 23 ...
 $ HR                : int  21 15 27 35 32 20 36 22 8 18 ...
 $ RBI               : int  100 75 76 115 97 84 94 85 53 63 ...
 $ AVG               : num  0.325 0.305 0.302 0.317 0.274 0.276 0.242 0.251 0.242 0.239 ...
 $ OBP               : num  0.407 0.379 0.358 0.404 0.339 0.34 0.327 0.305 0.288 0.319 ...
 $ SLG               : num  0.511 0.446 0.492 0.578 0.48 0.437 0.477 0.423 0.36 0.391 ...
 $ OPS               : num  0.918 0.824 0.851 0.981 0.818 0.777 0.804 0.729 0.647 0.71 ...
 $ WAR               : num  5.77 4.19 3.21 7.86 3.85 3.07 5.05 1.32 -0.33 1.87 ...
 $ Payroll.Salary2023: num  27000000 19500000 4050000 26000000 14500000 ...
#Use the str() funtion to provides a concise summary of the structure of firstbase, including the number of observations (rows) and variables (columns), along with the data type and first few values of each variable.
summary(firstbase)
    Player              Pos                Team                 GP              AB              H              X2B              HR             RBI        
 Length:23          Length:23          Length:23          Min.   :  5.0   Min.   : 14.0   Min.   :  3.0   Min.   : 1.00   Min.   : 0.00   Min.   :  1.00  
 Class :character   Class :character   Class :character   1st Qu.:105.5   1st Qu.:309.0   1st Qu.: 74.5   1st Qu.:13.50   1st Qu.: 8.00   1st Qu.: 27.00  
 Mode  :character   Mode  :character   Mode  :character   Median :131.0   Median :465.0   Median :115.0   Median :23.00   Median :18.00   Median : 63.00  
                                                          Mean   :120.2   Mean   :426.9   Mean   :110.0   Mean   :22.39   Mean   :17.09   Mean   : 59.43  
                                                          3rd Qu.:152.0   3rd Qu.:558.0   3rd Qu.:146.5   3rd Qu.:28.00   3rd Qu.:24.50   3rd Qu.: 84.50  
                                                          Max.   :160.0   Max.   :638.0   Max.   :199.0   Max.   :47.00   Max.   :36.00   Max.   :115.00  
      AVG              OBP              SLG              OPS              WAR         Payroll.Salary2023
 Min.   :0.2020   Min.   :0.2140   Min.   :0.2860   Min.   :0.5000   Min.   :-1.470   Min.   :  720000  
 1st Qu.:0.2180   1st Qu.:0.3030   1st Qu.:0.3505   1st Qu.:0.6445   1st Qu.: 0.190   1st Qu.:  739200  
 Median :0.2420   Median :0.3210   Median :0.4230   Median :0.7290   Median : 1.310   Median : 4050000  
 Mean   :0.2499   Mean   :0.3242   Mean   :0.4106   Mean   :0.7346   Mean   : 1.788   Mean   : 6972743  
 3rd Qu.:0.2750   3rd Qu.:0.3395   3rd Qu.:0.4690   3rd Qu.:0.8175   3rd Qu.: 3.140   3rd Qu.: 8150000  
 Max.   :0.3250   Max.   :0.4070   Max.   :0.5780   Max.   :0.9810   Max.   : 7.860   Max.   :27000000  
#We used the function summary() to generate a summary of each variable (column) in firstbase. The output includes:

#For numeric variables (int or num):

#Minimum value (Min): The smallest value in the variable.
#1st Quartile (1st Qu): The value below which 25% of the data falls (Q1 or lower quartile).
#Median (Median or 50th percentile): The middle value in the sorted variable (Q2).
#Mean (Mean): The average value of the variable.
#3rd Quartile (3rd Qu): The value below which 75% of the data falls (Q3 or upper quartile).
#Maximum value (Max): The largest value in the variable.

#For categorical or character variables (chr):

#Counts of each unique value.

#Example 
#Length:23: Indicates there are 23 observations (rows) in firstbase.
#Class :character, Mode :character: Indicates Player is a character variable (names of players).
# Linear Regression (one variable)
#lm() function is used to fit linear models, and the summary() function provides a detailed summary of the fitted model. 

#lm(Payroll.Salary2023 ~ RBI, data = firstbase): This line of code fits a linear regression model (lm) where Payroll.Salary2023 is the dependent variable (response variable) and RBI is the independent variable (predictor variable). data = firstbase specifies that R should use the data stored in the data frame firstbase.

#model1 <- lm(...): Assigns the linear regression model object to the variable model1.

#summary(model1): The summary() function then provides a detailed summary of the fitted linear regression model model1. This summary includes information such as coefficients, standard errors, t-statistics, p-values, and goodness-of-fit measures like R-squared.

model1 = lm(Payroll.Salary2023 ~ RBI, data=firstbase)
summary(model1)

Call:
lm(formula = Payroll.Salary2023 ~ RBI, data = firstbase)

Residuals:
      Min        1Q    Median        3Q       Max 
-10250331  -5220790   -843455   2386848  13654950 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)   
(Intercept) -2363744    2866320  -0.825  0.41883   
RBI           157088      42465   3.699  0.00133 **
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 6516000 on 21 degrees of freedom
Multiple R-squared:  0.3945,    Adjusted R-squared:  0.3657 
F-statistic: 13.68 on 1 and 21 DF,  p-value: 0.001331
#Residuals:
#Residuals: These are the differences between the observed values of the dependent variable (Payroll.Salary2023) and the values predicted by the model. The summary shows descriptive statistics of the residuals:
#Min, 1Q, Median, 3Q, Max: These values represent the minimum, 1st quartile, median, 3rd quartile, and maximum of the residuals, respectively. They provide insight into the distribution and range of errors in the model predictions.

#Std. Error: These are the standard errors associated with the coefficients. They measure the variability of the coefficient estimate.
#t value: This is the t-statistic value, which measures the significance of each coefficient estimate. It's calculated as Estimate / Std. Error.
#Pr(>|t|): This is the p-value associated with each coefficient. It indicates the probability of observing the data if the null hypothesis (that the coefficient is zero) were true.

#Model Fit:
#Residual standard error: This is an estimate of the standard deviation of the residuals. In this case, it's approximately 6516000.
#Multiple R-squared: This is the coefficient of determination, which measures the proportion of variance in the dependent variable (Payroll.Salary2023) that is explained by #the independent variable (RBI). In this case, Multiple R-squared is 0.3945, indicating that 39.45% of the variance in Payroll.Salary2023 is explained by RBI.
#Adjusted R-squared: This is the R-squared adjusted for the number of predictors in the model. It penalizes for adding predictors that do not improve the model's fit. In this case, Adjusted R-squared is 0.3657, which is slightly lower than Multiple R-squared.
#F-statistic: This statistic tests the overall significance of the model. It compares the fit of the intercept-only model (null model) with the fit of the current model. In this case, the F-statistic is 13.68 with 1 and 21 degrees of freedom, and the associated p-value (0.001331) indicates that the model as a whole is statistically significant.
# Sum of Squared Errors
#This expression retrieves the residuals from the linear regression model model1.
model1$residuals
          1           2           3           4           5           6           7           8           9          10          11          12          13 
 13654950.2  10082148.6  -5524939.3  10298631.2   1626214.0  -6731642.8  -5902522.2 -10250330.7  -4711916.8   -532796.1  -6667082.5  -6696203.1   7582148.6 
         14          15          16          17          18          19          20          21          22          23 
 -4916640.9  -1898125.3   -336532.3   -995042.5  -1311618.3   -843454.5   8050721.3   1250336.9   1847040.4   2926656.0 
#SSE represents the sum of the squared differences between the observed values of the dependent variable
#model1$residuals^2: This calculates the squared value of each residual in model1.
#sum(model1$residuals^2): This computes the sum of all squared residuals, resulting in the SSE
SSE = sum(model1$residuals^2)
SSE #Printing the values of SSE. In this case 8.914926e+14
[1] 8.914926e+14
# Linear Regression (two variables)
#fit a multiple linear regression model. In this case model2, which includes more than one predictor variable (AVG and RBI)
model2 = lm(Payroll.Salary2023 ~ AVG + RBI, data=firstbase)
#This code fits a linear regression model (lm) where Payroll.Salary2023 is the dependent variable (response variable), and AVG and RBI are the independent variables (predictor variables) taken from the firstbase dataset.

#model2 <- lm(...): Assigns the linear regression model object to the variable model2.

#summary(model2): The summary() function then provides a detailed summary of the fitted linear regression model model2. This summary includes information such as coefficients, standard errors, t-statistics, p-values, and goodness-of-fit measures like R-squared.

summary(model2)

Call:
lm(formula = Payroll.Salary2023 ~ AVG + RBI, data = firstbase)

Residuals:
     Min       1Q   Median       3Q      Max 
-9097952 -4621582   -33233  3016541 10260245 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)  
(Intercept) -18083756    9479037  -1.908   0.0709 .
AVG          74374031   42934155   1.732   0.0986 .
RBI            108850      49212   2.212   0.0388 *
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 6226000 on 20 degrees of freedom
Multiple R-squared:  0.4735,    Adjusted R-squared:  0.4209 
F-statistic: 8.994 on 2 and 20 DF,  p-value: 0.001636
#Residuals:
#Residuals: These are the differences between the observed values of the dependent variable (Payroll.Salary2023) and the values predicted by the model. The summary shows descriptive statistics of the residuals:
#Min, 1Q, Median, 3Q, Max: These values represent the minimum, 1st quartile, median, 3rd quartile, and maximum of the residuals, respectively. They provide insight into the distribution and range of errors in the model predictions.

#Std. Error: These are the standard errors associated with the coefficients. They measure the variability of the coefficient estimate.
#t value: This is the t-statistic value, which measures the significance of each coefficient estimate. It's calculated as Estimate / Std. Error.
#Pr(>|t|): This is the p-value associated with each coefficient. It indicates the probability of observing the data if the null hypothesis (that the coefficient is zero) were true.

#Residual standard error: This is an estimate of the standard deviation of the residuals. In this case, it's approximately 6226000.
#Statistical Significance:
#RBI is statistically significant (p-value = 0.0388).
#AVG shows marginal significance (p-value = 0.0986)

#Model Fit.
#Multiple R-squared: Approximately 47.35% of the variance in Payroll.Salary2023 is explained by AVG and RBI.
# Sum of Squared Errors
#SSE represents the sum of the squared differences between the observed values of the dependent variable
#model1$residuals^2: This calculates the squared value of each residual in model1.
#sum(model1$residuals^2): This computes the sum of all squared residuals, resulting in the SSE
SSE = sum(model2$residuals^2)
SSE #Printing the values of SSE. In this case 7.751841e+14
[1] 7.751841e+14
# Linear Regression (all variables)
#fit a multiple linear regression model. In this case model3, which includes more than one predictor variable (HR,RBI,AVG,OPB and OPS)
#This code fits a linear regression model (lm) where Payroll.Salary2023 is the dependent variable (response variable), and HR,RBI,AVG,OPB and OPS are the independent variables (predictor variables) taken from the firstbase dataset.

#model3 <- lm(...): Assigns the linear regression model object to the variable model3.

#summary(model3): The summary() function then provides a detailed summary of the fitted linear regression model model3. This summary includes information such as coefficients, standard errors, t-statistics, p-values, and goodness-of-fit measures like R-squared.

model3 = lm(Payroll.Salary2023 ~ HR + RBI + AVG + OBP+ OPS, data=firstbase)
summary(model3)

Call:
lm(formula = Payroll.Salary2023 ~ HR + RBI + AVG + OBP + OPS, 
    data = firstbase)

Residuals:
     Min       1Q   Median       3Q      Max 
-9611440 -3338119    64016  4472451  9490309 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)  
(Intercept) -31107859   11738494  -2.650   0.0168 *
HR            -341069     552069  -0.618   0.5449  
RBI            115786     113932   1.016   0.3237  
AVG         -63824769  104544645  -0.611   0.5496  
OBP          27054948  131210166   0.206   0.8391  
OPS          60181012   95415131   0.631   0.5366  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 6023000 on 17 degrees of freedom
Multiple R-squared:  0.5811,    Adjusted R-squared:  0.4579 
F-statistic: 4.717 on 5 and 17 DF,  p-value: 0.006951
#Residuals:
#Residuals: These are the differences between the observed values of the dependent variable (Payroll.Salary2023) and the values predicted by the model. The summary shows descriptive statistics of the residuals:
#Min, 1Q, Median, 3Q, Max: These values represent the minimum, 1st quartile, median, 3rd quartile, and maximum of the residuals, respectively. They provide insight into the distribution and range of errors in the model predictions.

#Std. Error: These are the standard errors associated with the coefficients. They measure the variability of the coefficient estimate.
#t value: This is the t-statistic value, which measures the significance of each coefficient estimate. It's calculated as Estimate / Std. Error.
#Pr(>|t|): This is the p-value associated with each coefficient. It indicates the probability of observing the data if the null hypothesis (that the coefficient is zero) were true.

#Residual standard error: This is an estimate of the standard deviation of the residuals. In this case, it's approximately 6023000.

#Model Fit.
#Multiple R-squared: Approximately 58.11% of the variance in Payroll.Salary2023 is explained by HR,RBI,AVG,OPB and OPS.
# Sum of Squared Errors
SSE = sum(model3$residuals^2)
SSE
[1] 6.167793e+14
# Remove HR
# Linear Regression (all variables)
#fit a multiple linear regression model. In this case model3, which includes more than one predictor variable (RBI,AVG,OPB and OPS)
#This code fits a linear regression model (lm) where Payroll.Salary2023 is the dependent variable (response variable), and RBI,AVG,OPB and OPS are the independent variables (predictor variables) taken from the firstbase dataset.

#model4 <- lm(...): Assigns the linear regression model object to the variable model4.

#summary(model3): The summary() function then provides a detailed summary of the fitted linear regression model model2. This summary includes information such as coefficients, standard errors, t-statistics, p-values, and goodness-of-fit measures like R-squared.
model4 = lm(Payroll.Salary2023 ~ RBI + AVG + OBP + OPS, data=firstbase)
summary(model4)

Call:
lm(formula = Payroll.Salary2023 ~ RBI + AVG + OBP + OPS, data = firstbase)

Residuals:
     Min       1Q   Median       3Q      Max 
-9399551 -3573842    98921  3979339  9263512 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)  
(Intercept) -29466887   11235931  -2.623   0.0173 *
RBI             71495      87015   0.822   0.4220  
AVG         -11035457   59192453  -0.186   0.8542  
OBP          86360720   87899074   0.982   0.3389  
OPS           9464546   47788458   0.198   0.8452  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 5919000 on 18 degrees of freedom
Multiple R-squared:  0.5717,    Adjusted R-squared:  0.4765 
F-statistic: 6.007 on 4 and 18 DF,  p-value: 0.00298
#Residuals:
#Residuals: These are the differences between the observed values of the dependent variable (Payroll.Salary2023) and the values predicted by the model. The summary shows descriptive statistics of the residuals:
#Min, 1Q, Median, 3Q, Max: These values represent the minimum, 1st quartile, median, 3rd quartile, and maximum of the residuals, respectively. They provide insight into the distribution and range of errors in the model predictions.

#Std. Error: These are the standard errors associated with the coefficients. They measure the variability of the coefficient estimate.
#t value: This is the t-statistic value, which measures the significance of each coefficient estimate. It's calculated as Estimate / Std. Error.
#Pr(>|t|): This is the p-value associated with each coefficient. It indicates the probability of observing the data if the null hypothesis (that the coefficient is zero) were true.

#Residual standard error: This is an estimate of the standard deviation of the residuals. In this case, it's approximately 5919000.

#Model Fit.
#Multiple R-squared: Approximately 57.17% of the variance in Payroll.Salary2023 is explained by RBI,AVG,OPB and OPS.
firstbase<-firstbase[,-(1:3)]
# Correlations
cor(firstbase$RBI, firstbase$Payroll.Salary2023)
[1] 0.6281239
cor(firstbase$AVG, firstbase$OBP)
[1] 0.8028894
cor(firstbase)
                          GP        AB         H       X2B        HR       RBI       AVG       OBP       SLG       OPS       WAR Payroll.Salary2023
GP                 1.0000000 0.9779421 0.9056508 0.8446267 0.7432552 0.8813917 0.4430808 0.4841583 0.6875270 0.6504483 0.5645243          0.4614889
AB                 0.9779421 1.0000000 0.9516701 0.8924632 0.7721339 0.9125839 0.5126292 0.5026125 0.7471949 0.6980141 0.6211558          0.5018820
H                  0.9056508 0.9516701 1.0000000 0.9308318 0.7155225 0.9068893 0.7393167 0.6560021 0.8211406 0.8069779 0.7688712          0.6249911
X2B                0.8446267 0.8924632 0.9308318 1.0000000 0.5889699 0.8485911 0.6613085 0.5466537 0.7211259 0.6966830 0.6757470          0.6450730
HR                 0.7432552 0.7721339 0.7155225 0.5889699 1.0000000 0.8929048 0.3444242 0.4603408 0.8681501 0.7638721 0.6897677          0.5317619
RBI                0.8813917 0.9125839 0.9068893 0.8485911 0.8929048 1.0000000 0.5658479 0.5704463 0.8824090 0.8156612 0.7885666          0.6281239
AVG                0.4430808 0.5126292 0.7393167 0.6613085 0.3444242 0.5658479 1.0000000 0.8028894 0.7254274 0.7989005 0.7855945          0.5871543
OBP                0.4841583 0.5026125 0.6560021 0.5466537 0.4603408 0.5704463 0.8028894 1.0000000 0.7617499 0.8987390 0.7766375          0.7025979
SLG                0.6875270 0.7471949 0.8211406 0.7211259 0.8681501 0.8824090 0.7254274 0.7617499 1.0000000 0.9686752 0.8611140          0.6974086
OPS                0.6504483 0.6980141 0.8069779 0.6966830 0.7638721 0.8156612 0.7989005 0.8987390 0.9686752 1.0000000 0.8799893          0.7394981
WAR                0.5645243 0.6211558 0.7688712 0.6757470 0.6897677 0.7885666 0.7855945 0.7766375 0.8611140 0.8799893 1.0000000          0.8086359
Payroll.Salary2023 0.4614889 0.5018820 0.6249911 0.6450730 0.5317619 0.6281239 0.5871543 0.7025979 0.6974086 0.7394981 0.8086359          1.0000000
#In this code we use the function cor() to compute the correlation matrix for numeric columns of the entire dataset, in this case firstbase.
#Removing AVG
model5 = lm(Payroll.Salary2023 ~ RBI + OBP+OPS, data=firstbase)
summary(model5)

Call:
lm(formula = Payroll.Salary2023 ~ RBI + OBP + OPS, data = firstbase)

Residuals:
     Min       1Q   Median       3Q      Max 
-9465449 -3411234   259746  4102864  8876798 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)  
(Intercept) -29737007   10855411  -2.739    0.013 *
RBI             72393      84646   0.855    0.403  
OBP          82751360   83534224   0.991    0.334  
OPS           7598051   45525575   0.167    0.869  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 5767000 on 19 degrees of freedom
Multiple R-squared:  0.5709,    Adjusted R-squared:  0.5031 
F-statistic: 8.426 on 3 and 19 DF,  p-value: 0.000913
model6 = lm(Payroll.Salary2023 ~ RBI + OBP, data=firstbase)
summary(model6)

Call:
lm(formula = Payroll.Salary2023 ~ RBI + OBP, data = firstbase)

Residuals:
     Min       1Q   Median       3Q      Max 
-9045497 -3487008   139497  4084739  9190185 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)   
(Intercept) -28984802    9632560  -3.009  0.00693 **
RBI             84278      44634   1.888  0.07360 . 
OBP          95468873   33385182   2.860  0.00969 **
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 5625000 on 20 degrees of freedom
Multiple R-squared:  0.5703,    Adjusted R-squared:  0.5273 
F-statistic: 13.27 on 2 and 20 DF,  p-value: 0.0002149
# Read in test set
#The firstbasestats_test.csv file contains a test sample of only 2 of the first base players’ stats. 
#We can read this file in R using the read.csv() function.
firstbaseTest = read.csv("firstbasestats_test.csv")
#Declared the variable firstbaseTest 
#Use the function read.csv() to read the file "firstbasestats.csv" and assign the contens to the variable firstbase
str(firstbaseTest)
'data.frame':   2 obs. of  15 variables:
 $ Player            : chr  "Matt Olson" "Josh Bell"
 $ Pos               : chr  "1B" "1B"
 $ Team              : chr  "ATL" "SD"
 $ GP                : int  162 156
 $ AB                : int  616 552
 $ H                 : int  148 147
 $ X2B               : int  44 29
 $ HR                : int  34 17
 $ RBI               : int  103 71
 $ AVG               : num  0.24 0.266
 $ OBP               : num  0.325 0.362
 $ SLG               : num  0.477 0.422
 $ OPS               : num  0.802 0.784
 $ WAR               : num  3.29 3.5
 $ Payroll.Salary2023: num  21000000 16500000
#Use the str() funtion to provides a concise summary of the structure of firstbase, including the number of observations (rows) and variables (columns), along with the data type and first few values of each variable.
# Make test set predictions
predictTest = predict(model6, newdata=firstbaseTest)
predictTest
       1        2 
10723186 11558647 
# Compute R-squared
SSE = sum((firstbaseTest$Payroll.Salary2023 - predictTest)^2)
SST = sum((firstbaseTest$Payroll.Salary2023 - mean(firstbase$Payroll.Salary2023))^2)
1 - SSE/SST
[1] 0.5477734
LS0tDQp0aXRsZTogIkFjdGl2aXR5XzYiDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQoNCmBgYHtyfQ0KIyBSZWFkIGluIGRhdGENCiNUaGUgZmlyc3RiYXNlc3RhdHMuY3N2IGZpbGUgY29udGFpbnMgYWxsIHRoZSBmaXJzdCBiYXNlIHBsYXllcnPigJkgc3RhdHMuIA0KI1dlIGNhbiByZWFkIHRoaXMgZmlsZSBpbiBSIHVzaW5nIHRoZSByZWFkLmNzdigpIGZ1bmN0aW9uLg0KDQpmaXJzdGJhc2UgPSByZWFkLmNzdigiZmlyc3RiYXNlc3RhdHMuY3N2IikNCiNEZWNsYXJlZCB0aGUgdmFyaWFibGUgZmlyc3RiYXNlIA0KI1VzZSB0aGUgZnVuY3Rpb24gcmVhZC5jc3YoKSB0byByZWFkIHRoZSBmaWxlICJmaXJzdGJhc2VzdGF0cy5jc3YiIGFuZCBhc3NpZ24gdGhlIGNvbnRlbnMgdG8gdGhlIHZhcmlhYmxlIGZpcnN0YmFzZQ0Kc3RyKGZpcnN0YmFzZSkNCiNVc2UgdGhlIHN0cigpIGZ1bnRpb24gdG8gcHJvdmlkZXMgYSBjb25jaXNlIHN1bW1hcnkgb2YgdGhlIHN0cnVjdHVyZSBvZiBmaXJzdGJhc2UsIGluY2x1ZGluZyB0aGUgbnVtYmVyIG9mIG9ic2VydmF0aW9ucyAocm93cykgYW5kIHZhcmlhYmxlcyAoY29sdW1ucyksIGFsb25nIHdpdGggdGhlIGRhdGEgdHlwZSBhbmQgZmlyc3QgZmV3IHZhbHVlcyBvZiBlYWNoIHZhcmlhYmxlLg0KYGBgDQpgYGB7cn0NCnN1bW1hcnkoZmlyc3RiYXNlKQ0KI1dlIHVzZWQgdGhlIGZ1bmN0aW9uIHN1bW1hcnkoKSB0byBnZW5lcmF0ZSBhIHN1bW1hcnkgb2YgZWFjaCB2YXJpYWJsZSAoY29sdW1uKSBpbiBmaXJzdGJhc2UuIFRoZSBvdXRwdXQgaW5jbHVkZXM6DQoNCiNGb3IgbnVtZXJpYyB2YXJpYWJsZXMgKGludCBvciBudW0pOg0KDQojTWluaW11bSB2YWx1ZSAoTWluKTogVGhlIHNtYWxsZXN0IHZhbHVlIGluIHRoZSB2YXJpYWJsZS4NCiMxc3QgUXVhcnRpbGUgKDFzdCBRdSk6IFRoZSB2YWx1ZSBiZWxvdyB3aGljaCAyNSUgb2YgdGhlIGRhdGEgZmFsbHMgKFExIG9yIGxvd2VyIHF1YXJ0aWxlKS4NCiNNZWRpYW4gKE1lZGlhbiBvciA1MHRoIHBlcmNlbnRpbGUpOiBUaGUgbWlkZGxlIHZhbHVlIGluIHRoZSBzb3J0ZWQgdmFyaWFibGUgKFEyKS4NCiNNZWFuIChNZWFuKTogVGhlIGF2ZXJhZ2UgdmFsdWUgb2YgdGhlIHZhcmlhYmxlLg0KIzNyZCBRdWFydGlsZSAoM3JkIFF1KTogVGhlIHZhbHVlIGJlbG93IHdoaWNoIDc1JSBvZiB0aGUgZGF0YSBmYWxscyAoUTMgb3IgdXBwZXIgcXVhcnRpbGUpLg0KI01heGltdW0gdmFsdWUgKE1heCk6IFRoZSBsYXJnZXN0IHZhbHVlIGluIHRoZSB2YXJpYWJsZS4NCg0KI0ZvciBjYXRlZ29yaWNhbCBvciBjaGFyYWN0ZXIgdmFyaWFibGVzIChjaHIpOg0KDQojQ291bnRzIG9mIGVhY2ggdW5pcXVlIHZhbHVlLg0KDQojRXhhbXBsZSANCiNMZW5ndGg6MjM6IEluZGljYXRlcyB0aGVyZSBhcmUgMjMgb2JzZXJ2YXRpb25zIChyb3dzKSBpbiBmaXJzdGJhc2UuDQojQ2xhc3MgOmNoYXJhY3RlciwgTW9kZSA6Y2hhcmFjdGVyOiBJbmRpY2F0ZXMgUGxheWVyIGlzIGEgY2hhcmFjdGVyIHZhcmlhYmxlIChuYW1lcyBvZiBwbGF5ZXJzKS4NCg0KYGBgDQpgYGB7cn0NCiMgTGluZWFyIFJlZ3Jlc3Npb24gKG9uZSB2YXJpYWJsZSkNCiNsbSgpIGZ1bmN0aW9uIGlzIHVzZWQgdG8gZml0IGxpbmVhciBtb2RlbHMsIGFuZCB0aGUgc3VtbWFyeSgpIGZ1bmN0aW9uIHByb3ZpZGVzIGEgZGV0YWlsZWQgc3VtbWFyeSBvZiB0aGUgZml0dGVkIG1vZGVsLiANCg0KI2xtKFBheXJvbGwuU2FsYXJ5MjAyMyB+IFJCSSwgZGF0YSA9IGZpcnN0YmFzZSk6IFRoaXMgbGluZSBvZiBjb2RlIGZpdHMgYSBsaW5lYXIgcmVncmVzc2lvbiBtb2RlbCAobG0pIHdoZXJlIFBheXJvbGwuU2FsYXJ5MjAyMyBpcyB0aGUgZGVwZW5kZW50IHZhcmlhYmxlIChyZXNwb25zZSB2YXJpYWJsZSkgYW5kIFJCSSBpcyB0aGUgaW5kZXBlbmRlbnQgdmFyaWFibGUgKHByZWRpY3RvciB2YXJpYWJsZSkuIGRhdGEgPSBmaXJzdGJhc2Ugc3BlY2lmaWVzIHRoYXQgUiBzaG91bGQgdXNlIHRoZSBkYXRhIHN0b3JlZCBpbiB0aGUgZGF0YSBmcmFtZSBmaXJzdGJhc2UuDQoNCiNtb2RlbDEgPC0gbG0oLi4uKTogQXNzaWducyB0aGUgbGluZWFyIHJlZ3Jlc3Npb24gbW9kZWwgb2JqZWN0IHRvIHRoZSB2YXJpYWJsZSBtb2RlbDEuDQoNCiNzdW1tYXJ5KG1vZGVsMSk6IFRoZSBzdW1tYXJ5KCkgZnVuY3Rpb24gdGhlbiBwcm92aWRlcyBhIGRldGFpbGVkIHN1bW1hcnkgb2YgdGhlIGZpdHRlZCBsaW5lYXIgcmVncmVzc2lvbiBtb2RlbCBtb2RlbDEuIFRoaXMgc3VtbWFyeSBpbmNsdWRlcyBpbmZvcm1hdGlvbiBzdWNoIGFzIGNvZWZmaWNpZW50cywgc3RhbmRhcmQgZXJyb3JzLCB0LXN0YXRpc3RpY3MsIHAtdmFsdWVzLCBhbmQgZ29vZG5lc3Mtb2YtZml0IG1lYXN1cmVzIGxpa2UgUi1zcXVhcmVkLg0KDQptb2RlbDEgPSBsbShQYXlyb2xsLlNhbGFyeTIwMjMgfiBSQkksIGRhdGE9Zmlyc3RiYXNlKQ0Kc3VtbWFyeShtb2RlbDEpDQoNCiNSZXNpZHVhbHM6DQojUmVzaWR1YWxzOiBUaGVzZSBhcmUgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gdGhlIG9ic2VydmVkIHZhbHVlcyBvZiB0aGUgZGVwZW5kZW50IHZhcmlhYmxlIChQYXlyb2xsLlNhbGFyeTIwMjMpIGFuZCB0aGUgdmFsdWVzIHByZWRpY3RlZCBieSB0aGUgbW9kZWwuIFRoZSBzdW1tYXJ5IHNob3dzIGRlc2NyaXB0aXZlIHN0YXRpc3RpY3Mgb2YgdGhlIHJlc2lkdWFsczoNCiNNaW4sIDFRLCBNZWRpYW4sIDNRLCBNYXg6IFRoZXNlIHZhbHVlcyByZXByZXNlbnQgdGhlIG1pbmltdW0sIDFzdCBxdWFydGlsZSwgbWVkaWFuLCAzcmQgcXVhcnRpbGUsIGFuZCBtYXhpbXVtIG9mIHRoZSByZXNpZHVhbHMsIHJlc3BlY3RpdmVseS4gVGhleSBwcm92aWRlIGluc2lnaHQgaW50byB0aGUgZGlzdHJpYnV0aW9uIGFuZCByYW5nZSBvZiBlcnJvcnMgaW4gdGhlIG1vZGVsIHByZWRpY3Rpb25zLg0KDQojU3RkLiBFcnJvcjogVGhlc2UgYXJlIHRoZSBzdGFuZGFyZCBlcnJvcnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBjb2VmZmljaWVudHMuIFRoZXkgbWVhc3VyZSB0aGUgdmFyaWFiaWxpdHkgb2YgdGhlIGNvZWZmaWNpZW50IGVzdGltYXRlLg0KI3QgdmFsdWU6IFRoaXMgaXMgdGhlIHQtc3RhdGlzdGljIHZhbHVlLCB3aGljaCBtZWFzdXJlcyB0aGUgc2lnbmlmaWNhbmNlIG9mIGVhY2ggY29lZmZpY2llbnQgZXN0aW1hdGUuIEl0J3MgY2FsY3VsYXRlZCBhcyBFc3RpbWF0ZSAvIFN0ZC4gRXJyb3IuDQojUHIoPnx0fCk6IFRoaXMgaXMgdGhlIHAtdmFsdWUgYXNzb2NpYXRlZCB3aXRoIGVhY2ggY29lZmZpY2llbnQuIEl0IGluZGljYXRlcyB0aGUgcHJvYmFiaWxpdHkgb2Ygb2JzZXJ2aW5nIHRoZSBkYXRhIGlmIHRoZSBudWxsIGh5cG90aGVzaXMgKHRoYXQgdGhlIGNvZWZmaWNpZW50IGlzIHplcm8pIHdlcmUgdHJ1ZS4NCg0KI01vZGVsIEZpdDoNCiNSZXNpZHVhbCBzdGFuZGFyZCBlcnJvcjogVGhpcyBpcyBhbiBlc3RpbWF0ZSBvZiB0aGUgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIHRoZSByZXNpZHVhbHMuIEluIHRoaXMgY2FzZSwgaXQncyBhcHByb3hpbWF0ZWx5IDY1MTYwMDAuDQojTXVsdGlwbGUgUi1zcXVhcmVkOiBUaGlzIGlzIHRoZSBjb2VmZmljaWVudCBvZiBkZXRlcm1pbmF0aW9uLCB3aGljaCBtZWFzdXJlcyB0aGUgcHJvcG9ydGlvbiBvZiB2YXJpYW5jZSBpbiB0aGUgZGVwZW5kZW50IHZhcmlhYmxlIChQYXlyb2xsLlNhbGFyeTIwMjMpIHRoYXQgaXMgZXhwbGFpbmVkIGJ5ICN0aGUgaW5kZXBlbmRlbnQgdmFyaWFibGUgKFJCSSkuIEluIHRoaXMgY2FzZSwgTXVsdGlwbGUgUi1zcXVhcmVkIGlzIDAuMzk0NSwgaW5kaWNhdGluZyB0aGF0IDM5LjQ1JSBvZiB0aGUgdmFyaWFuY2UgaW4gUGF5cm9sbC5TYWxhcnkyMDIzIGlzIGV4cGxhaW5lZCBieSBSQkkuDQojQWRqdXN0ZWQgUi1zcXVhcmVkOiBUaGlzIGlzIHRoZSBSLXNxdWFyZWQgYWRqdXN0ZWQgZm9yIHRoZSBudW1iZXIgb2YgcHJlZGljdG9ycyBpbiB0aGUgbW9kZWwuIEl0IHBlbmFsaXplcyBmb3IgYWRkaW5nIHByZWRpY3RvcnMgdGhhdCBkbyBub3QgaW1wcm92ZSB0aGUgbW9kZWwncyBmaXQuIEluIHRoaXMgY2FzZSwgQWRqdXN0ZWQgUi1zcXVhcmVkIGlzIDAuMzY1Nywgd2hpY2ggaXMgc2xpZ2h0bHkgbG93ZXIgdGhhbiBNdWx0aXBsZSBSLXNxdWFyZWQuDQojRi1zdGF0aXN0aWM6IFRoaXMgc3RhdGlzdGljIHRlc3RzIHRoZSBvdmVyYWxsIHNpZ25pZmljYW5jZSBvZiB0aGUgbW9kZWwuIEl0IGNvbXBhcmVzIHRoZSBmaXQgb2YgdGhlIGludGVyY2VwdC1vbmx5IG1vZGVsIChudWxsIG1vZGVsKSB3aXRoIHRoZSBmaXQgb2YgdGhlIGN1cnJlbnQgbW9kZWwuIEluIHRoaXMgY2FzZSwgdGhlIEYtc3RhdGlzdGljIGlzIDEzLjY4IHdpdGggMSBhbmQgMjEgZGVncmVlcyBvZiBmcmVlZG9tLCBhbmQgdGhlIGFzc29jaWF0ZWQgcC12YWx1ZSAoMC4wMDEzMzEpIGluZGljYXRlcyB0aGF0IHRoZSBtb2RlbCBhcyBhIHdob2xlIGlzIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQuDQoNCmBgYA0KYGBge3J9DQojIFN1bSBvZiBTcXVhcmVkIEVycm9ycw0KI1RoaXMgZXhwcmVzc2lvbiByZXRyaWV2ZXMgdGhlIHJlc2lkdWFscyBmcm9tIHRoZSBsaW5lYXIgcmVncmVzc2lvbiBtb2RlbCBtb2RlbDEuDQptb2RlbDEkcmVzaWR1YWxzDQpgYGANCg0KYGBge3J9DQojU1NFIHJlcHJlc2VudHMgdGhlIHN1bSBvZiB0aGUgc3F1YXJlZCBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZSBvYnNlcnZlZCB2YWx1ZXMgb2YgdGhlIGRlcGVuZGVudCB2YXJpYWJsZQ0KI21vZGVsMSRyZXNpZHVhbHNeMjogVGhpcyBjYWxjdWxhdGVzIHRoZSBzcXVhcmVkIHZhbHVlIG9mIGVhY2ggcmVzaWR1YWwgaW4gbW9kZWwxLg0KI3N1bShtb2RlbDEkcmVzaWR1YWxzXjIpOiBUaGlzIGNvbXB1dGVzIHRoZSBzdW0gb2YgYWxsIHNxdWFyZWQgcmVzaWR1YWxzLCByZXN1bHRpbmcgaW4gdGhlIFNTRQ0KU1NFID0gc3VtKG1vZGVsMSRyZXNpZHVhbHNeMikNClNTRSAjUHJpbnRpbmcgdGhlIHZhbHVlcyBvZiBTU0UuIEluIHRoaXMgY2FzZSA4LjkxNDkyNmUrMTQNCmBgYA0KYGBge3J9DQojIExpbmVhciBSZWdyZXNzaW9uICh0d28gdmFyaWFibGVzKQ0KI2ZpdCBhIG11bHRpcGxlIGxpbmVhciByZWdyZXNzaW9uIG1vZGVsLiBJbiB0aGlzIGNhc2UgbW9kZWwyLCB3aGljaCBpbmNsdWRlcyBtb3JlIHRoYW4gb25lIHByZWRpY3RvciB2YXJpYWJsZSAoQVZHIGFuZCBSQkkpDQptb2RlbDIgPSBsbShQYXlyb2xsLlNhbGFyeTIwMjMgfiBBVkcgKyBSQkksIGRhdGE9Zmlyc3RiYXNlKQ0KI1RoaXMgY29kZSBmaXRzIGEgbGluZWFyIHJlZ3Jlc3Npb24gbW9kZWwgKGxtKSB3aGVyZSBQYXlyb2xsLlNhbGFyeTIwMjMgaXMgdGhlIGRlcGVuZGVudCB2YXJpYWJsZSAocmVzcG9uc2UgdmFyaWFibGUpLCBhbmQgQVZHIGFuZCBSQkkgYXJlIHRoZSBpbmRlcGVuZGVudCB2YXJpYWJsZXMgKHByZWRpY3RvciB2YXJpYWJsZXMpIHRha2VuIGZyb20gdGhlIGZpcnN0YmFzZSBkYXRhc2V0Lg0KDQojbW9kZWwyIDwtIGxtKC4uLik6IEFzc2lnbnMgdGhlIGxpbmVhciByZWdyZXNzaW9uIG1vZGVsIG9iamVjdCB0byB0aGUgdmFyaWFibGUgbW9kZWwyLg0KDQojc3VtbWFyeShtb2RlbDIpOiBUaGUgc3VtbWFyeSgpIGZ1bmN0aW9uIHRoZW4gcHJvdmlkZXMgYSBkZXRhaWxlZCBzdW1tYXJ5IG9mIHRoZSBmaXR0ZWQgbGluZWFyIHJlZ3Jlc3Npb24gbW9kZWwgbW9kZWwyLiBUaGlzIHN1bW1hcnkgaW5jbHVkZXMgaW5mb3JtYXRpb24gc3VjaCBhcyBjb2VmZmljaWVudHMsIHN0YW5kYXJkIGVycm9ycywgdC1zdGF0aXN0aWNzLCBwLXZhbHVlcywgYW5kIGdvb2RuZXNzLW9mLWZpdCBtZWFzdXJlcyBsaWtlIFItc3F1YXJlZC4NCg0Kc3VtbWFyeShtb2RlbDIpDQoNCiNSZXNpZHVhbHM6DQojUmVzaWR1YWxzOiBUaGVzZSBhcmUgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gdGhlIG9ic2VydmVkIHZhbHVlcyBvZiB0aGUgZGVwZW5kZW50IHZhcmlhYmxlIChQYXlyb2xsLlNhbGFyeTIwMjMpIGFuZCB0aGUgdmFsdWVzIHByZWRpY3RlZCBieSB0aGUgbW9kZWwuIFRoZSBzdW1tYXJ5IHNob3dzIGRlc2NyaXB0aXZlIHN0YXRpc3RpY3Mgb2YgdGhlIHJlc2lkdWFsczoNCiNNaW4sIDFRLCBNZWRpYW4sIDNRLCBNYXg6IFRoZXNlIHZhbHVlcyByZXByZXNlbnQgdGhlIG1pbmltdW0sIDFzdCBxdWFydGlsZSwgbWVkaWFuLCAzcmQgcXVhcnRpbGUsIGFuZCBtYXhpbXVtIG9mIHRoZSByZXNpZHVhbHMsIHJlc3BlY3RpdmVseS4gVGhleSBwcm92aWRlIGluc2lnaHQgaW50byB0aGUgZGlzdHJpYnV0aW9uIGFuZCByYW5nZSBvZiBlcnJvcnMgaW4gdGhlIG1vZGVsIHByZWRpY3Rpb25zLg0KDQojU3RkLiBFcnJvcjogVGhlc2UgYXJlIHRoZSBzdGFuZGFyZCBlcnJvcnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBjb2VmZmljaWVudHMuIFRoZXkgbWVhc3VyZSB0aGUgdmFyaWFiaWxpdHkgb2YgdGhlIGNvZWZmaWNpZW50IGVzdGltYXRlLg0KI3QgdmFsdWU6IFRoaXMgaXMgdGhlIHQtc3RhdGlzdGljIHZhbHVlLCB3aGljaCBtZWFzdXJlcyB0aGUgc2lnbmlmaWNhbmNlIG9mIGVhY2ggY29lZmZpY2llbnQgZXN0aW1hdGUuIEl0J3MgY2FsY3VsYXRlZCBhcyBFc3RpbWF0ZSAvIFN0ZC4gRXJyb3IuDQojUHIoPnx0fCk6IFRoaXMgaXMgdGhlIHAtdmFsdWUgYXNzb2NpYXRlZCB3aXRoIGVhY2ggY29lZmZpY2llbnQuIEl0IGluZGljYXRlcyB0aGUgcHJvYmFiaWxpdHkgb2Ygb2JzZXJ2aW5nIHRoZSBkYXRhIGlmIHRoZSBudWxsIGh5cG90aGVzaXMgKHRoYXQgdGhlIGNvZWZmaWNpZW50IGlzIHplcm8pIHdlcmUgdHJ1ZS4NCg0KI1Jlc2lkdWFsIHN0YW5kYXJkIGVycm9yOiBUaGlzIGlzIGFuIGVzdGltYXRlIG9mIHRoZSBzdGFuZGFyZCBkZXZpYXRpb24gb2YgdGhlIHJlc2lkdWFscy4gSW4gdGhpcyBjYXNlLCBpdCdzIGFwcHJveGltYXRlbHkgNjIyNjAwMC4NCiNTdGF0aXN0aWNhbCBTaWduaWZpY2FuY2U6DQojUkJJIGlzIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQgKHAtdmFsdWUgPSAwLjAzODgpLg0KI0FWRyBzaG93cyBtYXJnaW5hbCBzaWduaWZpY2FuY2UgKHAtdmFsdWUgPSAwLjA5ODYpDQoNCiNNb2RlbCBGaXQuDQojTXVsdGlwbGUgUi1zcXVhcmVkOiBBcHByb3hpbWF0ZWx5IDQ3LjM1JSBvZiB0aGUgdmFyaWFuY2UgaW4gUGF5cm9sbC5TYWxhcnkyMDIzIGlzIGV4cGxhaW5lZCBieSBBVkcgYW5kIFJCSS4NCg0KYGBgDQpgYGB7cn0NCiMgU3VtIG9mIFNxdWFyZWQgRXJyb3JzDQojU1NFIHJlcHJlc2VudHMgdGhlIHN1bSBvZiB0aGUgc3F1YXJlZCBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZSBvYnNlcnZlZCB2YWx1ZXMgb2YgdGhlIGRlcGVuZGVudCB2YXJpYWJsZQ0KI21vZGVsMSRyZXNpZHVhbHNeMjogVGhpcyBjYWxjdWxhdGVzIHRoZSBzcXVhcmVkIHZhbHVlIG9mIGVhY2ggcmVzaWR1YWwgaW4gbW9kZWwxLg0KI3N1bShtb2RlbDEkcmVzaWR1YWxzXjIpOiBUaGlzIGNvbXB1dGVzIHRoZSBzdW0gb2YgYWxsIHNxdWFyZWQgcmVzaWR1YWxzLCByZXN1bHRpbmcgaW4gdGhlIFNTRQ0KU1NFID0gc3VtKG1vZGVsMiRyZXNpZHVhbHNeMikNClNTRSAjUHJpbnRpbmcgdGhlIHZhbHVlcyBvZiBTU0UuIEluIHRoaXMgY2FzZSA3Ljc1MTg0MWUrMTQNCmBgYA0KYGBge3J9DQojIExpbmVhciBSZWdyZXNzaW9uIChhbGwgdmFyaWFibGVzKQ0KI2ZpdCBhIG11bHRpcGxlIGxpbmVhciByZWdyZXNzaW9uIG1vZGVsLiBJbiB0aGlzIGNhc2UgbW9kZWwzLCB3aGljaCBpbmNsdWRlcyBtb3JlIHRoYW4gb25lIHByZWRpY3RvciB2YXJpYWJsZSAoSFIsUkJJLEFWRyxPUEIgYW5kIE9QUykNCiNUaGlzIGNvZGUgZml0cyBhIGxpbmVhciByZWdyZXNzaW9uIG1vZGVsIChsbSkgd2hlcmUgUGF5cm9sbC5TYWxhcnkyMDIzIGlzIHRoZSBkZXBlbmRlbnQgdmFyaWFibGUgKHJlc3BvbnNlIHZhcmlhYmxlKSwgYW5kIEhSLFJCSSxBVkcsT1BCIGFuZCBPUFMgYXJlIHRoZSBpbmRlcGVuZGVudCB2YXJpYWJsZXMgKHByZWRpY3RvciB2YXJpYWJsZXMpIHRha2VuIGZyb20gdGhlIGZpcnN0YmFzZSBkYXRhc2V0Lg0KDQojbW9kZWwzIDwtIGxtKC4uLik6IEFzc2lnbnMgdGhlIGxpbmVhciByZWdyZXNzaW9uIG1vZGVsIG9iamVjdCB0byB0aGUgdmFyaWFibGUgbW9kZWwzLg0KDQojc3VtbWFyeShtb2RlbDMpOiBUaGUgc3VtbWFyeSgpIGZ1bmN0aW9uIHRoZW4gcHJvdmlkZXMgYSBkZXRhaWxlZCBzdW1tYXJ5IG9mIHRoZSBmaXR0ZWQgbGluZWFyIHJlZ3Jlc3Npb24gbW9kZWwgbW9kZWwzLiBUaGlzIHN1bW1hcnkgaW5jbHVkZXMgaW5mb3JtYXRpb24gc3VjaCBhcyBjb2VmZmljaWVudHMsIHN0YW5kYXJkIGVycm9ycywgdC1zdGF0aXN0aWNzLCBwLXZhbHVlcywgYW5kIGdvb2RuZXNzLW9mLWZpdCBtZWFzdXJlcyBsaWtlIFItc3F1YXJlZC4NCg0KbW9kZWwzID0gbG0oUGF5cm9sbC5TYWxhcnkyMDIzIH4gSFIgKyBSQkkgKyBBVkcgKyBPQlArIE9QUywgZGF0YT1maXJzdGJhc2UpDQpzdW1tYXJ5KG1vZGVsMykNCg0KI1Jlc2lkdWFsczoNCiNSZXNpZHVhbHM6IFRoZXNlIGFyZSB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiB0aGUgb2JzZXJ2ZWQgdmFsdWVzIG9mIHRoZSBkZXBlbmRlbnQgdmFyaWFibGUgKFBheXJvbGwuU2FsYXJ5MjAyMykgYW5kIHRoZSB2YWx1ZXMgcHJlZGljdGVkIGJ5IHRoZSBtb2RlbC4gVGhlIHN1bW1hcnkgc2hvd3MgZGVzY3JpcHRpdmUgc3RhdGlzdGljcyBvZiB0aGUgcmVzaWR1YWxzOg0KI01pbiwgMVEsIE1lZGlhbiwgM1EsIE1heDogVGhlc2UgdmFsdWVzIHJlcHJlc2VudCB0aGUgbWluaW11bSwgMXN0IHF1YXJ0aWxlLCBtZWRpYW4sIDNyZCBxdWFydGlsZSwgYW5kIG1heGltdW0gb2YgdGhlIHJlc2lkdWFscywgcmVzcGVjdGl2ZWx5LiBUaGV5IHByb3ZpZGUgaW5zaWdodCBpbnRvIHRoZSBkaXN0cmlidXRpb24gYW5kIHJhbmdlIG9mIGVycm9ycyBpbiB0aGUgbW9kZWwgcHJlZGljdGlvbnMuDQoNCiNTdGQuIEVycm9yOiBUaGVzZSBhcmUgdGhlIHN0YW5kYXJkIGVycm9ycyBhc3NvY2lhdGVkIHdpdGggdGhlIGNvZWZmaWNpZW50cy4gVGhleSBtZWFzdXJlIHRoZSB2YXJpYWJpbGl0eSBvZiB0aGUgY29lZmZpY2llbnQgZXN0aW1hdGUuDQojdCB2YWx1ZTogVGhpcyBpcyB0aGUgdC1zdGF0aXN0aWMgdmFsdWUsIHdoaWNoIG1lYXN1cmVzIHRoZSBzaWduaWZpY2FuY2Ugb2YgZWFjaCBjb2VmZmljaWVudCBlc3RpbWF0ZS4gSXQncyBjYWxjdWxhdGVkIGFzIEVzdGltYXRlIC8gU3RkLiBFcnJvci4NCiNQcig+fHR8KTogVGhpcyBpcyB0aGUgcC12YWx1ZSBhc3NvY2lhdGVkIHdpdGggZWFjaCBjb2VmZmljaWVudC4gSXQgaW5kaWNhdGVzIHRoZSBwcm9iYWJpbGl0eSBvZiBvYnNlcnZpbmcgdGhlIGRhdGEgaWYgdGhlIG51bGwgaHlwb3RoZXNpcyAodGhhdCB0aGUgY29lZmZpY2llbnQgaXMgemVybykgd2VyZSB0cnVlLg0KDQojUmVzaWR1YWwgc3RhbmRhcmQgZXJyb3I6IFRoaXMgaXMgYW4gZXN0aW1hdGUgb2YgdGhlIHN0YW5kYXJkIGRldmlhdGlvbiBvZiB0aGUgcmVzaWR1YWxzLiBJbiB0aGlzIGNhc2UsIGl0J3MgYXBwcm94aW1hdGVseSA2MDIzMDAwLg0KDQojTW9kZWwgRml0Lg0KI011bHRpcGxlIFItc3F1YXJlZDogQXBwcm94aW1hdGVseSA1OC4xMSUgb2YgdGhlIHZhcmlhbmNlIGluIFBheXJvbGwuU2FsYXJ5MjAyMyBpcyBleHBsYWluZWQgYnkgSFIsUkJJLEFWRyxPUEIgYW5kIE9QUy4NCg0KYGBgDQpgYGB7cn0NCiMgU3VtIG9mIFNxdWFyZWQgRXJyb3JzDQpTU0UgPSBzdW0obW9kZWwzJHJlc2lkdWFsc14yKQ0KU1NFICNQcmludGluZyB0aGUgdmFsdWVzIG9mIFNTRS4gSW4gdGhpcyBjYXNlIDYuMTY3NzkzZSsxNA0KYGBgDQpgYGB7cn0NCiMgUmVtb3ZlIEhSDQojIExpbmVhciBSZWdyZXNzaW9uIChhbGwgdmFyaWFibGVzKQ0KI2ZpdCBhIG11bHRpcGxlIGxpbmVhciByZWdyZXNzaW9uIG1vZGVsLiBJbiB0aGlzIGNhc2UgbW9kZWw0LCB3aGljaCBpbmNsdWRlcyBtb3JlIHRoYW4gb25lIHByZWRpY3RvciB2YXJpYWJsZSAoUkJJLEFWRyxPUEIgYW5kIE9QUykNCiNUaGlzIGNvZGUgZml0cyBhIGxpbmVhciByZWdyZXNzaW9uIG1vZGVsIChsbSkgd2hlcmUgUGF5cm9sbC5TYWxhcnkyMDIzIGlzIHRoZSBkZXBlbmRlbnQgdmFyaWFibGUgKHJlc3BvbnNlIHZhcmlhYmxlKSwgYW5kIFJCSSxBVkcsT1BCIGFuZCBPUFMgYXJlIHRoZSBpbmRlcGVuZGVudCB2YXJpYWJsZXMgKHByZWRpY3RvciB2YXJpYWJsZXMpIHRha2VuIGZyb20gdGhlIGZpcnN0YmFzZSBkYXRhc2V0Lg0KDQojbW9kZWw0IDwtIGxtKC4uLik6IEFzc2lnbnMgdGhlIGxpbmVhciByZWdyZXNzaW9uIG1vZGVsIG9iamVjdCB0byB0aGUgdmFyaWFibGUgbW9kZWw0Lg0KDQojc3VtbWFyeShtb2RlbDQpOiBUaGUgc3VtbWFyeSgpIGZ1bmN0aW9uIHRoZW4gcHJvdmlkZXMgYSBkZXRhaWxlZCBzdW1tYXJ5IG9mIHRoZSBmaXR0ZWQgbGluZWFyIHJlZ3Jlc3Npb24gbW9kZWwgbW9kZWw0LiBUaGlzIHN1bW1hcnkgaW5jbHVkZXMgaW5mb3JtYXRpb24gc3VjaCBhcyBjb2VmZmljaWVudHMsIHN0YW5kYXJkIGVycm9ycywgdC1zdGF0aXN0aWNzLCBwLXZhbHVlcywgYW5kIGdvb2RuZXNzLW9mLWZpdCBtZWFzdXJlcyBsaWtlIFItc3F1YXJlZC4NCm1vZGVsNCA9IGxtKFBheXJvbGwuU2FsYXJ5MjAyMyB+IFJCSSArIEFWRyArIE9CUCArIE9QUywgZGF0YT1maXJzdGJhc2UpDQpzdW1tYXJ5KG1vZGVsNCkNCg0KI1Jlc2lkdWFsczoNCiNSZXNpZHVhbHM6IFRoZXNlIGFyZSB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiB0aGUgb2JzZXJ2ZWQgdmFsdWVzIG9mIHRoZSBkZXBlbmRlbnQgdmFyaWFibGUgKFBheXJvbGwuU2FsYXJ5MjAyMykgYW5kIHRoZSB2YWx1ZXMgcHJlZGljdGVkIGJ5IHRoZSBtb2RlbC4gVGhlIHN1bW1hcnkgc2hvd3MgZGVzY3JpcHRpdmUgc3RhdGlzdGljcyBvZiB0aGUgcmVzaWR1YWxzOg0KI01pbiwgMVEsIE1lZGlhbiwgM1EsIE1heDogVGhlc2UgdmFsdWVzIHJlcHJlc2VudCB0aGUgbWluaW11bSwgMXN0IHF1YXJ0aWxlLCBtZWRpYW4sIDNyZCBxdWFydGlsZSwgYW5kIG1heGltdW0gb2YgdGhlIHJlc2lkdWFscywgcmVzcGVjdGl2ZWx5LiBUaGV5IHByb3ZpZGUgaW5zaWdodCBpbnRvIHRoZSBkaXN0cmlidXRpb24gYW5kIHJhbmdlIG9mIGVycm9ycyBpbiB0aGUgbW9kZWwgcHJlZGljdGlvbnMuDQoNCiNTdGQuIEVycm9yOiBUaGVzZSBhcmUgdGhlIHN0YW5kYXJkIGVycm9ycyBhc3NvY2lhdGVkIHdpdGggdGhlIGNvZWZmaWNpZW50cy4gVGhleSBtZWFzdXJlIHRoZSB2YXJpYWJpbGl0eSBvZiB0aGUgY29lZmZpY2llbnQgZXN0aW1hdGUuDQojdCB2YWx1ZTogVGhpcyBpcyB0aGUgdC1zdGF0aXN0aWMgdmFsdWUsIHdoaWNoIG1lYXN1cmVzIHRoZSBzaWduaWZpY2FuY2Ugb2YgZWFjaCBjb2VmZmljaWVudCBlc3RpbWF0ZS4gSXQncyBjYWxjdWxhdGVkIGFzIEVzdGltYXRlIC8gU3RkLiBFcnJvci4NCiNQcig+fHR8KTogVGhpcyBpcyB0aGUgcC12YWx1ZSBhc3NvY2lhdGVkIHdpdGggZWFjaCBjb2VmZmljaWVudC4gSXQgaW5kaWNhdGVzIHRoZSBwcm9iYWJpbGl0eSBvZiBvYnNlcnZpbmcgdGhlIGRhdGEgaWYgdGhlIG51bGwgaHlwb3RoZXNpcyAodGhhdCB0aGUgY29lZmZpY2llbnQgaXMgemVybykgd2VyZSB0cnVlLg0KDQojUmVzaWR1YWwgc3RhbmRhcmQgZXJyb3I6IFRoaXMgaXMgYW4gZXN0aW1hdGUgb2YgdGhlIHN0YW5kYXJkIGRldmlhdGlvbiBvZiB0aGUgcmVzaWR1YWxzLiBJbiB0aGlzIGNhc2UsIGl0J3MgYXBwcm94aW1hdGVseSA1OTE5MDAwLg0KDQojTW9kZWwgRml0Lg0KI011bHRpcGxlIFItc3F1YXJlZDogQXBwcm94aW1hdGVseSA1Ny4xNyUgb2YgdGhlIHZhcmlhbmNlIGluIFBheXJvbGwuU2FsYXJ5MjAyMyBpcyBleHBsYWluZWQgYnkgUkJJLEFWRyxPUEIgYW5kIE9QUy4NCmBgYA0KYGBge3J9DQpmaXJzdGJhc2U8LWZpcnN0YmFzZVssLSgxOjMpXQ0KI1RoaXMgY29kZSByZW1vdmVzIHRoZSBmaXJzdCB0aHJlZSBjb2x1bW5zIGZyb20gdGhlIGZpcnN0YmFzZSBkYXRhc2V0LiANCmBgYA0KYGBge3J9DQojIENvcnJlbGF0aW9ucw0KY29yKGZpcnN0YmFzZSRSQkksIGZpcnN0YmFzZSRQYXlyb2xsLlNhbGFyeTIwMjMpDQojVGhlIGFib3ZlIGNvZGUgdXNlcyB0aGUgY29yKCkgZnVuY3Rpb24gdG8gZmluZCB0aGUgY29ycmVsYXRpb24gYmV0d2VlbiB0d28gdmFyaWFibGVzIChSQkkgYW5kIFBheXJvbGwuU2FsYXJ5MjAyMykuIEluIHRoaXMgY2FzZSB0aGUgYW5zd2VyIGlzIDAuNjI4MTIzOQ0KDQojVGhlIGNvcnJlbGF0aW9uIGNvZWZmaWNpZW50IGluZGljYXRlcyBhIHN0cm9uZyBwb3NpdGl2ZSBsaW5lYXIgcmVsYXRpb25zaGlwIGJldHdlZW4gdGhlIHR3byB2YXJpYWJsZXMsDQoNCiNUaGUgcG9zaXRpdmUgdmFsdWUgKDAuNjI4MTIzOSkgc3VnZ2VzdHMgYSBtb2RlcmF0ZSBwb3NpdGl2ZSBsaW5lYXIgcmVsYXRpb25zaGlwIGJldHdlZW4gUkJJIChSdW5zIEJhdHRlZCBJbikgYW5kIFBheXJvbGwuU2FsYXJ5MjAyMy4gQXMgUkJJIGluY3JlYXNlcywgUGF5cm9sbC5TYWxhcnkyMDIzIHRlbmRzIHRvIGluY3JlYXNlIGFzIHdlbGwsIHRob3VnaCBub3QgbmVjZXNzYXJpbHkgaW4gYSBwZXJmZWN0bHkgbGluZWFyIGZhc2hpb24uDQpgYGANCmBgYHtyfQ0KY29yKGZpcnN0YmFzZSRBVkcsIGZpcnN0YmFzZSRPQlApDQoNCiNUaGUgYWJvdmUgY29kZSB1c2VzIHRoZSBjb3IoKSBmdW5jdGlvbiB0byBmaW5kIHRoZSBjb3JyZWxhdGlvbiBiZXR3ZWVuIHR3byBudW1lcmljIHZlY3RvcnMgKEFWRyBhbmQgT0JQKS4gSW4gdGhpcyBjYXNlIHRoZSBhbnN3ZXIgaXMgMC44MDI4ODk0DQoNCiNUaGUgY29ycmVsYXRpb24gY29lZmZpY2llbnQgaW5kaWNhdGVzIGEgc3Ryb25nIHBvc2l0aXZlIGxpbmVhciByZWxhdGlvbnNoaXAgYmV0d2VlbiBBVkcgYW5kIE9CUC4NCg0KI1RoZSBwb3NpdGl2ZSB2YWx1ZSAoMC44MDI4ODk0KSBzdWdnZXN0cyB0aGF0IGFzIEFWRyAoQmF0dGluZyBBdmVyYWdlKSBpbmNyZWFzZXMsIE9CUCAoT24tQmFzZSBQZXJjZW50YWdlKSB0ZW5kcyB0byBpbmNyZWFzZSBhcyB3ZWxsLCBzdWdnZXN0aW5nIHRoYXQgcGxheWVycyB3aXRoIGhpZ2hlciBiYXR0aW5nIGF2ZXJhZ2VzIGFsc28gdGVuZCB0byBoYXZlIGhpZ2hlciBvbi1iYXNlIHBlcmNlbnRhZ2VzLlRoZSBjb3JyZWxhdGlvbiBjb2VmZmljaWVudCAoMC44MDI4ODk0KSBzdWdnZXN0cyBhIHJvYnVzdCBwb3NpdGl2ZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBBVkcgYW5kIE9CUC4NCmBgYA0KYGBge3J9DQpjb3IoZmlyc3RiYXNlKQ0KI0luIHRoaXMgY29kZSB3ZSB1c2UgdGhlIGZ1bmN0aW9uIGNvcigpIHRvIGNvbXB1dGUgdGhlIGNvcnJlbGF0aW9uIG1hdHJpeCBmb3IgbnVtZXJpYyBjb2x1bW5zIG9mIHRoZSBlbnRpcmUgZGF0YXNldCwgaW4gdGhpcyBjYXNlIGZpcnN0YmFzZS4NCmBgYA0KYGBge3J9DQojUmVtb3ZpbmcgQVZHDQptb2RlbDUgPSBsbShQYXlyb2xsLlNhbGFyeTIwMjMgfiBSQkkgKyBPQlAgKyBPUFMsIGRhdGE9Zmlyc3RiYXNlKQ0KIyBMaW5lYXIgUmVncmVzc2lvbiAoYWxsIHZhcmlhYmxlcykNCiNmaXQgYSBtdWx0aXBsZSBsaW5lYXIgcmVncmVzc2lvbiBtb2RlbC4gSW4gdGhpcyBjYXNlIG1vZGVsNSwgd2hpY2ggaW5jbHVkZXMgbW9yZSB0aGFuIG9uZSBwcmVkaWN0b3IgdmFyaWFibGUgKFJCSSxPUEIgYW5kIE9QUykNCiNUaGlzIGNvZGUgZml0cyBhIGxpbmVhciByZWdyZXNzaW9uIG1vZGVsIChsbSkgd2hlcmUgUGF5cm9sbC5TYWxhcnkyMDIzIGlzIHRoZSBkZXBlbmRlbnQgdmFyaWFibGUgKHJlc3BvbnNlIHZhcmlhYmxlKSwgYW5kIFJCSSxPUEIgYW5kIE9QUyBhcmUgdGhlIGluZGVwZW5kZW50IHZhcmlhYmxlcyAocHJlZGljdG9yIHZhcmlhYmxlcykgdGFrZW4gZnJvbSB0aGUgZmlyc3RiYXNlIGRhdGFzZXQuDQoNCiNtb2RlbDUgPC0gbG0oLi4uKTogQXNzaWducyB0aGUgbGluZWFyIHJlZ3Jlc3Npb24gbW9kZWwgb2JqZWN0IHRvIHRoZSB2YXJpYWJsZSBtb2RlbDUuDQoNCiNzdW1tYXJ5KG1vZGVsNSk6IFRoZSBzdW1tYXJ5KCkgZnVuY3Rpb24gdGhlbiBwcm92aWRlcyBhIGRldGFpbGVkIHN1bW1hcnkgb2YgdGhlIGZpdHRlZCBsaW5lYXIgcmVncmVzc2lvbiBtb2RlbCBtb2RlbDUuIFRoaXMgc3VtbWFyeSBpbmNsdWRlcyBpbmZvcm1hdGlvbiBzdWNoIGFzIGNvZWZmaWNpZW50cywgc3RhbmRhcmQgZXJyb3JzLCB0LXN0YXRpc3RpY3MsIHAtdmFsdWVzLCBhbmQgZ29vZG5lc3Mtb2YtZml0IG1lYXN1cmVzIGxpa2UgUi1zcXVhcmVkLg0Kc3VtbWFyeShtb2RlbDUpDQoNCiNSZXNpZHVhbHM6DQojUmVzaWR1YWxzOiBUaGVzZSBhcmUgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gdGhlIG9ic2VydmVkIHZhbHVlcyBvZiB0aGUgZGVwZW5kZW50IHZhcmlhYmxlIChQYXlyb2xsLlNhbGFyeTIwMjMpIGFuZCB0aGUgdmFsdWVzIHByZWRpY3RlZCBieSB0aGUgbW9kZWwuIFRoZSBzdW1tYXJ5IHNob3dzIGRlc2NyaXB0aXZlIHN0YXRpc3RpY3Mgb2YgdGhlIHJlc2lkdWFsczoNCiNNaW4sIDFRLCBNZWRpYW4sIDNRLCBNYXg6IFRoZXNlIHZhbHVlcyByZXByZXNlbnQgdGhlIG1pbmltdW0sIDFzdCBxdWFydGlsZSwgbWVkaWFuLCAzcmQgcXVhcnRpbGUsIGFuZCBtYXhpbXVtIG9mIHRoZSByZXNpZHVhbHMsIHJlc3BlY3RpdmVseS4gVGhleSBwcm92aWRlIGluc2lnaHQgaW50byB0aGUgZGlzdHJpYnV0aW9uIGFuZCByYW5nZSBvZiBlcnJvcnMgaW4gdGhlIG1vZGVsIHByZWRpY3Rpb25zLg0KDQojU3RkLiBFcnJvcjogVGhlc2UgYXJlIHRoZSBzdGFuZGFyZCBlcnJvcnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBjb2VmZmljaWVudHMuIFRoZXkgbWVhc3VyZSB0aGUgdmFyaWFiaWxpdHkgb2YgdGhlIGNvZWZmaWNpZW50IGVzdGltYXRlLg0KI3QgdmFsdWU6IFRoaXMgaXMgdGhlIHQtc3RhdGlzdGljIHZhbHVlLCB3aGljaCBtZWFzdXJlcyB0aGUgc2lnbmlmaWNhbmNlIG9mIGVhY2ggY29lZmZpY2llbnQgZXN0aW1hdGUuIEl0J3MgY2FsY3VsYXRlZCBhcyBFc3RpbWF0ZSAvIFN0ZC4gRXJyb3IuDQojUHIoPnx0fCk6IFRoaXMgaXMgdGhlIHAtdmFsdWUgYXNzb2NpYXRlZCB3aXRoIGVhY2ggY29lZmZpY2llbnQuIEl0IGluZGljYXRlcyB0aGUgcHJvYmFiaWxpdHkgb2Ygb2JzZXJ2aW5nIHRoZSBkYXRhIGlmIHRoZSBudWxsIGh5cG90aGVzaXMgKHRoYXQgdGhlIGNvZWZmaWNpZW50IGlzIHplcm8pIHdlcmUgdHJ1ZS4NCg0KI1Jlc2lkdWFsIHN0YW5kYXJkIGVycm9yOiBUaGlzIGlzIGFuIGVzdGltYXRlIG9mIHRoZSBzdGFuZGFyZCBkZXZpYXRpb24gb2YgdGhlIHJlc2lkdWFscy4gSW4gdGhpcyBjYXNlLCBpdCdzIGFwcHJveGltYXRlbHkgNTc2NzAwMC4NCg0KI01vZGVsIEZpdC4NCiNNdWx0aXBsZSBSLXNxdWFyZWQ6IEFwcHJveGltYXRlbHkgNTcuMDklIG9mIHRoZSB2YXJpYW5jZSBpbiBQYXlyb2xsLlNhbGFyeTIwMjMgaXMgZXhwbGFpbmVkIGJ5IFJCSSxPUEIgYW5kIE9QUy4NCg0KYGBgDQpgYGB7cn0NCm1vZGVsNiA9IGxtKFBheXJvbGwuU2FsYXJ5MjAyMyB+IFJCSSArIE9CUCwgZGF0YT1maXJzdGJhc2UpDQojIExpbmVhciBSZWdyZXNzaW9uIChhbGwgdmFyaWFibGVzKQ0KI2ZpdCBhIG11bHRpcGxlIGxpbmVhciByZWdyZXNzaW9uIG1vZGVsLiBJbiB0aGlzIGNhc2UgbW9kZWw2LCB3aGljaCBpbmNsdWRlcyBtb3JlIHRoYW4gb25lIHByZWRpY3RvciB2YXJpYWJsZSAoUkJJLCBhbmQgT1BCKQ0KI1RoaXMgY29kZSBmaXRzIGEgbGluZWFyIHJlZ3Jlc3Npb24gbW9kZWwgKGxtKSB3aGVyZSBQYXlyb2xsLlNhbGFyeTIwMjMgaXMgdGhlIGRlcGVuZGVudCB2YXJpYWJsZSAocmVzcG9uc2UgdmFyaWFibGUpLCBhbmQgUkJJLE9QQiBhbmQgT1BTIGFyZSB0aGUgaW5kZXBlbmRlbnQgdmFyaWFibGVzIChwcmVkaWN0b3IgdmFyaWFibGVzKSB0YWtlbiBmcm9tIHRoZSBmaXJzdGJhc2UgZGF0YXNldC4NCg0KI21vZGVsNiA8LSBsbSguLi4pOiBBc3NpZ25zIHRoZSBsaW5lYXIgcmVncmVzc2lvbiBtb2RlbCBvYmplY3QgdG8gdGhlIHZhcmlhYmxlIG1vZGVsNi4NCg0KI3N1bW1hcnkobW9kZWw2KTogVGhlIHN1bW1hcnkoKSBmdW5jdGlvbiB0aGVuIHByb3ZpZGVzIGEgZGV0YWlsZWQgc3VtbWFyeSBvZiB0aGUgZml0dGVkIGxpbmVhciByZWdyZXNzaW9uIG1vZGVsIG1vZGVsNi4gVGhpcyBzdW1tYXJ5IGluY2x1ZGVzIGluZm9ybWF0aW9uIHN1Y2ggYXMgY29lZmZpY2llbnRzLCBzdGFuZGFyZCBlcnJvcnMsIHQtc3RhdGlzdGljcywgcC12YWx1ZXMsIGFuZCBnb29kbmVzcy1vZi1maXQgbWVhc3VyZXMgbGlrZSBSLXNxdWFyZWQuDQpzdW1tYXJ5KG1vZGVsNikNCiNSZXNpZHVhbHM6DQojUmVzaWR1YWxzOiBUaGVzZSBhcmUgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gdGhlIG9ic2VydmVkIHZhbHVlcyBvZiB0aGUgZGVwZW5kZW50IHZhcmlhYmxlIChQYXlyb2xsLlNhbGFyeTIwMjMpIGFuZCB0aGUgdmFsdWVzIHByZWRpY3RlZCBieSB0aGUgbW9kZWwuIFRoZSBzdW1tYXJ5IHNob3dzIGRlc2NyaXB0aXZlIHN0YXRpc3RpY3Mgb2YgdGhlIHJlc2lkdWFsczoNCiNNaW4sIDFRLCBNZWRpYW4sIDNRLCBNYXg6IFRoZXNlIHZhbHVlcyByZXByZXNlbnQgdGhlIG1pbmltdW0sIDFzdCBxdWFydGlsZSwgbWVkaWFuLCAzcmQgcXVhcnRpbGUsIGFuZCBtYXhpbXVtIG9mIHRoZSByZXNpZHVhbHMsIHJlc3BlY3RpdmVseS4gVGhleSBwcm92aWRlIGluc2lnaHQgaW50byB0aGUgZGlzdHJpYnV0aW9uIGFuZCByYW5nZSBvZiBlcnJvcnMgaW4gdGhlIG1vZGVsIHByZWRpY3Rpb25zLg0KDQojU3RkLiBFcnJvcjogVGhlc2UgYXJlIHRoZSBzdGFuZGFyZCBlcnJvcnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBjb2VmZmljaWVudHMuIFRoZXkgbWVhc3VyZSB0aGUgdmFyaWFiaWxpdHkgb2YgdGhlIGNvZWZmaWNpZW50IGVzdGltYXRlLg0KI3QgdmFsdWU6IFRoaXMgaXMgdGhlIHQtc3RhdGlzdGljIHZhbHVlLCB3aGljaCBtZWFzdXJlcyB0aGUgc2lnbmlmaWNhbmNlIG9mIGVhY2ggY29lZmZpY2llbnQgZXN0aW1hdGUuIEl0J3MgY2FsY3VsYXRlZCBhcyBFc3RpbWF0ZSAvIFN0ZC4gRXJyb3IuDQojUHIoPnx0fCk6IFRoaXMgaXMgdGhlIHAtdmFsdWUgYXNzb2NpYXRlZCB3aXRoIGVhY2ggY29lZmZpY2llbnQuIEl0IGluZGljYXRlcyB0aGUgcHJvYmFiaWxpdHkgb2Ygb2JzZXJ2aW5nIHRoZSBkYXRhIGlmIHRoZSBudWxsIGh5cG90aGVzaXMgKHRoYXQgdGhlIGNvZWZmaWNpZW50IGlzIHplcm8pIHdlcmUgdHJ1ZS4NCg0KI1Jlc2lkdWFsIHN0YW5kYXJkIGVycm9yOiBUaGlzIGlzIGFuIGVzdGltYXRlIG9mIHRoZSBzdGFuZGFyZCBkZXZpYXRpb24gb2YgdGhlIHJlc2lkdWFscy4gSW4gdGhpcyBjYXNlLCBpdCdzIGFwcHJveGltYXRlbHkgNTYyNTAwMC4NCg0KI01vZGVsIEZpdC4NCiNNdWx0aXBsZSBSLXNxdWFyZWQ6IEFwcHJveGltYXRlbHkgNTcuMDklIG9mIHRoZSB2YXJpYW5jZSBpbiBQYXlyb2xsLlNhbGFyeTIwMjMgaXMgZXhwbGFpbmVkIGJ5IFJCSSwgYW5kIE9QQi4NCg0KYGBgDQpgYGB7cn0NCiMgUmVhZCBpbiB0ZXN0IHNldA0KI1RoZSBmaXJzdGJhc2VzdGF0c190ZXN0LmNzdiBmaWxlIGNvbnRhaW5zIGEgdGVzdCBzYW1wbGUgb2Ygb25seSAyIG9mIHRoZSBmaXJzdCBiYXNlIHBsYXllcnPigJkgc3RhdHMuIA0KI1dlIGNhbiByZWFkIHRoaXMgZmlsZSBpbiBSIHVzaW5nIHRoZSByZWFkLmNzdigpIGZ1bmN0aW9uLg0KZmlyc3RiYXNlVGVzdCA9IHJlYWQuY3N2KCJmaXJzdGJhc2VzdGF0c190ZXN0LmNzdiIpDQojRGVjbGFyZWQgdGhlIHZhcmlhYmxlIGZpcnN0YmFzZVRlc3QgDQojVXNlIHRoZSBmdW5jdGlvbiByZWFkLmNzdigpIHRvIHJlYWQgdGhlIGZpbGUgImZpcnN0YmFzZXN0YXRzLmNzdiIgYW5kIGFzc2lnbiB0aGUgY29udGVucyB0byB0aGUgdmFyaWFibGUgZmlyc3RiYXNlDQpzdHIoZmlyc3RiYXNlVGVzdCkNCiNVc2UgdGhlIHN0cigpIGZ1bnRpb24gdG8gcHJvdmlkZXMgYSBjb25jaXNlIHN1bW1hcnkgb2YgdGhlIHN0cnVjdHVyZSBvZiBmaXJzdGJhc2UsIGluY2x1ZGluZyB0aGUgbnVtYmVyIG9mIG9ic2VydmF0aW9ucyAocm93cykgYW5kIHZhcmlhYmxlcyAoY29sdW1ucyksIGFsb25nIHdpdGggdGhlIGRhdGEgdHlwZSBhbmQgZmlyc3QgZmV3IHZhbHVlcyBvZiBlYWNoIHZhcmlhYmxlLg0KYGBgDQpgYGB7cn0NCiMgTWFrZSB0ZXN0IHNldCBwcmVkaWN0aW9ucw0KI0luIHRoaXMgY29kZSB3ZSB1c2UgdGhlIHByZWRpY3QoKSBmdW5jdGlvbiB0byBnZW5lcmF0ZSBwcmVkaWN0aW9ucyB1c2luZyBtb2RlbDYgb24gbmV3IGRhdGEgKGZpcnN0YmFzZVRlc3QpLiANCnByZWRpY3RUZXN0ID0gcHJlZGljdChtb2RlbDYsIG5ld2RhdGE9Zmlyc3RiYXNlVGVzdCkNCnByZWRpY3RUZXN0DQojRmluYWxseSB1c2UgdGhlIHByaW50KCkgZnVuY3Rpb24gdG8gZGlzcGxheSB0aGUgcmVzdWx0cy4NCmBgYA0KYGBge3J9DQojIENvbXB1dGUgUi1zcXVhcmVkDQpTU0UgPSBzdW0oKGZpcnN0YmFzZVRlc3QkUGF5cm9sbC5TYWxhcnkyMDIzIC0gcHJlZGljdFRlc3QpXjIpDQpTU1QgPSBzdW0oKGZpcnN0YmFzZVRlc3QkUGF5cm9sbC5TYWxhcnkyMDIzIC0gbWVhbihmaXJzdGJhc2UkUGF5cm9sbC5TYWxhcnkyMDIzKSleMikNCjEgLSBTU0UvU1NUDQojSW4gdGhpcyBhYm92ZSBjb2RlIHdlIHVzZSBTU0UgYW5kIFNTVCBmdW5jdGlvbnMNCiNTU0U6IFN1bSBvZiBTcXVhcmVkIEVycm9ycywgd2hpY2ggbWVhc3VyZXMgdGhlIHZhcmlhdGlvbiBpbiB0aGUgYWN0dWFsIHZhbHVlcyB0aGF0IGlzIG5vdCBleHBsYWluZWQgYnkgdGhlIG1vZGVsLg0KDQojcHJlZGljdFRlc3Q6IFRoaXMgaXMgdGhlIHZlY3RvciBvZiBwcmVkaWN0ZWQgdmFsdWVzIG9idGFpbmVkIGZyb20geW91ciBtb2RlbCAobW9kZWw2KSBhcHBsaWVkIHRvIGZpcnN0YmFzZVRlc3QuDQojZmlyc3RiYXNlVGVzdCRQYXlyb2xsLlNhbGFyeTIwMjM6IFRoZXNlIGFyZSB0aGUgYWN0dWFsIHZhbHVlcyBvZiB0aGUgcmVzcG9uc2UgdmFyaWFibGUgKFBheXJvbGwuU2FsYXJ5MjAyMykgaW4geW91ciB0ZXN0IGRhdGFzZXQuDQojc3VtKChmaXJzdGJhc2VUZXN0JFBheXJvbGwuU2FsYXJ5MjAyMyAtIHByZWRpY3RUZXN0KV4yKTogQ2FsY3VsYXRlcyB0aGUgc3VtIG9mIHNxdWFyZWQgZGlmZmVyZW5jZXMgYmV0d2VlbiB0aGUgYWN0dWFsIHZhbHVlcyAoZmlyc3RiYXNlVGVzdCRQYXlyb2xsLlNhbGFyeTIwMjMpIGFuZCB0aGUgcHJlZGljdGVkIHZhbHVlcyAocHJlZGljdFRlc3QpLg0KDQojU1NUOiBUb3RhbCBTdW0gb2YgU3F1YXJlcywgd2hpY2ggbWVhc3VyZXMgdGhlIHRvdGFsIHZhcmlhdGlvbiBpbiB0aGUgYWN0dWFsIHZhbHVlcy4NCg0KI21lYW4oZmlyc3RiYXNlJFBheXJvbGwuU2FsYXJ5MjAyMyk6IFRoaXMgY29tcHV0ZXMgdGhlIG1lYW4gb2YgdGhlIHJlc3BvbnNlIHZhcmlhYmxlIChQYXlyb2xsLlNhbGFyeTIwMjMpIGZyb20geW91ciBlbnRpcmUgZGF0YXNldCAoZmlyc3RiYXNlKS4NCiNzdW0oKGZpcnN0YmFzZVRlc3QkUGF5cm9sbC5TYWxhcnkyMDIzIC0gbWVhbihmaXJzdGJhc2UkUGF5cm9sbC5TYWxhcnkyMDIzKSleMik6IENhbGN1bGF0ZXMgdGhlIHN1bSBvZiBzcXVhcmVkIGRpZmZlcmVuY2VzIGJldHdlZW4gZWFjaCBhY3R1YWwgdmFsdWUgKGZpcnN0YmFzZVRlc3QkUGF5cm9sbC5TYWxhcnkyMDIzKSBhbmQgdGhlIG1lYW4gb2YgYWxsIGFjdHVhbCB2YWx1ZXMgKG1lYW4oZmlyc3RiYXNlJFBheXJvbGwuU2FsYXJ5MjAyMykpLg0KDQojSW4gdGhpcyBjYXNlIHRoZSByZXN1bHQgb2YgMC41NDc3NzM0IG1lYW5zIHRoYXQgYXBwcm94aW1hdGVseSA1NC43NyUgb2YgdGhlIHZhcmlhYmlsaXR5IGluIFBheXJvbGwuU2FsYXJ5MjAyMyBjYW4gYmUgZXhwbGFpbmVkIGJ5IHRoZSBpbmRlcGVuZGVudCB2YXJpYWJsZXMgKHByZWRpY3RvcnMpIGluY2x1ZGVkIGluIHlvdXIgbW9kZWwgKG1vZGVsNikuDQoNCmBgYA0KDQoNCg0KDQoNCg0K