Tugas Pertemuan 9

awokwowk

Praktikum 1 :

Ukuran Pemusatan Untuk Data Kelompok

Definisi Ukuran Pemusatan -> Ukuran pemusatan adalah nilai-nilai yang digunakan untuk mewakili distribusi suatu data, terutama dalam menunjukkan titik tengah atau pusat data. Ukuran pemusatan meliputi mean (rata-rata), median (nilai tengah), dan modus (nilai yang sering muncul).

A. Mean (Rata-Rata)

Definisi Mean -> Mean adalah nilai rata-rata yang dihitung dengan membagi jumlah seluruh data dengan banyaknya data. Untuk data kelompok, mean dihitung dengan memperhitungkan nilai tengah setiap kelas dan frekuensi data.

Langkah-langkah menghitung mean untuk data kelompok:

1. Tentukan nilai tengah \(m_i\) setiap kelas.

Nilai tengah dapat dihitung dengan rumus: \[ m_i = \frac{b_{\text{bawah}} + b_{\text{atas}}}{2} \] Dimana:

  • \(b_{\text{bawah}}\) = batas bawah kelas

  • \(b_{\text{atas}}\) = batas atas kelas

  1. Kalikan nilai tengah \(m_i\) dengan frekuensi kelas \(f_i\) untuk mendapatkan \(f_i \cdot m_i\).

3.Jumlahkan seluruh hasil perkalian \(f_i \cdot m_i\) dan bagi dengan total \[ \bar{x} = \frac{\sum f_i \cdot m_i}{\sum f_i} \]

Rumus untuk menghitung rata-rata (mean) adalah sebagai berikut:

\[ \text{Mean} = \frac{\sum_{i=1}^{n} x_i}{n} \]

Dimana: - \(x_1, x_2, \dots, x_n\) adalah nilai-nilai yang diberikan. - \(n\) adalah jumlah data.

Contoh Perhitungan

Diberikan data sebagai berikut:

\[ 6, 3, 9, 2, 10, 12 \]

Kita dapat menghitung rata-rata (mean) dengan rumus:

\[ \text{Mean} = \frac{6 + 3 + 9 + 2 + 10 + 12}{6} \]

Menghitung jumlahnya:

\[ 6 + 3 + 9 + 2 + 10 + 12 = 42 \]

Sehingga:

\[ \text{Mean} = \frac{42}{6} = 7 \]

Jadi, rata-rata (mean) dari data tersebut adalah 7.

1. Mean Dalam Boxplot

2. Mean Dalam Histogram


B. Median (Nilai Tengah)

Definisi Median -> Median adalah nilai yang membagi data menjadi dua bagian yang sama besar. Untuk data kelompok, median dihitung dengan formuka: \[ \text{Median} = L + \left( \frac{\frac{n}{2} - F}{f_m} \right) \cdot c \] Dimana:

-\(L\) = batas bawah kelas median

-\(n\) = jumlah total frekuensi

-\(F\) = frekuensi kumulatif sebelum kelas median

-\(f_m\) = frekuensi kelas median

-\(c\) = panjang kelas

Contoh Data Ganjil

Kumpulan data yang digunakan:
\[ 5, 10, 12, 13, 15 \]

Langkah-langkah Perhitungan Median Data Ganjil:

  1. Urutkan data (jika belum terurut).
  2. Jumlah data (\(n\)) = 5 (ganjil).
  3. Hitung posisi median menggunakan rumus:
    \[ \text{Posisi Median} = \frac{n + 1}{2} = \frac{5 + 1}{2} = 3 \]
  4. Nilai median adalah elemen ke-3 dari data, yaitu 12.

Langkah-langkah Perhitungan Median Data Genap:

Contoh Data Genap

Kumpulan data yang digunakan:
\[ 5, 10, 12, 13, 15, 18 \]

Langkah-langkah:

  1. Urutkan data (jika belum terurut): 5, 10, 12, 13, 15, 18
  2. Jumlah data (\(n\)) = 6 (genap).
  3. Posisi dua nilai tengah:
    \[ \text{Posisi Tengah 1} = \frac{n}{2} = \frac{6}{2} = 3 \] \[ \text{Posisi Tengah 2} = \text{Posisi Tengah 1} + 1 = 4 \]
  4. Nilai tengah adalah elemen ke-3 dan ke-4, yaitu 12 dan 13.
  5. Hitung median dengan rumus:
    \[ \text{Median} = \frac{12 + 13}{2} = 12.5 \]

1. Median Dalam Boxplot

2. Median Dalam Histogram


C. Modus (Nilai yang sering muncul)

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

Untuk mengidentifikasi modus dalam data, perlu mencari nilai yang memiliki frekuensi tertinggi. Data numerik, modus bisa dihitung menggunakan frekuensi kemunculan masing-masing angka, sementara untuk data kategorikal, modus adalah kategori yang paling sering muncul.

Modus dalam Data Numerik

Modus adalah nilai yang paling sering muncul dalam sebuah dataset. Misalnya, kita memiliki data pengukuran tinggi badan berikut:

\[ \{ 5, 10, 12, 13, 15, 15, 16, 17, 20, 25, 28, 30, 35 \} \]

Untuk mencari modus, kita menghitung frekuensi kemunculan masing-masing angka dalam dataset tersebut. Kemudian, kita mencari nilai dengan frekuensi kemunculan tertinggi.

Berikut adalah data frekuensi kemunculan masing-masing angka:

\[ \text{Frekuensi} = \{ 5: 1, 10: 1, 12: 1, 13: 1, 15: 2, 16: 1, 17: 1, 20: 1, 25: 1, 28: 1, 30: 1, 35: 1 \} \]

Dari hasil ini, angka yang paling sering muncul adalah \(15\), karena angka tersebut muncul sebanyak 2 kali. Oleh karena itu, modus dari data ini adalah:

\[ \boxed{15} \]

Modus dalam Data Kategorikal

Jika kita memiliki data kategorikal, seperti warna favorit, kita juga bisa menghitung modusnya. Berikut adalah data kategori warna favorit:

\[ \{\text{Merah}, \text{Biru}, \text{Merah}, \text{Hijau}, \text{Merah}, \text{Biru}\} \]

Untuk mencari modus kategori, kita menghitung frekuensi kemunculan masing-masing kategori. Dalam hal ini, kita mendapatkan:

\[ \text{Frekuensi} = \{\text{Merah}: 3, \text{Biru}: 2, \text{Hijau}: 1\} \]

Dari hasil ini, kategori yang paling sering muncul adalah Merah, yang muncul sebanyak 3 kali. Oleh karena itu, modus dari data kategorikal ini adalah:

\[ \boxed{\text{Merah}} \]

1. Modus Dalam Boxplot

2. Modus Dalam Histogram

Praktikum 2:

Carilah Contoh sederhana yang menggunakan Ukuran Pemusatan dalam Studi Kasus sebagai berikut:

A. Bisnis

Kasus -> Seorang manajer toko ingin menganalisis data penjualan produk selama sebulan untuk mendapatkan gambaran yang lebih jelas mengenai performa produk tersebut. Manajer ingin mengetahi produk mana yang memiliki penjualan rata-rata yang tinggi, bagaimana distribusi penjualan ditengah-tengah (Median), dan apakah ada nilai penjualan yang terjadi lebih sering (Modus). Data penjualan yang tercatat dalam sebulan adalah sebagai berikut: \[ \text{Data:} \;5,\;12,\;8,\;10,\;8,\;10,\;15,\;12,\;20,\;8,\;10,\;25,\;10,\;15,\;18,\;10,\;12 \]

Analisis Ukuran Pemusatan Data:

1. Rata_rata (Mean)

Rata-rata adalah jummlah semua nilai dibagi dengan banyaknya data. Dalam hal ini, kita ingin mengetahui berapa jumlah rata-rata produk yang terjual setiap harinya selama sebulan: Formulanya: \[ \text{Rata-rata} = \frac{\text{Jumlah Penjualan}}{\text{Jumlah Hari}} \]

2. Median

Median adalah nilai tengah dari data yang sudah diurutkan. Median memberikan gambaran yang lebih baik mengenai data jika ada pencilan (Outlier) yang bisa mempengaruhi rata-rata.

3. Modus

Modus adalah nilai yang paling sering muncul dalam data. Modus bisa memberikan informasi mengenai produk yang paling banyak terjual dalam periode tertentu.

Langkah-langkah Analisis Bisnis

1. Menghitung Rata-rata

  • Jumlah Penjualan: \(5+12+8+10+15+12+20+8+10+25+10+15+18+10+12=165\)

  • Jumlah hari: 15

  • \[ \text{Rata-rata Penjualan}:\frac{165}{15} = 11 \] Jadi, Rata-rata penjualan prouk per hari adalah 11 unit.

2. Menghitung Median

  • Urutkan data penjualan: \(,8,8,10,10,10,12,12,12,15,15,18,20,25\)
  • Karena jumlah data adalah 15(jumlah ganjil), median adalah nilai di posisi tengah, yaitu ke-8, yang bernilai 12. jadi, Median penjualan adalah 12 unit.

3. Menghitung Modus

  • Modus adalah nilai yang paling sering muncul. Dari data, kita dapat melihat bahwa nilai 10 dan 12 muncul lebih sering dibandingkan yang lainnya.

jadi, Modus penjualan adalah 10 unit dan 12 unit, karena keduanya muncul 3 kali.

B. Kesehatan

Kasus -> Sebuah klinik menganalisis berat badan pasien yang berkunjung selama seminggu terakhir. Data ini digunakan untuk memahami distribusi berat badan pasien yang datang ke klinik, serta untuk merancang program kesehatan yang sesuai. Berikut adalah data berat badan pasien yang tercatat:

\[ \text{Data Berat Badan (dalam kilogram):} \; 45, \; 50, \; 55, \; 60, \; 60, \; 70, \; 70, \; 70, \; 75, \; 80, \; 85, \; 85, \; 90, \; 95 \]

Analisis Ukuran Pemusatan Data

1. Rata-rata (Mean)

Rata-rata digunkan untuk mengetahui berat badan rata-rata pasien yang datang ke klinik.

Formulanya: \[ \text{Rata-rata} = \frac{\text{Jumlah Total Berat Badan}}{\text{Jumlah Pasien}} \]

2. Median

Median adalah berat badan yang berada di posisi tengah setelah data diurutkan. Median memberikan informasi yang lebih stabil terhadap data yang memiliki pencilan (outlier).

3. Modus

Modus adalah berat badan yang paling sering muncul dalam data. Modus memberikan gambaran nilai berat badan yang umum ditemukan pada pasien klinik.

Langkah-langkah Analisis Kesehatan

1. Menghitung Rata-rata

  • Jumlah totalberat badan:\(45+50+55+60+60+65+70+70+70+75+80+85+85+90+95=1015\)

  • Jumlah pasien: 15

  • \[ \text{Rata-rata Berat Badan}:\frac{1015}{15} = 67.67kg \]

Jadi, rata-rata berat badan pasien adalah 67.67g

2. Menghitung Median

  • Urutkan data berat badan: \(45,50,55,60,60,65,70,70,70,75,80,85,85,90,95\)

  • Karena jumlah data adalah ganjil (15), median adalah data ke-8 dalam data yang diurutkan, yaitu 70 kg

Jadi, Median berat badan adalah 70 kg.

3. Menghitung Modus

  • Modus adalah nilai yang paling sering muncul. Dari data, nilai 70 kg muncul sebanyak 3 kali, lebih banyak dibandingkan nilai lainnya.

Jadi, Modus berat badan adalah 70 kg

C. Pendidikan

Kasus -> Sebuah sekolah ingin menganalisis nilai ujian siswa untuk mata pelajaran matematika. Data ini digunakan untuk mengetahui distribusi nilai siswa dan mengidentifikasi kebutuhan peningkatan pembelajaran. Berikut adalah nilai ujian siswa yang diperoleh dari satu kelas: \[ \text{Data Nilai Ujian Siswa:} \; 55, \; 60, \; 60, \; 65, \; 70, \; 75, \; 75, \; 75, \; 80, \; 85, \; 85, \; 90, \; 90, \; 95, \; 100 \]

Analisis Ukuran Pemusatan

1. Rata-rata (Mean)

Rata-rata digunakan untuk mengetahui nilai rata-rata ujian siswa.

Formulanya: \[ \text{Rata-rata} = \frac{\text{Jumlah Total Nilai}}{\text{jumlah Siswa}} \]

2. Median

Median adalah nilai tengah setelah data diurutkan. Median memberikan gambaran nilai tengah dari distribusi siswa.

3. Modus

Modus adalah nilai yang paling sering muncul dalam data. Modus menunjukan nilai yang paling umum dicapai oleh siswa.

Langkah-langkah Analisis Pendidikan

1. Menghitung Rata-rata

  • Jumlah total nilai: \(55+60+60+65+70+75+75+75+80+85+85+90+90+95+100=1160\)

  • Jumlah siswa: 15

  • \[ \text{Rata-rata nilai ujian} : \frac{1160}{15} = 77.33 \]

Jadi, Rata-rata(Mean) nilai ujian siswa adalah 77.33

2. Menghitung Median

  • Urutkan data nilai: \(55,60,60,65,70,75,75,75,80,85,85,90,90,95,100\)

  • Karena jumlah data adalah ganjil (15), median adalah data ke-8, yaitu 75.

Jad, Median nilai ujian siswa adalah 75

3. Menghitung Modus

  • Modus adalah nilai yang paling sering muncul. Dari data, nilai 75 muncul sebanyak 3 kali, lebih banyak dibandingkan nilai lainnya.

Jadi, Modus nilai ujian siswa adalaj 75

Kesimpulan dari Ukuran Pemusatan Data:

Ukuran pemusatan data, seperti rata-rata (mean), median, dan modus, merupakan alat statistika yang penting untuk memahami karakteristik utama dari suatu dataset.

Berikut adalah kesimpulan umum mengenai ukuran pemusatan data:

1. Rata-rata (Mean)

  • Rata-rata memberikan gambaran umum tentang nilai tengah dari seluruh data.

  • Berguna untuk menunjukan kecenderungan sentral jika data tidak memiliki nilai ekstrem (outliers).

  • Kelemahan: Sangat sensitif terhadap outliers, sehingga dapat memberikan informasi yang kurang akurat jika terdapat nilai ekstrem.

2. Median

  • Median adalah nilai tengah dari data setelah diurutkan.

  • Berguna unuk memahami nilai tengah yang lebih stabil dibandingkan rata-rata, terutama jika data memiliki outliers atau distribusi tidak simetris.

  • Kelebihan: Tidak terpengaruh oleh outliers, sehingga memberikan gambaran yang lebih representatif dalam data yang tidak simetris.

3. Modus

  • Modus adalah nilai yang paling sering muncul dalam dataset.

  • Berguna untuk mengenali pola atau nilai yang dominan dalam data.

  • Kelebihan: Cocok untuk data kategorikal atau data diskrit, di mana nilai rata-rata atau median kurang bermakna.

Kesimpulan Umum:

  • Ukuran pemusatan data membantu dalam menggambarkan karakteristik utama dataset, baik itu distribusi nilai, kecenderungan dominan, maupun nilai tengah.
  • Pemilihan ukuran yang tepat bergantung pada karakteristik data:
    • Gunakan **Mean* untuk data simetris tanoa outliers.
    • Gunakan Median untuk data yang memiliki outliers atau distribusi tidak simetris.
    • Gunakan Modus untuk menemukan nilai yang paling sering muncul, terutama pada data diskrit atau kategorial.
  • Kombinasi dari ketiga ukuran ini sering memberikan wawasan yang lebih lengkap dalam analisis data.

Dengan memahami kelebihan dan keterbatasan masing-masing ukuran pemusatan, analisis data menjadi lebih akurat dan relevan untuk pengambilan keputusan.

Refrensi

  • DSciencelabs. (n.d.) Pengantar Statistika untuk Sains Data. Bookdown. Retrieved from Klik disini
  • Nisa Amalia Putri I,S. (2024). Ketahui Macam Ukuran Pemusatan Data.Bookdown. Retrieved from Klik disini
  • Dr.Anita Rahayu, S.Si., M.Si. Ukuran Pemusatan Data. Binus Nusantara.Bookdown. Retrieved from klik disini
  • Dr.ir.Prima Kristalina,MT. (2020). Statistik Deskriptif: Ukuran Pemusatan Data.Modul 3.Pengantar statistik.Klik Disini
LS0tDQp0aXRsZTogIlR1Z2FzIFBlcnRlbXVhbiA5Ig0KDQphdXRob3I6IA0KICAgIC0gIk5hYmlsYSBBbmdnaXRhIFB1dHJpIg0KDQpkYXRlOiAiYHIgZm9ybWF0KFN5cy5EYXRlKCksICclQiAlZCwgJVknKWAiDQpvdXRwdXQ6DQogIHJtZGZvcm1hdHM6OnJlYWR0aGVkb3duOg0KICAgIHNlbGZfY29udGFpbmVkOiB0cnVlDQogICAgdGh1bWJuYWlsczogdHJ1ZQ0KICAgIGxpZ2h0Ym94OiB0cnVlDQogICAgZ2FsbGVyeTogdHJ1ZQ0KICAgIGxpYl9kaXI6IGxpYnMNCiAgICBkZl9wcmludDogInBhZ2VkIg0KICAgIGNvZGVfZm9sZGluZzogInNob3ciDQogICAgY29kZV9kb3dubG9hZDogeWVzDQogICAgDQogIA0KLS0tDQo8aW1nIHNyYz0iaW1nL3Byb2ZpbGUuanBnIiBhbHQ9ImF3b2t3b3drIiBpZD0ibG9nby11dGFtYSIgc3R5bGU9IndpZHRoOjMwMHB4OyBkaXNwbGF5OiBibG9jazsgbWFyZ2luOiBhdXRvOyIvPg0KDQogICAgDQoNCg0KDQojIFByYWt0aWt1bSAxIDogDQoNCiMjIFVrdXJhbiBQZW11c2F0YW4gVW50dWsgRGF0YSBLZWxvbXBvaw0KKipEZWZpbmlzaSBVa3VyYW4gUGVtdXNhdGFuKiogLT4gVWt1cmFuIHBlbXVzYXRhbiBhZGFsYWggbmlsYWktbmlsYWkgeWFuZyBkaWd1bmFrYW4gdW50dWsgbWV3YWtpbGkgZGlzdHJpYnVzaSBzdWF0dSBkYXRhLCB0ZXJ1dGFtYSBkYWxhbSBtZW51bmp1a2thbiB0aXRpayB0ZW5nYWggYXRhdSBwdXNhdCBkYXRhLiBVa3VyYW4gcGVtdXNhdGFuIG1lbGlwdXRpIG1lYW4gKHJhdGEtcmF0YSksIG1lZGlhbiAobmlsYWkgdGVuZ2FoKSwgZGFuIG1vZHVzIChuaWxhaSB5YW5nIHNlcmluZyBtdW5jdWwpLg0KDQoNCiMgQS4gTWVhbiAoUmF0YS1SYXRhKQ0KKipEZWZpbmlzaSBNZWFuKiogLT4gTWVhbiBhZGFsYWggbmlsYWkgcmF0YS1yYXRhIHlhbmcgZGloaXR1bmcgZGVuZ2FuIG1lbWJhZ2kganVtbGFoIHNlbHVydWggZGF0YSBkZW5nYW4gYmFueWFrbnlhIGRhdGEuIFVudHVrIGRhdGEga2Vsb21wb2ssIG1lYW4gZGloaXR1bmcgZGVuZ2FuIG1lbXBlcmhpdHVuZ2thbiBuaWxhaSB0ZW5nYWggc2V0aWFwIGtlbGFzIGRhbiBmcmVrdWVuc2kgZGF0YS4NCg0KKipMYW5na2FoLWxhbmdrYWggbWVuZ2hpdHVuZyBtZWFuIHVudHVrIGRhdGEga2Vsb21wb2s6KioNCiAgDQogICoqMS4gVGVudHVrYW4gbmlsYWkgdGVuZ2FoICRtX2kkIHNldGlhcCBrZWxhcy4qKg0KICANCiBOaWxhaSB0ZW5nYWggZGFwYXQgZGloaXR1bmcgZGVuZ2FuIHJ1bXVzOg0KJCQgbV9pID0gXGZyYWN7Yl97XHRleHR7YmF3YWh9fSArIGJfe1x0ZXh0e2F0YXN9fX17Mn0gJCQNCiBEaW1hbmE6IA0KIA0KLSAkYl97XHRleHR7YmF3YWh9fSQgPSBiYXRhcyBiYXdhaCBrZWxhcw0KDQotICRiX3tcdGV4dHthdGFzfX0kID0gYmF0YXMgYXRhcyBrZWxhcw0KDQoyLiBLYWxpa2FuIG5pbGFpIHRlbmdhaCAkbV9pJCBkZW5nYW4gZnJla3VlbnNpIGtlbGFzICRmX2kkIHVudHVrIG1lbmRhcGF0a2FuICRmX2kgXGNkb3QgbV9pJC4NCg0KMy5KdW1sYWhrYW4gc2VsdXJ1aCBoYXNpbCBwZXJrYWxpYW4gJGZfaSBcY2RvdCBtX2kkIGRhbiBiYWdpIGRlbmdhbiB0b3RhbCAkJCBcYmFye3h9ID0gXGZyYWN7XHN1bSBmX2kgXGNkb3QgbV9pfXtcc3VtIGZfaX0gJCQNCg0KUnVtdXMgdW50dWsgbWVuZ2hpdHVuZyByYXRhLXJhdGEgKG1lYW4pIGFkYWxhaCBzZWJhZ2FpIGJlcmlrdXQ6DQoNClxbDQpcdGV4dHtNZWFufSA9IFxmcmFje1xzdW1fe2k9MX1ee259IHhfaX17bn0NClxdDQoNCkRpbWFuYToNCi0gXCh4XzEsIHhfMiwgXGRvdHMsIHhfblwpIGFkYWxhaCBuaWxhaS1uaWxhaSB5YW5nIGRpYmVyaWthbi4NCi0gXChuXCkgYWRhbGFoIGp1bWxhaCBkYXRhLg0KDQpDb250b2ggUGVyaGl0dW5nYW4NCg0KRGliZXJpa2FuIGRhdGEgc2ViYWdhaSBiZXJpa3V0Og0KDQpcWw0KNiwgMywgOSwgMiwgMTAsIDEyDQpcXQ0KDQpLaXRhIGRhcGF0IG1lbmdoaXR1bmcgcmF0YS1yYXRhIChtZWFuKSBkZW5nYW4gcnVtdXM6DQoNClxbDQpcdGV4dHtNZWFufSA9IFxmcmFjezYgKyAzICsgOSArIDIgKyAxMCArIDEyfXs2fQ0KXF0NCg0KTWVuZ2hpdHVuZyBqdW1sYWhueWE6DQoNClxbDQo2ICsgMyArIDkgKyAyICsgMTAgKyAxMiA9IDQyDQpcXQ0KDQpTZWhpbmdnYToNCg0KXFsNClx0ZXh0e01lYW59ID0gXGZyYWN7NDJ9ezZ9ID0gNw0KXF0NCg0KSmFkaSwgcmF0YS1yYXRhIChtZWFuKSBkYXJpIGRhdGEgdGVyc2VidXQgYWRhbGFoICoqNyoqLg0KDQoNCg0KIyMgMS4gTWVhbiBEYWxhbSBCb3hwbG90DQpgYGB7ciwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiMgTWVtdWF0IGxpYnJhcnkNCmxpYnJhcnkocGxvdGx5KQ0KDQojIERhdGE6IGR1YSBza2VuYXJpbywgc2F0dSBkZW5nYW4gb3V0bGllcnMsIHNhdHUgdGFucGEgb3V0bGllcnMNCmRhdGFfZGVuZ2FuX291dGxpZXJzIDwtIGMoNywgMTAsIDEyLCAxNSwgMTgsIDIwLCAyNSwgMzAsIDM1LCA0MCwgNDUsIDUwLCA1NSwgMTAwKSAgIyBEZW5nYW4gb3V0bGllcnMNCmRhdGFfdGFucGFfb3V0bGllcnMgPC0gYygxMCwgMTIsIDE1LCAxOCwgMjAsIDI1LCAzMCwgMzUsIDQwLCA0NSwgNTAsIDU1LCA2MCwgNjUpICAgIyBUYW5wYSBvdXRsaWVycw0KDQojIE1lbmdoaXR1bmcgcmF0YS1yYXRhIHVudHVrIG1hc2luZy1tYXNpbmcgZGF0YXNldA0KbWVhbl9kZW5nYW5fb3V0bGllcnMgPC0gbWVhbihkYXRhX2Rlbmdhbl9vdXRsaWVycykNCm1lYW5fdGFucGFfb3V0bGllcnMgPC0gbWVhbihkYXRhX3RhbnBhX291dGxpZXJzKQ0KDQojIE1lbmdnYWJ1bmdrYW4gZGF0YSBrZSBkYWxhbSBzYXR1IGRhdGEgZnJhbWUgdW50dWsgdmlzdWFsaXNhc2kNCmRhdGFfdGVyZ2FidW5nIDwtIGRhdGEuZnJhbWUoDQogIE5pbGFpID0gYyhkYXRhX2Rlbmdhbl9vdXRsaWVycywgZGF0YV90YW5wYV9vdXRsaWVycyksDQogIEtlbG9tcG9rID0gcmVwKGMoIkRlbmdhbiBPdXRsaWVycyIsICJUYW5wYSBPdXRsaWVycyIpLCANCiAgICAgICAgICAgICAgICAgdGltZXMgPSBjKGxlbmd0aChkYXRhX2Rlbmdhbl9vdXRsaWVycyksIGxlbmd0aChkYXRhX3RhbnBhX291dGxpZXJzKSkpDQopDQoNCiMgTWVtYnVhdCBib3hwbG90IGludGVyYWt0aWYgbWVuZ2d1bmFrYW4gUGxvdGx5DQpwbG90X2JveHBsb3QgPC0gcGxvdF9seSgNCiAgZGF0YV90ZXJnYWJ1bmcsIA0KICB5ID0gfk5pbGFpLCANCiAgY29sb3IgPSB+S2Vsb21wb2ssIA0KICB0eXBlID0gImJveCIsIA0KICBib3hwb2ludHMgPSAiYWxsIiwgICMgTWVuYW1waWxrYW4gc2VtdWEgdGl0aWssIHRlcm1hc3VrIG91dGxpZXJzDQogIGppdHRlciA9IDAuMiwgICAgICAgIyBNZW1iZXJpa2FuIGVmZWsgaml0dGVyIHBhZGEgdGl0aWsgZGF0YQ0KICBwb2ludHBvcyA9IC0xLjIgICAgICMgTWVueWVzdWFpa2FuIHBvc2lzaSB0aXRpayB0ZXJoYWRhcCBib3hwbG90DQopICU+JQ0KICBsYXlvdXQoDQogICAgdGl0bGUgPSAiUGVuZ2FydWggT3V0bGllcnMgdGVyaGFkYXAgUmF0YS1yYXRhIiwNCiAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiTmlsYWkiKSwNCiAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiS2Vsb21wb2siKSwNCiAgICBhbm5vdGF0aW9ucyA9IGxpc3QoDQogICAgICBsaXN0KA0KICAgICAgICB4ID0gIkRlbmdhbiBPdXRsaWVycyIsDQogICAgICAgIHkgPSBtZWFuX2Rlbmdhbl9vdXRsaWVycywNCiAgICAgICAgdGV4dCA9IHBhc3RlKCJSYXRhLXJhdGE6Iiwgcm91bmQobWVhbl9kZW5nYW5fb3V0bGllcnMsIDIpKSwNCiAgICAgICAgc2hvd2Fycm93ID0gVFJVRSwNCiAgICAgICAgYXJyb3djb2xvciA9ICJyZWQiLA0KICAgICAgICBhcnJvd2hlYWQgPSAyDQogICAgICApLA0KICAgICAgbGlzdCgNCiAgICAgICAgeCA9ICJUYW5wYSBPdXRsaWVycyIsDQogICAgICAgIHkgPSBtZWFuX3RhbnBhX291dGxpZXJzLA0KICAgICAgICB0ZXh0ID0gcGFzdGUoIlJhdGEtcmF0YToiLCByb3VuZChtZWFuX3RhbnBhX291dGxpZXJzLCAyKSksDQogICAgICAgIHNob3dhcnJvdyA9IFRSVUUsDQogICAgICAgIGFycm93Y29sb3IgPSAiYmx1ZSIsDQogICAgICAgIGFycm93aGVhZCA9IDINCiAgICAgICkNCiAgICApDQogICkNCg0KIyBNZW5hbXBpbGthbiBwbG90DQpwbG90X2JveHBsb3QNCg0KYGBgDQoNCiMjIDIuIE1lYW4gRGFsYW0gSGlzdG9ncmFtDQpgYGB7ciwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiMgTWVtdWF0IGxpYnJhcnkNCmxpYnJhcnkocGxvdGx5KQ0KDQojIERhdGE6IGR1YSBza2VuYXJpbywgc2F0dSBkZW5nYW4gb3V0bGllcnMsIHNhdHUgdGFucGEgb3V0bGllcnMNCmRhdGFfZGVuZ2FuX291dGxpZXJzIDwtIGMoNywgMTAsIDEyLCAxNSwgMTgsIDIwLCAyNSwgMzAsIDM1LCA0MCwgNDUsIDUwLCA1NSwgMTAwKSAgIyBEZW5nYW4gb3V0bGllcnMNCmRhdGFfdGFucGFfb3V0bGllcnMgPC0gYygxMCwgMTIsIDE1LCAxOCwgMjAsIDI1LCAzMCwgMzUsIDQwLCA0NSwgNTAsIDU1LCA2MCwgNjUpICAgIyBUYW5wYSBvdXRsaWVycw0KDQojIE1lbWJ1YXQgZGVuc2l0eSBwbG90IHVudHVrIG1hc2luZy1tYXNpbmcgZGF0YXNldA0KZGVuc2l0eV9kZW5nYW5fb3V0bGllcnMgPC0gZGVuc2l0eShkYXRhX2Rlbmdhbl9vdXRsaWVycykNCmRlbnNpdHlfdGFucGFfb3V0bGllcnMgPC0gZGVuc2l0eShkYXRhX3RhbnBhX291dGxpZXJzKQ0KDQojIE1lbmdoaXR1bmcgcmF0YS1yYXRhDQptZWFuX2Rlbmdhbl9vdXRsaWVycyA8LSBtZWFuKGRhdGFfZGVuZ2FuX291dGxpZXJzKQ0KbWVhbl90YW5wYV9vdXRsaWVycyA8LSBtZWFuKGRhdGFfdGFucGFfb3V0bGllcnMpDQoNCiMgTWVtYnVhdCBwbG90IG1lbmdndW5ha2FuIFBsb3RseQ0KcGxvdCA8LSBwbG90X2x5KCkgJT4lDQogICMgRGVuc2l0eSBwbG90IHVudHVrIGRhdGEgZGVuZ2FuIG91dGxpZXJzDQogIGFkZF9saW5lcygNCiAgICB4ID0gfmRlbnNpdHlfZGVuZ2FuX291dGxpZXJzJHgsDQogICAgeSA9IH5kZW5zaXR5X2Rlbmdhbl9vdXRsaWVycyR5LA0KICAgIG5hbWUgPSAiRGF0YSBkZW5nYW4gT3V0bGllcnMiLA0KICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gJ3JnYmEoMjU1LCA5OSwgNzEsIDAuOCknLCB3aWR0aCA9IDIpICAjIFdhcm5hIG1lcmFoDQogICkgJT4lDQogICMgRGVuc2l0eSBwbG90IHVudHVrIGRhdGEgdGFucGEgb3V0bGllcnMNCiAgYWRkX2xpbmVzKA0KICAgIHggPSB+ZGVuc2l0eV90YW5wYV9vdXRsaWVycyR4LA0KICAgIHkgPSB+ZGVuc2l0eV90YW5wYV9vdXRsaWVycyR5LA0KICAgIG5hbWUgPSAiRGF0YSB0YW5wYSBPdXRsaWVycyIsDQogICAgbGluZSA9IGxpc3QoY29sb3IgPSAncmdiYSg0NiwgMTM5LCA4NywgMC44KScsIHdpZHRoID0gMikgICMgV2FybmEgaGlqYXUNCiAgKSAlPiUNCiAgIyBHYXJpcyByYXRhLXJhdGEgdW50dWsgZGF0YSBkZW5nYW4gb3V0bGllcnMNCiAgYWRkX3NlZ21lbnRzKA0KICAgIHggPSBtZWFuX2Rlbmdhbl9vdXRsaWVycywgeGVuZCA9IG1lYW5fZGVuZ2FuX291dGxpZXJzLA0KICAgIHkgPSAwLCB5ZW5kID0gbWF4KGRlbnNpdHlfZGVuZ2FuX291dGxpZXJzJHkpLA0KICAgIG5hbWUgPSAiUmF0YS1yYXRhIChEZW5nYW4gT3V0bGllcnMpIiwNCiAgICBsaW5lID0gbGlzdChjb2xvciA9ICdyZ2JhKDI1NSwgOTksIDcxLCAwLjYpJywgZGFzaCA9ICdkYXNoJykNCiAgKSAlPiUNCiAgIyBHYXJpcyByYXRhLXJhdGEgdW50dWsgZGF0YSB0YW5wYSBvdXRsaWVycw0KICBhZGRfc2VnbWVudHMoDQogICAgeCA9IG1lYW5fdGFucGFfb3V0bGllcnMsIHhlbmQgPSBtZWFuX3RhbnBhX291dGxpZXJzLA0KICAgIHkgPSAwLCB5ZW5kID0gbWF4KGRlbnNpdHlfdGFucGFfb3V0bGllcnMkeSksDQogICAgbmFtZSA9ICJSYXRhLXJhdGEgKFRhbnBhIE91dGxpZXJzKSIsDQogICAgbGluZSA9IGxpc3QoY29sb3IgPSAncmdiYSg0NiwgMTM5LCA4NywgMC42KScsIGRhc2ggPSAnZGFzaCcpDQogICkgJT4lDQogIGxheW91dCgNCiAgICB0aXRsZSA9ICJQZW5nYXJ1aCBPdXRsaWVycyB0ZXJoYWRhcCBSYXRhLXJhdGEgcGFkYSBEZW5zaXR5IFBsb3QiLA0KICAgIHhheGlzID0gbGlzdCh0aXRsZSA9ICJOaWxhaSIpLA0KICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICJLZXBhZGF0YW4iKSwNCiAgICBhbm5vdGF0aW9ucyA9IGxpc3QoDQogICAgICBsaXN0KA0KICAgICAgICB4ID0gbWVhbl9kZW5nYW5fb3V0bGllcnMsDQogICAgICAgIHkgPSBtYXgoZGVuc2l0eV9kZW5nYW5fb3V0bGllcnMkeSkgKiAwLjgsDQogICAgICAgIHRleHQgPSBwYXN0ZSgiUmF0YS1yYXRhOiIsIHJvdW5kKG1lYW5fZGVuZ2FuX291dGxpZXJzLCAyKSksDQogICAgICAgIHNob3dhcnJvdyA9IFRSVUUsDQogICAgICAgIGFycm93aGVhZCA9IDMsDQogICAgICAgIGF4ID0gMCwNCiAgICAgICAgYXkgPSAtMzAsDQogICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gJ3JnYmEoMjU1LCA5OSwgNzEsIDAuOCknLCBzaXplID0gMTIpDQogICAgICApLA0KICAgICAgbGlzdCgNCiAgICAgICAgeCA9IG1lYW5fdGFucGFfb3V0bGllcnMsDQogICAgICAgIHkgPSBtYXgoZGVuc2l0eV90YW5wYV9vdXRsaWVycyR5KSAqIDAuOCwNCiAgICAgICAgdGV4dCA9IHBhc3RlKCJSYXRhLXJhdGE6Iiwgcm91bmQobWVhbl90YW5wYV9vdXRsaWVycywgMikpLA0KICAgICAgICBzaG93YXJyb3cgPSBUUlVFLA0KICAgICAgICBhcnJvd2hlYWQgPSAzLA0KICAgICAgICBheCA9IDAsDQogICAgICAgIGF5ID0gLTQwLA0KICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICdyZ2JhKDQ2LCAxMzksIDg3LCAwLjgpJywgc2l6ZSA9IDEyKQ0KICAgICAgKQ0KICAgICkNCiAgKQ0KDQojIE1lbmFtcGlsa2FuIHBsb3QNCnBsb3QNCg0KYGBgDQotLS0NCg0KIyBCLiBNZWRpYW4gKE5pbGFpIFRlbmdhaCkNCg0KKipEZWZpbmlzaSBNZWRpYW4qKiAtPg0KTWVkaWFuIGFkYWxhaCBuaWxhaSB5YW5nIG1lbWJhZ2kgZGF0YSBtZW5qYWRpIGR1YSBiYWdpYW4geWFuZyBzYW1hIGJlc2FyLiBVbnR1ayBkYXRhIGtlbG9tcG9rLCBtZWRpYW4gZGloaXR1bmcgZGVuZ2FuIGZvcm11a2E6DQokJA0KXHRleHR7TWVkaWFufSA9IEwgKyBcbGVmdCggXGZyYWN7XGZyYWN7bn17Mn0gLSBGfXtmX219IFxyaWdodCkgXGNkb3QgYw0KJCQNCkRpbWFuYToNCg0KLSRMJCA9IGJhdGFzIGJhd2FoIGtlbGFzIG1lZGlhbg0KDQotJG4kID0ganVtbGFoIHRvdGFsIGZyZWt1ZW5zaQ0KDQotJEYkID0gZnJla3VlbnNpIGt1bXVsYXRpZiBzZWJlbHVtIGtlbGFzIG1lZGlhbg0KDQotJGZfbSQgPSBmcmVrdWVuc2kga2VsYXMgbWVkaWFuDQoNCi0kYyQgPSBwYW5qYW5nIGtlbGFzDQoNCiMjIENvbnRvaCBEYXRhIEdhbmppbA0KDQpLdW1wdWxhbiBkYXRhIHlhbmcgZGlndW5ha2FuOiAgDQpcWw0KNSwgMTAsIDEyLCAxMywgMTUNClxdDQoNCioqTGFuZ2thaC1sYW5na2FoIFBlcmhpdHVuZ2FuIE1lZGlhbiBEYXRhIEdhbmppbDoqKg0KDQoxLiBVcnV0a2FuIGRhdGEgKGppa2EgYmVsdW0gdGVydXJ1dCkuICANCjIuIEp1bWxhaCBkYXRhIChcKG5cKSkgPSA1IChnYW5qaWwpLiAgDQozLiBIaXR1bmcgcG9zaXNpIG1lZGlhbiBtZW5nZ3VuYWthbiBydW11czogIA0KICAgXFsNCiAgIFx0ZXh0e1Bvc2lzaSBNZWRpYW59ID0gXGZyYWN7biArIDF9ezJ9ID0gXGZyYWN7NSArIDF9ezJ9ID0gMw0KICAgXF0gIA0KNC4gTmlsYWkgbWVkaWFuIGFkYWxhaCBlbGVtZW4ga2UtMyBkYXJpIGRhdGEsIHlhaXR1ICoqMTIqKi4NCg0KDQoNCioqTGFuZ2thaC1sYW5na2FoIFBlcmhpdHVuZ2FuIE1lZGlhbiBEYXRhIEdlbmFwOioqDQoNCiMjIENvbnRvaCBEYXRhIEdlbmFwDQoNCkt1bXB1bGFuIGRhdGEgeWFuZyBkaWd1bmFrYW46ICANClxbDQo1LCAxMCwgMTIsIDEzLCAxNSwgMTgNClxdDQoNCiMjIyBMYW5na2FoLWxhbmdrYWg6DQoxLiBVcnV0a2FuIGRhdGEgKGppa2EgYmVsdW0gdGVydXJ1dCk6ICoqNSwgMTAsIDEyLCAxMywgMTUsIDE4KiogIA0KMi4gSnVtbGFoIGRhdGEgKFwoblwpKSA9IDYgKGdlbmFwKS4gIA0KMy4gUG9zaXNpIGR1YSBuaWxhaSB0ZW5nYWg6ICANCiAgIFxbDQogICBcdGV4dHtQb3Npc2kgVGVuZ2FoIDF9ID0gXGZyYWN7bn17Mn0gPSBcZnJhY3s2fXsyfSA9IDMNCiAgIFxdDQogICBcWw0KICAgXHRleHR7UG9zaXNpIFRlbmdhaCAyfSA9IFx0ZXh0e1Bvc2lzaSBUZW5nYWggMX0gKyAxID0gNA0KICAgXF0NCjQuIE5pbGFpIHRlbmdhaCBhZGFsYWggZWxlbWVuIGtlLTMgZGFuIGtlLTQsIHlhaXR1ICoqMTIqKiBkYW4gKioxMyoqLiAgDQo1LiBIaXR1bmcgbWVkaWFuIGRlbmdhbiBydW11czogIA0KICAgXFsNCiAgIFx0ZXh0e01lZGlhbn0gPSBcZnJhY3sxMiArIDEzfXsyfSA9IDEyLjUNCiAgIFxdDQoNCiMjICAxLiBNZWRpYW4gRGFsYW0gQm94cGxvdA0KYGBge3IsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojIE1lbXVhdCBsaWJyYXJ5DQpsaWJyYXJ5KHBsb3RseSkNCg0KIyBEYXRhOiBkdWEgc2tlbmFyaW8sIHNhdHUgZGVuZ2FuIG91dGxpZXJzLCBzYXR1IHRhbnBhIG91dGxpZXJzDQpkYXRhX2Rlbmdhbl9vdXRsaWVycyA8LSBjKDcsIDEwLCAxMiwgMTUsIDE4LCAyMCwgMjUsIDMwLCAzNSwgNDAsIDQ1LCA1MCwgNTUsIDEwMCkgICMgRGVuZ2FuIG91dGxpZXJzDQpkYXRhX3RhbnBhX291dGxpZXJzIDwtIGMoMTAsIDEyLCAxNSwgMTgsIDIwLCAyNSwgMzAsIDM1LCA0MCwgNDUsIDUwLCA1NSwgNjAsIDY1KSAgICMgVGFucGEgb3V0bGllcnMNCg0KIyBNZW5naGl0dW5nIG1lZGlhbiB1bnR1ayBtYXNpbmctbWFzaW5nIGRhdGFzZXQNCm1lZGlhbl9kZW5nYW5fb3V0bGllcnMgPC0gbWVkaWFuKGRhdGFfZGVuZ2FuX291dGxpZXJzKQ0KbWVkaWFuX3RhbnBhX291dGxpZXJzIDwtIG1lZGlhbihkYXRhX3RhbnBhX291dGxpZXJzKQ0KDQojIE1lbmdnYWJ1bmdrYW4gZGF0YSBrZSBkYWxhbSBzYXR1IGRhdGEgZnJhbWUgdW50dWsgdmlzdWFsaXNhc2kNCmRhdGFfdGVyZ2FidW5nIDwtIGRhdGEuZnJhbWUoDQogIE5pbGFpID0gYyhkYXRhX2Rlbmdhbl9vdXRsaWVycywgZGF0YV90YW5wYV9vdXRsaWVycyksDQogIEtlbG9tcG9rID0gcmVwKGMoIkRlbmdhbiBPdXRsaWVycyIsICJUYW5wYSBPdXRsaWVycyIpLCANCiAgICAgICAgICAgICAgICAgdGltZXMgPSBjKGxlbmd0aChkYXRhX2Rlbmdhbl9vdXRsaWVycyksIGxlbmd0aChkYXRhX3RhbnBhX291dGxpZXJzKSkpDQopDQoNCiMgTWVtYnVhdCBib3hwbG90IGludGVyYWt0aWYgbWVuZ2d1bmFrYW4gUGxvdGx5DQpwbG90X2JveHBsb3QgPC0gcGxvdF9seSgNCiAgZGF0YV90ZXJnYWJ1bmcsIA0KICB5ID0gfk5pbGFpLCANCiAgY29sb3IgPSB+S2Vsb21wb2ssIA0KICB0eXBlID0gImJveCIsIA0KICBib3hwb2ludHMgPSAiYWxsIiwgICMgTWVuYW1waWxrYW4gc2VtdWEgdGl0aWssIHRlcm1hc3VrIG91dGxpZXJzDQogIGppdHRlciA9IDAuMiwgICAgICAgIyBNZW1iZXJpa2FuIGVmZWsgaml0dGVyIHBhZGEgdGl0aWsgZGF0YQ0KICBwb2ludHBvcyA9IC0xLjIgICAgICMgTWVueWVzdWFpa2FuIHBvc2lzaSB0aXRpayB0ZXJoYWRhcCBib3hwbG90DQopICU+JQ0KICBsYXlvdXQoDQogICAgdGl0bGUgPSAiUGVuZ2FydWggT3V0bGllcnMgdGVyaGFkYXAgTWVkaWFuIiwNCiAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiTmlsYWkiKSwNCiAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiS2Vsb21wb2siKSwNCiAgICBhbm5vdGF0aW9ucyA9IGxpc3QoDQogICAgICBsaXN0KA0KICAgICAgICB4ID0gIkRlbmdhbiBPdXRsaWVycyIsDQogICAgICAgIHkgPSBtZWRpYW5fZGVuZ2FuX291dGxpZXJzLA0KICAgICAgICB0ZXh0ID0gcGFzdGUoIk1lZGlhbjoiLCBtZWRpYW5fZGVuZ2FuX291dGxpZXJzKSwNCiAgICAgICAgc2hvd2Fycm93ID0gVFJVRSwNCiAgICAgICAgYXJyb3djb2xvciA9ICJncmVlbiIsDQogICAgICAgIGFycm93aGVhZCA9IDINCiAgICAgICksDQogICAgICBsaXN0KA0KICAgICAgICB4ID0gIlRhbnBhIE91dGxpZXJzIiwNCiAgICAgICAgeSA9IG1lZGlhbl90YW5wYV9vdXRsaWVycywNCiAgICAgICAgdGV4dCA9IHBhc3RlKCJNZWRpYW46IiwgbWVkaWFuX3RhbnBhX291dGxpZXJzKSwNCiAgICAgICAgc2hvd2Fycm93ID0gVFJVRSwNCiAgICAgICAgYXJyb3djb2xvciA9ICJwdXJwbGUiLA0KICAgICAgICBhcnJvd2hlYWQgPSAyDQogICAgICApDQogICAgKQ0KICApDQoNCiMgTWVuYW1waWxrYW4gcGxvdA0KcGxvdF9ib3hwbG90DQpgYGANCg0KIyMgMi4gTWVkaWFuIERhbGFtIEhpc3RvZ3JhbQ0KYGBge3IsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojIE1lbXVhdCBsaWJyYXJ5DQpsaWJyYXJ5KHBsb3RseSkNCg0KIyBEYXRhOiBkdWEgc2tlbmFyaW8sIHNhdHUgZGVuZ2FuIG91dGxpZXJzLCBzYXR1IHRhbnBhIG91dGxpZXJzDQpkYXRhX2Rlbmdhbl9vdXRsaWVycyA8LSBjKDcsIDEwLCAxMiwgMTUsIDE4LCAyMCwgMjUsIDMwLCAzNSwgNDAsIDQ1LCA1MCwgNTUsIDEwMCkgICMgRGVuZ2FuIG91dGxpZXJzDQpkYXRhX3RhbnBhX291dGxpZXJzIDwtIGMoMTAsIDEyLCAxNSwgMTgsIDIwLCAyNSwgMzAsIDM1LCA0MCwgNDUsIDUwLCA1NSwgNjAsIDY1KSAgICMgVGFucGEgb3V0bGllcnMNCg0KIyBNZW1idWF0IGRlbnNpdHkgcGxvdCB1bnR1ayBtYXNpbmctbWFzaW5nIGRhdGFzZXQNCmRlbnNpdHlfZGVuZ2FuX291dGxpZXJzIDwtIGRlbnNpdHkoZGF0YV9kZW5nYW5fb3V0bGllcnMpDQpkZW5zaXR5X3RhbnBhX291dGxpZXJzIDwtIGRlbnNpdHkoZGF0YV90YW5wYV9vdXRsaWVycykNCg0KIyBNZW5naGl0dW5nIG1lZGlhbg0KbWVkaWFuX2Rlbmdhbl9vdXRsaWVycyA8LSBtZWRpYW4oZGF0YV9kZW5nYW5fb3V0bGllcnMpDQptZWRpYW5fdGFucGFfb3V0bGllcnMgPC0gbWVkaWFuKGRhdGFfdGFucGFfb3V0bGllcnMpDQoNCiMgTWVtYnVhdCBwbG90IG1lbmdndW5ha2FuIFBsb3RseQ0KcGxvdCA8LSBwbG90X2x5KCkgJT4lDQogICMgRGVuc2l0eSBwbG90IHVudHVrIGRhdGEgZGVuZ2FuIG91dGxpZXJzDQogIGFkZF9saW5lcygNCiAgICB4ID0gfmRlbnNpdHlfZGVuZ2FuX291dGxpZXJzJHgsDQogICAgeSA9IH5kZW5zaXR5X2Rlbmdhbl9vdXRsaWVycyR5LA0KICAgIG5hbWUgPSAiRGF0YSBkZW5nYW4gT3V0bGllcnMiLA0KICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gJ3JnYmEoMjU1LCA5OSwgNzEsIDAuOCknLCB3aWR0aCA9IDIpICAjIFdhcm5hIG1lcmFoDQogICkgJT4lDQogICMgRGVuc2l0eSBwbG90IHVudHVrIGRhdGEgdGFucGEgb3V0bGllcnMNCiAgYWRkX2xpbmVzKA0KICAgIHggPSB+ZGVuc2l0eV90YW5wYV9vdXRsaWVycyR4LA0KICAgIHkgPSB+ZGVuc2l0eV90YW5wYV9vdXRsaWVycyR5LA0KICAgIG5hbWUgPSAiRGF0YSB0YW5wYSBPdXRsaWVycyIsDQogICAgbGluZSA9IGxpc3QoY29sb3IgPSAncmdiYSg0NiwgMTM5LCA4NywgMC44KScsIHdpZHRoID0gMikgICMgV2FybmEgaGlqYXUNCiAgKSAlPiUNCiAgIyBHYXJpcyBtZWRpYW4gdW50dWsgZGF0YSBkZW5nYW4gb3V0bGllcnMNCiAgYWRkX3NlZ21lbnRzKA0KICAgIHggPSBtZWRpYW5fZGVuZ2FuX291dGxpZXJzLCB4ZW5kID0gbWVkaWFuX2Rlbmdhbl9vdXRsaWVycywNCiAgICB5ID0gMCwgeWVuZCA9IG1heChkZW5zaXR5X2Rlbmdhbl9vdXRsaWVycyR5KSwNCiAgICBuYW1lID0gIk1lZGlhbiAoRGVuZ2FuIE91dGxpZXJzKSIsDQogICAgbGluZSA9IGxpc3QoY29sb3IgPSAncmdiYSgyNTUsIDk5LCA3MSwgMC42KScsIGRhc2ggPSAnZGFzaCcpDQogICkgJT4lDQogICMgR2FyaXMgbWVkaWFuIHVudHVrIGRhdGEgdGFucGEgb3V0bGllcnMNCiAgYWRkX3NlZ21lbnRzKA0KICAgIHggPSBtZWRpYW5fdGFucGFfb3V0bGllcnMsIHhlbmQgPSBtZWRpYW5fdGFucGFfb3V0bGllcnMsDQogICAgeSA9IDAsIHllbmQgPSBtYXgoZGVuc2l0eV90YW5wYV9vdXRsaWVycyR5KSwNCiAgICBuYW1lID0gIk1lZGlhbiAoVGFucGEgT3V0bGllcnMpIiwNCiAgICBsaW5lID0gbGlzdChjb2xvciA9ICdyZ2JhKDQ2LCAxMzksIDg3LCAwLjYpJywgZGFzaCA9ICdkYXNoJykNCiAgKSAlPiUNCiAgbGF5b3V0KA0KICAgIHRpdGxlID0gIlBlbmdhcnVoIE91dGxpZXJzIHRlcmhhZGFwIE1lZGlhbiBwYWRhIERlbnNpdHkgUGxvdCIsDQogICAgeGF4aXMgPSBsaXN0KHRpdGxlID0gIk5pbGFpIiksDQogICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gIktlcGFkYXRhbiIpLA0KICAgIGFubm90YXRpb25zID0gbGlzdCgNCiAgICAgIGxpc3QoDQogICAgICAgIHggPSBtZWRpYW5fZGVuZ2FuX291dGxpZXJzLA0KICAgICAgICB5ID0gbWF4KGRlbnNpdHlfZGVuZ2FuX291dGxpZXJzJHkpICogMC44LA0KICAgICAgICB0ZXh0ID0gcGFzdGUoIk1lZGlhbjoiLCByb3VuZChtZWRpYW5fZGVuZ2FuX291dGxpZXJzLCAyKSksDQogICAgICAgIHNob3dhcnJvdyA9IFRSVUUsDQogICAgICAgIGFycm93aGVhZCA9IDMsDQogICAgICAgIGF4ID0gMCwNCiAgICAgICAgYXkgPSAtMzAsDQogICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gJ3JnYmEoMjU1LCA5OSwgNzEsIDAuOCknLCBzaXplID0gMTIpDQogICAgICApLA0KICAgICAgbGlzdCgNCiAgICAgICAgeCA9IG1lZGlhbl90YW5wYV9vdXRsaWVycywNCiAgICAgICAgeSA9IG1heChkZW5zaXR5X3RhbnBhX291dGxpZXJzJHkpICogMC44LA0KICAgICAgICB0ZXh0ID0gcGFzdGUoIk1lZGlhbjoiLCByb3VuZChtZWRpYW5fdGFucGFfb3V0bGllcnMsIDIpKSwNCiAgICAgICAgc2hvd2Fycm93ID0gVFJVRSwNCiAgICAgICAgYXJyb3doZWFkID0gMywNCiAgICAgICAgYXggPSAwLA0KICAgICAgICBheSA9IC00MCwNCiAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAncmdiYSg0NiwgMTM5LCA4NywgMC44KScsIHNpemUgPSAxMikNCiAgICAgICkNCiAgICApDQogICkNCg0KIyBNZW5hbXBpbGthbiBwbG90DQpwbG90DQpgYGANCi0tLQ0KIyBDLiBNb2R1cyAoTmlsYWkgeWFuZyBzZXJpbmcgbXVuY3VsKQ0KDQoqKkRlZmluaXNpIE1vZHVzKiogLT4NCk1vZHVzIGFkYWxhaCBuaWxhaSB5YW5nIHNlcmluZyBtdW5jdWwgZGFsYW0gc2VidWFoIGRhdGFzZXQuIE1vZHVzIGRpZ3VuYWthbiB1bnR1ayBtZW5nZXRhaHVpIG5pbGFpIHlhbmcgcGFsaW5nIGRvbWluYW4gYXRhdSBwYWxpbmcgc2VyaW5nIHRlcmphZGkgZGFsYW0gc3VhdHUga3VtcHVsYW4gZGF0YS4gTW9kdXMgYmlzYSBkaXRlbXVrYW4gZGFsYW0gZGF0YSBrdWFudGl0YXRpZiBtYXVwdW4ga2F0ZWdvcmlrYWwuDQoNClVudHVrIG1lbmdpZGVudGlmaWthc2kgbW9kdXMgZGFsYW0gZGF0YSwgcGVybHUgbWVuY2FyaSBuaWxhaSB5YW5nIG1lbWlsaWtpIGZyZWt1ZW5zaSB0ZXJ0aW5nZ2kuIERhdGEgbnVtZXJpaywgbW9kdXMgYmlzYSBkaWhpdHVuZyBtZW5nZ3VuYWthbiBmcmVrdWVuc2kga2VtdW5jdWxhbiBtYXNpbmctbWFzaW5nIGFuZ2thLCBzZW1lbnRhcmEgdW50dWsgZGF0YSBrYXRlZ29yaWthbCwgbW9kdXMgYWRhbGFoIGthdGVnb3JpIHlhbmcgcGFsaW5nIHNlcmluZyBtdW5jdWwuDQoNCiMjIE1vZHVzIGRhbGFtIERhdGEgTnVtZXJpaw0KDQpNb2R1cyBhZGFsYWggbmlsYWkgeWFuZyBwYWxpbmcgc2VyaW5nIG11bmN1bCBkYWxhbSBzZWJ1YWggZGF0YXNldC4gTWlzYWxueWEsIGtpdGEgbWVtaWxpa2kgZGF0YSBwZW5ndWt1cmFuIHRpbmdnaSBiYWRhbiBiZXJpa3V0Og0KDQpcWw0KXHsgNSwgMTAsIDEyLCAxMywgMTUsIDE1LCAxNiwgMTcsIDIwLCAyNSwgMjgsIDMwLCAzNSBcfQ0KXF0NCg0KVW50dWsgbWVuY2FyaSBtb2R1cywga2l0YSBtZW5naGl0dW5nIGZyZWt1ZW5zaSBrZW11bmN1bGFuIG1hc2luZy1tYXNpbmcgYW5na2EgZGFsYW0gZGF0YXNldCB0ZXJzZWJ1dC4gS2VtdWRpYW4sIGtpdGEgbWVuY2FyaSBuaWxhaSBkZW5nYW4gZnJla3VlbnNpIGtlbXVuY3VsYW4gdGVydGluZ2dpLg0KDQpCZXJpa3V0IGFkYWxhaCBkYXRhIGZyZWt1ZW5zaSBrZW11bmN1bGFuIG1hc2luZy1tYXNpbmcgYW5na2E6DQoNClxbDQpcdGV4dHtGcmVrdWVuc2l9ID0gXHsgNTogMSwgMTA6IDEsIDEyOiAxLCAxMzogMSwgMTU6IDIsIDE2OiAxLCAxNzogMSwgMjA6IDEsIDI1OiAxLCAyODogMSwgMzA6IDEsIDM1OiAxIFx9DQpcXQ0KDQpEYXJpIGhhc2lsIGluaSwgYW5na2EgeWFuZyBwYWxpbmcgc2VyaW5nIG11bmN1bCBhZGFsYWggXCggMTUgXCksIGthcmVuYSBhbmdrYSB0ZXJzZWJ1dCBtdW5jdWwgc2ViYW55YWsgMiBrYWxpLiBPbGVoIGthcmVuYSBpdHUsIG1vZHVzIGRhcmkgZGF0YSBpbmkgYWRhbGFoOg0KDQpcWw0KXGJveGVkezE1fQ0KXF0NCg0KIyMgTW9kdXMgZGFsYW0gRGF0YSBLYXRlZ29yaWthbA0KDQpKaWthIGtpdGEgbWVtaWxpa2kgZGF0YSBrYXRlZ29yaWthbCwgc2VwZXJ0aSB3YXJuYSBmYXZvcml0LCBraXRhIGp1Z2EgYmlzYSBtZW5naGl0dW5nIG1vZHVzbnlhLiBCZXJpa3V0IGFkYWxhaCBkYXRhIGthdGVnb3JpIHdhcm5hIGZhdm9yaXQ6DQoNClxbDQpce1x0ZXh0e01lcmFofSwgXHRleHR7QmlydX0sIFx0ZXh0e01lcmFofSwgXHRleHR7SGlqYXV9LCBcdGV4dHtNZXJhaH0sIFx0ZXh0e0JpcnV9XH0NClxdDQoNClVudHVrIG1lbmNhcmkgbW9kdXMga2F0ZWdvcmksIGtpdGEgbWVuZ2hpdHVuZyBmcmVrdWVuc2kga2VtdW5jdWxhbiBtYXNpbmctbWFzaW5nIGthdGVnb3JpLiBEYWxhbSBoYWwgaW5pLCBraXRhIG1lbmRhcGF0a2FuOg0KDQpcWw0KXHRleHR7RnJla3VlbnNpfSA9IFx7XHRleHR7TWVyYWh9OiAzLCBcdGV4dHtCaXJ1fTogMiwgXHRleHR7SGlqYXV9OiAxXH0NClxdDQoNCkRhcmkgaGFzaWwgaW5pLCBrYXRlZ29yaSB5YW5nIHBhbGluZyBzZXJpbmcgbXVuY3VsIGFkYWxhaCAqKk1lcmFoKiosIHlhbmcgbXVuY3VsIHNlYmFueWFrIDMga2FsaS4gT2xlaCBrYXJlbmEgaXR1LCBtb2R1cyBkYXJpIGRhdGEga2F0ZWdvcmlrYWwgaW5pIGFkYWxhaDoNCg0KXFsNClxib3hlZHtcdGV4dHtNZXJhaH19DQpcXQ0KDQojIyAxLiBNb2R1cyBEYWxhbSBCb3hwbG90DQpgYGB7ciwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiMgTWVtdWF0IGxpYnJhcnkNCmxpYnJhcnkocGxvdGx5KQ0KDQojIERhdGEgYmFydTogZHVhIHNrZW5hcmlvLCBzYXR1IGRlbmdhbiBvdXRsaWVycywgc2F0dSB0YW5wYSBvdXRsaWVycw0KZGF0YV9kZW5nYW5fb3V0bGllcnMgPC0gYyg1LCAxMCwgMTIsIDEzLCAxNSwgMTUsIDE2LCAxNywgMjAsIDI1LCAyOCwgMzAsIDM1KSAgIyBEYXRhIGJhcnUgdGFucGEgb3V0bGllcnMNCmRhdGFfdGFucGFfb3V0bGllcnMgPC0gYyg1LCAxMCwgMTIsIDEzLCAxNSwgMTUsIDE2LCAxNywgMjAsIDI1LCAyOCwgMzAsIDM1KSAgICMgRGF0YSB5YW5nIHNhbWEgdGFucGEgb3V0bGllcnMNCg0KIyBNZW5naGl0dW5nIG1vZHVzIHVudHVrIG1hc2luZy1tYXNpbmcgZGF0YXNldA0KbW9kdXNfZGVuZ2FuX291dGxpZXJzIDwtIGFzLm51bWVyaWMobmFtZXMoc29ydCh0YWJsZShkYXRhX2Rlbmdhbl9vdXRsaWVycyksIGRlY3JlYXNpbmcgPSBUUlVFKVsxXSkpDQptb2R1c190YW5wYV9vdXRsaWVycyA8LSBhcy5udW1lcmljKG5hbWVzKHNvcnQodGFibGUoZGF0YV90YW5wYV9vdXRsaWVycyksIGRlY3JlYXNpbmcgPSBUUlVFKVsxXSkpDQoNCiMgTWVuZ2dhYnVuZ2thbiBkYXRhIGtlIGRhbGFtIHNhdHUgZGF0YSBmcmFtZSB1bnR1ayB2aXN1YWxpc2FzaQ0KZGF0YV90ZXJnYWJ1bmcgPC0gZGF0YS5mcmFtZSgNCiAgTmlsYWkgPSBjKGRhdGFfZGVuZ2FuX291dGxpZXJzLCBkYXRhX3RhbnBhX291dGxpZXJzKSwNCiAgS2Vsb21wb2sgPSByZXAoYygiRGVuZ2FuIE91dGxpZXJzIiwgIlRhbnBhIE91dGxpZXJzIiksIA0KICAgICAgICAgICAgICAgICB0aW1lcyA9IGMobGVuZ3RoKGRhdGFfZGVuZ2FuX291dGxpZXJzKSwgbGVuZ3RoKGRhdGFfdGFucGFfb3V0bGllcnMpKSkNCikNCg0KIyBNZW1idWF0IGJveHBsb3QgaW50ZXJha3RpZiBtZW5nZ3VuYWthbiBQbG90bHkNCnBsb3RfYm94cGxvdCA8LSBwbG90X2x5KA0KICBkYXRhX3RlcmdhYnVuZywgDQogIHkgPSB+TmlsYWksIA0KICBjb2xvciA9IH5LZWxvbXBvaywgDQogIHR5cGUgPSAiYm94IiwgDQogIGJveHBvaW50cyA9ICJhbGwiLCAgIyBNZW5hbXBpbGthbiBzZW11YSB0aXRpaywgdGVybWFzdWsgb3V0bGllcnMNCiAgaml0dGVyID0gMC4yLCAgICAgICAjIE1lbWJlcmlrYW4gZWZlayBqaXR0ZXIgcGFkYSB0aXRpayBkYXRhDQogIHBvaW50cG9zID0gLTEuMiAgICAgIyBNZW55ZXN1YWlrYW4gcG9zaXNpIHRpdGlrIHRlcmhhZGFwIGJveHBsb3QNCikgJT4lDQogIGxheW91dCgNCiAgICB0aXRsZSA9ICJQZW5nYXJ1aCBNb2R1cyB0ZXJoYWRhcCBCb3hwbG90IiwNCiAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiTmlsYWkiKSwNCiAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiS2Vsb21wb2siKSwNCiAgICBhbm5vdGF0aW9ucyA9IGxpc3QoDQogICAgICBsaXN0KA0KICAgICAgICB4ID0gIkRlbmdhbiBPdXRsaWVycyIsDQogICAgICAgIHkgPSBtb2R1c19kZW5nYW5fb3V0bGllcnMsDQogICAgICAgIHRleHQgPSBwYXN0ZSgiTW9kdXM6IiwgbW9kdXNfZGVuZ2FuX291dGxpZXJzKSwNCiAgICAgICAgc2hvd2Fycm93ID0gVFJVRSwNCiAgICAgICAgYXJyb3djb2xvciA9ICJyZWQiLA0KICAgICAgICBhcnJvd2hlYWQgPSAyDQogICAgICApLA0KICAgICAgbGlzdCgNCiAgICAgICAgeCA9ICJUYW5wYSBPdXRsaWVycyIsDQogICAgICAgIHkgPSBtb2R1c190YW5wYV9vdXRsaWVycywNCiAgICAgICAgdGV4dCA9IHBhc3RlKCJNb2R1czoiLCBtb2R1c190YW5wYV9vdXRsaWVycyksDQogICAgICAgIHNob3dhcnJvdyA9IFRSVUUsDQogICAgICAgIGFycm93Y29sb3IgPSAiYmx1ZSIsDQogICAgICAgIGFycm93aGVhZCA9IDINCiAgICAgICkNCiAgICApDQogICkNCg0KIyBNZW5hbXBpbGthbiBwbG90DQpwbG90X2JveHBsb3QNCmBgYA0KDQojIyAyLiBNb2R1cyBEYWxhbSBIaXN0b2dyYW0NCmBgYHtyLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KIyBNZW11YXQgbGlicmFyeQ0KbGlicmFyeShwbG90bHkpDQoNCiMgRGF0YTogZHVhIHNrZW5hcmlvLCBzYXR1IGRlbmdhbiBvdXRsaWVycywgc2F0dSB0YW5wYSBvdXRsaWVycw0KZGF0YV9kZW5nYW5fb3V0bGllcnMgPC0gYyg1LCAxMCwgMTIsIDEzLCAxNSwgMTUsIDE2LCAxNywgMjAsIDI1LCAyOCwgMzAsIDM1KSAgIyBEZW5nYW4gb3V0bGllcnMNCmRhdGFfdGFucGFfb3V0bGllcnMgPC0gYyg1LCAxMCwgMTIsIDEzLCAxNSwgMTUsIDE2LCAxNywgMjAsIDI1LCAyOCwgMzAsIDM1KSAgICMgVGFucGEgb3V0bGllcnMNCg0KIyBNZW1idWF0IGRlbnNpdHkgcGxvdCB1bnR1ayBtYXNpbmctbWFzaW5nIGRhdGFzZXQNCmRlbnNpdHlfZGVuZ2FuX291dGxpZXJzIDwtIGRlbnNpdHkoZGF0YV9kZW5nYW5fb3V0bGllcnMpDQpkZW5zaXR5X3RhbnBhX291dGxpZXJzIDwtIGRlbnNpdHkoZGF0YV90YW5wYV9vdXRsaWVycykNCg0KIyBNZW5naGl0dW5nIG1vZHVzDQptb2R1c19kZW5nYW5fb3V0bGllcnMgPC0gYXMubnVtZXJpYyhuYW1lcyhzb3J0KHRhYmxlKGRhdGFfZGVuZ2FuX291dGxpZXJzKSwgZGVjcmVhc2luZyA9IFRSVUUpWzFdKSkNCm1vZHVzX3RhbnBhX291dGxpZXJzIDwtIGFzLm51bWVyaWMobmFtZXMoc29ydCh0YWJsZShkYXRhX3RhbnBhX291dGxpZXJzKSwgZGVjcmVhc2luZyA9IFRSVUUpWzFdKSkNCg0KIyBNZW1idWF0IHBsb3QgbWVuZ2d1bmFrYW4gUGxvdGx5DQpwbG90IDwtIHBsb3RfbHkoKSAlPiUNCiAgIyBEZW5zaXR5IHBsb3QgdW50dWsgZGF0YSBkZW5nYW4gb3V0bGllcnMNCiAgYWRkX2xpbmVzKA0KICAgIHggPSB+ZGVuc2l0eV9kZW5nYW5fb3V0bGllcnMkeCwNCiAgICB5ID0gfmRlbnNpdHlfZGVuZ2FuX291dGxpZXJzJHksDQogICAgbmFtZSA9ICJEYXRhIGRlbmdhbiBPdXRsaWVycyIsDQogICAgbGluZSA9IGxpc3QoY29sb3IgPSAncmdiYSgyNTUsIDk5LCA3MSwgMC44KScsIHdpZHRoID0gMikgICMgV2FybmEgbWVyYWgNCiAgKSAlPiUNCiAgIyBEZW5zaXR5IHBsb3QgdW50dWsgZGF0YSB0YW5wYSBvdXRsaWVycw0KICBhZGRfbGluZXMoDQogICAgeCA9IH5kZW5zaXR5X3RhbnBhX291dGxpZXJzJHgsDQogICAgeSA9IH5kZW5zaXR5X3RhbnBhX291dGxpZXJzJHksDQogICAgbmFtZSA9ICJEYXRhIHRhbnBhIE91dGxpZXJzIiwNCiAgICBsaW5lID0gbGlzdChjb2xvciA9ICdyZ2JhKDQ2LCAxMzksIDg3LCAwLjgpJywgd2lkdGggPSAyKSAgIyBXYXJuYSBoaWphdQ0KICApICU+JQ0KICAjIEdhcmlzIG1vZHVzIHVudHVrIGRhdGEgZGVuZ2FuIG91dGxpZXJzDQogIGFkZF9zZWdtZW50cygNCiAgICB4ID0gbW9kdXNfZGVuZ2FuX291dGxpZXJzLCB4ZW5kID0gbW9kdXNfZGVuZ2FuX291dGxpZXJzLA0KICAgIHkgPSAwLCB5ZW5kID0gbWF4KGRlbnNpdHlfZGVuZ2FuX291dGxpZXJzJHkpLA0KICAgIG5hbWUgPSAiTW9kdXMgKERlbmdhbiBPdXRsaWVycykiLA0KICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gJ3JnYmEoMjU1LCA5OSwgNzEsIDAuNiknLCBkYXNoID0gJ2Rhc2gnKQ0KICApICU+JQ0KICAjIEdhcmlzIG1vZHVzIHVudHVrIGRhdGEgdGFucGEgb3V0bGllcnMNCiAgYWRkX3NlZ21lbnRzKA0KICAgIHggPSBtb2R1c190YW5wYV9vdXRsaWVycywgeGVuZCA9IG1vZHVzX3RhbnBhX291dGxpZXJzLA0KICAgIHkgPSAwLCB5ZW5kID0gbWF4KGRlbnNpdHlfdGFucGFfb3V0bGllcnMkeSksDQogICAgbmFtZSA9ICJNb2R1cyAoVGFucGEgT3V0bGllcnMpIiwNCiAgICBsaW5lID0gbGlzdChjb2xvciA9ICdyZ2JhKDQ2LCAxMzksIDg3LCAwLjYpJywgZGFzaCA9ICdkYXNoJykNCiAgKSAlPiUNCiAgbGF5b3V0KA0KICAgIHRpdGxlID0gIlBlbmdhcnVoIE91dGxpZXJzIHRlcmhhZGFwIE1vZHVzIHBhZGEgRGVuc2l0eSBQbG90IiwNCiAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiTmlsYWkiKSwNCiAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiS2VwYWRhdGFuIiksDQogICAgYW5ub3RhdGlvbnMgPSBsaXN0KA0KICAgICAgbGlzdCgNCiAgICAgICAgeCA9IG1vZHVzX2Rlbmdhbl9vdXRsaWVycywNCiAgICAgICAgeSA9IG1heChkZW5zaXR5X2Rlbmdhbl9vdXRsaWVycyR5KSAqIDAuOCwNCiAgICAgICAgdGV4dCA9IHBhc3RlKCJNb2R1czoiLCBtb2R1c19kZW5nYW5fb3V0bGllcnMpLA0KICAgICAgICBzaG93YXJyb3cgPSBUUlVFLA0KICAgICAgICBhcnJvd2hlYWQgPSAzLA0KICAgICAgICBheCA9IDAsDQogICAgICAgIGF5ID0gLTMwLA0KICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICdyZ2JhKDI1NSwgOTksIDcxLCAwLjgpJywgc2l6ZSA9IDEyKQ0KICAgICAgKSwNCiAgICAgIGxpc3QoDQogICAgICAgIHggPSBtb2R1c190YW5wYV9vdXRsaWVycywNCiAgICAgICAgeSA9IG1heChkZW5zaXR5X3RhbnBhX291dGxpZXJzJHkpICogMC44LA0KICAgICAgICB0ZXh0ID0gcGFzdGUoIk1vZHVzOiIsIG1vZHVzX3RhbnBhX291dGxpZXJzKSwNCiAgICAgICAgc2hvd2Fycm93ID0gVFJVRSwNCiAgICAgICAgYXJyb3doZWFkID0gMywNCiAgICAgICAgYXggPSAwLA0KICAgICAgICBheSA9IC00MCwNCiAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAncmdiYSg0NiwgMTM5LCA4NywgMC44KScsIHNpemUgPSAxMikNCiAgICAgICkNCiAgICApDQogICkNCg0KIyBNZW5hbXBpbGthbiBwbG90DQpwbG90DQpgYGANCg0KDQojIFByYWt0aWt1bSAyOg0KDQoqKkNhcmlsYWggQ29udG9oIHNlZGVyaGFuYSB5YW5nIG1lbmdndW5ha2FuIFVrdXJhbiBQZW11c2F0YW4gZGFsYW0gU3R1ZGkgS2FzdXMgc2ViYWdhaSBiZXJpa3V0OioqDQoNCiMgQS4gQmlzbmlzDQoNCioqS2FzdXMqKiAtPiBTZW9yYW5nIG1hbmFqZXIgdG9rbyBpbmdpbiBtZW5nYW5hbGlzaXMgZGF0YSBwZW5qdWFsYW4gcHJvZHVrIHNlbGFtYSBzZWJ1bGFuIHVudHVrIG1lbmRhcGF0a2FuIGdhbWJhcmFuIHlhbmcgbGViaWggamVsYXMgbWVuZ2VuYWkgcGVyZm9ybWEgcHJvZHVrIHRlcnNlYnV0LiBNYW5hamVyIGluZ2luIG1lbmdldGFoaSBwcm9kdWsgbWFuYSB5YW5nIG1lbWlsaWtpIHBlbmp1YWxhbiByYXRhLXJhdGEgeWFuZyB0aW5nZ2ksIGJhZ2FpbWFuYSBkaXN0cmlidXNpIHBlbmp1YWxhbiBkaXRlbmdhaC10ZW5nYWggKE1lZGlhbiksIGRhbiBhcGFrYWggYWRhIG5pbGFpIHBlbmp1YWxhbiB5YW5nIHRlcmphZGkgbGViaWggc2VyaW5nIChNb2R1cykuIERhdGEgcGVuanVhbGFuIHlhbmcgdGVyY2F0YXQgZGFsYW0gc2VidWxhbiBhZGFsYWggc2ViYWdhaSBiZXJpa3V0Og0KXFsNCiBcdGV4dHtEYXRhOn0gXDs1LFw7MTIsXDs4LFw7MTAsXDs4LFw7MTAsXDsxNSxcOzEyLFw7MjAsXDs4LFw7MTAsXDsyNSxcOzEwLFw7MTUsXDsxOCxcOzEwLFw7MTINClxdDQoNCioqQW5hbGlzaXMgVWt1cmFuIFBlbXVzYXRhbiBEYXRhOioqDQoNCiMjIDEuIFJhdGFfcmF0YSAoTWVhbikNClJhdGEtcmF0YSBhZGFsYWgganVtbWxhaCBzZW11YSBuaWxhaSBkaWJhZ2kgZGVuZ2FuIGJhbnlha255YSBkYXRhLiBEYWxhbSBoYWwgaW5pLCBraXRhIGluZ2luIG1lbmdldGFodWkgYmVyYXBhIGp1bWxhaCByYXRhLXJhdGEgcHJvZHVrIHlhbmcgdGVyanVhbCBzZXRpYXAgaGFyaW55YSBzZWxhbWEgc2VidWxhbjoNCkZvcm11bGFueWE6DQpcWw0KXHRleHR7UmF0YS1yYXRhfSA9IFxmcmFje1x0ZXh0e0p1bWxhaCBQZW5qdWFsYW59fXtcdGV4dHtKdW1sYWggSGFyaX19DQpcXQ0KDQojIyAyLiBNZWRpYW4NCk1lZGlhbiBhZGFsYWggbmlsYWkgdGVuZ2FoIGRhcmkgZGF0YSB5YW5nIHN1ZGFoIGRpdXJ1dGthbi4gTWVkaWFuIG1lbWJlcmlrYW4gZ2FtYmFyYW4geWFuZyBsZWJpaCBiYWlrIG1lbmdlbmFpIGRhdGEgamlrYSBhZGEgcGVuY2lsYW4gKE91dGxpZXIpIHlhbmcgYmlzYSBtZW1wZW5nYXJ1aGkgcmF0YS1yYXRhLg0KDQojIyAzLiBNb2R1cw0KTW9kdXMgYWRhbGFoIG5pbGFpIHlhbmcgcGFsaW5nIHNlcmluZyBtdW5jdWwgZGFsYW0gZGF0YS4gTW9kdXMgYmlzYSBtZW1iZXJpa2FuIGluZm9ybWFzaSBtZW5nZW5haSBwcm9kdWsgeWFuZyBwYWxpbmcgYmFueWFrIHRlcmp1YWwgZGFsYW0gcGVyaW9kZSB0ZXJ0ZW50dS4NCg0KIyBMYW5na2FoLWxhbmdrYWggQW5hbGlzaXMgQmlzbmlzDQoNCiMjIDEuIE1lbmdoaXR1bmcgUmF0YS1yYXRhDQoNCiogSnVtbGFoIFBlbmp1YWxhbjogJDUrMTIrOCsxMCsxNSsxMisyMCs4KzEwKzI1KzEwKzE1KzE4KzEwKzEyPTE2NSQNCg0KKiBKdW1sYWggaGFyaTogMTUNCg0KKiBcWw0KXHRleHR7UmF0YS1yYXRhIFBlbmp1YWxhbn06XGZyYWN7MTY1fXsxNX0gPSAxMQ0KXF0NCkphZGksIFJhdGEtcmF0YSBwZW5qdWFsYW4gcHJvdWsgcGVyIGhhcmkgYWRhbGFoICoqMTEqKiB1bml0Lg0KDQojIyAyLiBNZW5naGl0dW5nIE1lZGlhbg0KKiBVcnV0a2FuIGRhdGEgcGVuanVhbGFuOiAkLDgsOCwxMCwxMCwxMCwxMiwxMiwxMiwxNSwxNSwxOCwyMCwyNSQNCiogS2FyZW5hIGp1bWxhaCBkYXRhIGFkYWxhaCAxNShqdW1sYWggZ2FuamlsKSwgbWVkaWFuIGFkYWxhaCBuaWxhaSBkaSBwb3Npc2kgdGVuZ2FoLCB5YWl0dSBrZS04LCB5YW5nIGJlcm5pbGFpICoqMTIqKi4NCmphZGksICoqTWVkaWFuKiogcGVuanVhbGFuIGFkYWxhaCAqKjEyKiogdW5pdC4NCg0KIyMgMy4gTWVuZ2hpdHVuZyBNb2R1cw0KKiBNb2R1cyBhZGFsYWggbmlsYWkgeWFuZyBwYWxpbmcgc2VyaW5nIG11bmN1bC4gRGFyaSBkYXRhLCBraXRhIGRhcGF0IG1lbGloYXQgYmFod2EgbmlsYWkgKioxMCoqIGRhbiAqKjEyKiogbXVuY3VsIGxlYmloIHNlcmluZyBkaWJhbmRpbmdrYW4geWFuZyBsYWlubnlhLg0KDQpqYWRpLCAqKk1vZHVzKiogcGVuanVhbGFuIGFkYWxhaCAqKjEwKiogdW5pdCBkYW4gKioxMioqIHVuaXQsIGthcmVuYSBrZWR1YW55YSBtdW5jdWwgKiozKioga2FsaS4NCg0KDQojIEIuIEtlc2VoYXRhbg0KDQoqKkthc3VzKiogLT4gU2VidWFoIGtsaW5payBtZW5nYW5hbGlzaXMgYmVyYXQgYmFkYW4gcGFzaWVuIHlhbmcgYmVya3VuanVuZyBzZWxhbWEgc2VtaW5nZ3UgdGVyYWtoaXIuIERhdGEgaW5pIGRpZ3VuYWthbiB1bnR1ayBtZW1haGFtaSBkaXN0cmlidXNpIGJlcmF0IGJhZGFuIHBhc2llbiB5YW5nIGRhdGFuZyBrZSBrbGluaWssIHNlcnRhIHVudHVrIG1lcmFuY2FuZyBwcm9ncmFtIGtlc2VoYXRhbiB5YW5nIHNlc3VhaS4gQmVyaWt1dCBhZGFsYWggZGF0YSBiZXJhdCBiYWRhbiBwYXNpZW4geWFuZyB0ZXJjYXRhdDoNCg0KXFsNClx0ZXh0e0RhdGEgQmVyYXQgQmFkYW4gKGRhbGFtIGtpbG9ncmFtKTp9IFw7IDQ1LCBcOyA1MCwgXDsgNTUsIFw7IDYwLCBcOyA2MCwgXDsgNzAsIFw7IDcwLCBcOyA3MCwgXDsgNzUsIFw7IDgwLCBcOyA4NSwgXDsgODUsIFw7IDkwLCBcOyA5NQ0KXF0NCg0KDQoNCioqQW5hbGlzaXMgVWt1cmFuIFBlbXVzYXRhbiBEYXRhKioNCg0KIyMgMS4gUmF0YS1yYXRhIChNZWFuKQ0KDQpSYXRhLXJhdGEgZGlndW5rYW4gdW50dWsgbWVuZ2V0YWh1aSBiZXJhdCBiYWRhbiByYXRhLXJhdGEgcGFzaWVuIHlhbmcgZGF0YW5nIGtlIGtsaW5pay4NCg0KRm9ybXVsYW55YToNClxbDQpcdGV4dHtSYXRhLXJhdGF9ID0gXGZyYWN7XHRleHR7SnVtbGFoIFRvdGFsIEJlcmF0IEJhZGFufX17XHRleHR7SnVtbGFoIFBhc2llbn19DQpcXQ0KDQojIyAyLiBNZWRpYW4NCg0KTWVkaWFuIGFkYWxhaCBiZXJhdCBiYWRhbiB5YW5nIGJlcmFkYSBkaSBwb3Npc2kgdGVuZ2FoIHNldGVsYWggZGF0YSBkaXVydXRrYW4uIE1lZGlhbiBtZW1iZXJpa2FuIGluZm9ybWFzaSB5YW5nIGxlYmloIHN0YWJpbCB0ZXJoYWRhcCBkYXRhIHlhbmcgbWVtaWxpa2kgcGVuY2lsYW4gKG91dGxpZXIpLg0KDQojIyAzLiBNb2R1cw0KDQpNb2R1cyBhZGFsYWggYmVyYXQgYmFkYW4geWFuZyBwYWxpbmcgc2VyaW5nIG11bmN1bCBkYWxhbSBkYXRhLiBNb2R1cyBtZW1iZXJpa2FuIGdhbWJhcmFuIG5pbGFpIGJlcmF0IGJhZGFuIHlhbmcgdW11bSBkaXRlbXVrYW4gcGFkYSBwYXNpZW4ga2xpbmlrLg0KDQoNCiMgTGFuZ2thaC1sYW5na2FoIEFuYWxpc2lzIEtlc2VoYXRhbg0KDQojIyAxLiBNZW5naGl0dW5nIFJhdGEtcmF0YQ0KDQoqIEp1bWxhaCB0b3RhbGJlcmF0IGJhZGFuOiQ0NSs1MCs1NSs2MCs2MCs2NSs3MCs3MCs3MCs3NSs4MCs4NSs4NSs5MCs5NT0xMDE1JA0KDQoqIEp1bWxhaCBwYXNpZW46IDE1DQoNCg0KKiBcWw0KXHRleHR7UmF0YS1yYXRhIEJlcmF0IEJhZGFufTpcZnJhY3sxMDE1fXsxNX0gPSA2Ny42N2tnDQpcXQ0KDQpKYWRpLCByYXRhLXJhdGEgYmVyYXQgYmFkYW4gcGFzaWVuIGFkYWxhaCAqKjY3LjY3ZyoqDQoNCiMjIDIuIE1lbmdoaXR1bmcgTWVkaWFuDQoNCiogVXJ1dGthbiBkYXRhIGJlcmF0IGJhZGFuOiAkNDUsNTAsNTUsNjAsNjAsNjUsNzAsNzAsNzAsNzUsODAsODUsODUsOTAsOTUkDQoNCiogS2FyZW5hIGp1bWxhaCBkYXRhIGFkYWxhaCBnYW5qaWwgKDE1KSwgbWVkaWFuIGFkYWxhaCBkYXRhIGtlLTggZGFsYW0gZGF0YSB5YW5nIGRpdXJ1dGthbiwgeWFpdHUgKio3MCBrZyoqDQoNCkphZGksICoqTWVkaWFuKiogYmVyYXQgYmFkYW4gYWRhbGFoICoqNzAga2cqKi4NCg0KIyMgMy4gTWVuZ2hpdHVuZyBNb2R1cw0KDQoqIE1vZHVzIGFkYWxhaCBuaWxhaSB5YW5nIHBhbGluZyBzZXJpbmcgbXVuY3VsLiBEYXJpIGRhdGEsIG5pbGFpICoqNzAga2cqKiBtdW5jdWwgc2ViYW55YWsgMyBrYWxpLCBsZWJpaCBiYW55YWsgZGliYW5kaW5na2FuIG5pbGFpIGxhaW5ueWEuDQoNCkphZGksICoqTW9kdXMqKiBiZXJhdCBiYWRhbiBhZGFsYWggKio3MCBrZyoqDQoNCiMgQy4gUGVuZGlkaWthbg0KDQoqKkthc3VzKiogLT4gU2VidWFoIHNla29sYWggaW5naW4gbWVuZ2FuYWxpc2lzIG5pbGFpIHVqaWFuIHNpc3dhIHVudHVrIG1hdGEgcGVsYWphcmFuIG1hdGVtYXRpa2EuIERhdGEgaW5pIGRpZ3VuYWthbiB1bnR1ayBtZW5nZXRhaHVpIGRpc3RyaWJ1c2kgbmlsYWkgc2lzd2EgZGFuIG1lbmdpZGVudGlmaWthc2kga2VidXR1aGFuIHBlbmluZ2thdGFuIHBlbWJlbGFqYXJhbi4gQmVyaWt1dCBhZGFsYWggbmlsYWkgdWppYW4gc2lzd2EgeWFuZyBkaXBlcm9sZWggZGFyaSBzYXR1IGtlbGFzOg0KXFsNClx0ZXh0e0RhdGEgTmlsYWkgVWppYW4gU2lzd2E6fSBcOyA1NSwgXDsgNjAsIFw7IDYwLCBcOyA2NSwgXDsgNzAsIFw7IDc1LCBcOyA3NSwgXDsgNzUsIFw7IDgwLCBcOyA4NSwgXDsgODUsIFw7IDkwLCBcOyA5MCwgXDsgOTUsIFw7IDEwMA0KXF0NCg0KKipBbmFsaXNpcyBVa3VyYW4gUGVtdXNhdGFuKioNCg0KIyMgMS4gUmF0YS1yYXRhIChNZWFuKQ0KDQpSYXRhLXJhdGEgZGlndW5ha2FuIHVudHVrIG1lbmdldGFodWkgbmlsYWkgcmF0YS1yYXRhIHVqaWFuIHNpc3dhLg0KDQpGb3JtdWxhbnlhOg0KXFsNClx0ZXh0e1JhdGEtcmF0YX0gPSBcZnJhY3tcdGV4dHtKdW1sYWggVG90YWwgTmlsYWl9fXtcdGV4dHtqdW1sYWggU2lzd2F9fQ0KXF0NCg0KIyMgMi4gTWVkaWFuDQoNCk1lZGlhbiBhZGFsYWggbmlsYWkgdGVuZ2FoIHNldGVsYWggZGF0YSBkaXVydXRrYW4uIE1lZGlhbiBtZW1iZXJpa2FuIGdhbWJhcmFuIG5pbGFpIHRlbmdhaCBkYXJpIGRpc3RyaWJ1c2kgc2lzd2EuDQoNCiMjIDMuIE1vZHVzIA0KDQpNb2R1cyBhZGFsYWggbmlsYWkgeWFuZyBwYWxpbmcgc2VyaW5nIG11bmN1bCBkYWxhbSBkYXRhLiBNb2R1cyBtZW51bmp1a2FuIG5pbGFpIHlhbmcgcGFsaW5nIHVtdW0gZGljYXBhaSBvbGVoIHNpc3dhLg0KDQojIExhbmdrYWgtbGFuZ2thaCBBbmFsaXNpcyBQZW5kaWRpa2FuDQoNCiMjIDEuIE1lbmdoaXR1bmcgUmF0YS1yYXRhDQoNCiogSnVtbGFoIHRvdGFsIG5pbGFpOiAkNTUrNjArNjArNjUrNzArNzUrNzUrNzUrODArODUrODUrOTArOTArOTUrMTAwPTExNjAkDQoNCiogSnVtbGFoIHNpc3dhOiAxNQ0KDQoqIFxbDQpcdGV4dHtSYXRhLXJhdGEgbmlsYWkgdWppYW59IDogXGZyYWN7MTE2MH17MTV9ID0gNzcuMzMNClxdDQoNCkphZGksICoqUmF0YS1yYXRhKE1lYW4pKiogbmlsYWkgdWppYW4gc2lzd2EgYWRhbGFoICoqNzcuMzMqKg0KDQojIyAyLiBNZW5naGl0dW5nIE1lZGlhbg0KDQoqIFVydXRrYW4gZGF0YSBuaWxhaTogJDU1LDYwLDYwLDY1LDcwLDc1LDc1LDc1LDgwLDg1LDg1LDkwLDkwLDk1LDEwMCQNCg0KKiBLYXJlbmEganVtbGFoIGRhdGEgYWRhbGFoIGdhbmppbCAoMTUpLCBtZWRpYW4gYWRhbGFoIGRhdGEga2UtOCwgeWFpdHUgKio3NSoqLg0KDQpKYWQsICoqTWVkaWFuKiogbmlsYWkgdWppYW4gc2lzd2EgYWRhbGFoICoqNzUqKg0KDQoNCiMjIDMuIE1lbmdoaXR1bmcgTW9kdXMNCg0KKiBNb2R1cyBhZGFsYWggbmlsYWkgeWFuZyBwYWxpbmcgc2VyaW5nIG11bmN1bC4gRGFyaSBkYXRhLCBuaWxhaSAqKjc1KiogbXVuY3VsIHNlYmFueWFrIDMga2FsaSwgbGViaWggYmFueWFrIGRpYmFuZGluZ2thbiBuaWxhaSBsYWlubnlhLg0KDQpKYWRpLCAqKk1vZHVzKiogbmlsYWkgdWppYW4gc2lzd2EgYWRhbGFqICoqNzUqKg0KDQoNCiMgS2VzaW1wdWxhbiBkYXJpIFVrdXJhbiBQZW11c2F0YW4gRGF0YToNClVrdXJhbiBwZW11c2F0YW4gZGF0YSwgc2VwZXJ0aSByYXRhLXJhdGEgKG1lYW4pLCBtZWRpYW4sIGRhbiBtb2R1cywgbWVydXBha2FuIGFsYXQgc3RhdGlzdGlrYSB5YW5nIHBlbnRpbmcgdW50dWsgbWVtYWhhbWkga2FyYWt0ZXJpc3RpayB1dGFtYSBkYXJpIHN1YXR1IGRhdGFzZXQuDQoNCkJlcmlrdXQgYWRhbGFoIGtlc2ltcHVsYW4gdW11bSBtZW5nZW5haSB1a3VyYW4gcGVtdXNhdGFuIGRhdGE6DQoNCioqMS4gUmF0YS1yYXRhIChNZWFuKSoqDQoNCiogUmF0YS1yYXRhIG1lbWJlcmlrYW4gZ2FtYmFyYW4gdW11bSB0ZW50YW5nIG5pbGFpIHRlbmdhaCBkYXJpIHNlbHVydWggZGF0YS4NCg0KKiBCZXJndW5hIHVudHVrIG1lbnVuanVrYW4ga2VjZW5kZXJ1bmdhbiBzZW50cmFsIGppa2EgZGF0YSB0aWRhayBtZW1pbGlraSBuaWxhaSBla3N0cmVtIChvdXRsaWVycykuDQoNCiogKipLZWxlbWFoYW4qKjogU2FuZ2F0IHNlbnNpdGlmIHRlcmhhZGFwIG91dGxpZXJzLCBzZWhpbmdnYSBkYXBhdCBtZW1iZXJpa2FuIGluZm9ybWFzaSB5YW5nIGt1cmFuZyBha3VyYXQgamlrYSB0ZXJkYXBhdCBuaWxhaSBla3N0cmVtLg0KDQoNCioqMi4gTWVkaWFuKioNCg0KKiBNZWRpYW4gYWRhbGFoIG5pbGFpIHRlbmdhaCBkYXJpIGRhdGEgc2V0ZWxhaCBkaXVydXRrYW4uDQoNCiogQmVyZ3VuYSB1bnVrIG1lbWFoYW1pIG5pbGFpIHRlbmdhaCB5YW5nIGxlYmloIHN0YWJpbCBkaWJhbmRpbmdrYW4gcmF0YS1yYXRhLCB0ZXJ1dGFtYSBqaWthIGRhdGEgbWVtaWxpa2kgb3V0bGllcnMgYXRhdSBkaXN0cmlidXNpIHRpZGFrIHNpbWV0cmlzLg0KDQoqICoqS2VsZWJpaGFuKio6IFRpZGFrIHRlcnBlbmdhcnVoIG9sZWggb3V0bGllcnMsIHNlaGluZ2dhIG1lbWJlcmlrYW4gZ2FtYmFyYW4geWFuZyBsZWJpaCByZXByZXNlbnRhdGlmIGRhbGFtIGRhdGEgeWFuZyB0aWRhayBzaW1ldHJpcy4NCg0KKiozLiBNb2R1cyoqDQoNCiogTW9kdXMgYWRhbGFoIG5pbGFpIHlhbmcgcGFsaW5nIHNlcmluZyBtdW5jdWwgZGFsYW0gZGF0YXNldC4NCg0KKiBCZXJndW5hIHVudHVrIG1lbmdlbmFsaSBwb2xhIGF0YXUgbmlsYWkgeWFuZyBkb21pbmFuIGRhbGFtIGRhdGEuDQoNCiogKipLZWxlYmloYW4qKjogQ29jb2sgdW50dWsgZGF0YSBrYXRlZ29yaWthbCBhdGF1IGRhdGEgZGlza3JpdCwgZGkgbWFuYSBuaWxhaSByYXRhLXJhdGEgYXRhdSBtZWRpYW4ga3VyYW5nIGJlcm1ha25hLg0KDQojIyBLZXNpbXB1bGFuIFVtdW06DQoqIFVrdXJhbiBwZW11c2F0YW4gZGF0YSBtZW1iYW50dSBkYWxhbSBtZW5nZ2FtYmFya2FuIGthcmFrdGVyaXN0aWsgdXRhbWEgZGF0YXNldCwgYmFpayBpdHUgZGlzdHJpYnVzaSBuaWxhaSwga2VjZW5kZXJ1bmdhbiBkb21pbmFuLCBtYXVwdW4gbmlsYWkgdGVuZ2FoLg0KKiAqKlBlbWlsaWhhbiB1a3VyYW4geWFuZyB0ZXBhdCBiZXJnYW50dW5nIHBhZGEga2FyYWt0ZXJpc3RpayBkYXRhOioqDQogICAgKiBHdW5ha2FuICoqTWVhbiogdW50dWsgZGF0YSBzaW1ldHJpcyB0YW5vYSBvdXRsaWVycy4NCiAgICAqIEd1bmFrYW4gKipNZWRpYW4qKiB1bnR1ayBkYXRhIHlhbmcgbWVtaWxpa2kgb3V0bGllcnMgYXRhdSBkaXN0cmlidXNpIHRpZGFrIHNpbWV0cmlzLg0KICAgICogR3VuYWthbiAqKk1vZHVzKiogdW50dWsgbWVuZW11a2FuIG5pbGFpIHlhbmcgcGFsaW5nIHNlcmluZyBtdW5jdWwsIHRlcnV0YW1hIHBhZGEgZGF0YSBkaXNrcml0IGF0YXUga2F0ZWdvcmlhbC4NCiogS29tYmluYXNpIGRhcmkga2V0aWdhIHVrdXJhbiBpbmkgc2VyaW5nIG1lbWJlcmlrYW4gd2F3YXNhbiB5YW5nIGxlYmloIGxlbmdrYXAgZGFsYW0gYW5hbGlzaXMgZGF0YS4NCg0KRGVuZ2FuIG1lbWFoYW1pIGtlbGViaWhhbiBkYW4ga2V0ZXJiYXRhc2FuIG1hc2luZy1tYXNpbmcgdWt1cmFuIHBlbXVzYXRhbiwgYW5hbGlzaXMgZGF0YSBtZW5qYWRpIGxlYmloIGFrdXJhdCBkYW4gcmVsZXZhbiB1bnR1ayBwZW5nYW1iaWxhbiBrZXB1dHVzYW4uDQoNCg0KIyBSZWZyZW5zaQ0KLSBEU2NpZW5jZWxhYnMuIChuLmQuKSBQZW5nYW50YXIgU3RhdGlzdGlrYSB1bnR1ayBTYWlucyBEYXRhLiBCb29rZG93bi4gUmV0cmlldmVkIGZyb20gPGEgaHJlZiA9ICJodHRwczovL2Jvb2tkb3duLm9yZy9kc2NpZW5jZWxhYnMvc3RhdGlzdGlrYV9kYXNhci9fYm9vay8iID4gS2xpayBkaXNpbmk8L2E+DQotIE5pc2EgQW1hbGlhIFB1dHJpIEksUy4gKDIwMjQpLiBLZXRhaHVpIE1hY2FtIFVrdXJhbiBQZW11c2F0YW4gRGF0YS5Cb29rZG93bi4gUmV0cmlldmVkIGZyb20gPGEgaHJlZiA9ICJodHRwczovL2R0ZS50ZWxrb211bml2ZXJzaXR5LmFjLmlkL2tldGFodWktbWFjYW0tdWt1cmFuLXBlbXVzYXRhbi1kYXRhLWJlZ2luaS1wZW5qZWxhc2FuLWxlbmdrYXBueWEvIj5LbGlrIGRpc2luaTwvYT4NCi0gRHIuQW5pdGEgUmFoYXl1LCBTLlNpLiwgTS5TaS4gVWt1cmFuIFBlbXVzYXRhbiBEYXRhLiBCaW51cyBOdXNhbnRhcmEuQm9va2Rvd24uIFJldHJpZXZlZCBmcm9tIDxhIGhyZWYgPSAiaHR0cHM6Ly9iaW51cy5hYy5pZC9tYWxhbmcvMjAyMi8wNC91a3VyYW4tcGVtdXNhdGFuLWRhdGEvIiA+a2xpayBkaXNpbmk8L2E+DQotIERyLmlyLlByaW1hIEtyaXN0YWxpbmEsTVQuICgyMDIwKS4gU3RhdGlzdGlrIERlc2tyaXB0aWY6IFVrdXJhbiBQZW11c2F0YW4gRGF0YS5Nb2R1bCAzLlBlbmdhbnRhciBzdGF0aXN0aWsuPGEgaHJlZiA9ICJodHRwczovL3ByaW1hLmxlY3R1cmVyLnBlbnMuYWMuaWQvU3RhdGlzdGlrL1RvcGlrLTMucGRmIj5LbGlrIERpc2luaTwvYT4NCg0KDQoNCg0KDQoNCg0K