Outline

This script covers the following steps

A. N = 1 model - unified Structural Equation Model (uSEM)

B. N = all Multilevel VAR Model

C. Selected Readings

Preliminaries

Loading Libraries

Loading libraries used in this script

# Check to see if necessary packages are installed, and install if not
packages <- c("psych", "pompom", "mlVAR", "bootnet", "psychonetrics", "GGMncv", "EstimateGroupNetwork", "relaimpo")
if (length(setdiff(packages, rownames(installed.packages()))) > 0) {
  install.packages(setdiff(packages, rownames(installed.packages())))  
}
# Load packages
library(tidyr)
library(lubridate)

Attaching package: ‘lubridate’

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

    date, intersect, setdiff, union
library(stringr)
library(psych) #for data description
library(plyr) #for data manipulation
library(dplyr)

Attaching package: ‘dplyr’

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

    arrange, count, desc, failwith, id, mutate, rename, summarise, summarize

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

    filter, lag

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

    intersect, setdiff, setequal, union
library(ggplot2) #for data visualization

Attaching package: ‘ggplot2’

The following object is masked _by_ ‘.GlobalEnv’:

    Layout

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

    %+%, alpha
# library(pompom) #for uSEM
# library(mlVAR) #for mlVAR models
library(bootnet)
This is bootnet 1.5
For questions and issues, please see github.com/SachaEpskamp/bootnet.
library(psychonetrics)
This is psychonetrics 0.10! Note: this is BETA software! Please mind that the package may not be stable and report any bugs! For more information, please see psychonetrics.org, for questions and issues, please see github.com/SachaEpskamp/psychonetrics.

Attaching package: ‘psychonetrics’

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

    bifactor

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

    identify
library(EstimateGroupNetwork)

Loading Data

fs_demo_columns <- c('id', 'demographic_age', 'demographic_age_factor',
       'demographic_education', 'demographic_gender',
       'demographic_gender_factor', 'demographic_income',
       'demographic_living_with', 'demographic_region',
       # 'demographic_underage_children',
       'demographic_underage_children_factor', 'fsd_end', 
       # 'fsd_id',
       # 'fsd_no', 
       'fsd_round', 
       'fsd_start', 'fsd_vnk', 
       # 'fsd_vr',
       'fsd_weight')
df <- read.csv("../citizen_shield/data/kp_df_eng_ordinal.csv", header=TRUE, row.names = "X")
remove_na <- function(DF, n=0) {
  DF[, colSums(is.na(DF)) <= n]
}

df <- remove_na(df, n=4000)
# describeBy(df, group="user_id")
# tmp <- df %>%
#   group_by(user_id) %>%
#   summarise_at(vars(feature_list), funs(sd(., na.rm=TRUE)))

create a feature list based on the column names of the data frame

feature_list <- colnames(df %>% select(-fs_demo_columns))
Note: Using an external vector in selections is ambiguous.
ℹ Use `all_of(fs_demo_columns)` instead of `fs_demo_columns` to silence this message.
ℹ See <https://tidyselect.r-lib.org/reference/faq-external-vector.html>.
This message is displayed once per session.

Show the head and description of the overall data frame

head(df)
# describeBy(df, group = "user_id")
# describe(df)

Show the head and descrption of an example user

example_round <- 1
data_indiv <- df[df$fsd_round == example_round, ]
# head(data_indiv)
# describe(data_indiv)
plot_df <- data_indiv %>%
  select(c(id, fsd_round), all_of(feature_list[1:20])) %>%
  gather(key = "variable", value = "value", -c(id, fsd_round))

plotting intraindividual change

#plotting intraindividual change 
ggplot(data = plot_df,
       aes(x = id, y=value, group= fsd_round)) +
  #first variable
  geom_line(aes(color = variable)) + 
  #plot layouts
  scale_x_continuous(name="Arbitrary Time") +
  scale_y_continuous(name="Raw Values") +  
  theme_classic() +
  theme(axis.title=element_text(size=14),
        axis.text=element_text(size=14),
        plot.title=element_text(size=14, hjust=.5)) +
  ggtitle(example_round)
Warning: Removed 20 row(s) containing missing values (geom_path).

Normalize the data frame (consider min max maybe)

# standardize specific data columns (not the id or time variables in first 3 columns)
data_indiv[feature_list] <- lapply(data_indiv[feature_list], 
                             function(x) c(scale(x, center=TRUE, scale=TRUE)))
# describe(data_indiv)

plotting normalized intraindividual change

plot_df <- data_indiv %>%
  select(c(id, fsd_round), all_of(feature_list[1:20])) %>%
  gather(key = "variable", value = "value", -c(id, fsd_round))
#plotting intraindividual change 
ggplot(data = plot_df,
       aes(x = id, y=value, group= fsd_round)) +
  #first variable
  geom_line(aes(color = variable)) + 
  #plot layouts
  scale_x_continuous(name="Arbitrary Time") +
  scale_y_continuous(name="Raw Values") +  
  theme_classic() +
  theme(axis.title=element_text(size=14),
        axis.text=element_text(size=14),
        plot.title=element_text(size=14, hjust=.5)) +
  ggtitle(example_round)
Warning: Removed 20 row(s) containing missing values (geom_path).

Now we see that all the variables are in standardized form.

Check the data

It is useful to check that there are data in all columns. If any one of the variables is all missing (or has no variance), the model cannot be fit. Missing data on a few observations within a column is ok.

# check column missing
na_col <- 0
for (col in 1:ncol(data_indiv)) {
  if (sum(is.na(data_indiv[,col])) == nrow(data_indiv)){
        na_col <- na_col + 1
  }
}
na_col
[1] 0

All columns are reported.

Describing the data.

describe(df)

Not standardizing the data

For the following networks, the data are kept in their original form.

## Impute the feature_list missingness
# imp.cart <- mice::mice(df[, feature_list], method="cart", printFlag = FALSE)
# df[, feature_list] <- mice::complete(imp.cart)
complete_df <- df[complete.cases(df[, c("id", "fsd_round", feature_list)]), c("id", "fsd_round", feature_list)]

ggmModSelect and EBICglasso networks

There is no accounting for the hierarchical nature of the data here. Unregularized Gaussian Graphical Model (“ggmModSelect”; GGM) using the glasso algorithm and stepwise model selection. Gaussian Markov random field estimation using graphical LASSO and extended Bayesian information criterion (“EBICglasso”) to select optimal regularization parameter.

net_modSelect <- estimateNetwork(complete_df[feature_list], 
              default = "ggmModSelect",
              stepwise = FALSE,
              corMethod = "cor")
Estimating Network. Using package::function:
  - qgraph::ggmModSelect for model selection
    - using glasso::glasso
Running glasso to obtain starting model...
net_thresh <- estimateNetwork(complete_df[feature_list],
              tuning = 0, # EBICglasso sets tuning to 0.5 by default
              default = "EBICglasso",
              threshold = TRUE,
              corMethod = "cor")
Estimating Network. Using package::function:
  - qgraph::EBICglasso for EBIC model selection
    - using glasso::glasso
Note: Network with lowest lambda selected as best network: assumption of sparsity might be violated.
Layout <- qgraph::averageLayout(net_modSelect, net_thresh)
layout(t(1:2))
plot(net_modSelect, layout = Layout, title = "ggmModSelect", edge.labels=TRUE, posCol="#306fbe", negCol="#e58038", label.scale.equal=TRUE, label.cex=10)
plot(net_thresh, layout = Layout, title = "Thresholded EBICglasso", edge.labels=TRUE, posCol="#306fbe", negCol="#e58038", label.scale.equal=TRUE, label.cex=10)

Here the principal direction is forced - this rescales variables according to the sign of the first eigen-vector. This will lead to most correlations to be positive (positive manifold), leading to negative edges to be substantively interpretable. (not sure this is preferable in this instance as the variables are not all from the same questionnaire).

net_modSelect_rescale <- estimateNetwork(complete_df[feature_list], 
              default = "ggmModSelect",
              stepwise = FALSE,
              principalDirection = TRUE)
Estimating Network. Using package::function:
  - qgraph::ggmModSelect for model selection
    - using glasso::glasso
Running glasso to obtain starting model...
net_thresh_rescale <- estimateNetwork(complete_df[feature_list],
              tuning = 0, 
              default = "EBICglasso",
              threshold = TRUE,
              principalDirection = TRUE)
Estimating Network. Using package::function:
  - qgraph::EBICglasso for EBIC model selection
    - using glasso::glasso
Note: Network with lowest lambda selected as best network: assumption of sparsity might be violated.
layout(t(1:2))
plot(net_modSelect_rescale, layout = Layout, 
     title = "ggmModSelect", edge.labels=TRUE, posCol="#306fbe", negCol="#e58038", label.scale.equal=TRUE, label.cex=10)
plot(net_thresh_rescale, layout = Layout, 
     title = "Thresholded EBICglasso", edge.labels=TRUE, posCol="#306fbe", negCol="#e58038", label.scale.equal=TRUE, label.cex=10)

qgraph::centralityPlot(
  list(
    ggmModSelect = net_modSelect_rescale,
    EBICGlasso_thresh = net_thresh_rescale
  ), include = "ExpectedInfluence"
)
Note: z-scores are shown on x-axis rather than raw centrality indices.

boots <- bootnet(net_thresh_rescale, statistics = "ExpectedInfluence", 
                 nBoots = 100, nCores = 2, type = "case")
Note: bootnet will store only the following statistics:  ExpectedInfluence
Bootstrapping...

  |                                                  | 0 % ~calculating  
Note: Network with lowest lambda selected as best network: assumption of sparsity might be violated.

  |+                                                 | 1 % ~19s          
Note: Network with lowest lambda selected as best network: assumption of sparsity might be violated.

  |+                                                 | 2 % ~19s          
Note: Network with lowest lambda selected as best network: assumption of sparsity might be violated.

  |++                                                | 3 % ~20s          
  |++                                                | 4 % ~21s          
Note: Network with lowest lambda selected as best network: assumption of sparsity might be violated.

  |+++                                               | 5 % ~21s          
Note: Network with lowest lambda selected as best network: assumption of sparsity might be violated.

  |+++                                               | 6 % ~23s          
Note: Network with lowest lambda selected as best network: assumption of sparsity might be violated.

  |++++                                              | 7 % ~23s          
Note: Network with lowest lambda selected as best network: assumption of sparsity might be violated.

  |++++                                              | 8 % ~23s          
Note: Network with lowest lambda selected as best network: assumption of sparsity might be violated.

  |+++++                                             | 9 % ~22s          
Note: Network with lowest lambda selected as best network: assumption of sparsity might be violated.

  |+++++                                             | 10% ~22s          
  |++++++                                            | 11% ~21s          
Note: Network with lowest lambda selected as best network: assumption of sparsity might be violated.

  |++++++                                            | 12% ~20s          
Note: Network with lowest lambda selected as best network: assumption of sparsity might be violated.

  |+++++++                                           | 13% ~20s          
Note: Network with lowest lambda selected as best network: assumption of sparsity might be violated.

  |+++++++                                           | 14% ~19s          
Note: Network with lowest lambda selected as best network: assumption of sparsity might be violated.

  |++++++++                                          | 15% ~19s          
Note: Network with lowest lambda selected as best network: assumption of sparsity might be violated.

  |++++++++                                          | 16% ~18s          
  |+++++++++                                         | 17% ~18s          
Note: Network with lowest lambda selected as best network: assumption of sparsity might be violated.

  |+++++++++                                         | 18% ~18s          
Note: Network with lowest lambda selected as best network: assumption of sparsity might be violated.

  |++++++++++                                        | 19% ~18s          
  |++++++++++                                        | 20% ~18s          
  |+++++++++++                                       | 21% ~17s          
Note: Network with lowest lambda selected as best network: assumption of sparsity might be violated.

  |+++++++++++                                       | 22% ~17s          
Note: Network with lowest lambda selected as best network: assumption of sparsity might be violated.

  |++++++++++++                                      | 23% ~17s          
Note: Network with lowest lambda selected as best network: assumption of sparsity might be violated.

  |++++++++++++                                      | 24% ~16s          
Note: Network with lowest lambda selected as best network: assumption of sparsity might be violated.

  |+++++++++++++                                     | 25% ~16s          
Note: Network with lowest lambda selected as best network: assumption of sparsity might be violated.

  |+++++++++++++                                     | 26% ~16s          
Note: Network with lowest lambda selected as best network: assumption of sparsity might be violated.

  |++++++++++++++                                    | 27% ~15s          
Note: Network with lowest lambda selected as best network: assumption of sparsity might be violated.

  |++++++++++++++                                    | 28% ~15s          
Note: Network with lowest lambda selected as best network: assumption of sparsity might be violated.

  |+++++++++++++++                                   | 29% ~15s          
  |+++++++++++++++                                   | 30% ~14s          
Note: Network with lowest lambda selected as best network: assumption of sparsity might be violated.

  |++++++++++++++++                                  | 31% ~14s          
  |++++++++++++++++                                  | 32% ~14s          
Note: Network with lowest lambda selected as best network: assumption of sparsity might be violated.

  |+++++++++++++++++                                 | 33% ~14s          
  |+++++++++++++++++                                 | 34% ~14s          
  |++++++++++++++++++                                | 35% ~13s          
Note: Network with lowest lambda selected as best network: assumption of sparsity might be violated.

  |++++++++++++++++++                                | 36% ~13s          
Note: Network with lowest lambda selected as best network: assumption of sparsity might be violated.

  |+++++++++++++++++++                               | 37% ~13s          
Note: Network with lowest lambda selected as best network: assumption of sparsity might be violated.

  |+++++++++++++++++++                               | 38% ~13s          
Note: Network with lowest lambda selected as best network: assumption of sparsity might be violated.

  |++++++++++++++++++++                              | 39% ~12s          
Note: Network with lowest lambda selected as best network: assumption of sparsity might be violated.

  |++++++++++++++++++++                              | 40% ~12s          
  |+++++++++++++++++++++                             | 41% ~12s          
Note: Network with lowest lambda selected as best network: assumption of sparsity might be violated.

  |+++++++++++++++++++++                             | 42% ~12s          
  |++++++++++++++++++++++                            | 43% ~12s          
Note: Network with lowest lambda selected as best network: assumption of sparsity might be violated.

  |++++++++++++++++++++++                            | 44% ~11s          
  |+++++++++++++++++++++++                           | 45% ~11s          
Note: Network with lowest lambda selected as best network: assumption of sparsity might be violated.

  |+++++++++++++++++++++++                           | 46% ~11s          
Note: Network with lowest lambda selected as best network: assumption of sparsity might be violated.

  |++++++++++++++++++++++++                          | 47% ~11s          
Note: Network with lowest lambda selected as best network: assumption of sparsity might be violated.

  |++++++++++++++++++++++++                          | 48% ~11s          
  |+++++++++++++++++++++++++                         | 49% ~10s          
Note: Network with lowest lambda selected as best network: assumption of sparsity might be violated.

  |+++++++++++++++++++++++++                         | 50% ~10s          
  |++++++++++++++++++++++++++                        | 51% ~10s          
  |++++++++++++++++++++++++++                        | 52% ~10s          
Note: Network with lowest lambda selected as best network: assumption of sparsity might be violated.

  |+++++++++++++++++++++++++++                       | 53% ~10s          
  |+++++++++++++++++++++++++++                       | 54% ~09s          
Note: Network with lowest lambda selected as best network: assumption of sparsity might be violated.

  |++++++++++++++++++++++++++++                      | 55% ~09s          
Note: Network with lowest lambda selected as best network: assumption of sparsity might be violated.

  |++++++++++++++++++++++++++++                      | 56% ~09s          
Note: Network with lowest lambda selected as best network: assumption of sparsity might be violated.

  |+++++++++++++++++++++++++++++                     | 57% ~09s          
Note: Network with lowest lambda selected as best network: assumption of sparsity might be violated.

  |+++++++++++++++++++++++++++++                     | 58% ~09s          
Note: Network with lowest lambda selected as best network: assumption of sparsity might be violated.

  |++++++++++++++++++++++++++++++                    | 59% ~08s          
Note: Network with lowest lambda selected as best network: assumption of sparsity might be violated.

  |++++++++++++++++++++++++++++++                    | 60% ~08s          
Note: Network with lowest lambda selected as best network: assumption of sparsity might be violated.

  |+++++++++++++++++++++++++++++++                   | 61% ~08s          
Note: Network with lowest lambda selected as best network: assumption of sparsity might be violated.

  |+++++++++++++++++++++++++++++++                   | 62% ~08s          
Note: Network with lowest lambda selected as best network: assumption of sparsity might be violated.

  |++++++++++++++++++++++++++++++++                  | 63% ~08s          
Note: Network with lowest lambda selected as best network: assumption of sparsity might be violated.

  |++++++++++++++++++++++++++++++++                  | 64% ~07s          
Note: Network with lowest lambda selected as best network: assumption of sparsity might be violated.

  |+++++++++++++++++++++++++++++++++                 | 65% ~07s          
Note: Network with lowest lambda selected as best network: assumption of sparsity might be violated.

  |+++++++++++++++++++++++++++++++++                 | 66% ~07s          
Note: Network with lowest lambda selected as best network: assumption of sparsity might be violated.

  |++++++++++++++++++++++++++++++++++                | 67% ~07s          
Note: Network with lowest lambda selected as best network: assumption of sparsity might be violated.

  |++++++++++++++++++++++++++++++++++                | 68% ~07s          
Note: Network with lowest lambda selected as best network: assumption of sparsity might be violated.

  |+++++++++++++++++++++++++++++++++++               | 69% ~06s          
Note: Network with lowest lambda selected as best network: assumption of sparsity might be violated.

  |+++++++++++++++++++++++++++++++++++               | 70% ~06s          
Note: Network with lowest lambda selected as best network: assumption of sparsity might be violated.

  |++++++++++++++++++++++++++++++++++++              | 71% ~06s          
Note: Network with lowest lambda selected as best network: assumption of sparsity might be violated.

  |++++++++++++++++++++++++++++++++++++              | 72% ~06s          
Note: Network with lowest lambda selected as best network: assumption of sparsity might be violated.

  |+++++++++++++++++++++++++++++++++++++             | 73% ~06s          
Note: Network with lowest lambda selected as best network: assumption of sparsity might be violated.

  |+++++++++++++++++++++++++++++++++++++             | 74% ~05s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~05s          
Note: Network with lowest lambda selected as best network: assumption of sparsity might be violated.

  |++++++++++++++++++++++++++++++++++++++            | 76% ~05s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~05s          
Note: Network with lowest lambda selected as best network: assumption of sparsity might be violated.

  |+++++++++++++++++++++++++++++++++++++++           | 78% ~04s          
Note: Network with lowest lambda selected as best network: assumption of sparsity might be violated.

  |++++++++++++++++++++++++++++++++++++++++          | 79% ~04s          
Note: Network with lowest lambda selected as best network: assumption of sparsity might be violated.

  |++++++++++++++++++++++++++++++++++++++++          | 80% ~04s          
Note: Network with lowest lambda selected as best network: assumption of sparsity might be violated.

  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~04s          
Note: Network with lowest lambda selected as best network: assumption of sparsity might be violated.

  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~04s          
Note: Network with lowest lambda selected as best network: assumption of sparsity might be violated.

  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~03s          
Note: Network with lowest lambda selected as best network: assumption of sparsity might be violated.

  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~03s          
Note: Network with lowest lambda selected as best network: assumption of sparsity might be violated.

  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~03s          
Note: Network with lowest lambda selected as best network: assumption of sparsity might be violated.

  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~03s          
Note: Network with lowest lambda selected as best network: assumption of sparsity might be violated.

  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~02s          
Note: Network with lowest lambda selected as best network: assumption of sparsity might be violated.

  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~02s          
Note: Network with lowest lambda selected as best network: assumption of sparsity might be violated.

  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~02s          
Note: Network with lowest lambda selected as best network: assumption of sparsity might be violated.

  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~02s          
Note: Network with lowest lambda selected as best network: assumption of sparsity might be violated.

  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~01s          
Note: Network with lowest lambda selected as best network: assumption of sparsity might be violated.

  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~01s          
Note: Network with lowest lambda selected as best network: assumption of sparsity might be violated.

  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~01s          
Note: Network with lowest lambda selected as best network: assumption of sparsity might be violated.

  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=20s  
Computing statistics...

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~01s          
  |+                                                 | 2 % ~01s          
  |++                                                | 3 % ~01s          
  |++                                                | 4 % ~01s          
  |+++                                               | 5 % ~01s          
  |+++                                               | 6 % ~01s          
  |++++                                              | 7 % ~01s          
  |++++                                              | 8 % ~01s          
  |+++++                                             | 9 % ~01s          
  |+++++                                             | 10% ~01s          
  |++++++                                            | 11% ~01s          
  |++++++                                            | 12% ~01s          
  |+++++++                                           | 13% ~01s          
  |+++++++                                           | 14% ~01s          
  |++++++++                                          | 15% ~01s          
  |++++++++                                          | 16% ~01s          
  |+++++++++                                         | 17% ~01s          
  |+++++++++                                         | 18% ~01s          
  |++++++++++                                        | 19% ~01s          
  |++++++++++                                        | 20% ~01s          
  |+++++++++++                                       | 21% ~01s          
  |+++++++++++                                       | 22% ~01s          
  |++++++++++++                                      | 23% ~01s          
  |++++++++++++                                      | 24% ~01s          
  |+++++++++++++                                     | 25% ~01s          
  |+++++++++++++                                     | 26% ~01s          
  |++++++++++++++                                    | 27% ~01s          
  |++++++++++++++                                    | 28% ~01s          
  |+++++++++++++++                                   | 29% ~01s          
  |+++++++++++++++                                   | 30% ~01s          
  |++++++++++++++++                                  | 31% ~01s          
  |++++++++++++++++                                  | 32% ~01s          
  |+++++++++++++++++                                 | 33% ~01s          
  |+++++++++++++++++                                 | 34% ~01s          
  |++++++++++++++++++                                | 35% ~01s          
  |++++++++++++++++++                                | 36% ~01s          
  |+++++++++++++++++++                               | 37% ~01s          
  |+++++++++++++++++++                               | 38% ~01s          
  |++++++++++++++++++++                              | 39% ~01s          
  |++++++++++++++++++++                              | 40% ~01s          
  |+++++++++++++++++++++                             | 41% ~01s          
  |+++++++++++++++++++++                             | 42% ~01s          
  |++++++++++++++++++++++                            | 43% ~01s          
  |++++++++++++++++++++++                            | 44% ~01s          
  |+++++++++++++++++++++++                           | 45% ~01s          
  |+++++++++++++++++++++++                           | 46% ~01s          
  |++++++++++++++++++++++++                          | 47% ~01s          
  |++++++++++++++++++++++++                          | 48% ~01s          
  |+++++++++++++++++++++++++                         | 49% ~01s          
  |+++++++++++++++++++++++++                         | 50% ~01s          
  |++++++++++++++++++++++++++                        | 51% ~01s          
  |++++++++++++++++++++++++++                        | 52% ~01s          
  |+++++++++++++++++++++++++++                       | 53% ~01s          
  |+++++++++++++++++++++++++++                       | 54% ~01s          
  |++++++++++++++++++++++++++++                      | 55% ~01s          
  |++++++++++++++++++++++++++++                      | 56% ~01s          
  |+++++++++++++++++++++++++++++                     | 57% ~01s          
  |+++++++++++++++++++++++++++++                     | 58% ~01s          
  |++++++++++++++++++++++++++++++                    | 59% ~00s          
  |++++++++++++++++++++++++++++++                    | 60% ~00s          
  |+++++++++++++++++++++++++++++++                   | 61% ~00s          
  |+++++++++++++++++++++++++++++++                   | 62% ~00s          
  |++++++++++++++++++++++++++++++++                  | 63% ~00s          
  |++++++++++++++++++++++++++++++++                  | 64% ~00s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~00s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~00s          
  |++++++++++++++++++++++++++++++++++                | 67% ~00s          
  |++++++++++++++++++++++++++++++++++                | 68% ~00s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~00s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~00s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~00s          
  |++++++++++++++++++++++++++++++++++++              | 72% ~00s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~00s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~00s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~00s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~00s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~00s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~00s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~00s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=01s  
plot(boots, statistics = "ExpectedInfluence") + 
  theme(legend.position = "none")

relative importance network

There is no accounting for the hierarchical nature of the data here

# net_relimp <- estimateNetwork(complete_df[feature_list],
#               default = "relimp",
#               normalize = FALSE)
# net_relimp2 <- estimateNetwork(complete_df[feature_list],
#               default = "relimp",
#               normalize = FALSE,
#               structureDefault = "ggmModSelect",
#               stepwise = FALSE # Sent to structureDefault function
#     )
# Layout <- qgraph::averageLayout(net_relimp, net_relimp2)
# layout(t(1:2))
# plot(net_relimp, layout = Layout, title = "Saturated", edge.labels=TRUE, posCol="#306fbe", negCol="#e58038")
# plot(net_relimp2, layout = Layout, title = "Non-saturated", edge.labels=TRUE, posCol="#306fbe", negCol="#e58038")

graphicalVAR

This approach is not really valid as it uses all time points as if they are from the same person which is not the case here

# Estimate model:
gvar <- estimateNetwork(
  complete_df, default = "graphicalVAR", vars = feature_list,
  tuning = 0, dayvar = "fsd_round", nLambda = 10
)
Loading required namespace: graphicalVAR
Estimating Network. Using package::function:
  - graphicalVAR::graphicalVAR for model estimation
Warning: `funs()` was deprecated in dplyr 0.8.0.
Please use a list of either functions or lambdas: 

  # Simple named list: 
  list(mean = mean, median = median)

  # Auto named with `tibble::lst()`: 
  tibble::lst(mean, median)

  # Using lambdas
  list(~ mean(., trim = .2), ~ median(., na.rm = TRUE))
This warning is displayed once every 8 hours.
Call `lifecycle::last_warnings()` to see where this warning was generated.

  |                                                                                                                         
  |                                                                                                                   |   0%
  |                                                                                                                         
  |=                                                                                                                  |   1%
  |                                                                                                                         
  |==                                                                                                                 |   2%
  |                                                                                                                         
  |===                                                                                                                |   3%
  |                                                                                                                         
  |=====                                                                                                              |   4%
  |                                                                                                                         
  |======                                                                                                             |   5%
  |                                                                                                                         
  |=======                                                                                                            |   6%
  |                                                                                                                         
  |========                                                                                                           |   7%
  |                                                                                                                         
  |=========                                                                                                          |   8%
  |                                                                                                                         
  |==========                                                                                                         |   9%
  |                                                                                                                         
  |============                                                                                                       |  10%
  |                                                                                                                         
  |=============                                                                                                      |  11%
  |                                                                                                                         
  |==============                                                                                                     |  12%
  |                                                                                                                         
  |===============                                                                                                    |  13%
  |                                                                                                                         
  |================                                                                                                   |  14%
  |                                                                                                                         
  |=================                                                                                                  |  15%
  |                                                                                                                         
  |==================                                                                                                 |  16%
  |                                                                                                                         
  |====================                                                                                               |  17%
  |                                                                                                                         
  |=====================                                                                                              |  18%
  |                                                                                                                         
  |======================                                                                                             |  19%
  |                                                                                                                         
  |=======================                                                                                            |  20%
  |                                                                                                                         
  |========================                                                                                           |  21%
  |                                                                                                                         
  |=========================                                                                                          |  22%
  |                                                                                                                         
  |==========================                                                                                         |  23%
  |                                                                                                                         
  |============================                                                                                       |  24%
  |                                                                                                                         
  |=============================                                                                                      |  25%
  |                                                                                                                         
  |==============================                                                                                     |  26%
  |                                                                                                                         
  |===============================                                                                                    |  27%
  |                                                                                                                         
  |================================                                                                                   |  28%
  |                                                                                                                         
  |=================================                                                                                  |  29%
  |                                                                                                                         
  |==================================                                                                                 |  30%
  |                                                                                                                         
  |====================================                                                                               |  31%
  |                                                                                                                         
  |=====================================                                                                              |  32%
  |                                                                                                                         
  |======================================                                                                             |  33%
  |                                                                                                                         
  |=======================================                                                                            |  34%
  |                                                                                                                         
  |========================================                                                                           |  35%
  |                                                                                                                         
  |=========================================                                                                          |  36%
  |                                                                                                                         
  |===========================================                                                                        |  37%
  |                                                                                                                         
  |============================================                                                                       |  38%
  |                                                                                                                         
  |=============================================                                                                      |  39%
  |                                                                                                                         
  |==============================================                                                                     |  40%
  |                                                                                                                         
  |===============================================                                                                    |  41%
  |                                                                                                                         
  |================================================                                                                   |  42%
  |                                                                                                                         
  |=================================================                                                                  |  43%
  |                                                                                                                         
  |===================================================                                                                |  44%
  |                                                                                                                         
  |====================================================                                                               |  45%
  |                                                                                                                         
  |=====================================================                                                              |  46%
  |                                                                                                                         
  |======================================================                                                             |  47%
  |                                                                                                                         
  |=======================================================                                                            |  48%
  |                                                                                                                         
  |========================================================                                                           |  49%
  |                                                                                                                         
  |==========================================================                                                         |  50%
  |                                                                                                                         
  |===========================================================                                                        |  51%
  |                                                                                                                         
  |============================================================                                                       |  52%
  |                                                                                                                         
  |=============================================================                                                      |  53%
  |                                                                                                                         
  |==============================================================                                                     |  54%
  |                                                                                                                         
  |===============================================================                                                    |  55%
  |                                                                                                                         
  |================================================================                                                   |  56%
  |                                                                                                                         
  |==================================================================                                                 |  57%
  |                                                                                                                         
  |===================================================================                                                |  58%
  |                                                                                                                         
  |====================================================================                                               |  59%
  |                                                                                                                         
  |=====================================================================                                              |  60%
  |                                                                                                                         
  |======================================================================                                             |  61%
  |                                                                                                                         
  |=======================================================================                                            |  62%
  |                                                                                                                         
  |========================================================================                                           |  63%
  |                                                                                                                         
  |==========================================================================                                         |  64%
  |                                                                                                                         
  |===========================================================================                                        |  65%
  |                                                                                                                         
  |============================================================================                                       |  66%
  |                                                                                                                         
  |=============================================================================                                      |  67%
  |                                                                                                                         
  |==============================================================================                                     |  68%
  |                                                                                                                         
  |===============================================================================                                    |  69%
  |                                                                                                                         
  |================================================================================                                   |  70%
  |                                                                                                                         
  |==================================================================================                                 |  71%
  |                                                                                                                         
  |===================================================================================                                |  72%
  |                                                                                                                         
  |====================================================================================                               |  73%
  |                                                                                                                         
  |=====================================================================================                              |  74%
  |                                                                                                                         
  |======================================================================================                             |  75%
  |                                                                                                                         
  |=======================================================================================                            |  76%
  |                                                                                                                         
  |=========================================================================================                          |  77%
  |                                                                                                                         
  |==========================================================================================                         |  78%
  |                                                                                                                         
  |===========================================================================================                        |  79%
  |                                                                                                                         
  |============================================================================================                       |  80%
  |                                                                                                                         
  |=============================================================================================                      |  81%
  |                                                                                                                         
  |==============================================================================================                     |  82%
  |                                                                                                                         
  |===============================================================================================                    |  83%
  |                                                                                                                         
  |=================================================================================================                  |  84%
  |                                                                                                                         
  |==================================================================================================                 |  85%
  |                                                                                                                         
  |===================================================================================================                |  86%
  |                                                                                                                         
  |====================================================================================================               |  87%
  |                                                                                                                         
  |=====================================================================================================              |  88%
  |                                                                                                                         
  |======================================================================================================             |  89%
  |                                                                                                                         
  |========================================================================================================           |  90%
  |                                                                                                                         
  |=========================================================================================================          |  91%
  |                                                                                                                         
  |==========================================================================================================         |  92%
  |                                                                                                                         
  |===========================================================================================================        |  93%
  |                                                                                                                         
  |============================================================================================================       |  94%
  |                                                                                                                         
  |=============================================================================================================      |  95%
  |                                                                                                                         
  |==============================================================================================================     |  96%
  |                                                                                                                         
  |================================================================================================================   |  97%
  |                                                                                                                         
  |=================================================================================================================  |  98%
  |                                                                                                                         
  |================================================================================================================== |  99%
  |                                                                                                                         
  |===================================================================================================================| 100%
Minimal tuning parameter for kappa selected.
Layout <- qgraph::averageLayout(gvar$graph$temporal,
                                gvar$graph$contemporaneous)
layout(t(1:2))
plot(gvar, graph = "temporal", layout = Layout,
     title = "Temporal", edge.labels=TRUE, posCol="#306fbe", negCol="#e58038", label.scale.equal=TRUE, label.cex=10)
plot(gvar, graph = "contemporaneous", layout = Layout,
     title = "Contemporaneous", edge.labels=TRUE, posCol="#306fbe", negCol="#e58038", label.scale.equal=TRUE, label.cex=10)

# gvar_boot <- bootnet(gvar, nBoots = 2, nCores = 2)
# plot(gvar_boot, graph = "contemporaneous", plot = "interval")

Mixed Graphical model

net_mgm <- estimateNetwork(complete_df[feature_list],
              default = "mgm",
              type="g",
              level=1
              # type=c("g", "g", "g", "g", "c", "c", "c", "g"),
              # level=c(1, 1, 1, 1, 12, 7, 15, 1)
              )
Estimating Network. Using package::function:
  - mgm::mgm for network computation
    - Using glmnet::glmnet
plot(net_mgm, layout = Layout,
     title = "mgm", edge.labels=TRUE, posCol="#306fbe", negCol="#e58038", label.scale.equal=TRUE, label.cex=10)

par(mar=c(5,1,10,1)+7)
for (checkpoint in unique(complete_df[, "fsd_round"])) {
  net_mgm <- estimateNetwork(complete_df[complete_df["fsd_round"]==checkpoint, feature_list], 
              default = "mgm",
              type="g",
              level=1)
  plot(net_mgm, layout = Layout, 
       # title = paste("mgm network", "checkpoint =", checkpoint), 
       edge.labels=TRUE, posCol="#306fbe", negCol="#e58038", label.scale.equal=TRUE, label.cex=10)
  
  title(main=paste("Mixed Graphical Model network", "checkpoint =", checkpoint), line=16.25)
}
Estimating Network. Using package::function:
  - mgm::mgm for network computation
    - Using glmnet::glmnet
Estimating Network. Using package::function:
  - mgm::mgm for network computation
    - Using glmnet::glmnet

Estimating Network. Using package::function:
  - mgm::mgm for network computation
    - Using glmnet::glmnet

Estimating Network. Using package::function:
  - mgm::mgm for network computation
    - Using glmnet::glmnet

Estimating Network. Using package::function:
  - mgm::mgm for network computation
    - Using glmnet::glmnet

Estimating Network. Using package::function:
  - mgm::mgm for network computation
    - Using glmnet::glmnet

Estimating Network. Using package::function:
  - mgm::mgm for network computation
    - Using glmnet::glmnet

Estimating Network. Using package::function:
  - mgm::mgm for network computation
    - Using glmnet::glmnet

Estimating Network. Using package::function:
  - mgm::mgm for network computation
    - Using glmnet::glmnet

Estimating Network. Using package::function:
  - mgm::mgm for network computation
    - Using glmnet::glmnet

Estimating Network. Using package::function:
  - mgm::mgm for network computation
    - Using glmnet::glmnet

Estimating Network. Using package::function:
  - mgm::mgm for network computation
    - Using glmnet::glmnet

Estimating Network. Using package::function:
  - mgm::mgm for network computation
    - Using glmnet::glmnet

Estimating Network. Using package::function:
  - mgm::mgm for network computation
    - Using glmnet::glmnet

Estimating Network. Using package::function:
  - mgm::mgm for network computation
    - Using glmnet::glmnet

Estimating Network. Using package::function:
  - mgm::mgm for network computation
    - Using glmnet::glmnet

Estimating Network. Using package::function:
  - mgm::mgm for network computation
    - Using glmnet::glmnet

Estimating Network. Using package::function:
  - mgm::mgm for network computation
    - Using glmnet::glmnet

Partial Correlation network

net_par_cor <- estimateNetwork(complete_df[feature_list], 
              default = "pcor")
Estimating Network. Using package::function:
  - qgraph::qgraph(..., graph = 'pcor') for network computation
  - psych::corr.p for significance thresholding
plot(net_par_cor, layout = Layout, 
     title = "Partial Correlation", edge.labels=TRUE, posCol="#306fbe", negCol="#e58038", label.scale.equal=TRUE, label.cex=10)

par(mar=c(5,1,10,1)+7)
for (checkpoint in unique(complete_df[, "fsd_round"])) {
  net_par_cor <- estimateNetwork(complete_df[complete_df["fsd_round"]==checkpoint, feature_list], 
              default = "pcor")
  plot(net_par_cor, layout = Layout, 
       edge.labels=TRUE, posCol="#306fbe", negCol="#e58038", label.scale.equal=TRUE, label.cex=10)
  
  title(main=paste("Partial Correlation network", "checkpoint =", checkpoint), line=16.25)
}
Estimating Network. Using package::function:
  - qgraph::qgraph(..., graph = 'pcor') for network computation
  - psych::corr.p for significance thresholding
Estimating Network. Using package::function:
  - qgraph::qgraph(..., graph = 'pcor') for network computation
  - psych::corr.p for significance thresholding

Estimating Network. Using package::function:
  - qgraph::qgraph(..., graph = 'pcor') for network computation
  - psych::corr.p for significance thresholding

Estimating Network. Using package::function:
  - qgraph::qgraph(..., graph = 'pcor') for network computation
  - psych::corr.p for significance thresholding

Estimating Network. Using package::function:
  - qgraph::qgraph(..., graph = 'pcor') for network computation
  - psych::corr.p for significance thresholding

Estimating Network. Using package::function:
  - qgraph::qgraph(..., graph = 'pcor') for network computation
  - psych::corr.p for significance thresholding

Estimating Network. Using package::function:
  - qgraph::qgraph(..., graph = 'pcor') for network computation
  - psych::corr.p for significance thresholding

Estimating Network. Using package::function:
  - qgraph::qgraph(..., graph = 'pcor') for network computation
  - psych::corr.p for significance thresholding

Estimating Network. Using package::function:
  - qgraph::qgraph(..., graph = 'pcor') for network computation
  - psych::corr.p for significance thresholding

Estimating Network. Using package::function:
  - qgraph::qgraph(..., graph = 'pcor') for network computation
  - psych::corr.p for significance thresholding

Estimating Network. Using package::function:
  - qgraph::qgraph(..., graph = 'pcor') for network computation
  - psych::corr.p for significance thresholding

Estimating Network. Using package::function:
  - qgraph::qgraph(..., graph = 'pcor') for network computation
  - psych::corr.p for significance thresholding

Estimating Network. Using package::function:
  - qgraph::qgraph(..., graph = 'pcor') for network computation
  - psych::corr.p for significance thresholding

Estimating Network. Using package::function:
  - qgraph::qgraph(..., graph = 'pcor') for network computation
  - psych::corr.p for significance thresholding

Estimating Network. Using package::function:
  - qgraph::qgraph(..., graph = 'pcor') for network computation
  - psych::corr.p for significance thresholding

Estimating Network. Using package::function:
  - qgraph::qgraph(..., graph = 'pcor') for network computation
  - psych::corr.p for significance thresholding

Estimating Network. Using package::function:
  - qgraph::qgraph(..., graph = 'pcor') for network computation
  - psych::corr.p for significance thresholding

Estimating Network. Using package::function:
  - qgraph::qgraph(..., graph = 'pcor') for network computation
  - psych::corr.p for significance thresholding

Correlation network

net_cor <- estimateNetwork(complete_df[feature_list], 
              default = "cor")
Estimating Network. Using package::function:
  - psych::corr.p for significance thresholding
plot(net_cor, layout = Layout, 
     title = "Correlation", edge.labels=TRUE, posCol="#306fbe", negCol="#e58038", label.scale.equal=TRUE, label.cex=10)

GGMncv network

net_GGMncv <- estimateNetwork(complete_df[feature_list], 
              default = "GGMncv")
Loading required namespace: GGMncv
Registered S3 method overwritten by 'GGMncv':
  method     from   
  plot.graph BDgraph
Estimating Network. Using package::function:
  - GGMncv::ggmncv for model estimation
selecting lambda

  |                                                                                                                         
  |                                                                                                                   |   0%
  |                                                                                                                         
  |==                                                                                                                 |   2%
  |                                                                                                                         
  |=====                                                                                                              |   4%
  |                                                                                                                         
  |=======                                                                                                            |   6%
  |                                                                                                                         
  |=========                                                                                                          |   8%
  |                                                                                                                         
  |============                                                                                                       |  10%
  |                                                                                                                         
  |==============                                                                                                     |  12%
  |                                                                                                                         
  |================                                                                                                   |  14%
  |                                                                                                                         
  |==================                                                                                                 |  16%
  |                                                                                                                         
  |=====================                                                                                              |  18%
  |                                                                                                                         
  |=======================                                                                                            |  20%
  |                                                                                                                         
  |=========================                                                                                          |  22%
  |                                                                                                                         
  |============================                                                                                       |  24%
  |                                                                                                                         
  |==============================                                                                                     |  26%
  |                                                                                                                         
  |================================                                                                                   |  28%
  |                                                                                                                         
  |==================================                                                                                 |  30%
  |                                                                                                                         
  |=====================================                                                                              |  32%
  |                                                                                                                         
  |=======================================                                                                            |  34%
  |                                                                                                                         
  |=========================================                                                                          |  36%
  |                                                                                                                         
  |============================================                                                                       |  38%
  |                                                                                                                         
  |==============================================                                                                     |  40%
  |                                                                                                                         
  |================================================                                                                   |  42%
  |                                                                                                                         
  |===================================================                                                                |  44%
  |                                                                                                                         
  |=====================================================                                                              |  46%
  |                                                                                                                         
  |=======================================================                                                            |  48%
  |                                                                                                                         
  |==========================================================                                                         |  50%
  |                                                                                                                         
  |============================================================                                                       |  52%
  |                                                                                                                         
  |==============================================================                                                     |  54%
  |                                                                                                                         
  |================================================================                                                   |  56%
  |                                                                                                                         
  |===================================================================                                                |  58%
  |                                                                                                                         
  |=====================================================================                                              |  60%
  |                                                                                                                         
  |=======================================================================                                            |  62%
  |                                                                                                                         
  |==========================================================================                                         |  64%
  |                                                                                                                         
  |============================================================================                                       |  66%
  |                                                                                                                         
  |==============================================================================                                     |  68%
  |                                                                                                                         
  |================================================================================                                   |  70%
  |                                                                                                                         
  |===================================================================================                                |  72%
  |                                                                                                                         
  |=====================================================================================                              |  74%
  |                                                                                                                         
  |=======================================================================================                            |  76%
  |                                                                                                                         
  |==========================================================================================                         |  78%
  |                                                                                                                         
  |============================================================================================                       |  80%
  |                                                                                                                         
  |==============================================================================================                     |  82%
  |                                                                                                                         
  |=================================================================================================                  |  84%
  |                                                                                                                         
  |===================================================================================================                |  86%
  |                                                                                                                         
  |=====================================================================================================              |  88%
  |                                                                                                                         
  |========================================================================================================           |  90%
  |                                                                                                                         
  |==========================================================================================================         |  92%
  |                                                                                                                         
  |============================================================================================================       |  94%
  |                                                                                                                         
  |==============================================================================================================     |  96%
  |                                                                                                                         
  |=================================================================================================================  |  98%
  |                                                                                                                         
  |===================================================================================================================| 100%
plot(net_GGMncv, layout = Layout, 
     title = "GGMncv", edge.labels=TRUE, posCol="#306fbe", negCol="#e58038", label.scale.equal=TRUE, label.cex=10)

LS0tCnRpdGxlOiAidW5pZmllZCBTRU0gYW5kIE11bHRpbGV2ZWwgVkFSIEVzdGltYXRpb24gYWxsIGRldGVybWluYW50cyIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKIyBPdXRsaW5lClRoaXMgc2NyaXB0IGNvdmVycyB0aGUgZm9sbG93aW5nIHN0ZXBzCgpBLiBOID0gMSBtb2RlbCAtIHVuaWZpZWQgU3RydWN0dXJhbCBFcXVhdGlvbiBNb2RlbCAodVNFTSkKCi0gU2V0IHVwIHRoZSB1U0VNIG1vZGVsCgotIENoZWNrIG1vZGVsIHN1bW1hcnkgKG1vZGVsIGZpdCBzdGF0aXN0aWNzKQoKLSBEYXRhIHZpc3VhbGl6YXRpb24gYW5kIGludGVycHJldGF0aW9uIG9mIHJlc3VsdHMKCkIuIE4gPSBhbGwgTXVsdGlsZXZlbCBWQVIgTW9kZWwKCi0gU2V0IHVwIHRoZSBtbFZBUiBtb2RlbAoKLSBDaGVjayBtb2RlbCBzdW1tYXJ5KG1vZGVsIGZpdCBzdGF0aXN0aWNzKQoKLSBEYXRhIHZpc3VhbGl6YXRpb24gYW5kIGludGVycHJldGF0aW9uIG9mIHJlc3VsdHMKCkMuIFNlbGVjdGVkIFJlYWRpbmdzCgotIGZvciB1U0VNIG1vZGVsOiBZYW5nLCBYLiwgUmFtLCBOLiwgR2VzdCwgUy4sIEx5ZG9uLCBELiwgQ29ucm95LCBELiBFLiwgUGluY3VzLCBBLiBMLiwgJiBNb2xlbmFhciwgUC4gQy4gTS4gKDIwMTgpLiBTb2Npb2Vtb3Rpb25hbCBkeW5hbWljcyBvZiBlbW90aW9uIHJlZ3VsYXRpb24gYW5kIGRlcHJlc3NpdmUgc3ltcHRvbXM6IEEgcGVyc29uLXNwZWNpZmljIG5ldHdvcmsgYXBwcm9hY2guIENvbXBsZXhpdHksIDIwMTgsIEFydGljbGUgSUQgNTA5NDE3OS4gZG9pOiAxMC4xMTU1LzIwMTgvNTA5NDE3OSBbT3BlbiBBY2Nlc3MgaHR0cHM6Ly93d3cuaGluZGF3aS5jb20vam91cm5hbHMvY29tcGxleGl0eS8yMDE4LzUwOTQxNzkvXQoKLSBmb3IgbWxWQVIgbW9kZWw6IEJyaW5nbWFubiBMRiwgVmlzc2VycyBOLCBXaWNoZXJzIE0sIEdlc2Nod2luZCBOLCBLdXBwZW5zIFAsIFBlZXRlcnMgRiwgZXQgYWwuICgyMDEzKSBBIE5ldHdvcmsgQXBwcm9hY2ggdG8gUHN5Y2hvcGF0aG9sb2d5OiBOZXcgSW5zaWdodHMgaW50byBDbGluaWNhbCBMb25naXR1ZGluYWwgRGF0YS4gUExvUyBPTkUgOCg0KTogZTYwMTg4LiBodHRwczovL2RvaS5vcmcvMTAuMTM3MS9qb3VybmFsLnBvbmUuMDA2MDE4OCBbT3BlbiBBY2Nlc3MgaHR0cHM6Ly9qb3VybmFscy5wbG9zLm9yZy9wbG9zb25lL2FydGljbGU/aWQ9MTAuMTM3MS9qb3VybmFsLnBvbmUuMDA2MDE4OF0KCiMjIyBQcmVsaW1pbmFyaWVzCiMjIyMgTG9hZGluZyBMaWJyYXJpZXMKCkxvYWRpbmcgbGlicmFyaWVzIHVzZWQgaW4gdGhpcyBzY3JpcHQKCmBgYHtyfQojIENoZWNrIHRvIHNlZSBpZiBuZWNlc3NhcnkgcGFja2FnZXMgYXJlIGluc3RhbGxlZCwgYW5kIGluc3RhbGwgaWYgbm90CnBhY2thZ2VzIDwtIGMoInBzeWNoIiwgInBvbXBvbSIsICJtbFZBUiIsICJib290bmV0IiwgInBzeWNob25ldHJpY3MiLCAiR0dNbmN2IiwgIkVzdGltYXRlR3JvdXBOZXR3b3JrIiwgInJlbGFpbXBvIikKaWYgKGxlbmd0aChzZXRkaWZmKHBhY2thZ2VzLCByb3duYW1lcyhpbnN0YWxsZWQucGFja2FnZXMoKSkpKSA+IDApIHsKICBpbnN0YWxsLnBhY2thZ2VzKHNldGRpZmYocGFja2FnZXMsIHJvd25hbWVzKGluc3RhbGxlZC5wYWNrYWdlcygpKSkpICAKfQojIExvYWQgcGFja2FnZXMKbGlicmFyeSh0aWR5cikKbGlicmFyeShsdWJyaWRhdGUpCmxpYnJhcnkoc3RyaW5ncikKbGlicmFyeShwc3ljaCkgI2ZvciBkYXRhIGRlc2NyaXB0aW9uCmxpYnJhcnkocGx5cikgI2ZvciBkYXRhIG1hbmlwdWxhdGlvbgpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KGdncGxvdDIpICNmb3IgZGF0YSB2aXN1YWxpemF0aW9uCiMgbGlicmFyeShwb21wb20pICNmb3IgdVNFTQojIGxpYnJhcnkobWxWQVIpICNmb3IgbWxWQVIgbW9kZWxzCmxpYnJhcnkoYm9vdG5ldCkKbGlicmFyeShwc3ljaG9uZXRyaWNzKQpsaWJyYXJ5KEVzdGltYXRlR3JvdXBOZXR3b3JrKQpgYGAKCiMjIyBMb2FkaW5nIERhdGEKCmBgYHtyfQpmc19kZW1vX2NvbHVtbnMgPC0gYygnaWQnLCAnZGVtb2dyYXBoaWNfYWdlJywgJ2RlbW9ncmFwaGljX2FnZV9mYWN0b3InLAogICAgICAgJ2RlbW9ncmFwaGljX2VkdWNhdGlvbicsICdkZW1vZ3JhcGhpY19nZW5kZXInLAogICAgICAgJ2RlbW9ncmFwaGljX2dlbmRlcl9mYWN0b3InLCAnZGVtb2dyYXBoaWNfaW5jb21lJywKICAgICAgICdkZW1vZ3JhcGhpY19saXZpbmdfd2l0aCcsICdkZW1vZ3JhcGhpY19yZWdpb24nLAogICAgICAgIyAnZGVtb2dyYXBoaWNfdW5kZXJhZ2VfY2hpbGRyZW4nLAogICAgICAgJ2RlbW9ncmFwaGljX3VuZGVyYWdlX2NoaWxkcmVuX2ZhY3RvcicsICdmc2RfZW5kJywgCiAgICAgICAjICdmc2RfaWQnLAogICAgICAgIyAnZnNkX25vJywgCiAgICAgICAnZnNkX3JvdW5kJywgCiAgICAgICAnZnNkX3N0YXJ0JywgJ2ZzZF92bmsnLCAKICAgICAgICMgJ2ZzZF92cicsCiAgICAgICAnZnNkX3dlaWdodCcpCgpgYGAKCmBgYHtyfQpkZiA8LSByZWFkLmNzdigiLi4vY2l0aXplbl9zaGllbGQvZGF0YS9rcF9kZl9lbmdfb3JkaW5hbC5jc3YiLCBoZWFkZXI9VFJVRSwgcm93Lm5hbWVzID0gIlgiKQpyZW1vdmVfbmEgPC0gZnVuY3Rpb24oREYsIG49MCkgewogIERGWywgY29sU3Vtcyhpcy5uYShERikpIDw9IG5dCn0KCmRmIDwtIHJlbW92ZV9uYShkZiwgbj00MDAwKQoKYGBgCgpgYGB7cn0KIyBkZXNjcmliZUJ5KGRmLCBncm91cD0idXNlcl9pZCIpCiMgdG1wIDwtIGRmICU+JQojICAgZ3JvdXBfYnkodXNlcl9pZCkgJT4lCiMgICBzdW1tYXJpc2VfYXQodmFycyhmZWF0dXJlX2xpc3QpLCBmdW5zKHNkKC4sIG5hLnJtPVRSVUUpKSkKYGBgCgoKCiMjIyMgY3JlYXRlIGEgZmVhdHVyZSBsaXN0IGJhc2VkIG9uIHRoZSBjb2x1bW4gbmFtZXMgb2YgdGhlIGRhdGEgZnJhbWUKCmBgYHtyfQpmZWF0dXJlX2xpc3QgPC0gY29sbmFtZXMoZGYgJT4lIHNlbGVjdCgtZnNfZGVtb19jb2x1bW5zKSkKYGBgCgojIyMjIFNob3cgdGhlIGhlYWQgYW5kIGRlc2NyaXB0aW9uIG9mIHRoZSBvdmVyYWxsIGRhdGEgZnJhbWUKCmBgYHtyfQpoZWFkKGRmKQpgYGAKCmBgYHtyfQojIGRlc2NyaWJlQnkoZGYsIGdyb3VwID0gInVzZXJfaWQiKQojIGRlc2NyaWJlKGRmKQpgYGAKCiMjIyMgU2hvdyB0aGUgaGVhZCBhbmQgZGVzY3JwdGlvbiBvZiBhbiBleGFtcGxlIHVzZXIgCgpgYGB7cn0KZXhhbXBsZV9yb3VuZCA8LSAxCmRhdGFfaW5kaXYgPC0gZGZbZGYkZnNkX3JvdW5kID09IGV4YW1wbGVfcm91bmQsIF0KIyBoZWFkKGRhdGFfaW5kaXYpCiMgZGVzY3JpYmUoZGF0YV9pbmRpdikKYGBgCgoKYGBge3J9CnBsb3RfZGYgPC0gZGF0YV9pbmRpdiAlPiUKICBzZWxlY3QoYyhpZCwgZnNkX3JvdW5kKSwgYWxsX29mKGZlYXR1cmVfbGlzdFsxOjIwXSkpICU+JQogIGdhdGhlcihrZXkgPSAidmFyaWFibGUiLCB2YWx1ZSA9ICJ2YWx1ZSIsIC1jKGlkLCBmc2Rfcm91bmQpKQpgYGAKCiMjIyMgcGxvdHRpbmcgaW50cmFpbmRpdmlkdWFsIGNoYW5nZSAKCmBgYHtyfQojcGxvdHRpbmcgaW50cmFpbmRpdmlkdWFsIGNoYW5nZSAKZ2dwbG90KGRhdGEgPSBwbG90X2RmLAogICAgICAgYWVzKHggPSBpZCwgeT12YWx1ZSwgZ3JvdXA9IGZzZF9yb3VuZCkpICsKICAjZmlyc3QgdmFyaWFibGUKICBnZW9tX2xpbmUoYWVzKGNvbG9yID0gdmFyaWFibGUpKSArIAogICNwbG90IGxheW91dHMKICBzY2FsZV94X2NvbnRpbnVvdXMobmFtZT0iQXJiaXRyYXJ5IFRpbWUiKSArCiAgc2NhbGVfeV9jb250aW51b3VzKG5hbWU9IlJhdyBWYWx1ZXMiKSArICAKICB0aGVtZV9jbGFzc2ljKCkgKwogIHRoZW1lKGF4aXMudGl0bGU9ZWxlbWVudF90ZXh0KHNpemU9MTQpLAogICAgICAgIGF4aXMudGV4dD1lbGVtZW50X3RleHQoc2l6ZT0xNCksCiAgICAgICAgcGxvdC50aXRsZT1lbGVtZW50X3RleHQoc2l6ZT0xNCwgaGp1c3Q9LjUpKSArCiAgZ2d0aXRsZShleGFtcGxlX3JvdW5kKQpgYGAKIyMjIyBOb3JtYWxpemUgdGhlIGRhdGEgZnJhbWUgKGNvbnNpZGVyIG1pbiBtYXggbWF5YmUpCgpgYGB7cn0KIyBzdGFuZGFyZGl6ZSBzcGVjaWZpYyBkYXRhIGNvbHVtbnMgKG5vdCB0aGUgaWQgb3IgdGltZSB2YXJpYWJsZXMgaW4gZmlyc3QgMyBjb2x1bW5zKQpkYXRhX2luZGl2W2ZlYXR1cmVfbGlzdF0gPC0gbGFwcGx5KGRhdGFfaW5kaXZbZmVhdHVyZV9saXN0XSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24oeCkgYyhzY2FsZSh4LCBjZW50ZXI9VFJVRSwgc2NhbGU9VFJVRSkpKQojIGRlc2NyaWJlKGRhdGFfaW5kaXYpCmBgYAoKIyMjIyBwbG90dGluZyBub3JtYWxpemVkIGludHJhaW5kaXZpZHVhbCBjaGFuZ2UgCmBgYHtyfQpwbG90X2RmIDwtIGRhdGFfaW5kaXYgJT4lCiAgc2VsZWN0KGMoaWQsIGZzZF9yb3VuZCksIGFsbF9vZihmZWF0dXJlX2xpc3RbMToyMF0pKSAlPiUKICBnYXRoZXIoa2V5ID0gInZhcmlhYmxlIiwgdmFsdWUgPSAidmFsdWUiLCAtYyhpZCwgZnNkX3JvdW5kKSkKYGBgCgoKYGBge3J9CiNwbG90dGluZyBpbnRyYWluZGl2aWR1YWwgY2hhbmdlIApnZ3Bsb3QoZGF0YSA9IHBsb3RfZGYsCiAgICAgICBhZXMoeCA9IGlkLCB5PXZhbHVlLCBncm91cD0gZnNkX3JvdW5kKSkgKwogICNmaXJzdCB2YXJpYWJsZQogIGdlb21fbGluZShhZXMoY29sb3IgPSB2YXJpYWJsZSkpICsgCiAgI3Bsb3QgbGF5b3V0cwogIHNjYWxlX3hfY29udGludW91cyhuYW1lPSJBcmJpdHJhcnkgVGltZSIpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobmFtZT0iUmF3IFZhbHVlcyIpICsgIAogIHRoZW1lX2NsYXNzaWMoKSArCiAgdGhlbWUoYXhpcy50aXRsZT1lbGVtZW50X3RleHQoc2l6ZT0xNCksCiAgICAgICAgYXhpcy50ZXh0PWVsZW1lbnRfdGV4dChzaXplPTE0KSwKICAgICAgICBwbG90LnRpdGxlPWVsZW1lbnRfdGV4dChzaXplPTE0LCBoanVzdD0uNSkpICsKICBnZ3RpdGxlKGV4YW1wbGVfcm91bmQpCmBgYAoKCk5vdyB3ZSBzZWUgdGhhdCBhbGwgdGhlIHZhcmlhYmxlcyBhcmUgaW4gc3RhbmRhcmRpemVkIGZvcm0uCgojIyMgQ2hlY2sgdGhlIGRhdGEKCkl0IGlzIHVzZWZ1bCB0byBjaGVjayB0aGF0IHRoZXJlIGFyZSBkYXRhIGluIGFsbCBjb2x1bW5zLiBJZiBhbnkgb25lIG9mIHRoZSB2YXJpYWJsZXMgaXMgYWxsIG1pc3NpbmcgKG9yIGhhcyBubyB2YXJpYW5jZSksIHRoZSBtb2RlbCBjYW5ub3QgYmUgZml0LiBNaXNzaW5nIGRhdGEgb24gYSBmZXcgb2JzZXJ2YXRpb25zIHdpdGhpbiBhIGNvbHVtbiBpcyBvay4KCmBgYHtyfQojIGNoZWNrIGNvbHVtbiBtaXNzaW5nCm5hX2NvbCA8LSAwCmZvciAoY29sIGluIDE6bmNvbChkYXRhX2luZGl2KSkgewogIGlmIChzdW0oaXMubmEoZGF0YV9pbmRpdlssY29sXSkpID09IG5yb3coZGF0YV9pbmRpdikpewogICAgICAgIG5hX2NvbCA8LSBuYV9jb2wgKyAxCiAgfQp9Cm5hX2NvbApgYGAKCkFsbCBjb2x1bW5zIGFyZSByZXBvcnRlZC4KCiMjIyBEZXNjcmliaW5nIHRoZSBkYXRhLgpgYGB7cn0KZGVzY3JpYmUoZGYpCmBgYAoKIyMjIE5vdCBzdGFuZGFyZGl6aW5nIHRoZSBkYXRhCgpGb3IgdGhlIGZvbGxvd2luZyBuZXR3b3JrcywgdGhlIGRhdGEgYXJlIGtlcHQgaW4gdGhlaXIgb3JpZ2luYWwgZm9ybS4KCmBgYHtyfQojIyBJbXB1dGUgdGhlIGZlYXR1cmVfbGlzdCBtaXNzaW5nbmVzcwojIGltcC5jYXJ0IDwtIG1pY2U6Om1pY2UoZGZbLCBmZWF0dXJlX2xpc3RdLCBtZXRob2Q9ImNhcnQiLCBwcmludEZsYWcgPSBGQUxTRSkKIyBkZlssIGZlYXR1cmVfbGlzdF0gPC0gbWljZTo6Y29tcGxldGUoaW1wLmNhcnQpCmNvbXBsZXRlX2RmIDwtIGRmW2NvbXBsZXRlLmNhc2VzKGRmWywgYygiaWQiLCAiZnNkX3JvdW5kIiwgZmVhdHVyZV9saXN0KV0pLCBjKCJpZCIsICJmc2Rfcm91bmQiLCBmZWF0dXJlX2xpc3QpXQpgYGAKCiMjIyBnZ21Nb2RTZWxlY3QgYW5kIEVCSUNnbGFzc28gbmV0d29ya3MKVGhlcmUgaXMgbm8gYWNjb3VudGluZyBmb3IgdGhlIGhpZXJhcmNoaWNhbCBuYXR1cmUgb2YgdGhlIGRhdGEgaGVyZS4gVW5yZWd1bGFyaXplZCBHYXVzc2lhbiBHcmFwaGljYWwgTW9kZWwgKCJnZ21Nb2RTZWxlY3QiOyBHR00pIHVzaW5nIHRoZSBnbGFzc28gYWxnb3JpdGhtIGFuZCBzdGVwd2lzZSBtb2RlbCBzZWxlY3Rpb24uIEdhdXNzaWFuIE1hcmtvdiByYW5kb20gZmllbGQgZXN0aW1hdGlvbiB1c2luZyBncmFwaGljYWwgTEFTU08gYW5kIGV4dGVuZGVkIEJheWVzaWFuIGluZm9ybWF0aW9uIGNyaXRlcmlvbiAoIkVCSUNnbGFzc28iKSB0byBzZWxlY3Qgb3B0aW1hbCByZWd1bGFyaXphdGlvbiBwYXJhbWV0ZXIuCgpgYGB7cn0KbmV0X21vZFNlbGVjdCA8LSBlc3RpbWF0ZU5ldHdvcmsoY29tcGxldGVfZGZbZmVhdHVyZV9saXN0XSwgCiAgICAgICAgICAgICAgZGVmYXVsdCA9ICJnZ21Nb2RTZWxlY3QiLAogICAgICAgICAgICAgIHN0ZXB3aXNlID0gRkFMU0UsCiAgICAgICAgICAgICAgY29yTWV0aG9kID0gImNvciIpCmBgYAoKYGBge3J9Cm5ldF90aHJlc2ggPC0gZXN0aW1hdGVOZXR3b3JrKGNvbXBsZXRlX2RmW2ZlYXR1cmVfbGlzdF0sCiAgICAgICAgICAgICAgdHVuaW5nID0gMCwgIyBFQklDZ2xhc3NvIHNldHMgdHVuaW5nIHRvIDAuNSBieSBkZWZhdWx0CiAgICAgICAgICAgICAgZGVmYXVsdCA9ICJFQklDZ2xhc3NvIiwKICAgICAgICAgICAgICB0aHJlc2hvbGQgPSBUUlVFLAogICAgICAgICAgICAgIGNvck1ldGhvZCA9ICJjb3IiKQpgYGAKCmBgYHtyfQpMYXlvdXQgPC0gcWdyYXBoOjphdmVyYWdlTGF5b3V0KG5ldF9tb2RTZWxlY3QsIG5ldF90aHJlc2gpCmxheW91dCh0KDE6MikpCnBsb3QobmV0X21vZFNlbGVjdCwgbGF5b3V0ID0gTGF5b3V0LCB0aXRsZSA9ICJnZ21Nb2RTZWxlY3QiLCBlZGdlLmxhYmVscz1UUlVFLCBwb3NDb2w9IiMzMDZmYmUiLCBuZWdDb2w9IiNlNTgwMzgiLCBsYWJlbC5zY2FsZS5lcXVhbD1UUlVFLCBsYWJlbC5jZXg9MTApCnBsb3QobmV0X3RocmVzaCwgbGF5b3V0ID0gTGF5b3V0LCB0aXRsZSA9ICJUaHJlc2hvbGRlZCBFQklDZ2xhc3NvIiwgZWRnZS5sYWJlbHM9VFJVRSwgcG9zQ29sPSIjMzA2ZmJlIiwgbmVnQ29sPSIjZTU4MDM4IiwgbGFiZWwuc2NhbGUuZXF1YWw9VFJVRSwgbGFiZWwuY2V4PTEwKQpgYGAKCkhlcmUgdGhlIHByaW5jaXBhbCBkaXJlY3Rpb24gaXMgZm9yY2VkIC0gdGhpcyByZXNjYWxlcyB2YXJpYWJsZXMgYWNjb3JkaW5nIHRvIHRoZSBzaWduIG9mIHRoZSBmaXJzdCBlaWdlbi12ZWN0b3IuIFRoaXMgd2lsbCBsZWFkIHRvIG1vc3QgY29ycmVsYXRpb25zIHRvIGJlIHBvc2l0aXZlIChwb3NpdGl2ZSBtYW5pZm9sZCksIGxlYWRpbmcgdG8gbmVnYXRpdmUgZWRnZXMgdG8gYmUgc3Vic3RhbnRpdmVseSBpbnRlcnByZXRhYmxlLiAobm90IHN1cmUgdGhpcyBpcyBwcmVmZXJhYmxlIGluIHRoaXMgaW5zdGFuY2UgYXMgdGhlIHZhcmlhYmxlcyBhcmUgbm90IGFsbCBmcm9tIHRoZSBzYW1lIHF1ZXN0aW9ubmFpcmUpLgoKYGBge3J9Cm5ldF9tb2RTZWxlY3RfcmVzY2FsZSA8LSBlc3RpbWF0ZU5ldHdvcmsoY29tcGxldGVfZGZbZmVhdHVyZV9saXN0XSwgCiAgICAgICAgICAgICAgZGVmYXVsdCA9ICJnZ21Nb2RTZWxlY3QiLAogICAgICAgICAgICAgIHN0ZXB3aXNlID0gRkFMU0UsCiAgICAgICAgICAgICAgcHJpbmNpcGFsRGlyZWN0aW9uID0gVFJVRSkKbmV0X3RocmVzaF9yZXNjYWxlIDwtIGVzdGltYXRlTmV0d29yayhjb21wbGV0ZV9kZltmZWF0dXJlX2xpc3RdLAogICAgICAgICAgICAgIHR1bmluZyA9IDAsIAogICAgICAgICAgICAgIGRlZmF1bHQgPSAiRUJJQ2dsYXNzbyIsCiAgICAgICAgICAgICAgdGhyZXNob2xkID0gVFJVRSwKICAgICAgICAgICAgICBwcmluY2lwYWxEaXJlY3Rpb24gPSBUUlVFKQpsYXlvdXQodCgxOjIpKQpwbG90KG5ldF9tb2RTZWxlY3RfcmVzY2FsZSwgbGF5b3V0ID0gTGF5b3V0LCAKICAgICB0aXRsZSA9ICJnZ21Nb2RTZWxlY3QiLCBlZGdlLmxhYmVscz1UUlVFLCBwb3NDb2w9IiMzMDZmYmUiLCBuZWdDb2w9IiNlNTgwMzgiLCBsYWJlbC5zY2FsZS5lcXVhbD1UUlVFLCBsYWJlbC5jZXg9MTApCnBsb3QobmV0X3RocmVzaF9yZXNjYWxlLCBsYXlvdXQgPSBMYXlvdXQsIAogICAgIHRpdGxlID0gIlRocmVzaG9sZGVkIEVCSUNnbGFzc28iLCBlZGdlLmxhYmVscz1UUlVFLCBwb3NDb2w9IiMzMDZmYmUiLCBuZWdDb2w9IiNlNTgwMzgiLCBsYWJlbC5zY2FsZS5lcXVhbD1UUlVFLCBsYWJlbC5jZXg9MTApCmBgYApgYGB7cn0KcWdyYXBoOjpjZW50cmFsaXR5UGxvdCgKICBsaXN0KAogICAgZ2dtTW9kU2VsZWN0ID0gbmV0X21vZFNlbGVjdF9yZXNjYWxlLAogICAgRUJJQ0dsYXNzb190aHJlc2ggPSBuZXRfdGhyZXNoX3Jlc2NhbGUKICApLCBpbmNsdWRlID0gIkV4cGVjdGVkSW5mbHVlbmNlIgopCmBgYAoKYGBge3J9CmJvb3RzIDwtIGJvb3RuZXQobmV0X3RocmVzaF9yZXNjYWxlLCBzdGF0aXN0aWNzID0gIkV4cGVjdGVkSW5mbHVlbmNlIiwgCiAgICAgICAgICAgICAgICAgbkJvb3RzID0gMTAwLCBuQ29yZXMgPSAyLCB0eXBlID0gImNhc2UiKQpwbG90KGJvb3RzLCBzdGF0aXN0aWNzID0gIkV4cGVjdGVkSW5mbHVlbmNlIikgKyAKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpCmBgYAojIyMgcmVsYXRpdmUgaW1wb3J0YW5jZSBuZXR3b3JrClRoZXJlIGlzIG5vIGFjY291bnRpbmcgZm9yIHRoZSBoaWVyYXJjaGljYWwgbmF0dXJlIG9mIHRoZSBkYXRhIGhlcmUKCmBgYHtyfQojIG5ldF9yZWxpbXAgPC0gZXN0aW1hdGVOZXR3b3JrKGNvbXBsZXRlX2RmW2ZlYXR1cmVfbGlzdF0sCiMgICAgICAgICAgICAgICBkZWZhdWx0ID0gInJlbGltcCIsCiMgICAgICAgICAgICAgICBub3JtYWxpemUgPSBGQUxTRSkKIyBuZXRfcmVsaW1wMiA8LSBlc3RpbWF0ZU5ldHdvcmsoY29tcGxldGVfZGZbZmVhdHVyZV9saXN0XSwKIyAgICAgICAgICAgICAgIGRlZmF1bHQgPSAicmVsaW1wIiwKIyAgICAgICAgICAgICAgIG5vcm1hbGl6ZSA9IEZBTFNFLAojICAgICAgICAgICAgICAgc3RydWN0dXJlRGVmYXVsdCA9ICJnZ21Nb2RTZWxlY3QiLAojICAgICAgICAgICAgICAgc3RlcHdpc2UgPSBGQUxTRSAjIFNlbnQgdG8gc3RydWN0dXJlRGVmYXVsdCBmdW5jdGlvbgojICAgICApCmBgYAoKCmBgYHtyfQojIExheW91dCA8LSBxZ3JhcGg6OmF2ZXJhZ2VMYXlvdXQobmV0X3JlbGltcCwgbmV0X3JlbGltcDIpCiMgbGF5b3V0KHQoMToyKSkKIyBwbG90KG5ldF9yZWxpbXAsIGxheW91dCA9IExheW91dCwgdGl0bGUgPSAiU2F0dXJhdGVkIiwgZWRnZS5sYWJlbHM9VFJVRSwgcG9zQ29sPSIjMzA2ZmJlIiwgbmVnQ29sPSIjZTU4MDM4IikKIyBwbG90KG5ldF9yZWxpbXAyLCBsYXlvdXQgPSBMYXlvdXQsIHRpdGxlID0gIk5vbi1zYXR1cmF0ZWQiLCBlZGdlLmxhYmVscz1UUlVFLCBwb3NDb2w9IiMzMDZmYmUiLCBuZWdDb2w9IiNlNTgwMzgiKQpgYGAKIyMjIGdyYXBoaWNhbFZBUgpUaGlzIGFwcHJvYWNoIGlzIG5vdCByZWFsbHkgdmFsaWQgYXMgaXQgdXNlcyBhbGwgdGltZSBwb2ludHMgYXMgaWYgdGhleSBhcmUgZnJvbSB0aGUgc2FtZSBwZXJzb24gd2hpY2ggaXMgbm90IHRoZSBjYXNlIGhlcmUKCmBgYHtyfQojIEVzdGltYXRlIG1vZGVsOgpndmFyIDwtIGVzdGltYXRlTmV0d29yaygKICBjb21wbGV0ZV9kZiwgZGVmYXVsdCA9ICJncmFwaGljYWxWQVIiLCB2YXJzID0gZmVhdHVyZV9saXN0LAogIHR1bmluZyA9IDAsIGRheXZhciA9ICJmc2Rfcm91bmQiLCBuTGFtYmRhID0gMTAKKQpgYGAKCgpgYGB7cn0KTGF5b3V0IDwtIHFncmFwaDo6YXZlcmFnZUxheW91dChndmFyJGdyYXBoJHRlbXBvcmFsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd2YXIkZ3JhcGgkY29udGVtcG9yYW5lb3VzKQpsYXlvdXQodCgxOjIpKQpwbG90KGd2YXIsIGdyYXBoID0gInRlbXBvcmFsIiwgbGF5b3V0ID0gTGF5b3V0LAogICAgIHRpdGxlID0gIlRlbXBvcmFsIiwgZWRnZS5sYWJlbHM9VFJVRSwgcG9zQ29sPSIjMzA2ZmJlIiwgbmVnQ29sPSIjZTU4MDM4IiwgbGFiZWwuc2NhbGUuZXF1YWw9VFJVRSwgbGFiZWwuY2V4PTEwKQpwbG90KGd2YXIsIGdyYXBoID0gImNvbnRlbXBvcmFuZW91cyIsIGxheW91dCA9IExheW91dCwKICAgICB0aXRsZSA9ICJDb250ZW1wb3JhbmVvdXMiLCBlZGdlLmxhYmVscz1UUlVFLCBwb3NDb2w9IiMzMDZmYmUiLCBuZWdDb2w9IiNlNTgwMzgiLCBsYWJlbC5zY2FsZS5lcXVhbD1UUlVFLCBsYWJlbC5jZXg9MTApCmBgYAoKYGBge3J9CiMgZ3Zhcl9ib290IDwtIGJvb3RuZXQoZ3ZhciwgbkJvb3RzID0gMiwgbkNvcmVzID0gMikKYGBgCgpgYGB7cn0KIyBwbG90KGd2YXJfYm9vdCwgZ3JhcGggPSAiY29udGVtcG9yYW5lb3VzIiwgcGxvdCA9ICJpbnRlcnZhbCIpCmBgYAoKIyMjIE1peGVkIEdyYXBoaWNhbCBtb2RlbAoKYGBge3J9Cm5ldF9tZ20gPC0gZXN0aW1hdGVOZXR3b3JrKGNvbXBsZXRlX2RmW2ZlYXR1cmVfbGlzdF0sCiAgICAgICAgICAgICAgZGVmYXVsdCA9ICJtZ20iLAogICAgICAgICAgICAgIHR5cGU9ImciLAogICAgICAgICAgICAgIGxldmVsPTEKICAgICAgICAgICAgICAjIHR5cGU9YygiZyIsICJnIiwgImciLCAiZyIsICJjIiwgImMiLCAiYyIsICJnIiksCiAgICAgICAgICAgICAgIyBsZXZlbD1jKDEsIDEsIDEsIDEsIDEyLCA3LCAxNSwgMSkKICAgICAgICAgICAgICApCmBgYAoKYGBge3J9CnBsb3QobmV0X21nbSwgbGF5b3V0ID0gTGF5b3V0LAogICAgIHRpdGxlID0gIm1nbSIsIGVkZ2UubGFiZWxzPVRSVUUsIHBvc0NvbD0iIzMwNmZiZSIsIG5lZ0NvbD0iI2U1ODAzOCIsIGxhYmVsLnNjYWxlLmVxdWFsPVRSVUUsIGxhYmVsLmNleD0xMCkKYGBgCgpgYGB7cn0KcGFyKG1hcj1jKDUsMSwxMCwxKSs3KQpmb3IgKGNoZWNrcG9pbnQgaW4gdW5pcXVlKGNvbXBsZXRlX2RmWywgImZzZF9yb3VuZCJdKSkgewogIG5ldF9tZ20gPC0gZXN0aW1hdGVOZXR3b3JrKGNvbXBsZXRlX2RmW2NvbXBsZXRlX2RmWyJmc2Rfcm91bmQiXT09Y2hlY2twb2ludCwgZmVhdHVyZV9saXN0XSwgCiAgICAgICAgICAgICAgZGVmYXVsdCA9ICJtZ20iLAogICAgICAgICAgICAgIHR5cGU9ImciLAogICAgICAgICAgICAgIGxldmVsPTEpCiAgcGxvdChuZXRfbWdtLCBsYXlvdXQgPSBMYXlvdXQsIAogICAgICAgIyB0aXRsZSA9IHBhc3RlKCJtZ20gbmV0d29yayIsICJjaGVja3BvaW50ID0iLCBjaGVja3BvaW50KSwgCiAgICAgICBlZGdlLmxhYmVscz1UUlVFLCBwb3NDb2w9IiMzMDZmYmUiLCBuZWdDb2w9IiNlNTgwMzgiLCBsYWJlbC5zY2FsZS5lcXVhbD1UUlVFLCBsYWJlbC5jZXg9MTApCiAgCiAgdGl0bGUobWFpbj1wYXN0ZSgiTWl4ZWQgR3JhcGhpY2FsIE1vZGVsIG5ldHdvcmsiLCAiY2hlY2twb2ludCA9IiwgY2hlY2twb2ludCksIGxpbmU9MTYuMjUpCn0KYGBgCgoKIyMjIFBhcnRpYWwgQ29ycmVsYXRpb24gbmV0d29yawoKYGBge3J9Cm5ldF9wYXJfY29yIDwtIGVzdGltYXRlTmV0d29yayhjb21wbGV0ZV9kZltmZWF0dXJlX2xpc3RdLCAKICAgICAgICAgICAgICBkZWZhdWx0ID0gInBjb3IiKQpgYGAKCmBgYHtyfQpwbG90KG5ldF9wYXJfY29yLCBsYXlvdXQgPSBMYXlvdXQsIAogICAgIHRpdGxlID0gIlBhcnRpYWwgQ29ycmVsYXRpb24iLCBlZGdlLmxhYmVscz1UUlVFLCBwb3NDb2w9IiMzMDZmYmUiLCBuZWdDb2w9IiNlNTgwMzgiLCBsYWJlbC5zY2FsZS5lcXVhbD1UUlVFLCBsYWJlbC5jZXg9MTApCmBgYAoKYGBge3J9CnBhcihtYXI9Yyg1LDEsMTAsMSkrNykKZm9yIChjaGVja3BvaW50IGluIHVuaXF1ZShjb21wbGV0ZV9kZlssICJmc2Rfcm91bmQiXSkpIHsKICBuZXRfcGFyX2NvciA8LSBlc3RpbWF0ZU5ldHdvcmsoY29tcGxldGVfZGZbY29tcGxldGVfZGZbImZzZF9yb3VuZCJdPT1jaGVja3BvaW50LCBmZWF0dXJlX2xpc3RdLCAKICAgICAgICAgICAgICBkZWZhdWx0ID0gInBjb3IiKQogIHBsb3QobmV0X3Bhcl9jb3IsIGxheW91dCA9IExheW91dCwgCiAgICAgICBlZGdlLmxhYmVscz1UUlVFLCBwb3NDb2w9IiMzMDZmYmUiLCBuZWdDb2w9IiNlNTgwMzgiLCBsYWJlbC5zY2FsZS5lcXVhbD1UUlVFLCBsYWJlbC5jZXg9MTApCiAgCiAgdGl0bGUobWFpbj1wYXN0ZSgiUGFydGlhbCBDb3JyZWxhdGlvbiBuZXR3b3JrIiwgImNoZWNrcG9pbnQgPSIsIGNoZWNrcG9pbnQpLCBsaW5lPTE2LjI1KQp9CmBgYAoKCiMjIyBDb3JyZWxhdGlvbiBuZXR3b3JrCgpgYGB7cn0KbmV0X2NvciA8LSBlc3RpbWF0ZU5ldHdvcmsoY29tcGxldGVfZGZbZmVhdHVyZV9saXN0XSwgCiAgICAgICAgICAgICAgZGVmYXVsdCA9ICJjb3IiKQpgYGAKCmBgYHtyfQpwbG90KG5ldF9jb3IsIGxheW91dCA9IExheW91dCwgCiAgICAgdGl0bGUgPSAiQ29ycmVsYXRpb24iLCBlZGdlLmxhYmVscz1UUlVFLCBwb3NDb2w9IiMzMDZmYmUiLCBuZWdDb2w9IiNlNTgwMzgiLCBsYWJlbC5zY2FsZS5lcXVhbD1UUlVFLCBsYWJlbC5jZXg9MTApCmBgYAoKIyMjIEdHTW5jdiBuZXR3b3JrCgpgYGB7cn0KbmV0X0dHTW5jdiA8LSBlc3RpbWF0ZU5ldHdvcmsoY29tcGxldGVfZGZbZmVhdHVyZV9saXN0XSwgCiAgICAgICAgICAgICAgZGVmYXVsdCA9ICJHR01uY3YiKQpgYGAKCmBgYHtyfQpwbG90KG5ldF9HR01uY3YsIGxheW91dCA9IExheW91dCwgCiAgICAgdGl0bGUgPSAiR0dNbmN2IiwgZWRnZS5sYWJlbHM9VFJVRSwgcG9zQ29sPSIjMzA2ZmJlIiwgbmVnQ29sPSIjZTU4MDM4IiwgbGFiZWwuc2NhbGUuZXF1YWw9VFJVRSwgbGFiZWwuY2V4PTEwKQpgYGAK