STUDY CASES

Confidence Interval~ Week 13

Carol Dupino Pereira

NIM: 52250051

Mahasiswa Sains Data ITSB

R Programming Data Science Statistics

1 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

  1. Identify the appropriate statistical test and justify your choice.
  2. Compute the Confidence Intervals for:
    • \(90\%\)
    • \(95\%\)
    • \(99\%\)
  3. Create a comparison visualization of the three confidence intervals.
  4. Interpret the results in a business analytics context.

1.1 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) \]

1.2 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
Confidence_Level Z_alpha_over_2 Margin_of_Error Lower_Bound Upper_Bound
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

1.3 Comparison Visualization

The plot below visually compares the three confidence intervals, demonstrating how the interval width increases as the confidence level increases.

1.4 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.

  1. 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.
  1. 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.
  1. 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.


2 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:

  1. Identify the appropriate statistical test and explain why.
  2. Compute the Confidence Intervals for:
    • \(90\%\)
    • \(95\%\)
    • \(99\%\)
  3. Visualize the three intervals on a single plot.
  4. Explain how sample size and confidence level influence the interval width.

2.1 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:

  1. Population Standard Deviation is Unknown (\(\sigma\) unknown): When \(\sigma\) is unknown, we must use the sample standard deviation (\(s\)) as an estimate.

  2. 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.

2.2 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)
Confidence_Level Lower_Bound_min Upper_Bound_min
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

2.3 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:

2.4 Factors Influencing Interval Width

The width of a confidence interval is determined by the Margin of Error (\(ME = t^ \cdot \frac{s}{\sqrt{n}}\)).

  • Confidence Level:Effect:

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^*\)).

  • Sample Size (\(n\)):

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.


3 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:

  1. Compute the sample proportion \(\hat{p}\).
  2. Compute Confidence Intervals for the proportion at:
    • \(90\%\)
    • \(95\%\)
    • \(99\%\)
  3. Visualize and compare the three intervals.
  4. 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*} \]

3.1 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\%\).

3.2 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
Confidence_Level Z_score Margin_of_Error Confidence_Interval
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]

3.3 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).

3.4 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
Confidence_Level Interval_Width Precision Certainty Risk_of_Type_I_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
    1. 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.

    1. 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.

    1. 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.

    1. Product Standard:

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.


4 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

  1. Identify the statistical test used by each team.
  2. Compute Confidence Intervals for 90%, 95%, and 99%.
  3. Create a visualization comparing all intervals.
  4. Explain why the interval widths differ, even with similar data.

4.1 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 Given_Standard_Deviation Test_Used Justification
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.

4.2 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)
Confidence_Level Z_Critical_Value Margin_of_Error Confidence_Interval Interval_Width
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)
Confidence_Level t_Critical_Value_df35 Margin_of_Error Confidence_Interval Interval_Width
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

4.3 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).

4.4 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.

4.4.1 \(\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.

4.4.2 \(\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\)).


5 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:

  1. Identify the type of Confidence Interval and the appropriate test.
  2. Compute the one-sided lower Confidence Interval at:
    • \(90\%\)
    • \(95\%\)
    • \(99\%\)
  3. Visualize the lower bounds for all confidence levels.
  4. 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 \]

5.1 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\)).

5.2 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)
Confidence_Level Alpha Z_1_minus_Alpha 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)
Confidence_Level Z_1_minus_Alpha Lower_Bound_CI
90% 1.281552 0.704448
95% 1.644854 0.694369
99% 2.326348 0.675463

5.3 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





5.4 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\).

5.4.1 At \(90\%\) Confidence:

  • Lower Bound:\(0.7044\)

  • Conclusion: Statistically Satisfied. Since \(0.7044 > 0.70\), we are \(90\%\) confident that the true proportion of weekly active users utilizing the premium feature is at least \(70.44\%\).

5.4.2 At \(95\%\) Confidence:

  • Lower Bound: \(0.6944\)

  • Conclusion: NOT Statistically Satisfied. Since \(0.6944 < 0.70\), we cannot be \(95\%\) confident that the true proportion is at least \(70\%\).

5.4.3 At \(99\%\) Confidence:

  • Lower Bound: \(0.6755\)

  • Conclusion: NOT Statistically Satisfied. Since \(0.6755 < 0.70\), we cannot be \(99\%\) confident that the true proportion is at least \(70\%\).

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=