
Latihan 1
Sebuah perusahaan ingin memahami karakteristik penyebaran data hasil
penjualan dari empat cabang (A, B, C, dan D) selama satu bulan terakhir.
Data penjualan (dalam juta rupiah) dari keempat cabang tersebut adalah
sebagai berikut:
Cabang A: 50, 55, 60, 65, 70
Cabang B: 40, 50, 60, 70, 80
Cabang C: 30, 30, 35, 40, 45
Cabang D: 70, 75, 80, 85, 90
Hitung rata-rata, median, dan standar deviasi untuk masing-masing
cabang.
Data Penjualan Cabang A
Cabang A (\(50\),
\(55\), \(60\), \(65\), \(70\))
1. Rata-Rata (Mean)
Rata-rata (mean) dihitung dengan menjumlahkan semua
data, lalu membaginya dengan banyaknya data.
\[
{Mean} = \frac{\sum x}{n}
\]
Langkah-langkah Perhitungan:
\[
\text{Mean =} \ \frac{50 + 55 + 60 + 65+ 70}{5}
\]
\[
\text{Mean =} \ \frac{300}{5} =60
\] Hasil: Rata-rata penjualan di cabang A adalah
\(60\)
2.Median
Median adalah nilai tengah dari data yang telah
diurutkan. Karena jumlah datanya ganjil \((5\) data), median adalah data yang berada
di tengah.
Data sudah diurutkan: \(50\), \(55\), \(60\), \(65\), \(70\)
Median = \(60\)
Hasil: Median penjualan di Cabang A adalah \(60\) juta rupiah.
3.Standar Deviasi
Standar deviasi mengukur seberapa jauh data menyebar
dari rata-ratanya.
Standar deviasi (\(\sigma\)) untuk
data populasi dihitung menggunakan rumus:
\[
\sigma = \sqrt{\frac{\sum (x_i - \mu)^2}{n}}
\]
Di mana:
\(\sigma\) = Standar deviasi
\(x_i\) = Setiap nilai data
\(\mu\) = rata-rata data
\(n\) = jumlah data
Langkah-langkah Perhitungannya
1.Hitung selisih setiap data dari mean, lalu
kuadratkan:
\[ (50-60)^2= (-10)^2=100\] \[ (55-60)^2= (-5)^2=25\] \[ (60-60)^2= (0)^2=0\] \[ (65-60)^2= (5)^2=25\] \[ (70-60)^2= (10)^2=100\]
2.Jumlahkan hasil kuadrat
\[ 100 + 25 + 0+ 25+ 100=250\]
3.Bagi jumlah kuadrat selisih dengan banyaknya data (\(5\)):
\[ \ \frac{250}{5} =50 \]
4.Akar dari hasil tersebut adalah standar deviasi:
\[
\sigma = \sqrt{50} \approx 7.07
\]
Hasil: Standar deviasi penjualan di Cabang A adalah
\(7,07\)
Data Penjualan Cabang B
Cabang B (\(40\),
\(50\), \(60\), \(70\), \(80\))
1.Rata-rata (Mean)
Rumus untuk menghitung rata-rata (mean) adalah:
\[
{Mean} = \frac{\sum xi}{n}
\]
- \(xi\) = Setiap nilai data
- \(n\) = Jumlah Data (5)
Perhitungan
\[
\text{Mean =} \ \frac{40 + 50 + 60 + 70+ 80}{5}
\]
\[
\text{Mean =} \ \frac{300}{5} =60
\] Hasil: Rata-rata penjualan di cabang B adalah
\(60\)
2.Median (Nilai Tengah)
Median adalah nilai tengah dari data yang diurutkan.
Karena jumlah data adalah ganjil (\(5\)), median adalah nilai yang berada di
posisi tengah.
Data yang sudah diurutkan: \(40\),
\(50\), \(60\), \(70\), \(80\)
Jadi, nilai tengah atau median adalah \(60\) juta rupiah.
3.Standar Deviasi
Rumus untuk standar deviasi (\(\sigma\)) adalah:
\[
\sigma = \sqrt{\frac{\sum (x_i - \mu)^2}{n}}
\]
\(x_i\) = Setiap nilai data
\(\mu\) = Mean (\(60\)) \(n\) = jumlah data (\(5\))
Langkah-langkah Perhitungannya:
1. Hitung selisih setiap nilai data dengan mean (\(60\)), lalu kuadratkan:
\[ (40-60)^2= (-20)^2=400\] \[ (50-60)^2= (-10)^2=100\]
\[ (60-60)^2= (0)^2=0\] \[ (70-60)^2= (10)^2=100\] \[ (80-60)^2= (20)^2=400\]
2.Jumlahkan hasil kuadrat:
\[ 400 + 100 + 0+ 100+ 400=1000
\]
3.Bagi hasil penjumlahan dengan jumlah data (\(5\)):
\[ \ \frac{1000}{5} =200 \]
4.Akar dari hasil tersebut:
\[
\sigma = \sqrt{200} \approx 14.14
\]
Hasil: Standar deviasi penjualan di Cabang B adalah
\(14,14\)
Data Penjualan Cabang C
Cabang C (\(30\),
\(30\), \(35\), \(40\), \(45\))
1. Rata-Rata (Mean) Untuk menghitung rata-rata, kita
jumlahkan semua data penjualan dan kemudian bagi dengan banyaknya
data.
\[
\text{Rata-Rata =} \ \frac{30 + 30 + 35 + 40+ 45}{5}
\] \[
\text{Rata-Rata =} \ \frac{180}{5} =36
\]
Hasil: Rata-rata penjualan di cabang C adalah \(36\)
2.Median (Nilai Tengah)
Median adalah nilai tengah dari data yang sudah
diurutkan.
Data sudah berurutan: \(30\), \(30\), \(35\), \(40\), \(45\)
Karena jumlah data adalah ganjil (\(5\) data), maka median adalah nilai yang
ada di posisi tengah, yaitu \(35\)
3. Standar Deviasi (Standard Deviation)
Untuk menghitung standar deviasi, pertama kita harus menghitung
variansi dan kemudian mencari akar kuadrat dari variansi tersebut
Langkah 1: Hitung Selisih Setiap Data dari
Rata-Rata
Rata-rata (mean) = \(36\) jadi kita
hitung selisih antara setiap data dan rata-rata, lalu kuadratkan
hasilnya:
\[ (30-36)^2= (-6)^2=36\] \[ (30-36)^2= (-6)^2=36\]
\[ (35-36)^2= (-1)^2=1\]
\[ (40-36)^2= (4)^2=16\]
\[ (45-36)^2= (9)^2=81\]
Langkah 2: Jumlahkan Hasil Kuadratnya
\[ 36 + 36 + 1+ 16+ 81=170 \]
Langkah 3: Hitung Variansi Karena jumlah data adalah
\(5\), kita bagi hasil jumlah kuadrat
dengan \(5\) untuk menghitung
variansi:
\[
\text{Mean =} \ \frac{170}{5} =34
\]
Langkah 4: Hitung Standar Deviasi Standar deviasi
adalah akar kuadrat dari variansi:
\[
\sigma = \sqrt{34} \approx 5.83
\]
Penyebaran data penjualan di Cabang C memiliki standar deviasi
sekitar \(5.83\)
Data Penjualan Cabang D
Cabang D (\(70\),
\(75\), \(80\), \(85\), \(90\))
1. Rata-Rata (Mean)
Rumus Mean:
\[
{Mean} = \frac{\sum xi}{n}
\] 1.Langkah Perhitungannya:
\[
\text{Mean =} \ \frac{70 + 75 + 80 + 85+ 90}{5}
\] \[
\text{Mean =} \ \frac{400}{5} =80
\]
Hasil: Rata-rata penjualan di cabang D adalah \(80\)
2.Median (Nilai Tengah)
Untuk mencari median, data harus diurutkan (dalam hal ini sudah
diurutkan): \(70\), \(75\), \(80\), \(85\), \(90\)
Karena jumlah datanya ganjil, median adalah nilai tengah, yaitu \(80\)
3.Standar deviasi
Rumus untuk standar deviasi (\(\sigma\)) adalah:
\[
\sigma = \sqrt{\frac{\sum (x_i - \mu)^2}{n}}
\]
\(x_i\) = nilai data
\(\mu\) = Mean (\(80\)) \(n\) = jumlah data (\(5\))
Langkah-langkah Perhitungan:
1.Hitung selisih setiap data dari mean, lalu
kuadratkan:
\[ (70-80)^2= (-10)^2=100\] \[ (70-85)^2= (-5)^2=25\] \[ (80-80)^2= (0)^2=0\] \[ (85-80)^2= (5)^2=25\] \[ (90-80)^2= (10)^2=100\]
2.Jumlahkan hasil kuadrat:
\[ 100 + 25 + 0+ 25+ 100=250 \]
3.Bagi dengan jumlah data (5):
\[
\ \frac{250}{5} =50
\] 4.Akar dari hasil tersebut:
\[
\sigma = \sqrt{50} \approx 7.07
\]
Cabang mana yang memiliki penyebaran data paling kecil? Jelaskan
alasannya.
Rekap Standar Deviasi untuk Cabang A dan D
Cabang A (Data: \(50\), \(55\), \(60\), \(65\), \(70\))
- Standar Deviasi: \(7,07\) (hasil
perhitungan sebelumnya)
Cabang D (Data: \(70\), \(75\), \(80\), \(85\), \(90\))
- Standar Deviasi: \(7,07\) (hasil
perhitungan sebelumnya)
Kesimpulan Penyebaran Data
Cabang A dan Cabang D memiliki standar deviasi yang sama, yaitu
(\(7,07\)). Ini berarti penyebaran data
di kedua cabang tersebut sama-sama kecil dan stabil, meskipun nilai
penjualannya berbeda.
Penjelasan Alasan
Standar deviasi mengukur seberapa jauh nilai-nilai dalam data
menyebar dari rata-rata (mean). Jika standar deviasi kecil, berarti
nilai-nilai data cenderung berkumpul di sekitar rata-rata. Dengan nilai
standar deviasi yang sama untuk Cabang A dan D, dapat disimpulkan bahwa
variasi atau penyebaran data penjualan dari kedua cabang ini sama
kecilnya.
Penyebaran data yang kecil menunjukkan bahwa penjualan dari
masing-masing cabang cukup konsisten atau stabil selama bulan
tersebut.
Jika target penjualan minimum adalah \(50\) juta rupiah, cabang mana saja yang
gagal mencapai target di semua datanya?
Target Penjualan Minimum: \(50\)
Kriteria: Cabang dikatakan gagal mencapai target jika semua nilai
datanya di bawah \(50\).
1. Cabang A: \(50\), \(55\), \(60\), \(65\), \(70\)
Penilaian: Semua data: \(50\), \(55\), \(60\), \(65\), \(70\)
Nilai \(50\) sudah memenuhi
target (sama dengan \(50\)).
Kesimpulan: Cabang A berhasil mencapai target karena
tidak semua datanya di bawah \(50\)
juta rupiah.
2. Cabang B: \(40\), \(50\), \(60\), \(70\), \(80\)
Penilaian: Data: \(40\), \(50\), \(60\), \(70\), \(80\)
Nilai \(40\) di bawah target,
namun nilai lainnya (\(50\), \(60\), \(70\), \(80\)) memenuhi atau melebihi
target.
Kesimpulan: Cabang B berhasil mencapai target karena
tidak semua datanya di bawah \(50\).
3. Cabang C: \(30\), \(30\), \(35\), \(40\), \(45\)
Penilaian: Semua data: \(30\), \(30\), \(35\), \(40\), \(45\)
Semua nilai di bawah \(50\).
Kesimpulan: Cabang C gagal mencapai target karena
semua penjualannya di bawah \(50\).
4. Cabang D: \(70\), \(75\), \(80\), \(85\), \(90\)
Penilaian: Semua data: \(70\), \(75\), \(80\), \(85\), \(90\)
Semua nilai di atas target \(50\).
Kesimpulan: Cabang D berhasil mencapai target karena
semua penjualannya melebihi \(50\).
Ringkasan Hasil
Cabang A: ( \(50\),
\(55\), \(60\), \(65\), \(70\))
- Hasil : Berhasil Mencapai Target
Cabang B: ( \(40\),
\(50\), \(60\), \(70\), \(80\))
- Hasil : Berhasil Mencapai Target
Cabang C: (\(30\),
\(30\), \(35\), \(40\), \(45\))
- Hasil : Gagal Mencapai Target
Cabang D: ( \(70\),
\(75\), \(80\), \(85\), \(90\)
- Hasil: Berhasil Mencapai Target
Penjelasan Akhir
Hanya Cabang C yang gagal mencapai target karena semua datanya di
bawah \(50\) Cabang lainnya memiliki
setidaknya satu atau lebih nilai penjualan yang memenuhi atau melampaui
target \(50\).
Buatlah diagram kotak (box plot) untuk memvisualisasikan penyebaran
data setiap cabang.
Visualisasi Box Plot Cabang A
Visualisasi Box Plot Cabang B
Visualisasi Box Plot Cabang C
Visualisasi Box Plot Cabang D
Gabungan Visualisasi Box Plot (Cabang A,Cabang B,Cabang
C,Cabang D)
Latihan 2
Perusahaan XYZ mengelola pengiriman barang ke berbagai wilayah dengan
menggunakan berbagai jenis transportasi. Setiap pengiriman melibatkan
biaya transportasi, waktu yang dibutuhkan, dan jumlah barang yang
dikirim. Berikut adalah data terkait pengiriman barang berdasarkan
wilayah dan jenis barang:
Data
| Utara |
Elektronik |
200 |
5 |
15,000 |
| Selatan |
Pakaian |
150 |
8 |
8,000 |
| Timur |
Makanan |
180 |
6 |
10,000 |
| Barat |
Peralatan |
120 |
7 |
12,000 |
| Tengah |
Elektronik |
250 |
4 |
14,000 |
| Utara |
Pakaian |
300 |
9 |
8,500 |
| Selatan |
Makanan |
220 |
7 |
9,500 |
| Timur |
Peralatan |
140 |
5 |
11,000 |
| Barat |
Elektronik |
180 |
6 |
14,500 |
| Tengah |
Pakaian |
350 |
8 |
7,800 |
| Utara |
Peralatan |
170 |
4 |
12,000 |
| Selatan |
Elektronik |
250 |
6 |
16,000 |
| Timur |
Pakaian |
190 |
7 |
8,200 |
| Barat |
Makanan |
130 |
5 |
10,500 |
| Tengah |
Peralatan |
180 |
5 |
11,500 |
1. Analisis Efisiensi Pengiriman:
Visualisasikan pengiriman barang berdasarkan jumlah barang, waktu
pengiriman, dan biaya per unit dengan menggunakan plot 3D.
Tentukan wilayah mana yang memiliki efisiensi pengiriman terendah
berdasarkan biaya per unit dan waktu pengiriman.
Visualisasi Plot 3D
menentukan wilayah dengan efisiensi pengiriman terendah
berdasarkan biaya per unit dan waktu pengiriman
Langkah-langkah analisis:
1.Rasio Efisiensi: Rasio efisiensi dapat dihitung
dengan membagi biaya per unit dengan waktu pengiriman. Semakin kecil
rasio ini, semakin efisien pengirimannya (biaya lebih rendah dan waktu
lebih singkat).
Formula Rasio Efisiensi:
\[
\text{Rasio Efisiensi} = \dfrac{\text{Biaya Per Unit } }{Waktu \
Pengiriman}
\]
2. Kelompokkan Berdasarkan Wilayah: Kita kemudian
akan mengelompokkan data berdasarkan wilayah dan menghitung rata-rata
rasio efisiensi untuk setiap wilayah. Wilayah dengan rasio tertinggi
akan dianggap memiliki efisiensi pengiriman terendah.
## # A tibble: 5 × 3
## Wilayah Total_Biaya Efisiensi_Biaya
## <chr> <dbl> <dbl>
## 1 Barat 5415000 12593
## 2 Selatan 7290000 11758
## 3 Tengah 8300000 10641
## 4 Timur 4890000 9604
## 5 Utara 7590000 11328
Penjelasan Efisiensi Biaya
Efisiensi Biaya diukur dalam Rp/unit dan menunjukkan berapa besar
biaya yang dikeluarkan per unit barang yang dikirim.
Semakin tinggi nilai Efisiensi Biaya, semakin besar biaya yang
dikeluarkan untuk setiap unit barang, yang berarti pengiriman di wilayah
tersebut kurang efisien.
Analisis Wilayah dengan Efisiensi Terendah
Dari tabel di atas, kita bisa melihat peringkat efisiensi biaya dari
tertinggi ke terendah:
1. Barat: \(12,593.023\) (paling tidak
efisien)
2. Selatan: \(11,758.065\)
3. Utara: \(11,328.358\)
4. Tengah: \(10,641.026\)
5. Timur: \(9,603.922\) (paling
efisien)
Kesimpulan
Wilayah dengan efisiensi biaya terendah (biaya tertinggi per unit)
adalah:
Barat dengan Efisiensi Biaya sebesar \(12,593.023\) Rp/unit.
Ini menunjukkan bahwa pengiriman di wilayah Barat memerlukan biaya
tertinggi per unit barang yang dikirim, sehingga perlu perhatian khusus
untuk meningkatkan efisiensi.
2.Rekomendasi Operasional:
Berdasarkan hasil analisis, wilayah mana yang memerlukan perhatian
khusus untuk meningkatkan efisiensi pengiriman?
Berdasarkan hasil analisis dari data Total Biaya dan
Efisiensi Biaya per wilayah, wilayah yang memerlukan
perhatian khusus untuk meningkatkan efisiensi pengiriman adalah:
Wilayah Barat
Alasan:
1. Efisiensi Biaya Tertinggi:
Wilayah Barat memiliki efisiensi biaya sebesar \(12,593.023\) Rp/unit, tertinggi
dibandingkan wilayah lainnya.
Ini berarti biaya pengiriman per unit di wilayah ini lebih mahal
daripada wilayah lain.
2. Total Biaya yang Tinggi:
Total biaya pengiriman di wilayah Barat adalah Rp \(5,415,000,\) yang cukup besar meskipun
jumlah barang yang dikirim lebih sedikit dibanding wilayah lain.
Rekomendasi untuk Wilayah Barat:
1. Optimalkan rute dan jadwal pengiriman untuk mengurangi
waktu pengiriman.
2. Gunakan jenis transportasi yang lebih efisien dan hemat
biaya.
3. Evaluasi kembali proses logistik untuk menemukan
titik-titik inefisiensi.
4. Negosiasi ulang biaya pengiriman dengan penyedia jasa
transportasi.
5.Konsolidasi pengiriman barang untuk memaksimalkan kapasitas
angkut dan mengurangi biaya per unit.
Dengan melakukan langkah-langkah ini, diharapkan efisiensi biaya
pengiriman di wilayah Barat dapat meningkat.
Apa rekomendasi untuk mengurangi biaya dan waktu pengiriman di
wilayah tersebut?
1. Optimalkan Rute dan Jadwal Pengiriman
Identifikasi rute tercepat dan paling efisien dengan menggunakan
teknologi seperti sistem manajemen transportasi (TMS) atau aplikasi
pemetaan digital.
Hindari rute dengan kemacetan atau kondisi jalan yang buruk untuk
mempercepat waktu pengiriman.
Konsolidasi pengiriman berdasarkan wilayah tujuan agar bisa
dilakukan sekali jalan.
2. Gunakan Jenis Transportasi yang Lebih Efisien
Evaluasi jenis kendaraan yang digunakan untuk
pengiriman.
Gunakan kendaraan dengan kapasitas angkut lebih besar atau
kendaraan yang lebih hemat bahan bakar untuk menekan biaya
operasional.
Pertimbangkan opsi transportasi seperti pengiriman melalui kereta
api atau kapal untuk jarak jauh jika lebih ekonomis.
3. Negosiasi Tarif dengan Penyedia Layanan
Logistik
Lakukan negosiasi ulang dengan penyedia jasa pengiriman untuk
mendapatkan tarif yang lebih kompetitif.
Pertimbangkan bekerja sama dengan beberapa penyedia layanan untuk
membandingkan biaya dan memilih yang paling efisien.
4. Konsolidasi Pengiriman Barang
5. Implementasi Teknologi dan Automasi
Gunakan sistem pelacakan pengiriman secara real-time untuk
memantau pergerakan barang dan mengidentifikasi hambatan.
Automasi dalam manajemen gudang dan proses pemuatan barang agar
lebih cepat dan efisien.
6. Kurangi Waktu Bongkar Muat
7. Evaluasi dan Analisis Berkala
Lakukan evaluasi kinerja pengiriman secara berkala untuk
menemukan titik-titik inefisiensi.
Terapkan metrik kinerja seperti rata-rata waktu pengiriman dan
biaya per unit untuk memantau peningkatan efisiensi.
3. Kinerja Berdasarkan Jenis Barang:
Berdasarkan data pengiriman dari Perusahaan XYZ, berikut adalah
analisis kinerja pengiriman berdasarkan jenis barang dan wilayah dengan
melihat waktu pengiriman dan biaya per unit:
| Utara |
Elektronik |
200 |
5 |
15,000 |
| Selatan |
Pakaian |
150 |
8 |
8,000 |
| Timur |
Makanan |
180 |
6 |
10,000 |
| Barat |
Peralatan |
120 |
7 |
12,000 |
| Tengah |
Elektronik |
250 |
4 |
14,000 |
| Utara |
Pakaian |
300 |
9 |
8,500 |
| Selatan |
Makanan |
220 |
7 |
9,500 |
| Timur |
Peralatan |
140 |
5 |
11,000 |
| Barat |
Elektronik |
180 |
6 |
14,500 |
| Tengah |
Pakaian |
350 |
8 |
7,800 |
| Utara |
Peralatan |
170 |
4 |
12,000 |
| Selatan |
Elektronik |
250 |
6 |
16,000 |
| Timur |
Pakaian |
190 |
7 |
8,200 |
| Barat |
Makanan |
130 |
5 |
10,500 |
| Tengah |
Peralatan |
180 |
5 |
11,500 |
Analisis Kinerja Berdasarkan Jenis Barang
1. Elektronik
- Waktu Pengiriman Rata-Rata
\[ (5+4+6+6)/4=5,25 \ jam\]
- Biaya per Unit Rata-Rata:
\[ (15,000+14,000+14,500+16,000)/4=14,875
\ Rp/\ Unit \]
2. Pakaian
- Waktu Pengiriman Rata-Rata
\[ (8+9+8+7)/4=8 \ jam\]
- Biaya per Unit Rata-Rata:
\[ (8,000+8,500+7,800+8,200)/4=8,125 \
Rp/\ Unit \]
3. Makanan
- Waktu Pengiriman Rata-Rata
\[ (6+7+5)/3=6 \ jam\]
- Biaya per Unit Rata-Rata:
\[ (10,000+9,500+10,500)/3=10,000 \ Rp/\
Unit \]
4. Peralatan
- Waktu Pengiriman Rata-Rata
\[ (7+5+4+5)/4=5,25 \ jam\]
- Biaya per Unit Rata-Rata:
\[ (12,000+11,000+12,000+11,500)/4=11,625
\ Rp/\ Unit \]
Kesimpulan Berdasarkan Jenis Barang
1. Waktu Pengiriman Tercepat:
- Elektronik dan Peralatan: Rata-rata \(5,25\) jam
2. Biaya per Unit Terendah:
- Pakaian: Rata-rata \(8,125\)
Rp/unit
Analisis Kinerja Barang
Analisis Kinerja Pengiriman per Wilayah
| Utara |
18 |
3 |
6.00 |
11833 |
| Selatan |
21 |
3 |
7.00 |
11833 |
| Timur |
18 |
3 |
6.00 |
9733 |
| Barat |
18 |
3 |
6.00 |
12333 |
| Tengah |
17 |
3 |
5.67 |
11100 |
Kesimpulan Berdasarkan Wilayah
1. Waktu Pengiriman Tercepat:
- Tengah: Rata-rata \(5,67\) jam
2. Biaya per Unit Terendah:
- Timur: Rata-rata \(9,733\)
Rp/unit
Rekomendasi
Dengan memperhatikan rekomendasi ini, perusahaan dapat meningkatkan
efisiensi pengiriman secara keseluruhan.
LS0tDQp0aXRsZTogIlRVR0FTIFNUQVRJU1RJS0EgREFTQVIiDQoNCnN1YnRpdGxlOiAiVWt1cmFuIFBlbnllYmFyYW4gRGF0YSINCg0KYXV0aG9yOiANCiAgLSAiIEZpa2EgSXJzYW5kaSBEZXN2eWFudGkgKDUyMjQwMDAxMykiDQogIA0KZGF0ZTogICJgciBmb3JtYXQoU3lzLkRhdGUoKSwgJyVCICVkLCAlWScpYCINCm91dHB1dDoNCiAgcm1kZm9ybWF0czo6cmVhZHRoZWRvd246DQogICAgc2VsZl9jb250YWluZWQ6IHRydWUNCiAgICB0aHVtYm5haWxzOiB0cnVlDQogICAgbGlnaHRib3g6IHRydWUNCiAgICBnYWxsZXJ5OiB0cnVlDQogICAgbGliX2RpcjogbGlicw0KICAgIGRmX3ByaW50OiAicGFnZWQiDQogICAgY29kZV9mb2xkaW5nOiAic2hvdyINCiAgICBjb2RlX2Rvd25sb2FkOiB5ZXMNCiAgICBjc3M6ICJTdHlsZS5jc3MiDQogICAgDQotLS0NCg0KIDxpbWcgaWQ9ImxvZ28tdXRhbWEiIHNyYz0iRmlrYWEuanBnIiBhbHQ9IkZpa2FhLmpwZyIgc3R5bGU9IndpZHRoOjIwMHB4OyBkaXNwbGF5OiBibG9jazsgbWFyZ2luOiBhdXRvOyI+DQoNCi0tLQ0KDQojIExhdGloYW4gMQ0KDQpTZWJ1YWggcGVydXNhaGFhbiBpbmdpbiBtZW1haGFtaSBrYXJha3RlcmlzdGlrIHBlbnllYmFyYW4gZGF0YSBoYXNpbCBwZW5qdWFsYW4gZGFyaSBlbXBhdCBjYWJhbmcgKEEsIEIsIEMsIGRhbiBEKSBzZWxhbWEgc2F0dSBidWxhbiB0ZXJha2hpci4gRGF0YSBwZW5qdWFsYW4gKGRhbGFtIGp1dGEgcnVwaWFoKSBkYXJpIGtlZW1wYXQgY2FiYW5nIHRlcnNlYnV0IGFkYWxhaCBzZWJhZ2FpIGJlcmlrdXQ6DQoNCi0gQ2FiYW5nIEE6IDUwLCA1NSwgNjAsIDY1LCA3MA0KDQotIENhYmFuZyBCOiA0MCwgNTAsIDYwLCA3MCwgODANCg0KLSBDYWJhbmcgQzogMzAsIDMwLCAzNSwgNDAsIDQ1DQoNCi0gQ2FiYW5nIEQ6IDcwLCA3NSwgODAsIDg1LCA5MA0KDQojIyBIaXR1bmcgcmF0YS1yYXRhLCBtZWRpYW4sIGRhbiBzdGFuZGFyIGRldmlhc2kgdW50dWsgbWFzaW5nLW1hc2luZyBjYWJhbmcuDQoNCiMgRGF0YSBQZW5qdWFsYW4gQ2FiYW5nIEEgDQoqKkNhYmFuZyBBKiogIChcKDUwXCksIFwoNTVcKSwgXCg2MFwpLCBcKDY1XCksIFwoNzBcKSkgDQoNCioqMS4gUmF0YS1SYXRhIChNZWFuKSoqDQoNCioqUmF0YS1yYXRhIChtZWFuKSoqIGRpaGl0dW5nIGRlbmdhbiBtZW5qdW1sYWhrYW4gc2VtdWEgZGF0YSwgbGFsdSBtZW1iYWdpbnlhIGRlbmdhbiBiYW55YWtueWEgZGF0YS4NCg0KJCQNCntNZWFufSA9IFxmcmFje1xzdW0geH17bn0NCiQkDQoNCioqTGFuZ2thaC1sYW5na2FoIFBlcmhpdHVuZ2FuOioqDQoNCiQkDQpcdGV4dHtNZWFuID19IFwgXGZyYWN7NTAgKyA1NSArIDYwICsgNjUrIDcwfXs1fSANCiQkDQoNCiQkDQpcdGV4dHtNZWFuID19IFwgXGZyYWN7MzAwfXs1fSA9NjANCiQkDQoqKkhhc2lsOioqIFJhdGEtcmF0YSBwZW5qdWFsYW4gZGkgY2FiYW5nIEEgYWRhbGFoIFwoNjBcKQ0KDQoqKjIuTWVkaWFuKioNCg0KKipNZWRpYW4qKiBhZGFsYWggbmlsYWkgdGVuZ2FoIGRhcmkgZGF0YSB5YW5nIHRlbGFoIGRpdXJ1dGthbi4NCkthcmVuYSBqdW1sYWggZGF0YW55YSBnYW5qaWwgXCgoNVwpIGRhdGEpLCBtZWRpYW4gYWRhbGFoIGRhdGEgeWFuZyBiZXJhZGEgZGkgdGVuZ2FoLg0KDQpEYXRhIHN1ZGFoIGRpdXJ1dGthbjoNClwoNTBcKSwgXCg1NVwpLCBcKDYwXCksIFwoNjVcKSwgXCg3MFwpDQoNCk1lZGlhbiA9IFwoNjBcKQ0KDQoqKkhhc2lsOioqIE1lZGlhbiBwZW5qdWFsYW4gZGkgQ2FiYW5nIEEgYWRhbGFoIFwoNjBcKSBqdXRhIHJ1cGlhaC4NCg0KDQoqKjMuU3RhbmRhciBEZXZpYXNpKioNCg0KKipTdGFuZGFyIGRldmlhc2kqKiBtZW5ndWt1ciBzZWJlcmFwYSBqYXVoIGRhdGEgbWVueWViYXIgZGFyaSByYXRhLXJhdGFueWEuIA0KDQpTdGFuZGFyIGRldmlhc2kgKFwoXHNpZ21hXCkpIHVudHVrIGRhdGEgcG9wdWxhc2kgZGloaXR1bmcgbWVuZ2d1bmFrYW4gcnVtdXM6DQoNClxbDQpcc2lnbWEgPSBcc3FydHtcZnJhY3tcc3VtICh4X2kgLSBcbXUpXjJ9e259fQ0KXF0NCg0KKipEaSBtYW5hOioqICANCiBcKFxzaWdtYVwpID0gU3RhbmRhciBkZXZpYXNpICANCiBcKHhfaVwpID0gU2V0aWFwIG5pbGFpIGRhdGEgIA0KIFwoXG11XCkgPSByYXRhLXJhdGEgZGF0YSAgDQogXChuXCkgPSBqdW1sYWggZGF0YQ0KIA0KICoqTGFuZ2thaC1sYW5na2FoIFBlcmhpdHVuZ2FubnlhKioNCiANCiAqKjEuSGl0dW5nIHNlbGlzaWggc2V0aWFwIGRhdGEgZGFyaSBtZWFuLCBsYWx1IGt1YWRyYXRrYW46KioNCiANCiAkJCAoNTAtNjApXjI9ICgtMTApXjI9MTAwJCQNCiAkJCAoNTUtNjApXjI9ICgtNSleMj0yNSQkDQogJCQgKDYwLTYwKV4yPSAoMCleMj0wJCQNCiAgJCQgKDY1LTYwKV4yPSAoNSleMj0yNSQkDQogICQkICg3MC02MCleMj0gKDEwKV4yPTEwMCQkDQogKioyLkp1bWxhaGthbiBoYXNpbCBrdWFkcmF0KioNCiANCiAkJCAxMDAgKyAyNSArIDArIDI1KyAxMDA9MjUwJCQNCiANCiAqKjMuQmFnaSBqdW1sYWgga3VhZHJhdCBzZWxpc2loIGRlbmdhbiBiYW55YWtueWEgZGF0YSAoXCg1XCkpOioqDQogDQogJCQgXCBcZnJhY3syNTB9ezV9ID01MCAkJA0KICoqNC5Ba2FyIGRhcmkgaGFzaWwgdGVyc2VidXQgYWRhbGFoIHN0YW5kYXIgZGV2aWFzaToqKg0KIA0KIFxbDQpcc2lnbWEgPSBcc3FydHs1MH0gXGFwcHJveCA3LjA3DQpcXQ0KDQoqKkhhc2lsOioqIFN0YW5kYXIgZGV2aWFzaSBwZW5qdWFsYW4gZGkgQ2FiYW5nIEEgYWRhbGFoIFwoNywwN1wpDQoNCiMgRGF0YSBQZW5qdWFsYW4gQ2FiYW5nIEINCg0KKipDYWJhbmcgQioqIChcKDQwXCksIFwoNTBcKSwgXCg2MFwpLCBcKDcwXCksIFwoODBcKSkgDQoNCioqMS5SYXRhLXJhdGEgKE1lYW4pKioNCg0KUnVtdXMgdW50dWsgbWVuZ2hpdHVuZyByYXRhLXJhdGEgKG1lYW4pIGFkYWxhaDoNCg0KJCQNCntNZWFufSA9IFxmcmFje1xzdW0geGl9e259DQokJA0KDQotIFwoeGlcKVwgPSBTZXRpYXAgbmlsYWkgZGF0YQ0KLSBcKG5cKVwgPSBKdW1sYWggRGF0YSAoNSkNCg0KKipQZXJoaXR1bmdhbioqDQoNCiQkDQpcdGV4dHtNZWFuID19IFwgXGZyYWN7NDAgKyA1MCArIDYwICsgNzArIDgwfXs1fSANCiQkDQoNCiQkDQpcdGV4dHtNZWFuID19IFwgXGZyYWN7MzAwfXs1fSA9NjANCiQkDQoqKkhhc2lsOioqIFJhdGEtcmF0YSBwZW5qdWFsYW4gZGkgY2FiYW5nIEIgYWRhbGFoIFwoNjBcKQ0KDQoqKjIuTWVkaWFuIChOaWxhaSBUZW5nYWgpKioNCg0KKipNZWRpYW4qKiBhZGFsYWggbmlsYWkgdGVuZ2FoIGRhcmkgZGF0YSB5YW5nIGRpdXJ1dGthbi4gS2FyZW5hIGp1bWxhaCBkYXRhIGFkYWxhaCBnYW5qaWwgKFwoNVwpKSwgbWVkaWFuIGFkYWxhaCBuaWxhaSB5YW5nIGJlcmFkYSBkaSBwb3Npc2kgdGVuZ2FoLg0KDQpEYXRhIHlhbmcgc3VkYWggZGl1cnV0a2FuOg0KXCg0MFwpLCBcKDUwXCksIFwoNjBcKSwgXCg3MFwpLCBcKDgwXCkNCg0KSmFkaSwgbmlsYWkgdGVuZ2FoIGF0YXUgbWVkaWFuIGFkYWxhaCBcKDYwXCkganV0YSBydXBpYWguDQoNCioqMy5TdGFuZGFyIERldmlhc2kqKg0KDQpSdW11cyB1bnR1ayBzdGFuZGFyIGRldmlhc2kgKFwoXHNpZ21hXCkpIGFkYWxhaDoNCg0KXFsNClxzaWdtYSA9IFxzcXJ0e1xmcmFje1xzdW0gKHhfaSAtIFxtdSleMn17bn19DQpcXQ0KDQpcKHhfaVwpID0gU2V0aWFwIG5pbGFpIGRhdGEgIA0KIFwoXG11XCkgPSBNZWFuIChcKDYwXCkpIA0KIFwoblwpID0ganVtbGFoIGRhdGEgKFwoNVwpKQ0KIA0KICoqTGFuZ2thaC1sYW5na2FoIFBlcmhpdHVuZ2FubnlhOioqDQogDQogKioxLiBIaXR1bmcgc2VsaXNpaCBzZXRpYXAgbmlsYWkgZGF0YSBkZW5nYW4gbWVhbiAoXCg2MFwpKSwgbGFsdSBrdWFkcmF0a2FuOioqDQogDQogJCQgKDQwLTYwKV4yPSAoLTIwKV4yPTQwMCQkDQogJCQgKDUwLTYwKV4yPSAoLTEwKV4yPTEwMCQkDQogDQogJCQgKDYwLTYwKV4yPSAoMCleMj0wJCQNCiAkJCAoNzAtNjApXjI9ICgxMCleMj0xMDAkJA0KICQkICg4MC02MCleMj0gKDIwKV4yPTQwMCQkDQogKioyLkp1bWxhaGthbiBoYXNpbCBrdWFkcmF0OioqDQogDQokJCA0MDAgKyAxMDAgKyAwKyAxMDArIDQwMD0xMDAwICQkDQoNCioqMy5CYWdpIGhhc2lsIHBlbmp1bWxhaGFuIGRlbmdhbiBqdW1sYWggZGF0YSAoXCg1XCkpOioqDQogDQogJCQgXCBcZnJhY3sxMDAwfXs1fSA9MjAwICQkDQogDQogKio0LkFrYXIgZGFyaSBoYXNpbCB0ZXJzZWJ1dDoqKg0KIA0KIFxbDQpcc2lnbWEgPSBcc3FydHsyMDB9IFxhcHByb3ggMTQuMTQNClxdDQoNCioqSGFzaWw6KiogU3RhbmRhciBkZXZpYXNpIHBlbmp1YWxhbiBkaSBDYWJhbmcgQiBhZGFsYWggXCgxNCwxNFwpDQoNCiMgRGF0YSBQZW5qdWFsYW4gQ2FiYW5nIEMNCioqQ2FiYW5nIEMqKiAoXCgzMFwpLCBcKDMwXCksIFwoMzVcKSwgXCg0MFwpLCBcKDQ1XCkpIA0KDQoqKjEuIFJhdGEtUmF0YSAoTWVhbikqKiANClVudHVrIG1lbmdoaXR1bmcgcmF0YS1yYXRhLCBraXRhIGp1bWxhaGthbiBzZW11YSBkYXRhIHBlbmp1YWxhbiBkYW4ga2VtdWRpYW4gYmFnaSBkZW5nYW4gYmFueWFrbnlhIGRhdGEuDQoNCiQkDQpcdGV4dHtSYXRhLVJhdGEgPX0gXCBcZnJhY3szMCArIDMwICsgMzUgKyA0MCsgNDV9ezV9IA0KJCQNCiQkDQpcdGV4dHtSYXRhLVJhdGEgPX0gXCBcZnJhY3sxODB9ezV9ID0zNg0KJCQNCg0KKipIYXNpbDoqKiBSYXRhLXJhdGEgcGVuanVhbGFuIGRpIGNhYmFuZyBDIGFkYWxhaCBcKDM2XCkNCg0KKioyLk1lZGlhbiAoTmlsYWkgVGVuZ2FoKSoqDQoNCioqTWVkaWFuKiogYWRhbGFoIG5pbGFpIHRlbmdhaCBkYXJpIGRhdGEgeWFuZyBzdWRhaCBkaXVydXRrYW4uIA0KDQpEYXRhIHN1ZGFoIGJlcnVydXRhbjoNClwoMzBcKSwgXCgzMFwpLCBcKDM1XCksIFwoNDBcKSwgXCg0NVwpDQoNCkthcmVuYSBqdW1sYWggZGF0YSBhZGFsYWggZ2FuamlsIChcKDVcKSBkYXRhKSwgbWFrYSBtZWRpYW4gYWRhbGFoIG5pbGFpIHlhbmcgYWRhIGRpIHBvc2lzaSB0ZW5nYWgsIHlhaXR1IFwoMzVcKSANCg0KKiozLiBTdGFuZGFyIERldmlhc2kgKFN0YW5kYXJkIERldmlhdGlvbikqKg0KDQpVbnR1ayBtZW5naGl0dW5nIHN0YW5kYXIgZGV2aWFzaSwgcGVydGFtYSBraXRhIGhhcnVzIG1lbmdoaXR1bmcgdmFyaWFuc2kgZGFuIGtlbXVkaWFuIG1lbmNhcmkgYWthciBrdWFkcmF0IGRhcmkgdmFyaWFuc2kgdGVyc2VidXQNCg0KKipMYW5na2FoIDE6IEhpdHVuZyBTZWxpc2loIFNldGlhcCBEYXRhIGRhcmkgUmF0YS1SYXRhKioNCg0KUmF0YS1yYXRhIChtZWFuKSA9IFwoMzZcKSBqYWRpIGtpdGEgaGl0dW5nIHNlbGlzaWggYW50YXJhIHNldGlhcCBkYXRhIGRhbiByYXRhLXJhdGEsIGxhbHUga3VhZHJhdGthbiBoYXNpbG55YToNCg0KICQkICgzMC0zNileMj0gKC02KV4yPTM2JCQNCiAkJCAoMzAtMzYpXjI9ICgtNileMj0zNiQkDQogDQogJCQgKDM1LTM2KV4yPSAoLTEpXjI9MSQkDQogDQogICQkICg0MC0zNileMj0gKDQpXjI9MTYkJA0KICANCiAgJCQgKDQ1LTM2KV4yPSAoOSleMj04MSQkDQogIA0KICAqKkxhbmdrYWggMjogSnVtbGFoa2FuIEhhc2lsIEt1YWRyYXRueWEqKg0KIA0KJCQgMzYgKyAzNiArIDErIDE2KyA4MT0xNzAgJCQNCg0KKipMYW5na2FoIDM6IEhpdHVuZyBWYXJpYW5zaSoqDQpLYXJlbmEganVtbGFoIGRhdGEgYWRhbGFoIFwoNVwpLCBraXRhIGJhZ2kgaGFzaWwganVtbGFoIGt1YWRyYXQgZGVuZ2FuIFwoNVwpIHVudHVrIG1lbmdoaXR1bmcgdmFyaWFuc2k6DQoNCiQkDQpcdGV4dHtNZWFuID19IFwgXGZyYWN7MTcwfXs1fSA9MzQNCiQkDQoNCioqTGFuZ2thaCA0OiBIaXR1bmcgU3RhbmRhciBEZXZpYXNpKioNClN0YW5kYXIgZGV2aWFzaSBhZGFsYWggYWthciBrdWFkcmF0IGRhcmkgdmFyaWFuc2k6DQoNClxbDQpcc2lnbWEgPSBcc3FydHszNH0gXGFwcHJveCA1LjgzDQpcXQ0KDQpQZW55ZWJhcmFuIGRhdGEgcGVuanVhbGFuIGRpIENhYmFuZyBDIG1lbWlsaWtpIHN0YW5kYXIgZGV2aWFzaSBzZWtpdGFyIFwoNS44M1wpIA0KDQojIERhdGEgUGVuanVhbGFuIENhYmFuZyBEDQoqKkNhYmFuZyBEKiogKFwoNzBcKSwgXCg3NVwpLCBcKDgwXCksIFwoODVcKSwgXCg5MFwpKSANCg0KKioxLiBSYXRhLVJhdGEgKE1lYW4pKiogDQoNCioqUnVtdXMgTWVhbjoqKg0KDQokJA0Ke01lYW59ID0gXGZyYWN7XHN1bSB4aX17bn0NCiQkDQoqKjEuTGFuZ2thaCBQZXJoaXR1bmdhbm55YToqKg0KDQokJA0KXHRleHR7TWVhbiA9fSBcIFxmcmFjezcwICsgNzUgKyA4MCArIDg1KyA5MH17NX0gDQokJA0KJCQNClx0ZXh0e01lYW4gPX0gXCBcZnJhY3s0MDB9ezV9ID04MA0KJCQNCg0KKipIYXNpbDoqKiBSYXRhLXJhdGEgcGVuanVhbGFuIGRpIGNhYmFuZyBEIGFkYWxhaCBcKDgwXCkNCg0KKioyLk1lZGlhbiAoTmlsYWkgVGVuZ2FoKSoqDQoNClVudHVrIG1lbmNhcmkgbWVkaWFuLCBkYXRhIGhhcnVzIGRpdXJ1dGthbiAoZGFsYW0gaGFsIGluaSBzdWRhaCBkaXVydXRrYW4pOg0KXCg3MFwpLCBcKDc1XCksIFwoODBcKSwgXCg4NVwpLCBcKDkwXCkNCg0KS2FyZW5hIGp1bWxhaCBkYXRhbnlhIGdhbmppbCwgbWVkaWFuIGFkYWxhaCBuaWxhaSB0ZW5nYWgsIHlhaXR1IFwoODBcKQ0KDQoqKjMuU3RhbmRhciBkZXZpYXNpKioNCg0KKipSdW11cyB1bnR1ayBzdGFuZGFyIGRldmlhc2kqKiAoXChcc2lnbWFcKSkgYWRhbGFoOg0KDQpcWw0KXHNpZ21hID0gXHNxcnR7XGZyYWN7XHN1bSAoeF9pIC0gXG11KV4yfXtufX0NClxdDQoNClwoeF9pXCkgPSBuaWxhaSBkYXRhICANCiBcKFxtdVwpID0gTWVhbiAoXCg4MFwpKSANCiBcKG5cKSA9IGp1bWxhaCBkYXRhIChcKDVcKSkNCiANCioqTGFuZ2thaC1sYW5na2FoIFBlcmhpdHVuZ2FuOioqDQoNCioqMS5IaXR1bmcgc2VsaXNpaCBzZXRpYXAgZGF0YSBkYXJpIG1lYW4sIGxhbHUga3VhZHJhdGthbjoqKg0KIA0KICQkICg3MC04MCleMj0gKC0xMCleMj0xMDAkJA0KICAkJCAoNzAtODUpXjI9ICgtNSleMj0yNSQkDQogICAkJCAoODAtODApXjI9ICgwKV4yPTAkJA0KICAgICAkJCAoODUtODApXjI9ICg1KV4yPTI1JCQNCiAgICAgICAkJCAoOTAtODApXjI9ICgxMCleMj0xMDAkJA0KKioyLkp1bWxhaGthbiBoYXNpbCBrdWFkcmF0OioqDQoNCiQkIDEwMCArIDI1ICsgMCsgMjUrIDEwMD0yNTAgJCQNCg0KKiozLkJhZ2kgZGVuZ2FuIGp1bWxhaCBkYXRhICg1KToqKg0KDQokJA0KXCBcZnJhY3syNTB9ezV9ID01MA0KJCQNCioqNC5Ba2FyIGRhcmkgaGFzaWwgdGVyc2VidXQ6KioNCg0KXFsNClxzaWdtYSA9IFxzcXJ0ezUwfSBcYXBwcm94IDcuMDcNClxdDQoNCiMjIyBDYWJhbmcgbWFuYSB5YW5nIG1lbWlsaWtpIHBlbnllYmFyYW4gZGF0YSBwYWxpbmcga2VjaWw/IEplbGFza2FuIGFsYXNhbm55YS4NCg0KKipSZWthcCBTdGFuZGFyIERldmlhc2kgdW50dWsgQ2FiYW5nIEEgZGFuIEQqKg0KDQoqKkNhYmFuZyBBKiogKERhdGE6IFwoNTBcKSwgXCg1NVwpLCBcKDYwXCksIFwoNjVcKSwgXCg3MFwpKQ0KDQotIFN0YW5kYXIgRGV2aWFzaTogXCg3LDA3XCkgIChoYXNpbCBwZXJoaXR1bmdhbiBzZWJlbHVtbnlhKQ0KDQoqKkNhYmFuZyBEKiogKERhdGE6IFwoNzBcKSwgXCg3NVwpLCBcKDgwXCksIFwoODVcKSwgXCg5MFwpKQ0KDQotIFN0YW5kYXIgRGV2aWFzaTogXCg3LDA3XCkgIChoYXNpbCBwZXJoaXR1bmdhbiBzZWJlbHVtbnlhKQ0KDQoqKktlc2ltcHVsYW4gUGVueWViYXJhbiBEYXRhKioNCg0KQ2FiYW5nIEEgZGFuIENhYmFuZyBEIG1lbWlsaWtpIHN0YW5kYXIgZGV2aWFzaSB5YW5nIHNhbWEsIHlhaXR1IChcKDcsMDdcKSkuDQpJbmkgYmVyYXJ0aSBwZW55ZWJhcmFuIGRhdGEgZGkga2VkdWEgY2FiYW5nIHRlcnNlYnV0IHNhbWEtc2FtYSBrZWNpbCBkYW4gc3RhYmlsLCBtZXNraXB1biBuaWxhaSBwZW5qdWFsYW5ueWEgYmVyYmVkYS4NCg0KKipQZW5qZWxhc2FuIEFsYXNhbioqDQoNClN0YW5kYXIgZGV2aWFzaSBtZW5ndWt1ciBzZWJlcmFwYSBqYXVoIG5pbGFpLW5pbGFpIGRhbGFtIGRhdGEgbWVueWViYXIgZGFyaSByYXRhLXJhdGEgKG1lYW4pLiBKaWthIHN0YW5kYXIgZGV2aWFzaSBrZWNpbCwgYmVyYXJ0aSBuaWxhaS1uaWxhaSBkYXRhIGNlbmRlcnVuZyBiZXJrdW1wdWwgZGkgc2VraXRhciByYXRhLXJhdGEuIERlbmdhbiBuaWxhaSBzdGFuZGFyIGRldmlhc2kgeWFuZyBzYW1hIHVudHVrIENhYmFuZyBBIGRhbiBELCBkYXBhdCBkaXNpbXB1bGthbiBiYWh3YSB2YXJpYXNpIGF0YXUgcGVueWViYXJhbiBkYXRhIHBlbmp1YWxhbiBkYXJpIGtlZHVhIGNhYmFuZyBpbmkgc2FtYSBrZWNpbG55YS4NCg0KUGVueWViYXJhbiBkYXRhIHlhbmcga2VjaWwgbWVudW5qdWtrYW4gYmFod2EgcGVuanVhbGFuIGRhcmkgbWFzaW5nLW1hc2luZyBjYWJhbmcgY3VrdXAga29uc2lzdGVuIGF0YXUgc3RhYmlsIHNlbGFtYSBidWxhbiB0ZXJzZWJ1dC4NCg0KIyMjIEppa2EgdGFyZ2V0IHBlbmp1YWxhbiBtaW5pbXVtIGFkYWxhaCBcKDUwXCkganV0YSBydXBpYWgsIGNhYmFuZyBtYW5hIHNhamEgeWFuZyBnYWdhbCBtZW5jYXBhaSB0YXJnZXQgZGkgc2VtdWEgZGF0YW55YT8NCg0KKipUYXJnZXQgUGVuanVhbGFuIE1pbmltdW06IFwoNTBcKSoqDQoNCktyaXRlcmlhOiBDYWJhbmcgZGlrYXRha2FuIGdhZ2FsIG1lbmNhcGFpIHRhcmdldCBqaWthIHNlbXVhIG5pbGFpIGRhdGFueWEgZGkgYmF3YWggXCg1MFwpLg0KDQoqKjEuIENhYmFuZyBBOioqIFwoNTBcKSwgXCg1NVwpLCBcKDYwXCksIFwoNjVcKSwgXCg3MFwpDQoNCi0gKipQZW5pbGFpYW46KioNClNlbXVhIGRhdGE6IFwoNTBcKSwgXCg1NVwpLCBcKDYwXCksIFwoNjVcKSwgXCg3MFwpDQoNCi0gTmlsYWkgXCg1MFwpIHN1ZGFoIG1lbWVudWhpIHRhcmdldCAoc2FtYSBkZW5nYW4gXCg1MFwpKS4NCg0KKipLZXNpbXB1bGFuOioqIENhYmFuZyBBIGJlcmhhc2lsIG1lbmNhcGFpIHRhcmdldCBrYXJlbmEgdGlkYWsgc2VtdWEgZGF0YW55YSBkaSBiYXdhaCBcKDUwXCkganV0YSBydXBpYWguDQoNCioqMi4gQ2FiYW5nIEI6KiogXCg0MFwpLCBcKDUwXCksIFwoNjBcKSwgXCg3MFwpLCBcKDgwXCkNCg0KLSAqKlBlbmlsYWlhbjoqKg0KRGF0YTogXCg0MFwpLCBcKDUwXCksIFwoNjBcKSwgXCg3MFwpLCBcKDgwXCkNCg0KLSBOaWxhaSBcKDQwXCkgZGkgYmF3YWggdGFyZ2V0LCBuYW11biBuaWxhaSBsYWlubnlhIChcKDUwXCksIFwoNjBcKSwgXCg3MFwpLCBcKDgwXCkpIG1lbWVudWhpIGF0YXUgbWVsZWJpaGkgdGFyZ2V0Lg0KDQoqKktlc2ltcHVsYW46KiogQ2FiYW5nIEIgYmVyaGFzaWwgbWVuY2FwYWkgdGFyZ2V0IGthcmVuYSB0aWRhayBzZW11YSBkYXRhbnlhIGRpIGJhd2FoIFwoNTBcKS4NCg0KKiozLiBDYWJhbmcgQzoqKiBcKDMwXCksIFwoMzBcKSwgXCgzNVwpLCBcKDQwXCksIFwoNDVcKQ0KDQotICoqUGVuaWxhaWFuOioqDQpTZW11YSBkYXRhOiBcKDMwXCksIFwoMzBcKSwgXCgzNVwpLCBcKDQwXCksIFwoNDVcKQ0KDQotIFNlbXVhIG5pbGFpIGRpIGJhd2FoIFwoNTBcKS4NCg0KKipLZXNpbXB1bGFuOioqIENhYmFuZyBDIGdhZ2FsIG1lbmNhcGFpIHRhcmdldCBrYXJlbmEgc2VtdWEgcGVuanVhbGFubnlhIGRpIGJhd2FoIFwoNTBcKS4NCg0KKio0LiBDYWJhbmcgRDoqKiBcKDcwXCksIFwoNzVcKSwgXCg4MFwpLCBcKDg1XCksIFwoOTBcKQ0KDQotICoqUGVuaWxhaWFuOioqDQpTZW11YSBkYXRhOiBcKDcwXCksIFwoNzVcKSwgXCg4MFwpLCBcKDg1XCksIFwoOTBcKQ0KDQotIFNlbXVhIG5pbGFpIGRpIGF0YXMgdGFyZ2V0IFwoNTBcKS4NCg0KKipLZXNpbXB1bGFuOioqIENhYmFuZyBEIGJlcmhhc2lsIG1lbmNhcGFpIHRhcmdldCBrYXJlbmEgc2VtdWEgcGVuanVhbGFubnlhIG1lbGViaWhpIFwoNTBcKS4NCg0KKipSaW5na2FzYW4gSGFzaWwqKg0KDQoqKkNhYmFuZyBBOioqICgJXCg1MFwpLCBcKDU1XCksIFwoNjBcKSwgXCg2NVwpLCBcKDcwXCkpDQoNCi0gSGFzaWwgOiBCZXJoYXNpbCBNZW5jYXBhaSBUYXJnZXQNCg0KKipDYWJhbmcgQjoqKiAoCVwoNDBcKSwgXCg1MFwpLCBcKDYwXCksIFwoNzBcKSwgXCg4MFwpKQ0KDQotIEhhc2lsIDogQmVyaGFzaWwgTWVuY2FwYWkgVGFyZ2V0DQoNCioqQ2FiYW5nIEM6KiogKFwoMzBcKSwgXCgzMFwpLCBcKDM1XCksIFwoNDBcKSwgXCg0NVwpKQ0KDQotIEhhc2lsIDogR2FnYWwgTWVuY2FwYWkgVGFyZ2V0DQoNCioqQ2FiYW5nIEQ6KiogKAlcKDcwXCksIFwoNzVcKSwgXCg4MFwpLCBcKDg1XCksIFwoOTBcKQ0KDQotIEhhc2lsOiBCZXJoYXNpbCBNZW5jYXBhaSBUYXJnZXQgDQoNCioqUGVuamVsYXNhbiBBa2hpcioqDQoNCkhhbnlhIENhYmFuZyBDIHlhbmcgZ2FnYWwgbWVuY2FwYWkgdGFyZ2V0IGthcmVuYSBzZW11YSBkYXRhbnlhIGRpIGJhd2FoIFwoNTBcKSBDYWJhbmcgbGFpbm55YSBtZW1pbGlraSBzZXRpZGFrbnlhIHNhdHUgYXRhdSBsZWJpaCBuaWxhaSBwZW5qdWFsYW4geWFuZyBtZW1lbnVoaSBhdGF1IG1lbGFtcGF1aSB0YXJnZXQgXCg1MFwpLg0KDQojIyMgQnVhdGxhaCBkaWFncmFtIGtvdGFrIChib3ggcGxvdCkgdW50dWsgbWVtdmlzdWFsaXNhc2lrYW4gcGVueWViYXJhbiBkYXRhIHNldGlhcCBjYWJhbmcuDQoNCioqVmlzdWFsaXNhc2kgQm94IFBsb3QgQ2FiYW5nIEEgKioNCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmxpYnJhcnkocGxvdGx5KQ0KDQojIERhdGEgcGVuanVhbGFuIENhYmFuZyBBDQpjYWJhbmdfYSA8LSBjKDUwLCA1NSwgNjAsIDY1LCA3MCkNCg0KIyBNZW1idWF0IEJveCBQbG90IHVudHVrIENhYmFuZyBBDQpwbG90X2x5KCkgJT4lDQogIGFkZF90cmFjZSgNCiAgICB5ID0gY2FiYW5nX2EsDQogICAgdHlwZSA9ICJib3giLA0KICAgIG5hbWUgPSAiQ2FiYW5nIEEiLA0KICAgIGJveG1lYW4gPSBUUlVFLA0KICAgIG1hcmtlciA9IGxpc3QoY29sb3IgPSAnbGF2ZW5kZXInKQ0KICApICU+JQ0KICBsYXlvdXQoDQogICAgdGl0bGUgPSAiQm94IFBsb3QgUGVuanVhbGFuIENhYmFuZyBBIiwNCiAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiUGVuanVhbGFuIChqdXRhIHJ1cGlhaCkiKSwNCiAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiQ2FiYW5nIEEiKQ0KICApDQoNCg0KDQpgYGANCg0KDQoqKlZpc3VhbGlzYXNpIEJveCBQbG90IENhYmFuZyBCKiogDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KbGlicmFyeShwbG90bHkpDQoNCiMgRGF0YSBwZW5qdWFsYW4gQ2FiYW5nIEINCmNhYmFuZ19iIDwtIGMoNDAsIDUwLCA2MCwgNzAsIDgwKQ0KDQojIE1lbWJ1YXQgQm94IFBsb3QgdW50dWsgQ2FiYW5nIEIgZGVuZ2FuIHdhcm5hIHBpbmsNCnBsb3RfbHkoKSAlPiUNCiAgYWRkX3RyYWNlKA0KICAgIHkgPSBjYWJhbmdfYiwNCiAgICB0eXBlID0gImJveCIsDQogICAgbmFtZSA9ICJDYWJhbmcgQiIsDQogICAgYm94bWVhbiA9IFRSVUUsDQogICAgZmlsbGNvbG9yID0gJ3BpbmsnLCAgICAgICAgIyBNZW5nYXR1ciB3YXJuYSBpc2kga290YWsgbWVuamFkaSBwaW5rDQogICAgbGluZSA9IGxpc3QoY29sb3IgPSAnYmxhY2snKSAgIyBPcHNpb25hbDogTWVuZ2F0dXIgd2FybmEgZ2FyaXMgdGVwaSBrb3Rhaw0KICApICU+JQ0KICBsYXlvdXQoDQogICAgdGl0bGUgPSAiQm94IFBsb3QgUGVuanVhbGFuIENhYmFuZyBCIiwNCiAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiUGVuanVhbGFuIChqdXRhIHJ1cGlhaCkiKSwNCiAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiQ2FiYW5nIEIiKQ0KICApDQoNCg0KYGBgDQoNCg0KKipWaXN1YWxpc2FzaSBCb3ggUGxvdCBDYWJhbmcgQyoqDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpsaWJyYXJ5KHBsb3RseSkNCg0KIyBEYXRhIHBlbmp1YWxhbiBDYWJhbmcgQw0KY2FiYW5nX2MgPC0gYygzMCwgMzAsIDM1LCA0MCwgNDUpDQoNCiMgTWVtYnVhdCBCb3ggUGxvdCB1bnR1ayBDYWJhbmcgQyBkZW5nYW4gd2FybmEgdW5ndQ0KcGxvdF9seSgpICU+JQ0KICBhZGRfdHJhY2UoDQogICAgeSA9IGNhYmFuZ19jLA0KICAgIHR5cGUgPSAiYm94IiwNCiAgICBuYW1lID0gIkNhYmFuZyBDIiwNCiAgICBib3htZWFuID0gVFJVRSwNCiAgICBmaWxsY29sb3IgPSAncHVycGxlJywgICAgICMgTWVuZ2F0dXIgd2FybmEga290YWsgbWVuamFkaSB1bmd1DQogICAgbGluZSA9IGxpc3QoY29sb3IgPSAnYmxhY2snKSAgIyBNZW5nYXR1ciB3YXJuYSBnYXJpcyB0ZXBpIGtvdGFrDQogICkgJT4lDQogIGxheW91dCgNCiAgICB0aXRsZSA9ICJCb3ggUGxvdCBQZW5qdWFsYW4gQ2FiYW5nIEMiLA0KICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICJQZW5qdWFsYW4gKGp1dGEgcnVwaWFoKSIpLA0KICAgIHhheGlzID0gbGlzdCh0aXRsZSA9ICJDYWJhbmcgQyIpDQogICkNCg0KDQpgYGANCg0KDQoqKlZpc3VhbGlzYXNpIEJveCBQbG90IENhYmFuZyBEKioNCg0KYGBge3IgIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpsaWJyYXJ5KHBsb3RseSkNCg0KIyBEYXRhIHBlbmp1YWxhbiBDYWJhbmcgRA0KY2FiYW5nX2QgPC0gYyg3MCwgNzUsIDgwLCA4NSwgOTApDQoNCiMgTWVtYnVhdCBCb3ggUGxvdCB1bnR1ayBDYWJhbmcgRCBkZW5nYW4gd2FybmEgbWVyYWgNCnBsb3RfbHkoKSAlPiUNCiAgYWRkX3RyYWNlKA0KICAgIHkgPSBjYWJhbmdfZCwNCiAgICB0eXBlID0gImJveCIsDQogICAgbmFtZSA9ICJDYWJhbmcgRCIsDQogICAgYm94bWVhbiA9IFRSVUUsDQogICAgZmlsbGNvbG9yID0gJ3JlZCcsICAgICAgICAgICAgIyBNZW5nYXR1ciB3YXJuYSBpc2kga290YWsgbWVuamFkaSBtZXJhaA0KICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gJ2JsYWNrJykgICMgTWVuZ2F0dXIgd2FybmEgZ2FyaXMgdGVwaSBrb3Rhaw0KICApICU+JQ0KICBsYXlvdXQoDQogICAgdGl0bGUgPSAiQm94IFBsb3QgUGVuanVhbGFuIENhYmFuZyBEIiwNCiAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiUGVuanVhbGFuIChqdXRhIHJ1cGlhaCkiKSwNCiAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiQ2FiYW5nIEQiKQ0KICApDQoNCg0KYGBgDQoNCg0KKipHYWJ1bmdhbiBWaXN1YWxpc2FzaSBCb3ggUGxvdCAoQ2FiYW5nIEEsQ2FiYW5nIEIsQ2FiYW5nIEMsQ2FiYW5nIEQpKioNCg0KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmxpYnJhcnkocGxvdGx5KQ0KDQojIERhdGEgcGVuanVhbGFuIHVudHVrIHNldGlhcCBjYWJhbmcNCmNhYmFuZ19hIDwtIGMoNTAsIDU1LCA2MCwgNjUsIDcwKQ0KY2FiYW5nX2IgPC0gYyg0MCwgNTAsIDYwLCA3MCwgODApDQpjYWJhbmdfYyA8LSBjKDMwLCAzMCwgMzUsIDQwLCA0NSkNCmNhYmFuZ19kIDwtIGMoNzAsIDc1LCA4MCwgODUsIDkwKQ0KDQojIE1lbWJ1YXQgQm94IFBsb3QgZ2FidW5nYW4gdW50dWsgc2VtdWEgY2FiYW5nDQpwbG90X2x5KCkgJT4lDQogIGFkZF90cmFjZSgNCiAgICB5ID0gY2FiYW5nX2EsDQogICAgdHlwZSA9ICJib3giLA0KICAgIG5hbWUgPSAiQ2FiYW5nIEEiLA0KICAgIGZpbGxjb2xvciA9ICdsaWdodGJsdWUnLA0KICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gJ2JsYWNrJykNCiAgKSAlPiUNCiAgYWRkX3RyYWNlKA0KICAgIHkgPSBjYWJhbmdfYiwNCiAgICB0eXBlID0gImJveCIsDQogICAgbmFtZSA9ICJDYWJhbmcgQiIsDQogICAgZmlsbGNvbG9yID0gJ2xpZ2h0Z3JlZW4nLA0KICAgIGxpbmUgPSBsaXN0KGNvbG9yID0gJ2JsYWNrJykNCiAgKSAlPiUNCiAgYWRkX3RyYWNlKA0KICAgIHkgPSBjYWJhbmdfYywNCiAgICB0eXBlID0gImJveCIsDQogICAgbmFtZSA9ICJDYWJhbmcgQyIsDQogICAgZmlsbGNvbG9yID0gJ3B1cnBsZScsDQogICAgbGluZSA9IGxpc3QoY29sb3IgPSAnYmxhY2snKQ0KICApICU+JQ0KICBhZGRfdHJhY2UoDQogICAgeSA9IGNhYmFuZ19kLA0KICAgIHR5cGUgPSAiYm94IiwNCiAgICBuYW1lID0gIkNhYmFuZyBEIiwNCiAgICBmaWxsY29sb3IgPSAncmVkJywNCiAgICBsaW5lID0gbGlzdChjb2xvciA9ICdibGFjaycpDQogICkgJT4lDQogIGxheW91dCgNCiAgICB0aXRsZSA9ICJCb3ggUGxvdCBQZW5qdWFsYW4gQ2FiYW5nIEEsIEIsIEMsIGRhbiBEIiwNCiAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiUGVuanVhbGFuIChqdXRhIHJ1cGlhaCkiKSwNCiAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiQ2FiYW5nIikNCiAgKQ0KDQoNCmBgYA0KDQojIyMgSmlrYSBBbmRhIGFkYWxhaCBtYW5hamVyIHBlcnVzYWhhYW4sIGJhZ2FpbWFuYSBBbmRhIGFrYW4gbWVuZ2d1bmFrYW4gaW5mb3JtYXNpIGluaSB1bnR1ayBtZXJlbmNhbmFrYW4gc3RyYXRlZ2kgcGVuaW5na2F0YW4gcGVuanVhbGFuPw0KDQpTZWJhZ2FpIG1hbmFqZXIgcGVydXNhaGFhbiwgc2F5YSBha2FuIG1lbWFuZmFhdGthbiBpbmZvcm1hc2kgaW5pIHVudHVrIG1lbGloYXQgcG9sYSBkYW4gdmFyaWFzaSBwZW5qdWFsYW4gZGkgc2V0aWFwIGNhYmFuZy4gRGFyaSBkYXRhIGluaSwgbWlzYWxueWEsIGppa2EgYWRhIGNhYmFuZyB5YW5nIGhhc2lsIHBlbmp1YWxhbm55YSBrb25zaXN0ZW4gcmVuZGFoIGF0YXUgdGlkYWsgc3RhYmlsLCBzYXlhIGFrYW4gbWVuY29iYSBtZW5jYXJpIHRhaHUgcGVueWViYWJueWEuIE11bmdraW4gcGVybHUgZGliZXJpa2FuIHBlbGF0aWhhbiB0YW1iYWhhbiB1bnR1ayB0aW0gcGVuanVhbGFuIGF0YXUgc3RyYXRlZ2kgcGVtYXNhcmFuIHlhbmcgbGViaWggZWZla3RpZi4NCg0KVW50dWsgY2FiYW5nIGRlbmdhbiBwZXJmb3JtYSBwZW5qdWFsYW4geWFuZyBzdWRhaCBiYWlrLCBzZXBlcnRpIENhYmFuZyBELCBzYXlhIGFrYW4gbWVuY2FyaSBjYXJhIGFnYXIgcGVyZm9ybWEgaW5pIHRldGFwIHRlcmphZ2EsIG1pc2FsbnlhIGRlbmdhbiBtZW1iZXJpa2FuIGluc2VudGlmIGF0YXUgYm9udXMga2VwYWRhIGthcnlhd2FuIGFnYXIgbWVyZWthIHRldGFwIHRlcm1vdGl2YXNpLg0KDQpTZWxhaW4gaXR1LCBkZW5nYW4gbWVuZ2V0YWh1aSBwZW55ZWJhcmFuIGRhdGEgcGVuanVhbGFuIGRhcmkgc2V0aWFwIGNhYmFuZywgc2F5YSBiaXNhIG1lbWJ1YXQgdGFyZ2V0IHlhbmcgbGViaWggcmVhbGlzdGlzIHVudHVrIG1hc2luZy1tYXNpbmcgY2FiYW5nLiBKYWRpLCBzdHJhdGVnaSB5YW5nIHNheWEgdGVyYXBrYW4gYmlzYSBsZWJpaCBzcGVzaWZpaywgc2VzdWFpIGtlYnV0dWhhbiBkYW4gdGFudGFuZ2FuIGRpIHNldGlhcCBsb2thc2kuDQoNCg0KIyBMYXRpaGFuIDINCg0KUGVydXNhaGFhbiBYWVogbWVuZ2Vsb2xhIHBlbmdpcmltYW4gYmFyYW5nIGtlIGJlcmJhZ2FpIHdpbGF5YWggZGVuZ2FuIG1lbmdndW5ha2FuIGJlcmJhZ2FpIGplbmlzIHRyYW5zcG9ydGFzaS4gU2V0aWFwIHBlbmdpcmltYW4gbWVsaWJhdGthbiBiaWF5YSB0cmFuc3BvcnRhc2ksIHdha3R1IHlhbmcgZGlidXR1aGthbiwgZGFuIGp1bWxhaCBiYXJhbmcgeWFuZyBkaWtpcmltLiBCZXJpa3V0IGFkYWxhaCBkYXRhIHRlcmthaXQgcGVuZ2lyaW1hbiBiYXJhbmcgYmVyZGFzYXJrYW4gd2lsYXlhaCBkYW4gamVuaXMgYmFyYW5nOg0KDQojIyBEYXRhDQoNCnwgKldpbGF5YWgqIHwgKkplbmlzIEJhcmFuZyogfCAqSnVtbGFoIEJhcmFuZyAodW5pdCkqIHwgKldha3R1IFBlbmdpcmltYW4gKGphbSkqIHwgKkJpYXlhIHBlciBVbml0IChScCkqIHwNCnwtLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfA0KfCBVdGFyYSAgICAgICB8IEVsZWt0cm9uaWsgICAgICAgfCAyMDAgICAgICAgICAgICAgICAgICAgICAgfCA1ICAgICAgICAgICAgICAgICAgICAgICAgICB8IDE1LDAwMCAgICAgICAgICAgICAgICAgIHwNCnwgU2VsYXRhbiAgICAgfCBQYWthaWFuICAgICAgICAgIHwgMTUwICAgICAgICAgICAgICAgICAgICAgIHwgOCAgICAgICAgICAgICAgICAgICAgICAgICAgfCA4LDAwMCAgICAgICAgICAgICAgICAgICB8DQp8IFRpbXVyICAgICAgIHwgTWFrYW5hbiAgICAgICAgICB8IDE4MCAgICAgICAgICAgICAgICAgICAgICB8IDYgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMTAsMDAwICAgICAgICAgICAgICAgICAgfA0KfCBCYXJhdCAgICAgICB8IFBlcmFsYXRhbiAgICAgICAgfCAxMjAgICAgICAgICAgICAgICAgICAgICAgfCA3ICAgICAgICAgICAgICAgICAgICAgICAgICB8IDEyLDAwMCAgICAgICAgICAgICAgICAgIHwNCnwgVGVuZ2FoICAgICAgfCBFbGVrdHJvbmlrICAgICAgIHwgMjUwICAgICAgICAgICAgICAgICAgICAgIHwgNCAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNCwwMDAgICAgICAgICAgICAgICAgICB8DQp8IFV0YXJhICAgICAgIHwgUGFrYWlhbiAgICAgICAgICB8IDMwMCAgICAgICAgICAgICAgICAgICAgICB8IDkgICAgICAgICAgICAgICAgICAgICAgICAgIHwgOCw1MDAgICAgICAgICAgICAgICAgICAgfA0KfCBTZWxhdGFuICAgICB8IE1ha2FuYW4gICAgICAgICAgfCAyMjAgICAgICAgICAgICAgICAgICAgICAgfCA3ICAgICAgICAgICAgICAgICAgICAgICAgICB8IDksNTAwICAgICAgICAgICAgICAgICAgIHwNCnwgVGltdXIgICAgICAgfCBQZXJhbGF0YW4gICAgICAgIHwgMTQwICAgICAgICAgICAgICAgICAgICAgIHwgNSAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMSwwMDAgICAgICAgICAgICAgICAgICB8DQp8IEJhcmF0ICAgICAgIHwgRWxla3Ryb25payAgICAgICB8IDE4MCAgICAgICAgICAgICAgICAgICAgICB8IDYgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMTQsNTAwICAgICAgICAgICAgICAgICAgfA0KfCBUZW5nYWggICAgICB8IFBha2FpYW4gICAgICAgICAgfCAzNTAgICAgICAgICAgICAgICAgICAgICAgfCA4ICAgICAgICAgICAgICAgICAgICAgICAgICB8IDcsODAwICAgICAgICAgICAgICAgICAgIHwNCnwgVXRhcmEgICAgICAgfCBQZXJhbGF0YW4gICAgICAgIHwgMTcwICAgICAgICAgICAgICAgICAgICAgIHwgNCAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMiwwMDAgICAgICAgICAgICAgICAgICB8DQp8IFNlbGF0YW4gICAgIHwgRWxla3Ryb25payAgICAgICB8IDI1MCAgICAgICAgICAgICAgICAgICAgICB8IDYgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMTYsMDAwICAgICAgICAgICAgICAgICAgfA0KfCBUaW11ciAgICAgICB8IFBha2FpYW4gICAgICAgICAgfCAxOTAgICAgICAgICAgICAgICAgICAgICAgfCA3ICAgICAgICAgICAgICAgICAgICAgICAgICB8IDgsMjAwICAgICAgICAgICAgICAgICAgIHwNCnwgQmFyYXQgICAgICAgfCBNYWthbmFuICAgICAgICAgIHwgMTMwICAgICAgICAgICAgICAgICAgICAgIHwgNSAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMCw1MDAgICAgICAgICAgICAgICAgICB8DQp8IFRlbmdhaCAgICAgIHwgUGVyYWxhdGFuICAgICAgICB8IDE4MCAgICAgICAgICAgICAgICAgICAgICB8IDUgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMTEsNTAwICAgICAgICAgICAgICAgICAgfA0KDQoNCg0KIyMgMS4gQW5hbGlzaXMgRWZpc2llbnNpIFBlbmdpcmltYW46DQoNCi0gVmlzdWFsaXNhc2lrYW4gcGVuZ2lyaW1hbiBiYXJhbmcgYmVyZGFzYXJrYW4ganVtbGFoIGJhcmFuZywgd2FrdHUgcGVuZ2lyaW1hbiwgZGFuIGJpYXlhIHBlciB1bml0IGRlbmdhbiBtZW5nZ3VuYWthbiBwbG90IDNELg0KDQotIFRlbnR1a2FuIHdpbGF5YWggbWFuYSB5YW5nIG1lbWlsaWtpIGVmaXNpZW5zaSBwZW5naXJpbWFuIHRlcmVuZGFoIGJlcmRhc2Fya2FuIGJpYXlhIHBlciB1bml0IGRhbiB3YWt0dSBwZW5naXJpbWFuLg0KDQoqKlZpc3VhbGlzYXNpIFBsb3QgM0QqKg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KbGlicmFyeShwbG90bHkpDQoNCiMgTWVtYnVhdCBEYXRhIEZyYW1lIHVudHVrIHBlbmdpcmltYW4NCmRhdGFfcGVuZ2lyaW1hbiA8LSBkYXRhLmZyYW1lKA0KICBXaWxheWFoID0gYygiVXRhcmEiLCAiU2VsYXRhbiIsICJUaW11ciIsICJCYXJhdCIsICJUZW5nYWgiLCAiVXRhcmEiLCAiU2VsYXRhbiIsICJUaW11ciIsICJCYXJhdCIsICJUZW5nYWgiLCAiVXRhcmEiLCAiU2VsYXRhbiIsICJUaW11ciIsICJCYXJhdCIsICJUZW5nYWgiKSwNCiAgSmVuaXNfQmFyYW5nID0gYygiRWxla3Ryb25payIsICJQYWthaWFuIiwgIk1ha2FuYW4iLCAiUGVyYWxhdGFuIiwgIkVsZWt0cm9uaWsiLCAiUGFrYWlhbiIsICJNYWthbmFuIiwgIlBlcmFsYXRhbiIsICJFbGVrdHJvbmlrIiwgIlBha2FpYW4iLCAiUGVyYWxhdGFuIiwgIkVsZWt0cm9uaWsiLCAiUGFrYWlhbiIsICJNYWthbmFuIiwgIlBlcmFsYXRhbiIpLA0KICBKdW1sYWhfQmFyYW5nID0gYygyMDAsIDE1MCwgMTgwLCAxMjAsIDI1MCwgMzAwLCAyMjAsIDE0MCwgMTgwLCAzNTAsIDE3MCwgMjUwLCAxOTAsIDEzMCwgMTgwKSwNCiAgV2FrdHVfUGVuZ2lyaW1hbiA9IGMoNSwgOCwgNiwgNywgNCwgOSwgNywgNSwgNiwgOCwgNCwgNiwgNywgNSwgNSksDQogIEJpYXlhX1Blcl9Vbml0ID0gYygxNTAwMCwgODAwMCwgMTAwMDAsIDEyMDAwLCAxNDAwMCwgODUwMCwgOTUwMCwgMTEwMDAsIDE0NTAwLCA3ODAwLCAxMjAwMCwgMTYwMDAsIDgyMDAsIDEwNTAwLCAxMTUwMCkNCikNCg0KIyBNZW1idWF0IFBsb3QgM0QNCnBsb3RfbHkoDQogIGRhdGEgPSBkYXRhX3BlbmdpcmltYW4sDQogIHggPSB+SnVtbGFoX0JhcmFuZywNCiAgeSA9IH5XYWt0dV9QZW5naXJpbWFuLA0KICB6ID0gfkJpYXlhX1Blcl9Vbml0LA0KICBjb2xvciA9IH5XaWxheWFoLA0KICBzeW1ib2wgPSB+SmVuaXNfQmFyYW5nLA0KICB0eXBlID0gInNjYXR0ZXIzZCIsDQogIG1vZGUgPSAibWFya2VycyIsDQogIG1hcmtlciA9IGxpc3Qoc2l6ZSA9IDYpDQopICU+JQ0KICBsYXlvdXQoDQogICAgdGl0bGUgPSAiVmlzdWFsaXNhc2kgM0QgUGVuZ2lyaW1hbiBCYXJhbmciLA0KICAgIHNjZW5lID0gbGlzdCgNCiAgICAgIHhheGlzID0gbGlzdCh0aXRsZSA9ICJKdW1sYWggQmFyYW5nICh1bml0KSIpLA0KICAgICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gIldha3R1IFBlbmdpcmltYW4gKGphbSkiKSwNCiAgICAgIHpheGlzID0gbGlzdCh0aXRsZSA9ICJCaWF5YSBwZXIgVW5pdCAoUnApIikNCiAgICApDQogICkNCg0KDQpgYGANCg0KDQoqKm1lbmVudHVrYW4gd2lsYXlhaCBkZW5nYW4gZWZpc2llbnNpIHBlbmdpcmltYW4gdGVyZW5kYWggYmVyZGFzYXJrYW4gYmlheWEgcGVyIHVuaXQgZGFuIHdha3R1IHBlbmdpcmltYW4qKg0KDQoqKkxhbmdrYWgtbGFuZ2thaCBhbmFsaXNpczoqKg0KDQoqKjEuUmFzaW8gRWZpc2llbnNpOioqDQpSYXNpbyBlZmlzaWVuc2kgZGFwYXQgZGloaXR1bmcgZGVuZ2FuIG1lbWJhZ2kgYmlheWEgcGVyIHVuaXQgZGVuZ2FuIHdha3R1IHBlbmdpcmltYW4uIFNlbWFraW4ga2VjaWwgcmFzaW8gaW5pLCBzZW1ha2luIGVmaXNpZW4gcGVuZ2lyaW1hbm55YSAoYmlheWEgbGViaWggcmVuZGFoIGRhbiB3YWt0dSBsZWJpaCBzaW5na2F0KS4NCg0KRm9ybXVsYSBSYXNpbyBFZmlzaWVuc2k6DQoNCiQkDQpcdGV4dHtSYXNpbyBFZmlzaWVuc2l9ID0gXGRmcmFje1x0ZXh0e0JpYXlhIFBlciBVbml0IH0gfXtXYWt0dSAgXCBQZW5naXJpbWFufQ0KJCQNCg0KKioyLiBLZWxvbXBva2thbiBCZXJkYXNhcmthbiBXaWxheWFoOioqDQpLaXRhIGtlbXVkaWFuIGFrYW4gbWVuZ2Vsb21wb2trYW4gZGF0YSBiZXJkYXNhcmthbiB3aWxheWFoIGRhbiBtZW5naGl0dW5nIHJhdGEtcmF0YSByYXNpbyBlZmlzaWVuc2kgdW50dWsgc2V0aWFwIHdpbGF5YWguIFdpbGF5YWggZGVuZ2FuIHJhc2lvIHRlcnRpbmdnaSBha2FuIGRpYW5nZ2FwIG1lbWlsaWtpIGVmaXNpZW5zaSBwZW5naXJpbWFuIHRlcmVuZGFoLg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KIyBJbnN0YWxsIGRhbiBsb2FkIGxpYnJhcnkgdGliYmxlIGppa2EgYmVsdW0gYWRhDQppZiAoIXJlcXVpcmVOYW1lc3BhY2UoInRpYmJsZSIsIHF1aWV0bHkgPSBUUlVFKSkgaW5zdGFsbC5wYWNrYWdlcygidGliYmxlIikNCmxpYnJhcnkodGliYmxlKQ0KDQojIE1lbWJ1YXQgdGFiZWwgc2VwZXJ0aSBwYWRhIGdhbWJhcg0KZGF0YSA8LSB0aWJibGUoDQogIFdpbGF5YWggPSBjKCJCYXJhdCIsICJTZWxhdGFuIiwgIlRlbmdhaCIsICJUaW11ciIsICJVdGFyYSIpLA0KICBUb3RhbF9CaWF5YSA9IGMoNTQxNTAwMCwgNzI5MDAwMCwgODMwMDAwMCwgNDg5MDAwMCwgNzU5MDAwMCksDQogIEVmaXNpZW5zaV9CaWF5YSA9IGMoMTI1OTMsIDExNzU4LCAxMDY0MSwgOTYwNCwgMTEzMjgpDQopDQoNCiMgQ2V0YWsgdGFiZWwNCnByaW50KGRhdGEpDQoNCg0KYGBgDQoNCioqUGVuamVsYXNhbiBFZmlzaWVuc2kgQmlheWEqKg0KDQotIEVmaXNpZW5zaSBCaWF5YSBkaXVrdXIgZGFsYW0gUnAvdW5pdCBkYW4gbWVudW5qdWtrYW4gYmVyYXBhIGJlc2FyIGJpYXlhIHlhbmcgZGlrZWx1YXJrYW4gcGVyIHVuaXQgYmFyYW5nIHlhbmcgZGlraXJpbS4NCg0KLSBTZW1ha2luIHRpbmdnaSBuaWxhaSBFZmlzaWVuc2kgQmlheWEsIHNlbWFraW4gYmVzYXIgYmlheWEgeWFuZyBkaWtlbHVhcmthbiB1bnR1ayBzZXRpYXAgdW5pdCBiYXJhbmcsIHlhbmcgYmVyYXJ0aSBwZW5naXJpbWFuIGRpIHdpbGF5YWggdGVyc2VidXQga3VyYW5nIGVmaXNpZW4uDQoNCioqQW5hbGlzaXMgV2lsYXlhaCBkZW5nYW4gRWZpc2llbnNpIFRlcmVuZGFoKiogDQoNCkRhcmkgdGFiZWwgZGkgYXRhcywga2l0YSBiaXNhIG1lbGloYXQgcGVyaW5na2F0IGVmaXNpZW5zaSBiaWF5YSBkYXJpIHRlcnRpbmdnaSBrZSB0ZXJlbmRhaDoNCg0KKioxLiBCYXJhdDoqKiBcKDEyLDU5My4wMjNcKSAqKihwYWxpbmcgdGlkYWsgZWZpc2llbikqKg0KDQoqKjIuIFNlbGF0YW46KiogXCgxMSw3NTguMDY1XCkNCg0KKiozLiBVdGFyYToqKiBcKDExLDMyOC4zNThcKQ0KDQoqKjQuIFRlbmdhaDoqKiBcKDEwLDY0MS4wMjZcKQ0KDQoqKjUuIFRpbXVyOioqIFwoOSw2MDMuOTIyXCkgKioocGFsaW5nIGVmaXNpZW4pKioNCg0KKipLZXNpbXB1bGFuKioNCg0KV2lsYXlhaCBkZW5nYW4gZWZpc2llbnNpIGJpYXlhIHRlcmVuZGFoIChiaWF5YSB0ZXJ0aW5nZ2kgcGVyIHVuaXQpIGFkYWxhaDoNCg0KQmFyYXQgZGVuZ2FuIEVmaXNpZW5zaSBCaWF5YSBzZWJlc2FyIFwoMTIsNTkzLjAyM1wpIFJwL3VuaXQuDQoNCkluaSBtZW51bmp1a2thbiBiYWh3YSBwZW5naXJpbWFuIGRpIHdpbGF5YWggQmFyYXQgbWVtZXJsdWthbiBiaWF5YSB0ZXJ0aW5nZ2kgcGVyIHVuaXQgYmFyYW5nIHlhbmcgZGlraXJpbSwgc2VoaW5nZ2EgcGVybHUgcGVyaGF0aWFuIGtodXN1cyB1bnR1ayBtZW5pbmdrYXRrYW4gZWZpc2llbnNpLg0KDQojIyAyLlJla29tZW5kYXNpIE9wZXJhc2lvbmFsOg0KDQojIyMgQmVyZGFzYXJrYW4gaGFzaWwgYW5hbGlzaXMsIHdpbGF5YWggbWFuYSB5YW5nIG1lbWVybHVrYW4gcGVyaGF0aWFuIGtodXN1cyB1bnR1ayBtZW5pbmdrYXRrYW4gZWZpc2llbnNpIHBlbmdpcmltYW4/DQoNCkJlcmRhc2Fya2FuIGhhc2lsIGFuYWxpc2lzIGRhcmkgZGF0YSAqKlRvdGFsIEJpYXlhKiogZGFuICoqRWZpc2llbnNpIEJpYXlhKiogcGVyIHdpbGF5YWgsIHdpbGF5YWggeWFuZyBtZW1lcmx1a2FuIHBlcmhhdGlhbiBraHVzdXMgdW50dWsgbWVuaW5na2F0a2FuIGVmaXNpZW5zaSBwZW5naXJpbWFuIGFkYWxhaDoNCg0KKipXaWxheWFoIEJhcmF0KioNCg0KKipBbGFzYW46KioNCg0KKioxLiBFZmlzaWVuc2kgQmlheWEgVGVydGluZ2dpOioqDQoNCi0gV2lsYXlhaCBCYXJhdCBtZW1pbGlraSBlZmlzaWVuc2kgYmlheWEgc2ViZXNhciBcKDEyLDU5My4wMjNcKSBScC91bml0LCB0ZXJ0aW5nZ2kgZGliYW5kaW5na2FuIHdpbGF5YWggbGFpbm55YS4NCg0KLSBJbmkgYmVyYXJ0aSBiaWF5YSBwZW5naXJpbWFuIHBlciB1bml0IGRpIHdpbGF5YWggaW5pIGxlYmloIG1haGFsIGRhcmlwYWRhIHdpbGF5YWggbGFpbi4NCg0KKioyLiBUb3RhbCBCaWF5YSB5YW5nIFRpbmdnaToqKg0KDQpUb3RhbCBiaWF5YSBwZW5naXJpbWFuIGRpIHdpbGF5YWggQmFyYXQgYWRhbGFoIFJwIFwoNSw0MTUsMDAwLFwpIHlhbmcgY3VrdXAgYmVzYXIgbWVza2lwdW4ganVtbGFoIGJhcmFuZyB5YW5nIGRpa2lyaW0gbGViaWggc2VkaWtpdCBkaWJhbmRpbmcgd2lsYXlhaCBsYWluLg0KDQoqKlJla29tZW5kYXNpIHVudHVrIFdpbGF5YWggQmFyYXQ6KioNCg0KKioxLiBPcHRpbWFsa2FuIHJ1dGUgZGFuIGphZHdhbCBwZW5naXJpbWFuIHVudHVrIG1lbmd1cmFuZ2kgd2FrdHUgcGVuZ2lyaW1hbi4qKg0KDQoqKjIuIEd1bmFrYW4gamVuaXMgdHJhbnNwb3J0YXNpIHlhbmcgbGViaWggZWZpc2llbiBkYW4gaGVtYXQgYmlheWEuKioNCg0KKiozLiBFdmFsdWFzaSBrZW1iYWxpIHByb3NlcyBsb2dpc3RpayB1bnR1ayBtZW5lbXVrYW4gdGl0aWstdGl0aWsgaW5lZmlzaWVuc2kuKioNCiANCioqNC4gTmVnb3NpYXNpIHVsYW5nIGJpYXlhIHBlbmdpcmltYW4gZGVuZ2FuIHBlbnllZGlhIGphc2EgdHJhbnNwb3J0YXNpLioqDQoNCioqNS5Lb25zb2xpZGFzaSBwZW5naXJpbWFuIGJhcmFuZyB1bnR1ayBtZW1ha3NpbWFsa2FuIGthcGFzaXRhcyBhbmdrdXQgZGFuIG1lbmd1cmFuZ2kgYmlheWEgcGVyIHVuaXQuKioNCg0KICBEZW5nYW4gbWVsYWt1a2FuIGxhbmdrYWgtbGFuZ2thaCBpbmksIGRpaGFyYXBrYW4gZWZpc2llbnNpIGJpYXlhIHBlbmdpcmltYW4gZGkgd2lsYXlhaCBCYXJhdCBkYXBhdCBtZW5pbmdrYXQuDQoNCiMjIyBBcGEgcmVrb21lbmRhc2kgdW50dWsgbWVuZ3VyYW5naSBiaWF5YSBkYW4gd2FrdHUgcGVuZ2lyaW1hbiBkaSB3aWxheWFoIHRlcnNlYnV0Pw0KDQoqKjEuIE9wdGltYWxrYW4gUnV0ZSBkYW4gSmFkd2FsIFBlbmdpcmltYW4qKg0KDQotIElkZW50aWZpa2FzaSBydXRlIHRlcmNlcGF0IGRhbiBwYWxpbmcgZWZpc2llbiBkZW5nYW4gbWVuZ2d1bmFrYW4gdGVrbm9sb2dpIHNlcGVydGkgc2lzdGVtIG1hbmFqZW1lbiB0cmFuc3BvcnRhc2kgKFRNUykgYXRhdSBhcGxpa2FzaSBwZW1ldGFhbiBkaWdpdGFsLg0KDQotIEhpbmRhcmkgcnV0ZSBkZW5nYW4ga2VtYWNldGFuIGF0YXUga29uZGlzaSBqYWxhbiB5YW5nIGJ1cnVrIHVudHVrIG1lbXBlcmNlcGF0IHdha3R1IHBlbmdpcmltYW4uDQoNCi0gS29uc29saWRhc2kgcGVuZ2lyaW1hbiBiZXJkYXNhcmthbiB3aWxheWFoIHR1anVhbiBhZ2FyIGJpc2EgZGlsYWt1a2FuIHNla2FsaSBqYWxhbi4NCg0KKioyLiBHdW5ha2FuIEplbmlzIFRyYW5zcG9ydGFzaSB5YW5nIExlYmloIEVmaXNpZW4qKg0KDQotIEV2YWx1YXNpIGplbmlzIGtlbmRhcmFhbiB5YW5nIGRpZ3VuYWthbiB1bnR1ayBwZW5naXJpbWFuLg0KDQotIEd1bmFrYW4ga2VuZGFyYWFuIGRlbmdhbiBrYXBhc2l0YXMgYW5na3V0IGxlYmloIGJlc2FyIGF0YXUga2VuZGFyYWFuIHlhbmcgbGViaWggaGVtYXQgYmFoYW4gYmFrYXIgdW50dWsgbWVuZWthbiBiaWF5YSBvcGVyYXNpb25hbC4NCg0KLSBQZXJ0aW1iYW5na2FuIG9wc2kgdHJhbnNwb3J0YXNpIHNlcGVydGkgcGVuZ2lyaW1hbiBtZWxhbHVpIGtlcmV0YSBhcGkgYXRhdSBrYXBhbCB1bnR1ayBqYXJhayBqYXVoIGppa2EgbGViaWggZWtvbm9taXMuDQoNCioqMy4gTmVnb3NpYXNpIFRhcmlmIGRlbmdhbiBQZW55ZWRpYSBMYXlhbmFuIExvZ2lzdGlrKioNCg0KLSBMYWt1a2FuIG5lZ29zaWFzaSB1bGFuZyBkZW5nYW4gcGVueWVkaWEgamFzYSBwZW5naXJpbWFuIHVudHVrIG1lbmRhcGF0a2FuIHRhcmlmIHlhbmcgbGViaWgga29tcGV0aXRpZi4NCg0KLSBQZXJ0aW1iYW5na2FuIGJla2VyamEgc2FtYSBkZW5nYW4gYmViZXJhcGEgcGVueWVkaWEgbGF5YW5hbiB1bnR1ayBtZW1iYW5kaW5na2FuIGJpYXlhIGRhbiBtZW1pbGloIHlhbmcgcGFsaW5nIGVmaXNpZW4uDQoNCioqNC4gS29uc29saWRhc2kgUGVuZ2lyaW1hbiBCYXJhbmcqKg0KDQotIEdhYnVuZ2thbiBwZW5naXJpbWFuIGRhcmkgYmVyYmFnYWkgcGVzYW5hbiB1bnR1ayBtZW1ha3NpbWFsa2FuIGthcGFzaXRhcyBhbmdrdXQgZGFsYW0gc2F0dSBrYWxpIHBlcmphbGFuYW4uDQoNCi0gSGluZGFyaSBwZW5naXJpbWFuIGRlbmdhbiBtdWF0YW4ga2VjaWwgeWFuZyBtZW55ZWJhYmthbiBiaWF5YSBwZXIgdW5pdCBtZW5qYWRpIHRpbmdnaS4NCg0KKio1LiBJbXBsZW1lbnRhc2kgVGVrbm9sb2dpIGRhbiBBdXRvbWFzaSoqDQoNCi0gR3VuYWthbiBzaXN0ZW0gcGVsYWNha2FuIHBlbmdpcmltYW4gc2VjYXJhIHJlYWwtdGltZSB1bnR1ayBtZW1hbnRhdSBwZXJnZXJha2FuIGJhcmFuZyBkYW4gbWVuZ2lkZW50aWZpa2FzaSBoYW1iYXRhbi4NCg0KLSBBdXRvbWFzaSBkYWxhbSBtYW5hamVtZW4gZ3VkYW5nIGRhbiBwcm9zZXMgcGVtdWF0YW4gYmFyYW5nIGFnYXIgbGViaWggY2VwYXQgZGFuIGVmaXNpZW4uDQoNCioqNi4gS3VyYW5naSBXYWt0dSBCb25na2FyIE11YXQqKg0KDQotIFRpbmdrYXRrYW4gZWZpc2llbnNpIHByb3NlcyBib25na2FyIG11YXQgYmFyYW5nIGRlbmdhbiBtZW1wZXJiYWlraSBzaXN0ZW0gb3BlcmFzaW9uYWwgZ3VkYW5nLg0KDQotIFBhc3Rpa2FuIHN0YWYgZ3VkYW5nIG1lbWlsaWtpIHByb3NlZHVyIGtlcmphIHlhbmcgamVsYXMgdW50dWsgbWVtcGVyY2VwYXQgcHJvc2VzIGluaS4NCg0KKio3LiBFdmFsdWFzaSBkYW4gQW5hbGlzaXMgQmVya2FsYSoqDQoNCi0gTGFrdWthbiBldmFsdWFzaSBraW5lcmphIHBlbmdpcmltYW4gc2VjYXJhIGJlcmthbGEgdW50dWsgbWVuZW11a2FuIHRpdGlrLXRpdGlrIGluZWZpc2llbnNpLg0KDQotIFRlcmFwa2FuIG1ldHJpayBraW5lcmphIHNlcGVydGkgcmF0YS1yYXRhIHdha3R1IHBlbmdpcmltYW4gZGFuIGJpYXlhIHBlciB1bml0IHVudHVrIG1lbWFudGF1IHBlbmluZ2thdGFuIGVmaXNpZW5zaS4NCg0KDQojIyAzLiBLaW5lcmphIEJlcmRhc2Fya2FuIEplbmlzIEJhcmFuZzoNCg0KQmVyZGFzYXJrYW4gZGF0YSBwZW5naXJpbWFuIGRhcmkgUGVydXNhaGFhbiBYWVosIGJlcmlrdXQgYWRhbGFoIGFuYWxpc2lzIGtpbmVyamEgcGVuZ2lyaW1hbiBiZXJkYXNhcmthbiBqZW5pcyBiYXJhbmcgZGFuIHdpbGF5YWggZGVuZ2FuIG1lbGloYXQgd2FrdHUgcGVuZ2lyaW1hbiBkYW4gYmlheWEgcGVyIHVuaXQ6DQoNCnwgKldpbGF5YWgqIHwgKkplbmlzIEJhcmFuZyogfCAqSnVtbGFoIEJhcmFuZyAodW5pdCkqIHwgKldha3R1IFBlbmdpcmltYW4gKGphbSkqIHwgKkJpYXlhIHBlciBVbml0IChScCkqIHwNCnwtLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfA0KfCBVdGFyYSAgICAgICB8IEVsZWt0cm9uaWsgICAgICAgfCAyMDAgICAgICAgICAgICAgICAgICAgICAgfCA1ICAgICAgICAgICAgICAgICAgICAgICAgICB8IDE1LDAwMCAgICAgICAgICAgICAgICAgIHwNCnwgU2VsYXRhbiAgICAgfCBQYWthaWFuICAgICAgICAgIHwgMTUwICAgICAgICAgICAgICAgICAgICAgIHwgOCAgICAgICAgICAgICAgICAgICAgICAgICAgfCA4LDAwMCAgICAgICAgICAgICAgICAgICB8DQp8IFRpbXVyICAgICAgIHwgTWFrYW5hbiAgICAgICAgICB8IDE4MCAgICAgICAgICAgICAgICAgICAgICB8IDYgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMTAsMDAwICAgICAgICAgICAgICAgICAgfA0KfCBCYXJhdCAgICAgICB8IFBlcmFsYXRhbiAgICAgICAgfCAxMjAgICAgICAgICAgICAgICAgICAgICAgfCA3ICAgICAgICAgICAgICAgICAgICAgICAgICB8IDEyLDAwMCAgICAgICAgICAgICAgICAgIHwNCnwgVGVuZ2FoICAgICAgfCBFbGVrdHJvbmlrICAgICAgIHwgMjUwICAgICAgICAgICAgICAgICAgICAgIHwgNCAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNCwwMDAgICAgICAgICAgICAgICAgICB8DQp8IFV0YXJhICAgICAgIHwgUGFrYWlhbiAgICAgICAgICB8IDMwMCAgICAgICAgICAgICAgICAgICAgICB8IDkgICAgICAgICAgICAgICAgICAgICAgICAgIHwgOCw1MDAgICAgICAgICAgICAgICAgICAgfA0KfCBTZWxhdGFuICAgICB8IE1ha2FuYW4gICAgICAgICAgfCAyMjAgICAgICAgICAgICAgICAgICAgICAgfCA3ICAgICAgICAgICAgICAgICAgICAgICAgICB8IDksNTAwICAgICAgICAgICAgICAgICAgIHwNCnwgVGltdXIgICAgICAgfCBQZXJhbGF0YW4gICAgICAgIHwgMTQwICAgICAgICAgICAgICAgICAgICAgIHwgNSAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMSwwMDAgICAgICAgICAgICAgICAgICB8DQp8IEJhcmF0ICAgICAgIHwgRWxla3Ryb25payAgICAgICB8IDE4MCAgICAgICAgICAgICAgICAgICAgICB8IDYgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMTQsNTAwICAgICAgICAgICAgICAgICAgfA0KfCBUZW5nYWggICAgICB8IFBha2FpYW4gICAgICAgICAgfCAzNTAgICAgICAgICAgICAgICAgICAgICAgfCA4ICAgICAgICAgICAgICAgICAgICAgICAgICB8IDcsODAwICAgICAgICAgICAgICAgICAgIHwNCnwgVXRhcmEgICAgICAgfCBQZXJhbGF0YW4gICAgICAgIHwgMTcwICAgICAgICAgICAgICAgICAgICAgIHwgNCAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMiwwMDAgICAgICAgICAgICAgICAgICB8DQp8IFNlbGF0YW4gICAgIHwgRWxla3Ryb25payAgICAgICB8IDI1MCAgICAgICAgICAgICAgICAgICAgICB8IDYgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMTYsMDAwICAgICAgICAgICAgICAgICAgfA0KfCBUaW11ciAgICAgICB8IFBha2FpYW4gICAgICAgICAgfCAxOTAgICAgICAgICAgICAgICAgICAgICAgfCA3ICAgICAgICAgICAgICAgICAgICAgICAgICB8IDgsMjAwICAgICAgICAgICAgICAgICAgIHwNCnwgQmFyYXQgICAgICAgfCBNYWthbmFuICAgICAgICAgIHwgMTMwICAgICAgICAgICAgICAgICAgICAgIHwgNSAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxMCw1MDAgICAgICAgICAgICAgICAgICB8DQp8IFRlbmdhaCAgICAgIHwgUGVyYWxhdGFuICAgICAgICB8IDE4MCAgICAgICAgICAgICAgICAgICAgICB8IDUgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMTEsNTAwICAgICAgICAgICAgICAgICAgfA0KDQoqKkFuYWxpc2lzIEtpbmVyamEgQmVyZGFzYXJrYW4gSmVuaXMgQmFyYW5nKioNCg0KKioxLiBFbGVrdHJvbmlrKioNCg0KLSBXYWt0dSBQZW5naXJpbWFuIFJhdGEtUmF0YQ0KDQoNCiQkICg1KzQrNis2KS80PTUsMjUgXCBqYW0kJA0KDQotICBCaWF5YSBwZXIgVW5pdCBSYXRhLVJhdGE6DQoNCiQkICgxNSwwMDArMTQsMDAwKzE0LDUwMCsxNiwwMDApLzQ9MTQsODc1IFwgUnAvXCBVbml0ICQkDQoNCioqMi4gUGFrYWlhbioqDQoNCi0gV2FrdHUgUGVuZ2lyaW1hbiBSYXRhLVJhdGENCg0KJCQgKDgrOSs4KzcpLzQ9OCBcIGphbSQkDQoNCi0gQmlheWEgcGVyIFVuaXQgUmF0YS1SYXRhOg0KDQokJCAoOCwwMDArOCw1MDArNyw4MDArOCwyMDApLzQ9OCwxMjUgXCBScC9cIFVuaXQgJCQNCg0KKiozLiBNYWthbmFuKioNCg0KLSBXYWt0dSBQZW5naXJpbWFuIFJhdGEtUmF0YQ0KDQokJCAoNis3KzUpLzM9NiBcIGphbSQkDQoNCi0gQmlheWEgcGVyIFVuaXQgUmF0YS1SYXRhOg0KDQokJCAoMTAsMDAwKzksNTAwKzEwLDUwMCkvMz0xMCwwMDAgXCBScC9cIFVuaXQgJCQNCg0KKio0LiBQZXJhbGF0YW4qKg0KDQotIFdha3R1IFBlbmdpcmltYW4gUmF0YS1SYXRhDQoNCiQkICg3KzUrNCs1KS80PTUsMjUgXCBqYW0kJA0KDQotIEJpYXlhIHBlciBVbml0IFJhdGEtUmF0YToNCg0KJCQgKDEyLDAwMCsxMSwwMDArMTIsMDAwKzExLDUwMCkvND0xMSw2MjUgXCBScC9cIFVuaXQgJCQNCg0KKipLZXNpbXB1bGFuIEJlcmRhc2Fya2FuIEplbmlzIEJhcmFuZyoqDQoNCioqMS4gV2FrdHUgUGVuZ2lyaW1hbiBUZXJjZXBhdDoqKg0KDQotIEVsZWt0cm9uaWsgZGFuIFBlcmFsYXRhbjogUmF0YS1yYXRhIFwoNSwyNVwpIGphbQ0KDQoqKjIuIEJpYXlhIHBlciBVbml0IFRlcmVuZGFoOioqDQoNCi0gUGFrYWlhbjogUmF0YS1yYXRhIFwoOCwxMjVcKSBScC91bml0DQoNCioqQW5hbGlzaXMgS2luZXJqYSBCYXJhbmcqKg0KDQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KIyBNZW11YXQgbGlicmFyeSB1bnR1ayB2aXN1YWxpc2FzaQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkoa25pdHIpDQoNCiMgRGF0YSBwZW5naXJpbWFuDQpkYXRhX3BlbmdpcmltYW4gPC0gZGF0YS5mcmFtZSgNCiAgV2lsYXlhaCA9IGMoIlV0YXJhIiwgIlNlbGF0YW4iLCAiVGltdXIiLCAiQmFyYXQiLCAiVGVuZ2FoIiksDQogIFRvdGFsX1dha3R1X1BlbmdpcmltYW4gPSBjKDE4LCAyMSwgMTgsIDE4LCAxNyksDQogIEp1bWxhaF9QZW5naXJpbWFuID0gYygzLCAzLCAzLCAzLCAzKSwNCiAgUmF0YV9SYXRhX1dha3R1ID0gYyg2LCA3LCA2LCA2LCA1LjY3KSwNCiAgUmF0YV9SYXRhX0JpYXlhX3Blcl9Vbml0ID0gYygxMTgzMywgMTE4MzMsIDk3MzMsIDEyMzMzLCAxMTEwMCkNCikNCg0KIyBNZW5hbXBpbGthbiB0YWJlbCBkYWxhbSBmb3JtYXQgeWFuZyByYXBpDQprYWJsZShkYXRhX3BlbmdpcmltYW4sIGNhcHRpb24gPSAiQW5hbGlzaXMgS2luZXJqYSBQZW5naXJpbWFuIHBlciBXaWxheWFoIikNCg0KDQpgYGANCg0KKipLZXNpbXB1bGFuIEJlcmRhc2Fya2FuIFdpbGF5YWgqKg0KDQoqKjEuIFdha3R1IFBlbmdpcmltYW4gVGVyY2VwYXQ6KioNCg0KLSBUZW5nYWg6IFJhdGEtcmF0YSBcKDUsNjdcKSBqYW0NCg0KKioyLiBCaWF5YSBwZXIgVW5pdCBUZXJlbmRhaDoqKg0KDQotIFRpbXVyOiBSYXRhLXJhdGEgXCg5LDczM1wpIFJwL3VuaXQNCg0KKipSZWtvbWVuZGFzaSoqDQoNCi0gV2lsYXlhaCB5YW5nIEVmaXNpZW46DQoNCiAgLSBUaW11cjogQmlheWEgcGVyIHVuaXQgdGVyZW5kYWggKFwoOSw3MzNcKSkgUnAvdW5pdCkgZGFuIHdha3R1IHBlbmdpcmltYW4gcmVsYXRpZiBjZXBhdCAoXCg2XCkpIGphbSkuDQoNCg0KLSBXaWxheWFoIHlhbmcgUGVybHUgUGVyaGF0aWFuOg0KICAtIEJhcmF0OiBCaWF5YSBwZXIgdW5pdCB0ZXJ0aW5nZ2kgKFwoMTIsMzMzXCkpIFJwL3VuaXQpIG1lc2tpcHVuIHdha3R1IHBlbmdpcmltYW4gdGlkYWsgdGVybGFsdSBsYW1hIChcKDZcKSBqYW0pLg0KDQogIC0gRm9rdXMgcGFkYSBvcHRpbWFzaSBsb2dpc3RpayBkaSB3aWxheWFoIGluaSB1bnR1ayBtZW5la2FuIGJpYXlhLg0KDQpEZW5nYW4gbWVtcGVyaGF0aWthbiByZWtvbWVuZGFzaSBpbmksIHBlcnVzYWhhYW4gZGFwYXQgbWVuaW5na2F0a2FuIGVmaXNpZW5zaSBwZW5naXJpbWFuIHNlY2FyYSBrZXNlbHVydWhhbi4NCg0KIyBSZWZlcmVuc2kNCg0KVEtJIEFzc2Vzc21lbnQuIChuLmQuKS4gVWt1cmFuIFBlbnllYmFyYW4gRGF0YTogVmFyaWFucyBkYW4gU3RhbmRhciBEZXZpYXNpLiBUS0kuIFJldHJpZXZlZCBmcm9tIGh0dHBzOi8vYXNzZXNzbWVudC50a2kub3JnLm56L1VzaW5nLWV2aWRlbmNlLWZvci1sZWFybmluZy9Xb3JraW5nLXdpdGgtZGF0YS9Db25jZXB0cy9WYXJpYW5jZS1hbmQtc3RhbmRhcmQtZGV2aWF0aW9uDQoNCkludmVzdG9wZWRpYS4gKG4uZC4pLiBTdGFuZGFyZCBEZXZpYXRpb24uIEludmVzdG9wZWRpYS4gUmV0cmlldmVkIGZyb20gaHR0cHM6Ly93d3cuaW52ZXN0b3BlZGlhLmNvbS90ZXJtcy9zL3N0YW5kYXJkZGV2aWF0aW9uLmFzcA0KDQpLaGFuIEFjYWRlbXkuIChuLmQuKS4gU3RhbmRhcmQgRGV2aWF0aW9uIGFuZCBWYXJpYW5jZS4gS2hhbiBBY2FkZW15LiBSZXRyaWV2ZWQgZnJvbSBodHRwczovL3d3dy5raGFuYWNhZGVteS5vcmcvbWF0aC9zdGF0aXN0aWNzLXByb2JhYmlsaXR5L3N1bW1hcml6aW5nLXF1YW50aXRhdGl2ZS1kYXRhL3ZhcmlhbmNlLWFuZC1zdGFuZGFyZC1kZXZpYXRpb24vYS92YXJpYW5jZS1hbmQtc3RhbmRhcmQtZGV2aWF0aW9uLXJldmlldw0KDQpHcmFtZWRpYS4gKG4uZC4pLiBQZW55ZWJhcmFuIERhdGEgZGFuIFBlbmd1a3VyYW46IFZhcmlhbnMgZGFuIFN0YW5kYXIgRGV2aWFzaS4gR3JhbWVkaWEuIFJldHJpZXZlZCBmcm9tIGh0dHBzOi8vd3d3LmdyYW1lZGlhLmNvbS9saXRlcmFzaS9zdGFuZGFyLWRldmlhc2ktZGFuLXZhcmlhbnMvDQoNCk1pbGUgQXBwLiAobi5kLikuIENhcmEgUHJha3RpcyBNZW5pbmdrYXRrYW4gRWZpc2llbnNpIFBlbmdpcmltYW4gZGFsYW0gQmlzbmlzIEZNQ0cuIE1pbGUuIFJldHJpZXZlZCBmcm9tIGh0dHBzOi8vbWlsZS5hcHAvaWQvYmxvZy9jYXJhLXByYWt0aXMtbWVuaW5na2F0a2FuLWVmaXNpZW5zaS1wZW5naXJpbWFuLWRhbGFtLWJpc25pcy1mbWNnDQo=