\(~\)
1. CARREGAR PACOTES
library(tidyverse)
library(data.table)
library(lubridate)
library(hablar)
library(openxlsx)
library(forecast)
#library(coronabr)
library(brazilmaps)
library(sf)
library(leaflet)
library(xts)
library(dygraphs)
#library(fable)
\(~\)
2. IMPORTAR DADOS
dados = "http://plataforma.saude.gov.br/novocoronavirus/resources/scripts/database.js" %>%
readr::read_file() %>%
stringr::str_remove("var database=") %>%
jsonlite::fromJSON() %>%
purrr::pluck("brazil") %>%
dplyr::mutate(values = purrr::map(values, dplyr::mutate_all, as.character)) %>%
tidyr::unnest(values) %>%
dplyr::mutate(date = lubridate::dmy(date))
dados = fread("C:/Users/Ronaldo Alves/Desktop/COVID_19/coronavirus2.csv")
\(~\)
3. CURADORIA DOS DADOS
uid = data.frame(uid = c(11:17,21:29,31:33,35,41:43,50:53))
uid = setDT(uid)[, list(date = seq(min(ymd(dados$date)), max(ymd(dados$date)), by = "days")),
by = uid]
dados = dados %>%
mutate(date = ymd(date)) %>% # uid = as.factor(uid)
full_join(uid, by = c("uid" = "uid", "date" = "date")) %>%
group_by(uid, date) %>%
summarise_all(sum_) %>%
mutate(id_date = dense_rank(date)) %>%
arrange(uid, date) %>%
ungroup() %>%
mutate_if(is.numeric, ~replace_na(., 0)) %>%
mutate(sigla = case_when(uid == 11 ~ "RO", uid == 12 ~ "AC", uid == 13 ~ "AM", uid == 14 ~ "RR",
uid == 15 ~ "PA", uid == 16 ~ "AP", uid == 17 ~ "TO", uid == 21 ~ "MA",
uid == 22 ~ "PI", uid == 23 ~ "CE", uid == 24 ~ "RN", uid == 25 ~ "PB",
uid == 26 ~ "PE", uid == 27 ~ "AL", uid == 28 ~ "SE", uid == 29 ~ "BA",
uid == 31 ~ "MG", uid == 32 ~ "ES", uid == 33 ~ "RJ", uid == 35 ~ "SP",
uid == 41 ~ "PR", uid == 42 ~ "SC", uid == 43 ~ "RS", uid == 50 ~ "MS",
uid == 51 ~ "MT", uid == 52 ~ "GO", uid == 53 ~ "DF")) %>%
select(id_date, uid, sigla, everything())
rm(uid)
dados
\(~\)
5. ANÁLISE DESCRITIVA
dados %>%
summarise(confirmados = sum_(cases),
mortes = sum_(deaths),
estados = n_distinct(uid))
dados_uf = dados %>%
group_by(uid, sigla) %>%
summarise(confirmados = sum_(cases)) %>%
ungroup()
dados_uf %>% select(sigla, confirmados) %>% arrange(-confirmados)
\(~\)
6. ANÁLISE ESPACIAL
ggplot(dados_uf, aes(x = reorder(sigla, -confirmados), y = confirmados)) +
geom_bar(stat = "identity", color = "black", fill = "white") +
geom_text(aes(label = confirmados), position = "stack", size = 3, vjust = -0.25) +
scale_y_continuous(limits = c(0, max(dados_uf$confirmados)+100),
breaks = seq(0, max(dados_uf$confirmados)+100, 250),
expand = c(0.01, 0)) +
labs(x = "", y = "# casos confirmados") +
theme_minimal()

map_uf = get_brmap("State") %>%
left_join(dados_uf, by = c("State" = "uid")) %>%
st_centroid()
data.frame(st_coordinates(map_uf),
confirmados = map_uf$confirmados,
UF = map_uf$nome,
sigla = map_uf$sigla) %>% # str_to_title()
filter(confirmados != 0) %>%
leaflet() %>%
addTiles() %>%
addCircleMarkers(~X, ~Y, label = ~as.character(paste0(sigla, ":", confirmados, " casos")),
labelOptions = labelOptions(textsize = "12px"), #noHide = T, textOnly = T, direction = "auto"
radius = ~log(confirmados)*2,
stroke = F,
fillOpacity = 0.5)
\(~\)
7. ANÁLISE TEMPORAL
dados %>%
group_by(date) %>%
summarise(N = sum_(cases)) %>%
xts(x = .$N, order.by = .$date) %>%
dygraph(xlab = "Date of report", ylab = "# confirmed cases") %>%
dyOptions(drawPoints = T, pointSize = 4, fillGraph = T, fillAlpha = 0.4) %>%
dyRangeSelector() %>%
dySeries("V1", label = "confirmed cases") %>%
dyLegend(show = "auto", hideOnMouseOut = FALSE)
\(~\)
dados %>%
group_by(date) %>%
summarise(N = sum_(cases)) %>%
filter(date >= "2020-02-26") %>%
ggplot(aes(x = date, y = log(N))) +
geom_point(size = 3, shape = 21, fill = "orange") +
geom_smooth(method = "lm", formula = y ~ x, color = "red") +
scale_x_date(labels = scales::date_format("%d/%b"), breaks = "1 day") +
labs(x = "Date of report", y = "# confirmed cases (log scale)") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 90, vjust = 0.4, hjust = 0.5))

\(~\)
dados %>%
group_by(date) %>%
summarise(N = sum_(cases)) %>%
filter(date >= "2020-02-26") %>%
mutate(y = log10(N + 1), days = 1:nrow(.)) %>%
lm(y ~ days, data = ., na.action = na.exclude) %>%
summary()
Call:
lm(formula = y ~ days, data = ., na.action = na.exclude)
Residuals:
Min 1Q Median 3Q Max
-1.41457 0.01152 0.09367 0.12422 0.31453
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -0.1325 0.1536 -0.863 0.399
days 0.1190 0.0117 10.175 2.36e-09 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.3481 on 20 degrees of freedom
Multiple R-squared: 0.8381, Adjusted R-squared: 0.83
F-statistic: 103.5 on 1 and 20 DF, p-value: 2.363e-09
\(~\)
dados %>%
#group_by(sigla, date) %>%
#summarise(N = sum_(cases)) %>%
filter(date >= "2020-02-26", sigla %in% c("SP","RJ","DF","RS","PR","PE","MG","SC")) %>%
ggplot(aes(x = date, y = cases, color = reorder(sigla, -cases))) +
geom_point(size = 3) +
geom_line(size = 1) +
scale_color_brewer(palette = "Spectral") +
scale_x_date(labels = scales::date_format("%d/%b"), breaks = "1 day") +
labs(x = "Date of report", y = "# confirmed cases", color = "UF") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 90, vjust = 0.4, hjust = 0.5))

\(~\)
LS0tDQp0aXRsZTogIkJyYXppbGlhbiBTdXJ2ZWlsbGFuY2Ugb2YgQ09WSUQtMTkiDQpzdWJ0aXRsZTogIk1pbmlzdHJ5IG9mIEhlYWx0aCBEYXRhYmFzZSINCmF1dGhvcjogIlJvbmFsZG8gRlMgQWx2ZXMgLSBCU2MsIE1TYywgUGhEIg0KZGF0ZTogIkxhc3QgdXBkYXRlZDogYHIgZm9ybWF0KFN5cy50aW1lKCksICclZCAlQiAlWSwgJUg6JU0nKWAiDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQokfiQNCg0KIyMjIyMgKipMSU5LUyDDmlRFSVMqKg0KDQorIFtXSE8gRGFzaGJvYXJkXShodHRwczovL2V4cGVyaWVuY2UuYXJjZ2lzLmNvbS9leHBlcmllbmNlLzY4NWQwYWNlNTIxNjQ4ZjhhNWJlZWVlZTFiOTEyNWNkLykNCisgW0pIQyBEYXNoYm9hcmRdKGh0dHBzOi8vc2hpbnkuam9obi1jb2VuZS5jb20vY29yb25hdmlydXMvKQ0KKyBbSGF2YXJkIERhc2hib2FyZF0oaHR0cHM6Ly93d3cuaGVhbHRobWFwLm9yZy9jb3ZpZC0xOS8pDQorIFtDT1ZJRC0xOSBCUiBEYXNoYm9hcmRdKGh0dHBzOi8vY292aWQxOWJyLmdpdGh1Yi5pby9pbmRleC5odG1sLykNCisgW1dITyBMaXRlcmF0dXJlIERhdGFiYXNlXShodHRwczovL3d3dy53aG8uaW50L2VtZXJnZW5jaWVzL2Rpc2Vhc2VzL25vdmVsLWNvcm9uYXZpcnVzLTIwMTkvZ2xvYmFsLXJlc2VhcmNoLW9uLW5vdmVsLWNvcm9uYXZpcnVzLTIwMTktbmNvdi8pDQorIFtOQ0JJIExpdGVyYXR1cmUgRGF0YWJhc2VdKGh0dHBzOi8vd3d3Lm5jYmkubmxtLm5paC5nb3YvcmVzZWFyY2gvY29yb25hdmlydXMvKQ0KKyBbTGFuY2V0IFJlc291cmNlc10oaHR0cHM6Ly93d3cubmNiaS5ubG0ubmloLmdvdi9yZXNlYXJjaC9jb3JvbmF2aXJ1cy8pDQorIFtORUpNIFJlc291cmNlc10oaHR0cHM6Ly93d3cubmVqbS5vcmcvY29yb25hdmlydXMvKQ0KKyBbQk1KIFJlc291cmNlc10oaHR0cHM6Ly93d3cuYm1qLmNvbS9jb3JvbmF2aXJ1cy8pDQorIFtJVklTIFBsYXRmb3JtXShodHRwOi8vcGxhdGFmb3JtYS5zYXVkZS5nb3YuYnIvKQ0KKyBbQ09WSUQtMTkgQlIgRGF0YV0oaHR0cHM6Ly9naXRodWIuY29tL2JlbGlzYXJkcy9jb3JvbmFici8pDQorIFtDT1ZJRC0xOSBCUiBEYXRhXShodHRwczovL2JyYXNpbC5pby9kYXRhc2V0L2NvdmlkMTkvY2Fzby8pDQorIFtDT1ZJRC0xOSBHbG9iYWwgRGF0YV0oaHR0cHM6Ly9kYXRhLmh1bWRhdGEub3JnL2RhdGFzZXQvbm92ZWwtY29yb25hdmlydXMtMjAxOS1uY292LWNhc2VzLykNCisgW0NPVklELTE5IEdsb2JhbCBEYXRhXShodHRwczovL291cndvcmxkaW5kYXRhLm9yZy9jb3JvbmF2aXJ1cy1zb3VyY2UtZGF0YS8pDQorIFtSIFRpcHNdKGh0dHBzOi8vd3d3LnN0YXRzYW5kci5jb20vYmxvZy90b3Atci1yZXNvdXJjZXMtb24tY292aWQtMTktY29yb25hdmlydXMvI3Itc2hpbnktYXBwcy8pDQoNCiR+JA0KDQojIyMjIyAxLiBDQVJSRUdBUiBQQUNPVEVTDQoNCmBgYHtyIG1lc3NhZ2UgPSBGQUxTRX0NCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShkYXRhLnRhYmxlKQ0KbGlicmFyeShsdWJyaWRhdGUpDQpsaWJyYXJ5KGhhYmxhcikNCmxpYnJhcnkob3Blbnhsc3gpDQpsaWJyYXJ5KGZvcmVjYXN0KQ0KI2xpYnJhcnkoY29yb25hYnIpDQpsaWJyYXJ5KGJyYXppbG1hcHMpDQpsaWJyYXJ5KHNmKQ0KbGlicmFyeShsZWFmbGV0KQ0KbGlicmFyeSh4dHMpDQpsaWJyYXJ5KGR5Z3JhcGhzKQ0KI2xpYnJhcnkoZmFibGUpDQpgYGANCg0KJH4kDQoNCiMjIyMjIDIuIElNUE9SVEFSIERBRE9TDQoNCmBgYHtyIGV2YWwgPSBGQUxTRSwgZXJyb3IgPSBGQUxTRX0NCmRhZG9zID0gImh0dHA6Ly9wbGF0YWZvcm1hLnNhdWRlLmdvdi5ici9ub3ZvY29yb25hdmlydXMvcmVzb3VyY2VzL3NjcmlwdHMvZGF0YWJhc2UuanMiICU+JQ0KICByZWFkcjo6cmVhZF9maWxlKCkgJT4lDQogIHN0cmluZ3I6OnN0cl9yZW1vdmUoInZhciBkYXRhYmFzZT0iKSAlPiUNCiAganNvbmxpdGU6OmZyb21KU09OKCkgJT4lDQogIHB1cnJyOjpwbHVjaygiYnJhemlsIikgJT4lDQogIGRwbHlyOjptdXRhdGUodmFsdWVzID0gcHVycnI6Om1hcCh2YWx1ZXMsIGRwbHlyOjptdXRhdGVfYWxsLCBhcy5jaGFyYWN0ZXIpKSAlPiUNCiAgdGlkeXI6OnVubmVzdCh2YWx1ZXMpICU+JQ0KICBkcGx5cjo6bXV0YXRlKGRhdGUgPSBsdWJyaWRhdGU6OmRteShkYXRlKSkNCmBgYA0KDQpgYGB7cn0NCmRhZG9zID0gZnJlYWQoIkM6L1VzZXJzL1JvbmFsZG8gQWx2ZXMvRGVza3RvcC9DT1ZJRF8xOS9jb3JvbmF2aXJ1czIuY3N2IikNCmBgYA0KDQokfiQNCg0KIyMjIyMgMy4gQ1VSQURPUklBIERPUyBEQURPUw0KDQpgYGB7cn0NCnVpZCA9ICBkYXRhLmZyYW1lKHVpZCA9IGMoMTE6MTcsMjE6MjksMzE6MzMsMzUsNDE6NDMsNTA6NTMpKQ0KdWlkID0gc2V0RFQodWlkKVssIGxpc3QoZGF0ZSA9IHNlcShtaW4oeW1kKGRhZG9zJGRhdGUpKSwgbWF4KHltZChkYWRvcyRkYXRlKSksIGJ5ID0gImRheXMiKSksDQogICAgICAgICAgICAgICAgIGJ5ID0gdWlkXQ0KYGBgDQoNCmBgYHtyfQ0KZGFkb3MgPSBkYWRvcyAlPiUgDQogIG11dGF0ZShkYXRlID0geW1kKGRhdGUpKSAlPiUgIyB1aWQgPSBhcy5mYWN0b3IodWlkKQ0KICBmdWxsX2pvaW4odWlkLCBieSA9IGMoInVpZCIgPSAidWlkIiwgImRhdGUiID0gImRhdGUiKSkgJT4lIA0KICBncm91cF9ieSh1aWQsIGRhdGUpICU+JSANCiAgc3VtbWFyaXNlX2FsbChzdW1fKSAlPiUgDQogIG11dGF0ZShpZF9kYXRlID0gZGVuc2VfcmFuayhkYXRlKSkgJT4lIA0KICBhcnJhbmdlKHVpZCwgZGF0ZSkgJT4lIA0KICB1bmdyb3VwKCkgJT4lIA0KICBtdXRhdGVfaWYoaXMubnVtZXJpYywgfnJlcGxhY2VfbmEoLiwgMCkpICU+JSANCiAgbXV0YXRlKHNpZ2xhID0gY2FzZV93aGVuKHVpZCA9PSAxMSB+ICJSTyIsIHVpZCA9PSAxMiB+ICJBQyIsIHVpZCA9PSAxMyB+ICJBTSIsIHVpZCA9PSAxNCB+ICJSUiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICB1aWQgPT0gMTUgfiAiUEEiLCB1aWQgPT0gMTYgfiAiQVAiLCB1aWQgPT0gMTcgfiAiVE8iLCB1aWQgPT0gMjEgfiAiTUEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkID09IDIyIH4gIlBJIiwgdWlkID09IDIzIH4gIkNFIiwgdWlkID09IDI0IH4gIlJOIiwgdWlkID09IDI1IH4gIlBCIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZCA9PSAyNiB+ICJQRSIsIHVpZCA9PSAyNyB+ICJBTCIsIHVpZCA9PSAyOCB+ICJTRSIsIHVpZCA9PSAyOSB+ICJCQSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICB1aWQgPT0gMzEgfiAiTUciLCB1aWQgPT0gMzIgfiAiRVMiLCB1aWQgPT0gMzMgfiAiUkoiLCB1aWQgPT0gMzUgfiAiU1AiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkID09IDQxIH4gIlBSIiwgdWlkID09IDQyIH4gIlNDIiwgdWlkID09IDQzIH4gIlJTIiwgdWlkID09IDUwIH4gIk1TIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZCA9PSA1MSB+ICJNVCIsIHVpZCA9PSA1MiB+ICJHTyIsIHVpZCA9PSA1MyB+ICJERiIpKSAlPiUgDQogIHNlbGVjdChpZF9kYXRlLCB1aWQsIHNpZ2xhLCBldmVyeXRoaW5nKCkpDQpgYGANCg0KYGBge3J9DQpybSh1aWQpDQpkYWRvcw0KYGBgDQoNCiR+JA0KDQojIyMjIyA1LiBBTsOBTElTRSBERVNDUklUSVZBDQoNCmBgYHtyfQ0KZGFkb3MgJT4lIA0KICBzdW1tYXJpc2UoY29uZmlybWFkb3MgPSBzdW1fKGNhc2VzKSwgDQogICAgICAgICAgICBtb3J0ZXMgPSBzdW1fKGRlYXRocyksIA0KICAgICAgICAgICAgZXN0YWRvcyA9IG5fZGlzdGluY3QodWlkKSkNCmBgYA0KDQpgYGB7cn0NCmRhZG9zX3VmID0gZGFkb3MgJT4lIA0KICBncm91cF9ieSh1aWQsIHNpZ2xhKSAlPiUgDQogIHN1bW1hcmlzZShjb25maXJtYWRvcyA9IHN1bV8oY2FzZXMpKSAlPiUgDQogIHVuZ3JvdXAoKQ0KYGBgDQoNCmBgYHtyfQ0KZGFkb3NfdWYgJT4lIHNlbGVjdChzaWdsYSwgY29uZmlybWFkb3MpICU+JSBhcnJhbmdlKC1jb25maXJtYWRvcykNCmBgYA0KDQokfiQNCg0KIyMjIyMgNi4gQU7DgUxJU0UgRVNQQUNJQUwNCg0KYGBge3J9DQpnZ3Bsb3QoZGFkb3NfdWYsIGFlcyh4ID0gcmVvcmRlcihzaWdsYSwgLWNvbmZpcm1hZG9zKSwgeSA9IGNvbmZpcm1hZG9zKSkgKyANCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIGNvbG9yID0gImJsYWNrIiwgZmlsbCA9ICJ3aGl0ZSIpICsgDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBjb25maXJtYWRvcyksIHBvc2l0aW9uID0gInN0YWNrIiwgc2l6ZSA9IDMsIHZqdXN0ID0gLTAuMjUpICsgDQogIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKDAsIG1heChkYWRvc191ZiRjb25maXJtYWRvcykrMTAwKSwgDQogICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBzZXEoMCwgbWF4KGRhZG9zX3VmJGNvbmZpcm1hZG9zKSsxMDAsIDI1MCksIA0KICAgICAgICAgICAgICAgICAgICAgZXhwYW5kID0gYygwLjAxLCAwKSkgKyANCiAgbGFicyh4ID0gIiIsIHkgPSAiIyBjYXNvcyBjb25maXJtYWRvcyIpICsgDQogIHRoZW1lX21pbmltYWwoKQ0KYGBgDQoNCmBgYHtyIHdhcm5pbmc9RkFMU0V9DQptYXBfdWYgPSBnZXRfYnJtYXAoIlN0YXRlIikgJT4lIA0KICBsZWZ0X2pvaW4oZGFkb3NfdWYsIGJ5ID0gYygiU3RhdGUiID0gInVpZCIpKSAlPiUgDQogIHN0X2NlbnRyb2lkKCkNCmBgYA0KDQpgYGB7ciBmaWcud2lkdGggPSA4fQ0KZGF0YS5mcmFtZShzdF9jb29yZGluYXRlcyhtYXBfdWYpLCANCiAgICAgICAgICAgY29uZmlybWFkb3MgPSBtYXBfdWYkY29uZmlybWFkb3MsDQogICAgICAgICAgIFVGID0gbWFwX3VmJG5vbWUsDQogICAgICAgICAgIHNpZ2xhID0gbWFwX3VmJHNpZ2xhKSAlPiUgICMgc3RyX3RvX3RpdGxlKCkNCiAgZmlsdGVyKGNvbmZpcm1hZG9zICE9IDApICU+JSANCiAgbGVhZmxldCgpICU+JSANCiAgYWRkVGlsZXMoKSAlPiUNCiAgYWRkQ2lyY2xlTWFya2Vycyh+WCwgflksIGxhYmVsID0gfmFzLmNoYXJhY3RlcihwYXN0ZTAoc2lnbGEsICI6IiwgY29uZmlybWFkb3MsICIgY2Fzb3MiKSksDQogICAgICAgICAgICAgICAgICAgbGFiZWxPcHRpb25zID0gbGFiZWxPcHRpb25zKHRleHRzaXplID0gIjEycHgiKSwgI25vSGlkZSA9IFQsIHRleHRPbmx5ID0gVCwgZGlyZWN0aW9uID0gImF1dG8iDQogICAgICAgICAgICAgICAgICAgcmFkaXVzID0gfmxvZyhjb25maXJtYWRvcykqMiwNCiAgICAgICAgICAgICAgICAgICBzdHJva2UgPSBGLCANCiAgICAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eSA9IDAuNSkNCmBgYA0KDQokfiQNCg0KIyMjIyMgNy4gQU7DgUxJU0UgVEVNUE9SQUwNCg0KYGBge3IgZmlnLndpZHRoID0gOCwgZmlnLmhlaWdodCA9IDR9DQpkYWRvcyAlPiUgDQogIGdyb3VwX2J5KGRhdGUpICU+JSANCiAgc3VtbWFyaXNlKE4gPSBzdW1fKGNhc2VzKSkgJT4lIA0KICB4dHMoeCA9IC4kTiwgb3JkZXIuYnkgPSAuJGRhdGUpICU+JSANCiAgZHlncmFwaCh4bGFiID0gIkRhdGUgb2YgcmVwb3J0IiwgeWxhYiA9ICIjIGNvbmZpcm1lZCBjYXNlcyIpICU+JSANCiAgZHlPcHRpb25zKGRyYXdQb2ludHMgPSBULCBwb2ludFNpemUgPSA0LCBmaWxsR3JhcGggPSBULCBmaWxsQWxwaGEgPSAwLjQpICU+JSANCiAgZHlSYW5nZVNlbGVjdG9yKCkgJT4lIA0KICBkeVNlcmllcygiVjEiLCBsYWJlbCA9ICJjb25maXJtZWQgY2FzZXMiKSAlPiUgDQogIGR5TGVnZW5kKHNob3cgPSAiYXV0byIsIGhpZGVPbk1vdXNlT3V0ID0gRkFMU0UpDQpgYGANCg0KJH4kDQoNCmBgYHtyIHdhcm5pbmcgPSBGQUxTRX0NCmRhZG9zICU+JSANCiAgZ3JvdXBfYnkoZGF0ZSkgJT4lIA0KICBzdW1tYXJpc2UoTiA9IHN1bV8oY2FzZXMpKSAlPiUgDQogIGZpbHRlcihkYXRlID49ICIyMDIwLTAyLTI2IikgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBkYXRlLCB5ID0gbG9nKE4pKSkgKw0KICBnZW9tX3BvaW50KHNpemUgPSAzLCBzaGFwZSA9IDIxLCBmaWxsID0gIm9yYW5nZSIpICsgDQogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIGZvcm11bGEgPSB5IH4geCwgY29sb3IgPSAicmVkIikgKyANCiAgc2NhbGVfeF9kYXRlKGxhYmVscyA9IHNjYWxlczo6ZGF0ZV9mb3JtYXQoIiVkLyViIiksIGJyZWFrcyA9ICIxIGRheSIpICsgDQogIGxhYnMoeCA9ICJEYXRlIG9mIHJlcG9ydCIsIHkgPSAiIyBjb25maXJtZWQgY2FzZXMgKGxvZyBzY2FsZSkiKSArIA0KICB0aGVtZV9taW5pbWFsKCkgKyANCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgdmp1c3QgPSAwLjQsIGhqdXN0ID0gMC41KSkNCmBgYA0KDQokfiQNCg0KYGBge3J9DQpkYWRvcyAlPiUgDQogIGdyb3VwX2J5KGRhdGUpICU+JSANCiAgc3VtbWFyaXNlKE4gPSBzdW1fKGNhc2VzKSkgJT4lIA0KICBmaWx0ZXIoZGF0ZSA+PSAiMjAyMC0wMi0yNiIpICU+JSANCiAgbXV0YXRlKHkgPSBsb2cxMChOICsgMSksIGRheXMgPSAxOm5yb3coLikpICU+JSANCiAgbG0oeSB+IGRheXMsIGRhdGEgPSAuLCBuYS5hY3Rpb24gPSBuYS5leGNsdWRlKSAlPiUgDQogIHN1bW1hcnkoKQ0KYGBgDQoNCiR+JA0KDQpgYGB7cn0NCmRhZG9zICU+JSANCiAgI2dyb3VwX2J5KHNpZ2xhLCBkYXRlKSAlPiUgDQogICNzdW1tYXJpc2UoTiA9IHN1bV8oY2FzZXMpKSAlPiUgDQogIGZpbHRlcihkYXRlID49ICIyMDIwLTAyLTI2Iiwgc2lnbGEgJWluJSBjKCJTUCIsIlJKIiwiREYiLCJSUyIsIlBSIiwiUEUiLCJNRyIsIlNDIikpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gZGF0ZSwgeSA9IGNhc2VzLCBjb2xvciA9IHJlb3JkZXIoc2lnbGEsIC1jYXNlcykpKSArDQogIGdlb21fcG9pbnQoc2l6ZSA9IDMpICsgDQogIGdlb21fbGluZShzaXplID0gMSkgKyANCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGUgPSAiU3BlY3RyYWwiKSArIA0KICBzY2FsZV94X2RhdGUobGFiZWxzID0gc2NhbGVzOjpkYXRlX2Zvcm1hdCgiJWQvJWIiKSwgYnJlYWtzID0gIjEgZGF5IikgKyANCiAgbGFicyh4ID0gIkRhdGUgb2YgcmVwb3J0IiwgeSA9ICIjIGNvbmZpcm1lZCBjYXNlcyIsIGNvbG9yID0gIlVGIikgKyANCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgdmp1c3QgPSAwLjQsIGhqdXN0ID0gMC41KSkNCmBgYA0KDQokfiQNCg0KYGBge3J9DQoNCmBgYA0KDQoNCg0KDQoNCg0KDQoNCg0K