Pemodelan Tingkat Kriminalitas di Indonesia Terboboti Jumlah Penduduk dan Luas WIlayah menggunakan Geograhically Weighted Panel Regression (GWPR)

Alfidhia

2023-06-16

Anggota Kelompok 1

  • G1401201004 Alfidhia Rahman Nasa Juhanda
  • G1401201050 Hanung Safrizal
  • G1401201064 Muhammad Irsyad Robbani
  • G1401201081 Zakiyah Azzahra
  • G1401201092 Muhammad Zhillan Zakiyyan
lapply(c("kableExtra","tidyverse","plm","tinytex","tseries","lmtest", "broom", "stargazer", "RColorBrewer", "googlesheets4", "corrplot", "car"), library, character.only = T)[[1]]
## [1] "kableExtra" "stats"      "graphics"   "grDevices"  "utils"     
## [6] "datasets"   "methods"    "base"

Data

Data yang digunakan adalah data Jumlah Tindak Pidana per 100 ribu penduduk dengan 7 Peubah bebas. Data ini berjenis data panel dengan individunya adalah 34 Provinsi di Indonesia selama 6 tahun (Tahun 2015-2020) dengan peubah-peubah sebagai berikut:

  • PDN : Jumlah tindak pidana per 100.000 Penduduk (Peubah Respons)

  • KMIS : Tingkat crimekinan (%)

  • RLS : Rata-rata Lama Sekolah (Tahun)

  • IPM : Indeks Pembangunan Manusia (Poin)

  • TPT : Tingkat Pengangguran Terbuka (%)

  • PDRB : Produk Domestik Regional Bruto Per Kapita (Ribu Rupiah)

  • AHH : Angka Harapan Hidup (Tahun)

  • PKD : Pengeluaran per Kapita Disesuaikan (Ribu Rupiah/Orang/Tahun)

Selain itu, digunakan pula peubah Jumlah Penduduk dan Luas Wilayah untuk manipulasi data. Untuk lebih jelasnya, dapat dilihat dari output berikut:

gs4_deauth()
crime <- read_sheet("https://docs.google.com/spreadsheets/d/1nJUZTW7l52XB77-zQpurDjVw0tYyTWCF141CCRZ27yg/edit#gid=1513708653")
## ✔ Reading from "Kelompok 1 ADP".
## ✔ Range 'table'.
colnames(crime) <- c("PROV", "TAHUN", "PENDUDUK", "LUAS", "PDN", "KMIS", "RLS", "IPM", "TPT", "PDRB", "AHH", "PKD")
crime$PROV <- as.factor(crime$PROV)
crime$TAHUN <- as.factor(crime$TAHUN)
str(crime)
## tibble [204 × 12] (S3: tbl_df/tbl/data.frame)
##  $ PROV    : Factor w/ 34 levels "ACEH","BALI",..: 1 34 32 26 8 33 4 19 17 18 ...
##  $ TAHUN   : Factor w/ 6 levels "2015","2016",..: 6 6 6 6 6 6 6 6 6 6 ...
##  $ PENDUDUK: num [1:204] 5388 14798 5546 6951 3604 ...
##  $ LUAS    : num [1:204] 57956 72981 42013 87024 50058 ...
##  $ PDN     : num [1:204] 149 231 150 123 134 147 172 92 133 127 ...
##  $ KMIS    : num [1:204] 15.21 8.95 6.42 6.93 7.78 ...
##  $ RLS     : num [1:204] 9.33 9.54 8.99 9.14 8.55 ...
##  $ IPM     : num [1:204] 72 71.8 72.4 72.7 71.3 ...
##  $ TPT     : num [1:204] 6 5.81 6.07 5.62 4.7 4.71 3.58 4.47 4.3 8.16 ...
##  $ PDRB    : num [1:204] 31633 54979 43826 114167 57958 ...
##  $ AHH     : num [1:204] 70 69.2 69.5 71.7 71.2 ...
##  $ PKD     : num [1:204] 9492 10420 10733 10675 10392 ...

Dapat terlihat bahwa terdapat 204 total observasi, yaitu 34 individu dengan periode 6 tahun. Semua peubah berjenis numerik kontinu.

Pre-processing Data

Penanganan Missing Value

colSums(is.na(crime))
##     PROV    TAHUN PENDUDUK     LUAS      PDN     KMIS      RLS      IPM 
##        0        0        0        0        5        0        0        0 
##      TPT     PDRB      AHH      PKD 
##        0        0        0        0

Dari output di atas, dapat terlihat bahwa terdapat 5 missing value di peubah respons, yaitu PDN. kita akan menggunakan imputasi Group Mean Imputation untuk mengatasi masalah ini dengan menjadikan setiap provinsi adalah grup. Sehingga, kita perlu tahu provinsi apa saja yang memiliki missing value.

crime %>%
  select(PROV, TAHUN, PDN) %>% 
  filter(is.na(PDN))
num <- crime %>% mutate(no = row_number()) %>% filter(is.na(PDN)) %>% pull(no)

Dapat terlihat bahwa provinsi Kalimantan Utara dan Sulawesi Barat merupakan provinsi yang memiliki nilai missing value, sehingga kita perlu menghitung rataan nilai PDN dari kedua provinsi tersebut.

crime %>% 
  na.omit() %>% 
  select(PROV, PDN) %>% 
  group_by(PROV) %>% 
  summarise("Rata-rata"=mean(PDN)) %>% 
  filter(PROV %in% c("KALIMANTAN UTARA", "SULAWESI BARAT"))

Kemudian, input rata-rata yang didapatkan di atas terhadap nilai yang hilang sebelumnya.

crime <- crime %>%
            mutate(PDN = ifelse(is.na(PDN), 
                                ifelse(PROV == "KALIMANTAN UTARA", 
                                       110, ifelse(PROV == "SULAWESI BARAT",
                                                   140.75,PDN)), PDN))

Sehingga didapat:

crime %>% 
  select(PROV, TAHUN, PDN) %>% 
  slice(as.numeric(num))

Masalah missing value terselesaikan.

Feature Engineering

Data yang diperoleh pada sumber adalah Jumlah tindak pidana yang telah terboboti oleh Jumlah penduduk setiap provinsi. Analisis pada peubah ini telah dilakukan sebelumnya oleh Febrianti (2022). Pada penelitian ini, kami mengusung pembobotan tambahan pada peubah yang sama, yaitu dengan pembobotan pada luas wilayah setiap provinsi. Syntax yang digunakan adalah sebagai berikut:

crime <- crime %>%
  mutate(PDN_AREA=PDN/LUAS*100) %>% 
  select(PROV,TAHUN,PDN,PDN_AREA,everything(),-PENDUDUK,-LUAS)
crime

Metodologi

Metodologi yang digunakan adalah sebagai berikut:

  1. Melakukan pre-pocessing data, yaitu menanganani missing value dan melakukan feature engineering dengan pembobotan pada luas wilayah di setiap provinsi pada data jumlah tindak pidana.

  2. Melakukan eksplorasi data.

  3. Melakukan pemodelan regresi panel CEM, FEM, dan REM.

  4. Melakukan uji Chow, Uji Hausman, dan Uji Lagrange Multiplier untuk memilih model panel terbaik di antara model CEM, FEM, dan REM.

  5. Memeriksa heterogenitas spasial dengan uji Breusch Pagan pada model terpilih. Pemodelan GWPR mengasumsikan adanya heterogenitas spasial.

  6. Menghitung bandwidth optimum dan matriks pembobot spasial.

  7. Mengestimasi nilai parameter pemodelan GWPR.

  8. Melakukan pengujian serentak pemodelan GWPR dengan statistik uji F dan pengujian parsial dengan statistik uji t

  9. Melakukan perbandingan model antara regresi panel dan GWPR dengan kriteria R^2.

  10. Interpretasi model terbaik yang diperoleh.

Eksplorasi Data

Keragaman Antar Waktu

ggplot(data = crime, aes(x = TAHUN, y = PDN_AREA)) +
  geom_line() +
  labs(x = "Tahun", y = "Jumlah Pidana") +
  theme(legend.position = "none") +
  theme_bw()

Keragaman antar Individu

gplots::plotmeans(PDN ~ `PROV`, main="Keragaman Antar Jumlah Pidana / 100rb Penduduk", crime, n.label = F, xlab = "a")

gplots::plotmeans(PDN_AREA ~ `PROV`, main="Keragaman Antar Jumlah Pidana / 100rb Penduduk / 100km2", crime, n.label = F, xlab = "a")

Pada plot keragaman antarwaktu untuk peubah jumlah tindak pidana per 100.000 penduduk per 100km persegi (PDN_AREA) mengalami penurunan jumlah seiring waktunya. Kemudian, pada plot keragaman antarprovinsi untuk peubah jumlah tindak pidana per 100.000 penduduk (PDN) terlihat cukup beragam nilainya. Sementara untuk peubah PDN_AREA persegi terlihat perbedaan nilai yang signifikan pada wilayah DKI Jakarta dan DI Yogyakarta. Sebaran nilai pada plot kedua tersebut tidak terlihat perbedaan yang jauh pada provinsi lainnya.

Correlation Plot

Sebelumnya disebutkan bahwa kami menggunakan pembobotan tambahan pada peubah respons (PDN). Alasan kami memilih pembobotan tambahan akan dijelaskan lebih lanjut pada plot korelasi di bawah.

corrplot(cor(crime[-c(1:2)]), method="color", type = "upper", tl.pos = 'tp')
corrplot(cor(crime[-c(1:2)]), method="number", diag=F, add=T, type = "lower",
         tl.pos = 'n', cl.pos = 'n')

Dari plot korelasi di atas, dapat terlihat bahwa Jumlah Pidana yang tidak terboboti luas wilayah memiliki korelasi pada peubah penjelas yang relatif rendah (|r|<= 0.3). Sedangkan, pada Jumlah Pidana yang terboboti oleh Luas Wilayah memiliki korelasi yang relatif lebih tinggi jika dibanding Jumlah pidana yang tidak terboboti Luas Wilayah. Oleh karena itu, akan lebih baik jika digunakan peubah respons yang terboboti PDN_AREA jika dibandingkan PDN. Sehingga:

Time Series Plot

Perbandingan PDN dan PDN_AREA

crime %>%
  mutate(TAHUN=as.numeric(as.character(TAHUN))) %>% 
  pivot_longer(cols = c(PDN, PDN_AREA), names_to = "variable", values_to = "value") %>% 
  ggplot(aes(x = TAHUN, y = value, color = PROV)) +
  geom_line() +
  geom_point(size=2, shape=19, fill="red") +
  facet_wrap(~variable, scales = "free_y") +
  labs(title = "Jumlah Tindak Pidana / 100rb Penduduk vs\nJumlah Tindak Pidana / 100rb Penduduk / 100km2", x = "Year", y = "Value", color = "Province") +
  theme(legend.position = "bottom", plot.title = element_text(face = "bold", hjust = 0.5))

Plot PDN

ggplot(data=crime, aes(x=TAHUN, y=PDN, group = PROV, colour = PROV))+ theme_bw()+
  geom_line(size=1.2) +
  geom_point(size=3, shape=19, fill="red") + 
  labs(colour="PROV", title = "Jumlah tindak pidana per 100.000 Penduduk", subtitle = "Tahun 2015-2020") +
  theme(plot.title = element_text(face = "bold"))
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.

Plot PDN_AREA

ggplot(crime, aes(x=TAHUN, y=PDN_AREA, group = PROV, colour = PROV))+ theme_bw()+
  geom_line(size=1.2) +
  geom_point( size=3, shape=19, fill="red") + 
  labs(colour="PROV", title = "Jumlah Tindak Pidana / 100rb Penduduk / 100km2", subtitle = "Tahun 2015-2020") +
  theme(plot.title = element_text(face = "bold"))

Plot PDN AREA tanpa DKI Jakarta dan DI Yogyakarta

crime %>% 
  filter(PROV!="DKI JAKARTA" & PROV!="D I YOGYAKARTA") %>% 
  ggplot(aes(x=TAHUN, y=PDN_AREA, group = PROV, colour = PROV))+ theme_bw()+
  geom_line(size=1.2) +
  geom_point( size=3, shape=19, fill="red") + 
  labs(colour="PROV", title = "Jumlah Tindak Pidana / 100rb Penduduk / 100km2", subtitle = "Tahun 2015-2020") +
  theme(plot.title = element_text(face = "bold"))

Pada gambar di atas, terlihat bahwa perkembangan PDN_AREA setiap provinsi Indonesia tahun 2015-2020 cukup beragam. Ada provinsi tertentu yang meningkat, menurun, atau stagnan nilai peubah PDN_AREA provinsi Indonesia tahun 2015-2020 hanya terlihat pada provinsi DKI Jakarta dan DI Yogyakarta saja yang mana perkembanganya menurun. Untuk lebih jelasnya, dibuatlah gambar 7 yang mana gambar 7 merupakan plot yang sama dengan gambar 6. Hanya saja gambar 7 tidak memasukkan kategori provinsi DKI Jakarta dan DI Yogyakarta agar provinsi dengan PDN_AREA yang rendah dapat terlihat bagaimana perkembangannya. Terlihat bahwa nilai PDN_AREA masing-masing provinsi mayoritas mengalami penurunan pada rentang waktu 2015-2020.

Map Chart

Map di bawah ini dibuat pada Aplikasi Tableau Public, merupakan sebaran rata-rata peubah PDN dan PDN_AREA di Indonesia pada selama tahun 2015 hingga 2020.

Map chart untuk rataan PDN 2015-2020 untuk masing-masing provinsi menunjukkan bahwa di beberapa wilayah pelosok Sumatera, Sulawesi dan Papua masih cukup tinggi banyaknya tindak pidana yang terjadi. Kemudian, setelah peubah PDN diboboti dengan wilayah per 100km persegi, sebagian besar wilayah pelosok banyak tindak pidana terboboti wilayahnya cukup kecil (lebih kecil dari 1). Meskipun begitu, masih terlihat beberapa wilayah yang cukup tinggi seperti DKI Jakarta, DI Yogyakarta, Kepulauan Riau, Gorontalo, Bali, hingga Bengkulu.

Seleksi Peubah Multikolinearitas

# Menghapus peubah PDN karena sudah tidak akan digunakan
crime <- crime %>% select(-PDN)
check_model <- lm(PDN_AREA ~ KMIS + RLS + IPM + TPT + PDRB + AHH + PKD, crime)
data.frame(t(vif(check_model)))

Dari hasil di atas, dapat terlihat bahwa peubah IPM memiliki VIF yang sangat tinggi, yaitu 38.78 yang mana lebih besar dari nol. Hal ini melanggar asumsi Multikolinearitas sehingga peubah ini akan dihilangkan.

crime <- crime %>% select(-IPM)
check_model <- lm(PDN_AREA ~ KMIS + RLS + TPT + PDRB + AHH + PKD, crime)
data.frame(t(vif(check_model)))

Setelah menghilangkan peubah IPM, didapat semua nilai VIF peubah menjadi << 10, artinya asumsi multikolinearitas terpenuhi.

Common-Effect Model

Common Effect Model (CEM) atau disebut juga pooled regression model merupakan salah satu model dalam regresi data panel yang mengkombinasikan data cross-section dan time series menjadi satu kesatuan (pooldata) yang kemudian diestimasi modelnya dengan teknik OLS. Akibatnya, perbedaan baik antar individu maupun antar waktu tidak dapat diamati. Dengan kata lain, dalam pendekatan ini dimensi individu maupun waktu tidak diperhatikan. Diasumsikan bahwa perilaku data antar Individu sama dalam berbagai kurun waktu. Persamaan pool model dapat dituliskan sebagai berikut:

\[ \begin{aligned} y_{it} &= \alpha + \beta_{1}x_{1,it}+ \beta_{2}x_{2,it}+...+\beta_{k}x_{k,it}+\varepsilon_{it} \\ \end{aligned} \]

dengan \(y_{ij}\) merupakan variabel dependen individu ke-i dan waktu ke-j. \(\alpha\) adalah intersep, \(x_{p,ij}\) adalah variabel independen ke-p individu ke-i dan waktu ke-j, \(\beta_k\) koefisien variabel bebas, dan \(\varepsilon_{ij}\) merupakan galat individu ke-i dan waktu ke-j.

Selain asumsi kesamaan pengaruh individu dan waktu, asumsi lain yang diperlukan pada model ini adalah asumsi normalitas, homogenitas, dan kebebasan galat.

Model CEM

Program R menyediakan package plm yang dapat memodelkan data menjadi model CEM.

Dalam pemodelan ini, dapat dibuat hipotesis:

\[ \begin{aligned} H_0 &: \text{CEM adalah model yang tidak layak}\\ H_1 &: \text{CEM adalah model yang layak} \end{aligned} \]

library(plm)
cem <- plm(PDN_AREA ~ KMIS + RLS + TPT + PDRB + AHH + PKD, data = crime, model = "pooling")
summary(cem)
## Pooling Model
## 
## Call:
## plm(formula = PDN_AREA ~ KMIS + RLS + TPT + PDRB + AHH + PKD, 
##     data = crime, model = "pooling")
## 
## Balanced Panel: n = 34, T = 6, N = 204
## 
## Residuals:
##     Min.  1st Qu.   Median  3rd Qu.     Max. 
## -5.72244 -1.14021 -0.18869  0.79534 15.12686 
## 
## Coefficients:
##                Estimate  Std. Error t-value  Pr(>|t|)    
## (Intercept) -7.4014e+00  5.9327e+00 -1.2476  0.213673    
## KMIS         2.1825e-01  3.9638e-02  5.5060 1.136e-07 ***
## RLS          6.9626e-01  2.5559e-01  2.7242  0.007026 ** 
## TPT         -1.7381e-01  1.0775e-01 -1.6131  0.108330    
## PDRB         2.6495e-05  5.0511e-06  5.2453 4.010e-07 ***
## AHH         -1.7906e-01  8.3613e-02 -2.1415  0.033463 *  
## PKD          1.1957e-03  1.2684e-04  9.4265 < 2.2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    2934.7
## Residual Sum of Squares: 1096.4
## R-Squared:      0.62639
## Adj. R-Squared: 0.61501
## F-statistic: 55.0488 on 6 and 197 DF, p-value: < 2.22e-16

Pada dasarnya, pendugaan model yang dilakukan oleh metode CEM menghasilkan model yang sama persis dengan metode Regresi Linear Berganda dengan memandang setiap baris pada data adalah individu yang berbeda-beda. Model regresi yang dihasilkan tertulis di atas, dengan interpretasinya adalah:

  • Setiap kenaikan satu satuan KMIS menyebabkan PDN_AREA meningkat sebesar 0.21825 dengan menganggap peubah lain konstan.

  • Setiap kenaikan satu satuan RLS menyebabkan PDN_AREA meningkat sebesar 0.6926 dengan menganggap peubah lain konstan.

  • Setiap kenaikan satu satuan TPT menyebabkan PDN_AREA menurun sebesar 0.17381 dengan menganggap peubah lain konstan.

  • Setiap kenaikan satu satuan PDRB menyebabkan PDN_AREA meningkat sebesar 2.6495e-05 dengan menganggap peubah lain konstan.

  • Setiap kenaikan satu satuan AHH menyebabkan PDN_AREA menurun sebesar 0.17906 dengan menganggap peubah lain konstan.

  • Setiap kenaikan satu satuan PKD menyebabkan PDN_AREA meningkat sebesar 1.1957e-03 dengan menganggap peubah lain konstan.

Untuk semua p-value di bawah 5%, maka terdapat cukup bukti untuk menolak \(H_0\) (kurang dari 5% kemungkinan bahwa \(H_0\) benar).

  • p-value uji-F < 2.22e-16 << 5%. Artinya, dapat dikatakan bahwa model layak untuk digunakan.

  • p-value uji-T untuk peubah KMIS, RLS, PDRB, AHH, dan PKD < 5%. Artinya, dapat dikatakan bahwa peubah tersebut berpengaruh signifikan terhadap model.

\(R^2\) merupakan nilai yang menunjukan kekuatan hubungan antara peubah bebas dan peubah respons. Semakin tinggi nilai \(R^2\), maka semakin baik model tersebut.

  • \(R^2\) pada model sebesar 0.12645 atau 12.645% yang mengindikasikan bahwa peubah yang digunakan kurang baik dalam menggambarkan model.

Meskipun sebagian besar parameter model signifikan, tetapi nilai R2 model kurang baik dan fakta bahwa model CEM mengabaikan pengaruh individu dan waktu tidak bisa diabaikan. Kedua faktor tersebut bisa berpengaruh terhadap keheterogenan sisaan pada model. Oleh karena itu, perlu dilakukan perbandingan model CEM dengan FEM dan REM untuk memastikan model terbaik.

Fixed-Effect Model

Fixed-Effect model merupakan salah satu jenis model dalam regresi data panel yang mempertimbangkan adanya pengaruh individu dan waktu. Terdapat asumsi bahwa intersep antar individu dan waktu berbeda tetapi koefisien regresi konstan untuk semua individu dan waktu. Model yang memiliki pengaruh dari salah satu dari individu atau waktu disebut model sisaan satu arah dan model yang memiliki pengaruh dari keduanya disebut model sisaan dua arah. Pendugaan pada model ini biasa dilakukan dengan model Within atau Least Square Dummy Variable (LSDV). Pada penelitian ini, hanya digunakan model within.

Persamaan model Fixed-Effect :

  • Pengaruh Individu

\[ \begin{aligned} y_{it} = \alpha + f_i +\beta_1x_{1,it} + \beta_2x_{2,it} + ... + \beta_kx_{k,it} + \varepsilon_{it} \end{aligned} \]

  • Pengaruh Waktu

\[ \begin{aligned} y_{it} = \alpha + \lambda_t +\beta_1x_{1,it} + \beta_2x_{2,it} + ... + \beta_kx_{k,it} + \varepsilon_{it} \end{aligned} \]

  • Model Dua arah (pengaruh individu dan waktu)

\[ \begin{aligned} y_{it} = \alpha + f_i + \lambda_t +\beta_1x_{1,it} + \beta_2x_{2,it} + ... + \beta_kx_{k,it} + \varepsilon_{it} \end{aligned} \]

FEM Individual

Efek komponen sisaaan satu arah pada individu.

fem_ind <- plm(PDN_AREA ~ KMIS + RLS + TPT + PDRB + AHH + PKD, index = c("PROV", "TAHUN"), model = "within", effect= "individual", data = crime)
summary(fem_ind)
## Oneway (individual) effect Within Model
## 
## Call:
## plm(formula = PDN_AREA ~ KMIS + RLS + TPT + PDRB + AHH + PKD, 
##     data = crime, effect = "individual", model = "within", index = c("PROV", 
##         "TAHUN"))
## 
## Balanced Panel: n = 34, T = 6, N = 204
## 
## Residuals:
##      Min.   1st Qu.    Median   3rd Qu.      Max. 
## -3.453977 -0.176466 -0.013324  0.171397  2.908483 
## 
## Coefficients:
##         Estimate  Std. Error t-value  Pr(>|t|)    
## KMIS -2.0378e-02  1.0946e-01 -0.1862  0.852544    
## RLS   1.5999e+00  5.5946e-01  2.8597  0.004792 ** 
## TPT  -2.2009e-01  9.0523e-02 -2.4313  0.016122 *  
## PDRB -7.7429e-05  8.5420e-06 -9.0645 3.662e-16 ***
## AHH  -3.0887e-01  3.4891e-01 -0.8852  0.377324    
## PKD  -3.0543e-04  2.5732e-04 -1.1870  0.236953    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    106.82
## Residual Sum of Squares: 57.409
## R-Squared:      0.46255
## Adj. R-Squared: 0.33474
## F-statistic: 23.5243 on 6 and 164 DF, p-value: < 2.22e-16

Interpretasi :

  • Setiap kenaikan satu satuan KMIS menyebabkan PDN_AREA menurun sebesar 0.020378 dengan menganggap peubah lain konstan.

  • Setiap kenaikan satu satuan RLS menyebabkan PDN_AREA meningkat sebesar 1.5999 dengan menganggap peubah lain konstan.

  • Setiap kenaikan satu satuan TPT menyebabkan PDN_AREA menurun sebesar 0.22009 dengan menganggap peubah lain konstan.

  • Setiap kenaikan satu satuan PDRB menyebabkan PDN_AREA menurun sebesar 7.7429e-05 dengan menganggap peubah lain konstan.

  • Setiap kenaikan satu satuan AHH menyebabkan PDN_AREA menurun sebesar 0.30887 dengan menganggap peubah lain konstan.

  • Setiap kenaikan satu satuan PKD menyebabkan PDN_AREA menurun sebesar 3.0543e-04 dengan menganggap peubah lain konstan.

Untuk semua p-value di bawah 5%, maka terdapat cukup bukti untuk menolak \(H_0\) (kurang dari 5% kemungkinan bahwa \(H_0\) benar).

  • p-value uji-F < 2.22e-16 << 5%. Artinya, dapat dikatakan bahwa model layak untuk digunakan.

  • p-value uji-T untuk peubah RLS, TPT, dan PDRB < 5%. Artinya, dapat dikatakan bahwa peubah tersebut berpengaruh signifikan terhadap model.

\(R^2\) merupakan nilai yang menunjukan kekuatan hubungan antara peubah bebas dan peubah respons. Semakin tinggi nilai \(R^2\), maka semakin baik model tersebut.

  • \(R^2\) pada model sebesar 0.46225 atau 46.225% yang mengindikasikan bahwa peubah yang digunakan kurang baik dalam menggambarkan model.
summary(fixef(fem_ind, effect="individual"))
##                      Estimate Std. Error t-value Pr(>|t|)  
## ACEH                   14.233     21.226  0.6705  0.50345  
## BALI                   18.482     21.927  0.8429  0.40050  
## BANTEN                 17.737     21.130  0.8394  0.40245  
## BENGKULU               15.299     21.187  0.7221  0.47126  
## D I YOGYAKARTA         22.604     23.001  0.9828  0.32717  
## DKI JAKARTA            51.759     21.403  2.4183  0.01669 *
## GORONTALO              17.789     21.180  0.8399  0.40218  
## JAMBI                  17.485     21.737  0.8044  0.42234  
## JAWA BARAT             17.756     22.361  0.7941  0.42831  
## JAWA TENGAH            18.469     23.360  0.7906  0.43029  
## JAWA TIMUR             18.801     22.226  0.8459  0.39886  
## KALIMANTAN BARAT       17.009     21.897  0.7768  0.43841  
## KALIMANTAN SELATAN     16.292     20.854  0.7812  0.43579  
## KALIMANTAN TENGAH      16.312     21.232  0.7683  0.44341  
## KALIMANTAN TIMUR       25.722     22.294  1.1538  0.25028  
## KALIMANTAN UTARA       21.671     22.018  0.9842  0.32646  
## KEP. BANGKA BELITUNG   18.657     21.683  0.8604  0.39082  
## KEPULAUAN RIAU         22.799     20.714  1.1006  0.27267  
## LAMPUNG                16.563     21.829  0.7588  0.44908  
## MALUKU                 11.845     19.709  0.6010  0.54866  
## MALUKU UTARA           12.996     20.406  0.6369  0.52510  
## NUSA TENGGARA BARAT    16.044     20.716  0.7745  0.43976  
## NUSA TENGGARA TIMUR    13.928     20.946  0.6649  0.50702  
## PAPUA                  17.731     21.124  0.8393  0.40250  
## PAPUA BARAT            19.225     20.657  0.9307  0.35338  
## RIAU                   21.192     21.615  0.9804  0.32831  
## SULAWESI BARAT         14.795     19.981  0.7405  0.46007  
## SULAWESI SELATAN       17.720     21.620  0.8196  0.41363  
## SULAWESI TENGAH        15.746     20.782  0.7577  0.44971  
## SULAWESI TENGGARA      15.486     21.680  0.7143  0.47608  
## SULAWESI UTARA         18.161     21.502  0.8446  0.39957  
## SUMATERA BARAT         15.664     20.873  0.7504  0.45406  
## SUMATERA SELATAN       16.988     21.504  0.7900  0.43065  
## SUMATERA UTARA         15.076     20.601  0.7318  0.46532  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Nilai diatas adalah nilai pengaruh konstan dari masing-masing individu yang pada model dapat dituliskan sebagai \(f_i\).

FEM TIME

Efek komponen sisaaan satu arah pada waktu.

fem_time <- plm(PDN_AREA ~ KMIS + RLS + TPT + PDRB + AHH + PKD, index = c("PROV", "TAHUN"), model = "within", effect= "time", data = crime)
summary(fem_time)
## Oneway (time) effect Within Model
## 
## Call:
## plm(formula = PDN_AREA ~ KMIS + RLS + TPT + PDRB + AHH + PKD, 
##     data = crime, effect = "time", model = "within", index = c("PROV", 
##         "TAHUN"))
## 
## Balanced Panel: n = 34, T = 6, N = 204
## 
## Residuals:
##       Min.    1st Qu.     Median    3rd Qu.       Max. 
## -5.0372730 -0.9663536  0.0034536  0.7862123 13.1063295 
## 
## Coefficients:
##         Estimate  Std. Error t-value  Pr(>|t|)    
## KMIS  2.2939e-01  3.7023e-02  6.1959 3.458e-09 ***
## RLS   1.0310e+00  2.4524e-01  4.2043 4.013e-05 ***
## TPT  -3.2468e-01  1.0437e-01 -3.1109  0.002149 ** 
## PDRB  2.6992e-05  4.7139e-06  5.7261 3.910e-08 ***
## AHH  -1.8149e-01  7.8086e-02 -2.3242  0.021161 *  
## PKD   1.2167e-03  1.1833e-04 10.2818 < 2.2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    2925.2
## Residual Sum of Squares: 928.18
## R-Squared:      0.68269
## Adj. R-Squared: 0.66451
## F-statistic: 68.8482 on 6 and 192 DF, p-value: < 2.22e-16

Interpretasi:

  • Setiap kenaikan satu satuan KMIS menyebabkan PDN_AREA meningkat sebesar 0.22939 dengan menganggap peubah lain konstan.

  • Setiap kenaikan satu satuan RLS menyebabkan PDN_AREA meningkat sebesar 1.031 dengan menganggap peubah lain konstan.

  • Setiap kenaikan satu satuan TPT menyebabkan PDN_AREA menurun sebesar 0.32648 dengan menganggap peubah lain konstan.

  • Setiap kenaikan satu satuan PDRB menyebabkan PDN_AREA meningkat sebesar 2.6992e-05 dengan menganggap peubah lain konstan.

  • Setiap kenaikan satu satuan AHH menyebabkan PDN_AREA menurun sebesar 0.18149 dengan menganggap peubah lain konstan.

  • Setiap kenaikan satu satuan PKD menyebabkan PDN_AREA meningkat sebesar 1.2167e-03 dengan menganggap peubah lain konstan.

Untuk semua p-value di bawah 5%, maka terdapat cukup bukti untuk menolak \(H_0\) (kurang dari 5% kemungkinan bahwa \(H_0\) benar).

  • p-value uji-F < 2.22e-16 << 5%. Artinya, dapat dikatakan bahwa model layak untuk digunakan.

  • p-value uji-T untuk seluruh koefisien peubah < 5%. Artinya, dapat dikatakan bahwa peubah tersebut berpengaruh signifikan terhadap model.

\(R^2\) merupakan nilai yang menunjukan kekuatan hubungan antara peubah bebas dan peubah respons. Semakin tinggi nilai \(R^2\), maka semakin baik model tersebut.

  • \(R^2\) pada model sebesar 0.68269 atau 68.269% yang mengindikasikan bahwa peubah yang digunakan kurang baik dalam menggambarkan model.
summary(fixef(fem_time, effect="time"))
##      Estimate Std. Error t-value Pr(>|t|)  
## 2015  -8.1078     5.5630 -1.4575  0.14662  
## 2016  -8.7157     5.5607 -1.5674  0.11867  
## 2017  -9.5108     5.5578 -1.7112  0.08865 .
## 2018 -10.1735     5.5643 -1.8284  0.06905 .
## 2019 -10.7981     5.5820 -1.9344  0.05453 .
## 2020 -10.5003     5.6058 -1.8731  0.06257 .
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Nilai diatas adalah nilai pengaruh konstan dari masing-masing waktu yang pada model dapat dituliskan sebagai \(\lambda_t\).

FEM TWO WAYS

Efek komponen sisaaan satu arah pada individu.

fem_twoways <- plm(PDN_AREA ~ KMIS + RLS + TPT + PDRB + AHH + PKD, index = c("PROV", "TAHUN"), model = "within", effect= "twoways", data = crime)
summary(fem_twoways)
## Twoways effects Within Model
## 
## Call:
## plm(formula = PDN_AREA ~ KMIS + RLS + TPT + PDRB + AHH + PKD, 
##     data = crime, effect = "twoways", model = "within", index = c("PROV", 
##         "TAHUN"))
## 
## Balanced Panel: n = 34, T = 6, N = 204
## 
## Residuals:
##        Min.     1st Qu.      Median     3rd Qu.        Max. 
## -3.34461974 -0.21115029  0.00011108  0.19612635  2.64700693 
## 
## Coefficients:
##         Estimate  Std. Error t-value  Pr(>|t|)    
## KMIS -2.3596e-03  1.1019e-01 -0.0214   0.98294    
## RLS   1.8633e+00  8.5443e-01  2.1807   0.03067 *  
## TPT  -1.2729e-01  1.0033e-01 -1.2688   0.20638    
## PDRB -8.0578e-05  8.8120e-06 -9.1441 2.736e-16 ***
## AHH  -5.3199e-01  4.6077e-01 -1.1546   0.25000    
## PKD  -9.2309e-04  4.2894e-04 -2.1520   0.03291 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    97.319
## Residual Sum of Squares: 54.356
## R-Squared:      0.44147
## Adj. R-Squared: 0.28691
## F-statistic: 20.9458 on 6 and 159 DF, p-value: < 2.22e-16

Interpretasi :

  • Setiap kenaikan satu satuan KMIS menyebabkan PDN_AREA menurun sebesar 2.3596e-03 dengan menganggap peubah lain konstan.

  • Setiap kenaikan satu satuan RLS menyebabkan PDN_AREA meningkat sebesar 1.8633 dengan menganggap peubah lain konstan.

  • Setiap kenaikan satu satuan TPT menyebabkan PDN_AREA menurun sebesar 0.12729 dengan menganggap peubah lain konstan.

  • Setiap kenaikan satu satuan PDRB menyebabkan PDN_AREA menurun sebesar 8.0578e-05 dengan menganggap peubah lain konstan.

  • Setiap kenaikan satu satuan AHH menyebabkan PDN_AREA menurun sebesar 0.53199 dengan menganggap peubah lain konstan.

  • Setiap kenaikan satu satuan PKD menyebabkan PDN_AREA menurun sebesar 9.2309e-04 dengan menganggap peubah lain konstan.

Untuk semua p-value di bawah 5%, maka terdapat cukup bukti untuk menolak \(H_0\) (kurang dari 5% kemungkinan bahwa \(H_0\) benar).

  • p-value uji-F < 2.22e-16 << 5%. Artinya, dapat dikatakan bahwa model layak untuk digunakan.

  • p-value uji-T untuk peubah RLS, PDRB, dan PKD < 5%. Artinya, dapat dikatakan bahwa peubah tersebut berpengaruh signifikan terhadap model.

\(R^2\) merupakan nilai yang menunjukan kekuatan hubungan antara peubah bebas dan peubah respons. Semakin tinggi nilai \(R^2\), maka semakin baik model tersebut.

  • \(R^2\) pada model sebesar 0.44147 atau 44.147% yang mengindikasikan bahwa peubah yang digunakan kurang baik dalam menggambarkan model.
data.frame(summary(fixef(fem_twoways, effect="twoways")))

Nilai diatas adalah nilai pengaruh konstan dari gabungan masing-masing individu dan waktu yang pada model dapat dituliskan sebagai \(f_i+\lambda_t\).

Perbandingan Kebaikan FEM Individu, Waktu, dan Twoways

Hipotesis pada uji ini yaitu :

  • Untuk menguji pengaruh individu

\[ \begin{aligned} H_{0} &: \text{Tidak ada pengaruh spesifik individu} \\ H_{1} &: \text{Ada pengaruh spesifik individu} \end{aligned} \]

  • Untuk menguji pengaruh waktu

\[ \begin{aligned} H_{0} &: \text{Tidak ada pengaruh spesifik waktu} \\ H_{1} &: \text{Ada pengaruh spesifik waktu} \end{aligned} \]

Statsitik Uji yang digunakan :

  • Pengaruh individu

\[ \begin{aligned} F_{Hitung} = \frac{JKG_{MG} - JKG_{MPTI}}{JKG_{MPTI}} . \frac{NT-N-K}{N-1} \end{aligned} \]

  • Pengaruh Waktu

\[ \begin{aligned} F_{Hitung} = \frac{JKG_{MG} - JKG_{MPTW}}{JKG_{MPTW}} . \frac{N-T-K}{T-1} \end{aligned} \]

Uji Signifikasi Pengaruh Individu / Waktu / Two ways

Uji pengaruh individu

plmtest(fem_twoways, type = "bp", effect = "individual")
## 
##  Lagrange Multiplier Test - (Breusch-Pagan)
## 
## data:  PDN_AREA ~ KMIS + RLS + TPT + PDRB + AHH + PKD
## chisq = 237.67, df = 1, p-value < 2.2e-16
## alternative hypothesis: significant effects

Uji pengaruh waktu

plmtest(fem_twoways, type = "bp", effect = "time")
## 
##  Lagrange Multiplier Test - time effects (Breusch-Pagan)
## 
## data:  PDN_AREA ~ KMIS + RLS + TPT + PDRB + AHH + PKD
## chisq = 40.608, df = 1, p-value = 1.861e-10
## alternative hypothesis: significant effects

Uji pengaruh twoways

plmtest(fem_twoways, type = "bp", effect = "twoways")
## 
##  Lagrange Multiplier Test - two-ways effects (Breusch-Pagan)
## 
## data:  PDN_AREA ~ KMIS + RLS + TPT + PDRB + AHH + PKD
## chisq = 278.28, df = 2, p-value < 2.2e-16
## alternative hypothesis: significant effects

Dari ketiga uji diatas didapat nilai p-value yang lebih kecil dari 0.05 yang berarti keputusannya adalah Tak Tolak \(H_0\) atau terdapat pengaruh yang signifikan baik dari individu, waktu, atau keduanya secara bersamaan. Sehingga, kita perlu melihat metrik lain dalam menentukan metode terpilih.

Nilai Kebaikan Model

# Sum Squared Error
dsse <- data.frame(Individu=sum(fem_ind$residuals^2),Time=sum(fem_time$residuals^2),Twoways=sum(fem_twoways$residuals^2))

# AIC
lsdv_ind <- lm(PDN_AREA ~ KMIS + RLS + TPT + PDRB + AHH + PKD + PROV, crime)
lsdv_time <- lm(PDN_AREA ~ KMIS + RLS + TPT + PDRB + AHH + PKD + TAHUN, crime)
lsdv_twoways <- lm(PDN_AREA ~ KMIS + RLS + TPT + PDRB + AHH + PKD + PROV + TAHUN, crime)

daic <- data.frame(Individu=AIC(lsdv_ind),Time=AIC(lsdv_time),Twoways=AIC(lsdv_twoways))

# MAPE
mape <- function(actual, forecast) {
  mean(abs((actual - forecast) / actual)) * 100
}
dmape <- data.frame(Individu=mape(crime$PDN_AREA,predict(fem_ind)),
                    Time=mape(crime$PDN_AREA,predict(fem_time)),
                    Twoways=mape(crime$PDN_AREA,predict(fem_twoways)))
# BIC
dbic <- data.frame(Individu=BIC(lsdv_ind),Time=BIC(lsdv_time),Twoways=BIC(lsdv_twoways))

# R-squared
ind <- summary(fem_ind)
time <- summary(fem_time)
tways <- summary(fem_twoways)
drsq <- data.frame(Individu=ind$r.squared,Time=time$r.squared,Twoways=tways$r.squared)

# Perbandingan
compare <- t(rbind(dsse,daic,dbic,dmape,drsq))
colnames(compare) <- c("SSE","AIC","BIC", "MAPE","R-Squared","Adj R-Squared")
compare
##                SSE      AIC      BIC     MAPE R-Squared Adj R-Squared
## Individu  57.40917 402.2721 538.3150 618.7911 0.4625523     0.3347446
## Time     928.18393 914.0093 957.1449 873.7714 0.6826914     0.6645123
## Twoways   54.35551 401.1218 553.7554 619.0807 0.4414685     0.2869063

Dari hasil di atas, dapat terlihat bahwa mesipun model pengaruh waktu merupakan model yang paling signifikan dengan nilai R-Squared yang besar jika dibandingkan dengan yang lain, tetapi error yang didapat oleh model waktu sangatlah tinggi. Oleh karena itu, akan dipilih model Twoways yang memiliki nilai error relatif lebih rendah daripada model Individu.

FEM vs CEM

Untuk membandingkan kebaikan model FEM atau CEM, uji Chow akan digunakan. Uji Chow adalah uji formal untuk menguji ada atau tidaknya pengaruh spesifik individu dan pengaruh spesifik waktu pada data panel.

\[ \begin{aligned} H_0 &: \text{Model Common Effect} \\ H_1 &: \text{Model Fixed Effect} \end{aligned} \]

\(H_0\) akan ditolak apabila p-value lebih kecil dari alpha yaitu 0.05

pooltest(cem, fem_twoways)
## 
##  F statistic
## 
## data:  PDN_AREA ~ KMIS + RLS + TPT + PDRB + AHH + PKD
## F = 80.216, df1 = 38, df2 = 159, p-value < 2.2e-16
## alternative hypothesis: unstability

Nilai p-value sebesar \(2.2e-16\) berarti keputusan Tolak H0 atau model fixed effect lebih layak digunakan pada data ini.

Random-Effect Model

Model pengaruh acak mengasumsikan tidak ada korelasi antara pengaruh spesifik individu dan pengaruh spesifik waktu dengan peubah bebas. Asumsi ini membuat komponen sisaan dari pengaruh spesifik individu dan pengaruh spesifik waktu dimasukan kedalam sisaan. Model sisaan satu arah yaitu:

\[ \begin{aligned} y_{it} &= \alpha + \beta_{1}x_{1,it}+ \beta_{2}x_{2,it}+...+\beta_{k}x_{k,it}+ f_{i} +\varepsilon_{it}\ \text{(pengaruh Individu)} \\ \end{aligned} \]

\[ \begin{aligned} y_{it} &= \alpha + \beta_{1}x_{1,it}+ \beta_{2}x_{2,it}+...+\beta_{k}x_{k,it}+ \lambda_{t} +\varepsilon_{it} \\ \end{aligned} \]

Model sisaan dua arah yaitu:

\[ \begin{aligned} y_{it} &= \alpha + \beta_{1}x_{1,it}+ \beta_{2}x_{2,it}+...+\beta_{k}x_{k,it}+ f_{i}+ \lambda_{t} +\varepsilon_{it} \\ \end{aligned} \] Dengan \(\alpha\) merupakan intersep model dan \(f_i\) dan \(\lambda_t\) merupakan pengaruh acak masing-masing individu dan waktu. Pendugaan parameter model pengaruh acak menggunakan Generalized Least Square (Baltagi 2008).

Generalized Least Square

Analisis data panel tidak sepenuhnya mengikuti prosedur regresi biasa yang tidak dapat menjelaskan keragaman data. Perlunya mempertimbangkan keragaman data tersebut untuk dapat mengetahui dalam penggalian lebih lanjut terhadap informasi yang dikandung data. Salah satu cara untuk melakukan hal tersebut yaitu dengan metode Generalized Least Square (GLS). GLS dipakai sebagai estimator analisis data panel dengan persamaan sistem karena informasi heterogenitas antara individu dan waktu digunakan sebagai informasi yang penting untuk menghasilkan parameter \(\hat{\beta}\) Persamaan dalam pendugaan parameter GLS adalah sebagai berikut.

\[ \begin{aligned} \hat {\beta} &= (X'(\sum)^{-1} X )^{-1} X'(\sum) ^{-1} y \\ \end{aligned} \]

Metode GLS memasukkan struktur matriks ragam peragam residual pada parameter \(\hat{\beta}\) (Ekananda 2016).

Pendugaan Parameter

Jika pada model FEM mengasumsikan bahwa nilai dari pengaruh spesifik individu bersifat fixed pada setiap unit, maka pada model random effect diasumsikan bahwa pengaruh tersebut bersifat acak. Dalam hal ini misalnya model one way individu pada data Grundfeld, maka ke-10 firm memiliki nilai rataan umum intersep yang sama, sedangkan perbedaan intersep antar masing-masing unit firm direfleksikan pada error termnya.

rem_gls <- plm(PDN_AREA ~ KMIS + RLS + TPT + PDRB + AHH + PKD, data = crime, 
                    index = c("PROV", "TAHUN"), 
                    effect = "twoways", model = "random", random.method = "nerlove")
summary(rem_gls)
## Twoways effects Random Effect Model 
##    (Nerlove's transformation)
## 
## Call:
## plm(formula = PDN_AREA ~ KMIS + RLS + TPT + PDRB + AHH + PKD, 
##     data = crime, effect = "twoways", model = "random", random.method = "nerlove", 
##     index = c("PROV", "TAHUN"))
## 
## Balanced Panel: n = 34, T = 6, N = 204
## 
## Effects:
##                   var std.dev share
## idiosyncratic  0.2664  0.5162 0.004
## individual    61.9916  7.8735 0.994
## time           0.1274  0.3569 0.002
## theta: 0.9732 (id) 0.7592 (time) 0.7591 (total)
## 
## Residuals:
##      Min.   1st Qu.    Median   3rd Qu.      Max. 
## -2.667620 -0.230679 -0.031907  0.137530  3.787819 
## 
## Coefficients:
##                Estimate  Std. Error z-value  Pr(>|z|)    
## (Intercept)  3.0779e+00  2.2719e+01  0.1355 0.8922353    
## KMIS        -1.7684e-02  9.9666e-02 -0.1774 0.8591664    
## RLS          2.0957e+00  6.0135e-01  3.4849 0.0004922 ***
## TPT         -1.2347e-01  9.3177e-02 -1.3251 0.1851276    
## PDRB        -7.3490e-05  7.8922e-06 -9.3118 < 2.2e-16 ***
## AHH         -1.4412e-01  3.5020e-01 -0.4115 0.6806785    
## PKD         -3.9659e-04  2.9043e-04 -1.3655 0.1720944    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Total Sum of Squares:    99.894
## Residual Sum of Squares: 60.882
## R-Squared:      0.39053
## Adj. R-Squared: 0.37196
## Chisq: 126.23 on 6 DF, p-value: < 2.22e-16

Interpretasi :

  • Setiap kenaikan satu satuan KMIS menyebabkan PDN_AREA menurun sebesar 0.017684 dengan menganggap peubah lain konstan.

  • Setiap kenaikan satu satuan RLS menyebabkan PDN_AREA meningkat sebesar 2.0957 dengan menganggap peubah lain konstan.

  • Setiap kenaikan satu satuan TPT menyebabkan PDN_AREA menurun sebesar 0.12347 dengan menganggap peubah lain konstan.

  • Setiap kenaikan satu satuan PDRB menyebabkan PDN_AREA menurun sebesar 7.3490e-05 dengan menganggap peubah lain konstan.

  • Setiap kenaikan satu satuan AHH menyebabkan PDN_AREA menurun sebesar 0.14412 dengan menganggap peubah lain konstan.

  • Setiap kenaikan satu satuan PKD menyebabkan PDN_AREA menurun sebesar 3.9659e-04 dengan menganggap peubah lain konstan.

Untuk semua p-value di bawah 5%, maka terdapat cukup bukti untuk menolak \(H_0\) (kurang dari 5% kemungkinan bahwa \(H_0\) benar).

  • p-value uji-F < 2.22e-16 << 5%. Artinya, dapat dikatakan bahwa model layak untuk digunakan.

  • p-value uji-T untuk peubah RLS dan PDRB < 5%. Artinya, dapat dikatakan bahwa peubah tersebut berpengaruh signifikan terhadap model.

\(R^2\) merupakan nilai yang menunjukan kekuatan hubungan antara peubah bebas dan peubah respons. Semakin tinggi nilai \(R^2\), maka semakin baik model tersebut.

  • \(R^2\) pada model sebesar 0.39053 atau 39.053% yang mengindikasikan bahwa peubah yang digunakan kurang baik dalam menggambarkan model.

Perbandingan Kebaikan REM

Uji Pengaruh Individu

#efek individu
plmtest(rem_gls,type = "bp", effect="individu")
## 
##  Lagrange Multiplier Test - (Breusch-Pagan)
## 
## data:  PDN_AREA ~ KMIS + RLS + TPT + PDRB + AHH + PKD
## chisq = 237.67, df = 1, p-value < 2.2e-16
## alternative hypothesis: significant effects

Karena nilai p-value < 0.05, maka tolak \(H_0\) atau pengaruh individu signifikan terhadap model.

Uji pengaruh waktu

#efek waktu 
plmtest(rem_gls,type = "bp", effect="time")
## 
##  Lagrange Multiplier Test - time effects (Breusch-Pagan)
## 
## data:  PDN_AREA ~ KMIS + RLS + TPT + PDRB + AHH + PKD
## chisq = 40.608, df = 1, p-value = 1.861e-10
## alternative hypothesis: significant effects

Karena nilai p-value < 0.05, maka tolak \(H_0\) atau pengaruh waktu signifikan terhadap model. Artinya, model twoways tepat digunakan untuk metode REM.

Uji pengaruh twoways

#efek waktu 
plmtest(rem_gls,type = "bp", effect="twoways")
## 
##  Lagrange Multiplier Test - two-ways effects (Breusch-Pagan)
## 
## data:  PDN_AREA ~ KMIS + RLS + TPT + PDRB + AHH + PKD
## chisq = 278.28, df = 2, p-value < 2.2e-16
## alternative hypothesis: significant effects
tidy_ranef <- tidy(ranef(rem_gls, effect="individual"))
colnames(tidy_ranef) <- c("Provinsi", "Pengaruh Acak Individu")
tidy_ranef

Output diatas merupakan pengaruh acak dari setiap unit individu, nilai tersebut tersebut menunjukkan seberapa besar perbedaan nilai komponen error acak masing-masing unit indvidu terhadap nilai intersep umum.

tidy_ranef <- tidy(ranef(rem_gls, effect="time"))
colnames(tidy_ranef) <- c("Tahun", "Pengaruh Acak Waktu")
tidy_ranef

Output diatas merupakan pengaruh acak dari setiap unit waktu, nilai tersebut tersebut menunjukkan seberapa besar perbedaan nilai komponen error acak masing-masing unit waktu terhadap nilai intersep umum.

FEM vs REM

Uji Haussman

Pada bagian sebelumnya, cukup bukti yang menyatakan bahwa model FEM lebih baik daripada model CEM. Oleh karena itu, tahap selanjutnya akan dibandingkan kebaikan model FEM jika dibanding model REM. Uji yang digunakan adalah uji Hausman dengan menggunakan fungsi phtest(FEM,REM).

Pengujian ini dilakukan untuk memilih model antara model pengaruh tetap atau model pengaruh acak yang sesuai untuk menggambarkan suatu data panel. Uji Hausman didasarkan pada perbedaan penduga model pengaruh tetap \(\hat{\beta}_{MPT}\) dengan penduga model pengaruh acak \(\hat{\beta}_{MPA}\). Kedua penduga konsisten dalam kondisi \(H_0\), tetapi \(\hat{\beta}_{MPA}\) akan bias dan tidak konsisten pada \(H_1\). Pengujian hipotesisnya adalah:

\(H_0\): Model pengaruh acak (REM) adalah model yang tepat

\(H_1\): Model pengaruh tetap (FEM) adalah model yang tepat

#fem dengan rem gls
phtest(fem_twoways, rem_gls)
## 
##  Hausman Test
## 
## data:  PDN_AREA ~ KMIS + RLS + TPT + PDRB + AHH + PKD
## chisq = 6.0755, df = 6, p-value = 0.4148
## alternative hypothesis: one model is inconsistent

Karena nilai p-value yang diperoleh lebih dari dari alpha 5%, maka Terima H0 yang mengindikasikan bahwa model yang sesuai adalah model REM.

UJi Diagnostik Sisaan

Normalitas

ks.test(rem_gls$residuals, "pnorm", 
        mean=mean(rem_gls$residuals), 
        sd=sd(rem_gls$residuals))
## 
##  Asymptotic one-sample Kolmogorov-Smirnov test
## 
## data:  rem_gls$residuals
## D = 0.18177, p-value = 2.797e-06
## alternative hypothesis: two-sided

Histogram

# Histogram 
ggplot(as.data.frame(rem_gls$residuals), aes(x = rem_gls$residuals)) +
  geom_histogram(aes(y = after_stat(density)), color = "white", fill = "steelblue") +
  geom_density(color = "red", linewidth = 1) +
  theme_minimal()
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

Uji Autokorelasi

pbgtest(rem_gls)
## 
##  Breusch-Godfrey/Wooldridge test for serial correlation in panel models
## 
## data:  PDN_AREA ~ KMIS + RLS + TPT + PDRB + AHH + PKD
## chisq = 62.514, df = 6, p-value = 1.387e-11
## alternative hypothesis: serial correlation in idiosyncratic errors

Uji Kehomogenan

bptest(rem_gls)
## 
##  studentized Breusch-Pagan test
## 
## data:  rem_gls
## BP = 55.643, df = 6, p-value = 3.437e-10

Kesimpulan uji diagnostik :

  • Sisaan tidak menyebar normal (Asumsi kenormalan tidak terpenuhi)
  • Sisaan memiliki autokorelasi (Asumsi kebebasan belum terpenuhi)
  • Sisaan tidak homogen (Asumsi kehomogenan belum terpenuhi)

Terlihat bahwa asumsi kehomogenan tidak terpenuhi. Oleh karena itu, diperlukan penanganan yaitu dengan menggunakan Analisis Geographically Weighted Panel Regression.

Geographically Weighted Panel Regression

Ide utama analisis Geographically Weighted Panel Regression (GWPR) sama halnya dengan analisis GWR cross-sectional. Analisis GWPR mengasumsikan runtutan waktu dari observasi pada sebuah lokasi geografis merupakan realisasi dari sebuah proses smooth spatiotemporal. Proses ini mengikuti sebuah distribusi observasi terdekat lebih berhubungan dari pada observasi yang jauh. Analisis GWPR bertujuan menggabungkan secara keseluruhan lokasi dan observasi (Yu 2010). Pendugaan parameter model GWPR menggunakan pendekatan Weighted Least Square (WLS) seperti pada model GWR.

Input Latitude Longitude

library(jsonlite)

wilayah <- fromJSON("https://raw.githubusercontent.com/yusufsyaifudin/wilayah-indonesia/master/data/list_of_area/provinces.json")
wilayah
data.sp.GWPR <- crime %>% 
  mutate(LAT=rep(wilayah$latitude,6), LONG=rep(wilayah$longitude,6)) %>% 
  select(PROV, TAHUN, LAT, LONG, everything())
data.sp.GWPR

Modeling GWPR

library(GWmodel)
coordinates(data.sp.GWPR)=3:4
class(data.sp.GWPR)
## [1] "SpatialPointsDataFrame"
## attr(,"package")
## [1] "sp"
head(data.sp.GWPR,34)
##             coordinates                 PROV TAHUN    PDN_AREA  KMIS   RLS  TPT
## 1    (4.36855, 97.0253)                 ACEH  2020  0.25709159 15.21  9.33 6.00
## 2   (2.19235, 99.38122)       SUMATERA UTARA  2020  0.31651974  8.95  9.54 5.81
## 3  (-1.34225, 100.0761)       SUMATERA BARAT  2020  0.35703328  6.42  8.99 6.07
## 4   (0.50041, 101.5476)                 RIAU  2020  0.14134087  6.93  9.14 5.62
## 5  (-1.61157, 102.7797)                JAMBI  2020  0.26768862  7.78  8.55 4.70
## 6  (-3.12668, 104.0931)     SUMATERA SELATAN  2020  0.16049361 12.82  8.24 4.71
## 7   (-3.51868, 102.536)             BENGKULU  2020  0.86348286 15.17  8.84 3.58
## 8   (-4.8555, 105.0273)              LAMPUNG  2020  0.26571318 12.55  8.05 4.47
## 9  (-2.75775, 107.5839) KEP. BANGKA BELITUNG  2020  0.80978759  4.71  8.06 4.30
## 10 (-0.15478, 104.5804)       KEPULAUAN RIAU  2020  1.54845569  6.03 10.12 8.16
## 11   (6.1745, 106.8227)          DKI JAKARTA  2020 15.81301486  4.61 11.13 8.05
## 12 (-6.88917, 107.6405)           JAWA BARAT  2020  0.08197240  8.16  8.55 9.09
## 13 (-7.30324, 110.0044)          JAWA TENGAH  2020  0.09451021 11.63  7.69 5.34
## 14   (7.7956, 110.3695)       D I YOGYAKARTA  2020  6.38335222 12.54  9.55 3.98
## 15   (-6.96851, 113.98)           JAWA TIMUR  2020  0.09204349 11.28  7.78 4.72
## 16 (-6.44538, 106.1376)               BANTEN  2020  0.65197684  6.28  8.89 9.32
## 17 (-8.23566, 115.1224)                 BALI  2020  1.03805151  4.12  8.95 3.44
## 18  (-8.12179, 117.637)  NUSA TENGGARA BARAT  2020  0.89918761 14.10  7.31 3.63
## 19 (-8.56568, 120.6979)  NUSA TENGGARA TIMUR  2020  0.18063102 21.06  7.63 3.46
## 20 (-0.13224, 111.0969)     KALIMANTAN BARAT  2020  0.05159293  7.21  7.37 5.14
## 21 (-1.49958, 113.2903)    KALIMANTAN TENGAH  2020  0.04037391  5.04  8.59 3.96
## 22 (-2.94348, 115.3756)   KALIMANTAN SELATAN  2020  0.50588178  4.61  8.29 4.21
## 23   (0.78844, 116.242)     KALIMANTAN TIMUR  2020  0.07747935  6.37  9.77 6.80
## 24   (2.72594, 116.911)     KALIMANTAN UTARA  2020  0.19346025  7.11  9.00 5.34
## 25  (0.65557, 124.0902)       SULAWESI UTARA  2020  1.81393230  7.70  9.49 6.36
## 26 (-1.69378, 120.8089)      SULAWESI TENGAH  2020  0.28945062 12.99  8.83 3.35
## 27 (-3.64467, 119.9472)     SULAWESI SELATAN  2020  0.31037633  8.86  8.38 6.01
## 28  (-3.54912, 121.728)    SULAWESI TENGGARA  2020  0.21277881 11.35  9.04 3.84
## 29  (0.71862, 122.4556)            GORONTALO  2020  1.90102753 15.41  7.82 3.79
## 30 (-2.49745, 119.3919)       SULAWESI BARAT  2020  0.74461583 11.19  7.89 2.86
## 31 (-3.11884, 129.4208)               MALUKU  2020  0.64586223 17.72  9.93 7.14
## 32   (0.63012, 127.972)         MALUKU UTARA  2020  0.21574298  6.88  9.04 4.62
## 33 (-1.38424, 132.9025)          PAPUA BARAT  2020  0.31858533 21.54  7.60 6.79
## 34 (-3.98857, 138.3485)                PAPUA  2020  0.06519639 26.72  6.69 3.85
##         PDRB    AHH   PKD
## 1   31633.38 69.975  9492
## 2   54979.04 69.150 10420
## 3   43825.66 69.520 10733
## 4  114166.90 71.650 10675
## 5   57957.73 71.170 10392
## 6   53842.74 69.930 10652
## 7   36552.50 69.370 10380
## 8   39290.33 70.695  9982
## 9   52023.40 70.680 12794
## 10 123464.79 69.990 14209
## 11 262615.17 72.950 18227
## 12  43236.51 73.150 10845
## 13  36964.78 74.405 10930
## 14  37693.64 75.025 14015
## 15  56640.82 71.345 11601
## 16  52729.40 70.005 11964
## 17  52015.45 72.155 13929
## 18  25183.56 66.510 10351
## 19  20056.99 67.055  7598
## 20  39622.24 70.735  8930
## 21  57145.08 69.750 11154
## 22  44100.79 68.690 12032
## 23 161798.85 74.375 11728
## 24 143533.29 72.535  8756
## 25  50521.13 71.745 10791
## 26  66306.27 68.745  9335
## 27  55675.03 70.620 11079
## 28  49718.15 71.340  9331
## 29  35693.26 68.115 10020
## 30  32836.75 65.110  9168
## 31  25094.36 66.025  8732
## 32  33069.32 68.375  8032
## 33  73932.60 66.050  8086
## 34  46416.36 65.835  6954

3.4.1. Menentukan Fungsi Pembobot Spasial Terbaik

Untuk melakukan pemodelan GWPR, tahap awal yang harus dilakukan adalah mengukur jarak euclidean antar provinsi. Data koordinat geografis, yaitu latitude dan longitude, digunakan untuk mengukur jarak euclidean. Data koordinat geografis yang digunakan dalam penelitian ini adalah centroid dari masing-masing provinsi dengan menggunakan software R. Setelah mendapatkan jarak euclidean, tahap selanjutnya adalah memilih fungsi pembobot spasial yang paling sesuai untuk mendapatkan matriks pembobot spasial yang akan digunakan dalam pemodelan GWPR.

# menggunakan 3 fungsi kernel: gaussian, eksponensial, bisquare )adaptive dan fixed)
#adaptive bisquare
bwd.GWPR.bisquare.ad <- bw.gwr(PDN_AREA ~ KMIS + RLS + TPT + PDRB + AHH + PKD, data = data.sp.GWPR, approach = "CV", kernel = "bisquare", adaptive=T)
## Adaptive bandwidth: 133 CV score: 693.3964 
## Adaptive bandwidth: 90 CV score: 556.5396 
## Adaptive bandwidth: 62 CV score: 430.2603 
## Adaptive bandwidth: 46 CV score: 369.3776 
## Adaptive bandwidth: 35 CV score: 324.3215 
## Adaptive bandwidth: 29 CV score: 187.1796 
## Adaptive bandwidth: 24 CV score: 88.422 
## Adaptive bandwidth: 22 CV score: 88.422
hasil.GWPR.bisquare.ad <- gwr.basic(PDN_AREA ~ KMIS + RLS + TPT + PDRB + AHH + PKD, data = data.sp.GWPR, bw = bwd.GWPR.bisquare.ad, kernel = "bisquare", adaptive=T)

#adaptive gaussian
bwd.GWPR.gaussian.ad <- bw.gwr(PDN_AREA ~ KMIS + RLS + TPT + PDRB + AHH + PKD, data = data.sp.GWPR, approach = "CV", kernel = "gaussian", adaptive=T)
## Adaptive bandwidth: 133 CV score: 1073.73 
## Adaptive bandwidth: 90 CV score: 932.2855 
## Adaptive bandwidth: 62 CV score: 861.8887 
## Adaptive bandwidth: 46 CV score: 740.2562 
## Adaptive bandwidth: 35 CV score: 641.6354 
## Adaptive bandwidth: 29 CV score: 572.2988 
## Adaptive bandwidth: 24 CV score: 514.914 
## Adaptive bandwidth: 22 CV score: 514.914
hasil.GWPR.gaussian.ad <- gwr.basic(PDN_AREA ~ KMIS + RLS + TPT + PDRB + AHH + PKD,
                                    data = data.sp.GWPR, bw = bwd.GWPR.gaussian.ad, kernel = "gaussian", adaptive=T)

#adaptive exponential
bwd.GWPR.exponential.ad <- bw.gwr(PDN_AREA ~ KMIS + RLS + TPT + PDRB + AHH + PKD,
                               data = data.sp.GWPR, approach = "CV", kernel = "exponential", adaptive=T)
## Adaptive bandwidth: 133 CV score: 895.3918 
## Adaptive bandwidth: 90 CV score: 783.4486 
## Adaptive bandwidth: 62 CV score: 730.2009 
## Adaptive bandwidth: 46 CV score: 655.3079 
## Adaptive bandwidth: 35 CV score: 600.9486 
## Adaptive bandwidth: 29 CV score: 558.1274 
## Adaptive bandwidth: 24 CV score: 518.1572 
## Adaptive bandwidth: 22 CV score: 518.1572
hasil.GWPR.exponential.ad <- gwr.basic(PDN_AREA ~ KMIS + RLS + TPT + PDRB + AHH + PKD,
                                    data = data.sp.GWPR, bw = bwd.GWPR.exponential.ad, kernel = "exponential", adaptive=T)

#fixed bisquare
bwd.GWPR.bisquare.fix <- bw.gwr(PDN_AREA ~ KMIS + RLS + TPT + PDRB + AHH + PKD,
                               data = data.sp.GWPR, approach = "CV", kernel = "bisquare", adaptive=F)
## Fixed bandwidth: 26.05943 CV score: 973.6662 
## Fixed bandwidth: 16.10883 CV score: 809.8809 
## Fixed bandwidth: 9.959026 CV score: 521.4118 
## Fixed bandwidth: 6.158237 CV score: 119.7549 
## Fixed bandwidth: 3.809221 CV score: 169846.3 
## Fixed bandwidth: 7.610009 CV score: 117.1879 
## Fixed bandwidth: 8.507254 CV score: 353.8743 
## Fixed bandwidth: 7.055482 CV score: 117.4174 
## Fixed bandwidth: 7.952726 CV score: 308.7523 
## Fixed bandwidth: 7.398199 CV score: 113.4041 
## Fixed bandwidth: 7.267292 CV score: 113.4004 
## Fixed bandwidth: 7.186388 CV score: 114.3983 
## Fixed bandwidth: 7.317294 CV score: 113.1673 
## Fixed bandwidth: 7.348197 CV score: 113.1696 
## Fixed bandwidth: 7.298195 CV score: 113.2215 
## Fixed bandwidth: 7.329098 CV score: 113.1551 
## Fixed bandwidth: 7.336393 CV score: 113.1556 
## Fixed bandwidth: 7.324589 CV score: 113.1578 
## Fixed bandwidth: 7.331884 CV score: 113.1545 
## Fixed bandwidth: 7.333607 CV score: 113.1547 
## Fixed bandwidth: 7.33082 CV score: 113.1546
hasil.GWPR.bisquare.fix <- gwr.basic(PDN_AREA ~ KMIS + RLS + TPT + PDRB + AHH + PKD,
                                    data = data.sp.GWPR, bw = bwd.GWPR.bisquare.fix, kernel = "bisquare", adaptive=F)

#fixed gaussian
bwd.GWPR.gaussian.fix <- bw.gwr(PDN_AREA ~ KMIS + RLS + TPT + PDRB + AHH + PKD,
                               data = data.sp.GWPR, approach = "CV", kernel = "gaussian", adaptive=F)
## Fixed bandwidth: 26.05943 CV score: 1170.719 
## Fixed bandwidth: 16.10883 CV score: 1079.048 
## Fixed bandwidth: 9.959026 CV score: 917.7705 
## Fixed bandwidth: 6.158237 CV score: 734.8031 
## Fixed bandwidth: 3.809221 CV score: 569.5653 
## Fixed bandwidth: 2.357449 CV score: 203.5027 
## Fixed bandwidth: 1.460204 CV score: 460.5427 
## Fixed bandwidth: 2.911976 CV score: 391.4167 
## Fixed bandwidth: 2.014732 CV score: 102.411 
## Fixed bandwidth: 1.802921 CV score: 70.63039 
## Fixed bandwidth: 1.672015 CV score: 186.1903 
## Fixed bandwidth: 1.883825 CV score: 63.42011 
## Fixed bandwidth: 1.933827 CV score: 74.38713 
## Fixed bandwidth: 1.852923 CV score: 61.60032 
## Fixed bandwidth: 1.833824 CV score: 63.08311 
## Fixed bandwidth: 1.864726 CV score: 61.73331 
## Fixed bandwidth: 1.845628 CV score: 61.90642 
## Fixed bandwidth: 1.857431 CV score: 61.56244 
## Fixed bandwidth: 1.860218 CV score: 61.59454 
## Fixed bandwidth: 1.855709 CV score: 61.56364 
## Fixed bandwidth: 1.858496 CV score: 61.56978 
## Fixed bandwidth: 1.856774 CV score: 61.56099 
## Fixed bandwidth: 1.856367 CV score: 61.56127 
## Fixed bandwidth: 1.857025 CV score: 61.56126 
## Fixed bandwidth: 1.856618 CV score: 61.56099
hasil.GWPR.gaussian.fix <- gwr.basic(PDN_AREA ~ KMIS + RLS + TPT + PDRB + AHH + PKD,
                                    data = data.sp.GWPR, bw = bwd.GWPR.gaussian.fix, kernel = "gaussian", adaptive=F)

#fixed exponential
bwd.GWPR.exponential.fix <- bw.gwr(PDN_AREA ~ KMIS + RLS + TPT + PDRB + AHH + PKD,
                                  data = data.sp.GWPR, approach = "CV", kernel = "exponential", adaptive=F)
## Fixed bandwidth: 26.05943 CV score: 1013.952 
## Fixed bandwidth: 16.10883 CV score: 909.6848 
## Fixed bandwidth: 9.959026 CV score: 783.5012 
## Fixed bandwidth: 6.158237 CV score: 649.328 
## Fixed bandwidth: 3.809221 CV score: 523.2297 
## Fixed bandwidth: 2.357449 CV score: 404.5852 
## Fixed bandwidth: 1.460204 CV score: 165.9064 
## Fixed bandwidth: 0.9056765 CV score: 84.65157 
## Fixed bandwidth: 0.5629596 CV score: 529.4583 
## Fixed bandwidth: 1.117487 CV score: 74.65 
## Fixed bandwidth: 1.248393 CV score: 103.3616 
## Fixed bandwidth: 1.036583 CV score: 64.81533 
## Fixed bandwidth: 0.9865809 CV score: 65.47438 
## Fixed bandwidth: 1.067485 CV score: 67.36285 
## Fixed bandwidth: 1.017484 CV score: 64.269 
## Fixed bandwidth: 1.00568 CV score: 64.40019 
## Fixed bandwidth: 1.024779 CV score: 64.37273 
## Fixed bandwidth: 1.012975 CV score: 64.27412 
## Fixed bandwidth: 1.02027 CV score: 64.2926 
## Fixed bandwidth: 1.015762 CV score: 64.26456 
## Fixed bandwidth: 1.014697 CV score: 64.26575 
## Fixed bandwidth: 1.016419 CV score: 64.26533 
## Fixed bandwidth: 1.015355 CV score: 64.26466
hasil.GWPR.exponential.fix <- gwr.basic(PDN_AREA ~ KMIS + RLS + TPT + PDRB + AHH + PKD,
                                       data = data.sp.GWPR, bw = bwd.GWPR.exponential.fix, kernel = "exponential", adaptive=F)

AIC <- c(hasil.GWPR.bisquare.ad$GW.diagnostic$AIC,
           hasil.GWPR.gaussian.ad$GW.diagnostic$AIC,
           hasil.GWPR.exponential.ad$GW.diagnostic$AIC,
           hasil.GWPR.bisquare.fix$GW.diagnostic$AIC,
           hasil.GWPR.gaussian.fix$GW.diagnostic$AIC,
           hasil.GWPR.exponential.fix$GW.diagnostic$AIC)
R2 <- c(hasil.GWPR.bisquare.ad$GW.diagnostic$gw.R2,
        hasil.GWPR.gaussian.ad$GW.diagnostic$gw.R2,
        hasil.GWPR.exponential.ad$GW.diagnostic$gw.R2,
        hasil.GWPR.bisquare.fix$GW.diagnostic$gw.R2,
        hasil.GWPR.gaussian.fix$GW.diagnostic$gw.R2,
        hasil.GWPR.exponential.fix$GW.diagnostic$gw.R2)
AICc <- c(hasil.GWPR.bisquare.ad$GW.diagnostic$AICc,
           hasil.GWPR.gaussian.ad$GW.diagnostic$AICc,
           hasil.GWPR.exponential.ad$GW.diagnostic$AICc,
           hasil.GWPR.bisquare.fix$GW.diagnostic$AICc,
           hasil.GWPR.gaussian.fix$GW.diagnostic$AICc,
           hasil.GWPR.exponential.fix$GW.diagnostic$AICc)
R2adj <- c(hasil.GWPR.bisquare.ad$GW.diagnostic$gwR2.adj,
           hasil.GWPR.gaussian.ad$GW.diagnostic$gwR2.adj,
           hasil.GWPR.exponential.ad$GW.diagnostic$gwR2.adj,
           hasil.GWPR.bisquare.fix$GW.diagnostic$gwR2.adj,
           hasil.GWPR.gaussian.fix$GW.diagnostic$gwR2.adj,
           hasil.GWPR.exponential.fix$GW.diagnostic$gwR2.adj)
RSS <- c(hasil.GWPR.bisquare.ad$GW.diagnostic$RSS.gw,
           hasil.GWPR.gaussian.ad$GW.diagnostic$RSS.gw,
           hasil.GWPR.exponential.ad$GW.diagnostic$RSS.gw,
           hasil.GWPR.bisquare.fix$GW.diagnostic$RSS.gw,
           hasil.GWPR.gaussian.fix$GW.diagnostic$RSS.gw,
           hasil.GWPR.exponential.fix$GW.diagnostic$RSS.gw)

Perbandingan

tabel <- cbind(RSS,R2,R2adj,AIC,AICc)
rownames(tabel) <- c("Adaptive Bisquare", "Adaptive Gaussian",
                     "Adaptive Exponential", "Fixed Bisquare",
                     "Fixed Gaussian", "Fixed Exponential")
data.frame(tabel)
bwd.GWPR.exponential.fix
## [1] 1.015762

Output di atas menunjukkan bahwa fungsi pembobot Fixed kernel Exponential memiliki nilai error dan AIC paling rendah dengan nilai R2 dan R2 adj paling tinggi, sehingga fungsi pembobot yang terpilih adalah Fixed Kernel Exponential. Fungsi pembobot Fixed Exponential memiliki nilai CV paling minimum yaitu 64,2646 dengan nilai banwidth yaitu 1,01535.

Dengan demikian, matriks pembobot spasial dapat ditentukan dengan menggunakan fungsi pembobot Fixed Exponential. Matriks pembobot spasial ini akan digunakan untuk melakukan pemodelan GWPR untuk menduga nilai parameter model. Nilai dugaan parameter dalam pemodelan GWPR akan berbeda untuk tiap provinsi tetapi sama (konstan) untuk tiap tahun.

Pendugaan Parameter

#Penduga parameter
parameter.GWPR <- as.data.frame(hasil.GWPR.exponential.fix$SDF[1:34,1:7])[-c(8,9)]
parameter.GWPR %>% 
  mutate(PROV=crime$PROV[1:34]) %>% 
  select(PROV, everything())

Model GWPR dengan Jumlah Pidana per Jumlah Penduduk per Luas Wilayah Tertinggi

parameter_R2 <- as.data.frame(hasil.GWPR.exponential.fix$SDF[1:34,c(1:7,27)])[-9:-10]
parameter_R2 %>% 
  mutate(PROV=crime$PROV[1:34]) %>%
  filter(PROV %in% c("DKI JAKARTA", "D I YOGYAKARTA", "SULAWESI UTARA")) %>% 
  select(PROV, everything())

R2 setiap provinsi

parameter_R2 %>% 
  mutate(PROV=crime$PROV[1:34]) %>%
  select(PROV, Local_R2) %>% 
  arrange(-Local_R2)

Signifikasi parameter (p-value)

p_value <- gwr.t.adjust(hasil.GWPR.bisquare.ad)$results$p
p_value <- as.data.frame(ifelse(p_value<=0.05, "Signifikan", "Tidak"))[1:34,]
p_value %>% 
  mutate(PROV=crime$PROV[1:34]) %>% 
  select(PROV, everything())

Filter Provinsi yang mempunyai signifikansi pada peubah Kemiskinan

p_value %>% 
  mutate(PROV=crime$PROV[1:34]) %>% 
  select(PROV, everything()) %>% 
  filter("Signifikan" == p_value$KMIS_p)

Filter Provinsi yang mempunyai signifikansi peubah Rata-rata Lama Sekolah

p_value %>% 
  mutate(PROV=crime$PROV[1:34]) %>% 
  select(PROV, everything()) %>% 
  filter("Signifikan" == p_value$RLS_p)

Filter Provinsi yang mempunyai signifikansi peubah Tingkat Pengangguran Terbuka

p_value %>% 
  mutate(PROV=crime$PROV[1:34]) %>% 
  select(PROV, everything()) %>% 
  filter("Signifikan" == p_value$TPT_p)

Peubah TPT tidak signifikan terhadap Jumlah Pidana per Penduduk per Luas Wilayah

Filter Provinsi yang mempunyai signifikansi peubah PDRB

p_value %>% 
  mutate(PROV=crime$PROV[1:34]) %>% 
  select(PROV, everything()) %>% 
  filter("Signifikan" == p_value$PDRB_p)

Filter Provinsi yang mempunyai signifikansi Angka Harapan Hidup

p_value %>% 
  mutate(PROV=crime$PROV[1:34]) %>% 
  select(PROV, everything()) %>% 
  filter("Signifikan" == p_value$AHH_p)

Filter Provinsi yang mempunyai signifikansi Pengeluaran Per Kapita

p_value %>% 
  mutate(PROV=crime$PROV[1:34]) %>% 
  select(PROV, everything()) %>% 
  filter("Signifikan" == p_value$PKD_p)

Uji Kesesuaian Model

Uji kesesuaian model dilakukan untuk mengetahui apakah terdapat perbedaan yang signifikan antara model regresi global dan model GWPR, dengan hipotesisnya sebagai berikut:

\(H_0:β_k (u_i,v_i)=β_k\) (Tidak ada perbedaan antara model regresi panel dengan GWPR)

\(H_1:β_k (u_i,v_i )≠β_k\) (Ada perbedaan antara model regresi panel dengan GWPR)

# Uji Kesesuaian Model
# Uji F
rss_rem <- sum(rem_gls$residuals^2)
rss_gwpr <- hasil.GWPR.exponential.fix$GW.diagnostic$RSS.gw
df_rem <- rem_gls$df.residual
df_gwpr <- hasil.GWPR.exponential.fix$GW.diagnostic$edf
Fhit=(rss_gwpr/df_gwpr)/(rss_rem/df_rem)
Fhit
## [1] 0.2912719
pf(Fhit,df_gwpr,df_rem)
## [1] 2.512821e-11

Berdasarkan hasil uji, didapatkan nilai F-hitung sebesar 0.29 << F-tabel (1.318) dengan p-value sebesar 2.51e-11. Oleh karena itu, H0 ditolak sehingga dapat disimpulkan bahwa cukup bukti untuk menyatakan ada perbedaan antara model regresi panel dengan GWPR.

comparison <- data.frame(R2=c(hasil.GWPR.bisquare.fix$GW.diagnostic$gw.R2,summary(rem_gls)$r.squared[1]),
                         R2adj=c(hasil.GWPR.bisquare.fix$GW.diagnostic$gwR2.adj,summary(rem_gls)$r.squared[2]),
                         RSS=c(hasil.GWPR.bisquare.fix$GW.diagnostic$RSS.gw,sum(summary(rem_gls)$residuals^2)))
rownames(comparison) <- c("GWPR", "REM Two Ways")
comparison

Dari hasil di atas, model GWPR memiliki nilai R^2 dan R^2 adj terbesar dan RSS terkecil artinya model GWPR memiliki goodness of fit yang lebih baik daripada model REM sehingga model GWPR terpilih menjadi model terbaik. Selanjutnya, akan dilihat model GWPR beserta signifikansi peubah di 3 Provinsi dengan Jumlah Pidana per Jumlah Penduduk per Luas Wilayah Tertinggi.

Kesimpulan dan Saran

Dari hasil analisis yang telah dilakukan, dapat disimpulkan bahwa peubah-peubah yang berpengaruh terhadap Jumlah Pidana per penduduk per luas wilayah adalah Tingkat Kemiskinan, Rata-rata lama sekolah, PDRB per Kapita, Angka Harapan Hidup, Pengeluaran per Kapita Disesuaikan. Nilai R2 terendah adalah sebesar 0.88 pada Provinsi Kepulauan Riau yang menunjukan bahwa model telah cukup baik dalam memprediksi Jumlah pidana per penduduk per luas wilayah. Hampir semua model provinsi tidak memiliki peubah yang signifikan terhadap respons menunjukan bahwa model buruk dalam interpretasi pendugaan parameter setiap peubah.

Pada analisis disebutkan bahwa faktor yang berpengaruh adalah faktor individu dan faktor waktu. Oleh karena itu, disarankan untuk penelitian selanjutnya menggunakan metode yang digunakan adalah Geographically and Temporally Weighted Regression dengan mempertimbangkan pengaruh waktu. Pengaruh peubah-peubah yang digunakan berpengaruh secara signifikan umumnya pada Provinsi DKI Jakarta dan DI Yogyakarta. Oleh karena itu, disarankan kepada pemerintah untuk mengupayakan langkah-langkah efektif dalam menangani tingkat kriminalitas di kedua provinsi tersebut. Cara yang dapat dilakukan adalah dengan mengentas Kemiskinan, meningkatkan mutu pendidikan, meningkatkan Pendapatan dan Pengeluaran per Kapita, hingga memperbaiki kualitas hidup masyarakat.

LS0tDQp0aXRsZTogIlBlbW9kZWxhbiBUaW5na2F0IEtyaW1pbmFsaXRhcyBkaSBJbmRvbmVzaWEgVGVyYm9ib3RpIEp1bWxhaCBQZW5kdWR1ayBkYW4gTHVhcyBXSWxheWFoIG1lbmdndW5ha2FuIEdlb2dyYWhpY2FsbHkgV2VpZ2h0ZWQgUGFuZWwgUmVncmVzc2lvbiAoR1dQUikiDQphdXRob3I6ICJBbGZpZGhpYSINCmRhdGU6ICIyMDIzLTA2LTE2Ig0Kb3V0cHV0OiANCiAgcm1kZm9ybWF0czo6ZG93bmN1dGU6DQogICAgZG93bmN1dGVfdGhlbWU6ICJjaGFvcyINCiAgICBzZWxmX2NvbnRhaW5lZDogdHJ1ZQ0KICAgIGNvZGVfZG93bmxvYWQ6IHRydWUNCiAgICB0b2NfZmxvYXQ6IHRydWUNCiAgICB0b2NfZGVwdGg6IDMNCiAgICBkZl9wcmludDogcGFnZWQNCiAgICBjb2RlX2ZvbGRpbmc6IHNob3cNCiAgICB0aGVtZTogY2VydWxlYW4NCiAgICBoaWdobGlnaHQ6ICJrYXRlIg0KLS0tDQoNCjxwIHN0eWxlPSJ0ZXh0LWFsaWduOiBjZW50ZXI7Ij4NCg0KKipBbmdnb3RhIEtlbG9tcG9rIDEqKg0KDQo8L3A+DQoNCi0gICBHMTQwMTIwMTAwNCBBbGZpZGhpYSBSYWhtYW4gTmFzYSBKdWhhbmRhDQotICAgRzE0MDEyMDEwNTAgSGFudW5nIFNhZnJpemFsDQotICAgRzE0MDEyMDEwNjQgTXVoYW1tYWQgSXJzeWFkIFJvYmJhbmkNCi0gICBHMTQwMTIwMTA4MSBaYWtpeWFoIEF6emFocmENCi0gICBHMTQwMTIwMTA5MiBNdWhhbW1hZCBaaGlsbGFuIFpha2l5eWFuDQoNCmBgYHtyIHdhcm5pbmc9RiwgbWVzc2FnZT1GfQ0KbGFwcGx5KGMoImthYmxlRXh0cmEiLCJ0aWR5dmVyc2UiLCJwbG0iLCJ0aW55dGV4IiwidHNlcmllcyIsImxtdGVzdCIsICJicm9vbSIsICJzdGFyZ2F6ZXIiLCAiUkNvbG9yQnJld2VyIiwgImdvb2dsZXNoZWV0czQiLCAiY29ycnBsb3QiLCAiY2FyIiksIGxpYnJhcnksIGNoYXJhY3Rlci5vbmx5ID0gVClbWzFdXQ0KYGBgDQoNCiMgRGF0YQ0KDQpEYXRhIHlhbmcgZGlndW5ha2FuIGFkYWxhaCBkYXRhIEp1bWxhaCBUaW5kYWsgUGlkYW5hIHBlciAxMDAgcmlidSBwZW5kdWR1ayBkZW5nYW4gNyBQZXViYWggYmViYXMuIERhdGEgaW5pIGJlcmplbmlzIGRhdGEgcGFuZWwgZGVuZ2FuIGluZGl2aWR1bnlhIGFkYWxhaCAzNCBQcm92aW5zaSBkaSBJbmRvbmVzaWEgc2VsYW1hIDYgdGFodW4gKFRhaHVuIDIwMTUtMjAyMCkgZGVuZ2FuIHBldWJhaC1wZXViYWggc2ViYWdhaSBiZXJpa3V0Og0KDQotICAgUEROIDogSnVtbGFoIHRpbmRhayBwaWRhbmEgcGVyIDEwMC4wMDAgUGVuZHVkdWsgKFBldWJhaCBSZXNwb25zKQ0KDQotICAgS01JUyA6IFRpbmdrYXQgY3JpbWVraW5hbiAoJSkNCg0KLSAgIFJMUyA6IFJhdGEtcmF0YSBMYW1hIFNla29sYWggKFRhaHVuKQ0KDQotICAgSVBNIDogSW5kZWtzIFBlbWJhbmd1bmFuIE1hbnVzaWEgKFBvaW4pDQoNCi0gICBUUFQgOiBUaW5na2F0IFBlbmdhbmdndXJhbiBUZXJidWthICglKQ0KDQotICAgUERSQiA6IFByb2R1ayBEb21lc3RpayBSZWdpb25hbCBCcnV0byBQZXIgS2FwaXRhIChSaWJ1IFJ1cGlhaCkNCg0KLSAgIEFISCA6IEFuZ2thIEhhcmFwYW4gSGlkdXAgKFRhaHVuKQ0KDQotICAgUEtEIDogUGVuZ2VsdWFyYW4gcGVyIEthcGl0YSBEaXNlc3VhaWthbiAoUmlidSBSdXBpYWgvT3JhbmcvVGFodW4pDQoNClNlbGFpbiBpdHUsIGRpZ3VuYWthbiBwdWxhIHBldWJhaCBKdW1sYWggUGVuZHVkdWsgZGFuIEx1YXMgV2lsYXlhaCB1bnR1ayBtYW5pcHVsYXNpIGRhdGEuIFVudHVrIGxlYmloIGplbGFzbnlhLCBkYXBhdCBkaWxpaGF0IGRhcmkgb3V0cHV0IGJlcmlrdXQ6DQoNCmBgYHtyfQ0KZ3M0X2RlYXV0aCgpDQpjcmltZSA8LSByZWFkX3NoZWV0KCJodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9zcHJlYWRzaGVldHMvZC8xbkpVWlRXN2w1MlhCNzctelFwdXJEalZ3MHRZeVRXQ0YxNDFDQ1JaMjd5Zy9lZGl0I2dpZD0xNTEzNzA4NjUzIikNCmNvbG5hbWVzKGNyaW1lKSA8LSBjKCJQUk9WIiwgIlRBSFVOIiwgIlBFTkRVRFVLIiwgIkxVQVMiLCAiUEROIiwgIktNSVMiLCAiUkxTIiwgIklQTSIsICJUUFQiLCAiUERSQiIsICJBSEgiLCAiUEtEIikNCmNyaW1lJFBST1YgPC0gYXMuZmFjdG9yKGNyaW1lJFBST1YpDQpjcmltZSRUQUhVTiA8LSBhcy5mYWN0b3IoY3JpbWUkVEFIVU4pDQpzdHIoY3JpbWUpDQpgYGANCg0KRGFwYXQgdGVybGloYXQgYmFod2EgdGVyZGFwYXQgMjA0IHRvdGFsIG9ic2VydmFzaSwgeWFpdHUgMzQgaW5kaXZpZHUgZGVuZ2FuIHBlcmlvZGUgNiB0YWh1bi4gU2VtdWEgcGV1YmFoIGJlcmplbmlzIG51bWVyaWsga29udGludS4NCg0KIyBQcmUtcHJvY2Vzc2luZyBEYXRhDQoNCiMjIFBlbmFuZ2FuYW4gKk1pc3NpbmcgVmFsdWUqDQoNCmBgYHtyfQ0KY29sU3Vtcyhpcy5uYShjcmltZSkpDQpgYGANCg0KRGFyaSBvdXRwdXQgZGkgYXRhcywgZGFwYXQgdGVybGloYXQgYmFod2EgdGVyZGFwYXQgNSBtaXNzaW5nIHZhbHVlIGRpIHBldWJhaCByZXNwb25zLCB5YWl0dSBQRE4uIGtpdGEgYWthbiBtZW5nZ3VuYWthbiBpbXB1dGFzaSBHcm91cCBNZWFuIEltcHV0YXRpb24gdW50dWsgbWVuZ2F0YXNpIG1hc2FsYWggaW5pIGRlbmdhbiBtZW5qYWRpa2FuIHNldGlhcCBwcm92aW5zaSBhZGFsYWggZ3J1cC4gU2VoaW5nZ2EsIGtpdGEgcGVybHUgdGFodSBwcm92aW5zaSBhcGEgc2FqYSB5YW5nIG1lbWlsaWtpIG1pc3NpbmcgdmFsdWUuDQoNCmBgYHtyfQ0KY3JpbWUgJT4lDQogIHNlbGVjdChQUk9WLCBUQUhVTiwgUEROKSAlPiUgDQogIGZpbHRlcihpcy5uYShQRE4pKQ0KDQpudW0gPC0gY3JpbWUgJT4lIG11dGF0ZShubyA9IHJvd19udW1iZXIoKSkgJT4lIGZpbHRlcihpcy5uYShQRE4pKSAlPiUgcHVsbChubykNCmBgYA0KDQpEYXBhdCB0ZXJsaWhhdCBiYWh3YSBwcm92aW5zaSBLYWxpbWFudGFuIFV0YXJhIGRhbiBTdWxhd2VzaSBCYXJhdCBtZXJ1cGFrYW4gcHJvdmluc2kgeWFuZyBtZW1pbGlraSBuaWxhaSBtaXNzaW5nIHZhbHVlLCBzZWhpbmdnYSBraXRhIHBlcmx1IG1lbmdoaXR1bmcgcmF0YWFuIG5pbGFpIFBETiBkYXJpIGtlZHVhIHByb3ZpbnNpIHRlcnNlYnV0Lg0KDQpgYGB7cn0NCmNyaW1lICU+JSANCiAgbmEub21pdCgpICU+JSANCiAgc2VsZWN0KFBST1YsIFBETikgJT4lIA0KICBncm91cF9ieShQUk9WKSAlPiUgDQogIHN1bW1hcmlzZSgiUmF0YS1yYXRhIj1tZWFuKFBETikpICU+JSANCiAgZmlsdGVyKFBST1YgJWluJSBjKCJLQUxJTUFOVEFOIFVUQVJBIiwgIlNVTEFXRVNJIEJBUkFUIikpDQpgYGANCg0KS2VtdWRpYW4sIGlucHV0IHJhdGEtcmF0YSB5YW5nIGRpZGFwYXRrYW4gZGkgYXRhcyB0ZXJoYWRhcCBuaWxhaSB5YW5nIGhpbGFuZyBzZWJlbHVtbnlhLg0KDQpgYGB7cn0NCmNyaW1lIDwtIGNyaW1lICU+JQ0KICAgICAgICAgICAgbXV0YXRlKFBETiA9IGlmZWxzZShpcy5uYShQRE4pLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKFBST1YgPT0gIktBTElNQU5UQU4gVVRBUkEiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExMCwgaWZlbHNlKFBST1YgPT0gIlNVTEFXRVNJIEJBUkFUIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE0MC43NSxQRE4pKSwgUEROKSkNCmBgYA0KDQpTZWhpbmdnYSBkaWRhcGF0Og0KDQpgYGB7cn0NCmNyaW1lICU+JSANCiAgc2VsZWN0KFBST1YsIFRBSFVOLCBQRE4pICU+JSANCiAgc2xpY2UoYXMubnVtZXJpYyhudW0pKQ0KYGBgDQoNCk1hc2FsYWggbWlzc2luZyB2YWx1ZSB0ZXJzZWxlc2Fpa2FuLg0KDQojIyBGZWF0dXJlIEVuZ2luZWVyaW5nDQoNCkRhdGEgeWFuZyBkaXBlcm9sZWggcGFkYSBzdW1iZXIgYWRhbGFoIEp1bWxhaCB0aW5kYWsgcGlkYW5hIHlhbmcgdGVsYWggdGVyYm9ib3RpIG9sZWggSnVtbGFoIHBlbmR1ZHVrIHNldGlhcCBwcm92aW5zaS4gQW5hbGlzaXMgcGFkYSBwZXViYWggaW5pIHRlbGFoIGRpbGFrdWthbiBzZWJlbHVtbnlhIG9sZWggRmVicmlhbnRpICgyMDIyKS4gUGFkYSBwZW5lbGl0aWFuIGluaSwga2FtaSBtZW5ndXN1bmcgcGVtYm9ib3RhbiB0YW1iYWhhbiBwYWRhIHBldWJhaCB5YW5nIHNhbWEsIHlhaXR1IGRlbmdhbiBwZW1ib2JvdGFuIHBhZGEgbHVhcyB3aWxheWFoIHNldGlhcCBwcm92aW5zaS4gU3ludGF4IHlhbmcgZGlndW5ha2FuIGFkYWxhaCBzZWJhZ2FpIGJlcmlrdXQ6DQoNCmBgYHtyfQ0KY3JpbWUgPC0gY3JpbWUgJT4lDQogIG11dGF0ZShQRE5fQVJFQT1QRE4vTFVBUyoxMDApICU+JSANCiAgc2VsZWN0KFBST1YsVEFIVU4sUEROLFBETl9BUkVBLGV2ZXJ5dGhpbmcoKSwtUEVORFVEVUssLUxVQVMpDQpjcmltZQ0KYGBgDQoNCiMgTWV0b2RvbG9naQ0KDQpNZXRvZG9sb2dpIHlhbmcgZGlndW5ha2FuIGFkYWxhaCBzZWJhZ2FpIGJlcmlrdXQ6DQoNCjEuICAgIE1lbGFrdWthbiBwcmUtcG9jZXNzaW5nIGRhdGEsIHlhaXR1IG1lbmFuZ2FuYW5pIG1pc3NpbmcgdmFsdWUgZGFuIG1lbGFrdWthbiBmZWF0dXJlIGVuZ2luZWVyaW5nIGRlbmdhbiBwZW1ib2JvdGFuIHBhZGEgbHVhcyB3aWxheWFoIGRpIHNldGlhcCBwcm92aW5zaSBwYWRhIGRhdGEganVtbGFoIHRpbmRhayBwaWRhbmEuDQoNCjIuICAgIE1lbGFrdWthbiBla3NwbG9yYXNpIGRhdGEuDQoNCjMuICAgIE1lbGFrdWthbiBwZW1vZGVsYW4gcmVncmVzaSBwYW5lbCBDRU0sIEZFTSwgZGFuIFJFTS4NCg0KNC4gICAgTWVsYWt1a2FuIHVqaSBDaG93LCBVamkgSGF1c21hbiwgZGFuIFVqaSBMYWdyYW5nZSBNdWx0aXBsaWVyIHVudHVrIG1lbWlsaWggbW9kZWwgcGFuZWwgdGVyYmFpayBkaSBhbnRhcmEgbW9kZWwgQ0VNLCBGRU0sIGRhbiBSRU0uDQoNCjUuICAgIE1lbWVyaWtzYSBoZXRlcm9nZW5pdGFzIHNwYXNpYWwgZGVuZ2FuIHVqaSBCcmV1c2NoIFBhZ2FuIHBhZGEgbW9kZWwgdGVycGlsaWguIFBlbW9kZWxhbiBHV1BSIG1lbmdhc3Vtc2lrYW4gYWRhbnlhIGhldGVyb2dlbml0YXMgc3Bhc2lhbC4NCg0KNi4gICAgTWVuZ2hpdHVuZyBiYW5kd2lkdGggb3B0aW11bSBkYW4gbWF0cmlrcyBwZW1ib2JvdCBzcGFzaWFsLg0KDQo3LiAgICBNZW5nZXN0aW1hc2kgbmlsYWkgcGFyYW1ldGVyIHBlbW9kZWxhbiBHV1BSLg0KDQo4LiAgICBNZWxha3VrYW4gcGVuZ3VqaWFuIHNlcmVudGFrIHBlbW9kZWxhbiBHV1BSIGRlbmdhbiBzdGF0aXN0aWsgdWppIEYgZGFuIHBlbmd1amlhbiBwYXJzaWFsIGRlbmdhbiBzdGF0aXN0aWsgdWppIHQNCg0KOS4gICAgTWVsYWt1a2FuIHBlcmJhbmRpbmdhbiBtb2RlbCBhbnRhcmEgcmVncmVzaSBwYW5lbCBkYW4gR1dQUiBkZW5nYW4ga3JpdGVyaWEgUl4yLg0KDQoxMC4gICBJbnRlcnByZXRhc2kgbW9kZWwgdGVyYmFpayB5YW5nIGRpcGVyb2xlaC4NCg0KDQohW10oTWV0b2RvbG9naS5wbmcpDQoNCiMgRWtzcGxvcmFzaSBEYXRhDQoNCiMjIEtlcmFnYW1hbiBBbnRhciBXYWt0dQ0KDQpgYGB7cn0NCmdncGxvdChkYXRhID0gY3JpbWUsIGFlcyh4ID0gVEFIVU4sIHkgPSBQRE5fQVJFQSkpICsNCiAgZ2VvbV9saW5lKCkgKw0KICBsYWJzKHggPSAiVGFodW4iLCB5ID0gIkp1bWxhaCBQaWRhbmEiKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKw0KICB0aGVtZV9idygpDQpgYGANCg0KIyMgS2VyYWdhbWFuIGFudGFyIEluZGl2aWR1DQoNCmBgYHtyLCB3YXJuaW5nPUZ9DQpncGxvdHM6OnBsb3RtZWFucyhQRE4gfiBgUFJPVmAsIG1haW49IktlcmFnYW1hbiBBbnRhciBKdW1sYWggUGlkYW5hIC8gMTAwcmIgUGVuZHVkdWsiLCBjcmltZSwgbi5sYWJlbCA9IEYsIHhsYWIgPSAiYSIpDQpgYGANCg0KYGBge3IsIHdhcm5pbmc9Rn0NCmdwbG90czo6cGxvdG1lYW5zKFBETl9BUkVBIH4gYFBST1ZgLCBtYWluPSJLZXJhZ2FtYW4gQW50YXIgSnVtbGFoIFBpZGFuYSAvIDEwMHJiIFBlbmR1ZHVrIC8gMTAwa20yIiwgY3JpbWUsIG4ubGFiZWwgPSBGLCB4bGFiID0gImEiKQ0KYGBgDQpQYWRhIHBsb3Qga2VyYWdhbWFuIGFudGFyd2FrdHUgdW50dWsgcGV1YmFoIGp1bWxhaCB0aW5kYWsgcGlkYW5hIHBlciAxMDAuMDAwIHBlbmR1ZHVrIHBlciAxMDBrbSBwZXJzZWdpIChQRE5fQVJFQSkgbWVuZ2FsYW1pIHBlbnVydW5hbiBqdW1sYWggc2VpcmluZyB3YWt0dW55YS4gS2VtdWRpYW4sIHBhZGEgcGxvdCBrZXJhZ2FtYW4gYW50YXJwcm92aW5zaSB1bnR1ayBwZXViYWgganVtbGFoIHRpbmRhayBwaWRhbmEgcGVyIDEwMC4wMDAgcGVuZHVkdWsgKFBETikgdGVybGloYXQgY3VrdXAgYmVyYWdhbSBuaWxhaW55YS4gU2VtZW50YXJhIHVudHVrIHBldWJhaCBQRE5fQVJFQSBwZXJzZWdpIHRlcmxpaGF0IHBlcmJlZGFhbiBuaWxhaSB5YW5nIHNpZ25pZmlrYW4gcGFkYSB3aWxheWFoIERLSSBKYWthcnRhIGRhbiBESSBZb2d5YWthcnRhLiBTZWJhcmFuIG5pbGFpIHBhZGEgcGxvdCBrZWR1YSB0ZXJzZWJ1dCB0aWRhayB0ZXJsaWhhdCBwZXJiZWRhYW4geWFuZyBqYXVoIHBhZGEgcHJvdmluc2kgbGFpbm55YS4gDQoNCg0KIyMgQ29ycmVsYXRpb24gUGxvdA0KDQpTZWJlbHVtbnlhIGRpc2VidXRrYW4gYmFod2Ega2FtaSBtZW5nZ3VuYWthbiBwZW1ib2JvdGFuIHRhbWJhaGFuIHBhZGEgcGV1YmFoIHJlc3BvbnMgKFBETikuIEFsYXNhbiBrYW1pIG1lbWlsaWggcGVtYm9ib3RhbiB0YW1iYWhhbiBha2FuIGRpamVsYXNrYW4gbGViaWggbGFuanV0IHBhZGEgcGxvdCBrb3JlbGFzaSBkaSBiYXdhaC4NCg0KYGBge3J9DQpjb3JycGxvdChjb3IoY3JpbWVbLWMoMToyKV0pLCBtZXRob2Q9ImNvbG9yIiwgdHlwZSA9ICJ1cHBlciIsIHRsLnBvcyA9ICd0cCcpDQpjb3JycGxvdChjb3IoY3JpbWVbLWMoMToyKV0pLCBtZXRob2Q9Im51bWJlciIsIGRpYWc9RiwgYWRkPVQsIHR5cGUgPSAibG93ZXIiLA0KICAgICAgICAgdGwucG9zID0gJ24nLCBjbC5wb3MgPSAnbicpDQpgYGANCg0KRGFyaSBwbG90IGtvcmVsYXNpIGRpIGF0YXMsIGRhcGF0IHRlcmxpaGF0IGJhaHdhIEp1bWxhaCBQaWRhbmEgeWFuZyB0aWRhayB0ZXJib2JvdGkgbHVhcyB3aWxheWFoIG1lbWlsaWtpIGtvcmVsYXNpIHBhZGEgcGV1YmFoIHBlbmplbGFzIHlhbmcgcmVsYXRpZiByZW5kYWggKHxyfDw9IDAuMykuIFNlZGFuZ2thbiwgcGFkYSBKdW1sYWggUGlkYW5hIHlhbmcgdGVyYm9ib3RpIG9sZWggTHVhcyBXaWxheWFoIG1lbWlsaWtpIGtvcmVsYXNpIHlhbmcgcmVsYXRpZiBsZWJpaCB0aW5nZ2kgamlrYSBkaWJhbmRpbmcgSnVtbGFoIHBpZGFuYSB5YW5nIHRpZGFrIHRlcmJvYm90aSBMdWFzIFdpbGF5YWguIE9sZWgga2FyZW5hIGl0dSwgYWthbiBsZWJpaCBiYWlrIGppa2EgZGlndW5ha2FuIHBldWJhaCByZXNwb25zIHlhbmcgdGVyYm9ib3RpIGBQRE5fQVJFQWAgamlrYSBkaWJhbmRpbmdrYW4gYFBETmAuIFNlaGluZ2dhOg0KDQojIyBUaW1lIFNlcmllcyBQbG90DQoNCiMjIyBQZXJiYW5kaW5nYW4gUEROIGRhbiBQRE5fQVJFQQ0KDQpgYGB7cn0NCmNyaW1lICU+JQ0KICBtdXRhdGUoVEFIVU49YXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoVEFIVU4pKSkgJT4lIA0KICBwaXZvdF9sb25nZXIoY29scyA9IGMoUEROLCBQRE5fQVJFQSksIG5hbWVzX3RvID0gInZhcmlhYmxlIiwgdmFsdWVzX3RvID0gInZhbHVlIikgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBUQUhVTiwgeSA9IHZhbHVlLCBjb2xvciA9IFBST1YpKSArDQogIGdlb21fbGluZSgpICsNCiAgZ2VvbV9wb2ludChzaXplPTIsIHNoYXBlPTE5LCBmaWxsPSJyZWQiKSArDQogIGZhY2V0X3dyYXAofnZhcmlhYmxlLCBzY2FsZXMgPSAiZnJlZV95IikgKw0KICBsYWJzKHRpdGxlID0gIkp1bWxhaCBUaW5kYWsgUGlkYW5hIC8gMTAwcmIgUGVuZHVkdWsgdnNcbkp1bWxhaCBUaW5kYWsgUGlkYW5hIC8gMTAwcmIgUGVuZHVkdWsgLyAxMDBrbTIiLCB4ID0gIlllYXIiLCB5ID0gIlZhbHVlIiwgY29sb3IgPSAiUHJvdmluY2UiKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLCBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIsIGhqdXN0ID0gMC41KSkNCmBgYA0KDQojIyMgUGxvdCBQRE4NCg0KYGBge3J9DQpnZ3Bsb3QoZGF0YT1jcmltZSwgYWVzKHg9VEFIVU4sIHk9UEROLCBncm91cCA9IFBST1YsIGNvbG91ciA9IFBST1YpKSsgdGhlbWVfYncoKSsNCiAgZ2VvbV9saW5lKHNpemU9MS4yKSArDQogIGdlb21fcG9pbnQoc2l6ZT0zLCBzaGFwZT0xOSwgZmlsbD0icmVkIikgKyANCiAgbGFicyhjb2xvdXI9IlBST1YiLCB0aXRsZSA9ICJKdW1sYWggdGluZGFrIHBpZGFuYSBwZXIgMTAwLjAwMCBQZW5kdWR1ayIsIHN1YnRpdGxlID0gIlRhaHVuIDIwMTUtMjAyMCIpICsNCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiKSkNCmBgYA0KDQojIyMgUGxvdCBQRE5fQVJFQQ0KDQpgYGB7cn0NCmdncGxvdChjcmltZSwgYWVzKHg9VEFIVU4sIHk9UEROX0FSRUEsIGdyb3VwID0gUFJPViwgY29sb3VyID0gUFJPVikpKyB0aGVtZV9idygpKw0KICBnZW9tX2xpbmUoc2l6ZT0xLjIpICsNCiAgZ2VvbV9wb2ludCggc2l6ZT0zLCBzaGFwZT0xOSwgZmlsbD0icmVkIikgKyANCiAgbGFicyhjb2xvdXI9IlBST1YiLCB0aXRsZSA9ICJKdW1sYWggVGluZGFrIFBpZGFuYSAvIDEwMHJiIFBlbmR1ZHVrIC8gMTAwa20yIiwgc3VidGl0bGUgPSAiVGFodW4gMjAxNS0yMDIwIikgKw0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIpKQ0KYGBgDQoNCiMjIyBQbG90IFBETiBBUkVBIHRhbnBhIERLSSBKYWthcnRhIGRhbiBESSBZb2d5YWthcnRhDQoNCmBgYHtyfQ0KY3JpbWUgJT4lIA0KICBmaWx0ZXIoUFJPViE9IkRLSSBKQUtBUlRBIiAmIFBST1YhPSJEIEkgWU9HWUFLQVJUQSIpICU+JSANCiAgZ2dwbG90KGFlcyh4PVRBSFVOLCB5PVBETl9BUkVBLCBncm91cCA9IFBST1YsIGNvbG91ciA9IFBST1YpKSsgdGhlbWVfYncoKSsNCiAgZ2VvbV9saW5lKHNpemU9MS4yKSArDQogIGdlb21fcG9pbnQoIHNpemU9Mywgc2hhcGU9MTksIGZpbGw9InJlZCIpICsgDQogIGxhYnMoY29sb3VyPSJQUk9WIiwgdGl0bGUgPSAiSnVtbGFoIFRpbmRhayBQaWRhbmEgLyAxMDByYiBQZW5kdWR1ayAvIDEwMGttMiIsIHN1YnRpdGxlID0gIlRhaHVuIDIwMTUtMjAyMCIpICsNCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiKSkNCmBgYA0KDQpQYWRhIGdhbWJhciBkaSBhdGFzLCB0ZXJsaWhhdCBiYWh3YSBwZXJrZW1iYW5nYW4gUEROX0FSRUEgc2V0aWFwIHByb3ZpbnNpIEluZG9uZXNpYSB0YWh1biAyMDE1LTIwMjAgY3VrdXAgYmVyYWdhbS4gQWRhIHByb3ZpbnNpIHRlcnRlbnR1IHlhbmcgbWVuaW5na2F0LCBtZW51cnVuLCBhdGF1IHN0YWduYW4gbmlsYWkgcGV1YmFoIFBETl9BUkVBIHByb3ZpbnNpIEluZG9uZXNpYSB0YWh1biAyMDE1LTIwMjAgaGFueWEgdGVybGloYXQgcGFkYSBwcm92aW5zaSBES0kgSmFrYXJ0YSBkYW4gREkgWW9neWFrYXJ0YSBzYWphIHlhbmcgbWFuYSBwZXJrZW1iYW5nYW55YSBtZW51cnVuLiBVbnR1ayBsZWJpaCBqZWxhc255YSwgZGlidWF0bGFoIGdhbWJhciA3IHlhbmcgbWFuYSBnYW1iYXIgNyBtZXJ1cGFrYW4gcGxvdCB5YW5nIHNhbWEgZGVuZ2FuIGdhbWJhciA2LiBIYW55YSBzYWphIGdhbWJhciA3IHRpZGFrIG1lbWFzdWtrYW4ga2F0ZWdvcmkgcHJvdmluc2kgREtJIEpha2FydGEgZGFuIERJIFlvZ3lha2FydGEgYWdhciBwcm92aW5zaSBkZW5nYW4gUEROX0FSRUEgeWFuZyByZW5kYWggZGFwYXQgdGVybGloYXQgYmFnYWltYW5hIHBlcmtlbWJhbmdhbm55YS4gVGVybGloYXQgYmFod2EgbmlsYWkgUEROX0FSRUEgbWFzaW5nLW1hc2luZyBwcm92aW5zaSBtYXlvcml0YXMgbWVuZ2FsYW1pIHBlbnVydW5hbiBwYWRhIHJlbnRhbmcgd2FrdHUgMjAxNS0yMDIwLg0KDQojIyBNYXAgQ2hhcnQNCg0KTWFwIGRpIGJhd2FoIGluaSBkaWJ1YXQgcGFkYSBBcGxpa2FzaSBbVGFibGVhdSBQdWJsaWNdKGh0dHBzOi8vcHVibGljLnRhYmxlYXUuY29tL2FwcC9wcm9maWxlL2FsZmlkaGlhLnJhaG1hbi5uYXNhLmp1aGFuZGEvdml6L1JhdGEtcmF0YWNyaW1la2luYW5kaUluZG9uZXNpYS9EYXNoYm9hcmQxKSwgbWVydXBha2FuIHNlYmFyYW4gcmF0YS1yYXRhIHBldWJhaCBQRE4gZGFuIFBETl9BUkVBIGRpIEluZG9uZXNpYSBwYWRhIHNlbGFtYSB0YWh1biAyMDE1IGhpbmdnYSAyMDIwLg0KDQohW10oU2NyZWVuc2hvdCAyMDIzLTA1LTMwIDA5MDcxNy5wbmcpDQoNCiFbXShTY3JlZW5zaG90IDIwMjMtMDUtMzAgMDkwNjMyLnBuZykNCg0KTWFwIGNoYXJ0IHVudHVrIHJhdGFhbiBQRE4gMjAxNS0yMDIwIHVudHVrIG1hc2luZy1tYXNpbmcgcHJvdmluc2kgbWVudW5qdWtrYW4gYmFod2EgZGkgYmViZXJhcGEgd2lsYXlhaCBwZWxvc29rIFN1bWF0ZXJhLCBTdWxhd2VzaSBkYW4gUGFwdWEgbWFzaWggY3VrdXAgdGluZ2dpIGJhbnlha255YSB0aW5kYWsgcGlkYW5hIHlhbmcgdGVyamFkaS4gS2VtdWRpYW4sIHNldGVsYWggcGV1YmFoIFBETiBkaWJvYm90aSBkZW5nYW4gd2lsYXlhaCBwZXIgMTAwa20gcGVyc2VnaSwgc2ViYWdpYW4gYmVzYXIgd2lsYXlhaCBwZWxvc29rIGJhbnlhayB0aW5kYWsgcGlkYW5hIHRlcmJvYm90aSB3aWxheWFobnlhIGN1a3VwIGtlY2lsIChsZWJpaCBrZWNpbCBkYXJpIDEpLiBNZXNraXB1biBiZWdpdHUsIG1hc2loIHRlcmxpaGF0IGJlYmVyYXBhIHdpbGF5YWggeWFuZyBjdWt1cCB0aW5nZ2kgc2VwZXJ0aSBES0kgSmFrYXJ0YSwgREkgWW9neWFrYXJ0YSwgS2VwdWxhdWFuIFJpYXUsIEdvcm9udGFsbywgQmFsaSwgaGluZ2dhIEJlbmdrdWx1Lg0KDQojIFNlbGVrc2kgUGV1YmFoIE11bHRpa29saW5lYXJpdGFzDQoNCmBgYHtyfQ0KIyBNZW5naGFwdXMgcGV1YmFoIFBETiBrYXJlbmEgc3VkYWggdGlkYWsgYWthbiBkaWd1bmFrYW4NCmNyaW1lIDwtIGNyaW1lICU+JSBzZWxlY3QoLVBETikNCmNoZWNrX21vZGVsIDwtIGxtKFBETl9BUkVBIH4gS01JUyArIFJMUyArIElQTSArIFRQVCArIFBEUkIgKyBBSEggKyBQS0QsIGNyaW1lKQ0KZGF0YS5mcmFtZSh0KHZpZihjaGVja19tb2RlbCkpKQ0KYGBgDQoNCkRhcmkgaGFzaWwgZGkgYXRhcywgZGFwYXQgdGVybGloYXQgYmFod2EgcGV1YmFoIElQTSBtZW1pbGlraSBWSUYgeWFuZyBzYW5nYXQgdGluZ2dpLCB5YWl0dSAzOC43OCB5YW5nIG1hbmEgbGViaWggYmVzYXIgZGFyaSBub2wuIEhhbCBpbmkgbWVsYW5nZ2FyIGFzdW1zaSBNdWx0aWtvbGluZWFyaXRhcyBzZWhpbmdnYSBwZXViYWggaW5pIGFrYW4gZGloaWxhbmdrYW4uDQoNCmBgYHtyfQ0KY3JpbWUgPC0gY3JpbWUgJT4lIHNlbGVjdCgtSVBNKQ0KY2hlY2tfbW9kZWwgPC0gbG0oUEROX0FSRUEgfiBLTUlTICsgUkxTICsgVFBUICsgUERSQiArIEFISCArIFBLRCwgY3JpbWUpDQpkYXRhLmZyYW1lKHQodmlmKGNoZWNrX21vZGVsKSkpDQpgYGANCg0KU2V0ZWxhaCBtZW5naGlsYW5na2FuIHBldWJhaCBJUE0sIGRpZGFwYXQgc2VtdWEgbmlsYWkgVklGIHBldWJhaCBtZW5qYWRpIFw8XDwgMTAsIGFydGlueWEgYXN1bXNpIG11bHRpa29saW5lYXJpdGFzIHRlcnBlbnVoaS4NCg0KIyBDb21tb24tRWZmZWN0IE1vZGVsDQoNCkNvbW1vbiBFZmZlY3QgTW9kZWwgKENFTSkgYXRhdSBkaXNlYnV0IGp1Z2EgKnBvb2xlZCByZWdyZXNzaW9uIG1vZGVsKiBtZXJ1cGFrYW4gc2FsYWggc2F0dSBtb2RlbCBkYWxhbSByZWdyZXNpIGRhdGEgcGFuZWwgeWFuZyBtZW5na29tYmluYXNpa2FuIGRhdGEgKmNyb3NzLXNlY3Rpb24qIGRhbiAqdGltZSBzZXJpZXMqIG1lbmphZGkgc2F0dSBrZXNhdHVhbiAocG9vbGRhdGEpIHlhbmcga2VtdWRpYW4gZGllc3RpbWFzaSBtb2RlbG55YSBkZW5nYW4gdGVrbmlrIE9MUy4gQWtpYmF0bnlhLCBwZXJiZWRhYW4gYmFpayBhbnRhciBpbmRpdmlkdSBtYXVwdW4gYW50YXIgd2FrdHUgdGlkYWsgZGFwYXQgZGlhbWF0aS4gRGVuZ2FuIGthdGEgbGFpbiwgZGFsYW0gcGVuZGVrYXRhbiBpbmkgZGltZW5zaSBpbmRpdmlkdSBtYXVwdW4gd2FrdHUgdGlkYWsgZGlwZXJoYXRpa2FuLiBEaWFzdW1zaWthbiBiYWh3YSBwZXJpbGFrdSBkYXRhIGFudGFyIEluZGl2aWR1IHNhbWEgZGFsYW0gYmVyYmFnYWkga3VydW4gd2FrdHUuIFBlcnNhbWFhbiBwb29sIG1vZGVsIGRhcGF0IGRpdHVsaXNrYW4gc2ViYWdhaSBiZXJpa3V0Og0KDQokJA0KXGJlZ2lue2FsaWduZWR9DQp5X3tpdH0gJj0gXGFscGhhICsgXGJldGFfezF9eF97MSxpdH0rIFxiZXRhX3syfXhfezIsaXR9Ky4uLitcYmV0YV97a314X3trLGl0fStcdmFyZXBzaWxvbl97aXR9IFxcDQpcZW5ke2FsaWduZWR9DQokJA0KDQpkZW5nYW4gJHlfe2lqfSQgbWVydXBha2FuIHZhcmlhYmVsIGRlcGVuZGVuIGluZGl2aWR1IGtlLWkgZGFuIHdha3R1IGtlLWouICRcYWxwaGEkIGFkYWxhaCBpbnRlcnNlcCwgJHhfe3AsaWp9JCBhZGFsYWggdmFyaWFiZWwgaW5kZXBlbmRlbiBrZS1wIGluZGl2aWR1IGtlLWkgZGFuIHdha3R1IGtlLWosICRcYmV0YV9rJCBrb2VmaXNpZW4gdmFyaWFiZWwgYmViYXMsIGRhbiAkXHZhcmVwc2lsb25fe2lqfSQgbWVydXBha2FuIGdhbGF0IGluZGl2aWR1IGtlLWkgZGFuIHdha3R1IGtlLWouDQoNClNlbGFpbiBhc3Vtc2kga2VzYW1hYW4gcGVuZ2FydWggaW5kaXZpZHUgZGFuIHdha3R1LCBhc3Vtc2kgbGFpbiB5YW5nIGRpcGVybHVrYW4gcGFkYSBtb2RlbCBpbmkgYWRhbGFoIGFzdW1zaSBub3JtYWxpdGFzLCBob21vZ2VuaXRhcywgZGFuIGtlYmViYXNhbiBnYWxhdC4NCg0KIyMgTW9kZWwgQ0VNDQoNClByb2dyYW0gUiBtZW55ZWRpYWthbiBwYWNrYWdlIGBwbG1gIHlhbmcgZGFwYXQgbWVtb2RlbGthbiBkYXRhIG1lbmphZGkgbW9kZWwgQ0VNLg0KDQpEYWxhbSBwZW1vZGVsYW4gaW5pLCBkYXBhdCBkaWJ1YXQgaGlwb3Rlc2lzOg0KDQokJA0KXGJlZ2lue2FsaWduZWR9DQpIXzAgJjogXHRleHR7Q0VNIGFkYWxhaCBtb2RlbCB5YW5nIHRpZGFrIGxheWFrfVxcDQpIXzEgJjogXHRleHR7Q0VNIGFkYWxhaCBtb2RlbCB5YW5nIGxheWFrfQ0KXGVuZHthbGlnbmVkfQ0KJCQNCg0KYGBge3J9DQpsaWJyYXJ5KHBsbSkNCmNlbSA8LSBwbG0oUEROX0FSRUEgfiBLTUlTICsgUkxTICsgVFBUICsgUERSQiArIEFISCArIFBLRCwgZGF0YSA9IGNyaW1lLCBtb2RlbCA9ICJwb29saW5nIikNCnN1bW1hcnkoY2VtKQ0KYGBgDQoNClBhZGEgZGFzYXJueWEsIHBlbmR1Z2FhbiBtb2RlbCB5YW5nIGRpbGFrdWthbiBvbGVoIG1ldG9kZSBDRU0gbWVuZ2hhc2lsa2FuIG1vZGVsIHlhbmcgc2FtYSBwZXJzaXMgZGVuZ2FuIG1ldG9kZSBSZWdyZXNpIExpbmVhciBCZXJnYW5kYSBkZW5nYW4gbWVtYW5kYW5nIHNldGlhcCBiYXJpcyBwYWRhIGRhdGEgYWRhbGFoIGluZGl2aWR1IHlhbmcgYmVyYmVkYS1iZWRhLiBNb2RlbCByZWdyZXNpIHlhbmcgZGloYXNpbGthbiB0ZXJ0dWxpcyBkaSBhdGFzLCBkZW5nYW4gaW50ZXJwcmV0YXNpbnlhIGFkYWxhaDoNCg0KLSAgIFNldGlhcCBrZW5haWthbiBzYXR1IHNhdHVhbiBgS01JU2AgbWVueWViYWJrYW4gYFBETl9BUkVBYCBtZW5pbmdrYXQgc2ViZXNhciBgMC4yMTgyNWAgZGVuZ2FuIG1lbmdhbmdnYXAgcGV1YmFoIGxhaW4ga29uc3Rhbi4NCg0KLSAgIFNldGlhcCBrZW5haWthbiBzYXR1IHNhdHVhbiBgUkxTYCBtZW55ZWJhYmthbiBgUEROX0FSRUFgIG1lbmluZ2thdCBzZWJlc2FyIGAwLjY5MjZgIGRlbmdhbiBtZW5nYW5nZ2FwIHBldWJhaCBsYWluIGtvbnN0YW4uDQoNCi0gICBTZXRpYXAga2VuYWlrYW4gc2F0dSBzYXR1YW4gYFRQVGAgbWVueWViYWJrYW4gYFBETl9BUkVBYCBtZW51cnVuIHNlYmVzYXIgYDAuMTczODFgIGRlbmdhbiBtZW5nYW5nZ2FwIHBldWJhaCBsYWluIGtvbnN0YW4uDQoNCi0gICBTZXRpYXAga2VuYWlrYW4gc2F0dSBzYXR1YW4gYFBEUkJgIG1lbnllYmFia2FuIGBQRE5fQVJFQWAgbWVuaW5na2F0IHNlYmVzYXIgYDIuNjQ5NWUtMDVgIGRlbmdhbiBtZW5nYW5nZ2FwIHBldWJhaCBsYWluIGtvbnN0YW4uDQoNCi0gICBTZXRpYXAga2VuYWlrYW4gc2F0dSBzYXR1YW4gYEFISGAgbWVueWViYWJrYW4gYFBETl9BUkVBYCBtZW51cnVuIHNlYmVzYXIgYDAuMTc5MDZgIGRlbmdhbiBtZW5nYW5nZ2FwIHBldWJhaCBsYWluIGtvbnN0YW4uDQoNCi0gICBTZXRpYXAga2VuYWlrYW4gc2F0dSBzYXR1YW4gYFBLRGAgbWVueWViYWJrYW4gYFBETl9BUkVBYCBtZW5pbmdrYXQgc2ViZXNhciBgMS4xOTU3ZS0wM2AgZGVuZ2FuIG1lbmdhbmdnYXAgcGV1YmFoIGxhaW4ga29uc3Rhbi4NCg0KVW50dWsgc2VtdWEgcC12YWx1ZSBkaSBiYXdhaCA1JSwgbWFrYSB0ZXJkYXBhdCBjdWt1cCBidWt0aSB1bnR1ayBtZW5vbGFrICRIXzAkIChrdXJhbmcgZGFyaSA1JSBrZW11bmdraW5hbiBiYWh3YSAkSF8wJCBiZW5hcikuDQoNCi0gICBwLXZhbHVlIHVqaS1GIFw8IDIuMjJlLTE2IFw8XDwgNSUuIEFydGlueWEsIGRhcGF0IGRpa2F0YWthbiBiYWh3YSBtb2RlbCBsYXlhayB1bnR1ayBkaWd1bmFrYW4uDQoNCi0gICBwLXZhbHVlIHVqaS1UIHVudHVrIHBldWJhaCBgS01JU2AsIGBSTFNgLCBgUERSQmAsIGBBSEhgLCBkYW4gYFBLRGAgXDwgNSUuIEFydGlueWEsIGRhcGF0IGRpa2F0YWthbiBiYWh3YSBwZXViYWggdGVyc2VidXQgYmVycGVuZ2FydWggc2lnbmlmaWthbiB0ZXJoYWRhcCBtb2RlbC4NCg0KJFJeMiQgbWVydXBha2FuIG5pbGFpIHlhbmcgbWVudW5qdWthbiBrZWt1YXRhbiBodWJ1bmdhbiBhbnRhcmEgcGV1YmFoIGJlYmFzIGRhbiBwZXViYWggcmVzcG9ucy4gU2VtYWtpbiB0aW5nZ2kgbmlsYWkgJFJeMiQsIG1ha2Egc2VtYWtpbiBiYWlrIG1vZGVsIHRlcnNlYnV0Lg0KDQotICAgJFJeMiQgcGFkYSBtb2RlbCBzZWJlc2FyIDAuMTI2NDUgYXRhdSAxMi42NDUlIHlhbmcgbWVuZ2luZGlrYXNpa2FuIGJhaHdhIHBldWJhaCB5YW5nIGRpZ3VuYWthbiBrdXJhbmcgYmFpayBkYWxhbSBtZW5nZ2FtYmFya2FuIG1vZGVsLg0KDQpNZXNraXB1biBzZWJhZ2lhbiBiZXNhciBwYXJhbWV0ZXIgbW9kZWwgc2lnbmlmaWthbiwgdGV0YXBpIG5pbGFpIFIyIG1vZGVsIGt1cmFuZyBiYWlrIGRhbiBmYWt0YSBiYWh3YSBtb2RlbCBDRU0gbWVuZ2FiYWlrYW4gcGVuZ2FydWggaW5kaXZpZHUgZGFuIHdha3R1IHRpZGFrIGJpc2EgZGlhYmFpa2FuLiBLZWR1YSBmYWt0b3IgdGVyc2VidXQgYmlzYSBiZXJwZW5nYXJ1aCB0ZXJoYWRhcCBrZWhldGVyb2dlbmFuIHNpc2FhbiBwYWRhIG1vZGVsLiBPbGVoIGthcmVuYSBpdHUsIHBlcmx1IGRpbGFrdWthbiBwZXJiYW5kaW5nYW4gbW9kZWwgQ0VNIGRlbmdhbiBGRU0gZGFuIFJFTSB1bnR1ayBtZW1hc3Rpa2FuIG1vZGVsIHRlcmJhaWsuDQoNCiMgRml4ZWQtRWZmZWN0IE1vZGVsDQoNCkZpeGVkLUVmZmVjdCBtb2RlbCBtZXJ1cGFrYW4gc2FsYWggc2F0dSBqZW5pcyBtb2RlbCBkYWxhbSByZWdyZXNpIGRhdGEgcGFuZWwgeWFuZyBtZW1wZXJ0aW1iYW5na2FuIGFkYW55YSBwZW5nYXJ1aCBpbmRpdmlkdSBkYW4gd2FrdHUuIFRlcmRhcGF0IGFzdW1zaSBiYWh3YSBpbnRlcnNlcCBhbnRhciBpbmRpdmlkdSBkYW4gd2FrdHUgYmVyYmVkYSB0ZXRhcGkga29lZmlzaWVuIHJlZ3Jlc2kga29uc3RhbiB1bnR1ayBzZW11YSBpbmRpdmlkdSBkYW4gd2FrdHUuIE1vZGVsIHlhbmcgbWVtaWxpa2kgcGVuZ2FydWggZGFyaSBzYWxhaCBzYXR1IGRhcmkgaW5kaXZpZHUgYXRhdSB3YWt0dSBkaXNlYnV0IG1vZGVsIHNpc2FhbiBzYXR1IGFyYWggZGFuIG1vZGVsIHlhbmcgbWVtaWxpa2kgcGVuZ2FydWggZGFyaSBrZWR1YW55YSBkaXNlYnV0IG1vZGVsIHNpc2FhbiBkdWEgYXJhaC4gUGVuZHVnYWFuIHBhZGEgbW9kZWwgaW5pIGJpYXNhIGRpbGFrdWthbiBkZW5nYW4gbW9kZWwgKldpdGhpbiogYXRhdSAqTGVhc3QgU3F1YXJlIER1bW15IFZhcmlhYmxlKiAoTFNEVikuIFBhZGEgcGVuZWxpdGlhbiBpbmksIGhhbnlhIGRpZ3VuYWthbiBtb2RlbCAqd2l0aGluKi4NCg0KUGVyc2FtYWFuIG1vZGVsIEZpeGVkLUVmZmVjdCA6DQoNCi0gICBQZW5nYXJ1aCBJbmRpdmlkdQ0KDQokJA0KXGJlZ2lue2FsaWduZWR9DQp5X3tpdH0gPSBcYWxwaGEgKyBmX2kgK1xiZXRhXzF4X3sxLGl0fSArIFxiZXRhXzJ4X3syLGl0fSArIC4uLiArIFxiZXRhX2t4X3trLGl0fSArIFx2YXJlcHNpbG9uX3tpdH0NClxlbmR7YWxpZ25lZH0NCiQkDQoNCi0gICBQZW5nYXJ1aCBXYWt0dQ0KDQokJA0KXGJlZ2lue2FsaWduZWR9DQp5X3tpdH0gPSBcYWxwaGEgKyBcbGFtYmRhX3QgK1xiZXRhXzF4X3sxLGl0fSArIFxiZXRhXzJ4X3syLGl0fSArIC4uLiArIFxiZXRhX2t4X3trLGl0fSArIFx2YXJlcHNpbG9uX3tpdH0NClxlbmR7YWxpZ25lZH0NCiQkDQoNCi0gICBNb2RlbCBEdWEgYXJhaCAocGVuZ2FydWggaW5kaXZpZHUgZGFuIHdha3R1KQ0KDQokJA0KXGJlZ2lue2FsaWduZWR9DQp5X3tpdH0gPSBcYWxwaGEgKyBmX2kgKyBcbGFtYmRhX3QgK1xiZXRhXzF4X3sxLGl0fSArIFxiZXRhXzJ4X3syLGl0fSArIC4uLiArIFxiZXRhX2t4X3trLGl0fSArIFx2YXJlcHNpbG9uX3tpdH0NClxlbmR7YWxpZ25lZH0NCiQkDQoNCiMjIEZFTSBJbmRpdmlkdWFsDQoNCkVmZWsga29tcG9uZW4gc2lzYWFhbiBzYXR1IGFyYWggcGFkYSBpbmRpdmlkdS4NCg0KYGBge3J9DQpmZW1faW5kIDwtIHBsbShQRE5fQVJFQSB+IEtNSVMgKyBSTFMgKyBUUFQgKyBQRFJCICsgQUhIICsgUEtELCBpbmRleCA9IGMoIlBST1YiLCAiVEFIVU4iKSwgbW9kZWwgPSAid2l0aGluIiwgZWZmZWN0PSAiaW5kaXZpZHVhbCIsIGRhdGEgPSBjcmltZSkNCnN1bW1hcnkoZmVtX2luZCkNCmBgYA0KDQpJbnRlcnByZXRhc2kgOg0KDQotICAgU2V0aWFwIGtlbmFpa2FuIHNhdHUgc2F0dWFuIGBLTUlTYCBtZW55ZWJhYmthbiBgUEROX0FSRUFgIG1lbnVydW4gc2ViZXNhciBgMC4wMjAzNzhgIGRlbmdhbiBtZW5nYW5nZ2FwIHBldWJhaCBsYWluIGtvbnN0YW4uDQoNCi0gICBTZXRpYXAga2VuYWlrYW4gc2F0dSBzYXR1YW4gYFJMU2AgbWVueWViYWJrYW4gYFBETl9BUkVBYCBtZW5pbmdrYXQgc2ViZXNhciBgMS41OTk5YCBkZW5nYW4gbWVuZ2FuZ2dhcCBwZXViYWggbGFpbiBrb25zdGFuLg0KDQotICAgU2V0aWFwIGtlbmFpa2FuIHNhdHUgc2F0dWFuIGBUUFRgIG1lbnllYmFia2FuIGBQRE5fQVJFQWAgbWVudXJ1biBzZWJlc2FyIGAwLjIyMDA5YCBkZW5nYW4gbWVuZ2FuZ2dhcCBwZXViYWggbGFpbiBrb25zdGFuLg0KDQotICAgU2V0aWFwIGtlbmFpa2FuIHNhdHUgc2F0dWFuIGBQRFJCYCBtZW55ZWJhYmthbiBgUEROX0FSRUFgIG1lbnVydW4gc2ViZXNhciBgNy43NDI5ZS0wNWAgZGVuZ2FuIG1lbmdhbmdnYXAgcGV1YmFoIGxhaW4ga29uc3Rhbi4NCg0KLSAgIFNldGlhcCBrZW5haWthbiBzYXR1IHNhdHVhbiBgQUhIYCBtZW55ZWJhYmthbiBgUEROX0FSRUFgIG1lbnVydW4gc2ViZXNhciBgMC4zMDg4N2AgZGVuZ2FuIG1lbmdhbmdnYXAgcGV1YmFoIGxhaW4ga29uc3Rhbi4NCg0KLSAgIFNldGlhcCBrZW5haWthbiBzYXR1IHNhdHVhbiBgUEtEYCBtZW55ZWJhYmthbiBgUEROX0FSRUFgIG1lbnVydW4gc2ViZXNhciBgMy4wNTQzZS0wNGAgZGVuZ2FuIG1lbmdhbmdnYXAgcGV1YmFoIGxhaW4ga29uc3Rhbi4NCg0KVW50dWsgc2VtdWEgcC12YWx1ZSBkaSBiYXdhaCA1JSwgbWFrYSB0ZXJkYXBhdCBjdWt1cCBidWt0aSB1bnR1ayBtZW5vbGFrICRIXzAkIChrdXJhbmcgZGFyaSA1JSBrZW11bmdraW5hbiBiYWh3YSAkSF8wJCBiZW5hcikuDQoNCi0gICBwLXZhbHVlIHVqaS1GIFw8IDIuMjJlLTE2IFw8XDwgNSUuIEFydGlueWEsIGRhcGF0IGRpa2F0YWthbiBiYWh3YSBtb2RlbCBsYXlhayB1bnR1ayBkaWd1bmFrYW4uDQoNCi0gICBwLXZhbHVlIHVqaS1UIHVudHVrIHBldWJhaCBgUkxTYCwgYFRQVGAsIGRhbiBgUERSQmAgXDwgNSUuIEFydGlueWEsIGRhcGF0IGRpa2F0YWthbiBiYWh3YSBwZXViYWggdGVyc2VidXQgYmVycGVuZ2FydWggc2lnbmlmaWthbiB0ZXJoYWRhcCBtb2RlbC4NCg0KJFJeMiQgbWVydXBha2FuIG5pbGFpIHlhbmcgbWVudW5qdWthbiBrZWt1YXRhbiBodWJ1bmdhbiBhbnRhcmEgcGV1YmFoIGJlYmFzIGRhbiBwZXViYWggcmVzcG9ucy4gU2VtYWtpbiB0aW5nZ2kgbmlsYWkgJFJeMiQsIG1ha2Egc2VtYWtpbiBiYWlrIG1vZGVsIHRlcnNlYnV0Lg0KDQotICAgJFJeMiQgcGFkYSBtb2RlbCBzZWJlc2FyIDAuNDYyMjUgYXRhdSA0Ni4yMjUlIHlhbmcgbWVuZ2luZGlrYXNpa2FuIGJhaHdhIHBldWJhaCB5YW5nIGRpZ3VuYWthbiBrdXJhbmcgYmFpayBkYWxhbSBtZW5nZ2FtYmFya2FuIG1vZGVsLg0KDQpgYGB7cn0NCnN1bW1hcnkoZml4ZWYoZmVtX2luZCwgZWZmZWN0PSJpbmRpdmlkdWFsIikpDQpgYGANCg0KTmlsYWkgZGlhdGFzIGFkYWxhaCBuaWxhaSBwZW5nYXJ1aCBrb25zdGFuIGRhcmkgbWFzaW5nLW1hc2luZyBpbmRpdmlkdSB5YW5nIHBhZGEgbW9kZWwgZGFwYXQgZGl0dWxpc2thbiBzZWJhZ2FpICRmX2kkLg0KDQojIyBGRU0gVElNRQ0KDQpFZmVrIGtvbXBvbmVuIHNpc2FhYW4gc2F0dSBhcmFoIHBhZGEgd2FrdHUuDQoNCmBgYHtyfQ0KZmVtX3RpbWUgPC0gcGxtKFBETl9BUkVBIH4gS01JUyArIFJMUyArIFRQVCArIFBEUkIgKyBBSEggKyBQS0QsIGluZGV4ID0gYygiUFJPViIsICJUQUhVTiIpLCBtb2RlbCA9ICJ3aXRoaW4iLCBlZmZlY3Q9ICJ0aW1lIiwgZGF0YSA9IGNyaW1lKQ0Kc3VtbWFyeShmZW1fdGltZSkNCmBgYA0KDQpJbnRlcnByZXRhc2k6DQoNCi0gICBTZXRpYXAga2VuYWlrYW4gc2F0dSBzYXR1YW4gYEtNSVNgIG1lbnllYmFia2FuIGBQRE5fQVJFQWAgbWVuaW5na2F0IHNlYmVzYXIgYDAuMjI5MzlgIGRlbmdhbiBtZW5nYW5nZ2FwIHBldWJhaCBsYWluIGtvbnN0YW4uDQoNCi0gICBTZXRpYXAga2VuYWlrYW4gc2F0dSBzYXR1YW4gYFJMU2AgbWVueWViYWJrYW4gYFBETl9BUkVBYCBtZW5pbmdrYXQgc2ViZXNhciBgMS4wMzFgIGRlbmdhbiBtZW5nYW5nZ2FwIHBldWJhaCBsYWluIGtvbnN0YW4uDQoNCi0gICBTZXRpYXAga2VuYWlrYW4gc2F0dSBzYXR1YW4gYFRQVGAgbWVueWViYWJrYW4gYFBETl9BUkVBYCBtZW51cnVuIHNlYmVzYXIgYDAuMzI2NDhgIGRlbmdhbiBtZW5nYW5nZ2FwIHBldWJhaCBsYWluIGtvbnN0YW4uDQoNCi0gICBTZXRpYXAga2VuYWlrYW4gc2F0dSBzYXR1YW4gYFBEUkJgIG1lbnllYmFia2FuIGBQRE5fQVJFQWAgbWVuaW5na2F0IHNlYmVzYXIgYDIuNjk5MmUtMDVgIGRlbmdhbiBtZW5nYW5nZ2FwIHBldWJhaCBsYWluIGtvbnN0YW4uDQoNCi0gICBTZXRpYXAga2VuYWlrYW4gc2F0dSBzYXR1YW4gYEFISGAgbWVueWViYWJrYW4gYFBETl9BUkVBYCBtZW51cnVuIHNlYmVzYXIgYDAuMTgxNDlgIGRlbmdhbiBtZW5nYW5nZ2FwIHBldWJhaCBsYWluIGtvbnN0YW4uDQoNCi0gICBTZXRpYXAga2VuYWlrYW4gc2F0dSBzYXR1YW4gYFBLRGAgbWVueWViYWJrYW4gYFBETl9BUkVBYCBtZW5pbmdrYXQgc2ViZXNhciBgMS4yMTY3ZS0wM2AgZGVuZ2FuIG1lbmdhbmdnYXAgcGV1YmFoIGxhaW4ga29uc3Rhbi4NCg0KVW50dWsgc2VtdWEgcC12YWx1ZSBkaSBiYXdhaCA1JSwgbWFrYSB0ZXJkYXBhdCBjdWt1cCBidWt0aSB1bnR1ayBtZW5vbGFrICRIXzAkIChrdXJhbmcgZGFyaSA1JSBrZW11bmdraW5hbiBiYWh3YSAkSF8wJCBiZW5hcikuDQoNCi0gICBwLXZhbHVlIHVqaS1GIFw8IDIuMjJlLTE2IFw8XDwgNSUuIEFydGlueWEsIGRhcGF0IGRpa2F0YWthbiBiYWh3YSBtb2RlbCBsYXlhayB1bnR1ayBkaWd1bmFrYW4uDQoNCi0gICBwLXZhbHVlIHVqaS1UIHVudHVrIHNlbHVydWgga29lZmlzaWVuIHBldWJhaCBcPCA1JS4gQXJ0aW55YSwgZGFwYXQgZGlrYXRha2FuIGJhaHdhIHBldWJhaCB0ZXJzZWJ1dCBiZXJwZW5nYXJ1aCBzaWduaWZpa2FuIHRlcmhhZGFwIG1vZGVsLg0KDQokUl4yJCBtZXJ1cGFrYW4gbmlsYWkgeWFuZyBtZW51bmp1a2FuIGtla3VhdGFuIGh1YnVuZ2FuIGFudGFyYSBwZXViYWggYmViYXMgZGFuIHBldWJhaCByZXNwb25zLiBTZW1ha2luIHRpbmdnaSBuaWxhaSAkUl4yJCwgbWFrYSBzZW1ha2luIGJhaWsgbW9kZWwgdGVyc2VidXQuDQoNCi0gICAkUl4yJCBwYWRhIG1vZGVsIHNlYmVzYXIgMC42ODI2OSBhdGF1IDY4LjI2OSUgeWFuZyBtZW5naW5kaWthc2lrYW4gYmFod2EgcGV1YmFoIHlhbmcgZGlndW5ha2FuIGt1cmFuZyBiYWlrIGRhbGFtIG1lbmdnYW1iYXJrYW4gbW9kZWwuDQoNCmBgYHtyfQ0Kc3VtbWFyeShmaXhlZihmZW1fdGltZSwgZWZmZWN0PSJ0aW1lIikpDQpgYGANCg0KTmlsYWkgZGlhdGFzIGFkYWxhaCBuaWxhaSBwZW5nYXJ1aCBrb25zdGFuIGRhcmkgbWFzaW5nLW1hc2luZyB3YWt0dSB5YW5nIHBhZGEgbW9kZWwgZGFwYXQgZGl0dWxpc2thbiBzZWJhZ2FpICRcbGFtYmRhX3QkLg0KDQojIyBGRU0gVFdPIFdBWVMNCg0KRWZlayBrb21wb25lbiBzaXNhYWFuIHNhdHUgYXJhaCBwYWRhIGluZGl2aWR1Lg0KDQpgYGB7cn0NCmZlbV90d293YXlzIDwtIHBsbShQRE5fQVJFQSB+IEtNSVMgKyBSTFMgKyBUUFQgKyBQRFJCICsgQUhIICsgUEtELCBpbmRleCA9IGMoIlBST1YiLCAiVEFIVU4iKSwgbW9kZWwgPSAid2l0aGluIiwgZWZmZWN0PSAidHdvd2F5cyIsIGRhdGEgPSBjcmltZSkNCnN1bW1hcnkoZmVtX3R3b3dheXMpDQpgYGANCg0KSW50ZXJwcmV0YXNpIDoNCg0KLSAgIFNldGlhcCBrZW5haWthbiBzYXR1IHNhdHVhbiBgS01JU2AgbWVueWViYWJrYW4gYFBETl9BUkVBYCBtZW51cnVuIHNlYmVzYXIgYDIuMzU5NmUtMDNgIGRlbmdhbiBtZW5nYW5nZ2FwIHBldWJhaCBsYWluIGtvbnN0YW4uDQoNCi0gICBTZXRpYXAga2VuYWlrYW4gc2F0dSBzYXR1YW4gYFJMU2AgbWVueWViYWJrYW4gYFBETl9BUkVBYCBtZW5pbmdrYXQgc2ViZXNhciBgMS44NjMzYCBkZW5nYW4gbWVuZ2FuZ2dhcCBwZXViYWggbGFpbiBrb25zdGFuLg0KDQotICAgU2V0aWFwIGtlbmFpa2FuIHNhdHUgc2F0dWFuIGBUUFRgIG1lbnllYmFia2FuIGBQRE5fQVJFQWAgbWVudXJ1biBzZWJlc2FyIGAwLjEyNzI5YCBkZW5nYW4gbWVuZ2FuZ2dhcCBwZXViYWggbGFpbiBrb25zdGFuLg0KDQotICAgU2V0aWFwIGtlbmFpa2FuIHNhdHUgc2F0dWFuIGBQRFJCYCBtZW55ZWJhYmthbiBgUEROX0FSRUFgIG1lbnVydW4gc2ViZXNhciBgOC4wNTc4ZS0wNWAgZGVuZ2FuIG1lbmdhbmdnYXAgcGV1YmFoIGxhaW4ga29uc3Rhbi4NCg0KLSAgIFNldGlhcCBrZW5haWthbiBzYXR1IHNhdHVhbiBgQUhIYCBtZW55ZWJhYmthbiBgUEROX0FSRUFgIG1lbnVydW4gc2ViZXNhciBgMC41MzE5OWAgZGVuZ2FuIG1lbmdhbmdnYXAgcGV1YmFoIGxhaW4ga29uc3Rhbi4NCg0KLSAgIFNldGlhcCBrZW5haWthbiBzYXR1IHNhdHVhbiBgUEtEYCBtZW55ZWJhYmthbiBgUEROX0FSRUFgIG1lbnVydW4gc2ViZXNhciBgOS4yMzA5ZS0wNGAgZGVuZ2FuIG1lbmdhbmdnYXAgcGV1YmFoIGxhaW4ga29uc3Rhbi4NCg0KVW50dWsgc2VtdWEgcC12YWx1ZSBkaSBiYXdhaCA1JSwgbWFrYSB0ZXJkYXBhdCBjdWt1cCBidWt0aSB1bnR1ayBtZW5vbGFrICRIXzAkIChrdXJhbmcgZGFyaSA1JSBrZW11bmdraW5hbiBiYWh3YSAkSF8wJCBiZW5hcikuDQoNCi0gICBwLXZhbHVlIHVqaS1GIFw8IDIuMjJlLTE2IFw8XDwgNSUuIEFydGlueWEsIGRhcGF0IGRpa2F0YWthbiBiYWh3YSBtb2RlbCBsYXlhayB1bnR1ayBkaWd1bmFrYW4uDQoNCi0gICBwLXZhbHVlIHVqaS1UIHVudHVrIHBldWJhaCBgUkxTYCwgYFBEUkJgLCBkYW4gYFBLRGAgXDwgNSUuIEFydGlueWEsIGRhcGF0IGRpa2F0YWthbiBiYWh3YSBwZXViYWggdGVyc2VidXQgYmVycGVuZ2FydWggc2lnbmlmaWthbiB0ZXJoYWRhcCBtb2RlbC4NCg0KJFJeMiQgbWVydXBha2FuIG5pbGFpIHlhbmcgbWVudW5qdWthbiBrZWt1YXRhbiBodWJ1bmdhbiBhbnRhcmEgcGV1YmFoIGJlYmFzIGRhbiBwZXViYWggcmVzcG9ucy4gU2VtYWtpbiB0aW5nZ2kgbmlsYWkgJFJeMiQsIG1ha2Egc2VtYWtpbiBiYWlrIG1vZGVsIHRlcnNlYnV0Lg0KDQotICAgJFJeMiQgcGFkYSBtb2RlbCBzZWJlc2FyIDAuNDQxNDcgYXRhdSA0NC4xNDclIHlhbmcgbWVuZ2luZGlrYXNpa2FuIGJhaHdhIHBldWJhaCB5YW5nIGRpZ3VuYWthbiBrdXJhbmcgYmFpayBkYWxhbSBtZW5nZ2FtYmFya2FuIG1vZGVsLg0KDQpgYGB7cn0NCmRhdGEuZnJhbWUoc3VtbWFyeShmaXhlZihmZW1fdHdvd2F5cywgZWZmZWN0PSJ0d293YXlzIikpKQ0KYGBgDQoNCk5pbGFpIGRpYXRhcyBhZGFsYWggbmlsYWkgcGVuZ2FydWgga29uc3RhbiBkYXJpIGdhYnVuZ2FuIG1hc2luZy1tYXNpbmcgaW5kaXZpZHUgZGFuIHdha3R1IHlhbmcgcGFkYSBtb2RlbCBkYXBhdCBkaXR1bGlza2FuIHNlYmFnYWkgJGZfaStcbGFtYmRhX3QkLg0KDQojIFBlcmJhbmRpbmdhbiBLZWJhaWthbiBGRU0gSW5kaXZpZHUsIFdha3R1LCBkYW4gVHdvd2F5cw0KDQpIaXBvdGVzaXMgcGFkYSB1amkgaW5pIHlhaXR1IDoNCg0KLSAgIFVudHVrIG1lbmd1amkgcGVuZ2FydWggaW5kaXZpZHUNCg0KJCQNClxiZWdpbnthbGlnbmVkfQ0KSF97MH0gJjogXHRleHR7VGlkYWsgYWRhIHBlbmdhcnVoIHNwZXNpZmlrIGluZGl2aWR1fSBcXA0KSF97MX0gJjogXHRleHR7QWRhIHBlbmdhcnVoIHNwZXNpZmlrIGluZGl2aWR1fQ0KXGVuZHthbGlnbmVkfQ0KJCQNCg0KLSAgIFVudHVrIG1lbmd1amkgcGVuZ2FydWggd2FrdHUNCg0KJCQNClxiZWdpbnthbGlnbmVkfQ0KSF97MH0gJjogXHRleHR7VGlkYWsgYWRhIHBlbmdhcnVoIHNwZXNpZmlrIHdha3R1fSBcXA0KSF97MX0gJjogXHRleHR7QWRhIHBlbmdhcnVoIHNwZXNpZmlrIHdha3R1fQ0KXGVuZHthbGlnbmVkfQ0KJCQNCg0KU3RhdHNpdGlrIFVqaSB5YW5nIGRpZ3VuYWthbiA6DQoNCi0gICBQZW5nYXJ1aCBpbmRpdmlkdQ0KDQokJA0KXGJlZ2lue2FsaWduZWR9DQpGX3tIaXR1bmd9ID0gXGZyYWN7SktHX3tNR30gLSBKS0dfe01QVEl9fXtKS0dfe01QVEl9fSAuIFxmcmFje05ULU4tS317Ti0xfQ0KXGVuZHthbGlnbmVkfQ0KJCQNCg0KLSAgIFBlbmdhcnVoIFdha3R1DQoNCiQkDQpcYmVnaW57YWxpZ25lZH0NCkZfe0hpdHVuZ30gPSBcZnJhY3tKS0dfe01HfSAtIEpLR197TVBUV319e0pLR197TVBUV319IC4gXGZyYWN7Ti1ULUt9e1QtMX0NClxlbmR7YWxpZ25lZH0NCiQkDQoNCiMjIFVqaSBTaWduaWZpa2FzaSBQZW5nYXJ1aCBJbmRpdmlkdSAvIFdha3R1IC8gVHdvIHdheXMNCg0KIyMjIFVqaSBwZW5nYXJ1aCBpbmRpdmlkdQ0KDQpgYGB7cn0NCnBsbXRlc3QoZmVtX3R3b3dheXMsIHR5cGUgPSAiYnAiLCBlZmZlY3QgPSAiaW5kaXZpZHVhbCIpDQpgYGANCg0KIyMjIFVqaSBwZW5nYXJ1aCB3YWt0dQ0KDQpgYGB7cn0NCnBsbXRlc3QoZmVtX3R3b3dheXMsIHR5cGUgPSAiYnAiLCBlZmZlY3QgPSAidGltZSIpDQpgYGANCg0KIyMjIFVqaSBwZW5nYXJ1aCB0d293YXlzDQoNCmBgYHtyfQ0KcGxtdGVzdChmZW1fdHdvd2F5cywgdHlwZSA9ICJicCIsIGVmZmVjdCA9ICJ0d293YXlzIikNCmBgYA0KDQpEYXJpIGtldGlnYSB1amkgZGlhdGFzIGRpZGFwYXQgbmlsYWkgKnAtdmFsdWUqIHlhbmcgbGViaWgga2VjaWwgZGFyaSAwLjA1IHlhbmcgYmVyYXJ0aSBrZXB1dHVzYW5ueWEgYWRhbGFoIFRhayBUb2xhayAkSF8wJCBhdGF1IHRlcmRhcGF0IHBlbmdhcnVoIHlhbmcgc2lnbmlmaWthbiBiYWlrIGRhcmkgaW5kaXZpZHUsIHdha3R1LCBhdGF1IGtlZHVhbnlhIHNlY2FyYSBiZXJzYW1hYW4uIFNlaGluZ2dhLCBraXRhIHBlcmx1IG1lbGloYXQgbWV0cmlrIGxhaW4gZGFsYW0gbWVuZW50dWthbiBtZXRvZGUgdGVycGlsaWguDQoNCiMjIE5pbGFpIEtlYmFpa2FuIE1vZGVsDQoNCmBgYHtyfQ0KIyBTdW0gU3F1YXJlZCBFcnJvcg0KZHNzZSA8LSBkYXRhLmZyYW1lKEluZGl2aWR1PXN1bShmZW1faW5kJHJlc2lkdWFsc14yKSxUaW1lPXN1bShmZW1fdGltZSRyZXNpZHVhbHNeMiksVHdvd2F5cz1zdW0oZmVtX3R3b3dheXMkcmVzaWR1YWxzXjIpKQ0KDQojIEFJQw0KbHNkdl9pbmQgPC0gbG0oUEROX0FSRUEgfiBLTUlTICsgUkxTICsgVFBUICsgUERSQiArIEFISCArIFBLRCArIFBST1YsIGNyaW1lKQ0KbHNkdl90aW1lIDwtIGxtKFBETl9BUkVBIH4gS01JUyArIFJMUyArIFRQVCArIFBEUkIgKyBBSEggKyBQS0QgKyBUQUhVTiwgY3JpbWUpDQpsc2R2X3R3b3dheXMgPC0gbG0oUEROX0FSRUEgfiBLTUlTICsgUkxTICsgVFBUICsgUERSQiArIEFISCArIFBLRCArIFBST1YgKyBUQUhVTiwgY3JpbWUpDQoNCmRhaWMgPC0gZGF0YS5mcmFtZShJbmRpdmlkdT1BSUMobHNkdl9pbmQpLFRpbWU9QUlDKGxzZHZfdGltZSksVHdvd2F5cz1BSUMobHNkdl90d293YXlzKSkNCg0KIyBNQVBFDQptYXBlIDwtIGZ1bmN0aW9uKGFjdHVhbCwgZm9yZWNhc3QpIHsNCiAgbWVhbihhYnMoKGFjdHVhbCAtIGZvcmVjYXN0KSAvIGFjdHVhbCkpICogMTAwDQp9DQpkbWFwZSA8LSBkYXRhLmZyYW1lKEluZGl2aWR1PW1hcGUoY3JpbWUkUEROX0FSRUEscHJlZGljdChmZW1faW5kKSksDQogICAgICAgICAgICAgICAgICAgIFRpbWU9bWFwZShjcmltZSRQRE5fQVJFQSxwcmVkaWN0KGZlbV90aW1lKSksDQogICAgICAgICAgICAgICAgICAgIFR3b3dheXM9bWFwZShjcmltZSRQRE5fQVJFQSxwcmVkaWN0KGZlbV90d293YXlzKSkpDQojIEJJQw0KZGJpYyA8LSBkYXRhLmZyYW1lKEluZGl2aWR1PUJJQyhsc2R2X2luZCksVGltZT1CSUMobHNkdl90aW1lKSxUd293YXlzPUJJQyhsc2R2X3R3b3dheXMpKQ0KDQojIFItc3F1YXJlZA0KaW5kIDwtIHN1bW1hcnkoZmVtX2luZCkNCnRpbWUgPC0gc3VtbWFyeShmZW1fdGltZSkNCnR3YXlzIDwtIHN1bW1hcnkoZmVtX3R3b3dheXMpDQpkcnNxIDwtIGRhdGEuZnJhbWUoSW5kaXZpZHU9aW5kJHIuc3F1YXJlZCxUaW1lPXRpbWUkci5zcXVhcmVkLFR3b3dheXM9dHdheXMkci5zcXVhcmVkKQ0KDQojIFBlcmJhbmRpbmdhbg0KY29tcGFyZSA8LSB0KHJiaW5kKGRzc2UsZGFpYyxkYmljLGRtYXBlLGRyc3EpKQ0KY29sbmFtZXMoY29tcGFyZSkgPC0gYygiU1NFIiwiQUlDIiwiQklDIiwgIk1BUEUiLCJSLVNxdWFyZWQiLCJBZGogUi1TcXVhcmVkIikNCmNvbXBhcmUNCmBgYA0KDQpEYXJpIGhhc2lsIGRpIGF0YXMsIGRhcGF0IHRlcmxpaGF0IGJhaHdhIG1lc2lwdW4gbW9kZWwgcGVuZ2FydWggd2FrdHUgbWVydXBha2FuIG1vZGVsIHlhbmcgcGFsaW5nIHNpZ25pZmlrYW4gZGVuZ2FuIG5pbGFpIFItU3F1YXJlZCB5YW5nIGJlc2FyIGppa2EgZGliYW5kaW5na2FuIGRlbmdhbiB5YW5nIGxhaW4sIHRldGFwaSBlcnJvciB5YW5nIGRpZGFwYXQgb2xlaCBtb2RlbCB3YWt0dSBzYW5nYXRsYWggdGluZ2dpLiBPbGVoIGthcmVuYSBpdHUsIGFrYW4gZGlwaWxpaCBtb2RlbCBUd293YXlzIHlhbmcgbWVtaWxpa2kgbmlsYWkgZXJyb3IgcmVsYXRpZiBsZWJpaCByZW5kYWggZGFyaXBhZGEgbW9kZWwgSW5kaXZpZHUuDQoNCiMgRkVNIHZzIENFTQ0KDQpVbnR1ayBtZW1iYW5kaW5na2FuIGtlYmFpa2FuIG1vZGVsIEZFTSBhdGF1IENFTSwgdWppIENob3cgYWthbiBkaWd1bmFrYW4uIFVqaSBDaG93IGFkYWxhaCB1amkgZm9ybWFsIHVudHVrIG1lbmd1amkgYWRhIGF0YXUgdGlkYWtueWEgcGVuZ2FydWggc3Blc2lmaWsgaW5kaXZpZHUgZGFuIHBlbmdhcnVoIHNwZXNpZmlrIHdha3R1IHBhZGEgZGF0YSBwYW5lbC4NCg0KJCQNClxiZWdpbnthbGlnbmVkfQ0KSF8wICY6IFx0ZXh0e01vZGVsIENvbW1vbiBFZmZlY3R9IFxcDQpIXzEgJjogXHRleHR7TW9kZWwgRml4ZWQgRWZmZWN0fQ0KXGVuZHthbGlnbmVkfQ0KJCQNCg0KJEhfMCQgYWthbiBkaXRvbGFrIGFwYWJpbGEgYHAtdmFsdWVgIGxlYmloIGtlY2lsIGRhcmkgYGFscGhhYCB5YWl0dSAwLjA1DQoNCmBgYHtyfQ0KcG9vbHRlc3QoY2VtLCBmZW1fdHdvd2F5cykNCmBgYA0KDQpOaWxhaSBgcC12YWx1ZWAgc2ViZXNhciAkMi4yZS0xNiQgYmVyYXJ0aSBrZXB1dHVzYW4gKlRvbGFrIEgwKiBhdGF1IG1vZGVsIGZpeGVkIGVmZmVjdCBsZWJpaCBsYXlhayBkaWd1bmFrYW4gcGFkYSBkYXRhIGluaS4NCg0KIyBSYW5kb20tRWZmZWN0IE1vZGVsDQoNCk1vZGVsIHBlbmdhcnVoIGFjYWsgbWVuZ2FzdW1zaWthbiB0aWRhayBhZGEga29yZWxhc2kgYW50YXJhIHBlbmdhcnVoIHNwZXNpZmlrIGluZGl2aWR1IGRhbiBwZW5nYXJ1aCBzcGVzaWZpayB3YWt0dSBkZW5nYW4gcGV1YmFoIGJlYmFzLiBBc3Vtc2kgaW5pIG1lbWJ1YXQga29tcG9uZW4gc2lzYWFuIGRhcmkgcGVuZ2FydWggc3Blc2lmaWsgaW5kaXZpZHUgZGFuIHBlbmdhcnVoIHNwZXNpZmlrIHdha3R1IGRpbWFzdWthbiBrZWRhbGFtIHNpc2Fhbi4gTW9kZWwgc2lzYWFuIHNhdHUgYXJhaCB5YWl0dToNCg0KJCQNClxiZWdpbnthbGlnbmVkfQ0KeV97aXR9ICY9IFxhbHBoYSArICBcYmV0YV97MX14X3sxLGl0fSsNClxiZXRhX3syfXhfezIsaXR9Ky4uLitcYmV0YV97a314X3trLGl0fSsgZl97aX0gK1x2YXJlcHNpbG9uX3tpdH1cICBcdGV4dHsocGVuZ2FydWggSW5kaXZpZHUpfQ0KIFxcDQpcZW5ke2FsaWduZWR9DQokJA0KDQokJA0KXGJlZ2lue2FsaWduZWR9DQp5X3tpdH0gJj0gXGFscGhhICsgIFxiZXRhX3sxfXhfezEsaXR9Kw0KXGJldGFfezJ9eF97MixpdH0rLi4uK1xiZXRhX3trfXhfe2ssaXR9KyBcbGFtYmRhX3t0fSArXHZhcmVwc2lsb25fe2l0fQ0KXFwNClxlbmR7YWxpZ25lZH0NCiQkDQoNCk1vZGVsIHNpc2FhbiBkdWEgYXJhaCB5YWl0dToNCg0KJCQNClxiZWdpbnthbGlnbmVkfQ0KeV97aXR9ICY9IFxhbHBoYSArIFxiZXRhX3sxfXhfezEsaXR9Kw0KXGJldGFfezJ9eF97MixpdH0rLi4uK1xiZXRhX3trfXhfe2ssaXR9KyBmX3tpfSsgXGxhbWJkYV97dH0NCitcdmFyZXBzaWxvbl97aXR9IFxcDQpcZW5ke2FsaWduZWR9DQokJCBEZW5nYW4gJFxhbHBoYSQgbWVydXBha2FuIGludGVyc2VwIG1vZGVsIGRhbiAkZl9pJCBkYW4gJFxsYW1iZGFfdCQgbWVydXBha2FuIHBlbmdhcnVoIGFjYWsgbWFzaW5nLW1hc2luZyBpbmRpdmlkdSBkYW4gd2FrdHUuIFBlbmR1Z2FhbiBwYXJhbWV0ZXIgbW9kZWwgcGVuZ2FydWggYWNhayBtZW5nZ3VuYWthbiBHZW5lcmFsaXplZCBMZWFzdCBTcXVhcmUgKEJhbHRhZ2kgMjAwOCkuDQoNCiMjIEdlbmVyYWxpemVkIExlYXN0IFNxdWFyZQ0KDQpBbmFsaXNpcyBkYXRhIHBhbmVsIHRpZGFrIHNlcGVudWhueWEgbWVuZ2lrdXRpIHByb3NlZHVyIHJlZ3Jlc2kgYmlhc2EgeWFuZyB0aWRhayBkYXBhdCBtZW5qZWxhc2thbiBrZXJhZ2FtYW4gZGF0YS4gUGVybHVueWEgbWVtcGVydGltYmFuZ2thbiBrZXJhZ2FtYW4gZGF0YSB0ZXJzZWJ1dCB1bnR1ayBkYXBhdCBtZW5nZXRhaHVpIGRhbGFtIHBlbmdnYWxpYW4gbGViaWggbGFuanV0IHRlcmhhZGFwIGluZm9ybWFzaSB5YW5nIGRpa2FuZHVuZyBkYXRhLiBTYWxhaCBzYXR1IGNhcmEgdW50dWsgbWVsYWt1a2FuIGhhbCB0ZXJzZWJ1dCB5YWl0dSBkZW5nYW4gbWV0b2RlIEdlbmVyYWxpemVkIExlYXN0IFNxdWFyZSAoR0xTKS4gR0xTIGRpcGFrYWkgc2ViYWdhaSBlc3RpbWF0b3IgYW5hbGlzaXMgZGF0YSBwYW5lbCBkZW5nYW4gcGVyc2FtYWFuIHNpc3RlbSBrYXJlbmEgaW5mb3JtYXNpIGhldGVyb2dlbml0YXMgYW50YXJhIGluZGl2aWR1IGRhbiB3YWt0dSBkaWd1bmFrYW4gc2ViYWdhaSBpbmZvcm1hc2kgeWFuZyBwZW50aW5nIHVudHVrIG1lbmdoYXNpbGthbiBwYXJhbWV0ZXIgJFxoYXR7XGJldGF9JCBQZXJzYW1hYW4gZGFsYW0gcGVuZHVnYWFuIHBhcmFtZXRlciBHTFMgYWRhbGFoIHNlYmFnYWkgYmVyaWt1dC4NCg0KJCQNClxiZWdpbnthbGlnbmVkfQ0KXGhhdCB7XGJldGF9ICY9IChYJyhcc3VtKV57LTF9IFggKV57LTF9ICBYJyhcc3VtKSBeey0xfQ0KeSAgXFwNClxlbmR7YWxpZ25lZH0NCiQkDQoNCk1ldG9kZSBHTFMgbWVtYXN1a2thbiBzdHJ1a3R1ciBtYXRyaWtzIHJhZ2FtIHBlcmFnYW0gcmVzaWR1YWwgcGFkYSBwYXJhbWV0ZXIgJFxoYXR7XGJldGF9JCAoRWthbmFuZGEgMjAxNikuDQoNCiMjIFBlbmR1Z2FhbiBQYXJhbWV0ZXINCg0KSmlrYSBwYWRhIG1vZGVsIEZFTSBtZW5nYXN1bXNpa2FuIGJhaHdhIG5pbGFpIGRhcmkgcGVuZ2FydWggc3Blc2lmaWsgaW5kaXZpZHUgYmVyc2lmYXQgZml4ZWQgcGFkYSBzZXRpYXAgdW5pdCwgbWFrYSBwYWRhIG1vZGVsIHJhbmRvbSBlZmZlY3QgZGlhc3Vtc2lrYW4gYmFod2EgcGVuZ2FydWggdGVyc2VidXQgYmVyc2lmYXQgYWNhay4gRGFsYW0gaGFsIGluaSBtaXNhbG55YSBtb2RlbCBvbmUgd2F5IGluZGl2aWR1IHBhZGEgZGF0YSBHcnVuZGZlbGQsIG1ha2Ega2UtMTAgZmlybSBtZW1pbGlraSBuaWxhaSByYXRhYW4gdW11bSBpbnRlcnNlcCB5YW5nIHNhbWEsIHNlZGFuZ2thbiBwZXJiZWRhYW4gaW50ZXJzZXAgYW50YXIgbWFzaW5nLW1hc2luZyB1bml0IGZpcm0gZGlyZWZsZWtzaWthbiBwYWRhIGVycm9yIHRlcm1ueWEuDQoNCmBgYHtyfQ0KcmVtX2dscyA8LSBwbG0oUEROX0FSRUEgfiBLTUlTICsgUkxTICsgVFBUICsgUERSQiArIEFISCArIFBLRCwgZGF0YSA9IGNyaW1lLCANCiAgICAgICAgICAgICAgICAgICAgaW5kZXggPSBjKCJQUk9WIiwgIlRBSFVOIiksIA0KICAgICAgICAgICAgICAgICAgICBlZmZlY3QgPSAidHdvd2F5cyIsIG1vZGVsID0gInJhbmRvbSIsIHJhbmRvbS5tZXRob2QgPSAibmVybG92ZSIpDQpzdW1tYXJ5KHJlbV9nbHMpDQpgYGANCg0KSW50ZXJwcmV0YXNpIDoNCg0KLSAgIFNldGlhcCBrZW5haWthbiBzYXR1IHNhdHVhbiBgS01JU2AgbWVueWViYWJrYW4gYFBETl9BUkVBYCBtZW51cnVuIHNlYmVzYXIgYDAuMDE3Njg0YCBkZW5nYW4gbWVuZ2FuZ2dhcCBwZXViYWggbGFpbiBrb25zdGFuLg0KDQotICAgU2V0aWFwIGtlbmFpa2FuIHNhdHUgc2F0dWFuIGBSTFNgIG1lbnllYmFia2FuIGBQRE5fQVJFQWAgbWVuaW5na2F0IHNlYmVzYXIgYDIuMDk1N2AgZGVuZ2FuIG1lbmdhbmdnYXAgcGV1YmFoIGxhaW4ga29uc3Rhbi4NCg0KLSAgIFNldGlhcCBrZW5haWthbiBzYXR1IHNhdHVhbiBgVFBUYCBtZW55ZWJhYmthbiBgUEROX0FSRUFgIG1lbnVydW4gc2ViZXNhciBgMC4xMjM0N2AgZGVuZ2FuIG1lbmdhbmdnYXAgcGV1YmFoIGxhaW4ga29uc3Rhbi4NCg0KLSAgIFNldGlhcCBrZW5haWthbiBzYXR1IHNhdHVhbiBgUERSQmAgbWVueWViYWJrYW4gYFBETl9BUkVBYCBtZW51cnVuIHNlYmVzYXIgYDcuMzQ5MGUtMDVgIGRlbmdhbiBtZW5nYW5nZ2FwIHBldWJhaCBsYWluIGtvbnN0YW4uDQoNCi0gICBTZXRpYXAga2VuYWlrYW4gc2F0dSBzYXR1YW4gYEFISGAgbWVueWViYWJrYW4gYFBETl9BUkVBYCBtZW51cnVuIHNlYmVzYXIgYDAuMTQ0MTJgIGRlbmdhbiBtZW5nYW5nZ2FwIHBldWJhaCBsYWluIGtvbnN0YW4uDQoNCi0gICBTZXRpYXAga2VuYWlrYW4gc2F0dSBzYXR1YW4gYFBLRGAgbWVueWViYWJrYW4gYFBETl9BUkVBYCBtZW51cnVuIHNlYmVzYXIgYDMuOTY1OWUtMDRgIGRlbmdhbiBtZW5nYW5nZ2FwIHBldWJhaCBsYWluIGtvbnN0YW4uDQoNClVudHVrIHNlbXVhIHAtdmFsdWUgZGkgYmF3YWggNSUsIG1ha2EgdGVyZGFwYXQgY3VrdXAgYnVrdGkgdW50dWsgbWVub2xhayAkSF8wJCAoa3VyYW5nIGRhcmkgNSUga2VtdW5na2luYW4gYmFod2EgJEhfMCQgYmVuYXIpLg0KDQotICAgcC12YWx1ZSB1amktRiBcPCAyLjIyZS0xNiBcPFw8IDUlLiBBcnRpbnlhLCBkYXBhdCBkaWthdGFrYW4gYmFod2EgbW9kZWwgbGF5YWsgdW50dWsgZGlndW5ha2FuLg0KDQotICAgcC12YWx1ZSB1amktVCB1bnR1ayBwZXViYWggYFJMU2AgZGFuIGBQRFJCYCBcPCA1JS4gQXJ0aW55YSwgZGFwYXQgZGlrYXRha2FuIGJhaHdhIHBldWJhaCB0ZXJzZWJ1dCBiZXJwZW5nYXJ1aCBzaWduaWZpa2FuIHRlcmhhZGFwIG1vZGVsLg0KDQokUl4yJCBtZXJ1cGFrYW4gbmlsYWkgeWFuZyBtZW51bmp1a2FuIGtla3VhdGFuIGh1YnVuZ2FuIGFudGFyYSBwZXViYWggYmViYXMgZGFuIHBldWJhaCByZXNwb25zLiBTZW1ha2luIHRpbmdnaSBuaWxhaSAkUl4yJCwgbWFrYSBzZW1ha2luIGJhaWsgbW9kZWwgdGVyc2VidXQuDQoNCi0gICAkUl4yJCBwYWRhIG1vZGVsIHNlYmVzYXIgMC4zOTA1MyBhdGF1IDM5LjA1MyUgeWFuZyBtZW5naW5kaWthc2lrYW4gYmFod2EgcGV1YmFoIHlhbmcgZGlndW5ha2FuIGt1cmFuZyBiYWlrIGRhbGFtIG1lbmdnYW1iYXJrYW4gbW9kZWwuDQoNCiMjIFBlcmJhbmRpbmdhbiBLZWJhaWthbiBSRU0NCg0KIyMjIFVqaSBQZW5nYXJ1aCBJbmRpdmlkdQ0KDQpgYGB7cn0NCiNlZmVrIGluZGl2aWR1DQpwbG10ZXN0KHJlbV9nbHMsdHlwZSA9ICJicCIsIGVmZmVjdD0iaW5kaXZpZHUiKQ0KYGBgDQoNCkthcmVuYSBuaWxhaSBwLXZhbHVlIFw8IDAuMDUsIG1ha2EgdG9sYWsgJEhfMCQgYXRhdSBwZW5nYXJ1aCBpbmRpdmlkdSBzaWduaWZpa2FuIHRlcmhhZGFwIG1vZGVsLg0KDQojIyMgVWppIHBlbmdhcnVoIHdha3R1DQoNCmBgYHtyfQ0KI2VmZWsgd2FrdHUgDQpwbG10ZXN0KHJlbV9nbHMsdHlwZSA9ICJicCIsIGVmZmVjdD0idGltZSIpDQpgYGANCg0KS2FyZW5hIG5pbGFpIHAtdmFsdWUgXDwgMC4wNSwgbWFrYSB0b2xhayAkSF8wJCBhdGF1IHBlbmdhcnVoIHdha3R1IHNpZ25pZmlrYW4gdGVyaGFkYXAgbW9kZWwuIEFydGlueWEsIG1vZGVsIHR3b3dheXMgdGVwYXQgZGlndW5ha2FuIHVudHVrIG1ldG9kZSBSRU0uDQoNCiMjIyBVamkgcGVuZ2FydWggdHdvd2F5cw0KDQpgYGB7cn0NCiNlZmVrIHdha3R1IA0KcGxtdGVzdChyZW1fZ2xzLHR5cGUgPSAiYnAiLCBlZmZlY3Q9InR3b3dheXMiKQ0KYGBgDQoNCmBgYHtyLCB3YXJuaW5nPUZ9DQp0aWR5X3JhbmVmIDwtIHRpZHkocmFuZWYocmVtX2dscywgZWZmZWN0PSJpbmRpdmlkdWFsIikpDQpjb2xuYW1lcyh0aWR5X3JhbmVmKSA8LSBjKCJQcm92aW5zaSIsICJQZW5nYXJ1aCBBY2FrIEluZGl2aWR1IikNCnRpZHlfcmFuZWYNCmBgYA0KDQpPdXRwdXQgZGlhdGFzIG1lcnVwYWthbiBwZW5nYXJ1aCBhY2FrIGRhcmkgc2V0aWFwIHVuaXQgaW5kaXZpZHUsIG5pbGFpIHRlcnNlYnV0IHRlcnNlYnV0IG1lbnVuanVra2FuIHNlYmVyYXBhIGJlc2FyIHBlcmJlZGFhbiBuaWxhaSBrb21wb25lbiBlcnJvciBhY2FrIG1hc2luZy1tYXNpbmcgdW5pdCBpbmR2aWR1IHRlcmhhZGFwIG5pbGFpIGludGVyc2VwIHVtdW0uDQoNCmBgYHtyLCB3YXJuaW5nPUZ9DQp0aWR5X3JhbmVmIDwtIHRpZHkocmFuZWYocmVtX2dscywgZWZmZWN0PSJ0aW1lIikpDQpjb2xuYW1lcyh0aWR5X3JhbmVmKSA8LSBjKCJUYWh1biIsICJQZW5nYXJ1aCBBY2FrIFdha3R1IikNCnRpZHlfcmFuZWYNCmBgYA0KDQpPdXRwdXQgZGlhdGFzIG1lcnVwYWthbiBwZW5nYXJ1aCBhY2FrIGRhcmkgc2V0aWFwIHVuaXQgd2FrdHUsIG5pbGFpIHRlcnNlYnV0IHRlcnNlYnV0IG1lbnVuanVra2FuIHNlYmVyYXBhIGJlc2FyIHBlcmJlZGFhbiBuaWxhaSBrb21wb25lbiBlcnJvciBhY2FrIG1hc2luZy1tYXNpbmcgdW5pdCB3YWt0dSB0ZXJoYWRhcCBuaWxhaSBpbnRlcnNlcCB1bXVtLg0KDQojIEZFTSB2cyBSRU0NCg0KIyMgVWppIEhhdXNzbWFuDQoNClBhZGEgYmFnaWFuIHNlYmVsdW1ueWEsIGN1a3VwIGJ1a3RpIHlhbmcgbWVueWF0YWthbiBiYWh3YSBtb2RlbCBGRU0gbGViaWggYmFpayBkYXJpcGFkYSBtb2RlbCBDRU0uIE9sZWgga2FyZW5hIGl0dSwgdGFoYXAgc2VsYW5qdXRueWEgYWthbiBkaWJhbmRpbmdrYW4ga2ViYWlrYW4gbW9kZWwgRkVNIGppa2EgZGliYW5kaW5nIG1vZGVsIFJFTS4gVWppIHlhbmcgZGlndW5ha2FuIGFkYWxhaCB1amkgYEhhdXNtYW5gIGRlbmdhbiBtZW5nZ3VuYWthbiBmdW5nc2kgYHBodGVzdChGRU0sUkVNKWAuDQoNClBlbmd1amlhbiBpbmkgZGlsYWt1a2FuIHVudHVrIG1lbWlsaWggbW9kZWwgYW50YXJhIG1vZGVsIHBlbmdhcnVoIHRldGFwIGF0YXUgbW9kZWwgcGVuZ2FydWggYWNhayB5YW5nIHNlc3VhaSB1bnR1ayBtZW5nZ2FtYmFya2FuIHN1YXR1IGRhdGEgcGFuZWwuIFVqaSBIYXVzbWFuIGRpZGFzYXJrYW4gcGFkYSBwZXJiZWRhYW4gcGVuZHVnYSBtb2RlbCBwZW5nYXJ1aCB0ZXRhcCAkXGhhdHtcYmV0YX1fe01QVH0kIGRlbmdhbiBwZW5kdWdhIG1vZGVsIHBlbmdhcnVoIGFjYWsgJFxoYXR7XGJldGF9X3tNUEF9JC4gS2VkdWEgcGVuZHVnYSBrb25zaXN0ZW4gZGFsYW0ga29uZGlzaSAkSF8wJCwgdGV0YXBpICRcaGF0e1xiZXRhfV97TVBBfSQgYWthbiBiaWFzIGRhbiB0aWRhayBrb25zaXN0ZW4gcGFkYSAkSF8xJC4gUGVuZ3VqaWFuIGhpcG90ZXNpc255YSBhZGFsYWg6DQoNCiRIXzAkOiBNb2RlbCBwZW5nYXJ1aCBhY2FrIChSRU0pIGFkYWxhaCBtb2RlbCB5YW5nIHRlcGF0DQoNCiRIXzEkOiBNb2RlbCBwZW5nYXJ1aCB0ZXRhcCAoRkVNKSBhZGFsYWggbW9kZWwgeWFuZyB0ZXBhdA0KDQpgYGB7cn0NCiNmZW0gZGVuZ2FuIHJlbSBnbHMNCnBodGVzdChmZW1fdHdvd2F5cywgcmVtX2dscykNCmBgYA0KDQpLYXJlbmEgbmlsYWkgcC12YWx1ZSB5YW5nIGRpcGVyb2xlaCBsZWJpaCBkYXJpIGRhcmkgYWxwaGEgNSUsIG1ha2EgVGVyaW1hIEgwIHlhbmcgbWVuZ2luZGlrYXNpa2FuIGJhaHdhICoqbW9kZWwgeWFuZyBzZXN1YWkgYWRhbGFoIG1vZGVsIFJFTSoqLg0KDQojIFVKaSBEaWFnbm9zdGlrIFNpc2Fhbg0KDQojIyBOb3JtYWxpdGFzDQoNCmBgYHtyfQ0Ka3MudGVzdChyZW1fZ2xzJHJlc2lkdWFscywgInBub3JtIiwgDQogICAgICAgIG1lYW49bWVhbihyZW1fZ2xzJHJlc2lkdWFscyksIA0KICAgICAgICBzZD1zZChyZW1fZ2xzJHJlc2lkdWFscykpDQpgYGANCg0KIyMjICpIaXN0b2dyYW0qDQoNCmBgYHtyfQ0KIyBIaXN0b2dyYW0gDQpnZ3Bsb3QoYXMuZGF0YS5mcmFtZShyZW1fZ2xzJHJlc2lkdWFscyksIGFlcyh4ID0gcmVtX2dscyRyZXNpZHVhbHMpKSArDQogIGdlb21faGlzdG9ncmFtKGFlcyh5ID0gYWZ0ZXJfc3RhdChkZW5zaXR5KSksIGNvbG9yID0gIndoaXRlIiwgZmlsbCA9ICJzdGVlbGJsdWUiKSArDQogIGdlb21fZGVuc2l0eShjb2xvciA9ICJyZWQiLCBsaW5ld2lkdGggPSAxKSArDQogIHRoZW1lX21pbmltYWwoKQ0KYGBgDQoNCiMjIFVqaSBBdXRva29yZWxhc2kNCg0KYGBge3J9DQpwYmd0ZXN0KHJlbV9nbHMpDQpgYGANCg0KIyMgVWppIEtlaG9tb2dlbmFuDQoNCmBgYHtyfQ0KYnB0ZXN0KHJlbV9nbHMpDQpgYGANCg0KS2VzaW1wdWxhbiB1amkgZGlhZ25vc3RpayA6DQoNCi0gICBTaXNhYW4gdGlkYWsgbWVueWViYXIgbm9ybWFsIChBc3Vtc2kga2Vub3JtYWxhbiB0aWRhayB0ZXJwZW51aGkpDQotICAgU2lzYWFuIG1lbWlsaWtpIGF1dG9rb3JlbGFzaSAoQXN1bXNpIGtlYmViYXNhbiBiZWx1bSB0ZXJwZW51aGkpDQotICAgKipTaXNhYW4gdGlkYWsgaG9tb2dlbiAoQXN1bXNpIGtlaG9tb2dlbmFuIGJlbHVtIHRlcnBlbnVoaSkqKg0KDQpUZXJsaWhhdCBiYWh3YSBhc3Vtc2kga2Vob21vZ2VuYW4gdGlkYWsgdGVycGVudWhpLiBPbGVoIGthcmVuYSBpdHUsIGRpcGVybHVrYW4gcGVuYW5nYW5hbiB5YWl0dSBkZW5nYW4gbWVuZ2d1bmFrYW4gQW5hbGlzaXMgR2VvZ3JhcGhpY2FsbHkgV2VpZ2h0ZWQgUGFuZWwgUmVncmVzc2lvbi4NCg0KIyBHZW9ncmFwaGljYWxseSBXZWlnaHRlZCBQYW5lbCBSZWdyZXNzaW9uDQoNCklkZSB1dGFtYSBhbmFsaXNpcyBHZW9ncmFwaGljYWxseSBXZWlnaHRlZCBQYW5lbCBSZWdyZXNzaW9uIChHV1BSKSBzYW1hIGhhbG55YSBkZW5nYW4gYW5hbGlzaXMgR1dSIGNyb3NzLXNlY3Rpb25hbC4gQW5hbGlzaXMgR1dQUiBtZW5nYXN1bXNpa2FuIHJ1bnR1dGFuIHdha3R1IGRhcmkgb2JzZXJ2YXNpIHBhZGEgc2VidWFoIGxva2FzaSBnZW9ncmFmaXMgbWVydXBha2FuIHJlYWxpc2FzaSBkYXJpIHNlYnVhaCBwcm9zZXMgc21vb3RoIHNwYXRpb3RlbXBvcmFsLiBQcm9zZXMgaW5pIG1lbmdpa3V0aSBzZWJ1YWggZGlzdHJpYnVzaSBvYnNlcnZhc2kgdGVyZGVrYXQgbGViaWggYmVyaHVidW5nYW4gZGFyaSBwYWRhIG9ic2VydmFzaSB5YW5nIGphdWguIEFuYWxpc2lzIEdXUFIgYmVydHVqdWFuIG1lbmdnYWJ1bmdrYW4gc2VjYXJhIGtlc2VsdXJ1aGFuIGxva2FzaSBkYW4gb2JzZXJ2YXNpIChZdSAyMDEwKS4gUGVuZHVnYWFuIHBhcmFtZXRlciBtb2RlbCBHV1BSIG1lbmdndW5ha2FuIHBlbmRla2F0YW4gV2VpZ2h0ZWQgTGVhc3QgU3F1YXJlIChXTFMpIHNlcGVydGkgcGFkYSBtb2RlbCBHV1IuDQoNCiMjIElucHV0IExhdGl0dWRlIExvbmdpdHVkZQ0KDQpgYGB7cixtZXNzYWdlPUYsd2FybmluZz1GfQ0KbGlicmFyeShqc29ubGl0ZSkNCg0Kd2lsYXlhaCA8LSBmcm9tSlNPTigiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3l1c3Vmc3lhaWZ1ZGluL3dpbGF5YWgtaW5kb25lc2lhL21hc3Rlci9kYXRhL2xpc3Rfb2ZfYXJlYS9wcm92aW5jZXMuanNvbiIpDQp3aWxheWFoDQpkYXRhLnNwLkdXUFIgPC0gY3JpbWUgJT4lIA0KICBtdXRhdGUoTEFUPXJlcCh3aWxheWFoJGxhdGl0dWRlLDYpLCBMT05HPXJlcCh3aWxheWFoJGxvbmdpdHVkZSw2KSkgJT4lIA0KICBzZWxlY3QoUFJPViwgVEFIVU4sIExBVCwgTE9ORywgZXZlcnl0aGluZygpKQ0KZGF0YS5zcC5HV1BSDQpgYGANCg0KIyMgTW9kZWxpbmcgR1dQUg0KDQpgYGB7ciwgd2FybmluZz1GLCAgbWVzc2FnZT1GfQ0KbGlicmFyeShHV21vZGVsKQ0KY29vcmRpbmF0ZXMoZGF0YS5zcC5HV1BSKT0zOjQNCmNsYXNzKGRhdGEuc3AuR1dQUikNCmhlYWQoZGF0YS5zcC5HV1BSLDM0KQ0KYGBgDQoNCiMjIDMuNC4xLglNZW5lbnR1a2FuIEZ1bmdzaSBQZW1ib2JvdCBTcGFzaWFsIFRlcmJhaWsNCg0KVW50dWsgbWVsYWt1a2FuIHBlbW9kZWxhbiBHV1BSLCB0YWhhcCBhd2FsIHlhbmcgaGFydXMgZGlsYWt1a2FuIGFkYWxhaCBtZW5ndWt1ciBqYXJhayBldWNsaWRlYW4gYW50YXIgcHJvdmluc2kuIERhdGEga29vcmRpbmF0IGdlb2dyYWZpcywgeWFpdHUgbGF0aXR1ZGUgZGFuIGxvbmdpdHVkZSwgZGlndW5ha2FuIHVudHVrIG1lbmd1a3VyIGphcmFrIGV1Y2xpZGVhbi4gRGF0YSBrb29yZGluYXQgZ2VvZ3JhZmlzIHlhbmcgZGlndW5ha2FuIGRhbGFtIHBlbmVsaXRpYW4gaW5pIGFkYWxhaCBjZW50cm9pZCBkYXJpIG1hc2luZy1tYXNpbmcgcHJvdmluc2kgZGVuZ2FuIG1lbmdndW5ha2FuIHNvZnR3YXJlIFIuIFNldGVsYWggbWVuZGFwYXRrYW4gamFyYWsgZXVjbGlkZWFuLCB0YWhhcCBzZWxhbmp1dG55YSBhZGFsYWggbWVtaWxpaCBmdW5nc2kgcGVtYm9ib3Qgc3Bhc2lhbCB5YW5nIHBhbGluZyBzZXN1YWkgdW50dWsgbWVuZGFwYXRrYW4gbWF0cmlrcyBwZW1ib2JvdCBzcGFzaWFsIHlhbmcgYWthbiBkaWd1bmFrYW4gZGFsYW0gcGVtb2RlbGFuIEdXUFIuDQoNCmBgYHtyfQ0KIyBtZW5nZ3VuYWthbiAzIGZ1bmdzaSBrZXJuZWw6IGdhdXNzaWFuLCBla3Nwb25lbnNpYWwsIGJpc3F1YXJlIClhZGFwdGl2ZSBkYW4gZml4ZWQpDQojYWRhcHRpdmUgYmlzcXVhcmUNCmJ3ZC5HV1BSLmJpc3F1YXJlLmFkIDwtIGJ3Lmd3cihQRE5fQVJFQSB+IEtNSVMgKyBSTFMgKyBUUFQgKyBQRFJCICsgQUhIICsgUEtELCBkYXRhID0gZGF0YS5zcC5HV1BSLCBhcHByb2FjaCA9ICJDViIsIGtlcm5lbCA9ICJiaXNxdWFyZSIsIGFkYXB0aXZlPVQpDQoNCmhhc2lsLkdXUFIuYmlzcXVhcmUuYWQgPC0gZ3dyLmJhc2ljKFBETl9BUkVBIH4gS01JUyArIFJMUyArIFRQVCArIFBEUkIgKyBBSEggKyBQS0QsIGRhdGEgPSBkYXRhLnNwLkdXUFIsIGJ3ID0gYndkLkdXUFIuYmlzcXVhcmUuYWQsIGtlcm5lbCA9ICJiaXNxdWFyZSIsIGFkYXB0aXZlPVQpDQoNCiNhZGFwdGl2ZSBnYXVzc2lhbg0KYndkLkdXUFIuZ2F1c3NpYW4uYWQgPC0gYncuZ3dyKFBETl9BUkVBIH4gS01JUyArIFJMUyArIFRQVCArIFBEUkIgKyBBSEggKyBQS0QsIGRhdGEgPSBkYXRhLnNwLkdXUFIsIGFwcHJvYWNoID0gIkNWIiwga2VybmVsID0gImdhdXNzaWFuIiwgYWRhcHRpdmU9VCkNCg0KaGFzaWwuR1dQUi5nYXVzc2lhbi5hZCA8LSBnd3IuYmFzaWMoUEROX0FSRUEgfiBLTUlTICsgUkxTICsgVFBUICsgUERSQiArIEFISCArIFBLRCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhLnNwLkdXUFIsIGJ3ID0gYndkLkdXUFIuZ2F1c3NpYW4uYWQsIGtlcm5lbCA9ICJnYXVzc2lhbiIsIGFkYXB0aXZlPVQpDQoNCiNhZGFwdGl2ZSBleHBvbmVudGlhbA0KYndkLkdXUFIuZXhwb25lbnRpYWwuYWQgPC0gYncuZ3dyKFBETl9BUkVBIH4gS01JUyArIFJMUyArIFRQVCArIFBEUkIgKyBBSEggKyBQS0QsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRhdGEuc3AuR1dQUiwgYXBwcm9hY2ggPSAiQ1YiLCBrZXJuZWwgPSAiZXhwb25lbnRpYWwiLCBhZGFwdGl2ZT1UKQ0KDQpoYXNpbC5HV1BSLmV4cG9uZW50aWFsLmFkIDwtIGd3ci5iYXNpYyhQRE5fQVJFQSB+IEtNSVMgKyBSTFMgKyBUUFQgKyBQRFJCICsgQUhIICsgUEtELA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRhdGEuc3AuR1dQUiwgYncgPSBid2QuR1dQUi5leHBvbmVudGlhbC5hZCwga2VybmVsID0gImV4cG9uZW50aWFsIiwgYWRhcHRpdmU9VCkNCg0KI2ZpeGVkIGJpc3F1YXJlDQpid2QuR1dQUi5iaXNxdWFyZS5maXggPC0gYncuZ3dyKFBETl9BUkVBIH4gS01JUyArIFJMUyArIFRQVCArIFBEUkIgKyBBSEggKyBQS0QsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRhdGEuc3AuR1dQUiwgYXBwcm9hY2ggPSAiQ1YiLCBrZXJuZWwgPSAiYmlzcXVhcmUiLCBhZGFwdGl2ZT1GKQ0KDQpoYXNpbC5HV1BSLmJpc3F1YXJlLmZpeCA8LSBnd3IuYmFzaWMoUEROX0FSRUEgfiBLTUlTICsgUkxTICsgVFBUICsgUERSQiArIEFISCArIFBLRCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhLnNwLkdXUFIsIGJ3ID0gYndkLkdXUFIuYmlzcXVhcmUuZml4LCBrZXJuZWwgPSAiYmlzcXVhcmUiLCBhZGFwdGl2ZT1GKQ0KDQojZml4ZWQgZ2F1c3NpYW4NCmJ3ZC5HV1BSLmdhdXNzaWFuLmZpeCA8LSBidy5nd3IoUEROX0FSRUEgfiBLTUlTICsgUkxTICsgVFBUICsgUERSQiArIEFISCArIFBLRCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGF0YS5zcC5HV1BSLCBhcHByb2FjaCA9ICJDViIsIGtlcm5lbCA9ICJnYXVzc2lhbiIsIGFkYXB0aXZlPUYpDQoNCmhhc2lsLkdXUFIuZ2F1c3NpYW4uZml4IDwtIGd3ci5iYXNpYyhQRE5fQVJFQSB+IEtNSVMgKyBSTFMgKyBUUFQgKyBQRFJCICsgQUhIICsgUEtELA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRhdGEuc3AuR1dQUiwgYncgPSBid2QuR1dQUi5nYXVzc2lhbi5maXgsIGtlcm5lbCA9ICJnYXVzc2lhbiIsIGFkYXB0aXZlPUYpDQoNCiNmaXhlZCBleHBvbmVudGlhbA0KYndkLkdXUFIuZXhwb25lbnRpYWwuZml4IDwtIGJ3Lmd3cihQRE5fQVJFQSB+IEtNSVMgKyBSTFMgKyBUUFQgKyBQRFJCICsgQUhIICsgUEtELA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhLnNwLkdXUFIsIGFwcHJvYWNoID0gIkNWIiwga2VybmVsID0gImV4cG9uZW50aWFsIiwgYWRhcHRpdmU9RikNCg0KaGFzaWwuR1dQUi5leHBvbmVudGlhbC5maXggPC0gZ3dyLmJhc2ljKFBETl9BUkVBIH4gS01JUyArIFJMUyArIFRQVCArIFBEUkIgKyBBSEggKyBQS0QsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGF0YS5zcC5HV1BSLCBidyA9IGJ3ZC5HV1BSLmV4cG9uZW50aWFsLmZpeCwga2VybmVsID0gImV4cG9uZW50aWFsIiwgYWRhcHRpdmU9RikNCg0KQUlDIDwtIGMoaGFzaWwuR1dQUi5iaXNxdWFyZS5hZCRHVy5kaWFnbm9zdGljJEFJQywNCiAgICAgICAgICAgaGFzaWwuR1dQUi5nYXVzc2lhbi5hZCRHVy5kaWFnbm9zdGljJEFJQywNCiAgICAgICAgICAgaGFzaWwuR1dQUi5leHBvbmVudGlhbC5hZCRHVy5kaWFnbm9zdGljJEFJQywNCiAgICAgICAgICAgaGFzaWwuR1dQUi5iaXNxdWFyZS5maXgkR1cuZGlhZ25vc3RpYyRBSUMsDQogICAgICAgICAgIGhhc2lsLkdXUFIuZ2F1c3NpYW4uZml4JEdXLmRpYWdub3N0aWMkQUlDLA0KICAgICAgICAgICBoYXNpbC5HV1BSLmV4cG9uZW50aWFsLmZpeCRHVy5kaWFnbm9zdGljJEFJQykNClIyIDwtIGMoaGFzaWwuR1dQUi5iaXNxdWFyZS5hZCRHVy5kaWFnbm9zdGljJGd3LlIyLA0KICAgICAgICBoYXNpbC5HV1BSLmdhdXNzaWFuLmFkJEdXLmRpYWdub3N0aWMkZ3cuUjIsDQogICAgICAgIGhhc2lsLkdXUFIuZXhwb25lbnRpYWwuYWQkR1cuZGlhZ25vc3RpYyRndy5SMiwNCiAgICAgICAgaGFzaWwuR1dQUi5iaXNxdWFyZS5maXgkR1cuZGlhZ25vc3RpYyRndy5SMiwNCiAgICAgICAgaGFzaWwuR1dQUi5nYXVzc2lhbi5maXgkR1cuZGlhZ25vc3RpYyRndy5SMiwNCiAgICAgICAgaGFzaWwuR1dQUi5leHBvbmVudGlhbC5maXgkR1cuZGlhZ25vc3RpYyRndy5SMikNCkFJQ2MgPC0gYyhoYXNpbC5HV1BSLmJpc3F1YXJlLmFkJEdXLmRpYWdub3N0aWMkQUlDYywNCiAgICAgICAgICAgaGFzaWwuR1dQUi5nYXVzc2lhbi5hZCRHVy5kaWFnbm9zdGljJEFJQ2MsDQogICAgICAgICAgIGhhc2lsLkdXUFIuZXhwb25lbnRpYWwuYWQkR1cuZGlhZ25vc3RpYyRBSUNjLA0KICAgICAgICAgICBoYXNpbC5HV1BSLmJpc3F1YXJlLmZpeCRHVy5kaWFnbm9zdGljJEFJQ2MsDQogICAgICAgICAgIGhhc2lsLkdXUFIuZ2F1c3NpYW4uZml4JEdXLmRpYWdub3N0aWMkQUlDYywNCiAgICAgICAgICAgaGFzaWwuR1dQUi5leHBvbmVudGlhbC5maXgkR1cuZGlhZ25vc3RpYyRBSUNjKQ0KUjJhZGogPC0gYyhoYXNpbC5HV1BSLmJpc3F1YXJlLmFkJEdXLmRpYWdub3N0aWMkZ3dSMi5hZGosDQogICAgICAgICAgIGhhc2lsLkdXUFIuZ2F1c3NpYW4uYWQkR1cuZGlhZ25vc3RpYyRnd1IyLmFkaiwNCiAgICAgICAgICAgaGFzaWwuR1dQUi5leHBvbmVudGlhbC5hZCRHVy5kaWFnbm9zdGljJGd3UjIuYWRqLA0KICAgICAgICAgICBoYXNpbC5HV1BSLmJpc3F1YXJlLmZpeCRHVy5kaWFnbm9zdGljJGd3UjIuYWRqLA0KICAgICAgICAgICBoYXNpbC5HV1BSLmdhdXNzaWFuLmZpeCRHVy5kaWFnbm9zdGljJGd3UjIuYWRqLA0KICAgICAgICAgICBoYXNpbC5HV1BSLmV4cG9uZW50aWFsLmZpeCRHVy5kaWFnbm9zdGljJGd3UjIuYWRqKQ0KUlNTIDwtIGMoaGFzaWwuR1dQUi5iaXNxdWFyZS5hZCRHVy5kaWFnbm9zdGljJFJTUy5ndywNCiAgICAgICAgICAgaGFzaWwuR1dQUi5nYXVzc2lhbi5hZCRHVy5kaWFnbm9zdGljJFJTUy5ndywNCiAgICAgICAgICAgaGFzaWwuR1dQUi5leHBvbmVudGlhbC5hZCRHVy5kaWFnbm9zdGljJFJTUy5ndywNCiAgICAgICAgICAgaGFzaWwuR1dQUi5iaXNxdWFyZS5maXgkR1cuZGlhZ25vc3RpYyRSU1MuZ3csDQogICAgICAgICAgIGhhc2lsLkdXUFIuZ2F1c3NpYW4uZml4JEdXLmRpYWdub3N0aWMkUlNTLmd3LA0KICAgICAgICAgICBoYXNpbC5HV1BSLmV4cG9uZW50aWFsLmZpeCRHVy5kaWFnbm9zdGljJFJTUy5ndykNCmBgYA0KDQojIyMgUGVyYmFuZGluZ2FuDQoNCmBgYHtyfQ0KdGFiZWwgPC0gY2JpbmQoUlNTLFIyLFIyYWRqLEFJQyxBSUNjKQ0Kcm93bmFtZXModGFiZWwpIDwtIGMoIkFkYXB0aXZlIEJpc3F1YXJlIiwgIkFkYXB0aXZlIEdhdXNzaWFuIiwNCiAgICAgICAgICAgICAgICAgICAgICJBZGFwdGl2ZSBFeHBvbmVudGlhbCIsICJGaXhlZCBCaXNxdWFyZSIsDQogICAgICAgICAgICAgICAgICAgICAiRml4ZWQgR2F1c3NpYW4iLCAiRml4ZWQgRXhwb25lbnRpYWwiKQ0KZGF0YS5mcmFtZSh0YWJlbCkNCmBgYA0KDQpgYGB7cn0NCmJ3ZC5HV1BSLmV4cG9uZW50aWFsLmZpeA0KYGBgDQoNCk91dHB1dCBkaSBhdGFzIG1lbnVuanVra2FuIGJhaHdhIGZ1bmdzaSBwZW1ib2JvdCBGaXhlZCBrZXJuZWwgRXhwb25lbnRpYWwgbWVtaWxpa2kgbmlsYWkgZXJyb3IgZGFuIEFJQyBwYWxpbmcgcmVuZGFoIGRlbmdhbiBuaWxhaSBSMiBkYW4gUjIgYWRqIHBhbGluZyB0aW5nZ2ksIHNlaGluZ2dhIGZ1bmdzaSBwZW1ib2JvdCB5YW5nIHRlcnBpbGloIGFkYWxhaCBGaXhlZCBLZXJuZWwgRXhwb25lbnRpYWwuIEZ1bmdzaSBwZW1ib2JvdCBGaXhlZCBFeHBvbmVudGlhbCBtZW1pbGlraSBuaWxhaSBDViBwYWxpbmcgbWluaW11bSB5YWl0dSA2NCwyNjQ2IGRlbmdhbiBuaWxhaSBiYW53aWR0aCB5YWl0dSAxLDAxNTM1Lg0KDQpEZW5nYW4gZGVtaWtpYW4sIG1hdHJpa3MgcGVtYm9ib3Qgc3Bhc2lhbCBkYXBhdCBkaXRlbnR1a2FuIGRlbmdhbiBtZW5nZ3VuYWthbiBmdW5nc2kgcGVtYm9ib3QgRml4ZWQgRXhwb25lbnRpYWwuIE1hdHJpa3MgcGVtYm9ib3Qgc3Bhc2lhbCBpbmkgYWthbiBkaWd1bmFrYW4gdW50dWsgbWVsYWt1a2FuIHBlbW9kZWxhbiBHV1BSIHVudHVrIG1lbmR1Z2EgbmlsYWkgcGFyYW1ldGVyIG1vZGVsLiBOaWxhaSBkdWdhYW4gcGFyYW1ldGVyIGRhbGFtIHBlbW9kZWxhbiBHV1BSIGFrYW4gYmVyYmVkYSB1bnR1ayB0aWFwIHByb3ZpbnNpIHRldGFwaSBzYW1hIChrb25zdGFuKSB1bnR1ayB0aWFwIHRhaHVuLg0KDQoNCiMjIFBlbmR1Z2FhbiBQYXJhbWV0ZXINCg0KYGBge3J9DQojUGVuZHVnYSBwYXJhbWV0ZXINCnBhcmFtZXRlci5HV1BSIDwtIGFzLmRhdGEuZnJhbWUoaGFzaWwuR1dQUi5leHBvbmVudGlhbC5maXgkU0RGWzE6MzQsMTo3XSlbLWMoOCw5KV0NCnBhcmFtZXRlci5HV1BSICU+JSANCiAgbXV0YXRlKFBST1Y9Y3JpbWUkUFJPVlsxOjM0XSkgJT4lIA0KICBzZWxlY3QoUFJPViwgZXZlcnl0aGluZygpKQ0KYGBgDQoNCg0KDQojIyMgTW9kZWwgR1dQUiBkZW5nYW4gSnVtbGFoIFBpZGFuYSBwZXIgSnVtbGFoIFBlbmR1ZHVrIHBlciBMdWFzIFdpbGF5YWggVGVydGluZ2dpDQoNCmBgYHtyfQ0KcGFyYW1ldGVyX1IyIDwtIGFzLmRhdGEuZnJhbWUoaGFzaWwuR1dQUi5leHBvbmVudGlhbC5maXgkU0RGWzE6MzQsYygxOjcsMjcpXSlbLTk6LTEwXQ0KcGFyYW1ldGVyX1IyICU+JSANCiAgbXV0YXRlKFBST1Y9Y3JpbWUkUFJPVlsxOjM0XSkgJT4lDQogIGZpbHRlcihQUk9WICVpbiUgYygiREtJIEpBS0FSVEEiLCAiRCBJIFlPR1lBS0FSVEEiLCAiU1VMQVdFU0kgVVRBUkEiKSkgJT4lIA0KICBzZWxlY3QoUFJPViwgZXZlcnl0aGluZygpKQ0KYGBgDQoNCiMjIyBSMiBzZXRpYXAgcHJvdmluc2kNCg0KYGBge3J9DQpwYXJhbWV0ZXJfUjIgJT4lIA0KICBtdXRhdGUoUFJPVj1jcmltZSRQUk9WWzE6MzRdKSAlPiUNCiAgc2VsZWN0KFBST1YsIExvY2FsX1IyKSAlPiUgDQogIGFycmFuZ2UoLUxvY2FsX1IyKQ0KYGBgDQoNCiMjIFNpZ25pZmlrYXNpIHBhcmFtZXRlciAocC12YWx1ZSkNCg0KYGBge3J9DQpwX3ZhbHVlIDwtIGd3ci50LmFkanVzdChoYXNpbC5HV1BSLmJpc3F1YXJlLmFkKSRyZXN1bHRzJHANCnBfdmFsdWUgPC0gYXMuZGF0YS5mcmFtZShpZmVsc2UocF92YWx1ZTw9MC4wNSwgIlNpZ25pZmlrYW4iLCAiVGlkYWsiKSlbMTozNCxdDQpwX3ZhbHVlICU+JSANCiAgbXV0YXRlKFBST1Y9Y3JpbWUkUFJPVlsxOjM0XSkgJT4lIA0KICBzZWxlY3QoUFJPViwgZXZlcnl0aGluZygpKQ0KYGBgDQoNCiMjIyBGaWx0ZXIgUHJvdmluc2kgeWFuZyBtZW1wdW55YWkgc2lnbmlmaWthbnNpIHBhZGEgcGV1YmFoIEtlbWlza2luYW4NCg0KYGBge3J9DQpwX3ZhbHVlICU+JSANCiAgbXV0YXRlKFBST1Y9Y3JpbWUkUFJPVlsxOjM0XSkgJT4lIA0KICBzZWxlY3QoUFJPViwgZXZlcnl0aGluZygpKSAlPiUgDQogIGZpbHRlcigiU2lnbmlmaWthbiIgPT0gcF92YWx1ZSRLTUlTX3ApDQpgYGANCg0KIyMjIEZpbHRlciBQcm92aW5zaSB5YW5nIG1lbXB1bnlhaSBzaWduaWZpa2Fuc2kgcGV1YmFoIFJhdGEtcmF0YSBMYW1hIFNla29sYWgNCg0KYGBge3J9DQpwX3ZhbHVlICU+JSANCiAgbXV0YXRlKFBST1Y9Y3JpbWUkUFJPVlsxOjM0XSkgJT4lIA0KICBzZWxlY3QoUFJPViwgZXZlcnl0aGluZygpKSAlPiUgDQogIGZpbHRlcigiU2lnbmlmaWthbiIgPT0gcF92YWx1ZSRSTFNfcCkNCmBgYA0KDQojIyMgRmlsdGVyIFByb3ZpbnNpIHlhbmcgbWVtcHVueWFpIHNpZ25pZmlrYW5zaSBwZXViYWggVGluZ2thdCBQZW5nYW5nZ3VyYW4gVGVyYnVrYQ0KDQpgYGB7cn0NCnBfdmFsdWUgJT4lIA0KICBtdXRhdGUoUFJPVj1jcmltZSRQUk9WWzE6MzRdKSAlPiUgDQogIHNlbGVjdChQUk9WLCBldmVyeXRoaW5nKCkpICU+JSANCiAgZmlsdGVyKCJTaWduaWZpa2FuIiA9PSBwX3ZhbHVlJFRQVF9wKQ0KYGBgDQoNCj4gUGV1YmFoIFRQVCB0aWRhayBzaWduaWZpa2FuIHRlcmhhZGFwIEp1bWxhaCBQaWRhbmEgcGVyIFBlbmR1ZHVrIHBlciBMdWFzIFdpbGF5YWgNCg0KIyMjIEZpbHRlciBQcm92aW5zaSB5YW5nIG1lbXB1bnlhaSBzaWduaWZpa2Fuc2kgcGV1YmFoIFBEUkINCg0KYGBge3J9DQpwX3ZhbHVlICU+JSANCiAgbXV0YXRlKFBST1Y9Y3JpbWUkUFJPVlsxOjM0XSkgJT4lIA0KICBzZWxlY3QoUFJPViwgZXZlcnl0aGluZygpKSAlPiUgDQogIGZpbHRlcigiU2lnbmlmaWthbiIgPT0gcF92YWx1ZSRQRFJCX3ApDQpgYGANCg0KIyMjIEZpbHRlciBQcm92aW5zaSB5YW5nIG1lbXB1bnlhaSBzaWduaWZpa2Fuc2kgQW5na2EgSGFyYXBhbiBIaWR1cA0KDQpgYGB7cn0NCnBfdmFsdWUgJT4lIA0KICBtdXRhdGUoUFJPVj1jcmltZSRQUk9WWzE6MzRdKSAlPiUgDQogIHNlbGVjdChQUk9WLCBldmVyeXRoaW5nKCkpICU+JSANCiAgZmlsdGVyKCJTaWduaWZpa2FuIiA9PSBwX3ZhbHVlJEFISF9wKQ0KYGBgDQoNCiMjIyBGaWx0ZXIgUHJvdmluc2kgeWFuZyBtZW1wdW55YWkgc2lnbmlmaWthbnNpIFBlbmdlbHVhcmFuIFBlciBLYXBpdGENCg0KYGBge3J9DQpwX3ZhbHVlICU+JSANCiAgbXV0YXRlKFBST1Y9Y3JpbWUkUFJPVlsxOjM0XSkgJT4lIA0KICBzZWxlY3QoUFJPViwgZXZlcnl0aGluZygpKSAlPiUgDQogIGZpbHRlcigiU2lnbmlmaWthbiIgPT0gcF92YWx1ZSRQS0RfcCkNCmBgYA0KDQojIyBVamkgS2VzZXN1YWlhbiBNb2RlbA0KDQpVamkga2VzZXN1YWlhbiBtb2RlbCBkaWxha3VrYW4gdW50dWsgbWVuZ2V0YWh1aSBhcGFrYWggdGVyZGFwYXQgcGVyYmVkYWFuIHlhbmcgc2lnbmlmaWthbiBhbnRhcmEgbW9kZWwgcmVncmVzaSBnbG9iYWwgZGFuIG1vZGVsIEdXUFIsIGRlbmdhbiBoaXBvdGVzaXNueWEgc2ViYWdhaSBiZXJpa3V0Og0KDQokSF8wOs6yX2sgKHVfaSx2X2kpPc6yX2skIChUaWRhayBhZGEgcGVyYmVkYWFuIGFudGFyYSBtb2RlbCByZWdyZXNpIHBhbmVsIGRlbmdhbiBHV1BSKQ0KDQokSF8xOs6yX2sgKHVfaSx2X2kgKeKJoM6yX2skIChBZGEgcGVyYmVkYWFuIGFudGFyYSBtb2RlbCByZWdyZXNpIHBhbmVsIGRlbmdhbiBHV1BSKQ0KDQoNCmBgYHtyfQ0KIyBVamkgS2VzZXN1YWlhbiBNb2RlbA0KIyBVamkgRg0KcnNzX3JlbSA8LSBzdW0ocmVtX2dscyRyZXNpZHVhbHNeMikNCnJzc19nd3ByIDwtIGhhc2lsLkdXUFIuZXhwb25lbnRpYWwuZml4JEdXLmRpYWdub3N0aWMkUlNTLmd3DQpkZl9yZW0gPC0gcmVtX2dscyRkZi5yZXNpZHVhbA0KZGZfZ3dwciA8LSBoYXNpbC5HV1BSLmV4cG9uZW50aWFsLmZpeCRHVy5kaWFnbm9zdGljJGVkZg0KRmhpdD0ocnNzX2d3cHIvZGZfZ3dwcikvKHJzc19yZW0vZGZfcmVtKQ0KRmhpdA0KcGYoRmhpdCxkZl9nd3ByLGRmX3JlbSkNCmBgYA0KDQpCZXJkYXNhcmthbiBoYXNpbCB1amksIGRpZGFwYXRrYW4gbmlsYWkgRi1oaXR1bmcgc2ViZXNhciAwLjI5IDw8IEYtdGFiZWwgKDEuMzE4KSBkZW5nYW4gcC12YWx1ZSBzZWJlc2FyIDIuNTFlLTExLiBPbGVoIGthcmVuYSBpdHUsIEgwIGRpdG9sYWsgc2VoaW5nZ2EgZGFwYXQgZGlzaW1wdWxrYW4gYmFod2EgY3VrdXAgYnVrdGkgdW50dWsgbWVueWF0YWthbiBhZGEgcGVyYmVkYWFuIGFudGFyYSBtb2RlbCByZWdyZXNpIHBhbmVsIGRlbmdhbiBHV1BSLiANCg0KDQpgYGB7cn0NCmNvbXBhcmlzb24gPC0gZGF0YS5mcmFtZShSMj1jKGhhc2lsLkdXUFIuYmlzcXVhcmUuZml4JEdXLmRpYWdub3N0aWMkZ3cuUjIsc3VtbWFyeShyZW1fZ2xzKSRyLnNxdWFyZWRbMV0pLA0KICAgICAgICAgICAgICAgICAgICAgICAgIFIyYWRqPWMoaGFzaWwuR1dQUi5iaXNxdWFyZS5maXgkR1cuZGlhZ25vc3RpYyRnd1IyLmFkaixzdW1tYXJ5KHJlbV9nbHMpJHIuc3F1YXJlZFsyXSksDQogICAgICAgICAgICAgICAgICAgICAgICAgUlNTPWMoaGFzaWwuR1dQUi5iaXNxdWFyZS5maXgkR1cuZGlhZ25vc3RpYyRSU1MuZ3csc3VtKHN1bW1hcnkocmVtX2dscykkcmVzaWR1YWxzXjIpKSkNCnJvd25hbWVzKGNvbXBhcmlzb24pIDwtIGMoIkdXUFIiLCAiUkVNIFR3byBXYXlzIikNCmNvbXBhcmlzb24NCmBgYA0KDQpEYXJpIGhhc2lsIGRpIGF0YXMsIG1vZGVsIEdXUFIgbWVtaWxpa2kgbmlsYWkgUl4yIGRhbiBSXjIgYWRqIHRlcmJlc2FyIGRhbiBSU1MgdGVya2VjaWwgYXJ0aW55YSBtb2RlbCBHV1BSIG1lbWlsaWtpIGdvb2RuZXNzIG9mIGZpdCB5YW5nIGxlYmloIGJhaWsgZGFyaXBhZGEgbW9kZWwgUkVNIHNlaGluZ2dhIG1vZGVsIEdXUFIgdGVycGlsaWggbWVuamFkaSBtb2RlbCB0ZXJiYWlrLiBTZWxhbmp1dG55YSwgYWthbiBkaWxpaGF0IG1vZGVsIEdXUFIgYmVzZXJ0YSBzaWduaWZpa2Fuc2kgcGV1YmFoIGRpIDMgUHJvdmluc2kgZGVuZ2FuIEp1bWxhaCBQaWRhbmEgcGVyIEp1bWxhaCBQZW5kdWR1ayBwZXIgTHVhcyBXaWxheWFoIFRlcnRpbmdnaS4gDQoNCiMgS2VzaW1wdWxhbiBkYW4gU2FyYW4NCg0KRGFyaSBoYXNpbCBhbmFsaXNpcyB5YW5nIHRlbGFoIGRpbGFrdWthbiwgZGFwYXQgZGlzaW1wdWxrYW4gYmFod2EgcGV1YmFoLXBldWJhaCB5YW5nIGJlcnBlbmdhcnVoIHRlcmhhZGFwIEp1bWxhaCBQaWRhbmEgcGVyIHBlbmR1ZHVrIHBlciBsdWFzIHdpbGF5YWggYWRhbGFoIFRpbmdrYXQgS2VtaXNraW5hbiwgUmF0YS1yYXRhIGxhbWEgc2Vrb2xhaCwgUERSQiBwZXIgS2FwaXRhLCBBbmdrYSBIYXJhcGFuIEhpZHVwLCBQZW5nZWx1YXJhbiBwZXIgS2FwaXRhIERpc2VzdWFpa2FuLiBOaWxhaSBSMiB0ZXJlbmRhaCBhZGFsYWggc2ViZXNhciAwLjg4IHBhZGEgUHJvdmluc2kgS2VwdWxhdWFuIFJpYXUgeWFuZyBtZW51bmp1a2FuIGJhaHdhIG1vZGVsIHRlbGFoIGN1a3VwIGJhaWsgZGFsYW0gbWVtcHJlZGlrc2kgSnVtbGFoIHBpZGFuYSBwZXIgcGVuZHVkdWsgcGVyIGx1YXMgd2lsYXlhaC4gSGFtcGlyIHNlbXVhIG1vZGVsIHByb3ZpbnNpIHRpZGFrIG1lbWlsaWtpIHBldWJhaCB5YW5nIHNpZ25pZmlrYW4gdGVyaGFkYXAgcmVzcG9ucyBtZW51bmp1a2FuIGJhaHdhIG1vZGVsIGJ1cnVrIGRhbGFtIGludGVycHJldGFzaSBwZW5kdWdhYW4gcGFyYW1ldGVyIHNldGlhcCBwZXViYWguDQoNClBhZGEgYW5hbGlzaXMgZGlzZWJ1dGthbiBiYWh3YSBmYWt0b3IgeWFuZyBiZXJwZW5nYXJ1aCBhZGFsYWggZmFrdG9yIGluZGl2aWR1IGRhbiBmYWt0b3Igd2FrdHUuIE9sZWgga2FyZW5hIGl0dSwgZGlzYXJhbmthbiB1bnR1ayBwZW5lbGl0aWFuIHNlbGFuanV0bnlhIG1lbmdndW5ha2FuIG1ldG9kZSB5YW5nIGRpZ3VuYWthbiBhZGFsYWggR2VvZ3JhcGhpY2FsbHkgYW5kIFRlbXBvcmFsbHkgV2VpZ2h0ZWQgUmVncmVzc2lvbiBkZW5nYW4gbWVtcGVydGltYmFuZ2thbiBwZW5nYXJ1aCB3YWt0dS4gUGVuZ2FydWggcGV1YmFoLXBldWJhaCB5YW5nIGRpZ3VuYWthbiBiZXJwZW5nYXJ1aCBzZWNhcmEgc2lnbmlmaWthbiB1bXVtbnlhIHBhZGEgUHJvdmluc2kgREtJIEpha2FydGEgZGFuIERJIFlvZ3lha2FydGEuIE9sZWgga2FyZW5hIGl0dSwgZGlzYXJhbmthbiBrZXBhZGEgcGVtZXJpbnRhaCB1bnR1ayBtZW5ndXBheWFrYW4gbGFuZ2thaC1sYW5na2FoIGVmZWt0aWYgZGFsYW0gbWVuYW5nYW5pIHRpbmdrYXQga3JpbWluYWxpdGFzIGRpIGtlZHVhIHByb3ZpbnNpIHRlcnNlYnV0LiBDYXJhIHlhbmcgZGFwYXQgZGlsYWt1a2FuIGFkYWxhaCBkZW5nYW4gbWVuZ2VudGFzIEtlbWlza2luYW4sIG1lbmluZ2thdGthbiBtdXR1IHBlbmRpZGlrYW4sIG1lbmluZ2thdGthbiBQZW5kYXBhdGFuIGRhbiBQZW5nZWx1YXJhbiBwZXIgS2FwaXRhLCBoaW5nZ2EgbWVtcGVyYmFpa2kga3VhbGl0YXMgaGlkdXAgbWFzeWFyYWthdC4NCg==