

Email : yosia.yosia@student.matanauniversity.ac.id
RPubs : https://rpubs.com/yosia
Jurusan : Statistika
Instagram : yyosia
Contact : 085779286780
Address : ARA Center, Matana University Tower
Jl. CBD Barat Kav, RT.1, Curug Sangereng, Kelapa Dua, Tangerang, Banten 15810.
Sintaks Dasar
Penugasan Variabel
Penugasan program dalam R menggunakan suatu variabel yang dicadangkan sehingga dapat merekam jenis data sesuai dengan nama yang diberikan dan disimpan pada lokasi penyimpanan/memori. Dengan cara menotasikannya adalah :
- ==, digunakan untuk penugasan sederhana
- <-, digunakan untuk penugasan dari sisi Kiri
- ->, digunakan untuk penugasan dari sisi Kanan
x=6
y<-8
10->z
print(c(x,y,z))
## [1] 6 8 10
Menambah Komentar
Menambahkan/Memberikan komentar dalam skrip/koding R dan Python adalah untuk memudahkan anda memahami arti/makna penggunaan suatu perintah/program. Komentar yang ditulis dalam sebuah program tersebut hanya bersifat penjelasan tentang apa yang dilakukannya atau apa yang seharusnya dilakukan oleh sebuah skrip/koding.
x=15 # Mengganti nilai x yang sudah direkam (Komentar di akhir pernyataan)
z <- x + y # Mengganti nilai z yang sudah direkam (Komentar di akhir pernyataan)
x + y -> z # sama dengan di atas
Operator
Operator adalah simbol yang mengarahkan 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).
Aritmatika
Aritmatika dalam progam R dan Python adalah untuk mensimulasikan berbagai operasi matematika, seperti penambahan, pengurangan, perkalian, pembagian, dan modula.
| Operator |
R |
Python |
| Penjumlahan |
+ |
+ |
| pengurangan |
- |
- |
| perkalian |
* |
* |
| Pembagian |
/ |
/ |
| Pemangkatan |
^ |
** |
| Modulo |
%% |
% |
Penerapan Aritmatika pada R
x <- c(4,8,2) # memuat vektor x
y <- c(5,9,6) # memuat vektor y
x+y # hasil penjumlahan vektor x dan y
## [1] 9 17 8
Penjumlahan pada R
print(x-y) # hasil pengurangan vektor x dan y
## [1] -1 -1 -4
Pengurangan pada R
print(x*y) # hasil perkalian vektor x dan y
## [1] 20 72 12
Perkalian pada R
print(x/y) # hasil pembagian vektor x dan y
## [1] 0.8000000 0.8888889 0.3333333
Pembagian pada R
print(x%%y) # hasil modulo vektor x dan y
## [1] 4 8 2
Modulo pada R
print(x^y) # hasil pemangkatan vektor x dan y
## [1] 1024 134217728 64
Pemangkatan pada R
Untuk menampilkan keterangan atau komentar sehingga dapat melekat pada R itu sendiri
cat("Penjumlahan vektor x dan y:", x + y, "\n")
## Penjumlahan vektor x dan y: 9 17 8
cat("Pengurangan vektor x dan y:", x - y, "\n")
## Pengurangan vektor x dan y: -1 -1 -4
cat("Perkalian vektor x dan y:", x * y, "\n")
## Perkalian vektor x dan y: 20 72 12
cat("Pembagian vektor x dan y:", x / y, "\n")
## Pembagian vektor x dan y: 0.8 0.8888889 0.3333333
cat("Pemangkatan vektor x dan y:", x ^ y, "\n")
## Pemangkatan vektor x dan y: 1024 134217728 64
cat("Modulo vektor x dan y:", x %% y, "\n")
## Modulo vektor x dan y: 4 8 2
Relasional
Operator relasional melakukan operasi perbandingan antara elemen yang bersesuaian pada setiap operan. Nilai TRUE selalu dianggap lebih besar dari nilai FALSE.
| Operator |
R |
Python |
| Kurang dari |
< |
< |
| Kurang dari sama dengan |
<= |
<= |
| Lebih besar dari |
> |
> |
| Lebih besar dari sama dengan |
>= |
>= |
| Sama dengan |
== |
== |
| Tidak Sama dengan |
!= |
!= |
x <- c(4,8,2) # memuat vektor x
y <- c(5,9,6) # memuat vektor y
cat("Vektor x kurang dari Vektor y = ", x < y, "\n")
## Vektor x kurang dari Vektor y = TRUE TRUE TRUE
cat("Vektor x kurang dari sama dengan Vektor y = ", x <= y, "\n")
## Vektor x kurang dari sama dengan Vektor y = TRUE TRUE TRUE
cat("Vektor x Lebih besar dari Vektor y = ", x > y, "\n")
## Vektor x Lebih besar dari Vektor y = FALSE FALSE FALSE
cat("Vektor x Lebih besar dari sama dengan Vektor y = ", x >= y, "\n")
## Vektor x Lebih besar dari sama dengan Vektor y = FALSE FALSE FALSE
cat("Vektor x sama dengan Vektor y = ", x = y, "\n")
## Vektor x sama dengan Vektor y = 5 9 6
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 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.
| Operator |
R |
Python |
| NOT |
! |
! |
| AND |
& |
& |
| OR |
$ |
$ |
| XOR |
^ |
^ |
x=c(1,FALSE,TRUE) # Nilai vektor x
y=c(TRUE,5,4+5i) # Nilai Vektor y
cat("Logika Negasi (~) untuk vektor x :", !x, "\n")
## Logika Negasi (~) untuk vektor x : FALSE TRUE FALSE
cat("Logika Negasi (~) untuk vektor y :", !y, "\n")
## Logika Negasi (~) untuk vektor y : FALSE FALSE FALSE
cat("Logika Konjungsi (AND) :", x & y, "\n")
## Logika Konjungsi (AND) : TRUE FALSE TRUE
cat("Logika Disjungsi (OR) :", x | y, "\n")
## Logika Disjungsi (OR) : TRUE TRUE TRUE
cat("Logika Disjungsi Parsial :", x || y, "\n")
## Logika Disjungsi Parsial : TRUE
Lain-lain
x <- c(4,8,2) # memuat vektor x
y <- c(5,9,6) # memuat vektor y
sqrt(x*y) # bentuk akar
## [1] 4.472136 8.485281 3.464102
Bentuk Akar
## [1] 1.3862944 2.0794415 0.6931472
Logaritma
## [1] 148.4132 8103.0839 403.4288
Eksponen
## [1] 5.800000 9.888889 6.333333
Tanda Kurung
Tipe Data
berikut adalah dasar tipe-tipe data yang paling mendasar :
| Operator |
R |
Python |
| Double/Flat |
5.6 |
5.6 |
| Integer |
5 |
5 |
| Bolean/Logical |
TRUE/FALSE |
True/False |
| String/Character |
‘Dscienlabs’ |
Dscienlabs’ |
| Complex |
1 + 5j |
1 + 5j |
Koding R yang dapat digunakan untuk menetapkan tipe diatas
open ->
a <- 5.8 # Tetapkan nilai desimal
b <- 4L # menetapkan nilai integer di R
c <- c(T,F) # Bolean/Logical
f <- c("d",'e', '222') #String/Character
g <- 4 + 8i #Complex
Untuk memeriksa tipe data dalam R
class(a) # cetak nama kelas variabel
## [1] "numeric"
typeof(c) # cetak tipe variabel x
## [1] "logical"
LS0tDQp0aXRsZTogIlR1Z2FzIDIiDQpzdWJ0aXRsZTogIkFsZ29yaXRtYSAmIFN0cnVrdHVyIERhdGEiDQphdXRob3I6ICJZb3NpYSAoMjAyMDQ5MjAwMTIpIg0KZGF0ZTogIjI4LzgvMjAyMSINCm91dHB1dDogDQogIGh0bWxfZG9jdW1lbnQ6IA0KICAgIGh0bWxfZG9jdW1lbnQ6IG51bGwNCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUNCiAgICB0b2M6IHllcw0KICAgIHRvY19mbG9hdDoNCiAgICAgIGNvbGxhcHNlZDogeWVzDQogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMNCiAgICBjb2RlX2Rvd25sb2FkOiB5ZXMNCiAgICB0aGVtZTogc2FuZHN0b25lDQogICAgY3NzOiBzdHlsZTEuY3NzDQogICAgaGlnaGxpZ2h0OiBtb25vY2hyb21lDQotLS0NCg0KDQo8aW1nIHN0eWxlPSJmbG9hdDogcmlnaHQ7IG1hcmdpbjogMHB4IDEwMHB4IDBweCAwcHg7IHdpZHRoOjQwJSIgc3JjPSJjaXJlbWFpLnBuZyIvPiANCg0KYGBge3IgbG9nbywgZWNobz1GQUxTRSxmaWcuYWxpZ249J2NlbnRlcicsIG91dC53aWR0aCA9ICczMCUnfQ0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoImxvZ29tYXRhbmEucG5nIikNCmBgYA0KDQpFbWFpbCAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsmbmJzcDs6ICB5b3NpYS55b3NpYUBzdHVkZW50Lm1hdGFuYXVuaXZlcnNpdHkuYWMuaWQgPGJyPg0KUlB1YnMgICZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOzogaHR0cHM6Ly9ycHVicy5jb20veW9zaWEgPGJyPg0KSnVydXNhbiAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7OiBbU3RhdGlzdGlrYV0oaHR0cHM6Ly9tYXRhbmF1bml2ZXJzaXR5LmFjLmlkLz9seT1hY2FkZW1pYyZjPXNiKSA8YnI+DQpJbnN0YWdyYW0gICZuYnNwOyAmbmJzcDsgJm5ic3A7OiBbeXlvc2lhXShodHRwczovL3d3dy5pbnN0YWdyYW0uY29tL3l5b3NpYS8pIDxicj4NCkNvbnRhY3QgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOzogWzA4NTc3OTI4Njc4MF0oaHR0cHM6Ly93YS5saW5rL3hyeWFtbyk8YnI+DQpBZGRyZXNzICAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgOiBBUkEgQ2VudGVyLCBNYXRhbmEgVW5pdmVyc2l0eSBUb3dlciA8YnI+DQombmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyZuYnNwOyBKbC4gQ0JEIEJhcmF0IEthdiwgUlQuMSwgQ3VydWcgU2FuZ2VyZW5nLCBLZWxhcGEgRHVhLCBUYW5nZXJhbmcsIEJhbnRlbiAxNTgxMC4NCg0KKioqKg0KIyBTaW50YWtzIERhc2FyIA0KDQojIyBQZW51Z2FzYW4gVmFyaWFiZWwNCg0KUGVudWdhc2FuIHByb2dyYW0gZGFsYW0gUiBtZW5nZ3VuYWthbiBzdWF0dSB2YXJpYWJlbCB5YW5nIGRpY2FkYW5na2FuIHNlaGluZ2dhIGRhcGF0IG1lcmVrYW0gamVuaXMgZGF0YSBzZXN1YWkgZGVuZ2FuIG5hbWEgeWFuZyBkaWJlcmlrYW4gZGFuIGRpc2ltcGFuIHBhZGEgbG9rYXNpIHBlbnlpbXBhbmFuL21lbW9yaS4gRGVuZ2FuIGNhcmEgbWVub3Rhc2lrYW5ueWEgYWRhbGFoIDoNCg0KLSA9PSwgZGlndW5ha2FuIHVudHVrIHBlbnVnYXNhbiBzZWRlcmhhbmENCi0gPC0sIGRpZ3VuYWthbiB1bnR1ayBwZW51Z2FzYW4gZGFyaSBzaXNpIEtpcmkNCi0gLT4sIGRpZ3VuYWthbiB1bnR1ayBwZW51Z2FzYW4gZGFyaSBzaXNpIEthbmFuDQoNCmBgYHtyfQ0KeD02DQp5PC04DQoxMC0+eg0KcHJpbnQoYyh4LHkseikpDQoNCmBgYA0KDQojIE1lbmFtYmFoIEtvbWVudGFyDQoNCk1lbmFtYmFoa2FuL01lbWJlcmlrYW4ga29tZW50YXIgZGFsYW0gc2tyaXAva29kaW5nIFIgZGFuIFB5dGhvbiBhZGFsYWggdW50dWsgbWVtdWRhaGthbiBhbmRhIG1lbWFoYW1pIGFydGkvbWFrbmEgcGVuZ2d1bmFhbiBzdWF0dSBwZXJpbnRhaC9wcm9ncmFtLiBLb21lbnRhciB5YW5nIGRpdHVsaXMgZGFsYW0gc2VidWFoIHByb2dyYW0gdGVyc2VidXQgaGFueWEgYmVyc2lmYXQgcGVuamVsYXNhbiB0ZW50YW5nIGFwYSB5YW5nIGRpbGFrdWthbm55YSBhdGF1IGFwYSB5YW5nIHNlaGFydXNueWEgZGlsYWt1a2FuIG9sZWggc2VidWFoIHNrcmlwL2tvZGluZy4NCg0KYGBge3J9DQp4PTE1ICAgICAgICAgIyBNZW5nZ2FudGkgbmlsYWkgeCB5YW5nIHN1ZGFoIGRpcmVrYW0gKEtvbWVudGFyIGRpIGFraGlyIHBlcm55YXRhYW4pDQp6IDwtIHggKyB5ICAgIyBNZW5nZ2FudGkgbmlsYWkgeiB5YW5nIHN1ZGFoIGRpcmVrYW0gKEtvbWVudGFyIGRpIGFraGlyIHBlcm55YXRhYW4pDQp4ICsgeSAtPiB6ICAgIyBzYW1hIGRlbmdhbiBkaSBhdGFzDQpgYGANCg0KIyBPcGVyYXRvcg0KDQpPcGVyYXRvciBhZGFsYWggc2ltYm9sIHlhbmcgbWVuZ2FyYWhrYW4gY29tcGlsZXIgdW50dWsgbWVsYWt1a2FuIGJlcmJhZ2FpIG1hY2FtIG9wZXJhc2kgdGVyaGFkYXAgYmViZXJhcGEgcGVudWdhc2FuLiBPcGVyYXRvciBtZW5zaW11bGFzaWthbiBiZXJiYWdhaSBvcGVyYXNpIG1hdGVtYXRpcywgbG9naWthLCBkYW4ga2VwdXR1c2FuIHlhbmcgZGlsYWt1a2FuIHBhZGEgc2VrdW1wdWxhbiBCaWxhbmdhbiBLb21wbGVrcywgSW50ZWdlciwgZGFuIE51bWVyaWsgc2ViYWdhaSBwZW51Z2FzYW4gbWFzdWthbiAoaW5wdXQpLg0KDQojIyBBcml0bWF0aWthIA0KDQpBcml0bWF0aWthIGRhbGFtIHByb2dhbSBSIGRhbiBQeXRob24gYWRhbGFoIHVudHVrIG1lbnNpbXVsYXNpa2FuIGJlcmJhZ2FpIG9wZXJhc2kgbWF0ZW1hdGlrYSwgc2VwZXJ0aSBwZW5hbWJhaGFuLCBwZW5ndXJhbmdhbiwgcGVya2FsaWFuLCBwZW1iYWdpYW4sIGRhbiBtb2R1bGEuDQoNCnx8fA0KfC0tLS18LS0tLXwtLS0tfA0KfCpPcGVyYXRvcip8ICAqUiogIHwqUHl0aG9uKnwNCnxQZW5qdW1sYWhhbnwgKyB8ICsgfA0KfHBlbmd1cmFuZ2FufCAtIHwgLSB8DQp8cGVya2FsaWFufCAqIHwgKiB8DQp8UGVtYmFnaWFufCAvIHwgLyB8DQp8UGVtYW5na2F0YW58IF4gfCAqKiB8DQp8TW9kdWxvfCAlJSB8ICUgfA0KDQo8aDIgY2xhc3M9InRhYnNldCB0YWJzZXQtcGlsbHMiPlBlbmVyYXBhbiBBcml0bWF0aWthIHBhZGEgUjwvaDI+DQoNCmBgYHtyfQ0KeCA8LSBjKDQsOCwyKSAgICAgICMgbWVtdWF0IHZla3RvciB4DQp5IDwtIGMoNSw5LDYpICAgICAgIyBtZW11YXQgdmVrdG9yIHkNCngreSAgICAgICAgICAgICAgICAjIGhhc2lsIHBlbmp1bWxhaGFuIHZla3RvciB4IGRhbiB5DQpgYGANCioqUGVuanVtbGFoYW4gcGFkYSBSKioNCg0KDQpgYGB7cn0NCnByaW50KHgteSkgICAgICAgICAjIGhhc2lsIHBlbmd1cmFuZ2FuIHZla3RvciB4IGRhbiB5DQpgYGANCioqUGVuZ3VyYW5nYW4gcGFkYSBSKioNCg0KDQpgYGB7cn0NCnByaW50KHgqeSkgICAgICAgICAjIGhhc2lsIHBlcmthbGlhbiB2ZWt0b3IgeCBkYW4geQ0KYGBgDQoqKlBlcmthbGlhbiBwYWRhIFIqKg0KDQpgYGB7cn0NCnByaW50KHgveSkgICAgICAgICAjIGhhc2lsIHBlbWJhZ2lhbiB2ZWt0b3IgeCBkYW4geQ0KYGBgDQoqKlBlbWJhZ2lhbiBwYWRhIFIqKg0KDQpgYGB7cn0NCnByaW50KHglJXkpICAgICAgICAgIyBoYXNpbCBtb2R1bG8gdmVrdG9yIHggZGFuIHkNCmBgYA0KKipNb2R1bG8gcGFkYSBSKioNCg0KYGBge3J9DQpwcmludCh4XnkpICAgICAgICAgIyBoYXNpbCBwZW1hbmdrYXRhbiB2ZWt0b3IgeCBkYW4geQ0KYGBgDQoqKlBlbWFuZ2thdGFuIHBhZGEgUioqDQoNCg0KPGgyIGNsYXNzPSJ0YWJzZXQgdGFic2V0LXBpbGxzIj5VbnR1ayBtZW5hbXBpbGthbiBrZXRlcmFuZ2FuIGF0YXUga29tZW50YXIgc2VoaW5nZ2EgZGFwYXQgbWVsZWthdCBwYWRhIFIgaXR1IHNlbmRpcmk8L2gyPg0KDQpgYGB7cn0NCmNhdCgiUGVuanVtbGFoYW4gdmVrdG9yIHggZGFuIHk6IiwgeCArIHksICJcbiIpDQpjYXQoIlBlbmd1cmFuZ2FuIHZla3RvciB4IGRhbiB5OiIsIHggLSB5LCAiXG4iKQ0KY2F0KCJQZXJrYWxpYW4gdmVrdG9yIHggZGFuIHk6IiwgeCAqIHksICJcbiIpDQpjYXQoIlBlbWJhZ2lhbiB2ZWt0b3IgeCBkYW4geToiLCB4IC8geSwgIlxuIikNCmNhdCgiUGVtYW5na2F0YW4gdmVrdG9yIHggZGFuIHk6IiwgeCBeIHksICJcbiIpDQpjYXQoIk1vZHVsbyB2ZWt0b3IgeCBkYW4geToiLCB4ICUlIHksICJcbiIpDQpgYGANCg0KIyMgUmVsYXNpb25hbCANCg0KT3BlcmF0b3IgcmVsYXNpb25hbCBtZWxha3VrYW4gb3BlcmFzaSBwZXJiYW5kaW5nYW4gYW50YXJhIGVsZW1lbiB5YW5nIGJlcnNlc3VhaWFuIHBhZGEgc2V0aWFwIG9wZXJhbi4gTmlsYWkgKipUUlVFKiogc2VsYWx1IGRpYW5nZ2FwIGxlYmloIGJlc2FyIGRhcmkgbmlsYWkgKipGQUxTRSoqLg0KDQp8fHwNCnwtLS0tfC0tLS18LS0tLXwNCnwqT3BlcmF0b3IqfCAgKlIqICB8KlB5dGhvbip8DQp8S3VyYW5nIGRhcml8IDwgfCA8IHwNCnxLdXJhbmcgZGFyaSBzYW1hIGRlbmdhbnwgPD0gfCA8PSB8DQp8TGViaWggYmVzYXIgZGFyaXwgPiB8ID4gfA0KfExlYmloIGJlc2FyIGRhcmkgc2FtYSBkZW5nYW58ID49IHwgPj0gfA0KfFNhbWEgZGVuZ2FufCA9PSB8ID09IHwNCnxUaWRhayBTYW1hIGRlbmdhbnwgIT0gfCAhPSB8DQoNCmBgYHtyfQ0KeCA8LSBjKDQsOCwyKSAgICAgICMgbWVtdWF0IHZla3RvciB4DQp5IDwtIGMoNSw5LDYpICAgICAgIyBtZW11YXQgdmVrdG9yIHkNCmNhdCgiVmVrdG9yIHgga3VyYW5nIGRhcmkgVmVrdG9yIHkgPSAiLCB4IDwgeSwgIlxuIikNCmBgYA0KYGBge3J9DQpjYXQoIlZla3RvciB4IGt1cmFuZyBkYXJpIHNhbWEgZGVuZ2FuIFZla3RvciB5ID0gIiwgeCA8PSB5LCAiXG4iKQ0KYGBgDQpgYGB7cn0NCmNhdCgiVmVrdG9yIHggTGViaWggYmVzYXIgZGFyaSBWZWt0b3IgeSA9ICIsIHggPiB5LCAiXG4iKQ0KYGBgDQpgYGB7cn0NCmNhdCgiVmVrdG9yIHggTGViaWggYmVzYXIgZGFyaSBzYW1hIGRlbmdhbiBWZWt0b3IgeSA9ICIsIHggPj0geSwgIlxuIikNCmBgYA0KYGBge3J9DQpjYXQoIlZla3RvciB4IHNhbWEgZGVuZ2FuIFZla3RvciB5ID0gIiwgeCA9IHksICJcbiIpDQpgYGANCmBgYHtyfQ0KY2F0KCJWZWt0b3IgeCBUaWRhayBzYW1hIGRlbmdhbiBWZWt0b3IgeSA9ICIsIHggIT0geSwgIlxuIikNCmBgYA0KDQojIyBMb2dpa2ENCg0KT3BlcmF0b3IgbG9naXMgbWVuc2ltdWxhc2lrYW4gb3BlcmFzaSBrZXB1dHVzYW4sIGJlcmRhc2Fya2FuIG9wZXJhdG9yIHlhbmcgZGl0ZW50dWthbiBhbnRhcmEgb3BlcmFuLCB5YW5nIGtlbXVkaWFuIGRpZXZhbHVhc2kga2UgbmlsYWkgQm9vbGVhbiBCZW5hciBhdGF1IFNhbGFoLk5pbGFpIGJpbGFuZ2FuIGJ1bGF0IGJ1a2FuIG5vbCBkaWFuZ2dhcCBzZWJhZ2FpIG5pbGFpICoqQkVOQVIqKi4NCg0KfHx8DQp8LS0tLXwtLS0tfC0tLS18DQp8Kk9wZXJhdG9yKnwgICpSKiAgfCpQeXRob24qfA0KfE5PVHwgISB8ICEgfA0KfEFORHwgJiB8ICYgfA0KfE9SfCAkIHwgJCB8DQp8WE9SfCBeIHwgXiB8DQoNCmBgYHtyfQ0KeD1jKDEsRkFMU0UsVFJVRSkgIyBOaWxhaSB2ZWt0b3IgeA0KeT1jKFRSVUUsNSw0KzVpKSAjIE5pbGFpIFZla3RvciB5DQpjYXQoIkxvZ2lrYSBOZWdhc2kgKH4pIHVudHVrIHZla3RvciB4IDoiLCAheCwgIlxuIikNCmBgYA0KYGBge3J9DQpjYXQoIkxvZ2lrYSBOZWdhc2kgKH4pIHVudHVrIHZla3RvciB5IDoiLCAheSwgIlxuIikNCmBgYA0KYGBge3J9DQpjYXQoIkxvZ2lrYSBLb25qdW5nc2kgKEFORCkgIDoiLCB4ICYgeSwgIlxuIikNCmBgYA0KYGBge3J9DQpjYXQoIkxvZ2lrYSBEaXNqdW5nc2kgKE9SKSAgOiIsIHggfCB5LCAiXG4iKQ0KYGBgDQpgYGB7cn0NCmNhdCgiTG9naWthIERpc2p1bmdzaSBQYXJzaWFsICA6IiwgeCB8fCB5LCAiXG4iKQ0KYGBgDQoNCg0KIyMgTGFpbi1sYWluDQoNCmBgYHtyfQ0KeCA8LSBjKDQsOCwyKSAgICAgICMgbWVtdWF0IHZla3RvciB4DQp5IDwtIGMoNSw5LDYpICAgICAgIyBtZW11YXQgdmVrdG9yIHkNCnNxcnQoeCp5KSAgICAgICAgICAjIGJlbnR1ayBha2FyDQpgYGANCkJlbnR1ayBBa2FyDQpgYGB7cn0NCmxvZyh4KSAgICAgICAgICAgICAjIExvZ2FyaXRtYQ0KYGBgDQpMb2dhcml0bWENCmBgYHtyfQ0KZXhwKHkpICAgICAgICAgICAgICMgRWtzcG9uZW4NCmBgYA0KRWtzcG9uZW4NCmBgYHtyfQ0KKHgveSkgKyB5ICAgICAgICAgICMgVGFuZGEga3VydW5nDQpgYGANClRhbmRhIEt1cnVuZw0KDQojIFRpcGUgRGF0YQ0KDQpiZXJpa3V0IGFkYWxhaCBkYXNhciB0aXBlLXRpcGUgZGF0YSB5YW5nIHBhbGluZyBtZW5kYXNhciA6DQoNCnx8fA0KfC0tLS18LS0tLXwtLS0tfA0KfCpPcGVyYXRvcip8ICAqUiogIHwqUHl0aG9uKnwNCnxEb3VibGUvRmxhdHwgNS42IHwgNS42IHwNCnxJbnRlZ2VyfCA1IHwgNSB8DQp8Qm9sZWFuL0xvZ2ljYWx8IFRSVUUvRkFMU0UgfCBUcnVlL0ZhbHNlIHwNCnxTdHJpbmcvQ2hhcmFjdGVyfCAnRHNjaWVubGFicycgfCBEc2NpZW5sYWJzJyB8DQp8Q29tcGxleHwgMSArIDVqIHwgMSArIDVqIHwNCg0KPGgyIGNsYXNzPSJ0YWJzZXQgdGFic2V0LXBpbGxzIj5Lb2RpbmcgUiB5YW5nIGRhcGF0IGRpZ3VuYWthbiB1bnR1ayBtZW5ldGFwa2FuIHRpcGUgZGlhdGFzPC9oMj4NCg0Kb3BlbiAtPg0KDQpgYGB7cn0NCmEgPC0gNS44ICAgICAgICAgICAgICAgICMgVGV0YXBrYW4gbmlsYWkgZGVzaW1hbA0KYiA8LSA0TCAgICAgICAgICAgICAgICAgIyBtZW5ldGFwa2FuIG5pbGFpIGludGVnZXIgZGkgUg0KYyA8LSBjKFQsRikgICAgICAgICAgICAgIyBCb2xlYW4vTG9naWNhbA0KZiA8LSBjKCJkIiwnZScsICcyMjInKSAgI1N0cmluZy9DaGFyYWN0ZXINCmcgPC0gNCArIDhpICAgICAgICAgICAgICNDb21wbGV4DQpgYGANCg0KPGgyIGNsYXNzPSJ0YWJzZXQgdGFic2V0LXBpbGxzIj5VbnR1ayBtZW1lcmlrc2EgdGlwZSBkYXRhIGRhbGFtIFIgPC9oMj4NCmBgYHtyfQ0KY2xhc3MoYSkgICAgICMgY2V0YWsgbmFtYSBrZWxhcyB2YXJpYWJlbA0KYGBgDQpgYGB7cn0NCnR5cGVvZihjKSAgICAjIGNldGFrIHRpcGUgdmFyaWFiZWwgeA0KYGBgDQoNCiMgUmVmcmVuc2kNCg0KaHR0cHM6Ly9ycHVicy5jb20vZHNjaWVuY2VsYWJzL2FzZDINCg0KDQoNCg==