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 2,050 352,201.530 1,102,853.740 2,777.000 19,869.499 57,618.500 265,002.500 16,810,260.000
K 2,050 1,017,835.807 3,635,318.526 2,004.000 46,608.000 135,641.000 751,916.250 69,379,696.000
pop 2,050 58.787 183.826 1.316 5.885 14.773 39.932 1,369.436
L 2,050 25.637 92.429 0.565 2.235 5.186 14.301 798.368
s 2,050 6.855 2.918 0.893 4.558 6.921 9.235 13.303
alpha_it 1,600 0.467 0.121 0.134 0.394 0.469 0.553 0.836
GDPpc 2,050 6,883.863 6,252.230 313.981 1,896.098 4,769.369 10,289.792 34,585.176
lp 2,050 17,779.082 15,015.283 991.421 5,230.301 13,171.517 26,803.804 66,454.039
h 2,050 2.775 0.752 1.320 2.177 2.752 3.368 4.613
kl 2,050 53,204.908 57,725.995 725.042 10,905.244 33,394.666 78,021.984 383,185.594
kp 2,050 0.486 0.409 0.088 0.302 0.388 0.530 5.367
ky 2,050 2.728 1.300 0.186 1.886 2.577 3.308 11.308
TFP 2,050 703.846 537.702 70.087 306.778 542.910 927.293 3,306.472
log_GDPpc_raw 2,050 8.382 1.018 5.749 7.548 8.470 9.239 10.451
log_lp_raw 2,050 9.357 1.005 6.899 8.562 9.486 10.196 11.104
log_ky_raw 2,050 0.886 0.516 -1.680 0.635 0.947 1.196 2.425
log_h_raw 2,050 0.982 0.283 0.278 0.778 1.012 1.214 1.529
log_tfp_raw 2,050 6.281 0.757 4.250 5.726 6.297 6.832 8.104
log_GDPpc 2,050 8.382 1.010 6.134 7.563 8.452 9.224 10.476
log_lp 2,050 9.357 0.997 7.050 8.597 9.476 10.195 11.141
log_ky 2,050 0.886 0.495 -1.807 0.641 0.943 1.187 2.024
log_h 2,050 0.982 0.282 0.266 0.775 1.008 1.214 1.531
log_tfp 2,050 6.281 0.748 4.451 5.704 6.300 6.832 8.125
club_log_lp 2,025 2.370 1.427 1.000 1.000 2.000 4.000 6.000
finalclub_log_lp 2,025 1.753 1.106 1.000 1.000 1.000 3.000 5.000
re_log_lp 2,050 1.000 0.104 0.760 0.918 1.016 1.093 1.169
club_log_ky 2,050 1.000 0.000 1.000 1.000 1.000 1.000 1.000
finalclub_log_ky 2,050 1.000 0.000 1.000 1.000 1.000 1.000 1.000
re_log_ky 2,050 1.000 0.590 -2.936 0.737 1.057 1.300 2.509
club_log_h 2,050 2.280 1.373 1.000 1.000 2.000 3.000 5.000
finalclub_log_h 2,050 1.439 0.718 1.000 1.000 1.000 2.000 3.000
re_log_h 2,050 1.000 0.282 0.306 0.778 1.013 1.243 1.573
club_log_tfp 2,025 3.728 1.218 1.000 3.000 4.000 4.000 6.000
finalclub_log_tfp 2,025 1.951 0.888 1.000 1.000 2.000 2.000 4.000
re_log_tfp 2,050 1.000 0.118 0.683 0.910 1.012 1.090 1.247

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
Czech Republic 1990 1990 20,417.098
Russia 1990 1990 18,293.967
Slovenia 1990 1990 17,182.484
Slovak Republic 1990 1990 16,293.812
Latvia 1990 1990 14,869.078
... ... ... ...
Uganda 1990 1990 805.954
Myanmar 1990 1990 799.932
Mali 1990 1990 727.063
Yemen 1990 1990 694.167
Mozambique 1990 1990 526.026

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_hiNo_log_lp_raw.pdf", width = 6, height = 4)
Qre_log_lp_Developing <- prepare_quantile_trend_graph(smp, "year", c(0.05, 0.25, 0.5, 0.75, 0.95), "re_log_lp")$plot
Qre_log_lp_Developing +
theme_minimal() +
  guides(color = guide_legend(reverse = TRUE)) +
  scale_color_discrete(name = "Quantile") +
  labs(x = "",
       y = "Relative (log) labor productivity")
Scale for 'colour' is already present. Adding another scale for 'colour', which
will replace the existing scale.
ggsave("Qre_log_lp_Developing.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_hiNo_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_hiNo_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_hiNo_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, 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)
set.seed(42)
df <- sample_n(df, 1000)
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.483***
(0.032)
log_h0.183
(0.168)
log_tfp1.503***
(0.048)
Estimatorols
Fixed effectscountry, year
Std. errors clusteredcountry, year
Observations2,050
R20.997
Adjusted R20.997
Note:*p<0.1; **p<0.05; ***p<0.01

Note

This Notebook has been automatically generated using the ExPanDaR package.

LS0tCnRpdGxlOiBoaU5PCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KIAogCiMjIyBBYnN0cmFjdApUQkEKIAogCiMjIyBTZXR1cAogCmBgYHtyIHNldHVwfQpzdXBwcmVzc1dhcm5pbmdzKHN1cHByZXNzTWVzc2FnZXMoewogIGxpYnJhcnkoa25pdHIpCiAgbGlicmFyeShrYWJsZUV4dHJhKQogIGxpYnJhcnkoaHRtbHRvb2xzKQogIGxpYnJhcnkodGlkeXZlcnNlKQogIGxpYnJhcnkoc2NhbGVzKQogIGxpYnJhcnkoRXhQYW5EYVIpCn0pKQprbml0cjo6b3B0c19jaHVuayRzZXQoZmlnLmFsaWduID0gJ2NlbnRlcicpCmBgYAogCiAKIyMjIENyZWF0ZSBTYW1wbGUKIApUaGlzIHN0ZXAgcmVhZHMgdGhlIHJhdyBkYXRhIHByb3ZpZGVkIGJ5IGBFeFBhbkQoKWAgYW5kIGdlbmVyYXRlcyB0aGUgc2FtcGxlIGZvciB0aGUgYW5hbHlzaXMuCiAKYGBge3IgY3JlYXRlX3NhbXBsZX0KY3JlYXRlX3NhbXBsZSA8LSBmdW5jdGlvbihkZiwgZGZfZGVmKSB7CiAgIyBTZXQgaW5maW5pdGUgbnVtZXJpY2FsIHZhcmlhYmxlcyB0byBOQQogIGRmWywgZGZfZGVmJHZhcl9uYW1lW2RmX2RlZiR0eXBlID09ICJudW1lcmljIl1dIDwtCiAgICBsYXBwbHkoZGZbLCBkZl9kZWYkdmFyX25hbWVbZGZfZGVmJHR5cGUgPT0gIm51bWVyaWMiXV0sCiAgICAgIGZ1bmN0aW9uKHgpIGlmZWxzZShpcy5maW5pdGUoeCksIHgsIE5BKSkKIAogICMgRGVsZXRlIG51bWVyaWNhbCB2YXJpYWJsZXMgdGhhdCBvbmx5IGNvbnRhaW4gTkFzCiAgYWxsX25hX3ZhcnMgPC0gc2FwcGx5KGRmLCBmdW5jdGlvbiAoeCkgYWxsKGlzLm5hKHgpKSkKICBkZl9kZWYgPC0gZGZfZGVmWyFhbGxfbmFfdmFycyxdCiAgZGYgPC0gZGZbLCBkZl9kZWYkdmFyX25hbWVdCiAKICAjIERyb3Agb2JzZXJ2YXRpb25zIHRoYXQgYXJlIE5BIGluIHZhcmlhYmxlcyB0aGF0IGFyZSBub3QgYWxsb3dlZCB0bwogIGRmIDwtIGRmW2NvbXBsZXRlLmNhc2VzKGRmWywgZGZfZGVmJHZhcl9uYW1lW3doaWNoKGRmX2RlZiRjYW5fYmVfbmEgPT0gRkFMU0UpXV0pLCBdCiAKICBkZiA8LSBkcm9wbGV2ZWxzKGRmKQogIHJldHVybihsaXN0KGRmID0gZGYsIGRmX2RlZiA9IGRmX2RlZikpCn0KIApsb2FkKCJFeFBhbkRfbmJfZGF0YS5SZGF0YSIpCiAKc21wX2xpc3QgPC0gY3JlYXRlX3NhbXBsZShuYl9kZiwgbmJfZGZfZGVmKQpzbXAgPC0gc21wX2xpc3QkZGYKc21wX2RlZiA8LSBzbXBfbGlzdCRkZl9kZWYKYGBgCiAKIAojIyMgQmFyIENoYXJ0CiAKYGBge3IgYmFyX2NoYXJ0fQpkZiA8LSBzbXAKZGYkeWVhciA8LSBhcy5mYWN0b3IoZGYkeWVhcikKcCA8LSBnZ3Bsb3QoZGYsIGFlcyh4ID0geWVhcikpICsKZ2VvbV9iYXIoKSArIGxhYnMoeCA9ICJ5ZWFyIikKcCA8LSBwICsgc2NhbGVfeF9kaXNjcmV0ZShicmVha3MgPSBwcmV0dHkoYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoZGYkeWVhcikpLCBuID0gMTApKQpwCmBgYAogCiAKIyMjIE1pc3NpbmcgVmFsdWVzCiAKYGBge3IgbWlzc2luZ192YWx1ZXN9CmRmIDwtIHNtcApwcmVwYXJlX21pc3NpbmdfdmFsdWVzX2dyYXBoKGRmLCAieWVhciIpCmBgYAogCiAKIyMjIERlc2NyaXB0aXZlIFN0YXRpc3RpY3MKIApgYGB7ciBkZXNjcmlwdGl2ZV9zdGF0aXN0aWNzfQpkZiA8LSBzbXAKdCA8LSBwcmVwYXJlX2Rlc2NyaXB0aXZlX3RhYmxlKHNtcCkKdCRrYWJsZV9yZXQgICU+JQogIGthYmxlX3N0eWxpbmcoImNvbmRlbnNlZCIsIGZ1bGxfd2lkdGggPSBGLCBwb3NpdGlvbiA9ICJjZW50ZXIiKQpgYGAKIAogCiMjIyBIaXN0b2dyYW0KIApgYGB7ciBoaXN0b2dyYW19CnZhciA8LSBhcy5udW1lcmljKHNtcCRsb2dfbHBbc21wJHllYXIgPT0gIjE5OTAiXSkKaGlzdCh2YXIsIG1haW49IiIsIHhsYWIgPSAibG9nX2xwIiwgY29sPSJyZWQiLCByaWdodCA9IEZBTFNFLCBicmVha3M9IDI1KQpgYGAKIAogCiMjIyBFeHRyZW1lIE9ic2VydmF0aW9ucwogCmBgYHtyIGV4dHJlbWVfb2JzfQpkZiA8LSBzbXAKdmFycyA8LSBjKCJjb3VudHJ5IiwgInllYXIiLCAiR0RQcGMiLCAieWVhciIpCmRmIDwtIGRmW2RmJHllYXIgPT0gIjE5OTAiLCBdCmRmIDwtIGRmWywgdmFyc10KZGYgPC0gZHJvcGxldmVscyhkZltjb21wbGV0ZS5jYXNlcyhkZiksIF0pCmlmIChucm93KGRmKSA8PSAxMCkgewogIGNhdCgiTm90IGVub3VnaCBkYXRhIHRvIGdlbmVyYXRlIHRhYmxlIikKfSBlbHNlIHsKICB0YWIgPC0gcHJlcGFyZV9leHRfb2JzX3RhYmxlKGRmLCB2YXIgPSAiR0RQcGMiKQogIHRhYiRrYWJsZV9yZXQgJT4lCiAgICBrYWJsZV9zdHlsaW5nKCkKfQpgYGAKIAogCiMjIyBCeSBHcm91cCBCYXIgR3JhcGgKIApgYGB7ciBieV9ncm91cF9iYXJfZ3JhcGh9CmRmIDwtIHNtcApkZiA8LSBkZltkZiR5ZWFyID09ICIxOTkwIiwgXQpwcmVwYXJlX2J5X2dyb3VwX2Jhcl9ncmFwaChkZiwgInJlZ2lvbiIsICJscCIsIG1lYW4sIFRSVUUpJHBsb3QgKwogIHlsYWIoIm1lYW4gbHAiKQpgYGAKIAogCiMjIyBCeSBHcm91cCBWaW9saW4gR3JhcGgKIApgYGB7ciBieV9ncm91cF92aW9saW5fZ3JhcGh9CmRmIDwtIHNtcApwcmVwYXJlX2J5X2dyb3VwX3Zpb2xpbl9ncmFwaChkZiwgInJlZ2lvbiIsICJsb2dfbHAiLCBUUlVFKQpgYGAKIAogCiMjIyBUcmVuZCBHcmFwaAogCmBgYHtyIHRyZW5kX2dyYXBofQpkZiA8LSBzbXAKcHJlcGFyZV90cmVuZF9ncmFwaChkZiwgInllYXIiLCBjKCJscCIpKSRwbG90CmBgYAogCiAKIyMjIFF1YW50aWxlIFRyZW5kIEdyYXBoCiAKYGBge3IgcXVhbnRpbGVfdHJlbmRfZ3JhcGh9CmRmIDwtIHNtcApwcmVwYXJlX3F1YW50aWxlX3RyZW5kX2dyYXBoKGRmLCAieWVhciIsIGMoMC4wNSwgMC4yNSwgMC41LCAwLjc1LCAwLjk1KSwgImxwIikkcGxvdApgYGAKCiMjIyMgbHAgIApgYGB7cn0KbG9nX2xwX3JhdyA8LSBwcmVwYXJlX3F1YW50aWxlX3RyZW5kX2dyYXBoKHNtcCwgInllYXIiLCBjKDAuMDUsIDAuMjUsIDAuNSwgMC43NSwgMC45NSksICJsb2dfbHBfcmF3IikkcGxvdApgYGAKCgpgYGB7cn0KbG9nX2xwX3JhdyA8LSBsb2dfbHBfcmF3ICsKdGhlbWVfbWluaW1hbCgpICsKICBndWlkZXMoY29sb3IgPSBndWlkZV9sZWdlbmQocmV2ZXJzZSA9IFRSVUUpKSArCiAgc2NhbGVfY29sb3JfZGlzY3JldGUobmFtZSA9ICJRdWFudGlsZSIpICsKICBsYWJzKHggPSAiIiwKICAgICAgIHkgPSAiTG9nIG9mIExhYm9yIFByb2R1Y3Rpdml0eSIpCmdnc2F2ZSgicXVpbnRpbGVzX2hpTm9fbG9nX2xwX3Jhdy5wZGYiLCB3aWR0aCA9IDYsIGhlaWdodCA9IDQpCmBgYAoKYGBge3J9ClFyZV9sb2dfbHBfRGV2ZWxvcGluZyA8LSBwcmVwYXJlX3F1YW50aWxlX3RyZW5kX2dyYXBoKHNtcCwgInllYXIiLCBjKDAuMDUsIDAuMjUsIDAuNSwgMC43NSwgMC45NSksICJyZV9sb2dfbHAiKSRwbG90CmBgYAoKCmBgYHtyfQpRcmVfbG9nX2xwX0RldmVsb3BpbmcgKwp0aGVtZV9taW5pbWFsKCkgKwogIGd1aWRlcyhjb2xvciA9IGd1aWRlX2xlZ2VuZChyZXZlcnNlID0gVFJVRSkpICsKICBzY2FsZV9jb2xvcl9kaXNjcmV0ZShuYW1lID0gIlF1YW50aWxlIikgKwogIGxhYnMoeCA9ICIiLAogICAgICAgeSA9ICJSZWxhdGl2ZSAobG9nKSBsYWJvciBwcm9kdWN0aXZpdHkiKQpnZ3NhdmUoIlFyZV9sb2dfbHBfRGV2ZWxvcGluZy5wZGYiLCB3aWR0aCA9IDYsIGhlaWdodCA9IDQpCmBgYAoKCgoKIyMjIyBreSAgCgpgYGB7cn0KbG9nX2t5X3JhdyA8LSBwcmVwYXJlX3F1YW50aWxlX3RyZW5kX2dyYXBoKHNtcCwgInllYXIiLCBjKDAuMDUsIDAuMjUsIDAuNSwgMC43NSwgMC45NSksICJsb2dfa3lfcmF3IikkcGxvdApgYGAKCgpgYGB7cn0KbG9nX2t5X3JhdyA8LSBsb2dfa3lfcmF3ICsKdGhlbWVfbWluaW1hbCgpICsKICBndWlkZXMoY29sb3IgPSBndWlkZV9sZWdlbmQocmV2ZXJzZSA9IFRSVUUpKSArCiAgc2NhbGVfY29sb3JfZGlzY3JldGUobmFtZSA9ICJRdWFudGlsZSIpICsKICBsYWJzKHggPSAiIiwKICAgICAgIHkgPSAiTG9nIG9mIENhcGl0YWwtT3V0cHV0IFJhdGlvIikKZ2dzYXZlKCJxdWludGlsZXNfaGlOb19sb2dfa3lfcmF3LnBkZiIsIHdpZHRoID0gNiwgaGVpZ2h0ID0gNCkKYGBgICAgCgoKIyMjIyBoICAKCmBgYHtyfQpsb2dfaF9yYXcgPC0gcHJlcGFyZV9xdWFudGlsZV90cmVuZF9ncmFwaChzbXAsICJ5ZWFyIiwgYygwLjA1LCAwLjI1LCAwLjUsIDAuNzUsIDAuOTUpLCAibG9nX2hfcmF3IikkcGxvdApgYGAKCgpgYGB7cn0KbG9nX2hfcmF3IDwtIGxvZ19oX3JhdyArCnRoZW1lX21pbmltYWwoKSArCiAgZ3VpZGVzKGNvbG9yID0gZ3VpZGVfbGVnZW5kKHJldmVyc2UgPSBUUlVFKSkgKwogIHNjYWxlX2NvbG9yX2Rpc2NyZXRlKG5hbWUgPSAiUXVhbnRpbGUiKSArCiAgbGFicyh4ID0gIiIsCiAgICAgICB5ID0gIkxvZyBvZiBIdW1hbiBDYXBpdGFsIikKZ2dzYXZlKCJxdWludGlsZXNfaGlOb19sb2dfaF9yYXcucGRmIiwgd2lkdGggPSA2LCBoZWlnaHQgPSA0KQpgYGAgIAoKCiMjIyMgVEZQICAKCmBgYHtyfQpsb2dfdGZwX3JhdyA8LSBwcmVwYXJlX3F1YW50aWxlX3RyZW5kX2dyYXBoKHNtcCwgInllYXIiLCBjKDAuMDUsIDAuMjUsIDAuNSwgMC43NSwgMC45NSksICJsb2dfdGZwX3JhdyIpJHBsb3QKYGBgCgoKYGBge3J9CmxvZ190ZnBfcmF3IDwtIGxvZ190ZnBfcmF3ICsKdGhlbWVfbWluaW1hbCgpICsKICBndWlkZXMoY29sb3IgPSBndWlkZV9sZWdlbmQocmV2ZXJzZSA9IFRSVUUpKSArCiAgc2NhbGVfY29sb3JfZGlzY3JldGUobmFtZSA9ICJRdWFudGlsZSIpICsKICBsYWJzKHggPSAiIiwKICAgICAgIHkgPSAiTG9nIG9mIEFnZ3JlZ2F0ZSBFZmZpY2llbmN5IikKZ2dzYXZlKCJxdWludGlsZXNfaGlOb19sb2dfdGZwX3Jhdy5wZGYiLCB3aWR0aCA9IDYsIGhlaWdodCA9IDQpCmBgYCAgIAoKIAoKIAojIyMgQ29ycmVsYXRpb24gR3JhcGgKIApgYGB7ciBjb3JycGxvdH0KZGYgPC0gc21wCnJldCA8LSBwcmVwYXJlX2NvcnJlbGF0aW9uX2dyYXBoKGRmWywgYygzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LCAxNiwgMTcsIDE4LCAxOSwgMjAsIDIxLCAyMiwgMjMsIDI0LCAyNSwgMjksIDMwLCAzMSwgMzQsIDM1LCAzNiwgMzcsIDM4LCAzOSwgNDApXSkKYGBgCiAKIAojIyMgU2NhdHRlciBQbG90CiAKYGBge3Igc2NhdHRlcl9wbG90fQpkZiA8LSBzbXAKZGYgPC0gZGZbLCBjKCJjb3VudHJ5IiwgInllYXIiLCAibG9nX2xwIiwgImxvZ19HRFBwYyIsICJyZWdpb24iLCAicG9wIildCmRmIDwtIGRmW2NvbXBsZXRlLmNhc2VzKGRmKSwgXQpkZiRyZWdpb24gPC0gYXMuZmFjdG9yKGRmJHJlZ2lvbikKc2V0LnNlZWQoNDIpCmRmIDwtIHNhbXBsZV9uKGRmLCAxMDAwKQpwcmVwYXJlX3NjYXR0ZXJfcGxvdChkZiwgImxvZ19scCIsICJsb2dfR0RQcGMiLCBjb2xvciA9ICJyZWdpb24iLCBzaXplID0gInBvcCIsIGxvZXNzID0gMSkKYGBgCiAKIAojIyMgUmVncmVzc3Npb24gVGFibGUKIApgYGB7ciByZWdyZXNzaW9ufQpkZiA8LSBzbXAKZGYgPC0gZGZbLCBjKCJsb2dfbHAiLCAibG9nX2t5IiwgImxvZ19oIiwgImxvZ190ZnAiLCAiY291bnRyeSIsICJ5ZWFyIildCmRmIDwtIGRmW2NvbXBsZXRlLmNhc2VzKGRmKSwgXQpkZiA8LSBkcm9wbGV2ZWxzKGRmKQp0IDwtIHByZXBhcmVfcmVncmVzc2lvbl90YWJsZShkZiwgZHZzID0gImxvZ19scCIsIGlkdnMgPSBjKCJsb2dfa3kiLCAibG9nX2giLCAibG9nX3RmcCIpLCBmZWZmZWN0cyA9IGMoImNvdW50cnkiLCAieWVhciIpLCBjbHVzdGVycyA9IGMoImNvdW50cnkiLCAieWVhciIpLCBtb2RlbHMgPSAib2xzIikKSFRNTCh0JHRhYmxlKQpgYGAKIAogCiMjIyBOb3RlCiAKVGhpcyBOb3RlYm9vayBoYXMgYmVlbiBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCB1c2luZyB0aGUgW0V4UGFuRGFSXShodHRwczovL2pvYWNoaW0tZ2Fzc2VuLmdpdGh1Yi5pby9FeFBhbkRhUikgcGFja2FnZS4KIAo=