

Email : garryjuliusperman@gmail.com
Instagram : boring.garr
rpubs : https://rpubs.com/Garr
Github : none
Jurusan : Statistika Bisnis
Address : ARA Center, Matana University Tower
Jl. CBD Barat Kav, RT.1, Curug Sangereng, Kelapa Dua, Tangerang, Banten 15810.
R vs phyton
R diciptakan oleh Ross Ihaka dan Robert Gentleman pada tahun 1995 sebagai implementasi dari bahasa program S. Tujuannya adalah untuk mengembangkan bahasa yang fokus pada analisis data, statistik, dan model grafis. Awalnya, R hanya digunakan oleh para akademisi, namun lama-kelamaan R juga banyak digunakan oleh para praktisi di dunia bisnis. Hal inilah yang membuat R menjadi sangat terkenal di seluruh dunia. Salah satu keunggulan R adalah komunitas besar yang tergabung dalam satu mailing-list, dokumentasi para pengguna yang mudah diakses, grup Stack Overflow yang sangat aktif, dan koleksi packages R yang dibagikan oleh sesama pengguna.
Python diciptakan oleh Guido van Rossem pada tahun 1991 dan lebih menekankan pada produktivitas juga proses pembacaan kode. Para programmer yang mengerjakan pekerjaan data scientist dalam bidang statistik biasanya menggunakan Python. Sama dengan R, Python juga memiliki package yang bisa diadaptasi ke dalam program dan komunitas dimana setiap pengguna bisa berkontribusi
sintaks dasar
Sintaks dasar dapat diartikan sebagai aturan yang harus dipenuhi demi tercapainya tujuan seorang programmer. Maksud adanya sintaks atau aturan ini adalah agar kode atau script yang ditulis dapat dibenarkan dan dimengerti oleh komputer. Aturan – aturan ini sudah diatur secara baku dan terdapat di setiap bahasa pemrograman mulai dari Java, PHP, C, C++ dan masih banyak lagi.
pada R dan python terdapat tiga hal dasar yaitu variabel, nilai, dan komentar
penugasan variabel
dalam R, untuk memasukan sebuah variabel menjadi nilai/data yang terekam didalam R dapat dinotasikan dengan menggunakan 3 cara :
- (=) di gunakan untuk penugasan
- (<-) di gunakan untuk penugasan dari sisi kiri
- (->) di gunakan untukpenugasan dari sisi kanan
x = 6
y <- 7
8 -> z
print(c(x,y,z))
## [1] 6 7 8
menambahkan komentar
menambahkan komentar pada penulisan skrip R bertujuan untuk memberikan penjelasan mengenai apa yang program itu lakukan/jalankan dengan tujuan untuk memahami makna penggunaan suatu program atau perintah
Komentar dituliskan pada satu baris yang tersedia di R, dengan menggunakan # diawal maupun diakhir pernyataan.
# Mengganti nilai x yang sudah direkam (komentar di awal pernyataan)
x = 3
z <- x + y # Mengganti nilai yang sudah direkam (Komentar yang ada di akhir pernyataan)
operator
merupakan simbol yang dilibatkan dalam program untuk melakukan operasi atau untuk memanipulasi data
aritmatika
c(3,7,8) -> x # vektor x
c(6,2,5) -> y # vektor y
x + y
## [1] 9 9 13
penjumlahan aritmatika
print (x+y) #hasil penjumlahan vektor x dan y
## [1] 9 9 13
pengurangan aritmatika
print (x-y) #hasil pengurangan vektor x dan y
## [1] -3 5 3
perkalian aritmatika
print (x*y) #hasil perkalian vektor x dan y
## [1] 18 14 40
pembagian aritmatika
print (x/y) #hasil pembagian vektor x dan y
## [1] 0.5 3.5 1.6
pemangkatan aritmatika
print (x^y) #hasil pemangkatan vektor x dan y
## [1] 729 49 32768
modulo aritmatika
print (x%%y) #hasil Modulo vektor x dan y
## [1] 3 1 3
terkadang kita perlu untuk menambahkan komentar pada hasil perhitungan R itu sendiri untuk memudahkan dalam pembacaan, penambahan komentar dapat dilakukan dengan cara ini
cat("penjumlahan vektor x dan y :", x+y , "\n")
## penjumlahan vektor x dan y : 9 9 13
cat("pegurangan vektor x dan y :", x-y , "\n")
## pegurangan vektor x dan y : -3 5 3
cat("perkalian vektor x dan y :", x*y , "\n")
## perkalian vektor x dan y : 18 14 40
cat("vektor x dibagi vektor y :", x/y , "\n")
## vektor x dibagi vektor y : 0.5 3.5 1.6
cat("vektor x pangkat vektor y :", x^y , "\n")
## vektor x pangkat vektor y : 729 49 32768
cat("modulo vektor x dan y :", x%%y , "\n")
## modulo vektor x dan y : 3 1 3
Relasional
Operasi Relasional melakukan operasi perbandingan antara elemen yang bersesuaian pada setiap operan. Pada R nanti akan muncul TRUE/FALSE, TRUE jika benar dan FALSE jika salah.
- kurang dari(<)
- kurang dari sama dengan(<=)
- lebih besar dari (>)
- lebih besar dari sama dengan (>=)
- sama dengan (==)
- tidak sama dengan /(!=)
kurang dari(<)
x = c(3,7,8) # membuat vektor x
y = c(3,10,1) # membuat vektor y
cat("vektor x kurang dari y :", x<y,"\n")
## vektor x kurang dari y : FALSE TRUE FALSE
note : jika sama maka FALSE, jika lebih kecil maka TRUE, jika lebih besar maka FALSE
kurang dari sama dengan (<=)
x = c(3,7,8) # membuat vektor x
y = c(3,10,1) # membuat vektor y
cat("vektor x kurang dari sama dengan y :", x<=y,"\n")
## vektor x kurang dari sama dengan y : TRUE TRUE FALSE
note : jika sama maka TRUE, jika lebih kecil maka TRUE, jika lebih besar maka FALSE
lebih besar dari (>)
x = c(3,7,8) # membuat vektor x
y = c(3,10,1) # membuat vektor y
cat("vektor x lebih dari y :", x>y,"\n")
## vektor x lebih dari y : FALSE FALSE TRUE
note : jika sama maka FALSE, jika lebih kecil maka FALSE, jika lebih besar maka TRUE
lebih dari sama dengan (>=)
x = c(3,7,8) # membuat vektor x
y = c(3,10,1) # membuat vektor y
cat("vektor x lebih dari sama dengan dari y :", x>=y,"\n")
## vektor x lebih dari sama dengan dari y : TRUE FALSE TRUE
note : jika sama maka TRUE, jika lebih kecil maka FALSE, jika lebih besar maka TRUE
sama dengan (==)
x = c(3,7,8) # membuat vektor x
y = c(3,10,1) # membuat vektor y
cat("vektor x sama dengan dari y :", x==y,"\n")
## vektor x sama dengan dari y : TRUE FALSE FALSE
note : jika sama maka TRUE, jika lebih kecil atau lebih besar maka FALSE
tidak sama dengan (!=)
x = c(3,7,8) # membuat vektor x
y = c(3,10,1) # membuat vektor y
cat("vektor x tidak sama dengan y :", x!=y,"\n")
## vektor x tidak sama dengan y : FALSE TRUE TRUE
note : jika sama maka FALSE, jika lebih kecil atau lebih besar maka TRUE
Logika
Operator logika mensimulasikan operasi keputusan, berdasarkan operator yang ditentukan antara operan, yang kemudian dievaluasi ke nilai Boolean Benar atau Salah. Nilai bilangan bulat bukan nol dianggap sebagai nilai BENAR, baik itu bilangan kompleks atau bilangan real.
- not/negasi (!)
- and/konjungsi (&)
- or/disjungsi (|)
- XOR/disjungsi parsial (^)
x = c(3,TRUE,FALSE)
y = c(7,8+2i,0)
# melakukan operasi logika pada operan
cat("logika negasi untuk vektor x :", ! x,"\n")
## logika negasi untuk vektor x : FALSE FALSE TRUE
cat("logika negasi untuk vektor y :", ! y,"\n")
## logika negasi untuk vektor y : FALSE FALSE TRUE
cat("logika konjungsi :",x & y,"\n")
## logika konjungsi : TRUE TRUE FALSE
cat("logika disjungsi :", x | y,"\n")
## logika disjungsi : TRUE TRUE FALSE
cat("logika disjungsi parsial :",xor(x,y),"\n")
## logika disjungsi parsial : FALSE FALSE FALSE
Lain-lain
beberapa oprator lain yang digunakan dalam R seperti akar(sqrt), logaritma(log), dan eksponen(exp).
c(3,7,8) -> x #memuat vektor v
c(3,10,1) -> y #memuat vektor y
sqrt(x*y) #bentuk akar
## [1] 3.000000 8.366600 2.828427
log(y) #logaritma vektor y
## [1] 1.098612 2.302585 0.000000
log(x) #logaritma vektor x
## [1] 1.098612 1.945910 2.079442
exp(x) #eksponen vektor x
## [1] 20.08554 1096.63316 2980.95799
exp(y) #eksponen vektor y
## [1] 20.085537 22026.465795 2.718282
## [1] 6 39 63
Tipe data
tipe data merupakan konsep penting keduany dapat menggunakan variabel untuk menyimpan tipe yang berbeda-beda yaitu :
- dobule/float
- Integer
- Boelan/Logical
- String/Character
- Complex
tst1 = 3.9 # desimal
tst2 = as.integer(6) # integer
tst2 = 9L # cara lain integer
tst3 = c(FALSE,TRUE) # bolean/logical
tst3 = as.logical(c(0,3)) # cara lain bolean/logical
tst4 = 4 + 8i # complex
tst5 = c('one','two',"three") # string/character
untuk memeriksa data
cat("cek tipe data tst2 :", class(tst2),"\n")
## cek tipe data tst2 : integer
cat("cek tipe data tst1 :", class(tst1),"\n")
## cek tipe data tst1 : numeric
Bantuan
bahasa pemrograman R memiliki cara untuk membantu kita dalam melakukan pengerjaan coding atau skrip
# help.start() # Menu di mana Anda dapat menavigasi bantuan lokal berbasis web
# ?help # menu di mana Anda dapat menavigasi bantuan lokal berbasis web
# ? class # mendapatkan bantuan untuk fungsi class
# help(class) # mendapatkan bantuan untuk fungsi class
# ??class # jika Anda tidak tahu nama fungsi yang Anda cari
# help.search('class') # jika Anda tidak tahu nama fungsi yang Anda cari
LS0tDQp0aXRsZTogIlR1Z2FzIDIiDQpzdWJ0aXRsZTogIkFsZ29yaXRtYSBkYW4gU3RydWt0dXIgZGF0YSINCmF1dGhvcjogIkdhcnJ5IEp1bGl1cyAoMjAyMDQ5MjAwMDMpIg0KZGF0ZTogImByIGZvcm1hdChTeXMuRGF0ZSgpLCAnJUIgJWQsICVZJylgIg0Kb3V0cHV0OiANCiAgaHRtbF9kb2N1bWVudDogDQogICAgaHRtbF9kb2N1bWVudDogbnVsbA0KICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KICAgIHRvYzogeWVzDQogICAgdG9jX2Zsb2F0Og0KICAgICAgY29sbGFwc2VkOiB5ZXMNCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KICAgIGNvZGVfZG93bmxvYWQ6IHllcw0KICAgIHRoZW1lOiBzYW5kc3RvbmUNCiAgICBjc3M6IHN0eWxlMS5jc3MNCiAgICBoaWdobGlnaHQ6IG1vbm9jaHJvbWUNCi0tLQ0KDQoNCjxpbWcgc3R5bGU9ImZsb2F0OiByaWdodDsgbWFyZ2luOiAwcHggMTAwcHggMHB4IDBweDsgd2lkdGg6MjUlIiBzcmM9Im1lLnBuZyIvPiANCg0KYGBge3IgbG9nbywgZWNobz1GQUxTRSxmaWcuYWxpZ249J2NlbnRlcicsIG91dC53aWR0aCA9ICczMCUnfQ0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoImxvZ29tYXRhbmEucG5nIikNCmBgYA0KDQpFbWFpbCAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsmbmJzcDs6ICBnYXJyeWp1bGl1c3Blcm1hbkBnbWFpbC5jb20gPGJyPg0KSW5zdGFncmFtICAmbmJzcDsmbmJzcDsgJm5ic3A7OiBib3JpbmcuZ2FyciA8YnI+DQpycHVicyAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7ICZuYnNwOzogaHR0cHM6Ly9ycHVicy5jb20vR2FyciA8YnI+DQpHaXRodWIgICZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyAmbmJzcDsgJm5ic3A7IDogbm9uZSA8YnI+DQpKdXJ1c2FuICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDs6IFtTdGF0aXN0aWthIEJpc25pc10oaHR0cHM6Ly9tYXRhbmF1bml2ZXJzaXR5LmFjLmlkLz9seT1hY2FkZW1pYyZjPXNiKSA8YnI+DQpBZGRyZXNzICAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgOiBBUkEgQ2VudGVyLCBNYXRhbmEgVW5pdmVyc2l0eSBUb3dlciA8YnI+DQombmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyZuYnNwOyBKbC4gQ0JEIEJhcmF0IEthdiwgUlQuMSwgQ3VydWcgU2FuZ2VyZW5nLCBLZWxhcGEgRHVhLCBUYW5nZXJhbmcsIEJhbnRlbiAxNTgxMC4NCg0KKioqKg0KDQojIFIgdnMgcGh5dG9uDQoNClIgZGljaXB0YWthbiBvbGVoIFJvc3MgSWhha2EgZGFuIFJvYmVydCBHZW50bGVtYW4gcGFkYSB0YWh1biAxOTk1IHNlYmFnYWkgaW1wbGVtZW50YXNpIGRhcmkgYmFoYXNhIHByb2dyYW0gUy4gVHVqdWFubnlhIGFkYWxhaCB1bnR1ayBtZW5nZW1iYW5na2FuIGJhaGFzYSB5YW5nIGZva3VzIHBhZGEgYW5hbGlzaXMgZGF0YSwgc3RhdGlzdGlrLCBkYW4gbW9kZWwgZ3JhZmlzLiBBd2FsbnlhLCBSIGhhbnlhIGRpZ3VuYWthbiBvbGVoIHBhcmEgYWthZGVtaXNpLCBuYW11biBsYW1hLWtlbGFtYWFuIFIganVnYSBiYW55YWsgZGlndW5ha2FuIG9sZWggcGFyYSBwcmFrdGlzaSBkaSBkdW5pYSBiaXNuaXMuIEhhbCBpbmlsYWggeWFuZyBtZW1idWF0IFIgbWVuamFkaSBzYW5nYXQgdGVya2VuYWwgZGkgc2VsdXJ1aCBkdW5pYS4gU2FsYWggc2F0dSBrZXVuZ2d1bGFuIFIgYWRhbGFoIGtvbXVuaXRhcyBiZXNhciB5YW5nIHRlcmdhYnVuZyBkYWxhbSBzYXR1IG1haWxpbmctbGlzdCwgZG9rdW1lbnRhc2kgcGFyYSBwZW5nZ3VuYSB5YW5nIG11ZGFoIGRpYWtzZXMsIGdydXAgU3RhY2sgT3ZlcmZsb3cgeWFuZyBzYW5nYXQgYWt0aWYsIGRhbiBrb2xla3NpIHBhY2thZ2VzIFIgeWFuZyBkaWJhZ2lrYW4gb2xlaCBzZXNhbWEgcGVuZ2d1bmEuDQoNClB5dGhvbiBkaWNpcHRha2FuIG9sZWggR3VpZG8gdmFuIFJvc3NlbSBwYWRhIHRhaHVuIDE5OTEgZGFuIGxlYmloIG1lbmVrYW5rYW4gcGFkYSBwcm9kdWt0aXZpdGFzIGp1Z2EgcHJvc2VzIHBlbWJhY2FhbiBrb2RlLiBQYXJhIHByb2dyYW1tZXIgeWFuZyBtZW5nZXJqYWthbiBwZWtlcmphYW4gZGF0YSBzY2llbnRpc3QgZGFsYW0gYmlkYW5nIHN0YXRpc3RpayBiaWFzYW55YSBtZW5nZ3VuYWthbiBQeXRob24uIFNhbWEgZGVuZ2FuIFIsIFB5dGhvbiBqdWdhIG1lbWlsaWtpIHBhY2thZ2UgeWFuZyBiaXNhIGRpYWRhcHRhc2kga2UgZGFsYW0gcHJvZ3JhbSBkYW4ga29tdW5pdGFzIGRpbWFuYSBzZXRpYXAgcGVuZ2d1bmEgYmlzYSBiZXJrb250cmlidXNpDQoNCiMgc2ludGFrcyBkYXNhcg0KDQpTaW50YWtzIGRhc2FyIGRhcGF0IGRpYXJ0aWthbiBzZWJhZ2FpIGF0dXJhbiB5YW5nIGhhcnVzIGRpcGVudWhpIGRlbWkgdGVyY2FwYWlueWEgdHVqdWFuIHNlb3JhbmcgcHJvZ3JhbW1lci4gTWFrc3VkIGFkYW55YSBzaW50YWtzIGF0YXUgYXR1cmFuIGluaSBhZGFsYWggYWdhciBrb2RlIGF0YXUgc2NyaXB0IHlhbmcgZGl0dWxpcyBkYXBhdCBkaWJlbmFya2FuIGRhbiBkaW1lbmdlcnRpIG9sZWgga29tcHV0ZXIuIEF0dXJhbiDigJMgYXR1cmFuIGluaSBzdWRhaCBkaWF0dXIgc2VjYXJhIGJha3UgZGFuIHRlcmRhcGF0IGRpIHNldGlhcCBiYWhhc2EgcGVtcm9ncmFtYW4gbXVsYWkgZGFyaSBKYXZhLCBQSFAsIEMsIEMrKyBkYW4gbWFzaWggYmFueWFrIGxhZ2kuDQoNCnBhZGEgUiBkYW4gcHl0aG9uIHRlcmRhcGF0IHRpZ2EgaGFsIGRhc2FyIHlhaXR1IHZhcmlhYmVsLCBuaWxhaSwgZGFuIGtvbWVudGFyDQoNCiMjIHBlbnVnYXNhbiB2YXJpYWJlbA0KDQpkYWxhbSBSLCB1bnR1ayBtZW1hc3VrYW4gc2VidWFoIHZhcmlhYmVsIG1lbmphZGkgbmlsYWkvZGF0YSB5YW5nIHRlcmVrYW0gZGlkYWxhbSBSIGRhcGF0IGRpbm90YXNpa2FuIGRlbmdhbiBtZW5nZ3VuYWthbiAzIGNhcmEgOg0KDQotICg9KSAgZGkgZ3VuYWthbiB1bnR1ayBwZW51Z2FzYW48YnI+DQotICg8LSkgZGkgZ3VuYWthbiB1bnR1ayBwZW51Z2FzYW4gZGFyaSBzaXNpIGtpcmk8YnI+DQotICgtPikgZGkgZ3VuYWthbiB1bnR1a3BlbnVnYXNhbiBkYXJpIHNpc2kga2FuYW48YnI+DQoNCmBgYHtyfQ0KeCA9IDYNCnkgPC0gNw0KOCAtPiB6DQpwcmludChjKHgseSx6KSkNCmBgYA0KDQojIyBtZW5hbWJhaGthbiBrb21lbnRhcg0KDQptZW5hbWJhaGthbiBrb21lbnRhciBwYWRhIHBlbnVsaXNhbiBza3JpcCBSIGJlcnR1anVhbiB1bnR1ayBtZW1iZXJpa2FuIHBlbmplbGFzYW4gbWVuZ2VuYWkgYXBhIHlhbmcgcHJvZ3JhbSBpdHUgbGFrdWthbi9qYWxhbmthbiBkZW5nYW4gdHVqdWFuIHVudHVrIG1lbWFoYW1pIG1ha25hIHBlbmdndW5hYW4gc3VhdHUgcHJvZ3JhbSBhdGF1IHBlcmludGFoDQoNCktvbWVudGFyIGRpdHVsaXNrYW4gcGFkYSBzYXR1IGJhcmlzIHlhbmcgdGVyc2VkaWEgZGkgUiwgZGVuZ2FuIG1lbmdndW5ha2FuICMgZGlhd2FsIG1hdXB1biBkaWFraGlyIHBlcm55YXRhYW4uDQoNCmBgYHtyfQ0KIyBNZW5nZ2FudGkgbmlsYWkgeCB5YW5nIHN1ZGFoIGRpcmVrYW0gKGtvbWVudGFyIGRpIGF3YWwgcGVybnlhdGFhbikNCnggPSAzDQp6IDwtIHggKyB5ICAgICAgICAjIE1lbmdnYW50aSBuaWxhaSB5YW5nIHN1ZGFoIGRpcmVrYW0gKEtvbWVudGFyIHlhbmcgYWRhIGRpIGFraGlyIHBlcm55YXRhYW4pDQpgYGANCg0KIyBvcGVyYXRvcg0KDQptZXJ1cGFrYW4gc2ltYm9sIHlhbmcgZGlsaWJhdGthbiBkYWxhbQ0KcHJvZ3JhbSB1bnR1ayBtZWxha3VrYW4gb3BlcmFzaSBhdGF1IHVudHVrIG1lbWFuaXB1bGFzaSBkYXRhDQoNCiMjIGFyaXRtYXRpa2ENCg0KYGBge3J9DQpjKDMsNyw4KSAtPiB4ICAgIyB2ZWt0b3IgeA0KYyg2LDIsNSkgLT4geSAgICMgdmVrdG9yIHkNCnggKyB5DQpgYGANCg0KIyMjICpwZW5qdW1sYWhhbiBhcml0bWF0aWthKg0KDQpgYGB7cn0NCnByaW50ICh4K3kpICAgICNoYXNpbCBwZW5qdW1sYWhhbiB2ZWt0b3IgeCBkYW4geQ0KYGBgDQoNCiMjIyAqcGVuZ3VyYW5nYW4gYXJpdG1hdGlrYSoNCg0KYGBge3J9DQpwcmludCAoeC15KSAgICAjaGFzaWwgcGVuZ3VyYW5nYW4gdmVrdG9yIHggZGFuIHkNCmBgYA0KDQojIyMgKnBlcmthbGlhbiBhcml0bWF0aWthKg0KDQpgYGB7ciBmaWcuaGVpZ2h0PTUsIGZpZy53aWR0aD01fQ0KcHJpbnQgKHgqeSkgICAgI2hhc2lsIHBlcmthbGlhbiB2ZWt0b3IgeCBkYW4geQ0KYGBgDQoNCiMjIyAqcGVtYmFnaWFuIGFyaXRtYXRpa2EqDQoNCmBgYHtyfQ0KcHJpbnQgKHgveSkgICAgI2hhc2lsIHBlbWJhZ2lhbiB2ZWt0b3IgeCBkYW4geQ0KYGBgDQoNCiMjIyAqcGVtYW5na2F0YW4gYXJpdG1hdGlrYSoNCg0KYGBge3J9DQpwcmludCAoeF55KSAgICAjaGFzaWwgcGVtYW5na2F0YW4gdmVrdG9yIHggZGFuIHkNCmBgYA0KDQojIyMgKm1vZHVsbyBhcml0bWF0aWthKg0KDQpgYGB7cn0NCnByaW50ICh4JSV5KSAgICAjaGFzaWwgTW9kdWxvIHZla3RvciB4IGRhbiB5DQpgYGANCg0KdGVya2FkYW5nIGtpdGEgcGVybHUgdW50dWsgbWVuYW1iYWhrYW4ga29tZW50YXIgcGFkYSBoYXNpbCBwZXJoaXR1bmdhbiBSIGl0dSBzZW5kaXJpIHVudHVrIG1lbXVkYWhrYW4gZGFsYW0gcGVtYmFjYWFuLCBwZW5hbWJhaGFuIGtvbWVudGFyIGRhcGF0IGRpbGFrdWthbiBkZW5nYW4gY2FyYSBpbmkNCg0KYGBge3J9DQpjYXQoInBlbmp1bWxhaGFuIHZla3RvciB4IGRhbiB5IDoiLCB4K3kgLCAiXG4iKQ0KDQpjYXQoInBlZ3VyYW5nYW4gdmVrdG9yIHggZGFuIHkgOiIsIHgteSAsICJcbiIpDQoNCmNhdCgicGVya2FsaWFuIHZla3RvciB4IGRhbiB5IDoiLCB4KnkgLCAiXG4iKQ0KDQpjYXQoInZla3RvciB4IGRpYmFnaSB2ZWt0b3IgeSA6IiwgeC95ICwgIlxuIikNCg0KY2F0KCJ2ZWt0b3IgeCBwYW5na2F0IHZla3RvciB5IDoiLCB4XnkgLCAiXG4iKQ0KDQpjYXQoIm1vZHVsbyB2ZWt0b3IgeCBkYW4geSA6IiwgeCUleSAsICJcbiIpDQpgYGANCg0KIyMgUmVsYXNpb25hbCANCg0KT3BlcmFzaSBSZWxhc2lvbmFsIG1lbGFrdWthbiBvcGVyYXNpIHBlcmJhbmRpbmdhbiBhbnRhcmEgZWxlbWVuIHlhbmcgYmVyc2VzdWFpYW4gcGFkYSBzZXRpYXAgb3BlcmFuLiBQYWRhIFIgbmFudGkgYWthbiBtdW5jdWwgVFJVRS9GQUxTRSwgVFJVRSBqaWthIGJlbmFyIGRhbiBGQUxTRSBqaWthIHNhbGFoLjxicj4NCg0KLSBrdXJhbmcgZGFyaSg8KTxicj4NCi0ga3VyYW5nIGRhcmkgc2FtYSBkZW5nYW4oPD0pPGJyPg0KLSBsZWJpaCBiZXNhciBkYXJpICg+KTxicj4NCi0gbGViaWggYmVzYXIgZGFyaSBzYW1hIGRlbmdhbiAoPj0pPGJyPg0KLSBzYW1hIGRlbmdhbiAoPT0pPGJyPg0KLSB0aWRhayBzYW1hIGRlbmdhbiAvKCE9KTxicj4NCg0KIyMjIGt1cmFuZyBkYXJpKDwpDQoNCmBgYHtyfQ0KeCA9IGMoMyw3LDgpICAjIG1lbWJ1YXQgdmVrdG9yIHgNCnkgPSBjKDMsMTAsMSkgICMgbWVtYnVhdCB2ZWt0b3IgeQ0KY2F0KCJ2ZWt0b3IgeCBrdXJhbmcgZGFyaSB5IDoiLCB4PHksIlxuIikNCmBgYA0KDQoqbm90ZSA6IGppa2Egc2FtYSBtYWthIEZBTFNFLCBqaWthIGxlYmloIGtlY2lsIG1ha2EgVFJVRSwgamlrYSBsZWJpaCBiZXNhciBtYWthIEZBTFNFKg0KDQojIyMga3VyYW5nIGRhcmkgc2FtYSBkZW5nYW4gKDw9KQ0KDQpgYGB7cn0NCnggPSBjKDMsNyw4KSAgIyBtZW1idWF0IHZla3RvciB4DQp5ID0gYygzLDEwLDEpICAjIG1lbWJ1YXQgdmVrdG9yIHkNCmNhdCgidmVrdG9yIHgga3VyYW5nIGRhcmkgc2FtYSBkZW5nYW4geSA6IiwgeDw9eSwiXG4iKQ0KYGBgDQoNCipub3RlIDogamlrYSBzYW1hIG1ha2EgVFJVRSwgamlrYSBsZWJpaCBrZWNpbCBtYWthIFRSVUUsIGppa2EgbGViaWggYmVzYXIgbWFrYSBGQUxTRSoNCg0KIyMjIGxlYmloIGJlc2FyIGRhcmkgKD4pDQoNCmBgYHtyfQ0KeCA9IGMoMyw3LDgpICAjIG1lbWJ1YXQgdmVrdG9yIHgNCnkgPSBjKDMsMTAsMSkgICMgbWVtYnVhdCB2ZWt0b3IgeQ0KY2F0KCJ2ZWt0b3IgeCBsZWJpaCBkYXJpIHkgOiIsIHg+eSwiXG4iKQ0KYGBgDQoNCipub3RlIDogamlrYSBzYW1hIG1ha2EgRkFMU0UsIGppa2EgbGViaWgga2VjaWwgbWFrYSBGQUxTRSwgamlrYSBsZWJpaCBiZXNhciBtYWthIFRSVUUqDQoNCiMjIyBsZWJpaCBkYXJpIHNhbWEgZGVuZ2FuICg+PSkNCg0KYGBge3J9DQp4ID0gYygzLDcsOCkgICMgbWVtYnVhdCB2ZWt0b3IgeA0KeSA9IGMoMywxMCwxKSAgIyBtZW1idWF0IHZla3RvciB5DQpjYXQoInZla3RvciB4IGxlYmloIGRhcmkgc2FtYSBkZW5nYW4gZGFyaSB5IDoiLCB4Pj15LCJcbiIpDQpgYGANCg0KKm5vdGUgOiBqaWthIHNhbWEgbWFrYSBUUlVFLCBqaWthIGxlYmloIGtlY2lsIG1ha2EgRkFMU0UsIGppa2EgbGViaWggYmVzYXIgbWFrYSBUUlVFKg0KDQojIyMgc2FtYSBkZW5nYW4gKD09KQ0KDQpgYGB7cn0NCnggPSBjKDMsNyw4KSAgIyBtZW1idWF0IHZla3RvciB4DQp5ID0gYygzLDEwLDEpICAjIG1lbWJ1YXQgdmVrdG9yIHkNCmNhdCgidmVrdG9yIHggc2FtYSBkZW5nYW4gZGFyaSB5IDoiLCB4PT15LCJcbiIpDQpgYGANCg0KKm5vdGUgOiBqaWthIHNhbWEgbWFrYSBUUlVFLCBqaWthIGxlYmloIGtlY2lsIGF0YXUgbGViaWggYmVzYXIgbWFrYSBGQUxTRSoNCg0KIyMjIHRpZGFrIHNhbWEgZGVuZ2FuICghPSkNCg0KYGBge3J9DQp4ID0gYygzLDcsOCkgICMgbWVtYnVhdCB2ZWt0b3IgeA0KeSA9IGMoMywxMCwxKSAgIyBtZW1idWF0IHZla3RvciB5DQpjYXQoInZla3RvciB4IHRpZGFrIHNhbWEgZGVuZ2FuIHkgOiIsIHghPXksIlxuIikNCmBgYA0KDQoqbm90ZSA6IGppa2Egc2FtYSBtYWthIEZBTFNFLCBqaWthIGxlYmloIGtlY2lsIGF0YXUgbGViaWggYmVzYXIgbWFrYSBUUlVFKg0KDQojIyBMb2dpa2ENCg0KT3BlcmF0b3IgbG9naWthIG1lbnNpbXVsYXNpa2FuIG9wZXJhc2kga2VwdXR1c2FuLCBiZXJkYXNhcmthbiBvcGVyYXRvciB5YW5nIGRpdGVudHVrYW4gYW50YXJhIG9wZXJhbiwgeWFuZyBrZW11ZGlhbiBkaWV2YWx1YXNpIGtlIG5pbGFpIEJvb2xlYW4gQmVuYXIgYXRhdSBTYWxhaC4gTmlsYWkgYmlsYW5nYW4gYnVsYXQgYnVrYW4gbm9sIGRpYW5nZ2FwIHNlYmFnYWkgbmlsYWkgQkVOQVIsIGJhaWsgaXR1IGJpbGFuZ2FuIGtvbXBsZWtzIGF0YXUgYmlsYW5nYW4gcmVhbC48YnI+DQoNCi0gbm90L25lZ2FzaSAoISk8YnI+DQotIGFuZC9rb25qdW5nc2kgKCYpPGJyPg0KLSBvci9kaXNqdW5nc2kgKHwpPGJyPg0KLSBYT1IvZGlzanVuZ3NpIHBhcnNpYWwgKF4pPGJyPg0KDQpgYGB7cn0NCnggPSBjKDMsVFJVRSxGQUxTRSkNCnkgPSBjKDcsOCsyaSwwKQ0KIyBtZWxha3VrYW4gb3BlcmFzaSBsb2dpa2EgcGFkYSBvcGVyYW4NCmNhdCgibG9naWthIG5lZ2FzaSB1bnR1ayB2ZWt0b3IgeCA6IiwgISB4LCJcbiIpDQpjYXQoImxvZ2lrYSBuZWdhc2kgdW50dWsgdmVrdG9yIHkgOiIsICEgeSwiXG4iKQ0KY2F0KCJsb2dpa2Ega29uanVuZ3NpIDoiLHggJiB5LCJcbiIpDQpjYXQoImxvZ2lrYSBkaXNqdW5nc2kgOiIsIHggfCB5LCJcbiIpDQpjYXQoImxvZ2lrYSBkaXNqdW5nc2kgcGFyc2lhbCA6Iix4b3IoeCx5KSwiXG4iKQ0KYGBgDQoNCiMjIExhaW4tbGFpbg0KDQpiZWJlcmFwYSBvcHJhdG9yIGxhaW4geWFuZyBkaWd1bmFrYW4gZGFsYW0gUiBzZXBlcnRpIGFrYXIoc3FydCksIGxvZ2FyaXRtYShsb2cpLCBkYW4gZWtzcG9uZW4oZXhwKS4NCmBgYHtyfQ0KYygzLDcsOCkgLT4geCAgICAjbWVtdWF0IHZla3RvciB2DQpjKDMsMTAsMSkgLT4geSAgICAjbWVtdWF0IHZla3RvciB5DQoNCnNxcnQoeCp5KSAgICAgICAgI2JlbnR1ayBha2FyDQoNCmxvZyh5KSAgICAgICAgICAgI2xvZ2FyaXRtYSB2ZWt0b3IgeQ0KbG9nKHgpICAgICAgICAgICAjbG9nYXJpdG1hIHZla3RvciB4DQoNCmV4cCh4KSAgICAgICAgICAgI2Vrc3BvbmVuIHZla3RvciB4DQpleHAoeSkgICAgICAgICAgICNla3Nwb25lbiB2ZWt0b3IgeQ0KDQooeCp4KS15ICAgICAgICAgICN0YW5kYSBrdXJ1bmcNCmBgYA0KDQojIFRpcGUgZGF0YQ0KDQp0aXBlIGRhdGEgbWVydXBha2FuIGtvbnNlcCBwZW50aW5nIGtlZHVhbnkgZGFwYXQgbWVuZ2d1bmFrYW4gdmFyaWFiZWwgdW50dWsgbWVueWltcGFuIHRpcGUgeWFuZyBiZXJiZWRhLWJlZGEgeWFpdHUgOjxicj4NCi0gZG9idWxlL2Zsb2F0IDxicj4NCi0gSW50ZWdlciA8YnI+DQotIEJvZWxhbi9Mb2dpY2FsIDxicj4NCi0gU3RyaW5nL0NoYXJhY3RlciA8YnI+DQotIENvbXBsZXggPGJyPg0KDQpgYGB7cn0NCnRzdDEgPSAzLjkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZGVzaW1hbA0KdHN0MiA9IGFzLmludGVnZXIoNikgICAgICAgICAgICAgICAgICAgIyBpbnRlZ2VyDQp0c3QyID0gOUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGNhcmEgbGFpbiBpbnRlZ2VyDQp0c3QzID0gYyhGQUxTRSxUUlVFKSAgICAgICAgICAgICAgICAgICAjIGJvbGVhbi9sb2dpY2FsDQp0c3QzID0gYXMubG9naWNhbChjKDAsMykpICAgICAgICAgICAgICAjIGNhcmEgbGFpbiBib2xlYW4vbG9naWNhbA0KdHN0NCA9IDQgKyA4aSAgICAgICAgICAgICAgICAgICAgICAgICAgIyBjb21wbGV4DQp0c3Q1ID0gYygnb25lJywndHdvJywidGhyZWUiKSAgICAgICAgICAjIHN0cmluZy9jaGFyYWN0ZXINCmBgYA0KDQoqdW50dWsgbWVtZXJpa3NhIGRhdGEqPGJyPg0KDQotIGNsYXNzKC4uKTxicj4NCi0gdHlwZW9mKC4uKTxicj4NCg0KYGBge3J9DQpjYXQoImNlayB0aXBlIGRhdGEgdHN0MiA6IiwgY2xhc3ModHN0MiksIlxuIikNCmNhdCgiY2VrIHRpcGUgZGF0YSB0c3QxIDoiLCBjbGFzcyh0c3QxKSwiXG4iKQ0KYGBgDQoNCiMgQmFudHVhbg0KDQpiYWhhc2EgcGVtcm9ncmFtYW4gUiBtZW1pbGlraSBjYXJhIHVudHVrIG1lbWJhbnR1IGtpdGEgZGFsYW0gbWVsYWt1a2FuIHBlbmdlcmphYW4gY29kaW5nIGF0YXUgc2tyaXANCg0KYGBge3J9DQojIGhlbHAuc3RhcnQoKSAgICAgICAgICAjIE1lbnUgZGkgbWFuYSBBbmRhIGRhcGF0IG1lbmF2aWdhc2kgYmFudHVhbiBsb2thbCBiZXJiYXNpcyB3ZWINCiMgP2hlbHAgICAgICAgICAgICAgICAgICMgbWVudSBkaSBtYW5hIEFuZGEgZGFwYXQgbWVuYXZpZ2FzaSBiYW50dWFuIGxva2FsIGJlcmJhc2lzIHdlYg0KIyA/IGNsYXNzICAgICAgICAgICAgICAgIyBtZW5kYXBhdGthbiBiYW50dWFuIHVudHVrIGZ1bmdzaSBjbGFzcw0KIyBoZWxwKGNsYXNzKSAgICAgICAgICAgIyBtZW5kYXBhdGthbiBiYW50dWFuIHVudHVrIGZ1bmdzaSBjbGFzcw0KIyA/P2NsYXNzICAgICAgICAgICAgICAgIyBqaWthIEFuZGEgdGlkYWsgdGFodSBuYW1hIGZ1bmdzaSB5YW5nIEFuZGEgY2FyaQ0KIyBoZWxwLnNlYXJjaCgnY2xhc3MnKSAgIyBqaWthIEFuZGEgdGlkYWsgdGFodSBuYW1hIGZ1bmdzaSB5YW5nIEFuZGEgY2FyaQ0KYGBg