knitr::opts_chunk$set(echo = TRUE)
Perumahan adalah salah satu indikator utama kesejahteraan masyarakat.
Tidak cukup hanya mengetahui berapa banyak rumah yang layak huni secara
rata-rata, karena rata-rata tidak menangkap ketimpangan antar rumah
tangga. Dua wilayah bisa memiliki persentase rumah layak huni yang sama,
tetapi distribusi kualitas hunian di dalamnya bisa sangat berbeda.
Wilayah pertama mungkin relatif merata, sedangkan wilayah kedua sebagian
kecil rumah tangga memiliki hunian layak, dan mayoritas lainnya kurang
layak. Fenomena ini disebut ketimpangan kualitas hunian.
Untuk mengukur ketimpangan ini secara sistematis, digunakan
Housing Adequacy Curve (HAC), sebuah kurva yang memetakan
proporsi kumulatif rumah tangga terhadap proporsi kumulatif skor
kelayakan hunian (Housing Adequacy Score (HAS)). Dari HAC ini,
dapat dihitung Housing Adequacy Inequality Index (HAII), yaitu
satu angka yang meringkas seberapa timpang distribusi kualitas hunian.
HAII yang lebih tinggi menunjukkan distribusi hunian yang relatif
merata, sedangkan HAII yang lebih rendah menandakan ketimpangan yang
lebih besar.
Setiap rumah tangga diberikan Housing Adequacy Score (HAS),
yaitu skor yang merepresentasikan kualitas hunian secara menyeluruh.
HAS dihitung dari beberapa indikator, antara lain:
Luas lantai per kapita: mengukur kepadatan hunian (luas lantai
per kapita).
Akses air layak: akses rumah tangga terhadap air minum
layak.
Sanitasi layak: akses rumah tangga terhadap sanitasi
layak.
Material bangunan: akses rumah tangga terhadap ketahanan
bangunan.
Kepadatan rumah tangga: kecukupan luas lantai.
Seluruh indikator ini dinormalisasikan ke dalam skala 0–1 dan
dirata-ratakan untuk menghasilkan HAS per rumah tangga. Skor ini
digunakan untuk mengukur kualitas hunian dan menjadi dasar perhitungan
ketimpangan hunian.
Inequality
Nasional
Analisis dilakukan pada tingkat nasional dengan menggabungkan seluruh
rumah tangga di Indonesia. HAC nasional menunjukkan distribusi kumulatif
dari HAS seluruh rumah tangga. Kurva mendekati garis diagonal 45° jika
distribusi merata, dan semakin melengkung ke bawah, semakin timpang
distribusinya. Nilai HAII nasional memberikan gambaran ringkas mengenai
ketimpangan hunian di seluruh Indonesia. Angka ini bisa digunakan
sebagai referensi untuk membandingkan provinsi atau kabupaten/kota
dengan kondisi nasional.
hac_nasional <- data %>%
arrange(HAS) %>%
mutate(
cum_household = seq_len(n())/n(),
cum_score = cumsum(HAS)/sum(HAS)
)
ggplot(hac_nasional, aes(x = cum_household, y = cum_score)) +
geom_line(color = "#2C7FB8", size = 1.2) +
geom_abline(slope = 1, intercept = 0, linetype = "dashed", color = "red") +
labs(
title = "National Housing Adequacy Curve (HAC)",
x = "Proporsi Kumulatif Rumah Tangga",
y = "Proporsi Kumulatif Housing Adequacy Score"
) +
theme_minimal()

HAII_nasional <- compute_haii(hac_nasional)
cat("HAII Nasional:", round(HAII_nasional,3), "\n")
## HAII Nasional: 0.448
Meskipun terdapat peningkatan kualitas hunian secara agregat, nilai
Housing Adequacy Inequality Index (HAII) nasional sebesar 0,448
menunjukkan bahwa distribusi kualitas hunian di Indonesia masih berada
pada kategori ketimpangan menengah. Kondisi ini mengindikasikan bahwa
peningkatan kualitas hunian belum dinikmati secara merata oleh seluruh
rumah tangga.
Inequality
Provinsi
Untuk tingkat provinsi, rumah tangga dikelompokkan berdasarkan
wilayah. Setiap provinsi dihitung HAII dan confidence interval (CI)
menggunakan bootstrap, sehingga diketahui tidak hanya ukuran
ketimpangan, tetapi juga ketidakpastian estimasinya. Provinsi dengan
HAII tinggi menandakan bahwa distribusi hunian relatif merata, meskipun
rata-rata HAS-nya mungkin rendah. Sebaliknya, provinsi dengan HAII
rendah menandakan sebagian rumah tangga memiliki hunian baik, tetapi
mayoritas lainnya tertinggal.
print(haii_provinsi %>% select(R101, HAII, CI_low, CI_high))
## # A tibble: 38 × 4
## R101 HAII CI_low CI_high
## <dbl+lbl> <dbl> <dbl> <dbl>
## 1 11 [Aceh] 0.457 0.456 0.458
## 2 12 [Sumatera Utara] 0.449 0.448 0.450
## 3 13 [Sumatera Barat] 0.451 0.450 0.452
## 4 14 [Riau] 0.464 0.462 0.465
## 5 15 [Jambi] 0.457 0.456 0.458
## 6 16 [Sumatera Selatan] 0.451 0.450 0.452
## 7 17 [Bengkulu] 0.446 0.444 0.447
## 8 18 [Lampung] 0.452 0.450 0.453
## 9 19 [Kepulauan Bangka Belitung] 0.444 0.443 0.446
## 10 21 [Kepulauan Riau] 0.427 0.426 0.430
## # ℹ 28 more rows
Visualisasi berupa barplot memudahkan perbandingan antar provinsi,
sedangkan peta menunjukkan sebaran ketimpangan secara geografis.
Informasi ini penting untuk membantu pembuat kebijakan memprioritaskan
intervensi, misalnya program rumah layak huni atau perbaikan
infrastruktur sanitasi.
## Barplot HAII per Provinsi
ggplot(haii_provinsi, aes(x = reorder(R101, HAII), y = HAII)) +
geom_col(fill = "#2C7FB8") +
geom_errorbar(aes(ymin = CI_low, ymax = CI_high), width = 0.2) +
coord_flip() +
labs(title = "Housing Adequacy Inequality Index (HAII)",
x = "Provinsi",
y = "HAII") +
theme_minimal()

Pada tingkat provinsi, rumah tangga dikelompokkan berdasarkan
wilayah. Untuk setiap provinsi dihitung HAII beserta bootstrap 95%
confidence interval (CI), sehingga diketahui ukuran ketimpangan
sekaligus ketidakpastian estimasinya.
prov_map <- st_read("Peta_Provinsi38_shp785.shp") %>%
mutate(kdprov = as.character(kdprov))
## Reading layer `Peta_Provinsi38_shp785' from data source
## `D:\2. Pengembangan diri\1 Exercise Bagus\Housing Analysis\Peta_Provinsi38_shp785.shp'
## using driver `ESRI Shapefile'
## Simple feature collection with 38 features and 8 fields
## Geometry type: MULTIPOLYGON
## Dimension: XY
## Bounding box: xmin: 95.00971 ymin: -11.00766 xmax: 141.02 ymax: 6.076809
## Geodetic CRS: WGS 84
haii_provinsi <- haii_provinsi %>%
mutate(R101 = as.character(R101))
map_data <- prov_map %>%
left_join(haii_provinsi, by = c("kdprov" = "R101"))
ggplot(map_data) +
geom_sf(aes(fill = HAII), color = "white", size = 0.15) +
scale_fill_viridis(option = "plasma", name = "HAII", na.value = "grey90") +
labs(
title = "Housing Adequacy Inequality Index (HAII)",
subtitle = "Provinsi"
) +
theme_minimal()

Inequality
Kab/kota
print(haii_kako %>% select(KABU, HAII, CI_low, CI_high))
## # A tibble: 514 × 4
## KABU HAII CI_low CI_high
## <dbl+lbl> <dbl> <dbl> <dbl>
## 1 1101 [ 1101. SIMEULUE] 0.444 0.439 0.449
## 2 1102 [ 1102. ACEH SINGKIL] 0.439 0.435 0.443
## 3 1103 [ 1103. ACEH SELATAN] 0.458 0.455 0.462
## 4 1104 [ 1104. ACEH TENGGARA] 0.450 0.447 0.453
## 5 1105 [ 1105. ACEH TIMUR] 0.447 0.443 0.451
## 6 1106 [ 1106. ACEH TENGAH] 0.461 0.457 0.466
## 7 1107 [ 1107. ACEH BARAT] 0.473 0.469 0.476
## 8 1108 [ 1108. ACEH BESAR] 0.470 0.466 0.472
## 9 1109 [ 1109. PIDIE] 0.443 0.439 0.447
## 10 1110 [ 1110. BIREUEN] 0.463 0.460 0.467
## # ℹ 504 more rows
# Barplot HAII per Kabupaten/kota
ggplot(haii_kako, aes(x = reorder(KABU, HAII), y = HAII)) +
geom_col(fill = "#2C7FB8") +
geom_errorbar(aes(ymin = CI_low, ymax = CI_high), width = 0.2) +
coord_flip() +
labs(title = "Housing Adequacy Inequality Index (HAII)",
x = "Kabupaten/kota",
y = "HAII") +
theme_minimal()
prov_map <- st_read("PetaSHP514_38.shp") %>%
mutate(idkab = as.character(idkab))
## Reading layer `PetaSHP514_38' from data source
## `D:\2. Pengembangan diri\1 Exercise Bagus\Housing Analysis\PetaSHP514_38.shp'
## using driver `ESRI Shapefile'
## Simple feature collection with 514 features and 8 fields
## Geometry type: MULTIPOLYGON
## Dimension: XY
## Bounding box: xmin: 95.00971 ymin: -11.00766 xmax: 141.02 ymax: 6.076809
## Geodetic CRS: WGS 84
haii_kako <- haii_kako %>%
mutate(KABU = as.character(KABU))
map_data <- prov_map %>%
left_join(haii_kako, by = c("idkab" = "KABU"))
ggplot(map_data) +
geom_sf(aes(fill = HAII), color = "white", size = 0.15) +
scale_fill_viridis(option = "plasma", name = "HAII", na.value = "grey90") +
labs(
title = "Housing Adequacy Inequality Index (HAII)",
subtitle = "Kabupaten/kota"
) +
theme_minimal()

Direktorat Statistik Kesejahteraan Rakyat, BPS, saptahas@bps.go.id
LS0tDQp0aXRsZTogIktldGltcGFuZ2FuIEt1YWxpdGFzIEh1bmlhbiAyMDI1Ig0Kc3VidGl0bGU6ICJCZXJkYXNhcmthbiBkYXRhIFN1c2VuYXMgTWFyZXQgMjAyNSINCmF1dGhvcjogIlNhcHRhIEhhc3RobyBQb25jbyINCmRhdGU6ICJgciBTeXMuRGF0ZSgpYCINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICBjb2RlX2Rvd25sb2FkOiB5ZXMNCiAgICBjb2RlX2ZvbGRpbmc6IHNob3cNCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KICAgIHRoZW1lOiBqb3VybmFsDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZmxvYXQ6IHllcw0KICB3b3JkX2RvY3VtZW50Og0KICAgIHRvYzogeWVzDQotLS0NCg0KYGBgez1odG1sfQ0KPHN0eWxlPg0KYm9keXsNCnRleHQtYWxpZ246IGp1c3RpZnl9DQo8L3N0eWxlPg0KYGBgDQoNCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9VFJVRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkNCmBgYA0KDQpQZXJ1bWFoYW4gYWRhbGFoIHNhbGFoIHNhdHUgaW5kaWthdG9yIHV0YW1hIGtlc2VqYWh0ZXJhYW4gbWFzeWFyYWthdC4gVGlkYWsgY3VrdXAgaGFueWEgbWVuZ2V0YWh1aSBiZXJhcGEgYmFueWFrIHJ1bWFoIHlhbmcgbGF5YWsgaHVuaSBzZWNhcmEgcmF0YS1yYXRhLCBrYXJlbmEgcmF0YS1yYXRhIHRpZGFrIG1lbmFuZ2thcCBrZXRpbXBhbmdhbiBhbnRhciBydW1haCB0YW5nZ2EuIER1YSB3aWxheWFoIGJpc2EgbWVtaWxpa2kgcGVyc2VudGFzZSBydW1haCBsYXlhayBodW5pIHlhbmcgc2FtYSwgdGV0YXBpIGRpc3RyaWJ1c2kga3VhbGl0YXMgaHVuaWFuIGRpIGRhbGFtbnlhIGJpc2Egc2FuZ2F0IGJlcmJlZGEuIFdpbGF5YWggcGVydGFtYSBtdW5na2luIHJlbGF0aWYgbWVyYXRhLCBzZWRhbmdrYW4gd2lsYXlhaCBrZWR1YSBzZWJhZ2lhbiBrZWNpbCBydW1haCB0YW5nZ2EgbWVtaWxpa2kgaHVuaWFuIGxheWFrLCBkYW4gbWF5b3JpdGFzIGxhaW5ueWEga3VyYW5nIGxheWFrLiBGZW5vbWVuYSBpbmkgZGlzZWJ1dCBrZXRpbXBhbmdhbiBrdWFsaXRhcyBodW5pYW4uDQoNClVudHVrIG1lbmd1a3VyIGtldGltcGFuZ2FuIGluaSBzZWNhcmEgc2lzdGVtYXRpcywgZGlndW5ha2FuIF9Ib3VzaW5nIEFkZXF1YWN5IEN1cnZlXyAoSEFDKSwgc2VidWFoIGt1cnZhIHlhbmcgbWVtZXRha2FuIHByb3BvcnNpIGt1bXVsYXRpZiBydW1haCB0YW5nZ2EgdGVyaGFkYXAgcHJvcG9yc2kga3VtdWxhdGlmIHNrb3Iga2VsYXlha2FuIGh1bmlhbiAoX0hvdXNpbmcgQWRlcXVhY3kgU2NvcmVfIChIQVMpKS4gRGFyaSBIQUMgaW5pLCBkYXBhdCBkaWhpdHVuZyBfSG91c2luZyBBZGVxdWFjeSBJbmVxdWFsaXR5IEluZGV4XyAoSEFJSSksIHlhaXR1IHNhdHUgYW5na2EgeWFuZyBtZXJpbmdrYXMgc2ViZXJhcGEgdGltcGFuZyBkaXN0cmlidXNpIGt1YWxpdGFzIGh1bmlhbi4gSEFJSSB5YW5nIGxlYmloIHRpbmdnaSBtZW51bmp1a2thbiBkaXN0cmlidXNpIGh1bmlhbiB5YW5nIHJlbGF0aWYgbWVyYXRhLCBzZWRhbmdrYW4gSEFJSSB5YW5nIGxlYmloIHJlbmRhaCBtZW5hbmRha2FuIGtldGltcGFuZ2FuIHlhbmcgbGViaWggYmVzYXIuDQoNCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBlY2hvPUZBTFNFfQ0KbGlicmFyeShoYXZlbikNCmxpYnJhcnkob3Blbnhsc3gpDQpsaWJyYXJ5KGRwbHlyKSAgICANCmxpYnJhcnkocHVycnIpICAgIA0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShzZikNCmxpYnJhcnkodmlyaWRpcykNCmBgYA0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCnNldHdkKCJEOlxcMi4gUGVuZ2VtYmFuZ2FuIGRpcmlcXDEgRXhlcmNpc2UgQmFndXNcXEhvdXNpbmcgQW5hbHlzaXMiKQ0KYGBgDQoNCg0KDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgZWNobz1GQUxTRX0NCmRhdGEgPC0gcmVhZF9zYXYoIlJMSDIwMjUuc2F2IikNCmBgYA0KDQpTZXRpYXAgcnVtYWggdGFuZ2dhIGRpYmVyaWthbiBfSG91c2luZyBBZGVxdWFjeSBTY29yZV8gKEhBUyksIHlhaXR1IHNrb3IgeWFuZyBtZXJlcHJlc2VudGFzaWthbiBrdWFsaXRhcyBodW5pYW4gc2VjYXJhIG1lbnllbHVydWguIA0KDQpIQVMgZGloaXR1bmcgZGFyaSBiZWJlcmFwYSBpbmRpa2F0b3IsIGFudGFyYSBsYWluOg0KDQotIEx1YXMgbGFudGFpIHBlciBrYXBpdGE6IG1lbmd1a3VyIGtlcGFkYXRhbiBodW5pYW4gKGx1YXMgbGFudGFpIHBlciBrYXBpdGEpLg0KDQotIEFrc2VzIGFpciBsYXlhazogYWtzZXMgcnVtYWggdGFuZ2dhIHRlcmhhZGFwIGFpciBtaW51bSBsYXlhay4NCg0KLSBTYW5pdGFzaSBsYXlhazogYWtzZXMgcnVtYWggdGFuZ2dhIHRlcmhhZGFwIHNhbml0YXNpIGxheWFrLg0KDQotIE1hdGVyaWFsIGJhbmd1bmFuOiBha3NlcyBydW1haCB0YW5nZ2EgdGVyaGFkYXAga2V0YWhhbmFuIGJhbmd1bmFuLg0KDQotIEtlcGFkYXRhbiBydW1haCB0YW5nZ2E6IGtlY3VrdXBhbiBsdWFzIGxhbnRhaS4NCg0KU2VsdXJ1aCBpbmRpa2F0b3IgaW5pIGRpbm9ybWFsaXNhc2lrYW4ga2UgZGFsYW0gc2thbGEgMOKAkzEgZGFuIGRpcmF0YS1yYXRha2FuIHVudHVrIG1lbmdoYXNpbGthbiBIQVMgcGVyIHJ1bWFoIHRhbmdnYS4gU2tvciBpbmkgZGlndW5ha2FuIHVudHVrIG1lbmd1a3VyIGt1YWxpdGFzIGh1bmlhbiBkYW4gbWVuamFkaSBkYXNhciBwZXJoaXR1bmdhbiBrZXRpbXBhbmdhbiBodW5pYW4uDQoNCg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGVjaG89RkFMU0V9DQojIE1lbmdoaXR1bmcgSEFTDQpkYXRhIDwtIGRhdGEgJT4lDQogIG11dGF0ZShIQVMgPSByb3dNZWFucyhzZWxlY3QoLiwgTHVhc19jYXAsIEFfTEFZQUssIFNfTEFZQUssIER1cmFiZWwsIFJzdWZmaSksIG5hLnJtID0gVFJVRSkpDQpgYGANCg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGVjaG89RkFMU0V9DQojIEhBQyAmIEhBSUkgRnVuY3Rpb25zDQpjb21wdXRlX2hhYyA8LSBmdW5jdGlvbihzY29yZSkgew0KICAjIEhBQzogY3VtdWxhdGl2ZSBwcm9wb3J0aW9uIG9mIGhvdXNlaG9sZHMgdnMgY3VtdWxhdGl2ZSBIQVMNCiAgc2NvcmUgPC0gc29ydChzY29yZSkNCiAgbiA8LSBsZW5ndGgoc2NvcmUpDQogIGRhdGEuZnJhbWUoDQogICAgY3VtX2hvdXNlaG9sZCA9IHNlcV9sZW4obikvbiwNCiAgICBjdW1fc2NvcmUgICAgID0gY3Vtc3VtKHNjb3JlKS9zdW0oc2NvcmUpDQogICkNCn0NCg0KY29tcHV0ZV9oYWlpIDwtIGZ1bmN0aW9uKGhhY19kZikgew0KICAjIEhBSUk6IGFyZWEgdW5kZXIgSEFDDQogIHdpdGgoaGFjX2RmLA0KICAgICAgIHN1bShkaWZmKGN1bV9ob3VzZWhvbGQpICogKGhlYWQoY3VtX3Njb3JlLC0xKSt0YWlsKGN1bV9zY29yZSwtMSkpLzIpDQogICkNCn0NCmBgYA0KDQojIEluZXF1YWxpdHkgTmFzaW9uYWwNCg0KQW5hbGlzaXMgZGlsYWt1a2FuIHBhZGEgdGluZ2thdCBuYXNpb25hbCBkZW5nYW4gbWVuZ2dhYnVuZ2thbiBzZWx1cnVoIHJ1bWFoIHRhbmdnYSBkaSBJbmRvbmVzaWEuIEhBQyBuYXNpb25hbCBtZW51bmp1a2thbiBkaXN0cmlidXNpIGt1bXVsYXRpZiBkYXJpIEhBUyBzZWx1cnVoIHJ1bWFoIHRhbmdnYS4gS3VydmEgbWVuZGVrYXRpIGdhcmlzIGRpYWdvbmFsIDQ1wrAgamlrYSBkaXN0cmlidXNpIG1lcmF0YSwgZGFuIHNlbWFraW4gbWVsZW5na3VuZyBrZSBiYXdhaCwgc2VtYWtpbiB0aW1wYW5nIGRpc3RyaWJ1c2lueWEuIE5pbGFpIEhBSUkgbmFzaW9uYWwgbWVtYmVyaWthbiBnYW1iYXJhbiByaW5na2FzIG1lbmdlbmFpIGtldGltcGFuZ2FuIGh1bmlhbiBkaSBzZWx1cnVoIEluZG9uZXNpYS4gQW5na2EgaW5pIGJpc2EgZGlndW5ha2FuIHNlYmFnYWkgcmVmZXJlbnNpIHVudHVrIG1lbWJhbmRpbmdrYW4gcHJvdmluc2kgYXRhdSBrYWJ1cGF0ZW4va290YSBkZW5nYW4ga29uZGlzaSBuYXNpb25hbC4NCg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGVjaG89RkFMU0V9DQojIyBIQUlJICsgQm9vdHN0cmFwIENJDQpib290c3RyYXBfaGFpaSA8LSBmdW5jdGlvbihzY29yZSwgQiA9IDMwMCkgew0KICAjIEJvb3RzdHJhcCBIQUlJIHVudHVrIENJDQogIHJlcGxpY2F0ZShCLCBjb21wdXRlX2hhaWkoY29tcHV0ZV9oYWMoc2FtcGxlKHNjb3JlLCByZXBsYWNlID0gVFJVRSkpKSkNCn0NCmBgYA0KDQoNCmBgYHtyfQ0KaGFjX25hc2lvbmFsIDwtIGRhdGEgJT4lDQogIGFycmFuZ2UoSEFTKSAlPiUNCiAgbXV0YXRlKA0KICAgIGN1bV9ob3VzZWhvbGQgPSBzZXFfbGVuKG4oKSkvbigpLA0KICAgIGN1bV9zY29yZSAgICAgPSBjdW1zdW0oSEFTKS9zdW0oSEFTKQ0KICApDQpgYGANCiAgDQoNCmBgYHtyLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQ0KZ2dwbG90KGhhY19uYXNpb25hbCwgYWVzKHggPSBjdW1faG91c2Vob2xkLCB5ID0gY3VtX3Njb3JlKSkgKw0KICBnZW9tX2xpbmUoY29sb3IgPSAiIzJDN0ZCOCIsIHNpemUgPSAxLjIpICsNCiAgZ2VvbV9hYmxpbmUoc2xvcGUgPSAxLCBpbnRlcmNlcHQgPSAwLCBsaW5ldHlwZSA9ICJkYXNoZWQiLCBjb2xvciA9ICJyZWQiKSArDQogIGxhYnMoDQogICAgdGl0bGUgPSAiTmF0aW9uYWwgSG91c2luZyBBZGVxdWFjeSBDdXJ2ZSAoSEFDKSIsDQogICAgeCA9ICJQcm9wb3JzaSBLdW11bGF0aWYgUnVtYWggVGFuZ2dhIiwNCiAgICB5ID0gIlByb3BvcnNpIEt1bXVsYXRpZiBIb3VzaW5nIEFkZXF1YWN5IFNjb3JlIg0KICApICsNCiAgdGhlbWVfbWluaW1hbCgpDQpgYGANCg0KDQpgYGB7ciwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0NCkhBSUlfbmFzaW9uYWwgPC0gY29tcHV0ZV9oYWlpKGhhY19uYXNpb25hbCkNCmNhdCgiSEFJSSBOYXNpb25hbDoiLCByb3VuZChIQUlJX25hc2lvbmFsLDMpLCAiXG4iKQ0KYGBgDQoNCk1lc2tpcHVuIHRlcmRhcGF0IHBlbmluZ2thdGFuIGt1YWxpdGFzIGh1bmlhbiBzZWNhcmEgYWdyZWdhdCwgbmlsYWkgX0hvdXNpbmcgQWRlcXVhY3kgSW5lcXVhbGl0eSBJbmRleF8gKEhBSUkpIG5hc2lvbmFsIHNlYmVzYXIgMCw0NDggbWVudW5qdWtrYW4gYmFod2EgZGlzdHJpYnVzaSBrdWFsaXRhcyBodW5pYW4gZGkgSW5kb25lc2lhIG1hc2loIGJlcmFkYSBwYWRhIGthdGVnb3JpIGtldGltcGFuZ2FuIG1lbmVuZ2FoLiBLb25kaXNpIGluaSBtZW5naW5kaWthc2lrYW4gYmFod2EgcGVuaW5na2F0YW4ga3VhbGl0YXMgaHVuaWFuIGJlbHVtIGRpbmlrbWF0aSBzZWNhcmEgbWVyYXRhIG9sZWggc2VsdXJ1aCBydW1haCB0YW5nZ2EuDQoNCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBlY2hvPUZBTFNFfQ0Kd3JpdGUueGxzeChIQUlJX25hc2lvbmFsLCBmaWxlID0gIkhBSUlfbmFzaW9uYWwueGxzeCIsDQogICAgICAgICAgIHNoZWV0TmFtZSA9ICJIQUlJIiwgb3ZlcndyaXRlID0gVFJVRSkNCmBgYA0KDQojIEluZXF1YWxpdHkgUHJvdmluc2kNCg0KVW50dWsgdGluZ2thdCBwcm92aW5zaSwgcnVtYWggdGFuZ2dhIGRpa2Vsb21wb2trYW4gYmVyZGFzYXJrYW4gd2lsYXlhaC4gU2V0aWFwIHByb3ZpbnNpIGRpaGl0dW5nIEhBSUkgZGFuIGNvbmZpZGVuY2UgaW50ZXJ2YWwgKENJKSBtZW5nZ3VuYWthbiBib290c3RyYXAsIHNlaGluZ2dhIGRpa2V0YWh1aSB0aWRhayBoYW55YSB1a3VyYW4ga2V0aW1wYW5nYW4sIHRldGFwaSBqdWdhIGtldGlkYWtwYXN0aWFuIGVzdGltYXNpbnlhLiBQcm92aW5zaSBkZW5nYW4gSEFJSSB0aW5nZ2kgbWVuYW5kYWthbiBiYWh3YSBkaXN0cmlidXNpIGh1bmlhbiByZWxhdGlmIG1lcmF0YSwgbWVza2lwdW4gcmF0YS1yYXRhIEhBUy1ueWEgbXVuZ2tpbiByZW5kYWguIFNlYmFsaWtueWEsIHByb3ZpbnNpIGRlbmdhbiBIQUlJIHJlbmRhaCBtZW5hbmRha2FuIHNlYmFnaWFuIHJ1bWFoIHRhbmdnYSBtZW1pbGlraSBodW5pYW4gYmFpaywgdGV0YXBpIG1heW9yaXRhcyBsYWlubnlhIHRlcnRpbmdnYWwuDQoNCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBlY2hvPUZBTFNFfQ0KIyMgSEFJSSArIEJvb3RzdHJhcCBDSQ0Kc2V0LnNlZWQoMTIzKQ0KaGFpaV9wcm92aW5zaSA8LSBkYXRhICU+JQ0KICBncm91cF9ieShSMTAxKSAlPiUNCiAgc3VtbWFyaXNlKA0KICAgIEhBSUkgICAgPSBjb21wdXRlX2hhaWkoY29tcHV0ZV9oYWMoSEFTKSksDQogICAgQ0lfbG93ICA9IHF1YW50aWxlKGJvb3RzdHJhcF9oYWlpKEhBUyksIDAuMDI1KSwNCiAgICBDSV9oaWdoID0gcXVhbnRpbGUoYm9vdHN0cmFwX2hhaWkoSEFTKSwgMC45NzUpLA0KICAgIG5fcnQgICAgPSBuKCksDQogICAgLmdyb3VwcyA9ICJkcm9wIg0KICApICU+JQ0KICBhcnJhbmdlKFIxMDEpICAjIGFzY2VuZGluZyBtZW51cnV0IG5hbWEgcHJvdmluc2kNCmBgYA0KDQpgYGB7cn0NCnByaW50KGhhaWlfcHJvdmluc2kgJT4lIHNlbGVjdChSMTAxLCBIQUlJLCBDSV9sb3csIENJX2hpZ2gpKQ0KYGBgDQoNClZpc3VhbGlzYXNpIGJlcnVwYSBiYXJwbG90IG1lbXVkYWhrYW4gcGVyYmFuZGluZ2FuIGFudGFyIHByb3ZpbnNpLCBzZWRhbmdrYW4gcGV0YSBtZW51bmp1a2thbiBzZWJhcmFuIGtldGltcGFuZ2FuIHNlY2FyYSBnZW9ncmFmaXMuIEluZm9ybWFzaSBpbmkgcGVudGluZyB1bnR1ayBtZW1iYW50dSBwZW1idWF0IGtlYmlqYWthbiBtZW1wcmlvcml0YXNrYW4gaW50ZXJ2ZW5zaSwgbWlzYWxueWEgcHJvZ3JhbSBydW1haCBsYXlhayBodW5pIGF0YXUgcGVyYmFpa2FuIGluZnJhc3RydWt0dXIgc2FuaXRhc2kuDQoNCmBgYHtyfQ0KIyMgQmFycGxvdCBIQUlJIHBlciBQcm92aW5zaQ0KZ2dwbG90KGhhaWlfcHJvdmluc2ksIGFlcyh4ID0gcmVvcmRlcihSMTAxLCBIQUlJKSwgeSA9IEhBSUkpKSArDQogIGdlb21fY29sKGZpbGwgPSAiIzJDN0ZCOCIpICsNCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbiA9IENJX2xvdywgeW1heCA9IENJX2hpZ2gpLCB3aWR0aCA9IDAuMikgKw0KICBjb29yZF9mbGlwKCkgKw0KICBsYWJzKHRpdGxlID0gIkhvdXNpbmcgQWRlcXVhY3kgSW5lcXVhbGl0eSBJbmRleCAoSEFJSSkiLA0KICAgICAgIHggPSAiUHJvdmluc2kiLA0KICAgICAgIHkgPSAiSEFJSSIpICsNCiAgdGhlbWVfbWluaW1hbCgpDQpgYGANCg0KUGFkYSB0aW5na2F0IHByb3ZpbnNpLCBydW1haCB0YW5nZ2EgZGlrZWxvbXBva2thbiBiZXJkYXNhcmthbiB3aWxheWFoLiBVbnR1ayBzZXRpYXAgcHJvdmluc2kgZGloaXR1bmcgSEFJSSBiZXNlcnRhIGJvb3RzdHJhcCA5NSUgY29uZmlkZW5jZSBpbnRlcnZhbCAoQ0kpLCBzZWhpbmdnYSBkaWtldGFodWkgdWt1cmFuIGtldGltcGFuZ2FuIHNla2FsaWd1cyBrZXRpZGFrcGFzdGlhbiBlc3RpbWFzaW55YS4NCg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpwcm92X21hcCA8LSBzdF9yZWFkKCJQZXRhX1Byb3ZpbnNpMzhfc2hwNzg1LnNocCIpICU+JQ0KICBtdXRhdGUoa2Rwcm92ID0gYXMuY2hhcmFjdGVyKGtkcHJvdikpDQoNCmhhaWlfcHJvdmluc2kgPC0gaGFpaV9wcm92aW5zaSAlPiUNCiAgbXV0YXRlKFIxMDEgPSBhcy5jaGFyYWN0ZXIoUjEwMSkpDQoNCm1hcF9kYXRhIDwtIHByb3ZfbWFwICU+JQ0KICBsZWZ0X2pvaW4oaGFpaV9wcm92aW5zaSwgYnkgPSBjKCJrZHByb3YiID0gIlIxMDEiKSkNCg0KZ2dwbG90KG1hcF9kYXRhKSArDQogIGdlb21fc2YoYWVzKGZpbGwgPSBIQUlJKSwgY29sb3IgPSAid2hpdGUiLCBzaXplID0gMC4xNSkgKw0KICBzY2FsZV9maWxsX3ZpcmlkaXMob3B0aW9uID0gInBsYXNtYSIsIG5hbWUgPSAiSEFJSSIsIG5hLnZhbHVlID0gImdyZXk5MCIpICsNCiAgbGFicygNCiAgICB0aXRsZSA9ICJIb3VzaW5nIEFkZXF1YWN5IEluZXF1YWxpdHkgSW5kZXggKEhBSUkpIiwNCiAgICBzdWJ0aXRsZSA9ICJQcm92aW5zaSINCiAgKSArDQogIHRoZW1lX21pbmltYWwoKQ0KYGBgDQoNCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBlY2hvPUZBTFNFfQ0Kd3JpdGUueGxzeChoYWlpX3Byb3ZpbnNpLCBmaWxlID0gIkhBSUlfcGVyX3Byb3ZpbnNpLnhsc3giLA0KICAgICAgICAgICBzaGVldE5hbWUgPSAiSEFJSSIsIG92ZXJ3cml0ZSA9IFRSVUUpDQpgYGANCg0KIyBJbmVxdWFsaXR5IEthYi9rb3RhDQoNCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBlY2hvPUZBTFNFfQ0KIyMgSEFJSSArIEJvb3RzdHJhcCBDSQ0Kc2V0LnNlZWQoMTIzKQ0KaGFpaV9rYWtvIDwtIGRhdGEgJT4lDQogIGdyb3VwX2J5KEtBQlUpICU+JQ0KICBzdW1tYXJpc2UoDQogICAgSEFJSSAgICA9IGNvbXB1dGVfaGFpaShjb21wdXRlX2hhYyhIQVMpKSwNCiAgICBDSV9sb3cgID0gcXVhbnRpbGUoYm9vdHN0cmFwX2hhaWkoSEFTKSwgMC4wMjUpLA0KICAgIENJX2hpZ2ggPSBxdWFudGlsZShib290c3RyYXBfaGFpaShIQVMpLCAwLjk3NSksDQogICAgbl9ydCAgICA9IG4oKSwNCiAgICAuZ3JvdXBzID0gImRyb3AiDQogICkgJT4lDQogIGFycmFuZ2UoS0FCVSkNCmBgYA0KDQpgYGB7cn0NCnByaW50KGhhaWlfa2FrbyAlPiUgc2VsZWN0KEtBQlUsIEhBSUksIENJX2xvdywgQ0lfaGlnaCkpDQpgYGANCg0KDQpgYGB7ciwgZXZhbD1GQUxTRX0NCiMgQmFycGxvdCBIQUlJIHBlciBLYWJ1cGF0ZW4va290YQ0KZ2dwbG90KGhhaWlfa2FrbywgYWVzKHggPSByZW9yZGVyKEtBQlUsIEhBSUkpLCB5ID0gSEFJSSkpICsNCiAgZ2VvbV9jb2woZmlsbCA9ICIjMkM3RkI4IikgKw0KICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluID0gQ0lfbG93LCB5bWF4ID0gQ0lfaGlnaCksIHdpZHRoID0gMC4yKSArDQogIGNvb3JkX2ZsaXAoKSArDQogIGxhYnModGl0bGUgPSAiSG91c2luZyBBZGVxdWFjeSBJbmVxdWFsaXR5IEluZGV4IChIQUlJKSIsDQogICAgICAgeCA9ICJLYWJ1cGF0ZW4va290YSIsDQogICAgICAgeSA9ICJIQUlJIikgKw0KICB0aGVtZV9taW5pbWFsKCkNCmBgYA0KDQoNCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KcHJvdl9tYXAgPC0gc3RfcmVhZCgiUGV0YVNIUDUxNF8zOC5zaHAiKSAlPiUNCiAgbXV0YXRlKGlka2FiID0gYXMuY2hhcmFjdGVyKGlka2FiKSkNCg0KaGFpaV9rYWtvIDwtIGhhaWlfa2FrbyAlPiUNCiAgbXV0YXRlKEtBQlUgPSBhcy5jaGFyYWN0ZXIoS0FCVSkpDQoNCm1hcF9kYXRhIDwtIHByb3ZfbWFwICU+JQ0KICBsZWZ0X2pvaW4oaGFpaV9rYWtvLCBieSA9IGMoImlka2FiIiA9ICJLQUJVIikpDQoNCmdncGxvdChtYXBfZGF0YSkgKw0KICBnZW9tX3NmKGFlcyhmaWxsID0gSEFJSSksIGNvbG9yID0gIndoaXRlIiwgc2l6ZSA9IDAuMTUpICsNCiAgc2NhbGVfZmlsbF92aXJpZGlzKG9wdGlvbiA9ICJwbGFzbWEiLCBuYW1lID0gIkhBSUkiLCBuYS52YWx1ZSA9ICJncmV5OTAiKSArDQogIGxhYnMoDQogICAgdGl0bGUgPSAiSG91c2luZyBBZGVxdWFjeSBJbmVxdWFsaXR5IEluZGV4IChIQUlJKSIsDQogICAgc3VidGl0bGUgPSAiS2FidXBhdGVuL2tvdGEiDQogICkgKw0KICB0aGVtZV9taW5pbWFsKCkNCmBgYA0KDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgZWNobz1GQUxTRX0NCndyaXRlLnhsc3goaGFpaV9rYWtvLCBmaWxlID0gIkhBSUlfcGVyX2tha28ueGxzeCIsDQogICAgICAgICAgIHNoZWV0TmFtZSA9ICJIQUlJIiwgb3ZlcndyaXRlID0gVFJVRSkNCmBgYA0KDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KPiBEaXJla3RvcmF0IFN0YXRpc3RpayBLZXNlamFodGVyYWFuIFJha3lhdCwgQlBTLCBzYXB0YWhhc0BicHMuZ28uaWQNCg0KDQoNCg0K