Web Scaraping

Data Science Programming

Logo

Penggunaan Web Scraping with R

1. Pengertian

Web scraping adalah teknik untuk mengambil data dari situs web secara otomatis menggunakan program komputer. Teknik ini sangat berguna karena banyak informasi di internet tidak tersedia dalam format yang mudah diunduh, seperti file Excel atau CSV. Dengan web scraping, kita bisa mengumpulkan data seperti teks, gambar, atau tabel dari halaman web untuk keperluan analisis, penelitian, atau pengambilan keputusan. Bahasa pemrograman R, yang sering digunakan untuk analisis data, menyediakan alat seperti paket rvest dan httr yang memudahkan proses scraping. Dalam tugas ini, kita akan belajar cara mengakses halaman web, mengambil data yang dibutuhkan, dan menyimpannya dalam format yang siap digunakan. Dengan menguasai web scraping, kita bisa memanfaatkan data online untuk berbagai proyek secara efisien.

2. Alat Perangkat Lunak untuk Web Scaripng di R

1. R dan RStudio

2. Paket R untuk Web Scraping:

-rvest: Paket utama untuk mengambil dan mengurai data dari halaman web.

-httr: Digunakan untuk mengirim permintaan HTTP (seperti GET atau POST) ke server web.

-XML atau xml2: Untuk mengurai dokumen HTML atau XML.

-jsonlite: Jika data yang diambil berbentuk JSON, paket ini membantu mengurai dan mengolahnya.

-dplyr dan tidyverse: Untuk membersihkan dan memproses data setelah di-scrape.

3. Web Browser or Developer Tools

4. Koneksi Internet

5.Text Editor (Opsional)

6.Pengetahuan Dasar HTML dan CSS

3. Metode Web Scaraping di R

3.1 Menggunakan Paket rvest

Metode: rvest adalah paket paling populer untuk web scraping di R. Ini memungkinkan Anda mengambil data dari halaman web dengan mudah menggunakan fungsi seperti read_html() untuk membaca halaman web, html_nodes() untuk memilih elemen HTML, dan html_text() atau html_attr() untuk mengekstrak teks atau atribut.

Kegunaan: Cocok untuk scraping halaman web statis dengan struktur HTML yang jelas.

Contoh:

library(rvest)
## Warning: package 'rvest' was built under R version 4.4.3
url <- "https://example.com"
page <- read_html(url)
data <- page %>% html_nodes("h1") %>% html_text()
print(data)
## [1] "Example Domain"

3.2 Menggunakan Paket xml2

Metode: xml2 adalah paket untuk mengurai dokumen HTML atau XML. Ini mirip dengan rvest tetapi lebih fokus pada manipulasi struktur XML/HTML.

Kegunaan: Cocok untuk scraping data dari dokumen XML atau HTML kompleks.

Contoh:

library(xml2)
## Warning: package 'xml2' was built under R version 4.4.3
url <- "https://example.com"
page <- read_html(url)
data <- xml_find_all(page, "//h1") %>% xml_text()
print(data)
## [1] "Example Domain"

4. contoh penggunaan web scraping di R

4.1.1 Mengambil Judul Berita dari Web BBC News

Bayangkan Anda ingin mengumpulkan judul-judul berita terbaru dari halaman utama BBC News. Dengan bantuan R, Anda bisa melakukannya secara otomatis menggunakan teknik web scraping. Berikut langkah-langkahnya:

4.1.2 Persiapan

Pastikan Anda sudah menginstal paket rvest di R. Jika belum, jalankan perintah berikut:

install.packages("rvest")
## Warning: package 'rvest' is in use and will not be installed

4.1.3 Mulai Scraping

Berikut adalah kode R untuk mengambil judul berita dari BBC News:

# Load paket rvest
library(rvest)

# Tentukan URL halaman BBC News
url <- "https://www.bbc.com/news"

# Baca halaman web
halaman_web <- read_html(url)

# Ambil judul artikel menggunakan selector CSS
judul_berita <- halaman_web %>%
  html_nodes(".gs-c-promo-heading__title") %>%  # Pilih elemen judul
  html_text(trim = TRUE)  # Ambil teks dan hilangkan spasi ekstra

# Tampilkan hasil
print(judul_berita)
## character(0)

4.1.4 Hasil

Setelah menjalankan kode di atas, Anda akan mendapatkan daftar judul berita terbaru dari BBC News, seperti:

[1] “Judul Berita 1”

[2] “Judul Berita 2”

[3] “Judul Berita 3” …

Tantangan dan Solusi Web Scraping di R

Web scraping di R bisa menjadi tantangan karena berbagai faktor teknis dan non-teknis. Berikut adalah Tabel beberapa tantangan umum beserta solusinya:

# Membuat data frame untuk tabel
tantangan_solusi <- data.frame(
  Tantangan = c(
    "Halaman Dinamis (JavaScript)",
    "Struktur HTML Rumit",
    "Pemblokiran oleh Situs",
    "Perubahan Struktur Website",
    "Data dalam Format JSON/API"
  ),
  Solusi = c(
    "Gunakan **`RSelenium`** untuk render halaman lengkap.",
    "Pakai **SelectorGadget** atau **Developer Tools** untuk identifikasi CSS.",
    "Tambahkan header (seperti `User-Agent`) dan jeda waktu (`Sys.sleep()`).",
    "Buat selector fleksibel dan pantau perubahan berkala.",
    "Gunakan **`httr`** dan **`jsonlite`** untuk mengambil dan mengurai JSON."
  )
)

# Menampilkan tabel
library(knitr)
## Warning: package 'knitr' was built under R version 4.4.2
kable(tantangan_solusi, align = "l", caption = "Tantangan dan Solusi Web Scraping di R")
Tantangan dan Solusi Web Scraping di R
Tantangan Solusi
Halaman Dinamis (JavaScript) Gunakan RSelenium untuk render halaman lengkap.
Struktur HTML Rumit Pakai SelectorGadget atau Developer Tools untuk identifikasi CSS.
Pemblokiran oleh Situs Tambahkan header (seperti User-Agent) dan jeda waktu (Sys.sleep()).
Perubahan Struktur Website Buat selector fleksibel dan pantau perubahan berkala.
Data dalam Format JSON/API Gunakan httr dan jsonlite untuk mengambil dan mengurai JSON.

Kesimpulan

Kalo lo pengen ngumpulin data dari website pake R, rvest sama xml2 adalah duo jagoan yang bisa lo andelin! rvest itu simpel banget buat pemula, cocok buat ngambil data dari halaman web statis. Sementara xml2 lebih fleksibel dan powerful, bisa handle struktur HTML/XML yang lebih ribet. Pilih rvest kalo lo mau yang praktis, atau xml2 kalo lo butuh kontrol lebih. Yang pasti, selalu cek kebijakan website biar gak kena masalah. Jadi, siap jadi data hunter? Gaskeun aja! 😎🔥

LS0tDQp0aXRsZTogIldlYiBTY2FyYXBpbmciDQpzdWJ0aXRsZTogIkRhdGEgU2NpZW5jZSBQcm9ncmFtbWluZyINCmF1dGhvcjogIk11aGFtbWFkIE5hYmlsIFByYXRhbWEiDQpkYXRlOiAiYHIgZm9ybWF0KFN5cy5EYXRlKCksICclQiAlZCwgJVknKWAiDQpvdXRwdXQ6DQogIHJtZGZvcm1hdHM6OnJlYWR0aGVkb3duOg0KICAgIHNlbGZfY29udGFpbmVkOiB0cnVlDQogICAgdGh1bWJuYWlsczogdHJ1ZQ0KICAgIGxpZ2h0Ym94OiB0cnVlDQogICAgZ2FsbGVyeTogdHJ1ZQ0KICAgIGxpYl9kaXI6IGxpYnMNCiAgICBkZl9wcmludDogInBhZ2VkIg0KICAgIGNvZGVfZm9sZGluZzogInNob3ciDQogICAgY29kZV9kb3dubG9hZDogeWVzDQogICAgY3NzOiAic3R5bGUuY3NzIg0KLS0tDQoNCjxpbWcgaWQ9ImlzaV9uYW1hIiBzcmM9IkM6L1VzZXJzL00gTmFiaWwgUHJhdGFtYS9PbmVEcml2ZS9QaWN0dXJlcy9TY3JlZW5zaG90cy9HYW1iYXIgV2hhdHNBcHAgMjAyNC0xMi0wNiBwdWt1bCAxMy4zMy4xNV9jM2ZkMGZjNy5qcGciIGFsdD0iTG9nbyIgc3R5bGU9IndpZHRoOjIwMHB4OyBkaXNwbGF5OiBibG9jazsgbWFyZ2luOiBhdXRvOyI+DQoNCiMgKipQZW5nZ3VuYWFuIFdlYiBTY3JhcGluZyB3aXRoIFIqKg0KIyAqKjEuIFBlbmdlcnRpYW4qKg0KDQpXZWIgc2NyYXBpbmcgYWRhbGFoIHRla25payB1bnR1ayBtZW5nYW1iaWwgZGF0YSBkYXJpIHNpdHVzIHdlYiBzZWNhcmEgb3RvbWF0aXMgbWVuZ2d1bmFrYW4gcHJvZ3JhbSBrb21wdXRlci4gVGVrbmlrIGluaSBzYW5nYXQgYmVyZ3VuYSBrYXJlbmEgYmFueWFrIGluZm9ybWFzaSBkaSBpbnRlcm5ldCB0aWRhayB0ZXJzZWRpYSBkYWxhbSBmb3JtYXQgeWFuZyBtdWRhaCBkaXVuZHVoLCBzZXBlcnRpIGZpbGUgRXhjZWwgYXRhdSBDU1YuIERlbmdhbiB3ZWIgc2NyYXBpbmcsIGtpdGEgYmlzYSBtZW5ndW1wdWxrYW4gZGF0YSBzZXBlcnRpIHRla3MsIGdhbWJhciwgYXRhdSB0YWJlbCBkYXJpIGhhbGFtYW4gd2ViIHVudHVrIGtlcGVybHVhbiBhbmFsaXNpcywgcGVuZWxpdGlhbiwgYXRhdSBwZW5nYW1iaWxhbiBrZXB1dHVzYW4uIEJhaGFzYSBwZW1yb2dyYW1hbiBSLCB5YW5nIHNlcmluZyBkaWd1bmFrYW4gdW50dWsgYW5hbGlzaXMgZGF0YSwgbWVueWVkaWFrYW4gYWxhdCBzZXBlcnRpIHBha2V0IHJ2ZXN0IGRhbiBodHRyIHlhbmcgbWVtdWRhaGthbiBwcm9zZXMgc2NyYXBpbmcuIERhbGFtIHR1Z2FzIGluaSwga2l0YSBha2FuIGJlbGFqYXIgY2FyYSBtZW5nYWtzZXMgaGFsYW1hbiB3ZWIsIG1lbmdhbWJpbCBkYXRhIHlhbmcgZGlidXR1aGthbiwgZGFuIG1lbnlpbXBhbm55YSBkYWxhbSBmb3JtYXQgeWFuZyBzaWFwIGRpZ3VuYWthbi4gRGVuZ2FuIG1lbmd1YXNhaSB3ZWIgc2NyYXBpbmcsIGtpdGEgYmlzYSBtZW1hbmZhYXRrYW4gZGF0YSBvbmxpbmUgdW50dWsgYmVyYmFnYWkgcHJveWVrIHNlY2FyYSBlZmlzaWVuLg0KDQojICoqMi4gQWxhdCBQZXJhbmdrYXQgTHVuYWsgdW50dWsgV2ViIFNjYXJpcG5nIGRpIFIqKg0KKioxLiBSIGRhbiBSU3R1ZGlvKioNCg0KKioyLiBQYWtldCBSIHVudHVrIFdlYiBTY3JhcGluZzoqKg0KDQotcnZlc3Q6IFBha2V0IHV0YW1hIHVudHVrIG1lbmdhbWJpbCBkYW4gbWVuZ3VyYWkgZGF0YSBkYXJpIGhhbGFtYW4gd2ViLg0KDQotaHR0cjogRGlndW5ha2FuIHVudHVrIG1lbmdpcmltIHBlcm1pbnRhYW4gSFRUUCAoc2VwZXJ0aSBHRVQgYXRhdSBQT1NUKSBrZSBzZXJ2ZXIgd2ViLg0KDQotWE1MIGF0YXUgeG1sMjogVW50dWsgbWVuZ3VyYWkgZG9rdW1lbiBIVE1MIGF0YXUgWE1MLg0KDQotanNvbmxpdGU6IEppa2EgZGF0YSB5YW5nIGRpYW1iaWwgYmVyYmVudHVrIEpTT04sIHBha2V0IGluaSBtZW1iYW50dSBtZW5ndXJhaSBkYW4gbWVuZ29sYWhueWEuDQoNCi1kcGx5ciBkYW4gdGlkeXZlcnNlOiBVbnR1ayBtZW1iZXJzaWhrYW4gZGFuIG1lbXByb3NlcyBkYXRhIHNldGVsYWggZGktc2NyYXBlLg0KDQoqKjMuIFdlYiBCcm93c2VyIG9yIERldmVsb3BlciBUb29scyoqDQoNCioqNC4gS29uZWtzaSBJbnRlcm5ldCoqDQoNCioqNS5UZXh0IEVkaXRvciAoT3BzaW9uYWwpKioNCg0KKio2LlBlbmdldGFodWFuIERhc2FyIEhUTUwgZGFuIENTUyoqDQoNCiMgKiozLiBNZXRvZGUgV2ViIFNjYXJhcGluZyBkaSBSKioNCiMjICoqMy4xIE1lbmdndW5ha2FuIFBha2V0IHJ2ZXN0KioNCg0KTWV0b2RlOiBydmVzdCBhZGFsYWggcGFrZXQgcGFsaW5nIHBvcHVsZXIgdW50dWsgd2ViIHNjcmFwaW5nIGRpIFIuIEluaSBtZW11bmdraW5rYW4gQW5kYSBtZW5nYW1iaWwgZGF0YSBkYXJpIGhhbGFtYW4gd2ViIGRlbmdhbiBtdWRhaCBtZW5nZ3VuYWthbiBmdW5nc2kgc2VwZXJ0aSByZWFkX2h0bWwoKSB1bnR1ayBtZW1iYWNhIGhhbGFtYW4gd2ViLCBodG1sX25vZGVzKCkgdW50dWsgbWVtaWxpaCBlbGVtZW4gSFRNTCwgZGFuIGh0bWxfdGV4dCgpIGF0YXUgaHRtbF9hdHRyKCkgdW50dWsgbWVuZ2Vrc3RyYWsgdGVrcyBhdGF1IGF0cmlidXQuDQoNCktlZ3VuYWFuOiBDb2NvayB1bnR1ayBzY3JhcGluZyBoYWxhbWFuIHdlYiBzdGF0aXMgZGVuZ2FuIHN0cnVrdHVyIEhUTUwgeWFuZyBqZWxhcy4NCg0KQ29udG9oOg0KYGBge3J9DQpsaWJyYXJ5KHJ2ZXN0KQ0KdXJsIDwtICJodHRwczovL2V4YW1wbGUuY29tIg0KcGFnZSA8LSByZWFkX2h0bWwodXJsKQ0KZGF0YSA8LSBwYWdlICU+JSBodG1sX25vZGVzKCJoMSIpICU+JSBodG1sX3RleHQoKQ0KcHJpbnQoZGF0YSkNCmBgYA0KIyMgKiozLjIgTWVuZ2d1bmFrYW4gUGFrZXQgeG1sMioqDQoNCk1ldG9kZTogeG1sMiBhZGFsYWggcGFrZXQgdW50dWsgbWVuZ3VyYWkgZG9rdW1lbiBIVE1MIGF0YXUgWE1MLiBJbmkgbWlyaXAgZGVuZ2FuIHJ2ZXN0IHRldGFwaSBsZWJpaCBmb2t1cyBwYWRhIG1hbmlwdWxhc2kgc3RydWt0dXIgWE1ML0hUTUwuDQoNCktlZ3VuYWFuOiBDb2NvayB1bnR1ayBzY3JhcGluZyBkYXRhIGRhcmkgZG9rdW1lbiBYTUwgYXRhdSBIVE1MIGtvbXBsZWtzLg0KDQpDb250b2g6DQpgYGB7cn0NCmxpYnJhcnkoeG1sMikNCnVybCA8LSAiaHR0cHM6Ly9leGFtcGxlLmNvbSINCnBhZ2UgPC0gcmVhZF9odG1sKHVybCkNCmRhdGEgPC0geG1sX2ZpbmRfYWxsKHBhZ2UsICIvL2gxIikgJT4lIHhtbF90ZXh0KCkNCnByaW50KGRhdGEpDQpgYGANCiMgKio0LiBjb250b2ggcGVuZ2d1bmFhbiB3ZWIgc2NyYXBpbmcgZGkgUioqDQojIyAqKjQuMS4xIE1lbmdhbWJpbCBKdWR1bCBCZXJpdGEgZGFyaSBXZWIgQkJDIE5ld3MqKg0KDQpCYXlhbmdrYW4gQW5kYSBpbmdpbiBtZW5ndW1wdWxrYW4ganVkdWwtanVkdWwgYmVyaXRhIHRlcmJhcnUgZGFyaSBoYWxhbWFuIHV0YW1hIEJCQyBOZXdzLiBEZW5nYW4gYmFudHVhbiBSLCBBbmRhIGJpc2EgbWVsYWt1a2FubnlhIHNlY2FyYSBvdG9tYXRpcyBtZW5nZ3VuYWthbiB0ZWtuaWsgd2ViIHNjcmFwaW5nLiBCZXJpa3V0IGxhbmdrYWgtbGFuZ2thaG55YToNCg0KIyMjICoqNC4xLjIgUGVyc2lhcGFuKioNClBhc3Rpa2FuIEFuZGEgc3VkYWggbWVuZ2luc3RhbCBwYWtldCBydmVzdCBkaSBSLiBKaWthIGJlbHVtLCBqYWxhbmthbiBwZXJpbnRhaCBiZXJpa3V0Og0KDQpgYGB7cn0NCmluc3RhbGwucGFja2FnZXMoInJ2ZXN0IikNCmBgYA0KIyMgKio0LjEuMyBNdWxhaSBTY3JhcGluZyoqDQpCZXJpa3V0IGFkYWxhaCBrb2RlIFIgdW50dWsgbWVuZ2FtYmlsIGp1ZHVsIGJlcml0YSBkYXJpIEJCQyBOZXdzOg0KYGBge3J9DQojIExvYWQgcGFrZXQgcnZlc3QNCmxpYnJhcnkocnZlc3QpDQoNCiMgVGVudHVrYW4gVVJMIGhhbGFtYW4gQkJDIE5ld3MNCnVybCA8LSAiaHR0cHM6Ly93d3cuYmJjLmNvbS9uZXdzIg0KDQojIEJhY2EgaGFsYW1hbiB3ZWINCmhhbGFtYW5fd2ViIDwtIHJlYWRfaHRtbCh1cmwpDQoNCiMgQW1iaWwganVkdWwgYXJ0aWtlbCBtZW5nZ3VuYWthbiBzZWxlY3RvciBDU1MNCmp1ZHVsX2Jlcml0YSA8LSBoYWxhbWFuX3dlYiAlPiUNCiAgaHRtbF9ub2RlcygiLmdzLWMtcHJvbW8taGVhZGluZ19fdGl0bGUiKSAlPiUgICMgUGlsaWggZWxlbWVuIGp1ZHVsDQogIGh0bWxfdGV4dCh0cmltID0gVFJVRSkgICMgQW1iaWwgdGVrcyBkYW4gaGlsYW5na2FuIHNwYXNpIGVrc3RyYQ0KDQojIFRhbXBpbGthbiBoYXNpbA0KcHJpbnQoanVkdWxfYmVyaXRhKQ0KYGBgDQojIyAqKjQuMS40IEhhc2lsKioNClNldGVsYWggbWVuamFsYW5rYW4ga29kZSBkaSBhdGFzLCBBbmRhIGFrYW4gbWVuZGFwYXRrYW4gZGFmdGFyIGp1ZHVsIGJlcml0YSB0ZXJiYXJ1IGRhcmkgQkJDIE5ld3MsIHNlcGVydGk6DQoNClsxXSAiSnVkdWwgQmVyaXRhIDEiDQoNClsyXSAiSnVkdWwgQmVyaXRhIDIiDQoNClszXSAiSnVkdWwgQmVyaXRhIDMiDQouLi4NCg0KIyAqKlRhbnRhbmdhbiBkYW4gU29sdXNpIFdlYiBTY3JhcGluZyBkaSBSKioNCg0KV2ViIHNjcmFwaW5nIGRpIFIgYmlzYSBtZW5qYWRpIHRhbnRhbmdhbiBrYXJlbmEgYmVyYmFnYWkgZmFrdG9yIHRla25pcyBkYW4gbm9uLXRla25pcy4gQmVyaWt1dCBhZGFsYWggVGFiZWwgYmViZXJhcGEgdGFudGFuZ2FuIHVtdW0gYmVzZXJ0YSBzb2x1c2lueWE6DQoNCmBgYHtyfQ0KIyBNZW1idWF0IGRhdGEgZnJhbWUgdW50dWsgdGFiZWwNCnRhbnRhbmdhbl9zb2x1c2kgPC0gZGF0YS5mcmFtZSgNCiAgVGFudGFuZ2FuID0gYygNCiAgICAiSGFsYW1hbiBEaW5hbWlzIChKYXZhU2NyaXB0KSIsDQogICAgIlN0cnVrdHVyIEhUTUwgUnVtaXQiLA0KICAgICJQZW1ibG9raXJhbiBvbGVoIFNpdHVzIiwNCiAgICAiUGVydWJhaGFuIFN0cnVrdHVyIFdlYnNpdGUiLA0KICAgICJEYXRhIGRhbGFtIEZvcm1hdCBKU09OL0FQSSINCiAgKSwNCiAgU29sdXNpID0gYygNCiAgICAiR3VuYWthbiAqKmBSU2VsZW5pdW1gKiogdW50dWsgcmVuZGVyIGhhbGFtYW4gbGVuZ2thcC4iLA0KICAgICJQYWthaSAqKlNlbGVjdG9yR2FkZ2V0KiogYXRhdSAqKkRldmVsb3BlciBUb29scyoqIHVudHVrIGlkZW50aWZpa2FzaSBDU1MuIiwNCiAgICAiVGFtYmFoa2FuIGhlYWRlciAoc2VwZXJ0aSBgVXNlci1BZ2VudGApIGRhbiBqZWRhIHdha3R1IChgU3lzLnNsZWVwKClgKS4iLA0KICAgICJCdWF0IHNlbGVjdG9yIGZsZWtzaWJlbCBkYW4gcGFudGF1IHBlcnViYWhhbiBiZXJrYWxhLiIsDQogICAgIkd1bmFrYW4gKipgaHR0cmAqKiBkYW4gKipganNvbmxpdGVgKiogdW50dWsgbWVuZ2FtYmlsIGRhbiBtZW5ndXJhaSBKU09OLiINCiAgKQ0KKQ0KDQojIE1lbmFtcGlsa2FuIHRhYmVsDQpsaWJyYXJ5KGtuaXRyKQ0Ka2FibGUodGFudGFuZ2FuX3NvbHVzaSwgYWxpZ24gPSAibCIsIGNhcHRpb24gPSAiVGFudGFuZ2FuIGRhbiBTb2x1c2kgV2ViIFNjcmFwaW5nIGRpIFIiKQ0KYGBgDQojICoqS2VzaW1wdWxhbioqDQoNCkthbG8gbG8gcGVuZ2VuIG5ndW1wdWxpbiBkYXRhIGRhcmkgd2Vic2l0ZSBwYWtlIFIsIHJ2ZXN0IHNhbWEgeG1sMiBhZGFsYWggZHVvIGphZ29hbiB5YW5nIGJpc2EgbG8gYW5kZWxpbiEgcnZlc3QgaXR1IHNpbXBlbCBiYW5nZXQgYnVhdCBwZW11bGEsIGNvY29rIGJ1YXQgbmdhbWJpbCBkYXRhIGRhcmkgaGFsYW1hbiB3ZWIgc3RhdGlzLiBTZW1lbnRhcmEgeG1sMiBsZWJpaCBmbGVrc2liZWwgZGFuIHBvd2VyZnVsLCBiaXNhIGhhbmRsZSBzdHJ1a3R1ciBIVE1ML1hNTCB5YW5nIGxlYmloIHJpYmV0LiBQaWxpaCBydmVzdCBrYWxvIGxvIG1hdSB5YW5nIHByYWt0aXMsIGF0YXUgeG1sMiBrYWxvIGxvIGJ1dHVoIGtvbnRyb2wgbGViaWguIFlhbmcgcGFzdGksIHNlbGFsdSBjZWsga2ViaWpha2FuIHdlYnNpdGUgYmlhciBnYWsga2VuYSBtYXNhbGFoLiBKYWRpLCBzaWFwIGphZGkgZGF0YSBodW50ZXI/IEdhc2tldW4gYWphISDwn5iO8J+UpQ0KDQojICoqUkVGRVJFTlNJKioNCg0KaHR0cHM6Ly9ib29rZG93bi5vcmcvZHNjaWVuY2VsYWJzL2RhdGFfc2NpZW5jZV9wcm9ncmFtbWluZy8wNC1EYXRhX0NvbGxlY3Rpb24uaHRtbA0KDQpodHRwczovL3lvdXR1LmJlL0xiNkdpNklSLUtjDQoNCmh0dHBzOi8veW91dHUuYmUvbkJ6ck13OGhrbVk=