Algoritma & Struktur Data

~ Ujian Tengah Semester ~


Kontak : \(\downarrow\)
Email
Jurusan Fisika Medis
RPubs https://rpubs.com/sharongracia/

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)
write.csv(Data,"C:\\Users\\YEPRI\\Data.csv",row.names = FALSE)

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

harga<- function(Data){
  if (Data$Price[i] > 12000){
    Data$Kelas[i] <- "High"}
  else if (Data$Price[i] >= 10000 & Data$Price[i] <= 12000){
    Data$Kelas[i] <- "Medium" }
  else{
    Data$Kelas[i] <- "Low"}
}
library(DT)
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

for (i in 1:nrow(Data)){
  if (Data$Price[i] < 8000){
    Data$Booking_fee[i] <- ((Data$Price[i]) * (5/100))
  }
  else if (Data$Price[i] >= 8000 & Data$Price[i] < 9000){
    Data$Booking_fee[i] <- ((Data$Price[i]) * (6/100))
  }
  else if (Data$Price[i] >= 9000 & Data$Price[i] < 10000){
    Data$Booking_fee[i] <- ((Data$Price[i]) * (7/100))
  }
  else if (Data$Price[i] >= 10000 & Data$Price[i] < 11000){
    Data$Booking_fee[i] <- ((Data$Price[i]) * (8/100))
  }
  else if (Data$Price[i] >= 11000 & Data$Price[i] < 13000){
    Data$Booking_fee[i] <- ((Data$Price[i])* (9/100))
  }
  else {
    Data$Booking_fee[i] <- ((Data$Price[i])* (10/100))
  }
}
transform(Data, Booking_fee = as.numeric(Booking_fee))
typeof(Data$Booking_fee)
## [1] "double"
library(DT)
datatable(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

for (i in "Jeffry"){
  print(subset(Data, subset = (Marketing_Name ==i)))
}
##        Id Marketing_Name Work_Exp      City   Cluster Price Date_Sales
## 6       6         Jeffry      4.7     Depok   Mutiara 12058 2018-02-16
## 56     56         Jeffry      4.7   Jakarta    Lavesh 12825 2019-03-17
## 106   106         Jeffry      4.7     Depok   Peronia 11521 2020-05-10
## 156   156         Jeffry      4.7 Tengerang     Asoka 11611 2020-05-23
## 206   206         Jeffry      4.7     Bogor     Asoka 11316 2018-08-31
## 256   256         Jeffry      4.7     Depok Primadona 14055 2020-06-12
## 306   306         Jeffry      4.7     Bogor   Alindra 12752 2018-12-16
## 356   356         Jeffry      4.7     Depok   Palmyra  8309 2019-11-14
## 406   406         Jeffry      4.7    Bekasi     Adara 11887 2019-07-02
## 456   456         Jeffry      4.7     Depok  Alamanda 13036 2019-01-07
## 506   506         Jeffry      4.7   Jakarta Sweethome 12902 2018-08-27
## 556   556         Jeffry      4.7     Depok      Neon  7178 2018-09-15
## 606   606         Jeffry      4.7     Depok  Alamanda  8720 2019-12-31
## 656   656         Jeffry      4.7     Depok Sweethome 13947 2019-07-08
## 706   706         Jeffry      4.7    Bekasi     Arana  8950 2019-03-17
## 756   756         Jeffry      4.7     Depok   Peronia 11257 2018-07-23
## 806   806         Jeffry      4.7 Tengerang     Asoka 10139 2018-02-22
## 856   856         Jeffry      4.7    Bekasi   Albasia  7802 2018-02-22
## 906   906         Jeffry      4.7 Tengerang Teradamai  7797 2018-12-23
## 956   956         Jeffry      4.7     Depok   Albasia 10201 2020-01-21
## 1006 1006         Jeffry      4.7     Bogor     Tiara 14409 2019-10-06
## 1056 1056         Jeffry      4.7     Depok     Asoka 13239 2019-10-03
## 1106 1106         Jeffry      4.7    Bekasi Teradamai  9005 2018-04-11
## 1156 1156         Jeffry      4.7     Depok   Permata  7879 2018-07-13
## 1206 1206         Jeffry      4.7     Depok   Peronia  7098 2020-08-04
## 1256 1256         Jeffry      4.7   Jakarta   Permata 14442 2019-05-02
## 1306 1306         Jeffry      4.7    Bekasi   Palmyra 12413 2019-11-13
## 1356 1356         Jeffry      4.7   Jakarta     Asoka  9176 2019-06-16
## 1406 1406         Jeffry      4.7     Depok   Peronia  9597 2019-11-20
## 1456 1456         Jeffry      4.7   Jakarta  Alamanda 13183 2018-08-14
## 1506 1506         Jeffry      4.7    Bekasi     Tiara 11969 2019-07-11
## 1556 1556         Jeffry      4.7     Bogor  Victoria 14212 2019-08-28
## 1606 1606         Jeffry      4.7   Jakarta  Victoria 13581 2019-10-23
## 1656 1656         Jeffry      4.7     Depok   Alindra  8649 2018-08-02
## 1706 1706         Jeffry      4.7    Bekasi     Asera 11163 2018-05-16
## 1756 1756         Jeffry      4.7     Bogor   Mutiara 12881 2019-03-20
## 1806 1806         Jeffry      4.7   Jakarta     Asoka 12910 2018-10-24
## 1856 1856         Jeffry      4.7    Bekasi Sweethome  8429 2019-01-05
## 1906 1906         Jeffry      4.7     Depok  Alamanda 13265 2019-02-19
## 1956 1956         Jeffry      4.7    Bekasi Sweethome  9919 2018-05-04
## 2006 2006         Jeffry      4.7     Depok   Albasia  7230 2020-08-22
## 2056 2056         Jeffry      4.7     Depok     Adara 11151 2019-03-21
## 2106 2106         Jeffry      4.7 Tengerang   Mutiara 10501 2019-02-17
## 2156 2156         Jeffry      4.7     Depok  Alamanda 14730 2018-07-10
## 2206 2206         Jeffry      4.7     Bogor   Alindra  8771 2020-02-24
## 2256 2256         Jeffry      4.7   Jakarta  Victoria  9239 2018-07-22
## 2306 2306         Jeffry      4.7    Bekasi    Winona  9033 2019-04-03
## 2356 2356         Jeffry      4.7     Bogor  Alamanda  9271 2019-06-10
## 2406 2406         Jeffry      4.7     Bogor    Winona 11379 2020-02-19
## 2456 2456         Jeffry      4.7 Tengerang    Narada  8770 2020-05-04
## 2506 2506         Jeffry      4.7   Jakarta    Narada 11326 2019-03-02
## 2556 2556         Jeffry      4.7    Bekasi   Peronia  9995 2018-08-01
## 2606 2606         Jeffry      4.7 Tengerang  Victoria 14923 2019-04-13
## 2656 2656         Jeffry      4.7   Jakarta   Peronia 14185 2019-07-17
## 2706 2706         Jeffry      4.7 Tengerang     Tiara  8208 2019-02-13
## 2756 2756         Jeffry      4.7     Bogor    Narada 10215 2020-01-21
## 2806 2806         Jeffry      4.7    Bekasi   Permata  9253 2018-08-21
## 2856 2856         Jeffry      4.7   Jakarta     Adara  7067 2018-08-31
## 2906 2906         Jeffry      4.7     Bogor    Lavesh 11684 2020-09-22
## 2956 2956         Jeffry      4.7    Bekasi Teradamai  8251 2019-10-07
## 3006 3006         Jeffry      4.7   Jakarta   Permata  7472 2019-01-22
## 3056 3056         Jeffry      4.7 Tengerang      Neon  7546 2019-07-05
## 3106 3106         Jeffry      4.7     Depok Primadona 10246 2020-02-17
## 3156 3156         Jeffry      4.7   Jakarta   Mutiara  8305 2019-04-23
## 3206 3206         Jeffry      4.7     Bogor  Alamanda  8127 2020-01-21
## 3256 3256         Jeffry      4.7   Jakarta    Lavesh 14179 2018-03-09
## 3306 3306         Jeffry      4.7   Jakarta    Narada 14330 2019-06-19
## 3356 3356         Jeffry      4.7     Bogor     Asoka 11837 2018-07-05
## 3406 3406         Jeffry      4.7     Bogor     Arana  9671 2018-07-05
## 3456 3456         Jeffry      4.7   Jakarta  Victoria  9460 2019-11-29
## 3506 3506         Jeffry      4.7     Depok     Asoka  9599 2018-07-02
## 3556 3556         Jeffry      4.7    Bekasi  Alamanda  9172 2020-05-12
## 3606 3606         Jeffry      4.7     Bogor     Arana  9050 2018-10-24
## 3656 3656         Jeffry      4.7    Bekasi    Narada  8799 2019-02-25
## 3706 3706         Jeffry      4.7   Jakarta   Albasia 10217 2018-02-27
## 3756 3756         Jeffry      4.7   Jakarta Sweethome 12286 2018-06-17
## 3806 3806         Jeffry      4.7     Bogor     Arana 12687 2019-11-29
## 3856 3856         Jeffry      4.7     Depok   Permata 13920 2020-08-14
## 3906 3906         Jeffry      4.7    Bekasi   Peronia 12857 2020-01-29
## 3956 3956         Jeffry      4.7     Depok    Narada  7803 2018-06-16
## 4006 4006         Jeffry      4.7   Jakarta   Alindra 11133 2020-06-21
## 4056 4056         Jeffry      4.7 Tengerang Primadona 14783 2019-05-13
## 4106 4106         Jeffry      4.7   Jakarta     Asoka 13013 2018-09-15
## 4156 4156         Jeffry      4.7     Depok     Asera  9519 2018-06-05
## 4206 4206         Jeffry      4.7   Jakarta   Albasia 12785 2018-05-26
## 4256 4256         Jeffry      4.7 Tengerang Primadona  7085 2020-01-13
## 4306 4306         Jeffry      4.7   Jakarta     Tiara  7085 2019-03-06
## 4356 4356         Jeffry      4.7     Depok   Mutiara  8034 2019-06-01
## 4406 4406         Jeffry      4.7    Bekasi     Arana  7132 2019-11-01
## 4456 4456         Jeffry      4.7     Bogor   Palmyra  8563 2019-02-02
## 4506 4506         Jeffry      4.7    Bekasi   Mutiara 10495 2019-04-12
## 4556 4556         Jeffry      4.7 Tengerang Sweethome 10781 2018-10-15
## 4606 4606         Jeffry      4.7 Tengerang     Arana 14052 2018-12-30
## 4656 4656         Jeffry      4.7     Bogor   Peronia 14343 2018-01-13
## 4706 4706         Jeffry      4.7 Tengerang     Asoka  8501 2019-09-09
## 4756 4756         Jeffry      4.7   Jakarta   Peronia 10039 2020-02-14
## 4806 4806         Jeffry      4.7     Bogor   Albasia 10553 2019-03-01
## 4856 4856         Jeffry      4.7     Bogor Teradamai  8829 2019-10-07
## 4906 4906         Jeffry      4.7   Jakarta   Permata 12122 2018-01-30
## 4956 4956         Jeffry      4.7   Jakarta    Narada  7688 2018-04-14
## 5006 5006         Jeffry      4.7 Tengerang Primadona 14201 2018-11-08
## 5056 5056         Jeffry      4.7     Depok Teradamai  9597 2018-10-26
## 5106 5106         Jeffry      4.7    Bekasi   Albasia 13010 2018-10-12
## 5156 5156         Jeffry      4.7     Depok   Peronia  7027 2020-07-26
## 5206 5206         Jeffry      4.7     Depok      Neon 10495 2020-07-11
## 5256 5256         Jeffry      4.7 Tengerang   Palmyra 10875 2019-05-11
## 5306 5306         Jeffry      4.7 Tengerang    Narada 14505 2020-08-06
## 5356 5356         Jeffry      4.7     Bogor    Narada  7545 2020-02-05
## 5406 5406         Jeffry      4.7 Tengerang     Asoka 14877 2020-03-17
## 5456 5456         Jeffry      4.7    Bekasi   Alindra 14577 2020-09-20
## 5506 5506         Jeffry      4.7     Bogor    Winona  9571 2019-03-03
## 5556 5556         Jeffry      4.7     Bogor Teradamai 10075 2018-01-15
## 5606 5606         Jeffry      4.7 Tengerang     Arana 11146 2019-10-23
## 5656 5656         Jeffry      4.7    Bekasi    Narada  7613 2020-06-07
## 5706 5706         Jeffry      4.7    Bekasi    Winona 10875 2019-08-19
## 5756 5756         Jeffry      4.7     Bogor Primadona  7712 2018-11-25
## 5806 5806         Jeffry      4.7     Depok     Asera 11748 2018-06-14
## 5856 5856         Jeffry      4.7     Depok Teradamai 14991 2019-12-20
## 5906 5906         Jeffry      4.7 Tengerang     Tiara  9987 2018-08-07
## 5956 5956         Jeffry      4.7    Bekasi   Albasia 14014 2019-07-20
## 6006 6006         Jeffry      4.7     Depok   Palmyra 13222 2018-07-09
## 6056 6056         Jeffry      4.7 Tengerang  Victoria 11631 2018-11-05
## 6106 6106         Jeffry      4.7     Bogor     Adara  8551 2020-03-25
## 6156 6156         Jeffry      4.7    Bekasi     Adara 10452 2018-08-16
## 6206 6206         Jeffry      4.7     Bogor   Mutiara 14738 2018-05-29
## 6256 6256         Jeffry      4.7     Bogor     Arana 13418 2018-03-28
## 6306 6306         Jeffry      4.7   Jakarta   Alindra 13780 2018-11-16
## 6356 6356         Jeffry      4.7     Bogor Primadona  7770 2018-10-02
## 6406 6406         Jeffry      4.7     Depok Sweethome 10067 2018-06-02
## 6456 6456         Jeffry      4.7 Tengerang      Neon  9167 2018-04-15
## 6506 6506         Jeffry      4.7   Jakarta    Lavesh  8929 2019-08-21
## 6556 6556         Jeffry      4.7   Jakarta   Palmyra  8558 2019-04-11
## 6606 6606         Jeffry      4.7     Bogor Sweethome 14975 2018-01-28
## 6656 6656         Jeffry      4.7   Jakarta     Arana 12971 2020-07-27
## 6706 6706         Jeffry      4.7    Bekasi Primadona  8923 2018-02-14
## 6756 6756         Jeffry      4.7     Bogor   Palmyra  9915 2020-01-18
## 6806 6806         Jeffry      4.7     Depok Primadona 14271 2019-04-26
## 6856 6856         Jeffry      4.7    Bekasi     Asera 11941 2019-04-26
## 6906 6906         Jeffry      4.7    Bekasi   Permata 14735 2018-08-30
## 6956 6956         Jeffry      4.7 Tengerang     Tiara 13167 2018-08-28
## 7006 7006         Jeffry      4.7   Jakarta Teradamai 11476 2019-08-07
## 7056 7056         Jeffry      4.7     Bogor Teradamai 10886 2018-03-15
## 7106 7106         Jeffry      4.7     Bogor     Tiara 13445 2019-05-17
## 7156 7156         Jeffry      4.7     Bogor   Palmyra 13613 2018-10-12
## 7206 7206         Jeffry      4.7     Bogor     Arana 14427 2019-10-14
## 7256 7256         Jeffry      4.7     Depok      Neon  8765 2018-12-01
## 7306 7306         Jeffry      4.7    Bekasi   Permata 12513 2019-07-06
## 7356 7356         Jeffry      4.7   Jakarta   Mutiara 12940 2019-08-03
## 7406 7406         Jeffry      4.7   Jakarta Sweethome  7696 2018-07-03
## 7456 7456         Jeffry      4.7   Jakarta   Peronia 10221 2019-10-27
## 7506 7506         Jeffry      4.7 Tengerang     Asera  7304 2019-10-29
## 7556 7556         Jeffry      4.7     Depok     Tiara 11812 2018-04-13
## 7606 7606         Jeffry      4.7     Bogor     Asoka  9068 2018-04-02
## 7656 7656         Jeffry      4.7    Bekasi   Albasia 14290 2018-11-09
## 7706 7706         Jeffry      4.7   Jakarta   Mutiara  8335 2018-06-21
## 7756 7756         Jeffry      4.7    Bekasi   Palmyra  8931 2020-03-25
## 7806 7806         Jeffry      4.7 Tengerang   Permata  8052 2019-06-04
## 7856 7856         Jeffry      4.7     Bogor  Victoria 11838 2019-11-03
## 7906 7906         Jeffry      4.7 Tengerang Primadona  9071 2019-01-23
## 7956 7956         Jeffry      4.7     Depok   Albasia 12595 2018-02-26
## 8006 8006         Jeffry      4.7    Bekasi  Victoria 10462 2020-06-15
## 8056 8056         Jeffry      4.7     Depok   Permata  7062 2019-06-08
## 8106 8106         Jeffry      4.7 Tengerang   Albasia 12948 2018-07-30
## 8156 8156         Jeffry      4.7     Bogor     Asera  8030 2018-01-10
## 8206 8206         Jeffry      4.7 Tengerang Primadona  7980 2019-02-05
## 8256 8256         Jeffry      4.7 Tengerang     Arana 10370 2018-04-19
## 8306 8306         Jeffry      4.7 Tengerang    Lavesh 11179 2019-04-21
## 8356 8356         Jeffry      4.7 Tengerang  Alamanda 11992 2019-07-08
## 8406 8406         Jeffry      4.7     Bogor     Arana 12402 2020-07-06
## 8456 8456         Jeffry      4.7     Bogor   Palmyra 10802 2020-09-19
## 8506 8506         Jeffry      4.7    Bekasi  Victoria 10791 2020-03-12
## 8556 8556         Jeffry      4.7    Bekasi      Neon 10978 2018-11-19
## 8606 8606         Jeffry      4.7 Tengerang  Victoria 13491 2018-01-06
## 8656 8656         Jeffry      4.7     Depok     Asera 13605 2018-12-07
## 8706 8706         Jeffry      4.7   Jakarta  Alamanda 12559 2020-01-30
## 8756 8756         Jeffry      4.7    Bekasi   Peronia 14758 2019-08-13
## 8806 8806         Jeffry      4.7     Depok     Adara  7753 2019-07-07
## 8856 8856         Jeffry      4.7    Bekasi   Peronia  9915 2019-12-15
## 8906 8906         Jeffry      4.7     Depok   Alindra 10283 2020-02-22
## 8956 8956         Jeffry      4.7    Bekasi   Alindra  8091 2020-06-16
## 9006 9006         Jeffry      4.7    Bekasi   Palmyra 13113 2018-04-25
## 9056 9056         Jeffry      4.7     Bogor   Alindra 14719 2019-08-14
## 9106 9106         Jeffry      4.7 Tengerang  Alamanda 12260 2019-08-20
## 9156 9156         Jeffry      4.7     Bogor Teradamai  8363 2020-09-12
## 9206 9206         Jeffry      4.7   Jakarta Teradamai  8161 2019-06-17
## 9256 9256         Jeffry      4.7    Bekasi     Adara 14928 2020-09-07
## 9306 9306         Jeffry      4.7 Tengerang   Mutiara  9553 2018-12-24
## 9356 9356         Jeffry      4.7     Bogor     Asoka  9982 2020-03-06
## 9406 9406         Jeffry      4.7 Tengerang   Albasia 12345 2020-08-02
## 9456 9456         Jeffry      4.7     Depok   Albasia  8111 2019-10-13
## 9506 9506         Jeffry      4.7 Tengerang    Winona 13276 2018-08-29
## 9556 9556         Jeffry      4.7     Depok    Lavesh  7528 2019-12-07
## 9606 9606         Jeffry      4.7    Bekasi Primadona  9562 2020-03-17
## 9656 9656         Jeffry      4.7 Tengerang Primadona  7266 2019-01-31
## 9706 9706         Jeffry      4.7   Jakarta   Peronia 14552 2019-10-17
## 9756 9756         Jeffry      4.7     Bogor Primadona 13473 2020-03-08
## 9806 9806         Jeffry      4.7     Depok      Neon 10387 2019-06-29
## 9856 9856         Jeffry      4.7   Jakarta   Albasia 12484 2018-12-11
## 9906 9906         Jeffry      4.7 Tengerang      Neon  9859 2019-10-13
## 9956 9956         Jeffry      4.7 Tengerang Primadona  9792 2020-02-04
##      Advertisement Booking_fee
## 6                9     1085.22
## 56              17     1154.25
## 106             20     1036.89
## 156             15     1044.99
## 206             16     1018.44
## 256              3     1405.50
## 306             12     1147.68
## 356             19      498.54
## 406              5     1069.83
## 456              8     1303.60
## 506              8     1161.18
## 556              4      358.90
## 606             17      523.20
## 656              4     1394.70
## 706             16      537.00
## 756             16     1013.13
## 806             14      811.12
## 856             20      390.10
## 906              6      389.85
## 956             19      816.08
## 1006             8     1440.90
## 1056            10     1323.90
## 1106            16      630.35
## 1156            17      393.95
## 1206             1      354.90
## 1256            13     1444.20
## 1306            11     1117.17
## 1356            19      642.32
## 1406            14      671.79
## 1456             8     1318.30
## 1506             9     1077.21
## 1556            11     1421.20
## 1606             3     1358.10
## 1656            20      518.94
## 1706            10     1004.67
## 1756             4     1159.29
## 1806             8     1161.90
## 1856             9      505.74
## 1906             1     1326.50
## 1956             9      694.33
## 2006            18      361.50
## 2056            14     1003.59
## 2106            13      840.08
## 2156             9     1473.00
## 2206            10      526.26
## 2256            16      646.73
## 2306             6      632.31
## 2356             1      648.97
## 2406            14     1024.11
## 2456             8      526.20
## 2506             5     1019.34
## 2556            11      699.65
## 2606             8     1492.30
## 2656            10     1418.50
## 2706             4      492.48
## 2756             4      817.20
## 2806            11      647.71
## 2856             3      353.35
## 2906            13     1051.56
## 2956            13      495.06
## 3006             7      373.60
## 3056             7      377.30
## 3106            17      819.68
## 3156             9      498.30
## 3206            17      487.62
## 3256             1     1417.90
## 3306            17     1433.00
## 3356            17     1065.33
## 3406            17      676.97
## 3456             2      662.20
## 3506             6      671.93
## 3556             5      642.04
## 3606             6      633.50
## 3656             7      527.94
## 3706            17      817.36
## 3756             4     1105.74
## 3806             4     1141.83
## 3856             7     1392.00
## 3906            20     1157.13
## 3956            17      390.15
## 4006             6     1001.97
## 4056             3     1478.30
## 4106            11     1301.30
## 4156            12      666.33
## 4206             2     1150.65
## 4256            11      354.25
## 4306            13      354.25
## 4356             7      482.04
## 4406             9      356.60
## 4456            10      513.78
## 4506            19      839.60
## 4556             3      862.48
## 4606             4     1405.20
## 4656            11     1434.30
## 4706             8      510.06
## 4756             5      803.12
## 4806            17      844.24
## 4856             8      529.74
## 4906            16     1090.98
## 4956            11      384.40
## 5006             3     1420.10
## 5056            19      671.79
## 5106            13     1301.00
## 5156            19      351.35
## 5206            16      839.60
## 5256             6      870.00
## 5306             8     1450.50
## 5356             9      377.25
## 5406            12     1487.70
## 5456            11     1457.70
## 5506            20      669.97
## 5556             3      806.00
## 5606            18     1003.14
## 5656            17      380.65
## 5706             9      870.00
## 5756             2      385.60
## 5806            19     1057.32
## 5856            13     1499.10
## 5906            15      699.09
## 5956             5     1401.40
## 6006             9     1322.20
## 6056             8     1046.79
## 6106             2      513.06
## 6156             6      836.16
## 6206             3     1473.80
## 6256            18     1341.80
## 6306             6     1378.00
## 6356             8      388.50
## 6406             7      805.36
## 6456            19      641.69
## 6506            18      535.74
## 6556            10      513.48
## 6606             5     1497.50
## 6656            11     1167.39
## 6706             3      535.38
## 6756            13      694.05
## 6806             3     1427.10
## 6856             9     1074.69
## 6906            10     1473.50
## 6956             7     1316.70
## 7006            18     1032.84
## 7056            19      870.88
## 7106             7     1344.50
## 7156             3     1361.30
## 7206             7     1442.70
## 7256            20      525.90
## 7306             9     1126.17
## 7356            19     1164.60
## 7406            10      384.80
## 7456            10      817.68
## 7506             3      365.20
## 7556             7     1063.08
## 7606             8      634.76
## 7656             6     1429.00
## 7706             8      500.10
## 7756            15      535.86
## 7806            15      483.12
## 7856             3     1065.42
## 7906             9      634.97
## 7956            12     1133.55
## 8006             3      836.96
## 8056             4      353.10
## 8106             5     1165.32
## 8156            10      481.80
## 8206            17      399.00
## 8256            14      829.60
## 8306            14     1006.11
## 8356            11     1079.28
## 8406            20     1116.18
## 8456            16      864.16
## 8506            17      863.28
## 8556            14      878.24
## 8606            16     1349.10
## 8656            13     1360.50
## 8706            19     1130.31
## 8756             2     1475.80
## 8806            20      387.65
## 8856            17      694.05
## 8906             7      822.64
## 8956            20      485.46
## 9006            13     1311.30
## 9056             7     1471.90
## 9106            11     1103.40
## 9156             6      501.78
## 9206             1      489.66
## 9256            16     1492.80
## 9306             7      668.71
## 9356             2      698.74
## 9406             4     1111.05
## 9456            14      486.66
## 9506             4     1327.60
## 9556            17      376.40
## 9606            13      669.34
## 9656             7      363.30
## 9706            18     1455.20
## 9756             2     1347.30
## 9806             6      830.96
## 9856            18     1123.56
## 9906            19      690.13
## 9956             5      685.44

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

sales = "Jeffry"
x <- subset(Data, subset = (Marketing_Name == sales)) 

for (i in 1:nrow(x)){
  if (x$Work_Exp [i] > 3){
    x$Bonus [i] <- ((x$Booking_fee[i])*(3/100))
    }
  else {
    x$Bonus [i] <- ((x$Booking_fee[i])*(2/100))
  }
}
x
Total = sum(x$Bonus)
Total
## [1] 5376.997

Soal 5

Pada bagian ini, Anda diharapkan dapat 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 == "Falen"))
Ardifo = subset(Data, subset =(Marketing_Name == "Ardifo"))
Kevin = subset(Data, subset =(Marketing_Name == "Kevin"))
Juen = subset(Data, subset =(Marketing_Name == "Sherly"))
Jerrel = subset(Data, subset =(Marketing_Name == "Vanessa"))
Imelda = subset(Data, subset =(Marketing_Name == "Irene"))
Widi = subset(Data, subset =(Marketing_Name == "Julian"))
Theodora = subset(Data, subset =(Marketing_Name == "Jeffry"))
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 == "Sefli"))
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"))

Sales_name = 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")

total_sales = 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(Theodora$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))

Marketing=data.frame(Sales_name,total_sales)
Marketing
#marketing terbaik
Marketing[which.max(Marketing$total_sales),]
#kota dan cluster
Untung=Data[c("City","Cluster","Price")]
Untung[which.max(Untung$Price),]
review <- function(x){
  total_iklan = sum(x$Advertisement)*4
  rerata_iklan = total_iklan/sum(x$Advertisement)
  pendapatan = sum(x$Booking_fee) + sum(x$Bonus)
  return(cat(c("Total biaya iklan :", total_iklan, "\n",
               "Rata-rata biaya iklan:", rerata_iklan, "\n",
               "Total pendapatan bulanan:", pendapatan, "\n")))
}
review(x)
## Total biaya iklan : 8396 
##  Rata-rata biaya iklan: 4 
##  Total pendapatan bulanan: 184610.2166

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

No <- 1:50000

Marital_Status <- sample(c("Ya","Tidak"),50000,replace=TRUE)

Addres <- sample(c("Jakarta","Bogor","Depok","Tangerang","Bekasi"),50000, replace = TRUE)

Work_location <- sample(c("Jakarta","Bogor","Depok","Tangerang","Bekasi"),50000, replace=TRUE)

Age <- sample(c(19:60),50000,replace=TRUE)

Academic <- rep(c("J.School", "H.School", "Sarjana", "Magister", "Phd"),10000)

Job <- sample(c("Pengusaha","Pegawai","Supir","Perawat","Guru","Pelayan","Designer","Ibu_rumah_tangga","Asisten_rumah_tangga","fotografer","Artis","Penyanyi","Model","Koki","Arsitek","Ojek","Montir","Hair_stylish","Kolektor","Akuntan","Programmer","Atlet","MC","Wedding_Organizer","Vlogger","Selebgram","Sales","Pramugari","Pilot","Pelukis","Wartawan","Petani","Pesulap","Polisi","Pemadam_kebakaran","Penulis","Seniman","ilmuwan","Buruh","Tentara","Psikolog","Nelayan","Tukang_bangunan","Penjahit","Peternak","Teknisi","Komedian","Gammers","Youtuber","Sutradara"),50000,replace=TRUE)

Grade <- sample(c("A","B","C","D","E"),50000,replace=TRUE)

Income <- sample(c('<1000.000','1.000.000-2.000.000','2.000.000-3.000.000','3.000.000-4.000.000','4.000.000-5.000.000','>5.000.000'),50000,replace=TRUE)

Spending <- sample(c('<1000.000','1.000.000-2.000.000','2.000.000-3.000.000','3.000.000-4.000.000','4.000.000-5.000.000','>5.000.000'),50000,replace=TRUE)

Number_of_children <- ifelse(Marital_Status == "Ya", sample(c(1:10),25000,replace=TRUE),0)

Private_vehicle <- sample(c("Mobil","Motor","Umum"),50000,replace=TRUE)

Home <- sample(c("sewa","milik","kredit"),50000,replace=TRUE)

Asuransi <- data.frame(No,
                       Marital_Status,
                       Addres,
                       Work_location,
                       Age,
                       Academic,
                       Job,
                       Grade,
                       Income,
                       Spending,
                       Number_of_children,
                       Private_vehicle,
                       Home)

library(DT)
datatable(Asuransi)
## Warning in instance$preRenderHook(instance): It seems your data is too big
## for client-side DataTables. You may consider server-side processing: https://
## rstudio.github.io/DT/server.html

Soal 2

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

R

Asuransi$Age -> Umur

Statistik <- function(Umur)
{rerata = sum(Umur)/length(Umur)
 Maks = max(Umur)
 Min = min(Umur)
 Median = median(Umur)
 return(cat(c("Rata-rata umur :", rerata, "\n",
              "Maksimal Umur :", Maks, "\n",
              "Minimal umur :", Min, "\n",
              "Median dari umur :", Median, "\n")))}

Statistik(Umur)
## Rata-rata umur : 39.43988 
##  Maksimal Umur : 60 
##  Minimal umur : 19 
##  Median dari umur : 39

Soal 3

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

R

for (i in 1:nrow(Asuransi)){
  if (Asuransi$Home[i] == "milik")
    if(Asuransi$Income[i] == ">5.000.000"){
    Asuransi$Status[i] <- "Pertahankan"}
  else{
    Asuransi$Status[i] <- "Tidak"}
}

library(DT)
datatable(Asuransi)
## Warning in instance$preRenderHook(instance): It seems your data is too big
## for client-side DataTables. You may consider server-side processing: https://
## rstudio.github.io/DT/server.html

Referensi

  1. ref 1
  2. ref 2
  3. ref 3
LS0tDQp0aXRsZTogIkFsZ29yaXRtYSAmIFN0cnVrdHVyIERhdGEiDQpzdWJ0aXRsZTogIn4gVWppYW4gVGVuZ2FoIFNlbWVzdGVyIH4iDQphdXRob3I6ICJTaGFyb24gR3JhY2lhIEVkd2FyZCAoMjAyMTQ1MjAwMDIpIg0KZGF0ZTogICJgciBmb3JtYXQoU3lzLkRhdGUoKSwgJyVCICVkLCAlWScpYCINCm91dHB1dDoNCiAgcm1kZm9ybWF0czo6cm9ib2Jvb2s6ICAgDQogICAgc2VsZl9jb250YWluZWQ6IHRydWUNCiAgICB0aHVtYm5haWxzOiB0cnVlDQogICAgbGlnaHRib3g6IHRydWUNCiAgICBnYWxsZXJ5OiB0cnVlDQogICAgbGliX2RpcjogbGlicw0KICAgIGRmX3ByaW50OiAicGFnZWQiDQogICAgY29kZV9mb2xkaW5nOiAic2hvdyINCiAgICBjb2RlX2Rvd25sb2FkOiB5ZXMNCiAgICBjc3M6ICJzdHlsZS5jc3MiDQotLS0NCg0KDQo8YnI+DQoNCjxpbWcgc3R5bGU9ImZsb2F0OiByaWdodDsgbWFyZ2luOiAtNTBweCA1MHB4IDBweCA1MHB4OyB3aWR0aDozMCUiIHNyYz0iZm90b21lLmpwZWciLz4gDQoNCnwNCjotLS0tIHw6LS0tLQ0KKipLb250YWsqKnwgKio6ICRcZG93bmFycm93JCoqDQpFbWFpbHwgc2hhcm9uLmVkd2FyZEBzdHVkZW50Lm1hdGFuYXVuaXZlcnNpdHkuYWMuaWQNCkp1cnVzYW4gfCBGaXNpa2EgTWVkaXMgDQpSUHVicyAgfCBodHRwczovL3JwdWJzLmNvbS9zaGFyb25ncmFjaWEvIA0KDQoqKioNCg0KIyBLYXN1cyAxIA0KDQpBc3Vtc2lrYW4gQW5kYSB0ZWxhaCBtZW5ndW1wdWxrYW4gYmViZXJhcGEga3VtcHVsYW4gZGF0YSBkYXJpIHBlcnVzYWhhYW4gYEFCQyBQcm9wZXJ0eWAgc2VwZXJ0aSB5YW5nIGRhcGF0IGtpdGEgbGloYXQgcGFkYSB0YWJlbCBiZXJpa3V0OiANCg0KYGBge3IsIG1lc3NhZ2U9Rn0NCklkICAgICAgICAgICAgIDwtICgxOjEwMDAwKQ0KTWFya2V0aW5nX05hbWUgPC0gcmVwKGMoIkFuZ2VsIiwiU2hlcmx5IiwiVmFuZXNzYSIsIklyZW5lIiwiSnVsaWFuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICJKZWZmcnkiLCJOaWtpdGEiLCJLZWZhcyIsIlNpYW5hIiwiTGFsYSIsDQogICAgICAgICAgICAgICAgICAgICAgICAiRmFsbGVuIiwiQXJkaWZvIiwiS2V2aW4iLCJKdWVuIiwiSmVycmVsIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICJJbWVsZGEiLCJXaWRpIiwiVGhlb2RvcmEiLCJFbHZhbmkiLCJKb25hdGhhbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAiU29maWEiLCJBYnJhaGFtIiwiU2l0aSIsIk5pa28iLCJTZWZsaSIsDQogICAgICAgICAgICAgICAgICAgICAgICAiQmVuZSIsICJEaWFuYSIsICJQdXBlIiwgIkFuZGkiLCAiVGF0aGEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgIkVuZHJpIiwgIk1vbmlrYSIsICJIYW5zIiwgIkRlYm9yYSIsIkhhbmlmYSIsDQogICAgICAgICAgICAgICAgICAgICAgICAiSmFtZXMiLCAiSmloYW4iLCAiRnJpc2thIiwiQXJkaXdhbiIsICJCYWt0aSIsDQogICAgICAgICAgICAgICAgICAgICAgICAiQW50aG9uIiwiQW1yeSIsICJXaXdpayIsICJCYXN0aWFuIiwgIkJ1ZGkiLA0KICAgICAgICAgICAgICAgICAgICAgICAgIkxlbyIsIlNpbW9uIiwiTWF0aXVzIiwiQXJyeSIsICJFbGlhbmRvIiksIDIwMCkNCldvcmtfRXhwICAgICAgIDwtIHJlcChjKDEuMywyLjQsMi41LDMuNiwzLjcsNC43LDUuNyw2LjcsNy43LDcuMywNCiAgICAgICAgICAgICAgICAgICAgICAgIDUuMyw1LjMsMTAsOS4zLDMuMywzLjMsMy40LDMuNCwzLjUsNS42LA0KICAgICAgICAgICAgICAgICAgICAgICAgMy41LDQuNiw0LjYsNS43LDYuMiw0LjQsNi40LDYuNCwzLjUsNy41LA0KICAgICAgICAgICAgICAgICAgICAgICAgNC42LDMuNyw0LjcsNC4zLDUuMiw2LjMsNy40LDIuNCwzLjQsOC4yLA0KICAgICAgICAgICAgICAgICAgICAgICAgNi40LDcuMiwxLjUsNy41LDEwLDQuNSw2LjUsNy4yLDcuMSw3LjYpLDIwMCkNCkNpdHkgICAgICAgICAgIDwtIHNhbXBsZShjKCJKYWthcnRhIiwiQm9nb3IiLCJEZXBvayIsIlRlbmdlcmFuZyIsIkJla2FzaSIpLDEwMDAwLCByZXBsYWNlID0gVCkNCkNsdXN0ZXIgICAgICAgIDwtIHNhbXBsZShjKCJWaWN0b3JpYSIsIlBhbG15cmEiLCJXaW5vbmEiLCJUaWFyYSIsICJOYXJhZGEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBlcm9uaWEiLCJMYXZlc2giLCJBbGluZHJhIiwiU3dlZXRob21lIiwgIkFzZXJhIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJUZXJhZGFtYWkiLCJBbGJhc2lhIiwgIkFkYXJhIiwiTmVvbiIsIkFyYW5hIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJBc29rYSIsICJQcmltYWRvbmEiLCAiTXV0aWFyYSIsIlBlcm1hdGEiLCJBbGFtYW5kYSIgKSwgMTAwMDAsIHJlcGxhY2U9VCkNClByaWNlICAgICAgICAgIDwtIHNhbXBsZShjKDcwMDA6MTUwMDApLDEwMDAwLCByZXBsYWNlID0gVCkNCkRhdGVfU2FsZXMgICAgIDwtIHNhbXBsZShzZXEoYXMuRGF0ZSgiMjAxOC8wMS8wMSIpLCBieSA9ICJkYXkiLCBsZW5ndGgub3V0ID0gMTAwMCksMTAwMDAsIHJlcGxhY2UgPSBUKQ0KQWR2ZXJ0aXNlbWVudCAgPC0gc2FtcGxlKGMoMToyMCksIDEwMDAwLCByZXBsYWNlID0gVCkNCkRhdGEgICAgICAgICAgIDwtIGRhdGEuZnJhbWUoSWQsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXJrZXRpbmdfTmFtZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29ya19FeHAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIENpdHksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsdXN0ZXIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaWNlLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRlX1NhbGVzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZHZlcnRpc2VtZW50KQ0KbGlicmFyeShEVCkNCmRhdGF0YWJsZShEYXRhKQ0KYGBgDQoNCmBgYHtyfQ0Kd3JpdGUuY3N2KERhdGEsIkM6XFxVc2Vyc1xcWUVQUklcXERhdGEuY3N2Iixyb3cubmFtZXMgPSBGQUxTRSkNCmBgYA0KDQojIyBTb2FsIDEgey50YWJzZXQgLnRhYnNldC1waWxsc30NCg0KS2F0ZWdvcmlrYW4gdmFyaWFiZWwgYEhhcmdhYCBwYWRhIGRhdGFzZXQgZGkgYXRhcyBtZW5qYWRpIHRpZ2Ega2Vsb21wb2sgc2ViYWdhaSBiZXJpa3V0Og0KDQoqICRcdGV4dHtIaWdofSA+IDEyMDAwJA0KKiAkMTAwMDAgXGxlIFx0ZXh0e01lZGl1bX0gXGxlIDEyMDAwJA0KKiAkXHRleHR7TG93fSA8IDEwMDAwJA0KDQpUZXRhcGthbiBrZSBkYWxhbSB2YXJpYWJlbCBiYXJ1IHlhbmcgZGlzZWJ1dCBgS2VsYXNgIGRlbmdhbiBtZW5nZ3VuYWthbiBmdW5nc2kga29udHJvbCBgSWZgLCBgZWxzZSBpZmAsIGRhbiBgZWxzZWAuDQoNCiMjIyBSDQoNCmBgYHtyfQ0KaGFyZ2E8LSBmdW5jdGlvbihEYXRhKXsNCiAgaWYgKERhdGEkUHJpY2VbaV0gPiAxMjAwMCl7DQogICAgRGF0YSRLZWxhc1tpXSA8LSAiSGlnaCJ9DQogIGVsc2UgaWYgKERhdGEkUHJpY2VbaV0gPj0gMTAwMDAgJiBEYXRhJFByaWNlW2ldIDw9IDEyMDAwKXsNCiAgICBEYXRhJEtlbGFzW2ldIDwtICJNZWRpdW0iIH0NCiAgZWxzZXsNCiAgICBEYXRhJEtlbGFzW2ldIDwtICJMb3cifQ0KfQ0KbGlicmFyeShEVCkNCmRhdGF0YWJsZShEYXRhKQ0KYGBgDQoNCg0KDQojIyBTb2FsIDIgey50YWJzZXQgLnRhYnNldC1waWxsc30NCg0KS2F0ZWdvcmlrYW4gdmFyaWFiZWwgYEhhcmdhYCBwYWRhIGRhdGFzZXQgZGkgYXRhcyBtZW5qYWRpIGVuYW0ga2Vsb21wb2sgc2ViYWdhaSBiZXJpa3V0Og0KDQoqIEJvb2tpbmdfZmVlIG55YSA1ICUgamlrYSAkXHRleHR7UHJpY2V9IDwgODAwMCQNCiogQm9va2luZ19mZWUgbnlhIDYgJSBqaWthICQ4MDAwIFxsZSBcdGV4dHtQcmljZX0gPCA5MDAwJA0KKiBCb29raW5nX2ZlZSBueWEgNyAlIGppa2EgJDkwMDAgXGxlIFx0ZXh0e1ByaWNlfSA8IDEwMDAwJA0KKiBCb29raW5nX2ZlZSBueWEgOCAlIGppa2EgJDEwMDAwIFxsZSBcdGV4dHtQcmljZX0gPCAxMTAwMCQNCiogQm9va2luZ19mZWUgbnlhIDkgJSBqaWthICQxMTAwMCBcbGUgXHRleHR7UHJpY2V9IDwgMTMwMDAkDQoqIEJvb2tpbmdfZmVlIG55YSAxMCAlIGppa2EgJDEzMDAwIFxsZSBcdGV4dHtQcmljZX0gXGxlIDE1MDAwJA0KDQpUZXRhcGthbiBrZSBkYWxhbSB2YXJpYWJlbCBiYXJ1IHlhbmcgZGlzZWJ1dCBgQm9va2luZ19mZWVgIGRlbmdhbiBtZW5nZ3VuYWthbiBmdW5nc2kga29udHJvbCBgSWZgLCBgZWxzZSBpZmAsIGRhbiBgZWxzZWAuDQoNCiMjIyBSDQoNCmBgYHtyfQ0KDQpmb3IgKGkgaW4gMTpucm93KERhdGEpKXsNCiAgaWYgKERhdGEkUHJpY2VbaV0gPCA4MDAwKXsNCiAgICBEYXRhJEJvb2tpbmdfZmVlW2ldIDwtICgoRGF0YSRQcmljZVtpXSkgKiAoNS8xMDApKQ0KICB9DQogIGVsc2UgaWYgKERhdGEkUHJpY2VbaV0gPj0gODAwMCAmIERhdGEkUHJpY2VbaV0gPCA5MDAwKXsNCiAgICBEYXRhJEJvb2tpbmdfZmVlW2ldIDwtICgoRGF0YSRQcmljZVtpXSkgKiAoNi8xMDApKQ0KICB9DQogIGVsc2UgaWYgKERhdGEkUHJpY2VbaV0gPj0gOTAwMCAmIERhdGEkUHJpY2VbaV0gPCAxMDAwMCl7DQogICAgRGF0YSRCb29raW5nX2ZlZVtpXSA8LSAoKERhdGEkUHJpY2VbaV0pICogKDcvMTAwKSkNCiAgfQ0KICBlbHNlIGlmIChEYXRhJFByaWNlW2ldID49IDEwMDAwICYgRGF0YSRQcmljZVtpXSA8IDExMDAwKXsNCiAgICBEYXRhJEJvb2tpbmdfZmVlW2ldIDwtICgoRGF0YSRQcmljZVtpXSkgKiAoOC8xMDApKQ0KICB9DQogIGVsc2UgaWYgKERhdGEkUHJpY2VbaV0gPj0gMTEwMDAgJiBEYXRhJFByaWNlW2ldIDwgMTMwMDApew0KICAgIERhdGEkQm9va2luZ19mZWVbaV0gPC0gKChEYXRhJFByaWNlW2ldKSogKDkvMTAwKSkNCiAgfQ0KICBlbHNlIHsNCiAgICBEYXRhJEJvb2tpbmdfZmVlW2ldIDwtICgoRGF0YSRQcmljZVtpXSkqICgxMC8xMDApKQ0KICB9DQp9DQp0cmFuc2Zvcm0oRGF0YSwgQm9va2luZ19mZWUgPSBhcy5udW1lcmljKEJvb2tpbmdfZmVlKSkNCnR5cGVvZihEYXRhJEJvb2tpbmdfZmVlKQ0KbGlicmFyeShEVCkNCmRhdGF0YWJsZShEYXRhKQ0KDQoNCmBgYA0KDQoNCiMjIFNvYWwgMyB7LnRhYnNldCAudGFic2V0LXBpbGxzfQ0KDQpNZW51cnV0IGt1bXB1bGFuIGRhdGEgYWtoaXIgeWFuZyB0ZWxhaCBBbmRhIGJ1YXQgcGFkYSBzb2FsIG5vIDIsIHNheWEgYmVyYXN1bXNpIGJhaHdhIEFuZGEgdGVsYWggYmVrZXJqYSBzZWJhZ2FpIHBlbWFzYXJhbiBkaSBwZXJ1c2FoYWFuIGBBQkMgUHJvcGVydHlgLCBiYWdhaW1hbmEgQW5kYSBkYXBhdCBtZW5ndW1wdWxrYW4gc2VtdWEgaW5mb3JtYXNpIHRlbnRhbmcgcGVuanVhbGFuIEFuZGEgZGVuZ2FuIG1lbmdndW5ha2FuIHBlcm55YXRhYW4gYGZvcmAuIA0KDQojIyMgUg0KDQpgYGB7cn0NCmZvciAoaSBpbiAiSmVmZnJ5Iil7DQogIHByaW50KHN1YnNldChEYXRhLCBzdWJzZXQgPSAoTWFya2V0aW5nX05hbWUgPT1pKSkpDQp9DQoNCmBgYA0KDQoNCg0KIyMgU29hbCA0IHsudGFic2V0IC50YWJzZXQtcGlsbHN9DQoNCkppa2EgQW5kYSBha2FuIG1lbmRhcGF0a2FuIGJvbnVzIDIlIGRhcmkgYEJvb2tpbmcgZmVlYCBwZXIgdW5pdCBzZWJhZ2FpIHBlbWFzYXJhbiBkYW4ganVnYSBtZW5kYXBhdGthbiBib251cyB0YW1iYWhhbiAxJSBqaWthIEFuZGEgdGVsYWggYmVrZXJqYSBkaSBwZXJ1c2FoYWFuIGluaSBzZWxhbWEgbGViaWggZGFyaSAzIHRhaHVuLiBTaWxha2FuIGhpdHVuZyB0b3RhbCBib251cyBkZW5nYW4gbWVuZ2d1bmFrYW4gcGVybnlhdGFhbiBgaWYsIGZvciwgZGFuIGJyZWFrYC4gIA0KDQojIyMgUg0KDQpgYGB7cn0NCnNhbGVzID0gIkplZmZyeSINCnggPC0gc3Vic2V0KERhdGEsIHN1YnNldCA9IChNYXJrZXRpbmdfTmFtZSA9PSBzYWxlcykpIA0KDQpmb3IgKGkgaW4gMTpucm93KHgpKXsNCiAgaWYgKHgkV29ya19FeHAgW2ldID4gMyl7DQogICAgeCRCb251cyBbaV0gPC0gKCh4JEJvb2tpbmdfZmVlW2ldKSooMy8xMDApKQ0KICAgIH0NCiAgZWxzZSB7DQogICAgeCRCb251cyBbaV0gPC0gKCh4JEJvb2tpbmdfZmVlW2ldKSooMi8xMDApKQ0KICB9DQp9DQp4DQoNClRvdGFsID0gc3VtKHgkQm9udXMpDQpUb3RhbA0KYGBgDQoNCg0KDQojIyBTb2FsIDUgey50YWJzZXQgLnRhYnNldC1waWxsc30NCg0KUGFkYSBiYWdpYW4gaW5pLCBBbmRhIGRpaGFyYXBrYW4gZGFwYXQgbWVtYnVhdCBmdW5nc2kgeWFuZyBkYXBhdCBtZW5qYXdhYiBzZXRpYXAgcGVueWF0YWFuIGRpYmF3YWggaW5pIGRlbmdhbiBtZWxpYmF0a2FuIHNldGlhcCBmdW5nc2kga29udHJvbCB5YW5nIGRpcGVsYWphcmkgcGFkYSBwZXJ0ZW11YW4gNy4NCg0KKiBTaWFwYSBuYW1hIG1hcmtldGluZyBwZW1hc2FyYW4gdGVyYmFpaz8NCiogS290YSBkYW4gQ2x1c3RlciBtYW5hIHlhbmcgcGFsaW5nIG1lbmd1bnR1bmdrYW4/DQoqIEhpdHVuZyB0b3RhbCBiaWF5YSBpa2xhbiBBbmRhLCBqaWthIEFuZGEgaGFydXMgbWVtYmF5YXJueWEgJDQgc2V0aWFwIGthbGkgaWtsYW4uDQoqIEhpdHVuZyByYXRhLXJhdGEgYmlheWEgaWtsYW4gdW50dWsgc2V0aWFwIG1hcmtldGluZyBkaSBQZXJ1c2FoYWFuIHRlcnNlYnV0Lg0KKiBIaXR1bmcgVG90YWwgUGVuZGFwYXRhbiAoZGFsYW0gQnVsYW5hbikgDQoNCiMjIyBSDQoNCmBgYHtyfQ0KQW5nZWwgPSBzdWJzZXQoRGF0YSwgc3Vic2V0ID0oTWFya2V0aW5nX05hbWUgPT0gIkFuZ2VsIikpDQpTaGVybHkgPSBzdWJzZXQoRGF0YSwgc3Vic2V0ID0oTWFya2V0aW5nX05hbWUgPT0gIlNoZXJseSIpKQ0KVmFuZXNzYSA9IHN1YnNldChEYXRhLCBzdWJzZXQgPShNYXJrZXRpbmdfTmFtZSA9PSAiVmFuZXNzYSIpKQ0KSXJlbmUgPSBzdWJzZXQoRGF0YSwgc3Vic2V0ID0oTWFya2V0aW5nX05hbWUgPT0gIklyZW5lIikpDQpKdWxpYW4gPSBzdWJzZXQoRGF0YSwgc3Vic2V0ID0oTWFya2V0aW5nX05hbWUgPT0gIkp1bGlhbiIpKQ0KSmVmZnJ5ID0gc3Vic2V0KERhdGEsIHN1YnNldCA9KE1hcmtldGluZ19OYW1lID09ICJKZWZmcnkiKSkNCk5pa2l0YT0gc3Vic2V0KERhdGEsIHN1YnNldCA9KE1hcmtldGluZ19OYW1lID09ICJOaWtpdGEiKSkNCktlZmFzID0gc3Vic2V0KERhdGEsIHN1YnNldCA9KE1hcmtldGluZ19OYW1lID09ICJLZWZhcyIpKQ0KU2lhbmEgPSBzdWJzZXQoRGF0YSwgc3Vic2V0ID0oTWFya2V0aW5nX05hbWUgPT0gIlNpYW5hIikpDQpMYWxhID0gc3Vic2V0KERhdGEsIHN1YnNldCA9KE1hcmtldGluZ19OYW1lID09ICJMYWxhIikpDQpGYWxsZW4gPSBzdWJzZXQoRGF0YSwgc3Vic2V0ID0oTWFya2V0aW5nX05hbWUgPT0gIkZhbGVuIikpDQpBcmRpZm8gPSBzdWJzZXQoRGF0YSwgc3Vic2V0ID0oTWFya2V0aW5nX05hbWUgPT0gIkFyZGlmbyIpKQ0KS2V2aW4gPSBzdWJzZXQoRGF0YSwgc3Vic2V0ID0oTWFya2V0aW5nX05hbWUgPT0gIktldmluIikpDQpKdWVuID0gc3Vic2V0KERhdGEsIHN1YnNldCA9KE1hcmtldGluZ19OYW1lID09ICJTaGVybHkiKSkNCkplcnJlbCA9IHN1YnNldChEYXRhLCBzdWJzZXQgPShNYXJrZXRpbmdfTmFtZSA9PSAiVmFuZXNzYSIpKQ0KSW1lbGRhID0gc3Vic2V0KERhdGEsIHN1YnNldCA9KE1hcmtldGluZ19OYW1lID09ICJJcmVuZSIpKQ0KV2lkaSA9IHN1YnNldChEYXRhLCBzdWJzZXQgPShNYXJrZXRpbmdfTmFtZSA9PSAiSnVsaWFuIikpDQpUaGVvZG9yYSA9IHN1YnNldChEYXRhLCBzdWJzZXQgPShNYXJrZXRpbmdfTmFtZSA9PSAiSmVmZnJ5IikpDQpFbHZhbmkgPSBzdWJzZXQoRGF0YSwgc3Vic2V0ID0oTWFya2V0aW5nX05hbWUgPT0gIkVsdmFuaSIpKQ0KSm9uYXRoYW4gPSBzdWJzZXQoRGF0YSwgc3Vic2V0ID0oTWFya2V0aW5nX05hbWUgPT0gIkpvbmF0aGFuIikpDQpTb2ZpYSA9IHN1YnNldChEYXRhLCBzdWJzZXQgPShNYXJrZXRpbmdfTmFtZSA9PSAiU29maWEiKSkNCkFicmFoYW0gPSBzdWJzZXQoRGF0YSwgc3Vic2V0ID0oTWFya2V0aW5nX05hbWUgPT0gIkFicmFoYW0iKSkNClNpdGkgPSBzdWJzZXQoRGF0YSwgc3Vic2V0ID0oTWFya2V0aW5nX05hbWUgPT0gIlNpdGkiKSkNCk5pa28gPSBzdWJzZXQoRGF0YSwgc3Vic2V0ID0oTWFya2V0aW5nX05hbWUgPT0gIk5pa28iKSkNClNlZmxpID0gc3Vic2V0KERhdGEsIHN1YnNldCA9KE1hcmtldGluZ19OYW1lID09ICJTZWZsaSIpKQ0KQmVuZSA9IHN1YnNldChEYXRhLCBzdWJzZXQgPShNYXJrZXRpbmdfTmFtZSA9PSAiQmVuZSIpKQ0KRGlhbmEgPSBzdWJzZXQoRGF0YSwgc3Vic2V0ID0oTWFya2V0aW5nX05hbWUgPT0gIkRpYW5hIikpDQpQdXBlID0gc3Vic2V0KERhdGEsIHN1YnNldCA9KE1hcmtldGluZ19OYW1lID09ICJQdXBlIikpDQpBbmRpID0gc3Vic2V0KERhdGEsIHN1YnNldCA9KE1hcmtldGluZ19OYW1lID09ICJBbmRpIikpDQpUYXRoYSA9IHN1YnNldChEYXRhLCBzdWJzZXQgPShNYXJrZXRpbmdfTmFtZSA9PSAiVGF0aGEiKSkNCkVuZHJpID0gc3Vic2V0KERhdGEsIHN1YnNldCA9KE1hcmtldGluZ19OYW1lID09ICJFbmRyaSIpKQ0KTW9uaWthID0gc3Vic2V0KERhdGEsIHN1YnNldCA9KE1hcmtldGluZ19OYW1lID09ICJNb25pa2EiKSkNCkhhbnMgPSBzdWJzZXQoRGF0YSwgc3Vic2V0ID0oTWFya2V0aW5nX05hbWUgPT0gIkhhbnMiKSkNCkRlYm9yYSA9IHN1YnNldChEYXRhLCBzdWJzZXQgPShNYXJrZXRpbmdfTmFtZSA9PSAiRGVib3JhIikpDQpIYW5pZmEgPSBzdWJzZXQoRGF0YSwgc3Vic2V0ID0oTWFya2V0aW5nX05hbWUgPT0gIkhhbmlmYSIpKQ0KSmFtZXMgPSBzdWJzZXQoRGF0YSwgc3Vic2V0ID0oTWFya2V0aW5nX05hbWUgPT0gIkphbWVzIikpDQpKaWhhbiA9IHN1YnNldChEYXRhLCBzdWJzZXQgPShNYXJrZXRpbmdfTmFtZSA9PSAiSmloYW4iKSkNCkZyaXNrYSA9IHN1YnNldChEYXRhLCBzdWJzZXQgPShNYXJrZXRpbmdfTmFtZSA9PSAiRnJpc2thIikpDQpBcmRpd2FuID0gc3Vic2V0KERhdGEsIHN1YnNldCA9KE1hcmtldGluZ19OYW1lID09ICJBcmRpd2FuIikpDQpCYWt0aSA9IHN1YnNldChEYXRhLCBzdWJzZXQgPShNYXJrZXRpbmdfTmFtZSA9PSAiQmFrdGkiKSkNCkFudGhvbiA9IHN1YnNldChEYXRhLCBzdWJzZXQgPShNYXJrZXRpbmdfTmFtZSA9PSAiQW50aG9uIikpDQpBbXJ5ID0gc3Vic2V0KERhdGEsIHN1YnNldCA9KE1hcmtldGluZ19OYW1lID09ICJBbXJ5IikpDQpXaXdpayA9IHN1YnNldChEYXRhLCBzdWJzZXQgPShNYXJrZXRpbmdfTmFtZSA9PSAiV2l3aWsiKSkNCkJhc3RpYW4gPSBzdWJzZXQoRGF0YSwgc3Vic2V0ID0oTWFya2V0aW5nX05hbWUgPT0gIkJhc3RpYW4iKSkNCkJ1ZGkgPSBzdWJzZXQoRGF0YSwgc3Vic2V0ID0oTWFya2V0aW5nX05hbWUgPT0gIkJ1ZGkiKSkNCkxlbyA9IHN1YnNldChEYXRhLCBzdWJzZXQgPShNYXJrZXRpbmdfTmFtZSA9PSAiTGVvIikpDQpTaW1vbiA9IHN1YnNldChEYXRhLCBzdWJzZXQgPShNYXJrZXRpbmdfTmFtZSA9PSAiU2ltb24iKSkNCk1hdGl1cyA9IHN1YnNldChEYXRhLCBzdWJzZXQgPShNYXJrZXRpbmdfTmFtZSA9PSAiTWF0aXVzIikpDQpBcnJ5ID0gc3Vic2V0KERhdGEsIHN1YnNldCA9KE1hcmtldGluZ19OYW1lID09ICJBcnJ5IikpDQpFbGlhbmRvID0gc3Vic2V0KERhdGEsIHN1YnNldCA9KE1hcmtldGluZ19OYW1lID09ICJFbGlhbmRvIikpDQoNClNhbGVzX25hbWUgPSBjKCJBbmdlbCIsIlNoZXJseSIsIlZhbmVzc2EiLCJJcmVuZSIsIkp1bGlhbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAiSmVmZnJ5IiwiTmlraXRhIiwiS2VmYXMiLCJTaWFuYSIsIkxhbGEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgIkZhbGxlbiIsIkFyZGlmbyIsIktldmluIiwiSnVlbiIsIkplcnJlbCIsDQogICAgICAgICAgICAgICAgICAgICAgICAiSW1lbGRhIiwiV2lkaSIsIlRoZW9kb3JhIiwiRWx2YW5pIiwiSm9uYXRoYW4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgIlNvZmlhIiwiQWJyYWhhbSIsIlNpdGkiLCJOaWtvIiwiU2VmbGkiLA0KICAgICAgICAgICAgICAgICAgICAgICAgIkJlbmUiLCAiRGlhbmEiLCAiUHVwZSIsICJBbmRpIiwgIlRhdGhhIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICJFbmRyaSIsICJNb25pa2EiLCAiSGFucyIsICJEZWJvcmEiLCJIYW5pZmEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgIkphbWVzIiwgIkppaGFuIiwgIkZyaXNrYSIsIkFyZGl3YW4iLCAiQmFrdGkiLA0KICAgICAgICAgICAgICAgICAgICAgICAgIkFudGhvbiIsIkFtcnkiLCAiV2l3aWsiLCAiQmFzdGlhbiIsICJCdWRpIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICJMZW8iLCJTaW1vbiIsIk1hdGl1cyIsIkFycnkiLCAiRWxpYW5kbyIpDQoNCnRvdGFsX3NhbGVzID0gYyhzdW0oQW5nZWwkUHJpY2UpLCBzdW0oU2hlcmx5JFByaWNlKSwgc3VtKFZhbmVzc2EkUHJpY2UpLCBzdW0oSXJlbmUkUHJpY2UpLCBzdW0oSnVsaWFuJFByaWNlKSwgc3VtKEplZmZyeSRQcmljZSksIHN1bShOaWtpdGEkUHJpY2UpLCBzdW0oS2VmYXMkUHJpY2UpLCBzdW0oU2lhbmEkUHJpY2UpLCBzdW0oTGFsYSRQcmljZSksIHN1bShGYWxsZW4kUHJpY2UpLCBzdW0oQXJkaWZvJFByaWNlKSwgc3VtKEtldmluJFByaWNlKSwgc3VtKEp1ZW4kUHJpY2UpLCBzdW0oSmVycmVsJFByaWNlKSwgc3VtKEltZWxkYSRQcmljZSksIHN1bShXaWRpJFByaWNlKSwgc3VtKFRoZW9kb3JhJFByaWNlKSwgc3VtKEVsdmFuaSRQcmljZSksIHN1bShKb25hdGhhbiRQcmljZSksIHN1bShTb2ZpYSRQcmljZSksIHN1bShBYnJhaGFtJFByaWNlKSwgc3VtKFNpdGkkUHJpY2UpLCBzdW0oTmlrbyRQcmljZSksIHN1bShTZWZsaSRQcmljZSksIHN1bShCZW5lJFByaWNlKSwgc3VtKERpYW5hJFByaWNlKSwgc3VtKFB1cGUkUHJpY2UpLCBzdW0oQW5kaSRQcmljZSksIHN1bShUYXRoYSRQcmljZSksIHN1bShFbmRyaSRQcmljZSksIHN1bShNb25pa2EkUHJpY2UpLCBzdW0oSGFucyRQcmljZSksIHN1bShEZWJvcmEkUHJpY2UpLCBzdW0oSGFuaWZhJFByaWNlKSwgc3VtKEphbWVzJFByaWNlKSwgc3VtKEppaGFuJFByaWNlKSwgc3VtKEZyaXNrYSRQcmljZSksIHN1bShBcmRpd2FuJFByaWNlKSwgc3VtKEJha3RpJFByaWNlKSwgc3VtKEFudGhvbiRQcmljZSksIHN1bShBbXJ5JFByaWNlKSwgc3VtKFdpd2lrJFByaWNlKSwgc3VtKEJhc3RpYW4kUHJpY2UpLCBzdW0oQnVkaSRQcmljZSksIHN1bShMZW8kUHJpY2UpLCBzdW0oU2ltb24kUHJpY2UpLCBzdW0oTWF0aXVzJFByaWNlKSwgc3VtKEFycnkkUHJpY2UpLCBzdW0oRWxpYW5kbyRQcmljZSkpDQoNCk1hcmtldGluZz1kYXRhLmZyYW1lKFNhbGVzX25hbWUsdG90YWxfc2FsZXMpDQpNYXJrZXRpbmcNCmBgYA0KDQpgYGB7cn0NCiNtYXJrZXRpbmcgdGVyYmFpaw0KTWFya2V0aW5nW3doaWNoLm1heChNYXJrZXRpbmckdG90YWxfc2FsZXMpLF0NCmBgYA0KDQpgYGB7cn0NCiNrb3RhIGRhbiBjbHVzdGVyDQpVbnR1bmc9RGF0YVtjKCJDaXR5IiwiQ2x1c3RlciIsIlByaWNlIildDQpVbnR1bmdbd2hpY2gubWF4KFVudHVuZyRQcmljZSksXQ0KYGBgDQoNCmBgYHtyfQ0KcmV2aWV3IDwtIGZ1bmN0aW9uKHgpew0KICB0b3RhbF9pa2xhbiA9IHN1bSh4JEFkdmVydGlzZW1lbnQpKjQNCiAgcmVyYXRhX2lrbGFuID0gdG90YWxfaWtsYW4vc3VtKHgkQWR2ZXJ0aXNlbWVudCkNCiAgcGVuZGFwYXRhbiA9IHN1bSh4JEJvb2tpbmdfZmVlKSArIHN1bSh4JEJvbnVzKQ0KICByZXR1cm4oY2F0KGMoIlRvdGFsIGJpYXlhIGlrbGFuIDoiLCB0b3RhbF9pa2xhbiwgIlxuIiwNCiAgICAgICAgICAgICAgICJSYXRhLXJhdGEgYmlheWEgaWtsYW46IiwgcmVyYXRhX2lrbGFuLCAiXG4iLA0KICAgICAgICAgICAgICAgIlRvdGFsIHBlbmRhcGF0YW4gYnVsYW5hbjoiLCBwZW5kYXBhdGFuLCAiXG4iKSkpDQp9DQpyZXZpZXcoeCkNCmBgYA0KDQoNCiMgS2FzdXMgMg0KDQpNaXNhbGthbiBBbmRhIG1lbWlsaWtpIHByb3llayByaXNldCBwYXNhciB1bnR1ayBtZW1wZXJ0YWhhbmthbiBiZWJlcmFwYSBwZWxhbmdnYW4gcG90ZW5zaWFsIGRpIHBlcnVzYWhhYW4gQW5kYS4gTWFyaSBraXRhIGFzdW1zaWthbiBBbmRhIGJla2VyamEgZGkgcGVydXNhaGFhbiBhc3VyYW5zaSBBQkMuIFVudHVrIG1lbGFrdWthbm55YSwgQW5kYSBpbmdpbiBtZW5ndW1wdWxrYW4ga3VtcHVsYW4gZGF0YSBiZXJpa3V0Og0KDQoqICoqTWFyaXRhbF9TdGF0dXMqKiAgICA6IG1lbmV0YXBrYW4gc3RhdHVzIHBlcmthd2luYW4gYWNhayAoIllhIiwgIlRpZGFrIikNCiogKipBZGRyZXNzKiogICAgICAgICAgIDogYmVyaWthbiBhbGFtYXQgYWNhayAoSkFCT0RFVEFCRUspIA0KKiAqKldvcmtfTG9jYXRpb24qKiAgICAgOiBtZW5ldGFwa2FuIGxva2FzaSBrZXJqYSBzZWNhcmEgYWNhayAoSkFCT0RFVEFCRUspIA0KKiAqKkFnZSoqICAgICAgICAgICAgICAgOiBtZW5ldGFwa2FuIHVydXRhbiBhbmdrYSBhY2FrIChkYXJpIDE5IGhpbmdnYSA2MCkgDQoqICoqQWNhZGVtaWMqKiAgICAgICAgICA6IG1lbmV0YXBrYW4gdGluZ2thdCBha2FkZW1payBhY2FrICgiSi5TY2hvb2wiLCAiSC5TY2hvb2wiLCAiU2FyamFuYSIsICJNYWdpc3RlciIsICJQaGQiKSANCiogKipKb2IqKiAgICAgICAgICAgICAgIDogMTAgcGVrZXJqYWFuIGFjYWsgdW50dWsgc2V0aWFwIHRpbmdrYXQgYWthZGVtaWsgIA0KKiAqKkdyYWRlKiogICAgICAgICAgICAgOiA1IG5pbGFpIGFjYWsgdW50dWsgc2V0aWFwIFBla2VyamFhbiANCiogKipJbmNvbWUqKiAgICAgICAgICAgIDogdGV0YXBrYW4gcGVuZGFwYXRhbiB5YW5nIG11bmdraW4gdW50dWsgc2V0aWFwIFBla2VyamFhbiAgDQoqICoqU3BlbmRpbmcqKiAgICAgICAgICA6IHRldGFwa2FuIGtlbXVuZ2tpbmFuIHBlbmdlbHVhcmFuIHVudHVrIHNldGlhcCBQZWtlcmphYW4gDQoqICoqTnVtYmVyX29mX2NoaWxkcmVuKio6IG1lbmV0YXBrYW4gbm9tb3IgYWNhayBkaSBhbnRhcmEgMCBkYW4gMTAgKHNlc3VhaSBkZW5nYW4gc3RhdHVzIHBlcmthd2luYW4pDQoqICoqUHJpdmF0ZV92ZWhpY2xlKiogICA6IG1lbmV0YXBrYW4ga2VtdW5na2luYW4ga2VuZGFyYWFuIHByaWJhZGkgdW50dWsgc2V0aWFwIG9yYW5nICgiTW9iaWwiLCAic2VwZWRhIG1vdG9yIiwgIlVtdW0iKSANCiogKipIb21lKiogICAgICAgICAgICAgIDogIlNld2EiLCAiTWlsaWsiLCAiS3JlZGl0IiANCg0KIyMgU29hbCAxIHsudGFic2V0IC50YWJzZXQtcGlsbHN9DQoNClRvbG9uZyBiZXJpa2FuIHNheWEga3VtcHVsYW4gZGF0YSB0ZW50YW5nIGluZm9ybWFzaSA1MDAwMCBwZWxhbmdnYW4geWFuZyBtZW5nYWN1IHBhZGEgc2V0aWFwIHZhcmlhYmVsIGRpIGF0YXMhIA0KDQojIyMgUiANCg0KYGBge3J9DQpObyA8LSAxOjUwMDAwDQoNCk1hcml0YWxfU3RhdHVzIDwtIHNhbXBsZShjKCJZYSIsIlRpZGFrIiksNTAwMDAscmVwbGFjZT1UUlVFKQ0KDQpBZGRyZXMgPC0gc2FtcGxlKGMoIkpha2FydGEiLCJCb2dvciIsIkRlcG9rIiwiVGFuZ2VyYW5nIiwiQmVrYXNpIiksNTAwMDAsIHJlcGxhY2UgPSBUUlVFKQ0KDQpXb3JrX2xvY2F0aW9uIDwtIHNhbXBsZShjKCJKYWthcnRhIiwiQm9nb3IiLCJEZXBvayIsIlRhbmdlcmFuZyIsIkJla2FzaSIpLDUwMDAwLCByZXBsYWNlPVRSVUUpDQoNCkFnZSA8LSBzYW1wbGUoYygxOTo2MCksNTAwMDAscmVwbGFjZT1UUlVFKQ0KDQpBY2FkZW1pYyA8LSByZXAoYygiSi5TY2hvb2wiLCAiSC5TY2hvb2wiLCAiU2FyamFuYSIsICJNYWdpc3RlciIsICJQaGQiKSwxMDAwMCkNCg0KSm9iIDwtIHNhbXBsZShjKCJQZW5ndXNhaGEiLCJQZWdhd2FpIiwiU3VwaXIiLCJQZXJhd2F0IiwiR3VydSIsIlBlbGF5YW4iLCJEZXNpZ25lciIsIklidV9ydW1haF90YW5nZ2EiLCJBc2lzdGVuX3J1bWFoX3RhbmdnYSIsImZvdG9ncmFmZXIiLCJBcnRpcyIsIlBlbnlhbnlpIiwiTW9kZWwiLCJLb2tpIiwiQXJzaXRlayIsIk9qZWsiLCJNb250aXIiLCJIYWlyX3N0eWxpc2giLCJLb2xla3RvciIsIkFrdW50YW4iLCJQcm9ncmFtbWVyIiwiQXRsZXQiLCJNQyIsIldlZGRpbmdfT3JnYW5pemVyIiwiVmxvZ2dlciIsIlNlbGViZ3JhbSIsIlNhbGVzIiwiUHJhbXVnYXJpIiwiUGlsb3QiLCJQZWx1a2lzIiwiV2FydGF3YW4iLCJQZXRhbmkiLCJQZXN1bGFwIiwiUG9saXNpIiwiUGVtYWRhbV9rZWJha2FyYW4iLCJQZW51bGlzIiwiU2VuaW1hbiIsImlsbXV3YW4iLCJCdXJ1aCIsIlRlbnRhcmEiLCJQc2lrb2xvZyIsIk5lbGF5YW4iLCJUdWthbmdfYmFuZ3VuYW4iLCJQZW5qYWhpdCIsIlBldGVybmFrIiwiVGVrbmlzaSIsIktvbWVkaWFuIiwiR2FtbWVycyIsIllvdXR1YmVyIiwiU3V0cmFkYXJhIiksNTAwMDAscmVwbGFjZT1UUlVFKQ0KDQpHcmFkZSA8LSBzYW1wbGUoYygiQSIsIkIiLCJDIiwiRCIsIkUiKSw1MDAwMCxyZXBsYWNlPVRSVUUpDQoNCkluY29tZSA8LSBzYW1wbGUoYygnPDEwMDAuMDAwJywnMS4wMDAuMDAwLTIuMDAwLjAwMCcsJzIuMDAwLjAwMC0zLjAwMC4wMDAnLCczLjAwMC4wMDAtNC4wMDAuMDAwJywnNC4wMDAuMDAwLTUuMDAwLjAwMCcsJz41LjAwMC4wMDAnKSw1MDAwMCxyZXBsYWNlPVRSVUUpDQoNClNwZW5kaW5nIDwtIHNhbXBsZShjKCc8MTAwMC4wMDAnLCcxLjAwMC4wMDAtMi4wMDAuMDAwJywnMi4wMDAuMDAwLTMuMDAwLjAwMCcsJzMuMDAwLjAwMC00LjAwMC4wMDAnLCc0LjAwMC4wMDAtNS4wMDAuMDAwJywnPjUuMDAwLjAwMCcpLDUwMDAwLHJlcGxhY2U9VFJVRSkNCg0KTnVtYmVyX29mX2NoaWxkcmVuIDwtIGlmZWxzZShNYXJpdGFsX1N0YXR1cyA9PSAiWWEiLCBzYW1wbGUoYygxOjEwKSwyNTAwMCxyZXBsYWNlPVRSVUUpLDApDQoNClByaXZhdGVfdmVoaWNsZSA8LSBzYW1wbGUoYygiTW9iaWwiLCJNb3RvciIsIlVtdW0iKSw1MDAwMCxyZXBsYWNlPVRSVUUpDQoNCkhvbWUgPC0gc2FtcGxlKGMoInNld2EiLCJtaWxpayIsImtyZWRpdCIpLDUwMDAwLHJlcGxhY2U9VFJVRSkNCg0KQXN1cmFuc2kgPC0gZGF0YS5mcmFtZShObywNCiAgICAgICAgICAgICAgICAgICAgICAgTWFyaXRhbF9TdGF0dXMsDQogICAgICAgICAgICAgICAgICAgICAgIEFkZHJlcywNCiAgICAgICAgICAgICAgICAgICAgICAgV29ya19sb2NhdGlvbiwNCiAgICAgICAgICAgICAgICAgICAgICAgQWdlLA0KICAgICAgICAgICAgICAgICAgICAgICBBY2FkZW1pYywNCiAgICAgICAgICAgICAgICAgICAgICAgSm9iLA0KICAgICAgICAgICAgICAgICAgICAgICBHcmFkZSwNCiAgICAgICAgICAgICAgICAgICAgICAgSW5jb21lLA0KICAgICAgICAgICAgICAgICAgICAgICBTcGVuZGluZywNCiAgICAgICAgICAgICAgICAgICAgICAgTnVtYmVyX29mX2NoaWxkcmVuLA0KICAgICAgICAgICAgICAgICAgICAgICBQcml2YXRlX3ZlaGljbGUsDQogICAgICAgICAgICAgICAgICAgICAgIEhvbWUpDQoNCmxpYnJhcnkoRFQpDQpkYXRhdGFibGUoQXN1cmFuc2kpDQpgYGANCg0KDQoNCg0KIyMgU29hbCAyIHsudGFic2V0IC50YWJzZXQtcGlsbHN9DQoNClJpbmdrYXNhbiBTdGF0aXN0aWsgcGVudGluZyBzZXBlcnRpIGFwYSB5YW5nIGJpc2EgQW5kYSBkYXBhdGthbiBkYXJpIGt1bXB1bGFuIGRhdGEgQW5kYT8NCg0KIyMjIFINCg0KYGBge3J9DQpBc3VyYW5zaSRBZ2UgLT4gVW11cg0KDQpTdGF0aXN0aWsgPC0gZnVuY3Rpb24oVW11cikNCntyZXJhdGEgPSBzdW0oVW11cikvbGVuZ3RoKFVtdXIpDQogTWFrcyA9IG1heChVbXVyKQ0KIE1pbiA9IG1pbihVbXVyKQ0KIE1lZGlhbiA9IG1lZGlhbihVbXVyKQ0KIHJldHVybihjYXQoYygiUmF0YS1yYXRhIHVtdXIgOiIsIHJlcmF0YSwgIlxuIiwNCiAgICAgICAgICAgICAgIk1ha3NpbWFsIFVtdXIgOiIsIE1ha3MsICJcbiIsDQogICAgICAgICAgICAgICJNaW5pbWFsIHVtdXIgOiIsIE1pbiwgIlxuIiwNCiAgICAgICAgICAgICAgIk1lZGlhbiBkYXJpIHVtdXIgOiIsIE1lZGlhbiwgIlxuIikpKX0NCg0KU3RhdGlzdGlrKFVtdXIpDQoNCmBgYA0KDQoNCg0KDQojIyBTb2FsIDMgey50YWJzZXQgLnRhYnNldC1waWxsc30NCg0KTWVudXJ1dCBwZXJoaXR1bmdhbiBkYW4gYW5hbGlzaXMgQW5kYSwgcGVsYW5nZ2FuIG1hbmEgeWFuZyBwb3RlbnNpYWwgdW50dWsgQW5kYSBwZXJ0YWhhbmthbj8gDQoNCiMjIyBSDQoNCmBgYHtyfQ0KZm9yIChpIGluIDE6bnJvdyhBc3VyYW5zaSkpew0KICBpZiAoQXN1cmFuc2kkSG9tZVtpXSA9PSAibWlsaWsiKQ0KICAgIGlmKEFzdXJhbnNpJEluY29tZVtpXSA9PSAiPjUuMDAwLjAwMCIpew0KICAgIEFzdXJhbnNpJFN0YXR1c1tpXSA8LSAiUGVydGFoYW5rYW4ifQ0KICBlbHNlew0KICAgIEFzdXJhbnNpJFN0YXR1c1tpXSA8LSAiVGlkYWsifQ0KfQ0KDQpsaWJyYXJ5KERUKQ0KZGF0YXRhYmxlKEFzdXJhbnNpKQ0KYGBgDQoNCg0KDQogDQoNCg0KIyBSZWZlcmVuc2kNCg0KMS4gICByZWYgMQ0KMi4gICByZWYgMg0KMy4gICByZWYgMw0KDQoNCg0KDQo=