Setup

setwd("~/Dropbox/EStroop (Hunter ERT fMRI)/Data/")
library(tidyverse)
Registered S3 method overwritten by 'rvest':
  method            from
  read_xml.response xml2
── Attaching packages ───────────────────────────────────────────────────────────────────────────────────────────── tidyverse 1.2.1 ──
✔ ggplot2 3.2.0     ✔ purrr   0.3.2
✔ tibble  2.1.3     ✔ dplyr   0.8.1
✔ tidyr   0.8.3     ✔ stringr 1.4.0
✔ readr   1.3.1     ✔ forcats 0.4.0
── Conflicts ──────────────────────────────────────────────────────────────────────────────────────────────── tidyverse_conflicts() ──
✖ .GlobalEnv::filter() masks dplyr::filter(), stats::filter()
✖ dplyr::lag()         masks stats::lag()
library(stats)
library(haven)
library(psych)

Attaching package: ‘psych’

The following objects are masked from ‘package:ggplot2’:

    %+%, alpha
library(MASS)

Attaching package: ‘MASS’

The following object is masked _by_ ‘.GlobalEnv’:

    select

The following object is masked from ‘package:dplyr’:

    select
select <- dplyr::select
filter <- dplyr::filter
EStroop_NewDataset_allSRIAdata <- read_sav("~/Dropbox/EStroop (Hunter ERT fMRI)/Data/EStroop_NewDataset_allSRIAdata.sav")
EStroop_NewDataset_allSRIAdata <- EStroop_NewDataset_allSRIAdata %>% filter(`filter_$` == 1)
tots <- select(EStroop_NewDataset_allSRIAdata, c("ERT_ID", "TOT_ACS_Focus_11", "TOT_ACS_Focus_33", "TOT_ACS_Shift_11", "TOT_ACS_Shift_33", "TOT_ACS_11", "TOT_ACS_33", "TOT_EQ_decenter_11", "TOT_EQ_decenter_33", "TOT_ERQ_Reappraisal_11", "TOT_ERQ_Reappraisal_33", "IA_T11MDD_CSR_CUR_ALL", "IA_T33MDD_CSR_CUR_ALL", "IA_ADISgad1109b","IA_ADISgad3309b")) %>% mutate(ERT_ID = as.integer(ERT_ID))
#"TOT_MDD_CSR_11", "TOT_MDD_CSR_33", "TOT_GAD_CSR_11","TOT_GAD_CSR_33"
data <- read.csv("estroop-hunter-fmri.csv")
betas <- read.csv("betas_pre_post_con4__10_54_32_roi.csv")
data <- data %>% filter(`filter_.` == 1) # filter only participants w/estroop fmri data
data <- select(data, -contains("roi")) # get rid of old ROI variables
data <- select(data, -contains("con2")) # get rid of old ROI variables
dat <- left_join(data, betas, by="ERT_ID")
dat <- left_join(dat, tots, by = "ERT_ID")
# get standardized residuals
dat$stdres_prepost_con4_10_54_32 <-stdres(lm(prepost_con4_10_54_32_POST ~ prepost_con4_10_54_32_PRE, dat))
dat$stdres_ACS_Focus <- stdres(lm(TOT_ACS_Focus_33 ~ TOT_ACS_Focus_11, data = dat))
dat$stdres_ACS_Shift <- stdres(lm(TOT_ACS_Shift_33 ~ TOT_ACS_Shift_11, data = dat))
dat$stdres_ACS_total <- stdres(lm(TOT_ACS_33 ~ TOT_ACS_11, data = dat))
dat$stdres_EQ_Decenter <- stdres(lm(TOT_EQ_decenter_33 ~ TOT_EQ_decenter_11, data = dat))
dat$stdres_ERQ_Reappraisal <- stdres(lm(TOT_ERQ_Reappraisal_33 ~ TOT_ERQ_Reappraisal_11, data = dat))
dat$stdres_GAD_CSR <- stdres(lm(IA_ADISgad3309b ~ IA_ADISgad1109b, data = dat))
dat$stdres_MDD_CSR <- stdres(lm(IA_T33MDD_CSR_CUR_ALL ~ IA_T11MDD_CSR_CUR_ALL, data = dat))

Scatterplots

Checking for outliers etc…

plot(stdres_ACS_Focus ~ stdres_prepost_con4_10_54_32, dat)

plot(stdres_ACS_Shift ~ stdres_prepost_con4_10_54_32, dat)

plot(stdres_ACS_total ~ stdres_prepost_con4_10_54_32, dat)

plot(stdres_ERQ_Reappraisal ~ stdres_prepost_con4_10_54_32, dat)

plot(stdres_EQ_Decenter ~ stdres_prepost_con4_10_54_32, dat)

plot(stdres_MDD_CSR ~ stdres_prepost_con4_10_54_32, dat)

plot(stdres_GAD_CSR ~ stdres_prepost_con4_10_54_32, dat)

Correlations

cor.test(dat$stdres_prepost_con4_10_54_32, dat$stdres_ACS_Focus)

    Pearson's product-moment correlation

data:  dat$stdres_prepost_con4_10_54_32 and dat$stdres_ACS_Focus
t = -2.4198, df = 18, p-value = 0.02633
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
 -0.76929555 -0.06777341
sample estimates:
       cor 
-0.4954355 
cor.test(dat$stdres_prepost_con4_10_54_32, dat$stdres_ACS_Shift)

    Pearson's product-moment correlation

data:  dat$stdres_prepost_con4_10_54_32 and dat$stdres_ACS_Shift
t = -2.1519, df = 18, p-value = 0.04523
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
 -0.74561432 -0.01228234
sample estimates:
       cor 
-0.4523445 
cor.test(dat$stdres_prepost_con4_10_54_32, dat$stdres_ACS_total)

    Pearson's product-moment correlation

data:  dat$stdres_prepost_con4_10_54_32 and dat$stdres_ACS_total
t = -2.6071, df = 18, p-value = 0.01783
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
 -0.7843511 -0.1054634
sample estimates:
       cor 
-0.5235502 
cor.test(dat$stdres_prepost_con4_10_54_32, dat$stdres_ERQ_Reappraisal)

    Pearson's product-moment correlation

data:  dat$stdres_prepost_con4_10_54_32 and dat$stdres_ERQ_Reappraisal
t = -0.72915, df = 18, p-value = 0.4753
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
 -0.5692333  0.2952740
sample estimates:
       cor 
-0.1693786 
cor.test(dat$stdres_prepost_con4_10_54_32, dat$stdres_EQ_Decenter)

    Pearson's product-moment correlation

data:  dat$stdres_prepost_con4_10_54_32 and dat$stdres_EQ_Decenter
t = -1.1995, df = 18, p-value = 0.2459
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
 -0.6377917  0.1937976
sample estimates:
       cor 
-0.2720544 
cor.test(dat$stdres_prepost_con4_10_54_32, dat$stdres_MDD_CSR)

    Pearson's product-moment correlation

data:  dat$stdres_prepost_con4_10_54_32 and dat$stdres_MDD_CSR
t = 0.54549, df = 18, p-value = 0.5921
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
 -0.3338359  0.5395943
sample estimates:
      cor 
0.1275239 
cor.test(dat$stdres_prepost_con4_10_54_32, dat$stdres_GAD_CSR)

    Pearson's product-moment correlation

data:  dat$stdres_prepost_con4_10_54_32 and dat$stdres_GAD_CSR
t = 1.8347, df = 18, p-value = 0.08314
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
 -0.05532568  0.71402123
sample estimates:
      cor 
0.3969126 

Testing dependent correlations

ACS-Shift

dmPFC and ACS-Shift, vs. dmPFC and EQ-Decenter

library(cocor)
?cocor
## j = brain region, k = outcome A (attentional), h = outcome B (clinical/metacog.)
# dmPFC and ACS-Shift, vs. dmPFC and EQ-Decenter
r.jk <- cor(dat$stdres_ACS_Shift, dat$stdres_prepost_con4_10_54_32)
r.jh <- cor(dat$stdres_EQ_Decenter, dat$stdres_prepost_con4_10_54_32)
r.kh <- cor(dat$stdres_ACS_Shift, dat$stdres_EQ_Decenter)
cocor.dep.groups.overlap(r.jk, r.jh, r.kh, n=20, alternative="two.sided", alpha=0.05, conf.level=0.95, null.value=0,  return.htest=FALSE, test=c("steiger1980", "zou2007"))

  Results of a comparison of two overlapping correlations based on dependent groups

Comparison between r.jk = -0.4523 and r.jh = -0.2721
Difference: r.jk - r.jh = -0.1803
Related correlation: r.kh = 0.7206
Group size: n = 20
Null hypothesis: r.jk is equal to r.jh
Alternative hypothesis: r.jk is not equal to r.jh (two-sided)
Alpha: 0.05

steiger1980: Steiger's (1980) modification of Dunn and Clark's z (1969) using average correlations
  z = -1.0837, p-value = 0.2785
  Null hypothesis retained

zou2007: Zou's (2007) confidence interval
  95% confidence interval for r.jk - r.jh: -0.5191 0.1448
  Null hypothesis retained (Interval includes 0)

dmPFC and ACS-Shift, vs. dmPFC and ERQ-Reappraisal

# dmPFC and ACS-Shift, vs. dmPFC and ERQ-Reappraisal
r.jk <- cor(dat$stdres_ACS_Shift, dat$stdres_prepost_con4_10_54_32)
r.jh <- cor(dat$stdres_ERQ_Reappraisal, dat$stdres_prepost_con4_10_54_32)
r.kh <- cor(dat$stdres_ACS_Shift, dat$stdres_ERQ_Reappraisal)
cocor.dep.groups.overlap(r.jk, r.jh, r.kh, n=20, alternative="two.sided", alpha=0.05, conf.level=0.95, null.value=0,  return.htest=FALSE, test=c("steiger1980", "zou2007"))

  Results of a comparison of two overlapping correlations based on dependent groups

Comparison between r.jk = -0.4523 and r.jh = -0.1694
Difference: r.jk - r.jh = -0.283
Related correlation: r.kh = 0.5768
Group size: n = 20
Null hypothesis: r.jk is equal to r.jh
Alternative hypothesis: r.jk is not equal to r.jh (two-sided)
Alpha: 0.05

steiger1980: Steiger's (1980) modification of Dunn and Clark's z (1969) using average correlations
  z = -1.3641, p-value = 0.1725
  Null hypothesis retained

zou2007: Zou's (2007) confidence interval
  95% confidence interval for r.jk - r.jh: -0.6726 0.1166
  Null hypothesis retained (Interval includes 0)

ACS-Focus

dmPFC and ACS-Focus, vs. dmPFC and EQ-Decenter

# dmPFC and ACS-Focus, vs. dmPFC and EQ-Decenter
r.jk <- cor(dat$stdres_ACS_Focus, dat$stdres_prepost_con4_10_54_32)
r.jh <- cor(dat$stdres_EQ_Decenter, dat$stdres_prepost_con4_10_54_32)
r.kh <- cor(dat$stdres_ACS_Focus, dat$stdres_EQ_Decenter)
cocor.dep.groups.overlap(r.jk, r.jh, r.kh, n=20, alternative="two.sided", alpha=0.05, conf.level=0.95, null.value=0,  return.htest=FALSE, test=c("steiger1980", "zou2007"))

  Results of a comparison of two overlapping correlations based on dependent groups

Comparison between r.jk = -0.4954 and r.jh = -0.2721
Difference: r.jk - r.jh = -0.2234
Related correlation: r.kh = 0.6413
Group size: n = 20
Null hypothesis: r.jk is equal to r.jh
Alternative hypothesis: r.jk is not equal to r.jh (two-sided)
Alpha: 0.05

steiger1980: Steiger's (1980) modification of Dunn and Clark's z (1969) using average correlations
  z = -1.2062, p-value = 0.2277
  Null hypothesis retained

zou2007: Zou's (2007) confidence interval
  95% confidence interval for r.jk - r.jh: -0.5966 0.1363
  Null hypothesis retained (Interval includes 0)

dmPFC and ACS-Focus, vs. dmPFC and ERQ-Reappraisal

# dmPFC and ACS-Focus, vs. dmPFC and ERQ-Reappraisal
r.jk <- cor(dat$stdres_ACS_Focus, dat$stdres_prepost_con4_10_54_32)
r.jh <- cor(dat$stdres_ERQ_Reappraisal, dat$stdres_prepost_con4_10_54_32)
r.kh <- cor(dat$stdres_ACS_Focus, dat$stdres_ERQ_Reappraisal)
cocor.dep.groups.overlap(r.jk, r.jh, r.kh, n=20, alternative="two.sided", alpha=0.05, conf.level=0.95, null.value=0,  return.htest=FALSE, test=c("steiger1980", "zou2007"))

  Results of a comparison of two overlapping correlations based on dependent groups

Comparison between r.jk = -0.4954 and r.jh = -0.1694
Difference: r.jk - r.jh = -0.3261
Related correlation: r.kh = 0.5443
Group size: n = 20
Null hypothesis: r.jk is equal to r.jh
Alternative hypothesis: r.jk is not equal to r.jh (two-sided)
Alpha: 0.05

steiger1980: Steiger's (1980) modification of Dunn and Clark's z (1969) using average correlations
  z = -1.5381, p-value = 0.1240
  Null hypothesis retained

zou2007: Zou's (2007) confidence interval
  95% confidence interval for r.jk - r.jh: -0.7260 0.0824
  Null hypothesis retained (Interval includes 0)

ACS Total

dmPFC and ACS total, vs. dmPFC and ERQ-Reappraisal

# dmPFC and ACS total, vs. dmPFC and ERQ-Reappraisal
r.jk <- cor(dat$stdres_ACS_total, dat$stdres_prepost_con4_10_54_32)
r.jh <- cor(dat$stdres_ERQ_Reappraisal, dat$stdres_prepost_con4_10_54_32)
r.kh <- cor(dat$stdres_ACS_total, dat$stdres_ERQ_Reappraisal)
cocor.dep.groups.overlap(r.jk, r.jh, r.kh, n=20, alternative="two.sided", alpha=0.05, conf.level=0.95, null.value=0,  return.htest=FALSE, test=c("steiger1980", "zou2007"))

  Results of a comparison of two overlapping correlations based on dependent groups

Comparison between r.jk = -0.5236 and r.jh = -0.1694
Difference: r.jk - r.jh = -0.3542
Related correlation: r.kh = 0.6454
Group size: n = 20
Null hypothesis: r.jk is equal to r.jh
Alternative hypothesis: r.jk is not equal to r.jh (two-sided)
Alpha: 0.05

steiger1980: Steiger's (1980) modification of Dunn and Clark's z (1969) using average correlations
  z = -1.9071, p-value = 0.0565
  Null hypothesis retained

zou2007: Zou's (2007) confidence interval
  95% confidence interval for r.jk - r.jh: -0.7196 0.0025
  Null hypothesis retained (Interval includes 0)

dmPFC and ACS total, vs. dmPFC and EQ-Decenter

# dmPFC and ACS total, vs. dmPFC and EQ-Decenter
r.jk <- cor(dat$stdres_ACS_total, dat$stdres_prepost_con4_10_54_32)
r.jh <- cor(dat$stdres_EQ_Decenter, dat$stdres_prepost_con4_10_54_32)
r.kh <- cor(dat$stdres_ACS_total, dat$stdres_EQ_Decenter)
cocor.dep.groups.overlap(r.jk, r.jh, r.kh, n=20, alternative="two.sided", alpha=0.05, conf.level=0.95, null.value=0,  return.htest=FALSE, test=c("steiger1980", "zou2007"))

  Results of a comparison of two overlapping correlations based on dependent groups

Comparison between r.jk = -0.5236 and r.jh = -0.2721
Difference: r.jk - r.jh = -0.2515
Related correlation: r.kh = 0.7694
Group size: n = 20
Null hypothesis: r.jk is equal to r.jh
Alternative hypothesis: r.jk is not equal to r.jh (two-sided)
Alpha: 0.05

steiger1980: Steiger's (1980) modification of Dunn and Clark's z (1969) using average correlations
  z = -1.7013, p-value = 0.0889
  Null hypothesis retained

zou2007: Zou's (2007) confidence interval
  95% confidence interval for r.jk - r.jh: -0.5760 0.0354
  Null hypothesis retained (Interval includes 0)

GAD vs. MDD CSR

dmPFC and GAD CSR vs. dmPFC and MDD CSR

# dmPFC and GAD CSR, vs. dmPFC and MDD CSR
r.jk <- cor(dat$stdres_GAD_CSR, dat$stdres_prepost_con4_10_54_32)
r.jh <- cor(dat$stdres_MDD_CSR, dat$stdres_prepost_con4_10_54_32)
r.kh <- cor(dat$stdres_GAD_CSR, dat$stdres_MDD_CSR)
cocor.dep.groups.overlap(r.jk, r.jh, r.kh, n=20, alternative="two.sided", alpha=0.05, conf.level=0.95, null.value=0,  return.htest=FALSE, test=c("steiger1980", "zou2007"))

  Results of a comparison of two overlapping correlations based on dependent groups

Comparison between r.jk = 0.3969 and r.jh = 0.1275
Difference: r.jk - r.jh = 0.2694
Related correlation: r.kh = 0.4432
Group size: n = 20
Null hypothesis: r.jk is equal to r.jh
Alternative hypothesis: r.jk is not equal to r.jh (two-sided)
Alpha: 0.05

steiger1980: Steiger's (1980) modification of Dunn and Clark's z (1969) using average correlations
  z = 1.1115, p-value = 0.2664
  Null hypothesis retained

zou2007: Zou's (2007) confidence interval
  95% confidence interval for r.jk - r.jh: -0.1963 0.7050
  Null hypothesis retained (Interval includes 0)

Figures

library(ggplot2)
ggplot(dat, aes(stdres_ACS_Shift, stdres_prepost_con4_10_54_32)) +
  geom_point(size=2) + 
  labs(y = "Δ dmPFC (10, 54, 32)", x = "Δ ACS-Shift") +
  ggtitle("Association between pre-post change in self-reported attentional \nshifting and change in dmPFC activation on iI vs. cI trials \n") +
  geom_smooth(method=lm, linetype="solid", color="gray59", fill="lightgray") +
  theme_light() +
  theme(axis.text = element_text(size = 13), axis.title = element_text(size=14), plot.title = element_text(size=12))

ggsave("estroop-scatter_acs_shift.png",dpi=700)
Saving 5.5 x 5.5 in image
ggplot(dat, aes(stdres_ACS_Focus, stdres_prepost_con4_10_54_32)) +
  geom_point(size=2) + 
  labs(y = "Δ dmPFC (10, 54, 32)", x = "Δ ACS-Focus") +
  ggtitle("Association between pre-post change in self-reported attentional \nfocus and change in dmPFC activation on iI vs. cI trials \n") +
  geom_smooth(method=lm, linetype="solid", color="gray59", fill="lightgray") +
  theme_light() +
  theme(axis.text = element_text(size = 13), axis.title = element_text(size=14), plot.title = element_text(size=12))

ggsave("estroop-scatter_acs_focus.png",dpi=700)
Saving 5.5 x 5.5 in image
ggplot(dat, aes(stdres_ACS_total, stdres_prepost_con4_10_54_32)) +
  geom_point(size=2) + 
  labs(y = "Δ dmPFC (10, 54, 32)", x = "Δ ACS Total") +
  ggtitle("Association between pre-post change in self-reported attentional \ncontrol and change in dmPFC activation on iI vs. cI trials \n") +
  geom_smooth(method=lm, linetype="solid", color="gray59", fill="lightgray") +
  theme_light() +
  theme(axis.text = element_text(size = 13), axis.title = element_text(size=14), plot.title = element_text(size=12))

ggsave("estroop-scatter_acs_total.png",dpi=700)
Saving 5.5 x 5.5 in image
LS0tCnRpdGxlOiAiSHVudGVyIEVzdHJvb3AgZk1SSTogbmV3IGFuYXlzZXMgYmFzZWQgb24gZk1SSSBwYWlyZWQgdC10ZXN0IHJlc3VsdHMiCmF1dGhvcjogIlNhcmVuIFNlZWxleSIKZGF0ZTogIjA4LTIzLTIwMTkiCm91dHB1dDoKICBodG1sX25vdGVib29rOgogICAgbnVtYmVyX3NlY3Rpb25zOiBubwogICAgdGhlbWU6IHBhcGVyCiAgICB0b2M6IHllcwogICAgdG9jX2Zsb2F0OiB5ZXMKICBodG1sX2RvY3VtZW50OgogICAgZGZfcHJpbnQ6IHBhZ2VkCiAgICB0b2M6IHllcwotLS0KI1NldHVwCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpCmBgYAoKCmBgYHtyfQpzZXR3ZCgifi9Ecm9wYm94L0VTdHJvb3AgKEh1bnRlciBFUlQgZk1SSSkvRGF0YS8iKQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShzdGF0cykKbGlicmFyeShoYXZlbikKbGlicmFyeShwc3ljaCkKbGlicmFyeShNQVNTKQpzZWxlY3QgPC0gZHBseXI6OnNlbGVjdApmaWx0ZXIgPC0gZHBseXI6OmZpbHRlcgoKRVN0cm9vcF9OZXdEYXRhc2V0X2FsbFNSSUFkYXRhIDwtIHJlYWRfc2F2KCJ+L0Ryb3Bib3gvRVN0cm9vcCAoSHVudGVyIEVSVCBmTVJJKS9EYXRhL0VTdHJvb3BfTmV3RGF0YXNldF9hbGxTUklBZGF0YS5zYXYiKQpFU3Ryb29wX05ld0RhdGFzZXRfYWxsU1JJQWRhdGEgPC0gRVN0cm9vcF9OZXdEYXRhc2V0X2FsbFNSSUFkYXRhICU+JSBmaWx0ZXIoYGZpbHRlcl8kYCA9PSAxKQoKdG90cyA8LSBzZWxlY3QoRVN0cm9vcF9OZXdEYXRhc2V0X2FsbFNSSUFkYXRhLCBjKCJFUlRfSUQiLCAiVE9UX0FDU19Gb2N1c18xMSIsICJUT1RfQUNTX0ZvY3VzXzMzIiwgIlRPVF9BQ1NfU2hpZnRfMTEiLCAiVE9UX0FDU19TaGlmdF8zMyIsICJUT1RfQUNTXzExIiwgIlRPVF9BQ1NfMzMiLCAiVE9UX0VRX2RlY2VudGVyXzExIiwgIlRPVF9FUV9kZWNlbnRlcl8zMyIsICJUT1RfRVJRX1JlYXBwcmFpc2FsXzExIiwgIlRPVF9FUlFfUmVhcHByYWlzYWxfMzMiLCAiSUFfVDExTUREX0NTUl9DVVJfQUxMIiwgIklBX1QzM01ERF9DU1JfQ1VSX0FMTCIsICJJQV9BRElTZ2FkMTEwOWIiLCJJQV9BRElTZ2FkMzMwOWIiKSkgJT4lIG11dGF0ZShFUlRfSUQgPSBhcy5pbnRlZ2VyKEVSVF9JRCkpCgojIlRPVF9NRERfQ1NSXzExIiwgIlRPVF9NRERfQ1NSXzMzIiwgIlRPVF9HQURfQ1NSXzExIiwiVE9UX0dBRF9DU1JfMzMiCmRhdGEgPC0gcmVhZC5jc3YoImVzdHJvb3AtaHVudGVyLWZtcmkuY3N2IikKYmV0YXMgPC0gcmVhZC5jc3YoImJldGFzX3ByZV9wb3N0X2NvbjRfXzEwXzU0XzMyX3JvaS5jc3YiKQpkYXRhIDwtIGRhdGEgJT4lIGZpbHRlcihgZmlsdGVyXy5gID09IDEpICMgZmlsdGVyIG9ubHkgcGFydGljaXBhbnRzIHcvZXN0cm9vcCBmbXJpIGRhdGEKCmRhdGEgPC0gc2VsZWN0KGRhdGEsIC1jb250YWlucygicm9pIikpICMgZ2V0IHJpZCBvZiBvbGQgUk9JIHZhcmlhYmxlcwpkYXRhIDwtIHNlbGVjdChkYXRhLCAtY29udGFpbnMoImNvbjIiKSkgIyBnZXQgcmlkIG9mIG9sZCBST0kgdmFyaWFibGVzCgpkYXQgPC0gbGVmdF9qb2luKGRhdGEsIGJldGFzLCBieT0iRVJUX0lEIikKZGF0IDwtIGxlZnRfam9pbihkYXQsIHRvdHMsIGJ5ID0gIkVSVF9JRCIpCgojIGdldCBzdGFuZGFyZGl6ZWQgcmVzaWR1YWxzCmRhdCRzdGRyZXNfcHJlcG9zdF9jb240XzEwXzU0XzMyIDwtc3RkcmVzKGxtKHByZXBvc3RfY29uNF8xMF81NF8zMl9QT1NUIH4gcHJlcG9zdF9jb240XzEwXzU0XzMyX1BSRSwgZGF0KSkKZGF0JHN0ZHJlc19BQ1NfRm9jdXMgPC0gc3RkcmVzKGxtKFRPVF9BQ1NfRm9jdXNfMzMgfiBUT1RfQUNTX0ZvY3VzXzExLCBkYXRhID0gZGF0KSkKZGF0JHN0ZHJlc19BQ1NfU2hpZnQgPC0gc3RkcmVzKGxtKFRPVF9BQ1NfU2hpZnRfMzMgfiBUT1RfQUNTX1NoaWZ0XzExLCBkYXRhID0gZGF0KSkKZGF0JHN0ZHJlc19BQ1NfdG90YWwgPC0gc3RkcmVzKGxtKFRPVF9BQ1NfMzMgfiBUT1RfQUNTXzExLCBkYXRhID0gZGF0KSkKZGF0JHN0ZHJlc19FUV9EZWNlbnRlciA8LSBzdGRyZXMobG0oVE9UX0VRX2RlY2VudGVyXzMzIH4gVE9UX0VRX2RlY2VudGVyXzExLCBkYXRhID0gZGF0KSkKZGF0JHN0ZHJlc19FUlFfUmVhcHByYWlzYWwgPC0gc3RkcmVzKGxtKFRPVF9FUlFfUmVhcHByYWlzYWxfMzMgfiBUT1RfRVJRX1JlYXBwcmFpc2FsXzExLCBkYXRhID0gZGF0KSkKZGF0JHN0ZHJlc19HQURfQ1NSIDwtIHN0ZHJlcyhsbShJQV9BRElTZ2FkMzMwOWIgfiBJQV9BRElTZ2FkMTEwOWIsIGRhdGEgPSBkYXQpKQpkYXQkc3RkcmVzX01ERF9DU1IgPC0gc3RkcmVzKGxtKElBX1QzM01ERF9DU1JfQ1VSX0FMTCB+IElBX1QxMU1ERF9DU1JfQ1VSX0FMTCwgZGF0YSA9IGRhdCkpCmBgYAoKIyBTY2F0dGVycGxvdHMKQ2hlY2tpbmcgZm9yIG91dGxpZXJzIGV0Yy4uLgpgYGB7cn0KcGxvdChzdGRyZXNfQUNTX0ZvY3VzIH4gc3RkcmVzX3ByZXBvc3RfY29uNF8xMF81NF8zMiwgZGF0KQpwbG90KHN0ZHJlc19BQ1NfU2hpZnQgfiBzdGRyZXNfcHJlcG9zdF9jb240XzEwXzU0XzMyLCBkYXQpCnBsb3Qoc3RkcmVzX0FDU190b3RhbCB+IHN0ZHJlc19wcmVwb3N0X2NvbjRfMTBfNTRfMzIsIGRhdCkKcGxvdChzdGRyZXNfRVJRX1JlYXBwcmFpc2FsIH4gc3RkcmVzX3ByZXBvc3RfY29uNF8xMF81NF8zMiwgZGF0KQpwbG90KHN0ZHJlc19FUV9EZWNlbnRlciB+IHN0ZHJlc19wcmVwb3N0X2NvbjRfMTBfNTRfMzIsIGRhdCkKcGxvdChzdGRyZXNfTUREX0NTUiB+IHN0ZHJlc19wcmVwb3N0X2NvbjRfMTBfNTRfMzIsIGRhdCkKcGxvdChzdGRyZXNfR0FEX0NTUiB+IHN0ZHJlc19wcmVwb3N0X2NvbjRfMTBfNTRfMzIsIGRhdCkKYGBgCgojIENvcnJlbGF0aW9ucwpgYGB7cn0KY29yLnRlc3QoZGF0JHN0ZHJlc19wcmVwb3N0X2NvbjRfMTBfNTRfMzIsIGRhdCRzdGRyZXNfQUNTX0ZvY3VzKQpjb3IudGVzdChkYXQkc3RkcmVzX3ByZXBvc3RfY29uNF8xMF81NF8zMiwgZGF0JHN0ZHJlc19BQ1NfU2hpZnQpCmNvci50ZXN0KGRhdCRzdGRyZXNfcHJlcG9zdF9jb240XzEwXzU0XzMyLCBkYXQkc3RkcmVzX0FDU190b3RhbCkKY29yLnRlc3QoZGF0JHN0ZHJlc19wcmVwb3N0X2NvbjRfMTBfNTRfMzIsIGRhdCRzdGRyZXNfRVJRX1JlYXBwcmFpc2FsKQpjb3IudGVzdChkYXQkc3RkcmVzX3ByZXBvc3RfY29uNF8xMF81NF8zMiwgZGF0JHN0ZHJlc19FUV9EZWNlbnRlcikKY29yLnRlc3QoZGF0JHN0ZHJlc19wcmVwb3N0X2NvbjRfMTBfNTRfMzIsIGRhdCRzdGRyZXNfTUREX0NTUikKY29yLnRlc3QoZGF0JHN0ZHJlc19wcmVwb3N0X2NvbjRfMTBfNTRfMzIsIGRhdCRzdGRyZXNfR0FEX0NTUikKYGBgCgojIFRlc3RpbmcgZGVwZW5kZW50IGNvcnJlbGF0aW9ucwoKIyMgQUNTLVNoaWZ0CiMjIyBkbVBGQyBhbmQgQUNTLVNoaWZ0LCB2cy4gZG1QRkMgYW5kIEVRLURlY2VudGVyCmBgYHtyfQpsaWJyYXJ5KGNvY29yKQojIyBqID0gYnJhaW4gcmVnaW9uLCBrID0gb3V0Y29tZSBBIChhdHRlbnRpb25hbCksIGggPSBvdXRjb21lIEIgKGNsaW5pY2FsL21ldGFjb2cuKQoKIyBkbVBGQyBhbmQgQUNTLVNoaWZ0LCB2cy4gZG1QRkMgYW5kIEVRLURlY2VudGVyCnIuamsgPC0gY29yKGRhdCRzdGRyZXNfQUNTX1NoaWZ0LCBkYXQkc3RkcmVzX3ByZXBvc3RfY29uNF8xMF81NF8zMikKci5qaCA8LSBjb3IoZGF0JHN0ZHJlc19FUV9EZWNlbnRlciwgZGF0JHN0ZHJlc19wcmVwb3N0X2NvbjRfMTBfNTRfMzIpCnIua2ggPC0gY29yKGRhdCRzdGRyZXNfQUNTX1NoaWZ0LCBkYXQkc3RkcmVzX0VRX0RlY2VudGVyKQpjb2Nvci5kZXAuZ3JvdXBzLm92ZXJsYXAoci5qaywgci5qaCwgci5raCwgbj0yMCwgYWx0ZXJuYXRpdmU9InR3by5zaWRlZCIsIGFscGhhPTAuMDUsIGNvbmYubGV2ZWw9MC45NSwgbnVsbC52YWx1ZT0wLCAgcmV0dXJuLmh0ZXN0PUZBTFNFLCB0ZXN0PWMoInN0ZWlnZXIxOTgwIiwgInpvdTIwMDciKSkKYGBgCgojIyMgZG1QRkMgYW5kIEFDUy1TaGlmdCwgdnMuIGRtUEZDIGFuZCBFUlEtUmVhcHByYWlzYWwKYGBge3J9CiMgZG1QRkMgYW5kIEFDUy1TaGlmdCwgdnMuIGRtUEZDIGFuZCBFUlEtUmVhcHByYWlzYWwKci5qayA8LSBjb3IoZGF0JHN0ZHJlc19BQ1NfU2hpZnQsIGRhdCRzdGRyZXNfcHJlcG9zdF9jb240XzEwXzU0XzMyKQpyLmpoIDwtIGNvcihkYXQkc3RkcmVzX0VSUV9SZWFwcHJhaXNhbCwgZGF0JHN0ZHJlc19wcmVwb3N0X2NvbjRfMTBfNTRfMzIpCnIua2ggPC0gY29yKGRhdCRzdGRyZXNfQUNTX1NoaWZ0LCBkYXQkc3RkcmVzX0VSUV9SZWFwcHJhaXNhbCkKY29jb3IuZGVwLmdyb3Vwcy5vdmVybGFwKHIuamssIHIuamgsIHIua2gsIG49MjAsIGFsdGVybmF0aXZlPSJ0d28uc2lkZWQiLCBhbHBoYT0wLjA1LCBjb25mLmxldmVsPTAuOTUsIG51bGwudmFsdWU9MCwgIHJldHVybi5odGVzdD1GQUxTRSwgdGVzdD1jKCJzdGVpZ2VyMTk4MCIsICJ6b3UyMDA3IikpCmBgYAoKCgoKIyMgQUNTLUZvY3VzCiMjIyBkbVBGQyBhbmQgQUNTLUZvY3VzLCB2cy4gZG1QRkMgYW5kIEVRLURlY2VudGVyCmBgYHtyfQojIGRtUEZDIGFuZCBBQ1MtRm9jdXMsIHZzLiBkbVBGQyBhbmQgRVEtRGVjZW50ZXIKci5qayA8LSBjb3IoZGF0JHN0ZHJlc19BQ1NfRm9jdXMsIGRhdCRzdGRyZXNfcHJlcG9zdF9jb240XzEwXzU0XzMyKQpyLmpoIDwtIGNvcihkYXQkc3RkcmVzX0VRX0RlY2VudGVyLCBkYXQkc3RkcmVzX3ByZXBvc3RfY29uNF8xMF81NF8zMikKci5raCA8LSBjb3IoZGF0JHN0ZHJlc19BQ1NfRm9jdXMsIGRhdCRzdGRyZXNfRVFfRGVjZW50ZXIpCmNvY29yLmRlcC5ncm91cHMub3ZlcmxhcChyLmprLCByLmpoLCByLmtoLCBuPTIwLCBhbHRlcm5hdGl2ZT0idHdvLnNpZGVkIiwgYWxwaGE9MC4wNSwgY29uZi5sZXZlbD0wLjk1LCBudWxsLnZhbHVlPTAsICByZXR1cm4uaHRlc3Q9RkFMU0UsIHRlc3Q9Yygic3RlaWdlcjE5ODAiLCAiem91MjAwNyIpKQpgYGAKCiMjIyBkbVBGQyBhbmQgQUNTLUZvY3VzLCB2cy4gZG1QRkMgYW5kIEVSUS1SZWFwcHJhaXNhbApgYGB7cn0KIyBkbVBGQyBhbmQgQUNTLUZvY3VzLCB2cy4gZG1QRkMgYW5kIEVSUS1SZWFwcHJhaXNhbApyLmprIDwtIGNvcihkYXQkc3RkcmVzX0FDU19Gb2N1cywgZGF0JHN0ZHJlc19wcmVwb3N0X2NvbjRfMTBfNTRfMzIpCnIuamggPC0gY29yKGRhdCRzdGRyZXNfRVJRX1JlYXBwcmFpc2FsLCBkYXQkc3RkcmVzX3ByZXBvc3RfY29uNF8xMF81NF8zMikKci5raCA8LSBjb3IoZGF0JHN0ZHJlc19BQ1NfRm9jdXMsIGRhdCRzdGRyZXNfRVJRX1JlYXBwcmFpc2FsKQpjb2Nvci5kZXAuZ3JvdXBzLm92ZXJsYXAoci5qaywgci5qaCwgci5raCwgbj0yMCwgYWx0ZXJuYXRpdmU9InR3by5zaWRlZCIsIGFscGhhPTAuMDUsIGNvbmYubGV2ZWw9MC45NSwgbnVsbC52YWx1ZT0wLCAgcmV0dXJuLmh0ZXN0PUZBTFNFLCB0ZXN0PWMoInN0ZWlnZXIxOTgwIiwgInpvdTIwMDciKSkKYGBgCgoKCgojIyBBQ1MgVG90YWwKIyMjIGRtUEZDIGFuZCBBQ1MgdG90YWwsIHZzLiBkbVBGQyBhbmQgRVJRLVJlYXBwcmFpc2FsCmBgYHtyfQojIGRtUEZDIGFuZCBBQ1MgdG90YWwsIHZzLiBkbVBGQyBhbmQgRVJRLVJlYXBwcmFpc2FsCnIuamsgPC0gY29yKGRhdCRzdGRyZXNfQUNTX3RvdGFsLCBkYXQkc3RkcmVzX3ByZXBvc3RfY29uNF8xMF81NF8zMikKci5qaCA8LSBjb3IoZGF0JHN0ZHJlc19FUlFfUmVhcHByYWlzYWwsIGRhdCRzdGRyZXNfcHJlcG9zdF9jb240XzEwXzU0XzMyKQpyLmtoIDwtIGNvcihkYXQkc3RkcmVzX0FDU190b3RhbCwgZGF0JHN0ZHJlc19FUlFfUmVhcHByYWlzYWwpCmNvY29yLmRlcC5ncm91cHMub3ZlcmxhcChyLmprLCByLmpoLCByLmtoLCBuPTIwLCBhbHRlcm5hdGl2ZT0idHdvLnNpZGVkIiwgYWxwaGE9MC4wNSwgY29uZi5sZXZlbD0wLjk1LCBudWxsLnZhbHVlPTAsICByZXR1cm4uaHRlc3Q9RkFMU0UsIHRlc3Q9Yygic3RlaWdlcjE5ODAiLCAiem91MjAwNyIpKQpgYGAKCiMjIyBkbVBGQyBhbmQgQUNTIHRvdGFsLCB2cy4gZG1QRkMgYW5kIEVRLURlY2VudGVyCmBgYHtyfQojIGRtUEZDIGFuZCBBQ1MgdG90YWwsIHZzLiBkbVBGQyBhbmQgRVEtRGVjZW50ZXIKci5qayA8LSBjb3IoZGF0JHN0ZHJlc19BQ1NfdG90YWwsIGRhdCRzdGRyZXNfcHJlcG9zdF9jb240XzEwXzU0XzMyKQpyLmpoIDwtIGNvcihkYXQkc3RkcmVzX0VRX0RlY2VudGVyLCBkYXQkc3RkcmVzX3ByZXBvc3RfY29uNF8xMF81NF8zMikKci5raCA8LSBjb3IoZGF0JHN0ZHJlc19BQ1NfdG90YWwsIGRhdCRzdGRyZXNfRVFfRGVjZW50ZXIpCmNvY29yLmRlcC5ncm91cHMub3ZlcmxhcChyLmprLCByLmpoLCByLmtoLCBuPTIwLCBhbHRlcm5hdGl2ZT0idHdvLnNpZGVkIiwgYWxwaGE9MC4wNSwgY29uZi5sZXZlbD0wLjk1LCBudWxsLnZhbHVlPTAsICByZXR1cm4uaHRlc3Q9RkFMU0UsIHRlc3Q9Yygic3RlaWdlcjE5ODAiLCAiem91MjAwNyIpKQpgYGAKCiMjIEdBRCB2cy4gTUREIENTUgoKCiMjIyBkbVBGQyBhbmQgR0FEIENTUiB2cy4gZG1QRkMgYW5kIE1ERCBDU1IKYGBge3J9CiMgZG1QRkMgYW5kIEdBRCBDU1IsIHZzLiBkbVBGQyBhbmQgTUREIENTUgpyLmprIDwtIGNvcihkYXQkc3RkcmVzX0dBRF9DU1IsIGRhdCRzdGRyZXNfcHJlcG9zdF9jb240XzEwXzU0XzMyKQpyLmpoIDwtIGNvcihkYXQkc3RkcmVzX01ERF9DU1IsIGRhdCRzdGRyZXNfcHJlcG9zdF9jb240XzEwXzU0XzMyKQpyLmtoIDwtIGNvcihkYXQkc3RkcmVzX0dBRF9DU1IsIGRhdCRzdGRyZXNfTUREX0NTUikKY29jb3IuZGVwLmdyb3Vwcy5vdmVybGFwKHIuamssIHIuamgsIHIua2gsIG49MjAsIGFsdGVybmF0aXZlPSJ0d28uc2lkZWQiLCBhbHBoYT0wLjA1LCBjb25mLmxldmVsPTAuOTUsIG51bGwudmFsdWU9MCwgIHJldHVybi5odGVzdD1GQUxTRSwgdGVzdD1jKCJzdGVpZ2VyMTk4MCIsICJ6b3UyMDA3IikpCmBgYAoKIyMgRmlndXJlcwoKYGBge3IsIGZpZy5oZWlnaHQgPSA1LjUsIGZpZy53aWR0aCA9IDUuNSwgZmlnLmFsaWduID0gImNlbnRlciJ9CmxpYnJhcnkoZ2dwbG90MikKCmdncGxvdChkYXQsIGFlcyhzdGRyZXNfQUNTX1NoaWZ0LCBzdGRyZXNfcHJlcG9zdF9jb240XzEwXzU0XzMyKSkgKwogIGdlb21fcG9pbnQoc2l6ZT0yKSArIAogIGxhYnMoeSA9ICLOlCBkbVBGQyAoMTAsIDU0LCAzMikiLCB4ID0gIs6UIEFDUy1TaGlmdCIpICsKICBnZ3RpdGxlKCJBc3NvY2lhdGlvbiBiZXR3ZWVuIHByZS1wb3N0IGNoYW5nZSBpbiBzZWxmLXJlcG9ydGVkIGF0dGVudGlvbmFsIFxuc2hpZnRpbmcgYW5kIGNoYW5nZSBpbiBkbVBGQyBhY3RpdmF0aW9uIG9uIGlJIHZzLiBjSSB0cmlhbHMgXG4iKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kPWxtLCBsaW5ldHlwZT0ic29saWQiLCBjb2xvcj0iZ3JheTU5IiwgZmlsbD0ibGlnaHRncmF5IikgKwogIHRoZW1lX2xpZ2h0KCkgKwogIHRoZW1lKGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTMpLCBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTQpLCBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTIpKQoKZ2dzYXZlKCJlc3Ryb29wLXNjYXR0ZXJfYWNzX3NoaWZ0LnBuZyIsZHBpPTcwMCkKCmdncGxvdChkYXQsIGFlcyhzdGRyZXNfQUNTX0ZvY3VzLCBzdGRyZXNfcHJlcG9zdF9jb240XzEwXzU0XzMyKSkgKwogIGdlb21fcG9pbnQoc2l6ZT0yKSArIAogIGxhYnMoeSA9ICLOlCBkbVBGQyAoMTAsIDU0LCAzMikiLCB4ID0gIs6UIEFDUy1Gb2N1cyIpICsKICBnZ3RpdGxlKCJBc3NvY2lhdGlvbiBiZXR3ZWVuIHByZS1wb3N0IGNoYW5nZSBpbiBzZWxmLXJlcG9ydGVkIGF0dGVudGlvbmFsIFxuZm9jdXMgYW5kIGNoYW5nZSBpbiBkbVBGQyBhY3RpdmF0aW9uIG9uIGlJIHZzLiBjSSB0cmlhbHMgXG4iKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kPWxtLCBsaW5ldHlwZT0ic29saWQiLCBjb2xvcj0iZ3JheTU5IiwgZmlsbD0ibGlnaHRncmF5IikgKwogIHRoZW1lX2xpZ2h0KCkgKwogIHRoZW1lKGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTMpLCBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTQpLCBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTIpKQoKZ2dzYXZlKCJlc3Ryb29wLXNjYXR0ZXJfYWNzX2ZvY3VzLnBuZyIsZHBpPTcwMCkKCgpnZ3Bsb3QoZGF0LCBhZXMoc3RkcmVzX0FDU190b3RhbCwgc3RkcmVzX3ByZXBvc3RfY29uNF8xMF81NF8zMikpICsKICBnZW9tX3BvaW50KHNpemU9MikgKyAKICBsYWJzKHkgPSAizpQgZG1QRkMgKDEwLCA1NCwgMzIpIiwgeCA9ICLOlCBBQ1MgVG90YWwiKSArCiAgZ2d0aXRsZSgiQXNzb2NpYXRpb24gYmV0d2VlbiBwcmUtcG9zdCBjaGFuZ2UgaW4gc2VsZi1yZXBvcnRlZCBhdHRlbnRpb25hbCBcbmNvbnRyb2wgYW5kIGNoYW5nZSBpbiBkbVBGQyBhY3RpdmF0aW9uIG9uIGlJIHZzLiBjSSB0cmlhbHMgXG4iKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kPWxtLCBsaW5ldHlwZT0ic29saWQiLCBjb2xvcj0iZ3JheTU5IiwgZmlsbD0ibGlnaHRncmF5IikgKwogIHRoZW1lX2xpZ2h0KCkgKwogIHRoZW1lKGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTMpLCBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTQpLCBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTIpKQoKZ2dzYXZlKCJlc3Ryb29wLXNjYXR0ZXJfYWNzX3RvdGFsLnBuZyIsZHBpPTcwMCkKCmBgYAoK