Data handling


# Start Inf data
# --------------

# read data
dtf <- read_dta("./Data/SouthAfrica/1_SA.dta", encoding = "latin1")

#labels of each variable
dtf_labels <- unlist(lapply(dtf, attr, which = "label"))

# remove labels
dtf <- as.data.frame(lapply(dtf, c))

# Notice that for a given frequency,
# the data begins at the start of the period
# it reports to (for example, monthly data's date is on the 1st of
# each month)

# fix date
datelookup <- seq.Date(from = as.Date("2000-07-01"),
                       to = as.Date("2019-10-01"),
                       by = "quarter")
dtf$date <- datelookup[dtf$date - abs(min(dtf$date)) + 1]

# order by date
dtf <- arrange(dtf, date)

# correct magnitude of certain variables
dtf <- dtf %>% mutate_at(vars(-date, -contains("skew")),
                         ~ ./100 )

#ADJUSTMENT OF LEAD DATA
#------------------------------------------
if (bAdjustPeriodTiming) {
  dtf <- dtf %>%
    mutate_at(vars(starts_with("Ecpi1")),
              ~ lag(.,4)) %>% #quarterly data
    mutate_at(vars(starts_with("Ecpi2")),
              ~ lag(.,8))
}
# no "-1" since every data point has end of period date

Timespan is 2012 to 2018

Figure(s) 13: South Africa’s unlucky run: 2010-16

Subfigure 13(a): Actual inflation, markets and survey first-order moments


#Actual vs inflation expectations

vars1 <- c("cpi",
           "CPI_Core",
           "Ecpi1_ana",
           "Ecpi1_bus",
           "Ecpi1_tradeun")
breakss <- c(vars1,
            "Upper bound",
            "Lower bound")
legs <-  c("Inflation (CPI Headline)",
           "Inflation (CPI Core)",
            "Analysts' forecast",
            "Businesses' forecast",
            "Trade unions' forecasts",
            "Upper bound",
            "Lower bound")
legv <- c('red', 'blue', 'orange3', 'purple', 'green4', 'black', 'black')
linev <- c('solid', 'dotted', 'dotdash', 'dashed', 'longdash', 'solid', 'solid')


# inflation target
target <- 0.045
target_ub <- 0.06
target_lb <- 0.03

# thickness of line
vline_w <- 0.6 #mm

# ticks
labs <- c(target_lb, target, target_ub)

# plot
plot <- create_plot(dtf_long,
                    vars = vars1,
                    scales = 0) +
  theme(legend.position = c(0.2,0.36),
        legend.text = element_text(size = tfont(legend_text_size - 2))) +
  geom_hline(aes(yintercept = target_ub, colour = "Upper bound", linetype = "Upper bound"),
             size = tfont(vline_w)) +
  geom_hline(aes(yintercept = target_lb, colour = "Lower bound", linetype = "Lower bound"),
             size = tfont(vline_w)) +
  scale_linetype_manual(breaks = breakss, values = linev, labels = legs) +
  scale_colour_manual(breaks = breakss, values = legv, labels = legs) +
  scale_y_continuous(limits = c(0.025, 0.07), breaks = labs,
                     labels = scales::percent(labs, accuracy = 0.1)) +
  guides(col = guide_legend(keywidth = 5, keyheight = 1))

Scale for ‘y’ is already present. Adding another scale for ‘y’, which will replace the existing scale.

  
print(plot)

if (bSavePlots) my_ggsave(paste0(path_figure_out, "figure_13_a.pdf"), plot)

Subfigures 13(b): Cross-sectional survey distributions


# density of estimates

# read data from paper
df_temp <- read_excel("Data/SouthAfrica/siklos_et_al_data.xlsx", range = "A2:N101") 

New names: * Inflation -> Inflation…1 * Density -> Density…2 * `` -> …3 * Inflation -> Inflation…4 * Density -> Density…5 * …

x <- unlist(lapply(df_temp, function(x) !all(is.na(x))))
df_temp <- df_temp[, x] # drop all NA columns

# keep only 2014, 2015, 2016
df_temp <- df_temp [, -c(1:4)]
N <- nrow(df_temp)
df_temp <- as.data.frame(rbind(as.matrix(df_temp[, 1:2]),
                               as.matrix(df_temp[3:4]),
                               as.matrix(df_temp[5:6])
                              )
                        )

colnames(df_temp) <- c("inflation", "density")

years <- c(2014, 2015, 2016)

df_temp$year <- factor(c(rep(2014, N), rep(2015, N), rep(2016, N)),
                       levels = years)

df_temp$inflation <- df_temp$inflation/100


legv <- c('red','blue','green4','orange3',"purple2")
linev <- c('solid','dotdash','dashed')
#limits of x axis
x_lb <- -0.01
x_ub <- 0.15
labs <- seq(x_lb, x_ub, by = 0.01)

plot <- ggplot(df_temp, aes(x = inflation, y = density
                           , color = year, linetype = year)) +
        geom_line( size = line_sizee) +
        scale_linetype_manual(breaks = years, values= linev, labels = years) +
        scale_colour_manual(breaks = years, values = legv, labels = years) + 
        scale_x_continuous(breaks = labs,
                           labels = scales::percent(labs, accuracy = 1),
                           limits = c(x_lb,x_ub)) +
        theme(legend.position = c(0.2,0.8))

print(plot)

if (bSavePlots) my_ggsave(paste0(path_figure_out, "figure_13_b.pdf"), plot)
LS0tDQp0aXRsZTogIkJyb29raW5ncyBQYXBlciAtIFNvdXRoIEFmcmljYSAtIE5vdGVib29rIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCg0KDQpgYGB7ciBzdGFydF9SLCBpbmNsdWRlID0gRkFMU0V9DQoNCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQojIEluaXRpYXRpb24NCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCnJtKGxpc3QgPSBscygpKQ0KDQojIGNsZWFuIGNvbnNvbGUNCmNhdCgiXDAxNCIpDQoNCiMjIyMgUExFQVNFIENIT09TRSAjIyMjIw0KDQojIHByaW50IGFuZCBzYXZlIHBsb3RzPw0KYlNhdmVQbG90cyA8LSAxICAgIyAwOiBubw0KICAgICAgICAgICAgICAgICAgIyAxOiB5ZXMNCg0KIyBFeHBlY3RhdGlvbnMgYXQgVCA9IFQtaCBvciBUK2g/DQojIHdpbGwgc2hpZnQgYnkgMTIgcGVyaW9kcyAobW9udGhseSksIGJlIGNhcmVmdWwgZm9yIGUuZy4gcXVhcnRlcmx5IGRhdGENCmJBZGp1c3RQZXJpb2RUaW1pbmcgPC0gMSAgICMgMDogVCtoDQogICAgICAgICAgICAgICAgICAgICAgICAgICAjIDE6IFQtaA0KDQojIyMjICBDSE9JQ0UgRU5EICAgIyMjIyMNCg0KIyBCRVdBUkUgT05MWSBWQVJJQUJMRVMgVVNFRCBBUkUgQURKVVNURUQNCiMgSUYgWU9VIFdBTlQgVE8gVVNFIE9USEVSIFZBUklBQkxFUw0KIyBQTEVBU0UgQUREIFRIRU0gQkVMT1cgV0hFTiBUSEUgQURKVVNUTUVOVA0KIyBJUyBNQURFDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQoNCiMgcGFja2FnZXMNCiMgbGlzdCBvZiBsaWJyYXJpZXMNCnBhY2thZ2VzIDwtIGMoInRpZHl2ZXJzZSIgICAjIGRhdGEgYW5hbHlzaXMNCiAgICAgICAgICAgICAgLCJrbml0ciIgICAgICAjIG1hcmtkb3duDQogICAgICAgICAgICAgICwiaGF2ZW4iICAgICAgIyByZWFkIC5kdGEgZmlsZXMNCiAgICAgICAgICAgICAgLCJyZWFkeGwiICAgICAjIHJlYWQgZXhjZWwgZmlsZXMNCiAgICAgICAgICAgICAgLCJsdWJyaWRhdGUiICAjIGRhdGVzDQogICAgICAgICAgICAgICwidGlueXRleCIgICAgIyBmb3IgbWFya2Rvd24NCiAgICAgICAgICAgICAgLCJtYWdyaXR0ciIgICAjIHBpcGUgb3BlcmF0b3INCikNCg0KIyBpbnN0YWxsIHRoZW0gaWYgbmVlZGVkDQpuZXdfcGFja2FnZXMgPC0NCiAgcGFja2FnZXNbIShwYWNrYWdlcyAlaW4lIGluc3RhbGxlZC5wYWNrYWdlcygpWywgIlBhY2thZ2UiXSldIA0KDQogaWYgKGxlbmd0aChuZXdfcGFja2FnZXMpID4gMCl7ICNpbnN0YWxscyB0aGVtDQogICBpbnN0YWxsLnBhY2thZ2VzKG5ld19wYWNrYWdlcywgZGVwZW5kZW5jaWVzID0gVFJVRSkNCn0NCg0KIyBsb2FkIGxpYnJhcmllcw0KbGFwcGx5KHBhY2thZ2VzLCByZXF1aXJlLCBjaGFyYWN0ZXIub25seSA9IFRSVUUpDQoNCmBgYA0KDQoNCmBgYHtyIHBsb3RfZGVmLCBpbmNsdWRlID0gRkFMU0V9DQoNCiMgZ2dwbG90MiBvcHRpb25zDQoNCiMgc2l6ZSBvZiBmaWd1cmVzIGZvciBzYXZpbmcgYW5kIGRpc3BsYXlpbmcgKGRpc3Agd2lsbCBiZSBhZGp1c3RlZCkNCiMgZmlndXJlIHNpemUgaW4gY20gKGZvciBpbmNoZXMgZGl2aWRlIGJ5IDAuMzkzNzAwNzg3KQ0KZmlnX2ggPC0gMi41ICogOC40Mzc1KiAwLjM5MzcwMDc4NyAjIHdpZHRoDQpmaWdfdyA8LSAyLjUgKiAxNSAqIDAuMzkzNzAwNzg3ICAgICMgaGVpZ2h0DQpmaWdfZGlzcF9hZGogPC0gMSAgICAgICAgICAgICAgICAgICMgYWRqdXN0bWVudCBmb3IgZmlndXJlIGRpc3BsYXkNCg0KDQojIENvbnZlcnQgZnJvbSBtbSB0byBpbnRlcm5hbCB1bml0cyB1c2VkIGluIGdyaWQgZ2dwbG90DQp0Zm9udCA8LSBmdW5jdGlvbih4KSByZXR1cm4oLnB0KngpICAgICAgICAjIHRoaXMgd2F5IG5vIHJlcyBwcm9ibGVtcw0KdGx3ZCAgPC0gZnVuY3Rpb24oeCkgcmV0dXJuKC5zdHJva2UqeCkgDQoNCiMgZ2dwbG90MiBvcHRpb25zDQojIHBsb3QgZGVmaW5pdGlvbnMgDQoNCmxlZ2VuZF90ZXh0X3NpemUgPC0gNy41DQpheGlzX3RleHRfc2l6ZSAgIDwtIDcNCg0KbGVnZW5kX2tleV93aWR0aCA8LSAyMCAjIG1tDQoNCiMgc2l6ZSBvZiBsaW5lIGZvciBwbG90cw0KbGluZV9zaXplZSA8LSB0bHdkKDEpDQoNCnRoZW1lX3NldCgNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgICAgICAgICAgIHRoZW1lKHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGZhY2UgPSAicGxhaW4iLCBzaXplID0gdGZvbnQoNikpLA0KICAgICAgICAgICAgICAgICAgcGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChmYWNlID0gIml0YWxpYyIpLA0KICAgICAgICAgICAgICAgICAgcGFuZWwuZ3JpZC5taW5vci54ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICAgICAgICAgICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgICAgICAgICAgIGF4aXMubGluZSA9IGVsZW1lbnRfbGluZSgpLA0KICAgICAgICAgICAgICAgICAgbGVnZW5kLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoY29sb3VyID0gImJsYWNrIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGwgPSBOQSwgc2l6ZSA9IDAuNSksDQogICAgICAgICAgICAgICAgICBsZWdlbmQuYm94LmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgICAgICAgICAgICBsZWdlbmQucG9zaXRpb24gPSBjKDAuMjUsMC44KSwNCiAgICAgICAgICAgICAgICAgIGxlZ2VuZC5rZXkgPSBlbGVtZW50X3JlY3QoY29sb3VyID0gTkEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGwgPSBOQSksDQogICAgICAgICAgICAgICAgICBsZWdlbmQua2V5LndpZHRoID0gdW5pdChsZWdlbmRfa2V5X3dpZHRoLCAibW0iKSwgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSB0Zm9udChsZWdlbmRfdGV4dF9zaXplKSksDQogICAgICAgICAgICAgICAgICBheGlzLnRleHQgID0gZWxlbWVudF90ZXh0KHNpemUgPSB0Zm9udChheGlzX3RleHRfc2l6ZSkpLA0KICAgICAgICAgICAgICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKQ0KICAgICAgICAgICAgICAgICApDQopDQoNCg0KIyBmdW5jdGlvbnMgdG8gY3JlYXRlIGNvbG91ci9saW5lIHNjaGVtZQ0KDQpjcmVhdGVfbGVndiA8LSBmdW5jdGlvbih4KSB7DQoNCiAgIyBjb2xvdXJzIHRvIGJlIHVzZWQgaW4gcGxvdHMNCiAgeSA8LSBjKCdyZWQnLCAnYmx1ZScsICdncmVlbjQnLCAnb3JhbmdlMycsICJwdXJwbGUyIikNCiAgbiA8LSBsZW5ndGgoeCkNCiAgeSA8LSB5WzE6bl0NCiAgbmFtZXMoeSkgPC0geCANCiAgcmV0dXJuKHkpDQoNCn0NCg0KY3JlYXRlX2xpbmV2IDwtIGZ1bmN0aW9uKHgpIHsNCg0KICAjIGxpbmV0eXBlcyB0byBiZSB1c2VkIGluIHBsb3RzDQogIHkgPC0gYygnc29saWQnLCAnbG9uZ2Rhc2gnLCAnZG90dGVkJywgJ2RvdGRhc2gnLCAiZG90ZGFzaCIpDQogIG4gPC0gbGVuZ3RoKHgpDQogIHkgPC0geVsxOm5dDQogIG5hbWVzKHkpIDwtIHggDQogIHJldHVybih5KQ0KDQp9DQoNCmNyZWF0ZV9wbG90IDwtIGZ1bmN0aW9uKGRmLA0KICAgICAgICAgICAgICAgICAgICAgICAgdmFycywNCiAgICAgICAgICAgICAgICAgICAgICAgIGxlZ3MgPSBOVUxMLA0KICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZV9sYiA9IGFzLkRhdGUoIjIwMTItMDEtMDEiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGVfdWIgPSBhcy5EYXRlKCIyMDE4LTEyLTMxIiksDQogICAgICAgICAgICAgICAgICAgICAgICBwZXJjID0gMSwNCiAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlcyA9IDEsDQogICAgICAgICAgICAgICAgICAgICAgICBsaW5lX3NpemUgPSBsaW5lX3NpemVlKSB7DQogIA0KICAjIGRhdGUgYm91bmRzDQogIGRhdGVfbGIgPC0gYXMuRGF0ZShkYXRlX2xiKQ0KICBkYXRlX3ViIDwtIGFzLkRhdGUoZGF0ZV91YikNCiAgDQogICMgY29sb3Vycy9saW5ldHlwZXMNCiAgbGVndiA8LSBjcmVhdGVfbGVndih2YXJzKQ0KICBsaW5ldiA8LSBjcmVhdGVfbGluZXYodmFycykNCiAgDQogIGRmIDwtIGRmICU+JQ0KICAgICAgICBmaWx0ZXIoZGF0ZSA+PSBkYXRlX2xiICYgZGF0ZSA8PSBkYXRlX3ViICYNCiAgICAgICAgICAgICAgIHZhcmlhYmxlICVpbiUgdmFycyAmICFpcy5uYSh2YWx1ZSkpICU+JQ0KICAgICAgICBtdXRhdGUodmFyaWFibGUgPSBmYWN0b3IodmFyaWFibGUsIGxldmVscyA9IHZhcnMpKQ0KICANCiAgcGxvdCA8LSBnZ3Bsb3QoZGYsIGFlcyh4ID0gZGF0ZSwgeSA9IHZhbHVlKSkgKw0KICAgIGdlb21fbGluZShhZXMoY29sb3VyID0gdmFyaWFibGUsIGxpbmV0eXBlID0gdmFyaWFibGUpLA0KICAgICAgICAgICAgICBzaXplID0gbGluZV9zaXplKSArDQogICAgc2NhbGVfeF9kYXRlKGRhdGVfYnJlYWtzID0gIjEgeWVhciIsIGRhdGVfbGFiZWxzID0gIiVZIiwNCiAgICAgICAgICAgICAgICAgbGltaXRzID0gYyhkYXRlX2xiLCBkYXRlX3ViKSkgDQogIA0KICBpZiAoc2NhbGVzKSBwbG90IDwtIHBsb3QgKyANCiAgICAgICAgc2NhbGVfbGluZXR5cGVfbWFudWFsKGJyZWFrcyA9IHZhcnMsIHZhbHVlcz0gbGluZXYsIGxhYmVscyA9IGxlZ3MpICsNCiAgICAgICAgc2NhbGVfY29sb3VyX21hbnVhbChicmVha3MgPSB2YXJzLCB2YWx1ZXMgPSBsZWd2LCBsYWJlbHMgPSBsZWdzKSANCiAgDQogIGlmIChwZXJjKSBwbG90IDwtIHBsb3QgKyANCiAgICAgICAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6cGVyY2VudF9mb3JtYXQoYWNjdXJhY3kgPSAxKSkNCiAgICANCiAgcmV0dXJuKHBsb3QpDQogIA0KfQ0KDQpteV9nZ3NhdmUgPC0gZnVuY3Rpb24oLmZpbGVuYW1lLCAucGxvdCwNCiAgICAgICAgICAgICAgICAgICAgICAuZGV2aWNlID0gInBkZiIsIC53aWR0aCA9IGZpZ193LA0KICAgICAgICAgICAgICAgICAgICAgIC5oZWlnaHQgPSBmaWdfaCwgLnVuaXRzID0gImluIiwgLmRwaSA9IDMwMCwgLi4uKSB7DQogIA0KICBnZ3NhdmUoZmlsZW5hbWUgPSAuZmlsZW5hbWUsIHBsb3QgPSAucGxvdCwNCiAgICAgICAgIGRldmljZSA9IC5kZXZpY2UsDQogICAgICAgICB3aWR0aCA9IC53aWR0aCwgaGVpZ2h0ID0gLmhlaWdodCwNCiAgICAgICAgIHVuaXRzID0gLnVuaXRzLCBkcGkgPSAuZHBpLCAuLi4pDQogIA0KfQ0KDQpgYGANCg0KYGBge3Igc2V0dXAsIGluY2x1ZGUgPSBGQUxTRX0NCg0KIyBkaXJlY3RvcnkNCmRpcmVjdG9yeSA8LSBnZXR3ZCgpDQpkaXJlY3RvcnkgPC0gZ3N1YigiL0NvZGUiLCAiIiwgZGlyZWN0b3J5KQ0Kb3B0c19rbml0JHNldChyb290LmRpciA9IGRpcmVjdG9yeSkNCg0KcGF0aF9maWd1cmVfb3V0IDwtICIuL0ZpZ3VyZXMvIg0KDQojIGRlZmF1bHQgY2h1bmsgb3B0aW9ucw0Kb3B0c19jaHVuayRzZXQobWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIHJlc3VsdHMgPSAnYXNpcycsIGVjaG8gPSBUUlVFLA0KICAgICAgICAgICAgICAgZmlnLndpZHRoID0gZmlnX2Rpc3BfYWRqICogZmlnX3csIGZpZy5oZWlnaHQgPSBmaWdfZGlzcF9hZGogKiBmaWdfaCwNCiAgICAgICAgICAgICAgIGZpZy5yZXRpbmEgPSAxKSAjIGZpZ3VyZSBvcHRpb25zDQoNCmBgYA0KDQojIyBEYXRhIGhhbmRsaW5nDQoNCmBgYHtyIGxvYWRfZGF0YX0NCg0KIyBTdGFydCBJbmYgZGF0YQ0KIyAtLS0tLS0tLS0tLS0tLQ0KDQojIHJlYWQgZGF0YQ0KZHRmIDwtIHJlYWRfZHRhKCIuL0RhdGEvU291dGhBZnJpY2EvMV9TQS5kdGEiLCBlbmNvZGluZyA9ICJsYXRpbjEiKQ0KDQojbGFiZWxzIG9mIGVhY2ggdmFyaWFibGUNCmR0Zl9sYWJlbHMgPC0gdW5saXN0KGxhcHBseShkdGYsIGF0dHIsIHdoaWNoID0gImxhYmVsIikpDQoNCiMgcmVtb3ZlIGxhYmVscw0KZHRmIDwtIGFzLmRhdGEuZnJhbWUobGFwcGx5KGR0ZiwgYykpDQoNCiMgTm90aWNlIHRoYXQgZm9yIGEgZ2l2ZW4gZnJlcXVlbmN5LA0KIyB0aGUgZGF0YSBiZWdpbnMgYXQgdGhlIHN0YXJ0IG9mIHRoZSBwZXJpb2QNCiMgaXQgcmVwb3J0cyB0byAoZm9yIGV4YW1wbGUsIG1vbnRobHkgZGF0YSdzIGRhdGUgaXMgb24gdGhlIDFzdCBvZg0KIyBlYWNoIG1vbnRoKQ0KDQojIGZpeCBkYXRlDQpkYXRlbG9va3VwIDwtIHNlcS5EYXRlKGZyb20gPSBhcy5EYXRlKCIyMDAwLTA3LTAxIiksDQogICAgICAgICAgICAgICAgICAgICAgIHRvID0gYXMuRGF0ZSgiMjAxOS0xMC0wMSIpLA0KICAgICAgICAgICAgICAgICAgICAgICBieSA9ICJxdWFydGVyIikNCmR0ZiRkYXRlIDwtIGRhdGVsb29rdXBbZHRmJGRhdGUgLSBhYnMobWluKGR0ZiRkYXRlKSkgKyAxXQ0KDQojIG9yZGVyIGJ5IGRhdGUNCmR0ZiA8LSBhcnJhbmdlKGR0ZiwgZGF0ZSkNCg0KIyBjb3JyZWN0IG1hZ25pdHVkZSBvZiBjZXJ0YWluIHZhcmlhYmxlcw0KZHRmIDwtIGR0ZiAlPiUgbXV0YXRlX2F0KHZhcnMoLWRhdGUsIC1jb250YWlucygic2tldyIpKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICB+IC4vMTAwICkNCg0KIyBBREpVU1RNRU5UIE9GIExFQUQgREFUQQ0KIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KaWYgKGJBZGp1c3RQZXJpb2RUaW1pbmcpIHsNCiAgZHRmIDwtIGR0ZiAlPiUNCiAgICBtdXRhdGVfYXQodmFycyhzdGFydHNfd2l0aCgiRWNwaTEiKSksDQogICAgICAgICAgICAgIH4gbGFnKC4sNCkpICU+JSAjcXVhcnRlcmx5IGRhdGENCiAgICBtdXRhdGVfYXQodmFycyhzdGFydHNfd2l0aCgiRWNwaTIiKSksDQogICAgICAgICAgICAgIH4gbGFnKC4sOCkpDQp9DQojIG5vICItMSIgc2luY2UgZXZlcnkgZGF0YSBwb2ludCBoYXMgZW5kIG9mIHBlcmlvZCBkYXRlDQoNCiMgYWRkIGNvcmUgQ1BJDQpkdGZfY29yZWNwaSA8LSByZWFkX3hsc3goIi4vRGF0YS9Tb3V0aEFmcmljYS8yX0NQSV9tb250aGx5Lnhsc3giKQ0KDQpjb252ZXJ0XzE2X3RvXzEyX2hlYWRsaW5lIDwtIGR0Zl9jb3JlY3BpJENQSV9IZWFkbGluZV9iYXNlXzIwMTJbZHRmX2NvcmVjcGkkZGF0ZSA9PSBhcy5QT1NJWGN0KCIyMDE2LTEyLTAxIildIC8gMTAwDQpjb252ZXJ0XzE2X3RvXzEyX2NvcmUgPC0gZHRmX2NvcmVjcGkkQ1BJX0NvcmVfYmFzZV8yMDEyW2R0Zl9jb3JlY3BpJGRhdGUgPT0gYXMuUE9TSVhjdCgiMjAxNi0xMi0wMSIpXSAvIDEwMA0KY29udmVydF8xMl90b18xNl9oZWFkbGluZSA8LSAxMDAgLyBkdGZfY29yZWNwaSRDUElfSGVhZGxpbmVfYmFzZV8yMDEyW2R0Zl9jb3JlY3BpJGRhdGUgPT0gYXMuUE9TSVhjdCgiMjAxNi0xMi0wMSIpXQ0KY29udmVydF8xMl90b18xNl9jb3JlIDwtIDEwMCAvIGR0Zl9jb3JlY3BpJENQSV9Db3JlX2Jhc2VfMjAxMltkdGZfY29yZWNwaSRkYXRlID09IGFzLlBPU0lYY3QoIjIwMTYtMTItMDEiKV0NCg0KaW5mbGF0aW9uX21ha2VyIDwtIGZ1bmN0aW9uKENQSSwgbikgew0KICAoQ1BJIC0gbGFnKENQSSwgbiA9IG4pKSAvIGxhZyhDUEksIG4gPSBuKQ0KfQ0KDQpkdGZfY29yZWNwaSAlPD4lDQogIG11dGF0ZShtb250aCA9IG1vbnRoKGRhdGUpLA0KICAgICAgICAgcXVhcnRhbCA9IHF1YXJ0ZXIoZGF0ZSksDQogICAgICAgICB5ZWFyID0geWVhcihkYXRlKSkgJT4lDQogIGFycmFuZ2UoeWVhciwgcXVhcnRhbCwgbW9udGgpICU+JQ0KICBtdXRhdGUoQ1BJX0hlYWRsaW5lX2Jhc2VfMjAxMiA9IGlmZWxzZShpcy5uYShDUElfSGVhZGxpbmVfYmFzZV8yMDEyKSwgY29udmVydF8xNl90b18xMl9oZWFkbGluZSAqIENQSV9IZWFkbGluZSwgQ1BJX0hlYWRsaW5lX2Jhc2VfMjAxMiksDQogICAgICAgICBDUElfQ29yZV9iYXNlXzIwMTIgPSBpZmVsc2UoaXMubmEoQ1BJX0NvcmVfYmFzZV8yMDEyKSwgY29udmVydF8xNl90b18xMl9jb3JlICogQ1BJX0NvcmUsIENQSV9Db3JlX2Jhc2VfMjAxMikpICU+JQ0KICBtdXRhdGUoQ1BJX0hlYWRsaW5lID0gaWZlbHNlKGlzLm5hKENQSV9IZWFkbGluZSksIGNvbnZlcnRfMTJfdG9fMTZfaGVhZGxpbmUgKiBDUElfSGVhZGxpbmVfYmFzZV8yMDEyLCBDUElfSGVhZGxpbmUpLA0KICAgICAgICAgQ1BJX0NvcmUgPSBpZmVsc2UoaXMubmEoQ1BJX0NvcmUpLCBjb252ZXJ0XzEyX3RvXzE2X2NvcmUgKiBDUElfQ29yZV9iYXNlXzIwMTIsIENQSV9Db3JlKSkgJT4lDQogIHNlbGVjdCgtYmFzZSkgJT4lDQogIG11dGF0ZShhY3Jvc3Moc3RhcnRzX3dpdGgoIkNQSSIpLCBpbmZsYXRpb25fbWFrZXIsIG4gPSAxMikpICU+JQ0KICBncm91cF9ieSh5ZWFyLCBxdWFydGFsKSAlPiUNCiAgc3VtbWFyaXNlKGRhdGUgPSBmaXJzdChkYXRlKSwNCiAgICAgICAgICAgIGFjcm9zcyhzdGFydHNfd2l0aCgiQ1BJXyIpLCBtZWFuKSwNCiAgICAgICAgICAgIC5ncm91cHMgPSAiZHJvcCIpDQoNCmR0ZiAlPD4lDQogIGxlZnRfam9pbihkdGZfY29yZWNwaSwgYnkgPSAiZGF0ZSIpICU+JQ0KICBtdXRhdGUoZGF0ZSA9IGFzLkRhdGUoZGF0ZSkpDQoNCg0KIyBwaXZvdCBkYXRhIHRvIGxvbmcgZm9ybWF0IGZvciBwbG90dGluZw0KZHRmX2xvbmcgPC0gcGl2b3RfbG9uZ2VyKGR0ZiwgIWRhdGUsIG5hbWVzX3RvID0gInZhcmlhYmxlIiwgdmFsdWVzX3RvID0gInZhbHVlIiwgdmFsdWVzX3RyYW5zZm9ybSA9IGFzLm51bWVyaWMpDQoNCmBgYA0KDQojIyBUaW1lc3BhbiBpcyAyMDEyIHRvIDIwMTgNCg0KIyMgRmlndXJlKHMpIDEzOiBTb3V0aCBBZnJpY2HigJlzIHVubHVja3kgcnVuOiAyMDEwLTE2DQojIyBTdWJmaWd1cmUgMTMoYSk6IEFjdHVhbCBpbmZsYXRpb24sIG1hcmtldHMgYW5kIHN1cnZleSBmaXJzdC1vcmRlciBtb21lbnRzDQoNCmBgYHtyIGZpZ18xM19hfQ0KDQojIEFjdHVhbCB2cyBpbmZsYXRpb24gZXhwZWN0YXRpb25zDQoNCnZhcnMxIDwtIGMoImNwaSIsDQogICAgICAgICAgICJDUElfQ29yZSIsDQogICAgICAgICAgICJFY3BpMV9hbmEiLA0KICAgICAgICAgICAiRWNwaTFfYnVzIiwNCiAgICAgICAgICAgIkVjcGkxX3RyYWRldW4iKQ0KYnJlYWtzcyA8LSBjKHZhcnMxLA0KICAgICAgICAgICAgIlVwcGVyIGJvdW5kIiwNCiAgICAgICAgICAgICJMb3dlciBib3VuZCIpDQpsZWdzIDwtICBjKCJJbmZsYXRpb24gKENQSSBIZWFkbGluZSkiLA0KICAgICAgICAgICAiSW5mbGF0aW9uIChDUEkgQ29yZSkiLA0KICAgICAgICAgICAgIkFuYWx5c3RzJyBmb3JlY2FzdCIsDQogICAgICAgICAgICAiQnVzaW5lc3NlcycgZm9yZWNhc3QiLA0KICAgICAgICAgICAgIlRyYWRlIHVuaW9ucycgZm9yZWNhc3RzIiwNCiAgICAgICAgICAgICJVcHBlciBib3VuZCIsDQogICAgICAgICAgICAiTG93ZXIgYm91bmQiKQ0KbGVndiA8LSBjKCdyZWQnLCAnYmx1ZScsICdvcmFuZ2UzJywgJ3B1cnBsZScsICdncmVlbjQnLCAnYmxhY2snLCAnYmxhY2snKQ0KbGluZXYgPC0gYygnc29saWQnLCAnZG90dGVkJywgJ2RvdGRhc2gnLCAnZGFzaGVkJywgJ2xvbmdkYXNoJywgJ3NvbGlkJywgJ3NvbGlkJykNCg0KDQojIGluZmxhdGlvbiB0YXJnZXQNCnRhcmdldCA8LSAwLjA0NQ0KdGFyZ2V0X3ViIDwtIDAuMDYNCnRhcmdldF9sYiA8LSAwLjAzDQoNCiMgdGhpY2tuZXNzIG9mIGxpbmUNCnZsaW5lX3cgPC0gMC42ICNtbQ0KDQojIHRpY2tzDQpsYWJzIDwtIGModGFyZ2V0X2xiLCB0YXJnZXQsIHRhcmdldF91YikNCg0KIyBwbG90DQpwbG90IDwtIGNyZWF0ZV9wbG90KGR0Zl9sb25nLA0KICAgICAgICAgICAgICAgICAgICB2YXJzID0gdmFyczEsDQogICAgICAgICAgICAgICAgICAgIHNjYWxlcyA9IDApICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gYygwLjIsMC4zNiksDQogICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSB0Zm9udChsZWdlbmRfdGV4dF9zaXplIC0gMikpKSArDQogIGdlb21faGxpbmUoYWVzKHlpbnRlcmNlcHQgPSB0YXJnZXRfdWIsIGNvbG91ciA9ICJVcHBlciBib3VuZCIsIGxpbmV0eXBlID0gIlVwcGVyIGJvdW5kIiksDQogICAgICAgICAgICAgc2l6ZSA9IHRmb250KHZsaW5lX3cpKSArDQogIGdlb21faGxpbmUoYWVzKHlpbnRlcmNlcHQgPSB0YXJnZXRfbGIsIGNvbG91ciA9ICJMb3dlciBib3VuZCIsIGxpbmV0eXBlID0gIkxvd2VyIGJvdW5kIiksDQogICAgICAgICAgICAgc2l6ZSA9IHRmb250KHZsaW5lX3cpKSArDQogIHNjYWxlX2xpbmV0eXBlX21hbnVhbChicmVha3MgPSBicmVha3NzLCB2YWx1ZXMgPSBsaW5ldiwgbGFiZWxzID0gbGVncykgKw0KICBzY2FsZV9jb2xvdXJfbWFudWFsKGJyZWFrcyA9IGJyZWFrc3MsIHZhbHVlcyA9IGxlZ3YsIGxhYmVscyA9IGxlZ3MpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoMC4wMjUsIDAuMDcpLCBicmVha3MgPSBsYWJzLA0KICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gc2NhbGVzOjpwZXJjZW50KGxhYnMsIGFjY3VyYWN5ID0gMC4xKSkgKw0KICBndWlkZXMoY29sID0gZ3VpZGVfbGVnZW5kKGtleXdpZHRoID0gNSwga2V5aGVpZ2h0ID0gMSkpDQogIA0KcHJpbnQocGxvdCkNCmlmIChiU2F2ZVBsb3RzKSBteV9nZ3NhdmUocGFzdGUwKHBhdGhfZmlndXJlX291dCwgImZpZ3VyZV8xM19hLnBkZiIpLCBwbG90KQ0KDQpgYGANCg0KIyMgU3ViZmlndXJlcyAxMyhiKTogQ3Jvc3Mtc2VjdGlvbmFsIHN1cnZleSBkaXN0cmlidXRpb25zDQoNCmBgYHtyIGZpZ18xM19ifQ0KDQojIGRlbnNpdHkgb2YgZXN0aW1hdGVzDQoNCiMgcmVhZCBkYXRhIGZyb20gcGFwZXINCmRmX3RlbXAgPC0gcmVhZF9leGNlbCgiRGF0YS9Tb3V0aEFmcmljYS9zaWtsb3NfZXRfYWxfZGF0YS54bHN4IiwgcmFuZ2UgPSAiQTI6TjEwMSIpIA0KDQp4IDwtIHVubGlzdChsYXBwbHkoZGZfdGVtcCwgZnVuY3Rpb24oeCkgIWFsbChpcy5uYSh4KSkpKQ0KZGZfdGVtcCA8LSBkZl90ZW1wWywgeF0gIyBkcm9wIGFsbCBOQSBjb2x1bW5zDQoNCiMga2VlcCBvbmx5IDIwMTQsIDIwMTUsIDIwMTYNCmRmX3RlbXAgPC0gZGZfdGVtcCBbLCAtYygxOjQpXQ0KTiA8LSBucm93KGRmX3RlbXApDQpkZl90ZW1wIDwtIGFzLmRhdGEuZnJhbWUocmJpbmQoYXMubWF0cml4KGRmX3RlbXBbLCAxOjJdKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcy5tYXRyaXgoZGZfdGVtcFszOjRdKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcy5tYXRyaXgoZGZfdGVtcFs1OjZdKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0KICAgICAgICAgICAgICAgICAgICAgICAgKQ0KDQpjb2xuYW1lcyhkZl90ZW1wKSA8LSBjKCJpbmZsYXRpb24iLCAiZGVuc2l0eSIpDQoNCnllYXJzIDwtIGMoMjAxNCwgMjAxNSwgMjAxNikNCg0KZGZfdGVtcCR5ZWFyIDwtIGZhY3RvcihjKHJlcCgyMDE0LCBOKSwgcmVwKDIwMTUsIE4pLCByZXAoMjAxNiwgTikpLA0KICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSB5ZWFycykNCg0KZGZfdGVtcCRpbmZsYXRpb24gPC0gZGZfdGVtcCRpbmZsYXRpb24vMTAwDQoNCg0KbGVndiA8LSBjKCdyZWQnLCdibHVlJywnZ3JlZW40Jywnb3JhbmdlMycsInB1cnBsZTIiKQ0KbGluZXYgPC0gYygnc29saWQnLCdkb3RkYXNoJywnZGFzaGVkJykNCiMgbGltaXRzIG9mIHggYXhpcw0KeF9sYiA8LSAtMC4wMQ0KeF91YiA8LSAwLjE1DQpsYWJzIDwtIHNlcSh4X2xiLCB4X3ViLCBieSA9IDAuMDEpDQoNCnBsb3QgPC0gZ2dwbG90KGRmX3RlbXAsIGFlcyh4ID0gaW5mbGF0aW9uLCB5ID0gZGVuc2l0eQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBjb2xvciA9IHllYXIsIGxpbmV0eXBlID0geWVhcikpICsNCiAgICAgICAgZ2VvbV9saW5lKCBzaXplID0gbGluZV9zaXplZSkgKw0KICAgICAgICBzY2FsZV9saW5ldHlwZV9tYW51YWwoYnJlYWtzID0geWVhcnMsIHZhbHVlcz0gbGluZXYsIGxhYmVscyA9IHllYXJzKSArDQogICAgICAgIHNjYWxlX2NvbG91cl9tYW51YWwoYnJlYWtzID0geWVhcnMsIHZhbHVlcyA9IGxlZ3YsIGxhYmVscyA9IHllYXJzKSArIA0KICAgICAgICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gbGFicywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IHNjYWxlczo6cGVyY2VudChsYWJzLCBhY2N1cmFjeSA9IDEpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYyh4X2xiLHhfdWIpKSArDQogICAgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9IGMoMC4yLDAuOCkpDQoNCnByaW50KHBsb3QpDQppZiAoYlNhdmVQbG90cykgbXlfZ2dzYXZlKHBhc3RlMChwYXRoX2ZpZ3VyZV9vdXQsICJmaWd1cmVfMTNfYi5wZGYiKSwgcGxvdCkNCg0KYGBg