# Load data
resp_locked_data <- read.csv(file = "./data/response_locked_data_for_plots.csv", header = TRUE)


# Create relevant variables
resp_locked_data <- resp_locked_data %>%
  dplyr::mutate(
    stimulation = factor(ifelse(
      participant_id == "C_01_T1" | participant_id == "C_02_T1" | participant_id == "C_03_T2" |
      participant_id == "C_04_T2" | participant_id == "C_05_T1" | participant_id == "C_06_T2" |
      participant_id == "C_07_T1" | participant_id == "C_08_T1" | participant_id == "C_09_T2" |
      participant_id == "C_10_T2" | participant_id == "C_11_T2" | participant_id == "C_12_T2" |
      participant_id == "C_13_T1" | participant_id == "C_15_T2" | participant_id == "C_16_T1" |
      participant_id == "C_17_T2" | participant_id == "C_18_T2" | participant_id == "C_19_T1" |
      participant_id == "C_20_T1" | participant_id == "C_21_T2" | participant_id == "C_22_T2" |
      participant_id == "C_23_T1" | participant_id == "C_24_T1" | participant_id == "C_25_T1" |
      participant_id == "C_26_T1" | participant_id == "C_27_T2" | participant_id == "C_28_T2" |
      participant_id == "C_29_T1" | participant_id == "C_30_T2" | participant_id == "P_01_T1" |
      participant_id == "P_02_T2" | participant_id == "P_03_T2" | participant_id == "P_04_T1" |
      participant_id == "P_05_T1" | participant_id == "P_06_T1" | participant_id == "P_07_T2" |
      participant_id == "P_08_T2" | participant_id == "P_09_T2" | participant_id == "P_10_T1" |
      participant_id == "P_11_T2" | participant_id == "P_12_T2" | participant_id == "P_13_T1" |
      participant_id == "P_15_T1" | participant_id == "P_16_T1" | participant_id == "P_17_T2" |
      participant_id == "P_18_T1" | participant_id == "P_19_T1" | participant_id == "P_20_T2" |
      participant_id == "P_21_T2" | participant_id == "P_22_T1" | participant_id == "P_23_T1" |
      participant_id == "P_24_T2" | participant_id == "P_25_T1" | participant_id == "P_26_T2" |
      participant_id == "P_27_T1" | participant_id == "P_28_T2" | participant_id == "P_29_T2" |
      participant_id == "P_30_T1", "sham", "verum")),
    condition = factor(ifelse(condition == 1, "correct", "incorrect"), 
                       levels = c("incorrect", "correct")),
    group          = factor(ifelse(substr(participant_id, 1, 1) == "C", "HC", "OCD")),
    session        = factor(ifelse(substr(participant_id, 6, 7) == "T1", "T1", "T2")),
    participant_id = factor(substr(participant_id, 1, 4)), # to get correct no. of factor levels
    condition      = factor(condition, levels = c("incorrect", "correct")),
  )


# Exclude P_02 and C_02
resp_locked_data <- resp_locked_data[resp_locked_data$participant_id != "P_02" &
                                     resp_locked_data$participant_id != "C_02", ]
resp_locked_data$participant_id <- droplevels(resp_locked_data$participant_id)


# Calculate running within-participant CIs for ERN/CRN
running_CIs_MFN <- resp_locked_data %>%
  split(.$time) %>%
  map(~ summarySEwithinO(data        = .,
                         measurevar  = "FCz",
                         withinvars  = c("condition", "stimulation"),
                         betweenvars = "group",
                         idvar       = "participant_id"))

CIs_MFN <- purrr::map_df(running_CIs_MFN, magrittr::extract) %>%
  dplyr::mutate(
    time = rep(unique(resp_locked_data$time), each = 8)
  ) # Note. 8 refers to  no. of conditions (group x stimulation x resp_type = 2 x 2 x 2 = 8)


# Calculate running within-participant CIs for Pe
running_CIs_Pe <- resp_locked_data %>%
  split(.$time) %>%
  map(~ summarySEwithinO(data        = .,
                         measurevar  = "Pz",
                         withinvars  = c("condition", "stimulation"),
                         betweenvars = "group",
                         idvar       = "participant_id"))

CIs_Pe <- purrr::map_df(running_CIs_Pe, magrittr::extract) %>%
  dplyr::mutate(
    time = rep(unique(resp_locked_data$time), each = 8)
  )


# Convert to long format for electrodes for ERN/CRN
data_topo_MFN <- resp_locked_data %>%
  # Remove channels of no interest
  dplyr::select(-IO1, -M1, -F9, -F10) %>%
  # Change from wide to long format for electrodes
  tidyr::gather(., electrode, amplitude, Fp1:O2, factor_key = TRUE)  %>%
  # Select time windows
  dplyr::filter(time >= 0 & time <= 100) %>%
  # Add electrode information
  electrode_locations(., electrode = "electrode", drop = FALSE, montage = NULL)


# Convert to long format for electrodes for Pe
data_topo_Pe <- resp_locked_data %>%
  # Remove channels of no interest
  dplyr::select(-IO1, -M1, -F9, -F10) %>%
  # Change from wide to long format for electrodes
  tidyr::gather(., electrode, amplitude, Fp1:O2, factor_key = TRUE)  %>%
  # Select time windows
  dplyr::filter(time >= 200 & time <= 400) %>%
  # Add electrode information
  electrode_locations(., electrode = "electrode", drop = FALSE, montage = NULL)
#### Create plots of predicted means ####

# Load LMM output
LMM_ERN <- readRDS(file = "./saved_objects_for_plots/LMM_ERN.rds")
LMM_CRN <- readRDS(file = "./saved_objects_for_plots/LMM_CRN.rds")
LMM_Pe  <- readRDS(file = "./saved_objects_for_plots/LMM_Pe.rds")


# ERN
plot_LMM_ERN <- plot_model(LMM_ERN, type = "pred", terms  = c("group", "stimulation"),
                           ci.lvl = .95, title = "", dodge = 0.4, line.size = .5) +
  labs(x  = "", y = "Predicted ERN Amplitude (µV)") +
  my_figure_theme +
  aes(color = group) +
  scale_color_manual(name = "tDCS", labels = c("sham", "cathodal"), values = colors_ERN) +
  coord_cartesian(ylim = c(-9, 3), xlim = c(0.5, 2.5)) +
  scale_y_continuous(breaks = seq(-9, 3, 2), expand = c(0, 0)) +
  scale_x_continuous(labels = c("HC", "OCD"), breaks = c(1, 2), expand = c(0, 0)) +
  theme(axis.ticks.x = element_blank(), legend.position = "none")


# CRN
plot_LMM_CRN <- plot_model(LMM_CRN, type = "pred", terms  = c("group", "stimulation"),
                           ci.lvl = .95, title = "", dodge = 0.4, line.size = .5) +
  labs(x  = "", y = "Predicted CRN Amplitude (µV)") +
  my_figure_theme +
  aes(color = group) +
  scale_color_manual(name = "tDCS", labels = c("sham", "cathodal"), values = colors_CRN) +
  coord_cartesian(ylim = c(1, 9), xlim = c(0.5, 2.5)) +
  scale_y_continuous(breaks = seq(1, 9, 2), expand = c(0, 0))  +
  scale_x_continuous(labels = c("HC", "OCD"), breaks = c(1, 2), expand = c(0, 0)) +
  theme(axis.ticks.x = element_blank(), legend.position = "none")


# Pe
plot_LMM_Pe <- plot_model(LMM_Pe,type = "pred", terms  = c("group", "stimulation"),
                          ci.lvl = .95, title = "", dodge = 0.4, line.size = .5) +
  labs(x  = "", y = "Predicted Pe Amplitude (µV)") +
  my_figure_theme +
  aes(color = group) +
  scale_color_manual(name = "tDCS", labels = c("sham", "cathodal"), values = colors_Pe) +
  coord_cartesian(ylim = c(5.8, 14), xlim = c(0.5, 2.5)) +
  scale_y_continuous(breaks = seq(6, 14, 2), expand = c(0, 0)) +
  scale_x_continuous(labels = c("HC", "OCD"), breaks = c(1, 2), expand = c(0, 0)) +
  theme(axis.ticks.x = element_blank(), legend.position = "none")


#### Create boxplots with probability density plots ####

# Load data
load(file = "./data/Single_Trial_Data.rda")


# Exclude missing responses, RT outliers, and trials with ERP artifacts
single_trial_data_clean <- single_trial_data %>%
  dplyr::filter(
      response_type != "miss" &
      rt_invalid    == FALSE &
      !is.na(MFN_0_100_FCz)
  ) # (53093 of 53760 trials left)


# Aggregate data
data_aggregated <- single_trial_data_clean %>%
  dplyr::group_by(participant_id, group, response_type, stimulation, session) %>%
  dplyr::summarize(
    MFN = mean(MFN_0_100_FCz, na.rm = TRUE),
    Pe  = mean(Pe_200_400_Pz, na.rm = TRUE)
   )  %>%
  dplyr::ungroup()


# ERN
plot_box_density_ERN <- ggplot() +
  geom_flat_violin(data = data_aggregated[data_aggregated$response_type == "incorrect", ],
                   aes(x = group, y = MFN, fill = stimulation), 
                   position = position_nudge(x = .2, y = 0),
                   adjust = 1.5, trim = FALSE, alpha = .5, colour = NA) +
  geom_boxplot(data = data_aggregated[data_aggregated$response_type == "incorrect", ],
               aes(x = group, y = MFN, fill = stimulation), 
               position = position_dodge(width = 0.3),
               outlier.shape = NA, width = .2, alpha = .8, colour = "black") +
  scale_fill_manual(values = colors_ERN, name = "tDCS:") +
  labs(x = "", y = "ERN Amplitude (µV)") +
  coord_cartesian(ylim = c(-35, 25), xlim = c(1.15, 2.25)) +
  scale_y_continuous(breaks = seq(-35, 25, 10), expand = c(0, 0)) +
  my_figure_theme  +
  theme(legend.position = "none", axis.ticks.x = element_blank())


# CRN
plot_box_density_CRN <- ggplot() +
  geom_flat_violin(data = data_aggregated[data_aggregated$response_type == "correct", ],
                   aes(x = group, y = MFN, fill = stimulation), 
                   position = position_nudge(x = .2, y = 0),
                   adjust = 1.5, trim = FALSE, alpha = .5, colour = NA) +
  geom_boxplot(data = data_aggregated[data_aggregated$response_type == "correct", ],
               aes(x = group, y = MFN, fill = stimulation), 
               position = position_dodge(width = 0.3),
               outlier.shape = NA, width = .2, colour = "black") +
  scale_fill_manual(values = colors_CRN, name = "tDCS:") +
  labs(x = "", y = "CRN Amplitude (µV)") +
  coord_cartesian(ylim = c(-15, 25), xlim = c(1.15, 2.25)) +
  scale_y_continuous(breaks = seq(-15, 25, 10), expand = c(0, 0)) +
  my_figure_theme  +
  theme(legend.position = "none", axis.ticks.x = element_blank(), 
        axis.title.y = element_text(vjust = -1))


# Pe
plot_box_density_Pe <- ggplot() +
  geom_flat_violin(data = data_aggregated[data_aggregated$response_type == "incorrect", ],
                   aes(x = group, y = Pe, fill = stimulation), 
                   position = position_nudge(x = .2, y = 0),
                   adjust = 1.5, trim = FALSE, alpha = .5, colour = NA) +
  geom_boxplot(data = data_aggregated[data_aggregated$response_type == "incorrect", ],
               aes(x = group, y = Pe, fill = stimulation), 
               position = position_dodge(width = 0.3),
               outlier.shape = NA, width = .2, colour = "black") +
  scale_fill_manual(values = colors_Pe, name = "tDCS:") +
  labs(x = "", y = "Pe Amplitude (µV)") +
  coord_cartesian(ylim = c(-10, 30), xlim = c(1.15, 2.25)) +
  scale_y_continuous(breaks = seq(-10, 30, 10), expand = c(0, 0)) +
  my_figure_theme  +
  theme(legend.position = "none", axis.ticks.x = element_blank(), 
        axis.title.y = element_text(vjust = -.5))


#### Create waveform plots ####

# Define facet labels
group.labs <- c("Healthy Control Participants ", "Patients With OCD")
names(group.labs) <- c("HC", "OCD")


# Define electrode labels
label_FCz <- data.frame(time = -320, FCz = 11.5, lab = "Text", group = factor("HC", levels = c("HC", "OCD")))
label_Pz  <- data.frame(time = -320, Pz  = 11.6, lab = "Text", group = factor("HC", levels = c("HC", "OCD")))


# ERN/CRN
plot_waveform_MFN <- ggplot(resp_locked_data, aes(time, FCz)) +
  stat_summary(fun = mean, geom = "line", size = 0.5, linetype = "solid", aes(colour = condition:stimulation)) +
  geom_ribbon(data = CIs_MFN, aes(ymin = FCz - ci, ymax = FCz + ci, fill = condition:stimulation), alpha = 0.2) +
  guides(fill = "none") +
  geom_segment(aes(x = 0, xend = 0, y = -10, yend = 12), linetype = "dotted", colour = "grey50") + # Add vline
  geom_segment(aes(x = -400, xend = 800, y = 0, yend = 0), linetype = "dotted", colour = "grey50") + # Add hline
  geom_text(data = label_FCz, label = "FCz") + # 
  annotate("rect", xmin = 0, xmax = 100, ymin = -10, ymax = 12, alpha = .2, fill = "grey50") + # Add shaded time area
  coord_cartesian(ylim = c(-10, 12), xlim = c(-400, 800)) +
  scale_y_continuous(breaks = seq(-10, 12, 2), expand = c(0, 0)) +
  scale_x_continuous(breaks = seq(-400, 800, 200), expand = c(0, 0)) +
  scale_colour_manual(values = c(colors_ERN, colors_CRN), 
                      labels = c("Error: Sham", "Error: Cathodal", "Correct: Sham", "Correct: Cathodal"),
                      guide = guide_legend(override.aes = list(size = 1.3))) + # Thickness legend lines
  scale_fill_manual(values = c(colors_ERN, colors_CRN)) +
  labs(x = "Time (ms)", y = expression(paste("Amplitude (", mu, "V)"))) +
  facet_rep_grid(cols = vars(group), labeller = labeller(group = group.labs), repeat.tick.labels = TRUE) +
  my_figure_theme +
  theme(strip.text.x = element_text(margin = margin(0, 0, 4, 0, "cm"), size = 12, face = "bold"),
        axis.title.y = element_text(vjust = -1.5), panel.spacing = unit(0.75, "cm"),
        legend.title = element_blank(), legend.text = element_text(size = 11))


# Pe
plot_waveform_Pe <- ggplot(resp_locked_data[resp_locked_data$condition == "incorrect", ], aes(time, Pz)) +
  stat_summary(fun = mean, geom = "line", size = 0.5, linetype = "solid", aes(colour = condition:stimulation)) +
  geom_ribbon(data = CIs_Pe[CIs_Pe$condition == "incorrect", ], 
              aes(ymin = Pz - ci, ymax = Pz + ci, fill = condition:stimulation), alpha = 0.2) +
  guides(fill = "none") +
  geom_segment(aes(x = 0, xend = 0, y = -2, yend = 12), linetype = "dotted", colour = "grey50") +
  geom_segment(aes(x = -400, xend = 800, y = 0, yend = 0), linetype = "dotted", colour = "grey50") +
  geom_text(data = label_Pz, label = "Pz") +
  annotate("rect", xmin = 200, xmax = 400, ymin = -2, ymax = 12, alpha = .2, fill = "grey50") +
  coord_cartesian(ylim = c(-2, 12), xlim = c(-400, 800)) +
  scale_y_continuous(breaks = seq(-2, 12, 2), expand = c(0, 0)) +
  scale_x_continuous(breaks = seq(-400, 800, 200), expand = c(0, 0)) +
  scale_colour_manual(values = colors_Pe, 
                      labels = c("Error: Sham", "Error: Cathodal"),
                      guide = guide_legend(override.aes = list(size = 1.3))) +
  scale_fill_manual(values = colors_Pe) +
  labs(x = "Time (ms)", y = expression(paste("Amplitude (", mu, "V)"))) +
  facet_rep_grid(cols = vars(group), labeller = labeller(group = group.labs), repeat.tick.labels = TRUE) +
  my_figure_theme +
  theme(strip.text.x = element_text(margin = margin(0, 0, 3.5, 0, "cm"), size = 11, face = "bold"), 
        axis.title.y = element_text(vjust = -1.5), panel.spacing = unit(0.75, "cm"),
        legend.title = element_blank(), legend.text = element_text(size = 11))


# Get legend and remove individual legends from plot to create common legend
legend_MFN        <- get_legend(plot_waveform_MFN)
legend_Pe         <- get_legend(plot_waveform_Pe)
plot_waveform_MFN <- plot_waveform_MFN + theme(legend.position = "none")
plot_waveform_Pe  <- plot_waveform_Pe  + theme(legend.position = "none")


#### Create topography plots ####

# Define facet labels
stimulation.labs_incorr <- c("Error: Sham", "Error: Cathodal")
names(stimulation.labs_incorr) <- c("sham", "verum")

stimulation.labs_corr <- c("Correct: Sham", "Correct: Cathodal")
names(stimulation.labs_corr) <- c("sham", "verum")


# ERN HC
plot_topo_HC_ERN <- ggplot(data_topo_MFN[data_topo_MFN$group == "HC" & data_topo_MFN$condition == "incorrect", ],
  aes(x = x, y = y, fill = amplitude, label = electrode)) +
  geom_topo(grid_res = 300, interp_limit = "head", chan_markers = "point", chan_size = 0.1, head_size = 0.2) +
  scale_fill_distiller(palette = "RdBu", limits = c(-5.1, 6.5), breaks = c(-5, 0, 5)) + #
  theme_void() +
  coord_equal() +
  labs(fill = expression(paste(mu, "V"))) +
  theme(legend.position = "bottom", legend.text = element_text(size = 7, color = "grey30"),
        legend.title = element_text(size = 7, color = "grey30"), legend.key.height = unit(0.25, 'cm'),
        legend.key.width = unit(0.25, 'cm'), strip.text.x = element_text(size = 7)) +
  facet_grid(cols = vars(stimulation), labeller = labeller(stimulation = stimulation.labs_incorr))


# ERN OCD
plot_topo_OCD_ERN <- ggplot(data_topo_MFN[data_topo_MFN$group == "OCD" & data_topo_MFN$condition == "incorrect", ],
  aes(x = x, y = y, fill = amplitude, label = electrode)) +
  geom_topo(grid_res = 300, interp_limit = "head", chan_markers = "point", chan_size = 0.1, head_size = 0.2) +
  scale_fill_distiller(palette = "RdBu", limits = c(-5.1, 6.5), breaks = c(-5, 0, 5)) + #
  theme_void() +
  coord_equal() +
  labs(fill = expression(paste(mu, "V"))) +
  theme(legend.position = "bottom", legend.text = element_text(size = 7, color = "grey30"),
        legend.title = element_text(size = 7, color = "grey30"), legend.key.height = unit(0.25, 'cm'),
        legend.key.width = unit(0.25, 'cm'), strip.text.x = element_text(size = 7)) +
  facet_grid(cols = vars(stimulation), labeller = labeller(stimulation = stimulation.labs_incorr))


# CRN HC
plot_topo_HC_CRN <- ggplot(data_topo_MFN[data_topo_MFN$group == "HC" & data_topo_MFN$condition == "correct", ],
  aes(x = x, y = y, fill = amplitude, label = electrode)) +
  geom_topo(grid_res = 300, interp_limit = "head", chan_markers = "point", chan_size = 0.1, head_size = 0.2) +
  scale_fill_distiller(palette = "RdBu", limits = c(0.5, 11.7), breaks = c(2, 6, 10)) + #
  theme_void() +
  coord_equal() +
  labs(fill = expression(paste(mu, "V"))) +
  theme(legend.position = "bottom", legend.text = element_text(size = 7, color = "grey30"),
        legend.title = element_text(size = 7, color = "grey30"), legend.key.height = unit(0.25, 'cm'),
        legend.key.width = unit(0.25, 'cm'), strip.text.x = element_text(size = 7)) +
  facet_grid(cols = vars(stimulation), labeller = labeller(stimulation = stimulation.labs_corr))


# CRN OCD
plot_topo_OCD_CRN <- ggplot(data_topo_MFN[data_topo_MFN$group == "OCD" & data_topo_MFN$condition == "correct", ],
  aes(x = x, y = y, fill = amplitude, label = electrode)) +
  geom_topo(grid_res = 300, interp_limit = "head", chan_markers = "point", chan_size = 0.1, head_size = 0.2) +
  scale_fill_distiller(palette = "RdBu", limits = c(0.5, 11.7), breaks = c(2, 6, 10)) + #
  theme_void() +
  coord_equal() +
  labs(fill = expression(paste(mu, "V"))) +
  theme(legend.position = "bottom", legend.text = element_text(size = 7, color = "grey30"),
        legend.title = element_text(size = 7, color = "grey30"), legend.key.height = unit(0.25, 'cm'),
        legend.key.width = unit(0.25, 'cm'), strip.text.x = element_text(size = 7)) +
  facet_grid(cols = vars(stimulation), labeller = labeller(stimulation = stimulation.labs_corr))


# Pe HC
plot_topo_HC_Pe <- ggplot(data_topo_Pe[data_topo_Pe$group == "HC" & data_topo_Pe$condition == "incorrect", ],
  aes(x = x, y = y, fill = amplitude, label = electrode)) +
  geom_topo(grid_res = 300, interp_limit = "head", chan_markers = "point", chan_size = 0.1, head_size = 0.2) +
  scale_fill_distiller(palette = "RdBu", limits = c(2, 10.4)) + 
  theme_void() +
  coord_equal() +
  labs(fill = expression(paste(mu, "V"))) +
  theme(legend.position = "bottom", legend.text = element_text(size = 7, color = "grey30"),
        legend.title = element_text(size = 7, color = "grey30"), legend.key.height = unit(0.25, 'cm'),
        legend.key.width = unit(0.25, 'cm'), strip.text.x = element_text(size = 6.5)) +
  facet_grid(cols = vars(stimulation), labeller = labeller(stimulation = stimulation.labs_incorr))


# Pe OCD
plot_topo_OCD_Pe <- ggplot(data_topo_Pe[data_topo_Pe$group == "OCD" & data_topo_Pe$condition == "incorrect", ],
  aes(x = x, y = y, fill = amplitude, label = electrode)) +
  geom_topo(grid_res = 300, interp_limit = "head", chan_markers = "point", chan_size = 0.1, head_size = 0.2) +
  scale_fill_distiller(palette = "RdBu", limits = c(2, 10.4)) + 
  theme_void() +
  coord_equal() +
  labs(fill = expression(paste(mu, "V"))) +
  theme(legend.position = "bottom", legend.text = element_text(size = 7, color = "grey30"),
        legend.title = element_text(size = 7, color = "grey30"), legend.key.height = unit(0.25, 'cm'),
        legend.key.width = unit(0.25, 'cm'), strip.text.x = element_text(size = 6.5)) +
  facet_grid(cols = vars(stimulation), labeller = labeller(stimulation = stimulation.labs_incorr))

ERN & CRN


This figure corresponds to Figure 1 in the manuscript.

# Overlay waveforms and topopgraphy plots
aligned_plots1_MFN <- align_plots(plot_waveform_MFN, plot_topo_HC_ERN,  axis = "tr")
aligned_plots2_MFN <- align_plots(plot_waveform_MFN, plot_topo_HC_CRN,  axis = "tr")
aligned_plots3_MFN <- align_plots(plot_waveform_MFN, plot_topo_OCD_ERN, axis = "tr")
aligned_plots4_MFN <- align_plots(plot_waveform_MFN, plot_topo_OCD_CRN, axis = "tr")


# Arrange plots
figure_ERN_CRN <- ggdraw() +
  draw_plot(aligned_plots1_MFN[[1]],  x =  0,   y = .42,  width = .99, height = .56) +
  draw_plot(aligned_plots1_MFN[[2]],  x = .073, y = .795, width = .2,  height = .15) +
  draw_plot(aligned_plots2_MFN[[2]],  x = .293, y = .795, width = .2,  height = .15) +
  draw_plot(aligned_plots3_MFN[[2]],  x = .563, y = .795, width = .2,  height = .15) +
  draw_plot(aligned_plots4_MFN[[2]],  x = .783, y = .795, width = .2,  height = .15) +
  draw_plot(legend_MFN,               x = .318, y = .4,   width = .4,  height = .01) +
  draw_plot(plot_box_density_ERN,     x = .01,  y = .04,  width = .3,  height = .29) +
  draw_plot(plot_LMM_ERN,             x = .6,   y = .04,  width = .2,  height = .32) +
  draw_plot(plot_box_density_CRN,     x = .3,   y = .04,  width = .3,  height = .29) +
  draw_plot(plot_LMM_CRN,             x = .8,   y = .04,  width = .2,  height = .32) +
  draw_plot(legend_MFN,               x = .318, y = .035, width = .4,  height = .01) +
  draw_plot_label(c("A", "B", "C"), c(0, 0, .59), c(1, .36, .36), size = 15)
figure_ERN_CRN
Note. (A) Response-locked grand average waveforms with 95% confidence intervals (CIs) for correct and incorrect responses at electrode site FCz in the sham and cathodal tDCS condition for patients with OCD and HC participants, along with topographies of ERN and CRN (0–100 ms). Gray-shaded areas in the waveform plots indicate the time window used for ERN and CRN quantification. (B) ERN and CRN mean amplitude values per group and tDCS condition are presented as boxplots and probability density plots based on raw data. (C) Predicted ERN and CRN mean amplitude values by group and tDCS condition, calculated as partial effects from linear mixed models. Error bars represent 95% CIs.

Note. (A) Response-locked grand average waveforms with 95% confidence intervals (CIs) for correct and incorrect responses at electrode site FCz in the sham and cathodal tDCS condition for patients with OCD and HC participants, along with topographies of ERN and CRN (0–100 ms). Gray-shaded areas in the waveform plots indicate the time window used for ERN and CRN quantification. (B) ERN and CRN mean amplitude values per group and tDCS condition are presented as boxplots and probability density plots based on raw data. (C) Predicted ERN and CRN mean amplitude values by group and tDCS condition, calculated as partial effects from linear mixed models. Error bars represent 95% CIs.

# Save plot
ggsave(plot = figure_ERN_CRN, "./figures/figure_ERN_CRN.tiff", width = 20, height = 24,
       units = "cm", dpi = 600, compression = "lzw")



Pe


This figure corresponds to Figure S1 in the supplemental material.

# Overlay waveforms and tpopgraphy plots
aligned_plots1_Pe  <- align_plots(plot_waveform_Pe, plot_topo_HC_Pe,  axis = "tr")
aligned_plots2_Pe  <- align_plots(plot_waveform_Pe, plot_topo_OCD_Pe, axis = "tr")


# Arrange plots
figure_Pe <- ggdraw() +
  draw_plot(aligned_plots1_Pe[[1]], x =  0,   y = .05,  width = .765, height = .92) +
  draw_plot(aligned_plots1_Pe[[2]], x = .07,  y = .664, width = .3,   height = .22) +
  draw_plot(aligned_plots2_Pe[[2]], x = .447, y = .664, width = .3,   height = .22) +
  draw_plot(plot_box_density_Pe,    x = .77,  y = .48,  width = .25,  height = .47) +
  draw_plot(plot_LMM_Pe,            x = .774, y = .05,  width = .25,  height = .48) +
  draw_plot(legend_Pe,              x = .3,   y = .01,  width = .2,   height = .01) +
  draw_plot_label(c("A", "B", "C"), c(0, .75, .75), c(1, 1, .58), size = 15)
figure_Pe
Note. (A) Response-locked grand average waveforms with 95% confidence intervals (CIs) for incorrect responses at electrode site Pz in the sham and cathodal tDCS condition for patients with OCD and HC participants, along with topographies of the Pe (200–400 ms). Gray-shaded areas in the waveform plots indicate the time window used for Pe quantification. (B) Pe mean amplitude values per group and tDCS condition are presented as boxplots and probability density plots based on raw data. (C) Predicted Pe mean amplitude values by group and tDCS condition, calculated as partial effects from linear mixed models. Error bars represent 95% CIs.

Note. (A) Response-locked grand average waveforms with 95% confidence intervals (CIs) for incorrect responses at electrode site Pz in the sham and cathodal tDCS condition for patients with OCD and HC participants, along with topographies of the Pe (200–400 ms). Gray-shaded areas in the waveform plots indicate the time window used for Pe quantification. (B) Pe mean amplitude values per group and tDCS condition are presented as boxplots and probability density plots based on raw data. (C) Predicted Pe mean amplitude values by group and tDCS condition, calculated as partial effects from linear mixed models. Error bars represent 95% CIs.

# Save plot
ggsave(plot = figure_Pe, "./figures/figure_Pe.tiff", width = 20, height = 12,
       units = "cm", dpi = 600, compression = "lzw")



Session Info


sessionInfo()
R version 3.6.1 (2019-07-05)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 10 x64 (build 19044)

Matrix products: default

locale:
[1] LC_COLLATE=German_Germany.1252  LC_CTYPE=German_Germany.1252   
[3] LC_MONETARY=German_Germany.1252 LC_NUMERIC=C                   
[5] LC_TIME=German_Germany.1252    

attached base packages:
[1] stats     graphics  grDevices datasets  utils     methods   base     

other attached packages:
 [1] lmerTest_3.1-3 lme4_1.1-25    Matrix_1.2-17  plyr_1.8.6     lemon_0.4.5   
 [6] sjPlot_2.8.6   tidyr_1.1.2    eegUtils_0.5.0 purrr_0.3.4    cowplot_1.1.0 
[11] ggplot2_3.3.2  dplyr_1.0.6   

loaded via a namespace (and not attached):
 [1] nlme_3.1-140         matrixStats_0.57.0   RColorBrewer_1.1-2  
 [4] insight_0.14.0       httr_1.4.2           numDeriv_2016.8-1.1 
 [7] backports_1.2.0      tools_3.6.1          utf8_1.1.4          
[10] R6_2.5.0             sjlabelled_1.1.7     lazyeval_0.2.2      
[13] mgcv_1.8-28          colorspace_1.4-1     withr_2.3.0         
[16] tidyselect_1.1.0     gridExtra_2.3        emmeans_1.5.2-1     
[19] compiler_3.6.1       performance_0.7.1.1  edfReader_1.2.1     
[22] plotly_4.9.2.1       bayestestR_0.9.0     scales_1.1.1        
[25] mvtnorm_1.1-1        stringr_1.4.0        digest_0.6.27       
[28] minqa_1.2.4          rmarkdown_2.5        R.utils_2.10.1      
[31] ini_0.3.1            pkgconfig_2.0.3      htmltools_0.5.0     
[34] parallelly_1.22.0    fastmap_1.0.1        htmlwidgets_1.5.2   
[37] rlang_0.4.11         shiny_1.5.0          farver_2.0.3        
[40] generics_0.1.0       jsonlite_1.7.1       R.oo_1.24.0         
[43] magrittr_2.0.1       R.matlab_3.6.2       parameters_0.13.0   
[46] Rcpp_1.0.5           munsell_0.5.0        fansi_0.4.1         
[49] abind_1.4-5          viridis_0.5.1        lifecycle_1.0.0     
[52] R.methodsS3_1.8.1    stringi_1.5.3        yaml_2.2.1          
[55] MASS_7.3-53          grid_3.6.1           parallel_3.6.1      
[58] listenv_0.8.0        promises_1.1.1       sjmisc_2.8.5        
[61] shinydashboard_0.7.1 crayon_1.3.4         miniUI_0.1.1.1      
[64] lattice_0.20-38      ggeffects_0.16.0     splines_3.6.1       
[67] sjstats_0.18.0       knitr_1.30           pillar_1.6.0        
[70] boot_1.3-22          estimability_1.3     effectsize_0.4.0    
[73] future.apply_1.6.0   codetools_0.2-16     glue_1.4.2          
[76] evaluate_0.14        modelr_0.1.8         data.table_1.13.4   
[79] renv_0.12.0          nloptr_1.2.2.2       vctrs_0.3.8         
[82] httpuv_1.5.4         gtable_0.3.0         future_1.21.0       
[85] xfun_0.19            mime_0.9             broom_0.7.2         
[88] xtable_1.8-4         pracma_2.2.9         later_1.1.0.1       
[91] viridisLite_0.3.0    signal_0.7-6         tibble_3.0.4        
[94] statmod_1.4.35       globals_0.14.0       ellipsis_0.3.2      
LS0tDQp0aXRsZTogIlBsb3RzIg0Kb3V0cHV0OiANCiAgaHRtbF9kb2N1bWVudA0KLS0tDQoNCjwhLS0gU2V0IGdlbmVyYWwgc2V0dGluZ3MgLS0+DQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlID0gRkFMU0V9DQoNCiMgU2V0IGdlbmVyYWwgc2V0dGluZ3MgZm9yIG1hcmtkb3duIGZpbGUNCmtuaXRyOjpvcHRzX2NodW5rJHNldCgNCiAgbWVzc2FnZSA9IEZBTFNFLA0KICB3YXJuaW5nID0gRkFMU0UsDQogIGNvbW1lbnQgPSAiIiwNCiAgcmVzdWx0cyA9ICJob2xkIg0KKQ0KDQoNCiMgQ2xlYXIgZW52aXJvbm1lbnQNCnJtKGxpc3QgPSBscygpKQ0KDQoNCiMgRW5hYmxlL2Rpc2FibGUgY2FjaGluZyBvZiB0aW1lLWNvbnN1bWluZyBjb2RlIGNodW5rcw0Ka25pdHJfY2FjaGVfZW5hYmxlZCA9IFRSVUUNCg0KDQojIExvYWQgcGFja2FnZXMNCmxpYnJhcnkoZHBseXIpICAgICAgIyBmb3IgZGF0YSBtYW5pcHVsYXRpb24NCmxpYnJhcnkoZ2dwbG90MikgICAgIyBmb3IgcGxvdHRpbmcNCmxpYnJhcnkoY293cGxvdCkgICAgIyBmb3IgYXJyYW5naW5nIHBsb3RzDQpsaWJyYXJ5KHB1cnJyKSAgICAgICMgZm9yIGNhbGN1bGF0aW5nIHdpdGhpbi1wYXJ0aWNpcGFudCBDSXMNCmxpYnJhcnkoZWVnVXRpbHMpICAgIyBmb3IgcGxvdHRpbmcgdG9wb2dyYXBoaWVzDQpsaWJyYXJ5KHRpZHlyKSAgICAgICMgZm9yIGdhdGhlciBmdW5jdGlvbg0KbGlicmFyeShzalBsb3QpICAgICAjIGZvciBwbG90X21vZGVsIGZ1bmN0aW9uDQpsaWJyYXJ5KGxlbW9uKSAgICAgICMgZm9yIGZ1bmN0aW9uIGZhY2V0X3JlcF9ncmlkLCB0byByZXBlYXQgeSBheGlzIGluIGZhY2V0cw0KDQoNCiMgTG9hZCBmdW5jdGlvbnMNCnNvdXJjZSgiLi9mdW5jdGlvbnMvc3VtbWFyeVNFd2l0aGluTy5SIikgICMgRnVuY3Rpb24gcHJvdmlkZWQgYnkgUi1jb29rYm9vazogaHR0cDovL3d3dy5jb29rYm9vay1yLmNvbS9HcmFwaHMvUGxvdHRpbmdfbWVhbnNfYW5kX2Vycm9yX2JhcnNfKGdncGxvdDIpLw0Kc291cmNlKCIuL2Z1bmN0aW9ucy9SX3JhaW5jbG91ZHMuUiIpICAgICAgIyBGdW5jdGlvbiB0byBjcmVhdGUgcmFpbmNsb3VkIHBsb3RzIA0KDQoNCiMgRGVmaW5lIGZ1bmN0aW9uIHRvIGNyZWF0ZSBjb21tb24gbGVnZW5kIChmcm9tIGh0dHA6Ly93d3cuc3RoZGEuY29tL2VuZ2xpc2gvd2lraS93aWtpLnBocD9pZF9jb250ZW50cz03OTMwI2FkZC1hLWNvbW1vbi1sZWdlbmQtZm9yLW11bHRpcGxlLWdncGxvdDItZ3JhcGhzKQ0KZ2V0X2xlZ2VuZCA8LSBmdW5jdGlvbihteWdncGxvdCkgew0KICB0bXAgICAgICA8LSBnZ3Bsb3RfZ3RhYmxlKGdncGxvdF9idWlsZChteWdncGxvdCkpDQogIGxlZyAgICAgIDwtIHdoaWNoKHNhcHBseSh0bXAkZ3JvYnMsIGZ1bmN0aW9uKHgpIHgkbmFtZSkgPT0gImd1aWRlLWJveCIpDQogIGxlZ2VuZCAgIDwtIHRtcCRncm9ic1tbbGVnXV0NCiAgcmV0dXJuKGxlZ2VuZCkNCn0NCg0KDQojIFNldCBmaWd1cmUgdGhlbWUNCm15X2ZpZ3VyZV90aGVtZSA8LSB0aGVtZV9jbGFzc2ljKGJhc2Vfc2l6ZSA9IDExKSArIA0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwNCiAgICAgICAgc3RyaXAuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpDQoNCg0KIyBTZXQgZmlndXJlIGNvbG9ycw0KY29sb3JzX0VSTiA8LSBjKCJyb3lhbGJsdWUxIiwgIm5hdnkiKQ0KY29sb3JzX0NSTiA8LSBjKCJ0YW4xIiwgInNpZW5uYTMiKQ0KY29sb3JzX1BlICA8LSBjKCJkYXJrb2xpdmVncmVlbjMiLCAic2VhZ3JlZW4iKQ0KYGBgDQoNCjwhLS0gTG9hZCBhbmQgY2xlYW4gZGF0YSAtLT4NCg0KYGBge3IgbG9hZC1hbmQtY2xlYW4tZGF0YX0NCg0KIyBMb2FkIGRhdGENCnJlc3BfbG9ja2VkX2RhdGEgPC0gcmVhZC5jc3YoZmlsZSA9ICIuL2RhdGEvcmVzcG9uc2VfbG9ja2VkX2RhdGFfZm9yX3Bsb3RzLmNzdiIsIGhlYWRlciA9IFRSVUUpDQoNCg0KIyBDcmVhdGUgcmVsZXZhbnQgdmFyaWFibGVzDQpyZXNwX2xvY2tlZF9kYXRhIDwtIHJlc3BfbG9ja2VkX2RhdGEgJT4lDQogIGRwbHlyOjptdXRhdGUoDQogICAgc3RpbXVsYXRpb24gPSBmYWN0b3IoaWZlbHNlKA0KICAgICAgcGFydGljaXBhbnRfaWQgPT0gIkNfMDFfVDEiIHwgcGFydGljaXBhbnRfaWQgPT0gIkNfMDJfVDEiIHwgcGFydGljaXBhbnRfaWQgPT0gIkNfMDNfVDIiIHwNCiAgICAgIHBhcnRpY2lwYW50X2lkID09ICJDXzA0X1QyIiB8IHBhcnRpY2lwYW50X2lkID09ICJDXzA1X1QxIiB8IHBhcnRpY2lwYW50X2lkID09ICJDXzA2X1QyIiB8DQogICAgICBwYXJ0aWNpcGFudF9pZCA9PSAiQ18wN19UMSIgfCBwYXJ0aWNpcGFudF9pZCA9PSAiQ18wOF9UMSIgfCBwYXJ0aWNpcGFudF9pZCA9PSAiQ18wOV9UMiIgfA0KICAgICAgcGFydGljaXBhbnRfaWQgPT0gIkNfMTBfVDIiIHwgcGFydGljaXBhbnRfaWQgPT0gIkNfMTFfVDIiIHwgcGFydGljaXBhbnRfaWQgPT0gIkNfMTJfVDIiIHwNCiAgICAgIHBhcnRpY2lwYW50X2lkID09ICJDXzEzX1QxIiB8IHBhcnRpY2lwYW50X2lkID09ICJDXzE1X1QyIiB8IHBhcnRpY2lwYW50X2lkID09ICJDXzE2X1QxIiB8DQogICAgICBwYXJ0aWNpcGFudF9pZCA9PSAiQ18xN19UMiIgfCBwYXJ0aWNpcGFudF9pZCA9PSAiQ18xOF9UMiIgfCBwYXJ0aWNpcGFudF9pZCA9PSAiQ18xOV9UMSIgfA0KICAgICAgcGFydGljaXBhbnRfaWQgPT0gIkNfMjBfVDEiIHwgcGFydGljaXBhbnRfaWQgPT0gIkNfMjFfVDIiIHwgcGFydGljaXBhbnRfaWQgPT0gIkNfMjJfVDIiIHwNCiAgICAgIHBhcnRpY2lwYW50X2lkID09ICJDXzIzX1QxIiB8IHBhcnRpY2lwYW50X2lkID09ICJDXzI0X1QxIiB8IHBhcnRpY2lwYW50X2lkID09ICJDXzI1X1QxIiB8DQogICAgICBwYXJ0aWNpcGFudF9pZCA9PSAiQ18yNl9UMSIgfCBwYXJ0aWNpcGFudF9pZCA9PSAiQ18yN19UMiIgfCBwYXJ0aWNpcGFudF9pZCA9PSAiQ18yOF9UMiIgfA0KICAgICAgcGFydGljaXBhbnRfaWQgPT0gIkNfMjlfVDEiIHwgcGFydGljaXBhbnRfaWQgPT0gIkNfMzBfVDIiIHwgcGFydGljaXBhbnRfaWQgPT0gIlBfMDFfVDEiIHwNCiAgICAgIHBhcnRpY2lwYW50X2lkID09ICJQXzAyX1QyIiB8IHBhcnRpY2lwYW50X2lkID09ICJQXzAzX1QyIiB8IHBhcnRpY2lwYW50X2lkID09ICJQXzA0X1QxIiB8DQogICAgICBwYXJ0aWNpcGFudF9pZCA9PSAiUF8wNV9UMSIgfCBwYXJ0aWNpcGFudF9pZCA9PSAiUF8wNl9UMSIgfCBwYXJ0aWNpcGFudF9pZCA9PSAiUF8wN19UMiIgfA0KICAgICAgcGFydGljaXBhbnRfaWQgPT0gIlBfMDhfVDIiIHwgcGFydGljaXBhbnRfaWQgPT0gIlBfMDlfVDIiIHwgcGFydGljaXBhbnRfaWQgPT0gIlBfMTBfVDEiIHwNCiAgICAgIHBhcnRpY2lwYW50X2lkID09ICJQXzExX1QyIiB8IHBhcnRpY2lwYW50X2lkID09ICJQXzEyX1QyIiB8IHBhcnRpY2lwYW50X2lkID09ICJQXzEzX1QxIiB8DQogICAgICBwYXJ0aWNpcGFudF9pZCA9PSAiUF8xNV9UMSIgfCBwYXJ0aWNpcGFudF9pZCA9PSAiUF8xNl9UMSIgfCBwYXJ0aWNpcGFudF9pZCA9PSAiUF8xN19UMiIgfA0KICAgICAgcGFydGljaXBhbnRfaWQgPT0gIlBfMThfVDEiIHwgcGFydGljaXBhbnRfaWQgPT0gIlBfMTlfVDEiIHwgcGFydGljaXBhbnRfaWQgPT0gIlBfMjBfVDIiIHwNCiAgICAgIHBhcnRpY2lwYW50X2lkID09ICJQXzIxX1QyIiB8IHBhcnRpY2lwYW50X2lkID09ICJQXzIyX1QxIiB8IHBhcnRpY2lwYW50X2lkID09ICJQXzIzX1QxIiB8DQogICAgICBwYXJ0aWNpcGFudF9pZCA9PSAiUF8yNF9UMiIgfCBwYXJ0aWNpcGFudF9pZCA9PSAiUF8yNV9UMSIgfCBwYXJ0aWNpcGFudF9pZCA9PSAiUF8yNl9UMiIgfA0KICAgICAgcGFydGljaXBhbnRfaWQgPT0gIlBfMjdfVDEiIHwgcGFydGljaXBhbnRfaWQgPT0gIlBfMjhfVDIiIHwgcGFydGljaXBhbnRfaWQgPT0gIlBfMjlfVDIiIHwNCiAgICAgIHBhcnRpY2lwYW50X2lkID09ICJQXzMwX1QxIiwgInNoYW0iLCAidmVydW0iKSksDQogICAgY29uZGl0aW9uID0gZmFjdG9yKGlmZWxzZShjb25kaXRpb24gPT0gMSwgImNvcnJlY3QiLCAiaW5jb3JyZWN0IiksIA0KICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJpbmNvcnJlY3QiLCAiY29ycmVjdCIpKSwNCiAgICBncm91cCAgICAgICAgICA9IGZhY3RvcihpZmVsc2Uoc3Vic3RyKHBhcnRpY2lwYW50X2lkLCAxLCAxKSA9PSAiQyIsICJIQyIsICJPQ0QiKSksDQogICAgc2Vzc2lvbiAgICAgICAgPSBmYWN0b3IoaWZlbHNlKHN1YnN0cihwYXJ0aWNpcGFudF9pZCwgNiwgNykgPT0gIlQxIiwgIlQxIiwgIlQyIikpLA0KICAgIHBhcnRpY2lwYW50X2lkID0gZmFjdG9yKHN1YnN0cihwYXJ0aWNpcGFudF9pZCwgMSwgNCkpLCAjIHRvIGdldCBjb3JyZWN0IG5vLiBvZiBmYWN0b3IgbGV2ZWxzDQogICAgY29uZGl0aW9uICAgICAgPSBmYWN0b3IoY29uZGl0aW9uLCBsZXZlbHMgPSBjKCJpbmNvcnJlY3QiLCAiY29ycmVjdCIpKSwNCiAgKQ0KDQoNCiMgRXhjbHVkZSBQXzAyIGFuZCBDXzAyDQpyZXNwX2xvY2tlZF9kYXRhIDwtIHJlc3BfbG9ja2VkX2RhdGFbcmVzcF9sb2NrZWRfZGF0YSRwYXJ0aWNpcGFudF9pZCAhPSAiUF8wMiIgJg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BfbG9ja2VkX2RhdGEkcGFydGljaXBhbnRfaWQgIT0gIkNfMDIiLCBdDQpyZXNwX2xvY2tlZF9kYXRhJHBhcnRpY2lwYW50X2lkIDwtIGRyb3BsZXZlbHMocmVzcF9sb2NrZWRfZGF0YSRwYXJ0aWNpcGFudF9pZCkNCg0KDQojIENhbGN1bGF0ZSBydW5uaW5nIHdpdGhpbi1wYXJ0aWNpcGFudCBDSXMgZm9yIEVSTi9DUk4NCnJ1bm5pbmdfQ0lzX01GTiA8LSByZXNwX2xvY2tlZF9kYXRhICU+JQ0KICBzcGxpdCguJHRpbWUpICU+JQ0KICBtYXAofiBzdW1tYXJ5U0V3aXRoaW5PKGRhdGEgICAgICAgID0gLiwNCiAgICAgICAgICAgICAgICAgICAgICAgICBtZWFzdXJldmFyICA9ICJGQ3oiLA0KICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGhpbnZhcnMgID0gYygiY29uZGl0aW9uIiwgInN0aW11bGF0aW9uIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgYmV0d2VlbnZhcnMgPSAiZ3JvdXAiLA0KICAgICAgICAgICAgICAgICAgICAgICAgIGlkdmFyICAgICAgID0gInBhcnRpY2lwYW50X2lkIikpDQoNCkNJc19NRk4gPC0gcHVycnI6Om1hcF9kZihydW5uaW5nX0NJc19NRk4sIG1hZ3JpdHRyOjpleHRyYWN0KSAlPiUNCiAgZHBseXI6Om11dGF0ZSgNCiAgICB0aW1lID0gcmVwKHVuaXF1ZShyZXNwX2xvY2tlZF9kYXRhJHRpbWUpLCBlYWNoID0gOCkNCiAgKSAjIE5vdGUuIDggcmVmZXJzIHRvICBuby4gb2YgY29uZGl0aW9ucyAoZ3JvdXAgeCBzdGltdWxhdGlvbiB4IHJlc3BfdHlwZSA9IDIgeCAyIHggMiA9IDgpDQoNCg0KIyBDYWxjdWxhdGUgcnVubmluZyB3aXRoaW4tcGFydGljaXBhbnQgQ0lzIGZvciBQZQ0KcnVubmluZ19DSXNfUGUgPC0gcmVzcF9sb2NrZWRfZGF0YSAlPiUNCiAgc3BsaXQoLiR0aW1lKSAlPiUNCiAgbWFwKH4gc3VtbWFyeVNFd2l0aGluTyhkYXRhICAgICAgICA9IC4sDQogICAgICAgICAgICAgICAgICAgICAgICAgbWVhc3VyZXZhciAgPSAiUHoiLA0KICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGhpbnZhcnMgID0gYygiY29uZGl0aW9uIiwgInN0aW11bGF0aW9uIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgYmV0d2VlbnZhcnMgPSAiZ3JvdXAiLA0KICAgICAgICAgICAgICAgICAgICAgICAgIGlkdmFyICAgICAgID0gInBhcnRpY2lwYW50X2lkIikpDQoNCkNJc19QZSA8LSBwdXJycjo6bWFwX2RmKHJ1bm5pbmdfQ0lzX1BlLCBtYWdyaXR0cjo6ZXh0cmFjdCkgJT4lDQogIGRwbHlyOjptdXRhdGUoDQogICAgdGltZSA9IHJlcCh1bmlxdWUocmVzcF9sb2NrZWRfZGF0YSR0aW1lKSwgZWFjaCA9IDgpDQogICkNCg0KDQojIENvbnZlcnQgdG8gbG9uZyBmb3JtYXQgZm9yIGVsZWN0cm9kZXMgZm9yIEVSTi9DUk4NCmRhdGFfdG9wb19NRk4gPC0gcmVzcF9sb2NrZWRfZGF0YSAlPiUNCiAgIyBSZW1vdmUgY2hhbm5lbHMgb2Ygbm8gaW50ZXJlc3QNCiAgZHBseXI6OnNlbGVjdCgtSU8xLCAtTTEsIC1GOSwgLUYxMCkgJT4lDQogICMgQ2hhbmdlIGZyb20gd2lkZSB0byBsb25nIGZvcm1hdCBmb3IgZWxlY3Ryb2Rlcw0KICB0aWR5cjo6Z2F0aGVyKC4sIGVsZWN0cm9kZSwgYW1wbGl0dWRlLCBGcDE6TzIsIGZhY3Rvcl9rZXkgPSBUUlVFKSAgJT4lDQogICMgU2VsZWN0IHRpbWUgd2luZG93cw0KICBkcGx5cjo6ZmlsdGVyKHRpbWUgPj0gMCAmIHRpbWUgPD0gMTAwKSAlPiUNCiAgIyBBZGQgZWxlY3Ryb2RlIGluZm9ybWF0aW9uDQogIGVsZWN0cm9kZV9sb2NhdGlvbnMoLiwgZWxlY3Ryb2RlID0gImVsZWN0cm9kZSIsIGRyb3AgPSBGQUxTRSwgbW9udGFnZSA9IE5VTEwpDQoNCg0KIyBDb252ZXJ0IHRvIGxvbmcgZm9ybWF0IGZvciBlbGVjdHJvZGVzIGZvciBQZQ0KZGF0YV90b3BvX1BlIDwtIHJlc3BfbG9ja2VkX2RhdGEgJT4lDQogICMgUmVtb3ZlIGNoYW5uZWxzIG9mIG5vIGludGVyZXN0DQogIGRwbHlyOjpzZWxlY3QoLUlPMSwgLU0xLCAtRjksIC1GMTApICU+JQ0KICAjIENoYW5nZSBmcm9tIHdpZGUgdG8gbG9uZyBmb3JtYXQgZm9yIGVsZWN0cm9kZXMNCiAgdGlkeXI6OmdhdGhlciguLCBlbGVjdHJvZGUsIGFtcGxpdHVkZSwgRnAxOk8yLCBmYWN0b3Jfa2V5ID0gVFJVRSkgICU+JQ0KICAjIFNlbGVjdCB0aW1lIHdpbmRvd3MNCiAgZHBseXI6OmZpbHRlcih0aW1lID49IDIwMCAmIHRpbWUgPD0gNDAwKSAlPiUNCiAgIyBBZGQgZWxlY3Ryb2RlIGluZm9ybWF0aW9uDQogIGVsZWN0cm9kZV9sb2NhdGlvbnMoLiwgZWxlY3Ryb2RlID0gImVsZWN0cm9kZSIsIGRyb3AgPSBGQUxTRSwgbW9udGFnZSA9IE5VTEwpDQpgYGANCg0KPCEtLSBDcmVhdGUgcGxvdHMgLS0+DQoNCmBgYHtyIGNyZWF0ZS1wbG90c30NCg0KIyMjIyBDcmVhdGUgcGxvdHMgb2YgcHJlZGljdGVkIG1lYW5zICMjIyMNCg0KIyBMb2FkIExNTSBvdXRwdXQNCkxNTV9FUk4gPC0gcmVhZFJEUyhmaWxlID0gIi4vc2F2ZWRfb2JqZWN0c19mb3JfcGxvdHMvTE1NX0VSTi5yZHMiKQ0KTE1NX0NSTiA8LSByZWFkUkRTKGZpbGUgPSAiLi9zYXZlZF9vYmplY3RzX2Zvcl9wbG90cy9MTU1fQ1JOLnJkcyIpDQpMTU1fUGUgIDwtIHJlYWRSRFMoZmlsZSA9ICIuL3NhdmVkX29iamVjdHNfZm9yX3Bsb3RzL0xNTV9QZS5yZHMiKQ0KDQoNCiMgRVJODQpwbG90X0xNTV9FUk4gPC0gcGxvdF9tb2RlbChMTU1fRVJOLCB0eXBlID0gInByZWQiLCB0ZXJtcyAgPSBjKCJncm91cCIsICJzdGltdWxhdGlvbiIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgY2kubHZsID0gLjk1LCB0aXRsZSA9ICIiLCBkb2RnZSA9IDAuNCwgbGluZS5zaXplID0gLjUpICsNCiAgbGFicyh4ICA9ICIiLCB5ID0gIlByZWRpY3RlZCBFUk4gQW1wbGl0dWRlICjCtVYpIikgKw0KICBteV9maWd1cmVfdGhlbWUgKw0KICBhZXMoY29sb3IgPSBncm91cCkgKw0KICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9ICJ0RENTIiwgbGFiZWxzID0gYygic2hhbSIsICJjYXRob2RhbCIpLCB2YWx1ZXMgPSBjb2xvcnNfRVJOKSArDQogIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygtOSwgMyksIHhsaW0gPSBjKDAuNSwgMi41KSkgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKC05LCAzLCAyKSwgZXhwYW5kID0gYygwLCAwKSkgKw0KICBzY2FsZV94X2NvbnRpbnVvdXMobGFiZWxzID0gYygiSEMiLCAiT0NEIiksIGJyZWFrcyA9IGMoMSwgMiksIGV4cGFuZCA9IGMoMCwgMCkpICsNCiAgdGhlbWUoYXhpcy50aWNrcy54ID0gZWxlbWVudF9ibGFuaygpLCBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpDQoNCg0KIyBDUk4NCnBsb3RfTE1NX0NSTiA8LSBwbG90X21vZGVsKExNTV9DUk4sIHR5cGUgPSAicHJlZCIsIHRlcm1zICA9IGMoImdyb3VwIiwgInN0aW11bGF0aW9uIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBjaS5sdmwgPSAuOTUsIHRpdGxlID0gIiIsIGRvZGdlID0gMC40LCBsaW5lLnNpemUgPSAuNSkgKw0KICBsYWJzKHggID0gIiIsIHkgPSAiUHJlZGljdGVkIENSTiBBbXBsaXR1ZGUgKMK1VikiKSArDQogIG15X2ZpZ3VyZV90aGVtZSArDQogIGFlcyhjb2xvciA9IGdyb3VwKSArDQogIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lID0gInREQ1MiLCBsYWJlbHMgPSBjKCJzaGFtIiwgImNhdGhvZGFsIiksIHZhbHVlcyA9IGNvbG9yc19DUk4pICsNCiAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKDEsIDkpLCB4bGltID0gYygwLjUsIDIuNSkpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgxLCA5LCAyKSwgZXhwYW5kID0gYygwLCAwKSkgICsNCiAgc2NhbGVfeF9jb250aW51b3VzKGxhYmVscyA9IGMoIkhDIiwgIk9DRCIpLCBicmVha3MgPSBjKDEsIDIpLCBleHBhbmQgPSBjKDAsIDApKSArDQogIHRoZW1lKGF4aXMudGlja3MueCA9IGVsZW1lbnRfYmxhbmsoKSwgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQ0KDQoNCiMgUGUNCnBsb3RfTE1NX1BlIDwtIHBsb3RfbW9kZWwoTE1NX1BlLHR5cGUgPSAicHJlZCIsIHRlcm1zICA9IGMoImdyb3VwIiwgInN0aW11bGF0aW9uIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgIGNpLmx2bCA9IC45NSwgdGl0bGUgPSAiIiwgZG9kZ2UgPSAwLjQsIGxpbmUuc2l6ZSA9IC41KSArDQogIGxhYnMoeCAgPSAiIiwgeSA9ICJQcmVkaWN0ZWQgUGUgQW1wbGl0dWRlICjCtVYpIikgKw0KICBteV9maWd1cmVfdGhlbWUgKw0KICBhZXMoY29sb3IgPSBncm91cCkgKw0KICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9ICJ0RENTIiwgbGFiZWxzID0gYygic2hhbSIsICJjYXRob2RhbCIpLCB2YWx1ZXMgPSBjb2xvcnNfUGUpICsNCiAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKDUuOCwgMTQpLCB4bGltID0gYygwLjUsIDIuNSkpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSg2LCAxNCwgMiksIGV4cGFuZCA9IGMoMCwgMCkpICsNCiAgc2NhbGVfeF9jb250aW51b3VzKGxhYmVscyA9IGMoIkhDIiwgIk9DRCIpLCBicmVha3MgPSBjKDEsIDIpLCBleHBhbmQgPSBjKDAsIDApKSArDQogIHRoZW1lKGF4aXMudGlja3MueCA9IGVsZW1lbnRfYmxhbmsoKSwgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQ0KDQoNCiMjIyMgQ3JlYXRlIGJveHBsb3RzIHdpdGggcHJvYmFiaWxpdHkgZGVuc2l0eSBwbG90cyAjIyMjDQoNCiMgTG9hZCBkYXRhDQpsb2FkKGZpbGUgPSAiLi9kYXRhL1NpbmdsZV9UcmlhbF9EYXRhLnJkYSIpDQoNCg0KIyBFeGNsdWRlIG1pc3NpbmcgcmVzcG9uc2VzLCBSVCBvdXRsaWVycywgYW5kIHRyaWFscyB3aXRoIEVSUCBhcnRpZmFjdHMNCnNpbmdsZV90cmlhbF9kYXRhX2NsZWFuIDwtIHNpbmdsZV90cmlhbF9kYXRhICU+JQ0KICBkcGx5cjo6ZmlsdGVyKA0KICAgICAgcmVzcG9uc2VfdHlwZSAhPSAibWlzcyIgJg0KICAgICAgcnRfaW52YWxpZCAgICA9PSBGQUxTRSAmDQogICAgICAhaXMubmEoTUZOXzBfMTAwX0ZDeikNCiAgKSAjICg1MzA5MyBvZiA1Mzc2MCB0cmlhbHMgbGVmdCkNCg0KDQojIEFnZ3JlZ2F0ZSBkYXRhDQpkYXRhX2FnZ3JlZ2F0ZWQgPC0gc2luZ2xlX3RyaWFsX2RhdGFfY2xlYW4gJT4lDQogIGRwbHlyOjpncm91cF9ieShwYXJ0aWNpcGFudF9pZCwgZ3JvdXAsIHJlc3BvbnNlX3R5cGUsIHN0aW11bGF0aW9uLCBzZXNzaW9uKSAlPiUNCiAgZHBseXI6OnN1bW1hcml6ZSgNCiAgICBNRk4gPSBtZWFuKE1GTl8wXzEwMF9GQ3osIG5hLnJtID0gVFJVRSksDQogICAgUGUgID0gbWVhbihQZV8yMDBfNDAwX1B6LCBuYS5ybSA9IFRSVUUpDQogICApICAlPiUNCiAgZHBseXI6OnVuZ3JvdXAoKQ0KDQoNCiMgRVJODQpwbG90X2JveF9kZW5zaXR5X0VSTiA8LSBnZ3Bsb3QoKSArDQogIGdlb21fZmxhdF92aW9saW4oZGF0YSA9IGRhdGFfYWdncmVnYXRlZFtkYXRhX2FnZ3JlZ2F0ZWQkcmVzcG9uc2VfdHlwZSA9PSAiaW5jb3JyZWN0IiwgXSwNCiAgICAgICAgICAgICAgICAgICBhZXMoeCA9IGdyb3VwLCB5ID0gTUZOLCBmaWxsID0gc3RpbXVsYXRpb24pLCANCiAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX251ZGdlKHggPSAuMiwgeSA9IDApLA0KICAgICAgICAgICAgICAgICAgIGFkanVzdCA9IDEuNSwgdHJpbSA9IEZBTFNFLCBhbHBoYSA9IC41LCBjb2xvdXIgPSBOQSkgKw0KICBnZW9tX2JveHBsb3QoZGF0YSA9IGRhdGFfYWdncmVnYXRlZFtkYXRhX2FnZ3JlZ2F0ZWQkcmVzcG9uc2VfdHlwZSA9PSAiaW5jb3JyZWN0IiwgXSwNCiAgICAgICAgICAgICAgIGFlcyh4ID0gZ3JvdXAsIHkgPSBNRk4sIGZpbGwgPSBzdGltdWxhdGlvbiksIA0KICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuMyksDQogICAgICAgICAgICAgICBvdXRsaWVyLnNoYXBlID0gTkEsIHdpZHRoID0gLjIsIGFscGhhID0gLjgsIGNvbG91ciA9ICJibGFjayIpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gY29sb3JzX0VSTiwgbmFtZSA9ICJ0RENTOiIpICsNCiAgbGFicyh4ID0gIiIsIHkgPSAiRVJOIEFtcGxpdHVkZSAowrVWKSIpICsNCiAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKC0zNSwgMjUpLCB4bGltID0gYygxLjE1LCAyLjI1KSkgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKC0zNSwgMjUsIDEwKSwgZXhwYW5kID0gYygwLCAwKSkgKw0KICBteV9maWd1cmVfdGhlbWUgICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLCBheGlzLnRpY2tzLnggPSBlbGVtZW50X2JsYW5rKCkpDQoNCg0KIyBDUk4NCnBsb3RfYm94X2RlbnNpdHlfQ1JOIDwtIGdncGxvdCgpICsNCiAgZ2VvbV9mbGF0X3Zpb2xpbihkYXRhID0gZGF0YV9hZ2dyZWdhdGVkW2RhdGFfYWdncmVnYXRlZCRyZXNwb25zZV90eXBlID09ICJjb3JyZWN0IiwgXSwNCiAgICAgICAgICAgICAgICAgICBhZXMoeCA9IGdyb3VwLCB5ID0gTUZOLCBmaWxsID0gc3RpbXVsYXRpb24pLCANCiAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX251ZGdlKHggPSAuMiwgeSA9IDApLA0KICAgICAgICAgICAgICAgICAgIGFkanVzdCA9IDEuNSwgdHJpbSA9IEZBTFNFLCBhbHBoYSA9IC41LCBjb2xvdXIgPSBOQSkgKw0KICBnZW9tX2JveHBsb3QoZGF0YSA9IGRhdGFfYWdncmVnYXRlZFtkYXRhX2FnZ3JlZ2F0ZWQkcmVzcG9uc2VfdHlwZSA9PSAiY29ycmVjdCIsIF0sDQogICAgICAgICAgICAgICBhZXMoeCA9IGdyb3VwLCB5ID0gTUZOLCBmaWxsID0gc3RpbXVsYXRpb24pLCANCiAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjMpLA0KICAgICAgICAgICAgICAgb3V0bGllci5zaGFwZSA9IE5BLCB3aWR0aCA9IC4yLCBjb2xvdXIgPSAiYmxhY2siKSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGNvbG9yc19DUk4sIG5hbWUgPSAidERDUzoiKSArDQogIGxhYnMoeCA9ICIiLCB5ID0gIkNSTiBBbXBsaXR1ZGUgKMK1VikiKSArDQogIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygtMTUsIDI1KSwgeGxpbSA9IGMoMS4xNSwgMi4yNSkpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgtMTUsIDI1LCAxMCksIGV4cGFuZCA9IGMoMCwgMCkpICsNCiAgbXlfZmlndXJlX3RoZW1lICArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwgYXhpcy50aWNrcy54ID0gZWxlbWVudF9ibGFuaygpLCANCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHZqdXN0ID0gLTEpKQ0KDQoNCiMgUGUNCnBsb3RfYm94X2RlbnNpdHlfUGUgPC0gZ2dwbG90KCkgKw0KICBnZW9tX2ZsYXRfdmlvbGluKGRhdGEgPSBkYXRhX2FnZ3JlZ2F0ZWRbZGF0YV9hZ2dyZWdhdGVkJHJlc3BvbnNlX3R5cGUgPT0gImluY29ycmVjdCIsIF0sDQogICAgICAgICAgICAgICAgICAgYWVzKHggPSBncm91cCwgeSA9IFBlLCBmaWxsID0gc3RpbXVsYXRpb24pLCANCiAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX251ZGdlKHggPSAuMiwgeSA9IDApLA0KICAgICAgICAgICAgICAgICAgIGFkanVzdCA9IDEuNSwgdHJpbSA9IEZBTFNFLCBhbHBoYSA9IC41LCBjb2xvdXIgPSBOQSkgKw0KICBnZW9tX2JveHBsb3QoZGF0YSA9IGRhdGFfYWdncmVnYXRlZFtkYXRhX2FnZ3JlZ2F0ZWQkcmVzcG9uc2VfdHlwZSA9PSAiaW5jb3JyZWN0IiwgXSwNCiAgICAgICAgICAgICAgIGFlcyh4ID0gZ3JvdXAsIHkgPSBQZSwgZmlsbCA9IHN0aW11bGF0aW9uKSwgDQogICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC4zKSwNCiAgICAgICAgICAgICAgIG91dGxpZXIuc2hhcGUgPSBOQSwgd2lkdGggPSAuMiwgY29sb3VyID0gImJsYWNrIikgKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjb2xvcnNfUGUsIG5hbWUgPSAidERDUzoiKSArDQogIGxhYnMoeCA9ICIiLCB5ID0gIlBlIEFtcGxpdHVkZSAowrVWKSIpICsNCiAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKC0xMCwgMzApLCB4bGltID0gYygxLjE1LCAyLjI1KSkgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKC0xMCwgMzAsIDEwKSwgZXhwYW5kID0gYygwLCAwKSkgKw0KICBteV9maWd1cmVfdGhlbWUgICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLCBheGlzLnRpY2tzLnggPSBlbGVtZW50X2JsYW5rKCksIA0KICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQodmp1c3QgPSAtLjUpKQ0KDQoNCiMjIyMgQ3JlYXRlIHdhdmVmb3JtIHBsb3RzICMjIyMNCg0KIyBEZWZpbmUgZmFjZXQgbGFiZWxzDQpncm91cC5sYWJzIDwtIGMoIkhlYWx0aHkgQ29udHJvbCBQYXJ0aWNpcGFudHMgIiwgIlBhdGllbnRzIFdpdGggT0NEIikNCm5hbWVzKGdyb3VwLmxhYnMpIDwtIGMoIkhDIiwgIk9DRCIpDQoNCg0KIyBEZWZpbmUgZWxlY3Ryb2RlIGxhYmVscw0KbGFiZWxfRkN6IDwtIGRhdGEuZnJhbWUodGltZSA9IC0zMjAsIEZDeiA9IDExLjUsIGxhYiA9ICJUZXh0IiwgZ3JvdXAgPSBmYWN0b3IoIkhDIiwgbGV2ZWxzID0gYygiSEMiLCAiT0NEIikpKQ0KbGFiZWxfUHogIDwtIGRhdGEuZnJhbWUodGltZSA9IC0zMjAsIFB6ICA9IDExLjYsIGxhYiA9ICJUZXh0IiwgZ3JvdXAgPSBmYWN0b3IoIkhDIiwgbGV2ZWxzID0gYygiSEMiLCAiT0NEIikpKQ0KDQoNCiMgRVJOL0NSTg0KcGxvdF93YXZlZm9ybV9NRk4gPC0gZ2dwbG90KHJlc3BfbG9ja2VkX2RhdGEsIGFlcyh0aW1lLCBGQ3opKSArDQogIHN0YXRfc3VtbWFyeShmdW4gPSBtZWFuLCBnZW9tID0gImxpbmUiLCBzaXplID0gMC41LCBsaW5ldHlwZSA9ICJzb2xpZCIsIGFlcyhjb2xvdXIgPSBjb25kaXRpb246c3RpbXVsYXRpb24pKSArDQogIGdlb21fcmliYm9uKGRhdGEgPSBDSXNfTUZOLCBhZXMoeW1pbiA9IEZDeiAtIGNpLCB5bWF4ID0gRkN6ICsgY2ksIGZpbGwgPSBjb25kaXRpb246c3RpbXVsYXRpb24pLCBhbHBoYSA9IDAuMikgKw0KICBndWlkZXMoZmlsbCA9ICJub25lIikgKw0KICBnZW9tX3NlZ21lbnQoYWVzKHggPSAwLCB4ZW5kID0gMCwgeSA9IC0xMCwgeWVuZCA9IDEyKSwgbGluZXR5cGUgPSAiZG90dGVkIiwgY29sb3VyID0gImdyZXk1MCIpICsgIyBBZGQgdmxpbmUNCiAgZ2VvbV9zZWdtZW50KGFlcyh4ID0gLTQwMCwgeGVuZCA9IDgwMCwgeSA9IDAsIHllbmQgPSAwKSwgbGluZXR5cGUgPSAiZG90dGVkIiwgY29sb3VyID0gImdyZXk1MCIpICsgIyBBZGQgaGxpbmUNCiAgZ2VvbV90ZXh0KGRhdGEgPSBsYWJlbF9GQ3osIGxhYmVsID0gIkZDeiIpICsgIyANCiAgYW5ub3RhdGUoInJlY3QiLCB4bWluID0gMCwgeG1heCA9IDEwMCwgeW1pbiA9IC0xMCwgeW1heCA9IDEyLCBhbHBoYSA9IC4yLCBmaWxsID0gImdyZXk1MCIpICsgIyBBZGQgc2hhZGVkIHRpbWUgYXJlYQ0KICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoLTEwLCAxMiksIHhsaW0gPSBjKC00MDAsIDgwMCkpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgtMTAsIDEyLCAyKSwgZXhwYW5kID0gYygwLCAwKSkgKw0KICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKC00MDAsIDgwMCwgMjAwKSwgZXhwYW5kID0gYygwLCAwKSkgKw0KICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcyA9IGMoY29sb3JzX0VSTiwgY29sb3JzX0NSTiksIA0KICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIkVycm9yOiBTaGFtIiwgIkVycm9yOiBDYXRob2RhbCIsICJDb3JyZWN0OiBTaGFtIiwgIkNvcnJlY3Q6IENhdGhvZGFsIiksDQogICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBndWlkZV9sZWdlbmQob3ZlcnJpZGUuYWVzID0gbGlzdChzaXplID0gMS4zKSkpICsgIyBUaGlja25lc3MgbGVnZW5kIGxpbmVzDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoY29sb3JzX0VSTiwgY29sb3JzX0NSTikpICsNCiAgbGFicyh4ID0gIlRpbWUgKG1zKSIsIHkgPSBleHByZXNzaW9uKHBhc3RlKCJBbXBsaXR1ZGUgKCIsIG11LCAiVikiKSkpICsNCiAgZmFjZXRfcmVwX2dyaWQoY29scyA9IHZhcnMoZ3JvdXApLCBsYWJlbGxlciA9IGxhYmVsbGVyKGdyb3VwID0gZ3JvdXAubGFicyksIHJlcGVhdC50aWNrLmxhYmVscyA9IFRSVUUpICsNCiAgbXlfZmlndXJlX3RoZW1lICsNCiAgdGhlbWUoc3RyaXAudGV4dC54ID0gZWxlbWVudF90ZXh0KG1hcmdpbiA9IG1hcmdpbigwLCAwLCA0LCAwLCAiY20iKSwgc2l6ZSA9IDEyLCBmYWNlID0gImJvbGQiKSwNCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHZqdXN0ID0gLTEuNSksIHBhbmVsLnNwYWNpbmcgPSB1bml0KDAuNzUsICJjbSIpLA0KICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X2JsYW5rKCksIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMSkpDQoNCg0KIyBQZQ0KcGxvdF93YXZlZm9ybV9QZSA8LSBnZ3Bsb3QocmVzcF9sb2NrZWRfZGF0YVtyZXNwX2xvY2tlZF9kYXRhJGNvbmRpdGlvbiA9PSAiaW5jb3JyZWN0IiwgXSwgYWVzKHRpbWUsIFB6KSkgKw0KICBzdGF0X3N1bW1hcnkoZnVuID0gbWVhbiwgZ2VvbSA9ICJsaW5lIiwgc2l6ZSA9IDAuNSwgbGluZXR5cGUgPSAic29saWQiLCBhZXMoY29sb3VyID0gY29uZGl0aW9uOnN0aW11bGF0aW9uKSkgKw0KICBnZW9tX3JpYmJvbihkYXRhID0gQ0lzX1BlW0NJc19QZSRjb25kaXRpb24gPT0gImluY29ycmVjdCIsIF0sIA0KICAgICAgICAgICAgICBhZXMoeW1pbiA9IFB6IC0gY2ksIHltYXggPSBQeiArIGNpLCBmaWxsID0gY29uZGl0aW9uOnN0aW11bGF0aW9uKSwgYWxwaGEgPSAwLjIpICsNCiAgZ3VpZGVzKGZpbGwgPSAibm9uZSIpICsNCiAgZ2VvbV9zZWdtZW50KGFlcyh4ID0gMCwgeGVuZCA9IDAsIHkgPSAtMiwgeWVuZCA9IDEyKSwgbGluZXR5cGUgPSAiZG90dGVkIiwgY29sb3VyID0gImdyZXk1MCIpICsNCiAgZ2VvbV9zZWdtZW50KGFlcyh4ID0gLTQwMCwgeGVuZCA9IDgwMCwgeSA9IDAsIHllbmQgPSAwKSwgbGluZXR5cGUgPSAiZG90dGVkIiwgY29sb3VyID0gImdyZXk1MCIpICsNCiAgZ2VvbV90ZXh0KGRhdGEgPSBsYWJlbF9QeiwgbGFiZWwgPSAiUHoiKSArDQogIGFubm90YXRlKCJyZWN0IiwgeG1pbiA9IDIwMCwgeG1heCA9IDQwMCwgeW1pbiA9IC0yLCB5bWF4ID0gMTIsIGFscGhhID0gLjIsIGZpbGwgPSAiZ3JleTUwIikgKw0KICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoLTIsIDEyKSwgeGxpbSA9IGMoLTQwMCwgODAwKSkgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKC0yLCAxMiwgMiksIGV4cGFuZCA9IGMoMCwgMCkpICsNCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgtNDAwLCA4MDAsIDIwMCksIGV4cGFuZCA9IGMoMCwgMCkpICsNCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXMgPSBjb2xvcnNfUGUsIA0KICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIkVycm9yOiBTaGFtIiwgIkVycm9yOiBDYXRob2RhbCIpLA0KICAgICAgICAgICAgICAgICAgICAgIGd1aWRlID0gZ3VpZGVfbGVnZW5kKG92ZXJyaWRlLmFlcyA9IGxpc3Qoc2l6ZSA9IDEuMykpKSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGNvbG9yc19QZSkgKw0KICBsYWJzKHggPSAiVGltZSAobXMpIiwgeSA9IGV4cHJlc3Npb24ocGFzdGUoIkFtcGxpdHVkZSAoIiwgbXUsICJWKSIpKSkgKw0KICBmYWNldF9yZXBfZ3JpZChjb2xzID0gdmFycyhncm91cCksIGxhYmVsbGVyID0gbGFiZWxsZXIoZ3JvdXAgPSBncm91cC5sYWJzKSwgcmVwZWF0LnRpY2subGFiZWxzID0gVFJVRSkgKw0KICBteV9maWd1cmVfdGhlbWUgKw0KICB0aGVtZShzdHJpcC50ZXh0LnggPSBlbGVtZW50X3RleHQobWFyZ2luID0gbWFyZ2luKDAsIDAsIDMuNSwgMCwgImNtIiksIHNpemUgPSAxMSwgZmFjZSA9ICJib2xkIiksIA0KICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQodmp1c3QgPSAtMS41KSwgcGFuZWwuc3BhY2luZyA9IHVuaXQoMC43NSwgImNtIiksDQogICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSwgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDExKSkNCg0KDQojIEdldCBsZWdlbmQgYW5kIHJlbW92ZSBpbmRpdmlkdWFsIGxlZ2VuZHMgZnJvbSBwbG90IHRvIGNyZWF0ZSBjb21tb24gbGVnZW5kDQpsZWdlbmRfTUZOICAgICAgICA8LSBnZXRfbGVnZW5kKHBsb3Rfd2F2ZWZvcm1fTUZOKQ0KbGVnZW5kX1BlICAgICAgICAgPC0gZ2V0X2xlZ2VuZChwbG90X3dhdmVmb3JtX1BlKQ0KcGxvdF93YXZlZm9ybV9NRk4gPC0gcGxvdF93YXZlZm9ybV9NRk4gKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpDQpwbG90X3dhdmVmb3JtX1BlICA8LSBwbG90X3dhdmVmb3JtX1BlICArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikNCg0KDQojIyMjIENyZWF0ZSB0b3BvZ3JhcGh5IHBsb3RzICMjIyMNCg0KIyBEZWZpbmUgZmFjZXQgbGFiZWxzDQpzdGltdWxhdGlvbi5sYWJzX2luY29yciA8LSBjKCJFcnJvcjogU2hhbSIsICJFcnJvcjogQ2F0aG9kYWwiKQ0KbmFtZXMoc3RpbXVsYXRpb24ubGFic19pbmNvcnIpIDwtIGMoInNoYW0iLCAidmVydW0iKQ0KDQpzdGltdWxhdGlvbi5sYWJzX2NvcnIgPC0gYygiQ29ycmVjdDogU2hhbSIsICJDb3JyZWN0OiBDYXRob2RhbCIpDQpuYW1lcyhzdGltdWxhdGlvbi5sYWJzX2NvcnIpIDwtIGMoInNoYW0iLCAidmVydW0iKQ0KDQoNCiMgRVJOIEhDDQpwbG90X3RvcG9fSENfRVJOIDwtIGdncGxvdChkYXRhX3RvcG9fTUZOW2RhdGFfdG9wb19NRk4kZ3JvdXAgPT0gIkhDIiAmIGRhdGFfdG9wb19NRk4kY29uZGl0aW9uID09ICJpbmNvcnJlY3QiLCBdLA0KICBhZXMoeCA9IHgsIHkgPSB5LCBmaWxsID0gYW1wbGl0dWRlLCBsYWJlbCA9IGVsZWN0cm9kZSkpICsNCiAgZ2VvbV90b3BvKGdyaWRfcmVzID0gMzAwLCBpbnRlcnBfbGltaXQgPSAiaGVhZCIsIGNoYW5fbWFya2VycyA9ICJwb2ludCIsIGNoYW5fc2l6ZSA9IDAuMSwgaGVhZF9zaXplID0gMC4yKSArDQogIHNjYWxlX2ZpbGxfZGlzdGlsbGVyKHBhbGV0dGUgPSAiUmRCdSIsIGxpbWl0cyA9IGMoLTUuMSwgNi41KSwgYnJlYWtzID0gYygtNSwgMCwgNSkpICsgIw0KICB0aGVtZV92b2lkKCkgKw0KICBjb29yZF9lcXVhbCgpICsNCiAgbGFicyhmaWxsID0gZXhwcmVzc2lvbihwYXN0ZShtdSwgIlYiKSkpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA3LCBjb2xvciA9ICJncmV5MzAiKSwNCiAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSA3LCBjb2xvciA9ICJncmV5MzAiKSwgbGVnZW5kLmtleS5oZWlnaHQgPSB1bml0KDAuMjUsICdjbScpLA0KICAgICAgICBsZWdlbmQua2V5LndpZHRoID0gdW5pdCgwLjI1LCAnY20nKSwgc3RyaXAudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSA3KSkgKw0KICBmYWNldF9ncmlkKGNvbHMgPSB2YXJzKHN0aW11bGF0aW9uKSwgbGFiZWxsZXIgPSBsYWJlbGxlcihzdGltdWxhdGlvbiA9IHN0aW11bGF0aW9uLmxhYnNfaW5jb3JyKSkNCg0KDQojIEVSTiBPQ0QNCnBsb3RfdG9wb19PQ0RfRVJOIDwtIGdncGxvdChkYXRhX3RvcG9fTUZOW2RhdGFfdG9wb19NRk4kZ3JvdXAgPT0gIk9DRCIgJiBkYXRhX3RvcG9fTUZOJGNvbmRpdGlvbiA9PSAiaW5jb3JyZWN0IiwgXSwNCiAgYWVzKHggPSB4LCB5ID0geSwgZmlsbCA9IGFtcGxpdHVkZSwgbGFiZWwgPSBlbGVjdHJvZGUpKSArDQogIGdlb21fdG9wbyhncmlkX3JlcyA9IDMwMCwgaW50ZXJwX2xpbWl0ID0gImhlYWQiLCBjaGFuX21hcmtlcnMgPSAicG9pbnQiLCBjaGFuX3NpemUgPSAwLjEsIGhlYWRfc2l6ZSA9IDAuMikgKw0KICBzY2FsZV9maWxsX2Rpc3RpbGxlcihwYWxldHRlID0gIlJkQnUiLCBsaW1pdHMgPSBjKC01LjEsIDYuNSksIGJyZWFrcyA9IGMoLTUsIDAsIDUpKSArICMNCiAgdGhlbWVfdm9pZCgpICsNCiAgY29vcmRfZXF1YWwoKSArDQogIGxhYnMoZmlsbCA9IGV4cHJlc3Npb24ocGFzdGUobXUsICJWIikpKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLCBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gNywgY29sb3IgPSAiZ3JleTMwIiksDQogICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gNywgY29sb3IgPSAiZ3JleTMwIiksIGxlZ2VuZC5rZXkuaGVpZ2h0ID0gdW5pdCgwLjI1LCAnY20nKSwNCiAgICAgICAgbGVnZW5kLmtleS53aWR0aCA9IHVuaXQoMC4yNSwgJ2NtJyksIHN0cmlwLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gNykpICsNCiAgZmFjZXRfZ3JpZChjb2xzID0gdmFycyhzdGltdWxhdGlvbiksIGxhYmVsbGVyID0gbGFiZWxsZXIoc3RpbXVsYXRpb24gPSBzdGltdWxhdGlvbi5sYWJzX2luY29ycikpDQoNCg0KIyBDUk4gSEMNCnBsb3RfdG9wb19IQ19DUk4gPC0gZ2dwbG90KGRhdGFfdG9wb19NRk5bZGF0YV90b3BvX01GTiRncm91cCA9PSAiSEMiICYgZGF0YV90b3BvX01GTiRjb25kaXRpb24gPT0gImNvcnJlY3QiLCBdLA0KICBhZXMoeCA9IHgsIHkgPSB5LCBmaWxsID0gYW1wbGl0dWRlLCBsYWJlbCA9IGVsZWN0cm9kZSkpICsNCiAgZ2VvbV90b3BvKGdyaWRfcmVzID0gMzAwLCBpbnRlcnBfbGltaXQgPSAiaGVhZCIsIGNoYW5fbWFya2VycyA9ICJwb2ludCIsIGNoYW5fc2l6ZSA9IDAuMSwgaGVhZF9zaXplID0gMC4yKSArDQogIHNjYWxlX2ZpbGxfZGlzdGlsbGVyKHBhbGV0dGUgPSAiUmRCdSIsIGxpbWl0cyA9IGMoMC41LCAxMS43KSwgYnJlYWtzID0gYygyLCA2LCAxMCkpICsgIw0KICB0aGVtZV92b2lkKCkgKw0KICBjb29yZF9lcXVhbCgpICsNCiAgbGFicyhmaWxsID0gZXhwcmVzc2lvbihwYXN0ZShtdSwgIlYiKSkpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA3LCBjb2xvciA9ICJncmV5MzAiKSwNCiAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSA3LCBjb2xvciA9ICJncmV5MzAiKSwgbGVnZW5kLmtleS5oZWlnaHQgPSB1bml0KDAuMjUsICdjbScpLA0KICAgICAgICBsZWdlbmQua2V5LndpZHRoID0gdW5pdCgwLjI1LCAnY20nKSwgc3RyaXAudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSA3KSkgKw0KICBmYWNldF9ncmlkKGNvbHMgPSB2YXJzKHN0aW11bGF0aW9uKSwgbGFiZWxsZXIgPSBsYWJlbGxlcihzdGltdWxhdGlvbiA9IHN0aW11bGF0aW9uLmxhYnNfY29ycikpDQoNCg0KIyBDUk4gT0NEDQpwbG90X3RvcG9fT0NEX0NSTiA8LSBnZ3Bsb3QoZGF0YV90b3BvX01GTltkYXRhX3RvcG9fTUZOJGdyb3VwID09ICJPQ0QiICYgZGF0YV90b3BvX01GTiRjb25kaXRpb24gPT0gImNvcnJlY3QiLCBdLA0KICBhZXMoeCA9IHgsIHkgPSB5LCBmaWxsID0gYW1wbGl0dWRlLCBsYWJlbCA9IGVsZWN0cm9kZSkpICsNCiAgZ2VvbV90b3BvKGdyaWRfcmVzID0gMzAwLCBpbnRlcnBfbGltaXQgPSAiaGVhZCIsIGNoYW5fbWFya2VycyA9ICJwb2ludCIsIGNoYW5fc2l6ZSA9IDAuMSwgaGVhZF9zaXplID0gMC4yKSArDQogIHNjYWxlX2ZpbGxfZGlzdGlsbGVyKHBhbGV0dGUgPSAiUmRCdSIsIGxpbWl0cyA9IGMoMC41LCAxMS43KSwgYnJlYWtzID0gYygyLCA2LCAxMCkpICsgIw0KICB0aGVtZV92b2lkKCkgKw0KICBjb29yZF9lcXVhbCgpICsNCiAgbGFicyhmaWxsID0gZXhwcmVzc2lvbihwYXN0ZShtdSwgIlYiKSkpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA3LCBjb2xvciA9ICJncmV5MzAiKSwNCiAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSA3LCBjb2xvciA9ICJncmV5MzAiKSwgbGVnZW5kLmtleS5oZWlnaHQgPSB1bml0KDAuMjUsICdjbScpLA0KICAgICAgICBsZWdlbmQua2V5LndpZHRoID0gdW5pdCgwLjI1LCAnY20nKSwgc3RyaXAudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSA3KSkgKw0KICBmYWNldF9ncmlkKGNvbHMgPSB2YXJzKHN0aW11bGF0aW9uKSwgbGFiZWxsZXIgPSBsYWJlbGxlcihzdGltdWxhdGlvbiA9IHN0aW11bGF0aW9uLmxhYnNfY29ycikpDQoNCg0KIyBQZSBIQw0KcGxvdF90b3BvX0hDX1BlIDwtIGdncGxvdChkYXRhX3RvcG9fUGVbZGF0YV90b3BvX1BlJGdyb3VwID09ICJIQyIgJiBkYXRhX3RvcG9fUGUkY29uZGl0aW9uID09ICJpbmNvcnJlY3QiLCBdLA0KICBhZXMoeCA9IHgsIHkgPSB5LCBmaWxsID0gYW1wbGl0dWRlLCBsYWJlbCA9IGVsZWN0cm9kZSkpICsNCiAgZ2VvbV90b3BvKGdyaWRfcmVzID0gMzAwLCBpbnRlcnBfbGltaXQgPSAiaGVhZCIsIGNoYW5fbWFya2VycyA9ICJwb2ludCIsIGNoYW5fc2l6ZSA9IDAuMSwgaGVhZF9zaXplID0gMC4yKSArDQogIHNjYWxlX2ZpbGxfZGlzdGlsbGVyKHBhbGV0dGUgPSAiUmRCdSIsIGxpbWl0cyA9IGMoMiwgMTAuNCkpICsgDQogIHRoZW1lX3ZvaWQoKSArDQogIGNvb3JkX2VxdWFsKCkgKw0KICBsYWJzKGZpbGwgPSBleHByZXNzaW9uKHBhc3RlKG11LCAiViIpKSkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDcsIGNvbG9yID0gImdyZXkzMCIpLA0KICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDcsIGNvbG9yID0gImdyZXkzMCIpLCBsZWdlbmQua2V5LmhlaWdodCA9IHVuaXQoMC4yNSwgJ2NtJyksDQogICAgICAgIGxlZ2VuZC5rZXkud2lkdGggPSB1bml0KDAuMjUsICdjbScpLCBzdHJpcC50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDYuNSkpICsNCiAgZmFjZXRfZ3JpZChjb2xzID0gdmFycyhzdGltdWxhdGlvbiksIGxhYmVsbGVyID0gbGFiZWxsZXIoc3RpbXVsYXRpb24gPSBzdGltdWxhdGlvbi5sYWJzX2luY29ycikpDQoNCg0KIyBQZSBPQ0QNCnBsb3RfdG9wb19PQ0RfUGUgPC0gZ2dwbG90KGRhdGFfdG9wb19QZVtkYXRhX3RvcG9fUGUkZ3JvdXAgPT0gIk9DRCIgJiBkYXRhX3RvcG9fUGUkY29uZGl0aW9uID09ICJpbmNvcnJlY3QiLCBdLA0KICBhZXMoeCA9IHgsIHkgPSB5LCBmaWxsID0gYW1wbGl0dWRlLCBsYWJlbCA9IGVsZWN0cm9kZSkpICsNCiAgZ2VvbV90b3BvKGdyaWRfcmVzID0gMzAwLCBpbnRlcnBfbGltaXQgPSAiaGVhZCIsIGNoYW5fbWFya2VycyA9ICJwb2ludCIsIGNoYW5fc2l6ZSA9IDAuMSwgaGVhZF9zaXplID0gMC4yKSArDQogIHNjYWxlX2ZpbGxfZGlzdGlsbGVyKHBhbGV0dGUgPSAiUmRCdSIsIGxpbWl0cyA9IGMoMiwgMTAuNCkpICsgDQogIHRoZW1lX3ZvaWQoKSArDQogIGNvb3JkX2VxdWFsKCkgKw0KICBsYWJzKGZpbGwgPSBleHByZXNzaW9uKHBhc3RlKG11LCAiViIpKSkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDcsIGNvbG9yID0gImdyZXkzMCIpLA0KICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDcsIGNvbG9yID0gImdyZXkzMCIpLCBsZWdlbmQua2V5LmhlaWdodCA9IHVuaXQoMC4yNSwgJ2NtJyksDQogICAgICAgIGxlZ2VuZC5rZXkud2lkdGggPSB1bml0KDAuMjUsICdjbScpLCBzdHJpcC50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDYuNSkpICsNCiAgZmFjZXRfZ3JpZChjb2xzID0gdmFycyhzdGltdWxhdGlvbiksIGxhYmVsbGVyID0gbGFiZWxsZXIoc3RpbXVsYXRpb24gPSBzdGltdWxhdGlvbi5sYWJzX2luY29ycikpDQpgYGANCg0KIyMgRVJOICYgQ1JODQoqKioNCg0KVGhpcyBmaWd1cmUgY29ycmVzcG9uZHMgdG8gRmlndXJlIDEgaW4gdGhlIG1hbnVzY3JpcHQuDQoNCmBgYHtyIGFycmFuZ2UtcGxvdHMtRVJOLUNSTiwgZmlnLndpZHRoID0gOCwgZmlnLmhlaWdodCA9IDEwLCBjYWNoZSA9IGtuaXRyX2NhY2hlX2VuYWJsZWQsIGRwaSA9IDYwMCwgZmlnLmNhcCA9ICJOb3RlLiAoQSkgUmVzcG9uc2UtbG9ja2VkIGdyYW5kIGF2ZXJhZ2Ugd2F2ZWZvcm1zIHdpdGggOTUlIGNvbmZpZGVuY2UgaW50ZXJ2YWxzIChDSXMpIGZvciBjb3JyZWN0IGFuZCBpbmNvcnJlY3QgcmVzcG9uc2VzIGF0IGVsZWN0cm9kZSBzaXRlIEZDeiBpbiB0aGUgc2hhbSBhbmQgY2F0aG9kYWwgdERDUyBjb25kaXRpb24gZm9yIHBhdGllbnRzIHdpdGggT0NEIGFuZCBIQyBwYXJ0aWNpcGFudHMsIGFsb25nIHdpdGggdG9wb2dyYXBoaWVzIG9mIEVSTiBhbmQgQ1JOICgw4oCTMTAwIG1zKS4gR3JheS1zaGFkZWQgYXJlYXMgaW4gdGhlIHdhdmVmb3JtIHBsb3RzIGluZGljYXRlIHRoZSB0aW1lIHdpbmRvdyB1c2VkIGZvciBFUk4gYW5kIENSTiBxdWFudGlmaWNhdGlvbi4gKEIpIEVSTiBhbmQgQ1JOIG1lYW4gYW1wbGl0dWRlIHZhbHVlcyBwZXIgZ3JvdXAgYW5kIHREQ1MgY29uZGl0aW9uIGFyZSBwcmVzZW50ZWQgYXMgYm94cGxvdHMgYW5kIHByb2JhYmlsaXR5IGRlbnNpdHkgcGxvdHMgYmFzZWQgb24gcmF3IGRhdGEuIChDKSBQcmVkaWN0ZWQgRVJOIGFuZCBDUk4gbWVhbiBhbXBsaXR1ZGUgdmFsdWVzIGJ5IGdyb3VwIGFuZCB0RENTIGNvbmRpdGlvbiwgY2FsY3VsYXRlZCBhcyBwYXJ0aWFsIGVmZmVjdHMgZnJvbSBsaW5lYXIgbWl4ZWQgbW9kZWxzLiBFcnJvciBiYXJzIHJlcHJlc2VudCA5NSUgQ0lzLiJ9DQoNCiMgT3ZlcmxheSB3YXZlZm9ybXMgYW5kIHRvcG9wZ3JhcGh5IHBsb3RzDQphbGlnbmVkX3Bsb3RzMV9NRk4gPC0gYWxpZ25fcGxvdHMocGxvdF93YXZlZm9ybV9NRk4sIHBsb3RfdG9wb19IQ19FUk4sICBheGlzID0gInRyIikNCmFsaWduZWRfcGxvdHMyX01GTiA8LSBhbGlnbl9wbG90cyhwbG90X3dhdmVmb3JtX01GTiwgcGxvdF90b3BvX0hDX0NSTiwgIGF4aXMgPSAidHIiKQ0KYWxpZ25lZF9wbG90czNfTUZOIDwtIGFsaWduX3Bsb3RzKHBsb3Rfd2F2ZWZvcm1fTUZOLCBwbG90X3RvcG9fT0NEX0VSTiwgYXhpcyA9ICJ0ciIpDQphbGlnbmVkX3Bsb3RzNF9NRk4gPC0gYWxpZ25fcGxvdHMocGxvdF93YXZlZm9ybV9NRk4sIHBsb3RfdG9wb19PQ0RfQ1JOLCBheGlzID0gInRyIikNCg0KDQojIEFycmFuZ2UgcGxvdHMNCmZpZ3VyZV9FUk5fQ1JOIDwtIGdnZHJhdygpICsNCiAgZHJhd19wbG90KGFsaWduZWRfcGxvdHMxX01GTltbMV1dLCAgeCA9ICAwLCAgIHkgPSAuNDIsICB3aWR0aCA9IC45OSwgaGVpZ2h0ID0gLjU2KSArDQogIGRyYXdfcGxvdChhbGlnbmVkX3Bsb3RzMV9NRk5bWzJdXSwgIHggPSAuMDczLCB5ID0gLjc5NSwgd2lkdGggPSAuMiwgIGhlaWdodCA9IC4xNSkgKw0KICBkcmF3X3Bsb3QoYWxpZ25lZF9wbG90czJfTUZOW1syXV0sICB4ID0gLjI5MywgeSA9IC43OTUsIHdpZHRoID0gLjIsICBoZWlnaHQgPSAuMTUpICsNCiAgZHJhd19wbG90KGFsaWduZWRfcGxvdHMzX01GTltbMl1dLCAgeCA9IC41NjMsIHkgPSAuNzk1LCB3aWR0aCA9IC4yLCAgaGVpZ2h0ID0gLjE1KSArDQogIGRyYXdfcGxvdChhbGlnbmVkX3Bsb3RzNF9NRk5bWzJdXSwgIHggPSAuNzgzLCB5ID0gLjc5NSwgd2lkdGggPSAuMiwgIGhlaWdodCA9IC4xNSkgKw0KICBkcmF3X3Bsb3QobGVnZW5kX01GTiwgICAgICAgICAgICAgICB4ID0gLjMxOCwgeSA9IC40LCAgIHdpZHRoID0gLjQsICBoZWlnaHQgPSAuMDEpICsNCiAgZHJhd19wbG90KHBsb3RfYm94X2RlbnNpdHlfRVJOLCAgICAgeCA9IC4wMSwgIHkgPSAuMDQsICB3aWR0aCA9IC4zLCAgaGVpZ2h0ID0gLjI5KSArDQogIGRyYXdfcGxvdChwbG90X0xNTV9FUk4sICAgICAgICAgICAgIHggPSAuNiwgICB5ID0gLjA0LCAgd2lkdGggPSAuMiwgIGhlaWdodCA9IC4zMikgKw0KICBkcmF3X3Bsb3QocGxvdF9ib3hfZGVuc2l0eV9DUk4sICAgICB4ID0gLjMsICAgeSA9IC4wNCwgIHdpZHRoID0gLjMsICBoZWlnaHQgPSAuMjkpICsNCiAgZHJhd19wbG90KHBsb3RfTE1NX0NSTiwgICAgICAgICAgICAgeCA9IC44LCAgIHkgPSAuMDQsICB3aWR0aCA9IC4yLCAgaGVpZ2h0ID0gLjMyKSArDQogIGRyYXdfcGxvdChsZWdlbmRfTUZOLCAgICAgICAgICAgICAgIHggPSAuMzE4LCB5ID0gLjAzNSwgd2lkdGggPSAuNCwgIGhlaWdodCA9IC4wMSkgKw0KICBkcmF3X3Bsb3RfbGFiZWwoYygiQSIsICJCIiwgIkMiKSwgYygwLCAwLCAuNTkpLCBjKDEsIC4zNiwgLjM2KSwgc2l6ZSA9IDE1KQ0KZmlndXJlX0VSTl9DUk4NCg0KDQojIFNhdmUgcGxvdA0KZ2dzYXZlKHBsb3QgPSBmaWd1cmVfRVJOX0NSTiwgIi4vZmlndXJlcy9maWd1cmVfRVJOX0NSTi50aWZmIiwgd2lkdGggPSAyMCwgaGVpZ2h0ID0gMjQsDQogICAgICAgdW5pdHMgPSAiY20iLCBkcGkgPSA2MDAsIGNvbXByZXNzaW9uID0gImx6dyIpDQpgYGANCjxicj48YnI+DQoNCiMjIFBlDQoqKioNCg0KVGhpcyBmaWd1cmUgY29ycmVzcG9uZHMgdG8gRmlndXJlIFMxIGluIHRoZSBzdXBwbGVtZW50YWwgbWF0ZXJpYWwuDQoNCmBgYHtyIGFycmFuZ2UtcGxvdHMtUGUsIGZpZy53aWR0aCA9IDgsIGZpZy5oZWlnaHQgPSA0LCBjYWNoZSA9IGtuaXRyX2NhY2hlX2VuYWJsZWQsIGRwaSA9IDYwMCwgZmlnLmNhcCA9ICJOb3RlLiAoQSkgUmVzcG9uc2UtbG9ja2VkIGdyYW5kIGF2ZXJhZ2Ugd2F2ZWZvcm1zIHdpdGggOTUlIGNvbmZpZGVuY2UgaW50ZXJ2YWxzIChDSXMpIGZvciBpbmNvcnJlY3QgcmVzcG9uc2VzIGF0IGVsZWN0cm9kZSBzaXRlIFB6IGluIHRoZSBzaGFtIGFuZCBjYXRob2RhbCB0RENTIGNvbmRpdGlvbiBmb3IgcGF0aWVudHMgd2l0aCBPQ0QgYW5kIEhDIHBhcnRpY2lwYW50cywgYWxvbmcgd2l0aCB0b3BvZ3JhcGhpZXMgb2YgdGhlIFBlICgyMDDigJM0MDAgbXMpLiBHcmF5LXNoYWRlZCBhcmVhcyBpbiB0aGUgd2F2ZWZvcm0gcGxvdHMgaW5kaWNhdGUgdGhlIHRpbWUgd2luZG93IHVzZWQgZm9yIFBlIHF1YW50aWZpY2F0aW9uLiAoQikgUGUgbWVhbiBhbXBsaXR1ZGUgdmFsdWVzIHBlciBncm91cCBhbmQgdERDUyBjb25kaXRpb24gYXJlIHByZXNlbnRlZCBhcyBib3hwbG90cyBhbmQgcHJvYmFiaWxpdHkgZGVuc2l0eSBwbG90cyBiYXNlZCBvbiByYXcgZGF0YS4gKEMpIFByZWRpY3RlZCBQZSBtZWFuIGFtcGxpdHVkZSB2YWx1ZXMgYnkgZ3JvdXAgYW5kIHREQ1MgY29uZGl0aW9uLCBjYWxjdWxhdGVkIGFzIHBhcnRpYWwgZWZmZWN0cyBmcm9tIGxpbmVhciBtaXhlZCBtb2RlbHMuIEVycm9yIGJhcnMgcmVwcmVzZW50IDk1JSBDSXMuIn0NCg0KIyBPdmVybGF5IHdhdmVmb3JtcyBhbmQgdHBvcGdyYXBoeSBwbG90cw0KYWxpZ25lZF9wbG90czFfUGUgIDwtIGFsaWduX3Bsb3RzKHBsb3Rfd2F2ZWZvcm1fUGUsIHBsb3RfdG9wb19IQ19QZSwgIGF4aXMgPSAidHIiKQ0KYWxpZ25lZF9wbG90czJfUGUgIDwtIGFsaWduX3Bsb3RzKHBsb3Rfd2F2ZWZvcm1fUGUsIHBsb3RfdG9wb19PQ0RfUGUsIGF4aXMgPSAidHIiKQ0KDQoNCiMgQXJyYW5nZSBwbG90cw0KZmlndXJlX1BlIDwtIGdnZHJhdygpICsNCiAgZHJhd19wbG90KGFsaWduZWRfcGxvdHMxX1BlW1sxXV0sIHggPSAgMCwgICB5ID0gLjA1LCAgd2lkdGggPSAuNzY1LCBoZWlnaHQgPSAuOTIpICsNCiAgZHJhd19wbG90KGFsaWduZWRfcGxvdHMxX1BlW1syXV0sIHggPSAuMDcsICB5ID0gLjY2NCwgd2lkdGggPSAuMywgICBoZWlnaHQgPSAuMjIpICsNCiAgZHJhd19wbG90KGFsaWduZWRfcGxvdHMyX1BlW1syXV0sIHggPSAuNDQ3LCB5ID0gLjY2NCwgd2lkdGggPSAuMywgICBoZWlnaHQgPSAuMjIpICsNCiAgZHJhd19wbG90KHBsb3RfYm94X2RlbnNpdHlfUGUsICAgIHggPSAuNzcsICB5ID0gLjQ4LCAgd2lkdGggPSAuMjUsICBoZWlnaHQgPSAuNDcpICsNCiAgZHJhd19wbG90KHBsb3RfTE1NX1BlLCAgICAgICAgICAgIHggPSAuNzc0LCB5ID0gLjA1LCAgd2lkdGggPSAuMjUsICBoZWlnaHQgPSAuNDgpICsNCiAgZHJhd19wbG90KGxlZ2VuZF9QZSwgICAgICAgICAgICAgIHggPSAuMywgICB5ID0gLjAxLCAgd2lkdGggPSAuMiwgICBoZWlnaHQgPSAuMDEpICsNCiAgZHJhd19wbG90X2xhYmVsKGMoIkEiLCAiQiIsICJDIiksIGMoMCwgLjc1LCAuNzUpLCBjKDEsIDEsIC41OCksIHNpemUgPSAxNSkNCmZpZ3VyZV9QZQ0KDQoNCiMgU2F2ZSBwbG90DQpnZ3NhdmUocGxvdCA9IGZpZ3VyZV9QZSwgIi4vZmlndXJlcy9maWd1cmVfUGUudGlmZiIsIHdpZHRoID0gMjAsIGhlaWdodCA9IDEyLA0KICAgICAgIHVuaXRzID0gImNtIiwgZHBpID0gNjAwLCBjb21wcmVzc2lvbiA9ICJsenciKQ0KYGBgDQo8YnI+PGJyPg0KDQojIyBTZXNzaW9uIEluZm8NCioqKg0KDQpgYGB7ciBzZXNzaW9uLWluZm99DQoNCnNlc3Npb25JbmZvKCkNCmBgYA0K