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


1 Soal nomor 1

1.1 Membuat Program dengan List R dan Python

1.1.1 Buat sebuah list untuk menyimpan 5 orang teman dekatmu

list0 = list()                                              # Membuat List kosong
list5 = list("Nanda", "Felicia", "Diva", "Shifa", "Abed")   # Membuat List berisi 5 item

print(list5)
## [[1]]
## [1] "Nanda"
## 
## [[2]]
## [1] "Felicia"
## 
## [[3]]
## [1] "Diva"
## 
## [[4]]
## [1] "Shifa"
## 
## [[5]]
## [1] "Abed"

1.1.2 Pilihlah satu orang dari list tersebut yang menjadi teman paling dekatmu dengan menggunakan index

list5 = list("Nanda", "Felicia", "Diva", "Shifa", "Abed")   
print(list5[1])                                             # Print nilai pada index 2
## [[1]]
## [1] "Nanda"

1.1.3 Gantilah satu orang yang tidak begitu dekat denganmu dengan teman baru yang kamu temui baru-baru ini

list5 = list("Nanda", "Felicia", "Diva", "Shifa", "Abed")
list5[5] = "Alicia"                                         # Mengganti item Abed menjadi Alicia

print(list5)
## [[1]]
## [1] "Nanda"
## 
## [[2]]
## [1] "Felicia"
## 
## [[3]]
## [1] "Diva"
## 
## [[4]]
## [1] "Shifa"
## 
## [[5]]
## [1] "Alicia"

1.1.4 Bagaimana caranya anda menghitung banyak teman yang ada dalam list tersebut

length(list5)                                               # Menghitung banyak teman yang berada di dalam List
## [1] 5

2 Soal nomor 2

2.1 Buatlah contoh menyimpan sekumpulan tuple dengan R dan Python, dengan mengikuti instruksi berikut

2.1.1 Buatlah Tuple dengan 5 item didalamnya

library(sets)                                               # Panggil library sets terlebih dulu
tuple0 = tuple()                                            # Membuat isi tuple (kosong)
tuple1 = tuple("Warna")                                     # Membuat isi tuple 1 item
tuple3 = tuple("Warna","Kuning")                            # Membuat isi tuple 2 item
tuple5 = tuple("Kamu", "Lebih", "Suka", "Warna", "Apa?")    # Membuat isi tuple 5 item

2.1.2 Perlihatkan cara Mengakses Nilai Tuple

tuple5 = tuple("Kamu", "Lebih", "Suka", "Warna", "Apa?")
print(tuple5[4])                                            # Mengakses nilai 4 pada tuple5
## ("Warna")
print(tuple5[5])                                            # Mengakses nilai 5 pada tuple5
## ("Apa?")

2.1.3 Bagaimana anda melakukan Slicing Nilai Tuple

print(tuple5[4:5])                                          # Memotong tuple 5 berdasarkan order
## ("Warna", "Apa?")

2.1.4 Nestled Tuple

tuple7 = rep(tuple5, 3)                                     # Mengisi tuple7 dengan tuple5 dan diulang 3 kali
tuple8 = c(tuple5, tuple3)                                  # Mengisi tuple8 dengan tuple5 dan tuple3

print(tuple7)
## ("Kamu", "Lebih", "Suka", "Warna", "Apa?", "Kamu", "Lebih", "Suka",
##  "Warna", "Apa?", "Kamu", "Lebih", "Suka", "Warna", "Apa?")
print(tuple8)
## ("Kamu", "Lebih", "Suka", "Warna", "Apa?", "Warna", "Kuning")

3 Soal nomor 3

3.1 Buatlah contoh menyimpan sekumpulan Dictionary dengan R dan Python, yang memuat type data float, integer, character, dan logical, list, tuple, dictionary dengan mengikuti instruksi berikut

3.1.1 Akses suatu nilai Item dari Dictionary

library(Dict)                                               # Mengaktifkan library Dict
## 
## Attaching package: 'Dict'
## The following object is masked from 'package:sets':
## 
##     %>%
agathasxx = dict(
  nama = "Dhela Asafiani",                                  # Memasukkan nama pada dict
  umur = as.integer(19),                                    # MEmasukkan umur pada dict
  hobi = list("membaca", "olahraga", "menulis"),            # Memasukkan List hobi
  menikah = FALSE,
  sosmed = tuple(instagram= "dhelaasf",
                 twitter = "agathasxx" 
                 )
  
)

3.1.2 Akses suatu nilai Item dari Dictionary

cat("Nama saya adalah:", agathasxx$get('nama'))             # Mengakses nama pada dict agathasxx
## Nama saya adalah: Dhela Asafiani
print(agathasxx$get('sosmed')['twitter'])                   # Mengakses sosmed twitter
## (twitter = "agathasxx")

3.1.3 Menambahkan Item ke Dictionary

agathasxx["nama"] = "Dhela Asafiani Agatha"                 # Mengubah nilai item dictionary
print(agathasxx$get('nama'))
## [1] "Dhela Asafiani Agatha"

3.1.4 Menghapus Item dari Dictionary

agathasxx$remove("sosmed")                                  # Mengapus item sosmed pada dictionary 

print(agathasxx)
## # A tibble: 4 x 2
##   key     value     
##   <chr>   <list>    
## 1 hobi    <list [3]>
## 2 menikah <lgl [1]> 
## 3 nama    <chr [1]> 
## 4 umur    <int [1]>

4 Soal nomor 4

4.1 Silahkan untuk menemukan operasi Pengindeksan, Pengirisan, dan Subsetting Data Frame dengan Menggunkan R dan Python

df1_R <- data.frame(kode = c (1:5),                                                                             # Memberi kode pada data frame 1-5
                    nama = c("Nanda","Felicia","Diva","Shifa","Alicia"),                                        # Memberi List berisi item nama
                    gaji = c("400","600","680","990","350"),                                                    # Memberi List berisi item gaji
                    mulai_kerja = as.Date(c("2022-08-11","2022-04-18","2022-11-30","2022-03-02","2022-09-25")), # Memberi List berisi item tanggal
                    divisi = c("DS","BA","BA","DA","DA"), stringsAsFactors = F)                                 # Memberi List berisi item divisi

print(df1_R)
##   kode    nama gaji mulai_kerja divisi
## 1    1   Nanda  400  2022-08-11     DS
## 2    2 Felicia  600  2022-04-18     BA
## 3    3    Diva  680  2022-11-30     BA
## 4    4   Shifa  990  2022-03-02     DA
## 5    5  Alicia  350  2022-09-25     DA
df2_R <- data.frame(kode = c (6:10),                                                                            # Memberi kode pada data frame 1-5
                    nama = c("Ibeth","Sofie","Abed","Gaby","Kevin"),                                            # Memberi List berisi item nama
                    gaji = c("530","650","580","539","780"),                                                    # Memberi List berisi item gaji
                    mulai_kerja = as.Date(c("2022-03-21","2022-01-12","2022-12-20","2022-09-02","2022-06-21")), # Memberi List berisi item tanggal
                    divisi = c("Lawyer","Lawyer","BA","Actuaries","Actuaries"), stringsAsFactors = F)           # Memberi List berisi item divisi

print(df2_R)
##   kode  nama gaji mulai_kerja    divisi
## 1    6 Ibeth  530  2022-03-21    Lawyer
## 2    7 Sofie  650  2022-01-12    Lawyer
## 3    8  Abed  580  2022-12-20        BA
## 4    9  Gaby  539  2022-09-02 Actuaries
## 5   10 Kevin  780  2022-06-21 Actuaries
typeof(df1_R)                        # Cek tipe data
## [1] "list"
class(df1_R)                         # Cek tipe data
## [1] "data.frame"
df1_R[2,4]                           # Ekstrak elemen di baris ke-2 dan kolom ke-4
## [1] "2022-04-18"
df1_R$nama                           # Ekstrak spesifik kolom ('nama')
## [1] "Nanda"   "Felicia" "Diva"    "Shifa"   "Alicia"
df1_R[,c('gaji','divisi')]          # Ekstrak spesifik kolom ('gaji','divisi')
##   gaji divisi
## 1  400     DS
## 2  600     BA
## 3  680     BA
## 4  990     DA
## 5  350     DA
df1_R[ ,1:3]                       # Ekstrak 3 baris pertama df1_R
##   kode    nama gaji
## 1    1   Nanda  400
## 2    2 Felicia  600
## 3    3    Diva  680
## 4    4   Shifa  990
## 5    5  Alicia  350
df1_R[1:2, ]                       # Ekstrak 2 kolom pertama df1_R
##   kode    nama gaji mulai_kerja divisi
## 1    1   Nanda  400  2022-08-11     DS
## 2    2 Felicia  600  2022-04-18     BA
subset(df1_R, select=c(1:5))       # Ekstrak kolom 1 sampai kolom 5
##   kode    nama gaji mulai_kerja divisi
## 1    1   Nanda  400  2022-08-11     DS
## 2    2 Felicia  600  2022-04-18     BA
## 3    3    Diva  680  2022-11-30     BA
## 4    4   Shifa  990  2022-03-02     DA
## 5    5  Alicia  350  2022-09-25     DA
subset(df1_R, select=c(2,3))      # Ekstrak kolom tertentu
##      nama gaji
## 1   Nanda  400
## 2 Felicia  600
## 3    Diva  680
## 4   Shifa  990
## 5  Alicia  350
subset(df1_R, select = divisi)    # Ekstrak spesifik kolom divisi
##   divisi
## 1     DS
## 2     BA
## 3     BA
## 4     DA
## 5     DA
subset(df1_R, select = 4)         # Ekstrak spesifik kolom 4
##   mulai_kerja
## 1  2022-08-11
## 2  2022-04-18
## 3  2022-11-30
## 4  2022-03-02
## 5  2022-09-25
summary(df1_R)
##       kode       nama               gaji            mulai_kerja        
##  Min.   :1   Length:5           Length:5           Min.   :2022-03-02  
##  1st Qu.:2   Class :character   Class :character   1st Qu.:2022-04-18  
##  Median :3   Mode  :character   Mode  :character   Median :2022-08-11  
##  Mean   :3                                         Mean   :2022-07-17  
##  3rd Qu.:4                                         3rd Qu.:2022-09-25  
##  Max.   :5                                         Max.   :2022-11-30  
##     divisi         
##  Length:5          
##  Class :character  
##  Mode  :character  
##                    
##                    
## 

5 Soal nomor 5

5.1 Buatlah operasi Ganti Nama Variabel pada suatu Data Frame dengan menggunakan R

df2_R<-df1_R                                  # Merubah nama data frame df1_R menjadi df2_R
names(df2_R)<-c("Kode",                       # Merubah nama variable pada data frame df2_R
                   "Nama",
                   "Gaji",
                   "Mulai Bekerja",
                   "Divisi")

print(df2_R)
##   Kode    Nama Gaji Mulai Bekerja Divisi
## 1    1   Nanda  400    2022-08-11     DS
## 2    2 Felicia  600    2022-04-18     BA
## 3    3    Diva  680    2022-11-30     BA
## 4    4   Shifa  990    2022-03-02     DA
## 5    5  Alicia  350    2022-09-25     DA
LS0tDQp0aXRsZTogIlRVR0FTIDMiDQpzdWJ0aXRsZTogIkFsZ29yaXRtYSBkYW4gU3RydWt0dXIgRGF0YSINCmF1dGhvcjogIkRoZWxhIEFzYWZpYW5pIEFnYXRoYSAoMjAyMTQ5MjAwMDkpIg0KZGF0ZTogImByIGZvcm1hdChTeXMuRGF0ZSgpLCAnJUIgJWQsICVZJylgIg0Kb3V0cHV0OiANCiAgaHRtbF9kb2N1bWVudDogDQogICAgaHRtbF9kb2N1bWVudDogbnVsbA0KICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KICAgIHRvYzogeWVzDQogICAgdG9jX2Zsb2F0Og0KICAgICAgY29sbGFwc2VkOiB5ZXMNCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KICAgIGNvZGVfZG93bmxvYWQ6IHllcw0KICAgIHRoZW1lOiBzYW5kc3RvbmUNCiAgICBjc3M6IHN0eWxlMS5jc3MNCiAgICBoaWdobGlnaHQ6IG1vbm9jaHJvbWUNCi0tLQ0KDQoNCjxpbWcgc3R5bGU9ImZsb2F0OiByaWdodDsgbWFyZ2luOiAwcHggMTAwcHggMHB4IDBweDsgd2lkdGg6MjUlIiBzcmM9ImRlbGEucG5nIi8+IA0KDQpgYGB7ciBsb2dvLCBlY2hvPUZBTFNFLCBmaWcuYWxpZ249J2NlbnRlcicsIG91dC53aWR0aD0gJzMwJSd9DQprbml0cjo6aW5jbHVkZV9ncmFwaGljcygibG9nby5wbmciKQ0KYGBgDQoNCkVtYWlsICZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyZuYnNwOzogIGRoZWxhYWdhdGhhQGdtYWlsLmNvbSA8YnI+DQpSUHVicyAgJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7OiBodHRwczovL3JwdWJzLmNvbS9kaGVsYWFzYWZpYW5pIDxicj4NCkp1cnVzYW4gJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOzogW1N0YXRpc3Rpa2EgQmlzbmlzXShodHRwczovL21hdGFuYXVuaXZlcnNpdHkuYWMuaWQvP2x5PWFjYWRlbWljJmM9c2IpIDxicj4NCkFkZHJlc3MgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7IDogQVJBIENlbnRlciwgTWF0YW5hIFVuaXZlcnNpdHkgVG93ZXIgPGJyPg0KJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsmbmJzcDsgSmwuIENCRCBCYXJhdCBLYXYsIFJULjEsIEN1cnVnIFNhbmdlcmVuZywgS2VsYXBhIER1YSwgVGFuZ2VyYW5nLCBCYW50ZW4gMTU4MTAuDQoNCioqKioNCg0KIyBTb2FsIG5vbW9yIDENCg0KIyMgTWVtYnVhdCBQcm9ncmFtIGRlbmdhbiBMaXN0IFIgZGFuIFB5dGhvbg0KDQoNCiMjIyBCdWF0IHNlYnVhaCBsaXN0IHVudHVrIG1lbnlpbXBhbiA1IG9yYW5nIHRlbWFuIGRla2F0bXUNCmBgYHtyIGVjaG89VFJVRX0NCmxpc3QwID0gbGlzdCgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgTWVtYnVhdCBMaXN0IGtvc29uZw0KbGlzdDUgPSBsaXN0KCJOYW5kYSIsICJGZWxpY2lhIiwgIkRpdmEiLCAiU2hpZmEiLCAiQWJlZCIpICAgIyBNZW1idWF0IExpc3QgYmVyaXNpIDUgaXRlbQ0KDQpwcmludChsaXN0NSkNCmBgYA0KIyMjIFBpbGlobGFoIHNhdHUgb3JhbmcgZGFyaSBsaXN0IHRlcnNlYnV0IHlhbmcgbWVuamFkaSB0ZW1hbiBwYWxpbmcgZGVrYXRtdSBkZW5nYW4gbWVuZ2d1bmFrYW4gaW5kZXgNCmBgYHtyfQ0KbGlzdDUgPSBsaXN0KCJOYW5kYSIsICJGZWxpY2lhIiwgIkRpdmEiLCAiU2hpZmEiLCAiQWJlZCIpICAgDQpwcmludChsaXN0NVsxXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFByaW50IG5pbGFpIHBhZGEgaW5kZXggMg0KYGBgDQoNCiMjIyBHYW50aWxhaCBzYXR1IG9yYW5nIHlhbmcgdGlkYWsgYmVnaXR1IGRla2F0IGRlbmdhbm11IGRlbmdhbiB0ZW1hbiBiYXJ1IHlhbmcga2FtdSB0ZW11aSBiYXJ1LWJhcnUgaW5pDQpgYGB7cn0NCmxpc3Q1ID0gbGlzdCgiTmFuZGEiLCAiRmVsaWNpYSIsICJEaXZhIiwgIlNoaWZhIiwgIkFiZWQiKQ0KbGlzdDVbNV0gPSAiQWxpY2lhIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBNZW5nZ2FudGkgaXRlbSBBYmVkIG1lbmphZGkgQWxpY2lhDQoNCnByaW50KGxpc3Q1KQ0KYGBgDQoNCiMjIyBCYWdhaW1hbmEgY2FyYW55YSBhbmRhIG1lbmdoaXR1bmcgYmFueWFrIHRlbWFuIHlhbmcgYWRhIGRhbGFtIGxpc3QgdGVyc2VidXQNCmBgYHtyfQ0KbGVuZ3RoKGxpc3Q1KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBNZW5naGl0dW5nIGJhbnlhayB0ZW1hbiB5YW5nIGJlcmFkYSBkaSBkYWxhbSBMaXN0DQpgYGANCg0KIyBTb2FsIG5vbW9yIDINCg0KIyMgQnVhdGxhaCBjb250b2ggbWVueWltcGFuIHNla3VtcHVsYW4gdHVwbGUgZGVuZ2FuIFIgZGFuIFB5dGhvbiwgZGVuZ2FuIG1lbmdpa3V0aSBpbnN0cnVrc2kgYmVyaWt1dA0KDQojIyMgQnVhdGxhaCBUdXBsZSBkZW5nYW4gNSBpdGVtIGRpZGFsYW1ueWENCmBgYHtyfQ0KbGlicmFyeShzZXRzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBQYW5nZ2lsIGxpYnJhcnkgc2V0cyB0ZXJsZWJpaCBkdWx1DQp0dXBsZTAgPSB0dXBsZSgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIE1lbWJ1YXQgaXNpIHR1cGxlIChrb3NvbmcpDQp0dXBsZTEgPSB0dXBsZSgiV2FybmEiKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIE1lbWJ1YXQgaXNpIHR1cGxlIDEgaXRlbQ0KdHVwbGUzID0gdHVwbGUoIldhcm5hIiwiS3VuaW5nIikgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBNZW1idWF0IGlzaSB0dXBsZSAyIGl0ZW0NCnR1cGxlNSA9IHR1cGxlKCJLYW11IiwgIkxlYmloIiwgIlN1a2EiLCAiV2FybmEiLCAiQXBhPyIpICAgICMgTWVtYnVhdCBpc2kgdHVwbGUgNSBpdGVtDQpgYGANCg0KIyMjIFBlcmxpaGF0a2FuIGNhcmEgTWVuZ2Frc2VzIE5pbGFpIFR1cGxlDQpgYGB7cn0NCnR1cGxlNSA9IHR1cGxlKCJLYW11IiwgIkxlYmloIiwgIlN1a2EiLCAiV2FybmEiLCAiQXBhPyIpDQpwcmludCh0dXBsZTVbNF0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIE1lbmdha3NlcyBuaWxhaSA0IHBhZGEgdHVwbGU1DQpwcmludCh0dXBsZTVbNV0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIE1lbmdha3NlcyBuaWxhaSA1IHBhZGEgdHVwbGU1DQpgYGANCg0KIyMjIEJhZ2FpbWFuYSBhbmRhIG1lbGFrdWthbiBTbGljaW5nIE5pbGFpIFR1cGxlDQpgYGB7cn0NCnByaW50KHR1cGxlNVs0OjVdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgTWVtb3RvbmcgdHVwbGUgNSBiZXJkYXNhcmthbiBvcmRlcg0KYGBgDQoNCiMjIyBOZXN0bGVkIFR1cGxlDQpgYGB7cn0NCnR1cGxlNyA9IHJlcCh0dXBsZTUsIDMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgTWVuZ2lzaSB0dXBsZTcgZGVuZ2FuIHR1cGxlNSBkYW4gZGl1bGFuZyAzIGthbGkNCnR1cGxlOCA9IGModHVwbGU1LCB0dXBsZTMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgTWVuZ2lzaSB0dXBsZTggZGVuZ2FuIHR1cGxlNSBkYW4gdHVwbGUzDQoNCnByaW50KHR1cGxlNykNCnByaW50KHR1cGxlOCkNCmBgYA0KDQojIFNvYWwgbm9tb3IgMw0KDQojIyBCdWF0bGFoIGNvbnRvaCBtZW55aW1wYW4gc2VrdW1wdWxhbiBEaWN0aW9uYXJ5IGRlbmdhbiBSIGRhbiBQeXRob24sIHlhbmcgbWVtdWF0IHR5cGUgZGF0YSBmbG9hdCwgaW50ZWdlciwgY2hhcmFjdGVyLCBkYW4gbG9naWNhbCwgbGlzdCwgdHVwbGUsIGRpY3Rpb25hcnkgZGVuZ2FuIG1lbmdpa3V0aSBpbnN0cnVrc2kgYmVyaWt1dA0KDQojIyMgQWtzZXMgc3VhdHUgbmlsYWkgSXRlbSBkYXJpIERpY3Rpb25hcnkgDQpgYGB7cn0NCmxpYnJhcnkoRGljdCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgTWVuZ2FrdGlma2FuIGxpYnJhcnkgRGljdA0KYWdhdGhhc3h4ID0gZGljdCgNCiAgbmFtYSA9ICJEaGVsYSBBc2FmaWFuaSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgTWVtYXN1a2thbiBuYW1hIHBhZGEgZGljdA0KICB1bXVyID0gYXMuaW50ZWdlcigxOSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBNRW1hc3Vra2FuIHVtdXIgcGFkYSBkaWN0DQogIGhvYmkgPSBsaXN0KCJtZW1iYWNhIiwgIm9sYWhyYWdhIiwgIm1lbnVsaXMiKSwgICAgICAgICAgICAjIE1lbWFzdWtrYW4gTGlzdCBob2JpDQogIG1lbmlrYWggPSBGQUxTRSwNCiAgc29zbWVkID0gdHVwbGUoaW5zdGFncmFtPSAiZGhlbGFhc2YiLA0KICAgICAgICAgICAgICAgICB0d2l0dGVyID0gImFnYXRoYXN4eCIgDQogICAgICAgICAgICAgICAgICkNCiAgDQopDQpgYGANCg0KIyMjIEFrc2VzIHN1YXR1IG5pbGFpIEl0ZW0gZGFyaSBEaWN0aW9uYXJ5DQpgYGB7cn0NCmNhdCgiTmFtYSBzYXlhIGFkYWxhaDoiLCBhZ2F0aGFzeHgkZ2V0KCduYW1hJykpICAgICAgICAgICAgICMgTWVuZ2Frc2VzIG5hbWEgcGFkYSBkaWN0IGFnYXRoYXN4eA0KcHJpbnQoYWdhdGhhc3h4JGdldCgnc29zbWVkJylbJ3R3aXR0ZXInXSkgICAgICAgICAgICAgICAgICAgIyBNZW5nYWtzZXMgc29zbWVkIHR3aXR0ZXINCmBgYA0KIyMjIE1lbmFtYmFoa2FuIEl0ZW0ga2UgRGljdGlvbmFyeQ0KYGBge3J9DQphZ2F0aGFzeHhbIm5hbWEiXSA9ICJEaGVsYSBBc2FmaWFuaSBBZ2F0aGEiICAgICAgICAgICAgICAgICAjIE1lbmd1YmFoIG5pbGFpIGl0ZW0gZGljdGlvbmFyeQ0KcHJpbnQoYWdhdGhhc3h4JGdldCgnbmFtYScpKQ0KYGBgDQoNCiMjIyBNZW5naGFwdXMgSXRlbSBkYXJpIERpY3Rpb25hcnkNCmBgYHtyfQ0KYWdhdGhhc3h4JHJlbW92ZSgic29zbWVkIikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBNZW5nYXB1cyBpdGVtIHNvc21lZCBwYWRhIGRpY3Rpb25hcnkgDQoNCnByaW50KGFnYXRoYXN4eCkNCmBgYA0KDQojIFNvYWwgbm9tb3IgNA0KDQojIyBTaWxhaGthbiB1bnR1ayBtZW5lbXVrYW4gb3BlcmFzaSBQZW5naW5kZWtzYW4sIFBlbmdpcmlzYW4sIGRhbiBTdWJzZXR0aW5nIERhdGEgRnJhbWUgZGVuZ2FuIE1lbmdndW5rYW4gUiBkYW4gUHl0aG9uDQoNCmBgYHtyfQ0KZGYxX1IgPC0gZGF0YS5mcmFtZShrb2RlID0gYyAoMTo1KSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgTWVtYmVyaSBrb2RlIHBhZGEgZGF0YSBmcmFtZSAxLTUNCiAgICAgICAgICAgICAgICAgICAgbmFtYSA9IGMoIk5hbmRhIiwiRmVsaWNpYSIsIkRpdmEiLCJTaGlmYSIsIkFsaWNpYSIpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIE1lbWJlcmkgTGlzdCBiZXJpc2kgaXRlbSBuYW1hDQogICAgICAgICAgICAgICAgICAgIGdhamkgPSBjKCI0MDAiLCI2MDAiLCI2ODAiLCI5OTAiLCIzNTAiKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBNZW1iZXJpIExpc3QgYmVyaXNpIGl0ZW0gZ2FqaQ0KICAgICAgICAgICAgICAgICAgICBtdWxhaV9rZXJqYSA9IGFzLkRhdGUoYygiMjAyMi0wOC0xMSIsIjIwMjItMDQtMTgiLCIyMDIyLTExLTMwIiwiMjAyMi0wMy0wMiIsIjIwMjItMDktMjUiKSksICMgTWVtYmVyaSBMaXN0IGJlcmlzaSBpdGVtIHRhbmdnYWwNCiAgICAgICAgICAgICAgICAgICAgZGl2aXNpID0gYygiRFMiLCJCQSIsIkJBIiwiREEiLCJEQSIpLCBzdHJpbmdzQXNGYWN0b3JzID0gRikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIE1lbWJlcmkgTGlzdCBiZXJpc2kgaXRlbSBkaXZpc2kNCg0KcHJpbnQoZGYxX1IpDQpgYGANCg0KYGBge3J9DQpkZjJfUiA8LSBkYXRhLmZyYW1lKGtvZGUgPSBjICg2OjEwKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBNZW1iZXJpIGtvZGUgcGFkYSBkYXRhIGZyYW1lIDEtNQ0KICAgICAgICAgICAgICAgICAgICBuYW1hID0gYygiSWJldGgiLCJTb2ZpZSIsIkFiZWQiLCJHYWJ5IiwiS2V2aW4iKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgTWVtYmVyaSBMaXN0IGJlcmlzaSBpdGVtIG5hbWENCiAgICAgICAgICAgICAgICAgICAgZ2FqaSA9IGMoIjUzMCIsIjY1MCIsIjU4MCIsIjUzOSIsIjc4MCIpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIE1lbWJlcmkgTGlzdCBiZXJpc2kgaXRlbSBnYWppDQogICAgICAgICAgICAgICAgICAgIG11bGFpX2tlcmphID0gYXMuRGF0ZShjKCIyMDIyLTAzLTIxIiwiMjAyMi0wMS0xMiIsIjIwMjItMTItMjAiLCIyMDIyLTA5LTAyIiwiMjAyMi0wNi0yMSIpKSwgIyBNZW1iZXJpIExpc3QgYmVyaXNpIGl0ZW0gdGFuZ2dhbA0KICAgICAgICAgICAgICAgICAgICBkaXZpc2kgPSBjKCJMYXd5ZXIiLCJMYXd5ZXIiLCJCQSIsIkFjdHVhcmllcyIsIkFjdHVhcmllcyIpLCBzdHJpbmdzQXNGYWN0b3JzID0gRikgICAgICAgICAgICMgTWVtYmVyaSBMaXN0IGJlcmlzaSBpdGVtIGRpdmlzaQ0KDQpwcmludChkZjJfUikNCmBgYA0KDQpgYGB7cn0NCnR5cGVvZihkZjFfUikgICAgICAgICAgICAgICAgICAgICAgICAjIENlayB0aXBlIGRhdGENCmBgYA0KYGBge3J9DQpjbGFzcyhkZjFfUikgICAgICAgICAgICAgICAgICAgICAgICAgIyBDZWsgdGlwZSBkYXRhDQpgYGANCmBgYHtyfQ0KZGYxX1JbMiw0XSAgICAgICAgICAgICAgICAgICAgICAgICAgICMgRWtzdHJhayBlbGVtZW4gZGkgYmFyaXMga2UtMiBkYW4ga29sb20ga2UtNA0KYGBgDQpgYGB7cn0NCmRmMV9SJG5hbWEgICAgICAgICAgICAgICAgICAgICAgICAgICAjIEVrc3RyYWsgc3Blc2lmaWsga29sb20gKCduYW1hJykNCmBgYA0KYGBge3J9DQpkZjFfUlssYygnZ2FqaScsJ2RpdmlzaScpXSAgICAgICAgICAjIEVrc3RyYWsgc3Blc2lmaWsga29sb20gKCdnYWppJywnZGl2aXNpJykNCmBgYA0KYGBge3J9DQpkZjFfUlsgLDE6M10gICAgICAgICAgICAgICAgICAgICAgICMgRWtzdHJhayAzIGJhcmlzIHBlcnRhbWEgZGYxX1INCmBgYA0KDQpgYGB7cn0NCmRmMV9SWzE6MiwgXSAgICAgICAgICAgICAgICAgICAgICAgIyBFa3N0cmFrIDIga29sb20gcGVydGFtYSBkZjFfUg0KYGBgDQoNCmBgYHtyfQ0Kc3Vic2V0KGRmMV9SLCBzZWxlY3Q9YygxOjUpKSAgICAgICAjIEVrc3RyYWsga29sb20gMSBzYW1wYWkga29sb20gNQ0KYGBgDQoNCmBgYHtyfQ0Kc3Vic2V0KGRmMV9SLCBzZWxlY3Q9YygyLDMpKSAgICAgICMgRWtzdHJhayBrb2xvbSB0ZXJ0ZW50dQ0KYGBgDQoNCmBgYHtyfQ0Kc3Vic2V0KGRmMV9SLCBzZWxlY3QgPSBkaXZpc2kpICAgICMgRWtzdHJhayBzcGVzaWZpayBrb2xvbSBkaXZpc2kNCmBgYA0KDQpgYGB7cn0NCnN1YnNldChkZjFfUiwgc2VsZWN0ID0gNCkgICAgICAgICAjIEVrc3RyYWsgc3Blc2lmaWsga29sb20gNA0KYGBgDQoNCmBgYHtyfQ0Kc3VtbWFyeShkZjFfUikNCmBgYA0KIyBTb2FsIG5vbW9yIDUNCg0KIyMgQnVhdGxhaCBvcGVyYXNpIEdhbnRpIE5hbWEgVmFyaWFiZWwgcGFkYSBzdWF0dSBEYXRhIEZyYW1lIGRlbmdhbiBtZW5nZ3VuYWthbiBSDQpgYGB7cn0NCmRmMl9SPC1kZjFfUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIE1lcnViYWggbmFtYSBkYXRhIGZyYW1lIGRmMV9SIG1lbmphZGkgZGYyX1INCm5hbWVzKGRmMl9SKTwtYygiS29kZSIsICAgICAgICAgICAgICAgICAgICAgICAjIE1lcnViYWggbmFtYSB2YXJpYWJsZSBwYWRhIGRhdGEgZnJhbWUgZGYyX1INCiAgICAgICAgICAgICAgICAgICAiTmFtYSIsDQogICAgICAgICAgICAgICAgICAgIkdhamkiLA0KICAgICAgICAgICAgICAgICAgICJNdWxhaSBCZWtlcmphIiwNCiAgICAgICAgICAgICAgICAgICAiRGl2aXNpIikNCg0KcHJpbnQoZGYyX1IpDQpgYGANCg0K