Ukuran Pemutusan Data

Menghitung Mean, Median, Modus Data Berkelompok

1 Menghitung Mean, Median, Modus Data Berkelompok

1.1 Mean Data Kelompok

1.1.1 Definisi Mean Data Kelompok

Mean data kelompok adalah pengukuran rata-rata yang dihitung dari kumpulan data yang telah dibagi dalam beberapa kelompok atau kelas interval. Untuk data kelompok, mean dihitung dengan rumus: \[ \text{Mean} = \frac{\sum (f \cdot x̄)}{\sum f} \]

Penjelasan Rumus:

  • \(f\): Frekuensi setiap kelas.

  • \(xÌ„\): Titik tengah setiap kelas.

  • \(f \cdot xÌ„\): Hasil perkalian frekuensi dengan titik tengah.

  • \(\sum f\): Jumlah total frekuensi.

  • \(\sum (f \cdot xÌ„)\): Total hasil perkalian antara \(f\) dan \(xÌ„\).

1.1.2 Contoh Mean Data Berkelompok

Kelas Interval Frekuensi (f)
10 - 20 5
20 - 30 8
30 - 40 15
40 - 50 10
50 - 60 2

Penyelesaian:

Kelas Interval Frekuensi (f) Titik Tengah (x̄) f ⋅ x̄
10 - 20 5 15 75
20 - 30 8 25 200
30 - 40 15 35 525
40 - 50 10 45 450
50 - 60 2 55 110

Langkah-langkah Perhitungan

  1. Menghitung \(f \cdot \bar{x}\)
  • Kelas 10 - 20: \(5 \times 15 = 75\)
  • Kelas 20 - 30: \(8 \times 25 = 200\)
  • Kelas 30 - 40: \(15 \times 35 = 525\)
  • Kelas 40 - 50: \(10 \times 45 = 450\)
  • Kelas 50 - 60: \(2 \times 55 = 110\)
  1. Menjumlahkan hasil perkalian \(f \cdot \bar{x}\)

\[ 75 + 200 + 525 + 450 + 110 = 1360 \]

  1. Menjumlahkan frekuensi \(f\)

\[ 5 + 8 + 15 + 10 + 2 = 40 \]

  1. Menghitung Mean

\[ \text{Mean} = \frac{1360}{40} = 34 \]

1.1.3 Mean Data Kelompok dalam Boxplot

1.1.4 Mean Data Kelompok Dalam Histogram

1.2 Median Data Kelompok

1.2.1 Defini Median Data Kelompok

Median data kelompok merupakan jenis data median yang biasanya disajikan dalam bentuk tabel frekuensi dan telah dikelompokkan dalam kelas interval secara matematis. Untuk data kelompok, mean dihitung dengan rumus: \[ \text{Median} = L + \left( \frac{\frac{N}{2} - F}{f_m} \right) \cdot c \]

Penjelasan Rumus:

  • \(L\): Batas bawah kelas median.

  • \(N\): Jumlah total frekuensi (\(\sum f\)).

  • \(F\): Frekuensi kumulatif sebelum kelas median.

  • \(f_m\): Frekuensi kelas median.

  • \(c\): Lebar kelas.

Langkah-langkah:

  1. Hitung jumlah total frekuensi (\(N = \sum f\)).

  2. Cari posisi median dengan \(N / 2\).

  3. Identifikasi kelas median (kelas di mana kumulatif frekuensi mencakup \(N / 2\)).

  4. Substitusi nilai \(L\), \(F\), \(f_m\), dan \(c\) ke dalam rumus.

1.2.2 Contoh Mean Data Berkelompok

Kelas Interval Frekuensi (f)
10 - 20 5
20 - 30 8
30 - 40 15
40 - 50 10
50 - 60 2

Penyelesaian:

Kelas Interval Frekuensi (f) Frekuensi Kumulatif
10 - 20 5 5
20 - 30 8 13
30 - 40 15 28
40 - 50 10 38
50 - 60 2 40
  • \(N = 40\), maka \(N / 2 = 20\).

  • Kelas median adalah 30 - 40 karena kumulatif frekuensi sebelum 20 adalah 13, dan 28 mencakup 20.

Parameter:

  • \(L = 30\) (batas bawah kelas median),

  • \(F = 13\) (frekuensi kumulatif sebelum kelas median),

  • \(f_m = 15\) (frekuensi kelas median),

  • \(c = 10\) (lebar kelas).

Substitusi: \[ \text{Median} = 30 + \left( \frac{20 - 13}{15} \right) \cdot 10 \]

\[ \text{Median} = 30 + \left( \frac{7}{15} \right) \cdot 10 = 30 + 4.67 = 34.67 \]

Hasil: Median = 34.67

1.2.3 Median Data Kelompok Dalam Boxplot

1.2.4 Median Data Kelompok Dalam Histogram

1.3 Modus Data Kelompok

1.3.1 Definisi Modus Data Kelompok

Modus data kelompok adalah nilai yang muncul berulang kali dalam sebuah himpunan tertentu. Untuk data kelompok, mean dihitung dengan rumus:

\[ \text{Modus} = L + \left( \frac{f_m - f_{m-1}}{(f_m - f_{m-1}) + (f_m - f_{m+1})} \right) \cdot c \]

Penjelasan Rumus:

  • \(L\): Batas bawah kelas modus.

  • \(f_m\): Frekuensi kelas modus (frekuensi terbesar).

  • \(f_{m-1}\): Frekuensi kelas sebelum kelas modus.

  • \(f_{m+1}\): Frekuensi kelas setelah kelas modus.

  • \(c\): Lebar kelas.

Langkah-langkah:

  1. Tentukan kelas modus (kelas dengan frekuensi terbesar).

  2. Substitusi parameter \(L\), \(f_m\), \(f_{m-1}\), \(f_{m+1}\), dan \(c\) ke dalam rumus.

1.3.2 Contoh Mean Data Berkelompok

Kelas Interval Frekuensi (f)
10 - 20 5
20 - 30 8
30 - 40 15
40 - 50 10
50 - 60 2

Kelas modus adalah 30 - 40 (\(f_m = 15\)).

Parameter:

  • \(L = 30\),

  • \(f_m = 15\),

  • \(f_{m-1} = 8\),

  • \(f_{m+1} = 10\),

  • \(c = 10\).

Substitusi: \[ \text{Modus} = 30 + \left( \frac{15 - 8}{(15 - 8) + (15 - 10)} \right) \cdot 10 \] \[ \text{Modus} = 30 + \left( \frac{7}{7 + 5} \right) \cdot 10 = 30 + \left( \frac{7}{12} \right) \cdot 10 \] \[ \text{Modus} = 30 + 5.83 = 35.83 \]

Hasil: Modus = 35.83

###Modus Data Kelompok Dalam Boxplot

1.3.3 Modus Data Kelompok Dalam Histogram

2 Ukuran Pemusatan dalam Studi Kasus

2.1 Bisnis: Menghitung Rata-rata Penjualan

2.1.1 Studi Kasus:

Sebuah perusahaan retail ingin mengetahui rata-rata penjualan produk mereka dalam satu minggu untuk menilai performa bisnis dan merencanakan strategi penjualan. Data penjualan unit produk selama 7 hari terakhir adalah sebagai berikut:

  • Hari 1: 150 unit
  • Hari 2: 180 unit
  • Hari 3: 160 unit
  • Hari 4: 170 unit
  • Hari 5: 160 unit
  • Hari 6: 175 unit
  • Hari 7: 165 unit

Tujuan: Menghitung rata-rata (mean) penjualan per hari.

2.1.2 Langkah-Langkah Menghitung Rata-rata (Mean):

Untuk menghitung rata-rata penjualan, kita jumlahkan seluruh jumlah unit penjualan dan kemudian bagi dengan jumlah hari yang diamati (dalam hal ini, 7 hari).

  1. Jumlahkan seluruh nilai penjualan:

    150 + 180 + 160 + 170 + 160 + 175 + 165 = 1.160 unit

  2. Bagi jumlah total dengan jumlah hari (7 hari):

    Rata-rata = 1.160 / 7 = 165,71 unit

Hasil: Rata-rata penjualan per hari adalah sekitar 165,71 unit. Ini memberikan gambaran umum mengenai kinerja penjualan selama seminggu.

2.2 Kesehatan: Menghitung Rata-rata Tekanan Darah

2.2.1 Studi Kasus:

Seorang dokter ingin menganalisis rata-rata tekanan darah dari beberapa pasien yang datang untuk pemeriksaan kesehatan. Data tekanan darah yang diukur pada 5 pasien adalah sebagai berikut (dalam mmHg):

  • Pasien 1: 120/80 mmHg
  • Pasien 2: 125/85 mmHg
  • Pasien 3: 130/90 mmHg
  • Pasien 4: 118/78 mmHg
  • Pasien 5: 122/82 mmHg

Tujuan: Menghitung rata-rata tekanan darah sistolik dan diastolik.

2.2.2 Langkah-Langkah Menghitung Rata-rata (Mean) Tekanan Darah:

  • Tekanan darah sistolik (angka pertama)

    120 + 125 + 130 + 118 + 122 = 615 mmHg

    Jumlahkan angka sistolik pada kelima pasien dan bagi dengan jumlah pasien (5):

    Rata-rata sistolik = 615 / 5 = 123 mmHg

  • Tekanan darah diastolik (angka kedua)

    80 + 85 + 90 + 78 + 82 = 415 mmHg

    Jumlahkan angka diastolik pada kelima pasien dan bagi dengan jumlah pasien (5):

    Rata-rata diastolik = 415 / 5 = 83 mmHg

Hasil:

  • Rata-rata tekanan darah sistolik adalah 123 mmHg.

  • Rata-rata tekanan darah diastolik adalah 83 mmHg.

2.3 Pendidikan: Menghitung Rata-rata Nilai Ujian Siswa

2.3.1 Studi Kasus:

Seorang guru ingin mengetahui rata-rata nilai ujian matematika dari 6 siswa di kelasnya untuk mengevaluasi hasil belajar mereka. Berikut adalah nilai ujian matematika para siswa:

  • Siswa 1: 85

  • Siswa 2: 90

  • Siswa 3: 75

  • Siswa 4: 88

  • Siswa 5: 92

  • Siswa 6: 80

Tujuan: Menghitung rata-rata nilai ujian matematika.

2.3.2 Langkah-Langkah Menghitung Rata-rata (Mean) Nilai:

  1. Jumlahkan seluruh nilai ujian:

    85 + 90 + 75 + 88 + 92 + 80 = 510

  2. Bagi jumlah total dengan jumlah siswa (6 siswa):

    Rata-rata nilai = 510 / 6 = 85

Hasil: Rata-rata nilai ujian matematika para siswa adalah 85.

LS0tDQp0aXRsZTogIlVrdXJhbiBQZW11dHVzYW4gRGF0YSINCnN1YnRpdGxlOiAiTWVuZ2hpdHVuZyBNZWFuLCBNZWRpYW4sIE1vZHVzIERhdGEgQmVya2Vsb21wb2siDQphdXRob3I6IA0KICAtICJOb3ZhIFNpdG9ydXMgNTIyNDAwMjMiDQpkYXRlOiAgImByIGZvcm1hdChTeXMuRGF0ZSgpLCAnJUIgJWQsICVZJylgIg0Kb3V0cHV0Og0KICBybWRmb3JtYXRzOjpyZWFkdGhlZG93bjogICAjIGh0dHBzOi8vZ2l0aHViLmNvbS9qdWJhL3JtZGZvcm1hdHMNCiAgICBzZWxmX2NvbnRhaW5lZDogdHJ1ZQ0KICAgIHRodW1ibmFpbHM6IHRydWUNCiAgICBsaWdodGJveDogdHJ1ZQ0KICAgIGdhbGxlcnk6IHRydWUNCiAgICBudW1iZXJfc2VjdGlvbnM6IHRydWUNCiAgICBsaWJfZGlyOiBsaWJzDQogICAgZGZfcHJpbnQ6ICJwYWdlZCINCiAgICBjb2RlX2ZvbGRpbmc6ICJzaG93Ig0KICAgIGNvZGVfZG93bmxvYWQ6IHllcw0KICAgIGNzczogInN0eWxlLmNzcyINCi0tLQ0KDQo8aW1nIHNyYz0iTnMucG5nIiB3aWR0aD0iMzAwIiBzdHlsZT0iZGlzcGxheTogYmxvY2s7IG1hcmdpbjogYXV0bzsiIGFsdD0iIj4NCg0KDQojIE1lbmdoaXR1bmcgTWVhbiwgTWVkaWFuLCBNb2R1cyBEYXRhIEJlcmtlbG9tcG9rDQojIyBNZWFuIERhdGEgS2Vsb21wb2sNCiMjIyBEZWZpbmlzaSBNZWFuIERhdGEgS2Vsb21wb2sNCk1lYW4gZGF0YSBrZWxvbXBvayBhZGFsYWggcGVuZ3VrdXJhbiByYXRhLXJhdGEgeWFuZyBkaWhpdHVuZyBkYXJpIGt1bXB1bGFuIGRhdGEgeWFuZyB0ZWxhaCBkaWJhZ2kgZGFsYW0gYmViZXJhcGEga2Vsb21wb2sgYXRhdSBrZWxhcyBpbnRlcnZhbC4gVW50dWsgZGF0YSBrZWxvbXBvaywgbWVhbiBkaWhpdHVuZyBkZW5nYW4gcnVtdXM6DQpcWw0KXHRleHR7TWVhbn0gPSBcZnJhY3tcc3VtIChmIFxjZG90IHjMhCl9e1xzdW0gZn0NClxdDQoNClBlbmplbGFzYW4gUnVtdXM6DQoNCi0gXChmXCk6IEZyZWt1ZW5zaSBzZXRpYXAga2VsYXMuDQoNCi0gXCh4zIRcKTogVGl0aWsgdGVuZ2FoIHNldGlhcCBrZWxhcy4NCg0KLSBcKGYgXGNkb3QgeMyEXCk6IEhhc2lsIHBlcmthbGlhbiBmcmVrdWVuc2kgZGVuZ2FuIHRpdGlrIHRlbmdhaC4NCg0KLSBcKFxzdW0gZlwpOiBKdW1sYWggdG90YWwgZnJla3VlbnNpLg0KDQotIFwoXHN1bSAoZiBcY2RvdCB4zIQpXCk6IFRvdGFsIGhhc2lsIHBlcmthbGlhbiBhbnRhcmEgXChmXCkgZGFuIFwoeMyEXCkuDQoNCg0KIyMjIENvbnRvaCBNZWFuIERhdGEgQmVya2Vsb21wb2sNCnwgKipLZWxhcyBJbnRlcnZhbCoqIHwgKipGcmVrdWVuc2kgKGYpKip8DQp8LS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tfA0KfCAxMCAtIDIwICAgICAgICAgICB8IDUgICAgICAgICAgICAgICAgIHwgDQp8IDIwIC0gMzAgICAgICAgICAgIHwgOCAgICAgICAgICAgICAgICAgfA0KfCAzMCAtIDQwICAgICAgICAgICB8IDE1ICAgICAgICAgICAgICAgIHwgDQp8IDQwIC0gNTAgICAgICAgICAgIHwgMTAgICAgICAgICAgICAgICAgfCANCnwgNTAgLSA2MCAgICAgICAgICAgfCAyICAgICAgICAgICAgICAgICB8DQoNCg0KUGVueWVsZXNhaWFuOg0KDQp8ICoqS2VsYXMgSW50ZXJ2YWwqKiB8ICoqRnJla3VlbnNpIChmKSoqIHwgKipUaXRpayBUZW5nYWggKHjMhCkqKiB8ICoqZiDii4UgeMyEKiogfA0KfC0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tfA0KfCAxMCAtIDIwICAgICAgICAgICB8IDUgICAgICAgICAgICAgICAgIHwgMTUgICAgICAgICAgICAgICAgICAgIHwgNzUgICAgICAgICB8DQp8IDIwIC0gMzAgICAgICAgICAgIHwgOCAgICAgICAgICAgICAgICAgfCAyNSAgICAgICAgICAgICAgICAgICAgfCAyMDAgICAgICAgIHwNCnwgMzAgLSA0MCAgICAgICAgICAgfCAxNSAgICAgICAgICAgICAgICB8IDM1ICAgICAgICAgICAgICAgICAgICB8IDUyNSAgICAgICAgfA0KfCA0MCAtIDUwICAgICAgICAgICB8IDEwICAgICAgICAgICAgICAgIHwgNDUgICAgICAgICAgICAgICAgICAgIHwgNDUwICAgICAgICB8DQp8IDUwIC0gNjAgICAgICAgICAgIHwgMiAgICAgICAgICAgICAgICAgfCA1NSAgICAgICAgICAgICAgICAgICAgfCAxMTAgICAgICAgIHwNCg0KDQpMYW5na2FoLWxhbmdrYWggUGVyaGl0dW5nYW4NCg0KMS4gTWVuZ2hpdHVuZyBcKCBmIFxjZG90IFxiYXJ7eH0gXCkNCg0KLSBLZWxhcyAxMCAtIDIwOiBcKCA1IFx0aW1lcyAxNSA9IDc1IFwpDQotIEtlbGFzIDIwIC0gMzA6IFwoIDggXHRpbWVzIDI1ID0gMjAwIFwpDQotIEtlbGFzIDMwIC0gNDA6IFwoIDE1IFx0aW1lcyAzNSA9IDUyNSBcKQ0KLSBLZWxhcyA0MCAtIDUwOiBcKCAxMCBcdGltZXMgNDUgPSA0NTAgXCkNCi0gS2VsYXMgNTAgLSA2MDogXCggMiBcdGltZXMgNTUgPSAxMTAgXCkNCg0KMi4gTWVuanVtbGFoa2FuIGhhc2lsIHBlcmthbGlhbiBcKCBmIFxjZG90IFxiYXJ7eH0gXCkNCg0KXFsNCjc1ICsgMjAwICsgNTI1ICsgNDUwICsgMTEwID0gMTM2MA0KXF0NCg0KMy4gTWVuanVtbGFoa2FuIGZyZWt1ZW5zaSBcKCBmIFwpDQoNClxbDQo1ICsgOCArIDE1ICsgMTAgKyAyID0gNDANClxdDQoNCjQuIE1lbmdoaXR1bmcgTWVhbg0KDQoNClxbDQpcdGV4dHtNZWFufSA9IFxmcmFjezEzNjB9ezQwfSA9IDM0DQpcXQ0KDQoNCiMjIyBNZWFuIERhdGEgS2Vsb21wb2sgZGFsYW0gQm94cGxvdA0KDQpgYGB7ciwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0NCiMgTWVtdWF0IGxpYnJhcnkNCmxpYnJhcnkocGxvdGx5KQ0KDQojIERhdGE6IGR1YSBza2VuYXJpbywgc2F0dSBkZW5nYW4gb3V0bGllcnMsIHNhdHUgdGFucGEgb3V0bGllcnMNCmRhdGFfZGVuZ2FuX291dGxpZXJzIDwtIGMoMTUsIDI1LCAzNSwgNDUsIDU1LCAxNTApICAjIERhdGEgZGVuZ2FuIG91dGxpZXIgKDE1MCkNCmRhdGFfdGFucGFfb3V0bGllcnMgPC0gYygxNSwgMjUsIDM1LCA0NSwgNTUpICAjIERhdGEgdGFucGEgb3V0bGllcnMNCg0KIyBNZW5naGl0dW5nIHJhdGEtcmF0YSB1bnR1ayBrZWR1YSBkYXRhc2V0DQptZWFuX2Rlbmdhbl9vdXRsaWVycyA8LSBtZWFuKGRhdGFfZGVuZ2FuX291dGxpZXJzKQ0KbWVhbl90YW5wYV9vdXRsaWVycyA8LSBtZWFuKGRhdGFfdGFucGFfb3V0bGllcnMpDQoNCiMgTWVuZ2dhYnVuZ2thbiBkYXRhIGtlIGRhbGFtIHNhdHUgZGF0YSBmcmFtZSB1bnR1ayB2aXN1YWxpc2FzaQ0KZGF0YSA8LSBkYXRhLmZyYW1lKA0KICBOaWxhaSA9IGMoZGF0YV9kZW5nYW5fb3V0bGllcnMsIGRhdGFfdGFucGFfb3V0bGllcnMpLA0KICBLZWxvbXBvayA9IHJlcChjKCJEZW5nYW4gT3V0bGllcnMiLCAiVGFucGEgT3V0bGllcnMiKSwgDQogICAgICAgICAgICAgICAgIHRpbWVzID0gYyhsZW5ndGgoZGF0YV9kZW5nYW5fb3V0bGllcnMpLCBsZW5ndGgoZGF0YV90YW5wYV9vdXRsaWVycykpKQ0KKQ0KDQojIE1lbWJ1YXQgYm94cGxvdCBtZW5nZ3VuYWthbiBQbG90bHkgZGVuZ2FuIG91dGxpZXJzIGRpdGFtcGlsa2FuIGRhbiB3YXJuYSBrdW5pbmcgZGFuIG1lcmFoDQpwbG90IDwtIHBsb3RfbHkoDQogIGRhdGEsIA0KICB5ID0gfk5pbGFpLCANCiAgY29sb3IgPSB+S2Vsb21wb2ssIA0KICBjb2xvcnMgPSBjKCJyZWQiLCAieWVsbG93IiksICAjIFdhcm5hIG1lcmFoIHVudHVrIFRhbnBhIE91dGxpZXJzLCBrdW5pbmcgdW50dWsgRGVuZ2FuIE91dGxpZXJzDQogIHR5cGUgPSAiYm94IiwgDQogIGJveHBvaW50cyA9ICJvdXRsaWVycyIgICMgTWVuYW1waWxrYW4gdGl0aWsgb3V0bGllcnMNCikgJT4lDQogIGxheW91dCgNCiAgICB0aXRsZSA9ICJQZW5nYXJ1aCBPdXRsaWVycyB0ZXJoYWRhcCBNZWFuIiwNCiAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiRnJla3VlbnNpIiksDQogICAgeGF4aXMgPSBsaXN0KHRpdGxlID0gIktlbGFzIEludGVydmFsIiksDQogICAgYW5ub3RhdGlvbnMgPSBsaXN0KA0KICAgICAgbGlzdCgNCiAgICAgICAgeCA9ICJEZW5nYW4gT3V0bGllcnMiLA0KICAgICAgICB5ID0gbWVhbl9kZW5nYW5fb3V0bGllcnMsDQogICAgICAgIHRleHQgPSBwYXN0ZSgiTWVhbjoiLCByb3VuZChtZWFuX2Rlbmdhbl9vdXRsaWVycywgMikpLA0KICAgICAgICBzaG93YXJyb3cgPSBUUlVFLA0KICAgICAgICBhcnJvd2hlYWQgPSAyDQogICAgICApLA0KICAgICAgbGlzdCgNCiAgICAgICAgeCA9ICJUYW5wYSBPdXRsaWVycyIsDQogICAgICAgIHkgPSBtZWFuX3RhbnBhX291dGxpZXJzLA0KICAgICAgICB0ZXh0ID0gcGFzdGUoIk1lYW46Iiwgcm91bmQobWVhbl90YW5wYV9vdXRsaWVycywgMikpLA0KICAgICAgICBzaG93YXJyb3cgPSBUUlVFLA0KICAgICAgICBhcnJvd2hlYWQgPSAyDQogICAgICApDQogICAgKQ0KICApDQoNCiMgTWVuYW1waWxrYW4gcGxvdA0KcGxvdA0KDQpgYGANCg0KIyMjIE1lYW4gRGF0YSBLZWxvbXBvayBEYWxhbSBIaXN0b2dyYW0NCmBgYHtyLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQ0KIyBNZW11YXQgbGlicmFyeQ0KbGlicmFyeShwbG90bHkpDQoNCiMgRGF0YTogZHVhIHNrZW5hcmlvLCBzYXR1IGRlbmdhbiBvdXRsaWVycywgc2F0dSB0YW5wYSBvdXRsaWVycw0KZGF0YV9kZW5nYW5fb3V0bGllcnMgPC0gYygxNSwgMjUsIDM1LCA0NSwgNTUsIDE1MCkgICMgRGF0YSBkZW5nYW4gb3V0bGllciAoMTUwKQ0KZGF0YV90YW5wYV9vdXRsaWVycyA8LSBjKDE1LCAyNSwgMzUsIDQ1LCA1NSkgICMgRGF0YSB0YW5wYSBvdXRsaWVycw0KDQojIE1lbWJ1YXQgZGVuc2l0eSBwbG90IHVudHVrIG1hc2luZy1tYXNpbmcgZGF0YXNldA0KZGVuc2l0eV9kZW5nYW5fb3V0bGllcnMgPC0gZGVuc2l0eShkYXRhX2Rlbmdhbl9vdXRsaWVycykNCmRlbnNpdHlfdGFucGFfb3V0bGllcnMgPC0gZGVuc2l0eShkYXRhX3RhbnBhX291dGxpZXJzKQ0KDQojIFBhc3Rpa2FuIHRpZGFrIGFkYSBuaWxhaSBuZWdhdGlmIGRpIHggZGFuIHkNCmRlbnNpdHlfZGVuZ2FuX291dGxpZXJzJHggPC0gcG1heCgwLCBkZW5zaXR5X2Rlbmdhbl9vdXRsaWVycyR4KQ0KZGVuc2l0eV90YW5wYV9vdXRsaWVycyR4IDwtIHBtYXgoMCwgZGVuc2l0eV90YW5wYV9vdXRsaWVycyR4KQ0KDQojIE1lbmdoaXR1bmcgcmF0YS1yYXRhDQptZWFuX2Rlbmdhbl9vdXRsaWVycyA8LSBtZWFuKGRhdGFfZGVuZ2FuX291dGxpZXJzKQ0KbWVhbl90YW5wYV9vdXRsaWVycyA8LSBtZWFuKGRhdGFfdGFucGFfb3V0bGllcnMpDQoNCiMgTWVtYnVhdCBwbG90IG1lbmdndW5ha2FuIFBsb3RseQ0KcGxvdCA8LSBwbG90X2x5KCkgJT4lDQogICMgTWVuYW1iYWhrYW4gZGVuc2l0eSBwbG90IHVudHVrIGRhdGFzZXQgZGVuZ2FuIG91dGxpZXJzDQogIGFkZF90cmFjZSgNCiAgICB4ID0gfmRlbnNpdHlfZGVuZ2FuX291dGxpZXJzJHgsDQogICAgeSA9IH5kZW5zaXR5X2Rlbmdhbl9vdXRsaWVycyR5LA0KICAgIHR5cGUgPSAnc2NhdHRlcicsDQogICAgbW9kZSA9ICdsaW5lcycsDQogICAgbmFtZSA9ICJEZW5nYW4gT3V0bGllcnMiLA0KICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gJ3JnYmEoMjIyLCA0NSwgMzgsIDAuOCknLCB3aWR0aCA9IDIpDQogICkgJT4lDQogICMgTWVuYW1iYWhrYW4gZGVuc2l0eSBwbG90IHVudHVrIGRhdGFzZXQgdGFucGEgb3V0bGllcnMNCiAgYWRkX3RyYWNlKA0KICAgIHggPSB+ZGVuc2l0eV90YW5wYV9vdXRsaWVycyR4LA0KICAgIHkgPSB+ZGVuc2l0eV90YW5wYV9vdXRsaWVycyR5LA0KICAgIHR5cGUgPSAnc2NhdHRlcicsDQogICAgbW9kZSA9ICdsaW5lcycsDQogICAgbmFtZSA9ICJUYW5wYSBPdXRsaWVycyIsDQogICAgbGluZSA9IGxpc3QoY29sb3IgPSAncmdiYSgzOCwgMTY2LCA5MSwgMC44KScsIHdpZHRoID0gMikNCiAgKSAlPiUNCiAgIyBNZW5hbWJhaGthbiBnYXJpcyByYXRhLXJhdGEgdW50dWsgZGF0YXNldCBkZW5nYW4gb3V0bGllcnMNCiAgYWRkX3RyYWNlKA0KICAgIHggPSBjKG1lYW5fZGVuZ2FuX291dGxpZXJzLCBtZWFuX2Rlbmdhbl9vdXRsaWVycyksDQogICAgeSA9IGMoMCwgbWF4KGRlbnNpdHlfZGVuZ2FuX291dGxpZXJzJHkpKSwNCiAgICB0eXBlID0gInNjYXR0ZXIiLA0KICAgIG1vZGUgPSAibGluZXMiLA0KICAgIG5hbWUgPSAiUmF0YS1yYXRhIChEZW5nYW4gT3V0bGllcnMpIiwNCiAgICBsaW5lID0gbGlzdChjb2xvciA9ICdyZ2JhKDIyMiwgNDUsIDM4LCAwLjYpJywgZGFzaCA9ICdkYXNoJykNCiAgKSAlPiUNCiAgIyBNZW5hbWJhaGthbiBnYXJpcyByYXRhLXJhdGEgdW50dWsgZGF0YXNldCB0YW5wYSBvdXRsaWVycw0KICBhZGRfdHJhY2UoDQogICAgeCA9IGMobWVhbl90YW5wYV9vdXRsaWVycywgbWVhbl90YW5wYV9vdXRsaWVycyksDQogICAgeSA9IGMoMCwgbWF4KGRlbnNpdHlfdGFucGFfb3V0bGllcnMkeSkpLA0KICAgIHR5cGUgPSAic2NhdHRlciIsDQogICAgbW9kZSA9ICJsaW5lcyIsDQogICAgbmFtZSA9ICJSYXRhLXJhdGEgKFRhbnBhIE91dGxpZXJzKSIsDQogICAgbGluZSA9IGxpc3QoY29sb3IgPSAncmdiYSgzOCwgMTY2LCA5MSwgMC42KScsIGRhc2ggPSAnZGFzaCcpDQogICkgJT4lDQogIGxheW91dCgNCiAgICB0aXRsZSA9ICJQZW5nYXJ1aCBPdXRsaWVycyB0ZXJoYWRhcCBNZWFuIHBhZGEgRGVuc2l0eSBQbG90IiwNCiAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiRnJla3VlbnNpIiksDQogICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gIktlbGFzIEludGVydmFsIiksDQogICAgYW5ub3RhdGlvbnMgPSBsaXN0KA0KICAgICAgIyBBbm90YXNpIHVudHVrIHJhdGEtcmF0YSBkYXRhc2V0IGRlbmdhbiBvdXRsaWVycw0KICAgICAgbGlzdCgNCiAgICAgICAgeCA9IG1lYW5fZGVuZ2FuX291dGxpZXJzLA0KICAgICAgICB5ID0gbWF4KGRlbnNpdHlfZGVuZ2FuX291dGxpZXJzJHkpICogMC45LA0KICAgICAgICB0ZXh0ID0gcGFzdGUoIk1lYW46Iiwgcm91bmQobWVhbl9kZW5nYW5fb3V0bGllcnMsIDIpKSwNCiAgICAgICAgc2hvd2Fycm93ID0gVFJVRSwNCiAgICAgICAgYXJyb3doZWFkID0gMiwNCiAgICAgICAgYXggPSAwLA0KICAgICAgICBheSA9IC0zMCwgICMgUG9zaXNpIHRla3Mgc2VkaWtpdCBsZWJpaCB0aW5nZ2kgZGFyaSBnYXJpcw0KICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICdyZ2JhKDIyMiwgNDUsIDM4LCAwLjgpJywgc2l6ZSA9IDEyKQ0KICAgICAgKSwNCiAgICAgICMgQW5vdGFzaSB1bnR1ayByYXRhLXJhdGEgZGF0YXNldCB0YW5wYSBvdXRsaWVycw0KICAgICAgbGlzdCgNCiAgICAgICAgeCA9IG1lYW5fdGFucGFfb3V0bGllcnMsDQogICAgICAgIHkgPSBtYXgoZGVuc2l0eV90YW5wYV9vdXRsaWVycyR5KSAqIDAuOSwNCiAgICAgICAgdGV4dCA9IHBhc3RlKCJNZWFuOiIsIHJvdW5kKG1lYW5fdGFucGFfb3V0bGllcnMsIDIpKSwNCiAgICAgICAgc2hvd2Fycm93ID0gVFJVRSwNCiAgICAgICAgYXJyb3doZWFkID0gMiwNCiAgICAgICAgYXggPSAwLA0KICAgICAgICBheSA9IC00NSwgICMgUG9zaXNpIHRla3Mgc2VkaWtpdCBsZWJpaCB0aW5nZ2kgZGFyaSBnYXJpcw0KICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICdyZ2JhKDM4LCAxNjYsIDkxLCAwLjgpJywgc2l6ZSA9IDEyKQ0KICAgICAgKQ0KICAgICkNCiAgKQ0KDQojIE1lbmFtcGlsa2FuIHBsb3QNCnBsb3QNCmBgYA0KDQojIyBNZWRpYW4gRGF0YSBLZWxvbXBvaw0KIyMjIERlZmluaSBNZWRpYW4gRGF0YSBLZWxvbXBvaw0KTWVkaWFuIGRhdGEga2Vsb21wb2sgbWVydXBha2FuIGplbmlzIGRhdGEgbWVkaWFuIHlhbmcgYmlhc2FueWEgZGlzYWppa2FuIGRhbGFtIGJlbnR1ayB0YWJlbCBmcmVrdWVuc2kgZGFuIHRlbGFoIGRpa2Vsb21wb2trYW4gZGFsYW0ga2VsYXMgaW50ZXJ2YWwgc2VjYXJhIG1hdGVtYXRpcy4gVW50dWsgZGF0YSBrZWxvbXBvaywgbWVhbiBkaWhpdHVuZyBkZW5nYW4gcnVtdXM6DQpcWw0KXHRleHR7TWVkaWFufSA9IEwgKyBcbGVmdCggXGZyYWN7XGZyYWN7Tn17Mn0gLSBGfXtmX219IFxyaWdodCkgXGNkb3QgYw0KXF0NCg0KUGVuamVsYXNhbiBSdW11czoNCg0KLSBcKExcKTogQmF0YXMgYmF3YWgga2VsYXMgbWVkaWFuLg0KDQotIFwoTlwpOiBKdW1sYWggdG90YWwgZnJla3VlbnNpIChcKFxzdW0gZlwpKS4NCg0KLSBcKEZcKTogRnJla3VlbnNpIGt1bXVsYXRpZiBzZWJlbHVtIGtlbGFzIG1lZGlhbi4NCg0KLSBcKGZfbVwpOiBGcmVrdWVuc2kga2VsYXMgbWVkaWFuLg0KDQotIFwoY1wpOiBMZWJhciBrZWxhcy4NCg0KTGFuZ2thaC1sYW5na2FoOg0KDQoxLiBIaXR1bmcganVtbGFoIHRvdGFsIGZyZWt1ZW5zaSAoXChOID0gXHN1bSBmXCkpLg0KDQoyLiBDYXJpIHBvc2lzaSBtZWRpYW4gZGVuZ2FuIFwoTiAvIDJcKS4NCg0KMy4gSWRlbnRpZmlrYXNpICoqa2VsYXMgbWVkaWFuKiogKGtlbGFzIGRpIG1hbmEga3VtdWxhdGlmIGZyZWt1ZW5zaSBtZW5jYWt1cCBcKE4gLyAyXCkpLg0KDQo0LiBTdWJzdGl0dXNpIG5pbGFpIFwoTFwpLCBcKEZcKSwgXChmX21cKSwgZGFuIFwoY1wpIGtlIGRhbGFtIHJ1bXVzLg0KDQoNCiMjIyBDb250b2ggTWVhbiBEYXRhIEJlcmtlbG9tcG9rDQp8ICoqS2VsYXMgSW50ZXJ2YWwqKiB8ICoqRnJla3VlbnNpIChmKSoqfA0KfC0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLXwNCnwgMTAgLSAyMCAgICAgICAgICAgfCA1ICAgICAgICAgICAgICAgICB8IA0KfCAyMCAtIDMwICAgICAgICAgICB8IDggICAgICAgICAgICAgICAgIHwNCnwgMzAgLSA0MCAgICAgICAgICAgfCAxNSAgICAgICAgICAgICAgICB8IA0KfCA0MCAtIDUwICAgICAgICAgICB8IDEwICAgICAgICAgICAgICAgIHwgDQp8IDUwIC0gNjAgICAgICAgICAgIHwgMiAgICAgICAgICAgICAgICAgfA0KDQpQZW55ZWxlc2FpYW46DQoNCnwgKipLZWxhcyBJbnRlcnZhbCoqIHwgKipGcmVrdWVuc2kgKGYpKiogfCAqKkZyZWt1ZW5zaSBLdW11bGF0aWYqKiB8DQp8LS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfA0KfCAxMCAtIDIwICAgICAgICAgICB8IDUgICAgICAgICAgICAgICAgIHwgNSAgICAgICAgICAgICAgICAgICAgICAgfA0KfCAyMCAtIDMwICAgICAgICAgICB8IDggICAgICAgICAgICAgICAgIHwgMTMgICAgICAgICAgICAgICAgICAgICAgfA0KfCAzMCAtIDQwICAgICAgICAgICB8IDE1ICAgICAgICAgICAgICAgIHwgMjggICAgICAgICAgICAgICAgICAgICAgfA0KfCA0MCAtIDUwICAgICAgICAgICB8IDEwICAgICAgICAgICAgICAgIHwgMzggICAgICAgICAgICAgICAgICAgICAgfA0KfCA1MCAtIDYwICAgICAgICAgICB8IDIgICAgICAgICAgICAgICAgIHwgNDAgICAgICAgICAgICAgICAgICAgICAgfA0KDQotIFwoTiA9IDQwXCksIG1ha2EgXChOIC8gMiA9IDIwXCkuDQoNCi0gS2VsYXMgbWVkaWFuIGFkYWxhaCAqKjMwIC0gNDAqKiBrYXJlbmEga3VtdWxhdGlmIGZyZWt1ZW5zaSBzZWJlbHVtIDIwIGFkYWxhaCAxMywgZGFuIDI4IG1lbmNha3VwIDIwLg0KDQpQYXJhbWV0ZXI6DQoNCi0gXChMID0gMzBcKSAoYmF0YXMgYmF3YWgga2VsYXMgbWVkaWFuKSwNCg0KLSBcKEYgPSAxM1wpIChmcmVrdWVuc2kga3VtdWxhdGlmIHNlYmVsdW0ga2VsYXMgbWVkaWFuKSwNCg0KLSBcKGZfbSA9IDE1XCkgKGZyZWt1ZW5zaSBrZWxhcyBtZWRpYW4pLA0KDQotIFwoYyA9IDEwXCkgKGxlYmFyIGtlbGFzKS4NCg0KU3Vic3RpdHVzaToNClxbDQpcdGV4dHtNZWRpYW59ID0gMzAgKyBcbGVmdCggXGZyYWN7MjAgLSAxM317MTV9IFxyaWdodCkgXGNkb3QgMTANClxdDQoNClxbDQpcdGV4dHtNZWRpYW59ID0gMzAgKyBcbGVmdCggXGZyYWN7N317MTV9IFxyaWdodCkgXGNkb3QgMTAgPSAzMCArIDQuNjcgPSAzNC42Nw0KXF0NCg0KKipIYXNpbDoqKiAqKk1lZGlhbiA9IDM0LjY3KioNCg0KIyMjIE1lZGlhbiBEYXRhIEtlbG9tcG9rIERhbGFtIEJveHBsb3QNCmBgYHtyLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQ0KIyBNZW11YXQgbGlicmFyeQ0KbGlicmFyeShwbG90bHkpDQoNCiMgRGF0YTogRHVhIHNrZW5hcmlvLCBzYXR1IGRlbmdhbiBvdXRsaWVycywgc2F0dSB0YW5wYSBvdXRsaWVycw0KZGF0YV9kZW5nYW5fb3V0bGllcnMgPC0gYygxNSwgMjUsIDM1LCA0NSwgNTUsIDE1MCkgICMgRGF0YSBkZW5nYW4gb3V0bGllciAoMTUwKQ0KZGF0YV90YW5wYV9vdXRsaWVycyA8LSBjKDE1LCAyNSwgMzUsIDQ1LCA1NSkgICMgRGF0YSB0YW5wYSBvdXRsaWVycw0KDQojIE1lbmdoaXR1bmcgbWVkaWFuIHVudHVrIGtlZHVhIGRhdGFzZXQNCm1lZGlhbl9kZW5nYW5fb3V0bGllcnMgPC0gbWVkaWFuKGRhdGFfZGVuZ2FuX291dGxpZXJzKQ0KbWVkaWFuX3RhbnBhX291dGxpZXJzIDwtIG1lZGlhbihkYXRhX3RhbnBhX291dGxpZXJzKQ0KDQojIE1lbmdnYWJ1bmdrYW4gZGF0YSBrZSBkYWxhbSBzYXR1IGRhdGEgZnJhbWUgdW50dWsgdmlzdWFsaXNhc2kNCmRhdGEgPC0gZGF0YS5mcmFtZSgNCiAgTmlsYWkgPSBjKGRhdGFfZGVuZ2FuX291dGxpZXJzLCBkYXRhX3RhbnBhX291dGxpZXJzKSwNCiAgS2Vsb21wb2sgPSByZXAoYygiRGVuZ2FuIE91dGxpZXJzIiwgIlRhbnBhIE91dGxpZXJzIiksIA0KICAgICAgICAgICAgICAgICB0aW1lcyA9IGMobGVuZ3RoKGRhdGFfZGVuZ2FuX291dGxpZXJzKSwgbGVuZ3RoKGRhdGFfdGFucGFfb3V0bGllcnMpKSkNCikNCg0KIyBNZW1idWF0IGJveHBsb3QgbWVuZ2d1bmFrYW4gUGxvdGx5DQpwbG90IDwtIHBsb3RfbHkoDQogIGRhdGEsIA0KICB5ID0gfk5pbGFpLCANCiAgY29sb3IgPSB+S2Vsb21wb2ssIA0KICBjb2xvcnMgPSBjKCJ5ZWxsb3ciLCAicmVkIiksICAjIFdhcm5hIHRldGFwIHNlc3VhaToga3VuaW5nIGRhbiBtZXJhaA0KICB0eXBlID0gImJveCIsIA0KICBib3hwb2ludHMgPSAib3V0bGllcnMiICAjIE1lbmFtcGlsa2FuIHRpdGlrIG91dGxpZXJzDQopICU+JQ0KICBsYXlvdXQoDQogICAgdGl0bGUgPSAiUGVuZ2FydWggT3V0bGllcnMgdGVyaGFkYXAgTWVkaWFuIiwNCiAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiTmlsYWkiKSwNCiAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiS2Vsb21wb2siKSwNCiAgICBhbm5vdGF0aW9ucyA9IGxpc3QoDQogICAgICBsaXN0KA0KICAgICAgICB4ID0gIkRlbmdhbiBPdXRsaWVycyIsDQogICAgICAgIHkgPSBtZWRpYW5fZGVuZ2FuX291dGxpZXJzLA0KICAgICAgICB0ZXh0ID0gcGFzdGUoIk1lZGlhbjoiLCByb3VuZChtZWRpYW5fZGVuZ2FuX291dGxpZXJzLCAyKSksDQogICAgICAgIHNob3dhcnJvdyA9IFRSVUUsDQogICAgICAgIGFycm93aGVhZCA9IDINCiAgICAgICksDQogICAgICBsaXN0KA0KICAgICAgICB4ID0gIlRhbnBhIE91dGxpZXJzIiwNCiAgICAgICAgeSA9IG1lZGlhbl90YW5wYV9vdXRsaWVycywNCiAgICAgICAgdGV4dCA9IHBhc3RlKCJNZWRpYW46Iiwgcm91bmQobWVkaWFuX3RhbnBhX291dGxpZXJzLCAyKSksDQogICAgICAgIHNob3dhcnJvdyA9IFRSVUUsDQogICAgICAgIGFycm93aGVhZCA9IDINCiAgICAgICkNCiAgICApDQogICkNCg0KIyBNZW5hbXBpbGthbiBwbG90DQpwbG90DQoNCg0KYGBgDQoNCiMjIyBNZWRpYW4gRGF0YSBLZWxvbXBvayBEYWxhbSBIaXN0b2dyYW0NCmBgYHtyLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQ0KIyBNZW11YXQgbGlicmFyeQ0KbGlicmFyeShwbG90bHkpDQoNCiMgRGF0YTogRHVhIHNrZW5hcmlvLCBzYXR1IGRlbmdhbiBvdXRsaWVycywgc2F0dSB0YW5wYSBvdXRsaWVycw0KZGF0YV9kZW5nYW5fb3V0bGllcnMgPC0gYygxNSwgMjUsIDM1LCA0NSwgNTUsIDE1MCkgICMgRGF0YSBkZW5nYW4gb3V0bGllciAoMTUwKQ0KZGF0YV90YW5wYV9vdXRsaWVycyA8LSBjKDE1LCAyNSwgMzUsIDQ1LCA1NSkgICMgRGF0YSB0YW5wYSBvdXRsaWVycw0KDQojIE1lbmdoaXR1bmcgbWVkaWFuIHVudHVrIGtlZHVhIGRhdGFzZXQNCm1lZGlhbl9kZW5nYW5fb3V0bGllcnMgPC0gbWVkaWFuKGRhdGFfZGVuZ2FuX291dGxpZXJzKQ0KbWVkaWFuX3RhbnBhX291dGxpZXJzIDwtIG1lZGlhbihkYXRhX3RhbnBhX291dGxpZXJzKQ0KDQojIE1lbWJ1YXQgZGVuc2l0eSBwbG90DQpkZW5zaXR5X2Rlbmdhbl9vdXRsaWVycyA8LSBkZW5zaXR5KGRhdGFfZGVuZ2FuX291dGxpZXJzKQ0KZGVuc2l0eV90YW5wYV9vdXRsaWVycyA8LSBkZW5zaXR5KGRhdGFfdGFucGFfb3V0bGllcnMpDQoNCiMgTWVtYnVhdCBwbG90IG1lbmdndW5ha2FuIFBsb3RseQ0KcGxvdCA8LSBwbG90X2x5KCkgJT4lDQogICMgTWVuYW1iYWhrYW4gZGVuc2l0eSBwbG90IHVudHVrIGRhdGFzZXQgZGVuZ2FuIG91dGxpZXJzDQogIGFkZF90cmFjZSgNCiAgICB4ID0gfmRlbnNpdHlfZGVuZ2FuX291dGxpZXJzJHgsDQogICAgeSA9IH5kZW5zaXR5X2Rlbmdhbl9vdXRsaWVycyR5LA0KICAgIHR5cGUgPSAnc2NhdHRlcicsDQogICAgbW9kZSA9ICdsaW5lcycsDQogICAgbmFtZSA9ICJEZW5nYW4gT3V0bGllcnMiLA0KICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gJ3JnYmEoMjIyLCA0NSwgMzgsIDAuOCknLCB3aWR0aCA9IDIpDQogICkgJT4lDQogICMgTWVuYW1iYWhrYW4gZGVuc2l0eSBwbG90IHVudHVrIGRhdGFzZXQgdGFucGEgb3V0bGllcnMNCiAgYWRkX3RyYWNlKA0KICAgIHggPSB+ZGVuc2l0eV90YW5wYV9vdXRsaWVycyR4LA0KICAgIHkgPSB+ZGVuc2l0eV90YW5wYV9vdXRsaWVycyR5LA0KICAgIHR5cGUgPSAnc2NhdHRlcicsDQogICAgbW9kZSA9ICdsaW5lcycsDQogICAgbmFtZSA9ICJUYW5wYSBPdXRsaWVycyIsDQogICAgbGluZSA9IGxpc3QoY29sb3IgPSAncmdiYSgzOCwgMTY2LCA5MSwgMC44KScsIHdpZHRoID0gMikNCiAgKSAlPiUNCiAgIyBNZW5hbWJhaGthbiBnYXJpcyBtZWRpYW4gdW50dWsgZGF0YXNldCBkZW5nYW4gb3V0bGllcnMNCiAgYWRkX3RyYWNlKA0KICAgIHggPSBjKG1lZGlhbl9kZW5nYW5fb3V0bGllcnMsIG1lZGlhbl9kZW5nYW5fb3V0bGllcnMpLA0KICAgIHkgPSBjKDAsIG1heChkZW5zaXR5X2Rlbmdhbl9vdXRsaWVycyR5KSksDQogICAgdHlwZSA9ICJzY2F0dGVyIiwNCiAgICBtb2RlID0gImxpbmVzIiwNCiAgICBuYW1lID0gIk1lZGlhbiAoRGVuZ2FuIE91dGxpZXJzKSIsDQogICAgbGluZSA9IGxpc3QoY29sb3IgPSAncmdiYSgyMjIsIDQ1LCAzOCwgMC42KScsIGRhc2ggPSAnZGFzaCcpDQogICkgJT4lDQogICMgTWVuYW1iYWhrYW4gZ2FyaXMgbWVkaWFuIHVudHVrIGRhdGFzZXQgdGFucGEgb3V0bGllcnMNCiAgYWRkX3RyYWNlKA0KICAgIHggPSBjKG1lZGlhbl90YW5wYV9vdXRsaWVycywgbWVkaWFuX3RhbnBhX291dGxpZXJzKSwNCiAgICB5ID0gYygwLCBtYXgoZGVuc2l0eV90YW5wYV9vdXRsaWVycyR5KSksDQogICAgdHlwZSA9ICJzY2F0dGVyIiwNCiAgICBtb2RlID0gImxpbmVzIiwNCiAgICBuYW1lID0gIk1lZGlhbiAoVGFucGEgT3V0bGllcnMpIiwNCiAgICBsaW5lID0gbGlzdChjb2xvciA9ICdyZ2JhKDM4LCAxNjYsIDkxLCAwLjYpJywgZGFzaCA9ICdkYXNoJykNCiAgKSAlPiUNCiAgIyBNZW55ZXN1YWlrYW4gdGF0YSBsZXRhaw0KICBsYXlvdXQoDQogICAgdGl0bGUgPSAiUGVuZ2FydWggT3V0bGllcnMgdGVyaGFkYXAgTWVkaWFuIHBhZGEgRGVuc2l0eSBQbG90IiwNCiAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiTmlsYWkgRGF0YSIpLA0KICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICJEZW5zaXR5IiksDQogICAgYW5ub3RhdGlvbnMgPSBsaXN0KA0KICAgICAgIyBBbm90YXNpIHVudHVrIG1lZGlhbiBkYXRhc2V0IGRlbmdhbiBvdXRsaWVycw0KICAgICAgbGlzdCgNCiAgICAgICAgeCA9IG1lZGlhbl9kZW5nYW5fb3V0bGllcnMsDQogICAgICAgIHkgPSBtYXgoZGVuc2l0eV9kZW5nYW5fb3V0bGllcnMkeSkgKiAwLjksDQogICAgICAgIHRleHQgPSBwYXN0ZSgiTWVkaWFuOiIsIHJvdW5kKG1lZGlhbl9kZW5nYW5fb3V0bGllcnMsIDIpKSwNCiAgICAgICAgc2hvd2Fycm93ID0gVFJVRSwNCiAgICAgICAgYXJyb3doZWFkID0gMiwNCiAgICAgICAgYXggPSAwLA0KICAgICAgICBheSA9IC0zMCwNCiAgICAgICAgZm9udCA9IGxpc3QoY29sb3IgPSAncmdiYSgyMjIsIDQ1LCAzOCwgMC44KScsIHNpemUgPSAxMikNCiAgICAgICksDQogICAgICAjIEFub3Rhc2kgdW50dWsgbWVkaWFuIGRhdGFzZXQgdGFucGEgb3V0bGllcnMNCiAgICAgIGxpc3QoDQogICAgICAgIHggPSBtZWRpYW5fdGFucGFfb3V0bGllcnMsDQogICAgICAgIHkgPSBtYXgoZGVuc2l0eV90YW5wYV9vdXRsaWVycyR5KSAqIDAuOSwNCiAgICAgICAgdGV4dCA9IHBhc3RlKCJNZWRpYW46Iiwgcm91bmQobWVkaWFuX3RhbnBhX291dGxpZXJzLCAyKSksDQogICAgICAgIHNob3dhcnJvdyA9IFRSVUUsDQogICAgICAgIGFycm93aGVhZCA9IDIsDQogICAgICAgIGF4ID0gMCwNCiAgICAgICAgYXkgPSAtMzAsDQogICAgICAgIGZvbnQgPSBsaXN0KGNvbG9yID0gJ3JnYmEoMzgsIDE2NiwgOTEsIDAuOCknLCBzaXplID0gMTIpDQogICAgICApDQogICAgKQ0KICApDQoNCiMgTWVuYW1waWxrYW4gcGxvdA0KcGxvdA0KDQpgYGANCiMjIE1vZHVzIERhdGEgS2Vsb21wb2sNCiMjIyBEZWZpbmlzaSBNb2R1cyBEYXRhIEtlbG9tcG9rDQpNb2R1cyBkYXRhIGtlbG9tcG9rIGFkYWxhaCBuaWxhaSB5YW5nIG11bmN1bCBiZXJ1bGFuZyBrYWxpIGRhbGFtIHNlYnVhaCBoaW1wdW5hbiB0ZXJ0ZW50dS4gVW50dWsgZGF0YSBrZWxvbXBvaywgbWVhbiBkaWhpdHVuZyBkZW5nYW4gcnVtdXM6DQoNClxbDQpcdGV4dHtNb2R1c30gPSBMICsgXGxlZnQoIFxmcmFje2ZfbSAtIGZfe20tMX19eyhmX20gLSBmX3ttLTF9KSArIChmX20gLSBmX3ttKzF9KX0gXHJpZ2h0KSBcY2RvdCBjDQpcXQ0KDQpQZW5qZWxhc2FuIFJ1bXVzOg0KDQotIFwoTFwpOiBCYXRhcyBiYXdhaCBrZWxhcyBtb2R1cy4NCg0KLSBcKGZfbVwpOiBGcmVrdWVuc2kga2VsYXMgbW9kdXMgKGZyZWt1ZW5zaSB0ZXJiZXNhcikuDQoNCi0gXChmX3ttLTF9XCk6IEZyZWt1ZW5zaSBrZWxhcyBzZWJlbHVtIGtlbGFzIG1vZHVzLg0KDQotIFwoZl97bSsxfVwpOiBGcmVrdWVuc2kga2VsYXMgc2V0ZWxhaCBrZWxhcyBtb2R1cy4NCg0KLSBcKGNcKTogTGViYXIga2VsYXMuDQoNCkxhbmdrYWgtbGFuZ2thaDoNCg0KMS4gVGVudHVrYW4gKiprZWxhcyBtb2R1cyoqIChrZWxhcyBkZW5nYW4gZnJla3VlbnNpIHRlcmJlc2FyKS4NCg0KMi4gU3Vic3RpdHVzaSBwYXJhbWV0ZXIgXChMXCksIFwoZl9tXCksIFwoZl97bS0xfVwpLCBcKGZfe20rMX1cKSwgZGFuIFwoY1wpIGtlIGRhbGFtIHJ1bXVzLg0KDQojIyMgQ29udG9oIE1lYW4gRGF0YSBCZXJrZWxvbXBvaw0KfCAqKktlbGFzIEludGVydmFsKiogfCAqKkZyZWt1ZW5zaSAoZikqKnwNCnwtLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS18DQp8IDEwIC0gMjAgICAgICAgICAgIHwgNSAgICAgICAgICAgICAgICAgfCANCnwgMjAgLSAzMCAgICAgICAgICAgfCA4ICAgICAgICAgICAgICAgICB8DQp8IDMwIC0gNDAgICAgICAgICAgIHwgMTUgICAgICAgICAgICAgICAgfCANCnwgNDAgLSA1MCAgICAgICAgICAgfCAxMCAgICAgICAgICAgICAgICB8IA0KfCA1MCAtIDYwICAgICAgICAgICB8IDIgICAgICAgICAgICAgICAgIHwNCg0KDQpLZWxhcyBtb2R1cyBhZGFsYWggKiozMCAtIDQwKiogKFwoZl9tID0gMTVcKSkuDQoNClBhcmFtZXRlcjoNCg0KLSBcKEwgPSAzMFwpLA0KDQotIFwoZl9tID0gMTVcKSwNCg0KLSBcKGZfe20tMX0gPSA4XCksDQoNCi0gXChmX3ttKzF9ID0gMTBcKSwNCg0KLSBcKGMgPSAxMFwpLg0KDQpTdWJzdGl0dXNpOg0KXFsNClx0ZXh0e01vZHVzfSA9IDMwICsgXGxlZnQoIFxmcmFjezE1IC0gOH17KDE1IC0gOCkgKyAoMTUgLSAxMCl9IFxyaWdodCkgXGNkb3QgMTANClxdDQpcWw0KXHRleHR7TW9kdXN9ID0gMzAgKyBcbGVmdCggXGZyYWN7N317NyArIDV9IFxyaWdodCkgXGNkb3QgMTAgPSAzMCArIFxsZWZ0KCBcZnJhY3s3fXsxMn0gXHJpZ2h0KSBcY2RvdCAxMA0KXF0NClxbDQpcdGV4dHtNb2R1c30gPSAzMCArIDUuODMgPSAzNS44Mw0KXF0NCg0KKipIYXNpbDoqKiAqKk1vZHVzID0gMzUuODMqKg0KDQoNCiMjI01vZHVzIERhdGEgS2Vsb21wb2sgRGFsYW0gQm94cGxvdA0KYGBge3IsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0V9DQojIE1lbXVhdCBsaWJyYXJ5DQpsaWJyYXJ5KHBsb3RseSkNCg0KIyBEYXRhOiBEdWEgc2tlbmFyaW8sIHNhdHUgZGVuZ2FuIG91dGxpZXJzLCBzYXR1IHRhbnBhIG91dGxpZXJzDQpkYXRhX2Rlbmdhbl9vdXRsaWVycyA8LSBjKDE1LCAyNSwgMzUsIDQ1LCA1NSwgMTUwKSAgIyBEYXRhIGRlbmdhbiBvdXRsaWVyICgxNTApDQpkYXRhX3RhbnBhX291dGxpZXJzIDwtIGMoMTUsIDI1LCAzNSwgNDUsIDU1KSAgIyBEYXRhIHRhbnBhIG91dGxpZXJzDQoNCg0KIyBVbnR1ayBkYXRhIGJlcmtlbG9tcG9rIGtpdGEgbWVuZ2d1bmFrYW4gcnVtdXMgbW9kdXMgc2ViYWdhaSBiZXJpa3V0DQojIERhdGEgdW50dWsgZGVuZ2FuIG91dGxpZXJzICgxNTApDQpMIDwtIDMwICAgICAgIyBCYXRhcyBiYXdhaCBrZWxhcyBtb2R1cw0KZm0gPC0gMTUgICAgICMgRnJla3VlbnNpIGtlbGFzIG1vZHVzDQpmbV9taW51c18xIDwtIDggICAjIEZyZWt1ZW5zaSBrZWxhcyBzZWJlbHVtIG1vZHVzDQpmbV9wbHVzXzEgPC0gMTAgICAjIEZyZWt1ZW5zaSBrZWxhcyBzZXRlbGFoIG1vZHVzDQpjIDwtIDEwICAgICAgIyBQYW5qYW5nIGtlbGFzIGludGVydmFsDQoNCiMgTWVuZ2hpdHVuZyBNb2R1cyBtZW5nZ3VuYWthbiBydW11cw0KbW9kdXNfZGVuZ2FuX291dGxpZXJzIDwtIEwgKyAoKGZtIC0gZm1fbWludXNfMSkgLyAoKGZtIC0gZm1fbWludXNfMSkgKyAoZm0gLSBmbV9wbHVzXzEpKSkgKiBjDQoNCiMgVW50dWsgZGF0YSB0YW5wYSBvdXRsaWVycw0KbW9kdXNfdGFucGFfb3V0bGllcnMgPC0gbW9kdXNfZGVuZ2FuX291dGxpZXJzICAjIERhbGFtIGhhbCBpbmksIGtpdGEgYW5nZ2FwIG1vZHVzIHRldGFwIHNhbWENCg0KIyBNZW5nZ2FidW5na2FuIGRhdGEga2UgZGFsYW0gc2F0dSBkYXRhIGZyYW1lIHVudHVrIHZpc3VhbGlzYXNpDQpkYXRhIDwtIGRhdGEuZnJhbWUoDQogIE5pbGFpID0gYyhkYXRhX2Rlbmdhbl9vdXRsaWVycywgZGF0YV90YW5wYV9vdXRsaWVycyksDQogIEtlbG9tcG9rID0gcmVwKGMoIkRlbmdhbiBPdXRsaWVycyIsICJUYW5wYSBPdXRsaWVycyIpLCANCiAgICAgICAgICAgICAgICAgdGltZXMgPSBjKGxlbmd0aChkYXRhX2Rlbmdhbl9vdXRsaWVycyksIGxlbmd0aChkYXRhX3RhbnBhX291dGxpZXJzKSkpDQopDQoNCiMgTWVtYnVhdCBib3hwbG90IG1lbmdndW5ha2FuIFBsb3RseSBkZW5nYW4gb3V0bGllcnMgZGl0YW1waWxrYW4gZGFuIHdhcm5hIGt1bmluZyBkYW4gbWVyYWgNCnBsb3QgPC0gcGxvdF9seSgNCiAgZGF0YSwgDQogIHkgPSB+TmlsYWksIA0KICBjb2xvciA9IH5LZWxvbXBvaywgDQogIGNvbG9ycyA9IGMoInJlZCIsICJ5ZWxsb3ciKSwgICMgV2FybmEgbWVyYWggdW50dWsgVGFucGEgT3V0bGllcnMsIGt1bmluZyB1bnR1ayBEZW5nYW4gT3V0bGllcnMNCiAgdHlwZSA9ICJib3giLCANCiAgYm94cG9pbnRzID0gIm91dGxpZXJzIiAgIyBNZW5hbXBpbGthbiB0aXRpayBvdXRsaWVycw0KKSAlPiUNCiAgbGF5b3V0KA0KICAgIHRpdGxlID0gIlBlbmdhcnVoIE91dGxpZXJzIHRlcmhhZGFwIE1vZHVzIiwNCiAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiTmlsYWkiKSwNCiAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiS2Vsb21wb2siKSwNCiAgICBhbm5vdGF0aW9ucyA9IGxpc3QoDQogICAgICBsaXN0KA0KICAgICAgICB4ID0gIkRlbmdhbiBPdXRsaWVycyIsDQogICAgICAgIHkgPSBtb2R1c19kZW5nYW5fb3V0bGllcnMsDQogICAgICAgIHRleHQgPSBwYXN0ZSgiTW9kdXM6Iiwgcm91bmQobW9kdXNfZGVuZ2FuX291dGxpZXJzLCAyKSksDQogICAgICAgIHNob3dhcnJvdyA9IFRSVUUsDQogICAgICAgIGFycm93aGVhZCA9IDINCiAgICAgICksDQogICAgICBsaXN0KA0KICAgICAgICB4ID0gIlRhbnBhIE91dGxpZXJzIiwNCiAgICAgICAgeSA9IG1vZHVzX3RhbnBhX291dGxpZXJzLA0KICAgICAgICB0ZXh0ID0gcGFzdGUoIk1vZHVzOiIsIHJvdW5kKG1vZHVzX3RhbnBhX291dGxpZXJzLCAyKSksDQogICAgICAgIHNob3dhcnJvdyA9IFRSVUUsDQogICAgICAgIGFycm93aGVhZCA9IDINCiAgICAgICkNCiAgICApDQogICkNCg0KIyBNZW5hbXBpbGthbiBwbG90DQpwbG90DQoNCg0KYGBgDQoNCiMjIyBNb2R1cyBEYXRhIEtlbG9tcG9rIERhbGFtIEhpc3RvZ3JhbQ0KYGBge3IsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0V9DQojIE1lbXVhdCBsaWJyYXJ5DQpsaWJyYXJ5KHBsb3RseSkNCg0KIyBEYXRhOiBEdWEgc2tlbmFyaW8sIHNhdHUgZGVuZ2FuIG91dGxpZXJzLCBzYXR1IHRhbnBhIG91dGxpZXJzDQpkYXRhX2Rlbmdhbl9vdXRsaWVycyA8LSBjKDE1LCAyNSwgMzUsIDQ1LCA1NSwgMTUwKSAgIyBEYXRhIGRlbmdhbiBvdXRsaWVyICgxNTApDQpkYXRhX3RhbnBhX291dGxpZXJzIDwtIGMoMTUsIDI1LCAzNSwgNDUsIDU1KSAgIyBEYXRhIHRhbnBhIG91dGxpZXJzDQoNCiMgUGVyaGl0dW5nYW4gTW9kdXMgdW50dWsgZGF0YSBkZW5nYW4gZGFuIHRhbnBhIG91dGxpZXJzDQojIERhdGEgdW50dWsgZGVuZ2FuIG91dGxpZXJzICgxNTApDQpMIDwtIDMwICAgICAgIyBCYXRhcyBiYXdhaCBrZWxhcyBtb2R1cw0KZm0gPC0gMTUgICAgICMgRnJla3VlbnNpIGtlbGFzIG1vZHVzDQpmbV9taW51c18xIDwtIDggICAjIEZyZWt1ZW5zaSBrZWxhcyBzZWJlbHVtIG1vZHVzDQpmbV9wbHVzXzEgPC0gMTAgICAjIEZyZWt1ZW5zaSBrZWxhcyBzZXRlbGFoIG1vZHVzDQpjIDwtIDEwICAgICAgIyBQYW5qYW5nIGtlbGFzIGludGVydmFsDQoNCiMgTWVuZ2hpdHVuZyBNb2R1cyBtZW5nZ3VuYWthbiBydW11cw0KbW9kdXNfZGVuZ2FuX291dGxpZXJzIDwtIEwgKyAoKGZtIC0gZm1fbWludXNfMSkgLyAoKGZtIC0gZm1fbWludXNfMSkgKyAoZm0gLSBmbV9wbHVzXzEpKSkgKiBjDQoNCiMgVW50dWsgZGF0YSB0YW5wYSBvdXRsaWVycw0KbW9kdXNfdGFucGFfb3V0bGllcnMgPC0gbW9kdXNfZGVuZ2FuX291dGxpZXJzICAjIERhbGFtIGhhbCBpbmksIGtpdGEgYW5nZ2FwIG1vZHVzIHRldGFwIHNhbWENCg0KIyBNZW1idWF0IHBsb3QgbWVuZ2d1bmFrYW4gUGxvdGx5DQpwbG90IDwtIHBsb3RfbHkoKSAlPiUNCiAgIyBNZW5hbWJhaGthbiBkZW5zaXR5IHBsb3QgdW50dWsgZGF0YXNldCBkZW5nYW4gb3V0bGllcnMNCiAgYWRkX3RyYWNlKA0KICAgIHggPSB+ZGVuc2l0eV9kZW5nYW5fb3V0bGllcnMkeCwNCiAgICB5ID0gfmRlbnNpdHlfZGVuZ2FuX291dGxpZXJzJHksDQogICAgdHlwZSA9ICdzY2F0dGVyJywNCiAgICBtb2RlID0gJ2xpbmVzJywNCiAgICBuYW1lID0gIkRlbmdhbiBPdXRsaWVycyIsDQogICAgbGluZSA9IGxpc3QoY29sb3IgPSAncmdiYSgyMjIsIDQ1LCAzOCwgMC44KScsIHdpZHRoID0gMikNCiAgKSAlPiUNCiAgIyBNZW5hbWJhaGthbiBkZW5zaXR5IHBsb3QgdW50dWsgZGF0YXNldCB0YW5wYSBvdXRsaWVycw0KICBhZGRfdHJhY2UoDQogICAgeCA9IH5kZW5zaXR5X3RhbnBhX291dGxpZXJzJHgsDQogICAgeSA9IH5kZW5zaXR5X3RhbnBhX291dGxpZXJzJHksDQogICAgdHlwZSA9ICdzY2F0dGVyJywNCiAgICBtb2RlID0gJ2xpbmVzJywNCiAgICBuYW1lID0gIlRhbnBhIE91dGxpZXJzIiwNCiAgICBsaW5lID0gbGlzdChjb2xvciA9ICdyZ2JhKDM4LCAxNjYsIDkxLCAwLjgpJywgd2lkdGggPSAyKQ0KICApICU+JQ0KICAjIE1lbmFtYmFoa2FuIGdhcmlzIG1lZGlhbiB1bnR1ayBkYXRhc2V0IGRlbmdhbiBvdXRsaWVycw0KICBhZGRfdHJhY2UoDQogICAgeCA9IGMobWVkaWFuX2Rlbmdhbl9vdXRsaWVycywgbWVkaWFuX2Rlbmdhbl9vdXRsaWVycyksDQogICAgeSA9IGMoMCwgbWF4KGRlbnNpdHlfZGVuZ2FuX291dGxpZXJzJHkpKSwNCiAgICB0eXBlID0gInNjYXR0ZXIiLA0KICAgIG1vZGUgPSAibGluZXMiLA0KICAgIG5hbWUgPSAiTWVkaWFuIChEZW5nYW4gT3V0bGllcnMpIiwNCiAgICBsaW5lID0gbGlzdChjb2xvciA9ICdyZ2JhKDIyMiwgNDUsIDM4LCAwLjYpJywgZGFzaCA9ICdkYXNoJykNCiAgKSAlPiUNCiAgIyBNZW5hbWJhaGthbiBnYXJpcyBtZWRpYW4gdW50dWsgZGF0YXNldCB0YW5wYSBvdXRsaWVycw0KICBhZGRfdHJhY2UoDQogICAgeCA9IGMobWVkaWFuX3RhbnBhX291dGxpZXJzLCBtZWRpYW5fdGFucGFfb3V0bGllcnMpLA0KICAgIHkgPSBjKDAsIG1heChkZW5zaXR5X3RhbnBhX291dGxpZXJzJHkpKSwNCiAgICB0eXBlID0gInNjYXR0ZXIiLA0KICAgIG1vZGUgPSAibGluZXMiLA0KICAgIG5hbWUgPSAiTWVkaWFuIChUYW5wYSBPdXRsaWVycykiLA0KICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gJ3JnYmEoMzgsIDE2NiwgOTEsIDAuNiknLCBkYXNoID0gJ2Rhc2gnKQ0KICApICU+JQ0KICBsYXlvdXQoDQogICAgdGl0bGUgPSAiUGVuZ2FydWggT3V0bGllcnMgdGVyaGFkYXAgTWVkaWFuIHBhZGEgRGVuc2l0eSBQbG90IiwNCiAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiRnJla3VlbnNpIiksDQogICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gIktlbGFzIEludGVydmFsIiksDQogICAgYW5ub3RhdGlvbnMgPSBsaXN0KA0KICAgICAgIyBBbm90YXNpIHVudHVrIG1vZnVkIGRhdGFzZXQgZGVuZ2FuIG91dGxpZXJzDQogICAgICBsaXN0KA0KICAgICAgICB4ID0gbWVkaWFuX2Rlbmdhbl9vdXRsaWVycywNCiAgICAgICAgeSA9IG1heChkZW5zaXR5X2Rlbmdhbl9vdXRsaWVycyR5KSAqIDAuOSwNCiAgICAgICAgdGV4dCA9IHBhc3RlKCJNb2R1czoiLCByb3VuZChtb2R1c19kZW5nYW5fb3V0bGllcnMsIDIpKSwNCiAgICAgICAgc2hvd2Fycm93ID0gVFJVRSwNCiAgICAgICAgYXJyb3doZWFkID0gMiwNCiAgICAgICAgYXggPSAwLA0KICAgICAgICBheSA9IC0zMCwgICMgUG9zaXNpIHRla3Mgc2VkaWtpdCBsZWJpaCB0aW5nZ2kgZGFyaSBnYXJpcw0KICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICdyZ2JhKDIyMiwgNDUsIDM4LCAwLjgpJywgc2l6ZSA9IDEyKQ0KICAgICAgKSwNCiAgICAgICMgQW5vdGFzaSB1bnR1ayBtb2R1cyBkYXRhc2V0IHRhbnBhIG91dGxpZXJzDQogICAgICBsaXN0KA0KICAgICAgICB4ID0gbWVkaWFuX3RhbnBhX291dGxpZXJzLA0KICAgICAgICB5ID0gbWF4KGRlbnNpdHlfdGFucGFfb3V0bGllcnMkeSkgKiAwLjksDQogICAgICAgIHRleHQgPSBwYXN0ZSgiTWVkdXM6Iiwgcm91bmQobW9kdXNfdGFucGFfb3V0bGllcnMsIDIpKSwNCiAgICAgICAgc2hvd2Fycm93ID0gVFJVRSwNCiAgICAgICAgYXJyb3doZWFkID0gMiwNCiAgICAgICAgYXggPSAwLA0KICAgICAgICBheSA9IC00NSwgICMgUG9zaXNpIHRla3Mgc2VkaWtpdCBsZWJpaCB0aW5nZ2kgZGFyaSBnYXJpcw0KICAgICAgICBmb250ID0gbGlzdChjb2xvciA9ICdyZ2JhKDM4LCAxNjYsIDkxLCAwLjgpJywgc2l6ZSA9IDEyKQ0KICAgICAgKQ0KICAgICkNCiAgKQ0KDQojIE1lbmFtcGlsa2FuIHBsb3QNCnBsb3QNCg0KYGBgDQoNCg0KIyBVa3VyYW4gUGVtdXNhdGFuIGRhbGFtIFN0dWRpIEthc3VzDQojIyAqKkJpc25pczogTWVuZ2hpdHVuZyBSYXRhLXJhdGEgUGVuanVhbGFuKioNCg0KIyMjIFN0dWRpIEthc3VzOg0KDQpTZWJ1YWggcGVydXNhaGFhbiByZXRhaWwgaW5naW4gbWVuZ2V0YWh1aSByYXRhLXJhdGEgcGVuanVhbGFuIHByb2R1ayBtZXJla2EgZGFsYW0gc2F0dSBtaW5nZ3UgdW50dWsgbWVuaWxhaSBwZXJmb3JtYSBiaXNuaXMgZGFuIG1lcmVuY2FuYWthbiBzdHJhdGVnaSBwZW5qdWFsYW4uIERhdGEgcGVuanVhbGFuIHVuaXQgcHJvZHVrIHNlbGFtYSA3IGhhcmkgdGVyYWtoaXIgYWRhbGFoIHNlYmFnYWkgYmVyaWt1dDoNCg0KKiAgIEhhcmkgMTogMTUwIHVuaXQNCiogICBIYXJpIDI6IDE4MCB1bml0DQoqICAgSGFyaSAzOiAxNjAgdW5pdA0KKiAgIEhhcmkgNDogMTcwIHVuaXQNCiogICBIYXJpIDU6IDE2MCB1bml0DQoqICAgSGFyaSA2OiAxNzUgdW5pdA0KKiAgIEhhcmkgNzogMTY1IHVuaXQNCg0KKipUdWp1YW46KiogTWVuZ2hpdHVuZyByYXRhLXJhdGEgKG1lYW4pIHBlbmp1YWxhbiBwZXIgaGFyaS4NCg0KIyMjIExhbmdrYWgtTGFuZ2thaCBNZW5naGl0dW5nIFJhdGEtcmF0YSAoTWVhbik6DQoNClVudHVrIG1lbmdoaXR1bmcgcmF0YS1yYXRhIHBlbmp1YWxhbiwga2l0YSBqdW1sYWhrYW4gc2VsdXJ1aCBqdW1sYWggdW5pdCBwZW5qdWFsYW4gZGFuIGtlbXVkaWFuIGJhZ2kgZGVuZ2FuIGp1bWxhaCBoYXJpIHlhbmcgZGlhbWF0aSAoZGFsYW0gaGFsIGluaSwgNyBoYXJpKS4NCg0KMS4gKipKdW1sYWhrYW4gc2VsdXJ1aCBuaWxhaSBwZW5qdWFsYW46KioNCg0KICAgMTUwICsgMTgwICsgMTYwICsgMTcwICsgMTYwICsgMTc1ICsgMTY1ID0gMS4xNjAgdW5pdA0KDQoyLiAqKkJhZ2kganVtbGFoIHRvdGFsIGRlbmdhbiBqdW1sYWggaGFyaSAoNyBoYXJpKToqKg0KDQogICBSYXRhLXJhdGEgPSAxLjE2MCAvIDcgPSAxNjUsNzEgdW5pdA0KDQoqKkhhc2lsOioqIFJhdGEtcmF0YSBwZW5qdWFsYW4gcGVyIGhhcmkgYWRhbGFoIHNla2l0YXIgKioxNjUsNzEgdW5pdCoqLiBJbmkgbWVtYmVyaWthbiBnYW1iYXJhbiB1bXVtIG1lbmdlbmFpIGtpbmVyamEgcGVuanVhbGFuIHNlbGFtYSBzZW1pbmdndS4NCg0KDQoNCiMjICoqS2VzZWhhdGFuOiBNZW5naGl0dW5nIFJhdGEtcmF0YSBUZWthbmFuIERhcmFoKioNCg0KIyMjIFN0dWRpIEthc3VzOg0KDQpTZW9yYW5nIGRva3RlciBpbmdpbiBtZW5nYW5hbGlzaXMgcmF0YS1yYXRhIHRla2FuYW4gZGFyYWggZGFyaSBiZWJlcmFwYSBwYXNpZW4geWFuZyBkYXRhbmcgdW50dWsgcGVtZXJpa3NhYW4ga2VzZWhhdGFuLiBEYXRhIHRla2FuYW4gZGFyYWggeWFuZyBkaXVrdXIgcGFkYSA1IHBhc2llbiBhZGFsYWggc2ViYWdhaSBiZXJpa3V0IChkYWxhbSBtbUhnKToNCg0KKiAgIFBhc2llbiAxOiAxMjAvODAgbW1IZw0KKiAgIFBhc2llbiAyOiAxMjUvODUgbW1IZw0KKiAgIFBhc2llbiAzOiAxMzAvOTAgbW1IZw0KKiAgIFBhc2llbiA0OiAxMTgvNzggbW1IZw0KKiAgIFBhc2llbiA1OiAxMjIvODIgbW1IZw0KDQoqKlR1anVhbjoqKiBNZW5naGl0dW5nIHJhdGEtcmF0YSB0ZWthbmFuIGRhcmFoIHNpc3RvbGlrIGRhbiBkaWFzdG9saWsuDQoNCiMjIyBMYW5na2FoLUxhbmdrYWggTWVuZ2hpdHVuZyBSYXRhLXJhdGEgKE1lYW4pIFRla2FuYW4gRGFyYWg6DQoNCiogICAqKlRla2FuYW4gZGFyYWggc2lzdG9saWsgKGFuZ2thIHBlcnRhbWEpKioNCg0KICAgIDEyMCArIDEyNSArIDEzMCArIDExOCArIDEyMiA9IDYxNSBtbUhnDQoNCiAgICBKdW1sYWhrYW4gYW5na2Egc2lzdG9saWsgcGFkYSBrZWxpbWEgcGFzaWVuIGRhbiBiYWdpIGRlbmdhbiBqdW1sYWggcGFzaWVuICg1KToNCg0KICAgIFJhdGEtcmF0YSBzaXN0b2xpayA9IDYxNSAvIDUgPSAxMjMgbW1IZw0KDQoqICAgKipUZWthbmFuIGRhcmFoIGRpYXN0b2xpayAoYW5na2Ega2VkdWEpKioNCg0KICAgIDgwICsgODUgKyA5MCArIDc4ICsgODIgPSA0MTUgbW1IZw0KDQogICAgSnVtbGFoa2FuIGFuZ2thIGRpYXN0b2xpayBwYWRhIGtlbGltYSBwYXNpZW4gZGFuIGJhZ2kgZGVuZ2FuIGp1bWxhaCBwYXNpZW4gKDUpOg0KDQogICAgUmF0YS1yYXRhIGRpYXN0b2xpayA9IDQxNSAvIDUgPSA4MyBtbUhnDQoNCioqSGFzaWw6KioNCg0KKiAgIFJhdGEtcmF0YSB0ZWthbmFuIGRhcmFoIHNpc3RvbGlrIGFkYWxhaCAqKjEyMyBtbUhnKiouDQoNCiogICBSYXRhLXJhdGEgdGVrYW5hbiBkYXJhaCBkaWFzdG9saWsgYWRhbGFoICoqODMgbW1IZyoqLg0KDQoNCg0KIyMgKipQZW5kaWRpa2FuOiBNZW5naGl0dW5nIFJhdGEtcmF0YSBOaWxhaSBVamlhbiBTaXN3YSoqDQoNCiMjIyBTdHVkaSBLYXN1czoNCg0KU2VvcmFuZyBndXJ1IGluZ2luIG1lbmdldGFodWkgcmF0YS1yYXRhIG5pbGFpIHVqaWFuIG1hdGVtYXRpa2EgZGFyaSA2IHNpc3dhIGRpIGtlbGFzbnlhIHVudHVrIG1lbmdldmFsdWFzaSBoYXNpbCBiZWxhamFyIG1lcmVrYS4gQmVyaWt1dCBhZGFsYWggbmlsYWkgdWppYW4gbWF0ZW1hdGlrYSBwYXJhIHNpc3dhOg0KDQoqICAgU2lzd2EgMTogODUNCg0KKiAgIFNpc3dhIDI6IDkwDQoNCiogICBTaXN3YSAzOiA3NQ0KDQoqICAgU2lzd2EgNDogODgNCg0KKiAgIFNpc3dhIDU6IDkyDQoNCiogICBTaXN3YSA2OiA4MA0KDQoqKlR1anVhbjoqKiBNZW5naGl0dW5nIHJhdGEtcmF0YSBuaWxhaSB1amlhbiBtYXRlbWF0aWthLg0KDQojIyMgTGFuZ2thaC1MYW5na2FoIE1lbmdoaXR1bmcgUmF0YS1yYXRhIChNZWFuKSBOaWxhaToNCg0KMS4gKipKdW1sYWhrYW4gc2VsdXJ1aCBuaWxhaSB1amlhbjoqKg0KDQogICA4NSArIDkwICsgNzUgKyA4OCArIDkyICsgODAgPSA1MTANCg0KMi4gKipCYWdpIGp1bWxhaCB0b3RhbCBkZW5nYW4ganVtbGFoIHNpc3dhICg2IHNpc3dhKToqKg0KDQogICBSYXRhLXJhdGEgbmlsYWkgPSA1MTAgLyA2ID0gODUNCg0KKipIYXNpbDoqKiBSYXRhLXJhdGEgbmlsYWkgdWppYW4gbWF0ZW1hdGlrYSBwYXJhIHNpc3dhIGFkYWxhaCAqKjg1KiouDQo=