FORECASTING WILKINS ZURN COMPANY

Our assignment is to analyze the case for Wilkins, A Zurn Company: Demand Forecasting and deliver a report.

THE PROBLEM: On Monday, January 10, 2005, as Bernie Barge, the newly promoted inventory manager at Wilkins plat in Paso robles, California, prepared for the forecasting meeting scheduled for the following day, he wondered whether he could find an easier and possibly more reliable means of forecasting the sales demand. Barnie is faced with the managerial issue of determining whether there is a statistical approach or a combination of approaches that could improve forecast accuracy and expediency.

KEY QUESTIONS: 1. What is the current forecasting method of demand used by the company? How accurate was the demand forecast for the first quarter of 2005 for overall PVB product family (not individual but total PVB product line)? (5 points) What are the consequences, if any, if the forecast is inaccurate?

  1. Is the demand for PVB product family (total) and fire valve have any relationship with the unemployment rate, the bank prime loan rate and the number of housing starts? How does this relationship affect the PVB product family demand?

  2. Create a demand forecast for the PVB product family (total) for the next three quarters of 2005. 3A. What type of trend and seasonal pattern of demand do you find in the data for PVB? 3B. Can you isolate the trend estimate with a linear regression model with Y = quarterly demand for PVB and X=quarters by year? What is the R-square? Is the model significant? What will you infer from the coefficient (Beta) estimate of the regression model? 3C. What do the ACF and PACF visuals indicate for the PVB product forecast? 3D. Compare the naiive demand forecast (5 points) with the moving average (2 quarter) (5 points), and an ARIMA model ? How does the ARIMA model compare with the estimate from the current forecasting method? Is it better to develop an overall time series forecast for the PVB product family or should you develop models for each individual product (e.g., PVB 12-720; PVB 34-720)

  3. As Barnie Barge, what would you recommend to management and why? How should barge convince management to follow his recommendations?

library(readxl)
library(ggplot2)
library(dplyr)
library(forecast)
library(tseries)

#Load in data
sales_history_PVB = read_excel('WILKINS CASE DATA -PROJECT3.xls', sheet = 'sales_history_PVB')
#Add new column for type Date
sales_history_PVB$DATE <- as.Date(sales_history_PVB$Date, "%yyyy/%mm/%dd")
Warning: unknown timezone '%yyyy/%mm/%dd'
#### Exploratory Data Analysis
summary(sales_history_PVB)
      Year           Qtr             Date                       
 Min.   :2001   Min.   :1.000   Min.   :2001-01-01 00:00:00.00  
 1st Qu.:2002   1st Qu.:1.000   1st Qu.:2002-01-01 00:00:00.00  
 Median :2003   Median :2.000   Median :2003-01-01 00:00:00.00  
 Mean   :2003   Mean   :2.412   Mean   :2002-12-31 09:52:56.47  
 3rd Qu.:2004   3rd Qu.:3.000   3rd Qu.:2004-01-01 00:00:00.00  
 Max.   :2005   Max.   :4.000   Max.   :2005-01-01 00:00:00.00  
   PVB\n12-720    PVB\n34-720      PVB\n1-720     PVB\n34-420  
 Min.   :1788   Min.   : 6716   Min.   : 9824   Min.   :  384  
 1st Qu.:2516   1st Qu.:11270   1st Qu.:13851   1st Qu.: 6968  
 Median :3666   Median :13310   Median :21848   Median : 7397  
 Mean   :4291   Mean   :15787   Mean   :26437   Mean   : 7509  
 3rd Qu.:5948   3rd Qu.:19535   3rd Qu.:31507   3rd Qu.: 9026  
 Max.   :7823   Max.   :28020   Max.   :66644   Max.   :11233  
    PVB\n1-420      Total             DATE           
 Min.   : 842   Min.   : 27512   Min.   :2001-01-01  
 1st Qu.:3050   1st Qu.: 43858   1st Qu.:2002-01-01  
 Median :4676   Median : 53198   Median :2003-01-01  
 Mean   :5053   Mean   : 59079   Mean   :2002-12-31  
 3rd Qu.:6454   3rd Qu.: 75219   3rd Qu.:2004-01-01  
 Max.   :9676   Max.   :122868   Max.   :2005-01-01  
str(sales_history_PVB)
tibble [17 × 10] (S3: tbl_df/tbl/data.frame)
 $ Year       : num [1:17] 2001 2001 2001 2001 2002 ...
 $ Qtr        : num [1:17] 1 2 3 4 1 2 3 4 1 2 ...
 $ Date       : POSIXct[1:17], format: "2001-01-01" "2001-04-01" ...
 $ PVB
12-720: num [1:17] 2108 2516 2954 2224 1788 ...
 $ PVB
34-720: num [1:17] 6716 11510 18438 10456 9464 ...
 $ PVB
1-720 : num [1:17] 10688 21688 40814 19510 9824 ...
 $ PVB
34-420: num [1:17] 7158 7034 9026 7254 6968 ...
 $ PVB
1-420 : num [1:17] 842 3050 5736 4414 2536 ...
 $ Total      : num [1:17] 27512 45798 76968 43858 30580 ...
 $ DATE       : Date[1:17], format: "2001-01-01" "2001-04-01" ...
sales_history_PVB = sales_history_PVB %>% select(c(DATE, Total))
sales_history_PVB$Total
 [1]  27512  45798  76968  43858  30580  53198  88704  51590  35372  57840
[11]  93388  58906  39382  75219 122868  54996  48159
sales_history_PVB$DATE
 [1] "2001-01-01" "2001-04-01" "2001-07-01" "2001-10-01" "2002-01-01"
 [6] "2002-04-01" "2002-07-01" "2002-10-01" "2003-01-01" "2003-04-01"
[11] "2003-07-01" "2003-10-01" "2004-01-01" "2004-04-01" "2004-07-01"
[16] "2004-10-01" "2005-01-01"
#Create time series object
#Note: company's fiscal quarter begins in Sept or Oct?
PVB_ts = ts(sales_history_PVB$Total, start = c(2001,1), frequency=4)

start(PVB_ts)     #Check start date
[1] 2001    1
end(PVB_ts)       #Check end date
[1] 2005    1
class(PVB_ts)    #Check class
[1] "ts"
# 3a: What type of trend and seasonal pattern of demand do you find in the data for PVB?

#Start with displaying all of the data; can see the data is multiplicative
plot(PVB_ts) #actual data; it is multiplicative - need to know this for decomposition

tsdisplay(PVB_ts) 


#Now complete the decomposition
component.tsm = decompose(PVB_ts, type="multiplicative", filter=NULL)
plot(component.tsm)


#Test if time series is stationary using Augmented Dickey-Fuller Test
adf.test(PVB_ts)   #Lag order = 2
Warning: p-value smaller than printed p-value

    Augmented Dickey-Fuller Test

data:  PVB_ts
Dickey-Fuller = -6.6546, Lag order = 2, p-value = 0.01
alternative hypothesis: stationary
#Since the p-value is 0.01, which is less than 0.05, we reject the null in 
#favor of alternative that the series is stationary
#A stationary time series has conditions that the mean, variance and covariance are not functions of time
#In order to fit ARIMA models, the time series is required to be stationary.
#### CREATE LINEAR REGRESSION -- QUESTION 3B
# 3b: Can you isolate the trend estimate with a linear regression model 
# with Y = quarterly demand for PVB and X=quarters by year? 
# What is the R-square? Is the model significant? 
# What will you infer from the coefficient (Beta) estimate of the regression model?


#Build linear regression
#Y=quarterly demand for PVB
#X=quarters by year
#If you are using multiplicative decomposition, need to use the log of the variable (from sample code)
reg_model = lm(log(PVB_ts) ~ time(PVB_ts))
summary(reg_model)

Call:
lm(formula = log(PVB_ts) ~ time(PVB_ts))

Residuals:
    Min      1Q  Median      3Q     Max 
-0.4547 -0.3770 -0.0187  0.1630  0.6224 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)
(Intercept)  -240.4225   152.2228  -1.579    0.135
time(PVB_ts)    0.1255     0.0760   1.651    0.119

Residual standard error: 0.3838 on 15 degrees of freedom
Multiple R-squared:  0.1538,    Adjusted R-squared:  0.09737 
F-statistic: 2.726 on 1 and 15 DF,  p-value: 0.1195
#### ACF and PACF
# 3c: What do the ACF and PACF visuals indicate for the PVB product forecast?

Acf(PVB_ts)

Pacf(PVB_ts)

forecast::tsdisplay(PVB_ts)    #Same plot as above


#ACF plot tells us the order of an MA model; observe lags at 2 & 4; 4 is the cutoff -- MA(4)
#PACF plot tells us the order of an AR model; observe lag at 2 -- AR(2)


#The Ljung-Box test tests whether any of a group of autocorrelations of a time series are different from zero. 
#In essence it tests the “overall randomness” based on a number of lags.
#If the result is a small p-value than it indicates the data is probably not white noise.
Box.test(PVB_ts, lag=2, fitdf=0, type="Lj")    #this is the lag that came up in the adf test

    Box-Ljung test

data:  PVB_ts
X-squared = 7.1879, df = 2, p-value = 0.02749
Box.test(PVB_ts, lag=5, fitdf=0, type="Lj")

    Box-Ljung test

data:  PVB_ts
X-squared = 16.728, df = 5, p-value = 0.005046
Box.test(PVB_ts, lag=10, fitdf=0, type="Lj")

    Box-Ljung test

data:  PVB_ts
X-squared = 36.006, df = 10, p-value = 8.397e-05
Box.test(PVB_ts, lag=15, fitdf=0, type="Lj")

    Box-Ljung test

data:  PVB_ts
X-squared = 44.659, df = 15, p-value = 8.667e-05
#p-values are small, so we can reject the null -- our data is not white noise
#### BUILD MODELS
# 3d: Compare the naive demand forecast with the moving average (2 quarter) and an ARIMA model?

### NAIVE MODEL
#Naive Forecasting Method
naive_model <- naive(PVB_ts, 3)   # 3 because we are forecasting for the next 3 quarters
summary(naive_model)

Forecast method: Naive method

Model Information:
Call: naive(y = PVB_ts, h = 3) 

Residual sd: 33107.763 

Error measures:
                   ME     RMSE      MAE       MPE     MAPE     MASE       ACF1
Training set 1290.438 33107.76 29844.81 -9.757737 50.54563 3.375934 -0.1215998

Forecasts:
autoplot(naive_model)


#Check for fitted values and residuals
checkresiduals(naive_model)

    Ljung-Box test

data:  Residuals from Naive method
Q* = 9.1956, df = 3, p-value = 0.0268

Model df: 0.   Total lags used: 3

### MOVING AVERAGE (2 quarter)
autoplot(PVB_ts, series = "Data") + 
  autolayer(ma(PVB_ts, order = 2, centre = TRUE), series = "2x2-MA") +
  labs(x = "Year", y = "Sales") + 
  ggtitle("2x2 moving average of PVB sales")


auto_ma <- ma(PVB_ts, 2)
auto_ma
         Qtr1     Qtr2     Qtr3     Qtr4
2001       NA 49019.00 60898.00 48816.00
2002 39554.00 56420.00 70549.00 56814.00
2003 45043.50 61110.00 75880.50 62645.50
2004 53222.25 78172.00 93987.75 70254.75
2005       NA                           
#### ARIMA model

#Iteration 1 - AR(2)
fit1 <-arima(PVB_ts, order=c(2,0,0))
plot(residuals(fit1))

Acf(residuals(fit1))

Pacf(residuals(fit1))

summary(fit1)

Call:
arima(x = PVB_ts, order = c(2, 0, 0))

Coefficients:
         ar1      ar2  intercept
      0.0953  -0.5991  60440.419
s.e.  0.2005   0.1834   3232.553

sigma^2 estimated as 3.62e+08:  log likelihood = -192.08,  aic = 392.16

Training set error measures:
                    ME     RMSE      MAE       MPE     MAPE      MASE      ACF1
Training set -1023.536 19027.15 15040.92 -11.88619 29.02265 0.5039708 0.2038976
#Results: AIC = 392.16; RMSE = 19027.15

#Iteration 2 - MA(4)
fit2 <-arima(PVB_ts, order=c(0,0,4))
plot(residuals(fit2))

Acf(residuals(fit2))

Pacf(residuals(fit2))

summary(fit2)

Call:
arima(x = PVB_ts, order = c(0, 0, 4))

Coefficients:
         ma1      ma2     ma3     ma4  intercept
      0.3812  -0.3992  0.3812  0.9998  60657.353
s.e.  0.3890   0.2955  0.3997  0.4447   7220.112

sigma^2 estimated as 191299290:  log likelihood = -189.67,  aic = 391.34

Training set error measures:
                   ME    RMSE      MAE       MPE     MAPE      MASE        ACF1
Training set 767.5436 13831.1 11067.37 -6.678844 19.76051 0.3708305 -0.08084787
#Results: AIC = 391.34; RMSE = 13831.1

#Iteration 3 - 
fit3 <-arima(PVB_ts, order=c(0,0,4), seasonal=list(order=c(0,0,1)))
plot(residuals(fit3))

Acf(residuals(fit3))

Pacf(residuals(fit3))

summary(fit3)

Call:
arima(x = PVB_ts, order = c(0, 0, 4), seasonal = list(order = c(0, 0, 1)))

Coefficients:
         ma1      ma2     ma3     ma4    sma1  intercept
      0.2555  -0.2536  0.5739  0.7538  0.7819  60632.833
s.e.  0.4429   0.3256  0.4680  0.4500  0.8415   9551.795

sigma^2 estimated as 123317852:  log likelihood = -187.78,  aic = 389.56

Training set error measures:
                   ME     RMSE      MAE      MPE     MAPE      MASE       ACF1
Training set 1165.409 11104.86 8338.942 -3.74658 14.35721 0.2794101 -0.1562031
#Results: AIC = 389.56; RMSE = 11104.86

#Iteration 4 - 
fit4 <-arima(PVB_ts, order=c(0,0,4), seasonal=list(order=c(0,1,0)))
plot(residuals(fit4))

Acf(residuals(fit4))

Pacf(residuals(fit4))

summary(fit4)

Call:
arima(x = PVB_ts, order = c(0, 0, 4), seasonal = list(order = c(0, 1, 0)))

Coefficients:
         ma1     ma2     ma3     ma4
      0.4968  0.2036  0.8455  0.1400
s.e.  0.8744  0.5989  0.8464  0.4531

sigma^2 estimated as 63923621:  log likelihood = -136.95,  aic = 283.89

Training set error measures:
                   ME     RMSE      MAE      MPE     MAPE      MASE       ACF1
Training set 2345.542 6991.666 4400.854 2.676091 6.546246 0.1474579 -0.1111456
#Results: AIC = 283.89; RMSE = 6991.666

#Iteration 5 - 
fit5 <-arima(PVB_ts, order=c(2,0,0), seasonal=list(order=c(0,1,0)))
plot(residuals(fit5))

Acf(residuals(fit5))

Pacf(residuals(fit5))

summary(fit5)

Call:
arima(x = PVB_ts, order = c(2, 0, 0), seasonal = list(order = c(0, 1, 0)))

Coefficients:
         ar1     ar2
      0.3326  0.2387
s.e.  0.2638  0.2647

sigma^2 estimated as 92051434:  log likelihood = -137.81,  aic = 281.61

Training set error measures:
                   ME     RMSE      MAE      MPE     MAPE      MASE       ACF1
Training set 2900.554 8390.048 5070.453 3.343487 7.357987 0.1698939 -0.1667136
#Results: AIC = 281.61; RMSE = 8390.048 

#Iteration 6 - 
fit6 <-arima(PVB_ts, order=c(2,0,4), seasonal=list(order=c(0,1,0)))
plot(residuals(fit6))

Acf(residuals(fit6))

Pacf(residuals(fit6))

summary(fit6)

Call:
arima(x = PVB_ts, order = c(2, 0, 4), seasonal = list(order = c(0, 1, 0)))

Coefficients:
          ar1      ar2     ma1     ma2     ma3     ma4
      -0.7031  -0.2956  1.2965  0.8210  1.2969  0.9980
s.e.   0.3518   0.5331  3.3695  1.5585  1.4193  3.5329

sigma^2 estimated as 46879758:  log likelihood = -136.59,  aic = 287.17

Training set error measures:
                   ME     RMSE      MAE      MPE     MAPE      MASE      ACF1
Training set 2458.848 5987.475 3943.108 3.153641 5.888834 0.1321204 -0.136925
#Results: AIC = 287.17; RMSE = 5987.475
#Build an ARIMA MODEL using auto.arima() function
arima_auto <-auto.arima(PVB_ts, seasonal = TRUE)
summary(arima_auto)
Series: PVB_ts 
ARIMA(0,0,0)(0,1,0)[4] with drift 

Coefficients:
          drift
      2059.7308
s.e.   536.6513

sigma^2 = 64894985:  log likelihood = -134.85
AIC=273.7   AICc=274.9   BIC=274.83

Training set error measures:
                   ME     RMSE      MAE       MPE     MAPE      MASE       ACF1
Training set 10.20815 6768.177 4059.186 -2.281138 6.381775 0.4591599 -0.0969862
Acf(residuals(arima_auto))

Pacf(residuals(arima_auto))

#ARIMA(0,0,0)(0,1,0)[4] with drift
#Results: AIC = 273.7; BIC = 274.83; RMSE = 6768.177

plot.ts(arima_auto$residuals)

#### FORECASTING
# Create a demand forecast for the PVB product family (total) for the next three quarters of 2005.

#Plot the forecast of the time series using the forecast function, with a 95% confidence interval
#where h is the forecast horizon in months (you can write h=5*12 or 60)
arima_forecast<-forecast(arima_auto, level=c(95), h=12)
autoplot(arima_forecast)+labs(x="Time", y="Sales")

NA
NA
NA

Question 1:

Question 2

# Read the external factors data
unemployment_rate <- read_excel("WILKINS CASE DATA -PROJECT3.xls", sheet = "quarterly_unemply")
bank_prime_loan_rate <- read_excel("WILKINS CASE DATA -PROJECT3.xls", sheet = "quarterly_bankloan")
housing_starts <- read_excel("WILKINS CASE DATA -PROJECT3.xls", sheet = "housing")

# Read the sales history for fire valves
sales_history_firevalve <- read_excel("WILKINS CASE DATA -PROJECT3.xls", sheet = "sales_history_firevalve")

# Merge the sales history for PVB and fire valves
merged_sales <- merge(sales_history_PVB, sales_history_firevalve, by = c("Year", "Qtr"))

summary(merged_sales)
      Year           Qtr             Date                            P12720    
 Min.   :2001   Min.   :1.000   Min.   :2001-01-01 00:00:00.00   Min.   :1788  
 1st Qu.:2002   1st Qu.:1.000   1st Qu.:2002-01-01 00:00:00.00   1st Qu.:2516  
 Median :2003   Median :2.000   Median :2003-01-01 00:00:00.00   Median :3666  
 Mean   :2003   Mean   :2.412   Mean   :2002-12-31 09:52:56.47   Mean   :4291  
 3rd Qu.:2004   3rd Qu.:3.000   3rd Qu.:2004-01-01 00:00:00.00   3rd Qu.:5948  
 Max.   :2005   Max.   :4.000   Max.   :2005-01-01 00:00:00.00   Max.   :7823  
     P34710          P1720           P34420          P1420          total       
 Min.   : 6716   Min.   : 9824   Min.   :  384   Min.   : 842   Min.   : 27512  
 1st Qu.:11270   1st Qu.:13851   1st Qu.: 6968   1st Qu.:3050   1st Qu.: 43858  
 Median :13310   Median :21848   Median : 7397   Median :4676   Median : 53198  
 Mean   :15787   Mean   :26437   Mean   : 7509   Mean   :5053   Mean   : 59079  
 3rd Qu.:19535   3rd Qu.:31507   3rd Qu.: 9026   3rd Qu.:6454   3rd Qu.: 75219  
 Max.   :28020   Max.   :66644   Max.   :11233   Max.   :9676   Max.   :122868  
      DATE                 FVZ2             FVZ3           FVZ3L       
 Min.   :2001-01-01   Min.   : 18.00   Min.   : 57.0   Min.   :-35.00  
 1st Qu.:2002-01-01   1st Qu.: 54.00   1st Qu.:108.0   1st Qu.:  1.00  
 Median :2003-01-01   Median : 79.00   Median :150.0   Median :  3.00  
 Mean   :2002-12-31   Mean   : 95.35   Mean   :161.8   Mean   : 28.76  
 3rd Qu.:2004-01-01   3rd Qu.:124.00   3rd Qu.:213.0   3rd Qu.: 49.00  
 Max.   :2005-01-01   Max.   :224.00   Max.   :301.0   Max.   :140.00  
     FVZ34            FVZ34L           Total      
 Min.   : 15.00   Min.   : 22.00   Min.   :137.0  
 1st Qu.: 25.00   1st Qu.: 42.00   1st Qu.:331.0  
 Median : 35.00   Median : 67.00   Median :370.0  
 Mean   : 43.47   Mean   : 71.53   Mean   :400.4  
 3rd Qu.: 50.00   3rd Qu.: 90.00   3rd Qu.:497.0  
 Max.   :144.00   Max.   :170.00   Max.   :590.0  

Q2: Correlation Matrix

# Calculate correlations between demand and external factors for PVB
correlation_PVB <- lapply(merged_sales[, c("P12720", "P34710", "P1720", "P34420", "P1420")], function(demand_var) {
  cor.test(demand_var, unemployment_rate$Rate)$estimate
})

# Calculate correlations between demand and external factors for fire valves
correlation_firevalve <- lapply(merged_sales[, c("FVZ2", "FVZ3", "FVZ3L", "FVZ34", "FVZ34L")], function(demand_var) {
  cor.test(demand_var, unemployment_rate$Rate)$estimate
})

# Print the correlations for PVB
print(correlation_PVB)
$P12720
      cor 
0.4804573 

$P34710
      cor 
0.2711253 

$P1720
      cor 
0.1987313 

$P34420
       cor 
0.08231514 

$P1420
     cor 
0.491884 
# Print the correlations for fire valves
print(correlation_firevalve)
$FVZ2
        cor 
-0.09018576 

$FVZ3
      cor 
-0.165385 

$FVZ3L
      cor 
0.2181199 

$FVZ34
       cor 
-0.4012538 

$FVZ34L
      cor 
0.1858662 
#PLOTS

# Create a data frame for PVB correlations
correlation_data_PVB <- data.frame(Factor = names(correlation_PVB), Correlation = unlist(correlation_PVB))

# Plot correlations for PVB
ggplot(correlation_data_PVB, aes(x = Factor, y = Correlation)) +
  geom_bar(stat = "identity", fill = "blue") +
  labs(x = "Factor", y = "Correlation", title = "Correlations between PVB Demand and Unemployment Rate")


# Create a data frame for fire valve correlations
correlation_data_firevalve <- data.frame(Factor = names(correlation_firevalve), Correlation = unlist(correlation_firevalve))

# Plot correlations for fire valves
ggplot(correlation_data_firevalve, aes(x = Factor, y = Correlation)) +
  geom_bar(stat = "identity", fill = "red") +
  labs(x = "Factor", y = "Correlation", title = "Correlations between Fire Valve Demand and Unemployment Rate")

NA
NA

The correlation results indicate the strength and direction of the relationships between the demand for PVB products and fire valves and the selected external factors (unemployment rate, bank prime loan rate, and housing starts). Insights gained:

For PVB products:

P12720 (PVB 12-720): There is a moderate positive correlation (0.480) between the demand for PVB 12-720 products and the selected external factors. This suggests that as the external factors increase, the demand for PVB 12-720 products tends to increase. An intuition Barge mentioned.

P34710 (PVB 34-720): There is a weak positive correlation (0.271) between the demand for PVB 34-720 products and the external factors. The relationship is not as strong as with PVB 12-720 products.

P1720 (PVB 1-720): There is a weak positive correlation (0.199) between the demand for PVB 1-720 products and the selected external factors. The relationship is weaker compared to PVB 12-720 products.

P34420 (PVB 34-420): There is a very weak positive correlation (0.082) between the demand for PVB 34-420 products and the selected external factors.

P1420 (PVB 1-420): There is a moderate positive correlation (0.492) between the demand for PVB 1-420 products and the selected external factors. This indicates that as the external factors increase, the demand for PVB 1-420 products tends to increase.

For Fire Valves:

FVZ2 (Fire Valve Z2105): There is a weak negative correlation (-0.090) between the demand for Fire Valve Z2105 and the selected external factors. This suggests that as the external factors increase, the demand for Fire Valve Z2105 tends to decrease slightly.

FVZ3 (Fire Valve Z3000): There is a weak negative correlation (-0.165) between the demand for Fire Valve Z3000 and the selected external factors.

FVZ3L (Fire Valve Z3000IL): There is a weak positive correlation (0.218) between the demand for Fire Valve Z3000IL and the selected external factors. This indicates that as the external factors increase, the demand for Fire Valve Z3000IL also tends to increase slightly.

FVZ34 (Fire Valve Z3004): There is a moderate negative correlation (-0.401) between the demand for Fire Valve Z3004 and the selected external factors. This suggests that as the external factors increase, the demand for Fire Valve Z3004 products tends to decrease.

FVZ34L (Fire Valve Z3004IL): There is a weak positive correlation (0.186) between the demand for Fire Valve Z3004IL and the selected external factors. The relationship is weaker compared to other fire valve products.

Overall, these correlation coefficients provide insights into the relationships between the demand for different products and the external factors. However, it’s important to note that correlation does not imply causation. Further analysis and consideration of other factors are needed to fully understand the dynamics and make accurate predictions or decisions.

Q2: Regressoin Analysis

The regression analysis provides insights into the relationships between the demand for each product (PVB and fire valves) and the selected external factors (unemployment rate, bank prime loan rate, and housing starts).

For the PVB product family:

P12720: The coefficient estimates suggest that the unemployment rate and bank prime loan rate have a negative impact on the demand for P12720, while housing starts have a positive impact. However, none of the coefficients are statistically significant. The adjusted R-squared value indicates that the external factors explain about 55.08% of the variation in the demand for P12720, which is no better than chance.

P34710: Similar to P12720, the coefficients for the unemployment rate, bank prime loan rate, and housing starts are not statistically significant. The adjusted R-squared value indicates that the external factors explain about 34.33% of the variation in the demand for P34710.

P1720: Once again, the coefficients for the external factors are not statistically significant. The adjusted R-squared value indicates that the external factors explain about 14.06% of the variation in the demand for P1720.

P34420: The coefficients for the external factors are not statistically significant, indicating that these factors may not have a significant impact on the demand for P34420. The adjusted R-squared value is negative, suggesting that the model does not provide a good fit for explaining the variation in the demand for P34420.

P1420: The coefficients for the external factors are not statistically significant. The adjusted R-squared value indicates that the external factors explain about 17.7% of the variation in the demand for P1420.

For the fire valves:

FVZ2, FVZ3, FVZ3L, FVZ34, and FVZ34L: Similar to the PVB products, the coefficients for the external factors are not statistically significant for any of the fire valve products. The adjusted R-squared values indicate that the external factors explain only a small portion of the variation in the demand for fire valves. Overall, the results suggest that the selected external factors may not have a significant impact on the demand for the PVB product family and fire valves. The coefficients are not statistically significant for most of the response variables, indicating that other factors or variables not included in the analysis may play a more significant role in determining the demand for these products.

Q2: Answer -

The analysis found correlations between certain products in the PVB family and fire valves with the external factors. Specifically, the demand for PVB 12-720 and PVB 1-420 products tends to increase as these factors increase. However, the connections for other PVB products and fire valves are generally weak or not important.

On the other hand, the analysis shows that the external factors do not have a big impact on the demand for the PVB family and fire valves. The numbers used to measure this impact are not significant, meaning that these factors may not strongly affect the demand. The analysis also suggests that the external factors explain only a small part of the changes in demand for these products.

Overall, these findings suggest that while some products show some correlations with the external factors, these connections are not strong enough to have a big impact on the demand for the PVB family and fire valves. Other factors that were not considered in this analysis may have a more significant role in determining the demand for these products.

LS0tCnRpdGxlOiAiRm9yZWNhc3QgRGVtYW5kIE1hcmtldGluZyIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKIyBGT1JFQ0FTVElORyBXSUxLSU5TIFpVUk4gQ09NUEFOWSAKCk91ciBhc3NpZ25tZW50IGlzIHRvIGFuYWx5emUgdGhlIGNhc2UgZm9yIFdpbGtpbnMsIEEgWnVybiBDb21wYW55OiBEZW1hbmQgRm9yZWNhc3RpbmcgYW5kIGRlbGl2ZXIgYSByZXBvcnQuIAoKVEhFIFBST0JMRU06IApPbiBNb25kYXksIEphbnVhcnkgMTAsIDIwMDUsIGFzIEJlcm5pZSBCYXJnZSwgdGhlIG5ld2x5IHByb21vdGVkIGludmVudG9yeSBtYW5hZ2VyIGF0IFdpbGtpbnMgcGxhdCBpbiBQYXNvIHJvYmxlcywgQ2FsaWZvcm5pYSwgcHJlcGFyZWQgZm9yIHRoZSBmb3JlY2FzdGluZyBtZWV0aW5nIHNjaGVkdWxlZCBmb3IgdGhlIGZvbGxvd2luZyBkYXksIGhlIHdvbmRlcmVkIHdoZXRoZXIgaGUgY291bGQgZmluZCBhbiBlYXNpZXIgYW5kIHBvc3NpYmx5IG1vcmUgcmVsaWFibGUgbWVhbnMgb2YgZm9yZWNhc3RpbmcgdGhlIHNhbGVzIGRlbWFuZC4gQmFybmllIGlzIGZhY2VkIHdpdGggdGhlIG1hbmFnZXJpYWwgaXNzdWUgb2YgZGV0ZXJtaW5pbmcgd2hldGhlciB0aGVyZSBpcyBhIHN0YXRpc3RpY2FsIGFwcHJvYWNoIG9yIGEgY29tYmluYXRpb24gb2YgYXBwcm9hY2hlcyB0aGF0IGNvdWxkIGltcHJvdmUgZm9yZWNhc3QgYWNjdXJhY3kgYW5kIGV4cGVkaWVuY3kuIAoKS0VZIFFVRVNUSU9OUzogCjEuIFdoYXQgaXMgdGhlIGN1cnJlbnQgZm9yZWNhc3RpbmcgbWV0aG9kIG9mIGRlbWFuZCB1c2VkIGJ5IHRoZSBjb21wYW55PyBIb3cgYWNjdXJhdGUgd2FzIHRoZSBkZW1hbmQgZm9yZWNhc3QgZm9yIHRoZSBmaXJzdCBxdWFydGVyIG9mIDIwMDUgZm9yIG92ZXJhbGwgUFZCIHByb2R1Y3QgZmFtaWx5IChub3QgaW5kaXZpZHVhbCBidXQgdG90YWwgUFZCIHByb2R1Y3QgbGluZSk/ICg1IHBvaW50cykgV2hhdCBhcmUgdGhlIGNvbnNlcXVlbmNlcywgaWYgYW55LCBpZiB0aGUgZm9yZWNhc3QgaXMgaW5hY2N1cmF0ZT8gCgoyLiBJcyB0aGUgZGVtYW5kIGZvciBQVkIgcHJvZHVjdCBmYW1pbHkgKHRvdGFsKSBhbmQgZmlyZSB2YWx2ZSBoYXZlIGFueSByZWxhdGlvbnNoaXAgd2l0aCB0aGUgdW5lbXBsb3ltZW50IHJhdGUsIHRoZSBiYW5rIHByaW1lIGxvYW4gcmF0ZSBhbmQgdGhlIG51bWJlciBvZiBob3VzaW5nIHN0YXJ0cz8gSG93IGRvZXMgdGhpcyByZWxhdGlvbnNoaXAgYWZmZWN0IHRoZSBQVkIgcHJvZHVjdCBmYW1pbHkgZGVtYW5kPyAKCjMuIENyZWF0ZSBhIGRlbWFuZCBmb3JlY2FzdCBmb3IgdGhlIFBWQiBwcm9kdWN0IGZhbWlseSAodG90YWwpIGZvciB0aGUgbmV4dCB0aHJlZSBxdWFydGVycyBvZiAyMDA1LiAKM0EuIFdoYXQgdHlwZSBvZiB0cmVuZCBhbmQgc2Vhc29uYWwgcGF0dGVybiBvZiBkZW1hbmQgZG8geW91IGZpbmQgaW4gdGhlIGRhdGEgZm9yIFBWQj8gCjNCLiBDYW4geW91IGlzb2xhdGUgdGhlIHRyZW5kIGVzdGltYXRlIHdpdGggYSBsaW5lYXIgcmVncmVzc2lvbiBtb2RlbCB3aXRoIFkgPSBxdWFydGVybHkgZGVtYW5kIGZvciBQVkIgYW5kIFg9cXVhcnRlcnMgYnkgeWVhcj8gV2hhdCBpcyB0aGUgUi1zcXVhcmU/IElzIHRoZSBtb2RlbCBzaWduaWZpY2FudD8gV2hhdCB3aWxsIHlvdSBpbmZlciBmcm9tIHRoZSBjb2VmZmljaWVudCAoQmV0YSkgZXN0aW1hdGUgb2YgdGhlIHJlZ3Jlc3Npb24gbW9kZWw/IAozQy4gV2hhdCBkbyB0aGUgQUNGIGFuZCBQQUNGIHZpc3VhbHMgaW5kaWNhdGUgZm9yIHRoZSBQVkIgcHJvZHVjdCBmb3JlY2FzdD8gCjNELiBDb21wYXJlIHRoZSBuYWlpdmUgZGVtYW5kIGZvcmVjYXN0ICg1IHBvaW50cykgd2l0aCB0aGUgbW92aW5nIGF2ZXJhZ2UgKDIgcXVhcnRlcikgKDUgcG9pbnRzKSwgYW5kIGFuIEFSSU1BIG1vZGVsID8gSG93IGRvZXMgdGhlIEFSSU1BIG1vZGVsIGNvbXBhcmUgd2l0aCB0aGUgZXN0aW1hdGUgZnJvbSB0aGUgY3VycmVudCBmb3JlY2FzdGluZyBtZXRob2Q/IElzIGl0IGJldHRlciB0byBkZXZlbG9wIGFuIG92ZXJhbGwgdGltZSBzZXJpZXMgZm9yZWNhc3QgZm9yIHRoZSBQVkIgcHJvZHVjdCBmYW1pbHkgb3Igc2hvdWxkIHlvdSBkZXZlbG9wIG1vZGVscyBmb3IgZWFjaCBpbmRpdmlkdWFsIHByb2R1Y3QgKGUuZy4sIFBWQiAxMi03MjA7IFBWQiAzNC03MjApIAoKNC4gQXMgQmFybmllIEJhcmdlLCB3aGF0IHdvdWxkIHlvdSByZWNvbW1lbmQgdG8gbWFuYWdlbWVudCBhbmQgd2h5PyBIb3cgc2hvdWxkIGJhcmdlIGNvbnZpbmNlIG1hbmFnZW1lbnQgdG8gZm9sbG93IGhpcyByZWNvbW1lbmRhdGlvbnM/IAoKYGBge3J9CmxpYnJhcnkocmVhZHhsKQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkoZm9yZWNhc3QpCmxpYnJhcnkodHNlcmllcykKCiNMb2FkIGluIGRhdGEKc2FsZXNfaGlzdG9yeV9QVkIgPSByZWFkX2V4Y2VsKCdXSUxLSU5TIENBU0UgREFUQSAtUFJPSkVDVDMueGxzJywgc2hlZXQgPSAnc2FsZXNfaGlzdG9yeV9QVkInKQpgYGAKCmBgYHtyfQojQWRkIG5ldyBjb2x1bW4gZm9yIHR5cGUgRGF0ZQpzYWxlc19oaXN0b3J5X1BWQiREQVRFIDwtIGFzLkRhdGUoc2FsZXNfaGlzdG9yeV9QVkIkRGF0ZSwgIiV5eXl5LyVtbS8lZGQiKQpgYGAKCmBgYHtyfQojIyMjIEV4cGxvcmF0b3J5IERhdGEgQW5hbHlzaXMKc3VtbWFyeShzYWxlc19oaXN0b3J5X1BWQikKc3RyKHNhbGVzX2hpc3RvcnlfUFZCKQoKc2FsZXNfaGlzdG9yeV9QVkIgPSBzYWxlc19oaXN0b3J5X1BWQiAlPiUgc2VsZWN0KGMoREFURSwgVG90YWwpKQpzYWxlc19oaXN0b3J5X1BWQiRUb3RhbApzYWxlc19oaXN0b3J5X1BWQiREQVRFCmBgYAoKYGBge3J9CiNDcmVhdGUgdGltZSBzZXJpZXMgb2JqZWN0CiNOb3RlOiBjb21wYW55J3MgZmlzY2FsIHF1YXJ0ZXIgYmVnaW5zIGluIFNlcHQgb3IgT2N0PwpQVkJfdHMgPSB0cyhzYWxlc19oaXN0b3J5X1BWQiRUb3RhbCwgc3RhcnQgPSBjKDIwMDEsMSksIGZyZXF1ZW5jeT00KQoKc3RhcnQoUFZCX3RzKSAgICAgI0NoZWNrIHN0YXJ0IGRhdGUKZW5kKFBWQl90cykgICAgICAgI0NoZWNrIGVuZCBkYXRlCmNsYXNzKFBWQl90cykgICAgI0NoZWNrIGNsYXNzCgojIDNhOiBXaGF0IHR5cGUgb2YgdHJlbmQgYW5kIHNlYXNvbmFsIHBhdHRlcm4gb2YgZGVtYW5kIGRvIHlvdSBmaW5kIGluIHRoZSBkYXRhIGZvciBQVkI/CgojU3RhcnQgd2l0aCBkaXNwbGF5aW5nIGFsbCBvZiB0aGUgZGF0YTsgY2FuIHNlZSB0aGUgZGF0YSBpcyBtdWx0aXBsaWNhdGl2ZQpwbG90KFBWQl90cykgI2FjdHVhbCBkYXRhOyBpdCBpcyBtdWx0aXBsaWNhdGl2ZSAtIG5lZWQgdG8ga25vdyB0aGlzIGZvciBkZWNvbXBvc2l0aW9uCnRzZGlzcGxheShQVkJfdHMpIAoKI05vdyBjb21wbGV0ZSB0aGUgZGVjb21wb3NpdGlvbgpjb21wb25lbnQudHNtID0gZGVjb21wb3NlKFBWQl90cywgdHlwZT0ibXVsdGlwbGljYXRpdmUiLCBmaWx0ZXI9TlVMTCkKcGxvdChjb21wb25lbnQudHNtKQoKI1Rlc3QgaWYgdGltZSBzZXJpZXMgaXMgc3RhdGlvbmFyeSB1c2luZyBBdWdtZW50ZWQgRGlja2V5LUZ1bGxlciBUZXN0CmFkZi50ZXN0KFBWQl90cykgICAjTGFnIG9yZGVyID0gMgojU2luY2UgdGhlIHAtdmFsdWUgaXMgMC4wMSwgd2hpY2ggaXMgbGVzcyB0aGFuIDAuMDUsIHdlIHJlamVjdCB0aGUgbnVsbCBpbiAKI2Zhdm9yIG9mIGFsdGVybmF0aXZlIHRoYXQgdGhlIHNlcmllcyBpcyBzdGF0aW9uYXJ5CiNBIHN0YXRpb25hcnkgdGltZSBzZXJpZXMgaGFzIGNvbmRpdGlvbnMgdGhhdCB0aGUgbWVhbiwgdmFyaWFuY2UgYW5kIGNvdmFyaWFuY2UgYXJlIG5vdCBmdW5jdGlvbnMgb2YgdGltZQojSW4gb3JkZXIgdG8gZml0IEFSSU1BIG1vZGVscywgdGhlIHRpbWUgc2VyaWVzIGlzIHJlcXVpcmVkIHRvIGJlIHN0YXRpb25hcnkuCmBgYAoKYGBge3J9CiMjIyMgQ1JFQVRFIExJTkVBUiBSRUdSRVNTSU9OIC0tIFFVRVNUSU9OIDNCCiMgM2I6IENhbiB5b3UgaXNvbGF0ZSB0aGUgdHJlbmQgZXN0aW1hdGUgd2l0aCBhIGxpbmVhciByZWdyZXNzaW9uIG1vZGVsIAojIHdpdGggWSA9IHF1YXJ0ZXJseSBkZW1hbmQgZm9yIFBWQiBhbmQgWD1xdWFydGVycyBieSB5ZWFyPyAKIyBXaGF0IGlzIHRoZSBSLXNxdWFyZT8gSXMgdGhlIG1vZGVsIHNpZ25pZmljYW50PyAKIyBXaGF0IHdpbGwgeW91IGluZmVyIGZyb20gdGhlIGNvZWZmaWNpZW50IChCZXRhKSBlc3RpbWF0ZSBvZiB0aGUgcmVncmVzc2lvbiBtb2RlbD8KCgojQnVpbGQgbGluZWFyIHJlZ3Jlc3Npb24KI1k9cXVhcnRlcmx5IGRlbWFuZCBmb3IgUFZCCiNYPXF1YXJ0ZXJzIGJ5IHllYXIKI0lmIHlvdSBhcmUgdXNpbmcgbXVsdGlwbGljYXRpdmUgZGVjb21wb3NpdGlvbiwgbmVlZCB0byB1c2UgdGhlIGxvZyBvZiB0aGUgdmFyaWFibGUgKGZyb20gc2FtcGxlIGNvZGUpCnJlZ19tb2RlbCA9IGxtKGxvZyhQVkJfdHMpIH4gdGltZShQVkJfdHMpKQpzdW1tYXJ5KHJlZ19tb2RlbCkKYGBgCgpgYGB7cn0KIyMjIyBBQ0YgYW5kIFBBQ0YKIyAzYzogV2hhdCBkbyB0aGUgQUNGIGFuZCBQQUNGIHZpc3VhbHMgaW5kaWNhdGUgZm9yIHRoZSBQVkIgcHJvZHVjdCBmb3JlY2FzdD8KCkFjZihQVkJfdHMpClBhY2YoUFZCX3RzKQpmb3JlY2FzdDo6dHNkaXNwbGF5KFBWQl90cykgICAgI1NhbWUgcGxvdCBhcyBhYm92ZQoKI0FDRiBwbG90IHRlbGxzIHVzIHRoZSBvcmRlciBvZiBhbiBNQSBtb2RlbDsgb2JzZXJ2ZSBsYWdzIGF0IDIgJiA0OyA0IGlzIHRoZSBjdXRvZmYgLS0gTUEoNCkKI1BBQ0YgcGxvdCB0ZWxscyB1cyB0aGUgb3JkZXIgb2YgYW4gQVIgbW9kZWw7IG9ic2VydmUgbGFnIGF0IDIgLS0gQVIoMikKCgojVGhlIExqdW5nLUJveCB0ZXN0IHRlc3RzIHdoZXRoZXIgYW55IG9mIGEgZ3JvdXAgb2YgYXV0b2NvcnJlbGF0aW9ucyBvZiBhIHRpbWUgc2VyaWVzIGFyZSBkaWZmZXJlbnQgZnJvbSB6ZXJvLiAKI0luIGVzc2VuY2UgaXQgdGVzdHMgdGhlIOKAnG92ZXJhbGwgcmFuZG9tbmVzc+KAnSBiYXNlZCBvbiBhIG51bWJlciBvZiBsYWdzLgojSWYgdGhlIHJlc3VsdCBpcyBhIHNtYWxsIHAtdmFsdWUgdGhhbiBpdCBpbmRpY2F0ZXMgdGhlIGRhdGEgaXMgcHJvYmFibHkgbm90IHdoaXRlIG5vaXNlLgpCb3gudGVzdChQVkJfdHMsIGxhZz0yLCBmaXRkZj0wLCB0eXBlPSJMaiIpICAgICN0aGlzIGlzIHRoZSBsYWcgdGhhdCBjYW1lIHVwIGluIHRoZSBhZGYgdGVzdApCb3gudGVzdChQVkJfdHMsIGxhZz01LCBmaXRkZj0wLCB0eXBlPSJMaiIpCkJveC50ZXN0KFBWQl90cywgbGFnPTEwLCBmaXRkZj0wLCB0eXBlPSJMaiIpCkJveC50ZXN0KFBWQl90cywgbGFnPTE1LCBmaXRkZj0wLCB0eXBlPSJMaiIpCiNwLXZhbHVlcyBhcmUgc21hbGwsIHNvIHdlIGNhbiByZWplY3QgdGhlIG51bGwgLS0gb3VyIGRhdGEgaXMgbm90IHdoaXRlIG5vaXNlCmBgYAoKYGBge3J9CiMjIyMgQlVJTEQgTU9ERUxTCiMgM2Q6IENvbXBhcmUgdGhlIG5haXZlIGRlbWFuZCBmb3JlY2FzdCB3aXRoIHRoZSBtb3ZpbmcgYXZlcmFnZSAoMiBxdWFydGVyKSBhbmQgYW4gQVJJTUEgbW9kZWw/CgojIyMgTkFJVkUgTU9ERUwKI05haXZlIEZvcmVjYXN0aW5nIE1ldGhvZApuYWl2ZV9tb2RlbCA8LSBuYWl2ZShQVkJfdHMsIDMpICAgIyAzIGJlY2F1c2Ugd2UgYXJlIGZvcmVjYXN0aW5nIGZvciB0aGUgbmV4dCAzIHF1YXJ0ZXJzCnN1bW1hcnkobmFpdmVfbW9kZWwpCmF1dG9wbG90KG5haXZlX21vZGVsKQoKI0NoZWNrIGZvciBmaXR0ZWQgdmFsdWVzIGFuZCByZXNpZHVhbHMKY2hlY2tyZXNpZHVhbHMobmFpdmVfbW9kZWwpCgoKIyMjIE1PVklORyBBVkVSQUdFICgyIHF1YXJ0ZXIpCmF1dG9wbG90KFBWQl90cywgc2VyaWVzID0gIkRhdGEiKSArIAogIGF1dG9sYXllcihtYShQVkJfdHMsIG9yZGVyID0gMiwgY2VudHJlID0gVFJVRSksIHNlcmllcyA9ICIyeDItTUEiKSArCiAgbGFicyh4ID0gIlllYXIiLCB5ID0gIlNhbGVzIikgKyAKICBnZ3RpdGxlKCIyeDIgbW92aW5nIGF2ZXJhZ2Ugb2YgUFZCIHNhbGVzIikKCmF1dG9fbWEgPC0gbWEoUFZCX3RzLCAyKQphdXRvX21hCmBgYAoKYGBge3J9CiMjIyMgQVJJTUEgbW9kZWwKCiNJdGVyYXRpb24gMSAtIEFSKDIpCmZpdDEgPC1hcmltYShQVkJfdHMsIG9yZGVyPWMoMiwwLDApKQpwbG90KHJlc2lkdWFscyhmaXQxKSkKQWNmKHJlc2lkdWFscyhmaXQxKSkKUGFjZihyZXNpZHVhbHMoZml0MSkpCnN1bW1hcnkoZml0MSkKI1Jlc3VsdHM6IEFJQyA9IDM5Mi4xNjsgUk1TRSA9IDE5MDI3LjE1CgojSXRlcmF0aW9uIDIgLSBNQSg0KQpmaXQyIDwtYXJpbWEoUFZCX3RzLCBvcmRlcj1jKDAsMCw0KSkKcGxvdChyZXNpZHVhbHMoZml0MikpCkFjZihyZXNpZHVhbHMoZml0MikpClBhY2YocmVzaWR1YWxzKGZpdDIpKQpzdW1tYXJ5KGZpdDIpCiNSZXN1bHRzOiBBSUMgPSAzOTEuMzQ7IFJNU0UgPSAxMzgzMS4xCgojSXRlcmF0aW9uIDMgLSAKZml0MyA8LWFyaW1hKFBWQl90cywgb3JkZXI9YygwLDAsNCksIHNlYXNvbmFsPWxpc3Qob3JkZXI9YygwLDAsMSkpKQpwbG90KHJlc2lkdWFscyhmaXQzKSkKQWNmKHJlc2lkdWFscyhmaXQzKSkKUGFjZihyZXNpZHVhbHMoZml0MykpCnN1bW1hcnkoZml0MykKI1Jlc3VsdHM6IEFJQyA9IDM4OS41NjsgUk1TRSA9IDExMTA0Ljg2CgojSXRlcmF0aW9uIDQgLSAKZml0NCA8LWFyaW1hKFBWQl90cywgb3JkZXI9YygwLDAsNCksIHNlYXNvbmFsPWxpc3Qob3JkZXI9YygwLDEsMCkpKQpwbG90KHJlc2lkdWFscyhmaXQ0KSkKQWNmKHJlc2lkdWFscyhmaXQ0KSkKUGFjZihyZXNpZHVhbHMoZml0NCkpCnN1bW1hcnkoZml0NCkKI1Jlc3VsdHM6IEFJQyA9IDI4My44OTsgUk1TRSA9IDY5OTEuNjY2CgojSXRlcmF0aW9uIDUgLSAKZml0NSA8LWFyaW1hKFBWQl90cywgb3JkZXI9YygyLDAsMCksIHNlYXNvbmFsPWxpc3Qob3JkZXI9YygwLDEsMCkpKQpwbG90KHJlc2lkdWFscyhmaXQ1KSkKQWNmKHJlc2lkdWFscyhmaXQ1KSkKUGFjZihyZXNpZHVhbHMoZml0NSkpCnN1bW1hcnkoZml0NSkKI1Jlc3VsdHM6IEFJQyA9IDI4MS42MTsgUk1TRSA9IDgzOTAuMDQ4IAoKI0l0ZXJhdGlvbiA2IC0gCmZpdDYgPC1hcmltYShQVkJfdHMsIG9yZGVyPWMoMiwwLDQpLCBzZWFzb25hbD1saXN0KG9yZGVyPWMoMCwxLDApKSkKcGxvdChyZXNpZHVhbHMoZml0NikpCkFjZihyZXNpZHVhbHMoZml0NikpClBhY2YocmVzaWR1YWxzKGZpdDYpKQpzdW1tYXJ5KGZpdDYpCiNSZXN1bHRzOiBBSUMgPSAyODcuMTc7IFJNU0UgPSA1OTg3LjQ3NQpgYGAKCmBgYHtyfQojQnVpbGQgYW4gQVJJTUEgTU9ERUwgdXNpbmcgYXV0by5hcmltYSgpIGZ1bmN0aW9uCmFyaW1hX2F1dG8gPC1hdXRvLmFyaW1hKFBWQl90cywgc2Vhc29uYWwgPSBUUlVFKQpzdW1tYXJ5KGFyaW1hX2F1dG8pCkFjZihyZXNpZHVhbHMoYXJpbWFfYXV0bykpClBhY2YocmVzaWR1YWxzKGFyaW1hX2F1dG8pKQojQVJJTUEoMCwwLDApKDAsMSwwKVs0XSB3aXRoIGRyaWZ0CiNSZXN1bHRzOiBBSUMgPSAyNzMuNzsgQklDID0gMjc0LjgzOyBSTVNFID0gNjc2OC4xNzcKCnBsb3QudHMoYXJpbWFfYXV0byRyZXNpZHVhbHMpCmBgYAoKYGBge3J9CiMjIyMgRk9SRUNBU1RJTkcKIyBDcmVhdGUgYSBkZW1hbmQgZm9yZWNhc3QgZm9yIHRoZSBQVkIgcHJvZHVjdCBmYW1pbHkgKHRvdGFsKSBmb3IgdGhlIG5leHQgdGhyZWUgcXVhcnRlcnMgb2YgMjAwNS4KCiNQbG90IHRoZSBmb3JlY2FzdCBvZiB0aGUgdGltZSBzZXJpZXMgdXNpbmcgdGhlIGZvcmVjYXN0IGZ1bmN0aW9uLCB3aXRoIGEgOTUlIGNvbmZpZGVuY2UgaW50ZXJ2YWwKI3doZXJlIGggaXMgdGhlIGZvcmVjYXN0IGhvcml6b24gaW4gbW9udGhzICh5b3UgY2FuIHdyaXRlIGg9NSoxMiBvciA2MCkKYXJpbWFfZm9yZWNhc3Q8LWZvcmVjYXN0KGFyaW1hX2F1dG8sIGxldmVsPWMoOTUpLCBoPTEyKQphdXRvcGxvdChhcmltYV9mb3JlY2FzdCkrbGFicyh4PSJUaW1lIiwgeT0iU2FsZXMiKQoKCgpgYGAKCgojIFF1ZXN0aW9uIDE6IAoKYGBge3J9CiMgTG9hZCB0aGUgbmVjZXNzYXJ5IGxpYnJhcmllcwpsaWJyYXJ5KHJlYWR4bCkKCiMgUmVhZCB0aGUgZm9yZWNhc3QgbWFzdGVyIGZvciBQVkIKZm9yZWNhc3RfbWFzdGVyX1BWQiA8LSByZWFkX2V4Y2VsKCJXSUxLSU5TIENBU0UgREFUQSAtUFJPSkVDVDMueGxzIiwgc2hlZXQgPSAiZm9yZWNhc3RfbWFzdGVyX1BWQiIpCgojIFByaW50IHRoZSBmb3JlY2FzdCBtYXN0ZXIgZm9yIFBWQgpwcmludChmb3JlY2FzdF9tYXN0ZXJfUFZCKQoKIyBSZWFkIHRoZSBzYWxlcyBoaXN0b3J5IGZvciBQVkIKc2FsZXNfaGlzdG9yeV9QVkIgPC0gcmVhZF9leGNlbCgiV0lMS0lOUyBDQVNFIERBVEEgLVBST0pFQ1QzLnhscyIsIHNoZWV0ID0gInNhbGVzX2hpc3RvcnlfUFZCIikKCiMgUHJpbnQgdGhlIHNhbGVzIGhpc3RvcnkgZm9yIFBWQgpwcmludChzYWxlc19oaXN0b3J5X1BWQikKCiMgU3Vic2V0IHRoZSBzYWxlcyBoaXN0b3J5IGZvciB0aGUgZmlyc3QgcXVhcnRlciBvZiAyMDA1IGZvciBQVkIKc2FsZXNfUTFfMjAwNSA8LSBzdWJzZXQoc2FsZXNfaGlzdG9yeV9QVkIsIFllYXIgPT0gMjAwNSAmIFF0ciA9PSAiUTEiKQoKIyBDYWxjdWxhdGUgdGhlIHRvdGFsIGFjdHVhbCBzYWxlcyBmb3IgdGhlIGZpcnN0IHF1YXJ0ZXIgb2YgMjAwNSBmb3IgUFZCCmFjdHVhbF9zYWxlc19RMV8yMDA1IDwtIHN1bShzYWxlc19RMV8yMDA1JFRvdGFsKQoKIyBFeHRyYWN0IHRoZSBmb3JlY2FzdGVkIHNhbGVzIGZvciB0aGUgZmlyc3QgcXVhcnRlciBvZiAyMDA1IGZvciBQVkIgZnJvbSB0aGUgZm9yZWNhc3QgbWFzdGVyCmZvcmVjYXN0ZWRfc2FsZXNfUTFfMjAwNSA8LSBmb3JlY2FzdF9tYXN0ZXJfUFZCJFExCgojIENhbGN1bGF0ZSB0aGUgYWJzb2x1dGUgZm9yZWNhc3QgZXJyb3IgZm9yIHRoZSBmaXJzdCBxdWFydGVyIG9mIDIwMDUgZm9yIFBWQgpmb3JlY2FzdF9lcnJvcl9RMV8yMDA1IDwtIGFjdHVhbF9zYWxlc19RMV8yMDA1IC0gZm9yZWNhc3RlZF9zYWxlc19RMV8yMDA1CgojIENhbGN1bGF0ZSB0aGUgcGVyY2VudGFnZSBlcnJvciBmb3IgdGhlIGZpcnN0IHF1YXJ0ZXIgb2YgMjAwNSBmb3IgUFZCCnBlcmNlbnRhZ2VfZXJyb3JfUTFfMjAwNSA8LSAoZm9yZWNhc3RfZXJyb3JfUTFfMjAwNSAvIGFjdHVhbF9zYWxlc19RMV8yMDA1KSAqIDEwMAoKIyBQcmludCB0aGUgcmVzdWx0cwpjYXQoIkFjdHVhbCBTYWxlcyBmb3IgUTEgMjAwNSAoUFZCKToiLCBhY3R1YWxfc2FsZXNfUTFfMjAwNSwgIlxuIikKY2F0KCJGb3JlY2FzdGVkIFNhbGVzIGZvciBRMSAyMDA1IChQVkIpOiIsIGZvcmVjYXN0ZWRfc2FsZXNfUTFfMjAwNSwgIlxuIikKY2F0KCJGb3JlY2FzdCBFcnJvciBmb3IgUTEgMjAwNSAoUFZCKToiLCBmb3JlY2FzdF9lcnJvcl9RMV8yMDA1LCAiXG4iKQpjYXQoIlBlcmNlbnRhZ2UgRXJyb3IgZm9yIFExIDIwMDUgKFBWQik6IiwgcGVyY2VudGFnZV9lcnJvcl9RMV8yMDA1LCAiJSIsICJcbiIpCgoKYGBgCgoKCgojIFF1ZXN0aW9uIDIKCgpgYGB7cn0KIyBSZWFkIHRoZSBleHRlcm5hbCBmYWN0b3JzIGRhdGEKdW5lbXBsb3ltZW50X3JhdGUgPC0gcmVhZF9leGNlbCgiV0lMS0lOUyBDQVNFIERBVEEgLVBST0pFQ1QzLnhscyIsIHNoZWV0ID0gInF1YXJ0ZXJseV91bmVtcGx5IikKYmFua19wcmltZV9sb2FuX3JhdGUgPC0gcmVhZF9leGNlbCgiV0lMS0lOUyBDQVNFIERBVEEgLVBST0pFQ1QzLnhscyIsIHNoZWV0ID0gInF1YXJ0ZXJseV9iYW5rbG9hbiIpCmhvdXNpbmdfc3RhcnRzIDwtIHJlYWRfZXhjZWwoIldJTEtJTlMgQ0FTRSBEQVRBIC1QUk9KRUNUMy54bHMiLCBzaGVldCA9ICJob3VzaW5nIikKCiMgUmVhZCB0aGUgc2FsZXMgaGlzdG9yeSBmb3IgZmlyZSB2YWx2ZXMKc2FsZXNfaGlzdG9yeV9maXJldmFsdmUgPC0gcmVhZF9leGNlbCgiV0lMS0lOUyBDQVNFIERBVEEgLVBST0pFQ1QzLnhscyIsIHNoZWV0ID0gInNhbGVzX2hpc3RvcnlfZmlyZXZhbHZlIikKCiMgTWVyZ2UgdGhlIHNhbGVzIGhpc3RvcnkgZm9yIFBWQiBhbmQgZmlyZSB2YWx2ZXMKbWVyZ2VkX3NhbGVzIDwtIG1lcmdlKHNhbGVzX2hpc3RvcnlfUFZCLCBzYWxlc19oaXN0b3J5X2ZpcmV2YWx2ZSwgYnkgPSBjKCJZZWFyIiwgIlF0ciIpKQoKc3VtbWFyeShtZXJnZWRfc2FsZXMpCgpgYGAKIyMgUTI6IENvcnJlbGF0aW9uIE1hdHJpeApgYGB7cn0KIyBDYWxjdWxhdGUgY29ycmVsYXRpb25zIGJldHdlZW4gZGVtYW5kIGFuZCBleHRlcm5hbCBmYWN0b3JzIGZvciBQVkIKY29ycmVsYXRpb25fUFZCIDwtIGxhcHBseShtZXJnZWRfc2FsZXNbLCBjKCJQMTI3MjAiLCAiUDM0NzEwIiwgIlAxNzIwIiwgIlAzNDQyMCIsICJQMTQyMCIpXSwgZnVuY3Rpb24oZGVtYW5kX3ZhcikgewogIGNvci50ZXN0KGRlbWFuZF92YXIsIHVuZW1wbG95bWVudF9yYXRlJFJhdGUpJGVzdGltYXRlCn0pCgojIENhbGN1bGF0ZSBjb3JyZWxhdGlvbnMgYmV0d2VlbiBkZW1hbmQgYW5kIGV4dGVybmFsIGZhY3RvcnMgZm9yIGZpcmUgdmFsdmVzCmNvcnJlbGF0aW9uX2ZpcmV2YWx2ZSA8LSBsYXBwbHkobWVyZ2VkX3NhbGVzWywgYygiRlZaMiIsICJGVlozIiwgIkZWWjNMIiwgIkZWWjM0IiwgIkZWWjM0TCIpXSwgZnVuY3Rpb24oZGVtYW5kX3ZhcikgewogIGNvci50ZXN0KGRlbWFuZF92YXIsIHVuZW1wbG95bWVudF9yYXRlJFJhdGUpJGVzdGltYXRlCn0pCgojIFByaW50IHRoZSBjb3JyZWxhdGlvbnMgZm9yIFBWQgpwcmludChjb3JyZWxhdGlvbl9QVkIpCgojIFByaW50IHRoZSBjb3JyZWxhdGlvbnMgZm9yIGZpcmUgdmFsdmVzCnByaW50KGNvcnJlbGF0aW9uX2ZpcmV2YWx2ZSkKCiNQTE9UUwoKIyBDcmVhdGUgYSBkYXRhIGZyYW1lIGZvciBQVkIgY29ycmVsYXRpb25zCmNvcnJlbGF0aW9uX2RhdGFfUFZCIDwtIGRhdGEuZnJhbWUoRmFjdG9yID0gbmFtZXMoY29ycmVsYXRpb25fUFZCKSwgQ29ycmVsYXRpb24gPSB1bmxpc3QoY29ycmVsYXRpb25fUFZCKSkKCiMgUGxvdCBjb3JyZWxhdGlvbnMgZm9yIFBWQgpnZ3Bsb3QoY29ycmVsYXRpb25fZGF0YV9QVkIsIGFlcyh4ID0gRmFjdG9yLCB5ID0gQ29ycmVsYXRpb24pKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIGZpbGwgPSAiYmx1ZSIpICsKICBsYWJzKHggPSAiRmFjdG9yIiwgeSA9ICJDb3JyZWxhdGlvbiIsIHRpdGxlID0gIkNvcnJlbGF0aW9ucyBiZXR3ZWVuIFBWQiBEZW1hbmQgYW5kIFVuZW1wbG95bWVudCBSYXRlIikKCiMgQ3JlYXRlIGEgZGF0YSBmcmFtZSBmb3IgZmlyZSB2YWx2ZSBjb3JyZWxhdGlvbnMKY29ycmVsYXRpb25fZGF0YV9maXJldmFsdmUgPC0gZGF0YS5mcmFtZShGYWN0b3IgPSBuYW1lcyhjb3JyZWxhdGlvbl9maXJldmFsdmUpLCBDb3JyZWxhdGlvbiA9IHVubGlzdChjb3JyZWxhdGlvbl9maXJldmFsdmUpKQoKIyBQbG90IGNvcnJlbGF0aW9ucyBmb3IgZmlyZSB2YWx2ZXMKZ2dwbG90KGNvcnJlbGF0aW9uX2RhdGFfZmlyZXZhbHZlLCBhZXMoeCA9IEZhY3RvciwgeSA9IENvcnJlbGF0aW9uKSkgKwogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBmaWxsID0gInJlZCIpICsKICBsYWJzKHggPSAiRmFjdG9yIiwgeSA9ICJDb3JyZWxhdGlvbiIsIHRpdGxlID0gIkNvcnJlbGF0aW9ucyBiZXR3ZWVuIEZpcmUgVmFsdmUgRGVtYW5kIGFuZCBVbmVtcGxveW1lbnQgUmF0ZSIpCgoKYGBgClRoZSBjb3JyZWxhdGlvbiByZXN1bHRzIGluZGljYXRlIHRoZSBzdHJlbmd0aCBhbmQgZGlyZWN0aW9uIG9mIHRoZSByZWxhdGlvbnNoaXBzIGJldHdlZW4gdGhlIGRlbWFuZCBmb3IgUFZCIHByb2R1Y3RzIGFuZCBmaXJlIHZhbHZlcyBhbmQgdGhlIHNlbGVjdGVkIGV4dGVybmFsIGZhY3RvcnMgKHVuZW1wbG95bWVudCByYXRlLCBiYW5rIHByaW1lIGxvYW4gcmF0ZSwgYW5kIGhvdXNpbmcgc3RhcnRzKS4gSW5zaWdodHMgZ2FpbmVkOiAKCkZvciBQVkIgcHJvZHVjdHM6CgpQMTI3MjAgKFBWQiAxMi03MjApOiBUaGVyZSBpcyBhIG1vZGVyYXRlIHBvc2l0aXZlIGNvcnJlbGF0aW9uICgwLjQ4MCkgYmV0d2VlbiB0aGUgZGVtYW5kIGZvciBQVkIgMTItNzIwIHByb2R1Y3RzIGFuZCB0aGUgc2VsZWN0ZWQgZXh0ZXJuYWwgZmFjdG9ycy4gVGhpcyBzdWdnZXN0cyB0aGF0IGFzIHRoZSBleHRlcm5hbCBmYWN0b3JzIGluY3JlYXNlLCB0aGUgZGVtYW5kIGZvciBQVkIgMTItNzIwIHByb2R1Y3RzIHRlbmRzIHRvIGluY3JlYXNlLiBBbiBpbnR1aXRpb24gQmFyZ2UgbWVudGlvbmVkLgoKUDM0NzEwIChQVkIgMzQtNzIwKTogVGhlcmUgaXMgYSB3ZWFrIHBvc2l0aXZlIGNvcnJlbGF0aW9uICgwLjI3MSkgYmV0d2VlbiB0aGUgZGVtYW5kIGZvciBQVkIgMzQtNzIwIHByb2R1Y3RzIGFuZCB0aGUgZXh0ZXJuYWwgZmFjdG9ycy4gVGhlIHJlbGF0aW9uc2hpcCBpcyBub3QgYXMgc3Ryb25nIGFzIHdpdGggUFZCIDEyLTcyMCBwcm9kdWN0cy4KClAxNzIwIChQVkIgMS03MjApOiBUaGVyZSBpcyBhIHdlYWsgcG9zaXRpdmUgY29ycmVsYXRpb24gKDAuMTk5KSBiZXR3ZWVuIHRoZSBkZW1hbmQgZm9yIFBWQiAxLTcyMCBwcm9kdWN0cyBhbmQgdGhlIHNlbGVjdGVkIGV4dGVybmFsIGZhY3RvcnMuIFRoZSByZWxhdGlvbnNoaXAgaXMgd2Vha2VyIGNvbXBhcmVkIHRvIFBWQiAxMi03MjAgcHJvZHVjdHMuCgpQMzQ0MjAgKFBWQiAzNC00MjApOiBUaGVyZSBpcyBhIHZlcnkgd2VhayBwb3NpdGl2ZSBjb3JyZWxhdGlvbiAoMC4wODIpIGJldHdlZW4gdGhlIGRlbWFuZCBmb3IgUFZCIDM0LTQyMCBwcm9kdWN0cyBhbmQgdGhlIHNlbGVjdGVkIGV4dGVybmFsIGZhY3RvcnMuIAoKUDE0MjAgKFBWQiAxLTQyMCk6IFRoZXJlIGlzIGEgbW9kZXJhdGUgcG9zaXRpdmUgY29ycmVsYXRpb24gKDAuNDkyKSBiZXR3ZWVuIHRoZSBkZW1hbmQgZm9yIFBWQiAxLTQyMCBwcm9kdWN0cyBhbmQgdGhlIHNlbGVjdGVkIGV4dGVybmFsIGZhY3RvcnMuIFRoaXMgaW5kaWNhdGVzIHRoYXQgYXMgdGhlIGV4dGVybmFsIGZhY3RvcnMgaW5jcmVhc2UsIHRoZSBkZW1hbmQgZm9yIFBWQiAxLTQyMCBwcm9kdWN0cyB0ZW5kcyB0byBpbmNyZWFzZS4KCkZvciBGaXJlIFZhbHZlczoKCkZWWjIgKEZpcmUgVmFsdmUgWjIxMDUpOiBUaGVyZSBpcyBhIHdlYWsgbmVnYXRpdmUgY29ycmVsYXRpb24gKC0wLjA5MCkgYmV0d2VlbiB0aGUgZGVtYW5kIGZvciBGaXJlIFZhbHZlIFoyMTA1IGFuZCB0aGUgc2VsZWN0ZWQgZXh0ZXJuYWwgZmFjdG9ycy4gVGhpcyBzdWdnZXN0cyB0aGF0IGFzIHRoZSBleHRlcm5hbCBmYWN0b3JzIGluY3JlYXNlLCB0aGUgZGVtYW5kIGZvciBGaXJlIFZhbHZlIFoyMTA1IHRlbmRzIHRvIGRlY3JlYXNlIHNsaWdodGx5LgoKRlZaMyAoRmlyZSBWYWx2ZSBaMzAwMCk6IFRoZXJlIGlzIGEgd2VhayBuZWdhdGl2ZSBjb3JyZWxhdGlvbiAoLTAuMTY1KSBiZXR3ZWVuIHRoZSBkZW1hbmQgZm9yIEZpcmUgVmFsdmUgWjMwMDAgYW5kIHRoZSBzZWxlY3RlZCBleHRlcm5hbCBmYWN0b3JzLgoKRlZaM0wgKEZpcmUgVmFsdmUgWjMwMDBJTCk6IFRoZXJlIGlzIGEgd2VhayBwb3NpdGl2ZSBjb3JyZWxhdGlvbiAoMC4yMTgpIGJldHdlZW4gdGhlIGRlbWFuZCBmb3IgRmlyZSBWYWx2ZSBaMzAwMElMIGFuZCB0aGUgc2VsZWN0ZWQgZXh0ZXJuYWwgZmFjdG9ycy4gVGhpcyBpbmRpY2F0ZXMgdGhhdCBhcyB0aGUgZXh0ZXJuYWwgZmFjdG9ycyBpbmNyZWFzZSwgdGhlIGRlbWFuZCBmb3IgRmlyZSBWYWx2ZSBaMzAwMElMIGFsc28gdGVuZHMgdG8gaW5jcmVhc2Ugc2xpZ2h0bHkuCgpGVlozNCAoRmlyZSBWYWx2ZSBaMzAwNCk6IFRoZXJlIGlzIGEgbW9kZXJhdGUgbmVnYXRpdmUgY29ycmVsYXRpb24gKC0wLjQwMSkgYmV0d2VlbiB0aGUgZGVtYW5kIGZvciBGaXJlIFZhbHZlIFozMDA0IGFuZCB0aGUgc2VsZWN0ZWQgZXh0ZXJuYWwgZmFjdG9ycy4gVGhpcyBzdWdnZXN0cyB0aGF0IGFzIHRoZSBleHRlcm5hbCBmYWN0b3JzIGluY3JlYXNlLCB0aGUgZGVtYW5kIGZvciBGaXJlIFZhbHZlIFozMDA0IHByb2R1Y3RzIHRlbmRzIHRvIGRlY3JlYXNlLgoKRlZaMzRMIChGaXJlIFZhbHZlIFozMDA0SUwpOiBUaGVyZSBpcyBhIHdlYWsgcG9zaXRpdmUgY29ycmVsYXRpb24gKDAuMTg2KSBiZXR3ZWVuIHRoZSBkZW1hbmQgZm9yIEZpcmUgVmFsdmUgWjMwMDRJTCBhbmQgdGhlIHNlbGVjdGVkIGV4dGVybmFsIGZhY3RvcnMuIFRoZSByZWxhdGlvbnNoaXAgaXMgd2Vha2VyIGNvbXBhcmVkIHRvIG90aGVyIGZpcmUgdmFsdmUgcHJvZHVjdHMuCgpPdmVyYWxsLCB0aGVzZSBjb3JyZWxhdGlvbiBjb2VmZmljaWVudHMgcHJvdmlkZSBpbnNpZ2h0cyBpbnRvIHRoZSByZWxhdGlvbnNoaXBzIGJldHdlZW4gdGhlIGRlbWFuZCBmb3IgZGlmZmVyZW50IHByb2R1Y3RzIGFuZCB0aGUgZXh0ZXJuYWwgZmFjdG9ycy4gSG93ZXZlciwgaXQncyBpbXBvcnRhbnQgdG8gbm90ZSB0aGF0IGNvcnJlbGF0aW9uIGRvZXMgbm90IGltcGx5IGNhdXNhdGlvbi4gRnVydGhlciBhbmFseXNpcyBhbmQgY29uc2lkZXJhdGlvbiBvZiBvdGhlciBmYWN0b3JzIGFyZSBuZWVkZWQgdG8gZnVsbHkgdW5kZXJzdGFuZCB0aGUgZHluYW1pY3MgYW5kIG1ha2UgYWNjdXJhdGUgcHJlZGljdGlvbnMgb3IgZGVjaXNpb25zLgoKIyMgUTI6IFJlZ3Jlc3NvaW4gQW5hbHlzaXMgCmBgYHtyfQojIFBlcmZvcm0gcmVncmVzc2lvbiBhbmFseXNpcyBiZXR3ZWVuIGRlbWFuZCBhbmQgZXh0ZXJuYWwgZmFjdG9ycyBmb3IgUFZCCnJlZ3Jlc3Npb25fUFZCIDwtIGxtKGNiaW5kKGBQMTI3MjBgLCBgUDM0NzEwYCwgYFAxNzIwYCwgYFAzNDQyMGAsIGBQMTQyMGApIH4gCiAgICAgICAgICAgICAgICAgICAgICAgdW5lbXBsb3ltZW50X3JhdGUkUmF0ZSArIGJhbmtfcHJpbWVfbG9hbl9yYXRlJFJhdGUgKyBob3VzaW5nX3N0YXJ0cyRUb3RhbCwgCiAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBtZXJnZWRfc2FsZXMpCgojIFBlcmZvcm0gcmVncmVzc2lvbiBhbmFseXNpcyBiZXR3ZWVuIGRlbWFuZCBhbmQgZXh0ZXJuYWwgZmFjdG9ycyBmb3IgZmlyZSB2YWx2ZXMKcmVncmVzc2lvbl9maXJldmFsdmUgPC0gbG0oY2JpbmQoYEZWWjJgLCBgRlZaM2AsIGBGVlozTGAsIGBGVlozNGAsIGBGVlozNExgKSB+IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5lbXBsb3ltZW50X3JhdGUkUmF0ZSArIGJhbmtfcHJpbWVfbG9hbl9yYXRlJFJhdGUgKyBob3VzaW5nX3N0YXJ0cyRUb3RhbCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IG1lcmdlZF9zYWxlcykKCgojIFByaW50IHRoZSByZWdyZXNzaW9uIHN1bW1hcnkgZm9yIFBWQgpzdW1tYXJ5KHJlZ3Jlc3Npb25fUFZCKQoKIyBQcmludCB0aGUgcmVncmVzc2lvbiBzdW1tYXJ5IGZvciBmaXJlIHZhbHZlcwpzdW1tYXJ5KHJlZ3Jlc3Npb25fZmlyZXZhbHZlKQoKCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShSQ29sb3JCcmV3ZXIpCgojIENyZWF0ZSBhIGRhdGEgZnJhbWUgd2l0aCB0aGUgcmVsZXZhbnQgdmFyaWFibGVzCmRhdGFfY29tYmluZWQgPC0gZGF0YS5mcmFtZSgKICBVbmVtcGxveW1lbnRfUmF0ZSA9IHVuZW1wbG95bWVudF9yYXRlJFJhdGUsCiAgUFZCXzEyXzcyMCA9IG1lcmdlZF9zYWxlcyRQMTI3MjAsCiAgUFZCXzFfNDIwID0gbWVyZ2VkX3NhbGVzJFAxNDIwLAogIEZpcmVfVmFsdmVfWjIxMDUgPSBtZXJnZWRfc2FsZXMkRlZaMiwKICBGaXJlX1ZhbHZlX1ozMDA0ID0gbWVyZ2VkX3NhbGVzJEZWWjM0CikKCiMgTWVsdCB0aGUgZGF0YSBmcmFtZSBmb3IgcGxvdHRpbmcKZGF0YV9tZWx0ZWQgPC0gcmVzaGFwZTI6Om1lbHQoZGF0YV9jb21iaW5lZCwgaWQudmFycyA9ICJVbmVtcGxveW1lbnRfUmF0ZSIsIHZhcmlhYmxlLm5hbWUgPSAiUHJvZHVjdCIsIHZhbHVlLm5hbWUgPSAiRGVtYW5kIikKCiMgRGVmaW5lIGEgY3VzdG9tIGNvbG9yIHBhbGV0dGUKbXlfcGFsZXR0ZSA8LSBicmV3ZXIucGFsKDQsICJTZXQyIikKCiMgUGxvdCB0aGUgcmVncmVzc2lvbiBsaW5lcwpnZ3Bsb3QoZGF0YSA9IGRhdGFfbWVsdGVkLCBhZXMoeCA9IFVuZW1wbG95bWVudF9SYXRlLCB5ID0gRGVtYW5kLCBjb2xvciA9IFByb2R1Y3QpKSArCiAgZ2VvbV9wb2ludCgpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBzZSA9IEZBTFNFKSArCiAgbGFicyh4ID0gIlVuZW1wbG95bWVudCBSYXRlIiwgeSA9ICJEZW1hbmQiLCB0aXRsZSA9ICJSZWdyZXNzaW9uIEFuYWx5c2lzOiBQVkIgUHJvZHVjdHMgYW5kIEZpcmUgVmFsdmVzIikgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBteV9wYWxldHRlKSArCiAgdGhlbWVfYncoKQoKCmBgYAoKVGhlIHJlZ3Jlc3Npb24gYW5hbHlzaXMgcHJvdmlkZXMgaW5zaWdodHMgaW50byB0aGUgcmVsYXRpb25zaGlwcyBiZXR3ZWVuIHRoZSBkZW1hbmQgZm9yIGVhY2ggcHJvZHVjdCAoUFZCIGFuZCBmaXJlIHZhbHZlcykgYW5kIHRoZSBzZWxlY3RlZCBleHRlcm5hbCBmYWN0b3JzICh1bmVtcGxveW1lbnQgcmF0ZSwgYmFuayBwcmltZSBsb2FuIHJhdGUsIGFuZCBob3VzaW5nIHN0YXJ0cykuIAoKRm9yIHRoZSBQVkIgcHJvZHVjdCBmYW1pbHk6CgpQMTI3MjA6IFRoZSBjb2VmZmljaWVudCBlc3RpbWF0ZXMgc3VnZ2VzdCB0aGF0IHRoZSB1bmVtcGxveW1lbnQgcmF0ZSBhbmQgYmFuayBwcmltZSBsb2FuIHJhdGUgaGF2ZSBhIG5lZ2F0aXZlIGltcGFjdCBvbiB0aGUgZGVtYW5kIGZvciBQMTI3MjAsIHdoaWxlIGhvdXNpbmcgc3RhcnRzIGhhdmUgYSBwb3NpdGl2ZSBpbXBhY3QuIEhvd2V2ZXIsIG5vbmUgb2YgdGhlIGNvZWZmaWNpZW50cyBhcmUgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudC4gVGhlIGFkanVzdGVkIFItc3F1YXJlZCB2YWx1ZSBpbmRpY2F0ZXMgdGhhdCB0aGUgZXh0ZXJuYWwgZmFjdG9ycyBleHBsYWluIGFib3V0IDU1LjA4JSBvZiB0aGUgdmFyaWF0aW9uIGluIHRoZSBkZW1hbmQgZm9yIFAxMjcyMCwgd2hpY2ggaXMgbm8gYmV0dGVyIHRoYW4gY2hhbmNlLiAKClAzNDcxMDogU2ltaWxhciB0byBQMTI3MjAsIHRoZSBjb2VmZmljaWVudHMgZm9yIHRoZSB1bmVtcGxveW1lbnQgcmF0ZSwgYmFuayBwcmltZSBsb2FuIHJhdGUsIGFuZCBob3VzaW5nIHN0YXJ0cyBhcmUgbm90IHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQuIFRoZSBhZGp1c3RlZCBSLXNxdWFyZWQgdmFsdWUgaW5kaWNhdGVzIHRoYXQgdGhlIGV4dGVybmFsIGZhY3RvcnMgZXhwbGFpbiBhYm91dCAzNC4zMyUgb2YgdGhlIHZhcmlhdGlvbiBpbiB0aGUgZGVtYW5kIGZvciBQMzQ3MTAuCgpQMTcyMDogT25jZSBhZ2FpbiwgdGhlIGNvZWZmaWNpZW50cyBmb3IgdGhlIGV4dGVybmFsIGZhY3RvcnMgYXJlIG5vdCBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50LiBUaGUgYWRqdXN0ZWQgUi1zcXVhcmVkIHZhbHVlIGluZGljYXRlcyB0aGF0IHRoZSBleHRlcm5hbCBmYWN0b3JzIGV4cGxhaW4gYWJvdXQgMTQuMDYlIG9mIHRoZSB2YXJpYXRpb24gaW4gdGhlIGRlbWFuZCBmb3IgUDE3MjAuCgpQMzQ0MjA6IFRoZSBjb2VmZmljaWVudHMgZm9yIHRoZSBleHRlcm5hbCBmYWN0b3JzIGFyZSBub3Qgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCwgaW5kaWNhdGluZyB0aGF0IHRoZXNlIGZhY3RvcnMgbWF5IG5vdCBoYXZlIGEgc2lnbmlmaWNhbnQgaW1wYWN0IG9uIHRoZSBkZW1hbmQgZm9yIFAzNDQyMC4gVGhlIGFkanVzdGVkIFItc3F1YXJlZCB2YWx1ZSBpcyBuZWdhdGl2ZSwgc3VnZ2VzdGluZyB0aGF0IHRoZSBtb2RlbCBkb2VzIG5vdCBwcm92aWRlIGEgZ29vZCBmaXQgZm9yIGV4cGxhaW5pbmcgdGhlIHZhcmlhdGlvbiBpbiB0aGUgZGVtYW5kIGZvciBQMzQ0MjAuCgpQMTQyMDogVGhlIGNvZWZmaWNpZW50cyBmb3IgdGhlIGV4dGVybmFsIGZhY3RvcnMgYXJlIG5vdCBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50LiBUaGUgYWRqdXN0ZWQgUi1zcXVhcmVkIHZhbHVlIGluZGljYXRlcyB0aGF0IHRoZSBleHRlcm5hbCBmYWN0b3JzIGV4cGxhaW4gYWJvdXQgMTcuNyUgb2YgdGhlIHZhcmlhdGlvbiBpbiB0aGUgZGVtYW5kIGZvciBQMTQyMC4KCkZvciB0aGUgZmlyZSB2YWx2ZXM6CgpGVloyLCBGVlozLCBGVlozTCwgRlZaMzQsIGFuZCBGVlozNEw6IFNpbWlsYXIgdG8gdGhlIFBWQiBwcm9kdWN0cywgdGhlIGNvZWZmaWNpZW50cyBmb3IgdGhlIGV4dGVybmFsIGZhY3RvcnMgYXJlIG5vdCBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50IGZvciBhbnkgb2YgdGhlIGZpcmUgdmFsdmUgcHJvZHVjdHMuIFRoZSBhZGp1c3RlZCBSLXNxdWFyZWQgdmFsdWVzIGluZGljYXRlIHRoYXQgdGhlIGV4dGVybmFsIGZhY3RvcnMgZXhwbGFpbiBvbmx5IGEgc21hbGwgcG9ydGlvbiBvZiB0aGUgdmFyaWF0aW9uIGluIHRoZSBkZW1hbmQgZm9yIGZpcmUgdmFsdmVzLgpPdmVyYWxsLCB0aGUgcmVzdWx0cyBzdWdnZXN0IHRoYXQgdGhlIHNlbGVjdGVkIGV4dGVybmFsIGZhY3RvcnMgbWF5IG5vdCBoYXZlIGEgc2lnbmlmaWNhbnQgaW1wYWN0IG9uIHRoZSBkZW1hbmQgZm9yIHRoZSBQVkIgcHJvZHVjdCBmYW1pbHkgYW5kIGZpcmUgdmFsdmVzLiBUaGUgY29lZmZpY2llbnRzIGFyZSBub3Qgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCBmb3IgbW9zdCBvZiB0aGUgcmVzcG9uc2UgdmFyaWFibGVzLCBpbmRpY2F0aW5nIHRoYXQgb3RoZXIgZmFjdG9ycyBvciB2YXJpYWJsZXMgbm90IGluY2x1ZGVkIGluIHRoZSBhbmFseXNpcyBtYXkgcGxheSBhIG1vcmUgc2lnbmlmaWNhbnQgcm9sZSBpbiBkZXRlcm1pbmluZyB0aGUgZGVtYW5kIGZvciB0aGVzZSBwcm9kdWN0cy4KCiMjIFEyOiBBbnN3ZXIgLSAKVGhlIGFuYWx5c2lzIGZvdW5kIGNvcnJlbGF0aW9ucyBiZXR3ZWVuIGNlcnRhaW4gcHJvZHVjdHMgaW4gdGhlIFBWQiBmYW1pbHkgYW5kIGZpcmUgdmFsdmVzIHdpdGggdGhlIGV4dGVybmFsIGZhY3RvcnMuIFNwZWNpZmljYWxseSwgdGhlIGRlbWFuZCBmb3IgUFZCIDEyLTcyMCBhbmQgUFZCIDEtNDIwIHByb2R1Y3RzIHRlbmRzIHRvIGluY3JlYXNlIGFzIHRoZXNlIGZhY3RvcnMgaW5jcmVhc2UuIEhvd2V2ZXIsIHRoZSBjb25uZWN0aW9ucyBmb3Igb3RoZXIgUFZCIHByb2R1Y3RzIGFuZCBmaXJlIHZhbHZlcyBhcmUgZ2VuZXJhbGx5IHdlYWsgb3Igbm90IGltcG9ydGFudC4KCk9uIHRoZSBvdGhlciBoYW5kLCB0aGUgYW5hbHlzaXMgc2hvd3MgdGhhdCB0aGUgZXh0ZXJuYWwgZmFjdG9ycyBkbyBub3QgaGF2ZSBhIGJpZyBpbXBhY3Qgb24gdGhlIGRlbWFuZCBmb3IgdGhlIFBWQiBmYW1pbHkgYW5kIGZpcmUgdmFsdmVzLiBUaGUgbnVtYmVycyB1c2VkIHRvIG1lYXN1cmUgdGhpcyBpbXBhY3QgYXJlIG5vdCBzaWduaWZpY2FudCwgbWVhbmluZyB0aGF0IHRoZXNlIGZhY3RvcnMgbWF5IG5vdCBzdHJvbmdseSBhZmZlY3QgdGhlIGRlbWFuZC4gVGhlIGFuYWx5c2lzIGFsc28gc3VnZ2VzdHMgdGhhdCB0aGUgZXh0ZXJuYWwgZmFjdG9ycyBleHBsYWluIG9ubHkgYSBzbWFsbCBwYXJ0IG9mIHRoZSBjaGFuZ2VzIGluIGRlbWFuZCBmb3IgdGhlc2UgcHJvZHVjdHMuCgpPdmVyYWxsLCB0aGVzZSBmaW5kaW5ncyBzdWdnZXN0IHRoYXQgd2hpbGUgc29tZSBwcm9kdWN0cyBzaG93IHNvbWUgY29ycmVsYXRpb25zIHdpdGggdGhlIGV4dGVybmFsIGZhY3RvcnMsIHRoZXNlIGNvbm5lY3Rpb25zIGFyZSBub3Qgc3Ryb25nIGVub3VnaCB0byBoYXZlIGEgYmlnIGltcGFjdCBvbiB0aGUgZGVtYW5kIGZvciB0aGUgUFZCIGZhbWlseSBhbmQgZmlyZSB2YWx2ZXMuIE90aGVyIGZhY3RvcnMgdGhhdCB3ZXJlIG5vdCBjb25zaWRlcmVkIGluIHRoaXMgYW5hbHlzaXMgbWF5IGhhdmUgYSBtb3JlIHNpZ25pZmljYW50IHJvbGUgaW4gZGV0ZXJtaW5pbmcgdGhlIGRlbWFuZCBmb3IgdGhlc2UgcHJvZHVjdHMuCg==