Severe Housing Cost Burden (SHCB) merupakan indikator lanjutan dari Housing Cost Burden yang menggambarkan kondisi rumah tangga yang menghadapi tekanan biaya perumahan yang sangat tinggi. Secara umum, SHCB didefinisikan sebagai situasi ketika rumah tangga mengalokasikan 50 persen atau lebih dari total pengeluaran atau pendapatannya untuk biaya perumahan. Ambang batas ini digunakan secara luas dalam studi perumahan karena mencerminkan tingkat keterjangkauan yang sangat rendah dan risiko ekonomi yang signifikan (Joint Center for Housing Studies of Harvard University, 2023; HUD, 2022).

Rumah tangga yang mengalami SHCB cenderung berada dalam kondisi kerentanan yang lebih serius dibandingkan rumah tangga dengan housing cost burden moderat. Berbagai penelitian menunjukkan bahwa beban biaya perumahan yang sangat tinggi berkorelasi dengan penurunan konsumsi pangan dan kesehatan, meningkatnya risiko kemiskinan, serta keterbatasan kemampuan rumah tangga dalam menghadapi guncangan ekonomi (Stone, 2006; Kutty, 2005).

Dalam konteks analisis wilayah, prevalensi SHCB sering kali menunjukkan ketimpangan struktural antarwilayah, terutama antara daerah perkotaan dan perdesaan, serta wilayah dengan tekanan pasar perumahan yang tinggi. Oleh karena itu, pemetaan SHCB hingga tingkat kabupaten/kota menjadi penting untuk mengidentifikasi kantong kerentanan perumahan dan mendukung perumusan kebijakan perumahan yang lebih terarah dan berbasis bukti empiris (World Bank, 2019).

Penggunaan data survei rumah tangga seperti Survei Sosial Ekonomi Nasional (Susenas) memungkinkan pengukuran SHCB secara konsisten dan representatif, karena mencakup komponen pengeluaran perumahan serta karakteristik sosial ekonomi rumah tangga. Analisis berbasis survei berdesain kompleks ini memberikan dasar yang kuat dalam mengevaluasi keterjangkauan perumahan dan kualitas kesejahteraan rumah tangga di Indonesia.

knitr::opts_chunk$set(echo = TRUE)

Data yang digunakan adalah Susenas Maret 2025.

dataku <- read_sav("BLOK43_2025.sav") %>%
  clean_names()

1 Definisi SHCB

Severe Housing Cost Burden (SHCB) adalah kondisi ketika rumah tangga mengalokasikan lebih dari 50 persen pendapatan bulanannya untuk biaya perumahan, termasuk sewa atau cicilan rumah serta biaya utilitas utama. Rumah tangga yang mengalami SHCB berada dalam situasi kerentanan ekonomi yang tinggi karena proporsi pengeluaran perumahan yang sangat besar membatasi kemampuan mereka untuk memenuhi kebutuhan dasar lainnya, seperti pangan, kesehatan, dan pendidikan. Indikator SHCB banyak digunakan dalam analisis keterjangkauan perumahan karena mencerminkan tekanan ekonomi yang ekstrem serta risiko ketidakstabilan hunian, kemiskinan, dan eksklusi sosial.

Dalam analisis ini, pengeluaran perumahan mencakup biaya sewa aktual maupun imputasi sewa rumah milik sendiri, utilitas dasar (listrik dan air), dan energi bahan bakar untuk memasak. Pendekatan agregatif ini sejalan dengan praktik pengukuran pengeluaran perumahan dalam survei rumah tangga nasional dan internasional.

dataku <- dataku %>%
  mutate(kabu = r101*100 + r102) %>%
  rename(prov="r101", kab="r102") %>%
  mutate(denom=100) %>%
  mutate(
    exp_housing = rowSums(across(
      c(sebulan_228, sebulan_229, sebulan_230, sebulan_231,
        sebulan_234, sebulan_236,
        sebulan_253, sebulan_255, sebulan_257,
        sebulan_259, sebulan_260, sebulan_261),
      ~replace_na(., 0)
    )),
    AMBANG = (exp_housing / expend) * 100,
    SHCB = if_else(AMBANG > 50, 100, 0)
  )

2 Set Design Sampling

Design sampling yang digunakan mengikuti design sampling yang dilakukan pada SPSS yaitu Cluster Sampling design with replacement.

susenas.design<- svydesign(id=~psu, strata=~strata, data = dataku, weights=~fwt)
susenas.design
## Stratified 1 - level Cluster Sampling design (with replacement)
## With (34473) clusters.
## svydesign(id = ~psu, strata = ~strata, data = dataku, weights = ~fwt)
summary(susenas.design$prob)
##     Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
## 0.000201 0.003795 0.008842 0.029646 0.025600 0.968267

3 Set Output Statistics

Kualitas presisi hasil estimasi suatu survei bisa diamati dari nilai RSE yang dihasilkan. Kesalahan sampling dari beberapa estimasi harus digunakan secara hati-hati. Untuk estimasi yang berdasarkan jumlah kasus yang kecil, kesalahan relatif cenderung besar.

Batasan nilai RSE ( Australian Bureau Statistics):

  1. Jika \(RSE \le 25\%\), estimasi bersifat presisi.

  2. Jika \(25\% < RSE \le 50\%\), estimasi perlu dilakukan dengan hati-hati.

  3. Jika \(RSE > 50\%\), estimasi dianggap sangat tidak presisi.

Provinsi

options(survey.adjust.domain.lonely=TRUE)
options(survey.lonely.psu="adjust")
hasilP = svyby(formula = ~SHCB, denom= ~denom, ~prov, design = susenas.design, data = dataku, deff=TRUE, svyratio, vartype=c("se","ci","ci","cv","cvpct","var"))
hasilP[is.na(hasilP)] <- 0
hasilP$theta = round(hasilP$`SHCB/denom`*100,2)
hasilP$SE = round(hasilP$`se.SHCB/denom`*100,2)
hasilP$VAR = round(hasilP$SE*hasilP$SE,2)
hasilP$CI_LOWER = round(hasilP$`ci_l`*100,2)
hasilP$CI_LOWER[hasilP$CI_LOWER<0] <- 0
hasilP$CI_UPPER = round(hasilP$`ci_u`*100,2)
hasilP$RSE = round(hasilP$`cv%`,2)
hasilP$DEFF = round(hasilP$DEff,2)

Kabupaten/kota

options(survey.adjust.domain.lonely=TRUE)
options(survey.lonely.psu="adjust")
hasil = svyby(formula = ~SHCB, denom= ~denom, ~kabu, design = susenas.design, data = dataku, deff=TRUE, svyratio, vartype=c("se","ci","ci","cv","cvpct","var"))
hasil[is.na(hasil)] <- 0
hasil$theta = round(hasil$`SHCB/denom`*100,2)
hasil$SE = round(hasil$`se.SHCB/denom`*100,2)
hasil$VAR = round(hasil$SE*hasil$SE,2)
hasil$CI_LOWER = round(hasil$`ci_l`*100,2)
hasil$CI_LOWER[hasil$CI_LOWER<0] <- 0
hasil$CI_UPPER = round(hasil$`ci_u`*100,2)
hasil$RSE = round(hasil$`cv%`,2)
hasil$DEFF = round(hasil$DEff,2)

4 Level Estimate

4.1 Estimation by province

outputP = as.data.frame(cbind(hasilP$prov, hasilP$theta, hasilP$SE, hasilP$VAR, hasilP$CI_LOWER, hasilP$CI_UPPER, hasilP$RSE, hasilP$DEFF))
names(outputP) = c("Prov","Estimasi","SE","VAR","CI LOWER","CI UPPER","RSE","DEFF")
(outputP[order(outputP$Prov, decreasing = FALSE), ]   )
##    Prov Estimasi   SE  VAR CI LOWER CI UPPER   RSE  DEFF
## 1    11     0.05 0.03 0.00     0.00     0.11 48.08  1.74
## 2    12     0.08 0.03 0.00     0.02     0.14 40.11  2.66
## 3    13     0.08 0.03 0.00     0.02     0.15 41.35  1.68
## 4    14     0.10 0.04 0.00     0.02     0.17 41.23  1.40
## 5    15     0.05 0.02 0.00     0.01     0.08 35.95  0.45
## 6    16     0.10 0.05 0.00     0.00     0.20 51.52  3.11
## 7    17     0.15 0.08 0.01     0.00     0.31 55.14  2.73
## 8    18     0.05 0.02 0.00     0.00     0.10 49.19  1.31
## 9    19     0.29 0.13 0.02     0.05     0.54 42.78  2.31
## 10   21     0.11 0.07 0.00     0.00     0.23 61.71  1.69
## 11   31     1.91 0.27 0.07     1.39     2.43 13.94  1.93
## 12   32     0.41 0.06 0.00     0.29     0.53 15.08  2.30
## 13   33     0.31 0.05 0.00     0.22     0.40 15.47  2.18
## 14   34     1.17 0.22 0.05     0.74     1.60 18.86  1.67
## 15   35     0.32 0.04 0.00     0.25     0.39 11.39  1.30
## 16   36     0.37 0.13 0.02     0.11     0.63 36.48  3.49
## 17   51     0.60 0.12 0.01     0.36     0.83 20.18  1.54
## 18   52     0.17 0.08 0.01     0.02     0.32 45.30  2.47
## 19   53     0.36 0.07 0.00     0.22     0.50 20.28  1.95
## 20   61     0.18 0.09 0.01     0.00     0.35 49.75  4.13
## 21   62     0.18 0.07 0.00     0.05     0.32 36.75  2.08
## 22   63     0.31 0.09 0.01     0.14     0.48 27.78  2.10
## 23   64     0.48 0.11 0.01     0.26     0.69 22.84  1.63
## 24   65     1.01 0.33 0.11     0.37     1.65 32.54  2.90
## 25   71     0.33 0.09 0.01     0.16     0.51 27.06  2.11
## 26   72     0.52 0.10 0.01     0.31     0.72 19.87  1.61
## 27   73     0.93 0.23 0.05     0.47     1.39 25.10  9.43
## 28   74     0.67 0.13 0.02     0.41     0.93 19.74  2.47
## 29   75     0.55 0.14 0.02     0.29     0.82 24.77  1.23
## 30   76     0.24 0.09 0.01     0.07     0.42 36.92  1.19
## 31   81     0.58 0.14 0.02     0.30     0.86 24.46  2.14
## 32   82     0.90 0.26 0.07     0.39     1.40 28.79  3.95
## 33   91     1.04 0.24 0.06     0.58     1.50 22.54  1.83
## 34   92     1.01 0.29 0.08     0.45     1.58 28.49  2.45
## 35   94     2.59 0.77 0.59     1.08     4.10 29.71 10.43
## 36   95     0.59 0.26 0.07     0.08     1.10 44.41  2.41
## 37   96     0.52 0.18 0.03     0.16     0.87 35.08  2.80
## 38   97     1.08 0.56 0.31     0.00     2.17 52.18 12.30

Kelompok RSE Provinsi

hasilP <- hasilP %>%
  mutate(
    RSE = if_else(RSE == 0, NA_real_, RSE)
  ) %>%
  arrange(RSE) %>%
  mutate(
    Urut = row_number(),
    RSEP_kat = case_when(
      is.na(RSE)                 ~ NA_character_,
      RSE < 25.99                ~ "< 25%",
      RSE <= 50.99               ~ "26–50%",
      RSE > 50                   ~ "> 50%"
    )
  )

table(hasilP$RSEP_kat, useNA = "ifany")
## 
##  < 25%  > 50% 26–50% 
##     14      4     20

Visualisasi Provinsi

ggplot(hasilP, aes(x = Urut, y = RSE, group = 1, color = RSEP_kat)) +
  geom_point(size = 3) +
  
  geom_hline(yintercept = 25, linetype = "dashed", color = "red") +
  geom_hline(yintercept = 50, linetype = "dashed", color = "blue") +
  
scale_color_manual(
  name = "Kategori RSE",
  limits = c("< 25%", "26–50%", "> 50%"),
  values = c(
    "< 25%"  = "#1B9E77",
    "26–50%" = "#FF8C00",
    "> 50%"  = "#7570B3"
  ),
  na.value = "#D73027",
  drop = FALSE
) +
    labs(
    title = "RSE SHCB per Provinsi",
    subtitle = "dengan garis batas RSE 25% dan 50%",
    x = "Provinsi",
    y = "Nilai RSE (%)"
  ) +
  
  theme_minimal(base_size = 13) +
  theme(
    plot.title = element_text(face = "bold", size = 15),
    legend.position = "bottom",
    axis.text.x = element_text(angle = 40, vjust = 1, hjust = 1)
  )

4.2 Estimation by district

output = as.data.frame(cbind(hasil$kabu, hasil$theta, hasil$SE, hasil$VAR, hasil$CI_LOWER, hasil$CI_UPPER, hasil$RSE, hasil$DEFF))
names(output) = c("Kako","Estimasi","SE","VAR","CI LOWER","CI UPPER","RSE","DEFF")
head((output[order(output$Kako, decreasing = FALSE), ]   ))
##   Kako Estimasi   SE  VAR CI LOWER CI UPPER    RSE DEFF
## 1 1101     0.00 0.00 0.00        0     0.00   0.00 0.00
## 2 1102     0.05 0.05 0.00        0     0.14  99.53 0.24
## 3 1103     0.00 0.00 0.00        0     0.00   0.00 0.00
## 4 1104     0.46 0.46 0.21        0     1.36  99.00 2.81
## 5 1105     0.03 0.03 0.00        0     0.09 100.23 0.22
## 6 1106     0.00 0.00 0.00        0     0.00   0.00 0.00

Kelompok RSE Kabupaten/kota

hasil <- hasil %>%
  mutate(
    RSE = if_else(RSE == 0, NA_real_, RSE)
  ) %>%
  arrange(RSE) %>%
  mutate(
    Urut = row_number(),
    RSE_kat = case_when(
      is.na(RSE)                 ~ NA_character_,
      RSE < 25.99                ~ "< 25%",
      RSE <= 50.99               ~ "26–50%",
      RSE > 50                   ~ "> 50%"
    )
  )

table(hasil$RSE_kat, useNA = "ifany")
## 
##  < 25%  > 50% 26–50%   <NA> 
##      3    307     74    130
ggplot(hasil, aes(x = Urut, y = RSE, color = RSE_kat)) +
  geom_jitter(width = 0.35, height = 0, size = 1.8, alpha = 0.85) +

  geom_hline(yintercept = 25, linetype = "dashed", color = "red") +
  geom_hline(yintercept = 50, linetype = "dashed", color = "blue") +

scale_color_manual(
  name = "Kategori RSE",
  limits = c("< 25%", "26–50%", "> 50%"),
  values = c(
    "< 25%"  = "#1B9E77",
    "26–50%" = "#FF8C00",
    "> 50%"  = "#7570B3"
  ),
  na.value = "#D73027",
  drop = FALSE
) +

  labs(
    title = "RSE SHCB per Kabupaten/kota",
    subtitle = "dengan garis batas RSE 25% dan 50%",
    x = "Urutan Kabupaten/Kota",
    y = "Nilai RSE (%)"
  ) +

  theme_minimal(base_size = 13) +
  theme(
    plot.title = element_text(face = "bold", size = 15),
    legend.position = "bottom"
  )
## Warning: Removed 130 rows containing missing values or values outside the scale range
## (`geom_point()`).

write.xlsx(outputP,"SHCB 2025_Prov.xlsx")
write.xlsx(output,"SHCB 2025_Kako.xlsx")

5 Peta

library(sf)
petaku <- st_read("PetaSHP514_38.shp")
## 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
petaku <- petaku %>%
  mutate(idkab = as.character(idkab))
hasil <- hasil %>%
  mutate(kabu = as.character(kabu))
names(petaku)
## [1] "fid"      "idkab"    "nmprov"   "nmkab"    "kdprov"   "kdkab"    "sumber"  
## [8] "periode"  "geometry"
kab_map <- petaku %>%
  left_join(
    hasil %>% select(kabu, RSE, RSE_kat),
    by = c("idkab" = "kabu")
  )

kab_map$RSE_kat <- factor(
  kab_map$RSE_kat,
  levels = c("< 25%", "26–50%", "> 50%")
)
ggplot(kab_map) +
  geom_sf(aes(fill = RSE_kat), color = "white", size = 0.1) +
  scale_fill_manual(
    values = c(
      "< 25%"   = "#1a9850",  # sangat baik
      "26–50%"  = "#fee08b",  # hati-hati
      "> 50%"   = "#d73027"   # tidak reliabel
    ),
    na.value = "darkblue",
    drop = FALSE
  ) +
  labs(
    title = "RSE SHCB per Kabupaten/kota",
    fill  = "Kategori RSE"
  ) +
  theme_minimal()

6 References

[1] Joint Center for Housing Studies of Harvard University. (2023). The state of the nation’s housing 2023. Cambridge, MA: Harvard University.

[2] Kutty, N. K. (2005). A new measure of housing affordability: Estimates and analytical results. Housing Policy Debate, 16(1), 113–142.

[3] Stone, M. E. (2006). What is housing affordability? The case for the residual income approach. Housing Policy Debate, 17(1), 151–184. https://doi.org/10.1080/10511482.2006.9521564

[4] U.S. Department of Housing and Urban Development (HUD). (2022). Affordable housing. Washington, DC: HUD.

[5] World Bank. (2019). Indonesia affordable housing: Policy and institutional assessment. Washington, DC: World Bank.


Direktorat Statistik Kesejahteraan Rakyat, BPS,

LS0tDQp0aXRsZTogIlNldmVyZSBIb3VzaW5nIENvc3QgQnVyZGVuIChTSENCKSAyMDI1Ig0KYXV0aG9yOiAiU2FwdGEgSGFzdGhvIFBvbmNvIg0KZGF0ZTogImByIFN5cy5EYXRlKClgIg0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50Og0KICAgIGNvZGVfZG93bmxvYWQ6IHllcw0KICAgIGNvZGVfZm9sZGluZzogc2hvdw0KICAgIG51bWJlcl9zZWN0aW9uczogeWVzDQogICAgdGhlbWU6IGpvdXJuYWwNCiAgICB0b2M6IHllcw0KICAgIHRvY19mbG9hdDogeWVzDQogIHdvcmRfZG9jdW1lbnQ6DQogICAgdG9jOiB5ZXMNCi0tLQ0KDQpgYGB7PWh0bWx9DQo8c3R5bGU+DQpib2R5ew0KdGV4dC1hbGlnbjoganVzdGlmeX0NCjwvc3R5bGU+DQpgYGANCg0KX1NldmVyZSBIb3VzaW5nIENvc3QgQnVyZGVuXyAoU0hDQikgbWVydXBha2FuIGluZGlrYXRvciBsYW5qdXRhbiBkYXJpIF9Ib3VzaW5nIENvc3QgQnVyZGVuXyB5YW5nIG1lbmdnYW1iYXJrYW4ga29uZGlzaSBydW1haCB0YW5nZ2EgeWFuZyBtZW5naGFkYXBpIHRla2FuYW4gYmlheWEgcGVydW1haGFuIHlhbmcgc2FuZ2F0IHRpbmdnaS4gU2VjYXJhIHVtdW0sIFNIQ0IgZGlkZWZpbmlzaWthbiBzZWJhZ2FpIHNpdHVhc2kga2V0aWthIHJ1bWFoIHRhbmdnYSBtZW5nYWxva2FzaWthbiA1MCBwZXJzZW4gYXRhdSBsZWJpaCBkYXJpIHRvdGFsIHBlbmdlbHVhcmFuIGF0YXUgcGVuZGFwYXRhbm55YSB1bnR1ayBiaWF5YSBwZXJ1bWFoYW4uIEFtYmFuZyBiYXRhcyBpbmkgZGlndW5ha2FuIHNlY2FyYSBsdWFzIGRhbGFtIHN0dWRpIHBlcnVtYWhhbiBrYXJlbmEgbWVuY2VybWlua2FuIHRpbmdrYXQga2V0ZXJqYW5na2F1YW4geWFuZyBzYW5nYXQgcmVuZGFoIGRhbiByaXNpa28gZWtvbm9taSB5YW5nIHNpZ25pZmlrYW4gKEpvaW50IENlbnRlciBmb3IgSG91c2luZyBTdHVkaWVzIG9mIEhhcnZhcmQgVW5pdmVyc2l0eSwgMjAyMzsgSFVELCAyMDIyKS4NCg0KUnVtYWggdGFuZ2dhIHlhbmcgbWVuZ2FsYW1pIFNIQ0IgY2VuZGVydW5nIGJlcmFkYSBkYWxhbSBrb25kaXNpIGtlcmVudGFuYW4geWFuZyBsZWJpaCBzZXJpdXMgZGliYW5kaW5na2FuIHJ1bWFoIHRhbmdnYSBkZW5nYW4gX2hvdXNpbmcgY29zdCBidXJkZW5fIG1vZGVyYXQuIEJlcmJhZ2FpIHBlbmVsaXRpYW4gbWVudW5qdWtrYW4gYmFod2EgYmViYW4gYmlheWEgcGVydW1haGFuIHlhbmcgc2FuZ2F0IHRpbmdnaSBiZXJrb3JlbGFzaSBkZW5nYW4gcGVudXJ1bmFuIGtvbnN1bXNpIHBhbmdhbiBkYW4ga2VzZWhhdGFuLCBtZW5pbmdrYXRueWEgcmlzaWtvIGtlbWlza2luYW4sIHNlcnRhIGtldGVyYmF0YXNhbiBrZW1hbXB1YW4gcnVtYWggdGFuZ2dhIGRhbGFtIG1lbmdoYWRhcGkgZ3VuY2FuZ2FuIGVrb25vbWkgKFN0b25lLCAyMDA2OyBLdXR0eSwgMjAwNSkuDQoNCkRhbGFtIGtvbnRla3MgYW5hbGlzaXMgd2lsYXlhaCwgcHJldmFsZW5zaSBTSENCIHNlcmluZyBrYWxpIG1lbnVuanVra2FuIGtldGltcGFuZ2FuIHN0cnVrdHVyYWwgYW50YXJ3aWxheWFoLCB0ZXJ1dGFtYSBhbnRhcmEgZGFlcmFoIHBlcmtvdGFhbiBkYW4gcGVyZGVzYWFuLCBzZXJ0YSB3aWxheWFoIGRlbmdhbiB0ZWthbmFuIHBhc2FyIHBlcnVtYWhhbiB5YW5nIHRpbmdnaS4gT2xlaCBrYXJlbmEgaXR1LCBwZW1ldGFhbiBTSENCIGhpbmdnYSB0aW5na2F0IGthYnVwYXRlbi9rb3RhIG1lbmphZGkgcGVudGluZyB1bnR1ayBtZW5naWRlbnRpZmlrYXNpIGthbnRvbmcga2VyZW50YW5hbiBwZXJ1bWFoYW4gZGFuIG1lbmR1a3VuZyBwZXJ1bXVzYW4ga2ViaWpha2FuIHBlcnVtYWhhbiB5YW5nIGxlYmloIHRlcmFyYWggZGFuIGJlcmJhc2lzIGJ1a3RpIGVtcGlyaXMgKFdvcmxkIEJhbmssIDIwMTkpLg0KDQpQZW5nZ3VuYWFuIGRhdGEgc3VydmVpIHJ1bWFoIHRhbmdnYSBzZXBlcnRpIFN1cnZlaSBTb3NpYWwgRWtvbm9taSBOYXNpb25hbCAoU3VzZW5hcykgbWVtdW5na2lua2FuIHBlbmd1a3VyYW4gU0hDQiBzZWNhcmEga29uc2lzdGVuIGRhbiByZXByZXNlbnRhdGlmLCBrYXJlbmEgbWVuY2FrdXAga29tcG9uZW4gcGVuZ2VsdWFyYW4gcGVydW1haGFuIHNlcnRhIGthcmFrdGVyaXN0aWsgc29zaWFsIGVrb25vbWkgcnVtYWggdGFuZ2dhLiBBbmFsaXNpcyBiZXJiYXNpcyBzdXJ2ZWkgYmVyZGVzYWluIGtvbXBsZWtzIGluaSBtZW1iZXJpa2FuIGRhc2FyIHlhbmcga3VhdCBkYWxhbSBtZW5nZXZhbHVhc2kga2V0ZXJqYW5na2F1YW4gcGVydW1haGFuIGRhbiBrdWFsaXRhcyBrZXNlamFodGVyYWFuIHJ1bWFoIHRhbmdnYSBkaSBJbmRvbmVzaWEuDQoNCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9VFJVRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkNCmBgYA0KDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgZWNobz1GQUxTRX0NCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShzdXJ2ZXkpDQpsaWJyYXJ5KGphbml0b3IpDQpsaWJyYXJ5KHNjYWxlcykNCmxpYnJhcnkoaGF2ZW4pDQpsaWJyYXJ5KG9wZW54bHN4KQ0KbGlicmFyeShzZikNCmxpYnJhcnkodmlyaWRpcykNCmBgYA0KDQpgYGB7ciwgZWNobz1GQUxTRX0NCnNldHdkKCJEOlxcMi4gUGVuZ2VtYmFuZ2FuIGRpcmlcXDEgRXhlcmNpc2UgQmFndXNcXEhvdXNpbmcgQW5hbHlzaXMiKQ0KYGBgDQoNCkRhdGEgeWFuZyBkaWd1bmFrYW4gYWRhbGFoIFN1c2VuYXMgTWFyZXQgMjAyNS4NCg0KYGBge3J9DQpkYXRha3UgPC0gcmVhZF9zYXYoIkJMT0s0M18yMDI1LnNhdiIpICU+JQ0KICBjbGVhbl9uYW1lcygpDQpgYGANCg0KIyBEZWZpbmlzaSBTSENCDQoNCl9TZXZlcmUgSG91c2luZyBDb3N0IEJ1cmRlbl8gKFNIQ0IpIGFkYWxhaCBrb25kaXNpIGtldGlrYSBydW1haCB0YW5nZ2EgbWVuZ2Fsb2thc2lrYW4gbGViaWggZGFyaSA1MCBwZXJzZW4gcGVuZGFwYXRhbiBidWxhbmFubnlhIHVudHVrIGJpYXlhIHBlcnVtYWhhbiwgdGVybWFzdWsgc2V3YSBhdGF1IGNpY2lsYW4gcnVtYWggc2VydGEgYmlheWEgdXRpbGl0YXMgdXRhbWEuIFJ1bWFoIHRhbmdnYSB5YW5nIG1lbmdhbGFtaSBTSENCIGJlcmFkYSBkYWxhbSBzaXR1YXNpIGtlcmVudGFuYW4gZWtvbm9taSB5YW5nIHRpbmdnaSBrYXJlbmEgcHJvcG9yc2kgcGVuZ2VsdWFyYW4gcGVydW1haGFuIHlhbmcgc2FuZ2F0IGJlc2FyIG1lbWJhdGFzaSBrZW1hbXB1YW4gbWVyZWthIHVudHVrIG1lbWVudWhpIGtlYnV0dWhhbiBkYXNhciBsYWlubnlhLCBzZXBlcnRpIHBhbmdhbiwga2VzZWhhdGFuLCBkYW4gcGVuZGlkaWthbi4gSW5kaWthdG9yIFNIQ0IgYmFueWFrIGRpZ3VuYWthbiBkYWxhbSBhbmFsaXNpcyBrZXRlcmphbmdrYXVhbiBwZXJ1bWFoYW4ga2FyZW5hIG1lbmNlcm1pbmthbiB0ZWthbmFuIGVrb25vbWkgeWFuZyBla3N0cmVtIHNlcnRhIHJpc2lrbyBrZXRpZGFrc3RhYmlsYW4gaHVuaWFuLCBrZW1pc2tpbmFuLCBkYW4gZWtza2x1c2kgc29zaWFsLg0KDQpEYWxhbSBhbmFsaXNpcyBpbmksIHBlbmdlbHVhcmFuIHBlcnVtYWhhbiBtZW5jYWt1cCBiaWF5YSBzZXdhIGFrdHVhbCBtYXVwdW4gaW1wdXRhc2kgc2V3YSBydW1haCBtaWxpayBzZW5kaXJpLCB1dGlsaXRhcyBkYXNhciAobGlzdHJpayBkYW4gYWlyKSwgZGFuIGVuZXJnaSBiYWhhbiBiYWthciB1bnR1ayBtZW1hc2FrLiBQZW5kZWthdGFuIGFncmVnYXRpZiBpbmkgc2VqYWxhbiBkZW5nYW4gcHJha3RpayBwZW5ndWt1cmFuIHBlbmdlbHVhcmFuIHBlcnVtYWhhbiBkYWxhbSBzdXJ2ZWkgcnVtYWggdGFuZ2dhIG5hc2lvbmFsIGRhbiBpbnRlcm5hc2lvbmFsLg0KDQpgYGB7cn0NCmRhdGFrdSA8LSBkYXRha3UgJT4lDQogIG11dGF0ZShrYWJ1ID0gcjEwMSoxMDAgKyByMTAyKSAlPiUNCiAgcmVuYW1lKHByb3Y9InIxMDEiLCBrYWI9InIxMDIiKSAlPiUNCiAgbXV0YXRlKGRlbm9tPTEwMCkgJT4lDQogIG11dGF0ZSgNCiAgICBleHBfaG91c2luZyA9IHJvd1N1bXMoYWNyb3NzKA0KICAgICAgYyhzZWJ1bGFuXzIyOCwgc2VidWxhbl8yMjksIHNlYnVsYW5fMjMwLCBzZWJ1bGFuXzIzMSwNCiAgICAgICAgc2VidWxhbl8yMzQsIHNlYnVsYW5fMjM2LA0KICAgICAgICBzZWJ1bGFuXzI1Mywgc2VidWxhbl8yNTUsIHNlYnVsYW5fMjU3LA0KICAgICAgICBzZWJ1bGFuXzI1OSwgc2VidWxhbl8yNjAsIHNlYnVsYW5fMjYxKSwNCiAgICAgIH5yZXBsYWNlX25hKC4sIDApDQogICAgKSksDQogICAgQU1CQU5HID0gKGV4cF9ob3VzaW5nIC8gZXhwZW5kKSAqIDEwMCwNCiAgICBTSENCID0gaWZfZWxzZShBTUJBTkcgPiA1MCwgMTAwLCAwKQ0KICApDQpgYGANCiAgDQojIFNldCBEZXNpZ24gU2FtcGxpbmcNCg0KRGVzaWduIHNhbXBsaW5nIHlhbmcgZGlndW5ha2FuIG1lbmdpa3V0aSBkZXNpZ24gc2FtcGxpbmcgeWFuZyBkaWxha3VrYW4gcGFkYSBTUFNTIHlhaXR1IENsdXN0ZXIgU2FtcGxpbmcgZGVzaWduIHdpdGggcmVwbGFjZW1lbnQuDQoNCmBgYHtyLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQ0Kc3VzZW5hcy5kZXNpZ248LSBzdnlkZXNpZ24oaWQ9fnBzdSwgc3RyYXRhPX5zdHJhdGEsIGRhdGEgPSBkYXRha3UsIHdlaWdodHM9fmZ3dCkNCnN1c2VuYXMuZGVzaWduDQpzdW1tYXJ5KHN1c2VuYXMuZGVzaWduJHByb2IpDQpgYGANCg0KIyBTZXQgT3V0cHV0IFN0YXRpc3RpY3MNCg0KS3VhbGl0YXMgcHJlc2lzaSBoYXNpbCBlc3RpbWFzaSBzdWF0dSBzdXJ2ZWkgYmlzYSBkaWFtYXRpIGRhcmkgbmlsYWkgUlNFIHlhbmcgZGloYXNpbGthbi4gS2VzYWxhaGFuIHNhbXBsaW5nIGRhcmkgYmViZXJhcGEgZXN0aW1hc2kgaGFydXMgZGlndW5ha2FuIHNlY2FyYSBoYXRpLWhhdGkuIFVudHVrIGVzdGltYXNpIHlhbmcgYmVyZGFzYXJrYW4ganVtbGFoIGthc3VzIHlhbmcga2VjaWwsIGtlc2FsYWhhbiByZWxhdGlmIGNlbmRlcnVuZyBiZXNhci4NCg0KQmF0YXNhbiBuaWxhaSBSU0UgKCBfQXVzdHJhbGlhbiBCdXJlYXUgU3RhdGlzdGljc18pOg0KDQoxLiAgSmlrYSAkUlNFIFxsZSAyNVwlJCwgZXN0aW1hc2kgYmVyc2lmYXQgcHJlc2lzaS4NCg0KMi4gIEppa2EgJDI1XCUgPCBSU0UgXGxlIDUwXCUkLCBlc3RpbWFzaSBwZXJsdSBkaWxha3VrYW4gZGVuZ2FuIGhhdGktaGF0aS4NCg0KMy4gIEppa2EgJFJTRSA+IDUwXCUkLCBlc3RpbWFzaSBkaWFuZ2dhcCBzYW5nYXQgdGlkYWsgcHJlc2lzaS4NCg0KDQoqKlByb3ZpbnNpKioNCg0KYGBge3IsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9DQpvcHRpb25zKHN1cnZleS5hZGp1c3QuZG9tYWluLmxvbmVseT1UUlVFKQ0Kb3B0aW9ucyhzdXJ2ZXkubG9uZWx5LnBzdT0iYWRqdXN0IikNCmhhc2lsUCA9IHN2eWJ5KGZvcm11bGEgPSB+U0hDQiwgZGVub209IH5kZW5vbSwgfnByb3YsIGRlc2lnbiA9IHN1c2VuYXMuZGVzaWduLCBkYXRhID0gZGF0YWt1LCBkZWZmPVRSVUUsIHN2eXJhdGlvLCB2YXJ0eXBlPWMoInNlIiwiY2kiLCJjaSIsImN2IiwiY3ZwY3QiLCJ2YXIiKSkNCmhhc2lsUFtpcy5uYShoYXNpbFApXSA8LSAwDQpoYXNpbFAkdGhldGEgPSByb3VuZChoYXNpbFAkYFNIQ0IvZGVub21gKjEwMCwyKQ0KaGFzaWxQJFNFID0gcm91bmQoaGFzaWxQJGBzZS5TSENCL2Rlbm9tYCoxMDAsMikNCmhhc2lsUCRWQVIgPSByb3VuZChoYXNpbFAkU0UqaGFzaWxQJFNFLDIpDQpoYXNpbFAkQ0lfTE9XRVIgPSByb3VuZChoYXNpbFAkYGNpX2xgKjEwMCwyKQ0KaGFzaWxQJENJX0xPV0VSW2hhc2lsUCRDSV9MT1dFUjwwXSA8LSAwDQpoYXNpbFAkQ0lfVVBQRVIgPSByb3VuZChoYXNpbFAkYGNpX3VgKjEwMCwyKQ0KaGFzaWxQJFJTRSA9IHJvdW5kKGhhc2lsUCRgY3YlYCwyKQ0KaGFzaWxQJERFRkYgPSByb3VuZChoYXNpbFAkREVmZiwyKQ0KYGBgDQoNCioqS2FidXBhdGVuL2tvdGEqKg0KDQpgYGB7ciwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0NCm9wdGlvbnMoc3VydmV5LmFkanVzdC5kb21haW4ubG9uZWx5PVRSVUUpDQpvcHRpb25zKHN1cnZleS5sb25lbHkucHN1PSJhZGp1c3QiKQ0KaGFzaWwgPSBzdnlieShmb3JtdWxhID0gflNIQ0IsIGRlbm9tPSB+ZGVub20sIH5rYWJ1LCBkZXNpZ24gPSBzdXNlbmFzLmRlc2lnbiwgZGF0YSA9IGRhdGFrdSwgZGVmZj1UUlVFLCBzdnlyYXRpbywgdmFydHlwZT1jKCJzZSIsImNpIiwiY2kiLCJjdiIsImN2cGN0IiwidmFyIikpDQpoYXNpbFtpcy5uYShoYXNpbCldIDwtIDANCmhhc2lsJHRoZXRhID0gcm91bmQoaGFzaWwkYFNIQ0IvZGVub21gKjEwMCwyKQ0KaGFzaWwkU0UgPSByb3VuZChoYXNpbCRgc2UuU0hDQi9kZW5vbWAqMTAwLDIpDQpoYXNpbCRWQVIgPSByb3VuZChoYXNpbCRTRSpoYXNpbCRTRSwyKQ0KaGFzaWwkQ0lfTE9XRVIgPSByb3VuZChoYXNpbCRgY2lfbGAqMTAwLDIpDQpoYXNpbCRDSV9MT1dFUltoYXNpbCRDSV9MT1dFUjwwXSA8LSAwDQpoYXNpbCRDSV9VUFBFUiA9IHJvdW5kKGhhc2lsJGBjaV91YCoxMDAsMikNCmhhc2lsJFJTRSA9IHJvdW5kKGhhc2lsJGBjdiVgLDIpDQpoYXNpbCRERUZGID0gcm91bmQoaGFzaWwkREVmZiwyKQ0KYGBgDQoNCiMgTGV2ZWwgRXN0aW1hdGUNCg0KIyMgRXN0aW1hdGlvbiBieSBwcm92aW5jZQ0KDQpgYGB7cn0NCm91dHB1dFAgPSBhcy5kYXRhLmZyYW1lKGNiaW5kKGhhc2lsUCRwcm92LCBoYXNpbFAkdGhldGEsIGhhc2lsUCRTRSwgaGFzaWxQJFZBUiwgaGFzaWxQJENJX0xPV0VSLCBoYXNpbFAkQ0lfVVBQRVIsIGhhc2lsUCRSU0UsIGhhc2lsUCRERUZGKSkNCm5hbWVzKG91dHB1dFApID0gYygiUHJvdiIsIkVzdGltYXNpIiwiU0UiLCJWQVIiLCJDSSBMT1dFUiIsIkNJIFVQUEVSIiwiUlNFIiwiREVGRiIpDQoob3V0cHV0UFtvcmRlcihvdXRwdXRQJFByb3YsIGRlY3JlYXNpbmcgPSBGQUxTRSksIF0gICApDQpgYGANCg0KKipLZWxvbXBvayBSU0UgUHJvdmluc2kqKg0KDQpgYGB7cn0NCmhhc2lsUCA8LSBoYXNpbFAgJT4lDQogIG11dGF0ZSgNCiAgICBSU0UgPSBpZl9lbHNlKFJTRSA9PSAwLCBOQV9yZWFsXywgUlNFKQ0KICApICU+JQ0KICBhcnJhbmdlKFJTRSkgJT4lDQogIG11dGF0ZSgNCiAgICBVcnV0ID0gcm93X251bWJlcigpLA0KICAgIFJTRVBfa2F0ID0gY2FzZV93aGVuKA0KICAgICAgaXMubmEoUlNFKSAgICAgICAgICAgICAgICAgfiBOQV9jaGFyYWN0ZXJfLA0KICAgICAgUlNFIDwgMjUuOTkgICAgICAgICAgICAgICAgfiAiPCAyNSUiLA0KICAgICAgUlNFIDw9IDUwLjk5ICAgICAgICAgICAgICAgfiAiMjbigJM1MCUiLA0KICAgICAgUlNFID4gNTAgICAgICAgICAgICAgICAgICAgfiAiPiA1MCUiDQogICAgKQ0KICApDQoNCnRhYmxlKGhhc2lsUCRSU0VQX2thdCwgdXNlTkEgPSAiaWZhbnkiKQ0KYGBgDQoNCg0KKipWaXN1YWxpc2FzaSBQcm92aW5zaSoqDQoNCmBgYHtyfQ0KZ2dwbG90KGhhc2lsUCwgYWVzKHggPSBVcnV0LCB5ID0gUlNFLCBncm91cCA9IDEsIGNvbG9yID0gUlNFUF9rYXQpKSArDQogIGdlb21fcG9pbnQoc2l6ZSA9IDMpICsNCiAgDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDI1LCBsaW5ldHlwZSA9ICJkYXNoZWQiLCBjb2xvciA9ICJyZWQiKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDUwLCBsaW5ldHlwZSA9ICJkYXNoZWQiLCBjb2xvciA9ICJibHVlIikgKw0KICANCnNjYWxlX2NvbG9yX21hbnVhbCgNCiAgbmFtZSA9ICJLYXRlZ29yaSBSU0UiLA0KICBsaW1pdHMgPSBjKCI8IDI1JSIsICIyNuKAkzUwJSIsICI+IDUwJSIpLA0KICB2YWx1ZXMgPSBjKA0KICAgICI8IDI1JSIgID0gIiMxQjlFNzciLA0KICAgICIyNuKAkzUwJSIgPSAiI0ZGOEMwMCIsDQogICAgIj4gNTAlIiAgPSAiIzc1NzBCMyINCiAgKSwNCiAgbmEudmFsdWUgPSAiI0Q3MzAyNyIsDQogIGRyb3AgPSBGQUxTRQ0KKSArDQogICAgbGFicygNCiAgICB0aXRsZSA9ICJSU0UgU0hDQiBwZXIgUHJvdmluc2kiLA0KICAgIHN1YnRpdGxlID0gImRlbmdhbiBnYXJpcyBiYXRhcyBSU0UgMjUlIGRhbiA1MCUiLA0KICAgIHggPSAiUHJvdmluc2kiLA0KICAgIHkgPSAiTmlsYWkgUlNFICglKSINCiAgKSArDQogIA0KICB0aGVtZV9taW5pbWFsKGJhc2Vfc2l6ZSA9IDEzKSArDQogIHRoZW1lKA0KICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiwgc2l6ZSA9IDE1KSwNCiAgICBsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwNCiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQwLCB2anVzdCA9IDEsIGhqdXN0ID0gMSkNCiAgKQ0KYGBgDQoNCiMjIEVzdGltYXRpb24gYnkgZGlzdHJpY3QNCg0KYGBge3J9DQpvdXRwdXQgPSBhcy5kYXRhLmZyYW1lKGNiaW5kKGhhc2lsJGthYnUsIGhhc2lsJHRoZXRhLCBoYXNpbCRTRSwgaGFzaWwkVkFSLCBoYXNpbCRDSV9MT1dFUiwgaGFzaWwkQ0lfVVBQRVIsIGhhc2lsJFJTRSwgaGFzaWwkREVGRikpDQpuYW1lcyhvdXRwdXQpID0gYygiS2FrbyIsIkVzdGltYXNpIiwiU0UiLCJWQVIiLCJDSSBMT1dFUiIsIkNJIFVQUEVSIiwiUlNFIiwiREVGRiIpDQpoZWFkKChvdXRwdXRbb3JkZXIob3V0cHV0JEtha28sIGRlY3JlYXNpbmcgPSBGQUxTRSksIF0gICApKQ0KYGBgDQoNCioqS2Vsb21wb2sgUlNFIEthYnVwYXRlbi9rb3RhKioNCg0KYGBge3J9DQpoYXNpbCA8LSBoYXNpbCAlPiUNCiAgbXV0YXRlKA0KICAgIFJTRSA9IGlmX2Vsc2UoUlNFID09IDAsIE5BX3JlYWxfLCBSU0UpDQogICkgJT4lDQogIGFycmFuZ2UoUlNFKSAlPiUNCiAgbXV0YXRlKA0KICAgIFVydXQgPSByb3dfbnVtYmVyKCksDQogICAgUlNFX2thdCA9IGNhc2Vfd2hlbigNCiAgICAgIGlzLm5hKFJTRSkgICAgICAgICAgICAgICAgIH4gTkFfY2hhcmFjdGVyXywNCiAgICAgIFJTRSA8IDI1Ljk5ICAgICAgICAgICAgICAgIH4gIjwgMjUlIiwNCiAgICAgIFJTRSA8PSA1MC45OSAgICAgICAgICAgICAgIH4gIjI24oCTNTAlIiwNCiAgICAgIFJTRSA+IDUwICAgICAgICAgICAgICAgICAgIH4gIj4gNTAlIg0KICAgICkNCiAgKQ0KDQp0YWJsZShoYXNpbCRSU0Vfa2F0LCB1c2VOQSA9ICJpZmFueSIpDQpgYGANCg0KDQpgYGB7cn0NCmdncGxvdChoYXNpbCwgYWVzKHggPSBVcnV0LCB5ID0gUlNFLCBjb2xvciA9IFJTRV9rYXQpKSArDQogIGdlb21faml0dGVyKHdpZHRoID0gMC4zNSwgaGVpZ2h0ID0gMCwgc2l6ZSA9IDEuOCwgYWxwaGEgPSAwLjg1KSArDQoNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMjUsIGxpbmV0eXBlID0gImRhc2hlZCIsIGNvbG9yID0gInJlZCIpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gNTAsIGxpbmV0eXBlID0gImRhc2hlZCIsIGNvbG9yID0gImJsdWUiKSArDQoNCnNjYWxlX2NvbG9yX21hbnVhbCgNCiAgbmFtZSA9ICJLYXRlZ29yaSBSU0UiLA0KICBsaW1pdHMgPSBjKCI8IDI1JSIsICIyNuKAkzUwJSIsICI+IDUwJSIpLA0KICB2YWx1ZXMgPSBjKA0KICAgICI8IDI1JSIgID0gIiMxQjlFNzciLA0KICAgICIyNuKAkzUwJSIgPSAiI0ZGOEMwMCIsDQogICAgIj4gNTAlIiAgPSAiIzc1NzBCMyINCiAgKSwNCiAgbmEudmFsdWUgPSAiI0Q3MzAyNyIsDQogIGRyb3AgPSBGQUxTRQ0KKSArDQoNCiAgbGFicygNCiAgICB0aXRsZSA9ICJSU0UgU0hDQiBwZXIgS2FidXBhdGVuL2tvdGEiLA0KICAgIHN1YnRpdGxlID0gImRlbmdhbiBnYXJpcyBiYXRhcyBSU0UgMjUlIGRhbiA1MCUiLA0KICAgIHggPSAiVXJ1dGFuIEthYnVwYXRlbi9Lb3RhIiwNCiAgICB5ID0gIk5pbGFpIFJTRSAoJSkiDQogICkgKw0KDQogIHRoZW1lX21pbmltYWwoYmFzZV9zaXplID0gMTMpICsNCiAgdGhlbWUoDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiLCBzaXplID0gMTUpLA0KICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iDQogICkNCmBgYA0KDQpgYGB7cn0NCndyaXRlLnhsc3gob3V0cHV0UCwiU0hDQiAyMDI1X1Byb3YueGxzeCIpDQp3cml0ZS54bHN4KG91dHB1dCwiU0hDQiAyMDI1X0tha28ueGxzeCIpDQpgYGANCg0KIyBQZXRhDQoNCmBgYHtyfQ0KbGlicmFyeShzZikNCnBldGFrdSA8LSBzdF9yZWFkKCJQZXRhU0hQNTE0XzM4LnNocCIpDQoNCnBldGFrdSA8LSBwZXRha3UgJT4lDQogIG11dGF0ZShpZGthYiA9IGFzLmNoYXJhY3RlcihpZGthYikpDQpoYXNpbCA8LSBoYXNpbCAlPiUNCiAgbXV0YXRlKGthYnUgPSBhcy5jaGFyYWN0ZXIoa2FidSkpDQpuYW1lcyhwZXRha3UpDQpgYGANCg0KYGBge3J9DQprYWJfbWFwIDwtIHBldGFrdSAlPiUNCiAgbGVmdF9qb2luKA0KICAgIGhhc2lsICU+JSBzZWxlY3Qoa2FidSwgUlNFLCBSU0Vfa2F0KSwNCiAgICBieSA9IGMoImlka2FiIiA9ICJrYWJ1IikNCiAgKQ0KDQprYWJfbWFwJFJTRV9rYXQgPC0gZmFjdG9yKA0KICBrYWJfbWFwJFJTRV9rYXQsDQogIGxldmVscyA9IGMoIjwgMjUlIiwgIjI24oCTNTAlIiwgIj4gNTAlIikNCikNCmBgYA0KDQpgYGB7cn0NCmdncGxvdChrYWJfbWFwKSArDQogIGdlb21fc2YoYWVzKGZpbGwgPSBSU0Vfa2F0KSwgY29sb3IgPSAid2hpdGUiLCBzaXplID0gMC4xKSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKA0KICAgIHZhbHVlcyA9IGMoDQogICAgICAiPCAyNSUiICAgPSAiIzFhOTg1MCIsICAjIHNhbmdhdCBiYWlrDQogICAgICAiMjbigJM1MCUiICA9ICIjZmVlMDhiIiwgICMgaGF0aS1oYXRpDQogICAgICAiPiA1MCUiICAgPSAiI2Q3MzAyNyIgICAjIHRpZGFrIHJlbGlhYmVsDQogICAgKSwNCiAgICBuYS52YWx1ZSA9ICJkYXJrYmx1ZSIsDQogICAgZHJvcCA9IEZBTFNFDQogICkgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIlJTRSBTSENCIHBlciBLYWJ1cGF0ZW4va290YSIsDQogICAgZmlsbCAgPSAiS2F0ZWdvcmkgUlNFIg0KICApICsNCiAgdGhlbWVfbWluaW1hbCgpDQpgYGANCg0KIyBfUmVmZXJlbmNlc18NCg0KWzFdIEpvaW50IENlbnRlciBmb3IgSG91c2luZyBTdHVkaWVzIG9mIEhhcnZhcmQgVW5pdmVyc2l0eS4gKDIwMjMpLiBfVGhlIHN0YXRlIG9mIHRoZSBuYXRpb27igJlzIGhvdXNpbmcgMjAyM18uIENhbWJyaWRnZSwgTUE6IEhhcnZhcmQgVW5pdmVyc2l0eS4NCg0KWzJdIEt1dHR5LCBOLiBLLiAoMjAwNSkuIF9BIG5ldyBtZWFzdXJlIG9mIGhvdXNpbmcgYWZmb3JkYWJpbGl0eTogRXN0aW1hdGVzIGFuZCBhbmFseXRpY2FsIHJlc3VsdHNfLiBIb3VzaW5nIFBvbGljeSBEZWJhdGUsIDE2KDEpLCAxMTPigJMxNDIuDQoNClszXSBTdG9uZSwgTS4gRS4gKDIwMDYpLiBfV2hhdCBpcyBob3VzaW5nIGFmZm9yZGFiaWxpdHk/IFRoZSBjYXNlIGZvciB0aGUgcmVzaWR1YWwgaW5jb21lIGFwcHJvYWNoXy4gSG91c2luZyBQb2xpY3kgRGViYXRlLCAxNygxKSwgMTUx4oCTMTg0LiBodHRwczovL2RvaS5vcmcvMTAuMTA4MC8xMDUxMTQ4Mi4yMDA2Ljk1MjE1NjQNCg0KWzRdIFUuUy4gRGVwYXJ0bWVudCBvZiBIb3VzaW5nIGFuZCBVcmJhbiBEZXZlbG9wbWVudCAoSFVEKS4gKDIwMjIpLiBfQWZmb3JkYWJsZSBob3VzaW5nXy4gV2FzaGluZ3RvbiwgREM6IEhVRC4NCg0KWzVdIFdvcmxkIEJhbmsuICgyMDE5KS4gX0luZG9uZXNpYSBhZmZvcmRhYmxlIGhvdXNpbmc6IFBvbGljeSBhbmQgaW5zdGl0dXRpb25hbCBhc3Nlc3NtZW50Xy4gV2FzaGluZ3RvbiwgREM6IFdvcmxkIEJhbmsuDQoNCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCj4gRGlyZWt0b3JhdCBTdGF0aXN0aWsgS2VzZWphaHRlcmFhbiBSYWt5YXQsIEJQUywgc2FwdGFoYXNAYnBzLmdvLmlkDQoNCg0KDQoNCg==