
Introduction
As a data scientist you probably retain or reject hypothesis based on
measurements of observed samples. The decision is often based on a
statistical mechanism called hypothesis testing. Let’s watching the
following video:
There are three conditions of having hypothesis testing included:
- Left Tailed Test: When the \(\bar{x}\) is significantly below the
hypothesised population mean \(µ_0\)
then \(H_0\) will be rejected and the
test used will be the left tailed test (lower tailed test) since the
critical region (denoting rejection of \(H_0\)) will be in the left tail of the
normal curve (representing sampling distribution of sample statistic
\(\bar{x}\)).
\[\text{Left Tailed Test} = \begin{cases}
{H_0: \mu \ge \mu_0} \\
{H1: \mu < \mu_0 } \end{cases}\]
- Right Tailed Test: When the \(\bar{x}\) is significantly above the
hypothesized population mean \(µ_0\)
then \(H_0\) will be rejected and the
test used will be right tailed test (upper tailed test) since the
critical region (denoting rejection of \(H_0\) will be in the right tail of the
normal curve (representing sampling distribution of sample statistic
\(\bar{x}\) ).
\[\text{Right Tailed Test} = \begin{cases}
{H_0: \mu \le \mu_0} \\
{H1: \mu > \mu_0 } \end{cases}\]
- Two Tailed Test: When the \(\bar{x}\) is significantly different
(significantly higher or lower than) from the hypothesis population mean
\(µ_0\) then \(H_0\) will will be rejected. In this case,
the two tailed test will be applicable because there will be two
critical regions (denoting rejection of \(H_0\)) on both the tails of the normal
curve (representing sampling distribution of sample statistic \(\bar{x}\)).
\[\text{Two Tailed Test} = \begin{cases}
{H_0: \mu = \mu_0} \\
{H1: \mu \neq \mu_0 } \end{cases}\]
Hypothesis Testing
The critical regions for Hypothesis Testing are shown as
shaded portions in the following figure:
On comparing the observed value of Test statistic with that of the
critical value, we may identify whether the observed value lies in the
critical region (reject \(H_0\)) or in
the acceptance region (do not reject \(H_0\)) and decide accordingly.
- Left Tailed Test: If \(Z_{Crit} <
-1.645\), then reject \(H_0\) at
5% level of Significance (\(\alpha\) is
taken as 5% in most of the analytic situations).
- Right Tailed Test: If \(Z_{Crit} >
1.645\), then reject \(H_0\) at
5% level of Significance.
- Two Tailed Test: If \(Z_{Crit}>
1.96\) or If \(Z_{Crit} <
-1.96\), then reject \(H_0\) at
5% Level of Significance.
There is also an alternative approach for hypothesis testing, this
approach is very much used in all the software packages. Here, you will
fucos on the following statement:
- If p-value \(< \alpha\): reject
\(H_0\)
- If p-value \(\ge \alpha\) : Fails
to Reject \(H_0\)
Procedure for Finding P-Values:
Type of Error I &
II
A Type I error is the mistake of rejecting the null hypothesis
when it is true. The symbol \(\alpha\)
(alpha) is used to represent the probability of a type I error.
A Type II error is the mistake of failing to reject the null
hypothesis when it is false. The symbol \(\beta\) (beta) is used to represent the
probability of a type II error.
Type I ~ One Tail
Z-test
The null hypothesis of the One-tail (left/right) test of the
population mean \(\mu\) and \(\sigma\) can be expressed as follows:
\[\text{Hypothesis Testing $H_0$} =
\begin{cases} {\mu \ge \mu_0} & \text{Left Tail} \\
{\mu \le \mu_0} & \text{Right Tail}
\end{cases}\]
where \(\mu_0\) is a hypothesized
left/right bound of the true population mean \(\mu\).
Let us define the test statistic \(z\) in terms of the sample mean, the sample
size and the population standard deviation \(\sigma\):
\[z={\bar{x}-\mu_0 \over
\sigma/\sqrt{n}}\]
Then the null hypothesis of the left tail test is to be rejected if
\(z \le −z_\alpha\) , where \(z_\alpha\) is the \(100(1-\alpha)\) percentile of the standard
normal distribution.
Example 1
Left Tail: Suppose the manufacturer claims that the
mean speed of a motorcycle is more than 100 km/hours. In a sample of 30
motorcycles, it was found that they only last 99 km/hours on average.
Assume the population standard deviation is 1.2 km/hours. At .05
significance level, can we reject the claim by the manufacturer?
Z-test
statistics
First, we calculate the z-test statistics according to the
information that we have from the Example 1. In this case, we use
z-statistics because we know the mean \(\mu\) and standard deviation \(\sigma\), also we know that the sample size
\(\ge 30\).
mu0 = 100 # hypothesized value
xbar = 99 # sample mean
sigma = 1.2 # population standard deviation
n = 30 # sample size
z = (xbar-mu0)/(sigma/sqrt(n));z # test statistic
## [1] -4.564355
Critical value
Then, we calculate the left critical value.
alpha = .05 # .05 significance level
z.alpha = qnorm(1-alpha) # right tail critical value
-z.alpha # left tail critical value
## [1] -1.644854
Now, we can conclude that the test statistic -4.5644 is less than the
critical value of -1.6449. Consequently, at .05 significance level, we
reject the claim that mean lifetime of a motorcycle is above 100
km/hours.
P-value
Alternative solution: Instead of using the critical
value, we apply the pnorm function to compute the left tail p-value of
the test statistic. As it turns out to be less than the .05 significance
level, we reject the null hypothesis that \(μ
\ge 100\).
pval = pnorm(z) # left tail p−value
pval # print p−value
## [1] 2.505166e-06
Exercise 1
Right Tail: A food company argue that for each a
cookie bag of their products, there is at most 2 grams of saturated fat
in a single cookie. In a sample of 40 cookies, it is found that the mean
amount of saturated fat per cookie is 2.1 grams. Assume that the
population standard deviation is 0.25 grams. At .05 significance level,
can we reject the claim?
# Sample mean
xbar= 2.1
# Sigma (Population standard deviation)
sigma = 0.25
# Hypothesized value
mu0 = 2
# Sample size
n = 40
# Z- statistics
z = (xbar - mu0)/(sigma/sqrt(n))
z
## [1] 2.529822
# Alpha
alpha = 0.05
z.alpha = qnorm(1-alpha)
# Critical Value
z.alpha
## [1] 1.644854
Jadi, uji statistik 2,529822 lebih besar dari nilai kritis 1,644854.
Tes arah kanan: jika \(Z_{Crit}\) \(> Z\) lalu tolak \(H_0\) pada tingkat signifikansi 5%. Oleh
karena itu, pada tingkat signifikansi 0,05, kami menolak pernyataan
bahwa terdapat paling banyak 2 gram lemak jenuh dalam sebuah kue.
Type I ~ Two Tail
Z-test
The null hypothesis of the two-tailed test of the population mean
\(\mu\) and \(\sigma\) can be expressed as follows:
\[\mu_0 = \mu\]
where \(\mu_0\) is a hypothesized
value of the true population mean \(\mu\).
Let us define the test statistic \(z\) in terms of the sample mean, the sample
size and the population standard deviation \(\sigma\):
\[z={\bar{x}-\mu_0 \over
\sigma/\sqrt{n}}\]
Then the null hypothesis of the two-tailed test is to be rejected if
\(z \le - z_{\alpha/2}\) or \(z \ge z_{\alpha/2}\) , where \(z_{\alpha/2}\) is the \(100(1-\alpha/2)\) percentile of the
standard normal distribution.
Example 2
Suppose the mean weight of King Penguins found in an Antarctic colony
last year was 15.4 kg. In a sample of 35 penguins same time this year in
the same colony, the mean penguin weight is 14.6 kg. Assume the
population standard deviation is 2.5 kg. At .05 significance level, can
we reject the null hypothesis that the mean penguin weight does not
differ from last year?
Z-test
statistics
First, we calculate the z-test statistics according to the
information that we have from the Example 2. In this case, we use
z-statistics because we know the mean \(\mu\) and standard deviation \(\sigma\), also we know that the sample size
\(\ge 30\).
mu0 = 15.4 # hypothesized value
xbar = 14.6 # sample mean
sigma = 2.5 # population standard deviation
n = 35 # sample size
z = (xbar-mu0)/(sigma/sqrt(n));z # test statistic
## [1] -1.893146
Critical value
Then, we calculate the left critical value.
alpha = .05 # .05 significance level
z.half.alpha = qnorm(1-alpha/2) # per-one tail .025 significance level
c(-z.half.alpha, z.half.alpha) # Two-Tailed 0.05 significance level
## [1] -1.959964 1.959964
The test statistic -1.8931 lies between the critical values -1.9600
and 1.9600. Hence, at .05 significance level, we do not reject the null
hypothesis that the mean penguin weight does not differ from last
year.
P-value
Alternative solution: Instead of using the critical
value, we apply the 2*pnorm() function to compute the two
tail p-value of the test statistic.
pval=2*pnorm(-abs(z)) # two tail p−value
pval # print p−value
## [1] 0.05833852
As it turns out to be greater than the .05 significance level, we do
not reject the null hypothesis that \(μ \ge
100\).
Exercise 2
To test the hypothesis that the mean systolic blood pressure in a
certain population equals 140 mmHg. The standard deviation has a known
value of 20 and a data set of 55 patients is available.
#Blood_pressure dataset
no <- seq(1:55)
status <- c(rep(0, 25), rep(1, 30))
mmhg <- c(120,115,94,118,111,102,102,131,104,107,115,139,115,113,114,105,
115,134,109,109,93,118,109,106,125,150,142,119,127,141,149,144,
142,149,161,143,140,148,149,141,146,159,152,135,134,161,130,125,
141,148,153,145,137,147,169)
blood_pressure <-data.frame(no,status,mmhg)
blood_pressure
## no status mmhg
## 1 1 0 120
## 2 2 0 115
## 3 3 0 94
## 4 4 0 118
## 5 5 0 111
## 6 6 0 102
## 7 7 0 102
## 8 8 0 131
## 9 9 0 104
## 10 10 0 107
## 11 11 0 115
## 12 12 0 139
## 13 13 0 115
## 14 14 0 113
## 15 15 0 114
## 16 16 0 105
## 17 17 0 115
## 18 18 0 134
## 19 19 0 109
## 20 20 0 109
## 21 21 0 93
## 22 22 0 118
## 23 23 0 109
## 24 24 0 106
## 25 25 0 125
## 26 26 1 150
## 27 27 1 142
## 28 28 1 119
## 29 29 1 127
## 30 30 1 141
## 31 31 1 149
## 32 32 1 144
## 33 33 1 142
## 34 34 1 149
## 35 35 1 161
## 36 36 1 143
## 37 37 1 140
## 38 38 1 148
## 39 39 1 149
## 40 40 1 141
## 41 41 1 146
## 42 42 1 159
## 43 43 1 152
## 44 44 1 135
## 45 45 1 134
## 46 46 1 161
## 47 47 1 130
## 48 48 1 125
## 49 49 1 141
## 50 50 1 148
## 51 51 1 153
## 52 52 1 145
## 53 53 1 137
## 54 54 1 147
## 55 55 1 169
Jadi, pertama-tama kita menghitung rata-rata sampel dan menemukan
total ukuran sampel. Itu, kami menetapkan hipotesis nol dan sigma untuk
menemukan z. Kemudian, kami juga mencari pvalue A, B, dan C.
# Sample mean and Total sample size
xbar = mean(blood_pressure$mmhg)
n = length(blood_pressure$mmhg)
# Set null hypothesis and sigma
mu0 = 140
sigma = 20
# z- statistics
z = (xbar-mu0)/(sigma/sqrt(n))
z
## [1] -3.708099
# p value A, B, and C
p_valueA = 2*pnorm(-abs(z)) #twotail
p_valueB = 1- pnorm (z) #righttail
p_valueC = pnorm(z) #left tail
p_valueA
## [1] 0.0002088208
## [1] 0.9998956
## [1] 0.0001044104
Jadi, pertama-tama kita menghitung rata-rata sampel dan menemukan
total ukuran sampel. Itu, kami menetapkan hipotesis nol dan sigma untuk
menemukan z. Kemudian, kami juga mencari pvalue A, B, dan C.
Lalu didapat hasilnya:
\(z\) = -3,708099 p_nilaiA =
0,0002088208 p_nilaiB = 0,9998956 p_nilaiC = 0,0001044104
Type I ~ One Tail
t-test
The null hypothesis of the one-tail (left/right) test of the
population mean \(\mu\) and unknown
\(\sigma\) can be expressed as
follows:
\[\text{Hypothesis Testing $H_0$} =
\begin{cases} {\mu \le \mu_0} & \text{Left Tail} \\
{\mu \ge \mu_0} & \text{Right Tail}
\end{cases}\]
where \(\mu_0\) is a hypothesized
left/right bound of the true population mean \(\mu\).
Let us define the test statistic \(t\) in terms of the sample mean, the sample
size and the sample standard deviation \(s\):
\[t={\bar{x}-\mu_0 \over
s/\sqrt{n}}\]
Then the null hypothesis of the lower tail test is to be rejected if
\(t\le−t_\alpha\) , where \(t_\alpha\) is the \(100(1 − \alpha)\) percentile of the Student
\(t\) distribution with \(n − 1\) degrees of freedom.
Example 3
Suppose the manufacturer claims that the mean lifetime of a light
bulb is more than 10,000 hours. In a sample of 30 light bulbs, it was
found that they only last 9,900 hours on average. Assume the sample
standard deviation is 125 hours. At .05 significance level, can we
reject the claim by the manufacturer?
T-test
statistics
First, we calculate the t-test statistics according to the
information that we have from the Example 1. In this case, we use
t-statistics because we dont know the mean \(\mu\) and standard deviation \(\sigma\) of pupulation, also we know that
the sample size \(\ge 30\).
mu0 = 10000 # hypothesized value
xbar = 9900 # sample mean
s = 125 # sample standard deviation
n = 30 # sample size
t = (xbar-mu0)/(s/sqrt(n));t # test statistic
## [1] -4.38178
Critical value
Then, we calculate the left critical value.
alpha = .05 # use 0.05 left tail significant level
t.alpha = qt(1-alpha, df=n-1) # right tail critical value
-t.alpha # left tail critical value
## [1] -1.699127
The test statistic -4.3818 is less than the critical value of
-1.6991. Hence, at .05 significance level, we can reject the claim that
mean lifetime of a light bulb is above 10,000 hours.
P-value
Alternative Solution: Instead of using the critical
value, we apply the pt function to compute the lower tail
p-value of the test statistic.
pval = pt(t, df=n-1) # left tail p−value
pval # print p−value
## [1] 7.035026e-05
As it turns out to be less than the .05 significance level, we reject
the null hypothesis that \(\mu \ge
10000.\)
Exercise 3
Right tail: Garuda-food Indonesia claims that for
each a cookie bag states of their product, there is at most 2 grams of
saturated fat in a single cookie. In a sample of 40 cookies, it is found
that the mean amount of saturated fat per cookie is 2.1 grams. Assume
that the sample standard deviation is 0.3 gram. At .05 significance
level, can we reject the claim?
# sample mean
xbar= 2.1
# Hypothesized value
mu0 = 2
# Sample standard deviation
s= 0.3
# Sample size
n = 40
# T-test
t = (xbar-mu0)/(s/sqrt(n))
t
## [1] 2.108185
# Find the critical value
alpha = 0.05
t.alpha = qt(1-alpha, df = n-1)
t.alpha
## [1] 1.684875
Jadi, pertama-tama kita mendefinisikan hipotesis nol yaitu \(μ≤2\) . Kemudian, kita cari rata-rata
sampel, standar deviasi sampel, ukuran sampel untuk mencari nilai uji t.
Setelah itu kita bandingkan dengan nilai kritisnya.
Nilai t-test 2.108185 lebih besar dari critical value yaitu 1.684875.
Jadi, pada tingkat signifikansi 0,05, kita menolak pernyataan bahwa
terdapat paling banyak 2 gram lemak jenuh dalam sebuah kue.
Type I ~ Two Tail
T-test
The null hypothesis of the two-tailed test of the population mean
\(\mu\) and unknown \(\sigma\) can be expressed as follows:
\[\mu_0 = \mu\]
where \(\mu_0\) is a hypothesized
value of the true population mean \(\mu\).
Let us define the test statistic \(t\) in terms of the sample mean, the sample
size and the sample standard deviation \(s:\)
\[t={\bar{x}-\mu_0 \over
s/\sqrt{n}}\]
Then the null hypothesis of the two-tailed test is to be rejected if
\(t\le-t_{\alpha∕2}\) or \(t\ge t_{\alpha∕2}\) , where \(t_{\alpha∕2}\) is the \(100(1-\alpha)\) percentile of the Student
\(t\) distribution with \(n−1\) degrees of freedom.
Example 4
Some journals concluded that the average weight of Hachiko Dogs
around the world last ten years was 15.4 kg. Researchers want to make
sure if there a change in the average weight of these varieties after
ten years. Therefore, they pick up a random sample of 35 Dogs from the
same varieties and at the same time this year, they found that the mean
penguin weight is 14.6 kg. Assume the sample standard deviation is 2.5
kg. At .05 significance level, can we reject the null hypothesis that
the mean Hachiko Dogs does not differ from last ten years?
T-test
statistics
First, we calculate the t-test statistics according to the
information that we have from the Example 2. In this case, we use
t-statistics because we know the mean \(\mu\) and standard deviation \(\sigma\), also we know that the sample size
\(\ge 35\).
mu0 = 15.4 # hypothesized value
xbar = 14.6 # sample mean
s = 2.5 # sample standard deviation
n = 35 # sample size
t = (xbar-mu0)/(s/sqrt(n));t # test statistic
## [1] -1.893146
Critical value
Then, we calculate the left critical value.
alpha = .05 # .05 significance level
t.half.alpha = qt(1-alpha/2, df=n-1) # per-one tail .025 significance level
c(-t.half.alpha, t.half.alpha) # Two-Tailed 0.05 significance level
## [1] -2.032245 2.032245
The test statistic -1.8931 lies between the critical values -2.04523
and 2.04523. Hence, at .05 significance level, we do not reject the null
hypothesis that the mean penguin weight does not differ from last
year.
P-value
Alternative solution: Instead of using the critical
value, we apply the 2*pt() function to compute the two tail
p-value of the test statistic.
pval = 2*pt(t, df=n-1) # two tail p−value
pval # print p−value
## [1] 0.06687552
Since it turns out to be greater than the .05 significance level, we
do not reject the null hypothesis that \(μ \ge
15.4\).
Exercise 4
To test the hypothesis that the mean systolic blood pressure in a
certain population equals 140 mmHg. The dataset at hands has
measurements on 55 patients.
#Blood_pressure dataset
no <- seq(1:55)
status <- c(rep(0, 25), rep(1, 30))
mmhg <- c(120,115,94,118,111,102,102,131,104,107,115,139,115,113,114,105,
115,134,109,109,93,118,109,106,125,150,142,119,127,141,149,144,
142,149,161,143,140,148,149,141,146,159,152,135,134,161,130,125,
141,148,153,145,137,147,169)
blood_pressure <-data.frame(no,status,mmhg)
library(dplyr)
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
new_blood_pressure <- blood_pressure%>% mutate(xi_minus_xbar = mmhg-130, xi_minus_xbar_kuadrat = (mmhg-130)^2)
new_blood_pressure
## no status mmhg xi_minus_xbar xi_minus_xbar_kuadrat
## 1 1 0 120 -10 100
## 2 2 0 115 -15 225
## 3 3 0 94 -36 1296
## 4 4 0 118 -12 144
## 5 5 0 111 -19 361
## 6 6 0 102 -28 784
## 7 7 0 102 -28 784
## 8 8 0 131 1 1
## 9 9 0 104 -26 676
## 10 10 0 107 -23 529
## 11 11 0 115 -15 225
## 12 12 0 139 9 81
## 13 13 0 115 -15 225
## 14 14 0 113 -17 289
## 15 15 0 114 -16 256
## 16 16 0 105 -25 625
## 17 17 0 115 -15 225
## 18 18 0 134 4 16
## 19 19 0 109 -21 441
## 20 20 0 109 -21 441
## 21 21 0 93 -37 1369
## 22 22 0 118 -12 144
## 23 23 0 109 -21 441
## 24 24 0 106 -24 576
## 25 25 0 125 -5 25
## 26 26 1 150 20 400
## 27 27 1 142 12 144
## 28 28 1 119 -11 121
## 29 29 1 127 -3 9
## 30 30 1 141 11 121
## 31 31 1 149 19 361
## 32 32 1 144 14 196
## 33 33 1 142 12 144
## 34 34 1 149 19 361
## 35 35 1 161 31 961
## 36 36 1 143 13 169
## 37 37 1 140 10 100
## 38 38 1 148 18 324
## 39 39 1 149 19 361
## 40 40 1 141 11 121
## 41 41 1 146 16 256
## 42 42 1 159 29 841
## 43 43 1 152 22 484
## 44 44 1 135 5 25
## 45 45 1 134 4 16
## 46 46 1 161 31 961
## 47 47 1 130 0 0
## 48 48 1 125 -5 25
## 49 49 1 141 11 121
## 50 50 1 148 18 324
## 51 51 1 153 23 529
## 52 52 1 145 15 225
## 53 53 1 137 7 49
## 54 54 1 147 17 289
## 55 55 1 169 39 1521
# Sample mean and Total sample size
xbar = mean(new_blood_pressure$mmhg)
n = length(new_blood_pressure$mmhg)
# Set null hypothesis and sample standard
mu0 = 140
q = sum(new_blood_pressure$xi_minus_xbar_kuadrat)
s = sqrt((1/(n-1))*q)
# t- statistics
t = (xbar-mu0)/(s/sqrt(n))
t
## [1] -3.869272
# p value A, B, and C
p_valueA = 2*pt(abs(t), df = n-1, lower.tail=FALSE) #twotail
p_valueB = pt(t, df= n-1, lower.tail = FALSE) #righttail
p_valueC = pt(t, df= n-1, lower.tail = TRUE) #left tail
p_valueA
## [1] 0.0002961114
## [1] 0.9998519
## [1] 0.0001480557
Lalu kita dapat hasilnya:
\(z\) = -3,869272 p_nilaiA =
0,0002961114 p_nilaiB = 0,9998519 p_nilaiC = 0,0001480557
Karena ternyata tingkat signifikansi A dan C kurang dari 0,05, maka
hipotesis nol ditolak. Karena, nilai p B ternyata lebih besar dari
tingkat signifikansi 0,05, jadi kita menerima hipotesis nol \(H_0\) : \(μ≤μ_0\) atau \(μ≤140\).
Type II ~ One Tail
In a left/right tail test of the population mean, the null hypothesis
claims that the true population mean \(\mu\) is greater than a given hypothetical
value \(\mu_0\).
\[\text{Type II Error $H_a$} =
\begin{cases} {\mu \ge \mu_0} & \text{Left Tail} \\
{\mu \le \mu_0} & \text{Right Tail}
\end{cases}\]
A type II error occurs if the hypothesis test based on a random
sample fails to reject the null hypothesis even when the true population
mean \(\mu\) is in fact less than \(\mu_0\).
Example 5
Suppose the manufacturer claims that the mean speed of a motorcycle
is more than 100 km/hours. In Assume the population standard deviation
is 1.2 km/hours. At .05 significance level, what is the probability of
having type II error for a sample size of 30 motorcycles?
Standard Error of
the Mean
We begin with computing the standard deviation of the mean, sem.
n = 30 # sample size
sigma = 1.2 # population standard deviation
sem = sigma/sqrt(n); sem # standard error
## [1] 0.219089
Next compute the lower bound of sample means for which the null
hypothesis \(\mu \ge 10000\) would not
be rejected.
Sample Mean
alpha = .05 # significance level
mu0 = 100 # hypothetical lower bound
q = qnorm(alpha, mean=mu0, sd=sem); q
## [1] 99.63963
Therefore, so long as the sample mean is greater than 99.64 in a
hypothesis test, the null hypothesis will not be rejected. Since we
assume that the actual population mean is 99.50, we can compute the
probability of the sample mean above 99.64, and thus found the
probability of type II error.
Probability of
Error
mu = 99.50 # assumed actual mean
pnorm(q, mean=mu, sd=sem, lower.tail=FALSE)
## [1] 0.261957
If the motorcycle sample size is 30, the actual mean motorcycles
speed is 9,950 hours and the population standard deviation is 120 hours,
then the probability of type II error for testing the null hypothesis
\(\mu \ge 10000\) at .05 significance
level is 26.2%, and the power of the hypothesis test is 73.8%.
Exercise 5
Right tail: Garuda-food Indonesia claims that for
each a cookie bag states of their product, there is at most 2 grams of
saturated fat in a single cookie. Assume the actual mean amount of
saturated fat per cookie is 2.075 grams and the sample standard
deviation is 0.25 grams. At .05 significance level, what is the
probability of having a type II error for a sample size of 35
cookies?
Kita perlu menentukan ukuran sampel, deviasi standar populasi, dan
kesalahan standar.
# Sample size
n = 35
# Population standard deviation
sigma = 0.25
# Standard error
sem = sigma/sqrt(n)
sem
## [1] 0.04225771
Selanjutnya, kami menghitung batas atas rata-rata sampel yang
merupakan hipotesis nol \(μ ≤ 2\) tidak
akan ditolak.
#Sig nificance level
alpha = 0.05
# Hypothesis
mu0 = 2
q = qnorm(alpha , mean = mu0, sd= sem, lower.tail = F)
q
## [1] 2.069508
Jika rata-rata sampel kurang dari 2,069508 dalam uji hipotesis, maka
hipotesis nol tidak akan ditolak. Karena kita mengasumsikan bahwa
rata-rata populasi sebenarnya adalah 2,075, kita dapat menghitung
probabilitas rata-rata sampel di bawah 2,0695.
# Actual mean
mu = 2.075
pnorm(q, mean=mu, sd=sem)
## [1] 0.448295
Jadi, Jika ukuran sampel kue adalah 35, jumlah rata-rata lemak jenuh
sebenarnya per kue adalah 2,075 gram dan standar deviasi populasi adalah
0,25 gram, maka probabilitas kesalahan tipe II untuk menguji hipotesis
nol \(μ ≤ 2\) pada tingkat signifikansi
0,05 adalah 44,8%, dan kekuatan uji hipotesis adalah 55,2%.
Type II ~ Two Tail
In a two-tailed test of the population mean, the null hypothesis
claims that the true population mean \(\mu\) is equal to a given hypothetical
value \(\mu_0\).
\[\mu_0 = \mu\]
A type II error occurs if the hypothesis test based on a random
sample fails to reject the null hypothesis even when the true population
mean \(\mu\) is in fact different from
\(\mu_0\).
Assume that the population has a known standard deviation \(\sigma\). By the Central Limit Theorem, the
population of all possible means of samples of sufficiently large size n
approximately follows the normal distribution. Hence we can compute the
range of sample means for which the null hypothesis will not be
rejected, and then obtain an estimate of the probability of type II
error.
Example 6
Some journals concluded that the average weight of Hachiko Dogs
around the world last ten years was 15.4 kg. Researchers want to make
sure if there a change in the average weight of these varieties after
ten years. Assume the actual mean population weight is 15.1 kg, and the
population standard deviation is 2.5 kg. At .05 significance level, what
is the probability of having type II error for a sample size of 35
Hachiko Dogs?
Standard Error of
the Mean
We begin with computing the standard deviation of the mean, sem.
n = 35 # sample size
sigma = 2.5 # population standard deviation
sem = sigma/sqrt(n); sem # standard error
## [1] 0.4225771
Next compute the left and right bounds of sample means for which the
null hypothesis \(\mu = 15.4\) would
not be rejected.
Sample Mean
alpha = .05 # significance level
mu0 = 15.4 # hypothetical mean
I = c(alpha/2, 1-alpha/2)
q = qnorm(I, mean=mu0, sd=sem); q
## [1] 14.57176 16.22824
Therefore, so long as the sample mean is between 14.572 and 16.228 in
a hypothesis test, the null hypothesis will not be rejected. Since we
assume that the actual population mean is 15.1, we can compute the lower
tail probabilities of both end points.
Probability of
Error
mu = 15.1 # assumed actual mean
p = pnorm(q, mean=mu, sd=sem); p
## [1] 0.1056435 0.9962062
## [1] 0.8905627
Finally, the probability of type II error is the probability between
the two end points. If the sample size of Hachiko Dogs is 35, the actual
mean population weight is 15.1 kg and the population standard deviation
is 2.5 kg, then the probability of type II error for testing the null
hypothesis \(\mu = 15.4\) at .05
significance level is 89.1%, and the power of the hypothesis test is
10.9%.
Exercise 6
Under same assumptions as case 27, if actual mean population weight
is 14.9 kg, what is the probability of type II errors? What is the power
of the hypothesis test?
kita mulai dengan mencari ukuran sampel, standar deviasi populasi,
dan standar error.
# sample size
n = 35
# population standard deviation
sigma = 2.5
# standard error
sem = sigma/sqrt(n)
sem
## [1] 0.4225771
Selanjutnya, kami menghitung batas bawah dan atas sampel berarti
hipotesis nol \(μ = 15,4\) tidak
ditolak.
#significance level
alpha= 0.05
# hypothetical mean
mu0 = 15.4
I = c(alpha/2, 1- alpha/2)
q= qnorm(I, mean = mu0, sd= sem)
q
## [1] 14.57176 16.22824
Jadi, kita tahu bahwa selama rata-rata sampel antara 14,57176 dan
16,22824, hipotesis nol tidak akan ditolak. Karena, kami berasumsi bahwa
rata-rata populasi sebenarnya adalah 14,9, kami menghitung probabilitas
ekor bawah dari kedua titik akhir
# Actual mean
mu = 14.9
p = pnorm(q, mean=mu, sd= sem)
p
## [1] 0.2186537 0.9991644
Akhirnya, probabilitas kesalahan tipe II adalah probabilitas antara
dua titik akhir
## [1] 0.7805107
Jika, ukuran sampel adalah 35, berat populasi rata-rata sebenarnya
adalah 14,9 kg dan standar deviasi populasi adalah 2,5 kg, maka
probabilitas kesalahan tipe II untuk menguji hipotesis nol \(μ = 15,4\) pada tingkat signifikansi 0,05
adalah 78,1% , dan kekuatan uji hipotesis adalah 21,9%.
LS0tDQp0aXRsZTogIkxhYjQ6IEh5cG90aGVzaXMgVGVzdGluZyINCmF1dGhvcjogIkNhbHZpbiBSaXN3YW5kaSINCmRhdGU6ICJgciBmb3JtYXQoU3lzLkRhdGUoKSwgJyVCICVkLCAlWScpYCINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICBoaWdobGlnaHQ6IHB5Z21lbnRzDQogICAgdGhlbWU6IHNwYWNlbGFiDQogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMNCiAgICB0b2M6IHllcw0KICAgIHRvY19mbG9hdDogeWVzDQogICAgY29kZV9kb3dubG9hZDogeWVzDQogICAgY29kZV9mb2xkaW5nOiBoaWRlDQotLS0NCg0KYGBge3IgTG9nbywgZWNobz1GQUxTRSxmaWcuYWxpZ249J2NlbnRlcicsIG91dC53aWR0aCA9ICc0MCUnfQ0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoImh0dHBzOi8vZ2l0aHViLmNvbS9CYWt0aS1TaXJlZ2FyL2ltYWdlcy9ibG9iL21hc3Rlci9sb2dvLnBuZz9yYXc9dHJ1ZSIpDQpgYGANCg0KDQojIEludHJvZHVjdGlvbg0KDQpBcyBhIGRhdGEgc2NpZW50aXN0IHlvdSBwcm9iYWJseSByZXRhaW4gb3IgcmVqZWN0IGh5cG90aGVzaXMgYmFzZWQgb24gbWVhc3VyZW1lbnRzIG9mIG9ic2VydmVkIHNhbXBsZXMuIFRoZSBkZWNpc2lvbiBpcyBvZnRlbiBiYXNlZCBvbiBhIHN0YXRpc3RpY2FsIG1lY2hhbmlzbSBjYWxsZWQgaHlwb3RoZXNpcyB0ZXN0aW5nLiBMZXQncyB3YXRjaGluZyB0aGUgZm9sbG93aW5nIHZpZGVvOg0KDQo8Y2VudGVyPg0KPGlmcmFtZSB3aWR0aD0iNzUwIiBoZWlnaHQ9IjQ1MCIgc3JjPSJodHRwczovL3d3dy55b3V0dWJlLmNvbS9lbWJlZC9hX2w5OTF4VUFPVSIgZnJhbWVib3JkZXI9IjAiIGFsbG93PSJhY2NlbGVyb21ldGVyOyBhdXRvcGxheTsgZW5jcnlwdGVkLW1lZGlhOyBneXJvc2NvcGU7IHBpY3R1cmUtaW4tcGljdHVyZSIgYWxsb3dmdWxsc2NyZWVuPjwvaWZyYW1lPg0KPC9jZW50ZXI+DQoNCjxicj4NCg0KVGhlcmUgYXJlIHRocmVlIGNvbmRpdGlvbnMgb2YgaGF2aW5nIGh5cG90aGVzaXMgdGVzdGluZyBpbmNsdWRlZDoNCg0KKiAqKkxlZnQgVGFpbGVkIFRlc3Q6KiogV2hlbiB0aGUgJFxiYXJ7eH0kIGlzIHNpZ25pZmljYW50bHkgYmVsb3cgdGhlIGh5cG90aGVzaXNlZCBwb3B1bGF0aW9uIG1lYW4gJMK1XzAkIHRoZW4gJEhfMCQgd2lsbCBiZSByZWplY3RlZCBhbmQgdGhlIHRlc3QgdXNlZCB3aWxsIGJlIHRoZSBsZWZ0IHRhaWxlZCB0ZXN0IChsb3dlciB0YWlsZWQgdGVzdCkgc2luY2UgdGhlIGNyaXRpY2FsIHJlZ2lvbiAoZGVub3RpbmcgcmVqZWN0aW9uIG9mICRIXzAkKSB3aWxsIGJlIGluIHRoZSBsZWZ0IHRhaWwgb2YgdGhlIG5vcm1hbCBjdXJ2ZSAocmVwcmVzZW50aW5nIHNhbXBsaW5nIGRpc3RyaWJ1dGlvbiBvZiBzYW1wbGUgc3RhdGlzdGljICRcYmFye3h9JCkuIA0KDQpcW1x0ZXh0e0xlZnQgVGFpbGVkIFRlc3R9ID0gXGJlZ2lue2Nhc2VzfSB7SF8wOiBcbXUgXGdlIFxtdV8wfSBcXA0KICAgICAgICAgICAgICAgICAgICAgIHtIMTogXG11IDwgXG11XzAgfSBcZW5ke2Nhc2VzfVxdDQoNCiogKipSaWdodCBUYWlsZWQgVGVzdDoqKiBXaGVuIHRoZSAkXGJhcnt4fSQgaXMgc2lnbmlmaWNhbnRseSBhYm92ZSB0aGUgaHlwb3RoZXNpemVkIHBvcHVsYXRpb24gbWVhbiAkwrVfMCQgdGhlbiAkSF8wJCB3aWxsIGJlIHJlamVjdGVkIGFuZCB0aGUgdGVzdCB1c2VkIHdpbGwgYmUgcmlnaHQgdGFpbGVkIHRlc3QgKHVwcGVyIHRhaWxlZCB0ZXN0KSBzaW5jZSB0aGUgY3JpdGljYWwgcmVnaW9uIChkZW5vdGluZyByZWplY3Rpb24gb2YgJEhfMCQgd2lsbCBiZSBpbiB0aGUgcmlnaHQgdGFpbCBvZiB0aGUgbm9ybWFsIGN1cnZlIChyZXByZXNlbnRpbmcgc2FtcGxpbmcgZGlzdHJpYnV0aW9uIG9mIHNhbXBsZSBzdGF0aXN0aWMgJFxiYXJ7eH0kICkuDQoNClxbXHRleHR7UmlnaHQgVGFpbGVkIFRlc3R9ID0gXGJlZ2lue2Nhc2VzfSB7SF8wOiBcbXUgXGxlIFxtdV8wfSBcXA0KICAgICAgICAgICAgICAgICAgICAgIHtIMTogXG11ID4gXG11XzAgfSBcZW5ke2Nhc2VzfVxdDQoNCiogKipUd28gVGFpbGVkIFRlc3Q6KiogV2hlbiB0aGUgJFxiYXJ7eH0kIGlzIHNpZ25pZmljYW50bHkgZGlmZmVyZW50IChzaWduaWZpY2FudGx5IGhpZ2hlciBvciBsb3dlciB0aGFuKSBmcm9tIHRoZSBoeXBvdGhlc2lzIHBvcHVsYXRpb24gbWVhbiAkwrVfMCQgdGhlbiAkSF8wJCB3aWxsIHdpbGwgYmUgcmVqZWN0ZWQuIEluIHRoaXMgY2FzZSwgdGhlIHR3byB0YWlsZWQgdGVzdCB3aWxsIGJlIGFwcGxpY2FibGUgYmVjYXVzZSB0aGVyZSB3aWxsIGJlIHR3byBjcml0aWNhbCByZWdpb25zIChkZW5vdGluZyByZWplY3Rpb24gb2YgJEhfMCQpIG9uIGJvdGggdGhlIHRhaWxzIG9mIHRoZSBub3JtYWwgY3VydmUgKHJlcHJlc2VudGluZyBzYW1wbGluZyBkaXN0cmlidXRpb24gb2Ygc2FtcGxlIHN0YXRpc3RpYyAkXGJhcnt4fSQpLiANCg0KXFtcdGV4dHtUd28gVGFpbGVkIFRlc3R9ID0gXGJlZ2lue2Nhc2VzfSB7SF8wOiBcbXUgPSBcbXVfMH0gXFwNCiAgICAgICAgICAgICAgICAgICAgICB7SDE6IFxtdSBcbmVxIFxtdV8wIH0gXGVuZHtjYXNlc31cXQ0KDQoNCiMgSHlwb3RoZXNpcyBUZXN0aW5nIA0KDQpUaGUgY3JpdGljYWwgcmVnaW9ucyBmb3IgYEh5cG90aGVzaXMgVGVzdGluZ2AgYXJlIHNob3duIGFzIHNoYWRlZCBwb3J0aW9ucyBpbiB0aGUgZm9sbG93aW5nIGZpZ3VyZToNCg0KYGBge3IsIGVjaG89RkFMU0UsZmlnLmFsaWduPSdjZW50ZXInLGZpZy5jYXA9Ikh5cG90aGVzaXMgVGVzdGluZyIsIG91dC53aWR0aCA9ICcxMDAlJ30NCmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKCJIeXBvdGhlc2lzLVRlc3RpbmcuanBlZyIpDQpgYGANCg0KT24gY29tcGFyaW5nIHRoZSBvYnNlcnZlZCB2YWx1ZSBvZiBUZXN0IHN0YXRpc3RpYyB3aXRoIHRoYXQgb2YgdGhlIGNyaXRpY2FsIHZhbHVlLCB3ZSBtYXkgaWRlbnRpZnkgd2hldGhlciB0aGUgb2JzZXJ2ZWQgdmFsdWUgbGllcyBpbiB0aGUgY3JpdGljYWwgcmVnaW9uIChyZWplY3QgJEhfMCQpIG9yIGluIHRoZSBhY2NlcHRhbmNlIHJlZ2lvbiAoZG8gbm90IHJlamVjdCAkSF8wJCkgYW5kIGRlY2lkZSBhY2NvcmRpbmdseS4NCg0KKiBMZWZ0IFRhaWxlZCBUZXN0OiBJZiAkWl97Q3JpdH0gPCAtMS42NDUkLCB0aGVuIHJlamVjdCAkSF8wJCBhdCA1JSBsZXZlbCBvZiBTaWduaWZpY2FuY2UgKCRcYWxwaGEkIGlzIHRha2VuIGFzIDUlIGluIG1vc3Qgb2YgdGhlIGFuYWx5dGljIHNpdHVhdGlvbnMpLg0KKiBSaWdodCBUYWlsZWQgVGVzdDogSWYgJFpfe0NyaXR9ID4gMS42NDUkLCB0aGVuIHJlamVjdCAkSF8wJCBhdCA1JSBsZXZlbCBvZiBTaWduaWZpY2FuY2UuDQoqIFR3byBUYWlsZWQgVGVzdDogSWYgJFpfe0NyaXR9PiAxLjk2JCBvciBJZiAkWl97Q3JpdH0gPCAtMS45NiQsIHRoZW4gcmVqZWN0ICRIXzAkIGF0IDUlIExldmVsIG9mIFNpZ25pZmljYW5jZS4NCg0KVGhlcmUgaXMgYWxzbyBhbiBhbHRlcm5hdGl2ZSBhcHByb2FjaCBmb3IgaHlwb3RoZXNpcyB0ZXN0aW5nLCB0aGlzIGFwcHJvYWNoIGlzIHZlcnkgbXVjaCB1c2VkIGluIGFsbCB0aGUgc29mdHdhcmUgcGFja2FnZXMuIEhlcmUsIHlvdSB3aWxsIGZ1Y29zIG9uIHRoZSBmb2xsb3dpbmcgc3RhdGVtZW50Og0KDQoqIElmIHAtdmFsdWUgJDwgXGFscGhhJDogcmVqZWN0ICRIXzAkDQoqIElmIHAtdmFsdWUgJFxnZSBcYWxwaGEkIDogRmFpbHMgdG8gUmVqZWN0ICRIXzAkDQoNClByb2NlZHVyZSBmb3IgRmluZGluZyBQLVZhbHVlczoNCg0KYGBge3IsIGVjaG89RkFMU0UsZmlnLmFsaWduPSdjZW50ZXInLGZpZy5jYXA9IlAtdmFsdWVzIiwgb3V0LndpZHRoID0gJzEwMCUnfQ0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoIlAtdmFsdWVzLnBuZyIpDQpgYGANCg0KIyBUeXBlIG9mIEVycm9yIEkgJiBJSQ0KDQoqIEEgVHlwZSBJIGVycm9yIGlzIHRoZSBtaXN0YWtlIG9mIHJlamVjdGluZyB0aGUgbnVsbCBoeXBvdGhlc2lzIHdoZW4gaXQgaXMgdHJ1ZS4gVGhlIHN5bWJvbCAkXGFscGhhJCAoYWxwaGEpIGlzIHVzZWQgdG8gcmVwcmVzZW50IHRoZSBwcm9iYWJpbGl0eSBvZiBhIHR5cGUgSSBlcnJvci4gDQoNCiogQSBUeXBlIElJIGVycm9yIGlzIHRoZSBtaXN0YWtlIG9mIGZhaWxpbmcgdG8gcmVqZWN0IHRoZSBudWxsIGh5cG90aGVzaXMgd2hlbiBpdCBpcyBmYWxzZS4gVGhlIHN5bWJvbCAkXGJldGEkIChiZXRhKSBpcyB1c2VkIHRvIHJlcHJlc2VudCB0aGUgcHJvYmFiaWxpdHkgb2YgYSB0eXBlIElJIGVycm9yLg0KDQpgYGB7ciwgZWNobz1GQUxTRSxmaWcuYWxpZ249J2NlbnRlcicsZmlnLmNhcD0iVHlwZSBvZiBFcnJvciIsIG91dC53aWR0aCA9ICcxMDAlJ30NCmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKCJUeXBlLW9mLWVycm9yLnBuZyIpDQpgYGANCg0KIyBUeXBlIEkgfiBPbmUgVGFpbCBaLXRlc3QNCg0KVGhlIG51bGwgaHlwb3RoZXNpcyBvZiB0aGUgT25lLXRhaWwgKGxlZnQvcmlnaHQpIHRlc3Qgb2YgdGhlIHBvcHVsYXRpb24gbWVhbiAkXG11JCBhbmQgJFxzaWdtYSQgY2FuIGJlIGV4cHJlc3NlZCBhcyBmb2xsb3dzOg0KDQpcW1x0ZXh0e0h5cG90aGVzaXMgVGVzdGluZyAkSF8wJH0gPSBcYmVnaW57Y2FzZXN9IHtcbXUgXGdlIFxtdV8wfSAmIFx0ZXh0e0xlZnQgVGFpbH0gXFwNCiAgICAgICAgICAgICAgICAgICAgICB7XG11IFxsZSBcbXVfMH0gJiBcdGV4dHtSaWdodCBUYWlsfSBcZW5ke2Nhc2VzfVxdDQoNCndoZXJlICRcbXVfMCQgaXMgYSBoeXBvdGhlc2l6ZWQgbGVmdC9yaWdodCBib3VuZCBvZiB0aGUgdHJ1ZSBwb3B1bGF0aW9uIG1lYW4gJFxtdSQuDQoNCkxldCB1cyBkZWZpbmUgdGhlIHRlc3Qgc3RhdGlzdGljICR6JCBpbiB0ZXJtcyBvZiB0aGUgc2FtcGxlIG1lYW4sIHRoZSBzYW1wbGUgc2l6ZSBhbmQgdGhlIHBvcHVsYXRpb24gc3RhbmRhcmQgZGV2aWF0aW9uICRcc2lnbWEkOg0KDQpcW3o9e1xiYXJ7eH0tXG11XzAgXG92ZXIgXHNpZ21hL1xzcXJ0e259fVxdDQoNClRoZW4gdGhlIG51bGwgaHlwb3RoZXNpcyBvZiB0aGUgbGVmdCB0YWlsIHRlc3QgaXMgdG8gYmUgcmVqZWN0ZWQgaWYgJHogXGxlIOKIknpfXGFscGhhJCAsIHdoZXJlICR6X1xhbHBoYSQgaXMgdGhlICQxMDAoMS1cYWxwaGEpJCBwZXJjZW50aWxlIG9mIHRoZSBzdGFuZGFyZCBub3JtYWwgZGlzdHJpYnV0aW9uLg0KDQojIyBFeGFtcGxlIDENCg0KKipMZWZ0IFRhaWw6KiogU3VwcG9zZSB0aGUgbWFudWZhY3R1cmVyIGNsYWltcyB0aGF0IHRoZSBtZWFuIHNwZWVkIG9mIGEgbW90b3JjeWNsZSBpcyBtb3JlIHRoYW4gMTAwIGttL2hvdXJzLiBJbiBhIHNhbXBsZSBvZiAzMCBtb3RvcmN5Y2xlcywgaXQgd2FzIGZvdW5kIHRoYXQgdGhleSBvbmx5IGxhc3QgOTkga20vaG91cnMgb24gYXZlcmFnZS4gQXNzdW1lIHRoZSBwb3B1bGF0aW9uIHN0YW5kYXJkIGRldmlhdGlvbiBpcyAxLjIga20vaG91cnMuIEF0IC4wNSBzaWduaWZpY2FuY2UgbGV2ZWwsIGNhbiB3ZSByZWplY3QgdGhlIGNsYWltIGJ5IHRoZSBtYW51ZmFjdHVyZXI/DQoNCiMjIyBaLXRlc3Qgc3RhdGlzdGljcw0KDQpGaXJzdCwgd2UgY2FsY3VsYXRlIHRoZSB6LXRlc3Qgc3RhdGlzdGljcyBhY2NvcmRpbmcgdG8gdGhlIGluZm9ybWF0aW9uIHRoYXQgd2UgaGF2ZSBmcm9tIHRoZSBFeGFtcGxlIDEuIEluIHRoaXMgY2FzZSwgd2UgdXNlIHotc3RhdGlzdGljcyBiZWNhdXNlIHdlIGtub3cgdGhlIG1lYW4gJFxtdSQgYW5kIHN0YW5kYXJkIGRldmlhdGlvbiAkXHNpZ21hJCwgYWxzbyB3ZSBrbm93IHRoYXQgdGhlIHNhbXBsZSBzaXplICRcZ2UgMzAkLg0KDQpgYGB7cn0NCm11MCA9IDEwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGh5cG90aGVzaXplZCB2YWx1ZSANCnhiYXIgPSA5OSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHNhbXBsZSBtZWFuIA0Kc2lnbWEgPSAxLjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgcG9wdWxhdGlvbiBzdGFuZGFyZCBkZXZpYXRpb24gDQpuID0gMzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBzYW1wbGUgc2l6ZSANCnogPSAoeGJhci1tdTApLyhzaWdtYS9zcXJ0KG4pKTt6ICAgICAgICAgICAgICAgICAgICAgICAjIHRlc3Qgc3RhdGlzdGljIA0KYGBgDQoNCiMjIyBDcml0aWNhbCB2YWx1ZQ0KDQpUaGVuLCB3ZSBjYWxjdWxhdGUgdGhlIGxlZnQgY3JpdGljYWwgdmFsdWUuIA0KDQpgYGB7cn0NCmFscGhhID0gLjA1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIC4wNSBzaWduaWZpY2FuY2UgbGV2ZWwNCnouYWxwaGEgPSBxbm9ybSgxLWFscGhhKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHJpZ2h0IHRhaWwgY3JpdGljYWwgdmFsdWUNCi16LmFscGhhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGxlZnQgdGFpbCBjcml0aWNhbCB2YWx1ZSANCmBgYA0KDQpOb3csIHdlIGNhbiBjb25jbHVkZSB0aGF0IHRoZSB0ZXN0IHN0YXRpc3RpYyAtNC41NjQ0IGlzIGxlc3MgdGhhbiB0aGUgY3JpdGljYWwgdmFsdWUgb2YgLTEuNjQ0OS4gQ29uc2VxdWVudGx5LCBhdCAuMDUgc2lnbmlmaWNhbmNlIGxldmVsLCB3ZSByZWplY3QgdGhlIGNsYWltIHRoYXQgbWVhbiBsaWZldGltZSBvZiBhIG1vdG9yY3ljbGUgaXMgYWJvdmUgMTAwIGttL2hvdXJzLg0KDQojIyMgUC12YWx1ZQ0KDQoqKkFsdGVybmF0aXZlIHNvbHV0aW9uOioqIEluc3RlYWQgb2YgdXNpbmcgdGhlIGNyaXRpY2FsIHZhbHVlLCB3ZSBhcHBseSB0aGUgcG5vcm0gZnVuY3Rpb24gdG8gY29tcHV0ZSB0aGUgbGVmdCB0YWlsIHAtdmFsdWUgb2YgdGhlIHRlc3Qgc3RhdGlzdGljLiBBcyBpdCB0dXJucyBvdXQgdG8gYmUgbGVzcyB0aGFuIHRoZSAuMDUgc2lnbmlmaWNhbmNlIGxldmVsLCB3ZSByZWplY3QgdGhlIG51bGwgaHlwb3RoZXNpcyB0aGF0ICTOvCBcZ2UgMTAwJC4NCg0KYGBge3J9DQpwdmFsID0gcG5vcm0oeikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBsZWZ0IHRhaWwgcOKIknZhbHVlDQpwdmFsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBwcmludCBw4oiSdmFsdWUNCmBgYA0KDQoNCiMjIEV4ZXJjaXNlIDENCg0KKipSaWdodCBUYWlsOioqIEEgZm9vZCBjb21wYW55IGFyZ3VlIHRoYXQgZm9yIGVhY2ggYSBjb29raWUgYmFnIG9mIHRoZWlyIHByb2R1Y3RzLCB0aGVyZSBpcyBhdCBtb3N0IDIgZ3JhbXMgb2Ygc2F0dXJhdGVkIGZhdCBpbiBhIHNpbmdsZSBjb29raWUuIEluIGEgc2FtcGxlIG9mIDQwIGNvb2tpZXMsIGl0IGlzIGZvdW5kIHRoYXQgdGhlIG1lYW4gYW1vdW50IG9mIHNhdHVyYXRlZCBmYXQgcGVyIGNvb2tpZSBpcyAyLjEgZ3JhbXMuIEFzc3VtZSB0aGF0IHRoZSBwb3B1bGF0aW9uIHN0YW5kYXJkIGRldmlhdGlvbiBpcyAwLjI1IGdyYW1zLiBBdCAuMDUgc2lnbmlmaWNhbmNlIGxldmVsLCBjYW4gd2UgcmVqZWN0IHRoZSBjbGFpbT8NCg0KYGBge3J9DQojIFNhbXBsZSBtZWFuDQp4YmFyPSAyLjEgDQoNCiMgU2lnbWEgKFBvcHVsYXRpb24gc3RhbmRhcmQgZGV2aWF0aW9uKSANCnNpZ21hID0gMC4yNQ0KDQojIEh5cG90aGVzaXplZCB2YWx1ZQ0KbXUwID0gMg0KDQojIFNhbXBsZSBzaXplDQpuID0gNDANCg0KIyBaLSBzdGF0aXN0aWNzIA0KeiA9ICh4YmFyIC0gbXUwKS8oc2lnbWEvc3FydChuKSkNCnoNCg0KIyBBbHBoYQ0KYWxwaGEgPSAwLjA1DQp6LmFscGhhID0gcW5vcm0oMS1hbHBoYSkNCg0KIyBDcml0aWNhbCBWYWx1ZQ0Kei5hbHBoYQ0KDQoNCmBgYA0KDQpKYWRpLCB1amkgc3RhdGlzdGlrIDIsNTI5ODIyIGxlYmloIGJlc2FyIGRhcmkgbmlsYWkga3JpdGlzIDEsNjQ0ODU0LiBUZXMgYXJhaCBrYW5hbjogamlrYSAkWl97Q3JpdH0kICQ+IFokIGxhbHUgdG9sYWsgJEhfMCQgcGFkYSB0aW5na2F0IHNpZ25pZmlrYW5zaSA1JS4gT2xlaCBrYXJlbmEgaXR1LCBwYWRhIHRpbmdrYXQgc2lnbmlmaWthbnNpIDAsMDUsIGthbWkgbWVub2xhayBwZXJueWF0YWFuIGJhaHdhIHRlcmRhcGF0IHBhbGluZyBiYW55YWsgMiBncmFtIGxlbWFrIGplbnVoIGRhbGFtIHNlYnVhaCBrdWUuDQoNCiMgVHlwZSBJIH4gVHdvIFRhaWwgWi10ZXN0DQoNClRoZSBudWxsIGh5cG90aGVzaXMgb2YgdGhlIHR3by10YWlsZWQgdGVzdCBvZiB0aGUgcG9wdWxhdGlvbiBtZWFuICAkXG11JCBhbmQgJFxzaWdtYSQgY2FuIGJlIGV4cHJlc3NlZCBhcyBmb2xsb3dzOg0KDQpcW1xtdV8wID0gXG11XF0NCg0Kd2hlcmUgJFxtdV8wJCBpcyBhIGh5cG90aGVzaXplZCB2YWx1ZSBvZiB0aGUgdHJ1ZSBwb3B1bGF0aW9uIG1lYW4gJFxtdSQuDQoNCkxldCB1cyBkZWZpbmUgdGhlIHRlc3Qgc3RhdGlzdGljICR6JCBpbiB0ZXJtcyBvZiB0aGUgc2FtcGxlIG1lYW4sIHRoZSBzYW1wbGUgc2l6ZSBhbmQgdGhlIHBvcHVsYXRpb24gc3RhbmRhcmQgZGV2aWF0aW9uICRcc2lnbWEkOg0KDQpcW3o9e1xiYXJ7eH0tXG11XzAgXG92ZXIgXHNpZ21hL1xzcXJ0e259fVxdDQoNClRoZW4gdGhlIG51bGwgaHlwb3RoZXNpcyBvZiB0aGUgdHdvLXRhaWxlZCB0ZXN0IGlzIHRvIGJlIHJlamVjdGVkIGlmICR6IFxsZSAtIHpfe1xhbHBoYS8yfSQgb3IgJHogXGdlIHpfe1xhbHBoYS8yfSQgLCB3aGVyZSAkel97XGFscGhhLzJ9JCBpcyB0aGUgJDEwMCgxLVxhbHBoYS8yKSQgcGVyY2VudGlsZSBvZiB0aGUgc3RhbmRhcmQgbm9ybWFsIGRpc3RyaWJ1dGlvbi4NCg0KIyMgRXhhbXBsZSAyDQoNClN1cHBvc2UgdGhlIG1lYW4gd2VpZ2h0IG9mIEtpbmcgUGVuZ3VpbnMgZm91bmQgaW4gYW4gQW50YXJjdGljIGNvbG9ueSBsYXN0IHllYXIgd2FzIDE1LjQga2cuIEluIGEgc2FtcGxlIG9mIDM1IHBlbmd1aW5zIHNhbWUgdGltZSB0aGlzIHllYXIgaW4gdGhlIHNhbWUgY29sb255LCB0aGUgbWVhbiBwZW5ndWluIHdlaWdodCBpcyAxNC42IGtnLiBBc3N1bWUgdGhlIHBvcHVsYXRpb24gc3RhbmRhcmQgZGV2aWF0aW9uIGlzIDIuNSBrZy4gQXQgLjA1IHNpZ25pZmljYW5jZSBsZXZlbCwgY2FuIHdlIHJlamVjdCB0aGUgbnVsbCBoeXBvdGhlc2lzIHRoYXQgdGhlIG1lYW4gcGVuZ3VpbiB3ZWlnaHQgZG9lcyBub3QgZGlmZmVyIGZyb20gbGFzdCB5ZWFyPw0KDQoNCiMjIyBaLXRlc3Qgc3RhdGlzdGljcw0KDQpGaXJzdCwgd2UgY2FsY3VsYXRlIHRoZSB6LXRlc3Qgc3RhdGlzdGljcyBhY2NvcmRpbmcgdG8gdGhlIGluZm9ybWF0aW9uIHRoYXQgd2UgaGF2ZSBmcm9tIHRoZSBFeGFtcGxlIDIuIEluIHRoaXMgY2FzZSwgd2UgdXNlIHotc3RhdGlzdGljcyBiZWNhdXNlIHdlIGtub3cgdGhlIG1lYW4gJFxtdSQgYW5kIHN0YW5kYXJkIGRldmlhdGlvbiAkXHNpZ21hJCwgYWxzbyB3ZSBrbm93IHRoYXQgdGhlIHNhbXBsZSBzaXplICRcZ2UgMzAkLg0KDQpgYGB7cn0NCm11MCA9IDE1LjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGh5cG90aGVzaXplZCB2YWx1ZSANCnhiYXIgPSAxNC42ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHNhbXBsZSBtZWFuIA0Kc2lnbWEgPSAyLjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgcG9wdWxhdGlvbiBzdGFuZGFyZCBkZXZpYXRpb24gDQpuID0gMzUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBzYW1wbGUgc2l6ZSANCnogPSAoeGJhci1tdTApLyhzaWdtYS9zcXJ0KG4pKTt6ICAgICAgICAgICAgICAgICAgICAgICAjIHRlc3Qgc3RhdGlzdGljIA0KYGBgDQoNCiMjIyBDcml0aWNhbCB2YWx1ZQ0KDQpUaGVuLCB3ZSBjYWxjdWxhdGUgdGhlIGxlZnQgY3JpdGljYWwgdmFsdWUuIA0KDQpgYGB7cn0NCmFscGhhID0gLjA1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIC4wNSBzaWduaWZpY2FuY2UgbGV2ZWwNCnouaGFsZi5hbHBoYSA9IHFub3JtKDEtYWxwaGEvMikgICAgICAgICAgICAgICAgICAgICAgICAjIHBlci1vbmUgdGFpbCAuMDI1IHNpZ25pZmljYW5jZSBsZXZlbA0KYygtei5oYWxmLmFscGhhLCB6LmhhbGYuYWxwaGEpICAgICAgICAgICAgICAgICAgICAgICAgICMgVHdvLVRhaWxlZCAwLjA1IHNpZ25pZmljYW5jZSBsZXZlbCAgIA0KYGBgDQoNClRoZSB0ZXN0IHN0YXRpc3RpYyAtMS44OTMxIGxpZXMgYmV0d2VlbiB0aGUgY3JpdGljYWwgdmFsdWVzIC0xLjk2MDAgYW5kIDEuOTYwMC4gSGVuY2UsIGF0IC4wNSBzaWduaWZpY2FuY2UgbGV2ZWwsIHdlIGRvIG5vdCByZWplY3QgdGhlIG51bGwgaHlwb3RoZXNpcyB0aGF0IHRoZSBtZWFuIHBlbmd1aW4gd2VpZ2h0IGRvZXMgbm90IGRpZmZlciBmcm9tIGxhc3QgeWVhci4NCg0KIyMjIFAtdmFsdWUNCg0KKipBbHRlcm5hdGl2ZSBzb2x1dGlvbjoqKiBJbnN0ZWFkIG9mIHVzaW5nIHRoZSBjcml0aWNhbCB2YWx1ZSwgd2UgYXBwbHkgdGhlIGAyKnBub3JtKClgIGZ1bmN0aW9uIHRvIGNvbXB1dGUgdGhlIHR3byB0YWlsIHAtdmFsdWUgb2YgdGhlIHRlc3Qgc3RhdGlzdGljLiANCg0KYGBge3J9DQpwdmFsPTIqcG5vcm0oLWFicyh6KSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB0d28gdGFpbCBw4oiSdmFsdWUNCnB2YWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHByaW50IHDiiJJ2YWx1ZQ0KYGBgDQpBcyBpdCB0dXJucyBvdXQgdG8gYmUgZ3JlYXRlciB0aGFuIHRoZSAuMDUgc2lnbmlmaWNhbmNlIGxldmVsLCB3ZSBkbyBub3QgcmVqZWN0IHRoZSBudWxsIGh5cG90aGVzaXMgdGhhdCAkzrwgXGdlIDEwMCQuDQoNCiMjIEV4ZXJjaXNlIDINCg0KVG8gdGVzdCB0aGUgaHlwb3RoZXNpcyB0aGF0IHRoZSBtZWFuIHN5c3RvbGljIGJsb29kIHByZXNzdXJlIGluIGEgY2VydGFpbiBwb3B1bGF0aW9uIGVxdWFscyAxNDAgbW1IZy4gVGhlIHN0YW5kYXJkIGRldmlhdGlvbiBoYXMgYSBrbm93biB2YWx1ZSBvZiAyMCBhbmQgYSBkYXRhIHNldCBvZiA1NSBwYXRpZW50cyBpcyBhdmFpbGFibGUuDQoNCmBgYHtyfQ0KI0Jsb29kX3ByZXNzdXJlIGRhdGFzZXQNCm5vIDwtIHNlcSgxOjU1KQ0Kc3RhdHVzIDwtIGMocmVwKDAsIDI1KSwgcmVwKDEsIDMwKSkNCm1taGcgPC0gYygxMjAsMTE1LDk0LDExOCwxMTEsMTAyLDEwMiwxMzEsMTA0LDEwNywxMTUsMTM5LDExNSwxMTMsMTE0LDEwNSwNCiAgICAgICAgICAxMTUsMTM0LDEwOSwxMDksOTMsMTE4LDEwOSwxMDYsMTI1LDE1MCwxNDIsMTE5LDEyNywxNDEsMTQ5LDE0NCwNCiAgICAgICAgICAxNDIsMTQ5LDE2MSwxNDMsMTQwLDE0OCwxNDksMTQxLDE0NiwxNTksMTUyLDEzNSwxMzQsMTYxLDEzMCwxMjUsDQogICAgICAgICAgMTQxLDE0OCwxNTMsMTQ1LDEzNywxNDcsMTY5KQ0KYmxvb2RfcHJlc3N1cmUgPC1kYXRhLmZyYW1lKG5vLHN0YXR1cyxtbWhnKQ0KYmxvb2RfcHJlc3N1cmUNCmBgYA0KDQpKYWRpLCBwZXJ0YW1hLXRhbWEga2l0YSBtZW5naGl0dW5nIHJhdGEtcmF0YSBzYW1wZWwgZGFuIG1lbmVtdWthbiB0b3RhbCB1a3VyYW4gc2FtcGVsLiBJdHUsIGthbWkgbWVuZXRhcGthbiBoaXBvdGVzaXMgbm9sIGRhbiBzaWdtYSB1bnR1ayBtZW5lbXVrYW4gei4gS2VtdWRpYW4sIGthbWkganVnYSBtZW5jYXJpIHB2YWx1ZSBBLCBCLCBkYW4gQy4NCg0KYGBge3J9DQojIFNhbXBsZSBtZWFuIGFuZCBUb3RhbCBzYW1wbGUgc2l6ZQ0KeGJhciA9IG1lYW4oYmxvb2RfcHJlc3N1cmUkbW1oZykNCm4gPSBsZW5ndGgoYmxvb2RfcHJlc3N1cmUkbW1oZykNCg0KIyBTZXQgbnVsbCBoeXBvdGhlc2lzIGFuZCBzaWdtYQ0KbXUwID0gMTQwDQpzaWdtYSA9IDIwDQoNCiMgei0gc3RhdGlzdGljcw0KeiA9ICh4YmFyLW11MCkvKHNpZ21hL3NxcnQobikpDQp6DQoNCiMgcCB2YWx1ZSBBLCBCLCBhbmQgQw0KcF92YWx1ZUEgPSAyKnBub3JtKC1hYnMoeikpICN0d290YWlsDQpwX3ZhbHVlQiA9IDEtIHBub3JtICh6KSAjcmlnaHR0YWlsDQpwX3ZhbHVlQyA9IHBub3JtKHopICNsZWZ0IHRhaWwNCg0KcF92YWx1ZUENCnBfdmFsdWVCDQpwX3ZhbHVlQw0KDQpgYGANCkphZGksIHBlcnRhbWEtdGFtYSBraXRhIG1lbmdoaXR1bmcgcmF0YS1yYXRhIHNhbXBlbCBkYW4gbWVuZW11a2FuIHRvdGFsIHVrdXJhbiBzYW1wZWwuIEl0dSwga2FtaSBtZW5ldGFwa2FuIGhpcG90ZXNpcyBub2wgZGFuIHNpZ21hIHVudHVrIG1lbmVtdWthbiB6LiBLZW11ZGlhbiwga2FtaSBqdWdhIG1lbmNhcmkgcHZhbHVlIEEsIEIsIGRhbiBDLg0KDQpMYWx1IGRpZGFwYXQgaGFzaWxueWE6DQoNCiR6JCA9IC0zLDcwODA5OQ0KcF9uaWxhaUEgPSAwLDAwMDIwODgyMDgNCnBfbmlsYWlCID0gMCw5OTk4OTU2DQpwX25pbGFpQyA9IDAsMDAwMTA0NDEwNA0KDQojIFR5cGUgSSB+IE9uZSBUYWlsIHQtdGVzdA0KDQpUaGUgbnVsbCBoeXBvdGhlc2lzIG9mIHRoZSBvbmUtdGFpbCAobGVmdC9yaWdodCkgdGVzdCBvZiB0aGUgcG9wdWxhdGlvbiBtZWFuICRcbXUkIGFuZCB1bmtub3duICRcc2lnbWEkIGNhbiBiZSBleHByZXNzZWQgYXMgZm9sbG93czoNCg0KXFtcdGV4dHtIeXBvdGhlc2lzIFRlc3RpbmcgJEhfMCR9ID0gXGJlZ2lue2Nhc2VzfSB7XG11IFxsZSBcbXVfMH0gJiBcdGV4dHtMZWZ0IFRhaWx9IFxcDQogICAgICAgICAgICAgICAgICAgICAge1xtdSBcZ2UgXG11XzB9ICYgXHRleHR7UmlnaHQgVGFpbH0gXGVuZHtjYXNlc31cXQ0KDQp3aGVyZSAkXG11XzAkIGlzIGEgaHlwb3RoZXNpemVkIGxlZnQvcmlnaHQgYm91bmQgb2YgdGhlIHRydWUgcG9wdWxhdGlvbiBtZWFuICRcbXUkLg0KDQpMZXQgdXMgZGVmaW5lIHRoZSB0ZXN0IHN0YXRpc3RpYyAkdCQgaW4gdGVybXMgb2YgdGhlIHNhbXBsZSBtZWFuLCB0aGUgc2FtcGxlIHNpemUgYW5kIHRoZSBzYW1wbGUgc3RhbmRhcmQgZGV2aWF0aW9uICRzJDoNCg0KXFt0PXtcYmFye3h9LVxtdV8wIFxvdmVyIHMvXHNxcnR7bn19XF0NCg0KVGhlbiB0aGUgbnVsbCBoeXBvdGhlc2lzIG9mIHRoZSBsb3dlciB0YWlsIHRlc3QgaXMgdG8gYmUgcmVqZWN0ZWQgaWYgJHRcbGXiiJJ0X1xhbHBoYSQgLCB3aGVyZSAkdF9cYWxwaGEkIGlzIHRoZSAkMTAwKDEg4oiSIFxhbHBoYSkkIHBlcmNlbnRpbGUgb2YgdGhlIFN0dWRlbnQgJHQkIGRpc3RyaWJ1dGlvbiB3aXRoICRuIOKIkiAxJCBkZWdyZWVzIG9mIGZyZWVkb20uDQoNCiMjIEV4YW1wbGUgMw0KDQpTdXBwb3NlIHRoZSBtYW51ZmFjdHVyZXIgY2xhaW1zIHRoYXQgdGhlIG1lYW4gbGlmZXRpbWUgb2YgYSBsaWdodCBidWxiIGlzIG1vcmUgdGhhbiAxMCwwMDAgaG91cnMuIEluIGEgc2FtcGxlIG9mIDMwIGxpZ2h0IGJ1bGJzLCBpdCB3YXMgZm91bmQgdGhhdCB0aGV5IG9ubHkgbGFzdCA5LDkwMCBob3VycyBvbiBhdmVyYWdlLiBBc3N1bWUgdGhlIHNhbXBsZSBzdGFuZGFyZCBkZXZpYXRpb24gaXMgMTI1IGhvdXJzLiBBdCAuMDUgc2lnbmlmaWNhbmNlIGxldmVsLCBjYW4gd2UgcmVqZWN0IHRoZSBjbGFpbSBieSB0aGUgbWFudWZhY3R1cmVyPw0KDQojIyMgVC10ZXN0IHN0YXRpc3RpY3MNCg0KRmlyc3QsIHdlIGNhbGN1bGF0ZSB0aGUgdC10ZXN0IHN0YXRpc3RpY3MgYWNjb3JkaW5nIHRvIHRoZSBpbmZvcm1hdGlvbiB0aGF0IHdlIGhhdmUgZnJvbSB0aGUgRXhhbXBsZSAxLiBJbiB0aGlzIGNhc2UsIHdlIHVzZSB0LXN0YXRpc3RpY3MgYmVjYXVzZSB3ZSBkb250IGtub3cgdGhlIG1lYW4gJFxtdSQgYW5kIHN0YW5kYXJkIGRldmlhdGlvbiAkXHNpZ21hJCBvZiBwdXB1bGF0aW9uLCBhbHNvIHdlIGtub3cgdGhhdCB0aGUgc2FtcGxlIHNpemUgJFxnZSAzMCQuDQoNCmBgYHtyfQ0KbXUwID0gMTAwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgaHlwb3RoZXNpemVkIHZhbHVlICANCnhiYXIgPSA5OTAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHNhbXBsZSBtZWFuIA0KcyA9IDEyNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgc2FtcGxlIHN0YW5kYXJkIGRldmlhdGlvbiANCm4gPSAzMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHNhbXBsZSBzaXplIA0KdCA9ICh4YmFyLW11MCkvKHMvc3FydChuKSk7dCAgICAgICAgICAgICAgICAgICAgICAgICAgICMgdGVzdCBzdGF0aXN0aWMgIA0KYGBgDQoNCiMjIyBDcml0aWNhbCB2YWx1ZQ0KDQpUaGVuLCB3ZSBjYWxjdWxhdGUgdGhlIGxlZnQgY3JpdGljYWwgdmFsdWUuIA0KDQpgYGB7cn0NCmFscGhhID0gLjA1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHVzZSAwLjA1IGxlZnQgdGFpbCBzaWduaWZpY2FudCBsZXZlbCANCnQuYWxwaGEgPSBxdCgxLWFscGhhLCBkZj1uLTEpICAgICAgICAgICAgICAgICAgICAgICAgICAjIHJpZ2h0IHRhaWwgY3JpdGljYWwgdmFsdWUgICAgDQotdC5hbHBoYSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBsZWZ0IHRhaWwgY3JpdGljYWwgdmFsdWUgDQpgYGANCg0KVGhlIHRlc3Qgc3RhdGlzdGljIC00LjM4MTggaXMgbGVzcyB0aGFuIHRoZSBjcml0aWNhbCB2YWx1ZSBvZiAtMS42OTkxLiBIZW5jZSwgYXQgLjA1IHNpZ25pZmljYW5jZSBsZXZlbCwgd2UgY2FuIHJlamVjdCB0aGUgY2xhaW0gdGhhdCBtZWFuIGxpZmV0aW1lIG9mIGEgbGlnaHQgYnVsYiBpcyBhYm92ZSAxMCwwMDAgaG91cnMuDQoNCiMjIyBQLXZhbHVlDQoNCioqQWx0ZXJuYXRpdmUgU29sdXRpb246KiogSW5zdGVhZCBvZiB1c2luZyB0aGUgY3JpdGljYWwgdmFsdWUsIHdlIGFwcGx5IHRoZSBgcHRgIGZ1bmN0aW9uIHRvIGNvbXB1dGUgdGhlIGxvd2VyIHRhaWwgcC12YWx1ZSBvZiB0aGUgdGVzdCBzdGF0aXN0aWMuDQoNCmBgYHtyfQ0KcHZhbCA9IHB0KHQsIGRmPW4tMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgbGVmdCB0YWlsIHDiiJJ2YWx1ZQ0KcHZhbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgcHJpbnQgcOKIknZhbHVlDQpgYGANCiBBcyBpdCB0dXJucyBvdXQgdG8gYmUgbGVzcyB0aGFuIHRoZSAuMDUgc2lnbmlmaWNhbmNlIGxldmVsLCB3ZSByZWplY3QgdGhlIG51bGwgaHlwb3RoZXNpcyB0aGF0ICRcbXUgXGdlIDEwMDAwLiQNCiANCiMjIEV4ZXJjaXNlIDMNCg0KKipSaWdodCB0YWlsOioqIEdhcnVkYS1mb29kIEluZG9uZXNpYSBjbGFpbXMgdGhhdCBmb3IgZWFjaCBhIGNvb2tpZSBiYWcgc3RhdGVzIG9mIHRoZWlyIHByb2R1Y3QsIHRoZXJlIGlzIGF0IG1vc3QgMiBncmFtcyBvZiBzYXR1cmF0ZWQgZmF0IGluIGEgc2luZ2xlIGNvb2tpZS4gSW4gYSBzYW1wbGUgb2YgNDAgY29va2llcywgaXQgaXMgZm91bmQgdGhhdCB0aGUgbWVhbiBhbW91bnQgb2Ygc2F0dXJhdGVkIGZhdCBwZXIgY29va2llIGlzIDIuMSBncmFtcy4gQXNzdW1lIHRoYXQgdGhlIHNhbXBsZSBzdGFuZGFyZCBkZXZpYXRpb24gaXMgMC4zIGdyYW0uIEF0IC4wNSBzaWduaWZpY2FuY2UgbGV2ZWwsIGNhbiB3ZSByZWplY3QgdGhlIGNsYWltPw0KDQpgYGB7cn0NCiMgc2FtcGxlIG1lYW4NCnhiYXI9IDIuMQ0KDQojIEh5cG90aGVzaXplZCB2YWx1ZQ0KbXUwID0gMg0KDQojIFNhbXBsZSBzdGFuZGFyZCBkZXZpYXRpb24NCnM9IDAuMw0KDQojIFNhbXBsZSBzaXplDQpuID0gNDANCg0KIyBULXRlc3QNCnQgPSAoeGJhci1tdTApLyhzL3NxcnQobikpDQp0DQoNCiMgRmluZCB0aGUgY3JpdGljYWwgdmFsdWUNCmFscGhhID0gMC4wNQ0KdC5hbHBoYSA9IHF0KDEtYWxwaGEsIGRmID0gbi0xKQ0KdC5hbHBoYSANCmBgYA0KSmFkaSwgcGVydGFtYS10YW1hIGtpdGEgbWVuZGVmaW5pc2lrYW4gaGlwb3Rlc2lzIG5vbCB5YWl0dSAkzrziiaQyJCAuIEtlbXVkaWFuLCBraXRhIGNhcmkgcmF0YS1yYXRhIHNhbXBlbCwgc3RhbmRhciBkZXZpYXNpIHNhbXBlbCwgdWt1cmFuIHNhbXBlbCB1bnR1ayBtZW5jYXJpIG5pbGFpIHVqaSB0LiBTZXRlbGFoIGl0dSBraXRhIGJhbmRpbmdrYW4gZGVuZ2FuIG5pbGFpIGtyaXRpc255YS4NCg0KTmlsYWkgdC10ZXN0IDIuMTA4MTg1IGxlYmloIGJlc2FyIGRhcmkgY3JpdGljYWwgdmFsdWUgeWFpdHUgMS42ODQ4NzUuIEphZGksIHBhZGEgdGluZ2thdCBzaWduaWZpa2Fuc2kgMCwwNSwga2l0YSBtZW5vbGFrIHBlcm55YXRhYW4gYmFod2EgdGVyZGFwYXQgcGFsaW5nIGJhbnlhayAyIGdyYW0gbGVtYWsgamVudWggZGFsYW0gc2VidWFoIGt1ZS4NCg0KIyBUeXBlIEkgfiBUd28gVGFpbCBULXRlc3QNCg0KVGhlIG51bGwgaHlwb3RoZXNpcyBvZiB0aGUgdHdvLXRhaWxlZCB0ZXN0IG9mIHRoZSBwb3B1bGF0aW9uIG1lYW4gJFxtdSQgYW5kIHVua25vd24gJFxzaWdtYSQgY2FuIGJlIGV4cHJlc3NlZCBhcyBmb2xsb3dzOg0KDQpcW1xtdV8wID0gXG11XF0NCg0Kd2hlcmUgJFxtdV8wJCBpcyBhIGh5cG90aGVzaXplZCB2YWx1ZSBvZiB0aGUgdHJ1ZSBwb3B1bGF0aW9uIG1lYW4gJFxtdSQuDQoNCkxldCB1cyBkZWZpbmUgdGhlIHRlc3Qgc3RhdGlzdGljICR0JCBpbiB0ZXJtcyBvZiB0aGUgc2FtcGxlIG1lYW4sIHRoZSBzYW1wbGUgc2l6ZSBhbmQgdGhlIHNhbXBsZSBzdGFuZGFyZCBkZXZpYXRpb24gJHM6JA0KDQpcW3Q9e1xiYXJ7eH0tXG11XzAgXG92ZXIgcy9cc3FydHtufX1cXQ0KDQpUaGVuIHRoZSBudWxsIGh5cG90aGVzaXMgb2YgdGhlIHR3by10YWlsZWQgdGVzdCBpcyB0byBiZSByZWplY3RlZCBpZiAkdFxsZS10X3tcYWxwaGHiiJUyfSQgb3IgJHRcZ2UgdF97XGFscGhh4oiVMn0kICwgd2hlcmUgJHRfe1xhbHBoYeKIlTJ9JCBpcyB0aGUgJDEwMCgxLVxhbHBoYSkkIHBlcmNlbnRpbGUgb2YgdGhlIFN0dWRlbnQgJHQkIGRpc3RyaWJ1dGlvbiB3aXRoICRu4oiSMSQgZGVncmVlcyBvZiBmcmVlZG9tLg0KDQojIyBFeGFtcGxlIDQNCg0KU29tZSBqb3VybmFscyBjb25jbHVkZWQgdGhhdCB0aGUgYXZlcmFnZSB3ZWlnaHQgb2YgSGFjaGlrbyBEb2dzIGFyb3VuZCB0aGUgd29ybGQgbGFzdCB0ZW4geWVhcnMgd2FzIDE1LjQga2cuIFJlc2VhcmNoZXJzIHdhbnQgdG8gbWFrZSBzdXJlIGlmIHRoZXJlIGEgY2hhbmdlIGluIHRoZSBhdmVyYWdlIHdlaWdodCBvZiB0aGVzZSB2YXJpZXRpZXMgYWZ0ZXIgdGVuIHllYXJzLiBUaGVyZWZvcmUsIHRoZXkgcGljayB1cCBhIHJhbmRvbSBzYW1wbGUgb2YgMzUgRG9ncyBmcm9tIHRoZSBzYW1lIHZhcmlldGllcyBhbmQgYXQgdGhlIHNhbWUgdGltZSB0aGlzIHllYXIsICB0aGV5IGZvdW5kIHRoYXQgdGhlIG1lYW4gcGVuZ3VpbiB3ZWlnaHQgaXMgMTQuNiBrZy4gQXNzdW1lIHRoZSBzYW1wbGUgc3RhbmRhcmQgZGV2aWF0aW9uIGlzIDIuNSBrZy4gQXQgLjA1IHNpZ25pZmljYW5jZSBsZXZlbCwgY2FuIHdlIHJlamVjdCB0aGUgbnVsbCBoeXBvdGhlc2lzIHRoYXQgdGhlIG1lYW4gSGFjaGlrbyBEb2dzIGRvZXMgbm90IGRpZmZlciBmcm9tIGxhc3QgdGVuIHllYXJzPw0KDQoNCiMjIyBULXRlc3Qgc3RhdGlzdGljcw0KDQpGaXJzdCwgd2UgY2FsY3VsYXRlIHRoZSB0LXRlc3Qgc3RhdGlzdGljcyBhY2NvcmRpbmcgdG8gdGhlIGluZm9ybWF0aW9uIHRoYXQgd2UgaGF2ZSBmcm9tIHRoZSBFeGFtcGxlIDIuIEluIHRoaXMgY2FzZSwgd2UgdXNlIHQtc3RhdGlzdGljcyBiZWNhdXNlIHdlIGtub3cgdGhlIG1lYW4gJFxtdSQgYW5kIHN0YW5kYXJkIGRldmlhdGlvbiAkXHNpZ21hJCwgYWxzbyB3ZSBrbm93IHRoYXQgdGhlIHNhbXBsZSBzaXplICRcZ2UgMzUkLg0KDQpgYGB7cn0NCm11MCA9IDE1LjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGh5cG90aGVzaXplZCB2YWx1ZSANCnhiYXIgPSAxNC42ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHNhbXBsZSBtZWFuIA0KcyA9IDIuNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgc2FtcGxlIHN0YW5kYXJkIGRldmlhdGlvbiANCm4gPSAzNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHNhbXBsZSBzaXplIA0KdCA9ICh4YmFyLW11MCkvKHMvc3FydChuKSk7dCAgICAgICAgICAgICAgICAgICAgICAgICAgICMgdGVzdCBzdGF0aXN0aWMgDQpgYGANCg0KIyMjIENyaXRpY2FsIHZhbHVlDQoNClRoZW4sIHdlIGNhbGN1bGF0ZSB0aGUgbGVmdCBjcml0aWNhbCB2YWx1ZS4gDQoNCmBgYHtyfQ0KYWxwaGEgPSAuMDUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgLjA1IHNpZ25pZmljYW5jZSBsZXZlbA0KdC5oYWxmLmFscGhhID0gcXQoMS1hbHBoYS8yLCBkZj1uLTEpICAgICAgICAgICAgICAgICAgICMgcGVyLW9uZSB0YWlsIC4wMjUgc2lnbmlmaWNhbmNlIGxldmVsDQpjKC10LmhhbGYuYWxwaGEsIHQuaGFsZi5hbHBoYSkgICAgICAgICAgICAgICAgICAgICAgICAgIyBUd28tVGFpbGVkIDAuMDUgc2lnbmlmaWNhbmNlIGxldmVsDQpgYGANCg0KVGhlIHRlc3Qgc3RhdGlzdGljIC0xLjg5MzEgbGllcyBiZXR3ZWVuIHRoZSBjcml0aWNhbCB2YWx1ZXMgLTIuMDQ1MjMgYW5kIDIuMDQ1MjMuIEhlbmNlLCBhdCAuMDUgc2lnbmlmaWNhbmNlIGxldmVsLCB3ZSBkbyBub3QgcmVqZWN0IHRoZSBudWxsIGh5cG90aGVzaXMgdGhhdCB0aGUgbWVhbiBwZW5ndWluIHdlaWdodCBkb2VzIG5vdCBkaWZmZXIgZnJvbSBsYXN0IHllYXIuDQoNCiMjIyBQLXZhbHVlDQoNCioqQWx0ZXJuYXRpdmUgc29sdXRpb246KiogSW5zdGVhZCBvZiB1c2luZyB0aGUgY3JpdGljYWwgdmFsdWUsIHdlIGFwcGx5IHRoZSBgMipwdCgpYCBmdW5jdGlvbiB0byBjb21wdXRlIHRoZSB0d28gdGFpbCBwLXZhbHVlIG9mIHRoZSB0ZXN0IHN0YXRpc3RpYy4gDQoNCmBgYHtyfQ0KcHZhbCA9IDIqcHQodCwgZGY9bi0xKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgdHdvIHRhaWwgcOKIknZhbHVlDQpwdmFsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBwcmludCBw4oiSdmFsdWUNCmBgYA0KU2luY2UgaXQgdHVybnMgb3V0IHRvIGJlIGdyZWF0ZXIgdGhhbiB0aGUgLjA1IHNpZ25pZmljYW5jZSBsZXZlbCwgd2UgZG8gbm90IHJlamVjdCB0aGUgbnVsbCBoeXBvdGhlc2lzIHRoYXQgJM68IFxnZSAxNS40JC4NCg0KDQojIyBFeGVyY2lzZSA0DQoNClRvIHRlc3QgdGhlIGh5cG90aGVzaXMgdGhhdCB0aGUgbWVhbiBzeXN0b2xpYyBibG9vZCBwcmVzc3VyZSBpbiBhIGNlcnRhaW4gcG9wdWxhdGlvbiBlcXVhbHMgMTQwIG1tSGcuIFRoZSBkYXRhc2V0IGF0IGhhbmRzIGhhcyBtZWFzdXJlbWVudHMgb24gNTUgcGF0aWVudHMuDQoNCmBgYHtyfQ0KI0Jsb29kX3ByZXNzdXJlIGRhdGFzZXQNCm5vIDwtIHNlcSgxOjU1KQ0Kc3RhdHVzIDwtIGMocmVwKDAsIDI1KSwgcmVwKDEsIDMwKSkNCm1taGcgPC0gYygxMjAsMTE1LDk0LDExOCwxMTEsMTAyLDEwMiwxMzEsMTA0LDEwNywxMTUsMTM5LDExNSwxMTMsMTE0LDEwNSwNCiAgICAgICAgICAxMTUsMTM0LDEwOSwxMDksOTMsMTE4LDEwOSwxMDYsMTI1LDE1MCwxNDIsMTE5LDEyNywxNDEsMTQ5LDE0NCwNCiAgICAgICAgICAxNDIsMTQ5LDE2MSwxNDMsMTQwLDE0OCwxNDksMTQxLDE0NiwxNTksMTUyLDEzNSwxMzQsMTYxLDEzMCwxMjUsDQogICAgICAgICAgMTQxLDE0OCwxNTMsMTQ1LDEzNywxNDcsMTY5KQ0KYmxvb2RfcHJlc3N1cmUgPC1kYXRhLmZyYW1lKG5vLHN0YXR1cyxtbWhnKQ0KDQpsaWJyYXJ5KGRwbHlyKQ0KbmV3X2Jsb29kX3ByZXNzdXJlIDwtIGJsb29kX3ByZXNzdXJlJT4lIG11dGF0ZSh4aV9taW51c194YmFyID0gbW1oZy0xMzAsIHhpX21pbnVzX3hiYXJfa3VhZHJhdCA9IChtbWhnLTEzMCleMikNCm5ld19ibG9vZF9wcmVzc3VyZQ0KDQpgYGANCg0KYGBge3J9DQojIFNhbXBsZSBtZWFuIGFuZCBUb3RhbCBzYW1wbGUgc2l6ZQ0KeGJhciA9IG1lYW4obmV3X2Jsb29kX3ByZXNzdXJlJG1taGcpDQpuID0gbGVuZ3RoKG5ld19ibG9vZF9wcmVzc3VyZSRtbWhnKQ0KDQojIFNldCBudWxsIGh5cG90aGVzaXMgYW5kIHNhbXBsZSBzdGFuZGFyZA0KbXUwID0gMTQwDQpxID0gc3VtKG5ld19ibG9vZF9wcmVzc3VyZSR4aV9taW51c194YmFyX2t1YWRyYXQpDQpzID0gc3FydCgoMS8obi0xKSkqcSkNCg0KIyB0LSBzdGF0aXN0aWNzDQp0ID0gKHhiYXItbXUwKS8ocy9zcXJ0KG4pKQ0KdA0KDQojIHAgdmFsdWUgQSwgQiwgYW5kIEMNCnBfdmFsdWVBID0gMipwdChhYnModCksIGRmID0gbi0xLCBsb3dlci50YWlsPUZBTFNFKSAjdHdvdGFpbA0KcF92YWx1ZUIgPSBwdCh0LCBkZj0gbi0xLCBsb3dlci50YWlsID0gRkFMU0UpICNyaWdodHRhaWwNCnBfdmFsdWVDID0gcHQodCwgZGY9IG4tMSwgbG93ZXIudGFpbCA9IFRSVUUpICNsZWZ0IHRhaWwNCg0KcF92YWx1ZUENCnBfdmFsdWVCDQpwX3ZhbHVlQw0KDQpgYGANCkxhbHUga2l0YSBkYXBhdCBoYXNpbG55YToNCg0KJHokID0gLTMsODY5MjcyDQpwX25pbGFpQSA9IDAsMDAwMjk2MTExNA0KcF9uaWxhaUIgPSAwLDk5OTg1MTkNCnBfbmlsYWlDID0gMCwwMDAxNDgwNTU3DQoNCkthcmVuYSB0ZXJueWF0YSB0aW5na2F0IHNpZ25pZmlrYW5zaSBBIGRhbiBDIGt1cmFuZyBkYXJpIDAsMDUsIG1ha2EgaGlwb3Rlc2lzIG5vbCBkaXRvbGFrLiBLYXJlbmEsIG5pbGFpIHAgQiB0ZXJueWF0YSBsZWJpaCBiZXNhciBkYXJpIHRpbmdrYXQgc2lnbmlmaWthbnNpIDAsMDUsIGphZGkga2l0YSBtZW5lcmltYSBoaXBvdGVzaXMgbm9sICAkSF8wJCA6ICTOvOKJpM68XzAkIGF0YXUgJM684omkMTQwJC4NCg0KIyBUeXBlIElJIH4gT25lIFRhaWwgDQoNCkluIGEgbGVmdC9yaWdodCB0YWlsIHRlc3Qgb2YgdGhlIHBvcHVsYXRpb24gbWVhbiwgdGhlIG51bGwgaHlwb3RoZXNpcyBjbGFpbXMgdGhhdCB0aGUgdHJ1ZSBwb3B1bGF0aW9uIG1lYW4gJFxtdSQgaXMgZ3JlYXRlciB0aGFuIGEgZ2l2ZW4gaHlwb3RoZXRpY2FsIHZhbHVlICRcbXVfMCQuDQoNClxbXHRleHR7VHlwZSBJSSBFcnJvciAkSF9hJH0gPSBcYmVnaW57Y2FzZXN9IHtcbXUgXGdlIFxtdV8wfSAmIFx0ZXh0e0xlZnQgVGFpbH0gXFwNCiAgICAgICAgICAgICAgICAgICAgICB7XG11IFxsZSBcbXVfMH0gJiBcdGV4dHtSaWdodCBUYWlsfSBcZW5ke2Nhc2VzfVxdDQogICAgICAgICAgICAgICAgICAgICAgDQpBIHR5cGUgSUkgZXJyb3Igb2NjdXJzIGlmIHRoZSBoeXBvdGhlc2lzIHRlc3QgYmFzZWQgb24gYSByYW5kb20gc2FtcGxlIGZhaWxzIHRvIHJlamVjdCB0aGUgbnVsbCBoeXBvdGhlc2lzIGV2ZW4gd2hlbiB0aGUgdHJ1ZSBwb3B1bGF0aW9uIG1lYW4gJFxtdSQgaXMgaW4gZmFjdCBsZXNzIHRoYW4gJFxtdV8wJC4NCg0KIyMgRXhhbXBsZSA1DQoNClN1cHBvc2UgdGhlIG1hbnVmYWN0dXJlciBjbGFpbXMgdGhhdCB0aGUgbWVhbiBzcGVlZCBvZiBhIG1vdG9yY3ljbGUgaXMgbW9yZSB0aGFuIDEwMCBrbS9ob3Vycy4gSW4gQXNzdW1lIHRoZSBwb3B1bGF0aW9uIHN0YW5kYXJkIGRldmlhdGlvbiBpcyAxLjIga20vaG91cnMuIEF0IC4wNSBzaWduaWZpY2FuY2UgbGV2ZWwsIHdoYXQgaXMgdGhlIHByb2JhYmlsaXR5IG9mIGhhdmluZyB0eXBlIElJIGVycm9yIGZvciBhIHNhbXBsZSBzaXplIG9mIDMwIG1vdG9yY3ljbGVzPw0KDQoNCiMjIyBTdGFuZGFyZCBFcnJvciBvZiB0aGUgTWVhbiANCg0KV2UgYmVnaW4gd2l0aCBjb21wdXRpbmcgdGhlIHN0YW5kYXJkIGRldmlhdGlvbiBvZiB0aGUgbWVhbiwgc2VtLg0KDQpgYGB7cn0NCm4gPSAzMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHNhbXBsZSBzaXplIA0Kc2lnbWEgPSAxLjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgcG9wdWxhdGlvbiBzdGFuZGFyZCBkZXZpYXRpb24gDQpzZW0gPSBzaWdtYS9zcXJ0KG4pOyBzZW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBzdGFuZGFyZCBlcnJvciANCmBgYA0KTmV4dCBjb21wdXRlIHRoZSBsb3dlciBib3VuZCBvZiBzYW1wbGUgbWVhbnMgZm9yIHdoaWNoIHRoZSBudWxsIGh5cG90aGVzaXMgJFxtdSBcZ2UgMTAwMDAkIHdvdWxkIG5vdCBiZSByZWplY3RlZC4NCg0KIyMjIFNhbXBsZSBNZWFuDQoNCg0KYGBge3J9DQphbHBoYSA9IC4wNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBzaWduaWZpY2FuY2UgbGV2ZWwgDQptdTAgPSAxMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBoeXBvdGhldGljYWwgbG93ZXIgYm91bmQgDQpxID0gcW5vcm0oYWxwaGEsIG1lYW49bXUwLCBzZD1zZW0pOyBxIA0KYGBgDQpUaGVyZWZvcmUsIHNvIGxvbmcgYXMgdGhlIHNhbXBsZSBtZWFuIGlzIGdyZWF0ZXIgdGhhbiA5OS42NCBpbiBhIGh5cG90aGVzaXMgdGVzdCwgdGhlIG51bGwgaHlwb3RoZXNpcyB3aWxsIG5vdCBiZSByZWplY3RlZC4gU2luY2Ugd2UgYXNzdW1lIHRoYXQgdGhlIGFjdHVhbCBwb3B1bGF0aW9uIG1lYW4gaXMgOTkuNTAsIHdlIGNhbiBjb21wdXRlIHRoZSBwcm9iYWJpbGl0eSBvZiB0aGUgc2FtcGxlIG1lYW4gYWJvdmUgOTkuNjQsIGFuZCB0aHVzIGZvdW5kIHRoZSBwcm9iYWJpbGl0eSBvZiB0eXBlIElJIGVycm9yLg0KDQojIyMgUHJvYmFiaWxpdHkgb2YgRXJyb3INCg0KYGBge3J9DQptdSA9IDk5LjUwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgYXNzdW1lZCBhY3R1YWwgbWVhbiANCnBub3JtKHEsIG1lYW49bXUsIHNkPXNlbSwgbG93ZXIudGFpbD1GQUxTRSkgDQpgYGANCklmIHRoZSBtb3RvcmN5Y2xlIHNhbXBsZSBzaXplIGlzIDMwLCB0aGUgYWN0dWFsIG1lYW4gbW90b3JjeWNsZXMgc3BlZWQgaXMgOSw5NTAgaG91cnMgYW5kIHRoZSBwb3B1bGF0aW9uIHN0YW5kYXJkIGRldmlhdGlvbiBpcyAxMjAgaG91cnMsIHRoZW4gdGhlIHByb2JhYmlsaXR5IG9mIHR5cGUgSUkgZXJyb3IgZm9yIHRlc3RpbmcgdGhlIG51bGwgaHlwb3RoZXNpcyAkXG11IFxnZSAxMDAwMCQgYXQgLjA1IHNpZ25pZmljYW5jZSBsZXZlbCBpcyAyNi4yJSwgYW5kIHRoZSBwb3dlciBvZiB0aGUgaHlwb3RoZXNpcyB0ZXN0IGlzIDczLjglLg0KDQoNCiMjIEV4ZXJjaXNlIDUNCg0KKipSaWdodCB0YWlsOioqIEdhcnVkYS1mb29kIEluZG9uZXNpYSBjbGFpbXMgdGhhdCBmb3IgZWFjaCBhIGNvb2tpZSBiYWcgc3RhdGVzIG9mIHRoZWlyIHByb2R1Y3QsIHRoZXJlIGlzIGF0IG1vc3QgMiBncmFtcyBvZiBzYXR1cmF0ZWQgZmF0IGluIGEgc2luZ2xlIGNvb2tpZS4gQXNzdW1lIHRoZSBhY3R1YWwgbWVhbiBhbW91bnQgb2Ygc2F0dXJhdGVkIGZhdCBwZXIgY29va2llIGlzIDIuMDc1IGdyYW1zIGFuZCB0aGUgc2FtcGxlIHN0YW5kYXJkIGRldmlhdGlvbiBpcyAwLjI1IGdyYW1zLiBBdCAuMDUgc2lnbmlmaWNhbmNlIGxldmVsLCB3aGF0IGlzIHRoZSBwcm9iYWJpbGl0eSBvZiBoYXZpbmcgYSB0eXBlIElJIGVycm9yIGZvciBhIHNhbXBsZSBzaXplIG9mIDM1IGNvb2tpZXM/DQoNCktpdGEgcGVybHUgbWVuZW50dWthbiB1a3VyYW4gc2FtcGVsLCBkZXZpYXNpIHN0YW5kYXIgcG9wdWxhc2ksIGRhbiBrZXNhbGFoYW4gc3RhbmRhci4NCg0KYGBge3J9DQojIFNhbXBsZSBzaXplIA0KbiA9IDM1DQoNCiMgUG9wdWxhdGlvbiBzdGFuZGFyZCBkZXZpYXRpb24NCnNpZ21hID0gMC4yNQ0KDQojIFN0YW5kYXJkIGVycm9yDQpzZW0gPSBzaWdtYS9zcXJ0KG4pDQpzZW0NCmBgYA0KDQpTZWxhbmp1dG55YSwga2FtaSBtZW5naGl0dW5nIGJhdGFzIGF0YXMgcmF0YS1yYXRhIHNhbXBlbCB5YW5nIG1lcnVwYWthbiBoaXBvdGVzaXMgbm9sICTOvCDiiaQgMiQgdGlkYWsgYWthbiBkaXRvbGFrLg0KDQpgYGB7cn0NCiNTaWcgbmlmaWNhbmNlIGxldmVsDQphbHBoYSA9IDAuMDUNCg0KIyBIeXBvdGhlc2lzIA0KbXUwID0gMg0KcSA9IHFub3JtKGFscGhhICwgbWVhbiA9IG11MCwgc2Q9IHNlbSwgbG93ZXIudGFpbCA9IEYpDQpxDQpgYGANCkppa2EgcmF0YS1yYXRhIHNhbXBlbCBrdXJhbmcgZGFyaSAyLDA2OTUwOCBkYWxhbSB1amkgaGlwb3Rlc2lzLCBtYWthIGhpcG90ZXNpcyBub2wgdGlkYWsgYWthbiBkaXRvbGFrLiBLYXJlbmEga2l0YSBtZW5nYXN1bXNpa2FuIGJhaHdhIHJhdGEtcmF0YSBwb3B1bGFzaSBzZWJlbmFybnlhIGFkYWxhaCAyLDA3NSwga2l0YSBkYXBhdCBtZW5naGl0dW5nIHByb2JhYmlsaXRhcyByYXRhLXJhdGEgc2FtcGVsIGRpIGJhd2FoIDIsMDY5NS4NCg0KYGBge3J9DQojIEFjdHVhbCBtZWFuDQptdSA9IDIuMDc1DQpwbm9ybShxLCBtZWFuPW11LCBzZD1zZW0pDQpgYGANCg0KSmFkaSwgSmlrYSB1a3VyYW4gc2FtcGVsIGt1ZSBhZGFsYWggMzUsIGp1bWxhaCByYXRhLXJhdGEgbGVtYWsgamVudWggc2ViZW5hcm55YSBwZXIga3VlIGFkYWxhaCAyLDA3NSBncmFtIGRhbiBzdGFuZGFyIGRldmlhc2kgcG9wdWxhc2kgYWRhbGFoIDAsMjUgZ3JhbSwgbWFrYSBwcm9iYWJpbGl0YXMga2VzYWxhaGFuIHRpcGUgSUkgdW50dWsgbWVuZ3VqaSBoaXBvdGVzaXMgbm9sICTOvCDiiaQgMiQgcGFkYSB0aW5na2F0IHNpZ25pZmlrYW5zaSAwLDA1IGFkYWxhaCA0NCw4JSwgZGFuIGtla3VhdGFuIHVqaSBoaXBvdGVzaXMgYWRhbGFoIDU1LDIlLg0KDQojIFR5cGUgSUkgfiBUd28gVGFpbCANCiANCiBJbiBhIHR3by10YWlsZWQgdGVzdCBvZiB0aGUgcG9wdWxhdGlvbiBtZWFuLCB0aGUgbnVsbCBoeXBvdGhlc2lzIGNsYWltcyB0aGF0IHRoZSB0cnVlIHBvcHVsYXRpb24gbWVhbiAkXG11JCBpcyBlcXVhbCB0byBhIGdpdmVuIGh5cG90aGV0aWNhbCB2YWx1ZSAkXG11XzAkLg0KDQpcW1xtdV8wID0gXG11XF0NCg0KQSB0eXBlIElJIGVycm9yIG9jY3VycyBpZiB0aGUgaHlwb3RoZXNpcyB0ZXN0IGJhc2VkIG9uIGEgcmFuZG9tIHNhbXBsZSBmYWlscyB0byByZWplY3QgdGhlIG51bGwgaHlwb3RoZXNpcyBldmVuIHdoZW4gdGhlIHRydWUgcG9wdWxhdGlvbiBtZWFuICRcbXUkIGlzIGluIGZhY3QgZGlmZmVyZW50IGZyb20gJFxtdV8wJC4NCg0KQXNzdW1lIHRoYXQgdGhlIHBvcHVsYXRpb24gaGFzIGEga25vd24gc3RhbmRhcmQgZGV2aWF0aW9uICRcc2lnbWEkLiBCeSB0aGUgQ2VudHJhbCBMaW1pdCBUaGVvcmVtLCB0aGUgcG9wdWxhdGlvbiBvZiBhbGwgcG9zc2libGUgbWVhbnMgb2Ygc2FtcGxlcyBvZiBzdWZmaWNpZW50bHkgbGFyZ2Ugc2l6ZSBuIGFwcHJveGltYXRlbHkgZm9sbG93cyB0aGUgbm9ybWFsIGRpc3RyaWJ1dGlvbi4gSGVuY2Ugd2UgY2FuIGNvbXB1dGUgdGhlIHJhbmdlIG9mIHNhbXBsZSBtZWFucyBmb3Igd2hpY2ggdGhlIG51bGwgaHlwb3RoZXNpcyB3aWxsIG5vdCBiZSByZWplY3RlZCwgYW5kIHRoZW4gb2J0YWluIGFuIGVzdGltYXRlIG9mIHRoZSBwcm9iYWJpbGl0eSBvZiB0eXBlIElJIGVycm9yLg0KDQojIyBFeGFtcGxlIDYNCg0KU29tZSBqb3VybmFscyBjb25jbHVkZWQgdGhhdCB0aGUgYXZlcmFnZSB3ZWlnaHQgb2YgSGFjaGlrbyBEb2dzIGFyb3VuZCB0aGUgd29ybGQgbGFzdCB0ZW4geWVhcnMgd2FzIDE1LjQga2cuIFJlc2VhcmNoZXJzIHdhbnQgdG8gbWFrZSBzdXJlIGlmIHRoZXJlIGEgY2hhbmdlIGluIHRoZSBhdmVyYWdlIHdlaWdodCBvZiB0aGVzZSB2YXJpZXRpZXMgYWZ0ZXIgdGVuIHllYXJzLiBBc3N1bWUgdGhlIGFjdHVhbCBtZWFuIHBvcHVsYXRpb24gd2VpZ2h0IGlzIDE1LjEga2csIGFuZCB0aGUgcG9wdWxhdGlvbiBzdGFuZGFyZCBkZXZpYXRpb24gaXMgMi41IGtnLiBBdCAuMDUgc2lnbmlmaWNhbmNlIGxldmVsLCB3aGF0IGlzIHRoZSBwcm9iYWJpbGl0eSBvZiBoYXZpbmcgdHlwZSBJSSBlcnJvciBmb3IgYSBzYW1wbGUgc2l6ZSBvZiAzNSBIYWNoaWtvIERvZ3M/DQoNCiMjIyBTdGFuZGFyZCBFcnJvciBvZiB0aGUgTWVhbiANCg0KV2UgYmVnaW4gd2l0aCBjb21wdXRpbmcgdGhlIHN0YW5kYXJkIGRldmlhdGlvbiBvZiB0aGUgbWVhbiwgc2VtLg0KDQpgYGB7cn0NCm4gPSAzNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgc2FtcGxlIHNpemUgDQpzaWdtYSA9IDIuNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHBvcHVsYXRpb24gc3RhbmRhcmQgZGV2aWF0aW9uIA0Kc2VtID0gc2lnbWEvc3FydChuKTsgc2VtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBzdGFuZGFyZCBlcnJvciANCmBgYA0KDQpOZXh0IGNvbXB1dGUgdGhlIGxlZnQgYW5kIHJpZ2h0IGJvdW5kcyBvZiBzYW1wbGUgbWVhbnMgZm9yIHdoaWNoIHRoZSBudWxsIGh5cG90aGVzaXMgJFxtdSA9IDE1LjQkIHdvdWxkIG5vdCBiZSByZWplY3RlZC4NCg0KIyMjIFNhbXBsZSBNZWFuDQoNCmBgYHtyfQ0KYWxwaGEgPSAuMDUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBzaWduaWZpY2FuY2UgbGV2ZWwgDQptdTAgPSAxNS40ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGh5cG90aGV0aWNhbCBtZWFuIA0KSSA9IGMoYWxwaGEvMiwgMS1hbHBoYS8yKSANCnEgPSBxbm9ybShJLCBtZWFuPW11MCwgc2Q9c2VtKTsgcSANCmBgYA0KDQpUaGVyZWZvcmUsIHNvIGxvbmcgYXMgdGhlIHNhbXBsZSBtZWFuIGlzIGJldHdlZW4gMTQuNTcyIGFuZCAxNi4yMjggaW4gYSBoeXBvdGhlc2lzIHRlc3QsIHRoZSBudWxsIGh5cG90aGVzaXMgd2lsbCBub3QgYmUgcmVqZWN0ZWQuIFNpbmNlIHdlIGFzc3VtZSB0aGF0IHRoZSBhY3R1YWwgcG9wdWxhdGlvbiBtZWFuIGlzIDE1LjEsIHdlIGNhbiBjb21wdXRlIHRoZSBsb3dlciB0YWlsIHByb2JhYmlsaXRpZXMgb2YgYm90aCBlbmQgcG9pbnRzLg0KDQojIyMgUHJvYmFiaWxpdHkgb2YgRXJyb3INCg0KYGBge3J9DQptdSA9IDE1LjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGFzc3VtZWQgYWN0dWFsIG1lYW4gDQpwID0gcG5vcm0ocSwgbWVhbj1tdSwgc2Q9c2VtKTsgcCANCmRpZmYocCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgcFsyXS1wWzFdIA0KYGBgDQoNCkZpbmFsbHksIHRoZSBwcm9iYWJpbGl0eSBvZiB0eXBlIElJIGVycm9yIGlzIHRoZSBwcm9iYWJpbGl0eSBiZXR3ZWVuIHRoZSB0d28gZW5kIHBvaW50cy4gSWYgdGhlIHNhbXBsZSBzaXplIG9mIEhhY2hpa28gRG9ncyBpcyAzNSwgdGhlIGFjdHVhbCBtZWFuIHBvcHVsYXRpb24gd2VpZ2h0IGlzIDE1LjEga2cgYW5kIHRoZSBwb3B1bGF0aW9uIHN0YW5kYXJkIGRldmlhdGlvbiBpcyAyLjUga2csIHRoZW4gdGhlIHByb2JhYmlsaXR5IG9mIHR5cGUgSUkgZXJyb3IgZm9yIHRlc3RpbmcgdGhlIG51bGwgaHlwb3RoZXNpcyAkXG11ID0gMTUuNCQgYXQgLjA1IHNpZ25pZmljYW5jZSBsZXZlbCBpcyA4OS4xJSwgYW5kIHRoZSBwb3dlciBvZiB0aGUgaHlwb3RoZXNpcyB0ZXN0IGlzIDEwLjklLg0KDQojIyBFeGVyY2lzZSA2DQoNClVuZGVyIHNhbWUgYXNzdW1wdGlvbnMgYXMgY2FzZSAyNywgaWYgYWN0dWFsIG1lYW4gcG9wdWxhdGlvbiB3ZWlnaHQgaXMgMTQuOSBrZywgd2hhdCBpcyB0aGUgcHJvYmFiaWxpdHkgb2YgdHlwZSBJSSBlcnJvcnM/IFdoYXQgaXMgdGhlIHBvd2VyIG9mIHRoZSBoeXBvdGhlc2lzIHRlc3Q/DQoNCg0Ka2l0YSBtdWxhaSBkZW5nYW4gbWVuY2FyaSB1a3VyYW4gc2FtcGVsLCBzdGFuZGFyIGRldmlhc2kgcG9wdWxhc2ksIGRhbiBzdGFuZGFyIGVycm9yLg0KDQpgYGB7cn0NCiMgc2FtcGxlIHNpemUNCm4gPSAzNQ0KDQojIHBvcHVsYXRpb24gc3RhbmRhcmQgZGV2aWF0aW9uDQpzaWdtYSA9IDIuNQ0KDQojIHN0YW5kYXJkIGVycm9yDQpzZW0gPSBzaWdtYS9zcXJ0KG4pDQpzZW0NCg0KYGBgDQoNClNlbGFuanV0bnlhLCBrYW1pIG1lbmdoaXR1bmcgYmF0YXMgYmF3YWggZGFuIGF0YXMgc2FtcGVsIGJlcmFydGkgaGlwb3Rlc2lzIG5vbCAkzrwgPSAxNSw0JCB0aWRhayBkaXRvbGFrLg0KDQpgYGB7cn0NCiNzaWduaWZpY2FuY2UgbGV2ZWwNCmFscGhhPSAwLjA1DQoNCiMgaHlwb3RoZXRpY2FsIG1lYW4NCm11MCA9IDE1LjQNCg0KSSA9IGMoYWxwaGEvMiwgMS0gYWxwaGEvMikNCnE9IHFub3JtKEksIG1lYW4gPSBtdTAsIHNkPSBzZW0pDQpxDQpgYGANCg0KSmFkaSwga2l0YSB0YWh1IGJhaHdhIHNlbGFtYSByYXRhLXJhdGEgc2FtcGVsIGFudGFyYSAxNCw1NzE3NiBkYW4gMTYsMjI4MjQsIGhpcG90ZXNpcyBub2wgdGlkYWsgYWthbiBkaXRvbGFrLiBLYXJlbmEsIGthbWkgYmVyYXN1bXNpIGJhaHdhIHJhdGEtcmF0YSBwb3B1bGFzaSBzZWJlbmFybnlhIGFkYWxhaCAxNCw5LCBrYW1pIG1lbmdoaXR1bmcgcHJvYmFiaWxpdGFzIGVrb3IgYmF3YWggZGFyaSBrZWR1YSB0aXRpayBha2hpcg0KDQpgYGB7cn0NCiMgQWN0dWFsIG1lYW4NCm11ID0gMTQuOQ0KcCA9IHBub3JtKHEsIG1lYW49bXUsIHNkPSBzZW0pDQpwDQpgYGANCg0KQWtoaXJueWEsIHByb2JhYmlsaXRhcyBrZXNhbGFoYW4gdGlwZSBJSSBhZGFsYWggcHJvYmFiaWxpdGFzIGFudGFyYSBkdWEgdGl0aWsgYWtoaXINCg0KYGBge3J9DQojIHBbMl0tIHBbMV0NCmRpZmYocCkNCmBgYA0KDQpKaWthLCB1a3VyYW4gc2FtcGVsIGFkYWxhaCAzNSwgYmVyYXQgcG9wdWxhc2kgcmF0YS1yYXRhIHNlYmVuYXJueWEgYWRhbGFoIDE0LDkga2cgZGFuIHN0YW5kYXIgZGV2aWFzaSBwb3B1bGFzaSBhZGFsYWggMiw1IGtnLCBtYWthIHByb2JhYmlsaXRhcyBrZXNhbGFoYW4gdGlwZSBJSSB1bnR1ayBtZW5ndWppIGhpcG90ZXNpcyBub2wgJM68ID0gMTUsNCQgcGFkYSB0aW5na2F0IHNpZ25pZmlrYW5zaSAwLDA1IGFkYWxhaCA3OCwxJSAsIGRhbiBrZWt1YXRhbiB1amkgaGlwb3Rlc2lzIGFkYWxhaCAyMSw5JS4NCg0KIyBNaW5kIE1hcCAoSHlwb3RoZXNpcykNCiANCmBgYHtyLCBlY2hvPUZBTFNFLGZpZy5hbGlnbj0nY2VudGVyJyxmaWcuY2FwPSJNaW5kIE1hcCBIeXBvdGhlc2lzIFRlc3RpbmciLCBvdXQud2lkdGggPSAnMTAwJSd9DQprbml0cjo6aW5jbHVkZV9ncmFwaGljcygibWFpbm1hcC5wbmciKQ0KYGBgDQoNCg==