Essential Of Probabilitas

Exercises ~ Week 10

1 . Introduction

Probabilitas merupakan fondasi utama dalam statistika dan sains modern, yang memungkinkan kita untuk mengkuantifikasi ketidakpastian. Konsep ini berawal dari analisis permainan peluang pada abad ke-17, namun aplikasinya kini telah merambah ke berbagai disiplin ilmu, mulai dari genetika dan mekanika kuantum hingga ilmu komputer dan ekonomi. Secara formal, probabilitas didefinisikan sebagai ukuran numerik yang menyatakan kemungkinan kemunculan suatu peristiwa (event) dari ruang sampel (semua hasil yang mungkin). Nilai probabilitas berkisar dari 0 (yang menandakan ketidakmungkinan) hingga 1 (yang menandakan kepastian). Makalah atau pembahasan ini akan menguraikan konsep dasar probabilitas, termasuk ruang sampel, jenis-jenis probabilitas (klasik, empiris, dan subjektif), serta aturan-aturan dasar yang mengatur perhitungannya, sebagai landasan untuk memahami analisis statistika yang lebih kompleks.

1.1 .Teori Probabilitas

Teori probabilitas menyediakan dasar matematis untuk memahami dan menghitung probabilitas. Beberapa konsep penting dalam teori probabilitas meliputi:

  1. Ruang Sampel dan Peristiwa : – Ruang Sampel (Sample Space) : Set lengkap dari semua hasil yang mungkin terjadi dari suatu eksperimen. Misalnya, dalam pelemparan koin, ruang sampelnya adalah {Kepala, Ekor}. – Peristiwa (Event) : Subset dari ruang sampel. Misalnya, dalam pelemparan koin, salah satu peristiwa dapat berupa munculnya Kepala.

  2. Probabilitas Klasik : – Didefinisikan sebagai rasio jumlah hasil yang diinginkan dengan total jumlah hasil dalam ruang sampel. Misalnya, probabilitas terbentuknya angka 4 dalam pelemparan sebuah dadu adalah 1/6, karena ada satu angka 4 dari total enam sisi dadu.

  3. Probabilitas Empiris : – Berdasarkan data atau pengamatan yang telah dilakukan. Misalnya, jika kita telah melempar koin 100 kali dan mendapatkan Kepala 55 kali, probabilitas empiris munculnya Kepala adalah 55/100 atau 0,55.

  4. Probabilitas Subjektif : – Berdasarkan dugaan atau asumsi pribadi dan bukan hasil dari eksperimen atau teori. Misalnya, seorang dokter mungkin memberikan probabilitas subjektif tentang peluang penyembuhan pasien berdasarkan pengalaman dan pengamatan pribadi.

1.2 . Jenis-jenis Probabilitas

Berdasarkan cara penentuannya, probabilitas dapat dibagi menjadi beberapa jenis:

  1. Probabilitas Kondisional : Probabilitas suatu peristiwa terjadi dengan syarat bahwa peristiwa lain telah terjadi. Dinyatakan dengan P(A|B), yang berarti probabilitas A terjadi diberikan bahwa B telah terjadi.

  2. Probabilitas Marginal : Probabilitas dari suatu kejadian tanpa mempertimbangkan kejadian lainnya. Misalnya, dalam penelitian tentang preferensi musik, probabilitas marginal seseorang menyukai musik klasik tanpa mempertimbangkan faktor usia atau jenis kelamin.

  3. Probabilitas Total : Menggunakan Teorema Probabilitas Total, yang menyatakan bahwa kita dapat menemukan probabilitas dari suatu kejadian dengan menjumlahkan probabilitas-probabilitas kondisional yang terkait.

1.3 . Aturan-Aturan Probabilitas

Beberapa aturan penting dalam probabilitas termasuk:

  1. Aturan Penjumlahan : Digunakan untuk menghitung probabilitas salah satu dari beberapa kejadian saling eksklusif terjadi. Misalnya, probabilitas terjadinya A atau B adalah P(A) + P(B) jika A dan B saling eksklusif.

  2. Aturan Perkalian : Digunakan untuk menghitung probabilitas dua atau lebih kejadian terjadi bersamaan. Untuk kejadian saling bebas, P(A dan B) = P(A) × P(B). Untuk kejadian tidak saling bebas, P(A dan B) = P(A) × P(B|A).

  3. Hukum Komplemen : Probabilitas suatu kejadian tidak terjadi adalah 1 dikurangi probabilitas kejadian itu terjadi, dinyatakan sebagai P(A’) = 1 – P(A).

2 . Konsep Dasar.

Probabilitas adalah salah satu konsep fundamental dalam statistika, memainkan peran penting dalam memahami dan memprediksi fenomena acak. Probabilitas memungkinkan kita menentukan kemungkinan terjadinya kejadian atau peristiwa tertentu berdasarkan data atau asumsi yang kita miliki. Artikel ini akan menguraikan konsep dasar probabilitas dalam statistika, termasuk definisi, teori, jenis-jenis probabilitas, aturan, dan penerapannya dalam kehidupan sehari-hari serta penelitian ilmiah.

2.1 .Pengertian Probabilitas

Secara sederhana, probabilitas adalah angka antara 0 dan 1 yang mengukur seberapa besar kemungkinan suatu peristiwa terjadi. Probabilitas sebesar 0 berarti peristiwa tersebut tidak akan pernah terjadi, sedangkan probabilitas sebesar 1 berarti peristiwa tersebut pasti terjadi. Probabilitas seringkali dinyatakan dalam bentuk persentase untuk memudahkan interpretasi.

1. Definisi Probabilitas :

Probabilitas adalah peluang bahwa suatu peristiwa akan terjadi.

Rumus :

Jumlah total hasil yang menguntungkan dibagi dengan jumlah total hasil yang mungkin.

\[P(A) = \frac{\text{Jumlah Hasil yang Menguntungkan}}{\text{Jumlah Total Hasil yang Mungkin}}\]

Probabilitas Peristiwa Independen Peluang dua peristiwa (A dan B) terjadi bersamaan, di mana peristiwa satu tidak memengaruhi peristiwa lainnya.

\[P(A \text{ dan } B) = P(A) \times P(B)\]

Contoh: Dalam kasus melempar satu koin, peluang mendapatkan “Head” adalah \(1/2\), atau \(0.5\), atau \(50\%\).

Melempar Satu Koin Hasil yang Mungkin: Head (H) atau Tail (T). Total hasil = 2.

Peluang mendapatkan Head (H):

\(P(H) = 1 \text{ (hasil yang diinginkan)} / 2 \text{ (total hasil)}\)\(P(H) = 0.5\) atau \(50\%\)

Peristiwa Independen: Untuk dua peristiwa independen (tidak saling memengaruhi), probabilitas keduanya terjadi bersamaan adalah hasil perkalian probabilitas masing-masing peristiwa.

Contoh: Jika Anda melempar koin dua kali, probabilitas mendapatkan dua “Head” adalah

\(0.5 \times 0.5 = 0.25\) atau \(25\%\)

2. Ruang Sampel (Sample Space)Definisi :

Ruang sampel mengacu pada seluruh rangkaian hasil yang mungkin terjadi Visualisasi:

contoh:Untuk melempar koin dua kali, kita dapat membuat diagram ruang sampel.

Total Hasil yang Mungkin:

Terdapat empat hasil yang mungkin: Head-Head (HH), Head-Tail (HT), Tail-Head (TH), dan Tail-Tail (TT).

Menghitung Probabilitas Hasil Tunggal:

Probabilitas setiap hasil dihitung dengan mengalikan probabilitas setiap lemparan.

Misalnya, P(HH) = \(0.5 \times 0.5 = 0.25\).

bisa di lihat di visualisai berikut:

Menghitung Probabilitas Peristiwa Kompleks: Untuk menemukan probabilitas peristiwa yang lebih luas (misalnya, mendapatkan setidaknya satu “Tail” saat koin dilempar dua kali), Anda cukup menjumlahkan probabilitas dari semua hasil yang memenuhi kondisi tersebut.

P(Setidaknya satu T) = P(HT) + P(TH) + P(TT) =

\(0.25 + 0.25 + 0.25 = 0.75\).

Menghitung Peristiwa KompleksUntuk mencari probabilitas suatu peristiwa yang melibatkan beberapa hasil (misalnya, at least one Tail), kita menjumlahkan probabilitas semua hasil yang termasuk dalam peristiwa tersebut.

Soal: Berapa peluang mendapatkan setidaknya satu Tail (T)?

Hasil yang memenuhi: HT, TH, TT.

Perhitungan:

\(P(\text{setidaknya satu T}) = P(HT) + P(TH) + P(TT)\)\(P(\text{setidaknya satu T}) = 0.25 + 0.25 + 0.25 = \mathbf{0.75}\) atau \(75\%\)

3. Aturan ProbabilitasSemua masalah probabilitas harus memenuhi dua kondisi wajib:

Nilai Antara 0 dan 1: Probabilitas suatu peristiwa yang terjadi selalu memiliki nilai antara 0 dan 1 (inklusif). Probabilitas 0: Peristiwa tidak akan pernah terjadi, Probabilitas 1: Peristiwa pasti akan terjadi.Total Probabilitas = 1:

Jumlah probabilitas dari semua hasil yang mungkin dalam suatu ruang sampel harus selalu berjumlah 1.

Contoh: Untuk lemparan koin satu kali, P(Head) + P(Tail) = \(0.5 + 0.5 = 1\).

Atau

Setiap masalah probabilitas harus memenuhi dua kondisi penting: Batas Nilai: Probabilitas suatu peristiwa harus selalu memiliki nilai antara 0 dan 1 (inklusif). \(P = 0\) : Peristiwa tidak akan pernah terjadi. \(P = 1\): Peristiwa pasti akan terjadi. \[0 \le P(A) \le 1\] Jumlah Total: Jumlah probabilitas dari semua hasil yang mungkin dalam ruang sampel harus selalu sama dengan 1.

\[\sum P(\text{semua hasil}) = 1\]

4. Aturan Komplemen (The Complement Rule) Prinsip:

Aturan ini menyatakan bahwa probabilitas suatu peristiwa tidak terjadi sama dengan 1 dikurangi probabilitas peristiwa itu akan terjadi.

Formula:

\(P(\text{Komplemen } A) = 1 - P(A)\)

Contoh Penggunaan: Untuk menemukan probabilitas tidak mendapatkan dua “Tail” (TT) saat melempar koin dua kali: \(P(\text{bukan } TT) = 1 - P(TT)\)\(P(\text{bukan } TT) = 1 - 0.25 = 0.75\).

Atu

Aturan komplemen adalah metode yang efisien untuk menghitung probabilitas bahwa suatu peristiwa tidak terjadi.

Definisi: Probabilitas bahwa peristiwa A tidak terjadi sama dengan 1 dikurangi probabilitas bahwa peristiwa A terjadi.

Rumus:

\[P(A^c) = 1 - P(A)\] (Di mana \(A^c\) adalah “komplemen dari A,” atau “A tidak terjadi”)

Contoh: Menggunakan Aturan Komplemen (Melempar Dua Koin)

Soal: Berapa peluang tidak mendapatkan dua Tail (TT)?

Peristiwa A: Mendapatkan dua Tail (TT). Kita tahu \(P(TT) = 0.25\).
Peristiwa \(A^c\) (Komplemen A): Tidak mendapatkan dua Tail.

Perhitungan:

\(P(\text{bukan } TT) = 1 - P(TT)\)\(P(\text{bukan } TT) = 1 - 0.25 = \mathbf{0.75}\) atau \(75\%\)

3 . Mandiri Dan Bergantung

Dalam kehidupan sehari-hari, kita sering menghadapi situasi yang melibatkan ketidakpastian dan peluang. Mulai dari prakiraan cuaca, hasil permainan dadu, hingga analisis risiko dalam dunia keuangan—semuanya memerlukan pemahaman mendasar tentang probabilitas. Namun, yang lebih menarik adalah ketika kita mengamati hubungan antar berbagai kejadian: apakah terjadinya satu peristiwa memengaruhi kemungkinan terjadinya peristiwa lainnya?

Dua konsep fundamental dalam mempelajari hubungan antar kejadian adalah kemandirian (independence) dan ketergan-tungan (dependence). Konsep ini menjawab pertanyaan mendasar: “Apakah pengetahuan tentang terjadinya suatu peristiwa mengubah peluang kita untuk menyaksikan peristiwa lainnya?” .Kemandirian menggambarkan situasi di mana dua kejadian berjalan sendiri-sendiri tanpa saling mempengaruhi, seperti dua koin yang dilempar secara terpisah. Sebaliknya, ketergan-tungan mencerminkan hubungan di mana satu kejadian memberikan informasi berharga tentang kemungkinan terjadinya kejadian lain,seperti pengambilan kartu dari deck tanpa pengembalian.

Video ini menjelaskan bagaimana probabilitas dua peristiwa yang terjadi bersamaan dihitung, tergantung pada apakah peristiwa tersebut saling memengaruhi atau tidak.

1. Peristiwa Independen (Independent Events) Definisi:

Peristiwa independen adalah kondisi di mana terjadinya satu peristiwa tidak memengaruhi probabilitas terjadinya peristiwa yang lain.

Contoh Utama: Melempar Dadu dan Melempar Koin. Hasil dari dadu (misalnya, mendapat angka 6) tidak akan mengubah peluang koin mendarat pada Head (H) atau Tail (T). Peluang H akan tetap 0.5.Rumus Peristiwa IndependenUntuk menghitung probabilitas dua peristiwa independen A dan B terjadi bersamaan, Anda cukup mengalikan probabilitas masing-masing

Peristiwa:

\[\mathbf{P(A \text{ dan } B) = P(A) \times P(B)}\]

Contoh Perhitungan (Dadu dan Koin) Soal:

Berapa probabilitas melempar dadu 6 sisi mendapatkan angka 5 dan melempar koin mendapatkan Head?

Langkah 1: Tentukan \(P(A)\) (Mendapatkan 5 pada Dadu) Hasil yang menguntungkan: 1 (angka 5) Total hasil: 6 (1, 2, 3, 4, 5, 6)\[P(A) = 1/6\]

Langkah 2: Tentukan \(P(B)\) (Mendapatkan Head pada Koin)Hasil yang menguntungkan: 1 (Head)Total hasil: 2 (Head, Tail)\[P(B) = 1/2\]

Langkah 3: Kalikan Probabilitas\[P(A \text{ dan } B) = \frac{1}{6} \times \frac{1}{2} = \frac{1}{12} \approx \mathbf{0.0833} \text{ atau } \mathbf{8.33\%}\]

2. Peristiwa Dependen (Dependent Events)Definisi:

Peristiwa dependen adalah kondisi di mana terjadinya peristiwa pertama memengaruhi probabilitas terjadinya peristiwa yang kedua.

Contoh Utama: Pengambilan item tanpa pengembalian (without replacement).

Ketika Anda mengambil kelereng dari kotak dan tidak mengembalikannya, jumlah total kelereng di dalam kotak berkurang, sehingga mengubah probabilitas untuk pengambilan berikutnya.

Rumus Peristiwa DependenUntuk menghitung probabilitas dua peristiwa dependen A dan B terjadi bersamaan:

\[\mathbf{P(A \text{ dan } B) = P(A) \times P(B \text{ setelah } A)}\] \(P(B \text{ setelah } A)\)

diartikan sebagai probabilitas peristiwa B terjadi setelah peristiwa A sudah terjadi dan memengaruhi ruang sampel.

Contoh Perhitungan (Pengambilan Kelereng Tanpa Pengembalian)Misalkan ada sebuah kotak berisi 10 kelereng :7 kelereng Hijau (H)3 kelereng Biru (B)

Soal A: Berapa peluang mengambil kelereng Hijau lalu kelereng Biru tanpa pengembalian?

Langkah 1: Tentukan \(P(H)\) (Pengambilan Pertama)

\(P(\text{Hijau pertama}) = \frac{\text{Jumlah Hijau}}{\text{Total Kelereng}} = \frac{7}{10}\)

Langkah 2: Tentukan \(P(B \text{ setelah } H)\) (Pengambilan Kedua)Setelah mengambil 1 Hijau, tersisa: 9 kelereng total (7 Hijau + 3 Biru menjadi 6 Hijau + 3 Biru).

\(P(\text{Biru kedua}) = \frac{\text{Jumlah Biru yang tersisa}}{\text{Total Kelereng yang tersisa}} = \frac{3}{9}\)

Langkah 3: Kalikan Probabilitas

\[P(H \text{ lalu } B) = \frac{7}{10} \times \frac{3}{9} = \frac{21}{90} \approx \mathbf{0.2333} \text{ atau } \mathbf{23.33\%}\]

Soal B: Berapa peluang mengambil dua kelereng Hijau tanpa pengembalian?

Langkah 1: Tentukan

\(P(\text{Hijau Pertama})\)\[P(\text{Hijau pertama}) = \frac{7}{10}\]

Langkah 2: Tentukan

\(P(\text{Hijau Kedua setelah Hijau Pertama})\)

Setelah mengambil 1 Hijau, tersisa: 6 Hijau dan 9 total kelereng.

\[P(\text{Hijau kedua}) = \frac{6}{9}\] Langkah 3: Kalikan Probabilitas

\[P(\text{Dua Hijau}) = \frac{7}{10} \times \frac{6}{9} = \frac{42}{90} = \frac{7}{15} \approx \mathbf{0.4667} \text{ atau } \mathbf{46.67\%}\]

4 . Penyatuan Peristiwa

Dalam menganalisis kemungkinan terjadinya suatu peristiwa, kita sering dihadapkan pada situasi yang kompleks dimana multiple peristiwa dapat terjadi secara bersamaan atau alternatif. Bagaimana kita menghitung peluang bahwa minimal satu dari beberapa peristiwa akan terjadi? Atau bagaimana kita mengkombinasikan beberapa kemungkinan outcome menjadi satu ukuran probabilitas yang komprehensif? Pertanyaan-pertanyaan inilah yang mendasari pentingnya pemahaman tentang penyatuan peristiwa (union of events).

Video ini membahas cara menghitung probabilitas bahwa salah satu dari dua kejadian (A atau B) akan terjadi.

Probabilitas Gabungan Dua KejadianVideo ini dimulai dengan mengulas konsep dasar sebelum masuk ke probabilitas gabungan (Union of Events).

4.1. Ulasan Konsep Dasar Ruang Sampel (Sample Space):

Ini adalah seluruh set hasil yang mungkin dalam suatu eksperimen statistik.

Contoh: Melempar satu dadu (6 hasil) atau melempar dua dadu (total 36 hasil yang mungkin, \(6 \times 6\)).

Probabilitas Sederhana : Peluang suatu kejadian akan terjadi, dihitung dengan membagi jumlah hasil yang diinginkan (favorable outcomes) dengan jumlah total hasil yang mungkin (ruang sampel).

Contoh: Probabilitas mendapatkan dua angka 4 saat melempar dua dadu adalah 1/36.

2. Menghitung Irisan Dua Kejadian (“DAN”):

Sebelum membahas “gabungan”, video memperkenalkan “irisan” (intersection), yang ditunjukkan oleh kata “dan”.

Pertanyaan Contoh: Berapa probabilitas mendapatkan dua angka genap dan setidaknya satu angka 2?

Penyelesaian: Karena dua kejadian ini tidak independen (saling berhubungan), kita tidak bisa mengalikan probabilitasnya.

Solusinya adalah mencari hasil di ruang sampel yang memenuhi kedua kriteria (irisan).

Hasil: Ditemukan ada 5 hasil yang tumpang tindih (overlap). Probabilitas irisan adalah 5/36.

3. Konsep Utama: Probabilitas Gabungan Dua Kejadian (“ATAU”)

Kata kunci untuk probabilitas gabungan (Union of Events) adalah “atau” .

Konsep ini menghitung probabilitas bahwa kejadian A atau kejadian B akan terjadi.

Rumus Probabilitas Gabungan (A atau B):

\[P(A \cup B) = P(A) + P(B) - P(A \cap B)\] Penjelasan Rumus: Istilah pengurangan \(P(A \cap B)\) (probabilitas irisan) ada di dalam rumus karena kita harus menghilangkan hasil yang terhitung ganda (duplicate outcomes).

Ketika kita menjumlahkan \(P(A)\) dan \(P(B)\), hasil yang berada di irisan dihitung dua kali, sehingga harus dikurangi satu kali agar menjadi benar.

4. Penerapan Rumus Gabungan

Pertanyaan Contoh: Berapa probabilitas mendapatkan dua angka genap atau setidaknya satu angka 2?

Komponen:

\(P(A)\): Probabilitas dua angka genap = 9/36

\(P(B)\): Probabilitas setidaknya satu angka 2 = 11/36

\(P(A \cap B)\): Probabilitas irisan (dari langkah sebelumnya) = 5/36

Perhitungan:

\[P(\text{A atau B}) = \frac{9}{36} + \frac{11}{36} - \frac{5}{36} = \frac{15}{36}\] Jawaban Akhir: Probabilitas gabungan adalah 15/36 (atau 0.4167).

5 . Eksklusif dan Lengkap

Probabilitas bermula dari intuisi manusia dan kegemarannya berjudi, namun telah berevolusi menjadi sebuah disiplin ilmu matematika yang mendalam dan elegan. Ia tidak lagi sekadar alat untuk memprediksi hasil permainan kartu, tetapi telah menjadi fondasi bagi revolusi ilmiah, teknologi, dan ekonomi modern. Pemahaman yang komprehensif tentang probabilitas tidak dimulai dari rumus, tetapi dari filsafat tentang apa arti “peluang” itu sendiri dan bagaimana kita memodelkan realitas yang tidak pasti.

video ini membahas dua konsep fundamental dalam teori probabilitas: Kejadian Saling Lepas (Mutually Exclusive) dan Kejadian Kolektif Lengkap (Exhaustive Events).

1. Kejadian Saling Lepas (Mutually Exclusive Events)

Kejadian saling lepas (atau terpisah/disjoint) adalah dua atau lebih kejadian yang tidak mungkin terjadi pada saat yang bersamaan.

Karakteristik Utama:

Irisan Nol: Tidak ada hasil yang tumpang tindih (irisan) di antara kejadian-kejadian tersebut.

Jika A dan B adalah kejadian saling lepas, maka probabilitas keduanya terjadi secara bersamaan adalah nol.

\[P(A \cap B) = 0\]

Aturan Penjumlahan yang Disederhanakan: Karena irisannya nol, rumus probabilitas gabungan (“ATAU”) menjadi sederhana:

\[P(A \cup B) = P(A) + P(B)\]

Contoh Kasus:Melempar Koin: Mendapat “Angka” dan mendapat “Gambar” adalah saling lepas. Koin tidak mungkin menghasilkan keduanya sekaligus.

Melempar Dadu Tunggal: Mendapat angka 2 dan mendapat angka 5.

Mustahil mendapatkan dua hasil ini dalam satu lemparan. Kartu Remi: Mengambil kartu King dan mengambil kartu Queen dalam sekali pengambilan adalah saling lepas.

2. Kejadian Kolektif Lengkap (Exhaustive Events)

Kejadian kolektif lengkap adalah sekumpulan dua atau lebih kejadian yang mencakup semua hasil yang mungkin dalam ruang sampel (semua kemungkinan yang ada).

Karakteristik Utama:

Mencakup Semua: Sekurang-kurangnya salah satu dari kejadian-kejadian tersebut pasti terjadi dalam skenario yang diberikan.

Jumlah Probabilitas Sama dengan 1: Jika kita menjumlahkan probabilitas semua kejadian kolektif lengkap, totalnya harus selalu sama dengan 1 (atau 100%).

Contoh Kasus:

Atlet Berenang:

Kejadian A: Atlet memenangkan medali.

Kejadian B: Atlet tidak memenangkan medali.

Kedua kejadian ini kolektif lengkap karena tidak ada hasil lain yang mungkin.

Kantong Kelereng: Jika sebuah tas hanya berisi kelereng Merah dan Biru, maka kejadian mengambil kelereng Merah atau Biru adalah kolektif lengkap, karena semua kemungkinan telah dicakup.Kejadian Saling Lepas DAN Kolektif LengkapAda kasus di mana dua kejadian memenuhi kedua kriteria (saling lepas dan kolektif lengkap).Saling Lepas: Mereka tidak tumpang tindih

(\(P(A \cap B) = 0\)).

Kolektif Lengkap: Gabungan keduanya mencakup seluruh ruang sampel

(\(P(A \cup B) = 1\)).

Contoh klasik adalah pelemparan koin : Mendapat Angka (A) dan mendapat Gambar (G) adalah saling lepas (tidak terjadi bersamaan) dan kolektif lengkap (total probabilitas

\(P(A) + P(G) = 1\)).

6 . Percobaan Binominal

Dalam teori probabilitas, Percobaan Binomial (atau Binomial Experiment) adalah salah satu jenis percobaan acak yang paling fundamental dan banyak penerapannya. Percobaan ini digunakan untuk memodelkan situasi di mana kita hanya peduli pada dua hasil yang mungkin dari setiap percobaan ulang.

Video ini menjelaskan kapan dan bagaimana menggunakan rumus binomial untuk menghitung probabilitas keberhasilan (sukses) atau kegagalan (failure) dalam serangkaian percobaan yang diulang.

1. Pengantar Eksperimen Binomial

Distribusi probabilitas Binomial merujuk pada probabilitas keberhasilan atau kegagalan dalam eksperimen yang diulang berkali-kali. Kata “Bi” berarti dua, merujuk pada dua kemungkinan hasil dalam setiap percobaan: sukses atau gagal.

2. Empat Kondisi Pengaturan Binomial (Binomial Setting)

Suatu eksperimen harus memenuhi empat kondisi berikut agar dapat dikategorikan sebagai eksperimen binomial:

1. Jumlah Percobaan (n) Tetap (Fixed): Jumlah pengulangan eksperimen harus ditetapkan atau diketahui di awal.

2. Dua Hasil yang Mungkin: Setiap percobaan hanya memiliki dua hasil, yaitu sukses atau gagal .

3. Probabilitas Sukses (p) Konstan: Probabilitas sukses (\(p\)) harus tetap sama untuk setiap percobaan.

4. Percobaan Independen: Hasil dari satu percobaan tidak memengaruhi hasil dari percobaan lainnya .

Contoh 1: Pelemparan Koin (Memverifikasi Kondisi)Pertanyaan: Melempar koin biasa sebanyak 3 kali, berapakah probabilitas mendapatkan tepat satu Kepala (Head)?

Penyelesaian Manual: Ada 3 cara untuk mendapatkan 1 Kepala (H): HTT, THT, TTH.

Probabilitas untuk satu urutan (misalnya HTT) adalah

\(0.5 \times 0.5 \times 0.5 = 0.125\).

Probabilitas total:

\(0.125 + 0.125 + 0.125 = **0.375**\).

Verifikasi Binomial: Eksperimen ini memenuhi semua 4 kondisi:

  1. \(n\) = 3$ (Tetap).

  2. Hasil: Kepala (Sukses) atau Ekor (Gagal).

  3. \(p\) = 0.5$ (Konstan).

  4. Hasil pelemparan satu koin tidak memengaruhi yang lain (Independen).

Kesimpulan: Ini adalah eksperimen binomial.

Contoh 2: Pengambilan Kelereng DENGAN Pengembalian Pertanyaan: Dalam kotak berisi 10 kelereng (3 pink, 2 hijau, 5 biru). Jika diambil 5 kelereng dengan pengembalian, berapakah probabilitas mendapatkan tepat 2 kelereng hijau?

Verifikasi Binomial:

  1. \(n = 5\) (5 kali pengambilan).

  2. Sukses: Kelereng Hijau; Gagal: Bukan Hijau.

  3. \(p\) Konstan: Probabilitas sukses (Hijau) adalah \(2/10 = 0.2\). Ini konstan karena pengambilan dilakukan dengan pengembalian.

  4. Independen: Pengembalian memastikan setiap pengambilan adalah independen.

Komponen Probabilitas:

\(P\)() = p = 0.2

\(P\)() = 1 - p = 0.8

Jumlah kombinasi untuk 2 Sukses dan 3 Gagal adalah 10 cara.

5. Rumus Binomial

Untuk menghindari penghitungan manual semua kombinasi (seperti 10 cara di atas), digunakan Rumus Binomial.

Rumus Binomial:

\[P(k) = \binom{n}{k} \cdot p^k \cdot (1-p)^{n-k}\]

# Membuat data frame
tabel_binomial <- data.frame(
Simbol = c("P(k)", "n", "k", "p", "binom(n,k)", "(1-p)", "(n-k)"),
Deskripsi = c(
"Probabilitas untuk k kali sukses",
"Jumlah percobaan total",
"Jumlah sukses yang diinginkan",
"Probabilitas sukses dalam satu percobaan",
"Kombinasi (\"n choose k\"). Ini menghitung semua cara yang mungkin untuk mendapatkan k sukses dari n percobaan",
"Probabilitas kegagalan",
"Jumlah kegagalan"
),
Contoh_Kasus_Kelereng = c("P(2)", "n=5", "k=2", "p=0.2", "binom(5,2)", "1-0.2=0.8", "5-2=3")
)

# Menampilkan tabel dengan kable (package knitr)
library(knitr)
kable(tabel_binomial, 
col.names = c("Simbol", "Deskripsi", "Contoh Kasus Kelereng"),
align = c("c", "l", "c"),
caption = "Tabel Simbol Distribusi Binomial")
Tabel Simbol Distribusi Binomial
Simbol Deskripsi Contoh Kasus Kelereng
P(k) Probabilitas untuk k kali sukses P(2)
n Jumlah percobaan total n=5
k Jumlah sukses yang diinginkan k=2
p Probabilitas sukses dalam satu percobaan p=0.2
binom(n,k) Kombinasi (“n choose k”). Ini menghitung semua cara yang mungkin untuk mendapatkan k sukses dari n percobaan binom(5,2)
(1-p) Probabilitas kegagalan 1-0.2=0.8
(n-k) Jumlah kegagalan 5-2=3

Aplikasi Rumus ke Contoh Kelereng:

\[P(2) = \binom{5}{2} \cdot (0.2)^2 \cdot (1 - 0.2)^{(5-2)}\]\[P(2) = 10 \cdot (0.04) \cdot (0.512)\]\[P(2) = 0.2048\]

Hasil ini sama dengan hasil yang didapat dari penjumlahan 10 kemungkinan cara secara manual. Rumus ini adalah jalan pintas yang efisien untuk menghitung probabilitas dalam eksperimen binomial.

7 . Distribusi Binomial

Distribusi Binomial adalah distribusi probabilitas diskrit yang menghitung peluang sukses dalam sejumlah percobaan tertentu, di mana setiap percobaan memiliki hanya dua kemungkinan hasil (sukses/gagal) dan peluang suksesnya tetap sama untuk setiap percobaan.

Di video ini menjelaskan bagaimana visualisasi dan parameter Distribusi Binomial dipengaruhi oleh jumlah percobaan (\(n\)) dan probabilitas sukses (\(p\)).

1. Ulasan Rumus dan Visualisasi Dasar

Video ini dimulai dengan mengulas Rumus Binomial yang digunakan untuk menghitung probabilitas \(k\) kali sukses dalam \(n\) percobaan :

\[P(k) = \binom{n}{k} \cdot p^k \cdot (1-p)^{n-k}\]

Contoh Dasar (Melempar Koin 2 Kali):

\(n=2\), \(p=0.5\)

Hasil perhitungan probabilitas untuk \(k=0, 1, 2\)

sukses adalah 0.25, 0.50, dan 0.25.

Visualisasinya menggunakan diagram batang (bar chart), di mana sumbu-X adalah jumlah sukses (\(k\)) dan sumbu-Y adalah probabilitasnya.

2. Parameter Distribusi Binomial

Setiap Distribusi Binomial memiliki parameter yang dapat dihitung untuk menentukan titik tengah dan penyebarannya:

# Membuat data frame untuk tabel parameter
parameter_binomial <- data.frame(
Parameter = c("Rata-rata (Mean) ($\\mu$)", 
"Varians ($\\sigma^2$)", 
"Deviasi Standar ($\\sigma$)"),
Rumus = c("$\\mu = n \\cdot p$", 
"$\\sigma^2 = n \\cdot p \\cdot (1-p)$", 
"$\\sigma = \\sqrt{n \\cdot p \\cdot (1-p)}$"),
Deskripsi = c(
"Menunjukkan titik pusat atau jumlah sukses yang diharapkan dalam $n$ percobaan",
"Mengukur seberapa jauh penyebaran data dari rata-rata",
"Akar kuadrat dari varians, sering digunakan untuk mengukur penyebaran"
)
)

# Menampilkan tabel dengan kable
library(knitr)
kable(parameter_binomial,
col.names = c("Parameter", "Rumus", "Deskripsi"),
align = c("l", "c", "l"),
caption = "Tabel Parameter Distribusi Binomial",
escape = FALSE)
Tabel Parameter Distribusi Binomial
Parameter Rumus Deskripsi
Rata-rata (Mean) (\(\mu\)) \(\mu = n \cdot p\) Menunjukkan titik pusat atau jumlah sukses yang diharapkan dalam \(n\) percobaan
Varians (\(\sigma^2\)) \(\sigma^2 = n \cdot p \cdot (1-p)\) Mengukur seberapa jauh penyebaran data dari rata-rata
Deviasi Standar (\(\sigma\)) \(\sigma = \sqrt{n \cdot p \cdot (1-p)}\) Akar kuadrat dari varians, sering digunakan untuk mengukur penyebaran

3. Pengaruh Jumlah Percobaan (\(n\))

Ketika probabilitas sukses (\(p\)) dijaga konstan (misalnya \(p=0.5\)), dan jumlah percobaan (\(n\)) ditingkatkan (misalnya dari \(n=2\) menjadi \(n=10\)), bentuk Distribusi Binomial mulai menyerupai Distribusi Normal (kurva lonceng)

kita bisa lihat di contoh di visualisasi berikut:

4. Pengaruh Probabilitas Sukses (\(p\)) Terhadap Kemiringan (Skewness)

Bentuk (kemiringan) Distribusi Binomial sangat bergantung pada nilai \(p\)

# Membuat data frame untuk tabel bentuk distribusi
bentuk_distribusi <- data.frame(
`Nilai p` = c("$p = 0.5$", "$p < 0.5$", "$p > 0.5$"),
`Bentuk Distribusi` = c("Simetris", "Miring ke Kanan (Right-Skewed)", "Miring ke Kiri (Left-Skewed)"),
`Arah Kemiringan` = c("Tidak miring (berpusat di tengah, $\\mu = n/2$)", 
"Data mengelompok di sisi kiri (mendekati 0)", 
"Data mengelompok di sisi kanan (mendekati $n$)"),
Alasan = c(
"Tingkat sukses sedang, sehingga distribusi seimbang",
"Tingkat sukses rendah, sehingga sebagian besar hasil adalah kegagalan",
"Tingkat sukses tinggi, sehingga sebagian besar hasil adalah keberhasilan"
)
)

# Menampilkan tabel dengan kable
library(knitr)
kable(bentuk_distribusi,
col.names = c("Nilai p", "Bentuk Distribusi", "Arah Kemiringan", "Alasan"),
align = c("c", "c", "l", "l"),
caption = "Tabel Bentuk Distribusi Binomial Berdasarkan Nilai p",
escape = FALSE)
Tabel Bentuk Distribusi Binomial Berdasarkan Nilai p
Nilai p Bentuk Distribusi Arah Kemiringan Alasan
\(p = 0.5\) Simetris Tidak miring (berpusat di tengah, \(\mu = n/2\)) Tingkat sukses sedang, sehingga distribusi seimbang
\(p < 0.5\) Miring ke Kanan (Right-Skewed) Data mengelompok di sisi kiri (mendekati 0) Tingkat sukses rendah, sehingga sebagian besar hasil adalah kegagalan
\(p > 0.5\) Miring ke Kiri (Left-Skewed) Data mengelompok di sisi kanan (mendekati \(n\)) Tingkat sukses tinggi, sehingga sebagian besar hasil adalah keberhasilan

5. Aproksimasi Normal dari Distribusi Binomial

Meskipun distribusi mungkin miring (skewed) karena \(p \neq 0.5\), ia akan menjadi semakin menyerupai Distribusi Normal jika nilai \(n\) (jumlah percobaan) terus ditingkatkan.

Ada pedoman kasar yang digunakan untuk menentukan apakah kita dapat mengasumsikan aproksimasi (pendekatan) Normal untuk suatu Distribusi Binomial:

Dua kondisi harus dipenuhi:

  1. \(n \cdot p \ge 10\) (Rata-rata sukses harus cukup besar).

  2. \(n \cdot (1-p) \ge 10\) (Rata-rata kegagalan juga harus cukup besar).

Jika kedua kondisi ini terpenuhi, penggunaan Distribusi Normal sebagai perkiraan untuk Distribusi Binomial akan menghasilkan akurasi yang baik.

Contoh 1: Kondisi Terpenuhi (n=100, p=0.3)

n × p = 30 ≥ 10 n × (1-p) = 70 ≥ 10
Kesimpulan: Aproksimasi normal direkomendasikan


Contoh 2: p Terlalu Kecil (n=200, p=0.02)

n × p = 4 < 10 n × (1-p) = 196 ≥ 10
Kesimpulan: Aproksimasi normal tidak direkomendasikan


Contoh 3: p Terlalu Besar (n=50, p=0.95)

n × p = 47.5 ≥ 10 n × (1-p) = 2.5 < 10
Kesimpulan: Aproksimasi normal tidak direkomendasikan


Contoh 4: Di Batas (n=50, p=0.2)

n × p = 10 ≥ 10 n × (1-p) = 40 ≥ 10
Kesimpulan: Aproksimasi normal direkomendasikan


Perbandingan Probabilitas

Kasus Baik (n=100, p=0.3)

Probabilitas P(25 ≤ X ≤ 35): - Binomial (eksak): 0.7704 - Normal (aproksimasi): 0.7699 - Selisih: 4^{-4} - Status: Direkomendasikan

Kasus Buruk (n=50, p=0.02)

Probabilitas P(0 ≤ X ≤ 3): - Binomial (eksak): 0.9822 - Normal (aproksimasi): 0.9294 - Selisih: 0.0529 - Status: Tidak Direkomendasikan


Ringkasan Kondisi Aproksimasi

examples <- data.frame(
Kasus = 1:5,
n = c(100, 200, 50, 100, 30),
p = c(0.3, 0.02, 0.95, 0.5, 0.1),
np = c(30, 4, 47.5, 50, 3),
nq = c(70, 196, 2.5, 50, 27),
Direkomendasikan = c(TRUE, FALSE, FALSE, TRUE, FALSE)
)

knitr::kable(examples, align = "c", caption = "Tabel Ringkasan Kondisi Aproksimasi Normal")
Tabel Ringkasan Kondisi Aproksimasi Normal
Kasus n p np nq Direkomendasikan
1 100 0.30 30.0 70.0 TRUE
2 200 0.02 4.0 196.0 FALSE
3 50 0.95 47.5 2.5 FALSE
4 100 0.50 50.0 50.0 TRUE
5 30 0.10 3.0 27.0 FALSE

LS0tDQp0aXRsZTogIkVzc2VudGlhbCBPZiBQcm9iYWJpbGl0YXMiICAgICAgICMgTWFpbiB0aXRsZSBvZiB0aGUgZG9jdW1lbnQNCg0Kc3VidGl0bGU6ICIgRXhlcmNpc2VzIH4gV2VlayAxMCAiICAgICAgICAjIFN1YnRpdGxlIG9yIHRvcGljIGZvciB3ZWVrIDEwDQphdXRob3I6IA0KICAtICJDYXJvbCBEdXBpbm8gcGVyZWlyYSIgICAgICAgICAgICAgICAjIFJlcGxhY2Ugd2l0aCB5b3VyIGZ1bGwgbmFtZQ0KZGF0ZTogImByIGZvcm1hdChTeXMuRGF0ZSgpLCAnJUIgJWQsICVZJylgIiAgIyBBdXRvIGRpc3BsYXlzIGN1cnJlbnQgZGF0ZQ0KDQpvdXRwdXQ6DQogIHJtZGZvcm1hdHM6OnJlYWR0aGVkb3duOiAgICAgICAgICAgICAgICMgaHR0cHM6Ly9naXRodWIuY29tL2p1YmEvcm1kZm9ybWF0cw0KICAgIGNzczogInN0eWxlLmNzcyIgICAgICAgICAgICAgICAgICAgICAjIDwtLS0gUEFOR0dJTCBGSUxFIENTUyBESSBTSU5JDQogICAgc2VsZl9jb250YWluZWQ6IHRydWUgICAgICAgICAgICAgICAgICMgRW1iZWQgYWxsIHJlc291cmNlcw0KICAgIHRodW1ibmFpbHM6IHRydWUgICAgICAgICAgICAgICAgICAgICAjIFNob3cgaW1hZ2UgdGh1bWJuYWlscw0KICAgIGxpZ2h0Ym94OiB0cnVlICAgICAgICAgICAgICAgICAgICAgICAjIEVuYWJsZSBjbGljay10by16b29tIGltYWdlcw0KICAgIGdhbGxlcnk6IHRydWUgICAgICAgICAgICAgICAgICAgICAgICAjIEdyb3VwIGltYWdlcyBpbnRvIGdhbGxlcnkNCiAgICBudW1iZXJfc2VjdGlvbnM6IHRydWUgICAgICAgICAgICAgICAgIyBOdW1iZXIgYWxsIHNlY3Rpb25zDQogICAgbGliX2RpcjogbGlicyAgICAgICAgICAgICAgICAgICAgICAgICMgU2F2ZSBKUy9DU1MgbGlicmFyaWVzDQogICAgZGZfcHJpbnQ6ICJwYWdlZCIgICAgICAgICAgICAgICAgICAgICMgUGFnZWQgZGF0YSBmcmFtZXMNCiAgICBjb2RlX2ZvbGRpbmc6ICJzaG93IiAgICAgICAgICAgICAgICAgIyBFeHBhbmRhYmxlIGNvZGUgYmxvY2tzDQogICAgY29kZV9kb3dubG9hZDogeWVzICAgICAgICAgICAgICAgICAgICMgQWRkIGJ1dHRvbiB0byBkb3dubG9hZCBSIGNvZGUNCi0tLQ0KDQoNCg0KYGBge3IsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIG91dC5leHRyYT0nc3R5bGU9ImRpc3BsYXk6YmxvY2s7IG1hcmdpbi1sZWZ0OmF1dG87IG1hcmdpbi1yaWdodDphdXRvOyInfQ0KbGlicmFyeShtYWdpY2spDQpnYW1iYXIgPC0gaW1hZ2VfcmVhZCgiZm90b18xLmpwZyIpDQpnYW1iYXINCmBgYA0KDQoNCiMjIC4gSW50cm9kdWN0aW9uDQoNCg0KUHJvYmFiaWxpdGFzIG1lcnVwYWthbiBmb25kYXNpIHV0YW1hIGRhbGFtIHN0YXRpc3Rpa2EgZGFuIHNhaW5zIG1vZGVybiwgeWFuZyBtZW11bmdraW5rYW4ga2l0YSB1bnR1ayBtZW5na3VhbnRpZmlrYXNpIGtldGlkYWtwYXN0aWFuLiBLb25zZXAgaW5pIGJlcmF3YWwgZGFyaSBhbmFsaXNpcyBwZXJtYWluYW4gcGVsdWFuZyBwYWRhIGFiYWQga2UtMTcsIG5hbXVuIGFwbGlrYXNpbnlhIGtpbmkgdGVsYWggbWVyYW1iYWgga2UgYmVyYmFnYWkgZGlzaXBsaW4gaWxtdSwgbXVsYWkgZGFyaSBnZW5ldGlrYSBkYW4gbWVrYW5pa2Ega3VhbnR1bSBoaW5nZ2EgaWxtdSBrb21wdXRlciBkYW4gZWtvbm9taS4gU2VjYXJhIGZvcm1hbCwgcHJvYmFiaWxpdGFzIGRpZGVmaW5pc2lrYW4gc2ViYWdhaSB1a3VyYW4gbnVtZXJpayB5YW5nIG1lbnlhdGFrYW4ga2VtdW5na2luYW4ga2VtdW5jdWxhbiBzdWF0dSBwZXJpc3Rpd2EgKGV2ZW50KSBkYXJpIHJ1YW5nIHNhbXBlbCAoc2VtdWEgaGFzaWwgeWFuZyBtdW5na2luKS4gTmlsYWkgcHJvYmFiaWxpdGFzIGJlcmtpc2FyIGRhcmkgMCAoeWFuZyBtZW5hbmRha2FuIGtldGlkYWttdW5na2luYW4pIGhpbmdnYSAxICh5YW5nIG1lbmFuZGFrYW4ga2VwYXN0aWFuKS4gTWFrYWxhaCBhdGF1IHBlbWJhaGFzYW4gaW5pIGFrYW4gbWVuZ3VyYWlrYW4ga29uc2VwIGRhc2FyIHByb2JhYmlsaXRhcywgdGVybWFzdWsgcnVhbmcgc2FtcGVsLCBqZW5pcy1qZW5pcyBwcm9iYWJpbGl0YXMgKGtsYXNpaywgZW1waXJpcywgZGFuIHN1Ympla3RpZiksIHNlcnRhIGF0dXJhbi1hdHVyYW4gZGFzYXIgeWFuZyBtZW5nYXR1ciBwZXJoaXR1bmdhbm55YSwgc2ViYWdhaSBsYW5kYXNhbiB1bnR1ayBtZW1haGFtaSBhbmFsaXNpcyBzdGF0aXN0aWthIHlhbmcgbGViaWgga29tcGxla3MuDQoNCg0KIyMjIC5UZW9yaSBQcm9iYWJpbGl0YXMNCg0KVGVvcmkgcHJvYmFiaWxpdGFzIG1lbnllZGlha2FuIGRhc2FyIG1hdGVtYXRpcyB1bnR1ayBtZW1haGFtaSBkYW4gbWVuZ2hpdHVuZyBwcm9iYWJpbGl0YXMuIEJlYmVyYXBhIGtvbnNlcCBwZW50aW5nIGRhbGFtIHRlb3JpIHByb2JhYmlsaXRhcyBtZWxpcHV0aToNCg0KMS4gUnVhbmcgU2FtcGVsIGRhbiBQZXJpc3Rpd2EgOg0K4oCTIFJ1YW5nIFNhbXBlbCAoU2FtcGxlIFNwYWNlKSA6IFNldCBsZW5na2FwIGRhcmkgc2VtdWEgaGFzaWwgeWFuZyBtdW5na2luIHRlcmphZGkgZGFyaSBzdWF0dSBla3NwZXJpbWVuLiBNaXNhbG55YSwgZGFsYW0gcGVsZW1wYXJhbiBrb2luLCBydWFuZyBzYW1wZWxueWEgYWRhbGFoIHtLZXBhbGEsIEVrb3J9Lg0K4oCTIFBlcmlzdGl3YSAoRXZlbnQpIDogU3Vic2V0IGRhcmkgcnVhbmcgc2FtcGVsLiBNaXNhbG55YSwgZGFsYW0gcGVsZW1wYXJhbiBrb2luLCBzYWxhaCBzYXR1IHBlcmlzdGl3YSBkYXBhdCBiZXJ1cGEgbXVuY3VsbnlhIEtlcGFsYS4NCg0KMi4gUHJvYmFiaWxpdGFzIEtsYXNpayA6DQrigJMgRGlkZWZpbmlzaWthbiBzZWJhZ2FpIHJhc2lvIGp1bWxhaCBoYXNpbCB5YW5nIGRpaW5naW5rYW4gZGVuZ2FuIHRvdGFsIGp1bWxhaCBoYXNpbCBkYWxhbSBydWFuZyBzYW1wZWwuIE1pc2FsbnlhLCBwcm9iYWJpbGl0YXMgdGVyYmVudHVrbnlhIGFuZ2thIDQgZGFsYW0gcGVsZW1wYXJhbiBzZWJ1YWggZGFkdSBhZGFsYWggMS82LCBrYXJlbmEgYWRhIHNhdHUgYW5na2EgNCBkYXJpIHRvdGFsIGVuYW0gc2lzaSBkYWR1Lg0KDQozLiBQcm9iYWJpbGl0YXMgRW1waXJpcyA6DQrigJMgQmVyZGFzYXJrYW4gZGF0YSBhdGF1IHBlbmdhbWF0YW4geWFuZyB0ZWxhaCBkaWxha3VrYW4uIE1pc2FsbnlhLCBqaWthIGtpdGEgdGVsYWggbWVsZW1wYXIga29pbiAxMDAga2FsaSBkYW4gbWVuZGFwYXRrYW4gS2VwYWxhIDU1IGthbGksIHByb2JhYmlsaXRhcyBlbXBpcmlzIG11bmN1bG55YSBLZXBhbGEgYWRhbGFoIDU1LzEwMCBhdGF1IDAsNTUuDQoNCjQuIFByb2JhYmlsaXRhcyBTdWJqZWt0aWYgOg0K4oCTIEJlcmRhc2Fya2FuIGR1Z2FhbiBhdGF1IGFzdW1zaSBwcmliYWRpIGRhbiBidWthbiBoYXNpbCBkYXJpIGVrc3BlcmltZW4gYXRhdSB0ZW9yaS4gTWlzYWxueWEsIHNlb3JhbmcgZG9rdGVyIG11bmdraW4gbWVtYmVyaWthbiBwcm9iYWJpbGl0YXMgc3ViamVrdGlmIHRlbnRhbmcgcGVsdWFuZyBwZW55ZW1idWhhbiBwYXNpZW4gYmVyZGFzYXJrYW4gcGVuZ2FsYW1hbiBkYW4gcGVuZ2FtYXRhbiBwcmliYWRpLg0KDQojIyMgLiBKZW5pcy1qZW5pcyBQcm9iYWJpbGl0YXMNCg0KQmVyZGFzYXJrYW4gY2FyYSBwZW5lbnR1YW5ueWEsIHByb2JhYmlsaXRhcyBkYXBhdCBkaWJhZ2kgbWVuamFkaSBiZWJlcmFwYSBqZW5pczoNCg0KMS4gUHJvYmFiaWxpdGFzIEtvbmRpc2lvbmFsIDoNClByb2JhYmlsaXRhcyBzdWF0dSBwZXJpc3Rpd2EgdGVyamFkaSBkZW5nYW4gc3lhcmF0IGJhaHdhIHBlcmlzdGl3YSBsYWluIHRlbGFoIHRlcmphZGkuIERpbnlhdGFrYW4gZGVuZ2FuIFAoQXxCKSwgeWFuZyBiZXJhcnRpIHByb2JhYmlsaXRhcyBBIHRlcmphZGkgZGliZXJpa2FuIGJhaHdhIEIgdGVsYWggdGVyamFkaS4NCg0KMi4gUHJvYmFiaWxpdGFzIE1hcmdpbmFsIDoNClByb2JhYmlsaXRhcyBkYXJpIHN1YXR1IGtlamFkaWFuIHRhbnBhIG1lbXBlcnRpbWJhbmdrYW4ga2VqYWRpYW4gbGFpbm55YS4gTWlzYWxueWEsIGRhbGFtIHBlbmVsaXRpYW4gdGVudGFuZyBwcmVmZXJlbnNpIG11c2lrLCBwcm9iYWJpbGl0YXMgbWFyZ2luYWwgc2VzZW9yYW5nIG1lbnl1a2FpIG11c2lrIGtsYXNpayB0YW5wYSBtZW1wZXJ0aW1iYW5na2FuIGZha3RvciB1c2lhIGF0YXUgamVuaXMga2VsYW1pbi4NCg0KMy4gUHJvYmFiaWxpdGFzIFRvdGFsIDoNCk1lbmdndW5ha2FuIFRlb3JlbWEgUHJvYmFiaWxpdGFzIFRvdGFsLCB5YW5nIG1lbnlhdGFrYW4gYmFod2Ega2l0YSBkYXBhdCBtZW5lbXVrYW4gcHJvYmFiaWxpdGFzIGRhcmkgc3VhdHUga2VqYWRpYW4gZGVuZ2FuIG1lbmp1bWxhaGthbiBwcm9iYWJpbGl0YXMtcHJvYmFiaWxpdGFzIGtvbmRpc2lvbmFsIHlhbmcgdGVya2FpdC4NCg0KIyMjIC4gQXR1cmFuLUF0dXJhbiBQcm9iYWJpbGl0YXMNCg0KQmViZXJhcGEgYXR1cmFuIHBlbnRpbmcgZGFsYW0gcHJvYmFiaWxpdGFzIHRlcm1hc3VrOg0KDQoxLiBBdHVyYW4gUGVuanVtbGFoYW4gOg0KRGlndW5ha2FuIHVudHVrIG1lbmdoaXR1bmcgcHJvYmFiaWxpdGFzIHNhbGFoIHNhdHUgZGFyaSBiZWJlcmFwYSBrZWphZGlhbiBzYWxpbmcgZWtza2x1c2lmIHRlcmphZGkuIE1pc2FsbnlhLCBwcm9iYWJpbGl0YXMgdGVyamFkaW55YSBBIGF0YXUgQiBhZGFsYWggUChBKSArIFAoQikgamlrYSBBIGRhbiBCIHNhbGluZyBla3NrbHVzaWYuDQoNCjIuIEF0dXJhbiBQZXJrYWxpYW4gOg0KRGlndW5ha2FuIHVudHVrIG1lbmdoaXR1bmcgcHJvYmFiaWxpdGFzIGR1YSBhdGF1IGxlYmloIGtlamFkaWFuIHRlcmphZGkgYmVyc2FtYWFuLiBVbnR1ayBrZWphZGlhbiBzYWxpbmcgYmViYXMsIFAoQSBkYW4gQikgPSBQKEEpIMOXIFAoQikuIFVudHVrIGtlamFkaWFuIHRpZGFrIHNhbGluZyBiZWJhcywgUChBIGRhbiBCKSA9IFAoQSkgw5cgUChCfEEpLg0KDQozLiBIdWt1bSBLb21wbGVtZW4gOg0KUHJvYmFiaWxpdGFzIHN1YXR1IGtlamFkaWFuIHRpZGFrIHRlcmphZGkgYWRhbGFoIDEgZGlrdXJhbmdpIHByb2JhYmlsaXRhcyBrZWphZGlhbiBpdHUgdGVyamFkaSwgZGlueWF0YWthbiBzZWJhZ2FpIFAoQeKAmSkgPSAxIOKAkyBQKEEpLg0KDQojIyAuIEtvbnNlcCBEYXNhci4NCg0KUHJvYmFiaWxpdGFzIGFkYWxhaCBzYWxhaCBzYXR1IGtvbnNlcCBmdW5kYW1lbnRhbCBkYWxhbSBzdGF0aXN0aWthLCBtZW1haW5rYW4gcGVyYW4gcGVudGluZyBkYWxhbSBtZW1haGFtaSBkYW4gbWVtcHJlZGlrc2kgZmVub21lbmEgYWNhay4gUHJvYmFiaWxpdGFzIG1lbXVuZ2tpbmthbiBraXRhIG1lbmVudHVrYW4ga2VtdW5na2luYW4gdGVyamFkaW55YSBrZWphZGlhbiBhdGF1IHBlcmlzdGl3YSB0ZXJ0ZW50dSBiZXJkYXNhcmthbiBkYXRhIGF0YXUgYXN1bXNpIHlhbmcga2l0YSBtaWxpa2kuIEFydGlrZWwgaW5pIGFrYW4gbWVuZ3VyYWlrYW4ga29uc2VwIGRhc2FyIHByb2JhYmlsaXRhcyBkYWxhbSBzdGF0aXN0aWthLCB0ZXJtYXN1ayBkZWZpbmlzaSwgdGVvcmksIGplbmlzLWplbmlzIHByb2JhYmlsaXRhcywgYXR1cmFuLCBkYW4gcGVuZXJhcGFubnlhIGRhbGFtIGtlaGlkdXBhbiBzZWhhcmktaGFyaSBzZXJ0YSBwZW5lbGl0aWFuDQppbG1pYWguDQoNCg0KDQo8Y2VudGVyPg0KPGlmcmFtZSBzcmM9Imh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL2VtYmVkL3luakhLQkNpR1hZIiB3aWR0aD0iNDgwIiBoZWlnaHQ9IjI3MCIgZGF0YS1leHRlcm5hbD0iMSIgZnJhbWVib3JkZXI9IjAiIGFsbG93ZnVsbHNjcmVlbj4gPC9pZnJhbWU+DQo8L2NlbnRlcj4NCg0KIyMjIC5QZW5nZXJ0aWFuIFByb2JhYmlsaXRhcw0KDQpTZWNhcmEgc2VkZXJoYW5hLCBwcm9iYWJpbGl0YXMgYWRhbGFoIGFuZ2thIGFudGFyYSAwIGRhbiAxIHlhbmcgbWVuZ3VrdXIgc2ViZXJhcGEgYmVzYXIga2VtdW5na2luYW4gc3VhdHUgcGVyaXN0aXdhIHRlcmphZGkuIFByb2JhYmlsaXRhcyBzZWJlc2FyIDAgYmVyYXJ0aSBwZXJpc3Rpd2EgdGVyc2VidXQgdGlkYWsgYWthbiBwZXJuYWggdGVyamFkaSwgc2VkYW5na2FuIHByb2JhYmlsaXRhcyBzZWJlc2FyIDEgYmVyYXJ0aSBwZXJpc3Rpd2EgdGVyc2VidXQgcGFzdGkgdGVyamFkaS4gUHJvYmFiaWxpdGFzIHNlcmluZ2thbGkgZGlueWF0YWthbiBkYWxhbSBiZW50dWsgcGVyc2VudGFzZSB1bnR1ayBtZW11ZGFoa2FuIGludGVycHJldGFzaS4NCg0KDQoNCioqMS4gRGVmaW5pc2kgUHJvYmFiaWxpdGFzIDoqKg0KDQpQcm9iYWJpbGl0YXMgYWRhbGFoIHBlbHVhbmcgYmFod2Egc3VhdHUgcGVyaXN0aXdhIGFrYW4gdGVyamFkaS4NCg0KKipSdW11cyoqIDogDQoNCkp1bWxhaCB0b3RhbCBoYXNpbCB5YW5nIG1lbmd1bnR1bmdrYW4gZGliYWdpIGRlbmdhbiBqdW1sYWggdG90YWwgaGFzaWwgeWFuZyBtdW5na2luLg0KDQoNCiQkUChBKSA9IFxmcmFje1x0ZXh0e0p1bWxhaCBIYXNpbCB5YW5nIE1lbmd1bnR1bmdrYW59fXtcdGV4dHtKdW1sYWggVG90YWwgSGFzaWwgeWFuZyBNdW5na2lufX0kJA0KDQoNClByb2JhYmlsaXRhcyBQZXJpc3Rpd2EgSW5kZXBlbmRlbiBQZWx1YW5nIGR1YSBwZXJpc3Rpd2EgKEEgZGFuDQpCKSB0ZXJqYWRpIGJlcnNhbWFhbiwgZGkgbWFuYSBwZXJpc3Rpd2Egc2F0dSB0aWRhayBtZW1lbmdhcnVoaSBwZXJpc3Rpd2EgbGFpbm55YS4NCg0KJCRQKEEgXHRleHR7IGRhbiB9IEIpID0gUChBKSBcdGltZXMgUChCKSQkDQoNCioqQ29udG9oKio6IERhbGFtIGthc3VzIG1lbGVtcGFyIHNhdHUga29pbiwgcGVsdWFuZyBtZW5kYXBhdGthbiAiSGVhZCIgYWRhbGFoICQxLzIkLCBhdGF1ICQwLjUkLCBhdGF1ICQ1MFwlJC4NCg0KTWVsZW1wYXIgU2F0dSBLb2luIEhhc2lsIHlhbmcgTXVuZ2tpbjogSGVhZCAoSCkgYXRhdSBUYWlsIChUKS4NClRvdGFsIGhhc2lsID0gMi4NCg0KUGVsdWFuZyBtZW5kYXBhdGthbiBIZWFkIChIKToNCg0KJFAoSCkgPSAxIFx0ZXh0eyAoaGFzaWwgeWFuZyBkaWluZ2lua2FuKX0gLyAyIFx0ZXh0eyAodG90YWwgaGFzaWwpfSQkUChIKSA9IDAuNSQgYXRhdSAkNTBcJSQNCg0KKipQZXJpc3Rpd2EgSW5kZXBlbmRlbjoqKg0KVW50dWsgZHVhIHBlcmlzdGl3YSBpbmRlcGVuZGVuICh0aWRhayBzYWxpbmcgbWVtZW5nYXJ1aGkpLCBwcm9iYWJpbGl0YXMga2VkdWFueWEgdGVyamFkaSBiZXJzYW1hYW4gYWRhbGFoIGhhc2lsIHBlcmthbGlhbiBwcm9iYWJpbGl0YXMgbWFzaW5nLW1hc2luZyBwZXJpc3Rpd2EuDQoNCkNvbnRvaDogSmlrYSBBbmRhIG1lbGVtcGFyIGtvaW4gZHVhIGthbGksIHByb2JhYmlsaXRhcyBtZW5kYXBhdGthbiBkdWEgIkhlYWQiIGFkYWxhaA0KDQokMC41IFx0aW1lcyAwLjUgPSAwLjI1JCBhdGF1ICQyNVwlJCANCg0KDQoNCioqMi4gUnVhbmcgU2FtcGVsIChTYW1wbGUgU3BhY2UpRGVmaW5pc2kgOioqDQoNClJ1YW5nIHNhbXBlbCBtZW5nYWN1IHBhZGEgc2VsdXJ1aCByYW5na2FpYW4gaGFzaWwgeWFuZyBtdW5na2luIHRlcmphZGkgVmlzdWFsaXNhc2k6IA0KDQoNCioqY29udG9oKio6VW50dWsgbWVsZW1wYXIga29pbiBkdWEga2FsaSwga2l0YSBkYXBhdCBtZW1idWF0IGRpYWdyYW0gcnVhbmcgc2FtcGVsLg0KDQpUb3RhbCBIYXNpbCB5YW5nIE11bmdraW46DQoNClRlcmRhcGF0IGVtcGF0IGhhc2lsIHlhbmcgbXVuZ2tpbjogSGVhZC1IZWFkIChISCksIEhlYWQtVGFpbCAoSFQpLCBUYWlsLUhlYWQgKFRIKSwgZGFuIFRhaWwtVGFpbCAoVFQpLg0KDQpNZW5naGl0dW5nIFByb2JhYmlsaXRhcyBIYXNpbCBUdW5nZ2FsOg0KDQpQcm9iYWJpbGl0YXMgc2V0aWFwIGhhc2lsIGRpaGl0dW5nIGRlbmdhbiBtZW5nYWxpa2FuIHByb2JhYmlsaXRhcyBzZXRpYXAgbGVtcGFyYW4uDQoNCk1pc2FsbnlhLCBQKEhIKSA9ICQwLjUgXHRpbWVzIDAuNSA9IDAuMjUkLg0KDQoNCmJpc2EgZGkgbGloYXQgZGkgdmlzdWFsaXNhaSBiZXJpa3V0Og0KDQoNCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBvdXQuZXh0cmE9J3N0eWxlPSJkaXNwbGF5OmJsb2NrOyBtYXJnaW4tbGVmdDphdXRvOyBtYXJnaW4tcmlnaHQ6YXV0bzsiJ30NCg0KbGlicmFyeShpZ3JhcGgpDQpsaWJyYXJ5KGtuaXRyKQ0KbGlicmFyeShrYWJsZUV4dHJhKQ0KDQojIE1lbWJ1YXQgdHJlZSBkaWFncmFtIGRlbmdhbiB3YXJuYSB5YW5nIGxlYmloIG1lbmFyaWsNCmVkZ2VzIDwtIGRhdGEuZnJhbWUoDQogIGZyb20gPSBjKCJTdGFydCIsICJTdGFydCIsICJIMSIsICJIMSIsICJUMSIsICJUMSIpLA0KICB0byA9IGMoIkgxIiwgIlQxIiwgIkhIIiwgIkhUIiwgIlRIIiwgIlRUIiksDQogIHByb2IgPSBjKCIwLjUiLCAiMC41IiwgIjAuNSIsICIwLjUiLCAiMC41IiwgIjAuNSIpDQopDQoNCm5vZGVzIDwtIGRhdGEuZnJhbWUoDQogIG5hbWUgPSBjKCJTdGFydCIsICJIMSIsICJUMSIsICJISCIsICJIVCIsICJUSCIsICJUVCIpLA0KICBsYWJlbCA9IGMoIlN0YXJ0IiwgIkgiLCAiVCIsICJISFxuKDAuMjUpIiwgIkhUXG4oMC4yNSkiLCAiVEhcbigwLjI1KSIsICJUVFxuKDAuMjUpIiksDQogIHR5cGUgPSBjKCJzdGFydCIsICJpbnRlcm1lZGlhdGUiLCAiaW50ZXJtZWRpYXRlIiwgImZpbmFsIiwgImZpbmFsIiwgImZpbmFsIiwgImZpbmFsIikNCikNCg0KZyA8LSBncmFwaF9mcm9tX2RhdGFfZnJhbWUoZWRnZXMsIHZlcnRpY2VzID0gbm9kZXMpDQoNCiMgUGxvdCB0cmVlIGRpYWdyYW0gZGVuZ2FuIHN0eWxpbmcgeWFuZyBsZWJpaCBiYWlrDQpzZXQuc2VlZCgxMjMpDQpwYXIobWFyID0gYygxLCAxLCAzLCAxKSwgYmcgPSAiI2Y4ZjlmYSIpDQpwbG90KGcsIA0KICAgICBsYXlvdXQgPSBsYXlvdXRfYXNfdHJlZShnLCByb290ID0gMSksDQogICAgIHZlcnRleC5sYWJlbCA9IG5vZGVzJGxhYmVsLA0KICAgICB2ZXJ0ZXguc2l6ZSA9IDM1LA0KICAgICB2ZXJ0ZXguY29sb3IgPSBjKCIjMWE1Mjc2IiwgIiMyOTgwYjkiLCAiI2MwMzkyYiIsICIjMjdhZTYwIiwgIiMyN2FlNjAiLCAiIzI3YWU2MCIsICIjMjdhZTYwIiksDQogICAgIHZlcnRleC5mcmFtZS5jb2xvciA9ICJ3aGl0ZSIsDQogICAgIHZlcnRleC5sYWJlbC5jb2xvciA9ICJ3aGl0ZSIsDQogICAgIHZlcnRleC5sYWJlbC5mYW1pbHkgPSAic2FucyIsDQogICAgIHZlcnRleC5sYWJlbC5jZXggPSAwLjksDQogICAgIGVkZ2UubGFiZWwgPSBlZGdlcyRwcm9iLA0KICAgICBlZGdlLmxhYmVsLmNvbG9yID0gIiNlNzRjM2MiLA0KICAgICBlZGdlLmxhYmVsLmZhbWlseSA9ICJzYW5zIiwNCiAgICAgZWRnZS5sYWJlbC5jZXggPSAxLjEsDQogICAgIGVkZ2UuYXJyb3cuc2l6ZSA9IDAuNiwNCiAgICAgZWRnZS5jb2xvciA9ICIjN2Y4YzhkIiwNCiAgICAgZWRnZS53aWR0aCA9IDIsDQogICAgIG1haW4gPSAiRElBR1JBTSBQUk9CQUJJTElUQVMgTEVNUEFSQU4gS09JTlxuKFBlbGVtcGFyYW4gRHVhIEthbGkpIiwNCiAgICAgY2V4Lm1haW4gPSAxLjIsDQogICAgIGZvbnQubWFpbiA9IDIsDQogICAgIGNvbC5tYWluID0gIiMyYzNlNTAiKQ0KYGBgDQoNCk1lbmdoaXR1bmcgUHJvYmFiaWxpdGFzIFBlcmlzdGl3YSBLb21wbGVrczoNClVudHVrIG1lbmVtdWthbiBwcm9iYWJpbGl0YXMgcGVyaXN0aXdhIHlhbmcgbGViaWggbHVhcyAobWlzYWxueWEsIG1lbmRhcGF0a2FuIHNldGlkYWtueWEgc2F0dSAiVGFpbCIgc2FhdCBrb2luIGRpbGVtcGFyIGR1YSBrYWxpKSwgQW5kYSBjdWt1cCBtZW5qdW1sYWhrYW4gcHJvYmFiaWxpdGFzIGRhcmkgc2VtdWEgaGFzaWwgeWFuZyBtZW1lbnVoaSBrb25kaXNpIHRlcnNlYnV0Lg0KDQpQKFNldGlkYWtueWEgc2F0dSBUKSA9IFAoSFQpICsgUChUSCkgKyBQKFRUKSA9IA0KDQokMC4yNSArIDAuMjUgKyAwLjI1ID0gMC43NSQuDQoNCg0KTWVuZ2hpdHVuZyBQZXJpc3Rpd2EgS29tcGxla3NVbnR1ayBtZW5jYXJpIHByb2JhYmlsaXRhcyBzdWF0dSBwZXJpc3Rpd2EgeWFuZyBtZWxpYmF0a2FuIGJlYmVyYXBhIGhhc2lsIChtaXNhbG55YSwgYXQgbGVhc3Qgb25lIFRhaWwpLCBraXRhIG1lbmp1bWxhaGthbiBwcm9iYWJpbGl0YXMgc2VtdWEgaGFzaWwgeWFuZyB0ZXJtYXN1ayBkYWxhbSBwZXJpc3Rpd2EgdGVyc2VidXQuDQoNCioqU29hbCoqOiBCZXJhcGEgcGVsdWFuZyBtZW5kYXBhdGthbiBzZXRpZGFrbnlhIHNhdHUgVGFpbCAoVCk/DQoNCkhhc2lsIHlhbmcgbWVtZW51aGk6IEhULCBUSCwgVFQuDQoNClBlcmhpdHVuZ2FuOg0KDQokUChcdGV4dHtzZXRpZGFrbnlhIHNhdHUgVH0pID0gUChIVCkgKyBQKFRIKSArIFAoVFQpJCRQKFx0ZXh0e3NldGlkYWtueWEgc2F0dSBUfSkgPSAwLjI1ICsgMC4yNSArIDAuMjUgPSBcbWF0aGJmezAuNzV9JCBhdGF1ICQ3NVwlJA0KDQoNCg0KKiozLiBBdHVyYW4gUHJvYmFiaWxpdGFzU2VtdWEgbWFzYWxhaCBwcm9iYWJpbGl0YXMgaGFydXMgbWVtZW51aGkgZHVhIGtvbmRpc2kgd2FqaWI6KioNCg0KTmlsYWkgQW50YXJhIDAgZGFuIDE6IFByb2JhYmlsaXRhcyBzdWF0dSBwZXJpc3Rpd2EgeWFuZyB0ZXJqYWRpIHNlbGFsdSBtZW1pbGlraSBuaWxhaSBhbnRhcmEgMCBkYW4gMSAoaW5rbHVzaWYpLg0KUHJvYmFiaWxpdGFzIDA6IFBlcmlzdGl3YSB0aWRhayBha2FuIHBlcm5haCB0ZXJqYWRpLCBQcm9iYWJpbGl0YXMgMTogUGVyaXN0aXdhIHBhc3RpIGFrYW4gdGVyamFkaS5Ub3RhbCBQcm9iYWJpbGl0YXMgPSAxOiANCg0KSnVtbGFoIHByb2JhYmlsaXRhcyBkYXJpIHNlbXVhIGhhc2lsIHlhbmcgbXVuZ2tpbiBkYWxhbSBzdWF0dSBydWFuZyBzYW1wZWwgaGFydXMgc2VsYWx1IGJlcmp1bWxhaCAxLg0KDQoqKkNvbnRvaDoqKiBVbnR1ayBsZW1wYXJhbiBrb2luIHNhdHUga2FsaSwgUChIZWFkKSArIFAoVGFpbCkgPSAkMC41ICsgMC41ID0gMSQuDQoNCkF0YXUgDQoNClNldGlhcCBtYXNhbGFoIHByb2JhYmlsaXRhcyBoYXJ1cyBtZW1lbnVoaSBkdWEga29uZGlzaSBwZW50aW5nOiBCYXRhcyBOaWxhaTogUHJvYmFiaWxpdGFzIHN1YXR1IHBlcmlzdGl3YSBoYXJ1cyBzZWxhbHUgbWVtaWxpa2kgbmlsYWkgYW50YXJhIDAgZGFuIDEgKGlua2x1c2lmKS4NCiRQID0gMCQgOiBQZXJpc3Rpd2EgdGlkYWsgYWthbiBwZXJuYWggdGVyamFkaS4gJFAgPSAxJDogIFBlcmlzdGl3YSBwYXN0aSBha2FuIHRlcmphZGkuICQkMCBcbGUgUChBKSBcbGUgMSQkIEp1bWxhaCBUb3RhbDogSnVtbGFoIHByb2JhYmlsaXRhcyBkYXJpIHNlbXVhIGhhc2lsIHlhbmcgbXVuZ2tpbiBkYWxhbSBydWFuZyBzYW1wZWwgaGFydXMgc2VsYWx1IHNhbWEgZGVuZ2FuIDEuDQoNCiQkXHN1bSBQKFx0ZXh0e3NlbXVhIGhhc2lsfSkgPSAxJCQNCg0KDQoNCg0KDQoqKjQuIEF0dXJhbiBLb21wbGVtZW4gKFRoZSBDb21wbGVtZW50IFJ1bGUpIFByaW5zaXA6KiogDQoNCkF0dXJhbiBpbmkgbWVueWF0YWthbiBiYWh3YSBwcm9iYWJpbGl0YXMgc3VhdHUgcGVyaXN0aXdhIHRpZGFrIHRlcmphZGkgc2FtYSBkZW5nYW4gMSBkaWt1cmFuZ2kgcHJvYmFiaWxpdGFzIHBlcmlzdGl3YSBpdHUgYWthbiB0ZXJqYWRpLg0KDQoqKkZvcm11bGE6KioNCg0KDQokUChcdGV4dHtLb21wbGVtZW4gfSBBKSA9IDEgLSBQKEEpJA0KDQoNCioqQ29udG9oIFBlbmdndW5hYW46KiogVW50dWsgbWVuZW11a2FuIHByb2JhYmlsaXRhcyB0aWRhayBtZW5kYXBhdGthbiBkdWEgIlRhaWwiIChUVCkgc2FhdCBtZWxlbXBhciBrb2luIGR1YSBrYWxpOiAgJFAoXHRleHR7YnVrYW4gfSBUVCkgPSAxIC0gUChUVCkkJFAoXHRleHR7YnVrYW4gfSBUVCkgPSAxIC0gMC4yNSA9IDAuNzUkLg0KDQoqKkF0dSoqDQoNCg0KQXR1cmFuIGtvbXBsZW1lbiBhZGFsYWggbWV0b2RlIHlhbmcgZWZpc2llbiB1bnR1ayBtZW5naGl0dW5nIHByb2JhYmlsaXRhcyBiYWh3YSBzdWF0dSBwZXJpc3Rpd2EgdGlkYWsgdGVyamFkaS4NCg0KKipEZWZpbmlzaToqKiBQcm9iYWJpbGl0YXMgYmFod2EgcGVyaXN0aXdhIEEgdGlkYWsgdGVyamFkaSBzYW1hIGRlbmdhbiAxIGRpa3VyYW5naSBwcm9iYWJpbGl0YXMgYmFod2EgcGVyaXN0aXdhIEEgdGVyamFkaS4NCg0KKipSdW11czoqKg0KDQokJFAoQV5jKSA9IDEgLSBQKEEpJCQNCihEaSBtYW5hICRBXmMkIGFkYWxhaCAia29tcGxlbWVuIGRhcmkgQSwiIGF0YXUgIkEgdGlkYWsgdGVyamFkaSIpDQoNCg0KKipDb250b2g6KiogTWVuZ2d1bmFrYW4gQXR1cmFuIEtvbXBsZW1lbiAoTWVsZW1wYXIgRHVhIEtvaW4pDQoNCioqU29hbDoqKiBCZXJhcGEgcGVsdWFuZyB0aWRhayBtZW5kYXBhdGthbiBkdWEgVGFpbCAoVFQpPw0KDQpQZXJpc3Rpd2EgQTogTWVuZGFwYXRrYW4gZHVhIFRhaWwgKFRUKS4gDQpLaXRhIHRhaHUgJFAoVFQpID0gMC4yNSQuICAgICAgIA0KUGVyaXN0aXdhICRBXmMkIChLb21wbGVtZW4gQSk6IFRpZGFrIG1lbmRhcGF0a2FuIGR1YSBUYWlsLiAgDQoNCioqUGVyaGl0dW5nYW4qKjogDQoNCiRQKFx0ZXh0e2J1a2FuIH0gVFQpID0gMSAtIFAoVFQpJCRQKFx0ZXh0e2J1a2FuIH0gVFQpID0gMSAtIDAuMjUgPSBcbWF0aGJmezAuNzV9JCBhdGF1ICQ3NVwlJA0KDQoNCg0KDQojIyAuIE1hbmRpcmkgRGFuIEJlcmdhbnR1bmcNCg0KRGFsYW0ga2VoaWR1cGFuIHNlaGFyaS1oYXJpLCBraXRhIHNlcmluZyBtZW5naGFkYXBpIHNpdHVhc2kgeWFuZyBtZWxpYmF0a2FuIGtldGlkYWtwYXN0aWFuIGRhbiBwZWx1YW5nLiBNdWxhaSBkYXJpIHByYWtpcmFhbiBjdWFjYSwgaGFzaWwgcGVybWFpbmFuIGRhZHUsIGhpbmdnYSBhbmFsaXNpcyByaXNpa28gZGFsYW0gZHVuaWEga2V1YW5nYW7igJRzZW11YW55YSBtZW1lcmx1a2FuIHBlbWFoYW1hbiBtZW5kYXNhciB0ZW50YW5nIHByb2JhYmlsaXRhcy4gTmFtdW4sIHlhbmcgbGViaWggbWVuYXJpayBhZGFsYWgga2V0aWthIGtpdGEgbWVuZ2FtYXRpIGh1YnVuZ2FuIGFudGFyIGJlcmJhZ2FpIGtlamFkaWFuOiBhcGFrYWggdGVyamFkaW55YSBzYXR1IHBlcmlzdGl3YSBtZW1lbmdhcnVoaSBrZW11bmdraW5hbiB0ZXJqYWRpbnlhIHBlcmlzdGl3YSBsYWlubnlhPw0KDQoNCkR1YSBrb25zZXAgZnVuZGFtZW50YWwgZGFsYW0gbWVtcGVsYWphcmkgaHVidW5nYW4gYW50YXIga2VqYWRpYW4gYWRhbGFoIGtlbWFuZGlyaWFuIChpbmRlcGVuZGVuY2UpIGRhbiBrZXRlcmdhbi10dW5nYW4gKGRlcGVuZGVuY2UpLiBLb25zZXAgaW5pIG1lbmphd2FiIHBlcnRhbnlhYW4gbWVuZGFzYXI6ICJBcGFrYWggcGVuZ2V0YWh1YW4gdGVudGFuZyB0ZXJqYWRpbnlhIHN1YXR1IHBlcmlzdGl3YSBtZW5ndWJhaCBwZWx1YW5nIGtpdGEgdW50dWsgbWVueWFrc2lrYW4gcGVyaXN0aXdhIGxhaW5ueWE/Ig0KLktlbWFuZGlyaWFuIG1lbmdnYW1iYXJrYW4gc2l0dWFzaSBkaSBtYW5hIGR1YSBrZWphZGlhbiBiZXJqYWxhbiBzZW5kaXJpLXNlbmRpcmkgdGFucGEgc2FsaW5nIG1lbXBlbmdhcnVoaSwgc2VwZXJ0aSBkdWEga29pbiB5YW5nIGRpbGVtcGFyIHNlY2FyYSB0ZXJwaXNhaC4gU2ViYWxpa255YSwga2V0ZXJnYW4tdHVuZ2FuIG1lbmNlcm1pbmthbiBodWJ1bmdhbiBkaSBtYW5hIHNhdHUga2VqYWRpYW4gbWVtYmVyaWthbiBpbmZvcm1hc2kgYmVyaGFyZ2EgdGVudGFuZyBrZW11bmdraW5hbiB0ZXJqYWRpbnlhIGtlamFkaWFuIGxhaW4sc2VwZXJ0aSBwZW5nYW1iaWxhbiBrYXJ0dSBkYXJpIGRlY2sgdGFucGEgcGVuZ2VtYmFsaWFuLg0KDQoNCjxjZW50ZXI+DQo8aWZyYW1lIHNyYz0iaHR0cHM6Ly93d3cueW91dHViZS5jb20vZW1iZWQvTFMtX2loREtyMk0iIHdpZHRoPSI0ODAiIGhlaWdodD0iMjcwIiBkYXRhLWV4dGVybmFsPSIxIiBmcmFtZWJvcmRlcj0iMCIgYWxsb3dmdWxsc2NyZWVuPiA8L2lmcmFtZT4NCjwvY2VudGVyPg0KDQoNCg0KDQpWaWRlbyBpbmkgbWVuamVsYXNrYW4gYmFnYWltYW5hIHByb2JhYmlsaXRhcyBkdWEgcGVyaXN0aXdhIHlhbmcgdGVyamFkaSBiZXJzYW1hYW4gZGloaXR1bmcsIHRlcmdhbnR1bmcgcGFkYSBhcGFrYWggcGVyaXN0aXdhIHRlcnNlYnV0IHNhbGluZyBtZW1lbmdhcnVoaSBhdGF1IHRpZGFrLg0KDQoqKjEuIFBlcmlzdGl3YSBJbmRlcGVuZGVuIChJbmRlcGVuZGVudCBFdmVudHMpIERlZmluaXNpOioqDQoNClBlcmlzdGl3YSBpbmRlcGVuZGVuIGFkYWxhaCBrb25kaXNpIGRpIG1hbmEgdGVyamFkaW55YSBzYXR1IHBlcmlzdGl3YSB0aWRhayBtZW1lbmdhcnVoaSBwcm9iYWJpbGl0YXMgdGVyamFkaW55YSBwZXJpc3Rpd2EgeWFuZyBsYWluLg0KDQoqKkNvbnRvaCBVdGFtYTogKipNZWxlbXBhciBEYWR1IGRhbiBNZWxlbXBhciBLb2luLg0KSGFzaWwgZGFyaSBkYWR1IChtaXNhbG55YSwgbWVuZGFwYXQgYW5na2EgNikgdGlkYWsgYWthbiBtZW5ndWJhaCBwZWx1YW5nIGtvaW4gbWVuZGFyYXQgcGFkYSBIZWFkIChIKSBhdGF1IFRhaWwgKFQpLg0KUGVsdWFuZyBIIGFrYW4gdGV0YXAgMC41LlJ1bXVzIFBlcmlzdGl3YSBJbmRlcGVuZGVuVW50dWsgbWVuZ2hpdHVuZyBwcm9iYWJpbGl0YXMgZHVhIHBlcmlzdGl3YSBpbmRlcGVuZGVuIEEgZGFuIEIgdGVyamFkaSBiZXJzYW1hYW4sIEFuZGEgY3VrdXAgbWVuZ2FsaWthbiBwcm9iYWJpbGl0YXMgbWFzaW5nLW1hc2luZyANCg0KKipQZXJpc3Rpd2E6KioNCg0KJCRcbWF0aGJme1AoQSBcdGV4dHsgZGFuIH0gQikgPSBQKEEpIFx0aW1lcyBQKEIpfSQkDQoNCkNvbnRvaCBQZXJoaXR1bmdhbiAoRGFkdSBkYW4gS29pbikgU29hbDogDQoNCkJlcmFwYSBwcm9iYWJpbGl0YXMgbWVsZW1wYXIgZGFkdSA2IHNpc2kgbWVuZGFwYXRrYW4gYW5na2EgNSBkYW4gbWVsZW1wYXIga29pbiBtZW5kYXBhdGthbiBIZWFkPw0KDQoqKkxhbmdrYWggMToqKiBUZW50dWthbiAkUChBKSQgKE1lbmRhcGF0a2FuIDUgcGFkYSBEYWR1KSAgSGFzaWwgeWFuZyBtZW5ndW50dW5na2FuOiAxIChhbmdrYSA1KSBUb3RhbCBoYXNpbDogNiAoMSwgMiwgMywgNCwgNSwgNikkJFAoQSkgPSAxLzYkJA0KDQoqKkxhbmdrYWggMjoqKiBUZW50dWthbiAkUChCKSQgKE1lbmRhcGF0a2FuIEhlYWQgcGFkYSBLb2luKUhhc2lsIHlhbmcgbWVuZ3VudHVuZ2thbjogMSAoSGVhZClUb3RhbCBoYXNpbDogMiAoSGVhZCwgVGFpbCkkJFAoQikgPSAxLzIkJA0KDQoqKkxhbmdrYWggMzoqKiBLYWxpa2FuIFByb2JhYmlsaXRhcyQkUChBIFx0ZXh0eyBkYW4gfSBCKSA9IFxmcmFjezF9ezZ9IFx0aW1lcyBcZnJhY3sxfXsyfSA9IFxmcmFjezF9ezEyfSBcYXBwcm94IFxtYXRoYmZ7MC4wODMzfSBcdGV4dHsgYXRhdSB9IFxtYXRoYmZ7OC4zM1wlfSQkDQoNCg0KDQoqKjIuIFBlcmlzdGl3YSBEZXBlbmRlbiAoRGVwZW5kZW50IEV2ZW50cylEZWZpbmlzaToqKg0KDQpQZXJpc3Rpd2EgZGVwZW5kZW4gYWRhbGFoIGtvbmRpc2kgZGkgbWFuYSB0ZXJqYWRpbnlhIHBlcmlzdGl3YSBwZXJ0YW1hIG1lbWVuZ2FydWhpIHByb2JhYmlsaXRhcyB0ZXJqYWRpbnlhIHBlcmlzdGl3YSB5YW5nIGtlZHVhLg0KDQpDb250b2ggVXRhbWE6IFBlbmdhbWJpbGFuIGl0ZW0gdGFucGEgcGVuZ2VtYmFsaWFuICh3aXRob3V0IHJlcGxhY2VtZW50KS4NCg0KS2V0aWthIEFuZGEgbWVuZ2FtYmlsIGtlbGVyZW5nIGRhcmkga290YWsgZGFuIHRpZGFrIG1lbmdlbWJhbGlrYW5ueWEsIGp1bWxhaCB0b3RhbCBrZWxlcmVuZyBkaSBkYWxhbSBrb3RhayBiZXJrdXJhbmcsIHNlaGluZ2dhIG1lbmd1YmFoIHByb2JhYmlsaXRhcyB1bnR1ayBwZW5nYW1iaWxhbiBiZXJpa3V0bnlhLg0KDQoqKlJ1bXVzIFBlcmlzdGl3YSBEZXBlbmRlblVudHVrIG1lbmdoaXR1bmcgcHJvYmFiaWxpdGFzIGR1YSBwZXJpc3Rpd2EgZGVwZW5kZW4gQSBkYW4gQiB0ZXJqYWRpIGJlcnNhbWFhbjoqKg0KDQokJFxtYXRoYmZ7UChBIFx0ZXh0eyBkYW4gfSBCKSA9IFAoQSkgXHRpbWVzIFAoQiBcdGV4dHsgc2V0ZWxhaCB9IEEpfSQkICRQKEIgXHRleHR7IHNldGVsYWggfSBBKSQNCg0KDQpkaWFydGlrYW4gc2ViYWdhaSBwcm9iYWJpbGl0YXMgcGVyaXN0aXdhIEIgdGVyamFkaSBzZXRlbGFoIHBlcmlzdGl3YSBBIHN1ZGFoIHRlcmphZGkgZGFuIG1lbWVuZ2FydWhpIHJ1YW5nIHNhbXBlbC4NCg0KQ29udG9oIFBlcmhpdHVuZ2FuIChQZW5nYW1iaWxhbiBLZWxlcmVuZyBUYW5wYSBQZW5nZW1iYWxpYW4pTWlzYWxrYW4gYWRhIHNlYnVhaCBrb3RhayBiZXJpc2kgMTAga2VsZXJlbmcgOjcga2VsZXJlbmcgSGlqYXUgKEgpMyBrZWxlcmVuZyBCaXJ1IChCKQ0KDQoqKlNvYWwgQToqKiBCZXJhcGEgcGVsdWFuZyBtZW5nYW1iaWwga2VsZXJlbmcgSGlqYXUgbGFsdSBrZWxlcmVuZyBCaXJ1IHRhbnBhIHBlbmdlbWJhbGlhbj8NCg0KKipMYW5na2FoIDE6KiogVGVudHVrYW4gDQokUChIKSQgKFBlbmdhbWJpbGFuIFBlcnRhbWEpDQoNCiRQKFx0ZXh0e0hpamF1IHBlcnRhbWF9KSA9IFxmcmFje1x0ZXh0e0p1bWxhaCBIaWphdX19e1x0ZXh0e1RvdGFsIEtlbGVyZW5nfX0gPSBcZnJhY3s3fXsxMH0kDQoNCioqTGFuZ2thaCAyOioqIFRlbnR1a2FuICRQKEIgXHRleHR7IHNldGVsYWggfSBIKSQgIChQZW5nYW1iaWxhbiBLZWR1YSlTZXRlbGFoIG1lbmdhbWJpbCAxIEhpamF1LCB0ZXJzaXNhOiA5IGtlbGVyZW5nIHRvdGFsICg3IEhpamF1ICsgMyBCaXJ1IG1lbmphZGkgNiBIaWphdSArIDMgQmlydSkuDQoNCiRQKFx0ZXh0e0JpcnUga2VkdWF9KSA9IFxmcmFje1x0ZXh0e0p1bWxhaCBCaXJ1IHlhbmcgdGVyc2lzYX19e1x0ZXh0e1RvdGFsIEtlbGVyZW5nIHlhbmcgdGVyc2lzYX19ID0gXGZyYWN7M317OX0kDQoNCioqTGFuZ2thaCAzOioqIEthbGlrYW4gUHJvYmFiaWxpdGFzIA0KDQokJFAoSCBcdGV4dHsgbGFsdSB9IEIpID0gXGZyYWN7N317MTB9IFx0aW1lcyBcZnJhY3szfXs5fSA9IFxmcmFjezIxfXs5MH0gXGFwcHJveCBcbWF0aGJmezAuMjMzM30gXHRleHR7IGF0YXUgfSBcbWF0aGJmezIzLjMzXCV9JCQgDQoNCioqU29hbCBCOioqIEJlcmFwYSBwZWx1YW5nIG1lbmdhbWJpbCBkdWEga2VsZXJlbmcgSGlqYXUgdGFucGEgcGVuZ2VtYmFsaWFuPw0KDQoqKkxhbmdrYWggMToqKiBUZW50dWthbg0KDQokUChcdGV4dHtIaWphdSBQZXJ0YW1hfSkkJCRQKFx0ZXh0e0hpamF1IHBlcnRhbWF9KSA9IFxmcmFjezd9ezEwfSQkDQoNCioqTGFuZ2thaCAyOioqIFRlbnR1a2FuIA0KDQokUChcdGV4dHtIaWphdSBLZWR1YSBzZXRlbGFoIEhpamF1IFBlcnRhbWF9KSQNCg0KU2V0ZWxhaCBtZW5nYW1iaWwgMSBIaWphdSwgdGVyc2lzYTogNiBIaWphdSBkYW4gOSB0b3RhbCBrZWxlcmVuZy4NCg0KJCRQKFx0ZXh0e0hpamF1IGtlZHVhfSkgPSBcZnJhY3s2fXs5fSQkDQoqKkxhbmdrYWggMzoqKiBLYWxpa2FuIFByb2JhYmlsaXRhcw0KDQokJFAoXHRleHR7RHVhIEhpamF1fSkgPSBcZnJhY3s3fXsxMH0gXHRpbWVzIFxmcmFjezZ9ezl9ID0gXGZyYWN7NDJ9ezkwfSA9IFxmcmFjezd9ezE1fSBcYXBwcm94IFxtYXRoYmZ7MC40NjY3fSBcdGV4dHsgYXRhdSB9IFxtYXRoYmZ7NDYuNjdcJX0kJCANCg0KDQojIyAuIFBlbnlhdHVhbiBQZXJpc3Rpd2ENCg0KRGFsYW0gbWVuZ2FuYWxpc2lzIGtlbXVuZ2tpbmFuIHRlcmphZGlueWEgc3VhdHUgcGVyaXN0aXdhLCBraXRhIHNlcmluZyBkaWhhZGFwa2FuIHBhZGEgc2l0dWFzaSB5YW5nIGtvbXBsZWtzIGRpbWFuYSBtdWx0aXBsZSBwZXJpc3Rpd2EgZGFwYXQgdGVyamFkaSBzZWNhcmEgYmVyc2FtYWFuIGF0YXUgYWx0ZXJuYXRpZi4gQmFnYWltYW5hIGtpdGEgbWVuZ2hpdHVuZyBwZWx1YW5nIGJhaHdhIG1pbmltYWwgc2F0dSBkYXJpIGJlYmVyYXBhIHBlcmlzdGl3YSBha2FuIHRlcmphZGk/IEF0YXUgYmFnYWltYW5hIGtpdGEgbWVuZ2tvbWJpbmFzaWthbiBiZWJlcmFwYSBrZW11bmdraW5hbiBvdXRjb21lIG1lbmphZGkgc2F0dSB1a3VyYW4gcHJvYmFiaWxpdGFzIHlhbmcga29tcHJlaGVuc2lmPyBQZXJ0YW55YWFuLXBlcnRhbnlhYW4gaW5pbGFoIHlhbmcgbWVuZGFzYXJpIHBlbnRpbmdueWEgcGVtYWhhbWFuIHRlbnRhbmcgcGVueWF0dWFuIHBlcmlzdGl3YSAodW5pb24gb2YgZXZlbnRzKS4NCg0KPGNlbnRlcj4NCjxpZnJhbWUgc3JjPSJodHRwczovL3d3dy55b3V0dWJlLmNvbS9lbWJlZC92cUtBYmhDcVNUYyIgd2lkdGg9IjQ4MCIgaGVpZ2h0PSIyNzAiIGRhdGEtZXh0ZXJuYWw9IjEiIGZyYW1lYm9yZGVyPSIwIiBhbGxvd2Z1bGxzY3JlZW4+IDwvaWZyYW1lPg0KPC9jZW50ZXI+DQoNCg0KDQpWaWRlbyBpbmkgbWVtYmFoYXMgY2FyYSBtZW5naGl0dW5nIHByb2JhYmlsaXRhcyBiYWh3YSBzYWxhaCBzYXR1IGRhcmkgZHVhIGtlamFkaWFuIChBIGF0YXUgQikgYWthbiB0ZXJqYWRpLg0KDQpQcm9iYWJpbGl0YXMgR2FidW5nYW4gRHVhIEtlamFkaWFuVmlkZW8gaW5pIGRpbXVsYWkgZGVuZ2FuIG1lbmd1bGFzIGtvbnNlcCBkYXNhciBzZWJlbHVtIG1hc3VrIGtlIHByb2JhYmlsaXRhcyBnYWJ1bmdhbiAoVW5pb24gb2YgRXZlbnRzKS4NCg0KKio0LjEuIFVsYXNhbiBLb25zZXAgRGFzYXIgUnVhbmcgU2FtcGVsIChTYW1wbGUgU3BhY2UpOioqDQoNCkluaSBhZGFsYWggc2VsdXJ1aCBzZXQgaGFzaWwgeWFuZyBtdW5na2luIGRhbGFtIHN1YXR1IGVrc3BlcmltZW4gc3RhdGlzdGlrLg0KDQoqKkNvbnRvaDoqKiBNZWxlbXBhciBzYXR1IGRhZHUgKDYgaGFzaWwpIGF0YXUgbWVsZW1wYXIgZHVhIGRhZHUgKHRvdGFsIDM2IGhhc2lsIHlhbmcgbXVuZ2tpbiwgDQokNiBcdGltZXMgNiQpLg0KDQoqKlByb2JhYmlsaXRhcyBTZWRlcmhhbmEgOioqIFBlbHVhbmcgc3VhdHUga2VqYWRpYW4gYWthbiB0ZXJqYWRpLCBkaWhpdHVuZyBkZW5nYW4gbWVtYmFnaSBqdW1sYWggaGFzaWwgeWFuZyBkaWluZ2lua2FuIChmYXZvcmFibGUgb3V0Y29tZXMpIGRlbmdhbiBqdW1sYWggdG90YWwgaGFzaWwgeWFuZyBtdW5na2luIChydWFuZyBzYW1wZWwpLg0KDQoqKkNvbnRvaDoqKiBQcm9iYWJpbGl0YXMgbWVuZGFwYXRrYW4gZHVhIGFuZ2thIDQgc2FhdCBtZWxlbXBhciBkdWEgZGFkdSBhZGFsYWggMS8zNi4NCg0KKioyLiBNZW5naGl0dW5nIElyaXNhbiBEdWEgS2VqYWRpYW4gKCJEQU4iKToqKg0KDQpTZWJlbHVtIG1lbWJhaGFzICJnYWJ1bmdhbiIsIHZpZGVvIG1lbXBlcmtlbmFsa2FuICJpcmlzYW4iIChpbnRlcnNlY3Rpb24pLCB5YW5nIGRpdHVuanVra2FuIG9sZWgga2F0YSAiZGFuIi4NCg0KKipQZXJ0YW55YWFuIENvbnRvaDoqKiBCZXJhcGEgcHJvYmFiaWxpdGFzIG1lbmRhcGF0a2FuIGR1YSBhbmdrYSBnZW5hcCBkYW4gc2V0aWRha255YSBzYXR1IGFuZ2thIDI/DQoNCioqUGVueWVsZXNhaWFuOioqIEthcmVuYSBkdWEga2VqYWRpYW4gaW5pIHRpZGFrIGluZGVwZW5kZW4gKHNhbGluZyBiZXJodWJ1bmdhbiksIGtpdGEgdGlkYWsgYmlzYSBtZW5nYWxpa2FuIHByb2JhYmlsaXRhc255YS4NCg0KU29sdXNpbnlhIGFkYWxhaCBtZW5jYXJpIGhhc2lsIGRpIHJ1YW5nIHNhbXBlbCB5YW5nIG1lbWVudWhpIGtlZHVhIGtyaXRlcmlhIChpcmlzYW4pLg0KDQoqKkhhc2lsOioqIERpdGVtdWthbiBhZGEgNSBoYXNpbCB5YW5nIHR1bXBhbmcgdGluZGloIChvdmVybGFwKS4gUHJvYmFiaWxpdGFzIGlyaXNhbiBhZGFsYWggNS8zNi4NCg0KKiozLiBLb25zZXAgVXRhbWE6IFByb2JhYmlsaXRhcyBHYWJ1bmdhbiBEdWEgS2VqYWRpYW4gKCJBVEFVIikqKg0KDQpLYXRhIGt1bmNpIHVudHVrIHByb2JhYmlsaXRhcyBnYWJ1bmdhbiAoVW5pb24gb2YgRXZlbnRzKSBhZGFsYWggImF0YXUiIC4NCg0KS29uc2VwIGluaSBtZW5naGl0dW5nIHByb2JhYmlsaXRhcyBiYWh3YSBrZWphZGlhbiBBIGF0YXUga2VqYWRpYW4gQiBha2FuIHRlcmphZGkuDQoNCg0KUnVtdXMgUHJvYmFiaWxpdGFzIEdhYnVuZ2FuIChBIGF0YXUgQik6DQoNCiQkUChBIFxjdXAgQikgPSBQKEEpICsgUChCKSAtIFAoQSBcY2FwIEIpJCQNCioqUGVuamVsYXNhbiBSdW11czoqKiBJc3RpbGFoIHBlbmd1cmFuZ2FuICRQKEEgXGNhcCBCKSQgKHByb2JhYmlsaXRhcyBpcmlzYW4pIGFkYSBkaSBkYWxhbSBydW11cyBrYXJlbmEga2l0YSBoYXJ1cyBtZW5naGlsYW5na2FuIGhhc2lsIHlhbmcgdGVyaGl0dW5nIGdhbmRhIChkdXBsaWNhdGUgb3V0Y29tZXMpLiANCg0KS2V0aWthIGtpdGEgbWVuanVtbGFoa2FuICRQKEEpJCBkYW4gJFAoQikkLCBoYXNpbCB5YW5nIGJlcmFkYSBkaSBpcmlzYW4gZGloaXR1bmcgZHVhIGthbGksIHNlaGluZ2dhIGhhcnVzIGRpa3VyYW5naSBzYXR1IGthbGkgYWdhciBtZW5qYWRpIGJlbmFyLg0KDQoqKjQuIFBlbmVyYXBhbiBSdW11cyBHYWJ1bmdhbioqDQoNCioqUGVydGFueWFhbiBDb250b2g6KiogQmVyYXBhIHByb2JhYmlsaXRhcyBtZW5kYXBhdGthbiBkdWEgYW5na2EgZ2VuYXAgYXRhdSBzZXRpZGFrbnlhIHNhdHUgYW5na2EgMj8NCg0KKipLb21wb25lbjoqKg0KDQokUChBKSQ6IFByb2JhYmlsaXRhcyBkdWEgYW5na2EgZ2VuYXAgPSA5LzM2IA0KDQokUChCKSQ6IFByb2JhYmlsaXRhcyBzZXRpZGFrbnlhIHNhdHUgYW5na2EgMiA9IDExLzM2DQoNCiRQKEEgXGNhcCBCKSQ6IFByb2JhYmlsaXRhcyBpcmlzYW4gKGRhcmkgbGFuZ2thaCBzZWJlbHVtbnlhKSA9IDUvMzYNCg0KKipQZXJoaXR1bmdhbjoqKg0KDQokJFAoXHRleHR7QSBhdGF1IEJ9KSA9IFxmcmFjezl9ezM2fSArIFxmcmFjezExfXszNn0gLSBcZnJhY3s1fXszNn0gPSBcZnJhY3sxNX17MzZ9JCQNCioqSmF3YWJhbiBBa2hpcjogKiogUHJvYmFiaWxpdGFzIGdhYnVuZ2FuIGFkYWxhaCAxNS8zNiAoYXRhdSAwLjQxNjcpLg0KDQoNCg0KDQojIyAuIEVrc2tsdXNpZiBkYW4gTGVuZ2thcA0KDQpQcm9iYWJpbGl0YXMgYmVybXVsYSBkYXJpIGludHVpc2kgbWFudXNpYSBkYW4ga2VnZW1hcmFubnlhIGJlcmp1ZGksIG5hbXVuIHRlbGFoIGJlcmV2b2x1c2kgbWVuamFkaSBzZWJ1YWggZGlzaXBsaW4gaWxtdSBtYXRlbWF0aWthIHlhbmcgbWVuZGFsYW0gZGFuIGVsZWdhbi4gSWEgdGlkYWsgbGFnaSBzZWthZGFyIGFsYXQgdW50dWsgbWVtcHJlZGlrc2kgaGFzaWwgcGVybWFpbmFuIGthcnR1LCB0ZXRhcGkgdGVsYWggbWVuamFkaSBmb25kYXNpIGJhZ2kgcmV2b2x1c2kgaWxtaWFoLCB0ZWtub2xvZ2ksIGRhbiBla29ub21pIG1vZGVybi4gUGVtYWhhbWFuIHlhbmcga29tcHJlaGVuc2lmIHRlbnRhbmcgcHJvYmFiaWxpdGFzIHRpZGFrIGRpbXVsYWkgZGFyaSBydW11cywgdGV0YXBpIGRhcmkgZmlsc2FmYXQgdGVudGFuZyBhcGEgYXJ0aSAicGVsdWFuZyIgaXR1IHNlbmRpcmkgZGFuIGJhZ2FpbWFuYSBraXRhIG1lbW9kZWxrYW4gcmVhbGl0YXMgeWFuZyB0aWRhayBwYXN0aS4NCg0KDQoNCjxjZW50ZXI+DQo8aWZyYW1lIHNyYz0iaHR0cHM6Ly93d3cueW91dHViZS5jb20vZW1iZWQvZjdhZ1R2OW5BNWsiIHdpZHRoPSI0ODAiIGhlaWdodD0iMjcwIiBkYXRhLWV4dGVybmFsPSIxIiBmcmFtZWJvcmRlcj0iMCIgYWxsb3dmdWxsc2NyZWVuPiA8L2lmcmFtZT4NCjwvY2VudGVyPg0KDQoNCnZpZGVvIGluaSBtZW1iYWhhcyBkdWEga29uc2VwIGZ1bmRhbWVudGFsIGRhbGFtIHRlb3JpIHByb2JhYmlsaXRhczogS2VqYWRpYW4gU2FsaW5nIExlcGFzIChNdXR1YWxseSBFeGNsdXNpdmUpIGRhbiBLZWphZGlhbiBLb2xla3RpZiBMZW5na2FwIChFeGhhdXN0aXZlIEV2ZW50cykuDQoNCg0KKioxLiBLZWphZGlhbiBTYWxpbmcgTGVwYXMgKE11dHVhbGx5IEV4Y2x1c2l2ZSBFdmVudHMpKiogDQoNCktlamFkaWFuIHNhbGluZyBsZXBhcyAoYXRhdSB0ZXJwaXNhaC9kaXNqb2ludCkgYWRhbGFoIGR1YSBhdGF1IGxlYmloIGtlamFkaWFuIHlhbmcgdGlkYWsgbXVuZ2tpbiB0ZXJqYWRpIHBhZGEgc2FhdCB5YW5nIGJlcnNhbWFhbi4NCg0KS2FyYWt0ZXJpc3RpayBVdGFtYToNCg0KSXJpc2FuIE5vbDogVGlkYWsgYWRhIGhhc2lsIHlhbmcgdHVtcGFuZyB0aW5kaWggKGlyaXNhbikgZGkgYW50YXJhIGtlamFkaWFuLWtlamFkaWFuIHRlcnNlYnV0LiANCg0KSmlrYSBBIGRhbiBCIGFkYWxhaCBrZWphZGlhbiBzYWxpbmcgbGVwYXMsIG1ha2EgcHJvYmFiaWxpdGFzIGtlZHVhbnlhIHRlcmphZGkgc2VjYXJhIGJlcnNhbWFhbiBhZGFsYWggbm9sLg0KDQokJFAoQSBcY2FwIEIpID0gMCQkDQoNCkF0dXJhbiBQZW5qdW1sYWhhbiB5YW5nIERpc2VkZXJoYW5ha2FuOiBLYXJlbmEgaXJpc2FubnlhIG5vbCwgcnVtdXMgcHJvYmFiaWxpdGFzIGdhYnVuZ2FuICgiQVRBVSIpIG1lbmphZGkgc2VkZXJoYW5hOg0KDQokJFAoQSBcY3VwIEIpID0gUChBKSArIFAoQikkJA0KDQpDb250b2ggS2FzdXM6TWVsZW1wYXIgS29pbjogTWVuZGFwYXQgIkFuZ2thIiBkYW4gbWVuZGFwYXQgIkdhbWJhciIgYWRhbGFoIHNhbGluZyBsZXBhcy4gS29pbiB0aWRhayBtdW5na2luIG1lbmdoYXNpbGthbiBrZWR1YW55YSBzZWthbGlndXMuDQoNCk1lbGVtcGFyIERhZHUgVHVuZ2dhbDogTWVuZGFwYXQgYW5na2EgMiBkYW4gbWVuZGFwYXQgYW5na2EgNS4NCg0KTXVzdGFoaWwgbWVuZGFwYXRrYW4gZHVhIGhhc2lsIGluaSBkYWxhbSBzYXR1IGxlbXBhcmFuLg0KS2FydHUgUmVtaTogTWVuZ2FtYmlsIGthcnR1IEtpbmcgZGFuIG1lbmdhbWJpbCBrYXJ0dSBRdWVlbiBkYWxhbSBzZWthbGkgcGVuZ2FtYmlsYW4gYWRhbGFoIHNhbGluZyBsZXBhcy4NCg0KKioyLiBLZWphZGlhbiBLb2xla3RpZiBMZW5na2FwIChFeGhhdXN0aXZlIEV2ZW50cykqKg0KDQpLZWphZGlhbiBrb2xla3RpZiBsZW5na2FwIGFkYWxhaCBzZWt1bXB1bGFuIGR1YSBhdGF1IGxlYmloIGtlamFkaWFuIHlhbmcgbWVuY2FrdXAgc2VtdWEgaGFzaWwgeWFuZyBtdW5na2luIGRhbGFtIHJ1YW5nIHNhbXBlbCAoc2VtdWEga2VtdW5na2luYW4geWFuZyBhZGEpLg0KDQpLYXJha3RlcmlzdGlrIFV0YW1hOg0KDQpNZW5jYWt1cCBTZW11YTogU2VrdXJhbmcta3VyYW5nbnlhIHNhbGFoIHNhdHUgZGFyaSBrZWphZGlhbi1rZWphZGlhbiB0ZXJzZWJ1dCBwYXN0aSB0ZXJqYWRpIGRhbGFtIHNrZW5hcmlvIHlhbmcgZGliZXJpa2FuLg0KDQpKdW1sYWggUHJvYmFiaWxpdGFzIFNhbWEgZGVuZ2FuIDE6IEppa2Ega2l0YSBtZW5qdW1sYWhrYW4gcHJvYmFiaWxpdGFzIHNlbXVhIGtlamFkaWFuIGtvbGVrdGlmIGxlbmdrYXAsIHRvdGFsbnlhIGhhcnVzIHNlbGFsdSBzYW1hIGRlbmdhbiAxIChhdGF1IDEwMCUpLg0KDQpDb250b2ggS2FzdXM6DQoNCkF0bGV0IEJlcmVuYW5nOiANCg0KS2VqYWRpYW4gQTogQXRsZXQgbWVtZW5hbmdrYW4gbWVkYWxpLiANCg0KS2VqYWRpYW4gQjogQXRsZXQgdGlkYWsgbWVtZW5hbmdrYW4gbWVkYWxpLiANCg0KS2VkdWEga2VqYWRpYW4gaW5pIGtvbGVrdGlmIGxlbmdrYXAga2FyZW5hIHRpZGFrIGFkYSBoYXNpbCBsYWluIHlhbmcgbXVuZ2tpbi4NCg0KS2FudG9uZyBLZWxlcmVuZzogSmlrYSBzZWJ1YWggdGFzIGhhbnlhIGJlcmlzaSBrZWxlcmVuZyBNZXJhaCBkYW4gQmlydSwgbWFrYSBrZWphZGlhbiBtZW5nYW1iaWwga2VsZXJlbmcgTWVyYWggYXRhdSBCaXJ1IGFkYWxhaCBrb2xla3RpZiBsZW5na2FwLCBrYXJlbmEgc2VtdWEga2VtdW5na2luYW4gdGVsYWggZGljYWt1cC5LZWphZGlhbiBTYWxpbmcgTGVwYXMgREFOIEtvbGVrdGlmIExlbmdrYXBBZGEga2FzdXMgZGkgbWFuYSBkdWEga2VqYWRpYW4gbWVtZW51aGkga2VkdWEga3JpdGVyaWEgKHNhbGluZyBsZXBhcyBkYW4ga29sZWt0aWYgbGVuZ2thcCkuU2FsaW5nIExlcGFzOiBNZXJla2EgdGlkYWsgdHVtcGFuZyB0aW5kaWggDQoNCigkUChBIFxjYXAgQikgPSAwJCkuDQoNCktvbGVrdGlmIExlbmdrYXA6IEdhYnVuZ2FuIGtlZHVhbnlhIG1lbmNha3VwIHNlbHVydWggcnVhbmcgc2FtcGVsIA0KDQooJFAoQSBcY3VwIEIpID0gMSQpLg0KDQpDb250b2gga2xhc2lrIGFkYWxhaCBwZWxlbXBhcmFuIGtvaW4gOiBNZW5kYXBhdCBBbmdrYSAoQSkgZGFuIG1lbmRhcGF0IEdhbWJhciAoRykgYWRhbGFoIHNhbGluZyBsZXBhcyAodGlkYWsgdGVyamFkaSBiZXJzYW1hYW4pIGRhbiBrb2xla3RpZiBsZW5na2FwICh0b3RhbCBwcm9iYWJpbGl0YXMgDQoNCiRQKEEpICsgUChHKSA9IDEkKS4NCg0KYGBge3IsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIG91dC5leHRyYT0nc3R5bGU9ImRpc3BsYXk6YmxvY2s7IG1hcmdpbi1sZWZ0OmF1dG87IG1hcmdpbi1yaWdodDphdXRvOyInfQ0KbGlicmFyeShWZW5uRGlhZ3JhbSkNCmxpYnJhcnkoZ3JpZCkNCg0KIyBNb2Rlcm4gZmxhdCBkZXNpZ24gc3R5bGUNCmdyaWQubmV3cGFnZSgpDQoNCiMgQmFja2dyb3VuZCBjb2xvcg0KZ3JpZC5yZWN0KGdwID0gZ3BhcihmaWxsID0gIiNGOEY5RkEiLCBjb2wgPSBOQSkpDQoNCiMgTW9kZXJuIHRpdGxlDQpncmlkLnRleHQoIlZJU1VBTElTQVNJIEtPTlNFUCBQUk9CQUJJTElUQVMiLCANCiAgICAgICAgICB4ID0gMC41LCB5ID0gMC45MywNCiAgICAgICAgICBncCA9IGdwYXIoZm9udHNpemUgPSAxNiwgZm9udGZhY2UgPSAiYm9sZCIsIGNvbCA9ICIjMkMzRTUwIikpDQoNCmdyaWQudGV4dCgiU2FsaW5nIExlcGFzIHZzIEtvbGVrdGlmIExlbmdrYXAiLCANCiAgICAgICAgICB4ID0gMC41LCB5ID0gMC44OCwNCiAgICAgICAgICBncCA9IGdwYXIoZm9udHNpemUgPSAxMiwgY29sID0gIiM3RjhDOEQiKSkNCg0KIyBDcmVhdGUgbW9kZXJuIFZlbm4gZGlhZ3JhbQ0KdmVubl9wbG90IDwtIGRyYXcucGFpcndpc2UudmVubigNCiAgYXJlYTEgPSA1MCwNCiAgYXJlYTIgPSA1MCwNCiAgY3Jvc3MuYXJlYSA9IDAsDQogIGNhdGVnb3J5ID0gYygiIE1FTkFORyIsICIgVElEQUsgTUVOQU5HIiksDQogIGZpbGwgPSBjKCIjMzQ5OERCIiwgIiNFNzRDM0MiKSwNCiAgYWxwaGEgPSAwLjgsDQogIGx3ZCA9IDAsDQogIGNvbCA9IGMoIiMyOTgwQjkiLCAiI0MwMzkyQiIpLA0KICBjZXggPSAxLjYsDQogIGZvbnRmYWNlID0gImJvbGQiLA0KICBjYXQuY2V4ID0gMS4zLA0KICBjYXQuZm9udGZhY2UgPSAiYm9sZCIsDQogIGNhdC5jb2wgPSBjKCIjMkMzRTUwIiwgIiMyQzNFNTAiKSwNCiAgY2F0LnBvcyA9IGMoLTIwLCAyMCksDQogIGNhdC5kaXN0ID0gMC4wNg0KKQ0KDQojIEtleSBwb2ludHMgaW4gYnViYmxlcw0KZ3JpZC5jaXJjbGUoeCA9IDAuMjUsIHkgPSAwLjMsIHIgPSAwLjEsIA0KICAgICAgICAgICAgZ3AgPSBncGFyKGZpbGwgPSAiI0U3NEMzQyIsIGFscGhhID0gMC45LCBjb2wgPSBOQSkpDQpncmlkLnRleHQoIlNBTElOR1xuTEVQQVMiLCB4ID0gMC4yNSwgeSA9IDAuMywNCiAgICAgICAgICBncCA9IGdwYXIoZm9udHNpemUgPSA5LCBmb250ZmFjZSA9ICJib2xkIiwgY29sID0gIndoaXRlIikpDQoNCmdyaWQuY2lyY2xlKHggPSAwLjc1LCB5ID0gMC4zLCByID0gMC4xLCANCiAgICAgICAgICAgIGdwID0gZ3BhcihmaWxsID0gIiMzNDk4REIiLCBhbHBoYSA9IDAuOSwgY29sID0gTkEpKQ0KZ3JpZC50ZXh0KCJLT0xFS1RJRlxuTEVOR0tBUCIsIHggPSAwLjc1LCB5ID0gMC4zLA0KICAgICAgICAgIGdwID0gZ3Bhcihmb250c2l6ZSA9IDksIGZvbnRmYWNlID0gImJvbGQiLCBjb2wgPSAid2hpdGUiKSkNCg0KIyBTaW1wbGUgZXhwbGFuYXRpb25zDQpncmlkLnRleHQoIlRpZGFrIGFkYSBpcmlzYW5cblAoQeKIqUIpID0gMCIsIHggPSAwLjI1LCB5ID0gMC4xNSwNCiAgICAgICAgICBncCA9IGdwYXIoZm9udHNpemUgPSA5LCBjb2wgPSAiI0U3NEMzQyIpKQ0KDQpncmlkLnRleHQoIlRvdGFsIDEwMCVcblAoQSkrUChCKT0xIiwgeCA9IDAuNzUsIHkgPSAwLjE1LA0KICAgICAgICAgIGdwID0gZ3Bhcihmb250c2l6ZSA9IDksIGNvbCA9ICIjMzQ5OERCIikpDQoNCiMgQm90dG9tIHN1bW1hcnkNCmdyaWQucmVjdCh4ID0gMC41LCB5ID0gMC4wNSwgd2lkdGggPSAwLjksIGhlaWdodCA9IDAuMDgsDQogICAgICAgICAgZ3AgPSBncGFyKGZpbGwgPSAiIzJDM0U1MCIsIGNvbCA9IE5BKSkNCg0KDQpncmlkLnRleHQoIiBLRVNJTVBVTEFOOiBEdWEga2VqYWRpYW4geWFuZyBzYWxpbmcgbGVwYXMgREFOIGtvbGVrdGlmIGxlbmdrYXAgPSBLT01QTEVNRU4iLCANCiAgICAgICAgICB4ID0gMC41LCB5ID0gMC4wNSwNCiAgICAgICAgICBncCA9IGdwYXIoZm9udHNpemUgPSAxMCwgZm9udGZhY2UgPSAiYm9sZCIsIGNvbCA9ICJ3aGl0ZSIpKQ0KYGBgDQoNCg0KDQoNCiMjIC4gUGVyY29iYWFuIEJpbm9taW5hbA0KDQpEYWxhbSB0ZW9yaSBwcm9iYWJpbGl0YXMsIFBlcmNvYmFhbiBCaW5vbWlhbCAoYXRhdSBCaW5vbWlhbCBFeHBlcmltZW50KSBhZGFsYWggc2FsYWggc2F0dSBqZW5pcyBwZXJjb2JhYW4gYWNhayB5YW5nIHBhbGluZyBmdW5kYW1lbnRhbCBkYW4gYmFueWFrIHBlbmVyYXBhbm55YS4gUGVyY29iYWFuIGluaSBkaWd1bmFrYW4gdW50dWsgbWVtb2RlbGthbiBzaXR1YXNpIGRpIG1hbmEga2l0YSBoYW55YSBwZWR1bGkgcGFkYSBkdWEgaGFzaWwgeWFuZyBtdW5na2luIGRhcmkgc2V0aWFwIHBlcmNvYmFhbiB1bGFuZy4NCg0KDQo8Y2VudGVyPg0KPGlmcmFtZSBzcmM9Imh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL2VtYmVkL25SdVFBdGFqSllrIiB3aWR0aD0iNDgwIiBoZWlnaHQ9IjI3MCIgZGF0YS1leHRlcm5hbD0iMSIgZnJhbWVib3JkZXI9IjAiIGFsbG93ZnVsbHNjcmVlbj4gPC9pZnJhbWU+DQo8L2NlbnRlcj4NCg0KDQoNClZpZGVvIGluaSBtZW5qZWxhc2thbiBrYXBhbiBkYW4gYmFnYWltYW5hIG1lbmdndW5ha2FuIHJ1bXVzIGJpbm9taWFsIHVudHVrIG1lbmdoaXR1bmcgcHJvYmFiaWxpdGFzIGtlYmVyaGFzaWxhbiAoc3Vrc2VzKSBhdGF1IGtlZ2FnYWxhbiAoZmFpbHVyZSkgZGFsYW0gc2VyYW5na2FpYW4gcGVyY29iYWFuIHlhbmcgZGl1bGFuZy4NCg0KKioxLiBQZW5nYW50YXIgRWtzcGVyaW1lbiBCaW5vbWlhbCAqKg0KDQpEaXN0cmlidXNpIHByb2JhYmlsaXRhcyBCaW5vbWlhbCBtZXJ1anVrIHBhZGEgcHJvYmFiaWxpdGFzIGtlYmVyaGFzaWxhbiBhdGF1IGtlZ2FnYWxhbiBkYWxhbSBla3NwZXJpbWVuIHlhbmcgZGl1bGFuZyBiZXJrYWxpLWthbGkuIEthdGEgIkJpIiBiZXJhcnRpIGR1YSwgbWVydWp1ayBwYWRhIGR1YSBrZW11bmdraW5hbiBoYXNpbCBkYWxhbSBzZXRpYXAgcGVyY29iYWFuOiBzdWtzZXMgYXRhdSBnYWdhbC4NCg0KKioyLiBFbXBhdCBLb25kaXNpIFBlbmdhdHVyYW4gQmlub21pYWwgKEJpbm9taWFsIFNldHRpbmcpKioNCg0KDQpTdWF0dSBla3NwZXJpbWVuIGhhcnVzIG1lbWVudWhpIGVtcGF0IGtvbmRpc2kgYmVyaWt1dCBhZ2FyIGRhcGF0IGRpa2F0ZWdvcmlrYW4gc2ViYWdhaSBla3NwZXJpbWVuIGJpbm9taWFsOg0KDQoqKjEuIEp1bWxhaCBQZXJjb2JhYW4gKG4pIFRldGFwIChGaXhlZCk6KiogSnVtbGFoIHBlbmd1bGFuZ2FuIGVrc3BlcmltZW4gaGFydXMgZGl0ZXRhcGthbiBhdGF1IGRpa2V0YWh1aSBkaSBhd2FsLg0KDQoqKjIuIER1YSBIYXNpbCB5YW5nIE11bmdraW46KiogU2V0aWFwIHBlcmNvYmFhbiBoYW55YSBtZW1pbGlraSBkdWEgaGFzaWwsIHlhaXR1IHN1a3NlcyBhdGF1IGdhZ2FsIC4NCg0KDQoqKjMuIFByb2JhYmlsaXRhcyBTdWtzZXMgKHApIEtvbnN0YW46KiogUHJvYmFiaWxpdGFzIHN1a3NlcyAoJHAkKSBoYXJ1cyB0ZXRhcCBzYW1hIHVudHVrIHNldGlhcCBwZXJjb2JhYW4uDQoNCioqNC4gUGVyY29iYWFuIEluZGVwZW5kZW46KiogSGFzaWwgZGFyaSBzYXR1IHBlcmNvYmFhbiB0aWRhayBtZW1lbmdhcnVoaSBoYXNpbCBkYXJpIHBlcmNvYmFhbiBsYWlubnlhIC4NCg0KKipDb250b2ggMToqKiBQZWxlbXBhcmFuIEtvaW4gKE1lbXZlcmlmaWthc2kgS29uZGlzaSlQZXJ0YW55YWFuOiBNZWxlbXBhciBrb2luIGJpYXNhIHNlYmFueWFrIDMga2FsaSwgYmVyYXBha2FoIHByb2JhYmlsaXRhcyBtZW5kYXBhdGthbiB0ZXBhdCBzYXR1IEtlcGFsYSAoSGVhZCk/DQoNClBlbnllbGVzYWlhbiBNYW51YWw6IEFkYSAzIGNhcmEgdW50dWsgbWVuZGFwYXRrYW4gMSBLZXBhbGEgKEgpOiBIVFQsIFRIVCwgVFRILg0KDQpQcm9iYWJpbGl0YXMgdW50dWsgc2F0dSB1cnV0YW4gKG1pc2FsbnlhIEhUVCkgYWRhbGFoDQoNCiQwLjUgXHRpbWVzIDAuNSBcdGltZXMgMC41ID0gMC4xMjUkLg0KDQpQcm9iYWJpbGl0YXMgdG90YWw6IA0KDQokMC4xMjUgKyAwLjEyNSArIDAuMTI1ID0gKiowLjM3NSoqJC4NCg0KVmVyaWZpa2FzaSBCaW5vbWlhbDogRWtzcGVyaW1lbiBpbmkgbWVtZW51aGkgc2VtdWEgNCBrb25kaXNpOg0KDQoxLiAkbiQgPSAzJCAoVGV0YXApLg0KDQoyLiBIYXNpbDogS2VwYWxhIChTdWtzZXMpIGF0YXUgRWtvciAoR2FnYWwpLg0KDQozLiAkcCQgPSAwLjUkIChLb25zdGFuKS4NCg0KNC4gSGFzaWwgcGVsZW1wYXJhbiBzYXR1IGtvaW4gdGlkYWsgbWVtZW5nYXJ1aGkgeWFuZyBsYWluIChJbmRlcGVuZGVuKS4NCg0KS2VzaW1wdWxhbjogSW5pIGFkYWxhaCBla3NwZXJpbWVuIGJpbm9taWFsLg0KDQoqKkNvbnRvaCAyOioqIFBlbmdhbWJpbGFuIEtlbGVyZW5nIERFTkdBTiBQZW5nZW1iYWxpYW4gUGVydGFueWFhbjogRGFsYW0ga290YWsgYmVyaXNpIDEwIGtlbGVyZW5nICgzIHBpbmssIDIgaGlqYXUsIDUgYmlydSkuIEppa2EgZGlhbWJpbCA1IGtlbGVyZW5nIGRlbmdhbiBwZW5nZW1iYWxpYW4sIGJlcmFwYWthaCBwcm9iYWJpbGl0YXMgbWVuZGFwYXRrYW4gdGVwYXQgMiBrZWxlcmVuZyBoaWphdT8NCg0KVmVyaWZpa2FzaSBCaW5vbWlhbDoNCg0KMS4gJG4gPSA1JCAoNSBrYWxpIHBlbmdhbWJpbGFuKS4NCg0KMi4gU3Vrc2VzOiBLZWxlcmVuZyBIaWphdTsgR2FnYWw6IEJ1a2FuIEhpamF1Lg0KDQozLiAkcCQgS29uc3RhbjogUHJvYmFiaWxpdGFzIHN1a3NlcyAoSGlqYXUpIGFkYWxhaCAkMi8xMCA9IDAuMiQuICBJbmkga29uc3RhbiBrYXJlbmEgcGVuZ2FtYmlsYW4gZGlsYWt1a2FuIGRlbmdhbiBwZW5nZW1iYWxpYW4uDQoNCjQuIEluZGVwZW5kZW46IFBlbmdlbWJhbGlhbiBtZW1hc3Rpa2FuIHNldGlhcCBwZW5nYW1iaWxhbiBhZGFsYWggaW5kZXBlbmRlbi4NCg0KDQpLb21wb25lbiBQcm9iYWJpbGl0YXM6DQoNCiRQJChcdGV4dHtTdWtzZXN9KSA9IHAgPSAwLjINCg0KJFAkKFx0ZXh0e0dhZ2FsfSkgPSAxIC0gcCA9IDAuOA0KDQpKdW1sYWgga29tYmluYXNpIHVudHVrIDIgU3Vrc2VzIGRhbiAzIEdhZ2FsIGFkYWxhaCAxMCBjYXJhLg0KDQoqKjUuIFJ1bXVzIEJpbm9taWFsKioNCg0KVW50dWsgbWVuZ2hpbmRhcmkgcGVuZ2hpdHVuZ2FuIG1hbnVhbCBzZW11YSBrb21iaW5hc2kgKHNlcGVydGkgMTAgY2FyYSBkaSBhdGFzKSwgZGlndW5ha2FuIFJ1bXVzIEJpbm9taWFsLg0KDQpSdW11cyBCaW5vbWlhbDoNCg0KJCRQKGspID0gXGJpbm9te259e2t9IFxjZG90IHBeayBcY2RvdCAoMS1wKV57bi1rfSQkDQoNCmBgYHtyfQ0KIyBNZW1idWF0IGRhdGEgZnJhbWUNCnRhYmVsX2Jpbm9taWFsIDwtIGRhdGEuZnJhbWUoDQpTaW1ib2wgPSBjKCJQKGspIiwgIm4iLCAiayIsICJwIiwgImJpbm9tKG4saykiLCAiKDEtcCkiLCAiKG4taykiKSwNCkRlc2tyaXBzaSA9IGMoDQoiUHJvYmFiaWxpdGFzIHVudHVrIGsga2FsaSBzdWtzZXMiLA0KIkp1bWxhaCBwZXJjb2JhYW4gdG90YWwiLA0KIkp1bWxhaCBzdWtzZXMgeWFuZyBkaWluZ2lua2FuIiwNCiJQcm9iYWJpbGl0YXMgc3Vrc2VzIGRhbGFtIHNhdHUgcGVyY29iYWFuIiwNCiJLb21iaW5hc2kgKFwibiBjaG9vc2Uga1wiKS4gSW5pIG1lbmdoaXR1bmcgc2VtdWEgY2FyYSB5YW5nIG11bmdraW4gdW50dWsgbWVuZGFwYXRrYW4gayBzdWtzZXMgZGFyaSBuIHBlcmNvYmFhbiIsDQoiUHJvYmFiaWxpdGFzIGtlZ2FnYWxhbiIsDQoiSnVtbGFoIGtlZ2FnYWxhbiINCiksDQpDb250b2hfS2FzdXNfS2VsZXJlbmcgPSBjKCJQKDIpIiwgIm49NSIsICJrPTIiLCAicD0wLjIiLCAiYmlub20oNSwyKSIsICIxLTAuMj0wLjgiLCAiNS0yPTMiKQ0KKQ0KDQojIE1lbmFtcGlsa2FuIHRhYmVsIGRlbmdhbiBrYWJsZSAocGFja2FnZSBrbml0cikNCmxpYnJhcnkoa25pdHIpDQprYWJsZSh0YWJlbF9iaW5vbWlhbCwgDQpjb2wubmFtZXMgPSBjKCJTaW1ib2wiLCAiRGVza3JpcHNpIiwgIkNvbnRvaCBLYXN1cyBLZWxlcmVuZyIpLA0KYWxpZ24gPSBjKCJjIiwgImwiLCAiYyIpLA0KY2FwdGlvbiA9ICJUYWJlbCBTaW1ib2wgRGlzdHJpYnVzaSBCaW5vbWlhbCIpDQoNCmBgYA0KDQoqKkFwbGlrYXNpIFJ1bXVzIGtlIENvbnRvaCBLZWxlcmVuZzoqKg0KDQokJFAoMikgPSBcYmlub217NX17Mn0gXGNkb3QgKDAuMileMiBcY2RvdCAoMSAtIDAuMileeyg1LTIpfSQkJCRQKDIpID0gMTAgXGNkb3QgKDAuMDQpIFxjZG90ICgwLjUxMikkJCQkUCgyKSA9IDAuMjA0OCQkDQoNCkhhc2lsIGluaSBzYW1hIGRlbmdhbiBoYXNpbCB5YW5nIGRpZGFwYXQgZGFyaSBwZW5qdW1sYWhhbiAxMCBrZW11bmdraW5hbiBjYXJhIHNlY2FyYSBtYW51YWwuIFJ1bXVzIGluaSBhZGFsYWggamFsYW4gcGludGFzIHlhbmcgZWZpc2llbiB1bnR1ayBtZW5naGl0dW5nIHByb2JhYmlsaXRhcyBkYWxhbSBla3NwZXJpbWVuIGJpbm9taWFsLg0KDQoNCg0KDQojIyAuIERpc3RyaWJ1c2kgQmlub21pYWwNCg0KRGlzdHJpYnVzaSBCaW5vbWlhbCBhZGFsYWggZGlzdHJpYnVzaSBwcm9iYWJpbGl0YXMgZGlza3JpdCB5YW5nIG1lbmdoaXR1bmcgcGVsdWFuZyBzdWtzZXMgZGFsYW0gc2VqdW1sYWggcGVyY29iYWFuIHRlcnRlbnR1LCBkaSBtYW5hIHNldGlhcCBwZXJjb2JhYW4gbWVtaWxpa2kgaGFueWEgZHVhIGtlbXVuZ2tpbmFuIGhhc2lsIChzdWtzZXMvZ2FnYWwpIGRhbiBwZWx1YW5nIHN1a3Nlc255YSB0ZXRhcCBzYW1hIHVudHVrIHNldGlhcCBwZXJjb2JhYW4uDQoNCg0KPGNlbnRlcj4NCjxpZnJhbWUgc3JjPSJodHRwczovL3d3dy55b3V0dWJlLmNvbS9lbWJlZC9ZMi12U1dGbWd5SSIgd2lkdGg9IjQ4MCIgaGVpZ2h0PSIyNzAiIGRhdGEtZXh0ZXJuYWw9IjEiIGZyYW1lYm9yZGVyPSIwIiBhbGxvd2Z1bGxzY3JlZW4+IDwvaWZyYW1lPg0KPC9jZW50ZXI+DQoNCg0KRGkgdmlkZW8gaW5pIG1lbmplbGFza2FuIGJhZ2FpbWFuYSB2aXN1YWxpc2FzaSBkYW4gcGFyYW1ldGVyIERpc3RyaWJ1c2kgQmlub21pYWwgZGlwZW5nYXJ1aGkgb2xlaCBqdW1sYWggcGVyY29iYWFuICgkbiQpIGRhbiBwcm9iYWJpbGl0YXMgc3Vrc2VzICgkcCQpLg0KDQoqKjEuIFVsYXNhbiBSdW11cyBkYW4gVmlzdWFsaXNhc2kgRGFzYXIqKg0KDQpWaWRlbyBpbmkgZGltdWxhaSBkZW5nYW4gbWVuZ3VsYXMgUnVtdXMgQmlub21pYWwgeWFuZyBkaWd1bmFrYW4gdW50dWsgbWVuZ2hpdHVuZyBwcm9iYWJpbGl0YXMgJGskIGthbGkgc3Vrc2VzIGRhbGFtICRuJCBwZXJjb2JhYW4gOg0KDQokJFAoaykgPSBcYmlub217bn17a30gXGNkb3QgcF5rIFxjZG90ICgxLXApXntuLWt9JCQNCg0KQ29udG9oIERhc2FyIChNZWxlbXBhciBLb2luIDIgS2FsaSk6DQoNCiRuPTIkLCAgICAkcD0wLjUkDQoNCkhhc2lsIHBlcmhpdHVuZ2FuIHByb2JhYmlsaXRhcyB1bnR1ayAkaz0wLCAxLCAyJCAgDQoNCnN1a3NlcyBhZGFsYWgNCjAuMjUsIDAuNTAsIGRhbiAwLjI1Lg0KDQpWaXN1YWxpc2FzaW55YSBtZW5nZ3VuYWthbiBkaWFncmFtIGJhdGFuZyAoYmFyIGNoYXJ0KSwgZGkgbWFuYSBzdW1idS1YIGFkYWxhaCBqdW1sYWggc3Vrc2VzICgkayQpIGRhbiBzdW1idS1ZIGFkYWxhaCBwcm9iYWJpbGl0YXNueWEuDQoNCioqMi4gUGFyYW1ldGVyIERpc3RyaWJ1c2kgQmlub21pYWwqKiANCg0KU2V0aWFwIERpc3RyaWJ1c2kgQmlub21pYWwgbWVtaWxpa2kgcGFyYW1ldGVyIHlhbmcgZGFwYXQgZGloaXR1bmcgdW50dWsgbWVuZW50dWthbiB0aXRpayB0ZW5nYWggZGFuIHBlbnllYmFyYW5ueWE6DQoNCg0KYGBge3J9DQojIE1lbWJ1YXQgZGF0YSBmcmFtZSB1bnR1ayB0YWJlbCBwYXJhbWV0ZXINCnBhcmFtZXRlcl9iaW5vbWlhbCA8LSBkYXRhLmZyYW1lKA0KUGFyYW1ldGVyID0gYygiUmF0YS1yYXRhIChNZWFuKSAoJFxcbXUkKSIsIA0KIlZhcmlhbnMgKCRcXHNpZ21hXjIkKSIsIA0KIkRldmlhc2kgU3RhbmRhciAoJFxcc2lnbWEkKSIpLA0KUnVtdXMgPSBjKCIkXFxtdSA9IG4gXFxjZG90IHAkIiwgDQoiJFxcc2lnbWFeMiA9IG4gXFxjZG90IHAgXFxjZG90ICgxLXApJCIsIA0KIiRcXHNpZ21hID0gXFxzcXJ0e24gXFxjZG90IHAgXFxjZG90ICgxLXApfSQiKSwNCkRlc2tyaXBzaSA9IGMoDQoiTWVudW5qdWtrYW4gdGl0aWsgcHVzYXQgYXRhdSBqdW1sYWggc3Vrc2VzIHlhbmcgZGloYXJhcGthbiBkYWxhbSAkbiQgcGVyY29iYWFuIiwNCiJNZW5ndWt1ciBzZWJlcmFwYSBqYXVoIHBlbnllYmFyYW4gZGF0YSBkYXJpIHJhdGEtcmF0YSIsDQoiQWthciBrdWFkcmF0IGRhcmkgdmFyaWFucywgc2VyaW5nIGRpZ3VuYWthbiB1bnR1ayBtZW5ndWt1ciBwZW55ZWJhcmFuIg0KKQ0KKQ0KDQojIE1lbmFtcGlsa2FuIHRhYmVsIGRlbmdhbiBrYWJsZQ0KbGlicmFyeShrbml0cikNCmthYmxlKHBhcmFtZXRlcl9iaW5vbWlhbCwNCmNvbC5uYW1lcyA9IGMoIlBhcmFtZXRlciIsICJSdW11cyIsICJEZXNrcmlwc2kiKSwNCmFsaWduID0gYygibCIsICJjIiwgImwiKSwNCmNhcHRpb24gPSAiVGFiZWwgUGFyYW1ldGVyIERpc3RyaWJ1c2kgQmlub21pYWwiLA0KZXNjYXBlID0gRkFMU0UpDQoNCmBgYA0KDQoqKjMuIFBlbmdhcnVoIEp1bWxhaCBQZXJjb2JhYW4gKCRuJCkqKg0KDQpLZXRpa2EgcHJvYmFiaWxpdGFzIHN1a3NlcyAoJHAkKSBkaWphZ2Ega29uc3RhbiAobWlzYWxueWEgJHA9MC41JCksICAgZGFuIGp1bWxhaCBwZXJjb2JhYW4gKCRuJCkgICBkaXRpbmdrYXRrYW4gKG1pc2FsbnlhIGRhcmkgJG49MiQgICAgbWVuamFkaSAkbj0xMCQpLCBiZW50dWsgKipEaXN0cmlidXNpIEJpbm9taWFsIG11bGFpIG1lbnllcnVwYWkgRGlzdHJpYnVzaSBOb3JtYWwgKGt1cnZhIGxvbmNlbmcpKiogDQoNCioqa2l0YSBiaXNhIGxpaGF0IGRpIGNvbnRvaCBkaSB2aXN1YWxpc2FzaSBiZXJpa3V0OioqDQoNCmBgYHtyLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBvdXQuZXh0cmE9J3N0eWxlPSJkaXNwbGF5OmJsb2NrOyBtYXJnaW4tbGVmdDphdXRvOyBtYXJnaW4tcmlnaHQ6YXV0bzsiJ30NCg0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShncmlkRXh0cmEpDQoNCiMgU2V0IHNlZWQgdW50dWsgcmVwcm9kdWt0aWJpbGl0YXMNCnNldC5zZWVkKDEyMykNCg0KIyBGdW5nc2kgdW50dWsgbWVtYnVhdCBwbG90IGJpbm9taWFsDQpjcmVhdGVfYmlub21pYWxfcGxvdCA8LSBmdW5jdGlvbihuLCBwID0gMC41KSB7DQojIEdlbmVyYXRlIGRhdGEgYmlub21pYWwNCnggPC0gMDpuDQpwcm9iIDwtIGRiaW5vbSh4LCBzaXplID0gbiwgcHJvYiA9IHApDQoNCiMgQnVhdCBkYXRhIGZyYW1lDQpkZiA8LSBkYXRhLmZyYW1lKHggPSB4LCBwcm9iYWJpbGl0eSA9IHByb2IpDQoNCiMgSGl0dW5nIG1lYW4gZGFuIHZhcmlhbmNlIHVudHVrIGRpc3RyaWJ1c2kgbm9ybWFsIHBlbWJhbmRpbmcNCm1lYW5fYmlub20gPC0gbiAqIHANCnNkX2Jpbm9tIDwtIHNxcnQobiAqIHAgKiAoMSAtIHApKQ0KDQojIEJ1YXQgcGxvdA0KZ2dwbG90KGRmLCBhZXMoeCA9IHgsIHkgPSBwcm9iYWJpbGl0eSkpICsNCmdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBmaWxsID0gInN0ZWVsYmx1ZSIsIGFscGhhID0gMC43LCB3aWR0aCA9IDAuOCkgKw0KZ2VvbV9saW5lKGFlcyh5ID0gZG5vcm0oeCwgbWVhbiA9IG1lYW5fYmlub20sIHNkID0gc2RfYmlub20pKSwgDQpjb2xvciA9ICJyZWQiLCBsaW5ld2lkdGggPSAxLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArDQpsYWJzKHRpdGxlID0gcGFzdGUoIkRpc3RyaWJ1c2kgQmlub21pYWwgdnMgTm9ybWFsXG5uID0iLCBuLCAiLCBwID0iLCBwKSwNCnggPSAiSnVtbGFoIFN1a3NlcyAoWCkiLA0KeSA9ICJQcm9iYWJpbGl0YXMiLA0KY2FwdGlvbiA9ICJHYXJpcyBtZXJhaDogS3VydmEgTm9ybWFsIFBlbWJhbmRpbmciKSArDQp0aGVtZV9taW5pbWFsKCkgKw0KdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpDQp9DQoNCiMgQnVhdCBwbG90IHVudHVrIGJlcmJhZ2FpIG5pbGFpIG4NCnAxIDwtIGNyZWF0ZV9iaW5vbWlhbF9wbG90KG4gPSAyLCBwID0gMC41KQ0KcDIgPC0gY3JlYXRlX2Jpbm9taWFsX3Bsb3QobiA9IDEwLCBwID0gMC41KSANCnAzIDwtIGNyZWF0ZV9iaW5vbWlhbF9wbG90KG4gPSAzMCwgcCA9IDAuNSkNCnA0IDwtIGNyZWF0ZV9iaW5vbWlhbF9wbG90KG4gPSA1MCwgcCA9IDAuNSkNCg0KIyBUYW1waWxrYW4gc2VtdWEgcGxvdCBkYWxhbSBncmlkDQpncmlkLmFycmFuZ2UocDEsIHAyLCBwMywgcDQsIG5jb2wgPSAyKQ0KDQpgYGANCg0KKio0LiBQZW5nYXJ1aCBQcm9iYWJpbGl0YXMgU3Vrc2VzICgkcCQpIFRlcmhhZGFwIEtlbWlyaW5nYW4gKFNrZXduZXNzKSoqDQoNCkJlbnR1ayAoa2VtaXJpbmdhbikgRGlzdHJpYnVzaSBCaW5vbWlhbCBzYW5nYXQgYmVyZ2FudHVuZyBwYWRhIG5pbGFpICRwJCANCg0KDQpgYGB7cn0NCg0KIyBNZW1idWF0IGRhdGEgZnJhbWUgdW50dWsgdGFiZWwgYmVudHVrIGRpc3RyaWJ1c2kNCmJlbnR1a19kaXN0cmlidXNpIDwtIGRhdGEuZnJhbWUoDQpgTmlsYWkgcGAgPSBjKCIkcCA9IDAuNSQiLCAiJHAgPCAwLjUkIiwgIiRwID4gMC41JCIpLA0KYEJlbnR1ayBEaXN0cmlidXNpYCA9IGMoIlNpbWV0cmlzIiwgIk1pcmluZyBrZSBLYW5hbiAoUmlnaHQtU2tld2VkKSIsICJNaXJpbmcga2UgS2lyaSAoTGVmdC1Ta2V3ZWQpIiksDQpgQXJhaCBLZW1pcmluZ2FuYCA9IGMoIlRpZGFrIG1pcmluZyAoYmVycHVzYXQgZGkgdGVuZ2FoLCAkXFxtdSA9IG4vMiQpIiwgDQoiRGF0YSBtZW5nZWxvbXBvayBkaSBzaXNpIGtpcmkgKG1lbmRla2F0aSAwKSIsIA0KIkRhdGEgbWVuZ2Vsb21wb2sgZGkgc2lzaSBrYW5hbiAobWVuZGVrYXRpICRuJCkiKSwNCkFsYXNhbiA9IGMoDQoiVGluZ2thdCBzdWtzZXMgc2VkYW5nLCBzZWhpbmdnYSBkaXN0cmlidXNpIHNlaW1iYW5nIiwNCiJUaW5na2F0IHN1a3NlcyByZW5kYWgsIHNlaGluZ2dhIHNlYmFnaWFuIGJlc2FyIGhhc2lsIGFkYWxhaCBrZWdhZ2FsYW4iLA0KIlRpbmdrYXQgc3Vrc2VzIHRpbmdnaSwgc2VoaW5nZ2Egc2ViYWdpYW4gYmVzYXIgaGFzaWwgYWRhbGFoIGtlYmVyaGFzaWxhbiINCikNCikNCg0KIyBNZW5hbXBpbGthbiB0YWJlbCBkZW5nYW4ga2FibGUNCmxpYnJhcnkoa25pdHIpDQprYWJsZShiZW50dWtfZGlzdHJpYnVzaSwNCmNvbC5uYW1lcyA9IGMoIk5pbGFpIHAiLCAiQmVudHVrIERpc3RyaWJ1c2kiLCAiQXJhaCBLZW1pcmluZ2FuIiwgIkFsYXNhbiIpLA0KYWxpZ24gPSBjKCJjIiwgImMiLCAibCIsICJsIiksDQpjYXB0aW9uID0gIlRhYmVsIEJlbnR1ayBEaXN0cmlidXNpIEJpbm9taWFsIEJlcmRhc2Fya2FuIE5pbGFpIHAiLA0KZXNjYXBlID0gRkFMU0UpDQoNCmBgYA0KDQoqKjUuIEFwcm9rc2ltYXNpIE5vcm1hbCBkYXJpIERpc3RyaWJ1c2kgQmlub21pYWwqKg0KDQpNZXNraXB1biBkaXN0cmlidXNpIG11bmdraW4gbWlyaW5nIChza2V3ZWQpIGthcmVuYSAkcCBcbmVxIDAuNSQsIGlhIGFrYW4gbWVuamFkaSBzZW1ha2luIG1lbnllcnVwYWkgRGlzdHJpYnVzaSBOb3JtYWwgamlrYSBuaWxhaSAkbiQgKGp1bWxhaCBwZXJjb2JhYW4pIHRlcnVzIGRpdGluZ2thdGthbi4NCg0KQWRhIHBlZG9tYW4ga2FzYXIgeWFuZyBkaWd1bmFrYW4gdW50dWsgbWVuZW50dWthbiBhcGFrYWgga2l0YSBkYXBhdCBtZW5nYXN1bXNpa2FuIGFwcm9rc2ltYXNpIChwZW5kZWthdGFuKSBOb3JtYWwgdW50dWsgc3VhdHUgRGlzdHJpYnVzaSBCaW5vbWlhbDoNCg0KRHVhIGtvbmRpc2kgaGFydXMgZGlwZW51aGk6DQoNCjEuICAkbiBcY2RvdCBwIFxnZSAxMCQgICAoUmF0YS1yYXRhIHN1a3NlcyBoYXJ1cyBjdWt1cCBiZXNhcikuDQoNCjIuICAkbiBcY2RvdCAoMS1wKSBcZ2UgMTAkICAgKFJhdGEtcmF0YSBrZWdhZ2FsYW4ganVnYSBoYXJ1cyBjdWt1cCBiZXNhcikuDQoNCkppa2Ega2VkdWEga29uZGlzaSBpbmkgdGVycGVudWhpLCBwZW5nZ3VuYWFuIERpc3RyaWJ1c2kgTm9ybWFsIHNlYmFnYWkgcGVya2lyYWFuIHVudHVrIERpc3RyaWJ1c2kgQmlub21pYWwgYWthbiBtZW5naGFzaWxrYW4gYWt1cmFzaSB5YW5nIGJhaWsuDQoNCg0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldCgNCmVjaG8gPSBGQUxTRSwgDQp3YXJuaW5nID0gRkFMU0UsIA0KbWVzc2FnZSA9IEZBTFNFDQopDQpgYGANCg0KYGBge3IgZnVuY3Rpb25zLCBpbmNsdWRlPUZBTFNFfQ0KIyBGVU5HU0kgVEFOUEEgQ0FUKCkgLSBoYW55YSByZXR1cm4gdmFsdWVzDQpjaGVja19ub3JtYWxfYXBwcm94aW1hdGlvbl9zaWxlbnQgPC0gZnVuY3Rpb24obiwgcCwgc2hvd19wbG90ID0gVFJVRSkgew0KbnAgPC0gbiAqIHANCm5xIDwtIG4gKiAoMSAtIHApDQpjb25kaXRpb24xIDwtIG5wID49IDEwDQpjb25kaXRpb24yIDwtIG5xID49IDEwDQoNCmlmIChzaG93X3Bsb3QpIHsNCiMgR2VuZXJhdGUgZGF0YSB1bnR1ayBwbG90DQp4IDwtIDA6bg0KYmlub21pYWxfcHJvYnMgPC0gZGJpbm9tKHgsIHNpemUgPSBuLCBwcm9iID0gcCkNCg0KIyBQYXJhbWV0ZXIgdW50dWsgZGlzdHJpYnVzaSBub3JtYWwNCm11IDwtIG5wDQpzaWdtYSA8LSBzcXJ0KG4gKiBwICogKDEgLSBwKSkNCg0KIyBDcmVhdGUgcGxvdA0KcGxvdCh4LCBiaW5vbWlhbF9wcm9icywgdHlwZSA9ICJoIiwgbHdkID0gMiwgY29sID0gImJsdWUiLA0KbWFpbiA9IHBhc3RlKCJEaXN0cmlidXNpIEJpbm9taWFsIHZzIE5vcm1hbFxubiA9IiwgbiwgIiwgcCA9IiwgcCksDQp4bGFiID0gIkp1bWxhaCBLZWJlcmhhc2lsYW4iLCB5bGFiID0gIlByb2JhYmlsaXRhcyIsDQp5bGltID0gYygwLCBtYXgoYmlub21pYWxfcHJvYnMpICogMS4yKSkNCg0KIyBUYW1iYWhrYW4ga3VydmEgbm9ybWFsDQp4X25vcm1hbCA8LSBzZXEoMCwgbiwgbGVuZ3RoID0gMTAwMCkNCm5vcm1hbF9kZW5zaXR5IDwtIGRub3JtKHhfbm9ybWFsLCBtZWFuID0gbXUsIHNkID0gc2lnbWEpDQpsaW5lcyh4X25vcm1hbCwgbm9ybWFsX2RlbnNpdHksIGNvbCA9ICJyZWQiLCBsd2QgPSAyKQ0KDQojIFRhbWJhaGthbiBsZWdlbmQNCmxlZ2VuZCgidG9wcmlnaHQiLCANCmxlZ2VuZCA9IGMoIkJpbm9taWFsIiwgIk5vcm1hbCBBcHByb3hpbWF0aW9uIiksDQpjb2wgPSBjKCJibHVlIiwgInJlZCIpLCBsd2QgPSAyKQ0KDQojIFRhbWJhaGthbiBnYXJpcyB2ZXJ0aWthbCBkaSBtZWFuDQphYmxpbmUodiA9IG11LCBjb2wgPSAiZ3JlZW4iLCBsdHkgPSAyLCBsd2QgPSAxLjUpDQoNCiMgVGFtYmFoa2FuIHRleHQgYm94IGRlbmdhbiBoYXNpbA0KdGV4dF9ib3ggPC0gaWZlbHNlKGNvbmRpdGlvbjEgJiBjb25kaXRpb24yLA0KIkFQUk9LU0lNQVNJIERJUkVLT01FTkRBU0lLQU4iLA0KIkFQUk9LU0lNQVNJIFRJREFLIERJUkVLT01FTkRBU0lLQU4iKQ0KDQp0ZXh0X2NvbG9yIDwtIGlmZWxzZShjb25kaXRpb24xICYgY29uZGl0aW9uMiwgImRhcmtncmVlbiIsICJyZWQiKQ0KbXRleHQodGV4dF9ib3gsIHNpZGUgPSAzLCBjb2wgPSB0ZXh0X2NvbG9yLCBmb250ID0gMiwgY2V4ID0gMS4yKQ0KfQ0KDQpyZXR1cm4obGlzdCgNCm4gPSBuLA0KcCA9IHAsDQpucCA9IG5wLA0KbnEgPSBucSwNCmNvbmRpdGlvbjEgPSBjb25kaXRpb24xLA0KY29uZGl0aW9uMiA9IGNvbmRpdGlvbjIsDQpyZWNvbW1lbmRlZCA9IGNvbmRpdGlvbjEgJiBjb25kaXRpb24yDQopKQ0KfQ0KDQojIEZ1bmdzaSB1bnR1ayBwZXJoaXR1bmdhbiBwcm9iYWJpbGl0YXMNCmNvbXBhcmVfcHJvYmFiaWxpdGllc19zaWxlbnQgPC0gZnVuY3Rpb24obiwgcCwgbG93ZXIsIHVwcGVyKSB7DQpwcm9iX2Jpbm9taWFsIDwtIHBiaW5vbSh1cHBlciwgc2l6ZSA9IG4sIHByb2IgPSBwKSAtIHBiaW5vbShsb3dlciAtIDEsIHNpemUgPSBuLCBwcm9iID0gcCkNCm11IDwtIG4gKiBwDQpzaWdtYSA8LSBzcXJ0KG4gKiBwICogKDEgLSBwKSkNCnByb2Jfbm9ybWFsIDwtIHBub3JtKHVwcGVyICsgMC41LCBtZWFuID0gbXUsIHNkID0gc2lnbWEpIC0gcG5vcm0obG93ZXIgLSAwLjUsIG1lYW4gPSBtdSwgc2QgPSBzaWdtYSkNCg0KY2hlY2sgPC0gY2hlY2tfbm9ybWFsX2FwcHJveGltYXRpb25fc2lsZW50KG4sIHAsIHNob3dfcGxvdCA9IEZBTFNFKQ0KDQpyZXR1cm4obGlzdCgNCmJpbm9taWFsID0gcHJvYl9iaW5vbWlhbCwNCm5vcm1hbCA9IHByb2Jfbm9ybWFsLA0KZGlmZmVyZW5jZSA9IGFicyhwcm9iX2Jpbm9taWFsIC0gcHJvYl9ub3JtYWwpLA0KcmVjb21tZW5kZWQgPSBjaGVjayRyZWNvbW1lbmRlZA0KKSkNCn0NCmBgYA0KDQoqKkNvbnRvaCAxOioqIEtvbmRpc2kgVGVycGVudWhpIChuPTEwMCwgcD0wLjMpDQoNCmBgYHtyIGNhc2UxX3Bsb3QsIGVjaG89RkFMU0UsIGZpZy5hbGlnbj0nY2VudGVyJ30NCnJlc3VsdDEgPC0gY2hlY2tfbm9ybWFsX2FwcHJveGltYXRpb25fc2lsZW50KDEwMCwgMC4zLCBzaG93X3Bsb3QgPSBUUlVFKQ0KYGBgDQoNCioqbiDDlyBwKiogPSBgciByZXN1bHQxJG5wYCDiiaUgMTAgDQoqKm4gw5cgKDEtcCkqKiA9IGByIHJlc3VsdDEkbnFgIOKJpSAxMCAgDQoqKktlc2ltcHVsYW46KiogQXByb2tzaW1hc2kgbm9ybWFsICoqZGlyZWtvbWVuZGFzaWthbioqDQoNCi0tLQ0KDQoqKkNvbnRvaCAyOioqIHAgVGVybGFsdSBLZWNpbCAobj0yMDAsIHA9MC4wMikNCg0KYGBge3IgY2FzZTJfcGxvdCwgZWNobz1GQUxTRSwgZmlnLmFsaWduPSdjZW50ZXInfQ0KcmVzdWx0MiA8LSBjaGVja19ub3JtYWxfYXBwcm94aW1hdGlvbl9zaWxlbnQoMjAwLCAwLjAyLCBzaG93X3Bsb3QgPSBUUlVFKQ0KYGBgDQoNCioqbiDDlyBwKiogPSBgciByZXN1bHQyJG5wYCA8IDEwIA0KKipuIMOXICgxLXApKiogPSBgciByZXN1bHQyJG5xYCDiiaUgMTAgIA0KKipLZXNpbXB1bGFuOioqIEFwcm9rc2ltYXNpIG5vcm1hbCAqKnRpZGFrIGRpcmVrb21lbmRhc2lrYW4qKg0KDQotLS0NCg0KKipDb250b2ggMzoqKiBwIFRlcmxhbHUgQmVzYXIgKG49NTAsIHA9MC45NSkNCg0KYGBge3IgY2FzZTNfcGxvdCwgZWNobz1GQUxTRSwgZmlnLmFsaWduPSdjZW50ZXInfQ0KcmVzdWx0MyA8LSBjaGVja19ub3JtYWxfYXBwcm94aW1hdGlvbl9zaWxlbnQoNTAsIDAuOTUsIHNob3dfcGxvdCA9IFRSVUUpDQpgYGANCg0KKipuIMOXIHAqKiA9IGByIHJlc3VsdDMkbnBgIOKJpSAxMCANCioqbiDDlyAoMS1wKSoqID0gYHIgcmVzdWx0MyRucWAgPCAxMCAgDQoqKktlc2ltcHVsYW46KiogQXByb2tzaW1hc2kgbm9ybWFsICoqdGlkYWsgZGlyZWtvbWVuZGFzaWthbioqDQoNCi0tLQ0KDQoqKkNvbnRvaCA0OioqIERpIEJhdGFzIChuPTUwLCBwPTAuMikNCg0KYGBge3IgY2FzZTRfcGxvdCwgZWNobz1GQUxTRSwgZmlnLmFsaWduPSdjZW50ZXInfQ0KcmVzdWx0NCA8LSBjaGVja19ub3JtYWxfYXBwcm94aW1hdGlvbl9zaWxlbnQoNTAsIDAuMiwgc2hvd19wbG90ID0gVFJVRSkNCmBgYA0KDQoqKm4gw5cgcCoqID0gYHIgcmVzdWx0NCRucGAg4omlIDEwIA0KKipuIMOXICgxLXApKiogPSBgciByZXN1bHQ0JG5xYCDiiaUgMTAgIA0KKipLZXNpbXB1bGFuOioqIEFwcm9rc2ltYXNpIG5vcm1hbCAqKmRpcmVrb21lbmRhc2lrYW4qKg0KDQotLS0NCg0KKipQZXJiYW5kaW5nYW4gUHJvYmFiaWxpdGFzKioNCg0KS2FzdXMgQmFpayAobj0xMDAsIHA9MC4zKQ0KDQpgYGB7ciBjb21wYXJpc29uX2dvb2QsIGluY2x1ZGU9RkFMU0V9DQpjb21wX2dvb2QgPC0gY29tcGFyZV9wcm9iYWJpbGl0aWVzX3NpbGVudCgxMDAsIDAuMywgMjUsIDM1KQ0KYGBgDQoNClByb2JhYmlsaXRhcyBQKDI1IOKJpCBYIOKJpCAzNSk6DQotICoqQmlub21pYWwgKGVrc2FrKToqKiBgciByb3VuZChjb21wX2dvb2QkYmlub21pYWwsIDQpYA0KLSAqKk5vcm1hbCAoYXByb2tzaW1hc2kpOioqIGByIHJvdW5kKGNvbXBfZ29vZCRub3JtYWwsIDQpYA0KLSAqKlNlbGlzaWg6KiogYHIgcm91bmQoY29tcF9nb29kJGRpZmZlcmVuY2UsIDQpYA0KLSAqKlN0YXR1czoqKiBgciBpZmVsc2UoY29tcF9nb29kJHJlY29tbWVuZGVkLCAiRGlyZWtvbWVuZGFzaWthbiIsICJUaWRhayBEaXJla29tZW5kYXNpa2FuIilgDQoNCkthc3VzIEJ1cnVrIChuPTUwLCBwPTAuMDIpDQoNCmBgYHtyIGNvbXBhcmlzb25fYmFkLCBpbmNsdWRlPUZBTFNFfQ0KY29tcF9iYWQgPC0gY29tcGFyZV9wcm9iYWJpbGl0aWVzX3NpbGVudCg1MCwgMC4wMiwgMCwgMykNCmBgYA0KDQpQcm9iYWJpbGl0YXMgUCgwIOKJpCBYIOKJpCAzKToNCi0gKipCaW5vbWlhbCAoZWtzYWspOioqIGByIHJvdW5kKGNvbXBfYmFkJGJpbm9taWFsLCA0KWANCi0gKipOb3JtYWwgKGFwcm9rc2ltYXNpKToqKiBgciByb3VuZChjb21wX2JhZCRub3JtYWwsIDQpYA0KLSAqKlNlbGlzaWg6KiogYHIgcm91bmQoY29tcF9iYWQkZGlmZmVyZW5jZSwgNClgDQotICoqU3RhdHVzOioqIGByIGlmZWxzZShjb21wX2JhZCRyZWNvbW1lbmRlZCwgIkRpcmVrb21lbmRhc2lrYW4iLCAiVGlkYWsgRGlyZWtvbWVuZGFzaWthbiIpYA0KDQotLS0NCg0KKipSaW5na2FzYW4gS29uZGlzaSBBcHJva3NpbWFzaSoqDQoNCmBgYHtyIHN1bW1hcnlfdGFibGUsIGVjaG89VFJVRX0NCmV4YW1wbGVzIDwtIGRhdGEuZnJhbWUoDQpLYXN1cyA9IDE6NSwNCm4gPSBjKDEwMCwgMjAwLCA1MCwgMTAwLCAzMCksDQpwID0gYygwLjMsIDAuMDIsIDAuOTUsIDAuNSwgMC4xKSwNCm5wID0gYygzMCwgNCwgNDcuNSwgNTAsIDMpLA0KbnEgPSBjKDcwLCAxOTYsIDIuNSwgNTAsIDI3KSwNCkRpcmVrb21lbmRhc2lrYW4gPSBjKFRSVUUsIEZBTFNFLCBGQUxTRSwgVFJVRSwgRkFMU0UpDQopDQoNCmtuaXRyOjprYWJsZShleGFtcGxlcywgYWxpZ24gPSAiYyIsIGNhcHRpb24gPSAiVGFiZWwgUmluZ2thc2FuIEtvbmRpc2kgQXByb2tzaW1hc2kgTm9ybWFsIikNCmBgYA0KDQotLS0NCg0KIyMgLiBSZWZlcmVuc2kNCg0KaHR0cHM6Ly9ib29rZG93bi5vcmcvZHNjaWVuY2VsYWJzL2ludHJvX3N0YXRpc3RpY3MvMDYtRXNzZW50aWFsc19vZl9Qcm9iYWJpbGl0eS5odG1sI3JlZmVyZW5jZXMNCg0KaHR0cHM6Ly9ndXJ1bXVkYS5uZXQvc3RhdGlzdGlrYS9rb25zZXAtZGFzYXItcHJvYmFiaWxpdGFzLWRhbGFtLXN0YXRpc3Rpa2EuaHRtDQoNCmh0dHBzOi8vbG1zc3BhZGEua2VtZGlrdGlzYWludGVrLmdvLmlkL3BsdWdpbmZpbGUucGhwLzUzODY3NS9tb2RfcmVzb3VyY2UvY29udGVudC8xL3ByZXNlbnRhc2klMjBiYWIlMjAwN19taHMlMjAlNUJDb21wYXRpYmlsaXR5JTIwTW9kZSU1RC5wZGYNCg0KDQoNCg==