

Email : noviaalbl02@gmail.com
RPubs : https://rpubs.com/noviaanita/
Jurusan : Fisika Medis
Address : ARA Center, Matana University Tower
Jl. CBD Barat Kav, RT.1, Curug Sangereng, Kelapa Dua, Tangerang, Banten 15810.
R Vs Python
R dan Python adalah bahasa pemrograman yang sangat populer, dinamis, digunakan secara luas dalam komunitas data science. R lebih banyak digunakan dalam analisis statistik sementara Python menyediakan pendekatan yang lebih umum mengenai sains data (sehingga dianggap lebih mudah untuk digunakan oleh pemula). Mempelajari kedua bahasa pemrograman ini adalah solusi yang lebih bijak karena keduanya mempunyai kelebihan dan kekurangan masing-masing. R dan Python membutuhkan investasi waktu, latihan dengan tutorial, dan melakukan projek-projek kecil berbasis LAB hingga penerapan sains data pada kasus-kasus yang sebenarnya.
Sintaks Dasar
Suatu program di R dan Python yang terdiri dari tiga hal mendasar: Variabel, operan (nilai) dan Komentar. Variabel digunakan untuk menyimpan suatu nilai, sedangkan Komentar digunakan untuk meningkatkan pemahaman pengguna mengenai skrip atau koding.
Penugasan Variabel
Berikut ini adalah contoh penugasan variabel di dalam R
x = 9
y <- 2
4 -> z
print(c(x,y,z))
## [1] 9 2 4
Menambahkan Komentar
Berikut ini adalah contoh menambahkan komentar di dalam R
# mengganti nilai x yang sudah di rekam (komentar diawal pernyataan)
x = 9
y <- 2 + x # mengganti nilai y yang sudah direkam (komentar diakhir pernyataan)
y - x -> z # sama dengan diatas
Operator
Operator adalah simbol yang mengarah compiler untuk melakukan berbagai macam operasi terhadap beberapa penugasan. Operator mensimulasikan berbagai operasi matematis, logika, dan keputusan yang dilakukan pada sekumpulan Bilangan Kompleks, Integer, dan Numerik sebagai penugasan masukan (input). R dan Python mendukung sebagian besar empat jenis operator biner antara satu set penugasan. Dalam ini, kita akan melihat berbagai jenis operator yang tersedia di R dan Python dan penggunaannya.
Aritmatika
Penggunaan operator aritmatika dalam program R dan Python adalah untuk mensimulasikan berbagai operasi matematika, seperti penambahan, pengurangan, pekalian, pembagian, dan modulo. Operator aritmatika yang dilakukan bisa saja berupa nilai skalar, bilangan kompleks, atau vektor.
Penjumlahan
Berikut ini adalah contoh penjumlahan di dalam R
x <- c(3,8,4) # memuat vektor x
y <- c(2,5,7) # memuat vektor y
cat("hasil penjumlahan vektor x dan y :", x + y, "\n")
## hasil penjumlahan vektor x dan y : 5 13 11
Pengurangan
Berikut ini adalah contoh pengurangan di dalam R
x <- c(4,7,2) # memuat vektor x
y <- c(5,6,7) # memuat vektor y
cat("hasil pengurangan vektor x dan y :", x - y, "\n")
## hasil pengurangan vektor x dan y : -1 1 -5
Perkalian
Berikut ini adalah contoh perkalian di dalam R
x <- c(4,6,2) # memuat vektor x
y <- c(5,8,2) # memuat vektor y
cat("hasil perkalian vektor x dan y :", x * y, "\n")
## hasil perkalian vektor x dan y : 20 48 4
Pembagian
Berikut ini adalah contoh pembagian di dalam R
x <- c(3,9,2) # memuat vektor x
y <- c(4,5,3) # memuat vektor y
cat("hasil pembagian vektor x dan y :", x / y, "\n")
## hasil pembagian vektor x dan y : 0.75 1.8 0.6666667
Pemangkatan
Berikut ini adalah contoh pemangkatan di dalam R
x <- c(3,6,7) # memuat vektor x
y <- c(2,4,9) # memuat vektor y
cat("hasil pemangkatan vektor x dan y :", x ^ y, "\n")
## hasil pemangkatan vektor x dan y : 9 1296 40353607
Modulo
Berikut ini adalah contoh modulo di dalam R
x <- c(2,4,3) # memuat vektor x
y <- c(5,4,3) # memuat vektor y
cat("Modulo vektor x dan y :", x %% y, "\n")
## Modulo vektor x dan y : 2 0 0
Relasional
Operator relasional melakukan operasi perbandingan antara elemen yang bersesuaian pada setiap operan. Mengembalikan nilai Boolean TRUE jika operan pertama memenuhi relasi dibandingkan dengan operan kedua. Nilai TRUE selalu dianggap lebih besar dari FALSE.
Kurang dari
Berikut ini adalah contoh relasional kurang dari di dalam R
x <- c(1,5,2) # memuat vektor x
y <- c(1,3,4) # memuat vektor y
cat("vektor x kurang dari vektor y :", x < y, "\n")
## vektor x kurang dari vektor y : FALSE FALSE TRUE
Kurang dari sama dengan
Berikut ini adalah contoh relasional kurang dari sama dengan di dalam R
x <- c(2,5,7) # memuat vektor x
y <- c(1,3,4) # memuat vektor y
cat("vektor x kurang dari sama dengan vektor y :", x <= y, "\n")
## vektor x kurang dari sama dengan vektor y : FALSE FALSE FALSE
Lebih besar dari
Berikut ini adalah contoh relasional lebih dari di dalam R
x <- c(1,6,15) # memuat vektor x
y <- c(3,9,11) # memuat vektor y
cat("vektor x lebih besar dari vektor y :", x > y, "\n")
## vektor x lebih besar dari vektor y : FALSE FALSE TRUE
Lebih besar dari sama dengan
Berikut ini adalah contoh relasional lebih besar dari sama dengan di dalam R
x <- c(2,6,7) # memuat vektor x
y <- c(1,9,5) # memuat vektor y
cat("vektor x lebih besar dari sama dengan vektor y :", x >= y, "\n")
## vektor x lebih besar dari sama dengan vektor y : TRUE FALSE TRUE
Sama dengan
Berikut ini adalah contoh relasional sama dengan di dalam R
x <- c(1,2,3) # memuat vektor x
y <- c(9,8,7) # memuat vektor y
cat("vektor x sama dengan vektor y :", x == y, "\n")
## vektor x sama dengan vektor y : FALSE FALSE FALSE
Tidak sama dengan
Berikut ini adalah contoh relasional tidak sama dengan di dalam R
x <- c(2,5,3) # memuat vektor x
y <- c(1,6,4) # memuat vektor y
cat("vektor x tidak sama dengan vektor y :", x != y, "\n")
## vektor x tidak sama dengan vektor y : TRUE TRUE TRUE
Logika
Operator logis mensimulasikan operasi keutusan, 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.
Operasi Negasi (NOT)
Berikut ini adalah contoh dari operasi negasi (NOT) di dalam R
x <- c(1.2,TRUE,3)
y <- c(TRUE,FALSE,2+5i)
cat("Logika negasi (~) untuk vektor x :", !x, "\n")
## Logika negasi (~) untuk vektor x : FALSE FALSE FALSE
cat("Logika negasi (NOT) untuk vektor y :", !y, "\n")
## Logika negasi (NOT) untuk vektor y : FALSE TRUE FALSE
Logika konjungsi (AND)
Berikut ini adalah contoh dari logika konjungsi (AND) di dalam R
x <- c(0.3,TRUE,2)
y <- c(TRUE,FALSE,0)
cat("Logika konjungsi (AND) :", x & y, "\n")
## Logika konjungsi (AND) : TRUE FALSE FALSE
Logika Disjungsi (OR)
Berikut ini adalah contoh dari logika disjungsi (OR) di dalam R
x <- c(0.1,TRUE,2)
y <- c(TRUE,1,0)
cat("Logika disjungsi (OR) :", x | y, "\n")
## Logika disjungsi (OR) : TRUE TRUE TRUE
Logika Disjungsi Parsial
Berikut ini adalah contoh dari logika disjungsi parsial di dalam R
x <- c(TRUE,TRUE,FALSE)
y <- c(FALSE,TRUE,FALSE)
cat("Logika disjungsi parsial :", x || y, "\n")
## Logika disjungsi parsial : TRUE
Lain-lain
Berikut ini merupakan beberapa operator yang mungkin akan anda perlukan saat menggunakan R
Akar
Berikut ini adalah contoh bentuk akar di dalam R
x <- c(6,3,2) # memuat vektor x
y <- c(4,2,5) # memuat vektor y
sqrt(x*y) # bentuk akar
## [1] 4.898979 2.449490 3.162278
Logaritma
Berikut ini adalah contoh logaritma di dalam R
x <- c(3,4,2) # memuat vektor x
y <- c(2,5,6) # memuat vektor y
log(x) # logaritma x
## [1] 1.0986123 1.3862944 0.6931472
## [1] 0.6931472 1.6094379 1.7917595
Eksponen
Berikut ini adalah contoh eksponen di dalam R
x <- c(7,4,2) # memuat vektor x
y <- c(1,5,3) # memuat vektor y
exp(x) # bentuk eksponen x
## [1] 1096.633158 54.598150 7.389056
exp(y) # bentuk eksponen y
## [1] 2.718282 148.413159 20.085537
Tanda kurung
Berikut ini adalah contoh penggunaan tanda kurung di dalam R
x <- c(3,4,2) # memuat vektor x
y <- c(4,7,1) # memuat vektor y
(x+y) * x # penggunaan tanda kurung
## [1] 21 44 6
Tipe data
Tipe data merupakan konsep penting dalam suatu pemrograman. Berikut ini adalah koding R yang dapat digunakan untuk menetapkan tipe data:
d1 = 2.1 # memuat nilai desimal
d2 = as.integer(4) # memuat nilai integer
d2 = 8L # cara lain untuk memuat nilai integer
d3 = c(TRUE,FALSE) # Bolean/Logical
d3 = as.logical(c(1,8)) # cara lain untuk memuat Bolean/Logical
d4 = c("a",'b','123') # String/Character
d5 = 1 + 5i # Complex
Untuk memeriksa tipe data dalam R:
class(d2) # cetak nama kelas variabel
## [1] "integer"
typeof(d5) # cetak tipe variabel x
## [1] "complex"
Bantuan
Salah satu bagian penting dalam bekerja dengan bahasa R adalah mengetahui di mana mencari bantuan. R memiliki beberapa fasiitas in-line, selain berbagai sumber daya bantuan di R. Anda dapat menggunakan bantuan untuk fungsi tertentu.
help.start() # menu bantuan lokal berbasis web
?help # menu bantuan lokal berbasis web
?class # bantuan untuk fungsi 'class'
help(class) # bantuan untuk fungsi 'class'
??class # jika tidak tahu nama fungsi yang dicari
help.search('class') # jika tidak tahu nama fungsi yang dicari
LS0tDQp0aXRsZTogIkFsZ29yaXRtYSAmIFN0cnVrdHVyIERhdGEiDQpzdWJ0aXRsZTogIlR1Z2FzIDIiDQphdXRob3I6ICJOb3ZpYSBBbml0YSAoMjAyMTQ1MjAwMDgpIg0KZGF0ZTogImByIGZvcm1hdChTeXMuRGF0ZSgpLCAnJUIgJWQsICVZJylgIg0Kb3V0cHV0OiANCiAgaHRtbF9kb2N1bWVudDogDQogICAgaHRtbF9kb2N1bWVudDogbnVsbA0KICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KICAgIHRvYzogeWVzDQogICAgdG9jX2Zsb2F0Og0KICAgICAgY29sbGFwc2VkOiB5ZXMNCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KICAgIGNvZGVfZG93bmxvYWQ6IHllcw0KICAgIHRoZW1lOiBzYW5kc3RvbmUNCiAgICBjc3M6IHN0eWxlMS5jc3MNCiAgICBoaWdobGlnaHQ6IG1vbm9jaHJvbWUNCi0tLQ0KDQoNCjxpbWcgc3R5bGU9ImZsb2F0OiByaWdodDsgbWFyZ2luOiAwcHggMTAwcHggMHB4IDBweDsgd2lkdGg6MjUlIiBzcmM9Im5vdmlhLkpQRyIvPiANCg0KYGBge3IgbG9nbywgZWNobz1GQUxTRSxmaWcuYWxpZ249J2NlbnRlcicsIG91dC53aWR0aCA9ICczMCUnfQ0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoImxvZ29tYXRhbmEucG5nIikNCmBgYA0KDQpFbWFpbCAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsmbmJzcDs6ICBub3ZpYWFsYmwwMkBnbWFpbC5jb20gPGJyPg0KUlB1YnMgICZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOzogaHR0cHM6Ly9ycHVicy5jb20vbm92aWFhbml0YS8gPGJyPg0KSnVydXNhbiAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7OiBbRmlzaWthIE1lZGlzXShodHRwczovL21hdGFuYXVuaXZlcnNpdHkuYWMuaWQvP2x5PWFjYWRlbWljJmM9c2IpIDxicj4NCkFkZHJlc3MgICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyA6IEFSQSBDZW50ZXIsIE1hdGFuYSBVbml2ZXJzaXR5IFRvd2VyIDxicj4NCiZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7Jm5ic3A7IEpsLiBDQkQgQmFyYXQgS2F2LCBSVC4xLCBDdXJ1ZyBTYW5nZXJlbmcsIEtlbGFwYSBEdWEsIFRhbmdlcmFuZywgQmFudGVuIDE1ODEwLg0KDQoqKioqDQoNCiMgUiBWcyBQeXRob24NCg0KUiBkYW4gUHl0aG9uIGFkYWxhaCBiYWhhc2EgcGVtcm9ncmFtYW4geWFuZyBzYW5nYXQgcG9wdWxlciwgZGluYW1pcywgZGlndW5ha2FuIHNlY2FyYSBsdWFzIGRhbGFtIGtvbXVuaXRhcyBkYXRhIHNjaWVuY2UuIFIgbGViaWggYmFueWFrIGRpZ3VuYWthbiBkYWxhbSBhbmFsaXNpcyBzdGF0aXN0aWsgc2VtZW50YXJhIFB5dGhvbiBtZW55ZWRpYWthbiBwZW5kZWthdGFuIHlhbmcgbGViaWggdW11bSBtZW5nZW5haSBzYWlucyBkYXRhIChzZWhpbmdnYSBkaWFuZ2dhcCBsZWJpaCBtdWRhaCB1bnR1ayBkaWd1bmFrYW4gb2xlaCBwZW11bGEpLiBNZW1wZWxhamFyaSBrZWR1YSBiYWhhc2EgcGVtcm9ncmFtYW4gaW5pIGFkYWxhaCBzb2x1c2kgeWFuZyBsZWJpaCBiaWphayBrYXJlbmEga2VkdWFueWEgbWVtcHVueWFpIGtlbGViaWhhbiBkYW4ga2VrdXJhbmdhbiBtYXNpbmctbWFzaW5nLiBSIGRhbiBQeXRob24gbWVtYnV0dWhrYW4gaW52ZXN0YXNpIHdha3R1LCBsYXRpaGFuIGRlbmdhbiB0dXRvcmlhbCwgZGFuIG1lbGFrdWthbiBwcm9qZWstcHJvamVrIGtlY2lsIGJlcmJhc2lzIExBQiBoaW5nZ2EgcGVuZXJhcGFuIHNhaW5zIGRhdGEgcGFkYSBrYXN1cy1rYXN1cyB5YW5nIHNlYmVuYXJueWEuDQoNCiMgU2ludGFrcyBEYXNhcg0KDQpTdWF0dSBwcm9ncmFtIGRpIFIgZGFuIFB5dGhvbiB5YW5nIHRlcmRpcmkgZGFyaSB0aWdhIGhhbCBtZW5kYXNhcjogVmFyaWFiZWwsIG9wZXJhbiAobmlsYWkpIGRhbiBLb21lbnRhci4gVmFyaWFiZWwgZGlndW5ha2FuIHVudHVrIG1lbnlpbXBhbiBzdWF0dSBuaWxhaSwgc2VkYW5na2FuIEtvbWVudGFyIGRpZ3VuYWthbiB1bnR1ayBtZW5pbmdrYXRrYW4gcGVtYWhhbWFuIHBlbmdndW5hIG1lbmdlbmFpIHNrcmlwIGF0YXUga29kaW5nLg0KDQoNCg0KIyMgUGVudWdhc2FuIFZhcmlhYmVsDQoNCkJlcmlrdXQgaW5pIGFkYWxhaCBjb250b2ggcGVudWdhc2FuIHZhcmlhYmVsIGRpIGRhbGFtIFINCmBgYHtyfQ0KeCA9IDkNCnkgPC0gMg0KNCAtPiB6DQpwcmludChjKHgseSx6KSkNCmBgYA0KDQoNCiMjIE1lbmFtYmFoa2FuIEtvbWVudGFyDQoNCkJlcmlrdXQgaW5pIGFkYWxhaCBjb250b2ggbWVuYW1iYWhrYW4ga29tZW50YXIgZGkgZGFsYW0gUg0KYGBge3J9DQojIG1lbmdnYW50aSBuaWxhaSB4IHlhbmcgc3VkYWggZGkgcmVrYW0gKGtvbWVudGFyIGRpYXdhbCBwZXJueWF0YWFuKQ0KeCA9IDkgICAgICAgICANCnkgPC0gMiArIHggICAgICMgbWVuZ2dhbnRpIG5pbGFpIHkgeWFuZyBzdWRhaCBkaXJla2FtIChrb21lbnRhciBkaWFraGlyIHBlcm55YXRhYW4pDQp5IC0geCAtPiB6ICAgICAjIHNhbWEgZGVuZ2FuIGRpYXRhcw0KYGBgDQoNCg0KDQojIE9wZXJhdG9yDQoNCk9wZXJhdG9yIGFkYWxhaCBzaW1ib2wgeWFuZyBtZW5nYXJhaCBjb21waWxlciB1bnR1ayBtZWxha3VrYW4gYmVyYmFnYWkgbWFjYW0gb3BlcmFzaSB0ZXJoYWRhcCBiZWJlcmFwYSBwZW51Z2FzYW4uIE9wZXJhdG9yIG1lbnNpbXVsYXNpa2FuIGJlcmJhZ2FpIG9wZXJhc2kgbWF0ZW1hdGlzLCBsb2dpa2EsIGRhbiBrZXB1dHVzYW4geWFuZyBkaWxha3VrYW4gcGFkYSBzZWt1bXB1bGFuIEJpbGFuZ2FuIEtvbXBsZWtzLCBJbnRlZ2VyLCBkYW4gTnVtZXJpayBzZWJhZ2FpIHBlbnVnYXNhbiBtYXN1a2FuIChpbnB1dCkuIFIgZGFuIFB5dGhvbiBtZW5kdWt1bmcgc2ViYWdpYW4gYmVzYXIgZW1wYXQgamVuaXMgb3BlcmF0b3IgYmluZXIgYW50YXJhIHNhdHUgc2V0IHBlbnVnYXNhbi4gRGFsYW0gaW5pLCBraXRhIGFrYW4gbWVsaWhhdCBiZXJiYWdhaSBqZW5pcyBvcGVyYXRvciB5YW5nIHRlcnNlZGlhIGRpIFIgZGFuIFB5dGhvbiBkYW4gcGVuZ2d1bmFhbm55YS4NCg0KDQojIyBBcml0bWF0aWthDQoNClBlbmdndW5hYW4gb3BlcmF0b3IgYXJpdG1hdGlrYSBkYWxhbSBwcm9ncmFtIFIgZGFuIFB5dGhvbiBhZGFsYWggdW50dWsgbWVuc2ltdWxhc2lrYW4gYmVyYmFnYWkgb3BlcmFzaSBtYXRlbWF0aWthLCBzZXBlcnRpIHBlbmFtYmFoYW4sIHBlbmd1cmFuZ2FuLCBwZWthbGlhbiwgcGVtYmFnaWFuLCBkYW4gbW9kdWxvLiBPcGVyYXRvciBhcml0bWF0aWthIHlhbmcgZGlsYWt1a2FuIGJpc2Egc2FqYSBiZXJ1cGEgbmlsYWkgc2thbGFyLCBiaWxhbmdhbiBrb21wbGVrcywgYXRhdSB2ZWt0b3IuDQoNCg0KIyMjIFBlbmp1bWxhaGFuDQpCZXJpa3V0IGluaSBhZGFsYWggY29udG9oIHBlbmp1bWxhaGFuIGRpIGRhbGFtIFINCmBgYHtyfQ0KeCA8LSBjKDMsOCw0KSAgICAgICAgICAgIyBtZW11YXQgdmVrdG9yIHgNCnkgPC0gYygyLDUsNykgICAgICAgICAgICMgbWVtdWF0IHZla3RvciB5DQpjYXQoImhhc2lsIHBlbmp1bWxhaGFuIHZla3RvciB4IGRhbiB5IDoiLCB4ICsgeSwgIlxuIikNCmBgYA0KDQojIyMgUGVuZ3VyYW5nYW4NCkJlcmlrdXQgaW5pIGFkYWxhaCBjb250b2ggcGVuZ3VyYW5nYW4gZGkgZGFsYW0gUg0KYGBge3J9DQp4IDwtIGMoNCw3LDIpICAgICAgICAgICAjIG1lbXVhdCB2ZWt0b3IgeA0KeSA8LSBjKDUsNiw3KSAgICAgICAgICAgIyBtZW11YXQgdmVrdG9yIHkNCmNhdCgiaGFzaWwgcGVuZ3VyYW5nYW4gdmVrdG9yIHggZGFuIHkgOiIsIHggLSB5LCAiXG4iKQ0KYGBgDQoNCiMjIyBQZXJrYWxpYW4NCkJlcmlrdXQgaW5pIGFkYWxhaCBjb250b2ggcGVya2FsaWFuIGRpIGRhbGFtIFINCmBgYHtyfQ0KeCA8LSBjKDQsNiwyKSAgICAgICAgICAgIyBtZW11YXQgdmVrdG9yIHgNCnkgPC0gYyg1LDgsMikgICAgICAgICAgICMgbWVtdWF0IHZla3RvciB5DQpjYXQoImhhc2lsIHBlcmthbGlhbiB2ZWt0b3IgeCBkYW4geSA6IiwgeCAqIHksICJcbiIpDQpgYGANCg0KIyMjIFBlbWJhZ2lhbg0KQmVyaWt1dCBpbmkgYWRhbGFoIGNvbnRvaCBwZW1iYWdpYW4gZGkgZGFsYW0gUg0KYGBge3J9DQp4IDwtIGMoMyw5LDIpICAgICAgICAgICAjIG1lbXVhdCB2ZWt0b3IgeA0KeSA8LSBjKDQsNSwzKSAgICAgICAgICAgIyBtZW11YXQgdmVrdG9yIHkNCmNhdCgiaGFzaWwgcGVtYmFnaWFuIHZla3RvciB4IGRhbiB5IDoiLCB4IC8geSwgIlxuIikNCmBgYA0KDQojIyMgUGVtYW5na2F0YW4NCkJlcmlrdXQgaW5pIGFkYWxhaCBjb250b2ggcGVtYW5na2F0YW4gZGkgZGFsYW0gUg0KYGBge3J9DQp4IDwtIGMoMyw2LDcpICAgICAgICAgICAjIG1lbXVhdCB2ZWt0b3IgeA0KeSA8LSBjKDIsNCw5KSAgICAgICAgICAgIyBtZW11YXQgdmVrdG9yIHkNCmNhdCgiaGFzaWwgcGVtYW5na2F0YW4gdmVrdG9yIHggZGFuIHkgOiIsIHggXiB5LCAiXG4iKQ0KYGBgDQoNCiMjIyBNb2R1bG8NCkJlcmlrdXQgaW5pIGFkYWxhaCBjb250b2ggbW9kdWxvIGRpIGRhbGFtIFINCmBgYHtyfQ0KeCA8LSBjKDIsNCwzKSAgICAgICAgICAgIyBtZW11YXQgdmVrdG9yIHgNCnkgPC0gYyg1LDQsMykgICAgICAgICAgICMgbWVtdWF0IHZla3RvciB5DQpjYXQoIk1vZHVsbyB2ZWt0b3IgeCBkYW4geSA6IiwgeCAlJSB5LCAiXG4iKQ0KYGBgDQoNCg0KIyMgUmVsYXNpb25hbA0KDQpPcGVyYXRvciByZWxhc2lvbmFsIG1lbGFrdWthbiBvcGVyYXNpIHBlcmJhbmRpbmdhbiBhbnRhcmEgZWxlbWVuIHlhbmcgYmVyc2VzdWFpYW4gcGFkYSBzZXRpYXAgb3BlcmFuLiBNZW5nZW1iYWxpa2FuIG5pbGFpIEJvb2xlYW4gVFJVRSBqaWthIG9wZXJhbiBwZXJ0YW1hIG1lbWVudWhpIHJlbGFzaSBkaWJhbmRpbmdrYW4gZGVuZ2FuIG9wZXJhbiBrZWR1YS4gTmlsYWkgVFJVRSBzZWxhbHUgZGlhbmdnYXAgbGViaWggYmVzYXIgZGFyaSBGQUxTRS4NCg0KDQojIyMgS3VyYW5nIGRhcmkNCkJlcmlrdXQgaW5pIGFkYWxhaCBjb250b2ggcmVsYXNpb25hbCBrdXJhbmcgZGFyaSBkaSBkYWxhbSBSDQpgYGB7cn0NCnggPC0gYygxLDUsMikgICAgICAgICAgICMgbWVtdWF0IHZla3RvciB4DQp5IDwtIGMoMSwzLDQpICAgICAgICAgICAjIG1lbXVhdCB2ZWt0b3IgeQ0KY2F0KCJ2ZWt0b3IgeCBrdXJhbmcgZGFyaSB2ZWt0b3IgeSA6IiwgeCA8IHksICJcbiIpDQpgYGANCg0KIyMjIEt1cmFuZyBkYXJpIHNhbWEgZGVuZ2FuDQpCZXJpa3V0IGluaSBhZGFsYWggY29udG9oIHJlbGFzaW9uYWwga3VyYW5nIGRhcmkgc2FtYSBkZW5nYW4gZGkgZGFsYW0gUg0KYGBge3J9DQp4IDwtIGMoMiw1LDcpICAgICAgICAgICAjIG1lbXVhdCB2ZWt0b3IgeA0KeSA8LSBjKDEsMyw0KSAgICAgICAgICAgIyBtZW11YXQgdmVrdG9yIHkNCmNhdCgidmVrdG9yIHgga3VyYW5nIGRhcmkgc2FtYSBkZW5nYW4gdmVrdG9yIHkgOiIsIHggPD0geSwgIlxuIikNCmBgYA0KDQojIyMgTGViaWggYmVzYXIgZGFyaQ0KQmVyaWt1dCBpbmkgYWRhbGFoIGNvbnRvaCByZWxhc2lvbmFsIGxlYmloIGRhcmkgZGkgZGFsYW0gUg0KYGBge3J9DQp4IDwtIGMoMSw2LDE1KSAgICAgICAgICAjIG1lbXVhdCB2ZWt0b3IgeA0KeSA8LSBjKDMsOSwxMSkgICAgICAgICAgIyBtZW11YXQgdmVrdG9yIHkNCmNhdCgidmVrdG9yIHggbGViaWggYmVzYXIgZGFyaSB2ZWt0b3IgeSA6IiwgeCA+IHksICJcbiIpDQpgYGANCg0KIyMjIExlYmloIGJlc2FyIGRhcmkgc2FtYSBkZW5nYW4NCkJlcmlrdXQgaW5pIGFkYWxhaCBjb250b2ggcmVsYXNpb25hbCBsZWJpaCBiZXNhciBkYXJpIHNhbWEgZGVuZ2FuIGRpIGRhbGFtIFINCmBgYHtyfQ0KeCA8LSBjKDIsNiw3KSAgICAgICAgICAgIyBtZW11YXQgdmVrdG9yIHgNCnkgPC0gYygxLDksNSkgICAgICAgICAgICMgbWVtdWF0IHZla3RvciB5DQpjYXQoInZla3RvciB4IGxlYmloIGJlc2FyIGRhcmkgc2FtYSBkZW5nYW4gdmVrdG9yIHkgOiIsIHggPj0geSwgIlxuIikNCmBgYA0KDQojIyMgU2FtYSBkZW5nYW4NCkJlcmlrdXQgaW5pIGFkYWxhaCBjb250b2ggcmVsYXNpb25hbCBzYW1hIGRlbmdhbiBkaSBkYWxhbSBSDQpgYGB7cn0NCnggPC0gYygxLDIsMykgICAgICAgICAgICMgbWVtdWF0IHZla3RvciB4DQp5IDwtIGMoOSw4LDcpICAgICAgICAgICAjIG1lbXVhdCB2ZWt0b3IgeQ0KY2F0KCJ2ZWt0b3IgeCBzYW1hIGRlbmdhbiB2ZWt0b3IgeSA6IiwgeCA9PSB5LCAiXG4iKQ0KYGBgDQoNCiMjIyBUaWRhayBzYW1hIGRlbmdhbg0KQmVyaWt1dCBpbmkgYWRhbGFoIGNvbnRvaCByZWxhc2lvbmFsIHRpZGFrIHNhbWEgZGVuZ2FuIGRpIGRhbGFtIFINCmBgYHtyfQ0KeCA8LSBjKDIsNSwzKSAgICAgICAgICAgIyBtZW11YXQgdmVrdG9yIHgNCnkgPC0gYygxLDYsNCkgICAgICAgICAgICMgbWVtdWF0IHZla3RvciB5DQpjYXQoInZla3RvciB4IHRpZGFrIHNhbWEgZGVuZ2FuIHZla3RvciB5IDoiLCB4ICE9IHksICJcbiIpDQpgYGANCg0KDQojIyBMb2dpa2ENCg0KT3BlcmF0b3IgbG9naXMgbWVuc2ltdWxhc2lrYW4gb3BlcmFzaSBrZXV0dXNhbiwgYmVyZGFzYXJrYW4gb3BlcmF0b3IgeWFuZyBkaXRlbnR1a2FuIGFudGFyYSBvcGVyYW4sIHlhbmcga2VtdWRpYW4gZGlldmFsdWFzaSBrZSBuaWxhaSBCb29sZWFuIEJlbmFyIGF0YXUgU2FsYWguIE5pbGFpIGJpbGFuZ2FuIGJ1bGF0IGJ1a2FuIG5vbCBkaWFuZ2dhcCBzZWJhZ2FpIG5pbGFpIEJFTkFSLCBiYWlrIGl0dSBiaWxhbmdhbiBrb21wbGVrcyBhdGF1IGJpbGFuZ2FuIHJlYWwuDQoNCiMjIyBPcGVyYXNpIE5lZ2FzaSAoTk9UKQ0KQmVyaWt1dCBpbmkgYWRhbGFoIGNvbnRvaCBkYXJpIG9wZXJhc2kgbmVnYXNpIChOT1QpIGRpIGRhbGFtIFINCmBgYHtyfQ0KeCA8LSBjKDEuMixUUlVFLDMpDQp5IDwtIGMoVFJVRSxGQUxTRSwyKzVpKQ0KY2F0KCJMb2dpa2EgbmVnYXNpICh+KSB1bnR1ayB2ZWt0b3IgeCA6IiwgIXgsICJcbiIpDQpgYGANCmBgYHtyfQ0KY2F0KCJMb2dpa2EgbmVnYXNpIChOT1QpIHVudHVrIHZla3RvciB5IDoiLCAheSwgIlxuIikNCmBgYA0KDQojIyMgTG9naWthIGtvbmp1bmdzaSAoQU5EKQ0KQmVyaWt1dCBpbmkgYWRhbGFoIGNvbnRvaCBkYXJpIGxvZ2lrYSBrb25qdW5nc2kgKEFORCkgZGkgZGFsYW0gUg0KYGBge3J9DQp4IDwtIGMoMC4zLFRSVUUsMikNCnkgPC0gYyhUUlVFLEZBTFNFLDApDQpjYXQoIkxvZ2lrYSBrb25qdW5nc2kgKEFORCkgOiIsIHggJiB5LCAiXG4iKQ0KYGBgDQoNCiMjIyBMb2dpa2EgRGlzanVuZ3NpIChPUikNCkJlcmlrdXQgaW5pIGFkYWxhaCBjb250b2ggZGFyaSBsb2dpa2EgZGlzanVuZ3NpIChPUikgZGkgZGFsYW0gUg0KYGBge3J9DQp4IDwtIGMoMC4xLFRSVUUsMikNCnkgPC0gYyhUUlVFLDEsMCkNCmNhdCgiTG9naWthIGRpc2p1bmdzaSAoT1IpIDoiLCB4IHwgeSwgIlxuIikNCmBgYA0KDQojIyMgTG9naWthIERpc2p1bmdzaSBQYXJzaWFsIA0KQmVyaWt1dCBpbmkgYWRhbGFoIGNvbnRvaCBkYXJpIGxvZ2lrYSBkaXNqdW5nc2kgcGFyc2lhbCBkaSBkYWxhbSBSDQpgYGB7cn0NCnggPC0gYyhUUlVFLFRSVUUsRkFMU0UpDQp5IDwtIGMoRkFMU0UsVFJVRSxGQUxTRSkNCmNhdCgiTG9naWthIGRpc2p1bmdzaSBwYXJzaWFsIDoiLCB4IHx8IHksICJcbiIpDQpgYGANCg0KIyMgTGFpbi1sYWluDQpCZXJpa3V0IGluaSBtZXJ1cGFrYW4gYmViZXJhcGEgb3BlcmF0b3IgeWFuZyBtdW5na2luIGFrYW4gYW5kYSBwZXJsdWthbiBzYWF0IG1lbmdndW5ha2FuIFINCg0KIyMjIEFrYXINCkJlcmlrdXQgaW5pIGFkYWxhaCBjb250b2ggYmVudHVrIGFrYXIgZGkgZGFsYW0gUg0KYGBge3J9DQp4IDwtIGMoNiwzLDIpICAgICAgICAgICAjIG1lbXVhdCB2ZWt0b3IgeA0KeSA8LSBjKDQsMiw1KSAgICAgICAgICAgIyBtZW11YXQgdmVrdG9yIHkNCnNxcnQoeCp5KSAgICAgICAgICAgICAgICMgYmVudHVrIGFrYXINCmBgYA0KDQojIyMgTG9nYXJpdG1hDQpCZXJpa3V0IGluaSBhZGFsYWggY29udG9oIGxvZ2FyaXRtYSBkaSBkYWxhbSBSDQpgYGB7cn0NCnggPC0gYygzLDQsMikgICAgICAgICAgICMgbWVtdWF0IHZla3RvciB4DQp5IDwtIGMoMiw1LDYpICAgICAgICAgICAjIG1lbXVhdCB2ZWt0b3IgeQ0KbG9nKHgpICAgICAgICAgICAgICAgICAgIyBsb2dhcml0bWEgeA0KbG9nKHkpICAgICAgICAgICAgICAgICAgIyBsb2dhcml0bWEgeQ0KYGBgDQoNCiMjIyBFa3Nwb25lbg0KQmVyaWt1dCBpbmkgYWRhbGFoIGNvbnRvaCBla3Nwb25lbiBkaSBkYWxhbSBSDQpgYGB7cn0NCnggPC0gYyg3LDQsMikgICAgICAgICAgICMgbWVtdWF0IHZla3RvciB4DQp5IDwtIGMoMSw1LDMpICAgICAgICAgICAjIG1lbXVhdCB2ZWt0b3IgeQ0KZXhwKHgpICAgICAgICAgICAgICAgICAgIyBiZW50dWsgZWtzcG9uZW4geA0KZXhwKHkpICAgICAgICAgICAgICAgICAgIyBiZW50dWsgZWtzcG9uZW4geQ0KYGBgDQoNCiMjIyBUYW5kYSBrdXJ1bmcNCkJlcmlrdXQgaW5pIGFkYWxhaCBjb250b2ggcGVuZ2d1bmFhbiB0YW5kYSBrdXJ1bmcgZGkgZGFsYW0gUg0KYGBge3J9DQp4IDwtIGMoMyw0LDIpICAgICAgICAgICAjIG1lbXVhdCB2ZWt0b3IgeA0KeSA8LSBjKDQsNywxKSAgICAgICAgICAgIyBtZW11YXQgdmVrdG9yIHkNCih4K3kpICogeCAgICAgICAgICAgICAgICMgcGVuZ2d1bmFhbiB0YW5kYSBrdXJ1bmcNCmBgYA0KDQojIFRpcGUgZGF0YQ0KDQpUaXBlIGRhdGEgbWVydXBha2FuIGtvbnNlcCBwZW50aW5nIGRhbGFtIHN1YXR1IHBlbXJvZ3JhbWFuLiBCZXJpa3V0IGluaSBhZGFsYWgga29kaW5nIFIgeWFuZyBkYXBhdCBkaWd1bmFrYW4gdW50dWsgbWVuZXRhcGthbiB0aXBlIGRhdGE6DQoNCmBgYHtyfQ0KZDEgPSAyLjEgICAgICAgICAgICAgICAgIyBtZW11YXQgbmlsYWkgZGVzaW1hbA0KZDIgPSBhcy5pbnRlZ2VyKDQpICAgICAgIyBtZW11YXQgbmlsYWkgaW50ZWdlcg0KZDIgPSA4TCAgICAgICAgICAgICAgICAgIyBjYXJhIGxhaW4gdW50dWsgbWVtdWF0IG5pbGFpIGludGVnZXINCmQzID0gYyhUUlVFLEZBTFNFKSAgICAgICMgQm9sZWFuL0xvZ2ljYWwgDQpkMyA9IGFzLmxvZ2ljYWwoYygxLDgpKSAjIGNhcmEgbGFpbiB1bnR1ayBtZW11YXQgQm9sZWFuL0xvZ2ljYWwNCmQ0ID0gYygiYSIsJ2InLCcxMjMnKSAgICMgU3RyaW5nL0NoYXJhY3Rlcg0KZDUgPSAxICsgNWkgICAgICAgICAgICAgIyBDb21wbGV4DQpgYGANCg0KVW50dWsgbWVtZXJpa3NhIHRpcGUgZGF0YSBkYWxhbSBSOg0KYGBge3J9DQpjbGFzcyhkMikgICAgICAgICAgICAgICAjIGNldGFrIG5hbWEga2VsYXMgdmFyaWFiZWwNCnR5cGVvZihkNSkgICAgICAgICAgICAgICMgY2V0YWsgdGlwZSB2YXJpYWJlbCB4DQpgYGANCg0KIyBCYW50dWFuDQoNClNhbGFoIHNhdHUgYmFnaWFuIHBlbnRpbmcgZGFsYW0gYmVrZXJqYSBkZW5nYW4gYmFoYXNhIFIgYWRhbGFoIG1lbmdldGFodWkgZGkgbWFuYSBtZW5jYXJpIGJhbnR1YW4uIFIgbWVtaWxpa2kgYmViZXJhcGEgZmFzaWl0YXMgaW4tbGluZSwgc2VsYWluIGJlcmJhZ2FpIHN1bWJlciBkYXlhIGJhbnR1YW4gZGkgUi4gQW5kYSBkYXBhdCBtZW5nZ3VuYWthbiBiYW50dWFuIHVudHVrIGZ1bmdzaSB0ZXJ0ZW50dS4NCg0KYGBge3J9Iw0KaGVscC5zdGFydCgpICAgICAgICAgICAgIyBtZW51IGJhbnR1YW4gbG9rYWwgYmVyYmFzaXMgd2ViDQo/aGVscCAgICAgICAgICAgICAgICAgICAjIG1lbnUgYmFudHVhbiBsb2thbCBiZXJiYXNpcyB3ZWINCj9jbGFzcyAgICAgICAgICAgICAgICAgICMgYmFudHVhbiB1bnR1ayBmdW5nc2kgJ2NsYXNzJw0KaGVscChjbGFzcykgICAgICAgICAgICAgIyBiYW50dWFuIHVudHVrIGZ1bmdzaSAnY2xhc3MnDQo/P2NsYXNzICAgICAgICAgICAgICAgICAjIGppa2EgdGlkYWsgdGFodSBuYW1hIGZ1bmdzaSB5YW5nIGRpY2FyaQ0KaGVscC5zZWFyY2goJ2NsYXNzJykgICAgIyBqaWthIHRpZGFrIHRhaHUgbmFtYSBmdW5nc2kgeWFuZyBkaWNhcmkNCmBgYA0KDQo=