Load package

require("spdep") 
require("spatialreg")
require("raster") 
require("cartography")
require("spData") 
require("rgdal")
require("GeoXp")
require("geodata")
require("sp")
require("sf")
library(rgdal) 
columbus <- readOGR(system.file("shapes/columbus.shp", package = "spData")[1])
## OGR data source with driver: ESRI Shapefile 
## Source: "C:\Users\TRINHHUONG\Documents\R\win-library\4.0\spData\shapes\columbus.shp", layer: "columbus"
## with 49 features
## It has 20 fields
## Integer64 fields read as strings:  COLUMBUS_ COLUMBUS_I POLYID
Wcontig.nb=poly2nb(columbus,queen=FALSE) 
Wcontig.listw=nb2listw(Wcontig.nb) 


olm = lm(CRIME ~ INC + HOVAL,data = columbus) #OLS,HOVAL housing value,INC #household income (in \$1,000), CRIME residential burglaries and vehicle thefts #per thousand households 
INC_lag=lag.listw(Wcontig.listw,columbus@data$INC) #lagInc, lag_hoval
HOVAL_lag= lag.listw(Wcontig.listw,columbus@data$HOVAL)
xlm=lm(CRIME ~ INC + HOVAL + INC_lag + HOVAL_lag,data = columbus) 
xlm
## 
## Call:
## lm(formula = CRIME ~ INC + HOVAL + INC_lag + HOVAL_lag, data = columbus)
## 
## Coefficients:
## (Intercept)          INC        HOVAL      INC_lag    HOVAL_lag  
##     73.9619      -1.1418      -0.2918      -1.2353       0.1828
lm.morantest(xlm,Wcontig.listw)
## 
##  Global Moran I for regression residuals
## 
## data:  
## model: lm(formula = CRIME ~ INC + HOVAL + INC_lag + HOVAL_lag, data =
## columbus)
## weights: Wcontig.listw
## 
## Moran I statistic standard deviate = 2.9426, p-value = 0.001627
## alternative hypothesis: greater
## sample estimates:
## Observed Moran I      Expectation         Variance 
##      0.245198298     -0.042105489      0.009532957
################### March 8 #################################
formula=CRIME ~ INC 
xlm2 = spatialreg::lmSLX(CRIME ~ INC + HOVAL,listw = Wcontig.listw, data = columbus, Durbin = formula) #SLM Spatial Lag of X

summary(xlm2)
## 
## Call:
## lm(formula = formula(paste("y ~ ", paste(colnames(x)[-1], collapse = "+"))), 
##     data = as.data.frame(x), weights = weights)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -36.752  -7.253   0.160   8.595  27.002 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 76.47908    5.93353  12.889  < 2e-16 ***
## INC         -1.21129    0.37228  -3.254  0.00216 ** 
## HOVAL       -0.26275    0.09981  -2.633  0.01157 *  
## lag.INC     -0.93565    0.45003  -2.079  0.04334 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 11.04 on 45 degrees of freedom
## Multiple R-squared:  0.5916, Adjusted R-squared:  0.5644 
## F-statistic: 21.73 on 3 and 45 DF,  p-value: 7.527e-09
xlm3=lmSLX(CRIME ~ INC + HOVAL,listw=Wcontig.listw,data = columbus) #lagX
isSymmetric(nb2mat(Wcontig.nb,style="B"),check.attributes = FALSE) 
## [1] TRUE
isSymmetric(nb2mat(Wcontig.nb,style="W"),check.attributes = FALSE)
## [1] FALSE
coord <- coordinates(columbus)[, 1:2] 

Wnear.knn=knearneigh(coord, k=5)
Wnear.mat=nb2mat(knn2nb(Wnear.knn),style= "B")
eig=eigen(nb2mat(Wcontig.nb))$values
xlm3
## 
## Call:
## lm(formula = formula(paste("y ~ ", paste(colnames(x)[-1], collapse = "+"))), 
##     data = as.data.frame(x), weights = weights)
## 
## Coefficients:
## (Intercept)          INC        HOVAL      lag.INC    lag.HOVAL  
##     73.9619      -1.1418      -0.2918      -1.2353       0.1828
laglm=spatialreg::lagsarlm(formula = CRIME ~ INC + HOVAL, data = columbus, listw = Wcontig.listw) #SAR spatial autoregressive model with WY
summary(laglm)
## 
## Call:spatialreg::lagsarlm(formula = CRIME ~ INC + HOVAL, data = columbus, 
##     listw = Wcontig.listw)
## 
## Residuals:
##       Min        1Q    Median        3Q       Max 
## -36.92792  -5.56906  -0.92424   6.21002  24.68336 
## 
## Type: lag 
## Coefficients: (asymptotic standard errors) 
##              Estimate Std. Error z value  Pr(>|z|)
## (Intercept) 45.264975   7.175796  6.3080 2.827e-10
## INC         -1.036346   0.305252 -3.3950 0.0006862
## HOVAL       -0.259418   0.088797 -2.9215 0.0034837
## 
## Rho: 0.42281, LR test value: 9.7192, p-value: 0.0018235
## Asymptotic standard error: 0.11558
##     z-value: 3.6582, p-value: 0.00025398
## Wald statistic: 13.383, p-value: 0.00025398
## 
## Log likelihood: -182.5176 for lag model
## ML residual variance (sigma squared): 95.723, (sigma: 9.7838)
## Number of observations: 49 
## Number of parameters estimated: 5 
## AIC: 375.04, (AIC for lm: 382.75)
## LM test for residual autocorrelation
## test value: 0.50522, p-value: 0.47722
##understanding what lagsarlm is doing 
A_rho <- function(rho, my_listw) 
  { 
  W <- listw2mat(my_listw) 
  n <- nrow(W) 
  diag(n) - rho * listw2mat(my_listw)
} 

hat_beta_rho <- function(rho, x, y, my_listw) 
{ 
  solve(crossprod(x), crossprod(x, A_rho(rho, my_listw) %*% y))
  } 

hat_sigma_rho <- function(rho, x, y, my_listw) 
{ 
  n <- length(y) 
  my_A <- A_rho(rho, my_listw) 
  my_beta <- hat_beta_rho(rho, x, y, my_listw) 
  my_A_inv <- solve(my_A, x %*% my_beta) 
  1 / n * t(y - my_A_inv) %*% 
    crossprod(my_A) %*% (y - my_A_inv) 
} 

my_like <- function(rho, x, y, my_listw) 
{ 
  n <- length(y) 
  my_A <- A_rho(rho, my_listw) 
  determinant(my_A, logarithm = TRUE)$modulus 
  n / 2 * log(hat_sigma_rho(rho, x, y, my_listw)) 
}
columbus_sf <-  read_sf(system.file("shapes/columbus.shp",
                                    package = "spData")[1]) 
y <- st_drop_geometry(columbus_sf)$CRIME

x <- cbind(1, st_drop_geometry(columbus_sf)$HOVAL, st_drop_geometry(columbus_sf)$INC) 
rho_possible <- seq(-0.99, 0.99, 0.01) 
ll_rho <- sapply(rho_possible, my_like, x, y, Wcontig.listw) 
plot(rho_possible, ll_rho, type = "l", xlab = "valeurs de rho", ylab = "log-vraisemblance") 

optimize(my_like, c(-0.99, 0.99), x, y, Wcontig.listw, maximum = T)
## $maximum
## [1] -0.9899191
## 
## $objective
##          [,1]
## [1,] 140.8946
logdet1=log(prod(1 - 0.5 * spatialreg::eigenw(Wcontig.listw))) 
logdet1
## [1] -1.795856
logdet2=determinant(A_rho(0.5, Wcontig.listw), logarithm = TRUE)$modulus
#####spatial durbin 
durbin <- spatialreg::lagsarlm(CRIME ~ INC + HOVAL, data = columbus, listw = Wcontig.listw, type = "mixed") #SARAR: mixed WY and WX
#laglm=spatialreg::lagsarlm(formula = CRIME ~ INC + HOVAL, data = columbus, #listw = Wcontig.listw) #SAR spatial autoregressive model with WY
summary(durbin)
## 
## Call:spatialreg::lagsarlm(formula = CRIME ~ INC + HOVAL, data = columbus, 
##     listw = Wcontig.listw, type = "mixed")
## 
## Residuals:
##       Min        1Q    Median        3Q       Max 
## -37.31038  -6.07084  -0.51813   6.58699  23.49170 
## 
## Type: mixed 
## Coefficients: (asymptotic standard errors) 
##              Estimate Std. Error z value  Pr(>|z|)
## (Intercept) 41.175254  12.086052  3.4068 0.0006572
## INC         -0.926376   0.333824 -2.7750 0.0055194
## HOVAL       -0.296256   0.091779 -3.2279 0.0012469
## lag.INC     -0.385647   0.553973 -0.6961 0.4863367
## lag.HOVAL    0.235127   0.186005  1.2641 0.2061962
## 
## Rho: 0.43826, LR test value: 6.0071, p-value: 0.014249
## Asymptotic standard error: 0.14885
##     z-value: 2.9444, p-value: 0.0032362
## Wald statistic: 8.6693, p-value: 0.0032362
## 
## Log likelihood: -181.7106 for mixed model
## ML residual variance (sigma squared): 92.238, (sigma: 9.6041)
## Number of observations: 49 
## Number of parameters estimated: 7 
## AIC: 377.42, (AIC for lm: 381.43)
## LM test for residual autocorrelation
## test value: 0.77351, p-value: 0.37913
###partial durbin 
formula=CRIME ~ INC 
durbin2=spatialreg::lagsarlm(CRIME ~ INC + HOVAL, data = columbus, listw = Wcontig.listw, Durbin = formula)
#durbin2

summary(durbin2)
## 
## Call:spatialreg::lagsarlm(formula = CRIME ~ INC + HOVAL, data = columbus, 
##     listw = Wcontig.listw, Durbin = formula)
## 
## Residuals:
##       Min        1Q    Median        3Q       Max 
## -37.00348  -5.71198  -0.86229   6.20462  24.69181 
## 
## Type: mixed 
## Coefficients: (asymptotic standard errors) 
##              Estimate Std. Error z value  Pr(>|z|)
## (Intercept) 46.413766  11.584119  4.0067 6.158e-05
## INC         -1.027956   0.330425 -3.1110  0.001864
## HOVAL       -0.259126   0.088908 -2.9145  0.003562
## lag.INC     -0.058573   0.510691 -0.1147  0.908688
## 
## Rho: 0.41092, LR test value: 5.2372, p-value: 0.022109
## Asymptotic standard error: 0.14845
##     z-value: 2.7681, p-value: 0.0056379
## Wald statistic: 7.6625, p-value: 0.0056379
## 
## Log likelihood: -182.5115 for mixed model
## ML residual variance (sigma squared): 95.993, (sigma: 9.7976)
## Number of observations: 49 
## Number of parameters estimated: 6 
## AIC: 377.02, (AIC for lm: 380.26)
## LM test for residual autocorrelation
## test value: 2.552, p-value: 0.11015
#####Bayesian estimation
Bayesmod=spatialreg::spBreg_lag(CRIME ~ INC + HOVAL, data=columbus, listw=Wcontig.listw)
summary(Bayesmod)
## 
## Iterations = 501:2500
## Thinning interval = 1 
## Number of chains = 1 
## Sample size per chain = 2000 
## 
## 1. Empirical mean and standard deviation for each variable,
##    plus standard error of the mean:
## 
##                 Mean       SD Naive SE Time-series SE
## (Intercept)  46.0711  8.35952 0.186925       0.186925
## INC          -1.0492  0.35168 0.007864       0.007864
## HOVAL        -0.2633  0.09394 0.002101       0.002101
## rho           0.4086  0.12756 0.002852       0.002852
## sige        108.7965 24.17370 0.540540       0.577264
## 
## 2. Quantiles for each variable:
## 
##                2.5%     25%      50%      75%    97.5%
## (Intercept) 29.3672 40.5417  45.8271  51.7303  62.6306
## INC         -1.7265 -1.2899  -1.0560  -0.8124  -0.3505
## HOVAL       -0.4525 -0.3254  -0.2616  -0.1987  -0.0880
## rho          0.1606  0.3207   0.4137   0.4967   0.6509
## sige        71.2679 90.9087 105.9367 122.4151 163.7571
####stsls estimation
s2sls_est=spatialreg::stsls(CRIME ~ INC + HOVAL, data=columbus, listw=Wcontig.listw)
summary(s2sls_est)
## 
## Call:spatialreg::stsls(formula = CRIME ~ INC + HOVAL, data = columbus, 
##     listw = Wcontig.listw)
## 
## Residuals:
##       Min        1Q    Median        3Q       Max 
## -36.90706  -5.49372  -0.92969   6.21749  24.71632 
## 
## Coefficients: 
##              Estimate Std. Error t value  Pr(>|t|)
## Rho          0.419294   0.187585  2.2352  0.025403
## (Intercept) 45.459092  11.191512  4.0619 4.867e-05
## INC         -1.041009   0.388612 -2.6788  0.007389
## HOVAL       -0.259538   0.092406 -2.8087  0.004975
## 
## Residual variance (sigma squared): 104.33, (sigma: 10.214)
######################## March 9 ###############################
####impacts in Durbin model 
imp_durbin=spatialreg::impacts(durbin, listw=Wcontig.listw,R=200) 
summary(imp_durbin, zstats=TRUE)
## Impact measures (mixed, exact):
##           Direct   Indirect      Total
## INC   -1.0354954 -1.3001390 -2.3356344
## HOVAL -0.2817423  0.1729232 -0.1088192
## ========================================================
## Simulation results ( variance matrix):
## Direct:
## 
## Iterations = 1:200
## Thinning interval = 1 
## Number of chains = 1 
## Sample size per chain = 200 
## 
## 1. Empirical mean and standard deviation for each variable,
##    plus standard error of the mean:
## 
##          Mean      SD Naive SE Time-series SE
## INC   -1.0756 0.30662  0.02168       0.021682
## HOVAL -0.2699 0.09532  0.00674       0.004968
## 
## 2. Quantiles for each variable:
## 
##          2.5%     25%     50%     75%    97.5%
## INC   -1.6337 -1.3181 -1.0805 -0.8378 -0.51697
## HOVAL -0.4391 -0.3299 -0.2759 -0.2060 -0.06951
## 
## ========================================================
## Indirect:
## 
## Iterations = 1:200
## Thinning interval = 1 
## Number of chains = 1 
## Sample size per chain = 200 
## 
## 1. Empirical mean and standard deviation for each variable,
##    plus standard error of the mean:
## 
##          Mean     SD Naive SE Time-series SE
## INC   -1.3041 0.8344   0.0590         0.0590
## HOVAL  0.1761 0.3592   0.0254         0.0254
## 
## 2. Quantiles for each variable:
## 
##          2.5%     25%     50%     75%  97.5%
## INC   -2.8866 -1.8091 -1.2149 -0.8255 0.2982
## HOVAL -0.3767 -0.0163  0.1617  0.3370 0.8241
## 
## ========================================================
## Total:
## 
## Iterations = 1:200
## Thinning interval = 1 
## Number of chains = 1 
## Sample size per chain = 200 
## 
## 1. Empirical mean and standard deviation for each variable,
##    plus standard error of the mean:
## 
##           Mean     SD Naive SE Time-series SE
## INC   -2.37968 0.8915  0.06304        0.06304
## HOVAL -0.09387 0.3902  0.02759        0.02759
## 
## 2. Quantiles for each variable:
## 
##          2.5%     25%     50%      75%   97.5%
## INC   -4.4077 -2.8199 -2.3286 -1.85931 -0.7254
## HOVAL -0.6709 -0.3461 -0.1164  0.08175  0.6279
## 
## ========================================================
## Simulated standard errors
##           Direct  Indirect     Total
## INC   0.30662495 0.8344063 0.8914519
## HOVAL 0.09531741 0.3591790 0.3902294
## 
## Simulated z-values:
##          Direct   Indirect     Total
## INC   -3.507864 -1.5628887 -2.669446
## HOVAL -2.832100  0.4902235 -0.240552
## 
## Simulated p-values:
##       Direct     Indirect Total    
## INC   0.00045172 0.11808  0.0075976
## HOVAL 0.00462433 0.62398  0.8099024
###test of rho = zero 
lm.LMtests(olm,Wcontig.listw,test=c("LMlag","RLMlag"))
## 
##  Lagrange multiplier diagnostics for spatial dependence
## 
## data:  
## model: lm(formula = CRIME ~ INC + HOVAL, data = columbus)
## weights: Wcontig.listw
## 
## LMlag = 8.7599, df = 1, p-value = 0.003079
## 
## 
##  Lagrange multiplier diagnostics for spatial dependence
## 
## data:  
## model: lm(formula = CRIME ~ INC + HOVAL, data = columbus)
## weights: Wcontig.listw
## 
## RLMlag = 3.0722, df = 1, p-value = 0.07964
###prediction in LAG model 
###prediction in LAG model

y_TC <- predict(laglm, listw = Wcontig.listw, pred.type = "TC", all.data = TRUE, zero.policy = FALSE)

y_TS <- predict(laglm, listw = Wcontig.listw, pred.type = "TS", all.data = TRUE, zero.policy = FALSE)

y_BP <- predict(laglm, listw = Wcontig.listw, pred.type = "BP", all.data = TRUE, zero.policy = FALSE)

pred<-list("TC"=y_TC,"TS"=y_TS,"BP"=y_BP)

pred <- data.frame(TC = as.numeric(y_TC), TS = as.numeric(y_TS), BP = as.numeric(y_BP))
sapply(pred, function(x) mean((columbus_sf$CRIME - x) ^ 2))
##        TC        TS        BP 
## 117.22186  95.72350  89.06412
###fitting the SEM model 
sem=spautolm(CRIME ~ INC + HOVAL, data = columbus, listw = Wcontig.listw) # drop spatialreg::
summary(sem)
## 
## Call: 
## spautolm(formula = CRIME ~ INC + HOVAL, data = columbus, listw = Wcontig.listw)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -34.4004  -6.0196  -1.3928   7.0105  24.0611 
## 
## Coefficients: 
##              Estimate Std. Error z value  Pr(>|z|)
## (Intercept) 60.375187   5.325070 11.3379 < 2.2e-16
## INC         -0.961044   0.331146 -2.9022  0.003706
## HOVAL       -0.303198   0.092641 -3.2728  0.001065
## 
## Lambda: 0.54847 LR test value: 8.1273 p-value: 0.0043603 
## Numerical Hessian standard error of lambda: 0.15002 
## 
## Log likelihood: -183.3136 
## ML residual variance (sigma squared): 94.968, (sigma: 9.7451)
## Number of observations: 49 
## Number of parameters estimated: 5 
## AIC: 376.63
sem2=errorsarlm(CRIME ~ INC + HOVAL, data = columbus, listw = Wcontig.listw)
summary(sem2)
## 
## Call:
## errorsarlm(formula = CRIME ~ INC + HOVAL, data = columbus, listw = Wcontig.listw)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -34.4004  -6.0196  -1.3928   7.0105  24.0611 
## 
## Type: error 
## Coefficients: (asymptotic standard errors) 
##              Estimate Std. Error z value  Pr(>|z|)
## (Intercept) 60.375188   5.325070 11.3379 < 2.2e-16
## INC         -0.961044   0.331146 -2.9022  0.003706
## HOVAL       -0.303198   0.092641 -3.2728  0.001065
## 
## Lambda: 0.54847, LR test value: 8.1273, p-value: 0.0043603
## Asymptotic standard error: 0.13138
##     z-value: 4.1747, p-value: 2.9832e-05
## Wald statistic: 17.428, p-value: 2.9832e-05
## 
## Log likelihood: -183.3136 for error model
## ML residual variance (sigma squared): 94.968, (sigma: 9.7451)
## Number of observations: 49 
## Number of parameters estimated: 5 
## AIC: 376.63, (AIC for lm: 382.75)
####testing strategy 
lm.LMtests(olm,Wcontig.listw,test=c("LMerr"))
## 
##  Lagrange multiplier diagnostics for spatial dependence
## 
## data:  
## model: lm(formula = CRIME ~ INC + HOVAL, data = columbus)
## weights: Wcontig.listw
## 
## LMErr = 5.8149, df = 1, p-value = 0.01589
lm.LMtests(olm,Wcontig.listw,test=c("RLMerr", "RLMerr"))
## 
##  Lagrange multiplier diagnostics for spatial dependence
## 
## data:  
## model: lm(formula = CRIME ~ INC + HOVAL, data = columbus)
## weights: Wcontig.listw
## 
## RLMerr = 0.12715, df = 1, p-value = 0.7214
## 
## 
##  Lagrange multiplier diagnostics for spatial dependence
## 
## data:  
## model: lm(formula = CRIME ~ INC + HOVAL, data = columbus)
## weights: Wcontig.listw
## 
## RLMerr = 0.12715, df = 1, p-value = 0.7214
LS0tDQp0aXRsZTogJ1R1dG9yaWFsOiBTcGF0aWFsIGVjb25vbWV0cmljcyB3aXRoIFIgNCcNCmF1dGhvcjogIkh1b25nIFRoaSBUcmluaCwgVmFuLUhhIEhvYW5nLCBCaW5oIERhbyINCmRhdGU6ICIxMC0xMi8xMi8yMDIxIg0Kb3V0cHV0OiANCiAgaHRtbF9kb2N1bWVudDogDQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQ0KICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KICAgIGhpZ2hsaWdodDogcHlnbWVudHMNCiAgICAjIG51bWJlcl9zZWN0aW9uczogeWVzDQogICAgdGhlbWU6ICJmbGF0bHkiDQogICAgdG9jOiBUUlVFDQogICAgdG9jX2Zsb2F0OiBUUlVFDQotLS0NCg0KDQpgYGB7ciBzZXR1cCxpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSkNCmBgYA0KDQojIyBMb2FkIHBhY2thZ2UNCg0KYGBge3J9DQpyZXF1aXJlKCJzcGRlcCIpIA0KcmVxdWlyZSgic3BhdGlhbHJlZyIpDQpyZXF1aXJlKCJyYXN0ZXIiKSANCnJlcXVpcmUoImNhcnRvZ3JhcGh5IikNCnJlcXVpcmUoInNwRGF0YSIpIA0KcmVxdWlyZSgicmdkYWwiKQ0KcmVxdWlyZSgiR2VvWHAiKQ0KcmVxdWlyZSgiZ2VvZGF0YSIpDQpyZXF1aXJlKCJzcCIpDQpyZXF1aXJlKCJzZiIpDQpgYGANCg0KDQpgYGB7cn0NCg0KbGlicmFyeShyZ2RhbCkgDQpjb2x1bWJ1cyA8LSByZWFkT0dSKHN5c3RlbS5maWxlKCJzaGFwZXMvY29sdW1idXMuc2hwIiwgcGFja2FnZSA9ICJzcERhdGEiKVsxXSkNCg0KV2NvbnRpZy5uYj1wb2x5Mm5iKGNvbHVtYnVzLHF1ZWVuPUZBTFNFKSANCldjb250aWcubGlzdHc9bmIybGlzdHcoV2NvbnRpZy5uYikgDQoNCg0Kb2xtID0gbG0oQ1JJTUUgfiBJTkMgKyBIT1ZBTCxkYXRhID0gY29sdW1idXMpICNPTFMsSE9WQUwgaG91c2luZyB2YWx1ZSxJTkMgI2hvdXNlaG9sZCBpbmNvbWUgKGluIFwkMSwwMDApLCBDUklNRSByZXNpZGVudGlhbCBidXJnbGFyaWVzIGFuZCB2ZWhpY2xlIHRoZWZ0cyAjcGVyIHRob3VzYW5kIGhvdXNlaG9sZHMgDQpJTkNfbGFnPWxhZy5saXN0dyhXY29udGlnLmxpc3R3LGNvbHVtYnVzQGRhdGEkSU5DKSAjbGFnSW5jLCBsYWdfaG92YWwNCkhPVkFMX2xhZz0gbGFnLmxpc3R3KFdjb250aWcubGlzdHcsY29sdW1idXNAZGF0YSRIT1ZBTCkNCnhsbT1sbShDUklNRSB+IElOQyArIEhPVkFMICsgSU5DX2xhZyArIEhPVkFMX2xhZyxkYXRhID0gY29sdW1idXMpIA0KeGxtDQpsbS5tb3JhbnRlc3QoeGxtLFdjb250aWcubGlzdHcpDQpgYGANCg0KDQpgYGB7cn0NCiMjIyMjIyMjIyMjIyMjIyMjIyMgTWFyY2ggOCAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCmZvcm11bGE9Q1JJTUUgfiBJTkMgDQp4bG0yID0gc3BhdGlhbHJlZzo6bG1TTFgoQ1JJTUUgfiBJTkMgKyBIT1ZBTCxsaXN0dyA9IFdjb250aWcubGlzdHcsIGRhdGEgPSBjb2x1bWJ1cywgRHVyYmluID0gZm9ybXVsYSkgI1NMTSBTcGF0aWFsIExhZyBvZiBYDQoNCnN1bW1hcnkoeGxtMikNCmBgYA0KDQoNCmBgYHtyfQ0KeGxtMz1sbVNMWChDUklNRSB+IElOQyArIEhPVkFMLGxpc3R3PVdjb250aWcubGlzdHcsZGF0YSA9IGNvbHVtYnVzKSAjbGFnWA0KaXNTeW1tZXRyaWMobmIybWF0KFdjb250aWcubmIsc3R5bGU9IkIiKSxjaGVjay5hdHRyaWJ1dGVzID0gRkFMU0UpIA0KaXNTeW1tZXRyaWMobmIybWF0KFdjb250aWcubmIsc3R5bGU9IlciKSxjaGVjay5hdHRyaWJ1dGVzID0gRkFMU0UpDQoNCmNvb3JkIDwtIGNvb3JkaW5hdGVzKGNvbHVtYnVzKVssIDE6Ml0gDQoNClduZWFyLmtubj1rbmVhcm5laWdoKGNvb3JkLCBrPTUpDQpXbmVhci5tYXQ9bmIybWF0KGtubjJuYihXbmVhci5rbm4pLHN0eWxlPSAiQiIpDQplaWc9ZWlnZW4obmIybWF0KFdjb250aWcubmIpKSR2YWx1ZXMNCnhsbTMNCmBgYA0KDQoNCmBgYHtyfQ0KDQpsYWdsbT1zcGF0aWFscmVnOjpsYWdzYXJsbShmb3JtdWxhID0gQ1JJTUUgfiBJTkMgKyBIT1ZBTCwgZGF0YSA9IGNvbHVtYnVzLCBsaXN0dyA9IFdjb250aWcubGlzdHcpICNTQVIgc3BhdGlhbCBhdXRvcmVncmVzc2l2ZSBtb2RlbCB3aXRoIFdZDQpzdW1tYXJ5KGxhZ2xtKQ0KYGBgDQoNCg0KYGBge3J9DQojI3VuZGVyc3RhbmRpbmcgd2hhdCBsYWdzYXJsbSBpcyBkb2luZyANCkFfcmhvIDwtIGZ1bmN0aW9uKHJobywgbXlfbGlzdHcpIA0KICB7IA0KICBXIDwtIGxpc3R3Mm1hdChteV9saXN0dykgDQogIG4gPC0gbnJvdyhXKSANCiAgZGlhZyhuKSAtIHJobyAqIGxpc3R3Mm1hdChteV9saXN0dykNCn0gDQoNCmhhdF9iZXRhX3JobyA8LSBmdW5jdGlvbihyaG8sIHgsIHksIG15X2xpc3R3KSANCnsgDQogIHNvbHZlKGNyb3NzcHJvZCh4KSwgY3Jvc3Nwcm9kKHgsIEFfcmhvKHJobywgbXlfbGlzdHcpICUqJSB5KSkNCiAgfSANCg0KaGF0X3NpZ21hX3JobyA8LSBmdW5jdGlvbihyaG8sIHgsIHksIG15X2xpc3R3KSANCnsgDQogIG4gPC0gbGVuZ3RoKHkpIA0KICBteV9BIDwtIEFfcmhvKHJobywgbXlfbGlzdHcpIA0KICBteV9iZXRhIDwtIGhhdF9iZXRhX3JobyhyaG8sIHgsIHksIG15X2xpc3R3KSANCiAgbXlfQV9pbnYgPC0gc29sdmUobXlfQSwgeCAlKiUgbXlfYmV0YSkgDQogIDEgLyBuICogdCh5IC0gbXlfQV9pbnYpICUqJSANCiAgICBjcm9zc3Byb2QobXlfQSkgJSolICh5IC0gbXlfQV9pbnYpIA0KfSANCg0KbXlfbGlrZSA8LSBmdW5jdGlvbihyaG8sIHgsIHksIG15X2xpc3R3KSANCnsgDQogIG4gPC0gbGVuZ3RoKHkpIA0KICBteV9BIDwtIEFfcmhvKHJobywgbXlfbGlzdHcpIA0KICBkZXRlcm1pbmFudChteV9BLCBsb2dhcml0aG0gPSBUUlVFKSRtb2R1bHVzIA0KICBuIC8gMiAqIGxvZyhoYXRfc2lnbWFfcmhvKHJobywgeCwgeSwgbXlfbGlzdHcpKSANCn0NCmBgYA0KDQoNCmBgYHtyfQ0KY29sdW1idXNfc2YgPC0gIHJlYWRfc2Yoc3lzdGVtLmZpbGUoInNoYXBlcy9jb2x1bWJ1cy5zaHAiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZSA9ICJzcERhdGEiKVsxXSkgDQp5IDwtIHN0X2Ryb3BfZ2VvbWV0cnkoY29sdW1idXNfc2YpJENSSU1FDQoNCnggPC0gY2JpbmQoMSwgc3RfZHJvcF9nZW9tZXRyeShjb2x1bWJ1c19zZikkSE9WQUwsIHN0X2Ryb3BfZ2VvbWV0cnkoY29sdW1idXNfc2YpJElOQykgDQpyaG9fcG9zc2libGUgPC0gc2VxKC0wLjk5LCAwLjk5LCAwLjAxKSANCmxsX3JobyA8LSBzYXBwbHkocmhvX3Bvc3NpYmxlLCBteV9saWtlLCB4LCB5LCBXY29udGlnLmxpc3R3KSANCnBsb3QocmhvX3Bvc3NpYmxlLCBsbF9yaG8sIHR5cGUgPSAibCIsIHhsYWIgPSAidmFsZXVycyBkZSByaG8iLCB5bGFiID0gImxvZy12cmFpc2VtYmxhbmNlIikgDQoNCm9wdGltaXplKG15X2xpa2UsIGMoLTAuOTksIDAuOTkpLCB4LCB5LCBXY29udGlnLmxpc3R3LCBtYXhpbXVtID0gVCkNCg0KbG9nZGV0MT1sb2cocHJvZCgxIC0gMC41ICogc3BhdGlhbHJlZzo6ZWlnZW53KFdjb250aWcubGlzdHcpKSkgDQpsb2dkZXQxDQpsb2dkZXQyPWRldGVybWluYW50KEFfcmhvKDAuNSwgV2NvbnRpZy5saXN0dyksIGxvZ2FyaXRobSA9IFRSVUUpJG1vZHVsdXMNCmBgYA0KDQoNCmBgYHtyfQ0KIyMjIyNzcGF0aWFsIGR1cmJpbiANCmR1cmJpbiA8LSBzcGF0aWFscmVnOjpsYWdzYXJsbShDUklNRSB+IElOQyArIEhPVkFMLCBkYXRhID0gY29sdW1idXMsIGxpc3R3ID0gV2NvbnRpZy5saXN0dywgdHlwZSA9ICJtaXhlZCIpICNTQVJBUjogbWl4ZWQgV1kgYW5kIFdYDQojbGFnbG09c3BhdGlhbHJlZzo6bGFnc2FybG0oZm9ybXVsYSA9IENSSU1FIH4gSU5DICsgSE9WQUwsIGRhdGEgPSBjb2x1bWJ1cywgI2xpc3R3ID0gV2NvbnRpZy5saXN0dykgI1NBUiBzcGF0aWFsIGF1dG9yZWdyZXNzaXZlIG1vZGVsIHdpdGggV1kNCnN1bW1hcnkoZHVyYmluKQ0KYGBgDQoNCg0KYGBge3J9DQojIyNwYXJ0aWFsIGR1cmJpbiANCmZvcm11bGE9Q1JJTUUgfiBJTkMgDQpkdXJiaW4yPXNwYXRpYWxyZWc6OmxhZ3NhcmxtKENSSU1FIH4gSU5DICsgSE9WQUwsIGRhdGEgPSBjb2x1bWJ1cywgbGlzdHcgPSBXY29udGlnLmxpc3R3LCBEdXJiaW4gPSBmb3JtdWxhKQ0KI2R1cmJpbjINCg0Kc3VtbWFyeShkdXJiaW4yKQ0KYGBgDQoNCg0KYGBge3J9DQojIyMjI0JheWVzaWFuIGVzdGltYXRpb24NCkJheWVzbW9kPXNwYXRpYWxyZWc6OnNwQnJlZ19sYWcoQ1JJTUUgfiBJTkMgKyBIT1ZBTCwgZGF0YT1jb2x1bWJ1cywgbGlzdHc9V2NvbnRpZy5saXN0dykNCnN1bW1hcnkoQmF5ZXNtb2QpDQpgYGANCg0KDQpgYGB7cn0NCiMjIyNzdHNscyBlc3RpbWF0aW9uDQpzMnNsc19lc3Q9c3BhdGlhbHJlZzo6c3RzbHMoQ1JJTUUgfiBJTkMgKyBIT1ZBTCwgZGF0YT1jb2x1bWJ1cywgbGlzdHc9V2NvbnRpZy5saXN0dykNCnN1bW1hcnkoczJzbHNfZXN0KQ0KDQpgYGANCg0KDQpgYGB7cn0NCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBNYXJjaCA5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMjIyNpbXBhY3RzIGluIER1cmJpbiBtb2RlbCANCmltcF9kdXJiaW49c3BhdGlhbHJlZzo6aW1wYWN0cyhkdXJiaW4sIGxpc3R3PVdjb250aWcubGlzdHcsUj0yMDApIA0Kc3VtbWFyeShpbXBfZHVyYmluLCB6c3RhdHM9VFJVRSkNCmBgYA0KDQoNCmBgYHtyfQ0KIyMjdGVzdCBvZiByaG8gPSB6ZXJvIA0KbG0uTE10ZXN0cyhvbG0sV2NvbnRpZy5saXN0dyx0ZXN0PWMoIkxNbGFnIiwiUkxNbGFnIikpDQpgYGANCg0KDQpgYGB7cn0NCiMjI3ByZWRpY3Rpb24gaW4gTEFHIG1vZGVsIA0KIyMjcHJlZGljdGlvbiBpbiBMQUcgbW9kZWwNCg0KeV9UQyA8LSBwcmVkaWN0KGxhZ2xtLCBsaXN0dyA9IFdjb250aWcubGlzdHcsIHByZWQudHlwZSA9ICJUQyIsIGFsbC5kYXRhID0gVFJVRSwgemVyby5wb2xpY3kgPSBGQUxTRSkNCg0KeV9UUyA8LSBwcmVkaWN0KGxhZ2xtLCBsaXN0dyA9IFdjb250aWcubGlzdHcsIHByZWQudHlwZSA9ICJUUyIsIGFsbC5kYXRhID0gVFJVRSwgemVyby5wb2xpY3kgPSBGQUxTRSkNCg0KeV9CUCA8LSBwcmVkaWN0KGxhZ2xtLCBsaXN0dyA9IFdjb250aWcubGlzdHcsIHByZWQudHlwZSA9ICJCUCIsIGFsbC5kYXRhID0gVFJVRSwgemVyby5wb2xpY3kgPSBGQUxTRSkNCg0KcHJlZDwtbGlzdCgiVEMiPXlfVEMsIlRTIj15X1RTLCJCUCI9eV9CUCkNCg0KcHJlZCA8LSBkYXRhLmZyYW1lKFRDID0gYXMubnVtZXJpYyh5X1RDKSwgVFMgPSBhcy5udW1lcmljKHlfVFMpLCBCUCA9IGFzLm51bWVyaWMoeV9CUCkpDQpzYXBwbHkocHJlZCwgZnVuY3Rpb24oeCkgbWVhbigoY29sdW1idXNfc2YkQ1JJTUUgLSB4KSBeIDIpKQ0KYGBgDQoNCg0KYGBge3J9DQojIyNmaXR0aW5nIHRoZSBTRU0gbW9kZWwgDQpzZW09c3BhdXRvbG0oQ1JJTUUgfiBJTkMgKyBIT1ZBTCwgZGF0YSA9IGNvbHVtYnVzLCBsaXN0dyA9IFdjb250aWcubGlzdHcpICMgZHJvcCBzcGF0aWFscmVnOjoNCnN1bW1hcnkoc2VtKQ0KYGBgDQoNCg0KYGBge3J9DQpzZW0yPWVycm9yc2FybG0oQ1JJTUUgfiBJTkMgKyBIT1ZBTCwgZGF0YSA9IGNvbHVtYnVzLCBsaXN0dyA9IFdjb250aWcubGlzdHcpDQpzdW1tYXJ5KHNlbTIpDQpgYGANCg0KDQpgYGB7cn0NCg0KIyMjI3Rlc3Rpbmcgc3RyYXRlZ3kgDQpsbS5MTXRlc3RzKG9sbSxXY29udGlnLmxpc3R3LHRlc3Q9YygiTE1lcnIiKSkNCmxtLkxNdGVzdHMob2xtLFdjb250aWcubGlzdHcsdGVzdD1jKCJSTE1lcnIiLCAiUkxNZXJyIikpDQpgYGANCg0K