Abstract

TBA

Setup

suppressWarnings(suppressMessages({
  library(knitr)
  library(kableExtra)
  library(htmltools)
  library(tidyverse)
  library(scales)
  library(ExPanDaR)
}))
knitr::opts_chunk$set(fig.align = 'center')

Create Sample

This step reads the raw data provided by ExPanD() and generates the sample for the analysis.

create_sample <- function(df, df_def) {
  # Set infinite numerical variables to NA
  df[, df_def$var_name[df_def$type == "numeric"]] <-
    lapply(df[, df_def$var_name[df_def$type == "numeric"]],
      function(x) ifelse(is.finite(x), x, NA))
 
  # Delete numerical variables that only contain NAs
  all_na_vars <- sapply(df, function (x) all(is.na(x)))
  df_def <- df_def[!all_na_vars,]
  df <- df[, df_def$var_name]
 
  # Drop observations that are NA in variables that are not allowed to
  df <- df[complete.cases(df[, df_def$var_name[which(df_def$can_be_na == FALSE)]]), ]
 
  df <- droplevels(df)
  return(list(df = df, df_def = df_def))
}
 
load("ExPanD_nb_data.Rdata")
 
smp_list <- create_sample(nb_df, nb_df_def)
smp <- smp_list$df
smp_def <- smp_list$df_def

Bar Chart

df <- smp
df$year <- as.factor(df$year)
p <- ggplot(df, aes(x = year)) +
geom_bar() + labs(x = "year")
p <- p + scale_x_discrete(breaks = pretty(as.numeric(as.character(df$year)), n = 10))
p

Missing Values

df <- smp
prepare_missing_values_graph(df, "year")

Descriptive Statistics

df <- smp
t <- prepare_descriptive_table(smp)
t$kable_ret  %>%
  kable_styling("condensed", full_width = F, position = "center")
Descriptive Statistics
N Mean Std. dev. Min. 25 % Median 75 % Max.
Y 650 1,314,992.485 2,597,230.332 55,661.000 221,501.250 367,013.500 1,398,438.750 16,490,883.000
K 650 4,360,577.048 8,057,613.445 163,185.000 777,063.500 1,410,611.000 4,428,251.750 52,849,892.000
pop 650 35.609 58.351 3.016 5.930 10.752 41.669 319.449
L 650 16.576 28.160 1.184 2.842 4.784 18.223 148.463
s 650 10.272 1.556 5.844 9.299 10.474 11.389 14.996
alpha_it 650 0.429 0.081 0.298 0.372 0.407 0.471 0.801
GDPpc 650 34,429.230 10,778.468 14,193.678 26,931.717 33,616.328 39,840.247 81,879.516
lp 650 74,238.609 19,239.144 31,440.531 61,726.696 73,649.012 83,727.193 153,111.469
h 650 3.680 0.450 2.484 3.386 3.724 3.999 5.202
kl 650 257,507.503 88,933.005 67,559.000 195,197.680 237,460.523 306,806.281 552,395.188
kp 650 0.305 0.077 0.134 0.257 0.303 0.340 0.693
ky 650 3.482 0.881 1.444 2.945 3.304 3.884 7.479
TFP 650 1,722.405 890.059 583.144 1,095.234 1,419.952 2,133.549 5,388.233
log_GDPpc_raw 650 10.400 0.304 9.561 10.201 10.423 10.593 11.313
log_lp_raw 650 11.183 0.254 10.356 11.030 11.207 11.335 11.939
log_ky_raw 650 1.218 0.244 0.367 1.080 1.195 1.357 2.012
log_h_raw 650 1.295 0.127 0.910 1.220 1.315 1.386 1.649
log_tfp_raw 650 7.345 0.446 6.368 6.999 7.258 7.666 8.592
log_GDPpc 650 10.400 0.297 9.574 10.205 10.411 10.594 11.368
log_lp 650 11.183 0.248 10.351 11.032 11.191 11.333 11.984
log_ky 650 1.218 0.223 0.344 1.100 1.193 1.329 1.947
log_h 650 1.295 0.125 0.904 1.219 1.318 1.385 1.615
log_tfp 650 7.345 0.442 6.376 6.985 7.235 7.650 8.595
club_log_lp 625 2.080 0.797 1.000 2.000 2.000 2.000 4.000
finalclub_log_lp 625 1.880 0.516 1.000 2.000 2.000 2.000 3.000
re_log_lp 650 1.000 0.017 0.951 0.994 1.000 1.009 1.050
club_log_ky 650 1.923 0.829 1.000 1.000 2.000 3.000 3.000
finalclub_log_ky 650 1.308 0.462 1.000 1.000 1.000 2.000 2.000
re_log_ky 650 1.000 0.160 0.304 0.915 1.003 1.079 1.389
club_log_h 625 1.120 0.325 1.000 1.000 1.000 1.000 2.000
finalclub_log_h 625 1.120 0.325 1.000 1.000 1.000 1.000 2.000
re_log_h 650 1.000 0.087 0.754 0.946 1.015 1.060 1.211
club_log_tfp 650 2.000 0.680 1.000 2.000 2.000 2.000 3.000
finalclub_log_tfp 650 2.000 0.680 1.000 2.000 2.000 2.000 3.000
re_log_tfp 650 1.000 0.059 0.892 0.949 0.986 1.039 1.166

Histogram

var <- as.numeric(smp$log_lp[smp$year == "1990"])
hist(var, main="", xlab = "log_lp", col="red", right = FALSE, breaks= 25)

Extreme Observations

df <- smp
vars <- c("country", "year", "GDPpc", "year")
df <- df[df$year == "1990", ]
df <- df[, vars]
df <- droplevels(df[complete.cases(df), ])
if (nrow(df) <= 10) {
  cat("Not enough data to generate table")
} else {
  tab <- prepare_ext_obs_table(df, var = "GDPpc")
  tab$kable_ret %>%
    kable_styling()
}
country year year.1 GDPpc
Switzerland 1990 1990 37,503.4
United States 1990 1990 36,621.1
Norway 1990 1990 30,351.3
Canada 1990 1990 30,233.4
Australia 1990 1990 27,216.0
... ... ... ...
Taiwan 1990 1990 19,214.2
Spain 1990 1990 17,108.7
Ireland 1990 1990 16,931.0
Greece 1990 1990 16,185.3
Portugal 1990 1990 14,193.7

By Group Bar Graph

df <- smp
df <- df[df$year == "1990", ]
prepare_by_group_bar_graph(df, "region", "lp", mean, TRUE)$plot +
  ylab("mean lp")

By Group Violin Graph

df <- smp
prepare_by_group_violin_graph(df, "region", "log_lp", TRUE)

Trend Graph

df <- smp
prepare_trend_graph(df, "year", c("lp"))$plot

Quantile Trend Graph

df <- smp
prepare_quantile_trend_graph(df, "year", c(0.05, 0.25, 0.5, 0.75, 0.95), "lp")$plot

lp

log_lp_raw <- prepare_quantile_trend_graph(smp, "year", c(0.05, 0.25, 0.5, 0.75, 0.95), "log_lp_raw")$plot
log_lp_raw <- log_lp_raw +
theme_minimal() +
  guides(color = guide_legend(reverse = TRUE)) +
  scale_color_discrete(name = "Quantile") +
  labs(x = "",
       y = "Log of Labor Productivity")
Scale for 'colour' is already present. Adding another scale for 'colour', which will replace the existing scale.
ggsave("quintiles_hiYes_log_lp_raw.pdf", width = 6, height = 4)

ky

log_ky_raw <- prepare_quantile_trend_graph(smp, "year", c(0.05, 0.25, 0.5, 0.75, 0.95), "log_ky_raw")$plot
log_ky_raw <- log_ky_raw +
theme_minimal() +
  guides(color = guide_legend(reverse = TRUE)) +
  scale_color_discrete(name = "Quantile") +
  labs(x = "",
       y = "Log of Capital-Output Ratio")
Scale for 'colour' is already present. Adding another scale for 'colour', which will replace the existing scale.
ggsave("quintiles_hiYes_log_ky_raw.pdf", width = 6, height = 4)

h

log_h_raw <- prepare_quantile_trend_graph(smp, "year", c(0.05, 0.25, 0.5, 0.75, 0.95), "log_h_raw")$plot
log_h_raw <- log_h_raw +
theme_minimal() +
  guides(color = guide_legend(reverse = TRUE)) +
  scale_color_discrete(name = "Quantile") +
  labs(x = "",
       y = "Log of Human Capital")
Scale for 'colour' is already present. Adding another scale for 'colour', which will replace the existing scale.
ggsave("quintiles_hiYes_log_h_raw.pdf", width = 6, height = 4)

TFP

log_tfp_raw <- prepare_quantile_trend_graph(smp, "year", c(0.05, 0.25, 0.5, 0.75, 0.95), "log_tfp_raw")$plot
log_tfp_raw <- log_tfp_raw +
theme_minimal() +
  guides(color = guide_legend(reverse = TRUE)) +
  scale_color_discrete(name = "Quantile") +
  labs(x = "",
       y = "Log of Aggregate Efficiency")
Scale for 'colour' is already present. Adding another scale for 'colour', which will replace the existing scale.
ggsave("quintiles_hiYes_log_tfp_raw.pdf", width = 6, height = 4)

Correlation Graph

df <- smp
ret <- prepare_correlation_graph(df[, c(3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40)])

Scatter Plot

df <- smp
df <- df[, c("country", "year", "log_lp", "log_GDPpc", "region", "pop")]
df <- df[complete.cases(df), ]
df$region <- as.factor(df$region)
prepare_scatter_plot(df, "log_lp", "log_GDPpc", color = "region", size = "pop", loess = 1)

Regresssion Table

df <- smp
df <- df[, c("log_lp", "log_ky", "log_h", "log_tfp", "country", "year")]
df <- df[complete.cases(df), ]
df <- droplevels(df)
t <- prepare_regression_table(df, dvs = "log_lp", idvs = c("log_ky", "log_h", "log_tfp"), feffects = c("country", "year"), clusters = c("country", "year"), models = "ols")
length of NULL cannot be changedlength of NULL cannot be changedlength of NULL cannot be changed
HTML(t$table)
Dependent variable:
log_lp
log_ky0.469***
(0.060)
log_h0.435***
(0.135)
log_tfp1.180***
(0.064)
Estimatorols
Fixed effectscountry, year
Std. errors clusteredcountry, year
Observations650
R20.988
Adjusted R20.987
Note:*p<0.1; **p<0.05; ***p<0.01

Note

This Notebook has been automatically generated using the ExPanDaR package.

LS0tCnRpdGxlOiBoaVllcwpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCiAKIAojIyMgQWJzdHJhY3QKVEJBCiAKIAojIyMgU2V0dXAKIApgYGB7ciBzZXR1cH0Kc3VwcHJlc3NXYXJuaW5ncyhzdXBwcmVzc01lc3NhZ2VzKHsKICBsaWJyYXJ5KGtuaXRyKQogIGxpYnJhcnkoa2FibGVFeHRyYSkKICBsaWJyYXJ5KGh0bWx0b29scykKICBsaWJyYXJ5KHRpZHl2ZXJzZSkKICBsaWJyYXJ5KHNjYWxlcykKICBsaWJyYXJ5KEV4UGFuRGFSKQp9KSkKa25pdHI6Om9wdHNfY2h1bmskc2V0KGZpZy5hbGlnbiA9ICdjZW50ZXInKQpgYGAKIAogCiMjIyBDcmVhdGUgU2FtcGxlCiAKVGhpcyBzdGVwIHJlYWRzIHRoZSByYXcgZGF0YSBwcm92aWRlZCBieSBgRXhQYW5EKClgIGFuZCBnZW5lcmF0ZXMgdGhlIHNhbXBsZSBmb3IgdGhlIGFuYWx5c2lzLgogCmBgYHtyIGNyZWF0ZV9zYW1wbGV9CmNyZWF0ZV9zYW1wbGUgPC0gZnVuY3Rpb24oZGYsIGRmX2RlZikgewogICMgU2V0IGluZmluaXRlIG51bWVyaWNhbCB2YXJpYWJsZXMgdG8gTkEKICBkZlssIGRmX2RlZiR2YXJfbmFtZVtkZl9kZWYkdHlwZSA9PSAibnVtZXJpYyJdXSA8LQogICAgbGFwcGx5KGRmWywgZGZfZGVmJHZhcl9uYW1lW2RmX2RlZiR0eXBlID09ICJudW1lcmljIl1dLAogICAgICBmdW5jdGlvbih4KSBpZmVsc2UoaXMuZmluaXRlKHgpLCB4LCBOQSkpCiAKICAjIERlbGV0ZSBudW1lcmljYWwgdmFyaWFibGVzIHRoYXQgb25seSBjb250YWluIE5BcwogIGFsbF9uYV92YXJzIDwtIHNhcHBseShkZiwgZnVuY3Rpb24gKHgpIGFsbChpcy5uYSh4KSkpCiAgZGZfZGVmIDwtIGRmX2RlZlshYWxsX25hX3ZhcnMsXQogIGRmIDwtIGRmWywgZGZfZGVmJHZhcl9uYW1lXQogCiAgIyBEcm9wIG9ic2VydmF0aW9ucyB0aGF0IGFyZSBOQSBpbiB2YXJpYWJsZXMgdGhhdCBhcmUgbm90IGFsbG93ZWQgdG8KICBkZiA8LSBkZltjb21wbGV0ZS5jYXNlcyhkZlssIGRmX2RlZiR2YXJfbmFtZVt3aGljaChkZl9kZWYkY2FuX2JlX25hID09IEZBTFNFKV1dKSwgXQogCiAgZGYgPC0gZHJvcGxldmVscyhkZikKICByZXR1cm4obGlzdChkZiA9IGRmLCBkZl9kZWYgPSBkZl9kZWYpKQp9CiAKbG9hZCgiRXhQYW5EX25iX2RhdGEuUmRhdGEiKQogCnNtcF9saXN0IDwtIGNyZWF0ZV9zYW1wbGUobmJfZGYsIG5iX2RmX2RlZikKc21wIDwtIHNtcF9saXN0JGRmCnNtcF9kZWYgPC0gc21wX2xpc3QkZGZfZGVmCmBgYAogCiAKIyMjIEJhciBDaGFydAogCmBgYHtyIGJhcl9jaGFydH0KZGYgPC0gc21wCmRmJHllYXIgPC0gYXMuZmFjdG9yKGRmJHllYXIpCnAgPC0gZ2dwbG90KGRmLCBhZXMoeCA9IHllYXIpKSArCmdlb21fYmFyKCkgKyBsYWJzKHggPSAieWVhciIpCnAgPC0gcCArIHNjYWxlX3hfZGlzY3JldGUoYnJlYWtzID0gcHJldHR5KGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGRmJHllYXIpKSwgbiA9IDEwKSkKcApgYGAKIAogCiMjIyBNaXNzaW5nIFZhbHVlcwogCmBgYHtyIG1pc3NpbmdfdmFsdWVzfQpkZiA8LSBzbXAKcHJlcGFyZV9taXNzaW5nX3ZhbHVlc19ncmFwaChkZiwgInllYXIiKQpgYGAKIAogCiMjIyBEZXNjcmlwdGl2ZSBTdGF0aXN0aWNzCiAKYGBge3IgZGVzY3JpcHRpdmVfc3RhdGlzdGljc30KZGYgPC0gc21wCnQgPC0gcHJlcGFyZV9kZXNjcmlwdGl2ZV90YWJsZShzbXApCnQka2FibGVfcmV0ICAlPiUKICBrYWJsZV9zdHlsaW5nKCJjb25kZW5zZWQiLCBmdWxsX3dpZHRoID0gRiwgcG9zaXRpb24gPSAiY2VudGVyIikKYGBgCiAKIAojIyMgSGlzdG9ncmFtCiAKYGBge3IgaGlzdG9ncmFtfQp2YXIgPC0gYXMubnVtZXJpYyhzbXAkbG9nX2xwW3NtcCR5ZWFyID09ICIxOTkwIl0pCmhpc3QodmFyLCBtYWluPSIiLCB4bGFiID0gImxvZ19scCIsIGNvbD0icmVkIiwgcmlnaHQgPSBGQUxTRSwgYnJlYWtzPSAyNSkKYGBgCiAKIAojIyMgRXh0cmVtZSBPYnNlcnZhdGlvbnMKIApgYGB7ciBleHRyZW1lX29ic30KZGYgPC0gc21wCnZhcnMgPC0gYygiY291bnRyeSIsICJ5ZWFyIiwgIkdEUHBjIiwgInllYXIiKQpkZiA8LSBkZltkZiR5ZWFyID09ICIxOTkwIiwgXQpkZiA8LSBkZlssIHZhcnNdCmRmIDwtIGRyb3BsZXZlbHMoZGZbY29tcGxldGUuY2FzZXMoZGYpLCBdKQppZiAobnJvdyhkZikgPD0gMTApIHsKICBjYXQoIk5vdCBlbm91Z2ggZGF0YSB0byBnZW5lcmF0ZSB0YWJsZSIpCn0gZWxzZSB7CiAgdGFiIDwtIHByZXBhcmVfZXh0X29ic190YWJsZShkZiwgdmFyID0gIkdEUHBjIikKICB0YWIka2FibGVfcmV0ICU+JQogICAga2FibGVfc3R5bGluZygpCn0KYGBgCiAKIAojIyMgQnkgR3JvdXAgQmFyIEdyYXBoCiAKYGBge3IgYnlfZ3JvdXBfYmFyX2dyYXBofQpkZiA8LSBzbXAKZGYgPC0gZGZbZGYkeWVhciA9PSAiMTk5MCIsIF0KcHJlcGFyZV9ieV9ncm91cF9iYXJfZ3JhcGgoZGYsICJyZWdpb24iLCAibHAiLCBtZWFuLCBUUlVFKSRwbG90ICsKICB5bGFiKCJtZWFuIGxwIikKYGBgCiAKIAojIyMgQnkgR3JvdXAgVmlvbGluIEdyYXBoCiAKYGBge3IgYnlfZ3JvdXBfdmlvbGluX2dyYXBofQpkZiA8LSBzbXAKcHJlcGFyZV9ieV9ncm91cF92aW9saW5fZ3JhcGgoZGYsICJyZWdpb24iLCAibG9nX2xwIiwgVFJVRSkKYGBgCiAKIAojIyMgVHJlbmQgR3JhcGgKIApgYGB7ciB0cmVuZF9ncmFwaH0KZGYgPC0gc21wCnByZXBhcmVfdHJlbmRfZ3JhcGgoZGYsICJ5ZWFyIiwgYygibHAiKSkkcGxvdApgYGAKIAogCiMjIyBRdWFudGlsZSBUcmVuZCBHcmFwaAogCmBgYHtyIHF1YW50aWxlX3RyZW5kX2dyYXBofQpkZiA8LSBzbXAKcHJlcGFyZV9xdWFudGlsZV90cmVuZF9ncmFwaChkZiwgInllYXIiLCBjKDAuMDUsIDAuMjUsIDAuNSwgMC43NSwgMC45NSksICJscCIpJHBsb3QKYGBgCgojIyMjIGxwICAKYGBge3J9CmxvZ19scF9yYXcgPC0gcHJlcGFyZV9xdWFudGlsZV90cmVuZF9ncmFwaChzbXAsICJ5ZWFyIiwgYygwLjA1LCAwLjI1LCAwLjUsIDAuNzUsIDAuOTUpLCAibG9nX2xwX3JhdyIpJHBsb3QKYGBgCgoKYGBge3J9CmxvZ19scF9yYXcgPC0gbG9nX2xwX3JhdyArCnRoZW1lX21pbmltYWwoKSArCiAgZ3VpZGVzKGNvbG9yID0gZ3VpZGVfbGVnZW5kKHJldmVyc2UgPSBUUlVFKSkgKwogIHNjYWxlX2NvbG9yX2Rpc2NyZXRlKG5hbWUgPSAiUXVhbnRpbGUiKSArCiAgbGFicyh4ID0gIiIsCiAgICAgICB5ID0gIkxvZyBvZiBMYWJvciBQcm9kdWN0aXZpdHkiKQpnZ3NhdmUoInF1aW50aWxlc19oaVllc19sb2dfbHBfcmF3LnBkZiIsIHdpZHRoID0gNiwgaGVpZ2h0ID0gNCkKYGBgCgojIyMjIGt5ICAKCmBgYHtyfQpsb2dfa3lfcmF3IDwtIHByZXBhcmVfcXVhbnRpbGVfdHJlbmRfZ3JhcGgoc21wLCAieWVhciIsIGMoMC4wNSwgMC4yNSwgMC41LCAwLjc1LCAwLjk1KSwgImxvZ19reV9yYXciKSRwbG90CmBgYAoKCmBgYHtyfQpsb2dfa3lfcmF3IDwtIGxvZ19reV9yYXcgKwp0aGVtZV9taW5pbWFsKCkgKwogIGd1aWRlcyhjb2xvciA9IGd1aWRlX2xlZ2VuZChyZXZlcnNlID0gVFJVRSkpICsKICBzY2FsZV9jb2xvcl9kaXNjcmV0ZShuYW1lID0gIlF1YW50aWxlIikgKwogIGxhYnMoeCA9ICIiLAogICAgICAgeSA9ICJMb2cgb2YgQ2FwaXRhbC1PdXRwdXQgUmF0aW8iKQpnZ3NhdmUoInF1aW50aWxlc19oaVllc19sb2dfa3lfcmF3LnBkZiIsIHdpZHRoID0gNiwgaGVpZ2h0ID0gNCkKYGBgICAgCgoKIyMjIyBoICAKCmBgYHtyfQpsb2dfaF9yYXcgPC0gcHJlcGFyZV9xdWFudGlsZV90cmVuZF9ncmFwaChzbXAsICJ5ZWFyIiwgYygwLjA1LCAwLjI1LCAwLjUsIDAuNzUsIDAuOTUpLCAibG9nX2hfcmF3IikkcGxvdApgYGAKCgpgYGB7cn0KbG9nX2hfcmF3IDwtIGxvZ19oX3JhdyArCnRoZW1lX21pbmltYWwoKSArCiAgZ3VpZGVzKGNvbG9yID0gZ3VpZGVfbGVnZW5kKHJldmVyc2UgPSBUUlVFKSkgKwogIHNjYWxlX2NvbG9yX2Rpc2NyZXRlKG5hbWUgPSAiUXVhbnRpbGUiKSArCiAgbGFicyh4ID0gIiIsCiAgICAgICB5ID0gIkxvZyBvZiBIdW1hbiBDYXBpdGFsIikKZ2dzYXZlKCJxdWludGlsZXNfaGlZZXNfbG9nX2hfcmF3LnBkZiIsIHdpZHRoID0gNiwgaGVpZ2h0ID0gNCkKYGBgICAKCgojIyMjIFRGUCAgCgpgYGB7cn0KbG9nX3RmcF9yYXcgPC0gcHJlcGFyZV9xdWFudGlsZV90cmVuZF9ncmFwaChzbXAsICJ5ZWFyIiwgYygwLjA1LCAwLjI1LCAwLjUsIDAuNzUsIDAuOTUpLCAibG9nX3RmcF9yYXciKSRwbG90CmBgYAoKCmBgYHtyfQpsb2dfdGZwX3JhdyA8LSBsb2dfdGZwX3JhdyArCnRoZW1lX21pbmltYWwoKSArCiAgZ3VpZGVzKGNvbG9yID0gZ3VpZGVfbGVnZW5kKHJldmVyc2UgPSBUUlVFKSkgKwogIHNjYWxlX2NvbG9yX2Rpc2NyZXRlKG5hbWUgPSAiUXVhbnRpbGUiKSArCiAgbGFicyh4ID0gIiIsCiAgICAgICB5ID0gIkxvZyBvZiBBZ2dyZWdhdGUgRWZmaWNpZW5jeSIpCmdnc2F2ZSgicXVpbnRpbGVzX2hpWWVzX2xvZ190ZnBfcmF3LnBkZiIsIHdpZHRoID0gNiwgaGVpZ2h0ID0gNCkKYGBgICAgCgogIAogCiMjIyBDb3JyZWxhdGlvbiBHcmFwaAogCmBgYHtyIGNvcnJwbG90fQpkZiA8LSBzbXAKcmV0IDwtIHByZXBhcmVfY29ycmVsYXRpb25fZ3JhcGgoZGZbLCBjKDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsIDE2LCAxNywgMTgsIDE5LCAyMCwgMjEsIDIyLCAyMywgMjQsIDI1LCAyOSwgMzAsIDMxLCAzMiwgMzMsIDM0LCAzNSwgMzYsIDM3LCAzOCwgMzksIDQwKV0pCmBgYAogCiAKIyMjIFNjYXR0ZXIgUGxvdAogCmBgYHtyIHNjYXR0ZXJfcGxvdH0KZGYgPC0gc21wCmRmIDwtIGRmWywgYygiY291bnRyeSIsICJ5ZWFyIiwgImxvZ19scCIsICJsb2dfR0RQcGMiLCAicmVnaW9uIiwgInBvcCIpXQpkZiA8LSBkZltjb21wbGV0ZS5jYXNlcyhkZiksIF0KZGYkcmVnaW9uIDwtIGFzLmZhY3RvcihkZiRyZWdpb24pCnByZXBhcmVfc2NhdHRlcl9wbG90KGRmLCAibG9nX2xwIiwgImxvZ19HRFBwYyIsIGNvbG9yID0gInJlZ2lvbiIsIHNpemUgPSAicG9wIiwgbG9lc3MgPSAxKQpgYGAKIAogCiMjIyBSZWdyZXNzc2lvbiBUYWJsZQogCmBgYHtyIHJlZ3Jlc3Npb259CmRmIDwtIHNtcApkZiA8LSBkZlssIGMoImxvZ19scCIsICJsb2dfa3kiLCAibG9nX2giLCAibG9nX3RmcCIsICJjb3VudHJ5IiwgInllYXIiKV0KZGYgPC0gZGZbY29tcGxldGUuY2FzZXMoZGYpLCBdCmRmIDwtIGRyb3BsZXZlbHMoZGYpCnQgPC0gcHJlcGFyZV9yZWdyZXNzaW9uX3RhYmxlKGRmLCBkdnMgPSAibG9nX2xwIiwgaWR2cyA9IGMoImxvZ19reSIsICJsb2dfaCIsICJsb2dfdGZwIiksIGZlZmZlY3RzID0gYygiY291bnRyeSIsICJ5ZWFyIiksIGNsdXN0ZXJzID0gYygiY291bnRyeSIsICJ5ZWFyIiksIG1vZGVscyA9ICJvbHMiKQpIVE1MKHQkdGFibGUpCmBgYAogCiAKIyMjIE5vdGUKIApUaGlzIE5vdGVib29rIGhhcyBiZWVuIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIHVzaW5nIHRoZSBbRXhQYW5EYVJdKGh0dHBzOi8vam9hY2hpbS1nYXNzZW4uZ2l0aHViLmlvL0V4UGFuRGFSKSBwYWNrYWdlLgogCg==