Introduction
Holt (1957) and Winters (1960) extended Holt’s method to capture seasonality. The Holt-Winters seasonal method comprises the forecast equation and three smoothing equations — one for the level \(\ell_{t}\), one for the trend \(b_{t}\) , and one for the seasonal component \(s_{t}\) , with corresponding smoothing parameters \(\alpha\), \(\beta^*\) and \(\gamma\). We use m to denote the frequency of the seasonality, i.e., the number of seasons in a year. For example, for quarterly data m = 4 , and for monthly data m = 12 .
1. Holt-Winters’ Additive Method
The component form for the additive method is:
\[\begin{align*}
\hat{y}_{t+h|t} &= \ell_{t} + hb_{t} + s_{t+h-m(k+1)} \\
\ell_{t} &= \alpha(y_{t} - s_{t-m}) + (1 - \alpha)(\ell_{t-1} + b_{t-1})\\
b_{t} &= \beta^*(\ell_{t} - \ell_{t-1}) + (1 - \beta^*)b_{t-1}\\
s_{t} &= \gamma (y_{t}-\ell_{t-1}-b_{t-1}) + (1-\gamma)s_{t-m},
\end{align*}\]
where k is the integer part of \((h-1)/m\), which ensures that the estimates of the seasonal indices used for forecasting come from the final year of the sample. The level equation shows a weighted average between the seasonally adjusted observation \((y_{t} - s_{t-m})\) and the non-seasonal forecast \((\ell_{t-1}+b_{t-1})\) for time t . The trend equation is identical to Holt’s linear method. The seasonal equation shows a weighted average between the current seasonal index, \((y_{t}-\ell_{t-1}-b_{t-1})\), and the seasonal index of the same season last year (i.e., m time periods ago).
2. Holt-Winters’ Multiplicative Method
The component form for the multiplicative method is:
\[\begin{align*}
\hat{y}_{t+h|t} &= (\ell_{t} + hb_{t})s_{t+h-m(k+1)} \\
\ell_{t} &= \alpha \frac{y_{t}}{s_{t-m}} + (1 - \alpha)(\ell_{t-1} + b_{t-1})\\
b_{t} &= \beta^*(\ell_{t}-\ell_{t-1}) + (1 - \beta^*)b_{t-1} \\
s_{t} &= \gamma \frac{y_{t}}{(\ell_{t-1} + b_{t-1})} + (1 - \gamma)s_{t-m}
\end{align*}\]
3. An Application: International Tourist Visitors in Australia
We apply Holt-Winters’ method with both additive and multiplicative seasonality to forecast quarterly visitors in Australia spent by international tourists. Figure 1 shows the data from 1999 to 2013, and the forecasts for 2014 – 2015. Note that the data show an obvious seasonal pattern, with peaks observed in the March quarter of each year, corresponding to the Australian summer.
library(tidyverse)
#---------------------------
# Some Ultility Funstions
#---------------------------
# A function for theme:
my_theme <- function(...) {
theme(
axis.line = element_blank(),
axis.text.x = element_text(color = "white", lineheight = 0.9),
axis.text.y = element_text(color = "white", lineheight = 0.9),
axis.ticks = element_line(color = "white", size = 0.2),
axis.title.x = element_text(color = "white", margin = margin(0, 10, 0, 0)),
axis.title.y = element_text(color = "white", angle = 90, margin = margin(0, 10, 0, 0)),
axis.ticks.length = unit(0.3, "lines"),
legend.background = element_rect(color = NA, fill = " gray10"),
legend.key = element_rect(color = "white", fill = " gray10"),
legend.key.size = unit(1.2, "lines"),
legend.key.height = NULL,
legend.key.width = NULL,
legend.text = element_text(color = "white"),
legend.title = element_text(face = "bold", hjust = 0, color = "white"),
legend.text.align = NULL,
legend.title.align = NULL,
legend.direction = "vertical",
legend.box = NULL,
panel.background = element_rect(fill = "gray10", color = NA),
panel.border = element_blank(),
panel.grid.major = element_line(color = "grey35"),
panel.grid.minor = element_line(color = "grey20"),
panel.spacing = unit(0.5, "lines"),
strip.background = element_rect(fill = "grey30", color = "grey10"),
strip.text.x = element_text(color = "white"),
strip.text.y = element_text(color = "white", angle = -90),
plot.background = element_rect(color = "gray10", fill = "gray10"),
plot.title = element_text(color = "white", hjust = 0, lineheight = 1.25,
margin = margin(2, 2, 2, 2)),
plot.subtitle = element_text(color = "white", hjust = 0, margin = margin(2, 2, 2, 2)),
plot.caption = element_text(color = "white", hjust = 0),
plot.margin = unit(rep(1, 4), "lines"))
}
# A function for calcualting MAE:
mae <- function(actual, predicted) {
y <- actual - predicted
y %>% abs() %>% mean() %>% return()
}
#--------------------------------
# Holt-Winters’ seasonal methods
#--------------------------------
library(fpp2)
# Data for training model:
aust <- austourists[1:60] %>% ts(start = 1999, frequency = 4)
# Inspect our data:
autoplot(aust) +
geom_line(color = "cyan") +
geom_point(color = "cyan") +
my_theme() +
labs(x = NULL, y = NULL,
title = "Figure 1: Quarterly Visitors (in millions) to Australia: 1999-2013",
subtitle = "Data Source: Tourism Research Australia.")

# Use two methods for forecasting the next 8 observations:
fit1 <- hw(aust, h = 8, seasonal = "additive")
fit2 <- hw(aust, h = 8, seasonal = "multiplicative")
# Compare actuals vs predcitions:
my_df <- data_frame(Actual = austourists[61:68],
Additive = fit1$mean %>% as.vector(),
Multiplicative = fit2$mean %>% as.vector(), t = 1:8)
my_df %>%
gather(Series, b, -t) %>%
ggplot(aes(t, b, color = Series)) +
geom_line() +
geom_point() +
my_theme() +
scale_color_manual(values = c("cyan", "purple", "orange")) +
scale_x_continuous(breaks = seq(1:8)) +
labs(x = NULL, y = NULL,
title = "Figure 2: Actuals vs Additive and Multiplicate Predictions")

## [1] 2.362556
## [1] 2.633565
Further reading
Two articles by Ev Gardner (Gardner, 1985, 2006) provide a great overview of the history of exponential smoothing, and its many variations.
A full book treatment of the subject providing the mathematical details is given by Hyndman et al. (2008).
References
Gardner, E. S. (1985). Exponential smoothing: The state of the art. Journal of Forecasting, 4(1), 1–28. https://doi.org/10.1002/for.3980040103
Gardner, E. S. (2006). Exponential smoothing: The state of the art — Part II. International Journal of Forecasting, 22, 637–666. https://doi.org/10.1016/j.ijforecast.2006.03.005
Hyndman, R. J., Koehler, A. B., Ord, J. K., & Snyder, R. D. (2008). Forecasting with exponential smoothing: The state space approach. Berlin: Springer-Verlag. http://www.exponentialsmoothing.net
LS0tDQp0aXRsZTogIkhvbHQtV2ludGVyc+KAmSBTZWFzb25hbCBNZXRob2RzIGZvciBGb3JlY2FzdGluZyBUaW1lIFNlcmllcyIgDQpzdWJ0aXRsZTogIlNlbGYtdHJhaW5pbmcgUHJvamVjdCINCmF1dGhvcjogIk5ndXllbiBDaGkgRHVuZyINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDogDQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQ0KICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KICAgIGhpZ2hsaWdodDogcHlnbWVudHMNCiAgICAjIG51bWJlcl9zZWN0aW9uczogeWVzDQogICAgdGhlbWU6ICJmbGF0bHkiDQogICAgdG9jOiBUUlVFDQogICAgdG9jX2Zsb2F0OiBUUlVFDQotLS0NCg0KYGBge3Igc2V0dXAsaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0UpDQpgYGANCg0KIyBJbnRyb2R1Y3Rpb24NCg0KSG9sdCAoMTk1NykgYW5kIFdpbnRlcnMgKDE5NjApIGV4dGVuZGVkIEhvbHTigJlzIG1ldGhvZCB0byBjYXB0dXJlIHNlYXNvbmFsaXR5LiBUaGUgSG9sdC1XaW50ZXJzIHNlYXNvbmFsIG1ldGhvZCBjb21wcmlzZXMgdGhlIGZvcmVjYXN0IGVxdWF0aW9uIGFuZCB0aHJlZSBzbW9vdGhpbmcgZXF1YXRpb25zIOKAlCBvbmUgZm9yIHRoZSBsZXZlbCAkXGVsbF97dH0kLCBvbmUgZm9yIHRoZSB0cmVuZCAkYl97dH0kICwgYW5kIG9uZSBmb3IgdGhlIHNlYXNvbmFsIGNvbXBvbmVudCAkc197dH0kICwgd2l0aCBjb3JyZXNwb25kaW5nIHNtb290aGluZyBwYXJhbWV0ZXJzICRcYWxwaGEkLCAkXGJldGFeKiQgYW5kICRcZ2FtbWEkLiBXZSB1c2UgbSB0byBkZW5vdGUgdGhlIGZyZXF1ZW5jeSBvZiB0aGUgc2Vhc29uYWxpdHksIGkuZS4sIHRoZSBudW1iZXIgb2Ygc2Vhc29ucyBpbiBhIHllYXIuIEZvciBleGFtcGxlLCBmb3IgcXVhcnRlcmx5IGRhdGEgbSA9IDQgLCBhbmQgZm9yIG1vbnRobHkgZGF0YSBtID0gMTIgLg0KDQojIyAxLiBIb2x0LVdpbnRlcnPigJkgQWRkaXRpdmUgTWV0aG9kDQoNClRoZSBjb21wb25lbnQgZm9ybSBmb3IgdGhlIGFkZGl0aXZlIG1ldGhvZCBpczoNCg0KJCRcYmVnaW57YWxpZ24qfQ0KICBcaGF0e3l9X3t0K2h8dH0gJj0gXGVsbF97dH0gKyBoYl97dH0gKyBzX3t0K2gtbShrKzEpfSBcXA0KICBcZWxsX3t0fSAmPSBcYWxwaGEoeV97dH0gLSBzX3t0LW19KSArICgxIC0gXGFscGhhKShcZWxsX3t0LTF9ICsgYl97dC0xfSlcXA0KICBiX3t0fSAmPSBcYmV0YV4qKFxlbGxfe3R9IC0gXGVsbF97dC0xfSkgKyAoMSAtIFxiZXRhXiopYl97dC0xfVxcDQogIHNfe3R9ICY9IFxnYW1tYSAoeV97dH0tXGVsbF97dC0xfS1iX3t0LTF9KSArICgxLVxnYW1tYSlzX3t0LW19LA0KXGVuZHthbGlnbip9JCQNCg0KDQp3aGVyZSBrIGlzIHRoZSBpbnRlZ2VyIHBhcnQgb2YgJChoLTEpL20kLCB3aGljaCBlbnN1cmVzIHRoYXQgdGhlIGVzdGltYXRlcyBvZiB0aGUgc2Vhc29uYWwgaW5kaWNlcyB1c2VkIGZvciBmb3JlY2FzdGluZyBjb21lIGZyb20gdGhlIGZpbmFsIHllYXIgb2YgdGhlIHNhbXBsZS4gVGhlIGxldmVsIGVxdWF0aW9uIHNob3dzIGEgd2VpZ2h0ZWQgYXZlcmFnZSBiZXR3ZWVuIHRoZSBzZWFzb25hbGx5IGFkanVzdGVkIG9ic2VydmF0aW9uICQoeV97dH0gLSBzX3t0LW19KSQgYW5kIHRoZSBub24tc2Vhc29uYWwgZm9yZWNhc3QgJChcZWxsX3t0LTF9K2Jfe3QtMX0pJCBmb3IgdGltZSB0IC4gVGhlIHRyZW5kIGVxdWF0aW9uIGlzIGlkZW50aWNhbCB0byBIb2x04oCZcyBsaW5lYXIgbWV0aG9kLiBUaGUgc2Vhc29uYWwgZXF1YXRpb24gc2hvd3MgYSB3ZWlnaHRlZCBhdmVyYWdlIGJldHdlZW4gdGhlIGN1cnJlbnQgc2Vhc29uYWwgaW5kZXgsICQoeV97dH0tXGVsbF97dC0xfS1iX3t0LTF9KSQsIGFuZCB0aGUgc2Vhc29uYWwgaW5kZXggb2YgdGhlIHNhbWUgc2Vhc29uIGxhc3QgeWVhciAoaS5lLiwgbSB0aW1lIHBlcmlvZHMgYWdvKS4NCg0KIyMgMi4gSG9sdC1XaW50ZXJz4oCZIE11bHRpcGxpY2F0aXZlIE1ldGhvZA0KDQpUaGUgY29tcG9uZW50IGZvcm0gZm9yIHRoZSBtdWx0aXBsaWNhdGl2ZSBtZXRob2QgaXM6DQoNCiQkXGJlZ2lue2FsaWduKn0NCiAgXGhhdHt5fV97dCtofHR9ICY9IChcZWxsX3t0fSArIGhiX3t0fSlzX3t0K2gtbShrKzEpfSBcXA0KICBcZWxsX3t0fSAmPSBcYWxwaGEgXGZyYWN7eV97dH19e3Nfe3QtbX19ICsgKDEgLSBcYWxwaGEpKFxlbGxfe3QtMX0gKyBiX3t0LTF9KVxcDQogIGJfe3R9ICY9IFxiZXRhXiooXGVsbF97dH0tXGVsbF97dC0xfSkgKyAoMSAtIFxiZXRhXiopYl97dC0xfSAgICAgICAgICAgICAgICBcXA0KICBzX3t0fSAmPSBcZ2FtbWEgXGZyYWN7eV97dH19eyhcZWxsX3t0LTF9ICsgYl97dC0xfSl9ICsgKDEgLSBcZ2FtbWEpc197dC1tfQ0KXGVuZHthbGlnbip9JCQNCg0KDQoNCiMjIDMuIEFuIEFwcGxpY2F0aW9uOiBJbnRlcm5hdGlvbmFsIFRvdXJpc3QgVmlzaXRvcnMgaW4gQXVzdHJhbGlhDQoNCldlIGFwcGx5IEhvbHQtV2ludGVyc+KAmSBtZXRob2Qgd2l0aCBib3RoIGFkZGl0aXZlIGFuZCBtdWx0aXBsaWNhdGl2ZSBzZWFzb25hbGl0eSB0byBmb3JlY2FzdCBxdWFydGVybHkgdmlzaXRvcnMgaW4gQXVzdHJhbGlhIHNwZW50IGJ5IGludGVybmF0aW9uYWwgdG91cmlzdHMuIEZpZ3VyZSAxIHNob3dzIHRoZSBkYXRhIGZyb20gMTk5OSB0byAyMDEzLCBhbmQgdGhlIGZvcmVjYXN0cyBmb3IgMjAxNCDigJMgMjAxNS4gTm90ZSB0aGF0IHRoZSBkYXRhIHNob3cgYW4gb2J2aW91cyBzZWFzb25hbCBwYXR0ZXJuLCB3aXRoIHBlYWtzIG9ic2VydmVkIGluIHRoZSBNYXJjaCBxdWFydGVyIG9mIGVhY2ggeWVhciwgY29ycmVzcG9uZGluZyB0byB0aGUgQXVzdHJhbGlhbiBzdW1tZXIuDQoNCg0KYGBge3J9DQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCg0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KIyAgU29tZSBVbHRpbGl0eSBGdW5zdGlvbnMNCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KIyBBIGZ1bmN0aW9uIGZvciB0aGVtZTogDQpteV90aGVtZSA8LSBmdW5jdGlvbiguLi4pIHsNCiAgdGhlbWUoDQogICAgYXhpcy5saW5lID0gZWxlbWVudF9ibGFuaygpLCAgDQogICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoY29sb3IgPSAid2hpdGUiLCBsaW5laGVpZ2h0ID0gMC45KSwgIA0KICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gIndoaXRlIiwgbGluZWhlaWdodCA9IDAuOSksICANCiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9saW5lKGNvbG9yID0gIndoaXRlIiwgc2l6ZSAgPSAgMC4yKSwgIA0KICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJ3aGl0ZSIsIG1hcmdpbiA9IG1hcmdpbigwLCAxMCwgMCwgMCkpLCAgDQogICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gIndoaXRlIiwgYW5nbGUgPSA5MCwgbWFyZ2luID0gbWFyZ2luKDAsIDEwLCAwLCAwKSksICANCiAgICBheGlzLnRpY2tzLmxlbmd0aCA9IHVuaXQoMC4zLCAibGluZXMiKSwgICANCiAgICBsZWdlbmQuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChjb2xvciA9IE5BLCBmaWxsID0gIiBncmF5MTAiKSwgIA0KICAgIGxlZ2VuZC5rZXkgPSBlbGVtZW50X3JlY3QoY29sb3IgPSAid2hpdGUiLCAgZmlsbCA9ICIgZ3JheTEwIiksICANCiAgICBsZWdlbmQua2V5LnNpemUgPSB1bml0KDEuMiwgImxpbmVzIiksICANCiAgICBsZWdlbmQua2V5LmhlaWdodCA9IE5VTEwsICANCiAgICBsZWdlbmQua2V5LndpZHRoID0gTlVMTCwgICAgICANCiAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJ3aGl0ZSIpLCAgDQogICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIsIGhqdXN0ID0gMCwgY29sb3IgPSAid2hpdGUiKSwgIA0KICAgIGxlZ2VuZC50ZXh0LmFsaWduID0gTlVMTCwgIA0KICAgIGxlZ2VuZC50aXRsZS5hbGlnbiA9IE5VTEwsICANCiAgICBsZWdlbmQuZGlyZWN0aW9uID0gInZlcnRpY2FsIiwgIA0KICAgIGxlZ2VuZC5ib3ggPSBOVUxMLCANCiAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAiZ3JheTEwIiwgY29sb3IgID0gIE5BKSwgIA0KICAgIHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9saW5lKGNvbG9yID0gImdyZXkzNSIpLCAgDQogICAgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfbGluZShjb2xvciA9ICJncmV5MjAiKSwgIA0KICAgIHBhbmVsLnNwYWNpbmcgPSB1bml0KDAuNSwgImxpbmVzIiksICAgDQogICAgc3RyaXAuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gImdyZXkzMCIsIGNvbG9yID0gImdyZXkxMCIpLCAgDQogICAgc3RyaXAudGV4dC54ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gIndoaXRlIiksICANCiAgICBzdHJpcC50ZXh0LnkgPSBlbGVtZW50X3RleHQoY29sb3IgPSAid2hpdGUiLCBhbmdsZSA9IC05MCksICANCiAgICBwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoY29sb3IgPSAiZ3JheTEwIiwgZmlsbCA9ICJncmF5MTAiKSwgIA0KICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoY29sb3IgPSAid2hpdGUiLCBoanVzdCA9IDAsIGxpbmVoZWlnaHQgPSAxLjI1LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luID0gbWFyZ2luKDIsIDIsIDIsIDIpKSwgIA0KICAgIHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQoY29sb3IgPSAid2hpdGUiLCBoanVzdCA9IDAsIG1hcmdpbiA9IG1hcmdpbigyLCAyLCAyLCAyKSksICANCiAgICBwbG90LmNhcHRpb24gPSBlbGVtZW50X3RleHQoY29sb3IgPSAid2hpdGUiLCBoanVzdCA9IDApLCAgDQogICAgcGxvdC5tYXJnaW4gPSB1bml0KHJlcCgxLCA0KSwgImxpbmVzIikpDQogIA0KfQ0KDQojIEEgZnVuY3Rpb24gZm9yIGNhbGN1YWx0aW5nIE1BRTogDQoNCm1hZSA8LSBmdW5jdGlvbihhY3R1YWwsIHByZWRpY3RlZCkgew0KICB5IDwtIGFjdHVhbCAtIHByZWRpY3RlZA0KICB5ICU+JSBhYnMoKSAlPiUgbWVhbigpICU+JSByZXR1cm4oKQ0KfQ0KDQoNCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KIyBIb2x0LVdpbnRlcnPigJkgc2Vhc29uYWwgbWV0aG9kcw0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCmxpYnJhcnkoZnBwMikNCiMgRGF0YSBmb3IgdHJhaW5pbmcgbW9kZWw6IA0KYXVzdCA8LSBhdXN0b3VyaXN0c1sxOjYwXSAlPiUgdHMoc3RhcnQgPSAxOTk5LCBmcmVxdWVuY3kgPSA0KQ0KDQojIEluc3BlY3Qgb3VyIGRhdGE6IA0KYXV0b3Bsb3QoYXVzdCkgKyANCiAgZ2VvbV9saW5lKGNvbG9yID0gImN5YW4iKSArIA0KICBnZW9tX3BvaW50KGNvbG9yID0gImN5YW4iKSArIA0KICBteV90aGVtZSgpICsgDQogIGxhYnMoeCA9IE5VTEwsIHkgPSBOVUxMLCANCiAgICAgICB0aXRsZSA9ICJGaWd1cmUgMTogUXVhcnRlcmx5IFZpc2l0b3JzIChpbiBtaWxsaW9ucykgdG8gQXVzdHJhbGlhOiAxOTk5LTIwMTMiLCANCiAgICAgICBzdWJ0aXRsZSA9ICJEYXRhIFNvdXJjZTogVG91cmlzbSBSZXNlYXJjaCBBdXN0cmFsaWEuIikNCiAgDQojIFVzZSB0d28gbWV0aG9kcyBmb3IgZm9yZWNhc3RpbmcgdGhlIG5leHQgOCBvYnNlcnZhdGlvbnM6IA0KZml0MSA8LSBodyhhdXN0LCBoID0gOCwgc2Vhc29uYWwgPSAiYWRkaXRpdmUiKQ0KZml0MiA8LSBodyhhdXN0LCBoID0gOCwgc2Vhc29uYWwgPSAibXVsdGlwbGljYXRpdmUiKQ0KDQoNCiMgQ29tcGFyZSBhY3R1YWxzIHZzIHByZWRjaXRpb25zOiANCm15X2RmIDwtIGRhdGFfZnJhbWUoQWN0dWFsID0gYXVzdG91cmlzdHNbNjE6NjhdLCANCiAgICAgICAgICAgICAgICAgICAgQWRkaXRpdmUgPSBmaXQxJG1lYW4gJT4lIGFzLnZlY3RvcigpLCANCiAgICAgICAgICAgICAgICAgICAgTXVsdGlwbGljYXRpdmUgPSBmaXQyJG1lYW4gJT4lIGFzLnZlY3RvcigpLCB0ID0gMTo4KQ0KDQpteV9kZiAlPiUgDQogIGdhdGhlcihTZXJpZXMsIGIsIC10KSAlPiUgDQogIGdncGxvdChhZXModCwgYiwgY29sb3IgPSBTZXJpZXMpKSArIA0KICBnZW9tX2xpbmUoKSArIA0KICBnZW9tX3BvaW50KCkgKyANCiAgbXlfdGhlbWUoKSArIA0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiY3lhbiIsICJwdXJwbGUiLCAib3JhbmdlIikpICsgDQogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoMTo4KSkgKyANCiAgbGFicyh4ID0gTlVMTCwgeSA9IE5VTEwsIA0KICAgICAgIHRpdGxlID0gIkZpZ3VyZSAyOiBBY3R1YWxzIHZzIEFkZGl0aXZlIGFuZCBNdWx0aXBsaWNhdGUgUHJlZGljdGlvbnMiKQ0KDQojIENvbXBhcmUgTUFFczogDQptYWUobXlfZGYkQWN0dWFsLCBteV9kZiRBZGRpdGl2ZSkNCm1hZShteV9kZiRBY3R1YWwsIG15X2RmJE11bHRpcGxpY2F0aXZlKSANCg0KYGBgDQoNCg0KIyBGdXJ0aGVyIHJlYWRpbmcNCg0KLSBUd28gYXJ0aWNsZXMgYnkgRXYgR2FyZG5lciAoR2FyZG5lciwgMTk4NSwgMjAwNikgcHJvdmlkZSBhIGdyZWF0IG92ZXJ2aWV3IG9mIHRoZSBoaXN0b3J5IG9mIGV4cG9uZW50aWFsIHNtb290aGluZywgYW5kIGl0cyBtYW55IHZhcmlhdGlvbnMuDQoNCi0gQSBmdWxsIGJvb2sgdHJlYXRtZW50IG9mIHRoZSBzdWJqZWN0IHByb3ZpZGluZyB0aGUgbWF0aGVtYXRpY2FsIGRldGFpbHMgaXMgZ2l2ZW4gYnkgSHluZG1hbiBldCBhbC4gKDIwMDgpLg0KDQojIFJlZmVyZW5jZXMNCg0KMS4gR2FyZG5lciwgRS4gUy4gKDE5ODUpLiBFeHBvbmVudGlhbCBzbW9vdGhpbmc6IFRoZSBzdGF0ZSBvZiB0aGUgYXJ0LiBKb3VybmFsIG9mIEZvcmVjYXN0aW5nLCA0KDEpLCAx4oCTMjguIGh0dHBzOi8vZG9pLm9yZy8xMC4xMDAyL2Zvci4zOTgwMDQwMTAzDQoNCjIuIEdhcmRuZXIsIEUuIFMuICgyMDA2KS4gRXhwb25lbnRpYWwgc21vb3RoaW5nOiBUaGUgc3RhdGUgb2YgdGhlIGFydCDigJQgUGFydCBJSS4gSW50ZXJuYXRpb25hbCBKb3VybmFsIG9mIEZvcmVjYXN0aW5nLCAyMiwgNjM34oCTNjY2LiBodHRwczovL2RvaS5vcmcvMTAuMTAxNi9qLmlqZm9yZWNhc3QuMjAwNi4wMy4wMDUNCg0KMy4gSHluZG1hbiwgUi4gSi4sIEtvZWhsZXIsIEEuIEIuLCBPcmQsIEouIEsuLCAmIFNueWRlciwgUi4gRC4gKDIwMDgpLiBGb3JlY2FzdGluZyB3aXRoIGV4cG9uZW50aWFsIHNtb290aGluZzogVGhlIHN0YXRlIHNwYWNlIGFwcHJvYWNoLiBCZXJsaW46IFNwcmluZ2VyLVZlcmxhZy4gaHR0cDovL3d3dy5leHBvbmVudGlhbHNtb290aGluZy5uZXQNCg0KDQoNCg==