
Pendahuluan
Laporan ini membahas proses web scraping menggunakan bahasa
pemrograman R dengan bantuan paket rvest. Tujuan dari laporan ini adalah
memberikan panduan praktis bagi pengguna yang belum memiliki pengetahuan
mendalam tentang HTML namun ingin mengekstrak data dari situs web secara
efisien. Web scraping adalah teknik otomatisasi yang digunakan untuk
mengambil informasi dari halaman web dan mengubahnya menjadi data
terstruktur. Dengan menggunakan R, pengguna dapat dengan mudah mengakses
dan mengolah data yang terkandung dalam berbagai elemen HTML seperti
tabel, teks, gambar, dan lainnya. Dalam laporan ini, dibahas
langkah-langkah utama yang dilengkapi dengan contoh praktis untuk
memudahkan pemahaman.
1. Persiapan Lingkungan di R
Sebelum memulai proses web scraping di R, diperlukan instalasi
perangkat dan paket pendukung: - Instalasi R dan
RStudio: Pastikan Anda telah mengunduh dan menginstal R dan
RStudio di komputer Anda. R adalah bahasa pemrograman yang digunakan
untuk analisis data, sedangkan RStudio adalah lingkungan pengembangan
terintegrasi (IDE) yang mempermudah penulisan dan eksekusi kode R. -
Instalasi Paket: Paket dalam R adalah kumpulan fungsi
dan data yang digunakan untuk tugas tertentu. Untuk melakukan web
scraping, kita memerlukan paket rvest untuk mengambil dan
memproses HTML, serta dplyr untuk manipulasi data. Buka RStudio
dan jalankan perintah berikut untuk menginstal paket yang
dibutuhkan:
install.packages("rvest")
install.packages("dplyr")
- Pemanggilan Paket: Setelah instalasi, panggil
paket-paket tersebut dalam skrip R Anda untuk mulai menggunakannya:
library(rvest)
library(dplyr)
Memanggil paket berarti mengaktifkan fungsi-fungsi yang tersedia di
dalamnya sehingga dapat digunakan dalam skrip Anda.
2. Penggunaan Paket Datapasta untuk Manajemen Data di R
Paket datapasta memudahkan pemformatan dan pengelolaan data
di R. Paket ini sangat membantu ketika Anda perlu menyalin data dari
sumber eksternal seperti spreadsheet atau tabel web dan mengubahnya
menjadi kode R yang dapat langsung dieksekusi. - Instalasi
Paket: Jalankan perintah berikut untuk menginstal
datapasta:
install.packages("datapasta")
- Penggunaan Pintasan: Paket ini menyediakan pintasan
keyboard yang memungkinkan Anda dengan cepat mengonversi bingkai data
dan objek lainnya ke dalam kode R. Misalnya, Anda bisa menyalin data
dari Excel dan menggunakan pintasan untuk menempelkannya sebagai data
frame di R.
3. Pengikisan Tabel HTML di R
Salah satu tugas dasar dalam web scraping adalah mengekstrak data
dari tabel HTML, yang sering ditemukan di halaman web dalam bentuk tabel
statistik, daftar produk, atau informasi lainnya. - Identifikasi
Situs Web: Pilih situs web yang berisi tabel HTML yang ingin
dikumpulkan. Pastikan situs tersebut memiliki izin untuk melakukan web
scraping agar menghindari pelanggaran hukum. - Pembacaan
HTML: Gunakan kode berikut untuk membaca konten HTML halaman
web:
url <- 'http://example.com/table' # Ganti dengan URL yang relevan
webpage <- read_html(url)
Fungsi read_html() membaca seluruh struktur HTML dari
halaman web yang ditentukan. - Ekstraksi Tabel: Gunakan
fungsi html_table() untuk mengekstrak tabel dari halaman
tersebut:
table <- webpage %>% html_table(fill = TRUE)
Parameter fill = TRUE memastikan tabel tetap terisi
meskipun ada sel yang kosong. - Penampilan Tabel:
Tampilkan tabel yang telah diekstrak untuk memverifikasi hasilnya:
4. Melakukan Perulangan Melalui Beberapa URL
Sering kali data tersebar di beberapa halaman web. Untuk mengumpulkan
data dari halaman-halaman tersebut, Anda dapat menggunakan perulangan di
R. - Buat Vektor URL: Siapkan daftar URL yang ingin
Anda kunjungi:
urls <- c('http://example.com/page1', 'http://example.com/page2')
- Ulangi URL: Gunakan fungsi
lapply()
untuk membaca dan mengekstrak data dari masing-masing URL:
results <- lapply(urls, function(url) {
webpage <- read_html(url)
table <- webpage %>% html_table(fill = TRUE)
return(table)
})
Fungsi lapply() menerapkan fungsi yang sama ke setiap
elemen dalam vektor urls. - Gabungkan
Hasil: Jika diperlukan, gabungkan semua hasil menjadi satu data
frame menggunakan fungsi bind_rows() dari paket dplyr:
combined_results <- bind_rows(results)
5. Pemilihan Node HTML dengan Bantuan ChatGPT di R
Kadang-kadang data yang diinginkan tidak terletak dalam tabel
melainkan elemen HTML lainnya seperti paragraf, heading, atau div dengan
kelas tertentu. - Pemeriksaan HTML: Klik kanan pada
elemen yang ingin dikikis dan pilih “Periksa” (Inspect) untuk melihat
struktur HTML. - Konsultasi dengan ChatGPT: Anda dapat
meminta bantuan ChatGPT dalam mengidentifikasi node HTML dengan
menyajikan struktur HTML tersebut dan menjelaskan data apa yang ingin
Anda ambil. - Ekstraksi Node: Setelah mendapatkan node
yang sesuai, gunakan fungsi html_nodes() untuk mengekstrak
konten:
nodes <- webpage %>% html_nodes('your_css_selector') # Ganti dengan selector yang sesuai
6. Kesimpulan
Laporan ini telah menguraikan langkah-langkah penting dalam melakukan
web scraping di R menggunakan paket rvest. Dengan mempraktikkan
teknik-teknik ini, pengguna dapat mengumpulkan dan mengelola data dari
berbagai situs web secara efektif. Keterampilan web scraping sangat
berguna dalam analisis data, riset pasar, dan pengumpulan informasi dari
berbagai sumber. Sebagai langkah lanjutan, disarankan untuk berlatih
dengan berbagai situs web dan format data guna meningkatkan keterampilan
web scraping. Dengan pemahaman yang baik tentang struktur HTML dan
penerapan teknik yang tepat, Anda dapat mengotomatiskan proses
pengumpulan data dengan lebih efisien.
LS0tICANCnRpdGxlOiAiU0FNUExJTkcgJiBTVVJWRVkgVEVDSE5JUVVFUyIgIA0Kc3VidGl0bGU6ICJMQVBPUkFOIFdFQiBTQ1JBUElORyBNRU5HR1VOQUtBTiBSIiAgDQphdXRob3I6ICJEYWRhbiBSYW1kYW4gSGlkYXlhdCAoNTIyNDAwMjgpIiAgDQpkYXRlOiAiYHIgZm9ybWF0KFN5cy5EYXRlKCksICclQiAlZCwgJVknKWAiICANCm91dHB1dDogIA0KICBybWRmb3JtYXRzOjpyZWFkdGhlZG93bjogICANCiAgICBzZWxmX2NvbnRhaW5lZDogdHJ1ZSAgDQogICAgdGh1bWJuYWlsczogdHJ1ZSAgDQogICAgbGlnaHRib3g6IHRydWUgIA0KICAgIGdhbGxlcnk6IHRydWUgIA0KICAgIGxpYl9kaXI6IGxpYnMgIA0KICAgIGRmX3ByaW50OiAicGFnZWQiICANCiAgICBjb2RlX2ZvbGRpbmc6ICJzaG93IiAgDQogICAgY29kZV9kb3dubG9hZDogdHJ1ZSAgDQogICAgY3NzOiAic3R5bGUuY3NzIiAgDQotLS0gIA0KDQo8aW1nIHNyYz0iRk9UTyBURVJCQVJVXzExem9uLmpwZyIgYWx0PSJMb2dvIiBzdHlsZT0id2lkdGg6MjAwcHg7IGRpc3BsYXk6IGJsb2NrOyBtYXJnaW46IGF1dG87Ij4NCg0KIyBQZW5kYWh1bHVhbg0KTGFwb3JhbiBpbmkgbWVtYmFoYXMgcHJvc2VzIHdlYiBzY3JhcGluZyBtZW5nZ3VuYWthbiBiYWhhc2EgcGVtcm9ncmFtYW4gUiBkZW5nYW4gYmFudHVhbiBwYWtldCBydmVzdC4gVHVqdWFuIGRhcmkgbGFwb3JhbiBpbmkgYWRhbGFoIG1lbWJlcmlrYW4gcGFuZHVhbiBwcmFrdGlzIGJhZ2kgcGVuZ2d1bmEgeWFuZyBiZWx1bSBtZW1pbGlraSBwZW5nZXRhaHVhbiBtZW5kYWxhbSB0ZW50YW5nIEhUTUwgbmFtdW4gaW5naW4gbWVuZ2Vrc3RyYWsgZGF0YSBkYXJpIHNpdHVzIHdlYiBzZWNhcmEgZWZpc2llbi4gV2ViIHNjcmFwaW5nIGFkYWxhaCB0ZWtuaWsgb3RvbWF0aXNhc2kgeWFuZyBkaWd1bmFrYW4gdW50dWsgbWVuZ2FtYmlsIGluZm9ybWFzaSBkYXJpIGhhbGFtYW4gd2ViIGRhbiBtZW5ndWJhaG55YSBtZW5qYWRpIGRhdGEgdGVyc3RydWt0dXIuIERlbmdhbiBtZW5nZ3VuYWthbiBSLCBwZW5nZ3VuYSBkYXBhdCBkZW5nYW4gbXVkYWggbWVuZ2Frc2VzIGRhbiBtZW5nb2xhaCBkYXRhIHlhbmcgdGVya2FuZHVuZyBkYWxhbSBiZXJiYWdhaSBlbGVtZW4gSFRNTCBzZXBlcnRpIHRhYmVsLCB0ZWtzLCBnYW1iYXIsIGRhbiBsYWlubnlhLiBEYWxhbSBsYXBvcmFuIGluaSwgZGliYWhhcyBsYW5na2FoLWxhbmdrYWggdXRhbWEgeWFuZyBkaWxlbmdrYXBpIGRlbmdhbiBjb250b2ggcHJha3RpcyB1bnR1ayBtZW11ZGFoa2FuIHBlbWFoYW1hbi4NCg0KIyAxLiBQZXJzaWFwYW4gTGluZ2t1bmdhbiBkaSBSDQpTZWJlbHVtIG1lbXVsYWkgcHJvc2VzIHdlYiBzY3JhcGluZyBkaSBSLCBkaXBlcmx1a2FuIGluc3RhbGFzaSBwZXJhbmdrYXQgZGFuIHBha2V0IHBlbmR1a3VuZzoNCi0gKipJbnN0YWxhc2kgUiBkYW4gUlN0dWRpbzoqKiBQYXN0aWthbiBBbmRhIHRlbGFoIG1lbmd1bmR1aCBkYW4gbWVuZ2luc3RhbCBSIGRhbiBSU3R1ZGlvIGRpIGtvbXB1dGVyIEFuZGEuIFIgYWRhbGFoIGJhaGFzYSBwZW1yb2dyYW1hbiB5YW5nIGRpZ3VuYWthbiB1bnR1ayBhbmFsaXNpcyBkYXRhLCBzZWRhbmdrYW4gUlN0dWRpbyBhZGFsYWggbGluZ2t1bmdhbiBwZW5nZW1iYW5nYW4gdGVyaW50ZWdyYXNpIChJREUpIHlhbmcgbWVtcGVybXVkYWggcGVudWxpc2FuIGRhbiBla3Nla3VzaSBrb2RlIFIuDQotICoqSW5zdGFsYXNpIFBha2V0OioqIFBha2V0IGRhbGFtIFIgYWRhbGFoIGt1bXB1bGFuIGZ1bmdzaSBkYW4gZGF0YSB5YW5nIGRpZ3VuYWthbiB1bnR1ayB0dWdhcyB0ZXJ0ZW50dS4gVW50dWsgbWVsYWt1a2FuIHdlYiBzY3JhcGluZywga2l0YSBtZW1lcmx1a2FuIHBha2V0ICpydmVzdCogdW50dWsgbWVuZ2FtYmlsIGRhbiBtZW1wcm9zZXMgSFRNTCwgc2VydGEgKmRwbHlyKiB1bnR1ayBtYW5pcHVsYXNpIGRhdGEuIEJ1a2EgUlN0dWRpbyBkYW4gamFsYW5rYW4gcGVyaW50YWggYmVyaWt1dCB1bnR1ayBtZW5naW5zdGFsIHBha2V0IHlhbmcgZGlidXR1aGthbjoNCmBgYHINCmluc3RhbGwucGFja2FnZXMoInJ2ZXN0IikNCmluc3RhbGwucGFja2FnZXMoImRwbHlyIikNCmBgYA0KLSAqKlBlbWFuZ2dpbGFuIFBha2V0OioqIFNldGVsYWggaW5zdGFsYXNpLCBwYW5nZ2lsIHBha2V0LXBha2V0IHRlcnNlYnV0IGRhbGFtIHNrcmlwIFIgQW5kYSB1bnR1ayBtdWxhaSBtZW5nZ3VuYWthbm55YToNCmBgYHINCmxpYnJhcnkocnZlc3QpDQpsaWJyYXJ5KGRwbHlyKQ0KYGBgDQpNZW1hbmdnaWwgcGFrZXQgYmVyYXJ0aSBtZW5nYWt0aWZrYW4gZnVuZ3NpLWZ1bmdzaSB5YW5nIHRlcnNlZGlhIGRpIGRhbGFtbnlhIHNlaGluZ2dhIGRhcGF0IGRpZ3VuYWthbiBkYWxhbSBza3JpcCBBbmRhLg0KDQojIDIuIFBlbmdndW5hYW4gUGFrZXQgRGF0YXBhc3RhIHVudHVrIE1hbmFqZW1lbiBEYXRhIGRpIFINClBha2V0ICpkYXRhcGFzdGEqIG1lbXVkYWhrYW4gcGVtZm9ybWF0YW4gZGFuIHBlbmdlbG9sYWFuIGRhdGEgZGkgUi4gUGFrZXQgaW5pIHNhbmdhdCBtZW1iYW50dSBrZXRpa2EgQW5kYSBwZXJsdSBtZW55YWxpbiBkYXRhIGRhcmkgc3VtYmVyIGVrc3Rlcm5hbCBzZXBlcnRpIHNwcmVhZHNoZWV0IGF0YXUgdGFiZWwgd2ViIGRhbiBtZW5ndWJhaG55YSBtZW5qYWRpIGtvZGUgUiB5YW5nIGRhcGF0IGxhbmdzdW5nIGRpZWtzZWt1c2kuDQotICoqSW5zdGFsYXNpIFBha2V0OioqIEphbGFua2FuIHBlcmludGFoIGJlcmlrdXQgdW50dWsgbWVuZ2luc3RhbCBkYXRhcGFzdGE6DQpgYGByDQppbnN0YWxsLnBhY2thZ2VzKCJkYXRhcGFzdGEiKQ0KYGBgDQotICoqUGVuZ2d1bmFhbiBQaW50YXNhbjoqKiBQYWtldCBpbmkgbWVueWVkaWFrYW4gcGludGFzYW4ga2V5Ym9hcmQgeWFuZyBtZW11bmdraW5rYW4gQW5kYSBkZW5nYW4gY2VwYXQgbWVuZ29udmVyc2kgYmluZ2thaSBkYXRhIGRhbiBvYmplayBsYWlubnlhIGtlIGRhbGFtIGtvZGUgUi4gTWlzYWxueWEsIEFuZGEgYmlzYSBtZW55YWxpbiBkYXRhIGRhcmkgRXhjZWwgZGFuIG1lbmdndW5ha2FuIHBpbnRhc2FuIHVudHVrIG1lbmVtcGVsa2FubnlhIHNlYmFnYWkgZGF0YSBmcmFtZSBkaSBSLg0KDQojIDMuIFBlbmdpa2lzYW4gVGFiZWwgSFRNTCBkaSBSDQpTYWxhaCBzYXR1IHR1Z2FzIGRhc2FyIGRhbGFtIHdlYiBzY3JhcGluZyBhZGFsYWggbWVuZ2Vrc3RyYWsgZGF0YSBkYXJpIHRhYmVsIEhUTUwsIHlhbmcgc2VyaW5nIGRpdGVtdWthbiBkaSBoYWxhbWFuIHdlYiBkYWxhbSBiZW50dWsgdGFiZWwgc3RhdGlzdGlrLCBkYWZ0YXIgcHJvZHVrLCBhdGF1IGluZm9ybWFzaSBsYWlubnlhLg0KLSAqKklkZW50aWZpa2FzaSBTaXR1cyBXZWI6KiogUGlsaWggc2l0dXMgd2ViIHlhbmcgYmVyaXNpIHRhYmVsIEhUTUwgeWFuZyBpbmdpbiBkaWt1bXB1bGthbi4gUGFzdGlrYW4gc2l0dXMgdGVyc2VidXQgbWVtaWxpa2kgaXppbiB1bnR1ayBtZWxha3VrYW4gd2ViIHNjcmFwaW5nIGFnYXIgbWVuZ2hpbmRhcmkgcGVsYW5nZ2FyYW4gaHVrdW0uDQotICoqUGVtYmFjYWFuIEhUTUw6KiogR3VuYWthbiBrb2RlIGJlcmlrdXQgdW50dWsgbWVtYmFjYSBrb250ZW4gSFRNTCBoYWxhbWFuIHdlYjoNCmBgYHINCnVybCA8LSAnaHR0cDovL2V4YW1wbGUuY29tL3RhYmxlJyAgIyBHYW50aSBkZW5nYW4gVVJMIHlhbmcgcmVsZXZhbg0Kd2VicGFnZSA8LSByZWFkX2h0bWwodXJsKQ0KYGBgDQpGdW5nc2kgYHJlYWRfaHRtbCgpYCBtZW1iYWNhIHNlbHVydWggc3RydWt0dXIgSFRNTCBkYXJpIGhhbGFtYW4gd2ViIHlhbmcgZGl0ZW50dWthbi4NCi0gKipFa3N0cmFrc2kgVGFiZWw6KiogR3VuYWthbiBmdW5nc2kgYGh0bWxfdGFibGUoKWAgdW50dWsgbWVuZ2Vrc3RyYWsgdGFiZWwgZGFyaSBoYWxhbWFuIHRlcnNlYnV0Og0KYGBgcg0KdGFibGUgPC0gd2VicGFnZSAlPiUgaHRtbF90YWJsZShmaWxsID0gVFJVRSkNCmBgYA0KUGFyYW1ldGVyIGBmaWxsID0gVFJVRWAgbWVtYXN0aWthbiB0YWJlbCB0ZXRhcCB0ZXJpc2kgbWVza2lwdW4gYWRhIHNlbCB5YW5nIGtvc29uZy4NCi0gKipQZW5hbXBpbGFuIFRhYmVsOioqIFRhbXBpbGthbiB0YWJlbCB5YW5nIHRlbGFoIGRpZWtzdHJhayB1bnR1ayBtZW12ZXJpZmlrYXNpIGhhc2lsbnlhOg0KYGBgcg0KcHJpbnQodGFibGUpDQpgYGANCg0KIyA0LiBNZWxha3VrYW4gUGVydWxhbmdhbiBNZWxhbHVpIEJlYmVyYXBhIFVSTA0KU2VyaW5nIGthbGkgZGF0YSB0ZXJzZWJhciBkaSBiZWJlcmFwYSBoYWxhbWFuIHdlYi4gVW50dWsgbWVuZ3VtcHVsa2FuIGRhdGEgZGFyaSBoYWxhbWFuLWhhbGFtYW4gdGVyc2VidXQsIEFuZGEgZGFwYXQgbWVuZ2d1bmFrYW4gcGVydWxhbmdhbiBkaSBSLg0KLSAqKkJ1YXQgVmVrdG9yIFVSTDoqKiBTaWFwa2FuIGRhZnRhciBVUkwgeWFuZyBpbmdpbiBBbmRhIGt1bmp1bmdpOg0KYGBgcg0KdXJscyA8LSBjKCdodHRwOi8vZXhhbXBsZS5jb20vcGFnZTEnLCAnaHR0cDovL2V4YW1wbGUuY29tL3BhZ2UyJykNCmBgYA0KLSAqKlVsYW5naSBVUkw6KiogR3VuYWthbiBmdW5nc2kgYGxhcHBseSgpYCB1bnR1ayBtZW1iYWNhIGRhbiBtZW5nZWtzdHJhayBkYXRhIGRhcmkgbWFzaW5nLW1hc2luZyBVUkw6DQpgYGByDQpyZXN1bHRzIDwtIGxhcHBseSh1cmxzLCBmdW5jdGlvbih1cmwpIHsNCiAgICB3ZWJwYWdlIDwtIHJlYWRfaHRtbCh1cmwpDQogICAgdGFibGUgPC0gd2VicGFnZSAlPiUgaHRtbF90YWJsZShmaWxsID0gVFJVRSkNCiAgICByZXR1cm4odGFibGUpDQp9KQ0KYGBgDQpGdW5nc2kgYGxhcHBseSgpYCBtZW5lcmFwa2FuIGZ1bmdzaSB5YW5nIHNhbWEga2Ugc2V0aWFwIGVsZW1lbiBkYWxhbSB2ZWt0b3IgYHVybHNgLg0KLSAqKkdhYnVuZ2thbiBIYXNpbDoqKiBKaWthIGRpcGVybHVrYW4sIGdhYnVuZ2thbiBzZW11YSBoYXNpbCBtZW5qYWRpIHNhdHUgZGF0YSBmcmFtZSBtZW5nZ3VuYWthbiBmdW5nc2kgYGJpbmRfcm93cygpYCBkYXJpIHBha2V0IGRwbHlyOg0KYGBgcg0KY29tYmluZWRfcmVzdWx0cyA8LSBiaW5kX3Jvd3MocmVzdWx0cykNCmBgYA0KDQojIDUuIFBlbWlsaWhhbiBOb2RlIEhUTUwgZGVuZ2FuIEJhbnR1YW4gQ2hhdEdQVCBkaSBSDQpLYWRhbmcta2FkYW5nIGRhdGEgeWFuZyBkaWluZ2lua2FuIHRpZGFrIHRlcmxldGFrIGRhbGFtIHRhYmVsIG1lbGFpbmthbiBlbGVtZW4gSFRNTCBsYWlubnlhIHNlcGVydGkgcGFyYWdyYWYsIGhlYWRpbmcsIGF0YXUgZGl2IGRlbmdhbiBrZWxhcyB0ZXJ0ZW50dS4NCi0gKipQZW1lcmlrc2FhbiBIVE1MOioqIEtsaWsga2FuYW4gcGFkYSBlbGVtZW4geWFuZyBpbmdpbiBkaWtpa2lzIGRhbiBwaWxpaCAiUGVyaWtzYSIgKEluc3BlY3QpIHVudHVrIG1lbGloYXQgc3RydWt0dXIgSFRNTC4NCi0gKipLb25zdWx0YXNpIGRlbmdhbiBDaGF0R1BUOioqIEFuZGEgZGFwYXQgbWVtaW50YSBiYW50dWFuIENoYXRHUFQgZGFsYW0gbWVuZ2lkZW50aWZpa2FzaSBub2RlIEhUTUwgZGVuZ2FuIG1lbnlhamlrYW4gc3RydWt0dXIgSFRNTCB0ZXJzZWJ1dCBkYW4gbWVuamVsYXNrYW4gZGF0YSBhcGEgeWFuZyBpbmdpbiBBbmRhIGFtYmlsLg0KLSAqKkVrc3RyYWtzaSBOb2RlOioqIFNldGVsYWggbWVuZGFwYXRrYW4gbm9kZSB5YW5nIHNlc3VhaSwgZ3VuYWthbiBmdW5nc2kgYGh0bWxfbm9kZXMoKWAgdW50dWsgbWVuZ2Vrc3RyYWsga29udGVuOg0KYGBgcg0Kbm9kZXMgPC0gd2VicGFnZSAlPiUgaHRtbF9ub2RlcygneW91cl9jc3Nfc2VsZWN0b3InKSAgIyBHYW50aSBkZW5nYW4gc2VsZWN0b3IgeWFuZyBzZXN1YWkNCmBgYA0KDQojIDYuIEtlc2ltcHVsYW4NCkxhcG9yYW4gaW5pIHRlbGFoIG1lbmd1cmFpa2FuIGxhbmdrYWgtbGFuZ2thaCBwZW50aW5nIGRhbGFtIG1lbGFrdWthbiB3ZWIgc2NyYXBpbmcgZGkgUiBtZW5nZ3VuYWthbiBwYWtldCBydmVzdC4gRGVuZ2FuIG1lbXByYWt0aWtrYW4gdGVrbmlrLXRla25payBpbmksIHBlbmdndW5hIGRhcGF0IG1lbmd1bXB1bGthbiBkYW4gbWVuZ2Vsb2xhIGRhdGEgZGFyaSBiZXJiYWdhaSBzaXR1cyB3ZWIgc2VjYXJhIGVmZWt0aWYuIEtldGVyYW1waWxhbiB3ZWIgc2NyYXBpbmcgc2FuZ2F0IGJlcmd1bmEgZGFsYW0gYW5hbGlzaXMgZGF0YSwgcmlzZXQgcGFzYXIsIGRhbiBwZW5ndW1wdWxhbiBpbmZvcm1hc2kgZGFyaSBiZXJiYWdhaSBzdW1iZXIuIFNlYmFnYWkgbGFuZ2thaCBsYW5qdXRhbiwgZGlzYXJhbmthbiB1bnR1ayBiZXJsYXRpaCBkZW5nYW4gYmVyYmFnYWkgc2l0dXMgd2ViIGRhbiBmb3JtYXQgZGF0YSBndW5hIG1lbmluZ2thdGthbiBrZXRlcmFtcGlsYW4gd2ViIHNjcmFwaW5nLiBEZW5nYW4gcGVtYWhhbWFuIHlhbmcgYmFpayB0ZW50YW5nIHN0cnVrdHVyIEhUTUwgZGFuIHBlbmVyYXBhbiB0ZWtuaWsgeWFuZyB0ZXBhdCwgQW5kYSBkYXBhdCBtZW5nb3RvbWF0aXNrYW4gcHJvc2VzIHBlbmd1bXB1bGFuIGRhdGEgZGVuZ2FuIGxlYmloIGVmaXNpZW4uDQoNCg0KDQojIDcuIFJlZmVyZW5zaQ0KDQoNCmh0dHBzOi8vYm9va2Rvd24ub3JnL2RzY2llbmNlbGFicy9kYXRhX3NjaWVuY2VfcHJvZ3JhbW1pbmcvMDQtRGF0YV9Db2xsZWN0aW9uLmh0bWwNCg0KaHR0cHM6Ly93d3cuZ2Vla3Nmb3JnZWVrcy5vcmcvd2hhdC1pcy13ZWItc2NyYXBpbmctYW5kLWhvdy10by11c2UtaXQvDQoNCmh0dHBzOi8vYmxvZy5ydW1haHdlYi5jb20vd2ViLXNjcmFwaW5nLWFkYWxhaC8NCg0KaHR0cHM6Ly93ZWJzY3JhcGVyLmlvLw0KDQpodHRwczovL3d3dy5kZXdhd2ViLmNvbS9ibG9nL3dlYi1zY3JhcGluZy1wYW5kdWFuLWRhbi10ZWtuaWstdGVrbmlrbnlhLw0KDQoNCg==