Question 3.3, ARIMA Model of Heating
mod_heating <- arima(dat.f$heating[1: num_obs], order = c(0, 1, 2), seasonal = list(order = c(0, 0, 2), period = 48),
fixed = c(0, NA, NA, NA), include.mean = T)
mod_heating
Call:
arima(x = dat.f$heating[1:num_obs], order = c(0, 1, 2), seasonal = list(order = c(0,
0, 2), period = 48), include.mean = T, fixed = c(0, NA, NA, NA))
Coefficients:
ma1 ma2 sma1 sma2
0 -0.1261 0.0696 0.1217
s.e. 0 0.0490 0.0479 0.0474
sigma^2 estimated as 56.66: log likelihood = -1654.23, aic = 3316.47
plotTimeSeriesResidual(mod_heating, num_lag = 100, "ARIMA Model 3.1.4 of Heating")

setEPS()
postscript("7.eps", width = 11, height = 12)
plotTimeSeriesResidual(mod_heating, num_lag = 100, "ARIMA Model 3.1.4 of Heating")
dev.off()
pred_heating <- predict(mod_heating, n.ahead = 4)
intervalPred <- calIntervalPred(482, 13, pred_heating$pred, pred_heating$se)
mat_intervalPred <- matrix(nrow = 2, ncol = 4)
mat_intervalPred[1,] <- intervalPred$boundUp
mat_intervalPred[2,] <- intervalPred$boundLow
plotPredHeating(pred_heating$pred, mat_intervalPred, str = "ARIMA(0,1,2)(0,0,1)48 Model")

rm(mat_intervalPred)
setEPS()
postscript("12.eps", width = 11, height = 6)
plotPredHeating(pred_heating$pred, mat_intervalPred, str = "ARIMA(0,1,2)(0,0,1)48 Model")
dev.off()
rm(mat_intervalPred)
Question 3.4, ARIMAX Model of Heating
ts_tempExternal <- ts(dat.f$tempExternal[1: num_obs], frequency = 48)
ts_iSolar <- ts(dat.f$iSolar[1: num_obs], frequency = 48)
ts_heating <- ts(dat.f$heating[1: num_obs], frequency = 48)
auto.arima(ts_tempExternal, d = 1, seasonal = TRUE)
auto.arima(ts_iSolar, d = 0, seasonal = TRUE)
auto.arima(ts_heating, xreg = ts_tempExternal, d = 1, seasonal = TRUE)
auto.arima(ts_heating, xreg = ts_iSolar, d = 0, seasonal = TRUE)
Pre-Whitening of Heating using ARIMA Model of External Temperature
mod_tempExternal <- arima(dat.f$tempExternal[1: num_obs], order = c(0, 1, 1), seasonal = list(order = c(0, 0, 1),
period = 48), include.mean = TRUE)
x_1 <- dat.f$tempExternal[1: num_obs] - fitted(Arima(dat.f$tempExternal[1: num_obs], model = mod_tempExternal))
y_1 <- dat.f$heating[1: num_obs] - fitted(Arima(dat.f$heating[1: num_obs], model = mod_tempExternal))
sum(x_1 - mod_tempExternal$residuals) < 10^6
[1] TRUE
par(mar=c(3.5,3.5,3,1), mgp=c(2,0.7,0))
plotCCFunc(x_1, y_1, "Filtered External Temp", "Filtered Heating")

setEPS()
postscript("8.eps", width = 11, height = 12)
plotTimeSeriesResidual(mod_tempExternal, num_lag = 100, "ARIMA Model 1.1.1 of External Temperature")
dev.off()
setEPS()
postscript("10.eps", width = 11, height = 6)
plotCCFunc(x_1, y_1, "Filtered External Temp", "Filtered Heating")
dev.off()
Pre-Whitening of Heating using ARIMA Model of Solar Irradiation
mod_iSolar <- arima(dat.f$iSolar[1: num_obs], order = c(4, 0, 0), seasonal = list(order = c(0, 0, 2), period = 48),
include.mean = T)
x_2 <- dat.f$iSolar[1: num_obs] - fitted(Arima(dat.f$iSolar[1: num_obs], model = mod_iSolar))
y_2 <- residuals(Arima(dat.f$heating[1: num_obs], model = mod_iSolar))
sum(x_2 - mod_tempExternal$residuals) < 10^6
[1] TRUE
par(mar=c(3.5,3.5,3,1), mgp=c(2,0.7,0))
plotCCFunc(x_2, y_2, "Filtered Solar Irradiation", "Filtered Heating")

setEPS()
postscript("11.eps", width = 11, height = 6)
plotCCFunc(x_2, y_2, "Filtered Solar Irradiation", "Filtered Heating")
dev.off()
Prediction of Heating using ARIMAX Model
ts_heating <- ts(dat.f$heating[1: num_obs], frequency = 48)
ts_iSolar <- ts(dat.f$iSolar[1: num_obs], frequency = 48)
mat_obs <- cbind(y = ts_heating, x_1 = ts_iSolar, x_2 = lag(ts_iSolar, k = - 1))
mod_heating_x <- lm(y ~ x_1 + x_2, data = mat_obs, na.action = na.omit)

mod_residualHeating <- auto.arima(residualHeating[1: 481])
pred_residualHeating <- predict(mod_residualHeating, n.ahead = 4)$pred
mat_x <- cbind(rep(1, 4), dat.f$iSolar[(num_obs+1): (num_obs+4)], dat.f$iSolar[(num_obs): (num_obs+3)])
pred_heating_x <- mat_x %*% mod_heating_x$coefficients
pred_heating_x_residual <- pred_heating_x + pred_residualHeating
# plotPredHeating(pred_heating_x, "ARIMAX Model with Known Solar Irradiation as Input")
plotPredHeating(pred_heating_x_residual, "ARIMAX Model with Known Solar Irradiation as Input")
setEPS()
postscript("13.eps", width = 11, height = 6)
plotPredHeating(pred_heating_x_residual, "ARIMAX Model with Known Solar Irradiation as Input")
dev.off()
mod_heating_3
Call:
arima(x = dat.f$heating[2:num_obs], order = c(3, 0, 4), seasonal = list(order = c(0,
0, 1), period = 48), xreg = cbind(tempExternal = dat.f$tempExternal[2:num_obs],
iSolar = dat.f$iSolar[2:num_obs], iSolar_1 = dat.f$iSolar[1:num_obs - 1]))
Coefficients:
ar1 ar2 ar3 ma1 ma2 ma3 ma4 sma1 intercept tempExternal iSolar iSolar_1
-0.3056 0.2911 0.8903 0.6817 0.3588 -0.2915 0.2071 0.1442 87.3190 -1.6666 -0.067 -0.0368
s.e. 0.0989 0.0668 0.0776 0.1064 0.0780 0.0720 0.0500 0.0410 3.3126 0.4677 0.002 0.0019
sigma^2 estimated as 10.73: log likelihood = -1254.8, aic = 2535.6
pred_heating_3 <- predict(mod_heating_3, newxreg = cbind(tempExternal =
dat.f$tempExternal[(num_obs + 1): (num_obs + 4)], iSolar = dat.f$iSolar[(num_obs + 1): (num_obs + 4)],
iSolar_1 = dat.f$iSolar[num_obs: (num_obs + 3)]), n.ahead = 4)$pred
plotPredHeating(pred_heating_3, "ARIMAX Model with Known Solar Irradiation as Input")

ARIMAX Model using External Temperature and Solar Irradiation as Input
mod_heating_4
Call:
arima(x = dat.f$heating[2:num_obs], order = c(3, 0, 4), seasonal = list(order = c(0,
0, 2), period = 48), xreg = cbind(tempExternal = dat.f$tempExternal[2:num_obs],
iSolar = dat.f$iSolar[2:num_obs], iSolar_1 = dat.f$iSolar[1:num_obs - 1]))
Coefficients:
ar1 ar2 ar3 ma1 ma2 ma3 ma4 sma1 sma2 intercept tempExternal iSolar
-0.3030 0.2717 0.9089 0.6855 0.3925 -0.2983 0.1985 0.1568 0.2190 86.8396 -1.5537 -0.0677
s.e. 0.1117 0.1127 0.0751 0.1198 0.0998 0.0728 0.0500 0.0477 0.0511 3.5250 0.4309 0.0019
iSolar_1
-0.0373
s.e. 0.0018
sigma^2 estimated as 10.23: log likelihood = -1245.55, aic = 2519.1
setEPS()
postscript("15.eps", width = 11, height = 12)
plotTimeSeriesResidual(mod_heating_4$residuals, num_lag = 100)
dev.off()
plotPredHeating(pred_heating_4$pred, mat_intervalPred, str = "ARIMAX Model with Known Ex-Temp and Solar-Irra as Input")
There were 25 warnings (use warnings() to see them)

setEPS()
postscript("14.eps", width = 11, height = 6)
plotPredHeating(pred_heating_4$pred, mat_intervalPred, str = "ARIMAX Model with Known Ex-Temp and Solar-Irra as Input")
dev.off()
mod_heating_5
Call:
arima(x = dat.f$heating[3:num_obs], order = c(3, 0, 4), seasonal = list(order = c(0,
0, 1), period = 48), xreg = cbind(tempExternal = dat.f$tempExternal[3:num_obs],
iSolar = dat.f$iSolar[3:num_obs], iSolar_1 = dat.f$iSolar[2:(num_obs - 1)],
iSolar_2 = dat.f$iSolar[1:(num_obs - 2)]))
Coefficients:
ar1 ar2 ar3 ma1 ma2 ma3 ma4 sma1 intercept tempExternal iSolar iSolar_1
-0.3681 0.2881 0.9419 0.7496 0.4042 -0.3146 0.2103 0.1534 87.5979 -1.7410 -0.0664 -0.0375
s.e. 0.0247 0.0322 0.0237 0.0702 0.0785 0.0623 0.0529 0.0405 3.2543 0.4851 0.0021 0.0020
iSolar_2
0.0021
s.e. 0.0019
sigma^2 estimated as 10.65: log likelihood = -1251.88, aic = 2531.76

pred_heating_6 <- predict(mod_heating_6, newxreg = cbind(tempExternal =
dat.f$tempExternal[(num_obs + 1): (num_obs + 4)], iSolar = dat.f$iSolar[(num_obs + 1): (num_obs + 4)],
iSolar_1 = dat.f$iSolar[num_obs: (num_obs + 3)]), n.ahead = 4)$pred
plotPredHeating(pred_heating_6, "ARIMAX Model with Known Solar Irradiation as Input")

LS0tCnRpdGxlOiAiZHR1MDI0MTdhMzogQVJJTUEgTW9kZWwgZm9yIEJ1aWxkaW5nIERhdGEiCm91dHB1dDogaHRtbF9ub3RlYm9vawphdXRob3I6IEVkd2FyZCBKLiBYdSAoSmllIFh1KSwgczE4MTIzOApkYXRlOiAxN3RoIEFwcmlsLCAyMDE5Ci0tLQoKYGBge3IsIGluY2x1ZGU9RkFMU0V9CiMgQ2xlYXIgdmFyaWFibGVzCnJtKGxpc3Q9bHMoKSkKbGlicmFyeShrbml0cikKbGlicmFyeShmb3JlY2FzdCkKc291cmNlKCdMaW5lYXJTdG9jU3lzdGVtX0VEWFUuUicpCnNvdXJjZSgiRGF0YS5SIikKYGBgCgojIFF1ZXN0aW9uIDMuMywgQVJJTUEgTW9kZWwgb2YgSGVhdGluZwoKYGBge3IsIHdhcm5pbmc9RkFMU0UsIGZpZy5oZWlnaHQgPSAxMiwgZmlnLndpZHRoID0gMTF9Cm1vZF9oZWF0aW5nIDwtIGFyaW1hKGRhdC5mJGhlYXRpbmdbMTogbnVtX29ic10sIG9yZGVyID0gYygwLCAxLCAyKSwgc2Vhc29uYWwgPSBsaXN0KG9yZGVyID0gYygwLCAwLCAyKSwgcGVyaW9kID0gNDgpLCAKICAgICAgICAgICAgICAgICAgICAgZml4ZWQgPSBjKDAsIE5BLCBOQSwgTkEpLCBpbmNsdWRlLm1lYW4gPSBUKQptb2RfaGVhdGluZwpwbG90VGltZVNlcmllc1Jlc2lkdWFsKG1vZF9oZWF0aW5nLCBudW1fbGFnID0gMTAwLCAiQVJJTUEgTW9kZWwgMy4xLjQgb2YgSGVhdGluZyIpCmBgYAoKYGBge3IsIGV2YWw9RkFMU0V9CnNldEVQUygpCnBvc3RzY3JpcHQoIjcuZXBzIiwgd2lkdGggPSAxMSwgaGVpZ2h0ID0gMTIpCnBsb3RUaW1lU2VyaWVzUmVzaWR1YWwobW9kX2hlYXRpbmcsIG51bV9sYWcgPSAxMDAsICJBUklNQSBNb2RlbCAzLjEuNCBvZiBIZWF0aW5nIikKZGV2Lm9mZigpCmBgYAoKYGBge3IsIHdhcm5pbmc9RkFMU0UsIGZpZy5oZWlnaHQgPSA2LCBmaWcud2lkdGggPSAxMX0KcHJlZF9oZWF0aW5nIDwtIHByZWRpY3QobW9kX2hlYXRpbmcsIG4uYWhlYWQgPSA0KQppbnRlcnZhbFByZWQgPC0gY2FsSW50ZXJ2YWxQcmVkKDQ4MiwgMTMsIHByZWRfaGVhdGluZyRwcmVkLCBwcmVkX2hlYXRpbmckc2UpCm1hdF9pbnRlcnZhbFByZWQgPC0gbWF0cml4KG5yb3cgPSAyLCBuY29sID0gNCkKbWF0X2ludGVydmFsUHJlZFsxLF0gPC0gaW50ZXJ2YWxQcmVkJGJvdW5kVXAKbWF0X2ludGVydmFsUHJlZFsyLF0gPC0gaW50ZXJ2YWxQcmVkJGJvdW5kTG93CnBsb3RQcmVkSGVhdGluZyhwcmVkX2hlYXRpbmckcHJlZCwgbWF0X2ludGVydmFsUHJlZCwgc3RyID0gIkFSSU1BKDAsMSwyKSgwLDAsMSk0OCBNb2RlbCIpCmBgYAoKYGBge3IsIGV2YWw9RkFMU0V9CnNldEVQUygpCnBvc3RzY3JpcHQoIjEyLmVwcyIsIHdpZHRoID0gMTEsIGhlaWdodCA9IDYpCnBsb3RQcmVkSGVhdGluZyhwcmVkX2hlYXRpbmckcHJlZCwgbWF0X2ludGVydmFsUHJlZCwgc3RyID0gIkFSSU1BKDAsMSwyKSgwLDAsMSk0OCBNb2RlbCIpCmRldi5vZmYoKQpybShtYXRfaW50ZXJ2YWxQcmVkKQpgYGAKCiMgUXVlc3Rpb24gMy40LCBBUklNQVggTW9kZWwgb2YgSGVhdGluZwoKYGBge3IsIGV2YWw9RkFMU0V9CnRzX3RlbXBFeHRlcm5hbCA8LSB0cyhkYXQuZiR0ZW1wRXh0ZXJuYWxbMTogbnVtX29ic10sIGZyZXF1ZW5jeSA9IDQ4KQp0c19pU29sYXIgPC0gdHMoZGF0LmYkaVNvbGFyWzE6IG51bV9vYnNdLCBmcmVxdWVuY3kgPSA0OCkKdHNfaGVhdGluZyA8LSB0cyhkYXQuZiRoZWF0aW5nWzE6IG51bV9vYnNdLCBmcmVxdWVuY3kgPSA0OCkKYXV0by5hcmltYSh0c190ZW1wRXh0ZXJuYWwsIGQgPSAxLCBzZWFzb25hbCA9IFRSVUUpCmF1dG8uYXJpbWEodHNfaVNvbGFyLCBkID0gMCwgc2Vhc29uYWwgPSBUUlVFKQphdXRvLmFyaW1hKHRzX2hlYXRpbmcsIHhyZWcgPSB0c190ZW1wRXh0ZXJuYWwsIGQgPSAxLCBzZWFzb25hbCA9IFRSVUUpCmF1dG8uYXJpbWEodHNfaGVhdGluZywgeHJlZyA9IHRzX2lTb2xhciwgZCA9IDAsIHNlYXNvbmFsID0gVFJVRSkKYGBgCgojIyBQcmUtV2hpdGVuaW5nIG9mIEhlYXRpbmcgdXNpbmcgQVJJTUEgTW9kZWwgb2YgRXh0ZXJuYWwgVGVtcGVyYXR1cmUKCmBgYHtyLCB3YXJuaW5nPUZBTFNFLCBmaWcuaGVpZ2h0ID0gNiwgZmlnLndpZHRoID0gMTF9Cm1vZF90ZW1wRXh0ZXJuYWwgPC0gYXJpbWEoZGF0LmYkdGVtcEV4dGVybmFsWzE6IG51bV9vYnNdLCBvcmRlciA9IGMoMCwgMSwgMSksIHNlYXNvbmFsID0gbGlzdChvcmRlciA9IGMoMCwgMCwgMSksIAogICAgcGVyaW9kID0gNDgpLCBpbmNsdWRlLm1lYW4gPSBUUlVFKQp4XzEgPC0gZGF0LmYkdGVtcEV4dGVybmFsWzE6IG51bV9vYnNdIC0gZml0dGVkKEFyaW1hKGRhdC5mJHRlbXBFeHRlcm5hbFsxOiBudW1fb2JzXSwgbW9kZWwgPSBtb2RfdGVtcEV4dGVybmFsKSkKeV8xIDwtIGRhdC5mJGhlYXRpbmdbMTogbnVtX29ic10gLSBmaXR0ZWQoQXJpbWEoZGF0LmYkaGVhdGluZ1sxOiBudW1fb2JzXSwgbW9kZWwgPSBtb2RfdGVtcEV4dGVybmFsKSkKc3VtKHhfMSAtIG1vZF90ZW1wRXh0ZXJuYWwkcmVzaWR1YWxzKSA8IDEwXjYKcGxvdENDRnVuYyh4XzEsIHlfMSwgIkZpbHRlcmVkIEV4dGVybmFsIFRlbXAiLCAiRmlsdGVyZWQgSGVhdGluZyIpCmBgYAoKYGBge3IsIGV2YWw9RkFMU0V9CnNldEVQUygpCnBvc3RzY3JpcHQoIjguZXBzIiwgd2lkdGggPSAxMSwgaGVpZ2h0ID0gMTIpCnBsb3RUaW1lU2VyaWVzUmVzaWR1YWwobW9kX3RlbXBFeHRlcm5hbCwgbnVtX2xhZyA9IDEwMCwgIkFSSU1BIE1vZGVsIDEuMS4xIG9mIEV4dGVybmFsIFRlbXBlcmF0dXJlIikKZGV2Lm9mZigpCmBgYAoKYGBge3IsIGV2YWw9RkFMU0V9CnNldEVQUygpCnBvc3RzY3JpcHQoIjEwLmVwcyIsIHdpZHRoID0gMTEsIGhlaWdodCA9IDYpCnBsb3RDQ0Z1bmMoeF8xLCB5XzEsICJGaWx0ZXJlZCBFeHRlcm5hbCBUZW1wIiwgIkZpbHRlcmVkIEhlYXRpbmciKQpkZXYub2ZmKCkKYGBgCgojIyBQcmUtV2hpdGVuaW5nIG9mIEhlYXRpbmcgdXNpbmcgQVJJTUEgTW9kZWwgb2YgU29sYXIgSXJyYWRpYXRpb24KCmBgYHtyLCB3YXJuaW5nPUZBTFNFLCBmaWcuaGVpZ2h0ID0gNiwgZmlnLndpZHRoID0gMTF9Cm1vZF9pU29sYXIgPC0gYXJpbWEoZGF0LmYkaVNvbGFyWzE6IG51bV9vYnNdLCBvcmRlciA9IGMoNCwgMCwgMCksIHNlYXNvbmFsID0gbGlzdChvcmRlciA9IGMoMCwgMCwgMiksIHBlcmlvZCA9IDQ4KSwgCiAgICAgICAgICAgICAgICAgICAgaW5jbHVkZS5tZWFuID0gVCkKeF8yIDwtIGRhdC5mJGlTb2xhclsxOiBudW1fb2JzXSAtIGZpdHRlZChBcmltYShkYXQuZiRpU29sYXJbMTogbnVtX29ic10sIG1vZGVsID0gbW9kX2lTb2xhcikpCnlfMiA8LSByZXNpZHVhbHMoQXJpbWEoZGF0LmYkaGVhdGluZ1sxOiBudW1fb2JzXSwgbW9kZWwgPSBtb2RfaVNvbGFyKSkKc3VtKHhfMiAtIG1vZF90ZW1wRXh0ZXJuYWwkcmVzaWR1YWxzKSA8IDEwXjYKcGFyKG1hcj1jKDMuNSwzLjUsMywxKSwgbWdwPWMoMiwwLjcsMCkpCnBsb3RDQ0Z1bmMoeF8yLCB5XzIsICJGaWx0ZXJlZCBTb2xhciBJcnJhZGlhdGlvbiIsICJGaWx0ZXJlZCBIZWF0aW5nIikKYGBgCgpgYGB7ciwgZXZhbD1GQUxTRX0Kc2V0RVBTKCkKcG9zdHNjcmlwdCgiMTEuZXBzIiwgd2lkdGggPSAxMSwgaGVpZ2h0ID0gNikKcGxvdENDRnVuYyh4XzIsIHlfMiwgIkZpbHRlcmVkIFNvbGFyIElycmFkaWF0aW9uIiwgIkZpbHRlcmVkIEhlYXRpbmciKQpkZXYub2ZmKCkKYGBgCgojIyBQcmVkaWN0aW9uIG9mIEhlYXRpbmcgdXNpbmcgQVJJTUFYIE1vZGVsCgpgYGB7cn0KdHNfaGVhdGluZyA8LSB0cyhkYXQuZiRoZWF0aW5nWzE6IG51bV9vYnNdLCBmcmVxdWVuY3kgPSA0OCkKdHNfaVNvbGFyIDwtIHRzKGRhdC5mJGlTb2xhclsxOiBudW1fb2JzXSwgZnJlcXVlbmN5ID0gNDgpCm1hdF9vYnMgPC0gY2JpbmQoeSA9IHRzX2hlYXRpbmcsIHhfMSA9IHRzX2lTb2xhciwgeF8yID0gbGFnKHRzX2lTb2xhciwgayA9IC0gMSkpCm1vZF9oZWF0aW5nX3ggPC0gbG0oeSB+IHhfMSArIHhfMiwgZGF0YSA9IG1hdF9vYnMsIG5hLmFjdGlvbiA9IG5hLm9taXQpCmBgYAoKYGBge3IsIGZpZy5oZWlnaHQgPSAxMiwgZmlnLndpZHRoID0gMTF9Cm1hdF9vYnMgPC0gY2JpbmQocmVwKDEsIDQ4MiksIGRhdC5mJGlTb2xhclsxOiA0ODJdLCBjKGRhdC5mJGlTb2xhclsyOiA0ODJdLCBOYU4pKQpyZXNpZHVhbEhlYXRpbmcgPC0gZGF0LmYkaGVhdGluZ1sxOiA0ODJdIC0gbWF0X29icyAlKiUgbW9kX2hlYXRpbmdfeCRjb2VmZmljaWVudHMKcGxvdFRpbWVTZXJpZXNSZXNpZHVhbChyZXNpZHVhbEhlYXRpbmdbMTogNDgxXSwgbnVtX2xhZyA9IDEwMCkKYGBgCgpgYGB7cn0KbW9kX3Jlc2lkdWFsSGVhdGluZyA8LSBhdXRvLmFyaW1hKHJlc2lkdWFsSGVhdGluZ1sxOiA0ODFdKQpwcmVkX3Jlc2lkdWFsSGVhdGluZyA8LSBwcmVkaWN0KG1vZF9yZXNpZHVhbEhlYXRpbmcsIG4uYWhlYWQgPSA0KSRwcmVkCmBgYAoKYGBge3IsIHdhcm5pbmc9RkFMU0UsIGZpZy5oZWlnaHQgPSA2LCBmaWcud2lkdGggPSAxMX0KbWF0X3ggPC0gY2JpbmQocmVwKDEsIDQpLCBkYXQuZiRpU29sYXJbKG51bV9vYnMrMSk6IChudW1fb2JzKzQpXSwgZGF0LmYkaVNvbGFyWyhudW1fb2JzKTogKG51bV9vYnMrMyldKQpwcmVkX2hlYXRpbmdfeCA8LSBtYXRfeCAlKiUgbW9kX2hlYXRpbmdfeCRjb2VmZmljaWVudHMKcHJlZF9oZWF0aW5nX3hfcmVzaWR1YWwgPC0gcHJlZF9oZWF0aW5nX3ggKyBwcmVkX3Jlc2lkdWFsSGVhdGluZwojIHBsb3RQcmVkSGVhdGluZyhwcmVkX2hlYXRpbmdfeCwgIkFSSU1BWCBNb2RlbCB3aXRoIEtub3duIFNvbGFyIElycmFkaWF0aW9uIGFzIElucHV0IikKcGxvdFByZWRIZWF0aW5nKHByZWRfaGVhdGluZ194X3Jlc2lkdWFsLCAiQVJJTUFYIE1vZGVsIHdpdGggS25vd24gU29sYXIgSXJyYWRpYXRpb24gYXMgSW5wdXQiKQpgYGAKCmBgYHtyLCBldmFsPUZBTFNFfQpzZXRFUFMoKQpwb3N0c2NyaXB0KCIxMy5lcHMiLCB3aWR0aCA9IDExLCBoZWlnaHQgPSA2KQpwbG90UHJlZEhlYXRpbmcocHJlZF9oZWF0aW5nX3hfcmVzaWR1YWwsICJBUklNQVggTW9kZWwgd2l0aCBLbm93biBTb2xhciBJcnJhZGlhdGlvbiBhcyBJbnB1dCIpCmRldi5vZmYoKQpgYGAKCmBgYHtyLCBmaWcuaGVpZ2h0ID0gMTIsIGZpZy53aWR0aCA9IDExfQptb2RfaGVhdGluZ18zIDwtIGFyaW1hKGRhdC5mJGhlYXRpbmdbMjogbnVtX29ic10sIG9yZGVyID0gYygzLCAwLCA0KSwgc2Vhc29uYWwgPSBsaXN0KG9yZGVyID0gYygwLCAwLCAxKSwgcGVyaW9kID0gNDgpLCAKICAgIHhyZWcgPSBjYmluZCh0ZW1wRXh0ZXJuYWwgPSBkYXQuZiR0ZW1wRXh0ZXJuYWxbMjogbnVtX29ic10sIGlTb2xhciA9IGRhdC5mJGlTb2xhclsyOiBudW1fb2JzXSwKICAgIGlTb2xhcl8xID0gZGF0LmYkaVNvbGFyWzE6IG51bV9vYnMtMV0pKQptb2RfaGVhdGluZ18zCnBsb3RUaW1lU2VyaWVzUmVzaWR1YWwobW9kX2hlYXRpbmdfMyRyZXNpZHVhbHMsIG51bV9sYWcgPSAxMDApCmBgYAoKYGBge3IsIGZpZy5oZWlnaHQgPSA2LCBmaWcud2lkdGggPSAxMX0KcHJlZF9oZWF0aW5nXzMgPC0gcHJlZGljdChtb2RfaGVhdGluZ18zLCBuZXd4cmVnID0gY2JpbmQodGVtcEV4dGVybmFsID0gCiAgICBkYXQuZiR0ZW1wRXh0ZXJuYWxbKG51bV9vYnMgKyAxKTogKG51bV9vYnMgKyA0KV0sIGlTb2xhciA9IGRhdC5mJGlTb2xhclsobnVtX29icyArIDEpOiAobnVtX29icyArIDQpXSwgCiAgICBpU29sYXJfMSA9IGRhdC5mJGlTb2xhcltudW1fb2JzOiAobnVtX29icyArIDMpXSksIG4uYWhlYWQgPSA0KSRwcmVkCnBsb3RQcmVkSGVhdGluZyhwcmVkX2hlYXRpbmdfMywgIkFSSU1BWCBNb2RlbCB3aXRoIEtub3duIEV4LVRlbXAgYW5kIFNvbGFyLUlycmEgYXMgSW5wdXQiKQpgYGAKCiMjIEFSSU1BWCBNb2RlbCB1c2luZyBFeHRlcm5hbCBUZW1wZXJhdHVyZSBhbmQgU29sYXIgSXJyYWRpYXRpb24gYXMgSW5wdXQKCmBgYHtyLCBmaWcuaGVpZ2h0ID0gMTIsIGZpZy53aWR0aCA9IDExfQptb2RfaGVhdGluZ180IDwtIGFyaW1hKGRhdC5mJGhlYXRpbmdbMjogbnVtX29ic10sIG9yZGVyID0gYygzLCAwLCA0KSwgc2Vhc29uYWwgPSBsaXN0KG9yZGVyID0gYygwLCAwLCAyKSwgcGVyaW9kID0gNDgpLCAKICAgIHhyZWcgPSBjYmluZCh0ZW1wRXh0ZXJuYWwgPSBkYXQuZiR0ZW1wRXh0ZXJuYWxbMjogbnVtX29ic10sIGlTb2xhciA9IGRhdC5mJGlTb2xhclsyOiBudW1fb2JzXSwKICAgIGlTb2xhcl8xID0gZGF0LmYkaVNvbGFyWzE6IG51bV9vYnMtMV0pKQptb2RfaGVhdGluZ180CnBsb3RUaW1lU2VyaWVzUmVzaWR1YWwobW9kX2hlYXRpbmdfNCRyZXNpZHVhbHMsIG51bV9sYWcgPSAxMDAsICJNb2RlbCA0IikKYGBgCgpgYGB7ciwgZXZhbD1GQUxTRX0Kc2V0RVBTKCkKcG9zdHNjcmlwdCgiMTUuZXBzIiwgd2lkdGggPSAxMSwgaGVpZ2h0ID0gMTIpCnBsb3RUaW1lU2VyaWVzUmVzaWR1YWwobW9kX2hlYXRpbmdfNCRyZXNpZHVhbHMsIG51bV9sYWcgPSAxMDApCmRldi5vZmYoKQpgYGAKCmBgYHtyLCBmaWcuaGVpZ2h0ID0gNiwgZmlnLndpZHRoID0gMTF9CnByZWRfaGVhdGluZ180IDwtIHByZWRpY3QobW9kX2hlYXRpbmdfNCwgbmV3eHJlZyA9IGNiaW5kKHRlbXBFeHRlcm5hbCA9IAogICAgZGF0LmYkdGVtcEV4dGVybmFsWyhudW1fb2JzICsgMSk6IChudW1fb2JzICsgNCldLCBpU29sYXIgPSBkYXQuZiRpU29sYXJbKG51bV9vYnMgKyAxKTogKG51bV9vYnMgKyA0KV0sIAogICAgaVNvbGFyXzEgPSBkYXQuZiRpU29sYXJbbnVtX29iczogKG51bV9vYnMgKyAzKV0pLCBuLmFoZWFkID0gNCkKaW50ZXJ2YWxQcmVkIDwtIGNhbEludGVydmFsUHJlZCg0ODIsIDEzLCBwcmVkX2hlYXRpbmdfNCRwcmVkLCBwcmVkX2hlYXRpbmdfNCRzZSkKbWF0X2ludGVydmFsUHJlZCA8LSBtYXRyaXgobnJvdyA9IDIsIG5jb2wgPSA0KQptYXRfaW50ZXJ2YWxQcmVkWzEsXSA8LSBpbnRlcnZhbFByZWQkYm91bmRVcAptYXRfaW50ZXJ2YWxQcmVkWzIsXSA8LSBpbnRlcnZhbFByZWQkYm91bmRMb3cKcGxvdFByZWRIZWF0aW5nKHByZWRfaGVhdGluZ180JHByZWQsIG1hdF9pbnRlcnZhbFByZWQsIHN0ciA9ICJBUklNQVggTW9kZWwgd2l0aCBLbm93biBFeC1UZW1wIGFuZCBTb2xhci1JcnJhIGFzIElucHV0IikKYGBgCgpgYGB7ciwgZXZhbD1GQUxTRX0Kc2V0RVBTKCkKcG9zdHNjcmlwdCgiMTQuZXBzIiwgd2lkdGggPSAxMSwgaGVpZ2h0ID0gNikKcGxvdFByZWRIZWF0aW5nKHByZWRfaGVhdGluZ180JHByZWQsIG1hdF9pbnRlcnZhbFByZWQsIHN0ciA9ICJBUklNQVggTW9kZWwgd2l0aCBLbm93biBFeC1UZW1wIGFuZCBTb2xhci1JcnJhIGFzIElucHV0IikKZGV2Lm9mZigpCmBgYAoKYGBge3IsIGZpZy5oZWlnaHQgPSAxMiwgZmlnLndpZHRoID0gMTF9Cm1vZF9oZWF0aW5nXzUgPC0gYXJpbWEoZGF0LmYkaGVhdGluZ1szOiBudW1fb2JzXSwgb3JkZXIgPSBjKDMsIDAsIDQpLCBzZWFzb25hbCA9IGxpc3Qob3JkZXIgPSBjKDAsIDAsIDEpLCBwZXJpb2QgPSA0OCksIAogICAgeHJlZyA9IGNiaW5kKHRlbXBFeHRlcm5hbCA9IGRhdC5mJHRlbXBFeHRlcm5hbFszOiBudW1fb2JzXSwgaVNvbGFyID0gZGF0LmYkaVNvbGFyWzM6IG51bV9vYnNdLAogICAgaVNvbGFyXzEgPSBkYXQuZiRpU29sYXJbMjogKG51bV9vYnMtMSldLCBpU29sYXJfMiA9IGRhdC5mJGlTb2xhclsxOiAobnVtX29icy0yKV0pKQptb2RfaGVhdGluZ181CnBsb3RUaW1lU2VyaWVzUmVzaWR1YWwobW9kX2hlYXRpbmdfNSRyZXNpZHVhbHMsIG51bV9sYWcgPSAxMDApCmBgYAoKYGBge3IsIGZpZy5oZWlnaHQgPSAxMiwgZmlnLndpZHRoID0gMTF9Cm1vZF9oZWF0aW5nXzYgPC0gYXJpbWEoZGF0LmYkaGVhdGluZ1syOiBudW1fb2JzXSwgb3JkZXIgPSBjKDMsIDEsIDQpLCBzZWFzb25hbCA9IGxpc3Qob3JkZXIgPSBjKDAsIDAsIDIpLCBwZXJpb2QgPSA0OCksIAogICAgeHJlZyA9IGNiaW5kKHRlbXBFeHRlcm5hbCA9IGRhdC5mJHRlbXBFeHRlcm5hbFsyOiBudW1fb2JzXSwgaVNvbGFyID0gZGF0LmYkaVNvbGFyWzI6IG51bV9vYnNdLAogICAgaVNvbGFyXzEgPSBkYXQuZiRpU29sYXJbMTogbnVtX29icy0xXSkpCm1vZF9oZWF0aW5nXzYKcGxvdFRpbWVTZXJpZXNSZXNpZHVhbChtb2RfaGVhdGluZ182JHJlc2lkdWFscywgbnVtX2xhZyA9IDEwMCkKYGBgCgpgYGB7ciwgZmlnLmhlaWdodCA9IDYsIGZpZy53aWR0aCA9IDExfQpwcmVkX2hlYXRpbmdfNiA8LSBwcmVkaWN0KG1vZF9oZWF0aW5nXzYsIG5ld3hyZWcgPSBjYmluZCh0ZW1wRXh0ZXJuYWwgPSAKICAgIGRhdC5mJHRlbXBFeHRlcm5hbFsobnVtX29icyArIDEpOiAobnVtX29icyArIDQpXSwgaVNvbGFyID0gZGF0LmYkaVNvbGFyWyhudW1fb2JzICsgMSk6IChudW1fb2JzICsgNCldLCAKICAgIGlTb2xhcl8xID0gZGF0LmYkaVNvbGFyW251bV9vYnM6IChudW1fb2JzICsgMyldKSwgbi5haGVhZCA9IDQpJHByZWQKcGxvdFByZWRIZWF0aW5nKHByZWRfaGVhdGluZ182LCAiQVJJTUFYIE1vZGVsIHdpdGggS25vd24gU29sYXIgSXJyYWRpYXRpb24gYXMgSW5wdXQiKQpgYGA=