Licença

This work is licensed under the Creative Commons Attribution-ShareAlike 4.0 International License. To view a copy of this license, visit http://creativecommons.org/licenses/by-sa/4.0/ or send a letter to Creative Commons, PO Box 1866, Mountain View, CA 94042, USA.

License: CC BY-SA 4.0

Citação

Sugestão de citação: FIGUEIREDO, Adriano Marcos Rodrigues. Séries Temporais com R: Análise do Consumo do Varejo em MS com o método THETA e fable e feasts. Campo Grande-MS,Brasil: RStudio/Rpubs, 2021. Disponível em http://rpubs.com/amrofi/fable_theta_varejoms.

1 Introdução

Neste arquivo utilizo a série do Índice de volume de vendas no varejo Total de Mato Grosso do Sul (média 2014=100), série mensal a partir de jan/2000 até jan/2020 obtida com o pacote BETS e importada do Banco Central do Brasil. Portanto, são 241 observações mensais.

Realizaremos os modelos ETS (Error Trend Seasonal) conforme Hyndman e Athanasopoulos (2021,2018), ou seja, com o pacote forecast e com o formato tsibble pelo fable e feasts.

Sugiro olhar meu Video teórico de Theta no Youtube em: Séries temporais: método Theta com RStudio https://youtu.be/MOImzhmLyQU.

2 Dados

Farei de duas formas para o leitor. Uma carrega direto do site do Banco Central do Brasil com o pacote BETS (FERREIRA, SPERANZA e COSTA, 2018) e a outra eu gerei a estrutura idêntica pela função dput() para os leitores que não conseguirem por qualquer motivo o acesso ao site do Banco Central (as vezes vejo isso ocorrer dependendo dos bloqueios da sua rede de internet). Esclareço ao leitor que após baixar a série pelo BETS, fiz o dput e a partir de então, desabilitei o bloco (Chunk) que acessa o BETS apenas para agilizar os cálculos.

library(BETS)
# Pegando as séries a partir do site do Banco Central do Brasil
# Índice de volume de vendas no varejo Total de Mato Grosso do Sul
# mensal a partir de jan/2000 até jan/2020  
# 241 observações mensais
varejoms <- BETSget(1479) 
print(varejoms)
class(varejoms)
dput(varejoms)  # opção para ter os dados como na structure abaixo
suppressMessages(library(readxl));suppressMessages(library(foreign))
suppressMessages(library(dynlm));suppressMessages(library(car))
suppressMessages(library(lmtest));suppressMessages(library(sandwich))
suppressMessages(library(fpp2));suppressMessages(library(tseries))
suppressMessages(library(zoo));suppressMessages(library(forecast))
suppressMessages(library(ggplot2))
# Pegando as séries a partir do site do Banco Central do Brasil
# Índice de volume de vendas no varejo Total de Mato Grosso do Sul
# mensal a partir de jan/2000 até jan/2020  

library(BETS)
varejoms<- structure(c(35.2, 35.6, 39.2, 40.5, 41.6, 40.4, 40.8, 38.7, 37.3, 
37.6, 35.6, 47.4, 34.2, 32.2, 38, 37.5, 38.8, 35, 38.4, 40.2, 
38.2, 39.3, 36, 46.3, 36.4, 34, 39, 37.8, 38.9, 35.3, 37.2, 38.1, 
35.6, 38.3, 35.6, 45.7, 32.2, 31.6, 35.2, 36.8, 37.5, 34.8, 38.4, 
38.1, 37, 39, 37.3, 49, 35.8, 35.3, 40.2, 41.3, 43.9, 41.6, 45.9, 
42.3, 42.2, 44, 41.3, 56.9, 38.5, 38.5, 45.3, 43.6, 46.2, 44.3, 
47.5, 46.5, 46.4, 46, 44.1, 61, 42, 40.2, 44.6, 44.5, 47.8, 45.3, 
46.5, 48.5, 47.7, 50.2, 49.3, 64.5, 47, 46.8, 51, 50.5, 55, 51.3, 
52.8, 55.3, 54.8, 55.6, 55.3, 72.2, 54.5, 52.1, 56.2, 57.2, 60.8, 
56.1, 61.8, 61.6, 59.8, 63.3, 57.7, 77.4, 61.4, 51.9, 57.3, 57.9, 
61.9, 57.3, 61.1, 61.1, 60.6, 65.6, 63.5, 83.1, 64.1, 60.2, 67.8, 
67.1, 72.8, 68.5, 71.1, 69.3, 69.9, 71.1, 67.9, 92.7, 67.5, 64.8, 
69.1, 69.4, 79.6, 70.2, 73.8, 72.5, 71.3, 75.6, 74.7, 100.8, 
79.5, 75.7, 82.4, 78, 84.8, 83.2, 84.8, 88.5, 86.3, 91.7, 92.8, 
111.4, 92.8, 83.7, 92.5, 88.3, 93.9, 88.8, 96, 95.9, 93.2, 98.3, 
100.5, 128.8, 97.2, 90.2, 94.3, 94.4, 101.1, 92, 96.4, 98.2, 
97.6, 105.8, 103.1, 129.6, 99.6, 87.8, 97, 94.8, 98.6, 93.4, 
98.4, 96.4, 92.5, 100.6, 97.2, 124.5, 91.5, 85.1, 91.6, 88.5, 
92.2, 87.4, 90.5, 88.1, 85.2, 89.4, 93.4, 116.9, 90.8, 84, 89.7, 
86.3, 90, 87.3, 90.8, 93.5, 93.7, 91.4, 93.5, 114.1, 87.8, 81.1, 
94.5, 83.2, 89.9, 88.8, 89.3, 93.7, 93.5, 96.3, 101.3, 118.3, 
93.8, 85.2, 90, 86.6, 90, 85.2, 91, 94.4, 93.4, 95.9, 102.6, 
116, 94.9), .Tsp = c(2000, 2020, 12), class = "ts")

A rotina de dados obtidos pelo BETS já retorna a série em formato ts, ou seja, série temporal. Inicialmente olharei as estatísticas descritivas da série. Em seguida farei um plot básico da série, útil para ver os pontos de picos e momentos específicos.

# estatisticas basicas
summary(varejoms)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  31.60   44.30   67.10   68.08   90.80  129.60 
class(varejoms)
[1] "ts"
varejoms
       Jan   Feb   Mar   Apr   May   Jun   Jul   Aug   Sep   Oct   Nov   Dec
2000  35.2  35.6  39.2  40.5  41.6  40.4  40.8  38.7  37.3  37.6  35.6  47.4
2001  34.2  32.2  38.0  37.5  38.8  35.0  38.4  40.2  38.2  39.3  36.0  46.3
2002  36.4  34.0  39.0  37.8  38.9  35.3  37.2  38.1  35.6  38.3  35.6  45.7
2003  32.2  31.6  35.2  36.8  37.5  34.8  38.4  38.1  37.0  39.0  37.3  49.0
2004  35.8  35.3  40.2  41.3  43.9  41.6  45.9  42.3  42.2  44.0  41.3  56.9
2005  38.5  38.5  45.3  43.6  46.2  44.3  47.5  46.5  46.4  46.0  44.1  61.0
2006  42.0  40.2  44.6  44.5  47.8  45.3  46.5  48.5  47.7  50.2  49.3  64.5
2007  47.0  46.8  51.0  50.5  55.0  51.3  52.8  55.3  54.8  55.6  55.3  72.2
 [ reached getOption("max.print") -- omitted 13 rows ]

Vê-se que não existem valores negativos e eles variam entre o mínimo de 31.60 e o máximo de 129.60. Graficamente, tem-se:

# plot basico
# lembrar que em class(), ele já indicou que era ts = serie temporal
plot(varejoms,
main = "Índice de volume de vendas no varejo total de Mato Grosso do Sul <br> 
        (Mensal)  (2014=100) BCB 1479",
sub="Fonte: Banco Central do Brasil, via pacote BETS.") 

Ou pelo pacote dygraphs:

# pelo pacote dygraph dá mais opções
library(dygraphs)
dygraph(varejoms, 
        main = "Índice de volume de vendas no varejo total de Mato Grosso do Sul <br> 
        (Mensal)  (2014=100) BCB 1479") %>% 
    dyAxis("x", drawGrid = TRUE) %>% 
  dyEvent("2005-1-01", "2005", labelLoc = "bottom") %>% 
    dyEvent("2015-1-01", "2015", labelLoc = "bottom") %>% 
  dyEvent("2018-1-01", "2018", labelLoc = "bottom") %>% 
  dyEvent("2019-1-01", "2019", labelLoc = "bottom") %>% 
    dyOptions(drawPoints = TRUE, pointSize = 2)

Fonte: Banco Central do Brasil, via pacote BETS.

É possivel visualizar no plot acima: sazonalidade (por exemplo, picos em dezembro de cada ano); a tendência aparentemente crescente até 2014 e decresce com a “crise” brasileira; e uma aparente não-estacionariedade (média e variância mudam no tempo). Mais a frente, aplicarei o teste de raiz unitária na série para avaliar a estacionariedade de modo mais explícito.

3 Análise da série

Farei a divisão entre amostra teste e amostra treino para controle de acurácia, pelo tradicional 80-20 (241 observações x 80% = 193 para treino), portanto a amostra treino será de jan-2000 a jan-2016. O leitor deve em geral fazer estas divisões para certificar de que o modelo é um bom preditor. Uma análise mais detalhada da série pode ser feita fazendo o chunk abaixo. Não estaremos realizando o modelo ARIMA neste exercício, mas fica a dica para o leitor.

Primeiro faremos a conversão de objeto ts para tsibble, ou time series table. Converterei a série inteira varejoms e depois farei o split entre train e test.

library(fable);library(feasts);library(fabletools)
library(tsibble)
library(tsibbledata)
library(lubridate)
library(dplyr)
varejo.ts<-as_tsibble(varejoms)

Faremos o split com uso da função filter_index e especificando filter_index(~ "2016-01"):

train <- varejo.ts %>%
  filter_index(~ "2016-01")
train

Podemos plotar e estimar. A função fable::THETA realizará a estimação do método theta de Assimakopoulos e Nikolopoulos (2000), que segundo Hyndman e Billah (2003), equivale a um modelo de suavização exponencial simples com drift. A função report fornecerá a saída do modelo.

fit <- train %>%
  model(theta = THETA(value))
fit
report(fit)
Series: value 
Model: THETA 

Alpha: 0.7013 
Drift: 0.194 
sigma^2: 4.5622 

Entre os passos da estimação, a série é testada para sazonalidade pelo teste descrito em Assimakopoulos e Nikolopoulos (2000). Se acusar sazonalidade, a série será ajustada sazonalmente por uma decomposição clássica multiplicativa antes de aplicar o método theta. Os forecasts resultantes serão corrigidos (re-sazonalizados) para apresentação final (O’HARA-WILD et al, 2021).

Agora o forecast à frente 60 meses. Coloquei 48 meses do treino mais 12 meses fora da série observada.

fc <- fit %>% forecast(h = "5 years")
fc

E a acurácia da parte de teste foi:

fit %>%
  forecast(h = "4 years", bootstrap = FALSE) %>%
  accuracy(varejo.ts,
    measures = point_accuracy_measures
  )

Segue o plot da estimação:

fc %>% autoplot(varejo.ts)

E as nossas estimativas para até Jan/2021 são:

knitr::kable(fc)
.model index value .mean
theta 2016 fev N(86, 4.6) 86.48225
theta 2016 mar N(96, 6.8) 95.79919
theta 2016 abr N(95, 9.1) 94.69419
theta 2016 mai N(101, 11) 100.58242
theta 2016 jun N(93, 14) 93.31562
theta 2016 jul N(99, 16) 99.02754
theta 2016 ago N(99, 18) 98.77018
theta 2016 set N(96, 20) 96.40543
theta 2016 out N(101, 23) 100.51970
theta 2016 nov N(97, 25) 96.56830
theta 2016 dez N(126, 27) 126.32847
theta 2017 jan N(94, 29) 94.25584
theta 2017 fev N(89, 31) 88.54820
theta 2017 mar N(98, 34) 98.08317
theta 2017 abr N(97, 36) 96.94734
theta 2017 mai N(103, 38) 102.97094
theta 2017 jun N(96, 40) 95.52720
theta 2017 jul N(101, 43) 101.36987
theta 2017 ago N(101, 45) 101.10183
theta 2017 set N(99, 47) 98.67679
theta 2017 out N(103, 49) 102.88334
theta 2017 nov N(99, 52) 98.83459
theta 2017 dez N(129, 54) 129.28740
theta 2018 jan N(96, 56) 96.45924
theta 2018 fev N(91, 58) 90.61416
theta 2018 mar N(100, 61) 100.36715
theta 2018 abr N(99, 63) 99.20050
theta 2018 mai N(105, 65) 105.35947
theta 2018 jun N(98, 67) 97.73879
theta 2018 jul N(104, 70) 103.71220
theta 2018 ago N(103, 72) 103.43348
theta 2018 set N(101, 74) 100.94814
theta 2018 out N(105, 76) 105.24699
theta 2018 nov N(101, 79) 101.10088
theta 2018 dez N(132, 81) 132.24632
theta 2019 jan N(99, 83) 98.66265
theta 2019 fev N(93, 85) 92.68011
theta 2019 mar N(103, 88) 102.65112
theta 2019 abr N(101, 90) 101.45365
theta 2019 mai N(108, 92) 107.74799
theta 2019 jun N(100, 94) 99.95037
theta 2019 jul N(106, 97) 106.05453
theta 2019 ago N(106, 99) 105.76512
theta 2019 set N(103, 101) 103.21950
theta 2019 out N(108, 103) 107.61064
theta 2019 nov N(103, 106) 103.36718
theta 2019 dez N(135, 108) 135.20525
theta 2020 jan N(101, 110) 100.86605
theta 2020 fev N(95, 112) 94.74606
theta 2020 mar N(105, 115) 104.93510
theta 2020 abr N(104, 117) 103.70681
theta 2020 mai N(110, 119) 110.13652
theta 2020 jun N(102, 121) 102.16195
theta 2020 jul N(108, 123) 108.39686
theta 2020 ago N(108, 126) 108.09677
theta 2020 set N(105, 128) 105.49085
theta 2020 out N(110, 130) 109.97429
theta 2020 nov N(106, 132) 105.63347
theta 2020 dez N(138, 135) 138.16418
theta 2021 jan N(103, 137) 103.06945

Com base nesse modelo, se entendermos ser o correto, então posso usar agora para a série completa e estimar forecasts até fim de 2021:

varejo.ts %>%
  model(theta = THETA(value)) %>% 
  forecast(h = "2 years") %>% 
  autoplot(varejo.ts)

E os nossos valores de forecast são:

varejo.ts %>%
  model(theta = THETA(value)) %>% 
  forecast(h = "2 years")

Referências

FERREIRA, Pedro Costa; SPERANZA, Talitha; COSTA, Jonatha (2018). BETS: Brazilian Economic Time Series. R package version 0.4.9. Disponível em: https://CRAN.R-project.org/package=BETS.

HYNDMAN, Rob. (2018). fpp2: Data for “Forecasting: Principles and Practice” (2nd Edition). R package version 2.3. Disponível em: https://CRAN.R-project.org/package=fpp2.

HYNDMAN, Rob. (2019). fpp3: Data for “Forecasting: Principles and Practice” (3rd Edition). R package. Disponível em: https://github.com/robjhyndman/fpp3-package, https://OTexts.org/fpp3/.

HYNDMAN, R.J.; ATHANASOPOULOS, G. (2020) Forecasting: principles and practice, 3rd edition, OTexts: Melbourne, Australia. Disponível em: https://otexts.com/fpp3/. Accessed on 02 Apr 2020.

O’HARA-WILD, Mitchell; HYNDMAN, Rob J.; WANG, Earo. (2021). fable: Forecasting Models for Tidy Time Series. R package version 0.3.1. Disponível em: https://CRAN.R-project.org/package=fable. Accessed on 20 May 2021.

O’HARA-WILD, Mitchell; HYNDMAN, Rob J.; WANG, Earo. (2021). feasts: Feature Extraction and Statistics for Time Series. R package version 0.2.1. Disponível em: https://CRAN.R-project.org/package=feasts. Accessed on 20 May 2021.

LS0tDQp0aXRsZTogIlPDqXJpZXMgVGVtcG9yYWlzIGNvbSBSOiBBbsOhbGlzZSBkbyBDb25zdW1vIGRvIFZhcmVqbyBlbSBNUyBjb20gbyBtw6l0b2RvIGBUSEVUQWAgZSBgZmFibGVgIGUgYGZlYXN0c2AiDQphdXRob3I6ICJBZHJpYW5vIE1hcmNvcyBSb2RyaWd1ZXMgRmlndWVpcmVkbywgKmUtbWFpbDogYWRyaWFuby5maWd1ZWlyZWRvQHVmbXMuYnIqIg0KbGlua2NvbG9yOiBibHVlDQphYnN0cmFjdDogDQogIFRoaXMgaXMgYW4gZXhlcmNpc2UgZm9yIGNsYXNzIHVzZS4gV2UgYW5hbHlzZSBkYXRhIG9uIFJldGFpbCBjb25zdW1wdGlvbiwgZnJvbSBKYW51YXJ5LzIwMDAgdG8gbm93YWRheXMuIA0KZGF0ZTogImByIGZvcm1hdChTeXMuRGF0ZSgpLCAnJWQgJUIgJVknKWAiDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6DQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQ0KICAgIHRoZW1lOiBkZWZhdWx0DQogICAgbnVtYmVyX3NlY3Rpb25zOiB0cnVlDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZmxvYXQ6IG5vDQogICAgZGZfcHJpbnQ6IHBhZ2VkDQogICAgZmlnX2NhcHRpb246IHRydWUNCiAgcGRmX2RvY3VtZW50Og0KICAgIHRvYzogeWVzDQphbHdheXNfYWxsb3dfaHRtbDogdHJ1ZQ0KLS0tDQoNCmBgYHtyIGtuaXRyX2luaXQsIGVjaG89RkFMU0UsIGNhY2hlPUZBTFNFfQ0KbGlicmFyeShrbml0cikNCmxpYnJhcnkocm1hcmtkb3duKQ0KbGlicmFyeShybWRmb3JtYXRzKQ0Kc2V0LnNlZWQoMSkNCiMjIEdsb2JhbCBvcHRpb25zDQpvcHRpb25zKG1heC5wcmludD0iMTAwIikNCm9wdHNfY2h1bmskc2V0KGVjaG89VFJVRSwNCgkgICAgICAgICAgICAgY2FjaGU9VFJVRSwNCiAgICAgICAgICAgICAgIHByb21wdD1GQUxTRSwNCiAgICAgICAgICAgICAgIHRpZHk9VFJVRSwNCiAgICAgICAgICAgICAgIGNvbW1lbnQ9TkEsDQogICAgICAgICAgICAgICBtZXNzYWdlPUZBTFNFLA0KICAgICAgICAgICAgICAgd2FybmluZz1GQUxTRSkNCm9wdHNfa25pdCRzZXQod2lkdGg9MTAwKQ0KYGBgDQoNCiMgTGljZW7Dp2EgeyNMaWNlbsOnYSAudW5udW1iZXJlZH0NCg0KVGhpcyB3b3JrIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBDcmVhdGl2ZSBDb21tb25zIEF0dHJpYnV0aW9uLVNoYXJlQWxpa2UgNC4wIEludGVybmF0aW9uYWwgTGljZW5zZS4gVG8gdmlldyBhIGNvcHkgb2YgdGhpcyBsaWNlbnNlLCB2aXNpdCA8aHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnktc2EvNC4wLz4gb3Igc2VuZCBhIGxldHRlciB0byBDcmVhdGl2ZSBDb21tb25zLCBQTyBCb3ggMTg2NiwgTW91bnRhaW4gVmlldywgQ0EgOTQwNDIsIFVTQS4NCg0KIVtMaWNlbnNlOiBDQyBCWS1TQSA0LjBdKGh0dHBzOi8vbWlycm9ycy5jcmVhdGl2ZWNvbW1vbnMub3JnL3ByZXNza2l0L2J1dHRvbnMvODh4MzEvcG5nL2J5LXNhLnBuZyl7d2lkdGg9IjI1JSJ9DQoNCg0KIyBDaXRhw6fDo28geyNDaXRhw6fDo28gLnVubnVtYmVyZWR9DQoNClN1Z2VzdMOjbyBkZSBjaXRhw6fDo286IEZJR1VFSVJFRE8sIEFkcmlhbm8gTWFyY29zIFJvZHJpZ3Vlcy4gU8OpcmllcyBUZW1wb3JhaXMgY29tIFI6IEFuw6FsaXNlIGRvIENvbnN1bW8gZG8gVmFyZWpvIGVtIE1TIGNvbSBvIG3DqXRvZG8gYFRIRVRBYCBlIGBmYWJsZWAgZSBgZmVhc3RzYC4gQ2FtcG8gR3JhbmRlLU1TLEJyYXNpbDogUlN0dWRpby9ScHVicywgMjAyMS4gRGlzcG9uw612ZWwgZW0gPGh0dHA6Ly9ycHVicy5jb20vYW1yb2ZpL2ZhYmxlX3RoZXRhX3ZhcmVqb21zPi4NCg0KIyBJbnRyb2R1w6fDo28NCg0KTmVzdGUgYXJxdWl2byB1dGlsaXpvIGEgc8OpcmllIGRvIMONbmRpY2UgZGUgdm9sdW1lIGRlIHZlbmRhcyBubyB2YXJlam8gVG90YWwgZGUgTWF0byBHcm9zc28gZG8gU3VsIChtw6lkaWEgMjAxND0xMDApLCBzw6lyaWUgbWVuc2FsIGEgcGFydGlyIGRlIGphbi8yMDAwIGF0w6kgamFuLzIwMjAgb2J0aWRhIGNvbSBvIHBhY290ZSBgQkVUU2AgZSBpbXBvcnRhZGEgZG8gQmFuY28gQ2VudHJhbCBkbyBCcmFzaWwuIFBvcnRhbnRvLCBzw6NvIDI0MSBvYnNlcnZhw6fDtWVzIG1lbnNhaXMuDQoNClJlYWxpemFyZW1vcyBvcyBtb2RlbG9zIEVUUyAoRXJyb3IgVHJlbmQgU2Vhc29uYWwpIGNvbmZvcm1lIEh5bmRtYW4gZSBBdGhhbmFzb3BvdWxvcyAoMjAyMSwyMDE4KSwgb3Ugc2VqYSwgY29tIG8gcGFjb3RlIGBmb3JlY2FzdGAgZSBjb20gbyBmb3JtYXRvIGB0c2liYmxlYCBwZWxvIGBmYWJsZWAgZSBgZmVhc3RzYC4NCg0KU3VnaXJvIG9saGFyIG1ldSBWaWRlbyB0ZcOzcmljbyBkZSBUaGV0YSBubyBZb3V0dWJlIGVtOiAgU8OpcmllcyB0ZW1wb3JhaXM6IG3DqXRvZG8gVGhldGEgY29tIFJTdHVkaW8gPGh0dHBzOi8veW91dHUuYmUvTU9JbXpobUx5UVU+Lg0KDQojIERhZG9zDQoNCkZhcmVpIGRlIGR1YXMgZm9ybWFzIHBhcmEgbyBsZWl0b3IuIFVtYSBjYXJyZWdhIGRpcmV0byBkbyBzaXRlIGRvIEJhbmNvIENlbnRyYWwgZG8gQnJhc2lsIGNvbSBvIHBhY290ZSBgQkVUU2AgKEZFUlJFSVJBLCBTUEVSQU5aQSBlIENPU1RBLCAyMDE4KSBlIGEgb3V0cmEgZXUgZ2VyZWkgYSBlc3RydXR1cmEgaWTDqm50aWNhIHBlbGEgZnVuw6fDo28gYGRwdXQoKWAgcGFyYSBvcyBsZWl0b3JlcyBxdWUgbsOjbyBjb25zZWd1aXJlbSBwb3IgcXVhbHF1ZXIgbW90aXZvIG8gYWNlc3NvIGFvIHNpdGUgZG8gQmFuY28gQ2VudHJhbCAoYXMgdmV6ZXMgdmVqbyBpc3NvIG9jb3JyZXIgZGVwZW5kZW5kbyBkb3MgYmxvcXVlaW9zIGRhIHN1YSByZWRlIGRlIGludGVybmV0KS4gRXNjbGFyZcOnbyBhbyBsZWl0b3IgcXVlIGFww7NzIGJhaXhhciBhIHPDqXJpZSBwZWxvIEJFVFMsIGZpeiBvIGRwdXQgZSBhIHBhcnRpciBkZSBlbnTDo28sIGRlc2FiaWxpdGVpIG8gYmxvY28gKGBDaHVua2ApIHF1ZSBhY2Vzc2EgbyBCRVRTIGFwZW5hcyBwYXJhIGFnaWxpemFyIG9zIGPDoWxjdWxvcy4NCg0KICAgIGxpYnJhcnkoQkVUUykNCiAgICAjIFBlZ2FuZG8gYXMgc8OpcmllcyBhIHBhcnRpciBkbyBzaXRlIGRvIEJhbmNvIENlbnRyYWwgZG8gQnJhc2lsDQogICAgIyDDjW5kaWNlIGRlIHZvbHVtZSBkZSB2ZW5kYXMgbm8gdmFyZWpvIFRvdGFsIGRlIE1hdG8gR3Jvc3NvIGRvIFN1bA0KICAgICMgbWVuc2FsIGEgcGFydGlyIGRlIGphbi8yMDAwIGF0w6kgamFuLzIwMjAgIA0KICAgICMgMjQxIG9ic2VydmHDp8O1ZXMgbWVuc2Fpcw0KICAgIHZhcmVqb21zIDwtIEJFVFNnZXQoMTQ3OSkgDQogICAgcHJpbnQodmFyZWpvbXMpDQogICAgY2xhc3ModmFyZWpvbXMpDQogICAgZHB1dCh2YXJlam9tcykgICMgb3DDp8OjbyBwYXJhIHRlciBvcyBkYWRvcyBjb21vIG5hIHN0cnVjdHVyZSBhYmFpeG8NCg0KYGBge3Igd2FybmluZz1GQUxTRSwgY29tbWVudD1GQUxTRX0NCnN1cHByZXNzTWVzc2FnZXMobGlicmFyeShyZWFkeGwpKTtzdXBwcmVzc01lc3NhZ2VzKGxpYnJhcnkoZm9yZWlnbikpDQpzdXBwcmVzc01lc3NhZ2VzKGxpYnJhcnkoZHlubG0pKTtzdXBwcmVzc01lc3NhZ2VzKGxpYnJhcnkoY2FyKSkNCnN1cHByZXNzTWVzc2FnZXMobGlicmFyeShsbXRlc3QpKTtzdXBwcmVzc01lc3NhZ2VzKGxpYnJhcnkoc2FuZHdpY2gpKQ0Kc3VwcHJlc3NNZXNzYWdlcyhsaWJyYXJ5KGZwcDIpKTtzdXBwcmVzc01lc3NhZ2VzKGxpYnJhcnkodHNlcmllcykpDQpzdXBwcmVzc01lc3NhZ2VzKGxpYnJhcnkoem9vKSk7c3VwcHJlc3NNZXNzYWdlcyhsaWJyYXJ5KGZvcmVjYXN0KSkNCnN1cHByZXNzTWVzc2FnZXMobGlicmFyeShnZ3Bsb3QyKSkNCiMgUGVnYW5kbyBhcyBzw6lyaWVzIGEgcGFydGlyIGRvIHNpdGUgZG8gQmFuY28gQ2VudHJhbCBkbyBCcmFzaWwNCiMgw41uZGljZSBkZSB2b2x1bWUgZGUgdmVuZGFzIG5vIHZhcmVqbyBUb3RhbCBkZSBNYXRvIEdyb3NzbyBkbyBTdWwNCiMgbWVuc2FsIGEgcGFydGlyIGRlIGphbi8yMDAwIGF0w6kgamFuLzIwMjAgIA0KDQpsaWJyYXJ5KEJFVFMpDQp2YXJlam9tczwtIHN0cnVjdHVyZShjKDM1LjIsIDM1LjYsIDM5LjIsIDQwLjUsIDQxLjYsIDQwLjQsIDQwLjgsIDM4LjcsIDM3LjMsIA0KMzcuNiwgMzUuNiwgNDcuNCwgMzQuMiwgMzIuMiwgMzgsIDM3LjUsIDM4LjgsIDM1LCAzOC40LCA0MC4yLCANCjM4LjIsIDM5LjMsIDM2LCA0Ni4zLCAzNi40LCAzNCwgMzksIDM3LjgsIDM4LjksIDM1LjMsIDM3LjIsIDM4LjEsIA0KMzUuNiwgMzguMywgMzUuNiwgNDUuNywgMzIuMiwgMzEuNiwgMzUuMiwgMzYuOCwgMzcuNSwgMzQuOCwgMzguNCwgDQozOC4xLCAzNywgMzksIDM3LjMsIDQ5LCAzNS44LCAzNS4zLCA0MC4yLCA0MS4zLCA0My45LCA0MS42LCA0NS45LCANCjQyLjMsIDQyLjIsIDQ0LCA0MS4zLCA1Ni45LCAzOC41LCAzOC41LCA0NS4zLCA0My42LCA0Ni4yLCA0NC4zLCANCjQ3LjUsIDQ2LjUsIDQ2LjQsIDQ2LCA0NC4xLCA2MSwgNDIsIDQwLjIsIDQ0LjYsIDQ0LjUsIDQ3LjgsIDQ1LjMsIA0KNDYuNSwgNDguNSwgNDcuNywgNTAuMiwgNDkuMywgNjQuNSwgNDcsIDQ2LjgsIDUxLCA1MC41LCA1NSwgNTEuMywgDQo1Mi44LCA1NS4zLCA1NC44LCA1NS42LCA1NS4zLCA3Mi4yLCA1NC41LCA1Mi4xLCA1Ni4yLCA1Ny4yLCA2MC44LCANCjU2LjEsIDYxLjgsIDYxLjYsIDU5LjgsIDYzLjMsIDU3LjcsIDc3LjQsIDYxLjQsIDUxLjksIDU3LjMsIDU3LjksIA0KNjEuOSwgNTcuMywgNjEuMSwgNjEuMSwgNjAuNiwgNjUuNiwgNjMuNSwgODMuMSwgNjQuMSwgNjAuMiwgNjcuOCwgDQo2Ny4xLCA3Mi44LCA2OC41LCA3MS4xLCA2OS4zLCA2OS45LCA3MS4xLCA2Ny45LCA5Mi43LCA2Ny41LCA2NC44LCANCjY5LjEsIDY5LjQsIDc5LjYsIDcwLjIsIDczLjgsIDcyLjUsIDcxLjMsIDc1LjYsIDc0LjcsIDEwMC44LCANCjc5LjUsIDc1LjcsIDgyLjQsIDc4LCA4NC44LCA4My4yLCA4NC44LCA4OC41LCA4Ni4zLCA5MS43LCA5Mi44LCANCjExMS40LCA5Mi44LCA4My43LCA5Mi41LCA4OC4zLCA5My45LCA4OC44LCA5NiwgOTUuOSwgOTMuMiwgOTguMywgDQoxMDAuNSwgMTI4LjgsIDk3LjIsIDkwLjIsIDk0LjMsIDk0LjQsIDEwMS4xLCA5MiwgOTYuNCwgOTguMiwgDQo5Ny42LCAxMDUuOCwgMTAzLjEsIDEyOS42LCA5OS42LCA4Ny44LCA5NywgOTQuOCwgOTguNiwgOTMuNCwgDQo5OC40LCA5Ni40LCA5Mi41LCAxMDAuNiwgOTcuMiwgMTI0LjUsIDkxLjUsIDg1LjEsIDkxLjYsIDg4LjUsIA0KOTIuMiwgODcuNCwgOTAuNSwgODguMSwgODUuMiwgODkuNCwgOTMuNCwgMTE2LjksIDkwLjgsIDg0LCA4OS43LCANCjg2LjMsIDkwLCA4Ny4zLCA5MC44LCA5My41LCA5My43LCA5MS40LCA5My41LCAxMTQuMSwgODcuOCwgODEuMSwgDQo5NC41LCA4My4yLCA4OS45LCA4OC44LCA4OS4zLCA5My43LCA5My41LCA5Ni4zLCAxMDEuMywgMTE4LjMsIA0KOTMuOCwgODUuMiwgOTAsIDg2LjYsIDkwLCA4NS4yLCA5MSwgOTQuNCwgOTMuNCwgOTUuOSwgMTAyLjYsIA0KMTE2LCA5NC45KSwgLlRzcCA9IGMoMjAwMCwgMjAyMCwgMTIpLCBjbGFzcyA9ICJ0cyIpDQoNCmBgYA0KDQpBIHJvdGluYSBkZSBkYWRvcyBvYnRpZG9zIHBlbG8gQkVUUyBqw6EgcmV0b3JuYSBhIHPDqXJpZSBlbSBmb3JtYXRvIGB0c2AsIG91IHNlamEsIHPDqXJpZSB0ZW1wb3JhbC4gSW5pY2lhbG1lbnRlIG9saGFyZWkgYXMgZXN0YXTDrXN0aWNhcyBkZXNjcml0aXZhcyBkYSBzw6lyaWUuIEVtIHNlZ3VpZGEgZmFyZWkgdW0gcGxvdCBiw6FzaWNvIGRhIHPDqXJpZSwgw7p0aWwgcGFyYSB2ZXIgb3MgcG9udG9zIGRlIHBpY29zIGUgbW9tZW50b3MgZXNwZWPDrWZpY29zLg0KDQpgYGB7ciBlc3RhdF9kZXNjcn0NCiMgZXN0YXRpc3RpY2FzIGJhc2ljYXMNCnN1bW1hcnkodmFyZWpvbXMpDQpjbGFzcyh2YXJlam9tcykNCnZhcmVqb21zDQpgYGANCg0KVsOqLXNlIHF1ZSBuw6NvIGV4aXN0ZW0gdmFsb3JlcyBuZWdhdGl2b3MgZSBlbGVzIHZhcmlhbSBlbnRyZSBvIG3DrW5pbW8gZGUgMzEuNjAgZSBvIG3DoXhpbW8gZGUgMTI5LjYwLiBHcmFmaWNhbWVudGUsIHRlbS1zZToNCg0KYGBge3IgcGxvdCBiYXNpY299DQojIHBsb3QgYmFzaWNvDQojIGxlbWJyYXIgcXVlIGVtIGNsYXNzKCksIGVsZSBqw6EgaW5kaWNvdSBxdWUgZXJhIHRzID0gc2VyaWUgdGVtcG9yYWwNCnBsb3QodmFyZWpvbXMsDQptYWluID0gIsONbmRpY2UgZGUgdm9sdW1lIGRlIHZlbmRhcyBubyB2YXJlam8gdG90YWwgZGUgTWF0byBHcm9zc28gZG8gU3VsIDxicj4gDQogICAgICAgIChNZW5zYWwpICAoMjAxND0xMDApIEJDQiAxNDc5IiwNCnN1Yj0iRm9udGU6IEJhbmNvIENlbnRyYWwgZG8gQnJhc2lsLCB2aWEgcGFjb3RlIEJFVFMuIikgDQpgYGANCg0KT3UgcGVsbyBwYWNvdGUgYGR5Z3JhcGhzYDoNCg0KYGBge3IgcGxvdGR5Z3JhcGhzLCBmaWcuY2FwPSJGb250ZTogQmFuY28gQ2VudHJhbCBkbyBCcmFzaWwsIHZpYSBwYWNvdGUgQkVUUy4ifQ0KIyBwZWxvIHBhY290ZSBkeWdyYXBoIGTDoSBtYWlzIG9ww6fDtWVzDQpsaWJyYXJ5KGR5Z3JhcGhzKQ0KZHlncmFwaCh2YXJlam9tcywgDQogICAgICAgIG1haW4gPSAiw41uZGljZSBkZSB2b2x1bWUgZGUgdmVuZGFzIG5vIHZhcmVqbyB0b3RhbCBkZSBNYXRvIEdyb3NzbyBkbyBTdWwgPGJyPiANCiAgICAgICAgKE1lbnNhbCkgICgyMDE0PTEwMCkgQkNCIDE0NzkiKSAlPiUgDQogICAgZHlBeGlzKCJ4IiwgZHJhd0dyaWQgPSBUUlVFKSAlPiUgDQogIGR5RXZlbnQoIjIwMDUtMS0wMSIsICIyMDA1IiwgbGFiZWxMb2MgPSAiYm90dG9tIikgJT4lIA0KICAgIGR5RXZlbnQoIjIwMTUtMS0wMSIsICIyMDE1IiwgbGFiZWxMb2MgPSAiYm90dG9tIikgJT4lIA0KICBkeUV2ZW50KCIyMDE4LTEtMDEiLCAiMjAxOCIsIGxhYmVsTG9jID0gImJvdHRvbSIpICU+JSANCiAgZHlFdmVudCgiMjAxOS0xLTAxIiwgIjIwMTkiLCBsYWJlbExvYyA9ICJib3R0b20iKSAlPiUgDQogICAgZHlPcHRpb25zKGRyYXdQb2ludHMgPSBUUlVFLCBwb2ludFNpemUgPSAyKQ0KYGBgDQoNCsOJIHBvc3NpdmVsIHZpc3VhbGl6YXIgbm8gcGxvdCBhY2ltYTogc2F6b25hbGlkYWRlIChwb3IgZXhlbXBsbywgcGljb3MgZW0gZGV6ZW1icm8gZGUgY2FkYSBhbm8pOyBhIHRlbmTDqm5jaWEgYXBhcmVudGVtZW50ZSBjcmVzY2VudGUgYXTDqSAyMDE0IGUgZGVjcmVzY2UgY29tIGEgImNyaXNlIiBicmFzaWxlaXJhOyBlIHVtYSBhcGFyZW50ZSBuw6NvLWVzdGFjaW9uYXJpZWRhZGUgKG3DqWRpYSBlIHZhcmnDom5jaWEgbXVkYW0gbm8gdGVtcG8pLiBNYWlzIGEgZnJlbnRlLCBhcGxpY2FyZWkgbyB0ZXN0ZSBkZSByYWl6IHVuaXTDoXJpYSBuYSBzw6lyaWUgcGFyYSBhdmFsaWFyIGEgZXN0YWNpb25hcmllZGFkZSBkZSBtb2RvIG1haXMgZXhwbMOtY2l0by4NCg0KIyBBbsOhbGlzZSBkYSBzw6lyaWUNCg0KRmFyZWkgYSBkaXZpc8OjbyBlbnRyZSBhbW9zdHJhIHRlc3RlIGUgYW1vc3RyYSB0cmVpbm8gcGFyYSBjb250cm9sZSBkZSBhY3Vyw6FjaWEsIHBlbG8gdHJhZGljaW9uYWwgODAtMjAgKDI0MSBvYnNlcnZhw6fDtWVzIHggODAlID0gMTkzIHBhcmEgdHJlaW5vKSwgcG9ydGFudG8gYSBhbW9zdHJhIHRyZWlubyBzZXLDoSBkZSBqYW4tMjAwMCBhIGphbi0yMDE2LiBPIGxlaXRvciBkZXZlIGVtIGdlcmFsIGZhemVyIGVzdGFzIGRpdmlzw7VlcyBwYXJhIGNlcnRpZmljYXIgZGUgcXVlIG8gbW9kZWxvIMOpIHVtIGJvbSBwcmVkaXRvci4gVW1hIGFuw6FsaXNlIG1haXMgZGV0YWxoYWRhIGRhIHPDqXJpZSBwb2RlIHNlciBmZWl0YSBmYXplbmRvIG8gY2h1bmsgYWJhaXhvLiBOw6NvIGVzdGFyZW1vcyByZWFsaXphbmRvIG8gbW9kZWxvIEFSSU1BIG5lc3RlIGV4ZXJjw61jaW8sIG1hcyBmaWNhIGEgZGljYSBwYXJhIG8gbGVpdG9yLg0KICAgIA0KUHJpbWVpcm8gZmFyZW1vcyBhIGNvbnZlcnPDo28gZGUgb2JqZXRvIGB0c2AgcGFyYSBgdHNpYmJsZWAsIG91ICp0aW1lIHNlcmllcyB0YWJsZSouIENvbnZlcnRlcmVpIGEgc8OpcmllIGludGVpcmEgdmFyZWpvbXMgZSBkZXBvaXMgZmFyZWkgbyBzcGxpdCBlbnRyZSB0cmFpbiBlIHRlc3QuDQoNCmBgYHtyIGZhYmxlLCBtZXNzYWdlPUZBTFNFLHdhcm5pbmc9RkFMU0V9DQpsaWJyYXJ5KGZhYmxlKTtsaWJyYXJ5KGZlYXN0cyk7bGlicmFyeShmYWJsZXRvb2xzKQ0KbGlicmFyeSh0c2liYmxlKQ0KbGlicmFyeSh0c2liYmxlZGF0YSkNCmxpYnJhcnkobHVicmlkYXRlKQ0KbGlicmFyeShkcGx5cikNCnZhcmVqby50czwtYXNfdHNpYmJsZSh2YXJlam9tcykNCmBgYA0KDQpGYXJlbW9zIG8gc3BsaXQgY29tIHVzbyBkYSBmdW7Dp8OjbyBgZmlsdGVyX2luZGV4YCBlIGVzcGVjaWZpY2FuZG8gYGZpbHRlcl9pbmRleCh+ICIyMDE2LTAxIilgOg0KDQpgYGB7ciBzcGxpdHNlcmllc30NCnRyYWluIDwtIHZhcmVqby50cyAlPiUNCiAgZmlsdGVyX2luZGV4KH4gIjIwMTYtMDEiKQ0KdHJhaW4NCg0KYGBgDQoNClBvZGVtb3MgcGxvdGFyIGUgZXN0aW1hci4gQSBmdW7Dp8OjbyBgZmFibGU6OlRIRVRBYCByZWFsaXphcsOhIGEgZXN0aW1hw6fDo28gZG8gbcOpdG9kbyB0aGV0YSBkZSBBc3NpbWFrb3BvdWxvcyBlIE5pa29sb3BvdWxvcyAoMjAwMCksIHF1ZSBzZWd1bmRvIEh5bmRtYW4gZSBCaWxsYWggKDIwMDMpLCBlcXVpdmFsZSBhIHVtIG1vZGVsbyBkZSBzdWF2aXphw6fDo28gZXhwb25lbmNpYWwgc2ltcGxlcyBjb20gZHJpZnQuIEEgZnVuw6fDo28gYHJlcG9ydGAgZm9ybmVjZXLDoSBhIHNhw61kYSBkbyBtb2RlbG8uICAgIA0KDQpgYGB7ciB0c2liYmxlX29iamVjdH0NCmZpdCA8LSB0cmFpbiAlPiUNCiAgbW9kZWwodGhldGEgPSBUSEVUQSh2YWx1ZSkpDQpmaXQNCnJlcG9ydChmaXQpDQpgYGANCg0KRW50cmUgb3MgcGFzc29zIGRhIGVzdGltYcOnw6NvLCBhIHPDqXJpZSDDqSB0ZXN0YWRhIHBhcmEgc2F6b25hbGlkYWRlIHBlbG8gdGVzdGUgZGVzY3JpdG8gZW0gQXNzaW1ha29wb3Vsb3MgZSBOaWtvbG9wb3Vsb3MgKDIwMDApLiBTZSBhY3VzYXIgc2F6b25hbGlkYWRlLCBhIHPDqXJpZSBzZXLDoSBhanVzdGFkYSBzYXpvbmFsbWVudGUgcG9yIHVtYSBkZWNvbXBvc2nDp8OjbyBjbMOhc3NpY2EgbXVsdGlwbGljYXRpdmEgYW50ZXMgZGUgYXBsaWNhciBvIG3DqXRvZG8gdGhldGEuIE9zIGZvcmVjYXN0cyByZXN1bHRhbnRlcyBzZXLDo28gY29ycmlnaWRvcyAocmUtc2F6b25hbGl6YWRvcykgcGFyYSBhcHJlc2VudGHDp8OjbyBmaW5hbCAoT+KAmUhBUkEtV0lMRCBldCBhbCwgMjAyMSkuICAgICAgDQoNCkFnb3JhIG8gZm9yZWNhc3Qgw6AgZnJlbnRlIDYwIG1lc2VzLiBDb2xvcXVlaSA0OCBtZXNlcyBkbyB0cmVpbm8gbWFpcyAxMiBtZXNlcyBmb3JhIGRhIHPDqXJpZSBvYnNlcnZhZGEuDQoNCmBgYHtyfQ0KZmMgPC0gZml0ICU+JSBmb3JlY2FzdChoID0gIjUgeWVhcnMiKQ0KZmMNCmBgYA0KDQpFIGEgYWN1csOhY2lhIGRhIHBhcnRlIGRlIHRlc3RlIGZvaToNCg0KYGBge3J9DQpmaXQgJT4lDQogIGZvcmVjYXN0KGggPSAiNCB5ZWFycyIsIGJvb3RzdHJhcCA9IEZBTFNFKSAlPiUNCiAgYWNjdXJhY3kodmFyZWpvLnRzLA0KICAgIG1lYXN1cmVzID0gcG9pbnRfYWNjdXJhY3lfbWVhc3VyZXMNCiAgKQ0KYGBgDQoNClNlZ3VlIG8gcGxvdCBkYSBlc3RpbWHDp8OjbzoNCg0KYGBge3IgcGxvdGZlYXN0c30NCmZjICU+JSBhdXRvcGxvdCh2YXJlam8udHMpDQpgYGANCg0KRSBhcyBub3NzYXMgZXN0aW1hdGl2YXMgcGFyYSBhdMOpIEphbi8yMDIxIHPDo286DQoNCmBgYHtyfQ0Ka25pdHI6OmthYmxlKGZjKQ0KYGBgDQoNCkNvbSBiYXNlIG5lc3NlIG1vZGVsbywgc2UgZW50ZW5kZXJtb3Mgc2VyIG8gY29ycmV0bywgZW50w6NvIHBvc3NvIHVzYXIgYWdvcmEgcGFyYSBhIHPDqXJpZSBjb21wbGV0YSBlIGVzdGltYXIgZm9yZWNhc3RzIGF0w6kgZmltIGRlIDIwMjE6DQoNCmBgYHtyfQ0KdmFyZWpvLnRzICU+JQ0KICBtb2RlbCh0aGV0YSA9IFRIRVRBKHZhbHVlKSkgJT4lIA0KICBmb3JlY2FzdChoID0gIjIgeWVhcnMiKSAlPiUgDQogIGF1dG9wbG90KHZhcmVqby50cykNCmBgYA0KDQpFIG9zIG5vc3NvcyB2YWxvcmVzIGRlIGZvcmVjYXN0IHPDo286DQoNCmBgYHtyfQ0KdmFyZWpvLnRzICU+JQ0KICBtb2RlbCh0aGV0YSA9IFRIRVRBKHZhbHVlKSkgJT4lIA0KICBmb3JlY2FzdChoID0gIjIgeWVhcnMiKQ0KYGBgDQoNCg0KDQojIFJlZmVyw6puY2lhcyB7I1JlZmVyw6puY2lhcyAudW5udW1iZXJlZH0NCg0KRkVSUkVJUkEsIFBlZHJvIENvc3RhOyBTUEVSQU5aQSwgVGFsaXRoYTsgQ09TVEEsIEpvbmF0aGEgKDIwMTgpLiBCRVRTOiBCcmF6aWxpYW4gRWNvbm9taWMgVGltZSBTZXJpZXMuIFIgcGFja2FnZSB2ZXJzaW9uIDAuNC45LiBEaXNwb27DrXZlbCBlbTogPGh0dHBzOi8vQ1JBTi5SLXByb2plY3Qub3JnL3BhY2thZ2U9QkVUUz4uDQoNCkhZTkRNQU4sIFJvYi4gKDIwMTgpLiBmcHAyOiBEYXRhIGZvciAiRm9yZWNhc3Rpbmc6IFByaW5jaXBsZXMgYW5kIFByYWN0aWNlIiAoMm5kIEVkaXRpb24pLiBSIHBhY2thZ2UgdmVyc2lvbiAyLjMuIERpc3BvbsOtdmVsIGVtOiA8aHR0cHM6Ly9DUkFOLlItcHJvamVjdC5vcmcvcGFja2FnZT1mcHAyPi4NCg0KSFlORE1BTiwgUm9iLiAoMjAxOSkuIGZwcDM6IERhdGEgZm9yICJGb3JlY2FzdGluZzogUHJpbmNpcGxlcyBhbmQgUHJhY3RpY2UiICgzcmQgRWRpdGlvbikuIFIgcGFja2FnZS4gRGlzcG9uw612ZWwgZW06IDxodHRwczovL2dpdGh1Yi5jb20vcm9iamh5bmRtYW4vZnBwMy1wYWNrYWdlPiwgPGh0dHBzOi8vT1RleHRzLm9yZy9mcHAzLz4uDQoNCkhZTkRNQU4sIFIuSi47IEFUSEFOQVNPUE9VTE9TLCBHLiAoMjAyMCkgRm9yZWNhc3Rpbmc6IHByaW5jaXBsZXMgYW5kIHByYWN0aWNlLCAzcmQgZWRpdGlvbiwgT1RleHRzOiBNZWxib3VybmUsIEF1c3RyYWxpYS4gRGlzcG9uw612ZWwgZW06IDxodHRwczovL290ZXh0cy5jb20vZnBwMy8+LiBBY2Nlc3NlZCBvbiAwMiBBcHIgMjAyMC4gICAgDQoNCk/igJlIQVJBLVdJTEQsIE1pdGNoZWxsOyBIWU5ETUFOLCBSb2IgSi47IFdBTkcsIEVhcm8uICgyMDIxKS4gZmFibGU6IEZvcmVjYXN0aW5nIE1vZGVscyBmb3IgVGlkeSBUaW1lIFNlcmllcy4gUiBwYWNrYWdlIHZlcnNpb24gMC4zLjEuIERpc3BvbsOtdmVsIGVtOiBodHRwczovL0NSQU4uUi1wcm9qZWN0Lm9yZy9wYWNrYWdlPWZhYmxlLiBBY2Nlc3NlZCBvbiAyMCBNYXkgMjAyMS4gICAgICAgDQogIA0KT+KAmUhBUkEtV0lMRCwgTWl0Y2hlbGw7IEhZTkRNQU4sIFJvYiBKLjsgV0FORywgRWFyby4gKDIwMjEpLiBmZWFzdHM6IEZlYXR1cmUgRXh0cmFjdGlvbiBhbmQgU3RhdGlzdGljcyBmb3IgVGltZSBTZXJpZXMuIFIgcGFja2FnZSB2ZXJzaW9uIDAuMi4xLiBEaXNwb27DrXZlbCBlbTogaHR0cHM6Ly9DUkFOLlItcHJvamVjdC5vcmcvcGFja2FnZT1mZWFzdHMuIEFjY2Vzc2VkIG9uIDIwIE1heSAyMDIxLg0K