Tugas Pertemuan 9

Ukuran Pemusatan Data

1 Definisi

Ukuran pemusatan adalah metode statistik yang digunakan untuk menentukan nilai yang mewakili pusat dari kumpulan data. Nilai ini membantu menggambarkan karakteristik umum data secara keseluruhan dan memberikan informasi tentang bagaimana data terdistribusi di sekitar titik tertentu.

2 Praktikum 1

Berikut penjelasan secara manual dan visualisasi ukuran pemusatan untuk data kelompok:

2.1 Mean Untuk Data Kelompok

Mean (Rata-rata) adalah ukuran pemusatan data yang paling umum digunakan dalam statistik. Mean dihitung dengan menjumlahkan semua nilai dalam suatu kumpulan data, lalu membaginya dengan jumlah data yang ada. Mean memberikan gambaran umum tentang posisi pusat dari data. Untuk data kelompok , yang biasanya disajikan dalam bentuk kelas interval, perhitungan mean sedikit berbeda dibandingkan dengan data tunggal.

Adapun rumus untuk menentukan mean pada data kelompok:

\[ \bar{x} = \frac{\Sigma f_i x_i}{\Sigma f_i} \]

Penjelasan:

  • \(\bar{x}\): rata-rata (mean) data kelompok.
  • \(\Sigma\): simbol penjumlahan.
  • \(f_i\): frekuensi dari setiap kelas data.
  • \(x_i\): nilai tengah dari setiap kelas data.

Contoh:

Nilai Frekuensi
21-25 2
26-30 8
31-35 9
36-40 6
41-45 3
46-50 2

Langkah pengerjaan:

  1. Menjumlahkan frekuensi: Dengan cara menjumlahkan kolom bagian frekuensi

  2. Menentukan nilai tengah \(x_i\): Dengan cara menjumlahkan nilai lalu di bagi 2

  3. Melakukan perkalian terhadap frekuensi dan titik tengah: Dengan cara melakukan perkalian antara \(f_i\). \(x_i\)

Sehingga dijabarkan:

Nilai Frekuensi \(x_i\) \(f_i\). \(x_i\)
21-25 2 23 46
26-30 8 28 224
31-35 9 33 297
36-40 6 38 228
41-45 3 43 129
46-50 2 48 96
\(\sum f_i\) = 30 \(\sum (f_i \cdot x_i)\)= 1020

Penjelasan:

  • \(\sum (f_i \cdot x_i)\) adalah jumlah hasil perkalian antara frekuensi dan titik tengah.

  • \(\sum f_i\) adalah jumlah frekuensi.

Masukkan rumus untuk menentukan nilai mean:

\[ \bar{x} = \frac{\Sigma f_i x_i}{\Sigma f_i} = \frac{1020}{30} = 34 \]

Dengan demikian, Mean dari data kelompok tersebut adalah 34.

## Loading required package: ggplot2
## 
## Attaching package: 'plotly'
## The following object is masked from 'package:ggplot2':
## 
##     last_plot
## The following object is masked from 'package:stats':
## 
##     filter
## The following object is masked from 'package:graphics':
## 
##     layout

2.2 Median Untuk Data Kelompok

Median adalah nilai tengah dalam suatu kumpulan data yang telah diurutkan. Jika data terdiri dari jumlah yang ganjil, median adalah nilai yang tepat berada di tengah. Jika jumlah data genap, median dihitung sebagai rata-rata dari dua nilai tengah yang berurutan.

Adapun rumus untuk menentukan mean pada data kelompok:

\[ Me = tb + \left( \frac{\frac{n}{2} - F_k}{f_m} \right) \cdot p \]

Penjelasan:

  • \(Me\): median.
  • \(tb\): tepi bawah kelas median.
  • \(n\): jumlah seluruh frekuensi.
  • \(F_k\): frekuensi kumulatif sebelum kelas median.
  • \(f_m\): frekuensi kelas median.
  • \(p\): panjang interval kelas.

Contoh:

Nilai Frekuensi
21-25 2
26-30 8
31-35 9
36-40 6
41-45 3
46-50 2

Langkah pengerjaan:

  1. Menjumlahkan frekuensi: Dengan cara menjumlahkan kolom bagian frekuensi. Dilambangkan dengan n

  2. Menentukan nilai frekuensi komulatif \(f_k\): Dengan cara untuk baris pertama salin saja ke samping, lalu untuk angka di bawahnya jumlahkan dengan yang ada di baris ke dua frekuensi dan seterusnya.

  3. Mencari letak kelas median.

  4. lalu mencari angka yang memuat nilai dari letak median.

Sehingga dijabarkan:

Nilai Frekuensi \(f_k\)
21-25 2 2
26-30 8 10
31-35 9 19
36-40 6 25
41-45 3 28
46-50 2 30
n = 30

Cara menentukan letak median: \[ \text{Letak}\ M_e = \frac{n}{2} = \frac{30}{2} = 15 \]

setelah mendapatkan letak median lalu lihat angka yang memuat pada letak median tadi terhadap kolom yang sudah dibuat. sehingga yang memuat angka 15 yaitu 19. Dengan kata lain nilai median adalah pada nilai 31-35, frekuensi 9 dan frekuensi komulatif 19.

lalu cari nilai median dengan menggunakan rumus:

\[ Me = tb + \left( \frac{\frac{n}{2} - F_k}{f_m} \right) \cdot p \]

\[ Me = 30,5 + \frac{\frac{30}{2} - 10}{9} \cdot 5 \]

\[ Me = 30,5 + \frac{15 - 10}{9} \cdot 5 \] \[ Me = 30,5 + \frac{25}{9} \] \[ Me = 30,5 + 2,78 = 33,28 \]

Penjelasan tambahan:

  • tb: mengambil nilai paling depan lalu dikurang 0,5 (31-0,5).

  • fk: frekuensi komulatif sebelum median (10).

  • fm: frekuensi kelas median (9).

  • p : panjang kelas dengan mengambil nilai pertama yaitu panjang kelas nilai 21-25 sehingga panjang kelasnya 5. Dengan demikian, Mean dari data kelompok tersebut adalah 33,28.

Dengan demikian, Median dari data kelompok tersebut adalah 33,28.

2.3 Modus Untuk Data Kelompok

Modus adalah nilai yang paling sering muncul dalam sebuah dataset. Modus digunakan untuk mengetahui nilai yang paling dominan atau paling sering terjadi dalam suatu kumpulan data. Modus dapat ditemukan dalam data kuantitatif maupun kategorikal.

Adapun rumus untuk menentukan median pada data kelompok:

\[ Mo = tb + \left( \frac{d_1}{d_1 + d_2} \right) \cdot p \]

Penjelasan:

  • \(Mo\): modus.

  • \(tb\): tepi bawah kelas modus.

  • \(d_1\): selisih frekuensi kelas modus dengan kelas sebelumnya.

  • \(d_2\): selisih frekuensi kelas modus dengan kelas setelahnya.

  • \(p\): panjang interval kelas.

Contoh:

Nilai Frekuensi
21-25 2
26-30 8
31-35 9
36-40 6
41-45 3
46-50 2

Langkah pengerjaan:

  1. Melihat kolom frekuensi yang paling besar nilainya

  2. Menentukan nilai modus

Masukkan rumus untuk menentukan nilai modus:

\[ Mo = tb + \left( \frac{d_1}{d_1 + d_2} \right) \cdot p \] \[ Mo = 30,5 + \left( \frac{1}{1 + 3} \right) \cdot 5 \] \[ Mo = 30,5 + \left( \frac{1}{4} \right) \cdot 5 \] \[ Mo = 30,5 + \frac{5}{4} \] \[ Mo = 30,5 + 1,25 = 31,75 \]

Penjelasan tambahan:

  • tb: mengambil nilai paling depan pada bagian kolom nilai frekuensi yang paling besar nilainya lalu dikurang 0,5 (31-0,5).

  • d1: nilai frekuensi yang nilainya lebih besar dikurangi dengan nilai frekuensi diatasnya (9-8).

  • d2: nilai frekuensi yang nilainya lebih besar dikurangi dengan nilai frekuensi diatasnya (9-6).

  • p : panjang kelasnya yaitu 5.

Dengan demikian, Modus dari data kelompok tersebut adalah 31,75.

3 Praktikum 2

3.1 Contoh sederhana di bisnis

Mean(Rata-rata)

Kasus: Analisis Rata-Rata Penjualan Harian di Toko

Rumus menghitung mean:

Mean = \(\frac{\sum X}{n}\)

Di mana:

  • \(\sum X\) adalah jumlah dari semua nilai data.

  • \(n\) adalah jumlah data.

Langkah-langkah untuk menghitung mean:

  1. Jumlahkan semua nilai dalam data.

  2. Bagi hasil jumlah dengan banyaknya data.

Contoh:

Misalkan sebuah toko ingin menghitung rata-rata penjualan harian dari lima hari terakhir untuk mengetahui kinerja toko dalam minggu tersebut. Data penjualan harian untuk lima hari terakhir adalah sebagai berikut (dalam satuan ribuan rupiah):

Hari 1: 200

Hari 2: 300

Hari 3: 250

Hari 4: 350

Hari 5: 400.

  1. Jumlahkan semua nilai: \[ 200 + 300 + 250 + 350 + 400 = 1.500 \]

  2. Bagi dengan jumlah data (n = 5): \[ \text{Mean} = \frac{1.500}{5} = 300 \]

Jadi, mean dari data tersebut adalah 300.

Median

Adapun rumus menghitung median dengan jumlah data ganjil:

\[ \frac{n + 1}{2} \]

Langkah pengerjaan: 1. diurutkan data dari yang kecil-besar.

Data Ganjil: 200 + 300 + 250 + 350 + 400

  • Urutkan data: 200,250,300,350,400

  • Jumlah data = 5 (Ganjil)

  • Posisi median=

\[ \frac{5 + 1}{2} = 3 \]

  • Jadi, median adalah nilai ke-3, yaitu 300

Modus

Contoh:

Misalkan Anda memiliki data penjualan produk dalam 8 hari berturut-turut seperti berikut:

100,200,400,200,500,300,100,200

Langkah-langkah untuk menghitung modus:

  1. Identifikasi angka yang paling sering muncul dalam data penjualan.

Penjualan 100 muncul 2 kali. Penjualan 200 muncul 3 kali. Penjualan 300, 400, dan 500 masing-masing muncul 1 kali.

  1. Tentukan modus (nilai yang paling sering muncul):

Karena 100 muncul paling sering (3 kali), maka modus dari data ini adalah 200.

3.2 Contoh sederhana di kesehatan

Mean(Rata-rata)

Kasus: Analisis Rata-Rata Penjualan Harian di Toko

Rumus menghitung mean:

Mean = \(\frac{\sum X}{n}\)

Di mana:

  • \(\sum X\) adalah jumlah dari semua nilai data.

  • \(n\) adalah jumlah data.

Langkah-langkah untuk menghitung mean:

  1. Jumlahkan semua nilai dalam data.

  2. Bagi hasil jumlah dengan banyaknya data.

Contoh:

Misalkan kita memiliki data tekanan darah sistolik dari 5 pasien:

Data tekanan darah sistolik (mmHg): 120, 130, 125, 128, 135

  1. Jumlahkan semua nilai: \[ 120 + 130 + 125 + 128 + 135 = 638 \]

  2. Bagi dengan jumlah data (n = 5): \[ \text{Mean} = \frac{638}{5} = 127,6 \]

Jadi, mean dari data tersebut adalah 127,6.

Median

Adapun rumus menghitung median dengan jumlah data ganjil:

\[ \frac{n + 1}{2} \]

Langkah pengerjaan: 1. diurutkan data dari yang kecil-besar.

Data Ganjil: 120, 130, 125, 128, 135

  • Urutkan data: 120,125,128,130,135

  • Jumlah data = 5 (Ganjil)

  • Posisi median=

\[ \frac{5 + 1}{2} = 3 \]

  • Jadi, median adalah nilai ke-3, yaitu 128

Modus

Contoh:

Misalkan kita memiliki data tekanan darah sistolik dari 10 pasien:

Data tekanan darah sistolik (mmHg):

120, 130, 120, 120, 135, 150, 200, 150, 150, 150

Langkah-langkah untuk menghitung modus:

  1. Identifikasi angka yang paling sering muncul dalam data penjualan.

Penjualan 120 muncul 3 kali. Penjualan 150 muncul 4 kali. Penjualan 130, 135, dan 200 masing-masing muncul 1 kali.

  1. Tentukan modus (nilai yang paling sering muncul):

Karena 150 muncul paling sering (4 kali), maka modus dari data ini adalah 150.

3.3 Contoh sederhana di pendidikan

Mean(Rata-rata)

Kasus: nilai ujian matematika

Rumus menghitung mean:

Mean = \(\frac{\sum X}{n}\)

Di mana:

  • \(\sum X\) adalah jumlah dari semua nilai data.

  • \(n\) adalah jumlah data.

Langkah-langkah untuk menghitung mean:

  1. Jumlahkan semua nilai dalam data.

  2. Bagi hasil jumlah dengan banyaknya data.

Contoh:

Misalkan kita memiliki data nilai ujian matematika dari 7 siswa di sebuah kelas:

Data Nilai Ujian (dalam angka):

60, 75, 70, 90, 80

  1. Jumlahkan semua nilai: \[ 60 + 75 + 70 + 90 + 80 = 375 \]

  2. Bagi dengan jumlah data (n = 5): \[ \text{Mean} = \frac{375}{5} = 75 \]

Jadi, mean dari data tersebut adalah 75.

Median

Adapun rumus menghitung median dengan jumlah data ganjil:

\[ \frac{n + 1}{2} \]

Langkah pengerjaan: 1. diurutkan data dari yang kecil-besar.

Data Ganjil: 60, 75, 70, 90, 80

  • Urutkan data: 60, 70, 75, 80, 90

  • Jumlah data = 5 (Ganjil)

  • Posisi median=

\[ \frac{5 + 1}{2} = 3 \]

  • Jadi, median adalah nilai ke-3, yaitu 75

Modus

Contoh:

Misalkan kita memiliki data tekanan darah sistolik dari 10 pasien:

Data tekanan darah sistolik (mmHg):

60, 70, 75, 80, 90, 95, 50, 70, 90, 90

Langkah-langkah untuk menghitung modus:

  1. Identifikasi angka yang paling sering muncul dalam data penjualan.

Penjualan 90 muncul 3 kali. Penjualan 70 muncul 2 kali. Penjualan 60, 75, dan 80 masing-masing muncul 1 kali.

  1. Tentukan modus (nilai yang paling sering muncul):

Karena 90 muncul paling sering (3 kali), maka modus dari data ini adalah 90.

LS0tDQp0aXRsZTogIlR1Z2FzIFBlcnRlbXVhbiA5Ig0Kc3VidGl0bGU6ICJVa3VyYW4gUGVtdXNhdGFuIERhdGEiDQphdXRob3I6IA0KICAtICJEd2kgU3JpIFlhbnRpIE1hbnVsbGFuZyINCmRhdGU6ICAiYHIgZm9ybWF0KFN5cy5EYXRlKCksICclQiAlZCwgJVknKWAiDQpvdXRwdXQ6DQogIHJtZGZvcm1hdHM6OnJlYWR0aGVkb3duOiAgICMgaHR0cHM6Ly9naXRodWIuY29tL2p1YmEvcm1kZm9ybWF0cw0KICAgIHNlbGZfY29udGFpbmVkOiB0cnVlDQogICAgdGh1bWJuYWlsczogdHJ1ZQ0KICAgIGxpZ2h0Ym94OiB0cnVlDQogICAgZ2FsbGVyeTogdHJ1ZQ0KICAgIG51bWJlcl9zZWN0aW9uczogdHJ1ZQ0KICAgIGxpYl9kaXI6IGxpYnMNCiAgICBkZl9wcmludDogInBhZ2VkIg0KICAgIGNvZGVfZm9sZGluZzogInNob3ciDQogICAgY29kZV9kb3dubG9hZDogeWVzDQogICAgY3NzOiAiQzovVXNlcnMvbWFyY3UvRG93bmxvYWRzL3N0eWxlLmNzcyINCi0tLQ0KDQojIERlZmluaXNpIA0KKipVa3VyYW4gcGVtdXNhdGFuKiogYWRhbGFoIG1ldG9kZSBzdGF0aXN0aWsgeWFuZyBkaWd1bmFrYW4gdW50dWsgbWVuZW50dWthbiBuaWxhaSB5YW5nIG1ld2FraWxpIHB1c2F0IGRhcmkga3VtcHVsYW4gZGF0YS4gTmlsYWkgaW5pIG1lbWJhbnR1IG1lbmdnYW1iYXJrYW4ga2FyYWt0ZXJpc3RpayB1bXVtIGRhdGEgc2VjYXJhIGtlc2VsdXJ1aGFuIGRhbiBtZW1iZXJpa2FuIGluZm9ybWFzaSB0ZW50YW5nIGJhZ2FpbWFuYSBkYXRhIHRlcmRpc3RyaWJ1c2kgZGkgc2VraXRhciB0aXRpayB0ZXJ0ZW50dS4NCg0KIyBQcmFrdGlrdW0gMQ0KQmVyaWt1dCBwZW5qZWxhc2FuIHNlY2FyYSBtYW51YWwgZGFuIHZpc3VhbGlzYXNpIHVrdXJhbiBwZW11c2F0YW4gdW50dWsgZGF0YSBrZWxvbXBvazoNCg0KIyMgTWVhbiBVbnR1ayBEYXRhIEtlbG9tcG9rDQoqKk1lYW4gKFJhdGEtcmF0YSkqKiBhZGFsYWggdWt1cmFuIHBlbXVzYXRhbiBkYXRhIHlhbmcgcGFsaW5nIHVtdW0gZGlndW5ha2FuIGRhbGFtIHN0YXRpc3Rpay4gTWVhbiBkaWhpdHVuZyBkZW5nYW4gbWVuanVtbGFoa2FuIHNlbXVhIG5pbGFpIGRhbGFtIHN1YXR1IGt1bXB1bGFuIGRhdGEsIGxhbHUgbWVtYmFnaW55YSBkZW5nYW4ganVtbGFoIGRhdGEgeWFuZyBhZGEuIE1lYW4gbWVtYmVyaWthbiBnYW1iYXJhbiB1bXVtIHRlbnRhbmcgcG9zaXNpIHB1c2F0IGRhcmkgZGF0YS4gVW50dWsgZGF0YSBrZWxvbXBvayAsIHlhbmcgYmlhc2FueWEgZGlzYWppa2FuIGRhbGFtIGJlbnR1ayBrZWxhcyBpbnRlcnZhbCwgcGVyaGl0dW5nYW4gbWVhbiBzZWRpa2l0IGJlcmJlZGEgZGliYW5kaW5na2FuIGRlbmdhbiBkYXRhIHR1bmdnYWwuDQoNCkFkYXB1biBydW11cyB1bnR1ayBtZW5lbnR1a2FuIG1lYW4gcGFkYSBkYXRhIGtlbG9tcG9rOg0KIA0KXFsNClxiYXJ7eH0gPSBcZnJhY3tcU2lnbWEgZl9pIHhfaX17XFNpZ21hIGZfaX0NClxdDQoNCioqUGVuamVsYXNhbjoqKg0KDQotIFwoIFxiYXJ7eH0gXCk6IHJhdGEtcmF0YSAobWVhbikgZGF0YSBrZWxvbXBvay4NCi0gXCggXFNpZ21hIFwpOiBzaW1ib2wgcGVuanVtbGFoYW4uDQotIFwoIGZfaSBcKTogZnJla3VlbnNpIGRhcmkgc2V0aWFwIGtlbGFzIGRhdGEuDQotIFwoIHhfaSBcKTogbmlsYWkgdGVuZ2FoIGRhcmkgc2V0aWFwIGtlbGFzIGRhdGEuDQoNCg0KKipDb250b2g6KioNCg0KfCBOaWxhaSAgICAgfCBGcmVrdWVuc2kgICAgfCAgICAgICAgICAgDQp8Oi0tLS0tLS0tLTp8Oi0tLS0tLS0tLS0tLTp8DQp8IDIxLTI1ICAgICB8IDIgICAgICAgICAgICB8ICAgICAgICAgICANCnwgMjYtMzAgICAgIHwgOCAgICAgICAgICAgIHwgICAgICAgICAgIA0KfCAzMS0zNSAgICAgfCA5ICAgICAgICAgICAgfCAgICAgICAgICAgDQp8IDM2LTQwICAgICB8IDYgICAgICAgICAgICB8ICAgICAgICANCnwgNDEtNDUgICAgIHwgMyAgICAgICAgICAgIHwgIA0KfCA0Ni01MCAgICAgfCAyICAgICAgICAgICAgfA0KDQoqKkxhbmdrYWggcGVuZ2VyamFhbjoqKg0KDQoxLiBNZW5qdW1sYWhrYW4gZnJla3VlbnNpOiBEZW5nYW4gY2FyYSBtZW5qdW1sYWhrYW4ga29sb20gYmFnaWFuIGZyZWt1ZW5zaQ0KDQoyLiBNZW5lbnR1a2FuIG5pbGFpIHRlbmdhaCAgXCggeF9pIFwpOiBEZW5nYW4gY2FyYSBtZW5qdW1sYWhrYW4gbmlsYWkgbGFsdSBkaSBiYWdpIDIgDQoNCjMuIE1lbGFrdWthbiBwZXJrYWxpYW4gdGVyaGFkYXAgZnJla3VlbnNpIGRhbiB0aXRpayB0ZW5nYWg6IERlbmdhbiBjYXJhIG1lbGFrdWthbiBwZXJrYWxpYW4gYW50YXJhIFwoIGZfaSBcKS4gXCggeF9pIFwpDQoNCg0KKipTZWhpbmdnYSBkaWphYmFya2FuOioqDQoNCnwgTmlsYWkgICAgIHwgRnJla3VlbnNpICAgICAgICAgIHwgXCggeF9pIFwpICAgICAgICAgICAgICAgIHwgXCggZl9pIFwpLiBcKCB4X2kgXCkgfA0KfDotLS0tLS0tLS06fDotLS0tLS0tLS0tLS0tLS0tLS06fDotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS06fDotLS0tLS0tLS0tLS0tLS0tLS0tLTp8DQp8IDIxLTI1ICAgICB8IDIgICAgICAgICAgICAgICAgICB8IDIzICAgICAgICAgICAgICAgICAgICAgICB8IDQ2ICAgICAgICAgICAgICAgICAgIHwNCnwgMjYtMzAgICAgIHwgOCAgICAgICAgICAgICAgICAgIHwgMjggICAgICAgICAgICAgICAgICAgICAgIHwyMjQgICAgICAgICAgICAgICAgICAgfA0KfCAzMS0zNSAgICAgfCA5ICAgICAgICAgICAgICAgICAgfCAzMyAgICAgICAgICAgICAgICAgICAgICAgfDI5NyAgICAgICAgICAgICAgICAgICB8DQp8IDM2LTQwICAgICB8IDYgICAgICAgICAgICAgICAgICB8IDM4ICAgICAgICAgICAgICAgICAgICAgICB8MjI4ICAgICAgICAgICAgICAgICAgIHwNCnwgNDEtNDUgICAgIHwgMyAgICAgICAgICAgICAgICAgIHwgNDMgICAgICAgICAgICAgICAgICAgICAgIHwxMjkgICAgICAgICAgICAgICAgICAgfA0KfCA0Ni01MCAgICAgfCAyICAgICAgICAgICAgICAgICAgfCA0OCAgICAgICAgICAgICAgICAgICAgICAgfDk2ICAgICAgICAgICAgICAgICAgICB8DQp8ICAgICAgICAgICB8XCggXHN1bSBmX2kgXCkgPSAzMCB8ICAgICAgICAgICAgICAgICAgICAgICAgICB8XCggXHN1bSAoZl9pIFxjZG90IHhfaSkgXCk9IDEwMjB8DQoNCioqUGVuamVsYXNhbjoqKg0KDQotIFwoIFxzdW0gKGZfaSBcY2RvdCB4X2kpIFwpIGFkYWxhaCBqdW1sYWggaGFzaWwgcGVya2FsaWFuIGFudGFyYSBmcmVrdWVuc2kgZGFuIHRpdGlrIHRlbmdhaC4NCg0KLSBcKCBcc3VtIGZfaSBcKSBhZGFsYWgganVtbGFoIGZyZWt1ZW5zaS4NCg0KTWFzdWtrYW4gcnVtdXMgdW50dWsgbWVuZW50dWthbiBuaWxhaSBtZWFuOg0KDQpcWw0KXGJhcnt4fSA9IFxmcmFje1xTaWdtYSBmX2kgeF9pfXtcU2lnbWEgZl9pfSA9IFxmcmFjezEwMjB9ezMwfSA9IDM0DQpcXQ0KDQoNCkRlbmdhbiBkZW1pa2lhbiwgKipNZWFuKiogZGFyaSBkYXRhIGtlbG9tcG9rIHRlcnNlYnV0IGFkYWxhaCAqKjM0KiouDQoNCg0KYGBge1IsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0UsIG1hc3NhZ2U9RkFMU0V9DQojIE1lbXVhdCBsaWJyYXJ5DQpsaWJyYXJ5KHBsb3RseSkNCg0KIyBEYXRhIGJlcmRhc2Fya2FuIHRhYmVsIGRpc3RyaWJ1c2kNCiMgUmVwcmVzZW50YXNpIGRhdGEgc2VzdWFpIHRhYmVsDQpkYXRhX2Rlbmdhbl9vdXRsaWVycyA8LSBjKA0KICByZXAoMjMsIDIpLCAgIyAyMS0yNSwgRnJla3VlbnNpIDINCiAgcmVwKDI4LCA4KSwgICMgMjYtMzAsIEZyZWt1ZW5zaSA4DQogIHJlcCgzMywgOSksICAjIDMxLTM1LCBGcmVrdWVuc2kgOQ0KICByZXAoMzgsIDYpLCAgIyAzNi00MCwgRnJla3VlbnNpIDYNCiAgcmVwKDQzLCAzKSwgICMgNDEtNDUsIEZyZWt1ZW5zaSAzDQogIHJlcCg0OCwgMiksICAjIDQ2LTUwLCBGcmVrdWVuc2kgMg0KICAxMCwgNTUgICAgICAgIyBUYW1iYWhrYW4gb3V0bGllcnMgKDEwIGRhbiA1NSkNCikNCg0KIyBEYXRhIHRhbnBhIG91dGxpZXJzLCBkZW5nYW4gbmlsYWkgbWVhbiB5YW5nIGRpaW5naW5rYW4gMzQNCmRhdGFfdGFucGFfb3V0bGllcnMgPC0gYygNCiAgcmVwKDMwLCAzKSwgICMgMzAgbXVuY3VsIDMga2FsaQ0KICByZXAoMzIsIDMpLCAgIyAzMiBtdW5jdWwgMyBrYWxpDQogIHJlcCgzMywgMyksICAjIDMzIG11bmN1bCAzIGthbGkNCiAgcmVwKDM0LCA0KSwgICMgMzQgbXVuY3VsIDQga2FsaQ0KICByZXAoMzUsIDMpLCAgIyAzNSBtdW5jdWwgMyBrYWxpDQogIHJlcCgzNiwgMykgICAjIDM2IG11bmN1bCAzIGthbGkNCikNCg0KIyBNZW5naGl0dW5nIHJhdGEtcmF0YSB1bnR1ayBrZWR1YSBkYXRhc2V0DQptZWFuX2Rlbmdhbl9vdXRsaWVycyA8LSBtZWFuKGRhdGFfZGVuZ2FuX291dGxpZXJzKQ0KbWVhbl90YW5wYV9vdXRsaWVycyA8LSBtZWFuKGRhdGFfdGFucGFfb3V0bGllcnMpDQoNCiMgTWVuZ2dhYnVuZ2thbiBkYXRhIGtlIGRhbGFtIHNhdHUgZGF0YSBmcmFtZSB1bnR1ayB2aXN1YWxpc2FzaQ0KZGF0YSA8LSBkYXRhLmZyYW1lKA0KICBOaWxhaSA9IGMoZGF0YV9kZW5nYW5fb3V0bGllcnMsIGRhdGFfdGFucGFfb3V0bGllcnMpLA0KICBLZWxvbXBvayA9IHJlcChjKCJEZW5nYW4gT3V0bGllcnMiLCAiVGFucGEgT3V0bGllcnMiKSwgDQogICAgICAgICAgICAgICAgIHRpbWVzID0gYyhsZW5ndGgoZGF0YV9kZW5nYW5fb3V0bGllcnMpLCBsZW5ndGgoZGF0YV90YW5wYV9vdXRsaWVycykpKQ0KKQ0KDQojIE1lbWJ1YXQgYm94cGxvdCBtZW5nZ3VuYWthbiBQbG90bHkgZGVuZ2FuIG91dGxpZXJzIGRpdGFtcGlsa2FuDQpwbG90IDwtIHBsb3RfbHkoDQogIGRhdGEsIA0KICB5ID0gfk5pbGFpLCANCiAgY29sb3IgPSB+S2Vsb21wb2ssIA0KICB0eXBlID0gImJveCIsIA0KICBib3hwb2ludHMgPSAib3V0bGllcnMiICAjIE1lbmFtcGlsa2FuIHRpdGlrIG91dGxpZXJzDQopICU+JQ0KICBsYXlvdXQoDQogICAgdGl0bGUgPSAiUGVuZ2FydWggT3V0bGllcnMgdGVyaGFkYXAgTWVhbiIsDQogICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gIk5pbGFpIiksDQogICAgeGF4aXMgPSBsaXN0KHRpdGxlID0gIktlbG9tcG9rIiksDQogICAgYW5ub3RhdGlvbnMgPSBsaXN0KA0KICAgICAgbGlzdCgNCiAgICAgICAgeCA9ICJEZW5nYW4gT3V0bGllcnMiLA0KICAgICAgICB5ID0gbWVhbl9kZW5nYW5fb3V0bGllcnMsDQogICAgICAgIHRleHQgPSBwYXN0ZSgiTWVhbjoiLCByb3VuZChtZWFuX2Rlbmdhbl9vdXRsaWVycywgMikpLA0KICAgICAgICBzaG93YXJyb3cgPSBUUlVFLA0KICAgICAgICBhcnJvd2hlYWQgPSAyLA0KICAgICAgICBheCA9IDAsICAjIE1lbmVudHVrYW4gcG9zaXNpIHBhbmFoIGhvcml6b250YWwNCiAgICAgICAgYXkgPSAtMzAgICMgTWVuZW50dWthbiBwb3Npc2kgcGFuYWggdmVydGlrYWwNCiAgICAgICksDQogICAgICBsaXN0KA0KICAgICAgICB4ID0gIlRhbnBhIE91dGxpZXJzIiwNCiAgICAgICAgeSA9IG1lYW5fdGFucGFfb3V0bGllcnMsDQogICAgICAgIHRleHQgPSBwYXN0ZSgiTWVhbjoiLCByb3VuZChtZWFuX3RhbnBhX291dGxpZXJzLCAyKSksDQogICAgICAgIHNob3dhcnJvdyA9IFRSVUUsDQogICAgICAgIGFycm93aGVhZCA9IDIsDQogICAgICAgIGF4ID0gMCwgICMgTWVuZW50dWthbiBwb3Npc2kgcGFuYWggaG9yaXpvbnRhbA0KICAgICAgICBheSA9IC0zMCAgIyBNZW5lbnR1a2FuIHBvc2lzaSBwYW5haCB2ZXJ0aWthbA0KICAgICAgKQ0KICAgICkNCiAgKQ0KDQojIE1lbmFtcGlsa2FuIHBsb3QNCnBsb3QNCg0KDQpgYGANCg0KDQojIyBNZWRpYW4gVW50dWsgRGF0YSBLZWxvbXBvaw0KKipNZWRpYW4qKiBhZGFsYWggbmlsYWkgdGVuZ2FoIGRhbGFtIHN1YXR1IGt1bXB1bGFuIGRhdGEgeWFuZyB0ZWxhaCBkaXVydXRrYW4uIEppa2EgZGF0YSB0ZXJkaXJpIGRhcmkganVtbGFoIHlhbmcgZ2FuamlsLCBtZWRpYW4gYWRhbGFoIG5pbGFpIHlhbmcgdGVwYXQgYmVyYWRhIGRpIHRlbmdhaC4gSmlrYSBqdW1sYWggZGF0YSBnZW5hcCwgbWVkaWFuIGRpaGl0dW5nIHNlYmFnYWkgcmF0YS1yYXRhIGRhcmkgZHVhIG5pbGFpIHRlbmdhaCB5YW5nIGJlcnVydXRhbi4NCg0KQWRhcHVuIHJ1bXVzIHVudHVrIG1lbmVudHVrYW4gbWVhbiBwYWRhIGRhdGEga2Vsb21wb2s6DQoNClxbDQpNZSA9IHRiICsgXGxlZnQoIFxmcmFje1xmcmFje259ezJ9IC0gRl9rfXtmX219IFxyaWdodCkgXGNkb3QgcA0KXF0NCg0KKipQZW5qZWxhc2FuOioqDQoNCi0gXCggTWUgXCk6IG1lZGlhbi4NCi0gXCggdGIgXCk6IHRlcGkgYmF3YWgga2VsYXMgbWVkaWFuLg0KLSBcKCBuIFwpOiBqdW1sYWggc2VsdXJ1aCBmcmVrdWVuc2kuDQotIFwoIEZfayBcKTogZnJla3VlbnNpIGt1bXVsYXRpZiBzZWJlbHVtIGtlbGFzIG1lZGlhbi4NCi0gXCggZl9tIFwpOiBmcmVrdWVuc2kga2VsYXMgbWVkaWFuLg0KLSBcKCBwIFwpOiBwYW5qYW5nIGludGVydmFsIGtlbGFzLg0KDQoqKkNvbnRvaDoqKg0KDQp8IE5pbGFpICAgICB8IEZyZWt1ZW5zaSAgICB8ICAgICAgICAgICANCnw6LS0tLS0tLS0tOnw6LS0tLS0tLS0tLS0tOnwNCnwgMjEtMjUgICAgIHwgMiAgICAgICAgICAgIHwgICAgICAgICAgIA0KfCAyNi0zMCAgICAgfCA4ICAgICAgICAgICAgfCAgICAgICAgICAgDQp8IDMxLTM1ICAgICB8IDkgICAgICAgICAgICB8ICAgICAgICAgICANCnwgMzYtNDAgICAgIHwgNiAgICAgICAgICAgIHwgICAgICAgIA0KfCA0MS00NSAgICAgfCAzICAgICAgICAgICAgfCAgDQp8IDQ2LTUwICAgICB8IDIgICAgICAgICAgICB8DQoNCioqTGFuZ2thaCBwZW5nZXJqYWFuOioqDQoNCjEuIE1lbmp1bWxhaGthbiBmcmVrdWVuc2k6IERlbmdhbiBjYXJhIG1lbmp1bWxhaGthbiBrb2xvbSBiYWdpYW4gZnJla3VlbnNpLiBEaWxhbWJhbmdrYW4gZGVuZ2FuIG4NCg0KMi4gTWVuZW50dWthbiBuaWxhaSBmcmVrdWVuc2kga29tdWxhdGlmIFwoIGZfayBcKTogRGVuZ2FuIGNhcmEgdW50dWsgYmFyaXMgcGVydGFtYSBzYWxpbiBzYWphIGtlIHNhbXBpbmcsIGxhbHUgdW50dWsgYW5na2EgZGkgYmF3YWhueWEganVtbGFoa2FuIGRlbmdhbiB5YW5nIGFkYSBkaSBiYXJpcyBrZSBkdWEgZnJla3VlbnNpIGRhbiBzZXRlcnVzbnlhLiANCg0KMy4gTWVuY2FyaSBsZXRhayBrZWxhcyBtZWRpYW4uDQoNCjQuIGxhbHUgbWVuY2FyaSBhbmdrYSB5YW5nIG1lbXVhdCBuaWxhaSBkYXJpIGxldGFrIG1lZGlhbi4NCg0KDQoqKlNlaGluZ2dhIGRpamFiYXJrYW46KioNCg0KfCBOaWxhaSAgICAgfCBGcmVrdWVuc2kgICAgICAgICAgfCBcKCBmX2sgXCkgICAgICAgICAgICAgICAgfCANCnw6LS0tLS0tLS0tOnw6LS0tLS0tLS0tLS0tLS0tLS0tOnw6LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tOnwNCnwgMjEtMjUgICAgIHwgMiAgICAgICAgICAgICAgICAgIHwgMiAgICAgICAgICAgICAgICAgICAgICAgIHwgDQp8IDI2LTMwICAgICB8IDggICAgICAgICAgICAgICAgICB8IDEwICAgICAgICAgICAgICAgICAgICAgICB8DQp8IDMxLTM1ICAgICB8IDkgICAgICAgICAgICAgICAgICB8IDE5ICAgICAgICAgICAgICAgICAgICAgICB8DQp8IDM2LTQwICAgICB8IDYgICAgICAgICAgICAgICAgICB8IDI1ICAgICAgICAgICAgICAgICAgICAgICB8DQp8IDQxLTQ1ICAgICB8IDMgICAgICAgICAgICAgICAgICB8IDI4ICAgICAgICAgICAgICAgICAgICAgICB8DQp8IDQ2LTUwICAgICB8IDIgICAgICAgICAgICAgICAgICB8IDMwICAgICAgICAgICAgICAgICAgICAgICB8DQp8ICAgICAgICAgICB8biA9IDMwICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICB8DQoNCioqQ2FyYSBtZW5lbnR1a2FuIGxldGFrIG1lZGlhbjoqKg0KXFsNClx0ZXh0e0xldGFrfVwgTV9lID0gXGZyYWN7bn17Mn0gPSBcZnJhY3szMH17Mn0gPSAxNQ0KXF0NCg0Kc2V0ZWxhaCBtZW5kYXBhdGthbiBsZXRhayBtZWRpYW4gbGFsdSBsaWhhdCBhbmdrYSB5YW5nIG1lbXVhdCBwYWRhIGxldGFrIG1lZGlhbiB0YWRpIHRlcmhhZGFwIGtvbG9tIHlhbmcgc3VkYWggZGlidWF0Lg0Kc2VoaW5nZ2EgeWFuZyBtZW11YXQgYW5na2EgMTUgeWFpdHUgMTkuIERlbmdhbiBrYXRhIGxhaW4gbmlsYWkgbWVkaWFuIGFkYWxhaCBwYWRhIG5pbGFpIDMxLTM1LCBmcmVrdWVuc2kgOSBkYW4gZnJla3VlbnNpIGtvbXVsYXRpZiAxOS4gDQoNCmxhbHUgY2FyaSBuaWxhaSBtZWRpYW4gZGVuZ2FuIG1lbmdndW5ha2FuIHJ1bXVzOg0KDQpcWw0KTWUgPSB0YiArIFxsZWZ0KCBcZnJhY3tcZnJhY3tufXsyfSAtIEZfa317Zl9tfSBccmlnaHQpIFxjZG90IHANClxdDQoNClxbDQogIE1lID0gMzAsNSArIFxmcmFje1xmcmFjezMwfXsyfSAtIDEwfXs5fSBcY2RvdCA1DQogICBcXQ0KICAgDQpcWw0KICAgTWUgPSAzMCw1ICsgXGZyYWN7MTUgLSAxMH17OX0gXGNkb3QgNQ0KICAgXF0NClxbDQogICAgIE1lID0gMzAsNSArIFxmcmFjezI1fXs5fQ0KICAgXF0NCiBcWw0KICAgTWUgPSAzMCw1ICsgMiw3OCA9IDMzLDI4DQogICBcXQ0KDQpQZW5qZWxhc2FuIHRhbWJhaGFuOiAgDQoNCi0gKioqdGIqKio6IG1lbmdhbWJpbCBuaWxhaSBwYWxpbmcgZGVwYW4gbGFsdSBkaWt1cmFuZyAwLDUgKDMxLTAsNSkuDQoNCi0gKipmayoqOiBmcmVrdWVuc2kga29tdWxhdGlmIHNlYmVsdW0gbWVkaWFuICgxMCkuDQoNCi0gKipmbSoqOiBmcmVrdWVuc2kga2VsYXMgbWVkaWFuICg5KS4NCg0KLSAqKnAqKiA6IHBhbmphbmcga2VsYXMgZGVuZ2FuIG1lbmdhbWJpbCBuaWxhaSBwZXJ0YW1hIHlhaXR1IHBhbmphbmcga2VsYXMgbmlsYWkgMjEtMjUgc2VoaW5nZ2EgcGFuamFuZyBrZWxhc255YSA1Lg0KRGVuZ2FuIGRlbWlraWFuLCAqKk1lYW4qKiBkYXJpIGRhdGEga2Vsb21wb2sgdGVyc2VidXQgYWRhbGFoICoqMzMsMjgqKi4NCg0KYGBge1IsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0UsIG1hc3NhZ2U9RkFMU0V9DQojIE1lbXVhdCBsaWJyYXJ5DQpsaWJyYXJ5KHBsb3RseSkNCg0KIyBEYXRhIGJlcmRhc2Fya2FuIHRhYmVsIGRpc3RyaWJ1c2kNCiMgUmVwcmVzZW50YXNpIGRhdGEgc2VzdWFpIHRhYmVsDQpkYXRhX2Rlbmdhbl9vdXRsaWVycyA8LSBjKA0KICByZXAoMjMsIDIpLCAgIyAyMS0yNSwgRnJla3VlbnNpIDINCiAgcmVwKDI4LCA4KSwgICMgMjYtMzAsIEZyZWt1ZW5zaSA4DQogIHJlcCgzMywgOSksICAjIDMxLTM1LCBGcmVrdWVuc2kgOQ0KICByZXAoMzgsIDYpLCAgIyAzNi00MCwgRnJla3VlbnNpIDYNCiAgcmVwKDQzLCAzKSwgICMgNDEtNDUsIEZyZWt1ZW5zaSAzDQogIHJlcCg0OCwgMiksICAjIDQ2LTUwLCBGcmVrdWVuc2kgMg0KICAxMCwgNTUgICAgICAgIyBUYW1iYWhrYW4gb3V0bGllcnMgKDEwIGRhbiA1NSkNCikNCg0KIyBEYXRhIHRhbnBhIG91dGxpZXJzDQpkYXRhX3RhbnBhX291dGxpZXJzIDwtIGRhdGFfZGVuZ2FuX291dGxpZXJzW2RhdGFfZGVuZ2FuX291dGxpZXJzID4gMjAgJiBkYXRhX2Rlbmdhbl9vdXRsaWVycyA8IDUwXQ0KDQojIE1lbmV0YXBrYW4gbmlsYWkgbWVkaWFuIHNlc3VhaSBzb2FsICgzMywyOCkNCm1lZGlhbl9kZW5nYW5fb3V0bGllcnMgPC0gMzMuMjggICMgTWVuZXRhcGthbiBtZWRpYW4gdW50dWsgZGF0YXNldCBkZW5nYW4gb3V0bGllcnMNCm1lZGlhbl90YW5wYV9vdXRsaWVycyA8LSAzMy4yOCAgICMgTWVuZXRhcGthbiBtZWRpYW4gdW50dWsgZGF0YXNldCB0YW5wYSBvdXRsaWVycw0KDQojIE1lbmdnYWJ1bmdrYW4gZGF0YSBrZSBkYWxhbSBzYXR1IGRhdGEgZnJhbWUgdW50dWsgdmlzdWFsaXNhc2kNCmRhdGEgPC0gZGF0YS5mcmFtZSgNCiAgTmlsYWkgPSBjKGRhdGFfZGVuZ2FuX291dGxpZXJzLCBkYXRhX3RhbnBhX291dGxpZXJzKSwNCiAgS2Vsb21wb2sgPSByZXAoYygiRGVuZ2FuIE91dGxpZXJzIiwgIlRhbnBhIE91dGxpZXJzIiksIA0KICAgICAgICAgICAgICAgICB0aW1lcyA9IGMobGVuZ3RoKGRhdGFfZGVuZ2FuX291dGxpZXJzKSwgbGVuZ3RoKGRhdGFfdGFucGFfb3V0bGllcnMpKSkNCikNCg0KIyBNZW1idWF0IGJveHBsb3QgbWVuZ2d1bmFrYW4gUGxvdGx5IGRlbmdhbiBvdXRsaWVycyBkaXRhbXBpbGthbg0KcGxvdCA8LSBwbG90X2x5KA0KICBkYXRhLCANCiAgeSA9IH5OaWxhaSwgDQogIGNvbG9yID0gfktlbG9tcG9rLCANCiAgdHlwZSA9ICJib3giLCANCiAgYm94cG9pbnRzID0gIm91dGxpZXJzIiAgIyBNZW5hbXBpbGthbiB0aXRpayBvdXRsaWVycw0KKSAlPiUNCiAgbGF5b3V0KA0KICAgIHRpdGxlID0gIlBlbmdhcnVoIE91dGxpZXJzIHRlcmhhZGFwIE1lZGlhbiIsDQogICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gIk5pbGFpIiksDQogICAgeGF4aXMgPSBsaXN0KHRpdGxlID0gIktlbG9tcG9rIiksDQogICAgYW5ub3RhdGlvbnMgPSBsaXN0KA0KICAgICAgbGlzdCgNCiAgICAgICAgeCA9ICJEZW5nYW4gT3V0bGllcnMiLA0KICAgICAgICB5ID0gbWVkaWFuX2Rlbmdhbl9vdXRsaWVycywNCiAgICAgICAgdGV4dCA9IHBhc3RlKCJNZWRpYW46Iiwgcm91bmQobWVkaWFuX2Rlbmdhbl9vdXRsaWVycywgMikpLA0KICAgICAgICBzaG93YXJyb3cgPSBUUlVFLA0KICAgICAgICBhcnJvd2hlYWQgPSAyLA0KICAgICAgICBheCA9IDAsICAjIE1lbmVudHVrYW4gcG9zaXNpIHBhbmFoIGhvcml6b250YWwNCiAgICAgICAgYXkgPSAtMzAgICMgTWVuZW50dWthbiBwb3Npc2kgcGFuYWggdmVydGlrYWwNCiAgICAgICksDQogICAgICBsaXN0KA0KICAgICAgICB4ID0gIlRhbnBhIE91dGxpZXJzIiwNCiAgICAgICAgeSA9IG1lZGlhbl90YW5wYV9vdXRsaWVycywNCiAgICAgICAgdGV4dCA9IHBhc3RlKCJNZWRpYW46Iiwgcm91bmQobWVkaWFuX3RhbnBhX291dGxpZXJzLCAyKSksDQogICAgICAgIHNob3dhcnJvdyA9IFRSVUUsDQogICAgICAgIGFycm93aGVhZCA9IDIsDQogICAgICAgIGF4ID0gMCwgICMgTWVuZW50dWthbiBwb3Npc2kgcGFuYWggaG9yaXpvbnRhbA0KICAgICAgICBheSA9IC0zMCAgIyBNZW5lbnR1a2FuIHBvc2lzaSBwYW5haCB2ZXJ0aWthbA0KICAgICAgKQ0KICAgICkNCiAgKQ0KDQojIE1lbmFtcGlsa2FuIHBsb3QNCnBsb3QNCg0KYGBgDQoNCg0KDQpEZW5nYW4gZGVtaWtpYW4sICoqTWVkaWFuKiogZGFyaSBkYXRhIGtlbG9tcG9rIHRlcnNlYnV0IGFkYWxhaCAqKjMzLDI4KiouDQoNCiMjIE1vZHVzIFVudHVrIERhdGEgS2Vsb21wb2sNCioqTW9kdXMqKiBhZGFsYWggbmlsYWkgeWFuZyBwYWxpbmcgc2VyaW5nIG11bmN1bCBkYWxhbSBzZWJ1YWggZGF0YXNldC4gTW9kdXMgZGlndW5ha2FuIHVudHVrIG1lbmdldGFodWkgbmlsYWkgeWFuZyBwYWxpbmcgZG9taW5hbiBhdGF1IHBhbGluZyBzZXJpbmcgdGVyamFkaSBkYWxhbSBzdWF0dSBrdW1wdWxhbiBkYXRhLiBNb2R1cyBkYXBhdCBkaXRlbXVrYW4gZGFsYW0gZGF0YSBrdWFudGl0YXRpZiBtYXVwdW4ga2F0ZWdvcmlrYWwuDQoNCkFkYXB1biBydW11cyB1bnR1ayBtZW5lbnR1a2FuIG1lZGlhbiBwYWRhIGRhdGEga2Vsb21wb2s6DQoNClxbDQpNbyA9IHRiICsgXGxlZnQoIFxmcmFje2RfMX17ZF8xICsgZF8yfSBccmlnaHQpIFxjZG90IHANClxdDQoNCioqUGVuamVsYXNhbjoqKg0KDQotIFwoIE1vIFwpOiBtb2R1cy4NCg0KLSBcKCB0YiBcKTogdGVwaSBiYXdhaCBrZWxhcyBtb2R1cy4NCg0KLSBcKCBkXzEgXCk6IHNlbGlzaWggZnJla3VlbnNpIGtlbGFzIG1vZHVzIGRlbmdhbiBrZWxhcyBzZWJlbHVtbnlhLg0KDQotIFwoIGRfMiBcKTogc2VsaXNpaCBmcmVrdWVuc2kga2VsYXMgbW9kdXMgZGVuZ2FuIGtlbGFzIHNldGVsYWhueWEuDQoNCi0gXCggcCBcKTogcGFuamFuZyBpbnRlcnZhbCBrZWxhcy4NCg0KDQoqKkNvbnRvaDoqKg0KDQp8IE5pbGFpICAgICB8IEZyZWt1ZW5zaSAgICB8ICAgICAgICAgICANCnw6LS0tLS0tLS0tOnw6LS0tLS0tLS0tLS0tOnwNCnwgMjEtMjUgICAgIHwgMiAgICAgICAgICAgIHwgICAgICAgICAgIA0KfCAyNi0zMCAgICAgfCA4ICAgICAgICAgICAgfCAgICAgICAgICAgDQp8IDMxLTM1ICAgICB8IDkgICAgICAgICAgICB8ICAgICAgICANCnwgMzYtNDAgICAgIHwgNiAgICAgICAgICAgIHwgICAgICAgIA0KfCA0MS00NSAgICAgfCAzICAgICAgICAgICAgfCAgDQp8IDQ2LTUwICAgICB8IDIgICAgICAgICAgICB8DQoNCioqTGFuZ2thaCBwZW5nZXJqYWFuOioqDQoNCjEuIE1lbGloYXQga29sb20gZnJla3VlbnNpIHlhbmcgcGFsaW5nIGJlc2FyIG5pbGFpbnlhDQoNCjIuIE1lbmVudHVrYW4gbmlsYWkgbW9kdXMgDQoNCg0KTWFzdWtrYW4gcnVtdXMgdW50dWsgbWVuZW50dWthbiBuaWxhaSBtb2R1czoNCg0KXFsNCk1vID0gdGIgKyBcbGVmdCggXGZyYWN7ZF8xfXtkXzEgKyBkXzJ9IFxyaWdodCkgXGNkb3QgcA0KXF0NClxbDQogICBNbyA9IDMwLDUgKyBcbGVmdCggXGZyYWN7MX17MSArIDN9IFxyaWdodCkgXGNkb3QgNQ0KICAgXF0NClxbDQogICBNbyA9IDMwLDUgKyBcbGVmdCggXGZyYWN7MX17NH0gXHJpZ2h0KSBcY2RvdCA1DQogICBcXQ0KIFxbDQogICBNbyA9IDMwLDUgKyBcZnJhY3s1fXs0fQ0KICAgXF0NCiAgXFsNCiAgIE1vID0gMzAsNSArIDEsMjUgPSAzMSw3NQ0KICAgXF0NCiAgIA0KICAgDQpQZW5qZWxhc2FuIHRhbWJhaGFuOiAgDQoNCi0gKioqdGIqKio6IG1lbmdhbWJpbCBuaWxhaSBwYWxpbmcgZGVwYW4gcGFkYSBiYWdpYW4ga29sb20gbmlsYWkgZnJla3VlbnNpIHlhbmcgcGFsaW5nIGJlc2FyIG5pbGFpbnlhIGxhbHUgZGlrdXJhbmcgMCw1ICgzMS0wLDUpLg0KDQotICoqZDEqKjogbmlsYWkgZnJla3VlbnNpIHlhbmcgbmlsYWlueWEgbGViaWggYmVzYXIgZGlrdXJhbmdpIGRlbmdhbiBuaWxhaSBmcmVrdWVuc2kgZGlhdGFzbnlhICg5LTgpLg0KDQotICoqZDIqKjogbmlsYWkgZnJla3VlbnNpIHlhbmcgbmlsYWlueWEgbGViaWggYmVzYXIgZGlrdXJhbmdpIGRlbmdhbiBuaWxhaSBmcmVrdWVuc2kgZGlhdGFzbnlhICg5LTYpLg0KDQotICoqcCoqIDogcGFuamFuZyBrZWxhc255YSB5YWl0dSA1Lg0KDQpEZW5nYW4gZGVtaWtpYW4sICoqTW9kdXMqKiBkYXJpIGRhdGEga2Vsb21wb2sgdGVyc2VidXQgYWRhbGFoICoqMzEsNzUqKi4NCg0KYGBge1IsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0UsIG1hc3NhZ2U9RkFMU0V9DQojIE1lbXVhdCBsaWJyYXJ5DQpsaWJyYXJ5KHBsb3RseSkNCg0KIyBEYXRhIGJlcmRhc2Fya2FuIHRhYmVsIGRpc3RyaWJ1c2kNCiMgUmVwcmVzZW50YXNpIGRhdGEgc2VzdWFpIHRhYmVsDQpkYXRhX2Rlbmdhbl9vdXRsaWVycyA8LSBjKA0KICByZXAoMjMsIDIpLCAgIyAyMS0yNSwgRnJla3VlbnNpIDINCiAgcmVwKDI4LCA4KSwgICMgMjYtMzAsIEZyZWt1ZW5zaSA4DQogIHJlcCgzMywgOSksICAjIDMxLTM1LCBGcmVrdWVuc2kgOQ0KICByZXAoMzgsIDYpLCAgIyAzNi00MCwgRnJla3VlbnNpIDYNCiAgcmVwKDQzLCAzKSwgICMgNDEtNDUsIEZyZWt1ZW5zaSAzDQogIHJlcCg0OCwgMiksICAjIDQ2LTUwLCBGcmVrdWVuc2kgMg0KICAxMCwgNTUgICAgICAgIyBUYW1iYWhrYW4gb3V0bGllcnMgKDEwIGRhbiA1NSkNCikNCg0KIyBEYXRhIHRhbnBhIG91dGxpZXJzDQpkYXRhX3RhbnBhX291dGxpZXJzIDwtIGRhdGFfZGVuZ2FuX291dGxpZXJzW2RhdGFfZGVuZ2FuX291dGxpZXJzID4gMjAgJiBkYXRhX2Rlbmdhbl9vdXRsaWVycyA8IDUwXQ0KDQojIE1vZHVzIHlhbmcgc3VkYWggZGloaXR1bmcgc2ViZWx1bW55YSAoMzEsNzUpDQptb2R1c192YWx1ZSA8LSAzMS43NQ0KDQojIE1lbmdnYWJ1bmdrYW4gZGF0YSBrZSBkYWxhbSBzYXR1IGRhdGEgZnJhbWUgdW50dWsgdmlzdWFsaXNhc2kNCmRhdGEgPC0gZGF0YS5mcmFtZSgNCiAgTmlsYWkgPSBjKGRhdGFfZGVuZ2FuX291dGxpZXJzLCBkYXRhX3RhbnBhX291dGxpZXJzKSwNCiAgS2Vsb21wb2sgPSByZXAoYygiRGVuZ2FuIE91dGxpZXJzIiwgIlRhbnBhIE91dGxpZXJzIiksIA0KICAgICAgICAgICAgICAgICB0aW1lcyA9IGMobGVuZ3RoKGRhdGFfZGVuZ2FuX291dGxpZXJzKSwgbGVuZ3RoKGRhdGFfdGFucGFfb3V0bGllcnMpKSkNCikNCg0KIyBNZW1idWF0IGJveHBsb3QgbWVuZ2d1bmFrYW4gUGxvdGx5IGRlbmdhbiBvdXRsaWVycyBkaXRhbXBpbGthbg0KcGxvdCA8LSBwbG90X2x5KA0KICBkYXRhLCANCiAgeSA9IH5OaWxhaSwgDQogIGNvbG9yID0gfktlbG9tcG9rLCANCiAgdHlwZSA9ICJib3giLCANCiAgYm94cG9pbnRzID0gIm91dGxpZXJzIiAgIyBNZW5hbXBpbGthbiB0aXRpayBvdXRsaWVycw0KKSAlPiUNCiAgbGF5b3V0KA0KICAgIHRpdGxlID0gIlBlbmdhcnVoIE91dGxpZXJzIHRlcmhhZGFwIE1vZHVzIiwNCiAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiTmlsYWkiKSwNCiAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiS2Vsb21wb2siKSwNCiAgICBhbm5vdGF0aW9ucyA9IGxpc3QoDQogICAgICBsaXN0KA0KICAgICAgICB4ID0gIkRlbmdhbiBPdXRsaWVycyIsDQogICAgICAgIHkgPSBtb2R1c192YWx1ZSwNCiAgICAgICAgdGV4dCA9IHBhc3RlKCJNb2R1czoiLCByb3VuZChtb2R1c192YWx1ZSwgMikpLA0KICAgICAgICBzaG93YXJyb3cgPSBUUlVFLA0KICAgICAgICBhcnJvd2hlYWQgPSAyLA0KICAgICAgICBheCA9IDAsICAjIE1lbmVudHVrYW4gcG9zaXNpIHBhbmFoDQogICAgICAgIGF5ID0gLTMwICAjIE1lbmVudHVrYW4gcG9zaXNpIHBhbmFoIHZlcnRpa2FsDQogICAgICApLA0KICAgICAgbGlzdCgNCiAgICAgICAgeCA9ICJUYW5wYSBPdXRsaWVycyIsDQogICAgICAgIHkgPSBtb2R1c192YWx1ZSwNCiAgICAgICAgdGV4dCA9IHBhc3RlKCJNb2R1czoiLCByb3VuZChtb2R1c192YWx1ZSwgMikpLA0KICAgICAgICBzaG93YXJyb3cgPSBUUlVFLA0KICAgICAgICBhcnJvd2hlYWQgPSAyLA0KICAgICAgICBheCA9IDAsICAjIE1lbmVudHVrYW4gcG9zaXNpIHBhbmFoDQogICAgICAgIGF5ID0gLTMwICAjIE1lbmVudHVrYW4gcG9zaXNpIHBhbmFoIHZlcnRpa2FsDQogICAgICApDQogICAgKQ0KICApDQoNCiMgTWVuYW1waWxrYW4gcGxvdA0KcGxvdA0KDQoNCmBgYA0KDQoNCiMgUHJha3Rpa3VtIDINCg0KIyMgKipDb250b2ggc2VkZXJoYW5hIGRpIGJpc25pcyoqDQoNCioqTWVhbihSYXRhLXJhdGEpKioNCg0KS2FzdXM6IEFuYWxpc2lzIFJhdGEtUmF0YSBQZW5qdWFsYW4gSGFyaWFuIGRpIFRva28NCg0KUnVtdXMgbWVuZ2hpdHVuZyBtZWFuOg0KDQpNZWFuID0gXChcZnJhY3tcc3VtIFh9e259XCkNCg0KRGkgbWFuYToNCg0KLSBcKCBcc3VtIFggXCkgYWRhbGFoIGp1bWxhaCBkYXJpIHNlbXVhIG5pbGFpIGRhdGEuDQoNCi0gXCggbiBcKSBhZGFsYWgganVtbGFoIGRhdGEuDQoNCkxhbmdrYWgtbGFuZ2thaCB1bnR1ayBtZW5naGl0dW5nIG1lYW46DQoNCjEuIEp1bWxhaGthbiBzZW11YSBuaWxhaSBkYWxhbSBkYXRhLg0KDQoyLiBCYWdpIGhhc2lsIGp1bWxhaCBkZW5nYW4gYmFueWFrbnlhIGRhdGEuDQoNCioqQ29udG9oOioqDQoNCk1pc2Fsa2FuIHNlYnVhaCB0b2tvIGluZ2luIG1lbmdoaXR1bmcgcmF0YS1yYXRhIHBlbmp1YWxhbiBoYXJpYW4gZGFyaSBsaW1hIGhhcmkgdGVyYWtoaXIgdW50dWsgbWVuZ2V0YWh1aSBraW5lcmphIHRva28gZGFsYW0gbWluZ2d1IHRlcnNlYnV0LiBEYXRhIHBlbmp1YWxhbiBoYXJpYW4gdW50dWsgbGltYSBoYXJpIHRlcmFraGlyIGFkYWxhaCBzZWJhZ2FpIGJlcmlrdXQgKGRhbGFtIHNhdHVhbiByaWJ1YW4gcnVwaWFoKToNCg0KSGFyaSAxOiAyMDANCg0KSGFyaSAyOiAzMDANCg0KSGFyaSAzOiAyNTANCg0KSGFyaSA0OiAzNTANCg0KSGFyaSA1OiA0MDAuDQoNCjEuICoqSnVtbGFoa2FuIHNlbXVhIG5pbGFpOioqDQogICBcWw0KICAgMjAwICsgMzAwICsgMjUwICsgMzUwICsgNDAwID0gMS41MDANCiAgIFxdDQoNCjIuICoqQmFnaSBkZW5nYW4ganVtbGFoIGRhdGEgKG4gPSA1KToqKg0KICAgXFsNCiAgIFx0ZXh0e01lYW59ID0gXGZyYWN7MS41MDB9ezV9ID0gMzAwDQogICBcXQ0KDQpKYWRpLCBtZWFuIGRhcmkgZGF0YSB0ZXJzZWJ1dCBhZGFsYWggKiozMDAqKi4NCg0KYGBge1IsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0UsIG1hc3NhZ2U9RkFMU0V9DQojIE1lbXVhdCBsaWJyYXJ5IA0KbGlicmFyeShwbG90bHkpDQoNCiMgRGF0YTogZHVhIHNrZW5hcmlvLCBzYXR1IGRlbmdhbiBvdXRsaWVycywgc2F0dSB0YW5wYSBvdXRsaWVycw0KZGF0YV9kZW5nYW5fb3V0bGllcnMgPC0gYygyMDAsIDMwMCwgMjUwLCAzNTAsIDQwMCwgMTUwMCkgICMgRGVuZ2FuIG91dGxpZXJzICgxNTAwKQ0KZGF0YV90YW5wYV9vdXRsaWVycyA8LSBjKDIwMCwgMzAwLCAyNTAsIDM1MCwgNDAwKSAgICAgICAgICAjIFRhbnBhIG91dGxpZXJzDQoNCiMgTWVuZ2hpdHVuZyByYXRhLXJhdGEgdW50dWsga2VkdWEgZGF0YXNldA0KbWVhbl9kZW5nYW5fb3V0bGllcnMgPC0gbWVhbihkYXRhX2Rlbmdhbl9vdXRsaWVycykNCm1lYW5fdGFucGFfb3V0bGllcnMgPC0gbWVhbihkYXRhX3RhbnBhX291dGxpZXJzKQ0KDQojIE1lbmdnYWJ1bmdrYW4gZGF0YSBrZSBkYWxhbSBzYXR1IGRhdGEgZnJhbWUgdW50dWsgdmlzdWFsaXNhc2kNCmRhdGEgPC0gZGF0YS5mcmFtZSgNCiAgTmlsYWkgPSBjKGRhdGFfZGVuZ2FuX291dGxpZXJzLCBkYXRhX3RhbnBhX291dGxpZXJzKSwNCiAgS2Vsb21wb2sgPSByZXAoYygiRGVuZ2FuIE91dGxpZXJzIiwgIlRhbnBhIE91dGxpZXJzIiksIA0KICAgICAgICAgICAgICAgICB0aW1lcyA9IGMobGVuZ3RoKGRhdGFfZGVuZ2FuX291dGxpZXJzKSwgbGVuZ3RoKGRhdGFfdGFucGFfb3V0bGllcnMpKSkNCikNCg0KIyBNZW1idWF0IGJveHBsb3QgbWVuZ2d1bmFrYW4gUGxvdGx5IGRlbmdhbiBvdXRsaWVycyBkaXRhbXBpbGthbg0KcGxvdCA8LSBwbG90X2x5KA0KICBkYXRhLCANCiAgeSA9IH5OaWxhaSwgDQogIGNvbG9yID0gfktlbG9tcG9rLCANCiAgdHlwZSA9ICJib3giLCANCiAgYm94cG9pbnRzID0gIm91dGxpZXJzIiAgIyBNZW5hbXBpbGthbiB0aXRpayBvdXRsaWVycw0KKSAlPiUgDQogIGxheW91dCgNCiAgICB0aXRsZSA9ICJQZW5nYXJ1aCBPdXRsaWVycyB0ZXJoYWRhcCBNZWFuIiwNCiAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiUGVuanVhbGFuIChSaWJ1IFJ1cGlhaCkiKSwNCiAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiS2Vsb21wb2siKSwNCiAgICBhbm5vdGF0aW9ucyA9IGxpc3QoDQogICAgICBsaXN0KA0KICAgICAgICB4ID0gIkRlbmdhbiBPdXRsaWVycyIsDQogICAgICAgIHkgPSBtZWFuX2Rlbmdhbl9vdXRsaWVycywNCiAgICAgICAgdGV4dCA9IHBhc3RlKCJNZWFuOiIsIHJvdW5kKG1lYW5fZGVuZ2FuX291dGxpZXJzLCAyKSksDQogICAgICAgIHNob3dhcnJvdyA9IFRSVUUsDQogICAgICAgIGFycm93aGVhZCA9IDINCiAgICAgICksDQogICAgICBsaXN0KA0KICAgICAgICB4ID0gIlRhbnBhIE91dGxpZXJzIiwNCiAgICAgICAgeSA9IG1lYW5fdGFucGFfb3V0bGllcnMsDQogICAgICAgIHRleHQgPSBwYXN0ZSgiTWVhbjoiLCByb3VuZChtZWFuX3RhbnBhX291dGxpZXJzLCAyKSksDQogICAgICAgIHNob3dhcnJvdyA9IFRSVUUsDQogICAgICAgIGFycm93aGVhZCA9IDINCiAgICAgICkNCiAgICApDQogICkNCg0KIyBNZW5hbXBpbGthbiBwbG90DQpwbG90DQoNCmBgYA0KDQoNCioqTWVkaWFuKioNCg0KQWRhcHVuIHJ1bXVzIG1lbmdoaXR1bmcgbWVkaWFuIGRlbmdhbiBqdW1sYWggZGF0YSBnYW5qaWw6DQoNClxbDQpcZnJhY3tuICsgMX17Mn0NClxdDQoNCkxhbmdrYWggcGVuZ2VyamFhbjoNCjEuIGRpdXJ1dGthbiBkYXRhIGRhcmkgeWFuZyBrZWNpbC1iZXNhci4NCg0KKipEYXRhIEdhbmppbDoqKg0KMjAwICsgMzAwICsgMjUwICsgMzUwICsgNDAwDQoNCi0gVXJ1dGthbiBkYXRhOg0KMjAwLDI1MCwzMDAsMzUwLDQwMA0KDQotIEp1bWxhaCBkYXRhID0gNSANCihHYW5qaWwpDQoNCi0gUG9zaXNpIG1lZGlhbj0gDQoNClxbDQpcZnJhY3s1ICsgMX17Mn0gPSAzDQpcXQ0KDQotIEphZGksICoqbWVkaWFuKiogYWRhbGFoIG5pbGFpIGtlLTMsIHlhaXR1IDMwMA0KDQpgYGB7UiwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgbWFzc2FnZT1GQUxTRX0NCiMgTWVtdWF0IGxpYnJhcnkNCmxpYnJhcnkocGxvdGx5KQ0KDQojIERhdGE6IGR1YSBza2VuYXJpbywgc2F0dSBkZW5nYW4gb3V0bGllcnMsIHNhdHUgdGFucGEgb3V0bGllcnMNCmRhdGFfZGVuZ2FuX291dGxpZXJzIDwtIGMoMTAwLCAxNTAsIDIwMCwgMjUwLCAzMDAsIDM1MCwgNDAwLCA0NTAsIDUwMCkgICMgRGVuZ2FuIG91dGxpZXJzICg1MDApDQpkYXRhX3RhbnBhX291dGxpZXJzIDwtIGMoMTAwLCAxNTAsIDIwMCwgMjUwLCAzMDAsIDM1MCwgNDAwLCA0NTApICAgICAgICAjIFRhbnBhIG91dGxpZXJzDQoNCiMgTWVtYnVhdCBkZW5zaXR5IHBsb3QgdW50dWsgbWFzaW5nLW1hc2luZyBkYXRhc2V0DQpkZW5zaXR5X2Rlbmdhbl9vdXRsaWVycyA8LSBkZW5zaXR5KGRhdGFfZGVuZ2FuX291dGxpZXJzKQ0KZGVuc2l0eV90YW5wYV9vdXRsaWVycyA8LSBkZW5zaXR5KGRhdGFfdGFucGFfb3V0bGllcnMpDQoNCiMgUGFzdGlrYW4gdGlkYWsgYWRhIG5pbGFpIG5lZ2F0aWYgZGkgeCBkYW4geQ0KZGVuc2l0eV9kZW5nYW5fb3V0bGllcnMkeCA8LSBwbWF4KDAsIGRlbnNpdHlfZGVuZ2FuX291dGxpZXJzJHgpDQpkZW5zaXR5X3RhbnBhX291dGxpZXJzJHggPC0gcG1heCgwLCBkZW5zaXR5X3RhbnBhX291dGxpZXJzJHgpDQoNCiMgTWVuZ2hpdHVuZyByYXRhLXJhdGEgKG1lYW4pIHVudHVrIGtlZHVhIGRhdGFzZXQNCm1lYW5fZGVuZ2FuX291dGxpZXJzIDwtIG1lYW4oZGF0YV9kZW5nYW5fb3V0bGllcnMpDQptZWFuX3RhbnBhX291dGxpZXJzIDwtIG1lYW4oZGF0YV90YW5wYV9vdXRsaWVycykNCg0KIyBNZW5naGl0dW5nIG1lZGlhbiB1bnR1ayBkYXRhIGRlbmdhbiBvdXRsaWVycyAoNTAwKQ0KbWVkaWFuX2Rlbmdhbl9vdXRsaWVycyA8LSBtZWRpYW4oZGF0YV9kZW5nYW5fb3V0bGllcnMpDQoNCiMgTWVtYnVhdCBwbG90IG1lbmdndW5ha2FuIFBsb3RseQ0KcGxvdCA8LSBwbG90X2x5KCkgJT4lDQogICMgTWVuYW1iYWhrYW4gZGVuc2l0eSBwbG90IHVudHVrIGRhdGFzZXQgZGVuZ2FuIG91dGxpZXJzDQogIGFkZF90cmFjZSgNCiAgICB4ID0gfmRlbnNpdHlfZGVuZ2FuX291dGxpZXJzJHgsDQogICAgeSA9IH5kZW5zaXR5X2Rlbmdhbl9vdXRsaWVycyR5LA0KICAgIHR5cGUgPSAnc2NhdHRlcicsDQogICAgbW9kZSA9ICdsaW5lcycsDQogICAgbmFtZSA9ICJEZW5nYW4gT3V0bGllcnMiLA0KICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gJ3JnYmEoMjIyLCA0NSwgMzgsIDAuOCknLCB3aWR0aCA9IDIpDQogICkgJT4lDQogICMgTWVuYW1iYWhrYW4gZGVuc2l0eSBwbG90IHVudHVrIGRhdGFzZXQgdGFucGEgb3V0bGllcnMNCiAgYWRkX3RyYWNlKA0KICAgIHggPSB+ZGVuc2l0eV90YW5wYV9vdXRsaWVycyR4LA0KICAgIHkgPSB+ZGVuc2l0eV90YW5wYV9vdXRsaWVycyR5LA0KICAgIHR5cGUgPSAnc2NhdHRlcicsDQogICAgbW9kZSA9ICdsaW5lcycsDQogICAgbmFtZSA9ICJUYW5wYSBPdXRsaWVycyIsDQogICAgbGluZSA9IGxpc3QoY29sb3IgPSAncmdiYSgzOCwgMTY2LCA5MSwgMC44KScsIHdpZHRoID0gMikNCiAgKSAlPiUNCiAgIyBNZW5hbWJhaGthbiBnYXJpcyBtZWRpYW4gdW50dWsgZGF0YXNldCBkZW5nYW4gb3V0bGllcnMNCiAgYWRkX3RyYWNlKA0KICAgIHggPSBjKG1lZGlhbl9kZW5nYW5fb3V0bGllcnMsIG1lZGlhbl9kZW5nYW5fb3V0bGllcnMpLA0KICAgIHkgPSBjKDAsIG1heChkZW5zaXR5X2Rlbmdhbl9vdXRsaWVycyR5KSksDQogICAgdHlwZSA9ICJzY2F0dGVyIiwNCiAgICBtb2RlID0gImxpbmVzIiwNCiAgICBuYW1lID0gIk1lZGlhbiAoRGVuZ2FuIE91dGxpZXJzKSIsDQogICAgbGluZSA9IGxpc3QoY29sb3IgPSAncmdiYSgzOCwgMTY2LCA5MSwgMC42KScsIGRhc2ggPSAnZG90JykNCiAgKSAlPiUNCiAgbGF5b3V0KA0KICAgIHRpdGxlID0gIlBlbmdhcnVoIE91dGxpZXJzIHRlcmhhZGFwIE1lZGlhbiBwYWRhIERlbnNpdHkgUGxvdCIsDQogICAgeGF4aXMgPSBsaXN0KHRpdGxlID0gIk5pbGFpIiksDQogICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gIktlcGFkYXRhbiIpLA0KICAgIGFubm90YXRpb25zID0gbGlzdCgNCiAgICAgICMgQW5vdGFzaSB1bnR1ayBtZWRpYW4gZGF0YXNldCBkZW5nYW4gb3V0bGllcnMNCiAgICAgIGxpc3QoDQogICAgICAgIHggPSBtZWRpYW5fZGVuZ2FuX291dGxpZXJzLA0KICAgICAgICB5ID0gbWF4KGRlbnNpdHlfZGVuZ2FuX291dGxpZXJzJHkpICogMC45LA0KICAgICAgICB0ZXh0ID0gcGFzdGUoIk1lZGlhbjoiLCBtZWRpYW5fZGVuZ2FuX291dGxpZXJzKSwNCiAgICAgICAgc2hvd2Fycm93ID0gVFJVRSwNCiAgICAgICAgYXJyb3doZWFkID0gMiwNCiAgICAgICAgYXggPSAwLA0KICAgICAgICBheSA9IC00NSwgICMgUG9zaXNpIHRla3Mgc2VkaWtpdCBsZWJpaCB0aW5nZ2kgZGFyaSBnYXJpcw0KICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICdyZ2JhKDM4LCAxNjYsIDkxLCAwLjYpJywgc2l6ZSA9IDEyKQ0KICAgICAgKQ0KICAgICkNCiAgKQ0KDQojIE1lbmFtcGlsa2FuIHBsb3QNCnBsb3QNCg0KDQoNCg0KYGBgDQoNCg0KKipNb2R1cyoqDQoNCioqQ29udG9oOioqDQoNCk1pc2Fsa2FuIEFuZGEgbWVtaWxpa2kgZGF0YSBwZW5qdWFsYW4gcHJvZHVrIGRhbGFtIDggaGFyaSBiZXJ0dXJ1dC10dXJ1dCBzZXBlcnRpIGJlcmlrdXQ6DQoNCjEwMCwyMDAsNDAwLDIwMCw1MDAsMzAwLDEwMCwyMDANCg0KKipMYW5na2FoLWxhbmdrYWggdW50dWsgbWVuZ2hpdHVuZyBtb2R1czoqKg0KDQoxLiBJZGVudGlmaWthc2kgYW5na2EgeWFuZyBwYWxpbmcgc2VyaW5nIG11bmN1bCBkYWxhbSBkYXRhIHBlbmp1YWxhbi4NCg0KUGVuanVhbGFuIDEwMCBtdW5jdWwgMiBrYWxpLg0KUGVuanVhbGFuIDIwMCBtdW5jdWwgMyBrYWxpLg0KUGVuanVhbGFuIDMwMCwgNDAwLCBkYW4gNTAwIG1hc2luZy1tYXNpbmcgbXVuY3VsIDEga2FsaS4NCg0KMi4gVGVudHVrYW4gbW9kdXMgKG5pbGFpIHlhbmcgcGFsaW5nIHNlcmluZyBtdW5jdWwpOg0KDQpLYXJlbmEgMTAwIG11bmN1bCBwYWxpbmcgc2VyaW5nICgzIGthbGkpLCBtYWthICoqbW9kdXMqKiBkYXJpIGRhdGEgaW5pIGFkYWxhaCAyMDAuDQoNCg0KDQpgYGB7UiwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgbWFzc2FnZT1GQUxTRX0NCiMgTWVtdWF0IGxpYnJhcnkNCmxpYnJhcnkocGxvdGx5KQ0KDQojIERhdGE6IGR1YSBza2VuYXJpbywgc2F0dSBkZW5nYW4gb3V0bGllcnMsIHNhdHUgdGFucGEgb3V0bGllcnMNCmRhdGFfZGVuZ2FuX291dGxpZXJzIDwtIGMoMTAwLCAyMDAsIDQwMCwgMjAwLCA1MDAsIDMwMCwgMTAwLCAyMDApICAjIERlbmdhbiBvdXRsaWVycw0KZGF0YV90YW5wYV9vdXRsaWVycyA8LSBjKDEwMCwgMjAwLCAyMDAsIDMwMCwgMTAwLCAyMDAsIDEwMCwgMjAwKSAgICAjIFRhbnBhIG91dGxpZXJzDQoNCiMgRnVuZ3NpIHVudHVrIG1lbmdoaXR1bmcgbW9kdXMNCm1vZHVzIDwtIGZ1bmN0aW9uKHgpIHsNCiAgdW5pcV94IDwtIHVuaXF1ZSh4KQ0KICB0YWIgPC0gdGFidWxhdGUobWF0Y2goeCwgdW5pcV94KSkNCiAgdW5pcV94W3RhYiA9PSBtYXgodGFiKV0NCn0NCg0KIyBNZW5naGl0dW5nIG1vZHVzIHVudHVrIGtlZHVhIGRhdGFzZXQNCm1vZHVzX2Rlbmdhbl9vdXRsaWVycyA8LSBtb2R1cyhkYXRhX2Rlbmdhbl9vdXRsaWVycykNCm1vZHVzX3RhbnBhX291dGxpZXJzIDwtIG1vZHVzKGRhdGFfdGFucGFfb3V0bGllcnMpDQoNCiMgTWVtYnVhdCBkZW5zaXR5IHBsb3QgdW50dWsgbWFzaW5nLW1hc2luZyBkYXRhc2V0DQpkZW5zaXR5X2Rlbmdhbl9vdXRsaWVycyA8LSBkZW5zaXR5KGRhdGFfZGVuZ2FuX291dGxpZXJzKQ0KZGVuc2l0eV90YW5wYV9vdXRsaWVycyA8LSBkZW5zaXR5KGRhdGFfdGFucGFfb3V0bGllcnMpDQoNCiMgUGFzdGlrYW4gdGlkYWsgYWRhIG5pbGFpIG5lZ2F0aWYgZGkgeCBkYW4geQ0KZGVuc2l0eV9kZW5nYW5fb3V0bGllcnMkeCA8LSBwbWF4KDAsIGRlbnNpdHlfZGVuZ2FuX291dGxpZXJzJHgpDQpkZW5zaXR5X3RhbnBhX291dGxpZXJzJHggPC0gcG1heCgwLCBkZW5zaXR5X3RhbnBhX291dGxpZXJzJHgpDQoNCiMgTWVtYnVhdCBwbG90IG1lbmdndW5ha2FuIFBsb3RseQ0KcGxvdCA8LSBwbG90X2x5KCkgJT4lDQogICMgTWVuYW1iYWhrYW4gZGVuc2l0eSBwbG90IHVudHVrIGRhdGFzZXQgZGVuZ2FuIG91dGxpZXJzDQogIGFkZF90cmFjZSgNCiAgICB4ID0gfmRlbnNpdHlfZGVuZ2FuX291dGxpZXJzJHgsDQogICAgeSA9IH5kZW5zaXR5X2Rlbmdhbl9vdXRsaWVycyR5LA0KICAgIHR5cGUgPSAnc2NhdHRlcicsDQogICAgbW9kZSA9ICdsaW5lcycsDQogICAgbmFtZSA9ICJEZW5nYW4gT3V0bGllcnMiLA0KICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gJ3JnYmEoMjIyLCA0NSwgMzgsIDAuOCknLCB3aWR0aCA9IDIpDQogICkgJT4lDQogICMgTWVuYW1iYWhrYW4gZGVuc2l0eSBwbG90IHVudHVrIGRhdGFzZXQgdGFucGEgb3V0bGllcnMNCiAgYWRkX3RyYWNlKA0KICAgIHggPSB+ZGVuc2l0eV90YW5wYV9vdXRsaWVycyR4LA0KICAgIHkgPSB+ZGVuc2l0eV90YW5wYV9vdXRsaWVycyR5LA0KICAgIHR5cGUgPSAnc2NhdHRlcicsDQogICAgbW9kZSA9ICdsaW5lcycsDQogICAgbmFtZSA9ICJUYW5wYSBPdXRsaWVycyIsDQogICAgbGluZSA9IGxpc3QoY29sb3IgPSAncmdiYSgzOCwgMTY2LCA5MSwgMC44KScsIHdpZHRoID0gMikNCiAgKSAlPiUNCiAgIyBNZW5hbWJhaGthbiBnYXJpcyBtb2R1cyB1bnR1ayBkYXRhc2V0IGRlbmdhbiBvdXRsaWVycw0KICBhZGRfdHJhY2UoDQogICAgeCA9IGMobW9kdXNfZGVuZ2FuX291dGxpZXJzLCBtb2R1c19kZW5nYW5fb3V0bGllcnMpLA0KICAgIHkgPSBjKDAsIG1heChkZW5zaXR5X2Rlbmdhbl9vdXRsaWVycyR5KSksDQogICAgdHlwZSA9ICJzY2F0dGVyIiwNCiAgICBtb2RlID0gImxpbmVzIiwNCiAgICBuYW1lID0gIk1vZHVzIChEZW5nYW4gT3V0bGllcnMpIiwNCiAgICBsaW5lID0gbGlzdChjb2xvciA9ICdyZ2JhKDIyMiwgNDUsIDM4LCAwLjYpJywgZGFzaCA9ICdkYXNoJykNCiAgKSAlPiUNCiAgIyBNZW5hbWJhaGthbiBnYXJpcyBtb2R1cyB1bnR1ayBkYXRhc2V0IHRhbnBhIG91dGxpZXJzDQogIGFkZF90cmFjZSgNCiAgICB4ID0gYyhtb2R1c190YW5wYV9vdXRsaWVycywgbW9kdXNfdGFucGFfb3V0bGllcnMpLA0KICAgIHkgPSBjKDAsIG1heChkZW5zaXR5X3RhbnBhX291dGxpZXJzJHkpKSwNCiAgICB0eXBlID0gInNjYXR0ZXIiLA0KICAgIG1vZGUgPSAibGluZXMiLA0KICAgIG5hbWUgPSAiTW9kdXMgKFRhbnBhIE91dGxpZXJzKSIsDQogICAgbGluZSA9IGxpc3QoY29sb3IgPSAncmdiYSgzOCwgMTY2LCA5MSwgMC42KScsIGRhc2ggPSAnZGFzaCcpDQogICkgJT4lDQogIGxheW91dCgNCiAgICB0aXRsZSA9ICJQZW5nYXJ1aCBPdXRsaWVycyB0ZXJoYWRhcCBNb2R1cyBwYWRhIERlbnNpdHkgUGxvdCIsDQogICAgeGF4aXMgPSBsaXN0KHRpdGxlID0gIlBlbmp1YWxhbiBQcm9kdWsgKFVuaXQpIiksDQogICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gIktlcGFkYXRhbiIpLA0KICAgIGFubm90YXRpb25zID0gbGlzdCgNCiAgICAgICMgQW5vdGFzaSB1bnR1ayBtb2R1cyBkYXRhc2V0IGRlbmdhbiBvdXRsaWVycw0KICAgICAgbGlzdCgNCiAgICAgICAgeCA9IG1vZHVzX2Rlbmdhbl9vdXRsaWVycywNCiAgICAgICAgeSA9IG1heChkZW5zaXR5X2Rlbmdhbl9vdXRsaWVycyR5KSAqIDAuOSwNCiAgICAgICAgdGV4dCA9IHBhc3RlKCJNb2R1czoiLCBtb2R1c19kZW5nYW5fb3V0bGllcnMpLA0KICAgICAgICBzaG93YXJyb3cgPSBUUlVFLA0KICAgICAgICBhcnJvd2hlYWQgPSAyLA0KICAgICAgICBheCA9IDAsDQogICAgICAgIGF5ID0gLTMwLCAgIyBQb3Npc2kgdGVrcyBzZWRpa2l0IGxlYmloIHRpbmdnaSBkYXJpIGdhcmlzDQogICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gJ3JnYmEoMjIyLCA0NSwgMzgsIDAuOCknLCBzaXplID0gMTIpDQogICAgICApLA0KICAgICAgIyBBbm90YXNpIHVudHVrIG1vZHVzIGRhdGFzZXQgdGFucGEgb3V0bGllcnMNCiAgICAgIGxpc3QoDQogICAgICAgIHggPSBtb2R1c190YW5wYV9vdXRsaWVycywNCiAgICAgICAgeSA9IG1heChkZW5zaXR5X3RhbnBhX291dGxpZXJzJHkpICogMC45LA0KICAgICAgICB0ZXh0ID0gcGFzdGUoIk1vZHVzOiIsIG1vZHVzX3RhbnBhX291dGxpZXJzKSwNCiAgICAgICAgc2hvd2Fycm93ID0gVFJVRSwNCiAgICAgICAgYXJyb3doZWFkID0gMiwNCiAgICAgICAgYXggPSAwLA0KICAgICAgICBheSA9IC00NSwgICMgUG9zaXNpIHRla3Mgc2VkaWtpdCBsZWJpaCB0aW5nZ2kgZGFyaSBnYXJpcw0KICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICdyZ2JhKDM4LCAxNjYsIDkxLCAwLjgpJywgc2l6ZSA9IDEyKQ0KICAgICAgKQ0KICAgICkNCiAgKQ0KDQojIE1lbmFtcGlsa2FuIHBsb3QNCnBsb3QNCg0KDQpgYGANCg0KIyMgKipDb250b2ggc2VkZXJoYW5hIGRpIGtlc2VoYXRhbioqDQoNCioqTWVhbihSYXRhLXJhdGEpKioNCg0KS2FzdXM6IEFuYWxpc2lzIFJhdGEtUmF0YSBQZW5qdWFsYW4gSGFyaWFuIGRpIFRva28NCg0KUnVtdXMgbWVuZ2hpdHVuZyBtZWFuOg0KDQpNZWFuID0gXChcZnJhY3tcc3VtIFh9e259XCkNCg0KRGkgbWFuYToNCg0KLSBcKCBcc3VtIFggXCkgYWRhbGFoIGp1bWxhaCBkYXJpIHNlbXVhIG5pbGFpIGRhdGEuDQoNCi0gXCggbiBcKSBhZGFsYWgganVtbGFoIGRhdGEuDQoNCkxhbmdrYWgtbGFuZ2thaCB1bnR1ayBtZW5naGl0dW5nIG1lYW46DQoNCjEuIEp1bWxhaGthbiBzZW11YSBuaWxhaSBkYWxhbSBkYXRhLg0KDQoyLiBCYWdpIGhhc2lsIGp1bWxhaCBkZW5nYW4gYmFueWFrbnlhIGRhdGEuDQoNCioqQ29udG9oOioqDQoNCk1pc2Fsa2FuIGtpdGEgbWVtaWxpa2kgZGF0YSB0ZWthbmFuIGRhcmFoIHNpc3RvbGlrIGRhcmkgNSBwYXNpZW46DQoNCkRhdGEgdGVrYW5hbiBkYXJhaCBzaXN0b2xpayAobW1IZyk6DQoxMjAsIDEzMCwgMTI1LCAxMjgsIDEzNQ0KDQoxLiAqKkp1bWxhaGthbiBzZW11YSBuaWxhaToqKg0KICAgXFsNCiAgIDEyMCArIDEzMCArIDEyNSArIDEyOCArIDEzNSA9IDYzOA0KICAgXF0NCg0KMi4gKipCYWdpIGRlbmdhbiBqdW1sYWggZGF0YSAobiA9IDUpOioqDQogICBcWw0KICAgXHRleHR7TWVhbn0gPSBcZnJhY3s2Mzh9ezV9ID0gMTI3LDYNCiAgIFxdDQoNCkphZGksIG1lYW4gZGFyaSBkYXRhIHRlcnNlYnV0IGFkYWxhaCAqKjEyNyw2KiouDQoNCmBgYHtSLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBtYXNzYWdlPUZBTFNFfQ0KIyBNZW11YXQgbGlicmFyeQ0KbGlicmFyeShwbG90bHkpDQoNCiMgRGF0YTogZHVhIHNrZW5hcmlvLCBzYXR1IGRlbmdhbiBvdXRsaWVycywgc2F0dSB0YW5wYSBvdXRsaWVycw0KZGF0YV9kZW5nYW5fb3V0bGllcnMgPC0gYygxMjAsIDEzMCwgMTI1LCAxMjgsIDEzNSwgMjAwKSAgIyBEZW5nYW4gb3V0bGllcnMgKDIwMCBtbUhnKQ0KZGF0YV90YW5wYV9vdXRsaWVycyA8LSBjKDEyMCwgMTMwLCAxMjUsIDEyOCwgMTM1KSAgICAgICAgICMgVGFucGEgb3V0bGllcnMNCg0KIyBNZW5naGl0dW5nIHJhdGEtcmF0YSB1bnR1ayBrZWR1YSBkYXRhc2V0DQptZWFuX2Rlbmdhbl9vdXRsaWVycyA8LSBtZWFuKGRhdGFfZGVuZ2FuX291dGxpZXJzKQ0KbWVhbl90YW5wYV9vdXRsaWVycyA8LSBtZWFuKGRhdGFfdGFucGFfb3V0bGllcnMpDQoNCiMgTWVuZ2dhYnVuZ2thbiBkYXRhIGtlIGRhbGFtIHNhdHUgZGF0YSBmcmFtZSB1bnR1ayB2aXN1YWxpc2FzaQ0KZGF0YSA8LSBkYXRhLmZyYW1lKA0KICBOaWxhaSA9IGMoZGF0YV9kZW5nYW5fb3V0bGllcnMsIGRhdGFfdGFucGFfb3V0bGllcnMpLA0KICBLZWxvbXBvayA9IHJlcChjKCJEZW5nYW4gT3V0bGllcnMiLCAiVGFucGEgT3V0bGllcnMiKSwgDQogICAgICAgICAgICAgICAgIHRpbWVzID0gYyhsZW5ndGgoZGF0YV9kZW5nYW5fb3V0bGllcnMpLCBsZW5ndGgoZGF0YV90YW5wYV9vdXRsaWVycykpKQ0KKQ0KDQojIE1lbWJ1YXQgYm94cGxvdCBtZW5nZ3VuYWthbiBQbG90bHkgZGVuZ2FuIG91dGxpZXJzIGRpdGFtcGlsa2FuDQpwbG90IDwtIHBsb3RfbHkoDQogIGRhdGEsIA0KICB5ID0gfk5pbGFpLCANCiAgY29sb3IgPSB+S2Vsb21wb2ssIA0KICB0eXBlID0gImJveCIsIA0KICBib3hwb2ludHMgPSAib3V0bGllcnMiICAjIE1lbmFtcGlsa2FuIHRpdGlrIG91dGxpZXJzDQopICU+JSANCiAgbGF5b3V0KA0KICAgIHRpdGxlID0gIlBlbmdhcnVoIE91dGxpZXJzIHRlcmhhZGFwIE1lYW4gVGVrYW5hbiBEYXJhaCBTaXN0b2xpayIsDQogICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gIlRla2FuYW4gRGFyYWggKG1tSGcpIiksDQogICAgeGF4aXMgPSBsaXN0KHRpdGxlID0gIktlbG9tcG9rIiksDQogICAgYW5ub3RhdGlvbnMgPSBsaXN0KA0KICAgICAgbGlzdCgNCiAgICAgICAgeCA9ICJEZW5nYW4gT3V0bGllcnMiLA0KICAgICAgICB5ID0gbWVhbl9kZW5nYW5fb3V0bGllcnMsDQogICAgICAgIHRleHQgPSBwYXN0ZSgiTWVhbjoiLCByb3VuZChtZWFuX2Rlbmdhbl9vdXRsaWVycywgMikpLA0KICAgICAgICBzaG93YXJyb3cgPSBUUlVFLA0KICAgICAgICBhcnJvd2hlYWQgPSAyDQogICAgICApLA0KICAgICAgbGlzdCgNCiAgICAgICAgeCA9ICJUYW5wYSBPdXRsaWVycyIsDQogICAgICAgIHkgPSBtZWFuX3RhbnBhX291dGxpZXJzLA0KICAgICAgICB0ZXh0ID0gcGFzdGUoIk1lYW46Iiwgcm91bmQobWVhbl90YW5wYV9vdXRsaWVycywgMikpLA0KICAgICAgICBzaG93YXJyb3cgPSBUUlVFLA0KICAgICAgICBhcnJvd2hlYWQgPSAyDQogICAgICApDQogICAgKQ0KICApDQoNCiMgTWVuYW1waWxrYW4gcGxvdA0KcGxvdA0KDQpgYGANCg0KDQoqKk1lZGlhbioqDQoNCkFkYXB1biBydW11cyBtZW5naGl0dW5nIG1lZGlhbiBkZW5nYW4ganVtbGFoIGRhdGEgZ2FuamlsOg0KDQpcWw0KXGZyYWN7biArIDF9ezJ9DQpcXQ0KDQpMYW5na2FoIHBlbmdlcmphYW46DQoxLiBkaXVydXRrYW4gZGF0YSBkYXJpIHlhbmcga2VjaWwtYmVzYXIuDQoNCioqRGF0YSBHYW5qaWw6KioNCjEyMCwgMTMwLCAxMjUsIDEyOCwgMTM1DQoNCi0gVXJ1dGthbiBkYXRhOg0KMTIwLDEyNSwxMjgsMTMwLDEzNQ0KDQotIEp1bWxhaCBkYXRhID0gNSANCihHYW5qaWwpDQoNCi0gUG9zaXNpIG1lZGlhbj0gDQoNClxbDQpcZnJhY3s1ICsgMX17Mn0gPSAzDQpcXQ0KDQotIEphZGksICoqbWVkaWFuKiogYWRhbGFoIG5pbGFpIGtlLTMsIHlhaXR1IDEyOA0KDQpgYGB7UiwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgbWFzc2FnZT1GQUxTRX0NCiMgTWVtdWF0IGxpYnJhcnkNCiMgTWVtdWF0IGxpYnJhcnkNCmxpYnJhcnkocGxvdGx5KQ0KDQojIERhdGE6IHNhdHUgZGVuZ2FuIG91dGxpZXJzLCBzYXR1IHRhbnBhIG91dGxpZXJzDQpkYXRhX2Rlbmdhbl9vdXRsaWVycyA8LSBjKDEyMCwgMTMwLCAxMjUsIDEyOCwgMTM1LCAyMDApICAjIERlbmdhbiBvdXRsaWVyICgyMDApDQpkYXRhX3RhbnBhX291dGxpZXJzIDwtIGMoMTIwLCAxMzAsIDEyNSwgMTI4LCAxMzUpICAgICAgICAgIyBUYW5wYSBvdXRsaWVyDQoNCiMgRnVuZ3NpIHVudHVrIG1lbmdoaXR1bmcgbWVkaWFuDQptZWRpYW5fZnVuYyA8LSBmdW5jdGlvbih4KSB7DQogIHNvcnRlZF94IDwtIHNvcnQoeCkgICMgVXJ1dGthbiBkYXRhDQogIG4gPC0gbGVuZ3RoKHNvcnRlZF94KQ0KICAjIEppa2EganVtbGFoIGRhdGEgZ2FuamlsLCBtZWRpYW4gYWRhbGFoIG5pbGFpIGRpIHRlbmdhaA0KICBtZWRpYW4gPC0gc29ydGVkX3hbKG4gKyAxKSAvIDJdICAjIFBvc2lzaSBtZWRpYW4gc2VzdWFpIHJ1bXVzDQogIHJldHVybihtZWRpYW4pDQp9DQoNCiMgTWVuZ2hpdHVuZyBtZWRpYW4gdW50dWsga2VkdWEgZGF0YXNldA0KbWVkaWFuX2Rlbmdhbl9vdXRsaWVycyA8LSBtZWRpYW5fZnVuYyhkYXRhX2Rlbmdhbl9vdXRsaWVycykNCm1lZGlhbl90YW5wYV9vdXRsaWVycyA8LSBtZWRpYW5fZnVuYyhkYXRhX3RhbnBhX291dGxpZXJzKQ0KDQojIE1lbWJ1YXQgZGVuc2l0eSBwbG90IHVudHVrIG1hc2luZy1tYXNpbmcgZGF0YXNldA0KZGVuc2l0eV9kZW5nYW5fb3V0bGllcnMgPC0gZGVuc2l0eShkYXRhX2Rlbmdhbl9vdXRsaWVycykNCmRlbnNpdHlfdGFucGFfb3V0bGllcnMgPC0gZGVuc2l0eShkYXRhX3RhbnBhX291dGxpZXJzKQ0KDQojIFBhc3Rpa2FuIHRpZGFrIGFkYSBuaWxhaSBuZWdhdGlmIGRpIHggZGFuIHkNCmRlbnNpdHlfZGVuZ2FuX291dGxpZXJzJHggPC0gcG1heCgwLCBkZW5zaXR5X2Rlbmdhbl9vdXRsaWVycyR4KQ0KZGVuc2l0eV90YW5wYV9vdXRsaWVycyR4IDwtIHBtYXgoMCwgZGVuc2l0eV90YW5wYV9vdXRsaWVycyR4KQ0KDQojIE1lbWJ1YXQgcGxvdCBtZW5nZ3VuYWthbiBQbG90bHkNCnBsb3QgPC0gcGxvdF9seSgpICU+JQ0KICAjIE1lbmFtYmFoa2FuIGRlbnNpdHkgcGxvdCB1bnR1ayBkYXRhc2V0IGRlbmdhbiBvdXRsaWVycw0KICBhZGRfdHJhY2UoDQogICAgeCA9IH5kZW5zaXR5X2Rlbmdhbl9vdXRsaWVycyR4LA0KICAgIHkgPSB+ZGVuc2l0eV9kZW5nYW5fb3V0bGllcnMkeSwNCiAgICB0eXBlID0gJ3NjYXR0ZXInLA0KICAgIG1vZGUgPSAnbGluZXMnLA0KICAgIG5hbWUgPSAiRGVuZ2FuIE91dGxpZXJzIiwNCiAgICBsaW5lID0gbGlzdChjb2xvciA9ICdyZ2JhKDIyMiwgNDUsIDM4LCAwLjgpJywgd2lkdGggPSAyKQ0KICApICU+JQ0KICAjIE1lbmFtYmFoa2FuIGRlbnNpdHkgcGxvdCB1bnR1ayBkYXRhc2V0IHRhbnBhIG91dGxpZXJzDQogIGFkZF90cmFjZSgNCiAgICB4ID0gfmRlbnNpdHlfdGFucGFfb3V0bGllcnMkeCwNCiAgICB5ID0gfmRlbnNpdHlfdGFucGFfb3V0bGllcnMkeSwNCiAgICB0eXBlID0gJ3NjYXR0ZXInLA0KICAgIG1vZGUgPSAnbGluZXMnLA0KICAgIG5hbWUgPSAiVGFucGEgT3V0bGllcnMiLA0KICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gJ3JnYmEoMzgsIDE2NiwgOTEsIDAuOCknLCB3aWR0aCA9IDIpDQogICkgJT4lDQogICMgTWVuYW1iYWhrYW4gZ2FyaXMgbWVkaWFuIHVudHVrIGRhdGFzZXQgZGVuZ2FuIG91dGxpZXJzDQogIGFkZF90cmFjZSgNCiAgICB4ID0gYyhtZWRpYW5fZGVuZ2FuX291dGxpZXJzLCBtZWRpYW5fZGVuZ2FuX291dGxpZXJzKSwNCiAgICB5ID0gYygwLCBtYXgoZGVuc2l0eV9kZW5nYW5fb3V0bGllcnMkeSkpLA0KICAgIHR5cGUgPSAic2NhdHRlciIsDQogICAgbW9kZSA9ICJsaW5lcyIsDQogICAgbmFtZSA9ICJNZWRpYW4gKERlbmdhbiBPdXRsaWVycykiLA0KICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gJ3JnYmEoMjIyLCA0NSwgMzgsIDAuNiknLCBkYXNoID0gJ2RvdCcpDQogICkgJT4lDQogICMgTWVuYW1iYWhrYW4gZ2FyaXMgbWVkaWFuIHVudHVrIGRhdGFzZXQgdGFucGEgb3V0bGllcnMNCiAgYWRkX3RyYWNlKA0KICAgIHggPSBjKG1lZGlhbl90YW5wYV9vdXRsaWVycywgbWVkaWFuX3RhbnBhX291dGxpZXJzKSwNCiAgICB5ID0gYygwLCBtYXgoZGVuc2l0eV90YW5wYV9vdXRsaWVycyR5KSksDQogICAgdHlwZSA9ICJzY2F0dGVyIiwNCiAgICBtb2RlID0gImxpbmVzIiwNCiAgICBuYW1lID0gIk1lZGlhbiAoVGFucGEgT3V0bGllcnMpIiwNCiAgICBsaW5lID0gbGlzdChjb2xvciA9ICdyZ2JhKDM4LCAxNjYsIDkxLCAwLjYpJywgZGFzaCA9ICdkb3QnKQ0KICApICU+JQ0KICBsYXlvdXQoDQogICAgdGl0bGUgPSAiUGVuZ2FydWggT3V0bGllcnMgdGVyaGFkYXAgTWVkaWFuIHBhZGEgRGVuc2l0eSBQbG90IiwNCiAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiTmlsYWkgRGF0YSIpLA0KICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICJLZXBhZGF0YW4iKSwNCiAgICBhbm5vdGF0aW9ucyA9IGxpc3QoDQogICAgICAjIEFub3Rhc2kgdW50dWsgbWVkaWFuIGRhdGFzZXQgZGVuZ2FuIG91dGxpZXJzDQogICAgICBsaXN0KA0KICAgICAgICB4ID0gbWVkaWFuX2Rlbmdhbl9vdXRsaWVycywNCiAgICAgICAgeSA9IG1heChkZW5zaXR5X2Rlbmdhbl9vdXRsaWVycyR5KSAqIDAuOSwNCiAgICAgICAgdGV4dCA9IHBhc3RlKCJNZWRpYW4gKERlbmdhbiBPdXRsaWVycyk6IiwgbWVkaWFuX2Rlbmdhbl9vdXRsaWVycyksDQogICAgICAgIHNob3dhcnJvdyA9IFRSVUUsDQogICAgICAgIGFycm93aGVhZCA9IDIsDQogICAgICAgIGF4ID0gMCwNCiAgICAgICAgYXkgPSAtMzAsICAjIFBvc2lzaSB0ZWtzIHNlZGlraXQgbGViaWggdGluZ2dpIGRhcmkgZ2FyaXMNCiAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAncmdiYSgyMjIsIDQ1LCAzOCwgMC44KScsIHNpemUgPSAxMikNCiAgICAgICksDQogICAgICAjIEFub3Rhc2kgdW50dWsgbWVkaWFuIGRhdGFzZXQgdGFucGEgb3V0bGllcnMNCiAgICAgIGxpc3QoDQogICAgICAgIHggPSBtZWRpYW5fdGFucGFfb3V0bGllcnMsDQogICAgICAgIHkgPSBtYXgoZGVuc2l0eV90YW5wYV9vdXRsaWVycyR5KSAqIDAuOSwNCiAgICAgICAgdGV4dCA9IHBhc3RlKCJNZWRpYW4gKFRhbnBhIE91dGxpZXJzKToiLCBtZWRpYW5fdGFucGFfb3V0bGllcnMpLA0KICAgICAgICBzaG93YXJyb3cgPSBUUlVFLA0KICAgICAgICBhcnJvd2hlYWQgPSAyLA0KICAgICAgICBheCA9IDAsDQogICAgICAgIGF5ID0gLTQ1LCAgIyBQb3Npc2kgdGVrcyBzZWRpa2l0IGxlYmloIHRpbmdnaSBkYXJpIGdhcmlzDQogICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gJ3JnYmEoMzgsIDE2NiwgOTEsIDAuOCknLCBzaXplID0gMTIpDQogICAgICApDQogICAgKQ0KICApDQoNCiMgTWVuYW1waWxrYW4gcGxvdA0KcGxvdA0KDQoNCg0KYGBgDQoNCg0KKipNb2R1cyoqDQoNCioqQ29udG9oOioqDQoNCk1pc2Fsa2FuIGtpdGEgbWVtaWxpa2kgZGF0YSB0ZWthbmFuIGRhcmFoIHNpc3RvbGlrIGRhcmkgMTAgcGFzaWVuOg0KDQpEYXRhIHRla2FuYW4gZGFyYWggc2lzdG9saWsgKG1tSGcpOg0KDQoxMjAsIDEzMCwgMTIwLCAxMjAsIDEzNSwgMTUwLCAyMDAsIDE1MCwgMTUwLCAxNTANCg0KKipMYW5na2FoLWxhbmdrYWggdW50dWsgbWVuZ2hpdHVuZyBtb2R1czoqKg0KDQoxLiBJZGVudGlmaWthc2kgYW5na2EgeWFuZyBwYWxpbmcgc2VyaW5nIG11bmN1bCBkYWxhbSBkYXRhIHBlbmp1YWxhbi4NCg0KUGVuanVhbGFuIDEyMCBtdW5jdWwgMyBrYWxpLg0KUGVuanVhbGFuIDE1MCBtdW5jdWwgNCBrYWxpLg0KUGVuanVhbGFuIDEzMCwgMTM1LCBkYW4gMjAwIG1hc2luZy1tYXNpbmcgbXVuY3VsIDEga2FsaS4NCg0KMi4gVGVudHVrYW4gbW9kdXMgKG5pbGFpIHlhbmcgcGFsaW5nIHNlcmluZyBtdW5jdWwpOg0KDQpLYXJlbmEgMTUwIG11bmN1bCBwYWxpbmcgc2VyaW5nICg0IGthbGkpLCBtYWthICoqbW9kdXMqKiBkYXJpIGRhdGEgaW5pIGFkYWxhaCAxNTAuDQoNCmBgYHtSLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBtYXNzYWdlPUZBTFNFfQ0KIyBNZW11YXQgbGlicmFyeQ0KbGlicmFyeShwbG90bHkpDQoNCiMgRGF0YTogZHVhIHNrZW5hcmlvLCBzYXR1IGRlbmdhbiBvdXRsaWVycywgc2F0dSB0YW5wYSBvdXRsaWVycw0KZGF0YV9kZW5nYW5fb3V0bGllcnMgPC0gYygxMjAsIDEzMCwgMTIwLCAxMjAsIDEzNSwgMTUwLCAyMDAsIDE1MCwgMTUwLCAxNTApICAjIERlbmdhbiBvdXRsaWVycw0KZGF0YV90YW5wYV9vdXRsaWVycyA8LSBjKDEyMCwgMTMwLCAxMjAsIDEyMCwgMTM1LCAxNTAsIDE1MCwgMTUwLCAxNTApICAgICAgICAgIyBUYW5wYSBvdXRsaWVycw0KDQojIEZ1bmdzaSB1bnR1ayBtZW5naGl0dW5nIG1vZHVzDQptb2R1cyA8LSBmdW5jdGlvbih4KSB7DQogIHVuaXFfeCA8LSB1bmlxdWUoeCkNCiAgdGFiIDwtIHRhYnVsYXRlKG1hdGNoKHgsIHVuaXFfeCkpDQogIHVuaXFfeFt0YWIgPT0gbWF4KHRhYildDQp9DQoNCiMgTWVuZ2hpdHVuZyBtb2R1cyB1bnR1ayBrZWR1YSBkYXRhc2V0DQptb2R1c19kZW5nYW5fb3V0bGllcnMgPC0gbW9kdXMoZGF0YV9kZW5nYW5fb3V0bGllcnMpDQptb2R1c190YW5wYV9vdXRsaWVycyA8LSBtb2R1cyhkYXRhX3RhbnBhX291dGxpZXJzKQ0KDQojIE1lbWJ1YXQgZGVuc2l0eSBwbG90IHVudHVrIG1hc2luZy1tYXNpbmcgZGF0YXNldA0KZGVuc2l0eV9kZW5nYW5fb3V0bGllcnMgPC0gZGVuc2l0eShkYXRhX2Rlbmdhbl9vdXRsaWVycykNCmRlbnNpdHlfdGFucGFfb3V0bGllcnMgPC0gZGVuc2l0eShkYXRhX3RhbnBhX291dGxpZXJzKQ0KDQojIFBhc3Rpa2FuIHRpZGFrIGFkYSBuaWxhaSBuZWdhdGlmIGRpIHggZGFuIHkNCmRlbnNpdHlfZGVuZ2FuX291dGxpZXJzJHggPC0gcG1heCgwLCBkZW5zaXR5X2Rlbmdhbl9vdXRsaWVycyR4KQ0KZGVuc2l0eV90YW5wYV9vdXRsaWVycyR4IDwtIHBtYXgoMCwgZGVuc2l0eV90YW5wYV9vdXRsaWVycyR4KQ0KDQojIE1lbWJ1YXQgcGxvdCBtZW5nZ3VuYWthbiBQbG90bHkNCnBsb3QgPC0gcGxvdF9seSgpICU+JQ0KICAjIE1lbmFtYmFoa2FuIGRlbnNpdHkgcGxvdCB1bnR1ayBkYXRhc2V0IGRlbmdhbiBvdXRsaWVycw0KICBhZGRfdHJhY2UoDQogICAgeCA9IH5kZW5zaXR5X2Rlbmdhbl9vdXRsaWVycyR4LA0KICAgIHkgPSB+ZGVuc2l0eV9kZW5nYW5fb3V0bGllcnMkeSwNCiAgICB0eXBlID0gJ3NjYXR0ZXInLA0KICAgIG1vZGUgPSAnbGluZXMnLA0KICAgIG5hbWUgPSAiRGVuZ2FuIE91dGxpZXJzIiwNCiAgICBsaW5lID0gbGlzdChjb2xvciA9ICdyZ2JhKDIyMiwgNDUsIDM4LCAwLjgpJywgd2lkdGggPSAyKQ0KICApICU+JQ0KICAjIE1lbmFtYmFoa2FuIGRlbnNpdHkgcGxvdCB1bnR1ayBkYXRhc2V0IHRhbnBhIG91dGxpZXJzDQogIGFkZF90cmFjZSgNCiAgICB4ID0gfmRlbnNpdHlfdGFucGFfb3V0bGllcnMkeCwNCiAgICB5ID0gfmRlbnNpdHlfdGFucGFfb3V0bGllcnMkeSwNCiAgICB0eXBlID0gJ3NjYXR0ZXInLA0KICAgIG1vZGUgPSAnbGluZXMnLA0KICAgIG5hbWUgPSAiVGFucGEgT3V0bGllcnMiLA0KICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gJ3JnYmEoMzgsIDE2NiwgOTEsIDAuOCknLCB3aWR0aCA9IDIpDQogICkgJT4lDQogICMgTWVuYW1iYWhrYW4gZ2FyaXMgbW9kdXMgdW50dWsgZGF0YXNldCBkZW5nYW4gb3V0bGllcnMNCiAgYWRkX3RyYWNlKA0KICAgIHggPSBjKG1vZHVzX2Rlbmdhbl9vdXRsaWVycywgbW9kdXNfZGVuZ2FuX291dGxpZXJzKSwNCiAgICB5ID0gYygwLCBtYXgoZGVuc2l0eV9kZW5nYW5fb3V0bGllcnMkeSkpLA0KICAgIHR5cGUgPSAic2NhdHRlciIsDQogICAgbW9kZSA9ICJsaW5lcyIsDQogICAgbmFtZSA9ICJNb2R1cyAoRGVuZ2FuIE91dGxpZXJzKSIsDQogICAgbGluZSA9IGxpc3QoY29sb3IgPSAncmdiYSgyMjIsIDQ1LCAzOCwgMC42KScsIGRhc2ggPSAnZGFzaCcpDQogICkgJT4lDQogICMgTWVuYW1iYWhrYW4gZ2FyaXMgbW9kdXMgdW50dWsgZGF0YXNldCB0YW5wYSBvdXRsaWVycw0KICBhZGRfdHJhY2UoDQogICAgeCA9IGMobW9kdXNfdGFucGFfb3V0bGllcnMsIG1vZHVzX3RhbnBhX291dGxpZXJzKSwNCiAgICB5ID0gYygwLCBtYXgoZGVuc2l0eV90YW5wYV9vdXRsaWVycyR5KSksDQogICAgdHlwZSA9ICJzY2F0dGVyIiwNCiAgICBtb2RlID0gImxpbmVzIiwNCiAgICBuYW1lID0gIk1vZHVzIChUYW5wYSBPdXRsaWVycykiLA0KICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gJ3JnYmEoMzgsIDE2NiwgOTEsIDAuNiknLCBkYXNoID0gJ2Rhc2gnKQ0KICApICU+JQ0KICBsYXlvdXQoDQogICAgdGl0bGUgPSAiUGVuZ2FydWggT3V0bGllcnMgdGVyaGFkYXAgTW9kdXMgcGFkYSBEZW5zaXR5IFBsb3QiLA0KICAgIHhheGlzID0gbGlzdCh0aXRsZSA9ICJUZWthbmFuIERhcmFoIChtbUhnKSIpLA0KICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICJLZXBhZGF0YW4iKSwNCiAgICBhbm5vdGF0aW9ucyA9IGxpc3QoDQogICAgICAjIEFub3Rhc2kgdW50dWsgbW9kdXMgZGF0YXNldCBkZW5nYW4gb3V0bGllcnMNCiAgICAgIGxpc3QoDQogICAgICAgIHggPSBtb2R1c19kZW5nYW5fb3V0bGllcnMsDQogICAgICAgIHkgPSBtYXgoZGVuc2l0eV9kZW5nYW5fb3V0bGllcnMkeSkgKiAwLjksDQogICAgICAgIHRleHQgPSBwYXN0ZSgiTW9kdXM6IiwgbW9kdXNfZGVuZ2FuX291dGxpZXJzKSwNCiAgICAgICAgc2hvd2Fycm93ID0gVFJVRSwNCiAgICAgICAgYXJyb3doZWFkID0gMiwNCiAgICAgICAgYXggPSAwLA0KICAgICAgICBheSA9IC0zMCwgICMgUG9zaXNpIHRla3Mgc2VkaWtpdCBsZWJpaCB0aW5nZ2kgZGFyaSBnYXJpcw0KICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICdyZ2JhKDIyMiwgNDUsIDM4LCAwLjgpJywgc2l6ZSA9IDEyKQ0KICAgICAgKSwNCiAgICAgICMgQW5vdGFzaSB1bnR1ayBtb2R1cyBkYXRhc2V0IHRhbnBhIG91dGxpZXJzDQogICAgICBsaXN0KA0KICAgICAgICB4ID0gbW9kdXNfdGFucGFfb3V0bGllcnMsDQogICAgICAgIHkgPSBtYXgoZGVuc2l0eV90YW5wYV9vdXRsaWVycyR5KSAqIDAuOSwNCiAgICAgICAgdGV4dCA9IHBhc3RlKCJNb2R1czoiLCBtb2R1c190YW5wYV9vdXRsaWVycyksDQogICAgICAgIHNob3dhcnJvdyA9IFRSVUUsDQogICAgICAgIGFycm93aGVhZCA9IDIsDQogICAgICAgIGF4ID0gMCwNCiAgICAgICAgYXkgPSAtNDUsICAjIFBvc2lzaSB0ZWtzIHNlZGlraXQgbGViaWggdGluZ2dpIGRhcmkgZ2FyaXMNCiAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAncmdiYSgzOCwgMTY2LCA5MSwgMC44KScsIHNpemUgPSAxMikNCiAgICAgICkNCiAgICApDQogICkNCg0KIyBNZW5hbXBpbGthbiBwbG90DQpwbG90DQoNCg0KDQpgYGANCg0KIyMgKipDb250b2ggc2VkZXJoYW5hIGRpIHBlbmRpZGlrYW4qKg0KDQoqKk1lYW4oUmF0YS1yYXRhKSoqDQoNCkthc3VzOiBuaWxhaSB1amlhbiBtYXRlbWF0aWthDQoNClJ1bXVzIG1lbmdoaXR1bmcgbWVhbjoNCg0KTWVhbiA9IFwoXGZyYWN7XHN1bSBYfXtufVwpDQoNCkRpIG1hbmE6DQoNCi0gXCggXHN1bSBYIFwpIGFkYWxhaCBqdW1sYWggZGFyaSBzZW11YSBuaWxhaSBkYXRhLg0KDQotIFwoIG4gXCkgYWRhbGFoIGp1bWxhaCBkYXRhLg0KDQpMYW5na2FoLWxhbmdrYWggdW50dWsgbWVuZ2hpdHVuZyBtZWFuOg0KDQoxLiBKdW1sYWhrYW4gc2VtdWEgbmlsYWkgZGFsYW0gZGF0YS4NCg0KMi4gQmFnaSBoYXNpbCBqdW1sYWggZGVuZ2FuIGJhbnlha255YSBkYXRhLg0KDQoqKkNvbnRvaDoqKg0KDQpNaXNhbGthbiBraXRhIG1lbWlsaWtpIGRhdGEgbmlsYWkgdWppYW4gbWF0ZW1hdGlrYSBkYXJpIDcgc2lzd2EgZGkgc2VidWFoIGtlbGFzOg0KDQpEYXRhIE5pbGFpIFVqaWFuIChkYWxhbSBhbmdrYSk6DQoNCjYwLCA3NSwgNzAsIDkwLCA4MA0KDQoxLiAqKkp1bWxhaGthbiBzZW11YSBuaWxhaToqKg0KICAgXFsNCiAgIDYwICsgNzUgKyA3MCArIDkwICsgODAgPSAzNzUNCiAgIFxdDQoNCjIuICoqQmFnaSBkZW5nYW4ganVtbGFoIGRhdGEgKG4gPSA1KToqKg0KICAgXFsNCiAgIFx0ZXh0e01lYW59ID0gXGZyYWN7Mzc1fXs1fSA9IDc1DQogICBcXQ0KDQpKYWRpLCBtZWFuIGRhcmkgZGF0YSB0ZXJzZWJ1dCBhZGFsYWggKio3NSoqLg0KDQpgYGB7UiwgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgbWFzc2FnZT1GQUxTRX0NCiMgTWVtdWF0IGxpYnJhcnkNCmxpYnJhcnkocGxvdGx5KQ0KDQojIERhdGE6IGR1YSBza2VuYXJpbywgc2F0dSBkZW5nYW4gb3V0bGllcnMsIHNhdHUgdGFucGEgb3V0bGllcnMNCmRhdGFfZGVuZ2FuX291dGxpZXJzIDwtIGMoNjAsIDc1LCA3MCwgOTAsIDgwLCAyMDApICAjIERlbmdhbiBvdXRsaWVycw0KZGF0YV90YW5wYV9vdXRsaWVycyA8LSBjKDYwLCA3NSwgNzAsIDkwLCA4MCkgICAgICAgICAjIFRhbnBhIG91dGxpZXJzDQoNCiMgTWVuZ2hpdHVuZyByYXRhLXJhdGEgdW50dWsga2VkdWEgZGF0YXNldA0KbWVhbl9kZW5nYW5fb3V0bGllcnMgPC0gbWVhbihkYXRhX2Rlbmdhbl9vdXRsaWVycykNCm1lYW5fdGFucGFfb3V0bGllcnMgPC0gbWVhbihkYXRhX3RhbnBhX291dGxpZXJzKQ0KDQojIE1lbmdnYWJ1bmdrYW4gZGF0YSBrZSBkYWxhbSBzYXR1IGRhdGEgZnJhbWUgdW50dWsgdmlzdWFsaXNhc2kNCmRhdGEgPC0gZGF0YS5mcmFtZSgNCiAgTmlsYWkgPSBjKGRhdGFfZGVuZ2FuX291dGxpZXJzLCBkYXRhX3RhbnBhX291dGxpZXJzKSwNCiAgS2Vsb21wb2sgPSByZXAoYygiRGVuZ2FuIE91dGxpZXJzIiwgIlRhbnBhIE91dGxpZXJzIiksIA0KICAgICAgICAgICAgICAgICB0aW1lcyA9IGMobGVuZ3RoKGRhdGFfZGVuZ2FuX291dGxpZXJzKSwgbGVuZ3RoKGRhdGFfdGFucGFfb3V0bGllcnMpKSkNCikNCg0KIyBNZW1idWF0IGJveHBsb3QgbWVuZ2d1bmFrYW4gUGxvdGx5IGRlbmdhbiBvdXRsaWVycyBkaXRhbXBpbGthbg0KcGxvdCA8LSBwbG90X2x5KA0KICBkYXRhLCANCiAgeSA9IH5OaWxhaSwgDQogIGNvbG9yID0gfktlbG9tcG9rLCANCiAgdHlwZSA9ICJib3giLCANCiAgYm94cG9pbnRzID0gIm91dGxpZXJzIiAgIyBNZW5hbXBpbGthbiB0aXRpayBvdXRsaWVycw0KKSAlPiUgDQogIGxheW91dCgNCiAgICB0aXRsZSA9ICJQZW5nYXJ1aCBPdXRsaWVycyB0ZXJoYWRhcCBNZWFuIiwNCiAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiTmlsYWkiKSwNCiAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiS2Vsb21wb2siKSwNCiAgICBhbm5vdGF0aW9ucyA9IGxpc3QoDQogICAgICBsaXN0KA0KICAgICAgICB4ID0gIkRlbmdhbiBPdXRsaWVycyIsDQogICAgICAgIHkgPSBtZWFuX2Rlbmdhbl9vdXRsaWVycywNCiAgICAgICAgdGV4dCA9IHBhc3RlKCJNZWFuOiIsIHJvdW5kKG1lYW5fZGVuZ2FuX291dGxpZXJzLCAyKSksDQogICAgICAgIHNob3dhcnJvdyA9IFRSVUUsDQogICAgICAgIGFycm93aGVhZCA9IDINCiAgICAgICksDQogICAgICBsaXN0KA0KICAgICAgICB4ID0gIlRhbnBhIE91dGxpZXJzIiwNCiAgICAgICAgeSA9IG1lYW5fdGFucGFfb3V0bGllcnMsDQogICAgICAgIHRleHQgPSBwYXN0ZSgiTWVhbjoiLCByb3VuZChtZWFuX3RhbnBhX291dGxpZXJzLCAyKSksDQogICAgICAgIHNob3dhcnJvdyA9IFRSVUUsDQogICAgICAgIGFycm93aGVhZCA9IDINCiAgICAgICkNCiAgICApDQogICkNCg0KIyBNZW5hbXBpbGthbiBwbG90DQpwbG90DQoNCmBgYA0KDQoNCioqTWVkaWFuKioNCg0KQWRhcHVuIHJ1bXVzIG1lbmdoaXR1bmcgbWVkaWFuIGRlbmdhbiBqdW1sYWggZGF0YSBnYW5qaWw6DQoNClxbDQpcZnJhY3tuICsgMX17Mn0NClxdDQoNCkxhbmdrYWggcGVuZ2VyamFhbjoNCjEuIGRpdXJ1dGthbiBkYXRhIGRhcmkgeWFuZyBrZWNpbC1iZXNhci4NCg0KKipEYXRhIEdhbmppbDoqKg0KNjAsIDc1LCA3MCwgOTAsIDgwDQoNCi0gVXJ1dGthbiBkYXRhOg0KNjAsIDcwLCA3NSwgODAsIDkwDQoNCi0gSnVtbGFoIGRhdGEgPSA1IA0KKEdhbmppbCkNCg0KLSBQb3Npc2kgbWVkaWFuPSANCg0KXFsNClxmcmFjezUgKyAxfXsyfSA9IDMNClxdDQoNCi0gSmFkaSwgKiptZWRpYW4qKiBhZGFsYWggbmlsYWkga2UtMywgeWFpdHUgNzUNCg0KYGBge1IsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0UsIG1hc3NhZ2U9RkFMU0V9DQojIE1lbXVhdCBsaWJyYXJ5DQpsaWJyYXJ5KHBsb3RseSkNCg0KIyBEYXRhOiBzYXR1IGRlbmdhbiBvdXRsaWVycywgc2F0dSB0YW5wYSBvdXRsaWVycw0KZGF0YV9kZW5nYW5fb3V0bGllcnMgPC0gYyg2MCwgNzUsIDcwLCA5MCwgODAsIDIwMCkgICMgRGVuZ2FuIG91dGxpZXIgKDIwMCkNCmRhdGFfdGFucGFfb3V0bGllcnMgPC0gYyg2MCwgNzUsIDcwLCA5MCwgODApICAgICAgICAgIyBUYW5wYSBvdXRsaWVyDQoNCiMgRnVuZ3NpIHVudHVrIG1lbmdoaXR1bmcgbWVkaWFuDQptZWRpYW5fZnVuYyA8LSBmdW5jdGlvbih4KSB7DQogIHNvcnRlZF94IDwtIHNvcnQoeCkgICMgVXJ1dGthbiBkYXRhDQogIG4gPC0gbGVuZ3RoKHNvcnRlZF94KQ0KICAjIEppa2EganVtbGFoIGRhdGEgZ2FuamlsLCBtZWRpYW4gYWRhbGFoIG5pbGFpIGRpIHRlbmdhaA0KICBtZWRpYW4gPC0gc29ydGVkX3hbKG4gKyAxKSAvIDJdICAjIFBvc2lzaSBtZWRpYW4gc2VzdWFpIHJ1bXVzDQogIHJldHVybihtZWRpYW4pDQp9DQoNCiMgTWVuZ2hpdHVuZyBtZWRpYW4gdW50dWsga2VkdWEgZGF0YXNldA0KbWVkaWFuX2Rlbmdhbl9vdXRsaWVycyA8LSBtZWRpYW5fZnVuYyhkYXRhX2Rlbmdhbl9vdXRsaWVycykNCm1lZGlhbl90YW5wYV9vdXRsaWVycyA8LSBtZWRpYW5fZnVuYyhkYXRhX3RhbnBhX291dGxpZXJzKQ0KDQojIE1lbWJ1YXQgZGVuc2l0eSBwbG90IHVudHVrIG1hc2luZy1tYXNpbmcgZGF0YXNldA0KZGVuc2l0eV9kZW5nYW5fb3V0bGllcnMgPC0gZGVuc2l0eShkYXRhX2Rlbmdhbl9vdXRsaWVycykNCmRlbnNpdHlfdGFucGFfb3V0bGllcnMgPC0gZGVuc2l0eShkYXRhX3RhbnBhX291dGxpZXJzKQ0KDQojIFBhc3Rpa2FuIHRpZGFrIGFkYSBuaWxhaSBuZWdhdGlmIGRpIHggZGFuIHkNCmRlbnNpdHlfZGVuZ2FuX291dGxpZXJzJHggPC0gcG1heCgwLCBkZW5zaXR5X2Rlbmdhbl9vdXRsaWVycyR4KQ0KZGVuc2l0eV90YW5wYV9vdXRsaWVycyR4IDwtIHBtYXgoMCwgZGVuc2l0eV90YW5wYV9vdXRsaWVycyR4KQ0KDQojIE1lbWJ1YXQgcGxvdCBtZW5nZ3VuYWthbiBQbG90bHkNCnBsb3QgPC0gcGxvdF9seSgpICU+JQ0KICAjIE1lbmFtYmFoa2FuIGRlbnNpdHkgcGxvdCB1bnR1ayBkYXRhc2V0IGRlbmdhbiBvdXRsaWVycw0KICBhZGRfdHJhY2UoDQogICAgeCA9IH5kZW5zaXR5X2Rlbmdhbl9vdXRsaWVycyR4LA0KICAgIHkgPSB+ZGVuc2l0eV9kZW5nYW5fb3V0bGllcnMkeSwNCiAgICB0eXBlID0gJ3NjYXR0ZXInLA0KICAgIG1vZGUgPSAnbGluZXMnLA0KICAgIG5hbWUgPSAiRGVuZ2FuIE91dGxpZXJzIiwNCiAgICBsaW5lID0gbGlzdChjb2xvciA9ICdyZ2JhKDIyMiwgNDUsIDM4LCAwLjgpJywgd2lkdGggPSAyKQ0KICApICU+JQ0KICAjIE1lbmFtYmFoa2FuIGRlbnNpdHkgcGxvdCB1bnR1ayBkYXRhc2V0IHRhbnBhIG91dGxpZXJzDQogIGFkZF90cmFjZSgNCiAgICB4ID0gfmRlbnNpdHlfdGFucGFfb3V0bGllcnMkeCwNCiAgICB5ID0gfmRlbnNpdHlfdGFucGFfb3V0bGllcnMkeSwNCiAgICB0eXBlID0gJ3NjYXR0ZXInLA0KICAgIG1vZGUgPSAnbGluZXMnLA0KICAgIG5hbWUgPSAiVGFucGEgT3V0bGllcnMiLA0KICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gJ3JnYmEoMzgsIDE2NiwgOTEsIDAuOCknLCB3aWR0aCA9IDIpDQogICkgJT4lDQogICMgTWVuYW1iYWhrYW4gZ2FyaXMgbWVkaWFuIHVudHVrIGRhdGFzZXQgZGVuZ2FuIG91dGxpZXJzDQogIGFkZF90cmFjZSgNCiAgICB4ID0gYyhtZWRpYW5fZGVuZ2FuX291dGxpZXJzLCBtZWRpYW5fZGVuZ2FuX291dGxpZXJzKSwNCiAgICB5ID0gYygwLCBtYXgoZGVuc2l0eV9kZW5nYW5fb3V0bGllcnMkeSkpLA0KICAgIHR5cGUgPSAic2NhdHRlciIsDQogICAgbW9kZSA9ICJsaW5lcyIsDQogICAgbmFtZSA9ICJNZWRpYW4gKERlbmdhbiBPdXRsaWVycykiLA0KICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gJ3JnYmEoMjIyLCA0NSwgMzgsIDAuNiknLCBkYXNoID0gJ2RvdCcpDQogICkgJT4lDQogICMgTWVuYW1iYWhrYW4gZ2FyaXMgbWVkaWFuIHVudHVrIGRhdGFzZXQgdGFucGEgb3V0bGllcnMNCiAgYWRkX3RyYWNlKA0KICAgIHggPSBjKG1lZGlhbl90YW5wYV9vdXRsaWVycywgbWVkaWFuX3RhbnBhX291dGxpZXJzKSwNCiAgICB5ID0gYygwLCBtYXgoZGVuc2l0eV90YW5wYV9vdXRsaWVycyR5KSksDQogICAgdHlwZSA9ICJzY2F0dGVyIiwNCiAgICBtb2RlID0gImxpbmVzIiwNCiAgICBuYW1lID0gIk1lZGlhbiAoVGFucGEgT3V0bGllcnMpIiwNCiAgICBsaW5lID0gbGlzdChjb2xvciA9ICdyZ2JhKDM4LCAxNjYsIDkxLCAwLjYpJywgZGFzaCA9ICdkb3QnKQ0KICApICU+JQ0KICBsYXlvdXQoDQogICAgdGl0bGUgPSAiUGVuZ2FydWggT3V0bGllcnMgdGVyaGFkYXAgTWVkaWFuIHBhZGEgRGVuc2l0eSBQbG90IiwNCiAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiTmlsYWkgRGF0YSIpLA0KICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICJLZXBhZGF0YW4iKSwNCiAgICBhbm5vdGF0aW9ucyA9IGxpc3QoDQogICAgICAjIEFub3Rhc2kgdW50dWsgbWVkaWFuIGRhdGFzZXQgZGVuZ2FuIG91dGxpZXJzDQogICAgICBsaXN0KA0KICAgICAgICB4ID0gbWVkaWFuX2Rlbmdhbl9vdXRsaWVycywNCiAgICAgICAgeSA9IG1heChkZW5zaXR5X2Rlbmdhbl9vdXRsaWVycyR5KSAqIDAuOSwNCiAgICAgICAgdGV4dCA9IHBhc3RlKCJNZWRpYW4gKERlbmdhbiBPdXRsaWVycyk6IiwgbWVkaWFuX2Rlbmdhbl9vdXRsaWVycyksDQogICAgICAgIHNob3dhcnJvdyA9IFRSVUUsDQogICAgICAgIGFycm93aGVhZCA9IDIsDQogICAgICAgIGF4ID0gMCwNCiAgICAgICAgYXkgPSAtMzAsICAjIFBvc2lzaSB0ZWtzIHNlZGlraXQgbGViaWggdGluZ2dpIGRhcmkgZ2FyaXMNCiAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAncmdiYSgyMjIsIDQ1LCAzOCwgMC44KScsIHNpemUgPSAxMikNCiAgICAgICksDQogICAgICAjIEFub3Rhc2kgdW50dWsgbWVkaWFuIGRhdGFzZXQgdGFucGEgb3V0bGllcnMNCiAgICAgIGxpc3QoDQogICAgICAgIHggPSBtZWRpYW5fdGFucGFfb3V0bGllcnMsDQogICAgICAgIHkgPSBtYXgoZGVuc2l0eV90YW5wYV9vdXRsaWVycyR5KSAqIDAuOSwNCiAgICAgICAgdGV4dCA9IHBhc3RlKCJNZWRpYW4gKFRhbnBhIE91dGxpZXJzKToiLCBtZWRpYW5fdGFucGFfb3V0bGllcnMpLA0KICAgICAgICBzaG93YXJyb3cgPSBUUlVFLA0KICAgICAgICBhcnJvd2hlYWQgPSAyLA0KICAgICAgICBheCA9IDAsDQogICAgICAgIGF5ID0gLTQ1LCAgIyBQb3Npc2kgdGVrcyBzZWRpa2l0IGxlYmloIHRpbmdnaSBkYXJpIGdhcmlzDQogICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gJ3JnYmEoMzgsIDE2NiwgOTEsIDAuOCknLCBzaXplID0gMTIpDQogICAgICApDQogICAgKQ0KICApDQoNCiMgTWVuYW1waWxrYW4gcGxvdA0KcGxvdA0KDQpgYGANCg0KDQoqKk1vZHVzKioNCg0KKipDb250b2g6KioNCg0KTWlzYWxrYW4ga2l0YSBtZW1pbGlraSBkYXRhIHRla2FuYW4gZGFyYWggc2lzdG9saWsgZGFyaSAxMCBwYXNpZW46DQoNCkRhdGEgdGVrYW5hbiBkYXJhaCBzaXN0b2xpayAobW1IZyk6DQoNCjYwLCA3MCwgNzUsIDgwLCA5MCwgOTUsIDUwLCA3MCwgOTAsIDkwDQoNCioqTGFuZ2thaC1sYW5na2FoIHVudHVrIG1lbmdoaXR1bmcgbW9kdXM6KioNCg0KMS4gSWRlbnRpZmlrYXNpIGFuZ2thIHlhbmcgcGFsaW5nIHNlcmluZyBtdW5jdWwgZGFsYW0gZGF0YSBwZW5qdWFsYW4uDQoNClBlbmp1YWxhbiA5MCBtdW5jdWwgMyBrYWxpLg0KUGVuanVhbGFuIDcwIG11bmN1bCAyIGthbGkuDQpQZW5qdWFsYW4gNjAsIDc1LCBkYW4gODAgbWFzaW5nLW1hc2luZyBtdW5jdWwgMSBrYWxpLg0KDQoyLiBUZW50dWthbiBtb2R1cyAobmlsYWkgeWFuZyBwYWxpbmcgc2VyaW5nIG11bmN1bCk6DQoNCkthcmVuYSA5MCBtdW5jdWwgcGFsaW5nIHNlcmluZyAoMyBrYWxpKSwgbWFrYSAqKm1vZHVzKiogZGFyaSBkYXRhIGluaSBhZGFsYWggOTAuDQoNCmBgYHtSLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBtYXNzYWdlPUZBTFNFfQ0KIyBNZW11YXQgbGlicmFyeQ0KbGlicmFyeShwbG90bHkpDQoNCiMgRGF0YTogc2F0dSBkZW5nYW4gb3V0bGllcnMsIHNhdHUgdGFucGEgb3V0bGllcnMNCmRhdGFfZGVuZ2FuX291dGxpZXJzIDwtIGMoNjAsIDcwLCA3NSwgODAsIDkwLCA5NSwgNTAsIDcwLCA5MCwgOTAsIDIwMCkgICMgRGVuZ2FuIG91dGxpZXIgKDIwMCkNCmRhdGFfdGFucGFfb3V0bGllcnMgPC0gYyg2MCwgNzAsIDc1LCA4MCwgOTAsIDk1LCA1MCwgNzAsIDkwLCA5MCkgICAgICAgICAjIFRhbnBhIG91dGxpZXINCg0KIyBGdW5nc2kgdW50dWsgbWVuZ2hpdHVuZyBtb2R1cw0KbW9kdXMgPC0gZnVuY3Rpb24oeCkgew0KICB1bmlxX3ggPC0gdW5pcXVlKHgpDQogIHRhYiA8LSB0YWJ1bGF0ZShtYXRjaCh4LCB1bmlxX3gpKQ0KICB1bmlxX3hbdGFiID09IG1heCh0YWIpXQ0KfQ0KDQojIE1lbmdoaXR1bmcgbW9kdXMgdW50dWsga2VkdWEgZGF0YXNldA0KbW9kdXNfZGVuZ2FuX291dGxpZXJzIDwtIG1vZHVzKGRhdGFfZGVuZ2FuX291dGxpZXJzKQ0KbW9kdXNfdGFucGFfb3V0bGllcnMgPC0gbW9kdXMoZGF0YV90YW5wYV9vdXRsaWVycykNCg0KIyBNZW1idWF0IGRlbnNpdHkgcGxvdCB1bnR1ayBtYXNpbmctbWFzaW5nIGRhdGFzZXQNCmRlbnNpdHlfZGVuZ2FuX291dGxpZXJzIDwtIGRlbnNpdHkoZGF0YV9kZW5nYW5fb3V0bGllcnMpDQpkZW5zaXR5X3RhbnBhX291dGxpZXJzIDwtIGRlbnNpdHkoZGF0YV90YW5wYV9vdXRsaWVycykNCg0KIyBQYXN0aWthbiB0aWRhayBhZGEgbmlsYWkgbmVnYXRpZiBkaSB4IGRhbiB5DQpkZW5zaXR5X2Rlbmdhbl9vdXRsaWVycyR4IDwtIHBtYXgoMCwgZGVuc2l0eV9kZW5nYW5fb3V0bGllcnMkeCkNCmRlbnNpdHlfdGFucGFfb3V0bGllcnMkeCA8LSBwbWF4KDAsIGRlbnNpdHlfdGFucGFfb3V0bGllcnMkeCkNCg0KIyBNZW1idWF0IHBsb3QgbWVuZ2d1bmFrYW4gUGxvdGx5DQpwbG90IDwtIHBsb3RfbHkoKSAlPiUNCiAgIyBNZW5hbWJhaGthbiBkZW5zaXR5IHBsb3QgdW50dWsgZGF0YXNldCBkZW5nYW4gb3V0bGllcnMNCiAgYWRkX3RyYWNlKA0KICAgIHggPSB+ZGVuc2l0eV9kZW5nYW5fb3V0bGllcnMkeCwNCiAgICB5ID0gfmRlbnNpdHlfZGVuZ2FuX291dGxpZXJzJHksDQogICAgdHlwZSA9ICdzY2F0dGVyJywNCiAgICBtb2RlID0gJ2xpbmVzJywNCiAgICBuYW1lID0gIkRlbmdhbiBPdXRsaWVycyIsDQogICAgbGluZSA9IGxpc3QoY29sb3IgPSAncmdiYSgyMjIsIDQ1LCAzOCwgMC44KScsIHdpZHRoID0gMikNCiAgKSAlPiUNCiAgIyBNZW5hbWJhaGthbiBkZW5zaXR5IHBsb3QgdW50dWsgZGF0YXNldCB0YW5wYSBvdXRsaWVycw0KICBhZGRfdHJhY2UoDQogICAgeCA9IH5kZW5zaXR5X3RhbnBhX291dGxpZXJzJHgsDQogICAgeSA9IH5kZW5zaXR5X3RhbnBhX291dGxpZXJzJHksDQogICAgdHlwZSA9ICdzY2F0dGVyJywNCiAgICBtb2RlID0gJ2xpbmVzJywNCiAgICBuYW1lID0gIlRhbnBhIE91dGxpZXJzIiwNCiAgICBsaW5lID0gbGlzdChjb2xvciA9ICdyZ2JhKDM4LCAxNjYsIDkxLCAwLjgpJywgd2lkdGggPSAyKQ0KICApICU+JQ0KICAjIE1lbmFtYmFoa2FuIGdhcmlzIG1vZHVzIHVudHVrIGRhdGFzZXQgZGVuZ2FuIG91dGxpZXJzDQogIGFkZF90cmFjZSgNCiAgICB4ID0gYyhtb2R1c19kZW5nYW5fb3V0bGllcnMsIG1vZHVzX2Rlbmdhbl9vdXRsaWVycyksDQogICAgeSA9IGMoMCwgbWF4KGRlbnNpdHlfZGVuZ2FuX291dGxpZXJzJHkpKSwNCiAgICB0eXBlID0gInNjYXR0ZXIiLA0KICAgIG1vZGUgPSAibGluZXMiLA0KICAgIG5hbWUgPSAiTW9kdXMgKERlbmdhbiBPdXRsaWVycykiLA0KICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gJ3JnYmEoMjIyLCA0NSwgMzgsIDAuNiknLCBkYXNoID0gJ2Rhc2gnKQ0KICApICU+JQ0KICAjIE1lbmFtYmFoa2FuIGdhcmlzIG1vZHVzIHVudHVrIGRhdGFzZXQgdGFucGEgb3V0bGllcnMNCiAgYWRkX3RyYWNlKA0KICAgIHggPSBjKG1vZHVzX3RhbnBhX291dGxpZXJzLCBtb2R1c190YW5wYV9vdXRsaWVycyksDQogICAgeSA9IGMoMCwgbWF4KGRlbnNpdHlfdGFucGFfb3V0bGllcnMkeSkpLA0KICAgIHR5cGUgPSAic2NhdHRlciIsDQogICAgbW9kZSA9ICJsaW5lcyIsDQogICAgbmFtZSA9ICJNb2R1cyAoVGFucGEgT3V0bGllcnMpIiwNCiAgICBsaW5lID0gbGlzdChjb2xvciA9ICdyZ2JhKDM4LCAxNjYsIDkxLCAwLjYpJywgZGFzaCA9ICdkYXNoJykNCiAgKSAlPiUNCiAgbGF5b3V0KA0KICAgIHRpdGxlID0gIlBlbmdhcnVoIE91dGxpZXJzIHRlcmhhZGFwIE1vZHVzIHBhZGEgRGVuc2l0eSBQbG90IiwNCiAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiVGVrYW5hbiBEYXJhaCAobW1IZykiKSwNCiAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiS2VwYWRhdGFuIiksDQogICAgYW5ub3RhdGlvbnMgPSBsaXN0KA0KICAgICAgIyBBbm90YXNpIHVudHVrIG1vZHVzIGRhdGFzZXQgZGVuZ2FuIG91dGxpZXJzDQogICAgICBsaXN0KA0KICAgICAgICB4ID0gbW9kdXNfZGVuZ2FuX291dGxpZXJzLA0KICAgICAgICB5ID0gbWF4KGRlbnNpdHlfZGVuZ2FuX291dGxpZXJzJHkpICogMC45LA0KICAgICAgICB0ZXh0ID0gcGFzdGUoIk1vZHVzIChEZW5nYW4gT3V0bGllcnMpOiIsIG1vZHVzX2Rlbmdhbl9vdXRsaWVycyksDQogICAgICAgIHNob3dhcnJvdyA9IFRSVUUsDQogICAgICAgIGFycm93aGVhZCA9IDIsDQogICAgICAgIGF4ID0gMCwNCiAgICAgICAgYXkgPSAtMzAsICAjIFBvc2lzaSB0ZWtzIHNlZGlraXQgbGViaWggdGluZ2dpIGRhcmkgZ2FyaXMNCiAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAncmdiYSgyMjIsIDQ1LCAzOCwgMC44KScsIHNpemUgPSAxMikNCiAgICAgICksDQogICAgICAjIEFub3Rhc2kgdW50dWsgbW9kdXMgZGF0YXNldCB0YW5wYSBvdXRsaWVycw0KICAgICAgbGlzdCgNCiAgICAgICAgeCA9IG1vZHVzX3RhbnBhX291dGxpZXJzLA0KICAgICAgICB5ID0gbWF4KGRlbnNpdHlfdGFucGFfb3V0bGllcnMkeSkgKiAwLjksDQogICAgICAgIHRleHQgPSBwYXN0ZSgiTW9kdXMgKFRhbnBhIE91dGxpZXJzKToiLCBtb2R1c190YW5wYV9vdXRsaWVycyksDQogICAgICAgIHNob3dhcnJvdyA9IFRSVUUsDQogICAgICAgIGFycm93aGVhZCA9IDIsDQogICAgICAgIGF4ID0gMCwNCiAgICAgICAgYXkgPSAtNDUsICAjIFBvc2lzaSB0ZWtzIHNlZGlraXQgbGViaWggdGluZ2dpIGRhcmkgZ2FyaXMNCiAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAncmdiYSgzOCwgMTY2LCA5MSwgMC44KScsIHNpemUgPSAxMikNCiAgICAgICkNCiAgICApDQogICkNCg0KIyBNZW5hbXBpbGthbiBwbG90DQpwbG90DQoNCmBgYA0KDQo=