#start with clean workspace
rm(list=ls())
getwd()
#> [1] "C:/Users/ninab/OneDrive/Documenten/GitHub/labjournal"
packages
library(data.table)
library(tidyverse)
require(stringi)
require(Rsiena)
require(igraph)
Data
#load dataobjects
load("./data/descriptives/RU_net_array_sym.RData")
load("./data/descriptives/RU_dfv2.RData")
custum functions
# density: observed relations divided by possible relations
fdensity <- function(x) {
# x is your nomination network make sure diagonal cells are NA
diag(x) <- NA
# take care of RSiena structural zeros, set as missing.
x[x == 10] <- NA
sum(x == 1, na.rm = T)/(sum(x == 1 | x == 0, na.rm = T))
}
# calculate intragroup density
fdensityintra <- function(x, A) {
# A is matrix indicating whether nodes in dyad have same node attributes
diag(x) <- NA
x[x == 10] <- NA
diag(A) <- NA
sum(x == 1 & A == 1, na.rm = T)/(sum((x == 1 | x == 0) & A == 1, na.rm = T))
}
# calculate intergroup density
fdensityinter <- function(x, A) {
# A is matrix indicating whether nodes in dyad have same node attributes
diag(x) <- NA
x[x == 10] <- NA
diag(A) <- NA
sum(x == 1 & A != 1, na.rm = T)/(sum((x == 1 | x == 0) & A != 1, na.rm = T))
}
# construct dyadcharacteristic whether nodes are similar/homogenous
fhomomat <- function(x) {
# x is a vector of node-covariate
xmat <- matrix(x, nrow = length(x), ncol = length(x))
xmatt <- t(xmat)
xhomo <- xmat == xmatt
return(xhomo)
}
# a function to calculate all valid dyads.
fndyads <- function(x) {
diag(x) <- NA
x[x == 10] <- NA
(sum((x == 1 | x == 0), na.rm = T))
}
# a function to calculate all valid intragroupdyads.
fndyads2 <- function(x, A) {
diag(x) <- NA
x[x == 10] <- NA
diag(A) <- NA
(sum((x == 1 | x == 0) & A == 1, na.rm = T))
}
descriptives
summary(soc_df$div.net)
#> Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
#> 0.00 0.00 15.48 23.61 37.24 100.00 2
sd(soc_df$div.net, na.rm=TRUE)
#> [1] 27.7464
table(soc_df$div.net)
#>
#> 0 4.17 6.98 9.09 13.79 14.29 16.67 18.75 22.5 25 28.57 28.95 40 42.86 60 70
#> 10 1 1 1 1 1 2 1 1 1 1 1 2 1 1 1
#> 71.43 78.57 100
#> 1 1 1
hist(soc_df$div.net, col="lightblue", main='RU: ethnic diversity egonets', xlab='Percentage non-Dutch collaborators')
summary(soc_df$div.ego)
#> Min. 1st Qu. Median Mean 3rd Qu. Max.
#> 0.0000 1.0000 1.0000 0.8438 1.0000 1.0000
table(soc_df$div.ego)
#>
#> 0 1
#> 5 27
summary(soc_df$nauthors)
#> Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
#> 1.0 5.5 11.0 13.1 15.0 43.0 1
sd(soc_df$nauthors, na.rm=TRUE)
#> [1] 11.06452
hist(soc_df$nauthors, col="lightblue", main='RU: number of co-authors', xlab='Number of co-authors since 2019')
summary(soc_df$pub_first)
#> Min. 1st Qu. Median Mean 3rd Qu. Max.
#> 1970 2005 2011 2007 2017 2019
sd(soc_df$pub_first, na.rm=TRUE)
#> [1] 13.59254
hist(soc_df$pub_first, col="lightblue", main='RU: year first publication', xlab='Year first publication')
table(soc_df$gender4)
#>
#> 0 1
#> 16 16
hist(soc_df$gender4, col="lightblue")
degree
net 1
net1 <- net_soc_array[ ,, 1]
diag(net1) <- 0
degree <- rowSums(net1)
hist(degree)
summary(degree)
#> Min. 1st Qu. Median Mean 3rd Qu. Max.
#> 0.0000 0.0000 0.0000 0.9375 1.2500 7.0000
sd(degree)
#> [1] 1.66438
net 2
net2 <- net_soc_array[ ,, 2]
diag(net2) <- 0
degree <- rowSums(net2)
hist(degree)
summary(degree)
#> Min. 1st Qu. Median Mean 3rd Qu. Max.
#> 0.000 0.000 0.000 1.062 1.250 6.000
sd(degree)
#> [1] 1.721543
net 3
net3 <- net_soc_array[ ,, 3]
diag(net3) <- 0
degree <- rowSums(net3)
hist(degree)
summary(degree)
#> Min. 1st Qu. Median Mean 3rd Qu. Max.
#> 0.00 0.00 1.50 1.75 3.00 6.00
sd(degree)
#> [1] 2
igraph object
net 1
net1_g <- igraph::graph_from_adjacency_matrix(net1, mode = c("undirected"))
plot(net1_g)
igraph::degree(net1_g)
#> [1] 0 0 0 0 0 0 4 0 0 0 1 0 0 7 2 1 2 0 3 2 3 4 0 0 0 0 0 0 0 1 0 0
igraph::dyad.census(net1_g)
#> $mut
#> [1] 15
#>
#> $asym
#> [1] 0
#>
#> $null
#> [1] 481
igraph::triad.census(net1_g)
#> [1] 4546 0 384 0 0 0 0 0 0 0 24 0 0 0 0 6
igraph::edge_density(net1_g)
#> [1] 0.03024194
sum(igraph::degree(net1_g))
#> [1] 30
net 2
net2_g <- igraph::graph_from_adjacency_matrix(net2, mode = c("undirected"))
plot(net2_g)
igraph::degree(net2_g)
#> [1] 1 0 0 0 2 0 5 0 2 1 0 0 0 6 1 1 5 2 1 0 4 3 0 0 0 0 0 0 0 0 0 0
igraph::dyad.census(net2_g)
#> $mut
#> [1] 17
#>
#> $asym
#> [1] 0
#>
#> $null
#> [1] 479
igraph::triad.census(net2_g)
#> [1] 4492 0 431 0 0 0 0 0 0 0 32 0 0 0 0 5
igraph::edge_density(net2_g)
#> [1] 0.03427419
sum(igraph::degree(net2_g))
#> [1] 34
net 3
net3_g <- igraph::graph_from_adjacency_matrix(net3, mode = c("undirected"))
plot(net3_g)
igraph::degree(net3_g)
#> [1] 0 0 0 0 2 0 6 1 1 0 0 0 0 6 2 3 5 6 3 4 2 2 2 0 0 2 2 4 3 0 0 0
igraph::dyad.census(net3_g)
#> $mut
#> [1] 28
#>
#> $asym
#> [1] 0
#>
#> $null
#> [1] 468
igraph::triad.census(net3_g)
#> [1] 4192 0 707 0 0 0 0 0 0 0 50 0 0 0 0 11
igraph::edge_density(net3_g)
#> [1] 0.05645161
sum(igraph::degree(net3_g))
#> [1] 56
density
net 1
net_und <- net1 + t(net1)
net_und[net_und==2] <- 1
sum(net_und, na.rm=TRUE)
#> [1] 30
fdensity(net1)
#> [1] 0.03024194
net 2
net_und <- net2 + t(net2)
net_und[net_und==2] <- 1
sum(net_und, na.rm=TRUE)
#> [1] 34
fdensity(net2)
#> [1] 0.03427419
net 3
net_und <- net3 + t(net3)
net_und[net_und==2] <- 1
sum(net_und, na.rm=TRUE)
#> [1] 56
fdensity(net3)
#> [1] 0.05645161
inter-/intragroup
density
div_m <- fhomomat(soc_df$div.ego)
# calculate intra-/intergroup density diversity ego
fdensityintra(x=net_und, A=div_m)
#> [1] 0.06371191
fdensityinter(x=net_und, A=div_m)
#> [1] 0.03703704
# calculate intra-/intergroup density gender
gender_m <- fhomomat(soc_df$gender4)
fdensityintra(x=net_und, A=gender_m)
#> [1] 0.05833333
fdensityinter(x=net_und, A=gender_m)
#> [1] 0.0546875
LS0tDQp0aXRsZTogIlJVIGRlc2NyaXB0aXZlcyINCmF1dGhvcjogImJ5OiBOaW5hIEJyYW50ZW4iDQpiaWJsaW9ncmFwaHk6IHJlZmVyZW5jZXMuYmliDQotLS0NCg0KDQoNCmBgYHtyLCBpbnN0YWxsIHJlbW90ZWx5LCBnbG9iYWxzZXR0aW5ncywgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgcmVzdWx0cz0naGlkZScsIGV2YWw9RkFMU0V9DQppbnN0YWxsLnBhY2thZ2VzKCJyZW1vdGVzIikNCnJlbW90ZXM6Omluc3RhbGxfZ2l0aHViKCJybGVzdXIva2xpcHB5IikNCmBgYCANCg0KYGBge3IsIGdsb2JhbHNldHRpbmdzLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCByZXN1bHRzPSdoaWRlJ30NCmxpYnJhcnkoa25pdHIpDQpsaWJyYXJ5KHJnbCkNCg0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFKQ0Kb3B0c19jaHVuayRzZXQodGlkeS5vcHRzPWxpc3Qod2lkdGguY3V0b2ZmPTEwMCksdGlkeT1UUlVFLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSxjb21tZW50ID0gIiM+IiwgY2FjaGU9VFJVRSwgY2xhc3Muc291cmNlPWMoInRlc3QiKSwgY2xhc3Mub3V0cHV0PWMoInRlc3QyIikpDQpvcHRpb25zKHdpZHRoID0gMTAwKQ0KcmdsOjpzZXR1cEtuaXRyKCkNCg0KDQoNCmNvbG9yaXplIDwtIGZ1bmN0aW9uKHgsIGNvbG9yKSB7c3ByaW50ZigiPHNwYW4gc3R5bGU9J2NvbG9yOiAlczsnPiVzPC9zcGFuPiIsIGNvbG9yLCB4KSB9DQoNCmBgYA0KDQpgYGB7ciBrbGlwcHksIGVjaG89RkFMU0UsIGluY2x1ZGU9VFJVRX0NCmtsaXBweTo6a2xpcHB5KHBvc2l0aW9uID0gYygndG9wJywgJ3JpZ2h0JykpDQoja2xpcHB5OjprbGlwcHkoY29sb3IgPSAnZGFya3JlZCcpDQoja2xpcHB5OjprbGlwcHkodG9vbHRpcF9tZXNzYWdlID0gJ0NsaWNrIHRvIGNvcHknLCB0b29sdGlwX3N1Y2Nlc3MgPSAnRG9uZScpDQpgYGANCg0KDQpgYGB7cn0NCiNzdGFydCB3aXRoIGNsZWFuIHdvcmtzcGFjZSANCnJtKGxpc3Q9bHMoKSkNCmdldHdkKCkNCmBgYA0KDQojIHBhY2thZ2VzDQoNCmBgYHtyfQ0KbGlicmFyeShkYXRhLnRhYmxlKSANCmxpYnJhcnkodGlkeXZlcnNlKSANCnJlcXVpcmUoc3RyaW5naSkNCnJlcXVpcmUoUnNpZW5hKQ0KcmVxdWlyZShpZ3JhcGgpDQoNCmBgYA0KIyBEYXRhDQoNCmBgYHtyfQ0KI2xvYWQgZGF0YW9iamVjdHMNCmxvYWQoIi4vZGF0YS9kZXNjcmlwdGl2ZXMvUlVfbmV0X2FycmF5X3N5bS5SRGF0YSIpDQpsb2FkKCIuL2RhdGEvZGVzY3JpcHRpdmVzL1JVX2RmdjIuUkRhdGEiKQ0KYGBgDQoNCg0KIyBjdXN0dW0gZnVuY3Rpb25zDQoNCmBgYHtyfQ0KIyBkZW5zaXR5OiBvYnNlcnZlZCByZWxhdGlvbnMgZGl2aWRlZCBieSBwb3NzaWJsZSByZWxhdGlvbnMNCmZkZW5zaXR5IDwtIGZ1bmN0aW9uKHgpIHsNCiAgICAjIHggaXMgeW91ciBub21pbmF0aW9uIG5ldHdvcmsgbWFrZSBzdXJlIGRpYWdvbmFsIGNlbGxzIGFyZSBOQQ0KICAgIGRpYWcoeCkgPC0gTkENCiAgICAjIHRha2UgY2FyZSBvZiBSU2llbmEgc3RydWN0dXJhbCB6ZXJvcywgc2V0IGFzIG1pc3NpbmcuDQogICAgeFt4ID09IDEwXSA8LSBOQQ0KICAgIHN1bSh4ID09IDEsIG5hLnJtID0gVCkvKHN1bSh4ID09IDEgfCB4ID09IDAsIG5hLnJtID0gVCkpDQp9DQoNCiMgY2FsY3VsYXRlIGludHJhZ3JvdXAgZGVuc2l0eQ0KZmRlbnNpdHlpbnRyYSA8LSBmdW5jdGlvbih4LCBBKSB7DQogICAgIyBBIGlzIG1hdHJpeCBpbmRpY2F0aW5nIHdoZXRoZXIgbm9kZXMgaW4gZHlhZCBoYXZlIHNhbWUgbm9kZSBhdHRyaWJ1dGVzDQogICAgZGlhZyh4KSA8LSBOQQ0KICAgIHhbeCA9PSAxMF0gPC0gTkENCiAgICBkaWFnKEEpIDwtIE5BDQogICAgc3VtKHggPT0gMSAmIEEgPT0gMSwgbmEucm0gPSBUKS8oc3VtKCh4ID09IDEgfCB4ID09IDApICYgQSA9PSAxLCBuYS5ybSA9IFQpKQ0KfQ0KDQojIGNhbGN1bGF0ZSBpbnRlcmdyb3VwIGRlbnNpdHkNCmZkZW5zaXR5aW50ZXIgPC0gZnVuY3Rpb24oeCwgQSkgew0KICAgICMgQSBpcyBtYXRyaXggaW5kaWNhdGluZyB3aGV0aGVyIG5vZGVzIGluIGR5YWQgaGF2ZSBzYW1lIG5vZGUgYXR0cmlidXRlcw0KICAgIGRpYWcoeCkgPC0gTkENCiAgICB4W3ggPT0gMTBdIDwtIE5BDQogICAgZGlhZyhBKSA8LSBOQQ0KICAgIHN1bSh4ID09IDEgJiBBICE9IDEsIG5hLnJtID0gVCkvKHN1bSgoeCA9PSAxIHwgeCA9PSAwKSAmIEEgIT0gMSwgbmEucm0gPSBUKSkNCn0NCg0KIyBjb25zdHJ1Y3QgZHlhZGNoYXJhY3RlcmlzdGljIHdoZXRoZXIgbm9kZXMgYXJlIHNpbWlsYXIvaG9tb2dlbm91cw0KZmhvbW9tYXQgPC0gZnVuY3Rpb24oeCkgew0KICAgICMgeCBpcyBhIHZlY3RvciBvZiBub2RlLWNvdmFyaWF0ZQ0KICAgIHhtYXQgPC0gbWF0cml4KHgsIG5yb3cgPSBsZW5ndGgoeCksIG5jb2wgPSBsZW5ndGgoeCkpDQogICAgeG1hdHQgPC0gdCh4bWF0KQ0KICAgIHhob21vIDwtIHhtYXQgPT0geG1hdHQNCiAgICByZXR1cm4oeGhvbW8pDQp9DQoNCiMgYSBmdW5jdGlvbiB0byBjYWxjdWxhdGUgYWxsIHZhbGlkIGR5YWRzLg0KZm5keWFkcyA8LSBmdW5jdGlvbih4KSB7DQogICAgZGlhZyh4KSA8LSBOQQ0KICAgIHhbeCA9PSAxMF0gPC0gTkENCiAgICAoc3VtKCh4ID09IDEgfCB4ID09IDApLCBuYS5ybSA9IFQpKQ0KfQ0KDQojIGEgZnVuY3Rpb24gdG8gY2FsY3VsYXRlIGFsbCB2YWxpZCBpbnRyYWdyb3VwZHlhZHMuDQpmbmR5YWRzMiA8LSBmdW5jdGlvbih4LCBBKSB7DQogICAgZGlhZyh4KSA8LSBOQQ0KICAgIHhbeCA9PSAxMF0gPC0gTkENCiAgICBkaWFnKEEpIDwtIE5BDQogICAgKHN1bSgoeCA9PSAxIHwgeCA9PSAwKSAmIEEgPT0gMSwgbmEucm0gPSBUKSkNCn0NCmBgYA0KDQojIGRlc2NyaXB0aXZlcw0KDQpgYGB7cn0NCnN1bW1hcnkoc29jX2RmJGRpdi5uZXQpDQpzZChzb2NfZGYkZGl2Lm5ldCwgbmEucm09VFJVRSkNCnRhYmxlKHNvY19kZiRkaXYubmV0KQ0KaGlzdChzb2NfZGYkZGl2Lm5ldCwgY29sPSJsaWdodGJsdWUiLCBtYWluPSdSVTogZXRobmljIGRpdmVyc2l0eSBlZ29uZXRzJywgeGxhYj0nUGVyY2VudGFnZSBub24tRHV0Y2ggY29sbGFib3JhdG9ycycpDQpgYGANCmBgYHtyfQ0Kc3VtbWFyeShzb2NfZGYkZGl2LmVnbykNCnRhYmxlKHNvY19kZiRkaXYuZWdvKQ0KDQpgYGANCmBgYHtyfQ0Kc3VtbWFyeShzb2NfZGYkbmF1dGhvcnMpDQpzZChzb2NfZGYkbmF1dGhvcnMsIG5hLnJtPVRSVUUpDQpoaXN0KHNvY19kZiRuYXV0aG9ycywgY29sPSJsaWdodGJsdWUiLCBtYWluPSdSVTogbnVtYmVyIG9mIGNvLWF1dGhvcnMnLCB4bGFiPSdOdW1iZXIgb2YgY28tYXV0aG9ycyBzaW5jZSAyMDE5JykNCg0KYGBgDQpgYGB7cn0NCnN1bW1hcnkoc29jX2RmJHB1Yl9maXJzdCkNCnNkKHNvY19kZiRwdWJfZmlyc3QsIG5hLnJtPVRSVUUpDQpoaXN0KHNvY19kZiRwdWJfZmlyc3QsIGNvbD0ibGlnaHRibHVlIiwgbWFpbj0nUlU6IHllYXIgZmlyc3QgcHVibGljYXRpb24nLCB4bGFiPSdZZWFyIGZpcnN0IHB1YmxpY2F0aW9uJykNCg0KYGBgDQoNCmBgYHtyfQ0KDQp0YWJsZShzb2NfZGYkZ2VuZGVyNCkNCmhpc3Qoc29jX2RmJGdlbmRlcjQsIGNvbD0ibGlnaHRibHVlIikNCg0KYGBgDQoNCiMgZGVncmVlDQojIyBuZXQgMQ0KDQoNCmBgYHtyfQ0KbmV0MSA8LSBuZXRfc29jX2FycmF5WyAsLCAxXQ0KZGlhZyhuZXQxKSA8LSAwDQpkZWdyZWUgPC0gcm93U3VtcyhuZXQxKQ0KaGlzdChkZWdyZWUpDQpzdW1tYXJ5KGRlZ3JlZSkNCnNkKGRlZ3JlZSkNCg0KYGBgDQoNCiMjIG5ldCAyDQpgYGB7cn0NCm5ldDIgPC0gbmV0X3NvY19hcnJheVsgLCwgMl0NCmRpYWcobmV0MikgPC0gMA0KZGVncmVlIDwtIHJvd1N1bXMobmV0MikNCmhpc3QoZGVncmVlKQ0Kc3VtbWFyeShkZWdyZWUpDQpzZChkZWdyZWUpDQoNCmBgYA0KDQoNCiMjIG5ldCAzDQoNCmBgYHtyfQ0KbmV0MyA8LSBuZXRfc29jX2FycmF5WyAsLCAzXQ0KZGlhZyhuZXQzKSA8LSAwDQpkZWdyZWUgPC0gcm93U3VtcyhuZXQzKQ0KaGlzdChkZWdyZWUpDQpzdW1tYXJ5KGRlZ3JlZSkNCnNkKGRlZ3JlZSkNCg0KYGBgDQoNCg0KIyBpZ3JhcGggb2JqZWN0IA0KIyMgbmV0IDENCg0KYGBge3J9DQpuZXQxX2cgPC0gaWdyYXBoOjpncmFwaF9mcm9tX2FkamFjZW5jeV9tYXRyaXgobmV0MSwgbW9kZSA9IGMoInVuZGlyZWN0ZWQiKSkNCnBsb3QobmV0MV9nKQ0KDQppZ3JhcGg6OmRlZ3JlZShuZXQxX2cpDQppZ3JhcGg6OmR5YWQuY2Vuc3VzKG5ldDFfZykNCmlncmFwaDo6dHJpYWQuY2Vuc3VzKG5ldDFfZykNCmlncmFwaDo6ZWRnZV9kZW5zaXR5KG5ldDFfZykNCg0Kc3VtKGlncmFwaDo6ZGVncmVlKG5ldDFfZykpDQoNCmBgYA0KDQojIyBuZXQgMg0KDQpgYGB7cn0NCm5ldDJfZyA8LSBpZ3JhcGg6OmdyYXBoX2Zyb21fYWRqYWNlbmN5X21hdHJpeChuZXQyLCBtb2RlID0gYygidW5kaXJlY3RlZCIpKQ0KcGxvdChuZXQyX2cpDQoNCmlncmFwaDo6ZGVncmVlKG5ldDJfZykNCmlncmFwaDo6ZHlhZC5jZW5zdXMobmV0Ml9nKQ0KaWdyYXBoOjp0cmlhZC5jZW5zdXMobmV0Ml9nKQ0KaWdyYXBoOjplZGdlX2RlbnNpdHkobmV0Ml9nKQ0KDQpzdW0oaWdyYXBoOjpkZWdyZWUobmV0Ml9nKSkNCg0KYGBgDQoNCiMjIG5ldCAzDQpgYGB7cn0NCm5ldDNfZyA8LSBpZ3JhcGg6OmdyYXBoX2Zyb21fYWRqYWNlbmN5X21hdHJpeChuZXQzLCBtb2RlID0gYygidW5kaXJlY3RlZCIpKQ0KcGxvdChuZXQzX2cpDQoNCmlncmFwaDo6ZGVncmVlKG5ldDNfZykNCmlncmFwaDo6ZHlhZC5jZW5zdXMobmV0M19nKQ0KaWdyYXBoOjp0cmlhZC5jZW5zdXMobmV0M19nKQ0KaWdyYXBoOjplZGdlX2RlbnNpdHkobmV0M19nKQ0KDQpzdW0oaWdyYXBoOjpkZWdyZWUobmV0M19nKSkNCg0KYGBgDQojIGRlbnNpdHkNCiMjIG5ldCAxDQpgYGB7cn0NCm5ldF91bmQgPC0gbmV0MSArIHQobmV0MSkNCm5ldF91bmRbbmV0X3VuZD09Ml0gPC0gMQ0KDQpzdW0obmV0X3VuZCwgbmEucm09VFJVRSkNCmZkZW5zaXR5KG5ldDEpDQpgYGANCiMjIG5ldCAyDQpgYGB7cn0NCg0KbmV0X3VuZCA8LSBuZXQyICsgdChuZXQyKQ0KbmV0X3VuZFtuZXRfdW5kPT0yXSA8LSAxDQoNCnN1bShuZXRfdW5kLCBuYS5ybT1UUlVFKQ0KZmRlbnNpdHkobmV0MikNCmBgYA0KIyMgbmV0IDMNCmBgYHtyfQ0KDQpuZXRfdW5kIDwtIG5ldDMgKyB0KG5ldDMpDQpuZXRfdW5kW25ldF91bmQ9PTJdIDwtIDENCg0Kc3VtKG5ldF91bmQsIG5hLnJtPVRSVUUpDQpmZGVuc2l0eShuZXQzKQ0KYGBgDQoNCiMgaW50ZXItL2ludHJhZ3JvdXAgZGVuc2l0eQ0KYGBge3J9DQpkaXZfbSA8LSAgZmhvbW9tYXQoc29jX2RmJGRpdi5lZ28pDQpgYGANCg0KDQpgYGB7cn0NCiMgY2FsY3VsYXRlIGludHJhLS9pbnRlcmdyb3VwIGRlbnNpdHkgZGl2ZXJzaXR5IGVnbw0KZmRlbnNpdHlpbnRyYSh4PW5ldF91bmQsIEE9ZGl2X20pIA0KZmRlbnNpdHlpbnRlcih4PW5ldF91bmQsIEE9ZGl2X20pDQogICAgDQpgYGANCg0KYGBge3J9DQojIGNhbGN1bGF0ZSBpbnRyYS0vaW50ZXJncm91cCBkZW5zaXR5IGdlbmRlcg0KZ2VuZGVyX20gPC0gIGZob21vbWF0KHNvY19kZiRnZW5kZXI0KQ0KZmRlbnNpdHlpbnRyYSh4PW5ldF91bmQsIEE9Z2VuZGVyX20pIA0KZmRlbnNpdHlpbnRlcih4PW5ldF91bmQsIEE9Z2VuZGVyX20pDQogICAgDQpgYGANCg0KDQoNCg==