Email             :
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.


1 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

2 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

2.1 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

2.2 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)

3 operator

merupakan simbol yang dilibatkan dalam program untuk melakukan operasi atau untuk memanipulasi data

3.1 aritmatika

c(3,7,8) -> x   # vektor x
c(6,2,5) -> y   # vektor y
x + y
## [1]  9  9 13

3.1.1 penjumlahan aritmatika

print (x+y)    #hasil penjumlahan vektor x dan y
## [1]  9  9 13

3.1.2 pengurangan aritmatika

print (x-y)    #hasil pengurangan vektor x dan y
## [1] -3  5  3

3.1.3 perkalian aritmatika

print (x*y)    #hasil perkalian vektor x dan y
## [1] 18 14 40

3.1.4 pembagian aritmatika

print (x/y)    #hasil pembagian vektor x dan y
## [1] 0.5 3.5 1.6

3.1.5 pemangkatan aritmatika

print (x^y)    #hasil pemangkatan vektor x dan y
## [1]   729    49 32768

3.1.6 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

3.2 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 /(!=)

3.2.1 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

3.2.2 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

3.2.3 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

3.2.4 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

3.2.5 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

3.2.6 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

3.3 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

3.4 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
(x*x)-y          #tanda kurung
## [1]  6 39 63

4 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

  • class(..)
  • typeof(..)
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

5 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