Load packages

pacman::p_load(tidyverse, psych, mirt, arsenal, haven)

Import ds

ds <- read_sav("C:/Users/luisf/Downloads/Elie1.sav")
backup <- ds

Clean ds

ds <- janitor::clean_names(ds)

Remove spss attributes

ds[] <- lapply(ds, function(x) { attributes(x) <- NULL; x })

DS

ds %>% names
 [1] "cod"           "sexo"          "tb"            "est_afet"      "data"         
 [6] "cgib_pm_e"     "cgib_pd_e"     "cgib_pg_e"     "young1e"       "young2e"      
[11] "young3e"       "young4e"       "young5e"       "young6e"       "young7e"      
[16] "young8e"       "young9e"       "young10e"      "young11e"      "youngtote"    
[21] "data_d"        "cgib_pm_d"     "cgib_pd_d"     "cgib_pg_d"     "young1d"      
[26] "young2d"       "young3d"       "young4d"       "young5d"       "young6d"      
[31] "young7d"       "young8d"       "young9d"       "young10d"      "young11d"     
[36] "young_total_d" "data_m"        "cgib_pm_m"     "cgib_pd_m"     "cgib_pg_m"    
[41] "young1m"       "young2m"       "young3m"       "young4m"       "young5m"      
[46] "young6m"       "young7m"       "young8m"       "young9m"       "young10m"     
[51] "young11m"      "young_total_m"

DS for all Items

ds_young <- ds %>% select(young1m:young11m)

Check items’ distribution

ds_young %>% mutate_all(., as.factor) %>% DataExplorer::plot_bar()

Check items’ distribution

ds_young %>% 
  pivot_longer(everything()) %>% 
  count(value) %>% 
  mutate(percent = (100 * n / sum(n)) %>% round(digits = 1))

EFA models

Euthimic

ds %>% select(young1e: young11e) %>% 
  fa.parallel()
The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.An ultra-Heywood case was detected.  Examine the results carefullyThe estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.
Parallel analysis suggests that the number of factors =  1  and the number of components =  1 

mod_1e <- ds %>% select(young1e: young11e) %>% fa(., nfactors = 1)
as.data.frame(unclass(mod_1e$loadings)) %>% mutate_if(is.numeric, round,2) %>%  
  DT::datatable(., options = list(
          lengthMenu = list(c(5, 15, -1), c('5', '15', 'All')),
          pageLength = 15
        ))

Maniac (3)

ds %>% select(young1m: young11m) %>% 
  fa.parallel()
The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.An ultra-Heywood case was detected.  Examine the results carefullyThe estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.An ultra-Heywood case was detected.  Examine the results carefullyThe estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.An ultra-Heywood case was detected.  Examine the results carefullyThe estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.An ultra-Heywood case was detected.  Examine the results carefully
Parallel analysis suggests that the number of factors =  3  and the number of components =  2 

mod_1m <- ds %>% select(young1m: young11m) %>% fa(., nfactors = 1)
as.data.frame(unclass(mod_1m$loadings)) %>% mutate_if(is.numeric, round,2) %>% 
  DT::datatable(., options = list(
    lengthMenu = list(c(5, 15, -1), c('5', '15', 'All')),
    pageLength = 15
  ))

Depression (3)

ds %>% select(young1d: young11d) %>% 
  fa.parallel()
The estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.the standard deviation is zeroThe estimated weights for the factor scores are probably incorrect.  Try a different factor score estimation method.An ultra-Heywood case was detected.  Examine the results carefully
Parallel analysis suggests that the number of factors =  1  and the number of components =  1 

mod_1d <- ds %>% select(young1d: young11d) %>% fa(., nfactors = 1)
as.data.frame(unclass(mod_1d$loadings)) %>% mutate_if(is.numeric, round,2) %>% 
    DT::datatable(., options = list(
          lengthMenu = list(c(5, 15, -1), c('5', '15', 'All')),
          pageLength = 15
        ))

IRT models

irt_1d <- mirt(ds_young, 1, itemtype = "graded")
"young5m" re-mapped to ensure all categories have a distance of 1
"young6m" re-mapped to ensure all categories have a distance of 1
"young8m" re-mapped to ensure all categories have a distance of 1
"young9m" re-mapped to ensure all categories have a distance of 1

Iteration: 1, Log-Lik: -1506.248, Max-Change: 0.69950
Iteration: 2, Log-Lik: -1476.506, Max-Change: 0.39171
Iteration: 3, Log-Lik: -1468.973, Max-Change: 0.15796
Iteration: 4, Log-Lik: -1467.487, Max-Change: 0.11639
Iteration: 5, Log-Lik: -1467.039, Max-Change: 0.07047
Iteration: 6, Log-Lik: -1466.891, Max-Change: 0.04741
Iteration: 7, Log-Lik: -1466.815, Max-Change: 0.02686
Iteration: 8, Log-Lik: -1466.796, Max-Change: 0.01870
Iteration: 9, Log-Lik: -1466.788, Max-Change: 0.01629
Iteration: 10, Log-Lik: -1466.781, Max-Change: 0.00483
Iteration: 11, Log-Lik: -1466.779, Max-Change: 0.00710
Iteration: 12, Log-Lik: -1466.778, Max-Change: 0.00396
Iteration: 13, Log-Lik: -1466.778, Max-Change: 0.00402
Iteration: 14, Log-Lik: -1466.777, Max-Change: 0.00214
Iteration: 15, Log-Lik: -1466.777, Max-Change: 0.00027
Iteration: 16, Log-Lik: -1466.777, Max-Change: 0.00024
Iteration: 17, Log-Lik: -1466.777, Max-Change: 0.00137
Iteration: 18, Log-Lik: -1466.777, Max-Change: 0.00045
Iteration: 19, Log-Lik: -1466.777, Max-Change: 0.00016
Iteration: 20, Log-Lik: -1466.777, Max-Change: 0.00011
Iteration: 21, Log-Lik: -1466.777, Max-Change: 0.00044
Iteration: 22, Log-Lik: -1466.777, Max-Change: 0.00052
Iteration: 23, Log-Lik: -1466.777, Max-Change: 0.00032
Iteration: 24, Log-Lik: -1466.777, Max-Change: 0.00021
Iteration: 25, Log-Lik: -1466.777, Max-Change: 0.00041
Iteration: 26, Log-Lik: -1466.777, Max-Change: 0.00039
Iteration: 27, Log-Lik: -1466.777, Max-Change: 0.00025
Iteration: 28, Log-Lik: -1466.777, Max-Change: 0.00008
M2(irt_1d)
plot(irt_1d, type = "trace")

Item info

Theta <- seq(-4,4, by = .1)
nitems <- ncol(ds_young)
for(i in 1:nitems){
  info <- iteminfo(extract.item(irt_1d, i), Theta)
    plot(Theta, info, type = "l", main = paste("Information for ", 
                names(ds_young)[[i]], sep = ""), ylab = "Information", xlab = "Theta")
    lines(Theta, info, col = "steelblue")
}

Curva com 3 itens

mod_elie2 <- mirt(ds_2 , 1, "graded")

Iteration: 1, Log-Lik: -419.715, Max-Change: 0.73766
Iteration: 2, Log-Lik: -416.027, Max-Change: 0.25178
Iteration: 3, Log-Lik: -414.582, Max-Change: 0.19273
Iteration: 4, Log-Lik: -413.765, Max-Change: 0.08312
Iteration: 5, Log-Lik: -413.696, Max-Change: 0.06303
Iteration: 6, Log-Lik: -413.661, Max-Change: 0.05092
Iteration: 7, Log-Lik: -413.613, Max-Change: 0.02411
Iteration: 8, Log-Lik: -413.609, Max-Change: 0.01573
Iteration: 9, Log-Lik: -413.607, Max-Change: 0.00890
Iteration: 10, Log-Lik: -413.605, Max-Change: 0.02795
Iteration: 11, Log-Lik: -413.604, Max-Change: 0.00904
Iteration: 12, Log-Lik: -413.603, Max-Change: 0.00797
Iteration: 13, Log-Lik: -413.602, Max-Change: 0.00332
Iteration: 14, Log-Lik: -413.602, Max-Change: 0.00293
Iteration: 15, Log-Lik: -413.602, Max-Change: 0.01231
Iteration: 16, Log-Lik: -413.601, Max-Change: 0.00378
Iteration: 17, Log-Lik: -413.601, Max-Change: 0.00126
Iteration: 18, Log-Lik: -413.601, Max-Change: 0.00920
Iteration: 19, Log-Lik: -413.601, Max-Change: 0.00207
Iteration: 20, Log-Lik: -413.601, Max-Change: 0.00171
Iteration: 21, Log-Lik: -413.601, Max-Change: 0.00168
Iteration: 22, Log-Lik: -413.601, Max-Change: 0.00064
Iteration: 23, Log-Lik: -413.601, Max-Change: 0.00026
Iteration: 24, Log-Lik: -413.601, Max-Change: 0.00097
Iteration: 25, Log-Lik: -413.601, Max-Change: 0.00478
Iteration: 26, Log-Lik: -413.601, Max-Change: 0.00032
Iteration: 27, Log-Lik: -413.601, Max-Change: 0.00067
Iteration: 28, Log-Lik: -413.601, Max-Change: 0.00017
Iteration: 29, Log-Lik: -413.601, Max-Change: 0.00066
Iteration: 30, Log-Lik: -413.601, Max-Change: 0.00018
Iteration: 31, Log-Lik: -413.601, Max-Change: 0.00013
Iteration: 32, Log-Lik: -413.601, Max-Change: 0.00067
Iteration: 33, Log-Lik: -413.601, Max-Change: 0.00019
Iteration: 34, Log-Lik: -413.601, Max-Change: 0.00013
Iteration: 35, Log-Lik: -413.601, Max-Change: 0.00065
Iteration: 36, Log-Lik: -413.601, Max-Change: 0.00027
Iteration: 37, Log-Lik: -413.601, Max-Change: 0.00012
Iteration: 38, Log-Lik: -413.601, Max-Change: 0.00062
Iteration: 39, Log-Lik: -413.601, Max-Change: 0.00028
Iteration: 40, Log-Lik: -413.601, Max-Change: 0.00012
Iteration: 41, Log-Lik: -413.601, Max-Change: 0.00058
Iteration: 42, Log-Lik: -413.601, Max-Change: 0.00028
Iteration: 43, Log-Lik: -413.601, Max-Change: 0.00011
Iteration: 44, Log-Lik: -413.601, Max-Change: 0.00054
Iteration: 45, Log-Lik: -413.601, Max-Change: 0.00027
Iteration: 46, Log-Lik: -413.601, Max-Change: 0.00010
Iteration: 47, Log-Lik: -413.601, Max-Change: 0.00050
Iteration: 48, Log-Lik: -413.601, Max-Change: 0.00025
Iteration: 49, Log-Lik: -413.601, Max-Change: 0.00010
M2(mod_elie2)
Error: M2() statistic cannot be calculated due to too few degrees of freedom

Plots

p1 <-itemplot(object = mod_elie2, item = 1, type = "info")
p2 <-itemplot(object = mod_elie2, item = 2, type = "info")
p3 <-itemplot(object = mod_elie2, item = 3, type = "info")

x3 <- p3$panel.args[[1]]$x
y3 <- p3$panel.args[[1]]$y
u3 <- p3$panel.args.common$upper
l3 <- p3$panel.args.common$lower


plot(x3,y3, type ="l")
lines(x3,u3)
lines(x3,l3)

NA
NA
plt <- itemplot(mod_elie2, 1, type = 'info') #store the object
plt2 <- itemplot(mod_elie2, 2, type = 'info') #store the object
plt3 <- itemplot(mod_elie2, 3, type = 'info') #store the object

print(plt) #plot the object

print(plt2) #plot the object

print(plt3) #plot the object


#str(plt) #find the data
plt$panel.args
[[1]]
[[1]]$x
  [1] -6.00000000 -5.93969849 -5.87939698 -5.81909548 -5.75879397 -5.69849246 -5.63819095 -5.57788945
  [9] -5.51758794 -5.45728643 -5.39698492 -5.33668342 -5.27638191 -5.21608040 -5.15577889 -5.09547739
 [17] -5.03517588 -4.97487437 -4.91457286 -4.85427136 -4.79396985 -4.73366834 -4.67336683 -4.61306533
 [25] -4.55276382 -4.49246231 -4.43216080 -4.37185930 -4.31155779 -4.25125628 -4.19095477 -4.13065327
 [33] -4.07035176 -4.01005025 -3.94974874 -3.88944724 -3.82914573 -3.76884422 -3.70854271 -3.64824121
 [41] -3.58793970 -3.52763819 -3.46733668 -3.40703518 -3.34673367 -3.28643216 -3.22613065 -3.16582915
 [49] -3.10552764 -3.04522613 -2.98492462 -2.92462312 -2.86432161 -2.80402010 -2.74371859 -2.68341709
 [57] -2.62311558 -2.56281407 -2.50251256 -2.44221106 -2.38190955 -2.32160804 -2.26130653 -2.20100503
 [65] -2.14070352 -2.08040201 -2.02010050 -1.95979899 -1.89949749 -1.83919598 -1.77889447 -1.71859296
 [73] -1.65829146 -1.59798995 -1.53768844 -1.47738693 -1.41708543 -1.35678392 -1.29648241 -1.23618090
 [81] -1.17587940 -1.11557789 -1.05527638 -0.99497487 -0.93467337 -0.87437186 -0.81407035 -0.75376884
 [89] -0.69346734 -0.63316583 -0.57286432 -0.51256281 -0.45226131 -0.39195980 -0.33165829 -0.27135678
 [97] -0.21105528 -0.15075377 -0.09045226 -0.03015075  0.03015075  0.09045226  0.15075377  0.21105528
[105]  0.27135678  0.33165829  0.39195980  0.45226131  0.51256281  0.57286432  0.63316583  0.69346734
[113]  0.75376884  0.81407035  0.87437186  0.93467337  0.99497487  1.05527638  1.11557789  1.17587940
[121]  1.23618090  1.29648241  1.35678392  1.41708543  1.47738693  1.53768844  1.59798995  1.65829146
[129]  1.71859296  1.77889447  1.83919598  1.89949749  1.95979899  2.02010050  2.08040201  2.14070352
[137]  2.20100503  2.26130653  2.32160804  2.38190955  2.44221106  2.50251256  2.56281407  2.62311558
[145]  2.68341709  2.74371859  2.80402010  2.86432161  2.92462312  2.98492462  3.04522613  3.10552764
[153]  3.16582915  3.22613065  3.28643216  3.34673367  3.40703518  3.46733668  3.52763819  3.58793970
[161]  3.64824121  3.70854271  3.76884422  3.82914573  3.88944724  3.94974874  4.01005025  4.07035176
[169]  4.13065327  4.19095477  4.25125628  4.31155779  4.37185930  4.43216080  4.49246231  4.55276382
[177]  4.61306533  4.67336683  4.73366834  4.79396985  4.85427136  4.91457286  4.97487437  5.03517588
[185]  5.09547739  5.15577889  5.21608040  5.27638191  5.33668342  5.39698492  5.45728643  5.51758794
[193]  5.57788945  5.63819095  5.69849246  5.75879397  5.81909548  5.87939698  5.93969849  6.00000000

[[1]]$y
  [1] 0.11303179 0.12116970 0.12977974 0.13887130 0.14845079 0.15852118 0.16908134 0.18012547
  [9] 0.19164242 0.20361510 0.21601982 0.22882570 0.24199419 0.25547858 0.26922374 0.28316591
 [17] 0.29723279 0.31134372 0.32541027 0.33933698 0.35302244 0.36636069 0.37924291 0.39155935
 [25] 0.40320159 0.41406490 0.42405077 0.43306951 0.44104277 0.44790591 0.45361015 0.45812440
 [33] 0.46143663 0.46355477 0.46450706 0.46434187 0.46312693 0.46094799 0.45790706 0.45412020
 [41] 0.44971491 0.44482740 0.43959958 0.43417610 0.42870135 0.42331660 0.41815736 0.41335089
 [49] 0.40901402 0.40525126 0.40215323 0.39979532 0.39823675 0.39751987 0.39766974 0.39869407
 [57] 0.40058332 0.40331119 0.40683533 0.41109834 0.41602908 0.42154423 0.42755014 0.43394496
 [65] 0.44062103 0.44746739 0.45437260 0.46122746 0.46792792 0.47437777 0.48049122 0.48619515
 [73] 0.49143096 0.49615599 0.50034427 0.50398670 0.50709059 0.50967849 0.51178644 0.51346164
 [81] 0.51475972 0.51574165 0.51647047 0.51700800 0.51741177 0.51773212 0.51800982 0.51827426
 [89] 0.51854224 0.51881749 0.51909092 0.51934161 0.51953841 0.51964215 0.51960830 0.51939001
 [97] 0.51894116 0.51821959 0.51719007 0.51582689 0.51411617 0.51205737 0.50966437 0.50696570
[105] 0.50400414 0.50083562 0.49752750 0.49415639 0.49080541 0.48756134 0.48451145 0.48174039
[113] 0.47932717 0.47734233 0.47584546 0.47488315 0.47448735 0.47467434 0.47544423 0.47678104
[121] 0.47865337 0.48101559 0.48380954 0.48696668 0.49041060 0.49405977 0.49783042 0.50163953
[129] 0.50540758 0.50906118 0.51253525 0.51577480 0.51873611 0.52138723 0.52370794 0.52568893
[137] 0.52733045 0.52864043 0.52963210 0.53032146 0.53072455 0.53085476 0.53072044 0.53032283
[145] 0.52965445 0.52869818 0.52742697 0.52580416 0.52378459 0.52131621 0.51834226 0.51480373
[153] 0.51064217 0.50580249 0.50023569 0.49390137 0.48676984 0.47882384 0.47005964 0.46048762
[161] 0.45013226 0.43903162 0.42723628 0.41480792 0.40181758 0.38834365 0.37446988 0.36028322
[169] 0.34587180 0.33132311 0.31672221 0.30215035 0.28768373 0.27339256 0.25934040 0.24558366
[177] 0.23217145 0.21914556 0.20654053 0.19438404 0.18269721 0.17149514 0.16078736 0.15057845
[185] 0.14086856 0.13165398 0.12292767 0.11467978 0.10689817 0.09956878 0.09267609 0.08620345
[193] 0.08013343 0.07444807 0.06912915 0.06415836 0.05951754 0.05518876 0.05115448 0.04739761
pltdata <- data.frame(lapply(plt$panel.args, function(x) do.call(cbind, x))[[1]])
pltdata$item <- rep("1", each = 50)

pltdata2 <- data.frame(lapply(plt2$panel.args, function(x) do.call(cbind, x))[[1]])
pltdata2$item <- rep("2", each = 50)


pltdata3 <- data.frame(lapply(plt3$panel.args, function(x) do.call(cbind, x))[[1]])
pltdata3$item <- rep("3", each = 50)
ggplot(pltdata, aes(x, y, colour=item)) + geom_line() + ggtitle('ggplot2 Tracelines') +
    xlab(expression(theta)) + ylab(expression(P(theta)))

ggplot(pltdata2, aes(x, y, colour=item)) + geom_line() + ggtitle('ggplot2 Tracelines') +
    xlab(expression(theta)) + ylab(expression(P(theta)))

ggplot(pltdata3, aes(x, y, colour=item)) + geom_line() + ggtitle('ggplot2 Tracelines') +
    xlab(expression(theta)) + ylab(expression(P(theta)))

ggplot(plot_combinado, aes(x, y, colour=item)) + geom_line(aes(linetype = item), size = 1) + ggtitle('') +
  xlab(expression(theta)) + ylab("item information") +
  theme_bw()

LS0tDQp0aXRsZTogIklSVCBFbGllIExhbmRlaXJhIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCg0KIyBMb2FkIHBhY2thZ2VzDQpgYGB7cn0NCnBhY21hbjo6cF9sb2FkKHRpZHl2ZXJzZSwgcHN5Y2gsIG1pcnQsIGFyc2VuYWwsIGhhdmVuKQ0KYGBgDQoNCg0KIyBJbXBvcnQgZHMNCmBgYHtyfQ0KZHMgPC0gcmVhZF9zYXYoIkM6L1VzZXJzL2x1aXNmL0Rvd25sb2Fkcy9FbGllMS5zYXYiKQ0KYmFja3VwIDwtIGRzDQpgYGANCg0KIyBDbGVhbiBkcw0KDQpgYGB7cn0NCmRzIDwtIGphbml0b3I6OmNsZWFuX25hbWVzKGRzKQ0KYGBgDQoNCiMgUmVtb3ZlIHNwc3MgYXR0cmlidXRlcw0KDQpgYGB7cn0NCmRzW10gPC0gbGFwcGx5KGRzLCBmdW5jdGlvbih4KSB7IGF0dHJpYnV0ZXMoeCkgPC0gTlVMTDsgeCB9KQ0KYGBgDQoNCiMgRFMgDQoNCmBgYHtyfQ0KZHMgJT4lIG5hbWVzDQpgYGANCiMgRFMgZm9yIGFsbCBJdGVtcw0KDQpgYGB7cn0NCmRzX3lvdW5nIDwtIGRzICU+JSBzZWxlY3QoeW91bmcxbTp5b3VuZzExbSkNCmBgYA0KDQojIyBDaGVjayBpdGVtcycgZGlzdHJpYnV0aW9uDQoNCmBgYHtyfQ0KZHNfeW91bmcgJT4lIG11dGF0ZV9hbGwoLiwgYXMuZmFjdG9yKSAlPiUgRGF0YUV4cGxvcmVyOjpwbG90X2JhcigpDQpgYGANCg0KIyMgQ2hlY2sgaXRlbXMnIGRpc3RyaWJ1dGlvbg0KDQpgYGB7cn0NCmRzX3lvdW5nICU+JSANCiAgcGl2b3RfbG9uZ2VyKGV2ZXJ5dGhpbmcoKSkgJT4lIA0KICBjb3VudCh2YWx1ZSkgJT4lIA0KICBtdXRhdGUocGVyY2VudCA9ICgxMDAgKiBuIC8gc3VtKG4pKSAlPiUgcm91bmQoZGlnaXRzID0gMSkpDQpgYGANCiMgRUZBIG1vZGVscw0KDQojIyBFdXRoaW1pYw0KYGBge3J9DQpkcyAlPiUgc2VsZWN0KHlvdW5nMWU6IHlvdW5nMTFlKSAlPiUgDQogIGZhLnBhcmFsbGVsKCkNCmBgYA0KYGBge3J9DQptb2RfMWUgPC0gZHMgJT4lIHNlbGVjdCh5b3VuZzFlOiB5b3VuZzExZSkgJT4lIGZhKC4sIG5mYWN0b3JzID0gMSkNCmFzLmRhdGEuZnJhbWUodW5jbGFzcyhtb2RfMWUkbG9hZGluZ3MpKSAlPiUgbXV0YXRlX2lmKGlzLm51bWVyaWMsIHJvdW5kLDIpICU+JSAgDQogIERUOjpkYXRhdGFibGUoLiwgb3B0aW9ucyA9IGxpc3QoDQogICAgICAgICAgbGVuZ3RoTWVudSA9IGxpc3QoYyg1LCAxNSwgLTEpLCBjKCc1JywgJzE1JywgJ0FsbCcpKSwNCiAgICAgICAgICBwYWdlTGVuZ3RoID0gMTUNCiAgICAgICAgKSkNCmBgYA0KDQoNCiMjIE1hbmlhYyAoMykNCg0KYGBge3J9DQpkcyAlPiUgc2VsZWN0KHlvdW5nMW06IHlvdW5nMTFtKSAlPiUgDQogIGZhLnBhcmFsbGVsKCkNCmBgYA0KYGBge3J9DQptb2RfMW0gPC0gZHMgJT4lIHNlbGVjdCh5b3VuZzFtOiB5b3VuZzExbSkgJT4lIGZhKC4sIG5mYWN0b3JzID0gMSkNCmFzLmRhdGEuZnJhbWUodW5jbGFzcyhtb2RfMW0kbG9hZGluZ3MpKSAlPiUgbXV0YXRlX2lmKGlzLm51bWVyaWMsIHJvdW5kLDIpICU+JSANCiAgRFQ6OmRhdGF0YWJsZSguLCBvcHRpb25zID0gbGlzdCgNCiAgICBsZW5ndGhNZW51ID0gbGlzdChjKDUsIDE1LCAtMSksIGMoJzUnLCAnMTUnLCAnQWxsJykpLA0KICAgIHBhZ2VMZW5ndGggPSAxNQ0KICApKQ0KYGBgDQoNCg0KDQojIyBEZXByZXNzaW9uICgzKQ0KDQpgYGB7cn0NCmRzICU+JSBzZWxlY3QoeW91bmcxZDogeW91bmcxMWQpICU+JSANCiAgZmEucGFyYWxsZWwoKQ0KYGBgDQoNCg0KYGBge3J9DQptb2RfMWQgPC0gZHMgJT4lIHNlbGVjdCh5b3VuZzFkOiB5b3VuZzExZCkgJT4lIGZhKC4sIG5mYWN0b3JzID0gMSkNCmFzLmRhdGEuZnJhbWUodW5jbGFzcyhtb2RfMWQkbG9hZGluZ3MpKSAlPiUgbXV0YXRlX2lmKGlzLm51bWVyaWMsIHJvdW5kLDIpICU+JSANCiAgICBEVDo6ZGF0YXRhYmxlKC4sIG9wdGlvbnMgPSBsaXN0KA0KICAgICAgICAgIGxlbmd0aE1lbnUgPSBsaXN0KGMoNSwgMTUsIC0xKSwgYygnNScsICcxNScsICdBbGwnKSksDQogICAgICAgICAgcGFnZUxlbmd0aCA9IDE1DQogICAgICAgICkpDQpgYGANCg0KDQojIElSVCBtb2RlbHMNCg0KDQpgYGB7cn0NCmlydF8xZCA8LSBtaXJ0KGRzX3lvdW5nLCAxLCBpdGVtdHlwZSA9ICJncmFkZWQiKQ0KYGBgDQoNCmBgYHtyfQ0KTTIoaXJ0XzFkKQ0KYGBgDQoNCmBgYHtyfQ0KcGxvdChpcnRfMWQsIHR5cGUgPSAidHJhY2UiKQ0KYGBgDQoNCiMjIEl0ZW0gaW5mbw0KDQpgYGB7cn0NClRoZXRhIDwtIHNlcSgtNCw0LCBieSA9IC4xKQ0Kbml0ZW1zIDwtIG5jb2woZHNfeW91bmcpDQpmb3IoaSBpbiAxOm5pdGVtcyl7DQogIGluZm8gPC0gaXRlbWluZm8oZXh0cmFjdC5pdGVtKGlydF8xZCwgaSksIFRoZXRhKQ0KICAgIHBsb3QoVGhldGEsIGluZm8sIHR5cGUgPSAibCIsIG1haW4gPSBwYXN0ZSgiSW5mb3JtYXRpb24gZm9yICIsIA0KICAgICAgICAgICAgICAgIG5hbWVzKGRzX3lvdW5nKVtbaV1dLCBzZXAgPSAiIiksIHlsYWIgPSAiSW5mb3JtYXRpb24iLCB4bGFiID0gIlRoZXRhIikNCiAgICBsaW5lcyhUaGV0YSwgaW5mbywgY29sID0gInN0ZWVsYmx1ZSIpDQp9DQpgYGANCg0KIyMgQ3VydmEgY29tIDMgaXRlbnMNCg0KDQpgYGB7cn0NCm1vZF9lbGllMiA8LSBtaXJ0KGRzXzIgLCAxLCAiZ3JhZGVkIikNCmBgYA0KDQpgYGB7cn0NCk0yKG1vZF9lbGllMikNCmBgYA0KDQoNCmBgYHtyfQ0KaXRlbXBsb3Qob2JqZWN0ID0gbW9kX2VsaWUyLCBpdGVtID0gMSwgdHlwZSA9ICJpbmZvIikNCmBgYA0KDQpgYGB7cn0NCml0ZW1wbG90KG9iamVjdCA9IG1vZF9lbGllMiwgaXRlbSA9IDIsIHR5cGUgPSAiaW5mbyIpDQpgYGANCg0KYGBge3J9DQppdGVtcGxvdChvYmplY3QgPSBtb2RfZWxpZTIsIGl0ZW0gPSAzLCB0eXBlID0gImluZm8iKQ0KYGBgDQojIyBQbG90cw0KDQoNCmBgYHtyfQ0KcDEgPC1pdGVtcGxvdChvYmplY3QgPSBtb2RfZWxpZTIsIGl0ZW0gPSAxLCB0eXBlID0gImluZm8iKQ0KcDIgPC1pdGVtcGxvdChvYmplY3QgPSBtb2RfZWxpZTIsIGl0ZW0gPSAyLCB0eXBlID0gImluZm8iKQ0KcDMgPC1pdGVtcGxvdChvYmplY3QgPSBtb2RfZWxpZTIsIGl0ZW0gPSAzLCB0eXBlID0gImluZm8iKQ0KYGBgDQoNCg0KDQpgYGB7cn0NCngxIDwtIHAkcGFuZWwuYXJnc1tbMV1dJHgNCnkxIDwtIHAkcGFuZWwuYXJnc1tbMV1dJHkNCnUxIDwtIHAkcGFuZWwuYXJncy5jb21tb24kdXBwZXINCmwxIDwtIHAkcGFuZWwuYXJncy5jb21tb24kbG93ZXINCg0KDQp4MSAlPiUgZGF0YS5mcmFtZQ0KDQpwbG90KHgxLHkxLCB0eXBlID0ibCIpDQpsaW5lcyh4MSx1MSkNCmxpbmVzKHgxLGwxKQ0KYGBgDQpgYGB7cn0NCngyIDwtIHAyJHBhbmVsLmFyZ3NbWzFdXSR4DQp5MiA8LSBwMiRwYW5lbC5hcmdzW1sxXV0keQ0KdTIgPC0gcDIkcGFuZWwuYXJncy5jb21tb24kdXBwZXINCmwyIDwtIHAyJHBhbmVsLmFyZ3MuY29tbW9uJGxvd2VyDQoNCnBsb3QoeDIseTIsIHR5cGUgPSJsIikNCmxpbmVzKHgyLHUyKQ0KbGluZXMoeDIsbDIpDQpgYGANCg0KDQpgYGB7cn0NCngzIDwtIHAzJHBhbmVsLmFyZ3NbWzFdXSR4DQp5MyA8LSBwMyRwYW5lbC5hcmdzW1sxXV0keQ0KdTMgPC0gcDMkcGFuZWwuYXJncy5jb21tb24kdXBwZXINCmwzIDwtIHAzJHBhbmVsLmFyZ3MuY29tbW9uJGxvd2VyDQoNCg0KcGxvdCh4Myx5MywgdHlwZSA9ImwiKQ0KbGluZXMoeDMsdTMpDQpsaW5lcyh4MyxsMykNCg0KDQpgYGANCg0KDQoNCg0KDQpgYGB7cn0NCnBsdCA8LSBpdGVtcGxvdChtb2RfZWxpZTIsIDEsIHR5cGUgPSAnaW5mbycpICNzdG9yZSB0aGUgb2JqZWN0DQpwbHQyIDwtIGl0ZW1wbG90KG1vZF9lbGllMiwgMiwgdHlwZSA9ICdpbmZvJykgI3N0b3JlIHRoZSBvYmplY3QNCnBsdDMgPC0gaXRlbXBsb3QobW9kX2VsaWUyLCAzLCB0eXBlID0gJ2luZm8nKSAjc3RvcmUgdGhlIG9iamVjdA0KDQpwcmludChwbHQpICNwbG90IHRoZSBvYmplY3QNCnByaW50KHBsdDIpICNwbG90IHRoZSBvYmplY3QNCnByaW50KHBsdDMpICNwbG90IHRoZSBvYmplY3QNCg0KI3N0cihwbHQpICNmaW5kIHRoZSBkYXRhDQpwbHQkcGFuZWwuYXJncw0KcGx0ZGF0YSA8LSBkYXRhLmZyYW1lKGxhcHBseShwbHQkcGFuZWwuYXJncywgZnVuY3Rpb24oeCkgZG8uY2FsbChjYmluZCwgeCkpW1sxXV0pDQpwbHRkYXRhJGl0ZW0gPC0gcmVwKCIxIiwgZWFjaCA9IDUwKQ0KDQpwbHRkYXRhMiA8LSBkYXRhLmZyYW1lKGxhcHBseShwbHQyJHBhbmVsLmFyZ3MsIGZ1bmN0aW9uKHgpIGRvLmNhbGwoY2JpbmQsIHgpKVtbMV1dKQ0KcGx0ZGF0YTIkaXRlbSA8LSByZXAoIjIiLCBlYWNoID0gNTApDQoNCg0KcGx0ZGF0YTMgPC0gZGF0YS5mcmFtZShsYXBwbHkocGx0MyRwYW5lbC5hcmdzLCBmdW5jdGlvbih4KSBkby5jYWxsKGNiaW5kLCB4KSlbWzFdXSkNCnBsdGRhdGEzJGl0ZW0gPC0gcmVwKCIzIiwgZWFjaCA9IDUwKQ0KDQoNCmBgYA0KDQoNCmBgYHtyfQ0KZ2dwbG90KHBsdGRhdGEsIGFlcyh4LCB5LCBjb2xvdXI9aXRlbSkpICsgZ2VvbV9saW5lKCkgKyBnZ3RpdGxlKCdnZ3Bsb3QyIFRyYWNlbGluZXMnKSArDQogICAgeGxhYihleHByZXNzaW9uKHRoZXRhKSkgKyB5bGFiKGV4cHJlc3Npb24oUCh0aGV0YSkpKQ0KYGBgDQoNCmBgYHtyfQ0KZ2dwbG90KHBsdGRhdGEyLCBhZXMoeCwgeSwgY29sb3VyPWl0ZW0pKSArIGdlb21fbGluZSgpICsgZ2d0aXRsZSgnZ2dwbG90MiBUcmFjZWxpbmVzJykgKw0KICAgIHhsYWIoZXhwcmVzc2lvbih0aGV0YSkpICsgeWxhYihleHByZXNzaW9uKFAodGhldGEpKSkNCmBgYA0KDQpgYGB7cn0NCmdncGxvdChwbHRkYXRhMywgYWVzKHgsIHksIGNvbG91cj1pdGVtKSkgKyBnZW9tX2xpbmUoKSArIGdndGl0bGUoJ2dncGxvdDIgVHJhY2VsaW5lcycpICsNCiAgICB4bGFiKGV4cHJlc3Npb24odGhldGEpKSArIHlsYWIoZXhwcmVzc2lvbihQKHRoZXRhKSkpDQpgYGANCg0KDQoNCmBgYHtyfQ0KcGxvdF9jb21iaW5hZG8gPC0gcmJpbmQocGx0ZGF0YSwgcGx0ZGF0YTIsIHBsdGRhdGEzKQ0KYGBgDQoNCmBgYHtyfQ0KZ2dwbG90KHBsb3RfY29tYmluYWRvLCBhZXMoeCwgeSwgY29sb3VyPWl0ZW0pKSArIGdlb21fbGluZShhZXMobGluZXR5cGUgPSBpdGVtKSwgc2l6ZSA9IDEpICsgZ2d0aXRsZSgnJykgKw0KICB4bGFiKGV4cHJlc3Npb24odGhldGEpKSArIHlsYWIoIml0ZW0gaW5mb3JtYXRpb24iKSArDQogIHRoZW1lX2J3KCkNCmBgYA0KDQo=