INTRODUCTION

My independent analysis for this week focuses on looking at a sample of K-8 teachers’ interpretations of computational thinking (“CT”) before and after participating in a CT-focused intervention. This work is part of a larger research project that focuses on helping teachers develop an understanding of CT knowledge and practices. Participants were asked to complete a pre-survey before they started their learning about CT and a post-survey at the end of the training. This analysis looks at one open-ended question asked in both surveys, which is about the CT definition.

RESEARCH QUESTION

This analysis is guided by the question of how participated teachers’ understanding of CT definition differs from the beginning and the end of their participation in a CT-focused intervention.

DATA

To answer the research question, I selected a sample of 51 teachers and used their pre- and post-responses to the question, “What is Computational Thinking?” in this analysis. The data wrangle and cleaning process is not presented in this analysis; instead, the focus of this analysis is on using n-grams and data visualization to look at the differences between the participants’ responses before (“Time1”) and after (“Time2”) the training.

library(dplyr)
library(tidytext)
library(tidyverse)
library(tidyr)
library(ggplot2)
library(igraph)
library(ggraph)
CT_def <- read_csv("definition.csv")
## Rows: 102 Columns: 3
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (2): Type, definition
## dbl (1): ID
## 
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.

ANALYSIS

In this section, I present the steps for analyzing the text data using n-grams.

CT_bigrams <- CT_def %>% unnest_tokens(bigram,definition,token = "ngrams", n = 2)
CT_bigrams %>%  count(bigram, sort = TRUE)
## # A tibble: 1,227 × 2
##    bigram                     n
##    <chr>                  <int>
##  1 computational thinking    62
##  2 thinking is               30
##  3 i think                   29
##  4 thinking means            19
##  5 a way                     18
##  6 problem solving           16
##  7 way of                    16
##  8 a computer                14
##  9 is a                      13
## 10 of thinking               13
## # … with 1,217 more rows
bigrams_separated <- CT_bigrams %>% 
          separate(bigram, c("word1","word2"), sep = " ")
bigrams_filtered <- bigrams_separated %>% 
          filter(!word1 %in% stop_words$word) %>% 
          filter(!word2 %in% stop_words$word)
bigram_counts <- bigrams_filtered %>% 
          count(word1, word2, sort = TRUE)
bigrams_united <- bigrams_filtered %>%
  unite(bigram, word1, word2, sep = " ")

VISUALIZATION (Part 1)

In this section, I look at the most common bigrams (n = 5) in both Time 1 and Time 2. As shown in the graph below, teachers did not provide very specific thoughts on defining CT, and the word combinations showed that participants were not very familiar with the terms. In contrast, the Time 2 bar graph showed more variations of word combinations in which participants defined CT using keywords such as “critical thinking”, and “solving” a lot more frequently.

#function
facet_bar <- function(df, y, x, by, nrow = 2, ncol = 2, scales = "free") {
          mapping <- aes(y = reorder_within({{ y }}, {{ x }}, {{ by }}), 
                         x = {{ x }}, 
                         fill = {{ by }})
          
          facet <- facet_wrap(vars({{ by }}), 
                              nrow = nrow, 
                              ncol = ncol,
                              scales = scales) 
          
          ggplot(df, mapping = mapping) + 
                    geom_col(show.legend = FALSE) + 
                    scale_y_reordered() + 
                    facet + 
                    ylab("")
graph <- bigrams_united %>% 
          count(Type, bigram, sort = TRUE) %>% 
          bind_log_odds(set = Type, feature = bigram, n = n) %>% 
          group_by(Type) %>% 
          top_n(5) %>% 
          ungroup() %>%
          facet_bar(y = bigram, x = log_odds_weighted, by = Type, nrow = 3)
} 

VISUALIZATION (Part 2)

In order to look at how each word related to each other among participants’ understanding of CT. I created the word networks for Time 1 and Time 2 to examine the differences in responses. As shown in the graphs below, the differences can be noticed between the two networks.

Time 1 Results:

CT_def_T1 <- bigrams_filtered %>% filter(Type == "Time1")

bigram_counts_T1 <- CT_def_T1 %>% 
          count(word1, word2, sort = TRUE)
bigram_graph_T1 <- bigram_counts_T1 %>% 
          graph_from_data_frame()

bigram_graph_filtered_T1 <- bigram_counts_T1 %>%
          filter(n > 1) %>%
          graph_from_data_frame()

set.seed(588)
a <- grid::arrow(type = "open", length = unit(.2, "inches"))
ggraph(bigram_graph_filtered_T1, layout = "fr") +
          geom_edge_link(aes(edge_alpha = n), show.legend = FALSE,
                         arrow = a, end_cap = circle(.07, 'inches')) +
          geom_node_point(color = "red", size = 3) +
          geom_node_text(aes(label = name), vjust = 1, hjust = 1) +
          theme_void()
## Warning: Using the `size` aesthetic in this geom was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` in the `default_aes` field and elsewhere instead.

Time 2 Results:

CT_def_T2 <- bigrams_filtered %>% filter(Type == "Time2")

bigram_counts_T2 <- CT_def_T2 %>% 
          count(word1, word2, sort = TRUE)
bigram_graph_T2 <- bigram_counts_T2 %>% 
          graph_from_data_frame()

bigram_graph_filtered_T2 <- bigram_counts_T2 %>%
          filter(n > 1) %>%
          graph_from_data_frame()

set.seed(589)
a <- grid::arrow(type = "open", length = unit(.2, "inches"))
ggraph(bigram_graph_filtered_T2, layout = "fr") +
          geom_edge_link(aes(edge_alpha = n), show.legend = FALSE,
                         arrow = a, end_cap = circle(.07, 'inches')) +
          geom_node_point(color = "blue", size = 3) +
          geom_node_text(aes(label = name), vjust = 1, hjust = 1) +
          theme_void()

CONCLUSION

I often conduct qualitative analysis on open-ended questions, which often require time and resources to establish credible coding schema and results. In this analysis, I used n-grams and data visualizations to examine the differences about teachers defined CT before and after they participated in a CT-related intervention. Results from this analysis show that the participants were able to enact CT terms and vocabularies compared to where they were before the intervention. However, more research is needed to unpack whether such understanding could last long-term and whether participants would be able to apply their understanding into teaching practices.

LS0tDQp0aXRsZTogIkV4cGxvcmluZyBLLTggVGVhY2hlcnPigJkgQ29tcHV0YXRpb25hbCBUaGlua2luZyBVbmRlcnN0YW5kaW5ncyBCZWZvcmUNCiAgYW5kIEFmdGVyIGEgQ1QtZm9jdXNlZCBJbnRlcnZlbnRpb24iDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6DQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZGVwdGg6IDMNCiAgICB0b2NfZmxvYXQ6IHllcw0KICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KICAgIGNvZGVfZG93bmxvYWQ6IHllcw0KZWRpdG9yX29wdGlvbnM6DQogIG1hcmtkb3duOg0KICAgIHdyYXA6IDcyDQotLS0NCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpDQpgYGANCg0KIyMgSU5UUk9EVUNUSU9ODQoNCk15IGluZGVwZW5kZW50IGFuYWx5c2lzIGZvciB0aGlzIHdlZWsgZm9jdXNlcyBvbiBsb29raW5nIGF0IGEgc2FtcGxlIG9mIEstOCB0ZWFjaGVyc+KAmSBpbnRlcnByZXRhdGlvbnMgb2YgY29tcHV0YXRpb25hbCB0aGlua2luZyAo4oCcQ1TigJ0pIGJlZm9yZSBhbmQgYWZ0ZXIgcGFydGljaXBhdGluZyBpbiBhIENULWZvY3VzZWQgaW50ZXJ2ZW50aW9uLiBUaGlzIHdvcmsgaXMgcGFydCBvZiBhIGxhcmdlciByZXNlYXJjaCBwcm9qZWN0IHRoYXQgZm9jdXNlcyBvbiBoZWxwaW5nIHRlYWNoZXJzIGRldmVsb3AgYW4gdW5kZXJzdGFuZGluZyBvZiBDVCBrbm93bGVkZ2UgYW5kIHByYWN0aWNlcy4gUGFydGljaXBhbnRzIHdlcmUgYXNrZWQgdG8gY29tcGxldGUgYSBwcmUtc3VydmV5IGJlZm9yZSB0aGV5IHN0YXJ0ZWQgdGhlaXIgbGVhcm5pbmcgYWJvdXQgQ1QgYW5kIGEgcG9zdC1zdXJ2ZXkgYXQgdGhlIGVuZCBvZiB0aGUgdHJhaW5pbmcuIFRoaXMgYW5hbHlzaXMgbG9va3MgYXQgb25lIG9wZW4tZW5kZWQgcXVlc3Rpb24gYXNrZWQgaW4gYm90aCBzdXJ2ZXlzLCB3aGljaCBpcyBhYm91dCB0aGUgQ1QgZGVmaW5pdGlvbi4gDQoNCiMjIFJFU0VBUkNIIFFVRVNUSU9ODQoNClRoaXMgYW5hbHlzaXMgaXMgZ3VpZGVkIGJ5IHRoZSBxdWVzdGlvbiBvZiBob3cgcGFydGljaXBhdGVkIHRlYWNoZXJz4oCZIHVuZGVyc3RhbmRpbmcgb2YgQ1QgZGVmaW5pdGlvbiBkaWZmZXJzIGZyb20gdGhlIGJlZ2lubmluZyBhbmQgdGhlIGVuZCBvZiB0aGVpciBwYXJ0aWNpcGF0aW9uIGluIGEgQ1QtZm9jdXNlZCBpbnRlcnZlbnRpb24uDQoNCg0KIyMgREFUQQ0KDQpUbyBhbnN3ZXIgdGhlIHJlc2VhcmNoIHF1ZXN0aW9uLCBJIHNlbGVjdGVkIGEgc2FtcGxlIG9mIDUxIHRlYWNoZXJzIGFuZCB1c2VkIHRoZWlyIHByZS0gYW5kIHBvc3QtcmVzcG9uc2VzIHRvIHRoZSBxdWVzdGlvbiwg4oCcV2hhdCBpcyBDb21wdXRhdGlvbmFsIFRoaW5raW5nP+KAnSBpbiB0aGlzIGFuYWx5c2lzLiBUaGUgZGF0YSB3cmFuZ2xlIGFuZCBjbGVhbmluZyBwcm9jZXNzIGlzIG5vdCBwcmVzZW50ZWQgaW4gdGhpcyBhbmFseXNpczsgaW5zdGVhZCwgdGhlIGZvY3VzIG9mIHRoaXMgYW5hbHlzaXMgaXMgb24gdXNpbmcgbi1ncmFtcyBhbmQgZGF0YSB2aXN1YWxpemF0aW9uIHRvIGxvb2sgYXQgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gdGhlIHBhcnRpY2lwYW50c+KAmSByZXNwb25zZXMgYmVmb3JlICjigJxUaW1lMeKAnSkgYW5kIGFmdGVyICjigJxUaW1lMuKAnSkgdGhlIHRyYWluaW5nLiANCg0KYGBge3IgbG9hZC1wYWNrYWdlcywgbWVzc2FnZT1GQUxTRX0NCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KHRpZHl0ZXh0KQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KHRpZHlyKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShpZ3JhcGgpDQpsaWJyYXJ5KGdncmFwaCkNCmBgYA0KDQpgYGB7ciByZWFkLWNzdn0NCkNUX2RlZiA8LSByZWFkX2NzdigiZGVmaW5pdGlvbi5jc3YiKQ0KYGBgDQoNCiMjIEFOQUxZU0lTDQoNCkluIHRoaXMgc2VjdGlvbiwgSSBwcmVzZW50IHRoZSBzdGVwcyBmb3IgYW5hbHl6aW5nIHRoZSB0ZXh0IGRhdGEgdXNpbmcgbi1ncmFtcy4gDQpgYGB7ciB0b2tlbml6ZX0NCkNUX2JpZ3JhbXMgPC0gQ1RfZGVmICU+JSB1bm5lc3RfdG9rZW5zKGJpZ3JhbSxkZWZpbml0aW9uLHRva2VuID0gIm5ncmFtcyIsIG4gPSAyKQ0KYGBgDQoNCmBgYHtyIGNvdW50LWJpZ3JhbXN9DQpDVF9iaWdyYW1zICU+JSAgY291bnQoYmlncmFtLCBzb3J0ID0gVFJVRSkNCmBgYA0KDQpgYGB7ciByZW1vdmUgc3RvcCB3b3Jkc30NCmJpZ3JhbXNfc2VwYXJhdGVkIDwtIENUX2JpZ3JhbXMgJT4lIA0KICAgICAgICAgIHNlcGFyYXRlKGJpZ3JhbSwgYygid29yZDEiLCJ3b3JkMiIpLCBzZXAgPSAiICIpDQpiaWdyYW1zX2ZpbHRlcmVkIDwtIGJpZ3JhbXNfc2VwYXJhdGVkICU+JSANCiAgICAgICAgICBmaWx0ZXIoIXdvcmQxICVpbiUgc3RvcF93b3JkcyR3b3JkKSAlPiUgDQogICAgICAgICAgZmlsdGVyKCF3b3JkMiAlaW4lIHN0b3Bfd29yZHMkd29yZCkNCmJpZ3JhbV9jb3VudHMgPC0gYmlncmFtc19maWx0ZXJlZCAlPiUgDQogICAgICAgICAgY291bnQod29yZDEsIHdvcmQyLCBzb3J0ID0gVFJVRSkNCmJpZ3JhbXNfdW5pdGVkIDwtIGJpZ3JhbXNfZmlsdGVyZWQgJT4lDQogIHVuaXRlKGJpZ3JhbSwgd29yZDEsIHdvcmQyLCBzZXAgPSAiICIpDQpgYGANCg0KIyMgVklTVUFMSVpBVElPTiAoUGFydCAxKQ0KSW4gdGhpcyBzZWN0aW9uLCBJIGxvb2sgYXQgdGhlIG1vc3QgY29tbW9uIGJpZ3JhbXMgKG4gPSA1KSBpbiBib3RoIFRpbWUgMSBhbmQgVGltZSAyLiBBcyBzaG93biBpbiB0aGUgZ3JhcGggYmVsb3csIHRlYWNoZXJzIGRpZCBub3QgcHJvdmlkZSB2ZXJ5IHNwZWNpZmljIHRob3VnaHRzIG9uIGRlZmluaW5nIENULCBhbmQgdGhlIHdvcmQgY29tYmluYXRpb25zIHNob3dlZCB0aGF0IHBhcnRpY2lwYW50cyB3ZXJlIG5vdCB2ZXJ5IGZhbWlsaWFyIHdpdGggdGhlIHRlcm1zLiBJbiBjb250cmFzdCwgdGhlIFRpbWUgMiBiYXIgZ3JhcGggc2hvd2VkIG1vcmUgdmFyaWF0aW9ucyBvZiB3b3JkIGNvbWJpbmF0aW9ucyBpbiB3aGljaCBwYXJ0aWNpcGFudHMgZGVmaW5lZCBDVCB1c2luZyBrZXl3b3JkcyBzdWNoIGFzIOKAnGNyaXRpY2FsIHRoaW5raW5n4oCdLCBhbmQg4oCcc29sdmluZ+KAnSBhIGxvdCBtb3JlIGZyZXF1ZW50bHkuIA0KDQpgYGB7ciB2aXN1YWxfVDEgYW5kIFQyfQ0KI2Z1bmN0aW9uDQpmYWNldF9iYXIgPC0gZnVuY3Rpb24oZGYsIHksIHgsIGJ5LCBucm93ID0gMiwgbmNvbCA9IDIsIHNjYWxlcyA9ICJmcmVlIikgew0KICAgICAgICAgIG1hcHBpbmcgPC0gYWVzKHkgPSByZW9yZGVyX3dpdGhpbih7eyB5IH19LCB7eyB4IH19LCB7eyBieSB9fSksIA0KICAgICAgICAgICAgICAgICAgICAgICAgIHggPSB7eyB4IH19LCANCiAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsID0ge3sgYnkgfX0pDQogICAgICAgICAgDQogICAgICAgICAgZmFjZXQgPC0gZmFjZXRfd3JhcCh2YXJzKHt7IGJ5IH19KSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBucm93ID0gbnJvdywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY29sID0gbmNvbCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlcyA9IHNjYWxlcykgDQogICAgICAgICAgDQogICAgICAgICAgZ2dwbG90KGRmLCBtYXBwaW5nID0gbWFwcGluZykgKyANCiAgICAgICAgICAgICAgICAgICAgZ2VvbV9jb2woc2hvdy5sZWdlbmQgPSBGQUxTRSkgKyANCiAgICAgICAgICAgICAgICAgICAgc2NhbGVfeV9yZW9yZGVyZWQoKSArIA0KICAgICAgICAgICAgICAgICAgICBmYWNldCArIA0KICAgICAgICAgICAgICAgICAgICB5bGFiKCIiKQ0KZ3JhcGggPC0gYmlncmFtc191bml0ZWQgJT4lIA0KICAgICAgICAgIGNvdW50KFR5cGUsIGJpZ3JhbSwgc29ydCA9IFRSVUUpICU+JSANCiAgICAgICAgICBiaW5kX2xvZ19vZGRzKHNldCA9IFR5cGUsIGZlYXR1cmUgPSBiaWdyYW0sIG4gPSBuKSAlPiUgDQogICAgICAgICAgZ3JvdXBfYnkoVHlwZSkgJT4lIA0KICAgICAgICAgIHRvcF9uKDUpICU+JSANCiAgICAgICAgICB1bmdyb3VwKCkgJT4lDQogICAgICAgICAgZmFjZXRfYmFyKHkgPSBiaWdyYW0sIHggPSBsb2dfb2Rkc193ZWlnaHRlZCwgYnkgPSBUeXBlLCBucm93ID0gMykNCn0gDQpgYGANCiFbXShncmFwaC5wbmcpe3dpZHRoPSIxMDAlIn0NCg0KIyMgVklTVUFMSVpBVElPTiAoUGFydCAyKQ0KSW4gb3JkZXIgdG8gbG9vayBhdCBob3cgZWFjaCB3b3JkIHJlbGF0ZWQgdG8gZWFjaCBvdGhlciBhbW9uZyBwYXJ0aWNpcGFudHPigJkgdW5kZXJzdGFuZGluZyBvZiBDVC4gSSBjcmVhdGVkIHRoZSB3b3JkIG5ldHdvcmtzIGZvciBUaW1lIDEgYW5kIFRpbWUgMiB0byBleGFtaW5lIHRoZSBkaWZmZXJlbmNlcyBpbiByZXNwb25zZXMuIEFzIHNob3duIGluIHRoZSBncmFwaHMgYmVsb3csIHRoZSBkaWZmZXJlbmNlcyBjYW4gYmUgbm90aWNlZCBiZXR3ZWVuIHRoZSB0d28gbmV0d29ya3MuDQoNClRpbWUgMSBSZXN1bHRzOg0KYGBge3Igd29yZCBuZXRfVDF9DQpDVF9kZWZfVDEgPC0gYmlncmFtc19maWx0ZXJlZCAlPiUgZmlsdGVyKFR5cGUgPT0gIlRpbWUxIikNCg0KYmlncmFtX2NvdW50c19UMSA8LSBDVF9kZWZfVDEgJT4lIA0KICAgICAgICAgIGNvdW50KHdvcmQxLCB3b3JkMiwgc29ydCA9IFRSVUUpDQpiaWdyYW1fZ3JhcGhfVDEgPC0gYmlncmFtX2NvdW50c19UMSAlPiUgDQogICAgICAgICAgZ3JhcGhfZnJvbV9kYXRhX2ZyYW1lKCkNCg0KYmlncmFtX2dyYXBoX2ZpbHRlcmVkX1QxIDwtIGJpZ3JhbV9jb3VudHNfVDEgJT4lDQogICAgICAgICAgZmlsdGVyKG4gPiAxKSAlPiUNCiAgICAgICAgICBncmFwaF9mcm9tX2RhdGFfZnJhbWUoKQ0KDQpzZXQuc2VlZCg1ODgpDQphIDwtIGdyaWQ6OmFycm93KHR5cGUgPSAib3BlbiIsIGxlbmd0aCA9IHVuaXQoLjIsICJpbmNoZXMiKSkNCmdncmFwaChiaWdyYW1fZ3JhcGhfZmlsdGVyZWRfVDEsIGxheW91dCA9ICJmciIpICsNCiAgICAgICAgICBnZW9tX2VkZ2VfbGluayhhZXMoZWRnZV9hbHBoYSA9IG4pLCBzaG93LmxlZ2VuZCA9IEZBTFNFLA0KICAgICAgICAgICAgICAgICAgICAgICAgIGFycm93ID0gYSwgZW5kX2NhcCA9IGNpcmNsZSguMDcsICdpbmNoZXMnKSkgKw0KICAgICAgICAgIGdlb21fbm9kZV9wb2ludChjb2xvciA9ICJyZWQiLCBzaXplID0gMykgKw0KICAgICAgICAgIGdlb21fbm9kZV90ZXh0KGFlcyhsYWJlbCA9IG5hbWUpLCB2anVzdCA9IDEsIGhqdXN0ID0gMSkgKw0KICAgICAgICAgIHRoZW1lX3ZvaWQoKQ0KYGBgDQoNClRpbWUgMiBSZXN1bHRzOg0KYGBge3Igd29yZCBuZXRfVDJ9DQpDVF9kZWZfVDIgPC0gYmlncmFtc19maWx0ZXJlZCAlPiUgZmlsdGVyKFR5cGUgPT0gIlRpbWUyIikNCg0KYmlncmFtX2NvdW50c19UMiA8LSBDVF9kZWZfVDIgJT4lIA0KICAgICAgICAgIGNvdW50KHdvcmQxLCB3b3JkMiwgc29ydCA9IFRSVUUpDQpiaWdyYW1fZ3JhcGhfVDIgPC0gYmlncmFtX2NvdW50c19UMiAlPiUgDQogICAgICAgICAgZ3JhcGhfZnJvbV9kYXRhX2ZyYW1lKCkNCg0KYmlncmFtX2dyYXBoX2ZpbHRlcmVkX1QyIDwtIGJpZ3JhbV9jb3VudHNfVDIgJT4lDQogICAgICAgICAgZmlsdGVyKG4gPiAxKSAlPiUNCiAgICAgICAgICBncmFwaF9mcm9tX2RhdGFfZnJhbWUoKQ0KDQpzZXQuc2VlZCg1ODkpDQphIDwtIGdyaWQ6OmFycm93KHR5cGUgPSAib3BlbiIsIGxlbmd0aCA9IHVuaXQoLjIsICJpbmNoZXMiKSkNCmdncmFwaChiaWdyYW1fZ3JhcGhfZmlsdGVyZWRfVDIsIGxheW91dCA9ICJmciIpICsNCiAgICAgICAgICBnZW9tX2VkZ2VfbGluayhhZXMoZWRnZV9hbHBoYSA9IG4pLCBzaG93LmxlZ2VuZCA9IEZBTFNFLA0KICAgICAgICAgICAgICAgICAgICAgICAgIGFycm93ID0gYSwgZW5kX2NhcCA9IGNpcmNsZSguMDcsICdpbmNoZXMnKSkgKw0KICAgICAgICAgIGdlb21fbm9kZV9wb2ludChjb2xvciA9ICJibHVlIiwgc2l6ZSA9IDMpICsNCiAgICAgICAgICBnZW9tX25vZGVfdGV4dChhZXMobGFiZWwgPSBuYW1lKSwgdmp1c3QgPSAxLCBoanVzdCA9IDEpICsNCiAgICAgICAgICB0aGVtZV92b2lkKCkNCmBgYA0KDQojIyMjIENPTkNMVVNJT04NCkkgb2Z0ZW4gY29uZHVjdCBxdWFsaXRhdGl2ZSBhbmFseXNpcyBvbiBvcGVuLWVuZGVkIHF1ZXN0aW9ucywgd2hpY2ggb2Z0ZW4gcmVxdWlyZSB0aW1lIGFuZCByZXNvdXJjZXMgdG8gZXN0YWJsaXNoIGNyZWRpYmxlIGNvZGluZyBzY2hlbWEgYW5kIHJlc3VsdHMuIEluIHRoaXMgYW5hbHlzaXMsIEkgdXNlZCBuLWdyYW1zIGFuZCBkYXRhIHZpc3VhbGl6YXRpb25zIHRvIGV4YW1pbmUgdGhlIGRpZmZlcmVuY2VzIGFib3V0IHRlYWNoZXJzIGRlZmluZWQgQ1QgYmVmb3JlIGFuZCBhZnRlciB0aGV5IHBhcnRpY2lwYXRlZCBpbiBhIENULXJlbGF0ZWQgaW50ZXJ2ZW50aW9uLiBSZXN1bHRzIGZyb20gdGhpcyBhbmFseXNpcyBzaG93IHRoYXQgdGhlIHBhcnRpY2lwYW50cyB3ZXJlIGFibGUgdG8gZW5hY3QgQ1QgdGVybXMgYW5kIHZvY2FidWxhcmllcyBjb21wYXJlZCB0byB3aGVyZSB0aGV5IHdlcmUgYmVmb3JlIHRoZSBpbnRlcnZlbnRpb24uIEhvd2V2ZXIsIG1vcmUgcmVzZWFyY2ggaXMgbmVlZGVkIHRvIHVucGFjayB3aGV0aGVyIHN1Y2ggdW5kZXJzdGFuZGluZyBjb3VsZCBsYXN0IGxvbmctdGVybSBhbmQgd2hldGhlciBwYXJ0aWNpcGFudHMgd291bGQgYmUgYWJsZSB0byBhcHBseSB0aGVpciB1bmRlcnN0YW5kaW5nIGludG8gdGVhY2hpbmcgcHJhY3RpY2VzLiA=