Data Science Programming ~ Week 2
Muhammad Nabil Khairil Anam
Data Science Student
Institut Teknologi Sains Bandung (ITSB)
1 Persiapan Data Karyawan
#------------------------------------------------------------------------------------------
# PERSIAPAN DATA KARYAWAN
#------------------------------------------------------------------------------------------
# Membuat dataset karyawan dalam bentuk data frame
karyawan <- data.frame(
ID = c(1, 2, 3, 4, 5),
Nama = c("Bagas", "Joan", "Alya", "Dwi", "Nabil"),
Umur = c(25, 30, 27, 35, 40),
Gaji = c(5000, 7000, 6500, 10000, 12000),
Posisi = c("Staff", "Supervisor", "Staff", "Manager", "Direktur"),
Kinerja = c("Baik", "Sangat Baik", "Rata-rata", "Baik", "Sangat Baik"),
stringsAsFactors = FALSE
)
# Memastikan data sudah benar
print("Data karyawan berhasil disimpan!")## [1] "Data karyawan berhasil disimpan!"
## [1] "Jumlah karyawan: 5"
## ID Nama Umur Gaji Posisi Kinerja
## 1 1 Bagas 25 5000 Staff Baik
## 2 2 Joan 30 7000 Supervisor Sangat Baik
## 3 3 Alya 27 6500 Staff Rata-rata
## 4 4 Dwi 35 10000 Manager Baik
## 5 5 Nabil 40 12000 Direktur Sangat Baik
2 Menghitung Bonus Karyawan
#------------------------------------------------------------------------------------------
# MENGHITUNG BONUS KARYAWAN
#------------------------------------------------------------------------------------------
cat(" MENGHITUNG BONUS KARYAWAN\n")## MENGHITUNG BONUS KARYAWAN
# Loop untuk setiap baris data
for (i in 1:nrow(karyawan)) {
nama <- karyawan[i, "Nama"]
kinerja <- karyawan[i, "Kinerja"]
gaji <- karyawan[i, "Gaji"]
# Hitung bonus berdasarkan kinerja
if (kinerja == "Sangat Baik") {
bonus <- gaji * 0.20
} else if (kinerja == "Baik") {
bonus <- gaji * 0.10
} else if (kinerja == "Rata-rata") {
bonus <- gaji * 0.05
} else {
bonus <- 0
cat(paste("Peringatan: Kinerja", kinerja, "untuk", nama, "tidak dikenal\n"))
}
# Tampilkan hasil (pake cat biar rapi)
cat(paste("Name:", nama, ", Bonus:", as.integer(bonus), "\n"))
}## Name: Bagas , Bonus: 500
## Name: Joan , Bonus: 1400
## Name: Alya , Bonus: 325
## Name: Dwi , Bonus: 1000
## Name: Nabil , Bonus: 2400
3 Menampilkan Karyawan dengan Gaji > 6000
#------------------------------------------------------------------------------------------
# MENAMPILKAN KARYAWAN DENGAN GAJI > 6000
#------------------------------------------------------------------------------------------
cat(" KARYAWAN DENGAN GAJI > 6000\n")## KARYAWAN DENGAN GAJI > 6000
# Loop untuk setiap baris data
for (i in 1:nrow(karyawan)) {
nama <- karyawan[i, "Nama"]
gaji <- karyawan[i, "Gaji"]
# Cek apakah gaji lebih dari 6000
if (gaji > 6000) {
cat(paste("Name:", nama, ", Salary:", gaji, "\n"))
}
}## Name: Joan , Salary: 7000
## Name: Alya , Salary: 6500
## Name: Dwi , Salary: 10000
## Name: Nabil , Salary: 12000
4 Menampilkan Karyawan Sampai Manager (While Loop)
#------------------------------------------------------------------------------------------
# MENAMPILKAN KARYAWAN SAMPAI MANAGER (WHILE LOOP)
#------------------------------------------------------------------------------------------
cat(" MENAMPILKAN KARYAWAN SAMPAI MANAGER\n")## MENAMPILKAN KARYAWAN SAMPAI MANAGER
# Inisialisasi indeks
i <- 1
# While loop selama masih ada data
while (i <= nrow(karyawan)) {
nama <- karyawan[i, "Nama"]
posisi <- karyawan[i, "Posisi"]
# Tampilkan nama dan posisi
cat(paste("Name:", nama, ", Position:", posisi, "\n"))
# Cek apakah posisinya Manager
if (posisi == "Manager") {
cat("(Stop here)\n")
break # Hentikan loop
}
# Naikkan indeks untuk karyawan berikutnya
i <- i + 1
}## Name: Bagas , Position: Staff
## Name: Joan , Position: Supervisor
## Name: Alya , Position: Staff
## Name: Dwi , Position: Manager
## (Stop here)
5 Break Ketika Gaji > 10000
#------------------------------------------------------------------------------------------
# BREAK KETIKA GAJI > 10000
#------------------------------------------------------------------------------------------
cat(" MENAMPILKAN KARYAWAN SAMPAI GAJI 10000\n")## MENAMPILKAN KARYAWAN SAMPAI GAJI 10000
# Loop untuk setiap karyawan
for (i in 1:nrow(karyawan)) {
nama <- karyawan[i, "Nama"]
gaji <- karyawan[i, "Gaji"]
# CEK DULU sebelum menampilkan
if (gaji > 10000) {
cat("(Dihentikan karena Nabil memiliki gaji di atas 10.000)")
break # Hentikan loop, Nabil TIDAK ditampilkan
}
# Tampilkan nama dan gaji (hanya jika gaji <= 10000)
cat(paste("Name:", nama, ", Salary:", gaji, "\n"))
}## Name: Bagas , Salary: 5000
## Name: Joan , Salary: 7000
## Name: Alya , Salary: 6500
## Name: Dwi , Salary: 10000
## (Dihentikan karena Nabil memiliki gaji di atas 10.000)
6 Continue Untuk Melewati Kinerja “Rata-Rata”
#------------------------------------------------------------------------------------------
# CONTINUE UNTUK MELEWATI KINERJA "RATA-RATA"
#------------------------------------------------------------------------------------------
cat(" KARYAWAN DENGAN KINERJA BAIK & SANGAT BAIK\n")## KARYAWAN DENGAN KINERJA BAIK & SANGAT BAIK
# Loop untuk setiap karyawan
for (i in 1:nrow(karyawan)) {
nama <- karyawan[i, "Nama"]
kinerja <- karyawan[i, "Kinerja"]
# CEK: jika kinerja "Rata-rata", SKIP (next)
if (kinerja == "Rata-rata") {
cat(paste("(", nama, "dilewati karena performanya 'Rata-rata')\n"))
next # Langsung loncat ke iterasi berikutnya
}
# Hanya sampai sini jika kinerja bukan "Rata-rata"
cat(paste("Name:", nama, ", Performance:", kinerja, "\n"))
}## Name: Bagas , Performance: Baik
## Name: Joan , Performance: Sangat Baik
## ( Alya dilewati karena performanya 'Rata-rata')
## Name: Dwi , Performance: Baik
## Name: Nabil , Performance: Sangat Baik
LS0tDQp0aXRsZTogIkRhdGEgU2NpZW5jZSBQcm9ncmFtbWluZyB+IFdlZWsgMiINCmF1dGhvcjogIk11aGFtbWFkIE5hYmlsIEtoYWlyaWwgQW5hbSINCmRhdGU6ICJgciBmb3JtYXQoU3lzLkRhdGUoKSwgJyVCICVkLCAlWScpYCIgICMgQXV0byBkaXNwbGF5cyBjdXJyZW50IGRhdGUNCm91dHB1dDoNCiAgcm1kZm9ybWF0czo6cmVhZHRoZWRvd246ICAgICAgICAgICAgICAgIyBodHRwczovL2dpdGh1Yi5jb20vanViYS9ybWRmb3JtYXRzDQogICAgY3NzOiAiY3VzdG9tLmNzcyIgICAgICAgICAgICAgICAgICAgICAjIDwtLS0gUEFOR0dJTCBGSUxFIENTUyBESSBTSU5JDQogICAgc2VsZl9jb250YWluZWQ6IHRydWUgICAgICAgICAgICAgICAgICMgRW1iZWQgYWxsIHJlc291cmNlcw0KICAgIHRodW1ibmFpbHM6IHRydWUgICAgICAgICAgICAgICAgICAgICAjIFNob3cgaW1hZ2UgdGh1bWJuYWlscw0KICAgIGxpZ2h0Ym94OiB0cnVlICAgICAgICAgICAgICAgICAgICAgICAjIEVuYWJsZSBjbGljay10by16b29tIGltYWdlcw0KICAgIGdhbGxlcnk6IHRydWUgICAgICAgICAgICAgICAgICAgICAgICAjIEdyb3VwIGltYWdlcyBpbnRvIGdhbGxlcnkNCiAgICBudW1iZXJfc2VjdGlvbnM6IHRydWUgICAgICAgICAgICAgICAgIyBOdW1iZXIgYWxsIHNlY3Rpb25zDQogICAgbGliX2RpcjogbGlicyAgICAgICAgICAgICAgICAgICAgICAgICMgU2F2ZSBKUy9DU1MgbGlicmFyaWVzDQogICAgZGZfcHJpbnQ6ICJwYWdlZCIgICAgICAgICAgICAgICAgICAgICMgUGFnZWQgZGF0YSBmcmFtZXMNCiAgICBjb2RlX2ZvbGRpbmc6ICJzaG93IiAgICAgICAgICAgICAgICAgIyBFeHBhbmRhYmxlIGNvZGUgYmxvY2tzDQogICAgY29kZV9kb3dubG9hZDogeWVzICAgICAgICAgICAgICAgICAgICMgQWRkIGJ1dHRvbiB0byBkb3dubG9hZCBSIGNvZGUNCi0tLQ0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSwgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UpICMgVGFtYmFoa2FuIG1lc3NhZ2Uvd2FybmluZz1GQUxTRQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShrbml0cikNCmxpYnJhcnkoa2FibGVFeHRyYSkNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KHJtZGZvcm1hdHMpICMgT3B0aW9uYWwsIGppa2EgaW5naW4gbWVtYXN0aWthbiBwYWNrYWdlIHRlcmxvYWQNCg0KYGBgDQoNCi0tLQ0KDQo8ZGl2IGNsYXNzPSJwcm9maWxlLWNvbnRhaW5lciI+DQogIA0KICA8aW1nIA0KICAgIHNyYz0iQzovVXNlcnMvSXlhbi9Eb3dubG9hZHMvU3RhcnRpc3RpayBXZWVrIDE0L015Rm90by5qcGciIA0KICAgIGFsdD0iUHJvZmlsZSBQaWN0dXJlIiANCiAgICBjbGFzcz0icHJvZmlsZS1waWMtbmV3IiANCiAgICBzdHlsZT0iDQogICAgICB3aWR0aDogMTgwcHggIWltcG9ydGFudDsgDQogICAgICBoZWlnaHQ6IDE4MHB4ICFpbXBvcnRhbnQ7IA0KICAgICAgYm9yZGVyLXJhZGl1czogNTAlICFpbXBvcnRhbnQ7IA0KICAgICAgYm9yZGVyOiA0cHggc29saWQgIzM0OThkYiAhaW1wb3J0YW50OyANCiAgICAgIGJveC1zaGFkb3c6IDAgMCAxNXB4IHJnYmEoNTIsIDE1MiwgMjE5LCAwLjcpICFpbXBvcnRhbnQ7DQogICAgICBvYmplY3QtZml0OiBjb3ZlcjsNCiAgICAgIG1hcmdpbi1ib3R0b206IDVweDsNCiAgICAiDQogIC8+DQoNCiAgPGRpdiBjbGFzcz0icHJvZmlsZS1uYW1lIj5NdWhhbW1hZCBOYWJpbCBLaGFpcmlsIEFuYW08L2Rpdj4NCiAgPGRpdiBjbGFzcz0icHJvZmlsZS1wcm9kaSI+RGF0YSBTY2llbmNlIFN0dWRlbnQ8L2Rpdj4NCiAgPGRpdiBjbGFzcz0icHJvZmlsZS1pbnN0YW5zaSI+SW5zdGl0dXQgVGVrbm9sb2dpIFNhaW5zIEJhbmR1bmcgKElUU0IpPC9kaXY+DQogIA0KICA8YnI+IDwvZGl2Pg0KDQotLS0NCg0KPGRpdiBjbGFzcz0iZXhwbGFuYXRpb24tYm94Ij4NCg0KIyBQZXJzaWFwYW4gRGF0YSBLYXJ5YXdhbg0KDQpgYGB7cixlY2hvPVRSVUUsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQoNCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMgUEVSU0lBUEFOIERBVEEgS0FSWUFXQU4NCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMgTWVtYnVhdCBkYXRhc2V0IGthcnlhd2FuIGRhbGFtIGJlbnR1ayBkYXRhIGZyYW1lDQoNCmthcnlhd2FuIDwtIGRhdGEuZnJhbWUoDQogIElEID0gYygxLCAyLCAzLCA0LCA1KSwNCiAgTmFtYSA9IGMoIkJhZ2FzIiwgIkpvYW4iLCAiQWx5YSIsICJEd2kiLCAiTmFiaWwiKSwNCiAgVW11ciA9IGMoMjUsIDMwLCAyNywgMzUsIDQwKSwNCiAgR2FqaSA9IGMoNTAwMCwgNzAwMCwgNjUwMCwgMTAwMDAsIDEyMDAwKSwNCiAgUG9zaXNpID0gYygiU3RhZmYiLCAiU3VwZXJ2aXNvciIsICJTdGFmZiIsICJNYW5hZ2VyIiwgIkRpcmVrdHVyIiksDQogIEtpbmVyamEgPSBjKCJCYWlrIiwgIlNhbmdhdCBCYWlrIiwgIlJhdGEtcmF0YSIsICJCYWlrIiwgIlNhbmdhdCBCYWlrIiksDQogIHN0cmluZ3NBc0ZhY3RvcnMgPSBGQUxTRQ0KKQ0KDQojIE1lbWFzdGlrYW4gZGF0YSBzdWRhaCBiZW5hcg0KDQpwcmludCgiRGF0YSBrYXJ5YXdhbiBiZXJoYXNpbCBkaXNpbXBhbiEiKQ0KcHJpbnQocGFzdGUoIkp1bWxhaCBrYXJ5YXdhbjoiLCBucm93KGthcnlhd2FuKSkpDQpwcmludChoZWFkKGthcnlhd2FuLCA1KSkNCg0KYGBgDQoNCjwvZGl2PiANCg0KLS0tDQoNCjxkaXYgY2xhc3M9ImV4cGxhbmF0aW9uLWJveCI+DQoNCiMgTWVuZ2hpdHVuZyBCb251cyBLYXJ5YXdhbg0KDQpgYGB7cixlY2hvPVRSVUUsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQoNCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMgTUVOR0hJVFVORyBCT05VUyBLQVJZQVdBTg0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQpjYXQoIiAgICAgICAgICAgTUVOR0hJVFVORyBCT05VUyBLQVJZQVdBTlxuIikNCg0KIyBMb29wIHVudHVrIHNldGlhcCBiYXJpcyBkYXRhDQpmb3IgKGkgaW4gMTpucm93KGthcnlhd2FuKSkgew0KICBuYW1hIDwtIGthcnlhd2FuW2ksICJOYW1hIl0NCiAga2luZXJqYSA8LSBrYXJ5YXdhbltpLCAiS2luZXJqYSJdDQogIGdhamkgPC0ga2FyeWF3YW5baSwgIkdhamkiXQ0KICANCiAgIyBIaXR1bmcgYm9udXMgYmVyZGFzYXJrYW4ga2luZXJqYQ0KICBpZiAoa2luZXJqYSA9PSAiU2FuZ2F0IEJhaWsiKSB7DQogICAgYm9udXMgPC0gZ2FqaSAqIDAuMjANCiAgfSBlbHNlIGlmIChraW5lcmphID09ICJCYWlrIikgew0KICAgIGJvbnVzIDwtIGdhamkgKiAwLjEwDQogIH0gZWxzZSBpZiAoa2luZXJqYSA9PSAiUmF0YS1yYXRhIikgew0KICAgIGJvbnVzIDwtIGdhamkgKiAwLjA1DQogIH0gZWxzZSB7DQogICAgYm9udXMgPC0gMA0KICAgIGNhdChwYXN0ZSgiUGVyaW5nYXRhbjogS2luZXJqYSIsIGtpbmVyamEsICJ1bnR1ayIsIG5hbWEsICJ0aWRhayBkaWtlbmFsXG4iKSkNCiAgfQ0KICANCiAgIyBUYW1waWxrYW4gaGFzaWwgKHBha2UgY2F0IGJpYXIgcmFwaSkNCiAgY2F0KHBhc3RlKCJOYW1lOiIsIG5hbWEsICIsIEJvbnVzOiIsIGFzLmludGVnZXIoYm9udXMpLCAiXG4iKSkNCn0NCg0KYGBgDQoNCjwvZGl2PiANCg0KLS0tDQoNCjxkaXYgY2xhc3M9ImV4cGxhbmF0aW9uLWJveCI+DQoNCiMgTWVuYW1waWxrYW4gS2FyeWF3YW4gZGVuZ2FuIEdhamkgPiA2MDAwDQoNCmBgYHtyLGVjaG89VFJVRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCg0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KIyBNRU5BTVBJTEtBTiBLQVJZQVdBTiBERU5HQU4gR0FKSSA+IDYwMDANCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KY2F0KCIgICBLQVJZQVdBTiBERU5HQU4gR0FKSSA+IDYwMDBcbiIpDQoNCiMgTG9vcCB1bnR1ayBzZXRpYXAgYmFyaXMgZGF0YQ0KZm9yIChpIGluIDE6bnJvdyhrYXJ5YXdhbikpIHsNCiAgbmFtYSA8LSBrYXJ5YXdhbltpLCAiTmFtYSJdDQogIGdhamkgPC0ga2FyeWF3YW5baSwgIkdhamkiXQ0KICANCiAgIyBDZWsgYXBha2FoIGdhamkgbGViaWggZGFyaSA2MDAwDQogIGlmIChnYWppID4gNjAwMCkgew0KICAgIGNhdChwYXN0ZSgiTmFtZToiLCBuYW1hLCAiLCBTYWxhcnk6IiwgZ2FqaSwgIlxuIikpDQogIH0NCn0NCmBgYA0KDQo8L2Rpdj4gDQoNCi0tLQ0KDQo8ZGl2IGNsYXNzPSJleHBsYW5hdGlvbi1ib3giPg0KDQojIE1lbmFtcGlsa2FuIEthcnlhd2FuIFNhbXBhaSBNYW5hZ2VyIChXaGlsZSBMb29wKQ0KDQpgYGB7cixlY2hvPVRSVUUsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQoNCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMgTUVOQU1QSUxLQU4gS0FSWUFXQU4gU0FNUEFJIE1BTkFHRVIgKFdISUxFIExPT1ApDQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCmNhdCgiICAgTUVOQU1QSUxLQU4gS0FSWUFXQU4gU0FNUEFJIE1BTkFHRVJcbiIpDQoNCiMgSW5pc2lhbGlzYXNpIGluZGVrcw0KaSA8LSAxDQoNCiMgV2hpbGUgbG9vcCBzZWxhbWEgbWFzaWggYWRhIGRhdGENCndoaWxlIChpIDw9IG5yb3coa2FyeWF3YW4pKSB7DQogIG5hbWEgPC0ga2FyeWF3YW5baSwgIk5hbWEiXQ0KICBwb3Npc2kgPC0ga2FyeWF3YW5baSwgIlBvc2lzaSJdDQogIA0KICAjIFRhbXBpbGthbiBuYW1hIGRhbiBwb3Npc2kNCiAgY2F0KHBhc3RlKCJOYW1lOiIsIG5hbWEsICIsIFBvc2l0aW9uOiIsIHBvc2lzaSwgIlxuIikpDQogIA0KICAjIENlayBhcGFrYWggcG9zaXNpbnlhIE1hbmFnZXINCiAgaWYgKHBvc2lzaSA9PSAiTWFuYWdlciIpIHsNCiAgICBjYXQoIihTdG9wIGhlcmUpXG4iKQ0KICAgIGJyZWFrICAjIEhlbnRpa2FuIGxvb3ANCiAgfQ0KICANCiAgIyBOYWlra2FuIGluZGVrcyB1bnR1ayBrYXJ5YXdhbiBiZXJpa3V0bnlhDQogIGkgPC0gaSArIDENCn0NCg0KYGBgDQoNCjwvZGl2PiANCg0KLS0tDQoNCjxkaXYgY2xhc3M9ImV4cGxhbmF0aW9uLWJveCI+DQoNCiMgQnJlYWsgS2V0aWthIEdhamkgPiAxMDAwMA0KDQpgYGB7cixlY2hvPVRSVUUsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQoNCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMgQlJFQUsgS0VUSUtBIEdBSkkgPiAxMDAwMA0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQpjYXQoIiAgIE1FTkFNUElMS0FOIEtBUllBV0FOIFNBTVBBSSBHQUpJIDEwMDAwXG4iKQ0KDQojIExvb3AgdW50dWsgc2V0aWFwIGthcnlhd2FuDQpmb3IgKGkgaW4gMTpucm93KGthcnlhd2FuKSkgew0KICBuYW1hIDwtIGthcnlhd2FuW2ksICJOYW1hIl0NCiAgZ2FqaSA8LSBrYXJ5YXdhbltpLCAiR2FqaSJdDQogIA0KICAjIENFSyBEVUxVIHNlYmVsdW0gbWVuYW1waWxrYW4NCiAgaWYgKGdhamkgPiAxMDAwMCkgew0KICAgIGNhdCgiKERpaGVudGlrYW4ga2FyZW5hIE5hYmlsIG1lbWlsaWtpIGdhamkgZGkgYXRhcyAxMC4wMDApIikNCiAgICBicmVhayAgIyBIZW50aWthbiBsb29wLCBOYWJpbCBUSURBSyBkaXRhbXBpbGthbg0KICB9DQogIA0KICAjIFRhbXBpbGthbiBuYW1hIGRhbiBnYWppIChoYW55YSBqaWthIGdhamkgPD0gMTAwMDApDQogIGNhdChwYXN0ZSgiTmFtZToiLCBuYW1hLCAiLCBTYWxhcnk6IiwgZ2FqaSwgIlxuIikpDQp9DQoNCmBgYA0KDQo8L2Rpdj4gDQoNCi0tLQ0KDQo8ZGl2IGNsYXNzPSJleHBsYW5hdGlvbi1ib3giPg0KDQojIENvbnRpbnVlIFVudHVrIE1lbGV3YXRpIEtpbmVyamEgIlJhdGEtUmF0YSINCg0KYGBge3IsZWNobz1UUlVFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KDQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQojIENPTlRJTlVFIFVOVFVLIE1FTEVXQVRJIEtJTkVSSkEgIlJBVEEtUkFUQSINCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KY2F0KCIgICBLQVJZQVdBTiBERU5HQU4gS0lORVJKQSBCQUlLICYgU0FOR0FUIEJBSUtcbiIpDQoNCiMgTG9vcCB1bnR1ayBzZXRpYXAga2FyeWF3YW4NCmZvciAoaSBpbiAxOm5yb3coa2FyeWF3YW4pKSB7DQogIG5hbWEgPC0ga2FyeWF3YW5baSwgIk5hbWEiXQ0KICBraW5lcmphIDwtIGthcnlhd2FuW2ksICJLaW5lcmphIl0NCiAgDQogICMgQ0VLOiBqaWthIGtpbmVyamEgIlJhdGEtcmF0YSIsIFNLSVAgKG5leHQpDQogIGlmIChraW5lcmphID09ICJSYXRhLXJhdGEiKSB7DQogICAgY2F0KHBhc3RlKCIoIiwgbmFtYSwgImRpbGV3YXRpIGthcmVuYSBwZXJmb3JtYW55YSAnUmF0YS1yYXRhJylcbiIpKQ0KICAgIG5leHQgICMgTGFuZ3N1bmcgbG9uY2F0IGtlIGl0ZXJhc2kgYmVyaWt1dG55YQ0KICB9DQogIA0KICAjIEhhbnlhIHNhbXBhaSBzaW5pIGppa2Ega2luZXJqYSBidWthbiAiUmF0YS1yYXRhIg0KICBjYXQocGFzdGUoIk5hbWU6IiwgbmFtYSwgIiwgUGVyZm9ybWFuY2U6Iiwga2luZXJqYSwgIlxuIikpDQp9DQoNCmBgYA0KDQo8L2Rpdj4gDQoNCg0K