Statistical Inferences

Assignment Week 14

Angelica Florentina M.

52250063

Student Majoring in Data Science at Institut Teknologi Sains Bandung

1 Case Study 1

One-Sample Z-Test (Statistical Hypotheses)

A digital learning platform claims that the average daily study time of its users is 120 minutes. Based on historical records, the population standard deviation is known to be 15 minutes.

A random sample of 64 users shows an average study time of 116 minutes.

\[μ₀ = 120\] \[σ= 15\] \[n = 64\] \[\bar {x} = 116\]

Tasks

  1. Formulate the Null Hypothesis (H₀) and Alternative Hypothesis (H₁).

  2. Identify the appropriate statistical test and justify your choice.

  3. Compute the test statistic and p-value using α=0.05

  4. State the statistical decision.

  5. Interpret the result in a business analytics context.

1.1 Formulate Hypothesis

Pengujian hipotesis ini dilakukan untuk mengevaluasi klaim platform pembelajaran digital yang menyatakan bahwa rata-rata waktu belajar harian pengguna adalah 120 menit. Berdasarkan data sampel yang diperoleh, pengujian bertujuan untuk mengetahui apakah rata-rata waktu belajar pengguna sesuai atau berbeda secara signifikan dari nilai yang diklaim tersebut. Oleh karena itu, pengujian dilakukan menggunakan uji dua arah dengan perumusan hipotesis sebagai berikut:

Hipotesis Nol (H₀):

H₀ : μ = 120 Artinya, rata-rata waktu belajar harian pengguna platform pembelajaran digital adalah 120 menit.

Hipotesis Alternatif (H₁):

H₁ : μ ≠ 120 Artinya, rata-rata waktu belajar harian pengguna platform pembelajaran digital tidak sama dengan 120 menit.

1.2 Identify Statistical

Uji statistik yang digunakan dalam penelitian ini adalah Uji Z Satu Sampel (One-Sample Z-Test). Uji ini digunakan untuk menguji apakah rata-rata sampel berbeda secara signifikan dari rata-rata populasi yang telah ditentukan sebelumnya.

Pemilihan uji Z didasarkan pada beberapa pertimbangan, yaitu simpangan baku populasi diketahui (σ = 15 menit), ukuran sampel (n = 64), serta tujuan pengujian adalah membandingkan rata-rata sampel dengan nilai klaim perusahaan sebesar 120 menit. Pengujian dilakukan pada tingkat signifikansi α = 0,05 dengan uji dua arah, sesuai dengan bentuk hipotesis alternatif.

1.3 Calculations

Rumus Uji Z-Score \[Z = \frac{\bar{x} - \mu_0}{\sigma / \sqrt{n}}\] \[\begin{align} Z &= \frac{116 - 120}{15 / 8} \\ &= \frac{-4}{15/8} \\ &= \frac{-4}{1{,}875} \\ &= -2{,}13 \end{align} \]

P-Value

\[\begin{align} \text{P-value} &= 2 \times P(Z \leq -2,13) \\ &\approx 2 \times 0,0165 \\ &= 0,033 \end{align} \]

1.4 Statistical Decision

  • Tingkat signifikansi: α = 0,05

  • P-Value = 0,033

Karena P-Value < α:

\[0,033 < 0,05 \quad \Longrightarrow \quad \text{Tolak } H_0\]

1.5 Interpretation

Berdasarkan hasil Uji Z Satu Sampel:

  • Z-Score = −2,13

  • P-Value = 0,033 < 0,05

  • Keputusan: Tolak H₀

Makna Statistik

Hasil ini menunjukkan bahwa rata-rata waktu belajar harian pengguna secara signifikan berbeda dari klaim perusahaan sebesar 120 menit.

Makna Bisnis / Analitik

  • Rata-rata aktual pengguna = 116 menit, lebih rendah dari klaim 120 menit.

  • Klaim perusahaan bahwa pengguna belajar 120 menit per hari tidak sepenuhnya akurat.

  • Implikasi bagi platform pembelajaran digital:

    1. Perlu mengevaluasi strategi engagement untuk meningkatkan waktu belajar.

    2. Menyesuaikan target konten atau aktivitas belajar.

    3. Mempertimbangkan strategi pemasaran atau kampanye edukasi untuk mendorong penggunaan lebih aktif.

1.6 Table Conclusions

Parameter Nilai / Hasil
Rata-rata populasi (μ₀) 120 menit
Rata-rata sampel (x̄) 116 menit
Simpangan baku populasi (σ) 15 menit
Ukuran sampel (n) 64
Z-Statistic −2,13
P-Value (dua arah) 0,033
Keputusan statistik Tolak H₀

2 Case Study 2

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

A UX Research Team investigates whether the average task completion time of a new application differs from 10 minutes.

The following data are collected from 10 users:

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

Tasks

  1. Define H₀ and H₁ (two-tailed).

  2. Determine the appropriate hypothesis test.

  3. Calculate the t-statistic and p-value at α=0.05

  4. Make a statistical decision.

  5. Explain how sample size affects inferential reliability.

2.1 Formulate Hypothesis

Perumusan hipotesis dilakukan untuk menguji klaim bahwa rata-rata waktu penyelesaian tugas aplikasi baru adalah 10 menit. Dengan data sampel dari 10 pengguna, tujuan pengujian adalah menentukan apakah rata-rata waktu aktual berbeda secara signifikan dari nilai yang diklaim. Karena kita ingin mengetahui perbedaan ke arah mana pun, pengujian dilakukan dengan uji dua arah.

H₀ : μ = 10 (Rata-rata waktu penyelesaian tugas = 10 menit)

H₁ : μ ≠ 10 (Rata-rata waktu penyelesaian tugas ≠ 10 menit)

2.2 Identify Statistical

Dalam kasus ini, simpangan baku populasi tidak diketahui dan ukuran sampel kecil (n = 10 < 30). Oleh karena itu, uji t satu sampel (One-Sample T-Test) digunakan untuk menguji apakah rata-rata waktu penyelesaian tugas berbeda dari nilai klaim 10 menit. Alasannya:

  • Simpangan baku populasi tidak diketahui

  • Ukuran sampel kecil (n = 10 < 30)

  • Tujuan: membandingkan rata-rata sampel dengan nilai tertentu

  • Uji dua arah digunakan karena hipotesis alternatif menyatakan bahwa rata-rata tidak sama dengan 10 menit.

2.3 Calculations

Menghitung rata-rata sampel

\[\begin{align} \bar{x} &= \frac{\sum_{i=1}^{10} x_i}{10} \\ &= \frac{9,2 + 10,5 + 9,8 + 10,1 + 9,6 + 10,3 + 9,9 + 9,7 + 10,0 + 9,5}{10} \\ &= \frac{98,6}{10} \\ &= 9,86 \end{align} \]

Menghitung simpangan baku sampel (s)

\[\begin{align} s &= \sqrt{\frac{\sum_{i=1}^{n} (x_i - \bar{x})^2}{n-1}} \\ &= \sqrt{\frac{(9,2-9,86)^2 + (10,5-9,86)^2 + \dots + (9,5-9,86)^2}{10-1}} \\ &= \sqrt{\frac{1,344}{9}} \\ &= \sqrt{0,1493} \\ &\approx 0,386 \end{align} \]

Menghitung t-statistic

\[\begin{align} t &= \frac{\bar{x} - \mu_0}{s / \sqrt{n}} \\ &= \frac{9,86 - 10}{0,386 / \sqrt{10}} \\ &= \frac{-0,14}{0,386 / 3,162} \\ &= \frac{-0,14}{0,122} \\ &\approx -1,15 \end{align} \]

Menghitung P-Value

  • (df) = n − 1 = 10 − 1 = 9

  • Dari tabel t, t = −1,15, df = 9, dua arah

\[\text{P-value} \approx 0,28\]

2.4 Statistical Decision

  • α = 0,05

  • P-Value = 0,28

Karena P-Value > α:

\[0,28 > 0,05 \quad \Longrightarrow \quad \text{Gagal menolak } H_0\]

2.5 Interpretation

Berdasarkan perhitungan t-statistic = −1,15 dan P-Value = 0,28 > 0,05, keputusan statistik adalah gagal menolak H₀.

Maknanya:

  • Tidak terdapat bukti statistik yang cukup untuk menyatakan bahwa rata-rata waktu penyelesaian tugas berbeda dari 10 menit.

  • Dengan kata lain, rata-rata waktu pengguna mendekati klaim 10 menit, sehingga aplikasi memenuhi ekspektasi rata-rata waktu penyelesaian tugas.

  • Dalam konteks bisnis atau UX: keputusan ini menunjukkan bahwa performa aplikasi sesuai dengan standar yang diharapkan, sehingga tidak diperlukan perubahan signifikan terkait waktu penyelesaian tugas.

Pengaruh Ukuran Sampel terhadap Reliabilitas Inferensi

  1. Sampel kecil (n < 30):
  • Estimasi rata-rata dan simpangan baku lebih tidak stabil.

  • Interval kepercayaan menjadi lebih lebar, sehingga keputusan statistik cenderung kurang andal.

  • Lebih rentan terhadap outlier atau variasi ekstrem dalam data.

  1. Sampel besar (n ≥ 30):
  • Estimasi rata-rata lebih stabil dan mendekati distribusi normal.

  • Interval kepercayaan lebih sempit, sehingga keputusan statistik lebih tepat dan andal.

  • Memberikan kekuatan uji (power) lebih tinggi untuk mendeteksi perbedaan nyata.

2.6 Table Conclusions

Parameter Nilai / Hasil
Rata-rata klaim (μ₀) 10 menit
Rata-rata sampel (x̄) 9,86
Sampel SD (s) 0,386
Ukuran sampel (n) 10
T-Statistic −1,15
Derajat bebas (df) 9
P-Value (dua arah) 0,28
Keputusan statistik Gagal menolak H₀

3 Case Study 3

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

A product analytics team conducts an A/B test to compare the average session duration (minutes) between two versions of a landing page.

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

Tasks

  1. Formulate the null and alternative hypotheses.

  2. Identify the type of t-test required.

  3. Compute the test statistic and p-value.

  4. Draw a statistical conclusion at α=0.05

  5. Interpret the result for product decision-making.

3.1 Formulate Hypothesis

Perumusan hipotesis dilakukan untuk menguji klaim apakah dua versi landing page memiliki durasi sesi rata-rata yang berbeda. Dengan data dari dua kelompok independen (versi A dan versi B), tujuan pengujian adalah menentukan apakah perbedaan rata-rata yang diamati signifikan secara statistik atau hanya akibat variasi sampel.

Hipotesis Nol (H₀):

𝜇𝐴=𝜇𝐵

Rata-rata durasi sesi antara versi A dan B tidak berbeda.

Hipotesis Alternatif (H₁):

𝜇𝐴≠𝜇𝐵

Rata-rata durasi sesi antara versi A dan B berbeda secara signifikan.

3.2 Identify Statistical

Dalam kasus ini, tim product analytics ingin membandingkan rata-rata durasi sesi antara dua versi landing page (A dan B).

Alasan pemilihan uji statistik:

  • Dua sampel independen → data dari dua kelompok pengguna yang berbeda.

  • Simpangan baku populasi tidak diketahui → harus menggunakan distribusi t, bukan Z.

  • Ukuran sampel relatif kecil (n = 25 untuk masing-masing versi) → distribusi t lebih tepat daripada distribusi normal.

  • Tujuan: menguji apakah rata-rata durasi sesi berbeda antara dua versi → uji dua arah (two-tailed test).

Jenis uji -> Independent two-sample t-test

3.3 Calculations

Diketahui:

\[\bar{x}_A = 4,8, \quad \bar{x}_B = 5,4\] \[s_A = 1,2, \quad s_B = 1,4\] \[n_A = n_B = 25\]

Menghitung pooled standar deviasi

\[\begin{align} s_A^2 &= 1,2^2 = 1,44 \\ s_B^2 &= 1,4^2 = 1,96 \\ s_p &= \sqrt{\frac{(n_A-1)s_A^2 + (n_B-1)s_B^2}{n_A + n_B - 2}} \\ &= \sqrt{\frac{(25-1) × 1,44 + (25-1) × 1,96}{25+25-2}} \\ &= \sqrt{\frac{24 × 1,44 + 24 × 1,96}{48}} \\ &= \sqrt{\frac{34,56 + 47,04}{48}} \\ &= \sqrt{\frac{81,6}{48}} \\ &= \sqrt{1,7} \\ &\approx 1,303 \end{align} \]

Menghitung t-statistic

\[\begin{align} t &= \frac{\bar{x}_A - \bar{x}_B}{s_p \sqrt{\frac{1}{n_A} + \frac{1}{n_B}}} \\ &= \frac{4,8 - 5,4}{1,303 \sqrt{\frac{1}{25} + \frac{1}{25}}} \\ &= \frac{-0,6}{1,303 \sqrt{0,04 + 0,04}} \\ &= \frac{-0,6}{1,303 \sqrt{0,08}} \\ &= \frac{-0,6}{1,303 × 0,283} \\ &= \frac{-0,6}{0,368} \\ &\approx -1,63 \end{align}\]

Menentukan df

\[\text{df} = n_A + n_B - 2 = 25 + 25 - 2 = 48\]

Menentukan P-Value

  • Uji dua arah, df = 48

  • Dari tabel, t = −1,63

→ P-Value ≈ 0,11

3.4 Statistical Decision

  • t-Statistic = −1,63

  • P-Value ≈ 0,11

  • α = 0,05

\[0,11 > 0,05 \quad \Longrightarrow \quad \text{Gagal menolak } H_0\]

3.5 Interpretation

  • t-Statistic = −1,63

  • P-Value ≈ 0,11 > α = 0,05

  • Keputusan statistik: Gagal menolak H₀

Maknanya:

  • Tidak ada bukti yang cukup untuk menyatakan bahwa rata-rata durasi sesi berbeda antara versi A dan B.

  • Secara statistik, rata-rata durasi sesi versi A (4,8 menit) dan versi B (5,4 menit) dianggap sama.

Interpretasi untuk Pengambilan Keputusan Produk

  1. Efektivitas landing page:
  • Perubahan desain pada versi B tidak meningkatkan durasi sesi secara signifikan dibanding versi A.
  1. Prioritas tim produk:
  • Fokus bisa dialihkan ke metrik lain seperti konversi, klik tombol, retensi pengguna, karena durasi sesi tidak menunjukkan perbedaan yang nyata.
  1. Rencana eksperimen selanjutnya:
  • Jika ingin mendeteksi perbedaan kecil di masa depan, perlu sampel lebih besar agar uji lebih sensitif (lebih tinggi power).

  • Tidak perlu melakukan perubahan drastis pada versi B hanya berdasarkan durasi sesi saat ini.

Kesimpulan bisnis:

  • Kedua versi landing page cukup setara dalam hal durasi sesi.

  • Keputusan pengembangan produk bisa didasarkan pada faktor lain selain durasi sesi.

3.6 Table Conclusions

Parameter Nilai / Hasil
Rata-rata versi A (x̄₁) 4,8 menit
Rata-rata versi B (x̄₂) 5,4 menit
Pooled SD (sₚ) 1,303
Ukuran sampel 25 (A), 25 (B)
T-Statistic −1,63
Derajat bebas (df) 48
P-Value (dua arah) 0,11
Keputusan statistik Gagal menolak H₀

4 Case Study 4

Chi-Square Test of Independence

An e-commerce company examines whether device type is associated with payment method preference.

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

Tasks

  1. State the Null Hypothesis (H₀) and Alternative Hypothesis (H₁).

  2. Identify the appropriate statistical test.

  3. Compute the Chi-Square statistic (χ²).

  4. Determine the p-value at α=0.05

  5. Interpret the results in terms of digital payment strategy.

4.1 Formulate Hypothesis

Perumusan hipotesis bertujuan untuk mengetahui apakah dua variabel kategori saling berhubungan. Dalam kasus ini:

  • Variabel 1: Tipe perangkat (Mobile, Desktop)

  • Variabel 2: Metode pembayaran (E-Wallet, Credit Card, Cash on Delivery)

Hipotesis diuji dengan uji dua arah untuk melihat apakah ada keterkaitan antara perangkat dan preferensi pembayaran.

Hipotesis Nol (H₀):

\[\text {Tipe perangkat tidak berhubungan dengan preferensi metode pembayaran.}\]

Artinya: distribusi metode pembayaran sama untuk Mobile dan Desktop.

Hipotesis Alternatif (H₁):

\[\text {Tipe perangkat berhubungan dengan preferensi metode pembayaran.}\]

Artinya: distribusi metode pembayaran berbeda tergantung tipe perangkat.

4.2 Identify Statistical

Chi-Square Test of Independence digunakan untuk menentukan apakah dua variabel kategorikal saling berhubungan atau independen.

Dalam kasus ini:

  • Variabel 1: Tipe perangkat (Mobile / Desktop)

  • Variabel 2: Metode pembayaran (E-Wallet / Credit Card / Cash on Delivery)

Uji ini membantu perusahaan mengetahui apakah preferensi metode pembayaran berbeda berdasarkan tipe perangkat.

Alasan Memilih Uji Ini

  • Kedua variabel kategori / nominal → tidak bisa menggunakan uji t atau Z.

  • Data berupa frekuensi (jumlah pengguna) → cocok dengan distribusi Chi-Square.

  • Tujuan: menguji hubungan atau ketergantungan antar variabel, bukan rata-rata atau angka kontinu.

4.3 Calculations

Menghitung total baris & kolom

Total Mobile = 120 + 80 + 50 = 250

Total Desktop = 60 + 90 + 40 = 190

Total E-Wallet = 120 + 60 = 180

Total Credit Card = 80 + 90 = 170

Total Cash on Delivery = 50 + 40 = 90

Total keseluruhan (N) = 250 + 190 = 440

Menghitung frekuensi harapan (Expected Value)

Rumus:

\[E = \frac{(\text{Total Baris}) \times (\text{Total Kolom})}{\text{Total Keseluruhan}}\]

1. Mobile - E-wallet

\[E = \frac{250 \times{180}}{440} = \frac{45000}{440} = 102.27\]

2. Mobile - Kart kredit

\[E = \frac{250 \times{170}}{440} = \frac{42500}{440} = 96.59\]

3. Mobile - COD

\[E = \frac{250 \times{90}}{440} = \frac{22500}{440} = 51.14\]

4. Desktop - E-wallet

\[E = \frac{190 \times{180}}{440} = \frac{34200}{440} = 77.73\]

5. Desktop - Kartu kredit

\[E = \frac{190 \times{170}}{440} = \frac{32300}{440} = 73.41\]

6. Desktop - COD

\[E = \frac{190 \times{90}}{440} = \frac{17100}{440} = 38.86\]

Tabel Frekuensi Harapan (E)

Perangkat E-Wallet Kartu Kredit COD
Mobile 102,27 96,59 51,14
Desktop 77,73 73,41 38,86

Menghitung Chi-Square (χ²)

Rumus:

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

1. Mobile - E-wallet

\[\frac{(120 - 102.27)^2}{102.27} = \frac{(17.73)^2}{102.27} = \frac{314.35}{102.27} = 3.07\]

2. Mobile - Kartu kredit

\[\frac{(80 - 96.59)^2}{96.59} = \frac{(-16.59)^2}{96.59} = \frac{275.22}{96.59} = 2.85\]

3. Mobile - COD

\[\frac{(50 - 51.14)^2}{51.14} = \frac{(-1.14)^2}{51.14} = \frac{1.30}{51.14} = 0.03\]

4. Desktop - E-wallet

\[\frac{(60 - 77.73)^2}{77.73} = \frac{(-17.73)^2}{77.73} = \frac{314.35}{77.73} = 4.04\]

5. Desktop - Kartu kredit

\[\frac{(90 - 73.41)^2}{73.41} = \frac{(16.59)^2}{73.41} = \frac{275.22}{73.41} = 3.75\]

6. Desktop - COD

\[\frac{(40 - 38.86)^2}{38.86} = \frac{(1.14)^2}{38.86} = \frac{1.30}{38.86} = 0.03\]

Tabel Chi-Square

Sel Nilai χ²
Mobile – E-Wallet 3,07
Mobile – Kartu Kredit 2,85
Mobile – COD 0,03
Desktop – E-Wallet 4,04
Desktop – Kartu Kredit 3,75
Desktop – COD 0,03

Menjumlahkan semua nilai

\[\chi^2 = 3.07 + 2.85 + 0.03 + 4.04 + 3.75 + 0.03 = 13.77\]

Menghitung df

\[\begin{align} df &= (\text{jumlah baris} - 1)(\text{jumlah kolom} - 1) \\ &= (2 - 1)(3 - 1) \\ &= 2 \end{align}\]

4.4 Statistical Decision

  • χ² hitung = 13,77

  • df = 2

  • α = 0,05

  • χ² tabel (df=2, α=0,05) ≈ 5,99

Karena:

\[13,77>5,99\]

Hipotesis nol ditolak

4.5 Interpretation

Interpretasi Hasil Statistik

Berdasarkan perhitungan uji Chi-Square Independensi, Penolakan H₀ berarti bahwa:

  • Jenis perangkat (mobile dan desktop) tidak bersifat independen terhadap

  • Preferensi metode pembayaran (E-Wallet, kartu kredit, COD)

Dengan kata lain:

Terdapat hubungan yang signifikan secara statistik antara jenis perangkat dan metode pembayaran yang dipilih pengguna.

Interpretasi dalam strategi pembayaran digital

Hasil statistik tersebut memiliki implikasi penting bagi strategi bisnis e-commerce, khususnya dalam pengelolaan dan pengembangan metode pembayaran digital.

Mobile → E-Wallet: Optimalkan promo dan kemudahan pembayaran lewat aplikasi mobile.

Desktop → Kartu Kredit: Fokus pada keamanan, kenyamanan, dan opsi cicilan.

COD → Stabil: Tetap tersedia sebagai opsi tambahan, tidak perlu prioritas.

Intinya: Strategi pembayaran harus disesuaikan dengan jenis perangkat untuk meningkatkan kenyamanan dan konversi transaksi.

4.6 Table Conclusions

Perangkat Metode Pembayaran Observasi (O) Harapan (E) (O - E) (O - E)² (O - E)² / E
Mobile E-Wallet 120 102,27 17,73 314,35 3,07
Mobile Kartu Kredit 80 96,59 -16,59 275,22 2,85
Mobile COD 50 51,14 -1,14 1,30 0,03
Desktop E-Wallet 60 77,73 -17,73 314,35 4,04
Desktop Kartu Kredit 90 73,41 16,59 275,22 3,75
Desktop COD 40 38,86 1,14 1,30 0,03
Total χ² 13,77

5 Case Study 5

Type I and Type II Errors (Conceptual)

A fintech startup tests whether a new fraud detection algorithm reduces fraudulent transactions.

  • H₀: The new algorithm does not reduce fraud.

  • H₁: The new algorithm reduces fraud.

Tasks

  1. Explain a Type I Error (α) in this context.

  2. Explain a Type II Error (β) in this context.

  3. Identify which error is more costly from a business perspective.

  4. Discuss how sample size affects Type II Error.

  5. Explain the relationship between α, β, and statistical power.

5.1 Type I Error

Definisi: Type I Error adalah kesalahan menolak H0 padahal H0 benar. Dalam konteks algoritma deteksi penipuan, ini berarti mengklaim bahwa algoritma baru berhasil mengurangi fraud ketika pada kenyataannya tidak ada pengurangan fraud yang nyata. Efek praktisnya adalah perubahan operasional yang tidak perlu, misalnya mengubah model atau parameter yang menyebabkan peningkatan alarm palsu atau biaya operasional tanpa manfaat aktual.

Contoh praktis: Setelah implementasi algoritma baru, jumlah transaksi ditandai sebagai fraud meningkat secara artifisial karena perubahan ambang deteksi, meski tingkat penipuan sebenarnya tidak berkurang. Hal ini bisa menimbulkan gangguan pengalaman pelanggan dan biaya penanganan false alarm.

5.2 Type II Error

Definisi: Type II Error adalah gagal menolak H0 padahal Ha benar. Dalam konteks ini berarti algoritma baru sebenarnya lebih efektif dalam mengurangi fraud, namun uji statistik gagal menunjukkan efek tersebut. Efeknya: keliru mempertahankan status quo, kehilangan peluang pengurangan fraud, potensi kerugian finansial, serta kerusakan reputasi jika fraud tetap tinggi.

Contoh praktis: Fraud rate menurun secara nyata setelah perubahan, tetapi uji hipotesis tidak punya cukup kekuatan untuk membuktikan perbedaan signifikan. Akibatnya, perusahaan tidak mengacak perubahan yang seharusnya diterapkan, sehingga potensi penghematan biaya dan peningkatan keamanan tidak terealisasikan.

5.3 Identify Which Error

Dalam konteks fintech dan algoritma deteksi fraud:

Type I Error (α): Menganggap algoritma efektif padahal tidak efektif.

Dampak: biaya untuk pengembangan, implementasi, dan pelatihan algoritma sia-sia.

Fraud tetap terjadi seperti sebelumnya, tapi perusahaan sudah mengeluarkan biaya tambahan.

Type II Error (β): Menganggap algoritma tidak efektif padahal sebenarnya efektif.

Dampak: fraud yang sebenarnya bisa dicegah tetap terjadi, menimbulkan kerugian finansial nyata.

Perusahaan melewatkan kesempatan untuk mengurangi fraud dan meningkatkan keamanan transaksi.

Kesimpulan Bisnis

Dari perspektif bisnis fintech, Type II Error biasanya lebih mahal daripada Type I Error, karena kerugian akibat fraud yang tidak dicegah bisa jauh lebih besar daripada biaya implementasi algoritma yang gagal.

Kesimpulan: Lebih baik menghindari melewatkan algoritma yang efektif (Type II) meskipun ada risiko salah menganggap algoritma efektif (Type I), tetapi kedua jenis kesalahan perlu diminimalkan sesuai kebijakan risiko bisnis dan tolok ukur biaya/risiko yang spesifik.

5.4 Influence of Sample Size

Pengaruh Ukuran Sampel terhadap Type II Error (β)

  • Type II Error (β) terjadi ketika kita gagal menolak H₀ padahal H₁ benar—dalam konteks ini, menganggap algoritma tidak efektif padahal sebenarnya efektif.

  • Salah satu faktor utama yang memengaruhi β adalah ukuran sampel.

Bagaimana ukuran sampel mempengaruhi β?

  1. Ukuran sampel besar → Type II Error menurun
  • Data lebih representatif dan variabilitas lebih kecil.

  • Algoritma yang benar-benar efektif lebih mudah dideteksi.

  • Probabilitas “false negative” (tidak mendeteksi algoritma efektif) lebih rendah.

  1. Ukuran sampel kecil → Type II Error meningkat
  • Data kurang representatif, fluktuasi acak lebih besar.

  • Algoritma yang sebenarnya efektif bisa terlewat karena efeknya tidak terlihat signifikan secara statistik.

  • Probabilitas “false negative” lebih tinggi.

Semakin besar sampel → hasil uji statistik lebih akurat → peluang mendeteksi algoritma yang efektif meningkat → β menurun → statistical power meningkat.

5.5 Relationship

Definisi Dasar

  1. α (Alpha / Type I Error)
  • Probabilitas menolak H₀ padahal H₀ benar.

  • Dalam konteks fintech: menganggap algoritma efektif padahal tidak efektif.

  1. β (Beta / Type II Error)
  • Probabilitas gagal menolak H₀ padahal H₁ benar.

  • Dalam konteks fintech: menganggap algoritma tidak efektif padahal sebenarnya efektif.

  1. Statistical Power
  • Power = 1 – β

  • Probabilitas mendeteksi efek nyata (H₁ benar) secara statistik.

  • Dalam konteks fintech: peluang untuk menemukan algoritma yang benar-benar efektif.

Hubungan α, β, dan Power

  1. Trade-off antara α dan β
  • Menurunkan α (membuat uji lebih ketat) → peluang Type I Error berkurang → uji menjadi konservatif.

  • Akibatnya, β bisa meningkat, artinya kemungkinan false negative lebih tinggi.

  • Sebaliknya, menaikkan α → risiko Type I Error meningkat, tapi β menurun → peluang mendeteksi efek nyata lebih besar.

  1. Ukuran sampel mempengaruhi β dan Power
  • Semakin besar ukuran sampel → variabilitas berkurang → β menurun → power meningkat.

  • Semakin kecil ukuran sampel → variabilitas tinggi → β meningkat → power menurun.

  1. Power dan pengambilan keputusan
  • Power tinggi → lebih besar kemungkinan mendeteksi algoritma yang efektif.

  • Power rendah → ada risiko melewatkan algoritma yang benar-benar bermanfaat (Type II Error).

Intinya:

  • α = risiko menyatakan algoritma efektif padahal tidak (Type I)

  • β = risiko melewatkan algoritma yang efektif (Type II)

  • Power = 1 – β = kemampuan uji untuk mendeteksi efek nyata

Ukuran sampel & α memengaruhi β dan power, sehingga desain eksperimen harus seimbang sesuai risiko bisnis.

5.6 Table Conclusions

No Pertanyaan Jawaban Ringkas Poin Penting
1 Jelaskan Type I Error (α) Menolak H₀ padahal H₀ benar. Startup menganggap algoritma efektif padahal tidak. - Menolak H₀ padahal benar
- Algoritma dianggap efektif padahal tidak
- Biaya implementasi sia-sia
2 Jelaskan Type II Error (β) Gagal menolak H₀ padahal H₁ benar. Startup menganggap algoritma tidak efektif padahal sebenarnya efektif. - Gagal mendeteksi efek nyata
- Fraud tetap terjadi
- Kesempatan mengurangi kerugian hilang
3 Error mana lebih mahal Type II Error lebih mahal karena fraud tetap terjadi, kerugian finansial nyata lebih besar dibanding biaya salah implementasi algoritma (Type I). - Type II → kehilangan kesempatan mengurangi fraud
- Type I → biaya implementasi sia-sia
4 Pengaruh ukuran sampel Semakin besar ukuran sampel → β menurun → peluang mendeteksi algoritma efektif meningkat → power meningkat. - Ukuran sampel besar → hasil lebih akurat
- Ukuran sampel kecil → risiko Type II tinggi
5 Hubungan α, β, dan power - α = risiko Type I Error
- β = risiko Type II Error
- Power = 1 – β = kemampuan mendeteksi efek nyata
- Trade-off: menurunkan α bisa menaikkan β; ukuran sampel memengaruhi β dan power
- α dan β saling terkait
- Power meningkat jika β menurun (ukuran sampel besar)
- Desain uji harus seimbang sesuai risiko bisnis

6 Case Study 6

P-Value and Statistical Decision Making

A churn prediction model evaluation yields the following results:

  • Test statistic = 2.31

  • p-value = 0.021

  • Significance level: α = 0.05

Tasks

  1. Explain the meaning of the p-value.

  2. Make a statistical decision.

  3. Translate the decision into non-technical language for management.

  4. Discuss the risk if the sample is not representative.

  5. Explain why the p-value does not measure effect size.

6.1 Definition

Definisi Umum

  • p-value adalah probabilitas mendapatkan hasil yang sama ekstrem atau lebih ekstrem daripada hasil yang diamati, dengan asumsi hipotesis nol (H₀) benar.

  • Dengan kata lain, p-value memberi tahu kita seberapa konsisten data dengan H₀.

Dalam Konteks Model Prediksi Churn

  1. Hipotesis:
  • H₀: Model churn tidak memiliki pengaruh (misalnya, prediksi churn sama baiknya seperti tebakan acak).

  • H₁: Model churn memiliki pengaruh (prediksi churn lebih baik dari acak).

  1. Hasil uji:
  • Test statistic = 2,31

  • p-value = 0,021

Interpretasi:

  • Jika model sebenarnya tidak efektif (H₀ benar), peluang mendapatkan hasil uji se-ekstrem 2,31 hanya 2,1%.

  • Dengan kata lain, hasil ini tidak mungkin terjadi secara kebetulan, sehingga menjadi bukti untuk menolak H₀.

6.2 Statistical Decision

Data yang Diberikan

  • Test statistic = 2,31

  • p-value = 0,021

  • Significance level (α) = 0,05

Langkah-langkah Pengambilan Keputusan

  1. Tentukan Hipotesis
  • H₀: Model churn tidak memiliki pengaruh (tidak lebih baik dari tebakan acak).

  • H₁: Model churn memiliki pengaruh (lebih baik dari tebakan acak).

  1. Bandingkan p-value dengan α
  • α = 0,05 → batas toleransi risiko kesalahan Type I.

  • p-value = 0,021

  1. Terapkan aturan pengambilan keputusan
  • Jika p-value ≤ α, maka tolak H₀.

  • Jika p-value > α, maka gagal menolak H₀.

  1. Hitung atau periksa test statistic (opsional)
  • Test statistic = 2,31 → cukup besar untuk menghasilkan p-value kecil.

  • Konfirmasi: p-value < α → mendukung keputusan menolak H₀.

Keputusan:

  • Karena p-value 0,021 < α 0,05, maka H₀ ditolak.

  • Kesimpulan statistik: Model churn signifikan secara statistik, artinya model memiliki pengaruh nyata dalam memprediksi churn.

6.3 Interpretation of Statistical Decision

Manajemen biasanya tidak menggunakan istilah “p-value” atau “H₀/H₁”. Jadi kita perlu menerjemahkan hasil statistik menjadi arti bisnis nyata:

  1. Fokus pada hasil yang penting bagi bisnis
  • Model churn mampu memprediksi pelanggan yang berpotensi berhenti.

  • Hasil ini tidak terjadi secara kebetulan, artinya model benar-benar memberikan insight yang bermanfaat.

  1. Contoh bahasa sederhana
  • “Berdasarkan analisis data, model prediksi churn ini terbukti bekerja dan dapat digunakan untuk membantu strategi retensi pelanggan.”

  • Atau: “Model ini efektif untuk mengidentifikasi pelanggan yang berisiko berhenti, sehingga tim marketing bisa mengambil tindakan yang tepat.”

  1. Manfaat bagi keputusan bisnis
  • Strategi retensi dapat difokuskan pada pelanggan yang benar-benar berisiko churn.

  • Efisiensi biaya karena tidak semua pelanggan harus diberi insentif.

  • Meningkatkan revenue retention dengan meminimalkan churn.

6.4 Risk

Definisi Sampel Representatif

  • Sampel representatif adalah sampel yang mewakili populasi secara akurat, baik dalam karakteristik, perilaku, maupun distribusi.

  • Dalam konteks churn: sampel harus mencerminkan seluruh pelanggan (usia, lokasi, nilai transaksi, jenis produk, dll).

Masalah Jika Sampel Tidak Representatif

  1. p-value bisa menyesatkan
  • p-value dihitung berdasarkan data sampel.

  • Jika sampel tidak mencerminkan populasi, p-value bisa terlalu rendah atau terlalu tinggi, sehingga:

  • Model terlihat signifikan padahal sebenarnya tidak (false positive)

  • Model terlihat tidak signifikan padahal sebenarnya efektif (false negative)

  1. Keputusan bisnis bisa salah
  • Model diterapkan ke seluruh populasi pelanggan, tetapi hasil prediksi tidak akurat.

  • Misalnya:

  • Model prediksi churn tampak efektif pada sampel, tapi gagal mengenali pelanggan berisiko di populasi nyata.

  • Strategi retensi yang dibuat berdasarkan model bisa menghabiskan biaya tanpa hasil nyata.

  1. Kehilangan insight penting

Pelanggan dengan karakteristik berbeda dari sampel mungkin tidak terdeteksi, sehingga strategi retensi tidak menyasar seluruh segmen berisiko.

6.5 Measure effect Size

Perbedaan p-value dan Effect Size

  1. p-value menunjukkan signifikansi statistik, bukan besar efek
  • p-value = probabilitas data muncul jika H₀ benar.

  • Contoh: p-value = 0,021 → model signifikan secara statistik.

  • Tapi p-value tidak memberitahu seberapa banyak churn yang bisa dicegah atau seberapa efektif model secara praktis.

  1. p-value dipengaruhi oleh ukuran sampel
  • Sampel besar → efek kecil bisa tetap memberikan p-value sangat rendah (signifikan).

  • Sampel kecil → efek besar bisa menghasilkan p-value tinggi (tidak signifikan).

  • Ini menunjukkan p-value tidak selalu mencerminkan kekuatan atau besarnya efek.

  1. Effect size memberikan konteks praktis
  • Untuk mengetahui apakah model cukup bermanfaat bagi bisnis, gunakan ukuran efek:

  • Accuracy, precision, recall, AUC

  • Cohen’s d, odds ratio, R² (tergantung jenis data)

Contoh dalam Konteks Churn

  • Model A memiliki p-value = 0,021 → signifikan

  • Namun, model hanya meningkatkan deteksi churn 1% saja → effect size kecil → manfaat bisnis mungkin minimal

6.6 Table Conclusions

No Pertanyaan Statistik Interpretasi Bisnis / Non-Technical
1 Makna p-value Probabilitas mendapatkan hasil se-ekstrem data yang diamati jika H₀ benar. Contoh: p = 0,021 → ada 2,1% kemungkinan hasil ini terjadi jika H₀ benar. Semakin kecil p-value → semakin tidak konsisten data dengan H₀. Artinya hasil uji bukan kebetulan.
2 Keputusan statistik Bandingkan p-value (0,021) dengan α (0,05). Karena p < α → Tolak H₀. Model churn signifikan. Model churn terbukti secara statistik efektif untuk memprediksi pelanggan berisiko berhenti.
3 Terjemahan untuk manajemen Tolak H₀ berarti model bekerja. “Model prediksi churn ini terbukti efektif dan dapat digunakan untuk strategi retensi pelanggan. Hasil ini tidak terjadi secara kebetulan.”
4 Risiko sampel tidak representatif p-value dihitung dari sampel. Jika sampel tidak representatif → p-value bisa menyesatkan. Model mungkin terlihat efektif pada sampel, tetapi prediksi di populasi nyata bisa tidak akurat, berisiko strategi retensi salah arah.
5 Mengapa p-value bukan ukuran effect size p-value menunjukkan signifikansi statistik, bukan besar efek. Bisa kecil meski efek praktis kecil, tergantung ukuran sampel. Untuk menilai seberapa besar pengaruh model, gunakan effect size / metrics performa (accuracy, precision, recall, AUC). p-value hanya menunjukkan ada efek atau tidak.
LS0tDQp0aXRsZTogIlN0YXRpc3RpY2FsIEluZmVyZW5jZXMiDQpzdWJ0aXRsZTogIkFzc2lnbm1lbnQgV2VlayAxNCINCmF1dGhvcjogIkFuZ2VsaWNhIEZsb3JlbnRpbmEgTS4iDQpkYXRlOiAiYHIgZm9ybWF0KFN5cy5EYXRlKCksICclQiAlZCwgJVknKWAiDQpvdXRwdXQ6DQogIHJtZGZvcm1hdHM6OnJlYWR0aGVkb3duOg0KICAgIHNlbGZfY29udGFpbmVkOiB0cnVlDQogICAgdGh1bWJuYWlsczogdHJ1ZQ0KICAgIGxpZ2h0Ym94OiB0cnVlDQogICAgZ2FsbGVyeTogdHJ1ZQ0KICAgIG51bWJlcl9zZWN0aW9uczogdHJ1ZQ0KICAgIGxpYl9kaXI6IGxpYnMNCiAgICBkZl9wcmludDogInBhZ2VkIg0KICAgIGNvZGVfZm9sZGluZzogInNob3ciDQogICAgY29kZV9kb3dubG9hZDogeWVzDQogICAgY3NzOiAiY29kZS5jc3MiDQotLS0NCg0KDQpgYGB7ciBwcm9maWxlLCBlY2hvPUZBTFNFfQ0KbGlicmFyeShodG1sdG9vbHMpDQpIVE1MKCcNCjxkaXYgY2xhc3M9InByb2ZpbGUtY2FyZCI+DQogIDxkaXY+DQogICAgPGltZyBzcmM9Imh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9hbmdlbGlpZWUvZm90b2FuZ2VsaWNhL21haW4vZm9ybWFsLmpwZyINCiAgICAgICAgIGNsYXNzPSJwcm9maWxlLXBob3RvIj4NCiAgPC9kaXY+DQogIDxkaXY+DQogICAgPGgxIGNsYXNzPSJwcm9maWxlLW5hbWUiPkFuZ2VsaWNhIEZsb3JlbnRpbmEgTS48L2gxPg0KICAgIDxwIHN0eWxlPSJtYXJnaW46IDRweCAwOyBjb2xvcjpibGFjazsiPjUyMjUwMDYzPC9wPg0KICAgIDxwIGNsYXNzPSJwcm9maWxlLWluZm8iPlN0dWRlbnQgTWFqb3JpbmcgaW4gRGF0YSBTY2llbmNlIGF0IEluc3RpdHV0IFRla25vbG9naSBTYWlucyBCYW5kdW5nPC9wPg0KDQogICAgPGRpdiBzdHlsZT0iZGlzcGxheTogZmxleDsgZ2FwOiAxNXB4OyBtYXJnaW4tdG9wOiAxOHB4OyI+DQogICAgICA8YnV0dG9uIGNsYXNzPSJwcm9maWxlLWJ1dHRvbiBidG4tZHMiPlNraWxsZnVsPC9idXR0b24+DQogICAgICA8YnV0dG9uIGNsYXNzPSJwcm9maWxlLWJ1dHRvbiBidG4tc3RhdHMiPkN1cmlvdXM8L2J1dHRvbj4NCiAgICAgIDxidXR0b24gY2xhc3M9InByb2ZpbGUtYnV0dG9uIGJ0bi1zdGF0czEiPk9yZ2FuaXplZDwvYnV0dG9uPg0KICAgIDwvZGl2Pg0KICA8L2Rpdj4NCjwvZGl2Pg0KJykNCmBgYA0KDQoNCiMgQ2FzZSBTdHVkeSAxDQoNCjxkaXYgY2xhc3M9InBhc3RlbC1ncmVlbi1ib3giPg0KKipPbmUtU2FtcGxlIFotVGVzdCAoU3RhdGlzdGljYWwgSHlwb3RoZXNlcykqKg0KDQpBIGRpZ2l0YWwgbGVhcm5pbmcgcGxhdGZvcm0gY2xhaW1zIHRoYXQgdGhlIGF2ZXJhZ2UgZGFpbHkgc3R1ZHkgdGltZSBvZiBpdHMgdXNlcnMgaXMgMTIwIG1pbnV0ZXMuIEJhc2VkIG9uIGhpc3RvcmljYWwgcmVjb3JkcywgdGhlIHBvcHVsYXRpb24gc3RhbmRhcmQgZGV2aWF0aW9uIGlzIGtub3duIHRvIGJlIDE1IG1pbnV0ZXMuDQoNCkEgcmFuZG9tIHNhbXBsZSBvZiA2NCB1c2VycyBzaG93cyBhbiBhdmVyYWdlIHN0dWR5IHRpbWUgb2YgMTE2IG1pbnV0ZXMuDQoNCiQkzrzigoAgPSAxMjAkJA0KJCTPgz0gMTUkJA0KJCRuID0gNjQkJA0KJCRcYmFyIHt4fSA9IDExNiQkDQoNCg0KKipUYXNrcyoqDQoNCjEuIEZvcm11bGF0ZSB0aGUgTnVsbCBIeXBvdGhlc2lzIChI4oKAKSBhbmQgQWx0ZXJuYXRpdmUgSHlwb3RoZXNpcyAoSOKCgSkuDQoNCjIuIElkZW50aWZ5IHRoZSBhcHByb3ByaWF0ZSBzdGF0aXN0aWNhbCB0ZXN0IGFuZCBqdXN0aWZ5IHlvdXIgY2hvaWNlLg0KDQozLiBDb21wdXRlIHRoZSB0ZXN0IHN0YXRpc3RpYyBhbmQgcC12YWx1ZSB1c2luZyDOsT0wLjA1IA0KDQo0LiBTdGF0ZSB0aGUgc3RhdGlzdGljYWwgZGVjaXNpb24uDQoNCjUuIEludGVycHJldCB0aGUgcmVzdWx0IGluIGEgYnVzaW5lc3MgYW5hbHl0aWNzIGNvbnRleHQuDQo8L2Rpdj4NCg0KIyMgRm9ybXVsYXRlIEh5cG90aGVzaXMNCjxkaXYgY2xhc3M9InBhc3RlbC1ncmVlbi1ib3giPg0KUGVuZ3VqaWFuIGhpcG90ZXNpcyBpbmkgZGlsYWt1a2FuIHVudHVrIG1lbmdldmFsdWFzaSBrbGFpbSBwbGF0Zm9ybSBwZW1iZWxhamFyYW4gZGlnaXRhbCB5YW5nIG1lbnlhdGFrYW4gYmFod2EgcmF0YS1yYXRhIHdha3R1IGJlbGFqYXIgaGFyaWFuIHBlbmdndW5hIGFkYWxhaCAxMjAgbWVuaXQuIEJlcmRhc2Fya2FuIGRhdGEgc2FtcGVsIHlhbmcgZGlwZXJvbGVoLCBwZW5ndWppYW4gYmVydHVqdWFuIHVudHVrIG1lbmdldGFodWkgYXBha2FoIHJhdGEtcmF0YSB3YWt0dSBiZWxhamFyIHBlbmdndW5hIHNlc3VhaSBhdGF1IGJlcmJlZGEgc2VjYXJhIHNpZ25pZmlrYW4gZGFyaSBuaWxhaSB5YW5nIGRpa2xhaW0gdGVyc2VidXQuIE9sZWgga2FyZW5hIGl0dSwgcGVuZ3VqaWFuIGRpbGFrdWthbiBtZW5nZ3VuYWthbiB1amkgZHVhIGFyYWggZGVuZ2FuIHBlcnVtdXNhbiBoaXBvdGVzaXMgc2ViYWdhaSBiZXJpa3V0Og0KDQoqKkhpcG90ZXNpcyBOb2wgKEjigoApOioqDQoNCkjigoAgOiDOvCA9IDEyMA0KQXJ0aW55YSwgcmF0YS1yYXRhIHdha3R1IGJlbGFqYXIgaGFyaWFuIHBlbmdndW5hIHBsYXRmb3JtIHBlbWJlbGFqYXJhbiBkaWdpdGFsIGFkYWxhaCAxMjAgbWVuaXQuDQoNCioqSGlwb3Rlc2lzIEFsdGVybmF0aWYgKEjigoEpOioqDQoNCkjigoEgOiDOvCDiiaAgMTIwDQpBcnRpbnlhLCByYXRhLXJhdGEgd2FrdHUgYmVsYWphciBoYXJpYW4gcGVuZ2d1bmEgcGxhdGZvcm0gcGVtYmVsYWphcmFuIGRpZ2l0YWwgdGlkYWsgc2FtYSBkZW5nYW4gMTIwIG1lbml0Lg0KPC9kaXY+DQoNCiMjIElkZW50aWZ5IFN0YXRpc3RpY2FsDQo8ZGl2IGNsYXNzPSJwYXN0ZWwtZ3JlZW4tYm94Ij4NClVqaSBzdGF0aXN0aWsgeWFuZyBkaWd1bmFrYW4gZGFsYW0gcGVuZWxpdGlhbiBpbmkgYWRhbGFoICoqVWppIFogU2F0dSBTYW1wZWwgKE9uZS1TYW1wbGUgWi1UZXN0KSoqLiBVamkgaW5pIGRpZ3VuYWthbiB1bnR1ayBtZW5ndWppIGFwYWthaCByYXRhLXJhdGEgc2FtcGVsIGJlcmJlZGEgc2VjYXJhIHNpZ25pZmlrYW4gZGFyaSByYXRhLXJhdGEgcG9wdWxhc2kgeWFuZyB0ZWxhaCBkaXRlbnR1a2FuIHNlYmVsdW1ueWEuDQoNClBlbWlsaWhhbiB1amkgWiBkaWRhc2Fya2FuIHBhZGEgYmViZXJhcGEgcGVydGltYmFuZ2FuLCB5YWl0dSAqKnNpbXBhbmdhbiBiYWt1IHBvcHVsYXNpIGRpa2V0YWh1aSAoz4MgPSAxNSBtZW5pdCksICB1a3VyYW4gc2FtcGVsIChuID0gNjQpLCoqIHNlcnRhIHR1anVhbiBwZW5ndWppYW4gYWRhbGFoIG1lbWJhbmRpbmdrYW4gcmF0YS1yYXRhIHNhbXBlbCBkZW5nYW4gKipuaWxhaSBrbGFpbSBwZXJ1c2FoYWFuIHNlYmVzYXIgMTIwIG1lbml0KiouIFBlbmd1amlhbiBkaWxha3VrYW4gcGFkYSB0aW5na2F0IHNpZ25pZmlrYW5zaSAqKs6xID0gMCwwNSoqIGRlbmdhbiAqKnVqaSBkdWEgYXJhaCoqLCBzZXN1YWkgZGVuZ2FuIGJlbnR1ayBoaXBvdGVzaXMgYWx0ZXJuYXRpZi4NCjwvZGl2Pg0KDQojIyBDYWxjdWxhdGlvbnMNCjxkaXYgY2xhc3M9InBhc3RlbC1ncmVlbi1ib3giPg0KKipSdW11cyBVamkgWi1TY29yZSoqDQokJFogPSBcZnJhY3tcYmFye3h9IC0gXG11XzB9e1xzaWdtYSAvIFxzcXJ0e259fSQkDQokJFxiZWdpbnthbGlnbn0NClogJj0gXGZyYWN7MTE2IC0gMTIwfXsxNSAvIDh9IFxcDQogICY9IFxmcmFjey00fXsxNS84fSBcXA0KICAmPSBcZnJhY3stNH17MXssfTg3NX0gXFwNCiAgJj0gLTJ7LH0xMw0KXGVuZHthbGlnbn0NCiAkJA0KDQoqKlAtVmFsdWUqKg0KDQokJFxiZWdpbnthbGlnbn0NClx0ZXh0e1AtdmFsdWV9ICY9IDIgXHRpbWVzIFAoWiBcbGVxIC0yLDEzKSBcXA0KICAgICAgICAgICAgICAgICZcYXBwcm94IDIgXHRpbWVzIDAsMDE2NSBcXA0KICAgICAgICAgICAgICAgICY9IDAsMDMzDQpcZW5ke2FsaWdufQ0KICQkDQo8L2Rpdj4NCg0KIyMgU3RhdGlzdGljYWwgRGVjaXNpb24NCjxkaXYgY2xhc3M9InBhc3RlbC1ncmVlbi1ib3giPg0KLSBUaW5na2F0IHNpZ25pZmlrYW5zaTogzrEgPSAwLDA1DQoNCi0gUC1WYWx1ZSA9IDAsMDMzDQoNCkthcmVuYSAqKlAtVmFsdWUgPCDOsToqKg0KDQokJDAsMDMzIDwgMCwwNSBccXVhZCBcTG9uZ3JpZ2h0YXJyb3cgXHF1YWQgXHRleHR7VG9sYWsgfSBIXzAkJA0KPC9kaXY+DQoNCiMjIEludGVycHJldGF0aW9uDQo8ZGl2IGNsYXNzPSJwYXN0ZWwtZ3JlZW4tYm94Ij4NCkJlcmRhc2Fya2FuIGhhc2lsIFVqaSBaIFNhdHUgU2FtcGVsOg0KDQotIFotU2NvcmUgPSDiiJIyLDEzDQoNCi0gUC1WYWx1ZSA9IDAsMDMzIDwgMCwwNQ0KDQotIEtlcHV0dXNhbjogVG9sYWsgSOKCgA0KDQoqKk1ha25hIFN0YXRpc3RpayoqDQoNCkhhc2lsIGluaSBtZW51bmp1a2thbiBiYWh3YSByYXRhLXJhdGEgd2FrdHUgYmVsYWphciBoYXJpYW4gcGVuZ2d1bmEgc2VjYXJhIHNpZ25pZmlrYW4gYmVyYmVkYSBkYXJpIGtsYWltIHBlcnVzYWhhYW4gc2ViZXNhciAxMjAgbWVuaXQuDQoNCioqTWFrbmEgQmlzbmlzIC8gQW5hbGl0aWsqKg0KDQotIFJhdGEtcmF0YSBha3R1YWwgcGVuZ2d1bmEgPSAxMTYgbWVuaXQsIGxlYmloIHJlbmRhaCBkYXJpIGtsYWltIDEyMCBtZW5pdC4NCg0KLSBLbGFpbSBwZXJ1c2FoYWFuIGJhaHdhIHBlbmdndW5hIGJlbGFqYXIgMTIwIG1lbml0IHBlciBoYXJpIHRpZGFrIHNlcGVudWhueWEgYWt1cmF0Lg0KDQotIEltcGxpa2FzaSBiYWdpIHBsYXRmb3JtIHBlbWJlbGFqYXJhbiBkaWdpdGFsOg0KDQogIDEuIFBlcmx1IG1lbmdldmFsdWFzaSBzdHJhdGVnaSBlbmdhZ2VtZW50IHVudHVrIG1lbmluZ2thdGthbiB3YWt0dSBiZWxhamFyLg0KDQogIDIuIE1lbnllc3VhaWthbiB0YXJnZXQga29udGVuIGF0YXUgYWt0aXZpdGFzIGJlbGFqYXIuDQoNCiAgMy4gTWVtcGVydGltYmFuZ2thbiBzdHJhdGVnaSBwZW1hc2FyYW4gYXRhdSBrYW1wYW55ZSBlZHVrYXNpIHVudHVrIG1lbmRvcm9uZyBwZW5nZ3VuYWFuIGxlYmloIGFrdGlmLg0KPC9kaXY+ICANCg0KIyMgVGFibGUgQ29uY2x1c2lvbnMNCjxkaXYgY2xhc3M9InBhc3RlbC1ncmVlbi1ib3giPg0KDQp8IFBhcmFtZXRlciAgICAgICAgICAgICAgICAgICB8IE5pbGFpIC8gSGFzaWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCnwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfA0KfCBSYXRhLXJhdGEgcG9wdWxhc2kgKM684oKAKSAgICAgfCAxMjAgbWVuaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQp8IFJhdGEtcmF0YSBzYW1wZWwgKHjMhCkgICAgICAgfCAxMTYgbWVuaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQp8IFNpbXBhbmdhbiBiYWt1IHBvcHVsYXNpICjPgykgfCAxNSBtZW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQp8IFVrdXJhbiBzYW1wZWwgKG4pICAgICAgICAgICB8IDY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCnwgWi1TdGF0aXN0aWMgICAgICAgICAgICAgICAgIHwg4oiSMiwxMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQp8IFAtVmFsdWUgKGR1YSBhcmFoKSAgICAgICAgICB8IDAsMDMzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCnwgS2VwdXR1c2FuIHN0YXRpc3RpayAgICAgICAgIHwgVG9sYWsgSOKCgCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQo8L2Rpdj4NCiANCiMgQ2FzZSBTdHVkeSAyDQoNCjxkaXYgY2xhc3M9InBhc3RlbC1tYXJvb24tYm94Ij4NCioqT25lLVNhbXBsZSBULVRlc3QgKM+DIFVua25vd24sIFNtYWxsIFNhbXBsZSkqKg0KDQpBIFVYIFJlc2VhcmNoIFRlYW0gaW52ZXN0aWdhdGVzIHdoZXRoZXIgdGhlIGF2ZXJhZ2UgdGFzayBjb21wbGV0aW9uIHRpbWUgb2YgYSBuZXcgYXBwbGljYXRpb24gZGlmZmVycyBmcm9tIDEwIG1pbnV0ZXMuDQoNClRoZSBmb2xsb3dpbmcgZGF0YSBhcmUgY29sbGVjdGVkIGZyb20gMTAgdXNlcnM6DQoNCiQkOS4yLDEwLjUsOS44LDEwLjEsOS42LDEwLjMsOS45LDkuNywxMC4wLDkuNSQkDQoNCioqVGFza3MqKg0KDQoxLiBEZWZpbmUgSOKCgCBhbmQgSOKCgSAodHdvLXRhaWxlZCkuDQoNCjIuIERldGVybWluZSB0aGUgYXBwcm9wcmlhdGUgaHlwb3RoZXNpcyB0ZXN0Lg0KDQozLiBDYWxjdWxhdGUgdGhlIHQtc3RhdGlzdGljIGFuZCBwLXZhbHVlIGF0IM6xPTAuMDUNCg0KNC4gTWFrZSBhIHN0YXRpc3RpY2FsIGRlY2lzaW9uLg0KDQo1LiBFeHBsYWluIGhvdyBzYW1wbGUgc2l6ZSBhZmZlY3RzIGluZmVyZW50aWFsIHJlbGlhYmlsaXR5Lg0KPC9kaXY+DQoNCiMjIEZvcm11bGF0ZSBIeXBvdGhlc2lzDQo8ZGl2IGNsYXNzPSJwYXN0ZWwtbWFyb29uLWJveCI+DQpQZXJ1bXVzYW4gaGlwb3Rlc2lzIGRpbGFrdWthbiB1bnR1ayBtZW5ndWppIGtsYWltIGJhaHdhIHJhdGEtcmF0YSB3YWt0dSBwZW55ZWxlc2FpYW4gdHVnYXMgYXBsaWthc2kgYmFydSBhZGFsYWggMTAgbWVuaXQuIERlbmdhbiBkYXRhIHNhbXBlbCBkYXJpIDEwIHBlbmdndW5hLCB0dWp1YW4gcGVuZ3VqaWFuIGFkYWxhaCBtZW5lbnR1a2FuIGFwYWthaCByYXRhLXJhdGEgd2FrdHUgYWt0dWFsIGJlcmJlZGEgc2VjYXJhIHNpZ25pZmlrYW4gZGFyaSBuaWxhaSB5YW5nIGRpa2xhaW0uIEthcmVuYSBraXRhIGluZ2luIG1lbmdldGFodWkgcGVyYmVkYWFuIGtlIGFyYWggbWFuYSBwdW4sIHBlbmd1amlhbiBkaWxha3VrYW4gZGVuZ2FuIHVqaSBkdWEgYXJhaC4NCg0KSOKCgCA6IM68ID0gMTANCihSYXRhLXJhdGEgd2FrdHUgcGVueWVsZXNhaWFuIHR1Z2FzID0gMTAgbWVuaXQpDQoNCkjigoEgOiDOvCDiiaAgMTANCihSYXRhLXJhdGEgd2FrdHUgcGVueWVsZXNhaWFuIHR1Z2FzIOKJoCAxMCBtZW5pdCkNCjwvZGl2Pg0KDQojIyBJZGVudGlmeSBTdGF0aXN0aWNhbA0KPGRpdiBjbGFzcz0icGFzdGVsLW1hcm9vbi1ib3giPg0KRGFsYW0ga2FzdXMgaW5pLCBzaW1wYW5nYW4gYmFrdSBwb3B1bGFzaSB0aWRhayBkaWtldGFodWkgZGFuIHVrdXJhbiBzYW1wZWwga2VjaWwgKG4gPSAxMCA8IDMwKS4gT2xlaCBrYXJlbmEgaXR1LCB1amkgdCBzYXR1IHNhbXBlbCAoT25lLVNhbXBsZSBULVRlc3QpIGRpZ3VuYWthbiB1bnR1ayBtZW5ndWppIGFwYWthaCByYXRhLXJhdGEgd2FrdHUgcGVueWVsZXNhaWFuIHR1Z2FzIGJlcmJlZGEgZGFyaSBuaWxhaSBrbGFpbSAxMCBtZW5pdC4gQWxhc2FubnlhOg0KDQotIFNpbXBhbmdhbiBiYWt1IHBvcHVsYXNpIHRpZGFrIGRpa2V0YWh1aQ0KDQotIFVrdXJhbiBzYW1wZWwga2VjaWwgKG4gPSAxMCA8IDMwKQ0KDQotIFR1anVhbjogbWVtYmFuZGluZ2thbiByYXRhLXJhdGEgc2FtcGVsIGRlbmdhbiBuaWxhaSB0ZXJ0ZW50dQ0KDQotIFVqaSBkdWEgYXJhaCBkaWd1bmFrYW4ga2FyZW5hIGhpcG90ZXNpcyBhbHRlcm5hdGlmIG1lbnlhdGFrYW4gYmFod2EgcmF0YS1yYXRhIHRpZGFrIHNhbWEgZGVuZ2FuIDEwIG1lbml0Lg0KPC9kaXY+DQoNCiMjIENhbGN1bGF0aW9ucw0KPGRpdiBjbGFzcz0icGFzdGVsLW1hcm9vbi1ib3giPg0KKipNZW5naGl0dW5nIHJhdGEtcmF0YSBzYW1wZWwqKg0KDQokJFxiZWdpbnthbGlnbn0NClxiYXJ7eH0gJj0gXGZyYWN7XHN1bV97aT0xfV57MTB9IHhfaX17MTB9IFxcDQogICAgICAgICY9IFxmcmFjezksMiArIDEwLDUgKyA5LDggKyAxMCwxICsgOSw2ICsgMTAsMyArIDksOSArIDksNyArIDEwLDAgKyA5LDV9ezEwfSBcXA0KICAgICAgICAmPSBcZnJhY3s5OCw2fXsxMH0gXFwNCiAgICAgICAgJj0gOSw4Ng0KXGVuZHthbGlnbn0NCiAkJA0KDQoqKk1lbmdoaXR1bmcgc2ltcGFuZ2FuIGJha3Ugc2FtcGVsIChzKSoqDQoNCiQkXGJlZ2lue2FsaWdufQ0KcyAmPSBcc3FydHtcZnJhY3tcc3VtX3tpPTF9XntufSAoeF9pIC0gXGJhcnt4fSleMn17bi0xfX0gXFwNCiAgJj0gXHNxcnR7XGZyYWN7KDksMi05LDg2KV4yICsgKDEwLDUtOSw4NileMiArIFxkb3RzICsgKDksNS05LDg2KV4yfXsxMC0xfX0gXFwNCiAgJj0gXHNxcnR7XGZyYWN7MSwzNDR9ezl9fSBcXA0KICAmPSBcc3FydHswLDE0OTN9IFxcDQogICZcYXBwcm94IDAsMzg2DQpcZW5ke2FsaWdufQ0KICQkDQoNCioqTWVuZ2hpdHVuZyB0LXN0YXRpc3RpYyoqDQoNCiQkXGJlZ2lue2FsaWdufQ0KdCAmPSBcZnJhY3tcYmFye3h9IC0gXG11XzB9e3MgLyBcc3FydHtufX0gXFwNCiAgJj0gXGZyYWN7OSw4NiAtIDEwfXswLDM4NiAvIFxzcXJ0ezEwfX0gXFwNCiAgJj0gXGZyYWN7LTAsMTR9ezAsMzg2IC8gMywxNjJ9IFxcDQogICY9IFxmcmFjey0wLDE0fXswLDEyMn0gXFwNCiAgJlxhcHByb3ggLTEsMTUNClxlbmR7YWxpZ259DQogJCQNCg0KKipNZW5naGl0dW5nIFAtVmFsdWUqKg0KDQotIChkZikgPSBuIOKIkiAxID0gMTAg4oiSIDEgPSA5DQoNCi0gRGFyaSB0YWJlbCB0LCB0ID0g4oiSMSwxNSwgZGYgPSA5LCBkdWEgYXJhaA0KDQokJFx0ZXh0e1AtdmFsdWV9IFxhcHByb3ggMCwyOCQkDQo8L2Rpdj4NCg0KIyMgU3RhdGlzdGljYWwgRGVjaXNpb24NCjxkaXYgY2xhc3M9InBhc3RlbC1tYXJvb24tYm94Ij4NCi0gzrEgPSAwLDA1DQoNCi0gUC1WYWx1ZSA9IDAsMjgNCg0KS2FyZW5hICoqUC1WYWx1ZSA+IM6xOioqDQoNCiQkMCwyOCA+IDAsMDUgXHF1YWQgXExvbmdyaWdodGFycm93IFxxdWFkIFx0ZXh0e0dhZ2FsIG1lbm9sYWsgfSBIXzAkJA0KPC9kaXY+DQoNCiMjIEludGVycHJldGF0aW9uDQo8ZGl2IGNsYXNzPSJwYXN0ZWwtbWFyb29uLWJveCI+DQpCZXJkYXNhcmthbiBwZXJoaXR1bmdhbiB0LXN0YXRpc3RpYyA9IOKIkjEsMTUgZGFuIFAtVmFsdWUgPSAwLDI4ID4gMCwwNSwga2VwdXR1c2FuIHN0YXRpc3RpayBhZGFsYWggZ2FnYWwgbWVub2xhayBI4oKALg0KDQoqKk1ha25hbnlhOioqDQoNCi0gVGlkYWsgdGVyZGFwYXQgYnVrdGkgc3RhdGlzdGlrIHlhbmcgY3VrdXAgdW50dWsgbWVueWF0YWthbiBiYWh3YSByYXRhLXJhdGEgd2FrdHUgcGVueWVsZXNhaWFuIHR1Z2FzIGJlcmJlZGEgZGFyaSAxMCBtZW5pdC4NCg0KLSBEZW5nYW4ga2F0YSBsYWluLCByYXRhLXJhdGEgd2FrdHUgcGVuZ2d1bmEgbWVuZGVrYXRpIGtsYWltIDEwIG1lbml0LCBzZWhpbmdnYSBhcGxpa2FzaSBtZW1lbnVoaSBla3NwZWt0YXNpIHJhdGEtcmF0YSB3YWt0dSBwZW55ZWxlc2FpYW4gdHVnYXMuDQoNCi0gRGFsYW0ga29udGVrcyBiaXNuaXMgYXRhdSBVWDoga2VwdXR1c2FuIGluaSBtZW51bmp1a2thbiBiYWh3YSBwZXJmb3JtYSBhcGxpa2FzaSBzZXN1YWkgZGVuZ2FuIHN0YW5kYXIgeWFuZyBkaWhhcmFwa2FuLCBzZWhpbmdnYSB0aWRhayBkaXBlcmx1a2FuIHBlcnViYWhhbiBzaWduaWZpa2FuIHRlcmthaXQgd2FrdHUgcGVueWVsZXNhaWFuIHR1Z2FzLg0KDQoqKlBlbmdhcnVoIFVrdXJhbiBTYW1wZWwgdGVyaGFkYXAgUmVsaWFiaWxpdGFzIEluZmVyZW5zaSoqDQoNCjEuIFNhbXBlbCBrZWNpbCAobiA8IDMwKToNCg0KICAtIEVzdGltYXNpIHJhdGEtcmF0YSBkYW4gc2ltcGFuZ2FuIGJha3UgbGViaWggdGlkYWsgc3RhYmlsLg0KDQogIC0gSW50ZXJ2YWwga2VwZXJjYXlhYW4gbWVuamFkaSBsZWJpaCBsZWJhciwgc2VoaW5nZ2Ega2VwdXR1c2FuIHN0YXRpc3RpayBjZW5kZXJ1bmcga3VyYW5nIGFuZGFsLg0KDQogIC0gTGViaWggcmVudGFuIHRlcmhhZGFwIG91dGxpZXIgYXRhdSB2YXJpYXNpIGVrc3RyZW0gZGFsYW0gZGF0YS4NCg0KDQoyLiBTYW1wZWwgYmVzYXIgKG4g4omlIDMwKToNCg0KICAtIEVzdGltYXNpIHJhdGEtcmF0YSBsZWJpaCBzdGFiaWwgZGFuIG1lbmRla2F0aSBkaXN0cmlidXNpIG5vcm1hbC4NCg0KICAtIEludGVydmFsIGtlcGVyY2F5YWFuIGxlYmloIHNlbXBpdCwgc2VoaW5nZ2Ega2VwdXR1c2FuIHN0YXRpc3RpayBsZWJpaCB0ZXBhdCBkYW4gYW5kYWwuDQoNCiAgLSBNZW1iZXJpa2FuIGtla3VhdGFuIHVqaSAocG93ZXIpIGxlYmloIHRpbmdnaSB1bnR1ayBtZW5kZXRla3NpIHBlcmJlZGFhbiBueWF0YS4NCjwvZGl2Pg0KDQojIyBUYWJsZSBDb25jbHVzaW9ucw0KPGRpdiBjbGFzcz0icGFzdGVsLW1hcm9vbi1ib3giPg0KDQp8IFBhcmFtZXRlciAgICAgICAgICAgICB8IE5pbGFpIC8gSGFzaWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCnwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfA0KfCBSYXRhLXJhdGEga2xhaW0gKM684oKAKSAgfCAxMCBtZW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQp8IFJhdGEtcmF0YSBzYW1wZWwgKHjMhCkgfCA5LDg2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCBTYW1wZWwgU0QgKHMpICAgICAgICAgfCAwLDM4NiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQp8IFVrdXJhbiBzYW1wZWwgKG4pICAgICB8IDEwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCnwgVC1TdGF0aXN0aWMgICAgICAgICAgIHwg4oiSMSwxNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQp8IERlcmFqYXQgYmViYXMgKGRmKSAgICB8IDkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCnwgUC1WYWx1ZSAoZHVhIGFyYWgpICAgIHwgMCwyOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCBLZXB1dHVzYW4gc3RhdGlzdGlrICAgfCBHYWdhbCBtZW5vbGFrIEjigoAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCg0KPC9kaXY+DQoNCiMgQ2FzZSBTdHVkeSAzDQoNCjxkaXYgY2xhc3M9InBhc3RlbC1ibHVlLWJveCI+DQoqKlR3by1TYW1wbGUgVC1UZXN0IChBL0IgVGVzdGluZykqKg0KDQpBIHByb2R1Y3QgYW5hbHl0aWNzIHRlYW0gY29uZHVjdHMgYW4gQS9CIHRlc3QgdG8gY29tcGFyZSB0aGUgYXZlcmFnZSBzZXNzaW9uIGR1cmF0aW9uIChtaW51dGVzKSBiZXR3ZWVuIHR3byB2ZXJzaW9ucyBvZiBhIGxhbmRpbmcgcGFnZS4NCg0KfCBWZXJzaW9uIHwgU2FtcGxlIFNpemUgKG4pIHwgTWVhbiB8IFN0YW5kYXJkIERldmlhdGlvbiB8DQp8IC0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0gfCAtLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tIHwNCnwgQSAgICAgICB8IDI1ICAgICAgICAgICAgICB8IDQuOCAgfCAxLjIgICAgICAgICAgICAgICAgfA0KfCBCICAgICAgIHwgMjUgICAgICAgICAgICAgIHwgNS40ICB8IDEuNCAgICAgICAgICAgICAgICB8DQoNCg0KKipUYXNrcyoqDQoNCjEuIEZvcm11bGF0ZSB0aGUgbnVsbCBhbmQgYWx0ZXJuYXRpdmUgaHlwb3RoZXNlcy4NCg0KMi4gSWRlbnRpZnkgdGhlIHR5cGUgb2YgdC10ZXN0IHJlcXVpcmVkLg0KDQozLiBDb21wdXRlIHRoZSB0ZXN0IHN0YXRpc3RpYyBhbmQgcC12YWx1ZS4NCg0KNC4gRHJhdyBhIHN0YXRpc3RpY2FsIGNvbmNsdXNpb24gYXQgzrE9MC4wNQ0KDQo1LiBJbnRlcnByZXQgdGhlIHJlc3VsdCBmb3IgcHJvZHVjdCBkZWNpc2lvbi1tYWtpbmcuDQo8L2Rpdj4NCg0KIyMgRm9ybXVsYXRlIEh5cG90aGVzaXMNCjxkaXYgY2xhc3M9InBhc3RlbC1ibHVlLWJveCI+DQpQZXJ1bXVzYW4gaGlwb3Rlc2lzIGRpbGFrdWthbiB1bnR1ayBtZW5ndWppIGtsYWltIGFwYWthaCBkdWEgdmVyc2kgbGFuZGluZyBwYWdlIG1lbWlsaWtpIGR1cmFzaSBzZXNpIHJhdGEtcmF0YSB5YW5nIGJlcmJlZGEuIERlbmdhbiBkYXRhIGRhcmkgZHVhIGtlbG9tcG9rIGluZGVwZW5kZW4gKHZlcnNpIEEgZGFuIHZlcnNpIEIpLCB0dWp1YW4gcGVuZ3VqaWFuIGFkYWxhaCBtZW5lbnR1a2FuIGFwYWthaCBwZXJiZWRhYW4gcmF0YS1yYXRhIHlhbmcgZGlhbWF0aSBzaWduaWZpa2FuIHNlY2FyYSBzdGF0aXN0aWsgYXRhdSBoYW55YSBha2liYXQgdmFyaWFzaSBzYW1wZWwuDQoNCioqSGlwb3Rlc2lzIE5vbCAoSOKCgCk6KioNCg0K8J2ch/CdkLQ98J2ch/CdkLUNCg0KUmF0YS1yYXRhIGR1cmFzaSBzZXNpIGFudGFyYSB2ZXJzaSBBIGRhbiBCIHRpZGFrIGJlcmJlZGEuDQoNCioqSGlwb3Rlc2lzIEFsdGVybmF0aWYgKEjigoEpOioqDQoNCvCdnIfwnZC04omg8J2ch/CdkLUNCg0KUmF0YS1yYXRhIGR1cmFzaSBzZXNpIGFudGFyYSB2ZXJzaSBBIGRhbiBCIGJlcmJlZGEgc2VjYXJhIHNpZ25pZmlrYW4uDQo8L2Rpdj4NCg0KIyMgSWRlbnRpZnkgU3RhdGlzdGljYWwNCjxkaXYgY2xhc3M9InBhc3RlbC1ibHVlLWJveCI+DQpEYWxhbSBrYXN1cyBpbmksIHRpbSBwcm9kdWN0IGFuYWx5dGljcyBpbmdpbiBtZW1iYW5kaW5na2FuIHJhdGEtcmF0YSBkdXJhc2kgc2VzaSBhbnRhcmEgZHVhIHZlcnNpIGxhbmRpbmcgcGFnZSAoQSBkYW4gQikuDQoNCioqQWxhc2FuIHBlbWlsaWhhbiB1amkgc3RhdGlzdGlrOioqDQoNCi0gRHVhIHNhbXBlbCBpbmRlcGVuZGVuIOKGkiBkYXRhIGRhcmkgZHVhIGtlbG9tcG9rIHBlbmdndW5hIHlhbmcgYmVyYmVkYS4NCg0KLSBTaW1wYW5nYW4gYmFrdSBwb3B1bGFzaSB0aWRhayBkaWtldGFodWkg4oaSIGhhcnVzIG1lbmdndW5ha2FuIGRpc3RyaWJ1c2kgdCwgYnVrYW4gWi4NCg0KLSBVa3VyYW4gc2FtcGVsIHJlbGF0aWYga2VjaWwgKG4gPSAyNSB1bnR1ayBtYXNpbmctbWFzaW5nIHZlcnNpKSDihpIgZGlzdHJpYnVzaSB0IGxlYmloIHRlcGF0IGRhcmlwYWRhIGRpc3RyaWJ1c2kgbm9ybWFsLg0KDQotIFR1anVhbjogbWVuZ3VqaSBhcGFrYWggcmF0YS1yYXRhIGR1cmFzaSBzZXNpIGJlcmJlZGEgYW50YXJhIGR1YSB2ZXJzaSDihpIgdWppIGR1YSBhcmFoICh0d28tdGFpbGVkIHRlc3QpLg0KDQoqKkplbmlzIHVqaSAtPiBJbmRlcGVuZGVudCB0d28tc2FtcGxlIHQtdGVzdCoqDQo8L2Rpdj4NCg0KIyMgQ2FsY3VsYXRpb25zDQo8ZGl2IGNsYXNzPSJwYXN0ZWwtYmx1ZS1ib3giPg0KRGlrZXRhaHVpOg0KDQokJFxiYXJ7eH1fQSA9IDQsOCwgXHF1YWQgXGJhcnt4fV9CID0gNSw0JCQNCiQkc19BID0gMSwyLCBccXVhZCBzX0IgPSAxLDQkJA0KJCRuX0EgPSBuX0IgPSAyNSQkDQoNCioqTWVuZ2hpdHVuZyBwb29sZWQgc3RhbmRhciBkZXZpYXNpKioNCg0KJCRcYmVnaW57YWxpZ259DQpzX0FeMiAmPSAxLDJeMiA9IDEsNDQgXFwNCnNfQl4yICY9IDEsNF4yID0gMSw5NiBcXA0Kc19wICY9IFxzcXJ0e1xmcmFjeyhuX0EtMSlzX0FeMiArIChuX0ItMSlzX0JeMn17bl9BICsgbl9CIC0gMn19IFxcDQogICAgJj0gXHNxcnR7XGZyYWN7KDI1LTEpIMOXIDEsNDQgKyAoMjUtMSkgw5cgMSw5Nn17MjUrMjUtMn19IFxcDQogICAgJj0gXHNxcnR7XGZyYWN7MjQgw5cgMSw0NCArIDI0IMOXIDEsOTZ9ezQ4fX0gXFwNCiAgICAmPSBcc3FydHtcZnJhY3szNCw1NiArIDQ3LDA0fXs0OH19IFxcDQogICAgJj0gXHNxcnR7XGZyYWN7ODEsNn17NDh9fSBcXA0KICAgICY9IFxzcXJ0ezEsN30gXFwNCiAgICAmXGFwcHJveCAxLDMwMw0KXGVuZHthbGlnbn0NCiAkJA0KDQoqKk1lbmdoaXR1bmcgdC1zdGF0aXN0aWMqKg0KDQokJFxiZWdpbnthbGlnbn0NCnQgJj0gXGZyYWN7XGJhcnt4fV9BIC0gXGJhcnt4fV9CfXtzX3AgXHNxcnR7XGZyYWN7MX17bl9BfSArIFxmcmFjezF9e25fQn19fSBcXA0KICAmPSBcZnJhY3s0LDggLSA1LDR9ezEsMzAzIFxzcXJ0e1xmcmFjezF9ezI1fSArIFxmcmFjezF9ezI1fX19IFxcDQogICY9IFxmcmFjey0wLDZ9ezEsMzAzIFxzcXJ0ezAsMDQgKyAwLDA0fX0gXFwNCiAgJj0gXGZyYWN7LTAsNn17MSwzMDMgXHNxcnR7MCwwOH19IFxcDQogICY9IFxmcmFjey0wLDZ9ezEsMzAzIMOXIDAsMjgzfSBcXA0KICAmPSBcZnJhY3stMCw2fXswLDM2OH0gXFwNCiAgJlxhcHByb3ggLTEsNjMNClxlbmR7YWxpZ259JCQNCg0KKipNZW5lbnR1a2FuIGRmKioNCg0KJCRcdGV4dHtkZn0gPSBuX0EgKyBuX0IgLSAyID0gMjUgKyAyNSAtIDIgPSA0OCQkDQoNCioqTWVuZW50dWthbiBQLVZhbHVlKioNCg0KLSBVamkgZHVhIGFyYWgsIGRmID0gNDgNCg0KLSBEYXJpIHRhYmVsLCB0ID0g4oiSMSw2Mw0KDQoqKuKGkiBQLVZhbHVlIOKJiCAwLDExKioNCjwvZGl2Pg0KDQojIyBTdGF0aXN0aWNhbCBEZWNpc2lvbg0KPGRpdiBjbGFzcz0icGFzdGVsLWJsdWUtYm94Ij4NCi0gdC1TdGF0aXN0aWMgPSDiiJIxLDYzDQoNCi0gUC1WYWx1ZSDiiYggMCwxMQ0KDQotIM6xID0gMCwwNQ0KDQokJDAsMTEgPiAwLDA1IFxxdWFkIFxMb25ncmlnaHRhcnJvdyBccXVhZCBcdGV4dHtHYWdhbCBtZW5vbGFrIH0gSF8wJCQNCjwvZGl2Pg0KDQojIyBJbnRlcnByZXRhdGlvbg0KPGRpdiBjbGFzcz0icGFzdGVsLWJsdWUtYm94Ij4NCi0gdC1TdGF0aXN0aWMgPSDiiJIxLDYzDQoNCi0gUC1WYWx1ZSDiiYggMCwxMSA+IM6xID0gMCwwNQ0KDQotIEtlcHV0dXNhbiBzdGF0aXN0aWs6IEdhZ2FsIG1lbm9sYWsgSOKCgA0KDQoqKk1ha25hbnlhOioqDQoNCi0gVGlkYWsgYWRhIGJ1a3RpIHlhbmcgY3VrdXAgdW50dWsgbWVueWF0YWthbiBiYWh3YSByYXRhLXJhdGEgZHVyYXNpIHNlc2kgYmVyYmVkYSBhbnRhcmEgdmVyc2kgQSBkYW4gQi4NCg0KLSBTZWNhcmEgc3RhdGlzdGlrLCByYXRhLXJhdGEgZHVyYXNpIHNlc2kgdmVyc2kgQSAoNCw4IG1lbml0KSBkYW4gdmVyc2kgQiAoNSw0IG1lbml0KSBkaWFuZ2dhcCBzYW1hLg0KDQoqKkludGVycHJldGFzaSB1bnR1ayBQZW5nYW1iaWxhbiBLZXB1dHVzYW4gUHJvZHVrKioNCg0KMS4gRWZla3Rpdml0YXMgbGFuZGluZyBwYWdlOg0KDQogIC0gUGVydWJhaGFuIGRlc2FpbiBwYWRhIHZlcnNpIEIgdGlkYWsgbWVuaW5na2F0a2FuIGR1cmFzaSBzZXNpIHNlY2FyYSBzaWduaWZpa2FuIGRpYmFuZGluZyB2ZXJzaSBBLg0KDQoyLiBQcmlvcml0YXMgdGltIHByb2R1azoNCg0KICAtIEZva3VzIGJpc2EgZGlhbGloa2FuIGtlIG1ldHJpayBsYWluIHNlcGVydGkga29udmVyc2ksIGtsaWsgdG9tYm9sLCByZXRlbnNpIHBlbmdndW5hLCBrYXJlbmEgZHVyYXNpIHNlc2kgdGlkYWsgbWVudW5qdWtrYW4gcGVyYmVkYWFuIHlhbmcgbnlhdGEuDQoNCjMuIFJlbmNhbmEgZWtzcGVyaW1lbiBzZWxhbmp1dG55YToNCg0KICAtIEppa2EgaW5naW4gbWVuZGV0ZWtzaSBwZXJiZWRhYW4ga2VjaWwgZGkgbWFzYSBkZXBhbiwgcGVybHUgc2FtcGVsIGxlYmloIGJlc2FyIGFnYXIgdWppIGxlYmloIHNlbnNpdGlmIChsZWJpaCB0aW5nZ2kgcG93ZXIpLg0KDQogIC0gVGlkYWsgcGVybHUgbWVsYWt1a2FuIHBlcnViYWhhbiBkcmFzdGlzIHBhZGEgdmVyc2kgQiBoYW55YSBiZXJkYXNhcmthbiBkdXJhc2kgc2VzaSBzYWF0IGluaS4NCg0KKipLZXNpbXB1bGFuIGJpc25pczoqKg0KDQotIEtlZHVhIHZlcnNpIGxhbmRpbmcgcGFnZSBjdWt1cCBzZXRhcmEgZGFsYW0gaGFsIGR1cmFzaSBzZXNpLg0KDQotIEtlcHV0dXNhbiBwZW5nZW1iYW5nYW4gcHJvZHVrIGJpc2EgZGlkYXNhcmthbiBwYWRhIGZha3RvciBsYWluIHNlbGFpbiBkdXJhc2kgc2VzaS4NCjwvZGl2Pg0KDQojIyBUYWJsZSBDb25jbHVzaW9ucw0KPGRpdiBjbGFzcz0icGFzdGVsLWJsdWUtYm94Ij4NCg0KfCBQYXJhbWV0ZXIgICAgICAgICAgICAgICB8IE5pbGFpIC8gSGFzaWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfA0KfCBSYXRhLXJhdGEgdmVyc2kgQSAoeMyE4oKBKSB8IDQsOCBtZW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCBSYXRhLXJhdGEgdmVyc2kgQiAoeMyE4oKCKSB8IDUsNCBtZW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCBQb29sZWQgU0QgKHPigpopICAgICAgICAgIHwgMSwzMDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQp8IFVrdXJhbiBzYW1wZWwgICAgICAgICAgIHwgMjUgKEEpLCAyNSAoQikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQp8IFQtU3RhdGlzdGljICAgICAgICAgICAgIHwg4oiSMSw2MyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCnwgRGVyYWphdCBiZWJhcyAoZGYpICAgICAgfCA0OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCnwgUC1WYWx1ZSAoZHVhIGFyYWgpICAgICAgfCAwLDExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCnwgS2VwdXR1c2FuIHN0YXRpc3RpayAgICAgfCBHYWdhbCBtZW5vbGFrIEjigoAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KDQo8L2Rpdj4NCg0KIyBDYXNlIFN0dWR5IDQNCg0KPGRpdiBjbGFzcz0icGFzdGVsLXB1cnBsZS1ib3giPg0KKipDaGktU3F1YXJlIFRlc3Qgb2YgSW5kZXBlbmRlbmNlKioNCg0KQW4gZS1jb21tZXJjZSBjb21wYW55IGV4YW1pbmVzIHdoZXRoZXIgZGV2aWNlIHR5cGUgaXMgYXNzb2NpYXRlZCB3aXRoIHBheW1lbnQgbWV0aG9kIHByZWZlcmVuY2UuDQoNCg0KfCBEZXZpY2UgLyBQYXltZW50IHwgRS1XYWxsZXQgfCBDcmVkaXQgQ2FyZCB8IENhc2ggb24gRGVsaXZlcnkgfA0KfCAtLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0gfCAtLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0gfA0KfCBNb2JpbGUgICAgICAgICAgIHwgMTIwICAgICAgfCA4MCAgICAgICAgICB8IDUwICAgICAgICAgICAgICAgfA0KfCBEZXNrdG9wICAgICAgICAgIHwgNjAgICAgICAgfCA5MCAgICAgICAgICB8IDQwICAgICAgICAgICAgICAgfA0KDQoNCioqVGFza3MqKg0KDQoxLiBTdGF0ZSB0aGUgTnVsbCBIeXBvdGhlc2lzIChI4oKAKSBhbmQgQWx0ZXJuYXRpdmUgSHlwb3RoZXNpcyAoSOKCgSkuDQoNCjIuIElkZW50aWZ5IHRoZSBhcHByb3ByaWF0ZSBzdGF0aXN0aWNhbCB0ZXN0Lg0KDQozLiBDb21wdXRlIHRoZSBDaGktU3F1YXJlIHN0YXRpc3RpYyAoz4fCsikuDQoNCjQuIERldGVybWluZSB0aGUgcC12YWx1ZSBhdCDOsT0wLjA1DQoNCjUuIEludGVycHJldCB0aGUgcmVzdWx0cyBpbiB0ZXJtcyBvZiBkaWdpdGFsIHBheW1lbnQgc3RyYXRlZ3kuDQo8L2Rpdj4NCg0KIyMgRm9ybXVsYXRlIEh5cG90aGVzaXMNCjxkaXYgY2xhc3M9InBhc3RlbC1wdXJwbGUtYm94Ij4NClBlcnVtdXNhbiBoaXBvdGVzaXMgYmVydHVqdWFuIHVudHVrIG1lbmdldGFodWkgYXBha2FoIGR1YSB2YXJpYWJlbCBrYXRlZ29yaSBzYWxpbmcgYmVyaHVidW5nYW4uIERhbGFtIGthc3VzIGluaToNCg0KLSBWYXJpYWJlbCAxOiBUaXBlIHBlcmFuZ2thdCAoTW9iaWxlLCBEZXNrdG9wKQ0KDQotIFZhcmlhYmVsIDI6IE1ldG9kZSBwZW1iYXlhcmFuIChFLVdhbGxldCwgQ3JlZGl0IENhcmQsIENhc2ggb24gRGVsaXZlcnkpDQoNCkhpcG90ZXNpcyBkaXVqaSBkZW5nYW4gdWppIGR1YSBhcmFoIHVudHVrIG1lbGloYXQgYXBha2FoIGFkYSBrZXRlcmthaXRhbiBhbnRhcmEgcGVyYW5na2F0IGRhbiBwcmVmZXJlbnNpIHBlbWJheWFyYW4uDQoNCioqSGlwb3Rlc2lzIE5vbCAoSOKCgCk6KioNCg0KJCRcdGV4dCB7VGlwZSBwZXJhbmdrYXQgdGlkYWsgYmVyaHVidW5nYW4gZGVuZ2FuIHByZWZlcmVuc2kgbWV0b2RlIHBlbWJheWFyYW4ufSQkDQoNCkFydGlueWE6IGRpc3RyaWJ1c2kgbWV0b2RlIHBlbWJheWFyYW4gc2FtYSB1bnR1ayBNb2JpbGUgZGFuIERlc2t0b3AuDQoNCioqSGlwb3Rlc2lzIEFsdGVybmF0aWYgKEjigoEpOioqDQoNCiQkXHRleHQge1RpcGUgcGVyYW5na2F0IGJlcmh1YnVuZ2FuIGRlbmdhbiBwcmVmZXJlbnNpIG1ldG9kZSBwZW1iYXlhcmFuLn0kJA0KDQpBcnRpbnlhOiBkaXN0cmlidXNpIG1ldG9kZSBwZW1iYXlhcmFuIGJlcmJlZGEgdGVyZ2FudHVuZyB0aXBlIHBlcmFuZ2thdC4NCjwvZGl2Pg0KDQojIyBJZGVudGlmeSBTdGF0aXN0aWNhbA0KPGRpdiBjbGFzcz0icGFzdGVsLXB1cnBsZS1ib3giPg0KQ2hpLVNxdWFyZSBUZXN0IG9mIEluZGVwZW5kZW5jZSBkaWd1bmFrYW4gdW50dWsgbWVuZW50dWthbiBhcGFrYWggZHVhIHZhcmlhYmVsIGthdGVnb3Jpa2FsIHNhbGluZyBiZXJodWJ1bmdhbiBhdGF1IGluZGVwZW5kZW4uDQoNCioqRGFsYW0ga2FzdXMgaW5pOioqDQoNCi0gVmFyaWFiZWwgMTogVGlwZSBwZXJhbmdrYXQgKE1vYmlsZSAvIERlc2t0b3ApDQoNCi0gVmFyaWFiZWwgMjogTWV0b2RlIHBlbWJheWFyYW4gKEUtV2FsbGV0IC8gQ3JlZGl0IENhcmQgLyBDYXNoIG9uIERlbGl2ZXJ5KQ0KDQpVamkgaW5pIG1lbWJhbnR1IHBlcnVzYWhhYW4gbWVuZ2V0YWh1aSBhcGFrYWggcHJlZmVyZW5zaSBtZXRvZGUgcGVtYmF5YXJhbiBiZXJiZWRhIGJlcmRhc2Fya2FuIHRpcGUgcGVyYW5na2F0Lg0KDQoqKkFsYXNhbiBNZW1pbGloIFVqaSBJbmkqKg0KDQotIEtlZHVhIHZhcmlhYmVsIGthdGVnb3JpIC8gbm9taW5hbCDihpIgdGlkYWsgYmlzYSBtZW5nZ3VuYWthbiB1amkgdCBhdGF1IFouDQoNCi0gRGF0YSBiZXJ1cGEgZnJla3VlbnNpIChqdW1sYWggcGVuZ2d1bmEpIOKGkiBjb2NvayBkZW5nYW4gZGlzdHJpYnVzaSBDaGktU3F1YXJlLg0KDQotIFR1anVhbjogbWVuZ3VqaSBodWJ1bmdhbiBhdGF1IGtldGVyZ2FudHVuZ2FuIGFudGFyIHZhcmlhYmVsLCBidWthbiByYXRhLXJhdGEgYXRhdSBhbmdrYSBrb250aW51Lg0KPC9kaXY+DQoNCiMjIENhbGN1bGF0aW9ucw0KPGRpdiBjbGFzcz0icGFzdGVsLXB1cnBsZS1ib3giPg0KKipNZW5naGl0dW5nIHRvdGFsIGJhcmlzICYga29sb20qKg0KDQpUb3RhbCBNb2JpbGUgPSAxMjAgKyA4MCArIDUwID0gMjUwDQoNClRvdGFsIERlc2t0b3AgPSA2MCArIDkwICsgNDAgPSAxOTANCg0KVG90YWwgRS1XYWxsZXQgPSAxMjAgKyA2MCA9IDE4MA0KDQpUb3RhbCBDcmVkaXQgQ2FyZCA9IDgwICsgOTAgPSAxNzANCg0KVG90YWwgQ2FzaCBvbiBEZWxpdmVyeSA9IDUwICsgNDAgPSA5MA0KDQpUb3RhbCBrZXNlbHVydWhhbiAoTikgPSAyNTAgKyAxOTAgPSA0NDANCg0KDQoqKk1lbmdoaXR1bmcgZnJla3VlbnNpIGhhcmFwYW4gKEV4cGVjdGVkIFZhbHVlKSoqDQoNCioqUnVtdXM6KioNCg0KJCRFID0gXGZyYWN7KFx0ZXh0e1RvdGFsIEJhcmlzfSkgXHRpbWVzIChcdGV4dHtUb3RhbCBLb2xvbX0pfXtcdGV4dHtUb3RhbCBLZXNlbHVydWhhbn19JCQNCg0KKioxLiBNb2JpbGUgLSBFLXdhbGxldCoqDQoNCiQkRSA9IFxmcmFjezI1MCBcdGltZXN7MTgwfX17NDQwfSA9IFxmcmFjezQ1MDAwfXs0NDB9ID0gMTAyLjI3JCQNCg0KKioyLiBNb2JpbGUgLSBLYXJ0IGtyZWRpdCoqDQoNCiQkRSA9IFxmcmFjezI1MCBcdGltZXN7MTcwfX17NDQwfSA9IFxmcmFjezQyNTAwfXs0NDB9ID0gOTYuNTkkJA0KDQoqKjMuIE1vYmlsZSAtIENPRCoqDQoNCiQkRSA9IFxmcmFjezI1MCBcdGltZXN7OTB9fXs0NDB9ID0gXGZyYWN7MjI1MDB9ezQ0MH0gPSA1MS4xNCQkDQoNCioqNC4gRGVza3RvcCAtIEUtd2FsbGV0KioNCg0KJCRFID0gXGZyYWN7MTkwIFx0aW1lc3sxODB9fXs0NDB9ID0gXGZyYWN7MzQyMDB9ezQ0MH0gPSA3Ny43MyQkDQoNCioqNS4gRGVza3RvcCAtIEthcnR1IGtyZWRpdCoqDQoNCiQkRSA9IFxmcmFjezE5MCBcdGltZXN7MTcwfX17NDQwfSA9IFxmcmFjezMyMzAwfXs0NDB9ID0gNzMuNDEkJA0KDQoqKjYuIERlc2t0b3AgLSBDT0QqKg0KDQokJEUgPSBcZnJhY3sxOTAgXHRpbWVzezkwfX17NDQwfSA9IFxmcmFjezE3MTAwfXs0NDB9ID0gMzguODYkJA0KDQoqKlRhYmVsIEZyZWt1ZW5zaSBIYXJhcGFuIChFKSoqDQoNCnwgUGVyYW5na2F0IHwgRS1XYWxsZXQgfCBLYXJ0dSBLcmVkaXQgfCBDT0QgICB8DQp8IC0tLS0tLS0tLSB8IC0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tIHwgLS0tLS0gfA0KfCBNb2JpbGUgICAgfCAxMDIsMjcgICB8IDk2LDU5ICAgICAgICB8IDUxLDE0IHwNCnwgRGVza3RvcCAgIHwgNzcsNzMgICAgfCA3Myw0MSAgICAgICAgfCAzOCw4NiB8DQoNCg0KKipNZW5naGl0dW5nIENoaS1TcXVhcmUgKM+HwrIpKioNCg0KKipSdW11czoqKg0KDQokJFxjaGleMiA9IFxzdW0gXGZyYWN7KE8gLSBFKV4yfXtFfSQkDQoNCioqMS4gTW9iaWxlIC0gRS13YWxsZXQqKg0KDQokJFxmcmFjeygxMjAgLSAxMDIuMjcpXjJ9ezEwMi4yN30NCj0gXGZyYWN7KDE3LjczKV4yfXsxMDIuMjd9DQo9IFxmcmFjezMxNC4zNX17MTAyLjI3fQ0KPSAzLjA3JCQNCg0KKioyLiBNb2JpbGUgLSBLYXJ0dSBrcmVkaXQqKg0KDQokJFxmcmFjeyg4MCAtIDk2LjU5KV4yfXs5Ni41OX0NCj0gXGZyYWN7KC0xNi41OSleMn17OTYuNTl9DQo9IFxmcmFjezI3NS4yMn17OTYuNTl9DQo9IDIuODUkJA0KDQoqKjMuIE1vYmlsZSAtIENPRCoqDQoNCiQkXGZyYWN7KDUwIC0gNTEuMTQpXjJ9ezUxLjE0fQ0KPSBcZnJhY3soLTEuMTQpXjJ9ezUxLjE0fQ0KPSBcZnJhY3sxLjMwfXs1MS4xNH0NCj0gMC4wMyQkDQoNCioqNC4gRGVza3RvcCAtIEUtd2FsbGV0KioNCg0KJCRcZnJhY3soNjAgLSA3Ny43MyleMn17NzcuNzN9DQo9IFxmcmFjeygtMTcuNzMpXjJ9ezc3LjczfQ0KPSBcZnJhY3szMTQuMzV9ezc3LjczfQ0KPSA0LjA0JCQNCg0KKio1LiBEZXNrdG9wIC0gS2FydHUga3JlZGl0KioNCg0KJCRcZnJhY3soOTAgLSA3My40MSleMn17NzMuNDF9DQo9IFxmcmFjeygxNi41OSleMn17NzMuNDF9DQo9IFxmcmFjezI3NS4yMn17NzMuNDF9DQo9IDMuNzUkJA0KDQoqKjYuIERlc2t0b3AgLSBDT0QqKg0KDQokJFxmcmFjeyg0MCAtIDM4Ljg2KV4yfXszOC44Nn0NCj0gXGZyYWN7KDEuMTQpXjJ9ezM4Ljg2fQ0KPSBcZnJhY3sxLjMwfXszOC44Nn0NCj0gMC4wMyQkDQoNCioqVGFiZWwgQ2hpLVNxdWFyZSoqDQoNCnwgU2VsICAgICAgICAgICAgICAgICAgICB8IE5pbGFpIM+HwrIgfA0KfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0gfA0KfCBNb2JpbGUg4oCTIEUtV2FsbGV0ICAgICAgfCAzLDA3ICAgICB8DQp8IE1vYmlsZSDigJMgS2FydHUgS3JlZGl0ICB8IDIsODUgICAgIHwNCnwgTW9iaWxlIOKAkyBDT0QgICAgICAgICAgIHwgMCwwMyAgICAgfA0KfCBEZXNrdG9wIOKAkyBFLVdhbGxldCAgICAgfCA0LDA0ICAgICB8DQp8IERlc2t0b3Ag4oCTIEthcnR1IEtyZWRpdCB8IDMsNzUgICAgIHwNCnwgRGVza3RvcCDigJMgQ09EICAgICAgICAgIHwgMCwwMyAgICAgfA0KDQoNCioqTWVuanVtbGFoa2FuIHNlbXVhIG5pbGFpKioNCg0KJCRcY2hpXjINCj0gMy4wNyArIDIuODUgKyAwLjAzICsgNC4wNCArIDMuNzUgKyAwLjAzDQo9IDEzLjc3JCQNCg0KKipNZW5naGl0dW5nIGRmKioNCg0KJCRcYmVnaW57YWxpZ259DQpkZiAmPSAoXHRleHR7anVtbGFoIGJhcmlzfSAtIDEpKFx0ZXh0e2p1bWxhaCBrb2xvbX0gLSAxKSBcXA0KICAgJj0gKDIgLSAxKSgzIC0gMSkgXFwNCiAgICY9IDINClxlbmR7YWxpZ259JCQNCjwvZGl2Pg0KDQojIyBTdGF0aXN0aWNhbCBEZWNpc2lvbg0KPGRpdiBjbGFzcz0icGFzdGVsLXB1cnBsZS1ib3giPg0KLSDPh8KyIGhpdHVuZyA9IDEzLDc3DQoNCi0gZGYgPSAyDQoNCi0gzrEgPSAwLDA1DQoNCi0gz4fCsiB0YWJlbCAoZGY9MiwgzrE9MCwwNSkg4omIIDUsOTkNCg0KKipLYXJlbmE6KioNCg0KJCQxMyw3Nz41LDk5JCQNCg0KKipIaXBvdGVzaXMgbm9sIGRpdG9sYWsqKg0KPC9kaXY+DQoNCiMjIEludGVycHJldGF0aW9uDQo8ZGl2IGNsYXNzPSJwYXN0ZWwtcHVycGxlLWJveCI+DQoqKkludGVycHJldGFzaSBIYXNpbCBTdGF0aXN0aWsqKg0KDQpCZXJkYXNhcmthbiBwZXJoaXR1bmdhbiB1amkgQ2hpLVNxdWFyZSBJbmRlcGVuZGVuc2ksIFBlbm9sYWthbiBI4oKAIGJlcmFydGkgYmFod2E6DQoNCi0gSmVuaXMgcGVyYW5na2F0IChtb2JpbGUgZGFuIGRlc2t0b3ApIHRpZGFrIGJlcnNpZmF0IGluZGVwZW5kZW4gdGVyaGFkYXANCg0KLSBQcmVmZXJlbnNpIG1ldG9kZSBwZW1iYXlhcmFuIChFLVdhbGxldCwga2FydHUga3JlZGl0LCBDT0QpDQoNCkRlbmdhbiBrYXRhIGxhaW46DQoNCl9UZXJkYXBhdCBodWJ1bmdhbiB5YW5nIHNpZ25pZmlrYW4gc2VjYXJhIHN0YXRpc3RpayBhbnRhcmEgamVuaXMgcGVyYW5na2F0IGRhbiBtZXRvZGUgcGVtYmF5YXJhbiB5YW5nIGRpcGlsaWggcGVuZ2d1bmEuXw0KDQoNCioqSW50ZXJwcmV0YXNpIGRhbGFtIHN0cmF0ZWdpIHBlbWJheWFyYW4gZGlnaXRhbCoqDQoNCkhhc2lsIHN0YXRpc3RpayB0ZXJzZWJ1dCBtZW1pbGlraSBpbXBsaWthc2kgcGVudGluZyBiYWdpIHN0cmF0ZWdpIGJpc25pcyBlLWNvbW1lcmNlLCBraHVzdXNueWEgZGFsYW0gcGVuZ2Vsb2xhYW4gZGFuIHBlbmdlbWJhbmdhbiBtZXRvZGUgcGVtYmF5YXJhbiBkaWdpdGFsLg0KDQoqKk1vYmlsZSDihpIgRS1XYWxsZXQqKjogT3B0aW1hbGthbiBwcm9tbyBkYW4ga2VtdWRhaGFuIHBlbWJheWFyYW4gbGV3YXQgYXBsaWthc2kgbW9iaWxlLg0KDQoqKkRlc2t0b3Ag4oaSIEthcnR1IEtyZWRpdCoqOiBGb2t1cyBwYWRhIGtlYW1hbmFuLCBrZW55YW1hbmFuLCBkYW4gb3BzaSBjaWNpbGFuLg0KDQoqKkNPRCDihpIgU3RhYmlsKio6IFRldGFwIHRlcnNlZGlhIHNlYmFnYWkgb3BzaSB0YW1iYWhhbiwgdGlkYWsgcGVybHUgcHJpb3JpdGFzLg0KDQoqKkludGlueWE6KiogX1N0cmF0ZWdpIHBlbWJheWFyYW4gaGFydXMgKipkaXNlc3VhaWthbiBkZW5nYW4gamVuaXMgcGVyYW5na2F0KiogdW50dWsgbWVuaW5na2F0a2FuIGtlbnlhbWFuYW4gZGFuIGtvbnZlcnNpIHRyYW5zYWtzaS5fDQo8L2Rpdj4NCg0KIyMgVGFibGUgQ29uY2x1c2lvbnMNCjxkaXYgY2xhc3M9InBhc3RlbC1wdXJwbGUtYm94Ij4NCg0KfCBQZXJhbmdrYXQgICAgfCBNZXRvZGUgUGVtYmF5YXJhbiB8IE9ic2VydmFzaSAoTykgfCBIYXJhcGFuIChFKSB8IChPIC0gRSkgfCAoTyAtIEUpwrIgfCAoTyAtIEUpwrIgLyBFIHwNCnwgLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0gfCAtLS0tLS0tIHwgLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0gfA0KfCBNb2JpbGUgICAgICAgfCBFLVdhbGxldCAgICAgICAgICB8IDEyMCAgICAgICAgICAgfCAxMDIsMjcgICAgICB8IDE3LDczICAgfCAzMTQsMzUgICB8IDMsMDcgICAgICAgICB8DQp8IE1vYmlsZSAgICAgICB8IEthcnR1IEtyZWRpdCAgICAgIHwgODAgICAgICAgICAgICB8IDk2LDU5ICAgICAgIHwgLTE2LDU5ICB8IDI3NSwyMiAgIHwgMiw4NSAgICAgICAgIHwNCnwgTW9iaWxlICAgICAgIHwgQ09EICAgICAgICAgICAgICAgfCA1MCAgICAgICAgICAgIHwgNTEsMTQgICAgICAgfCAtMSwxNCAgIHwgMSwzMCAgICAgfCAwLDAzICAgICAgICAgfA0KfCBEZXNrdG9wICAgICAgfCBFLVdhbGxldCAgICAgICAgICB8IDYwICAgICAgICAgICAgfCA3Nyw3MyAgICAgICB8IC0xNyw3MyAgfCAzMTQsMzUgICB8IDQsMDQgICAgICAgICB8DQp8IERlc2t0b3AgICAgICB8IEthcnR1IEtyZWRpdCAgICAgIHwgOTAgICAgICAgICAgICB8IDczLDQxICAgICAgIHwgMTYsNTkgICB8IDI3NSwyMiAgIHwgMyw3NSAgICAgICAgIHwNCnwgRGVza3RvcCAgICAgIHwgQ09EICAgICAgICAgICAgICAgfCA0MCAgICAgICAgICAgIHwgMzgsODYgICAgICAgfCAxLDE0ICAgIHwgMSwzMCAgICAgfCAwLDAzICAgICAgICAgfA0KfCAqKlRvdGFsIM+HwrIqKiB8ICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICB8ICAgICAgICAgICAgIHwgICAgICAgICB8ICAgICAgICAgIHwgKioxMyw3NyoqICAgIHwNCg0KPC9kaXY+DQoNCiMgQ2FzZSBTdHVkeSA1DQo8ZGl2IGNsYXNzPSJwYXN0ZWwteWVsbG93LWJveCI+DQoqKlR5cGUgSSBhbmQgVHlwZSBJSSBFcnJvcnMgKENvbmNlcHR1YWwpKioNCg0KQSBmaW50ZWNoIHN0YXJ0dXAgdGVzdHMgd2hldGhlciBhIG5ldyBmcmF1ZCBkZXRlY3Rpb24gYWxnb3JpdGhtIHJlZHVjZXMgZnJhdWR1bGVudCB0cmFuc2FjdGlvbnMuDQoNCi0gSOKCgDogVGhlIG5ldyBhbGdvcml0aG0gZG9lcyBub3QgcmVkdWNlIGZyYXVkLg0KDQotIEjigoE6IFRoZSBuZXcgYWxnb3JpdGhtIHJlZHVjZXMgZnJhdWQuDQoNCioqVGFza3MqKg0KDQoxLiBFeHBsYWluIGEgVHlwZSBJIEVycm9yICjOsSkgaW4gdGhpcyBjb250ZXh0Lg0KDQoyLiBFeHBsYWluIGEgVHlwZSBJSSBFcnJvciAozrIpIGluIHRoaXMgY29udGV4dC4NCg0KMy4gSWRlbnRpZnkgd2hpY2ggZXJyb3IgaXMgbW9yZSBjb3N0bHkgZnJvbSBhIGJ1c2luZXNzIHBlcnNwZWN0aXZlLg0KDQo0LiBEaXNjdXNzIGhvdyBzYW1wbGUgc2l6ZSBhZmZlY3RzIFR5cGUgSUkgRXJyb3IuDQoNCjUuIEV4cGxhaW4gdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIM6xLCDOsiwgYW5kIHN0YXRpc3RpY2FsIHBvd2VyLg0KPC9kaXY+DQoNCiMjIFR5cGUgSSBFcnJvcg0KPGRpdiBjbGFzcz0icGFzdGVsLXllbGxvdy1ib3giPg0KKipEZWZpbmlzaToqKiBUeXBlIEkgRXJyb3IgYWRhbGFoIGtlc2FsYWhhbiBtZW5vbGFrIEgwIHBhZGFoYWwgSDAgYmVuYXIuIERhbGFtIGtvbnRla3MgYWxnb3JpdG1hIGRldGVrc2kgcGVuaXB1YW4sIGluaSBiZXJhcnRpIG1lbmdrbGFpbSBiYWh3YSBhbGdvcml0bWEgYmFydSBiZXJoYXNpbCBtZW5ndXJhbmdpIGZyYXVkIGtldGlrYSBwYWRhIGtlbnlhdGFhbm55YSB0aWRhayBhZGEgcGVuZ3VyYW5nYW4gZnJhdWQgeWFuZyBueWF0YS4gRWZlayBwcmFrdGlzbnlhIGFkYWxhaCBwZXJ1YmFoYW4gb3BlcmFzaW9uYWwgeWFuZyB0aWRhayBwZXJsdSwgbWlzYWxueWEgbWVuZ3ViYWggbW9kZWwgYXRhdSBwYXJhbWV0ZXIgeWFuZyBtZW55ZWJhYmthbiBwZW5pbmdrYXRhbiBhbGFybSBwYWxzdSBhdGF1IGJpYXlhIG9wZXJhc2lvbmFsIHRhbnBhIG1hbmZhYXQgYWt0dWFsLg0KDQoqKkNvbnRvaCBwcmFrdGlzOioqIFNldGVsYWggaW1wbGVtZW50YXNpIGFsZ29yaXRtYSBiYXJ1LCBqdW1sYWggdHJhbnNha3NpIGRpdGFuZGFpIHNlYmFnYWkgZnJhdWQgbWVuaW5na2F0IHNlY2FyYSBhcnRpZmlzaWFsIGthcmVuYSBwZXJ1YmFoYW4gYW1iYW5nIGRldGVrc2ksIG1lc2tpIHRpbmdrYXQgcGVuaXB1YW4gc2ViZW5hcm55YSB0aWRhayBiZXJrdXJhbmcuIEhhbCBpbmkgYmlzYSBtZW5pbWJ1bGthbiBnYW5nZ3VhbiBwZW5nYWxhbWFuIHBlbGFuZ2dhbiBkYW4gYmlheWEgcGVuYW5nYW5hbiBmYWxzZSBhbGFybS4NCjwvZGl2Pg0KDQojIyBUeXBlIElJIEVycm9yDQo8ZGl2IGNsYXNzPSJwYXN0ZWwteWVsbG93LWJveCI+DQoqKkRlZmluaXNpOioqIFR5cGUgSUkgRXJyb3IgYWRhbGFoIGdhZ2FsIG1lbm9sYWsgSDAgcGFkYWhhbCBIYSBiZW5hci4gRGFsYW0ga29udGVrcyBpbmkgYmVyYXJ0aSBhbGdvcml0bWEgYmFydSBzZWJlbmFybnlhIGxlYmloIGVmZWt0aWYgZGFsYW0gbWVuZ3VyYW5naSBmcmF1ZCwgbmFtdW4gdWppIHN0YXRpc3RpayBnYWdhbCBtZW51bmp1a2thbiBlZmVrIHRlcnNlYnV0LiBFZmVrbnlhOiBrZWxpcnUgbWVtcGVydGFoYW5rYW4gc3RhdHVzIHF1bywga2VoaWxhbmdhbiBwZWx1YW5nIHBlbmd1cmFuZ2FuIGZyYXVkLCBwb3RlbnNpIGtlcnVnaWFuIGZpbmFuc2lhbCwgc2VydGEga2VydXNha2FuIHJlcHV0YXNpIGppa2EgZnJhdWQgdGV0YXAgdGluZ2dpLg0KDQoqKkNvbnRvaCBwcmFrdGlzOioqIEZyYXVkIHJhdGUgbWVudXJ1biBzZWNhcmEgbnlhdGEgc2V0ZWxhaCBwZXJ1YmFoYW4sIHRldGFwaSB1amkgaGlwb3Rlc2lzIHRpZGFrIHB1bnlhIGN1a3VwIGtla3VhdGFuIHVudHVrIG1lbWJ1a3Rpa2FuIHBlcmJlZGFhbiBzaWduaWZpa2FuLiBBa2liYXRueWEsIHBlcnVzYWhhYW4gdGlkYWsgbWVuZ2FjYWsgcGVydWJhaGFuIHlhbmcgc2VoYXJ1c255YSBkaXRlcmFwa2FuLCBzZWhpbmdnYSBwb3RlbnNpIHBlbmdoZW1hdGFuIGJpYXlhIGRhbiBwZW5pbmdrYXRhbiBrZWFtYW5hbiB0aWRhayB0ZXJlYWxpc2FzaWthbi4NCjwvZGl2Pg0KDQojIyBJZGVudGlmeSBXaGljaCBFcnJvcg0KPGRpdiBjbGFzcz0icGFzdGVsLXllbGxvdy1ib3giPg0KRGFsYW0ga29udGVrcyBmaW50ZWNoIGRhbiBhbGdvcml0bWEgZGV0ZWtzaSBmcmF1ZDoNCg0KKipUeXBlIEkgRXJyb3IgKM6xKToqKiBNZW5nYW5nZ2FwIGFsZ29yaXRtYSBlZmVrdGlmIHBhZGFoYWwgdGlkYWsgZWZla3RpZi4NCg0KRGFtcGFrOiBiaWF5YSB1bnR1ayBwZW5nZW1iYW5nYW4sIGltcGxlbWVudGFzaSwgZGFuIHBlbGF0aWhhbiBhbGdvcml0bWEgc2lhLXNpYS4NCg0KRnJhdWQgdGV0YXAgdGVyamFkaSBzZXBlcnRpIHNlYmVsdW1ueWEsIHRhcGkgcGVydXNhaGFhbiBzdWRhaCBtZW5nZWx1YXJrYW4gYmlheWEgdGFtYmFoYW4uDQoNCioqVHlwZSBJSSBFcnJvciAozrIpOioqIE1lbmdhbmdnYXAgYWxnb3JpdG1hIHRpZGFrIGVmZWt0aWYgcGFkYWhhbCBzZWJlbmFybnlhIGVmZWt0aWYuDQoNCkRhbXBhazogZnJhdWQgeWFuZyBzZWJlbmFybnlhIGJpc2EgZGljZWdhaCB0ZXRhcCB0ZXJqYWRpLCBtZW5pbWJ1bGthbiBrZXJ1Z2lhbiBmaW5hbnNpYWwgbnlhdGEuDQoNClBlcnVzYWhhYW4gbWVsZXdhdGthbiBrZXNlbXBhdGFuIHVudHVrIG1lbmd1cmFuZ2kgZnJhdWQgZGFuIG1lbmluZ2thdGthbiBrZWFtYW5hbiB0cmFuc2Frc2kuDQoNCioqS2VzaW1wdWxhbiBCaXNuaXMqKg0KDQpEYXJpIHBlcnNwZWt0aWYgYmlzbmlzIGZpbnRlY2gsIFR5cGUgSUkgRXJyb3IgYmlhc2FueWEgbGViaWggbWFoYWwgZGFyaXBhZGEgVHlwZSBJIEVycm9yLCBrYXJlbmEga2VydWdpYW4gYWtpYmF0IGZyYXVkIHlhbmcgdGlkYWsgZGljZWdhaCBiaXNhIGphdWggbGViaWggYmVzYXIgZGFyaXBhZGEgYmlheWEgaW1wbGVtZW50YXNpIGFsZ29yaXRtYSB5YW5nIGdhZ2FsLg0KDQoqKktlc2ltcHVsYW46KiogTGViaWggYmFpayBtZW5naGluZGFyaSBtZWxld2F0a2FuIGFsZ29yaXRtYSB5YW5nIGVmZWt0aWYgKFR5cGUgSUkpIG1lc2tpcHVuIGFkYSByaXNpa28gc2FsYWggbWVuZ2FuZ2dhcCBhbGdvcml0bWEgZWZla3RpZiAoVHlwZSBJKSwgdGV0YXBpIGtlZHVhIGplbmlzIGtlc2FsYWhhbiBwZXJsdSBkaW1pbmltYWxrYW4gc2VzdWFpIGtlYmlqYWthbiByaXNpa28gYmlzbmlzIGRhbiB0b2xvayB1a3VyIGJpYXlhL3Jpc2lrbyB5YW5nIHNwZXNpZmlrLg0KPC9kaXY+DQoNCiMjIEluZmx1ZW5jZSBvZiBTYW1wbGUgU2l6ZQ0KPGRpdiBjbGFzcz0icGFzdGVsLXllbGxvdy1ib3giPg0KUGVuZ2FydWggVWt1cmFuIFNhbXBlbCB0ZXJoYWRhcCBUeXBlIElJIEVycm9yICjOsikNCg0KLSBUeXBlIElJIEVycm9yICjOsikgdGVyamFkaSBrZXRpa2Ega2l0YSBnYWdhbCBtZW5vbGFrIEjigoAgcGFkYWhhbCBI4oKBIGJlbmFy4oCUZGFsYW0ga29udGVrcyBpbmksIG1lbmdhbmdnYXAgYWxnb3JpdG1hIHRpZGFrIGVmZWt0aWYgcGFkYWhhbCBzZWJlbmFybnlhIGVmZWt0aWYuDQoNCi0gU2FsYWggc2F0dSBmYWt0b3IgdXRhbWEgeWFuZyBtZW1lbmdhcnVoaSDOsiBhZGFsYWggdWt1cmFuIHNhbXBlbC4NCg0KKipCYWdhaW1hbmEgdWt1cmFuIHNhbXBlbCBtZW1wZW5nYXJ1aGkgzrI/KioNCg0KMS4gVWt1cmFuIHNhbXBlbCBiZXNhciDihpIgVHlwZSBJSSBFcnJvciBtZW51cnVuDQoNCi0gRGF0YSBsZWJpaCByZXByZXNlbnRhdGlmIGRhbiB2YXJpYWJpbGl0YXMgbGViaWgga2VjaWwuDQoNCi0gQWxnb3JpdG1hIHlhbmcgYmVuYXItYmVuYXIgZWZla3RpZiBsZWJpaCBtdWRhaCBkaWRldGVrc2kuDQoNCi0gUHJvYmFiaWxpdGFzIOKAnGZhbHNlIG5lZ2F0aXZl4oCdICh0aWRhayBtZW5kZXRla3NpIGFsZ29yaXRtYSBlZmVrdGlmKSBsZWJpaCByZW5kYWguDQoNCjIuIFVrdXJhbiBzYW1wZWwga2VjaWwg4oaSIFR5cGUgSUkgRXJyb3IgbWVuaW5na2F0DQoNCi0gRGF0YSBrdXJhbmcgcmVwcmVzZW50YXRpZiwgZmx1a3R1YXNpIGFjYWsgbGViaWggYmVzYXIuDQoNCi0gQWxnb3JpdG1hIHlhbmcgc2ViZW5hcm55YSBlZmVrdGlmIGJpc2EgdGVybGV3YXQga2FyZW5hIGVmZWtueWEgdGlkYWsgdGVybGloYXQgc2lnbmlmaWthbiBzZWNhcmEgc3RhdGlzdGlrLg0KDQotIFByb2JhYmlsaXRhcyDigJxmYWxzZSBuZWdhdGl2ZeKAnSBsZWJpaCB0aW5nZ2kuDQoNCioqX1NlbWFraW4gYmVzYXIgc2FtcGVsIOKGkiBoYXNpbCB1amkgc3RhdGlzdGlrIGxlYmloIGFrdXJhdCDihpIgcGVsdWFuZyBtZW5kZXRla3NpIGFsZ29yaXRtYSB5YW5nIGVmZWt0aWYgbWVuaW5na2F0IOKGkiDOsiBtZW51cnVuIOKGkiBzdGF0aXN0aWNhbCBwb3dlciBtZW5pbmdrYXQuXyoqDQo8L2Rpdj4NCg0KIyMgUmVsYXRpb25zaGlwDQo8ZGl2IGNsYXNzPSJwYXN0ZWwteWVsbG93LWJveCI+DQoqKkRlZmluaXNpIERhc2FyKioNCg0KMS4gzrEgKEFscGhhIC8gVHlwZSBJIEVycm9yKQ0KDQotIFByb2JhYmlsaXRhcyBtZW5vbGFrIEjigoAgcGFkYWhhbCBI4oKAIGJlbmFyLg0KDQotIERhbGFtIGtvbnRla3MgZmludGVjaDogbWVuZ2FuZ2dhcCBhbGdvcml0bWEgZWZla3RpZiBwYWRhaGFsIHRpZGFrIGVmZWt0aWYuDQoNCjIuIM6yIChCZXRhIC8gVHlwZSBJSSBFcnJvcikNCg0KLSBQcm9iYWJpbGl0YXMgZ2FnYWwgbWVub2xhayBI4oKAIHBhZGFoYWwgSOKCgSBiZW5hci4NCg0KLSBEYWxhbSBrb250ZWtzIGZpbnRlY2g6IG1lbmdhbmdnYXAgYWxnb3JpdG1hIHRpZGFrIGVmZWt0aWYgcGFkYWhhbCBzZWJlbmFybnlhIGVmZWt0aWYuDQoNCjMuIFN0YXRpc3RpY2FsIFBvd2VyDQoNCi0gUG93ZXIgPSAxIOKAkyDOsg0KDQotIFByb2JhYmlsaXRhcyBtZW5kZXRla3NpIGVmZWsgbnlhdGEgKEjigoEgYmVuYXIpIHNlY2FyYSBzdGF0aXN0aWsuDQoNCi0gRGFsYW0ga29udGVrcyBmaW50ZWNoOiBwZWx1YW5nIHVudHVrIG1lbmVtdWthbiBhbGdvcml0bWEgeWFuZyBiZW5hci1iZW5hciBlZmVrdGlmLg0KDQoqKkh1YnVuZ2FuIM6xLCDOsiwgZGFuIFBvd2VyKioNCg0KMS4gVHJhZGUtb2ZmIGFudGFyYSDOsSBkYW4gzrINCg0KLSBNZW51cnVua2FuIM6xIChtZW1idWF0IHVqaSBsZWJpaCBrZXRhdCkg4oaSIHBlbHVhbmcgVHlwZSBJIEVycm9yIGJlcmt1cmFuZyDihpIgdWppIG1lbmphZGkga29uc2VydmF0aWYuDQoNCi0gQWtpYmF0bnlhLCDOsiBiaXNhIG1lbmluZ2thdCwgYXJ0aW55YSBrZW11bmdraW5hbiBmYWxzZSBuZWdhdGl2ZSBsZWJpaCB0aW5nZ2kuDQoNCi0gU2ViYWxpa255YSwgbWVuYWlra2FuIM6xIOKGkiByaXNpa28gVHlwZSBJIEVycm9yIG1lbmluZ2thdCwgdGFwaSDOsiBtZW51cnVuIOKGkiBwZWx1YW5nIG1lbmRldGVrc2kgZWZlayBueWF0YSBsZWJpaCBiZXNhci4NCg0KMi4gVWt1cmFuIHNhbXBlbCBtZW1wZW5nYXJ1aGkgzrIgZGFuIFBvd2VyDQoNCi0gU2VtYWtpbiBiZXNhciB1a3VyYW4gc2FtcGVsIOKGkiB2YXJpYWJpbGl0YXMgYmVya3VyYW5nIOKGkiDOsiBtZW51cnVuIOKGkiBwb3dlciBtZW5pbmdrYXQuDQoNCi0gU2VtYWtpbiBrZWNpbCB1a3VyYW4gc2FtcGVsIOKGkiB2YXJpYWJpbGl0YXMgdGluZ2dpIOKGkiDOsiBtZW5pbmdrYXQg4oaSIHBvd2VyIG1lbnVydW4uDQoNCjMuIFBvd2VyIGRhbiBwZW5nYW1iaWxhbiBrZXB1dHVzYW4NCg0KLSBQb3dlciB0aW5nZ2kg4oaSIGxlYmloIGJlc2FyIGtlbXVuZ2tpbmFuIG1lbmRldGVrc2kgYWxnb3JpdG1hIHlhbmcgZWZla3RpZi4NCg0KLSBQb3dlciByZW5kYWgg4oaSIGFkYSByaXNpa28gbWVsZXdhdGthbiBhbGdvcml0bWEgeWFuZyBiZW5hci1iZW5hciBiZXJtYW5mYWF0IChUeXBlIElJIEVycm9yKS4NCg0KKipJbnRpbnlhOioqDQoNCi0gzrEgPSByaXNpa28gbWVueWF0YWthbiBhbGdvcml0bWEgZWZla3RpZiBwYWRhaGFsIHRpZGFrIChUeXBlIEkpDQoNCi0gzrIgPSByaXNpa28gbWVsZXdhdGthbiBhbGdvcml0bWEgeWFuZyBlZmVrdGlmIChUeXBlIElJKQ0KDQotIFBvd2VyID0gMSDigJMgzrIgPSBrZW1hbXB1YW4gdWppIHVudHVrIG1lbmRldGVrc2kgZWZlayBueWF0YQ0KDQpVa3VyYW4gc2FtcGVsICYgzrEgbWVtZW5nYXJ1aGkgzrIgZGFuIHBvd2VyLCBzZWhpbmdnYSBkZXNhaW4gZWtzcGVyaW1lbiBoYXJ1cyBzZWltYmFuZyBzZXN1YWkgcmlzaWtvIGJpc25pcy4NCjwvZGl2Pg0KDQojIyBUYWJsZSBDb25jbHVzaW9ucw0KPGRpdiBjbGFzcz0icGFzdGVsLXllbGxvdy1ib3giPg0KDQp8IE5vIHwgUGVydGFueWFhbiAgICAgICAgICAgICAgICAgfCBKYXdhYmFuIFJpbmdrYXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUG9pbiBQZW50aW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCAtLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwNCnwgMSAgfCBKZWxhc2thbiBUeXBlIEkgRXJyb3IgKM6xKSAgfCBNZW5vbGFrIEjigoAgcGFkYWhhbCBI4oKAIGJlbmFyLiBTdGFydHVwIG1lbmdhbmdnYXAgYWxnb3JpdG1hICoqZWZla3RpZiBwYWRhaGFsIHRpZGFrKiouICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IC0gTWVub2xhayBI4oKAIHBhZGFoYWwgYmVuYXI8YnI+LSBBbGdvcml0bWEgZGlhbmdnYXAgZWZla3RpZiBwYWRhaGFsIHRpZGFrPGJyPi0gQmlheWEgaW1wbGVtZW50YXNpIHNpYS1zaWEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCAyICB8IEplbGFza2FuIFR5cGUgSUkgRXJyb3IgKM6yKSB8IEdhZ2FsIG1lbm9sYWsgSOKCgCBwYWRhaGFsIEjigoEgYmVuYXIuIFN0YXJ0dXAgbWVuZ2FuZ2dhcCBhbGdvcml0bWEgKip0aWRhayBlZmVrdGlmIHBhZGFoYWwgc2ViZW5hcm55YSBlZmVrdGlmKiouICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgLSBHYWdhbCBtZW5kZXRla3NpIGVmZWsgbnlhdGE8YnI+LSBGcmF1ZCB0ZXRhcCB0ZXJqYWRpPGJyPi0gS2VzZW1wYXRhbiBtZW5ndXJhbmdpIGtlcnVnaWFuIGhpbGFuZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCAzICB8IEVycm9yIG1hbmEgbGViaWggbWFoYWwgICAgIHwgKipUeXBlIElJIEVycm9yKiogbGViaWggbWFoYWwga2FyZW5hIGZyYXVkIHRldGFwIHRlcmphZGksIGtlcnVnaWFuIGZpbmFuc2lhbCBueWF0YSBsZWJpaCBiZXNhciBkaWJhbmRpbmcgYmlheWEgc2FsYWggaW1wbGVtZW50YXNpIGFsZ29yaXRtYSAoVHlwZSBJKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IC0gVHlwZSBJSSDihpIga2VoaWxhbmdhbiBrZXNlbXBhdGFuIG1lbmd1cmFuZ2kgZnJhdWQ8YnI+LSBUeXBlIEkg4oaSIGJpYXlhIGltcGxlbWVudGFzaSBzaWEtc2lhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQp8IDQgIHwgUGVuZ2FydWggdWt1cmFuIHNhbXBlbCAgICAgfCBTZW1ha2luIGJlc2FyIHVrdXJhbiBzYW1wZWwg4oaSIM6yIG1lbnVydW4g4oaSIHBlbHVhbmcgbWVuZGV0ZWtzaSBhbGdvcml0bWEgZWZla3RpZiBtZW5pbmdrYXQg4oaSIHBvd2VyIG1lbmluZ2thdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IC0gVWt1cmFuIHNhbXBlbCBiZXNhciDihpIgaGFzaWwgbGViaWggYWt1cmF0PGJyPi0gVWt1cmFuIHNhbXBlbCBrZWNpbCDihpIgcmlzaWtvIFR5cGUgSUkgdGluZ2dpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQp8IDUgIHwgSHVidW5nYW4gzrEsIM6yLCBkYW4gcG93ZXIgICB8IC0gzrEgPSByaXNpa28gVHlwZSBJIEVycm9yPGJyPi0gzrIgPSByaXNpa28gVHlwZSBJSSBFcnJvcjxicj4tIFBvd2VyID0gMSDigJMgzrIgPSBrZW1hbXB1YW4gbWVuZGV0ZWtzaSBlZmVrIG55YXRhPGJyPi0gVHJhZGUtb2ZmOiBtZW51cnVua2FuIM6xIGJpc2EgbWVuYWlra2FuIM6yOyB1a3VyYW4gc2FtcGVsIG1lbWVuZ2FydWhpIM6yIGRhbiBwb3dlciB8IC0gzrEgZGFuIM6yIHNhbGluZyB0ZXJrYWl0PGJyPi0gUG93ZXIgbWVuaW5na2F0IGppa2EgzrIgbWVudXJ1biAodWt1cmFuIHNhbXBlbCBiZXNhcik8YnI+LSBEZXNhaW4gdWppIGhhcnVzIHNlaW1iYW5nIHNlc3VhaSByaXNpa28gYmlzbmlzIHwNCjwvZGl2Pg0KDQojIENhc2UgU3R1ZHkgNg0KPGRpdiBjbGFzcz0icGFzdGVsLWJyb3duLWJveCI+DQoqKlAtVmFsdWUgYW5kIFN0YXRpc3RpY2FsIERlY2lzaW9uIE1ha2luZyoqDQoNCkEgY2h1cm4gcHJlZGljdGlvbiBtb2RlbCBldmFsdWF0aW9uIHlpZWxkcyB0aGUgZm9sbG93aW5nIHJlc3VsdHM6DQoNCi0gVGVzdCBzdGF0aXN0aWMgPSAyLjMxDQoNCi0gcC12YWx1ZSA9IDAuMDIxDQoNCi0gU2lnbmlmaWNhbmNlIGxldmVsOiDOsSA9IDAuMDUNCg0KKipUYXNrcyoqDQoNCjEuIEV4cGxhaW4gdGhlIG1lYW5pbmcgb2YgdGhlIHAtdmFsdWUuDQoNCjIuIE1ha2UgYSBzdGF0aXN0aWNhbCBkZWNpc2lvbi4NCg0KMy4gVHJhbnNsYXRlIHRoZSBkZWNpc2lvbiBpbnRvIG5vbi10ZWNobmljYWwgbGFuZ3VhZ2UgZm9yIG1hbmFnZW1lbnQuDQoNCjQuIERpc2N1c3MgdGhlIHJpc2sgaWYgdGhlIHNhbXBsZSBpcyBub3QgcmVwcmVzZW50YXRpdmUuDQoNCjUuIEV4cGxhaW4gd2h5IHRoZSBwLXZhbHVlIGRvZXMgbm90IG1lYXN1cmUgZWZmZWN0IHNpemUuDQo8L2Rpdj4NCg0KIyMgRGVmaW5pdGlvbg0KPGRpdiBjbGFzcz0icGFzdGVsLWJyb3duLWJveCI+DQoqKkRlZmluaXNpIFVtdW0qKg0KDQotIHAtdmFsdWUgYWRhbGFoIHByb2JhYmlsaXRhcyBtZW5kYXBhdGthbiBoYXNpbCB5YW5nIHNhbWEgZWtzdHJlbSBhdGF1IGxlYmloIGVrc3RyZW0gZGFyaXBhZGEgaGFzaWwgeWFuZyBkaWFtYXRpLCBkZW5nYW4gYXN1bXNpIGhpcG90ZXNpcyBub2wgKEjigoApIGJlbmFyLg0KDQotIERlbmdhbiBrYXRhIGxhaW4sIHAtdmFsdWUgbWVtYmVyaSB0YWh1IGtpdGEgc2ViZXJhcGEga29uc2lzdGVuIGRhdGEgZGVuZ2FuIEjigoAuDQoNCioqRGFsYW0gS29udGVrcyBNb2RlbCBQcmVkaWtzaSBDaHVybioqDQoNCjEuIEhpcG90ZXNpczoNCg0KLSBI4oKAOiBNb2RlbCBjaHVybiB0aWRhayBtZW1pbGlraSBwZW5nYXJ1aCAobWlzYWxueWEsIHByZWRpa3NpIGNodXJuIHNhbWEgYmFpa255YSBzZXBlcnRpIHRlYmFrYW4gYWNhaykuDQoNCi0gSOKCgTogTW9kZWwgY2h1cm4gbWVtaWxpa2kgcGVuZ2FydWggKHByZWRpa3NpIGNodXJuIGxlYmloIGJhaWsgZGFyaSBhY2FrKS4NCg0KMi4gSGFzaWwgdWppOg0KDQotIFRlc3Qgc3RhdGlzdGljID0gMiwzMQ0KDQotIHAtdmFsdWUgPSAwLDAyMQ0KDQoqKkludGVycHJldGFzaToqKg0KDQotIEppa2EgbW9kZWwgc2ViZW5hcm55YSB0aWRhayBlZmVrdGlmIChI4oKAIGJlbmFyKSwgcGVsdWFuZyBtZW5kYXBhdGthbiBoYXNpbCB1amkgc2UtZWtzdHJlbSAyLDMxIGhhbnlhIDIsMSUuDQoNCi0gRGVuZ2FuIGthdGEgbGFpbiwgaGFzaWwgaW5pIHRpZGFrIG11bmdraW4gdGVyamFkaSBzZWNhcmEga2ViZXR1bGFuLCBzZWhpbmdnYSBtZW5qYWRpIGJ1a3RpIHVudHVrIG1lbm9sYWsgSOKCgC4NCjwvZGl2Pg0KDQojIyBTdGF0aXN0aWNhbCBEZWNpc2lvbg0KPGRpdiBjbGFzcz0icGFzdGVsLWJyb3duLWJveCI+DQoqKkRhdGEgeWFuZyBEaWJlcmlrYW4qKg0KDQotIFRlc3Qgc3RhdGlzdGljID0gMiwzMQ0KDQotIHAtdmFsdWUgPSAwLDAyMQ0KDQotIFNpZ25pZmljYW5jZSBsZXZlbCAozrEpID0gMCwwNQ0KDQoqKkxhbmdrYWgtbGFuZ2thaCBQZW5nYW1iaWxhbiBLZXB1dHVzYW4qKg0KDQoxLiBUZW50dWthbiBIaXBvdGVzaXMNCg0KLSBI4oKAOiBNb2RlbCBjaHVybiB0aWRhayBtZW1pbGlraSBwZW5nYXJ1aCAodGlkYWsgbGViaWggYmFpayBkYXJpIHRlYmFrYW4gYWNhaykuDQoNCi0gSOKCgTogTW9kZWwgY2h1cm4gbWVtaWxpa2kgcGVuZ2FydWggKGxlYmloIGJhaWsgZGFyaSB0ZWJha2FuIGFjYWspLg0KDQoyLiBCYW5kaW5na2FuIHAtdmFsdWUgZGVuZ2FuIM6xDQoNCi0gzrEgPSAwLDA1IOKGkiBiYXRhcyB0b2xlcmFuc2kgcmlzaWtvIGtlc2FsYWhhbiBUeXBlIEkuDQoNCi0gcC12YWx1ZSA9IDAsMDIxDQoNCjMuIFRlcmFwa2FuIGF0dXJhbiBwZW5nYW1iaWxhbiBrZXB1dHVzYW4NCg0KLSBKaWthIHAtdmFsdWUg4omkIM6xLCBtYWthIHRvbGFrIEjigoAuDQoNCi0gSmlrYSBwLXZhbHVlID4gzrEsIG1ha2EgZ2FnYWwgbWVub2xhayBI4oKALg0KDQo0LiBIaXR1bmcgYXRhdSBwZXJpa3NhIHRlc3Qgc3RhdGlzdGljIChvcHNpb25hbCkNCg0KLSBUZXN0IHN0YXRpc3RpYyA9IDIsMzEg4oaSIGN1a3VwIGJlc2FyIHVudHVrIG1lbmdoYXNpbGthbiBwLXZhbHVlIGtlY2lsLg0KDQotIEtvbmZpcm1hc2k6IHAtdmFsdWUgPCDOsSDihpIgbWVuZHVrdW5nIGtlcHV0dXNhbiBtZW5vbGFrIEjigoAuDQoNCioqS2VwdXR1c2FuOioqDQoNCi0gS2FyZW5hIHAtdmFsdWUgMCwwMjEgPCDOsSAwLDA1LCBtYWthIEjigoAgZGl0b2xhay4NCg0KLSBLZXNpbXB1bGFuIHN0YXRpc3RpazogTW9kZWwgY2h1cm4gc2lnbmlmaWthbiBzZWNhcmEgc3RhdGlzdGlrLCBhcnRpbnlhIG1vZGVsIG1lbWlsaWtpIHBlbmdhcnVoIG55YXRhIGRhbGFtIG1lbXByZWRpa3NpIGNodXJuLg0KPC9kaXY+DQoNCiMjIEludGVycHJldGF0aW9uIG9mIFN0YXRpc3RpY2FsIERlY2lzaW9uDQo8ZGl2IGNsYXNzPSJwYXN0ZWwtYnJvd24tYm94Ij4NCk1hbmFqZW1lbiBiaWFzYW55YSB0aWRhayBtZW5nZ3VuYWthbiBpc3RpbGFoIOKAnHAtdmFsdWXigJ0gYXRhdSDigJxI4oKAL0jigoHigJ0uIEphZGkga2l0YSBwZXJsdSBtZW5lcmplbWFoa2FuIGhhc2lsIHN0YXRpc3RpayBtZW5qYWRpIGFydGkgYmlzbmlzIG55YXRhOg0KDQoxLiBGb2t1cyBwYWRhIGhhc2lsIHlhbmcgcGVudGluZyBiYWdpIGJpc25pcw0KDQotIE1vZGVsIGNodXJuIG1hbXB1IG1lbXByZWRpa3NpIHBlbGFuZ2dhbiB5YW5nIGJlcnBvdGVuc2kgYmVyaGVudGkuDQoNCi0gSGFzaWwgaW5pIHRpZGFrIHRlcmphZGkgc2VjYXJhIGtlYmV0dWxhbiwgYXJ0aW55YSBtb2RlbCBiZW5hci1iZW5hciBtZW1iZXJpa2FuIGluc2lnaHQgeWFuZyBiZXJtYW5mYWF0Lg0KDQoyLiBDb250b2ggYmFoYXNhIHNlZGVyaGFuYQ0KDQotIOKAnEJlcmRhc2Fya2FuIGFuYWxpc2lzIGRhdGEsIG1vZGVsIHByZWRpa3NpIGNodXJuIGluaSB0ZXJidWt0aSBiZWtlcmphIGRhbiBkYXBhdCBkaWd1bmFrYW4gdW50dWsgbWVtYmFudHUgc3RyYXRlZ2kgcmV0ZW5zaSBwZWxhbmdnYW4u4oCdDQoNCi0gQXRhdTog4oCcTW9kZWwgaW5pIGVmZWt0aWYgdW50dWsgbWVuZ2lkZW50aWZpa2FzaSBwZWxhbmdnYW4geWFuZyBiZXJpc2lrbyBiZXJoZW50aSwgc2VoaW5nZ2EgdGltIG1hcmtldGluZyBiaXNhIG1lbmdhbWJpbCB0aW5kYWthbiB5YW5nIHRlcGF0LuKAnQ0KDQozLiBNYW5mYWF0IGJhZ2kga2VwdXR1c2FuIGJpc25pcw0KDQotIFN0cmF0ZWdpIHJldGVuc2kgZGFwYXQgZGlmb2t1c2thbiBwYWRhIHBlbGFuZ2dhbiB5YW5nIGJlbmFyLWJlbmFyIGJlcmlzaWtvIGNodXJuLg0KDQotIEVmaXNpZW5zaSBiaWF5YSBrYXJlbmEgdGlkYWsgc2VtdWEgcGVsYW5nZ2FuIGhhcnVzIGRpYmVyaSBpbnNlbnRpZi4NCg0KLSBNZW5pbmdrYXRrYW4gcmV2ZW51ZSByZXRlbnRpb24gZGVuZ2FuIG1lbWluaW1hbGthbiBjaHVybi4NCjwvZGl2Pg0KDQojIyBSaXNrDQo8ZGl2IGNsYXNzPSJwYXN0ZWwtYnJvd24tYm94Ij4NCioqRGVmaW5pc2kgU2FtcGVsIFJlcHJlc2VudGF0aWYqKg0KDQotIFNhbXBlbCByZXByZXNlbnRhdGlmIGFkYWxhaCBzYW1wZWwgeWFuZyBtZXdha2lsaSBwb3B1bGFzaSBzZWNhcmEgYWt1cmF0LCBiYWlrIGRhbGFtIGthcmFrdGVyaXN0aWssIHBlcmlsYWt1LCBtYXVwdW4gZGlzdHJpYnVzaS4NCg0KLSBEYWxhbSBrb250ZWtzIGNodXJuOiBzYW1wZWwgaGFydXMgbWVuY2VybWlua2FuIHNlbHVydWggcGVsYW5nZ2FuICh1c2lhLCBsb2thc2ksIG5pbGFpIHRyYW5zYWtzaSwgamVuaXMgcHJvZHVrLCBkbGwpLg0KDQoqKk1hc2FsYWggSmlrYSBTYW1wZWwgVGlkYWsgUmVwcmVzZW50YXRpZioqDQoNCjEuIHAtdmFsdWUgYmlzYSBtZW55ZXNhdGthbg0KDQotIHAtdmFsdWUgZGloaXR1bmcgYmVyZGFzYXJrYW4gZGF0YSBzYW1wZWwuDQoNCi0gSmlrYSBzYW1wZWwgdGlkYWsgbWVuY2VybWlua2FuIHBvcHVsYXNpLCBwLXZhbHVlIGJpc2EgdGVybGFsdSByZW5kYWggYXRhdSB0ZXJsYWx1IHRpbmdnaSwgc2VoaW5nZ2E6DQoNCi0gTW9kZWwgdGVybGloYXQgc2lnbmlmaWthbiBwYWRhaGFsIHNlYmVuYXJueWEgdGlkYWsgKGZhbHNlIHBvc2l0aXZlKQ0KDQotIE1vZGVsIHRlcmxpaGF0IHRpZGFrIHNpZ25pZmlrYW4gcGFkYWhhbCBzZWJlbmFybnlhIGVmZWt0aWYgKGZhbHNlIG5lZ2F0aXZlKQ0KDQoyLiBLZXB1dHVzYW4gYmlzbmlzIGJpc2Egc2FsYWgNCg0KLSBNb2RlbCBkaXRlcmFwa2FuIGtlIHNlbHVydWggcG9wdWxhc2kgcGVsYW5nZ2FuLCB0ZXRhcGkgaGFzaWwgcHJlZGlrc2kgdGlkYWsgYWt1cmF0Lg0KDQotIE1pc2FsbnlhOg0KDQotIE1vZGVsIHByZWRpa3NpIGNodXJuIHRhbXBhayBlZmVrdGlmIHBhZGEgc2FtcGVsLCB0YXBpIGdhZ2FsIG1lbmdlbmFsaSBwZWxhbmdnYW4gYmVyaXNpa28gZGkgcG9wdWxhc2kgbnlhdGEuDQoNCi0gU3RyYXRlZ2kgcmV0ZW5zaSB5YW5nIGRpYnVhdCBiZXJkYXNhcmthbiBtb2RlbCBiaXNhIG1lbmdoYWJpc2thbiBiaWF5YSB0YW5wYSBoYXNpbCBueWF0YS4NCg0KMy4gS2VoaWxhbmdhbiBpbnNpZ2h0IHBlbnRpbmcNCg0KUGVsYW5nZ2FuIGRlbmdhbiBrYXJha3RlcmlzdGlrIGJlcmJlZGEgZGFyaSBzYW1wZWwgbXVuZ2tpbiB0aWRhayB0ZXJkZXRla3NpLCBzZWhpbmdnYSBzdHJhdGVnaSByZXRlbnNpIHRpZGFrIG1lbnlhc2FyIHNlbHVydWggc2VnbWVuIGJlcmlzaWtvLg0KPC9kaXY+DQoNCiMjIE1lYXN1cmUgZWZmZWN0IFNpemUNCjxkaXYgY2xhc3M9InBhc3RlbC1icm93bi1ib3giPg0KKipQZXJiZWRhYW4gcC12YWx1ZSBkYW4gRWZmZWN0IFNpemUqKg0KDQoxLiBwLXZhbHVlIG1lbnVuanVra2FuIHNpZ25pZmlrYW5zaSBzdGF0aXN0aWssIGJ1a2FuIGJlc2FyIGVmZWsNCg0KLSBwLXZhbHVlID0gcHJvYmFiaWxpdGFzIGRhdGEgbXVuY3VsIGppa2EgSOKCgCBiZW5hci4NCg0KLSBDb250b2g6IHAtdmFsdWUgPSAwLDAyMSDihpIgbW9kZWwgc2lnbmlmaWthbiBzZWNhcmEgc3RhdGlzdGlrLg0KDQotIFRhcGkgcC12YWx1ZSB0aWRhayBtZW1iZXJpdGFodSBzZWJlcmFwYSBiYW55YWsgY2h1cm4geWFuZyBiaXNhIGRpY2VnYWggYXRhdSBzZWJlcmFwYSBlZmVrdGlmIG1vZGVsIHNlY2FyYSBwcmFrdGlzLg0KDQoyLiBwLXZhbHVlIGRpcGVuZ2FydWhpIG9sZWggdWt1cmFuIHNhbXBlbA0KDQotIFNhbXBlbCBiZXNhciDihpIgZWZlayBrZWNpbCBiaXNhIHRldGFwIG1lbWJlcmlrYW4gcC12YWx1ZSBzYW5nYXQgcmVuZGFoIChzaWduaWZpa2FuKS4NCg0KLSBTYW1wZWwga2VjaWwg4oaSIGVmZWsgYmVzYXIgYmlzYSBtZW5naGFzaWxrYW4gcC12YWx1ZSB0aW5nZ2kgKHRpZGFrIHNpZ25pZmlrYW4pLg0KDQotIEluaSBtZW51bmp1a2thbiBwLXZhbHVlIHRpZGFrIHNlbGFsdSBtZW5jZXJtaW5rYW4ga2VrdWF0YW4gYXRhdSBiZXNhcm55YSBlZmVrLg0KDQozLiBFZmZlY3Qgc2l6ZSBtZW1iZXJpa2FuIGtvbnRla3MgcHJha3Rpcw0KDQotIFVudHVrIG1lbmdldGFodWkgYXBha2FoIG1vZGVsIGN1a3VwIGJlcm1hbmZhYXQgYmFnaSBiaXNuaXMsIGd1bmFrYW4gdWt1cmFuIGVmZWs6DQoNCi0gQWNjdXJhY3ksIHByZWNpc2lvbiwgcmVjYWxsLCBBVUMNCg0KLSBDb2hlbuKAmXMgZCwgb2RkcyByYXRpbywgUsKyICh0ZXJnYW50dW5nIGplbmlzIGRhdGEpDQoNCioqQ29udG9oIGRhbGFtIEtvbnRla3MgQ2h1cm4qKg0KDQotIE1vZGVsIEEgbWVtaWxpa2kgcC12YWx1ZSA9IDAsMDIxIOKGkiBzaWduaWZpa2FuDQoNCi0gTmFtdW4sIG1vZGVsIGhhbnlhIG1lbmluZ2thdGthbiBkZXRla3NpIGNodXJuIDElIHNhamEg4oaSIGVmZmVjdCBzaXplIGtlY2lsIOKGkiBtYW5mYWF0IGJpc25pcyBtdW5na2luIG1pbmltYWwNCjwvZGl2Pg0KDQojIyBUYWJsZSBDb25jbHVzaW9ucw0KPGRpdiBjbGFzcz0icGFzdGVsLWJyb3duLWJveCI+DQoNCnwgTm8gfCBQZXJ0YW55YWFuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgU3RhdGlzdGlrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEludGVycHJldGFzaSBCaXNuaXMgLyBOb24tVGVjaG5pY2FsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCnwgLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwNCnwgMSAgfCBNYWtuYSBwLXZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUHJvYmFiaWxpdGFzIG1lbmRhcGF0a2FuIGhhc2lsIHNlLWVrc3RyZW0gZGF0YSB5YW5nIGRpYW1hdGkgamlrYSBI4oKAIGJlbmFyLiBDb250b2g6IHAgPSAwLDAyMSDihpIgYWRhIDIsMSUga2VtdW5na2luYW4gaGFzaWwgaW5pIHRlcmphZGkgamlrYSBI4oKAIGJlbmFyLiB8IFNlbWFraW4ga2VjaWwgcC12YWx1ZSDihpIgc2VtYWtpbiB0aWRhayBrb25zaXN0ZW4gZGF0YSBkZW5nYW4gSOKCgC4gQXJ0aW55YSBoYXNpbCB1amkgYnVrYW4ga2ViZXR1bGFuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQp8IDIgIHwgS2VwdXR1c2FuIHN0YXRpc3RpayAgICAgICAgICAgICAgICAgICAgICB8IEJhbmRpbmdrYW4gcC12YWx1ZSAoMCwwMjEpIGRlbmdhbiDOsSAoMCwwNSkuIEthcmVuYSBwIDwgzrEg4oaSICoqVG9sYWsgSOKCgCoqLiBNb2RlbCBjaHVybiBzaWduaWZpa2FuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBNb2RlbCBjaHVybiB0ZXJidWt0aSBzZWNhcmEgc3RhdGlzdGlrIGVmZWt0aWYgdW50dWsgbWVtcHJlZGlrc2kgcGVsYW5nZ2FuIGJlcmlzaWtvIGJlcmhlbnRpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQp8IDMgIHwgVGVyamVtYWhhbiB1bnR1ayBtYW5hamVtZW4gICAgICAgICAgICAgICB8IFRvbGFrIEjigoAgYmVyYXJ0aSBtb2RlbCBiZWtlcmphLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IOKAnE1vZGVsIHByZWRpa3NpIGNodXJuIGluaSB0ZXJidWt0aSBlZmVrdGlmIGRhbiBkYXBhdCBkaWd1bmFrYW4gdW50dWsgc3RyYXRlZ2kgcmV0ZW5zaSBwZWxhbmdnYW4uIEhhc2lsIGluaSB0aWRhayB0ZXJqYWRpIHNlY2FyYSBrZWJldHVsYW4u4oCdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQp8IDQgIHwgUmlzaWtvIHNhbXBlbCB0aWRhayByZXByZXNlbnRhdGlmICAgICAgICB8IHAtdmFsdWUgZGloaXR1bmcgZGFyaSBzYW1wZWwuIEppa2Egc2FtcGVsIHRpZGFrIHJlcHJlc2VudGF0aWYg4oaSIHAtdmFsdWUgYmlzYSBtZW55ZXNhdGthbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IE1vZGVsIG11bmdraW4gdGVybGloYXQgZWZla3RpZiBwYWRhIHNhbXBlbCwgdGV0YXBpIHByZWRpa3NpIGRpIHBvcHVsYXNpIG55YXRhIGJpc2EgKip0aWRhayBha3VyYXQqKiwgYmVyaXNpa28gc3RyYXRlZ2kgcmV0ZW5zaSBzYWxhaCBhcmFoLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCnwgNSAgfCBNZW5nYXBhIHAtdmFsdWUgYnVrYW4gdWt1cmFuIGVmZmVjdCBzaXplIHwgcC12YWx1ZSBtZW51bmp1a2thbiBzaWduaWZpa2Fuc2kgc3RhdGlzdGlrLCBidWthbiBiZXNhciBlZmVrLiBCaXNhIGtlY2lsIG1lc2tpIGVmZWsgcHJha3RpcyBrZWNpbCwgdGVyZ2FudHVuZyB1a3VyYW4gc2FtcGVsLiAgICAgICAgICAgICAgICAgICAgICAgICB8IFVudHVrIG1lbmlsYWkgKipzZWJlcmFwYSBiZXNhciBwZW5nYXJ1aCBtb2RlbCoqLCBndW5ha2FuIGVmZmVjdCBzaXplIC8gbWV0cmljcyBwZXJmb3JtYSAoYWNjdXJhY3ksIHByZWNpc2lvbiwgcmVjYWxsLCBBVUMpLiBwLXZhbHVlIGhhbnlhIG1lbnVuanVra2FuIGFkYSBlZmVrIGF0YXUgdGlkYWsuIHwNCg0KPC9kaXY+