1 Getting started

To copy the code, click the button in the upper right corner of the code-chunks.

1.1 clean up

rm(list = ls())
gc()


1.2 custom functions

We defined a number custom functions, at Download custom_functions.R.

source("./custom_functions.R")


1.3 necessary packages

  • tidyverse: data wrangling
  • igraph: generate and visualize graphs
  • parallel: parallel computing to speed up simulation
  • foreach: looping in parallel
  • doParallel: parallel backend for foreach
  • ggplot2: data visualization
  • ggh4x: hacks for ggplot2
  • ggpubr: make visualizations publication-ready
packages = c("tidyverse", "igraph", "ggplot2", "parallel", "doParallel", "foreach", "ggh4x", "ggpubr",
    "plotly", "RColorBrewer", "grid", "gridExtra", "patchwork", "ggplotify", "ggraph", "gganimate", "RColorBrewer",
    "ggtext", "magick", "jsonlite", "lubridate", "ggtext")

invisible(fpackage.check(packages))
rm(packages)

2 import data

data <- read.csv("./rawdata/all_apps_wide_2026-03-23.csv")
times <- read.csv("./rawdata/PageTimes-2026-03-23.csv")

# cbind(data$participant.node,data$participant.role)[complete.cases(
# #cbind(data$participant.node,data$participant.role)),]

bonus <- data[, c("participant.bonus", "participant.label")]
bonus <- bonus[!is.na(bonus$participant.bonus), ]
bonus_out <- data.frame(id = bonus$participant.label, bonus = bonus$participant.bonus)
# nrow(bonus_out)
write.table(bonus_out, "bonus.txt", sep = ",", row.names = FALSE, col.names = TRUE, quote = FALSE)

3 results

On 23-03-2026, I recruited 63 Prolific participants via a brief sign-up survey to populate a network of N=50 (with a 10% minority group).

net <- jsonlite::fromJSON("./networks/network_test_n50.json")

g <- graph_from_adjacency_matrix(net$adj_matrix, mode = "undirected")
V(g)$role <- ifelse(net$role_vector == 1, "trendsetter", "conformist")

fplot_graph(g)


3.1 diagnostics

3.1.1 dropout

When did people time out?

dropout_long <- data %>%
    filter(!is.na(participant.node)) %>%
    select(participant.label, participant.role, matches("unpop\\.[0-9]+\\.player\\.is_dropout")) %>%
    pivot_longer(cols = matches("unpop\\.[0-9]+\\.player\\.is_dropout"), names_to = "round", values_to = "is_dropout") %>%
    mutate(round = str_extract(round, "[0-9]+"), round = as.numeric(round))

dropout_df <- dropout_long %>%
    filter(is_dropout == 1) %>%
    select(participant.label, participant.role, round)

ggplot(na.omit(dropout_df), aes(x = round)) + geom_bar()

# number of players that experienced time-outs:
dropout_df %>%
    distinct(participant.label) %>%
    nrow()
#> [1] 6
# players exiting after recurring timeouts:
table(data$participant.exit)
#> 
#>  0 
#> 50

3.2 unpopular norm spread

df_long <- data %>%
  filter(!is.na(participant.node)) %>%
  select(participant.label, participant.role, participant.node, starts_with("unpop.")) %>% #also include network node.
  
  pivot_longer(
    cols = matches("unpop\\.\\d+\\.player\\.choice$"),  # only choice columns
    names_to = "round",
    values_to = "choice"
  ) %>%
  mutate(
    round = as.integer(gsub("unpop\\.(\\d+)\\.player\\.choice", "\\1", round)),
    is_bot = ifelse(participant.label == "", TRUE, FALSE)
  ) %>%
  select(participant.label, participant.node, participant.role, round, choice, is_bot)

# aggregated
df_plot <- df_long %>%
  group_by(round) %>%
  summarise(
    pct_choice1 = mean(choice, na.rm = TRUE) * 100,  # proportion * 100
    n = n()
  )

ggplot(df_plot, aes(x = round, y = pct_choice1)) +
  geom_line(group = 1, color = "steelblue", size = .5) +
  geom_point(color = "steelblue", size = 2) +
   geom_hline(yintercept = 10, linetype = "longdash", color = "darkgrey", size = 0.8) +  # dashed line at 10
  scale_x_continuous(breaks = df_plot$round) +
  scale_y_continuous(limits = c(0, 100)) +  
  labs(
    x = "Round",
    y = "% agents choosing 'blue'",
    title = "Evolution of an unpopular norm"
  )

table(data$survey.1.player.enjoyment)
#> 
#>  2  3  4  5 
#>  1  5 15 12
table(data$survey.1.player.clarity)
#> 
#>  4  5 
#> 11 22
table(data$survey.1.player.majority)
#> 
#>  1  2  3 
#>  9 23  1
fshowdf(unique(data$survey.1.player.strategy))
x
At the start, i choose to follow my neighbors to get the most points possible, then, a neighbor and i started choosing red because the points were higher than 3 blues. (Sadly, in my screen we were only 2 reds and 1 blue)
I followed the majority to accumulate as many points as I can.
Even though I prefer red, I’ll probably pick blue most of the time and not rely on my personal preference.
Herd mentality
My vision of my neighbors and their choices, just as they choose.
“I tried to coordinate my choice with my neighbors. I paid attention to what they chose in previous rounds and followed the majority to maximize my points.
It’s safer to pick red because from the trend, at least one neighbour would always choose red, so I would get at least 43 points instead of risking getting 0 points by going for blue. This is because most times no neighbour would go for blue.
At the beginning, I stuck to my preferred color (Red) because most of my neighbors were doing the same. However, as the rounds progressed, I noticed a clear shift where more neighbors started choosing Blue. To maximize my coordination points, I had to adapt my strategy, ignore my preference, and switch to Blue to match them.
based on the majority choices to double my benefits
My strategy changed during the game. In the first few rounds, I picked Red since it was my preference and the neighbors matched it. But later on, the trend changed and Blue became much more popular among my connections. My main goal was to earn the highest payoff, so I ended up following the crowd and choosing Blue.
remeber what neightbour choise was
I have seen what my neighbours are choosing, and I applied the same strategy.
I observed the patterns and tried to anticipate what the majority might choose.
Following my neighbours.
Alternative method and sequencing
I started with choosing red but switched to blue when I discovered my other group members were going with blue. I had to align.
At first, I was following everyone else. WHen the number of blue tshirts was increasing, I was choosing blue. There was a moment where everyone was choosinbg the blue one. But If everyone got the red, we would get 5 points more. It was risky choosing the red, and everyone knew that. SOme people, like me eventually, tried to pick red and see if the rest could pick it too. But because of fear, they didnt
fix in one color and if true continue as it is , if false change
Picking my color first, then watching what others did. When 4 people chose blue i also swapped because thats more points then staying on red
I bet they will choose blue as well as I do.
I guess choosing my colour most of the time which was red
I just chose the color that the neighbors frequently chose
First 2 or 3 time I choose depend on favorite color but after that I depend on expecting of what my neighbor would choose.
I first chose my prefer color (red) and modified it when one of my neighbours started choosing the other color (blue). My strategy was to keep blue unless they both change to red, as it scored higher two blue than two red.
I tried to maxime my earnings
I selected according to neighbours
First red then i went with my team’s decision.
At first I was looking at the points and then as the game went on I was looking at the choices my neighbours made. It was more of a gut feeling rather than a rational one.
I always choose one color
fshowdf(unique(data$survey.1.player.perceived_rq))
x
How is your decision influenced by your enviorment, the most people choose, the higher is for you to take the same decision.
This experiment is about how people change their opinion according to social trend.
It seems like they’re trying to understand if people stick with their own preference or change it based on what they think others are choosing, especially when they don’t have full information.
The experiment aims to study social coordination and how individuals balance their personal preferences with the choices of their neighbors in a network to maximize rewards.
I’m guessing something related to how people get influenced to follow what other people near them are doing (and I’m assuming the people who favoured red shirts probably had a different scoring scheme that doesn’t just depend on the shirt they chose themselves)
Public taste
The experiment studies how people coordinate decisions in a group and how individuals adapt their choices based on others to maximize rewards
The reasoning behind how people make decisions is to maximize their gains.
I believe it tests peer pressure and group dynamics. Specifically, how financial incentives and the behavior of the majority can force individuals to give up their personal preferences to fit in.
decision making
The study seems to look at how quickly a trend can spread within a network. It asks whether people will stick to what they like or if they will switch to match their neighbors just to earn better rewards.
try to be a group with same choice
about choices and fashion dilema.
I think the experiment was aimed at studying how people make decisions when they know that there is a majority preference.
How other influence our choices.
may be informed learning
The experiment was all about decision making and how one decision influences other decisions.
If we prefered to vote “diferent” and be the one who tries to change the way, even if if you will lose money.
it was about a game to see the similarity of choosing colors
group dynamics
To see if people will take high risk for high reward
Social influence and conformity
Decision making using what you have and following your instinct
which color is dominant?
I think trying to see if most people will stay on their choice or change it according to others.
intuition and risk-based decision making
To see my reaction based on other’s preferences
Groupon choices
peer pressure effect on choices
Decision making
No idea
Maybe the experiment was about seeing if people can be persuaded into choosing something different than what they wanted to, based on other people’s choices.
how a common group can act in order to organize each other
fshowdf(unique(data$survey.1.player.comments))
x
Nothing at all, was a really curious study, i like it!
Nice and interesting experiment
Nothing
Thanks
The experiment was interesting and engaging.
It was an interesting game.
The interface was very smooth, and the game was really engaging. Thanks!
Really interesting study. The instructions were easy to follow and the waiting room mini game was a nice touch.
Everything was fine
Nice study. Kudos to the researchers.
No thanks
The timer felt a bit short in later rounds
It was interesting
It was an interesting game, hope to participate in it again!
LS0tDQp0aXRsZTogIkV4cGVyaW1lbnQiDQpiaWJsaW9ncmFwaHk6IHJlZmVyZW5jZXMuYmliDQpsaW5rLWNpdGF0aW9uczogdHJ1ZQ0KZGF0ZTogIkxhc3QgY29tcGlsZWQgb24gYHIgZm9ybWF0KFN5cy50aW1lKCksICclZC0lbS0lWScpYCINCm91dHB1dDogDQogIGh0bWxfZG9jdW1lbnQ6DQogICAgc2VsZl9jb250YWluZWQ6IHRydWUNCiAgICBjc3M6IHR3ZWFrcy5jc3MNCiAgICB0b2M6IHRydWUNCiAgICB0b2NfZmxvYXQ6IHRydWUNCiAgICBudW1iZXJfc2VjdGlvbnM6IHRydWUNCiAgICB0b2NfZGVwdGg6IDQNCiAgICBjb2RlX2ZvbGRpbmc6IHNob3cNCiAgICBjb2RlX2Rvd25sb2FkOiB5ZXMNCi0tLQ0KDQpgYGB7ciwgZ2xvYmFsc2V0dGluZ3MsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHJlc3VsdHM9J2hpZGUnLCBtZXNzYWdlPUZBTFNFfQ0KbGlicmFyeShrbml0cikNCmxpYnJhcnkodGlkeXZlcnNlKQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFKQ0Kb3B0c19jaHVuayRzZXQodGlkeS5vcHRzPWxpc3Qod2lkdGguY3V0b2ZmPTEwMCksdGlkeT1UUlVFLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSxjb21tZW50ID0gIiM+IiwgY2FjaGU9VFJVRSwgY2xhc3Muc291cmNlPWMoInRlc3QiKSwgY2xhc3Mub3V0cHV0PWMoInRlc3QzIikpDQpvcHRpb25zKHdpZHRoID0gMTAwKQ0KcmdsOjpzZXR1cEtuaXRyKCkNCg0KY29sb3JpemUgPC0gZnVuY3Rpb24oeCwgY29sb3IpIHtzcHJpbnRmKCI8c3BhbiBzdHlsZT0nY29sb3I6ICVzOyc+JXM8L3NwYW4+IiwgY29sb3IsIHgpIH0NCmBgYA0KDQpgYGB7ciBrbGlwcHksIGVjaG89RkFMU0UsIGluY2x1ZGU9VFJVRX0NCmtsaXBweTo6a2xpcHB5KHBvc2l0aW9uID0gYygndG9wJywgJ3JpZ2h0JykpDQoja2xpcHB5OjprbGlwcHkoY29sb3IgPSAnZGFya3JlZCcpDQoja2xpcHB5OjprbGlwcHkodG9vbHRpcF9tZXNzYWdlID0gJ0NsaWNrIHRvIGNvcHknLCB0b29sdGlwX3N1Y2Nlc3MgPSAnRG9uZScpDQpgYGANCg0KLS0tDQoNCiMgR2V0dGluZyBzdGFydGVkDQoNClRvIGNvcHkgdGhlIGNvZGUsIGNsaWNrIHRoZSBidXR0b24gaW4gdGhlIHVwcGVyIHJpZ2h0IGNvcm5lciBvZiB0aGUgY29kZS1jaHVua3MuDQoNCiMjIGNsZWFuIHVwDQoNCmBgYHtyLCBjbGVhbl91cCwgcmVzdWx0cz0naGlkZSd9DQpybShsaXN0PWxzKCkpDQpnYygpDQpgYGANCg0KPGJyPg0KDQojIyBjdXN0b20gZnVuY3Rpb25zDQoNCldlIGRlZmluZWQgYSBudW1iZXIgY3VzdG9tIGZ1bmN0aW9ucywgYXQgYHIgeGZ1bjo6ZW1iZWRfZmlsZSgiLi9jdXN0b21fZnVuY3Rpb25zLlIiKWAuDQoNCmBgYHtyLCBjdXN0b21fZnVuY3Rpb25zfQ0Kc291cmNlKCIuL2N1c3RvbV9mdW5jdGlvbnMuUiIpDQpgYGANCg0KPGJyPg0KDQojIyBuZWNlc3NhcnkgcGFja2FnZXMNCg0KLSBgdGlkeXZlcnNlYDogZGF0YSB3cmFuZ2xpbmcNCi0gYGlncmFwaGA6IGdlbmVyYXRlIGFuZCB2aXN1YWxpemUgZ3JhcGhzDQotIGBwYXJhbGxlbGA6IHBhcmFsbGVsIGNvbXB1dGluZyB0byBzcGVlZCB1cCBzaW11bGF0aW9uDQotIGBmb3JlYWNoYDogbG9vcGluZyBpbiBwYXJhbGxlbA0KLSBgZG9QYXJhbGxlbGA6IHBhcmFsbGVsIGJhY2tlbmQgZm9yIGBmb3JlYWNoYA0KLSBgZ2dwbG90MmA6IGRhdGEgdmlzdWFsaXphdGlvbg0KLSBgZ2doNHhgOiBoYWNrcyBmb3IgYGdncGxvdDJgDQotIGBnZ3B1YnJgOiBtYWtlIHZpc3VhbGl6YXRpb25zIHB1YmxpY2F0aW9uLXJlYWR5DQoNCg0KYGBge3IsIHBhY2thZ2VzfQ0KcGFja2FnZXMgPSBjKCJ0aWR5dmVyc2UiLCAiaWdyYXBoIiwgImdncGxvdDIiLCAicGFyYWxsZWwiLCAiZG9QYXJhbGxlbCIsICJmb3JlYWNoIiwgImdnaDR4IiwgImdncHViciIsICJwbG90bHkiLCAiUkNvbG9yQnJld2VyIiwgImdyaWQiLCAiZ3JpZEV4dHJhIiwgInBhdGNod29yayIsICJnZ3Bsb3RpZnkiLCAiZ2dyYXBoIiwgImdnYW5pbWF0ZSIsICJSQ29sb3JCcmV3ZXIiLA0KICAgICJnZ3RleHQiLCAibWFnaWNrIiwgImpzb25saXRlIiwgImx1YnJpZGF0ZSIsICJnZ3RleHQiKQ0KDQppbnZpc2libGUoZnBhY2thZ2UuY2hlY2socGFja2FnZXMpKQ0Kcm0ocGFja2FnZXMpDQpgYGANCg0KLS0tDQoNCiMgaW1wb3J0IGRhdGENCg0KYGBge3J9DQpkYXRhIDwtIHJlYWQuY3N2KCIuL3Jhd2RhdGEvYWxsX2FwcHNfd2lkZV8yMDI2LTAzLTIzLmNzdiIpDQp0aW1lcyA8LSByZWFkLmNzdigiLi9yYXdkYXRhL1BhZ2VUaW1lcy0yMDI2LTAzLTIzLmNzdiIpDQoNCiNjYmluZChkYXRhJHBhcnRpY2lwYW50Lm5vZGUsZGF0YSRwYXJ0aWNpcGFudC5yb2xlKVtjb21wbGV0ZS5jYXNlcyggI2NiaW5kKGRhdGEkcGFydGljaXBhbnQubm9kZSxkYXRhJHBhcnRpY2lwYW50LnJvbGUpKSxdDQoNCmJvbnVzIDwtIGRhdGFbLCBjKCJwYXJ0aWNpcGFudC5ib251cyIsICJwYXJ0aWNpcGFudC5sYWJlbCIpXQ0KYm9udXMgPC0gYm9udXNbIWlzLm5hKGJvbnVzJHBhcnRpY2lwYW50LmJvbnVzKSwgXQ0KYm9udXNfb3V0IDwtIGRhdGEuZnJhbWUoDQogIGlkID0gYm9udXMkcGFydGljaXBhbnQubGFiZWwsDQogIGJvbnVzID0gYm9udXMkcGFydGljaXBhbnQuYm9udXMNCikNCiNucm93KGJvbnVzX291dCkNCndyaXRlLnRhYmxlKGJvbnVzX291dCwgImJvbnVzLnR4dCIsIHNlcCA9ICIsIiwgcm93Lm5hbWVzID0gRkFMU0UsIGNvbC5uYW1lcyA9IFRSVUUsIHF1b3RlID0gRkFMU0UpDQpgYGANCg0KLS0tDQoNCiMgcmVzdWx0cw0KDQpPbiAyMy0wMy0yMDI2LCBJIHJlY3J1aXRlZCA2MyBQcm9saWZpYyBwYXJ0aWNpcGFudHMgdmlhIGEgYnJpZWYgW3NpZ24tdXAgc3VydmV5XShodHRwczovL2dpdGh1Yi5jb20vVXRyZWNodFVuaXZlcnNpdHkvc2lnbi11cC1leHBlcmltZW50KSB0byBwb3B1bGF0ZSBhIG5ldHdvcmsgb2YgTj01MCAod2l0aCBhIDEwJSBtaW5vcml0eSBncm91cCkuDQoNCg0KYGBge3IsIGNsYXNzLnNvdXJjZSA9ICdmb2xkLWhpZGUnfQ0KbmV0IDwtIGpzb25saXRlOjpmcm9tSlNPTigiLi9uZXR3b3Jrcy9uZXR3b3JrX3Rlc3RfbjUwLmpzb24iKQ0KDQpnIDwtIGdyYXBoX2Zyb21fYWRqYWNlbmN5X21hdHJpeChuZXQkYWRqX21hdHJpeCwgbW9kZSA9ICJ1bmRpcmVjdGVkIikNClYoZykkcm9sZSA8LSBpZmVsc2UobmV0JHJvbGVfdmVjdG9yID09IDEsICJ0cmVuZHNldHRlciIsICJjb25mb3JtaXN0IikNCg0KZnBsb3RfZ3JhcGgoZyApDQpgYGANCg0KDQo8YnI+DQoNCiMjIGRpYWdub3N0aWNzDQoNCg0KIyMjIGRyb3BvdXQNCg0KV2hlbiBkaWQgcGVvcGxlIHRpbWUgb3V0Pw0KDQpgYGB7cn0NCmRyb3BvdXRfbG9uZyA8LSBkYXRhICU+JQ0KICBmaWx0ZXIoIWlzLm5hKHBhcnRpY2lwYW50Lm5vZGUpKSAlPiUNCiAgc2VsZWN0KA0KICAgIHBhcnRpY2lwYW50LmxhYmVsLA0KICAgIHBhcnRpY2lwYW50LnJvbGUsDQogICAgbWF0Y2hlcygidW5wb3BcXC5bMC05XStcXC5wbGF5ZXJcXC5pc19kcm9wb3V0IikNCiAgKSAlPiUNCiAgcGl2b3RfbG9uZ2VyKA0KICAgIGNvbHMgPSBtYXRjaGVzKCJ1bnBvcFxcLlswLTldK1xcLnBsYXllclxcLmlzX2Ryb3BvdXQiKSwNCiAgICBuYW1lc190byA9ICJyb3VuZCIsDQogICAgdmFsdWVzX3RvID0gImlzX2Ryb3BvdXQiDQogICkgJT4lDQogIG11dGF0ZSgNCiAgICByb3VuZCA9IHN0cl9leHRyYWN0KHJvdW5kLCAiWzAtOV0rIiksDQogICAgcm91bmQgPSBhcy5udW1lcmljKHJvdW5kKQ0KICApDQoNCmRyb3BvdXRfZGYgPC0gZHJvcG91dF9sb25nICU+JQ0KICBmaWx0ZXIoaXNfZHJvcG91dCA9PSAxKSAlPiUNCiAgc2VsZWN0KHBhcnRpY2lwYW50LmxhYmVsLCBwYXJ0aWNpcGFudC5yb2xlLCByb3VuZCkNCg0KZ2dwbG90KG5hLm9taXQoZHJvcG91dF9kZiksIGFlcyh4ID0gcm91bmQpKSArDQogIGdlb21fYmFyKCkNCg0KIyBudW1iZXIgb2YgcGxheWVycyB0aGF0IGV4cGVyaWVuY2VkIHRpbWUtb3V0czoNCmRyb3BvdXRfZGYgJT4lDQogIGRpc3RpbmN0KHBhcnRpY2lwYW50LmxhYmVsKSAlPiUNCiAgbnJvdygpDQoNCiMgcGxheWVycyBleGl0aW5nIGFmdGVyIHJlY3VycmluZyB0aW1lb3V0czoNCnRhYmxlKGRhdGEkcGFydGljaXBhbnQuZXhpdCkNCg0KYGBgDQoNCg0KLS0tLQ0KDQoNCiMjIHVucG9wdWxhciBub3JtIHNwcmVhZA0KDQpgYGB7cixjbGFzcy5zb3VyY2UgPSAnZm9sZC1oaWRlJ30NCmRmX2xvbmcgPC0gZGF0YSAlPiUNCiAgZmlsdGVyKCFpcy5uYShwYXJ0aWNpcGFudC5ub2RlKSkgJT4lDQogIHNlbGVjdChwYXJ0aWNpcGFudC5sYWJlbCwgcGFydGljaXBhbnQucm9sZSwgcGFydGljaXBhbnQubm9kZSwgc3RhcnRzX3dpdGgoInVucG9wLiIpKSAlPiUgI2Fsc28gaW5jbHVkZSBuZXR3b3JrIG5vZGUuDQogIA0KICBwaXZvdF9sb25nZXIoDQogICAgY29scyA9IG1hdGNoZXMoInVucG9wXFwuXFxkK1xcLnBsYXllclxcLmNob2ljZSQiKSwgICMgb25seSBjaG9pY2UgY29sdW1ucw0KICAgIG5hbWVzX3RvID0gInJvdW5kIiwNCiAgICB2YWx1ZXNfdG8gPSAiY2hvaWNlIg0KICApICU+JQ0KICBtdXRhdGUoDQogICAgcm91bmQgPSBhcy5pbnRlZ2VyKGdzdWIoInVucG9wXFwuKFxcZCspXFwucGxheWVyXFwuY2hvaWNlIiwgIlxcMSIsIHJvdW5kKSksDQogICAgaXNfYm90ID0gaWZlbHNlKHBhcnRpY2lwYW50LmxhYmVsID09ICIiLCBUUlVFLCBGQUxTRSkNCiAgKSAlPiUNCiAgc2VsZWN0KHBhcnRpY2lwYW50LmxhYmVsLCBwYXJ0aWNpcGFudC5ub2RlLCBwYXJ0aWNpcGFudC5yb2xlLCByb3VuZCwgY2hvaWNlLCBpc19ib3QpDQoNCiMgYWdncmVnYXRlZA0KZGZfcGxvdCA8LSBkZl9sb25nICU+JQ0KICBncm91cF9ieShyb3VuZCkgJT4lDQogIHN1bW1hcmlzZSgNCiAgICBwY3RfY2hvaWNlMSA9IG1lYW4oY2hvaWNlLCBuYS5ybSA9IFRSVUUpICogMTAwLCAgIyBwcm9wb3J0aW9uICogMTAwDQogICAgbiA9IG4oKQ0KICApDQoNCmdncGxvdChkZl9wbG90LCBhZXMoeCA9IHJvdW5kLCB5ID0gcGN0X2Nob2ljZTEpKSArDQogIGdlb21fbGluZShncm91cCA9IDEsIGNvbG9yID0gInN0ZWVsYmx1ZSIsIHNpemUgPSAuNSkgKw0KICBnZW9tX3BvaW50KGNvbG9yID0gInN0ZWVsYmx1ZSIsIHNpemUgPSAyKSArDQogICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAxMCwgbGluZXR5cGUgPSAibG9uZ2Rhc2giLCBjb2xvciA9ICJkYXJrZ3JleSIsIHNpemUgPSAwLjgpICsgICMgZGFzaGVkIGxpbmUgYXQgMTANCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IGRmX3Bsb3Qkcm91bmQpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoMCwgMTAwKSkgKyAgDQogIGxhYnMoDQogICAgeCA9ICJSb3VuZCIsDQogICAgeSA9ICIlIGFnZW50cyBjaG9vc2luZyAnYmx1ZSciLA0KICAgIHRpdGxlID0gIkV2b2x1dGlvbiBvZiBhbiB1bnBvcHVsYXIgbm9ybSINCiAgKQ0KYGBgDQoNCg0KYGBge3J9DQp0YWJsZShkYXRhJHN1cnZleS4xLnBsYXllci5lbmpveW1lbnQpDQp0YWJsZShkYXRhJHN1cnZleS4xLnBsYXllci5jbGFyaXR5KQ0KdGFibGUoZGF0YSRzdXJ2ZXkuMS5wbGF5ZXIubWFqb3JpdHkpDQpmc2hvd2RmKHVuaXF1ZShkYXRhJHN1cnZleS4xLnBsYXllci5zdHJhdGVneSkpDQpmc2hvd2RmKHVuaXF1ZShkYXRhJHN1cnZleS4xLnBsYXllci5wZXJjZWl2ZWRfcnEpKQ0KZnNob3dkZih1bmlxdWUoZGF0YSRzdXJ2ZXkuMS5wbGF5ZXIuY29tbWVudHMpKQ0KYGBgDQo=


Copyright © Rob Franken