Creating the environment

This template is based in this paper

https://revistas.ucm.es/index.php/REVE/article/view/75566/4564456557467

For a detail explanation of how to use it, please watch this video

https://www.youtube.com/watch?v=jtKSifvNvTM

Data getting

wos_scopus_tos <- 
  tosr::tosr_load("Scopus_2000.bib", 
                  "WoS_1.txt", 
                  "WoS_2.txt",
                  "WoS_3.txt")
[1] 4

Converting your scopus collection into a bibliographic dataframe

Done!


Generating affiliation field tag AU_UN from C1:  Done!


Converting your wos collection into a bibliographic dataframe

Done!


Generating affiliation field tag AU_UN from C1:  Done!


Converting your wos collection into a bibliographic dataframe

Done!


Generating affiliation field tag AU_UN from C1:  Done!


Converting your wos collection into a bibliographic dataframe

Done!


Generating affiliation field tag AU_UN from C1:  Done!


 735 duplicated documents have been removed
tree_of_science <- 
  tosr::tosR("Scopus_2000.bib", 
                  "WoS_1.txt", 
                  "WoS_2.txt",
                  "WoS_3.txt")
[1] 4

Converting your scopus collection into a bibliographic dataframe

Done!


Generating affiliation field tag AU_UN from C1:  Done!


Converting your wos collection into a bibliographic dataframe

Done!


Generating affiliation field tag AU_UN from C1:  Done!


Converting your wos collection into a bibliographic dataframe

Done!


Generating affiliation field tag AU_UN from C1:  Done!


Converting your wos collection into a bibliographic dataframe

Done!


Generating affiliation field tag AU_UN from C1:  Done!


 735 duplicated documents have been removed
Computing TOS SAP
Computing TOS subfields
wos <- 
  bibliometrix::convert2df(c("WoS_1.txt", 
                             "WoS_2.txt",
                             "WoS_3.txt"))  # create dataframe from wos file

Converting your wos collection into a bibliographic dataframe

Done!


Generating affiliation field tag AU_UN from C1:  Done!
scopus <- 
  bibliometrix::convert2df("Scopus_2000.bib", # Create dataframe from scopus file
                           dbsource = "scopus", 
                           format = "bibtex")

Converting your scopus collection into a bibliographic dataframe

Done!


Generating affiliation field tag AU_UN from C1:  Done!

Table 1. Search Criteria

table_1 <- 
  tibble(wos = length(wos$SR), # Create a dataframe with the values.
         scopus = length(scopus$SR), 
         total = length(wos_scopus_tos$df$SR))
table_1

Figure 1. Languages

main_languages <- 
  wos_scopus_tos$df |> 
  select(LA) |> 
  separate_rows(LA, sep = "; ") |> 
  count(LA, sort = TRUE) |> 
  slice(1:5)

other_languages <- 
  wos_scopus_tos$df |> 
  separate_rows(LA, sep = "; ") |> 
  select(LA) |> 
  count(LA, sort = TRUE) |> 
  slice(6:n) |> 
  summarise(n = sum(n)) |> 
  mutate(LA = "OTHERS") |> 
  select(LA, n)
Warning in 6:n :
  numerical expression has 25 elements: only the first used
languages <- 
  main_languages |> 
  bind_rows(other_languages) |> 
  mutate(percentage = n / sum(n),
         percentage = round(percentage, 
                            digits = 2) ) |> 
  rename(language = LA) |>
  select(language, percentage, count = n)

languages
df <- languages |> 
  rename(value = percentage, group = language) |>
  mutate(value = value * 100) |> 
  select(value, group)

df2 <- df %>% 
  mutate(csum = rev(cumsum(rev(value))), 
         pos = value/2 + lead(csum, 1),
         pos = if_else(is.na(pos), value/2, pos))

ggplot(df, aes(x = 2 , y = value, fill = fct_inorder(group))) +
  geom_col(width = 1, color = 1) +
  coord_polar(theta = "y") +
  geom_label_repel(data = df2,
                   aes(y = pos, label = paste0(value, "%")),
                   size = 4.5, nudge_x = 1, show.legend = FALSE) +
  theme(panel.background = element_blank(),
        axis.line = element_blank(), 
        axis.text = element_blank(),
        axis.ticks = element_blank(),
        axis.title = element_blank(),
        plot.title = element_text(hjust = 0.5, size = 18)) +
  labs(title = "Languages") +
  guides(fill = guide_legend(title = "")) +
  theme_void() +
  xlim(0.5, 2.5)

Figure 2. Scientific Production

wos_anual_production <- 
  wos |> 
  select(PY) |> 
  count(PY, sort = TRUE) |> 
  na.omit() |> 
  filter(PY >= 2000,
         PY < year(today())) |> 
  mutate(ref_type = "wos")

scopus_anual_production  <- 
  scopus |> 
  select(PY) |> 
  count(PY, sort = TRUE) |> 
  na.omit() |> 
  filter(PY >= 2000,
         PY < year(today())) |>
  mutate(ref_type = "scopus")

total_anual_production <- 
  wos_scopus_tos$df |> 
  select(PY) |> 
  count(PY, sort = TRUE) |> 
  na.omit() |> 
  filter(PY >= 2000,
         PY < year(today())) |>
  mutate(ref_type = "total")

wos_scopus_total_annual_production <- 
  wos_anual_production |> 
  bind_rows(scopus_anual_production,
            total_anual_production) 

figure_2_data <- 
  wos_scopus_total_annual_production |> 
  mutate(PY = replace_na(PY, replace = 0)) |> 
  pivot_wider(names_from = ref_type, 
              values_from = n) |> 
  arrange(desc(PY))

figure_2_data 
```r
wos_scopus_total_annual_production |> 
  ggplot(aes(x = PY, y = n, color = ref_type)) +
  geom_line() +
  labs(title = \Annual Scientific Production\, 
       x = \years\,
       y = \papers\) +
  theme(plot.title = element_text(hjust = 0.5)) 

<!-- rnb-source-end -->

<!-- rnb-plot-begin -->

<img src="data:image/png;base64,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4otbt25t39u7775rtVqjdSzxq+utEOZ2u1VVdTgc4YdwOkRED1sBzoWI6HorXG57gfgW7Tv2I0ySpLvuuuv999/3er07duyYO3duZWUlIeT3v//9X//619bW1rfffvuxxx4Lv7jrG8Hl6nlDPPbYY5s2bTp7nq7rUTuYuHVZrRD2pz/9afXq1e0P4XTouZ63ApwLPdf1VuhGe4G41t8uih07doxl2bvuustkMo0fP37MmDH79u2rr6+vqKi49957bTbbPffcU19fX1VV1fWN0T6muNTDhkAInTlzZujQoannYYyjfUzxp+utgBDasmXL4sWL16xZ0/52OB0iooetgOBciISut8JltRfoB/pbDHI4HA888ED7Q4/HY7fb6+rqcnJywrPUMwyTn59fV1fX9Y3ROpa41sOG8Hq9wWBw6dKlCxYs+NWvfrVv376oHUk863orIIREUSwpKcnNzW1/PZwOEdHDVoBzISK63gqX1V6gH+hvMWjAgAFTpkwJ//ztt9/W1dUVFxe7XK6Lp0Uxm81ut7vrG/us+P6khw1x5swZmqZnzJjx1ltv3XDDDUuWLGlsbOzrY4h/XW8FhFBJScmsWbPS0tLan4LTISJ62ApwLlhK7I4AAAa+SURBVERE11vhstoL9AP9cIg0QigQCPz973/ftWvXCy+80OlYwk5Xae36RtBF3W6IoqKiFStWhB9ef/31Gzdu3LFjx5w5c3q33H6qe63QKTgduq3brQDnQgR1vRUieNaAGNffeoMQQnV1dY899pjf73/99dedTidCyGq1+v3+9hf4fD6r1dr1jX1ZfH/Sk4bosKsBAwa0trb2Tdn9TBdbodP3wukQKT1phQ7gXOi2rrdCBNsLxL7+1hsky/Jzzz139dVXL1y4sH1jbm7uyZMnZVnmOE7X9erq6tzcXFEUu7gxekcTx3rYEOvWrTt27NgjjzwSfmNDQ0NhYWGUDiWOdb0VOn17118JLqGHrQDnQkR0vRV62F4g7vS33qBdu3bpuj5r1iz3eaFQKCMjw+l0Ll++XNO0lStXpqen5+fnd31jtI8pLvWwIXJyctasWbN27Vq/37927dqamprJkydH+5jiT9dbodO3w+kQET1sBTgXIqLrrdDD9gJxp7+tKfbBBx98/PHHF2+5++67FyxY4HK5Xn311erq6pycnMceeywlJQUh1PWN4HL1vCF27dr1wQcfnDlzJjc39+GHHw53TYPLclmtELZkyZIRI0bMnj07/BBOh57reSvAudBzXW+FbrQXiGv9LQYBAAAAAHRRf7soBgAAAADQRRCDAAAAAJCgIAYBAAAAIEFBDAIAAABAgoIYBAAAAIAEBTEIAAAAAAkKYhAAAAAAEhTEIAAAAAAkKIhBAIDIkGVZUZRoVwEAAJcBYhAAieXJJ5/Myspqnz5eURS73f7CCy+EH7733nvjxo0zmUzDhg1766232t/l9Xofe+yxoqIiURTz8/OfffbZ9j1kZGR88sknTzzxRHp6+smTJw8dOjRr1iybzeZwOG699dba2to+PkAAAOg6iEEAJJZ58+adOnVqz5494Ydr1qxxuVzhxbT/8pe/PPDAA9dcc82HH344c+bMhx56aOnSpeGXPfDAA++8885//Md/fPjhh3PmzHnuuefef//99n2+8sorZWVlb731lt1uv/baaz0ez9KlSxctWrR79+7777+/748RAAC6CNYUAyDh5OXlLVy4cMmSJQihe+65p7y8fMeOHcFgMCcn51e/+tUzzzwTftkvf/nLTz75pKmpCWN82223TZ8+/ZFHHgk/NWzYsFmzZr3yyisIoYyMDIfDcejQIYzx3r17x44d++23386cORMh9Nlnn23YsCH8MgAAiEHQGwRAwpk7d+6nn36KEAqFQqtWrbrrrrsQQseOHWtqapo5c2bLeVOmTGlpaamqqkIILVu27JFHHvH7/QcPHvzHP/5RWVmp63r7DmfNmoUxRgjl5uaazebf/va3b7/99unTp2fPng0ZCAAQyyAGAZBw5s2bd/z48ePHj3/55ZeBQOD2229HCNXU1CCEJk2a5DjvzjvvRAi5XC6E0NatW0ePHm02m2+44YZPPvkkJSXl4h2mpqaGf0hOTt6wYUNeXt4jjzwyYMCAMWPGLF++vI+PDgAAug5iEAAJZ+LEiZmZmStWrPjoo49mzpwZDjHhZNPY2Ei+b+zYsS6X66qrrpo8eXJDQ0N9ff1XX32Vm5t78Q4p6sJfkuLi4tWrV7e2tq5ZsyYzM3PBggWlpaV9e3wAANBVEIMASDgY41tvvfVf//rX559/Hr4ihhAaNmyYIAgrV65sf9lzzz03ffp0hNCePXsURfntb38bDkyhUKi6urrTPS9btqyoqMjn84mieM0117zxxhu6rocvqwEAQAxiol0AACAK5s2b9+c//1kUxVtvvTW8xW63P/7444888sjp06dLSko2bdr0yiuvvPjiiwihoqIilmWffPLJX//6162trUuWLGlraystLW1ubnY4HBfvdsyYMSdPnrz99tt//vOfe73ed9991263T5gwIQpHCAAAXQC9QQAkoqlTp1qt1ptvvtlkMrVvXLRo0Ysvvrh8+fLbb7/9888/f/3113/3u98hhHJyct57773whECLFy9+6qmn3nzzzT179rz22msddut0OpcvX97Y2HjXXXf95je/oWl67dq1HaISAADEDrhhHoBEVFtbm5eXt2rVqtmzZ0e7FgAAiBq4KAZAYtE0LRgMLl682OFwzJo1K9rlAABANEEMAiCx1NTUOJ1OiqLefPNNlmWjXQ4AAEQTXBQDILGoqrp169aioqKMjIxo1wIAAFEGMQgAAAAACQruFAMAAABAgoIYBAAAAIAEBTEIAAAAAAkKYhAAAAAAEhTEIAAAAAAkKIhBAAAAAEhQEIMAAAAAkKD+f+P+/XXrH9lZAAAAAElFTkSuQmCC" />

<!-- rnb-plot-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


## Table 2. Country production


<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuZGF0YV9iaWJsaW9fd29zIDwtIGJpYmxpb0FuYWx5c2lzKHdvcylcblxud29zX2NvdW50cnkgPC0gXG4gIGRhdGFfYmlibGlvX3dvcyRDb3VudHJpZXMgfD4gXG4gIGRhdGEuZnJhbWUoKSB8PiBcbiAgbXV0YXRlKGRhdGFiYXNlID0gXCJ3b3NcIikgfD4gXG4gIHNlbGVjdChjb3VudHJ5ID0gVGFiLCBwYXBlcnMgPSBGcmVxLCBkYXRhYmFzZSApIHw+IFxuICBhcnJhbmdlKGRlc2MocGFwZXJzKSkgXG5cbmRhdGFfYmlibGlvX3Njb3B1cyA8LSBiaWJsaW9BbmFseXNpcyhzY29wdXMpXG5cbnNjb3B1c19jb3VudHJ5IDwtIFxuICBkYXRhX2JpYmxpb19zY29wdXMkQ291bnRyaWVzIHw+IFxuICBkYXRhLmZyYW1lKCkgfD4gXG4gIG11dGF0ZShkYXRhYmFzZSA9IFwic2NvcHVzXCIpIHw+IFxuICBzZWxlY3QoY291bnRyeSA9IFRhYiwgcGFwZXJzID0gRnJlcSwgZGF0YWJhc2UgKSB8PiBcbiAgYXJyYW5nZShkZXNjKHBhcGVycykpIFxuXG5kYXRhX2JpYmxpb190b3RhbCA8LSBiaWJsaW9BbmFseXNpcyh3b3Nfc2NvcHVzX3RvcyRkZilcblxudG90YWxfY291bnRyeSA8LSBcbiAgZGF0YV9iaWJsaW9fdG90YWwkQ291bnRyaWVzIHw+IFxuICBkYXRhLmZyYW1lKCkgfD4gXG4gIG11dGF0ZShkYXRhYmFzZSA9IFwidG90YWxcIikgfD4gXG4gIHNlbGVjdChjb3VudHJ5ID0gVGFiLCBwYXBlcnMgPSBGcmVxLCBkYXRhYmFzZSApIHw+IFxuICBhcnJhbmdlKGRlc2MocGFwZXJzKSkgXG5cbndvc19zY29wdXNfdG90YWxfY291bnRyeSA8LSBcbiAgd29zX2NvdW50cnkgfD4gXG4gIGJpbmRfcm93cyhzY29wdXNfY291bnRyeSwgXG4gICAgICAgICAgICB0b3RhbF9jb3VudHJ5KSB8PiBcbiAgbXV0YXRlKGNvdW50cnkgPSBhcy5jaGFyYWN0ZXIoY291bnRyeSkpIHw+IFxuICBwaXZvdF93aWRlcihuYW1lc19mcm9tID0gZGF0YWJhc2UsIFxuICAgICAgICAgICAgICB2YWx1ZXNfZnJvbSA9IHBhcGVycykgfD4gXG4gIGFycmFuZ2UoZGVzYyh0b3RhbCkpIHw+IFxuICBzbGljZSgxOjEwKSB8PiBcbiAgbXV0YXRlKHBlcmNlbnRhZ2UgPSB0b3RhbCAvICh0YWJsZV8xIHw+IHB1bGwodG90YWwpKSxcbiAgICAgICAgIHBlcmNlbnRhZ2UgPSByb3VuZChwZXJjZW50YWdlLCBkaWdpdHMgPSAyKSlcblxud29zX3Njb3B1c190b3RhbF9jb3VudHJ5XG5gYGAifQ== -->

```r
data_biblio_wos <- biblioAnalysis(wos)

wos_country <- 
  data_biblio_wos$Countries |> 
  data.frame() |> 
  mutate(database = "wos") |> 
  select(country = Tab, papers = Freq, database ) |> 
  arrange(desc(papers)) 

data_biblio_scopus <- biblioAnalysis(scopus)

scopus_country <- 
  data_biblio_scopus$Countries |> 
  data.frame() |> 
  mutate(database = "scopus") |> 
  select(country = Tab, papers = Freq, database ) |> 
  arrange(desc(papers)) 

data_biblio_total <- biblioAnalysis(wos_scopus_tos$df)

total_country <- 
  data_biblio_total$Countries |> 
  data.frame() |> 
  mutate(database = "total") |> 
  select(country = Tab, papers = Freq, database ) |> 
  arrange(desc(papers)) 

wos_scopus_total_country <- 
  wos_country |> 
  bind_rows(scopus_country, 
            total_country) |> 
  mutate(country = as.character(country)) |> 
  pivot_wider(names_from = database, 
              values_from = papers) |> 
  arrange(desc(total)) |> 
  slice(1:10) |> 
  mutate(percentage = total / (table_1 |> pull(total)),
         percentage = round(percentage, digits = 2))

wos_scopus_total_country

Table 3. Author production

wos_authors <- 
  data_biblio_wos$Authors |> 
  data.frame() |> 
  rename(authors_wos = AU, papers_wos = Freq) |> 
  arrange(desc(papers_wos)) |> 
  slice(1:10) |> 
  mutate(database_wos = "wos")


scopus_authors <- 
  data_biblio_scopus$Authors |> 
  data.frame() |> 
  rename(authors_scopus = AU, papers_scopus = Freq) |> 
  arrange(desc(papers_scopus)) |> 
  slice(1:10) |> 
  mutate(database_scopus = "scopus")

total_authors <- 
  data_biblio_total$Authors |> 
  data.frame() |> 
  rename(authors_total = AU, 
         papers_total = Freq) |> 
  arrange(desc(papers_total)) |> 
  slice(1:10) |> 
  mutate(database_total = "total")

wos_scopus_authors <- 
  wos_authors |> 
  bind_cols(scopus_authors,
            total_authors)

wos_scopus_authors

Table 4. Journal production

wos_journal <- 
  wos |> 
  select(journal = SO) |> 
  na.omit() |> 
  count(journal, sort = TRUE) |> 
  slice(1:20) |> 
  rename(publications = n) |> 
  mutate(database = "wos")

scopus_journal <- 
  scopus |> 
  select(journal = SO) |> 
  na.omit() |> 
  count(journal, sort = TRUE) |> 
  slice(1:20) |> 
  rename(publications = n) |> 
  mutate(database = "scopus")

total_journal <- 
  wos_scopus_tos$df |> 
  select(journal = SO) |> 
  na.omit() |> 
  count(journal, sort = TRUE) |> 
  slice(1:20) |> 
  rename(publications = n) |> 
  mutate(database = "total")

wos_scopus_total_journal <- 
  wos_journal |> 
  bind_rows(scopus_journal, 
            total_journal) |> 
  pivot_wider(names_from = database, 
              values_from = publications) |> 
  arrange(desc(total)) |> 
  slice(1:10) |> 
  mutate(percentage = total / table_1 |> pull(total),
         percentage = round(percentage, digits = 2))


wos_scopus_total_journal

Figure 3. Co-citation network

Author co-citation network

wos_scopus_author_metatag <- 
  metaTagExtraction(wos_scopus_tos$df, Field = "CR_AU")

wos_scopus_author_co_citation_matrix <- 
  biblioNetwork(M = wos_scopus_author_metatag, 
                analysis = "co-citation", 
                network = "authors")

aca_tbl_graph <- 
  graph_from_adjacency_matrix(wos_scopus_author_co_citation_matrix , 
                              mode = "undirected", 
                              weighted = TRUE, 
                              diag = FALSE) |> 
  as_tbl_graph(aca_igraph, directed = FALSE ) |> 
  activate(nodes) |> 
  mutate(degree = centrality_degree()) |> 
  arrange(desc(degree)) |> 
  slice(1:30)

weight_tbl <- 
  aca_tbl_graph |> 
  activate(edges) |> 
  select(weight) |> 
  as.data.frame()

threshold <- 
  quantile(weight_tbl |> 
             select(weight) |> 
             pull(), 
           probs = 0.80)

aca_tbl_graph_filtered <- 
  aca_tbl_graph |> 
  activate(edges) |> 
  filter(weight >= threshold) |> 
  activate(nodes) |> 
  mutate(components = group_components(type = "weak")) |> 
  filter(components == 1) |> 
  mutate(degree = centrality_degree(),
         community = as.factor(group_louvain()) )

aca_tbl_graph_filtered |> 
  ggraph(layout = "kk") + 
  geom_edge_link(alpha = .25, 
                 aes(width = weight)) +
  geom_node_point(aes(colour = community, 
                      size = degree)) +
  geom_node_text(aes(label = name), repel = TRUE) +
  theme_graph()

Author Collaboration network

wos_scopus_author_collab_matrix <- 
  biblioNetwork(M = wos_scopus_tos$df, 
                analysis = "collaboration", 
                network = "authors")

plot_author_collab <- 
  networkPlot(NetMatrix = wos_scopus_author_collab_matrix, 
              weighted=T, n = 30, 
              Title = "Author Collaboration Network", 
              type = "fruchterman", 
              size=T,
              edgesize = 5,
              labelsize=0.7)


author_collab_tbl_graph <- 
  graph_from_adjacency_matrix(wos_scopus_author_collab_matrix , 
                              mode = "undirected", 
                              weighted = TRUE, 
                              diag = FALSE) |> 
  as_tbl_graph(aca_igraph, directed = FALSE ) |> 
  activate(nodes) |> 
  mutate(degree = centrality_degree()) |> 
  arrange(desc(degree)) |> 
  slice(1:30)

author_collab_tbl_graph_filtered <- 
  author_collab_tbl_graph |> 
  activate(edges) |> 
  filter(weight > 1) |> 
  activate(nodes) |> 
  mutate(components = group_components(type = "weak")) |>
  filter(components == 1) |>
  mutate(degree = centrality_degree(),
         community = as.factor(group_louvain()) )

author_collab_tbl_graph_filtered |> 
  ggraph(layout = "kk") + 
  geom_edge_link(alpha = .25, 
                 aes(width = weight)) +
  geom_node_point(aes(colour = community, 
                      size = degree)) +
  geom_node_text(aes(label = name), repel = TRUE) +
  theme_graph()

Country Collaboration Network

wos_scopus_country_collab_matrix <- 
  biblioNetwork(M = wos_scopus_tos$df, 
                analysis = "collaboration", 
                network = "countries")

plot_country_collab <- 
  networkPlot(wos_scopus_country_collab_matrix, 
              weighted=T, n = 30, 
              Title = "Country Collaboration Network", 
              type = "fruchterman", 
              size=T,
              edgesize = 5,
              labelsize=0.7)


country_collab_tbl_graph <- 
  graph_from_adjacency_matrix(wos_scopus_country_collab_matrix , 
                              mode = "undirected", 
                              weighted = TRUE, 
                              diag = FALSE) |> 
  as_tbl_graph(aca_igraph, directed = FALSE ) |> 
  activate(nodes) |> 
  mutate(degree = centrality_degree()) |> 
  arrange(desc(degree)) |> 
  slice(1:30)

country_collab_tbl_graph_filtered <- 
  country_collab_tbl_graph |> 
  activate(nodes) |> 
  mutate(components = group_components(type = "weak")) |>
  filter(components == 1) |>
  mutate(degree = centrality_degree(),
         community = as.factor(group_louvain()) )

country_collab_tbl_graph_filtered |> 
  ggraph(layout = "kk") + 
  geom_edge_link(alpha = .25, 
                 aes(width = weight)) +
  geom_node_point(aes(colour = community, 
                      size = degree)) +
  geom_node_text(aes(label = name), repel = TRUE) +
  theme_graph()

Keyword co-occurrence network

wos_scopus_keyword_co_occurrence_matrix <- 
  biblioNetwork(M = wos_scopus_tos$df, 
                analysis = "co-occurrences", 
                network = "keywords", 
                sep = ";")

plot_net_co_occurrence <- 
  networkPlot(wos_scopus_keyword_co_occurrence_matrix, 
              weighted=T, n = 30, 
              Title = "Keyword Co-occurrence Network", 
              type = "fruchterman", 
              size=T,
              edgesize = 5,
              labelsize=0.7)


keyword_co_occurrence_tbl_graph <- 
  graph_from_adjacency_matrix(wos_scopus_keyword_co_occurrence_matrix , 
                              mode = "undirected", 
                              weighted = TRUE, 
                              diag = FALSE) |> 
  as_tbl_graph(aca_igraph, directed = FALSE ) |> 
  activate(nodes) |> 
  mutate(degree = centrality_degree()) |> 
  arrange(desc(degree)) |> 
  slice(1:30)

keyword_co_occurrence_weight_tbl <- 
  keyword_co_occurrence_tbl_graph |> 
  activate(edges) |> 
  select(weight) |> 
  as.data.frame()

threshold <- 
  quantile(keyword_co_occurrence_weight_tbl |> 
             select(weight) |> 
             pull(), 
           probs = 0.80)

keyword_co_occurrence_tbl_graph_filtered <- 
  keyword_co_occurrence_tbl_graph |> 
  activate(edges) |> 
  filter(weight >= threshold) |> 
  activate(nodes) |> 
  mutate(components = group_components(type = "weak")) |> 
  filter(components == 1) |> 
  mutate(degree = centrality_degree(),
         community = as.factor(group_louvain()) )

keyword_co_occurrence_tbl_graph_filtered |> 
  ggraph(layout = "kk") + 
  geom_edge_link(alpha = .25, 
                 aes(width = weight)) +
  geom_node_point(aes(colour = community, 
                      size = degree)) +
  geom_node_text(aes(label = name), repel = TRUE) +
  theme_graph()

Figure 4. Tree of Science

Tree of Science

tree_of_science

Clustering analysis

Finding the clusters

nodes <-  # Create a dataframe with the fullname of articles 
  tibble(name = V(wos_scopus_tos$graph)$name) |> 
  left_join(wos_scopus_tos$nodes, 
            by = c("name" = "ID_TOS"))

wos_scopus_citation_network_1 <- # Add the article names to the citation network
  wos_scopus_tos$graph |> 
  igraph::set.vertex.attribute(name = "full_name", 
                               index = V(wos_scopus_tos$graph)$name, 
                               value = nodes$CITE)

nodes_1 <- # Create a dataframe with subfields (clusters)
  tibble(name = V(wos_scopus_citation_network_1)$name,
         cluster = V(wos_scopus_citation_network_1)$subfield,
         full_name = V(wos_scopus_citation_network_1)$full_name)

nodes_2 <- # Count the number of articles per cluster
  nodes_1 |> 
  count(cluster, sort = TRUE) |> 
  mutate(cluster_1 = row_number()) |> 
  select(cluster, cluster_1)

nodes_3 <- 
  nodes_1 |> 
  left_join(nodes_2) |> 
  rename(subfield = cluster_1) |> 
  select(name, full_name, subfield)
Joining, by = "cluster"
edge_list <- 
  get.edgelist(wos_scopus_citation_network_1) |> 
  data.frame() |> 
  rename(Source = X1, Target = X2)

wos_scopus_citation_network <- 
  graph.data.frame(d = edge_list, 
                   directed = TRUE, 
                   vertices = nodes_3)

wos_scopus_citation_network |> 
  summary()
IGRAPH 51794e1 DN-- 7356 16320 -- 
+ attr: name (v/c), full_name (v/c), subfield (v/n)

Choosing clusters

We proposed the tipping point option to choose the number of clusters. See this paper:

https://www.nature.com/articles/s41598-021-85041-8

clusters <- 
  tibble(cluster = V(wos_scopus_citation_network)$subfield) |> 
  count(cluster, sort = TRUE)

clusters |> 
  ggplot(aes(x = reorder(cluster, n), y = n)) +
  geom_point(size = 3) +
  labs(x = "Clusters", y = "Number of papers") +
  theme(axis.title.x = element_text(size = 16 , 
                                    family =  "Arial"),
        axis.title.y = element_text(size = 16, family = "Arial"),
        axis.text.x = element_text(size = 12, family = "Arial"), 
        axis.text.y = element_text(size = 12, family = "Arial"))

Removing not chosen clusters

wos_scopus_citation_network_clusters <- 
  wos_scopus_citation_network |> 
  delete.vertices(which(V(wos_scopus_citation_network)$subfield != 1 & # filter clusters 
                          V(wos_scopus_citation_network)$subfield != 2 &
                          V(wos_scopus_citation_network)$subfield != 3  &
                          V(wos_scopus_citation_network)$subfield != 4))

wos_scopus_citation_network_clusters |> 
  summary()
IGRAPH 6e3a93b DN-- 3521 7905 -- 
+ attr: name (v/c), full_name (v/c), subfield (v/n)

Cluster 1

pal <- brewer.pal(8,"Dark2")

nodes_full_data <- 
  tibble(name = V(wos_scopus_citation_network)$name,
         cluster = V(wos_scopus_citation_network)$subfield,
         full_name = V(wos_scopus_citation_network)$full_name)

cluster_1 <- 
  wos_scopus_citation_network |> 
  delete.vertices(which(V(wos_scopus_citation_network)$subfield != 1))

cluster_1_page_rank <- 
  cluster_1 |> 
  set.vertex.attribute(name = "page_rank", 
                       value = page_rank(cluster_1)$vector)

cluster_1_df <- 
  tibble(name = V(cluster_1_page_rank)$name,
         full_name = V(cluster_1_page_rank)$full_name,
         page_rank = V(cluster_1_page_rank)$page_rank,
         cluster = V(cluster_1_page_rank)$subfield,)

nodes_full_data |> 
  filter(cluster == 1) |> 
  select(full_name) |> 
  mutate(full_name = str_extract(full_name, SPC %R%  # Regular expressions 
                                   one_or_more(WRD) %R% 
                                   SPC %R% 
                                   one_or_more(or(WRD, ANY_CHAR))),
         full_name = str_remove(full_name, OPEN_PAREN %R% 
                                  repeated(DGT, 4) %R% 
                                  CLOSE_PAREN %R%
                                  one_or_more(or(WRD,ANY_CHAR))),
         full_name = str_trim(full_name))  |> 
  unnest_tokens(output = word, input = full_name) |> # Tokenization
  anti_join(stop_words) |>  # Removing stop words
  filter(word != "doi",
         !str_detect(word, "[0-9]")) |>  # WoS data
  filter(word == str_remove(word, pattern = "citation"),
         word == str_remove(word, pattern = "research"),  # Words removed
         word == str_remove(word, pattern = "analysis"), 
         word == str_remove(word, pattern = "science"),
         word == str_remove(word, pattern = "scientometric"),
         word == str_remove(word, pattern = "management"),
         word == str_remove(word, pattern = "bibliometric"),
         word == str_remove(word, pattern = "review"),
         word == str_remove(word, pattern = "journal")) |>
  count(word, sort = TRUE) |> 
  with(wordcloud(word, 
                 n, 
                 random.order = FALSE, 
                 max.words = 50, 
                 colors=pal))
Joining, by = "word"
Warning in wordcloud(word, n, random.order = FALSE, max.words = 50, colors = pal) :
  performance could not be fit on page. It will not be plotted.

Cluster 2

cluster_2 <- 
  wos_scopus_citation_network |> 
  delete.vertices(which(V(wos_scopus_citation_network)$subfield != 2))

cluster_2_page_rank <- 
  cluster_2 |> 
  set.vertex.attribute(name = "page_rank", 
                       value = page_rank(cluster_2)$vector)

cluster_2_df <- 
  tibble(name = V(cluster_2_page_rank)$name,
         full_name = V(cluster_2_page_rank)$full_name,
         page_rank = V(cluster_2_page_rank)$page_rank,
         cluster = V(cluster_2_page_rank)$subfield,)

nodes_full_data |> 
  filter(cluster == 2) |> 
  select(full_name) |> 
  mutate(full_name = str_extract(full_name, SPC %R%  # Regular expressions 
                                   one_or_more(WRD) %R% 
                                   SPC %R% 
                                   one_or_more(or(WRD, ANY_CHAR))),
         full_name = str_remove(full_name, OPEN_PAREN %R% 
                                  repeated(DGT, 4) %R% 
                                  CLOSE_PAREN %R%
                                  one_or_more(or(WRD,ANY_CHAR))),
         full_name = str_trim(full_name))  |> 
  unnest_tokens(output = word, input = full_name) |> 
  anti_join(stop_words) |>
  filter(word != "doi",
         !str_detect(word, "[0-9]")) |>  # WoS data
  filter(word == str_remove(word, pattern = "citation"),
         word == str_remove(word, pattern = "research"), 
         word == str_remove(word, pattern = "analysis"), 
         word == str_remove(word, pattern = "science"),
         word == str_remove(word, pattern = "scientometric"),
         word == str_remove(word, pattern = "vulnerability")) |>
  count(word, sort = TRUE) |> 
  with(wordcloud(word, 
                 n, 
                 random.order = FALSE, 
                 max.words = 50, 
                 colors=pal))
Joining, by = "word"

Cluster 3


cluster_3 <- 
  wos_scopus_citation_network |> 
  delete.vertices(which(V(wos_scopus_citation_network)$subfield != 3))

cluster_3_page_rank <- 
  cluster_3 |> 
  set.vertex.attribute(name = "page_rank", 
                       value = page_rank(cluster_3)$vector)

cluster_3_df <- 
  tibble(name = V(cluster_3_page_rank)$name,
         full_name = V(cluster_3_page_rank)$full_name,
         page_rank = V(cluster_3_page_rank)$page_rank,
         cluster = V(cluster_3_page_rank)$subfield,)

nodes_full_data |> 
  filter(cluster == 3) |> 
  select(full_name) |> 
  mutate(full_name = str_extract(full_name, SPC %R%  # Regular expressions 
                                   one_or_more(WRD) %R% 
                                   SPC %R% 
                                   one_or_more(or(WRD, ANY_CHAR))),
         full_name = str_remove(full_name, OPEN_PAREN %R% 
                                  repeated(DGT, 4) %R% 
                                  CLOSE_PAREN %R%
                                  one_or_more(or(WRD,ANY_CHAR))),
         full_name = str_trim(full_name))  |> 
  unnest_tokens(output = word, input = full_name) |> 
  anti_join(stop_words) |>
  filter(word != "doi",
         !str_detect(word, "[0-9]")) |>  # WoS data 
  filter(word == str_remove(word, pattern = "citation"),
         word == str_remove(word, pattern = "research"),
         word == str_remove(word, pattern = "analysis"),
         word == str_remove(word, pattern = "science"),
         word == str_remove(word, pattern = "scientometric"),
         word == str_remove(word, pattern = "vulnerability"),
         word == str_remove(word, pattern = "journal"),
         word == str_remove(word, pattern = "information")) |>
  count(word, sort = TRUE) |> 
  with(wordcloud(word, 
                 n, 
                 random.order = FALSE, 
                 max.words = 50, 
                 colors=pal))
Joining, by = "word"

Cluster 4


cluster_4 <- 
  wos_scopus_citation_network |> 
  delete.vertices(which(V(wos_scopus_citation_network)$subfield != 4))

cluster_4_page_rank <- 
  cluster_4 |> 
  set.vertex.attribute(name = "page_rank", 
                       value = page_rank(cluster_4)$vector)

cluster_4_df <- 
  tibble(name = V(cluster_4_page_rank)$name,
         full_name = V(cluster_4_page_rank)$full_name,
         page_rank = V(cluster_4_page_rank)$page_rank,
         cluster = V(cluster_4_page_rank)$subfield,)

nodes_full_data |> 
  filter(cluster == 4) |> 
  select(full_name) |> 
  mutate(full_name = str_extract(full_name, SPC %R%  # Regular expressions 
                                   one_or_more(WRD) %R% 
                                   SPC %R% 
                                   one_or_more(or(WRD, ANY_CHAR))),
         full_name = str_remove(full_name, OPEN_PAREN %R% 
                                  repeated(DGT, 4) %R% 
                                  CLOSE_PAREN %R%
                                  one_or_more(or(WRD,ANY_CHAR))),
         full_name = str_trim(full_name))  |> 
  unnest_tokens(output = word, input = full_name) |> 
  anti_join(stop_words) |> 
  filter(word != "doi",
         !str_detect(word, "[0-9]")) |>  # WoS data
  filter(word == str_remove(word, pattern = "citation"),
         word == str_remove(word, pattern = "research"), 
         word == str_remove(word, pattern = "analysis"), 
         word == str_remove(word, pattern = "science"),
         word == str_remove(word, pattern = "scientometric"),
         word == str_remove(word, pattern = "vulnerability")) |>
  count(word, sort = TRUE) |> 
  with(wordcloud(word, 
                 n, 
                 random.order = FALSE, 
                 max.words = 50, 
                 colors=pal))
Joining, by = "word"
Warning in wordcloud(word, n, random.order = FALSE, max.words = 50, colors = pal) :
  university could not be fit on page. It will not be plotted.
Warning in wordcloud(word, n, random.order = FALSE, max.words = 50, colors = pal) :
  academic could not be fit on page. It will not be plotted.
Warning in wordcloud(word, n, random.order = FALSE, max.words = 50, colors = pal) :
  universities could not be fit on page. It will not be plotted.
Warning in wordcloud(word, n, random.order = FALSE, max.words = 50, colors = pal) :
  education could not be fit on page. It will not be plotted.
Warning in wordcloud(word, n, random.order = FALSE, max.words = 50, colors = pal) :
  performance could not be fit on page. It will not be plotted.

Exporting files


write_csv(wos_scopus_tos$df, "wos_scopus_tos.csv") # Exporting all data merged

write_csv(table_1, "table_1.csv") # Exporting table 1
write_csv(wos_scopus_total_country, "table_2_.csv")  # Exporting table 2
write_csv(wos_scopus_authors, "table_3.csv") # Exporting table 3
write_csv(wos_scopus_total_journal, "table_4.csv") # Exporting table 4


write_csv(languages, "figure_1.csv") # Exporting data figure 1 
write_csv(figure_2_data, "figure_2.csv") # Exporting data figure 2

write.graph(wos_scopus_citation_network, "citation_network_full.graphml", "graphml") # Exporting graph
write.graph(wos_scopus_citation_network_clusters, 
            "wos_scopus_citation_network_clusters.graphml", 
            "graphml")

aca_graphml_nodes <- 
  aca_tbl_graph_filtered |> 
  activate(nodes) |> 
  as_tibble() |> 
  rename(author = name) |> 
  rownames_to_column("name")

aca_graphml_edges <- 
  aca_tbl_graph_filtered |> 
  activate(edges) |> 
  as_tibble() 

aca_graphml <- 
  graph_from_data_frame(d = aca_graphml_edges, 
                        directed = FALSE, 
                        vertices = aca_graphml_nodes)

write_graph(aca_graphml, "aca_graph.graphml", "graphml") # Export author co-citation graph

author_collab_graphml_nodes <- 
  author_collab_tbl_graph_filtered |> 
  activate(nodes) |> 
  as_tibble() |> 
  rename(author = name) |> 
  rownames_to_column("name")

author_collab_graphml_edges <- 
  author_collab_tbl_graph_filtered |> 
  activate(edges) |> 
  as_tibble() 

author_collab_graphml <- 
  graph_from_data_frame(d = author_collab_graphml_edges, 
                        directed = FALSE, 
                        vertices = author_collab_graphml_nodes)

write_graph(author_collab_graphml, "author_collab_graphml.graphml", "graphml") # Export author co-citation graph

country_collab_graphml_nodes <- 
  country_collab_tbl_graph_filtered |> 
  activate(nodes) |> 
  as_tibble() |> 
  rename(author = name) |> 
  rownames_to_column("name")

country_collab_graphml_edges <- 
  country_collab_tbl_graph_filtered |> 
  activate(edges) |> 
  as_tibble() 

country_collab_graphml <- 
  graph_from_data_frame(d = country_collab_graphml_edges, 
                        directed = FALSE, 
                        vertices = country_collab_graphml_nodes)

write_graph(country_collab_graphml, "country_collab_graphml.graphml", "graphml") # Export author co-citation graph

keyword_co_occurrence_graphml_nodes <- 
  keyword_co_occurrence_tbl_graph_filtered |> 
  activate(nodes) |> 
  as_tibble() |> 
  rename(author = name) |> 
  rownames_to_column("name")

keyword_co_occurrence_graphml_edges <- 
  keyword_co_occurrence_tbl_graph_filtered |> 
  activate(edges) |> 
  as_tibble()  

keyword_co_occurrence_graphml <- 
  graph_from_data_frame(d = keyword_co_occurrence_graphml_edges, 
                        directed = FALSE, 
                        vertices = keyword_co_occurrence_graphml_nodes)

write_graph(keyword_co_occurrence_graphml, "keyword_co_occurrence_graphml.graphml", "graphml") # Export author co-citation graph

write.csv(tree_of_science, "tree_of_science.csv") # Exporting Tree of Science

write.csv(cluster_1_df, "cluster_1.csv") # Exporting cluster 1
write.csv(cluster_2_df, "cluster_2.csv") # Exporting cluster 2
write.csv(cluster_3_df, "cluster_3.csv") # Exporting cluster 3
write.csv(cluster_4_df, "cluster_4.csv") # Exporting cluster 4

write.csv(nodes_full_data, "nodes_full_data.csv") # Exporting all nodes
LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCmVkaXRvcl9vcHRpb25zOiAKICBjaHVua19vdXRwdXRfdHlwZTogaW5saW5lCi0tLQoKIyBDcmVhdGluZyB0aGUgZW52aXJvbm1lbnQKCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KHRvc3IpCmxpYnJhcnkoYmlibGlvbWV0cml4KQpsaWJyYXJ5KGx1YnJpZGF0ZSkKbGlicmFyeShpZ3JhcGgpCmxpYnJhcnkodGlkeXRleHQpCmxpYnJhcnkod29yZGNsb3VkKQpsaWJyYXJ5KHJlYnVzKQpsaWJyYXJ5KGdncmVwZWwpICMgaW1wcm92ZSBkb251dCB2aXN1YWxpemF0aW9uCmxpYnJhcnkoZ2dyYXBoKQpsaWJyYXJ5KHZpc05ldHdvcmspIApsaWJyYXJ5KHRpZHlncmFwaCkKYGBgCgpUaGlzIHRlbXBsYXRlIGlzIGJhc2VkIGluIHRoaXMgcGFwZXIKCmh0dHBzOi8vcmV2aXN0YXMudWNtLmVzL2luZGV4LnBocC9SRVZFL2FydGljbGUvdmlldy83NTU2Ni80NTY0NDU2NTU3NDY3CgpGb3IgYSBkZXRhaWwgZXhwbGFuYXRpb24gb2YgaG93IHRvIHVzZSBpdCwgcGxlYXNlIHdhdGNoIHRoaXMgdmlkZW8gCgpodHRwczovL3d3dy55b3V0dWJlLmNvbS93YXRjaD92PWp0S1NpZnZOdlRNCgojIERhdGEgZ2V0dGluZwoKYGBge3J9Cndvc19zY29wdXNfdG9zIDwtIAogIHRvc3I6OnRvc3JfbG9hZCgiU2NvcHVzXzIwMDAuYmliIiwgCiAgICAgICAgICAgICAgICAgICJXb1NfMS50eHQiLCAKICAgICAgICAgICAgICAgICAgIldvU18yLnR4dCIsCiAgICAgICAgICAgICAgICAgICJXb1NfMy50eHQiKQoKdHJlZV9vZl9zY2llbmNlIDwtIAogIHRvc3I6OnRvc1IoIlNjb3B1c18yMDAwLmJpYiIsIAogICAgICAgICAgICAgICAgICAiV29TXzEudHh0IiwgCiAgICAgICAgICAgICAgICAgICJXb1NfMi50eHQiLAogICAgICAgICAgICAgICAgICAiV29TXzMudHh0IikKCndvcyA8LSAKICBiaWJsaW9tZXRyaXg6OmNvbnZlcnQyZGYoYygiV29TXzEudHh0IiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIldvU18yLnR4dCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIldvU18zLnR4dCIpKSAgIyBjcmVhdGUgZGF0YWZyYW1lIGZyb20gd29zIGZpbGUKCnNjb3B1cyA8LSAKICBiaWJsaW9tZXRyaXg6OmNvbnZlcnQyZGYoIlNjb3B1c18yMDAwLmJpYiIsICMgQ3JlYXRlIGRhdGFmcmFtZSBmcm9tIHNjb3B1cyBmaWxlCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGRic291cmNlID0gInNjb3B1cyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQgPSAiYmlidGV4IikKYGBgCgojIyBUYWJsZSAxLiBTZWFyY2ggQ3JpdGVyaWEKCmBgYHtyfQp0YWJsZV8xIDwtIAogIHRpYmJsZSh3b3MgPSBsZW5ndGgod29zJFNSKSwgIyBDcmVhdGUgYSBkYXRhZnJhbWUgd2l0aCB0aGUgdmFsdWVzLgogICAgICAgICBzY29wdXMgPSBsZW5ndGgoc2NvcHVzJFNSKSwgCiAgICAgICAgIHRvdGFsID0gbGVuZ3RoKHdvc19zY29wdXNfdG9zJGRmJFNSKSkKdGFibGVfMQpgYGAKCiMjIEZpZ3VyZSAxLiBMYW5ndWFnZXMKCmBgYHtyfQptYWluX2xhbmd1YWdlcyA8LSAKICB3b3Nfc2NvcHVzX3RvcyRkZiB8PiAKICBzZWxlY3QoTEEpIHw+IAogIHNlcGFyYXRlX3Jvd3MoTEEsIHNlcCA9ICI7ICIpIHw+IAogIGNvdW50KExBLCBzb3J0ID0gVFJVRSkgfD4gCiAgc2xpY2UoMTo1KQoKb3RoZXJfbGFuZ3VhZ2VzIDwtIAogIHdvc19zY29wdXNfdG9zJGRmIHw+IAogIHNlcGFyYXRlX3Jvd3MoTEEsIHNlcCA9ICI7ICIpIHw+IAogIHNlbGVjdChMQSkgfD4gCiAgY291bnQoTEEsIHNvcnQgPSBUUlVFKSB8PiAKICBzbGljZSg2Om4pIHw+IAogIHN1bW1hcmlzZShuID0gc3VtKG4pKSB8PiAKICBtdXRhdGUoTEEgPSAiT1RIRVJTIikgfD4gCiAgc2VsZWN0KExBLCBuKQoKbGFuZ3VhZ2VzIDwtIAogIG1haW5fbGFuZ3VhZ2VzIHw+IAogIGJpbmRfcm93cyhvdGhlcl9sYW5ndWFnZXMpIHw+IAogIG11dGF0ZShwZXJjZW50YWdlID0gbiAvIHN1bShuKSwKICAgICAgICAgcGVyY2VudGFnZSA9IHJvdW5kKHBlcmNlbnRhZ2UsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlnaXRzID0gMikgKSB8PiAKICByZW5hbWUobGFuZ3VhZ2UgPSBMQSkgfD4KICBzZWxlY3QobGFuZ3VhZ2UsIHBlcmNlbnRhZ2UsIGNvdW50ID0gbikKCmxhbmd1YWdlcwpgYGAKCgpgYGB7cn0KZGYgPC0gbGFuZ3VhZ2VzIHw+IAogIHJlbmFtZSh2YWx1ZSA9IHBlcmNlbnRhZ2UsIGdyb3VwID0gbGFuZ3VhZ2UpIHw+CiAgbXV0YXRlKHZhbHVlID0gdmFsdWUgKiAxMDApIHw+IAogIHNlbGVjdCh2YWx1ZSwgZ3JvdXApCgpkZjIgPC0gZGYgJT4lIAogIG11dGF0ZShjc3VtID0gcmV2KGN1bXN1bShyZXYodmFsdWUpKSksIAogICAgICAgICBwb3MgPSB2YWx1ZS8yICsgbGVhZChjc3VtLCAxKSwKICAgICAgICAgcG9zID0gaWZfZWxzZShpcy5uYShwb3MpLCB2YWx1ZS8yLCBwb3MpKQoKZ2dwbG90KGRmLCBhZXMoeCA9IDIgLCB5ID0gdmFsdWUsIGZpbGwgPSBmY3RfaW5vcmRlcihncm91cCkpKSArCiAgZ2VvbV9jb2wod2lkdGggPSAxLCBjb2xvciA9IDEpICsKICBjb29yZF9wb2xhcih0aGV0YSA9ICJ5IikgKwogIGdlb21fbGFiZWxfcmVwZWwoZGF0YSA9IGRmMiwKICAgICAgICAgICAgICAgICAgIGFlcyh5ID0gcG9zLCBsYWJlbCA9IHBhc3RlMCh2YWx1ZSwgIiUiKSksCiAgICAgICAgICAgICAgICAgICBzaXplID0gNC41LCBudWRnZV94ID0gMSwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKwogIHRoZW1lKHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy5saW5lID0gZWxlbWVudF9ibGFuaygpLCAKICAgICAgICBheGlzLnRleHQgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRpdGxlID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIHNpemUgPSAxOCkpICsKICBsYWJzKHRpdGxlID0gIkxhbmd1YWdlcyIpICsKICBndWlkZXMoZmlsbCA9IGd1aWRlX2xlZ2VuZCh0aXRsZSA9ICIiKSkgKwogIHRoZW1lX3ZvaWQoKSArCiAgeGxpbSgwLjUsIDIuNSkKYGBgCgojIyBGaWd1cmUgMi4gU2NpZW50aWZpYyBQcm9kdWN0aW9uCgpgYGB7cn0Kd29zX2FudWFsX3Byb2R1Y3Rpb24gPC0gCiAgd29zIHw+IAogIHNlbGVjdChQWSkgfD4gCiAgY291bnQoUFksIHNvcnQgPSBUUlVFKSB8PiAKICBuYS5vbWl0KCkgfD4gCiAgZmlsdGVyKFBZID49IDIwMDAsCiAgICAgICAgIFBZIDwgeWVhcih0b2RheSgpKSkgfD4gCiAgbXV0YXRlKHJlZl90eXBlID0gIndvcyIpCgpzY29wdXNfYW51YWxfcHJvZHVjdGlvbiAgPC0gCiAgc2NvcHVzIHw+IAogIHNlbGVjdChQWSkgfD4gCiAgY291bnQoUFksIHNvcnQgPSBUUlVFKSB8PiAKICBuYS5vbWl0KCkgfD4gCiAgZmlsdGVyKFBZID49IDIwMDAsCiAgICAgICAgIFBZIDwgeWVhcih0b2RheSgpKSkgfD4KICBtdXRhdGUocmVmX3R5cGUgPSAic2NvcHVzIikKCnRvdGFsX2FudWFsX3Byb2R1Y3Rpb24gPC0gCiAgd29zX3Njb3B1c190b3MkZGYgfD4gCiAgc2VsZWN0KFBZKSB8PiAKICBjb3VudChQWSwgc29ydCA9IFRSVUUpIHw+IAogIG5hLm9taXQoKSB8PiAKICBmaWx0ZXIoUFkgPj0gMjAwMCwKICAgICAgICAgUFkgPCB5ZWFyKHRvZGF5KCkpKSB8PgogIG11dGF0ZShyZWZfdHlwZSA9ICJ0b3RhbCIpCgp3b3Nfc2NvcHVzX3RvdGFsX2FubnVhbF9wcm9kdWN0aW9uIDwtIAogIHdvc19hbnVhbF9wcm9kdWN0aW9uIHw+IAogIGJpbmRfcm93cyhzY29wdXNfYW51YWxfcHJvZHVjdGlvbiwKICAgICAgICAgICAgdG90YWxfYW51YWxfcHJvZHVjdGlvbikgCgpmaWd1cmVfMl9kYXRhIDwtIAogIHdvc19zY29wdXNfdG90YWxfYW5udWFsX3Byb2R1Y3Rpb24gfD4gCiAgbXV0YXRlKFBZID0gcmVwbGFjZV9uYShQWSwgcmVwbGFjZSA9IDApKSB8PiAKICBwaXZvdF93aWRlcihuYW1lc19mcm9tID0gcmVmX3R5cGUsIAogICAgICAgICAgICAgIHZhbHVlc19mcm9tID0gbikgfD4gCiAgYXJyYW5nZShkZXNjKFBZKSkKCmZpZ3VyZV8yX2RhdGEgCmBgYAoKYGBge3J9Cndvc19zY29wdXNfdG90YWxfYW5udWFsX3Byb2R1Y3Rpb24gfD4gCiAgZ2dwbG90KGFlcyh4ID0gUFksIHkgPSBuLCBjb2xvciA9IHJlZl90eXBlKSkgKwogIGdlb21fbGluZSgpICsKICBsYWJzKHRpdGxlID0gIkFubnVhbCBTY2llbnRpZmljIFByb2R1Y3Rpb24iLCAKICAgICAgIHggPSAieWVhcnMiLAogICAgICAgeSA9ICJwYXBlcnMiKSArCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpIApgYGAKCiMjIFRhYmxlIDIuIENvdW50cnkgcHJvZHVjdGlvbgoKYGBge3J9CmRhdGFfYmlibGlvX3dvcyA8LSBiaWJsaW9BbmFseXNpcyh3b3MpCgp3b3NfY291bnRyeSA8LSAKICBkYXRhX2JpYmxpb193b3MkQ291bnRyaWVzIHw+IAogIGRhdGEuZnJhbWUoKSB8PiAKICBtdXRhdGUoZGF0YWJhc2UgPSAid29zIikgfD4gCiAgc2VsZWN0KGNvdW50cnkgPSBUYWIsIHBhcGVycyA9IEZyZXEsIGRhdGFiYXNlICkgfD4gCiAgYXJyYW5nZShkZXNjKHBhcGVycykpIAoKZGF0YV9iaWJsaW9fc2NvcHVzIDwtIGJpYmxpb0FuYWx5c2lzKHNjb3B1cykKCnNjb3B1c19jb3VudHJ5IDwtIAogIGRhdGFfYmlibGlvX3Njb3B1cyRDb3VudHJpZXMgfD4gCiAgZGF0YS5mcmFtZSgpIHw+IAogIG11dGF0ZShkYXRhYmFzZSA9ICJzY29wdXMiKSB8PiAKICBzZWxlY3QoY291bnRyeSA9IFRhYiwgcGFwZXJzID0gRnJlcSwgZGF0YWJhc2UgKSB8PiAKICBhcnJhbmdlKGRlc2MocGFwZXJzKSkgCgpkYXRhX2JpYmxpb190b3RhbCA8LSBiaWJsaW9BbmFseXNpcyh3b3Nfc2NvcHVzX3RvcyRkZikKCnRvdGFsX2NvdW50cnkgPC0gCiAgZGF0YV9iaWJsaW9fdG90YWwkQ291bnRyaWVzIHw+IAogIGRhdGEuZnJhbWUoKSB8PiAKICBtdXRhdGUoZGF0YWJhc2UgPSAidG90YWwiKSB8PiAKICBzZWxlY3QoY291bnRyeSA9IFRhYiwgcGFwZXJzID0gRnJlcSwgZGF0YWJhc2UgKSB8PiAKICBhcnJhbmdlKGRlc2MocGFwZXJzKSkgCgp3b3Nfc2NvcHVzX3RvdGFsX2NvdW50cnkgPC0gCiAgd29zX2NvdW50cnkgfD4gCiAgYmluZF9yb3dzKHNjb3B1c19jb3VudHJ5LCAKICAgICAgICAgICAgdG90YWxfY291bnRyeSkgfD4gCiAgbXV0YXRlKGNvdW50cnkgPSBhcy5jaGFyYWN0ZXIoY291bnRyeSkpIHw+IAogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBkYXRhYmFzZSwgCiAgICAgICAgICAgICAgdmFsdWVzX2Zyb20gPSBwYXBlcnMpIHw+IAogIGFycmFuZ2UoZGVzYyh0b3RhbCkpIHw+IAogIHNsaWNlKDE6MTApIHw+IAogIG11dGF0ZShwZXJjZW50YWdlID0gdG90YWwgLyAodGFibGVfMSB8PiBwdWxsKHRvdGFsKSksCiAgICAgICAgIHBlcmNlbnRhZ2UgPSByb3VuZChwZXJjZW50YWdlLCBkaWdpdHMgPSAyKSkKCndvc19zY29wdXNfdG90YWxfY291bnRyeQpgYGAKCiMjIFRhYmxlIDMuIEF1dGhvciBwcm9kdWN0aW9uCgpgYGB7cn0Kd29zX2F1dGhvcnMgPC0gCiAgZGF0YV9iaWJsaW9fd29zJEF1dGhvcnMgfD4gCiAgZGF0YS5mcmFtZSgpIHw+IAogIHJlbmFtZShhdXRob3JzX3dvcyA9IEFVLCBwYXBlcnNfd29zID0gRnJlcSkgfD4gCiAgYXJyYW5nZShkZXNjKHBhcGVyc193b3MpKSB8PiAKICBzbGljZSgxOjEwKSB8PiAKICBtdXRhdGUoZGF0YWJhc2Vfd29zID0gIndvcyIpCgoKc2NvcHVzX2F1dGhvcnMgPC0gCiAgZGF0YV9iaWJsaW9fc2NvcHVzJEF1dGhvcnMgfD4gCiAgZGF0YS5mcmFtZSgpIHw+IAogIHJlbmFtZShhdXRob3JzX3Njb3B1cyA9IEFVLCBwYXBlcnNfc2NvcHVzID0gRnJlcSkgfD4gCiAgYXJyYW5nZShkZXNjKHBhcGVyc19zY29wdXMpKSB8PiAKICBzbGljZSgxOjEwKSB8PiAKICBtdXRhdGUoZGF0YWJhc2Vfc2NvcHVzID0gInNjb3B1cyIpCgp0b3RhbF9hdXRob3JzIDwtIAogIGRhdGFfYmlibGlvX3RvdGFsJEF1dGhvcnMgfD4gCiAgZGF0YS5mcmFtZSgpIHw+IAogIHJlbmFtZShhdXRob3JzX3RvdGFsID0gQVUsIAogICAgICAgICBwYXBlcnNfdG90YWwgPSBGcmVxKSB8PiAKICBhcnJhbmdlKGRlc2MocGFwZXJzX3RvdGFsKSkgfD4gCiAgc2xpY2UoMToxMCkgfD4gCiAgbXV0YXRlKGRhdGFiYXNlX3RvdGFsID0gInRvdGFsIikKCndvc19zY29wdXNfYXV0aG9ycyA8LSAKICB3b3NfYXV0aG9ycyB8PiAKICBiaW5kX2NvbHMoc2NvcHVzX2F1dGhvcnMsCiAgICAgICAgICAgIHRvdGFsX2F1dGhvcnMpCgp3b3Nfc2NvcHVzX2F1dGhvcnMKYGBgCgojIyBUYWJsZSA0LiBKb3VybmFsIHByb2R1Y3Rpb24KCmBgYHtyfQp3b3Nfam91cm5hbCA8LSAKICB3b3MgfD4gCiAgc2VsZWN0KGpvdXJuYWwgPSBTTykgfD4gCiAgbmEub21pdCgpIHw+IAogIGNvdW50KGpvdXJuYWwsIHNvcnQgPSBUUlVFKSB8PiAKICBzbGljZSgxOjIwKSB8PiAKICByZW5hbWUocHVibGljYXRpb25zID0gbikgfD4gCiAgbXV0YXRlKGRhdGFiYXNlID0gIndvcyIpCgpzY29wdXNfam91cm5hbCA8LSAKICBzY29wdXMgfD4gCiAgc2VsZWN0KGpvdXJuYWwgPSBTTykgfD4gCiAgbmEub21pdCgpIHw+IAogIGNvdW50KGpvdXJuYWwsIHNvcnQgPSBUUlVFKSB8PiAKICBzbGljZSgxOjIwKSB8PiAKICByZW5hbWUocHVibGljYXRpb25zID0gbikgfD4gCiAgbXV0YXRlKGRhdGFiYXNlID0gInNjb3B1cyIpCgp0b3RhbF9qb3VybmFsIDwtIAogIHdvc19zY29wdXNfdG9zJGRmIHw+IAogIHNlbGVjdChqb3VybmFsID0gU08pIHw+IAogIG5hLm9taXQoKSB8PiAKICBjb3VudChqb3VybmFsLCBzb3J0ID0gVFJVRSkgfD4gCiAgc2xpY2UoMToyMCkgfD4gCiAgcmVuYW1lKHB1YmxpY2F0aW9ucyA9IG4pIHw+IAogIG11dGF0ZShkYXRhYmFzZSA9ICJ0b3RhbCIpCgp3b3Nfc2NvcHVzX3RvdGFsX2pvdXJuYWwgPC0gCiAgd29zX2pvdXJuYWwgfD4gCiAgYmluZF9yb3dzKHNjb3B1c19qb3VybmFsLCAKICAgICAgICAgICAgdG90YWxfam91cm5hbCkgfD4gCiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IGRhdGFiYXNlLCAKICAgICAgICAgICAgICB2YWx1ZXNfZnJvbSA9IHB1YmxpY2F0aW9ucykgfD4gCiAgYXJyYW5nZShkZXNjKHRvdGFsKSkgfD4gCiAgc2xpY2UoMToxMCkgfD4gCiAgbXV0YXRlKHBlcmNlbnRhZ2UgPSB0b3RhbCAvIHRhYmxlXzEgfD4gcHVsbCh0b3RhbCksCiAgICAgICAgIHBlcmNlbnRhZ2UgPSByb3VuZChwZXJjZW50YWdlLCBkaWdpdHMgPSAyKSkKCgp3b3Nfc2NvcHVzX3RvdGFsX2pvdXJuYWwKYGBgCgojIyBGaWd1cmUgMy4gQ28tY2l0YXRpb24gbmV0d29yawoKIyMjIEF1dGhvciBjby1jaXRhdGlvbiBuZXR3b3JrCgpgYGB7cn0Kd29zX3Njb3B1c19hdXRob3JfbWV0YXRhZyA8LSAKICBtZXRhVGFnRXh0cmFjdGlvbih3b3Nfc2NvcHVzX3RvcyRkZiwgRmllbGQgPSAiQ1JfQVUiKQoKd29zX3Njb3B1c19hdXRob3JfY29fY2l0YXRpb25fbWF0cml4IDwtIAogIGJpYmxpb05ldHdvcmsoTSA9IHdvc19zY29wdXNfYXV0aG9yX21ldGF0YWcsIAogICAgICAgICAgICAgICAgYW5hbHlzaXMgPSAiY28tY2l0YXRpb24iLCAKICAgICAgICAgICAgICAgIG5ldHdvcmsgPSAiYXV0aG9ycyIpCgphY2FfdGJsX2dyYXBoIDwtIAogIGdyYXBoX2Zyb21fYWRqYWNlbmN5X21hdHJpeCh3b3Nfc2NvcHVzX2F1dGhvcl9jb19jaXRhdGlvbl9tYXRyaXggLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZSA9ICJ1bmRpcmVjdGVkIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlaWdodGVkID0gVFJVRSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpYWcgPSBGQUxTRSkgfD4gCiAgYXNfdGJsX2dyYXBoKGFjYV9pZ3JhcGgsIGRpcmVjdGVkID0gRkFMU0UgKSB8PiAKICBhY3RpdmF0ZShub2RlcykgfD4gCiAgbXV0YXRlKGRlZ3JlZSA9IGNlbnRyYWxpdHlfZGVncmVlKCkpIHw+IAogIGFycmFuZ2UoZGVzYyhkZWdyZWUpKSB8PiAKICBzbGljZSgxOjMwKQoKd2VpZ2h0X3RibCA8LSAKICBhY2FfdGJsX2dyYXBoIHw+IAogIGFjdGl2YXRlKGVkZ2VzKSB8PiAKICBzZWxlY3Qod2VpZ2h0KSB8PiAKICBhcy5kYXRhLmZyYW1lKCkKCnRocmVzaG9sZCA8LSAKICBxdWFudGlsZSh3ZWlnaHRfdGJsIHw+IAogICAgICAgICAgICAgc2VsZWN0KHdlaWdodCkgfD4gCiAgICAgICAgICAgICBwdWxsKCksIAogICAgICAgICAgIHByb2JzID0gMC44MCkKCmFjYV90YmxfZ3JhcGhfZmlsdGVyZWQgPC0gCiAgYWNhX3RibF9ncmFwaCB8PiAKICBhY3RpdmF0ZShlZGdlcykgfD4gCiAgZmlsdGVyKHdlaWdodCA+PSB0aHJlc2hvbGQpIHw+IAogIGFjdGl2YXRlKG5vZGVzKSB8PiAKICBtdXRhdGUoY29tcG9uZW50cyA9IGdyb3VwX2NvbXBvbmVudHModHlwZSA9ICJ3ZWFrIikpIHw+IAogIGZpbHRlcihjb21wb25lbnRzID09IDEpIHw+IAogIG11dGF0ZShkZWdyZWUgPSBjZW50cmFsaXR5X2RlZ3JlZSgpLAogICAgICAgICBjb21tdW5pdHkgPSBhcy5mYWN0b3IoZ3JvdXBfbG91dmFpbigpKSApCgphY2FfdGJsX2dyYXBoX2ZpbHRlcmVkIHw+IAogIGdncmFwaChsYXlvdXQgPSAia2siKSArIAogIGdlb21fZWRnZV9saW5rKGFscGhhID0gLjI1LCAKICAgICAgICAgICAgICAgICBhZXMod2lkdGggPSB3ZWlnaHQpKSArCiAgZ2VvbV9ub2RlX3BvaW50KGFlcyhjb2xvdXIgPSBjb21tdW5pdHksIAogICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IGRlZ3JlZSkpICsKICBnZW9tX25vZGVfdGV4dChhZXMobGFiZWwgPSBuYW1lKSwgcmVwZWwgPSBUUlVFKSArCiAgdGhlbWVfZ3JhcGgoKQpgYGAKCiMjIyBBdXRob3IgQ29sbGFib3JhdGlvbiBuZXR3b3JrCgpgYGB7cn0Kd29zX3Njb3B1c19hdXRob3JfY29sbGFiX21hdHJpeCA8LSAKICBiaWJsaW9OZXR3b3JrKE0gPSB3b3Nfc2NvcHVzX3RvcyRkZiwgCiAgICAgICAgICAgICAgICBhbmFseXNpcyA9ICJjb2xsYWJvcmF0aW9uIiwgCiAgICAgICAgICAgICAgICBuZXR3b3JrID0gImF1dGhvcnMiKQoKcGxvdF9hdXRob3JfY29sbGFiIDwtIAogIG5ldHdvcmtQbG90KE5ldE1hdHJpeCA9IHdvc19zY29wdXNfYXV0aG9yX2NvbGxhYl9tYXRyaXgsIAogICAgICAgICAgICAgIHdlaWdodGVkPVQsIG4gPSAzMCwgCiAgICAgICAgICAgICAgVGl0bGUgPSAiQXV0aG9yIENvbGxhYm9yYXRpb24gTmV0d29yayIsIAogICAgICAgICAgICAgIHR5cGUgPSAiZnJ1Y2h0ZXJtYW4iLCAKICAgICAgICAgICAgICBzaXplPVQsCiAgICAgICAgICAgICAgZWRnZXNpemUgPSA1LAogICAgICAgICAgICAgIGxhYmVsc2l6ZT0wLjcpCgphdXRob3JfY29sbGFiX3RibF9ncmFwaCA8LSAKICBncmFwaF9mcm9tX2FkamFjZW5jeV9tYXRyaXgod29zX3Njb3B1c19hdXRob3JfY29sbGFiX21hdHJpeCAsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlID0gInVuZGlyZWN0ZWQiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2VpZ2h0ZWQgPSBUUlVFLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlhZyA9IEZBTFNFKSB8PiAKICBhc190YmxfZ3JhcGgoYWNhX2lncmFwaCwgZGlyZWN0ZWQgPSBGQUxTRSApIHw+IAogIGFjdGl2YXRlKG5vZGVzKSB8PiAKICBtdXRhdGUoZGVncmVlID0gY2VudHJhbGl0eV9kZWdyZWUoKSkgfD4gCiAgYXJyYW5nZShkZXNjKGRlZ3JlZSkpIHw+IAogIHNsaWNlKDE6MzApCgphdXRob3JfY29sbGFiX3RibF9ncmFwaF9maWx0ZXJlZCA8LSAKICBhdXRob3JfY29sbGFiX3RibF9ncmFwaCB8PiAKICBhY3RpdmF0ZShlZGdlcykgfD4gCiAgZmlsdGVyKHdlaWdodCA+IDEpIHw+IAogIGFjdGl2YXRlKG5vZGVzKSB8PiAKICBtdXRhdGUoY29tcG9uZW50cyA9IGdyb3VwX2NvbXBvbmVudHModHlwZSA9ICJ3ZWFrIikpIHw+CiAgZmlsdGVyKGNvbXBvbmVudHMgPT0gMSkgfD4KICBtdXRhdGUoZGVncmVlID0gY2VudHJhbGl0eV9kZWdyZWUoKSwKICAgICAgICAgY29tbXVuaXR5ID0gYXMuZmFjdG9yKGdyb3VwX2xvdXZhaW4oKSkgKQoKYXV0aG9yX2NvbGxhYl90YmxfZ3JhcGhfZmlsdGVyZWQgfD4gCiAgZ2dyYXBoKGxheW91dCA9ICJrayIpICsgCiAgZ2VvbV9lZGdlX2xpbmsoYWxwaGEgPSAuMjUsIAogICAgICAgICAgICAgICAgIGFlcyh3aWR0aCA9IHdlaWdodCkpICsKICBnZW9tX25vZGVfcG9pbnQoYWVzKGNvbG91ciA9IGNvbW11bml0eSwgCiAgICAgICAgICAgICAgICAgICAgICBzaXplID0gZGVncmVlKSkgKwogIGdlb21fbm9kZV90ZXh0KGFlcyhsYWJlbCA9IG5hbWUpLCByZXBlbCA9IFRSVUUpICsKICB0aGVtZV9ncmFwaCgpCmBgYAoKIyMjIENvdW50cnkgQ29sbGFib3JhdGlvbiBOZXR3b3JrCgpgYGB7cn0Kd29zX3Njb3B1c19jb3VudHJ5X2NvbGxhYl9tYXRyaXggPC0gCiAgYmlibGlvTmV0d29yayhNID0gd29zX3Njb3B1c190b3MkZGYsIAogICAgICAgICAgICAgICAgYW5hbHlzaXMgPSAiY29sbGFib3JhdGlvbiIsIAogICAgICAgICAgICAgICAgbmV0d29yayA9ICJjb3VudHJpZXMiKQoKcGxvdF9jb3VudHJ5X2NvbGxhYiA8LSAKICBuZXR3b3JrUGxvdCh3b3Nfc2NvcHVzX2NvdW50cnlfY29sbGFiX21hdHJpeCwgCiAgICAgICAgICAgICAgd2VpZ2h0ZWQ9VCwgbiA9IDMwLCAKICAgICAgICAgICAgICBUaXRsZSA9ICJDb3VudHJ5IENvbGxhYm9yYXRpb24gTmV0d29yayIsIAogICAgICAgICAgICAgIHR5cGUgPSAiZnJ1Y2h0ZXJtYW4iLCAKICAgICAgICAgICAgICBzaXplPVQsCiAgICAgICAgICAgICAgZWRnZXNpemUgPSA1LAogICAgICAgICAgICAgIGxhYmVsc2l6ZT0wLjcpCgpjb3VudHJ5X2NvbGxhYl90YmxfZ3JhcGggPC0gCiAgZ3JhcGhfZnJvbV9hZGphY2VuY3lfbWF0cml4KHdvc19zY29wdXNfY291bnRyeV9jb2xsYWJfbWF0cml4ICwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGUgPSAidW5kaXJlY3RlZCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWlnaHRlZCA9IFRSVUUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWFnID0gRkFMU0UpIHw+IAogIGFzX3RibF9ncmFwaChhY2FfaWdyYXBoLCBkaXJlY3RlZCA9IEZBTFNFICkgfD4gCiAgYWN0aXZhdGUobm9kZXMpIHw+IAogIG11dGF0ZShkZWdyZWUgPSBjZW50cmFsaXR5X2RlZ3JlZSgpKSB8PiAKICBhcnJhbmdlKGRlc2MoZGVncmVlKSkgfD4gCiAgc2xpY2UoMTozMCkKCmNvdW50cnlfY29sbGFiX3RibF9ncmFwaF9maWx0ZXJlZCA8LSAKICBjb3VudHJ5X2NvbGxhYl90YmxfZ3JhcGggfD4gCiAgYWN0aXZhdGUobm9kZXMpIHw+IAogIG11dGF0ZShjb21wb25lbnRzID0gZ3JvdXBfY29tcG9uZW50cyh0eXBlID0gIndlYWsiKSkgfD4KICBmaWx0ZXIoY29tcG9uZW50cyA9PSAxKSB8PgogIG11dGF0ZShkZWdyZWUgPSBjZW50cmFsaXR5X2RlZ3JlZSgpLAogICAgICAgICBjb21tdW5pdHkgPSBhcy5mYWN0b3IoZ3JvdXBfbG91dmFpbigpKSApCgpjb3VudHJ5X2NvbGxhYl90YmxfZ3JhcGhfZmlsdGVyZWQgfD4gCiAgZ2dyYXBoKGxheW91dCA9ICJrayIpICsgCiAgZ2VvbV9lZGdlX2xpbmsoYWxwaGEgPSAuMjUsIAogICAgICAgICAgICAgICAgIGFlcyh3aWR0aCA9IHdlaWdodCkpICsKICBnZW9tX25vZGVfcG9pbnQoYWVzKGNvbG91ciA9IGNvbW11bml0eSwgCiAgICAgICAgICAgICAgICAgICAgICBzaXplID0gZGVncmVlKSkgKwogIGdlb21fbm9kZV90ZXh0KGFlcyhsYWJlbCA9IG5hbWUpLCByZXBlbCA9IFRSVUUpICsKICB0aGVtZV9ncmFwaCgpCmBgYAoKIyMjIEtleXdvcmQgY28tb2NjdXJyZW5jZSBuZXR3b3JrCgpgYGB7cn0Kd29zX3Njb3B1c19rZXl3b3JkX2NvX29jY3VycmVuY2VfbWF0cml4IDwtIAogIGJpYmxpb05ldHdvcmsoTSA9IHdvc19zY29wdXNfdG9zJGRmLCAKICAgICAgICAgICAgICAgIGFuYWx5c2lzID0gImNvLW9jY3VycmVuY2VzIiwgCiAgICAgICAgICAgICAgICBuZXR3b3JrID0gImtleXdvcmRzIiwgCiAgICAgICAgICAgICAgICBzZXAgPSAiOyIpCgpwbG90X25ldF9jb19vY2N1cnJlbmNlIDwtIAogIG5ldHdvcmtQbG90KHdvc19zY29wdXNfa2V5d29yZF9jb19vY2N1cnJlbmNlX21hdHJpeCwgCiAgICAgICAgICAgICAgd2VpZ2h0ZWQ9VCwgbiA9IDMwLCAKICAgICAgICAgICAgICBUaXRsZSA9ICJLZXl3b3JkIENvLW9jY3VycmVuY2UgTmV0d29yayIsIAogICAgICAgICAgICAgIHR5cGUgPSAiZnJ1Y2h0ZXJtYW4iLCAKICAgICAgICAgICAgICBzaXplPVQsCiAgICAgICAgICAgICAgZWRnZXNpemUgPSA1LAogICAgICAgICAgICAgIGxhYmVsc2l6ZT0wLjcpCgprZXl3b3JkX2NvX29jY3VycmVuY2VfdGJsX2dyYXBoIDwtIAogIGdyYXBoX2Zyb21fYWRqYWNlbmN5X21hdHJpeCh3b3Nfc2NvcHVzX2tleXdvcmRfY29fb2NjdXJyZW5jZV9tYXRyaXggLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZSA9ICJ1bmRpcmVjdGVkIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlaWdodGVkID0gVFJVRSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpYWcgPSBGQUxTRSkgfD4gCiAgYXNfdGJsX2dyYXBoKGFjYV9pZ3JhcGgsIGRpcmVjdGVkID0gRkFMU0UgKSB8PiAKICBhY3RpdmF0ZShub2RlcykgfD4gCiAgbXV0YXRlKGRlZ3JlZSA9IGNlbnRyYWxpdHlfZGVncmVlKCkpIHw+IAogIGFycmFuZ2UoZGVzYyhkZWdyZWUpKSB8PiAKICBzbGljZSgxOjMwKQoKa2V5d29yZF9jb19vY2N1cnJlbmNlX3dlaWdodF90YmwgPC0gCiAga2V5d29yZF9jb19vY2N1cnJlbmNlX3RibF9ncmFwaCB8PiAKICBhY3RpdmF0ZShlZGdlcykgfD4gCiAgc2VsZWN0KHdlaWdodCkgfD4gCiAgYXMuZGF0YS5mcmFtZSgpCgp0aHJlc2hvbGQgPC0gCiAgcXVhbnRpbGUoa2V5d29yZF9jb19vY2N1cnJlbmNlX3dlaWdodF90YmwgfD4gCiAgICAgICAgICAgICBzZWxlY3Qod2VpZ2h0KSB8PiAKICAgICAgICAgICAgIHB1bGwoKSwgCiAgICAgICAgICAgcHJvYnMgPSAwLjgwKQoKa2V5d29yZF9jb19vY2N1cnJlbmNlX3RibF9ncmFwaF9maWx0ZXJlZCA8LSAKICBrZXl3b3JkX2NvX29jY3VycmVuY2VfdGJsX2dyYXBoIHw+IAogIGFjdGl2YXRlKGVkZ2VzKSB8PiAKICBmaWx0ZXIod2VpZ2h0ID49IHRocmVzaG9sZCkgfD4gCiAgYWN0aXZhdGUobm9kZXMpIHw+IAogIG11dGF0ZShjb21wb25lbnRzID0gZ3JvdXBfY29tcG9uZW50cyh0eXBlID0gIndlYWsiKSkgfD4gCiAgZmlsdGVyKGNvbXBvbmVudHMgPT0gMSkgfD4gCiAgbXV0YXRlKGRlZ3JlZSA9IGNlbnRyYWxpdHlfZGVncmVlKCksCiAgICAgICAgIGNvbW11bml0eSA9IGFzLmZhY3Rvcihncm91cF9sb3V2YWluKCkpICkKCmtleXdvcmRfY29fb2NjdXJyZW5jZV90YmxfZ3JhcGhfZmlsdGVyZWQgfD4gCiAgZ2dyYXBoKGxheW91dCA9ICJrayIpICsgCiAgZ2VvbV9lZGdlX2xpbmsoYWxwaGEgPSAuMjUsIAogICAgICAgICAgICAgICAgIGFlcyh3aWR0aCA9IHdlaWdodCkpICsKICBnZW9tX25vZGVfcG9pbnQoYWVzKGNvbG91ciA9IGNvbW11bml0eSwgCiAgICAgICAgICAgICAgICAgICAgICBzaXplID0gZGVncmVlKSkgKwogIGdlb21fbm9kZV90ZXh0KGFlcyhsYWJlbCA9IG5hbWUpLCByZXBlbCA9IFRSVUUpICsKICB0aGVtZV9ncmFwaCgpCmBgYAoKIyMgRmlndXJlIDQuIFRyZWUgb2YgU2NpZW5jZQoKIyMjIFRyZWUgb2YgU2NpZW5jZQoKYGBge3J9CnRyZWVfb2Zfc2NpZW5jZQpgYGAKCiMjIyBDbHVzdGVyaW5nIGFuYWx5c2lzCgpGaW5kaW5nIHRoZSBjbHVzdGVycwoKYGBge3J9Cm5vZGVzIDwtICAjIENyZWF0ZSBhIGRhdGFmcmFtZSB3aXRoIHRoZSBmdWxsbmFtZSBvZiBhcnRpY2xlcyAKICB0aWJibGUobmFtZSA9IFYod29zX3Njb3B1c190b3MkZ3JhcGgpJG5hbWUpIHw+IAogIGxlZnRfam9pbih3b3Nfc2NvcHVzX3RvcyRub2RlcywgCiAgICAgICAgICAgIGJ5ID0gYygibmFtZSIgPSAiSURfVE9TIikpCgp3b3Nfc2NvcHVzX2NpdGF0aW9uX25ldHdvcmtfMSA8LSAjIEFkZCB0aGUgYXJ0aWNsZSBuYW1lcyB0byB0aGUgY2l0YXRpb24gbmV0d29yawogIHdvc19zY29wdXNfdG9zJGdyYXBoIHw+IAogIGlncmFwaDo6c2V0LnZlcnRleC5hdHRyaWJ1dGUobmFtZSA9ICJmdWxsX25hbWUiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4ID0gVih3b3Nfc2NvcHVzX3RvcyRncmFwaCkkbmFtZSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IG5vZGVzJENJVEUpCgpub2Rlc18xIDwtICMgQ3JlYXRlIGEgZGF0YWZyYW1lIHdpdGggc3ViZmllbGRzIChjbHVzdGVycykKICB0aWJibGUobmFtZSA9IFYod29zX3Njb3B1c19jaXRhdGlvbl9uZXR3b3JrXzEpJG5hbWUsCiAgICAgICAgIGNsdXN0ZXIgPSBWKHdvc19zY29wdXNfY2l0YXRpb25fbmV0d29ya18xKSRzdWJmaWVsZCwKICAgICAgICAgZnVsbF9uYW1lID0gVih3b3Nfc2NvcHVzX2NpdGF0aW9uX25ldHdvcmtfMSkkZnVsbF9uYW1lKQoKbm9kZXNfMiA8LSAjIENvdW50IHRoZSBudW1iZXIgb2YgYXJ0aWNsZXMgcGVyIGNsdXN0ZXIKICBub2Rlc18xIHw+IAogIGNvdW50KGNsdXN0ZXIsIHNvcnQgPSBUUlVFKSB8PiAKICBtdXRhdGUoY2x1c3Rlcl8xID0gcm93X251bWJlcigpKSB8PiAKICBzZWxlY3QoY2x1c3RlciwgY2x1c3Rlcl8xKQoKbm9kZXNfMyA8LSAKICBub2Rlc18xIHw+IAogIGxlZnRfam9pbihub2Rlc18yKSB8PiAKICByZW5hbWUoc3ViZmllbGQgPSBjbHVzdGVyXzEpIHw+IAogIHNlbGVjdChuYW1lLCBmdWxsX25hbWUsIHN1YmZpZWxkKQoKZWRnZV9saXN0IDwtIAogIGdldC5lZGdlbGlzdCh3b3Nfc2NvcHVzX2NpdGF0aW9uX25ldHdvcmtfMSkgfD4gCiAgZGF0YS5mcmFtZSgpIHw+IAogIHJlbmFtZShTb3VyY2UgPSBYMSwgVGFyZ2V0ID0gWDIpCgp3b3Nfc2NvcHVzX2NpdGF0aW9uX25ldHdvcmsgPC0gCiAgZ3JhcGguZGF0YS5mcmFtZShkID0gZWRnZV9saXN0LCAKICAgICAgICAgICAgICAgICAgIGRpcmVjdGVkID0gVFJVRSwgCiAgICAgICAgICAgICAgICAgICB2ZXJ0aWNlcyA9IG5vZGVzXzMpCgp3b3Nfc2NvcHVzX2NpdGF0aW9uX25ldHdvcmsgfD4gCiAgc3VtbWFyeSgpCmBgYAoKQ2hvb3NpbmcgY2x1c3RlcnMKCldlIHByb3Bvc2VkIHRoZSB0aXBwaW5nIHBvaW50IG9wdGlvbiB0byBjaG9vc2UgdGhlIG51bWJlciBvZiBjbHVzdGVycy4gU2VlIHRoaXMgcGFwZXI6CgpodHRwczovL3d3dy5uYXR1cmUuY29tL2FydGljbGVzL3M0MTU5OC0wMjEtODUwNDEtOAoKYGBge3J9CmNsdXN0ZXJzIDwtIAogIHRpYmJsZShjbHVzdGVyID0gVih3b3Nfc2NvcHVzX2NpdGF0aW9uX25ldHdvcmspJHN1YmZpZWxkKSB8PiAKICBjb3VudChjbHVzdGVyLCBzb3J0ID0gVFJVRSkKCmNsdXN0ZXJzIHw+IAogIGdncGxvdChhZXMoeCA9IHJlb3JkZXIoY2x1c3RlciwgbiksIHkgPSBuKSkgKwogIGdlb21fcG9pbnQoc2l6ZSA9IDMpICsKICBsYWJzKHggPSAiQ2x1c3RlcnMiLCB5ID0gIk51bWJlciBvZiBwYXBlcnMiKSArCiAgdGhlbWUoYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNiAsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYW1pbHkgPSAgIkFyaWFsIiksCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNiwgZmFtaWx5ID0gIkFyaWFsIiksCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyLCBmYW1pbHkgPSAiQXJpYWwiKSwgCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyLCBmYW1pbHkgPSAiQXJpYWwiKSkKYGBgCgpSZW1vdmluZyBub3QgY2hvc2VuIGNsdXN0ZXJzCgpgYGB7cn0Kd29zX3Njb3B1c19jaXRhdGlvbl9uZXR3b3JrX2NsdXN0ZXJzIDwtIAogIHdvc19zY29wdXNfY2l0YXRpb25fbmV0d29yayB8PiAKICBkZWxldGUudmVydGljZXMod2hpY2goVih3b3Nfc2NvcHVzX2NpdGF0aW9uX25ldHdvcmspJHN1YmZpZWxkICE9IDEgJiAjIGZpbHRlciBjbHVzdGVycyAKICAgICAgICAgICAgICAgICAgICAgICAgICBWKHdvc19zY29wdXNfY2l0YXRpb25fbmV0d29yaykkc3ViZmllbGQgIT0gMiAmCiAgICAgICAgICAgICAgICAgICAgICAgICAgVih3b3Nfc2NvcHVzX2NpdGF0aW9uX25ldHdvcmspJHN1YmZpZWxkICE9IDMgICYKICAgICAgICAgICAgICAgICAgICAgICAgICBWKHdvc19zY29wdXNfY2l0YXRpb25fbmV0d29yaykkc3ViZmllbGQgIT0gNCkpCgp3b3Nfc2NvcHVzX2NpdGF0aW9uX25ldHdvcmtfY2x1c3RlcnMgfD4gCiAgc3VtbWFyeSgpCmBgYAoKIyMjIENsdXN0ZXIgMQoKYGBge3J9CnBhbCA8LSBicmV3ZXIucGFsKDgsIkRhcmsyIikKCm5vZGVzX2Z1bGxfZGF0YSA8LSAKICB0aWJibGUobmFtZSA9IFYod29zX3Njb3B1c19jaXRhdGlvbl9uZXR3b3JrKSRuYW1lLAogICAgICAgICBjbHVzdGVyID0gVih3b3Nfc2NvcHVzX2NpdGF0aW9uX25ldHdvcmspJHN1YmZpZWxkLAogICAgICAgICBmdWxsX25hbWUgPSBWKHdvc19zY29wdXNfY2l0YXRpb25fbmV0d29yaykkZnVsbF9uYW1lKQoKY2x1c3Rlcl8xIDwtIAogIHdvc19zY29wdXNfY2l0YXRpb25fbmV0d29yayB8PiAKICBkZWxldGUudmVydGljZXMod2hpY2goVih3b3Nfc2NvcHVzX2NpdGF0aW9uX25ldHdvcmspJHN1YmZpZWxkICE9IDEpKQoKY2x1c3Rlcl8xX3BhZ2VfcmFuayA8LSAKICBjbHVzdGVyXzEgfD4gCiAgc2V0LnZlcnRleC5hdHRyaWJ1dGUobmFtZSA9ICJwYWdlX3JhbmsiLCAKICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHBhZ2VfcmFuayhjbHVzdGVyXzEpJHZlY3RvcikKCmNsdXN0ZXJfMV9kZiA8LSAKICB0aWJibGUobmFtZSA9IFYoY2x1c3Rlcl8xX3BhZ2VfcmFuaykkbmFtZSwKICAgICAgICAgZnVsbF9uYW1lID0gVihjbHVzdGVyXzFfcGFnZV9yYW5rKSRmdWxsX25hbWUsCiAgICAgICAgIHBhZ2VfcmFuayA9IFYoY2x1c3Rlcl8xX3BhZ2VfcmFuaykkcGFnZV9yYW5rLAogICAgICAgICBjbHVzdGVyID0gVihjbHVzdGVyXzFfcGFnZV9yYW5rKSRzdWJmaWVsZCwpCgpub2Rlc19mdWxsX2RhdGEgfD4gCiAgZmlsdGVyKGNsdXN0ZXIgPT0gMSkgfD4gCiAgc2VsZWN0KGZ1bGxfbmFtZSkgfD4gCiAgbXV0YXRlKGZ1bGxfbmFtZSA9IHN0cl9leHRyYWN0KGZ1bGxfbmFtZSwgU1BDICVSJSAgIyBSZWd1bGFyIGV4cHJlc3Npb25zIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uZV9vcl9tb3JlKFdSRCkgJVIlIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNQQyAlUiUgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25lX29yX21vcmUob3IoV1JELCBBTllfQ0hBUikpKSwKICAgICAgICAgZnVsbF9uYW1lID0gc3RyX3JlbW92ZShmdWxsX25hbWUsIE9QRU5fUEFSRU4gJVIlIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwZWF0ZWQoREdULCA0KSAlUiUgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDTE9TRV9QQVJFTiAlUiUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uZV9vcl9tb3JlKG9yKFdSRCxBTllfQ0hBUikpKSwKICAgICAgICAgZnVsbF9uYW1lID0gc3RyX3RyaW0oZnVsbF9uYW1lKSkgIHw+IAogIHVubmVzdF90b2tlbnMob3V0cHV0ID0gd29yZCwgaW5wdXQgPSBmdWxsX25hbWUpIHw+ICMgVG9rZW5pemF0aW9uCiAgYW50aV9qb2luKHN0b3Bfd29yZHMpIHw+ICAjIFJlbW92aW5nIHN0b3Agd29yZHMKICBmaWx0ZXIod29yZCAhPSAiZG9pIiwKICAgICAgICAgIXN0cl9kZXRlY3Qod29yZCwgIlswLTldIikpIHw+ICAjIFdvUyBkYXRhCiAgZmlsdGVyKHdvcmQgPT0gc3RyX3JlbW92ZSh3b3JkLCBwYXR0ZXJuID0gImNpdGF0aW9uIiksCiAgICAgICAgIHdvcmQgPT0gc3RyX3JlbW92ZSh3b3JkLCBwYXR0ZXJuID0gInJlc2VhcmNoIiksICAjIFdvcmRzIHJlbW92ZWQKICAgICAgICAgd29yZCA9PSBzdHJfcmVtb3ZlKHdvcmQsIHBhdHRlcm4gPSAiYW5hbHlzaXMiKSwgCiAgICAgICAgIHdvcmQgPT0gc3RyX3JlbW92ZSh3b3JkLCBwYXR0ZXJuID0gInNjaWVuY2UiKSwKICAgICAgICAgd29yZCA9PSBzdHJfcmVtb3ZlKHdvcmQsIHBhdHRlcm4gPSAic2NpZW50b21ldHJpYyIpLAogICAgICAgICB3b3JkID09IHN0cl9yZW1vdmUod29yZCwgcGF0dGVybiA9ICJtYW5hZ2VtZW50IiksCiAgICAgICAgIHdvcmQgPT0gc3RyX3JlbW92ZSh3b3JkLCBwYXR0ZXJuID0gImJpYmxpb21ldHJpYyIpLAogICAgICAgICB3b3JkID09IHN0cl9yZW1vdmUod29yZCwgcGF0dGVybiA9ICJyZXZpZXciKSwKICAgICAgICAgd29yZCA9PSBzdHJfcmVtb3ZlKHdvcmQsIHBhdHRlcm4gPSAiam91cm5hbCIpKSB8PgogIGNvdW50KHdvcmQsIHNvcnQgPSBUUlVFKSB8PiAKICB3aXRoKHdvcmRjbG91ZCh3b3JkLCAKICAgICAgICAgICAgICAgICBuLCAKICAgICAgICAgICAgICAgICByYW5kb20ub3JkZXIgPSBGQUxTRSwgCiAgICAgICAgICAgICAgICAgbWF4LndvcmRzID0gNTAsIAogICAgICAgICAgICAgICAgIGNvbG9ycz1wYWwpKQpgYGAKCiMjIyBDbHVzdGVyIDIKCmBgYHtyfQpjbHVzdGVyXzIgPC0gCiAgd29zX3Njb3B1c19jaXRhdGlvbl9uZXR3b3JrIHw+IAogIGRlbGV0ZS52ZXJ0aWNlcyh3aGljaChWKHdvc19zY29wdXNfY2l0YXRpb25fbmV0d29yaykkc3ViZmllbGQgIT0gMikpCgpjbHVzdGVyXzJfcGFnZV9yYW5rIDwtIAogIGNsdXN0ZXJfMiB8PiAKICBzZXQudmVydGV4LmF0dHJpYnV0ZShuYW1lID0gInBhZ2VfcmFuayIsIAogICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gcGFnZV9yYW5rKGNsdXN0ZXJfMikkdmVjdG9yKQoKY2x1c3Rlcl8yX2RmIDwtIAogIHRpYmJsZShuYW1lID0gVihjbHVzdGVyXzJfcGFnZV9yYW5rKSRuYW1lLAogICAgICAgICBmdWxsX25hbWUgPSBWKGNsdXN0ZXJfMl9wYWdlX3JhbmspJGZ1bGxfbmFtZSwKICAgICAgICAgcGFnZV9yYW5rID0gVihjbHVzdGVyXzJfcGFnZV9yYW5rKSRwYWdlX3JhbmssCiAgICAgICAgIGNsdXN0ZXIgPSBWKGNsdXN0ZXJfMl9wYWdlX3JhbmspJHN1YmZpZWxkLCkKCm5vZGVzX2Z1bGxfZGF0YSB8PiAKICBmaWx0ZXIoY2x1c3RlciA9PSAyKSB8PiAKICBzZWxlY3QoZnVsbF9uYW1lKSB8PiAKICBtdXRhdGUoZnVsbF9uYW1lID0gc3RyX2V4dHJhY3QoZnVsbF9uYW1lLCBTUEMgJVIlICAjIFJlZ3VsYXIgZXhwcmVzc2lvbnMgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25lX29yX21vcmUoV1JEKSAlUiUgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1BDICVSJSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmVfb3JfbW9yZShvcihXUkQsIEFOWV9DSEFSKSkpLAogICAgICAgICBmdWxsX25hbWUgPSBzdHJfcmVtb3ZlKGZ1bGxfbmFtZSwgT1BFTl9QQVJFTiAlUiUgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBlYXRlZChER1QsIDQpICVSJSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENMT1NFX1BBUkVOICVSJQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25lX29yX21vcmUob3IoV1JELEFOWV9DSEFSKSkpLAogICAgICAgICBmdWxsX25hbWUgPSBzdHJfdHJpbShmdWxsX25hbWUpKSAgfD4gCiAgdW5uZXN0X3Rva2VucyhvdXRwdXQgPSB3b3JkLCBpbnB1dCA9IGZ1bGxfbmFtZSkgfD4gCiAgYW50aV9qb2luKHN0b3Bfd29yZHMpIHw+CiAgZmlsdGVyKHdvcmQgIT0gImRvaSIsCiAgICAgICAgICFzdHJfZGV0ZWN0KHdvcmQsICJbMC05XSIpKSB8PiAgIyBXb1MgZGF0YQogIGZpbHRlcih3b3JkID09IHN0cl9yZW1vdmUod29yZCwgcGF0dGVybiA9ICJjaXRhdGlvbiIpLAogICAgICAgICB3b3JkID09IHN0cl9yZW1vdmUod29yZCwgcGF0dGVybiA9ICJyZXNlYXJjaCIpLCAKICAgICAgICAgd29yZCA9PSBzdHJfcmVtb3ZlKHdvcmQsIHBhdHRlcm4gPSAiYW5hbHlzaXMiKSwgCiAgICAgICAgIHdvcmQgPT0gc3RyX3JlbW92ZSh3b3JkLCBwYXR0ZXJuID0gInNjaWVuY2UiKSwKICAgICAgICAgd29yZCA9PSBzdHJfcmVtb3ZlKHdvcmQsIHBhdHRlcm4gPSAic2NpZW50b21ldHJpYyIpLAogICAgICAgICB3b3JkID09IHN0cl9yZW1vdmUod29yZCwgcGF0dGVybiA9ICJ2dWxuZXJhYmlsaXR5IikpIHw+CiAgY291bnQod29yZCwgc29ydCA9IFRSVUUpIHw+IAogIHdpdGgod29yZGNsb3VkKHdvcmQsIAogICAgICAgICAgICAgICAgIG4sIAogICAgICAgICAgICAgICAgIHJhbmRvbS5vcmRlciA9IEZBTFNFLCAKICAgICAgICAgICAgICAgICBtYXgud29yZHMgPSA1MCwgCiAgICAgICAgICAgICAgICAgY29sb3JzPXBhbCkpCmBgYAoKIyMjIENsdXN0ZXIgMwoKYGBge3J9CgpjbHVzdGVyXzMgPC0gCiAgd29zX3Njb3B1c19jaXRhdGlvbl9uZXR3b3JrIHw+IAogIGRlbGV0ZS52ZXJ0aWNlcyh3aGljaChWKHdvc19zY29wdXNfY2l0YXRpb25fbmV0d29yaykkc3ViZmllbGQgIT0gMykpCgpjbHVzdGVyXzNfcGFnZV9yYW5rIDwtIAogIGNsdXN0ZXJfMyB8PiAKICBzZXQudmVydGV4LmF0dHJpYnV0ZShuYW1lID0gInBhZ2VfcmFuayIsIAogICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gcGFnZV9yYW5rKGNsdXN0ZXJfMykkdmVjdG9yKQoKY2x1c3Rlcl8zX2RmIDwtIAogIHRpYmJsZShuYW1lID0gVihjbHVzdGVyXzNfcGFnZV9yYW5rKSRuYW1lLAogICAgICAgICBmdWxsX25hbWUgPSBWKGNsdXN0ZXJfM19wYWdlX3JhbmspJGZ1bGxfbmFtZSwKICAgICAgICAgcGFnZV9yYW5rID0gVihjbHVzdGVyXzNfcGFnZV9yYW5rKSRwYWdlX3JhbmssCiAgICAgICAgIGNsdXN0ZXIgPSBWKGNsdXN0ZXJfM19wYWdlX3JhbmspJHN1YmZpZWxkLCkKCm5vZGVzX2Z1bGxfZGF0YSB8PiAKICBmaWx0ZXIoY2x1c3RlciA9PSAzKSB8PiAKICBzZWxlY3QoZnVsbF9uYW1lKSB8PiAKICBtdXRhdGUoZnVsbF9uYW1lID0gc3RyX2V4dHJhY3QoZnVsbF9uYW1lLCBTUEMgJVIlICAjIFJlZ3VsYXIgZXhwcmVzc2lvbnMgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25lX29yX21vcmUoV1JEKSAlUiUgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1BDICVSJSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmVfb3JfbW9yZShvcihXUkQsIEFOWV9DSEFSKSkpLAogICAgICAgICBmdWxsX25hbWUgPSBzdHJfcmVtb3ZlKGZ1bGxfbmFtZSwgT1BFTl9QQVJFTiAlUiUgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBlYXRlZChER1QsIDQpICVSJSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENMT1NFX1BBUkVOICVSJQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25lX29yX21vcmUob3IoV1JELEFOWV9DSEFSKSkpLAogICAgICAgICBmdWxsX25hbWUgPSBzdHJfdHJpbShmdWxsX25hbWUpKSAgfD4gCiAgdW5uZXN0X3Rva2VucyhvdXRwdXQgPSB3b3JkLCBpbnB1dCA9IGZ1bGxfbmFtZSkgfD4gCiAgYW50aV9qb2luKHN0b3Bfd29yZHMpIHw+CiAgZmlsdGVyKHdvcmQgIT0gImRvaSIsCiAgICAgICAgICFzdHJfZGV0ZWN0KHdvcmQsICJbMC05XSIpKSB8PiAgIyBXb1MgZGF0YSAKICBmaWx0ZXIod29yZCA9PSBzdHJfcmVtb3ZlKHdvcmQsIHBhdHRlcm4gPSAiY2l0YXRpb24iKSwKICAgICAgICAgd29yZCA9PSBzdHJfcmVtb3ZlKHdvcmQsIHBhdHRlcm4gPSAicmVzZWFyY2giKSwKICAgICAgICAgd29yZCA9PSBzdHJfcmVtb3ZlKHdvcmQsIHBhdHRlcm4gPSAiYW5hbHlzaXMiKSwKICAgICAgICAgd29yZCA9PSBzdHJfcmVtb3ZlKHdvcmQsIHBhdHRlcm4gPSAic2NpZW5jZSIpLAogICAgICAgICB3b3JkID09IHN0cl9yZW1vdmUod29yZCwgcGF0dGVybiA9ICJzY2llbnRvbWV0cmljIiksCiAgICAgICAgIHdvcmQgPT0gc3RyX3JlbW92ZSh3b3JkLCBwYXR0ZXJuID0gInZ1bG5lcmFiaWxpdHkiKSwKICAgICAgICAgd29yZCA9PSBzdHJfcmVtb3ZlKHdvcmQsIHBhdHRlcm4gPSAiam91cm5hbCIpLAogICAgICAgICB3b3JkID09IHN0cl9yZW1vdmUod29yZCwgcGF0dGVybiA9ICJpbmZvcm1hdGlvbiIpKSB8PgogIGNvdW50KHdvcmQsIHNvcnQgPSBUUlVFKSB8PiAKICB3aXRoKHdvcmRjbG91ZCh3b3JkLCAKICAgICAgICAgICAgICAgICBuLCAKICAgICAgICAgICAgICAgICByYW5kb20ub3JkZXIgPSBGQUxTRSwgCiAgICAgICAgICAgICAgICAgbWF4LndvcmRzID0gNTAsIAogICAgICAgICAgICAgICAgIGNvbG9ycz1wYWwpKQpgYGAKIyMjIENsdXN0ZXIgNAoKYGBge3J9CgpjbHVzdGVyXzQgPC0gCiAgd29zX3Njb3B1c19jaXRhdGlvbl9uZXR3b3JrIHw+IAogIGRlbGV0ZS52ZXJ0aWNlcyh3aGljaChWKHdvc19zY29wdXNfY2l0YXRpb25fbmV0d29yaykkc3ViZmllbGQgIT0gNCkpCgpjbHVzdGVyXzRfcGFnZV9yYW5rIDwtIAogIGNsdXN0ZXJfNCB8PiAKICBzZXQudmVydGV4LmF0dHJpYnV0ZShuYW1lID0gInBhZ2VfcmFuayIsIAogICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gcGFnZV9yYW5rKGNsdXN0ZXJfNCkkdmVjdG9yKQoKY2x1c3Rlcl80X2RmIDwtIAogIHRpYmJsZShuYW1lID0gVihjbHVzdGVyXzRfcGFnZV9yYW5rKSRuYW1lLAogICAgICAgICBmdWxsX25hbWUgPSBWKGNsdXN0ZXJfNF9wYWdlX3JhbmspJGZ1bGxfbmFtZSwKICAgICAgICAgcGFnZV9yYW5rID0gVihjbHVzdGVyXzRfcGFnZV9yYW5rKSRwYWdlX3JhbmssCiAgICAgICAgIGNsdXN0ZXIgPSBWKGNsdXN0ZXJfNF9wYWdlX3JhbmspJHN1YmZpZWxkLCkKCm5vZGVzX2Z1bGxfZGF0YSB8PiAKICBmaWx0ZXIoY2x1c3RlciA9PSA0KSB8PiAKICBzZWxlY3QoZnVsbF9uYW1lKSB8PiAKICBtdXRhdGUoZnVsbF9uYW1lID0gc3RyX2V4dHJhY3QoZnVsbF9uYW1lLCBTUEMgJVIlICAjIFJlZ3VsYXIgZXhwcmVzc2lvbnMgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25lX29yX21vcmUoV1JEKSAlUiUgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1BDICVSJSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmVfb3JfbW9yZShvcihXUkQsIEFOWV9DSEFSKSkpLAogICAgICAgICBmdWxsX25hbWUgPSBzdHJfcmVtb3ZlKGZ1bGxfbmFtZSwgT1BFTl9QQVJFTiAlUiUgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBlYXRlZChER1QsIDQpICVSJSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENMT1NFX1BBUkVOICVSJQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25lX29yX21vcmUob3IoV1JELEFOWV9DSEFSKSkpLAogICAgICAgICBmdWxsX25hbWUgPSBzdHJfdHJpbShmdWxsX25hbWUpKSAgfD4gCiAgdW5uZXN0X3Rva2VucyhvdXRwdXQgPSB3b3JkLCBpbnB1dCA9IGZ1bGxfbmFtZSkgfD4gCiAgYW50aV9qb2luKHN0b3Bfd29yZHMpIHw+IAogIGZpbHRlcih3b3JkICE9ICJkb2kiLAogICAgICAgICAhc3RyX2RldGVjdCh3b3JkLCAiWzAtOV0iKSkgfD4gICMgV29TIGRhdGEKICBmaWx0ZXIod29yZCA9PSBzdHJfcmVtb3ZlKHdvcmQsIHBhdHRlcm4gPSAiY2l0YXRpb24iKSwKICAgICAgICAgd29yZCA9PSBzdHJfcmVtb3ZlKHdvcmQsIHBhdHRlcm4gPSAicmVzZWFyY2giKSwgCiAgICAgICAgIHdvcmQgPT0gc3RyX3JlbW92ZSh3b3JkLCBwYXR0ZXJuID0gImFuYWx5c2lzIiksIAogICAgICAgICB3b3JkID09IHN0cl9yZW1vdmUod29yZCwgcGF0dGVybiA9ICJzY2llbmNlIiksCiAgICAgICAgIHdvcmQgPT0gc3RyX3JlbW92ZSh3b3JkLCBwYXR0ZXJuID0gInNjaWVudG9tZXRyaWMiKSwKICAgICAgICAgd29yZCA9PSBzdHJfcmVtb3ZlKHdvcmQsIHBhdHRlcm4gPSAidnVsbmVyYWJpbGl0eSIpKSB8PgogIGNvdW50KHdvcmQsIHNvcnQgPSBUUlVFKSB8PiAKICB3aXRoKHdvcmRjbG91ZCh3b3JkLCAKICAgICAgICAgICAgICAgICBuLCAKICAgICAgICAgICAgICAgICByYW5kb20ub3JkZXIgPSBGQUxTRSwgCiAgICAgICAgICAgICAgICAgbWF4LndvcmRzID0gNTAsIAogICAgICAgICAgICAgICAgIGNvbG9ycz1wYWwpKQpgYGAKCiMgRXhwb3J0aW5nIGZpbGVzCgpgYGB7cn0KCndyaXRlX2Nzdih3b3Nfc2NvcHVzX3RvcyRkZiwgIndvc19zY29wdXNfdG9zLmNzdiIpICMgRXhwb3J0aW5nIGFsbCBkYXRhIG1lcmdlZAoKd3JpdGVfY3N2KHRhYmxlXzEsICJ0YWJsZV8xLmNzdiIpICMgRXhwb3J0aW5nIHRhYmxlIDEKd3JpdGVfY3N2KHdvc19zY29wdXNfdG90YWxfY291bnRyeSwgInRhYmxlXzJfLmNzdiIpICAjIEV4cG9ydGluZyB0YWJsZSAyCndyaXRlX2Nzdih3b3Nfc2NvcHVzX2F1dGhvcnMsICJ0YWJsZV8zLmNzdiIpICMgRXhwb3J0aW5nIHRhYmxlIDMKd3JpdGVfY3N2KHdvc19zY29wdXNfdG90YWxfam91cm5hbCwgInRhYmxlXzQuY3N2IikgIyBFeHBvcnRpbmcgdGFibGUgNAoKCndyaXRlX2NzdihsYW5ndWFnZXMsICJmaWd1cmVfMS5jc3YiKSAjIEV4cG9ydGluZyBkYXRhIGZpZ3VyZSAxIAp3cml0ZV9jc3YoZmlndXJlXzJfZGF0YSwgImZpZ3VyZV8yLmNzdiIpICMgRXhwb3J0aW5nIGRhdGEgZmlndXJlIDIKCndyaXRlLmdyYXBoKHdvc19zY29wdXNfY2l0YXRpb25fbmV0d29yaywgImNpdGF0aW9uX25ldHdvcmtfZnVsbC5ncmFwaG1sIiwgImdyYXBobWwiKSAjIEV4cG9ydGluZyBncmFwaAp3cml0ZS5ncmFwaCh3b3Nfc2NvcHVzX2NpdGF0aW9uX25ldHdvcmtfY2x1c3RlcnMsIAogICAgICAgICAgICAid29zX3Njb3B1c19jaXRhdGlvbl9uZXR3b3JrX2NsdXN0ZXJzLmdyYXBobWwiLCAKICAgICAgICAgICAgImdyYXBobWwiKQoKYWNhX2dyYXBobWxfbm9kZXMgPC0gCiAgYWNhX3RibF9ncmFwaF9maWx0ZXJlZCB8PiAKICBhY3RpdmF0ZShub2RlcykgfD4gCiAgYXNfdGliYmxlKCkgfD4gCiAgcmVuYW1lKGF1dGhvciA9IG5hbWUpIHw+IAogIHJvd25hbWVzX3RvX2NvbHVtbigibmFtZSIpCgphY2FfZ3JhcGhtbF9lZGdlcyA8LSAKICBhY2FfdGJsX2dyYXBoX2ZpbHRlcmVkIHw+IAogIGFjdGl2YXRlKGVkZ2VzKSB8PiAKICBhc190aWJibGUoKSAKCmFjYV9ncmFwaG1sIDwtIAogIGdyYXBoX2Zyb21fZGF0YV9mcmFtZShkID0gYWNhX2dyYXBobWxfZWRnZXMsIAogICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3RlZCA9IEZBTFNFLCAKICAgICAgICAgICAgICAgICAgICAgICAgdmVydGljZXMgPSBhY2FfZ3JhcGhtbF9ub2RlcykKCndyaXRlX2dyYXBoKGFjYV9ncmFwaG1sLCAiYWNhX2dyYXBoLmdyYXBobWwiLCAiZ3JhcGhtbCIpICMgRXhwb3J0IGF1dGhvciBjby1jaXRhdGlvbiBncmFwaAoKYXV0aG9yX2NvbGxhYl9ncmFwaG1sX25vZGVzIDwtIAogIGF1dGhvcl9jb2xsYWJfdGJsX2dyYXBoX2ZpbHRlcmVkIHw+IAogIGFjdGl2YXRlKG5vZGVzKSB8PiAKICBhc190aWJibGUoKSB8PiAKICByZW5hbWUoYXV0aG9yID0gbmFtZSkgfD4gCiAgcm93bmFtZXNfdG9fY29sdW1uKCJuYW1lIikKCmF1dGhvcl9jb2xsYWJfZ3JhcGhtbF9lZGdlcyA8LSAKICBhdXRob3JfY29sbGFiX3RibF9ncmFwaF9maWx0ZXJlZCB8PiAKICBhY3RpdmF0ZShlZGdlcykgfD4gCiAgYXNfdGliYmxlKCkgCgphdXRob3JfY29sbGFiX2dyYXBobWwgPC0gCiAgZ3JhcGhfZnJvbV9kYXRhX2ZyYW1lKGQgPSBhdXRob3JfY29sbGFiX2dyYXBobWxfZWRnZXMsIAogICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3RlZCA9IEZBTFNFLCAKICAgICAgICAgICAgICAgICAgICAgICAgdmVydGljZXMgPSBhdXRob3JfY29sbGFiX2dyYXBobWxfbm9kZXMpCgp3cml0ZV9ncmFwaChhdXRob3JfY29sbGFiX2dyYXBobWwsICJhdXRob3JfY29sbGFiX2dyYXBobWwuZ3JhcGhtbCIsICJncmFwaG1sIikgIyBFeHBvcnQgYXV0aG9yIGNvLWNpdGF0aW9uIGdyYXBoCgpjb3VudHJ5X2NvbGxhYl9ncmFwaG1sX25vZGVzIDwtIAogIGNvdW50cnlfY29sbGFiX3RibF9ncmFwaF9maWx0ZXJlZCB8PiAKICBhY3RpdmF0ZShub2RlcykgfD4gCiAgYXNfdGliYmxlKCkgfD4gCiAgcmVuYW1lKGF1dGhvciA9IG5hbWUpIHw+IAogIHJvd25hbWVzX3RvX2NvbHVtbigibmFtZSIpCgpjb3VudHJ5X2NvbGxhYl9ncmFwaG1sX2VkZ2VzIDwtIAogIGNvdW50cnlfY29sbGFiX3RibF9ncmFwaF9maWx0ZXJlZCB8PiAKICBhY3RpdmF0ZShlZGdlcykgfD4gCiAgYXNfdGliYmxlKCkgCgpjb3VudHJ5X2NvbGxhYl9ncmFwaG1sIDwtIAogIGdyYXBoX2Zyb21fZGF0YV9mcmFtZShkID0gY291bnRyeV9jb2xsYWJfZ3JhcGhtbF9lZGdlcywgCiAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGVkID0gRkFMU0UsIAogICAgICAgICAgICAgICAgICAgICAgICB2ZXJ0aWNlcyA9IGNvdW50cnlfY29sbGFiX2dyYXBobWxfbm9kZXMpCgp3cml0ZV9ncmFwaChjb3VudHJ5X2NvbGxhYl9ncmFwaG1sLCAiY291bnRyeV9jb2xsYWJfZ3JhcGhtbC5ncmFwaG1sIiwgImdyYXBobWwiKSAjIEV4cG9ydCBhdXRob3IgY28tY2l0YXRpb24gZ3JhcGgKCmtleXdvcmRfY29fb2NjdXJyZW5jZV9ncmFwaG1sX25vZGVzIDwtIAogIGtleXdvcmRfY29fb2NjdXJyZW5jZV90YmxfZ3JhcGhfZmlsdGVyZWQgfD4gCiAgYWN0aXZhdGUobm9kZXMpIHw+IAogIGFzX3RpYmJsZSgpIHw+IAogIHJlbmFtZShhdXRob3IgPSBuYW1lKSB8PiAKICByb3duYW1lc190b19jb2x1bW4oIm5hbWUiKQoKa2V5d29yZF9jb19vY2N1cnJlbmNlX2dyYXBobWxfZWRnZXMgPC0gCiAga2V5d29yZF9jb19vY2N1cnJlbmNlX3RibF9ncmFwaF9maWx0ZXJlZCB8PiAKICBhY3RpdmF0ZShlZGdlcykgfD4gCiAgYXNfdGliYmxlKCkgIAoKa2V5d29yZF9jb19vY2N1cnJlbmNlX2dyYXBobWwgPC0gCiAgZ3JhcGhfZnJvbV9kYXRhX2ZyYW1lKGQgPSBrZXl3b3JkX2NvX29jY3VycmVuY2VfZ3JhcGhtbF9lZGdlcywgCiAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGVkID0gRkFMU0UsIAogICAgICAgICAgICAgICAgICAgICAgICB2ZXJ0aWNlcyA9IGtleXdvcmRfY29fb2NjdXJyZW5jZV9ncmFwaG1sX25vZGVzKQoKd3JpdGVfZ3JhcGgoa2V5d29yZF9jb19vY2N1cnJlbmNlX2dyYXBobWwsICJrZXl3b3JkX2NvX29jY3VycmVuY2VfZ3JhcGhtbC5ncmFwaG1sIiwgImdyYXBobWwiKSAjIEV4cG9ydCBhdXRob3IgY28tY2l0YXRpb24gZ3JhcGgKCndyaXRlLmNzdih0cmVlX29mX3NjaWVuY2UsICJ0cmVlX29mX3NjaWVuY2UuY3N2IikgIyBFeHBvcnRpbmcgVHJlZSBvZiBTY2llbmNlCgp3cml0ZS5jc3YoY2x1c3Rlcl8xX2RmLCAiY2x1c3Rlcl8xLmNzdiIpICMgRXhwb3J0aW5nIGNsdXN0ZXIgMQp3cml0ZS5jc3YoY2x1c3Rlcl8yX2RmLCAiY2x1c3Rlcl8yLmNzdiIpICMgRXhwb3J0aW5nIGNsdXN0ZXIgMgp3cml0ZS5jc3YoY2x1c3Rlcl8zX2RmLCAiY2x1c3Rlcl8zLmNzdiIpICMgRXhwb3J0aW5nIGNsdXN0ZXIgMwp3cml0ZS5jc3YoY2x1c3Rlcl80X2RmLCAiY2x1c3Rlcl80LmNzdiIpICMgRXhwb3J0aW5nIGNsdXN0ZXIgNAoKd3JpdGUuY3N2KG5vZGVzX2Z1bGxfZGF0YSwgIm5vZGVzX2Z1bGxfZGF0YS5jc3YiKSAjIEV4cG9ydGluZyBhbGwgbm9kZXMKYGBgCgo=