RQ1

Absolute output

years <- tibble(year = 1600:1700) %>%
  copy_to_a(con)

years %>% 
  transmute(m=year,b=year-5,e=year+5) %>%
  left_join(fbs_metadata_a %>% 
    count(year=Estimated_admission_year), join_by(b<=year,e>=year)) %>%
  group_by(m) %>%
  summarise(mn=mean(n),.groups="drop") %>%
  transmute(year=m,n=mn,set="Member inductments 10 year rolling mean") %>%
  union_all(years %>% left_join(fbs_metadata_a %>% 
              count(year=Estimated_admission_year) %>%
              mutate(set="Member inductments"))) %>%
  union_all(years %>% inner_join(fbs_metadata_a, join_by(year>=Estimated_admission_year,year<=Estimated_DOD)) %>%
              count(year) %>%
              mutate(set="Active members")) %>%
  union_all(years %>% left_join(fbs_records_a %>%
    inner_join(vd17_id_a, join_by(vd17_id)) %>%
    inner_join(vd17_normalized_years_a, join_by(record_number)) %>%
    count(year=normalized_year, set))) %>%
  union_all(years %>% left_join(vd17_normalized_years_a %>%
    count(year=normalized_year) %>%
    mutate(set = "VD17"))) %>%
  mutate(graph=case_when(
    str_detect(set,"^Member inductments") ~ "Member inductments",
    set=="Active members" ~ "Active members",
    set=="VD17" ~ "VD17",
    str_detect(set,"^Active") ~ "Active member publications",
    T ~ "Member publications"
  )) %>%
  filter(year > 1600, year < 1700) %>%
  arrange(desc(set)) %>%
  collect() %>%
  mutate(graph=fct_relevel(graph,"VD17","Active member publications","Member publications", "Active members", "Member inductments")) %>%
  ggplot(aes(x = year, y = n, color = set)) +
  geom_point() +
  scale_x_continuous(breaks = seq(1600, 1700, by = 10)) +
  theme_hsci_discrete() +
  theme(legend.justification = c(1, 0), legend.position = c(0.98, -0.06), legend.background = element_blank(), legend.box.just = "bottom", legend.key = element_blank(), legend.box = "horizontal") +
  facet_wrap(~ graph, scales = "free_y", ncol = 2)
Joining with `by = join_by(year)`Joining with `by = join_by(year)`Joining with `by = join_by(year)`

years %>% left_join(fbs_metadata_a, join_by(year>=Estimated_admission_year,year<=Estimated_DOD)) %>%
              count(year,name="members") %>%
  replace_na(list(members=0)) %>%
  inner_join(years %>% left_join(fbs_records_a %>%
                                  filter(str_detect(set,"^Active")) %>%
    inner_join(vd17_id_a, join_by(vd17_id)) %>%
    inner_join(vd17_normalized_years_a, join_by(record_number)) %>%
    count(year=normalized_year, set))) %>%
  filter(year > 1600, year < 1700) %>%
  ggplot(aes(x = year, y = n/members, color = set)) +
  geom_point() +
  scale_x_continuous(breaks = seq(1600, 1700, by = 10)) +
  theme_hsci_discrete() +
  theme(legend.position = "bottom")

years %>% left_join(fbs_metadata_a %>% inner_join(fbs_links_of_interest_a %>% distinct(member_number)), join_by(year>=Estimated_admission_year,year<=Estimated_DOD)) %>%
              count(year,name="members") %>%
  replace_na(list(members=0)) %>%
  inner_join(years %>% left_join(fbs_records_a %>%
                                  filter(str_detect(set,"^Active")) %>%
    inner_join(vd17_id_a, join_by(vd17_id)) %>%
    inner_join(vd17_normalized_years_a, join_by(record_number)) %>%
    count(year=normalized_year, set))) %>%
  filter(year > 1600, year < 1700) %>%
  ggplot(aes(x = year, y = n/members, color = set)) +
  geom_point() +
  scale_x_continuous(breaks = seq(1600, 1700, by = 10)) +
  theme_hsci_discrete() +
  theme(legend.position = "bottom")

years %>% left_join(fbs_metadata_a %>% inner_join(fbs_links_of_interest_a %>% distinct(member_number)), join_by(year>=Estimated_admission_year,year<=Estimated_DOD)) %>% 
  count(year) %>%
  mutate(set="Active members associated with publishing") %>%
  union_all(
    years %>% left_join(fbs_metadata_a, join_by(year>=Estimated_admission_year,year<=Estimated_DOD)) %>% 
    count(year) %>%
    mutate(set="Active members")
  ) %>%
  filter(year > 1600, year < 1700) %>%
  ggplot(aes(x = year, y = n, color = set)) +
  geom_point() +
  scale_x_continuous(breaks = seq(1600, 1700, by = 10)) +
  theme_hsci_discrete() +
  theme(legend.position = "bottom")

years %>% left_join(fbs_metadata_a, join_by(year>=Estimated_admission_year,year<=Estimated_DOD)) %>%
              count(year) %>%
              mutate(set="Active members") %>%
  union_all(years %>% left_join(fbs_records_a %>%
                                  filter(str_detect(set,"^Active")) %>%
    inner_join(vd17_id_a, join_by(vd17_id)) %>%
    inner_join(vd17_normalized_years_a, join_by(record_number)) %>%
    count(year=normalized_year, set))) %>%
  filter(year > 1600, year < 1700) %>%
  ggplot(aes(x = year, y = n, color = set)) +
  geom_point() +
  scale_x_continuous(breaks = seq(1600, 1700, by = 10)) +
  theme_hsci_discrete() +
  theme(legend.position = "bottom")
Error in UseMethod("left_join") : 
  no applicable method for 'left_join' applied to an object of class "function"
fbs_records_a %>%
    filter(str_detect(set,"^Active")) %>%
    inner_join(vd17_id_a, join_by(vd17_id)) %>%
    inner_join(vd17_normalized_years_a, join_by(record_number)) %>%
  left_join(vd17_genres_a, join_by(record_number)) %>%
  left_join(vd17_genre_categorisation_a) %>%
    count(year=normalized_year, group_1, set) %>%
  ggplot(aes(x=year,y=n,color=group_1)) +
  geom_point() +
  scale_x_continuous(breaks = seq(1600, 1700, by = 10)) +
  theme_hsci_discrete() +
  theme(legend.position = "bottom") +
  facet_wrap(~set)

years %>% 
  transmute(m=year,b=year-2,e=year+2) %>%
  inner_join(
    fbs_records_a %>%
      filter(set=="Active member substantive role and society purpose related") %>%
      inner_join(vd17_id_a, join_by(vd17_id)) %>%
      inner_join(vd17_genres_a, join_by(record_number)) %>%
      inner_join(vd17_normalized_years_a, join_by(record_number)) %>%    
      left_join(vd17_genre_categorisation_a) %>%
      count(year=normalized_year, group_1, group_3, set) %>%
      filter(group_1=="Society-related"), join_by(b<=year,e>=year)
  ) %>%
  group_by(m,group_3) %>%
  summarise(mn=mean(n),.groups="drop") %>%
  collect() %>%
  mutate(group_3=fct_lump_n(group_3,n=8,w=mn)) %>%
  ggplot(aes(x=m,y=mn,color=group_3)) +
  geom_point() +
  scale_x_continuous(breaks = seq(1600, 1700, by = 10)) +
  theme_hsci_discrete()

RQ2

Original language of society-linked translations

vd17_normalized_langs_a %>% 
  filter(!is.na(original_language)) %>% 
  inner_join(fbs_records_a %>% inner_join(vd17_id_a)) %>% 
  count(original_language, set) %>% 
  arrange(set,desc(n)) %>%
  ggplot(aes(x=original_language,y=n)) + 
  geom_col() +
  theme_hsci_discrete() +
  coord_flip() +
  facet_wrap(~set,scales="free_x")
Joining with `by = join_by(vd17_id)`Joining with `by = join_by(record_number)`

#  gt(rowname_col="original_language", groupname_col = "set") %>%
#  fmt_integer(n)
vd17_normalized_langs_a %>% 
  filter(!is.na(original_language)) %>% 
  inner_join(fbs_records_a %>% inner_join(vd17_id_a)) %>% 
  left_join(vd17_genres_a %>% inner_join(vd17_genre_categorisation_a), join_by(record_number)) %>%
  count(group_3, set) %>% 
  arrange(set,desc(n)) %>%
  ggplot(aes(x=group_3,y=n)) + 
  geom_col() +
  theme_hsci_discrete() +
  coord_flip() +
  facet_wrap(~set,scales="free_x")
Joining with `by = join_by(vd17_id)`Joining with `by = join_by(record_number)`Joining with `by = join_by(genre)`

#  gt(rowname_col="original_language", groupname_col = "set") %>%
#  fmt_integer(n)

RQ 3

fbs_records_a %>% 
  filter(set=="Active member substantive role") %>%
  inner_join(vd17_id_a) %>%
  left_join(all_printers %>% inner_join(vd17_auth_id_a %>% inner_join(vd17_auth_name_a), join_by(printer_gnd==GND))) %>%
  count(unified_name, set) %>% 
  arrange(set,desc(n)) %>%
  collect() %>%
  mutate(unified_name=fct_lump_n(unified_name,n=30,w=n)) %>%
  filter(!is.na(unified_name),unified_name!="Other") %>%
  ggplot(aes(x=unified_name,y=n)) + 
  geom_col() +
  theme_hsci_discrete() +
  coord_flip() +
  facet_wrap(~set,scales="free_x")
Joining with `by = join_by(vd17_id)`Error: object 'all_printers' not found
years %>% 
  transmute(m=year,b=year-5,e=year+5) %>%
  left_join(
    fbs_records_a %>% 
      filter(set=="Active member substantive role") %>%
      inner_join(vd17_id_a) %>%
      left_join(unified_places_of_publication) %>%
      left_join(vd17_normalized_years_a) %>%
      count(normalized_year,place_of_publication, set),
    join_by(b<=normalized_year,e>=normalized_year)
  ) %>%
  replace_na(list(n=0)) %>%
#  complete(m,set,place_of_publication,fill=list(n=0)) %>%
  group_by(m,place_of_publication) %>% 
  summarise(n=sum(n),.groups="drop") %>%
  collect() %>%
  mutate(place_of_publication=fct_lump_n(place_of_publication,n=10,w=n)) %>%
  ggplot(aes(x=m,y=n,color=place_of_publication)) + 
  geom_point() +
  theme_hsci_discrete()
Joining with `by = join_by(vd17_id)`Joining with `by = join_by(record_number)`Joining with `by = join_by(record_number)`

RQ4

fbs_records_a %>% 
  inner_join(vd17_id_a) %>% 
  inner_join(vd17_person_links_a %>% 
              filter(role=="dte"), join_by(record_number)) %>%
  count(combined_name, set) %>% 
  arrange(set,desc(n)) %>%
  collect() %>%
  group_by(set) %>%
  mutate(combined_name=fct_lump_n(combined_name,n=10,w=n)) %>%
  ungroup() %>%
  filter(combined_name!="Other") %>%
  ggplot(aes(x=combined_name,y=n)) + 
  geom_col() +
  theme_hsci_discrete() +
  coord_flip() +
  facet_wrap(~set,scales="free",ncol=1)
Joining with `by = join_by(vd17_id)`

Misc

fbs_metadata_a %>%
  mutate(active_time = as.integer(Estimated_DOD) - as.integer(Estimated_admission_year)) %>%
  filter(active_time >= 0) %>%
  ggplot(aes(x = 1, y = active_time)) +
  geom_quasirandom() +
  theme_hsci_discrete()

fbs_links_of_interest_a %>%
  left_join(vd17_normalized_years_a, join_by(record_number)) %>%
  group_by(member_number) %>%
  summarise(earliest_year = min(normalized_year), latest_year = max(normalized_year)) %>%
  mutate(active_time = latest_year - earliest_year) %>%
  ggplot(aes(x = 1, y = active_time)) +
  geom_quasirandom() +
  theme_hsci_discrete()

years <- tibble(year = 1600:1700) %>%
  copy_to_a(con)

members_through_time <- seq(20, 60, by = 10) %>%
  map(~ years %>%
    inner_join(fbs_metadata_a %>% mutate(Estimated_admission_year = as.integer(Estimated_admission_year), latest_year = as.integer(Estimated_admission_year) + .x), join_by(year >= Estimated_admission_year, year <= latest_year)) %>%
    count(year) %>%
    mutate(set = .x)) %>%
  reduce(union_all)
members_through_time %>%
  ggplot(aes(x = year, y = n, color = as.character(set))) +
  geom_point() +
  theme_hsci_discrete()

fbs_records_a %>%
  inner_join(vd17_id_a, join_by(vd17_id)) %>%
  inner_join(vd17_normalized_years_a, join_by(record_number)) %>%
  count(normalized_year, set) %>%
  inner_join(members_through_time %>% rename(normalized_year = year, members = n, memberset = set)) %>%
  filter(normalized_year > 1630, normalized_year < 1680) %>%
  ggplot(aes(x = normalized_year, y = n / members, color = set)) +
  geom_point(size = 0.5) +
  scale_x_continuous(breaks = seq(1600, 1700, by = 10)) +
  theme_hsci_discrete() +
  facet_wrap(~memberset) +
  theme(legend.position = "bottom")
Error: object 'members_through_time' not found
LS0tCnRpdGxlOiAiRkJTIGFuYWx5c2VzIgpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazoKICAgIGNvZGVfZm9sZGluZzogaGlkZQogICAgdG9jOiB5ZXMKICBtZF9kb2N1bWVudDoKICAgIHZhcmlhbnQ6IGdmbQogICAgdG9jOiB5ZXMKLS0tCgpgYGB7ciBzZXR1cCxlY2hvPUZ9CmtuaXRyOjpvcHRzX2NodW5rJHNldChtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgZHBpID0gMzAwLCBmaWcucmV0aW5hID0gMiwgZmlnLndpZHRoID0gOCkKc291cmNlKGhlcmU6OmhlcmUoInNyYy9jb21tb25fYmFzaXMuUiIpKQpgYGAKCiMgUlExCgojIyBBYnNvbHV0ZSBvdXRwdXQKCmBgYHtyLGZpZy5oZWlnaHQ9OH0KeWVhcnMgPC0gdGliYmxlKHllYXIgPSAxNjAwOjE3MDApICU+JQogIGNvcHlfdG9fYShjb24pCgp5ZWFycyAlPiUgCiAgdHJhbnNtdXRlKG09eWVhcixiPXllYXItNSxlPXllYXIrNSkgJT4lCiAgbGVmdF9qb2luKGZic19tZXRhZGF0YV9hICU+JSAKICAgIGNvdW50KHllYXI9RXN0aW1hdGVkX2FkbWlzc2lvbl95ZWFyKSwgam9pbl9ieShiPD15ZWFyLGU+PXllYXIpKSAlPiUKICBncm91cF9ieShtKSAlPiUKICBzdW1tYXJpc2UobW49bWVhbihuKSwuZ3JvdXBzPSJkcm9wIikgJT4lCiAgdHJhbnNtdXRlKHllYXI9bSxuPW1uLHNldD0iTWVtYmVyIGluZHVjdG1lbnRzIDEwIHllYXIgcm9sbGluZyBtZWFuIikgJT4lCiAgdW5pb25fYWxsKHllYXJzICU+JSBsZWZ0X2pvaW4oZmJzX21ldGFkYXRhX2EgJT4lIAogICAgICAgICAgICAgIGNvdW50KHllYXI9RXN0aW1hdGVkX2FkbWlzc2lvbl95ZWFyKSAlPiUKICAgICAgICAgICAgICBtdXRhdGUoc2V0PSJNZW1iZXIgaW5kdWN0bWVudHMiKSkpICU+JQogIHVuaW9uX2FsbCh5ZWFycyAlPiUgaW5uZXJfam9pbihmYnNfbWV0YWRhdGFfYSwgam9pbl9ieSh5ZWFyPj1Fc3RpbWF0ZWRfYWRtaXNzaW9uX3llYXIseWVhcjw9RXN0aW1hdGVkX0RPRCkpICU+JQogICAgICAgICAgICAgIGNvdW50KHllYXIpICU+JQogICAgICAgICAgICAgIG11dGF0ZShzZXQ9IkFjdGl2ZSBtZW1iZXJzIikpICU+JQogIHVuaW9uX2FsbCh5ZWFycyAlPiUgbGVmdF9qb2luKGZic19yZWNvcmRzX2EgJT4lCiAgICBpbm5lcl9qb2luKHZkMTdfaWRfYSwgam9pbl9ieSh2ZDE3X2lkKSkgJT4lCiAgICBpbm5lcl9qb2luKHZkMTdfbm9ybWFsaXplZF95ZWFyc19hLCBqb2luX2J5KHJlY29yZF9udW1iZXIpKSAlPiUKICAgIGNvdW50KHllYXI9bm9ybWFsaXplZF95ZWFyLCBzZXQpKSkgJT4lCiAgdW5pb25fYWxsKHllYXJzICU+JSBsZWZ0X2pvaW4odmQxN19ub3JtYWxpemVkX3llYXJzX2EgJT4lCiAgICBjb3VudCh5ZWFyPW5vcm1hbGl6ZWRfeWVhcikgJT4lCiAgICBtdXRhdGUoc2V0ID0gIlZEMTciKSkpICU+JQogIG11dGF0ZShncmFwaD1jYXNlX3doZW4oCiAgICBzdHJfZGV0ZWN0KHNldCwiXk1lbWJlciBpbmR1Y3RtZW50cyIpIH4gIk1lbWJlciBpbmR1Y3RtZW50cyIsCiAgICBzZXQ9PSJBY3RpdmUgbWVtYmVycyIgfiAiQWN0aXZlIG1lbWJlcnMiLAogICAgc2V0PT0iVkQxNyIgfiAiVkQxNyIsCiAgICBzdHJfZGV0ZWN0KHNldCwiXkFjdGl2ZSIpIH4gIkFjdGl2ZSBtZW1iZXIgcHVibGljYXRpb25zIiwKICAgIFQgfiAiTWVtYmVyIHB1YmxpY2F0aW9ucyIKICApKSAlPiUKICBmaWx0ZXIoeWVhciA+IDE2MDAsIHllYXIgPCAxNzAwKSAlPiUKICBhcnJhbmdlKGRlc2Moc2V0KSkgJT4lCiAgY29sbGVjdCgpICU+JQogIG11dGF0ZShncmFwaD1mY3RfcmVsZXZlbChncmFwaCwiVkQxNyIsIkFjdGl2ZSBtZW1iZXIgcHVibGljYXRpb25zIiwiTWVtYmVyIHB1YmxpY2F0aW9ucyIsICJBY3RpdmUgbWVtYmVycyIsICJNZW1iZXIgaW5kdWN0bWVudHMiKSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0geWVhciwgeSA9IG4sIGNvbG9yID0gc2V0KSkgKwogIGdlb21fcG9pbnQoKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgxNjAwLCAxNzAwLCBieSA9IDEwKSkgKwogIHRoZW1lX2hzY2lfZGlzY3JldGUoKSArCiAgdGhlbWUobGVnZW5kLmp1c3RpZmljYXRpb24gPSBjKDEsIDApLCBsZWdlbmQucG9zaXRpb24gPSBjKDAuOTgsIC0wLjA2KSwgbGVnZW5kLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksIGxlZ2VuZC5ib3guanVzdCA9ICJib3R0b20iLCBsZWdlbmQua2V5ID0gZWxlbWVudF9ibGFuaygpLCBsZWdlbmQuYm94ID0gImhvcml6b250YWwiKSArCiAgZmFjZXRfd3JhcCh+IGdyYXBoLCBzY2FsZXMgPSAiZnJlZV95IiwgbmNvbCA9IDIpCmBgYAoKYGBge3IsZmlnLmhlaWdodD01fQp5ZWFycyAlPiUgbGVmdF9qb2luKGZic19tZXRhZGF0YV9hLCBqb2luX2J5KHllYXI+PUVzdGltYXRlZF9hZG1pc3Npb25feWVhcix5ZWFyPD1Fc3RpbWF0ZWRfRE9EKSkgJT4lCiAgICAgICAgICAgICAgY291bnQoeWVhcixuYW1lPSJtZW1iZXJzIikgJT4lCiAgcmVwbGFjZV9uYShsaXN0KG1lbWJlcnM9MCkpICU+JQogIGlubmVyX2pvaW4oeWVhcnMgJT4lIGxlZnRfam9pbihmYnNfcmVjb3Jkc19hICU+JQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKHN0cl9kZXRlY3Qoc2V0LCJeQWN0aXZlIikpICU+JQogICAgaW5uZXJfam9pbih2ZDE3X2lkX2EsIGpvaW5fYnkodmQxN19pZCkpICU+JQogICAgaW5uZXJfam9pbih2ZDE3X25vcm1hbGl6ZWRfeWVhcnNfYSwgam9pbl9ieShyZWNvcmRfbnVtYmVyKSkgJT4lCiAgICBjb3VudCh5ZWFyPW5vcm1hbGl6ZWRfeWVhciwgc2V0KSkpICU+JQogIGZpbHRlcih5ZWFyID4gMTYwMCwgeWVhciA8IDE3MDApICU+JQogIGdncGxvdChhZXMoeCA9IHllYXIsIHkgPSBuL21lbWJlcnMsIGNvbG9yID0gc2V0KSkgKwogIGdlb21fcG9pbnQoKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgxNjAwLCAxNzAwLCBieSA9IDEwKSkgKwogIHRoZW1lX2hzY2lfZGlzY3JldGUoKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpCmBgYAoKYGBge3IsZmlnLmhlaWdodD01fQp5ZWFycyAlPiUgbGVmdF9qb2luKGZic19tZXRhZGF0YV9hICU+JSBpbm5lcl9qb2luKGZic19saW5rc19vZl9pbnRlcmVzdF9hICU+JSBkaXN0aW5jdChtZW1iZXJfbnVtYmVyKSksIGpvaW5fYnkoeWVhcj49RXN0aW1hdGVkX2FkbWlzc2lvbl95ZWFyLHllYXI8PUVzdGltYXRlZF9ET0QpKSAlPiUKICAgICAgICAgICAgICBjb3VudCh5ZWFyLG5hbWU9Im1lbWJlcnMiKSAlPiUKICByZXBsYWNlX25hKGxpc3QobWVtYmVycz0wKSkgJT4lCiAgaW5uZXJfam9pbih5ZWFycyAlPiUgbGVmdF9qb2luKGZic19yZWNvcmRzX2EgJT4lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoc3RyX2RldGVjdChzZXQsIl5BY3RpdmUiKSkgJT4lCiAgICBpbm5lcl9qb2luKHZkMTdfaWRfYSwgam9pbl9ieSh2ZDE3X2lkKSkgJT4lCiAgICBpbm5lcl9qb2luKHZkMTdfbm9ybWFsaXplZF95ZWFyc19hLCBqb2luX2J5KHJlY29yZF9udW1iZXIpKSAlPiUKICAgIGNvdW50KHllYXI9bm9ybWFsaXplZF95ZWFyLCBzZXQpKSkgJT4lCiAgZmlsdGVyKHllYXIgPiAxNjAwLCB5ZWFyIDwgMTcwMCkgJT4lCiAgZ2dwbG90KGFlcyh4ID0geWVhciwgeSA9IG4vbWVtYmVycywgY29sb3IgPSBzZXQpKSArCiAgZ2VvbV9wb2ludCgpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDE2MDAsIDE3MDAsIGJ5ID0gMTApKSArCiAgdGhlbWVfaHNjaV9kaXNjcmV0ZSgpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikKYGBgCgpgYGB7cn0KeWVhcnMgJT4lIGxlZnRfam9pbihmYnNfbWV0YWRhdGFfYSAlPiUgaW5uZXJfam9pbihmYnNfbGlua3Nfb2ZfaW50ZXJlc3RfYSAlPiUgZGlzdGluY3QobWVtYmVyX251bWJlcikpLCBqb2luX2J5KHllYXI+PUVzdGltYXRlZF9hZG1pc3Npb25feWVhcix5ZWFyPD1Fc3RpbWF0ZWRfRE9EKSkgJT4lIAogIGNvdW50KHllYXIpICU+JQogIG11dGF0ZShzZXQ9IkFjdGl2ZSBtZW1iZXJzIGFzc29jaWF0ZWQgd2l0aCBwdWJsaXNoaW5nIikgJT4lCiAgdW5pb25fYWxsKAogICAgeWVhcnMgJT4lIGxlZnRfam9pbihmYnNfbWV0YWRhdGFfYSwgam9pbl9ieSh5ZWFyPj1Fc3RpbWF0ZWRfYWRtaXNzaW9uX3llYXIseWVhcjw9RXN0aW1hdGVkX0RPRCkpICU+JSAKICAgIGNvdW50KHllYXIpICU+JQogICAgbXV0YXRlKHNldD0iQWN0aXZlIG1lbWJlcnMiKQogICkgJT4lCiAgZmlsdGVyKHllYXIgPiAxNjAwLCB5ZWFyIDwgMTcwMCkgJT4lCiAgZ2dwbG90KGFlcyh4ID0geWVhciwgeSA9IG4sIGNvbG9yID0gc2V0KSkgKwogIGdlb21fcG9pbnQoKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgxNjAwLCAxNzAwLCBieSA9IDEwKSkgKwogIHRoZW1lX2hzY2lfZGlzY3JldGUoKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpCmBgYAoKCmBgYHtyLGZpZy5oZWlnaHQ9NX0KeWVhcnMgJT4lIGxlZnRfam9pbihmYnNfbWV0YWRhdGFfYSwgam9pbl9ieSh5ZWFyPj1Fc3RpbWF0ZWRfYWRtaXNzaW9uX3llYXIseWVhcjw9RXN0aW1hdGVkX0RPRCkpICU+JQogICAgICAgICAgICAgIGNvdW50KHllYXIpICU+JQogICAgICAgICAgICAgIG11dGF0ZShzZXQ9IkFjdGl2ZSBtZW1iZXJzIikgJT4lCiAgdW5pb25fYWxsKHllYXJzICU+JSBsZWZ0X2pvaW4oZmJzX3JlY29yZHNfYSAlPiUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcihzdHJfZGV0ZWN0KHNldCwiXkFjdGl2ZSIpKSAlPiUKICAgIGlubmVyX2pvaW4odmQxN19pZF9hLCBqb2luX2J5KHZkMTdfaWQpKSAlPiUKICAgIGlubmVyX2pvaW4odmQxN19ub3JtYWxpemVkX3llYXJzX2EsIGpvaW5fYnkocmVjb3JkX251bWJlcikpICU+JQogICAgY291bnQoeWVhcj1ub3JtYWxpemVkX3llYXIsIHNldCkpKSAlPiUKICBmaWx0ZXIoeWVhciA+IDE2MDAsIHllYXIgPCAxNzAwKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSB5ZWFyLCB5ID0gbiwgY29sb3IgPSBzZXQpKSArCiAgZ2VvbV9wb2ludCgpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDE2MDAsIDE3MDAsIGJ5ID0gMTApKSArCiAgdGhlbWVfaHNjaV9kaXNjcmV0ZSgpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikKYGBgCgpgYGB7cn0KZmJzX3JlY29yZHNfYSAlPiUKICAgIGZpbHRlcihzdHJfZGV0ZWN0KHNldCwiXkFjdGl2ZSIpKSAlPiUKICAgIGlubmVyX2pvaW4odmQxN19pZF9hLCBqb2luX2J5KHZkMTdfaWQpKSAlPiUKICAgIGlubmVyX2pvaW4odmQxN19ub3JtYWxpemVkX3llYXJzX2EsIGpvaW5fYnkocmVjb3JkX251bWJlcikpICU+JQogIGxlZnRfam9pbih2ZDE3X2dlbnJlc19hLCBqb2luX2J5KHJlY29yZF9udW1iZXIpKSAlPiUKICBsZWZ0X2pvaW4odmQxN19nZW5yZV9jYXRlZ29yaXNhdGlvbl9hKSAlPiUKICAgIGNvdW50KHllYXI9bm9ybWFsaXplZF95ZWFyLCBncm91cF8xLCBzZXQpICU+JQogIGdncGxvdChhZXMoeD15ZWFyLHk9bixjb2xvcj1ncm91cF8xKSkgKwogIGdlb21fcG9pbnQoKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgxNjAwLCAxNzAwLCBieSA9IDEwKSkgKwogIHRoZW1lX2hzY2lfZGlzY3JldGUoKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpICsKICBmYWNldF93cmFwKH5zZXQpCmBgYAoKYGBge3J9CnllYXJzICU+JSAKICB0cmFuc211dGUobT15ZWFyLGI9eWVhci0yLGU9eWVhcisyKSAlPiUKICBpbm5lcl9qb2luKAogICAgZmJzX3JlY29yZHNfYSAlPiUKICAgICAgZmlsdGVyKHNldD09IkFjdGl2ZSBtZW1iZXIgc3Vic3RhbnRpdmUgcm9sZSBhbmQgc29jaWV0eSBwdXJwb3NlIHJlbGF0ZWQiKSAlPiUKICAgICAgaW5uZXJfam9pbih2ZDE3X2lkX2EsIGpvaW5fYnkodmQxN19pZCkpICU+JQogICAgICBpbm5lcl9qb2luKHZkMTdfZ2VucmVzX2EsIGpvaW5fYnkocmVjb3JkX251bWJlcikpICU+JQogICAgICBpbm5lcl9qb2luKHZkMTdfbm9ybWFsaXplZF95ZWFyc19hLCBqb2luX2J5KHJlY29yZF9udW1iZXIpKSAlPiUgICAgCiAgICAgIGxlZnRfam9pbih2ZDE3X2dlbnJlX2NhdGVnb3Jpc2F0aW9uX2EpICU+JQogICAgICBjb3VudCh5ZWFyPW5vcm1hbGl6ZWRfeWVhciwgZ3JvdXBfMSwgZ3JvdXBfMywgc2V0KSAlPiUKICAgICAgZmlsdGVyKGdyb3VwXzE9PSJTb2NpZXR5LXJlbGF0ZWQiKSwgam9pbl9ieShiPD15ZWFyLGU+PXllYXIpCiAgKSAlPiUKICBncm91cF9ieShtLGdyb3VwXzMpICU+JQogIHN1bW1hcmlzZShtbj1tZWFuKG4pLC5ncm91cHM9ImRyb3AiKSAlPiUKICBjb2xsZWN0KCkgJT4lCiAgbXV0YXRlKGdyb3VwXzM9ZmN0X2x1bXBfbihncm91cF8zLG49OCx3PW1uKSkgJT4lCiAgZ2dwbG90KGFlcyh4PW0seT1tbixjb2xvcj1ncm91cF8zKSkgKwogIGdlb21fcG9pbnQoKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgxNjAwLCAxNzAwLCBieSA9IDEwKSkgKwogIHRoZW1lX2hzY2lfZGlzY3JldGUoKQpgYGAKCiMgUlEyCgojIyBPcmlnaW5hbCBsYW5ndWFnZSBvZiBzb2NpZXR5LWxpbmtlZCB0cmFuc2xhdGlvbnMKCmBgYHtyfQp2ZDE3X25vcm1hbGl6ZWRfbGFuZ3NfYSAlPiUgCiAgZmlsdGVyKCFpcy5uYShvcmlnaW5hbF9sYW5ndWFnZSkpICU+JSAKICBpbm5lcl9qb2luKGZic19yZWNvcmRzX2EgJT4lIGlubmVyX2pvaW4odmQxN19pZF9hKSkgJT4lIAogIGNvdW50KG9yaWdpbmFsX2xhbmd1YWdlLCBzZXQpICU+JSAKICBhcnJhbmdlKHNldCxkZXNjKG4pKSAlPiUKICBnZ3Bsb3QoYWVzKHg9b3JpZ2luYWxfbGFuZ3VhZ2UseT1uKSkgKyAKICBnZW9tX2NvbCgpICsKICB0aGVtZV9oc2NpX2Rpc2NyZXRlKCkgKwogIGNvb3JkX2ZsaXAoKSArCiAgZmFjZXRfd3JhcCh+c2V0KQojICBndChyb3duYW1lX2NvbD0ib3JpZ2luYWxfbGFuZ3VhZ2UiLCBncm91cG5hbWVfY29sID0gInNldCIpICU+JQojICBmbXRfaW50ZWdlcihuKQpgYGAKCmBgYHtyLCBmaWcuaGVpZ2h0PTExLGZpZy53aWR0aD04fQp2ZDE3X25vcm1hbGl6ZWRfbGFuZ3NfYSAlPiUgCiAgZmlsdGVyKCFpcy5uYShvcmlnaW5hbF9sYW5ndWFnZSkpICU+JSAKICBpbm5lcl9qb2luKGZic19yZWNvcmRzX2EgJT4lIGlubmVyX2pvaW4odmQxN19pZF9hKSkgJT4lIAogIGxlZnRfam9pbih2ZDE3X2dlbnJlc19hICU+JSBpbm5lcl9qb2luKHZkMTdfZ2VucmVfY2F0ZWdvcmlzYXRpb25fYSksIGpvaW5fYnkocmVjb3JkX251bWJlcikpICU+JQogIGNvdW50KGdyb3VwXzMsIHNldCkgJT4lIAogIGFycmFuZ2Uoc2V0LGRlc2MobikpICU+JQogIGdncGxvdChhZXMoeD1ncm91cF8zLHk9bikpICsgCiAgZ2VvbV9jb2woKSArCiAgdGhlbWVfaHNjaV9kaXNjcmV0ZSgpICsKICBjb29yZF9mbGlwKCkgKwogIGZhY2V0X3dyYXAofnNldCxzY2FsZXM9ImZyZWVfeCIpCiMgIGd0KHJvd25hbWVfY29sPSJvcmlnaW5hbF9sYW5ndWFnZSIsIGdyb3VwbmFtZV9jb2wgPSAic2V0IikgJT4lCiMgIGZtdF9pbnRlZ2VyKG4pCmBgYAoKIyBSUSAzCgpgYGB7cn0KZmJzX3JlY29yZHNfYSAlPiUgCiAgZmlsdGVyKHNldD09IkFjdGl2ZSBtZW1iZXIgc3Vic3RhbnRpdmUgcm9sZSIpICU+JQogIGlubmVyX2pvaW4odmQxN19pZF9hKSAlPiUKICBsZWZ0X2pvaW4oYWxsX3ByaW50ZXJzICU+JSBpbm5lcl9qb2luKHZkMTdfYXV0aF9pZF9hICU+JSBpbm5lcl9qb2luKHZkMTdfYXV0aF9uYW1lX2EpLCBqb2luX2J5KHByaW50ZXJfZ25kPT1HTkQpKSkgJT4lCiAgY291bnQodW5pZmllZF9uYW1lLCBzZXQpICU+JSAKICBhcnJhbmdlKHNldCxkZXNjKG4pKSAlPiUKICBjb2xsZWN0KCkgJT4lCiAgbXV0YXRlKHVuaWZpZWRfbmFtZT1mY3RfbHVtcF9uKHVuaWZpZWRfbmFtZSxuPTMwLHc9bikpICU+JQogIGZpbHRlcighaXMubmEodW5pZmllZF9uYW1lKSx1bmlmaWVkX25hbWUhPSJPdGhlciIpICU+JQogIGdncGxvdChhZXMoeD11bmlmaWVkX25hbWUseT1uKSkgKyAKICBnZW9tX2NvbCgpICsKICB0aGVtZV9oc2NpX2Rpc2NyZXRlKCkgKwogIGNvb3JkX2ZsaXAoKSArCiAgZmFjZXRfd3JhcCh+c2V0LHNjYWxlcz0iZnJlZV94IikKYGBgCgpgYGB7cn0KeWVhcnMgJT4lIAogIHRyYW5zbXV0ZShtPXllYXIsYj15ZWFyLTUsZT15ZWFyKzUpICU+JQogIGxlZnRfam9pbigKICAgIGZic19yZWNvcmRzX2EgJT4lIAogICAgICBmaWx0ZXIoc2V0PT0iQWN0aXZlIG1lbWJlciBzdWJzdGFudGl2ZSByb2xlIikgJT4lCiAgICAgIGlubmVyX2pvaW4odmQxN19pZF9hKSAlPiUKICAgICAgbGVmdF9qb2luKHVuaWZpZWRfcGxhY2VzX29mX3B1YmxpY2F0aW9uKSAlPiUKICAgICAgbGVmdF9qb2luKHZkMTdfbm9ybWFsaXplZF95ZWFyc19hKSAlPiUKICAgICAgY291bnQobm9ybWFsaXplZF95ZWFyLHBsYWNlX29mX3B1YmxpY2F0aW9uLCBzZXQpLAogICAgam9pbl9ieShiPD1ub3JtYWxpemVkX3llYXIsZT49bm9ybWFsaXplZF95ZWFyKQogICkgJT4lCiAgcmVwbGFjZV9uYShsaXN0KG49MCkpICU+JQojICBjb21wbGV0ZShtLHNldCxwbGFjZV9vZl9wdWJsaWNhdGlvbixmaWxsPWxpc3Qobj0wKSkgJT4lCiAgZ3JvdXBfYnkobSxwbGFjZV9vZl9wdWJsaWNhdGlvbikgJT4lIAogIHN1bW1hcmlzZShuPXN1bShuKSwuZ3JvdXBzPSJkcm9wIikgJT4lCiAgY29sbGVjdCgpICU+JQogIG11dGF0ZShwbGFjZV9vZl9wdWJsaWNhdGlvbj1mY3RfbHVtcF9uKHBsYWNlX29mX3B1YmxpY2F0aW9uLG49MTAsdz1uKSkgJT4lCiAgZ2dwbG90KGFlcyh4PW0seT1uLGNvbG9yPXBsYWNlX29mX3B1YmxpY2F0aW9uKSkgKyAKICBnZW9tX3BvaW50KCkgKwogIHRoZW1lX2hzY2lfZGlzY3JldGUoKQpgYGAKCiMgUlE0CgpgYGB7cixmaWcud2lkdGg9NyxmaWcuaGVpZ2h0PTExfQpmYnNfcmVjb3Jkc19hICU+JSAKICBpbm5lcl9qb2luKHZkMTdfaWRfYSkgJT4lIAogIGlubmVyX2pvaW4odmQxN19wZXJzb25fbGlua3NfYSAlPiUgCiAgICAgICAgICAgICAgZmlsdGVyKHJvbGU9PSJkdGUiKSwgam9pbl9ieShyZWNvcmRfbnVtYmVyKSkgJT4lCiAgY291bnQoY29tYmluZWRfbmFtZSwgc2V0KSAlPiUgCiAgYXJyYW5nZShzZXQsZGVzYyhuKSkgJT4lCiAgY29sbGVjdCgpICU+JQogIGdyb3VwX2J5KHNldCkgJT4lCiAgbXV0YXRlKGNvbWJpbmVkX25hbWU9ZmN0X2x1bXBfbihjb21iaW5lZF9uYW1lLG49MTAsdz1uKSkgJT4lCiAgdW5ncm91cCgpICU+JQogIGZpbHRlcihjb21iaW5lZF9uYW1lIT0iT3RoZXIiKSAlPiUKICBnZ3Bsb3QoYWVzKHg9Y29tYmluZWRfbmFtZSx5PW4pKSArIAogIGdlb21fY29sKCkgKwogIHRoZW1lX2hzY2lfZGlzY3JldGUoKSArCiAgY29vcmRfZmxpcCgpICsKICBmYWNldF93cmFwKH5zZXQsc2NhbGVzPSJmcmVlIixuY29sPTEpCmBgYAoKCiMgTWlzYwoKYGBge3J9CmZic19tZXRhZGF0YV9hICU+JQogIG11dGF0ZShhY3RpdmVfdGltZSA9IGFzLmludGVnZXIoRXN0aW1hdGVkX0RPRCkgLSBhcy5pbnRlZ2VyKEVzdGltYXRlZF9hZG1pc3Npb25feWVhcikpICU+JQogIGZpbHRlcihhY3RpdmVfdGltZSA+PSAwKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSAxLCB5ID0gYWN0aXZlX3RpbWUpKSArCiAgZ2VvbV9xdWFzaXJhbmRvbSgpICsKICB0aGVtZV9oc2NpX2Rpc2NyZXRlKCkKYGBgCgpgYGB7cn0KZmJzX2xpbmtzX29mX2ludGVyZXN0X2EgJT4lCiAgbGVmdF9qb2luKHZkMTdfbm9ybWFsaXplZF95ZWFyc19hLCBqb2luX2J5KHJlY29yZF9udW1iZXIpKSAlPiUKICBncm91cF9ieShtZW1iZXJfbnVtYmVyKSAlPiUKICBzdW1tYXJpc2UoZWFybGllc3RfeWVhciA9IG1pbihub3JtYWxpemVkX3llYXIpLCBsYXRlc3RfeWVhciA9IG1heChub3JtYWxpemVkX3llYXIpKSAlPiUKICBtdXRhdGUoYWN0aXZlX3RpbWUgPSBsYXRlc3RfeWVhciAtIGVhcmxpZXN0X3llYXIpICU+JQogIGdncGxvdChhZXMoeCA9IDEsIHkgPSBhY3RpdmVfdGltZSkpICsKICBnZW9tX3F1YXNpcmFuZG9tKCkgKwogIHRoZW1lX2hzY2lfZGlzY3JldGUoKQpgYGAKCmBgYHtyfQp5ZWFycyA8LSB0aWJibGUoeWVhciA9IDE2MDA6MTcwMCkgJT4lCiAgY29weV90b19hKGNvbikKCm1lbWJlcnNfdGhyb3VnaF90aW1lIDwtIHNlcSgyMCwgNjAsIGJ5ID0gMTApICU+JQogIG1hcCh+IHllYXJzICU+JQogICAgaW5uZXJfam9pbihmYnNfbWV0YWRhdGFfYSAlPiUgbXV0YXRlKEVzdGltYXRlZF9hZG1pc3Npb25feWVhciA9IGFzLmludGVnZXIoRXN0aW1hdGVkX2FkbWlzc2lvbl95ZWFyKSwgbGF0ZXN0X3llYXIgPSBhcy5pbnRlZ2VyKEVzdGltYXRlZF9hZG1pc3Npb25feWVhcikgKyAueCksIGpvaW5fYnkoeWVhciA+PSBFc3RpbWF0ZWRfYWRtaXNzaW9uX3llYXIsIHllYXIgPD0gbGF0ZXN0X3llYXIpKSAlPiUKICAgIGNvdW50KHllYXIpICU+JQogICAgbXV0YXRlKHNldCA9IC54KSkgJT4lCiAgcmVkdWNlKHVuaW9uX2FsbCkKbWVtYmVyc190aHJvdWdoX3RpbWUgJT4lCiAgZ2dwbG90KGFlcyh4ID0geWVhciwgeSA9IG4sIGNvbG9yID0gYXMuY2hhcmFjdGVyKHNldCkpKSArCiAgZ2VvbV9wb2ludCgpICsKICB0aGVtZV9oc2NpX2Rpc2NyZXRlKCkKYGBgCgpgYGB7cn0KZmJzX3JlY29yZHNfYSAlPiUKICBpbm5lcl9qb2luKHZkMTdfaWRfYSwgam9pbl9ieSh2ZDE3X2lkKSkgJT4lCiAgaW5uZXJfam9pbih2ZDE3X25vcm1hbGl6ZWRfeWVhcnNfYSwgam9pbl9ieShyZWNvcmRfbnVtYmVyKSkgJT4lCiAgY291bnQobm9ybWFsaXplZF95ZWFyLCBzZXQpICU+JQogIGlubmVyX2pvaW4obWVtYmVyc190aHJvdWdoX3RpbWUgJT4lIHJlbmFtZShub3JtYWxpemVkX3llYXIgPSB5ZWFyLCBtZW1iZXJzID0gbiwgbWVtYmVyc2V0ID0gc2V0KSkgJT4lCiAgZmlsdGVyKG5vcm1hbGl6ZWRfeWVhciA+IDE2MzAsIG5vcm1hbGl6ZWRfeWVhciA8IDE2ODApICU+JQogIGdncGxvdChhZXMoeCA9IG5vcm1hbGl6ZWRfeWVhciwgeSA9IG4gLyBtZW1iZXJzLCBjb2xvciA9IHNldCkpICsKICBnZW9tX3BvaW50KHNpemUgPSAwLjUpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDE2MDAsIDE3MDAsIGJ5ID0gMTApKSArCiAgdGhlbWVfaHNjaV9kaXNjcmV0ZSgpICsKICBmYWNldF93cmFwKH5tZW1iZXJzZXQpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikKYGBgCg==