Code
Tugas 1 Analysis & Predictive Modelling
Multinomial Logistics Regression
Multinomial
Logistics Regression
Multinomial Logistic Regression adalah perluasan
dari binary logistic regression yang digunakan ketika variabel dependen
(\(Y\) ) memiliki lebih dari dua
kategori yang bersifat nominal (tidak berurutan).
Contoh kasus: tingkat keberhasilan proyek (Low, Medium, High), jenis
produk yang dipilih (A, B, C), atau keputusan pelanggan (beli A, beli B,
tidak beli).
Tujuannya adalah untuk memodelkan probabilitas setiap kategori dari
variabel dependen berdasarkan satu atau lebih variabel independen (\(X₁, X₂, X₃, …\) ).Model ini memperkirakan
peluang suatu observasi termasuk ke dalam masing-masing kategori.
Jika terdapat ( \(K\) ) kategori
pada variabel dependen ( \(Y\) ), maka
model memilih satu kategori sebagai kategori referensi (baseline)
biasanya kategori terakhir. Kemudian, untuk setiap kategori ( \(k = 1, 2, ..., K-1\) ), model menghitung
log odds dibandingkan dengan kategori referensi:
\[
\log\left(\frac{P(Y = k)}{P(Y = K)}\right) = \beta_{0k} + \beta_{1k}X_1
+ \beta_{2k}X_2 + \cdots + \beta_{pk}X_p
\]
Keterangan:
( \(P(Y = k)\) ): probabilitas
bahwa observasi termasuk kategori ke-( \(k\) )
( \(P(Y = K)\) ): probabilitas
kategori referensi
( \(\beta_{0k}\) ): intercept untuk
kategori ke-( \(k\) )
( \(\beta_{ik}\) ): koefisien
variabel independen ( \(X_i\) )
terhadap kategori ke-( \(k\) )
( \(X_i\) ): variabel prediktor
(misalnya Budget, Satisfaction, Salespeople)
Probabilitas Setiap Kategori
Untuk setiap kategori ( \(k\) ),
probabilitasnya dihitung menggunakan fungsi softmax:
\[
P(Y = k) = \frac{e^{\beta_{0k} + \beta_{1k}X_1 + \cdots +
\beta_{pk}X_p}}{1 + \sum_{j=1}^{K-1} e^{\beta_{0j} + \beta_{1j}X_1 +
\cdots + \beta_{pj}X_p}}
\]
dan untuk kategori referensi ( \(K\)
):
\[
P(Y = K) = \frac{1}{1 + \sum_{j=1}^{K-1} e^{\beta_{0j} + \beta_{1j}X_1 +
\cdots + \beta_{pj}X_p}}
\]
Koefisien ( \(\beta_{ik}\) )
menunjukkan perubahan log odds kategori ( \(k\) ) relatif terhadap kategori referensi
akibat perubahan satu unit pada ( \(X_i\) ).
Jika ( \(\beta_{ik} > 0\) ),
maka peningkatan ( \(X_i\) )
meningkatkan peluang observasi termasuk ke kategori ( \(k\) ) dibandingkan dengan referensi.
Jika ( \(\beta_{ik} < 0\) ),
maka efeknya sebaliknya.
Membuat Model
Multinomial Logistic Regression
## # weights: 18 (10 variable)
## initial value 219.722458
## iter 10 value 143.933108
## iter 20 value 9.020186
## iter 30 value 4.214189
## iter 40 value 3.504247
## iter 50 value 2.820396
## iter 60 value 2.303166
## iter 70 value 2.132932
## iter 80 value 1.624341
## iter 90 value 1.472079
## iter 100 value 1.195536
## final value 1.195536
## stopped after 100 iterations
## Call:
## multinom(formula = Success_Level ~ Advertising + Salespeople +
## Satisfaction + Competition, data = data)
##
## Coefficients:
## (Intercept) Advertising Salespeople Satisfaction Competition
## Medium -226.9013 9.584952 5.806227 13.27848 -11.83763
## High -478.6406 15.206729 9.860392 22.28077 -18.48662
##
## Std. Errors:
## (Intercept) Advertising Salespeople Satisfaction Competition
## Medium 114.0896 4.752920 2.913936 6.611718 5.784428
## High 201.4697 5.948203 4.036557 8.875431 7.155263
##
## Residual Deviance: 2.391072
## AIC: 22.39107
Hasil multinomial logistic regression menunjukkan bahwa faktor-faktor
pemasaran seperti anggaran iklan (Advertising), jumlah tenaga penjual
(Salespeople), kepuasan pelanggan (Satisfaction), dan tingkat kompetisi
(Competition) secara bersama-sama berpengaruh terhadap tingkat
keberhasilan kampanye pemasaran. Model menggunakan kategori Low sebagai
pembanding, dan memperkirakan peluang suatu kampanye berada pada
kategori Medium atau High dibanding Low.
Koefisien bertanda positif pada variabel Advertising, Salespeople,
dan Satisfaction menunjukkan bahwa semakin besar anggaran iklan, semakin
banyak tenaga penjual yang terlibat, dan semakin tinggi kepuasan
pelanggan, maka kemungkinan kampanye mencapai keberhasilan Medium atau
High meningkat secara signifikan dibandingkan Low. Sebaliknya, koefisien
Competition yang negatif menandakan bahwa semakin tinggi tingkat
persaingan pasar, semakin kecil peluang kampanye mencapai tingkat
keberhasilan yang tinggi.
Melihat Nilai Statistik
(Std. Error, z value, p value)
## (Intercept) Advertising Salespeople Satisfaction Competition (Intercept)
## Medium -226.9013 9.584952 5.806227 13.27848 -11.83763 114.0896
## High -478.6406 15.206729 9.860392 22.28077 -18.48662 201.4697
## Advertising Salespeople Satisfaction Competition (Intercept) Advertising
## Medium 4.752920 2.913936 6.611718 5.784428 -1.988799 2.016645
## High 5.948203 4.036557 8.875431 7.155263 -2.375745 2.556525
## Salespeople Satisfaction Competition (Intercept) Advertising Salespeople
## Medium 1.992572 2.008326 -2.046466 0.04672342 0.04373261 0.04630833
## High 2.442773 2.510387 -2.583639 0.01751358 0.01057234 0.01457491
## Satisfaction Competition
## Medium 0.04460871 0.040710564
## High 0.01205989 0.009776393
Kategori Medium vs Low
Advertising (β = 9.58, p ≈ 0.04) → Anggaran iklan berpengaruh
positif dan signifikan, artinya peningkatan investasi iklan meningkatkan
kemungkinan kampanye naik dari Low ke Medium.
Salespeople (β = 5.80, p ≈ 0.04) → Lebih banyak tenaga penjual
secara nyata meningkatkan peluang keberhasilan tingkat
menengah.
Satisfaction (β = 13.28, p ≈ 0.04) → Kepuasan pelanggan yang
tinggi sangat mendorong peningkatan keberhasilan.
Competition (β = -11.84, p ≈ 0.04) → Persaingan pasar yang tinggi
menurunkan peluang keberhasilan.
Kategori High vs Low
Advertising (β = 15.21, p ≈ 0.02) → Pengaruh positif dan
signifikan. Semakin besar anggaran iklan, semakin tinggi peluang
kampanye mencapai keberhasilan tinggi (High).
Salespeople (β = 9.86, p ≈ 0.01) → Jumlah tenaga penjual yang
lebih banyak meningkatkan kemungkinan sukses penuh.
Satisfaction (β = 22.28, p ≈ 0.01) → Kepuasan pelanggan menjadi
faktor paling kuat dalam menentukan keberhasilan tertinggi.
Competition (β = -18.49, p ≈ 0.01) → Kompetisi tinggi secara
signifikan menurunkan peluang mencapai tingkat keberhasilan
tertinggi.
Secara keseluruhan, hasil analisis Multinomial Logistic Regression
menunjukkan bahwa faktor Satisfaction (kepuasan pelanggan) merupakan
determinan paling kuat terhadap peningkatan Success Level, diikuti oleh
Advertising dan Salespeople yang berpengaruh positif. Sebaliknya,
Competition memiliki dampak negatif yang signifikan terhadap
keberhasilan.
Evaluasi Akurasi
Model
## Actual
## Predicted Low Medium High
## Low 42 0 0
## Medium 0 122 0
## High 0 0 36
## [1] 1
Hasil evaluasi model Multinomial Logistic Regression menunjukkan
bahwa model mampu memprediksi tingkat keberhasilan kampanye pemasaran
(Success Level) dengan akurasi sempurna sebesar 100%, di mana seluruh
kategori aktual—Low, Medium, dan High—berhasil diprediksi dengan tepat
tanpa kesalahan klasifikasi. Hal ini mengindikasikan bahwa kombinasi
faktor Advertising, Salespeople, Satisfaction, dan Competition memiliki
kemampuan yang sangat kuat dalam membedakan setiap tingkat keberhasilan.
Dengan kata lain, peningkatan investasi iklan, jumlah tenaga penjual,
serta kepuasan pelanggan yang tinggi secara konsisten berkontribusi
terhadap keberhasilan yang lebih besar, sementara tingginya tingkat
persaingan menjadi faktor yang menurunkan peluang sukses.
Visualisasi
## # weights: 18 (10 variable)
## initial value 219.722458
## iter 10 value 151.864225
## iter 20 value 127.803719
## iter 20 value 127.803718
## iter 20 value 127.803718
## final value 127.803718
## converged
Perbedaan Binary
Logistic Regression dengan Multinomial Logistic Regression
Jumlah kategori variabel dependen
2 kategori (misalnya: Yes/No ,
Lulus/Gagal , Beli/Tidak Beli )
Lebih dari 2 kategori (misalnya: Low ,
Medium , High atau A , B ,
C )
Jenis kategori
Bersifat biner (dua kelas)
Bersifat nominal (bisa tiga atau lebih, tidak
berurutan)
Fungsi link
Logit: \(\log
\frac{p}{1-p}\)
Generalized Logit: \(\log
\frac{P(Y=k)}{P(Y=K)}\) untuk setiap kategori (\(k\) )
Persamaan umum
\(\log\left(\frac{p}{1-p}\right) = \beta_0 +
\beta_1X_1 + \cdots + \beta_pX_p\)
\(\log\left(\frac{P(Y=k)}{P(Y=K)}\right) =
\beta_{0k} + \beta_{1k}X_1 + \cdots + \beta_{pk}X_p\) , untuk
\(k = 1, 2, ..., K-1\)
Metode estimasi
Maximum Likelihood Estimation (MLE)
Juga menggunakan MLE, tetapi menghitung parameter untuk
setiap kategori relatif terhadap kategori referensi
Output model
Probabilitas kejadian satu kategori (mis. sukses)
Probabilitas setiap kategori (mis. Low, Medium, High)
yang dijumlahkan = 1
Interpretasi koefisien
Koefisien menunjukkan perubahan log odds
kejadian satu kategori dibanding tidak terjadi
Koefisien menunjukkan perubahan log odds
kategori tertentu dibanding kategori referensi
Contoh kasus
Prediksi apakah pelanggan membeli produk (Yes/No)
Prediksi tingkat kepuasan pelanggan
(Low–Medium–High )
Fungsi aktivasi
Sigmoid
Softmax
LS0tDQp0aXRsZTogIlR1Z2FzIDEgQW5hbHlzaXMgJiBQcmVkaWN0aXZlIE1vZGVsbGluZyINCnN1YnRpdGxlOiAiTXVsdGlub21pYWwgTG9naXN0aWNzIFJlZ3Jlc3Npb24iDQphdXRob3I6IA0KICAiSXNuYWluaSBOdXIgSGFzYW5haCAoNTIyNDAwMDUpIg0KZGF0ZTogICJgciBmb3JtYXQoU3lzLkRhdGUoKSwgJyVCICVkLCAlWScpYCINCm91dHB1dDoNCiAgcm1kZm9ybWF0czo6cm9ib2Jvb2s6ICAgIyBodHRwczovL2dpdGh1Yi5jb20vanViYS9ybWRmb3JtYXRzDQogICAgc2VsZl9jb250YWluZWQ6IHRydWUNCiAgICB0aHVtYm5haWxzOiB0cnVlDQogICAgbGlnaHRib3g6IHRydWUNCiAgICBnYWxsZXJ5OiB0cnVlDQogICAgbnVtYmVyX3NlY3Rpb25zOiB0cnVlDQogICAgbGliX2RpcjogbGlicw0KICAgIGRmX3ByaW50OiAicGFnZWQiDQogICAgY29kZV9mb2xkaW5nOiAic2hvdyINCiAgICBjb2RlX2Rvd25sb2FkOiB5ZXMNCiAgICBjc3M6ICJzdHlsZSAoMSkuY3NzIg0KICAgIHBhcmFtczoNCiAgZWNobzogZmFsc2UNCmVkaXRvcl9vcHRpb25zOiANCiAgbWFya2Rvd246IA0KICAgIHdyYXA6IDcyDQotLS0NCg0KPGltZyANCiAgaWQ9IklzbmEiIA0KICBzcmM9IkM6XFVzZXJzXEFTVVNcRGVza3RvcFxTdGF0aXN0aWthIERhc2FyXElzbmFpbmkuanBnIiANCiAgYWx0PSJGb3RvIElzbmFpbmkiIA0KICBzdHlsZT0iDQogICAgd2lkdGg6IDIwMHB4Ow0KICAgIGhlaWdodDogMjAwcHg7DQogICAgb2JqZWN0LWZpdDogY292ZXI7ICAgICAgIA0KICAgIGJvcmRlci1yYWRpdXM6IDUwJTsgICAgICANCiAgICBkaXNwbGF5OiBibG9jazsNCiAgICBtYXJnaW46IGF1dG87DQogICAgYm94LXNoYWRvdzogMCAwIDEwcHggcmdiYSgwLDAsMCwwLjIpOyANCiAgIj4NCg0KDQojICoqTXVsdGlub21pYWwgTG9naXN0aWNzIFJlZ3Jlc3Npb24qKg0KDQoqKk11bHRpbm9taWFsIExvZ2lzdGljIFJlZ3Jlc3Npb24qKiBhZGFsYWggcGVybHVhc2FuIGRhcmkgYmluYXJ5IGxvZ2lzdGljIHJlZ3Jlc3Npb24geWFuZyBkaWd1bmFrYW4ga2V0aWthIHZhcmlhYmVsIGRlcGVuZGVuICgkWSQpIG1lbWlsaWtpIGxlYmloIGRhcmkgZHVhIGthdGVnb3JpIHlhbmcgYmVyc2lmYXQgbm9taW5hbCAodGlkYWsgYmVydXJ1dGFuKS4NCg0KQ29udG9oIGthc3VzOiB0aW5na2F0IGtlYmVyaGFzaWxhbiBwcm95ZWsgKExvdywgTWVkaXVtLCBIaWdoKSwgamVuaXMgcHJvZHVrIHlhbmcgZGlwaWxpaCAoQSwgQiwgQyksIGF0YXUga2VwdXR1c2FuIHBlbGFuZ2dhbiAoYmVsaSBBLCBiZWxpIEIsIHRpZGFrIGJlbGkpLg0KDQpUdWp1YW5ueWEgYWRhbGFoIHVudHVrIG1lbW9kZWxrYW4gcHJvYmFiaWxpdGFzIHNldGlhcCBrYXRlZ29yaSBkYXJpIHZhcmlhYmVsIGRlcGVuZGVuIGJlcmRhc2Fya2FuIHNhdHUgYXRhdSBsZWJpaCB2YXJpYWJlbCBpbmRlcGVuZGVuICgkWOKCgSwgWOKCgiwgWOKCgywg4oCmJCkuTW9kZWwgaW5pIG1lbXBlcmtpcmFrYW4gcGVsdWFuZyBzdWF0dSBvYnNlcnZhc2kgdGVybWFzdWsga2UgZGFsYW0gbWFzaW5nLW1hc2luZyBrYXRlZ29yaS4NCg0KDQpKaWthIHRlcmRhcGF0ICggJEskICkga2F0ZWdvcmkgcGFkYSB2YXJpYWJlbCBkZXBlbmRlbiAoICRZJCApLCBtYWthIG1vZGVsIG1lbWlsaWggc2F0dSBrYXRlZ29yaSBzZWJhZ2FpIGthdGVnb3JpIHJlZmVyZW5zaSAoYmFzZWxpbmUpIGJpYXNhbnlhIGthdGVnb3JpIHRlcmFraGlyLiBLZW11ZGlhbiwgdW50dWsgc2V0aWFwIGthdGVnb3JpICggJGsgPSAxLCAyLCAuLi4sIEstMSQgKSwgbW9kZWwgbWVuZ2hpdHVuZyBsb2cgb2RkcyBkaWJhbmRpbmdrYW4gZGVuZ2FuIGthdGVnb3JpIHJlZmVyZW5zaToNCg0KJCQNClxsb2dcbGVmdChcZnJhY3tQKFkgPSBrKX17UChZID0gSyl9XHJpZ2h0KSA9IFxiZXRhX3swa30gKyBcYmV0YV97MWt9WF8xICsgXGJldGFfezJrfVhfMiArIFxjZG90cyArIFxiZXRhX3twa31YX3ANCiQkDQoNCktldGVyYW5nYW46DQoNCiogKCAkUChZID0gaykkICk6IHByb2JhYmlsaXRhcyBiYWh3YSBvYnNlcnZhc2kgdGVybWFzdWsga2F0ZWdvcmkga2UtKCAkayQgKQ0KKiAoICRQKFkgPSBLKSQgKTogcHJvYmFiaWxpdGFzIGthdGVnb3JpIHJlZmVyZW5zaQ0KKiAoICRcYmV0YV97MGt9JCApOiBpbnRlcmNlcHQgdW50dWsga2F0ZWdvcmkga2UtKCAkayQgKQ0KKiAoICRcYmV0YV97aWt9JCk6IGtvZWZpc2llbiB2YXJpYWJlbCBpbmRlcGVuZGVuICggJFhfaSQgKSB0ZXJoYWRhcCBrYXRlZ29yaSBrZS0oICRrJCApDQoqICggJFhfaSQgKTogdmFyaWFiZWwgcHJlZGlrdG9yIChtaXNhbG55YSBCdWRnZXQsIFNhdGlzZmFjdGlvbiwgU2FsZXNwZW9wbGUpDQoNCioqUHJvYmFiaWxpdGFzIFNldGlhcCBLYXRlZ29yaSoqDQoNClVudHVrIHNldGlhcCBrYXRlZ29yaSAoICRrJCApLCBwcm9iYWJpbGl0YXNueWEgZGloaXR1bmcgbWVuZ2d1bmFrYW4gZnVuZ3NpIHNvZnRtYXg6DQoNCiQkDQpQKFkgPSBrKSA9IFxmcmFje2Vee1xiZXRhX3swa30gKyBcYmV0YV97MWt9WF8xICsgXGNkb3RzICsgXGJldGFfe3BrfVhfcH19ezEgKyBcc3VtX3tqPTF9XntLLTF9IGVee1xiZXRhX3swan0gKyBcYmV0YV97MWp9WF8xICsgXGNkb3RzICsgXGJldGFfe3BqfVhfcH19DQokJA0KDQpkYW4gdW50dWsga2F0ZWdvcmkgcmVmZXJlbnNpICggJEskICk6DQoNCiQkDQpQKFkgPSBLKSA9IFxmcmFjezF9ezEgKyBcc3VtX3tqPTF9XntLLTF9IGVee1xiZXRhX3swan0gKyBcYmV0YV97MWp9WF8xICsgXGNkb3RzICsgXGJldGFfe3BqfVhfcH19DQokJA0KDQoqIEtvZWZpc2llbiAoICRcYmV0YV97aWt9JCApIG1lbnVuanVra2FuIHBlcnViYWhhbiBsb2cgb2RkcyBrYXRlZ29yaSAoICRrJCApIHJlbGF0aWYgdGVyaGFkYXAga2F0ZWdvcmkgcmVmZXJlbnNpIGFraWJhdCBwZXJ1YmFoYW4gc2F0dSB1bml0IHBhZGEgKCAkWF9pJCApLg0KKiBKaWthICggJFxiZXRhX3tpa30gPiAwJCApLCBtYWthIHBlbmluZ2thdGFuICggJFhfaSQgKSBtZW5pbmdrYXRrYW4gcGVsdWFuZyBvYnNlcnZhc2kgdGVybWFzdWsga2Uga2F0ZWdvcmkgKCAkayQgKSBkaWJhbmRpbmdrYW4gZGVuZ2FuIHJlZmVyZW5zaS4NCiogSmlrYSAoICRcYmV0YV97aWt9IDwgMCQgKSwgbWFrYSBlZmVrbnlhIHNlYmFsaWtueWEuDQoNCg0KIyBEYXRhc2V0DQoNCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBlY2hvPUZBTFNFfQ0KIyAxLiBCYWNhIGRhdGFzZXQNCmRhdGEgPC0gcmVhZC5jc3YoInJlZ3Jlc2lfZGF0YS5jc3YiKQ0KDQojIDIuIEhpdHVuZyBza29yIGxpbmVhciBzZWJhZ2FpIGtvbWJpbmFzaSBkYXJpIHZhcmlhYmVsIGluZGVwZW5kZW4NCmRhdGEkc2NvcmUgPC0gd2l0aChkYXRhLA0KICAgICAgICAgICAgICAgICAgIDAuNSAqIEFkdmVydGlzaW5nICsNCiAgICAgICAgICAgICAgICAgICAwLjMgKiBTYWxlc3Blb3BsZSArDQogICAgICAgICAgICAgICAgICAgMC43ICogU2F0aXNmYWN0aW9uIC0NCiAgICAgICAgICAgICAgICAgICAwLjYgKiBDb21wZXRpdGlvbikNCg0KIyAzLiBOb3JtYWxpc2FzaSBza29yIGFnYXIgdGVyZGlzdHJpYnVzaSBkZW5nYW4gYmFpaw0KZGF0YSRzY29yZV9ub3JtIDwtIChkYXRhJHNjb3JlIC0gbWluKGRhdGEkc2NvcmUpKSAvIChtYXgoZGF0YSRzY29yZSkgLSBtaW4oZGF0YSRzY29yZSkpDQoNCiMgNC4gQnVhdCB2YXJpYWJlbCB0YXJnZXQgYmFydSBkZW5nYW4gMyBrYXRlZ29yaSAobXVsdGlub21pYWwpDQpkYXRhJFN1Y2Nlc3NfTGV2ZWwgPC0gY3V0KGRhdGEkc2NvcmVfbm9ybSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gYygtSW5mLCAwLjMzLCAwLjY2LCBJbmYpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJMb3ciLCAiTWVkaXVtIiwgIkhpZ2giKSkNCg0KIyA1LiBIYXB1cyBrb2xvbSBsYW1hICdTdWNjZXNzJyAoamlrYSBpbmdpbiBkaWdhbnRpKQ0KZGF0YSRTdWNjZXNzIDwtIE5VTEwNCg0KIyA2LiBUYW1waWxrYW4gZGVuZ2FuIERUDQpsaWJyYXJ5KERUKQ0KZGF0YXRhYmxlKGRhdGEsIA0KICAgICAgICAgIG9wdGlvbnMgPSBsaXN0KHBhZ2VMZW5ndGggPSAxMCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgYXV0b1dpZHRoID0gVFJVRSwNCiAgICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxYID0gVFJVRSkpDQpgYGANCg0KDQojIE1lbWJ1YXQgTW9kZWwgTXVsdGlub21pYWwgTG9naXN0aWMgUmVncmVzc2lvbg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGVjaG89RkFMU0V9DQpsaWJyYXJ5KG5uZXQpDQoNCiMgRml0IG1vZGVsIG11bHRpbm9taWFsIGxvZ2lzdGljIHJlZ3Jlc3Npb24NCm1vZGVsX211bHRpbm9tIDwtIG11bHRpbm9tKFN1Y2Nlc3NfTGV2ZWwgfiBBZHZlcnRpc2luZyArIFNhbGVzcGVvcGxlICsgU2F0aXNmYWN0aW9uICsgQ29tcGV0aXRpb24sDQogICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGF0YSkNCg0KIyBMaWhhdCByaW5na2FzYW4gaGFzaWwgbW9kZWwNCnN1bW1hcnkobW9kZWxfbXVsdGlub20pDQpgYGANCg0KSGFzaWwgbXVsdGlub21pYWwgbG9naXN0aWMgcmVncmVzc2lvbiBtZW51bmp1a2thbiBiYWh3YSBmYWt0b3ItZmFrdG9yIHBlbWFzYXJhbiBzZXBlcnRpIGFuZ2dhcmFuIGlrbGFuIChBZHZlcnRpc2luZyksIGp1bWxhaCB0ZW5hZ2EgcGVuanVhbCAoU2FsZXNwZW9wbGUpLCBrZXB1YXNhbiBwZWxhbmdnYW4gKFNhdGlzZmFjdGlvbiksIGRhbiB0aW5na2F0IGtvbXBldGlzaSAoQ29tcGV0aXRpb24pIHNlY2FyYSBiZXJzYW1hLXNhbWEgYmVycGVuZ2FydWggdGVyaGFkYXAgdGluZ2thdCBrZWJlcmhhc2lsYW4ga2FtcGFueWUgcGVtYXNhcmFuLiBNb2RlbCBtZW5nZ3VuYWthbiBrYXRlZ29yaSBMb3cgc2ViYWdhaSBwZW1iYW5kaW5nLCBkYW4gbWVtcGVya2lyYWthbiBwZWx1YW5nIHN1YXR1IGthbXBhbnllIGJlcmFkYSBwYWRhIGthdGVnb3JpIE1lZGl1bSBhdGF1IEhpZ2ggZGliYW5kaW5nIExvdy4NCg0KS29lZmlzaWVuIGJlcnRhbmRhIHBvc2l0aWYgcGFkYSB2YXJpYWJlbCBBZHZlcnRpc2luZywgU2FsZXNwZW9wbGUsIGRhbiBTYXRpc2ZhY3Rpb24gbWVudW5qdWtrYW4gYmFod2Egc2VtYWtpbiBiZXNhciBhbmdnYXJhbiBpa2xhbiwgc2VtYWtpbiBiYW55YWsgdGVuYWdhIHBlbmp1YWwgeWFuZyB0ZXJsaWJhdCwgZGFuIHNlbWFraW4gdGluZ2dpIGtlcHVhc2FuIHBlbGFuZ2dhbiwgbWFrYSBrZW11bmdraW5hbiBrYW1wYW55ZSBtZW5jYXBhaSBrZWJlcmhhc2lsYW4gTWVkaXVtIGF0YXUgSGlnaCBtZW5pbmdrYXQgc2VjYXJhIHNpZ25pZmlrYW4gZGliYW5kaW5na2FuIExvdy4gU2ViYWxpa255YSwga29lZmlzaWVuIENvbXBldGl0aW9uIHlhbmcgbmVnYXRpZiBtZW5hbmRha2FuIGJhaHdhIHNlbWFraW4gdGluZ2dpIHRpbmdrYXQgcGVyc2FpbmdhbiBwYXNhciwgc2VtYWtpbiBrZWNpbCBwZWx1YW5nIGthbXBhbnllIG1lbmNhcGFpIHRpbmdrYXQga2ViZXJoYXNpbGFuIHlhbmcgdGluZ2dpLg0KDQojIE1lbGloYXQgTmlsYWkgU3RhdGlzdGlrIChTdGQuIEVycm9yLCB6IHZhbHVlLCBwIHZhbHVlKQ0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGVjaG89RkFMU0V9DQojIEhpdHVuZyB6LXZhbHVlIGRhbiBwLXZhbHVlDQp6IDwtIHN1bW1hcnkobW9kZWxfbXVsdGlub20pJGNvZWZmaWNpZW50cyAvIHN1bW1hcnkobW9kZWxfbXVsdGlub20pJHN0YW5kYXJkLmVycm9ycw0KcCA8LSAoMSAtIHBub3JtKGFicyh6KSwgMCwgMSkpICogMg0KDQojIEdhYnVuZ2thbiBoYXNpbG55YQ0KY2JpbmQoc3VtbWFyeShtb2RlbF9tdWx0aW5vbSkkY29lZmZpY2llbnRzLCANCiAgICAgICJTdGQuIEVycm9yIiA9IHN1bW1hcnkobW9kZWxfbXVsdGlub20pJHN0YW5kYXJkLmVycm9ycywNCiAgICAgICJ6IHZhbHVlIiA9IHosDQogICAgICAicCB2YWx1ZSIgPSBwKQ0KYGBgDQoNCioqS2F0ZWdvcmkgTWVkaXVtIHZzIExvdyoqDQoNCi0gQWR2ZXJ0aXNpbmcgKM6yID0gOS41OCwgcCDiiYggMC4wNCkg4oaSIEFuZ2dhcmFuIGlrbGFuIGJlcnBlbmdhcnVoIHBvc2l0aWYgZGFuIHNpZ25pZmlrYW4sIGFydGlueWEgcGVuaW5na2F0YW4gaW52ZXN0YXNpIGlrbGFuIG1lbmluZ2thdGthbiBrZW11bmdraW5hbiBrYW1wYW55ZSBuYWlrIGRhcmkgTG93IGtlIE1lZGl1bS4NCg0KLSBTYWxlc3Blb3BsZSAozrIgPSA1LjgwLCBwIOKJiCAwLjA0KSDihpIgTGViaWggYmFueWFrIHRlbmFnYSBwZW5qdWFsIHNlY2FyYSBueWF0YSBtZW5pbmdrYXRrYW4gcGVsdWFuZyBrZWJlcmhhc2lsYW4gdGluZ2thdCBtZW5lbmdhaC4NCg0KLSBTYXRpc2ZhY3Rpb24gKM6yID0gMTMuMjgsIHAg4omIIDAuMDQpIOKGkiBLZXB1YXNhbiBwZWxhbmdnYW4geWFuZyB0aW5nZ2kgc2FuZ2F0IG1lbmRvcm9uZyBwZW5pbmdrYXRhbiBrZWJlcmhhc2lsYW4uDQoNCi0gQ29tcGV0aXRpb24gKM6yID0gLTExLjg0LCBwIOKJiCAwLjA0KSDihpIgUGVyc2FpbmdhbiBwYXNhciB5YW5nIHRpbmdnaSBtZW51cnVua2FuIHBlbHVhbmcga2ViZXJoYXNpbGFuLg0KDQoqKkthdGVnb3JpIEhpZ2ggdnMgTG93KioNCg0KLSBBZHZlcnRpc2luZyAozrIgPSAxNS4yMSwgcCDiiYggMC4wMikg4oaSIFBlbmdhcnVoIHBvc2l0aWYgZGFuIHNpZ25pZmlrYW4uIFNlbWFraW4gYmVzYXIgYW5nZ2FyYW4gaWtsYW4sIHNlbWFraW4gdGluZ2dpIHBlbHVhbmcga2FtcGFueWUgbWVuY2FwYWkga2ViZXJoYXNpbGFuIHRpbmdnaSAoSGlnaCkuDQoNCi0gU2FsZXNwZW9wbGUgKM6yID0gOS44NiwgcCDiiYggMC4wMSkg4oaSIEp1bWxhaCB0ZW5hZ2EgcGVuanVhbCB5YW5nIGxlYmloIGJhbnlhayBtZW5pbmdrYXRrYW4ga2VtdW5na2luYW4gc3Vrc2VzIHBlbnVoLg0KDQotIFNhdGlzZmFjdGlvbiAozrIgPSAyMi4yOCwgcCDiiYggMC4wMSkg4oaSIEtlcHVhc2FuIHBlbGFuZ2dhbiBtZW5qYWRpIGZha3RvciBwYWxpbmcga3VhdCBkYWxhbSBtZW5lbnR1a2FuIGtlYmVyaGFzaWxhbiB0ZXJ0aW5nZ2kuDQoNCi0gQ29tcGV0aXRpb24gKM6yID0gLTE4LjQ5LCBwIOKJiCAwLjAxKSDihpIgS29tcGV0aXNpIHRpbmdnaSBzZWNhcmEgc2lnbmlmaWthbiBtZW51cnVua2FuIHBlbHVhbmcgbWVuY2FwYWkgdGluZ2thdCBrZWJlcmhhc2lsYW4gdGVydGluZ2dpLg0KDQpTZWNhcmEga2VzZWx1cnVoYW4sIGhhc2lsIGFuYWxpc2lzIE11bHRpbm9taWFsIExvZ2lzdGljIFJlZ3Jlc3Npb24gbWVudW5qdWtrYW4gYmFod2EgZmFrdG9yIFNhdGlzZmFjdGlvbiAoa2VwdWFzYW4gcGVsYW5nZ2FuKSBtZXJ1cGFrYW4gZGV0ZXJtaW5hbiBwYWxpbmcga3VhdCB0ZXJoYWRhcCBwZW5pbmdrYXRhbiBTdWNjZXNzIExldmVsLCBkaWlrdXRpIG9sZWggQWR2ZXJ0aXNpbmcgZGFuIFNhbGVzcGVvcGxlIHlhbmcgYmVycGVuZ2FydWggcG9zaXRpZi4gU2ViYWxpa255YSwgQ29tcGV0aXRpb24gbWVtaWxpa2kgZGFtcGFrIG5lZ2F0aWYgeWFuZyBzaWduaWZpa2FuIHRlcmhhZGFwIGtlYmVyaGFzaWxhbi4NCg0KIyBFdmFsdWFzaSBBa3VyYXNpIE1vZGVsDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgZWNobz1GQUxTRX0NCiMgUHJlZGlrc2kga2VsYXMNCnByZWRfY2xhc3MgPC0gcHJlZGljdChtb2RlbF9tdWx0aW5vbSkNCg0KIyBDb25mdXNpb24gbWF0cml4DQpjb25mX21hdHJpeCA8LSB0YWJsZShQcmVkaWN0ZWQgPSBwcmVkX2NsYXNzLCBBY3R1YWwgPSBkYXRhJFN1Y2Nlc3NfTGV2ZWwpDQpjb25mX21hdHJpeA0KDQojIEhpdHVuZyBha3VyYXNpDQphY2N1cmFjeSA8LSBzdW0oZGlhZyhjb25mX21hdHJpeCkpIC8gc3VtKGNvbmZfbWF0cml4KQ0KYWNjdXJhY3kNCmBgYA0KDQpIYXNpbCBldmFsdWFzaSBtb2RlbCBNdWx0aW5vbWlhbCBMb2dpc3RpYyBSZWdyZXNzaW9uIG1lbnVuanVra2FuIGJhaHdhIG1vZGVsIG1hbXB1IG1lbXByZWRpa3NpIHRpbmdrYXQga2ViZXJoYXNpbGFuIGthbXBhbnllIHBlbWFzYXJhbiAoU3VjY2VzcyBMZXZlbCkgZGVuZ2FuIGFrdXJhc2kgc2VtcHVybmEgc2ViZXNhciAxMDAlLCBkaSBtYW5hIHNlbHVydWgga2F0ZWdvcmkgYWt0dWFs4oCUTG93LCBNZWRpdW0sIGRhbiBIaWdo4oCUYmVyaGFzaWwgZGlwcmVkaWtzaSBkZW5nYW4gdGVwYXQgdGFucGEga2VzYWxhaGFuIGtsYXNpZmlrYXNpLiBIYWwgaW5pIG1lbmdpbmRpa2FzaWthbiBiYWh3YSBrb21iaW5hc2kgZmFrdG9yIEFkdmVydGlzaW5nLCBTYWxlc3Blb3BsZSwgU2F0aXNmYWN0aW9uLCBkYW4gQ29tcGV0aXRpb24gbWVtaWxpa2kga2VtYW1wdWFuIHlhbmcgc2FuZ2F0IGt1YXQgZGFsYW0gbWVtYmVkYWthbiBzZXRpYXAgdGluZ2thdCBrZWJlcmhhc2lsYW4uIERlbmdhbiBrYXRhIGxhaW4sIHBlbmluZ2thdGFuIGludmVzdGFzaSBpa2xhbiwganVtbGFoIHRlbmFnYSBwZW5qdWFsLCBzZXJ0YSBrZXB1YXNhbiBwZWxhbmdnYW4geWFuZyB0aW5nZ2kgc2VjYXJhIGtvbnNpc3RlbiBiZXJrb250cmlidXNpIHRlcmhhZGFwIGtlYmVyaGFzaWxhbiB5YW5nIGxlYmloIGJlc2FyLCBzZW1lbnRhcmEgdGluZ2dpbnlhIHRpbmdrYXQgcGVyc2FpbmdhbiBtZW5qYWRpIGZha3RvciB5YW5nIG1lbnVydW5rYW4gcGVsdWFuZyBzdWtzZXMuDQoNCiMgVmlzdWFsaXNhc2kNCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBlY2hvPUZBTFNFfQ0KbGlicmFyeShubmV0KQ0KbGlicmFyeShwbG90bHkpDQpsaWJyYXJ5KGRwbHlyKQ0KDQojIC0tLSAxLiBTaW11bGFzaSBEYXRhIE11bHRpbm9taWFsIC0tLQ0Kc2V0LnNlZWQoMTIzKQ0KZGF0YV9tdWx0aW5vbSA8LSBkYXRhLmZyYW1lKA0KICBBZHZlcnRpc2luZyA9IHJ1bmlmKDIwMCwgNSwgMzApLA0KICBTYWxlc3Blb3BsZSA9IHJ1bmlmKDIwMCwgMSwgMTApLA0KICBTYXRpc2ZhY3Rpb24gPSBydW5pZigyMDAsIDEsIDEwKSwNCiAgQ29tcGV0aXRpb24gPSBydW5pZigyMDAsIDEsIDEwKQ0KKQ0KDQojIE1lbWJ1YXQga2F0ZWdvcmkgIlN1Y2Nlc3NfTGV2ZWwiIChMb3csIE1lZGl1bSwgSGlnaCkNCnNjb3JlIDwtIDAuMyAqIGRhdGFfbXVsdGlub20kQWR2ZXJ0aXNpbmcgKw0KICAgICAgICAgMC40ICogZGF0YV9tdWx0aW5vbSRTYWxlc3Blb3BsZSArDQogICAgICAgICAwLjYgKiBkYXRhX211bHRpbm9tJFNhdGlzZmFjdGlvbiAtDQogICAgICAgICAwLjUgKiBkYXRhX211bHRpbm9tJENvbXBldGl0aW9uICsgcm5vcm0oMjAwLCAwLCAyKQ0KDQpkYXRhX211bHRpbm9tJFN1Y2Nlc3NfTGV2ZWwgPC0gY3V0KA0KICBzY29yZSwNCiAgYnJlYWtzID0gcXVhbnRpbGUoc2NvcmUsIHByb2JzID0gYygwLCAxLzMsIDIvMywgMSkpLA0KICBsYWJlbHMgPSBjKCJMb3ciLCAiTWVkaXVtIiwgIkhpZ2giKSwNCiAgaW5jbHVkZS5sb3dlc3QgPSBUUlVFDQopDQoNCiMgLS0tIDIuIEJhbmd1biBNb2RlbCBNdWx0aW5vbWlhbCAtLS0NCm1vZGVsX211bHRpbm9tIDwtIG11bHRpbm9tKFN1Y2Nlc3NfTGV2ZWwgfiBBZHZlcnRpc2luZyArIFNhbGVzcGVvcGxlICsgU2F0aXNmYWN0aW9uICsgQ29tcGV0aXRpb24sIGRhdGEgPSBkYXRhX211bHRpbm9tKQ0KDQojIC0tLSAzLiBQcmVkaWtzaSBQcm9iYWJpbGl0YXMgLS0tDQpkYXRhX211bHRpbm9tIDwtIGRhdGFfbXVsdGlub20gJT4lDQogIG11dGF0ZShwcmVkX3Byb2JzID0gcHJlZGljdChtb2RlbF9tdWx0aW5vbSwgdHlwZSA9ICJwcm9icyIpWywxXSwNCiAgICAgICAgIFByZWRpY3RlZCA9IHByZWRpY3QobW9kZWxfbXVsdGlub20pKQ0KDQojIC0tLSA0LiBWaXN1YWxpc2FzaSAzRCBJbnRlcmFrdGlmIC0tLQ0KZmlnIDwtIHBsb3RfbHkoZGF0YV9tdWx0aW5vbSwNCiAgICAgICAgICAgICAgIHggPSB+QWR2ZXJ0aXNpbmcsDQogICAgICAgICAgICAgICB5ID0gflNhbGVzcGVvcGxlLA0KICAgICAgICAgICAgICAgeiA9IH5TYXRpc2ZhY3Rpb24sDQogICAgICAgICAgICAgICBjb2xvciA9IH5QcmVkaWN0ZWQsDQogICAgICAgICAgICAgICBjb2xvcnMgPSBjKCJza3libHVlIiwgIm9yYW5nZSIsICJyZWQiKSwNCiAgICAgICAgICAgICAgIHR5cGUgPSAic2NhdHRlcjNkIiwNCiAgICAgICAgICAgICAgIG1vZGUgPSAibWFya2VycyIsDQogICAgICAgICAgICAgICBtYXJrZXIgPSBsaXN0KHNpemUgPSA0LCBvcGFjaXR5ID0gMC44KSkgJT4lDQogIGxheW91dCgNCiAgICB0aXRsZSA9ICIzRCBWaXN1YWxpemF0aW9uOiBNdWx0aW5vbWlhbCBMb2dpc3RpYyBSZWdyZXNzaW9uIChMb3figJNNZWRpdW3igJNIaWdoKSIsDQogICAgc2NlbmUgPSBsaXN0KA0KICAgICAgeGF4aXMgPSBsaXN0KHRpdGxlID0gIkFkdmVydGlzaW5nIEJ1ZGdldCIpLA0KICAgICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gIlNhbGVzcGVvcGxlIiksDQogICAgICB6YXhpcyA9IGxpc3QodGl0bGUgPSAiU2F0aXNmYWN0aW9uIikNCiAgICApDQogICkNCg0KZmlnDQpgYGANCg0KIyBQZXJiZWRhYW4gQmluYXJ5IExvZ2lzdGljIFJlZ3Jlc3Npb24gZGVuZ2FuIE11bHRpbm9taWFsIExvZ2lzdGljIFJlZ3Jlc3Npb24NCg0KfCBBc3BlayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKipCaW5hcnkgTG9naXN0aWMgUmVncmVzc2lvbioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAqKk11bHRpbm9taWFsIExvZ2lzdGljIFJlZ3Jlc3Npb24qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQp8IDotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCA6LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IDotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwNCnwgKipKdW1sYWgga2F0ZWdvcmkgdmFyaWFiZWwgZGVwZW5kZW4qKiB8IDIga2F0ZWdvcmkgKG1pc2FsbnlhOiAqWWVzL05vKiwgKkx1bHVzL0dhZ2FsKiwgKkJlbGkvVGlkYWsgQmVsaSopICAgICAgICAgICAgICAgICAgICAgICAgIHwgTGViaWggZGFyaSAyIGthdGVnb3JpIChtaXNhbG55YTogKkxvdyosICpNZWRpdW0qLCAqSGlnaCogYXRhdSAqQSosICpCKiwgKkMqKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCAqKkplbmlzIGthdGVnb3JpKiogICAgICAgICAgICAgICAgICAgIHwgQmVyc2lmYXQgKmJpbmVyKiAoZHVhIGtlbGFzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBCZXJzaWZhdCAqbm9taW5hbCogKGJpc2EgdGlnYSBhdGF1IGxlYmloLCB0aWRhayBiZXJ1cnV0YW4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQp8ICoqRnVuZ3NpIGxpbmsqKiAgICAgICAgICAgICAgICAgICAgICAgfCBMb2dpdDogICRcbG9nIFxmcmFje3B9ezEtcH0kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEdlbmVyYWxpemVkIExvZ2l0OiAgJFxsb2cgXGZyYWN7UChZPWspfXtQKFk9Syl9JCB1bnR1ayBzZXRpYXAga2F0ZWdvcmkgKCRrJCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCAqKlBlcnNhbWFhbiB1bXVtKiogICAgICAgICAgICAgICAgICAgIHwgJFxsb2dcbGVmdChcZnJhY3twfXsxLXB9XHJpZ2h0KSA9IFxiZXRhXzAgKyBcYmV0YV8xWF8xICsgXGNkb3RzICsgXGJldGFfcFhfcCQgICAgICAgICAgICAgfCAkXGxvZ1xsZWZ0KFxmcmFje1AoWT1rKX17UChZPUspfVxyaWdodCkgPSBcYmV0YV97MGt9ICsgXGJldGFfezFrfVhfMSArIFxjZG90cyArIFxiZXRhX3twa31YX3AkLCB1bnR1ayAkayA9IDEsIDIsIC4uLiwgSy0xJCB8DQp8ICoqTWV0b2RlIGVzdGltYXNpKiogICAgICAgICAgICAgICAgICAgfCBNYXhpbXVtIExpa2VsaWhvb2QgRXN0aW1hdGlvbiAoTUxFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEp1Z2EgbWVuZ2d1bmFrYW4gTUxFLCB0ZXRhcGkgbWVuZ2hpdHVuZyBwYXJhbWV0ZXIgdW50dWsgc2V0aWFwIGthdGVnb3JpIHJlbGF0aWYgdGVyaGFkYXAga2F0ZWdvcmkgcmVmZXJlbnNpICAgICAgICAgICAgICAgIHwNCnwgKipPdXRwdXQgbW9kZWwqKiAgICAgICAgICAgICAgICAgICAgICB8IFByb2JhYmlsaXRhcyBrZWphZGlhbiBzYXR1IGthdGVnb3JpIChtaXMuIHN1a3NlcykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUHJvYmFiaWxpdGFzIHNldGlhcCBrYXRlZ29yaSAobWlzLiBMb3csIE1lZGl1bSwgSGlnaCkgeWFuZyBkaWp1bWxhaGthbiA9IDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCAqKkludGVycHJldGFzaSBrb2VmaXNpZW4qKiAgICAgICAgICAgIHwgS29lZmlzaWVuIG1lbnVuanVra2FuIHBlcnViYWhhbiAqbG9nIG9kZHMqIGtlamFkaWFuIHNhdHUga2F0ZWdvcmkgZGliYW5kaW5nIHRpZGFrIHRlcmphZGkgfCBLb2VmaXNpZW4gbWVudW5qdWtrYW4gcGVydWJhaGFuICpsb2cgb2Rkcyoga2F0ZWdvcmkgdGVydGVudHUgZGliYW5kaW5nIGthdGVnb3JpIHJlZmVyZW5zaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQp8ICoqQ29udG9oIGthc3VzKiogICAgICAgICAgICAgICAgICAgICAgfCBQcmVkaWtzaSBhcGFrYWggcGVsYW5nZ2FuIG1lbWJlbGkgcHJvZHVrIChZZXMvTm8pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFByZWRpa3NpIHRpbmdrYXQga2VwdWFzYW4gcGVsYW5nZ2FuICgqTG934oCTTWVkaXVt4oCTSGlnaCopICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQp8ICoqRnVuZ3NpIGFrdGl2YXNpKiogICAgICAgICAgICAgICAgICAgfCBTaWdtb2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFNvZnRtYXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCg0KDQojIFJlZmVyZW5jZQ0KDQpodHRwczovL2Jvb2tkb3duLm9yZy9jb250ZW50L2ExNDJiMTcyLTY5YjItNDM2ZC1iZGIwLTlkYTZkMDQ2YTBmOS8wMi1SZWdyZXNzaW9uX01vZGVsLmh0bWwjbXVsdGlub21pYWwtbG9naXN0aWNzDQoNCmh0dHBzOi8vYm9va2Rvd24ub3JnL2NodWEvYmVyNjQyX2FkdmFuY2VkX3JlZ3Jlc3Npb24vbXVsdGlub21pYWwtbG9naXN0aWMtcmVncmVzc2lvbi5odG1sDQoNCg==