M. Yustian Putra Muhadi
Institut Tekonologi Sains Bandung
R Programming
Data Science
Statistics
Case Study 1
Interval Kepercayaan untuk Rata-rata, \(\sigma\) Diketahui: Sebuah
platform e-commerce ingin memperkirakan
rata-rata jumlah transaksi harian per pengguna setelah
meluncurkan fitur baru. Berdasarkan data historis skala besar,
simpangan baku populasi diketahui.
\[
\begin{eqnarray*}
\sigma &=& 3.2 \quad \text{(deviasi standar populasi)} \\
n &=& 100 \quad \text{(ukuran sampel)} \\
\bar{x} &=& 12.6 \quad \text{(rata-rata sampel)}
\end{eqnarray*}
\]
Tugas:
Identifikasi uji statistik yang tepat dan berikan
justifikasi atas pilihan Anda.
Hitung Interval Kepercayaan untuk:
\(90\%\)
\(95\%\)
\(99\%\)
Buat visualisasi perbandingan dari ketiga interval
kepercayaan tersebut.
Interpretasikan hasilnya dalam konteks analitik bisnis.
Uji Statistik
yang Tepat & Justifikasi
Karena:
Ukuran sampel n=100 besar (≥30) → CLT
berlaku.
Simpangan baku populasi σ diketahui.
Ingin membuat interval kepercayaan untuk rata-rata populasi
μ.
Maka uji statistik yang tepat adalah Z-test untuk
rata-rata dengan menggunakan distribusi normal standar
(Z).
Justifikasi:
\[
\bar{x} \pm Z_{\alpha/2} \cdot \frac{\sigma}{\sqrt{n}}
\]
Perhitungan
Confidence Interval
Standard Error (SE):
Rumus umum:
\[
ME = \pm Z_{\alpha/2} \cdot \frac{\sigma}{\sqrt{n}}
\] \[
SE = \frac{\sigma}{\sqrt{n}}= \frac{3.2}{\sqrt{100}}= 0.32
\]
\[
Z_{0.05}=1.645
\]
\[
ME=1.645×0.32=0.5264
\]
\[
CI_{90\%} = (12.0736,\; 13.1264)
\]
\[
Z_{0.025}=1.96
\]
\[
ME=1.96×0.32=0.6272
\]
\[
CI_{95\%} = (11.9728,\; 13.2272)
\]
\[
Z_{0.005}=2.576
\]
\[
ME=2.576×0.32=0.8243
\]
\[
CI_{99\%} = (11.7757,\; 13.4243)
\]
Ringkasan numerik:
90%
1.645
0.526
12.074
13.126
95%
1.960
0.627
11.973
13.227
99%
2.576
0.824
11.776
13.424
visualisasi
Grafik yang ditampilkan menunjukkan:
Setiap garis horizontal = satu confidence
interval.
Titik di tengah = sample mean (12.6).
Interval 99% paling lebar, 90%
paling sempit.
Ini menggambarkan trade-off antara tingkat kepercayaan dan
presisi.
Interpretasi
Business Analytics
Dengan 90% keyakinan, rata-rata transaksi harian
per user berada di sekitar 12.07 – 13.13
transaksi.
Dengan 95% keyakinan, rentangnya sedikit lebih
lebar: 11.97 – 13.23.
Dengan 99% keyakinan, estimasi paling
konservatif: 11.78 – 13.42.
Implikasi Bisnis:
Jika keputusan operasional membutuhkan presisi tinggi (misalnya
kapasitas server jangka pendek), CI 90% bisa
digunakan.
Untuk keputusan strategis (forecast pendapatan, evaluasi fitur
baru), CI 95% atau 99% lebih
aman.
Karena seluruh interval berada di atas angka 12,
ini menunjukkan fitur baru kemungkinan meningkatkan aktivitas transaksi
pengguna.
Case Study 2
Interval Kepercayaan untuk Rata-rata, \(\sigma\) Tidak Diketahui: Sebuah
tim Riset UX menganalisis waktu penyelesaian
tugas (dalam menit) untuk aplikasi seluler baru. Data
dikumpulkan dari 12 pengguna :
\[
8.4,\; 7.9,\; 9.1,\; 8.7,\; 8.2,\; 9.0,\;
7.8,\; 8.5,\; 8.9,\; 8.1,\; 8.6,\; 8.3
\]
Tugas:
Identifikasi uji statistik yang tepat dan jelaskan
alasannya.
itung Interval Kepercayaan untuk:
\(90\%\)
\(95\%\)
\(99\%\)
Visualisasikan ketiga interval tersebut dalam satu plot.
Jelaskan bagaimana ukuran sampel dan tingkat
kepercayaan memengaruhi lebar interval.
Identifikasi uji
statistik yang tepat dan jelaskan alasannya
Confidence Interval (CI) digunakan untuk
mengestimasi rentang nilai rata-rata populasi berdasarkan data sampel.
Pada kasus ini, standar deviasi populasi (σ) tidak
diketahui dan ukuran sampel kecil (n < 30), sehingga
digunakan distribusi t-Student.
Rumus umum:
\[
CI = \bar{x} \pm t_{\alpha/2,df}\left(\frac{s}{\sqrt{n}}\right)
\]
Dimana:
\(\bar{x}\) =
rata-rata sampel.
𝑠 = standar deviasi sampel.
𝑛 = ukuran sampel.
𝑑𝑓 =𝑛−1
\(t_{\alpha/2,df}\) = nilai kritis
distribusi t.
Uji Statistik Yang Digunakan:
One-Sample t Confidence Interval.
Alasan:
Simpangan baku populasi (σ) tidak
diketahui.
Ukuran sampel kecil (n = 12 < 30).
Data diasumsikan berasal dari populasi yang mendekati distribusi
normal.
Data numerik dan kontinu.
Statistik Sample:
\[
\bar{x}=8.45
\]
\[
s=0.4079
\]
\[
n=12,df=11
\]
\[
SE = \frac{s}{\sqrt{n}}=0.1179
\]
Confidence
Interval
\[
t_{0.05,11}=1.7959
\]
\[
CI_{90\%} = (8.238,\: 8.662)
\]
\[
t_{0.025,11} = 2.2010
\]
\[
CI_{95\%} = (8.190,\: 8.710)
\]
\[
t_{0.005,11} = 3.1058
\]
\[
CI_{99\%} = (8.084,\: 8.816)
\]
Visualisassi
Interpretasi Grafik:
Interval 99% paling lebar, diikuti 95%
dan 90%
Ketidakpastian lebih besar karena σ populasi
tidak diketahui
Titik hitam menunjukkan rata-rata sampel \(\bar{x}\)
PENGARUH UKURAN
SAMPEL & CONFIDENCE LEVEL
Pengaruh Ukuran Sampel (n):
n bertambah → SE mengecil.
Confidence interval menjadi lebih sempit.
Estimasi mean lebih presisi.
Pengaruh Confidence Level:
Confidence level lebih tinggi (99%) → interval lebih
lebar.
Confidence level lebih rendah (90%) → interval lebih
sempit.
Ada trade-off antara keyakinan dan ketelitian.
INTERPRETASI (KONTEKS UX):
Dengan confidence level 95%, rata-rata waktu
penyelesaian tugas pengguna berada antara 8.19 hingga 8.71
menit.
Hal ini menunjukkan bahwa performa aplikasi relatif konsisten,
meskipun jumlah pengguna yang diuji masih terbatas.
Case Study 3
Interval Kepercayaan untuk Proporsi, Pengujian A/B:
Sebuah tim ilmu data menjalankan pengujian A/B pada
desain tombol Ajakan Bertindak (Call-To-Action/CTA) baru. Hasil
eksperimennya adalah:
\[
\begin{eqnarray*}
n &=& 400 \quad \text{(jumlah pengguna)} \\
x &=& 156 \quad \text{(pengguna yang mengklik CTA)}
\end{eqnarray*}
\]
Tugas:
Hitung proporsi sampel \(\hat{p}\) .
Hitung Interval Kepercayaan untuk proporsi pada:
\(90\%\)
\(95\%\)
\(99\%\)
Visualisasikan dan bandingkan ketiga interval tersebut.
Jelaskan bagaimana tingkat kepercayaan memengaruhi pengambilan
keputusan dalam eksperimen produk.
SAMPLE
PROPORTION
Rumus umum CI Proporsi:
\[
\hat{p} \pm Z_{\alpha/2}\sqrt{\frac{\hat{p}(1-\hat{p})}{n}}
\]
\[
\hat{p} = \frac{156}{400} = 0.39
\]
Artinya: 39% pengguna mengklik CTA.
CONFIDENCE
INTERVAL
Standar Error (SE):
\[
SE = \sqrt{\frac{\hat{p}(1-\hat{p})}{n}}
\]
\[
= \sqrt{\frac{0.39(1-0.39)}{400}}
\]
\[
= \sqrt{\frac{0.39(0.61)}{400}}
\]
\[
= 0.0244
\]
\[
𝑍_{0.05}=1.645
\]
\[
CI_{90\%}=(0.350,\:0.430)
\]
\[
Z_{0.025}=1.96
\]
\[
CI_{95\%}=(0.342,\:0.438)
\]
\[
Z_{0.005}=2.576
\]
\[
CI_{99\%}=(0.327,\:0.453)
\]
VISUALISASI
Interpretasi grafik:
CI 99% paling lebar (paling
konservatif).
CI 90% paling sempit (lebih presisi).
Titik menunjukkan estimasi CTR = 0.39.
PENGARUH
CONFIDENCE LEVEL
Confidence Level Rendah (90%):
Confidence Level Tinggi (99%):
Praktik Umum Produk:
95% CI paling sering digunakan → keseimbangan
antara kecepatan eksperimen & kepercayaan hasil.
INTERPRETASI BISNIS:
Dengan 95% confidence, tingkat klik CTA berada
antara 34.2% hingga 43.8%. Jika batas bawah CI masih
lebih tinggi dari desain lama, maka desain CTA baru layak untuk
diluncurkan.
Case Study 4
Perbandingan Presisi (Uji Z vs Uji t): Dua tim data
mengukur latensi API (dalam milidetik) dalam kondisi
yang berbeda.
\[\begin{eqnarray*}
\text{Team A:} \\
n &=& 36 \quad \text{(sample size)} \\
\bar{x} &=& 210 \quad \text{(sample mean)} \\
\sigma &=& 24 \quad \text{(known population standard deviation)}
\\[6pt]
\text{Team B:} \\
n &=& 36 \quad \text{(sample size)} \\
\bar{x} &=& 210 \quad \text{(sample mean)} \\
s &=& 24 \quad \text{(sample standard deviation)}
\end{eqnarray*}\]
Tugas:
Identifikasi uji statistik yang digunakan oleh setiap tim.
Hitung Interval Kepercayaan untuk 90%, 95%, dan
99% .
Buat visualisasi yang membandingkan semua interval.
Jelaskan mengapa lebar interval berbeda , meskipun
dengan data yang serupa.
IDENTIFIKASI UJI
STATISTIK
Penentuan uji statistik didasarkan pada apakah deviasi standar
populasi diketahui atau hanya diestimasi dari sampel.
Team A (Uji Z): Menggunakan Uji Z
(One-sample Z-test) karena deviasi standar populasi
(\(\sigma\) ) diketahui
secara pasti.
Team B (Uji t): Menggunakan Uji t
(One-sample t-test) karena deviasi standar populasi tidak
diketahui, sehingga menggunakan deviasi standar sampel (\(s\) ). Meskipun ukuran sampel
(\(n = 36\) ) cukup
besar, distribusi \(t\) memberikan hasil yang lebih
konservatif dan tepat untuk data sampel.
Team A
Z Confidence Interval
σ diketahui
Team B
t Confidence Interval
σ tidak diketahui, pakai s
PERHITUNGAN
CONFIDENCE INTERVAL
Rumus umum untuk Interval Kepercayaan (CI):
\[\text{CI} = \bar{x} \pm (\text{Critical
Value}) \times \frac{s \text{ atau } \sigma}{\sqrt{n}}
\]
Standard Error (sama secara numerik):
\[
SE = \frac{24}{\sqrt{36}} = \frac{24}{6} = 4
\]
90%
1.645
(203.42 , 216.58)
95%
1.96
(202.16 , 217.84)
99%
2.576
(199.70 , 220.30)
90%
1.690
(203.24 , 216.76)
95%
2.030
(201.88 , 218.12)
99%
2.724
(199.10 , 220.90)
CI t-Test selalu sedikit lebih lebar.
VISUALISASI
PERBANDINGAN INTERVAL
Interpretasi Grafik:
Interval t-test lebih lebar dibanding Z-test.
Hal ini terjadi karena σ populasi tidak diketahui, sehingga
ketidakpastian lebih besar.
Pada confidence level yang sama, semakin tinggi level → interval
semakin lebar.
MENGAPA LEBAR
INTERVAL BERBEDA
Meskipun nilai rata-rata dan deviasi standarnya identik (24),
terdapat perbedaan lebar interval karena faktor ketidakpastian
(uncertainty):
Informasi yang Tersedia: Team A memiliki
informasi “pasti” mengenai populasi (\(\sigma\) ). Team B hanya memiliki
estimasi dari sampel (\(s\) ). Karena \(s\) bisa bervariasi dari satu
sampel ke sampel lainnya, Uji t menambahkan “margin pengaman” yang lebih
luas.
Karakteristik Distribusi: Distribusi
\(t\) memiliki ekor
yang lebih gemuk (heavier tails) dibandingkan distribusi Z. Ini berarti
pada tingkat kepercayaan yang sama, nilai kritis \(t\) akan selalu lebih besar
daripada nilai kritis \(Z\) .
Tingkat Kepercayaan: Semakin tinggi tingkat
kepercayaan (misal 99% ), semakin besar nilai kritis
yang digunakan, sehingga interval semakin lebar untuk memastikan
parameter populasi benar-benar tertangkap di dalamnya.
INTERPRETASI PRAKTIS (DATA ENGINEERING):
Team A bisa membuat keputusan lebih cepat karena estimasi lebih
presisi.
Team B lebih konservatif, cocok untuk sistem kritis.
Untuk latency API, interval sempit = kepercayaan tinggi terhadap
SLA.
Case Study 5
Interval Kepercayaan Satu Sisi: Sebuah perusahaan
Software as a Service (SaaS) ingin memastikan bahwa
setidaknya 70% pengguna aktif mingguan menggunakan
fitur premium.
Dari percobaan:
\[
\begin{eqnarray*}
n &=& 250 \quad \text{(total users)} \\
x &=& 185 \quad \text{(active premium users)}
\end{eqnarray*}
\]
Manajemen hanya tertarik pada batas bawah dari
estimasi tersebut.
Tugas:
Identifikasi jenis Interval Kepercayaan dan uji
yang sesuai.
Hitung Interval Kepercayaan bawah satu sisi pada:
\(90\%\)
\(95\%\)
\(99\%\)
Visualisasikan batas bawah untuk semua tingkat kepercayaan.
Tentukan apakah target 70% terpenuhi secara
statistik.
JENIS CONFIDENCE
INTERVAL & UJI STATISTIK
Jenis Interval: Lower One-Sided Confidence
Interval (Batas Bawah Satu Sisi). Manajemen hanya ingin
memastikan bahwa proporsi tidak jatuh di bawah angka tertentu
(70%).
Uji yang Sesuai: One-Sample Z-Test for
Proportions. Dengan \(n =
250\) , syarat normalitas terpenuhi karena \(np\) dan \(n(1-p)\) keduanya jauh di atas
10.
Alasan:
PERHITUNGAN
CONFIDENCE INTERVAL
Sample Proportion:
\[
\hat{p} = \frac{x}{n}= \frac{185}{250}= 0.74
\]
Standard Error:
\[
SE = \sqrt{\frac{\hat{p}(1-\hat{p})}{n}}
\]
\[
= \sqrt{\frac{0.74(1-0.74)}{250}}
\]
\[
= \sqrt{\frac{0.74(0.26)}{250}}
\]
\[
= 0.0277
\]
Rumus One-Sided Lower CI:
\[
\text{Lower Bound} = \hat{p} - Z_{\alpha} \cdot SE
\]
One-Sided Lower Confidence Intervals:
90%
1.282
0.705
95%
1.645
0.694
99%
2.326
0.676
VISUALISASI LOWER
BOUNDS
Interpretasi grafik:
Titik = lower bound.
Garis vertikal = target 70% .
Jika titik berada di kanan garis, target terpenuhi.
Grafik menunjukkan bahwa hanya pada confidence level
90% , lower bound berada di atas target
70% . Pada confidence level 95% dan
99% , target belum terpenuhi.
APAKAH TARGET 70%
TERPENUHI
Kesimpulannya bergantung pada tingkat ketatnya standar yang
digunakan manajemen:
Pada Tingkat Kepercayaan 90%: TERPENUHI. Secara
statistik, kita yakin 90% bahwa setidaknya
70.45% pengguna adalah pengguna premium. Karena
70.45% > 70%, target tercapai pada level
ini.
Pada Tingkat Kepercayaan 95%: TIDAK TERPENUHI
(Secara Statistik). Batas bawah berada di 69.44%.
Meskipun sangat dekat, kita tidak bisa menjamin 100%
bahwa angka aslinya tidak berada di bawah 70% dengan
tingkat keyakinan ini.
Pada Tingkat Kepercayaan 99% : TIDAK TERPENUHI.
Margin kesalahan pada tingkat kepercayaan tinggi terlalu lebar, sehingga
batas bawah turun ke 67.56%.
90%
70.5%
Ya
95%
69.4%
Tidak
99%
67.6%
Tidak
INTERPRETASI BISNIS:
Dengan 90% confidence, perusahaan dapat
mengklaim target 70% tercapai.
Dengan 95% atau 99% confidence, bukti belum
cukup kuat.
Semakin tinggi confidence level → keputusan lebih
konservatif.
LS0tDQp0aXRsZTogIiBTdHVkeSBDYXNlcyAiICAgICAgICMgTWFpbiB0aXRsZSBvZiB0aGUgZG9jdW1lbnQNCg0Kc3VidGl0bGU6ICIgQ29uZmlkZW5jZSBJbnRlcnZhbCB+IFdlZWsgMTMgIiAgICAgICAgIyBTdWJ0aXRsZSBvciB0b3BpYyBmb3Igd2VlayAxMA0KYXV0aG9yOiANCiAgLSAiTS4gWXVzdGlhbiBQdXRyYSBNdWhhZGkiICAgICAgICAgICAgICAgIyBSZXBsYWNlIHdpdGggeW91ciBmdWxsIG5hbWUNCmRhdGU6ICJgciBmb3JtYXQoU3lzLkRhdGUoKSwgJyVCICVkLCAlWScpYCIgICMgQXV0byBkaXNwbGF5cyBjdXJyZW50IGRhdGUNCg0Kb3V0cHV0Og0KICBybWRmb3JtYXRzOjpyZWFkdGhlZG93bjogICAgICAgICAgICAgICAjIGh0dHBzOi8vZ2l0aHViLmNvbS9qdWJhL3JtZGZvcm1hdHMNCiAgICBjc3M6ICJzdHlsZS5jc3MiICAgICAgICAgICAgICAgICAgICAgIyA8LS0tIFBBTkdHSUwgRklMRSBDU1MgREkgU0lOSQ0KICAgIHNlbGZfY29udGFpbmVkOiB0cnVlICAgICAgICAgICAgICAgICAjIEVtYmVkIGFsbCByZXNvdXJjZXMNCiAgICB0aHVtYm5haWxzOiB0cnVlICAgICAgICAgICAgICAgICAgICAgIyBTaG93IGltYWdlIHRodW1ibmFpbHMNCiAgICBsaWdodGJveDogdHJ1ZSAgICAgICAgICAgICAgICAgICAgICAgIyBFbmFibGUgY2xpY2stdG8tem9vbSBpbWFnZXMNCiAgICBnYWxsZXJ5OiB0cnVlICAgICAgICAgICAgICAgICAgICAgICAgIyBHcm91cCBpbWFnZXMgaW50byBnYWxsZXJ5DQogICAgbnVtYmVyX3NlY3Rpb25zOiB0cnVlICAgICAgICAgICAgICAgICMgTnVtYmVyIGFsbCBzZWN0aW9ucw0KICAgIGxpYl9kaXI6IGxpYnMgICAgICAgICAgICAgICAgICAgICAgICAjIFNhdmUgSlMvQ1NTIGxpYnJhcmllcw0KICAgIGRmX3ByaW50OiAicGFnZWQiICAgICAgICAgICAgICAgICAgICAjIFBhZ2VkIGRhdGEgZnJhbWVzDQogICAgY29kZV9mb2xkaW5nOiAic2hvdyIgICAgICAgICAgICAgICAgICMgRXhwYW5kYWJsZSBjb2RlIGJsb2Nrcw0KICAgIGNvZGVfZG93bmxvYWQ6IHllcyAgICAgICAgICAgICAgICAgICAjIEFkZCBidXR0b24gdG8gZG93bmxvYWQgUiBjb2RlDQoNCi0tLQ0KDQo8c3R5bGU+DQppbWcgew0KICB3aWR0aDogMTAwJSAhaW1wb3J0YW50Ow0KICBoZWlnaHQ6IGF1dG8gIWltcG9ydGFudDsNCiAgbWF4LXdpZHRoOiBub25lICFpbXBvcnRhbnQ7DQp9DQo8L3N0eWxlPg0KDQotLS0NCg0KYGBge3IgcHJvZmlsZSwgZWNobz1GQUxTRX0NCmxpYnJhcnkoaHRtbHRvb2xzKQ0KSFRNTCgnDQo8ZGl2IHN0eWxlPSJkaXNwbGF5OiBmbGV4OyBnYXA6IDMwcHg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGJhY2tncm91bmQ6bGluZWFyLWdyYWRpZW50KDEzNWRlZywgI2Y1ZjdmYSAwJSwgI2MzY2ZlMiAxMDAlKTsgcGFkZGluZzogMzBweDsgYm9yZGVyLXJhZGl1czogMTVweDsgbWFyZ2luOiAyMHB4IDA7Ij4NCiAgPGRpdj4NCiAgICA8aW1nIHNyYz0iTXVoaGguanBnIiANCiAgICAgICAgIHN0eWxlPSJ3aWR0aDogMjUwcHg7IGhlaWdodDogMjUwcHg7IGJvcmRlci1yYWRpdXM6IDUwJTsgb2JqZWN0LWZpdDogY292ZXI7IGJvcmRlcjogNHB4IHNvbGlkIHdoaXRlOyBib3gtc2hhZG93OiAwIDVweCAxNXB4IHJnYmEoMCwwLDAsMC4yKTsiPg0KICA8L2Rpdj4NCiAgPGRpdj4NCiAgICA8aDEgc3R5bGU9ImNvbG9yOiAjMmMzZTUwOyBtYXJnaW46IDA7Ij5NLiBZdXN0aWFuIFB1dHJhIE11aGFkaTwvaDE+DQogICAgPHAgc3R5bGU9ImNvbG9yOiAjN2Y4YzhkOyBtYXJnaW46IDVweCAwIDE1cHggMDsiPkluc3RpdHV0IFRla29ub2xvZ2kgU2FpbnMgQmFuZHVuZzwvcD4NCiAgICANCiAgICA8ZGl2IHN0eWxlPSJkaXNwbGF5OiBmbGV4OyBnYXA6IDE1cHg7IG1hcmdpbi10b3A6IDIwcHg7Ij4NCiAgICAgIDxidXR0b24gc3R5bGU9ImJhY2tncm91bmQ6ICMzNDk4ZGI7IGNvbG9yOiB3aGl0ZTsgcGFkZGluZzogMTBweCAyMHB4OyBib3JkZXI6IG5vbmU7IGJvcmRlci1yYWRpdXM6IDE1cHg7IGN1cnNvcjogcG9pbnRlcjsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij4NCiAgICAgICAgUiBQcm9ncmFtbWluZw0KICAgICAgPC9idXR0b24+DQogICAgICA8YnV0dG9uIHN0eWxlPSJiYWNrZ3JvdW5kOiAjZTc0YzNjOyBjb2xvcjogV2hpdGU7IHBhZGRpbmc6IDEwcHggMjBweDsgYm9yZGVyOiBub25lOyBib3JkZXItcmFkaXVzOiAxNXB4OyBjdXJzb3I6IHBvaW50ZXI7IGZvbnQtd2VpZ2h0OiBib2xkOyI+DQogICAgICAgIERhdGEgU2NpZW5jZQ0KICAgICAgPC9idXR0b24+DQogICAgICA8YnV0dG9uIHN0eWxlPSJiYWNrZ3JvdW5kOiAjMmVjYzcxOyBjb2xvcjogd2hpdGU7IHBhZGRpbmc6IDEwcHggMjBweDsgYm9yZGVyOiBub25lOyBib3JkZXItcmFkaXVzOiAxNXB4OyBjdXJzb3I6IHBvaW50ZXI7IGZvbnQtd2VpZ2h0OiBib2xkOyI+DQogICAgICAgIFN0YXRpc3RpY3MNCiAgICAgIDwvYnV0dG9uPg0KICAgIDwvZGl2Pg0KICA8L2Rpdj4NCjwvZGl2Pg0KJykNCg0KYGBgDQoNCi0tLQ0KDQojIyBDYXNlIFN0dWR5IDENCg0KKipJbnRlcnZhbCBLZXBlcmNheWFhbiB1bnR1ayBSYXRhLXJhdGEsICRcc2lnbWEkIERpa2V0YWh1aToqKiBTZWJ1YWggKipwbGF0Zm9ybSBlLWNvbW1lcmNlKiogaW5naW4gbWVtcGVya2lyYWthbiAqKnJhdGEtcmF0YSBqdW1sYWggdHJhbnNha3NpIGhhcmlhbiBwZXIgcGVuZ2d1bmEqKiBzZXRlbGFoIG1lbHVuY3Vya2FuIGZpdHVyIGJhcnUuIEJlcmRhc2Fya2FuIGRhdGEgaGlzdG9yaXMgc2thbGEgYmVzYXIsICoqc2ltcGFuZ2FuIGJha3UgcG9wdWxhc2kqKiBkaWtldGFodWkuDQoNCiQkDQpcYmVnaW57ZXFuYXJyYXkqfQ0KXHNpZ21hICY9JiAzLjIgXHF1YWQgXHRleHR7KGRldmlhc2kgc3RhbmRhciBwb3B1bGFzaSl9IFxcDQpuICY9JiAxMDAgXHF1YWQgXHRleHR7KHVrdXJhbiBzYW1wZWwpfSBcXA0KXGJhcnt4fSAmPSYgMTIuNiBccXVhZCBcdGV4dHsocmF0YS1yYXRhIHNhbXBlbCl9DQpcZW5ke2VxbmFycmF5Kn0NCiQkDQoNCioqVHVnYXM6KioNCg0KMS4gSWRlbnRpZmlrYXNpICoqdWppIHN0YXRpc3RpayB5YW5nIHRlcGF0KiogZGFuIGJlcmlrYW4ganVzdGlmaWthc2kgYXRhcyBwaWxpaGFuIEFuZGEuDQoyLiBIaXR1bmcgSW50ZXJ2YWwgS2VwZXJjYXlhYW4gdW50dWs6DQogICAtICQ5MFwlJA0KICAgLSAkOTVcJSQNCiAgIC0gJDk5XCUkDQozLiBCdWF0ICoqdmlzdWFsaXNhc2kgcGVyYmFuZGluZ2FuKiogZGFyaSBrZXRpZ2EgaW50ZXJ2YWwga2VwZXJjYXlhYW4gdGVyc2VidXQuDQo0LiBJbnRlcnByZXRhc2lrYW4gaGFzaWxueWEgZGFsYW0ga29udGVrcyBhbmFsaXRpayBiaXNuaXMuDQoNCi0tLQ0KDQojIyMgKlVqaSBTdGF0aXN0aWsgeWFuZyBUZXBhdCAmIEp1c3RpZmlrYXNpKg0KDQoqKkthcmVuYToqKg0KDQotIFVrdXJhbiBzYW1wZWwgKipuPTEwMCBiZXNhciAo4omlMzApKiog4oaSIENMVCBiZXJsYWt1Lg0KDQotIFNpbXBhbmdhbiBiYWt1IHBvcHVsYXNpICoqz4MqKiBkaWtldGFodWkuDQoNCi0gSW5naW4gbWVtYnVhdCBpbnRlcnZhbCBrZXBlcmNheWFhbiB1bnR1ayByYXRhLXJhdGEgcG9wdWxhc2kgKirOvC4qKg0KDQpNYWthIHVqaSBzdGF0aXN0aWsgeWFuZyB0ZXBhdCBhZGFsYWggKipaLXRlc3QqKiB1bnR1ayByYXRhLXJhdGEgZGVuZ2FuIG1lbmdndW5ha2FuICoqZGlzdHJpYnVzaSBub3JtYWwgc3RhbmRhciAoWikuKioNCg0KKipKdXN0aWZpa2FzaToqKg0KDQotIM+DIGRpa2V0YWh1aSDihpIgZ3VuYWthbiBaLCBidWthbiB0Lg0KDQotIFJ1bXVzIGludGVydmFsIGtlcGVyY2F5YWFuOg0KDQokJA0KXGJhcnt4fSBccG0gWl97XGFscGhhLzJ9IFxjZG90IFxmcmFje1xzaWdtYX17XHNxcnR7bn19DQokJA0KDQotLS0NCg0KIyMjICpQZXJoaXR1bmdhbiBDb25maWRlbmNlIEludGVydmFsKg0KDQoqKlN0YW5kYXJkIEVycm9yIChTRSk6KioNCg0KKipSdW11cyB1bXVtOioqDQoNCiQkDQpNRSA9IFxwbSBaX3tcYWxwaGEvMn0gXGNkb3QgXGZyYWN7XHNpZ21hfXtcc3FydHtufX0NCiQkDQokJA0KU0UgPSBcZnJhY3tcc2lnbWF9e1xzcXJ0e259fT0gXGZyYWN7My4yfXtcc3FydHsxMDB9fT0gMC4zMg0KJCQNCg0KLSAqKjkwJSBDb25maWRlbmNlIEludGVydmFsOioqDQoNCiQkDQpaX3swLjA1fT0xLjY0NQ0KJCQNCg0KJCQNCk1FPTEuNjQ1w5cwLjMyPTAuNTI2NA0KJCQNCg0KJCQNCkNJX3s5MFwlfSA9ICgxMi4wNzM2LFw7IDEzLjEyNjQpDQokJA0KDQoNCi0gKio5NSUgQ29uZmlkZW5jZSBJbnRlcnZhbDoqKg0KDQokJA0KWl97MC4wMjV9PTEuOTYNCiQkDQoNCiQkDQpNRT0xLjk2w5cwLjMyPTAuNjI3Mg0KJCQNCg0KJCQNCkNJX3s5NVwlfSA9ICgxMS45NzI4LFw7IDEzLjIyNzIpDQokJA0KDQoNCi0gKio5OSUgQ29uZmlkZW5jZSBJbnRlcnZhbDoqKg0KDQokJA0KWl97MC4wMDV9PTIuNTc2DQokJA0KDQokJA0KTUU9Mi41NzbDlzAuMzI9MC44MjQzDQokJA0KDQokJA0KQ0lfezk5XCV9ID0gKDExLjc3NTcsXDsgMTMuNDI0MykNCiQkDQoNCioqUmluZ2thc2FuIG51bWVyaWs6KioNCg0KfCBDb25maWRlbmNlIExldmVsIHwgWi12YWx1ZSB8IE1hcmdpbiBvZiBFcnJvciB8IExvd2VyICB8IFVwcGVyICB8DQp8IC0tLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tIHwgLS0tLS0tIHwNCnwgOTAlICAgICAgICAgICAgICB8IDEuNjQ1ICAgfCAwLjUyNiAgICAgICAgICAgfCAxMi4wNzQgfCAxMy4xMjYgfA0KfCA5NSUgICAgICAgICAgICAgIHwgMS45NjAgICB8IDAuNjI3ICAgICAgICAgICB8IDExLjk3MyB8IDEzLjIyNyB8DQp8IDk5JSAgICAgICAgICAgICAgfCAyLjU3NiAgIHwgMC44MjQgICAgICAgICAgIHwgMTEuNzc2IHwgMTMuNDI0IHwNCg0KLS0tDQoNCiMjIyAqdmlzdWFsaXNhc2kqDQoNCmBgYHtyIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9DQpsaWJyYXJ5KGdncGxvdDIpDQoNCiMgRGF0YSBmcmFtZQ0KY2lfZGF0YSA8LSBkYXRhLmZyYW1lKA0KICBMZXZlbCA9IGZhY3RvcihjKCI5MCUiLCAiOTUlIiwgIjk5JSIpLCBsZXZlbHMgPSBjKCI5MCUiLCAiOTUlIiwgIjk5JSIpKSwNCiAgTG93ZXIgPSBjKDEyLjA3MzYsIDExLjk3MjgsIDExLjc3NTcpLA0KICBVcHBlciA9IGMoMTMuMTI2NCwgMTMuMjI3MiwgMTMuNDI0MyksDQogIE1lYW4gID0gMTIuNg0KKQ0KDQojIFBsb3QNCmdncGxvdChjaV9kYXRhLCBhZXMoeSA9IExldmVsKSkgKw0KICBnZW9tX2Vycm9yYmFyaChhZXMoeG1pbiA9IExvd2VyLCB4bWF4ID0gVXBwZXIpLCBoZWlnaHQgPSAwLjIsIHNpemUgPSAxLjIpICsNCiAgZ2VvbV9wb2ludChhZXMoeCA9IE1lYW4pLCBzaXplID0gMykgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIkNvbXBhcmlzb24gb2YgQ29uZmlkZW5jZSBJbnRlcnZhbHMiLA0KICAgIHggPSAiQXZlcmFnZSBEYWlseSBUcmFuc2FjdGlvbnMgcGVyIFVzZXIiLA0KICAgIHkgPSAiQ29uZmlkZW5jZSBMZXZlbCINCiAgKSArDQogIHRoZW1lX21pbmltYWwoKQ0KDQpgYGANCg0KKipHcmFmaWsgeWFuZyBkaXRhbXBpbGthbiBtZW51bmp1a2thbjoqKg0KDQotIFNldGlhcCBnYXJpcyBob3Jpem9udGFsID0gKipzYXR1IGNvbmZpZGVuY2UgaW50ZXJ2YWwuKioNCg0KLSBUaXRpayBkaSB0ZW5nYWggPSBzYW1wbGUgbWVhbiAqKigxMi42KS4qKg0KDQotIEludGVydmFsICoqOTklKiogcGFsaW5nIGxlYmFyLCAqKjkwJSoqIHBhbGluZyBzZW1waXQuDQoNCioqSW5pIG1lbmdnYW1iYXJrYW4gdHJhZGUtb2ZmIGFudGFyYSB0aW5na2F0IGtlcGVyY2F5YWFuIGRhbiBwcmVzaXNpLioqDQoNCg0KLS0tDQoNCiMjIyAqSW50ZXJwcmV0YXNpIEJ1c2luZXNzIEFuYWx5dGljcyoNCg0KLSBEZW5nYW4gKio5MCUqKiBrZXlha2luYW4sIHJhdGEtcmF0YSB0cmFuc2Frc2kgaGFyaWFuIHBlciB1c2VyIGJlcmFkYSBkaSBzZWtpdGFyICoqMTIuMDcg4oCTIDEzLjEzKiogdHJhbnNha3NpLg0KDQotIERlbmdhbiAqKjk1JSoqIGtleWFraW5hbiwgcmVudGFuZ255YSBzZWRpa2l0IGxlYmloIGxlYmFyOiAqKjExLjk3IOKAkyAxMy4yMy4qKg0KDQotIERlbmdhbiAqKjk5JSoqIGtleWFraW5hbiwgZXN0aW1hc2kgcGFsaW5nIGtvbnNlcnZhdGlmOiAqKjExLjc4IOKAkyAxMy40Mi4qKg0KDQoqKkltcGxpa2FzaSBCaXNuaXM6KioNCg0KLSBKaWthIGtlcHV0dXNhbiBvcGVyYXNpb25hbCBtZW1idXR1aGthbiBwcmVzaXNpIHRpbmdnaSAobWlzYWxueWEga2FwYXNpdGFzIHNlcnZlciBqYW5na2EgcGVuZGVrKSwgKipDSSA5MCUqKiBiaXNhIGRpZ3VuYWthbi4NCg0KLSBVbnR1ayBrZXB1dHVzYW4gc3RyYXRlZ2lzIChmb3JlY2FzdCBwZW5kYXBhdGFuLCBldmFsdWFzaSBmaXR1ciBiYXJ1KSwgKipDSSA5NSUqKiBhdGF1ICoqOTklKiogbGViaWggYW1hbi4NCg0KLSBLYXJlbmEgc2VsdXJ1aCBpbnRlcnZhbCBiZXJhZGEgZGkgYXRhcyBhbmdrYSAqKjEyLCoqIGluaSBtZW51bmp1a2thbiBmaXR1ciBiYXJ1IGtlbXVuZ2tpbmFuIG1lbmluZ2thdGthbiBha3Rpdml0YXMgdHJhbnNha3NpIHBlbmdndW5hLg0KDQojIyBDYXNlIFN0dWR5IDIgDQoNCioqSW50ZXJ2YWwgS2VwZXJjYXlhYW4gdW50dWsgUmF0YS1yYXRhLCAkXHNpZ21hJCBUaWRhayBEaWtldGFodWk6KiogU2VidWFoICoqdGltIFJpc2V0IFVYKiogbWVuZ2FuYWxpc2lzICoqd2FrdHUgcGVueWVsZXNhaWFuIHR1Z2FzIChkYWxhbSBtZW5pdCkqKiB1bnR1ayBhcGxpa2FzaSBzZWx1bGVyIGJhcnUuIERhdGEgZGlrdW1wdWxrYW4gZGFyaSAqKjEyIHBlbmdndW5hKio6DQoNCiQkDQo4LjQsXDsgNy45LFw7IDkuMSxcOyA4LjcsXDsgOC4yLFw7IDkuMCxcOw0KNy44LFw7IDguNSxcOyA4LjksXDsgOC4xLFw7IDguNixcOyA4LjMNCiQkDQoNCioqVHVnYXM6KioNCg0KMS4gSWRlbnRpZmlrYXNpICoqdWppIHN0YXRpc3RpayB5YW5nIHRlcGF0KiogZGFuIGplbGFza2FuIGFsYXNhbm55YS4NCjIuIGl0dW5nIEludGVydmFsIEtlcGVyY2F5YWFuIHVudHVrOg0KICAgLSAkOTBcJSQNCiAgIC0gJDk1XCUkDQogICAtICQ5OVwlJA0KMy4gVmlzdWFsaXNhc2lrYW4ga2V0aWdhIGludGVydmFsIHRlcnNlYnV0IGRhbGFtIHNhdHUgcGxvdC4NCjQuIEplbGFza2FuIGJhZ2FpbWFuYSAqKnVrdXJhbiBzYW1wZWwgZGFuIHRpbmdrYXQga2VwZXJjYXlhYW4qKiBtZW1lbmdhcnVoaSBsZWJhciBpbnRlcnZhbC4NCg0KDQotLS0NCg0KIyMjICpJZGVudGlmaWthc2kgdWppIHN0YXRpc3RpayB5YW5nIHRlcGF0IGRhbiBqZWxhc2thbiBhbGFzYW5ueWEqDQoNCkNvbmZpZGVuY2UgSW50ZXJ2YWwgKiooQ0kpKiogZGlndW5ha2FuIHVudHVrIG1lbmdlc3RpbWFzaSByZW50YW5nIG5pbGFpIHJhdGEtcmF0YSBwb3B1bGFzaSBiZXJkYXNhcmthbiBkYXRhIHNhbXBlbC4gUGFkYSBrYXN1cyBpbmksIHN0YW5kYXIgZGV2aWFzaSBwb3B1bGFzaSAqKijPgykqKiB0aWRhayBkaWtldGFodWkgZGFuIHVrdXJhbiBzYW1wZWwga2VjaWwgKioobiA8IDMwKSwqKiBzZWhpbmdnYSBkaWd1bmFrYW4gZGlzdHJpYnVzaSAqKnQtU3R1ZGVudC4qKg0KDQoqKlJ1bXVzIHVtdW06KioNCg0KJCQNCkNJID0gXGJhcnt4fSBccG0gdF97XGFscGhhLzIsZGZ9XGxlZnQoXGZyYWN7c317XHNxcnR7bn19XHJpZ2h0KQ0KJCQNCg0KKipEaW1hbmE6KioNCg0KLSAqKiRcYmFye3h9JCoqID0gcmF0YS1yYXRhIHNhbXBlbC4NCg0KLSAqKvCdkaAqKj0gc3RhbmRhciBkZXZpYXNpIHNhbXBlbC4NCg0KLSAqKvCdkZsqKj0gdWt1cmFuIHNhbXBlbC4NCg0KLSAqKvCdkZHwnZGTKio98J2Rm+KIkjENCg0KLSAqKiR0X3tcYWxwaGEvMixkZn0kKiogPSBuaWxhaSBrcml0aXMgZGlzdHJpYnVzaSB0Lg0KDQoqKlVqaSBTdGF0aXN0aWsgWWFuZyBEaWd1bmFrYW46KioNCg0KLSBPbmUtU2FtcGxlIHQgQ29uZmlkZW5jZSBJbnRlcnZhbC4NCg0KKipBbGFzYW46KioNCg0KLSBTaW1wYW5nYW4gYmFrdSBwb3B1bGFzaSAqKijPgykqKiB0aWRhayBkaWtldGFodWkuDQoNCi0gVWt1cmFuIHNhbXBlbCBrZWNpbCAqKihuID0gMTIgPCAzMCkuKioNCg0KLSBEYXRhIGRpYXN1bXNpa2FuIGJlcmFzYWwgZGFyaSBwb3B1bGFzaSB5YW5nIG1lbmRla2F0aSBkaXN0cmlidXNpIG5vcm1hbC4NCg0KLSBEYXRhIG51bWVyaWsgZGFuIGtvbnRpbnUuDQoNCioqU3RhdGlzdGlrIFNhbXBsZToqKg0KDQokJA0KXGJhcnt4fT04LjQ1DQokJA0KDQokJA0Kcz0wLjQwNzkNCiQkDQoNCiQkDQpuPTEyLGRmPTExDQokJA0KDQokJA0KU0UgPSBcZnJhY3tzfXtcc3FydHtufX09MC4xMTc5DQokJA0KDQotLS0NCg0KIyMjICpDb25maWRlbmNlIEludGVydmFsKg0KDQotICoqOTAlIENvbmZpZGVuY2UgSW50ZXJ2YWw6KioNCg0KJCQNCnRfezAuMDUsMTF9PTEuNzk1OQ0KJCQNCg0KJCQNCkNJX3s5MFwlfSA9ICg4LjIzOCxcOiA4LjY2MikNCiQkDQoNCi0gKio5NSUgQ29uZmlkZW5jZSBJbnRlcnZhbDoqKg0KDQokJA0KdF97MC4wMjUsMTF9ID0gMi4yMDEwDQokJA0KDQokJA0KQ0lfezk1XCV9ID0gKDguMTkwLFw6IDguNzEwKQ0KJCQNCg0KLSAqKjk5JSBDb25maWRlbmNlIEludGVydmFsOioqDQoNCiQkDQp0X3swLjAwNSwxMX0gPSAzLjEwNTgNCiQkDQoNCiQkDQpDSV97OTlcJX0gPSAoOC4wODQsXDogOC44MTYpDQokJA0KDQotLS0NCg0KIyMjICpWaXN1YWxpc2Fzc2kqDQoNCmBgYHtyLGVjaG89RkFMU0V9DQpsaWJyYXJ5KGdncGxvdDIpDQoNCiMgRGF0YQ0KY2lfZGF0YSA8LSBkYXRhLmZyYW1lKA0KICBMZXZlbCA9IGZhY3RvcihjKCI5MCUiLCAiOTUlIiwgIjk5JSIpLCBsZXZlbHMgPSBjKCI5MCUiLCAiOTUlIiwgIjk5JSIpKSwNCiAgTG93ZXIgPSBjKDguMjM4LCA4LjE5MCwgOC4wODQpLA0KICBVcHBlciA9IGMoOC42NjIsIDguNzEwLCA4LjgxNikNCikNCg0KbWVhbl94IDwtIDguNDUNCg0KIyBQbG90DQpnZ3Bsb3QoY2lfZGF0YSwgYWVzKHkgPSBMZXZlbCkpICsNCiAgZ2VvbV9zZWdtZW50KGFlcyh4ID0gTG93ZXIsIHhlbmQgPSBVcHBlciwgeWVuZCA9IExldmVsKSwgbGluZXdpZHRoID0gMS4zKSArDQogIGdlb21fcG9pbnQoYWVzKHggPSBtZWFuX3gpLCBzaXplID0gMykgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIkNvbmZpZGVuY2UgSW50ZXJ2YWxzIGZvciBNZWFuICjPgyBVbmtub3duKSIsDQogICAgeCA9ICJUYXNrIENvbXBsZXRpb24gVGltZSAobWludXRlcykiLA0KICAgIHkgPSAiQ29uZmlkZW5jZSBMZXZlbCINCiAgKSArDQogIHRoZW1lX21pbmltYWwoKQ0KDQpgYGANCg0KKipJbnRlcnByZXRhc2kgR3JhZmlrOioqDQoNCi0gSW50ZXJ2YWwgKio5OSUqKiBwYWxpbmcgbGViYXIsIGRpaWt1dGkgKio5NSUgZGFuIDkwJSoqDQoNCi0gS2V0aWRha3Bhc3RpYW4gbGViaWggYmVzYXIga2FyZW5hICoqz4MqKiBwb3B1bGFzaSB0aWRhayBkaWtldGFodWkNCg0KLSBUaXRpayBoaXRhbSBtZW51bmp1a2thbiByYXRhLXJhdGEgc2FtcGVsICoqJFxiYXJ7eH0kKioNCg0KLS0tDQoNCiMjIyAqUEVOR0FSVUggVUtVUkFOIFNBTVBFTCAmIENPTkZJREVOQ0UgTEVWRUwqDQoNCioqUGVuZ2FydWggVWt1cmFuIFNhbXBlbCAobik6KioNCg0KLSBuIGJlcnRhbWJhaCDihpIgU0UgbWVuZ2VjaWwuDQoNCi0gQ29uZmlkZW5jZSBpbnRlcnZhbCBtZW5qYWRpIGxlYmloIHNlbXBpdC4NCg0KLSBFc3RpbWFzaSBtZWFuIGxlYmloIHByZXNpc2kuDQoNCioqUGVuZ2FydWggQ29uZmlkZW5jZSBMZXZlbDoqKg0KDQotIENvbmZpZGVuY2UgbGV2ZWwgbGViaWggdGluZ2dpICoqKDk5JSkg4oaSIGludGVydmFsIGxlYmloIGxlYmFyLioqDQoNCi0gQ29uZmlkZW5jZSBsZXZlbCBsZWJpaCByZW5kYWggKiooOTAlKSDihpIgaW50ZXJ2YWwgbGViaWggc2VtcGl0LioqDQoNCi0gQWRhIHRyYWRlLW9mZiBhbnRhcmEga2V5YWtpbmFuIGRhbiBrZXRlbGl0aWFuLg0KDQoqKklOVEVSUFJFVEFTSSAoS09OVEVLUyBVWCk6KioNCg0KLSBEZW5nYW4gY29uZmlkZW5jZSBsZXZlbCAqKjk1JSwqKiByYXRhLXJhdGEgd2FrdHUgcGVueWVsZXNhaWFuIHR1Z2FzIHBlbmdndW5hIGJlcmFkYSBhbnRhcmEgKio4LjE5IGhpbmdnYSA4LjcxIG1lbml0LioqDQoNCi0gSGFsIGluaSBtZW51bmp1a2thbiBiYWh3YSBwZXJmb3JtYSBhcGxpa2FzaSByZWxhdGlmIGtvbnNpc3RlbiwgbWVza2lwdW4ganVtbGFoIHBlbmdndW5hIHlhbmcgZGl1amkgbWFzaWggdGVyYmF0YXMuDQoNCg0KIyMgQ2FzZSBTdHVkeSAzIA0KDQoqKkludGVydmFsIEtlcGVyY2F5YWFuIHVudHVrIFByb3BvcnNpLCBQZW5ndWppYW4gQS9COioqIFNlYnVhaCB0aW0gaWxtdSBkYXRhIG1lbmphbGFua2FuICoqcGVuZ3VqaWFuIEEvQioqIHBhZGEgZGVzYWluIHRvbWJvbCAqQWpha2FuIEJlcnRpbmRhayAoQ2FsbC1Uby1BY3Rpb24vQ1RBKSogYmFydS4gSGFzaWwgZWtzcGVyaW1lbm55YSBhZGFsYWg6DQoNCiQkDQpcYmVnaW57ZXFuYXJyYXkqfQ0KbiAmPSYgNDAwIFxxdWFkIFx0ZXh0eyhqdW1sYWggcGVuZ2d1bmEpfSBcXA0KeCAmPSYgMTU2IFxxdWFkIFx0ZXh0eyhwZW5nZ3VuYSB5YW5nIG1lbmdrbGlrIENUQSl9DQpcZW5ke2VxbmFycmF5Kn0NCiQkDQoNCioqVHVnYXM6KioNCg0KMS4gSGl0dW5nICoqcHJvcG9yc2kgc2FtcGVsKiogJFxoYXR7cH0kLg0KMi4gSGl0dW5nIEludGVydmFsIEtlcGVyY2F5YWFuIHVudHVrIHByb3BvcnNpIHBhZGE6DQogICAtICQ5MFwlJA0KICAgLSAkOTVcJSQNCiAgIC0gJDk5XCUkDQozLiBWaXN1YWxpc2FzaWthbiBkYW4gYmFuZGluZ2thbiBrZXRpZ2EgaW50ZXJ2YWwgdGVyc2VidXQuDQo0LiBKZWxhc2thbiBiYWdhaW1hbmEgdGluZ2thdCBrZXBlcmNheWFhbiBtZW1lbmdhcnVoaSBwZW5nYW1iaWxhbiBrZXB1dHVzYW4gZGFsYW0gZWtzcGVyaW1lbiBwcm9kdWsuDQoNCi0tLQ0KDQojIyMgKlNBTVBMRSBQUk9QT1JUSU9OKg0KDQoqKlJ1bXVzIHVtdW0gQ0kgUHJvcG9yc2k6KioNCg0KJCQNClxoYXR7cH0gXHBtIFpfe1xhbHBoYS8yfVxzcXJ0e1xmcmFje1xoYXR7cH0oMS1caGF0e3B9KX17bn19DQokJA0KDQoNCiQkDQpcaGF0e3B9ID0gXGZyYWN7MTU2fXs0MDB9ID0gMC4zOQ0KJCQNCg0KKipBcnRpbnlhOiAzOSUqKiBwZW5nZ3VuYSBtZW5na2xpayBDVEEuDQoNCi0tLQ0KDQojIyMgKkNPTkZJREVOQ0UgSU5URVJWQUwqDQoNCioqU3RhbmRhciBFcnJvciAoU0UpOioqDQoNCiQkDQpTRSA9IFxzcXJ0e1xmcmFje1xoYXR7cH0oMS1caGF0e3B9KX17bn19DQokJA0KDQoNCiQkDQo9IFxzcXJ0e1xmcmFjezAuMzkoMS0wLjM5KX17NDAwfX0NCiQkDQoNCg0KJCQNCj0gXHNxcnR7XGZyYWN7MC4zOSgwLjYxKX17NDAwfX0NCiQkDQoNCg0KJCQNCiA9IDAuMDI0NA0KJCQNCg0KLSAqKjkwJSBDb25maWRlbmNlIEludGVydmFsOioqDQoNCg0KJCQNCvCdkY1fezAuMDV9PTEuNjQ1DQokJA0KDQokJA0KQ0lfezkwXCV9PSgwLjM1MCxcOjAuNDMwKQ0KJCQNCg0KLSAqKjk1JSBDb25maWRlbmNlIEludGVydmFsOioqDQoNCiQkDQpaX3swLjAyNX09MS45Ng0KJCQNCg0KJCQNCkNJX3s5NVwlfT0oMC4zNDIsXDowLjQzOCkNCiQkDQoNCi0gKio5OSUgQ29uZmlkZW5jZSBJbnRlcnZhbDoqKg0KDQokJA0KWl97MC4wMDV9PTIuNTc2DQokJA0KDQokJA0KQ0lfezk5XCV9PSgwLjMyNyxcOjAuNDUzKQ0KJCQNCg0KLS0tDQoNCiMjIyAqVklTVUFMSVNBU0kqDQoNCmBgYHtyLGVjaG89RkFMU0V9DQpsaWJyYXJ5KGdncGxvdDIpDQoNCiMgRGF0YQ0KcF9oYXQgPC0gMTU2IC8gNDAwDQpuIDwtIDQwMA0KU0UgPC0gc3FydChwX2hhdCAqICgxIC0gcF9oYXQpIC8gbikNCg0KIyBDb25maWRlbmNlIGludGVydmFscw0KY2lfZGF0YSA8LSBkYXRhLmZyYW1lKA0KICBMZXZlbCA9IGZhY3RvcihjKCI5MCUiLCAiOTUlIiwgIjk5JSIpLCBsZXZlbHMgPSBjKCI5MCUiLCAiOTUlIiwgIjk5JSIpKSwNCiAgTG93ZXIgPSBjKA0KICAgIHBfaGF0IC0gMS42NDUgKiBTRSwNCiAgICBwX2hhdCAtIDEuOTYgICogU0UsDQogICAgcF9oYXQgLSAyLjU3NiAqIFNFDQogICksDQogIFVwcGVyID0gYygNCiAgICBwX2hhdCArIDEuNjQ1ICogU0UsDQogICAgcF9oYXQgKyAxLjk2ICAqIFNFLA0KICAgIHBfaGF0ICsgMi41NzYgKiBTRQ0KICApDQopDQoNCiMgUGxvdA0KZ2dwbG90KGNpX2RhdGEsIGFlcyh5ID0gTGV2ZWwpKSArDQogIGdlb21fc2VnbWVudChhZXMoeCA9IExvd2VyLCB4ZW5kID0gVXBwZXIsIHllbmQgPSBMZXZlbCksIGxpbmV3aWR0aCA9IDEuMykgKw0KICBnZW9tX3BvaW50KGFlcyh4ID0gcF9oYXQpLCBzaXplID0gMykgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIkNvbmZpZGVuY2UgSW50ZXJ2YWxzIGZvciBDVEEgQ2xpY2sgUHJvcG9ydGlvbiIsDQogICAgeCA9ICJDbGljay1UaHJvdWdoIFJhdGUgKFByb3BvcnRpb24pIiwNCiAgICB5ID0gIkNvbmZpZGVuY2UgTGV2ZWwiDQogICkgKw0KICB0aGVtZV9taW5pbWFsKCkNCg0KYGBgDQoNCioqSW50ZXJwcmV0YXNpIGdyYWZpazoqKg0KDQotIENJICoqOTklKiogcGFsaW5nIGxlYmFyIChwYWxpbmcga29uc2VydmF0aWYpLg0KDQotIENJICoqOTAlKiogcGFsaW5nIHNlbXBpdCAobGViaWggcHJlc2lzaSkuDQoNCi0gVGl0aWsgbWVudW5qdWtrYW4gZXN0aW1hc2kgQ1RSID0gKiowLjM5LioqDQoNCi0tLQ0KDQojIyMgKlBFTkdBUlVIIENPTkZJREVOQ0UgTEVWRUwqDQoNCioqQ29uZmlkZW5jZSBMZXZlbCBSZW5kYWggKDkwJSk6KioNCg0KLSBJbnRlcnZhbCBsZWJpaCBzZW1waXQuDQoNCi0gS2VwdXR1c2FuIGxlYmloIGNlcGF0Lg0KDQotIFJpc2lrbyBrZXNhbGFoYW4gbGViaWggYmVzYXIuDQoNCioqQ29uZmlkZW5jZSBMZXZlbCBUaW5nZ2kgKDk5JSk6KioNCg0KLSBJbnRlcnZhbCBsZWJpaCBsZWJhci4NCg0KLSBLZXB1dHVzYW4gbGViaWggYW1hbi4NCg0KLSBDb2NvayB1bnR1ayBwZXJ1YmFoYW4gYmVzYXIgKGhpZ2ggcmlzaykuDQoNCioqUHJha3RpayBVbXVtIFByb2R1azoqKg0KDQotICoqOTUlKiogQ0kgcGFsaW5nIHNlcmluZyBkaWd1bmFrYW4NCuKGkiBrZXNlaW1iYW5nYW4gYW50YXJhIGtlY2VwYXRhbiBla3NwZXJpbWVuICYga2VwZXJjYXlhYW4gaGFzaWwuDQoNCioqSU5URVJQUkVUQVNJIEJJU05JUzoqKg0KDQpEZW5nYW4gKio5NSUqKiBjb25maWRlbmNlLCB0aW5na2F0IGtsaWsgQ1RBIGJlcmFkYSBhbnRhcmEgKiozNC4yJSBoaW5nZ2EgNDMuOCUuKiogSmlrYSBiYXRhcyBiYXdhaCBDSSBtYXNpaCBsZWJpaCB0aW5nZ2kgZGFyaSBkZXNhaW4gbGFtYSwgbWFrYSBkZXNhaW4gQ1RBIGJhcnUgbGF5YWsgdW50dWsgZGlsdW5jdXJrYW4uDQoNCiMjIENhc2UgU3R1ZHkgNCANCg0KKipQZXJiYW5kaW5nYW4gUHJlc2lzaSAoVWppIFogdnMgVWppIHQpOioqIER1YSB0aW0gZGF0YSBtZW5ndWt1ciAqKmxhdGVuc2kgQVBJIChkYWxhbSBtaWxpZGV0aWspKiogZGFsYW0ga29uZGlzaSB5YW5nIGJlcmJlZGEuDQoNClxiZWdpbntlcW5hcnJheSp9DQpcdGV4dHtUZWFtIEE6fSBcXA0KbiAmPSYgMzYgXHF1YWQgXHRleHR7KHNhbXBsZSBzaXplKX0gXFwNClxiYXJ7eH0gJj0mIDIxMCBccXVhZCBcdGV4dHsoc2FtcGxlIG1lYW4pfSBcXA0KXHNpZ21hICY9JiAyNCBccXVhZCBcdGV4dHsoa25vd24gcG9wdWxhdGlvbiBzdGFuZGFyZCBkZXZpYXRpb24pfSBcXFs2cHRdDQoNClx0ZXh0e1RlYW0gQjp9IFxcDQpuICY9JiAzNiBccXVhZCBcdGV4dHsoc2FtcGxlIHNpemUpfSBcXA0KXGJhcnt4fSAmPSYgMjEwIFxxdWFkIFx0ZXh0eyhzYW1wbGUgbWVhbil9IFxcDQpzICY9JiAyNCBccXVhZCBcdGV4dHsoc2FtcGxlIHN0YW5kYXJkIGRldmlhdGlvbil9DQpcZW5ke2VxbmFycmF5Kn0NCg0KKipUdWdhczoqKg0KDQoxLiBJZGVudGlmaWthc2kgdWppIHN0YXRpc3RpayB5YW5nIGRpZ3VuYWthbiBvbGVoIHNldGlhcCB0aW0uDQoyLiBIaXR1bmcgSW50ZXJ2YWwgS2VwZXJjYXlhYW4gdW50dWsgKio5MCUsIDk1JSwgZGFuIDk5JSoqLg0KMy4gQnVhdCB2aXN1YWxpc2FzaSB5YW5nIG1lbWJhbmRpbmdrYW4gc2VtdWEgaW50ZXJ2YWwuDQo0LiBKZWxhc2thbiBtZW5nYXBhICoqbGViYXIgaW50ZXJ2YWwgYmVyYmVkYSoqLCBtZXNraXB1biBkZW5nYW4gZGF0YSB5YW5nIHNlcnVwYS4NCg0KLS0tDQoNCiMjIyAqSURFTlRJRklLQVNJIFVKSSBTVEFUSVNUSUsqDQoNClBlbmVudHVhbiB1amkgc3RhdGlzdGlrIGRpZGFzYXJrYW4gcGFkYSBhcGFrYWggZGV2aWFzaSBzdGFuZGFyIHBvcHVsYXNpIGRpa2V0YWh1aSBhdGF1IGhhbnlhIGRpZXN0aW1hc2kgZGFyaSBzYW1wZWwuDQoNCi0gKipUZWFtIEEgKFVqaSBaKToqKiBNZW5nZ3VuYWthbiAqKlVqaSBaIChPbmUtc2FtcGxlIFotdGVzdCkqKiBrYXJlbmEgZGV2aWFzaSBzdGFuZGFyIHBvcHVsYXNpICoqKCRcc2lnbWEkKSoqIGRpa2V0YWh1aSBzZWNhcmEgcGFzdGkuDQoNCi0gKipUZWFtIEIgKFVqaSB0KToqKiBNZW5nZ3VuYWthbiAqKlVqaSB0IChPbmUtc2FtcGxlIHQtdGVzdCkqKiBrYXJlbmEgZGV2aWFzaSBzdGFuZGFyIHBvcHVsYXNpIHRpZGFrIGRpa2V0YWh1aSwgc2VoaW5nZ2EgbWVuZ2d1bmFrYW4gZGV2aWFzaSBzdGFuZGFyIHNhbXBlbCAqKigkcyQpLioqIE1lc2tpcHVuIHVrdXJhbiBzYW1wZWwgKiooJG4gPSAzNiQpKiogY3VrdXAgYmVzYXIsIGRpc3RyaWJ1c2kgKiokdCQqKiBtZW1iZXJpa2FuIGhhc2lsIHlhbmcgbGViaWgga29uc2VydmF0aWYgZGFuIHRlcGF0IHVudHVrIGRhdGEgc2FtcGVsLg0KDQp8IFRpbSAgICB8IFVqaSBTdGF0aXN0aWsgICAgICAgICAgICAgfCBBbGFzYW4gICAgICAgICAgICAgICAgICAgICB8DQp8IC0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8DQp8IFRlYW0gQSB8ICoqWiBDb25maWRlbmNlIEludGVydmFsKiogfCDPgyBkaWtldGFodWkgICAgICAgICAgICAgICAgfA0KfCBUZWFtIEIgfCAqKnQgQ29uZmlkZW5jZSBJbnRlcnZhbCoqIHwgz4MgdGlkYWsgZGlrZXRhaHVpLCBwYWthaSBzIHwNCg0KLS0tDQoNCiMjIyAqUEVSSElUVU5HQU4gQ09ORklERU5DRSBJTlRFUlZBTCoNCg0KKipSdW11cyB1bXVtIHVudHVrIEludGVydmFsIEtlcGVyY2F5YWFuIChDSSk6KioNCg0KJCRcdGV4dHtDSX0gPSBcYmFye3h9IFxwbSAoXHRleHR7Q3JpdGljYWwgVmFsdWV9KSBcdGltZXMgXGZyYWN7cyBcdGV4dHsgYXRhdSB9IFxzaWdtYX17XHNxcnR7bn19DQokJA0KDQoqKlN0YW5kYXJkIEVycm9yIChzYW1hIHNlY2FyYSBudW1lcmlrKToqKg0KDQoNCiQkDQpTRSA9IFxmcmFjezI0fXtcc3FydHszNn19ID0gXGZyYWN7MjR9ezZ9ID0gNA0KJCQNCg0KDQotICoqWi1UZXN0IChUZWFtIEEpOioqDQoNCnwgQ29uZmlkZW5jZSB8IFogICAgIHwgQ0kgICAgICAgICAgICAgICAgfA0KfCAtLS0tLS0tLS0tIHwgLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLSB8DQp8IDkwJSAgICAgICAgfCAxLjY0NSB8ICgyMDMuNDIgLCAyMTYuNTgpIHwNCnwgOTUlICAgICAgICB8IDEuOTYgIHwgKDIwMi4xNiAsIDIxNy44NCkgfA0KfCA5OSUgICAgICAgIHwgMi41NzYgfCAoMTk5LjcwICwgMjIwLjMwKSB8DQoNCg0KLSAqKnQtVGVzdCAoVGVhbSBCKSwgZGYgPSAzNSoqDQoNCnwgQ29uZmlkZW5jZSB8IHQgICAgIHwgQ0kgICAgICAgICAgICAgICAgfA0KfCAtLS0tLS0tLS0tIHwgLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLSB8DQp8IDkwJSAgICAgICAgfCAxLjY5MCB8ICgyMDMuMjQgLCAyMTYuNzYpIHwNCnwgOTUlICAgICAgICB8IDIuMDMwIHwgKDIwMS44OCAsIDIxOC4xMikgfA0KfCA5OSUgICAgICAgIHwgMi43MjQgfCAoMTk5LjEwICwgMjIwLjkwKSB8DQoNCioqQ0kgdC1UZXN0Kiogc2VsYWx1IHNlZGlraXQgbGViaWggbGViYXIuDQoNCi0tLQ0KDQojIyMgKlZJU1VBTElTQVNJIFBFUkJBTkRJTkdBTiBJTlRFUlZBTCoNCg0KYGBge3IsZWNobz1GQUxTRX0NCmxpYnJhcnkoZ2dwbG90MikNCg0KIyBNZWFuIGFuZCBTRQ0KbWVhbl94IDwtIDIxMA0KU0UgPC0gNA0KDQojIFogaW50ZXJ2YWxzDQpDSV9aIDwtIGRhdGEuZnJhbWUoDQogIExldmVsID0gYygiOTAlIFoiLCAiOTUlIFoiLCAiOTklIFoiKSwNCiAgTG93ZXIgPSBtZWFuX3ggKyBjKC0xLjY0NSwgLTEuOTYsIC0yLjU3NikgKiBTRSwNCiAgVXBwZXIgPSBtZWFuX3ggKyBjKCAxLjY0NSwgIDEuOTYsICAyLjU3NikgKiBTRSwNCiAgVGVzdCAgPSAiWi1UZXN0Ig0KKQ0KDQojIHQgaW50ZXJ2YWxzIChkZiA9IDM1KQ0KQ0lfdCA8LSBkYXRhLmZyYW1lKA0KICBMZXZlbCA9IGMoIjkwJSB0IiwgIjk1JSB0IiwgIjk5JSB0IiksDQogIExvd2VyID0gbWVhbl94ICsgYygtMS42OTAsIC0yLjAzMCwgLTIuNzI0KSAqIFNFLA0KICBVcHBlciA9IG1lYW5feCArIGMoIDEuNjkwLCAgMi4wMzAsICAyLjcyNCkgKiBTRSwNCiAgVGVzdCAgPSAidC1UZXN0Ig0KKQ0KDQojIENvbWJpbmUNCkNJX2FsbCA8LSByYmluZChDSV9aLCBDSV90KQ0KDQojIFBsb3QNCmdncGxvdChDSV9hbGwsIGFlcyh5ID0gTGV2ZWwpKSArDQogIGdlb21fc2VnbWVudChhZXMoeCA9IExvd2VyLCB4ZW5kID0gVXBwZXIsIHllbmQgPSBMZXZlbCksIGxpbmV3aWR0aCA9IDEuMikgKw0KICBnZW9tX3BvaW50KGFlcyh4ID0gbWVhbl94KSwgc2l6ZSA9IDMpICsNCiAgbGFicygNCiAgICB0aXRsZSA9ICJaLVRlc3QgdnMgdC1UZXN0IENvbmZpZGVuY2UgSW50ZXJ2YWwgQ29tcGFyaXNvbiIsDQogICAgeCA9ICJBUEkgTGF0ZW5jeSAobXMpIiwNCiAgICB5ID0gIkNvbmZpZGVuY2UgSW50ZXJ2YWwgVHlwZSINCiAgKSArDQogIHRoZW1lX21pbmltYWwoKQ0KDQpgYGANCg0KKipJbnRlcnByZXRhc2kgR3JhZmlrOioqDQoNCi0gSW50ZXJ2YWwgdC10ZXN0IGxlYmloIGxlYmFyIGRpYmFuZGluZyBaLXRlc3QuDQoNCi0gSGFsIGluaSB0ZXJqYWRpIGthcmVuYSDPgyBwb3B1bGFzaSB0aWRhayBkaWtldGFodWksIHNlaGluZ2dhIGtldGlkYWtwYXN0aWFuIGxlYmloIGJlc2FyLg0KDQotIFBhZGEgY29uZmlkZW5jZSBsZXZlbCB5YW5nIHNhbWEsIHNlbWFraW4gdGluZ2dpIGxldmVsIOKGkiBpbnRlcnZhbCBzZW1ha2luIGxlYmFyLg0KDQotLS0NCg0KIyMjICpNRU5HQVBBIExFQkFSIElOVEVSVkFMIEJFUkJFREEqDQoNCioqTWVza2lwdW4gbmlsYWkgcmF0YS1yYXRhIGRhbiBkZXZpYXNpIHN0YW5kYXJueWEgaWRlbnRpayAoMjQpLCB0ZXJkYXBhdCBwZXJiZWRhYW4gbGViYXIgaW50ZXJ2YWwga2FyZW5hIGZha3RvciBrZXRpZGFrcGFzdGlhbiAodW5jZXJ0YWludHkpOioqDQoNCi0gKipJbmZvcm1hc2kgeWFuZyBUZXJzZWRpYToqKiBUZWFtIEEgbWVtaWxpa2kgaW5mb3JtYXNpICJwYXN0aSIgbWVuZ2VuYWkgcG9wdWxhc2kgKiooJFxzaWdtYSQpLioqIFRlYW0gQiBoYW55YSBtZW1pbGlraSBlc3RpbWFzaSBkYXJpIHNhbXBlbCAqKigkcyQpLioqIEthcmVuYSAqKiRzJCoqIGJpc2EgYmVydmFyaWFzaSBkYXJpIHNhdHUgc2FtcGVsIGtlIHNhbXBlbCBsYWlubnlhLCBVamkgdCBtZW5hbWJhaGthbiAibWFyZ2luIHBlbmdhbWFuIiB5YW5nIGxlYmloIGx1YXMuDQoNCi0gKipLYXJha3RlcmlzdGlrIERpc3RyaWJ1c2k6KiogRGlzdHJpYnVzaSAqKiR0JCoqIG1lbWlsaWtpIGVrb3IgeWFuZyBsZWJpaCBnZW11ayAoaGVhdmllciB0YWlscykgZGliYW5kaW5na2FuIGRpc3RyaWJ1c2kgWi4gSW5pIGJlcmFydGkgcGFkYSB0aW5na2F0IGtlcGVyY2F5YWFuIHlhbmcgc2FtYSwgbmlsYWkga3JpdGlzICoqJHQkKiogYWthbiBzZWxhbHUgbGViaWggYmVzYXIgZGFyaXBhZGEgbmlsYWkga3JpdGlzICoqJFokLioqDQoNCi0gKipUaW5na2F0IEtlcGVyY2F5YWFuOioqIFNlbWFraW4gdGluZ2dpIHRpbmdrYXQga2VwZXJjYXlhYW4gKG1pc2FsICoqOTklKiopLCBzZW1ha2luIGJlc2FyIG5pbGFpIGtyaXRpcyB5YW5nIGRpZ3VuYWthbiwgc2VoaW5nZ2EgaW50ZXJ2YWwgc2VtYWtpbiBsZWJhciB1bnR1ayBtZW1hc3Rpa2FuIHBhcmFtZXRlciBwb3B1bGFzaSBiZW5hci1iZW5hciB0ZXJ0YW5na2FwIGRpIGRhbGFtbnlhLg0KDQoqKklOVEVSUFJFVEFTSSBQUkFLVElTIChEQVRBIEVOR0lORUVSSU5HKToqKg0KDQotIFRlYW0gQSBiaXNhIG1lbWJ1YXQga2VwdXR1c2FuIGxlYmloIGNlcGF0IGthcmVuYSBlc3RpbWFzaSBsZWJpaCBwcmVzaXNpLg0KDQotIFRlYW0gQiBsZWJpaCBrb25zZXJ2YXRpZiwgY29jb2sgdW50dWsgc2lzdGVtIGtyaXRpcy4NCg0KLSBVbnR1ayBsYXRlbmN5IEFQSSwgaW50ZXJ2YWwgc2VtcGl0ID0ga2VwZXJjYXlhYW4gdGluZ2dpIHRlcmhhZGFwIFNMQS4NCg0KIyMgQ2FzZSBTdHVkeSA1DQoNCioqSW50ZXJ2YWwgS2VwZXJjYXlhYW4gU2F0dSBTaXNpOioqIFNlYnVhaCBwZXJ1c2FoYWFuICoqU29mdHdhcmUgYXMgYSBTZXJ2aWNlIChTYWFTKSoqIGluZ2luIG1lbWFzdGlrYW4gYmFod2EgKipzZXRpZGFrbnlhIDcwJSBwZW5nZ3VuYSBha3RpZiBtaW5nZ3VhbioqIG1lbmdndW5ha2FuIGZpdHVyIHByZW1pdW0uDQoNCkRhcmkgcGVyY29iYWFuOg0KDQokJA0KXGJlZ2lue2VxbmFycmF5Kn0NCm4gJj0mIDI1MCBccXVhZCBcdGV4dHsodG90YWwgdXNlcnMpfSBcXA0KeCAmPSYgMTg1IFxxdWFkIFx0ZXh0eyhhY3RpdmUgcHJlbWl1bSB1c2Vycyl9DQpcZW5ke2VxbmFycmF5Kn0NCiQkDQoNCk1hbmFqZW1lbiBoYW55YSB0ZXJ0YXJpayBwYWRhICoqYmF0YXMgYmF3YWgqKiBkYXJpIGVzdGltYXNpIHRlcnNlYnV0Lg0KDQoqKlR1Z2FzOioqDQoNCjEuIElkZW50aWZpa2FzaSAqKmplbmlzIEludGVydmFsIEtlcGVyY2F5YWFuKiogZGFuIHVqaSB5YW5nIHNlc3VhaS4NCjIuIEhpdHVuZyAqKkludGVydmFsIEtlcGVyY2F5YWFuIGJhd2FoIHNhdHUgc2lzaSoqIHBhZGE6DQogICAtICQ5MFwlJA0KICAgLSAkOTVcJSQNCiAgIC0gJDk5XCUkDQozLiBWaXN1YWxpc2FzaWthbiBiYXRhcyBiYXdhaCB1bnR1ayBzZW11YSB0aW5na2F0IGtlcGVyY2F5YWFuLg0KNC4gVGVudHVrYW4gYXBha2FoICoqdGFyZ2V0IDcwJSoqIHRlcnBlbnVoaSBzZWNhcmEgc3RhdGlzdGlrLg0KDQotLS0NCg0KIyMjICpKRU5JUyBDT05GSURFTkNFIElOVEVSVkFMICYgVUpJIFNUQVRJU1RJSyoNCg0KLSBKZW5pcyBJbnRlcnZhbDogKipMb3dlciBPbmUtU2lkZWQgQ29uZmlkZW5jZSBJbnRlcnZhbCoqIChCYXRhcyBCYXdhaCBTYXR1IFNpc2kpLiBNYW5hamVtZW4gaGFueWEgaW5naW4gbWVtYXN0aWthbiBiYWh3YSBwcm9wb3JzaSB0aWRhayBqYXR1aCBkaSBiYXdhaCBhbmdrYSB0ZXJ0ZW50dSAqKig3MCUpLioqDQoNCi0gVWppIHlhbmcgU2VzdWFpOiAqKk9uZS1TYW1wbGUgWi1UZXN0IGZvciBQcm9wb3J0aW9ucy4qKiBEZW5nYW4gKiokbiA9IDI1MCQsKiogc3lhcmF0IG5vcm1hbGl0YXMgdGVycGVudWhpIGthcmVuYSAqKiRucCQgZGFuICRuKDEtcCkkKioga2VkdWFueWEgamF1aCBkaSBhdGFzICoqMTAuKioNCg0KKipBbGFzYW46KioNCg0KLSBEYXRhIGJlcmJlbnR1ayBwcm9wb3JzaS4NCg0KLSBTYW1wZWwgYmVzYXIuDQoNCi0gRm9rdXMgaGFueWEgcGFkYSBiYXRhcyBiYXdhaC4NCg0KLS0tDQoNCiMjIyAqUEVSSElUVU5HQU4gQ09ORklERU5DRSBJTlRFUlZBTCoNCg0KDQoqKlNhbXBsZSBQcm9wb3J0aW9uOioqDQoNCiQkDQpcaGF0e3B9ID0gXGZyYWN7eH17bn09IFxmcmFjezE4NX17MjUwfT0gMC43NA0KJCQNCg0KKipTdGFuZGFyZCBFcnJvcjoqKg0KDQokJA0KU0UgPSBcc3FydHtcZnJhY3tcaGF0e3B9KDEtXGhhdHtwfSl9e259fQ0KJCQNCg0KJCQNCj0gXHNxcnR7XGZyYWN7MC43NCgxLTAuNzQpfXsyNTB9fQ0KJCQNCg0KJCQNCj0gXHNxcnR7XGZyYWN7MC43NCgwLjI2KX17MjUwfX0NCiQkDQoNCiQkDQo9IDAuMDI3Nw0KJCQNCg0KKipSdW11cyBPbmUtU2lkZWQgTG93ZXIgQ0k6KioNCg0KJCQNClx0ZXh0e0xvd2VyIEJvdW5kfSA9IFxoYXR7cH0gLSBaX3tcYWxwaGF9IFxjZG90IFNFDQokJA0KDQoqKk9uZS1TaWRlZCBMb3dlciBDb25maWRlbmNlIEludGVydmFsczoqKg0KDQp8IENvbmZpZGVuY2UgTGV2ZWwgfCBazrEgICAgfCBQZXJoaXR1bmdnYW4gKCQwLjc0IC0gWiBcdGltZXMgMC4wMjc3JCkgIExvd2VyIEJvdW5kIHwNCnwgLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tIHwgLS0tLS0tLS0tLS0gfA0KfCA5MCUgICAgICAgICAgICAgIHwgMS4yODIgfCAwLjcwNSAgICAgICB8DQp8IDk1JSAgICAgICAgICAgICAgfCAxLjY0NSB8IDAuNjk0ICAgICAgIHwNCnwgOTklICAgICAgICAgICAgICB8IDIuMzI2IHwgMC42NzYgICAgICAgfA0KDQotLS0NCg0KIyMjICpWSVNVQUxJU0FTSSBMT1dFUiBCT1VORFMqDQoNCmBgYHtyLGVjaG89RkFMU0V9DQpsaWJyYXJ5KGdncGxvdDIpDQoNCiMgRGF0YQ0KcF9oYXQgPC0gMTg1IC8gMjUwDQpuIDwtIDI1MA0KU0UgPC0gc3FydChwX2hhdCAqICgxIC0gcF9oYXQpIC8gbikNCg0KIyBaIHZhbHVlcyAmIGNvbmZpZGVuY2UgbGV2ZWxzDQpjaV9kYXRhIDwtIGRhdGEuZnJhbWUoDQogIExldmVsID0gZmFjdG9yKGMoIjkwJSIsICI5NSUiLCAiOTklIiksIGxldmVscyA9IGMoIjkwJSIsICI5NSUiLCAiOTklIikpLA0KICBaID0gYygxLjI4MiwgMS42NDUsIDIuMzI2KQ0KKQ0KDQojIExvd2VyIGJvdW5kcw0KY2lfZGF0YSRMb3dlckJvdW5kIDwtIHBfaGF0IC0gY2lfZGF0YSRaICogU0UNCg0KIyBQbG90DQpnZ3Bsb3QoY2lfZGF0YSwgYWVzKHggPSBMb3dlckJvdW5kLCB5ID0gTGV2ZWwpKSArDQogIGdlb21fcG9pbnQoc2l6ZSA9IDMpICsNCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMC43MCwgbGluZXR5cGUgPSAiZGFzaGVkIikgKw0KICBhbm5vdGF0ZSgNCiAgICAidGV4dCIsDQogICAgeCA9IDAuNzAsDQogICAgeSA9IDMuMywNCiAgICBsYWJlbCA9ICJUYXJnZXQgPSA3MCUiLA0KICAgIGhqdXN0ID0gMA0KICApICsNCiAgbGFicygNCiAgICB0aXRsZSA9ICJPbmUtU2lkZWQgTG93ZXIgQ29uZmlkZW5jZSBCb3VuZHMgZm9yIFByZW1pdW0gVXNhZ2UiLA0KICAgIHggPSAiTG93ZXIgQ29uZmlkZW5jZSBCb3VuZCAoUHJvcG9ydGlvbikiLA0KICAgIHkgPSAiQ29uZmlkZW5jZSBMZXZlbCINCiAgKSArDQogIHhsaW0oMC42NSwgMC43OCkgKw0KICB0aGVtZV9taW5pbWFsKCkNCg0KYGBgDQoNCioqSW50ZXJwcmV0YXNpIGdyYWZpazoqKg0KDQotIFRpdGlrID0gbG93ZXIgYm91bmQuDQoNCi0gR2FyaXMgdmVydGlrYWwgPSB0YXJnZXQgKio3MCUqKi4NCg0KLSBKaWthIHRpdGlrIGJlcmFkYSBkaSBrYW5hbiBnYXJpcywgdGFyZ2V0IHRlcnBlbnVoaS4NCg0KLSBHcmFmaWsgbWVudW5qdWtrYW4gYmFod2EgaGFueWEgcGFkYSBjb25maWRlbmNlIGxldmVsICoqOTAlKiosDQpsb3dlciBib3VuZCBiZXJhZGEgZGkgYXRhcyB0YXJnZXQgKio3MCUqKi4NClBhZGEgY29uZmlkZW5jZSBsZXZlbCAqKjk1JSBkYW4gOTklKiosIHRhcmdldCBiZWx1bSB0ZXJwZW51aGkuDQoNCg0KLS0tDQoNCiMjIyAqQVBBS0FIIFRBUkdFVCA3MCUgVEVSUEVOVUhJKg0KDQoqKktlc2ltcHVsYW5ueWEgYmVyZ2FudHVuZyBwYWRhIHRpbmdrYXQga2V0YXRueWEgc3RhbmRhciB5YW5nIGRpZ3VuYWthbiBtYW5hamVtZW46KioNCg0KLSBQYWRhIFRpbmdrYXQgS2VwZXJjYXlhYW4gKio5MCU6KiogVEVSUEVOVUhJLiBTZWNhcmEgc3RhdGlzdGlrLCBraXRhIHlha2luICoqOTAlKiogYmFod2Egc2V0aWRha255YSAqKjcwLjQ1JSoqIHBlbmdndW5hIGFkYWxhaCBwZW5nZ3VuYSBwcmVtaXVtLiBLYXJlbmEgKio3MC40NSUgPiA3MCUsKiogdGFyZ2V0IHRlcmNhcGFpIHBhZGEgbGV2ZWwgaW5pLg0KDQotIFBhZGEgVGluZ2thdCBLZXBlcmNheWFhbiAqKjk1JToqKiBUSURBSyBURVJQRU5VSEkgKFNlY2FyYSBTdGF0aXN0aWspLiBCYXRhcyBiYXdhaCBiZXJhZGEgZGkgKio2OS40NCUuKiogTWVza2lwdW4gc2FuZ2F0IGRla2F0LCBraXRhIHRpZGFrIGJpc2EgbWVuamFtaW4gKioxMDAlKiogYmFod2EgYW5na2EgYXNsaW55YSB0aWRhayBiZXJhZGEgZGkgYmF3YWggKio3MCUqKiBkZW5nYW4gdGluZ2thdCBrZXlha2luYW4gaW5pLg0KDQotIFBhZGEgVGluZ2thdCBLZXBlcmNheWFhbiAqKjk5JSoqOiBUSURBSyBURVJQRU5VSEkuIE1hcmdpbiBrZXNhbGFoYW4gcGFkYSB0aW5na2F0IGtlcGVyY2F5YWFuIHRpbmdnaSB0ZXJsYWx1IGxlYmFyLCBzZWhpbmdnYSBiYXRhcyBiYXdhaCB0dXJ1biBrZSAqKjY3LjU2JS4qKg0KDQp8IENvbmZpZGVuY2UgfCBMb3dlciBCb3VuZCB8IFRhcmdldCA3MCUgfA0KfCAtLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tIHwNCnwgOTAlICAgICAgICB8IDcwLjUlICAgICAgIHwgICBZYSAgICAgICB8DQp8IDk1JSAgICAgICAgfCA2OS40JSAgICAgICB8ICAgVGlkYWsgICAgfA0KfCA5OSUgICAgICAgIHwgNjcuNiUgICAgICAgfCAgIFRpZGFrICAgIHwNCg0KKipJTlRFUlBSRVRBU0kgQklTTklTOioqDQoNCi0gRGVuZ2FuICoqOTAlKiogY29uZmlkZW5jZSwgcGVydXNhaGFhbiBkYXBhdCBtZW5na2xhaW0gdGFyZ2V0IDcwJSB0ZXJjYXBhaS4NCg0KLSBEZW5nYW4gKio5NSUgYXRhdSA5OSUqKiBjb25maWRlbmNlLCBidWt0aSBiZWx1bSBjdWt1cCBrdWF0Lg0KDQotIFNlbWFraW4gdGluZ2dpIGNvbmZpZGVuY2UgbGV2ZWwg4oaSIGtlcHV0dXNhbiBsZWJpaCBrb25zZXJ2YXRpZi4NCg0KIyMgUmVmZXJlbnNpDQoNCi0gaHR0cHM6Ly93d3cubXltYXRoc2Nsb3VkLmNvbS9hcGkvZG93bmxvYWQvbW9kdWxlcy9BUC1TdGF0aXN0aWNzL1RleHRib29rcy9TdGF0aXN0aWNzJTIwZm9yJTIwRHVtbWllcy5wZGY/aWQ9MjUzMDI2MzUmdXRtX3NvdXJjZT1jaGF0Z3B0LmNvbQ0KDQotIGh0dHBzOi8vYXNzZXRzLm9wZW5zdGF4Lm9yZy9vc2Ntcy1wcm9kY21zL21lZGlhL2RvY3VtZW50cy9JbnRyb2R1Y3RvcnlTdGF0aXN0aWNzLU9QX2k2dEFJN2UucGRmP3V0bV9zb3VyY2U9Y2hhdGdwdC5jb20NCg0KLSBodHRwczovL3VnZXNzMy53b3JkcHJlc3MuY29tL3dwLWNvbnRlbnQvdXBsb2Fkcy8yMDE2LzAxL2JsdW1hbi1zdGVwLWJ5LXN0ZXAtc3RhdGlzdGljcy04dGgtZWRpdGlvbi5wZGY/dXRtX3NvdXJjZT1jaGF0Z3B0LmNvbQ0KDQoNCg0KDQoNCg==