Algoritma & Struktur Data

~ Ujian Tengah Semester ~


Kontak : \(\downarrow\)
Email
Instagram https://www.instagram.com/fe_nw/
RPubs https://rpubs.com/ferdnw/

Kasus 1

Asumsikan Anda telah mengumpulkan beberapa kumpulan data dari perusahaan ABC Property seperti yang dapat kita lihat pada tabel berikut:

Id             <- (1:10000)
Marketing_Name <- rep(c("Angel","Sherly","Vanessa","Irene","Julian",
                        "Jeffry","Nikita","Kefas","Siana","Lala",
                        "Fallen","Ardifo","Kevin","Juen","Jerrel",
                        "Imelda","Widi","Theodora","Elvani","Jonathan",
                        "Sofia","Abraham","Siti","Niko","Sefli",
                        "Bene", "Diana", "Pupe", "Andi", "Tatha",
                        "Endri", "Monika", "Hans", "Debora","Hanifa",
                        "James", "Jihan", "Friska","Ardiwan", "Bakti",
                        "Anthon","Amry", "Wiwik", "Bastian", "Budi",
                        "Leo","Simon","Matius","Arry", "Eliando"), 200)
Work_Exp       <- rep(c(1.3,2.4,2.5,3.6,3.7,4.7,5.7,6.7,7.7,7.3,
                        5.3,5.3,10,9.3,3.3,3.3,3.4,3.4,3.5,5.6,
                        3.5,4.6,4.6,5.7,6.2,4.4,6.4,6.4,3.5,7.5,
                        4.6,3.7,4.7,4.3,5.2,6.3,7.4,2.4,3.4,8.2,
                        6.4,7.2,1.5,7.5,10,4.5,6.5,7.2,7.1,7.6),200)
City           <- sample(c("Jakarta","Bogor","Depok","Tengerang","Bekasi"),10000, replace = T)
Cluster        <- sample(c("Victoria","Palmyra","Winona","Tiara", "Narada",
                           "Peronia","Lavesh","Alindra","Sweethome", "Asera",
                           "Teradamai","Albasia", "Adara","Neon","Arana",
                           "Asoka", "Primadona", "Mutiara","Permata","Alamanda" ), 10000, replace=T)
Price          <- sample(c(7000:15000),10000, replace = T)
Date_Sales     <- sample(seq(as.Date("2018/01/01"), by = "day", length.out = 1000),10000, replace = T)
Advertisement  <- sample(c(1:20), 10000, replace = T)
Data           <- data.frame(Id, 
                             Marketing_Name,
                             Work_Exp,
                             City,
                             Cluster,
                             Price,
                             Date_Sales,
                             Advertisement)
library(DT)
datatable(Data)

Soal 1

Kategorikan variabel Harga pada dataset di atas menjadi tiga kelompok sebagai berikut:

  • \(\text{High} > 12000\)
  • \(10000 \le \text{Medium} \le 12000\)
  • \(\text{Low} < 10000\)

Tetapkan ke dalam variabel baru yang disebut Kelas dengan menggunakan fungsi kontrol If, else if, dan else.

R

# tuliskan koding R kalian disini
x= Data$Price
y = ifelse((x>12000),print('High'), ifelse((x>=10000 & x<=12000), print('Medium'), print('Low')))
## [1] "High"
## [1] "Medium"
## [1] "Low"
Data$Classes = y
datatable(Data)

Soal 2

Kategorikan variabel Harga pada dataset di atas menjadi enam kelompok sebagai berikut:

  • Booking_fee nya 5 % jika \(\text{Price} < 8000\)
  • Booking_fee nya 6 % jika \(8000 \le \text{Price} < 9000\)
  • Booking_fee nya 7 % jika \(9000 \le \text{Price} < 10000\)
  • Booking_fee nya 8 % jika \(10000 \le \text{Price} < 11000\)
  • Booking_fee nya 9 % jika \(11000 \le \text{Price} < 13000\)
  • Booking_fee nya 10 % jika \(13000 \le \text{Price} \le 15000\)

Tetapkan ke dalam variabel baru yang disebut Booking_fee dengan menggunakan fungsi kontrol If, else if, dan else.

R

k = Data$Price
l = ifelse((k<8000), 5/100*Data$Price, ifelse((k>=8000 & k<9000),6/100*Data$Price, ifelse((k>=9000 & k<10000), 7/100*Data$Price ,ifelse((k>= 10000 & k<11000), 8/100*Data$Price, ifelse ((k>=11000 & k<13000), 9/100*Data$Price,1/10*Data$Price))) ))

Data$BookingFee = l
Data

Soal 3

Menurut kumpulan data akhir yang telah Anda buat pada soal no 2, saya berasumsi bahwa Anda telah bekerja sebagai pemasaran di perusahaan ABC Property, bagaimana Anda dapat mengumpulkan semua informasi tentang penjualan Anda dengan menggunakan pernyataan for.

R

library(DT)

z=for(x  in "Irene" ){print(subset(Data,subset=(Marketing_Name== x)))}
##        Id Marketing_Name Work_Exp      City   Cluster Price Date_Sales
## 4       4          Irene      3.6   Jakarta     Adara  9188 2018-10-07
## 54     54          Irene      3.6     Depok   Peronia 10411 2019-09-21
## 104   104          Irene      3.6    Bekasi     Arana 14044 2019-01-20
## 154   154          Irene      3.6    Bekasi  Alamanda 11762 2019-12-08
## 204   204          Irene      3.6     Depok     Asoka 13827 2018-06-12
## 254   254          Irene      3.6   Jakarta   Mutiara 13603 2019-04-24
## 304   304          Irene      3.6    Bekasi Teradamai  9074 2018-01-29
## 354   354          Irene      3.6    Bekasi     Asoka  7163 2020-02-02
## 404   404          Irene      3.6    Bekasi     Asera 13816 2018-07-11
## 454   454          Irene      3.6     Bogor Teradamai 12918 2019-09-07
## 504   504          Irene      3.6   Jakarta    Narada  8365 2020-09-11
## 554   554          Irene      3.6 Tengerang Teradamai 14902 2018-09-25
## 604   604          Irene      3.6     Depok     Arana 12190 2018-04-24
## 654   654          Irene      3.6     Bogor     Adara  9155 2018-06-14
## 704   704          Irene      3.6    Bekasi   Albasia 11558 2019-03-26
## 754   754          Irene      3.6   Jakarta    Narada 12181 2019-12-13
## 804   804          Irene      3.6   Jakarta     Arana  7203 2018-07-20
## 854   854          Irene      3.6     Bogor     Asoka 10741 2020-07-23
## 904   904          Irene      3.6     Bogor Sweethome  7678 2018-06-22
## 954   954          Irene      3.6     Depok    Winona 13314 2018-03-02
## 1004 1004          Irene      3.6 Tengerang   Albasia 12225 2018-03-28
## 1054 1054          Irene      3.6 Tengerang   Albasia 11273 2019-09-01
## 1104 1104          Irene      3.6 Tengerang   Permata 14579 2019-01-25
## 1154 1154          Irene      3.6 Tengerang     Adara 13782 2020-06-02
## 1204 1204          Irene      3.6 Tengerang    Lavesh 11476 2018-08-01
## 1254 1254          Irene      3.6     Bogor     Adara 11054 2018-08-26
## 1304 1304          Irene      3.6     Depok   Albasia 11651 2020-04-05
## 1354 1354          Irene      3.6     Bogor     Asoka 10230 2018-04-14
## 1404 1404          Irene      3.6   Jakarta Primadona 11482 2018-03-14
## 1454 1454          Irene      3.6     Bogor   Permata  7890 2019-12-10
## 1504 1504          Irene      3.6   Jakarta     Adara 13705 2019-07-22
## 1554 1554          Irene      3.6     Depok   Peronia  7233 2020-05-06
## 1604 1604          Irene      3.6 Tengerang     Tiara 13849 2020-06-08
## 1654 1654          Irene      3.6     Depok   Permata 11249 2018-07-25
## 1704 1704          Irene      3.6 Tengerang    Winona 14119 2019-08-10
## 1754 1754          Irene      3.6   Jakarta     Tiara 11038 2018-04-29
## 1804 1804          Irene      3.6     Bogor Sweethome 12470 2018-09-09
## 1854 1854          Irene      3.6   Jakarta     Arana 13848 2019-09-08
## 1904 1904          Irene      3.6     Bogor     Tiara 14019 2018-11-21
## 1954 1954          Irene      3.6     Depok      Neon 14537 2020-01-22
## 2004 2004          Irene      3.6 Tengerang     Asera 12382 2020-03-13
## 2054 2054          Irene      3.6     Depok   Albasia 14826 2019-11-15
## 2104 2104          Irene      3.6 Tengerang    Winona  9905 2018-04-01
## 2154 2154          Irene      3.6   Jakarta      Neon  8521 2020-08-23
## 2204 2204          Irene      3.6    Bekasi Primadona 12178 2018-04-26
## 2254 2254          Irene      3.6    Bekasi   Peronia 10396 2018-06-30
## 2304 2304          Irene      3.6   Jakarta     Asoka 10373 2018-02-21
## 2354 2354          Irene      3.6 Tengerang   Palmyra 13481 2018-12-19
## 2404 2404          Irene      3.6    Bekasi     Arana  9404 2020-02-24
## 2454 2454          Irene      3.6 Tengerang   Mutiara 13956 2018-10-21
## 2504 2504          Irene      3.6     Depok  Victoria 12189 2020-04-08
## 2554 2554          Irene      3.6     Depok Teradamai 12372 2018-09-11
## 2604 2604          Irene      3.6 Tengerang      Neon  8145 2018-03-15
## 2654 2654          Irene      3.6     Depok   Permata 10473 2019-02-23
## 2704 2704          Irene      3.6 Tengerang   Alindra  7889 2018-02-27
## 2754 2754          Irene      3.6    Bekasi     Adara 13949 2019-07-03
## 2804 2804          Irene      3.6     Depok   Mutiara 12752 2018-05-22
## 2854 2854          Irene      3.6   Jakarta    Lavesh 13272 2019-12-19
## 2904 2904          Irene      3.6     Depok   Permata  8643 2019-01-06
## 2954 2954          Irene      3.6     Bogor   Palmyra 14491 2018-03-20
## 3004 3004          Irene      3.6     Bogor  Victoria  9148 2018-03-06
## 3054 3054          Irene      3.6     Depok   Alindra 10143 2019-10-22
## 3104 3104          Irene      3.6    Bekasi   Albasia 11148 2019-01-08
## 3154 3154          Irene      3.6   Jakarta   Albasia  7394 2019-07-08
## 3204 3204          Irene      3.6     Depok     Adara  9878 2019-04-13
## 3254 3254          Irene      3.6 Tengerang   Permata 14711 2018-02-25
## 3304 3304          Irene      3.6   Jakarta Primadona 11424 2020-04-01
## 3354 3354          Irene      3.6    Bekasi   Permata 11749 2020-09-11
## 3404 3404          Irene      3.6     Depok   Palmyra  7344 2018-02-04
## 3454 3454          Irene      3.6   Jakarta    Winona 11294 2018-07-06
## 3504 3504          Irene      3.6 Tengerang   Alindra 11284 2020-05-08
## 3554 3554          Irene      3.6 Tengerang   Albasia 13889 2019-04-22
## 3604 3604          Irene      3.6     Bogor   Mutiara 11393 2020-04-21
## 3654 3654          Irene      3.6     Bogor Sweethome  9716 2020-02-19
## 3704 3704          Irene      3.6   Jakarta     Asoka 13360 2019-08-20
## 3754 3754          Irene      3.6 Tengerang     Adara 14261 2019-09-06
## 3804 3804          Irene      3.6    Bekasi    Narada 12999 2019-05-22
## 3854 3854          Irene      3.6    Bekasi    Winona 12390 2018-09-14
## 3904 3904          Irene      3.6     Bogor   Peronia  9484 2019-03-25
## 3954 3954          Irene      3.6   Jakarta     Arana 13274 2020-05-19
## 4004 4004          Irene      3.6     Depok   Peronia 12849 2019-12-17
## 4054 4054          Irene      3.6     Depok     Tiara 12054 2020-09-26
## 4104 4104          Irene      3.6 Tengerang   Permata  8261 2018-08-28
## 4154 4154          Irene      3.6    Bekasi     Asoka 14057 2018-09-08
## 4204 4204          Irene      3.6     Depok   Permata  8610 2020-03-14
## 4254 4254          Irene      3.6     Bogor     Asoka 13041 2018-08-01
## 4304 4304          Irene      3.6     Depok     Adara 10352 2020-09-08
## 4354 4354          Irene      3.6     Depok Primadona 11541 2019-01-09
## 4404 4404          Irene      3.6    Bekasi Teradamai  9997 2018-03-29
## 4454 4454          Irene      3.6   Jakarta    Winona 10109 2019-08-30
## 4504 4504          Irene      3.6   Jakarta   Albasia 14703 2019-08-27
## 4554 4554          Irene      3.6    Bekasi Primadona 10562 2018-09-07
## 4604 4604          Irene      3.6     Depok Teradamai  9830 2020-08-04
## 4654 4654          Irene      3.6     Bogor    Winona  9425 2019-10-23
## 4704 4704          Irene      3.6   Jakarta   Palmyra 11036 2020-03-30
## 4754 4754          Irene      3.6     Bogor  Victoria 13339 2018-03-22
## 4804 4804          Irene      3.6     Bogor      Neon  8945 2018-11-18
## 4854 4854          Irene      3.6    Bekasi Primadona  8265 2019-01-26
## 4904 4904          Irene      3.6   Jakarta     Adara 14740 2018-09-07
## 4954 4954          Irene      3.6     Depok      Neon 10775 2020-07-12
## 5004 5004          Irene      3.6 Tengerang Primadona 11235 2018-03-24
## 5054 5054          Irene      3.6    Bekasi  Victoria 11085 2019-05-30
## 5104 5104          Irene      3.6 Tengerang    Narada  8294 2019-01-04
## 5154 5154          Irene      3.6     Depok  Victoria  7033 2019-03-25
## 5204 5204          Irene      3.6    Bekasi   Palmyra  8582 2018-09-09
## 5254 5254          Irene      3.6 Tengerang     Asoka 10734 2018-06-21
## 5304 5304          Irene      3.6    Bekasi    Lavesh  8363 2018-11-18
## 5354 5354          Irene      3.6     Depok     Tiara 14456 2018-09-19
## 5404 5404          Irene      3.6     Bogor   Permata  7286 2018-12-19
## 5454 5454          Irene      3.6   Jakarta     Tiara  9500 2019-03-07
## 5504 5504          Irene      3.6     Bogor  Victoria 14113 2019-06-12
## 5554 5554          Irene      3.6 Tengerang   Permata  9847 2019-09-02
## 5604 5604          Irene      3.6   Jakarta    Winona 11138 2019-06-13
## 5654 5654          Irene      3.6     Bogor Teradamai 11394 2019-06-27
## 5704 5704          Irene      3.6     Depok  Victoria 11451 2019-03-08
## 5754 5754          Irene      3.6   Jakarta   Peronia 10013 2020-09-19
## 5804 5804          Irene      3.6     Bogor   Albasia  8668 2020-06-05
## 5854 5854          Irene      3.6   Jakarta   Albasia 14492 2018-04-17
## 5904 5904          Irene      3.6     Depok    Winona  8306 2018-05-10
## 5954 5954          Irene      3.6     Depok  Victoria 11708 2020-05-12
## 6004 6004          Irene      3.6   Jakarta   Peronia 10149 2019-11-11
## 6054 6054          Irene      3.6     Depok  Victoria 12246 2019-01-09
## 6104 6104          Irene      3.6 Tengerang    Winona 10838 2020-04-13
## 6154 6154          Irene      3.6     Bogor  Victoria 13740 2019-07-20
## 6204 6204          Irene      3.6     Bogor Sweethome 14399 2018-09-04
## 6254 6254          Irene      3.6   Jakarta Sweethome  8862 2019-04-07
## 6304 6304          Irene      3.6   Jakarta    Lavesh 12395 2020-01-22
## 6354 6354          Irene      3.6   Jakarta   Alindra 10454 2018-05-28
## 6404 6404          Irene      3.6     Bogor     Tiara 11398 2018-03-17
## 6454 6454          Irene      3.6   Jakarta   Peronia  9325 2020-01-13
## 6504 6504          Irene      3.6     Bogor   Permata 11853 2018-11-18
## 6554 6554          Irene      3.6   Jakarta    Winona 14758 2018-02-05
## 6604 6604          Irene      3.6     Bogor  Alamanda 13859 2018-07-03
## 6654 6654          Irene      3.6     Depok   Albasia 12744 2020-02-05
## 6704 6704          Irene      3.6     Bogor   Mutiara 14902 2020-08-15
## 6754 6754          Irene      3.6     Bogor   Alindra 10253 2018-01-18
## 6804 6804          Irene      3.6   Jakarta Sweethome  7333 2019-09-26
## 6854 6854          Irene      3.6     Depok     Asera  9223 2018-02-19
## 6904 6904          Irene      3.6 Tengerang     Arana 13158 2020-02-13
## 6954 6954          Irene      3.6   Jakarta   Palmyra 11973 2018-07-28
## 7004 7004          Irene      3.6   Jakarta    Winona 13364 2018-05-03
## 7054 7054          Irene      3.6 Tengerang      Neon  8781 2019-12-06
## 7104 7104          Irene      3.6     Depok   Albasia 14767 2018-01-10
## 7154 7154          Irene      3.6     Bogor   Albasia 13621 2019-12-13
## 7204 7204          Irene      3.6   Jakarta  Victoria 12168 2020-02-07
## 7254 7254          Irene      3.6    Bekasi   Peronia 13988 2019-06-30
## 7304 7304          Irene      3.6     Depok Primadona  9249 2018-04-20
## 7354 7354          Irene      3.6     Bogor    Narada  9539 2018-03-23
## 7404 7404          Irene      3.6   Jakarta   Permata 11117 2020-01-21
## 7454 7454          Irene      3.6    Bekasi Primadona  8316 2019-10-09
## 7504 7504          Irene      3.6   Jakarta    Lavesh 13010 2019-12-05
## 7554 7554          Irene      3.6   Jakarta    Lavesh 14844 2019-12-12
## 7604 7604          Irene      3.6   Jakarta    Winona 13688 2019-07-09
## 7654 7654          Irene      3.6     Bogor     Asoka  7569 2018-08-08
## 7704 7704          Irene      3.6     Depok     Asera  9488 2018-12-02
## 7754 7754          Irene      3.6   Jakarta  Victoria 11816 2019-09-20
## 7804 7804          Irene      3.6    Bekasi    Winona 12367 2018-02-09
## 7854 7854          Irene      3.6    Bekasi   Palmyra  9825 2019-04-17
## 7904 7904          Irene      3.6 Tengerang    Narada 11825 2018-12-12
## 7954 7954          Irene      3.6 Tengerang   Mutiara 12989 2020-05-25
## 8004 8004          Irene      3.6     Depok   Peronia 12088 2018-01-20
## 8054 8054          Irene      3.6   Jakarta     Arana 13393 2019-06-14
## 8104 8104          Irene      3.6   Jakarta     Asera 10476 2018-08-29
## 8154 8154          Irene      3.6 Tengerang     Adara 13083 2018-12-02
## 8204 8204          Irene      3.6   Jakarta  Alamanda 13712 2020-03-08
## 8254 8254          Irene      3.6     Bogor Primadona 13494 2018-01-26
## 8304 8304          Irene      3.6   Jakarta Primadona  8598 2020-03-23
## 8354 8354          Irene      3.6    Bekasi  Victoria 10622 2019-04-02
## 8404 8404          Irene      3.6     Depok  Alamanda 13436 2018-04-24
## 8454 8454          Irene      3.6 Tengerang   Mutiara  8358 2019-11-02
## 8504 8504          Irene      3.6     Depok    Winona  8153 2019-02-22
## 8554 8554          Irene      3.6     Bogor     Asera 11694 2019-06-04
## 8604 8604          Irene      3.6   Jakarta  Alamanda 14861 2020-06-07
## 8654 8654          Irene      3.6   Jakarta     Asera 13668 2019-03-25
## 8704 8704          Irene      3.6    Bekasi   Peronia  7743 2018-09-05
## 8754 8754          Irene      3.6     Bogor   Alindra  7389 2018-11-23
## 8804 8804          Irene      3.6     Bogor     Adara  8612 2020-04-25
## 8854 8854          Irene      3.6     Bogor Primadona 13852 2018-03-07
## 8904 8904          Irene      3.6   Jakarta Sweethome  9930 2018-02-19
## 8954 8954          Irene      3.6     Bogor   Alindra 14328 2018-02-21
## 9004 9004          Irene      3.6     Depok    Lavesh  8170 2018-02-21
## 9054 9054          Irene      3.6 Tengerang   Permata  9806 2020-06-05
## 9104 9104          Irene      3.6 Tengerang     Arana 13882 2020-07-31
## 9154 9154          Irene      3.6 Tengerang     Arana 14126 2020-03-10
## 9204 9204          Irene      3.6     Bogor Teradamai 14652 2019-06-08
## 9254 9254          Irene      3.6     Depok     Asera 14955 2019-08-31
## 9304 9304          Irene      3.6     Depok     Adara 12672 2020-07-09
## 9354 9354          Irene      3.6 Tengerang   Permata  7219 2018-04-06
## 9404 9404          Irene      3.6    Bekasi     Asoka 11678 2019-04-10
## 9454 9454          Irene      3.6     Bogor   Peronia 11555 2019-07-02
## 9504 9504          Irene      3.6    Bekasi     Adara 14757 2018-05-25
## 9554 9554          Irene      3.6     Bogor   Palmyra 13129 2018-04-30
## 9604 9604          Irene      3.6    Bekasi     Asera  7928 2020-06-07
## 9654 9654          Irene      3.6 Tengerang  Victoria 10190 2019-02-11
## 9704 9704          Irene      3.6 Tengerang  Alamanda  8102 2018-07-18
## 9754 9754          Irene      3.6   Jakarta Sweethome 14224 2019-10-21
## 9804 9804          Irene      3.6   Jakarta    Winona  9124 2018-06-30
## 9854 9854          Irene      3.6   Jakarta      Neon 10619 2019-07-26
## 9904 9904          Irene      3.6     Depok     Tiara  7888 2019-08-14
## 9954 9954          Irene      3.6     Depok     Tiara 13760 2018-01-05
##      Advertisement Classes BookingFee
## 4               12     Low     643.16
## 54              20  Medium     832.88
## 104             10    High    1404.40
## 154              5  Medium    1058.58
## 204             12    High    1382.70
## 254              4    High    1360.30
## 304             19     Low     635.18
## 354              3     Low     358.15
## 404              4    High    1381.60
## 454              3    High    1162.62
## 504             10     Low     501.90
## 554              9    High    1490.20
## 604             12    High    1097.10
## 654             19     Low     640.85
## 704             12  Medium    1040.22
## 754              9    High    1096.29
## 804              9     Low     360.15
## 854             10  Medium     859.28
## 904             14     Low     383.90
## 954              3    High    1331.40
## 1004             3    High    1100.25
## 1054             6  Medium    1014.57
## 1104             5    High    1457.90
## 1154            16    High    1378.20
## 1204             6  Medium    1032.84
## 1254            13  Medium     994.86
## 1304            14  Medium    1048.59
## 1354             9  Medium     818.40
## 1404            11  Medium    1033.38
## 1454             3     Low     394.50
## 1504             3    High    1370.50
## 1554             4     Low     361.65
## 1604            20    High    1384.90
## 1654            20  Medium    1012.41
## 1704            17    High    1411.90
## 1754            10  Medium     993.42
## 1804            11    High    1122.30
## 1854            12    High    1384.80
## 1904             2    High    1401.90
## 1954             1    High    1453.70
## 2004             1    High    1114.38
## 2054             8    High    1482.60
## 2104            16     Low     693.35
## 2154             4     Low     511.26
## 2204             1    High    1096.02
## 2254             4  Medium     831.68
## 2304             6  Medium     829.84
## 2354            19    High    1348.10
## 2404             9     Low     658.28
## 2454            14    High    1395.60
## 2504             8    High    1097.01
## 2554            12    High    1113.48
## 2604            11     Low     488.70
## 2654             4  Medium     837.84
## 2704             1     Low     394.45
## 2754             6    High    1394.90
## 2804             4    High    1147.68
## 2854            15    High    1327.20
## 2904             5     Low     518.58
## 2954            14    High    1449.10
## 3004             5     Low     640.36
## 3054            19  Medium     811.44
## 3104            14  Medium    1003.32
## 3154            14     Low     369.70
## 3204             8     Low     691.46
## 3254             5    High    1471.10
## 3304             5  Medium    1028.16
## 3354             1  Medium    1057.41
## 3404            11     Low     367.20
## 3454            10  Medium    1016.46
## 3504            13  Medium    1015.56
## 3554            13    High    1388.90
## 3604            13  Medium    1025.37
## 3654            14     Low     680.12
## 3704            20    High    1336.00
## 3754             7    High    1426.10
## 3804             3    High    1169.91
## 3854             8    High    1115.10
## 3904            17     Low     663.88
## 3954             7    High    1327.40
## 4004             7    High    1156.41
## 4054             8    High    1084.86
## 4104            19     Low     495.66
## 4154            10    High    1405.70
## 4204             5     Low     516.60
## 4254            10    High    1304.10
## 4304             7  Medium     828.16
## 4354             9  Medium    1038.69
## 4404            10     Low     699.79
## 4454            12  Medium     808.72
## 4504            15    High    1470.30
## 4554            12  Medium     844.96
## 4604             6     Low     688.10
## 4654            10     Low     659.75
## 4704            20  Medium     993.24
## 4754            12    High    1333.90
## 4804             3     Low     536.70
## 4854            16     Low     495.90
## 4904            19    High    1474.00
## 4954            16  Medium     862.00
## 5004            18  Medium    1011.15
## 5054             4  Medium     997.65
## 5104             1     Low     497.64
## 5154             4     Low     351.65
## 5204            10     Low     514.92
## 5254            11  Medium     858.72
## 5304             5     Low     501.78
## 5354             4    High    1445.60
## 5404             4     Low     364.30
## 5454            11     Low     665.00
## 5504            15    High    1411.30
## 5554            16     Low     689.29
## 5604             8  Medium    1002.42
## 5654            16  Medium    1025.46
## 5704             8  Medium    1030.59
## 5754             5  Medium     801.04
## 5804            15     Low     520.08
## 5854            10    High    1449.20
## 5904            16     Low     498.36
## 5954             3  Medium    1053.72
## 6004            16  Medium     811.92
## 6054            10    High    1102.14
## 6104             9  Medium     867.04
## 6154            18    High    1374.00
## 6204            17    High    1439.90
## 6254            15     Low     531.72
## 6304             6    High    1115.55
## 6354            17  Medium     836.32
## 6404             6  Medium    1025.82
## 6454             3     Low     652.75
## 6504            16  Medium    1066.77
## 6554            20    High    1475.80
## 6604             5    High    1385.90
## 6654             6    High    1146.96
## 6704            18    High    1490.20
## 6754             2  Medium     820.24
## 6804            18     Low     366.65
## 6854             6     Low     645.61
## 6904            20    High    1315.80
## 6954            18  Medium    1077.57
## 7004             1    High    1336.40
## 7054             5     Low     526.86
## 7104             5    High    1476.70
## 7154            18    High    1362.10
## 7204             3    High    1095.12
## 7254            19    High    1398.80
## 7304             9     Low     647.43
## 7354            14     Low     667.73
## 7404            19  Medium    1000.53
## 7454            12     Low     498.96
## 7504            15    High    1301.00
## 7554            20    High    1484.40
## 7604            12    High    1368.80
## 7654            16     Low     378.45
## 7704             3     Low     664.16
## 7754            13  Medium    1063.44
## 7804            11    High    1113.03
## 7854            12     Low     687.75
## 7904             4  Medium    1064.25
## 7954             5    High    1169.01
## 8004             4    High    1087.92
## 8054            18    High    1339.30
## 8104             2  Medium     838.08
## 8154             1    High    1308.30
## 8204             3    High    1371.20
## 8254            14    High    1349.40
## 8304            10     Low     515.88
## 8354            17  Medium     849.76
## 8404             3    High    1343.60
## 8454            15     Low     501.48
## 8504             6     Low     489.18
## 8554             1  Medium    1052.46
## 8604             5    High    1486.10
## 8654             8    High    1366.80
## 8704             8     Low     387.15
## 8754             2     Low     369.45
## 8804             4     Low     516.72
## 8854             3    High    1385.20
## 8904            19     Low     695.10
## 8954             2    High    1432.80
## 9004            18     Low     490.20
## 9054            20     Low     686.42
## 9104            10    High    1388.20
## 9154             8    High    1412.60
## 9204            16    High    1465.20
## 9254            14    High    1495.50
## 9304             7    High    1140.48
## 9354             5     Low     360.95
## 9404            19  Medium    1051.02
## 9454            18  Medium    1039.95
## 9504            18    High    1475.70
## 9554            18    High    1312.90
## 9604             2     Low     396.40
## 9654             2  Medium     815.20
## 9704            14     Low     486.12
## 9754            12    High    1422.40
## 9804             9     Low     638.68
## 9854             4  Medium     849.52
## 9904             4     Low     394.40
## 9954             9    High    1376.00

Soal 4

Jika Anda akan mendapatkan bonus 2% dari Booking fee per unit sebagai pemasaran dan juga mendapatkan bonus tambahan 1% jika Anda telah bekerja di perusahaan ini selama lebih dari 3 tahun. Silakan hitung total bonus dengan menggunakan pernyataan if, for, dan break.

R

DataIrene = subset(Data, subset=(Marketing_Name == "Irene"))


DataIrene$Bonus= DataIrene$BookingFee*3/100

DataIrene
Totalbonus=sum(DataIrene$Bonus)
Totalbonus
## [1] 5884.546

Soal 5

Pada bagian ini, Anda diharapkan dapa membuat fungsi yang dapat menjawab setiap penyataan dibawah ini dengan melibatkan setiap fungsi kontrol yang dipelajari pada pertemuan 7.

  • Siapa nama marketing pemasaran terbaik?
  • Kota dan Cluster mana yang paling menguntungkan?
  • Hitung total biaya iklan Anda, jika Anda harus membayarnya $4 setiap kali iklan.
  • Hitung rata-rata biaya iklan untuk setiap marketing di Perusahaan tersebut.
  • Hitung Total Pendapatan (dalam Bulanan)

R

 Angel = subset (Data, subset=(Marketing_Name == "Angel")) 
Sherly=subset (Data, subset=(Marketing_Name == "Sherly")) 
Vanessa=subset(Data, subset=(Marketing_Name == "Vanessa"  ))
Irene=subset(Data, subset=(Marketing_Name == "Irene"))
Julian=subset (Data, subset=(Marketing_Name == "Julian"))
Jeffry =subset (Data, subset=(Marketing_Name == "Jeffry")) 
Nikita =subset (Data, subset=(Marketing_Name =="Nikita")) 
Kefas =subset(Data, subset=(Marketing_Name == "Kefas"))
Siana =subset (Data, subset=(Marketing_Name == "Siana")) 
Lala=subset (Data, subset=(Marketing_Name == "Lala")) 
Fallen =subset (Data, subset=(Marketing_Name == "Fallen")) 
Ardifo =subset (Data, subset=(Marketing_Name == "Ardifo"))
Kevin =subset (Data, subset=(Marketing_Name == "Kevin"))
Juen =subset (Data, subset=(Marketing_Name == "Juen")) 
Jerrel =subset (Data, subset=(Marketing_Name == "Jerrel"))
Imelda =subset (Data, subset=(Marketing_Name == "Imelda")) 
Widi =subset(Data, subset=(Marketing_Name == "Widi")) 
Theodor = subset (Data, subset=(Marketing_Name == "Theodor")) 
Elvani =subset (Data, subset=(Marketing_Name == "Elvani")) 
Jonathan = subset (Data, subset=(Marketing_Name == "Jonathan")) 
Sofia =subset (Data, subset=(Marketing_Name == "Sofia")) 
Abraham = subset (Data, subset=(Marketing_Name == "Abraham")) 
Siti =subset (Data, subset=(Marketing_Name == "Siti")) 
Niko =subset(Data, subset=(Marketing_Name == "Niko")) 
Sefli =subset (Data, subset=(Marketing_Name == "Selfi")) 
Bene =subset(Data, subset=(Marketing_Name == "Bene")) 
Diana =subset (Data, subset=(Marketing_Name == "Diana"))
Pupe =subset(Data, subset=(Marketing_Name == "Pupe")) 
Andi =subset (Data, subset=(Marketing_Name == "Andi")) 
Tatha =subset (Data, subset=(Marketing_Name == "Tatha"))
Endri=subset (Data, subset=(Marketing_Name == "Endri")) 
Monika= subset(Data, subset=(Marketing_Name == "Monika")) 
Hans =subset(Data, subset=(Marketing_Name == "Hans")) 
Debora= subset (Data, subset=(Marketing_Name == "Debora")) 
Hanifa= subset (Data, subset=(Marketing_Name == "Hanifa"))
James =subset (Data, subset=(Marketing_Name == "James")) 
Jihan =subset (Data, subset=(Marketing_Name == "Jihan"))
Friska =subset (Data, subset=(Marketing_Name == "Friska")) 
Ardiwan = subset (Data, subset=(Marketing_Name == "Ardiwan")) 
Bakti =subset (Data, subset=(Marketing_Name == "Bakti")) 
Anthon =subset (Data, subset=(Marketing_Name == "Anthon")) 
Amry =subset (Data, subset=(Marketing_Name == "Amry")) 
Wiwik =subset (Data, subset=(Marketing_Name == "Wiwik")) 
Bastian = subset (Data, subset=(Marketing_Name == "Bastian")) 
Budi = subset (Data, subset=(Marketing_Name == "Budi")) 
Leo = subset (Data, subset=(Marketing_Name == "Leo")) 
Simon = subset (Data, subset=(Marketing_Name == "Simon")) 
Matius = subset (Data, subset=(Marketing_Name == "Matius")) 
Arry = subset (Data, subset=(Marketing_Name == "Arry")) 
Eliando = subset (Data, subset=(Marketing_Name == "Eliando")) 
  
Nama_Sales = c("Angel","Sherly","Vanessa","Irene","Julian",
                        "Jeffry","Nikita","Kefas","Siana","Lala",
                        "Fallen","Ardifo","Kevin","Juen","Jerrel",
                        "Imelda","Widi","Theodora","Elvani","Jonathan",
                        "Sofia","Abraham","Siti","Niko","Sefli",
                        "Bene", "Diana", "Pupe", "Andi", "Tatha",
                        "Endri", "Monika", "Hans", "Debora","Hanifa",
                        "James", "Jihan", "Friska","Ardiwan", "Bakti",
                        "Anthon","Amry", "Wiwik", "Bastian", "Budi",
                        "Leo","Simon","Matius","Arry", "Eliando")
propertysold = c(sum(Angel$Price), sum(Sherly$Price), sum(Vanessa$Price), sum(Irene$Price),
sum(Julian$Price), sum (Jeffry$Price), sum(Nikita$Price), sum(Kefas$Price), sum(Siana$Price), sum(Lala$Price), sum(Fallen$Price), sum(Ardifo$Price), sum(Kevin$Price), sum (Juen$Price), sum(Jerrel$Price), sum(Imelda$Price), sum(Widi$Price), sum(Theodor$Price), sum(Elvani$Price), sum(Jonathan$Price), sum(Sofia$Price), sum(Abraham$Price), sum(Siti$Price), sum(Niko$Price), sum(Sefli$Price), sum(Bene$Price), sum( Diana$Price), sum (Pupe$Price), sum(Andi$Price), sum( Tatha$Price), sum(Endri$Price), sum( Monika$Price), sum( Hans$Price), sum( Debora$Price), sum(Hanifa$Price), sum (James$Price), sum( Jihan$Price), sum( Friska$Price), sum(Ardiwan$Price), sum(Bakti$Price), sum(Anthon$Price), sum(Amry$Price), sum( Wiwik$Price), sum( Bastian$Price), sum( Budi$Price), sum (Leo$Price), sum(Simon$Price), sum(Matius$Price), sum(Arry$Price), sum( Eliando$Price))

datamarketing= data.frame(Nama_Sales, propertysold)

datamarketing
# Best Marketing
datamarketing[which.max(datamarketing$propertysold),]
#Kota dan Cluster Paling Menguntungkan
profitable= Data[,c("City","Cluster","Price")]

profitable[which.max(profitable$Price),]
#Total Biaya Sdvertisment irene
costforad = subset(Data, subset=(Marketing_Name == "Irene"))

adscost = ( costforad$Advertisement * 4)

Totalcost=print(sum(adscost))
## [1] 7992
# Rata-Rata cost iklan
Namasales = c("Angel","Sherly","Vanessa","Irene","Julian",
                        "Jeffry","Nikita","Kefas","Siana","Lala",
                        "Fallen","Ardifo","Kevin","Juen","Jerrel",
                        "Imelda","Widi","Theodora","Elvani","Jonathan",
                        "Sofia","Abraham","Siti","Niko","Sefli",
                        "Bene", "Diana", "Pupe", "Andi", "Tatha",
                        "Endri", "Monika", "Hans", "Debora","Hanifa",
                        "James", "Jihan", "Friska","Ardiwan", "Bakti",
                        "Anthon","Amry", "Wiwik", "Bastian", "Budi",
                        "Leo","Simon","Matius","Arry", "Eliando")
ratacost = for (x in Namasales) {
  f= subset ( Data, subset=(Marketing_Name == x ))
  c=sum(f$Advertisement * 4)
  print (cat(sum(c)/length(f$Id), (cat(x, 'Rata-rata pengeluaran untuk iklan'))))}
## Angel Rata-rata pengeluaran untuk iklan42.42NULL
## Sherly Rata-rata pengeluaran untuk iklan40.08NULL
## Vanessa Rata-rata pengeluaran untuk iklan42.78NULL
## Irene Rata-rata pengeluaran untuk iklan39.96NULL
## Julian Rata-rata pengeluaran untuk iklan41.64NULL
## Jeffry Rata-rata pengeluaran untuk iklan41.76NULL
## Nikita Rata-rata pengeluaran untuk iklan40.24NULL
## Kefas Rata-rata pengeluaran untuk iklan42.06NULL
## Siana Rata-rata pengeluaran untuk iklan40.86NULL
## Lala Rata-rata pengeluaran untuk iklan44.38NULL
## Fallen Rata-rata pengeluaran untuk iklan41.42NULL
## Ardifo Rata-rata pengeluaran untuk iklan43.5NULL
## Kevin Rata-rata pengeluaran untuk iklan41.28NULL
## Juen Rata-rata pengeluaran untuk iklan43.34NULL
## Jerrel Rata-rata pengeluaran untuk iklan42.8NULL
## Imelda Rata-rata pengeluaran untuk iklan41.22NULL
## Widi Rata-rata pengeluaran untuk iklan40.04NULL
## Theodora Rata-rata pengeluaran untuk iklan41.88NULL
## Elvani Rata-rata pengeluaran untuk iklan43.18NULL
## Jonathan Rata-rata pengeluaran untuk iklan43.54NULL
## Sofia Rata-rata pengeluaran untuk iklan41.32NULL
## Abraham Rata-rata pengeluaran untuk iklan41.38NULL
## Siti Rata-rata pengeluaran untuk iklan41.68NULL
## Niko Rata-rata pengeluaran untuk iklan43.78NULL
## Sefli Rata-rata pengeluaran untuk iklan41.9NULL
## Bene Rata-rata pengeluaran untuk iklan42.22NULL
## Diana Rata-rata pengeluaran untuk iklan42.82NULL
## Pupe Rata-rata pengeluaran untuk iklan42.36NULL
## Andi Rata-rata pengeluaran untuk iklan41.82NULL
## Tatha Rata-rata pengeluaran untuk iklan43.04NULL
## Endri Rata-rata pengeluaran untuk iklan42.74NULL
## Monika Rata-rata pengeluaran untuk iklan44.18NULL
## Hans Rata-rata pengeluaran untuk iklan42.96NULL
## Debora Rata-rata pengeluaran untuk iklan41.9NULL
## Hanifa Rata-rata pengeluaran untuk iklan38.72NULL
## James Rata-rata pengeluaran untuk iklan40.42NULL
## Jihan Rata-rata pengeluaran untuk iklan42.46NULL
## Friska Rata-rata pengeluaran untuk iklan41.94NULL
## Ardiwan Rata-rata pengeluaran untuk iklan41.42NULL
## Bakti Rata-rata pengeluaran untuk iklan41.88NULL
## Anthon Rata-rata pengeluaran untuk iklan42.5NULL
## Amry Rata-rata pengeluaran untuk iklan41.18NULL
## Wiwik Rata-rata pengeluaran untuk iklan42.28NULL
## Bastian Rata-rata pengeluaran untuk iklan42.3NULL
## Budi Rata-rata pengeluaran untuk iklan42.4NULL
## Leo Rata-rata pengeluaran untuk iklan42.36NULL
## Simon Rata-rata pengeluaran untuk iklan41.68NULL
## Matius Rata-rata pengeluaran untuk iklan39.46NULL
## Arry Rata-rata pengeluaran untuk iklan44.76NULL
## Eliando Rata-rata pengeluaran untuk iklan43.94NULL
# Pendapatan

revenue= (sum(Data$Price)-(sum(Data$Advertisment) * 4))/((max(Data$Work_Exp))*12)

revenue
## [1] 919810.5

Kasus 2

Misalkan Anda memiliki proyek riset pasar untuk mempertahankan beberapa pelanggan potensial di perusahaan Anda. Mari kita asumsikan Anda bekerja di perusahaan asuransi ABC. Untuk melakukannya, Anda ingin mengumpulkan kumpulan data berikut:

  • Marital_Status : menetapkan status perkawinan acak (“Ya”, “Tidak”)
  • Address : berikan alamat acak (JABODETABEK)
  • Work_Location : menetapkan lokasi kerja secara acak (JABODETABEK)
  • Age : menetapkan urutan angka acak (dari 19 hingga 60)
  • Academic : menetapkan tingkat akademik acak (“J.School”, “H.School”, “Sarjana”, “Magister”, “Phd”)
  • Job : 10 pekerjaan acak untuk setiap tingkat akademik
  • Grade : 5 nilai acak untuk setiap Pekerjaan
  • Income : tetapkan pendapatan yang mungkin untuk setiap Pekerjaan
  • Spending : tetapkan kemungkinan pengeluaran untuk setiap Pekerjaan
  • Number_of_children: menetapkan nomor acak di antara 0 dan 10 (sesuai dengan status perkawinan)
  • Private_vehicle : menetapkan kemungkinan kendaraan pribadi untuk setiap orang (“Mobil”, “sepeda motor”, “Umum”)
  • Home : “Sewa”, “Milik”, “Kredit”

Soal 1

Tolong berikan saya kumpulan data tentang informasi 50000 pelanggan yang mengacu pada setiap variabel di atas!

R

marital_status <- sample(c("Yes", "No"), 50000, replace = T) 
Address <-sample(c("Jakarta", "Bogor", "Depok", "Tangerang", "Bekasi"),50000, replace=T)
Work_Location <-sample(c("Jakarta", "Bogor", "Depok", "Tangerang", "Bekasi"),50000, replace=T)
Age <-floor (runif(50000,19,60))
Academic <-sample(c("J.School", "H.School", "Bachelor Degree", "Master",
"Phd"), 50000, replace = T) 





Grade <-sample(c("S+", "S", "A+", "A",
"B"), 50000, replace=T) 

Number_of_children <- ifelse(marital_status =="Yes", sample((c(0:10)), length(marital_status =="Yes"), replace=T), "0")
Private_vehicle <- sample(c("Car", "Motorcycle", "Public"),
50000, replace=T)
Home <- sample(c("Rent", "Own", "Credit"), 50000, replace=T) 

Datasoal2 <-data.frame (marital_status, Address, Work_Location, Age, Academic, Grade, Number_of_children, Private_vehicle, Home)

library(data.table)
data.table(Datasoal2)
Job <- ifelse (Datasoal2$Academic == "J.School", sample(c("Cleaning Service", "Security Guard", "Waiter")),
ifelse(Datasoal2$Academic == "H.School", sample(c("Waiter", "Security Guard")), ifelse(Datasoal2$Academic == "Bachelor Degree", sample(c("CEO", "Teacher")), ifelse(Datasoal2$Academic == "Master",sample(c("Board Director", "Actuarist", "Software Enginering")), sample(c("Head of Research", "Teacher"))
))))

Datasoal2 = data.frame(marital_status, Address, Work_Location, Age, Academic,Job, Grade, Number_of_children, Private_vehicle, Home)

Income <- ifelse (Datasoal2$Job == "Cleaning Service", sample(c(5000:6000)),
ifelse(Datasoal2$Job == "Clerk", sample(c(4500:5500)), ifelse(Datasoal2$Job == "Waiter", sample(c(4500:6000)), ifelse(Datasoal2$Job == "Teacher",sample(c(6000:9000)), ifelse (Datasoal2$Job == "Actuarist", sample(c(8500:13000)), ifelse(Datasoal2$ Job == "Software Enginering", sample(c(8000:12000)), ifelse (Datasoal2$Job =="Security Guard ", sample(c(5000:5500)), ifelse (Datasoal2$Job== "Head of Research", sample(c(9000:14000)), ifelse(Datasoal2$Job == "CEO", sample(c(13000:20000)), sample(c(11000:16000))
)))))))))

Spending <- ifelse (Datasoal2$Job == "Cleaning Service", sample(c(3000:4500)),
ifelse(Datasoal2$Job == "Clerk", sample(c(2200:5100)), ifelse(Datasoal2$Job == "Waiter", sample(c(3000:5000)), ifelse(Datasoal2$Job == "Teacher",sample(c(4000:7500)), ifelse (Datasoal2$Job == "Actuarist", sample(c(3500:9000)), ifelse(Datasoal2$ Job == "Software Enginering", sample(c(5000:7500)), ifelse (Datasoal2$Job =="Security Guard ", sample(c(4000:4500)), ifelse (Datasoal2$Job== "Head of Research", sample(c(6000:10500)), ifelse(Datasoal2$Job == "CEO", sample(c(6000:10000)), sample(c(5500:11000))
)))))))))

Datasoal2$Job=Job
Datasoal2$Income = Income
Datasoal2$Spending = Spending

Datasoal2

Soal 2

Ringkasan Statistik penting seperti apa yang bisa Anda dapatkan dari kumpulan data Anda?

R

summary(Datasoal2)
##  marital_status       Address          Work_Location           Age       
##  Length:50000       Length:50000       Length:50000       Min.   :19.00  
##  Class :character   Class :character   Class :character   1st Qu.:29.00  
##  Mode  :character   Mode  :character   Mode  :character   Median :39.00  
##                                                           Mean   :38.98  
##                                                           3rd Qu.:49.00  
##                                                           Max.   :59.00  
##    Academic             Job               Grade           Number_of_children
##  Length:50000       Length:50000       Length:50000       Length:50000      
##  Class :character   Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character   Mode  :character  
##                                                                             
##                                                                             
##                                                                             
##  Private_vehicle        Home               Income         Spending    
##  Length:50000       Length:50000       Min.   : 4500   Min.   : 3000  
##  Class :character   Class :character   1st Qu.: 6224   1st Qu.: 4619  
##  Mode  :character   Mode  :character   Median : 9869   Median : 6398  
##                                        Mean   :10067   Mean   : 6455  
##                                        3rd Qu.:13091   3rd Qu.: 7968  
##                                        Max.   :20000   Max.   :11000

`

Soal 3

Menurut perhitungan dan analisis Anda, pelanggan mana yang potensial untuk Anda pertahankan?

R

Datasoal2$NetWorth = Datasoal2$Income-Datasoal2$Spending

Datasoal2
#Potential untuk dipertahankan
subset(Datasoal2, NetWorth>= 7000)

Referensi

  1. ref 1
  2. ref 2
  3. ref 3
LS0tDQp0aXRsZTogIkFsZ29yaXRtYSAmIFN0cnVrdHVyIERhdGEiDQpzdWJ0aXRsZTogIn4gVWppYW4gVGVuZ2FoIFNlbWVzdGVyIH4iDQphdXRob3I6ICJGZXJkaW5hbmQgTmF0aGFuaWVsIFdpZGpheWEsICgyMDIxNDkyMDAwNikiDQpkYXRlOiAgImByIGZvcm1hdChTeXMuRGF0ZSgpLCAnJUIgJWQsICVZJylgIg0Kb3V0cHV0Og0KICBybWRmb3JtYXRzOjpyb2JvYm9vazogICAjIGh0dHBzOi8vZ2l0aHViLmNvbS9qdWJhL3JtZGZvcm1hdHMNCiAgICBzZWxmX2NvbnRhaW5lZDogdHJ1ZQ0KICAgIHRodW1ibmFpbHM6IHRydWUNCiAgICBsaWdodGJveDogdHJ1ZQ0KICAgIGdhbGxlcnk6IHRydWUNCiAgICBsaWJfZGlyOiBsaWJzDQogICAgZGZfcHJpbnQ6ICJwYWdlZCINCiAgICBjb2RlX2ZvbGRpbmc6ICJzaG93Ig0KICAgIGNvZGVfZG93bmxvYWQ6IHllcw0KICAgIGNzczogInN0eWxlLmNzcyINCg0KLS0tDQoNCmBgYHtyIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoY2xhc3Muc291cmNlID0gIm5vY29weSIsDQogICAgICAgICAgICAgICAgICAgICAgY2xhc3Mub3V0cHV0ID0gIm5vY29weSIsDQogICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IEYsDQogICAgICAgICAgICAgICAgICAgICAgd2FybmluZyA9IEYpDQoNCmxpYnJhcnkocmV0aWN1bGF0ZSkNCmxpYnJhcnkoUmNwcCkNCg0KYGBgDQoNCjxicj4NCg0KPGltZyBzdHlsZT0iZmxvYXQ6IHJpZ2h0OyBtYXJnaW46IC01MHB4IDUwcHggMHB4IDUwcHg7IHdpZHRoOjMwJSIgc3JjPSJmb3RvLmpwZyIvPiANCg0KfA0KOi0tLS0gfDotLS0tDQoqKktvbnRhayoqfCAqKjogJFxkb3duYXJyb3ckKioNCkVtYWlsfCBmZXJkaW5hbmQud2lkamF5YUBzdHVkZW50Lm1hdGFuYXVuaXZlcnNpdHkuYWMuaWQNCkluc3RhZ3JhbSB8IGh0dHBzOi8vd3d3Lmluc3RhZ3JhbS5jb20vZmVfbncvIA0KUlB1YnMgIHwgaHR0cHM6Ly9ycHVicy5jb20vZmVyZG53LyANCg0KKioqDQoNCiMgS2FzdXMgMSANCg0KQXN1bXNpa2FuIEFuZGEgdGVsYWggbWVuZ3VtcHVsa2FuIGJlYmVyYXBhIGt1bXB1bGFuIGRhdGEgZGFyaSBwZXJ1c2FoYWFuIGBBQkMgUHJvcGVydHlgIHNlcGVydGkgeWFuZyBkYXBhdCBraXRhIGxpaGF0IHBhZGEgdGFiZWwgYmVyaWt1dDogDQoNCmBgYHtyLCBtZXNzYWdlPUZ9DQpJZCAgICAgICAgICAgICA8LSAoMToxMDAwMCkNCk1hcmtldGluZ19OYW1lIDwtIHJlcChjKCJBbmdlbCIsIlNoZXJseSIsIlZhbmVzc2EiLCJJcmVuZSIsIkp1bGlhbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAiSmVmZnJ5IiwiTmlraXRhIiwiS2VmYXMiLCJTaWFuYSIsIkxhbGEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgIkZhbGxlbiIsIkFyZGlmbyIsIktldmluIiwiSnVlbiIsIkplcnJlbCIsDQogICAgICAgICAgICAgICAgICAgICAgICAiSW1lbGRhIiwiV2lkaSIsIlRoZW9kb3JhIiwiRWx2YW5pIiwiSm9uYXRoYW4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgIlNvZmlhIiwiQWJyYWhhbSIsIlNpdGkiLCJOaWtvIiwiU2VmbGkiLA0KICAgICAgICAgICAgICAgICAgICAgICAgIkJlbmUiLCAiRGlhbmEiLCAiUHVwZSIsICJBbmRpIiwgIlRhdGhhIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICJFbmRyaSIsICJNb25pa2EiLCAiSGFucyIsICJEZWJvcmEiLCJIYW5pZmEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgIkphbWVzIiwgIkppaGFuIiwgIkZyaXNrYSIsIkFyZGl3YW4iLCAiQmFrdGkiLA0KICAgICAgICAgICAgICAgICAgICAgICAgIkFudGhvbiIsIkFtcnkiLCAiV2l3aWsiLCAiQmFzdGlhbiIsICJCdWRpIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICJMZW8iLCJTaW1vbiIsIk1hdGl1cyIsIkFycnkiLCAiRWxpYW5kbyIpLCAyMDApDQpXb3JrX0V4cCAgICAgICA8LSByZXAoYygxLjMsMi40LDIuNSwzLjYsMy43LDQuNyw1LjcsNi43LDcuNyw3LjMsDQogICAgICAgICAgICAgICAgICAgICAgICA1LjMsNS4zLDEwLDkuMywzLjMsMy4zLDMuNCwzLjQsMy41LDUuNiwNCiAgICAgICAgICAgICAgICAgICAgICAgIDMuNSw0LjYsNC42LDUuNyw2LjIsNC40LDYuNCw2LjQsMy41LDcuNSwNCiAgICAgICAgICAgICAgICAgICAgICAgIDQuNiwzLjcsNC43LDQuMyw1LjIsNi4zLDcuNCwyLjQsMy40LDguMiwNCiAgICAgICAgICAgICAgICAgICAgICAgIDYuNCw3LjIsMS41LDcuNSwxMCw0LjUsNi41LDcuMiw3LjEsNy42KSwyMDApDQpDaXR5ICAgICAgICAgICA8LSBzYW1wbGUoYygiSmFrYXJ0YSIsIkJvZ29yIiwiRGVwb2siLCJUZW5nZXJhbmciLCJCZWthc2kiKSwxMDAwMCwgcmVwbGFjZSA9IFQpDQpDbHVzdGVyICAgICAgICA8LSBzYW1wbGUoYygiVmljdG9yaWEiLCJQYWxteXJhIiwiV2lub25hIiwiVGlhcmEiLCAiTmFyYWRhIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJQZXJvbmlhIiwiTGF2ZXNoIiwiQWxpbmRyYSIsIlN3ZWV0aG9tZSIsICJBc2VyYSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAiVGVyYWRhbWFpIiwiQWxiYXNpYSIsICJBZGFyYSIsIk5lb24iLCJBcmFuYSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAiQXNva2EiLCAiUHJpbWFkb25hIiwgIk11dGlhcmEiLCJQZXJtYXRhIiwiQWxhbWFuZGEiICksIDEwMDAwLCByZXBsYWNlPVQpDQpQcmljZSAgICAgICAgICA8LSBzYW1wbGUoYyg3MDAwOjE1MDAwKSwxMDAwMCwgcmVwbGFjZSA9IFQpDQpEYXRlX1NhbGVzICAgICA8LSBzYW1wbGUoc2VxKGFzLkRhdGUoIjIwMTgvMDEvMDEiKSwgYnkgPSAiZGF5IiwgbGVuZ3RoLm91dCA9IDEwMDApLDEwMDAwLCByZXBsYWNlID0gVCkNCkFkdmVydGlzZW1lbnQgIDwtIHNhbXBsZShjKDE6MjApLCAxMDAwMCwgcmVwbGFjZSA9IFQpDQpEYXRhICAgICAgICAgICA8LSBkYXRhLmZyYW1lKElkLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFya2V0aW5nX05hbWUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmtfRXhwLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaXR5LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbHVzdGVyLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmljZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0ZV9TYWxlcywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWR2ZXJ0aXNlbWVudCkNCmxpYnJhcnkoRFQpDQpkYXRhdGFibGUoRGF0YSkNCmBgYA0KDQojIyBTb2FsIDEgey50YWJzZXQgLnRhYnNldC1waWxsc30NCg0KS2F0ZWdvcmlrYW4gdmFyaWFiZWwgYEhhcmdhYCBwYWRhIGRhdGFzZXQgZGkgYXRhcyBtZW5qYWRpIHRpZ2Ega2Vsb21wb2sgc2ViYWdhaSBiZXJpa3V0Og0KDQoqICRcdGV4dHtIaWdofSA+IDEyMDAwJA0KKiAkMTAwMDAgXGxlIFx0ZXh0e01lZGl1bX0gXGxlIDEyMDAwJA0KKiAkXHRleHR7TG93fSA8IDEwMDAwJA0KDQpUZXRhcGthbiBrZSBkYWxhbSB2YXJpYWJlbCBiYXJ1IHlhbmcgZGlzZWJ1dCBgS2VsYXNgIGRlbmdhbiBtZW5nZ3VuYWthbiBmdW5nc2kga29udHJvbCBgSWZgLCBgZWxzZSBpZmAsIGRhbiBgZWxzZWAuDQoNCiMjIyBSDQoNCmBgYHtyfQ0KIyB0dWxpc2thbiBrb2RpbmcgUiBrYWxpYW4gZGlzaW5pDQp4PSBEYXRhJFByaWNlDQp5ID0gaWZlbHNlKCh4PjEyMDAwKSxwcmludCgnSGlnaCcpLCBpZmVsc2UoKHg+PTEwMDAwICYgeDw9MTIwMDApLCBwcmludCgnTWVkaXVtJyksIHByaW50KCdMb3cnKSkpDQoNCkRhdGEkQ2xhc3NlcyA9IHkNCmRhdGF0YWJsZShEYXRhKQ0KYGBgDQoNCg0KDQoNCg0KDQoNCiMjIFNvYWwgMiB7LnRhYnNldCAudGFic2V0LXBpbGxzfQ0KDQpLYXRlZ29yaWthbiB2YXJpYWJlbCBgSGFyZ2FgIHBhZGEgZGF0YXNldCBkaSBhdGFzIG1lbmphZGkgZW5hbSBrZWxvbXBvayBzZWJhZ2FpIGJlcmlrdXQ6DQoNCiogQm9va2luZ19mZWUgbnlhIDUgJSBqaWthICRcdGV4dHtQcmljZX0gPCA4MDAwJA0KKiBCb29raW5nX2ZlZSBueWEgNiAlIGppa2EgJDgwMDAgXGxlIFx0ZXh0e1ByaWNlfSA8IDkwMDAkDQoqIEJvb2tpbmdfZmVlIG55YSA3ICUgamlrYSAkOTAwMCBcbGUgXHRleHR7UHJpY2V9IDwgMTAwMDAkDQoqIEJvb2tpbmdfZmVlIG55YSA4ICUgamlrYSAkMTAwMDAgXGxlIFx0ZXh0e1ByaWNlfSA8IDExMDAwJA0KKiBCb29raW5nX2ZlZSBueWEgOSAlIGppa2EgJDExMDAwIFxsZSBcdGV4dHtQcmljZX0gPCAxMzAwMCQNCiogQm9va2luZ19mZWUgbnlhIDEwICUgamlrYSAkMTMwMDAgXGxlIFx0ZXh0e1ByaWNlfSBcbGUgMTUwMDAkDQoNClRldGFwa2FuIGtlIGRhbGFtIHZhcmlhYmVsIGJhcnUgeWFuZyBkaXNlYnV0IGBCb29raW5nX2ZlZWAgZGVuZ2FuIG1lbmdndW5ha2FuIGZ1bmdzaSBrb250cm9sIGBJZmAsIGBlbHNlIGlmYCwgZGFuIGBlbHNlYC4NCg0KIyMjIFINCg0KYGBge3J9DQprID0gRGF0YSRQcmljZQ0KbCA9IGlmZWxzZSgoazw4MDAwKSwgNS8xMDAqRGF0YSRQcmljZSwgaWZlbHNlKChrPj04MDAwICYgazw5MDAwKSw2LzEwMCpEYXRhJFByaWNlLCBpZmVsc2UoKGs+PTkwMDAgJiBrPDEwMDAwKSwgNy8xMDAqRGF0YSRQcmljZSAsaWZlbHNlKChrPj0gMTAwMDAgJiBrPDExMDAwKSwgOC8xMDAqRGF0YSRQcmljZSwgaWZlbHNlICgoaz49MTEwMDAgJiBrPDEzMDAwKSwgOS8xMDAqRGF0YSRQcmljZSwxLzEwKkRhdGEkUHJpY2UpKSkgKSkNCg0KRGF0YSRCb29raW5nRmVlID0gbA0KRGF0YQ0KYGBgDQoNCg0KDQoNCg0KDQojIyBTb2FsIDMgey50YWJzZXQgLnRhYnNldC1waWxsc30NCg0KTWVudXJ1dCBrdW1wdWxhbiBkYXRhIGFraGlyIHlhbmcgdGVsYWggQW5kYSBidWF0IHBhZGEgc29hbCBubyAyLCBzYXlhIGJlcmFzdW1zaSBiYWh3YSBBbmRhIHRlbGFoIGJla2VyamEgc2ViYWdhaSBwZW1hc2FyYW4gZGkgcGVydXNhaGFhbiBgQUJDIFByb3BlcnR5YCwgYmFnYWltYW5hIEFuZGEgZGFwYXQgbWVuZ3VtcHVsa2FuIHNlbXVhIGluZm9ybWFzaSB0ZW50YW5nIHBlbmp1YWxhbiBBbmRhIGRlbmdhbiBtZW5nZ3VuYWthbiBwZXJueWF0YWFuIGBmb3JgLiANCg0KIyMjIFINCg0KYGBge3J9DQpsaWJyYXJ5KERUKQ0KDQp6PWZvcih4ICBpbiAiSXJlbmUiICl7cHJpbnQoc3Vic2V0KERhdGEsc3Vic2V0PShNYXJrZXRpbmdfTmFtZT09IHgpKSl9DQpgYGANCg0KDQoNCg0KDQojIyBTb2FsIDQgey50YWJzZXQgLnRhYnNldC1waWxsc30NCg0KSmlrYSBBbmRhIGFrYW4gbWVuZGFwYXRrYW4gYm9udXMgMiUgZGFyaSBgQm9va2luZyBmZWVgIHBlciB1bml0IHNlYmFnYWkgcGVtYXNhcmFuIGRhbiBqdWdhIG1lbmRhcGF0a2FuIGJvbnVzIHRhbWJhaGFuIDElIGppa2EgQW5kYSB0ZWxhaCBiZWtlcmphIGRpIHBlcnVzYWhhYW4gaW5pIHNlbGFtYSBsZWJpaCBkYXJpIDMgdGFodW4uIFNpbGFrYW4gaGl0dW5nIHRvdGFsIGJvbnVzIGRlbmdhbiBtZW5nZ3VuYWthbiBwZXJueWF0YWFuIGBpZiwgZm9yLCBkYW4gYnJlYWtgLiAgDQoNCiMjIyBSDQoNCmBgYHtyfQ0KRGF0YUlyZW5lID0gc3Vic2V0KERhdGEsIHN1YnNldD0oTWFya2V0aW5nX05hbWUgPT0gIklyZW5lIikpDQoNCg0KRGF0YUlyZW5lJEJvbnVzPSBEYXRhSXJlbmUkQm9va2luZ0ZlZSozLzEwMA0KDQpEYXRhSXJlbmUNCg0KYGBgDQpgYGB7cn0NCg0KVG90YWxib251cz1zdW0oRGF0YUlyZW5lJEJvbnVzKQ0KVG90YWxib251cw0KYGBgDQoNCg0KDQoNCg0KIyMgU29hbCA1IHsudGFic2V0IC50YWJzZXQtcGlsbHN9DQoNClBhZGEgYmFnaWFuIGluaSwgQW5kYSBkaWhhcmFwa2FuIGRhcGEgbWVtYnVhdCBmdW5nc2kgeWFuZyBkYXBhdCBtZW5qYXdhYiBzZXRpYXAgcGVueWF0YWFuIGRpYmF3YWggaW5pIGRlbmdhbiBtZWxpYmF0a2FuIHNldGlhcCBmdW5nc2kga29udHJvbCB5YW5nIGRpcGVsYWphcmkgcGFkYSBwZXJ0ZW11YW4gNy4NCg0KKiBTaWFwYSBuYW1hIG1hcmtldGluZyBwZW1hc2FyYW4gdGVyYmFpaz8NCiogS290YSBkYW4gQ2x1c3RlciBtYW5hIHlhbmcgcGFsaW5nIG1lbmd1bnR1bmdrYW4/DQoqIEhpdHVuZyB0b3RhbCBiaWF5YSBpa2xhbiBBbmRhLCBqaWthIEFuZGEgaGFydXMgbWVtYmF5YXJueWEgJDQgc2V0aWFwIGthbGkgaWtsYW4uDQoqIEhpdHVuZyByYXRhLXJhdGEgYmlheWEgaWtsYW4gdW50dWsgc2V0aWFwIG1hcmtldGluZyBkaSBQZXJ1c2FoYWFuIHRlcnNlYnV0Lg0KKiBIaXR1bmcgVG90YWwgUGVuZGFwYXRhbiAoZGFsYW0gQnVsYW5hbikgDQoNCiMjIyBSDQoNCmBgYHtyfQ0KIEFuZ2VsID0gc3Vic2V0IChEYXRhLCBzdWJzZXQ9KE1hcmtldGluZ19OYW1lID09ICJBbmdlbCIpKSANClNoZXJseT1zdWJzZXQgKERhdGEsIHN1YnNldD0oTWFya2V0aW5nX05hbWUgPT0gIlNoZXJseSIpKSANClZhbmVzc2E9c3Vic2V0KERhdGEsIHN1YnNldD0oTWFya2V0aW5nX05hbWUgPT0gIlZhbmVzc2EiICApKQ0KSXJlbmU9c3Vic2V0KERhdGEsIHN1YnNldD0oTWFya2V0aW5nX05hbWUgPT0gIklyZW5lIikpDQpKdWxpYW49c3Vic2V0IChEYXRhLCBzdWJzZXQ9KE1hcmtldGluZ19OYW1lID09ICJKdWxpYW4iKSkNCkplZmZyeSA9c3Vic2V0IChEYXRhLCBzdWJzZXQ9KE1hcmtldGluZ19OYW1lID09ICJKZWZmcnkiKSkgDQpOaWtpdGEgPXN1YnNldCAoRGF0YSwgc3Vic2V0PShNYXJrZXRpbmdfTmFtZSA9PSJOaWtpdGEiKSkgDQpLZWZhcyA9c3Vic2V0KERhdGEsIHN1YnNldD0oTWFya2V0aW5nX05hbWUgPT0gIktlZmFzIikpDQpTaWFuYSA9c3Vic2V0IChEYXRhLCBzdWJzZXQ9KE1hcmtldGluZ19OYW1lID09ICJTaWFuYSIpKSANCkxhbGE9c3Vic2V0IChEYXRhLCBzdWJzZXQ9KE1hcmtldGluZ19OYW1lID09ICJMYWxhIikpIA0KRmFsbGVuID1zdWJzZXQgKERhdGEsIHN1YnNldD0oTWFya2V0aW5nX05hbWUgPT0gIkZhbGxlbiIpKSANCkFyZGlmbyA9c3Vic2V0IChEYXRhLCBzdWJzZXQ9KE1hcmtldGluZ19OYW1lID09ICJBcmRpZm8iKSkNCktldmluID1zdWJzZXQgKERhdGEsIHN1YnNldD0oTWFya2V0aW5nX05hbWUgPT0gIktldmluIikpDQpKdWVuID1zdWJzZXQgKERhdGEsIHN1YnNldD0oTWFya2V0aW5nX05hbWUgPT0gIkp1ZW4iKSkgDQpKZXJyZWwgPXN1YnNldCAoRGF0YSwgc3Vic2V0PShNYXJrZXRpbmdfTmFtZSA9PSAiSmVycmVsIikpDQpJbWVsZGEgPXN1YnNldCAoRGF0YSwgc3Vic2V0PShNYXJrZXRpbmdfTmFtZSA9PSAiSW1lbGRhIikpIA0KV2lkaSA9c3Vic2V0KERhdGEsIHN1YnNldD0oTWFya2V0aW5nX05hbWUgPT0gIldpZGkiKSkgDQpUaGVvZG9yID0gc3Vic2V0IChEYXRhLCBzdWJzZXQ9KE1hcmtldGluZ19OYW1lID09ICJUaGVvZG9yIikpIA0KRWx2YW5pID1zdWJzZXQgKERhdGEsIHN1YnNldD0oTWFya2V0aW5nX05hbWUgPT0gIkVsdmFuaSIpKSANCkpvbmF0aGFuID0gc3Vic2V0IChEYXRhLCBzdWJzZXQ9KE1hcmtldGluZ19OYW1lID09ICJKb25hdGhhbiIpKSANClNvZmlhID1zdWJzZXQgKERhdGEsIHN1YnNldD0oTWFya2V0aW5nX05hbWUgPT0gIlNvZmlhIikpIA0KQWJyYWhhbSA9IHN1YnNldCAoRGF0YSwgc3Vic2V0PShNYXJrZXRpbmdfTmFtZSA9PSAiQWJyYWhhbSIpKSANClNpdGkgPXN1YnNldCAoRGF0YSwgc3Vic2V0PShNYXJrZXRpbmdfTmFtZSA9PSAiU2l0aSIpKSANCk5pa28gPXN1YnNldChEYXRhLCBzdWJzZXQ9KE1hcmtldGluZ19OYW1lID09ICJOaWtvIikpIA0KU2VmbGkgPXN1YnNldCAoRGF0YSwgc3Vic2V0PShNYXJrZXRpbmdfTmFtZSA9PSAiU2VsZmkiKSkgDQpCZW5lID1zdWJzZXQoRGF0YSwgc3Vic2V0PShNYXJrZXRpbmdfTmFtZSA9PSAiQmVuZSIpKSANCkRpYW5hID1zdWJzZXQgKERhdGEsIHN1YnNldD0oTWFya2V0aW5nX05hbWUgPT0gIkRpYW5hIikpDQpQdXBlID1zdWJzZXQoRGF0YSwgc3Vic2V0PShNYXJrZXRpbmdfTmFtZSA9PSAiUHVwZSIpKSANCkFuZGkgPXN1YnNldCAoRGF0YSwgc3Vic2V0PShNYXJrZXRpbmdfTmFtZSA9PSAiQW5kaSIpKSANClRhdGhhID1zdWJzZXQgKERhdGEsIHN1YnNldD0oTWFya2V0aW5nX05hbWUgPT0gIlRhdGhhIikpDQpFbmRyaT1zdWJzZXQgKERhdGEsIHN1YnNldD0oTWFya2V0aW5nX05hbWUgPT0gIkVuZHJpIikpIA0KTW9uaWthPSBzdWJzZXQoRGF0YSwgc3Vic2V0PShNYXJrZXRpbmdfTmFtZSA9PSAiTW9uaWthIikpIA0KSGFucyA9c3Vic2V0KERhdGEsIHN1YnNldD0oTWFya2V0aW5nX05hbWUgPT0gIkhhbnMiKSkgDQpEZWJvcmE9IHN1YnNldCAoRGF0YSwgc3Vic2V0PShNYXJrZXRpbmdfTmFtZSA9PSAiRGVib3JhIikpIA0KSGFuaWZhPSBzdWJzZXQgKERhdGEsIHN1YnNldD0oTWFya2V0aW5nX05hbWUgPT0gIkhhbmlmYSIpKQ0KSmFtZXMgPXN1YnNldCAoRGF0YSwgc3Vic2V0PShNYXJrZXRpbmdfTmFtZSA9PSAiSmFtZXMiKSkgDQpKaWhhbiA9c3Vic2V0IChEYXRhLCBzdWJzZXQ9KE1hcmtldGluZ19OYW1lID09ICJKaWhhbiIpKQ0KRnJpc2thID1zdWJzZXQgKERhdGEsIHN1YnNldD0oTWFya2V0aW5nX05hbWUgPT0gIkZyaXNrYSIpKSANCkFyZGl3YW4gPSBzdWJzZXQgKERhdGEsIHN1YnNldD0oTWFya2V0aW5nX05hbWUgPT0gIkFyZGl3YW4iKSkgDQpCYWt0aSA9c3Vic2V0IChEYXRhLCBzdWJzZXQ9KE1hcmtldGluZ19OYW1lID09ICJCYWt0aSIpKSANCkFudGhvbiA9c3Vic2V0IChEYXRhLCBzdWJzZXQ9KE1hcmtldGluZ19OYW1lID09ICJBbnRob24iKSkgDQpBbXJ5ID1zdWJzZXQgKERhdGEsIHN1YnNldD0oTWFya2V0aW5nX05hbWUgPT0gIkFtcnkiKSkgDQpXaXdpayA9c3Vic2V0IChEYXRhLCBzdWJzZXQ9KE1hcmtldGluZ19OYW1lID09ICJXaXdpayIpKSANCkJhc3RpYW4gPSBzdWJzZXQgKERhdGEsIHN1YnNldD0oTWFya2V0aW5nX05hbWUgPT0gIkJhc3RpYW4iKSkgDQpCdWRpID0gc3Vic2V0IChEYXRhLCBzdWJzZXQ9KE1hcmtldGluZ19OYW1lID09ICJCdWRpIikpIA0KTGVvID0gc3Vic2V0IChEYXRhLCBzdWJzZXQ9KE1hcmtldGluZ19OYW1lID09ICJMZW8iKSkgDQpTaW1vbiA9IHN1YnNldCAoRGF0YSwgc3Vic2V0PShNYXJrZXRpbmdfTmFtZSA9PSAiU2ltb24iKSkgDQpNYXRpdXMgPSBzdWJzZXQgKERhdGEsIHN1YnNldD0oTWFya2V0aW5nX05hbWUgPT0gIk1hdGl1cyIpKSANCkFycnkgPSBzdWJzZXQgKERhdGEsIHN1YnNldD0oTWFya2V0aW5nX05hbWUgPT0gIkFycnkiKSkgDQpFbGlhbmRvID0gc3Vic2V0IChEYXRhLCBzdWJzZXQ9KE1hcmtldGluZ19OYW1lID09ICJFbGlhbmRvIikpIA0KICANCk5hbWFfU2FsZXMgPSBjKCJBbmdlbCIsIlNoZXJseSIsIlZhbmVzc2EiLCJJcmVuZSIsIkp1bGlhbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAiSmVmZnJ5IiwiTmlraXRhIiwiS2VmYXMiLCJTaWFuYSIsIkxhbGEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgIkZhbGxlbiIsIkFyZGlmbyIsIktldmluIiwiSnVlbiIsIkplcnJlbCIsDQogICAgICAgICAgICAgICAgICAgICAgICAiSW1lbGRhIiwiV2lkaSIsIlRoZW9kb3JhIiwiRWx2YW5pIiwiSm9uYXRoYW4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgIlNvZmlhIiwiQWJyYWhhbSIsIlNpdGkiLCJOaWtvIiwiU2VmbGkiLA0KICAgICAgICAgICAgICAgICAgICAgICAgIkJlbmUiLCAiRGlhbmEiLCAiUHVwZSIsICJBbmRpIiwgIlRhdGhhIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICJFbmRyaSIsICJNb25pa2EiLCAiSGFucyIsICJEZWJvcmEiLCJIYW5pZmEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgIkphbWVzIiwgIkppaGFuIiwgIkZyaXNrYSIsIkFyZGl3YW4iLCAiQmFrdGkiLA0KICAgICAgICAgICAgICAgICAgICAgICAgIkFudGhvbiIsIkFtcnkiLCAiV2l3aWsiLCAiQmFzdGlhbiIsICJCdWRpIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICJMZW8iLCJTaW1vbiIsIk1hdGl1cyIsIkFycnkiLCAiRWxpYW5kbyIpDQpwcm9wZXJ0eXNvbGQgPSBjKHN1bShBbmdlbCRQcmljZSksIHN1bShTaGVybHkkUHJpY2UpLCBzdW0oVmFuZXNzYSRQcmljZSksIHN1bShJcmVuZSRQcmljZSksDQpzdW0oSnVsaWFuJFByaWNlKSwgc3VtIChKZWZmcnkkUHJpY2UpLCBzdW0oTmlraXRhJFByaWNlKSwgc3VtKEtlZmFzJFByaWNlKSwgc3VtKFNpYW5hJFByaWNlKSwgc3VtKExhbGEkUHJpY2UpLCBzdW0oRmFsbGVuJFByaWNlKSwgc3VtKEFyZGlmbyRQcmljZSksIHN1bShLZXZpbiRQcmljZSksIHN1bSAoSnVlbiRQcmljZSksIHN1bShKZXJyZWwkUHJpY2UpLCBzdW0oSW1lbGRhJFByaWNlKSwgc3VtKFdpZGkkUHJpY2UpLCBzdW0oVGhlb2RvciRQcmljZSksIHN1bShFbHZhbmkkUHJpY2UpLCBzdW0oSm9uYXRoYW4kUHJpY2UpLCBzdW0oU29maWEkUHJpY2UpLCBzdW0oQWJyYWhhbSRQcmljZSksIHN1bShTaXRpJFByaWNlKSwgc3VtKE5pa28kUHJpY2UpLCBzdW0oU2VmbGkkUHJpY2UpLCBzdW0oQmVuZSRQcmljZSksIHN1bSggRGlhbmEkUHJpY2UpLCBzdW0gKFB1cGUkUHJpY2UpLCBzdW0oQW5kaSRQcmljZSksIHN1bSggVGF0aGEkUHJpY2UpLCBzdW0oRW5kcmkkUHJpY2UpLCBzdW0oIE1vbmlrYSRQcmljZSksIHN1bSggSGFucyRQcmljZSksIHN1bSggRGVib3JhJFByaWNlKSwgc3VtKEhhbmlmYSRQcmljZSksIHN1bSAoSmFtZXMkUHJpY2UpLCBzdW0oIEppaGFuJFByaWNlKSwgc3VtKCBGcmlza2EkUHJpY2UpLCBzdW0oQXJkaXdhbiRQcmljZSksIHN1bShCYWt0aSRQcmljZSksIHN1bShBbnRob24kUHJpY2UpLCBzdW0oQW1yeSRQcmljZSksIHN1bSggV2l3aWskUHJpY2UpLCBzdW0oIEJhc3RpYW4kUHJpY2UpLCBzdW0oIEJ1ZGkkUHJpY2UpLCBzdW0gKExlbyRQcmljZSksIHN1bShTaW1vbiRQcmljZSksIHN1bShNYXRpdXMkUHJpY2UpLCBzdW0oQXJyeSRQcmljZSksIHN1bSggRWxpYW5kbyRQcmljZSkpDQoNCmRhdGFtYXJrZXRpbmc9IGRhdGEuZnJhbWUoTmFtYV9TYWxlcywgcHJvcGVydHlzb2xkKQ0KDQpkYXRhbWFya2V0aW5nDQoNCmBgYA0KYGBge3J9DQojIEJlc3QgTWFya2V0aW5nDQpkYXRhbWFya2V0aW5nW3doaWNoLm1heChkYXRhbWFya2V0aW5nJHByb3BlcnR5c29sZCksXQ0KYGBgDQpgYGB7cn0NCiNLb3RhIGRhbiBDbHVzdGVyIFBhbGluZyBNZW5ndW50dW5na2FuDQpwcm9maXRhYmxlPSBEYXRhWyxjKCJDaXR5IiwiQ2x1c3RlciIsIlByaWNlIildDQoNCnByb2ZpdGFibGVbd2hpY2gubWF4KHByb2ZpdGFibGUkUHJpY2UpLF0NCmBgYA0KDQpgYGB7cn0NCiNUb3RhbCBCaWF5YSBTZHZlcnRpc21lbnQgaXJlbmUNCmNvc3Rmb3JhZCA9IHN1YnNldChEYXRhLCBzdWJzZXQ9KE1hcmtldGluZ19OYW1lID09ICJJcmVuZSIpKQ0KDQphZHNjb3N0ID0gKCBjb3N0Zm9yYWQkQWR2ZXJ0aXNlbWVudCAqIDQpDQoNClRvdGFsY29zdD1wcmludChzdW0oYWRzY29zdCkpDQoNCmBgYA0KDQpgYGB7cn0NCiMgUmF0YS1SYXRhIGNvc3QgaWtsYW4NCk5hbWFzYWxlcyA9IGMoIkFuZ2VsIiwiU2hlcmx5IiwiVmFuZXNzYSIsIklyZW5lIiwiSnVsaWFuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICJKZWZmcnkiLCJOaWtpdGEiLCJLZWZhcyIsIlNpYW5hIiwiTGFsYSIsDQogICAgICAgICAgICAgICAgICAgICAgICAiRmFsbGVuIiwiQXJkaWZvIiwiS2V2aW4iLCJKdWVuIiwiSmVycmVsIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICJJbWVsZGEiLCJXaWRpIiwiVGhlb2RvcmEiLCJFbHZhbmkiLCJKb25hdGhhbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAiU29maWEiLCJBYnJhaGFtIiwiU2l0aSIsIk5pa28iLCJTZWZsaSIsDQogICAgICAgICAgICAgICAgICAgICAgICAiQmVuZSIsICJEaWFuYSIsICJQdXBlIiwgIkFuZGkiLCAiVGF0aGEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgIkVuZHJpIiwgIk1vbmlrYSIsICJIYW5zIiwgIkRlYm9yYSIsIkhhbmlmYSIsDQogICAgICAgICAgICAgICAgICAgICAgICAiSmFtZXMiLCAiSmloYW4iLCAiRnJpc2thIiwiQXJkaXdhbiIsICJCYWt0aSIsDQogICAgICAgICAgICAgICAgICAgICAgICAiQW50aG9uIiwiQW1yeSIsICJXaXdpayIsICJCYXN0aWFuIiwgIkJ1ZGkiLA0KICAgICAgICAgICAgICAgICAgICAgICAgIkxlbyIsIlNpbW9uIiwiTWF0aXVzIiwiQXJyeSIsICJFbGlhbmRvIikNCnJhdGFjb3N0ID0gZm9yICh4IGluIE5hbWFzYWxlcykgew0KICBmPSBzdWJzZXQgKCBEYXRhLCBzdWJzZXQ9KE1hcmtldGluZ19OYW1lID09IHggKSkNCiAgYz1zdW0oZiRBZHZlcnRpc2VtZW50ICogNCkNCiAgcHJpbnQgKGNhdChzdW0oYykvbGVuZ3RoKGYkSWQpLCAoY2F0KHgsICdSYXRhLXJhdGEgcGVuZ2VsdWFyYW4gdW50dWsgaWtsYW4nKSkpKX0NCg0KDQoNCmBgYCAgIA0KDQpgYGB7cn0NCiMgUGVuZGFwYXRhbg0KDQpyZXZlbnVlPSAoc3VtKERhdGEkUHJpY2UpLShzdW0oRGF0YSRBZHZlcnRpc21lbnQpICogNCkpLygobWF4KERhdGEkV29ya19FeHApKSoxMikNCg0KcmV2ZW51ZQ0KYGBgDQoNCg0KDQoNCg0KDQoNCiMgS2FzdXMgMg0KDQpNaXNhbGthbiBBbmRhIG1lbWlsaWtpIHByb3llayByaXNldCBwYXNhciB1bnR1ayBtZW1wZXJ0YWhhbmthbiBiZWJlcmFwYSBwZWxhbmdnYW4gcG90ZW5zaWFsIGRpIHBlcnVzYWhhYW4gQW5kYS4gTWFyaSBraXRhIGFzdW1zaWthbiBBbmRhIGJla2VyamEgZGkgcGVydXNhaGFhbiBhc3VyYW5zaSBBQkMuIFVudHVrIG1lbGFrdWthbm55YSwgQW5kYSBpbmdpbiBtZW5ndW1wdWxrYW4ga3VtcHVsYW4gZGF0YSBiZXJpa3V0Og0KDQoqICoqTWFyaXRhbF9TdGF0dXMqKiAgICA6IG1lbmV0YXBrYW4gc3RhdHVzIHBlcmthd2luYW4gYWNhayAoIllhIiwgIlRpZGFrIikNCiogKipBZGRyZXNzKiogICAgICAgICAgIDogYmVyaWthbiBhbGFtYXQgYWNhayAoSkFCT0RFVEFCRUspIA0KKiAqKldvcmtfTG9jYXRpb24qKiAgICAgOiBtZW5ldGFwa2FuIGxva2FzaSBrZXJqYSBzZWNhcmEgYWNhayAoSkFCT0RFVEFCRUspIA0KKiAqKkFnZSoqICAgICAgICAgICAgICAgOiBtZW5ldGFwa2FuIHVydXRhbiBhbmdrYSBhY2FrIChkYXJpIDE5IGhpbmdnYSA2MCkgDQoqICoqQWNhZGVtaWMqKiAgICAgICAgICA6IG1lbmV0YXBrYW4gdGluZ2thdCBha2FkZW1payBhY2FrICgiSi5TY2hvb2wiLCAiSC5TY2hvb2wiLCAiU2FyamFuYSIsICJNYWdpc3RlciIsICJQaGQiKSANCiogKipKb2IqKiAgICAgICAgICAgICAgIDogMTAgcGVrZXJqYWFuIGFjYWsgdW50dWsgc2V0aWFwIHRpbmdrYXQgYWthZGVtaWsgIA0KKiAqKkdyYWRlKiogICAgICAgICAgICAgOiA1IG5pbGFpIGFjYWsgdW50dWsgc2V0aWFwIFBla2VyamFhbiANCiogKipJbmNvbWUqKiAgICAgICAgICAgIDogdGV0YXBrYW4gcGVuZGFwYXRhbiB5YW5nIG11bmdraW4gdW50dWsgc2V0aWFwIFBla2VyamFhbiAgDQoqICoqU3BlbmRpbmcqKiAgICAgICAgICA6IHRldGFwa2FuIGtlbXVuZ2tpbmFuIHBlbmdlbHVhcmFuIHVudHVrIHNldGlhcCBQZWtlcmphYW4gDQoqICoqTnVtYmVyX29mX2NoaWxkcmVuKio6IG1lbmV0YXBrYW4gbm9tb3IgYWNhayBkaSBhbnRhcmEgMCBkYW4gMTAgKHNlc3VhaSBkZW5nYW4gc3RhdHVzIHBlcmthd2luYW4pDQoqICoqUHJpdmF0ZV92ZWhpY2xlKiogICA6IG1lbmV0YXBrYW4ga2VtdW5na2luYW4ga2VuZGFyYWFuIHByaWJhZGkgdW50dWsgc2V0aWFwIG9yYW5nICgiTW9iaWwiLCAic2VwZWRhIG1vdG9yIiwgIlVtdW0iKSANCiogKipIb21lKiogICAgICAgICAgICAgIDogIlNld2EiLCAiTWlsaWsiLCAiS3JlZGl0IiANCg0KIyMgU29hbCAxIHsudGFic2V0IC50YWJzZXQtcGlsbHN9DQoNClRvbG9uZyBiZXJpa2FuIHNheWEga3VtcHVsYW4gZGF0YSB0ZW50YW5nIGluZm9ybWFzaSA1MDAwMCBwZWxhbmdnYW4geWFuZyBtZW5nYWN1IHBhZGEgc2V0aWFwIHZhcmlhYmVsIGRpIGF0YXMhIA0KDQojIyMgUiANCg0KYGBge3J9DQptYXJpdGFsX3N0YXR1cyA8LSBzYW1wbGUoYygiWWVzIiwgIk5vIiksIDUwMDAwLCByZXBsYWNlID0gVCkgDQpBZGRyZXNzIDwtc2FtcGxlKGMoIkpha2FydGEiLCAiQm9nb3IiLCAiRGVwb2siLCAiVGFuZ2VyYW5nIiwgIkJla2FzaSIpLDUwMDAwLCByZXBsYWNlPVQpDQpXb3JrX0xvY2F0aW9uIDwtc2FtcGxlKGMoIkpha2FydGEiLCAiQm9nb3IiLCAiRGVwb2siLCAiVGFuZ2VyYW5nIiwgIkJla2FzaSIpLDUwMDAwLCByZXBsYWNlPVQpDQpBZ2UgPC1mbG9vciAocnVuaWYoNTAwMDAsMTksNjApKQ0KQWNhZGVtaWMgPC1zYW1wbGUoYygiSi5TY2hvb2wiLCAiSC5TY2hvb2wiLCAiQmFjaGVsb3IgRGVncmVlIiwgIk1hc3RlciIsDQoiUGhkIiksIDUwMDAwLCByZXBsYWNlID0gVCkgDQoNCg0KDQoNCg0KR3JhZGUgPC1zYW1wbGUoYygiUysiLCAiUyIsICJBKyIsICJBIiwNCiJCIiksIDUwMDAwLCByZXBsYWNlPVQpIA0KDQpOdW1iZXJfb2ZfY2hpbGRyZW4gPC0gaWZlbHNlKG1hcml0YWxfc3RhdHVzID09IlllcyIsIHNhbXBsZSgoYygwOjEwKSksIGxlbmd0aChtYXJpdGFsX3N0YXR1cyA9PSJZZXMiKSwgcmVwbGFjZT1UKSwgIjAiKQ0KUHJpdmF0ZV92ZWhpY2xlIDwtIHNhbXBsZShjKCJDYXIiLCAiTW90b3JjeWNsZSIsICJQdWJsaWMiKSwNCjUwMDAwLCByZXBsYWNlPVQpDQpIb21lIDwtIHNhbXBsZShjKCJSZW50IiwgIk93biIsICJDcmVkaXQiKSwgNTAwMDAsIHJlcGxhY2U9VCkgDQoNCkRhdGFzb2FsMiA8LWRhdGEuZnJhbWUgKG1hcml0YWxfc3RhdHVzLCBBZGRyZXNzLCBXb3JrX0xvY2F0aW9uLCBBZ2UsIEFjYWRlbWljLCBHcmFkZSwgTnVtYmVyX29mX2NoaWxkcmVuLCBQcml2YXRlX3ZlaGljbGUsIEhvbWUpDQoNCmxpYnJhcnkoZGF0YS50YWJsZSkNCmRhdGEudGFibGUoRGF0YXNvYWwyKQ0KYGBgDQoNCmBgYHtyfQ0KDQpKb2IgPC0gaWZlbHNlIChEYXRhc29hbDIkQWNhZGVtaWMgPT0gIkouU2Nob29sIiwgc2FtcGxlKGMoIkNsZWFuaW5nIFNlcnZpY2UiLCAiU2VjdXJpdHkgR3VhcmQiLCAiV2FpdGVyIikpLA0KaWZlbHNlKERhdGFzb2FsMiRBY2FkZW1pYyA9PSAiSC5TY2hvb2wiLCBzYW1wbGUoYygiV2FpdGVyIiwgIlNlY3VyaXR5IEd1YXJkIikpLCBpZmVsc2UoRGF0YXNvYWwyJEFjYWRlbWljID09ICJCYWNoZWxvciBEZWdyZWUiLCBzYW1wbGUoYygiQ0VPIiwgIlRlYWNoZXIiKSksIGlmZWxzZShEYXRhc29hbDIkQWNhZGVtaWMgPT0gIk1hc3RlciIsc2FtcGxlKGMoIkJvYXJkIERpcmVjdG9yIiwgIkFjdHVhcmlzdCIsICJTb2Z0d2FyZSBFbmdpbmVyaW5nIikpLCBzYW1wbGUoYygiSGVhZCBvZiBSZXNlYXJjaCIsICJUZWFjaGVyIikpDQopKSkpDQoNCkRhdGFzb2FsMiA9IGRhdGEuZnJhbWUobWFyaXRhbF9zdGF0dXMsIEFkZHJlc3MsIFdvcmtfTG9jYXRpb24sIEFnZSwgQWNhZGVtaWMsSm9iLCBHcmFkZSwgTnVtYmVyX29mX2NoaWxkcmVuLCBQcml2YXRlX3ZlaGljbGUsIEhvbWUpDQoNCkluY29tZSA8LSBpZmVsc2UgKERhdGFzb2FsMiRKb2IgPT0gIkNsZWFuaW5nIFNlcnZpY2UiLCBzYW1wbGUoYyg1MDAwOjYwMDApKSwNCmlmZWxzZShEYXRhc29hbDIkSm9iID09ICJDbGVyayIsIHNhbXBsZShjKDQ1MDA6NTUwMCkpLCBpZmVsc2UoRGF0YXNvYWwyJEpvYiA9PSAiV2FpdGVyIiwgc2FtcGxlKGMoNDUwMDo2MDAwKSksIGlmZWxzZShEYXRhc29hbDIkSm9iID09ICJUZWFjaGVyIixzYW1wbGUoYyg2MDAwOjkwMDApKSwgaWZlbHNlIChEYXRhc29hbDIkSm9iID09ICJBY3R1YXJpc3QiLCBzYW1wbGUoYyg4NTAwOjEzMDAwKSksIGlmZWxzZShEYXRhc29hbDIkIEpvYiA9PSAiU29mdHdhcmUgRW5naW5lcmluZyIsIHNhbXBsZShjKDgwMDA6MTIwMDApKSwgaWZlbHNlIChEYXRhc29hbDIkSm9iID09IlNlY3VyaXR5IEd1YXJkICIsIHNhbXBsZShjKDUwMDA6NTUwMCkpLCBpZmVsc2UgKERhdGFzb2FsMiRKb2I9PSAiSGVhZCBvZiBSZXNlYXJjaCIsIHNhbXBsZShjKDkwMDA6MTQwMDApKSwgaWZlbHNlKERhdGFzb2FsMiRKb2IgPT0gIkNFTyIsIHNhbXBsZShjKDEzMDAwOjIwMDAwKSksIHNhbXBsZShjKDExMDAwOjE2MDAwKSkNCikpKSkpKSkpKQ0KDQpTcGVuZGluZyA8LSBpZmVsc2UgKERhdGFzb2FsMiRKb2IgPT0gIkNsZWFuaW5nIFNlcnZpY2UiLCBzYW1wbGUoYygzMDAwOjQ1MDApKSwNCmlmZWxzZShEYXRhc29hbDIkSm9iID09ICJDbGVyayIsIHNhbXBsZShjKDIyMDA6NTEwMCkpLCBpZmVsc2UoRGF0YXNvYWwyJEpvYiA9PSAiV2FpdGVyIiwgc2FtcGxlKGMoMzAwMDo1MDAwKSksIGlmZWxzZShEYXRhc29hbDIkSm9iID09ICJUZWFjaGVyIixzYW1wbGUoYyg0MDAwOjc1MDApKSwgaWZlbHNlIChEYXRhc29hbDIkSm9iID09ICJBY3R1YXJpc3QiLCBzYW1wbGUoYygzNTAwOjkwMDApKSwgaWZlbHNlKERhdGFzb2FsMiQgSm9iID09ICJTb2Z0d2FyZSBFbmdpbmVyaW5nIiwgc2FtcGxlKGMoNTAwMDo3NTAwKSksIGlmZWxzZSAoRGF0YXNvYWwyJEpvYiA9PSJTZWN1cml0eSBHdWFyZCAiLCBzYW1wbGUoYyg0MDAwOjQ1MDApKSwgaWZlbHNlIChEYXRhc29hbDIkSm9iPT0gIkhlYWQgb2YgUmVzZWFyY2giLCBzYW1wbGUoYyg2MDAwOjEwNTAwKSksIGlmZWxzZShEYXRhc29hbDIkSm9iID09ICJDRU8iLCBzYW1wbGUoYyg2MDAwOjEwMDAwKSksIHNhbXBsZShjKDU1MDA6MTEwMDApKQ0KKSkpKSkpKSkpDQoNCkRhdGFzb2FsMiRKb2I9Sm9iDQpEYXRhc29hbDIkSW5jb21lID0gSW5jb21lDQpEYXRhc29hbDIkU3BlbmRpbmcgPSBTcGVuZGluZw0KDQpEYXRhc29hbDINCg0KYGBgDQoNCg0KDQoNCiMjIFNvYWwgMiB7LnRhYnNldCAudGFic2V0LXBpbGxzfQ0KDQpSaW5na2FzYW4gU3RhdGlzdGlrIHBlbnRpbmcgc2VwZXJ0aSBhcGEgeWFuZyBiaXNhIEFuZGEgZGFwYXRrYW4gZGFyaSBrdW1wdWxhbiBkYXRhIEFuZGE/DQoNCiMjIyBSDQoNCmBgYHtyfQ0Kc3VtbWFyeShEYXRhc29hbDIpDQpgYGANCg0KDQoNCmANCg0KDQojIyBTb2FsIDMgey50YWJzZXQgLnRhYnNldC1waWxsc30NCg0KTWVudXJ1dCBwZXJoaXR1bmdhbiBkYW4gYW5hbGlzaXMgQW5kYSwgcGVsYW5nZ2FuIG1hbmEgeWFuZyBwb3RlbnNpYWwgdW50dWsgQW5kYSBwZXJ0YWhhbmthbj8gDQoNCiMjIyBSDQoNCmBgYHtyfQ0KRGF0YXNvYWwyJE5ldFdvcnRoID0gRGF0YXNvYWwyJEluY29tZS1EYXRhc29hbDIkU3BlbmRpbmcNCg0KRGF0YXNvYWwyDQpgYGANCmBgYHtyfQ0KI1BvdGVudGlhbCB1bnR1ayBkaXBlcnRhaGFua2FuDQpzdWJzZXQoRGF0YXNvYWwyLCBOZXRXb3J0aD49IDcwMDApDQoNCmBgYA0KICANCg0KDQoNCg0KIA0KDQoNCiMgUmVmZXJlbnNpDQoNCjEuICAgcmVmIDENCjIuICAgcmVmIDINCjMuICAgcmVmIDMNCg0KDQoNCg0K