Data extracted was tabulated in a google sheet. Then exported as csv file and imported in R (R Core Team (2017). R: A language and environment for statistical computing. R Foundation for Statistical Computing, Vienna, Austria. URL https://www.R-project.org/.)

Data cleaning and organization was done with package tidyverse (Hadley Wickham (2017). tidyverse: Easily Install and Load the ‘Tidyverse’. R package version 1.2.1. https://CRAN.R-project.org/package=tidyverse).

The package meta (Guido Schwarzer (2007), meta: An R package for meta-analysis, R News, 7(3), 40-45.) was used for the meta-analysis. A funnel plot was used to detect publication bias. The heterogenicity between studies was checked with I2 and visualized with a Baujat plot (Baujat B, Mahé C, Pignon JP, Hill C (2002), A graphical method for exploring heterogeneity in meta-analyses: Application to a meta-analysis of 65 trials. Statistics in Medicine, 30, 2641–2652.). We grouped the studies with same intervention and control and considered any adverse outcome. A random effect meta-analysis using odds-ratio as outcome was performed with a Mantel-Haenzel method. A forest plot was used to visualize the overall effect of the interventions, with a 95% confidence interval.

Paquetes

Dataset


df <- read_csv("https://docs.google.com/spreadsheets/d/e/2PACX-1vRSKuBlcQTVJK2fZyZ4Nvf4SwSqVrxcfAGhNhl6dWHU9W39oppE4Pl4lcPy-0CRGRTqQQ0IHwFgfrY8/pub?gid=0&single=true&output=csv")

Data cleaning

glimpse(df)

Clean dataset from empty rows, strange symbols, etc


df <- df %>% filter(str_detect(df$Comparison, "vs"), 
                      trimws(EvA) != "", 
                    !str_detect(EvA, "\\?"), 
                    !str_detect(EvA, "%") )

df$firstAuthor <- str_trim(df$firstAuthor, "right")

Select only relevant columns

df <- df %>% select(Comparison:Outcome) %>% 
  select(-quality)

create a new column id

df <-  mutate(df, id = paste(firstAuthor, ", ", year, paper))

Dataset clean

Converting factors to numeric variables

glimpse(df)

df$EvA <- as.integer(df$EvA)
df$TotalA <- as.integer(df$TotalA)
df$EvB <- as.integer(df$EvB)
df$TotalB <- as.integer(df$TotalB)

df <- df %>% 
  mutate(groups = paste(Comparison, Outcome))
summary(df)

Create groups for comparisons

Any intervention (Sealant, Refinishing or Repair) vs grouped comparison and grouped outcome

df <- mutate(df, groups = paste( intervention_b, Outcome))
table(df$groups)

1. No-treatment MA (6)

Data selection

data_meta <- df %>% 
  filter(groups == "No-treatment MA")
meta1 <- metabin(EvA, TotalA, 
                 EvB, TotalB, 
                 data = data_meta,  
                 sm = "OR",  method.tau = "DL", 
                 comb.fixed = FALSE, 
                 studlab = paste(firstAuthor, year, intervention_a))

Bias

funnel.meta(meta1, 
            studlab = TRUE)

Heterogeneity

baujat.meta(meta1, 
            yscale = 10, xmin = 3, ymin = 10, 
            cex.studlab = .50)

Meta-analysis and forest plot

summary(meta1)
Number of studies combined: k = 6

                         OR           95%-CI    z  p-value
Random effects model 1.0181 [0.3054; 3.3946] 0.03   0.9767

Quantifying heterogeneity:
 tau^2 = 1.5285; H = 1.95 [1.29; 2.95]; I^2 = 73.8% [40.2%; 88.5%]

Test of heterogeneity:
     Q d.f.  p-value
 19.10    5   0.0018

Details on meta-analytical method:
- Mantel-Haenszel method
- DerSimonian-Laird estimator for tau^2
- Continuity correction of 0.5 in studies with zero cell frequencies
meta1
                             OR            95%-CI %W(random)
Gordan 2009 Sealant      0.6400 [0.0880;  4.6554]       14.8
Gordan 2009 Refinishing  2.8000 [0.5321; 14.7350]       16.8
Moncada 2015 Sealant     0.0345 [0.0017;  0.6894]        9.8
Estay 2017 Refinishing   0.2864 [0.0836;  0.9813]       19.6
Fernandez 2015 Sealant  12.0000 [2.1471; 67.0674]       16.4
Estay 2017 Refinishing   1.4082 [0.6730;  2.9464]       22.6

Number of studies combined: k = 6

                         OR           95%-CI    z  p-value
Random effects model 1.0181 [0.3054; 3.3946] 0.03   0.9767

Quantifying heterogeneity:
 tau^2 = 1.5285; H = 1.95 [1.29; 2.95]; I^2 = 73.8% [40.2%; 88.5%]

Test of heterogeneity:
     Q d.f.  p-value
 19.10    5   0.0018

Details on meta-analytical method:
- Mantel-Haenszel method
- DerSimonian-Laird estimator for tau^2
- Continuity correction of 0.5 in studies with zero cell frequencies

Forest

forest.meta(meta1,  
       comb.fixed = FALSE,
       sortvar = year, 
       # LEFT
       label.left         = "Seal or ref.", 
       col.label.left     = "darkgreen", 
       # RIGHT
       label.right        = "No treatment",
       col.label.right    = "darkred")
Unknown or uninitialised column: '.subset'.

Export

png(filename = "1.png", 
    type = "cairo",
    units = "in", 
    width = 10, 
    height = 5, 
    pointsize = 12, 
    res = 96)
forest.meta(meta1,  
       comb.fixed = FALSE,
       sortvar = year, 
       # LEFT
       label.left         = "Seal or ref.", 
       col.label.left     = "darkgreen", 
       # RIGHT
       label.right        = "No treatment",
       col.label.right    = "darkred")
Unknown or uninitialised column: '.subset'.
dev.off()
null device 
          1 

2. No-treatment SC (6)

Data selection

data_meta <- df %>% 
  filter(groups == "No-treatment SC")
data_meta
meta1 <- metabin(EvA, TotalA, 
                 EvB, TotalB, 
                 data = data_meta,  
                 sm = "OR",  method.tau = "DL", 
                 comb.fixed = FALSE, 
                 studlab = paste(firstAuthor, year, intervention_a))

Bias

funnel.meta(meta1, 
            studlab = TRUE, 
            cex.studlab = .55)

Heterogeneity

baujat.meta(meta1, 
            yscale = 10, xmin = 3, ymin = 10, 
            cex.studlab = .50)

Meta-analysis and forest plot

summary(meta1)
Number of studies combined: k = 6

                        OR           95%-CI    z  p-value
Random effects model 1.286 [0.4991; 3.3137] 0.52   0.6024

Quantifying heterogeneity:
 tau^2 = 0; H = 1.00 [1.00; 1.26]; I^2 = 0.0% [0.0%; 36.7%]

Test of heterogeneity:
    Q d.f.  p-value
 2.00    5   0.8487

Details on meta-analytical method:
- Mantel-Haenszel method
- DerSimonian-Laird estimator for tau^2
- Continuity correction of 0.5 in studies with zero cell frequencies
meta1
                            OR             95%-CI %W(random)
Gordan 2009 Sealant     0.5556 [0.0200;  15.4620]        8.1
Gordan 2009 Refinishing 1.2000 [0.0663;  21.7233]       10.7
Moncada 2015 Sealant    0.3103 [0.0116;   8.2917]        8.3
Estay 2017 Refinishing  5.0571 [0.1952; 131.0509]        8.5
Fernandez 2015 Sealant  0.8889 [0.1119;   7.0614]       20.9
Estay 2017 Refinishing  1.8333 [0.4372;   7.6869]       43.6

Number of studies combined: k = 6

                        OR           95%-CI    z  p-value
Random effects model 1.286 [0.4991; 3.3137] 0.52   0.6024

Quantifying heterogeneity:
 tau^2 = 0; H = 1.00 [1.00; 1.26]; I^2 = 0.0% [0.0%; 36.7%]

Test of heterogeneity:
    Q d.f.  p-value
 2.00    5   0.8487

Details on meta-analytical method:
- Mantel-Haenszel method
- DerSimonian-Laird estimator for tau^2
- Continuity correction of 0.5 in studies with zero cell frequencies

Forest

forest.meta(meta1,  
       comb.fixed = FALSE,
       sortvar = year, 
       # LEFT
       label.left         = "Seal or refinishing", 
       col.label.left     = "darkgreen", 
       # RIGHT
       label.right        = "No treatment",
       col.label.right    = "darkred")
Unknown or uninitialised column: '.subset'.

Export

png(filename = "2.png", 
    type = "cairo",
    units = "in", 
    width = 10, 
    height = 5, 
    pointsize = 12, 
    res = 96)
forest.meta(meta1,  
       comb.fixed = FALSE,
       sortvar = year, 
       # LEFT
       label.left         = "Seal or refinishing", 
       col.label.left     = "darkgreen", 
       # RIGHT
       label.right        = "No treatment",
       col.label.right    = "darkred")
Unknown or uninitialised column: '.subset'.
dev.off()
null device 
          1 

3. No-treatment TS (3)

Data selection

data_meta <- df %>% 
  filter(groups == "No-treatment TS")
data_meta
meta1 <- metabin(EvA, TotalA, 
                 EvB, TotalB, 
                 data = data_meta,  
                 sm = "OR",  method.tau = "DL", 
                 comb.fixed = FALSE, 
                 studlab = paste(firstAuthor, year, intervention_a))

Bias

funnel.meta(meta1, 
            studlab = TRUE, 
            cex.studlab = .55)

Heterogeneity

baujat.meta(meta1, 
            yscale = 10, xmin = 3, ymin = 10, 
            cex.studlab = .50)

Meta-analysis and forest plot

summary(meta1)
Number of studies combined: k = 3

                         OR            95%-CI    z  p-value
Random effects model 3.1616 [0.6856; 14.5791] 1.48   0.1400

Quantifying heterogeneity:
 tau^2 = 0; H = 1.00 [1.00; 2.27]; I^2 = 0.0% [0.0%; 80.6%]

Test of heterogeneity:
    Q d.f.  p-value
 1.07    2   0.5850

Details on meta-analytical method:
- Mantel-Haenszel method
- DerSimonian-Laird estimator for tau^2
- Continuity correction of 0.5 in studies with zero cell frequencies
meta1
                           OR             95%-CI %W(random)
Moncada 2015 Sealant   1.0000 [0.0563;  17.7510]       28.2
Estay 2017 Refinishing 8.9394 [0.4045; 197.5585]       24.4
Estay 2017 Refinishing 3.6774 [0.3992;  33.8804]       47.4

Number of studies combined: k = 3

                         OR            95%-CI    z  p-value
Random effects model 3.1616 [0.6856; 14.5791] 1.48   0.1400

Quantifying heterogeneity:
 tau^2 = 0; H = 1.00 [1.00; 2.27]; I^2 = 0.0% [0.0%; 80.6%]

Test of heterogeneity:
    Q d.f.  p-value
 1.07    2   0.5850

Details on meta-analytical method:
- Mantel-Haenszel method
- DerSimonian-Laird estimator for tau^2
- Continuity correction of 0.5 in studies with zero cell frequencies

Forest

forest.meta(meta1,  
       comb.fixed = FALSE,
       sortvar = year, 
       # LEFT
       label.left         = "Seal or refinish", 
       col.label.left     = "darkgreen", 
       # RIGHT
       label.right        = "No treatment",
       col.label.right    = "darkred")
Unknown or uninitialised column: '.subset'.

Export

png(filename = "3.png", 
    type = "cairo",
    units = "in", 
    width = 10, 
    height = 5, 
    pointsize = 12, 
    res = 96)
forest.meta(meta1,  
       comb.fixed = FALSE,
       sortvar = year, 
       # LEFT
       label.left         = "Seal or refinish", 
       col.label.left     = "darkgreen", 
       # RIGHT
       label.right        = "No treatment",
       col.label.right    = "darkred")
Unknown or uninitialised column: '.subset'.
dev.off()
null device 
          1 

4. Replacement MA (5)

Data selection

data_meta <- df %>% 
  filter(groups == "Replacement MA")
data_meta
meta1 <- metabin(EvA, TotalA, 
                 EvB, TotalB, 
                 data = data_meta,  
                 sm = "OR",  method.tau = "DL", 
                 comb.fixed = FALSE, 
                 studlab = paste(firstAuthor, year, intervention_a))

Bias

funnel.meta(meta1, 
            studlab = TRUE, 
            cex.studlab = .55)

Heterogeneity

baujat.meta(meta1, 
            yscale = 10, xmin = 3, ymin = 10, 
            cex.studlab = .50)

Meta-analysis and forest plot

summary(meta1)
Number of studies combined: k = 4

                         OR           95%-CI     z  p-value
Random effects model 0.7996 [0.2774; 2.3052] -0.41   0.6789

Quantifying heterogeneity:
 tau^2 = 0.5096; H = 1.34 [1.00; 2.31]; I^2 = 44.1% [0.0%; 81.3%]

Test of heterogeneity:
    Q d.f.  p-value
 5.37    3   0.1467

Details on meta-analytical method:
- Mantel-Haenszel method
- DerSimonian-Laird estimator for tau^2
meta1
                         OR            95%-CI %W(random)
Gordan 2011 Repair   0.1319 [0.0141;  1.2354]       16.1
Moncada 2015 Sealant     NA                          0.0
Estay 2017 Repair    0.6222 [0.1554;  2.4920]       28.9
Estay 2017 Repair    2.7045 [0.6384; 11.4576]       27.7
Gordan 2009 Repair   0.8750 [0.2020;  3.7907]       27.3

Number of studies combined: k = 4

                         OR           95%-CI     z  p-value
Random effects model 0.7996 [0.2774; 2.3052] -0.41   0.6789

Quantifying heterogeneity:
 tau^2 = 0.5096; H = 1.34 [1.00; 2.31]; I^2 = 44.1% [0.0%; 81.3%]

Test of heterogeneity:
    Q d.f.  p-value
 5.37    3   0.1467

Details on meta-analytical method:
- Mantel-Haenszel method
- DerSimonian-Laird estimator for tau^2

Forest

forest.meta(meta1,  
       comb.fixed = FALSE,
       sortvar = year, 
       # LEFT
       label.left         = "Seal or repair", 
       col.label.left     = "darkgreen", 
       # RIGHT
       label.right        = "Replacement",
       col.label.right    = "darkred")
Unknown or uninitialised column: '.subset'.

Export

png(filename = "4.png", 
    type = "cairo",
    units = "in", 
    width = 10, 
    height = 5, 
    pointsize = 12, 
    res = 96)
forest.meta(meta1,  
       comb.fixed = FALSE,
       sortvar = year, 
       # LEFT
       label.left         = "Seal or repair", 
       col.label.left     = "darkgreen", 
       # RIGHT
       label.right        = "Replacement",
       col.label.right    = "darkred")
Unknown or uninitialised column: '.subset'.
dev.off()
null device 
          1 

5. Replacement SC (5)

Data selection

data_meta <- df %>% 
  filter(groups == "Replacement SC")
data_meta
meta1 <- metabin(EvA, TotalA, 
                 EvB, TotalB, 
                 data = data_meta,  
                 sm = "OR",  method.tau = "DL", 
                 comb.fixed = FALSE, 
                 studlab = paste(firstAuthor, year, intervention_a))

Bias

funnel.meta(meta1, 
            studlab = TRUE, 
            cex.studlab = .55)

Heterogeneity

baujat.meta(meta1, 
            yscale = 10, xmin = 3, ymin = 10, 
            cex.studlab = .50)

Meta-analysis and forest plot

summary(meta1)
Number of studies combined: k = 4

                         OR           95%-CI     z  p-value
Random effects model 0.9363 [0.1065; 8.2309] -0.06   0.9526

Quantifying heterogeneity:
 tau^2 = 2.9848; H = 1.61 [1.00; 2.78]; I^2 = 61.4% [0.0%; 87.1%]

Test of heterogeneity:
    Q d.f.  p-value
 7.77    3   0.0511

Details on meta-analytical method:
- Mantel-Haenszel method
- DerSimonian-Laird estimator for tau^2
- Continuity correction of 0.5 in studies with zero cell frequencies
meta1
                         OR             95%-CI %W(random)
Gordan 2011 Repair   0.1319 [0.0141;   1.2354]       28.7
Moncada 2015 Sealant     NA                           0.0
Estay 2017 Repair    5.7273 [0.5312;  61.7487]       27.6
Estay 2017 Repair    6.5152 [0.2925; 145.1132]       22.4
Gordan 2009 Repair   0.1634 [0.0062;   4.3051]       21.3

Number of studies combined: k = 4

                         OR           95%-CI     z  p-value
Random effects model 0.9363 [0.1065; 8.2309] -0.06   0.9526

Quantifying heterogeneity:
 tau^2 = 2.9848; H = 1.61 [1.00; 2.78]; I^2 = 61.4% [0.0%; 87.1%]

Test of heterogeneity:
    Q d.f.  p-value
 7.77    3   0.0511

Details on meta-analytical method:
- Mantel-Haenszel method
- DerSimonian-Laird estimator for tau^2
- Continuity correction of 0.5 in studies with zero cell frequencies

Forest

forest.meta(meta1,  
       comb.fixed = FALSE,
       sortvar = year, 
       # LEFT
       label.left         = "Seal or repair", 
       col.label.left     = "darkgreen", 
       # RIGHT
       label.right        = "Replacement",
       col.label.right    = "darkred")
Unknown or uninitialised column: '.subset'.

Export

png(filename = "5.png", 
    type = "cairo",
    units = "in", 
    width = 10, 
    height = 5, 
    pointsize = 12, 
    res = 96)
forest.meta(meta1,  
       comb.fixed = FALSE,
       sortvar = year, 
       # LEFT
       label.left         = "Seal or repair", 
       col.label.left     = "darkgreen", 
       # RIGHT
       label.right        = "Replacement",
       col.label.right    = "darkred")
Unknown or uninitialised column: '.subset'.
dev.off()
null device 
          1 

6. Replacement TS (5)

Data selection

data_meta <- df %>% 
  filter(groups == "Replacement TS")
data_meta
meta1 <- metabin(EvA, TotalA, 
                 EvB, TotalB, 
                 data = data_meta,  
                 sm = "OR",  method.tau = "DL", 
                 comb.fixed = FALSE, 
                 studlab = paste(firstAuthor, year, intervention_a))

Bias

funnel.meta(meta1, 
            studlab = TRUE, 
            cex.studlab = .55)

Heterogeneity

baujat.meta(meta1, 
            yscale = 10, xmin = 3, ymin = 10, 
            cex.studlab = .50)

Meta-analysis and forest plot

summary(meta1)
Number of studies combined: k = 3

                        OR           95%-CI     z  p-value
Random effects model 0.369 [0.0875; 1.5561] -1.36   0.1745

Quantifying heterogeneity:
 tau^2 = 0; H = 1.00 [1.00; 2.73]; I^2 = 0.0% [0.0%; 86.5%]

Test of heterogeneity:
    Q d.f.  p-value
 1.55    2   0.4617

Details on meta-analytical method:
- Mantel-Haenszel method
- DerSimonian-Laird estimator for tau^2
meta1
                         OR            95%-CI %W(random)
Gordan 2011 Repair   0.1319 [0.0141;  1.2354]       41.4
Moncada 2015 Sealant 1.1538 [0.0654; 20.3419]       25.2
Estay 2017 Repair        NA                          0.0
Estay 2017 Repair    0.5588 [0.0464;  6.7269]       33.5
Gordan 2009 Repair       NA                          0.0

Number of studies combined: k = 3

                        OR           95%-CI     z  p-value
Random effects model 0.369 [0.0875; 1.5561] -1.36   0.1745

Quantifying heterogeneity:
 tau^2 = 0; H = 1.00 [1.00; 2.73]; I^2 = 0.0% [0.0%; 86.5%]

Test of heterogeneity:
    Q d.f.  p-value
 1.55    2   0.4617

Details on meta-analytical method:
- Mantel-Haenszel method
- DerSimonian-Laird estimator for tau^2

Forest

forest.meta(meta1,  
       comb.fixed = FALSE,
       sortvar = year, 
       # LEFT
       label.left         = "Seal or repair", 
       col.label.left     = "darkgreen", 
       # RIGHT
       label.right        = "Replacement",
       col.label.right    = "darkred")
Unknown or uninitialised column: '.subset'.

Export

png(filename = "6.png", 
    type = "cairo",
    units = "in", 
    width = 10, 
    height = 5, 
    pointsize = 12, 
    res = 96)
forest.meta(meta1,  
       comb.fixed = FALSE,
       sortvar = year, 
       # LEFT
       label.left         = "Seal or repair", 
       col.label.left     = "darkgreen", 
       # RIGHT
       label.right        = "Replacement",
       col.label.right    = "darkred")
Unknown or uninitialised column: '.subset'.
dev.off()
null device 
          1 

Citations

citation()

To cite R in publications use:

  R Core Team (2017). R: A language and environment for statistical computing. R Foundation for Statistical
  Computing, Vienna, Austria. URL https://www.R-project.org/.

A BibTeX entry for LaTeX users is

  @Manual{,
    title = {R: A Language and Environment for Statistical Computing},
    author = {{R Core Team}},
    organization = {R Foundation for Statistical Computing},
    address = {Vienna, Austria},
    year = {2017},
    url = {https://www.R-project.org/},
  }

We have invested a lot of time and effort in creating R, please cite it when using it for data analysis. See also
‘citation("pkgname")’ for citing R packages.
citation(package = "tidyverse")

To cite package ‘tidyverse’ in publications use:

  Hadley Wickham (2017). tidyverse: Easily Install and Load the 'Tidyverse'. R package version 1.2.1.
  https://CRAN.R-project.org/package=tidyverse

A BibTeX entry for LaTeX users is

  @Manual{,
    title = {tidyverse: Easily Install and Load the 'Tidyverse'},
    author = {Hadley Wickham},
    year = {2017},
    note = {R package version 1.2.1},
    url = {https://CRAN.R-project.org/package=tidyverse},
  }
citation(package = "meta")

To cite package 'meta' in publications use:

  Guido Schwarzer (2007), meta: An R package for meta-analysis, R News, 7(3), 40-45.

A BibTeX entry for LaTeX users is

  @Article{,
    title = {meta: {A}n {R} package for meta-analysis},
    author = {Guido Schwarzer},
    journal = {R News},
    year = {2007},
    volume = {7},
    number = {3},
    pages = {40--45},
  }

URL https://cran.r-project.org/doc/Rnews/Rnews_2007-3.pdf
LS0tDQp0aXRsZTogIjIwMTcgUmVwYWlyIGRlbnRhbCByZXN0b3JhdGlvbnMiDQpvdXRwdXQ6DQogIGh0bWxfbm90ZWJvb2s6DQogICAgZmlnX2NhcHRpb246IHllcw0KICAgIHRvYzogeWVzDQogICAgdG9jX2Zsb2F0OiB5ZXMNCiAgaHRtbF9kb2N1bWVudDoNCiAgICB0b2M6IHllcw0KICBwZGZfZG9jdW1lbnQ6DQogICAgdG9jOiB5ZXMNCiAgd29yZF9kb2N1bWVudDoNCiAgICB0b2M6IHllcw0KLS0tDQoNCkRhdGEgZXh0cmFjdGVkIHdhcyB0YWJ1bGF0ZWQgaW4gYSBnb29nbGUgc2hlZXQuIFRoZW4gZXhwb3J0ZWQgYXMgY3N2IGZpbGUgYW5kIGltcG9ydGVkIGluIFIgKFIgQ29yZSBUZWFtICgyMDE3KS4gUjogQSBsYW5ndWFnZSBhbmQgZW52aXJvbm1lbnQgZm9yIHN0YXRpc3RpY2FsIGNvbXB1dGluZy4gUiBGb3VuZGF0aW9uIGZvciBTdGF0aXN0aWNhbCBDb21wdXRpbmcsIFZpZW5uYSwgQXVzdHJpYS4gVVJMIGh0dHBzOi8vd3d3LlItcHJvamVjdC5vcmcvLikNCg0KRGF0YSBjbGVhbmluZyBhbmQgb3JnYW5pemF0aW9uIHdhcyBkb25lIHdpdGggcGFja2FnZSB0aWR5dmVyc2UgKEhhZGxleSBXaWNraGFtICgyMDE3KS4gdGlkeXZlcnNlOiBFYXNpbHkgSW5zdGFsbCBhbmQgTG9hZCB0aGUgJ1RpZHl2ZXJzZScuIFIgcGFja2FnZSB2ZXJzaW9uIDEuMi4xLiAgIGh0dHBzOi8vQ1JBTi5SLXByb2plY3Qub3JnL3BhY2thZ2U9dGlkeXZlcnNlKS4NCg0KVGhlIHBhY2thZ2UgbWV0YSAoR3VpZG8gU2Nod2FyemVyICgyMDA3KSwgbWV0YTogQW4gUiBwYWNrYWdlIGZvciBtZXRhLWFuYWx5c2lzLCBSIE5ld3MsIDcoMyksIDQwLTQ1Likgd2FzIHVzZWQgZm9yIHRoZSBtZXRhLWFuYWx5c2lzLiBBIGZ1bm5lbCBwbG90IHdhcyB1c2VkIHRvIGRldGVjdCBwdWJsaWNhdGlvbiBiaWFzLiBUaGUgaGV0ZXJvZ2VuaWNpdHkgYmV0d2VlbiBzdHVkaWVzIHdhcyBjaGVja2VkIHdpdGggSTIgYW5kIHZpc3VhbGl6ZWQgd2l0aCBhIEJhdWphdCBwbG90IChCYXVqYXQgQiwgTWFow6kgQywgUGlnbm9uIEpQLCBIaWxsIEMgKDIwMDIpLCBBIGdyYXBoaWNhbCBtZXRob2QgZm9yIGV4cGxvcmluZyBoZXRlcm9nZW5laXR5IGluIG1ldGEtYW5hbHlzZXM6IEFwcGxpY2F0aW9uIHRvIGEgbWV0YS1hbmFseXNpcyBvZiA2NSB0cmlhbHMuIFN0YXRpc3RpY3MgaW4gTWVkaWNpbmUsIDMwLCAyNjQx4oCTMjY1Mi4pLiAgV2UgZ3JvdXBlZCB0aGUgc3R1ZGllcyB3aXRoIHNhbWUgaW50ZXJ2ZW50aW9uIGFuZCBjb250cm9sIGFuZCBjb25zaWRlcmVkIGFueSBhZHZlcnNlIG91dGNvbWUuIEEgcmFuZG9tIGVmZmVjdCBtZXRhLWFuYWx5c2lzIHVzaW5nIG9kZHMtcmF0aW8gYXMgb3V0Y29tZSB3YXMgcGVyZm9ybWVkIHdpdGggYSBNYW50ZWwtSGFlbnplbCBtZXRob2QuIEEgZm9yZXN0IHBsb3Qgd2FzIHVzZWQgdG8gdmlzdWFsaXplIHRoZSBvdmVyYWxsIGVmZmVjdCBvZiB0aGUgaW50ZXJ2ZW50aW9ucywgd2l0aCBhIDk1JSBjb25maWRlbmNlIGludGVydmFsLg0KDQoNCg0KDQoNCiMgUGFxdWV0ZXMNCmBgYHtyLCBpbmNsdWRlID0gRiwgZWNobyA9IEZ9DQpQYWNrYWdlcyA8LSBjKCJ0aWR5dmVyc2UiLCAiYnJvb20iLCAibWV0YSIpDQpsYXBwbHkoUGFja2FnZXMsIGxpYnJhcnksIGNoYXJhY3Rlci5vbmx5ID0gVFJVRSkNCnJtKFBhY2thZ2VzKQ0KYGBgDQoNCg0KDQoNCiMgRGF0YXNldA0KDQpgYGB7cn0NCg0KZGYgPC0gcmVhZF9jc3YoImh0dHBzOi8vZG9jcy5nb29nbGUuY29tL3NwcmVhZHNoZWV0cy9kL2UvMlBBQ1gtMXZSU0t1QmxjUVRWSksyZlp5WjROdmY0U3dTcVZyeGNmQUdoTmhsNmRXSFU5VzM5b3BwRTRQbDRsY1B5LTBDUkdSVHFRUTBJSHdGZ2ZyWTgvcHViP2dpZD0wJnNpbmdsZT10cnVlJm91dHB1dD1jc3YiKQ0KYGBgDQoNCiMjIERhdGEgY2xlYW5pbmcNCmBgYHtyfQ0KZ2xpbXBzZShkZikNCmBgYA0KQ2xlYW4gZGF0YXNldCBmcm9tIGVtcHR5IHJvd3MsIHN0cmFuZ2Ugc3ltYm9scywgZXRjDQpgYGB7cn0NCg0KZGYgPC0gZGYgJT4lIGZpbHRlcihzdHJfZGV0ZWN0KGRmJENvbXBhcmlzb24sICJ2cyIpLCANCiAgICAgICAgICAgICAgICAgICAgICB0cmltd3MoRXZBKSAhPSAiIiwgDQogICAgICAgICAgICAgICAgICAgICFzdHJfZGV0ZWN0KEV2QSwgIlxcPyIpLCANCiAgICAgICAgICAgICAgICAgICAgIXN0cl9kZXRlY3QoRXZBLCAiJSIpICkNCg0KZGYkZmlyc3RBdXRob3IgPC0gc3RyX3RyaW0oZGYkZmlyc3RBdXRob3IsICJyaWdodCIpDQoNCg0KDQpgYGANClNlbGVjdCBvbmx5IHJlbGV2YW50IGNvbHVtbnMNCmBgYHtyfQ0KZGYgPC0gZGYgJT4lIHNlbGVjdChDb21wYXJpc29uOk91dGNvbWUpICU+JSANCiAgc2VsZWN0KC1xdWFsaXR5KQ0KYGBgDQoNCmNyZWF0ZSBhIG5ldyBjb2x1bW4gaWQNCg0KYGBge3J9DQpkZiA8LSAgbXV0YXRlKGRmLCBpZCA9IHBhc3RlKGZpcnN0QXV0aG9yLCAiLCAiLCB5ZWFyLCBwYXBlcikpDQoNCmBgYA0KDQojIyBEYXRhc2V0IGNsZWFuDQpDb252ZXJ0aW5nIGZhY3RvcnMgdG8gbnVtZXJpYyB2YXJpYWJsZXMNCg0KYGBge3J9DQpnbGltcHNlKGRmKQ0KDQpkZiRFdkEgPC0gYXMuaW50ZWdlcihkZiRFdkEpDQpkZiRUb3RhbEEgPC0gYXMuaW50ZWdlcihkZiRUb3RhbEEpDQpkZiRFdkIgPC0gYXMuaW50ZWdlcihkZiRFdkIpDQpkZiRUb3RhbEIgPC0gYXMuaW50ZWdlcihkZiRUb3RhbEIpDQoNCmRmIDwtIGRmICU+JSANCiAgbXV0YXRlKGdyb3VwcyA9IHBhc3RlKENvbXBhcmlzb24sIE91dGNvbWUpKQ0KDQpgYGANCmBgYHtyfQ0Kc3VtbWFyeShkZikNCg0KYGBgDQpDcmVhdGUgZ3JvdXBzIGZvciBjb21wYXJpc29ucw0KDQpBbnkgaW50ZXJ2ZW50aW9uIChTZWFsYW50LCBSZWZpbmlzaGluZyBvciBSZXBhaXIpIHZzIGdyb3VwZWQgY29tcGFyaXNvbiBhbmQgZ3JvdXBlZCBvdXRjb21lDQpgYGB7cn0NCmRmIDwtIG11dGF0ZShkZiwgZ3JvdXBzID0gcGFzdGUoIGludGVydmVudGlvbl9iLCBPdXRjb21lKSkNCnRhYmxlKGRmJGdyb3VwcykNCmBgYA0KDQoNCiMgMS4gIE5vLXRyZWF0bWVudCBNQSAoNikNCiMjIERhdGEgc2VsZWN0aW9uDQpgYGB7cn0NCmRhdGFfbWV0YSA8LSBkZiAlPiUgDQogIGZpbHRlcihncm91cHMgPT0gIk5vLXRyZWF0bWVudCBNQSIpDQpgYGANCmBgYHtyfQ0KbWV0YTEgPC0gbWV0YWJpbihFdkEsIFRvdGFsQSwgDQogICAgICAgICAgICAgICAgIEV2QiwgVG90YWxCLCANCiAgICAgICAgICAgICAgICAgZGF0YSA9IGRhdGFfbWV0YSwgIA0KICAgICAgICAgICAgICAgICBzbSA9ICJPUiIsICBtZXRob2QudGF1ID0gIkRMIiwgDQogICAgICAgICAgICAgICAgIGNvbWIuZml4ZWQgPSBGQUxTRSwgDQogICAgICAgICAgICAgICAgIHN0dWRsYWIgPSBwYXN0ZShmaXJzdEF1dGhvciwgeWVhciwgaW50ZXJ2ZW50aW9uX2EpKQ0KDQpgYGANCg0KDQojIyBCaWFzDQoNCmBgYHtyfQ0KZnVubmVsLm1ldGEobWV0YTEsIA0KICAgICAgICAgICAgc3R1ZGxhYiA9IFRSVUUpDQpgYGANCg0KDQojIyBIZXRlcm9nZW5laXR5DQoNCmBgYHtyfQ0KDQpiYXVqYXQubWV0YShtZXRhMSwgDQogICAgICAgICAgICB5c2NhbGUgPSAxMCwgeG1pbiA9IDMsIHltaW4gPSAxMCwgDQogICAgICAgICAgICBjZXguc3R1ZGxhYiA9IC41MCkNCmBgYA0KDQoNCiMjIE1ldGEtYW5hbHlzaXMgYW5kIGZvcmVzdCBwbG90DQpgYGB7cn0NCnN1bW1hcnkobWV0YTEpDQpgYGANCg0KYGBge3J9DQptZXRhMQ0KYGBgDQojIyBGb3Jlc3QNCg0KYGBge3J9DQoNCmZvcmVzdC5tZXRhKG1ldGExLCAgDQogICAgICAgY29tYi5maXhlZCA9IEZBTFNFLA0KICAgICAgIHNvcnR2YXIgPSB5ZWFyLCANCiAgICAgICAjIExFRlQNCiAgICAgICBsYWJlbC5sZWZ0ICAgICAgICAgPSAiU2VhbCBvciByZWYuIiwgDQogICAgICAgY29sLmxhYmVsLmxlZnQgICAgID0gImRhcmtncmVlbiIsIA0KICAgICAgICMgUklHSFQNCiAgICAgICBsYWJlbC5yaWdodCAgICAgICAgPSAiTm8gdHJlYXRtZW50IiwNCiAgICAgICBjb2wubGFiZWwucmlnaHQgICAgPSAiZGFya3JlZCIpDQoNCmBgYA0KDQojIyBFeHBvcnQNCg0KYGBge3J9DQpwbmcoZmlsZW5hbWUgPSAiMS5wbmciLCANCiAgICB0eXBlID0gImNhaXJvIiwNCiAgICB1bml0cyA9ICJpbiIsIA0KICAgIHdpZHRoID0gMTAsIA0KICAgIGhlaWdodCA9IDUsIA0KICAgIHBvaW50c2l6ZSA9IDEyLCANCiAgICByZXMgPSA5NikNCg0KDQpmb3Jlc3QubWV0YShtZXRhMSwgIA0KICAgICAgIGNvbWIuZml4ZWQgPSBGQUxTRSwNCiAgICAgICBzb3J0dmFyID0geWVhciwgDQogICAgICAgIyBMRUZUDQogICAgICAgbGFiZWwubGVmdCAgICAgICAgID0gIlNlYWwgb3IgcmVmLiIsIA0KICAgICAgIGNvbC5sYWJlbC5sZWZ0ICAgICA9ICJkYXJrZ3JlZW4iLCANCiAgICAgICAjIFJJR0hUDQogICAgICAgbGFiZWwucmlnaHQgICAgICAgID0gIk5vIHRyZWF0bWVudCIsDQogICAgICAgY29sLmxhYmVsLnJpZ2h0ICAgID0gImRhcmtyZWQiKQ0KDQpkZXYub2ZmKCkNCmBgYA0KDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCg0KIyAyLiBOby10cmVhdG1lbnQgU0MgKDYpDQojIyBEYXRhIHNlbGVjdGlvbg0KYGBge3J9DQpkYXRhX21ldGEgPC0gZGYgJT4lIA0KICBmaWx0ZXIoZ3JvdXBzID09ICJOby10cmVhdG1lbnQgU0MiKQ0KZGF0YV9tZXRhDQpgYGANCmBgYHtyfQ0KbWV0YTEgPC0gbWV0YWJpbihFdkEsIFRvdGFsQSwgDQogICAgICAgICAgICAgICAgIEV2QiwgVG90YWxCLCANCiAgICAgICAgICAgICAgICAgZGF0YSA9IGRhdGFfbWV0YSwgIA0KICAgICAgICAgICAgICAgICBzbSA9ICJPUiIsICBtZXRob2QudGF1ID0gIkRMIiwgDQogICAgICAgICAgICAgICAgIGNvbWIuZml4ZWQgPSBGQUxTRSwgDQogICAgICAgICAgICAgICAgIHN0dWRsYWIgPSBwYXN0ZShmaXJzdEF1dGhvciwgeWVhciwgaW50ZXJ2ZW50aW9uX2EpKQ0KDQpgYGANCg0KDQojIyBCaWFzDQoNCmBgYHtyfQ0KZnVubmVsLm1ldGEobWV0YTEsIA0KICAgICAgICAgICAgc3R1ZGxhYiA9IFRSVUUsIA0KICAgICAgICAgICAgY2V4LnN0dWRsYWIgPSAuNTUpDQpgYGANCg0KDQojIyBIZXRlcm9nZW5laXR5DQoNCmBgYHtyfQ0KDQpiYXVqYXQubWV0YShtZXRhMSwgDQogICAgICAgICAgICB5c2NhbGUgPSAxMCwgeG1pbiA9IDMsIHltaW4gPSAxMCwgDQogICAgICAgICAgICBjZXguc3R1ZGxhYiA9IC41MCkNCmBgYA0KDQoNCiMjIE1ldGEtYW5hbHlzaXMgYW5kIGZvcmVzdCBwbG90DQpgYGB7cn0NCnN1bW1hcnkobWV0YTEpDQpgYGANCg0KYGBge3J9DQptZXRhMQ0KYGBgDQojIyBGb3Jlc3QNCmBgYHtyfQ0KDQpmb3Jlc3QubWV0YShtZXRhMSwgIA0KICAgICAgIGNvbWIuZml4ZWQgPSBGQUxTRSwNCiAgICAgICBzb3J0dmFyID0geWVhciwgDQogICAgICAgIyBMRUZUDQogICAgICAgbGFiZWwubGVmdCAgICAgICAgID0gIlNlYWwgb3IgcmVmaW5pc2hpbmciLCANCiAgICAgICBjb2wubGFiZWwubGVmdCAgICAgPSAiZGFya2dyZWVuIiwgDQogICAgICAgIyBSSUdIVA0KICAgICAgIGxhYmVsLnJpZ2h0ICAgICAgICA9ICJObyB0cmVhdG1lbnQiLA0KICAgICAgIGNvbC5sYWJlbC5yaWdodCAgICA9ICJkYXJrcmVkIikNCg0KYGBgDQoNCiMjIEV4cG9ydA0KYGBge3J9DQpwbmcoZmlsZW5hbWUgPSAiMi5wbmciLCANCiAgICB0eXBlID0gImNhaXJvIiwNCiAgICB1bml0cyA9ICJpbiIsIA0KICAgIHdpZHRoID0gMTAsIA0KICAgIGhlaWdodCA9IDUsIA0KICAgIHBvaW50c2l6ZSA9IDEyLCANCiAgICByZXMgPSA5NikNCg0KDQpmb3Jlc3QubWV0YShtZXRhMSwgIA0KICAgICAgIGNvbWIuZml4ZWQgPSBGQUxTRSwNCiAgICAgICBzb3J0dmFyID0geWVhciwgDQogICAgICAgIyBMRUZUDQogICAgICAgbGFiZWwubGVmdCAgICAgICAgID0gIlNlYWwgb3IgcmVmaW5pc2hpbmciLCANCiAgICAgICBjb2wubGFiZWwubGVmdCAgICAgPSAiZGFya2dyZWVuIiwgDQogICAgICAgIyBSSUdIVA0KICAgICAgIGxhYmVsLnJpZ2h0ICAgICAgICA9ICJObyB0cmVhdG1lbnQiLA0KICAgICAgIGNvbC5sYWJlbC5yaWdodCAgICA9ICJkYXJrcmVkIikNCg0KZGV2Lm9mZigpDQoNCmBgYA0KDQoNCg0KDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCg0KDQojIDMuIE5vLXRyZWF0bWVudCBUUyAoMykNCiMjIERhdGEgc2VsZWN0aW9uDQpgYGB7cn0NCmRhdGFfbWV0YSA8LSBkZiAlPiUgDQogIGZpbHRlcihncm91cHMgPT0gIk5vLXRyZWF0bWVudCBUUyIpDQpkYXRhX21ldGENCmBgYA0KYGBge3J9DQptZXRhMSA8LSBtZXRhYmluKEV2QSwgVG90YWxBLCANCiAgICAgICAgICAgICAgICAgRXZCLCBUb3RhbEIsIA0KICAgICAgICAgICAgICAgICBkYXRhID0gZGF0YV9tZXRhLCAgDQogICAgICAgICAgICAgICAgIHNtID0gIk9SIiwgIG1ldGhvZC50YXUgPSAiREwiLCANCiAgICAgICAgICAgICAgICAgY29tYi5maXhlZCA9IEZBTFNFLCANCiAgICAgICAgICAgICAgICAgc3R1ZGxhYiA9IHBhc3RlKGZpcnN0QXV0aG9yLCB5ZWFyLCBpbnRlcnZlbnRpb25fYSkpDQoNCmBgYA0KDQoNCiMjIEJpYXMNCg0KYGBge3J9DQpmdW5uZWwubWV0YShtZXRhMSwgDQogICAgICAgICAgICBzdHVkbGFiID0gVFJVRSwgDQogICAgICAgICAgICBjZXguc3R1ZGxhYiA9IC41NSkNCmBgYA0KDQoNCiMjIEhldGVyb2dlbmVpdHkNCg0KYGBge3J9DQoNCmJhdWphdC5tZXRhKG1ldGExLCANCiAgICAgICAgICAgIHlzY2FsZSA9IDEwLCB4bWluID0gMywgeW1pbiA9IDEwLCANCiAgICAgICAgICAgIGNleC5zdHVkbGFiID0gLjUwKQ0KYGBgDQoNCg0KIyMgTWV0YS1hbmFseXNpcyBhbmQgZm9yZXN0IHBsb3QNCmBgYHtyfQ0Kc3VtbWFyeShtZXRhMSkNCmBgYA0KDQpgYGB7cn0NCm1ldGExDQpgYGANCiMjIEZvcmVzdA0KYGBge3J9DQoNCmZvcmVzdC5tZXRhKG1ldGExLCAgDQogICAgICAgY29tYi5maXhlZCA9IEZBTFNFLA0KICAgICAgIHNvcnR2YXIgPSB5ZWFyLCANCiAgICAgICAjIExFRlQNCiAgICAgICBsYWJlbC5sZWZ0ICAgICAgICAgPSAiU2VhbCBvciByZWZpbmlzaCIsIA0KICAgICAgIGNvbC5sYWJlbC5sZWZ0ICAgICA9ICJkYXJrZ3JlZW4iLCANCiAgICAgICAjIFJJR0hUDQogICAgICAgbGFiZWwucmlnaHQgICAgICAgID0gIk5vIHRyZWF0bWVudCIsDQogICAgICAgY29sLmxhYmVsLnJpZ2h0ICAgID0gImRhcmtyZWQiKQ0KDQpgYGANCg0KIyMgRXhwb3J0DQpgYGB7cn0NCnBuZyhmaWxlbmFtZSA9ICIzLnBuZyIsIA0KICAgIHR5cGUgPSAiY2Fpcm8iLA0KICAgIHVuaXRzID0gImluIiwgDQogICAgd2lkdGggPSAxMCwgDQogICAgaGVpZ2h0ID0gNSwgDQogICAgcG9pbnRzaXplID0gMTIsIA0KICAgIHJlcyA9IDk2KQ0KDQoNCmZvcmVzdC5tZXRhKG1ldGExLCAgDQogICAgICAgY29tYi5maXhlZCA9IEZBTFNFLA0KICAgICAgIHNvcnR2YXIgPSB5ZWFyLCANCiAgICAgICAjIExFRlQNCiAgICAgICBsYWJlbC5sZWZ0ICAgICAgICAgPSAiU2VhbCBvciByZWZpbmlzaCIsIA0KICAgICAgIGNvbC5sYWJlbC5sZWZ0ICAgICA9ICJkYXJrZ3JlZW4iLCANCiAgICAgICAjIFJJR0hUDQogICAgICAgbGFiZWwucmlnaHQgICAgICAgID0gIk5vIHRyZWF0bWVudCIsDQogICAgICAgY29sLmxhYmVsLnJpZ2h0ICAgID0gImRhcmtyZWQiKQ0KDQpkZXYub2ZmKCkNCg0KYGBgDQoNCg0KDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiMgNC4gUmVwbGFjZW1lbnQgTUEgKDUpDQojIyBEYXRhIHNlbGVjdGlvbg0KYGBge3J9DQpkYXRhX21ldGEgPC0gZGYgJT4lIA0KICBmaWx0ZXIoZ3JvdXBzID09ICJSZXBsYWNlbWVudCBNQSIpDQpkYXRhX21ldGENCmBgYA0KYGBge3J9DQptZXRhMSA8LSBtZXRhYmluKEV2QSwgVG90YWxBLCANCiAgICAgICAgICAgICAgICAgRXZCLCBUb3RhbEIsIA0KICAgICAgICAgICAgICAgICBkYXRhID0gZGF0YV9tZXRhLCAgDQogICAgICAgICAgICAgICAgIHNtID0gIk9SIiwgIG1ldGhvZC50YXUgPSAiREwiLCANCiAgICAgICAgICAgICAgICAgY29tYi5maXhlZCA9IEZBTFNFLCANCiAgICAgICAgICAgICAgICAgc3R1ZGxhYiA9IHBhc3RlKGZpcnN0QXV0aG9yLCB5ZWFyLCBpbnRlcnZlbnRpb25fYSkpDQoNCmBgYA0KDQoNCiMjIEJpYXMNCg0KYGBge3J9DQpmdW5uZWwubWV0YShtZXRhMSwgDQogICAgICAgICAgICBzdHVkbGFiID0gVFJVRSwgDQogICAgICAgICAgICBjZXguc3R1ZGxhYiA9IC41NSkNCmBgYA0KDQoNCiMjIEhldGVyb2dlbmVpdHkNCg0KYGBge3J9DQoNCmJhdWphdC5tZXRhKG1ldGExLCANCiAgICAgICAgICAgIHlzY2FsZSA9IDEwLCB4bWluID0gMywgeW1pbiA9IDEwLCANCiAgICAgICAgICAgIGNleC5zdHVkbGFiID0gLjUwKQ0KYGBgDQoNCg0KIyMgTWV0YS1hbmFseXNpcyBhbmQgZm9yZXN0IHBsb3QNCmBgYHtyfQ0Kc3VtbWFyeShtZXRhMSkNCmBgYA0KDQpgYGB7cn0NCm1ldGExDQpgYGANCiMjIEZvcmVzdA0KYGBge3J9DQoNCmZvcmVzdC5tZXRhKG1ldGExLCAgDQogICAgICAgY29tYi5maXhlZCA9IEZBTFNFLA0KICAgICAgIHNvcnR2YXIgPSB5ZWFyLCANCiAgICAgICAjIExFRlQNCiAgICAgICBsYWJlbC5sZWZ0ICAgICAgICAgPSAiU2VhbCBvciByZXBhaXIiLCANCiAgICAgICBjb2wubGFiZWwubGVmdCAgICAgPSAiZGFya2dyZWVuIiwgDQogICAgICAgIyBSSUdIVA0KICAgICAgIGxhYmVsLnJpZ2h0ICAgICAgICA9ICJSZXBsYWNlbWVudCIsDQogICAgICAgY29sLmxhYmVsLnJpZ2h0ICAgID0gImRhcmtyZWQiKQ0KDQpgYGANCg0KDQojIyBFeHBvcnQNCmBgYHtyfQ0KcG5nKGZpbGVuYW1lID0gIjQucG5nIiwgDQogICAgdHlwZSA9ICJjYWlybyIsDQogICAgdW5pdHMgPSAiaW4iLCANCiAgICB3aWR0aCA9IDEwLCANCiAgICBoZWlnaHQgPSA1LCANCiAgICBwb2ludHNpemUgPSAxMiwgDQogICAgcmVzID0gOTYpDQoNCg0KZm9yZXN0Lm1ldGEobWV0YTEsICANCiAgICAgICBjb21iLmZpeGVkID0gRkFMU0UsDQogICAgICAgc29ydHZhciA9IHllYXIsIA0KICAgICAgICMgTEVGVA0KICAgICAgIGxhYmVsLmxlZnQgICAgICAgICA9ICJTZWFsIG9yIHJlcGFpciIsIA0KICAgICAgIGNvbC5sYWJlbC5sZWZ0ICAgICA9ICJkYXJrZ3JlZW4iLCANCiAgICAgICAjIFJJR0hUDQogICAgICAgbGFiZWwucmlnaHQgICAgICAgID0gIlJlcGxhY2VtZW50IiwNCiAgICAgICBjb2wubGFiZWwucmlnaHQgICAgPSAiZGFya3JlZCIpDQoNCmRldi5vZmYoKQ0KDQpgYGANCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQojIDUuIFJlcGxhY2VtZW50IFNDICg1KQ0KIyMgRGF0YSBzZWxlY3Rpb24NCmBgYHtyfQ0KZGF0YV9tZXRhIDwtIGRmICU+JSANCiAgZmlsdGVyKGdyb3VwcyA9PSAiUmVwbGFjZW1lbnQgU0MiKQ0KZGF0YV9tZXRhDQpgYGANCmBgYHtyfQ0KbWV0YTEgPC0gbWV0YWJpbihFdkEsIFRvdGFsQSwgDQogICAgICAgICAgICAgICAgIEV2QiwgVG90YWxCLCANCiAgICAgICAgICAgICAgICAgZGF0YSA9IGRhdGFfbWV0YSwgIA0KICAgICAgICAgICAgICAgICBzbSA9ICJPUiIsICBtZXRob2QudGF1ID0gIkRMIiwgDQogICAgICAgICAgICAgICAgIGNvbWIuZml4ZWQgPSBGQUxTRSwgDQogICAgICAgICAgICAgICAgIHN0dWRsYWIgPSBwYXN0ZShmaXJzdEF1dGhvciwgeWVhciwgaW50ZXJ2ZW50aW9uX2EpKQ0KDQpgYGANCg0KDQojIyBCaWFzDQoNCmBgYHtyfQ0KZnVubmVsLm1ldGEobWV0YTEsIA0KICAgICAgICAgICAgc3R1ZGxhYiA9IFRSVUUsIA0KICAgICAgICAgICAgY2V4LnN0dWRsYWIgPSAuNTUpDQpgYGANCg0KDQojIyBIZXRlcm9nZW5laXR5DQoNCmBgYHtyfQ0KDQpiYXVqYXQubWV0YShtZXRhMSwgDQogICAgICAgICAgICB5c2NhbGUgPSAxMCwgeG1pbiA9IDMsIHltaW4gPSAxMCwgDQogICAgICAgICAgICBjZXguc3R1ZGxhYiA9IC41MCkNCmBgYA0KDQoNCiMjIE1ldGEtYW5hbHlzaXMgYW5kIGZvcmVzdCBwbG90DQpgYGB7cn0NCnN1bW1hcnkobWV0YTEpDQpgYGANCg0KYGBge3J9DQptZXRhMQ0KYGBgDQojIyBGb3Jlc3QNCmBgYHtyfQ0KDQpmb3Jlc3QubWV0YShtZXRhMSwgIA0KICAgICAgIGNvbWIuZml4ZWQgPSBGQUxTRSwNCiAgICAgICBzb3J0dmFyID0geWVhciwgDQogICAgICAgIyBMRUZUDQogICAgICAgbGFiZWwubGVmdCAgICAgICAgID0gIlNlYWwgb3IgcmVwYWlyIiwgDQogICAgICAgY29sLmxhYmVsLmxlZnQgICAgID0gImRhcmtncmVlbiIsIA0KICAgICAgICMgUklHSFQNCiAgICAgICBsYWJlbC5yaWdodCAgICAgICAgPSAiUmVwbGFjZW1lbnQiLA0KICAgICAgIGNvbC5sYWJlbC5yaWdodCAgICA9ICJkYXJrcmVkIikNCg0KYGBgDQoNCiMjIEV4cG9ydA0KYGBge3J9DQpwbmcoZmlsZW5hbWUgPSAiNS5wbmciLCANCiAgICB0eXBlID0gImNhaXJvIiwNCiAgICB1bml0cyA9ICJpbiIsIA0KICAgIHdpZHRoID0gMTAsIA0KICAgIGhlaWdodCA9IDUsIA0KICAgIHBvaW50c2l6ZSA9IDEyLCANCiAgICByZXMgPSA5NikNCg0KDQoNCmZvcmVzdC5tZXRhKG1ldGExLCAgDQogICAgICAgY29tYi5maXhlZCA9IEZBTFNFLA0KICAgICAgIHNvcnR2YXIgPSB5ZWFyLCANCiAgICAgICAjIExFRlQNCiAgICAgICBsYWJlbC5sZWZ0ICAgICAgICAgPSAiU2VhbCBvciByZXBhaXIiLCANCiAgICAgICBjb2wubGFiZWwubGVmdCAgICAgPSAiZGFya2dyZWVuIiwgDQogICAgICAgIyBSSUdIVA0KICAgICAgIGxhYmVsLnJpZ2h0ICAgICAgICA9ICJSZXBsYWNlbWVudCIsDQogICAgICAgY29sLmxhYmVsLnJpZ2h0ICAgID0gImRhcmtyZWQiKQ0KDQpkZXYub2ZmKCkNCg0KYGBgDQoNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KIyA2LiBSZXBsYWNlbWVudCBUUyAoNSkNCiMjIERhdGEgc2VsZWN0aW9uDQpgYGB7cn0NCmRhdGFfbWV0YSA8LSBkZiAlPiUgDQogIGZpbHRlcihncm91cHMgPT0gIlJlcGxhY2VtZW50IFRTIikNCmRhdGFfbWV0YQ0KYGBgDQpgYGB7cn0NCm1ldGExIDwtIG1ldGFiaW4oRXZBLCBUb3RhbEEsIA0KICAgICAgICAgICAgICAgICBFdkIsIFRvdGFsQiwgDQogICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhX21ldGEsICANCiAgICAgICAgICAgICAgICAgc20gPSAiT1IiLCAgbWV0aG9kLnRhdSA9ICJETCIsIA0KICAgICAgICAgICAgICAgICBjb21iLmZpeGVkID0gRkFMU0UsIA0KICAgICAgICAgICAgICAgICBzdHVkbGFiID0gcGFzdGUoZmlyc3RBdXRob3IsIHllYXIsIGludGVydmVudGlvbl9hKSkNCg0KYGBgDQoNCg0KIyMgQmlhcw0KDQpgYGB7cn0NCmZ1bm5lbC5tZXRhKG1ldGExLCANCiAgICAgICAgICAgIHN0dWRsYWIgPSBUUlVFLCANCiAgICAgICAgICAgIGNleC5zdHVkbGFiID0gLjU1KQ0KYGBgDQoNCg0KIyMgSGV0ZXJvZ2VuZWl0eQ0KDQpgYGB7cn0NCg0KYmF1amF0Lm1ldGEobWV0YTEsIA0KICAgICAgICAgICAgeXNjYWxlID0gMTAsIHhtaW4gPSAzLCB5bWluID0gMTAsIA0KICAgICAgICAgICAgY2V4LnN0dWRsYWIgPSAuNTApDQpgYGANCg0KDQojIyBNZXRhLWFuYWx5c2lzIGFuZCBmb3Jlc3QgcGxvdA0KYGBge3J9DQpzdW1tYXJ5KG1ldGExKQ0KYGBgDQoNCmBgYHtyfQ0KbWV0YTENCmBgYA0KIyMgRm9yZXN0DQpgYGB7cn0NCg0KZm9yZXN0Lm1ldGEobWV0YTEsICANCiAgICAgICBjb21iLmZpeGVkID0gRkFMU0UsDQogICAgICAgc29ydHZhciA9IHllYXIsIA0KICAgICAgICMgTEVGVA0KICAgICAgIGxhYmVsLmxlZnQgICAgICAgICA9ICJTZWFsIG9yIHJlcGFpciIsIA0KICAgICAgIGNvbC5sYWJlbC5sZWZ0ICAgICA9ICJkYXJrZ3JlZW4iLCANCiAgICAgICAjIFJJR0hUDQogICAgICAgbGFiZWwucmlnaHQgICAgICAgID0gIlJlcGxhY2VtZW50IiwNCiAgICAgICBjb2wubGFiZWwucmlnaHQgICAgPSAiZGFya3JlZCIpDQoNCmBgYA0KDQoNCiMjIEV4cG9ydA0KYGBge3J9DQpwbmcoZmlsZW5hbWUgPSAiNi5wbmciLCANCiAgICB0eXBlID0gImNhaXJvIiwNCiAgICB1bml0cyA9ICJpbiIsIA0KICAgIHdpZHRoID0gMTAsIA0KICAgIGhlaWdodCA9IDUsIA0KICAgIHBvaW50c2l6ZSA9IDEyLCANCiAgICByZXMgPSA5NikNCg0KDQpmb3Jlc3QubWV0YShtZXRhMSwgIA0KICAgICAgIGNvbWIuZml4ZWQgPSBGQUxTRSwNCiAgICAgICBzb3J0dmFyID0geWVhciwgDQogICAgICAgIyBMRUZUDQogICAgICAgbGFiZWwubGVmdCAgICAgICAgID0gIlNlYWwgb3IgcmVwYWlyIiwgDQogICAgICAgY29sLmxhYmVsLmxlZnQgICAgID0gImRhcmtncmVlbiIsIA0KICAgICAgICMgUklHSFQNCiAgICAgICBsYWJlbC5yaWdodCAgICAgICAgPSAiUmVwbGFjZW1lbnQiLA0KICAgICAgIGNvbC5sYWJlbC5yaWdodCAgICA9ICJkYXJrcmVkIikNCg0KDQpkZXYub2ZmKCkNCg0KYGBgDQoNCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQoNCg0KDQojIENpdGF0aW9ucw0KDQpgYGB7cn0NCmNpdGF0aW9uKCkNCmNpdGF0aW9uKHBhY2thZ2UgPSAidGlkeXZlcnNlIikNCmNpdGF0aW9uKHBhY2thZ2UgPSAibWV0YSIpDQoNCmBgYA==