We also built increasingly complex models for the remaining 4 clubs. We started by modeling network structure and dynamics in kudos tie formation, using a rather simple model specification. If this did not produce adequate GOF, we assessed how the model may be extended, by a theory-guided exploration. We performed a forward model-selection procedure and use score-type tests to see which effect could improve the model. We use sienaGOF to estimate how the fit (based on Mahalanobis distance) would increase had we included the fixed-and-tested effects (hence, circumventing the need for re-estimating the model with the new effect). This resulted in slightly different model-specification for kudos-tie formation dynamics for each club.

If adequate GOF was produced, we started modeling running activity dynamics, and investigated how well our model was able to reproduce the distribution of running behavior values of our panel data.

Down below, we create the final effect-objects for each club. Note: for subsequent meta-analysis, we needed to ensure that the model specification for all our club-networks is identical. In some clubs, some effects were rather important; in clubs where this was not the case, we fixed these to 0.


Getting started

clean up

rm (list = ls( ))

read in data

load("clubdata_rsiena_freq.Rdata")

necessary packages

  • RSiena
library(RSiena)


Effect objects

We make, for each club, 6 model specifications:

  • Model 1: base model + indegree effect on running
  • Model 2: Model 1 + average alter effect
  • Model 3: Model 1 + average attraction higher
  • Model 4: Model 1 + average attraction lower
  • Model 5: Model 1 + average attraction higher + lower (main model used in the manuscript)
  • Model 6: Model 1 + average similarity effect

We save these model specifications in a list for each club.

Club 2

myeff <- getEffects(clubdata_rsiena_freq[[2]])

# base model
myeff <- includeEffects(myeff, gwespFF, name = "kudonet")
myeff <- includeEffects(myeff, outActSqrt, inPopSqrt, name = "kudonet")
myeff <- includeEffects(myeff, outIso, name = "kudonet")
myeff <- setEffect(myeff, higher, name = "kudonet", interaction1 = "freq_run")
myeff <- includeEffects(myeff, egoX, altX, sameX, name = "kudonet", interaction1 = "gender")
myeff <- includeInteraction(myeff, recip, gwespFF, parameter = 69, name = "kudonet")
myeff <- includeEffects(myeff, reciAct, name = "kudonet")
myeff <- setEffect(myeff, outPopSqrt, name = "kudonet", fix = TRUE, test = FALSE, initialValue = 0)
myeff <- includeEffects(myeff, effFrom, name = "freq_run", interaction1 = "freq_other")
myeff <- includeEffects(myeff, effFrom, name = "freq_run", interaction1 = "gender")

# models 1-6
myeff1 <- includeEffects(myeff, indeg, name = "freq_run", interaction1 = "kudonet")  # model 1: indegree
myeff2 <- includeEffects(myeff1, avAlt, name = "freq_run", interaction1 = "kudonet")  # model 2: avAlt
myeff3 <- includeEffects(myeff1, avAttHigher, name = "freq_run", interaction1 = "kudonet")  # model 3: avAttHigher
myeff4 <- includeEffects(myeff1, avAttLower, name = "freq_run", interaction1 = "kudonet")  # model 4: avAttLower
myeff5 <- includeEffects(myeff3, avAttLower, name = "freq_run", interaction1 = "kudonet")  # model 5: avAttHigher+Lower
myeff6 <- includeEffects(myeff1, avSim, name = "freq_run", interaction1 = "kudonet")  # model 6: avSim

Club 3

myeff <- getEffects(clubdata_rsiena_freq[[3]])

# base model
myeff <- includeEffects(myeff, gwespFF, name = "kudonet")
myeff <- includeEffects(myeff, outActSqrt, inPopSqrt, name = "kudonet")
myeff <- includeEffects(myeff, outIso, name = "kudonet")
myeff <- setEffect(myeff, higher, name = "kudonet", interaction1 = "freq_run")
myeff <- includeEffects(myeff, egoX, altX, sameX, name = "kudonet", interaction1 = "gender")
myeff <- includeInteraction(myeff, recip, gwespFF, parameter = 69, name = "kudonet")
myeff <- includeEffects(myeff, outPopSqrt, name = "kudonet")
myeff <- setEffect(myeff, reciAct, name = "kudonet", fix = TRUE, test = FALSE, initialValue = 0)
myeff <- includeEffects(myeff, effFrom, name = "freq_run", interaction1 = "freq_other")
myeff <- includeEffects(myeff, effFrom, name = "freq_run", interaction1 = "gender")

# models 1-6
myeff1 <- includeEffects(myeff, indeg, name = "freq_run", interaction1 = "kudonet")  # model 1: indegree
myeff2 <- includeEffects(myeff1, avAlt, name = "freq_run", interaction1 = "kudonet")  # model 2: avAlt
myeff3 <- includeEffects(myeff1, avAttHigher, name = "freq_run", interaction1 = "kudonet")  # model 3: avAttHigher
myeff4 <- includeEffects(myeff1, avAttLower, name = "freq_run", interaction1 = "kudonet")  # model 4: avAttLower
myeff5 <- includeEffects(myeff3, avAttLower, name = "freq_run", interaction1 = "kudonet")  # model 5: avAttHigher+Lower
myeff6 <- includeEffects(myeff1, avSim, name = "freq_run", interaction1 = "kudonet")  # model 6: avSim

Club 4

myeff <- getEffects(clubdata_rsiena_freq[[4]])

# base model
myeff <- includeEffects(myeff, gwespFF, name = "kudonet")
myeff <- includeEffects(myeff, outActSqrt, inPopSqrt, name = "kudonet")
myeff <- includeEffects(myeff, outIso, name = "kudonet")
myeff <- setEffect(myeff, higher, name = "kudonet", interaction1 = "freq_run")
myeff <- setEffect(myeff, egoX, name = "kudonet", interaction1 = "gender", fix = TRUE, test = FALSE,
    initialValue = 0)
myeff <- setEffect(myeff, altX, name = "kudonet", interaction1 = "gender", fix = TRUE, test = FALSE,
    initialValue = 0)
myeff <- setEffect(myeff, sameX, name = "kudonet", interaction1 = "gender", fix = TRUE, test = FALSE,
    initialValue = 0)
myeff <- setEffect(myeff, outPopSqrt, name = "kudonet", fix = TRUE, test = FALSE, initialValue = 0)
myeff <- setEffect(myeff, reciAct, name = "kudonet", fix = TRUE, test = FALSE, initialValue = 0)
(myeff <- includeInteraction(myeff, recip, gwespFF, parameter = 69, name = "kudonet"))
(eff1 <- myeff[myeff$include, ]$effect1[24])
(eff2 <- myeff[myeff$include, ]$effect2[24])
myeff <- setEffect(myeff, unspInt, fix = TRUE, test = FALSE, effect1 = eff1, effect2 = eff2)
myeff <- includeEffects(myeff, effFrom, name = "freq_run", interaction1 = "freq_other")
myeff <- setEffect(myeff, effFrom, name = "freq_run", interaction1 = "gender", fix = T, test = F, initialValue = 0)

# models 1-6
myeff1 <- includeEffects(myeff, indeg, name = "freq_run", interaction1 = "kudonet")  # model 1: indegree
myeff2 <- includeEffects(myeff1, avAlt, name = "freq_run", interaction1 = "kudonet")  # model 2: avAlt
myeff3 <- includeEffects(myeff1, avAttHigher, name = "freq_run", interaction1 = "kudonet")  # model 3: avAttHigher
myeff4 <- includeEffects(myeff1, avAttLower, name = "freq_run", interaction1 = "kudonet")  # model 4: avAttLower
myeff5 <- includeEffects(myeff3, avAttLower, name = "freq_run", interaction1 = "kudonet")  # model 5: avAttHigher+Lower
myeff6 <- includeEffects(myeff1, avSim, name = "freq_run", interaction1 = "kudonet")  # model 6: avSim

Club 5

myeff <- getEffects(clubdata_rsiena_freq[[5]])

# base model
myeff <- includeEffects(myeff, gwespFF, name = "kudonet")
myeff <- includeEffects(myeff, outActSqrt, inPopSqrt, name = "kudonet")
myeff <- includeEffects(myeff, outIso, name = "kudonet")
myeff <- setEffect(myeff, higher, name = "kudonet", interaction1 = "freq_run")
myeff <- includeEffects(myeff, egoX, altX, sameX, name = "kudonet", interaction1 = "gender")
myeff <- includeInteraction(myeff, recip, gwespFF, parameter = 69, name = "kudonet")
myeff <- setEffect(myeff, outPopSqrt, name = "kudonet", fix = TRUE, test = FALSE, initialValue = 0)
myeff <- setEffect(myeff, reciAct, name = "kudonet", fix = TRUE, test = FALSE, initialValue = 0)
myeff <- includeEffects(myeff, effFrom, name = "freq_run", interaction1 = "freq_other")
myeff <- includeEffects(myeff, effFrom, name = "freq_run", interaction1 = "gender")

# models 1-6
myeff1 <- includeEffects(myeff, indeg, name = "freq_run", interaction1 = "kudonet")  # model 1: indegree
myeff2 <- includeEffects(myeff1, avAlt, name = "freq_run", interaction1 = "kudonet")  # model 2: avAlt
myeff3 <- includeEffects(myeff1, avAttHigher, name = "freq_run", interaction1 = "kudonet")  # model 3: avAttHigher
myeff4 <- includeEffects(myeff1, avAttLower, name = "freq_run", interaction1 = "kudonet")  # model 4: avAttLower
myeff5 <- includeEffects(myeff3, avAttLower, name = "freq_run", interaction1 = "kudonet")  # model 5: avAttHigher+Lower
myeff6 <- includeEffects(myeff1, avSim, name = "freq_run", interaction1 = "kudonet")  # model 6: avSim



Estimation

With the following script, we estimate, for each club i (2-5), all models j (1-6). We rerun the models until adequate convergence is reached. We store the sienaFit objects in a list, which we save later on.

for (i in 2:c) { # for every club

  # we take the rsiena object
  mydata <- clubdata_rsiena_freq[[i]]
  
  # and the list containing myeff objects
  load(file=paste("test", "/", "myeff", "/", "myeff_club", i, ".RData", sep = "")) 
  
  # we make a list for storing the RSiena fit objects
  sienaFit <- list()

  # for club i we run models j in 1:m
  for (j in 1:m) {
 
    # we estimate the model
    try <- 1
    print(paste("Estimating model ", j, " for club ", i, sep=""))
    sienaFit[[j]] <- siena07(myalgorithm, data = mydata, effects = myeff[[j]], returnDeps=TRUE,
                             useCluster=TRUE, nbrNodes=10, initC=TRUE, batch=TRUE) # store it in the list
    
    # re-run until we reach adequate convergence 
    while (TRUE){
      if(sienaFit[[j]]$tconv.max >= .25){
        try <- try + 1
        if (try>30) { # with at max 30 runs.
          print(paste("Now it lasted to long!") 
          break      
        }
        print(paste("Model did not converge adequately (", sienaFit[[j]]$tconv.max, "); ", "Repeat the estimation (", "try ", try, ")", sep = ""))
        sienaFit[[j]] <- siena07( myalgorithm, data = mydata, effects = myeff[[j]], prevAns= sienaFit[[j]], returnDeps=TRUE, useCluster=TRUE, nbrNodes=10, initC=TRUE, batch=TRUE)
      }else{
        print(paste("Reached overall maximum convergence ratio of: ", sienaFit[[j]]$tconv.max, sep = ""))
        print("")
        break
      }
    }
    
  }
  # and save the list with RSiena fit objects
  save(sienaFit, file=paste("test", "/", "sienaFit", "/", "sienaFit_club", i, ".RData", sep = ""))
  print(paste("All models are estimated for club ", i, ". Model results are stored in sienaFit_club", i, ".RData", sep=""))
  print("")
  ifelse(i<c, print(paste("Continuing with club ", i+1, sep="")), print("Estimation finished!"))
  
}

sienaFit_clubL <- list()

for (i in 1:5) {
  temp.space <- new.env()
  bar <- load(paste("test/sienaFit/sienaFit_club", i, ".RData", sep=""), temp.space)
  sienaFit_clubL[[i]] <- get(bar, temp.space)
  rm(temp.space)
}

lapply(sienaFit_clubL, '[[', 5)
map(sienaFit_clubL, 6)


LS0tDQp0aXRsZTogIk90aGVyIGNsdWJzIg0KZGF0ZTogIkxhc3QgY29tcGlsZWQgb24gYHIgZm9ybWF0KFN5cy50aW1lKCksICclQiwgJVknKWAiDQpiaWJsaW9ncmFwaHk6IHJlZmVyZW5jZXMuYmliDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6DQogICAgY3NzOiB0d2Vha3MuY3NzDQogICAgdG9jOiB0cnVlDQogICAgdG9jX2Zsb2F0OiB0cnVlDQogICAgY29sbGFwc2VkOiBmYWxzZQ0KICAgIG51bWJlcl9zZWN0aW9uczogZmFsc2UNCiAgICB0b2NfZGVwdGg6IDENCiAgICBjb2RlX2ZvbGRpbmc6IHNob3cNCiAgICBjb2RlX2Rvd25sb2FkOiB5ZXMNCi0tLQ0KDQpgYGB7ciwgZ2xvYmFsc2V0dGluZ3MsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHJlc3VsdHM9J2hpZGUnfQ0KDQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpDQpvcHRzX2NodW5rJHNldCh0aWR5Lm9wdHM9bGlzdCh3aWR0aC5jdXRvZmY9MTAwKSx0aWR5PVRSVUUsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFLGNvbW1lbnQgPSAiIz4iLCBjYWNoZT1UUlVFLCBjbGFzcy5zb3VyY2U9YygidGVzdCIpLCBjbGFzcy5vdXRwdXQ9YygidGVzdDIiKSkNCm9wdGlvbnMod2lkdGggPSAxMDApDQpyZ2w6OnNldHVwS25pdHIoKQ0KDQpjb2xvcml6ZSA8LSBmdW5jdGlvbih4LCBjb2xvcikge3NwcmludGYoIjxzcGFuIHN0eWxlPSdjb2xvcjogJXM7Jz4lczwvc3Bhbj4iLCBjb2xvciwgeCkgfQ0KDQpgYGANCg0KYGBge3Iga2xpcHB5LCBlY2hvPUZBTFNFLCBpbmNsdWRlPVRSVUV9DQprbGlwcHk6OmtsaXBweShwb3NpdGlvbiA9IGMoJ3RvcCcsICdyaWdodCcpKQ0KI2tsaXBweTo6a2xpcHB5KGNvbG9yID0gJ2RhcmtyZWQnKQ0KI2tsaXBweTo6a2xpcHB5KHRvb2x0aXBfbWVzc2FnZSA9ICdDbGljayB0byBjb3B5JywgdG9vbHRpcF9zdWNjZXNzID0gJ0RvbmUnKQ0KYGBgDQoNCg0KDQotLS0NCg0KV2UgYWxzbyBidWlsdCBpbmNyZWFzaW5nbHkgY29tcGxleCBtb2RlbHMgZm9yIHRoZSByZW1haW5pbmcgNCBjbHVicy4gV2Ugc3RhcnRlZCBieSBtb2RlbGluZyBuZXR3b3JrIHN0cnVjdHVyZSBhbmQgZHluYW1pY3MgaW4ga3Vkb3MgdGllIGZvcm1hdGlvbiwgdXNpbmcgYSByYXRoZXIgc2ltcGxlIG1vZGVsIHNwZWNpZmljYXRpb24uIElmIHRoaXMgZGlkIG5vdCBwcm9kdWNlIGFkZXF1YXRlIEdPRiwgd2UgYXNzZXNzZWQgaG93IHRoZSBtb2RlbCBtYXkgYmUgZXh0ZW5kZWQsIGJ5IGEgdGhlb3J5LWd1aWRlZCBleHBsb3JhdGlvbi4gV2UgcGVyZm9ybWVkIGEgZm9yd2FyZCBtb2RlbC1zZWxlY3Rpb24gcHJvY2VkdXJlIGFuZCB1c2Ugc2NvcmUtdHlwZSB0ZXN0cyB0byBzZWUgd2hpY2ggZWZmZWN0IGNvdWxkIGltcHJvdmUgdGhlIG1vZGVsLiBXZSB1c2UgKnNpZW5hR09GKiB0byBlc3RpbWF0ZSBob3cgdGhlIGZpdCAoYmFzZWQgb24gTWFoYWxhbm9iaXMgZGlzdGFuY2UpIHdvdWxkIGluY3JlYXNlIGhhZCB3ZSBpbmNsdWRlZCB0aGUgZml4ZWQtYW5kLXRlc3RlZCBlZmZlY3RzIChoZW5jZSwgY2lyY3VtdmVudGluZyB0aGUgbmVlZCBmb3IgcmUtZXN0aW1hdGluZyB0aGUgbW9kZWwgd2l0aCB0aGUgbmV3IGVmZmVjdCkuIFRoaXMgcmVzdWx0ZWQgaW4gc2xpZ2h0bHkgZGlmZmVyZW50IG1vZGVsLXNwZWNpZmljYXRpb24gZm9yIGt1ZG9zLXRpZSBmb3JtYXRpb24gZHluYW1pY3MgZm9yIGVhY2ggY2x1Yi4NCg0KSWYgYWRlcXVhdGUgR09GIHdhcyBwcm9kdWNlZCwgd2Ugc3RhcnRlZCBtb2RlbGluZyBydW5uaW5nIGFjdGl2aXR5IGR5bmFtaWNzLCBhbmQgaW52ZXN0aWdhdGVkIGhvdyB3ZWxsIG91ciBtb2RlbCB3YXMgYWJsZSB0byByZXByb2R1Y2UgdGhlIGRpc3RyaWJ1dGlvbiBvZiBydW5uaW5nIGJlaGF2aW9yIHZhbHVlcyBvZiBvdXIgcGFuZWwgZGF0YS4gDQoNCkRvd24gYmVsb3csIHdlIGNyZWF0ZSB0aGUgZmluYWwgZWZmZWN0LW9iamVjdHMgZm9yIGVhY2ggY2x1Yi4gDQpOb3RlOiBmb3Igc3Vic2VxdWVudCBtZXRhLWFuYWx5c2lzLCB3ZSBuZWVkZWQgdG8gZW5zdXJlIHRoYXQgdGhlIG1vZGVsIHNwZWNpZmljYXRpb24gZm9yIGFsbCBvdXIgY2x1Yi1uZXR3b3JrcyBpcyBpZGVudGljYWwuIEluIHNvbWUgY2x1YnMsIHNvbWUgZWZmZWN0cyB3ZXJlIHJhdGhlciBpbXBvcnRhbnQ7IGluIGNsdWJzIHdoZXJlIHRoaXMgd2FzIG5vdCB0aGUgY2FzZSwgd2UgZml4ZWQgdGhlc2UgdG8gMC4NCg0KLS0tLQ0KDQojIEdldHRpbmcgc3RhcnRlZA0KDQojIyBjbGVhbiB1cA0KDQpgYGB7ciwgYXR0ci5vdXRwdXQ9J3N0eWxlPSJtYXgtaGVpZ2h0OiAyMDBweDsiJ30NCnJtIChsaXN0ID0gbHMoICkpDQpgYGANCg0KIyMgcmVhZCBpbiBkYXRhDQoNCmBgYHtyLCBkYXRhfQ0KbG9hZCgiY2x1YmRhdGFfcnNpZW5hX2ZyZXEuUmRhdGEiKQ0KYGBgDQoNCg0KIyMgbmVjZXNzYXJ5IHBhY2thZ2VzDQoNCi0gYFJTaWVuYWANCg0KYGBge3IgcGFja2FnZXMsIHJlc3VsdHM9J2hpZGUnfQ0KbGlicmFyeShSU2llbmEpDQpgYGANCg0KDQo8YnI+DQoNCiMgRWZmZWN0IG9iamVjdHMNCg0KIyMgey50YWJzZXQgLnRhYnNldC1mYWRlfQ0KDQpXZSBtYWtlLCBmb3IgZWFjaCBjbHViLCA2IG1vZGVsIHNwZWNpZmljYXRpb25zOiANCg0KLSBNb2RlbCAxOiBiYXNlIG1vZGVsICsgaW5kZWdyZWUgZWZmZWN0IG9uIHJ1bm5pbmcNCi0gTW9kZWwgMjogTW9kZWwgMSArIGF2ZXJhZ2UgYWx0ZXIgZWZmZWN0DQotIE1vZGVsIDM6IE1vZGVsIDEgKyBhdmVyYWdlIGF0dHJhY3Rpb24gaGlnaGVyDQotIE1vZGVsIDQ6IE1vZGVsIDEgKyBhdmVyYWdlIGF0dHJhY3Rpb24gbG93ZXINCi0gTW9kZWwgNTogTW9kZWwgMSArIGF2ZXJhZ2UgYXR0cmFjdGlvbiBoaWdoZXIgKyBsb3dlciAobWFpbiBtb2RlbCB1c2VkIGluIHRoZSBtYW51c2NyaXB0KQ0KLSBNb2RlbCA2OiBNb2RlbCAxICsgYXZlcmFnZSBzaW1pbGFyaXR5IGVmZmVjdA0KDQpXZSBzYXZlIHRoZXNlIG1vZGVsIHNwZWNpZmljYXRpb25zIGluIGEgbGlzdCBmb3IgZWFjaCBjbHViLg0KDQojIyMgQ2x1YiAyDQpgYGB7ciBlY2hvPVQsIHJlc3VsdHM9J2hpZGUnfQ0KbXllZmYgPC0gZ2V0RWZmZWN0cyhjbHViZGF0YV9yc2llbmFfZnJlcVtbMl1dKQ0KDQojIGJhc2UgbW9kZWwNCm15ZWZmIDwtIGluY2x1ZGVFZmZlY3RzKG15ZWZmLCBnd2VzcEZGLCBuYW1lID0gImt1ZG9uZXQiKSANCm15ZWZmIDwtIGluY2x1ZGVFZmZlY3RzKG15ZWZmLCBvdXRBY3RTcXJ0LCBpblBvcFNxcnQsIG5hbWUgPSAia3Vkb25ldCIpIA0KbXllZmYgPC0gaW5jbHVkZUVmZmVjdHMoIG15ZWZmLCBvdXRJc28sIG5hbWUgPSAia3Vkb25ldCIpDQpteWVmZiA8LSBzZXRFZmZlY3QobXllZmYsIGhpZ2hlciwgbmFtZSA9ICJrdWRvbmV0IiwgaW50ZXJhY3Rpb24xID0gImZyZXFfcnVuIikNCm15ZWZmIDwtIGluY2x1ZGVFZmZlY3RzKG15ZWZmLCBlZ29YLCBhbHRYLCBzYW1lWCwgbmFtZT0ia3Vkb25ldCIsIGludGVyYWN0aW9uMSA9ICJnZW5kZXIiICkNCm15ZWZmIDwtIGluY2x1ZGVJbnRlcmFjdGlvbihteWVmZiwgcmVjaXAsIGd3ZXNwRkYsIHBhcmFtZXRlciA9IDY5LCBuYW1lID0gImt1ZG9uZXQiKQ0KbXllZmYgPC0gaW5jbHVkZUVmZmVjdHMobXllZmYsIHJlY2lBY3QsIG5hbWUgPSAia3Vkb25ldCIpDQpteWVmZiA8LSBzZXRFZmZlY3QoIG15ZWZmLCBvdXRQb3BTcXJ0LCBuYW1lID0gImt1ZG9uZXQiLCBmaXggPSBUUlVFLCB0ZXN0ID0gRkFMU0UsIGluaXRpYWxWYWx1ZSA9IDApDQpteWVmZiA8LSBpbmNsdWRlRWZmZWN0cyhteWVmZiwgZWZmRnJvbSwgbmFtZSA9ICJmcmVxX3J1biIsIGludGVyYWN0aW9uMSA9ICJmcmVxX290aGVyIikNCm15ZWZmIDwtIGluY2x1ZGVFZmZlY3RzKG15ZWZmLCBlZmZGcm9tLCBuYW1lID0gImZyZXFfcnVuIiwgaW50ZXJhY3Rpb24xID0gImdlbmRlciIpDQoNCiMgbW9kZWxzIDEtNg0KbXllZmYxIDwtIGluY2x1ZGVFZmZlY3RzKG15ZWZmLCBpbmRlZywgbmFtZSA9ICJmcmVxX3J1biIsIGludGVyYWN0aW9uMSA9ICJrdWRvbmV0IikgICAgICAgICAjIG1vZGVsIDE6IGluZGVncmVlDQpteWVmZjIgPC0gaW5jbHVkZUVmZmVjdHMobXllZmYxLCBhdkFsdCwgbmFtZSA9ICJmcmVxX3J1biIsIGludGVyYWN0aW9uMSA9ICJrdWRvbmV0IikgICAgICAgICMgbW9kZWwgMjogYXZBbHQNCm15ZWZmMyA8LSBpbmNsdWRlRWZmZWN0cyhteWVmZjEsIGF2QXR0SGlnaGVyLCBuYW1lID0gImZyZXFfcnVuIiwgaW50ZXJhY3Rpb24xID0gImt1ZG9uZXQiKSAgIyBtb2RlbCAzOiBhdkF0dEhpZ2hlcg0KbXllZmY0IDwtIGluY2x1ZGVFZmZlY3RzKG15ZWZmMSwgYXZBdHRMb3dlciwgbmFtZSA9ICJmcmVxX3J1biIsIGludGVyYWN0aW9uMSA9ICJrdWRvbmV0IikgICAjIG1vZGVsIDQ6IGF2QXR0TG93ZXINCm15ZWZmNSA8LSBpbmNsdWRlRWZmZWN0cyhteWVmZjMsIGF2QXR0TG93ZXIsIG5hbWUgPSAiZnJlcV9ydW4iLCBpbnRlcmFjdGlvbjEgPSAia3Vkb25ldCIpICAgIyBtb2RlbCA1OiBhdkF0dEhpZ2hlcitMb3dlcg0KbXllZmY2IDwtIGluY2x1ZGVFZmZlY3RzKG15ZWZmMSwgYXZTaW0sIG5hbWUgPSAiZnJlcV9ydW4iLCBpbnRlcmFjdGlvbjEgPSAia3Vkb25ldCIpICAgICAgICAjIG1vZGVsIDY6IGF2U2ltDQpgYGAgICANCg0KIyMjIENsdWIgMw0KYGBge3IgZWNobz1ULCByZXN1bHRzPSdoaWRlJ30NCm15ZWZmIDwtIGdldEVmZmVjdHMoY2x1YmRhdGFfcnNpZW5hX2ZyZXFbWzNdXSkNCg0KIyBiYXNlIG1vZGVsDQpteWVmZiA8LSBpbmNsdWRlRWZmZWN0cyhteWVmZiwgZ3dlc3BGRiwgbmFtZSA9ICJrdWRvbmV0IikgDQpteWVmZiA8LSBpbmNsdWRlRWZmZWN0cyhteWVmZiwgb3V0QWN0U3FydCwgaW5Qb3BTcXJ0LCBuYW1lID0gImt1ZG9uZXQiKSANCm15ZWZmIDwtIGluY2x1ZGVFZmZlY3RzKCBteWVmZiwgb3V0SXNvLCBuYW1lID0gImt1ZG9uZXQiKQ0KbXllZmYgPC0gc2V0RWZmZWN0KG15ZWZmLCBoaWdoZXIsIG5hbWUgPSAia3Vkb25ldCIsIGludGVyYWN0aW9uMSA9ICJmcmVxX3J1biIpDQpteWVmZiA8LSBpbmNsdWRlRWZmZWN0cyhteWVmZiwgZWdvWCwgYWx0WCwgc2FtZVgsIG5hbWU9Imt1ZG9uZXQiLCBpbnRlcmFjdGlvbjEgPSAiZ2VuZGVyIiApDQpteWVmZiA8LSBpbmNsdWRlSW50ZXJhY3Rpb24obXllZmYsIHJlY2lwLCBnd2VzcEZGLCBwYXJhbWV0ZXIgPSA2OSwgbmFtZSA9ICJrdWRvbmV0IikNCm15ZWZmIDwtIGluY2x1ZGVFZmZlY3RzKG15ZWZmLCBvdXRQb3BTcXJ0LCBuYW1lID0gImt1ZG9uZXQiKQ0KbXllZmYgPC0gc2V0RWZmZWN0KCBteWVmZiwgcmVjaUFjdCwgbmFtZSA9ICJrdWRvbmV0IiwgZml4ID0gVFJVRSwgdGVzdCA9IEZBTFNFLCBpbml0aWFsVmFsdWUgPSAwKQ0KbXllZmYgPC0gaW5jbHVkZUVmZmVjdHMobXllZmYsIGVmZkZyb20sIG5hbWUgPSAiZnJlcV9ydW4iLCBpbnRlcmFjdGlvbjEgPSAiZnJlcV9vdGhlciIpDQpteWVmZiA8LSBpbmNsdWRlRWZmZWN0cyhteWVmZiwgZWZmRnJvbSwgbmFtZSA9ICJmcmVxX3J1biIsIGludGVyYWN0aW9uMSA9ICJnZW5kZXIiKQ0KDQojIG1vZGVscyAxLTYNCm15ZWZmMSA8LSBpbmNsdWRlRWZmZWN0cyhteWVmZiwgaW5kZWcsIG5hbWUgPSAiZnJlcV9ydW4iLCBpbnRlcmFjdGlvbjEgPSAia3Vkb25ldCIpICAgICAgICAgIyBtb2RlbCAxOiBpbmRlZ3JlZQ0KbXllZmYyIDwtIGluY2x1ZGVFZmZlY3RzKG15ZWZmMSwgYXZBbHQsIG5hbWUgPSAiZnJlcV9ydW4iLCBpbnRlcmFjdGlvbjEgPSAia3Vkb25ldCIpICAgICAgICAjIG1vZGVsIDI6IGF2QWx0DQpteWVmZjMgPC0gaW5jbHVkZUVmZmVjdHMobXllZmYxLCBhdkF0dEhpZ2hlciwgbmFtZSA9ICJmcmVxX3J1biIsIGludGVyYWN0aW9uMSA9ICJrdWRvbmV0IikgICMgbW9kZWwgMzogYXZBdHRIaWdoZXINCm15ZWZmNCA8LSBpbmNsdWRlRWZmZWN0cyhteWVmZjEsIGF2QXR0TG93ZXIsIG5hbWUgPSAiZnJlcV9ydW4iLCBpbnRlcmFjdGlvbjEgPSAia3Vkb25ldCIpICAgIyBtb2RlbCA0OiBhdkF0dExvd2VyDQpteWVmZjUgPC0gaW5jbHVkZUVmZmVjdHMobXllZmYzLCBhdkF0dExvd2VyLCBuYW1lID0gImZyZXFfcnVuIiwgaW50ZXJhY3Rpb24xID0gImt1ZG9uZXQiKSAgICMgbW9kZWwgNTogYXZBdHRIaWdoZXIrTG93ZXINCm15ZWZmNiA8LSBpbmNsdWRlRWZmZWN0cyhteWVmZjEsIGF2U2ltLCBuYW1lID0gImZyZXFfcnVuIiwgaW50ZXJhY3Rpb24xID0gImt1ZG9uZXQiKSAgICAgICAgIyBtb2RlbCA2OiBhdlNpbQ0KYGBgDQoNCiMjIyBDbHViIDQNCmBgYHtyIGVjaG89VCwgcmVzdWx0cz0naGlkZSd9DQpteWVmZiA8LSBnZXRFZmZlY3RzKGNsdWJkYXRhX3JzaWVuYV9mcmVxW1s0XV0pDQoNCiMgYmFzZSBtb2RlbA0KbXllZmYgPC0gaW5jbHVkZUVmZmVjdHMobXllZmYsIGd3ZXNwRkYsIG5hbWUgPSAia3Vkb25ldCIpIA0KbXllZmYgPC0gaW5jbHVkZUVmZmVjdHMobXllZmYsIG91dEFjdFNxcnQsIGluUG9wU3FydCwgbmFtZSA9ICJrdWRvbmV0IikgDQpteWVmZiA8LSBpbmNsdWRlRWZmZWN0cyggbXllZmYsIG91dElzbywgbmFtZSA9ICJrdWRvbmV0IikNCm15ZWZmIDwtIHNldEVmZmVjdChteWVmZiwgaGlnaGVyLCBuYW1lID0gImt1ZG9uZXQiLCBpbnRlcmFjdGlvbjEgPSAiZnJlcV9ydW4iKQ0KbXllZmYgPC0gc2V0RWZmZWN0KCBteWVmZiwgZWdvWCwgbmFtZSA9ICJrdWRvbmV0IiwgaW50ZXJhY3Rpb24xID0gImdlbmRlciIsIGZpeD1UUlVFLCB0ZXN0PUZBTFNFLCBpbml0aWFsVmFsdWUgPSAwKQ0KbXllZmYgPC0gc2V0RWZmZWN0KCBteWVmZiwgYWx0WCwgbmFtZSA9ICJrdWRvbmV0IiwgaW50ZXJhY3Rpb24xID0gImdlbmRlciIsIGZpeD1UUlVFLCB0ZXN0PUZBTFNFLCBpbml0aWFsVmFsdWUgPSAwKQ0KbXllZmYgPC0gc2V0RWZmZWN0KCBteWVmZiwgc2FtZVgsIG5hbWUgPSAia3Vkb25ldCIsIGludGVyYWN0aW9uMSA9ICJnZW5kZXIiLCBmaXg9VFJVRSwgdGVzdD1GQUxTRSwgaW5pdGlhbFZhbHVlID0gMCkNCm15ZWZmIDwtIHNldEVmZmVjdChteWVmZiwgb3V0UG9wU3FydCwgbmFtZSA9ICJrdWRvbmV0IiwgZml4PVRSVUUsIHRlc3Q9RkFMU0UsIGluaXRpYWxWYWx1ZSA9IDApDQpteWVmZiA8LSBzZXRFZmZlY3QobXllZmYsIHJlY2lBY3QsIG5hbWUgPSAia3Vkb25ldCIsIGZpeD1UUlVFLCB0ZXN0PUZBTFNFLCBpbml0aWFsVmFsdWUgPSAwKQ0KKG15ZWZmIDwtIGluY2x1ZGVJbnRlcmFjdGlvbihteWVmZiwgcmVjaXAsIGd3ZXNwRkYsIHBhcmFtZXRlciA9IDY5LCBuYW1lID0gImt1ZG9uZXQiKSkNCihlZmYxIDwtIG15ZWZmW215ZWZmJGluY2x1ZGUsXSRlZmZlY3QxWzI0XSkNCihlZmYyIDwtIG15ZWZmW215ZWZmJGluY2x1ZGUsXSRlZmZlY3QyWzI0XSkNCm15ZWZmIDwtIHNldEVmZmVjdChteWVmZiwgdW5zcEludCwgZml4PVRSVUUsIHRlc3Q9RkFMU0UsIGVmZmVjdDE9ZWZmMSwgZWZmZWN0Mj1lZmYyKQ0KbXllZmYgPC0gaW5jbHVkZUVmZmVjdHMobXllZmYsIGVmZkZyb20sIG5hbWUgPSAiZnJlcV9ydW4iLCBpbnRlcmFjdGlvbjEgPSAiZnJlcV9vdGhlciIpDQpteWVmZiA8LSBzZXRFZmZlY3QobXllZmYsIGVmZkZyb20sIG5hbWUgPSAiZnJlcV9ydW4iLCBpbnRlcmFjdGlvbjEgPSAiZ2VuZGVyIiwgZml4PVQsIHRlc3Q9RiwgaW5pdGlhbFZhbHVlPTApDQoNCiMgbW9kZWxzIDEtNg0KbXllZmYxIDwtIGluY2x1ZGVFZmZlY3RzKG15ZWZmLCBpbmRlZywgbmFtZSA9ICJmcmVxX3J1biIsIGludGVyYWN0aW9uMSA9ICJrdWRvbmV0IikgICAgICAgICAjIG1vZGVsIDE6IGluZGVncmVlDQpteWVmZjIgPC0gaW5jbHVkZUVmZmVjdHMobXllZmYxLCBhdkFsdCwgbmFtZSA9ICJmcmVxX3J1biIsIGludGVyYWN0aW9uMSA9ICJrdWRvbmV0IikgICAgICAgICMgbW9kZWwgMjogYXZBbHQNCm15ZWZmMyA8LSBpbmNsdWRlRWZmZWN0cyhteWVmZjEsIGF2QXR0SGlnaGVyLCBuYW1lID0gImZyZXFfcnVuIiwgaW50ZXJhY3Rpb24xID0gImt1ZG9uZXQiKSAgIyBtb2RlbCAzOiBhdkF0dEhpZ2hlcg0KbXllZmY0IDwtIGluY2x1ZGVFZmZlY3RzKG15ZWZmMSwgYXZBdHRMb3dlciwgbmFtZSA9ICJmcmVxX3J1biIsIGludGVyYWN0aW9uMSA9ICJrdWRvbmV0IikgICAjIG1vZGVsIDQ6IGF2QXR0TG93ZXINCm15ZWZmNSA8LSBpbmNsdWRlRWZmZWN0cyhteWVmZjMsIGF2QXR0TG93ZXIsIG5hbWUgPSAiZnJlcV9ydW4iLCBpbnRlcmFjdGlvbjEgPSAia3Vkb25ldCIpICAgIyBtb2RlbCA1OiBhdkF0dEhpZ2hlcitMb3dlcg0KbXllZmY2IDwtIGluY2x1ZGVFZmZlY3RzKG15ZWZmMSwgYXZTaW0sIG5hbWUgPSAiZnJlcV9ydW4iLCBpbnRlcmFjdGlvbjEgPSAia3Vkb25ldCIpICAgICAgICAjIG1vZGVsIDY6IGF2U2ltDQpgYGANCg0KIyMjIENsdWIgNQ0KYGBge3IgZWNobz1ULCByZXN1bHRzPSdoaWRlJ30NCm15ZWZmIDwtIGdldEVmZmVjdHMoY2x1YmRhdGFfcnNpZW5hX2ZyZXFbWzVdXSkNCg0KIyBiYXNlIG1vZGVsDQpteWVmZiA8LSBpbmNsdWRlRWZmZWN0cyhteWVmZiwgZ3dlc3BGRiwgbmFtZSA9ICJrdWRvbmV0IikgDQpteWVmZiA8LSBpbmNsdWRlRWZmZWN0cyhteWVmZiwgb3V0QWN0U3FydCwgaW5Qb3BTcXJ0LCBuYW1lID0gImt1ZG9uZXQiKSANCm15ZWZmIDwtIGluY2x1ZGVFZmZlY3RzKCBteWVmZiwgb3V0SXNvLCBuYW1lID0gImt1ZG9uZXQiKQ0KbXllZmYgPC0gc2V0RWZmZWN0KG15ZWZmLCBoaWdoZXIsIG5hbWUgPSAia3Vkb25ldCIsIGludGVyYWN0aW9uMSA9ICJmcmVxX3J1biIpDQpteWVmZiA8LSBpbmNsdWRlRWZmZWN0cyhteWVmZiwgZWdvWCwgYWx0WCwgc2FtZVgsIG5hbWU9Imt1ZG9uZXQiLCBpbnRlcmFjdGlvbjEgPSAiZ2VuZGVyIiApDQpteWVmZiA8LSBpbmNsdWRlSW50ZXJhY3Rpb24obXllZmYsIHJlY2lwLCBnd2VzcEZGLCBwYXJhbWV0ZXIgPSA2OSwgbmFtZSA9ICJrdWRvbmV0IikNCm15ZWZmIDwtIHNldEVmZmVjdCggbXllZmYsIG91dFBvcFNxcnQsIG5hbWUgPSAia3Vkb25ldCIsIGZpeCA9IFRSVUUsIHRlc3QgPSBGQUxTRSwgaW5pdGlhbFZhbHVlID0gMCkNCm15ZWZmIDwtIHNldEVmZmVjdCggbXllZmYsIHJlY2lBY3QsIG5hbWUgPSAia3Vkb25ldCIsIGZpeCA9IFRSVUUsIHRlc3QgPSBGQUxTRSwgaW5pdGlhbFZhbHVlID0gMCkNCm15ZWZmIDwtIGluY2x1ZGVFZmZlY3RzKG15ZWZmLCBlZmZGcm9tLCBuYW1lID0gImZyZXFfcnVuIiwgaW50ZXJhY3Rpb24xID0gImZyZXFfb3RoZXIiKQ0KbXllZmYgPC0gaW5jbHVkZUVmZmVjdHMobXllZmYsIGVmZkZyb20sIG5hbWUgPSAiZnJlcV9ydW4iLCBpbnRlcmFjdGlvbjEgPSAiZ2VuZGVyIikNCg0KIyBtb2RlbHMgMS02DQpteWVmZjEgPC0gaW5jbHVkZUVmZmVjdHMobXllZmYsIGluZGVnLCBuYW1lID0gImZyZXFfcnVuIiwgaW50ZXJhY3Rpb24xID0gImt1ZG9uZXQiKSAgICAgICAgICMgbW9kZWwgMTogaW5kZWdyZWUNCm15ZWZmMiA8LSBpbmNsdWRlRWZmZWN0cyhteWVmZjEsIGF2QWx0LCBuYW1lID0gImZyZXFfcnVuIiwgaW50ZXJhY3Rpb24xID0gImt1ZG9uZXQiKSAgICAgICAgIyBtb2RlbCAyOiBhdkFsdA0KbXllZmYzIDwtIGluY2x1ZGVFZmZlY3RzKG15ZWZmMSwgYXZBdHRIaWdoZXIsIG5hbWUgPSAiZnJlcV9ydW4iLCBpbnRlcmFjdGlvbjEgPSAia3Vkb25ldCIpICAjIG1vZGVsIDM6IGF2QXR0SGlnaGVyDQpteWVmZjQgPC0gaW5jbHVkZUVmZmVjdHMobXllZmYxLCBhdkF0dExvd2VyLCBuYW1lID0gImZyZXFfcnVuIiwgaW50ZXJhY3Rpb24xID0gImt1ZG9uZXQiKSAgICMgbW9kZWwgNDogYXZBdHRMb3dlcg0KbXllZmY1IDwtIGluY2x1ZGVFZmZlY3RzKG15ZWZmMywgYXZBdHRMb3dlciwgbmFtZSA9ICJmcmVxX3J1biIsIGludGVyYWN0aW9uMSA9ICJrdWRvbmV0IikgICAjIG1vZGVsIDU6IGF2QXR0SGlnaGVyK0xvd2VyDQpteWVmZjYgPC0gaW5jbHVkZUVmZmVjdHMobXllZmYxLCBhdlNpbSwgbmFtZSA9ICJmcmVxX3J1biIsIGludGVyYWN0aW9uMSA9ICJrdWRvbmV0IikgICAgICAgICMgbW9kZWwgNjogYXZTaW0NCmBgYA0KDQojIyB7LX0NCg0KLS0tLQ0KDQo8YnI+DQoNCiMgRXN0aW1hdGlvbg0KDQpXaXRoIHRoZSBmb2xsb3dpbmcgc2NyaXB0LCB3ZSBlc3RpbWF0ZSwgZm9yIGVhY2ggY2x1YiBpICgyLTUpLCBhbGwgbW9kZWxzIGogKDEtNikuDQpXZSByZXJ1biB0aGUgbW9kZWxzIHVudGlsIGFkZXF1YXRlIGNvbnZlcmdlbmNlIGlzIHJlYWNoZWQuDQpXZSBzdG9yZSB0aGUgc2llbmFGaXQgb2JqZWN0cyBpbiBhIGxpc3QsIHdoaWNoIHdlIHNhdmUgbGF0ZXIgb24uDQoNCmBgYHtyIGV2YWw9Rn0NCg0KZm9yIChpIGluIDI6YykgeyAjIGZvciBldmVyeSBjbHViDQoNCiAgIyB3ZSB0YWtlIHRoZSByc2llbmEgb2JqZWN0DQogIG15ZGF0YSA8LSBjbHViZGF0YV9yc2llbmFfZnJlcVtbaV1dDQogIA0KICAjIGFuZCB0aGUgbGlzdCBjb250YWluaW5nIG15ZWZmIG9iamVjdHMNCiAgbG9hZChmaWxlPXBhc3RlKCJ0ZXN0IiwgIi8iLCAibXllZmYiLCAiLyIsICJteWVmZl9jbHViIiwgaSwgIi5SRGF0YSIsIHNlcCA9ICIiKSkgDQogIA0KICAjIHdlIG1ha2UgYSBsaXN0IGZvciBzdG9yaW5nIHRoZSBSU2llbmEgZml0IG9iamVjdHMNCiAgc2llbmFGaXQgPC0gbGlzdCgpDQoNCiAgIyBmb3IgY2x1YiBpIHdlIHJ1biBtb2RlbHMgaiBpbiAxOm0NCiAgZm9yIChqIGluIDE6bSkgew0KIA0KICAgICMgd2UgZXN0aW1hdGUgdGhlIG1vZGVsDQogICAgdHJ5IDwtIDENCiAgICBwcmludChwYXN0ZSgiRXN0aW1hdGluZyBtb2RlbCAiLCBqLCAiIGZvciBjbHViICIsIGksIHNlcD0iIikpDQogICAgc2llbmFGaXRbW2pdXSA8LSBzaWVuYTA3KG15YWxnb3JpdGhtLCBkYXRhID0gbXlkYXRhLCBlZmZlY3RzID0gbXllZmZbW2pdXSwgcmV0dXJuRGVwcz1UUlVFLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VDbHVzdGVyPVRSVUUsIG5ick5vZGVzPTEwLCBpbml0Qz1UUlVFLCBiYXRjaD1UUlVFKSAjIHN0b3JlIGl0IGluIHRoZSBsaXN0DQogICAgDQogICAgIyByZS1ydW4gdW50aWwgd2UgcmVhY2ggYWRlcXVhdGUgY29udmVyZ2VuY2UgDQogICAgd2hpbGUgKFRSVUUpew0KICAgICAgaWYoc2llbmFGaXRbW2pdXSR0Y29udi5tYXggPj0gLjI1KXsNCiAgICAgICAgdHJ5IDwtIHRyeSArIDENCiAgICAgICAgaWYgKHRyeT4zMCkgeyAjIHdpdGggYXQgbWF4IDMwIHJ1bnMuDQogICAgICAgICAgcHJpbnQocGFzdGUoIk5vdyBpdCBsYXN0ZWQgdG8gbG9uZyEiKSANCiAgICAgICAgICBicmVhayAgICAgIA0KICAgICAgICB9DQogICAgICAgIHByaW50KHBhc3RlKCJNb2RlbCBkaWQgbm90IGNvbnZlcmdlIGFkZXF1YXRlbHkgKCIsIHNpZW5hRml0W1tqXV0kdGNvbnYubWF4LCAiKTsgIiwgIlJlcGVhdCB0aGUgZXN0aW1hdGlvbiAoIiwgInRyeSAiLCB0cnksICIpIiwgc2VwID0gIiIpKQ0KICAgICAgICBzaWVuYUZpdFtbal1dIDwtIHNpZW5hMDcoIG15YWxnb3JpdGhtLCBkYXRhID0gbXlkYXRhLCBlZmZlY3RzID0gbXllZmZbW2pdXSwgcHJldkFucz0gc2llbmFGaXRbW2pdXSwgcmV0dXJuRGVwcz1UUlVFLCB1c2VDbHVzdGVyPVRSVUUsIG5ick5vZGVzPTEwLCBpbml0Qz1UUlVFLCBiYXRjaD1UUlVFKQ0KICAgICAgfWVsc2V7DQogICAgICAgIHByaW50KHBhc3RlKCJSZWFjaGVkIG92ZXJhbGwgbWF4aW11bSBjb252ZXJnZW5jZSByYXRpbyBvZjogIiwgc2llbmFGaXRbW2pdXSR0Y29udi5tYXgsIHNlcCA9ICIiKSkNCiAgICAgICAgcHJpbnQoIiIpDQogICAgICAgIGJyZWFrDQogICAgICB9DQogICAgfQ0KICAgIA0KICB9DQogICMgYW5kIHNhdmUgdGhlIGxpc3Qgd2l0aCBSU2llbmEgZml0IG9iamVjdHMNCiAgc2F2ZShzaWVuYUZpdCwgZmlsZT1wYXN0ZSgidGVzdCIsICIvIiwgInNpZW5hRml0IiwgIi8iLCAic2llbmFGaXRfY2x1YiIsIGksICIuUkRhdGEiLCBzZXAgPSAiIikpDQogIHByaW50KHBhc3RlKCJBbGwgbW9kZWxzIGFyZSBlc3RpbWF0ZWQgZm9yIGNsdWIgIiwgaSwgIi4gTW9kZWwgcmVzdWx0cyBhcmUgc3RvcmVkIGluIHNpZW5hRml0X2NsdWIiLCBpLCAiLlJEYXRhIiwgc2VwPSIiKSkNCiAgcHJpbnQoIiIpDQogIGlmZWxzZShpPGMsIHByaW50KHBhc3RlKCJDb250aW51aW5nIHdpdGggY2x1YiAiLCBpKzEsIHNlcD0iIikpLCBwcmludCgiRXN0aW1hdGlvbiBmaW5pc2hlZCEiKSkNCiAgDQp9DQoNCnNpZW5hRml0X2NsdWJMIDwtIGxpc3QoKQ0KDQpmb3IgKGkgaW4gMTo1KSB7DQogIHRlbXAuc3BhY2UgPC0gbmV3LmVudigpDQogIGJhciA8LSBsb2FkKHBhc3RlKCJ0ZXN0L3NpZW5hRml0L3NpZW5hRml0X2NsdWIiLCBpLCAiLlJEYXRhIiwgc2VwPSIiKSwgdGVtcC5zcGFjZSkNCiAgc2llbmFGaXRfY2x1YkxbW2ldXSA8LSBnZXQoYmFyLCB0ZW1wLnNwYWNlKQ0KICBybSh0ZW1wLnNwYWNlKQ0KfQ0KDQpsYXBwbHkoc2llbmFGaXRfY2x1YkwsICdbWycsIDUpDQptYXAoc2llbmFGaXRfY2x1YkwsIDYpDQoNCmBgYA0KDQoNCg0KDQo8YnI+


Copyright © 2021 Rob Franken