Code
Confidence Interval
Assignment Week 13
Angelica Florentina M.
52250063
Student Majoring in Data Science at Institut Teknologi Sains Bandung
Skillful
Curious
Organized
Case Study 1
Confidence Interval for Mean, σ 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.
\[\sigma = 3.2\] \[\,n = 100\,\] \[\bar{x} = 12.6\]
Tasks:
Identify the appropriate statistical test and justify your
choice.
Compute the Confidence Intervals for:
Create a comparison visualization of the three confidence
intervals.
Interpret the results in a business analytics context.
Uji Statistik
Uji statistik yang tepat: Interval Kepercayaan untuk Mean dengan σ
diketahui (Z-interval / Uji Z untuk mean)
Justifikasi:
Tujuan analisis adalah mengestimasi rata-rata populasi (rata-rata
transaksi harian per pengguna), bukan membandingkan dua kelompok atau
menguji proporsi.
Simpangan baku populasi (σ) diketahui, yaitu σ = 3,2. Ini adalah
syarat utama penggunaan distribusi Z.
Ukuran sampel besar (n = 100), sehingga asumsi distribusi normal
untuk rata-rata sampel terpenuhi berdasarkan Teorema Limit Pusat,
meskipun distribusi data asli tidak diketahui.
Data berupa variabel numerik kontinu (jumlah transaksi).
Confidence Interval
90%
Rumus CI untuk z-distribution \[CI = \bar{x} \pm
z_{\alpha/2}\,\frac{\sigma}{\sqrt{n}}\] Sample
Size \[{n} = 100\]
Standar Deviation \[{σ} =
3.2\]
Sample Mean \[\bar{x} =
12.6\]
Confidence Level 90% \[1
- 0.9 = \frac{0.1}{2} = 0.05 ≈ 1.65\]
Standard Error
\[SE = \frac{\sigma}{\sqrt{n}}\]
\[\frac{3.2}{\sqrt{100}} = 0.32\]
Margin of Error
\[ME = z_{\alpha/2}\ × SE\] \[{1.65}\ × SE\ {\approx{0.528}}\]
CI 90%
\[\bar{x}\ \pm\ ME\] \[12.6\ \pm\ 0.528\] \[{\approx\ (12.072, 13.128)}\]
Confidence Interval
95%
Rumus CI untuk z-distribution \[CI = \bar{x} \pm
z_{\alpha/2}\,\frac{\sigma}{\sqrt{n}}\] Sample
Size \[{n} = 100\]
Standar Deviation \[{σ} =
3.2\]
Sample Mean \[\bar{x} =
12.6\]
Confidence Level 95% \[1
- 0.95 = \frac{0.05}{2} = 0.025 ≈ 1.96\]
Standard Error
\[SE = \frac{\sigma}{\sqrt{n}}\]
\[\frac{3.2}{\sqrt{100}} = 0.32\]
Margin of Error
\[ME = z_{\alpha/2}\ × SE\] \[{1.96}\ × SE\ {\approx{0.6272}}\]
CI 95%
\[\bar{x}\ \pm\ ME\] \[12.6\ \pm\ 0.6272\] \[{\approx\ (11.9728, 13.2272)}\]
Confidence Interval
99%
Rumus CI untuk z-distribution \[CI = \bar{x} \pm
z_{\alpha/2}\,\frac{\sigma}{\sqrt{n}}\]
Sample Size \[{n} =
100\]
Standar Deviation \[{σ} =
3.2\]
Sample Mean \[\bar{x} =
12.6\]
Confidence Level 99% \[1
- 0.99 = \frac{0.01}{2} = 0.005 ≈ 2.58\]
Standard Error
\[SE = \frac{\sigma}{\sqrt{n}}\]
\[\frac{3.2}{\sqrt{100}} = 0.32\]
Margin of Error
\[ME = z_{\alpha/2}\ × SE\] \[{2.58}\ × SE\ {\approx{0.82}}\]
CI 99%
\[\bar{x}\ \pm\ ME\] \[12.6\ \pm\ 0.82\] \[{\approx\ (11.781, 13.42)}\]
Visualization
Interpretation
Diagram ini menunjukkan distribusi normal dari rata-rata transaksi
harian pengguna dengan mean sampel sebesar 12,6. Garis vertikal hitam
menandai nilai mean tersebut, sementara garis titik-titik berwarna
hijau, biru, dan merah masing-masing mewakili interval kepercayaan 90%,
95%, dan 99%. Semakin tinggi tingkat kepercayaan, interval menjadi lebih
lebar, mencerminkan trade-off antara keyakinan dan presisi estimasi.
Dengan demikian, kita dapat menyimpulkan bahwa dengan keyakinan yang
tinggi, rata-rata transaksi harian populasi kemungkinan besar berada
dalam rentang interval tersebut, yang membantu memberikan gambaran
keandalan estimasi rata-rata transaksi setelah peluncuran fitur
baru.
Business
Analytics
Confidence interval menunjukkan rentang nilai di mana rata-rata
transaksi harian per pengguna kemungkinan besar berada dengan tingkat
keyakinan tertentu. Misalnya, pada tingkat kepercayaan 95%, platform
e-commerce dapat yakin bahwa rata-rata transaksi harian per pengguna
berada antara sekitar 11,97 hingga 13,23 transaksi. Ini membantu bisnis
memahami efektivitas fitur baru secara statistik dengan memperkirakan
nilai rata-rata yang sesungguhnya, bukan hanya berdasarkan sampel.
Semakin tinggi tingkat kepercayaan, rentang interval menjadi lebih
lebar, menunjukkan ketidakpastian yang lebih besar tapi juga keyakinan
yang lebih kuat bahwa nilai sebenarnya ada dalam rentang tersebut.
Dengan informasi ini, manajemen dapat membuat keputusan yang lebih tepat
mengenai keberhasilan fitur dan perencanaan kapasitas transaksi.
Case Study 2
Confidence Interval for Mean, σ Unknown:
A UX Research team analyzes task completion time (in minutes) for a
new mobile application. The data are collected from 12 users:
\[8.4,7.9,9.1,8.7,8.2,9.0,7.8,8.5,8.9,8.1,8.6,8.3\]
Tasks:
Identify the appropriate statistical test and explain
why.
Compute the Confidence Intervals for:
Visualize the three intervals on a single plot.
Explain how sample size and confidence level influence the
interval width.
Uji Statistik
Uji yang tepat adalah membuat interval kepercayaan rata-rata
menggunakan t-distribusi, karena data yang diberikan berasal dari 12
pengguna (ukuran sampel kecil, yaitu n < 30) dan simpangan baku
populasi (σ) tidak diketahui, maka uji statistik yang tepat untuk
membuat interval kepercayaan rata-rata adalah menggunakan distribusi
t-Student.
Alasan memilih distribusi t-:
Ukuran sampel kecil (n < 30): Saat ukuran sampel kecil, distribusi
sampling rata-rata tidak mengikuti distribusi normal baku secara
sempurna, sehingga distribusi t lebih cocok digunakan karena
memperhitungkan ketidakpastian pada estimasi simpangan baku.
Simpangan baku populasi tidak diketahui: Kita hanya punya data
sampel, sehingga simpangan baku populasi harus diestimasi dari simpangan
baku sampel. Distribusi t-Student dirancang untuk kondisi ini.
Data diasumsikan berasal dari populasi yang berdistribusi normal:
Asumsi ini penting untuk validitas penggunaan distribusi t.
Confindence Interval
90%
Sample Size \[n =
12\]
Sample Mean \[\bar{x} =
\frac{1}{n} \sum_{i=1}^{n} x_i\] \[\begin{align*}
\bar{x} &= \frac{1}{12} (8.4 + 7.9 + 9.1 + 8.7 + 8.2 + 9.0 + 7.8 +
8.5 + 8.9 + 8.1 + 8.6 + 8.3) \\
&= 8.45
\end{align*}\]
Standard Deviation \[s =
\sqrt{\frac{1}{n-1} \sum_{i=1}^{n} (x_i - \bar{x})^2}\] \[
s = \sqrt{\frac{1}{12-1} \Big[ (8.4-8.45)^2 + (7.9-8.45)^2 + (...)^2
+(8.3-8.45)^2 \Big]}
\]
\[
= \sqrt{\frac{1.95}{11}} = \sqrt{0.17727} \approx 0.421
\] Critical Value 90% \[1 - 0.9 = \frac{0.1}{2} = 0.05 ≈ 1.796\]
Standard Error (SE) \[SE =
\frac{s}{\sqrt{n}}\] \[
SE = \frac{0.421}{\sqrt{12}}
= \frac{0.421}{3.464}
\approx 0.121
\] Margin of Error (ME) \[
\begin{aligned}
ME &= t_{\alpha/2, df} \times SE = 1.796 \times 0.121 \approx 0.2173
\end{aligned}
\] CI 90% \[\bar{x}\
\pm\ ME\] \[8.45\ \pm\ 0.2173\]
\[{\approx\ (8.2327, 8.6673)}\]
Confidence Interval
95%
Sample Size \[n =
12\]
Sample Mean \[\bar{x} =
\frac{1}{n} \sum_{i=1}^{n} x_i\] \[\begin{align*}
\bar{x} &= \frac{1}{12} (8.4 + 7.9 + 9.1 + 8.7 + 8.2 + 9.0 + 7.8 +
8.5 + 8.9 + 8.1 + 8.6 + 8.3) \\
&= 8.45
\end{align*}\]
Standard Deviation \[s =
\sqrt{\frac{1}{n-1} \sum_{i=1}^{n} (x_i - \bar{x})^2}\] \[
s = \sqrt{\frac{1}{12-1} \Big[ (8.4-8.45)^2 + (7.9-8.45)^2 + (...)^2
+(8.3-8.45)^2 \Big]}
\]
\[
= \sqrt{\frac{1.95}{11}} = \sqrt{0.17727} \approx 0.421
\] Critical Value 95% \[1 - 0.95 = \frac{0.05}{2} = 0.025 ≈
2.201\] Standard Error (SE) \[SE = \frac{s}{\sqrt{n}}\] \[
SE = \frac{0.421}{\sqrt{12}}
= \frac{0.421}{3.464}
\approx 0.121
\] Margin of Error (ME) \[
\begin{aligned}
ME &= t_{\alpha/2, df} \times SE = 2.201 \times 0.121 \approx 0.2663
\end{aligned}
\] CI 95% \[\bar{x}\
\pm\ ME\] \[8.45\ \pm\ 0.2663\]
\[{\approx\ (8.1837, 8.7163)}\]
Confidence Interval
99%
Sample Size \[n =
12\]
Sample Mean \[\bar{x} =
\frac{1}{n} \sum_{i=1}^{n} x_i\] \[\begin{align*}
\bar{x} &= \frac{1}{12} (8.4 + 7.9 + 9.1 + 8.7 + 8.2 + 9.0 + 7.8 +
8.5 + 8.9 + 8.1 + 8.6 + 8.3) \\
&= 8.45
\end{align*}\]
Standard Deviation \[s =
\sqrt{\frac{1}{n-1} \sum_{i=1}^{n} (x_i - \bar{x})^2}\] \[
s = \sqrt{\frac{1}{12-1} \Big[ (8.4-8.45)^2 + (7.9-8.45)^2 + (...)^2
+(8.3-8.45)^2 \Big]}
\]
\[
= \sqrt{\frac{1.95}{11}} = \sqrt{0.17727} \approx 0.421
\] Critical Value 99% \[1 - 0.99 = \frac{0.01}{2} = 0.005 ≈
3.106\] Standard Error (SE) \[SE = \frac{s}{\sqrt{n}}\] \[
SE = \frac{0.421}{\sqrt{12}}
= \frac{0.421}{3.464}
\approx 0.121
\] Margin of Error (ME) \[
\begin{aligned}
ME &= t_{\alpha/2, df} \times SE = 3.106 \times 0.121 \approx 0.3758
\end{aligned}
\] CI 99% \[\bar{x}\
\pm\ ME\] \[8.45\ \pm\ 0.3758\]
\[{\approx\ (8.0742, 8.8258)}\]
Visualization
Interpretation
Diagram tersebut menunjukkan interval kepercayaan rata-rata
menggunakan distribusi t dengan rata-rata sampel sebesar 8,45 yang
ditandai oleh garis putus-putus di tengah kurva. Garis vertikal berwarna
menggambarkan interval kepercayaan 90%, 95%, dan 99%, di mana semakin
tinggi tingkat kepercayaan maka interval semakin lebar, mencerminkan
meningkatnya ketidakpastian estimasi. Seluruh interval bersifat simetris
terhadap nilai rata-rata, menunjukkan bahwa estimasi mean populasi
paling mungkin berada di sekitar 8,45. Diagram ini menegaskan bahwa
distribusi t digunakan ketika simpangan baku populasi tidak diketahui
atau ukuran sampel relatif kecil, serta menggambarkan trade-off antara
presisi dan tingkat keyakinan dalam penaksiran parameter populasi.
Sample Size and
Confidence Level
Lebar interval kepercayaan dipengaruhi oleh ukuran sampel dan tingkat
kepercayaan sebagai berikut. Ukuran sampel berpengaruh melalui galat
baku (standard error); semakin besar ukuran sampel, galat baku semakin
kecil sehingga interval kepercayaan menjadi lebih sempit dan estimasi
lebih presisi, sedangkan sampel kecil menghasilkan interval yang lebih
lebar. Tingkat kepercayaan memengaruhi nilai kritis (Z atau t); semakin
tinggi tingkat kepercayaan (misalnya dari 90% ke 95% atau 99%), nilai
kritis semakin besar sehingga interval kepercayaan menjadi lebih lebar,
karena kita ingin lebih yakin bahwa parameter populasi berada di dalam
interval tersebut. Dengan demikian, interval kepercayaan paling sempit
diperoleh dari sampel besar dengan tingkat kepercayaan lebih rendah, dan
sebaliknya.
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:
\[ n = 400\] \[ x = 156\]
Tasks:
Compute the sample proportion \(\hat
{p}\)
Compute Confidence Intervals for the proportion at:
Visualize and compare the three intervals.
Explain how confidence level affects decision-making in product
experiments.
Sample
Proportion
\[\hat {p} = \frac {x}{n} = \frac
{156}{400} = 0.39\]
Confidence Interval
90%
Standard Error \[
\begin{align*}
SE_{\hat{p}} &= \sqrt{\frac{\hat{p}(1-\hat{p})}{n}} \\
&= \sqrt{\frac{0.39(1-0.39)}{400}} \\
&= \sqrt{\frac{0.39 \cdot 0.61}{400}} \\
&\approx 0.0244
\end{align*}
\]
Critical Value 90%
Untuk 90% confidence level: \(Z_{\alpha/2}
= 1.65\)
Margin of Error \[ ME =
Z_{\alpha/2} × SE = 1.65 × 0.0244 \approx 0.04026\]
CI 90% \[\hat{p}\ \pm\
ME\] \[0.39\ \pm\ 0.04026\]
\[{\approx\ (0.34974, 0.43026)}\]
Confidence Interval
95%
Standard Error \[
\begin{align*}
SE_{\hat{p}} &= \sqrt{\frac{\hat{p}(1-\hat{p})}{n}} \\
&= \sqrt{\frac{0.39(1-0.39)}{400}} \\
&= \sqrt{\frac{0.39 \cdot 0.61}{400}} \\
&\approx 0.0244
\end{align*}
\]
Critical Value 95%
Untuk 95% confidence level: \(Z_{\alpha/2}
= 1.96\)
Margin of Error \[ ME =
Z_{\alpha/2} × SE = 1.96 × 0.0244 \approx 0.0478\]
CI 95% \[\hat{p}\ \pm\
ME\] \[0.39\ \pm\ 0.0478\]
\[{\approx\ (0.3422, 0.4378)}\]
Confidence Interval
99%
Standard Error \[
\begin{align*}
SE_{\hat{p}} &= \sqrt{\frac{\hat{p}(1-\hat{p})}{n}} \\
&= \sqrt{\frac{0.39(1-0.39)}{400}} \\
&= \sqrt{\frac{0.39 \cdot 0.61}{400}} \\
&\approx 0.0244
\end{align*}
\]
Critical Value 99%
Untuk 99% confidence level: \(Z_{\alpha/2}
= 2.58\)
Margin of Error \[ ME =
Z_{\alpha/2} × SE = 2.58 × 0.0244 \approx 0.0629\]
CI 9% \[\hat{p}\ \pm\
ME\] \[0.39\ \pm\ 0.0629\]
\[{\approx\ (0.3271, 0.4529)}\]
Visualization
Interpretation
Diagram ini menggambarkan distribusi sampling proporsi sampel \(\hat p\) yang mendekati normal, dengan
nilai titik tengah \(\hat p = 0{,}39\)
sebagai estimasi proporsi populasi, lalu di kiri–kanannya digambar
beberapa pasang garis vertikal berwarna yang menunjukkan batas bawah dan
atas interval kepercayaan 90%, 95%, dan 99% untuk proporsi populasi, di
mana semakin tinggi tingkat kepercayaan maka interval semakin lebar
karena harus “menangkap” nilai proporsi populasi sebenarnya dengan
probabilitas yang lebih besar, sehingga secara interpretasi jika
pengambilan sampel diulang berkali‑kali dan setiap kali dihitung
interval kepercayaan (misalnya 95%) seperti pada gambar, maka kira‑kira
95% dari interval‑interval tersebut akan mengandung proporsi populasi
sebenarnya, dan diagram ini memvisualisasikan konsep tersebut dalam
bentuk kurva normal dan garis batas interval di sekitar \(\hat p\) .
Confidence Level
Affects
Dalam eksperimen produk, tingkat kepercayaan menentukan seberapa
yakin tim terhadap efek perubahan sebelum membuat keputusan; tingkat
kepercayaan tinggi (misalnya 99%) membuat interval estimasi lebih lebar
dan menuntut bukti yang lebih kuat sehingga mengurangi risiko salah
memilih varian namun membutuhkan sampel lebih besar, waktu lebih lama,
dan sering kali menunda peluncuran fitur, sedangkan tingkat kepercayaan
lebih rendah (misalnya 90%) menghasilkan interval sempit dan keputusan
yang lebih cepat dengan biaya data lebih kecil, tetapi meningkatkan
risiko bahwa hasil yang dianggap “menang” sebenarnya hanya kebetulan,
sehingga pemilihan 90%, 95%, atau 99% harus disesuaikan dengan profil
risiko bisnis dan dampak keputusan terhadap pengguna maupun sumber daya
perusahaan.
Case Study 4
Precision Comparison (Z-Test vs t-Test):
Two data teams measure API latency (in milliseconds) under different
conditions.
Team A: \[n = 36\] \[\bar{x} = 210\] \[\sigma = 24\]
Team B: \[n = 36\] \[\bar{x} = 210\] \[\sigma = 24\]
Tasks:
Identify the statistical test used by each team.
Compute Confidence Intervals for 90%, 95%, and 99%.
Create a visualization comparing all intervals.
Explain why the interval widths differ, even with similar
data.
Uji Statistik
Pada nomor 1, identifikasi uji statistik didasarkan pada apakah
standar deviasi populasi diketahui atau tidak . Tim A
mengetahui standar deviasi populasi (σ = 24), sehingga mereka
menggunakan Z-test atau Z-interval untuk menghitung
confidence interval karena distribusi sampling dari mean bisa dianggap
normal. Sebaliknya, Tim B hanya memiliki standar deviasi sampel (s =
24), sehingga mereka harus menggunakan t-test atau
t-interval, yang memperhitungkan ketidakpastian tambahan dari penggunaan
sampel untuk memperkirakan σ. Dengan demikian, perbedaan utama dalam
pemilihan uji adalah tingkat informasi tentang variabilitas data: Z
untuk σ diketahui, t untuk σ tidak diketahui.
Team A
Confidence Interval
90%
Sample Size \[{n} =
36\]
Standar Deviation \[{σ} =
24\]
Sample Mean \[\bar{x} =
210\]
Confidence Level 90% \[1
- 0.9 = \frac{0.1}{2} = 0.05 ≈ 1.65\]
Standard Error
\[SE = \frac{\sigma}{\sqrt{n}}\]
\[\frac{24}{\sqrt{36}} = 4\]
Margin of Error
\[ME = z_{\alpha/2}\ × SE\] \[{1.65}\ × 4\ {\approx{6.6}}\]
CI 90%
\[\bar{x}\ \pm\ ME\] \[210\ \pm\ 6.6\] \[{\approx\ (203.4, 216.6)}\]
Confidence Interval
95%
Sample Size \[{n} =
36\]
Standar Deviation \[{σ} =
24\]
Sample Mean \[\bar{x} =
210\]
Confidence Level 95% \[1
- 0.95 = \frac{0.05}{2} = 0.025 ≈ 1.96\]
Standard Error
\[SE = \frac{\sigma}{\sqrt{n}}\]
\[\frac{24}{\sqrt{36}} = 4\]
Margin of Error
\[ME = z_{\alpha/2}\ × SE\] \[{1.96}\ × 4\ {\approx{7.84}}\]
CI 95%
\[\bar{x}\ \pm\ ME\] \[210\ \pm\ 7.84\] \[{\approx\ (202.16, 217.84)}\]
Confidence Interval
99%
Sample Size \[{n} =
36\]
Standar Deviation \[{σ} =
24\]
Sample Mean \[\bar{x} =
210\]
Confidence Level 99% \[1
- 0.99 = \frac{0.01}{2} = 0.005 ≈ 2.58\]
Standard Error
\[SE = \frac{\sigma}{\sqrt{n}}\]
\[\frac{24}{\sqrt{36}} = 4\]
Margin of Error
\[ME = z_{\alpha/2}\ × SE\] \[{2.58}\ × 4\ {\approx{10.32}}\]
CI 99%
\[\bar{x}\ \pm\ ME\] \[210\ \pm\ 10.32\] \[{\approx\ (199.68, 220.32)}\]
Team B
Confidence Interval
90%
Rumus \[CI = \bar{x} \pm
t_{\alpha/2,\,df}\,\frac{s}{\sqrt{n}}\]
Sample Size \[{n} =
36\]
Sample Standar Deviation \[{s} = 24\] df \[df = n -1 = 36 - 1 = 35\]
Sample Mean \[\bar{x} =
210\]
Critical Value 90% \[1 -
0.9 = \frac{0.1}{2} = 0.05 ≈ 1.690\]
Standard Error
\[SE = \frac{s}{\sqrt{n}}\] \[\frac{24}{\sqrt{36}} = 4\]
Margin of Error
\[ME = t_{\alpha/2 , df}\ × SE\]
\[{1.690}\ × 4\ {\approx{6.76}}\]
CI 90%
\[\bar{x}\ \pm\ ME\] \[210\ \pm\ 6.76\] \[{\approx\ (203.24, 216.76)}\]
Confidence Interval
95%
Rumus \[CI = \bar{x} \pm
t_{\alpha/2,\,df}\,\frac{s}{\sqrt{n}}\]
Sample Size \[{n} =
36\]
Sample Standar Deviation \[{s} = 24\]
Sample Mean \[\bar{x} =
210\]
df \[df = n - 1 =
35\]
Critical Value 95% \[1 -
0.95 = \frac{0.05}{2} = 0.025 ≈ 2.030\]
Standard Error
\[SE = \frac{s}{\sqrt{n}}\] \[\frac{24}{\sqrt{36}} = 4\]
Margin of Error
\[ME = z_{\alpha/2}\ × SE\] \[{2.030}\ × 4\ {\approx{8.12}}\]
CI 95%
\[\bar{x}\ \pm\ ME\] \[210\ \pm\ 8.12\] \[{\approx\ (201.88, 218.12)}\]
Confidence Interval
99%
Rumus \[CI = \bar{x} \pm
t_{\alpha/2,\,df}\,\frac{s}{\sqrt{n}}\]
Sample Size \[{n} =
36\]
Sample Standar Deviation \[{s} = 24\]
Sample Mean \[\bar{x} =
210\]
df \[df = n - 1 =
35\]
Critical Value 99% \[1 -
0.99 = \frac{0.01}{2} = 0.005 ≈ 2.724\]
Standard Error
\[SE = \frac{s}{\sqrt{n}}\] \[\frac{24}{\sqrt{36}} = 4\]
Margin of Error
\[ME = z_{\alpha/2}\ × SE\] \[{2.724}\ × 4\ {\approx{10.90}}\]
CI 99%
\[\bar{x}\ \pm\ ME\] \[210\ \pm\ 10.90\] \[{\approx\ (199.10, 220.90)}\]
Interval Widths
Differ
Meskipun Team A dan Team B memiliki rata-rata sampel, ukuran
sampel, dan nilai variasi yang sama , lebar confidence
interval (CI) yang dihasilkan tetap berbeda karena
perbedaan asumsi statistik dan distribusi yang
digunakan . Team A menggunakan distribusi normal
(Z-distribution) karena standar deviasi populasi (σ) diketahui,
sehingga ketidakpastian hanya berasal dari variasi sampel dan
menghasilkan interval yang relatif lebih sempit .
Sebaliknya, Team B menggunakan distribusi t karena
standar deviasi populasi tidak diketahui dan harus diestimasi dari
sampel, sehingga terdapat ketidakpastian tambahan dalam
estimasi varians. Distribusi t memiliki ekor yang lebih
tebal dibanding distribusi normal, yang menyebabkan nilai
kritis (t) lebih besar daripada nilai Z pada tingkat kepercayaan yang
sama. Akibatnya, confidence interval Team B menjadi
sedikit lebih lebar , meskipun data dasarnya tampak
serupa.
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:
\[n = 250\] \[x = 185\]
Management is only interested in the lower bound of
the estimate.
Tasks:
Identify the type of Confidence Interval and the appropriate
test.
Compute the one-sided lower Confidence Interval at:
Visualize the lower bounds for all confidence levels.
Determine whether the 70% target is statistically
satisfied.
Uji Statistik
Confidence Interval satu sisi (lower bound one-sided CI) untuk
proporsi populasi.
Uji Statistik yang Tepat: One-sample proportion z-test (uji z satu
sisi) karena Sampel cukup besar (𝑛𝑝 dan 𝑛(1−𝑝)>5, kita mengestimasi
proporsi populasi, manajemen hanya peduli pada batas bawah (apakah ≥
70%?).
Confidence Interval
90%
Sample Proportion \[\hat
{p} = \frac {x}{n} = \frac {185}{250} = 0.74\] Standard
Error \[
\begin{align*}
SE_{\hat{p}} &= \sqrt{\frac{\hat{p}(1-\hat{p})}{n}} \\
&= \sqrt{\frac{0.74(1-0.74)}{250}} \\
&\approx 0.0277
\end{align*}
\]
Critical Value 90%
Untuk 90% confidence level: \(Z_{ 1
-\alpha} = 1.28\)
Margin of Error \[ ME =
Z_{1 - \alpha} × SE = 1.28 × 0.0277 \approx 0.0354\]
CI 90% \[CI _lower =
\hat{p} - ME\] \[0.74 - 0.0354 \approx
0.7046\]
Confidence Interval
95%
Sample Proportion \[\hat
{p} = \frac {x}{n} = \frac {185}{250} = 0.74\] Standard
Error \[
\begin{align*}
SE_{\hat{p}} &= \sqrt{\frac{\hat{p}(1-\hat{p})}{n}} \\
&= \sqrt{\frac{0.74(1-0.74)}{250}} \\
&\approx 0.0277
\end{align*}
\]
Critical Value 95%
Untuk 95% confidence level: \(Z_{ 1
-\alpha} = 1.645\)
Margin of Error \[ ME =
Z_{1 - \alpha} × SE = 1.645 × 0.0277 \approx 0.0455\]
CI 95% \[CI _lower =
\hat{p} - ME\] \[0.74 - 0.0455 \approx
0.6945\]
Confidence Interval
99%
Sample Proportion \[\hat
{p} = \frac {x}{n} = \frac {185}{250} = 0.74\] Standard
Error \[
\begin{align*}
SE_{\hat{p}} &= \sqrt{\frac{\hat{p}(1-\hat{p})}{n}} \\
&= \sqrt{\frac{0.74(1-0.74)}{250}} \\
&\approx 0.0277
\end{align*}
\]
Critical Value 99%
Untuk 99% confidence level: \(Z_{ 1
-\alpha} = 2.33\)
Margin of Error \[ ME =
Z_{1 - \alpha} × SE = 2.33 × 0.0277 \approx 0.0645\]
CI 99% \[CI _lower =
\hat{p} - ME\] \[0.74 - 0.0645 \approx
0.6755\]
Visualization
Interpretation
Diagram tersebut menggambarkan interval kepercayaan satu sisi batas
bawah (one-sided lower confidence interval) untuk proporsi pengguna
premium aktif, dengan estimasi proporsi sampel p̂ = 0,74 yang ditunjukkan
oleh garis putus-putus di tengah. Garis vertikal di sebelah kiri
menunjukkan batas bawah interval kepercayaan pada tingkat kepercayaan
90%, 95%, dan 99%, di mana semakin tinggi tingkat kepercayaan maka batas
bawah semakin bergeser ke kiri (semakin konservatif). Interpretasinya
adalah, misalnya pada tingkat kepercayaan tertentu, kita yakin bahwa
proporsi sebenarnya pengguna premium aktif di populasi setidaknya
sebesar nilai batas bawah tersebut, sementara nilai di atas batas
tersebut masih mungkin terjadi. Interval satu sisi ini digunakan ketika
fokus analisis adalah memastikan nilai minimum proporsi populasi, bukan
rentang atas–bawah secara simultan.
Determine 70%
Target 70% pengguna aktif fitur premium
terpenuhi secara statistik hanya pada tingkat kepercayaan
90% , karena batas bawah one-sided confidence interval
pada level ini masih berada di atas 70%. Namun, pada tingkat kepercayaan
yang lebih ketat yaitu 95% dan 99% , batas bawah
interval turun di bawah 70%, sehingga tidak ada cukup bukti statistik
untuk menyatakan bahwa proporsi pengguna premium aktif minimal 70%
dengan keyakinan yang lebih tinggi. Artinya, meskipun estimasi proporsi
sampel sebesar 74% terlihat memenuhi target secara
deskriptif, secara statistik target tersebut belum dapat
dipastikan jika manajemen mensyaratkan tingkat kepercayaan 95%
atau lebih.
LS0tDQp0aXRsZTogIkNvbmZpZGVuY2UgSW50ZXJ2YWwiDQpzdWJ0aXRsZTogIkFzc2lnbm1lbnQgV2VlayAxMyINCmF1dGhvcjogIkFuZ2VsaWNhIEZsb3JlbnRpbmEgTS4iDQpkYXRlOiAiYHIgZm9ybWF0KFN5cy5EYXRlKCksICclQiAlZCwgJVknKWAiDQpvdXRwdXQ6DQogIHJtZGZvcm1hdHM6OnJlYWR0aGVkb3duOg0KICAgIHNlbGZfY29udGFpbmVkOiB0cnVlDQogICAgdGh1bWJuYWlsczogdHJ1ZQ0KICAgIGxpZ2h0Ym94OiB0cnVlDQogICAgZ2FsbGVyeTogdHJ1ZQ0KICAgIG51bWJlcl9zZWN0aW9uczogdHJ1ZQ0KICAgIGxpYl9kaXI6IGxpYnMNCiAgICBkZl9wcmludDogInBhZ2VkIg0KICAgIGNvZGVfZm9sZGluZzogInNob3ciDQogICAgY29kZV9kb3dubG9hZDogeWVzDQogICAgY3NzOiAiY29kZS5jc3MiDQotLS0NCg0KDQpgYGB7ciBwcm9maWxlLCBlY2hvPUZBTFNFfQ0KbGlicmFyeShodG1sdG9vbHMpDQpIVE1MKCcNCjxkaXYgY2xhc3M9InByb2ZpbGUtY2FyZCI+DQogIDxkaXY+DQogICAgPGltZyBzcmM9Imh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9hbmdlbGlpZWUvZm90b2FuZ2VsaWNhL21haW4vZm9ybWFsLmpwZyINCiAgICAgICAgIGNsYXNzPSJwcm9maWxlLXBob3RvIj4NCiAgPC9kaXY+DQogIDxkaXY+DQogICAgPGgxIGNsYXNzPSJwcm9maWxlLW5hbWUiPkFuZ2VsaWNhIEZsb3JlbnRpbmEgTS48L2gxPg0KICAgIDxwIHN0eWxlPSJtYXJnaW46IDRweCAwOyBjb2xvcjpibGFjazsiPjUyMjUwMDYzPC9wPg0KICAgIDxwIGNsYXNzPSJwcm9maWxlLWluZm8iPlN0dWRlbnQgTWFqb3JpbmcgaW4gRGF0YSBTY2llbmNlIGF0IEluc3RpdHV0IFRla25vbG9naSBTYWlucyBCYW5kdW5nPC9wPg0KDQogICAgPGRpdiBzdHlsZT0iZGlzcGxheTogZmxleDsgZ2FwOiAxNXB4OyBtYXJnaW4tdG9wOiAxOHB4OyI+DQogICAgICA8YnV0dG9uIGNsYXNzPSJwcm9maWxlLWJ1dHRvbiBidG4tZHMiPlNraWxsZnVsPC9idXR0b24+DQogICAgICA8YnV0dG9uIGNsYXNzPSJwcm9maWxlLWJ1dHRvbiBidG4tc3RhdHMiPkN1cmlvdXM8L2J1dHRvbj4NCiAgICAgIDxidXR0b24gY2xhc3M9InByb2ZpbGUtYnV0dG9uIGJ0bi1zdGF0czEiPk9yZ2FuaXplZDwvYnV0dG9uPg0KICAgIDwvZGl2Pg0KICA8L2Rpdj4NCjwvZGl2Pg0KJykNCmBgYA0KDQojIENhc2UgU3R1ZHkgMQ0KPGRpdiBjbGFzcz0icGFzdGVsLXB1cnBsZS1ib3giPg0KKipDb25maWRlbmNlIEludGVydmFsIGZvciBNZWFuLCDPgyBLbm93bioqDQoNCkFuIGUtY29tbWVyY2UgcGxhdGZvcm0gd2FudHMgdG8gZXN0aW1hdGUgdGhlIGF2ZXJhZ2UgbnVtYmVyIG9mIGRhaWx5IHRyYW5zYWN0aW9ucyBwZXIgdXNlciBhZnRlciBsYXVuY2hpbmcgYSBuZXcgZmVhdHVyZS4gQmFzZWQgb24gbGFyZ2Utc2NhbGUgaGlzdG9yaWNhbCBkYXRhLCB0aGUgcG9wdWxhdGlvbiBzdGFuZGFyZCBkZXZpYXRpb24gaXMga25vd24uDQoNCiQkXHNpZ21hID0gMy4yJCQNCiQkXCxuID0gMTAwXCwkJA0KJCRcYmFye3h9ID0gMTIuNiQkDQoNCioqVGFza3M6KioNCg0KMS4gSWRlbnRpZnkgdGhlIGFwcHJvcHJpYXRlIHN0YXRpc3RpY2FsIHRlc3QgYW5kIGp1c3RpZnkgeW91ciBjaG9pY2UuDQoNCjIuIENvbXB1dGUgdGhlIENvbmZpZGVuY2UgSW50ZXJ2YWxzIGZvcjoNCiAgIC0gOTAlDQogICAtIDk1JQ0KICAgLSA5OSUNCg0KMy4gQ3JlYXRlIGEgY29tcGFyaXNvbiB2aXN1YWxpemF0aW9uIG9mIHRoZSB0aHJlZSBjb25maWRlbmNlIGludGVydmFscy4NCg0KNC4gSW50ZXJwcmV0IHRoZSByZXN1bHRzIGluIGEgYnVzaW5lc3MgYW5hbHl0aWNzIGNvbnRleHQuDQo8L2Rpdj4NCg0KIyMgVWppIFN0YXRpc3Rpaw0KPGRpdiBjbGFzcz0icGFzdGVsLXB1cnBsZS1ib3giPg0KVWppIHN0YXRpc3RpayB5YW5nIHRlcGF0OiBJbnRlcnZhbCBLZXBlcmNheWFhbiB1bnR1ayBNZWFuIGRlbmdhbiDPgyBkaWtldGFodWkgKFotaW50ZXJ2YWwgLyBVamkgWiB1bnR1ayBtZWFuKQ0KDQoqKkp1c3RpZmlrYXNpOioqDQoNClR1anVhbiBhbmFsaXNpcyBhZGFsYWggbWVuZ2VzdGltYXNpIHJhdGEtcmF0YSBwb3B1bGFzaSAocmF0YS1yYXRhIHRyYW5zYWtzaSBoYXJpYW4gcGVyIHBlbmdndW5hKSwgYnVrYW4gbWVtYmFuZGluZ2thbiBkdWEga2Vsb21wb2sgYXRhdSBtZW5ndWppIHByb3BvcnNpLg0KDQpTaW1wYW5nYW4gYmFrdSBwb3B1bGFzaSAoz4MpIGRpa2V0YWh1aSwgeWFpdHUgz4MgPSAzLDIuIEluaSBhZGFsYWggc3lhcmF0IHV0YW1hIHBlbmdndW5hYW4gZGlzdHJpYnVzaSBaLg0KDQpVa3VyYW4gc2FtcGVsIGJlc2FyIChuID0gMTAwKSwgc2VoaW5nZ2EgYXN1bXNpIGRpc3RyaWJ1c2kgbm9ybWFsIHVudHVrIHJhdGEtcmF0YSBzYW1wZWwgdGVycGVudWhpIGJlcmRhc2Fya2FuIFRlb3JlbWEgTGltaXQgUHVzYXQsIG1lc2tpcHVuIGRpc3RyaWJ1c2kgZGF0YSBhc2xpIHRpZGFrIGRpa2V0YWh1aS4NCg0KRGF0YSBiZXJ1cGEgdmFyaWFiZWwgbnVtZXJpayBrb250aW51IChqdW1sYWggdHJhbnNha3NpKS4NCjwvZGl2Pg0KDQojIyBDb25maWRlbmNlIEludGVydmFsIDkwJQ0KPGRpdiBjbGFzcz0icGFzdGVsLXB1cnBsZS1ib3giPg0KKipSdW11cyBDSSB1bnR1ayBfei1kaXN0cmlidXRpb25fKioNCiQkQ0kgPSBcYmFye3h9IFxwbSB6X3tcYWxwaGEvMn1cLFxmcmFje1xzaWdtYX17XHNxcnR7bn19JCQNCioqU2FtcGxlIFNpemUqKg0KJCR7bn0gPSAxMDAkJA0KDQoqKlN0YW5kYXIgRGV2aWF0aW9uKioNCiQke8+DfSA9IDMuMiQkDQoNCioqU2FtcGxlIE1lYW4qKg0KJCRcYmFye3h9ID0gMTIuNiQkDQoNCioqQ29uZmlkZW5jZSBMZXZlbCA5MCUqKg0KJCQxIC0gMC45ID0gXGZyYWN7MC4xfXsyfSA9IDAuMDUg4omIIDEuNjUkJA0KDQoqKlN0YW5kYXJkIEVycm9yKioNCg0KJCRTRSA9IFxmcmFje1xzaWdtYX17XHNxcnR7bn19JCQNCiQkXGZyYWN7My4yfXtcc3FydHsxMDB9fSA9IDAuMzIkJA0KDQoqKk1hcmdpbiBvZiBFcnJvcioqDQoNCiQkTUUgPSB6X3tcYWxwaGEvMn1cIMOXIFNFJCQgDQokJHsxLjY1fVwgw5cgU0VcIHtcYXBwcm94ezAuNTI4fX0kJA0KDQoqKkNJIDkwJSoqDQoNCiQkXGJhcnt4fVwgXHBtXCBNRSQkDQokJDEyLjZcIFxwbVwgMC41MjgkJA0KJCR7XGFwcHJveFwgKDEyLjA3MiwgMTMuMTI4KX0kJA0KPC9kaXY+DQoNCiMjIENvbmZpZGVuY2UgSW50ZXJ2YWwgOTUlDQo8ZGl2IGNsYXNzPSJwYXN0ZWwtcHVycGxlLWJveCI+DQoqKlJ1bXVzIENJIHVudHVrIF96LWRpc3RyaWJ1dGlvbl8qKg0KJCRDSSA9IFxiYXJ7eH0gXHBtIHpfe1xhbHBoYS8yfVwsXGZyYWN7XHNpZ21hfXtcc3FydHtufX0kJA0KKipTYW1wbGUgU2l6ZSoqDQokJHtufSA9IDEwMCQkDQoNCioqU3RhbmRhciBEZXZpYXRpb24qKg0KJCR7z4N9ID0gMy4yJCQNCg0KKipTYW1wbGUgTWVhbioqDQokJFxiYXJ7eH0gPSAxMi42JCQNCg0KKipDb25maWRlbmNlIExldmVsIDk1JSoqDQokJDEgLSAwLjk1ID0gXGZyYWN7MC4wNX17Mn0gPSAwLjAyNSDiiYggMS45NiQkDQoNCioqU3RhbmRhcmQgRXJyb3IqKg0KDQokJFNFID0gXGZyYWN7XHNpZ21hfXtcc3FydHtufX0kJA0KJCRcZnJhY3szLjJ9e1xzcXJ0ezEwMH19ID0gMC4zMiQkDQoNCioqTWFyZ2luIG9mIEVycm9yKioNCg0KJCRNRSA9IHpfe1xhbHBoYS8yfVwgw5cgU0UkJCANCiQkezEuOTZ9XCDDlyBTRVwge1xhcHByb3h7MC42MjcyfX0kJA0KDQoqKkNJIDk1JSoqDQoNCiQkXGJhcnt4fVwgXHBtXCBNRSQkDQokJDEyLjZcIFxwbVwgMC42MjcyJCQNCiQke1xhcHByb3hcICgxMS45NzI4LCAxMy4yMjcyKX0kJA0KPC9kaXY+DQoNCiMjIENvbmZpZGVuY2UgSW50ZXJ2YWwgOTklDQo8ZGl2IGNsYXNzPSJwYXN0ZWwtcHVycGxlLWJveCI+DQoqKlJ1bXVzIENJIHVudHVrIF96LWRpc3RyaWJ1dGlvbl8qKg0KJCRDSSA9IFxiYXJ7eH0gXHBtIHpfe1xhbHBoYS8yfVwsXGZyYWN7XHNpZ21hfXtcc3FydHtufX0kJA0KDQoqKlNhbXBsZSBTaXplKioNCiQke259ID0gMTAwJCQNCg0KKipTdGFuZGFyIERldmlhdGlvbioqDQokJHvPg30gPSAzLjIkJA0KDQoqKlNhbXBsZSBNZWFuKioNCiQkXGJhcnt4fSA9IDEyLjYkJA0KDQoqKkNvbmZpZGVuY2UgTGV2ZWwgOTklKioNCiQkMSAtIDAuOTkgPSBcZnJhY3swLjAxfXsyfSA9IDAuMDA1IOKJiCAyLjU4JCQNCg0KKipTdGFuZGFyZCBFcnJvcioqDQoNCiQkU0UgPSBcZnJhY3tcc2lnbWF9e1xzcXJ0e259fSQkDQokJFxmcmFjezMuMn17XHNxcnR7MTAwfX0gPSAwLjMyJCQNCg0KKipNYXJnaW4gb2YgRXJyb3IqKg0KDQokJE1FID0gel97XGFscGhhLzJ9XCDDlyBTRSQkIA0KJCR7Mi41OH1cIMOXIFNFXCB7XGFwcHJveHswLjgyfX0kJA0KDQoqKkNJIDk5JSoqDQoNCiQkXGJhcnt4fVwgXHBtXCBNRSQkDQokJDEyLjZcIFxwbVwgMC44MiQkDQokJHtcYXBwcm94XCAoMTEuNzgxLCAxMy40Mil9JCQNCjwvZGl2Pg0KDQojIyBWaXN1YWxpemF0aW9uDQo8ZGl2IGNsYXNzPSJwYXN0ZWwtcHVycGxlLWJveCI+DQpgYGB7ciwgbWVzc2FnZT1GQUxTRSx3YXJuaW5nPUZBTFNFLCBlY2hvPUZBTFNFfQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShwbG90bHkpDQojIFBhcmFtZXRlcg0KbWVhbl94IDwtIDEyLjYNCnNpZ21hIDwtIDMuMg0KbiA8LSAxMDANCnNlIDwtIHNpZ21hIC8gc3FydChuKQ0KDQojIENvbmZpZGVuY2UgbGV2ZWxzDQp6X3ZhbHVlcyA8LSBjKDEuNjUsIDEuOTYsIDIuNTgpDQoNCmNpX2xvd2VyIDwtIG1lYW5feCAtIHpfdmFsdWVzICogc2UNCmNpX3VwcGVyIDwtIG1lYW5feCArIHpfdmFsdWVzICogc2UNCg0KY2lfZGF0YSA8LSBkYXRhLmZyYW1lKA0KICBsZXZlbCA9IGMoIjkwJSBDSSIsICI5NSUgQ0kiLCAiOTklIENJIiksDQogIGxvd2VyID0gY2lfbG93ZXIsDQogIHVwcGVyID0gY2lfdXBwZXIsDQogIGNvbG9yID0gYygiI0ZGOUFBMiIsICIjQTBDNEZGIiwgIiNDQkEwREMiKQ0KKQ0KeF92YWxzIDwtIHNlcShtZWFuX3ggLSA0KnNlLCBtZWFuX3ggKyA0KnNlLCBsZW5ndGgub3V0ID0gMTAwMCkNCnlfdmFscyA8LSBkbm9ybSh4X3ZhbHMsIG1lYW5feCwgc2UpDQoNCm5vcm1hbF9kZiA8LSBkYXRhLmZyYW1lKHggPSB4X3ZhbHMsIHkgPSB5X3ZhbHMpDQoNCiMgUGxvdA0KcCA8LSBnZ3Bsb3Qobm9ybWFsX2RmLCBhZXMoeCwgeSkpICsNCiAgZ2VvbV9hcmVhKGZpbGwgPSAiI0E4RTZDRiIsIGFscGhhID0gMC44KSArDQogIGdlb21fbGluZShjb2xvciA9ICJibGFjayIsIGxpbmV3aWR0aCA9IDEuMikgKw0KICANCiAgIyBNZWFuIGxpbmUNCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gbWVhbl94LCBsaW5ldHlwZSA9ICJkYXNoZWQiLCBsaW5ld2lkdGggPSAxKSArDQogIGFubm90YXRlKCJ0ZXh0IiwNCiAgICAgICAgICAgeCA9IG1lYW5feCwNCiAgICAgICAgICAgeSA9IG1heCh5X3ZhbHMpICogMS4wNSwNCiAgICAgICAgICAgbGFiZWwgPSAieMyEID0gMTIuNiIsDQogICAgICAgICAgIHNpemUgPSA1LA0KICAgICAgICAgICBmb250ZmFjZSA9ICJib2xkIikgKw0KICANCiAgIyBDSSBsaW5lcw0KICBnZW9tX3ZsaW5lKGRhdGEgPSBjaV9kYXRhLA0KICAgICAgICAgICAgIGFlcyh4aW50ZXJjZXB0ID0gbG93ZXIsIGNvbG9yID0gbGV2ZWwpLA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRvdHRlZCIsDQogICAgICAgICAgICAgbGluZXdpZHRoID0gMSkgKw0KICBnZW9tX3ZsaW5lKGRhdGEgPSBjaV9kYXRhLA0KICAgICAgICAgICAgIGFlcyh4aW50ZXJjZXB0ID0gdXBwZXIsIGNvbG9yID0gbGV2ZWwpLA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRvdHRlZCIsDQogICAgICAgICAgICAgbGluZXdpZHRoID0gMSkgKw0KICANCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGNpX2RhdGEkY29sb3IpICsNCiAgbGFicygNCiAgICB0aXRsZSA9ICJDb25maWRlbmNlIEludGVydmFscyAoWi1kaXN0cmlidXRpb24pIiwNCiAgICB4ID0gIlZhbHVlIiwNCiAgICB5ID0gIlByb2JhYmlsaXR5IERlbnNpdHkiLA0KICAgIGNvbG9yID0gIkludGVydmFsIg0KICApICsNCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgxMS41LCAxNCwgMC41KSwgDQogICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKDExLjMsIDE0LjMpKSArDQogIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBleHBhbnNpb24obXVsdCA9IGMoMCwgMC4xNSkpKSArDQogIA0KICB0aGVtZV9taW5pbWFsKGJhc2Vfc2l6ZSA9IDEzKSArDQogIHRoZW1lKA0KICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiwgc2l6ZSA9IDE1LCBoanVzdCA9IDAuNSksDQogICAgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICBwYW5lbC5ncmlkLm1ham9yLnkgPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiZ3JheTkwIiksDQogICAgYXhpcy5saW5lLnggPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiZ3JheTMwIiksDQogICAgcGxvdC5tYXJnaW4gPSBtYXJnaW4oMTAsIDEwLCAxMCwgMTApDQogICkNCg0KIyBJbnRlcmFrdGlmIGRlbmdhbiBQbG90bHkNCmdncGxvdGx5KHApDQoNCmBgYA0KDQoNCioqSW50ZXJwcmV0YXRpb24qKg0KDQpEaWFncmFtIGluaSBtZW51bmp1a2thbiBkaXN0cmlidXNpIG5vcm1hbCBkYXJpIHJhdGEtcmF0YSB0cmFuc2Frc2kgaGFyaWFuIHBlbmdndW5hIGRlbmdhbiBtZWFuIHNhbXBlbCBzZWJlc2FyIDEyLDYuIEdhcmlzIHZlcnRpa2FsIGhpdGFtIG1lbmFuZGFpIG5pbGFpIG1lYW4gdGVyc2VidXQsIHNlbWVudGFyYSBnYXJpcyB0aXRpay10aXRpayBiZXJ3YXJuYSBoaWphdSwgYmlydSwgZGFuIG1lcmFoIG1hc2luZy1tYXNpbmcgbWV3YWtpbGkgaW50ZXJ2YWwga2VwZXJjYXlhYW4gOTAlLCA5NSUsIGRhbiA5OSUuIFNlbWFraW4gdGluZ2dpIHRpbmdrYXQga2VwZXJjYXlhYW4sIGludGVydmFsIG1lbmphZGkgbGViaWggbGViYXIsIG1lbmNlcm1pbmthbiB0cmFkZS1vZmYgYW50YXJhIGtleWFraW5hbiBkYW4gcHJlc2lzaSBlc3RpbWFzaS4gDQpEZW5nYW4gZGVtaWtpYW4sIGtpdGEgZGFwYXQgbWVueWltcHVsa2FuIGJhaHdhIGRlbmdhbiBrZXlha2luYW4geWFuZyB0aW5nZ2ksIHJhdGEtcmF0YSB0cmFuc2Frc2kgaGFyaWFuIHBvcHVsYXNpIGtlbXVuZ2tpbmFuIGJlc2FyIGJlcmFkYSBkYWxhbSByZW50YW5nIGludGVydmFsIHRlcnNlYnV0LCB5YW5nIG1lbWJhbnR1IG1lbWJlcmlrYW4gZ2FtYmFyYW4ga2VhbmRhbGFuIGVzdGltYXNpIHJhdGEtcmF0YSB0cmFuc2Frc2kgc2V0ZWxhaCBwZWx1bmN1cmFuIGZpdHVyIGJhcnUuDQo8L2Rpdj4NCg0KIyMgQnVzaW5lc3MgQW5hbHl0aWNzDQo8ZGl2IGNsYXNzPSJwYXN0ZWwtcHVycGxlLWJveCI+DQpDb25maWRlbmNlIGludGVydmFsIG1lbnVuanVra2FuIHJlbnRhbmcgbmlsYWkgZGkgbWFuYSByYXRhLXJhdGEgdHJhbnNha3NpIGhhcmlhbiBwZXIgcGVuZ2d1bmEga2VtdW5na2luYW4gYmVzYXIgYmVyYWRhIGRlbmdhbiB0aW5na2F0IGtleWFraW5hbiB0ZXJ0ZW50dS4gTWlzYWxueWEsIHBhZGEgdGluZ2thdCBrZXBlcmNheWFhbiA5NSUsIHBsYXRmb3JtIGUtY29tbWVyY2UgZGFwYXQgeWFraW4gYmFod2EgcmF0YS1yYXRhIHRyYW5zYWtzaSBoYXJpYW4gcGVyIHBlbmdndW5hIGJlcmFkYSBhbnRhcmEgc2VraXRhciAxMSw5NyBoaW5nZ2EgMTMsMjMgdHJhbnNha3NpLiBJbmkgbWVtYmFudHUgYmlzbmlzIG1lbWFoYW1pIGVmZWt0aXZpdGFzIGZpdHVyIGJhcnUgc2VjYXJhIHN0YXRpc3RpayBkZW5nYW4gbWVtcGVya2lyYWthbiBuaWxhaSByYXRhLXJhdGEgeWFuZyBzZXN1bmdndWhueWEsIGJ1a2FuIGhhbnlhIGJlcmRhc2Fya2FuIHNhbXBlbC4gU2VtYWtpbiB0aW5nZ2kgdGluZ2thdCBrZXBlcmNheWFhbiwgcmVudGFuZyBpbnRlcnZhbCBtZW5qYWRpIGxlYmloIGxlYmFyLCBtZW51bmp1a2thbiBrZXRpZGFrcGFzdGlhbiB5YW5nIGxlYmloIGJlc2FyIHRhcGkganVnYSBrZXlha2luYW4geWFuZyBsZWJpaCBrdWF0IGJhaHdhIG5pbGFpIHNlYmVuYXJueWEgYWRhIGRhbGFtIHJlbnRhbmcgdGVyc2VidXQuIERlbmdhbiBpbmZvcm1hc2kgaW5pLCBtYW5hamVtZW4gZGFwYXQgbWVtYnVhdCBrZXB1dHVzYW4geWFuZyBsZWJpaCB0ZXBhdCBtZW5nZW5haSBrZWJlcmhhc2lsYW4gZml0dXIgZGFuIHBlcmVuY2FuYWFuIGthcGFzaXRhcyB0cmFuc2Frc2kuDQo8L2Rpdj4NCg0KIyBDYXNlIFN0dWR5IDINCjxkaXYgY2xhc3M9InBhc3RlbC1icm93bi1ib3giPg0KKipDb25maWRlbmNlIEludGVydmFsIGZvciBNZWFuLCDPgyBVbmtub3duOioqIA0KDQpBIFVYIFJlc2VhcmNoIHRlYW0gYW5hbHl6ZXMgdGFzayBjb21wbGV0aW9uIHRpbWUgKGluIG1pbnV0ZXMpIGZvciBhIG5ldyBtb2JpbGUgYXBwbGljYXRpb24uIFRoZSBkYXRhIGFyZSBjb2xsZWN0ZWQgZnJvbSAxMiB1c2VyczoNCg0KJCQ4LjQsNy45LDkuMSw4LjcsOC4yLDkuMCw3LjgsOC41LDguOSw4LjEsOC42LDguMyQkDQoNCioqVGFza3M6KioNCg0KMS4gSWRlbnRpZnkgdGhlIGFwcHJvcHJpYXRlIHN0YXRpc3RpY2FsIHRlc3QgYW5kIGV4cGxhaW4gd2h5Lg0KDQoyLiBDb21wdXRlIHRoZSBDb25maWRlbmNlIEludGVydmFscyBmb3I6DQogICAtIDkwJQ0KICAgLSA5NSUNCiAgIC0gOTklDQoNCjMuIFZpc3VhbGl6ZSB0aGUgdGhyZWUgaW50ZXJ2YWxzIG9uIGEgc2luZ2xlIHBsb3QuDQoNCjQuIEV4cGxhaW4gaG93IHNhbXBsZSBzaXplIGFuZCBjb25maWRlbmNlIGxldmVsIGluZmx1ZW5jZSB0aGUgaW50ZXJ2YWwgd2lkdGguDQo8L2Rpdj4NCg0KIyMgVWppIFN0YXRpc3Rpaw0KPGRpdiBjbGFzcz0icGFzdGVsLWJyb3duLWJveCI+DQpVamkgeWFuZyB0ZXBhdCBhZGFsYWggbWVtYnVhdCBpbnRlcnZhbCBrZXBlcmNheWFhbiByYXRhLXJhdGEgbWVuZ2d1bmFrYW4gdC1kaXN0cmlidXNpLCBrYXJlbmEgZGF0YSB5YW5nIGRpYmVyaWthbiBiZXJhc2FsIGRhcmkgMTIgcGVuZ2d1bmEgKHVrdXJhbiBzYW1wZWwga2VjaWwsIHlhaXR1IG4gPCAzMCkgZGFuIHNpbXBhbmdhbiBiYWt1IHBvcHVsYXNpICjPgykgdGlkYWsgZGlrZXRhaHVpLCBtYWthIHVqaSBzdGF0aXN0aWsgeWFuZyB0ZXBhdCB1bnR1ayBtZW1idWF0IGludGVydmFsIGtlcGVyY2F5YWFuIHJhdGEtcmF0YSBhZGFsYWggbWVuZ2d1bmFrYW4gZGlzdHJpYnVzaSB0LVN0dWRlbnQuDQoNCioqQWxhc2FuIG1lbWlsaWggZGlzdHJpYnVzaSB0LToqKg0KDQpVa3VyYW4gc2FtcGVsIGtlY2lsIChuIDwgMzApOiBTYWF0IHVrdXJhbiBzYW1wZWwga2VjaWwsIGRpc3RyaWJ1c2kgc2FtcGxpbmcgcmF0YS1yYXRhIHRpZGFrIG1lbmdpa3V0aSBkaXN0cmlidXNpIG5vcm1hbCBiYWt1IHNlY2FyYSBzZW1wdXJuYSwgc2VoaW5nZ2EgZGlzdHJpYnVzaSB0IGxlYmloIGNvY29rIGRpZ3VuYWthbiBrYXJlbmEgbWVtcGVyaGl0dW5na2FuIGtldGlkYWtwYXN0aWFuIHBhZGEgZXN0aW1hc2kgc2ltcGFuZ2FuIGJha3UuDQoNClNpbXBhbmdhbiBiYWt1IHBvcHVsYXNpIHRpZGFrIGRpa2V0YWh1aTogS2l0YSBoYW55YSBwdW55YSBkYXRhIHNhbXBlbCwgc2VoaW5nZ2Egc2ltcGFuZ2FuIGJha3UgcG9wdWxhc2kgaGFydXMgZGllc3RpbWFzaSBkYXJpIHNpbXBhbmdhbiBiYWt1IHNhbXBlbC4gRGlzdHJpYnVzaSB0LVN0dWRlbnQgZGlyYW5jYW5nIHVudHVrIGtvbmRpc2kgaW5pLg0KDQpEYXRhIGRpYXN1bXNpa2FuIGJlcmFzYWwgZGFyaSBwb3B1bGFzaSB5YW5nIGJlcmRpc3RyaWJ1c2kgbm9ybWFsOiBBc3Vtc2kgaW5pIHBlbnRpbmcgdW50dWsgdmFsaWRpdGFzIHBlbmdndW5hYW4gZGlzdHJpYnVzaSB0Lg0KPC9kaXY+DQojIyBDb25maW5kZW5jZSBJbnRlcnZhbCA5MCUNCjxkaXYgY2xhc3M9InBhc3RlbC1icm93bi1ib3giPg0KKipTYW1wbGUgU2l6ZSoqDQokJG4gPSAxMiQkDQoNCioqU2FtcGxlIE1lYW4qKg0KJCRcYmFye3h9ID0gXGZyYWN7MX17bn0gXHN1bV97aT0xfV57bn0geF9pJCQNCiQkXGJlZ2lue2FsaWduKn0NClxiYXJ7eH0gJj0gXGZyYWN7MX17MTJ9ICg4LjQgKyA3LjkgKyA5LjEgKyA4LjcgKyA4LjIgKyA5LjAgKyA3LjggKyA4LjUgKyA4LjkgKyA4LjEgKyA4LjYgKyA4LjMpIFxcDQomPSA4LjQ1DQpcZW5ke2FsaWduKn0kJA0KDQoqKlN0YW5kYXJkIERldmlhdGlvbioqDQokJHMgPSBcc3FydHtcZnJhY3sxfXtuLTF9IFxzdW1fe2k9MX1ee259ICh4X2kgLSBcYmFye3h9KV4yfSQkDQokJA0KcyA9IFxzcXJ0e1xmcmFjezF9ezEyLTF9IFxCaWdbICg4LjQtOC40NSleMiArICg3LjktOC40NSleMiArICguLi4pXjIgKyg4LjMtOC40NSleMiBcQmlnXX0NCiQkDQoNCiQkDQo9IFxzcXJ0e1xmcmFjezEuOTV9ezExfX0gPSBcc3FydHswLjE3NzI3fSBcYXBwcm94IDAuNDIxDQokJA0KKipDcml0aWNhbCBWYWx1ZSA5MCUqKg0KJCQxIC0gMC45ID0gXGZyYWN7MC4xfXsyfSA9IDAuMDUg4omIIDEuNzk2JCQNCioqU3RhbmRhcmQgRXJyb3IgKFNFKSoqDQokJFNFID0gXGZyYWN7c317XHNxcnR7bn19JCQNCiQkDQpTRSA9IFxmcmFjezAuNDIxfXtcc3FydHsxMn19IA0KPSBcZnJhY3swLjQyMX17My40NjR9IA0KXGFwcHJveCAwLjEyMQ0KJCQNCioqTWFyZ2luIG9mIEVycm9yIChNRSkqKg0KJCQNClxiZWdpbnthbGlnbmVkfQ0KTUUgJj0gdF97XGFscGhhLzIsIGRmfSBcdGltZXMgU0UgPSAxLjc5NiBcdGltZXMgMC4xMjEgXGFwcHJveCAwLjIxNzMNClxlbmR7YWxpZ25lZH0NCiQkDQoqKkNJIDkwJSoqDQokJFxiYXJ7eH1cIFxwbVwgTUUkJA0KJCQ4LjQ1XCBccG1cIDAuMjE3MyQkDQokJHtcYXBwcm94XCAoOC4yMzI3LCA4LjY2NzMpfSQkDQo8L2Rpdj4NCiMjIENvbmZpZGVuY2UgSW50ZXJ2YWwgOTUlDQo8ZGl2IGNsYXNzPSJwYXN0ZWwtYnJvd24tYm94Ij4NCioqU2FtcGxlIFNpemUqKg0KJCRuID0gMTIkJA0KDQoqKlNhbXBsZSBNZWFuKioNCiQkXGJhcnt4fSA9IFxmcmFjezF9e259IFxzdW1fe2k9MX1ee259IHhfaSQkDQokJFxiZWdpbnthbGlnbip9DQpcYmFye3h9ICY9IFxmcmFjezF9ezEyfSAoOC40ICsgNy45ICsgOS4xICsgOC43ICsgOC4yICsgOS4wICsgNy44ICsgOC41ICsgOC45ICsgOC4xICsgOC42ICsgOC4zKSBcXA0KJj0gOC40NQ0KXGVuZHthbGlnbip9JCQNCg0KKipTdGFuZGFyZCBEZXZpYXRpb24qKg0KJCRzID0gXHNxcnR7XGZyYWN7MX17bi0xfSBcc3VtX3tpPTF9XntufSAoeF9pIC0gXGJhcnt4fSleMn0kJA0KJCQNCnMgPSBcc3FydHtcZnJhY3sxfXsxMi0xfSBcQmlnWyAoOC40LTguNDUpXjIgKyAoNy45LTguNDUpXjIgKyAoLi4uKV4yICsoOC4zLTguNDUpXjIgXEJpZ119DQokJA0KDQokJA0KPSBcc3FydHtcZnJhY3sxLjk1fXsxMX19ID0gXHNxcnR7MC4xNzcyN30gXGFwcHJveCAwLjQyMQ0KJCQNCioqQ3JpdGljYWwgVmFsdWUgOTUlKioNCiQkMSAtIDAuOTUgPSBcZnJhY3swLjA1fXsyfSA9IDAuMDI1IOKJiCAyLjIwMSQkDQoqKlN0YW5kYXJkIEVycm9yIChTRSkqKg0KJCRTRSA9IFxmcmFje3N9e1xzcXJ0e259fSQkDQokJA0KU0UgPSBcZnJhY3swLjQyMX17XHNxcnR7MTJ9fSANCj0gXGZyYWN7MC40MjF9ezMuNDY0fSANClxhcHByb3ggMC4xMjENCiQkDQoqKk1hcmdpbiBvZiBFcnJvciAoTUUpKioNCiQkDQpcYmVnaW57YWxpZ25lZH0NCk1FICY9IHRfe1xhbHBoYS8yLCBkZn0gXHRpbWVzIFNFID0gMi4yMDEgXHRpbWVzIDAuMTIxIFxhcHByb3ggMC4yNjYzDQpcZW5ke2FsaWduZWR9DQokJA0KKipDSSA5NSUqKg0KJCRcYmFye3h9XCBccG1cIE1FJCQNCiQkOC40NVwgXHBtXCAwLjI2NjMkJA0KJCR7XGFwcHJveFwgKDguMTgzNywgOC43MTYzKX0kJA0KPC9kaXY+DQojIyBDb25maWRlbmNlIEludGVydmFsIDk5JQ0KPGRpdiBjbGFzcz0icGFzdGVsLWJyb3duLWJveCI+DQoqKlNhbXBsZSBTaXplKioNCiQkbiA9IDEyJCQNCg0KKipTYW1wbGUgTWVhbioqDQokJFxiYXJ7eH0gPSBcZnJhY3sxfXtufSBcc3VtX3tpPTF9XntufSB4X2kkJA0KJCRcYmVnaW57YWxpZ24qfQ0KXGJhcnt4fSAmPSBcZnJhY3sxfXsxMn0gKDguNCArIDcuOSArIDkuMSArIDguNyArIDguMiArIDkuMCArIDcuOCArIDguNSArIDguOSArIDguMSArIDguNiArIDguMykgXFwNCiY9IDguNDUNClxlbmR7YWxpZ24qfSQkDQoNCioqU3RhbmRhcmQgRGV2aWF0aW9uKioNCiQkcyA9IFxzcXJ0e1xmcmFjezF9e24tMX0gXHN1bV97aT0xfV57bn0gKHhfaSAtIFxiYXJ7eH0pXjJ9JCQNCiQkDQpzID0gXHNxcnR7XGZyYWN7MX17MTItMX0gXEJpZ1sgKDguNC04LjQ1KV4yICsgKDcuOS04LjQ1KV4yICsgKC4uLileMiArKDguMy04LjQ1KV4yIFxCaWddfQ0KJCQNCg0KJCQNCj0gXHNxcnR7XGZyYWN7MS45NX17MTF9fSA9IFxzcXJ0ezAuMTc3Mjd9IFxhcHByb3ggMC40MjENCiQkDQoqKkNyaXRpY2FsIFZhbHVlIDk5JSoqDQokJDEgLSAwLjk5ID0gXGZyYWN7MC4wMX17Mn0gPSAwLjAwNSDiiYggMy4xMDYkJA0KKipTdGFuZGFyZCBFcnJvciAoU0UpKioNCiQkU0UgPSBcZnJhY3tzfXtcc3FydHtufX0kJA0KJCQNClNFID0gXGZyYWN7MC40MjF9e1xzcXJ0ezEyfX0gDQo9IFxmcmFjezAuNDIxfXszLjQ2NH0gDQpcYXBwcm94IDAuMTIxDQokJA0KKipNYXJnaW4gb2YgRXJyb3IgKE1FKSoqDQokJA0KXGJlZ2lue2FsaWduZWR9DQpNRSAmPSB0X3tcYWxwaGEvMiwgZGZ9IFx0aW1lcyBTRSA9IDMuMTA2IFx0aW1lcyAwLjEyMSBcYXBwcm94IDAuMzc1OA0KXGVuZHthbGlnbmVkfQ0KJCQNCioqQ0kgOTklKioNCiQkXGJhcnt4fVwgXHBtXCBNRSQkDQokJDguNDVcIFxwbVwgMC4zNzU4JCQNCiQke1xhcHByb3hcICg4LjA3NDIsIDguODI1OCl9JCQNCjwvZGl2Pg0KDQojIyBWaXN1YWxpemF0aW9uDQo8ZGl2IGNsYXNzPSJwYXN0ZWwtYnJvd24tYm94Ij4NCmBgYHtyLCBtZXNzYWdlPUZBTFNFLHdhcm5pbmc9RkFMU0UsIGVjaG89RkFMU0V9DQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KHBsb3RseSkNCg0KIyBQYXJhbWV0ZXINCm1lYW5feCA8LSA4LjQ1DQpzIDwtIDAuNDIxICAgICAgICAjIHNhbXBsZSBzdGFuZGFyZCBkZXZpYXRpb24NCm4gPC0gMTINCnNlIDwtIHMgLyBzcXJ0KG4pDQpkZiA8LSBuIC0gMQ0KDQojIENvbmZpZGVuY2UgbGV2ZWxzICh0IGNyaXRpY2FsIHZhbHVlcykNCmNvbmZfbGV2ZWxzIDwtIGMoMC45MCwgMC45NSwgMC45OSkNCnRfdmFsdWVzIDwtIHF0KDEgLSAoMSAtIGNvbmZfbGV2ZWxzKS8yLCBkZikgICMgdCBjcml0aWNhbCB2YWx1ZXMNCg0KY2lfbG93ZXIgPC0gbWVhbl94IC0gdF92YWx1ZXMgKiBzZQ0KY2lfdXBwZXIgPC0gbWVhbl94ICsgdF92YWx1ZXMgKiBzZQ0KDQpjaV9kYXRhIDwtIGRhdGEuZnJhbWUoDQogIGxldmVsID0gYygiOTAlIENJIiwgIjk1JSBDSSIsICI5OSUgQ0kiKSwNCiAgbG93ZXIgPSBjaV9sb3dlciwNCiAgdXBwZXIgPSBjaV91cHBlciwNCiAgY29sb3IgPSBjKCIjQTBDNEZGIiwgIiNBOEU2Q0YiLCAiI0NCQTBEQyIpDQopDQoNCiMgWCBhbmQgWSB2YWx1ZXMgZm9yIHQtZGlzdHJpYnV0aW9uIGRlbnNpdHkNCnhfdmFscyA8LSBzZXEobWVhbl94IC0gNCpzZSwgbWVhbl94ICsgNCpzZSwgbGVuZ3RoLm91dCA9IDEwMDApDQp5X3ZhbHMgPC0gZHQoKHhfdmFscyAtIG1lYW5feCkvc2UsIGRmKSAvIHNlICAjIHNjYWxlZCB0LWRlbnNpdHkNCg0KdF9kZiA8LSBkYXRhLmZyYW1lKHggPSB4X3ZhbHMsIHkgPSB5X3ZhbHMpDQoNCiMgUGxvdA0KcCA8LSBnZ3Bsb3QodF9kZiwgYWVzKHgsIHkpKSArDQogIGdlb21fYXJlYShmaWxsID0gIiNGRkY1QTUiLCBhbHBoYSA9IDAuOCkgKw0KICBnZW9tX2xpbmUoY29sb3IgPSAiYmxhY2siLCBsaW5ld2lkdGggPSAxLjIpICsNCiAgDQogICMgTWVhbiBsaW5lDQogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IG1lYW5feCwgbGluZXR5cGUgPSAiZGFzaGVkIiwgbGluZXdpZHRoID0gMC43KSArDQogIGFubm90YXRlKCJ0ZXh0IiwNCiAgICAgICAgICAgeCA9IG1lYW5feCwNCiAgICAgICAgICAgeSA9IG1heCh5X3ZhbHMpICogMS4wNSwNCiAgICAgICAgICAgbGFiZWwgPSBwYXN0ZTAoInjMhCA9ICIsIG1lYW5feCksDQogICAgICAgICAgIHNpemUgPSA0LA0KICAgICAgICAgICBmb250ZmFjZSA9ICJib2xkIikgKw0KICANCiAgIyBDSSBsaW5lcyAoZG90dGVkKQ0KICBnZW9tX3ZsaW5lKGRhdGEgPSBjaV9kYXRhLA0KICAgICAgICAgICAgIGFlcyh4aW50ZXJjZXB0ID0gbG93ZXIsIGNvbG9yID0gbGV2ZWwpLA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRvdHRlZCIsDQogICAgICAgICAgICAgbGluZXdpZHRoID0gMSkgKw0KICBnZW9tX3ZsaW5lKGRhdGEgPSBjaV9kYXRhLA0KICAgICAgICAgICAgIGFlcyh4aW50ZXJjZXB0ID0gdXBwZXIsIGNvbG9yID0gbGV2ZWwpLA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRvdHRlZCIsDQogICAgICAgICAgICAgbGluZXdpZHRoID0gMSkgKw0KICANCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGNpX2RhdGEkY29sb3IpICsNCiAgbGFicygNCiAgICB0aXRsZSA9ICJDb25maWRlbmNlIEludGVydmFscyAoVC1kaXN0cmlidXRpb24pIiwNCiAgICB4ID0gIlZhbHVlIiwNCiAgICB5ID0gIlByb2JhYmlsaXR5IERlbnNpdHkiLA0KICAgIGNvbG9yID0gIkludGVydmFsIg0KICApICsNCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSg3LjUsIDkuNSwgMC4yNSksIA0KICAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYyg3LjgsIDkuNSkpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGV4cGFuc2lvbihtdWx0ID0gYygwLCAwLjE1KSkpICsNCiAgDQogIHRoZW1lX21pbmltYWwoYmFzZV9zaXplID0gMTMpICsNCiAgdGhlbWUoDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiLCBzaXplID0gMTUsIGhqdXN0ID0gMC41KSwNCiAgICBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpLA0KICAgIHBhbmVsLmdyaWQubWFqb3IueSA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJncmF5OTAiKSwNCiAgICBheGlzLmxpbmUueCA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJncmF5MzAiKSwNCiAgICBwbG90Lm1hcmdpbiA9IG1hcmdpbigxMCwgMTAsIDEwLCAxMCkNCiAgKQ0KDQojIEludGVyYWt0aWYgZGVuZ2FuIFBsb3RseQ0KZ2dwbG90bHkocCkNCg0KDQpgYGANCg0KKipJbnRlcnByZXRhdGlvbioqDQoNCkRpYWdyYW0gdGVyc2VidXQgbWVudW5qdWtrYW4gaW50ZXJ2YWwga2VwZXJjYXlhYW4gcmF0YS1yYXRhIG1lbmdndW5ha2FuIGRpc3RyaWJ1c2kgdCBkZW5nYW4gcmF0YS1yYXRhIHNhbXBlbCBzZWJlc2FyIDgsNDUgeWFuZyBkaXRhbmRhaSBvbGVoIGdhcmlzIHB1dHVzLXB1dHVzIGRpIHRlbmdhaCBrdXJ2YS4gR2FyaXMgdmVydGlrYWwgYmVyd2FybmEgbWVuZ2dhbWJhcmthbiBpbnRlcnZhbCBrZXBlcmNheWFhbiA5MCUsIDk1JSwgZGFuIDk5JSwgZGkgbWFuYSBzZW1ha2luIHRpbmdnaSB0aW5na2F0IGtlcGVyY2F5YWFuIG1ha2EgaW50ZXJ2YWwgc2VtYWtpbiBsZWJhciwgbWVuY2VybWlua2FuIG1lbmluZ2thdG55YSBrZXRpZGFrcGFzdGlhbiBlc3RpbWFzaS4gU2VsdXJ1aCBpbnRlcnZhbCBiZXJzaWZhdCBzaW1ldHJpcyB0ZXJoYWRhcCBuaWxhaSByYXRhLXJhdGEsIG1lbnVuanVra2FuIGJhaHdhIGVzdGltYXNpIG1lYW4gcG9wdWxhc2kgcGFsaW5nIG11bmdraW4gYmVyYWRhIGRpIHNla2l0YXIgOCw0NS4gRGlhZ3JhbSBpbmkgbWVuZWdhc2thbiBiYWh3YSBkaXN0cmlidXNpIHQgZGlndW5ha2FuIGtldGlrYSBzaW1wYW5nYW4gYmFrdSBwb3B1bGFzaSB0aWRhayBkaWtldGFodWkgYXRhdSB1a3VyYW4gc2FtcGVsIHJlbGF0aWYga2VjaWwsIHNlcnRhIG1lbmdnYW1iYXJrYW4gdHJhZGUtb2ZmIGFudGFyYSBwcmVzaXNpIGRhbiB0aW5na2F0IGtleWFraW5hbiBkYWxhbSBwZW5ha3NpcmFuIHBhcmFtZXRlciBwb3B1bGFzaS4NCjwvZGl2Pg0KDQojIyBTYW1wbGUgU2l6ZSBhbmQgQ29uZmlkZW5jZSBMZXZlbA0KPGRpdiBjbGFzcz0icGFzdGVsLWJyb3duLWJveCI+DQpMZWJhciBpbnRlcnZhbCBrZXBlcmNheWFhbiBkaXBlbmdhcnVoaSBvbGVoIHVrdXJhbiBzYW1wZWwgZGFuIHRpbmdrYXQga2VwZXJjYXlhYW4gc2ViYWdhaSBiZXJpa3V0LiBVa3VyYW4gc2FtcGVsIGJlcnBlbmdhcnVoIG1lbGFsdWkgZ2FsYXQgYmFrdSAoc3RhbmRhcmQgZXJyb3IpOyBzZW1ha2luIGJlc2FyIHVrdXJhbiBzYW1wZWwsIGdhbGF0IGJha3Ugc2VtYWtpbiBrZWNpbCBzZWhpbmdnYSBpbnRlcnZhbCBrZXBlcmNheWFhbiBtZW5qYWRpIGxlYmloIHNlbXBpdCBkYW4gZXN0aW1hc2kgbGViaWggcHJlc2lzaSwgc2VkYW5na2FuIHNhbXBlbCBrZWNpbCBtZW5naGFzaWxrYW4gaW50ZXJ2YWwgeWFuZyBsZWJpaCBsZWJhci4gVGluZ2thdCBrZXBlcmNheWFhbiBtZW1lbmdhcnVoaSBuaWxhaSBrcml0aXMgKFogYXRhdSB0KTsgc2VtYWtpbiB0aW5nZ2kgdGluZ2thdCBrZXBlcmNheWFhbiAobWlzYWxueWEgZGFyaSA5MCUga2UgOTUlIGF0YXUgOTklKSwgbmlsYWkga3JpdGlzIHNlbWFraW4gYmVzYXIgc2VoaW5nZ2EgaW50ZXJ2YWwga2VwZXJjYXlhYW4gbWVuamFkaSBsZWJpaCBsZWJhciwga2FyZW5hIGtpdGEgaW5naW4gbGViaWggeWFraW4gYmFod2EgcGFyYW1ldGVyIHBvcHVsYXNpIGJlcmFkYSBkaSBkYWxhbSBpbnRlcnZhbCB0ZXJzZWJ1dC4gRGVuZ2FuIGRlbWlraWFuLCBpbnRlcnZhbCBrZXBlcmNheWFhbiBwYWxpbmcgc2VtcGl0IGRpcGVyb2xlaCBkYXJpIHNhbXBlbCBiZXNhciBkZW5nYW4gdGluZ2thdCBrZXBlcmNheWFhbiBsZWJpaCByZW5kYWgsIGRhbiBzZWJhbGlrbnlhLg0KPC9kaXY+DQoNCg0KIyBDYXNlIFN0dWR5IDMNCjxkaXYgY2xhc3M9InBhc3RlbC1ibHVlLWJveCI+DQoqKkNvbmZpZGVuY2UgSW50ZXJ2YWwgZm9yIGEgUHJvcG9ydGlvbiwgQS9CIFRlc3Rpbmc6KioNCg0KQSBkYXRhIHNjaWVuY2UgdGVhbSBydW5zIGFuIEEvQiB0ZXN0IG9uIGEgbmV3IENhbGwtVG8tQWN0aW9uIChDVEEpIGJ1dHRvbiBkZXNpZ24uIFRoZSBleHBlcmltZW50IHlpZWxkczoNCg0KJCQgbiA9IDQwMCQkDQokJCB4ID0gMTU2JCQNCg0KKipUYXNrczoqKg0KDQoxLiBDb21wdXRlIHRoZSBzYW1wbGUgcHJvcG9ydGlvbiAkXGhhdCB7cH0kDQoNCjIuIENvbXB1dGUgQ29uZmlkZW5jZSBJbnRlcnZhbHMgZm9yIHRoZSBwcm9wb3J0aW9uIGF0Og0KICAgLSA5MCUNCiAgIC0gOTUlDQogICAtIDk5JQ0KDQozLiBWaXN1YWxpemUgYW5kIGNvbXBhcmUgdGhlIHRocmVlIGludGVydmFscy4NCg0KNC4gRXhwbGFpbiBob3cgY29uZmlkZW5jZSBsZXZlbCBhZmZlY3RzIGRlY2lzaW9uLW1ha2luZyBpbiBwcm9kdWN0IGV4cGVyaW1lbnRzLg0KPC9kaXY+DQoNCiMjIFNhbXBsZSBQcm9wb3J0aW9uDQo8ZGl2IGNsYXNzPSJwYXN0ZWwtYmx1ZS1ib3giPg0KJCRcaGF0IHtwfSA9IFxmcmFjIHt4fXtufSA9IFxmcmFjIHsxNTZ9ezQwMH0gPSAwLjM5JCQNCjwvZGl2Pg0KIyMgQ29uZmlkZW5jZSBJbnRlcnZhbCA5MCUNCjxkaXYgY2xhc3M9InBhc3RlbC1ibHVlLWJveCI+DQoqKlN0YW5kYXJkIEVycm9yKioNCiQkDQpcYmVnaW57YWxpZ24qfQ0KU0Vfe1xoYXR7cH19ICY9IFxzcXJ0e1xmcmFje1xoYXR7cH0oMS1caGF0e3B9KX17bn19IFxcDQomPSBcc3FydHtcZnJhY3swLjM5KDEtMC4zOSl9ezQwMH19IFxcDQomPSBcc3FydHtcZnJhY3swLjM5IFxjZG90IDAuNjF9ezQwMH19IFxcDQomXGFwcHJveCAwLjAyNDQNClxlbmR7YWxpZ24qfQ0KJCQNCg0KKipDcml0aWNhbCBWYWx1ZSA5MCUqKg0KDQpVbnR1ayA5MCUgY29uZmlkZW5jZSBsZXZlbDogJFpfe1xhbHBoYS8yfSA9IDEuNjUkDQoNCioqTWFyZ2luIG9mIEVycm9yKioNCiQkIE1FID0gWl97XGFscGhhLzJ9IMOXIFNFID0gMS42NSDDlyAwLjAyNDQgXGFwcHJveCAwLjA0MDI2JCQNCg0KKipDSSA5MCUqKg0KJCRcaGF0e3B9XCBccG1cIE1FJCQNCiQkMC4zOVwgXHBtXCAwLjA0MDI2JCQNCiQke1xhcHByb3hcICgwLjM0OTc0LCAwLjQzMDI2KX0kJA0KPC9kaXY+DQojIyBDb25maWRlbmNlIEludGVydmFsIDk1JQ0KPGRpdiBjbGFzcz0icGFzdGVsLWJsdWUtYm94Ij4NCioqU3RhbmRhcmQgRXJyb3IqKg0KJCQNClxiZWdpbnthbGlnbip9DQpTRV97XGhhdHtwfX0gJj0gXHNxcnR7XGZyYWN7XGhhdHtwfSgxLVxoYXR7cH0pfXtufX0gXFwNCiY9IFxzcXJ0e1xmcmFjezAuMzkoMS0wLjM5KX17NDAwfX0gXFwNCiY9IFxzcXJ0e1xmcmFjezAuMzkgXGNkb3QgMC42MX17NDAwfX0gXFwNCiZcYXBwcm94IDAuMDI0NA0KXGVuZHthbGlnbip9DQokJA0KDQoqKkNyaXRpY2FsIFZhbHVlIDk1JSoqDQoNClVudHVrIDk1JSBjb25maWRlbmNlIGxldmVsOiAkWl97XGFscGhhLzJ9ID0gMS45NiQNCg0KKipNYXJnaW4gb2YgRXJyb3IqKg0KJCQgTUUgPSBaX3tcYWxwaGEvMn0gw5cgU0UgPSAxLjk2IMOXIDAuMDI0NCBcYXBwcm94IDAuMDQ3OCQkDQoNCioqQ0kgOTUlKioNCiQkXGhhdHtwfVwgXHBtXCBNRSQkDQokJDAuMzlcIFxwbVwgMC4wNDc4JCQNCiQke1xhcHByb3hcICgwLjM0MjIsIDAuNDM3OCl9JCQNCjwvZGl2Pg0KIyMgQ29uZmlkZW5jZSBJbnRlcnZhbCA5OSUNCjxkaXYgY2xhc3M9InBhc3RlbC1ibHVlLWJveCI+DQoqKlN0YW5kYXJkIEVycm9yKioNCiQkDQpcYmVnaW57YWxpZ24qfQ0KU0Vfe1xoYXR7cH19ICY9IFxzcXJ0e1xmcmFje1xoYXR7cH0oMS1caGF0e3B9KX17bn19IFxcDQomPSBcc3FydHtcZnJhY3swLjM5KDEtMC4zOSl9ezQwMH19IFxcDQomPSBcc3FydHtcZnJhY3swLjM5IFxjZG90IDAuNjF9ezQwMH19IFxcDQomXGFwcHJveCAwLjAyNDQNClxlbmR7YWxpZ24qfQ0KJCQNCg0KKipDcml0aWNhbCBWYWx1ZSA5OSUqKg0KDQpVbnR1ayA5OSUgY29uZmlkZW5jZSBsZXZlbDogJFpfe1xhbHBoYS8yfSA9IDIuNTgkDQoNCioqTWFyZ2luIG9mIEVycm9yKioNCiQkIE1FID0gWl97XGFscGhhLzJ9IMOXIFNFID0gMi41OCDDlyAwLjAyNDQgXGFwcHJveCAwLjA2MjkkJA0KDQoqKkNJIDklKioNCiQkXGhhdHtwfVwgXHBtXCBNRSQkDQokJDAuMzlcIFxwbVwgMC4wNjI5JCQNCiQke1xhcHByb3hcICgwLjMyNzEsIDAuNDUyOSl9JCQNCjwvZGl2Pg0KDQojIyBWaXN1YWxpemF0aW9uDQo8ZGl2IGNsYXNzPSJwYXN0ZWwtYmx1ZS1ib3giPg0KYGBge3IsIG1lc3NhZ2U9RkFMU0Usd2FybmluZz1GQUxTRSwgZWNobz1GQUxTRX0NCiMgTG9hZCBwYWNrYWdlcw0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShwbG90bHkpDQoNCiMgUGFyYW1ldGVyDQpwX2hhdCA8LSAwLjM5DQpuIDwtIDQwMA0KU0UgPC0gc3FydChwX2hhdCAqICgxIC0gcF9oYXQpIC8gbikNCg0KIyBDb25maWRlbmNlIGxldmVscw0KY29uZl9sZXZlbHMgPC0gYygwLjkwLCAwLjk1LCAwLjk5KQ0Kel92YWx1ZXMgPC0gYygxLjY0NSwgMS45NiwgMi41NzYpICAjIHoga3JpdGlzIHVudHVrIENJDQoNCiMgQ0kgZGF0YSBmcmFtZQ0KY2lfbG93ZXIgPC0gcF9oYXQgLSB6X3ZhbHVlcyAqIFNFDQpjaV91cHBlciA8LSBwX2hhdCArIHpfdmFsdWVzICogU0UNCg0KY2lfZGF0YSA8LSBkYXRhLmZyYW1lKA0KICBsZXZlbCA9IGMoIjkwJSBDSSIsICI5NSUgQ0kiLCAiOTklIENJIiksDQogIGxvd2VyID0gY2lfbG93ZXIsDQogIHVwcGVyID0gY2lfdXBwZXIsDQogIGNvbG9yID0gYygiI0E4RTZDRiIsICIjRkY5QUEyIiwgIiNGRkY1QTUiKQ0KKQ0KDQojIFggdmFsdWVzIGZvciBub3JtYWwgYXBwcm94aW1hdGlvbiBvZiBwcm9wb3J0aW9uDQp4X3ZhbHMgPC0gc2VxKHBfaGF0IC0gNCpTRSwgcF9oYXQgKyA0KlNFLCBsZW5ndGgub3V0ID0gMTAwMCkNCnlfdmFscyA8LSBkbm9ybSh4X3ZhbHMsIG1lYW4gPSBwX2hhdCwgc2QgPSBTRSkNCg0KcHJvcF9kZiA8LSBkYXRhLmZyYW1lKHggPSB4X3ZhbHMsIHkgPSB5X3ZhbHMpDQoNCiMgUGxvdA0KcCA8LSBnZ3Bsb3QocHJvcF9kZiwgYWVzKHgsIHkpKSArDQogIGdlb21fYXJlYShmaWxsID0gIiNDQkEwREMiLCBhbHBoYSA9IDAuOCkgKw0KICBnZW9tX2xpbmUoY29sb3IgPSAiYmxhY2siLCBsaW5ld2lkdGggPSAxLjIpICsNCiAgDQogICMgTWVhbiBsaW5lDQogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IHBfaGF0LCBsaW5ldHlwZSA9ICJkYXNoZWQiLCBsaW5ld2lkdGggPSAwLjcpICsNCiAgYW5ub3RhdGUoInRleHQiLA0KICAgICAgICAgICB4ID0gcF9oYXQsDQogICAgICAgICAgIHkgPSBtYXgoeV92YWxzKSAqIDEuMDUsDQogICAgICAgICAgIGxhYmVsID0gcGFzdGUwKCJwzIIgPSAiLCBwX2hhdCksDQogICAgICAgICAgIHNpemUgPSA0LA0KICAgICAgICAgICBmb250ZmFjZSA9ICJib2xkIikgKw0KICANCiAgIyBDSSBsaW5lcyAoZG90dGVkKQ0KICBnZW9tX3ZsaW5lKGRhdGEgPSBjaV9kYXRhLA0KICAgICAgICAgICAgIGFlcyh4aW50ZXJjZXB0ID0gbG93ZXIsIGNvbG9yID0gbGV2ZWwpLA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRvdHRlZCIsDQogICAgICAgICAgICAgbGluZXdpZHRoID0gMSkgKw0KICBnZW9tX3ZsaW5lKGRhdGEgPSBjaV9kYXRhLA0KICAgICAgICAgICAgIGFlcyh4aW50ZXJjZXB0ID0gdXBwZXIsIGNvbG9yID0gbGV2ZWwpLA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRvdHRlZCIsDQogICAgICAgICAgICAgbGluZXdpZHRoID0gMSkgKw0KICANCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGNpX2RhdGEkY29sb3IpICsNCiAgbGFicygNCiAgICB0aXRsZSA9ICJDb25maWRlbmNlIEludGVydmFscyBmb3IgU2FtcGxlIFByb3BvcnRpb24iLA0KICAgIHggPSAiU2FtcGxlIFByb3BvcnRpb24iLA0KICAgIHkgPSAiUHJvYmFiaWxpdHkgRGVuc2l0eSIsDQogICAgY29sb3IgPSAiSW50ZXJ2YWwiDQogICkgKw0KICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAuMywgMC41LCAwLjAyKSwgDQogICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKDAuMywgMC41KSkgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gZXhwYW5zaW9uKG11bHQgPSBjKDAsIDAuMjApKSkgKw0KICANCiAgdGhlbWVfbWluaW1hbChiYXNlX3NpemUgPSAxMykgKw0KICB0aGVtZSgNCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIsIHNpemUgPSAxNSwgaGp1c3QgPSAwLjUpLA0KICAgIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCksDQogICAgcGFuZWwuZ3JpZC5tYWpvci55ID0gZWxlbWVudF9saW5lKGNvbG9yID0gImdyYXk5MCIpLA0KICAgIGF4aXMubGluZS54ID0gZWxlbWVudF9saW5lKGNvbG9yID0gImdyYXkzMCIpLA0KICAgIHBsb3QubWFyZ2luID0gbWFyZ2luKDEwLCAxMCwgMTAsIDEwKQ0KICApDQoNCiMgSW50ZXJha3RpZg0KZ2dwbG90bHkocCkNCg0KYGBgDQoNCioqSW50ZXJwcmV0YXRpb24qKg0KDQpEaWFncmFtIGluaSBtZW5nZ2FtYmFya2FuIGRpc3RyaWJ1c2kgc2FtcGxpbmcgcHJvcG9yc2kgc2FtcGVsICRcaGF0IHAkIHlhbmcgbWVuZGVrYXRpIG5vcm1hbCwgZGVuZ2FuIG5pbGFpIHRpdGlrIHRlbmdhaCAkXGhhdCBwID0gMHssfTM5JCBzZWJhZ2FpIGVzdGltYXNpIHByb3BvcnNpIHBvcHVsYXNpLCBsYWx1IGRpIGtpcmnigJNrYW5hbm55YSBkaWdhbWJhciBiZWJlcmFwYSBwYXNhbmcgZ2FyaXMgdmVydGlrYWwgYmVyd2FybmEgeWFuZyBtZW51bmp1a2thbiBiYXRhcyBiYXdhaCBkYW4gYXRhcyBpbnRlcnZhbCBrZXBlcmNheWFhbiA5MCUsIDk1JSwgZGFuIDk5JSB1bnR1ayBwcm9wb3JzaSBwb3B1bGFzaSwgZGkgbWFuYSBzZW1ha2luIHRpbmdnaSB0aW5na2F0IGtlcGVyY2F5YWFuIG1ha2EgaW50ZXJ2YWwgc2VtYWtpbiBsZWJhciBrYXJlbmEgaGFydXMg4oCcbWVuYW5na2Fw4oCdIG5pbGFpIHByb3BvcnNpIHBvcHVsYXNpIHNlYmVuYXJueWEgZGVuZ2FuIHByb2JhYmlsaXRhcyB5YW5nIGxlYmloIGJlc2FyLCBzZWhpbmdnYSBzZWNhcmEgaW50ZXJwcmV0YXNpIGppa2EgcGVuZ2FtYmlsYW4gc2FtcGVsIGRpdWxhbmcgYmVya2FsaeKAkWthbGkgZGFuIHNldGlhcCBrYWxpIGRpaGl0dW5nIGludGVydmFsIGtlcGVyY2F5YWFuIChtaXNhbG55YSA5NSUpIHNlcGVydGkgcGFkYSBnYW1iYXIsIG1ha2Ega2lyYeKAkWtpcmEgOTUlIGRhcmkgaW50ZXJ2YWzigJFpbnRlcnZhbCB0ZXJzZWJ1dCBha2FuIG1lbmdhbmR1bmcgcHJvcG9yc2kgcG9wdWxhc2kgc2ViZW5hcm55YSwgZGFuIGRpYWdyYW0gaW5pIG1lbXZpc3VhbGlzYXNpa2FuIGtvbnNlcCB0ZXJzZWJ1dCBkYWxhbSBiZW50dWsga3VydmEgbm9ybWFsIGRhbiBnYXJpcyBiYXRhcyBpbnRlcnZhbCBkaSBzZWtpdGFyICRcaGF0IHAkLg0KPC9kaXY+DQoNCiMjIENvbmZpZGVuY2UgTGV2ZWwgQWZmZWN0cw0KPGRpdiBjbGFzcz0icGFzdGVsLWJsdWUtYm94Ij4NCkRhbGFtIGVrc3BlcmltZW4gcHJvZHVrLCB0aW5na2F0IGtlcGVyY2F5YWFuIG1lbmVudHVrYW4gc2ViZXJhcGEgeWFraW4gdGltIHRlcmhhZGFwIGVmZWsgcGVydWJhaGFuIHNlYmVsdW0gbWVtYnVhdCBrZXB1dHVzYW47IHRpbmdrYXQga2VwZXJjYXlhYW4gdGluZ2dpIChtaXNhbG55YSA5OSUpIG1lbWJ1YXQgaW50ZXJ2YWwgZXN0aW1hc2kgbGViaWggbGViYXIgZGFuIG1lbnVudHV0IGJ1a3RpIHlhbmcgbGViaWgga3VhdCBzZWhpbmdnYSBtZW5ndXJhbmdpIHJpc2lrbyBzYWxhaCBtZW1pbGloIHZhcmlhbiBuYW11biBtZW1idXR1aGthbiBzYW1wZWwgbGViaWggYmVzYXIsIHdha3R1IGxlYmloIGxhbWEsIGRhbiBzZXJpbmcga2FsaSBtZW51bmRhIHBlbHVuY3VyYW4gZml0dXIsIHNlZGFuZ2thbiB0aW5na2F0IGtlcGVyY2F5YWFuIGxlYmloIHJlbmRhaCAobWlzYWxueWEgOTAlKSBtZW5naGFzaWxrYW4gaW50ZXJ2YWwgc2VtcGl0IGRhbiBrZXB1dHVzYW4geWFuZyBsZWJpaCBjZXBhdCBkZW5nYW4gYmlheWEgZGF0YSBsZWJpaCBrZWNpbCwgdGV0YXBpIG1lbmluZ2thdGthbiByaXNpa28gYmFod2EgaGFzaWwgeWFuZyBkaWFuZ2dhcCDigJxtZW5hbmfigJ0gc2ViZW5hcm55YSBoYW55YSBrZWJldHVsYW4sIHNlaGluZ2dhIHBlbWlsaWhhbiA5MCUsIDk1JSwgYXRhdSA5OSUgaGFydXMgZGlzZXN1YWlrYW4gZGVuZ2FuIHByb2ZpbCByaXNpa28gYmlzbmlzIGRhbiBkYW1wYWsga2VwdXR1c2FuIHRlcmhhZGFwIHBlbmdndW5hIG1hdXB1biBzdW1iZXIgZGF5YSBwZXJ1c2FoYWFuLg0KPC9kaXY+DQoNCg0KIyBDYXNlIFN0dWR5IDQNCjxkaXYgY2xhc3M9InBhc3RlbC1ncmVlbi1ib3giPg0KKipQcmVjaXNpb24gQ29tcGFyaXNvbiAoWi1UZXN0IHZzIHQtVGVzdCk6KioNCg0KVHdvIGRhdGEgdGVhbXMgbWVhc3VyZSBBUEkgbGF0ZW5jeSAoaW4gbWlsbGlzZWNvbmRzKSB1bmRlciBkaWZmZXJlbnQgY29uZGl0aW9ucy4NCg0KVGVhbSBBOg0KJCRuID0gMzYkJA0KJCRcYmFye3h9ID0gMjEwJCQNCiQkXHNpZ21hID0gMjQkJA0KDQpUZWFtIEI6DQokJG4gPSAzNiQkDQokJFxiYXJ7eH0gPSAyMTAkJA0KJCRcc2lnbWEgPSAyNCQkDQoNCioqVGFza3M6KioNCg0KMS4gSWRlbnRpZnkgdGhlIHN0YXRpc3RpY2FsIHRlc3QgdXNlZCBieSBlYWNoIHRlYW0uDQoNCjIuIENvbXB1dGUgQ29uZmlkZW5jZSBJbnRlcnZhbHMgZm9yIDkwJSwgOTUlLCBhbmQgOTklLg0KDQozLiBDcmVhdGUgYSB2aXN1YWxpemF0aW9uIGNvbXBhcmluZyBhbGwgaW50ZXJ2YWxzLg0KDQo0LiBFeHBsYWluIHdoeSB0aGUgaW50ZXJ2YWwgd2lkdGhzIGRpZmZlciwgZXZlbiB3aXRoIHNpbWlsYXIgZGF0YS4NCjwvZGl2Pg0KDQojIyBVamkgU3RhdGlzdGlrDQo8ZGl2IGNsYXNzPSJwYXN0ZWwtZ3JlZW4tYm94Ij4NClBhZGEgbm9tb3IgMSwgaWRlbnRpZmlrYXNpIHVqaSBzdGF0aXN0aWsgZGlkYXNhcmthbiBwYWRhIGFwYWthaCAqKnN0YW5kYXIgZGV2aWFzaSBwb3B1bGFzaSBkaWtldGFodWkgYXRhdSB0aWRhayoqLiBUaW0gQSBtZW5nZXRhaHVpIHN0YW5kYXIgZGV2aWFzaSBwb3B1bGFzaSAoz4MgPSAyNCksIHNlaGluZ2dhIG1lcmVrYSBtZW5nZ3VuYWthbiAqKlotdGVzdCoqIGF0YXUgWi1pbnRlcnZhbCB1bnR1ayBtZW5naGl0dW5nIGNvbmZpZGVuY2UgaW50ZXJ2YWwga2FyZW5hIGRpc3RyaWJ1c2kgc2FtcGxpbmcgZGFyaSBtZWFuIGJpc2EgZGlhbmdnYXAgbm9ybWFsLiBTZWJhbGlrbnlhLCBUaW0gQiBoYW55YSBtZW1pbGlraSBzdGFuZGFyIGRldmlhc2kgc2FtcGVsIChzID0gMjQpLCBzZWhpbmdnYSBtZXJla2EgaGFydXMgbWVuZ2d1bmFrYW4gKip0LXRlc3QqKiBhdGF1IHQtaW50ZXJ2YWwsIHlhbmcgbWVtcGVyaGl0dW5na2FuIGtldGlkYWtwYXN0aWFuIHRhbWJhaGFuIGRhcmkgcGVuZ2d1bmFhbiBzYW1wZWwgdW50dWsgbWVtcGVya2lyYWthbiDPgy4gRGVuZ2FuIGRlbWlraWFuLCBwZXJiZWRhYW4gdXRhbWEgZGFsYW0gcGVtaWxpaGFuIHVqaSBhZGFsYWggdGluZ2thdCBpbmZvcm1hc2kgdGVudGFuZyB2YXJpYWJpbGl0YXMgZGF0YTogWiB1bnR1ayDPgyBkaWtldGFodWksIHQgdW50dWsgz4MgdGlkYWsgZGlrZXRhaHVpLg0KPC9kaXY+DQoNCiMjIFRlYW0gQSANCiMjIyBDb25maWRlbmNlIEludGVydmFsIDkwJQ0KPGRpdiBjbGFzcz0icGFzdGVsLWdyZWVuLWJveCI+DQoqKlNhbXBsZSBTaXplKioNCiQke259ID0gMzYkJA0KDQoqKlN0YW5kYXIgRGV2aWF0aW9uKioNCiQke8+DfSA9IDI0JCQNCg0KKipTYW1wbGUgTWVhbioqDQokJFxiYXJ7eH0gPSAyMTAkJA0KDQoqKkNvbmZpZGVuY2UgTGV2ZWwgOTAlKioNCiQkMSAtIDAuOSA9IFxmcmFjezAuMX17Mn0gPSAwLjA1IOKJiCAxLjY1JCQNCg0KKipTdGFuZGFyZCBFcnJvcioqDQoNCiQkU0UgPSBcZnJhY3tcc2lnbWF9e1xzcXJ0e259fSQkDQokJFxmcmFjezI0fXtcc3FydHszNn19ID0gNCQkDQoNCioqTWFyZ2luIG9mIEVycm9yKioNCg0KJCRNRSA9IHpfe1xhbHBoYS8yfVwgw5cgU0UkJCANCiQkezEuNjV9XCDDlyA0XCB7XGFwcHJveHs2LjZ9fSQkDQoNCioqQ0kgOTAlKioNCg0KJCRcYmFye3h9XCBccG1cIE1FJCQNCiQkMjEwXCBccG1cIDYuNiQkDQokJHtcYXBwcm94XCAoMjAzLjQsIDIxNi42KX0kJA0KPC9kaXY+DQoNCiMjIyBDb25maWRlbmNlIEludGVydmFsIDk1JQ0KPGRpdiBjbGFzcz0icGFzdGVsLWdyZWVuLWJveCI+DQoqKlNhbXBsZSBTaXplKioNCiQke259ID0gMzYkJA0KDQoqKlN0YW5kYXIgRGV2aWF0aW9uKioNCiQke8+DfSA9IDI0JCQNCg0KKipTYW1wbGUgTWVhbioqDQokJFxiYXJ7eH0gPSAyMTAkJA0KDQoqKkNvbmZpZGVuY2UgTGV2ZWwgOTUlKioNCiQkMSAtIDAuOTUgPSBcZnJhY3swLjA1fXsyfSA9IDAuMDI1IOKJiCAxLjk2JCQNCg0KKipTdGFuZGFyZCBFcnJvcioqDQoNCiQkU0UgPSBcZnJhY3tcc2lnbWF9e1xzcXJ0e259fSQkDQokJFxmcmFjezI0fXtcc3FydHszNn19ID0gNCQkDQoNCioqTWFyZ2luIG9mIEVycm9yKioNCg0KJCRNRSA9IHpfe1xhbHBoYS8yfVwgw5cgU0UkJCANCiQkezEuOTZ9XCDDlyA0XCB7XGFwcHJveHs3Ljg0fX0kJA0KDQoqKkNJIDk1JSoqDQoNCiQkXGJhcnt4fVwgXHBtXCBNRSQkDQokJDIxMFwgXHBtXCA3Ljg0JCQNCiQke1xhcHByb3hcICgyMDIuMTYsIDIxNy44NCl9JCQNCjwvZGl2Pg0KDQojIyMgQ29uZmlkZW5jZSBJbnRlcnZhbCA5OSUNCjxkaXYgY2xhc3M9InBhc3RlbC1ncmVlbi1ib3giPg0KKipTYW1wbGUgU2l6ZSoqDQokJHtufSA9IDM2JCQNCg0KKipTdGFuZGFyIERldmlhdGlvbioqDQokJHvPg30gPSAyNCQkDQoNCioqU2FtcGxlIE1lYW4qKg0KJCRcYmFye3h9ID0gMjEwJCQNCg0KKipDb25maWRlbmNlIExldmVsIDk5JSoqDQokJDEgLSAwLjk5ID0gXGZyYWN7MC4wMX17Mn0gPSAwLjAwNSDiiYggMi41OCQkDQoNCioqU3RhbmRhcmQgRXJyb3IqKg0KDQokJFNFID0gXGZyYWN7XHNpZ21hfXtcc3FydHtufX0kJA0KJCRcZnJhY3syNH17XHNxcnR7MzZ9fSA9IDQkJA0KDQoqKk1hcmdpbiBvZiBFcnJvcioqDQoNCiQkTUUgPSB6X3tcYWxwaGEvMn1cIMOXIFNFJCQgDQokJHsyLjU4fVwgw5cgNFwge1xhcHByb3h7MTAuMzJ9fSQkDQoNCioqQ0kgOTklKioNCg0KJCRcYmFye3h9XCBccG1cIE1FJCQNCiQkMjEwXCBccG1cIDEwLjMyJCQNCiQke1xhcHByb3hcICgxOTkuNjgsIDIyMC4zMil9JCQNCjwvZGl2Pg0KDQojIyBUZWFtIEINCiMjIyBDb25maWRlbmNlIEludGVydmFsIDkwJQ0KPGRpdiBjbGFzcz0icGFzdGVsLWdyZWVuLWJveCI+DQoqKlJ1bXVzKioNCiQkQ0kgPSBcYmFye3h9IFxwbQ0KIHRfe1xhbHBoYS8yLFwsZGZ9XCxcZnJhY3tzfXtcc3FydHtufX0kJA0KDQoqKlNhbXBsZSBTaXplKioNCiQke259ID0gMzYkJA0KDQoqKlNhbXBsZSBTdGFuZGFyIERldmlhdGlvbioqDQokJHtzfSA9IDI0JCQNCioqZGYqKg0KJCRkZiA9IG4gLTEgPSAzNiAtIDEgPSAzNSQkDQoNCioqU2FtcGxlIE1lYW4qKg0KJCRcYmFye3h9ID0gMjEwJCQNCg0KKipDcml0aWNhbCBWYWx1ZSA5MCUqKg0KJCQxIC0gMC45ID0gXGZyYWN7MC4xfXsyfSA9IDAuMDUg4omIIDEuNjkwJCQNCg0KKipTdGFuZGFyZCBFcnJvcioqDQoNCiQkU0UgPSBcZnJhY3tzfXtcc3FydHtufX0kJA0KJCRcZnJhY3syNH17XHNxcnR7MzZ9fSA9IDQkJA0KDQoqKk1hcmdpbiBvZiBFcnJvcioqDQoNCiQkTUUgPSB0X3tcYWxwaGEvMiAsIGRmfVwgw5cgU0UkJCANCiQkezEuNjkwfVwgw5cgNFwge1xhcHByb3h7Ni43Nn19JCQNCg0KKipDSSA5MCUqKg0KDQokJFxiYXJ7eH1cIFxwbVwgTUUkJA0KJCQyMTBcIFxwbVwgNi43NiQkDQokJHtcYXBwcm94XCAoMjAzLjI0LCAyMTYuNzYpfSQkDQo8L2Rpdj4NCg0KIyMjIENvbmZpZGVuY2UgSW50ZXJ2YWwgOTUlDQo8ZGl2IGNsYXNzPSJwYXN0ZWwtZ3JlZW4tYm94Ij4NCioqUnVtdXMqKg0KJCRDSSA9IFxiYXJ7eH0gXHBtDQogdF97XGFscGhhLzIsXCxkZn1cLFxmcmFje3N9e1xzcXJ0e259fSQkDQogDQoqKlNhbXBsZSBTaXplKioNCiQke259ID0gMzYkJA0KDQoqKlNhbXBsZSBTdGFuZGFyIERldmlhdGlvbioqDQokJHtzfSA9IDI0JCQNCg0KKipTYW1wbGUgTWVhbioqDQokJFxiYXJ7eH0gPSAyMTAkJA0KDQoqKmRmKioNCiQkZGYgPSBuIC0gMSA9IDM1JCQNCg0KKipDcml0aWNhbCBWYWx1ZSA5NSUqKg0KJCQxIC0gMC45NSA9IFxmcmFjezAuMDV9ezJ9ID0gMC4wMjUg4omIIDIuMDMwJCQNCg0KKipTdGFuZGFyZCBFcnJvcioqDQoNCiQkU0UgPSBcZnJhY3tzfXtcc3FydHtufX0kJA0KJCRcZnJhY3syNH17XHNxcnR7MzZ9fSA9IDQkJA0KDQoqKk1hcmdpbiBvZiBFcnJvcioqDQoNCiQkTUUgPSB6X3tcYWxwaGEvMn1cIMOXIFNFJCQgDQokJHsyLjAzMH1cIMOXIDRcIHtcYXBwcm94ezguMTJ9fSQkDQoNCioqQ0kgOTUlKioNCg0KJCRcYmFye3h9XCBccG1cIE1FJCQNCiQkMjEwXCBccG1cIDguMTIkJA0KJCR7XGFwcHJveFwgKDIwMS44OCwgMjE4LjEyKX0kJA0KPC9kaXY+DQoNCiMjIyBDb25maWRlbmNlIEludGVydmFsIDk5JQ0KPGRpdiBjbGFzcz0icGFzdGVsLWdyZWVuLWJveCI+DQoqKlJ1bXVzKioNCiQkQ0kgPSBcYmFye3h9IFxwbQ0KIHRfe1xhbHBoYS8yLFwsZGZ9XCxcZnJhY3tzfXtcc3FydHtufX0kJA0KIA0KKipTYW1wbGUgU2l6ZSoqDQokJHtufSA9IDM2JCQNCg0KKipTYW1wbGUgU3RhbmRhciBEZXZpYXRpb24qKg0KJCR7c30gPSAyNCQkDQoNCioqU2FtcGxlIE1lYW4qKg0KJCRcYmFye3h9ID0gMjEwJCQNCg0KKipkZioqDQokJGRmID0gbiAtIDEgPSAzNSQkDQoNCioqQ3JpdGljYWwgVmFsdWUgOTklKioNCiQkMSAtIDAuOTkgPSBcZnJhY3swLjAxfXsyfSA9IDAuMDA1IOKJiCAyLjcyNCQkDQoNCioqU3RhbmRhcmQgRXJyb3IqKg0KDQokJFNFID0gXGZyYWN7c317XHNxcnR7bn19JCQNCiQkXGZyYWN7MjR9e1xzcXJ0ezM2fX0gPSA0JCQNCg0KKipNYXJnaW4gb2YgRXJyb3IqKg0KDQokJE1FID0gel97XGFscGhhLzJ9XCDDlyBTRSQkIA0KJCR7Mi43MjR9XCDDlyA0XCB7XGFwcHJveHsxMC45MH19JCQNCg0KKipDSSA5OSUqKg0KDQokJFxiYXJ7eH1cIFxwbVwgTUUkJA0KJCQyMTBcIFxwbVwgMTAuOTAkJA0KJCR7XGFwcHJveFwgKDE5OS4xMCwgMjIwLjkwKX0kJA0KPC9kaXY+DQoNCiMjIFZpc3VhbGl6YXRpb24NCiMjIyBUZWFtIEENCjxkaXYgY2xhc3M9InBhc3RlbC1ncmVlbi1ib3giPg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGVjaG89RkFMU0V9DQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KHBsb3RseSkNCg0KbWVhbl94IDwtIDIxMA0Kc2lnbWEgPC0gMjQNCm4gPC0gMzYNCnNlIDwtIHNpZ21hIC8gc3FydChuKQ0KDQojIENvbmZpZGVuY2UgbGV2ZWxzIChaKQ0Kel92YWx1ZXMgPC0gYygxLjY0NSwgMS45NiwgMi41NzYpDQoNCmNpX2xvd2VyIDwtIG1lYW5feCAtIHpfdmFsdWVzICogc2UNCmNpX3VwcGVyIDwtIG1lYW5feCArIHpfdmFsdWVzICogc2UNCg0KY2lfZGF0YSA8LSBkYXRhLmZyYW1lKA0KICBsZXZlbCA9IGMoIjkwJSBDSSIsICI5NSUgQ0kiLCAiOTklIENJIiksDQogIGxvd2VyID0gY2lfbG93ZXIsDQogIHVwcGVyID0gY2lfdXBwZXIsDQogIGNvbG9yID0gYygiI0ZGOUFBMiIsICIjQThFNkNGIiwgIiNDQkEwREMiKQ0KKQ0KDQojIERlbnNpdHkgZGF0YQ0KeF92YWxzIDwtIHNlcShtZWFuX3ggLSA0KnNlLCBtZWFuX3ggKyA0KnNlLCBsZW5ndGgub3V0ID0gMTAwMCkNCnlfdmFscyA8LSBkbm9ybSh4X3ZhbHMsIG1lYW5feCwgc2UpDQoNCm5vcm1hbF9kZiA8LSBkYXRhLmZyYW1lKHggPSB4X3ZhbHMsIHkgPSB5X3ZhbHMpDQoNCiMgUGxvdA0KcF9BIDwtIGdncGxvdChub3JtYWxfZGYsIGFlcyh4LCB5KSkgKw0KICBnZW9tX2FyZWEoZmlsbCA9ICIjQTBDNEZGIiwgYWxwaGEgPSAwLjgpICsNCiAgZ2VvbV9saW5lKGNvbG9yID0gImJsYWNrIiwgbGluZXdpZHRoID0gMS4yKSArDQogIA0KICAjIE1lYW4NCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gbWVhbl94LCBsaW5ldHlwZSA9ICJkYXNoZWQiLCBsaW5ld2lkdGggPSAxKSArDQogIGFubm90YXRlKA0KICAgICJ0ZXh0IiwNCiAgICB4ID0gbWVhbl94LA0KICAgIHkgPSBtYXgoeV92YWxzKSAqIDEuMDUsDQogICAgbGFiZWwgPSAieMyEID0yMTAiLA0KICAgIHNpemUgPSA1LA0KICAgIGZvbnRmYWNlID0gImJvbGQiDQogICkgKw0KICANCiAgIyBDSSBsaW5lcw0KICBnZW9tX3ZsaW5lKGRhdGEgPSBjaV9kYXRhLA0KICAgICAgICAgICAgIGFlcyh4aW50ZXJjZXB0ID0gbG93ZXIsIGNvbG9yID0gbGV2ZWwpLA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRvdHRlZCIsIGxpbmV3aWR0aCA9IDEpICsNCiAgZ2VvbV92bGluZShkYXRhID0gY2lfZGF0YSwNCiAgICAgICAgICAgICBhZXMoeGludGVyY2VwdCA9IHVwcGVyLCBjb2xvciA9IGxldmVsKSwNCiAgICAgICAgICAgICBsaW5ldHlwZSA9ICJkb3R0ZWQiLCBsaW5ld2lkdGggPSAxKSArDQogIA0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gY2lfZGF0YSRjb2xvcikgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIlRlYW0gQSDigJMgQ29uZmlkZW5jZSBJbnRlcnZhbHMgKFotZGlzdHJpYnV0aW9uKSIsDQogICAgeCA9ICJBUEkgTGF0ZW5jeSAobXMpIiwNCiAgICB5ID0gIlByb2JhYmlsaXR5IERlbnNpdHkiLA0KICAgIGNvbG9yID0gIkludGVydmFsIg0KICApICsNCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgxOTUsIDIzNSwgNSksIGxpbWl0cyA9IGMoMTk0LDI0MCkpKw0KICBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gZXhwYW5zaW9uKG11bHQgPSBjKDAsIDAuMTUpKSkgKw0KICB0aGVtZV9taW5pbWFsKGJhc2Vfc2l6ZSA9IDEzKSArDQogIHRoZW1lKA0KICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiwgaGp1c3QgPSAwLjUpLA0KICAgIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkNCiAgKQ0KDQojIEludGVyYWt0aWYNCmdncGxvdGx5KHBfQSkNCg0KYGBgDQo8L2Rpdj4NCg0KIyMjIFRlYW0gQg0KPGRpdiBjbGFzcz0icGFzdGVsLWdyZWVuLWJveCI+DQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSxlY2hvPUZBTFNFfQ0KbWVhbl94IDwtIDIxMA0KcyA8LSAyNA0KbiA8LSAzNg0KZGYgPC0gbiAtIDENCnNlIDwtIHMgLyBzcXJ0KG4pDQoNCiMgQ29uZmlkZW5jZSBsZXZlbHMgKHQpDQp0X3ZhbHVlcyA8LSBjKDEuNjkwLCAyLjAzMCwgMi43MjQpDQoNCmNpX2xvd2VyIDwtIG1lYW5feCAtIHRfdmFsdWVzICogc2UNCmNpX3VwcGVyIDwtIG1lYW5feCArIHRfdmFsdWVzICogc2UNCg0KY2lfZGF0YSA8LSBkYXRhLmZyYW1lKA0KICBsZXZlbCA9IGMoIjkwJSBDSSIsICI5NSUgQ0kiLCAiOTklIENJIiksDQogIGxvd2VyID0gY2lfbG93ZXIsDQogIHVwcGVyID0gY2lfdXBwZXIsDQogIGNvbG9yID0gYygicGluayIsICIjQTBDNEZGIiwgIiNBOEU2Q0YiKQ0KKQ0KDQojIERlbnNpdHkgZGF0YSAodCBkaXN0cmlidXRpb24pDQp4X3ZhbHMgPC0gc2VxKG1lYW5feCAtIDQqc2UsIG1lYW5feCArIDQqc2UsIGxlbmd0aC5vdXQgPSAxMDAwKQ0KeV92YWxzIDwtIGR0KCh4X3ZhbHMgLSBtZWFuX3gpIC8gc2UsIGRmID0gZGYpIC8gc2UNCg0KdF9kZiA8LSBkYXRhLmZyYW1lKHggPSB4X3ZhbHMsIHkgPSB5X3ZhbHMpDQoNCiMgUGxvdA0KcF9CIDwtIGdncGxvdCh0X2RmLCBhZXMoeCwgeSkpICsNCiAgZ2VvbV9hcmVhKGZpbGwgPSAiI0ZGRDZBNSIsIGFscGhhID0gMC44KSArDQogIGdlb21fbGluZShjb2xvciA9ICJibGFjayIsIGxpbmV3aWR0aCA9IDEuMikgKw0KICANCiAgIyBNZWFuDQogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IG1lYW5feCwgbGluZXR5cGUgPSAiZGFzaGVkIiwgbGluZXdpZHRoID0gMSkgKw0KICBhbm5vdGF0ZSgNCiAgICAidGV4dCIsDQogICAgeCA9IG1lYW5feCwNCiAgICB5ID0gbWF4KHlfdmFscykgKiAxLjA1LA0KICAgIGxhYmVsID0gInjMhCA9IDIxMCIsDQogICAgc2l6ZSA9IDUsDQogICAgZm9udGZhY2UgPSAiYm9sZCINCiAgKSArDQogIA0KICAjIENJIGxpbmVzDQogIGdlb21fdmxpbmUoZGF0YSA9IGNpX2RhdGEsDQogICAgICAgICAgICAgYWVzKHhpbnRlcmNlcHQgPSBsb3dlciwgY29sb3IgPSBsZXZlbCksDQogICAgICAgICAgICAgbGluZXR5cGUgPSAiZG90dGVkIiwgbGluZXdpZHRoID0gMSkgKw0KICBnZW9tX3ZsaW5lKGRhdGEgPSBjaV9kYXRhLA0KICAgICAgICAgICAgIGFlcyh4aW50ZXJjZXB0ID0gdXBwZXIsIGNvbG9yID0gbGV2ZWwpLA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRvdHRlZCIsIGxpbmV3aWR0aCA9IDEpICsNCiAgDQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjaV9kYXRhJGNvbG9yKSArDQogIGxhYnMoDQogICAgdGl0bGUgPSAiVGVhbSBCIOKAkyBDb25maWRlbmNlIEludGVydmFscyAodC1kaXN0cmlidXRpb24pIiwNCiAgICB4ID0gIkFQSSBMYXRlbmN5IChtcykiLA0KICAgIHkgPSAiUHJvYmFiaWxpdHkgRGVuc2l0eSIsDQogICAgY29sb3IgPSAiSW50ZXJ2YWwiDQogICkgKw0KICAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgxOTUsIDIzNSwgNSksIGxpbWl0cyA9IGMoMTk0LDI0MCkpKw0KICBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gZXhwYW5zaW9uKG11bHQgPSBjKDAsIDAuMTUpKSkgKw0KICB0aGVtZV9taW5pbWFsKGJhc2Vfc2l6ZSA9IDEzKSArDQogIHRoZW1lKA0KICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiwgaGp1c3QgPSAwLjUpLA0KICAgIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkNCiAgKQ0KDQojIEludGVyYWt0aWYNCmdncGxvdGx5KHBfQikNCmBgYA0KPC9kaXY+DQoNCiMjIEludGVydmFsIFdpZHRocyBEaWZmZXINCjxkaXYgY2xhc3M9InBhc3RlbC1ncmVlbi1ib3giPg0KTWVza2lwdW4gVGVhbSBBIGRhbiBUZWFtIEIgbWVtaWxpa2kgKipyYXRhLXJhdGEgc2FtcGVsLCB1a3VyYW4gc2FtcGVsLCBkYW4gbmlsYWkgdmFyaWFzaSB5YW5nIHNhbWEqKiwgbGViYXIgKmNvbmZpZGVuY2UgaW50ZXJ2YWwqIChDSSkgeWFuZyBkaWhhc2lsa2FuIHRldGFwIGJlcmJlZGEga2FyZW5hICoqcGVyYmVkYWFuIGFzdW1zaSBzdGF0aXN0aWsgZGFuIGRpc3RyaWJ1c2kgeWFuZyBkaWd1bmFrYW4qKi4gVGVhbSBBIG1lbmdndW5ha2FuICoqZGlzdHJpYnVzaSBub3JtYWwgKFotZGlzdHJpYnV0aW9uKSoqIGthcmVuYSBzdGFuZGFyIGRldmlhc2kgcG9wdWxhc2kgKM+DKSBkaWtldGFodWksIHNlaGluZ2dhIGtldGlkYWtwYXN0aWFuIGhhbnlhIGJlcmFzYWwgZGFyaSB2YXJpYXNpIHNhbXBlbCBkYW4gbWVuZ2hhc2lsa2FuIGludGVydmFsIHlhbmcgcmVsYXRpZiAqKmxlYmloIHNlbXBpdCoqLiBTZWJhbGlrbnlhLCBUZWFtIEIgbWVuZ2d1bmFrYW4gKipkaXN0cmlidXNpIHQqKiBrYXJlbmEgc3RhbmRhciBkZXZpYXNpIHBvcHVsYXNpIHRpZGFrIGRpa2V0YWh1aSBkYW4gaGFydXMgZGllc3RpbWFzaSBkYXJpIHNhbXBlbCwgc2VoaW5nZ2EgdGVyZGFwYXQgKiprZXRpZGFrcGFzdGlhbiB0YW1iYWhhbioqIGRhbGFtIGVzdGltYXNpIHZhcmlhbnMuIERpc3RyaWJ1c2kgdCBtZW1pbGlraSAqKmVrb3IgeWFuZyBsZWJpaCB0ZWJhbCoqIGRpYmFuZGluZyBkaXN0cmlidXNpIG5vcm1hbCwgeWFuZyBtZW55ZWJhYmthbiBuaWxhaSBrcml0aXMgKHQpIGxlYmloIGJlc2FyIGRhcmlwYWRhIG5pbGFpIFogcGFkYSB0aW5na2F0IGtlcGVyY2F5YWFuIHlhbmcgc2FtYS4gQWtpYmF0bnlhLCAqY29uZmlkZW5jZSBpbnRlcnZhbCogVGVhbSBCIG1lbmphZGkgKipzZWRpa2l0IGxlYmloIGxlYmFyKiosIG1lc2tpcHVuIGRhdGEgZGFzYXJueWEgdGFtcGFrIHNlcnVwYS4NCjwvZGl2Pg0KDQoNCiMgQ2FzZSBTdHVkeSA1DQo8ZGl2IGNsYXNzPSJwYXN0ZWwtbWFyb29uLWJveCI+DQoqKk9uZS1TaWRlZCBDb25maWRlbmNlIEludGVydmFsOioqDQoNCkEgU29mdHdhcmUgYXMgYSBTZXJ2aWNlIChTYWFTKSBjb21wYW55IHdhbnRzIHRvIGVuc3VyZSB0aGF0IGF0IGxlYXN0IDcwJSBvZiB3ZWVrbHkgYWN0aXZlIHVzZXJzIHV0aWxpemUgYSBwcmVtaXVtIGZlYXR1cmUuDQoNCkZyb20gdGhlIGV4cGVyaW1lbnQ6DQoNCiQkbiA9IDI1MCQkDQokJHggPSAxODUkJA0KDQpNYW5hZ2VtZW50IGlzIG9ubHkgaW50ZXJlc3RlZCBpbiB0aGUgKipsb3dlciBib3VuZCoqIG9mIHRoZSBlc3RpbWF0ZS4NCg0KKipUYXNrczoqKg0KDQoxLiBJZGVudGlmeSB0aGUgdHlwZSBvZiBDb25maWRlbmNlIEludGVydmFsIGFuZCB0aGUgYXBwcm9wcmlhdGUgdGVzdC4NCg0KMi4gQ29tcHV0ZSB0aGUgb25lLXNpZGVkIGxvd2VyIENvbmZpZGVuY2UgSW50ZXJ2YWwgYXQ6DQogICAtIDkwJQ0KICAgLSA5NSUNCiAgIC0gOTklDQogICANCjMuIFZpc3VhbGl6ZSB0aGUgbG93ZXIgYm91bmRzIGZvciBhbGwgY29uZmlkZW5jZSBsZXZlbHMuDQoNCjQuIERldGVybWluZSB3aGV0aGVyIHRoZSA3MCUgdGFyZ2V0IGlzIHN0YXRpc3RpY2FsbHkgc2F0aXNmaWVkLg0KPC9kaXY+DQoNCiMjIFVqaSBTdGF0aXN0aWsNCjxkaXYgY2xhc3M9InBhc3RlbC1tYXJvb24tYm94Ij4NCkNvbmZpZGVuY2UgSW50ZXJ2YWwgc2F0dSBzaXNpIChsb3dlciBib3VuZCBvbmUtc2lkZWQgQ0kpIHVudHVrIHByb3BvcnNpIHBvcHVsYXNpLg0KDQpVamkgU3RhdGlzdGlrIHlhbmcgVGVwYXQ6DQpPbmUtc2FtcGxlIHByb3BvcnRpb24gei10ZXN0ICh1amkgeiBzYXR1IHNpc2kpDQprYXJlbmEgU2FtcGVsIGN1a3VwIGJlc2FyICjwnZGb8J2RnSBkYW4gICDwnZGbKDHiiJLwnZGdKT41LCBraXRhIG1lbmdlc3RpbWFzaSBwcm9wb3JzaSBwb3B1bGFzaSwgbWFuYWplbWVuIGhhbnlhIHBlZHVsaSBwYWRhIGJhdGFzIGJhd2FoIChhcGFrYWgg4omlIDcwJT8pLg0KPC9kaXY+DQoNCiMjIENvbmZpZGVuY2UgSW50ZXJ2YWwgOTAlDQo8ZGl2IGNsYXNzPSJwYXN0ZWwtbWFyb29uLWJveCI+DQoqKlNhbXBsZSBQcm9wb3J0aW9uKioNCiQkXGhhdCB7cH0gPSBcZnJhYyB7eH17bn0gPSBcZnJhYyB7MTg1fXsyNTB9ID0gMC43NCQkDQoqKlN0YW5kYXJkIEVycm9yKioNCiQkDQpcYmVnaW57YWxpZ24qfQ0KU0Vfe1xoYXR7cH19ICY9IFxzcXJ0e1xmcmFje1xoYXR7cH0oMS1caGF0e3B9KX17bn19IFxcDQomPSBcc3FydHtcZnJhY3swLjc0KDEtMC43NCl9ezI1MH19IFxcDQomXGFwcHJveCAwLjAyNzcNClxlbmR7YWxpZ24qfQ0KJCQNCg0KKipDcml0aWNhbCBWYWx1ZSA5MCUqKg0KDQpVbnR1ayA5MCUgY29uZmlkZW5jZSBsZXZlbDogJFpfeyAxIC1cYWxwaGF9ID0gMS4yOCQNCg0KKipNYXJnaW4gb2YgRXJyb3IqKg0KJCQgTUUgPSBaX3sxIC0gXGFscGhhfSDDlyBTRSA9IDEuMjggw5cgMC4wMjc3IFxhcHByb3ggMC4wMzU0JCQNCg0KKipDSSA5MCUqKg0KJCRDSSBfbG93ZXIgPSBcaGF0e3B9IC0gTUUkJA0KJCQwLjc0IC0gMC4wMzU0IFxhcHByb3ggMC43MDQ2JCQNCjwvZGl2Pg0KDQojIyBDb25maWRlbmNlIEludGVydmFsIDk1JQ0KPGRpdiBjbGFzcz0icGFzdGVsLW1hcm9vbi1ib3giPg0KKipTYW1wbGUgUHJvcG9ydGlvbioqDQokJFxoYXQge3B9ID0gXGZyYWMge3h9e259ID0gXGZyYWMgezE4NX17MjUwfSA9IDAuNzQkJA0KKipTdGFuZGFyZCBFcnJvcioqDQokJA0KXGJlZ2lue2FsaWduKn0NClNFX3tcaGF0e3B9fSAmPSBcc3FydHtcZnJhY3tcaGF0e3B9KDEtXGhhdHtwfSl9e259fSBcXA0KJj0gXHNxcnR7XGZyYWN7MC43NCgxLTAuNzQpfXsyNTB9fSBcXA0KJlxhcHByb3ggMC4wMjc3DQpcZW5ke2FsaWduKn0NCiQkDQoNCioqQ3JpdGljYWwgVmFsdWUgOTUlKioNCg0KVW50dWsgOTUlIGNvbmZpZGVuY2UgbGV2ZWw6ICRaX3sgMSAtXGFscGhhfSA9IDEuNjQ1JA0KDQoqKk1hcmdpbiBvZiBFcnJvcioqDQokJCBNRSA9IFpfezEgLSBcYWxwaGF9IMOXIFNFID0gMS42NDUgw5cgMC4wMjc3IFxhcHByb3ggMC4wNDU1JCQNCg0KKipDSSA5NSUqKg0KJCRDSSBfbG93ZXIgPSBcaGF0e3B9IC0gTUUkJA0KJCQwLjc0IC0gMC4wNDU1IFxhcHByb3ggMC42OTQ1JCQNCjwvZGl2Pg0KDQojIyBDb25maWRlbmNlIEludGVydmFsIDk5JQ0KPGRpdiBjbGFzcz0icGFzdGVsLW1hcm9vbi1ib3giPg0KKipTYW1wbGUgUHJvcG9ydGlvbioqDQokJFxoYXQge3B9ID0gXGZyYWMge3h9e259ID0gXGZyYWMgezE4NX17MjUwfSA9IDAuNzQkJA0KKipTdGFuZGFyZCBFcnJvcioqDQokJA0KXGJlZ2lue2FsaWduKn0NClNFX3tcaGF0e3B9fSAmPSBcc3FydHtcZnJhY3tcaGF0e3B9KDEtXGhhdHtwfSl9e259fSBcXA0KJj0gXHNxcnR7XGZyYWN7MC43NCgxLTAuNzQpfXsyNTB9fSBcXA0KJlxhcHByb3ggMC4wMjc3DQpcZW5ke2FsaWduKn0NCiQkDQoNCioqQ3JpdGljYWwgVmFsdWUgOTklKioNCg0KVW50dWsgOTklIGNvbmZpZGVuY2UgbGV2ZWw6ICRaX3sgMSAtXGFscGhhfSA9IDIuMzMkDQoNCioqTWFyZ2luIG9mIEVycm9yKioNCiQkIE1FID0gWl97MSAtIFxhbHBoYX0gw5cgU0UgPSAyLjMzIMOXIDAuMDI3NyBcYXBwcm94IDAuMDY0NSQkDQoNCioqQ0kgOTklKioNCiQkQ0kgX2xvd2VyID0gXGhhdHtwfSAtIE1FJCQNCiQkMC43NCAtIDAuMDY0NSBcYXBwcm94IDAuNjc1NSQkDQo8L2Rpdj4NCg0KIyMgVmlzdWFsaXphdGlvbg0KPGRpdiBjbGFzcz0icGFzdGVsLW1hcm9vbi1ib3giPg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGVjaG89RkFMU0V9DQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KHBsb3RseSkNCg0KIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCiMgUGFyYW1ldGVyIERhdGEgRWtzcGVyaW1lbg0KIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCm4gPC0gMjUwICAgICAgICAgICAgICAjIHRvdGFsIHVzZXJzDQp4IDwtIDE4NSAgICAgICAgICAgICAgIyBwcmVtaXVtIGFjdGl2ZSB1c2Vycw0KcF9oYXQgPC0geCAvIG4gICAgICAgICMgc2FtcGxlIHByb3BvcnRpb24NCg0KIyBTdGFuZGFyZCBFcnJvcg0Kc2UgPC0gc3FydChwX2hhdCAqICgxIC0gcF9oYXQpIC8gbikNCg0KIyBDb25maWRlbmNlIGxldmVscyAmIFogdmFsdWVzIChvbmUtc2lkZWQpDQpjaV9sZXZlbHMgPC0gYygiOTAlIiwgIjk1JSIsICI5OSUiKQ0Kel92YWx1ZXMgPC0gYygxLjI4MTYsIDEuNjQ0OSwgMi4zMjYzKQ0KDQojIExvd2VyIGJvdW5kcw0KbG93ZXJfYm91bmRzIDwtIHBfaGF0IC0gel92YWx1ZXMgKiBzZQ0KDQpjaV9kYXRhIDwtIGRhdGEuZnJhbWUoDQogIGxldmVsID0gY2lfbGV2ZWxzLA0KICBsb3dlciA9IGxvd2VyX2JvdW5kcywNCiAgY29sb3IgPSBjKCIjQThFNkNGIiwgIiNBMEM0RkYiLCAiI0NCQTBEQyIpDQopDQoNCiMgVGFyZ2V0IHByb3BvcnNpDQp0YXJnZXQgPC0gMC43MA0KDQojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KIyBEaXN0cmlidXNpIFNhbXBsaW5nIFByb3BvcnNpDQojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KeF92YWxzIDwtIHNlcShwX2hhdCAtIDQqc2UsIHBfaGF0ICsgNCpzZSwgbGVuZ3RoLm91dCA9IDEwMDApDQp5X3ZhbHMgPC0gZG5vcm0oeF92YWxzLCBtZWFuID0gcF9oYXQsIHNkID0gc2UpDQoNCmRpc3RfZGYgPC0gZGF0YS5mcmFtZSh4ID0geF92YWxzLCB5ID0geV92YWxzKQ0KDQojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KIyBQbG90DQojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KcCA8LSBnZ3Bsb3QoZGlzdF9kZiwgYWVzKHgsIHkpKSArDQogIGdlb21fYXJlYShmaWxsID0gInBpbmsiLCBhbHBoYSA9IDAuOCkgKw0KICBnZW9tX2xpbmUoY29sb3IgPSAiYmxhY2siLCBsaW5ld2lkdGggPSAxLjIpICsNCiAgDQogICMgR2FyaXMgcHJvcG9yc2kgc2FtcGVsDQogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IHBfaGF0LCBsaW5ldHlwZSA9ICJkYXNoZWQiLCBsaW5ld2lkdGggPSAxKSArDQogIGFubm90YXRlKCJ0ZXh0IiwNCiAgICAgICAgICAgeCA9IHBfaGF0LA0KICAgICAgICAgICB5ID0gbWF4KHlfdmFscykgKiAxLjA4LA0KICAgICAgICAgICBsYWJlbCA9ICJwzIIgPSAwLjc0IiwNCiAgICAgICAgICAgc2l6ZSA9IDUsDQogICAgICAgICAgIGZvbnRmYWNlID0gImJvbGQiKSArDQogIA0KICAjIEdhcmlzIHRhcmdldCA3MCUNCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gdGFyZ2V0LCBjb2xvciA9ICJyZWQiLCBsaW5ld2lkdGggPSAxKSArDQogIGFubm90YXRlKCJ0ZXh0IiwNCiAgICAgICAgICAgeCA9IHRhcmdldCwNCiAgICAgICAgICAgeSA9IG1heCh5X3ZhbHMpICogMC45NSwNCiAgICAgICAgICAgbGFiZWwgPSAiNzAlIiwNCiAgICAgICAgICAgY29sb3IgPSAicmVkIiwNCiAgICAgICAgICAgYW5nbGUgPSA5MCwNCiAgICAgICAgICAgdmp1c3QgPSAtMC41LA0KICAgICAgICAgICBzaXplID0gNCkgKw0KICANCiAgIyBMb3dlciBDb25maWRlbmNlIEludGVydmFscw0KICBnZW9tX3ZsaW5lKGRhdGEgPSBjaV9kYXRhLA0KICAgICAgICAgICAgIGFlcyh4aW50ZXJjZXB0ID0gbG93ZXIsIGNvbG9yID0gbGV2ZWwpLA0KICAgICAgICAgICAgIGxpbmV0eXBlID0gImRvdHRlZCIsDQogICAgICAgICAgICAgbGluZXdpZHRoID0gMS4yKSArDQogIA0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gY2lfZGF0YSRjb2xvcikgKw0KICANCiAgbGFicygNCiAgICB0aXRsZSA9ICJPbmUtU2lkZWQgTG93ZXIgQ29uZmlkZW5jZSBJbnRlcnZhbFxuUHJvcG9yc2kgUGVuZ2d1bmEgUHJlbWl1bSBBa3RpZiIsDQogICAgeCA9ICJQcm9wb3JzaSIsDQogICAgeSA9ICJEZW5zaXR5IiwNCiAgICBjb2xvciA9ICJDb25maWRlbmNlIExldmVsIg0KICApICsNCiAgDQogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoMC42NCwgMC44NCwgMC4wMiksDQogICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKDAuNjMsIDAuODcpKSArDQogIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBleHBhbnNpb24obXVsdCA9IGMoMCwgMC4xNSkpKSArDQogIA0KICB0aGVtZV9taW5pbWFsKGJhc2Vfc2l6ZSA9IDEzKSArDQogIHRoZW1lKA0KICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiwgc2l6ZSA9IDE1LCBoanVzdCA9IDAuNSksDQogICAgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICBwYW5lbC5ncmlkLm1ham9yLnkgPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiZ3JheTkwIiksDQogICAgYXhpcy5saW5lLnggPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiZ3JheTMwIiksDQogICAgcGxvdC5tYXJnaW4gPSBtYXJnaW4oMTAsIDEwLCAxMCwgMTApDQogICkNCg0KIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCiMgSW50ZXJha3RpZiBkZW5nYW4gUGxvdGx5DQojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KZ2dwbG90bHkocCkNCg0KYGBgDQoNCioqSW50ZXJwcmV0YXRpb24qKg0KDQpEaWFncmFtIHRlcnNlYnV0IG1lbmdnYW1iYXJrYW4gaW50ZXJ2YWwga2VwZXJjYXlhYW4gc2F0dSBzaXNpIGJhdGFzIGJhd2FoIChvbmUtc2lkZWQgbG93ZXIgY29uZmlkZW5jZSBpbnRlcnZhbCkgdW50dWsgcHJvcG9yc2kgcGVuZ2d1bmEgcHJlbWl1bSBha3RpZiwgZGVuZ2FuIGVzdGltYXNpIHByb3BvcnNpIHNhbXBlbCBwzIIgPSAwLDc0IHlhbmcgZGl0dW5qdWtrYW4gb2xlaCBnYXJpcyBwdXR1cy1wdXR1cyBkaSB0ZW5nYWguIEdhcmlzIHZlcnRpa2FsIGRpIHNlYmVsYWgga2lyaSBtZW51bmp1a2thbiBiYXRhcyBiYXdhaCBpbnRlcnZhbCBrZXBlcmNheWFhbiBwYWRhIHRpbmdrYXQga2VwZXJjYXlhYW4gOTAlLCA5NSUsIGRhbiA5OSUsIGRpIG1hbmEgc2VtYWtpbiB0aW5nZ2kgdGluZ2thdCBrZXBlcmNheWFhbiBtYWthIGJhdGFzIGJhd2FoIHNlbWFraW4gYmVyZ2VzZXIga2Uga2lyaSAoc2VtYWtpbiBrb25zZXJ2YXRpZikuIEludGVycHJldGFzaW55YSBhZGFsYWgsIG1pc2FsbnlhIHBhZGEgdGluZ2thdCBrZXBlcmNheWFhbiB0ZXJ0ZW50dSwga2l0YSB5YWtpbiBiYWh3YSBwcm9wb3JzaSBzZWJlbmFybnlhIHBlbmdndW5hIHByZW1pdW0gYWt0aWYgZGkgcG9wdWxhc2kgc2V0aWRha255YSBzZWJlc2FyIG5pbGFpIGJhdGFzIGJhd2FoIHRlcnNlYnV0LCBzZW1lbnRhcmEgbmlsYWkgZGkgYXRhcyBiYXRhcyB0ZXJzZWJ1dCBtYXNpaCBtdW5na2luIHRlcmphZGkuIEludGVydmFsIHNhdHUgc2lzaSBpbmkgZGlndW5ha2FuIGtldGlrYSBmb2t1cyBhbmFsaXNpcyBhZGFsYWggbWVtYXN0aWthbiBuaWxhaSBtaW5pbXVtIHByb3BvcnNpIHBvcHVsYXNpLCBidWthbiByZW50YW5nIGF0YXPigJNiYXdhaCBzZWNhcmEgc2ltdWx0YW4uDQo8L2Rpdj4NCg0KIyMgRGV0ZXJtaW5lIDcwJQ0KPGRpdiBjbGFzcz0icGFzdGVsLW1hcm9vbi1ib3giPg0KVGFyZ2V0ICoqNzAlIHBlbmdndW5hIGFrdGlmIGZpdHVyIHByZW1pdW0qKiAqKnRlcnBlbnVoaSBzZWNhcmEgc3RhdGlzdGlrIGhhbnlhIHBhZGEgdGluZ2thdCBrZXBlcmNheWFhbiA5MCUqKiwga2FyZW5hIGJhdGFzIGJhd2FoICpvbmUtc2lkZWQgY29uZmlkZW5jZSBpbnRlcnZhbCogcGFkYSBsZXZlbCBpbmkgbWFzaWggYmVyYWRhIGRpIGF0YXMgNzAlLiBOYW11biwgcGFkYSB0aW5na2F0IGtlcGVyY2F5YWFuIHlhbmcgbGViaWgga2V0YXQgeWFpdHUgKio5NSUgZGFuIDk5JSoqLCBiYXRhcyBiYXdhaCBpbnRlcnZhbCB0dXJ1biBkaSBiYXdhaCA3MCUsIHNlaGluZ2dhIHRpZGFrIGFkYSBjdWt1cCBidWt0aSBzdGF0aXN0aWsgdW50dWsgbWVueWF0YWthbiBiYWh3YSBwcm9wb3JzaSBwZW5nZ3VuYSBwcmVtaXVtIGFrdGlmIG1pbmltYWwgNzAlIGRlbmdhbiBrZXlha2luYW4geWFuZyBsZWJpaCB0aW5nZ2kuIEFydGlueWEsIG1lc2tpcHVuIGVzdGltYXNpIHByb3BvcnNpIHNhbXBlbCBzZWJlc2FyICoqNzQlKiogdGVybGloYXQgbWVtZW51aGkgdGFyZ2V0IHNlY2FyYSBkZXNrcmlwdGlmLCBzZWNhcmEgc3RhdGlzdGlrIHRhcmdldCB0ZXJzZWJ1dCAqKmJlbHVtIGRhcGF0IGRpcGFzdGlrYW4qKiBqaWthIG1hbmFqZW1lbiBtZW5zeWFyYXRrYW4gdGluZ2thdCBrZXBlcmNheWFhbiA5NSUgYXRhdSBsZWJpaC4NCjwvZGl2Pg0K