Carol Dupino Pereira
NIM: 52250051
Mahasiswa Sains Data ITSB
R Programming
Data Science
Statistics
Case Study 1
Confidence Interval for Mean, \(\sigma\) Known: An
e-commerce platform wants to estimate the
average number of daily transactions per user after
launching a new feature. Based on large-scale historical data, the
population standard deviation is known.
\[
\begin{eqnarray*}
\sigma &=& 3.2 \quad \text{(population standard deviation)} \\
n &=& 100 \quad \text{(sample size)} \\
\bar{x} &=& 12.6 \quad \text{(sample mean)}
\end{eqnarray*}
\]
Tasks
- Identify the appropriate statistical test and
justify your choice.
- Compute the Confidence Intervals for:
- \(90\%\)
- \(95\%\)
- \(99\%\)
- Create a comparison visualization of the three
confidence intervals.
- Interpret the results in a business analytics context.
Appropriate
Statistical Test and Justification
The appropriate statistical test for constructing the confidence
interval for the population mean (\(\mu\)) is the Z-Interval for the Population
Mean.
Justification:
Population Standard Deviation (\(\sigma\)) is Known: This is the primary
condition that dictates the use of the Z-distribution (Standard Normal
Distribution) over the \(t\)-distribution.
Large Sample Size (\(n\)): With
a sample size of \(n=100\) (which is
\(\ge 30\)), the Central Limit Theorem
ensures that the sampling distribution of the sample mean (\(\bar{x}\)) is approximately normal, even if
the underlying population distribution is not perfectly normal. This
further validates the use of the Z-statistic.
The formula used is: \[
\text{Confidence Interval} = \bar{x} \pm Z_{\alpha/2} \left(
\frac{\sigma}{\sqrt{n}} \right)
\]
Confidence Interval
Computations
Given Parameters: \[\begin{eqnarray*}
\sigma &=& 3.2 \\
n &=& 100 \\
\bar{x} &=& 12.6
\end{eqnarray*}\]
Standard Error (SE): \[\begin{eqnarray*}\text{SE} =
\frac{\sigma}{\sqrt{n}} = \frac{3.2}{\sqrt{100}} = \frac{3.2}{10} = 0.32
\end{eqnarray*}\]
The computed confidence intervals are summarized in the table
below:
Two-Sided Confidence Interval Menggunakan Zα/2
| 90% |
1.645 |
0.526 |
12.074 |
13.126 |
| 95% |
1.960 |
0.627 |
11.973 |
13.227 |
| 99% |
2.576 |
0.824 |
11.776 |
13.424 |
Comparison
Visualization
The plot below visually compares the three confidence intervals,
demonstrating how the interval width increases as the confidence level
increases.
Interpretation in a
Business Analytics Context
The confidence intervals provide a range of plausible values for the
true average number of daily transactions per user (μ) after the new
feature launch.
- 90% Confidence Interval (12.074,13.126):
- We are 90% confident that the true average number of daily
transactions per user is between 12.074 and 13.126. This is the most
precise (narrowest) estimate.
- 95% Confidence Interval (11.973,13.227):
- This is the standard interval used in most scientific and business
contexts. We are 95% confident that the true average is between 11.973
and 13.227. The margin of error is 0.627 transactions.
- 99% Confidence Interval (11.776,13.424):
- This is the most reliable (highest confidence) estimate. We are 99%
confident that the true average is between 11.776 and 13.424.
Business Insight: The key takeaway is the trade-off between
Confidence and Precision:
To be more confident (e.g., 99% confidence), the e-commerce
platform must accept a wider interval (lower precision). This means the
true average could be as low as 11.776 or as high as 13.424.
To have a more precise estimate (e.g., 90% confidence), the
platform must accept a lower confidence level.
Since all intervals are entirely above 11.776 transactions, the
platform can be highly confident that the new feature has resulted in an
average transaction rate per user that is significantly higher than, for
instance, 11.0 (if that were a benchmark). The 95% CI is a good balance,
suggesting the new feature has likely resulted in an average between
approximately 12.0 and 13.2 daily transactions per user.
Case Study 2
Confidence Interval for Mean, \(\sigma\) Unknown: A UX
Research team analyzes task completion time (in
minutes) for a new mobile application. The data are collected
from 12 users:
\[
8.4,\; 7.9,\; 9.1,\; 8.7,\; 8.2,\; 9.0,\;
7.8,\; 8.5,\; 8.9,\; 8.1,\; 8.6,\; 8.3
\]
Tasks:
- Identify the appropriate statistical test and
explain why.
- Compute the Confidence Intervals for:
- \(90\%\)
- \(95\%\)
- \(99\%\)
- Visualize the three intervals on a single plot.
- Explain how sample size and confidence level
influence the interval width.
Identify the
appropriate statistical test and explain why.
Appropriate Statistical Test: Confidence Interval for the Mean using
the \(t\)-distribution (often referred
to as a \(t\)-interval).
Explanation:The \(t\)-distribution
is the appropriate choice for constructing the confidence interval for
the population mean (\(\mu\)) for two
primary reasons:
Population Standard Deviation is Unknown (\(\sigma\) unknown): When \(\sigma\) is unknown, we must use the sample
standard deviation (\(s\)) as an
estimate.
Small Sample Size (\(n <
30\)): The sample size is \(n=12\). For small samples with an unknown
population standard deviation, the \(t\)-distribution provides a more accurate
model of the sampling distribution of the mean than the standard normal
(\(z\)) distribution.
The formula for the confidence interval for the mean is: \[
\bar{x} \pm t_{\alpha/2, n-1} \cdot \frac{s}{\sqrt{n}}
\]
where \(t_{\alpha/2, n-1}\) is the
critical \(t\)-value with \(n-1\) degrees of freedom.
Compute the
Confidence Intervals
Sample Statistics
-
Sample Size (n): 12
-
Degrees of Freedom (df): 11
-
Sample Mean (x̄): 8.4500 minutes
-
Sample Standard Deviation (s): 0.4079 minutes
-
Standard Error (s / √n): 0.1179 minutes
The computed confidence intervals for the population mean task
completion time (\(\mu\)) are:
Confidence Interval Waktu (dalam Menit)
| 90% |
8.2435 |
8.6565 |
| 95% |
8.1912 |
8.7088 |
| 99% |
8.0772 |
8.8228 |
Note: The critical
t-values used in
the calculation were:
-
t0.05, 11 (90% CI): 1.7959
-
t0.025, 11 (95% CI): 2.2010
-
t0.005, 11 (99% CI): 3.1058
Visualize the three
intervals on a single plot.
The three confidence intervals are visualized below. The red dot
represents the sample mean (\(\bar{x} =
8.45\) minutes), and the horizontal lines represent the interval
for each confidence level.The plot shows the three confidence
intervals:
Factors Influencing
Interval Width
The width of a confidence interval is determined by the Margin of
Error (\(ME = t^ \cdot
\frac{s}{\sqrt{n}}\)).
As the confidence level increases (e.g., from 90% to 99%), the
interval becomes wider.
Logic: To be more certain that the interval contains the true
population mean, we must encompass a larger range of possible values.
This is reflected in a larger critical value (\(t^*\)).
Effect: As the sample size increases, the interval becomes narrower
(more precise).
Logic: Increasing \(n\) reduces the
Standard Error (\(\frac{s}{\sqrt{n}}\)). With more data, our
estimate of the mean becomes more stable and reliable, allowing for a
tighter range of estimation.
Case Study 3
Confidence Interval for a Proportion, A/B Testing: A
data science team runs an A/B test on a new
Call-To-Action (CTA) button design. The experiment yields:
\[
\begin{eqnarray*}
n &=& 400 \quad \text{(total users)} \\
x &=& 156 \quad \text{(users who clicked the CTA)}
\end{eqnarray*}
\]
Tasks:
- Compute the sample proportion \(\hat{p}\).
- Compute Confidence Intervals for the proportion at:
- \(90\%\)
- \(95\%\)
- \(99\%\)
- Visualize and compare the three intervals.
- Explain how confidence level affects decision-making in product
experiments.
The given data is: \[
\begin{eqnarray*}
n &=& 400 \quad \text{(total users)} \\
x &=& 156 \quad \text{(users who clicked the CTA)}
\end{eqnarray*}
\]
Compute the Sample
Proportion (\(\hat{p}\))
The sample proportion \(\hat{p}\) is
the point estimate for the true population proportion.
\[
\hat{p} = \frac{x}{n} = \frac{156}{400} = 0.3900
\]
The sample proportion of users who clicked the new CTA design is
\(39.00\%\).
Compute Confidence
Intervals
The confidence intervals (CIs) are calculated using the formula:
\[
\text{CI} = \hat{p} \pm Z_{\alpha/2} \cdot \sqrt{\frac{\hat{p}(1 -
\hat{p})}{n}}
\]
The standard error (\(\text{SE}\))
is: \[
\text{SE} = \sqrt{\frac{0.3900(1 - 0.3900)}{400}} \approx 0.0243
\]
Confidence Interval untuk Berbagai Tingkat
Kepercayaan
| 90% |
1.6449 |
0.0401 |
[0.3499, 0.4301] |
| 95% |
1.9600 |
0.0478 |
[0.3422, 0.4378] |
| 99% |
2.5758 |
0.0628 |
[0.3272, 0.4528] |
Visualize and Compare
the Three Intervals
The chart below visualizes how the width of the confidence interval
increases with the confidence level. The sample proportion (\(\hat{p}=0.3900\)) is the center of all
three intervals (marked by the diamond).
Explain How
Confidence Level Affects Decision-Making
The confidence level directly impacts the precision and certainty of
your result, which is crucial in product experimentation like A/B
testing.
Hubungan Confidence Level dengan Lebar Interval, Presisi, dan
Risiko Error
| Higher (99%) |
Wider |
Less precise |
More certain |
Lower risk of Type I error |
| Lower (90%) |
Narrower |
More precise |
Less certain |
Higher risk of Type I error |
- Defining a Winner (Statistical Significance):
In A/B testing, a common decision rule is to declare a “winner” if
the confidence interval of the difference between the two variants does
not include zero.
- Higher Confidence (\(\mathbf{99\%}\)):
The interval is very wide, making it harder to exclude a null
hypothesis (e.g., that the new design is no different than the old one).
It requires a much larger difference in performance to achieve
statistical significance. While this is the safest level, it often leads
to inconclusive results, requiring longer testing times.
- Lower Confidence (\(\mathbf{90\%}\)):
The interval is narrower, making it easier to achieve statistical
significance. However, this increases the risk of a Type I error (a
False Positive)—declaring the new CTA a winner when it is actually no
better, or even worse, than the original.
Most data science and product teams default to a \(95\%\) confidence level (corresponding to a
\(\alpha=0.05\) significance level).
This is considered a good balance, offering a reasonable level of
certainty (\(95\%\) sure the true value
is in the range) without requiring an excessively large sample size or
long test duration that would be needed for a \(99\%\) confidence level.
Case Study 4
Precision Comparison (Z-Test vs t-Test): Two data
teams measure API latency (in milliseconds) under
different conditions.
\[\begin{eqnarray*}
\text{Team A:} \\
n &=& 36 \quad \text{(sample size)} \\
\bar{x} &=& 210 \quad \text{(sample mean)} \\
\sigma &=& 24 \quad \text{(known population standard deviation)}
\\[6pt]
\text{Team B:} \\
n &=& 36 \quad \text{(sample size)} \\
\bar{x} &=& 210 \quad \text{(sample mean)} \\
s &=& 24 \quad \text{(sample standard deviation)}
\end{eqnarray*}\]
Tasks
- Identify the statistical test used by each team.
- Compute Confidence Intervals for 90%, 95%, and
99%.
- Create a visualization comparing all intervals.
- Explain why the interval widths differ, even with
similar data.
Statistical Test
Identification
The choice of statistical test for the mean depends on whether the
population standard deviation (\(\sigma\)) is known and the sample size
(\(n\)).
Pemilihan Uji Statistik Berdasarkan Informasi Simpangan
Baku
| Team A |
σ = 24 (Known population SD) |
Z-Test (or Z-interval) |
Since the population standard deviation (σ) is known
and the sample size (n = 36) is large (n ≥ 30), the Z-distribution is
appropriate. |
| Team B |
s = 24 (Sample SD) |
t-Test (or t-interval) |
Since the population standard deviation (σ) is
unknown and only the sample standard deviation (s) is available, the
t-distribution must be used. |
Confidence Interval
Computation
The formula for the Confidence Interval (CI) for the population mean
(\(\mu\)) is:
Team A (Z-Interval): \[
\text{CI} = \bar{x} \pm Z^* \left(\frac{\sigma}{\sqrt{n}}\right)
\]
Team B (t-Interval): \[
\text{CI} = \bar{x} \pm t^* \left(\frac{s}{\sqrt{n}}\right)
\]
Common Parameters: \[\begin{eqnarray*}
\text{Team A:} \\
n &=& 36 \quad \text{(sample size)} \\
\bar{x} &=& 210 \quad \text{(sample mean)} \\
\sigma &=& 24 \quad \text{(known population standard deviation)}
\\[6pt]
\text{Team B:} \\
n &=& 36 \quad \text{(sample size)} \\
\bar{x} &=& 210 \quad \text{(sample mean)} \\
s &=& 24 \quad \text{(sample standard deviation)}
\\[6pt]\end{eqnarray*}\]
Standard Error (SE): \[\begin{eqnarray*}\text{SE} =
\frac{\sigma}{\sqrt{n}} = \frac{24}{\sqrt{36}} = \frac{24}{6} = 4
\end{eqnarray*}\]
Team A (Z-Interval): \(\sigma\) is knownWe use the critical
Z-values (\(Z\)) for the specified
confidence levels.
Confidence Interval dengan Margin of Error (Z* × 4)
| 90% |
1.645 |
1.645 × 4 = 6.58 |
[203.42, 216.58] |
13.16 |
| 95% |
1.960 |
1.960 × 4 = 7.84 |
[202.16, 217.84] |
15.68 |
| 99% |
2.576 |
2.576 × 4 = 10.30 |
[199.70, 220.30] |
20.60 |
Team B (t-Interval): \(\sigma\) is unknownWe use the critical
t-values (\(t\)) with degrees of
freedom (\(df\)) \(=n-1=36-1=35\)
Confidence Interval Menggunakan t-Distribution (df =
35)
| 90% |
1.690 |
1.690 × 4 = 6.76 |
[203.24, 216.76] |
13.52 |
| 95% |
2.030 |
2.030 × 4 = 8.12 |
[201.88, 218.12] |
16.24 |
| 99% |
2.724 |
2.724 × 4 = 10.90 |
[199.10, 220.90] |
21.80 |
Interval Comparison
Visualization
The visualization would show that for every confidence level:
The t-intervals (Team B) are slightly wider than the Z-intervals
(Team A). All intervals are centered at the sample mean of 210 ms. The
width of the intervals increases as the confidence level increases
(e.g., the 99% interval is widest, the 90% is narrowest).
Explanation of
Interval Width Difference
The interval widths differ because of the underlying probability
distributions used: the Standard Normal (Z) Distribution versus the
Student’s t-Distribution.
\(\sigma\) Known (Team A \(\rightarrow\) Z-Test)
The Z-test is used when the population standard deviation (\(\sigma\)) is known.
Since \(\sigma\) is a fixed,
known value, the estimate of the standard error (\(\sigma/\sqrt{n}\)) is highly certain and
does not add extra variability to the analysis.
The critical \(Z^\) values are
fixed based on the confidence level.
\(\sigma\) Unknown (Team B \(\rightarrow\) t-Test)
The t-test is used when the population standard deviation (\(\sigma\)) is unknown, and we must
substitute the sample standard deviation (\(s\)) as an estimate.
The sample standard deviation (\(s\)) is itself an estimate that varies from
sample to sample. This introduces an extra source of uncertainty into
the standard error estimate.
To account for this added uncertainty, the t-distribution has
heavier tails (more spread out) than the Z-distribution.
This results in larger critical values (\(t > Z\)) and, consequently, a larger
Margin of Error (ME) and wider confidence intervals for the t-test
compared to the Z-test at the same confidence level.
In summary: The t-test requires a wider interval (is less precise) to
achieve the same confidence level as the Z-test because it must
compensate for the additional uncertainty introduced by estimating the
population standard deviation (\(\sigma\)) with the sample standard
deviation (\(s\)).
Case Study 5
One-Sided Confidence Interval: A Software as
a Service (SaaS) company wants to ensure that at least
70% of weekly active users utilize a premium feature.
From the experiment:
\[
\begin{eqnarray*}
n &=& 250 \quad \text{(total users)} \\
x &=& 185 \quad \text{(active premium users)}
\end{eqnarray*}
\]
Management is only interested in the lower bound of
the estimate.
Tasks:
- Identify the type of Confidence Interval and the
appropriate test.
- Compute the one-sided lower Confidence Interval at:
- \(90\%\)
- \(95\%\)
- \(99\%\)
- Visualize the lower bounds for all confidence levels.
- Determine whether the 70% target is statistically
satisfied.
The given data is: \[\begin{eqnarray*}
n &=& 250 \quad \text{(total users)} \\
x &=& 185 \quad \text{(active premium users)} \\
\hat{p} &=& \frac{x}{n} = \frac{185}{250} = 0.74
\end{eqnarray*}\] The target proportion to ensure is \(p_0 = 0.70\).
The standard error of the sample proportion (\(\hat{p}\)) is: \[
SE = \sqrt{\frac{\hat{p}(1-\hat{p})}{n}} =
\sqrt{\frac{0.74(1-0.74)}{250}} \approx 0.0277
\]
Identify the Type of
Confidence Interval and the Appropriate Test
Type of Confidence Interval: One-Sided Lower Confidence Interval for
a Population Proportion. The company is only interested in the lower
bound to ensure the feature usage is at least \(70\%\).
Appropriate Test/Method: The appropriate method is using the Z-test
for a Population Proportion (or the Normal Approximation method for
confidence intervals) because the sample size is large enough to satisfy
the normal approximation conditions (\(n\hat{p} = 185 > 10\) and \(n(1-\hat{p}) = 65 > 10\)).
Compute the One-Sided
Lower Confidence Interval
The formula for the one-sided lower confidence bound is: \[
\text{Lower Bound} = \hat{p} - Z_{1-\alpha} \cdot SE
\]
One-Sided Confidence Interval (Lower Bound)
| 90% |
0.10 |
1.282 |
0.7044 |
| 95% |
0.05 |
1.645 |
0.6944 |
| 99% |
0.01 |
2.326 |
0.6755 |
Detailed Results:
One-Sided Confidence Interval (Lower Bound)
| 90% |
1.281552 |
0.704448 |
| 95% |
1.644854 |
0.694369 |
| 99% |
2.326348 |
0.675463 |
Visualize the Lower
Bounds for All Confidence Levels
The following plot illustrates the calculated lower bounds against
the \(70\%\) target.(A bar chart titled
‘One-Sided Lower Confidence Bounds for Premium Feature Usage’ is
displayed. The x-axis shows confidence levels (90%, 95%, 99%), and the
y-axis shows the Lower Bound (CI). A horizontal dashed red line
indicates the target proportion of 0.70. The bars show lower bounds of
0.704
Determine Whether the
\(70\%\) Target is Statistically
Satisfied
The \(70\%\) target is statistically
satisfied at a given confidence level if the calculated Lower Bound is
\(\geq 0.70\).
At \(99\%\) Confidence:
Summary: The company can be \(90\%\)
confident that the true proportion of weekly active users utilizing a
premium feature is at least \(70\%\).
However, they cannot make this claim at the stricter \(95\%\) or \(99\%\) confidence levels.
LS0tDQp0aXRsZTogIlNUVURZIENBU0VTIiAgICAgICAgICAgICMgTWFpbiB0aXRsZSBvZiB0aGUgZG9jdW1lbnQNCnN1YnRpdGxlOiAiQ29uZmlkZW5jZSBJbnRlcnZhbH4gV2VlayAxMyIgICMgU3VidGl0bGUgb3IgdG9waWMgZm9yIHdlZWsgMg0KYXV0aG9yOiAiQ2Fyb2wgRHVwaW5vIFBlcmVpcmEiICAgICAgIyBSZXBsYWNlIHdpdGggeW91ciBmdWxsIG5hbWUNCmRhdGU6ICAiYHIgZm9ybWF0KFN5cy5EYXRlKCksICclQiAlZCwgJVknKWAiICMgQXV0byBkaXNwbGF5cyB0aGUgY3VycmVudCBkYXRlDQpvdXRwdXQ6ICAgICAgICAgICAgICAgICAgICAgICAgICMgT3V0cHV0IHNlY3Rpb24gZGVmaW5lcyB0aGUgZm9ybWF0IGFuZCBsYXlvdXQgDQogIHJtZGZvcm1hdHM6OnJlYWR0aGVkb3duOiAgICAgICMgaHR0cHM6Ly9naXRodWIuY29tL2p1YmEvcm1kZm9ybWF0cw0KICAgIHNlbGZfY29udGFpbmVkOiB0cnVlICAgICAgICAjIEVtYmVkcyBhbGwgcmVzb3VyY2VzIChDU1MsIEpTLCBpbWFnZXMpIA0KICAgIHRodW1ibmFpbHM6IHRydWUgICAgICAgICAgICAjIERpc3BsYXlzIGltYWdlIHRodW1ibmFpbHMgaW4gdGhlIGRvYw0KICAgIGxpZ2h0Ym94OiB0cnVlICAgICAgICAgICAgICAjIEVuYWJsZXMgY2xpY2sgdG8gZW5sYXJnZSBpbWFnZXMNCiAgICBnYWxsZXJ5OiB0cnVlICAgICAgICAgICAgICAgIyBHcm91cHMgaW1hZ2VzIGludG8gYW4gaW50ZXJhY3RpdmUgZ2FsbGVyeQ0KICAgIG51bWJlcl9zZWN0aW9uczogdHJ1ZSAgICAgICAjIEF1dG9tYXRpY2FsbHkgbnVtYmVycyBhbGwgc2VjdGlvbnMNCiAgICBsaWJfZGlyOiBsaWJzICAgICAgICAgICAgICAgIyBEaXJlY3Rvcnkgd2hlcmUgSmF2YVNjcmlwdC9DU1MgbGlicmFyaWVzDQogICAgZGZfcHJpbnQ6ICJwYWdlZCIgICAgICAgICAgICMgRGlzcGxheXMgZGF0YSBmcmFtZXMgYXMgaW50ZXJhY3RpdmUgcGFnZWQgDQogICAgY29kZV9mb2xkaW5nOiAic2hvdyIgICAgICAgICMgQWxsb3dzIGZvbGRpbmcvdW5mb2xkaW5nIFIgY29kZSBibG9ja3MgDQogICAgY29kZV9kb3dubG9hZDogeWVzICAgICAgICAgICMgQWRkcyBhIGJ1dHRvbiB0byBkb3dubG9hZCBhbGwgUiBjb2RlDQogICAgY3NzIDogYWFhYS5jc3MNCi0tLQ0KDQoNCmBgYHtyIHByb2ZpbGUsIGVjaG89RkFMU0V9DQpsaWJyYXJ5KGh0bWx0b29scykNCg0KSFRNTCgnDQo8ZGl2IHN0eWxlPSJ3aWR0aDogNDAwcHg7IGhlaWdodDogMjUwcHg7IGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgxMzVkZWcsICNmZmZmZmYgMCUsICNmMGYwZjAgMTAwJSk7IGJvcmRlcjogMnB4IHNvbGlkICMyYzNlNTA7IGJvcmRlci1yYWRpdXM6IDE1cHg7IGJveC1zaGFkb3c6IDAgOHB4IDIwcHggcmdiYSgwLDAsMCwwLjE1KTsgcGFkZGluZzogMjBweDsgZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZ2FwOiAyMHB4OyBmb250LWZhbWlseTogQXJpYWwsIHNhbnMtc2VyaWY7IG1hcmdpbjogMjBweCBhdXRvOyBvdmVyZmxvdzogaGlkZGVuOyI+DQogIDxkaXYgc3R5bGU9ImZsZXgtc2hyaW5rOiAwOyI+DQogICAgPGltZyBzcmM9ImZvdG9fMS5qcGciIHN0eWxlPSJ3aWR0aDogMTIwcHg7IGhlaWdodDogMTIwcHg7IGJvcmRlci1yYWRpdXM6IDEwcHg7IG9iamVjdC1maXQ6IGNvdmVyOyBib3JkZXI6IDRweCBzb2xpZCAjMmMzZTUwOyBib3gtc2hhZG93OiAwIDRweCAxMHB4IHJnYmEoMCwwLDAsMC4yKTsiPg0KICA8L2Rpdj4NCiAgPGRpdiBzdHlsZT0iZmxleDogMTsgb3ZlcmZsb3c6IGhpZGRlbjsiPg0KICAgIDxkaXYgc3R5bGU9ImJhY2tncm91bmQ6ICNlY2YwZjE7IGJvcmRlcjogMXB4IHNvbGlkICNiZGMzYzc7IGJvcmRlci1yYWRpdXM6IDhweDsgcGFkZGluZzogOHB4OyBtYXJnaW4tYm90dG9tOiAxMHB4OyI+DQogICAgICA8aDEgc3R5bGU9ImNvbG9yOiAjMmMzZTUwOyBmb250LXNpemU6IDE4cHg7IG1hcmdpbjogMCAwIDVweCAwOyBmb250LXdlaWdodDogYm9sZDsiPkNhcm9sIER1cGlubyBQZXJlaXJhPC9oMT4NCiAgICAgIDxoMiBzdHlsZT0iY29sb3I6ICMzNDQ5NWU7IGZvbnQtc2l6ZTogMTRweDsgbWFyZ2luOiAwOyBmb250LXdlaWdodDogbm9ybWFsOyI+TklNOiA1MjI1MDA1MTwvaDI+DQogICAgPC9kaXY+DQogICAgPHAgc3R5bGU9ImNvbG9yOiAjN2Y4YzhkOyBmb250LXNpemU6IDEycHg7IG1hcmdpbjogMCAwIDE1cHggMDsiPk1haGFzaXN3YSBTYWlucyBEYXRhIElUU0I8L3A+DQogICAgDQogICAgPGRpdiBzdHlsZT0iZGlzcGxheTogZmxleDsgZmxleC13cmFwOiB3cmFwOyBnYXA6IDhweDsiPg0KICAgICAgPHNwYW4gc3R5bGU9ImJhY2tncm91bmQ6ICMzNDk4ZGI7IGNvbG9yOiB3aGl0ZTsgcGFkZGluZzogNHB4IDEwcHg7IGJvcmRlci1yYWRpdXM6IDE1cHg7IGZvbnQtc2l6ZTogMTBweDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij5SIFByb2dyYW1taW5nPC9zcGFuPg0KICAgICAgPHNwYW4gc3R5bGU9ImJhY2tncm91bmQ6ICNlNzRjM2M7IGNvbG9yOiB3aGl0ZTsgcGFkZGluZzogNHB4IDEwcHg7IGJvcmRlci1yYWRpdXM6IDE1cHg7IGZvbnQtc2l6ZTogMTBweDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij5EYXRhIFNjaWVuY2U8L3NwYW4+DQogICAgICA8c3BhbiBzdHlsZT0iYmFja2dyb3VuZDogIzJlY2M3MTsgY29sb3I6IHdoaXRlOyBwYWRkaW5nOiA0cHggMTBweDsgYm9yZGVyLXJhZGl1czogMTVweDsgZm9udC1zaXplOiAxMHB4OyBmb250LXdlaWdodDogYm9sZDsiPlN0YXRpc3RpY3M8L3NwYW4+DQogICAgPC9kaXY+DQogIDwvZGl2Pg0KPC9kaXY+DQonKQ0KYGBgDQoNCi0tLQ0KDQojIyAgIENhc2UgU3R1ZHkgMQ0KDQoqKkNvbmZpZGVuY2UgSW50ZXJ2YWwgZm9yIE1lYW4sICRcc2lnbWEkIEtub3duOioqIEFuICoqZS1jb21tZXJjZSBwbGF0Zm9ybSoqIHdhbnRzIHRvIGVzdGltYXRlIHRoZSAqKmF2ZXJhZ2UgbnVtYmVyIG9mIGRhaWx5IHRyYW5zYWN0aW9ucyBwZXIgdXNlcioqIGFmdGVyIGxhdW5jaGluZyBhIG5ldyBmZWF0dXJlLiBCYXNlZCBvbiBsYXJnZS1zY2FsZSBoaXN0b3JpY2FsIGRhdGEsIHRoZSAqKnBvcHVsYXRpb24gc3RhbmRhcmQgZGV2aWF0aW9uKiogaXMga25vd24uDQoNCiQkDQpcYmVnaW57ZXFuYXJyYXkqfQ0KXHNpZ21hICY9JiAzLjIgXHF1YWQgXHRleHR7KHBvcHVsYXRpb24gc3RhbmRhcmQgZGV2aWF0aW9uKX0gXFwNCm4gJj0mIDEwMCBccXVhZCBcdGV4dHsoc2FtcGxlIHNpemUpfSBcXA0KXGJhcnt4fSAmPSYgMTIuNiBccXVhZCBcdGV4dHsoc2FtcGxlIG1lYW4pfQ0KXGVuZHtlcW5hcnJheSp9DQokJA0KDQoqKlRhc2tzKioNCg0KMS4gSWRlbnRpZnkgdGhlICoqYXBwcm9wcmlhdGUgc3RhdGlzdGljYWwgdGVzdCoqIGFuZCBqdXN0aWZ5IHlvdXIgY2hvaWNlLg0KMi4gQ29tcHV0ZSB0aGUgQ29uZmlkZW5jZSBJbnRlcnZhbHMgZm9yOg0KICAgLSAkOTBcJSQNCiAgIC0gJDk1XCUkDQogICAtICQ5OVwlJA0KMy4gQ3JlYXRlIGEgKipjb21wYXJpc29uIHZpc3VhbGl6YXRpb24qKiBvZiB0aGUgdGhyZWUgY29uZmlkZW5jZSBpbnRlcnZhbHMuDQo0LiBJbnRlcnByZXQgdGhlIHJlc3VsdHMgaW4gYSBidXNpbmVzcyBhbmFseXRpY3MgY29udGV4dC4NCg0KLS0tDQoNCiMjIyAgICBBcHByb3ByaWF0ZSBTdGF0aXN0aWNhbCBUZXN0IGFuZCBKdXN0aWZpY2F0aW9uDQoNClRoZSBhcHByb3ByaWF0ZSBzdGF0aXN0aWNhbCB0ZXN0IGZvciBjb25zdHJ1Y3RpbmcgdGhlIGNvbmZpZGVuY2UgaW50ZXJ2YWwgZm9yIHRoZSBwb3B1bGF0aW9uIG1lYW4gKCRcbXUkKSBpcyB0aGUgWi1JbnRlcnZhbCBmb3IgdGhlIFBvcHVsYXRpb24gTWVhbi4NCg0KSnVzdGlmaWNhdGlvbjoNCg0KLSBQb3B1bGF0aW9uIFN0YW5kYXJkIERldmlhdGlvbiAoJFxzaWdtYSQpIGlzIEtub3duOiBUaGlzIGlzIHRoZSBwcmltYXJ5IGNvbmRpdGlvbiB0aGF0IGRpY3RhdGVzIHRoZSB1c2Ugb2YgdGhlIFotZGlzdHJpYnV0aW9uIChTdGFuZGFyZCBOb3JtYWwgRGlzdHJpYnV0aW9uKSBvdmVyIHRoZSAkdCQtZGlzdHJpYnV0aW9uLg0KDQotIExhcmdlIFNhbXBsZSBTaXplICgkbiQpOiBXaXRoIGEgc2FtcGxlIHNpemUgb2YgJG49MTAwJCAod2hpY2ggaXMgJFxnZSAzMCQpLCB0aGUgQ2VudHJhbCBMaW1pdCBUaGVvcmVtIGVuc3VyZXMgdGhhdCB0aGUgc2FtcGxpbmcgZGlzdHJpYnV0aW9uIG9mIHRoZSBzYW1wbGUgbWVhbiAoJFxiYXJ7eH0kKSBpcyBhcHByb3hpbWF0ZWx5IG5vcm1hbCwgZXZlbiBpZiB0aGUgdW5kZXJseWluZyBwb3B1bGF0aW9uIGRpc3RyaWJ1dGlvbiBpcyBub3QgcGVyZmVjdGx5IG5vcm1hbC4gVGhpcyBmdXJ0aGVyIHZhbGlkYXRlcyB0aGUgdXNlIG9mIHRoZSBaLXN0YXRpc3RpYy4NCg0KVGhlIGZvcm11bGEgdXNlZCBpczoNCiQkDQpcdGV4dHtDb25maWRlbmNlIEludGVydmFsfSA9IFxiYXJ7eH0gXHBtIFpfe1xhbHBoYS8yfSBcbGVmdCggXGZyYWN7XHNpZ21hfXtcc3FydHtufX0gXHJpZ2h0KQ0KJCQNCg0KIyMjICAgQ29uZmlkZW5jZSBJbnRlcnZhbCBDb21wdXRhdGlvbnMNCg0KR2l2ZW4gUGFyYW1ldGVyczoNClxiZWdpbntlcW5hcnJheSp9DQpcc2lnbWEgJj0mIDMuMiBcXA0KbiAmPSYgMTAwIFxcDQpcYmFye3h9ICY9JiAxMi42DQpcZW5ke2VxbmFycmF5Kn0NCg0KU3RhbmRhcmQgRXJyb3IgKFNFKToNClxiZWdpbntlcW5hcnJheSp9XHRleHR7U0V9ID0gXGZyYWN7XHNpZ21hfXtcc3FydHtufX0gPSBcZnJhY3szLjJ9e1xzcXJ0ezEwMH19ID0gXGZyYWN7My4yfXsxMH0gPSAwLjMyDQpcZW5ke2VxbmFycmF5Kn0NCg0KVGhlIGNvbXB1dGVkIGNvbmZpZGVuY2UgaW50ZXJ2YWxzIGFyZSBzdW1tYXJpemVkIGluIHRoZSB0YWJsZSBiZWxvdzoNCg0KDQpgYGB7cixlY2hvPUZBTFNFLG1lc3NhZ2U9RkFMU0Usd2FybmluZz1GQUxTRX0NCiMgTWVtYnVhdCB0YWJlbCBjb25maWRlbmNlIGludGVydmFsIGR1YSBzaXNpDQpjaV90YWJsZV90d29fc2lkZWQgPC0gZGF0YS5mcmFtZSgNCiAgQ29uZmlkZW5jZV9MZXZlbCA9IGMoIjkwJSIsICI5NSUiLCAiOTklIiksDQogIFpfYWxwaGFfb3Zlcl8yID0gYygxLjY0NSwgMS45NjAsIDIuNTc2KSwNCiAgTWFyZ2luX29mX0Vycm9yID0gYygwLjUyNiwgMC42MjcsIDAuODI0KSwNCiAgTG93ZXJfQm91bmQgPSBjKDEyLjA3NCwgMTEuOTczLCAxMS43NzYpLA0KICBVcHBlcl9Cb3VuZCA9IGMoMTMuMTI2LCAxMy4yMjcsIDEzLjQyNCkNCikNCg0KIyBNZW5hbXBpbGthbiB0YWJlbA0KbGlicmFyeShrbml0cikNCg0Ka2FibGUoDQogIGNpX3RhYmxlX3R3b19zaWRlZCwNCiAgY2FwdGlvbiA9ICJUd28tU2lkZWQgQ29uZmlkZW5jZSBJbnRlcnZhbCBNZW5nZ3VuYWthbiBazrEvMiIsDQogIGFsaWduID0gImMiDQopDQoNCmBgYA0KDQojIyMgICAgQ29tcGFyaXNvbiBWaXN1YWxpemF0aW9uDQoNClRoZSBwbG90IGJlbG93IHZpc3VhbGx5IGNvbXBhcmVzIHRoZSB0aHJlZSBjb25maWRlbmNlIGludGVydmFscywgZGVtb25zdHJhdGluZyBob3cgdGhlIGludGVydmFsIHdpZHRoIGluY3JlYXNlcyBhcyB0aGUgY29uZmlkZW5jZSBsZXZlbCBpbmNyZWFzZXMuDQoNCmBgYHtyLGVjaG89RkFMU0UsbWVzc2FnZT1GQUxTRSx3YXJuaW5nPUZBTFNFfQ0KIyBMb2FkIG5lY2Vzc2FyeSBsaWJyYXJpZXMNCmxpYnJhcnkocGxvdGx5KQ0KDQojIFByb3ZpZGVkIGRhdGENCmNvbmZfbGV2ZWxzIDwtIGMoMC45MCwgMC45NSwgMC45OSkNCnpfdmFsdWVzIDwtIGMoMS42NDUsIDEuOTYwLCAyLjU3NikNCm1lX3ZhbHVlcyA8LSBjKDAuNTI2LCAwLjYyNywgMC44MjQpDQpsYl92YWx1ZXMgPC0gYygxMi4wNzQsIDExLjk3MywgMTEuNzc2KQ0KdWJfdmFsdWVzIDwtIGMoMTMuMTI2LCAxMy4yMjcsIDEzLjQyNCkNCm1lYW5fdmFsIDwtIChsYl92YWx1ZXMgKyB1Yl92YWx1ZXMpIC8gMiAgIyBBbGwgYXBwcm94aW1hdGVseSAxMi42DQoNCiMgRGVmaW5lIHggdmFsdWVzIGZvciBkaXN0cmlidXRpb25zIChzdGFuZGFyZGl6ZWQgc2NhbGUpDQp4IDwtIHNlcSgtNCwgNCwgMC4wMSkNCg0KIyBaLWRpc3RyaWJ1dGlvbiAoU3RhbmRhcmQgTm9ybWFsKQ0KeV96IDwtIGRub3JtKHgpDQpmaWdfeiA8LSBwbG90X2x5KHggPSB4LCB5ID0geV96LCB0eXBlID0gJ3NjYXR0ZXInLCBtb2RlID0gJ2xpbmVzJywgbmFtZSA9ICdaLURpc3RyaWJ1dGlvbiAoU3RhbmRhcmQgTm9ybWFsKScpICU+JQ0KICBsYXlvdXQodGl0bGUgPSAnWi1EaXN0cmlidXRpb24gd2l0aCBDcml0aWNhbCBWYWx1ZXMnLA0KICAgICAgICAgeGF4aXMgPSBsaXN0KHRpdGxlID0gJ1otU2NvcmUnKSwNCiAgICAgICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICdEZW5zaXR5JykpDQoNCiMgQWRkIGNyaXRpY2FsIHZhbHVlcyBmb3IgWi1kaXN0cmlidXRpb24NCmZvciAoaSBpbiAxOjMpIHsNCiAgZmlnX3ogPC0gZmlnX3ogJT4lIA0KICAgIGFkZF90cmFjZSh4ID0gYygtel92YWx1ZXNbaV0sIHpfdmFsdWVzW2ldKSwgDQogICAgICAgICAgICAgIHkgPSBjKDAsIDApLCANCiAgICAgICAgICAgICAgdHlwZSA9ICdzY2F0dGVyJywgDQogICAgICAgICAgICAgIG1vZGUgPSAnbWFya2VycycsIA0KICAgICAgICAgICAgICBtYXJrZXIgPSBsaXN0KHNpemUgPSA4LCBjb2xvciA9ICdyZWQnKSwgDQogICAgICAgICAgICAgIG5hbWUgPSBwYXN0ZTAoY29uZl9sZXZlbHNbaV0qMTAwLCAnJSBDcml0aWNhbCBaLVZhbHVlcycpKQ0KfQ0KDQojIFQtZGlzdHJpYnV0aW9uIChhc3N1bWluZyBkZiA9IDMwIGZvciBpbGx1c3RyYXRpb24sIGFzIGRmIGlzIG5vdCBwcm92aWRlZCkNCmRmIDwtIDMwDQp5X3QgPC0gZHQoeCwgZGYpDQp0X2NyaXQgPC0gcXQoMSAtICgxIC0gY29uZl9sZXZlbHMpLzIsIGRmKSAgIyBDcml0aWNhbCB0LXZhbHVlcw0KZmlnX3QgPC0gcGxvdF9seSh4ID0geCwgeSA9IHlfdCwgdHlwZSA9ICdzY2F0dGVyJywgbW9kZSA9ICdsaW5lcycsIG5hbWUgPSBwYXN0ZSgnVC1EaXN0cmlidXRpb24gKGRmID0nLCBkZiwgJyknKSkgJT4lDQogIGxheW91dCh0aXRsZSA9IHBhc3RlKCdULURpc3RyaWJ1dGlvbiAoZGYgPScsIGRmLCAnKSB3aXRoIENyaXRpY2FsIFZhbHVlcycpLA0KICAgICAgICAgeGF4aXMgPSBsaXN0KHRpdGxlID0gJ1QtU2NvcmUnKSwNCiAgICAgICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICdEZW5zaXR5JykpDQoNCiMgQWRkIGNyaXRpY2FsIHZhbHVlcyBmb3IgVC1kaXN0cmlidXRpb24NCmZvciAoaSBpbiAxOjMpIHsNCiAgZmlnX3QgPC0gZmlnX3QgJT4lIA0KICAgIGFkZF90cmFjZSh4ID0gYygtdF9jcml0W2ldLCB0X2NyaXRbaV0pLCANCiAgICAgICAgICAgICAgeSA9IGMoMCwgMCksIA0KICAgICAgICAgICAgICB0eXBlID0gJ3NjYXR0ZXInLCANCiAgICAgICAgICAgICAgbW9kZSA9ICdtYXJrZXJzJywgDQogICAgICAgICAgICAgIG1hcmtlciA9IGxpc3Qoc2l6ZSA9IDgsIGNvbG9yID0gJ2JsdWUnKSwgDQogICAgICAgICAgICAgIG5hbWUgPSBwYXN0ZTAoY29uZl9sZXZlbHNbaV0qMTAwLCAnJSBDcml0aWNhbCBULVZhbHVlcycpKQ0KfQ0KDQojIENvbmZpZGVuY2UgSW50ZXJ2YWxzIHZpc3VhbGl6YXRpb24gKGFzIGVycm9yIGJhcnMgb24gdGhlIG1lYW4pDQpmaWdfY2kgPC0gcGxvdF9seSh4ID0gcGFzdGUwKGNvbmZfbGV2ZWxzKjEwMCwgJyUnKSwgDQogICAgICAgICAgICAgICAgICB5ID0gbWVhbl92YWwsIA0KICAgICAgICAgICAgICAgICAgdHlwZSA9ICdzY2F0dGVyJywgDQogICAgICAgICAgICAgICAgICBtb2RlID0gJ21hcmtlcnMnLCANCiAgICAgICAgICAgICAgICAgIGVycm9yX3kgPSBsaXN0KHR5cGUgPSAnZGF0YScsIGFycmF5ID0gbWVfdmFsdWVzKSwgDQogICAgICAgICAgICAgICAgICBuYW1lID0gJ0NvbmZpZGVuY2UgSW50ZXJ2YWxzJykgJT4lDQogIGxheW91dCh0aXRsZSA9ICdDb25maWRlbmNlIEludGVydmFscyBmb3IgTWVhbicsDQogICAgICAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAnQ29uZmlkZW5jZSBMZXZlbCcpLA0KICAgICAgICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gJ01lYW4gRXN0aW1hdGUnKSkNCg0KIyBDb21iaW5lIGludG8gc3VicGxvdHM6IFotZGlzdCwgVC1kaXN0LCBhbmQgQ0kNCmZpZ19jb21iaW5lZCA8LSBzdWJwbG90KGZpZ196LCBmaWdfdCwgZmlnX2NpLCBucm93cyA9IDMsIHNoYXJlWCA9IEZBTFNFLCB0aXRsZVkgPSBUUlVFKSAlPiUNCiAgbGF5b3V0KHRpdGxlID0gJ1Zpc3VhbGl6YXRpb25zIG9mIFotRGlzdHJpYnV0aW9uLCBULURpc3RyaWJ1dGlvbiwgYW5kIENvbmZpZGVuY2UgSW50ZXJ2YWxzJykNCg0KIyBEaXNwbGF5IHRoZSBwbG90DQpmaWdfY29tYmluZWQNCmBgYA0KDQoNCiMjIyAgIEludGVycHJldGF0aW9uIGluIGEgQnVzaW5lc3MgQW5hbHl0aWNzIENvbnRleHQNCg0KVGhlIGNvbmZpZGVuY2UgaW50ZXJ2YWxzIHByb3ZpZGUgYSByYW5nZSBvZiBwbGF1c2libGUgdmFsdWVzIGZvciB0aGUgdHJ1ZSBhdmVyYWdlIG51bWJlciBvZiBkYWlseSB0cmFuc2FjdGlvbnMgcGVyIHVzZXIgKM68KSBhZnRlciB0aGUgbmV3IGZlYXR1cmUgbGF1bmNoLg0KDQoxLiA5MCUgQ29uZmlkZW5jZSBJbnRlcnZhbCAoMTIuMDc0LDEzLjEyNik6DQoNCi0gV2UgYXJlIDkwJSBjb25maWRlbnQgdGhhdCB0aGUgdHJ1ZSBhdmVyYWdlIG51bWJlciBvZiBkYWlseSB0cmFuc2FjdGlvbnMgcGVyIHVzZXIgaXMgYmV0d2VlbiAxMi4wNzQgYW5kIDEzLjEyNi4gVGhpcyBpcyB0aGUgbW9zdCBwcmVjaXNlIChuYXJyb3dlc3QpIGVzdGltYXRlLg0KDQoyLiA5NSUgQ29uZmlkZW5jZSBJbnRlcnZhbCAoMTEuOTczLDEzLjIyNyk6DQoNCi0gVGhpcyBpcyB0aGUgc3RhbmRhcmQgaW50ZXJ2YWwgdXNlZCBpbiBtb3N0IHNjaWVudGlmaWMgYW5kIGJ1c2luZXNzIGNvbnRleHRzLiBXZSBhcmUgOTUlIGNvbmZpZGVudCB0aGF0IHRoZSB0cnVlIGF2ZXJhZ2UgaXMgYmV0d2VlbiAxMS45NzMgYW5kIDEzLjIyNy4gVGhlIG1hcmdpbiBvZiBlcnJvciBpcyAwLjYyNyB0cmFuc2FjdGlvbnMuDQoNCjMuIDk5JSBDb25maWRlbmNlIEludGVydmFsICgxMS43NzYsMTMuNDI0KToNCg0KLSBUaGlzIGlzIHRoZSBtb3N0IHJlbGlhYmxlIChoaWdoZXN0IGNvbmZpZGVuY2UpIGVzdGltYXRlLiBXZSBhcmUgOTklIGNvbmZpZGVudCB0aGF0IHRoZSB0cnVlIGF2ZXJhZ2UgaXMgYmV0d2VlbiAxMS43NzYgYW5kIDEzLjQyNC4NCg0KQnVzaW5lc3MgSW5zaWdodDogVGhlIGtleSB0YWtlYXdheSBpcyB0aGUgdHJhZGUtb2ZmIGJldHdlZW4gQ29uZmlkZW5jZSBhbmQgUHJlY2lzaW9uOg0KDQotIFRvIGJlIG1vcmUgY29uZmlkZW50IChlLmcuLCA5OSUgY29uZmlkZW5jZSksIHRoZSBlLWNvbW1lcmNlIHBsYXRmb3JtIG11c3QgYWNjZXB0IGEgd2lkZXIgaW50ZXJ2YWwgKGxvd2VyIHByZWNpc2lvbikuIFRoaXMgbWVhbnMgdGhlIHRydWUgYXZlcmFnZSBjb3VsZCBiZSBhcyBsb3cgYXMgMTEuNzc2IG9yIGFzIGhpZ2ggYXMgMTMuNDI0Lg0KDQotIFRvIGhhdmUgYSBtb3JlIHByZWNpc2UgZXN0aW1hdGUgKGUuZy4sIDkwJSBjb25maWRlbmNlKSwgdGhlIHBsYXRmb3JtIG11c3QgYWNjZXB0IGEgbG93ZXIgY29uZmlkZW5jZSBsZXZlbC4NCg0KU2luY2UgYWxsIGludGVydmFscyBhcmUgZW50aXJlbHkgYWJvdmUgMTEuNzc2IHRyYW5zYWN0aW9ucywgdGhlIHBsYXRmb3JtIGNhbiBiZSBoaWdobHkgY29uZmlkZW50IHRoYXQgdGhlIG5ldyBmZWF0dXJlIGhhcyByZXN1bHRlZCBpbiBhbiBhdmVyYWdlIHRyYW5zYWN0aW9uIHJhdGUgcGVyIHVzZXIgdGhhdCBpcyBzaWduaWZpY2FudGx5IGhpZ2hlciB0aGFuLCBmb3IgaW5zdGFuY2UsIDExLjAgKGlmIHRoYXQgd2VyZSBhIGJlbmNobWFyaykuIFRoZSA5NSUgQ0kgaXMgYSBnb29kIGJhbGFuY2UsIHN1Z2dlc3RpbmcgdGhlIG5ldyBmZWF0dXJlIGhhcyBsaWtlbHkgcmVzdWx0ZWQgaW4gYW4gYXZlcmFnZSBiZXR3ZWVuIGFwcHJveGltYXRlbHkgMTIuMCBhbmQgMTMuMiBkYWlseSB0cmFuc2FjdGlvbnMgcGVyIHVzZXIuDQoNCi0tLQ0KDQoNCiMjICAgQ2FzZSBTdHVkeSAyIA0KDQoqKkNvbmZpZGVuY2UgSW50ZXJ2YWwgZm9yIE1lYW4sICRcc2lnbWEkIFVua25vd246KiogQSAqKlVYIFJlc2VhcmNoIHRlYW0qKiBhbmFseXplcyAqKnRhc2sgY29tcGxldGlvbiB0aW1lIChpbiBtaW51dGVzKSoqIGZvciBhIG5ldyBtb2JpbGUgYXBwbGljYXRpb24uIFRoZSBkYXRhIGFyZSBjb2xsZWN0ZWQgZnJvbSAqKjEyIHVzZXJzKio6DQoNCiQkDQo4LjQsXDsgNy45LFw7IDkuMSxcOyA4LjcsXDsgOC4yLFw7IDkuMCxcOw0KNy44LFw7IDguNSxcOyA4LjksXDsgOC4xLFw7IDguNixcOyA4LjMNCiQkDQoNCioqVGFza3M6KioNCg0KMS4gSWRlbnRpZnkgdGhlICoqYXBwcm9wcmlhdGUgc3RhdGlzdGljYWwgdGVzdCoqIGFuZCBleHBsYWluIHdoeS4NCjIuIENvbXB1dGUgdGhlIENvbmZpZGVuY2UgSW50ZXJ2YWxzIGZvcjoNCiAgIC0gJDkwXCUkDQogICAtICQ5NVwlJA0KICAgLSAkOTlcJSQNCjMuIFZpc3VhbGl6ZSB0aGUgdGhyZWUgaW50ZXJ2YWxzIG9uIGEgc2luZ2xlIHBsb3QuDQo0LiBFeHBsYWluIGhvdyAqKnNhbXBsZSBzaXplIGFuZCBjb25maWRlbmNlIGxldmVsKiogaW5mbHVlbmNlIHRoZSBpbnRlcnZhbCB3aWR0aC4NCg0KLS0tDQoNCg0KIyMjICAgIElkZW50aWZ5IHRoZSBhcHByb3ByaWF0ZSBzdGF0aXN0aWNhbCB0ZXN0IGFuZCBleHBsYWluIHdoeS4NCg0KQXBwcm9wcmlhdGUgU3RhdGlzdGljYWwgVGVzdDogQ29uZmlkZW5jZSBJbnRlcnZhbCBmb3IgdGhlIE1lYW4gdXNpbmcgdGhlICR0JC1kaXN0cmlidXRpb24gKG9mdGVuIHJlZmVycmVkIHRvIGFzIGEgJHQkLWludGVydmFsKS4NCg0KRXhwbGFuYXRpb246VGhlICR0JC1kaXN0cmlidXRpb24gaXMgdGhlIGFwcHJvcHJpYXRlIGNob2ljZSBmb3IgY29uc3RydWN0aW5nIHRoZSBjb25maWRlbmNlIGludGVydmFsIGZvciB0aGUgcG9wdWxhdGlvbiBtZWFuICgkXG11JCkgZm9yIHR3byBwcmltYXJ5IHJlYXNvbnM6DQoNCjEuIFBvcHVsYXRpb24gU3RhbmRhcmQgRGV2aWF0aW9uIGlzIFVua25vd24gKCRcc2lnbWEkIHVua25vd24pOiBXaGVuICRcc2lnbWEkIGlzIHVua25vd24sIHdlIG11c3QgdXNlIHRoZSBzYW1wbGUgc3RhbmRhcmQgZGV2aWF0aW9uICgkcyQpIGFzIGFuIGVzdGltYXRlLg0KDQoyLiBTbWFsbCBTYW1wbGUgU2l6ZSAoJG4gPCAzMCQpOiBUaGUgc2FtcGxlIHNpemUgaXMgJG49MTIkLiBGb3Igc21hbGwgc2FtcGxlcyB3aXRoIGFuIHVua25vd24gcG9wdWxhdGlvbiBzdGFuZGFyZCBkZXZpYXRpb24sIHRoZSAkdCQtZGlzdHJpYnV0aW9uIHByb3ZpZGVzIGEgbW9yZSBhY2N1cmF0ZSBtb2RlbCBvZiB0aGUgc2FtcGxpbmcgZGlzdHJpYnV0aW9uIG9mIHRoZSBtZWFuIHRoYW4gdGhlIHN0YW5kYXJkIG5vcm1hbCAoJHokKSBkaXN0cmlidXRpb24uDQoNClRoZSBmb3JtdWxhIGZvciB0aGUgY29uZmlkZW5jZSBpbnRlcnZhbCBmb3IgdGhlIG1lYW4gaXM6DQokJA0KXGJhcnt4fSBccG0gdF97XGFscGhhLzIsIG4tMX0gXGNkb3QgXGZyYWN7c317XHNxcnR7bn19DQokJA0KDQp3aGVyZSAkdF97XGFscGhhLzIsIG4tMX0kIGlzIHRoZSBjcml0aWNhbCAkdCQtdmFsdWUgd2l0aCAkbi0xJCBkZWdyZWVzIG9mIGZyZWVkb20uDQoNCiMjIyAgIENvbXB1dGUgdGhlIENvbmZpZGVuY2UgSW50ZXJ2YWxzDQoNCg0KPGRpdiBjbGFzcz0ic3RhdC1ib3giPg0KICA8aDM+U2FtcGxlIFN0YXRpc3RpY3M8L2gzPg0KICA8dWw+DQogICAgPGxpPjxzdHJvbmc+U2FtcGxlIFNpemUgKG4pOjwvc3Ryb25nPiAxMjwvbGk+DQogICAgPGxpPjxzdHJvbmc+RGVncmVlcyBvZiBGcmVlZG9tIChkZik6PC9zdHJvbmc+IDExPC9saT4NCiAgICA8bGk+PHN0cm9uZz5TYW1wbGUgTWVhbiAoeMyEKTo8L3N0cm9uZz4gOC40NTAwIG1pbnV0ZXM8L2xpPg0KICAgIDxsaT48c3Ryb25nPlNhbXBsZSBTdGFuZGFyZCBEZXZpYXRpb24gKHMpOjwvc3Ryb25nPiAwLjQwNzkgbWludXRlczwvbGk+DQogICAgPGxpPjxzdHJvbmc+U3RhbmRhcmQgRXJyb3IgKHMgLyDiiJpuKTo8L3N0cm9uZz4gMC4xMTc5IG1pbnV0ZXM8L2xpPg0KICA8L3VsPg0KPC9kaXY+DQoNCg0KVGhlIGNvbXB1dGVkIGNvbmZpZGVuY2UgaW50ZXJ2YWxzIGZvciB0aGUgcG9wdWxhdGlvbiBtZWFuIHRhc2sgY29tcGxldGlvbiB0aW1lICgkXG11JCkgYXJlOg0KYGBge3IsZWNobz1GQUxTRSxtZXNzYWdlPUZBTFNFLHdhcm5pbmc9RkFMU0V9DQojIE1lbWJ1YXQgdGFiZWwgY29uZmlkZW5jZSBpbnRlcnZhbCAobWVuaXQpDQpjaV90YWJsZV9taW51dGVzIDwtIGRhdGEuZnJhbWUoDQogIENvbmZpZGVuY2VfTGV2ZWwgPSBjKCI5MCUiLCAiOTUlIiwgIjk5JSIpLA0KICBMb3dlcl9Cb3VuZF9taW4gPSBjKDguMjQzNSwgOC4xOTEyLCA4LjA3NzIpLA0KICBVcHBlcl9Cb3VuZF9taW4gPSBjKDguNjU2NSwgOC43MDg4LCA4LjgyMjgpDQopDQoNCiMgTWVuYW1waWxrYW4gdGFiZWwNCmxpYnJhcnkoa25pdHIpDQoNCmthYmxlKA0KICBjaV90YWJsZV9taW51dGVzLA0KICBjYXB0aW9uID0gIkNvbmZpZGVuY2UgSW50ZXJ2YWwgV2FrdHUgKGRhbGFtIE1lbml0KSIsDQogIGRpZ2l0cyA9IDQsDQogIGFsaWduID0gImMiDQopDQoNCmBgYA0KDQo8ZGl2IHN0eWxlPSINCiAgYm9yZGVyOiAycHggc29saWQgIzJjN2JlNTsNCiAgYmFja2dyb3VuZC1jb2xvcjogI2YxZjZmZjsNCiAgcGFkZGluZzogMTVweDsNCiAgYm9yZGVyLXJhZGl1czogOHB4Ow0KICBtYXJnaW4tdG9wOiAxNXB4Ow0KICBtYXJnaW4tYm90dG9tOiAxNXB4Ow0KICBmb250LXNpemU6IDE0cHg7DQoiPg0KICA8c3Ryb25nPk5vdGU6PC9zdHJvbmc+PGJyPjxicj4NCiAgVGhlIGNyaXRpY2FsIDxlbT50PC9lbT4tdmFsdWVzIHVzZWQgaW4gdGhlIGNhbGN1bGF0aW9uIHdlcmU6DQogIDx1bCBzdHlsZT0ibWFyZ2luLXRvcDogOHB4OyI+DQogICAgPGxpPg0KICAgICAgPGVtPnQ8L2VtPjxzdWI+MC4wNSwgMTE8L3N1Yj4gKDkwJSBDSSk6IDxzdHJvbmc+MS43OTU5PC9zdHJvbmc+DQogICAgPC9saT4NCiAgICA8bGk+DQogICAgICA8ZW0+dDwvZW0+PHN1Yj4wLjAyNSwgMTE8L3N1Yj4gKDk1JSBDSSk6IDxzdHJvbmc+Mi4yMDEwPC9zdHJvbmc+DQogICAgPC9saT4NCiAgICA8bGk+DQogICAgICA8ZW0+dDwvZW0+PHN1Yj4wLjAwNSwgMTE8L3N1Yj4gKDk5JSBDSSk6IDxzdHJvbmc+My4xMDU4PC9zdHJvbmc+DQogICAgPC9saT4NCiAgPC91bD4NCjwvZGl2Pg0KDQojIyMgICBWaXN1YWxpemUgdGhlIHRocmVlIGludGVydmFscyBvbiBhIHNpbmdsZSBwbG90Lg0KDQpUaGUgdGhyZWUgY29uZmlkZW5jZSBpbnRlcnZhbHMgYXJlIHZpc3VhbGl6ZWQgYmVsb3cuIFRoZSByZWQgZG90IHJlcHJlc2VudHMgdGhlIHNhbXBsZSBtZWFuICgkXGJhcnt4fSA9IDguNDUkIG1pbnV0ZXMpLCBhbmQgdGhlIGhvcml6b250YWwgbGluZXMgcmVwcmVzZW50IHRoZSBpbnRlcnZhbCBmb3IgZWFjaCBjb25maWRlbmNlIGxldmVsLlRoZSBwbG90IHNob3dzIHRoZSB0aHJlZSBjb25maWRlbmNlIGludGVydmFsczoNCg0KYGBge3IsZWNobz1GQUxTRX0NCiMgSW5zdGFsbCBhbmQgbG9hZCBuZWNlc3NhcnkgcGFja2FnZXMgaWYgbm90IGFscmVhZHkgaW5zdGFsbGVkDQojIGluc3RhbGwucGFja2FnZXMoInBsb3RseSIpDQpsaWJyYXJ5KHBsb3RseSkNCg0KIyBEZWZpbmUgdGhlIHJhbmdlIG9mIHggdmFsdWVzIGZvciB0aGUgcGxvdHMNCnggPC0gc2VxKC00LCA0LCBsZW5ndGgub3V0ID0gMTAwMCkNCg0KIyBaLWRpc3RyaWJ1dGlvbiAoU3RhbmRhcmQgTm9ybWFsKQ0Kel9kZW5zaXR5IDwtIGRub3JtKHgsIG1lYW4gPSAwLCBzZCA9IDEpDQoNCiMgVC1kaXN0cmlidXRpb25zIHdpdGggZGlmZmVyZW50IGRlZ3JlZXMgb2YgZnJlZWRvbQ0KdF9kZjUgPC0gZHQoeCwgZGYgPSA1KQ0KdF9kZjEwIDwtIGR0KHgsIGRmID0gMTApDQp0X2RmMzAgPC0gZHQoeCwgZGYgPSAzMCkNCg0KIyBDcmVhdGUgdGhlIHBsb3QgdXNpbmcgcGxvdGx5DQpwbG90IDwtIHBsb3RfbHkoKSAlPiUNCiAgIyBBZGQgWi1kaXN0cmlidXRpb24gdHJhY2UNCiAgYWRkX3RyYWNlKHggPSB4LCB5ID0gel9kZW5zaXR5LCB0eXBlID0gJ3NjYXR0ZXInLCBtb2RlID0gJ2xpbmVzJywgDQogICAgICAgICAgICBuYW1lID0gJ1otZGlzdHJpYnV0aW9uIChOb3JtYWwpJywgbGluZSA9IGxpc3QoY29sb3IgPSAnYmx1ZScsIHdpZHRoID0gMykpICU+JQ0KICAjIEFkZCBULWRpc3RyaWJ1dGlvbiB0cmFjZXMNCiAgYWRkX3RyYWNlKHggPSB4LCB5ID0gdF9kZjUsIHR5cGUgPSAnc2NhdHRlcicsIG1vZGUgPSAnbGluZXMnLCANCiAgICAgICAgICAgIG5hbWUgPSAnVC1kaXN0cmlidXRpb24gKGRmPTUpJywgbGluZSA9IGxpc3QoY29sb3IgPSAncmVkJywgd2lkdGggPSAyLCBkYXNoID0gJ2Rhc2gnKSkgJT4lDQogIGFkZF90cmFjZSh4ID0geCwgeSA9IHRfZGYxMCwgdHlwZSA9ICdzY2F0dGVyJywgbW9kZSA9ICdsaW5lcycsIA0KICAgICAgICAgICAgbmFtZSA9ICdULWRpc3RyaWJ1dGlvbiAoZGY9MTApJywgbGluZSA9IGxpc3QoY29sb3IgPSAnZ3JlZW4nLCB3aWR0aCA9IDIsIGRhc2ggPSAnZG90JykpICU+JQ0KICBhZGRfdHJhY2UoeCA9IHgsIHkgPSB0X2RmMzAsIHR5cGUgPSAnc2NhdHRlcicsIG1vZGUgPSAnbGluZXMnLCANCiAgICAgICAgICAgIG5hbWUgPSAnVC1kaXN0cmlidXRpb24gKGRmPTMwKScsIGxpbmUgPSBsaXN0KGNvbG9yID0gJ29yYW5nZScsIHdpZHRoID0gMiwgZGFzaCA9ICdkYXNoZG90JykpICU+JQ0KICAjIExheW91dCBzZXR0aW5ncw0KICBsYXlvdXQodGl0bGUgPSAnQ29tcGFyaXNvbiBvZiBaIGFuZCBUIERpc3RyaWJ1dGlvbnMnLA0KICAgICAgICAgeGF4aXMgPSBsaXN0KHRpdGxlID0gJ1ZhbHVlJyksDQogICAgICAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAnRGVuc2l0eScpLA0KICAgICAgICAgbGVnZW5kID0gbGlzdCh0aXRsZSA9IGxpc3QodGV4dCA9ICdEaXN0cmlidXRpb25zJykpKQ0KDQojIERpc3BsYXkgdGhlIHBsb3QNCnBsb3QNCmBgYA0KDQpgYGB7cixlY2hvPUZBTFNFfQ0KIyBJbnN0YWxsIGFuZCBsb2FkIG5lY2Vzc2FyeSBwYWNrYWdlcyBpZiBub3QgYWxyZWFkeSBpbnN0YWxsZWQNCiMgaW5zdGFsbC5wYWNrYWdlcygicGxvdGx5IikNCmxpYnJhcnkocGxvdGx5KQ0KDQojIERhdGEgZm9yIGNvbmZpZGVuY2UgaW50ZXJ2YWxzDQpjb25maWRlbmNlX2xldmVscyA8LSBjKCI5MCUiLCAiOTUlIiwgIjk5JSIpDQpsb3dlcl9ib3VuZHMgPC0gYyg4LjI0MzUsIDguMTkxMiwgOC4wNzcyKQ0KdXBwZXJfYm91bmRzIDwtIGMoOC42NTY1LCA4LjcwODgsIDguODIyOCkNCnNhbXBsZV9tZWFuIDwtIDguNDUNCg0KIyBBc3N1bWVkIHBhcmFtZXRlcnMgYmFzZWQgb24gZGF0YSAoc2NhbGUg4omIIDAuMTE2LCBkZj0xMCBmb3IgdCkNCnNjYWxlIDwtIDAuMTE2ICAjIEFwcHJveGltYXRlIHN0YW5kYXJkIGVycm9yIChzIC8gc3FydChuKSkNCmRmIDwtIDEwICAjIERlZ3JlZXMgb2YgZnJlZWRvbSBmb3IgdC1kaXN0cmlidXRpb24NCg0KIyBEZWZpbmUgeCByYW5nZSBhcm91bmQgdGhlIG1lYW4NCnggPC0gc2VxKHNhbXBsZV9tZWFuIC0gNCpzY2FsZSwgc2FtcGxlX21lYW4gKyA0KnNjYWxlLCBsZW5ndGgub3V0ID0gMTAwMCkNCg0KIyBaLWRpc3RyaWJ1dGlvbiAoTm9ybWFsKSBkZW5zaXR5DQp6X2RlbnNpdHkgPC0gZG5vcm0oeCwgbWVhbiA9IHNhbXBsZV9tZWFuLCBzZCA9IHNjYWxlKQ0KDQojIFQtZGlzdHJpYnV0aW9uIGRlbnNpdHkNCnRfZGVuc2l0eSA8LSBkdCgoeCAtIHNhbXBsZV9tZWFuKS9zY2FsZSwgZGYgPSBkZikgLyBzY2FsZQ0KDQojIENyZWF0ZSB0aGUgcGxvdA0KcGxvdCA8LSBwbG90X2x5KCkNCg0KIyBBZGQgWi1kaXN0cmlidXRpb24gdHJhY2UNCnBsb3QgPC0gcGxvdCAlPiUgYWRkX3RyYWNlKHggPSB4LCB5ID0gel9kZW5zaXR5LCB0eXBlID0gJ3NjYXR0ZXInLCBtb2RlID0gJ2xpbmVzJywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gJ1otZGlzdHJpYnV0aW9uIChOb3JtYWwpJywgbGluZSA9IGxpc3QoY29sb3IgPSAnYmx1ZScsIHdpZHRoID0gMikpDQoNCiMgQWRkIFQtZGlzdHJpYnV0aW9uIHRyYWNlDQpwbG90IDwtIHBsb3QgJT4lIGFkZF90cmFjZSh4ID0geCwgeSA9IHRfZGVuc2l0eSwgdHlwZSA9ICdzY2F0dGVyJywgbW9kZSA9ICdsaW5lcycsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9ICdULWRpc3RyaWJ1dGlvbiAoZGY9MTApJywgbGluZSA9IGxpc3QoY29sb3IgPSAncmVkJywgd2lkdGggPSAyKSkNCg0KIyBBZGQgc2hhZGVkIGFyZWFzIGZvciBjb25maWRlbmNlIGludGVydmFscyAoZm9yIFotZGlzdHJpYnV0aW9uKQ0KZm9yIChpIGluIDE6bGVuZ3RoKGNvbmZpZGVuY2VfbGV2ZWxzKSkgew0KICAjIEZpbmQgaW5kaWNlcyBmb3Igc2hhZGluZw0KICBpZHggPC0geCA+PSBsb3dlcl9ib3VuZHNbaV0gJiB4IDw9IHVwcGVyX2JvdW5kc1tpXQ0KICB4X3NoYWRlIDwtIHhbaWR4XQ0KICB5X3NoYWRlIDwtIHpfZGVuc2l0eVtpZHhdDQogIA0KICBwbG90IDwtIHBsb3QgJT4lIGFkZF90cmFjZSh4ID0gYyh4X3NoYWRlLCByZXYoeF9zaGFkZSkpLCB5ID0gYyh5X3NoYWRlLCByZXAoMCwgbGVuZ3RoKHlfc2hhZGUpKSksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gJ3NjYXR0ZXInLCBtb2RlID0gJ2xpbmVzJywgZmlsbCA9ICd0b3plcm95JywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGxjb2xvciA9ICdyZ2JhKDAsMCwyNTUsMC4zKScsIGxpbmUgPSBsaXN0KGNvbG9yID0gJ3RyYW5zcGFyZW50JyksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBwYXN0ZShjb25maWRlbmNlX2xldmVsc1tpXSwgJ0NJIChaKScpLCBzaG93bGVnZW5kID0gVFJVRSkNCn0NCg0KIyBBZGQgc2hhZGVkIGFyZWFzIGZvciBjb25maWRlbmNlIGludGVydmFscyAoZm9yIFQtZGlzdHJpYnV0aW9uKQ0KZm9yIChpIGluIDE6bGVuZ3RoKGNvbmZpZGVuY2VfbGV2ZWxzKSkgew0KICAjIEZpbmQgaW5kaWNlcyBmb3Igc2hhZGluZw0KICBpZHggPC0geCA+PSBsb3dlcl9ib3VuZHNbaV0gJiB4IDw9IHVwcGVyX2JvdW5kc1tpXQ0KICB4X3NoYWRlIDwtIHhbaWR4XQ0KICB5X3NoYWRlIDwtIHRfZGVuc2l0eVtpZHhdDQogIA0KICBwbG90IDwtIHBsb3QgJT4lIGFkZF90cmFjZSh4ID0gYyh4X3NoYWRlLCByZXYoeF9zaGFkZSkpLCB5ID0gYyh5X3NoYWRlLCByZXAoMCwgbGVuZ3RoKHlfc2hhZGUpKSksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gJ3NjYXR0ZXInLCBtb2RlID0gJ2xpbmVzJywgZmlsbCA9ICd0b3plcm95JywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGxjb2xvciA9ICdyZ2JhKDI1NSwwLDAsMC4zKScsIGxpbmUgPSBsaXN0KGNvbG9yID0gJ3RyYW5zcGFyZW50JyksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBwYXN0ZShjb25maWRlbmNlX2xldmVsc1tpXSwgJ0NJIChUKScpLCBzaG93bGVnZW5kID0gVFJVRSkNCn0NCg0KIyBBZGQgdmVydGljYWwgbGluZXMgZm9yIHNhbXBsZSBtZWFuDQpwbG90IDwtIHBsb3QgJT4lIGFkZF90cmFjZSh4ID0gcmVwKHNhbXBsZV9tZWFuLCAyKSwgeSA9IGMoMCwgbWF4KGMoel9kZW5zaXR5LCB0X2RlbnNpdHkpKSksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9ICdzY2F0dGVyJywgbW9kZSA9ICdsaW5lcycsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZSA9IGxpc3QoY29sb3IgPSAnYmxhY2snLCB3aWR0aCA9IDIsIGRhc2ggPSAnZGFzaCcpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSAnU2FtcGxlIE1lYW4gKDguNDUgbWluKScpDQoNCiMgTGF5b3V0IHNldHRpbmdzDQpwbG90IDwtIHBsb3QgJT4lIGxheW91dCh0aXRsZSA9ICdEaXN0cmlidXNpIFogZGFuIFQgZGVuZ2FuIEludGVydmFsJywNCiAgICAgICAgICAgICAgICAgICAgICAgIHhheGlzID0gbGlzdCh0aXRsZSA9ICdUaW1lIChtZW5pdCknLCByYW5nZSA9IGMobWluKHgpLCBtYXgoeCkpKSwNCiAgICAgICAgICAgICAgICAgICAgICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICdEZW5zaXR5JyksDQogICAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQgPSBsaXN0KHRpdGxlID0gbGlzdCh0ZXh0ID0gJ0xlZ2VuZCcpKSkNCg0KIyBEaXNwbGF5IHRoZSBwbG90DQpwbG90DQpgYGANCg0KIyMjICAgIEZhY3RvcnMgSW5mbHVlbmNpbmcgSW50ZXJ2YWwgV2lkdGgNCg0KVGhlIHdpZHRoIG9mIGEgY29uZmlkZW5jZSBpbnRlcnZhbCBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBNYXJnaW4gb2YgRXJyb3IgKCRNRSA9IHReIFxjZG90IFxmcmFje3N9e1xzcXJ0e259fSQpLg0KDQotIENvbmZpZGVuY2UgTGV2ZWw6RWZmZWN0Og0KDQpBcyB0aGUgY29uZmlkZW5jZSBsZXZlbCBpbmNyZWFzZXMgKGUuZy4sIGZyb20gOTAlIHRvIDk5JSksIHRoZSBpbnRlcnZhbCBiZWNvbWVzIHdpZGVyLg0KDQpMb2dpYzogVG8gYmUgbW9yZSBjZXJ0YWluIHRoYXQgdGhlIGludGVydmFsIGNvbnRhaW5zIHRoZSB0cnVlIHBvcHVsYXRpb24gbWVhbiwgd2UgbXVzdCBlbmNvbXBhc3MgYSBsYXJnZXIgcmFuZ2Ugb2YgcG9zc2libGUgdmFsdWVzLiBUaGlzIGlzIHJlZmxlY3RlZCBpbiBhIGxhcmdlciBjcml0aWNhbCB2YWx1ZSAoJHReKiQpLg0KDQotIFNhbXBsZSBTaXplICgkbiQpOg0KDQpFZmZlY3Q6IEFzIHRoZSBzYW1wbGUgc2l6ZSBpbmNyZWFzZXMsIHRoZSBpbnRlcnZhbCBiZWNvbWVzIG5hcnJvd2VyIChtb3JlIHByZWNpc2UpLg0KDQpMb2dpYzogSW5jcmVhc2luZyAkbiQgcmVkdWNlcyB0aGUgU3RhbmRhcmQgRXJyb3IgKCRcZnJhY3tzfXtcc3FydHtufX0kKS4gV2l0aCBtb3JlIGRhdGEsIG91ciBlc3RpbWF0ZSBvZiB0aGUgbWVhbiBiZWNvbWVzIG1vcmUgc3RhYmxlIGFuZCByZWxpYWJsZSwgYWxsb3dpbmcgZm9yIGEgdGlnaHRlciByYW5nZSBvZiBlc3RpbWF0aW9uLg0KDQotLS0NCg0KIyMgICBDYXNlIFN0dWR5IDMgDQoNCioqQ29uZmlkZW5jZSBJbnRlcnZhbCBmb3IgYSBQcm9wb3J0aW9uLCBBL0IgVGVzdGluZzoqKiBBIGRhdGEgc2NpZW5jZSB0ZWFtIHJ1bnMgYW4gKipBL0IgdGVzdCoqIG9uIGEgbmV3ICpDYWxsLVRvLUFjdGlvbiAoQ1RBKSogYnV0dG9uIGRlc2lnbi4gVGhlIGV4cGVyaW1lbnQgeWllbGRzOg0KDQokJA0KXGJlZ2lue2VxbmFycmF5Kn0NCm4gJj0mIDQwMCBccXVhZCBcdGV4dHsodG90YWwgdXNlcnMpfSBcXA0KeCAmPSYgMTU2IFxxdWFkIFx0ZXh0eyh1c2VycyB3aG8gY2xpY2tlZCB0aGUgQ1RBKX0NClxlbmR7ZXFuYXJyYXkqfQ0KJCQNCg0KKipUYXNrczoqKg0KDQoxLiBDb21wdXRlIHRoZSAqKnNhbXBsZSBwcm9wb3J0aW9uKiogJFxoYXR7cH0kLg0KMi4gQ29tcHV0ZSBDb25maWRlbmNlIEludGVydmFscyBmb3IgdGhlIHByb3BvcnRpb24gYXQ6DQogICAtICQ5MFwlJA0KICAgLSAkOTVcJSQNCiAgIC0gJDk5XCUkDQozLiBWaXN1YWxpemUgYW5kIGNvbXBhcmUgdGhlIHRocmVlIGludGVydmFscy4NCjQuIEV4cGxhaW4gaG93IGNvbmZpZGVuY2UgbGV2ZWwgYWZmZWN0cyBkZWNpc2lvbi1tYWtpbmcgaW4gcHJvZHVjdCBleHBlcmltZW50cy4NCg0KLS0tDQoNClRoZSBnaXZlbiBkYXRhIGlzOg0KJCQNClxiZWdpbntlcW5hcnJheSp9DQpuICY9JiA0MDAgXHF1YWQgXHRleHR7KHRvdGFsIHVzZXJzKX0gXFwNCnggJj0mIDE1NiBccXVhZCBcdGV4dHsodXNlcnMgd2hvIGNsaWNrZWQgdGhlIENUQSl9DQpcZW5ke2VxbmFycmF5Kn0NCiQkDQoNCiMjIyAgICBDb21wdXRlIHRoZSBTYW1wbGUgUHJvcG9ydGlvbiAoJFxoYXR7cH0kKQ0KDQpUaGUgc2FtcGxlIHByb3BvcnRpb24gJFxoYXR7cH0kIGlzIHRoZSBwb2ludCBlc3RpbWF0ZSBmb3IgdGhlIHRydWUgcG9wdWxhdGlvbiBwcm9wb3J0aW9uLg0KDQokJA0KXGhhdHtwfSA9IFxmcmFje3h9e259ID0gXGZyYWN7MTU2fXs0MDB9ID0gMC4zOTAwDQokJA0KDQpUaGUgc2FtcGxlIHByb3BvcnRpb24gb2YgdXNlcnMgd2hvIGNsaWNrZWQgdGhlIG5ldyBDVEEgZGVzaWduIGlzICQzOS4wMFwlJC4NCg0KIyMjICBDb21wdXRlIENvbmZpZGVuY2UgSW50ZXJ2YWxzDQoNClRoZSBjb25maWRlbmNlIGludGVydmFscyAoQ0lzKSBhcmUgY2FsY3VsYXRlZCB1c2luZyB0aGUgZm9ybXVsYToNCiQkDQpcdGV4dHtDSX0gPSBcaGF0e3B9IFxwbSBaX3tcYWxwaGEvMn0gXGNkb3QgXHNxcnR7XGZyYWN7XGhhdHtwfSgxIC0gXGhhdHtwfSl9e259fQ0KJCQNCg0KVGhlIHN0YW5kYXJkIGVycm9yICgkXHRleHR7U0V9JCkgaXM6DQokJA0KXHRleHR7U0V9ID0gXHNxcnR7XGZyYWN7MC4zOTAwKDEgLSAwLjM5MDApfXs0MDB9fSBcYXBwcm94IDAuMDI0Mw0KJCQNCmBgYHtyLGVjaG89RkFMU0UsbWVzc2FnZT1GQUxTRSx3YXJuaW5nPUZBTFNFfQ0KIyBNZW1idWF0IHRhYmVsIGNvbmZpZGVuY2UgaW50ZXJ2YWwNCmNpX3RhYmxlIDwtIGRhdGEuZnJhbWUoDQogIENvbmZpZGVuY2VfTGV2ZWwgPSBjKCI5MCUiLCAiOTUlIiwgIjk5JSIpLA0KICBaX3Njb3JlID0gYygxLjY0NDksIDEuOTYwMCwgMi41NzU4KSwNCiAgTWFyZ2luX29mX0Vycm9yID0gYygwLjA0MDEsIDAuMDQ3OCwgMC4wNjI4KSwNCiAgQ29uZmlkZW5jZV9JbnRlcnZhbCA9IGMoDQogICAgIlswLjM0OTksIDAuNDMwMV0iLA0KICAgICJbMC4zNDIyLCAwLjQzNzhdIiwNCiAgICAiWzAuMzI3MiwgMC40NTI4XSINCiAgKQ0KKQ0KDQojIE1lbmFtcGlsa2FuIHRhYmVsDQpsaWJyYXJ5KGtuaXRyKQ0KDQprYWJsZSgNCiAgY2lfdGFibGUsDQogIGNhcHRpb24gPSAiQ29uZmlkZW5jZSBJbnRlcnZhbCB1bnR1ayBCZXJiYWdhaSBUaW5na2F0IEtlcGVyY2F5YWFuIiwNCiAgYWxpZ24gPSAiYyINCikNCg0KDQoNCmBgYA0KDQoNCiMjIyAgVmlzdWFsaXplIGFuZCBDb21wYXJlIHRoZSBUaHJlZSBJbnRlcnZhbHMNCg0KYGBge3IsZWNobz1GQUxTRSxtZXNzYWdlPUZBTFNFLHdhcm5pbmc9RkFMU0V9DQojIExvYWQgbGlicmFyeQ0KbGlicmFyeShwbG90bHkpDQoNCiMgRGF0YSBkaXN0cmlidXNpIFoNCnogPC0gc2VxKC00LCA0LCBsZW5ndGgub3V0ID0gMTAwMCkNCmRlbnNpdHkgPC0gZG5vcm0oeikNCg0KIyBNZW1idWF0IHBsb3QgZGFzYXINCnAgPC0gcGxvdF9seSgNCiAgeCA9IH56LA0KICB5ID0gfmRlbnNpdHksDQogIHR5cGUgPSAic2NhdHRlciIsDQogIG1vZGUgPSAibGluZXMiLA0KICBsaW5lID0gbGlzdCh3aWR0aCA9IDIpLA0KICBuYW1lID0gIkRpc3RyaWJ1c2kgTm9ybWFsIFN0YW5kYXIiDQopDQoNCiMgTWVuYW1iYWhrYW4gZ2FyaXMgWiB1bnR1ayBDb25maWRlbmNlIExldmVsDQpwIDwtIHAgJT4lDQogIGFkZF9zZWdtZW50cygNCiAgICB4ID0gLTEuNjQ0OSwgeGVuZCA9IC0xLjY0NDksDQogICAgeSA9IDAsIHllbmQgPSBkbm9ybSgtMS42NDQ5KSwNCiAgICBsaW5lID0gbGlzdChkYXNoID0gImRhc2giLCB3aWR0aCA9IDIpLA0KICAgIG5hbWUgPSAiOTAlIENJIg0KICApICU+JQ0KICBhZGRfc2VnbWVudHMoDQogICAgeCA9IDEuNjQ0OSwgeGVuZCA9IDEuNjQ0OSwNCiAgICB5ID0gMCwgeWVuZCA9IGRub3JtKDEuNjQ0OSksDQogICAgbGluZSA9IGxpc3QoZGFzaCA9ICJkYXNoIiwgd2lkdGggPSAyKSwNCiAgICBzaG93bGVnZW5kID0gRkFMU0UNCiAgKSAlPiUNCiAgYWRkX3NlZ21lbnRzKA0KICAgIHggPSAtMS45NjAwLCB4ZW5kID0gLTEuOTYwMCwNCiAgICB5ID0gMCwgeWVuZCA9IGRub3JtKC0xLjk2MDApLA0KICAgIGxpbmUgPSBsaXN0KGRhc2ggPSAiZG90Iiwgd2lkdGggPSAyKSwNCiAgICBuYW1lID0gIjk1JSBDSSINCiAgKSAlPiUNCiAgYWRkX3NlZ21lbnRzKA0KICAgIHggPSAxLjk2MDAsIHhlbmQgPSAxLjk2MDAsDQogICAgeSA9IDAsIHllbmQgPSBkbm9ybSgxLjk2MDApLA0KICAgIGxpbmUgPSBsaXN0KGRhc2ggPSAiZG90Iiwgd2lkdGggPSAyKSwNCiAgICBzaG93bGVnZW5kID0gRkFMU0UNCiAgKSAlPiUNCiAgYWRkX3NlZ21lbnRzKA0KICAgIHggPSAtMi41NzU4LCB4ZW5kID0gLTIuNTc1OCwNCiAgICB5ID0gMCwgeWVuZCA9IGRub3JtKC0yLjU3NTgpLA0KICAgIGxpbmUgPSBsaXN0KGRhc2ggPSAibG9uZ2Rhc2giLCB3aWR0aCA9IDIpLA0KICAgIG5hbWUgPSAiOTklIENJIg0KICApICU+JQ0KICBhZGRfc2VnbWVudHMoDQogICAgeCA9IDIuNTc1OCwgeGVuZCA9IDIuNTc1OCwNCiAgICB5ID0gMCwgeWVuZCA9IGRub3JtKDIuNTc1OCksDQogICAgbGluZSA9IGxpc3QoZGFzaCA9ICJsb25nZGFzaCIsIHdpZHRoID0gMiksDQogICAgc2hvd2xlZ2VuZCA9IEZBTFNFDQogICkNCg0KIyBMYXlvdXQNCnAgPC0gcCAlPiUNCiAgbGF5b3V0KA0KICAgIHRpdGxlID0gIkRpc3RyaWJ1c2kgWiBkZW5nYW4gQ29uZmlkZW5jZSBJbnRlcnZhbCIsDQogICAgeGF4aXMgPSBsaXN0KHRpdGxlID0gIlotc2NvcmUiKSwNCiAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiRGVuc2l0eSIpLA0KICAgIGxlZ2VuZCA9IGxpc3Qob3JpZW50YXRpb24gPSAiaCIsIHggPSAwLjEsIHkgPSAtMC4yKQ0KICApDQoNCiMgVGFtcGlsa2FuIHBsb3QNCnANCg0KYGBgDQpUaGUgY2hhcnQgYmVsb3cgdmlzdWFsaXplcyBob3cgdGhlIHdpZHRoIG9mIHRoZSBjb25maWRlbmNlIGludGVydmFsIGluY3JlYXNlcyB3aXRoIHRoZSBjb25maWRlbmNlIGxldmVsLg0KVGhlIHNhbXBsZSBwcm9wb3J0aW9uICgkXGhhdHtwfT0wLjM5MDAkKSBpcyB0aGUgY2VudGVyIG9mIGFsbCB0aHJlZSBpbnRlcnZhbHMgKG1hcmtlZCBieSB0aGUgZGlhbW9uZCkuDQoNCiMjIyAgRXhwbGFpbiBIb3cgQ29uZmlkZW5jZSBMZXZlbCBBZmZlY3RzIERlY2lzaW9uLU1ha2luZw0KDQpUaGUgY29uZmlkZW5jZSBsZXZlbCBkaXJlY3RseSBpbXBhY3RzIHRoZSBwcmVjaXNpb24gYW5kIGNlcnRhaW50eSBvZiB5b3VyIHJlc3VsdCwgd2hpY2ggaXMgY3J1Y2lhbCBpbiBwcm9kdWN0IGV4cGVyaW1lbnRhdGlvbiBsaWtlIEEvQiB0ZXN0aW5nLg0KYGBge3IsZWNobz1GQUxTRX0NCiMgTWVtYnVhdCB0YWJlbCBodWJ1bmdhbiBjb25maWRlbmNlIGxldmVsDQpjaV9yZWxhdGlvbiA8LSBkYXRhLmZyYW1lKA0KICBDb25maWRlbmNlX0xldmVsID0gYygiSGlnaGVyICg5OSUpIiwgIkxvd2VyICg5MCUpIiksDQogIEludGVydmFsX1dpZHRoID0gYygiV2lkZXIiLCAiTmFycm93ZXIiKSwNCiAgUHJlY2lzaW9uID0gYygiTGVzcyBwcmVjaXNlIiwgIk1vcmUgcHJlY2lzZSIpLA0KICBDZXJ0YWludHkgPSBjKCJNb3JlIGNlcnRhaW4iLCAiTGVzcyBjZXJ0YWluIiksDQogIFJpc2tfb2ZfVHlwZV9JX0Vycm9yID0gYygNCiAgICAiTG93ZXIgcmlzayBvZiBUeXBlIEkgZXJyb3IiLA0KICAgICJIaWdoZXIgcmlzayBvZiBUeXBlIEkgZXJyb3IiDQogICkNCikNCg0KIyBNZW5hbXBpbGthbiB0YWJlbA0KbGlicmFyeShrbml0cikNCg0Ka2FibGUoDQogIGNpX3JlbGF0aW9uLA0KICBjYXB0aW9uID0gIkh1YnVuZ2FuIENvbmZpZGVuY2UgTGV2ZWwgZGVuZ2FuIExlYmFyIEludGVydmFsLCBQcmVzaXNpLCBkYW4gUmlzaWtvIEVycm9yIiwNCiAgYWxpZ24gPSAiYyINCikNCg0KYGBgDQoNCi0gIDEuIERlZmluaW5nIGEgV2lubmVyIChTdGF0aXN0aWNhbCBTaWduaWZpY2FuY2UpOg0KDQpJbiBBL0IgdGVzdGluZywgYSBjb21tb24gZGVjaXNpb24gcnVsZSBpcyB0byBkZWNsYXJlIGEgIndpbm5lciIgaWYgdGhlIGNvbmZpZGVuY2UgaW50ZXJ2YWwgb2YgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgdHdvIHZhcmlhbnRzIGRvZXMgbm90IGluY2x1ZGUgemVyby4NCg0KLSAgMi4gSGlnaGVyIENvbmZpZGVuY2UgKCRcbWF0aGJmezk5XCV9JCk6DQoNClRoZSBpbnRlcnZhbCBpcyB2ZXJ5IHdpZGUsIG1ha2luZyBpdCBoYXJkZXIgdG8gZXhjbHVkZSBhIG51bGwgaHlwb3RoZXNpcyAoZS5nLiwgdGhhdCB0aGUgbmV3IGRlc2lnbiBpcyBubyBkaWZmZXJlbnQgdGhhbiB0aGUgb2xkIG9uZSkuDQpJdCByZXF1aXJlcyBhIG11Y2ggbGFyZ2VyIGRpZmZlcmVuY2UgaW4gcGVyZm9ybWFuY2UgdG8gYWNoaWV2ZSBzdGF0aXN0aWNhbCBzaWduaWZpY2FuY2UuIFdoaWxlIHRoaXMgaXMgdGhlIHNhZmVzdCBsZXZlbCwgaXQgb2Z0ZW4gbGVhZHMgdG8gaW5jb25jbHVzaXZlIHJlc3VsdHMsIHJlcXVpcmluZyBsb25nZXIgdGVzdGluZyB0aW1lcy4NCg0KLSAgMy4gTG93ZXIgQ29uZmlkZW5jZSAoJFxtYXRoYmZ7OTBcJX0kKToNCg0KVGhlIGludGVydmFsIGlzIG5hcnJvd2VyLCBtYWtpbmcgaXQgZWFzaWVyIHRvIGFjaGlldmUgc3RhdGlzdGljYWwgc2lnbmlmaWNhbmNlLiBIb3dldmVyLCB0aGlzIGluY3JlYXNlcyB0aGUgcmlzayBvZiBhIFR5cGUgSSBlcnJvciAoYSBGYWxzZSBQb3NpdGl2ZSnigJRkZWNsYXJpbmcgdGhlIG5ldyBDVEEgYSB3aW5uZXIgd2hlbiBpdCBpcyBhY3R1YWxseSBubyBiZXR0ZXIsIG9yIGV2ZW4gd29yc2UsIHRoYW4gdGhlIG9yaWdpbmFsLg0KDQotICA0LiBQcm9kdWN0IFN0YW5kYXJkOg0KDQpNb3N0IGRhdGEgc2NpZW5jZSBhbmQgcHJvZHVjdCB0ZWFtcyBkZWZhdWx0IHRvIGEgJDk1XCUkIGNvbmZpZGVuY2UgbGV2ZWwgKGNvcnJlc3BvbmRpbmcgdG8gYSAkXGFscGhhPTAuMDUkIHNpZ25pZmljYW5jZSBsZXZlbCkuIFRoaXMgaXMgY29uc2lkZXJlZCBhIGdvb2QgYmFsYW5jZSwgb2ZmZXJpbmcgYSByZWFzb25hYmxlIGxldmVsIG9mIGNlcnRhaW50eSAoJDk1XCUkIHN1cmUgdGhlIHRydWUgdmFsdWUgaXMgaW4gdGhlIHJhbmdlKSB3aXRob3V0IHJlcXVpcmluZyBhbiBleGNlc3NpdmVseSBsYXJnZSBzYW1wbGUgc2l6ZSBvciBsb25nIHRlc3QgZHVyYXRpb24gdGhhdCB3b3VsZCBiZSBuZWVkZWQgZm9yIGEgJDk5XCUkIGNvbmZpZGVuY2UgbGV2ZWwuDQpgYGB7cixlY2hvPUZBTFNFfQ0KIyBJbnN0YWxsIG5lY2Vzc2FyeSBwYWNrYWdlcyBpZiBub3QgYWxyZWFkeSBpbnN0YWxsZWQNCiMgaW5zdGFsbC5wYWNrYWdlcygicGxvdGx5IikNCg0KIyBMb2FkIHRoZSBwbG90bHkgbGlicmFyeQ0KbGlicmFyeShwbG90bHkpDQoNCiMgRGVmaW5lIHRoZSByYW5nZSBvZiB4IHZhbHVlcyBmb3IgdGhlIHBsb3QNCnggPC0gc2VxKC00LCA0LCBsZW5ndGgub3V0ID0gMTAwMCkNCg0KIyBDb21wdXRlIHRoZSBkZW5zaXR5IG9mIHRoZSBzdGFuZGFyZCBub3JtYWwgZGlzdHJpYnV0aW9uIChaLWRpc3RyaWJ1dGlvbikNCnpfZGVuc2l0eSA8LSBkbm9ybSh4LCBtZWFuID0gMCwgc2QgPSAxKQ0KDQojIENvbXB1dGUgdGhlIGRlbnNpdHkgb2YgdGhlIHQtZGlzdHJpYnV0aW9uIGZvciBkaWZmZXJlbnQgZGVncmVlcyBvZiBmcmVlZG9tDQp0X2RmXzUgPC0gZHQoeCwgZGYgPSA1KSAgIyB0LWRpc3RyaWJ1dGlvbiB3aXRoIDUgZGYNCnRfZGZfMTAgPC0gZHQoeCwgZGYgPSAxMCkgICMgdC1kaXN0cmlidXRpb24gd2l0aCAxMCBkZg0KdF9kZl8zMCA8LSBkdCh4LCBkZiA9IDMwKSAgIyB0LWRpc3RyaWJ1dGlvbiB3aXRoIDMwIGRmDQoNCiMgQ3JlYXRlIHRoZSBwbG90IHVzaW5nIHBsb3RseQ0KcGxvdCA8LSBwbG90X2x5KCkgJT4lDQogICMgQWRkIHRoZSBaLWRpc3RyaWJ1dGlvbiAobm9ybWFsKQ0KICBhZGRfdHJhY2UoeCA9IHgsIHkgPSB6X2RlbnNpdHksIHR5cGUgPSAnc2NhdHRlcicsIG1vZGUgPSAnbGluZXMnLCANCiAgICAgICAgICAgIG5hbWUgPSAnWi1kaXN0cmlidXRpb24gKE5vcm1hbCknLCBsaW5lID0gbGlzdChjb2xvciA9ICdibHVlJywgd2lkdGggPSAzKSkgJT4lDQogICMgQWRkIHQtZGlzdHJpYnV0aW9ucyB3aXRoIGRpZmZlcmVudCBkZg0KICBhZGRfdHJhY2UoeCA9IHgsIHkgPSB0X2RmXzUsIHR5cGUgPSAnc2NhdHRlcicsIG1vZGUgPSAnbGluZXMnLCANCiAgICAgICAgICAgIG5hbWUgPSAndC1kaXN0cmlidXRpb24gKGRmPTUpJywgbGluZSA9IGxpc3QoY29sb3IgPSAncmVkJywgd2lkdGggPSAyLCBkYXNoID0gJ2Rhc2gnKSkgJT4lDQogIGFkZF90cmFjZSh4ID0geCwgeSA9IHRfZGZfMTAsIHR5cGUgPSAnc2NhdHRlcicsIG1vZGUgPSAnbGluZXMnLCANCiAgICAgICAgICAgIG5hbWUgPSAndC1kaXN0cmlidXRpb24gKGRmPTEwKScsIGxpbmUgPSBsaXN0KGNvbG9yID0gJ2dyZWVuJywgd2lkdGggPSAyLCBkYXNoID0gJ2RvdCcpKSAlPiUNCiAgYWRkX3RyYWNlKHggPSB4LCB5ID0gdF9kZl8zMCwgdHlwZSA9ICdzY2F0dGVyJywgbW9kZSA9ICdsaW5lcycsIA0KICAgICAgICAgICAgbmFtZSA9ICd0LWRpc3RyaWJ1dGlvbiAoZGY9MzApJywgbGluZSA9IGxpc3QoY29sb3IgPSAnb3JhbmdlJywgd2lkdGggPSAyLCBkYXNoID0gJ2Rhc2hkb3QnKSkgJT4lDQogICMgTGF5b3V0IHNldHRpbmdzDQogIGxheW91dCh0aXRsZSA9ICdDb21wYXJpc29uIG9mIFotZGlzdHJpYnV0aW9uIGFuZCB0LWRpc3RyaWJ1dGlvbnMnLA0KICAgICAgICAgeGF4aXMgPSBsaXN0KHRpdGxlID0gJ3gnKSwNCiAgICAgICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICdEZW5zaXR5JyksDQogICAgICAgICBsZWdlbmQgPSBsaXN0KHggPSAwLjcsIHkgPSAwLjkpKQ0KDQojIERpc3BsYXkgdGhlIHBsb3QNCnBsb3QNCmBgYA0KDQotLS0NCg0KIyMgICBDYXNlIFN0dWR5IDQgDQoNCioqUHJlY2lzaW9uIENvbXBhcmlzb24gKFotVGVzdCB2cyB0LVRlc3QpOioqIFR3byBkYXRhIHRlYW1zIG1lYXN1cmUgKipBUEkgbGF0ZW5jeSAoaW4gbWlsbGlzZWNvbmRzKSoqIHVuZGVyIGRpZmZlcmVudCBjb25kaXRpb25zLg0KDQpcYmVnaW57ZXFuYXJyYXkqfQ0KXHRleHR7VGVhbSBBOn0gXFwNCm4gJj0mIDM2IFxxdWFkIFx0ZXh0eyhzYW1wbGUgc2l6ZSl9IFxcDQpcYmFye3h9ICY9JiAyMTAgXHF1YWQgXHRleHR7KHNhbXBsZSBtZWFuKX0gXFwNClxzaWdtYSAmPSYgMjQgXHF1YWQgXHRleHR7KGtub3duIHBvcHVsYXRpb24gc3RhbmRhcmQgZGV2aWF0aW9uKX0gXFxbNnB0XQ0KDQpcdGV4dHtUZWFtIEI6fSBcXA0KbiAmPSYgMzYgXHF1YWQgXHRleHR7KHNhbXBsZSBzaXplKX0gXFwNClxiYXJ7eH0gJj0mIDIxMCBccXVhZCBcdGV4dHsoc2FtcGxlIG1lYW4pfSBcXA0KcyAmPSYgMjQgXHF1YWQgXHRleHR7KHNhbXBsZSBzdGFuZGFyZCBkZXZpYXRpb24pfQ0KXGVuZHtlcW5hcnJheSp9DQoNCioqVGFza3MqKg0KDQoxLiBJZGVudGlmeSB0aGUgc3RhdGlzdGljYWwgdGVzdCB1c2VkIGJ5IGVhY2ggdGVhbS4NCjIuIENvbXB1dGUgQ29uZmlkZW5jZSBJbnRlcnZhbHMgZm9yICoqOTAlLCA5NSUsIGFuZCA5OSUqKi4NCjMuIENyZWF0ZSBhIHZpc3VhbGl6YXRpb24gY29tcGFyaW5nIGFsbCBpbnRlcnZhbHMuDQo0LiBFeHBsYWluIHdoeSB0aGUgKippbnRlcnZhbCB3aWR0aHMgZGlmZmVyKiosIGV2ZW4gd2l0aCBzaW1pbGFyIGRhdGEuDQoNCi0tLQ0KDQoNCiMjIyAgIFN0YXRpc3RpY2FsIFRlc3QgSWRlbnRpZmljYXRpb24NCg0KVGhlIGNob2ljZSBvZiBzdGF0aXN0aWNhbCB0ZXN0IGZvciB0aGUgbWVhbiBkZXBlbmRzIG9uIHdoZXRoZXIgdGhlIHBvcHVsYXRpb24gc3RhbmRhcmQgZGV2aWF0aW9uICgkXHNpZ21hJCkgaXMga25vd24gYW5kIHRoZSBzYW1wbGUgc2l6ZSAoJG4kKS4NCg0KYGBge3IsZWNobz1GQUxTRX0NCiMgTWVtYnVhdCB0YWJlbCBwZW1pbGloYW4gdWppDQp0ZXN0X3NlbGVjdGlvbiA8LSBkYXRhLmZyYW1lKA0KICBUZWFtID0gYygiVGVhbSBBIiwgIlRlYW0gQiIpLA0KICBHaXZlbl9TdGFuZGFyZF9EZXZpYXRpb24gPSBjKA0KICAgICLPgyA9IDI0IChLbm93biBwb3B1bGF0aW9uIFNEKSIsDQogICAgInMgPSAyNCAoU2FtcGxlIFNEKSINCiAgKSwNCiAgVGVzdF9Vc2VkID0gYygNCiAgICAiWi1UZXN0IChvciBaLWludGVydmFsKSIsDQogICAgInQtVGVzdCAob3IgdC1pbnRlcnZhbCkiDQogICksDQogIEp1c3RpZmljYXRpb24gPSBjKA0KICAgICJTaW5jZSB0aGUgcG9wdWxhdGlvbiBzdGFuZGFyZCBkZXZpYXRpb24gKM+DKSBpcyBrbm93biBhbmQgdGhlIHNhbXBsZSBzaXplIChuID0gMzYpIGlzIGxhcmdlIChuIOKJpSAzMCksIHRoZSBaLWRpc3RyaWJ1dGlvbiBpcyBhcHByb3ByaWF0ZS4iLA0KICAgICJTaW5jZSB0aGUgcG9wdWxhdGlvbiBzdGFuZGFyZCBkZXZpYXRpb24gKM+DKSBpcyB1bmtub3duIGFuZCBvbmx5IHRoZSBzYW1wbGUgc3RhbmRhcmQgZGV2aWF0aW9uIChzKSBpcyBhdmFpbGFibGUsIHRoZSB0LWRpc3RyaWJ1dGlvbiBtdXN0IGJlIHVzZWQuIg0KICApDQopDQoNCiMgTWVuYW1waWxrYW4gdGFiZWwNCmxpYnJhcnkoa25pdHIpDQoNCmthYmxlKA0KICB0ZXN0X3NlbGVjdGlvbiwNCiAgY2FwdGlvbiA9ICJQZW1pbGloYW4gVWppIFN0YXRpc3RpayBCZXJkYXNhcmthbiBJbmZvcm1hc2kgU2ltcGFuZ2FuIEJha3UiLA0KICBhbGlnbiA9ICJjIg0KKQ0KYGBgDQojIyMgICAgQ29uZmlkZW5jZSBJbnRlcnZhbCBDb21wdXRhdGlvbg0KDQpUaGUgZm9ybXVsYSBmb3IgdGhlIENvbmZpZGVuY2UgSW50ZXJ2YWwgKENJKSBmb3IgdGhlIHBvcHVsYXRpb24gbWVhbiAoJFxtdSQpIGlzOg0KDQpUZWFtIEEgKFotSW50ZXJ2YWwpOiAkJA0KXHRleHR7Q0l9ID0gXGJhcnt4fSBccG0gWl4qIFxsZWZ0KFxmcmFje1xzaWdtYX17XHNxcnR7bn19XHJpZ2h0KQ0KJCQNCg0KVGVhbSBCICh0LUludGVydmFsKTogJCQNClx0ZXh0e0NJfSA9IFxiYXJ7eH0gXHBtIHReKiBcbGVmdChcZnJhY3tzfXtcc3FydHtufX1ccmlnaHQpDQokJA0KDQpDb21tb24gUGFyYW1ldGVyczoNClxiZWdpbntlcW5hcnJheSp9DQpcdGV4dHtUZWFtIEE6fSBcXA0KbiAmPSYgMzYgXHF1YWQgXHRleHR7KHNhbXBsZSBzaXplKX0gXFwNClxiYXJ7eH0gJj0mIDIxMCBccXVhZCBcdGV4dHsoc2FtcGxlIG1lYW4pfSBcXA0KXHNpZ21hICY9JiAyNCBccXVhZCBcdGV4dHsoa25vd24gcG9wdWxhdGlvbiBzdGFuZGFyZCBkZXZpYXRpb24pfSBcXFs2cHRdDQoNClx0ZXh0e1RlYW0gQjp9IFxcDQpuICY9JiAzNiBccXVhZCBcdGV4dHsoc2FtcGxlIHNpemUpfSBcXA0KXGJhcnt4fSAmPSYgMjEwIFxxdWFkIFx0ZXh0eyhzYW1wbGUgbWVhbil9IFxcDQpzICY9JiAyNCBccXVhZCBcdGV4dHsoc2FtcGxlIHN0YW5kYXJkIGRldmlhdGlvbil9DQpcXFs2cHRdXGVuZHtlcW5hcnJheSp9DQoNCg0KU3RhbmRhcmQgRXJyb3IgKFNFKToNClxiZWdpbntlcW5hcnJheSp9XHRleHR7U0V9ID0gXGZyYWN7XHNpZ21hfXtcc3FydHtufX0gPSBcZnJhY3syNH17XHNxcnR7MzZ9fSA9IFxmcmFjezI0fXs2fSA9IDQNClxlbmR7ZXFuYXJyYXkqfQ0KDQoNCioqVGVhbSBBIChaLUludGVydmFsKTogJFxzaWdtYSQgaXMga25vd25XZSB1c2UgdGhlIGNyaXRpY2FsIFotdmFsdWVzICgkWiQpIGZvciB0aGUgc3BlY2lmaWVkIGNvbmZpZGVuY2UgbGV2ZWxzLioqDQoNCmBgYHtyLGVjaG89RkFMU0V9DQojIE1lbWJ1YXQgdGFiZWwgY29uZmlkZW5jZSBpbnRlcnZhbA0KY2lfdGFibGVfenN0YXIgPC0gZGF0YS5mcmFtZSgNCiAgQ29uZmlkZW5jZV9MZXZlbCA9IGMoIjkwJSIsICI5NSUiLCAiOTklIiksDQogIFpfQ3JpdGljYWxfVmFsdWUgPSBjKDEuNjQ1LCAxLjk2MCwgMi41NzYpLA0KICBNYXJnaW5fb2ZfRXJyb3IgPSBjKA0KICAgICIxLjY0NSDDlyA0ID0gNi41OCIsDQogICAgIjEuOTYwIMOXIDQgPSA3Ljg0IiwNCiAgICAiMi41NzYgw5cgNCA9IDEwLjMwIg0KICApLA0KICBDb25maWRlbmNlX0ludGVydmFsID0gYygNCiAgICAiWzIwMy40MiwgMjE2LjU4XSIsDQogICAgIlsyMDIuMTYsIDIxNy44NF0iLA0KICAgICJbMTk5LjcwLCAyMjAuMzBdIg0KICApLA0KICBJbnRlcnZhbF9XaWR0aCA9IGMoMTMuMTYsIDE1LjY4LCAyMC42MCkNCikNCg0KIyBNZW5hbXBpbGthbiB0YWJlbA0KbGlicmFyeShrbml0cikNCg0Ka2FibGUoDQogIGNpX3RhYmxlX3pzdGFyLA0KICBjYXB0aW9uID0gIkNvbmZpZGVuY2UgSW50ZXJ2YWwgZGVuZ2FuIE1hcmdpbiBvZiBFcnJvciAoWiogw5cgNCkiLA0KICBhbGlnbiA9ICJjIg0KKQ0KYGBgDQoNCioqVGVhbSBCICh0LUludGVydmFsKTogJFxzaWdtYSQgaXMgdW5rbm93bldlIHVzZSB0aGUgY3JpdGljYWwgdC12YWx1ZXMgKCR0JCkgd2l0aCBkZWdyZWVzIG9mIGZyZWVkb20gKCRkZiQpICQ9bi0xPTM2LTE9MzUkKioNCg0KYGBge3IsZWNobz1GQUxTRX0NCiMgTWVtYnVhdCB0YWJlbCBjb25maWRlbmNlIGludGVydmFsIGJlcmJhc2lzIHQNCmNpX3RhYmxlX3RzdGFyIDwtIGRhdGEuZnJhbWUoDQogIENvbmZpZGVuY2VfTGV2ZWwgPSBjKCI5MCUiLCAiOTUlIiwgIjk5JSIpLA0KICB0X0NyaXRpY2FsX1ZhbHVlX2RmMzUgPSBjKDEuNjkwLCAyLjAzMCwgMi43MjQpLA0KICBNYXJnaW5fb2ZfRXJyb3IgPSBjKA0KICAgICIxLjY5MCDDlyA0ID0gNi43NiIsDQogICAgIjIuMDMwIMOXIDQgPSA4LjEyIiwNCiAgICAiMi43MjQgw5cgNCA9IDEwLjkwIg0KICApLA0KICBDb25maWRlbmNlX0ludGVydmFsID0gYygNCiAgICAiWzIwMy4yNCwgMjE2Ljc2XSIsDQogICAgIlsyMDEuODgsIDIxOC4xMl0iLA0KICAgICJbMTk5LjEwLCAyMjAuOTBdIg0KICApLA0KICBJbnRlcnZhbF9XaWR0aCA9IGMoMTMuNTIsIDE2LjI0LCAyMS44MCkNCikNCg0KIyBNZW5hbXBpbGthbiB0YWJlbA0KbGlicmFyeShrbml0cikNCg0Ka2FibGUoDQogIGNpX3RhYmxlX3RzdGFyLA0KICBjYXB0aW9uID0gIkNvbmZpZGVuY2UgSW50ZXJ2YWwgTWVuZ2d1bmFrYW4gdC1EaXN0cmlidXRpb24gKGRmID0gMzUpIiwNCiAgYWxpZ24gPSAiYyINCikNCg0KYGBgDQoNCg0KIyMjICAgIEludGVydmFsIENvbXBhcmlzb24gVmlzdWFsaXphdGlvbg0KDQpUaGUgdmlzdWFsaXphdGlvbiB3b3VsZCBzaG93IHRoYXQgZm9yIGV2ZXJ5IGNvbmZpZGVuY2UgbGV2ZWw6DQoNClRoZSB0LWludGVydmFscyAoVGVhbSBCKSBhcmUgc2xpZ2h0bHkgd2lkZXIgdGhhbiB0aGUgWi1pbnRlcnZhbHMgKFRlYW0gQSkuDQpBbGwgaW50ZXJ2YWxzIGFyZSBjZW50ZXJlZCBhdCB0aGUgc2FtcGxlIG1lYW4gb2YgMjEwIG1zLg0KVGhlIHdpZHRoIG9mIHRoZSBpbnRlcnZhbHMgaW5jcmVhc2VzIGFzIHRoZSBjb25maWRlbmNlIGxldmVsIGluY3JlYXNlcyAoZS5nLiwgdGhlIDk5JSBpbnRlcnZhbCBpcyB3aWRlc3QsIHRoZSA5MCUgaXMgbmFycm93ZXN0KS4NCg0KYGBge3IsZWNobz1GQUxTRSxtZXNzYWdlPUZBTFNFLHdhcm5pbmc9RkFMU0V9DQojIExvYWQgbmVjZXNzYXJ5IGxpYnJhcmllcw0KbGlicmFyeShwbG90bHkpDQpsaWJyYXJ5KGRwbHlyKQ0KDQojIERhdGEgZnJvbSB0aGUgY2FzZQ0KbWVhbl92YWwgPC0gMjEwDQpuIDwtIDM2DQpzaWdtYSA8LSAyNCAgIyBGb3IgVGVhbSBBIChaLWRpc3RyaWJ1dGlvbikNCnMgPC0gMjQgICAgICAjIEZvciBUZWFtIEIgKHQtZGlzdHJpYnV0aW9uKQ0KZGYgPC0gbiAtIDEgICMgMzUgZm9yIHQtZGlzdHJpYnV0aW9uDQoNCiMgQ29uZmlkZW5jZSBsZXZlbHMNCmNvbmZfbGV2ZWxzIDwtIGMoMC45MCwgMC45NSwgMC45OSkNCg0KIyBaLXNjb3JlcyBhbmQgdC1zY29yZXMNCnpfc2NvcmVzIDwtIHFub3JtKCgxICsgY29uZl9sZXZlbHMpIC8gMikNCnRfc2NvcmVzIDwtIHF0KCgxICsgY29uZl9sZXZlbHMpIC8gMiwgZGYpDQoNCiMgQ2FsY3VsYXRlIGludGVydmFscw0KaW50ZXJ2YWxzIDwtIGRhdGEuZnJhbWUoDQogIGNvbmYgPSByZXAoY29uZl9sZXZlbHMsIGVhY2ggPSAyKSwNCiAgdHlwZSA9IHJlcChjKCJaIChUZWFtIEEpIiwgInQgKFRlYW0gQikiKSwgdGltZXMgPSBsZW5ndGgoY29uZl9sZXZlbHMpKSwNCiAgbG93ZXIgPSBudW1lcmljKGxlbmd0aChjb25mX2xldmVscykgKiAyKSwNCiAgdXBwZXIgPSBudW1lcmljKGxlbmd0aChjb25mX2xldmVscykgKiAyKQ0KKQ0KDQpmb3IgKGkgaW4gMTpsZW5ndGgoY29uZl9sZXZlbHMpKSB7DQogIGNvbmYgPC0gY29uZl9sZXZlbHNbaV0NCiAgel9tYXJnaW4gPC0gel9zY29yZXNbaV0gKiAoc2lnbWEgLyBzcXJ0KG4pKQ0KICB0X21hcmdpbiA8LSB0X3Njb3Jlc1tpXSAqIChzIC8gc3FydChuKSkNCiAgaW50ZXJ2YWxzJGxvd2VyWyhpLTEpKjIgKyAxXSA8LSBtZWFuX3ZhbCAtIHpfbWFyZ2luDQogIGludGVydmFscyR1cHBlclsoaS0xKSoyICsgMV0gPC0gbWVhbl92YWwgKyB6X21hcmdpbg0KICBpbnRlcnZhbHMkbG93ZXJbKGktMSkqMiArIDJdIDwtIG1lYW5fdmFsIC0gdF9tYXJnaW4NCiAgaW50ZXJ2YWxzJHVwcGVyWyhpLTEpKjIgKyAyXSA8LSBtZWFuX3ZhbCArIHRfbWFyZ2luDQp9DQoNCiMgQ3JlYXRlIHRoZSBpbnRlcnZhbCBjb21wYXJpc29uIHBsb3QgdXNpbmcgUGxvdGx5DQpmaWdfaW50ZXJ2YWxzIDwtIHBsb3RfbHkoDQogIGRhdGEgPSBpbnRlcnZhbHMsDQogIHggPSB+bG93ZXIsDQogIHkgPSB+ZmFjdG9yKGNvbmYsIGxldmVscyA9IHNvcnQoY29uZl9sZXZlbHMsIGRlY3JlYXNpbmcgPSBUUlVFKSksDQogIGNvbG9yID0gfnR5cGUsDQogIGNvbG9ycyA9IGMoIlogKFRlYW0gQSkiID0gImJsdWUiLCAidCAoVGVhbSBCKSIgPSAicmVkIiksDQogIHR5cGUgPSAic2NhdHRlciIsDQogIG1vZGUgPSAibGluZXMrbWFya2VycyIsDQogIGxpbmUgPSBsaXN0KHdpZHRoID0gNCksDQogIG1hcmtlciA9IGxpc3Qoc2l6ZSA9IDgpDQopICU+JQ0KICBhZGRfdHJhY2UoDQogICAgeCA9IH51cHBlciwNCiAgICB5ID0gfmZhY3Rvcihjb25mLCBsZXZlbHMgPSBzb3J0KGNvbmZfbGV2ZWxzLCBkZWNyZWFzaW5nID0gVFJVRSkpLA0KICAgIGNvbG9yID0gfnR5cGUsDQogICAgbW9kZSA9ICJsaW5lcyttYXJrZXJzIiwNCiAgICBsaW5lID0gbGlzdCh3aWR0aCA9IDQpLA0KICAgIG1hcmtlciA9IGxpc3Qoc2l6ZSA9IDgpLA0KICAgIHNob3dsZWdlbmQgPSBGQUxTRQ0KICApICU+JQ0KICBsYXlvdXQoDQogICAgdGl0bGUgPSAiQ29uZmlkZW5jZSBJbnRlcnZhbCBDb21wYXJpc29uOiBaIChUZWFtIEEpIHZzIHQgKFRlYW0gQikiLA0KICAgIHhheGlzID0gbGlzdCh0aXRsZSA9ICJBUEkgTGF0ZW5jeSAobXMpIiwgcmFuZ2UgPSBjKDE5NSwgMjI1KSksDQogICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gIkNvbmZpZGVuY2UgTGV2ZWwiKSwNCiAgICBhbm5vdGF0aW9ucyA9IGxpc3QoDQogICAgICBsaXN0KHggPSBtZWFuX3ZhbCwgeSA9IDAuNSwgdGV4dCA9ICJTYW1wbGUgTWVhbjogMjEwIG1zIiwgc2hvd2Fycm93ID0gRkFMU0UsIHhyZWYgPSAieCIsIHlyZWYgPSAicGFwZXIiLCBmb250ID0gbGlzdChzaXplID0gMTIpKQ0KICAgICkNCiAgKQ0KDQojIE5vdywgY3JlYXRlIGEgZGlzdHJpYnV0aW9uIHBsb3QgZm9yIFogYW5kIHQgKHNhbXBsaW5nIGRpc3RyaWJ1dGlvbnMgb2YgdGhlIG1lYW4pDQp4X3ZhbHMgPC0gc2VxKDE5MCwgMjMwLCBsZW5ndGgub3V0ID0gMTAwMCkNCnNlIDwtIHNpZ21hIC8gc3FydChuKSAgIyBTdGFuZGFyZCBlcnJvciBmb3IgYm90aCAoc2luY2Ugc2lnbWEgPSBzID0gMjQpDQp6X2RlbnNpdHkgPC0gZG5vcm0oeF92YWxzLCBtZWFuID0gbWVhbl92YWwsIHNkID0gc2UpDQp0X2RlbnNpdHkgPC0gZHQoKHhfdmFscyAtIG1lYW5fdmFsKSAvIHNlLCBkZikgLyBzZSAgIyBTY2FsZWQgdC1kZW5zaXR5DQoNCmRpc3RfZGF0YSA8LSBkYXRhLmZyYW1lKA0KICB4ID0gcmVwKHhfdmFscywgMiksDQogIGRlbnNpdHkgPSBjKHpfZGVuc2l0eSwgdF9kZW5zaXR5KSwNCiAgdHlwZSA9IHJlcChjKCJaIERpc3RyaWJ1dGlvbiAoVGVhbSBBKSIsICJ0IERpc3RyaWJ1dGlvbiAoVGVhbSBCKSIpLCBlYWNoID0gbGVuZ3RoKHhfdmFscykpDQopDQoNCmZpZ19kaXN0IDwtIHBsb3RfbHkoDQogIGRhdGEgPSBkaXN0X2RhdGEsDQogIHggPSB+eCwNCiAgeSA9IH5kZW5zaXR5LA0KICBjb2xvciA9IH50eXBlLA0KICBjb2xvcnMgPSBjKCJaIERpc3RyaWJ1dGlvbiAoVGVhbSBBKSIgPSAiYmx1ZSIsICJ0IERpc3RyaWJ1dGlvbiAoVGVhbSBCKSIgPSAicmVkIiksDQogIHR5cGUgPSAic2NhdHRlciIsDQogIG1vZGUgPSAibGluZXMiLA0KICBsaW5lID0gbGlzdCh3aWR0aCA9IDIpDQopICU+JQ0KICBsYXlvdXQoDQogICAgdGl0bGUgPSAiU2FtcGxpbmcgRGlzdHJpYnV0aW9uczogWiB2cyB0IiwNCiAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiU2FtcGxlIE1lYW4gKG1zKSIsIHJhbmdlID0gYygxOTAsIDIzMCkpLA0KICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICJEZW5zaXR5IikNCiAgKQ0KDQojIENvbWJpbmUgYm90aCBwbG90cyBpbnRvIGEgc3VicGxvdCBmb3IgYSBjb21wcmVoZW5zaXZlIHZpc3VhbGl6YXRpb24NCmZpZyA8LSBzdWJwbG90KGZpZ19kaXN0LCBmaWdfaW50ZXJ2YWxzLCBucm93cyA9IDIsIHNoYXJlWCA9IEZBTFNFLCB0aXRsZVkgPSBUUlVFKSAlPiUNCiAgbGF5b3V0KA0KICAgIHRpdGxlID0gIkRpc3RyaWJ1dGlvbiBhbmQgSW50ZXJ2YWwgQ29tcGFyaXNvbjogWiB2cyB0IERpc3RyaWJ1dGlvbnMiLA0KICAgIHNob3dsZWdlbmQgPSBUUlVFDQogICkNCg0KIyBEaXNwbGF5IHRoZSBwbG90DQpmaWcNCmBgYA0KDQojIyMgICAgRXhwbGFuYXRpb24gb2YgSW50ZXJ2YWwgV2lkdGggRGlmZmVyZW5jZQ0KDQpUaGUgaW50ZXJ2YWwgd2lkdGhzIGRpZmZlciBiZWNhdXNlIG9mIHRoZSB1bmRlcmx5aW5nIHByb2JhYmlsaXR5IGRpc3RyaWJ1dGlvbnMgdXNlZDogdGhlIFN0YW5kYXJkIE5vcm1hbCAoWikgRGlzdHJpYnV0aW9uIHZlcnN1cyB0aGUgU3R1ZGVudCdzIHQtRGlzdHJpYnV0aW9uLg0KDQojIyMjICAgICRcc2lnbWEkIEtub3duIChUZWFtIEEgJFxyaWdodGFycm93JCBaLVRlc3QpDQoNCi0gVGhlIFotdGVzdCBpcyB1c2VkIHdoZW4gdGhlIHBvcHVsYXRpb24gc3RhbmRhcmQgZGV2aWF0aW9uICgkXHNpZ21hJCkgaXMga25vd24uDQoNCi0gU2luY2UgJFxzaWdtYSQgaXMgYSBmaXhlZCwga25vd24gdmFsdWUsIHRoZSBlc3RpbWF0ZSBvZiB0aGUgc3RhbmRhcmQgZXJyb3IgKCRcc2lnbWEvXHNxcnR7bn0kKSBpcyBoaWdobHkgY2VydGFpbiBhbmQgZG9lcyBub3QgYWRkIGV4dHJhIHZhcmlhYmlsaXR5IHRvIHRoZSBhbmFseXNpcy4NCg0KLSBUaGUgY3JpdGljYWwgJFpeJCB2YWx1ZXMgYXJlIGZpeGVkIGJhc2VkIG9uIHRoZSBjb25maWRlbmNlIGxldmVsLg0KDQojIyMjICAgICRcc2lnbWEkIFVua25vd24gKFRlYW0gQiAkXHJpZ2h0YXJyb3ckIHQtVGVzdCkNCg0KLSBUaGUgdC10ZXN0IGlzIHVzZWQgd2hlbiB0aGUgcG9wdWxhdGlvbiBzdGFuZGFyZCBkZXZpYXRpb24gKCRcc2lnbWEkKSBpcyB1bmtub3duLCBhbmQgd2UgbXVzdCBzdWJzdGl0dXRlIHRoZSBzYW1wbGUgc3RhbmRhcmQgZGV2aWF0aW9uICgkcyQpIGFzIGFuIGVzdGltYXRlLg0KDQotIFRoZSBzYW1wbGUgc3RhbmRhcmQgZGV2aWF0aW9uICgkcyQpIGlzIGl0c2VsZiBhbiBlc3RpbWF0ZSB0aGF0IHZhcmllcyBmcm9tIHNhbXBsZSB0byBzYW1wbGUuIFRoaXMgaW50cm9kdWNlcyBhbiBleHRyYSBzb3VyY2Ugb2YgdW5jZXJ0YWludHkgaW50byB0aGUgc3RhbmRhcmQgZXJyb3IgZXN0aW1hdGUuDQoNCi0gVG8gYWNjb3VudCBmb3IgdGhpcyBhZGRlZCB1bmNlcnRhaW50eSwgdGhlIHQtZGlzdHJpYnV0aW9uIGhhcyBoZWF2aWVyIHRhaWxzIChtb3JlIHNwcmVhZCBvdXQpIHRoYW4gdGhlIFotZGlzdHJpYnV0aW9uLg0KDQotIFRoaXMgcmVzdWx0cyBpbiBsYXJnZXIgY3JpdGljYWwgdmFsdWVzICgkdCA+IFokKSBhbmQsIGNvbnNlcXVlbnRseSwgYSBsYXJnZXIgTWFyZ2luIG9mIEVycm9yIChNRSkgYW5kIHdpZGVyIGNvbmZpZGVuY2UgaW50ZXJ2YWxzIGZvciB0aGUgdC10ZXN0IGNvbXBhcmVkIHRvIHRoZSBaLXRlc3QgYXQgdGhlIHNhbWUgY29uZmlkZW5jZSBsZXZlbC4NCg0KSW4gc3VtbWFyeTogVGhlIHQtdGVzdCByZXF1aXJlcyBhIHdpZGVyIGludGVydmFsIChpcyBsZXNzIHByZWNpc2UpIHRvIGFjaGlldmUgdGhlIHNhbWUgY29uZmlkZW5jZSBsZXZlbCBhcyB0aGUgWi10ZXN0IGJlY2F1c2UgaXQgbXVzdCBjb21wZW5zYXRlIGZvciB0aGUgYWRkaXRpb25hbCB1bmNlcnRhaW50eSBpbnRyb2R1Y2VkIGJ5IGVzdGltYXRpbmcgdGhlIHBvcHVsYXRpb24gc3RhbmRhcmQgZGV2aWF0aW9uICgkXHNpZ21hJCkgd2l0aCB0aGUgc2FtcGxlIHN0YW5kYXJkIGRldmlhdGlvbiAoJHMkKS4NCg0KDQotLS0NCg0KIyMgICAgQ2FzZSBTdHVkeSA1DQoNCioqT25lLVNpZGVkIENvbmZpZGVuY2UgSW50ZXJ2YWw6KiogQSAqKlNvZnR3YXJlIGFzIGEgU2VydmljZSAoU2FhUykqKiBjb21wYW55IHdhbnRzIHRvIGVuc3VyZSB0aGF0ICoqYXQgbGVhc3QgNzAlIG9mIHdlZWtseSBhY3RpdmUgdXNlcnMqKiB1dGlsaXplIGEgcHJlbWl1bSBmZWF0dXJlLg0KDQpGcm9tIHRoZSBleHBlcmltZW50Og0KDQokJA0KXGJlZ2lue2VxbmFycmF5Kn0NCm4gJj0mIDI1MCBccXVhZCBcdGV4dHsodG90YWwgdXNlcnMpfSBcXA0KeCAmPSYgMTg1IFxxdWFkIFx0ZXh0eyhhY3RpdmUgcHJlbWl1bSB1c2Vycyl9DQpcZW5ke2VxbmFycmF5Kn0NCiQkDQoNCk1hbmFnZW1lbnQgaXMgb25seSBpbnRlcmVzdGVkIGluIHRoZSAqKmxvd2VyIGJvdW5kKiogb2YgdGhlIGVzdGltYXRlLg0KDQoqKlRhc2tzOioqDQoNCjEuIElkZW50aWZ5IHRoZSAqKnR5cGUgb2YgQ29uZmlkZW5jZSBJbnRlcnZhbCoqIGFuZCB0aGUgYXBwcm9wcmlhdGUgdGVzdC4NCjIuIENvbXB1dGUgdGhlICoqb25lLXNpZGVkIGxvd2VyIENvbmZpZGVuY2UgSW50ZXJ2YWwqKiBhdDoNCiAgIC0gJDkwXCUkDQogICAtICQ5NVwlJA0KICAgLSAkOTlcJSQNCjMuIFZpc3VhbGl6ZSB0aGUgbG93ZXIgYm91bmRzIGZvciBhbGwgY29uZmlkZW5jZSBsZXZlbHMuDQo0LiBEZXRlcm1pbmUgd2hldGhlciB0aGUgKio3MCUgdGFyZ2V0KiogaXMgc3RhdGlzdGljYWxseSBzYXRpc2ZpZWQuDQoNCi0tLQ0KDQpUaGUgZ2l2ZW4gZGF0YSBpczoNClxiZWdpbntlcW5hcnJheSp9DQpuICY9JiAyNTAgXHF1YWQgXHRleHR7KHRvdGFsIHVzZXJzKX0gXFwNCnggJj0mIDE4NSBccXVhZCBcdGV4dHsoYWN0aXZlIHByZW1pdW0gdXNlcnMpfSBcXA0KDQoNClxoYXR7cH0gJj0mIFxmcmFje3h9e259ID0gXGZyYWN7MTg1fXsyNTB9ID0gMC43NA0KXGVuZHtlcW5hcnJheSp9DQpUaGUgdGFyZ2V0IHByb3BvcnRpb24gdG8gZW5zdXJlIGlzICRwXzAgPSAwLjcwJC4gDQoNClRoZSBzdGFuZGFyZCBlcnJvciBvZiB0aGUgc2FtcGxlIHByb3BvcnRpb24gKCRcaGF0e3B9JCkgaXM6DQokJA0KU0UgPSBcc3FydHtcZnJhY3tcaGF0e3B9KDEtXGhhdHtwfSl9e259fSA9IFxzcXJ0e1xmcmFjezAuNzQoMS0wLjc0KX17MjUwfX0gXGFwcHJveCAwLjAyNzcNCiQkDQoNCg0KIyMjICAgIElkZW50aWZ5IHRoZSBUeXBlIG9mIENvbmZpZGVuY2UgSW50ZXJ2YWwgYW5kIHRoZSBBcHByb3ByaWF0ZSBUZXN0DQoNCiANClR5cGUgb2YgQ29uZmlkZW5jZSBJbnRlcnZhbDogT25lLVNpZGVkIExvd2VyIENvbmZpZGVuY2UgSW50ZXJ2YWwgZm9yIGEgUG9wdWxhdGlvbiBQcm9wb3J0aW9uLiBUaGUgY29tcGFueSBpcyBvbmx5IGludGVyZXN0ZWQgaW4gdGhlIGxvd2VyIGJvdW5kIHRvIGVuc3VyZSB0aGUgZmVhdHVyZSB1c2FnZSBpcyBhdCBsZWFzdCAkNzBcJSQuDQoNCkFwcHJvcHJpYXRlIFRlc3QvTWV0aG9kOiBUaGUgYXBwcm9wcmlhdGUgbWV0aG9kIGlzIHVzaW5nIHRoZSBaLXRlc3QgZm9yIGEgUG9wdWxhdGlvbiBQcm9wb3J0aW9uIChvciB0aGUgTm9ybWFsIEFwcHJveGltYXRpb24gbWV0aG9kIGZvciBjb25maWRlbmNlIGludGVydmFscykgYmVjYXVzZSB0aGUgc2FtcGxlIHNpemUgaXMgbGFyZ2UgZW5vdWdoIHRvIHNhdGlzZnkgdGhlIG5vcm1hbCBhcHByb3hpbWF0aW9uIGNvbmRpdGlvbnMgKCRuXGhhdHtwfSA9IDE4NSA+IDEwJCBhbmQgJG4oMS1caGF0e3B9KSA9IDY1ID4gMTAkKS4NCg0KIyMjICAgIENvbXB1dGUgdGhlIE9uZS1TaWRlZCBMb3dlciBDb25maWRlbmNlIEludGVydmFsDQoNClRoZSBmb3JtdWxhIGZvciB0aGUgb25lLXNpZGVkIGxvd2VyIGNvbmZpZGVuY2UgYm91bmQgaXM6DQokJA0KXHRleHR7TG93ZXIgQm91bmR9ID0gXGhhdHtwfSAtIFpfezEtXGFscGhhfSBcY2RvdCBTRQ0KJCQNCg0KYGBge3IsZWNobz1GQUxTRSxtZXNzYWdlPUZBTFNFLHdhcm5pbmc9RkFMU0V9DQojIE1lbWJ1YXQgdGFiZWwgb25lLXNpZGVkIGNvbmZpZGVuY2UgaW50ZXJ2YWwNCm9uZV9zaWRlZF9jaSA8LSBkYXRhLmZyYW1lKA0KICBDb25maWRlbmNlX0xldmVsID0gYygiOTAlIiwgIjk1JSIsICI5OSUiKSwNCiAgQWxwaGEgPSBjKDAuMTAsIDAuMDUsIDAuMDEpLA0KICBaXzFfbWludXNfQWxwaGEgPSBjKDEuMjgyLCAxLjY0NSwgMi4zMjYpLA0KICBMb3dlcl9Cb3VuZCA9IGMoMC43MDQ0LCAwLjY5NDQsIDAuNjc1NSkNCikNCg0KIyBNZW5hbXBpbGthbiB0YWJlbA0KbGlicmFyeShrbml0cikNCg0Ka2FibGUoDQogIG9uZV9zaWRlZF9jaSwNCiAgY2FwdGlvbiA9ICJPbmUtU2lkZWQgQ29uZmlkZW5jZSBJbnRlcnZhbCAoTG93ZXIgQm91bmQpIiwNCiAgYWxpZ24gPSAiYyINCikNCg0KYGBgDQoNCioqRGV0YWlsZWQgUmVzdWx0czoqKg0KYGBge3IsZWNobz1GQUxTRX0NCiMgTWVtYnVhdCB0YWJlbCBvbmUtc2lkZWQgY29uZmlkZW5jZSBpbnRlcnZhbCAodmVyc2kgcHJlc2lzaSkNCm9uZV9zaWRlZF9jaV9wcmVjaXNlIDwtIGRhdGEuZnJhbWUoDQogIENvbmZpZGVuY2VfTGV2ZWwgPSBjKCI5MCUiLCAiOTUlIiwgIjk5JSIpLA0KICBaXzFfbWludXNfQWxwaGEgPSBjKDEuMjgxNTUyLCAxLjY0NDg1NCwgMi4zMjYzNDgpLA0KICBMb3dlcl9Cb3VuZF9DSSA9IGMoMC43MDQ0NDgsIDAuNjk0MzY5LCAwLjY3NTQ2MykNCikNCg0KIyBNZW5hbXBpbGthbiB0YWJlbA0KbGlicmFyeShrbml0cikNCg0Ka2FibGUoDQogIG9uZV9zaWRlZF9jaV9wcmVjaXNlLA0KICBjYXB0aW9uID0gIk9uZS1TaWRlZCBDb25maWRlbmNlIEludGVydmFsIChMb3dlciBCb3VuZCkiLA0KICBkaWdpdHMgPSA2LA0KICBhbGlnbiA9ICJjIg0KKQ0KDQpgYGANCg0KIyMjICAgIFZpc3VhbGl6ZSB0aGUgTG93ZXIgQm91bmRzIGZvciBBbGwgQ29uZmlkZW5jZSBMZXZlbHMNCg0KVGhlIGZvbGxvd2luZyBwbG90IGlsbHVzdHJhdGVzIHRoZSBjYWxjdWxhdGVkIGxvd2VyIGJvdW5kcyBhZ2FpbnN0IHRoZSAkNzBcJSQgdGFyZ2V0LihBIGJhciBjaGFydCB0aXRsZWQgJ09uZS1TaWRlZCBMb3dlciBDb25maWRlbmNlIEJvdW5kcyBmb3IgUHJlbWl1bSBGZWF0dXJlIFVzYWdlJyBpcyBkaXNwbGF5ZWQuIFRoZSB4LWF4aXMgc2hvd3MgY29uZmlkZW5jZSBsZXZlbHMgKDkwJSwgOTUlLCA5OSUpLCBhbmQgdGhlIHktYXhpcyBzaG93cyB0aGUgTG93ZXIgQm91bmQgKENJKS4gQSBob3Jpem9udGFsIGRhc2hlZCByZWQgbGluZSBpbmRpY2F0ZXMgdGhlIHRhcmdldCBwcm9wb3J0aW9uIG9mIDAuNzAuIFRoZSBiYXJzIHNob3cgbG93ZXIgYm91bmRzIG9mIDAuNzA0DQoNCg0KLS0tDQoNCmBgYHtyLGVjaG89RkFMU0V9DQojIExvYWQgbmVjZXNzYXJ5IGxpYnJhcmllcw0KbGlicmFyeShwbG90bHkpDQoNCiMgR2l2ZW4gZGF0YSBmcm9tIHRoZSBwbG90IGRlc2NyaXB0aW9uDQpjb25mX2xldmVscyA8LSBjKDAuOTAsIDAuOTUsIDAuOTkpDQpsb3dlcl9ib3VuZHMgPC0gYygwLjcwNDQsIDAuNjk0NCwgMC42NzU1KQ0KdGFyZ2V0IDwtIDAuNzANCg0KIyBSZXZlcnNlLWVuZ2luZWVyIHBfaGF0IGFuZCBTRSBmcm9tIHRoZSBsb3dlciBib3VuZHMNCiMgQXNzdW1pbmcgbG93ZXIgYm91bmQgPSBwX2hhdCAtIHogKiBTRSBmb3Igb25lLXNpZGVkIGxvd2VyIENJDQp6X3Njb3JlcyA8LSBxbm9ybShjb25mX2xldmVscykNCmRpZmZzIDwtIGxvd2VyX2JvdW5kc1sxXSAtIGxvd2VyX2JvdW5kcyAgIyBEaWZmZXJlbmNlcyBmcm9tIDkwJSB0byBvdGhlcnMNCnpfZGlmZnMgPC0gel9zY29yZXMgLSB6X3Njb3Jlc1sxXQ0KU0UgPC0gZGlmZnNbMl0gLyB6X2RpZmZzWzJdICAjIEFwcHJveGltYXRlIFNFIGZyb20gOTAlIHRvIDk1JQ0KcF9oYXQgPC0gbG93ZXJfYm91bmRzWzFdICsgel9zY29yZXNbMV0gKiBTRSAgIyBDYWxjdWxhdGUgcF9oYXQNCg0KIyBWZXJpZnk6IHBfaGF0IHNob3VsZCBiZSBjb25zaXN0ZW50DQojIEZvciA5MCU6IDAuNzA0NCArIDEuMjgyICogU0Ug4omIIHBfaGF0DQojIEZvciA5NSU6IDAuNjk0NCArIDEuNjQ1ICogU0Ug4omIIHBfaGF0DQojIEZvciA5OSU6IDAuNjc1NSArIDIuMzI2ICogU0Ug4omIIHBfaGF0DQojIFNFIOKJiCAwLjAyNzcsIHBfaGF0IOKJiCAwLjc0DQoNClNFIDwtIDAuMDI3Nw0KcF9oYXQgPC0gMC43NA0KbiA8LSByb3VuZChwX2hhdCAqICgxIC0gcF9oYXQpIC8gU0VeMikgICMgQXBwcm94aW1hdGUgbiDiiYggMjUxDQpkZiA8LSBuIC0gMSAgIyBEZWdyZWVzIG9mIGZyZWVkb20gZm9yIHQtZGlzdHJpYnV0aW9uDQoNCiMgQ3JlYXRlIGRhdGEgZm9yIFotZGlzdHJpYnV0aW9uIChzYW1wbGluZyBkaXN0cmlidXRpb246IG5vcm1hbCB3aXRoIG1lYW49cF9oYXQsIHNkPVNFKQ0KeF96IDwtIHNlcShwX2hhdCAtIDQqU0UsIHBfaGF0ICsgNCpTRSwgbGVuZ3RoLm91dCA9IDEwMDApDQp5X3ogPC0gZG5vcm0oeF96LCBtZWFuID0gcF9oYXQsIHNkID0gU0UpDQoNCiMgQ3JlYXRlIGRhdGEgZm9yIFQtZGlzdHJpYnV0aW9uICh0IHdpdGggZGYsIHNjYWxlZCB0byBtYXRjaCBtZWFuIGFuZCBzZCBhcHByb3gpDQp4X3QgPC0gc2VxKHBfaGF0IC0gNCpTRSwgcF9oYXQgKyA0KlNFLCBsZW5ndGgub3V0ID0gMTAwMCkNCnlfdCA8LSBkdCgoeF90IC0gcF9oYXQpL1NFLCBkZikgLyBTRSAgIyBTY2FsZSB0byBtYXRjaCBzZA0KDQojIENyZWF0ZSBwbG90bHkgZmlndXJlIGZvciBaLWRpc3RyaWJ1dGlvbiAoc2FtcGxpbmcgZGlzdHJpYnV0aW9uKQ0KZmlnX3ogPC0gcGxvdF9seSh4ID0geF96LCB5ID0geV96LCB0eXBlID0gJ3NjYXR0ZXInLCBtb2RlID0gJ2xpbmVzJywgbmFtZSA9ICdTYW1wbGluZyBEaXN0cmlidXRpb24gKFotYXBwcm94KScsDQogICAgICAgICAgICAgICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gJ2JsdWUnKSkgJT4lDQogIGxheW91dCh0aXRsZSA9IHBhc3RlMCgnU2FtcGxpbmcgRGlzdHJpYnV0aW9uIGZvciBQcm9wb3J0aW9uIChaLWFwcHJveGltYXRpb24sIHDMgiA9ICcsIHBfaGF0LCAnLCBTRSA9ICcsIHJvdW5kKFNFLCA0KSwgJyknKSwNCiAgICAgICAgIHhheGlzID0gbGlzdCh0aXRsZSA9ICdQcm9wb3J0aW9uJyksDQogICAgICAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAnRGVuc2l0eScpKQ0KDQojIEFkZCBob3Jpem9udGFsIGxpbmUgZm9yIHRhcmdldA0KZmlnX3ogPC0gZmlnX3ogJT4lIGFkZF90cmFjZSh4ID0gYyhtaW4oeF96KSwgbWF4KHhfeikpLCB5ID0gYygwLCAwKSwgdHlwZSA9ICdzY2F0dGVyJywgbW9kZSA9ICdsaW5lcycsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lID0gbGlzdChjb2xvciA9ICdyZWQnLCBkYXNoID0gJ2Rhc2gnKSwgbmFtZSA9IHBhc3RlMCgnVGFyZ2V0OiAnLCB0YXJnZXQpKQ0KDQojIEFkZCB2ZXJ0aWNhbCBsaW5lcyBmb3IgbG93ZXIgYm91bmRzDQpmb3IgKGkgaW4gMTpsZW5ndGgoY29uZl9sZXZlbHMpKSB7DQogIGZpZ196IDwtIGZpZ196ICU+JSBhZGRfdHJhY2UoeCA9IGMobG93ZXJfYm91bmRzW2ldLCBsb3dlcl9ib3VuZHNbaV0pLCB5ID0gYygwLCBkbm9ybShsb3dlcl9ib3VuZHNbaV0sIHBfaGF0LCBTRSkpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gJ3NjYXR0ZXInLCBtb2RlID0gJ2xpbmVzJywgbGluZSA9IGxpc3QoY29sb3IgPSAnZ3JlZW4nLCBkYXNoID0gJ2RvdCcpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBwYXN0ZTAoY29uZl9sZXZlbHNbaV0qMTAwLCAnJSBMb3dlciBCb3VuZDogJywgbG93ZXJfYm91bmRzW2ldKSkNCn0NCg0KYGBgDQotLS0tDQoNCg0KLS0tLQ0KYGBge3IsZWNobz1GQUxTRX0NCg0KIyBDcmVhdGUgcGxvdGx5IGZpZ3VyZSBmb3IgVC1kaXN0cmlidXRpb24NCmZpZ190IDwtIHBsb3RfbHkoeCA9IHhfdCwgeSA9IHlfdCwgdHlwZSA9ICdzY2F0dGVyJywgbW9kZSA9ICdsaW5lcycsIG5hbWUgPSBwYXN0ZTAoJ1NhbXBsaW5nIERpc3RyaWJ1dGlvbiAoVCwgZGYgPSAnLCBkZiwgJyknKSwNCiAgICAgICAgICAgICAgICAgbGluZSA9IGxpc3QoY29sb3IgPSAnZ3JlZW4nKSkgJT4lDQogIGxheW91dCh0aXRsZSA9IHBhc3RlMCgnU2FtcGxpbmcgRGlzdHJpYnV0aW9uIGZvciBQcm9wb3J0aW9uIChULWRpc3RyaWJ1dGlvbiwgZGYgPSAnLCBkZiwgJyknKSwNCiAgICAgICAgIHhheGlzID0gbGlzdCh0aXRsZSA9ICdQcm9wb3J0aW9uJyksDQogICAgICAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAnRGVuc2l0eScpKQ0KDQojIEFkZCBob3Jpem9udGFsIGxpbmUgZm9yIHRhcmdldA0KZmlnX3QgPC0gZmlnX3QgJT4lIGFkZF90cmFjZSh4ID0gYyhtaW4oeF90KSwgbWF4KHhfdCkpLCB5ID0gYygwLCAwKSwgdHlwZSA9ICdzY2F0dGVyJywgbW9kZSA9ICdsaW5lcycsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lID0gbGlzdChjb2xvciA9ICdyZWQnLCBkYXNoID0gJ2Rhc2gnKSwgbmFtZSA9IHBhc3RlMCgnVGFyZ2V0OiAnLCB0YXJnZXQpKQ0KDQojIEFkZCB2ZXJ0aWNhbCBsaW5lcyBmb3IgbG93ZXIgYm91bmRzDQpmb3IgKGkgaW4gMTpsZW5ndGgoY29uZl9sZXZlbHMpKSB7DQogIGZpZ190IDwtIGZpZ190ICU+JSBhZGRfdHJhY2UoeCA9IGMobG93ZXJfYm91bmRzW2ldLCBsb3dlcl9ib3VuZHNbaV0pLCB5ID0gYygwLCBkdCgobG93ZXJfYm91bmRzW2ldIC0gcF9oYXQpL1NFLCBkZikgLyBTRSksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSAnc2NhdHRlcicsIG1vZGUgPSAnbGluZXMnLCBsaW5lID0gbGlzdChjb2xvciA9ICdncmVlbicsIGRhc2ggPSAnZG90JyksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IHBhc3RlMChjb25mX2xldmVsc1tpXSoxMDAsICclIExvd2VyIEJvdW5kOiAnLCBsb3dlcl9ib3VuZHNbaV0pKQ0KfQ0KDQojIERpc3BsYXkgdGhlIHBsb3RzDQpmaWdfeg0KZmlnX3QNCmBgYA0KLS0tDQoNCiMjIyAgICBEZXRlcm1pbmUgV2hldGhlciB0aGUgJDcwXCUkIFRhcmdldCBpcyBTdGF0aXN0aWNhbGx5IFNhdGlzZmllZA0KDQpUaGUgJDcwXCUkIHRhcmdldCBpcyBzdGF0aXN0aWNhbGx5IHNhdGlzZmllZCBhdCBhIGdpdmVuIGNvbmZpZGVuY2UgbGV2ZWwgaWYgdGhlIGNhbGN1bGF0ZWQgTG93ZXIgQm91bmQgaXMgJFxnZXEgMC43MCQuDQoNCiMjIyMgICAgQXQgJDkwXCUkIENvbmZpZGVuY2U6DQoNCi0gTG93ZXIgQm91bmQ6JDAuNzA0NCQNCg0KLSBDb25jbHVzaW9uOiBTdGF0aXN0aWNhbGx5IFNhdGlzZmllZC4gU2luY2UgJDAuNzA0NCA+IDAuNzAkLCB3ZSBhcmUgJDkwXCUkIGNvbmZpZGVudCB0aGF0IHRoZSB0cnVlIHByb3BvcnRpb24gb2Ygd2Vla2x5IGFjdGl2ZSB1c2VycyB1dGlsaXppbmcgdGhlIHByZW1pdW0gZmVhdHVyZSBpcyBhdCBsZWFzdCAkNzAuNDRcJSQuDQoNCiMjIyMgICAgQXQgJDk1XCUkIENvbmZpZGVuY2U6DQoNCi0gTG93ZXIgQm91bmQ6ICQwLjY5NDQkDQoNCi0gQ29uY2x1c2lvbjogTk9UIFN0YXRpc3RpY2FsbHkgU2F0aXNmaWVkLiBTaW5jZSAkMC42OTQ0IDwgMC43MCQsIHdlIGNhbm5vdCBiZSAkOTVcJSQgY29uZmlkZW50IHRoYXQgdGhlIHRydWUgcHJvcG9ydGlvbiBpcyBhdCBsZWFzdCAkNzBcJSQuDQoNCiMjIyMgICAgQXQgJDk5XCUkIENvbmZpZGVuY2U6DQoNCi0gTG93ZXIgQm91bmQ6ICQwLjY3NTUkDQoNCi0gQ29uY2x1c2lvbjogTk9UIFN0YXRpc3RpY2FsbHkgU2F0aXNmaWVkLiBTaW5jZSAkMC42NzU1IDwgMC43MCQsIHdlIGNhbm5vdCBiZSAkOTlcJSQgY29uZmlkZW50IHRoYXQgdGhlIHRydWUgcHJvcG9ydGlvbiBpcyBhdCBsZWFzdCAkNzBcJSQuDQoNClN1bW1hcnk6IFRoZSBjb21wYW55IGNhbiBiZSAkOTBcJSQgY29uZmlkZW50IHRoYXQgdGhlIHRydWUgcHJvcG9ydGlvbiBvZiB3ZWVrbHkgYWN0aXZlIHVzZXJzIHV0aWxpemluZyBhIHByZW1pdW0gZmVhdHVyZSBpcyBhdCBsZWFzdCAkNzBcJSQuIEhvd2V2ZXIsIHRoZXkgY2Fubm90IG1ha2UgdGhpcyBjbGFpbSBhdCB0aGUgc3RyaWN0ZXIgJDk1XCUkIG9yICQ5OVwlJCBjb25maWRlbmNlIGxldmVscy4NCmBgYHtyLGVjaG89RkFMU0UsbWVuc2FnZT1GQUxTRX0NCiMgTG9hZCBsaWJyYXJ5DQpsaWJyYXJ5KHBsb3RseSkNCg0KIyBGdW5nc2kgdW50dWsgbWVtYnVhdCBwbG90IGRpc3RyaWJ1c2kgeg0KcGxvdF96X2Rpc3RyaWJ1dGlvbiA8LSBmdW5jdGlvbigpIHsNCiAgIyBEYXRhIHVudHVrIGRpc3RyaWJ1c2kgbm9ybWFsIHN0YW5kYXINCiAgeCA8LSBzZXEoLTQsIDQsIGxlbmd0aC5vdXQgPSAxMDAwKQ0KICB5IDwtIGRub3JtKHgsIG1lYW4gPSAwLCBzZCA9IDEpDQogIA0KICAjIFotc2NvcmVzIHVudHVrIGNvbmZpZGVuY2UgbGV2ZWxzIChvbmUtdGFpbGVkKQ0KICB6XzkwIDwtIHFub3JtKDAuOTApICAjIOKJiCAxLjI4Mg0KICB6Xzk1IDwtIHFub3JtKDAuOTUpICAjIOKJiCAxLjY0NQ0KICB6Xzk5IDwtIHFub3JtKDAuOTkpICAjIOKJiCAyLjMyNg0KICANCiAgIyBCdWF0IHBsb3QgZGVuZ2FuIHBsb3RseQ0KICBwIDwtIHBsb3RfbHkoKSAlPiUNCiAgICBhZGRfdHJhY2UoeCA9IHgsIHkgPSB5LCB0eXBlID0gJ3NjYXR0ZXInLCBtb2RlID0gJ2xpbmVzJywgbmFtZSA9ICdEaXN0cmlidXNpIFonLA0KICAgICAgICAgICAgICBsaW5lID0gbGlzdChjb2xvciA9ICdibHVlJykpICU+JQ0KICAgICMgQXJlYSB1bnR1ayA5MCUgY29uZmlkZW5jZQ0KICAgIGFkZF90cmFjZSh4ID0geFt4IDw9IHpfOTBdLCB5ID0geVt4IDw9IHpfOTBdLCB0eXBlID0gJ3NjYXR0ZXInLCBtb2RlID0gJ2xpbmVzJywgZmlsbCA9ICd0b3plcm95JywNCiAgICAgICAgICAgICAgZmlsbGNvbG9yID0gJ3JnYmEoMCwgMjU1LCAwLCAwLjMpJywgbGluZSA9IGxpc3QoY29sb3IgPSAnZ3JlZW4nKSwgbmFtZSA9ICc5MCUgQ29uZmlkZW5jZSAoU2F0aXNmaWVkKScpICU+JQ0KICAgICMgQXJlYSB1bnR1ayA5NSUgY29uZmlkZW5jZQ0KICAgIGFkZF90cmFjZSh4ID0geFt4IDw9IHpfOTVdLCB5ID0geVt4IDw9IHpfOTVdLCB0eXBlID0gJ3NjYXR0ZXInLCBtb2RlID0gJ2xpbmVzJywgZmlsbCA9ICd0b3plcm95JywNCiAgICAgICAgICAgICAgZmlsbGNvbG9yID0gJ3JnYmEoMjU1LCAyNTUsIDAsIDAuMyknLCBsaW5lID0gbGlzdChjb2xvciA9ICd5ZWxsb3cnKSwgbmFtZSA9ICc5NSUgQ29uZmlkZW5jZSAoTm90IFNhdGlzZmllZCknKSAlPiUNCiAgICAjIEFyZWEgdW50dWsgOTklIGNvbmZpZGVuY2UNCiAgICBhZGRfdHJhY2UoeCA9IHhbeCA8PSB6Xzk5XSwgeSA9IHlbeCA8PSB6Xzk5XSwgdHlwZSA9ICdzY2F0dGVyJywgbW9kZSA9ICdsaW5lcycsIGZpbGwgPSAndG96ZXJveScsDQogICAgICAgICAgICAgIGZpbGxjb2xvciA9ICdyZ2JhKDI1NSwgMCwgMCwgMC4zKScsIGxpbmUgPSBsaXN0KGNvbG9yID0gJ3JlZCcpLCBuYW1lID0gJzk5JSBDb25maWRlbmNlIChOb3QgU2F0aXNmaWVkKScpICU+JQ0KICAgICMgR2FyaXMgdmVydGlrYWwgdW50dWsgei1zY29yZXMNCiAgICBhZGRfdHJhY2UoeCA9IGMoel85MCwgel85MCksIHkgPSBjKDAsIGRub3JtKHpfOTApKSwgdHlwZSA9ICdzY2F0dGVyJywgbW9kZSA9ICdsaW5lcycsDQogICAgICAgICAgICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gJ2dyZWVuJywgZGFzaCA9ICdkYXNoJyksIG5hbWUgPSBwYXN0ZSgnWiA5MCU6Jywgcm91bmQoel85MCwgMykpKSAlPiUNCiAgICBhZGRfdHJhY2UoeCA9IGMoel85NSwgel85NSksIHkgPSBjKDAsIGRub3JtKHpfOTUpKSwgdHlwZSA9ICdzY2F0dGVyJywgbW9kZSA9ICdsaW5lcycsDQogICAgICAgICAgICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gJ3llbGxvdycsIGRhc2ggPSAnZGFzaCcpLCBuYW1lID0gcGFzdGUoJ1ogOTUlOicsIHJvdW5kKHpfOTUsIDMpKSkgJT4lDQogICAgYWRkX3RyYWNlKHggPSBjKHpfOTksIHpfOTkpLCB5ID0gYygwLCBkbm9ybSh6Xzk5KSksIHR5cGUgPSAnc2NhdHRlcicsIG1vZGUgPSAnbGluZXMnLA0KICAgICAgICAgICAgICBsaW5lID0gbGlzdChjb2xvciA9ICdyZWQnLCBkYXNoID0gJ2Rhc2gnKSwgbmFtZSA9IHBhc3RlKCdaIDk5JTonLCByb3VuZCh6Xzk5LCAzKSkpICU+JQ0KICAgIGxheW91dCh0aXRsZSA9ICdEaXN0cmlidXNpIFogKE5vcm1hbCBTdGFuZGFyKSB1bnR1ayBDb25maWRlbmNlIExldmVscycsDQogICAgICAgICAgIHhheGlzID0gbGlzdCh0aXRsZSA9ICdaLVNjb3JlJyksDQogICAgICAgICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICdEZW5zaXR5JyksDQogICAgICAgICAgIGFubm90YXRpb25zID0gbGlzdCgNCiAgICAgICAgICAgICBsaXN0KHggPSB6XzkwLCB5ID0gZG5vcm0oel85MCkgKyAwLjA1LCB0ZXh0ID0gJ0xvd2VyIEJvdW5kOiAwLjcwNDQgKFNhdGlzZmllZCknLCBzaG93YXJyb3cgPSBGQUxTRSksDQogICAgICAgICAgICAgbGlzdCh4ID0gel85NSwgeSA9IGRub3JtKHpfOTUpICsgMC4wNSwgdGV4dCA9ICdMb3dlciBCb3VuZDogMC42OTQ0IChOb3QgU2F0aXNmaWVkKScsIHNob3dhcnJvdyA9IEZBTFNFKSwNCiAgICAgICAgICAgICBsaXN0KHggPSB6Xzk5LCB5ID0gZG5vcm0oel85OSkgKyAwLjA1LCB0ZXh0ID0gJ0xvd2VyIEJvdW5kOiAwLjY3NTUgKE5vdCBTYXRpc2ZpZWQpJywgc2hvd2Fycm93ID0gRkFMU0UpDQogICAgICAgICAgICkpDQogIA0KICByZXR1cm4ocCkNCn0NCg0KIyBGdW5nc2kgdW50dWsgbWVtYnVhdCBwbG90IGRpc3RyaWJ1c2kgdA0KcGxvdF90X2Rpc3RyaWJ1dGlvbiA8LSBmdW5jdGlvbihkZiA9IDMwKSB7DQogICMgRGF0YSB1bnR1ayBkaXN0cmlidXNpIHQNCiAgeCA8LSBzZXEoLTQsIDQsIGxlbmd0aC5vdXQgPSAxMDAwKQ0KICB5IDwtIGR0KHgsIGRmID0gZGYpDQogIA0KICAjIFQtc2NvcmVzIHVudHVrIGNvbmZpZGVuY2UgbGV2ZWxzIChvbmUtdGFpbGVkKQ0KICB0XzkwIDwtIHF0KDAuOTAsIGRmID0gZGYpDQogIHRfOTUgPC0gcXQoMC45NSwgZGYgPSBkZikNCiAgdF85OSA8LSBxdCgwLjk5LCBkZiA9IGRmKQ0KICANCiAgIyBCdWF0IHBsb3QgZGVuZ2FuIHBsb3RseQ0KICBwIDwtIHBsb3RfbHkoKSAlPiUNCiAgICBhZGRfdHJhY2UoeCA9IHgsIHkgPSB5LCB0eXBlID0gJ3NjYXR0ZXInLCBtb2RlID0gJ2xpbmVzJywgbmFtZSA9IHBhc3RlKCdEaXN0cmlidXNpIFQgKGRmID0nLCBkZiwgJyknKSwNCiAgICAgICAgICAgICAgbGluZSA9IGxpc3QoY29sb3IgPSAncHVycGxlJykpICU+JQ0KICAgICMgQXJlYSB1bnR1ayA5MCUgY29uZmlkZW5jZQ0KICAgIGFkZF90cmFjZSh4ID0geFt4IDw9IHRfOTBdLCB5ID0geVt4IDw9IHRfOTBdLCB0eXBlID0gJ3NjYXR0ZXInLCBtb2RlID0gJ2xpbmVzJywgZmlsbCA9ICd0b3plcm95JywNCiAgICAgICAgICAgICAgZmlsbGNvbG9yID0gJ3JnYmEoMCwgMjU1LCAwLCAwLjMpJywgbGluZSA9IGxpc3QoY29sb3IgPSAnZ3JlZW4nKSwgbmFtZSA9ICc5MCUgQ29uZmlkZW5jZSAoU2F0aXNmaWVkKScpICU+JQ0KICAgICMgQXJlYSB1bnR1ayA5NSUgY29uZmlkZW5jZQ0KICAgIGFkZF90cmFjZSh4ID0geFt4IDw9IHRfOTVdLCB5ID0geVt4IDw9IHRfOTVdLCB0eXBlID0gJ3NjYXR0ZXInLCBtb2RlID0gJ2xpbmVzJywgZmlsbCA9ICd0b3plcm95JywNCiAgICAgICAgICAgICAgZmlsbGNvbG9yID0gJ3JnYmEoMjU1LCAyNTUsIDAsIDAuMyknLCBsaW5lID0gbGlzdChjb2xvciA9ICd5ZWxsb3cnKSwgbmFtZSA9ICc5NSUgQ29uZmlkZW5jZSAoTm90IFNhdGlzZmllZCknKSAlPiUNCiAgICAjIEFyZWEgdW50dWsgOTklIGNvbmZpZGVuY2UNCiAgICBhZGRfdHJhY2UoeCA9IHhbeCA8PSB0Xzk5XSwgeSA9IHlbeCA8PSB0Xzk5XSwgdHlwZSA9ICdzY2F0dGVyJywgbW9kZSA9ICdsaW5lcycsIGZpbGwgPSAndG96ZXJveScsDQogICAgICAgICAgICAgIGZpbGxjb2xvciA9ICdyZ2JhKDI1NSwgMCwgMCwgMC4zKScsIGxpbmUgPSBsaXN0KGNvbG9yID0gJ3JlZCcpLCBuYW1lID0gJzk5JSBDb25maWRlbmNlIChOb3QgU2F0aXNmaWVkKScpICU+JQ0KICAgICMgR2FyaXMgdmVydGlrYWwgdW50dWsgdC1zY29yZXMNCiAgICBhZGRfdHJhY2UoeCA9IGModF85MCwgdF85MCksIHkgPSBjKDAsIGR0KHRfOTAsIGRmKSksIHR5cGUgPSAnc2NhdHRlcicsIG1vZGUgPSAnbGluZXMnLA0KICAgICAgICAgICAgICBsaW5lID0gbGlzdChjb2xvciA9ICdncmVlbicsIGRhc2ggPSAnZGFzaCcpLCBuYW1lID0gcGFzdGUoJ1QgOTAlOicsIHJvdW5kKHRfOTAsIDMpKSkgJT4lDQogICAgYWRkX3RyYWNlKHggPSBjKHRfOTUsIHRfOTUpLCB5ID0gYygwLCBkdCh0Xzk1LCBkZikpLCB0eXBlID0gJ3NjYXR0ZXInLCBtb2RlID0gJ2xpbmVzJywNCiAgICAgICAgICAgICAgbGluZSA9IGxpc3QoY29sb3IgPSAneWVsbG93JywgZGFzaCA9ICdkYXNoJyksIG5hbWUgPSBwYXN0ZSgnVCA5NSU6Jywgcm91bmQodF85NSwgMykpKSAlPiUNCiAgICBhZGRfdHJhY2UoeCA9IGModF85OSwgdF85OSksIHkgPSBjKDAsIGR0KHRfOTksIGRmKSksIHR5cGUgPSAnc2NhdHRlcicsIG1vZGUgPSAnbGluZXMnLA0KICAgICAgICAgICAgICBsaW5lID0gbGlzdChjb2xvciA9ICdyZWQnLCBkYXNoID0gJ2Rhc2gnKSwgbmFtZSA9IHBhc3RlKCdUIDk5JTonLCByb3VuZCh0Xzk5LCAzKSkpICU+JQ0KICAgIGxheW91dCh0aXRsZSA9IHBhc3RlKCdEaXN0cmlidXNpIFQgKGRmID0nLCBkZiwgJykgdW50dWsgQ29uZmlkZW5jZSBMZXZlbHMnKSwNCiAgICAgICAgICAgeGF4aXMgPSBsaXN0KHRpdGxlID0gJ1QtU2NvcmUnKSwNCiAgICAgICAgICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gJ0RlbnNpdHknKSwNCiAgICAgICAgICAgYW5ub3RhdGlvbnMgPSBsaXN0KA0KICAgICAgICAgICAgIGxpc3QoeCA9IHRfOTAsIHkgPSBkdCh0XzkwLCBkZikgKyAwLjA1LCB0ZXh0ID0gJ0xvd2VyIEJvdW5kOiAwLjcwNDQgKFNhdGlzZmllZCknLCBzaG93YXJyb3cgPSBGQUxTRSksDQogICAgICAgICAgICAgbGlzdCh4ID0gdF85NSwgeSA9IGR0KHRfOTUsIGRmKSArIDAuMDUsIHRleHQgPSAnTG93ZXIgQm91bmQ6IDAuNjk0NCAoTm90IFNhdGlzZmllZCknLCBzaG93YXJyb3cgPSBGQUxTRSksDQogICAgICAgICAgICAgbGlzdCh4ID0gdF85OSwgeSA9IGR0KHRfOTksIGRmKSArIDAuMDUsIHRleHQgPSAnTG93ZXIgQm91bmQ6IDAuNjc1NSAoTm90IFNhdGlzZmllZCknLCBzaG93YXJyb3cgPSBGQUxTRSkNCiAgICAgICAgICAgKSkNCiAgDQogIHJldHVybihwKQ0KfQ0KDQojIEphbGFua2FuIGRhbiB0YW1waWxrYW4gcGxvdA0KcGxvdF96IDwtIHBsb3Rfel9kaXN0cmlidXRpb24oKQ0KcGxvdF90IDwtIHBsb3RfdF9kaXN0cmlidXRpb24oZGYgPSAzMCkgICMgVWJhaCBkZiBqaWthIGRpa2V0YWh1aSB1a3VyYW4gc2FtcGVsDQoNCiMgVGFtcGlsa2FuIHBsb3QgKGJpc2EgZGlqYWxhbmthbiBzYXR1IHBlciBzYXR1IGF0YXUgZ2FidW5na2FuKQ0KcGxvdF96DQpwbG90X3QNCmBgYA0KDQo=