A Natural Gas Problem
Answer the questions to the best of your ability and be systematic in solving the problems. This will always take you far. An Excel Workbook called NaturalGas2019.xls and an identical R data file NaturalGas2019.RData contain the necessary data. Each sheet will contain data in both stacked and unstacked forms. Unstacked places the data for Henry Hub and Tianjin in separate data columns. Stacked data combines a single column of data with a single column describing which of the two locations the observation belongs to.
load(url("https://github.com/robertwwalker/DADMStuff/raw/master/NaturalGas2019.RData"))
library(tidyverse)
library(skimr)
library(ggplot2)
- The central probability in a standard normal distribution between XXX and XXX is 0.6827.
result <- prob_norm(mean = 0, stdev = 1, plb = 0.159, pub = 0.841)
summary(result, type = "probs")
Probability calculator
Distribution: Normal
Mean : 0
St. dev : 1
Lower bound : 0.159
Upper bound : 0.841
P(X < -0.999) = 0.159
P(X > -0.999) = 0.841
P(X < 0.999) = 0.841
P(X > 0.999) = 0.159
P(-0.999 < X < 0.999) = 0.682
1 - P(-0.999 < X < 0.999) = 0.318
plot(result, type = "probs")

0.6827 is the empirical rule probability between -1 and 1.
!Figure](https://github.com/robertwwalker/DADMStuff/raw/master/NormQ1.png)
result <- prob_norm(mean = 0, stdev = 1, plb = 0.1)
summary(result, type = "probs")
Probability calculator
Distribution: Normal
Mean : 0
St. dev : 1
Lower bound : 0.1
Upper bound : 1
P(X < -1.282) = 0.1
P(X > -1.282) = 0.9
plot(result, type = "probs")

The probability of a standard normal above -1.282 is 0.9.
- For a normal distribution with mean 10 and standard deviation 5, what is the value of this normal such that 80% of the probability lies above it?
result <- prob_norm(mean = 10, stdev = 5, plb = 0.2)
summary(result, type = "probs")
Probability calculator
Distribution: Normal
Mean : 10
St. dev : 5
Lower bound : 0.2
Upper bound : 1
P(X < 5.792) = 0.2
P(X > 5.792) = 0.8
plot(result, type = "probs")

80 percent of the probability lies above 5.792.
The Case
A chemical manufacturer will build a new epoxy plant in one of two locations – one adjacent to an extant facility in Tianjin, China and one near the company’s headquarters in the United States near Henry Hub in Louisiana. The plant is a first-of-its-kind entirely automated plant that hosts only a tiny number of supervisors and labor costs across the two locations do not differ. The only input that might reasonably differ in cost is energy. Where to locate the factory and potential differences in the cost of energy will play a crucial role in our decision.
An Energy Cost Comparison
An intern has collected two random samples of energy prices from local newspapers for comparison. Over the last six months, the intern has a random sample of size 25 from Tianjin and a random sample of size 36 from Henry Hub reported in Newspapers – a sheet in the Excel Workbook on WISE referenced above. You are to undertake an initial summary of these data. You should note that both prices are reported in United States dollars per Million BTU (million British thermal units). The dates that the prices (spot) were recorded is listed in the adjacent column for each series. The worksheet contains the data in both a stacked and an unstacked format.
- Provide a single plot combining the two samples of data. Which of the two series is more symmetric? What information in the plot led you to this choice?
visualize(
Newspapers,
xvar = "Location",
yvar = "Price",
type = "box",
custom = FALSE
)

visualize(
Newspapers,
xvar = "Price",
type = "density",
fill = "Location",
custom = FALSE
)

Henry Hub is both more variable and more symmetric. Tianjin has a fraction of the variability but is quite skewed.
- What is the sample mean and sample standard deviation of natural gas prices in Tianjin? Henry Hub?
result <- explore(
Newspapers,
vars = "Price",
byvar = "Location",
fun = c(
"n_obs", "mean", "sd", "se", "min", "p25", "median", "p75",
"max"
),
nr = 2
)
summary(result)
Explore
Data : Newspapers
Grouped by : Location
Functions : n_obs, mean, sd, se, min, p25, median, p75, max
Top : Function
Location variable n_obs mean sd se min p25 median p75 max
HenryHub Price 36 3.796 0.140 0.023 3.520 3.690 3.795 3.902 4.070
Tianjin Price 25 3.994 0.051 0.010 3.880 3.980 4.000 4.040 4.050
# dtab(result) %>% render()
The sample mean at Tianjin is $3.9944 with a standard deviation of $0.05 and a standard error of the mean of $0.01. The mean price at Henry Hub is $3.796 with a standard deviation of $0.14 and and standard error of the mean price of $0.023.
- Assume that the underlying population is normal with the population mean and population standard deviation exactly equal to the sample mean and standard deviation that you have estimated from the sample from Tianjin. What is the probability of a daily price of $4.00 or higher at Tianjin?
result <- prob_norm(mean = 3.9944, stdev = 0.051, ub = 4)
summary(result)
Probability calculator
Distribution: Normal
Mean : 3.994
St. dev : 0.051
Lower bound : -Inf
Upper bound : 4
P(X < 4) = 0.544
P(X > 4) = 0.456
plot(result)
Assuming prices at Tianjin are normal with mean 3.9944 and standard deviation 0.051, the probability of a daily price of $4.00 or greater is 0.456.
- What is a 95% confidence interval for the average price in Tianjin given this precise sample? Provide both boundaries.
With 95% confidence, the average price at Tianjin ranges from $3.97
result <- single_mean(Newspapers, var = "TianjinPrice")
summary(result)
plot(result, plots = "hist", custom = FALSE)
Error: <text>:1:6: unexpected numeric constant
1: With 95
^
With 95% confidence, the average price at Tianjin ranges from $3.973 to $4.015 per mBTU.
- What is the probability of a mean price of $4.00 or lower given the Tianjin data?
result <- single_mean(
Newspapers,
var = "TianjinPrice",
comp_value = 4,
alternative = "greater"
)
summary(result)
Single mean test
Data : Newspapers
Variable : TianjinPrice
Confidence: 0.95
Null hyp. : the mean of TianjinPrice = 4
Alt. hyp. : the mean of TianjinPrice is > 4
mean sd n_obs n_missing
3.994 0.051 25 36
diff se t.value p.value df 5% 100%
-0.006 0.01 -0.553 0.707 24 3.977 Inf
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
plot(result, plots = "hist", custom = FALSE)

The probability of a mean price of $4.00 or less is 0.707. It has to be greater than 0.5 because the sample mean is less than $4.00.
- Speculative: What is a 95% confidence interval of the difference in average prices.
result <- compare_means(
Newspapers,
var1 = "Location",
var2 = "Price"
)
summary(result, show = TRUE)
Pairwise mean comparisons (t-test)
Data : Newspapers
Variables : Location, Price
Samples : independent
Confidence: 0.95
Adjustment: None
Location mean n sd se me
HenryHub 3.796 36 0.140 0.023 0.047
Tianjin 3.994 25 0.051 0.010 0.021
Null hyp. Alt. hyp. diff p.value se t.value df 2.5% 97.5%
HenryHub = Tianjin HenryHub not equal to Tianjin -0.199 < .001 0.025 -7.814 47.036 -0.25 -0.147 ***
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
plot(result, plots = "scatter", custom = FALSE)

There is an estimated difference in the average prices that ranges between $0.147 and $0.25 per mBTU. Henry Hub is almost surely cheaper.
Profit Forecasting by Location FOR NEXT TIME
The division that is principally entrusted with forecasting and the supply chain has calculated a series of profit forecasts in dollars for the first 52 weeks after completion of the factory in Tianjin and the factory in Henry Hub. Because the production process is one-of-a-kind, it is known that the first 52 weeks will involve planned calibration of the factory; this is accounted for in the weekly forecasts and is the same pattern across both locations. These forecasts appear in worksheet Forecast of the workbook on WISE.
- Summarize profits by location numerically and graphically. Try as best you can to capture the essence of the comparison in a single informative graphic.
The key here is capturing the relationship between the forecast periods and the forecasts themselves. There is a decided pattern. Let’s assume that we ignore that pattern. Let’s look at the boxplots.
visualize(
Forecast,
xvar = "Location",
yvar = "Forecast",
type = "box",
custom = FALSE
)

The two distributions mostly overlap though one appears to be a slight shift of the other; Henry Hub being larger. But hidden beneath that is the fact that Henry Hub has forecast values that always exceed those for Tianjin. Let’s show that.
visualize(
Forecast,
xvar = "Period",
yvar = "Forecast",
type = "line",
color = "Location",
custom = FALSE
)

result <- explore(
Forecast,
vars = "Forecast",
byvar = "Location",
fun = c(
"n_obs", "mean", "sd", "se", "min", "p25", "median", "p75",
"max"
),
nr = 2
)
summary(result)
Explore
Data : Forecast
Grouped by : Location
Functions : n_obs, mean, sd, se, min, p25, median, p75, max
Top : Function
Location variable n_obs mean sd se min p25 median p75 max
HenryHub Forecast 52 4,204,474.865 1,590,364.990 220,543.943 1,712,033 2,726,455.750 4,101,823.500 5,520,862.250 7,166,874
Tianjin Forecast 52 3,860,590.442 1,561,618.097 216,557.466 1,525,784 2,336,259.000 3,713,691.000 5,197,883.000 6,761,850
# dtab(result) %>% render()
Henry Hub has average forecast profits of 4.2 million while Tianjin has an average forecast profit level of 3.86 million. The standard deviations and standard errors of the average are similar.
- If profits in Henry Hub are normally distributed with mean and standard deviation as calculated above, what is the probability of profits between 4 million and 4.5 million?
result <- prob_norm(
mean = 4204474.865,
stdev = 1590365,
lb = 4000000,
ub = 4500000
)
summary(result)
Probability calculator
Distribution: Normal
Mean : 4204475
St. dev : 1590365
Lower bound : 4000000
Upper bound : 4500000
P(X < 4000000) = 0.449
P(X > 4000000) = 0.551
P(X < 4500000) = 0.574
P(X > 4500000) = 0.426
P(4000000 < X < 4500000) = 0.125
1 - P(4000000 < X < 4500000) = 0.875
plot(result)

Assuming a normal with exactly the sample mean and standard deviation that we estimated, we find a probability of 0.125 of being between 4 and 4.5 million dollars.
- If profits in Tianjin are normally distributed with mean and standard deviation as calculated above, what is the range of profits to be obtained with central probability 0.5 [the interquartile range]?
result <- prob_norm(
mean = 3860590.442,
stdev = 1561618.097,
plb = 0.25,
pub = 0.75
)
summary(result, type = "probs")
Probability calculator
Distribution: Normal
Mean : 3860590
St. dev : 1561618
Lower bound : 0.25
Upper bound : 0.75
P(X < 2807295.042) = 0.25
P(X > 2807295.042) = 0.75
P(X < 4913885.842) = 0.75
P(X > 4913885.842) = 0.25
P(2807295.042 < X < 4913885.842) = 0.5
1 - P(2807295.042 < X < 4913885.842) = 0.5
plot(result, type = "probs")

Assuming a normal with exactly this mean and standard deviation, the middle 50% of forecast values ranges from $2.8 million and $4.9 million per period in forecast profits.
- Provide a two-sided 90% confidence interval for average profits per week over the 52 week period in Tianjin, China.
result <- single_mean(
Forecast,
var = "TianjinForecast",
comp_value = 3000000,
conf_lev = 0.9
)
summary(result)
Single mean test
Data : Forecast
Variable : TianjinForecast
Confidence: 0.9
Null hyp. : the mean of TianjinForecast = 3000000
Alt. hyp. : the mean of TianjinForecast is not equal to 3000000
mean sd n_obs n_missing
3,860,590.442 1,561,618.097 52 52
diff se t.value p.value df 5% 95%
860590.4 216557.5 3.974 < .001 51 3497795 4223386 ***
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
plot(result, plots = "hist", custom = FALSE)

Average forecast profits range, with 90% confidence, between $3.5 million and $4.22 million per period for Tianjin.
- Provide a two-sided 90% confidence interval for average profits per week over the 52 week period in Henry Hub.
result <- single_mean(
Forecast,
var = "HenryHubForecast",
comp_value = 4,
conf_lev = 0.9
)
summary(result)
Single mean test
Data : Forecast
Variable : HenryHubForecast
Confidence: 0.9
Null hyp. : the mean of HenryHubForecast = 4
Alt. hyp. : the mean of HenryHubForecast is not equal to 4
mean sd n_obs n_missing
4,204,474.865 1,590,364.990 52 52
diff se t.value p.value df 5% 95%
4204471 220543.9 19.064 < .001 51 3835001 4573949 ***
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
plot(result, plots = "hist", custom = FALSE)

Average forecast profits range from $3.835 million to $4.574 million per period for Henry Hub. It is worth noting the substantial overlap in likely values of the average. This is at odds with the visual evidence but it also shows how much the variability of the mean can be impacted by the volatility of the forecast pattern. These two forecasts are not and cannot be treated as independent samples.
- Speculative: Provide a two-sided 95% confidence interval for the average difference in profits per week over the 52 week period..
It is an average difference; it is paired. The standard error of the difference is $13854 but the average difference is $343884. The t says there are 24.8 standard errors between the average difference and zero; there is a clear difference between the two that favors Henry Hub. Henry Hub is forecast to have $316072 to $371697 higher profits per period with 95% confidence.
result <- compare_means(
Forecast,
var1 = "Location",
var2 = "Forecast",
samples = "paired"
)
summary(result, show = TRUE)
Pairwise mean comparisons (t-test)
Data : Forecast
Variables : Location, Forecast
Samples : paired
Confidence: 0.95
Adjustment: None
Location mean n sd se me
HenryHub 4,204,474.865 52 1,590,364.990 220,543.943 442,760.441
Tianjin 3,860,590.442 52 1,561,618.097 216,557.466 434,757.255
Null hyp. Alt. hyp. diff p.value se t.value df 2.5% 97.5%
HenryHub = Tianjin HenryHub not equal to Tianjin 343884.4 < .001 13853.59 24.823 51 316072.2 371696.7 ***
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
plot(result, plots = "scatter", custom = FALSE)

- Speculative: Is either of the two locations forecast to have higher profits with at least 95% confidence? Which one?
Henry Hub.
- A bonus: If the building cost were $12 million more for the more profitable location, provide a 95% confidence interval for average recovery time of cost difference expressed in weeks.
How much do we retire of the 12 million dollar difference per week? 316072.2 to 371696.7 per week. So it takes 12 million divided by 316072.2 in the worst case and 12 million divided by 371696.7 per week in the best case yields and 32 to 38 week period to retire the difference.
Expert Assessment of Location
As management closes on a decision, word has leaked about the factory and the location decision. Boomblerg Television and BCNC have reported on the plans and industry experts now well understand the decision facing management. The Sall Tweet Kernel conducted a survey of independent samples of industry experts regarding the decision and their responses are recorded as worksheet Experts in the workbook on WISE. A Build represents a belief that the facility should be built in the given location (Tianjin/Henry Hub) while a No represents an opinion that the facility should not be built in the given location. With reference to these data, you are to answer the following questions.
- Tablulate opinions by location. What is the proportion of analysts favoring each location? Provide some visualization relevant to at least one of the following questions and explain why.
result <- cross_tabs(
Experts,
var1 = "Location",
var2 = "Build"
)
summary(result, check = c("observed", "row_perc"))
Cross-tabs
Data : Experts
Variables: Location, Build
Null hyp.: there is no association between Location and Build
Alt. hyp.: there is an association between Location and Build
Observed:
Build No Total
HenryHub 66 15 81
Tianjin 31 33 64
Total 97 48 145
Row percentages:
Build No Total
HenryHub 0.81 0.19 1
Tianjin 0.48 0.52 1
Total 0.67 0.33 1
Chi-squared: 17.628 df(1), p.value < .001
0.0 % of cells have expected values below 5
plot(result, check = c("observed", "row_perc"), custom = FALSE)

- Do analysts think the facility should be built at Henry Hub?
Yes. 81 percent do.
- How large a sample would be required, with 95% confidence, to estimate the true proportion to within 0.1 assuming, for planning purposes, that the true proportion is 0.5?
result <- sample_size(type = "proportion")
summary(result)
Sample size calculation
Calculation type : Proportion
Acceptable Error : 0.1
Proportion : 0.5
Confidence level : 0.95
Incidence rate : 1
Response rate : 1
Population correction: None
Required sample size : 97
Required contact attempts: 97
- The survey was, in both cases, sent to samples of size 100. As is clear, not everyone that was sent the survey actually responded. First, suppose that the probability of responding is 0.8. 95% of the time, we should receive XXX or more responses to this survey.
result <- prob_binom(n = 100, p = 0.8, pub = 0.05)
summary(result, type = "probs")
Probability calculator
Distribution: Binomial
n : 100
p : 0.8
Mean : 80
St. dev : 4
Lower bound :
Upper bound : 0.05 (73)
P(X = 73) = 0.022
P(X < 73) = 0.034
P(X <= 73) = 0.056
P(X > 73) = 0.944
P(X >= 73) = 0.966
plot(result, type = "probs")

- Evaluate Henry Hub’s and Tianjin’s rates of response that you see in light of the above.
We have too little data on Tianjin with a response probability of 0.8.
- Do analysts prefer either of the locations with any confidence?
result <- compare_props(
Experts,
var1 = "Location",
var2 = "Build",
levs = "Build"
)
summary(result, show = TRUE)
Pairwise proportion comparisons
Data : Experts
Variables : Location, Build
Level : Build in Build
Confidence: 0.95
Adjustment: None
Location Build No n p se me
HenryHub 66 15 81 0.815 0.043 0.085
Tianjin 31 33 64 0.484 0.062 0.122
Null hyp. Alt. hyp. diff p.value chisq.value df 2.5% 97.5%
HenryHub = Tianjin HenryHub not equal to Tianjin 0.33 < .001 17.628 1 0.182 0.479 ***
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
plot(result, plots = "bar", custom = FALSE)

Yes. The probability of Build for Henry Hub is 0.182 to 0.479 higher than it is for Tianjin. Notice in the result, we see that the probability for Henry Hub is 0.815 with a margin of error of 0.085 while Tianjin is 0.484 with a margin of error of 0.122. So Henry Hub can be no lower than 0.73 and Tianjin is, at most, 0.606. There is an obvious difference. To quantify it, we turn to the confidence interval for the difference as described above.
Weather Concerns
Both locations [Tianjin and Henry Hub] are adjacent to large bodies of water. If the probability of more than 3 hurricanes in a year exceeds 0.05 in either location, this is a game changing fact. Management is unwilling to build in a location with such a high probability of a disatrous loss of investment and possible collateral damage.
- If the arrival rate of hurricanes at Henry Hub is 1 per year (as it is known to be), what is the probability of more than 3 hurricanes in a given year at Henry Hub?
result <- prob_pois(lambda = 1, ub = 3)
summary(result)
Probability calculator
Distribution: Poisson
Lambda : 1
Mean : 1
Variance : 1
Lower bound :
Upper bound : 3
P(X = 3) = 0.061
P(X < 3) = 0.92
P(X <= 3) = 0.981
P(X > 3) = 0.019
P(X >= 3) = 0.08
plot(result)

The result is less than 0.05.
- If the arrival rate of hurricanes at Tianjin is 0.6 (as it is known 0.6o be), then what is the probability of more than 3 hurricanes in a given year at Tianjin?
result <- prob_pois(lambda = 0.6, ub = 3)
summary(result)
Probability calculator
Distribution: Poisson
Lambda : 0.6
Mean : 0.6
Variance : 0.6
Lower bound :
Upper bound : 3
P(X = 3) = 0.02
P(X < 3) = 0.977
P(X <= 3) = 0.997
P(X > 3) = 0.003
P(X >= 3) = 0.023
plot(result)

The result is less than 0.05.
Final Problem
Defend a decision to build the factory in one of the two locations and relate each previous section and your analysis of the relevant data to your chosen alternative. If necessary, weigh the value of conflicting evidence in light of the source. You are only to faithfully report the results of your analysis and are to bring no external considerations to bear beyond the information in the data and the issues raised in this investigation.
Henry Hub Every bit of data supports that decision except the fact that hurricanes are more likely. But not that much so. The payback period is less than a year and that difference should yield benefits through the life of the project that exceed 300,000 dollars per week with 95% confidence. Natural gas is cheaper fifteen to twenty five cents cheaper, on average, and the experts think it is a better idea. There is no data to oppose building at Henry Hub.
LS0tCm91dHB1dDoKICBodG1sX2RvY3VtZW50OgogICAgY29kZV9kb3dubG9hZDogeWVzCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUKICAgIGRmX3ByaW50OiBwYWdlZAogICAgaGlnaGxpZ2h0OiB0ZXh0bWF0ZQogICAgdGhlbWU6IHNwYWNlbGFiCiAgICB0b2M6IHllcwogIHdvcmRfZG9jdW1lbnQ6CiAgICB0b2M6IHllcwotLS0KCmBgYHtyIHJfc2V0dXAsIGluY2x1ZGUgPSBGQUxTRX0KIyMgaW5pdGlhbCBzZXR0aW5ncwprbml0cjo6b3B0c19jaHVuayRzZXQoCiAgY29tbWVudCA9IE5BLAogIGVjaG8gPSBUUlVFLAogIGVycm9yID0gVFJVRSwKICBjYWNoZSA9IEZBTFNFLAogIG1lc3NhZ2UgPSBGQUxTRSwKCiAgZHBpID0gMTQ0LAogIHdhcm5pbmcgPSBGQUxTRQopCgojIyB3aWR0aCB0byB1c2Ugd2hlbiBwcmludGluZyB0YWJsZXMgZXRjLgpvcHRpb25zKAogIHdpZHRoID0gMjUwLAogIHNjaXBlbiA9IDEwMCwKICBtYXgucHJpbnQgPSA1MDAwLAogIHN0cmluZ3NBc0ZhY3RvcnMgPSBGQUxTRQopCgojIyBtYWtlIGFsbCByZXF1aXJlZCBsaWJyYXJpZXMgYXZhaWxhYmxlIGJ5IGxvYWRpbmcgcmFkaWFudCBwYWNrYWdlIGlmIG5lZWRlZAppZiAoIWV4aXN0cygicl9lbnZpcm9ubWVudCIpKSBsaWJyYXJ5KHJhZGlhbnQpCgojIyBpbmNsdWRlIGNvZGUgdG8gbG9hZCB0aGUgZGF0YSB5b3UgcmVxdWlyZQojIyBmb3IgaW50ZXJhY3RpdmUgdXNlIGF0dGFjaCB0aGUgcl9kYXRhIGVudmlyb25tZW50CiMgYXR0YWNoKHJfZGF0YSkKYGBgCgo8c3R5bGU+Ci50YWJsZSB7CiAgd2lkdGg6IGF1dG87Cn0KdWwsIG9sIHsKICBwYWRkaW5nLWxlZnQ6IDE4cHg7Cn0KcHJlLCBjb2RlLCBwcmUgY29kZSB7CiAgb3ZlcmZsb3c6IGF1dG87CiAgd2hpdGUtc3BhY2U6IHByZTsKICB3b3JkLXdyYXA6IG5vcm1hbDsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmOwp9Cjwvc3R5bGU+CgoKCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpCmBgYAoKIyBBIE5hdHVyYWwgR2FzIFByb2JsZW0KCkFuc3dlciB0aGUgcXVlc3Rpb25zIHRvIHRoZSBiZXN0IG9mIHlvdXIgYWJpbGl0eSBhbmQgYmUgc3lzdGVtYXRpYyBpbiBzb2x2aW5nIHRoZSBwcm9ibGVtcy4gVGhpcyB3aWxsIGFsd2F5cyB0YWtlIHlvdSBmYXIuIEFuIEV4Y2VsIFdvcmtib29rIGNhbGxlZCAqTmF0dXJhbEdhczIwMTkueGxzKiBhbmQgYW4gaWRlbnRpY2FsIFIgZGF0YSBmaWxlICpOYXR1cmFsR2FzMjAxOS5SRGF0YSogY29udGFpbiB0aGUgbmVjZXNzYXJ5IGRhdGEuICBFYWNoIHNoZWV0IHdpbGwgY29udGFpbiBkYXRhIGluIGJvdGggc3RhY2tlZCBhbmQgdW5zdGFja2VkIGZvcm1zLiAgVW5zdGFja2VkIHBsYWNlcyB0aGUgZGF0YSBmb3IgSGVucnkgSHViIGFuZCBUaWFuamluIGluIHNlcGFyYXRlIGRhdGEgY29sdW1ucy4gIFN0YWNrZWQgZGF0YSBjb21iaW5lcyBhIHNpbmdsZSBjb2x1bW4gb2YgZGF0YSB3aXRoIGEgc2luZ2xlIGNvbHVtbiBkZXNjcmliaW5nIHdoaWNoIG9mIHRoZSB0d28gbG9jYXRpb25zIHRoZSBvYnNlcnZhdGlvbiBiZWxvbmdzIHRvLgoKYGBge3J9CmxvYWQodXJsKCJodHRwczovL2dpdGh1Yi5jb20vcm9iZXJ0d3dhbGtlci9EQURNU3R1ZmYvcmF3L21hc3Rlci9OYXR1cmFsR2FzMjAxOS5SRGF0YSIpKQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShza2ltcikKbGlicmFyeShnZ3Bsb3QyKQpgYGAKCgoxLglUaGUgY2VudHJhbCBwcm9iYWJpbGl0eSBpbiBhIHN0YW5kYXJkIG5vcm1hbCBkaXN0cmlidXRpb24gYmV0d2VlbiBYWFggYW5kIFhYWCBpcyAwLjY4MjcuCgpgYGB7cn0KcmVzdWx0IDwtIHByb2Jfbm9ybShtZWFuID0gMCwgc3RkZXYgPSAxLCBwbGIgPSAwLjE1OSwgcHViID0gMC44NDEpCnN1bW1hcnkocmVzdWx0LCB0eXBlID0gInByb2JzIikKcGxvdChyZXN1bHQsIHR5cGUgPSAicHJvYnMiKQpgYGAKCjAuNjgyNyBpcyB0aGUgZW1waXJpY2FsIHJ1bGUgcHJvYmFiaWxpdHkgYmV0d2VlbiAtMSBhbmQgMS4KCiFGaWd1cmVdKGh0dHBzOi8vZ2l0aHViLmNvbS9yb2JlcnR3d2Fsa2VyL0RBRE1TdHVmZi9yYXcvbWFzdGVyL05vcm1RMS5wbmcpCgpgYGB7cn0KcmVzdWx0IDwtIHByb2Jfbm9ybShtZWFuID0gMCwgc3RkZXYgPSAxLCBwbGIgPSAwLjEpCnN1bW1hcnkocmVzdWx0LCB0eXBlID0gInByb2JzIikKcGxvdChyZXN1bHQsIHR5cGUgPSAicHJvYnMiKQpgYGAKClRoZSBwcm9iYWJpbGl0eSBvZiBhIHN0YW5kYXJkIG5vcm1hbCBhYm92ZSAtMS4yODIgaXMgMC45LgoKMy4gRm9yIGEgbm9ybWFsIGRpc3RyaWJ1dGlvbiB3aXRoIG1lYW4gMTAgYW5kIHN0YW5kYXJkIGRldmlhdGlvbiA1LCB3aGF0IGlzIHRoZSB2YWx1ZSBvZiB0aGlzIG5vcm1hbCBzdWNoIHRoYXQgODAlIG9mIHRoZSBwcm9iYWJpbGl0eSBsaWVzIGFib3ZlIGl0PwoKYGBge3J9CnJlc3VsdCA8LSBwcm9iX25vcm0obWVhbiA9IDEwLCBzdGRldiA9IDUsIHBsYiA9IDAuMikKc3VtbWFyeShyZXN1bHQsIHR5cGUgPSAicHJvYnMiKQpwbG90KHJlc3VsdCwgdHlwZSA9ICJwcm9icyIpCmBgYAoKODAgcGVyY2VudCBvZiB0aGUgcHJvYmFiaWxpdHkgbGllcyBhYm92ZSA1Ljc5Mi4KCiMgVGhlIENhc2UKCioqQSBjaGVtaWNhbCBtYW51ZmFjdHVyZXIgd2lsbCBidWlsZCBhIG5ldyBlcG94eSBwbGFudCBpbiBvbmUgb2YgdHdvIGxvY2F0aW9ucyAtLSBvbmUgYWRqYWNlbnQgdG8gYW4gZXh0YW50IGZhY2lsaXR5IGluIFRpYW5qaW4sIENoaW5hIGFuZCBvbmUgbmVhciB0aGUgY29tcGFueSdzIGhlYWRxdWFydGVycyBpbiB0aGUgVW5pdGVkIFN0YXRlcyBuZWFyIEhlbnJ5IEh1YiBpbiBMb3Vpc2lhbmEuIFRoZSBwbGFudCBpcyBhIGZpcnN0LW9mLWl0cy1raW5kIGVudGlyZWx5IGF1dG9tYXRlZCBwbGFudCB0aGF0IGhvc3RzIG9ubHkgYSB0aW55IG51bWJlciBvZiBzdXBlcnZpc29ycyBhbmQgbGFib3IgY29zdHMgYWNyb3NzIHRoZSB0d28gbG9jYXRpb25zIGRvIG5vdCBkaWZmZXIuIFRoZSBvbmx5IGlucHV0IHRoYXQgbWlnaHQgcmVhc29uYWJseSBkaWZmZXIgaW4gY29zdCBpcyBlbmVyZ3kuIFdoZXJlIHRvIGxvY2F0ZSB0aGUgZmFjdG9yeSBhbmQgcG90ZW50aWFsIGRpZmZlcmVuY2VzIGluIHRoZSBjb3N0IG9mIGVuZXJneSB3aWxsIHBsYXkgYSBjcnVjaWFsIHJvbGUgaW4gb3VyIGRlY2lzaW9uLioqCgojIyBBbiBFbmVyZ3kgQ29zdCBDb21wYXJpc29uIAoKQW4gaW50ZXJuIGhhcyBjb2xsZWN0ZWQgdHdvIHJhbmRvbSBzYW1wbGVzIG9mIGVuZXJneSBwcmljZXMgZnJvbSBsb2NhbCBuZXdzcGFwZXJzIGZvciBjb21wYXJpc29uLiBPdmVyIHRoZSBsYXN0IHNpeCBtb250aHMsIHRoZSBpbnRlcm4gaGFzIGEgcmFuZG9tIHNhbXBsZSBvZiBzaXplIDI1IGZyb20gVGlhbmppbiBhbmQgYSByYW5kb20gc2FtcGxlIG9mIHNpemUgMzYgZnJvbSBIZW5yeSBIdWIgcmVwb3J0ZWQgaW4gKk5ld3NwYXBlcnMqIC0tIGEgc2hlZXQgaW4gdGhlIEV4Y2VsIFdvcmtib29rIG9uIFdJU0UgcmVmZXJlbmNlZCBhYm92ZS4gWW91IGFyZSB0byB1bmRlcnRha2UgYW4gaW5pdGlhbCBzdW1tYXJ5IG9mIHRoZXNlIGRhdGEuIFlvdSBzaG91bGQgbm90ZSB0aGF0IGJvdGggcHJpY2VzIGFyZSByZXBvcnRlZCBpbiBVbml0ZWQgU3RhdGVzIGRvbGxhcnMgcGVyIE1pbGxpb24gQlRVIChtaWxsaW9uIEJyaXRpc2ggdGhlcm1hbCB1bml0cykuIFRoZSBkYXRlcyB0aGF0IHRoZSBwcmljZXMgKHNwb3QpIHdlcmUgcmVjb3JkZWQgaXMgbGlzdGVkIGluIHRoZSBhZGphY2VudCBjb2x1bW4gZm9yIGVhY2ggc2VyaWVzLiBUaGUgd29ya3NoZWV0IGNvbnRhaW5zIHRoZSBkYXRhIGluIGJvdGggYSBzdGFja2VkIGFuZCBhbiB1bnN0YWNrZWQgZm9ybWF0LgoKMS4JUHJvdmlkZSBhIHNpbmdsZSBwbG90IGNvbWJpbmluZyB0aGUgdHdvIHNhbXBsZXMgb2YgZGF0YS4gV2hpY2ggb2YgdGhlIHR3byBzZXJpZXMgaXMgbW9yZSBzeW1tZXRyaWM/IFdoYXQgaW5mb3JtYXRpb24gaW4gdGhlIHBsb3QgbGVkIHlvdSB0byB0aGlzIGNob2ljZT8KCmBgYHtyfQp2aXN1YWxpemUoCiAgTmV3c3BhcGVycywgCiAgeHZhciA9ICJMb2NhdGlvbiIsIAogIHl2YXIgPSAiUHJpY2UiLCAKICB0eXBlID0gImJveCIsIAogIGN1c3RvbSA9IEZBTFNFCikKYGBgCgpgYGB7cn0KdmlzdWFsaXplKAogIE5ld3NwYXBlcnMsIAogIHh2YXIgPSAiUHJpY2UiLCAKICB0eXBlID0gImRlbnNpdHkiLCAKICBmaWxsID0gIkxvY2F0aW9uIiwgCiAgY3VzdG9tID0gRkFMU0UKKQpgYGAKCgpIZW5yeSBIdWIgaXMgYm90aCBtb3JlIHZhcmlhYmxlIGFuZCBtb3JlIHN5bW1ldHJpYy4gIFRpYW5qaW4gaGFzIGEgZnJhY3Rpb24gb2YgdGhlIHZhcmlhYmlsaXR5IGJ1dCBpcyBxdWl0ZSBza2V3ZWQuCgoyLglXaGF0IGlzIHRoZSBzYW1wbGUgbWVhbiBhbmQgc2FtcGxlIHN0YW5kYXJkIGRldmlhdGlvbiBvZiBuYXR1cmFsIGdhcyBwcmljZXMgaW4gVGlhbmppbj8gIEhlbnJ5IEh1Yj8KCmBgYHtyfQpyZXN1bHQgPC0gZXhwbG9yZSgKICBOZXdzcGFwZXJzLCAKICB2YXJzID0gIlByaWNlIiwgCiAgYnl2YXIgPSAiTG9jYXRpb24iLCAKICBmdW4gPSBjKAogICAgIm5fb2JzIiwgIm1lYW4iLCAic2QiLCAic2UiLCAibWluIiwgInAyNSIsICJtZWRpYW4iLCAicDc1IiwgCiAgICAibWF4IgogICksIAogIG5yID0gMgopCnN1bW1hcnkocmVzdWx0KQojIGR0YWIocmVzdWx0KSAlPiUgcmVuZGVyKCkKYGBgCgpUaGUgc2FtcGxlIG1lYW4gYXQgVGlhbmppbiBpcyAkMy45OTQ0IHdpdGggYSBzdGFuZGFyZCBkZXZpYXRpb24gb2YgJDAuMDUgYW5kIGEgc3RhbmRhcmQgZXJyb3Igb2YgdGhlIG1lYW4gb2YgJDAuMDEuICBUaGUgbWVhbiBwcmljZSBhdCBIZW5yeSBIdWIgaXMgJDMuNzk2IHdpdGggYSBzdGFuZGFyZCBkZXZpYXRpb24gb2YgJDAuMTQgYW5kIGFuZCBzdGFuZGFyZCBlcnJvciBvZiB0aGUgbWVhbiBwcmljZSBvZiAkMC4wMjMuCgozLglBc3N1bWUgdGhhdCB0aGUgdW5kZXJseWluZyBwb3B1bGF0aW9uIGlzIG5vcm1hbCB3aXRoIHRoZSBwb3B1bGF0aW9uIG1lYW4gYW5kIHBvcHVsYXRpb24gc3RhbmRhcmQgZGV2aWF0aW9uIGV4YWN0bHkgZXF1YWwgdG8gdGhlIHNhbXBsZSBtZWFuIGFuZCBzdGFuZGFyZCBkZXZpYXRpb24gdGhhdCB5b3UgaGF2ZSBlc3RpbWF0ZWQgZnJvbSB0aGUgc2FtcGxlIGZyb20gVGlhbmppbi4gV2hhdCBpcyB0aGUgcHJvYmFiaWxpdHkgb2YgYSBkYWlseSBwcmljZSBvZiAkNC4wMCBvciBoaWdoZXIgYXQgVGlhbmppbj8KCgpgYGB7cn0KcmVzdWx0IDwtIHByb2Jfbm9ybShtZWFuID0gMy45OTQ0LCBzdGRldiA9IDAuMDUxLCB1YiA9IDQpCnN1bW1hcnkocmVzdWx0KQpwbG90KHJlc3VsdCkKYGBgCkFzc3VtaW5nIHByaWNlcyBhdCBUaWFuamluIGFyZSBub3JtYWwgd2l0aCBtZWFuIDMuOTk0NCBhbmQgc3RhbmRhcmQgZGV2aWF0aW9uIDAuMDUxLCB0aGUgcHJvYmFiaWxpdHkgb2YgYSBkYWlseSBwcmljZSBvZiAkNC4wMCBvciBncmVhdGVyIGlzIDAuNDU2LgoKNC4JV2hhdCBpcyBhIDk1JSBjb25maWRlbmNlIGludGVydmFsIGZvciB0aGUgYXZlcmFnZSBwcmljZSBpbiBUaWFuamluIGdpdmVuIHRoaXMgcHJlY2lzZSBzYW1wbGU/IFByb3ZpZGUgYm90aCBib3VuZGFyaWVzLgoKYGBge3J9CldpdGggOTUlIGNvbmZpZGVuY2UsIHRoZSBhdmVyYWdlIHByaWNlIGF0IFRpYW5qaW4gcmFuZ2VzIGZyb20gJDMuOTcKcmVzdWx0IDwtIHNpbmdsZV9tZWFuKE5ld3NwYXBlcnMsIHZhciA9ICJUaWFuamluUHJpY2UiKQpzdW1tYXJ5KHJlc3VsdCkKcGxvdChyZXN1bHQsIHBsb3RzID0gImhpc3QiLCBjdXN0b20gPSBGQUxTRSkKYGBgCgpXaXRoIDk1JSBjb25maWRlbmNlLCB0aGUgYXZlcmFnZSBwcmljZSBhdCBUaWFuamluIHJhbmdlcyBmcm9tICQzLjk3MyB0byAkNC4wMTUgcGVyIG1CVFUuCgo1LglXaGF0IGlzIHRoZSBwcm9iYWJpbGl0eSBvZiBhIG1lYW4gcHJpY2Ugb2YgJDQuMDAgb3IgbG93ZXIgZ2l2ZW4gdGhlIFRpYW5qaW4gZGF0YT8KCmBgYHtyfQpyZXN1bHQgPC0gc2luZ2xlX21lYW4oCiAgTmV3c3BhcGVycywgCiAgdmFyID0gIlRpYW5qaW5QcmljZSIsIAogIGNvbXBfdmFsdWUgPSA0LCAKICBhbHRlcm5hdGl2ZSA9ICJncmVhdGVyIgopCnN1bW1hcnkocmVzdWx0KQpwbG90KHJlc3VsdCwgcGxvdHMgPSAiaGlzdCIsIGN1c3RvbSA9IEZBTFNFKQpgYGAKClRoZSBwcm9iYWJpbGl0eSBvZiBhIG1lYW4gcHJpY2Ugb2YgJDQuMDAgb3IgbGVzcyBpcyAwLjcwNy4gIEl0IGhhcyB0byBiZSBncmVhdGVyIHRoYW4gMC41IGJlY2F1c2UgdGhlIHNhbXBsZSBtZWFuIGlzIGxlc3MgdGhhbiAkNC4wMC4KCjYuCSpTcGVjdWxhdGl2ZTogV2hhdCBpcyBhIDk1JSBjb25maWRlbmNlIGludGVydmFsIG9mIHRoZSBkaWZmZXJlbmNlIGluIGF2ZXJhZ2UgcHJpY2VzLioKCmBgYHtyfQpyZXN1bHQgPC0gY29tcGFyZV9tZWFucygKICBOZXdzcGFwZXJzLCAKICB2YXIxID0gIkxvY2F0aW9uIiwgCiAgdmFyMiA9ICJQcmljZSIKKQpzdW1tYXJ5KHJlc3VsdCwgc2hvdyA9IFRSVUUpCnBsb3QocmVzdWx0LCBwbG90cyA9ICJzY2F0dGVyIiwgY3VzdG9tID0gRkFMU0UpCmBgYAoKVGhlcmUgaXMgYW4gZXN0aW1hdGVkIGRpZmZlcmVuY2UgaW4gdGhlIGF2ZXJhZ2UgcHJpY2VzIHRoYXQgcmFuZ2VzIGJldHdlZW4gJDAuMTQ3IGFuZCAkMC4yNSBwZXIgbUJUVS4gIEhlbnJ5IEh1YiBpcyBhbG1vc3Qgc3VyZWx5IGNoZWFwZXIuCgojIyBQcm9maXQgRm9yZWNhc3RpbmcgYnkgTG9jYXRpb24gKipGT1IgTkVYVCBUSU1FKioKClRoZSBkaXZpc2lvbiB0aGF0IGlzIHByaW5jaXBhbGx5IGVudHJ1c3RlZCB3aXRoIGZvcmVjYXN0aW5nIGFuZCB0aGUgc3VwcGx5IGNoYWluIGhhcyBjYWxjdWxhdGVkIGEgc2VyaWVzIG9mIHByb2ZpdCBmb3JlY2FzdHMgaW4gZG9sbGFycyBmb3IgdGhlIGZpcnN0IDUyIHdlZWtzIGFmdGVyIGNvbXBsZXRpb24gb2YgdGhlIGZhY3RvcnkgaW4gVGlhbmppbiBhbmQgdGhlIGZhY3RvcnkgaW4gSGVucnkgSHViLiBCZWNhdXNlIHRoZSBwcm9kdWN0aW9uIHByb2Nlc3MgaXMgb25lLW9mLWEta2luZCwgaXQgaXMga25vd24gdGhhdCB0aGUgZmlyc3QgNTIgd2Vla3Mgd2lsbCBpbnZvbHZlIHBsYW5uZWQgY2FsaWJyYXRpb24gb2YgdGhlIGZhY3Rvcnk7IHRoaXMgaXMgYWNjb3VudGVkIGZvciBpbiB0aGUgd2Vla2x5IGZvcmVjYXN0cyBhbmQgaXMgdGhlIHNhbWUgcGF0dGVybiBhY3Jvc3MgYm90aCBsb2NhdGlvbnMuIFRoZXNlIGZvcmVjYXN0cyBhcHBlYXIgaW4gd29ya3NoZWV0ICpGb3JlY2FzdCogb2YgdGhlIHdvcmtib29rIG9uIFdJU0UuCgoxLglTdW1tYXJpemUgcHJvZml0cyBieSBsb2NhdGlvbiBudW1lcmljYWxseSBhbmQgZ3JhcGhpY2FsbHkuICBUcnkgYXMgYmVzdCB5b3UgY2FuIHRvIGNhcHR1cmUgdGhlIGVzc2VuY2Ugb2YgdGhlIGNvbXBhcmlzb24gaW4gYSBzaW5nbGUgaW5mb3JtYXRpdmUgZ3JhcGhpYy4KClRoZSBrZXkgaGVyZSBpcyBjYXB0dXJpbmcgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZSBmb3JlY2FzdCBwZXJpb2RzIGFuZCB0aGUgZm9yZWNhc3RzIHRoZW1zZWx2ZXMuICBUaGVyZSBpcyBhIGRlY2lkZWQgcGF0dGVybi4gIExldCdzIGFzc3VtZSB0aGF0IHdlIGlnbm9yZSB0aGF0IHBhdHRlcm4uICBMZXQncyBsb29rIGF0IHRoZSBib3hwbG90cy4KCmBgYHtyfQp2aXN1YWxpemUoCiAgRm9yZWNhc3QsIAogIHh2YXIgPSAiTG9jYXRpb24iLCAKICB5dmFyID0gIkZvcmVjYXN0IiwgCiAgdHlwZSA9ICJib3giLCAKICBjdXN0b20gPSBGQUxTRQopCmBgYAoKVGhlIHR3byBkaXN0cmlidXRpb25zIG1vc3RseSBvdmVybGFwIHRob3VnaCBvbmUgYXBwZWFycyB0byBiZSBhIHNsaWdodCBzaGlmdCBvZiB0aGUgb3RoZXI7IEhlbnJ5IEh1YiBiZWluZyBsYXJnZXIuICBCdXQgaGlkZGVuIGJlbmVhdGggdGhhdCBpcyB0aGUgZmFjdCB0aGF0IEhlbnJ5IEh1YiBoYXMgZm9yZWNhc3QgdmFsdWVzIHRoYXQgYWx3YXlzIGV4Y2VlZCB0aG9zZSBmb3IgVGlhbmppbi4gIExldCdzIHNob3cgdGhhdC4KCmBgYHtyfQp2aXN1YWxpemUoCiAgRm9yZWNhc3QsIAogIHh2YXIgPSAiUGVyaW9kIiwgCiAgeXZhciA9ICJGb3JlY2FzdCIsIAogIHR5cGUgPSAibGluZSIsIAogIGNvbG9yID0gIkxvY2F0aW9uIiwgCiAgY3VzdG9tID0gRkFMU0UKKQpgYGAKCmBgYHtyfQpyZXN1bHQgPC0gZXhwbG9yZSgKICBGb3JlY2FzdCwgCiAgdmFycyA9ICJGb3JlY2FzdCIsIAogIGJ5dmFyID0gIkxvY2F0aW9uIiwgCiAgZnVuID0gYygKICAgICJuX29icyIsICJtZWFuIiwgInNkIiwgInNlIiwgIm1pbiIsICJwMjUiLCAibWVkaWFuIiwgInA3NSIsIAogICAgIm1heCIKICApLCAKICBuciA9IDIKKQpzdW1tYXJ5KHJlc3VsdCkKIyBkdGFiKHJlc3VsdCkgJT4lIHJlbmRlcigpCmBgYAoKSGVucnkgSHViIGhhcyBhdmVyYWdlIGZvcmVjYXN0IHByb2ZpdHMgb2YgNC4yIG1pbGxpb24gd2hpbGUgVGlhbmppbiBoYXMgYW4gYXZlcmFnZSBmb3JlY2FzdCBwcm9maXQgbGV2ZWwgb2YgMy44NiBtaWxsaW9uLiAgVGhlIHN0YW5kYXJkIGRldmlhdGlvbnMgYW5kIHN0YW5kYXJkIGVycm9ycyBvZiB0aGUgYXZlcmFnZSBhcmUgc2ltaWxhci4KCjIuCUlmIHByb2ZpdHMgaW4gSGVucnkgSHViIGFyZSBub3JtYWxseSBkaXN0cmlidXRlZCB3aXRoIG1lYW4gYW5kIHN0YW5kYXJkIGRldmlhdGlvbiBhcyBjYWxjdWxhdGVkIGFib3ZlLCB3aGF0IGlzIHRoZSBwcm9iYWJpbGl0eSBvZiBwcm9maXRzIGJldHdlZW4gNCBtaWxsaW9uIGFuZCA0LjUgbWlsbGlvbj8KCmBgYHtyfQpyZXN1bHQgPC0gcHJvYl9ub3JtKAogIG1lYW4gPSA0MjA0NDc0Ljg2NSwgCiAgc3RkZXYgPSAxNTkwMzY1LCAKICBsYiA9IDQwMDAwMDAsIAogIHViID0gNDUwMDAwMAopCnN1bW1hcnkocmVzdWx0KQpwbG90KHJlc3VsdCkKYGBgCgpBc3N1bWluZyBhIG5vcm1hbCB3aXRoIGV4YWN0bHkgdGhlIHNhbXBsZSBtZWFuIGFuZCBzdGFuZGFyZCBkZXZpYXRpb24gdGhhdCB3ZSBlc3RpbWF0ZWQsIHdlIGZpbmQgYSBwcm9iYWJpbGl0eSBvZiAwLjEyNSBvZiBiZWluZyBiZXR3ZWVuIDQgYW5kIDQuNSBtaWxsaW9uIGRvbGxhcnMuCgozLglJZiBwcm9maXRzIGluIFRpYW5qaW4gYXJlIG5vcm1hbGx5IGRpc3RyaWJ1dGVkIHdpdGggbWVhbiBhbmQgc3RhbmRhcmQgZGV2aWF0aW9uIGFzIGNhbGN1bGF0ZWQgYWJvdmUsIHdoYXQgaXMgdGhlIHJhbmdlIG9mIHByb2ZpdHMgdG8gYmUgb2J0YWluZWQgd2l0aCBjZW50cmFsIHByb2JhYmlsaXR5IDAuNSBbdGhlIGludGVycXVhcnRpbGUgcmFuZ2VdPwoKYGBge3J9CnJlc3VsdCA8LSBwcm9iX25vcm0oCiAgbWVhbiA9IDM4NjA1OTAuNDQyLCAKICBzdGRldiA9IDE1NjE2MTguMDk3LCAKICBwbGIgPSAwLjI1LCAKICBwdWIgPSAwLjc1CikKc3VtbWFyeShyZXN1bHQsIHR5cGUgPSAicHJvYnMiKQpwbG90KHJlc3VsdCwgdHlwZSA9ICJwcm9icyIpCmBgYAoKQXNzdW1pbmcgYSBub3JtYWwgd2l0aCBleGFjdGx5IHRoaXMgbWVhbiBhbmQgc3RhbmRhcmQgZGV2aWF0aW9uLCB0aGUgbWlkZGxlIDUwJSBvZiBmb3JlY2FzdCB2YWx1ZXMgcmFuZ2VzIGZyb20gJDIuOCBtaWxsaW9uIGFuZCAkNC45IG1pbGxpb24gcGVyIHBlcmlvZCBpbiBmb3JlY2FzdCBwcm9maXRzLgoKNC4JUHJvdmlkZSBhIHR3by1zaWRlZCA5MCUgY29uZmlkZW5jZSBpbnRlcnZhbCBmb3IgYXZlcmFnZSBwcm9maXRzIHBlciB3ZWVrIG92ZXIgdGhlIDUyIHdlZWsgcGVyaW9kIGluIFRpYW5qaW4sIENoaW5hLgoKYGBge3IgZmlnLndpZHRoID0gNywgZmlnLmhlaWdodCA9IDQuMzEsIGRwaSA9IDE0NH0KcmVzdWx0IDwtIHNpbmdsZV9tZWFuKAogIEZvcmVjYXN0LCAKICB2YXIgPSAiVGlhbmppbkZvcmVjYXN0IiwgCiAgY29tcF92YWx1ZSA9IDMwMDAwMDAsIAogIGNvbmZfbGV2ID0gMC45CikKc3VtbWFyeShyZXN1bHQpCnBsb3QocmVzdWx0LCBwbG90cyA9ICJoaXN0IiwgY3VzdG9tID0gRkFMU0UpCmBgYAoKQXZlcmFnZSBmb3JlY2FzdCBwcm9maXRzIHJhbmdlLCB3aXRoIDkwJSBjb25maWRlbmNlLCBiZXR3ZWVuICQzLjUgbWlsbGlvbiBhbmQgJDQuMjIgbWlsbGlvbiBwZXIgcGVyaW9kIGZvciBUaWFuamluLgoKNS4JUHJvdmlkZSBhIHR3by1zaWRlZCA5MCUgY29uZmlkZW5jZSBpbnRlcnZhbCBmb3IgYXZlcmFnZSBwcm9maXRzIHBlciB3ZWVrIG92ZXIgdGhlIDUyIHdlZWsgcGVyaW9kIGluIEhlbnJ5IEh1Yi4KCmBgYHtyIGZpZy53aWR0aCA9IDcsIGZpZy5oZWlnaHQgPSA0LjMxLCBkcGkgPSAxNDR9CnJlc3VsdCA8LSBzaW5nbGVfbWVhbigKICBGb3JlY2FzdCwgCiAgdmFyID0gIkhlbnJ5SHViRm9yZWNhc3QiLCAKICBjb21wX3ZhbHVlID0gNCwgCiAgY29uZl9sZXYgPSAwLjkKKQpzdW1tYXJ5KHJlc3VsdCkKcGxvdChyZXN1bHQsIHBsb3RzID0gImhpc3QiLCBjdXN0b20gPSBGQUxTRSkKYGBgCgpBdmVyYWdlIGZvcmVjYXN0IHByb2ZpdHMgcmFuZ2UgZnJvbSAkMy44MzUgbWlsbGlvbiB0byAkNC41NzQgbWlsbGlvbiBwZXIgcGVyaW9kIGZvciBIZW5yeSBIdWIuICBJdCBpcyB3b3J0aCBub3RpbmcgdGhlIHN1YnN0YW50aWFsIG92ZXJsYXAgaW4gbGlrZWx5IHZhbHVlcyBvZiB0aGUgYXZlcmFnZS4gIFRoaXMgaXMgYXQgb2RkcyB3aXRoIHRoZSB2aXN1YWwgZXZpZGVuY2UgYnV0IGl0IGFsc28gc2hvd3MgaG93IG11Y2ggdGhlIHZhcmlhYmlsaXR5IG9mIHRoZSBtZWFuIGNhbiBiZSBpbXBhY3RlZCBieSB0aGUgdm9sYXRpbGl0eSBvZiB0aGUgZm9yZWNhc3QgcGF0dGVybi4gIFRoZXNlIHR3byBmb3JlY2FzdHMgYXJlIG5vdCBhbmQgY2Fubm90IGJlIHRyZWF0ZWQgYXMgaW5kZXBlbmRlbnQgc2FtcGxlcy4KCgo2LgkqU3BlY3VsYXRpdmU6IFByb3ZpZGUgYSB0d28tc2lkZWQgOTUlIGNvbmZpZGVuY2UgaW50ZXJ2YWwgZm9yIHRoZSBhdmVyYWdlIGRpZmZlcmVuY2UgaW4gcHJvZml0cyBwZXIgd2VlayBvdmVyIHRoZSA1MiB3ZWVrIHBlcmlvZC4uKgoJCkl0IGlzIGFuIGF2ZXJhZ2UgZGlmZmVyZW5jZTsgaXQgaXMgcGFpcmVkLiAgVGhlIHN0YW5kYXJkIGVycm9yIG9mIHRoZSBkaWZmZXJlbmNlIGlzICQxMzg1NCBidXQgdGhlIGF2ZXJhZ2UgZGlmZmVyZW5jZSBpcyAkMzQzODg0LiAgVGhlIHQgc2F5cyB0aGVyZSBhcmUgIDI0Ljggc3RhbmRhcmQgZXJyb3JzIGJldHdlZW4gdGhlIGF2ZXJhZ2UgZGlmZmVyZW5jZSBhbmQgemVybzsgdGhlcmUgaXMgYSBjbGVhciBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHR3byB0aGF0IGZhdm9ycyBIZW5yeSBIdWIuICBIZW5yeSBIdWIgaXMgZm9yZWNhc3QgdG8gaGF2ZSAkMzE2MDcyIHRvICQzNzE2OTcgaGlnaGVyIHByb2ZpdHMgcGVyIHBlcmlvZCB3aXRoIDk1JSBjb25maWRlbmNlLiAKCgpgYGB7cn0KcmVzdWx0IDwtIGNvbXBhcmVfbWVhbnMoCiAgRm9yZWNhc3QsIAogIHZhcjEgPSAiTG9jYXRpb24iLCAKICB2YXIyID0gIkZvcmVjYXN0IiwgCiAgc2FtcGxlcyA9ICJwYWlyZWQiCikKc3VtbWFyeShyZXN1bHQsIHNob3cgPSBUUlVFKQpwbG90KHJlc3VsdCwgcGxvdHMgPSAic2NhdHRlciIsIGN1c3RvbSA9IEZBTFNFKQpgYGAKCgo3LgkqU3BlY3VsYXRpdmU6IElzIGVpdGhlciBvZiB0aGUgdHdvIGxvY2F0aW9ucyBmb3JlY2FzdCB0byBoYXZlIGhpZ2hlciBwcm9maXRzIHdpdGggYXQgbGVhc3QgOTUlIGNvbmZpZGVuY2U/IFdoaWNoIG9uZT8qCgpIZW5yeSBIdWIuCgo4LgkqKkEgYm9udXM6IElmIHRoZSBidWlsZGluZyBjb3N0IHdlcmUgJDEyIG1pbGxpb24gbW9yZSBmb3IgdGhlIG1vcmUgcHJvZml0YWJsZSBsb2NhdGlvbiwgcHJvdmlkZSBhIDk1JSBjb25maWRlbmNlIGludGVydmFsIGZvciBhdmVyYWdlIHJlY292ZXJ5IHRpbWUgb2YgY29zdCBkaWZmZXJlbmNlIGV4cHJlc3NlZCBpbiB3ZWVrcy4qKgoKSG93IG11Y2ggZG8gd2UgcmV0aXJlIG9mIHRoZSAxMiBtaWxsaW9uIGRvbGxhciBkaWZmZXJlbmNlIHBlciB3ZWVrPyAgMzE2MDcyLjIgdG8gMzcxNjk2LjcgcGVyIHdlZWsuICBTbyBpdCB0YWtlcyAxMiBtaWxsaW9uIGRpdmlkZWQgYnkgMzE2MDcyLjIgaW4gdGhlIHdvcnN0IGNhc2UgYW5kIDEyIG1pbGxpb24gZGl2aWRlZCBieSAzNzE2OTYuNyBwZXIgd2VlayBpbiB0aGUgYmVzdCBjYXNlIHlpZWxkcyBhbmQgMzIgdG8gMzggd2VlayBwZXJpb2QgdG8gcmV0aXJlIHRoZSBkaWZmZXJlbmNlLgoKIyMgRXhwZXJ0IEFzc2Vzc21lbnQgb2YgTG9jYXRpb24KCkFzIG1hbmFnZW1lbnQgY2xvc2VzIG9uIGEgZGVjaXNpb24sIHdvcmQgaGFzIGxlYWtlZCBhYm91dCB0aGUgZmFjdG9yeSBhbmQgdGhlIGxvY2F0aW9uIGRlY2lzaW9uLiBCb29tYmxlcmcgVGVsZXZpc2lvbiBhbmQgQkNOQyBoYXZlIHJlcG9ydGVkIG9uIHRoZSBwbGFucyBhbmQgaW5kdXN0cnkgZXhwZXJ0cyBub3cgd2VsbCB1bmRlcnN0YW5kIHRoZSBkZWNpc2lvbiBmYWNpbmcgbWFuYWdlbWVudC4gVGhlIFNhbGwgVHdlZXQgS2VybmVsIGNvbmR1Y3RlZCBhIHN1cnZleSBvZiBpbmRlcGVuZGVudCBzYW1wbGVzIG9mIGluZHVzdHJ5IGV4cGVydHMgcmVnYXJkaW5nIHRoZSBkZWNpc2lvbiBhbmQgdGhlaXIgcmVzcG9uc2VzIGFyZSByZWNvcmRlZCBhcyB3b3Jrc2hlZXQgKkV4cGVydHMqIGluIHRoZSB3b3JrYm9vayBvbiBXSVNFLiBBIEJ1aWxkIHJlcHJlc2VudHMgYSBiZWxpZWYgdGhhdCB0aGUgZmFjaWxpdHkgc2hvdWxkIGJlIGJ1aWx0IGluIHRoZSBnaXZlbiBsb2NhdGlvbiAoVGlhbmppbi9IZW5yeSBIdWIpIHdoaWxlIGEgTm8gcmVwcmVzZW50cyBhbiBvcGluaW9uIHRoYXQgdGhlIGZhY2lsaXR5IHNob3VsZCBub3QgYmUgYnVpbHQgaW4gdGhlIGdpdmVuIGxvY2F0aW9uLiBXaXRoIHJlZmVyZW5jZSB0byB0aGVzZSBkYXRhLCB5b3UgYXJlIHRvIGFuc3dlciB0aGUgZm9sbG93aW5nIHF1ZXN0aW9ucy4KCjEuCVRhYmx1bGF0ZSBvcGluaW9ucyBieSBsb2NhdGlvbi4gV2hhdCBpcyB0aGUgcHJvcG9ydGlvbiBvZiBhbmFseXN0cyBmYXZvcmluZyBlYWNoIGxvY2F0aW9uPyAgUHJvdmlkZSBzb21lIHZpc3VhbGl6YXRpb24gcmVsZXZhbnQgdG8gYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgcXVlc3Rpb25zIGFuZCBleHBsYWluIHdoeS4KCgoKYGBge3IgZmlnLndpZHRoID0gNywgZmlnLmhlaWdodCA9IDguNjIsIGRwaSA9IDE0NH0KcmVzdWx0IDwtIGNyb3NzX3RhYnMoCiAgRXhwZXJ0cywgCiAgdmFyMSA9ICJMb2NhdGlvbiIsIAogIHZhcjIgPSAiQnVpbGQiCikKc3VtbWFyeShyZXN1bHQsIGNoZWNrID0gYygib2JzZXJ2ZWQiLCAicm93X3BlcmMiKSkKcGxvdChyZXN1bHQsIGNoZWNrID0gYygib2JzZXJ2ZWQiLCAicm93X3BlcmMiKSwgY3VzdG9tID0gRkFMU0UpCmBgYAoJCgoyLglEbyBhbmFseXN0cyB0aGluayB0aGUgZmFjaWxpdHkgc2hvdWxkIGJlIGJ1aWx0IGF0IEhlbnJ5IEh1Yj8KClllcy4gIDgxIHBlcmNlbnQgZG8uCgozLglIb3cgbGFyZ2UgYSBzYW1wbGUgd291bGQgYmUgcmVxdWlyZWQsIHdpdGggOTUlIGNvbmZpZGVuY2UsIHRvIGVzdGltYXRlIHRoZSB0cnVlIHByb3BvcnRpb24gdG8gd2l0aGluIDAuMSBhc3N1bWluZywgZm9yIHBsYW5uaW5nIHB1cnBvc2VzLCB0aGF0IHRoZSB0cnVlIHByb3BvcnRpb24gaXMgMC41PwoKYGBge3J9CnJlc3VsdCA8LSBzYW1wbGVfc2l6ZSh0eXBlID0gInByb3BvcnRpb24iKQpzdW1tYXJ5KHJlc3VsdCkKYGBgCgoKNC4gVGhlIHN1cnZleSB3YXMsIGluIGJvdGggY2FzZXMsIHNlbnQgdG8gc2FtcGxlcyBvZiBzaXplIDEwMC4gQXMgaXMgY2xlYXIsIG5vdCBldmVyeW9uZSB0aGF0IHdhcyBzZW50IHRoZSBzdXJ2ZXkgYWN0dWFsbHkgcmVzcG9uZGVkLiAgRmlyc3QsIHN1cHBvc2UgdGhhdCB0aGUgcHJvYmFiaWxpdHkgb2YgcmVzcG9uZGluZyBpcyAwLjguICA5NSUgb2YgdGhlIHRpbWUsIHdlIHNob3VsZCByZWNlaXZlIFhYWCBvciBtb3JlIHJlc3BvbnNlcyB0byB0aGlzIHN1cnZleS4gCgpgYGB7cn0KcmVzdWx0IDwtIHByb2JfYmlub20obiA9IDEwMCwgcCA9IDAuOCwgcHViID0gMC4wNSkKc3VtbWFyeShyZXN1bHQsIHR5cGUgPSAicHJvYnMiKQpwbG90KHJlc3VsdCwgdHlwZSA9ICJwcm9icyIpCmBgYAoKCjUuCUV2YWx1YXRlIEhlbnJ5IEh1YidzIGFuZCBUaWFuamluJ3MgcmF0ZXMgb2YgcmVzcG9uc2UgdGhhdCB5b3Ugc2VlIGluIGxpZ2h0IG9mIHRoZSBhYm92ZS4KCldlIGhhdmUgdG9vIGxpdHRsZSBkYXRhIG9uIFRpYW5qaW4gd2l0aCBhIHJlc3BvbnNlIHByb2JhYmlsaXR5IG9mIDAuOC4KCjYuCSpEbyBhbmFseXN0cyBwcmVmZXIgZWl0aGVyIG9mIHRoZSBsb2NhdGlvbnMgd2l0aCBhbnkgY29uZmlkZW5jZT8qCgpgYGB7ciBmaWcud2lkdGggPSA3LCBmaWcuaGVpZ2h0ID0gNC4zMSwgZHBpID0gMTQ0fQpyZXN1bHQgPC0gY29tcGFyZV9wcm9wcygKICBFeHBlcnRzLCAKICB2YXIxID0gIkxvY2F0aW9uIiwgCiAgdmFyMiA9ICJCdWlsZCIsIAogIGxldnMgPSAiQnVpbGQiCikKc3VtbWFyeShyZXN1bHQsIHNob3cgPSBUUlVFKQpwbG90KHJlc3VsdCwgcGxvdHMgPSAiYmFyIiwgY3VzdG9tID0gRkFMU0UpCmBgYAoKWWVzLiAgVGhlIHByb2JhYmlsaXR5IG9mIEJ1aWxkIGZvciBIZW5yeSBIdWIgaXMgMC4xODIgdG8gMC40NzkgaGlnaGVyIHRoYW4gaXQgaXMgZm9yIFRpYW5qaW4uICBOb3RpY2UgaW4gdGhlIHJlc3VsdCwgd2Ugc2VlIHRoYXQgdGhlIHByb2JhYmlsaXR5IGZvciBIZW5yeSBIdWIgaXMgMC44MTUgd2l0aCBhIG1hcmdpbiBvZiBlcnJvciBvZiAwLjA4NSB3aGlsZSBUaWFuamluIGlzIDAuNDg0IHdpdGggYSBtYXJnaW4gb2YgZXJyb3Igb2YgMC4xMjIuICBTbyBIZW5yeSBIdWIgY2FuIGJlIG5vIGxvd2VyIHRoYW4gMC43MyBhbmQgVGlhbmppbiBpcywgYXQgbW9zdCwgMC42MDYuICBUaGVyZSBpcyBhbiBvYnZpb3VzIGRpZmZlcmVuY2UuICBUbyBxdWFudGlmeSBpdCwgd2UgdHVybiB0byB0aGUgY29uZmlkZW5jZSBpbnRlcnZhbCBmb3IgdGhlIGRpZmZlcmVuY2UgYXMgZGVzY3JpYmVkIGFib3ZlLgoKIyMgV2VhdGhlciBDb25jZXJucwoKQm90aCBsb2NhdGlvbnMgW1RpYW5qaW4gYW5kIEhlbnJ5IEh1Yl0gYXJlIGFkamFjZW50IHRvIGxhcmdlIGJvZGllcyBvZiB3YXRlci4gKipJZiB0aGUgcHJvYmFiaWxpdHkgb2YgbW9yZSB0aGFuIDMgaHVycmljYW5lcyBpbiBhIHllYXIgZXhjZWVkcyAwLjA1IGluIGVpdGhlciBsb2NhdGlvbiwgdGhpcyBpcyBhIGdhbWUgY2hhbmdpbmcgZmFjdC4gTWFuYWdlbWVudCBpcyB1bndpbGxpbmcgdG8gYnVpbGQgaW4gYSBsb2NhdGlvbiB3aXRoIHN1Y2ggYSBoaWdoIHByb2JhYmlsaXR5IG9mIGEgZGlzYXRyb3VzIGxvc3Mgb2YgaW52ZXN0bWVudCBhbmQgcG9zc2libGUgY29sbGF0ZXJhbCBkYW1hZ2UuKioKCjEuCUlmIHRoZSBhcnJpdmFsIHJhdGUgb2YgaHVycmljYW5lcyBhdCBIZW5yeSBIdWIgaXMgMSBwZXIgeWVhciAoYXMgaXQgaXMga25vd24gdG8gYmUpLCB3aGF0IGlzIHRoZSBwcm9iYWJpbGl0eSBvZiBtb3JlIHRoYW4gMyBodXJyaWNhbmVzIGluIGEgZ2l2ZW4geWVhciBhdCBIZW5yeSBIdWI/CgoKYGBge3IgZmlnLndpZHRoID0gNywgZmlnLmhlaWdodCA9IDQuMzEsIGRwaSA9IDE0NH0KcmVzdWx0IDwtIHByb2JfcG9pcyhsYW1iZGEgPSAxLCB1YiA9IDMpCnN1bW1hcnkocmVzdWx0KQpwbG90KHJlc3VsdCkKYGBgCgpUaGUgcmVzdWx0IGlzIGxlc3MgdGhhbiAwLjA1LgoKMi4JSWYgdGhlIGFycml2YWwgcmF0ZSBvZiBodXJyaWNhbmVzIGF0IFRpYW5qaW4gaXMgMC42IChhcyBpdCBpcyBrbm93biAwLjZvIGJlKSwgdGhlbiB3aGF0IGlzIHRoZSBwcm9iYWJpbGl0eSBvZiBtb3JlIHRoYW4gMyBodXJyaWNhbmVzIGluIGEgZ2l2ZW4geWVhciBhdCBUaWFuamluPwoKCmBgYHtyIGZpZy53aWR0aCA9IDcsIGZpZy5oZWlnaHQgPSA0LjMxLCBkcGkgPSAxNDR9CnJlc3VsdCA8LSBwcm9iX3BvaXMobGFtYmRhID0gMC42LCB1YiA9IDMpCnN1bW1hcnkocmVzdWx0KQpwbG90KHJlc3VsdCkKYGBgCgpUaGUgcmVzdWx0IGlzIGxlc3MgdGhhbiAwLjA1LgoKCiMjIEZpbmFsIFByb2JsZW0KCkRlZmVuZCBhIGRlY2lzaW9uIHRvIGJ1aWxkIHRoZSBmYWN0b3J5IGluIG9uZSBvZiB0aGUgdHdvIGxvY2F0aW9ucyBhbmQgcmVsYXRlIGVhY2ggcHJldmlvdXMgc2VjdGlvbiBhbmQgeW91ciBhbmFseXNpcyBvZiB0aGUgcmVsZXZhbnQgZGF0YSB0byB5b3VyIGNob3NlbiBhbHRlcm5hdGl2ZS4gSWYgbmVjZXNzYXJ5LCB3ZWlnaCB0aGUgdmFsdWUgb2YgY29uZmxpY3RpbmcgZXZpZGVuY2UgaW4gbGlnaHQgb2YgdGhlIHNvdXJjZS4gWW91IGFyZSBvbmx5IHRvIGZhaXRoZnVsbHkgcmVwb3J0IHRoZSByZXN1bHRzIG9mIHlvdXIgYW5hbHlzaXMgYW5kIGFyZSB0byBicmluZyBubyBleHRlcm5hbCBjb25zaWRlcmF0aW9ucyB0byBiZWFyIGJleW9uZCB0aGUgaW5mb3JtYXRpb24gaW4gdGhlIGRhdGEgYW5kIHRoZSBpc3N1ZXMgcmFpc2VkIGluIHRoaXMgaW52ZXN0aWdhdGlvbi4KCgoqKkhlbnJ5IEh1YioqIEV2ZXJ5IGJpdCBvZiBkYXRhIHN1cHBvcnRzIHRoYXQgZGVjaXNpb24gZXhjZXB0IHRoZSBmYWN0IHRoYXQgaHVycmljYW5lcyBhcmUgbW9yZSBsaWtlbHkuIEJ1dCBub3QgdGhhdCBtdWNoIHNvLiBUaGUgcGF5YmFjayBwZXJpb2QgaXMgbGVzcyB0aGFuIGEgeWVhciBhbmQgdGhhdCBkaWZmZXJlbmNlIHNob3VsZCB5aWVsZCBiZW5lZml0cyB0aHJvdWdoIHRoZSBsaWZlIG9mIHRoZSBwcm9qZWN0IHRoYXQgZXhjZWVkIDMwMCwwMDAgZG9sbGFycyBwZXIgd2VlayB3aXRoIDk1JSBjb25maWRlbmNlLiBOYXR1cmFsIGdhcyBpcyBjaGVhcGVyIGZpZnRlZW4gdG8gdHdlbnR5IGZpdmUgY2VudHMgY2hlYXBlciwgb24gYXZlcmFnZSwgYW5kIHRoZSBleHBlcnRzIHRoaW5rIGl0IGlzIGEgYmV0dGVyIGlkZWEuIFRoZXJlIGlzIG5vIGRhdGEgdG8gb3Bwb3NlIGJ1aWxkaW5nIGF0IEhlbnJ5IEh1Yi4KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg==