Email             :
RPubs            : https://rpubs.com/aliciaarifin/
Jurusan          : Statistika
Address         : ARA Center, Matana University Tower
                         Jl. CBD Barat Kav, RT.1, Curug Sangereng, Kelapa Dua, Tangerang, Banten 15810.


1 R vs Python

R dan Python adalah bahasa pemograman yang sangat populer, dinamis, digunakan secara luas dalam komunitas data science. R lebih banyak digunakan dalam analisis statistik, sedangkan Python menyediakan pendekatan yang lebih umum mangenai sains data. R dan Python bisa digunakan oleh pemula tetapi membutuhkan waktu yang banyak, dan latihan yang banyak untuk emnguasainya.

1.1 Sintaks Dasar

1.1.1 Penugasan Variabel

dalam R terdapat =, -> dan <-.

x = 5
y <- 8
9 -> z
print(c(x,y,z))
## [1] 5 8 9

1.1.2 Menambahkan Komentar

untuk menambahkan komentar, dengan menggunakan # di awal maupun di akhir pernyataan.

x = 15      # Mengganti nilai x diawal pernyatan (penugasan variabel)
x - y -> z  # MEngganti nilai z yang sudah direkam (penugasan variabel)

1.2 Operator

Simbol yang mengarahkan complimer untuk melakukan berbagai macam operasi terhadap beberapa penugasan.

1.2.1 Arietmatika

Operasi matematika seperti penjumlahan (+), pengurangan (-), perkalian (*), Pembagian (/), pemangkatan (^), dan modulo (%%).

Berikut ini adalah contoh penjumlahan di R

c(2,7,9) -> x   # vektor x
c(5,7,1) -> y   # vektor y
x + y
## [1]  7 14 10

Berikut ini adalah contoh pengurangan di R

x-y
## [1] -3  0  8

Berikut ini adalah contoh perkalian di R

x*y
## [1] 10 49  9

Berikut ini adalah contoh pembagian di R

x/y
## [1] 0.4 1.0 9.0
y/x
## [1] 2.5000000 1.0000000 0.1111111

Berikut ini adalah contoh pemangkatan di R

print(x^y)     # x pangkat y
## [1]     32 823543      9
print(y^x)     # y pangkat x
## [1]     25 823543      1

Berikut ini adalah contoh modulo di R

x%%y
## [1] 2 0 0

Kadang ada perlu untuk menampilkan keterangan/komentar yang juga melekat pada hasil perhitungan R. Dapat dilakukan dengan cara :

cat("penjumlahan vektor x dan y :", x+y , "\n")
## penjumlahan vektor x dan y : 7 14 10
cat("pegurangan vektor x dan y :", x-y , "\n")
## pegurangan vektor x dan y : -3 0 8
cat("perkalian vektor x dan y :", x*y , "\n")
## perkalian vektor x dan y : 10 49 9
cat("vektor x dibagi vektor y :", x/y , "\n")
## vektor x dibagi vektor y : 0.4 1 9
cat("vektor x pangkat vektor y :", x^y , "\n")
## vektor x pangkat vektor y : 32 823543 9
cat("modulo vektor x dan y :", x%%y , "\n")
## modulo vektor x dan y : 2 0 0

1.2.2 Relasional

operasi perbandingan antara elemen yang bersesuaian pada setiap operan. Pada R nanti akan muncul TRUE/FALSE.

kurang dari(<), lebih dari (>), lebih dari sama dengan (>=), kurang dari sama dengan(<=), sama dengan (==), dan tidak sama dengan /(!=).

Contoh

x = c(1,9,5)  # membuat vektor x
y = c(6,2,5)  # membuat vektor y
cat("vektor x kurang dari y :", x<y,"\n")
## vektor x kurang dari y : TRUE FALSE FALSE
cat("vektor x kurang dari sama dengan y :", x<=y,"\n")
## vektor x kurang dari sama dengan y : TRUE FALSE TRUE
cat("vektor x lebih dari y :", x>y,"\n")
## vektor x lebih dari y : FALSE TRUE FALSE
cat("vektor x lebih dari sama dengan dari y :", x>=y,"\n")
## vektor x lebih dari sama dengan dari y : FALSE TRUE TRUE
cat("vektor x sama dengan dari y :", x==y,"\n")
## vektor x sama dengan dari y : FALSE FALSE TRUE
cat("vektor x tidak sama dengan y :", x!=y,"\n")
## vektor x tidak sama dengan y : TRUE TRUE FALSE

1.2.3 Logika

Operator logika mensimulasikan operasi keputusan yang kemudian hasilya dalam nilai Boelan TRUE/FALSE.

nilai bilangan bulat bukan nol dianggap sebagai nilai TRUE, baik itu bilangan kompleks atau bilangan ril.

not/negasi (!), and/konjungsi (&), or/disjungsi (|), dan XOR/disjungsi parsial (^)

x = c(3,FALSE,0)
y = c(2,3+3i,1)

# melakukan operasi logika pada operan
cat("logika negasi untuk vektor x :", ! x,"\n")
## logika negasi untuk vektor x : FALSE TRUE TRUE
cat("logika negasi untuk vektor y :", ! y,"\n")
## logika negasi untuk vektor y : FALSE FALSE FALSE
cat("logika konjungsi :",x & y,"\n")
## logika konjungsi : TRUE FALSE FALSE
cat("logika disjungsi :", x | y,"\n")
## logika disjungsi : TRUE TRUE TRUE
cat("logika disjungsi parsial :",xor(x,y),"\n")
## logika disjungsi parsial : FALSE TRUE TRUE

1.2.4 Lain-lain

ada beberapa operator lain seperti akar(sqrt), logaritma(log), dan eksponen(exp).

Dalam R juga berlaku sifat komutatis, asosiatif, dan distributif.

# membuat vektor x dan y yang baru
c(1,2,3) -> x
c(4,5,12) -> y

sqrt(x*y)
## [1] 2.000000 3.162278 6.000000
log(y)
## [1] 1.386294 1.609438 2.484907
exp(x)
## [1]  2.718282  7.389056 20.085537
# contoh berlaku sifat"
(x+y)^2 + 3*(x-y)
## [1]  16  40 198

1.3 Tipe Data

dobule/float (desimal ; bilangan koma), Integer (bilangan bulat), Boelan/Logical (TRUE/FALSE ; true=1, false=0), String/Character (karakter/kalimat yang diapit ’ / "), dan Complex (pasangan angka ril dan imajener)

ali1 = 9.9                             # desimal
ali2 = as.integer(7)                   # integer
ali2 = 7L                              # cara lain integer
ali3 = c(FALSE,TRUE)                   # bolean/logical
ali3 = as.logical(c(0,1))              # cara lain bolean/logical
ali4 = 4 +5i                           # complex
ali5 = c('hai','hello',"annyeong")     # string/character

Untuk memeriksa tipe data dalam R : 1. class(..) 2. typeof(..)

cat("cek tipe data ali3 :", class(ali3),"\n")
## cek tipe data ali3 : logical
cat("cek tipe data ali5 :", class(ali5),"\n")
## cek tipe data ali5 : character

Untuk angka bilangan bulat, R biasanya membaca dalam tipe data numberic/double bukan integer. Komputer menganggap bilangan misalnya 7 terbaca sebagai bilangan desimal 7.000 . Jadi pastikan di coding tipe datanya kalau mau diubah menjadi integer.

Contoh

ali10 = 3
typeof(ali10)
## [1] "double"
ali10 = 3L
typeof(ali10)
## [1] "integer"

1.4 Bantuan

Mencari bantuan di R sangat penting. R memiliki fasilitas untuk membantu kita dalam mengerjakan coding. Bantuan bisa dimunculkan dari coding atau menu di kanan bawah ada tulisan “help”.

dengan coding

help.start()            # menu di mana Anda dapat menavigasi bantuan berbasis web
## starting httpd help server ... done
## If nothing happens, you should open
## 'http://127.0.0.1:21679/doc/html/index.html' yourself
?help                   # menu di mana Anda dapat menavigasi bantuan 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
LS0tDQp0aXRsZTogIlByYWt0ZWsgQWxnb3JpdG1hIGRhbiBTdHJ1a3R1ciBEYXRhIg0Kc3VidGl0bGU6ICJUdWdhcyAyIg0KYXV0aG9yOiAiQWxpY2lhIEFyaWZpbiAoMjAyMTQ5MjAwMDEpIg0KZGF0ZTogImByIGZvcm1hdChTeXMuRGF0ZSgpLCAnJUIgJWQsICVZJylgIg0Kb3V0cHV0OiANCiAgaHRtbF9kb2N1bWVudDogDQogICAgaHRtbF9kb2N1bWVudDogbnVsbA0KICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KICAgIHRvYzogeWVzDQogICAgdG9jX2Zsb2F0Og0KICAgICAgY29sbGFwc2VkOiB5ZXMNCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KICAgIGNvZGVfZG93bmxvYWQ6IHllcw0KICAgIHRoZW1lOiBzYW5kc3RvbmUNCiAgICBjc3M6IHN0eWxlMS5jc3MNCiAgICBoaWdobGlnaHQ6IG1vbm9jaHJvbWUNCi0tLQ0KDQoNCjxpbWcgc3R5bGU9ImZsb2F0OiByaWdodDsgbWFyZ2luOiAwcHggMTAwcHggMHB4IDBweDsgd2lkdGg6MjUlIiBzcmM9ImZvdG9kaXJpLnBuZyIvPiANCg0KYGBge3IgbG9nbywgZWNobz1GQUxTRSxmaWcuYWxpZ249J2NlbnRlcicsIG91dC53aWR0aCA9ICczMCUnfQ0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoImxvZ29tYXRhbmEucG5nIikNCmBgYA0KDQpFbWFpbCAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsmbmJzcDs6ICBhbGkuMTlhcmlmaW5AZ21haWwuY29tIDxicj4NClJQdWJzICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDs6IGh0dHBzOi8vcnB1YnMuY29tL2FsaWNpYWFyaWZpbi8gPGJyPg0KSnVydXNhbiAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7OiBbU3RhdGlzdGlrYV0oaHR0cHM6Ly9tYXRhbmF1bml2ZXJzaXR5LmFjLmlkLz9seT1hY2FkZW1pYyZjPXNiKSA8YnI+DQpBZGRyZXNzICAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgOiBBUkEgQ2VudGVyLCBNYXRhbmEgVW5pdmVyc2l0eSBUb3dlciA8YnI+DQombmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyZuYnNwOyBKbC4gQ0JEIEJhcmF0IEthdiwgUlQuMSwgQ3VydWcgU2FuZ2VyZW5nLCBLZWxhcGEgRHVhLCBUYW5nZXJhbmcsIEJhbnRlbiAxNTgxMC4NCg0KKioqKg0KDQojIFIgdnMgUHl0aG9uDQpSIGRhbiBQeXRob24gYWRhbGFoIGJhaGFzYSBwZW1vZ3JhbWFuIHlhbmcgc2FuZ2F0IHBvcHVsZXIsIGRpbmFtaXMsIGRpZ3VuYWthbiBzZWNhcmEgbHVhcyBkYWxhbSBrb211bml0YXMgZGF0YSBzY2llbmNlLiBSIGxlYmloIGJhbnlhayBkaWd1bmFrYW4gZGFsYW0gYW5hbGlzaXMgc3RhdGlzdGlrLCBzZWRhbmdrYW4gUHl0aG9uIG1lbnllZGlha2FuIHBlbmRla2F0YW4geWFuZyBsZWJpaCB1bXVtIG1hbmdlbmFpIHNhaW5zIGRhdGEuIFIgZGFuIFB5dGhvbiBiaXNhIGRpZ3VuYWthbiBvbGVoIHBlbXVsYSB0ZXRhcGkgbWVtYnV0dWhrYW4gd2FrdHUgeWFuZyBiYW55YWssIGRhbiBsYXRpaGFuIHlhbmcgYmFueWFrIHVudHVrIGVtbmd1YXNhaW55YS4NCg0KDQojIyBTaW50YWtzIERhc2FyDQoNCiMjIyBQZW51Z2FzYW4gVmFyaWFiZWwNCmRhbGFtIFIgdGVyZGFwYXQgPSwgLT4gZGFuIDwtLg0KYGBge3J9DQp4ID0gNQ0KeSA8LSA4DQo5IC0+IHoNCnByaW50KGMoeCx5LHopKQ0KYGBgDQoNCiMjIyBNZW5hbWJhaGthbiBLb21lbnRhcg0KdW50dWsgbWVuYW1iYWhrYW4ga29tZW50YXIsIGRlbmdhbiBtZW5nZ3VuYWthbiAjIGRpIGF3YWwgbWF1cHVuIGRpIGFraGlyIHBlcm55YXRhYW4uDQpgYGB7cn0NCnggPSAxNSAgICAgICMgTWVuZ2dhbnRpIG5pbGFpIHggZGlhd2FsIHBlcm55YXRhbiAocGVudWdhc2FuIHZhcmlhYmVsKQ0KeCAtIHkgLT4geiAgIyBNRW5nZ2FudGkgbmlsYWkgeiB5YW5nIHN1ZGFoIGRpcmVrYW0gKHBlbnVnYXNhbiB2YXJpYWJlbCkNCmBgYA0KDQoNCiMjIE9wZXJhdG9yDQpTaW1ib2wgeWFuZyBtZW5nYXJhaGthbiBjb21wbGltZXIgdW50dWsgbWVsYWt1a2FuIGJlcmJhZ2FpIG1hY2FtIG9wZXJhc2kgdGVyaGFkYXAgYmViZXJhcGEgcGVudWdhc2FuLiANCg0KIyMjIEFyaWV0bWF0aWthDQpPcGVyYXNpIG1hdGVtYXRpa2Egc2VwZXJ0aSBwZW5qdW1sYWhhbiAoKyksIHBlbmd1cmFuZ2FuICgtKSwgcGVya2FsaWFuICgqKSwgUGVtYmFnaWFuICgvKSwgcGVtYW5na2F0YW4gKF4pLCBkYW4gbW9kdWxvICglJSkuDQoNCkJlcmlrdXQgaW5pIGFkYWxhaCBjb250b2ggcGVuanVtbGFoYW4gZGkgUg0KYGBge3J9DQpjKDIsNyw5KSAtPiB4ICAgIyB2ZWt0b3IgeA0KYyg1LDcsMSkgLT4geSAgICMgdmVrdG9yIHkNCnggKyB5DQpgYGANCg0KQmVyaWt1dCBpbmkgYWRhbGFoIGNvbnRvaCBwZW5ndXJhbmdhbiBkaSBSDQpgYGB7cn0NCngteQ0KYGBgDQpCZXJpa3V0IGluaSBhZGFsYWggY29udG9oIHBlcmthbGlhbiBkaSBSDQpgYGB7cn0NCngqeQ0KYGBgDQpCZXJpa3V0IGluaSBhZGFsYWggY29udG9oIHBlbWJhZ2lhbiBkaSBSDQpgYGB7cn0NCngveQ0KYGBgDQpgYGB7cn0NCnkveA0KYGBgDQpCZXJpa3V0IGluaSBhZGFsYWggY29udG9oIHBlbWFuZ2thdGFuIGRpIFINCmBgYHtyfQ0KcHJpbnQoeF55KSAgICAgIyB4IHBhbmdrYXQgeQ0KYGBgDQpgYGB7cn0NCnByaW50KHleeCkgICAgICMgeSBwYW5na2F0IHgNCmBgYA0KDQpCZXJpa3V0IGluaSBhZGFsYWggY29udG9oIG1vZHVsbyBkaSBSDQpgYGB7cn0NCnglJXkNCmBgYA0KDQoNCkthZGFuZyBhZGEgcGVybHUgdW50dWsgbWVuYW1waWxrYW4ga2V0ZXJhbmdhbi9rb21lbnRhciB5YW5nIGp1Z2EgbWVsZWthdCBwYWRhIGhhc2lsIHBlcmhpdHVuZ2FuIFIuDQpEYXBhdCBkaWxha3VrYW4gZGVuZ2FuIGNhcmEgOg0KYGBge3J9DQpjYXQoInBlbmp1bWxhaGFuIHZla3RvciB4IGRhbiB5IDoiLCB4K3kgLCAiXG4iKQ0KY2F0KCJwZWd1cmFuZ2FuIHZla3RvciB4IGRhbiB5IDoiLCB4LXkgLCAiXG4iKQ0KY2F0KCJwZXJrYWxpYW4gdmVrdG9yIHggZGFuIHkgOiIsIHgqeSAsICJcbiIpDQpjYXQoInZla3RvciB4IGRpYmFnaSB2ZWt0b3IgeSA6IiwgeC95ICwgIlxuIikNCmNhdCgidmVrdG9yIHggcGFuZ2thdCB2ZWt0b3IgeSA6IiwgeF55ICwgIlxuIikNCmNhdCgibW9kdWxvIHZla3RvciB4IGRhbiB5IDoiLCB4JSV5ICwgIlxuIikNCmBgYA0KDQoNCiMjIyBSZWxhc2lvbmFsDQoNCm9wZXJhc2kgcGVyYmFuZGluZ2FuIGFudGFyYSBlbGVtZW4geWFuZyBiZXJzZXN1YWlhbiBwYWRhIHNldGlhcCBvcGVyYW4uIFBhZGEgUiBuYW50aSBha2FuIG11bmN1bCBUUlVFL0ZBTFNFLg0KDQprdXJhbmcgZGFyaSg8KSwgbGViaWggZGFyaSAoPiksIGxlYmloIGRhcmkgc2FtYSBkZW5nYW4gKD49KSwga3VyYW5nIGRhcmkgc2FtYSBkZW5nYW4oPD0pLCBzYW1hIGRlbmdhbiAoPT0pLCBkYW4gdGlkYWsgc2FtYSBkZW5nYW4gLyghPSkuDQoNCkNvbnRvaA0KYGBge3J9DQp4ID0gYygxLDksNSkgICMgbWVtYnVhdCB2ZWt0b3IgeA0KeSA9IGMoNiwyLDUpICAjIG1lbWJ1YXQgdmVrdG9yIHkNCmNhdCgidmVrdG9yIHgga3VyYW5nIGRhcmkgeSA6IiwgeDx5LCJcbiIpDQpjYXQoInZla3RvciB4IGt1cmFuZyBkYXJpIHNhbWEgZGVuZ2FuIHkgOiIsIHg8PXksIlxuIikNCmNhdCgidmVrdG9yIHggbGViaWggZGFyaSB5IDoiLCB4PnksIlxuIikNCmNhdCgidmVrdG9yIHggbGViaWggZGFyaSBzYW1hIGRlbmdhbiBkYXJpIHkgOiIsIHg+PXksIlxuIikNCmNhdCgidmVrdG9yIHggc2FtYSBkZW5nYW4gZGFyaSB5IDoiLCB4PT15LCJcbiIpDQpjYXQoInZla3RvciB4IHRpZGFrIHNhbWEgZGVuZ2FuIHkgOiIsIHghPXksIlxuIikNCmBgYA0KDQoNCiMjIyBMb2dpa2ENCg0KT3BlcmF0b3IgbG9naWthIG1lbnNpbXVsYXNpa2FuIG9wZXJhc2kga2VwdXR1c2FuIHlhbmcga2VtdWRpYW4gaGFzaWx5YSBkYWxhbSBuaWxhaSBCb2VsYW4gVFJVRS9GQUxTRS4NCg0KbmlsYWkgYmlsYW5nYW4gYnVsYXQgYnVrYW4gbm9sIGRpYW5nZ2FwIHNlYmFnYWkgbmlsYWkgVFJVRSwgYmFpayBpdHUgYmlsYW5nYW4ga29tcGxla3MgYXRhdSBiaWxhbmdhbiByaWwuDQoNCm5vdC9uZWdhc2kgKCEpLCBhbmQva29uanVuZ3NpICgmKSwgb3IvZGlzanVuZ3NpICh8KSwgZGFuIFhPUi9kaXNqdW5nc2kgcGFyc2lhbCAoXikNCg0KYGBge3J9DQp4ID0gYygzLEZBTFNFLDApDQp5ID0gYygyLDMrM2ksMSkNCg0KIyBtZWxha3VrYW4gb3BlcmFzaSBsb2dpa2EgcGFkYSBvcGVyYW4NCmNhdCgibG9naWthIG5lZ2FzaSB1bnR1ayB2ZWt0b3IgeCA6IiwgISB4LCJcbiIpDQpjYXQoImxvZ2lrYSBuZWdhc2kgdW50dWsgdmVrdG9yIHkgOiIsICEgeSwiXG4iKQ0KY2F0KCJsb2dpa2Ega29uanVuZ3NpIDoiLHggJiB5LCJcbiIpDQpjYXQoImxvZ2lrYSBkaXNqdW5nc2kgOiIsIHggfCB5LCJcbiIpDQpjYXQoImxvZ2lrYSBkaXNqdW5nc2kgcGFyc2lhbCA6Iix4b3IoeCx5KSwiXG4iKQ0KDQpgYGANCg0KDQojIyMgTGFpbi1sYWluDQoNCmFkYSBiZWJlcmFwYSBvcGVyYXRvciBsYWluIHNlcGVydGkgYWthcihzcXJ0KSwgbG9nYXJpdG1hKGxvZyksIGRhbiBla3Nwb25lbihleHApLg0KDQpEYWxhbSBSIGp1Z2EgYmVybGFrdSBzaWZhdCBrb211dGF0aXMsIGFzb3NpYXRpZiwgZGFuIGRpc3RyaWJ1dGlmLg0KDQpgYGB7cn0NCg0KIyBtZW1idWF0IHZla3RvciB4IGRhbiB5IHlhbmcgYmFydQ0KYygxLDIsMykgLT4geA0KYyg0LDUsMTIpIC0+IHkNCg0Kc3FydCh4KnkpDQpsb2coeSkNCmV4cCh4KQ0KYGBgDQoNCmBgYHtyfQ0KIyBjb250b2ggYmVybGFrdSBzaWZhdCINCih4K3kpXjIgKyAzKih4LXkpDQpgYGANCg0KDQojIyBUaXBlIERhdGENCg0KZG9idWxlL2Zsb2F0IChkZXNpbWFsIDsgYmlsYW5nYW4ga29tYSksIEludGVnZXIgKGJpbGFuZ2FuIGJ1bGF0KSwgQm9lbGFuL0xvZ2ljYWwgKFRSVUUvRkFMU0UgOyB0cnVlPTEsIGZhbHNlPTApLCBTdHJpbmcvQ2hhcmFjdGVyIChrYXJha3Rlci9rYWxpbWF0IHlhbmcgZGlhcGl0ICcgLyAiKSwgZGFuIENvbXBsZXggKHBhc2FuZ2FuIGFuZ2thIHJpbCBkYW4gaW1hamVuZXIpDQoNCmBgYHtyfQ0KYWxpMSA9IDkuOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBkZXNpbWFsDQphbGkyID0gYXMuaW50ZWdlcig3KSAgICAgICAgICAgICAgICAgICAjIGludGVnZXINCmFsaTIgPSA3TCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgY2FyYSBsYWluIGludGVnZXINCmFsaTMgPSBjKEZBTFNFLFRSVUUpICAgICAgICAgICAgICAgICAgICMgYm9sZWFuL2xvZ2ljYWwNCmFsaTMgPSBhcy5sb2dpY2FsKGMoMCwxKSkgICAgICAgICAgICAgICMgY2FyYSBsYWluIGJvbGVhbi9sb2dpY2FsDQphbGk0ID0gNCArNWkgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGNvbXBsZXgNCmFsaTUgPSBjKCdoYWknLCdoZWxsbycsImFubnllb25nIikgICAgICMgc3RyaW5nL2NoYXJhY3Rlcg0KYGBgDQogDQogVW50dWsgbWVtZXJpa3NhIHRpcGUgZGF0YSBkYWxhbSBSIDoNCiAxLiBjbGFzcyguLikNCiAyLiB0eXBlb2YoLi4pDQpgYGB7cn0NCmNhdCgiY2VrIHRpcGUgZGF0YSBhbGkzIDoiLCBjbGFzcyhhbGkzKSwiXG4iKQ0KY2F0KCJjZWsgdGlwZSBkYXRhIGFsaTUgOiIsIGNsYXNzKGFsaTUpLCJcbiIpDQpgYGANCg0KVW50dWsgYW5na2EgYmlsYW5nYW4gYnVsYXQsIFIgYmlhc2FueWEgbWVtYmFjYSBkYWxhbSB0aXBlIGRhdGEgbnVtYmVyaWMvZG91YmxlIGJ1a2FuIGludGVnZXIuIA0KS29tcHV0ZXIgbWVuZ2FuZ2dhcCBiaWxhbmdhbiBtaXNhbG55YSA3IHRlcmJhY2Egc2ViYWdhaSBiaWxhbmdhbiBkZXNpbWFsIDcuMDAwIC4gSmFkaSBwYXN0aWthbiBkaSBjb2RpbmcgdGlwZSBkYXRhbnlhIGthbGF1IG1hdSBkaXViYWggbWVuamFkaSBpbnRlZ2VyLg0KDQpDb250b2gNCmBgYHtyfQ0KYWxpMTAgPSAzDQp0eXBlb2YoYWxpMTApDQpgYGANCmBgYHtyfQ0KYWxpMTAgPSAzTA0KdHlwZW9mKGFsaTEwKQ0KYGBgDQoNCg0KIyMgQmFudHVhbg0KTWVuY2FyaSBiYW50dWFuIGRpIFIgc2FuZ2F0IHBlbnRpbmcuIFIgbWVtaWxpa2kgZmFzaWxpdGFzIHVudHVrIG1lbWJhbnR1IGtpdGEgZGFsYW0gbWVuZ2VyamFrYW4gY29kaW5nLiBCYW50dWFuIGJpc2EgZGltdW5jdWxrYW4gZGFyaSBjb2RpbmcgYXRhdSBtZW51IGRpIGthbmFuIGJhd2FoIGFkYSB0dWxpc2FuICJoZWxwIi4NCg0KPGltZyBzdHlsZT0iZmxvYXQ6IHJpZ2h0OyBtYXJnaW46IDBweCAxMDBweCAwcHggMHB4OyB3aWR0aDo5MCUiIHNyYz0iZm90bzEuanBnIi8+DQoNCmRlbmdhbiBjb2RpbmcNCmBgYHtyfQ0KaGVscC5zdGFydCgpICAgICAgICAgICAgIyBtZW51IGRpIG1hbmEgQW5kYSBkYXBhdCBtZW5hdmlnYXNpIGJhbnR1YW4gYmVyYmFzaXMgd2ViDQo/aGVscCAgICAgICAgICAgICAgICAgICAjIG1lbnUgZGkgbWFuYSBBbmRhIGRhcGF0IG1lbmF2aWdhc2kgYmFudHVhbiBiZXJiYXNpcyB3ZWINCj9jbGFzcyAgICAgICAgICAgICAgICAgICMgbWVuZGFwYXRrYW4gYmFudHVhbiB1bnR1ayBmdW5nc2kgJ2NsYXNzJw0KaGVscChjbGFzcykgICAgICAgICAgICAgIyBtZW5kYXBhdGthbiBiYW50dWFuIHVudHVrIGZ1bmdzaSAnY2xhc3MnDQo/P2NsYXNzICAgICAgICAgICAgICAgICAjIGppa2EgQW5kYSB0aWRhayB0YWh1IG5hbWEgZnVuZ3NpIHlhbmcgQW5kYSBjYXJpDQpoZWxwLnNlYXJjaCgnY2xhc3MnKSAgICAjIGppa2EgQW5kYSB0aWRhayB0YWh1IG5hbWEgZnVuZ3NpIHlhbmcgQW5kYSBjYXJpDQpgYGANCg0K