Task Week 2 Programming Science Data

Profile

2.5 Praktikum

2.5.1 Tujuan

  1. Memahami dan menerapkan pernyataan kondisional (if, if-else, if-elif-else).
  2. Terapkan loop (for loop, while loop, break, continue) untuk menganalisis himpunan data.
Gunakan dataset dummy berikut ini:
PENGENAL Nama Usia Gaji Posisi Pertunjukan
1 Bagas 25 5000 Staf Bagus
2 Joan 30 7000 Pengawas Sangat bagus
3 Alya 27 6500 Staf Rata-rata
4 Dwi 35 10000 Manajer Bagus
5 Nabil 40 12000 Direktur Sangat bagus

2.5.2 Pernyataan Kondisional

Tentukan tingkat bonus berdasarkan kinerja karyawan:

  • Sangat Baik -> \(20\)% dari gaji
  • Baik -> \(10\)% dari gaji
  • Rata-rata -> \(5\)% dari gaji

Tugas:

  • Tulis program dalam Python dan R untuk menghitung bonus setiap karyawan.
  • Menampilkan output dalam format ini: “Name: Bagas, Bonus: 500”
# Dataset Dummy
data <- data.frame(
  Nama = c("Bagas", "Joan", "Alya", "Dwi", "Nabil"),
  Gaji = c(5000, 7000, 6500, 10000, 12000),
  Pertunjukan = c("Bagus", "Sangat bagus", "Rata-rata", "Bagus", "Sangat bagus")
)

# Fungsi untuk menghitung bonus
hitung_bonus <- function(gaji, pertunjukan) {
  if (pertunjukan == "Sangat bagus") {
    return(gaji * 0.2)
  } else if (pertunjukan == "Bagus") {
    return(gaji * 0.1)
  } else if (pertunjukan == "Rata-rata") {
    return(gaji * 0.05)
  } else {
    return(0)
  }
}

# Menampilkan hasil
for (i in 1:nrow(data)) {
  bonus <- hitung_bonus(data$Gaji[i], data$Pertunjukan[i])
  cat(sprintf("Name: %s, Bonus: %d\n", data$Nama[i], as.integer(bonus)))
}
## Name: Bagas, Bonus: 500
## Name: Joan, Bonus: 1400
## Name: Alya, Bonus: 325
## Name: Dwi, Bonus: 1000
## Name: Nabil, Bonus: 2400

2.5.3 Perulangan (For & While)

  1. Gunakan for loop untuk membuat daftar karyawan dengan gaji lebih dari \(6000\).

Hasil yang Diharapkan:

Name: Joan, Salary: \(7000\) Name: Alya, Salary: \(6500\) Name: Dwi, Salary: \(10000\) Name: Nabil, Salary: \(12000\)

  1. Gunakan while loop untuk menampilkan karyawan hingga “Manajer” ditemukan.

Hasil yang Diharapkan:

Name: Bagas, Position: Staff Name: Joan, Position: Supervisor Name: Alya, Position: Staff Name: Dwi, Position: Manager (Stop here)

  1. Gunakan break untuk menghentikan loop ketika karyawan dengan gaji di atas \(10.000\) ditemukan.

Hasil yang Diharapkan:

Name: Bagas, Salary: \(5000\) Name: Joan, Salary: \(7000\) Name: Alya, Salary: \(6500\) Name: Dwi, Salary: \(10000\) (Stopped because Nabil has a salary abohe 10.000)

  1. Gunakan lanjutkan untuk melewati karyawan dengan kinerja “Rata-rata”.

Hasil yang Diharapkan:

Name: Bagas, Performance: Good Name: Joan, Performance: Very Good Name: Dwi, Performance: Good Name: Nabil, Performance: Very Good (Alya is skipped because the performance is “Average”)

Pedoman Pengajuan:

  1. Kirimkan kode Python dan R Anda menggunakan Google colab dan Rpubs.
  2. Pastikan output ditampilkan dengan benar.
  3. Tambahkan komentar dalam kode untuk menjelaskan logika anda.

Data Dummy

# Membuat dataset dummy menggunakan data frame
data <- data.frame(
  Nama = c("Bagas", "Joan", "Alya", "Dwi", "Nabil"),
  Gaji = c(5000, 7000, 6500, 10000, 12000),
  Posisi = c("Staf", "Pengawas", "Staf", "Manajer", "Direktur"),
  Pertunjukan = c("Bagus", "Sangat bagus", "Rata-rata", "Bagus", "Sangat bagus")

)

1. For Loop

Karyawan dengan gaji lebih dari \(6000\)

# Membuat dataset dummy dengan kolom Nama, Gaji, Posisi, dan Pertunjukan
data <- data.frame(
  Nama = c("Bagas", "Joan", "Alya", "Dwi", "Nabil"),
  Gaji = c(5000, 7000, 6500, 10000, 12000),
  Posisi = c("Staf", "Pengawas", "Staf", "Manajer", "Direktur"),
  Pertunjukan = c("Bagus", "Sangat bagus", "Rata-rata", "Bagus", "Sangat bagus")
)

# Loop untuk mencetak karyawan dengan gaji lebih dari 6000
cat("1. Daftar karyawan dengan gaji lebih dari 6000:\n")
## 1. Daftar karyawan dengan gaji lebih dari 6000:
for (i in 1:nrow(data)) {  # Iterasi melalui setiap baris dalam dataset
  if (data$Gaji[i] > 6000) {  # Mengecek apakah gaji lebih dari 6000
    cat(sprintf("Name: %s, Salary: $%d\n", data$Nama[i], data$Gaji[i]))  # Menampilkan output
  }
}
## Name: Joan, Salary: $7000
## Name: Alya, Salary: $6500
## Name: Dwi, Salary: $10000
## Name: Nabil, Salary: $12000

2. While Loop

Menampilkan karyawan hingga “Manajer” ditemukan

# Loop while untuk menampilkan karyawan sampai posisi "Manajer" ditemukan
cat("2. Menampilkan karyawan hingga 'Manajer' ditemukan:\n")
## 2. Menampilkan karyawan hingga 'Manajer' ditemukan:
i <- 1  # Inisialisasi variabel indeks
while (i <= nrow(data)) {  # Loop akan berjalan selama i masih dalam rentang jumlah baris dataset
  cat(sprintf("Name: %s, Position: %s\n", data$Nama[i], data$Posisi[i]))  # Menampilkan nama dan posisi
  
  if (data$Posisi[i] == "Manajer") {  # Jika posisi adalah "Manajer", hentikan loop
    cat("(Stop here)\n")  # Menampilkan pesan pemberhentian
    break  # Menghentikan perulangan
  }
  i <- i + 1  # Menambah indeks untuk iterasi berikutnya
}
## Name: Bagas, Position: Staf
## Name: Joan, Position: Pengawas
## Name: Alya, Position: Staf
## Name: Dwi, Position: Manajer
## (Stop here)

3. Break

Hentikan saat gaji di atas \(10.000\) ditemukan

# Loop dengan break untuk menghentikan saat gaji lebih dari 10.000 ditemukan
cat("3. Hentikan loop saat gaji di atas 10.000 ditemukan:\n")
## 3. Hentikan loop saat gaji di atas 10.000 ditemukan:
for (i in 1:nrow(data)) {  # Iterasi melalui setiap baris dataset
  if (data$Gaji[i] > 10000) {  # Mengecek apakah gaji lebih dari 10.000
    cat(sprintf("(Stopped because %s has a salary above 10,000)\n", data$Nama[i]))  # Menampilkan alasan berhenti
    break  # Menghentikan perulangan
  }
  cat(sprintf("Name: %s, Salary: $%d\n", data$Nama[i], data$Gaji[i]))  # Menampilkan nama dan gaji
}
## Name: Bagas, Salary: $5000
## Name: Joan, Salary: $7000
## Name: Alya, Salary: $6500
## Name: Dwi, Salary: $10000
## (Stopped because Nabil has a salary above 10,000)

4. Continue

Lewati karyawan dengan kinerja “Rata-rata”

# Loop dengan continue untuk melewati karyawan dengan kinerja "Rata-rata"
cat("4. Lewati karyawan dengan kinerja 'Rata-rata':\n")
## 4. Lewati karyawan dengan kinerja 'Rata-rata':
for (i in 1:nrow(data)) {  # Iterasi melalui setiap baris dataset
  if (data$Pertunjukan[i] == "Rata-rata") {  # Jika kinerja adalah "Rata-rata"
    next  # Melewati iterasi ini dan lanjut ke iterasi berikutnya
  }
  cat(sprintf("Name: %s, Performance: %s\n", data$Nama[i], data$Pertunjukan[i]))  # Menampilkan nama dan kinerja
}
## Name: Bagas, Performance: Bagus
## Name: Joan, Performance: Sangat bagus
## Name: Dwi, Performance: Bagus
## Name: Nabil, Performance: Sangat bagus
LS0tDQp0aXRsZTogIlRhc2sgV2VlayAyIFByb2dyYW1taW5nIFNjaWVuY2UgRGF0YSINCg0KYXV0aG9yOiANCiAgICAtICJOYWJpbGEgQW5nZ2l0YSBQdXRyaSINCiAgICANCmRhdGU6ICJgciBmb3JtYXQoU3lzLkRhdGUoKSwgJyVCICVkLCAlWScpYCINCm91dHB1dDoNCiAgcm1kZm9ybWF0czo6cmVhZHRoZWRvd246DQogICAgc2VsZl9jb250YWluZWQ6IHRydWUNCiAgICB0aHVtYm5haWxzOiB0cnVlDQogICAgbGlnaHRib3g6IHRydWUNCiAgICBnYWxsZXJ5OiB0cnVlDQogICAgbGliX2RpcjogbGlicw0KICAgIGRmX3ByaW50OiAicGFnZWQiDQogICAgY29kZV9mb2xkaW5nOiAic2hvdyINCiAgICBjb2RlX2Rvd25sb2FkOiB5ZXMNCiAgICBjc3M6ICJzdHlsZS9zdHlsZS5jc3MuY3NzIg0KLS0tDQo8aW1nIHNyYz0iaW1nL3Byb2ZpbGUuanBnIiBhbHQ9IlByb2ZpbGUiIGlkPSJsb2dvLXV0YW1hIiBzdHlsZT0id2lkdGg6MzAwcHg7IGRpc3BsYXk6IGJsb2NrOyBtYXJnaW46IGF1dG87Ii8+DQoNCiMgKioyLjUgUHJha3Rpa3VtKioNCg0KIyMgKioyLjUuMSBUdWp1YW4qKg0KDQoxLiBNZW1haGFtaSBkYW4gbWVuZXJhcGthbiAqKnBlcm55YXRhYW4ga29uZGlzaW9uYWwqKiAoaWYsIGlmLWVsc2UsIGlmLWVsaWYtZWxzZSkuDQoyLiBUZXJhcGthbiAqKmxvb3AqKiAoZm9yIGxvb3AsIHdoaWxlIGxvb3AsIGJyZWFrLCBjb250aW51ZSkgdW50dWsgbWVuZ2FuYWxpc2lzIGhpbXB1bmFuIGRhdGEuDQoNCkd1bmFrYW4gKipkYXRhc2V0IGR1bW15KiogYmVyaWt1dCBpbmk6DQpgYGB7ciwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiMgSW5zdGFsbCBkYW4gcGFuZ2dpbCBsaWJyYXJ5IGppa2EgYmVsdW0gYWRhDQppZiAoIXJlcXVpcmUoImthYmxlRXh0cmEiKSkgaW5zdGFsbC5wYWNrYWdlcygia2FibGVFeHRyYSIsIGRlcGVuZGVuY2llcyA9IFRSVUUpDQpsaWJyYXJ5KGthYmxlRXh0cmEpDQoNCiMgTWVtYnVhdCBkYXRhIGZyYW1lDQpkYXRhIDwtIGRhdGEuZnJhbWUoDQogIFBFTkdFTkFMID0gYygxLCAyLCAzLCA0LCA1KSwNCiAgTmFtYSA9IGMoIkJhZ2FzIiwgIkpvYW4iLCAiQWx5YSIsICJEd2kiLCAiTmFiaWwiKSwNCiAgVXNpYSA9IGMoMjUsIDMwLCAyNywgMzUsIDQwKSwNCiAgR2FqaSA9IGMoNTAwMCwgNzAwMCwgNjUwMCwgMTAwMDAsIDEyMDAwKSwNCiAgUG9zaXNpID0gYygiU3RhZiIsICJQZW5nYXdhcyIsICJTdGFmIiwgIk1hbmFqZXIiLCAiRGlyZWt0dXIiKSwNCiAgUGVydHVuanVrYW4gPSBjKCJCYWd1cyIsICJTYW5nYXQgYmFndXMiLCAiUmF0YS1yYXRhIiwgIkJhZ3VzIiwgIlNhbmdhdCBiYWd1cyIpDQopDQoNCiMgTWVtYnVhdCB0YWJlbCB0YW5wYSBjYXB0aW9uDQpkYXRhICU+JQ0KICBrYmwoYWxpZ24gPSAiYyIpICU+JSAgIyBIYXB1cyBjYXB0aW9uDQogIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiwgImNvbmRlbnNlZCIsICJyZXNwb25zaXZlIiksIGZ1bGxfd2lkdGggPSBGKSAlPiUNCiAgcm93X3NwZWMoMCwgYm9sZCA9IFRSVUUsIGJhY2tncm91bmQgPSAiIzRDQUY1MCIsIGNvbG9yID0gIndoaXRlIikgJT4lICAjIEhlYWRlciB3YXJuYSBoaWphdQ0KICByb3dfc3BlYygxOjUsIGJhY2tncm91bmQgPSBjKCIjZjlmOWY5IiwgIiNmZmZmZmYiLCAiI2Y5ZjlmOSIsICIjZmZmZmZmIiwgIiNmOWY5ZjkiKSkgJT4lICAjIFdhcm5hIGJhcmlzIHNlbGFuZy1zZWxpbmcNCiAgY29sdW1uX3NwZWMoNCwgYmFja2dyb3VuZCA9ICIjZTBmN2ZhIikgJT4lICAjIEtvbG9tIEdhamkgZGVuZ2FuIHdhcm5hIGJpcnUgbXVkYQ0KICBjb2x1bW5fc3BlYyg2LCBiYWNrZ3JvdW5kID0gIiNmZmUwYjIiKSAgICAgIyBLb2xvbSBQZXJ0dW5qdWthbiBkZW5nYW4gd2FybmEgb3JhbnllIG11ZGENCmBgYA0KDQojIyAqKjIuNS4yIFBlcm55YXRhYW4gS29uZGlzaW9uYWwqKg0KDQpUZW50dWthbiAqKnRpbmdrYXQgYm9udXMqKiBiZXJkYXNhcmthbiAqKmtpbmVyamEqKiBrYXJ5YXdhbjoNCg0KLSAqKlNhbmdhdCBCYWlrKiogLT4gJDIwJCUgZGFyaSBnYWppDQotICoqQmFpayoqIC0+ICQxMCQlIGRhcmkgZ2FqaQ0KLSAqKlJhdGEtcmF0YSoqIC0+ICQ1JCUgZGFyaSBnYWppDQoNCioqVHVnYXMqKjoNCg0KLSBUdWxpcyBwcm9ncmFtIGRhbGFtICoqUHl0aG9uIGRhbiBSKiogdW50dWsgbWVuZ2hpdHVuZyBib251cyBzZXRpYXAga2FyeWF3YW4uDQotIE1lbmFtcGlsa2FuICoqb3V0cHV0KiogZGFsYW0gZm9ybWF0IGluaTogDQoqKiJOYW1lOiBCYWdhcywgQm9udXM6IDUwMCIqKg0KYGBge3IgZWNobz1UUlVFfQ0KIyBEYXRhc2V0IER1bW15DQpkYXRhIDwtIGRhdGEuZnJhbWUoDQogIE5hbWEgPSBjKCJCYWdhcyIsICJKb2FuIiwgIkFseWEiLCAiRHdpIiwgIk5hYmlsIiksDQogIEdhamkgPSBjKDUwMDAsIDcwMDAsIDY1MDAsIDEwMDAwLCAxMjAwMCksDQogIFBlcnR1bmp1a2FuID0gYygiQmFndXMiLCAiU2FuZ2F0IGJhZ3VzIiwgIlJhdGEtcmF0YSIsICJCYWd1cyIsICJTYW5nYXQgYmFndXMiKQ0KKQ0KDQojIEZ1bmdzaSB1bnR1ayBtZW5naGl0dW5nIGJvbnVzDQpoaXR1bmdfYm9udXMgPC0gZnVuY3Rpb24oZ2FqaSwgcGVydHVuanVrYW4pIHsNCiAgaWYgKHBlcnR1bmp1a2FuID09ICJTYW5nYXQgYmFndXMiKSB7DQogICAgcmV0dXJuKGdhamkgKiAwLjIpDQogIH0gZWxzZSBpZiAocGVydHVuanVrYW4gPT0gIkJhZ3VzIikgew0KICAgIHJldHVybihnYWppICogMC4xKQ0KICB9IGVsc2UgaWYgKHBlcnR1bmp1a2FuID09ICJSYXRhLXJhdGEiKSB7DQogICAgcmV0dXJuKGdhamkgKiAwLjA1KQ0KICB9IGVsc2Ugew0KICAgIHJldHVybigwKQ0KICB9DQp9DQoNCiMgTWVuYW1waWxrYW4gaGFzaWwNCmZvciAoaSBpbiAxOm5yb3coZGF0YSkpIHsNCiAgYm9udXMgPC0gaGl0dW5nX2JvbnVzKGRhdGEkR2FqaVtpXSwgZGF0YSRQZXJ0dW5qdWthbltpXSkNCiAgY2F0KHNwcmludGYoIk5hbWU6ICVzLCBCb251czogJWRcbiIsIGRhdGEkTmFtYVtpXSwgYXMuaW50ZWdlcihib251cykpKQ0KfQ0KYGBgDQoNCiMjICoqMi41LjMgUGVydWxhbmdhbiAoRm9yICYgV2hpbGUpKioNCg0KMS4gR3VuYWthbiAqKmZvciBsb29wKiogdW50dWsgbWVtYnVhdCBkYWZ0YXIga2FyeWF3YW4gZGVuZ2FuIGdhamkgbGViaWggZGFyaSAqKiQ2MDAwJCoqLg0KDQoqKkhhc2lsIHlhbmcgRGloYXJhcGthbioqOg0KDQpOYW1lOiBKb2FuLCBTYWxhcnk6ICQ3MDAwJA0KTmFtZTogQWx5YSwgU2FsYXJ5OiAkNjUwMCQNCk5hbWU6IER3aSwgU2FsYXJ5OiAkMTAwMDAkDQpOYW1lOiBOYWJpbCwgU2FsYXJ5OiAkMTIwMDAkDQoNCjIuIEd1bmFrYW4gKip3aGlsZSBsb29wKiogdW50dWsgbWVuYW1waWxrYW4ga2FyeWF3YW4gaGluZ2dhICoqIk1hbmFqZXIiKiogZGl0ZW11a2FuLg0KDQoqKkhhc2lsIHlhbmcgRGloYXJhcGthbioqOg0KDQpOYW1lOiBCYWdhcywgUG9zaXRpb246IFN0YWZmDQpOYW1lOiBKb2FuLCBQb3NpdGlvbjogU3VwZXJ2aXNvcg0KTmFtZTogQWx5YSwgUG9zaXRpb246IFN0YWZmDQpOYW1lOiBEd2ksIFBvc2l0aW9uOiBNYW5hZ2VyIChTdG9wIGhlcmUpDQoNCjMuIEd1bmFrYW4gKipicmVhayoqIHVudHVrIG1lbmdoZW50aWthbiBsb29wIGtldGlrYSBrYXJ5YXdhbiBkZW5nYW4gZ2FqaSBkaSBhdGFzICoqJDEwLjAwMCQqKiBkaXRlbXVrYW4uDQoNCioqSGFzaWwgeWFuZyBEaWhhcmFwa2FuKio6DQoNCk5hbWU6IEJhZ2FzLCBTYWxhcnk6ICQ1MDAwJA0KTmFtZTogSm9hbiwgU2FsYXJ5OiAkNzAwMCQNCk5hbWU6IEFseWEsIFNhbGFyeTogJDY1MDAkDQpOYW1lOiBEd2ksIFNhbGFyeTogJDEwMDAwJA0KKFN0b3BwZWQgYmVjYXVzZSBOYWJpbCBoYXMgYSBzYWxhcnkgYWJvaGUgMTAuMDAwKQ0KDQo0LiBHdW5ha2FuICoqbGFuanV0a2FuKiogdW50dWsgKiptZWxld2F0aSoqIGthcnlhd2FuIGRlbmdhbiBraW5lcmphICoqIlJhdGEtcmF0YSIqKi4NCg0KKipIYXNpbCB5YW5nIERpaGFyYXBrYW4qKjoNCg0KTmFtZTogQmFnYXMsIFBlcmZvcm1hbmNlOiBHb29kDQpOYW1lOiBKb2FuLCBQZXJmb3JtYW5jZTogVmVyeSBHb29kDQpOYW1lOiBEd2ksIFBlcmZvcm1hbmNlOiBHb29kDQpOYW1lOiBOYWJpbCwgUGVyZm9ybWFuY2U6IFZlcnkgR29vZA0KKEFseWEgaXMgc2tpcHBlZCBiZWNhdXNlIHRoZSBwZXJmb3JtYW5jZSBpcyAiQXZlcmFnZSIpDQoNCioqUGVkb21hbiBQZW5nYWp1YW4qKjoNCg0KMS4gS2lyaW1rYW4ga29kZSAqKlB5dGhvbiBkYW4gUioqIEFuZGEgbWVuZ2d1bmFrYW4gKipHb29nbGUgY29sYWIqKiBkYW4gKipScHVicyoqLg0KMi4gUGFzdGlrYW4gb3V0cHV0IGRpdGFtcGlsa2FuIGRlbmdhbiBiZW5hci4NCjMuIFRhbWJhaGthbiBrb21lbnRhciBkYWxhbSBrb2RlIHVudHVrIG1lbmplbGFza2FuIGxvZ2lrYSBhbmRhLg0KDQojICoqRGF0YSBEdW1teSoqDQpgYGB7ciBlY2hvPVRSVUV9DQojIE1lbWJ1YXQgZGF0YXNldCBkdW1teSBtZW5nZ3VuYWthbiBkYXRhIGZyYW1lDQpkYXRhIDwtIGRhdGEuZnJhbWUoDQogIE5hbWEgPSBjKCJCYWdhcyIsICJKb2FuIiwgIkFseWEiLCAiRHdpIiwgIk5hYmlsIiksDQogIEdhamkgPSBjKDUwMDAsIDcwMDAsIDY1MDAsIDEwMDAwLCAxMjAwMCksDQogIFBvc2lzaSA9IGMoIlN0YWYiLCAiUGVuZ2F3YXMiLCAiU3RhZiIsICJNYW5hamVyIiwgIkRpcmVrdHVyIiksDQogIFBlcnR1bmp1a2FuID0gYygiQmFndXMiLCAiU2FuZ2F0IGJhZ3VzIiwgIlJhdGEtcmF0YSIsICJCYWd1cyIsICJTYW5nYXQgYmFndXMiKQ0KDQopDQpgYGANCg0KIyMgKioxLiBGb3IgTG9vcCoqDQoNCkthcnlhd2FuIGRlbmdhbiBnYWppIGxlYmloIGRhcmkgKiokNjAwMCQqKg0KYGBge3IgZWNobz1UUlVFfQ0KIyBNZW1idWF0IGRhdGFzZXQgZHVtbXkgZGVuZ2FuIGtvbG9tIE5hbWEsIEdhamksIFBvc2lzaSwgZGFuIFBlcnR1bmp1a2FuDQpkYXRhIDwtIGRhdGEuZnJhbWUoDQogIE5hbWEgPSBjKCJCYWdhcyIsICJKb2FuIiwgIkFseWEiLCAiRHdpIiwgIk5hYmlsIiksDQogIEdhamkgPSBjKDUwMDAsIDcwMDAsIDY1MDAsIDEwMDAwLCAxMjAwMCksDQogIFBvc2lzaSA9IGMoIlN0YWYiLCAiUGVuZ2F3YXMiLCAiU3RhZiIsICJNYW5hamVyIiwgIkRpcmVrdHVyIiksDQogIFBlcnR1bmp1a2FuID0gYygiQmFndXMiLCAiU2FuZ2F0IGJhZ3VzIiwgIlJhdGEtcmF0YSIsICJCYWd1cyIsICJTYW5nYXQgYmFndXMiKQ0KKQ0KDQojIExvb3AgdW50dWsgbWVuY2V0YWsga2FyeWF3YW4gZGVuZ2FuIGdhamkgbGViaWggZGFyaSA2MDAwDQpjYXQoIjEuIERhZnRhciBrYXJ5YXdhbiBkZW5nYW4gZ2FqaSBsZWJpaCBkYXJpIDYwMDA6XG4iKQ0KDQpmb3IgKGkgaW4gMTpucm93KGRhdGEpKSB7ICAjIEl0ZXJhc2kgbWVsYWx1aSBzZXRpYXAgYmFyaXMgZGFsYW0gZGF0YXNldA0KICBpZiAoZGF0YSRHYWppW2ldID4gNjAwMCkgeyAgIyBNZW5nZWNlayBhcGFrYWggZ2FqaSBsZWJpaCBkYXJpIDYwMDANCiAgICBjYXQoc3ByaW50ZigiTmFtZTogJXMsIFNhbGFyeTogJCVkXG4iLCBkYXRhJE5hbWFbaV0sIGRhdGEkR2FqaVtpXSkpICAjIE1lbmFtcGlsa2FuIG91dHB1dA0KICB9DQp9DQpgYGANCg0KIyMgKioyLiBXaGlsZSBMb29wKioNCg0KTWVuYW1waWxrYW4ga2FyeWF3YW4gaGluZ2dhICoqIk1hbmFqZXIiKiogZGl0ZW11a2FuDQpgYGB7ciBlY2hvPVRSVUV9DQojIExvb3Agd2hpbGUgdW50dWsgbWVuYW1waWxrYW4ga2FyeWF3YW4gc2FtcGFpIHBvc2lzaSAiTWFuYWplciIgZGl0ZW11a2FuDQpjYXQoIjIuIE1lbmFtcGlsa2FuIGthcnlhd2FuIGhpbmdnYSAnTWFuYWplcicgZGl0ZW11a2FuOlxuIikNCg0KaSA8LSAxICAjIEluaXNpYWxpc2FzaSB2YXJpYWJlbCBpbmRla3MNCndoaWxlIChpIDw9IG5yb3coZGF0YSkpIHsgICMgTG9vcCBha2FuIGJlcmphbGFuIHNlbGFtYSBpIG1hc2loIGRhbGFtIHJlbnRhbmcganVtbGFoIGJhcmlzIGRhdGFzZXQNCiAgY2F0KHNwcmludGYoIk5hbWU6ICVzLCBQb3NpdGlvbjogJXNcbiIsIGRhdGEkTmFtYVtpXSwgZGF0YSRQb3Npc2lbaV0pKSAgIyBNZW5hbXBpbGthbiBuYW1hIGRhbiBwb3Npc2kNCiAgDQogIGlmIChkYXRhJFBvc2lzaVtpXSA9PSAiTWFuYWplciIpIHsgICMgSmlrYSBwb3Npc2kgYWRhbGFoICJNYW5hamVyIiwgaGVudGlrYW4gbG9vcA0KICAgIGNhdCgiKFN0b3AgaGVyZSlcbiIpICAjIE1lbmFtcGlsa2FuIHBlc2FuIHBlbWJlcmhlbnRpYW4NCiAgICBicmVhayAgIyBNZW5naGVudGlrYW4gcGVydWxhbmdhbg0KICB9DQogIGkgPC0gaSArIDEgICMgTWVuYW1iYWggaW5kZWtzIHVudHVrIGl0ZXJhc2kgYmVyaWt1dG55YQ0KfQ0KYGBgDQoNCiMjICoqMy4gQnJlYWsqKg0KDQpIZW50aWthbiBzYWF0IGdhamkgZGkgYXRhcyAqKiQxMC4wMDAkKiogZGl0ZW11a2FuDQpgYGB7ciBlY2hvPVRSVUV9DQojIExvb3AgZGVuZ2FuIGJyZWFrIHVudHVrIG1lbmdoZW50aWthbiBzYWF0IGdhamkgbGViaWggZGFyaSAxMC4wMDAgZGl0ZW11a2FuDQpjYXQoIjMuIEhlbnRpa2FuIGxvb3Agc2FhdCBnYWppIGRpIGF0YXMgMTAuMDAwIGRpdGVtdWthbjpcbiIpDQoNCmZvciAoaSBpbiAxOm5yb3coZGF0YSkpIHsgICMgSXRlcmFzaSBtZWxhbHVpIHNldGlhcCBiYXJpcyBkYXRhc2V0DQogIGlmIChkYXRhJEdhamlbaV0gPiAxMDAwMCkgeyAgIyBNZW5nZWNlayBhcGFrYWggZ2FqaSBsZWJpaCBkYXJpIDEwLjAwMA0KICAgIGNhdChzcHJpbnRmKCIoU3RvcHBlZCBiZWNhdXNlICVzIGhhcyBhIHNhbGFyeSBhYm92ZSAxMCwwMDApXG4iLCBkYXRhJE5hbWFbaV0pKSAgIyBNZW5hbXBpbGthbiBhbGFzYW4gYmVyaGVudGkNCiAgICBicmVhayAgIyBNZW5naGVudGlrYW4gcGVydWxhbmdhbg0KICB9DQogIGNhdChzcHJpbnRmKCJOYW1lOiAlcywgU2FsYXJ5OiAkJWRcbiIsIGRhdGEkTmFtYVtpXSwgZGF0YSRHYWppW2ldKSkgICMgTWVuYW1waWxrYW4gbmFtYSBkYW4gZ2FqaQ0KfQ0KYGBgDQoNCiMjICoqNC4gQ29udGludWUqKg0KDQpMZXdhdGkga2FyeWF3YW4gZGVuZ2FuIGtpbmVyamEgKioiUmF0YS1yYXRhIioqDQpgYGB7ciBlY2hvPVRSVUV9DQojIExvb3AgZGVuZ2FuIGNvbnRpbnVlIHVudHVrIG1lbGV3YXRpIGthcnlhd2FuIGRlbmdhbiBraW5lcmphICJSYXRhLXJhdGEiDQpjYXQoIjQuIExld2F0aSBrYXJ5YXdhbiBkZW5nYW4ga2luZXJqYSAnUmF0YS1yYXRhJzpcbiIpDQoNCmZvciAoaSBpbiAxOm5yb3coZGF0YSkpIHsgICMgSXRlcmFzaSBtZWxhbHVpIHNldGlhcCBiYXJpcyBkYXRhc2V0DQogIGlmIChkYXRhJFBlcnR1bmp1a2FuW2ldID09ICJSYXRhLXJhdGEiKSB7ICAjIEppa2Ega2luZXJqYSBhZGFsYWggIlJhdGEtcmF0YSINCiAgICBuZXh0ICAjIE1lbGV3YXRpIGl0ZXJhc2kgaW5pIGRhbiBsYW5qdXQga2UgaXRlcmFzaSBiZXJpa3V0bnlhDQogIH0NCiAgY2F0KHNwcmludGYoIk5hbWU6ICVzLCBQZXJmb3JtYW5jZTogJXNcbiIsIGRhdGEkTmFtYVtpXSwgZGF0YSRQZXJ0dW5qdWthbltpXSkpICAjIE1lbmFtcGlsa2FuIG5hbWEgZGFuIGtpbmVyamENCn0NCmBgYA==