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=