Study Cases

Statistical Inferences ~ Week 14

M. Yustian Putra Muhadi

Institut Tekonologi Sains Bandung


1 Case Study 1

1.1 One-Sample Z-Test (Statistical Hypotheses)

Sebuah platform pembelajaran digital mengklaim bahwa rata-rata waktu belajar harian penggunanya adalah 120 menit. Berdasarkan catatan historis, simpangan baku populasi diketahui sebesar 15 menit.

Sampel acak yang terdiri dari 64 pengguna menunjukkan rata-rata waktu belajar 116 menit.

\[ \begin{eqnarray*} \mu_0 &=& 120 \\ \sigma &=& 15 \\ n &=& 64 \\ \bar{x} &=& 116 \end{eqnarray*} \]

1.2 Tugas

  1. Rumuskan Hipotesis Nol (H₀) dan Hipotesis Alternatif (H₁).
  2. Identifikasi uji statistik yang tepat dan berikan justifikasi untuk pilihan Anda.
  3. Hitung statistik uji dan nilai p menggunakan \(\alpha = 0,05\).
  4. Nyatakan keputusan statistik.
  5. Interpretasikan hasilnya dalam konteks analitik bisnis.

1.2.1 Formulasi Hipotesis

Karena platform mengklaim nilai tertentu (120 menit) dan kita ingin menguji apakah data menyimpang dari klaim tersebut, maka digunakan uji dua arah.

\[ H_0 : \mu = 120\ (rata-rata\ waktu\ belajar\ sesuai\ klaim) \]

\[ H_1 : \mu \neq 120 (rata-rata\ waktu\ belajar\ berbeda\ dari\ klaim) \]


1.2.2 Identifikasi Uji Statistik & Justifikasi

Uji yang digunakan: One-Sample Z-Test.

Alasan:

  • Simpangan baku populasi (\(σ\)) diketahui.

  • Ukuran sampel besar (\(n = 64 ≥ 30\)).

  • Tujuan menguji rata-rata satu populasi terhadap nilai tertentu.

Z-Test adalah pilihan yang tepat.


1.2.3 Perhitungan Statistik Uji & p-value

Hitung Standard Error (SE):

\[ SE = \frac{\sigma}{\sqrt{n}} = \frac{15}{\sqrt{64}} = \frac{15}{8} = 1.875 \]

Hitung Statistik Z:

\[ Z = \frac{\bar{x} - \mu_0}{SE} = \frac{116 - 120}{1.875} = \frac{-4}{1.875} = -2.13 \]

Hitung p-value:

  • Untuk uji dua arah:

\[ p\text{-value} = 2 \times P(Z < -2.13) \]

  • Dari tabel Z:

\[ P(Z < -2.13) \approx 0.0166 \\ p\text{-value} = 2 \times 0.0166 = 0.0332 \]


1.2.4 Keputusan Statistik

Kita membandingkan nilai p-value dengan tingkat signifikansi (\(\alpha\)):

  • Perbandingan: \(0.0332 < 0.05\)

  • Keputusan: Tolak Hipotesis Nol (\(H_0\)).

  • Catatan: Jika menggunakan tabel Z, nilai \(|-2.13|\) lebih besar dari nilai kritis \(Z_{0.025} = 1.96\), sehingga keputusannya tetap sama.


1.2.5 Interpretasi dalam Konteks Analisis Bisnis

Secara statistik, klaim platform pembelajaran digital bahwa pengguna belajar selama 120 menit setiap hari tidak terbukti benar.

Hasil ini menunjukkan bahwa rata-rata waktu belajar sebenarnya secara signifikan lebih rendah dari yang diklaim. Bagi sisi bisnis, ini berarti:

  • Ketidakakuratan Data: Perusahaan perlu merevisi klaim pemasaran mereka agar tidak menyesatkan calon pengguna.

  • Evaluasi Produk: Manajemen perlu menyelidiki mengapa durasi belajar menurun (misalnya: apakah konten kurang menarik atau aplikasi sulit digunakan?).

  • Strategi Retensi: Perusahaan mungkin perlu membuat fitur pengingat (reminder) atau gamifikasi untuk mendorong pengguna mencapai target 120 menit tersebut.


Ringkasan akhir:

Komponen Hasil
Uji Statistik One-Sample Z-Test
Nilai Z -2.13
p-value 0.0332
Keputusan Tolak H₀
Kesimpulan Rata-rata waktu belajar berbeda signifikan dari klaim

2 Case Study 2

2.1 One-Sample T-Test (σ Unknown, Small Sample)

Sebuah Tim Riset UX menyelidiki apakah waktu penyelesaian tugas rata-rata dari aplikasi baru berbeda dari 10 menit.

Data berikut dikumpulkan dari 10 pengguna:

\[ 9.2,\; 10.5,\; 9.8,\; 10.1,\; 9.6,\; 10.3,\; 9.9,\; 9.7,\; 10.0,\; 9.5 \]

2.2 Tugas

  1. Definisikan H₀ dan H₁ (dua arah).
  2. Tentukan uji hipotesis yang tepat.
  3. Hitung statistik t dan nilai p pada \(\alpha = 0,05\).
  4. Buat keputusan statistik.
  5. Jelaskan bagaimana ukuran sampel memengaruhi reliabilitas inferensial.

2.2.1 Definisi Hipotesis (Two-Tailed)

Dalam pengujian ini, kita ingin melihat apakah rata-rata sebenarnya berbeda dari klaim yang ada.

\[ H_0 : \mu = 10\ (rata-rata\ waktu\ penyelesaian\ sama\ dengan\ 10\ menit) \]

\[ H_1 : \mu = 10\ (rata-rata\ waktu\ penyelesaian\ berbeda\ dari\ 10\ menit) \]


2.2.2 Penentuan Uji Statistik yang Tepat

Uji yang digunakan adalah One-Sample \(T-Test\).

Justifikasi:

  • Ukuran sampel kecil: \(n = 10\) (kurang dari 30).

  • Standar deviasi populasi (\(\sigma\)) tidak diketahui. Kita hanya memiliki data sampel untuk menghitung standar deviasi sampel (\(s\)).


2.2.3 Perhitungan Statistik t dan p-value

Rata-rata Sampel:

\[ \bar{x} = \frac{98.6}{10} = 9.86 \]

Simpangan Baku Sampel:

\[ s \approx 0.387 \]

Standard Error:

\[ SE = \frac{s}{\sqrt{n}} = \frac{0.387}{\sqrt{10}} \approx 0.122 \]

Statistik t:

\[ t = \frac{\bar{x} - \mu_0}{SE} = \frac{9.86 - 10}{0.122} = \frac{-0.14}{0.122} \approx -1.15 \]

  • Derajat kebebasan:

\[ df = n - 1 = 10 - 1 = 9 \] p-value:

  • Untuk uji dua arah, dengan:

\[ t = -1.15, \quad df = 9 \]

\[ p\text{-value} \approx 0.28 \]


2.2.4 Keputusan statistik

Bandingkan P-value dengan tingkat signifikansi (\(\alpha\)):

  • P-value (0.28) > \(\alpha\) (0.05).

  • Keputusan: Gagal Tolak \(H_0\).

  • Kesimpulan: Tidak ada bukti statistik yang cukup kuat untuk menyatakan bahwa rata-rata waktu penyelesaian tugas berbeda dari \(10\) menit.


2.2.5 Pengaruh Ukuran Sampel terhadap Keandalan Inferensial

Ukuran sampel sangat krusial dalam statistika inferensial karena beberapa alasan:

  • Margin of Error: Sampel yang lebih besar (\(n\)) akan memperkecil standard error (\(s / \sqrt{n}\)), yang membuat estimasi rata-rata menjadi lebih presisi.

  • Kekuatan Statistik (Statistical Power): Dengan hanya 10 pengguna, ada risiko tinggi terjadinya Error Tipe II (Gagal menolak \(H_0\) padahal sebenarnya ada perbedaan nyata). Sampel kecil mungkin tidak cukup sensitif untuk mendeteksi perbedaan kecil dalam performa UX.

  • Distribusi: Pada sampel kecil, data harus benar-benar mendekati distribusi normal agar uji-t valid. Semakin besar sampel, semakin kuat asumsi normalitas terpenuhi berkat Central Limit Theorem.


Ringkasan Hasil:

Komponen Nilai
Uji One-Sample t-Test
Rata-rata sampel 9.86
t-statistic -1.15
df 9
p-value 0.28
Keputusan Gagal menolak (\(H_0\))
Kesimpulan Tidak berbeda signifikan dari 10 menit

3 Case Study 3

3.1 Two-Sample T-Test (A/B Testing)

Tim analisis produk melakukan uji A/B untuk membandingkan durasi sesi rata-rata (menit) antara dua versi halaman arahan.

Version Sample Size (n) Mean Standard Deviation
A 25 4.8 1.2
B 25 5.4 1.4

3.2 Tugas

  1. Rumuskan hipotesis nol dan hipotesis alternatif.
  2. Identifikasi jenis uji t yang diperlukan.
  3. Hitung statistik uji dan nilai p.
  4. Tarik kesimpulan statistik pada \(\alpha = 0,05\).
  5. Interpretasikan hasil untuk pengambilan keputusan produk.

3.2.1 Formulasi Hipotesis

Karena ingin membandingkan rata-rata dua versi dan melihat apakah berbeda, maka digunakan uji dua arah.

\[ \begin{aligned} H_0 &: \mu_A = \mu_B \quad \text{(rata-rata durasi sesi sama)} \\ H_1 &: \mu_A \neq \mu_B \quad \text{(rata-rata durasi sesi berbeda)} \end{aligned} \]


3.2.2 Jenis Uji t yang Digunakan

Two-Sample t-Test (Independent Samples)

Alasan:

  • Dua kelompok independen (user versi A dan B berbeda).

  • Simpangan baku populasi tidak diketahui.

  • Ukuran sampel relatif kecil–menengah.

  • Data numerik (durasi sesi).

Dengan varians yang tidak diasumsikan sama, digunakan Welch’s t-test (aman dan umum untuk A/B testing).


3.2.3 Perhitungan Statistik t dan p-value

Standard Error Gabungan (Welch):

\[ SE = \sqrt{\frac{s_A^2}{n_A} + \frac{s_B^2}{n_B}} = \sqrt{\frac{1.2^2}{25} + \frac{1.4^2}{25}} \]

\[ SE = \sqrt{\frac{1.44}{25} + \frac{1.96}{25}} = \sqrt{0.0576 + 0.0784} = \sqrt{0.136} \approx 0.369 \]

Statistik t:

\[ t = \frac{\bar{x}_A - \bar{x}_B}{SE} = \frac{4.8 - 5.4}{0.369} = \frac{-0.6}{0.369} \approx -1.63 \]

Derajat Kebebasan (Welch):

\[ df \approx 47 \]

p-value:

  • Untuk uji dua arah:

\[ p\text{-value} \approx 0.11 \]


3.2.4 Kesimpulan Statistik (\(\alpha = 0,05\))

  • Kriteria: Jika P-value < 0,05, tolak \(H_0\). Jika P-value > 0,05, gagal tolak \(H_0\).

  • Hasil: Karena \(0,11 > 0,05\), maka kita Gagal Menolak \(H_0\).

  • Secara statistik, tidak ada perbedaan yang nyata antara durasi sesi di Versi A dan Versi B pada tingkat kepercayaan \(95%\).


3.2.5 Interpretasi untuk Pengambilan Keputusan Produk

Meskipun secara angka rata-rata Versi B (5,4) terlihat lebih tinggi daripada Versi A (4,8), uji statistik menunjukkan bahwa perbedaan tersebut kemungkinan besar hanya terjadi karena faktor kebetulan (variasi acak) dan bukan karena perubahan desain halaman.

Saran untuk Tim Produk:

  • Jangan langsung mengganti seluruh halaman ke Versi B karena belum ada bukti kuat bahwa Versi B benar-benar lebih baik.

  • Pertimbangkan untuk menambah jumlah sampel agar hasil uji lebih sensitif (memiliki power yang lebih tinggi).

  • Periksa metrik lain seperti conversion rate (tingkat konversi) sebelum mengambil keputusan akhir.


Ringkasan Hasil:

Komponen Nilai
Jenis Uji Two-Sample t-Test (Welch)
t-statistic -1.63
df ≈ 47
p-value ≈ 0.11
Keputusan Gagal menolak (\(H_0\))
Kesimpulan Tidak ada perbedaan signifikan

4 Case Study 4

4.1 Chi-Square Test of Independence

Sebuah perusahaan e-commerce memeriksa apakah jenis perangkat berkaitan dengan preferensi metode pembayaran.

Device / Payment E-Wallet Credit Card Cash on Delivery
Mobile 120 80 50
Desktop 60 90 40

4.2 Tugas

  1. Nyatakan Hipotesis Nol (H₀) dan Hipotesis Alternatif (H₁).
  2. Identifikasi uji statistik yang tepat.
  3. Hitung statistik Chi-Square (χ²).
  4. Tentukan nilai p pada \(\alpha = 0,05\).
  5. Interpretasikan hasil dalam konteks strategi pembayaran digital.

4.2.1 Hipotesis

  • \(H_0\) (Hipotesis Nol): Jenis perangkat dan preferensi metode pembayaran saling bebas (tidak ada hubungan).

  • \(H_1\) (Hipotesis Alternatif): Jenis perangkat dan preferensi metode pembayaran saling terkait (ada hubungan).


4.2.2 Uji Statistik yang Digunakan

Chi-Square Test of Independence

Alasan:

  • Dua variabel kategorik (device type & payment method).

  • Data berupa frekuensi.

  • Tujuan menguji asosiasi, bukan perbandingan mean.


4.2.3 Menghitung Statistik Chi-Square (\(\chi^2\))

Frekuensi Harapan (Expected Frequency):

  • Rumus umum:

\[ E_{ij} = \frac{(\text{Total baris}) \times (\text{Total kolom})}{\text{Total keseluruhan}} \]

  • Contoh:

\[ E_{\text{Mobile,E-Wallet}} = \frac{250 \times 180}{440} \approx 102.27 \]

  • Tabel Expected Frequencies:
Device / Payment E-Wallet Credit Card COD
Mobile 102.27 96.59 51.14
Desktop 77.73 73.41 38.86

Hitung χ²:

  • Rumus:

\[ \chi^2 = \sum \frac{(O - E)^2}{E} \]

  • Perhitungan Ringkas:
Sel (O−E)² / E
Mobile–E-Wallet 3.08
Mobile–Credit Card 2.84
Mobile–COD 0.03
Desktop–E-Wallet 4.05
Desktop–Credit Card 3.98
Desktop–COD 0.03
Total χ² ≈ 14.01

\[ \chi^2 \approx 14.01 \]


4.2.4 p-value dan Keputusan

Derajat Kebebasan:

\[ df = (r - 1)(c - 1) = (2 - 1)(3 - 1) = 2 \]

  • Nilai kritis χ² (α = 0.05, df = 2):

\[ \chi^2_{0.05,\,2} = 5.991 \]

  • Karena:

\[ 14.01>5.991 \]

  • atau setara dengan:

\[ p\text{-value} \approx 0.0009 < 0.05 \]

Keputusan: Tolak \(𝐻_0\)


4.2.5 Interpretasi dan Strategi Pembayaran Digital

Karena P-value (\(0.001\)) < \(0.05\), kita Tolak \(H_0\). Ini berarti ada hubungan yang signifikan antara jenis perangkat yang digunakan dengan metode pembayaran yang dipilih.

Interpretasi Strategis:

  • Optimasi Mobile: Pengguna mobile jauh lebih cenderung menggunakan \(E-Wallet\) dibandingkan nilai harapan. Strategi pemasaran harus fokus pada promo cashback dompet digital khusus di aplikasi mobile.

  • Karakteristik Desktop: Pengguna desktop lebih condong ke Kartu Kredit. Ini mungkin karena layar besar memberikan rasa aman lebih saat memasukkan data kartu atau target audiens desktop lebih mapan secara finansial.

  • Kesimpulan: Perusahaan harus mempersonalisasi urutan metode pembayaran di halaman checkout berdasarkan perangkat (utamakan E-wallet di Mobile, utamakan Kartu Kredit di Desktop) untuk meningkatkan konversi.


Ringkasan Hasil:

Komponen Nilai
Uji Chi-Square Test of Independence
χ² ≈ 14.01
df 2
p-value ≈ 0.0009
Keputusan Tolak H₀
Kesimpulan Device & payment method berasosiasi

5 Case Study 5

5.1 Type I and Type II Errors (Conceptual)

Sebuah startup fintech menguji apakah algoritma deteksi penipuan baru mengurangi transaksi penipuan.

  • H₀: Algoritma baru tersebut tidak mengurangi penipuan.
  • H₁: Algoritma baru tersebut mengurangi penipuan.

5.2 Tugas

  1. Jelaskan Kesalahan Tipe I (α) dalam konteks ini.
  2. Jelaskan Kesalahan Tipe II (β) dalam konteks ini.
  3. Identifikasi kesalahan mana yang lebih merugikan dari perspektif bisnis.
  4. Diskusikan bagaimana ukuran sampel memengaruhi Kesalahan Tipe II.
  5. Jelaskan hubungan antara α, β, dan kekuatan statistik.

5.2.1 Kesalahan Tipe I (Type I Error / \(\alpha\))

Kesalahan Tipe I terjadi ketika kita menolak \(H_0\) padahal \(H_0\) benar.

  • Dalam konteks ini: Algoritma menyimpulkan bahwa ia berhasil mengurangi penipuan, padahal kenyataannya tidak ada perubahan atau pengurangan sama sekali.

  • Analogi: “Alarm Palsu” (False Positive). Perusahaan merasa bangga dengan sistem baru yang dianggap efektif, namun angka kerugian akibat penipuan di lapangan tetap tinggi.


5.2.2 Kesalahan Tipe II (Type II Error / \(\beta\))

Kesalahan Tipe II terjadi ketika kita gagal menolak \(H_0\) padahal \(H_1\) benar.

  • Dalam konteks ini: Algoritma sebenarnya efektif dalam mengurangi penipuan, tetapi hasil pengujian statistik menunjukkan tidak ada bukti yang cukup untuk menyimpulkan hal tersebut.

  • Analogi: “Gagal Deteksi” (False Negative). Perusahaan membuang algoritma yang sebenarnya bagus karena mengira sistem tersebut tidak berguna.


5.2.3 Kesalahan Mana yang Lebih Mahal?

Dari perspektif bisnis fintech, Kesalahan Tipe II umumnya jauh lebih mahal.

  • Alasannya: Jika terjadi Kesalahan Tipe II, perusahaan kehilangan kesempatan untuk mengimplementasikan solusi yang bisa menyelamatkan uang dari transaksi penipuan. Biaya operasional akibat fraud yang tidak tertangani biasanya jauh lebih besar daripada biaya pengembangan algoritma.

  • Dampak Kesalahan Tipe I: Biayanya adalah waktu dan sumber daya yang terbuang untuk menerapkan sistem yang tidak efektif, tetapi risiko langsung kehilangan uang karena penipuan tetap dalam status quo (tidak bertambah buruk, hanya tidak membaik).


5.2.4 Pengaruh Ukuran Sampel terhadap Kesalahan Tipe II

Ukuran sampel memiliki kaitan erat dengan \(\beta\):

  • Hubungan Berbanding Terbalik: Semakin besar ukuran sampel, semakin kecil kemungkinan terjadi Kesalahan Tipe II.

  • Penjelasan: Sampel yang lebih besar memberikan informasi yang lebih detail tentang populasi, sehingga uji statistik menjadi lebih sensitif dalam mendeteksi perubahan atau efek kecil sekalipun. Dengan sampel besar, kita lebih mudah membuktikan bahwa algoritma tersebut benar-benar bekerja.


5.2.5 Hubungan antara \(\alpha, \beta\), dan Statistical Power

Ketiga konsep ini saling berhubungan dalam keseimbangan statistik:

  • Trade-off \(\alpha\) dan \(\beta\): Jika kita memperketat \(\alpha\) (misal dari 0.05 ke 0.01) untuk menghindari kesalahan “salah tuduh”, maka probabilitas \(\beta\) biasanya akan meningkat. Kita menjadi terlalu berhati-hati sehingga gagal melihat efek yang nyata.

  • Statistical Power (\(1 - \beta\)): Power adalah kemampuan uji statistik untuk mendeteksi efek jika efek itu memang ada (menolak \(H_0\) yang salah).

  • Hubungan: Meningkatkan \(\alpha\) akan meningkatkan Power, Meningkatkan ukuran sampel akan meningkatkan Power dan menurunkan \(\beta\).


Ringkasan konsep:

Konsep Makna
Type I Error (α) Menganggap algoritma efektif padahal tidak
Type II Error (β) Menganggap algoritma tidak efektif padahal efektif
Power (1−β) Kemampuan mendeteksi algoritma yang benar-benar efektif
Sample Size Menurunkan β, menaikkan power

6 Case Study 6

6.1 P-Value and Statistical Decision Making

Evaluasi model prediksi churn menghasilkan hasil sebagai berikut:

  • Statistik uji = 2,31
  • Nilai p = 0,021
  • Tingkat signifikansi: \(\alpha = 0,05\)

6.2 Tugas

  1. Jelaskan makna dari nilai p-value.
  2. Buatlah keputusan statistik.
  3. Terjemahkan keputusan tersebut ke dalam bahasa non-teknis untuk manajemen.
  4. Diskusikan risiko jika sampel tidak representatif.
  5. Jelaskan mengapa nilai p tidak mengukur ukuran efek.

6.2.1 Makna p-value

Secara teknis, p-value = 0.021 berarti: Jika kita berasumsi bahwa model tersebut sebenarnya tidak memberikan dampak (Hipotesis Nol benar), maka peluang untuk mendapatkan hasil pengamatan sebesar 2.31 atau lebih ekstrem hanya sebesar \(2,1%\).


6.2.2 Keputusan Statistik

Kita membandingkan \(p-value\) dengan tingkat signifikansi (\(\alpha\)):

  • Perbandingan: p-value (\(0.021\)) < \(\alpha\) (\(0.05\)).

  • Keputusan: Tolak Hipotesis Nol (\(H_0\)).

  • Kesimpulan: Hasil ini dianggap signifikan secara statistik.


6.2.3 Bahasa Non-Teknis untuk Manajemen

“Berdasarkan evaluasi kami, model prediksi churn yang baru ini terbukti efektif dan bukan sekadar faktor keberuntungan. Ada bukti kuat bahwa model ini dapat membantu kita mengidentifikasi pelanggan yang akan berhenti dengan tingkat akurasi yang melampaui standar kesalahan biasa.”


6.2.4 Risiko Jika Sampel Tidak Representatif

Statistika inferensial sangat bergantung pada asumsi bahwa sampel mencerminkan populasi. Jika sampel tidak representatif (misal: hanya mengambil data dari pelanggan premium, bukan pelanggan umum), maka akan terjadi:

  • Bias Seleksi: Hasil statistik mungkin terlihat bagus, tetapi gagal saat diterapkan pada seluruh basis pelanggan.

  • Generalisasi yang Salah: Keputusan bisnis yang diambil (seperti strategi diskon atau kampanye retensi) bisa salah sasaran karena data tidak menggambarkan perilaku rata-rata pelanggan.

  • Kegagalan Model: P-value yang rendah tidak akan berarti apa-apa jika data inputnya cacat; model akan memberikan prediksi yang tidak akurat di dunia nyata.


6.2.5 Mengapa P-Value Tidak Mengukur Ukuran Efek (Effect Size)?

Ini adalah poin krusial: Signifikansi statistik \(\neq\) Signifikansi praktis.

  • P-value hanya memberi tahu kita apakah ada perbedaan/efek (Ya atau Tidak).

  • Effect Size memberi tahu kita seberapa besar perbedaan tersebut.

Analogi: Misalkan sebuah kampanye baru menurunkan angka churn sebesar \(0,01%\). Dengan jumlah data yang sangat besar (jutaan pelanggan), p-value bisa menjadi sangat kecil (signifikan secara statistik). Namun, secara bisnis, penurunan \(0,01%\) mungkin terlalu kecil untuk dianggap bermanfaat mengingat biaya kampanyenya. P-value menunjukkan model itu bekerja, tetapi tidak menunjukkan apakah keuntungan finansialnya sebanding dengan usahanya.


Ringkasan:

Task Jawaban
Makna p-value Probabilitas hasil ekstrem jika H₀ benar
Keputusan Tolak H₀
Bahasa manajemen Model baru memang lebih baik
Risiko sampel bias Kesimpulan menyesatkan di produksi
p-value ≠ effect size Tidak mengukur besarnya dampak
LS0tDQp0aXRsZTogIiBTdHVkeSBDYXNlcyAiICAgICAgICMgTWFpbiB0aXRsZSBvZiB0aGUgZG9jdW1lbnQNCnN1YnRpdGxlOiAiIFN0YXRpc3RpY2FsIEluZmVyZW5jZXMgfiBXZWVrIDE0ICIgICAgICAgICMgU3VidGl0bGUgb3IgdG9waWMgZm9yIHdlZWsgMTANCmF1dGhvcjogIk0uIFl1c3RpYW4gUHV0cmEgTXVoYWRpIiAgICAgICAgICAgICAgICMgUmVwbGFjZSB3aXRoIHlvdXIgZnVsbCBuYW1lDQpkYXRlOiAiYHIgZm9ybWF0KFN5cy5EYXRlKCksICclQiAlZCwgJVknKWAiICAjIEF1dG8gZGlzcGxheXMgY3VycmVudCBkYXRlDQoNCm91dHB1dDoNCiAgcm1kZm9ybWF0czo6cmVhZHRoZWRvd246ICAgICAgICAgICAgICAgIyBodHRwczovL2dpdGh1Yi5jb20vanViYS9ybWRmb3JtYXRzDQogICAgY3NzOiAic3R5bGUuY3NzIiAgICAgICAgICAgICAgICAgICAgICMgPC0tLSBQQU5HR0lMIEZJTEUgQ1NTIERJIFNJTkkNCiAgICBzZWxmX2NvbnRhaW5lZDogdHJ1ZSAgICAgICAgICAgICAgICAgIyBFbWJlZCBhbGwgcmVzb3VyY2VzDQogICAgdGh1bWJuYWlsczogdHJ1ZSAgICAgICAgICAgICAgICAgICAgICMgU2hvdyBpbWFnZSB0aHVtYm5haWxzDQogICAgbGlnaHRib3g6IHRydWUgICAgICAgICAgICAgICAgICAgICAgICMgRW5hYmxlIGNsaWNrLXRvLXpvb20gaW1hZ2VzDQogICAgZ2FsbGVyeTogdHJ1ZSAgICAgICAgICAgICAgICAgICAgICAgICMgR3JvdXAgaW1hZ2VzIGludG8gZ2FsbGVyeQ0KICAgIG51bWJlcl9zZWN0aW9uczogdHJ1ZSAgICAgICAgICAgICAgICAjIE51bWJlciBhbGwgc2VjdGlvbnMNCiAgICBsaWJfZGlyOiBsaWJzICAgICAgICAgICAgICAgICAgICAgICAgIyBTYXZlIEpTL0NTUyBsaWJyYXJpZXMNCiAgICBkZl9wcmludDogInBhZ2VkIiAgICAgICAgICAgICAgICAgICAgIyBQYWdlZCBkYXRhIGZyYW1lcw0KICAgIGNvZGVfZm9sZGluZzogInNob3ciICAgICAgICAgICAgICAgICAjIEV4cGFuZGFibGUgY29kZSBibG9ja3MNCiAgICBjb2RlX2Rvd25sb2FkOiB5ZXMgICAgICAgICAgICAgICAgICAgIyBBZGQgYnV0dG9uIHRvIGRvd25sb2FkIFIgY29kZQ0KDQotLS0NCg0KYGBge3IgcHJvZmlsZSwgZWNobz1GQUxTRX0NCmxpYnJhcnkoaHRtbHRvb2xzKQ0KSFRNTCgnDQo8ZGl2IHN0eWxlPSJkaXNwbGF5OiBmbGV4OyBnYXA6IDMwcHg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGJhY2tncm91bmQ6bGluZWFyLWdyYWRpZW50KDEzNWRlZywgI2Y1ZjdmYSAwJSwgI2MzY2ZlMiAxMDAlKTsgcGFkZGluZzogMzBweDsgYm9yZGVyLXJhZGl1czogMTVweDsgbWFyZ2luOiAyMHB4IDA7Ij4NCiAgPGRpdj4NCiAgICA8aW1nIHNyYz0iTXVoaGguanBnIiANCiAgICAgICAgIHN0eWxlPSJ3aWR0aDogMjUwcHg7IGhlaWdodDogMjUwcHg7IGJvcmRlci1yYWRpdXM6IDUwJTsgb2JqZWN0LWZpdDogY292ZXI7IGJvcmRlcjogNHB4IHNvbGlkIHdoaXRlOyBib3gtc2hhZG93OiAwIDVweCAxNXB4IHJnYmEoMCwwLDAsMC4yKTsiPg0KICA8L2Rpdj4NCiAgPGRpdj4NCiAgICA8aDEgc3R5bGU9ImNvbG9yOiAjMmMzZTUwOyBtYXJnaW46IDA7Ij5NLiBZdXN0aWFuIFB1dHJhIE11aGFkaTwvaDE+DQogICAgPHAgc3R5bGU9ImNvbG9yOiAjN2Y4YzhkOyBtYXJnaW46IDVweCAwIDE1cHggMDsiPkluc3RpdHV0IFRla29ub2xvZ2kgU2FpbnMgQmFuZHVuZzwvcD4NCiAgICANCiAgICA8ZGl2IHN0eWxlPSJkaXNwbGF5OiBmbGV4OyBnYXA6IDE1cHg7IG1hcmdpbi10b3A6IDIwcHg7Ij4NCiAgICAgIDxidXR0b24gc3R5bGU9ImJhY2tncm91bmQ6ICMzNDk4ZGI7IGNvbG9yOiB3aGl0ZTsgcGFkZGluZzogMTBweCAyMHB4OyBib3JkZXI6IG5vbmU7IGJvcmRlci1yYWRpdXM6IDE1cHg7IGN1cnNvcjogcG9pbnRlcjsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij4NCiAgICAgICAgUiBQcm9ncmFtbWluZw0KICAgICAgPC9idXR0b24+DQogICAgICA8YnV0dG9uIHN0eWxlPSJiYWNrZ3JvdW5kOiAjZTc0YzNjOyBjb2xvcjogV2hpdGU7IHBhZGRpbmc6IDEwcHggMjBweDsgYm9yZGVyOiBub25lOyBib3JkZXItcmFkaXVzOiAxNXB4OyBjdXJzb3I6IHBvaW50ZXI7IGZvbnQtd2VpZ2h0OiBib2xkOyI+DQogICAgICAgIERhdGEgU2NpZW5jZQ0KICAgICAgPC9idXR0b24+DQogICAgICA8YnV0dG9uIHN0eWxlPSJiYWNrZ3JvdW5kOiAjMmVjYzcxOyBjb2xvcjogd2hpdGU7IHBhZGRpbmc6IDEwcHggMjBweDsgYm9yZGVyOiBub25lOyBib3JkZXItcmFkaXVzOiAxNXB4OyBjdXJzb3I6IHBvaW50ZXI7IGZvbnQtd2VpZ2h0OiBib2xkOyI+DQogICAgICAgIFN0YXRpc3RpY3MNCiAgICAgIDwvYnV0dG9uPg0KICAgIDwvZGl2Pg0KICA8L2Rpdj4NCjwvZGl2Pg0KJykNCg0KYGBgDQoNCi0tLQ0KDQojIENhc2UgU3R1ZHkgMQ0KDQojIyBPbmUtU2FtcGxlIFotVGVzdCAoU3RhdGlzdGljYWwgSHlwb3RoZXNlcykNCg0KU2VidWFoICoqcGxhdGZvcm0gcGVtYmVsYWphcmFuIGRpZ2l0YWwqKiBtZW5na2xhaW0gYmFod2EgKipyYXRhLXJhdGEgd2FrdHUgYmVsYWphciBoYXJpYW4qKiBwZW5nZ3VuYW55YSBhZGFsYWggKioxMjAgbWVuaXQqKi4gQmVyZGFzYXJrYW4gY2F0YXRhbiBoaXN0b3JpcywgKipzaW1wYW5nYW4gYmFrdSBwb3B1bGFzaSBkaWtldGFodWkqKiBzZWJlc2FyIDE1IG1lbml0Lg0KDQpTYW1wZWwgYWNhayB5YW5nIHRlcmRpcmkgZGFyaSAqKjY0IHBlbmdndW5hKiogbWVudW5qdWtrYW4gcmF0YS1yYXRhIHdha3R1IGJlbGFqYXIgKioxMTYgbWVuaXQqKi4NCg0KJCQNClxiZWdpbntlcW5hcnJheSp9DQpcbXVfMCAmPSYgMTIwIFxcDQpcc2lnbWEgJj0mIDE1IFxcDQpuICY9JiA2NCBcXA0KXGJhcnt4fSAmPSYgMTE2DQpcZW5ke2VxbmFycmF5Kn0NCiQkDQoNCiMjIFR1Z2FzDQoNCjEuIFJ1bXVza2FuICoqSGlwb3Rlc2lzIE5vbCAoSOKCgCkqKiBkYW4gKipIaXBvdGVzaXMgQWx0ZXJuYXRpZiAoSOKCgSkqKi4NCjIuIElkZW50aWZpa2FzaSAqKnVqaSBzdGF0aXN0aWsgeWFuZyB0ZXBhdCoqIGRhbiBiZXJpa2FuIGp1c3RpZmlrYXNpIHVudHVrIHBpbGloYW4gQW5kYS4NCjMuIEhpdHVuZyAqKnN0YXRpc3RpayB1amkqKiBkYW4gKipuaWxhaSBwKiogbWVuZ2d1bmFrYW4gJFxhbHBoYSA9IDAsMDUkLg0KNC4gTnlhdGFrYW4gKiprZXB1dHVzYW4gc3RhdGlzdGlrKiouDQo1LiBJbnRlcnByZXRhc2lrYW4gaGFzaWxueWEgZGFsYW0gKiprb250ZWtzIGFuYWxpdGlrIGJpc25pcyoqLg0KDQotLS0NCg0KIyMjICpGb3JtdWxhc2kgSGlwb3Rlc2lzKg0KDQoqKkthcmVuYSBwbGF0Zm9ybSBtZW5na2xhaW0gbmlsYWkgdGVydGVudHUgKDEyMCBtZW5pdCkgZGFuIGtpdGEgaW5naW4gbWVuZ3VqaSBhcGFrYWggZGF0YSBtZW55aW1wYW5nIGRhcmkga2xhaW0gdGVyc2VidXQsIG1ha2EgZGlndW5ha2FuIHVqaSBkdWEgYXJhaCoqLg0KDQokJA0KSF8wIDogXG11ID0gMTIwXCAocmF0YS1yYXRhXCB3YWt0dVwgYmVsYWphclwgc2VzdWFpXCBrbGFpbSkNCiQkDQoNCg0KJCQNCkhfMSA6IFxtdSBcbmVxIDEyMCAocmF0YS1yYXRhXCB3YWt0dVwgYmVsYWphclwgYmVyYmVkYVwgZGFyaVwga2xhaW0pDQokJA0KDQotLS0NCg0KIyMjICpJZGVudGlmaWthc2kgVWppIFN0YXRpc3RpayAmIEp1c3RpZmlrYXNpKg0KDQpVamkgeWFuZyBkaWd1bmFrYW46IE9uZS1TYW1wbGUgKipaLVRlc3QqKi4NCg0KKipBbGFzYW46KioNCg0KLSBTaW1wYW5nYW4gYmFrdSBwb3B1bGFzaSAoJM+DJCkgZGlrZXRhaHVpLg0KDQotIFVrdXJhbiBzYW1wZWwgYmVzYXIgKCRuID0gNjQg4omlIDMwJCkuDQoNCi0gVHVqdWFuIG1lbmd1amkgcmF0YS1yYXRhIHNhdHUgcG9wdWxhc2kgdGVyaGFkYXAgbmlsYWkgdGVydGVudHUuDQoNCioqWi1UZXN0KiogYWRhbGFoIHBpbGloYW4geWFuZyB0ZXBhdC4NCg0KLS0tDQoNCiMjIyAqUGVyaGl0dW5nYW4gU3RhdGlzdGlrIFVqaSAmIHAtdmFsdWUqDQoNCioqSGl0dW5nIFN0YW5kYXJkIEVycm9yIChTRSk6KioNCg0KJCQNClNFID0gXGZyYWN7XHNpZ21hfXtcc3FydHtufX0NCj0gXGZyYWN7MTV9e1xzcXJ0ezY0fX0NCj0gXGZyYWN7MTV9ezh9DQo9IDEuODc1DQokJA0KDQoqKkhpdHVuZyBTdGF0aXN0aWsgWjoqKg0KDQokJA0KWiA9IFxmcmFje1xiYXJ7eH0gLSBcbXVfMH17U0V9DQo9IFxmcmFjezExNiAtIDEyMH17MS44NzV9DQo9IFxmcmFjey00fXsxLjg3NX0NCj0gLTIuMTMNCiQkDQoNCioqSGl0dW5nIHAtdmFsdWU6KioNCg0KLSBVbnR1ayB1amkgZHVhIGFyYWg6DQoNCiQkDQpwXHRleHR7LXZhbHVlfSA9IDIgXHRpbWVzIFAoWiA8IC0yLjEzKQ0KJCQNCg0KLSBEYXJpIHRhYmVsIFo6DQoNCiQkDQpQKFogPCAtMi4xMykgXGFwcHJveCAwLjAxNjYgXFwNCnBcdGV4dHstdmFsdWV9ID0gMiBcdGltZXMgMC4wMTY2ID0gMC4wMzMyDQokJA0KDQotLS0NCg0KIyMjICpLZXB1dHVzYW4gU3RhdGlzdGlrKg0KDQpLaXRhIG1lbWJhbmRpbmdrYW4gbmlsYWkgcC12YWx1ZSBkZW5nYW4gdGluZ2thdCBzaWduaWZpa2Fuc2kgKCRcYWxwaGEkKToNCg0KLSBQZXJiYW5kaW5nYW46ICQwLjAzMzIgPCAwLjA1JA0KDQotIEtlcHV0dXNhbjogVG9sYWsgSGlwb3Rlc2lzIE5vbCAoJEhfMCQpLg0KDQotIENhdGF0YW46IEppa2EgbWVuZ2d1bmFrYW4gdGFiZWwgWiwgbmlsYWkgJHwtMi4xM3wkIGxlYmloIGJlc2FyIGRhcmkgbmlsYWkga3JpdGlzICRaX3swLjAyNX0gPSAxLjk2JCwgc2VoaW5nZ2Ega2VwdXR1c2FubnlhIHRldGFwIHNhbWEuDQoNCi0tLQ0KDQojIyMgKkludGVycHJldGFzaSBkYWxhbSBLb250ZWtzIEFuYWxpc2lzIEJpc25pcyoNCg0KU2VjYXJhIHN0YXRpc3Rpaywga2xhaW0gcGxhdGZvcm0gcGVtYmVsYWphcmFuIGRpZ2l0YWwgYmFod2EgcGVuZ2d1bmEgYmVsYWphciBzZWxhbWEgKioxMjAqKiBtZW5pdCBzZXRpYXAgaGFyaSAqKnRpZGFrIHRlcmJ1a3RpIGJlbmFyKiouDQoNCkhhc2lsIGluaSBtZW51bmp1a2thbiBiYWh3YSByYXRhLXJhdGEgd2FrdHUgYmVsYWphciBzZWJlbmFybnlhIHNlY2FyYSBzaWduaWZpa2FuIGxlYmloIHJlbmRhaCBkYXJpIHlhbmcgZGlrbGFpbS4gQmFnaSBzaXNpIGJpc25pcywgKippbmkgYmVyYXJ0aSoqOg0KDQotICoqS2V0aWRha2FrdXJhdGFuIERhdGEqKjogUGVydXNhaGFhbiBwZXJsdSBtZXJldmlzaSBrbGFpbSBwZW1hc2FyYW4gbWVyZWthIGFnYXIgdGlkYWsgbWVueWVzYXRrYW4gY2Fsb24gcGVuZ2d1bmEuDQoNCi0gKipFdmFsdWFzaSBQcm9kdWsqKjogTWFuYWplbWVuIHBlcmx1IG1lbnllbGlkaWtpIG1lbmdhcGEgZHVyYXNpIGJlbGFqYXIgbWVudXJ1biAobWlzYWxueWE6IGFwYWthaCBrb250ZW4ga3VyYW5nIG1lbmFyaWsgYXRhdSBhcGxpa2FzaSBzdWxpdCBkaWd1bmFrYW4/KS4NCg0KLSAqKlN0cmF0ZWdpIFJldGVuc2kqKjogUGVydXNhaGFhbiBtdW5na2luIHBlcmx1IG1lbWJ1YXQgZml0dXIgcGVuZ2luZ2F0IChyZW1pbmRlcikgYXRhdSBnYW1pZmlrYXNpIHVudHVrIG1lbmRvcm9uZyBwZW5nZ3VuYSBtZW5jYXBhaSB0YXJnZXQgKioxMjAqKiBtZW5pdCB0ZXJzZWJ1dC4NCg0KLS0tDQoNCioqUmluZ2thc2FuIGFraGlyOioqDQoNCnwgS29tcG9uZW4gICAgICB8IEhhc2lsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCnwgLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwNCnwgVWppIFN0YXRpc3RpayB8IE9uZS1TYW1wbGUgWi1UZXN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCnwgTmlsYWkgWiAgICAgICB8IC0yLjEzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCnwgcC12YWx1ZSAgICAgICB8IDAuMDMzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCnwgS2VwdXR1c2FuICAgICB8IFRvbGFrIEjigoAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCBLZXNpbXB1bGFuICAgIHwgUmF0YS1yYXRhIHdha3R1IGJlbGFqYXIgYmVyYmVkYSBzaWduaWZpa2FuIGRhcmkga2xhaW0gfA0KDQoNCiMgQ2FzZSBTdHVkeSAyICANCg0KIyMgT25lLVNhbXBsZSBULVRlc3QgKM+DIFVua25vd24sIFNtYWxsIFNhbXBsZSkNCg0KU2VidWFoICoqVGltIFJpc2V0IFVYKiogbWVueWVsaWRpa2kgYXBha2FoICoqd2FrdHUgcGVueWVsZXNhaWFuIHR1Z2FzIHJhdGEtcmF0YSoqIGRhcmkgYXBsaWthc2kgYmFydSBiZXJiZWRhIGRhcmkgKioxMCBtZW5pdCoqLg0KDQpEYXRhIGJlcmlrdXQgZGlrdW1wdWxrYW4gZGFyaSAqKjEwIHBlbmdndW5hKio6DQoNCiQkDQo5LjIsXDsgMTAuNSxcOyA5LjgsXDsgMTAuMSxcOyA5LjYsXDsgMTAuMyxcOyA5LjksXDsgOS43LFw7IDEwLjAsXDsgOS41DQokJA0KDQojIyBUdWdhcw0KDQoxLiBEZWZpbmlzaWthbiAqKkjigoAqKiBkYW4gKipI4oKBKiogKGR1YSBhcmFoKS4NCjIuIFRlbnR1a2FuICoqdWppIGhpcG90ZXNpcyB5YW5nIHRlcGF0KiouDQozLiBIaXR1bmcgKipzdGF0aXN0aWsgdCoqIGRhbiAqKm5pbGFpIHAqKiBwYWRhICRcYWxwaGEgPSAwLDA1JC4NCjQuIEJ1YXQgKiprZXB1dHVzYW4gc3RhdGlzdGlrKiouDQo1LiBKZWxhc2thbiBiYWdhaW1hbmEgKip1a3VyYW4gc2FtcGVsKiogbWVtZW5nYXJ1aGkgcmVsaWFiaWxpdGFzIGluZmVyZW5zaWFsLg0KDQotLS0NCg0KIyMjICpEZWZpbmlzaSBIaXBvdGVzaXMgKFR3by1UYWlsZWQpKg0KDQpEYWxhbSBwZW5ndWppYW4gaW5pLCBraXRhIGluZ2luIG1lbGloYXQgYXBha2FoIHJhdGEtcmF0YSBzZWJlbmFybnlhIGJlcmJlZGEgZGFyaSBrbGFpbSB5YW5nIGFkYS4NCg0KJCQNCkhfMCA6IFxtdSA9IDEwXCAocmF0YS1yYXRhXCB3YWt0dVwgIHBlbnllbGVzYWlhblwgc2FtYVwgZGVuZ2FuXCAxMFwgbWVuaXQpDQokJA0KDQokJA0KSF8xIDogXG11ID0gMTBcIChyYXRhLXJhdGFcIHdha3R1XCAgcGVueWVsZXNhaWFuXCBiZXJiZWRhXCBkYXJpXCAxMFwgbWVuaXQpDQokJA0KDQotLS0NCg0KIyMjICpQZW5lbnR1YW4gVWppIFN0YXRpc3RpayB5YW5nIFRlcGF0Kg0KDQpVamkgeWFuZyBkaWd1bmFrYW4gYWRhbGFoICoqT25lLVNhbXBsZSAkVC1UZXN0JC4qKg0KDQoqKkp1c3RpZmlrYXNpOioqDQoNCi0gKipVa3VyYW4gc2FtcGVsIGtlY2lsKio6ICRuID0gMTAkIChrdXJhbmcgZGFyaSAqKjMwKiopLg0KDQotICoqU3RhbmRhciBkZXZpYXNpIHBvcHVsYXNpICgkXHNpZ21hJCkgdGlkYWsgZGlrZXRhaHVpKiouIEtpdGEgaGFueWEgbWVtaWxpa2kgZGF0YSBzYW1wZWwgdW50dWsgbWVuZ2hpdHVuZyBzdGFuZGFyIGRldmlhc2kgc2FtcGVsICgkcyQpLg0KDQotLS0NCg0KIyMjICpQZXJoaXR1bmdhbiBTdGF0aXN0aWsgdCBkYW4gcC12YWx1ZSoNCg0KKipSYXRhLXJhdGEgU2FtcGVsOioqDQoNCiQkDQpcYmFye3h9ID0gXGZyYWN7OTguNn17MTB9ID0gOS44Ng0KJCQNCg0KKipTaW1wYW5nYW4gQmFrdSBTYW1wZWw6KioNCg0KJCQNCnMgXGFwcHJveCAwLjM4Nw0KJCQNCg0KKipTdGFuZGFyZCBFcnJvcjoqKg0KDQokJA0KU0UgPSBcZnJhY3tzfXtcc3FydHtufX0NCj0gXGZyYWN7MC4zODd9e1xzcXJ0ezEwfX0NClxhcHByb3ggMC4xMjINCiQkDQoNCioqU3RhdGlzdGlrIHQ6KioNCg0KJCQNCnQgPSBcZnJhY3tcYmFye3h9IC0gXG11XzB9e1NFfQ0KPSBcZnJhY3s5Ljg2IC0gMTB9ezAuMTIyfQ0KPSBcZnJhY3stMC4xNH17MC4xMjJ9DQpcYXBwcm94IC0xLjE1DQokJA0KDQotIERlcmFqYXQga2ViZWJhc2FuOg0KDQokJA0KZGYgPSBuIC0gMSA9IDEwIC0gMSA9IDkNCiQkDQoqKnAtdmFsdWU6KioNCg0KLSBVbnR1ayB1amkgZHVhIGFyYWgsIGRlbmdhbjoNCg0KJCQNCnQgPSAtMS4xNSwgXHF1YWQgZGYgPSA5DQokJA0KDQokJA0KcFx0ZXh0ey12YWx1ZX0gXGFwcHJveCAwLjI4DQokJA0KDQotLS0NCg0KIyMjICpLZXB1dHVzYW4gc3RhdGlzdGlrKg0KDQpCYW5kaW5na2FuICoqUC12YWx1ZSoqIGRlbmdhbiB0aW5na2F0IHNpZ25pZmlrYW5zaSAoJFxhbHBoYSQpOg0KDQotICoqUC12YWx1ZSAoMC4yOCkgPiAkXGFscGhhJCAoMC4wNSkqKi4NCg0KLSAqKktlcHV0dXNhbjogR2FnYWwgVG9sYWsgJEhfMCQqKi4NCg0KLSAqKktlc2ltcHVsYW4qKjogVGlkYWsgYWRhIGJ1a3RpIHN0YXRpc3RpayB5YW5nIGN1a3VwIGt1YXQgdW50dWsgbWVueWF0YWthbiBiYWh3YSByYXRhLXJhdGEgd2FrdHUgcGVueWVsZXNhaWFuIHR1Z2FzIGJlcmJlZGEgZGFyaSAkMTAkIG1lbml0Lg0KDQotLS0NCg0KIyMjICpQZW5nYXJ1aCBVa3VyYW4gU2FtcGVsIHRlcmhhZGFwIEtlYW5kYWxhbiBJbmZlcmVuc2lhbCoNCg0KVWt1cmFuIHNhbXBlbCBzYW5nYXQga3J1c2lhbCBkYWxhbSBzdGF0aXN0aWthIGluZmVyZW5zaWFsIGthcmVuYSBiZWJlcmFwYSBhbGFzYW46DQoNCi0gKipNYXJnaW4gb2YgRXJyb3IqKjogU2FtcGVsIHlhbmcgbGViaWggYmVzYXIgKCRuJCkgYWthbiBtZW1wZXJrZWNpbCBzdGFuZGFyZCBlcnJvciAoJHMgLyBcc3FydHtufSQpLCB5YW5nIG1lbWJ1YXQgZXN0aW1hc2kgcmF0YS1yYXRhIG1lbmphZGkgbGViaWggcHJlc2lzaS4NCg0KLSAqKktla3VhdGFuIFN0YXRpc3RpayoqIChTdGF0aXN0aWNhbCBQb3dlcik6IERlbmdhbiBoYW55YSAxMCBwZW5nZ3VuYSwgYWRhIHJpc2lrbyB0aW5nZ2kgdGVyamFkaW55YSAqKkVycm9yIFRpcGUgSUkqKiAoR2FnYWwgbWVub2xhayAkSF8wJCBwYWRhaGFsIHNlYmVuYXJueWEgYWRhIHBlcmJlZGFhbiBueWF0YSkuIFNhbXBlbCBrZWNpbCBtdW5na2luIHRpZGFrIGN1a3VwIHNlbnNpdGlmIHVudHVrIG1lbmRldGVrc2kgcGVyYmVkYWFuIGtlY2lsIGRhbGFtIHBlcmZvcm1hIFVYLg0KDQotICoqRGlzdHJpYnVzaSoqOiBQYWRhIHNhbXBlbCBrZWNpbCwgZGF0YSBoYXJ1cyBiZW5hci1iZW5hciBtZW5kZWthdGkgZGlzdHJpYnVzaSBub3JtYWwgYWdhciB1amktdCB2YWxpZC4gU2VtYWtpbiBiZXNhciBzYW1wZWwsIHNlbWFraW4ga3VhdCBhc3Vtc2kgbm9ybWFsaXRhcyB0ZXJwZW51aGkgYmVya2F0IENlbnRyYWwgTGltaXQgVGhlb3JlbS4NCg0KLS0tDQoNCioqUmluZ2thc2FuIEhhc2lsOioqDQoNCnwgS29tcG9uZW4gICAgICAgICB8IE5pbGFpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCnwgLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwNCnwgVWppICAgICAgICAgICAgICB8IE9uZS1TYW1wbGUgdC1UZXN0ICAgICAgICAgICAgICAgICAgICAgIHwNCnwgUmF0YS1yYXRhIHNhbXBlbCB8IDkuODYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCnwgdC1zdGF0aXN0aWMgICAgICB8IC0xLjE1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCnwgZGYgICAgICAgICAgICAgICB8IDkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCnwgcC12YWx1ZSAgICAgICAgICB8IDAuMjggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCnwgS2VwdXR1c2FuICAgICAgICB8IEdhZ2FsIG1lbm9sYWsgKCRIXzAkKSAgICAgICAgICAgICAgICAgICAgfA0KfCBLZXNpbXB1bGFuICAgICAgIHwgVGlkYWsgYmVyYmVkYSBzaWduaWZpa2FuIGRhcmkgMTAgbWVuaXQgfA0KDQoNCiMgQ2FzZSBTdHVkeSAzIA0KDQojIyBUd28tU2FtcGxlIFQtVGVzdCAoQS9CIFRlc3RpbmcpDQoNClRpbSAqKmFuYWxpc2lzIHByb2R1ayoqIG1lbGFrdWthbiAqKnVqaSBBL0IqKiB1bnR1ayBtZW1iYW5kaW5na2FuICoqZHVyYXNpIHNlc2kgcmF0YS1yYXRhIChtZW5pdCkqKiBhbnRhcmEgZHVhIHZlcnNpIGhhbGFtYW4gYXJhaGFuLg0KDQp8IFZlcnNpb24gfCBTYW1wbGUgU2l6ZSAobikgfCBNZWFuIHwgU3RhbmRhcmQgRGV2aWF0aW9uIHwNCnwtLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS18DQp8IEEgfCAyNSB8IDQuOCB8IDEuMiB8DQp8IEIgfCAyNSB8IDUuNCB8IDEuNCB8DQoNCiMjIFR1Z2FzDQoNCjEuIFJ1bXVza2FuICoqaGlwb3Rlc2lzIG5vbCBkYW4gaGlwb3Rlc2lzIGFsdGVybmF0aWYqKi4NCjIuIElkZW50aWZpa2FzaSAqKmplbmlzIHVqaSB0KiogeWFuZyBkaXBlcmx1a2FuLg0KMy4gSGl0dW5nICoqc3RhdGlzdGlrIHVqaSoqIGRhbiAqKm5pbGFpIHAqKi4NCjQuIFRhcmlrICoqa2VzaW1wdWxhbiBzdGF0aXN0aWsqKiBwYWRhICRcYWxwaGEgPSAwLDA1JC4NCjUuIEludGVycHJldGFzaWthbiBoYXNpbCB1bnR1ayAqKnBlbmdhbWJpbGFuIGtlcHV0dXNhbiBwcm9kdWsqKi4NCg0KLS0tDQoNCiMjIyAqRm9ybXVsYXNpIEhpcG90ZXNpcyoNCg0KS2FyZW5hIGluZ2luIG1lbWJhbmRpbmdrYW4gcmF0YS1yYXRhIGR1YSB2ZXJzaSBkYW4gbWVsaWhhdCBhcGFrYWggYmVyYmVkYSwgbWFrYSBkaWd1bmFrYW4gdWppIGR1YSBhcmFoLg0KDQokJA0KXGJlZ2lue2FsaWduZWR9DQpIXzAgJjogXG11X0EgPSBcbXVfQiBccXVhZCBcdGV4dHsocmF0YS1yYXRhIGR1cmFzaSBzZXNpIHNhbWEpfSBcXA0KSF8xICY6IFxtdV9BIFxuZXEgXG11X0IgXHF1YWQgXHRleHR7KHJhdGEtcmF0YSBkdXJhc2kgc2VzaSBiZXJiZWRhKX0NClxlbmR7YWxpZ25lZH0NCiQkDQoNCi0tLQ0KDQojIyMgKkplbmlzIFVqaSB0IHlhbmcgRGlndW5ha2FuKg0KDQoqKlR3by1TYW1wbGUgdC1UZXN0KiogKEluZGVwZW5kZW50IFNhbXBsZXMpDQoNCioqQWxhc2FuOioqDQoNCi0gRHVhIGtlbG9tcG9rIGluZGVwZW5kZW4gKHVzZXIgdmVyc2kgQSBkYW4gQiBiZXJiZWRhKS4NCg0KLSBTaW1wYW5nYW4gYmFrdSBwb3B1bGFzaSB0aWRhayBkaWtldGFodWkuDQoNCi0gVWt1cmFuIHNhbXBlbCByZWxhdGlmIGtlY2ls4oCTbWVuZW5nYWguDQoNCi0gRGF0YSBudW1lcmlrIChkdXJhc2kgc2VzaSkuDQoNCkRlbmdhbiB2YXJpYW5zIHlhbmcgdGlkYWsgZGlhc3Vtc2lrYW4gc2FtYSwgZGlndW5ha2FuICoqV2VsY2jigJlzIHQtdGVzdCoqIChhbWFuIGRhbiB1bXVtIHVudHVrIEEvQiB0ZXN0aW5nKS4NCg0KLS0tDQoNCiMjIyAqUGVyaGl0dW5nYW4gU3RhdGlzdGlrIHQgZGFuIHAtdmFsdWUqDQoNCioqU3RhbmRhcmQgRXJyb3IgR2FidW5nYW4gKFdlbGNoKToqKg0KDQokJA0KU0UgPSBcc3FydHtcZnJhY3tzX0FeMn17bl9BfSArIFxmcmFje3NfQl4yfXtuX0J9fQ0KPSBcc3FydHtcZnJhY3sxLjJeMn17MjV9ICsgXGZyYWN7MS40XjJ9ezI1fX0NCiQkDQoNCiQkDQpTRSA9IFxzcXJ0e1xmcmFjezEuNDR9ezI1fSArIFxmcmFjezEuOTZ9ezI1fX0NCj0gXHNxcnR7MC4wNTc2ICsgMC4wNzg0fQ0KPSBcc3FydHswLjEzNn0NClxhcHByb3ggMC4zNjkNCiQkDQoNCioqU3RhdGlzdGlrIHQ6KioNCg0KJCQNCnQgPSBcZnJhY3tcYmFye3h9X0EgLSBcYmFye3h9X0J9e1NFfQ0KPSBcZnJhY3s0LjggLSA1LjR9ezAuMzY5fQ0KPSBcZnJhY3stMC42fXswLjM2OX0NClxhcHByb3ggLTEuNjMNCiQkDQoNCioqRGVyYWphdCBLZWJlYmFzYW4gKFdlbGNoKToqKg0KDQokJA0KZGYgXGFwcHJveCA0Nw0KJCQNCg0KKipwLXZhbHVlOioqDQoNCi0gVW50dWsgdWppIGR1YSBhcmFoOg0KDQokJA0KcFx0ZXh0ey12YWx1ZX0gXGFwcHJveCAwLjExDQokJA0KDQotLS0NCg0KIyMjICpLZXNpbXB1bGFuIFN0YXRpc3RpayAoJFxhbHBoYSA9IDAsMDUkKSoNCg0KLSAqKktyaXRlcmlhKio6IEppa2EgUC12YWx1ZSA8IDAsMDUsIHRvbGFrICRIXzAkLiBKaWthIFAtdmFsdWUgPiAwLDA1LCBnYWdhbCB0b2xhayAkSF8wJC4NCg0KLSAqKkhhc2lsKio6IEthcmVuYSAkMCwxMSA+IDAsMDUkLCBtYWthIGtpdGEgR2FnYWwgTWVub2xhayAkSF8wJC4NCg0KLSBTZWNhcmEgc3RhdGlzdGlrLCB0aWRhayBhZGEgcGVyYmVkYWFuIHlhbmcgbnlhdGEgYW50YXJhIGR1cmFzaSBzZXNpIGRpIFZlcnNpIEEgZGFuIFZlcnNpIEIgcGFkYSB0aW5na2F0IGtlcGVyY2F5YWFuICQ5NSUkLg0KDQotLS0NCg0KIyMjICpJbnRlcnByZXRhc2kgdW50dWsgUGVuZ2FtYmlsYW4gS2VwdXR1c2FuIFByb2R1ayoNCg0KTWVza2lwdW4gc2VjYXJhIGFuZ2thIHJhdGEtcmF0YSBWZXJzaSAqKkIgKDUsNCkqKiB0ZXJsaWhhdCBsZWJpaCB0aW5nZ2kgZGFyaXBhZGEgVmVyc2kgKipBICg0LDgpKiosIHVqaSBzdGF0aXN0aWsgbWVudW5qdWtrYW4gYmFod2EgcGVyYmVkYWFuIHRlcnNlYnV0IGtlbXVuZ2tpbmFuIGJlc2FyIGhhbnlhIHRlcmphZGkga2FyZW5hIGZha3RvciBrZWJldHVsYW4gKHZhcmlhc2kgYWNhaykgZGFuIGJ1a2FuIGthcmVuYSBwZXJ1YmFoYW4gZGVzYWluIGhhbGFtYW4uDQoNCioqU2FyYW4gdW50dWsgVGltIFByb2R1azoqKg0KDQotIEphbmdhbiBsYW5nc3VuZyBtZW5nZ2FudGkgc2VsdXJ1aCBoYWxhbWFuIGtlIFZlcnNpIEIga2FyZW5hIGJlbHVtIGFkYSBidWt0aSBrdWF0IGJhaHdhIFZlcnNpIEIgYmVuYXItYmVuYXIgbGViaWggYmFpay4NCg0KLSBQZXJ0aW1iYW5na2FuIHVudHVrIG1lbmFtYmFoIGp1bWxhaCBzYW1wZWwgYWdhciBoYXNpbCB1amkgbGViaWggc2Vuc2l0aWYgKG1lbWlsaWtpIHBvd2VyIHlhbmcgbGViaWggdGluZ2dpKS4NCg0KLSBQZXJpa3NhIG1ldHJpayBsYWluIHNlcGVydGkgY29udmVyc2lvbiByYXRlICh0aW5na2F0IGtvbnZlcnNpKSBzZWJlbHVtIG1lbmdhbWJpbCBrZXB1dHVzYW4gYWtoaXIuDQoNCi0tLQ0KDQoqKlJpbmdrYXNhbiBIYXNpbDoqKg0KDQp8IEtvbXBvbmVuICAgIHwgTmlsYWkgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCnwgLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfA0KfCBKZW5pcyBVamkgICB8IFR3by1TYW1wbGUgdC1UZXN0IChXZWxjaCkgICAgICB8DQp8IHQtc3RhdGlzdGljIHwgLTEuNjMgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCnwgZGYgICAgICAgICAgfCDiiYggNDcgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQp8IHAtdmFsdWUgICAgIHwg4omIIDAuMTEgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCBLZXB1dHVzYW4gICB8IEdhZ2FsIG1lbm9sYWsgKCRIXzAkKSAgICAgICAgICB8DQp8IEtlc2ltcHVsYW4gIHwgVGlkYWsgYWRhIHBlcmJlZGFhbiBzaWduaWZpa2FuIHwNCg0KDQojIENhc2UgU3R1ZHkgNCANCg0KIyMgQ2hpLVNxdWFyZSBUZXN0IG9mIEluZGVwZW5kZW5jZQ0KDQpTZWJ1YWggKipwZXJ1c2FoYWFuIGUtY29tbWVyY2UqKiBtZW1lcmlrc2EgYXBha2FoICoqamVuaXMgcGVyYW5na2F0KiogYmVya2FpdGFuIGRlbmdhbiAqKnByZWZlcmVuc2kgbWV0b2RlIHBlbWJheWFyYW4qKi4NCg0KfCBEZXZpY2UgLyBQYXltZW50IHwgRS1XYWxsZXQgfCBDcmVkaXQgQ2FyZCB8IENhc2ggb24gRGVsaXZlcnkgfA0KfC0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tfA0KfCBNb2JpbGUgfCAxMjAgfCA4MCB8IDUwIHwNCnwgRGVza3RvcCB8IDYwIHwgOTAgfCA0MCB8DQoNCiMjIFR1Z2FzDQoNCjEuIE55YXRha2FuICoqSGlwb3Rlc2lzIE5vbCAoSOKCgCkqKiBkYW4gKipIaXBvdGVzaXMgQWx0ZXJuYXRpZiAoSOKCgSkqKi4NCjIuIElkZW50aWZpa2FzaSAqKnVqaSBzdGF0aXN0aWsgeWFuZyB0ZXBhdCoqLg0KMy4gSGl0dW5nICoqc3RhdGlzdGlrIENoaS1TcXVhcmUgKM+HwrIpKiouDQo0LiBUZW50dWthbiAqKm5pbGFpIHAqKiBwYWRhICRcYWxwaGEgPSAwLDA1JC4NCjUuIEludGVycHJldGFzaWthbiBoYXNpbCBkYWxhbSBrb250ZWtzICoqc3RyYXRlZ2kgcGVtYmF5YXJhbiBkaWdpdGFsKiouDQoNCi0tLQ0KDQojIyMgKkhpcG90ZXNpcyoNCg0KLSAkSF8wJCAoSGlwb3Rlc2lzIE5vbCk6IEplbmlzIHBlcmFuZ2thdCBkYW4gcHJlZmVyZW5zaSBtZXRvZGUgcGVtYmF5YXJhbiBzYWxpbmcgYmViYXMgKHRpZGFrIGFkYSBodWJ1bmdhbikuDQoNCi0gJEhfMSQgKEhpcG90ZXNpcyBBbHRlcm5hdGlmKTogSmVuaXMgcGVyYW5na2F0IGRhbiBwcmVmZXJlbnNpIG1ldG9kZSBwZW1iYXlhcmFuIHNhbGluZyB0ZXJrYWl0IChhZGEgaHVidW5nYW4pLg0KDQotLS0NCg0KIyMjICpVamkgU3RhdGlzdGlrIHlhbmcgRGlndW5ha2FuKg0KDQoqKkNoaS1TcXVhcmUgVGVzdCBvZiBJbmRlcGVuZGVuY2UqKg0KDQoqKkFsYXNhbioqOg0KDQotIER1YSB2YXJpYWJlbCBrYXRlZ29yaWsgKGRldmljZSB0eXBlICYgcGF5bWVudCBtZXRob2QpLg0KDQotIERhdGEgYmVydXBhIGZyZWt1ZW5zaS4NCg0KLSBUdWp1YW4gbWVuZ3VqaSBhc29zaWFzaSwgYnVrYW4gcGVyYmFuZGluZ2FuIG1lYW4uDQoNCi0tLQ0KDQojIyMgKk1lbmdoaXR1bmcgU3RhdGlzdGlrIENoaS1TcXVhcmUgKCRcY2hpXjIkKSoNCg0KKipGcmVrdWVuc2kgSGFyYXBhbiAoRXhwZWN0ZWQgRnJlcXVlbmN5KToqKg0KDQotICoqUnVtdXMgdW11bToqKg0KDQokJA0KRV97aWp9ID0gXGZyYWN7KFx0ZXh0e1RvdGFsIGJhcmlzfSkgXHRpbWVzIChcdGV4dHtUb3RhbCBrb2xvbX0pfXtcdGV4dHtUb3RhbCBrZXNlbHVydWhhbn19DQokJA0KDQotICoqQ29udG9oOioqDQoNCiQkDQpFX3tcdGV4dHtNb2JpbGUsRS1XYWxsZXR9fQ0KPSBcZnJhY3syNTAgXHRpbWVzIDE4MH17NDQwfQ0KXGFwcHJveCAxMDIuMjcNCiQkDQoNCi0gKipUYWJlbCBFeHBlY3RlZCBGcmVxdWVuY2llczoqKg0KDQp8IERldmljZSAvIFBheW1lbnQgfCBFLVdhbGxldCB8IENyZWRpdCBDYXJkIHwgICBDT0QgfA0KfCAtLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLTogfCAtLS0tLS0tLS0tOiB8IC0tLS06IHwNCnwgKipNb2JpbGUqKiAgICAgICB8ICAgMTAyLjI3IHwgICAgICAgOTYuNTkgfCA1MS4xNCB8DQp8ICoqRGVza3RvcCoqICAgICAgfCAgICA3Ny43MyB8ICAgICAgIDczLjQxIHwgMzguODYgfA0KDQoqKkhpdHVuZyDPh8KyOioqDQoNCi0gKipSdW11czoqKg0KDQokJA0KXGNoaV4yID0gXHN1bSBcZnJhY3soTyAtIEUpXjJ9e0V9DQokJA0KDQotICoqUGVyaGl0dW5nYW4gUmluZ2thczoqKg0KDQp8IFNlbCAgICAgICAgICAgICAgICAgfCAgKE/iiJJFKcKyIC8gRSB8DQp8IC0tLS0tLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tOiB8DQp8IE1vYmlsZeKAk0UtV2FsbGV0ICAgICB8ICAgICAgICAzLjA4IHwNCnwgTW9iaWxl4oCTQ3JlZGl0IENhcmQgIHwgICAgICAgIDIuODQgfA0KfCBNb2JpbGXigJNDT0QgICAgICAgICAgfCAgICAgICAgMC4wMyB8DQp8IERlc2t0b3DigJNFLVdhbGxldCAgICB8ICAgICAgICA0LjA1IHwNCnwgRGVza3RvcOKAk0NyZWRpdCBDYXJkIHwgICAgICAgIDMuOTggfA0KfCBEZXNrdG9w4oCTQ09EICAgICAgICAgfCAgICAgICAgMC4wMyB8DQp8ICoqVG90YWwgz4fCsioqICAgICAgICB8ICoq4omIIDE0LjAxKiogfA0KDQokJA0KXGNoaV4yIFxhcHByb3ggMTQuMDENCiQkDQoNCi0tLQ0KDQojIyMgKnAtdmFsdWUgZGFuIEtlcHV0dXNhbioNCg0KKipEZXJhamF0IEtlYmViYXNhbjoqKg0KDQokJA0KZGYgPSAociAtIDEpKGMgLSAxKQ0KPSAoMiAtIDEpKDMgLSAxKQ0KPSAyDQokJA0KDQotICoqTmlsYWkga3JpdGlzIM+HwrIgKM6xID0gMC4wNSwgZGYgPSAyKToqKg0KDQokJA0KXGNoaV4yX3swLjA1LFwsMn0gPSA1Ljk5MQ0KJCQNCg0KLSAqKkthcmVuYToqKg0KDQokJA0KMTQuMDE+NS45OTENCiQkDQoNCi0gKiphdGF1IHNldGFyYSBkZW5nYW46KioNCg0KJCQNCnBcdGV4dHstdmFsdWV9IFxhcHByb3ggMC4wMDA5IDwgMC4wNQ0KJCQNCg0KKipLZXB1dHVzYW46KiogVG9sYWsgJPCdkLtfMCQNCg0KLS0tDQoNCiMjIyAqSW50ZXJwcmV0YXNpIGRhbiBTdHJhdGVnaSBQZW1iYXlhcmFuIERpZ2l0YWwqDQoNCkthcmVuYSBQLXZhbHVlICgkMC4wMDEkKSA8ICQwLjA1JCwga2l0YSBUb2xhayAkSF8wJC4gSW5pIGJlcmFydGkgYWRhIGh1YnVuZ2FuIHlhbmcgc2lnbmlmaWthbiBhbnRhcmEgamVuaXMgcGVyYW5na2F0IHlhbmcgZGlndW5ha2FuIGRlbmdhbiBtZXRvZGUgcGVtYmF5YXJhbiB5YW5nIGRpcGlsaWguDQoNCioqSW50ZXJwcmV0YXNpIFN0cmF0ZWdpczoqKg0KDQotICoqT3B0aW1hc2kgTW9iaWxlKio6IFBlbmdndW5hIG1vYmlsZSBqYXVoIGxlYmloIGNlbmRlcnVuZyBtZW5nZ3VuYWthbiAkRS1XYWxsZXQkIGRpYmFuZGluZ2thbiBuaWxhaSBoYXJhcGFuLiBTdHJhdGVnaSBwZW1hc2FyYW4gaGFydXMgZm9rdXMgcGFkYSBwcm9tbyBjYXNoYmFjayBkb21wZXQgZGlnaXRhbCBraHVzdXMgZGkgYXBsaWthc2kgbW9iaWxlLg0KDQotICoqS2FyYWt0ZXJpc3RpayBEZXNrdG9wKio6IFBlbmdndW5hIGRlc2t0b3AgbGViaWggY29uZG9uZyBrZSBLYXJ0dSBLcmVkaXQuIEluaSBtdW5na2luIGthcmVuYSBsYXlhciBiZXNhciBtZW1iZXJpa2FuIHJhc2EgYW1hbiBsZWJpaCBzYWF0IG1lbWFzdWtrYW4gZGF0YSBrYXJ0dSBhdGF1IHRhcmdldCBhdWRpZW5zIGRlc2t0b3AgbGViaWggbWFwYW4gc2VjYXJhIGZpbmFuc2lhbC4NCg0KLSAqKktlc2ltcHVsYW4qKjogUGVydXNhaGFhbiBoYXJ1cyBtZW1wZXJzb25hbGlzYXNpIHVydXRhbiBtZXRvZGUgcGVtYmF5YXJhbiBkaSBoYWxhbWFuIGNoZWNrb3V0IGJlcmRhc2Fya2FuIHBlcmFuZ2thdCAodXRhbWFrYW4gRS13YWxsZXQgZGkgTW9iaWxlLCB1dGFtYWthbiBLYXJ0dSBLcmVkaXQgZGkgRGVza3RvcCkgdW50dWsgbWVuaW5na2F0a2FuIGtvbnZlcnNpLg0KDQotLS0NCg0KKipSaW5na2FzYW4gSGFzaWw6KioNCg0KfCBLb21wb25lbiAgIHwgTmlsYWkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCAtLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfA0KfCBVamkgICAgICAgIHwgQ2hpLVNxdWFyZSBUZXN0IG9mIEluZGVwZW5kZW5jZSAgICAgfA0KfCDPh8KyICAgICAgICAgfCDiiYggMTQuMDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCnwgZGYgICAgICAgICB8IDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCnwgcC12YWx1ZSAgICB8IOKJiCAwLjAwMDkgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCBLZXB1dHVzYW4gIHwgVG9sYWsgSOKCgCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQp8IEtlc2ltcHVsYW4gfCBEZXZpY2UgJiBwYXltZW50IG1ldGhvZCBiZXJhc29zaWFzaSB8DQoNCg0KIyBDYXNlIFN0dWR5IDUgIA0KDQojIyBUeXBlIEkgYW5kIFR5cGUgSUkgRXJyb3JzIChDb25jZXB0dWFsKQ0KDQpTZWJ1YWggKipzdGFydHVwIGZpbnRlY2gqKiBtZW5ndWppIGFwYWthaCAqKmFsZ29yaXRtYSBkZXRla3NpIHBlbmlwdWFuIGJhcnUqKiBtZW5ndXJhbmdpIHRyYW5zYWtzaSBwZW5pcHVhbi4NCg0KLSAqKkjigoA6KiogQWxnb3JpdG1hIGJhcnUgdGVyc2VidXQgKip0aWRhayBtZW5ndXJhbmdpIHBlbmlwdWFuKiouDQotICoqSOKCgToqKiBBbGdvcml0bWEgYmFydSB0ZXJzZWJ1dCAqKm1lbmd1cmFuZ2kgcGVuaXB1YW4qKi4NCg0KIyMgVHVnYXMNCg0KMS4gSmVsYXNrYW4gKipLZXNhbGFoYW4gVGlwZSBJICjOsSkqKiBkYWxhbSBrb250ZWtzIGluaS4NCjIuIEplbGFza2FuICoqS2VzYWxhaGFuIFRpcGUgSUkgKM6yKSoqIGRhbGFtIGtvbnRla3MgaW5pLg0KMy4gSWRlbnRpZmlrYXNpIGtlc2FsYWhhbiBtYW5hIHlhbmcgKipsZWJpaCBtZXJ1Z2lrYW4gZGFyaSBwZXJzcGVrdGlmIGJpc25pcyoqLg0KNC4gRGlza3VzaWthbiBiYWdhaW1hbmEgKip1a3VyYW4gc2FtcGVsKiogbWVtZW5nYXJ1aGkgS2VzYWxhaGFuIFRpcGUgSUkuDQo1LiBKZWxhc2thbiBodWJ1bmdhbiBhbnRhcmEgKirOsSwgzrIsIGRhbiBrZWt1YXRhbiBzdGF0aXN0aWsqKi4NCg0KLS0tDQoNCiMjIyAqS2VzYWxhaGFuIFRpcGUgSSAoVHlwZSBJIEVycm9yIC8gJFxhbHBoYSQpKg0KDQpLZXNhbGFoYW4gVGlwZSBJIHRlcmphZGkga2V0aWthIGtpdGEgKiptZW5vbGFrICRIXzAkIHBhZGFoYWwgJEhfMCQgYmVuYXIqKi4NCg0KLSAqKkRhbGFtIGtvbnRla3MgaW5pOioqIEFsZ29yaXRtYSBtZW55aW1wdWxrYW4gYmFod2EgaWEgYmVyaGFzaWwgbWVuZ3VyYW5naSBwZW5pcHVhbiwgcGFkYWhhbCBrZW55YXRhYW5ueWEgdGlkYWsgYWRhIHBlcnViYWhhbiBhdGF1IHBlbmd1cmFuZ2FuIHNhbWEgc2VrYWxpLg0KDQotICoqQW5hbG9naToqKiAiQWxhcm0gUGFsc3UiIChGYWxzZSBQb3NpdGl2ZSkuIFBlcnVzYWhhYW4gbWVyYXNhIGJhbmdnYSBkZW5nYW4gc2lzdGVtIGJhcnUgeWFuZyBkaWFuZ2dhcCBlZmVrdGlmLCBuYW11biBhbmdrYSBrZXJ1Z2lhbiBha2liYXQgcGVuaXB1YW4gZGkgbGFwYW5nYW4gdGV0YXAgdGluZ2dpLg0KDQotLS0NCg0KIyMjICpLZXNhbGFoYW4gVGlwZSBJSSAoVHlwZSBJSSBFcnJvciAvICRcYmV0YSQpKg0KDQpLZXNhbGFoYW4gVGlwZSBJSSB0ZXJqYWRpIGtldGlrYSBraXRhIGdhZ2FsICoqbWVub2xhayAkSF8wJCBwYWRhaGFsICRIXzEkIGJlbmFyKiouDQoNCi0gKipEYWxhbSBrb250ZWtzIGluaSoqOiBBbGdvcml0bWEgc2ViZW5hcm55YSBlZmVrdGlmIGRhbGFtIG1lbmd1cmFuZ2kgcGVuaXB1YW4sIHRldGFwaSBoYXNpbCBwZW5ndWppYW4gc3RhdGlzdGlrIG1lbnVuanVra2FuIHRpZGFrIGFkYSBidWt0aSB5YW5nIGN1a3VwIHVudHVrIG1lbnlpbXB1bGthbiBoYWwgdGVyc2VidXQuDQoNCi0gKipBbmFsb2dpKio6ICJHYWdhbCBEZXRla3NpIiAoRmFsc2UgTmVnYXRpdmUpLiBQZXJ1c2FoYWFuIG1lbWJ1YW5nIGFsZ29yaXRtYSB5YW5nIHNlYmVuYXJueWEgYmFndXMga2FyZW5hIG1lbmdpcmEgc2lzdGVtIHRlcnNlYnV0IHRpZGFrIGJlcmd1bmEuDQoNCi0tLQ0KDQojIyMgKktlc2FsYWhhbiBNYW5hIHlhbmcgTGViaWggTWFoYWw/Kg0KDQpEYXJpIHBlcnNwZWt0aWYgYmlzbmlzIGZpbnRlY2gsICoqS2VzYWxhaGFuIFRpcGUgSUkgdW11bW55YSBqYXVoIGxlYmloIG1haGFsKiouDQoNCi0gKipBbGFzYW5ueWEqKjogSmlrYSB0ZXJqYWRpIEtlc2FsYWhhbiBUaXBlIElJLCBwZXJ1c2FoYWFuIGtlaGlsYW5nYW4ga2VzZW1wYXRhbiB1bnR1ayBtZW5naW1wbGVtZW50YXNpa2FuIHNvbHVzaSB5YW5nIGJpc2EgbWVueWVsYW1hdGthbiB1YW5nIGRhcmkgdHJhbnNha3NpIHBlbmlwdWFuLiBCaWF5YSBvcGVyYXNpb25hbCBha2liYXQgZnJhdWQgeWFuZyB0aWRhayB0ZXJ0YW5nYW5pIGJpYXNhbnlhIGphdWggbGViaWggYmVzYXIgZGFyaXBhZGEgYmlheWEgcGVuZ2VtYmFuZ2FuIGFsZ29yaXRtYS4NCg0KLSAqKkRhbXBhayBLZXNhbGFoYW4gVGlwZSBJKio6IEJpYXlhbnlhIGFkYWxhaCB3YWt0dSBkYW4gc3VtYmVyIGRheWEgeWFuZyB0ZXJidWFuZyB1bnR1ayBtZW5lcmFwa2FuIHNpc3RlbSB5YW5nIHRpZGFrIGVmZWt0aWYsIHRldGFwaSByaXNpa28gbGFuZ3N1bmcga2VoaWxhbmdhbiB1YW5nIGthcmVuYSBwZW5pcHVhbiB0ZXRhcCBkYWxhbSBzdGF0dXMgcXVvICh0aWRhayBiZXJ0YW1iYWggYnVydWssIGhhbnlhIHRpZGFrIG1lbWJhaWspLg0KDQotLS0NCg0KIyMjICpQZW5nYXJ1aCBVa3VyYW4gU2FtcGVsIHRlcmhhZGFwIEtlc2FsYWhhbiBUaXBlIElJKg0KDQpVa3VyYW4gc2FtcGVsIG1lbWlsaWtpIGthaXRhbiBlcmF0IGRlbmdhbiAkXGJldGEkOg0KDQotICoqSHVidW5nYW4gQmVyYmFuZGluZyBUZXJiYWxpayoqOiBTZW1ha2luICoqYmVzYXIgdWt1cmFuIHNhbXBlbCoqLCBzZW1ha2luICoqa2VjaWwga2VtdW5na2luYW4gdGVyamFkaSBLZXNhbGFoYW4gVGlwZSBJSSoqLg0KDQotICoqUGVuamVsYXNhbioqOiBTYW1wZWwgeWFuZyBsZWJpaCBiZXNhciBtZW1iZXJpa2FuIGluZm9ybWFzaSB5YW5nIGxlYmloIGRldGFpbCB0ZW50YW5nIHBvcHVsYXNpLCBzZWhpbmdnYSB1amkgc3RhdGlzdGlrIG1lbmphZGkgbGViaWggc2Vuc2l0aWYgZGFsYW0gbWVuZGV0ZWtzaSBwZXJ1YmFoYW4gYXRhdSBlZmVrIGtlY2lsIHNla2FsaXB1bi4gRGVuZ2FuIHNhbXBlbCBiZXNhciwga2l0YSBsZWJpaCBtdWRhaCBtZW1idWt0aWthbiBiYWh3YSBhbGdvcml0bWEgdGVyc2VidXQgYmVuYXItYmVuYXIgYmVrZXJqYS4NCg0KLS0tDQoNCiMjIyAqSHVidW5nYW4gYW50YXJhICRcYWxwaGEsIFxiZXRhJCwgZGFuIFN0YXRpc3RpY2FsIFBvd2VyKg0KDQpLZXRpZ2Ega29uc2VwIGluaSBzYWxpbmcgYmVyaHVidW5nYW4gZGFsYW0ga2VzZWltYmFuZ2FuIHN0YXRpc3RpazoNCg0KLSAqKlRyYWRlLW9mZiAkXGFscGhhJCBkYW4gJFxiZXRhJCoqOiBKaWthIGtpdGEgbWVtcGVya2V0YXQgJFxhbHBoYSQgKG1pc2FsIGRhcmkgMC4wNSBrZSAwLjAxKSB1bnR1ayBtZW5naGluZGFyaSBrZXNhbGFoYW4gInNhbGFoIHR1ZHVoIiwgbWFrYSBwcm9iYWJpbGl0YXMgJFxiZXRhJCBiaWFzYW55YSBha2FuIG1lbmluZ2thdC4gS2l0YSBtZW5qYWRpIHRlcmxhbHUgYmVyaGF0aS1oYXRpIHNlaGluZ2dhIGdhZ2FsIG1lbGloYXQgZWZlayB5YW5nIG55YXRhLg0KDQotICoqU3RhdGlzdGljYWwgUG93ZXIgKCQxIC0gXGJldGEkKSoqOiBQb3dlciBhZGFsYWgga2VtYW1wdWFuIHVqaSBzdGF0aXN0aWsgdW50dWsgbWVuZGV0ZWtzaSBlZmVrIGppa2EgZWZlayBpdHUgbWVtYW5nIGFkYSAobWVub2xhayAkSF8wJCB5YW5nIHNhbGFoKS4NCg0KLSAqKkh1YnVuZ2FuKio6IE1lbmluZ2thdGthbiAkXGFscGhhJCBha2FuIG1lbmluZ2thdGthbiBQb3dlciwgTWVuaW5na2F0a2FuIHVrdXJhbiBzYW1wZWwgYWthbiBtZW5pbmdrYXRrYW4gUG93ZXIgZGFuIG1lbnVydW5rYW4gJFxiZXRhJC4NCg0KLS0tDQoNCioqUmluZ2thc2FuIGtvbnNlcDoqKg0KDQp8IEtvbnNlcCAgICAgICAgICAgIHwgTWFrbmEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQp8IC0tLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8DQp8IFR5cGUgSSBFcnJvciAozrEpICB8IE1lbmdhbmdnYXAgYWxnb3JpdG1hIGVmZWt0aWYgcGFkYWhhbCB0aWRhayAgICAgICAgICAgICAgfA0KfCBUeXBlIElJIEVycm9yICjOsikgfCBNZW5nYW5nZ2FwIGFsZ29yaXRtYSB0aWRhayBlZmVrdGlmIHBhZGFoYWwgZWZla3RpZiAgICAgIHwNCnwgUG93ZXIgKDHiiJLOsikgICAgICAgfCBLZW1hbXB1YW4gbWVuZGV0ZWtzaSBhbGdvcml0bWEgeWFuZyBiZW5hci1iZW5hciBlZmVrdGlmIHwNCnwgU2FtcGxlIFNpemUgICAgICAgfCBNZW51cnVua2FuIM6yLCBtZW5haWtrYW4gcG93ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQoNCg0KIyBDYXNlIFN0dWR5IDYgDQoNCiMjIFAtVmFsdWUgYW5kIFN0YXRpc3RpY2FsIERlY2lzaW9uIE1ha2luZw0KDQpFdmFsdWFzaSBtb2RlbCBwcmVkaWtzaSBjaHVybiBtZW5naGFzaWxrYW4gaGFzaWwgc2ViYWdhaSBiZXJpa3V0Og0KDQotIFN0YXRpc3RpayB1amkgPSAyLDMxDQotIE5pbGFpIHAgPSAwLDAyMQ0KLSBUaW5na2F0IHNpZ25pZmlrYW5zaTogJFxhbHBoYSA9IDAsMDUkDQoNCiMjIFR1Z2FzDQoNCjEuIEplbGFza2FuICoqbWFrbmEgZGFyaSBuaWxhaSBwLXZhbHVlKiouDQoyLiBCdWF0bGFoICoqa2VwdXR1c2FuIHN0YXRpc3RpayoqLg0KMy4gVGVyamVtYWhrYW4ga2VwdXR1c2FuIHRlcnNlYnV0IGtlIGRhbGFtICoqYmFoYXNhIG5vbi10ZWtuaXMqKiB1bnR1ayBtYW5hamVtZW4uDQo0LiBEaXNrdXNpa2FuIHJpc2lrbyBqaWthICoqc2FtcGVsIHRpZGFrIHJlcHJlc2VudGF0aWYqKi4NCjUuIEplbGFza2FuIG1lbmdhcGEgbmlsYWkgcCAqKnRpZGFrIG1lbmd1a3VyIHVrdXJhbiBlZmVrKiouDQoNCi0tLQ0KDQojIyMgKk1ha25hIHAtdmFsdWUqDQoNClNlY2FyYSB0ZWtuaXMsICoqcC12YWx1ZSA9IDAuMDIxKiogYmVyYXJ0aTogSmlrYSBraXRhIGJlcmFzdW1zaSBiYWh3YSBtb2RlbCB0ZXJzZWJ1dCBzZWJlbmFybnlhIHRpZGFrIG1lbWJlcmlrYW4gZGFtcGFrIChIaXBvdGVzaXMgTm9sIGJlbmFyKSwgbWFrYSBwZWx1YW5nIHVudHVrIG1lbmRhcGF0a2FuIGhhc2lsIHBlbmdhbWF0YW4gc2ViZXNhciAqKjIuMzEqKiBhdGF1IGxlYmloIGVrc3RyZW0gaGFueWEgc2ViZXNhciAkMiwxJSQuDQoNCi0tLQ0KDQojIyMgKktlcHV0dXNhbiBTdGF0aXN0aWsqDQoNCktpdGEgbWVtYmFuZGluZ2thbiAkcC12YWx1ZSQgZGVuZ2FuIHRpbmdrYXQgc2lnbmlmaWthbnNpICgkXGFscGhhJCk6DQoNCi0gKipQZXJiYW5kaW5nYW4qKjogcC12YWx1ZSAoJDAuMDIxJCkgPCAkXGFscGhhJCAoJDAuMDUkKS4NCg0KLSAqKktlcHV0dXNhbjogVG9sYWsgSGlwb3Rlc2lzIE5vbCoqICgkSF8wJCkuDQoNCi0gKipLZXNpbXB1bGFuKio6IEhhc2lsIGluaSBkaWFuZ2dhcCAqKnNpZ25pZmlrYW4gc2VjYXJhIHN0YXRpc3RpayoqLg0KDQotLS0NCg0KIyMjICpCYWhhc2EgTm9uLVRla25pcyB1bnR1ayBNYW5hamVtZW4qDQoNCiJCZXJkYXNhcmthbiBldmFsdWFzaSBrYW1pLCBtb2RlbCBwcmVkaWtzaSBjaHVybiB5YW5nIGJhcnUgaW5pIHRlcmJ1a3RpIGVmZWt0aWYgZGFuIGJ1a2FuIHNla2FkYXIgZmFrdG9yIGtlYmVydW50dW5nYW4uIEFkYSBidWt0aSBrdWF0IGJhaHdhIG1vZGVsIGluaSBkYXBhdCBtZW1iYW50dSBraXRhIG1lbmdpZGVudGlmaWthc2kgcGVsYW5nZ2FuIHlhbmcgYWthbiBiZXJoZW50aSBkZW5nYW4gdGluZ2thdCBha3VyYXNpIHlhbmcgbWVsYW1wYXVpIHN0YW5kYXIga2VzYWxhaGFuIGJpYXNhLiINCg0KLS0tDQoNCiMjIyAqUmlzaWtvIEppa2EgU2FtcGVsIFRpZGFrIFJlcHJlc2VudGF0aWYqDQoNClN0YXRpc3Rpa2EgaW5mZXJlbnNpYWwgc2FuZ2F0IGJlcmdhbnR1bmcgcGFkYSBhc3Vtc2kgYmFod2Egc2FtcGVsIG1lbmNlcm1pbmthbiBwb3B1bGFzaS4gSmlrYSBzYW1wZWwgdGlkYWsgcmVwcmVzZW50YXRpZiAobWlzYWw6IGhhbnlhIG1lbmdhbWJpbCBkYXRhIGRhcmkgcGVsYW5nZ2FuIHByZW1pdW0sIGJ1a2FuIHBlbGFuZ2dhbiB1bXVtKSwgbWFrYSBha2FuIHRlcmphZGk6DQoNCi0gKipCaWFzIFNlbGVrc2kqKjogSGFzaWwgc3RhdGlzdGlrIG11bmdraW4gdGVybGloYXQgYmFndXMsIHRldGFwaSBnYWdhbCBzYWF0IGRpdGVyYXBrYW4gcGFkYSBzZWx1cnVoIGJhc2lzIHBlbGFuZ2dhbi4NCg0KLSAqKkdlbmVyYWxpc2FzaSB5YW5nIFNhbGFoKio6IEtlcHV0dXNhbiBiaXNuaXMgeWFuZyBkaWFtYmlsIChzZXBlcnRpIHN0cmF0ZWdpIGRpc2tvbiBhdGF1IGthbXBhbnllIHJldGVuc2kpIGJpc2Egc2FsYWggc2FzYXJhbiBrYXJlbmEgZGF0YSB0aWRhayBtZW5nZ2FtYmFya2FuIHBlcmlsYWt1IHJhdGEtcmF0YSBwZWxhbmdnYW4uDQoNCi0gKipLZWdhZ2FsYW4gTW9kZWwqKjogUC12YWx1ZSB5YW5nIHJlbmRhaCB0aWRhayBha2FuIGJlcmFydGkgYXBhLWFwYSBqaWthIGRhdGEgaW5wdXRueWEgY2FjYXQ7IG1vZGVsIGFrYW4gbWVtYmVyaWthbiBwcmVkaWtzaSB5YW5nIHRpZGFrIGFrdXJhdCBkaSBkdW5pYSBueWF0YS4NCg0KLS0tDQoNCiMjIyAqTWVuZ2FwYSBQLVZhbHVlIFRpZGFrIE1lbmd1a3VyIFVrdXJhbiBFZmVrIChFZmZlY3QgU2l6ZSk/Kg0KDQpJbmkgYWRhbGFoIHBvaW4ga3J1c2lhbDogKipTaWduaWZpa2Fuc2kgc3RhdGlzdGlrICRcbmVxJCBTaWduaWZpa2Fuc2kgcHJha3RpcyoqLg0KDQotIFAtdmFsdWUgaGFueWEgbWVtYmVyaSB0YWh1IGtpdGEgYXBha2FoIGFkYSBwZXJiZWRhYW4vZWZlayAoWWEgYXRhdSBUaWRhaykuDQoNCi0gRWZmZWN0IFNpemUgbWVtYmVyaSB0YWh1IGtpdGEgc2ViZXJhcGEgYmVzYXIgcGVyYmVkYWFuIHRlcnNlYnV0Lg0KDQoqKkFuYWxvZ2kqKjogTWlzYWxrYW4gc2VidWFoIGthbXBhbnllIGJhcnUgbWVudXJ1bmthbiBhbmdrYSBjaHVybiBzZWJlc2FyICQwLDAxJSQuIERlbmdhbiBqdW1sYWggZGF0YSB5YW5nIHNhbmdhdCBiZXNhciAoanV0YWFuIHBlbGFuZ2dhbiksIHAtdmFsdWUgYmlzYSBtZW5qYWRpIHNhbmdhdCBrZWNpbCAoc2lnbmlmaWthbiBzZWNhcmEgc3RhdGlzdGlrKS4gTmFtdW4sIHNlY2FyYSBiaXNuaXMsIHBlbnVydW5hbiAkMCwwMSUkIG11bmdraW4gdGVybGFsdSBrZWNpbCB1bnR1ayBkaWFuZ2dhcCBiZXJtYW5mYWF0IG1lbmdpbmdhdCBiaWF5YSBrYW1wYW55ZW55YS4gUC12YWx1ZSBtZW51bmp1a2thbiBtb2RlbCBpdHUgYmVrZXJqYSwgdGV0YXBpIHRpZGFrIG1lbnVuanVra2FuIGFwYWthaCBrZXVudHVuZ2FuIGZpbmFuc2lhbG55YSBzZWJhbmRpbmcgZGVuZ2FuIHVzYWhhbnlhLg0KDQotLS0NCg0KKipSaW5na2FzYW46KioNCg0KfCBUYXNrICAgICAgICAgICAgICAgICAgfCBKYXdhYmFuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCnwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8DQp8IE1ha25hIHAtdmFsdWUgICAgICAgICB8IFByb2JhYmlsaXRhcyBoYXNpbCBla3N0cmVtIGppa2EgSOKCgCBiZW5hciB8DQp8IEtlcHV0dXNhbiAgICAgICAgICAgICB8IFRvbGFrIEjigoAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQp8IEJhaGFzYSBtYW5hamVtZW4gICAgICB8IE1vZGVsIGJhcnUgbWVtYW5nIGxlYmloIGJhaWsgICAgICAgICAgICAgfA0KfCBSaXNpa28gc2FtcGVsIGJpYXMgICAgfCBLZXNpbXB1bGFuIG1lbnllc2F0a2FuIGRpIHByb2R1a3NpICAgICAgIHwNCnwgcC12YWx1ZSDiiaAgZWZmZWN0IHNpemUgfCBUaWRhayBtZW5ndWt1ciBiZXNhcm55YSBkYW1wYWsgICAgICAgICAgIHwNCg0KIyBSZWZlcmVuc2kNCg0KLSBodHRwczovL3d3dy5iaW9zdGF0Lmpoc3BoLmVkdS9+aXJ1Y3ppbnMvdGVhY2hpbmcvYm9va3MvMjAxOS5vcGVuaW50cm8uc3RhdGlzdGljcy5wZGY/dXRtX3NvdXJjZT1jaGF0Z3B0LmNvbQ0KDQotIGh0dHBzOi8vYXNzZXRzLm9wZW5zdGF4Lm9yZy9vc2Ntcy1wcm9kY21zL21lZGlhL2RvY3VtZW50cy9JbnRyb2R1Y3RvcnlTdGF0aXN0aWNzLU9QX2k2dEFJN2UucGRmP3V0bV9zb3VyY2U9Y2hhdGdwdC5jb20NCg0KLSBodHRwczovL2VwcmludHMubWVyY3VidWFuYS15b2d5YS5hYy5pZC9pZC9lcHJpbnQvNjY2Ny8xL0J1a3UtQWphcl9EYXNhci1EYXNhci1TdGF0aXN0aWstUGVuZWxpdGlhbi5wZGY/dXRtX3NvdXJjZT1jaGF0Z3B0LmNvbQ0KDQoNCg0KDQo=