Abstrak

Diare merupakan penyakit berbasis lingkungan yang menjadi beban kesehatan masyarakat signifikan di Provinsi Jawa Barat. Studi ini bertujuan menganalisis pola epidemiologi penyakit diare secara cross-sectional pada 27 kabupaten/kota di Jawa Barat tahun 2024, meliputi perhitungan Incidence Rate (IR) dan Standardized Incidence Ratio (SIR), analisis autokorelasi spasial menggunakan Global Moran’s I dan klaster LISA, serta identifikasi determinan jumlah kasus menggunakan regresi Negative Binomial. Hasil menunjukkan total 672.287 kasus diare dengan IR rata-rata Jawa Barat 133,54 per 10.000 penduduk. Kota Cirebon mencatatkan IR tertinggi (442,83 per 10.000, SIR = 3,32), diikuti Kota Bogor (321,38, SIR = 2,41) dan Kota Sukabumi (311,29, SIR = 2,33). Uji Moran’s I (I = 0,060, p = 0,226) tidak menunjukkan autokorelasi spasial signifikan. Regresi Negative Binomial Model 3 terpilih berdasarkan AIC terendah (564,97) mengidentifikasi ketersediaan fasilitas kesehatan (IRR = 0,724, p < 0,001) dan IPM (IRR = 0,700, p = 0,021) sebagai faktor protektif signifikan, sedangkan kepadatan penduduk (IRR = 1,491, p = 0,008) merupakan faktor risiko. Overdispersi data dikonfirmasi dengan VMR = 6.110,70 dan dispersion estimate = 1.656,22 (p < 0,001), menjustifikasi penggunaan model Negative Binomial.

Kata kunci: diare, incidence rate, SIR, Moran’s I, LISA, Regresi Negative Binomial


1 Pendahuluan

1.1 Latar Belakang

Diare adalah kondisi di mana seseorang mengalami buang air besar lebih dari tiga kali sehari dengan konsistensi cair atau lembek. Secara global, diare merupakan penyebab kedua kematian pada anak di bawah lima tahun setelah pneumonia (WHO, 2023). Di Indonesia, diare termasuk dalam sepuluh besar penyakit dengan angka kesakitan tertinggi dan terus menjadi masalah kesehatan masyarakat prioritas, terutama di wilayah dengan akses sanitasi dan air bersih yang masih terbatas.

Provinsi Jawa Barat sebagai provinsi dengan jumlah penduduk terbesar di Indonesia (±50,3 juta jiwa pada 2024) menghadapi tantangan besar dalam pengendalian penyakit diare. Data Open Data Jabar menunjukkan bahwa pada tahun 2024 tercatat sebanyak 672.287 kasus diare di 27 kabupaten/kota, dengan variasi kasus yang signifikan antarwilayah—mulai dari 4.096 kasus di Kota Banjar hingga 56.802 kasus di Kabupaten Bogor. Namun, jumlah kasus absolut tidak mencerminkan risiko sebenarnya; diperlukan analisis berbasis denominan populasi untuk perbandingan yang bermakna.

Berbagai faktor determinan diare telah diidentifikasi dalam literatur, meliputi akses sanitasi dasar, ketersediaan air bersih, kepadatan penduduk, kondisi sosial ekonomi yang direpresentasikan oleh Indeks Pembangunan Manusia (IPM) dan garis kemiskinan, serta ketersediaan fasilitas kesehatan. Pemahaman tentang faktor-faktor yang mempengaruhi beban diare secara simultan dalam konteks multivariat diperlukan untuk perumusan intervensi yang tepat sasaran.

Pendekatan spasial epidemiologi juga penting untuk mengidentifikasi apakah terdapat pola klaster geografis yang memerlukan perhatian khusus. Analisis Moran’s I global dan LISA (Local Indicators of Spatial Association) memungkinkan identifikasi wilayah-wilayah dengan beban penyakit yang tidak acak secara spasial, yang dapat menjadi basis penetapan prioritas program kesehatan masyarakat.

1.2 Rumusan Masalah

  1. Bagaimana distribusi kasus diare di Jawa Barat tahun 2024?
  2. Wilayah mana yang memiliki risiko relatif tertinggi?
  3. Apakah terdapat pola spasial kasus diare?
  4. Faktor apa saja yang berpengaruh terhadap jumlah kasus diare?

1.3 Tujuan Penelitian

  1. Menghitung ukuran epidemiologi diare tahun 2024.
  2. Mengidentifikasi wilayah dengan risiko tinggi berdasarkan SIR.
  3. Menguji keberadaan autokorelasi spasial menggunakan Moran’s I dan LISA.
  4. Menganalisis faktor-faktor yang memengaruhi jumlah kasus diare menggunakan regresi Negative Binomial.

2 Data dan Metode

2.1 Sumber Data

Penelitian ini menggunakan data sekunder lintas-seksional (cross-sectional) pada tahun 2024 dari tiga sumber utama:

  1. Open Data Jabar (opendata.jabarprov.go.id): jumlah kasus diare per kabupaten/kota, jumlah fasilitas kesehatan, persentase akses air bersih, persentase akses sanitasi, dan kepadatan penduduk.
  2. Badan Pusat Statistik (BPS) Provinsi Jawa Barat: jumlah penduduk, garis kemiskinan per kapita per bulan, dan Indeks Pembangunan Manusia (IPM).
  3. GADM (Database of Global Administrative Areas): batas administratif kabupaten/kota Jawa Barat dalam format GeoJSON untuk keperluan analisis spasial dan pemetaan.

Tanggal akses data: Juni 2026. Seluruh data merupakan data publik yang dapat diverifikasi dan diakses kembali melalui tautan sumber resmi.

2.2 Unit Analisis dan Variabel Penelitian

Unit analisis adalah kabupaten/kota (n = 27) di Provinsi Jawa Barat pada tahun 2024. Tabel 1 merangkum variabel yang digunakan.

Tabel 1. Unit Analisis dan Variabel

Variabel Tipe Satuan Peran
Kasus Diare Respons (count) Orang/tahun Variabel dependen regresi NB
Jumlah Penduduk Denominator Jiwa Denominan IR, SIR, dan offset regresi
Fasilitas Kesehatan Prediktor (Log) Unit Proksi ketersediaan layanan kesehatan
Akses Air Bersih Prediktor % Rumah tangga dengan akses air minum layak
Akses Sanitasi Prediktor % Rumah tangga dengan sanitasi layak
IPM Prediktor Indeks Indeks Pembangunan Manusia (0–100)
Garis Kemiskinan Prediktor (Log) Rp/kapita/bln Pengeluaran minimum per kapita
Kepadatan Penduduk Prediktor (Log) Jiwa/km² Intensitas kontak antar-individu

2.3 Pengolahan Data

Data diolah menggunakan perangkat lunak R dengan paket utama: readxl, dplyr, MASS (glm.nb), AER (dispersiontest), car (vif), sf, dan spdep. Tahapan pengolahan meliputi: a. Pembacaan data Excel dengan penugasan nama kolom secara manual berdasarkan posisi (14 kolom) untuk menghindari dependensi pada versi paket janitor. b. Kolom air_bersih disimpan sebagai karakter di Excel; nilai “-” diubah ke NA kemudian diimputasi dengan nilai median. c. Transformasi log natural untuk variabel faskes, kemiskinan, dan kepadatan yang berdistribusi positif skewed, guna memenuhi asumsi linearitas log-link pada model NB. d. Standardisasi (z-score) seluruh prediktor agar koefisien regresi dapat dibandingkan lintas variabel.

2.4 Ukuran Epidemiologi

2.4.1 Incidence Rate (IR)

Incidence Rate (IR), dihitung sebagai jumlah kasus diare dibagi jumlah penduduk dikalikan 10.000, menghasilkan satuan kasus per 10.000 penduduk per tahun:

\[ IR = \frac{Kasus Diare}{Penduduk}\times 10.000 \]

2.4.2 Standardized Incidence Ratio (SIR)

Standardized Incidence Ratio (SIR), dihitung sebagai rasio kasus teramati terhadap kasus yang diharapkan, di mana kasus yang diharapkan diperoleh dengan mengaplikasikan IR referensi Jawa Barat 2024 (133,54 per 10.000) terhadap penduduk masing-masing wilayah:

\[ SIR = \frac{Observed}{Expected} \]

dengan

\[ Expected = Penduduk_i \times Rate_{JawaBarat} \]

SIR > 1 menunjukkan beban diare melebihi rata-rata provinsi; SIR < 1 menunjukkan beban di bawah rata-rata. SIR dikategorikan menjadi: Sangat Tinggi (≥ 2,0), Tinggi (1,0–2,0), Rendah (0,5–1,0), dan Sangat Rendah (< 0,5).

2.5 Analisis Spasial

Analisis spasial dilakukan dengan pendekatan berbasis pembobot Queen Contiguity menggunakan paket spdep. Dua analisis dilakukan:

  1. Global Moran’s I: mengukur derajat autokorelasi spasial IR secara keseluruhan. Nilai I berkisar antara -1 (dispersi sempurna) hingga +1 (klaster sempurna). Uji signifikansi menggunakan pendekatan randomisasi (p < 0,05).

  2. Local Indicators of Spatial Association (LISA): mengidentifikasi klaster spasial lokal pada level wilayah. Klaster dikategorikan sebagai High-High, Low-Low, High-Low, atau Low-High berdasarkan nilai IR terstandarisasi dan spatial lag-nya, dengan threshold signifikansi p < 0,05.

2.6 Regresi Negative Binomial

Regresi binomial negatif adalah salah satu alternatif dari model regresi Poisson yang mengalami overdispersi. Regresi Binomial Negatif adalah model penerapan dari Generalized Linear Model (GLM) yang menghubungkan antara variabel dependen dengan variabel independen yang dapat diterapkan pada kondisi equdispersi atau overdispersi

Data kasus diare merupakan data cacah (count data) dengan overdispersi yang dikonfirmasi melalui Variance-Mean Ratio (VMR) dan uji formal dispersiontest dari paket AER. Model Negative Binomial (NB) dipilih karena mengatasi overdispersi melalui parameter dispersi theta (θ), yang tidak dapat ditangani oleh model Poisson. Tiga model bertingkat diestimasi dengan offset log(jumlah penduduk) untuk mengoreksi perbedaan ukuran populasi:

  1. Model 1: log(faskes) + air_bersih + sanitasi + IPM

\[ \quad \log(\mu_i) = \ln(\text{penduduk}_i) + \beta_0 + \beta_1 \text{Faskes}_i + \beta_2 \text{AirBersih}_i + \beta_3 \text{Sanitasi}_i + \beta_4 \text{IPM}_i\]

  1. Model 2: Model 1 + log(garis kemiskinan)

\[ \quad \log(\mu_i) = \ln(\text{penduduk}_i) + \beta_0 + \beta_1 \text{Faskes}_i + \beta_2 \text{AirBersih}_i + \beta_3 \text{Sanitasi}_i + \beta_4 \text{IPM}_i + \beta_5 \text{Kemiskinan}_i\]

  1. Model 3: Model 2 + log(kepadatan)

\[ \quad \log(\mu_i) = \ln(\text{penduduk}_i) + \beta_0 + \beta_1 \text{Faskes}_i + \beta_2 \text{AirBersih}_i + \beta_3 \text{Sanitasi}_i + \beta_4 \text{IPM}_i + \beta_5 \text{Kemiskinan}_i + \beta_6 \text{Kepadatan}_i\]

Pemilihan model berdasarkan Akaike Information Criterion (AIC) terkecil. Model-model dibandingkan secara formal menggunakan Likelihood-Ratio Test (LRT). Goodness of fit diuji dengan uji chi-kuadrat berbasis devians residual. Output utama berupa Incidence Rate Ratio (IRR = exp(β)) dengan 95% Confidence Interval. Multikolinearitas diperiksa menggunakan Variance Inflation Factor (VIF) melalui model OLS pengganti.


3 Hasil Analisis

3.1 Persiapan Data

setwd("C:/Users/HP/Downloads")

df_raw <- read_excel("dataset diare fix.xlsx") %>%
  clean_names()

# Rename ke nama pendek yang konsisten
df_raw <- df_raw %>%
  rename(
    nama_kab   = nama_kabupaten_kota,
    diare      = diare_orang,
    faskes     = faskes_unit,
    kemiskinan = garis_kemiskinan_rupiah_kapita_bulan,
    kepadatan  = kepadatan_penduduk_jiwa_per_kilometer_persegi,
    air_bersih = air_bersih_percent,
    sanitasi   = sanitasi_percent,
    ipm        = ipm_percent,
    penduduk   = jumlah_penduduk_jiwa
  ) %>%
  dplyr::select(
    nama_kab,
    tahun,
    diare,
    faskes,
    kemiskinan,
    kepadatan,
    air_bersih,
    sanitasi,
    ipm,
    penduduk
  )



df <- df_raw %>%
  mutate(
    air_bersih = trimws(as.character(air_bersih)),
    air_bersih = na_if(air_bersih, "-"),

    diare      = as.numeric(diare),
    faskes     = as.numeric(faskes),
    kemiskinan = as.numeric(kemiskinan),
    kepadatan  = as.numeric(kepadatan),
    air_bersih = as.numeric(air_bersih),
    sanitasi   = as.numeric(sanitasi),
    ipm        = as.numeric(ipm),
    penduduk   = as.numeric(penduduk),
    tahun      = as.integer(tahun)
  ) %>%
  filter(tahun == 2024)

df <- df %>%
  mutate(
    air_bersih = ifelse(
      is.na(air_bersih),
      median(air_bersih, na.rm = TRUE),
      air_bersih
    ),
    sanitasi = ifelse(
      is.na(sanitasi),
      median(sanitasi, na.rm = TRUE),
      sanitasi
    )
  )

df <- df %>%
  mutate(
    # Log transforms untuk variabel skewed kanan
    ln_penduduk   = log(penduduk),
    ln_faskes     = log1p(faskes),      # log(x+1) aman jika ada nol
    ln_kemiskinan = log(kemiskinan),
    ln_kepadatan  = log(kepadatan),
    
    # Standardisasi (mean=0, SD=1) agar koefisien dapat dibandingkan
    faskes_std     = as.numeric(scale(ln_faskes)),
    air_std        = as.numeric(scale(air_bersih)),
    sanitasi_std   = as.numeric(scale(sanitasi)),
    ipm_std        = as.numeric(scale(ipm)),
    kemiskinan_std = as.numeric(scale(ln_kemiskinan)),
    kepadatan_std  = as.numeric(scale(ln_kepadatan)))

df <- df %>%
  mutate(
    tipe = ifelse(str_detect(toupper(nama_kab), "^KOTA"), "Kota", "Kabupaten")
  )

# Data Spasial
path_shp  <- "D:/Batas/Batas/Batas_Kabupaten_Jawa_Barat.shp"

jabar_geo <- st_read(path_shp) 
## Reading layer `Batas_Kabupaten_Jawa_Barat' from data source 
##   `D:\Batas\Batas\Batas_Kabupaten_Jawa_Barat.shp' using driver `ESRI Shapefile'
## Simple feature collection with 27 features and 6 fields
## Geometry type: MULTIPOLYGON
## Dimension:     XY
## Bounding box:  xmin: 106.3703 ymin: -7.82099 xmax: 108.8468 ymax: -5.806538
## Geodetic CRS:  WGS 84
jabar_geo <- jabar_geo %>%
    mutate(
      nama_kab = toupper(WADMKK),
      nama_kab = case_when(
        str_detect(nama_kab, "^KOTA") ~ nama_kab,
        TRUE ~ paste("KABUPATEN", nama_kab)
      )
    )

# Standarisasi nama di df untuk join
df_spat <- df %>%
  mutate(nama_kab = toupper(nama_kab))

# Gabungkan shapefile dengan data
jabar <- left_join(jabar_geo, df_spat, by = "nama_kab")

3.2 Statistik Deskriptif

Tabel 2. Statistik Deskriptif Variabel Diare

variabel <- c(
  "diare",
  "penduduk",
  "faskes",
  "kemiskinan",
  "kepadatan",
  "air_bersih",
  "sanitasi",
  "ipm"
)

stat_desc <- data.frame(
  Variabel = c(
    "Kasus Diare",
    "Jumlah Penduduk",
    "Jumlah Faskes",
    "Garis Kemiskinan",
    "Kepadatan Penduduk",
    "Akses Air Bersih (%)",
    "Akses Sanitasi (%)",
    "IPM"
  ),
  Minimum = sapply(df[variabel], min, na.rm = TRUE),
  Mean    = sapply(df[variabel], mean, na.rm = TRUE),
  Median  = sapply(df[variabel], median, na.rm = TRUE),
  SD      = sapply(df[variabel], sd, na.rm = TRUE),
  Maksimum= sapply(df[variabel], max, na.rm = TRUE)
)

kable(stat_desc, row.names = FALSE)
Variabel Minimum Mean Median SD Maksimum
Kasus Diare 4096.00 2.489952e+04 21014.00 1.233505e+04 56802.00
Jumlah Penduduk 209790.00 1.864637e+06 1884190.00 1.228053e+06 5682300.00
Jumlah Faskes 220.00 2.034815e+03 1758.00 1.329054e+03 5284.00
Garis Kemiskinan 393464.00 5.360651e+05 475046.00 1.254443e+05 843893.00
Kepadatan Penduduk 385.00 3.910926e+03 1468.00 4.668116e+03 15176.00
Akses Air Bersih (%) 85.37 9.509519e+01 96.76 4.221395e+00 99.85
Akses Sanitasi (%) 34.56 8.945037e+01 95.78 1.489451e+01 100.00
IPM 68.89 7.467778e+01 73.82 4.333325e+00 83.75

Interpretasi:

Jumlah kasus diare per wilayah sangat bervariasi (min = 4.096; maks = 56.802), dengan SD yang besar (12.335,05) relatif terhadap rerata (24.899,52). Variasi besar ini merupakan indikasi awal overdispersi yang menguat dugaan bahwa model Poisson tidak memadai. IR berkisar dari 62,62 hingga 442,83 per 10.000 penduduk rasio maks/min mencapai 7,07, menunjukkan ketimpangan beban penyakit yang substansial. Akses sanitasi menunjukkan variasi terbesar (SD = 14,89%) dengan nilai minimum 34,56% (Kota Tasikmalaya), mengindikasikan kesenjangan infrastruktur sanitasi yang masih lebar antarwilayah.


3.3 Ukuran Epidemiologi

3.3.1 Incidence Rate (IR) dan SIR

Tabel 3 menyajikan IR dan SIR seluruh 27 kabupaten/kota, diurutkan berdasarkan SIR tertinggi. IR referensi Jawa Barat 2024 adalah 133,54 per 10.000 penduduk (total 672.287 kasus dari 50.345.190 penduduk).

Tabel 3. Incidence Rate dan SIR Diare

# IR
rate_jabar <- sum(df$diare) / sum(df$penduduk)

df <- df %>%
  mutate(IR = (diare / penduduk) * 10000)

# Update jabar dengan IR
jabar <- left_join(jabar_geo, 
                   df %>% mutate(nama_kab = toupper(nama_kab)), 
                   by = "nama_kab")

# SIR

df <- df %>%
  mutate(
    expected = penduduk * rate_jabar,
    SIR      = diare / expected
  )

# Update jabar dengan SIR
jabar <- left_join(jabar_geo, 
                   df %>% mutate(nama_kab = toupper(nama_kab)), 
                   by = "nama_kab")

jabar <- jabar %>%
  mutate(
    kategori_SIR = case_when(
      SIR < 0.80 ~ "<0.80",
      SIR < 1.00 ~ "0.80-0.99",
      SIR < 1.20 ~ "1.00-1.19",
      SIR < 1.50 ~ "1.20-1.49",
      TRUE       ~ ">=1.50"
    )
  )

tabel_epid <- df %>%
  mutate(
    IR_round  = round(IR, 2),
    SIR_round = round(SIR, 3),
    Kategori  = case_when(
      SIR >= 2.0  ~ "Sangat Tinggi (>=2.0)",
      SIR >= 1.0  ~ "Tinggi (1.0-2.0)",
      SIR >= 0.5  ~ "Rendah (0.5-1.0)",
      TRUE        ~ "Sangat Rendah (<0.5)"
    )
  ) %>%
  dplyr::select(Wilayah = nama_kab, Tipe = tipe,
         Kasus = diare, `IR/10.000` = IR_round,
         `Kasus Exp.` = expected, SIR = SIR_round, Kategori) %>%
  mutate(`Kasus Exp.` = round(`Kasus Exp.`, 0)) %>%
  arrange(desc(SIR))

kable(tabel_epid)
Wilayah Tipe Kasus IR/10.000 Kasus Exp. SIR Kategori
KOTA CIREBON Kota 15271 442.83 4605 3.316 Sangat Tinggi (>=2.0)
KOTA BOGOR Kota 34656 321.38 14400 2.407 Sangat Tinggi (>=2.0)
KOTA SUKABUMI Kota 11385 311.29 4884 2.331 Sangat Tinggi (>=2.0)
KABUPATEN MAJALENGKA Kabupaten 32382 239.42 18061 1.793 Tinggi (1.0-2.0)
KOTA TASIKMALAYA Kota 17845 237.70 10025 1.780 Tinggi (1.0-2.0)
KOTA BANJAR Kota 4096 195.24 2801 1.462 Tinggi (1.0-2.0)
KABUPATEN CIREBON Kabupaten 46223 193.57 31888 1.450 Tinggi (1.0-2.0)
KABUPATEN PURWAKARTA Kabupaten 20193 192.25 14026 1.440 Tinggi (1.0-2.0)
KABUPATEN PANGANDARAN Kabupaten 8003 184.36 5797 1.381 Tinggi (1.0-2.0)
KABUPATEN SUBANG Kabupaten 28398 170.75 22209 1.279 Tinggi (1.0-2.0)
KABUPATEN SUMEDANG Kabupaten 18361 154.67 15852 1.158 Tinggi (1.0-2.0)
KOTA CIMAHI Kota 9071 151.51 7995 1.135 Tinggi (1.0-2.0)
KABUPATEN CIAMIS Kabupaten 18336 145.61 16815 1.090 Tinggi (1.0-2.0)
KABUPATEN SUKABUMI Kabupaten 39941 141.23 37764 1.058 Tinggi (1.0-2.0)
KABUPATEN CIANJUR Kabupaten 36080 139.58 34519 1.045 Tinggi (1.0-2.0)
KABUPATEN GARUT Kabupaten 37640 138.54 36281 1.037 Tinggi (1.0-2.0)
KABUPATEN KUNINGAN Kabupaten 16429 135.34 16210 1.013 Tinggi (1.0-2.0)
KOTA BANDUNG Kota 32258 127.59 33760 0.956 Rendah (0.5-1.0)
KABUPATEN BANDUNG BARAT Kabupaten 23322 123.78 25161 0.927 Rendah (0.5-1.0)
KABUPATEN TASIKMALAYA Kabupaten 21014 109.40 25651 0.819 Rendah (0.5-1.0)
KOTA DEPOK Kota 22917 105.92 28892 0.793 Rendah (0.5-1.0)
KOTA BEKASI Kota 27749 104.95 35308 0.786 Rendah (0.5-1.0)
KABUPATEN BOGOR Kabupaten 56802 99.96 75879 0.749 Rendah (0.5-1.0)
KABUPATEN BANDUNG Kabupaten 36693 97.77 50117 0.732 Rendah (0.5-1.0)
KABUPATEN INDRAMAYU Kabupaten 16757 87.55 25559 0.656 Rendah (0.5-1.0)
KABUPATEN KARAWANG Kabupaten 19964 78.16 34110 0.585 Rendah (0.5-1.0)
KABUPATEN BEKASI Kabupaten 20501 62.62 43718 0.469 Sangat Rendah (<0.5)

Interpretasi:

Tiga wilayah termasuk kategori Sangat Tinggi (SIR ≥ 2,0): Kota Cirebon (SIR = 3,32; IR = 442,83), Kota Bogor (SIR = 2,41; IR = 321,38), dan Kota Sukabumi (SIR = 2,33; IR = 311,29). Sebanyak 14 wilayah masuk kategori Tinggi (1,0 ≤ SIR < 2,0), 9 wilayah Rendah (0,5 ≤ SIR < 1,0), dan hanya 1 wilayah Sangat Rendah (Kabupaten Bekasi, SIR = 0,47). Dengan demikian, 17 dari 27 wilayah (63%) memiliki beban diare yang melebihi rata-rata provinsi.

Analisis berdasarkan tipe wilayah menunjukkan bahwa wilayah perkotaan (kota) memiliki rerata IR lebih tinggi (222,05 per 10.000) dibandingkan kabupaten (138,59 per 10.000). Uji Mann-Whitney menunjukkan perbedaan ini tidak signifikan secara statistik (U = 117,0; p = 0,068), kemungkinan akibat ukuran sampel yang kecil (9 kota vs 18 kabupaten).

3.3.2 Visualisasi Ukuran Epidemiologi

a. Incidence Rate (IR)

p_ir <- df %>%
  mutate(nama_kab = reorder(nama_kab, IR)) %>%
  ggplot(aes(x = IR, y = nama_kab, fill = tipe)) +
  geom_col(alpha = 0.85) +
  geom_vline(xintercept = rate_jabar * 10000,
             linetype = "dashed", color = "#f39c12", linewidth = 0.9) +
  annotate("text",
           x     = rate_jabar * 10000 + 5,
           y     = 2,
           label = paste0("IR Jabar\n", round(rate_jabar*10000, 1)),
           color = "#f39c12", size = 3, hjust = 0) +
  scale_fill_manual(values = c("Kabupaten" = "#3498db", "Kota" = "#e74c3c")) +
  scale_x_continuous(labels = comma) +
  labs(
    title    = "Incidence Rate Diare per 10.000 Penduduk",
    subtitle = "Jawa Barat 2024 | Garis oranye = IR rata-rata Provinsi",
    x        = "IR per 10.000 Penduduk",
    y        = NULL,
    fill     = "Tipe Wilayah"
  ) +
  theme_minimal(base_size = 10) +
  theme(
    plot.title          = element_text(face = "bold", size = 12),
    panel.grid.major.y  = element_blank(),
    legend.position     = "bottom"
  )
print(p_ir)

Gambar 1. Diagram Batang Incidence Rate (IR) Diare

Interpretasi:

Berdasarkan Gambar 1, nilai Incidence Rate (IR) diare di kabupaten/kota Provinsi Jawa Barat tahun 2024 menunjukkan variasi yang cukup besar. Kota Cirebon memiliki IR tertinggi, diikuti oleh Kota Bogor dan Kota Sukabumi. Sementara itu, Kabupaten Bekasi memiliki IR terendah. Rata-rata IR Provinsi Jawa Barat sebesar 133,5 kasus per 10.000 penduduk, dengan beberapa kota berada jauh di atas nilai rata-rata tersebut. Secara umum, wilayah perkotaan cenderung memiliki IR yang lebih tinggi dibandingkan sebagian besar wilayah kabupaten.

jabar <- jabar %>%
  mutate(
    kategori_IR = cut(
      IR,
      breaks = c(-Inf, 100, 150, 200, 300, Inf),
      labels = c(
        "<100",
        "100-150",
        "151-200",
        "201-300",
        ">300"
      )
    )
  )

peta_ir <- ggplot(jabar) +
  
  geom_sf(
    aes(fill = kategori_IR),
    color = "white",
    linewidth = 0.3
  ) +
  
  scale_fill_brewer(
    palette = "YlOrRd",
    name = "IR\nper 10.000"
  ) +
  
  labs(
    title = "Peta Incidence Rate (IR) Diare",
    subtitle = "Kabupaten/Kota Jawa Barat Tahun 2024",
    caption = "IR = Kasus Diare per 10.000 Penduduk"
  ) +
  
  theme_minimal() +
  
  theme(
    axis.text = element_blank(),
    axis.title = element_blank(),
    panel.grid = element_blank(),
    plot.title = element_text(
      face = "bold",
      hjust = 0.5
    )
  )

print(peta_ir)

Gambar 2. Peta Choropleth Incidence Rate (IR) Diare

Interpretasi:

Berdasarkan Gambar 2, sebaran spasial Incidence Rate (IR) diare di Jawa Barat tahun 2024 tidak merata antarwilayah. Wilayah dengan kategori IR sangat tinggi (>300 kasus per 10.000 penduduk) terkonsentrasi pada beberapa kota, terutama Kota Cirebon, Kota Bogor, dan Kota Sukabumi. Sebagian besar kabupaten berada pada kategori rendah hingga sedang. Pola ini menunjukkan adanya perbedaan tingkat kejadian diare antarwilayah yang mengindikasikan kemungkinan adanya pengaruh faktor-faktor lokal dan spasial.


b. 3.3.2 Standardized Incidence Ratio (SIR)

p_sir <- df %>%
  mutate(
    nama_kab = reorder(nama_kab, SIR),
    warna    = case_when(
      SIR >= 2   ~ "#c0392b",
      SIR >= 1   ~ "#e67e22",
      SIR >= 0.5 ~ "#27ae60",
      TRUE       ~ "#2980b9"
    )
  ) %>%
  ggplot(aes(x = SIR, y = nama_kab, fill = warna)) +
  geom_col(alpha = 0.85) +
  geom_vline(xintercept = 1, linetype = "dashed",
             color = "black", linewidth = 1) +
  scale_fill_identity(
    guide  = "legend",
    labels = c("#c0392b" = "Sangat Tinggi (≥2)",
               "#e67e22" = "Tinggi (1–2)",
               "#27ae60" = "Rendah (0.5–1)",
               "#2980b9" = "Sangat Rendah (<0.5)"),
    breaks = c("#c0392b","#e67e22","#27ae60","#2980b9")
  ) +
  labs(
    title    = "Standardized Incidence Ratio (SIR) Diare",
    subtitle = "Jawa Barat 2024 | Garis = SIR 1.0 (rata-rata provinsi)",
    x        = "SIR",
    y        = NULL,
    fill     = "Kategori Risiko"
  ) +
  theme_minimal(base_size = 10) +
  theme(
    plot.title          = element_text(face = "bold", size = 12),
    panel.grid.major.y  = element_blank(),
    legend.position     = "bottom"
  )
print(p_sir)

Gambar 3. Diagram Batang Standardized Incidence Ratio (SIR) Diare

Interpretasi:

Berdasarkan Gambar 3, nilai Standardized Incidence Ratio (SIR) diare di Jawa Barat tahun 2024 menunjukkan variasi antar kabupaten/kota. Kota Cirebon memiliki nilai SIR tertinggi, diikuti oleh Kota Bogor dan Kota Sukabumi. Nilai SIR di atas 1 menunjukkan bahwa jumlah kasus diare yang terjadi lebih tinggi dibandingkan jumlah kasus yang diharapkan berdasarkan rata-rata provinsi. Sebaliknya, Kabupaten Bekasi memiliki nilai SIR terendah dengan nilai di bawah 1, yang menunjukkan bahwa jumlah kasus yang terjadi lebih rendah dibandingkan jumlah kasus yang diharapkan. Secara umum, sebagian besar kota memiliki nilai SIR yang lebih tinggi dibandingkan kabupaten, mengindikasikan risiko kejadian diare yang relatif lebih besar pada wilayah tersebut.


peta_sir <- ggplot(jabar) +
  
  geom_sf(
    aes(fill = kategori_SIR),
    color = "white",
    linewidth = 0.3
  ) +
  
  scale_fill_manual(
    values = c(
      "<0.80"     = "#4575B4",
      "0.80-0.99" = "#91BFDB",
      "1.00-1.19" = "#FFFFBF",
      "1.20-1.49" = "#FC8D59",
      ">=1.50"    = "#D73027"
    ),
    name = "Kategori SIR"
  ) +
  
  labs(
    title = "Peta Standardized Incidence Ratio (SIR)",
    subtitle = "Kabupaten/Kota Jawa Barat Tahun 2024",
    caption = "SIR = Observed Cases / Expected Cases"
  ) +
  
  theme_minimal() +
  
  theme(
    axis.text = element_blank(),
    axis.title = element_blank(),
    panel.grid = element_blank(),
    plot.title = element_text(
      face = "bold",
      hjust = 0.5
    )
  )

print(peta_sir)

Gambar 4. Peta Choropleth Standardized Incidence Ratio (SIR) Diare

Interpretasi:

Berdasarkan Gambar 4, distribusi spasial nilai SIR diare di Jawa Barat tahun 2024 menunjukkan adanya perbedaan tingkat risiko antarwilayah. Wilayah dengan kategori SIR tinggi (≥1,50) terkonsentrasi pada beberapa kota, terutama Kota Cirebon, Kota Bogor, dan Kota Sukabumi. Nilai SIR yang tinggi menunjukkan bahwa jumlah kasus diare yang diamati jauh lebih besar dibandingkan jumlah kasus yang diharapkan. Sebaliknya, beberapa wilayah berada pada kategori SIR rendah (<0,80), yang menunjukkan jumlah kasus lebih rendah dibandingkan nilai yang diharapkan. Pola ini mengindikasikan adanya variasi risiko kejadian diare antar kabupaten/kota sehingga diperlukan analisis spasial lanjutan untuk mengidentifikasi kemungkinan pengelompokan wilayah berisiko tinggi.


3.4 Analisis Spasial (Morans’I dan LISA)

3.4.1 Global Moran’s I

Tabel 4. Hasil Uji Global Moran’s I

# Bangun matriks pembobot spasial (Queen contiguity)
  nb <- poly2nb(jabar, queen = TRUE)
  lw <- nb2listw(nb, style = "W", zero.policy = TRUE)

  
moran_ir <- moran.test(jabar$IR, lw, zero.policy = TRUE,
                         na.action = na.omit)
hasil_moran <- data.frame(
  Statistik = c(
    "Moran's I",
    "Expected Moran's I",
    "Variance",
    "Z-score",
    "p-value"
  ),
  Nilai = c(
    moran_ir$estimate[1],
    moran_ir$estimate[2],
    moran_ir$estimate[3],
    moran_ir$statistic,
    moran_ir$p.value
  )
)

kable(
  hasil_moran,row.names = FALSE)
Statistik Nilai
Moran’s I 0.0597445
Expected Moran’s I -0.0384615
Variance 0.0170655
Z-score 0.7517591
p-value 0.2260980

Interpretasi:

Berdasarkan hasil uji Moran’s I pada Tabel 3, diperoleh nilai Moran’s I sebesar 0,0597 yang menunjukkan adanya kecenderungan autokorelasi spasial positif yang sangat lemah pada kejadian diare antar kabupaten/kota di Jawa Barat tahun 2024. Nilai tersebut lebih besar dibandingkan nilai ekspektasi Moran’s I sebesar -0,0385, namun nilai autokorelasi yang terbentuk relatif kecil. Hasil pengujian statistik menunjukkan nilai Z-score sebesar 0,7518 dengan p-value sebesar 0,2261 (p > 0,05). Dengan demikian, tidak terdapat bukti yang cukup untuk menolak hipotesis nol, sehingga dapat disimpulkan bahwa tidak terdapat autokorelasi spasial global yang signifikan pada distribusi kasus diare di Jawa Barat tahun 2024. Dengan kata lain, pola penyebaran kasus diare antar kabupaten/kota cenderung tidak membentuk pola pengelompokan (cluster) maupun penyebaran yang signifikan secara global.


  moran.plot(
    jabar$IR, lw,
    zero.policy = TRUE,
    labels      = as.character(jabar$nama_kab),
    main        = "Moran Scatterplot – IR Diare Jawa Barat 2024",
    xlab        = "IR (standardized)",
    ylab        = "Spatial Lag IR"
  )

Gambar 5. Moran’s Scatterplot

Interpretasi:

Berdasarkan Gambar 5, Moran Scatterplot menunjukkan kecenderungan autokorelasi spasial positif yang lemah pada nilai Incidence Rate (IR) diare di Jawa Barat tahun 2024. Hal ini ditunjukkan oleh kemiringan garis regresi yang positif, namun relatif landai. Beberapa wilayah seperti Kota Cirebon dan Kota Sukabumi berada pada kelompok wilayah dengan nilai IR tinggi, sedangkan Kabupaten Cirebon menunjukkan pola yang berbeda dibandingkan wilayah di sekitarnya. Secara umum, sebagian besar kabupaten/kota tersebar di sekitar nilai rata-rata, sehingga tidak terlihat adanya pengelompokan spasial yang kuat. Hasil ini sejalan dengan uji Moran’s I yang menunjukkan bahwa autokorelasi spasial global tidak signifikan.


3.4.2 Local Moran’s I (LISA)

  local_moran <- localmoran(jabar$IR, lw, zero.policy = TRUE)
  
  jabar$Ii      <- local_moran[, 1]
  jabar$Z_Ii    <- local_moran[, 4]
  jabar$p_lisa  <- local_moran[, 5]
  
  # Klasifikasi klaster LISA
  IR_std  <- scale(jabar$IR)[, 1]
  lag_IR  <- lag.listw(lw, IR_std, zero.policy = TRUE)
  
  jabar$LISA_cluster <- "Not Significant"
  jabar$LISA_cluster[IR_std > 0 & lag_IR > 0 & jabar$p_lisa < 0.05] <- "High-High"
  jabar$LISA_cluster[IR_std < 0 & lag_IR < 0 & jabar$p_lisa < 0.05] <- "Low-Low"
  jabar$LISA_cluster[IR_std > 0 & lag_IR < 0 & jabar$p_lisa < 0.05] <- "High-Low"
  jabar$LISA_cluster[IR_std < 0 & lag_IR > 0 & jabar$p_lisa < 0.05] <- "Low-High"
  
  # Peta LISA
  warna_lisa <- c(
    "High-High"       = "#e74c3c",
    "Low-Low"         = "#3498db",
    "High-Low"        = "#e67e22",
    "Low-High"        = "#85c1e9",
    "Not Significant" = "grey85"
  )
  
  p_lisa <- ggplot(jabar) +
    geom_sf(aes(fill = LISA_cluster), color = "white", linewidth = 0.3) +
    scale_fill_manual(
      values = warna_lisa,
      name   = "Klaster LISA"
    ) +
    labs(
      title    = "Peta Klaster LISA – IR Diare Jawa Barat 2024",
      subtitle = "Signifikansi p < 0.05 | Queen Contiguity Weights",
      caption  = "Sumber: Open Data Jabar 2024"
    ) +
    theme_minimal(base_size = 11) +
    theme(
      plot.title    = element_text(face = "bold", size = 13),
      legend.position = "right"
    )
  print(p_lisa)

Gambar 6. Peta Klaster LISA

Interpretasi:

Berdasarkan Gambar 6, hasil analisis Local Indicators of Spatial Association (LISA) menunjukkan bahwa tidak terdapat klaster spasial yang signifikan pada tingkat signifikansi 5% (p < 0,05) untuk nilai Incidence Rate (IR) diare di kabupaten/kota Provinsi Jawa Barat tahun 2024. Seluruh wilayah dikategorikan sebagai Not Significant, yang menunjukkan bahwa tidak ditemukan pola pengelompokan lokal berupa klaster High-High (HH), Low-Low (LL), maupun outlier spasial High-Low (HL) dan Low-High (LH). Hasil ini mengindikasikan bahwa distribusi kejadian diare di Jawa Barat tahun 2024 tidak menunjukkan adanya pengelompokan spasial lokal yang signifikan antar kabupaten/kota. Temuan tersebut sejalan dengan hasil uji Moran’s I yang juga menunjukkan tidak adanya autokorelasi spasial global yang signifikan.


3.5 UJi Overdispersi dan VIF

3.5.1 UJi Overdispersi

Tabel 5. Hasil Uji Overdispersi

# Variance-to-Mean Ratio (VMR)
vmr <- var(df$diare, na.rm = TRUE) /
       mean(df$diare, na.rm = TRUE)

tabel_vmr <- data.frame(
  Statistik = c(
    "Rata-rata Kasus",
    "Varians Kasus",
    "Variance-to-Mean Ratio (VMR)"
  ),
  Nilai = c(
    mean(df$diare, na.rm = TRUE),
    var(df$diare, na.rm = TRUE),
    vmr
  )
)

kable(tabel_vmr)
Statistik Nilai
Rata-rata Kasus 24899.52
Varians Kasus 152153494.80
Variance-to-Mean Ratio (VMR) 6110.70

Interpretasi:

Hasil analisis menunjukkan terjadinya overdispersi pada model regresi Poisson, dengan nilai Variance-to-Mean Ratio (VMR) sebesar 6110,70 (Var>Mean). Fenomena ini signifikan secara statistik berdasarkan Z Statistic sebesar 3,816 dengan p-value 0,0000679 (p<0,05), sehingga hipotesis equidispersion ditolak. Pelanggaran asumsi ini menyebabkan regresi Poisson standar menjadi tidak efisien karena menghasilkan standard error yang terlalu kecil (underestimated) dan memicu signifikansi semu. Oleh karena itu, untuk mengatasi overdispersi dan menjamin estimasi parameter yang valid, analisis dialihkan menggunakan model Regresi Binomial Negatif.


3.5.2 Multikolinearitas

Tabel 6. Hasil Uji Multikolinearitas

m_vif <- lm(
  log1p(diare) ~
    faskes_std + air_std + sanitasi_std +
    ipm_std + kemiskinan_std + kepadatan_std,
  data = df
)

vif_vals <- vif(m_vif)

tabel_vif <- data.frame(
  Variabel = names(vif_vals),
  VIF = as.numeric(vif_vals)
)

kable(
  tabel_vif,
  digits = 3)
Variabel VIF
faskes_std 1.220
air_std 2.036
sanitasi_std 1.235
ipm_std 7.542
kemiskinan_std 3.186
kepadatan_std 7.246

Interpretasi:

Evaluasi terhadap asumsi non-multikolinieritas dilakukan dengan mengamati nilai Variance Inflation Factor (VIF) pada masing-masing variabel prediktor. Secara teoretis, gejala multikolinieritas dianggap tidak menjadi masalah yang mengganggu estimasi model apabila nilai VIF lebih kecil dari 10 (atau dalam kriteria yang lebih ketat, lebih kecil dari 5). Hasil analisis menunjukkan bahwa variabel faskes (1,220), air minum (2,036), sanitasi (1,235), dan kemiskinan (3,186) memiliki nilai VIF yang sangat aman di bawah 5. Di sisi lain, variabel ipm_std dan kepadatan menunjukkan nilai VIF yang relatif lebih tinggi, masing-masing sebesar 7,542 dan 7,246. Tingginya nilai VIF pada kedua variabel ini mengindikasikan adanya korelasi moderat yang wajar, mengingat indikator pembangunan manusia (IPM) dan kepadatan penduduk secara empiris sering kali saling berkaitan dalam studi sosio-ekonomi. Karena tidak ada variabel yang memiliki nilai VIF melebihi batas kritis 10 (VIF < 10), maka dapat disimpulkan bahwa model regresi ini bebas dari masalah multikolinieritas yang serius.


3.6 Regresi Negative Binomial

Tabel 7. Perbandingan Model Negative Binomial

# Model 1: tanpa kemiskinan & kepadatan
m1 <- glm.nb(
  diare ~
    faskes_std + air_std + sanitasi_std + ipm_std +
    offset(ln_penduduk),
  data = df
)

# Model 2: tambah kemiskinan
m2 <- glm.nb(
  diare ~
    faskes_std + air_std + sanitasi_std + ipm_std +
    kemiskinan_std +
    offset(ln_penduduk),
  data = df
)

# Model 3: lengkap (semua prediktor)
m3 <- glm.nb(
  diare ~
    faskes_std + air_std + sanitasi_std + ipm_std +
    kemiskinan_std + kepadatan_std +
    offset(ln_penduduk),
  data = df
)

tabel_model <- data.frame(
  Model = c(
    "Model 1 (4 prediktor)",
    "Model 2 (5 prediktor)",
    "Model 3 (6 prediktor)"
  ),
  `Jumlah Parameter` = c(
    length(coef(m1)) + 1,
    length(coef(m2)) + 1,
    length(coef(m3)) + 1
  ),
  LogLik = c(
    as.numeric(logLik(m1)),
    as.numeric(logLik(m2)),
    as.numeric(logLik(m3))
  ),
  AIC = c(
    AIC(m1),
    AIC(m2),
    AIC(m3)
  ),
  BIC = c(
    BIC(m1),
    BIC(m2),
    BIC(m3)
  ),
  Theta = c(
    m1$theta,
    m2$theta,
    m3$theta
  )
)

kable(
  tabel_model,
  digits = 4,
  caption = "Perbandingan Model Regresi Binomial Negatif"
)
Perbandingan Model Regresi Binomial Negatif
Model Jumlah.Parameter LogLik AIC BIC Theta
Model 1 (4 prediktor) 6 -277.7997 567.5995 575.3745 9.6173
Model 2 (5 prediktor) 7 -277.7179 569.4357 578.5066 9.6741
Model 3 (6 prediktor) 8 -274.4831 564.9662 575.3329 12.2077

Interpretasi:

Berdasarkan Tabel 7, pemilihan model terbaik dari ketiga alternatif model Negative Binomial dilakukan dengan membandingkan nilai Akaike Information Criterion (AIC), Bayesian Information Criterion (BIC), dan Log-Likelihood. Model yang ideal adalah model yang memiliki nilai AIC dan BIC terendah, serta nilai Log-Likelihood tertinggi (paling mendekati nol). Hasil estimasi menunjukkan bahwa Model 3 (dengan 8 parameter) memiliki nilai AIC terendah sebesar 564,97 dan nilai BIC terendah sebesar 575,33. Konsisten dengan hal tersebut, Model 3 juga menghasilkan nilai Log-Likelihood tertinggi, yaitu sebesar -274,48. Selain itu, nilai parameter dispersi (Theta) pada Model 3 adalah yang terbesar, yakni 12,208, yang menunjukkan kemampuan model yang lebih baik dalam mengatasi overdispersion pada data. Oleh karena itu, Model 3 dipilih sebagai model terbaik dan paling fit untuk analisis data selanjutnya. Berikut adalah tabel hasil regresi negative binomial pada model 3.


Tabel 8. Hasil Regresi Negative Binomial Model 3

fitted_vals   <- fitted(m3)
cor_obs_fit   <- cor(df$diare, fitted_vals)
sm3   <- summary(m3)
ci3   <- suppressMessages(confint(m3))
coef3 <- coef(m3)
pval3 <- sm3$coefficients[,4]

var_labels <- c(
  "(Intercept)"    = "(Intercept)",
  "faskes_std"     = "Log Faskes (std)",
  "air_std"        = "Air Bersih (std)",
  "sanitasi_std"   = "Sanitasi (std)",
  "ipm_std"        = "IPM (std)",
  "kemiskinan_std" = "Log Garis Kemiskinan (std)",
  "kepadatan_std"  = "Log Kepadatan (std)"
)

tabel_irr <- data.frame(
  Variabel = var_labels[names(coef3)],
  Beta     = coef3,
  SE       = sm3$coefficients[,2],
  z        = sm3$coefficients[,3],
  p_value  = pval3,
  IRR      = exp(coef3),
  CI_bawah = exp(ci3[,1]),   # ← ganti nama
  CI_atas  = exp(ci3[,2]),   # ← ganti nama
  Sig      = symnum(
    pval3,
    cutpoints = c(0,0.001,0.01,0.05,0.1,1),
    symbols   = c("***","**","*","."," "),
    legend    = FALSE
  )
)

kable(
  tabel_irr,
  digits = 4, row.names = FALSE)
Variabel Beta SE z p_value IRR CI_bawah CI_atas Sig
(Intercept) -4.1571 0.0551 -75.4489 0.0000 0.0157 0.0141 0.0175 ***
Log Faskes (std) -0.3234 0.0620 -5.2136 0.0000 0.7237 0.6361 0.8210 ***
Air Bersih (std) 0.0112 0.0801 0.1395 0.8890 1.0112 0.8623 1.1843
Sanitasi (std) -0.0113 0.0624 -0.1806 0.8567 0.9888 0.8735 1.1107
IPM (std) -0.3571 0.1542 -2.3160 0.0206 0.6997 0.5238 0.9383 *
Log Garis Kemiskinan (std) -0.1174 0.1002 -1.1711 0.2415 0.8893 0.7270 1.0888
Log Kepadatan (std) 0.3993 0.1511 2.6420 0.0082 1.4908 1.1156 1.9943 **

Interpretasi:

Berdasarkan hasil tabel diatas diperoleh tiga prediktor menunjukkan pengaruh signifikan terhadap jumlah kasus diare:

  1. Log Fasilitas Kesehatan: IRR = 0,724 (95% CI: 0,636–0,821; p < 0,001). Setiap kenaikan 1 SD log-faskes menurunkan expected kasus sebesar 27,6%. Ini merupakan faktor protektif terkuat dan paling signifikan.

  2. IPM : IRR = 0,700 (95% CI: 0,524–0,938; p = 0,021). Setiap kenaikan 1 SD IPM menurunkan expected kasus sebesar 30,0%. IPM mencerminkan dimensi kesehatan, pendidikan, dan daya beli yang secara holistik melindungi dari penyakit berbasis lingkungan.

  3. Log Kepadatan Penduduk : IRR = 1,491 (95% CI: 1,116–1,994; p = 0,008). Setiap kenaikan 1 SD log-kepadatan meningkatkan expected kasus sebesar 49,1%. Kepadatan tinggi mempercepat transmisi fecal-oral.

Tiga prediktor lain akses air bersih (p = 0,889), sanitasi (p = 0,857), dan garis kemiskinan (p = 0,242) tidak menunjukkan pengaruh signifikan secara statistik. Goodness-of-fit test menghasilkan p = 0,168 > 0,05, mengkonfirmasi Model 3 memiliki fit yang baik.


# Forest plot - ganti nama kolom di aes()
irr_plot <- tabel_irr %>%
  filter(Variabel != "(Intercept)") %>%
  mutate(
    Variabel = factor(Variabel, levels = rev(Variabel)),
    sig_col  = ifelse(trimws(Sig) %in% c("***","**","*"), "Signifikan", "Tidak Signifikan")
  )

p_irr <- ggplot(irr_plot, aes(x = IRR, y = Variabel, color = sig_col)) +
  geom_vline(xintercept = 1, linetype = "dashed",
             color = "gray40", linewidth = 0.9) +
  geom_errorbarh(aes(xmin = CI_bawah, xmax = CI_atas),   # ← nama baru
                 height = 0.25, linewidth = 0.9) +
  geom_point(size = 4.5) +
  geom_text(aes(label = paste0("IRR=", round(IRR,3), " ", trimws(Sig))),
            hjust = -0.15, size = 3, color = "black") +
  scale_color_manual(
    values = c("Signifikan" = "#e74c3c", "Tidak Signifikan" = "gray55"),
    name   = NULL
  ) +
  scale_x_continuous(
    limits = c(
      min(irr_plot$CI_bawah) * 0.85,   # ← nama baru
      max(irr_plot$CI_atas)  * 1.2     # ← nama baru
    )
  ) +
  labs(
    title    = "Forest Plot Incidence Rate Ratio (IRR) – Model Negative Binomial 3",
    subtitle = "Titik merah = signifikan (p < 0.05) | Garis = 95% CI",
    x        = "IRR (Incidence Rate Ratio)",
    y        = NULL
  ) +
  theme_minimal(base_size = 11) +
  theme(
    plot.title         = element_text(face = "bold", size = 12),
    panel.grid.major.y = element_blank(),
    legend.position    = "bottom"
  )
print(p_irr)

Gambar 7. Forest Plot IRR

Interpretasi:

Hasil estimasi Model Regresi Binomial Negatif 3 menunjukkan pengaruh variabel prediktor terhadap Incidence Rate Ratio (IRR) kasus diare. Berdasarkan plot, terdapat tiga variabel yang berpengaruh signifikan secara statistik terhadap incidence rate kasus diare (p < 0,05), yaitu Log Faskes, IPM, dan Log Kepadatan Penduduk. Sementara itu, variabel Air Bersih, Sanitasi, dan Log Garis Kemiskinan tidak menunjukkan pengaruh yang signifikan (p >= 0,05) karena interval kepercayaan 95% melewati nilai 1.Variabel Log Faskes memiliki nilai IRR sebesar 0,724, yang berarti setiap kenaikan satu satuan standar Log Faskes diasosiasikan dengan penurunan incidence rate kasus diare sebesar 27,6% (1 - 0,724), dengan asumsi variabel lain konstan. Variabel IPM juga memiliki pengaruh protektif yang signifikan dengan nilai IRR sebesar 0,71, menunjukkan bahwa peningkatan satu satuan standar IPM berkaitan dengan penurunan incidence rate kasus diare sebesar 29%. Sebaliknya, Log Kepadatan Penduduk bertindak sebagai faktor risiko yang signifikan dengan nilai IRR sebesar 1,491. Hal ini mengindikasikan bahwa setiap kenaikan satu satuan standar Log Kepadatan Penduduk meningkatkan incidence rate kasus diare sebesar 49,1%.


Tabel 9. Hasil Diagnostik Model 3

tabel_fit <- data.frame(
  Indikator = c(
    "Korelasi Observed-Fitted",
    "Persentase Variasi Terjelaskan"
  ),
  Nilai = c(
    cor_obs_fit,
    cor_obs_fit^2 * 100
  )
)

kable(
  tabel_fit,
  digits = 2,
  caption = "Kemampuan Prediksi Model"
)
Kemampuan Prediksi Model
Indikator Nilai
Korelasi Observed-Fitted 0.86
Persentase Variasi Terjelaskan 73.74

Interpretasi:

Hasil evaluasi kemampuan prediksi model menunjukkan kinerja pemodelan yang sangat baik. Nilai Korelasi Observed-Fitted sebesar 0,86 mengindikasikan adanya hubungan linier yang kuat antara nilai aktual yang diamati di lapangan dengan nilai yang diprediksi oleh model. Selain itu, indikator Persentase Variasi Terjelaskan menunjukkan nilai sebesar 73,74%, yang berarti bahwa variabel-variabel prediktor di dalam model mampu menjelaskan sekitar 73,74% total variasi dari variabel dependen kasus diare. Sementara itu, sisanya sebesar 26,26% dijelaskan oleh faktor-faktor lain di luar model. Kombinasi kedua nilai ini menegaskan bahwa model yang dibangun memiliki tingkat kebaikan suai (goodness of fit) serta daya prediksi yang tinggi dan valid untuk digunakan.


4 Pembahasan

4.1 Pola Distribusi Risiko Diare

Berdasarkan hasil analisis data, beban penyakit diare menunjukkan variasi spasial yang signifikan di antara kabupaten dan kota di Provinsi Jawa Barat. Kota Cirebon tercatat sebagai wilayah dengan nilai Incidence Rate (IR) tertinggi, yakni mencapai 442,83 kasus per 10.000 penduduk. Wilayah tersebut juga memiliki nilai Standardized Incidence Ratio (SIR) sebesar 3,32, yang mengindikasikan bahwa jumlah kasus riil di lapangan meningkat lebih dari tiga kali lipat dibandingkan dengan estimasi yang diharapkan berdasarkan rata-rata provinsi. Tren risiko SIR yang relatif tinggi ini juga teridentifikasi di Kota Bogor dan Kota Sukabumi.

Besarnya tingkat risiko diare di kawasan perkotaan tersebut kemungkinan dipengaruhi oleh tingginya kepadatan penduduk, yang mempercepat transmisi patogen melalui rute fekal-oral. Selain faktor demografi, ketersediaan infrastruktur pelayanan kesehatan serta mekanisme pelaporan data yang lebih optimal di area perkotaan turut berkontribusi terhadap tingginya cakupan deteksi dan pencatatan kasus diare jika dibandingkan dengan wilayah lainnya.

Sebaliknya, beberapa kawasan metropolitan seperti Kota Bandung dan Kota Bekasi justru menunjukkan nilai IR dan SIR yang berada di bawah rata-rata capaian provinsi. Kondisi ini disinyalir berkaitan dengan kualitas sanitasi lingkungan, kemudahan akses air bersih, kualitas pelayanan medis, serta indeks pembangunan manusia yang relatif lebih maju. Sementara itu, Kabupaten Bekasi mencatatkan nilai IR dan SIR paling rendah dalam penelitian ini, yang mencerminkan bahwa akumulasi kasus diare aktual di wilayah tersebut berada di bawah angka yang diproyeksikan.

4.2 Pola Spasial

Hasil analisis spasial menunjukkan bahwa tidak terdapat autokorelasi spasial global yang signifikan pada kejadian diare di Jawa Barat tahun 2024, sebagaimana ditunjukkan oleh nilai Moran’s I sebesar 0,060 dengan nilai p sebesar 0,226. Selain itu, analisis Local Indicators of Spatial Association (LISA) juga tidak menemukan klaster spasial yang signifikan pada tingkat signifikansi 5%.

Temuan ini menunjukkan bahwa distribusi risiko diare antar kabupaten/kota tidak membentuk pola pengelompokan geografis yang jelas. Dengan demikian, variasi kejadian diare di Jawa Barat kemungkinan lebih dipengaruhi oleh karakteristik masing-masing wilayah, seperti kondisi sosial ekonomi, perilaku kesehatan masyarakat, kualitas surveilans, serta akses terhadap pelayanan kesehatan, dibandingkan oleh faktor kedekatan geografis antarwilayah. Oleh karena itu, upaya pengendalian diare perlu difokuskan pada karakteristik risiko spesifik di setiap wilayah, bukan semata-mata berdasarkan kedekatan lokasi geografis.

4.3 Faktor yang Berpengaruh

Hasil analisis regresi Binomial Negatif menunjukkan bahwa beberapa faktor lingkungan dan sosial ekonomi memiliki pengaruh signifikan terhadap jumlah kasus diare. Ketersediaan fasilitas kesehatan terbukti sebagai faktor protektif yang signifikan terhadap kejadian diare (IRR = 0,724; p < 0,001). Temuan ini mengindikasikan bahwa peningkatan ketersediaan fasilitas kesehatan berpotensi menurunkan jumlah kasus diare melalui peningkatan deteksi dini, perbaikan penatalaksanaan kasus, serta perluasan akses masyarakat terhadap pelayanan kesehatan dasar.

Selain itu, Indeks Pembangunan Manusia (IPM) juga menunjukkan pengaruh protektif yang signifikan (IRR = 0,700; p = 0,021). Hal ini menunjukkan bahwa wilayah dengan tingkat pembangunan manusia yang lebih tinggi cenderung memiliki beban diare yang lebih rendah. Kondisi tersebut dapat dijelaskan oleh meningkatnya tingkat pendidikan, status kesehatan, dan kesejahteraan masyarakat yang mendukung penerapan perilaku hidup bersih dan sehat serta peningkatan akses terhadap sanitasi yang layak.

Sebaliknya, kepadatan penduduk ditemukan sebagai faktor risiko yang signifikan terhadap peningkatan kasus diare (IRR = 1,491; p = 0,008). Temuan ini mengindikasikan bahwa wilayah dengan tingkat kepadatan penduduk yang lebih tinggi memiliki risiko penularan penyakit yang lebih besar akibat meningkatnya interaksi antarindividu serta tekanan terhadap ketersediaan infrastruktur sanitasi dan lingkungan.

Sementara itu, variabel akses air bersih dan sanitasi tidak menunjukkan hubungan yang signifikan dalam model. Kondisi ini diduga disebabkan oleh relatif homogennya cakupan akses antarwilayah sehingga variasi data menjadi terbatas. Selain itu, indikator yang digunakan lebih merepresentasikan aspek ketersediaan layanan, bukan kualitas atau keberlanjutan akses yang diterima oleh masyarakat.

4.4 Justifikasi Model Negative Binomial

Pemilihan model regresi Binomial Negatif dalam penelitian ini didasarkan pada adanya indikasi kuat overdispersi pada data kasus diare. Hal ini ditunjukkan oleh nilai Variance-to-Mean Ratio (VMR) yang jauh lebih besar dari satu, serta hasil uji dispersi Cameron dan Trivedi yang signifikan (p < 0,001). Selain itu, nilai devians pada model Poisson juga menunjukkan ketidaksesuaian model terhadap struktur data.

Kondisi tersebut menunjukkan bahwa asumsi kesetaraan antara rata-rata dan varians pada model Poisson tidak terpenuhi. Oleh karena itu, penggunaan model Binomial Negatif menjadi lebih tepat karena mampu mengakomodasi varians yang lebih besar dari rata-rata (overdispersi), sehingga menghasilkan estimasi parameter dan standard error yang lebih reliabel. Dengan demikian, model ini memberikan inferensi statistik yang lebih valid dalam menganalisis determinan kasus diare.

4.5 Keterbatasan Penelitian

Penelitian ini memiliki beberapa keterbatasan yang perlu diperhatikan dalam menginterpretasikan hasil.

  1. Desain penelitian yang digunakan adalah potong lintang (cross-sectional), sehingga tidak memungkinkan penarikan kesimpulan kausal antara variabel determinan dan kejadian diare.
  2. Analisis dilakukan pada tingkat agregat wilayah, sehingga terdapat potensi terjadinya ecological fallacy apabila hasil penelitian diinterpretasikan pada tingkat individu.
  3. Kemungkinan adanya under-reporting kasus diare masih dapat terjadi, mengingat tidak seluruh kasus tercatat secara lengkap dalam sistem pelaporan kesehatan.
  4. Jumlah unit analisis yang relatif terbatas dapat memengaruhi kekuatan statistik dalam mendeteksi hubungan antarvariabel, sehingga beberapa asosiasi mungkin tidak teridentifikasi secara optimal.
  5. Ketiadaan data temporal yang lebih rinci, seperti data bulanan atau musiman, membatasi analisis dalam mengevaluasi variasi spasio-temporal kejadian diare sepanjang tahun.

5 Kesimpulan dan Saran

5.1 Kesimpulan

Berdasarkan analisis epidemiologi kasus diare di Provinsi Jawa Barat tahun 2024 pada 27 kabupaten/kota, diperoleh beberapa kesimpulan utama. Secara umum, angka insidens (IR) diare di Jawa Barat sebesar 133,54 per 10.000 penduduk dengan total 672.287 kasus. Terdapat disparitas yang cukup besar antarwilayah, di mana Kota Cirebon menunjukkan IR tertinggi sebesar 442,83 per 10.000 penduduk dengan SIR sebesar 3,32, diikuti oleh Kota Bogor (321,38; SIR = 2,41) dan Kota Sukabumi (311,29; SIR = 2,33). Secara keseluruhan, sebanyak 17 dari 27 wilayah (63%) memiliki beban kasus yang lebih tinggi dibandingkan rata-rata provinsi (SIR ≥ 1,0).

  1. Analisis spasial menunjukkan bahwa tidak terdapat autokorelasi spasial yang signifikan (Moran’s I = 0,060; p = 0,226). Temuan ini diperkuat oleh tidak ditemukannya klaster signifikan pada analisis Local Indicators of Spatial Association (LISA). Dengan demikian, distribusi angka insidens diare di Jawa Barat dapat dikatakan bersifat acak secara geografis, sehingga pendekatan model regresi non-spasial dianggap memadai untuk analisis inferensial.
  2. Selanjutnya, indikasi overdispersi pada data terbukti secara kuat melalui nilai Variance-to-Mean Ratio (VMR = 6.110,70), dispersion estimate (1.656,22), serta hasil uji yang signifikan (p < 0,001). Kondisi ini menegaskan ketidaksesuaian asumsi model Poisson dan memberikan justifikasi penggunaan regresi Binomial Negatif dalam analisis.
  3. Hasil pemodelan menunjukkan bahwa Model Binomial Negatif terbaik (Model 3; AIC = 564,97) mengidentifikasi tiga variabel yang berpengaruh signifikan. Ketersediaan fasilitas kesehatan merupakan faktor protektif yang paling kuat (IRR = 0,724; p < 0,001), diikuti oleh Indeks Pembangunan Manusia (IPM) sebagai faktor protektif (IRR = 0,700; p = 0,021). Sebaliknya, kepadatan penduduk merupakan faktor risiko yang signifikan terhadap peningkatan kasus diare (IRR = 1,491; p = 0,008).
  4. Sementara itu, variabel akses sanitasi, akses air bersih, dan garis kemiskinan tidak menunjukkan pengaruh yang signifikan dalam model multivariat. Hal ini diduga berkaitan dengan adanya efek ambang (threshold effect), keterbatasan variasi data antarwilayah, serta kemungkinan adanya multikolinearitas antarvariabel sosial ekonomi.

5.2 Saran

Berdasarkan temuan penelitian, beberapa rekomendasi yang dapat diajukan adalah sebagai berikut.

  1. Diperlukan prioritas intervensi komprehensif pada wilayah dengan beban diare tinggi, khususnya Kota Cirebon, Kota Bogor, dan Kota Sukabumi yang memiliki SIR ≥ 2,0. Intervensi tersebut mencakup audit menyeluruh terhadap kualitas air minum, kondisi infrastruktur sanitasi, serta sistem pengelolaan limbah untuk mengidentifikasi sumber risiko utama secara lebih spesifik.
  2. Penguatan kapasitas dan ketersediaan fasilitas kesehatan perlu menjadi fokus utama pada wilayah dengan rasio fasilitas kesehatan rendah dan insidens tinggi. Sebagai contoh, Kota Cirebon dengan jumlah fasilitas kesehatan yang relatif terbatas dibandingkan jumlah penduduk memerlukan peningkatan akses layanan kesehatan dasar sebagai strategi intervensi yang relatif efisien namun berdampak signifikan.
  3. Program peningkatan Indeks Pembangunan Manusia (IPM) perlu diintegrasikan dengan strategi pengendalian diare, terutama melalui peningkatan pendidikan kesehatan masyarakat, literasi perilaku hidup bersih dan sehat, serta peningkatan daya beli rumah tangga. Hal ini penting mengingat IPM terbukti sebagai faktor protektif yang bersifat multidimensional.
  4. Penguatan sistem surveilans epidemiologi perlu dilakukan pada wilayah dengan beban diare tinggi untuk meningkatkan kelengkapan (completeness) dan akurasi pelaporan kasus. Hal ini penting guna memastikan bahwa gambaran epidemiologi yang dihasilkan lebih representatif terhadap kondisi sebenarnya.
  5. Penelitian lanjutan disarankan untuk menggunakan desain data panel multi-tahun (2018–2024) guna menganalisis tren temporal serta mengidentifikasi determinan secara lebih presisi. Pendekatan spasiotemporal atau model data panel juga direkomendasikan untuk memperkuat inferensi kausal dan memahami dinamika penyebaran penyakit secara lebih komprehensif.

Daftar Pustaka

  1. Cameron, A. C., & Trivedi, P. K. (1990). Regression-based tests for overdispersion in the Poisson model. Journal of Econometrics, 46(3), 347–364.
  2. Fox, J., & Weisberg, S. (2019). An R Companion to Applied Regression (3rd ed.). SAGE Publications.
  3. Hilbe, J. M. (2011). Negative Binomial Regression (2nd ed.). Cambridge University Press.
  4. Kementerian Kesehatan Republik Indonesia. (2024). Profil Kesehatan Indonesia 2024. Kemenkes RI.
  5. Open Data Jawa Barat. (2024). Jumlah Kasus Penyakit Diare berdasarkan Kabupaten/Kota di Jawa Barat. Diakses Juni 2026 dari https://opendata.jabarprov.go.id
  6. Anselin, L. (1995). Local Indicators of Spatial Association—LISA. Geographical Analysis, 27(2), 93–115.
  7. Bivand, R., Pebesma, E., & Gomez-Rubio, V. (2013). Applied Spatial Data Analysis with R (2nd ed.). Springer.
  8. BPS Provinsi Jawa Barat. (2024). Jawa Barat dalam Angka 2024. Badan Pusat Statistik Provinsi Jawa Barat.
  9. Moran, P. A. P. (1950). Notes on continuous stochastic phenomena. Biometrika, 37(1–2), 17–23.
  10. R Core Team. (2024). R: A Language and Environment for Statistical Computing. R Foundation for Statistical Computing. https://www.R-project.org/
  11. Venables, W. N., & Ripley, B. D. (2002). Modern Applied Statistics with S (4th ed.). Springer. [Paket MASS]
  12. Wickham, H., et al. (2019). Welcome to the tidyverse. Journal of Open Source Software, 4(43), 1686.
  13. World Health Organization. (2023). Diarrhoeal Disease. Fact Sheet. https://www.who.int/news-room/fact-sheets/detail/diarrhoeal-disease

LS0tDQp0aXRsZTogIkFOQUxJU0lTIEVQSURFTUlPTE9HSSBQRU5ZQUtJVCBESUFSRSBESSBQUk9WSU5TSSBKQVdBIEJBUkFUIFRBSFVOIDIwMjQgREVOR0FOIFBFTkRFS0FUQU4gQU5BTElTSVMgU1BBU0lBTCBEQU4gUkVHUkVTSSBORUdBVElWRSBCSU5PTUlBTCINCg0KYXV0aG9yOiB8DQogIDxkaXYgc3R5bGU9InRleHQtYWxpZ246IGNlbnRlcjsgZm9udC1zaXplOiAxNHB4OyBjb2xvcjogIzU1NTU1NTsgbGluZS1oZWlnaHQ6IDEuNjsgbWFyZ2luLXRvcDogMTBweDsiPg0KICBTcmkgWXVsaWFuYSAoMTQwNzIwMjUwMDMpIDxicj4NCiAgTWVsbHkgTXVzdGlrYXNhcmkgKDE0MDcyMDI1MDAxMSkgPGJyPg0KICBQcm9ncmFtIFN0dWRpIE1hZ2lzdGVyIFN0YXRpc3Rpa2EgVGVyYXBhbiA8YnI+DQogIE1hdGEgS3VsaWFoIEVwaWRlbWlvbG9naQ0KICA8L2Rpdj4NCiAgDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6DQogICAgdG9jOiB0cnVlDQogICAgdG9jX2Zsb2F0OiB0cnVlDQogICAgY29kZV9mb2xkaW5nOiBoaWRlDQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQ0KY3NzOiBzdHlsZS5jc3MNCi0tLQ0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkNCmBgYA0KDQpgYGB7ciAgaW5jbHVkZT1GQUxTRX0NCmxpYnJhcnkocmVhZHhsKQ0KbGlicmFyeShqYW5pdG9yKQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkodGlkeXIpDQpsaWJyYXJ5KHN0cmluZ3IpDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KHNjYWxlcykNCmxpYnJhcnkoTUFTUykNCmxpYnJhcnkoQUVSKQ0KbGlicmFyeShsbXRlc3QpDQpsaWJyYXJ5KGNhcikNCmxpYnJhcnkoY29ycnBsb3QpDQpsaWJyYXJ5KHNmKQ0KbGlicmFyeShrbml0cikNCmxpYnJhcnkoc3BkZXApDQpgYGANCg0KLS0tDQoNCg0KIyBBYnN0cmFrDQoNCkRpYXJlIG1lcnVwYWthbiBwZW55YWtpdCBiZXJiYXNpcyBsaW5na3VuZ2FuIHlhbmcgbWVuamFkaSBiZWJhbiBrZXNlaGF0YW4gbWFzeWFyYWthdCBzaWduaWZpa2FuIGRpIFByb3ZpbnNpIEphd2EgQmFyYXQuIFN0dWRpIGluaSBiZXJ0dWp1YW4gbWVuZ2FuYWxpc2lzIHBvbGEgZXBpZGVtaW9sb2dpIHBlbnlha2l0IGRpYXJlIHNlY2FyYSBjcm9zcy1zZWN0aW9uYWwgcGFkYSAyNyBrYWJ1cGF0ZW4va290YSBkaSBKYXdhIEJhcmF0IHRhaHVuIDIwMjQsIG1lbGlwdXRpIHBlcmhpdHVuZ2FuIEluY2lkZW5jZSBSYXRlIChJUikgZGFuIFN0YW5kYXJkaXplZCBJbmNpZGVuY2UgUmF0aW8gKFNJUiksIGFuYWxpc2lzIGF1dG9rb3JlbGFzaSBzcGFzaWFsIG1lbmdndW5ha2FuIEdsb2JhbCBNb3JhbidzIEkgZGFuIGtsYXN0ZXIgTElTQSwgc2VydGEgaWRlbnRpZmlrYXNpIGRldGVybWluYW4ganVtbGFoIGthc3VzIG1lbmdndW5ha2FuIHJlZ3Jlc2kgTmVnYXRpdmUgQmlub21pYWwuIEhhc2lsIG1lbnVuanVra2FuIHRvdGFsIDY3Mi4yODcga2FzdXMgZGlhcmUgZGVuZ2FuIElSIHJhdGEtcmF0YSBKYXdhIEJhcmF0IDEzMyw1NCBwZXIgMTAuMDAwIHBlbmR1ZHVrLiBLb3RhIENpcmVib24gbWVuY2F0YXRrYW4gSVIgdGVydGluZ2dpICg0NDIsODMgcGVyIDEwLjAwMCwgU0lSID0gMywzMiksIGRpaWt1dGkgS290YSBCb2dvciAoMzIxLDM4LCBTSVIgPSAyLDQxKSBkYW4gS290YSBTdWthYnVtaSAoMzExLDI5LCBTSVIgPSAyLDMzKS4gVWppIE1vcmFuJ3MgSSAoSSA9IDAsMDYwLCBwID0gMCwyMjYpIHRpZGFrIG1lbnVuanVra2FuIGF1dG9rb3JlbGFzaSBzcGFzaWFsIHNpZ25pZmlrYW4uIFJlZ3Jlc2kgTmVnYXRpdmUgQmlub21pYWwgTW9kZWwgMyB0ZXJwaWxpaCBiZXJkYXNhcmthbiBBSUMgdGVyZW5kYWggKDU2NCw5NykgbWVuZ2lkZW50aWZpa2FzaSBrZXRlcnNlZGlhYW4gZmFzaWxpdGFzIGtlc2VoYXRhbiAoSVJSID0gMCw3MjQsIHAgPCAwLDAwMSkgZGFuIElQTSAoSVJSID0gMCw3MDAsIHAgPSAwLDAyMSkgc2ViYWdhaSBmYWt0b3IgcHJvdGVrdGlmIHNpZ25pZmlrYW4sIHNlZGFuZ2thbiBrZXBhZGF0YW4gcGVuZHVkdWsgKElSUiA9IDEsNDkxLCBwID0gMCwwMDgpIG1lcnVwYWthbiBmYWt0b3IgcmlzaWtvLiBPdmVyZGlzcGVyc2kgZGF0YSBkaWtvbmZpcm1hc2kgZGVuZ2FuIFZNUiA9IDYuMTEwLDcwIGRhbiBkaXNwZXJzaW9uIGVzdGltYXRlID0gMS42NTYsMjIgKHAgPCAwLDAwMSksIG1lbmp1c3RpZmlrYXNpIHBlbmdndW5hYW4gbW9kZWwgTmVnYXRpdmUgQmlub21pYWwuDQoNCkthdGEga3VuY2k6IGRpYXJlLCBpbmNpZGVuY2UgcmF0ZSwgU0lSLCBNb3JhbidzIEksIExJU0EsIFJlZ3Jlc2kgTmVnYXRpdmUgQmlub21pYWwNCg0KLS0tDQoNCg0KIyAxIFBlbmRhaHVsdWFuDQoNCiMjIDEuMSBMYXRhciBCZWxha2FuZw0KDQpEaWFyZSBhZGFsYWgga29uZGlzaSBkaSBtYW5hIHNlc2VvcmFuZyBtZW5nYWxhbWkgYnVhbmcgYWlyIGJlc2FyIGxlYmloIGRhcmkgdGlnYSBrYWxpIHNlaGFyaSBkZW5nYW4ga29uc2lzdGVuc2kgY2FpciBhdGF1IGxlbWJlay4gU2VjYXJhIGdsb2JhbCwgZGlhcmUgbWVydXBha2FuIHBlbnllYmFiIGtlZHVhIGtlbWF0aWFuIHBhZGEgYW5hayBkaSBiYXdhaCBsaW1hIHRhaHVuIHNldGVsYWggcG5ldW1vbmlhIChXSE8sIDIwMjMpLiBEaSBJbmRvbmVzaWEsIGRpYXJlIHRlcm1hc3VrIGRhbGFtIHNlcHVsdWggYmVzYXIgcGVueWFraXQgZGVuZ2FuIGFuZ2thIGtlc2FraXRhbiB0ZXJ0aW5nZ2kgZGFuIHRlcnVzIG1lbmphZGkgbWFzYWxhaCBrZXNlaGF0YW4gbWFzeWFyYWthdCBwcmlvcml0YXMsIHRlcnV0YW1hIGRpIHdpbGF5YWggZGVuZ2FuIGFrc2VzIHNhbml0YXNpIGRhbiBhaXIgYmVyc2loIHlhbmcgbWFzaWggdGVyYmF0YXMuDQoNClByb3ZpbnNpIEphd2EgQmFyYXQgc2ViYWdhaSBwcm92aW5zaSBkZW5nYW4ganVtbGFoIHBlbmR1ZHVrIHRlcmJlc2FyIGRpIEluZG9uZXNpYSAowrE1MCwzIGp1dGEgaml3YSBwYWRhIDIwMjQpIG1lbmdoYWRhcGkgdGFudGFuZ2FuIGJlc2FyIGRhbGFtIHBlbmdlbmRhbGlhbiBwZW55YWtpdCBkaWFyZS4gRGF0YSBPcGVuIERhdGEgSmFiYXIgbWVudW5qdWtrYW4gYmFod2EgcGFkYSB0YWh1biAyMDI0IHRlcmNhdGF0IHNlYmFueWFrIDY3Mi4yODcga2FzdXMgZGlhcmUgZGkgMjcga2FidXBhdGVuL2tvdGEsIGRlbmdhbiB2YXJpYXNpIGthc3VzIHlhbmcgc2lnbmlmaWthbiBhbnRhcndpbGF5YWjigJRtdWxhaSBkYXJpIDQuMDk2IGthc3VzIGRpIEtvdGEgQmFuamFyIGhpbmdnYSA1Ni44MDIga2FzdXMgZGkgS2FidXBhdGVuIEJvZ29yLiBOYW11biwganVtbGFoIGthc3VzIGFic29sdXQgdGlkYWsgbWVuY2VybWlua2FuIHJpc2lrbyBzZWJlbmFybnlhOyBkaXBlcmx1a2FuIGFuYWxpc2lzIGJlcmJhc2lzIGRlbm9taW5hbiBwb3B1bGFzaSB1bnR1ayBwZXJiYW5kaW5nYW4geWFuZyBiZXJtYWtuYS4NCg0KQmVyYmFnYWkgZmFrdG9yIGRldGVybWluYW4gZGlhcmUgdGVsYWggZGlpZGVudGlmaWthc2kgZGFsYW0gbGl0ZXJhdHVyLCBtZWxpcHV0aSBha3NlcyBzYW5pdGFzaSBkYXNhciwga2V0ZXJzZWRpYWFuIGFpciBiZXJzaWgsIGtlcGFkYXRhbiBwZW5kdWR1aywga29uZGlzaSBzb3NpYWwgZWtvbm9taSB5YW5nIGRpcmVwcmVzZW50YXNpa2FuIG9sZWggSW5kZWtzIFBlbWJhbmd1bmFuIE1hbnVzaWEgKElQTSkgZGFuIGdhcmlzIGtlbWlza2luYW4sIHNlcnRhIGtldGVyc2VkaWFhbiBmYXNpbGl0YXMga2VzZWhhdGFuLiBQZW1haGFtYW4gdGVudGFuZyBmYWt0b3ItZmFrdG9yIHlhbmcgbWVtcGVuZ2FydWhpIGJlYmFuIGRpYXJlIHNlY2FyYSBzaW11bHRhbiBkYWxhbSBrb250ZWtzIG11bHRpdmFyaWF0IGRpcGVybHVrYW4gdW50dWsgcGVydW11c2FuIGludGVydmVuc2kgeWFuZyB0ZXBhdCBzYXNhcmFuLg0KDQpQZW5kZWthdGFuIHNwYXNpYWwgZXBpZGVtaW9sb2dpIGp1Z2EgcGVudGluZyB1bnR1ayBtZW5naWRlbnRpZmlrYXNpIGFwYWthaCB0ZXJkYXBhdCBwb2xhIGtsYXN0ZXIgZ2VvZ3JhZmlzIHlhbmcgbWVtZXJsdWthbiBwZXJoYXRpYW4ga2h1c3VzLiBBbmFsaXNpcyBNb3JhbidzIEkgZ2xvYmFsIGRhbiBMSVNBIChMb2NhbCBJbmRpY2F0b3JzIG9mIFNwYXRpYWwgQXNzb2NpYXRpb24pIG1lbXVuZ2tpbmthbiBpZGVudGlmaWthc2kgd2lsYXlhaC13aWxheWFoIGRlbmdhbiBiZWJhbiBwZW55YWtpdCB5YW5nIHRpZGFrIGFjYWsgc2VjYXJhIHNwYXNpYWwsIHlhbmcgZGFwYXQgbWVuamFkaSBiYXNpcyBwZW5ldGFwYW4gcHJpb3JpdGFzIHByb2dyYW0ga2VzZWhhdGFuIG1hc3lhcmFrYXQuDQoNCiMjIDEuMiBSdW11c2FuIE1hc2FsYWgNCg0KMS4gQmFnYWltYW5hIGRpc3RyaWJ1c2kga2FzdXMgZGlhcmUgZGkgSmF3YSBCYXJhdCB0YWh1biAyMDI0Pw0KMi4gV2lsYXlhaCBtYW5hIHlhbmcgbWVtaWxpa2kgcmlzaWtvIHJlbGF0aWYgdGVydGluZ2dpPw0KMy4gQXBha2FoIHRlcmRhcGF0IHBvbGEgc3Bhc2lhbCBrYXN1cyBkaWFyZT8NCjQuIEZha3RvciBhcGEgc2FqYSB5YW5nIGJlcnBlbmdhcnVoIHRlcmhhZGFwIGp1bWxhaCBrYXN1cyBkaWFyZT8NCg0KDQojIyAxLjMgVHVqdWFuIFBlbmVsaXRpYW4NCg0KMS4gTWVuZ2hpdHVuZyB1a3VyYW4gZXBpZGVtaW9sb2dpIGRpYXJlIHRhaHVuIDIwMjQuDQoyLiBNZW5naWRlbnRpZmlrYXNpIHdpbGF5YWggZGVuZ2FuIHJpc2lrbyB0aW5nZ2kgYmVyZGFzYXJrYW4gU0lSLg0KMy4gTWVuZ3VqaSBrZWJlcmFkYWFuIGF1dG9rb3JlbGFzaSBzcGFzaWFsIG1lbmdndW5ha2FuIE1vcmFu4oCZcyBJIGRhbiBMSVNBLg0KNC4gTWVuZ2FuYWxpc2lzIGZha3Rvci1mYWt0b3IgeWFuZyBtZW1lbmdhcnVoaSBqdW1sYWgga2FzdXMgZGlhcmUgbWVuZ2d1bmFrYW4gcmVncmVzaSBOZWdhdGl2ZSBCaW5vbWlhbC4NCg0KDQotLS0NCg0KIyAyIERhdGEgZGFuIE1ldG9kZQ0KDQojIyAyLjEgU3VtYmVyIERhdGENCg0KUGVuZWxpdGlhbiBpbmkgbWVuZ2d1bmFrYW4gZGF0YSBzZWt1bmRlciBsaW50YXMtc2Vrc2lvbmFsIChjcm9zcy1zZWN0aW9uYWwpIHBhZGEgdGFodW4gMjAyNCBkYXJpIHRpZ2Egc3VtYmVyIHV0YW1hOg0KDQphLglPcGVuIERhdGEgSmFiYXIgKG9wZW5kYXRhLmphYmFycHJvdi5nby5pZCk6IGp1bWxhaCBrYXN1cyBkaWFyZSBwZXIga2FidXBhdGVuL2tvdGEsIGp1bWxhaCBmYXNpbGl0YXMga2VzZWhhdGFuLCBwZXJzZW50YXNlIGFrc2VzIGFpciBiZXJzaWgsIHBlcnNlbnRhc2UgYWtzZXMgc2FuaXRhc2ksIGRhbiBrZXBhZGF0YW4gcGVuZHVkdWsuDQpiLglCYWRhbiBQdXNhdCBTdGF0aXN0aWsgKEJQUykgUHJvdmluc2kgSmF3YSBCYXJhdDoganVtbGFoIHBlbmR1ZHVrLCBnYXJpcyBrZW1pc2tpbmFuIHBlciBrYXBpdGEgcGVyIGJ1bGFuLCBkYW4gSW5kZWtzIFBlbWJhbmd1bmFuIE1hbnVzaWEgKElQTSkuDQpjLglHQURNIChEYXRhYmFzZSBvZiBHbG9iYWwgQWRtaW5pc3RyYXRpdmUgQXJlYXMpOiBiYXRhcyBhZG1pbmlzdHJhdGlmIGthYnVwYXRlbi9rb3RhIEphd2EgQmFyYXQgZGFsYW0gZm9ybWF0IEdlb0pTT04gdW50dWsga2VwZXJsdWFuIGFuYWxpc2lzIHNwYXNpYWwgZGFuIHBlbWV0YWFuLg0KDQpUYW5nZ2FsIGFrc2VzIGRhdGE6IEp1bmkgMjAyNi4gU2VsdXJ1aCBkYXRhIG1lcnVwYWthbiBkYXRhIHB1YmxpayB5YW5nIGRhcGF0IGRpdmVyaWZpa2FzaSBkYW4gZGlha3NlcyBrZW1iYWxpIG1lbGFsdWkgdGF1dGFuIHN1bWJlciByZXNtaS4NCg0KIyMgMi4yIFVuaXQgQW5hbGlzaXMgZGFuIFZhcmlhYmVsIFBlbmVsaXRpYW4NCg0KVW5pdCBhbmFsaXNpcyBhZGFsYWgga2FidXBhdGVuL2tvdGEgKG4gPSAyNykgZGkgUHJvdmluc2kgSmF3YSBCYXJhdCBwYWRhIHRhaHVuIDIwMjQuIFRhYmVsIDEgbWVyYW5na3VtIHZhcmlhYmVsIHlhbmcgZGlndW5ha2FuLg0KDQo8ZGl2IGFsaWduPSJjZW50ZXIiPg0KKipUYWJlbCAxLioqIFVuaXQgQW5hbGlzaXMgZGFuIFZhcmlhYmVsDQo8L2Rpdj4NCg0KDQp8IFZhcmlhYmVsIHwgVGlwZSB8IFNhdHVhbiB8IFBlcmFuIHwNCnwgOi0tLSB8IDotLS0gfCA6LS0tIHwgOi0tLSB8DQp8IEthc3VzIERpYXJlIHwgUmVzcG9ucyAoY291bnQpIHwgT3JhbmcvdGFodW4gfCBWYXJpYWJlbCBkZXBlbmRlbiByZWdyZXNpIE5CIHwNCnwgSnVtbGFoIFBlbmR1ZHVrIHwgRGVub21pbmF0b3IgfCBKaXdhIHwgRGVub21pbmFuIElSLCBTSVIsIGRhbiBvZmZzZXQgcmVncmVzaSB8DQp8IEZhc2lsaXRhcyBLZXNlaGF0YW4gfCBQcmVkaWt0b3IgKExvZykgfCBVbml0IHwgUHJva3NpIGtldGVyc2VkaWFhbiBsYXlhbmFuIGtlc2VoYXRhbiB8DQp8IEFrc2VzIEFpciBCZXJzaWggfCBQcmVkaWt0b3IgfCAlIHwgUnVtYWggdGFuZ2dhIGRlbmdhbiBha3NlcyBhaXIgbWludW0gbGF5YWsgfA0KfCBBa3NlcyBTYW5pdGFzaSB8IFByZWRpa3RvciB8ICUgfCBSdW1haCB0YW5nZ2EgZGVuZ2FuIHNhbml0YXNpIGxheWFrIHwNCnwgSVBNIHwgUHJlZGlrdG9yIHwgSW5kZWtzIHwgSW5kZWtzIFBlbWJhbmd1bmFuIE1hbnVzaWEgKDDigJMxMDApIHwNCnwgR2FyaXMgS2VtaXNraW5hbiB8IFByZWRpa3RvciAoTG9nKSB8IFJwL2thcGl0YS9ibG4gfCBQZW5nZWx1YXJhbiBtaW5pbXVtIHBlciBrYXBpdGEgfA0KfCBLZXBhZGF0YW4gUGVuZHVkdWsgfCBQcmVkaWt0b3IgKExvZykgfCBKaXdhL2ttwrIgfCBJbnRlbnNpdGFzIGtvbnRhayBhbnRhci1pbmRpdmlkdSB8DQoNCiMjIDIuMyBQZW5nb2xhaGFuIERhdGENCg0KRGF0YSBkaW9sYWggbWVuZ2d1bmFrYW4gcGVyYW5na2F0IGx1bmFrIFIgZGVuZ2FuIHBha2V0IHV0YW1hOiByZWFkeGwsIGRwbHlyLCBNQVNTIChnbG0ubmIpLCBBRVIgKGRpc3BlcnNpb250ZXN0KSwgY2FyICh2aWYpLCBzZiwgZGFuIHNwZGVwLiBUYWhhcGFuIHBlbmdvbGFoYW4gbWVsaXB1dGk6DQphLglQZW1iYWNhYW4gZGF0YSBFeGNlbCBkZW5nYW4gcGVudWdhc2FuIG5hbWEga29sb20gc2VjYXJhIG1hbnVhbCBiZXJkYXNhcmthbiBwb3Npc2kgKDE0IGtvbG9tKSB1bnR1ayBtZW5naGluZGFyaSBkZXBlbmRlbnNpIHBhZGEgdmVyc2kgcGFrZXQgamFuaXRvci4NCmIuCUtvbG9tIGFpcl9iZXJzaWggZGlzaW1wYW4gc2ViYWdhaSBrYXJha3RlciBkaSBFeGNlbDsgbmlsYWkgIi0iIGRpdWJhaCBrZSBOQSBrZW11ZGlhbiBkaWltcHV0YXNpIGRlbmdhbiBuaWxhaSBtZWRpYW4uDQpjLglUcmFuc2Zvcm1hc2kgbG9nIG5hdHVyYWwgdW50dWsgdmFyaWFiZWwgZmFza2VzLCBrZW1pc2tpbmFuLCBkYW4ga2VwYWRhdGFuIHlhbmcgYmVyZGlzdHJpYnVzaSBwb3NpdGlmIHNrZXdlZCwgZ3VuYSBtZW1lbnVoaSBhc3Vtc2kgbGluZWFyaXRhcyBsb2ctbGluayBwYWRhIG1vZGVsIE5CLg0KZC4JU3RhbmRhcmRpc2FzaSAoei1zY29yZSkgc2VsdXJ1aCBwcmVkaWt0b3IgYWdhciBrb2VmaXNpZW4gcmVncmVzaSBkYXBhdCBkaWJhbmRpbmdrYW4gbGludGFzIHZhcmlhYmVsLg0KDQoNCiMjIDIuNCBVa3VyYW4gRXBpZGVtaW9sb2dpDQoNCiMjIyAyLjQuMSBJbmNpZGVuY2UgUmF0ZSAoSVIpDQoNCkluY2lkZW5jZSBSYXRlIChJUiksIGRpaGl0dW5nIHNlYmFnYWkganVtbGFoIGthc3VzIGRpYXJlIGRpYmFnaSBqdW1sYWggcGVuZHVkdWsgZGlrYWxpa2FuIDEwLjAwMCwgbWVuZ2hhc2lsa2FuIHNhdHVhbiBrYXN1cyBwZXIgMTAuMDAwIHBlbmR1ZHVrIHBlciB0YWh1bjoNCg0KJCQNCklSID0gXGZyYWN7S2FzdXMgRGlhcmV9e1BlbmR1ZHVrfVx0aW1lcyAxMC4wMDANCiQkDQoNCiMjIyAyLjQuMiBTdGFuZGFyZGl6ZWQgSW5jaWRlbmNlIFJhdGlvIChTSVIpDQoNClN0YW5kYXJkaXplZCBJbmNpZGVuY2UgUmF0aW8gKFNJUiksIGRpaGl0dW5nIHNlYmFnYWkgcmFzaW8ga2FzdXMgdGVyYW1hdGkgdGVyaGFkYXAga2FzdXMgeWFuZyBkaWhhcmFwa2FuLCBkaSBtYW5hIGthc3VzIHlhbmcgZGloYXJhcGthbiBkaXBlcm9sZWggZGVuZ2FuIG1lbmdhcGxpa2FzaWthbiBJUiByZWZlcmVuc2kgSmF3YSBCYXJhdCAyMDI0ICgxMzMsNTQgcGVyIDEwLjAwMCkgdGVyaGFkYXAgcGVuZHVkdWsgbWFzaW5nLW1hc2luZyB3aWxheWFoOg0KDQoNCiQkDQpTSVIgPSBcZnJhY3tPYnNlcnZlZH17RXhwZWN0ZWR9DQokJA0KDQpkZW5nYW4NCg0KJCQNCkV4cGVjdGVkID0gUGVuZHVkdWtfaSBcdGltZXMgUmF0ZV97SmF3YUJhcmF0fQ0KJCQNCg0KU0lSID4gMSBtZW51bmp1a2thbiBiZWJhbiBkaWFyZSBtZWxlYmloaSByYXRhLXJhdGEgcHJvdmluc2k7IFNJUiA8IDEgbWVudW5qdWtrYW4gYmViYW4gZGkgYmF3YWggcmF0YS1yYXRhLiBTSVIgZGlrYXRlZ29yaWthbiBtZW5qYWRpOiBTYW5nYXQgVGluZ2dpICjiiaUgMiwwKSwgVGluZ2dpICgxLDDigJMyLDApLCBSZW5kYWggKDAsNeKAkzEsMCksIGRhbiBTYW5nYXQgUmVuZGFoICg8IDAsNSkuDQoNCiMjIDIuNSBBbmFsaXNpcyBTcGFzaWFsDQoNCkFuYWxpc2lzIHNwYXNpYWwgZGlsYWt1a2FuIGRlbmdhbiBwZW5kZWthdGFuIGJlcmJhc2lzIHBlbWJvYm90IFF1ZWVuIENvbnRpZ3VpdHkgbWVuZ2d1bmFrYW4gcGFrZXQgc3BkZXAuIER1YSBhbmFsaXNpcyBkaWxha3VrYW46DQoNCmEuCUdsb2JhbCBNb3JhbidzIEk6IG1lbmd1a3VyIGRlcmFqYXQgYXV0b2tvcmVsYXNpIHNwYXNpYWwgSVIgc2VjYXJhIGtlc2VsdXJ1aGFuLiBOaWxhaSBJIGJlcmtpc2FyIGFudGFyYSAtMSAoZGlzcGVyc2kgc2VtcHVybmEpIGhpbmdnYSArMSAoa2xhc3RlciBzZW1wdXJuYSkuIFVqaSBzaWduaWZpa2Fuc2kgbWVuZ2d1bmFrYW4gcGVuZGVrYXRhbiByYW5kb21pc2FzaSAocCA8IDAsMDUpLg0KDQpiLglMb2NhbCBJbmRpY2F0b3JzIG9mIFNwYXRpYWwgQXNzb2NpYXRpb24gKExJU0EpOiBtZW5naWRlbnRpZmlrYXNpIGtsYXN0ZXIgc3Bhc2lhbCBsb2thbCBwYWRhIGxldmVsIHdpbGF5YWguIEtsYXN0ZXIgZGlrYXRlZ29yaWthbiBzZWJhZ2FpIEhpZ2gtSGlnaCwgTG93LUxvdywgSGlnaC1Mb3csIGF0YXUgTG93LUhpZ2ggYmVyZGFzYXJrYW4gbmlsYWkgSVIgdGVyc3RhbmRhcmlzYXNpIGRhbiBzcGF0aWFsIGxhZy1ueWEsIGRlbmdhbiB0aHJlc2hvbGQgc2lnbmlmaWthbnNpIHAgPCAwLDA1Lg0KDQoNCiMjIDIuNiBSZWdyZXNpIE5lZ2F0aXZlIEJpbm9taWFsDQoNClJlZ3Jlc2kgYmlub21pYWwgbmVnYXRpZiBhZGFsYWggc2FsYWggc2F0dSBhbHRlcm5hdGlmIGRhcmkgbW9kZWwgcmVncmVzaSBQb2lzc29uIHlhbmcgbWVuZ2FsYW1pIG92ZXJkaXNwZXJzaS4gUmVncmVzaSBCaW5vbWlhbCBOZWdhdGlmIGFkYWxhaCBtb2RlbCBwZW5lcmFwYW4gZGFyaSBHZW5lcmFsaXplZCBMaW5lYXIgTW9kZWwgKEdMTSkgeWFuZyBtZW5naHVidW5na2FuIGFudGFyYSB2YXJpYWJlbCBkZXBlbmRlbiBkZW5nYW4gdmFyaWFiZWwgaW5kZXBlbmRlbiB5YW5nIGRhcGF0IGRpdGVyYXBrYW4gcGFkYSBrb25kaXNpIGVxdWRpc3BlcnNpIGF0YXUgb3ZlcmRpc3BlcnNpIA0KDQpEYXRhIGthc3VzIGRpYXJlIG1lcnVwYWthbiBkYXRhIGNhY2FoIChjb3VudCBkYXRhKSBkZW5nYW4gb3ZlcmRpc3BlcnNpIHlhbmcgZGlrb25maXJtYXNpIG1lbGFsdWkgVmFyaWFuY2UtTWVhbiBSYXRpbyAoVk1SKSBkYW4gdWppIGZvcm1hbCBkaXNwZXJzaW9udGVzdCBkYXJpIHBha2V0IEFFUi4gTW9kZWwgTmVnYXRpdmUgQmlub21pYWwgKE5CKSBkaXBpbGloIGthcmVuYSBtZW5nYXRhc2kgb3ZlcmRpc3BlcnNpIG1lbGFsdWkgcGFyYW1ldGVyIGRpc3BlcnNpIHRoZXRhICjOuCksIHlhbmcgdGlkYWsgZGFwYXQgZGl0YW5nYW5pIG9sZWggbW9kZWwgUG9pc3Nvbi4NClRpZ2EgbW9kZWwgYmVydGluZ2thdCBkaWVzdGltYXNpIGRlbmdhbiBvZmZzZXQgbG9nKGp1bWxhaCBwZW5kdWR1aykgdW50dWsgbWVuZ29yZWtzaSBwZXJiZWRhYW4gdWt1cmFuIHBvcHVsYXNpOg0KDQphLglNb2RlbCAxOiBsb2coZmFza2VzKSArIGFpcl9iZXJzaWggKyBzYW5pdGFzaSArIElQTQ0KDQokJCBccXVhZCBcbG9nKFxtdV9pKSA9IFxsbihcdGV4dHtwZW5kdWR1a31faSkgKyBcYmV0YV8wICsgXGJldGFfMSBcdGV4dHtGYXNrZXN9X2kgKyBcYmV0YV8yIFx0ZXh0e0FpckJlcnNpaH1faSArIFxiZXRhXzMgXHRleHR7U2FuaXRhc2l9X2kgKyBcYmV0YV80IFx0ZXh0e0lQTX1faSQkDQoNCmIuCU1vZGVsIDI6IE1vZGVsIDEgKyBsb2coZ2FyaXMga2VtaXNraW5hbikNCg0KJCQgXHF1YWQgXGxvZyhcbXVfaSkgPSBcbG4oXHRleHR7cGVuZHVkdWt9X2kpICsgXGJldGFfMCArIFxiZXRhXzEgXHRleHR7RmFza2VzfV9pICsgXGJldGFfMiBcdGV4dHtBaXJCZXJzaWh9X2kgKyBcYmV0YV8zIFx0ZXh0e1Nhbml0YXNpfV9pICsgXGJldGFfNCBcdGV4dHtJUE19X2kgKyBcYmV0YV81IFx0ZXh0e0tlbWlza2luYW59X2kkJA0KDQoNCmMuCU1vZGVsIDM6IE1vZGVsIDIgKyBsb2coa2VwYWRhdGFuKQ0KDQokJCBccXVhZCBcbG9nKFxtdV9pKSA9IFxsbihcdGV4dHtwZW5kdWR1a31faSkgKyBcYmV0YV8wICsgXGJldGFfMSBcdGV4dHtGYXNrZXN9X2kgKyBcYmV0YV8yIFx0ZXh0e0FpckJlcnNpaH1faSArIFxiZXRhXzMgXHRleHR7U2FuaXRhc2l9X2kgKyBcYmV0YV80IFx0ZXh0e0lQTX1faSArIFxiZXRhXzUgXHRleHR7S2VtaXNraW5hbn1faSArIFxiZXRhXzYgXHRleHR7S2VwYWRhdGFufV9pJCQNCg0KDQoNClBlbWlsaWhhbiBtb2RlbCBiZXJkYXNhcmthbiBBa2Fpa2UgSW5mb3JtYXRpb24gQ3JpdGVyaW9uIChBSUMpIHRlcmtlY2lsLiBNb2RlbC1tb2RlbCBkaWJhbmRpbmdrYW4gc2VjYXJhIGZvcm1hbCBtZW5nZ3VuYWthbiBMaWtlbGlob29kLVJhdGlvIFRlc3QgKExSVCkuIEdvb2RuZXNzIG9mIGZpdCBkaXVqaSBkZW5nYW4gdWppIGNoaS1rdWFkcmF0IGJlcmJhc2lzIGRldmlhbnMgcmVzaWR1YWwuIE91dHB1dCB1dGFtYSBiZXJ1cGEgSW5jaWRlbmNlIFJhdGUgUmF0aW8gKElSUiA9IGV4cCjOsikpIGRlbmdhbiA5NSUgQ29uZmlkZW5jZSBJbnRlcnZhbC4NCk11bHRpa29saW5lYXJpdGFzIGRpcGVyaWtzYSBtZW5nZ3VuYWthbiBWYXJpYW5jZSBJbmZsYXRpb24gRmFjdG9yIChWSUYpIG1lbGFsdWkgbW9kZWwgT0xTIHBlbmdnYW50aS4gDQoNCi0tLQ0KDQojIDMgSGFzaWwgQW5hbGlzaXMNCg0KIyMgMy4xIFBlcnNpYXBhbiBEYXRhDQoNCmBgYHtyfQ0Kc2V0d2QoIkM6L1VzZXJzL0hQL0Rvd25sb2FkcyIpDQoNCmRmX3JhdyA8LSByZWFkX2V4Y2VsKCJkYXRhc2V0IGRpYXJlIGZpeC54bHN4IikgJT4lDQogIGNsZWFuX25hbWVzKCkNCg0KIyBSZW5hbWUga2UgbmFtYSBwZW5kZWsgeWFuZyBrb25zaXN0ZW4NCmRmX3JhdyA8LSBkZl9yYXcgJT4lDQogIHJlbmFtZSgNCiAgICBuYW1hX2thYiAgID0gbmFtYV9rYWJ1cGF0ZW5fa290YSwNCiAgICBkaWFyZSAgICAgID0gZGlhcmVfb3JhbmcsDQogICAgZmFza2VzICAgICA9IGZhc2tlc191bml0LA0KICAgIGtlbWlza2luYW4gPSBnYXJpc19rZW1pc2tpbmFuX3J1cGlhaF9rYXBpdGFfYnVsYW4sDQogICAga2VwYWRhdGFuICA9IGtlcGFkYXRhbl9wZW5kdWR1a19qaXdhX3Blcl9raWxvbWV0ZXJfcGVyc2VnaSwNCiAgICBhaXJfYmVyc2loID0gYWlyX2JlcnNpaF9wZXJjZW50LA0KICAgIHNhbml0YXNpICAgPSBzYW5pdGFzaV9wZXJjZW50LA0KICAgIGlwbSAgICAgICAgPSBpcG1fcGVyY2VudCwNCiAgICBwZW5kdWR1ayAgID0ganVtbGFoX3BlbmR1ZHVrX2ppd2ENCiAgKSAlPiUNCiAgZHBseXI6OnNlbGVjdCgNCiAgICBuYW1hX2thYiwNCiAgICB0YWh1biwNCiAgICBkaWFyZSwNCiAgICBmYXNrZXMsDQogICAga2VtaXNraW5hbiwNCiAgICBrZXBhZGF0YW4sDQogICAgYWlyX2JlcnNpaCwNCiAgICBzYW5pdGFzaSwNCiAgICBpcG0sDQogICAgcGVuZHVkdWsNCiAgKQ0KDQoNCg0KZGYgPC0gZGZfcmF3ICU+JQ0KICBtdXRhdGUoDQogICAgYWlyX2JlcnNpaCA9IHRyaW13cyhhcy5jaGFyYWN0ZXIoYWlyX2JlcnNpaCkpLA0KICAgIGFpcl9iZXJzaWggPSBuYV9pZihhaXJfYmVyc2loLCAiLSIpLA0KDQogICAgZGlhcmUgICAgICA9IGFzLm51bWVyaWMoZGlhcmUpLA0KICAgIGZhc2tlcyAgICAgPSBhcy5udW1lcmljKGZhc2tlcyksDQogICAga2VtaXNraW5hbiA9IGFzLm51bWVyaWMoa2VtaXNraW5hbiksDQogICAga2VwYWRhdGFuICA9IGFzLm51bWVyaWMoa2VwYWRhdGFuKSwNCiAgICBhaXJfYmVyc2loID0gYXMubnVtZXJpYyhhaXJfYmVyc2loKSwNCiAgICBzYW5pdGFzaSAgID0gYXMubnVtZXJpYyhzYW5pdGFzaSksDQogICAgaXBtICAgICAgICA9IGFzLm51bWVyaWMoaXBtKSwNCiAgICBwZW5kdWR1ayAgID0gYXMubnVtZXJpYyhwZW5kdWR1ayksDQogICAgdGFodW4gICAgICA9IGFzLmludGVnZXIodGFodW4pDQogICkgJT4lDQogIGZpbHRlcih0YWh1biA9PSAyMDI0KQ0KDQpkZiA8LSBkZiAlPiUNCiAgbXV0YXRlKA0KICAgIGFpcl9iZXJzaWggPSBpZmVsc2UoDQogICAgICBpcy5uYShhaXJfYmVyc2loKSwNCiAgICAgIG1lZGlhbihhaXJfYmVyc2loLCBuYS5ybSA9IFRSVUUpLA0KICAgICAgYWlyX2JlcnNpaA0KICAgICksDQogICAgc2FuaXRhc2kgPSBpZmVsc2UoDQogICAgICBpcy5uYShzYW5pdGFzaSksDQogICAgICBtZWRpYW4oc2FuaXRhc2ksIG5hLnJtID0gVFJVRSksDQogICAgICBzYW5pdGFzaQ0KICAgICkNCiAgKQ0KDQpkZiA8LSBkZiAlPiUNCiAgbXV0YXRlKA0KICAgICMgTG9nIHRyYW5zZm9ybXMgdW50dWsgdmFyaWFiZWwgc2tld2VkIGthbmFuDQogICAgbG5fcGVuZHVkdWsgICA9IGxvZyhwZW5kdWR1ayksDQogICAgbG5fZmFza2VzICAgICA9IGxvZzFwKGZhc2tlcyksICAgICAgIyBsb2coeCsxKSBhbWFuIGppa2EgYWRhIG5vbA0KICAgIGxuX2tlbWlza2luYW4gPSBsb2coa2VtaXNraW5hbiksDQogICAgbG5fa2VwYWRhdGFuICA9IGxvZyhrZXBhZGF0YW4pLA0KICAgIA0KICAgICMgU3RhbmRhcmRpc2FzaSAobWVhbj0wLCBTRD0xKSBhZ2FyIGtvZWZpc2llbiBkYXBhdCBkaWJhbmRpbmdrYW4NCiAgICBmYXNrZXNfc3RkICAgICA9IGFzLm51bWVyaWMoc2NhbGUobG5fZmFza2VzKSksDQogICAgYWlyX3N0ZCAgICAgICAgPSBhcy5udW1lcmljKHNjYWxlKGFpcl9iZXJzaWgpKSwNCiAgICBzYW5pdGFzaV9zdGQgICA9IGFzLm51bWVyaWMoc2NhbGUoc2FuaXRhc2kpKSwNCiAgICBpcG1fc3RkICAgICAgICA9IGFzLm51bWVyaWMoc2NhbGUoaXBtKSksDQogICAga2VtaXNraW5hbl9zdGQgPSBhcy5udW1lcmljKHNjYWxlKGxuX2tlbWlza2luYW4pKSwNCiAgICBrZXBhZGF0YW5fc3RkICA9IGFzLm51bWVyaWMoc2NhbGUobG5fa2VwYWRhdGFuKSkpDQoNCmRmIDwtIGRmICU+JQ0KICBtdXRhdGUoDQogICAgdGlwZSA9IGlmZWxzZShzdHJfZGV0ZWN0KHRvdXBwZXIobmFtYV9rYWIpLCAiXktPVEEiKSwgIktvdGEiLCAiS2FidXBhdGVuIikNCiAgKQ0KDQojIERhdGEgU3Bhc2lhbA0KcGF0aF9zaHAgIDwtICJEOi9CYXRhcy9CYXRhcy9CYXRhc19LYWJ1cGF0ZW5fSmF3YV9CYXJhdC5zaHAiDQoNCmphYmFyX2dlbyA8LSBzdF9yZWFkKHBhdGhfc2hwKSANCmphYmFyX2dlbyA8LSBqYWJhcl9nZW8gJT4lDQogICAgbXV0YXRlKA0KICAgICAgbmFtYV9rYWIgPSB0b3VwcGVyKFdBRE1LSyksDQogICAgICBuYW1hX2thYiA9IGNhc2Vfd2hlbigNCiAgICAgICAgc3RyX2RldGVjdChuYW1hX2thYiwgIl5LT1RBIikgfiBuYW1hX2thYiwNCiAgICAgICAgVFJVRSB+IHBhc3RlKCJLQUJVUEFURU4iLCBuYW1hX2thYikNCiAgICAgICkNCiAgICApDQoNCiMgU3RhbmRhcmlzYXNpIG5hbWEgZGkgZGYgdW50dWsgam9pbg0KZGZfc3BhdCA8LSBkZiAlPiUNCiAgbXV0YXRlKG5hbWFfa2FiID0gdG91cHBlcihuYW1hX2thYikpDQoNCiMgR2FidW5na2FuIHNoYXBlZmlsZSBkZW5nYW4gZGF0YQ0KamFiYXIgPC0gbGVmdF9qb2luKGphYmFyX2dlbywgZGZfc3BhdCwgYnkgPSAibmFtYV9rYWIiKQ0KYGBgDQoNCi0tLQ0KDQojIyAzLjIgU3RhdGlzdGlrIERlc2tyaXB0aWYNCg0KDQo8ZGl2IGFsaWduPSJjZW50ZXIiPg0KKipUYWJlbCAyLioqIFN0YXRpc3RpayBEZXNrcmlwdGlmIFZhcmlhYmVsIERpYXJlDQo8L2Rpdj4NCg0KDQpgYGB7cn0NCnZhcmlhYmVsIDwtIGMoDQogICJkaWFyZSIsDQogICJwZW5kdWR1ayIsDQogICJmYXNrZXMiLA0KICAia2VtaXNraW5hbiIsDQogICJrZXBhZGF0YW4iLA0KICAiYWlyX2JlcnNpaCIsDQogICJzYW5pdGFzaSIsDQogICJpcG0iDQopDQoNCnN0YXRfZGVzYyA8LSBkYXRhLmZyYW1lKA0KICBWYXJpYWJlbCA9IGMoDQogICAgIkthc3VzIERpYXJlIiwNCiAgICAiSnVtbGFoIFBlbmR1ZHVrIiwNCiAgICAiSnVtbGFoIEZhc2tlcyIsDQogICAgIkdhcmlzIEtlbWlza2luYW4iLA0KICAgICJLZXBhZGF0YW4gUGVuZHVkdWsiLA0KICAgICJBa3NlcyBBaXIgQmVyc2loICglKSIsDQogICAgIkFrc2VzIFNhbml0YXNpICglKSIsDQogICAgIklQTSINCiAgKSwNCiAgTWluaW11bSA9IHNhcHBseShkZlt2YXJpYWJlbF0sIG1pbiwgbmEucm0gPSBUUlVFKSwNCiAgTWVhbiAgICA9IHNhcHBseShkZlt2YXJpYWJlbF0sIG1lYW4sIG5hLnJtID0gVFJVRSksDQogIE1lZGlhbiAgPSBzYXBwbHkoZGZbdmFyaWFiZWxdLCBtZWRpYW4sIG5hLnJtID0gVFJVRSksDQogIFNEICAgICAgPSBzYXBwbHkoZGZbdmFyaWFiZWxdLCBzZCwgbmEucm0gPSBUUlVFKSwNCiAgTWFrc2ltdW09IHNhcHBseShkZlt2YXJpYWJlbF0sIG1heCwgbmEucm0gPSBUUlVFKQ0KKQ0KDQprYWJsZShzdGF0X2Rlc2MsIHJvdy5uYW1lcyA9IEZBTFNFKQ0KYGBgDQoNCioqSW50ZXJwcmV0YXNpOioqDQoNCkp1bWxhaCBrYXN1cyBkaWFyZSBwZXIgd2lsYXlhaCBzYW5nYXQgYmVydmFyaWFzaSAobWluID0gNC4wOTY7IG1ha3MgPSA1Ni44MDIpLCBkZW5nYW4gU0QgeWFuZyBiZXNhciAoMTIuMzM1LDA1KSByZWxhdGlmIHRlcmhhZGFwIHJlcmF0YSAoMjQuODk5LDUyKS4gVmFyaWFzaSBiZXNhciBpbmkgbWVydXBha2FuIGluZGlrYXNpIGF3YWwgb3ZlcmRpc3BlcnNpIHlhbmcgbWVuZ3VhdCBkdWdhYW4gYmFod2EgbW9kZWwgUG9pc3NvbiB0aWRhayBtZW1hZGFpLiBJUiBiZXJraXNhciBkYXJpIDYyLDYyIGhpbmdnYSA0NDIsODMgcGVyIDEwLjAwMCBwZW5kdWR1ayByYXNpbyBtYWtzL21pbiBtZW5jYXBhaSA3LDA3LCBtZW51bmp1a2thbiBrZXRpbXBhbmdhbiBiZWJhbiBwZW55YWtpdCB5YW5nIHN1YnN0YW5zaWFsLiBBa3NlcyBzYW5pdGFzaSBtZW51bmp1a2thbiB2YXJpYXNpIHRlcmJlc2FyIChTRCA9IDE0LDg5JSkgZGVuZ2FuIG5pbGFpIG1pbmltdW0gMzQsNTYlIChLb3RhIFRhc2lrbWFsYXlhKSwgbWVuZ2luZGlrYXNpa2FuIGtlc2VuamFuZ2FuIGluZnJhc3RydWt0dXIgc2FuaXRhc2kgeWFuZyBtYXNpaCBsZWJhciBhbnRhcndpbGF5YWguDQoNCi0tLQ0KDQojIyAzLjMgVWt1cmFuIEVwaWRlbWlvbG9naQ0KDQojIyMgMy4zLjEgSW5jaWRlbmNlIFJhdGUgKElSKSBkYW4gU0lSDQoNClRhYmVsIDMgbWVueWFqaWthbiBJUiBkYW4gU0lSIHNlbHVydWggMjcga2FidXBhdGVuL2tvdGEsIGRpdXJ1dGthbiBiZXJkYXNhcmthbiBTSVIgdGVydGluZ2dpLiBJUiByZWZlcmVuc2kgSmF3YSBCYXJhdCAyMDI0IGFkYWxhaCAxMzMsNTQgcGVyIDEwLjAwMCBwZW5kdWR1ayAodG90YWwgNjcyLjI4NyBrYXN1cyBkYXJpIDUwLjM0NS4xOTAgcGVuZHVkdWspLg0KDQoNCjxkaXYgYWxpZ249ImNlbnRlciI+DQoqKlRhYmVsIDMuKiogSW5jaWRlbmNlIFJhdGUgZGFuIFNJUiBEaWFyZQ0KPC9kaXY+DQoNCg0KYGBge3J9DQojIElSDQpyYXRlX2phYmFyIDwtIHN1bShkZiRkaWFyZSkgLyBzdW0oZGYkcGVuZHVkdWspDQoNCmRmIDwtIGRmICU+JQ0KICBtdXRhdGUoSVIgPSAoZGlhcmUgLyBwZW5kdWR1aykgKiAxMDAwMCkNCg0KIyBVcGRhdGUgamFiYXIgZGVuZ2FuIElSDQpqYWJhciA8LSBsZWZ0X2pvaW4oamFiYXJfZ2VvLCANCiAgICAgICAgICAgICAgICAgICBkZiAlPiUgbXV0YXRlKG5hbWFfa2FiID0gdG91cHBlcihuYW1hX2thYikpLCANCiAgICAgICAgICAgICAgICAgICBieSA9ICJuYW1hX2thYiIpDQoNCiMgU0lSDQoNCmRmIDwtIGRmICU+JQ0KICBtdXRhdGUoDQogICAgZXhwZWN0ZWQgPSBwZW5kdWR1ayAqIHJhdGVfamFiYXIsDQogICAgU0lSICAgICAgPSBkaWFyZSAvIGV4cGVjdGVkDQogICkNCg0KIyBVcGRhdGUgamFiYXIgZGVuZ2FuIFNJUg0KamFiYXIgPC0gbGVmdF9qb2luKGphYmFyX2dlbywgDQogICAgICAgICAgICAgICAgICAgZGYgJT4lIG11dGF0ZShuYW1hX2thYiA9IHRvdXBwZXIobmFtYV9rYWIpKSwgDQogICAgICAgICAgICAgICAgICAgYnkgPSAibmFtYV9rYWIiKQ0KDQpqYWJhciA8LSBqYWJhciAlPiUNCiAgbXV0YXRlKA0KICAgIGthdGVnb3JpX1NJUiA9IGNhc2Vfd2hlbigNCiAgICAgIFNJUiA8IDAuODAgfiAiPDAuODAiLA0KICAgICAgU0lSIDwgMS4wMCB+ICIwLjgwLTAuOTkiLA0KICAgICAgU0lSIDwgMS4yMCB+ICIxLjAwLTEuMTkiLA0KICAgICAgU0lSIDwgMS41MCB+ICIxLjIwLTEuNDkiLA0KICAgICAgVFJVRSAgICAgICB+ICI+PTEuNTAiDQogICAgKQ0KICApDQoNCnRhYmVsX2VwaWQgPC0gZGYgJT4lDQogIG11dGF0ZSgNCiAgICBJUl9yb3VuZCAgPSByb3VuZChJUiwgMiksDQogICAgU0lSX3JvdW5kID0gcm91bmQoU0lSLCAzKSwNCiAgICBLYXRlZ29yaSAgPSBjYXNlX3doZW4oDQogICAgICBTSVIgPj0gMi4wICB+ICJTYW5nYXQgVGluZ2dpICg+PTIuMCkiLA0KICAgICAgU0lSID49IDEuMCAgfiAiVGluZ2dpICgxLjAtMi4wKSIsDQogICAgICBTSVIgPj0gMC41ICB+ICJSZW5kYWggKDAuNS0xLjApIiwNCiAgICAgIFRSVUUgICAgICAgIH4gIlNhbmdhdCBSZW5kYWggKDwwLjUpIg0KICAgICkNCiAgKSAlPiUNCiAgZHBseXI6OnNlbGVjdChXaWxheWFoID0gbmFtYV9rYWIsIFRpcGUgPSB0aXBlLA0KICAgICAgICAgS2FzdXMgPSBkaWFyZSwgYElSLzEwLjAwMGAgPSBJUl9yb3VuZCwNCiAgICAgICAgIGBLYXN1cyBFeHAuYCA9IGV4cGVjdGVkLCBTSVIgPSBTSVJfcm91bmQsIEthdGVnb3JpKSAlPiUNCiAgbXV0YXRlKGBLYXN1cyBFeHAuYCA9IHJvdW5kKGBLYXN1cyBFeHAuYCwgMCkpICU+JQ0KICBhcnJhbmdlKGRlc2MoU0lSKSkNCg0Ka2FibGUodGFiZWxfZXBpZCkNCmBgYA0KDQoqKkludGVycHJldGFzaToqKg0KDQpUaWdhIHdpbGF5YWggdGVybWFzdWsga2F0ZWdvcmkgU2FuZ2F0IFRpbmdnaSAoU0lSIOKJpSAyLDApOiBLb3RhIENpcmVib24gKFNJUiA9IDMsMzI7IElSID0gNDQyLDgzKSwgS290YSBCb2dvciAoU0lSID0gMiw0MTsgSVIgPSAzMjEsMzgpLCBkYW4gS290YSBTdWthYnVtaSAoU0lSID0gMiwzMzsgSVIgPSAzMTEsMjkpLiBTZWJhbnlhayAxNCB3aWxheWFoIG1hc3VrIGthdGVnb3JpIFRpbmdnaSAoMSwwIOKJpCBTSVIgPCAyLDApLCA5IHdpbGF5YWggUmVuZGFoICgwLDUg4omkIFNJUiA8IDEsMCksIGRhbiBoYW55YSAxIHdpbGF5YWggU2FuZ2F0IFJlbmRhaCAoS2FidXBhdGVuIEJla2FzaSwgU0lSID0gMCw0NykuIERlbmdhbiBkZW1pa2lhbiwgMTcgZGFyaSAyNyB3aWxheWFoICg2MyUpIG1lbWlsaWtpIGJlYmFuIGRpYXJlIHlhbmcgbWVsZWJpaGkgcmF0YS1yYXRhIHByb3ZpbnNpLg0KDQpBbmFsaXNpcyBiZXJkYXNhcmthbiB0aXBlIHdpbGF5YWggbWVudW5qdWtrYW4gYmFod2Egd2lsYXlhaCBwZXJrb3RhYW4gKGtvdGEpIG1lbWlsaWtpIHJlcmF0YSBJUiBsZWJpaCB0aW5nZ2kgKDIyMiwwNSBwZXIgMTAuMDAwKSBkaWJhbmRpbmdrYW4ga2FidXBhdGVuICgxMzgsNTkgcGVyIDEwLjAwMCkuIFVqaSBNYW5uLVdoaXRuZXkgbWVudW5qdWtrYW4gcGVyYmVkYWFuIGluaSB0aWRhayBzaWduaWZpa2FuIHNlY2FyYSBzdGF0aXN0aWsgKFUgPSAxMTcsMDsgcCA9IDAsMDY4KSwga2VtdW5na2luYW4gYWtpYmF0IHVrdXJhbiBzYW1wZWwgeWFuZyBrZWNpbCAoOSBrb3RhIHZzIDE4IGthYnVwYXRlbikuDQoNCg0KIyMjIDMuMy4yIFZpc3VhbGlzYXNpIFVrdXJhbiBFcGlkZW1pb2xvZ2kNCg0KIyMjIyBhLiBJbmNpZGVuY2UgUmF0ZSAoSVIpDQoNCmBgYHtyfQ0KcF9pciA8LSBkZiAlPiUNCiAgbXV0YXRlKG5hbWFfa2FiID0gcmVvcmRlcihuYW1hX2thYiwgSVIpKSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gSVIsIHkgPSBuYW1hX2thYiwgZmlsbCA9IHRpcGUpKSArDQogIGdlb21fY29sKGFscGhhID0gMC44NSkgKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSByYXRlX2phYmFyICogMTAwMDAsDQogICAgICAgICAgICAgbGluZXR5cGUgPSAiZGFzaGVkIiwgY29sb3IgPSAiI2YzOWMxMiIsIGxpbmV3aWR0aCA9IDAuOSkgKw0KICBhbm5vdGF0ZSgidGV4dCIsDQogICAgICAgICAgIHggICAgID0gcmF0ZV9qYWJhciAqIDEwMDAwICsgNSwNCiAgICAgICAgICAgeSAgICAgPSAyLA0KICAgICAgICAgICBsYWJlbCA9IHBhc3RlMCgiSVIgSmFiYXJcbiIsIHJvdW5kKHJhdGVfamFiYXIqMTAwMDAsIDEpKSwNCiAgICAgICAgICAgY29sb3IgPSAiI2YzOWMxMiIsIHNpemUgPSAzLCBoanVzdCA9IDApICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiS2FidXBhdGVuIiA9ICIjMzQ5OGRiIiwgIktvdGEiID0gIiNlNzRjM2MiKSkgKw0KICBzY2FsZV94X2NvbnRpbnVvdXMobGFiZWxzID0gY29tbWEpICsNCiAgbGFicygNCiAgICB0aXRsZSAgICA9ICJJbmNpZGVuY2UgUmF0ZSBEaWFyZSBwZXIgMTAuMDAwIFBlbmR1ZHVrIiwNCiAgICBzdWJ0aXRsZSA9ICJKYXdhIEJhcmF0IDIwMjQgfCBHYXJpcyBvcmFueWUgPSBJUiByYXRhLXJhdGEgUHJvdmluc2kiLA0KICAgIHggICAgICAgID0gIklSIHBlciAxMC4wMDAgUGVuZHVkdWsiLA0KICAgIHkgICAgICAgID0gTlVMTCwNCiAgICBmaWxsICAgICA9ICJUaXBlIFdpbGF5YWgiDQogICkgKw0KICB0aGVtZV9taW5pbWFsKGJhc2Vfc2l6ZSA9IDEwKSArDQogIHRoZW1lKA0KICAgIHBsb3QudGl0bGUgICAgICAgICAgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiwgc2l6ZSA9IDEyKSwNCiAgICBwYW5lbC5ncmlkLm1ham9yLnkgID0gZWxlbWVudF9ibGFuaygpLA0KICAgIGxlZ2VuZC5wb3NpdGlvbiAgICAgPSAiYm90dG9tIg0KICApDQpwcmludChwX2lyKQ0KYGBgDQoNCg0KPGRpdiBhbGlnbj0iY2VudGVyIj4NCioqR2FtYmFyIDEuKiogRGlhZ3JhbSBCYXRhbmcgSW5jaWRlbmNlIFJhdGUgKElSKSBEaWFyZQ0KPC9kaXY+DQoNCg0KKipJbnRlcnByZXRhc2k6KioNCg0KQmVyZGFzYXJrYW4gR2FtYmFyIDEsIG5pbGFpIEluY2lkZW5jZSBSYXRlIChJUikgZGlhcmUgZGkga2FidXBhdGVuL2tvdGEgUHJvdmluc2kgSmF3YSBCYXJhdCB0YWh1biAyMDI0IG1lbnVuanVra2FuIHZhcmlhc2kgeWFuZyBjdWt1cCBiZXNhci4gS290YSBDaXJlYm9uIG1lbWlsaWtpIElSIHRlcnRpbmdnaSwgZGlpa3V0aSBvbGVoIEtvdGEgQm9nb3IgZGFuIEtvdGEgU3VrYWJ1bWkuIFNlbWVudGFyYSBpdHUsIEthYnVwYXRlbiBCZWthc2kgbWVtaWxpa2kgSVIgdGVyZW5kYWguIFJhdGEtcmF0YSBJUiBQcm92aW5zaSBKYXdhIEJhcmF0IHNlYmVzYXIgMTMzLDUga2FzdXMgcGVyIDEwLjAwMCBwZW5kdWR1aywgZGVuZ2FuIGJlYmVyYXBhIGtvdGEgYmVyYWRhIGphdWggZGkgYXRhcyBuaWxhaSByYXRhLXJhdGEgdGVyc2VidXQuIFNlY2FyYSB1bXVtLCB3aWxheWFoIHBlcmtvdGFhbiBjZW5kZXJ1bmcgbWVtaWxpa2kgSVIgeWFuZyBsZWJpaCB0aW5nZ2kgZGliYW5kaW5na2FuIHNlYmFnaWFuIGJlc2FyIHdpbGF5YWgga2FidXBhdGVuLiANCg0KDQpgYGB7cn0NCmphYmFyIDwtIGphYmFyICU+JQ0KICBtdXRhdGUoDQogICAga2F0ZWdvcmlfSVIgPSBjdXQoDQogICAgICBJUiwNCiAgICAgIGJyZWFrcyA9IGMoLUluZiwgMTAwLCAxNTAsIDIwMCwgMzAwLCBJbmYpLA0KICAgICAgbGFiZWxzID0gYygNCiAgICAgICAgIjwxMDAiLA0KICAgICAgICAiMTAwLTE1MCIsDQogICAgICAgICIxNTEtMjAwIiwNCiAgICAgICAgIjIwMS0zMDAiLA0KICAgICAgICAiPjMwMCINCiAgICAgICkNCiAgICApDQogICkNCg0KcGV0YV9pciA8LSBnZ3Bsb3QoamFiYXIpICsNCiAgDQogIGdlb21fc2YoDQogICAgYWVzKGZpbGwgPSBrYXRlZ29yaV9JUiksDQogICAgY29sb3IgPSAid2hpdGUiLA0KICAgIGxpbmV3aWR0aCA9IDAuMw0KICApICsNCiAgDQogIHNjYWxlX2ZpbGxfYnJld2VyKA0KICAgIHBhbGV0dGUgPSAiWWxPclJkIiwNCiAgICBuYW1lID0gIklSXG5wZXIgMTAuMDAwIg0KICApICsNCiAgDQogIGxhYnMoDQogICAgdGl0bGUgPSAiUGV0YSBJbmNpZGVuY2UgUmF0ZSAoSVIpIERpYXJlIiwNCiAgICBzdWJ0aXRsZSA9ICJLYWJ1cGF0ZW4vS290YSBKYXdhIEJhcmF0IFRhaHVuIDIwMjQiLA0KICAgIGNhcHRpb24gPSAiSVIgPSBLYXN1cyBEaWFyZSBwZXIgMTAuMDAwIFBlbmR1ZHVrIg0KICApICsNCiAgDQogIHRoZW1lX21pbmltYWwoKSArDQogIA0KICB0aGVtZSgNCiAgICBheGlzLnRleHQgPSBlbGVtZW50X2JsYW5rKCksDQogICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICBwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpLA0KICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoDQogICAgICBmYWNlID0gImJvbGQiLA0KICAgICAgaGp1c3QgPSAwLjUNCiAgICApDQogICkNCg0KcHJpbnQocGV0YV9pcikNCmBgYA0KDQo8ZGl2IGFsaWduPSJjZW50ZXIiPg0KKipHYW1iYXIgMi4qKiBQZXRhIENob3JvcGxldGggSW5jaWRlbmNlIFJhdGUgKElSKSBEaWFyZSANCjwvZGl2Pg0KDQoNCioqSW50ZXJwcmV0YXNpOioqDQoNCkJlcmRhc2Fya2FuIEdhbWJhciAyLCBzZWJhcmFuIHNwYXNpYWwgSW5jaWRlbmNlIFJhdGUgKElSKSBkaWFyZSBkaSBKYXdhIEJhcmF0IHRhaHVuIDIwMjQgdGlkYWsgbWVyYXRhIGFudGFyd2lsYXlhaC4gV2lsYXlhaCBkZW5nYW4ga2F0ZWdvcmkgSVIgc2FuZ2F0IHRpbmdnaSAoPjMwMCBrYXN1cyBwZXIgMTAuMDAwIHBlbmR1ZHVrKSB0ZXJrb25zZW50cmFzaSBwYWRhIGJlYmVyYXBhIGtvdGEsIHRlcnV0YW1hIEtvdGEgQ2lyZWJvbiwgS290YSBCb2dvciwgZGFuIEtvdGEgU3VrYWJ1bWkuIFNlYmFnaWFuIGJlc2FyIGthYnVwYXRlbiBiZXJhZGEgcGFkYSBrYXRlZ29yaSByZW5kYWggaGluZ2dhIHNlZGFuZy4gUG9sYSBpbmkgbWVudW5qdWtrYW4gYWRhbnlhIHBlcmJlZGFhbiB0aW5na2F0IGtlamFkaWFuIGRpYXJlIGFudGFyd2lsYXlhaCB5YW5nIG1lbmdpbmRpa2FzaWthbiBrZW11bmdraW5hbiBhZGFueWEgcGVuZ2FydWggZmFrdG9yLWZha3RvciBsb2thbCBkYW4gc3Bhc2lhbC4NCg0KLS0tDQoNCiMjIyMgYi4gMy4zLjIgU3RhbmRhcmRpemVkIEluY2lkZW5jZSBSYXRpbyAoU0lSKQ0KDQoNCg0KYGBge3J9DQpwX3NpciA8LSBkZiAlPiUNCiAgbXV0YXRlKA0KICAgIG5hbWFfa2FiID0gcmVvcmRlcihuYW1hX2thYiwgU0lSKSwNCiAgICB3YXJuYSAgICA9IGNhc2Vfd2hlbigNCiAgICAgIFNJUiA+PSAyICAgfiAiI2MwMzkyYiIsDQogICAgICBTSVIgPj0gMSAgIH4gIiNlNjdlMjIiLA0KICAgICAgU0lSID49IDAuNSB+ICIjMjdhZTYwIiwNCiAgICAgIFRSVUUgICAgICAgfiAiIzI5ODBiOSINCiAgICApDQogICkgJT4lDQogIGdncGxvdChhZXMoeCA9IFNJUiwgeSA9IG5hbWFfa2FiLCBmaWxsID0gd2FybmEpKSArDQogIGdlb21fY29sKGFscGhhID0gMC44NSkgKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAxLCBsaW5ldHlwZSA9ICJkYXNoZWQiLA0KICAgICAgICAgICAgIGNvbG9yID0gImJsYWNrIiwgbGluZXdpZHRoID0gMSkgKw0KICBzY2FsZV9maWxsX2lkZW50aXR5KA0KICAgIGd1aWRlICA9ICJsZWdlbmQiLA0KICAgIGxhYmVscyA9IGMoIiNjMDM5MmIiID0gIlNhbmdhdCBUaW5nZ2kgKOKJpTIpIiwNCiAgICAgICAgICAgICAgICIjZTY3ZTIyIiA9ICJUaW5nZ2kgKDHigJMyKSIsDQogICAgICAgICAgICAgICAiIzI3YWU2MCIgPSAiUmVuZGFoICgwLjXigJMxKSIsDQogICAgICAgICAgICAgICAiIzI5ODBiOSIgPSAiU2FuZ2F0IFJlbmRhaCAoPDAuNSkiKSwNCiAgICBicmVha3MgPSBjKCIjYzAzOTJiIiwiI2U2N2UyMiIsIiMyN2FlNjAiLCIjMjk4MGI5IikNCiAgKSArDQogIGxhYnMoDQogICAgdGl0bGUgICAgPSAiU3RhbmRhcmRpemVkIEluY2lkZW5jZSBSYXRpbyAoU0lSKSBEaWFyZSIsDQogICAgc3VidGl0bGUgPSAiSmF3YSBCYXJhdCAyMDI0IHwgR2FyaXMgPSBTSVIgMS4wIChyYXRhLXJhdGEgcHJvdmluc2kpIiwNCiAgICB4ICAgICAgICA9ICJTSVIiLA0KICAgIHkgICAgICAgID0gTlVMTCwNCiAgICBmaWxsICAgICA9ICJLYXRlZ29yaSBSaXNpa28iDQogICkgKw0KICB0aGVtZV9taW5pbWFsKGJhc2Vfc2l6ZSA9IDEwKSArDQogIHRoZW1lKA0KICAgIHBsb3QudGl0bGUgICAgICAgICAgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiwgc2l6ZSA9IDEyKSwNCiAgICBwYW5lbC5ncmlkLm1ham9yLnkgID0gZWxlbWVudF9ibGFuaygpLA0KICAgIGxlZ2VuZC5wb3NpdGlvbiAgICAgPSAiYm90dG9tIg0KICApDQpwcmludChwX3NpcikNCmBgYA0KDQo8ZGl2IGFsaWduPSJjZW50ZXIiPg0KKipHYW1iYXIgMy4qKiBEaWFncmFtIEJhdGFuZyBTdGFuZGFyZGl6ZWQgSW5jaWRlbmNlIFJhdGlvIChTSVIpIERpYXJlIDwvZGl2Pg0KDQoqKkludGVycHJldGFzaToqKg0KDQpCZXJkYXNhcmthbiBHYW1iYXIgMywgbmlsYWkgU3RhbmRhcmRpemVkIEluY2lkZW5jZSBSYXRpbyAoU0lSKSBkaWFyZSBkaSBKYXdhIEJhcmF0IHRhaHVuIDIwMjQgbWVudW5qdWtrYW4gdmFyaWFzaSBhbnRhciBrYWJ1cGF0ZW4va290YS4gS290YSBDaXJlYm9uIG1lbWlsaWtpIG5pbGFpIFNJUiB0ZXJ0aW5nZ2ksIGRpaWt1dGkgb2xlaCBLb3RhIEJvZ29yIGRhbiBLb3RhIFN1a2FidW1pLiBOaWxhaSBTSVIgZGkgYXRhcyAxIG1lbnVuanVra2FuIGJhaHdhIGp1bWxhaCBrYXN1cyBkaWFyZSB5YW5nIHRlcmphZGkgbGViaWggdGluZ2dpIGRpYmFuZGluZ2thbiBqdW1sYWgga2FzdXMgeWFuZyBkaWhhcmFwa2FuIGJlcmRhc2Fya2FuIHJhdGEtcmF0YSBwcm92aW5zaS4gU2ViYWxpa255YSwgS2FidXBhdGVuIEJla2FzaSBtZW1pbGlraSBuaWxhaSBTSVIgdGVyZW5kYWggZGVuZ2FuIG5pbGFpIGRpIGJhd2FoIDEsIHlhbmcgbWVudW5qdWtrYW4gYmFod2EganVtbGFoIGthc3VzIHlhbmcgdGVyamFkaSBsZWJpaCByZW5kYWggZGliYW5kaW5na2FuIGp1bWxhaCBrYXN1cyB5YW5nIGRpaGFyYXBrYW4uIFNlY2FyYSB1bXVtLCBzZWJhZ2lhbiBiZXNhciBrb3RhIG1lbWlsaWtpIG5pbGFpIFNJUiB5YW5nIGxlYmloIHRpbmdnaSBkaWJhbmRpbmdrYW4ga2FidXBhdGVuLCBtZW5naW5kaWthc2lrYW4gcmlzaWtvIGtlamFkaWFuIGRpYXJlIHlhbmcgcmVsYXRpZiBsZWJpaCBiZXNhciBwYWRhIHdpbGF5YWggdGVyc2VidXQuDQoNCi0tLQ0KDQoNCmBgYHtyfQ0KcGV0YV9zaXIgPC0gZ2dwbG90KGphYmFyKSArDQogIA0KICBnZW9tX3NmKA0KICAgIGFlcyhmaWxsID0ga2F0ZWdvcmlfU0lSKSwNCiAgICBjb2xvciA9ICJ3aGl0ZSIsDQogICAgbGluZXdpZHRoID0gMC4zDQogICkgKw0KICANCiAgc2NhbGVfZmlsbF9tYW51YWwoDQogICAgdmFsdWVzID0gYygNCiAgICAgICI8MC44MCIgICAgID0gIiM0NTc1QjQiLA0KICAgICAgIjAuODAtMC45OSIgPSAiIzkxQkZEQiIsDQogICAgICAiMS4wMC0xLjE5IiA9ICIjRkZGRkJGIiwNCiAgICAgICIxLjIwLTEuNDkiID0gIiNGQzhENTkiLA0KICAgICAgIj49MS41MCIgICAgPSAiI0Q3MzAyNyINCiAgICApLA0KICAgIG5hbWUgPSAiS2F0ZWdvcmkgU0lSIg0KICApICsNCiAgDQogIGxhYnMoDQogICAgdGl0bGUgPSAiUGV0YSBTdGFuZGFyZGl6ZWQgSW5jaWRlbmNlIFJhdGlvIChTSVIpIiwNCiAgICBzdWJ0aXRsZSA9ICJLYWJ1cGF0ZW4vS290YSBKYXdhIEJhcmF0IFRhaHVuIDIwMjQiLA0KICAgIGNhcHRpb24gPSAiU0lSID0gT2JzZXJ2ZWQgQ2FzZXMgLyBFeHBlY3RlZCBDYXNlcyINCiAgKSArDQogIA0KICB0aGVtZV9taW5pbWFsKCkgKw0KICANCiAgdGhlbWUoDQogICAgYXhpcy50ZXh0ID0gZWxlbWVudF9ibGFuaygpLA0KICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X2JsYW5rKCksDQogICAgcGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KA0KICAgICAgZmFjZSA9ICJib2xkIiwNCiAgICAgIGhqdXN0ID0gMC41DQogICAgKQ0KICApDQoNCnByaW50KHBldGFfc2lyKQ0KDQpgYGANCg0KPGRpdiBhbGlnbj0iY2VudGVyIj4NCioqR2FtYmFyIDQuKiogUGV0YSBDaG9yb3BsZXRoIFN0YW5kYXJkaXplZCBJbmNpZGVuY2UgUmF0aW8gKFNJUikgRGlhcmUNCjwvZGl2Pg0KDQoqKkludGVycHJldGFzaToqKg0KDQpCZXJkYXNhcmthbiBHYW1iYXIgNCwgZGlzdHJpYnVzaSBzcGFzaWFsIG5pbGFpIFNJUiBkaWFyZSBkaSBKYXdhIEJhcmF0IHRhaHVuIDIwMjQgbWVudW5qdWtrYW4gYWRhbnlhIHBlcmJlZGFhbiB0aW5na2F0IHJpc2lrbyBhbnRhcndpbGF5YWguIFdpbGF5YWggZGVuZ2FuIGthdGVnb3JpIFNJUiB0aW5nZ2kgKOKJpTEsNTApIHRlcmtvbnNlbnRyYXNpIHBhZGEgYmViZXJhcGEga290YSwgdGVydXRhbWEgS290YSBDaXJlYm9uLCBLb3RhIEJvZ29yLCBkYW4gS290YSBTdWthYnVtaS4gTmlsYWkgU0lSIHlhbmcgdGluZ2dpIG1lbnVuanVra2FuIGJhaHdhIGp1bWxhaCBrYXN1cyBkaWFyZSB5YW5nIGRpYW1hdGkgamF1aCBsZWJpaCBiZXNhciBkaWJhbmRpbmdrYW4ganVtbGFoIGthc3VzIHlhbmcgZGloYXJhcGthbi4gU2ViYWxpa255YSwgYmViZXJhcGEgd2lsYXlhaCBiZXJhZGEgcGFkYSBrYXRlZ29yaSBTSVIgcmVuZGFoICg8MCw4MCksIHlhbmcgbWVudW5qdWtrYW4ganVtbGFoIGthc3VzIGxlYmloIHJlbmRhaCBkaWJhbmRpbmdrYW4gbmlsYWkgeWFuZyBkaWhhcmFwa2FuLiBQb2xhIGluaSBtZW5naW5kaWthc2lrYW4gYWRhbnlhIHZhcmlhc2kgcmlzaWtvIGtlamFkaWFuIGRpYXJlIGFudGFyIGthYnVwYXRlbi9rb3RhIHNlaGluZ2dhIGRpcGVybHVrYW4gYW5hbGlzaXMgc3Bhc2lhbCBsYW5qdXRhbiB1bnR1ayBtZW5naWRlbnRpZmlrYXNpIGtlbXVuZ2tpbmFuIHBlbmdlbG9tcG9rYW4gd2lsYXlhaCBiZXJpc2lrbyB0aW5nZ2kuDQoNCi0tLQ0KDQojIyAzLjQgQW5hbGlzaXMgU3Bhc2lhbCAoTW9yYW5zJ0kgZGFuIExJU0EpDQoNCiMjIyAzLjQuMSBHbG9iYWwgTW9yYW4ncyBJDQoNCjxkaXYgYWxpZ249ImNlbnRlciI+DQoqKlRhYmVsIDQuKiogSGFzaWwgVWppIEdsb2JhbCBNb3JhbuKAmXMgSQ0KPC9kaXY+DQoNCg0KYGBge3J9DQojIEJhbmd1biBtYXRyaWtzIHBlbWJvYm90IHNwYXNpYWwgKFF1ZWVuIGNvbnRpZ3VpdHkpDQogIG5iIDwtIHBvbHkybmIoamFiYXIsIHF1ZWVuID0gVFJVRSkNCiAgbHcgPC0gbmIybGlzdHcobmIsIHN0eWxlID0gIlciLCB6ZXJvLnBvbGljeSA9IFRSVUUpDQoNCiAgDQptb3Jhbl9pciA8LSBtb3Jhbi50ZXN0KGphYmFyJElSLCBsdywgemVyby5wb2xpY3kgPSBUUlVFLA0KICAgICAgICAgICAgICAgICAgICAgICAgIG5hLmFjdGlvbiA9IG5hLm9taXQpDQpoYXNpbF9tb3JhbiA8LSBkYXRhLmZyYW1lKA0KICBTdGF0aXN0aWsgPSBjKA0KICAgICJNb3JhbidzIEkiLA0KICAgICJFeHBlY3RlZCBNb3JhbidzIEkiLA0KICAgICJWYXJpYW5jZSIsDQogICAgIlotc2NvcmUiLA0KICAgICJwLXZhbHVlIg0KICApLA0KICBOaWxhaSA9IGMoDQogICAgbW9yYW5faXIkZXN0aW1hdGVbMV0sDQogICAgbW9yYW5faXIkZXN0aW1hdGVbMl0sDQogICAgbW9yYW5faXIkZXN0aW1hdGVbM10sDQogICAgbW9yYW5faXIkc3RhdGlzdGljLA0KICAgIG1vcmFuX2lyJHAudmFsdWUNCiAgKQ0KKQ0KDQprYWJsZSgNCiAgaGFzaWxfbW9yYW4scm93Lm5hbWVzID0gRkFMU0UpDQpgYGANCg0KKipJbnRlcnByZXRhc2k6KioNCg0KQmVyZGFzYXJrYW4gaGFzaWwgdWppIE1vcmFuJ3MgSSBwYWRhIFRhYmVsIDMsIGRpcGVyb2xlaCBuaWxhaSBNb3JhbidzIEkgc2ViZXNhciAwLDA1OTcgeWFuZyBtZW51bmp1a2thbiBhZGFueWEga2VjZW5kZXJ1bmdhbiBhdXRva29yZWxhc2kgc3Bhc2lhbCBwb3NpdGlmIHlhbmcgc2FuZ2F0IGxlbWFoIHBhZGEga2VqYWRpYW4gZGlhcmUgYW50YXIga2FidXBhdGVuL2tvdGEgZGkgSmF3YSBCYXJhdCB0YWh1biAyMDI0LiBOaWxhaSB0ZXJzZWJ1dCBsZWJpaCBiZXNhciBkaWJhbmRpbmdrYW4gbmlsYWkgZWtzcGVrdGFzaSBNb3JhbidzIEkgc2ViZXNhciAtMCwwMzg1LCBuYW11biBuaWxhaSBhdXRva29yZWxhc2kgeWFuZyB0ZXJiZW50dWsgcmVsYXRpZiBrZWNpbC4gSGFzaWwgcGVuZ3VqaWFuIHN0YXRpc3RpayBtZW51bmp1a2thbiBuaWxhaSBaLXNjb3JlIHNlYmVzYXIgMCw3NTE4IGRlbmdhbiBwLXZhbHVlIHNlYmVzYXIgMCwyMjYxIChwID4gMCwwNSkuIERlbmdhbiBkZW1pa2lhbiwgdGlkYWsgdGVyZGFwYXQgYnVrdGkgeWFuZyBjdWt1cCB1bnR1ayBtZW5vbGFrIGhpcG90ZXNpcyBub2wsIHNlaGluZ2dhIGRhcGF0IGRpc2ltcHVsa2FuIGJhaHdhIHRpZGFrIHRlcmRhcGF0IGF1dG9rb3JlbGFzaSBzcGFzaWFsIGdsb2JhbCB5YW5nIHNpZ25pZmlrYW4gcGFkYSBkaXN0cmlidXNpIGthc3VzIGRpYXJlIGRpIEphd2EgQmFyYXQgdGFodW4gMjAyNC4gRGVuZ2FuIGthdGEgbGFpbiwgcG9sYSBwZW55ZWJhcmFuIGthc3VzIGRpYXJlIGFudGFyIGthYnVwYXRlbi9rb3RhIGNlbmRlcnVuZyB0aWRhayBtZW1iZW50dWsgcG9sYSBwZW5nZWxvbXBva2FuIChjbHVzdGVyKSBtYXVwdW4gcGVueWViYXJhbiB5YW5nIHNpZ25pZmlrYW4gc2VjYXJhIGdsb2JhbC4NCg0KLS0tDQoNCmBgYHtyfQ0KICBtb3Jhbi5wbG90KA0KICAgIGphYmFyJElSLCBsdywNCiAgICB6ZXJvLnBvbGljeSA9IFRSVUUsDQogICAgbGFiZWxzICAgICAgPSBhcy5jaGFyYWN0ZXIoamFiYXIkbmFtYV9rYWIpLA0KICAgIG1haW4gICAgICAgID0gIk1vcmFuIFNjYXR0ZXJwbG90IOKAkyBJUiBEaWFyZSBKYXdhIEJhcmF0IDIwMjQiLA0KICAgIHhsYWIgICAgICAgID0gIklSIChzdGFuZGFyZGl6ZWQpIiwNCiAgICB5bGFiICAgICAgICA9ICJTcGF0aWFsIExhZyBJUiINCiAgKQ0KYGBgDQoNCjxkaXYgYWxpZ249ImNlbnRlciI+DQoqKkdhbWJhciA1LioqIE1vcmFu4oCZcyBTY2F0dGVycGxvdA0KPC9kaXY+DQoNCioqSW50ZXJwcmV0YXNpOioqDQoNCkJlcmRhc2Fya2FuIEdhbWJhciA1LCBNb3JhbiBTY2F0dGVycGxvdCBtZW51bmp1a2thbiBrZWNlbmRlcnVuZ2FuIGF1dG9rb3JlbGFzaSBzcGFzaWFsIHBvc2l0aWYgeWFuZyBsZW1haCBwYWRhIG5pbGFpIEluY2lkZW5jZSBSYXRlIChJUikgZGlhcmUgZGkgSmF3YSBCYXJhdCB0YWh1biAyMDI0LiBIYWwgaW5pIGRpdHVuanVra2FuIG9sZWgga2VtaXJpbmdhbiBnYXJpcyByZWdyZXNpIHlhbmcgcG9zaXRpZiwgbmFtdW4gcmVsYXRpZiBsYW5kYWkuIEJlYmVyYXBhIHdpbGF5YWggc2VwZXJ0aSBLb3RhIENpcmVib24gZGFuIEtvdGEgU3VrYWJ1bWkgYmVyYWRhIHBhZGEga2Vsb21wb2sgd2lsYXlhaCBkZW5nYW4gbmlsYWkgSVIgdGluZ2dpLCBzZWRhbmdrYW4gS2FidXBhdGVuIENpcmVib24gbWVudW5qdWtrYW4gcG9sYSB5YW5nIGJlcmJlZGEgZGliYW5kaW5na2FuIHdpbGF5YWggZGkgc2VraXRhcm55YS4gU2VjYXJhIHVtdW0sIHNlYmFnaWFuIGJlc2FyIGthYnVwYXRlbi9rb3RhIHRlcnNlYmFyIGRpIHNla2l0YXIgbmlsYWkgcmF0YS1yYXRhLCBzZWhpbmdnYSB0aWRhayB0ZXJsaWhhdCBhZGFueWEgcGVuZ2Vsb21wb2thbiBzcGFzaWFsIHlhbmcga3VhdC4gSGFzaWwgaW5pIHNlamFsYW4gZGVuZ2FuIHVqaSBNb3JhbidzIEkgeWFuZyBtZW51bmp1a2thbiBiYWh3YSBhdXRva29yZWxhc2kgc3Bhc2lhbCBnbG9iYWwgdGlkYWsgc2lnbmlmaWthbi4NCg0KLS0tDQoNCiMjIyAzLjQuMiBMb2NhbCBNb3JhbidzIEkgKExJU0EpDQoNCg0KYGBge3J9DQogIGxvY2FsX21vcmFuIDwtIGxvY2FsbW9yYW4oamFiYXIkSVIsIGx3LCB6ZXJvLnBvbGljeSA9IFRSVUUpDQogIA0KICBqYWJhciRJaSAgICAgIDwtIGxvY2FsX21vcmFuWywgMV0NCiAgamFiYXIkWl9JaSAgICA8LSBsb2NhbF9tb3JhblssIDRdDQogIGphYmFyJHBfbGlzYSAgPC0gbG9jYWxfbW9yYW5bLCA1XQ0KICANCiAgIyBLbGFzaWZpa2FzaSBrbGFzdGVyIExJU0ENCiAgSVJfc3RkICA8LSBzY2FsZShqYWJhciRJUilbLCAxXQ0KICBsYWdfSVIgIDwtIGxhZy5saXN0dyhsdywgSVJfc3RkLCB6ZXJvLnBvbGljeSA9IFRSVUUpDQogIA0KICBqYWJhciRMSVNBX2NsdXN0ZXIgPC0gIk5vdCBTaWduaWZpY2FudCINCiAgamFiYXIkTElTQV9jbHVzdGVyW0lSX3N0ZCA+IDAgJiBsYWdfSVIgPiAwICYgamFiYXIkcF9saXNhIDwgMC4wNV0gPC0gIkhpZ2gtSGlnaCINCiAgamFiYXIkTElTQV9jbHVzdGVyW0lSX3N0ZCA8IDAgJiBsYWdfSVIgPCAwICYgamFiYXIkcF9saXNhIDwgMC4wNV0gPC0gIkxvdy1Mb3ciDQogIGphYmFyJExJU0FfY2x1c3RlcltJUl9zdGQgPiAwICYgbGFnX0lSIDwgMCAmIGphYmFyJHBfbGlzYSA8IDAuMDVdIDwtICJIaWdoLUxvdyINCiAgamFiYXIkTElTQV9jbHVzdGVyW0lSX3N0ZCA8IDAgJiBsYWdfSVIgPiAwICYgamFiYXIkcF9saXNhIDwgMC4wNV0gPC0gIkxvdy1IaWdoIg0KICANCiAgIyBQZXRhIExJU0ENCiAgd2FybmFfbGlzYSA8LSBjKA0KICAgICJIaWdoLUhpZ2giICAgICAgID0gIiNlNzRjM2MiLA0KICAgICJMb3ctTG93IiAgICAgICAgID0gIiMzNDk4ZGIiLA0KICAgICJIaWdoLUxvdyIgICAgICAgID0gIiNlNjdlMjIiLA0KICAgICJMb3ctSGlnaCIgICAgICAgID0gIiM4NWMxZTkiLA0KICAgICJOb3QgU2lnbmlmaWNhbnQiID0gImdyZXk4NSINCiAgKQ0KICANCiAgcF9saXNhIDwtIGdncGxvdChqYWJhcikgKw0KICAgIGdlb21fc2YoYWVzKGZpbGwgPSBMSVNBX2NsdXN0ZXIpLCBjb2xvciA9ICJ3aGl0ZSIsIGxpbmV3aWR0aCA9IDAuMykgKw0KICAgIHNjYWxlX2ZpbGxfbWFudWFsKA0KICAgICAgdmFsdWVzID0gd2FybmFfbGlzYSwNCiAgICAgIG5hbWUgICA9ICJLbGFzdGVyIExJU0EiDQogICAgKSArDQogICAgbGFicygNCiAgICAgIHRpdGxlICAgID0gIlBldGEgS2xhc3RlciBMSVNBIOKAkyBJUiBEaWFyZSBKYXdhIEJhcmF0IDIwMjQiLA0KICAgICAgc3VidGl0bGUgPSAiU2lnbmlmaWthbnNpIHAgPCAwLjA1IHwgUXVlZW4gQ29udGlndWl0eSBXZWlnaHRzIiwNCiAgICAgIGNhcHRpb24gID0gIlN1bWJlcjogT3BlbiBEYXRhIEphYmFyIDIwMjQiDQogICAgKSArDQogICAgdGhlbWVfbWluaW1hbChiYXNlX3NpemUgPSAxMSkgKw0KICAgIHRoZW1lKA0KICAgICAgcGxvdC50aXRsZSAgICA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiLCBzaXplID0gMTMpLA0KICAgICAgbGVnZW5kLnBvc2l0aW9uID0gInJpZ2h0Ig0KICAgICkNCiAgcHJpbnQocF9saXNhKQ0KYGBgDQoNCjxkaXYgYWxpZ249ImNlbnRlciI+DQoqKkdhbWJhciA2LioqIFBldGEgS2xhc3RlciBMSVNBDQo8L2Rpdj4NCg0KKipJbnRlcnByZXRhc2k6KioNCg0KQmVyZGFzYXJrYW4gR2FtYmFyIDYsIGhhc2lsIGFuYWxpc2lzIExvY2FsIEluZGljYXRvcnMgb2YgU3BhdGlhbCBBc3NvY2lhdGlvbiAoTElTQSkgbWVudW5qdWtrYW4gYmFod2EgdGlkYWsgdGVyZGFwYXQga2xhc3RlciBzcGFzaWFsIHlhbmcgc2lnbmlmaWthbiBwYWRhIHRpbmdrYXQgc2lnbmlmaWthbnNpIDUlIChwIDwgMCwwNSkgdW50dWsgbmlsYWkgSW5jaWRlbmNlIFJhdGUgKElSKSBkaWFyZSBkaSBrYWJ1cGF0ZW4va290YSBQcm92aW5zaSBKYXdhIEJhcmF0IHRhaHVuIDIwMjQuIFNlbHVydWggd2lsYXlhaCBkaWthdGVnb3Jpa2FuIHNlYmFnYWkgTm90IFNpZ25pZmljYW50LCB5YW5nIG1lbnVuanVra2FuIGJhaHdhIHRpZGFrIGRpdGVtdWthbiBwb2xhIHBlbmdlbG9tcG9rYW4gbG9rYWwgYmVydXBhIGtsYXN0ZXIgSGlnaC1IaWdoIChISCksIExvdy1Mb3cgKExMKSwgbWF1cHVuIG91dGxpZXIgc3Bhc2lhbCBIaWdoLUxvdyAoSEwpIGRhbiBMb3ctSGlnaCAoTEgpLiBIYXNpbCBpbmkgbWVuZ2luZGlrYXNpa2FuIGJhaHdhIGRpc3RyaWJ1c2kga2VqYWRpYW4gZGlhcmUgZGkgSmF3YSBCYXJhdCB0YWh1biAyMDI0IHRpZGFrIG1lbnVuanVra2FuIGFkYW55YSBwZW5nZWxvbXBva2FuIHNwYXNpYWwgbG9rYWwgeWFuZyBzaWduaWZpa2FuIGFudGFyIGthYnVwYXRlbi9rb3RhLiBUZW11YW4gdGVyc2VidXQgc2VqYWxhbiBkZW5nYW4gaGFzaWwgdWppIE1vcmFuJ3MgSSB5YW5nIGp1Z2EgbWVudW5qdWtrYW4gdGlkYWsgYWRhbnlhIGF1dG9rb3JlbGFzaSBzcGFzaWFsIGdsb2JhbCB5YW5nIHNpZ25pZmlrYW4uDQoNCi0tLQ0KDQojIyAzLjUgVUppIE92ZXJkaXNwZXJzaSBkYW4gVklGDQoNCiMjIyAzLjUuMSBVSmkgT3ZlcmRpc3BlcnNpDQoNCjxkaXYgYWxpZ249ImNlbnRlciI+DQoqKlRhYmVsIDUuKiogSGFzaWwgIFVqaSBPdmVyZGlzcGVyc2kNCjwvZGl2Pg0KDQoNCmBgYHtyfQ0KIyBWYXJpYW5jZS10by1NZWFuIFJhdGlvIChWTVIpDQp2bXIgPC0gdmFyKGRmJGRpYXJlLCBuYS5ybSA9IFRSVUUpIC8NCiAgICAgICBtZWFuKGRmJGRpYXJlLCBuYS5ybSA9IFRSVUUpDQoNCnRhYmVsX3ZtciA8LSBkYXRhLmZyYW1lKA0KICBTdGF0aXN0aWsgPSBjKA0KICAgICJSYXRhLXJhdGEgS2FzdXMiLA0KICAgICJWYXJpYW5zIEthc3VzIiwNCiAgICAiVmFyaWFuY2UtdG8tTWVhbiBSYXRpbyAoVk1SKSINCiAgKSwNCiAgTmlsYWkgPSBjKA0KICAgIG1lYW4oZGYkZGlhcmUsIG5hLnJtID0gVFJVRSksDQogICAgdmFyKGRmJGRpYXJlLCBuYS5ybSA9IFRSVUUpLA0KICAgIHZtcg0KICApDQopDQoNCmthYmxlKHRhYmVsX3ZtcikNCmBgYA0KDQoqKkludGVycHJldGFzaToqKg0KDQpIYXNpbCBhbmFsaXNpcyBtZW51bmp1a2thbiB0ZXJqYWRpbnlhIG92ZXJkaXNwZXJzaSBwYWRhIG1vZGVsIHJlZ3Jlc2kgUG9pc3NvbiwgZGVuZ2FuIG5pbGFpIFZhcmlhbmNlLXRvLU1lYW4gUmF0aW8gKFZNUikgc2ViZXNhciA2MTEwLDcwIChWYXI+TWVhbikuIEZlbm9tZW5hIGluaSBzaWduaWZpa2FuIHNlY2FyYSBzdGF0aXN0aWsgYmVyZGFzYXJrYW4gWiBTdGF0aXN0aWMgc2ViZXNhciAzLDgxNiBkZW5nYW4gcC12YWx1ZSAwLDAwMDA2NzkgKHA8MCwwNSksIHNlaGluZ2dhIGhpcG90ZXNpcyBlcXVpZGlzcGVyc2lvbiBkaXRvbGFrLiBQZWxhbmdnYXJhbiBhc3Vtc2kgaW5pIG1lbnllYmFia2FuIHJlZ3Jlc2kgUG9pc3NvbiBzdGFuZGFyIG1lbmphZGkgdGlkYWsgZWZpc2llbiBrYXJlbmEgbWVuZ2hhc2lsa2FuIHN0YW5kYXJkIGVycm9yIHlhbmcgdGVybGFsdSBrZWNpbCAodW5kZXJlc3RpbWF0ZWQpIGRhbiBtZW1pY3Ugc2lnbmlmaWthbnNpIHNlbXUuIE9sZWgga2FyZW5hIGl0dSwgdW50dWsgbWVuZ2F0YXNpIG92ZXJkaXNwZXJzaSBkYW4gbWVuamFtaW4gZXN0aW1hc2kgcGFyYW1ldGVyIHlhbmcgdmFsaWQsIGFuYWxpc2lzIGRpYWxpaGthbiBtZW5nZ3VuYWthbiBtb2RlbCBSZWdyZXNpIEJpbm9taWFsIE5lZ2F0aWYuDQoNCi0tLQ0KDQojIyMgMy41LjIgTXVsdGlrb2xpbmVhcml0YXMNCg0KPGRpdiBhbGlnbj0iY2VudGVyIj4NCioqVGFiZWwgNi4qKiBIYXNpbCAgVWppIE11bHRpa29saW5lYXJpdGFzDQo8L2Rpdj4NCg0KDQpgYGB7cn0NCm1fdmlmIDwtIGxtKA0KICBsb2cxcChkaWFyZSkgfg0KICAgIGZhc2tlc19zdGQgKyBhaXJfc3RkICsgc2FuaXRhc2lfc3RkICsNCiAgICBpcG1fc3RkICsga2VtaXNraW5hbl9zdGQgKyBrZXBhZGF0YW5fc3RkLA0KICBkYXRhID0gZGYNCikNCg0KdmlmX3ZhbHMgPC0gdmlmKG1fdmlmKQ0KDQp0YWJlbF92aWYgPC0gZGF0YS5mcmFtZSgNCiAgVmFyaWFiZWwgPSBuYW1lcyh2aWZfdmFscyksDQogIFZJRiA9IGFzLm51bWVyaWModmlmX3ZhbHMpDQopDQoNCmthYmxlKA0KICB0YWJlbF92aWYsDQogIGRpZ2l0cyA9IDMpDQpgYGANCg0KKipJbnRlcnByZXRhc2k6KioNCg0KRXZhbHVhc2kgdGVyaGFkYXAgYXN1bXNpIG5vbi1tdWx0aWtvbGluaWVyaXRhcyBkaWxha3VrYW4gZGVuZ2FuIG1lbmdhbWF0aSBuaWxhaSBWYXJpYW5jZSBJbmZsYXRpb24gRmFjdG9yIChWSUYpIHBhZGEgbWFzaW5nLW1hc2luZyB2YXJpYWJlbCBwcmVkaWt0b3IuIFNlY2FyYSB0ZW9yZXRpcywgZ2VqYWxhIG11bHRpa29saW5pZXJpdGFzIGRpYW5nZ2FwIHRpZGFrIG1lbmphZGkgbWFzYWxhaCB5YW5nIG1lbmdnYW5nZ3UgZXN0aW1hc2kgbW9kZWwgYXBhYmlsYSBuaWxhaSBWSUYgbGViaWgga2VjaWwgZGFyaSAxMCAoYXRhdSBkYWxhbSBrcml0ZXJpYSB5YW5nIGxlYmloIGtldGF0LCBsZWJpaCBrZWNpbCBkYXJpIDUpLiBIYXNpbCBhbmFsaXNpcyBtZW51bmp1a2thbiBiYWh3YSB2YXJpYWJlbCBmYXNrZXMgKDEsMjIwKSwgYWlyIG1pbnVtICgyLDAzNiksIHNhbml0YXNpICgxLDIzNSksIGRhbiBrZW1pc2tpbmFuICgzLDE4NikgbWVtaWxpa2kgbmlsYWkgVklGIHlhbmcgc2FuZ2F0IGFtYW4gZGkgYmF3YWggNS4gRGkgc2lzaSBsYWluLCB2YXJpYWJlbCBpcG1fc3RkIGRhbiBrZXBhZGF0YW4gbWVudW5qdWtrYW4gbmlsYWkgVklGIHlhbmcgcmVsYXRpZiBsZWJpaCB0aW5nZ2ksIG1hc2luZy1tYXNpbmcgc2ViZXNhciA3LDU0MiBkYW4gNywyNDYuIFRpbmdnaW55YSBuaWxhaSBWSUYgcGFkYSBrZWR1YSB2YXJpYWJlbCBpbmkgbWVuZ2luZGlrYXNpa2FuIGFkYW55YSBrb3JlbGFzaSBtb2RlcmF0IHlhbmcgd2FqYXIsIG1lbmdpbmdhdCBpbmRpa2F0b3IgcGVtYmFuZ3VuYW4gbWFudXNpYSAoSVBNKSBkYW4ga2VwYWRhdGFuIHBlbmR1ZHVrIHNlY2FyYSBlbXBpcmlzIHNlcmluZyBrYWxpIHNhbGluZyBiZXJrYWl0YW4gZGFsYW0gc3R1ZGkgc29zaW8tZWtvbm9taS4gS2FyZW5hIHRpZGFrIGFkYSB2YXJpYWJlbCB5YW5nIG1lbWlsaWtpIG5pbGFpIFZJRiBtZWxlYmloaSBiYXRhcyBrcml0aXMgMTAgKFZJRiA8IDEwKSwgbWFrYSBkYXBhdCBkaXNpbXB1bGthbiBiYWh3YSBtb2RlbCByZWdyZXNpIGluaSBiZWJhcyBkYXJpIG1hc2FsYWggbXVsdGlrb2xpbmllcml0YXMgeWFuZyBzZXJpdXMuIA0KDQotLS0NCg0KIyMgMy42IFJlZ3Jlc2kgTmVnYXRpdmUgQmlub21pYWwNCg0KPGRpdiBhbGlnbj0iY2VudGVyIj4NCioqVGFiZWwgNy4qKiBQZXJiYW5kaW5nYW4gTW9kZWwgTmVnYXRpdmUgQmlub21pYWwNCjwvZGl2Pg0KDQoNCmBgYHtyfQ0KIyBNb2RlbCAxOiB0YW5wYSBrZW1pc2tpbmFuICYga2VwYWRhdGFuDQptMSA8LSBnbG0ubmIoDQogIGRpYXJlIH4NCiAgICBmYXNrZXNfc3RkICsgYWlyX3N0ZCArIHNhbml0YXNpX3N0ZCArIGlwbV9zdGQgKw0KICAgIG9mZnNldChsbl9wZW5kdWR1ayksDQogIGRhdGEgPSBkZg0KKQ0KDQojIE1vZGVsIDI6IHRhbWJhaCBrZW1pc2tpbmFuDQptMiA8LSBnbG0ubmIoDQogIGRpYXJlIH4NCiAgICBmYXNrZXNfc3RkICsgYWlyX3N0ZCArIHNhbml0YXNpX3N0ZCArIGlwbV9zdGQgKw0KICAgIGtlbWlza2luYW5fc3RkICsNCiAgICBvZmZzZXQobG5fcGVuZHVkdWspLA0KICBkYXRhID0gZGYNCikNCg0KIyBNb2RlbCAzOiBsZW5na2FwIChzZW11YSBwcmVkaWt0b3IpDQptMyA8LSBnbG0ubmIoDQogIGRpYXJlIH4NCiAgICBmYXNrZXNfc3RkICsgYWlyX3N0ZCArIHNhbml0YXNpX3N0ZCArIGlwbV9zdGQgKw0KICAgIGtlbWlza2luYW5fc3RkICsga2VwYWRhdGFuX3N0ZCArDQogICAgb2Zmc2V0KGxuX3BlbmR1ZHVrKSwNCiAgZGF0YSA9IGRmDQopDQoNCnRhYmVsX21vZGVsIDwtIGRhdGEuZnJhbWUoDQogIE1vZGVsID0gYygNCiAgICAiTW9kZWwgMSAoNCBwcmVkaWt0b3IpIiwNCiAgICAiTW9kZWwgMiAoNSBwcmVkaWt0b3IpIiwNCiAgICAiTW9kZWwgMyAoNiBwcmVkaWt0b3IpIg0KICApLA0KICBgSnVtbGFoIFBhcmFtZXRlcmAgPSBjKA0KICAgIGxlbmd0aChjb2VmKG0xKSkgKyAxLA0KICAgIGxlbmd0aChjb2VmKG0yKSkgKyAxLA0KICAgIGxlbmd0aChjb2VmKG0zKSkgKyAxDQogICksDQogIExvZ0xpayA9IGMoDQogICAgYXMubnVtZXJpYyhsb2dMaWsobTEpKSwNCiAgICBhcy5udW1lcmljKGxvZ0xpayhtMikpLA0KICAgIGFzLm51bWVyaWMobG9nTGlrKG0zKSkNCiAgKSwNCiAgQUlDID0gYygNCiAgICBBSUMobTEpLA0KICAgIEFJQyhtMiksDQogICAgQUlDKG0zKQ0KICApLA0KICBCSUMgPSBjKA0KICAgIEJJQyhtMSksDQogICAgQklDKG0yKSwNCiAgICBCSUMobTMpDQogICksDQogIFRoZXRhID0gYygNCiAgICBtMSR0aGV0YSwNCiAgICBtMiR0aGV0YSwNCiAgICBtMyR0aGV0YQ0KICApDQopDQoNCmthYmxlKA0KICB0YWJlbF9tb2RlbCwNCiAgZGlnaXRzID0gNCwNCiAgY2FwdGlvbiA9ICJQZXJiYW5kaW5nYW4gTW9kZWwgUmVncmVzaSBCaW5vbWlhbCBOZWdhdGlmIg0KKQ0KYGBgDQoNCioqSW50ZXJwcmV0YXNpOioqDQoNCkJlcmRhc2Fya2FuIFRhYmVsIDcsIHBlbWlsaWhhbiBtb2RlbCB0ZXJiYWlrIGRhcmkga2V0aWdhIGFsdGVybmF0aWYgbW9kZWwgTmVnYXRpdmUgQmlub21pYWwgZGlsYWt1a2FuIGRlbmdhbiBtZW1iYW5kaW5na2FuIG5pbGFpIEFrYWlrZSBJbmZvcm1hdGlvbiBDcml0ZXJpb24gKEFJQyksIEJheWVzaWFuIEluZm9ybWF0aW9uIENyaXRlcmlvbiAoQklDKSwgZGFuIExvZy1MaWtlbGlob29kLiBNb2RlbCB5YW5nIGlkZWFsIGFkYWxhaCBtb2RlbCB5YW5nIG1lbWlsaWtpIG5pbGFpIEFJQyBkYW4gQklDIHRlcmVuZGFoLCBzZXJ0YSBuaWxhaSBMb2ctTGlrZWxpaG9vZCB0ZXJ0aW5nZ2kgKHBhbGluZyBtZW5kZWthdGkgbm9sKS4gSGFzaWwgZXN0aW1hc2kgbWVudW5qdWtrYW4gYmFod2EgTW9kZWwgMyAoZGVuZ2FuIDggcGFyYW1ldGVyKSBtZW1pbGlraSBuaWxhaSBBSUMgdGVyZW5kYWggc2ViZXNhciA1NjQsOTcgZGFuIG5pbGFpIEJJQyB0ZXJlbmRhaCBzZWJlc2FyIDU3NSwzMy4gS29uc2lzdGVuIGRlbmdhbiBoYWwgdGVyc2VidXQsIE1vZGVsIDMganVnYSBtZW5naGFzaWxrYW4gbmlsYWkgTG9nLUxpa2VsaWhvb2QgdGVydGluZ2dpLCB5YWl0dSBzZWJlc2FyIC0yNzQsNDguIFNlbGFpbiBpdHUsIG5pbGFpIHBhcmFtZXRlciBkaXNwZXJzaSAoVGhldGEpIHBhZGEgTW9kZWwgMyBhZGFsYWggeWFuZyB0ZXJiZXNhciwgeWFrbmkgMTIsMjA4LCB5YW5nIG1lbnVuanVra2FuIGtlbWFtcHVhbiBtb2RlbCB5YW5nIGxlYmloIGJhaWsgZGFsYW0gbWVuZ2F0YXNpIG92ZXJkaXNwZXJzaW9uIHBhZGEgZGF0YS4gT2xlaCBrYXJlbmEgaXR1LCBNb2RlbCAzIGRpcGlsaWggc2ViYWdhaSBtb2RlbCB0ZXJiYWlrIGRhbiBwYWxpbmcgZml0IHVudHVrIGFuYWxpc2lzIGRhdGEgc2VsYW5qdXRueWEuIEJlcmlrdXQgYWRhbGFoIHRhYmVsIGhhc2lsIHJlZ3Jlc2kgbmVnYXRpdmUgYmlub21pYWwgcGFkYSBtb2RlbCAzLg0KDQotLS0NCg0KPGRpdiBhbGlnbj0iY2VudGVyIj4NCioqVGFiZWwgOC4qKiBIYXNpbCBSZWdyZXNpIE5lZ2F0aXZlIEJpbm9taWFsIE1vZGVsIDMNCjwvZGl2Pg0KDQoNCmBgYHtyfQ0KZml0dGVkX3ZhbHMgICA8LSBmaXR0ZWQobTMpDQpjb3Jfb2JzX2ZpdCAgIDwtIGNvcihkZiRkaWFyZSwgZml0dGVkX3ZhbHMpDQpzbTMgICA8LSBzdW1tYXJ5KG0zKQ0KY2kzICAgPC0gc3VwcHJlc3NNZXNzYWdlcyhjb25maW50KG0zKSkNCmNvZWYzIDwtIGNvZWYobTMpDQpwdmFsMyA8LSBzbTMkY29lZmZpY2llbnRzWyw0XQ0KDQp2YXJfbGFiZWxzIDwtIGMoDQogICIoSW50ZXJjZXB0KSIgICAgPSAiKEludGVyY2VwdCkiLA0KICAiZmFza2VzX3N0ZCIgICAgID0gIkxvZyBGYXNrZXMgKHN0ZCkiLA0KICAiYWlyX3N0ZCIgICAgICAgID0gIkFpciBCZXJzaWggKHN0ZCkiLA0KICAic2FuaXRhc2lfc3RkIiAgID0gIlNhbml0YXNpIChzdGQpIiwNCiAgImlwbV9zdGQiICAgICAgICA9ICJJUE0gKHN0ZCkiLA0KICAia2VtaXNraW5hbl9zdGQiID0gIkxvZyBHYXJpcyBLZW1pc2tpbmFuIChzdGQpIiwNCiAgImtlcGFkYXRhbl9zdGQiICA9ICJMb2cgS2VwYWRhdGFuIChzdGQpIg0KKQ0KDQp0YWJlbF9pcnIgPC0gZGF0YS5mcmFtZSgNCiAgVmFyaWFiZWwgPSB2YXJfbGFiZWxzW25hbWVzKGNvZWYzKV0sDQogIEJldGEgICAgID0gY29lZjMsDQogIFNFICAgICAgID0gc20zJGNvZWZmaWNpZW50c1ssMl0sDQogIHogICAgICAgID0gc20zJGNvZWZmaWNpZW50c1ssM10sDQogIHBfdmFsdWUgID0gcHZhbDMsDQogIElSUiAgICAgID0gZXhwKGNvZWYzKSwNCiAgQ0lfYmF3YWggPSBleHAoY2kzWywxXSksICAgIyDihpAgZ2FudGkgbmFtYQ0KICBDSV9hdGFzICA9IGV4cChjaTNbLDJdKSwgICAjIOKGkCBnYW50aSBuYW1hDQogIFNpZyAgICAgID0gc3ltbnVtKA0KICAgIHB2YWwzLA0KICAgIGN1dHBvaW50cyA9IGMoMCwwLjAwMSwwLjAxLDAuMDUsMC4xLDEpLA0KICAgIHN5bWJvbHMgICA9IGMoIioqKiIsIioqIiwiKiIsIi4iLCIgIiksDQogICAgbGVnZW5kICAgID0gRkFMU0UNCiAgKQ0KKQ0KDQprYWJsZSgNCiAgdGFiZWxfaXJyLA0KICBkaWdpdHMgPSA0LCByb3cubmFtZXMgPSBGQUxTRSkNCmBgYA0KDQoqKkludGVycHJldGFzaToqKg0KDQpCZXJkYXNhcmthbiBoYXNpbCB0YWJlbCBkaWF0YXMgZGlwZXJvbGVoIHRpZ2EgcHJlZGlrdG9yIG1lbnVuanVra2FuIHBlbmdhcnVoIHNpZ25pZmlrYW4gdGVyaGFkYXAganVtbGFoIGthc3VzIGRpYXJlOg0KDQphLglMb2cgRmFzaWxpdGFzIEtlc2VoYXRhbjogSVJSID0gMCw3MjQgKDk1JSBDSTogMCw2MzbigJMwLDgyMTsgcCA8IDAsMDAxKS4gU2V0aWFwIGtlbmFpa2FuIDEgU0QgbG9nLWZhc2tlcyBtZW51cnVua2FuIGV4cGVjdGVkIGthc3VzIHNlYmVzYXIgMjcsNiUuIEluaSBtZXJ1cGFrYW4gZmFrdG9yIHByb3Rla3RpZiB0ZXJrdWF0IGRhbiBwYWxpbmcgc2lnbmlmaWthbi4NCg0KYi4JSVBNIDogSVJSID0gMCw3MDAgKDk1JSBDSTogMCw1MjTigJMwLDkzODsgcCA9IDAsMDIxKS4gU2V0aWFwIGtlbmFpa2FuIDEgU0QgSVBNIG1lbnVydW5rYW4gZXhwZWN0ZWQga2FzdXMgc2ViZXNhciAzMCwwJS4gSVBNIG1lbmNlcm1pbmthbiBkaW1lbnNpIGtlc2VoYXRhbiwgcGVuZGlkaWthbiwgZGFuIGRheWEgYmVsaSB5YW5nIHNlY2FyYSBob2xpc3RpayBtZWxpbmR1bmdpIGRhcmkgcGVueWFraXQgYmVyYmFzaXMgbGluZ2t1bmdhbi4NCg0KYy4JTG9nIEtlcGFkYXRhbiBQZW5kdWR1ayA6IElSUiA9IDEsNDkxICg5NSUgQ0k6IDEsMTE24oCTMSw5OTQ7IHAgPSAwLDAwOCkuIFNldGlhcCBrZW5haWthbiAxIFNEIGxvZy1rZXBhZGF0YW4gbWVuaW5na2F0a2FuIGV4cGVjdGVkIGthc3VzIHNlYmVzYXIgNDksMSUuIEtlcGFkYXRhbiB0aW5nZ2kgbWVtcGVyY2VwYXQgdHJhbnNtaXNpIGZlY2FsLW9yYWwuDQoNClRpZ2EgcHJlZGlrdG9yIGxhaW4gYWtzZXMgYWlyIGJlcnNpaCAocCA9IDAsODg5KSwgc2FuaXRhc2kgKHAgPSAwLDg1NyksIGRhbiBnYXJpcyBrZW1pc2tpbmFuIChwID0gMCwyNDIpIHRpZGFrIG1lbnVuanVra2FuIHBlbmdhcnVoIHNpZ25pZmlrYW4gc2VjYXJhIHN0YXRpc3Rpay4gR29vZG5lc3Mtb2YtZml0IHRlc3QgbWVuZ2hhc2lsa2FuIHAgPSAwLDE2OCA+IDAsMDUsIG1lbmdrb25maXJtYXNpIE1vZGVsIDMgbWVtaWxpa2kgZml0IHlhbmcgYmFpay4NCg0KDQotLS0NCg0KDQpgYGB7ciB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQ0KIyBGb3Jlc3QgcGxvdCAtIGdhbnRpIG5hbWEga29sb20gZGkgYWVzKCkNCmlycl9wbG90IDwtIHRhYmVsX2lyciAlPiUNCiAgZmlsdGVyKFZhcmlhYmVsICE9ICIoSW50ZXJjZXB0KSIpICU+JQ0KICBtdXRhdGUoDQogICAgVmFyaWFiZWwgPSBmYWN0b3IoVmFyaWFiZWwsIGxldmVscyA9IHJldihWYXJpYWJlbCkpLA0KICAgIHNpZ19jb2wgID0gaWZlbHNlKHRyaW13cyhTaWcpICVpbiUgYygiKioqIiwiKioiLCIqIiksICJTaWduaWZpa2FuIiwgIlRpZGFrIFNpZ25pZmlrYW4iKQ0KICApDQoNCnBfaXJyIDwtIGdncGxvdChpcnJfcGxvdCwgYWVzKHggPSBJUlIsIHkgPSBWYXJpYWJlbCwgY29sb3IgPSBzaWdfY29sKSkgKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAxLCBsaW5ldHlwZSA9ICJkYXNoZWQiLA0KICAgICAgICAgICAgIGNvbG9yID0gImdyYXk0MCIsIGxpbmV3aWR0aCA9IDAuOSkgKw0KICBnZW9tX2Vycm9yYmFyaChhZXMoeG1pbiA9IENJX2Jhd2FoLCB4bWF4ID0gQ0lfYXRhcyksICAgIyDihpAgbmFtYSBiYXJ1DQogICAgICAgICAgICAgICAgIGhlaWdodCA9IDAuMjUsIGxpbmV3aWR0aCA9IDAuOSkgKw0KICBnZW9tX3BvaW50KHNpemUgPSA0LjUpICsNCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHBhc3RlMCgiSVJSPSIsIHJvdW5kKElSUiwzKSwgIiAiLCB0cmltd3MoU2lnKSkpLA0KICAgICAgICAgICAgaGp1c3QgPSAtMC4xNSwgc2l6ZSA9IDMsIGNvbG9yID0gImJsYWNrIikgKw0KICBzY2FsZV9jb2xvcl9tYW51YWwoDQogICAgdmFsdWVzID0gYygiU2lnbmlmaWthbiIgPSAiI2U3NGMzYyIsICJUaWRhayBTaWduaWZpa2FuIiA9ICJncmF5NTUiKSwNCiAgICBuYW1lICAgPSBOVUxMDQogICkgKw0KICBzY2FsZV94X2NvbnRpbnVvdXMoDQogICAgbGltaXRzID0gYygNCiAgICAgIG1pbihpcnJfcGxvdCRDSV9iYXdhaCkgKiAwLjg1LCAgICMg4oaQIG5hbWEgYmFydQ0KICAgICAgbWF4KGlycl9wbG90JENJX2F0YXMpICAqIDEuMiAgICAgIyDihpAgbmFtYSBiYXJ1DQogICAgKQ0KICApICsNCiAgbGFicygNCiAgICB0aXRsZSAgICA9ICJGb3Jlc3QgUGxvdCBJbmNpZGVuY2UgUmF0ZSBSYXRpbyAoSVJSKSDigJMgTW9kZWwgTmVnYXRpdmUgQmlub21pYWwgMyIsDQogICAgc3VidGl0bGUgPSAiVGl0aWsgbWVyYWggPSBzaWduaWZpa2FuIChwIDwgMC4wNSkgfCBHYXJpcyA9IDk1JSBDSSIsDQogICAgeCAgICAgICAgPSAiSVJSIChJbmNpZGVuY2UgUmF0ZSBSYXRpbykiLA0KICAgIHkgICAgICAgID0gTlVMTA0KICApICsNCiAgdGhlbWVfbWluaW1hbChiYXNlX3NpemUgPSAxMSkgKw0KICB0aGVtZSgNCiAgICBwbG90LnRpdGxlICAgICAgICAgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiwgc2l6ZSA9IDEyKSwNCiAgICBwYW5lbC5ncmlkLm1ham9yLnkgPSBlbGVtZW50X2JsYW5rKCksDQogICAgbGVnZW5kLnBvc2l0aW9uICAgID0gImJvdHRvbSINCiAgKQ0KcHJpbnQocF9pcnIpDQpgYGANCg0KPGRpdiBhbGlnbj0iY2VudGVyIj4NCioqR2FtYmFyIDcuKiogRm9yZXN0IFBsb3QgSVJSDQo8L2Rpdj4NCg0KDQoqKkludGVycHJldGFzaToqKg0KDQpIYXNpbCBlc3RpbWFzaSBNb2RlbCBSZWdyZXNpIEJpbm9taWFsIE5lZ2F0aWYgMyBtZW51bmp1a2thbiBwZW5nYXJ1aCB2YXJpYWJlbCBwcmVkaWt0b3IgdGVyaGFkYXAgSW5jaWRlbmNlIFJhdGUgUmF0aW8gKElSUikga2FzdXMgZGlhcmUuIEJlcmRhc2Fya2FuIHBsb3QsIHRlcmRhcGF0IHRpZ2EgdmFyaWFiZWwgeWFuZyBiZXJwZW5nYXJ1aCBzaWduaWZpa2FuIHNlY2FyYSBzdGF0aXN0aWsgdGVyaGFkYXAgaW5jaWRlbmNlIHJhdGUga2FzdXMgZGlhcmUgKHAgPCAwLDA1KSwgeWFpdHUgTG9nIEZhc2tlcywgSVBNLCBkYW4gTG9nIEtlcGFkYXRhbiBQZW5kdWR1ay4gU2VtZW50YXJhIGl0dSwgdmFyaWFiZWwgQWlyIEJlcnNpaCwgU2FuaXRhc2ksIGRhbiBMb2cgR2FyaXMgS2VtaXNraW5hbiB0aWRhayBtZW51bmp1a2thbiBwZW5nYXJ1aCB5YW5nIHNpZ25pZmlrYW4gKHAgPj0gMCwwNSkga2FyZW5hIGludGVydmFsIGtlcGVyY2F5YWFuIDk1JSBtZWxld2F0aSBuaWxhaSAxLlZhcmlhYmVsIExvZyBGYXNrZXMgbWVtaWxpa2kgbmlsYWkgSVJSIHNlYmVzYXIgMCw3MjQsIHlhbmcgYmVyYXJ0aSBzZXRpYXAga2VuYWlrYW4gc2F0dSBzYXR1YW4gc3RhbmRhciBMb2cgRmFza2VzIGRpYXNvc2lhc2lrYW4gZGVuZ2FuIHBlbnVydW5hbiBpbmNpZGVuY2UgcmF0ZSBrYXN1cyBkaWFyZSBzZWJlc2FyIDI3LDYlICgxIC0gMCw3MjQpLCBkZW5nYW4gYXN1bXNpIHZhcmlhYmVsIGxhaW4ga29uc3Rhbi4gVmFyaWFiZWwgSVBNIGp1Z2EgbWVtaWxpa2kgcGVuZ2FydWggcHJvdGVrdGlmIHlhbmcgc2lnbmlmaWthbiBkZW5nYW4gbmlsYWkgSVJSIHNlYmVzYXIgMCw3MSwgbWVudW5qdWtrYW4gYmFod2EgcGVuaW5na2F0YW4gc2F0dSBzYXR1YW4gc3RhbmRhciBJUE0gYmVya2FpdGFuIGRlbmdhbiBwZW51cnVuYW4gaW5jaWRlbmNlIHJhdGUga2FzdXMgZGlhcmUgc2ViZXNhciAyOSUuIFNlYmFsaWtueWEsIExvZyBLZXBhZGF0YW4gUGVuZHVkdWsgYmVydGluZGFrIHNlYmFnYWkgZmFrdG9yIHJpc2lrbyB5YW5nIHNpZ25pZmlrYW4gZGVuZ2FuIG5pbGFpIElSUiBzZWJlc2FyIDEsNDkxLiBIYWwgaW5pIG1lbmdpbmRpa2FzaWthbiBiYWh3YSBzZXRpYXAga2VuYWlrYW4gc2F0dSBzYXR1YW4gc3RhbmRhciBMb2cgS2VwYWRhdGFuIFBlbmR1ZHVrIG1lbmluZ2thdGthbiBpbmNpZGVuY2UgcmF0ZSBrYXN1cyBkaWFyZSBzZWJlc2FyIDQ5LDElLg0KDQotLS0NCg0KPGRpdiBhbGlnbj0iY2VudGVyIj4NCioqVGFiZWwgOS4qKiBIYXNpbCBEaWFnbm9zdGlrIE1vZGVsIDMNCjwvZGl2Pg0KDQoNCmBgYHtyfQ0KdGFiZWxfZml0IDwtIGRhdGEuZnJhbWUoDQogIEluZGlrYXRvciA9IGMoDQogICAgIktvcmVsYXNpIE9ic2VydmVkLUZpdHRlZCIsDQogICAgIlBlcnNlbnRhc2UgVmFyaWFzaSBUZXJqZWxhc2thbiINCiAgKSwNCiAgTmlsYWkgPSBjKA0KICAgIGNvcl9vYnNfZml0LA0KICAgIGNvcl9vYnNfZml0XjIgKiAxMDANCiAgKQ0KKQ0KDQprYWJsZSgNCiAgdGFiZWxfZml0LA0KICBkaWdpdHMgPSAyLA0KICBjYXB0aW9uID0gIktlbWFtcHVhbiBQcmVkaWtzaSBNb2RlbCINCikNCmBgYA0KDQoNCioqSW50ZXJwcmV0YXNpOioqDQoNCkhhc2lsIGV2YWx1YXNpIGtlbWFtcHVhbiBwcmVkaWtzaSBtb2RlbCBtZW51bmp1a2thbiBraW5lcmphIHBlbW9kZWxhbiB5YW5nIHNhbmdhdCBiYWlrLiBOaWxhaSBLb3JlbGFzaSBPYnNlcnZlZC1GaXR0ZWQgc2ViZXNhciAwLDg2IG1lbmdpbmRpa2FzaWthbiBhZGFueWEgaHVidW5nYW4gbGluaWVyIHlhbmcga3VhdCBhbnRhcmEgbmlsYWkgYWt0dWFsIHlhbmcgZGlhbWF0aSBkaSBsYXBhbmdhbiBkZW5nYW4gbmlsYWkgeWFuZyBkaXByZWRpa3NpIG9sZWggbW9kZWwuIFNlbGFpbiBpdHUsIGluZGlrYXRvciBQZXJzZW50YXNlIFZhcmlhc2kgVGVyamVsYXNrYW4gbWVudW5qdWtrYW4gbmlsYWkgc2ViZXNhciA3Myw3NCUsIHlhbmcgYmVyYXJ0aSBiYWh3YSB2YXJpYWJlbC12YXJpYWJlbCBwcmVkaWt0b3IgZGkgZGFsYW0gbW9kZWwgbWFtcHUgbWVuamVsYXNrYW4gc2VraXRhciA3Myw3NCUgdG90YWwgdmFyaWFzaSBkYXJpIHZhcmlhYmVsIGRlcGVuZGVuIGthc3VzIGRpYXJlLiBTZW1lbnRhcmEgaXR1LCBzaXNhbnlhIHNlYmVzYXIgMjYsMjYlIGRpamVsYXNrYW4gb2xlaCBmYWt0b3ItZmFrdG9yIGxhaW4gZGkgbHVhciBtb2RlbC4gS29tYmluYXNpIGtlZHVhIG5pbGFpIGluaSBtZW5lZ2Fza2FuIGJhaHdhIG1vZGVsIHlhbmcgZGliYW5ndW4gbWVtaWxpa2kgdGluZ2thdCBrZWJhaWthbiBzdWFpIChnb29kbmVzcyBvZiBmaXQpIHNlcnRhIGRheWEgcHJlZGlrc2kgeWFuZyB0aW5nZ2kgZGFuIHZhbGlkIHVudHVrIGRpZ3VuYWthbi4NCg0KLS0tDQoNCiMgNCBQZW1iYWhhc2FuDQoNCiMjIDQuMSBQb2xhIERpc3RyaWJ1c2kgUmlzaWtvIERpYXJlDQoNCkJlcmRhc2Fya2FuIGhhc2lsIGFuYWxpc2lzIGRhdGEsIGJlYmFuIHBlbnlha2l0IGRpYXJlIG1lbnVuanVra2FuIHZhcmlhc2kgc3Bhc2lhbCB5YW5nIHNpZ25pZmlrYW4gZGkgYW50YXJhIGthYnVwYXRlbiBkYW4ga290YSBkaSBQcm92aW5zaSBKYXdhIEJhcmF0LiBLb3RhIENpcmVib24gdGVyY2F0YXQgc2ViYWdhaSB3aWxheWFoIGRlbmdhbiBuaWxhaSBJbmNpZGVuY2UgUmF0ZSAoSVIpIHRlcnRpbmdnaSwgeWFrbmkgbWVuY2FwYWkgNDQyLDgzIGthc3VzIHBlciAxMC4wMDAgcGVuZHVkdWsuIFdpbGF5YWggdGVyc2VidXQganVnYSBtZW1pbGlraSBuaWxhaSBTdGFuZGFyZGl6ZWQgSW5jaWRlbmNlIFJhdGlvIChTSVIpIHNlYmVzYXIgMywzMiwgeWFuZyBtZW5naW5kaWthc2lrYW4gYmFod2EganVtbGFoIGthc3VzIHJpaWwgZGkgbGFwYW5nYW4gbWVuaW5na2F0IGxlYmloIGRhcmkgdGlnYSBrYWxpIGxpcGF0IGRpYmFuZGluZ2thbiBkZW5nYW4gZXN0aW1hc2kgeWFuZyBkaWhhcmFwa2FuIGJlcmRhc2Fya2FuIHJhdGEtcmF0YSBwcm92aW5zaS4gVHJlbiByaXNpa28gU0lSIHlhbmcgcmVsYXRpZiB0aW5nZ2kgaW5pIGp1Z2EgdGVyaWRlbnRpZmlrYXNpIGRpIEtvdGEgQm9nb3IgZGFuIEtvdGEgU3VrYWJ1bWkuDQoNCkJlc2FybnlhIHRpbmdrYXQgcmlzaWtvIGRpYXJlIGRpIGthd2FzYW4gcGVya290YWFuIHRlcnNlYnV0IGtlbXVuZ2tpbmFuIGRpcGVuZ2FydWhpIG9sZWggdGluZ2dpbnlhIGtlcGFkYXRhbiBwZW5kdWR1aywgeWFuZyBtZW1wZXJjZXBhdCB0cmFuc21pc2kgcGF0b2dlbiBtZWxhbHVpIHJ1dGUgZmVrYWwtb3JhbC4gU2VsYWluIGZha3RvciBkZW1vZ3JhZmksIGtldGVyc2VkaWFhbiBpbmZyYXN0cnVrdHVyIHBlbGF5YW5hbiBrZXNlaGF0YW4gc2VydGEgbWVrYW5pc21lIHBlbGFwb3JhbiBkYXRhIHlhbmcgbGViaWggb3B0aW1hbCBkaSBhcmVhIHBlcmtvdGFhbiB0dXJ1dCBiZXJrb250cmlidXNpIHRlcmhhZGFwIHRpbmdnaW55YSBjYWt1cGFuIGRldGVrc2kgZGFuIHBlbmNhdGF0YW4ga2FzdXMgZGlhcmUgamlrYSBkaWJhbmRpbmdrYW4gZGVuZ2FuIHdpbGF5YWggbGFpbm55YS4NCg0KU2ViYWxpa255YSwgYmViZXJhcGEga2F3YXNhbiBtZXRyb3BvbGl0YW4gc2VwZXJ0aSBLb3RhIEJhbmR1bmcgZGFuIEtvdGEgQmVrYXNpIGp1c3RydSBtZW51bmp1a2thbiBuaWxhaSBJUiBkYW4gU0lSIHlhbmcgYmVyYWRhIGRpIGJhd2FoIHJhdGEtcmF0YSBjYXBhaWFuIHByb3ZpbnNpLiBLb25kaXNpIGluaSBkaXNpbnlhbGlyIGJlcmthaXRhbiBkZW5nYW4ga3VhbGl0YXMgc2FuaXRhc2kgbGluZ2t1bmdhbiwga2VtdWRhaGFuIGFrc2VzIGFpciBiZXJzaWgsIGt1YWxpdGFzIHBlbGF5YW5hbiBtZWRpcywgc2VydGEgaW5kZWtzIHBlbWJhbmd1bmFuIG1hbnVzaWEgeWFuZyByZWxhdGlmIGxlYmloIG1hanUuIFNlbWVudGFyYSBpdHUsIEthYnVwYXRlbiBCZWthc2kgbWVuY2F0YXRrYW4gbmlsYWkgSVIgZGFuIFNJUiBwYWxpbmcgcmVuZGFoIGRhbGFtIHBlbmVsaXRpYW4gaW5pLCB5YW5nIG1lbmNlcm1pbmthbiBiYWh3YSBha3VtdWxhc2kga2FzdXMgZGlhcmUgYWt0dWFsIGRpIHdpbGF5YWggdGVyc2VidXQgYmVyYWRhIGRpIGJhd2FoIGFuZ2thIHlhbmcgZGlwcm95ZWtzaWthbi4NCg0KDQojIyA0LjIgUG9sYSBTcGFzaWFsDQoNCkhhc2lsIGFuYWxpc2lzIHNwYXNpYWwgbWVudW5qdWtrYW4gYmFod2EgdGlkYWsgdGVyZGFwYXQgYXV0b2tvcmVsYXNpIHNwYXNpYWwgZ2xvYmFsIHlhbmcgc2lnbmlmaWthbiBwYWRhIGtlamFkaWFuIGRpYXJlIGRpIEphd2EgQmFyYXQgdGFodW4gMjAyNCwgc2ViYWdhaW1hbmEgZGl0dW5qdWtrYW4gb2xlaCBuaWxhaSBNb3JhbidzIEkgc2ViZXNhciAwLDA2MCBkZW5nYW4gbmlsYWkgcCBzZWJlc2FyIDAsMjI2LiBTZWxhaW4gaXR1LCBhbmFsaXNpcyBMb2NhbCBJbmRpY2F0b3JzIG9mIFNwYXRpYWwgQXNzb2NpYXRpb24gKExJU0EpIGp1Z2EgdGlkYWsgbWVuZW11a2FuIGtsYXN0ZXIgc3Bhc2lhbCB5YW5nIHNpZ25pZmlrYW4gcGFkYSB0aW5na2F0IHNpZ25pZmlrYW5zaSA1JS4NCg0KVGVtdWFuIGluaSBtZW51bmp1a2thbiBiYWh3YSBkaXN0cmlidXNpIHJpc2lrbyBkaWFyZSBhbnRhciBrYWJ1cGF0ZW4va290YSB0aWRhayBtZW1iZW50dWsgcG9sYSBwZW5nZWxvbXBva2FuIGdlb2dyYWZpcyB5YW5nIGplbGFzLiBEZW5nYW4gZGVtaWtpYW4sIHZhcmlhc2kga2VqYWRpYW4gZGlhcmUgZGkgSmF3YSBCYXJhdCBrZW11bmdraW5hbiBsZWJpaCBkaXBlbmdhcnVoaSBvbGVoIGthcmFrdGVyaXN0aWsgbWFzaW5nLW1hc2luZyB3aWxheWFoLCBzZXBlcnRpIGtvbmRpc2kgc29zaWFsIGVrb25vbWksIHBlcmlsYWt1IGtlc2VoYXRhbiBtYXN5YXJha2F0LCBrdWFsaXRhcyBzdXJ2ZWlsYW5zLCBzZXJ0YSBha3NlcyB0ZXJoYWRhcCBwZWxheWFuYW4ga2VzZWhhdGFuLCBkaWJhbmRpbmdrYW4gb2xlaCBmYWt0b3Iga2VkZWthdGFuIGdlb2dyYWZpcyBhbnRhcndpbGF5YWguIE9sZWgga2FyZW5hIGl0dSwgdXBheWEgcGVuZ2VuZGFsaWFuIGRpYXJlIHBlcmx1IGRpZm9rdXNrYW4gcGFkYSBrYXJha3RlcmlzdGlrIHJpc2lrbyBzcGVzaWZpayBkaSBzZXRpYXAgd2lsYXlhaCwgYnVrYW4gc2VtYXRhLW1hdGEgYmVyZGFzYXJrYW4ga2VkZWthdGFuIGxva2FzaSBnZW9ncmFmaXMuDQoNCiMjIDQuMyBGYWt0b3IgeWFuZyBCZXJwZW5nYXJ1aA0KDQpIYXNpbCBhbmFsaXNpcyByZWdyZXNpIEJpbm9taWFsIE5lZ2F0aWYgbWVudW5qdWtrYW4gYmFod2EgYmViZXJhcGEgZmFrdG9yIGxpbmdrdW5nYW4gZGFuIHNvc2lhbCBla29ub21pIG1lbWlsaWtpIHBlbmdhcnVoIHNpZ25pZmlrYW4gdGVyaGFkYXAganVtbGFoIGthc3VzIGRpYXJlLiBLZXRlcnNlZGlhYW4gZmFzaWxpdGFzIGtlc2VoYXRhbiB0ZXJidWt0aSBzZWJhZ2FpIGZha3RvciBwcm90ZWt0aWYgeWFuZyBzaWduaWZpa2FuIHRlcmhhZGFwIGtlamFkaWFuIGRpYXJlIChJUlIgPSAwLDcyNDsgcCA8IDAsMDAxKS4gVGVtdWFuIGluaSBtZW5naW5kaWthc2lrYW4gYmFod2EgcGVuaW5na2F0YW4ga2V0ZXJzZWRpYWFuIGZhc2lsaXRhcyBrZXNlaGF0YW4gYmVycG90ZW5zaSBtZW51cnVua2FuIGp1bWxhaCBrYXN1cyBkaWFyZSBtZWxhbHVpIHBlbmluZ2thdGFuIGRldGVrc2kgZGluaSwgcGVyYmFpa2FuIHBlbmF0YWxha3NhbmFhbiBrYXN1cywgc2VydGEgcGVybHVhc2FuIGFrc2VzIG1hc3lhcmFrYXQgdGVyaGFkYXAgcGVsYXlhbmFuIGtlc2VoYXRhbiBkYXNhci4NCg0KU2VsYWluIGl0dSwgSW5kZWtzIFBlbWJhbmd1bmFuIE1hbnVzaWEgKElQTSkganVnYSBtZW51bmp1a2thbiBwZW5nYXJ1aCBwcm90ZWt0aWYgeWFuZyBzaWduaWZpa2FuIChJUlIgPSAwLDcwMDsgcCA9IDAsMDIxKS4gSGFsIGluaSBtZW51bmp1a2thbiBiYWh3YSB3aWxheWFoIGRlbmdhbiB0aW5na2F0IHBlbWJhbmd1bmFuIG1hbnVzaWEgeWFuZyBsZWJpaCB0aW5nZ2kgY2VuZGVydW5nIG1lbWlsaWtpIGJlYmFuIGRpYXJlIHlhbmcgbGViaWggcmVuZGFoLiBLb25kaXNpIHRlcnNlYnV0IGRhcGF0IGRpamVsYXNrYW4gb2xlaCBtZW5pbmdrYXRueWEgdGluZ2thdCBwZW5kaWRpa2FuLCBzdGF0dXMga2VzZWhhdGFuLCBkYW4ga2VzZWphaHRlcmFhbiBtYXN5YXJha2F0IHlhbmcgbWVuZHVrdW5nIHBlbmVyYXBhbiBwZXJpbGFrdSBoaWR1cCBiZXJzaWggZGFuIHNlaGF0IHNlcnRhIHBlbmluZ2thdGFuIGFrc2VzIHRlcmhhZGFwIHNhbml0YXNpIHlhbmcgbGF5YWsuDQoNClNlYmFsaWtueWEsIGtlcGFkYXRhbiBwZW5kdWR1ayBkaXRlbXVrYW4gc2ViYWdhaSBmYWt0b3IgcmlzaWtvIHlhbmcgc2lnbmlmaWthbiB0ZXJoYWRhcCBwZW5pbmdrYXRhbiBrYXN1cyBkaWFyZSAoSVJSID0gMSw0OTE7IHAgPSAwLDAwOCkuIFRlbXVhbiBpbmkgbWVuZ2luZGlrYXNpa2FuIGJhaHdhIHdpbGF5YWggZGVuZ2FuIHRpbmdrYXQga2VwYWRhdGFuIHBlbmR1ZHVrIHlhbmcgbGViaWggdGluZ2dpIG1lbWlsaWtpIHJpc2lrbyBwZW51bGFyYW4gcGVueWFraXQgeWFuZyBsZWJpaCBiZXNhciBha2liYXQgbWVuaW5na2F0bnlhIGludGVyYWtzaSBhbnRhcmluZGl2aWR1IHNlcnRhIHRla2FuYW4gdGVyaGFkYXAga2V0ZXJzZWRpYWFuIGluZnJhc3RydWt0dXIgc2FuaXRhc2kgZGFuIGxpbmdrdW5nYW4uDQoNClNlbWVudGFyYSBpdHUsIHZhcmlhYmVsIGFrc2VzIGFpciBiZXJzaWggZGFuIHNhbml0YXNpIHRpZGFrIG1lbnVuanVra2FuIGh1YnVuZ2FuIHlhbmcgc2lnbmlmaWthbiBkYWxhbSBtb2RlbC4gS29uZGlzaSBpbmkgZGlkdWdhIGRpc2ViYWJrYW4gb2xlaCByZWxhdGlmIGhvbW9nZW5ueWEgY2FrdXBhbiBha3NlcyBhbnRhcndpbGF5YWggc2VoaW5nZ2EgdmFyaWFzaSBkYXRhIG1lbmphZGkgdGVyYmF0YXMuIFNlbGFpbiBpdHUsIGluZGlrYXRvciB5YW5nIGRpZ3VuYWthbiBsZWJpaCBtZXJlcHJlc2VudGFzaWthbiBhc3BlayBrZXRlcnNlZGlhYW4gbGF5YW5hbiwgYnVrYW4ga3VhbGl0YXMgYXRhdSBrZWJlcmxhbmp1dGFuIGFrc2VzIHlhbmcgZGl0ZXJpbWEgb2xlaCBtYXN5YXJha2F0Lg0KDQojIyA0LjQgSnVzdGlmaWthc2kgTW9kZWwgTmVnYXRpdmUgQmlub21pYWwNCg0KUGVtaWxpaGFuIG1vZGVsIHJlZ3Jlc2kgQmlub21pYWwgTmVnYXRpZiBkYWxhbSBwZW5lbGl0aWFuIGluaSBkaWRhc2Fya2FuIHBhZGEgYWRhbnlhIGluZGlrYXNpIGt1YXQgb3ZlcmRpc3BlcnNpIHBhZGEgZGF0YSBrYXN1cyBkaWFyZS4gSGFsIGluaSBkaXR1bmp1a2thbiBvbGVoIG5pbGFpIFZhcmlhbmNlLXRvLU1lYW4gUmF0aW8gKFZNUikgeWFuZyBqYXVoIGxlYmloIGJlc2FyIGRhcmkgc2F0dSwgc2VydGEgaGFzaWwgdWppIGRpc3BlcnNpIENhbWVyb24gZGFuIFRyaXZlZGkgeWFuZyBzaWduaWZpa2FuIChwIDwgMCwwMDEpLiBTZWxhaW4gaXR1LCBuaWxhaSBkZXZpYW5zIHBhZGEgbW9kZWwgUG9pc3NvbiBqdWdhIG1lbnVuanVra2FuIGtldGlkYWtzZXN1YWlhbiBtb2RlbCB0ZXJoYWRhcCBzdHJ1a3R1ciBkYXRhLg0KDQpLb25kaXNpIHRlcnNlYnV0IG1lbnVuanVra2FuIGJhaHdhIGFzdW1zaSBrZXNldGFyYWFuIGFudGFyYSByYXRhLXJhdGEgZGFuIHZhcmlhbnMgcGFkYSBtb2RlbCBQb2lzc29uIHRpZGFrIHRlcnBlbnVoaS4gT2xlaCBrYXJlbmEgaXR1LCBwZW5nZ3VuYWFuIG1vZGVsIEJpbm9taWFsIE5lZ2F0aWYgbWVuamFkaSBsZWJpaCB0ZXBhdCBrYXJlbmEgbWFtcHUgbWVuZ2Frb21vZGFzaSB2YXJpYW5zIHlhbmcgbGViaWggYmVzYXIgZGFyaSByYXRhLXJhdGEgKG92ZXJkaXNwZXJzaSksIHNlaGluZ2dhIG1lbmdoYXNpbGthbiBlc3RpbWFzaSBwYXJhbWV0ZXIgZGFuIHN0YW5kYXJkIGVycm9yIHlhbmcgbGViaWggcmVsaWFiZWwuIERlbmdhbiBkZW1pa2lhbiwgbW9kZWwgaW5pIG1lbWJlcmlrYW4gaW5mZXJlbnNpIHN0YXRpc3RpayB5YW5nIGxlYmloIHZhbGlkIGRhbGFtIG1lbmdhbmFsaXNpcyBkZXRlcm1pbmFuIGthc3VzIGRpYXJlLg0KDQoNCiMjIDQuNSBLZXRlcmJhdGFzYW4gUGVuZWxpdGlhbg0KDQpQZW5lbGl0aWFuIGluaSBtZW1pbGlraSBiZWJlcmFwYSBrZXRlcmJhdGFzYW4geWFuZyBwZXJsdSBkaXBlcmhhdGlrYW4gZGFsYW0gbWVuZ2ludGVycHJldGFzaWthbiBoYXNpbC4NCg0KMS4JRGVzYWluIHBlbmVsaXRpYW4geWFuZyBkaWd1bmFrYW4gYWRhbGFoIHBvdG9uZyBsaW50YW5nIChjcm9zcy1zZWN0aW9uYWwpLCBzZWhpbmdnYSB0aWRhayBtZW11bmdraW5rYW4gcGVuYXJpa2FuIGtlc2ltcHVsYW4ga2F1c2FsIGFudGFyYSB2YXJpYWJlbCBkZXRlcm1pbmFuIGRhbiBrZWphZGlhbiBkaWFyZS4NCjIuCUFuYWxpc2lzIGRpbGFrdWthbiBwYWRhIHRpbmdrYXQgYWdyZWdhdCB3aWxheWFoLCBzZWhpbmdnYSB0ZXJkYXBhdCBwb3RlbnNpIHRlcmphZGlueWEgZWNvbG9naWNhbCBmYWxsYWN5IGFwYWJpbGEgaGFzaWwgcGVuZWxpdGlhbiBkaWludGVycHJldGFzaWthbiBwYWRhIHRpbmdrYXQgaW5kaXZpZHUuDQozLglLZW11bmdraW5hbiBhZGFueWEgdW5kZXItcmVwb3J0aW5nIGthc3VzIGRpYXJlIG1hc2loIGRhcGF0IHRlcmphZGksIG1lbmdpbmdhdCB0aWRhayBzZWx1cnVoIGthc3VzIHRlcmNhdGF0IHNlY2FyYSBsZW5na2FwIGRhbGFtIHNpc3RlbSBwZWxhcG9yYW4ga2VzZWhhdGFuLg0KNC4JSnVtbGFoIHVuaXQgYW5hbGlzaXMgeWFuZyByZWxhdGlmIHRlcmJhdGFzIGRhcGF0IG1lbWVuZ2FydWhpIGtla3VhdGFuIHN0YXRpc3RpayBkYWxhbSBtZW5kZXRla3NpIGh1YnVuZ2FuIGFudGFydmFyaWFiZWwsIHNlaGluZ2dhIGJlYmVyYXBhIGFzb3NpYXNpIG11bmdraW4gdGlkYWsgdGVyaWRlbnRpZmlrYXNpIHNlY2FyYSBvcHRpbWFsLg0KNS4JS2V0aWFkYWFuIGRhdGEgdGVtcG9yYWwgeWFuZyBsZWJpaCByaW5jaSwgc2VwZXJ0aSBkYXRhIGJ1bGFuYW4gYXRhdSBtdXNpbWFuLCBtZW1iYXRhc2kgYW5hbGlzaXMgZGFsYW0gbWVuZ2V2YWx1YXNpIHZhcmlhc2kgc3Bhc2lvLXRlbXBvcmFsIGtlamFkaWFuIGRpYXJlIHNlcGFuamFuZyB0YWh1bi4NCg0KLS0tDQoNCiMgNSBLZXNpbXB1bGFuIGRhbiBTYXJhbg0KDQojIyA1LjEgS2VzaW1wdWxhbg0KDQpCZXJkYXNhcmthbiBhbmFsaXNpcyBlcGlkZW1pb2xvZ2kga2FzdXMgZGlhcmUgZGkgUHJvdmluc2kgSmF3YSBCYXJhdCB0YWh1biAyMDI0IHBhZGEgMjcga2FidXBhdGVuL2tvdGEsIGRpcGVyb2xlaCBiZWJlcmFwYSBrZXNpbXB1bGFuIHV0YW1hLiBTZWNhcmEgdW11bSwgYW5na2EgaW5zaWRlbnMgKElSKSBkaWFyZSBkaSBKYXdhIEJhcmF0IHNlYmVzYXIgMTMzLDU0IHBlciAxMC4wMDAgcGVuZHVkdWsgZGVuZ2FuIHRvdGFsIDY3Mi4yODcga2FzdXMuIFRlcmRhcGF0IGRpc3Bhcml0YXMgeWFuZyBjdWt1cCBiZXNhciBhbnRhcndpbGF5YWgsIGRpIG1hbmEgS290YSBDaXJlYm9uIG1lbnVuanVra2FuIElSIHRlcnRpbmdnaSBzZWJlc2FyIDQ0Miw4MyBwZXIgMTAuMDAwIHBlbmR1ZHVrIGRlbmdhbiBTSVIgc2ViZXNhciAzLDMyLCBkaWlrdXRpIG9sZWggS290YSBCb2dvciAoMzIxLDM4OyBTSVIgPSAyLDQxKSBkYW4gS290YSBTdWthYnVtaSAoMzExLDI5OyBTSVIgPSAyLDMzKS4gU2VjYXJhIGtlc2VsdXJ1aGFuLCBzZWJhbnlhayAxNyBkYXJpIDI3IHdpbGF5YWggKDYzJSkgbWVtaWxpa2kgYmViYW4ga2FzdXMgeWFuZyBsZWJpaCB0aW5nZ2kgZGliYW5kaW5na2FuIHJhdGEtcmF0YSBwcm92aW5zaSAoU0lSIOKJpSAxLDApLg0KDQoxLglBbmFsaXNpcyBzcGFzaWFsIG1lbnVuanVra2FuIGJhaHdhIHRpZGFrIHRlcmRhcGF0IGF1dG9rb3JlbGFzaSBzcGFzaWFsIHlhbmcgc2lnbmlmaWthbiAoTW9yYW7igJlzIEkgPSAwLDA2MDsgcCA9IDAsMjI2KS4gVGVtdWFuIGluaSBkaXBlcmt1YXQgb2xlaCB0aWRhayBkaXRlbXVrYW5ueWEga2xhc3RlciBzaWduaWZpa2FuIHBhZGEgYW5hbGlzaXMgTG9jYWwgSW5kaWNhdG9ycyBvZiBTcGF0aWFsIEFzc29jaWF0aW9uIChMSVNBKS4gRGVuZ2FuIGRlbWlraWFuLCBkaXN0cmlidXNpIGFuZ2thIGluc2lkZW5zIGRpYXJlIGRpIEphd2EgQmFyYXQgZGFwYXQgZGlrYXRha2FuIGJlcnNpZmF0IGFjYWsgc2VjYXJhIGdlb2dyYWZpcywgc2VoaW5nZ2EgcGVuZGVrYXRhbiBtb2RlbCByZWdyZXNpIG5vbi1zcGFzaWFsIGRpYW5nZ2FwIG1lbWFkYWkgdW50dWsgYW5hbGlzaXMgaW5mZXJlbnNpYWwuDQoyLglTZWxhbmp1dG55YSwgaW5kaWthc2kgb3ZlcmRpc3BlcnNpIHBhZGEgZGF0YSB0ZXJidWt0aSBzZWNhcmEga3VhdCBtZWxhbHVpIG5pbGFpIFZhcmlhbmNlLXRvLU1lYW4gUmF0aW8gKFZNUiA9IDYuMTEwLDcwKSwgZGlzcGVyc2lvbiBlc3RpbWF0ZSAoMS42NTYsMjIpLCBzZXJ0YSBoYXNpbCB1amkgeWFuZyBzaWduaWZpa2FuIChwIDwgMCwwMDEpLiBLb25kaXNpIGluaSBtZW5lZ2Fza2FuIGtldGlkYWtzZXN1YWlhbiBhc3Vtc2kgbW9kZWwgUG9pc3NvbiBkYW4gbWVtYmVyaWthbiBqdXN0aWZpa2FzaSBwZW5nZ3VuYWFuIHJlZ3Jlc2kgQmlub21pYWwgTmVnYXRpZiBkYWxhbSBhbmFsaXNpcy4NCjMuCUhhc2lsIHBlbW9kZWxhbiBtZW51bmp1a2thbiBiYWh3YSBNb2RlbCBCaW5vbWlhbCBOZWdhdGlmIHRlcmJhaWsgKE1vZGVsIDM7IEFJQyA9IDU2NCw5NykgbWVuZ2lkZW50aWZpa2FzaSB0aWdhIHZhcmlhYmVsIHlhbmcgYmVycGVuZ2FydWggc2lnbmlmaWthbi4gS2V0ZXJzZWRpYWFuIGZhc2lsaXRhcyBrZXNlaGF0YW4gbWVydXBha2FuIGZha3RvciBwcm90ZWt0aWYgeWFuZyBwYWxpbmcga3VhdCAoSVJSID0gMCw3MjQ7IHAgPCAwLDAwMSksIGRpaWt1dGkgb2xlaCBJbmRla3MgUGVtYmFuZ3VuYW4gTWFudXNpYSAoSVBNKSBzZWJhZ2FpIGZha3RvciBwcm90ZWt0aWYgKElSUiA9IDAsNzAwOyBwID0gMCwwMjEpLiBTZWJhbGlrbnlhLCBrZXBhZGF0YW4gcGVuZHVkdWsgbWVydXBha2FuIGZha3RvciByaXNpa28geWFuZyBzaWduaWZpa2FuIHRlcmhhZGFwIHBlbmluZ2thdGFuIGthc3VzIGRpYXJlIChJUlIgPSAxLDQ5MTsgcCA9IDAsMDA4KS4NCjQuCVNlbWVudGFyYSBpdHUsIHZhcmlhYmVsIGFrc2VzIHNhbml0YXNpLCBha3NlcyBhaXIgYmVyc2loLCBkYW4gZ2FyaXMga2VtaXNraW5hbiB0aWRhayBtZW51bmp1a2thbiBwZW5nYXJ1aCB5YW5nIHNpZ25pZmlrYW4gZGFsYW0gbW9kZWwgbXVsdGl2YXJpYXQuIEhhbCBpbmkgZGlkdWdhIGJlcmthaXRhbiBkZW5nYW4gYWRhbnlhIGVmZWsgYW1iYW5nICh0aHJlc2hvbGQgZWZmZWN0KSwga2V0ZXJiYXRhc2FuIHZhcmlhc2kgZGF0YSBhbnRhcndpbGF5YWgsIHNlcnRhIGtlbXVuZ2tpbmFuIGFkYW55YSBtdWx0aWtvbGluZWFyaXRhcyBhbnRhcnZhcmlhYmVsIHNvc2lhbCBla29ub21pLg0KDQojIyA1LjIgU2FyYW4NCg0KQmVyZGFzYXJrYW4gdGVtdWFuIHBlbmVsaXRpYW4sIGJlYmVyYXBhIHJla29tZW5kYXNpIHlhbmcgZGFwYXQgZGlhanVrYW4gYWRhbGFoIHNlYmFnYWkgYmVyaWt1dC4NCg0KMS4JRGlwZXJsdWthbiBwcmlvcml0YXMgaW50ZXJ2ZW5zaSBrb21wcmVoZW5zaWYgcGFkYSB3aWxheWFoIGRlbmdhbiBiZWJhbiBkaWFyZSB0aW5nZ2ksIGtodXN1c255YSBLb3RhIENpcmVib24sIEtvdGEgQm9nb3IsIGRhbiBLb3RhIFN1a2FidW1pIHlhbmcgbWVtaWxpa2kgU0lSIOKJpSAyLDAuIEludGVydmVuc2kgdGVyc2VidXQgbWVuY2FrdXAgYXVkaXQgbWVueWVsdXJ1aCB0ZXJoYWRhcCBrdWFsaXRhcyBhaXIgbWludW0sIGtvbmRpc2kgaW5mcmFzdHJ1a3R1ciBzYW5pdGFzaSwgc2VydGEgc2lzdGVtIHBlbmdlbG9sYWFuIGxpbWJhaCB1bnR1ayBtZW5naWRlbnRpZmlrYXNpIHN1bWJlciByaXNpa28gdXRhbWEgc2VjYXJhIGxlYmloIHNwZXNpZmlrLg0KMi4JUGVuZ3VhdGFuIGthcGFzaXRhcyBkYW4ga2V0ZXJzZWRpYWFuIGZhc2lsaXRhcyBrZXNlaGF0YW4gcGVybHUgbWVuamFkaSBmb2t1cyB1dGFtYSBwYWRhIHdpbGF5YWggZGVuZ2FuIHJhc2lvIGZhc2lsaXRhcyBrZXNlaGF0YW4gcmVuZGFoIGRhbiBpbnNpZGVucyB0aW5nZ2kuIFNlYmFnYWkgY29udG9oLCBLb3RhIENpcmVib24gZGVuZ2FuIGp1bWxhaCBmYXNpbGl0YXMga2VzZWhhdGFuIHlhbmcgcmVsYXRpZiB0ZXJiYXRhcyBkaWJhbmRpbmdrYW4ganVtbGFoIHBlbmR1ZHVrIG1lbWVybHVrYW4gcGVuaW5na2F0YW4gYWtzZXMgbGF5YW5hbiBrZXNlaGF0YW4gZGFzYXIgc2ViYWdhaSBzdHJhdGVnaSBpbnRlcnZlbnNpIHlhbmcgcmVsYXRpZiBlZmlzaWVuIG5hbXVuIGJlcmRhbXBhayBzaWduaWZpa2FuLg0KMy4JUHJvZ3JhbSBwZW5pbmdrYXRhbiBJbmRla3MgUGVtYmFuZ3VuYW4gTWFudXNpYSAoSVBNKSBwZXJsdSBkaWludGVncmFzaWthbiBkZW5nYW4gc3RyYXRlZ2kgcGVuZ2VuZGFsaWFuIGRpYXJlLCB0ZXJ1dGFtYSBtZWxhbHVpIHBlbmluZ2thdGFuIHBlbmRpZGlrYW4ga2VzZWhhdGFuIG1hc3lhcmFrYXQsIGxpdGVyYXNpIHBlcmlsYWt1IGhpZHVwIGJlcnNpaCBkYW4gc2VoYXQsIHNlcnRhIHBlbmluZ2thdGFuIGRheWEgYmVsaSBydW1haCB0YW5nZ2EuIEhhbCBpbmkgcGVudGluZyBtZW5naW5nYXQgSVBNIHRlcmJ1a3RpIHNlYmFnYWkgZmFrdG9yIHByb3Rla3RpZiB5YW5nIGJlcnNpZmF0IG11bHRpZGltZW5zaW9uYWwuDQo0LglQZW5ndWF0YW4gc2lzdGVtIHN1cnZlaWxhbnMgZXBpZGVtaW9sb2dpIHBlcmx1IGRpbGFrdWthbiBwYWRhIHdpbGF5YWggZGVuZ2FuIGJlYmFuIGRpYXJlIHRpbmdnaSB1bnR1ayBtZW5pbmdrYXRrYW4ga2VsZW5na2FwYW4gKGNvbXBsZXRlbmVzcykgZGFuIGFrdXJhc2kgcGVsYXBvcmFuIGthc3VzLiBIYWwgaW5pIHBlbnRpbmcgZ3VuYSBtZW1hc3Rpa2FuIGJhaHdhIGdhbWJhcmFuIGVwaWRlbWlvbG9naSB5YW5nIGRpaGFzaWxrYW4gbGViaWggcmVwcmVzZW50YXRpZiB0ZXJoYWRhcCBrb25kaXNpIHNlYmVuYXJueWEuDQo1LglQZW5lbGl0aWFuIGxhbmp1dGFuIGRpc2FyYW5rYW4gdW50dWsgbWVuZ2d1bmFrYW4gZGVzYWluIGRhdGEgcGFuZWwgbXVsdGktdGFodW4gKDIwMTjigJMyMDI0KSBndW5hIG1lbmdhbmFsaXNpcyB0cmVuIHRlbXBvcmFsIHNlcnRhIG1lbmdpZGVudGlmaWthc2kgZGV0ZXJtaW5hbiBzZWNhcmEgbGViaWggcHJlc2lzaS4gUGVuZGVrYXRhbiBzcGFzaW90ZW1wb3JhbCBhdGF1IG1vZGVsIGRhdGEgcGFuZWwganVnYSBkaXJla29tZW5kYXNpa2FuIHVudHVrIG1lbXBlcmt1YXQgaW5mZXJlbnNpIGthdXNhbCBkYW4gbWVtYWhhbWkgZGluYW1pa2EgcGVueWViYXJhbiBwZW55YWtpdCBzZWNhcmEgbGViaWgga29tcHJlaGVuc2lmLg0KDQotLS0NCg0KIyBEYWZ0YXIgUHVzdGFrYQ0KDQoxLglDYW1lcm9uLCBBLiBDLiwgJiBUcml2ZWRpLCBQLiBLLiAoMTk5MCkuIFJlZ3Jlc3Npb24tYmFzZWQgdGVzdHMgZm9yIG92ZXJkaXNwZXJzaW9uIGluIHRoZSBQb2lzc29uIG1vZGVsLiBKb3VybmFsIG9mIEVjb25vbWV0cmljcywgNDYoMyksIDM0N+KAkzM2NC4NCjIuCUZveCwgSi4sICYgV2Vpc2JlcmcsIFMuICgyMDE5KS4gQW4gUiBDb21wYW5pb24gdG8gQXBwbGllZCBSZWdyZXNzaW9uICgzcmQgZWQuKS4gU0FHRSBQdWJsaWNhdGlvbnMuDQozLglIaWxiZSwgSi4gTS4gKDIwMTEpLiBOZWdhdGl2ZSBCaW5vbWlhbCBSZWdyZXNzaW9uICgybmQgZWQuKS4gQ2FtYnJpZGdlIFVuaXZlcnNpdHkgUHJlc3MuDQo0LglLZW1lbnRlcmlhbiBLZXNlaGF0YW4gUmVwdWJsaWsgSW5kb25lc2lhLiAoMjAyNCkuIFByb2ZpbCBLZXNlaGF0YW4gSW5kb25lc2lhIDIwMjQuIEtlbWVua2VzIFJJLg0KNS4JT3BlbiBEYXRhIEphd2EgQmFyYXQuICgyMDI0KS4gSnVtbGFoIEthc3VzIFBlbnlha2l0IERpYXJlIGJlcmRhc2Fya2FuIEthYnVwYXRlbi9Lb3RhIGRpIEphd2EgQmFyYXQuIERpYWtzZXMgSnVuaSAyMDI2IGRhcmkgaHR0cHM6Ly9vcGVuZGF0YS5qYWJhcnByb3YuZ28uaWQNCjYuCUFuc2VsaW4sIEwuICgxOTk1KS4gTG9jYWwgSW5kaWNhdG9ycyBvZiBTcGF0aWFsIEFzc29jaWF0aW9u4oCUTElTQS4gR2VvZ3JhcGhpY2FsIEFuYWx5c2lzLCAyNygyKSwgOTPigJMxMTUuDQo3LglCaXZhbmQsIFIuLCBQZWJlc21hLCBFLiwgJiBHb21lei1SdWJpbywgVi4gKDIwMTMpLiBBcHBsaWVkIFNwYXRpYWwgRGF0YSBBbmFseXNpcyB3aXRoIFIgKDJuZCBlZC4pLiBTcHJpbmdlci4NCjguCUJQUyBQcm92aW5zaSBKYXdhIEJhcmF0LiAoMjAyNCkuIEphd2EgQmFyYXQgZGFsYW0gQW5na2EgMjAyNC4gQmFkYW4gUHVzYXQgU3RhdGlzdGlrIFByb3ZpbnNpIEphd2EgQmFyYXQuDQo5LglNb3JhbiwgUC4gQS4gUC4gKDE5NTApLiBOb3RlcyBvbiBjb250aW51b3VzIHN0b2NoYXN0aWMgcGhlbm9tZW5hLiBCaW9tZXRyaWthLCAzNygx4oCTMiksIDE34oCTMjMuDQoxMC4JUiBDb3JlIFRlYW0uICgyMDI0KS4gUjogQSBMYW5ndWFnZSBhbmQgRW52aXJvbm1lbnQgZm9yIFN0YXRpc3RpY2FsIENvbXB1dGluZy4gUiBGb3VuZGF0aW9uIGZvciBTdGF0aXN0aWNhbCBDb21wdXRpbmcuIGh0dHBzOi8vd3d3LlItcHJvamVjdC5vcmcvDQoxMS4JVmVuYWJsZXMsIFcuIE4uLCAmIFJpcGxleSwgQi4gRC4gKDIwMDIpLiBNb2Rlcm4gQXBwbGllZCBTdGF0aXN0aWNzIHdpdGggUyAoNHRoIGVkLikuIFNwcmluZ2VyLiBbUGFrZXQgTUFTU10NCjEyLglXaWNraGFtLCBILiwgZXQgYWwuICgyMDE5KS4gV2VsY29tZSB0byB0aGUgdGlkeXZlcnNlLiBKb3VybmFsIG9mIE9wZW4gU291cmNlIFNvZnR3YXJlLCA0KDQzKSwgMTY4Ni4NCjEzLglXb3JsZCBIZWFsdGggT3JnYW5pemF0aW9uLiAoMjAyMykuIERpYXJyaG9lYWwgRGlzZWFzZS4gRmFjdCBTaGVldC4gaHR0cHM6Ly93d3cud2hvLmludC9uZXdzLXJvb20vZmFjdC1zaGVldHMvZGV0YWlsL2RpYXJyaG9lYWwtZGlzZWFzZQ0KDQotLS0NCg0K