Welcome!
Welcome to the Notebook accompanying the research project “Performing an Invisibility Spell”. This notebook is a way of adding transparency to said project by showing the code and procedures that yielded several data visualizations used in the aforementioned paper. For the operations made using Cortex, kindly refer to the link provided in the paper. In order to make this notebook as transparent as possible, each snip of code is explained, either before the code itself or using comments next to the code (the latter are introduced by a Hashtag)
Introductory Steps
We start by loading the extension “tidyverse”, which will aid us throughout the project (providing syntactic expressions like the pipeline operators "%>% as well as the ggplot and grepl functions that we will use to produce graphs and search for particular occurrences in our corpus).
library(tidyverse)
Warning messages:
1: In readChar(file, size, TRUE) : truncating string with embedded nuls
2: In readChar(file, size, TRUE) : truncating string with embedded nuls
3: In readChar(file, size, TRUE) : truncating string with embedded nuls
Afterwards, we are telling R to read our 252 articles. They are formatted in a tabular way using the tsv format. Please do note that this is a simplification of the results gathered from Factiva. It does not contain some of the rich meta-data indexed by Factiva (ex: regions mentioned in the article) simply because we will not use them in this exploration. Furthermore, in order to make our visualisation readable, we decided to recode the column “Publicatio” (the publication date of a given article) and assign months (format: Year/Month) rather than the day when an article was published.
article_by_month = read_tsv("252good.tsv")
-- Column specification --------------------------------------------------------
cols(
Headline = col_character(),
article_fu = col_character(),
Publicatio = col_character()
)
The next command allows us to manually explore our corpus.
view(article_by_month)
We can see that our corpus contains the headlines of a given article (column “Headline”), the full text of the article (column “article_fu”) and their publication dates (column “Publicatio”)
Basic Exploration of our corpus: Frequencies of Publication
The next piece of code will produce a bar chart showing the frequency of our articles over time.
ggplot(article_by_month)+ #We are asking the ggplot function to take our corpus as the data to graph
aes(Publicatio) + #The X axis should be the publication date
geom_bar(colour = 'green', alpha=0.2) + #We want a green bar chart
labs(x="Month of Publication", y="Number of Articles", title = "Articles talking about migration and the Kerala Floods/Landslides (August 2019-May 2020)") #These are the labels we want

In the graph above, we can see that the media focused on publishing articles on human migration in the context on the Kerala floods and landslides of 2019 chiefly in August and September 2019. The immediate months during/after the disaster. Indeed, most of our articles belong to this time period (around 200). The publication of articles on human mobility and the Kerala floods/disaster never died off. However, it decreased from October 2019 onwards and experienced a surge in March 2020 that continues throughout April 2020. Lastly, the month of May 2020 should be taken with a pinch of salt since we only have data for the articles published on the first 11 days of May (hence, it makes sense for the number of articles contained in our corpus to be smaller).
Given that we do not want to show the limited data we have for May 2020, let us create a new plot.
We start by selecting the articles published from August 2019 to April 2020
articles_August_April = article_by_month %>%
select(Publicatio) %>%
filter(grepl("2019/08|2019/09|2019/10|2019/11|2019/12|2020/01|2020/02|2020/03|2020/04", Publicatio))
And we create a new graph
ggplot(articles_August_April)+ #We are asking the ggplot function to take our corpus as the data to graph
aes(Publicatio) + #The X axis should be the publication date
geom_bar(colour = 'blue', alpha=0.2) + #We want a blue bar chart to differentiate it from our previous graph
labs(x="Month of Publication", y="Number of Articles", title = "Articles talking about migration and the Kerala Floods/Landslides (August 2019-April 2020)") #These are the labels we want

Lastly, since we would like to tell exactly how many articles were published in the two months with the highest frequencies, we will run the following script.
articles_August_September = article_by_month %>%
select(Publicatio) %>% #We are asking R to select the date of publication as our variable of interest
filter(grepl("2019/08|2019/09", Publicatio)) #Now, we are searching for articles published either on August 2019 or September 2019
count(articles_August_September)
A total of 183 articles were published during the first two months.
Checking for mentions of the Adivasi communities
We understand that saying that articles talking about human mobility in the context of the Kerala floods and landslides in 2019 did not portray adivasi communities is a bold claim. Therefore, we would not be surprised if readers are unconvinced by just saying that Adivasis were not represented by the anglophone media on the basis that no mention of these communities appeared on our extracted list of the 500 most frequent terms.
This script is a rudimentary qualification of that claim, we are searching for any reference to adivasis made by the media when they talked about human migration in the context of the Kerala floods and landslides from August 2019 to May 2020
articles_adivasis = article_by_month %>%
select(Headline, article_fu) %>% #We are asking R to select the full text of our articles and the headlines
mutate(article_fu = tolower(article_fu)) %>% # Here, we are mutating the full text of our articles into lower cases to go around the case sensitivity of our next function.
filter(grepl("adivasi|adivasis|tribal|tribe|tribes|forest dwelling|forest dweller|forest dwellers", article_fu)) #Now, we are searching for articles that mention adivasis in anyway collected in our dictionary. Note: The term forest dwelling and forest dwellers is a legalistic term used by the Indian government to refer to Adivasis in laws like the "The Scheduled Tribes and Other Traditional Dorest Dwellers Act"
view(articles_adivasis)
count(articles_adivasis)
The count of articles shows that only 8 out of 252 articles mentioned Adivasis. A minor number of articles indeed.
Discerning between two discourses: Checking for mentions of COVID 19
We suspect that said surge is due to the COVID epidemic and instances that used the Kerala floods and landslides of 2019 as a reference point to human migration related to the COVID 19. We will check for this in the next section.
We will start by finding mentions of COVID 19 in our corpus.
covid_ocurrances = article_by_month %>%
select(article_fu, Publicatio) %>% # We are selection our fields of interest, the full text of a given article and its publication date
mutate(article_fu = tolower(article_fu)) %>% # Here, we are mutating the full text of our articles into lower cases to go around the case sensitivity of our next function.
filter(grepl("covid|corona|coronavirus|covid-19|covid 19", article_fu)) #Lastly, we are asking R to find articles that used words referring to COVID-19 in their full texts.
view(covid_ocurrances)
count(covid_ocurrances)
We have a total of 35 articles that talk about COVID 19. Let’s graph their distribution across time next
ggplot(covid_ocurrances)+ #We are asking the ggplot function to take our search for mentions of COVID-19 as the data to graph
aes(Publicatio) + #We specify that the X axis should be the publication date
geom_bar(colour = 'deeppink3', alpha=0.2) + #We want a pink graph chart, the alpha of 0.2 refers to the background color
labs(x="Month of Publication", y="Number of Articles", title = "Articles talking about COVID-19 in the context of migration and the Kerala Floods and Landslides (August 2019-May 2020)") #Lastly, we are labeling our graph

This is all well and good, but a curious reader might ask him/herself how does the frequency of articles talking about COVID 19 compares to those who do not. Fear not, we will take care of it now by searching for how many articles were published from February 2020 onwards.
articles_from_april_onwards = article_by_month %>%
select(Publicatio) %>% #This time we are focusing on the publication date rather than the text of articles
filter(grepl("2020/02|2020/03|2020/04|2020/05", Publicatio)) #Now, we are searching for articles in our corpus published from the first mention of COVID 19 (February 2020) onward.
view(articles_from_april_onwards) #This command allows us to manually explore our results
count(articles_from_april_onwards)
In total, 43 articles were published from February 2020 onwards. Comparing this figure to the 35 articles than included COVID 19 we can say that from February onwards, COVID-19 reigned in the media’s discourse surrounding human mobility and the Kerala floods/landslides of 2019.
LS0tDQp0aXRsZTogIk5vdGVib29rIFBlcmZvcm1pbmcgYW4gSW52aXNpYmlsaXR5IFNwZWxsIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCg0KIyBXZWxjb21lIQ0KV2VsY29tZSB0byB0aGUgTm90ZWJvb2sgYWNjb21wYW55aW5nIHRoZSByZXNlYXJjaCBwcm9qZWN0ICJQZXJmb3JtaW5nIGFuIA0KSW52aXNpYmlsaXR5IFNwZWxsIi4gVGhpcyBub3RlYm9vayBpcyBhIHdheSBvZiBhZGRpbmcgdHJhbnNwYXJlbmN5IHRvIHNhaWQNCnByb2plY3QgYnkgc2hvd2luZyB0aGUgY29kZSBhbmQgcHJvY2VkdXJlcyB0aGF0IHlpZWxkZWQgc2V2ZXJhbCBkYXRhDQp2aXN1YWxpemF0aW9ucyB1c2VkIGluIHRoZSBhZm9yZW1lbnRpb25lZCBwYXBlci4gRm9yIHRoZSBvcGVyYXRpb25zDQptYWRlIHVzaW5nIENvcnRleCwga2luZGx5IHJlZmVyIHRvIHRoZSBsaW5rIHByb3ZpZGVkIGluIHRoZSBwYXBlci4NCkluIG9yZGVyIHRvIG1ha2UgdGhpcyBub3RlYm9vayBhcyB0cmFuc3BhcmVudCBhcyBwb3NzaWJsZSwgZWFjaCBzbmlwIG9mIGNvZGUNCmlzIGV4cGxhaW5lZCwgZWl0aGVyIGJlZm9yZSB0aGUgY29kZSBpdHNlbGYgb3IgdXNpbmcgY29tbWVudHMgbmV4dCB0byB0aGUgY29kZQ0KKHRoZSBsYXR0ZXIgYXJlIGludHJvZHVjZWQgYnkgYSBIYXNodGFnKQ0KDQojIEludHJvZHVjdG9yeSBTdGVwcw0KV2Ugc3RhcnQgYnkgbG9hZGluZyB0aGUgZXh0ZW5zaW9uICJ0aWR5dmVyc2UiLCB3aGljaCB3aWxsIGFpZCB1cyB0aHJvdWdob3V0DQp0aGUgcHJvamVjdCAocHJvdmlkaW5nIHN5bnRhY3RpYyBleHByZXNzaW9ucyBsaWtlIHRoZSBwaXBlbGluZSBvcGVyYXRvcnMgDQoiJT4lIGFzIHdlbGwgYXMgdGhlIGdncGxvdCBhbmQgZ3JlcGwgZnVuY3Rpb25zIHRoYXQgd2Ugd2lsbCB1c2UgdG8gcHJvZHVjZSBncmFwaHMgYW5kDQpzZWFyY2ggZm9yIHBhcnRpY3VsYXIgb2NjdXJyZW5jZXMgaW4gb3VyIGNvcnB1cykuDQoNCmBgYHtyfQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpgYGANCg0KQWZ0ZXJ3YXJkcywgd2UgYXJlIHRlbGxpbmcgUiB0byByZWFkIG91ciAyNTIgYXJ0aWNsZXMuIFRoZXkgYXJlIGZvcm1hdHRlZA0KaW4gYSB0YWJ1bGFyIHdheSB1c2luZyB0aGUgdHN2IGZvcm1hdC4gUGxlYXNlIGRvIG5vdGUgdGhhdCB0aGlzIGlzIGENCnNpbXBsaWZpY2F0aW9uIG9mIHRoZSByZXN1bHRzIGdhdGhlcmVkIGZyb20gRmFjdGl2YS4gSXQgZG9lcyBub3QgY29udGFpbiBzb21lDQpvZiB0aGUgcmljaCBtZXRhLWRhdGEgaW5kZXhlZCBieSBGYWN0aXZhIChleDogcmVnaW9ucyBtZW50aW9uZWQgaW4gdGhlIGFydGljbGUpDQpzaW1wbHkgYmVjYXVzZSB3ZSB3aWxsIG5vdCB1c2UgdGhlbSBpbiB0aGlzIGV4cGxvcmF0aW9uLiBGdXJ0aGVybW9yZSwgaW4gb3JkZXINCnRvIG1ha2Ugb3VyIHZpc3VhbGlzYXRpb24gcmVhZGFibGUsIHdlIGRlY2lkZWQgdG8gcmVjb2RlIHRoZSBjb2x1bW4gIlB1YmxpY2F0aW8iDQoodGhlIHB1YmxpY2F0aW9uIGRhdGUgb2YgYSBnaXZlbiBhcnRpY2xlKSBhbmQgYXNzaWduIG1vbnRocyAoZm9ybWF0OiBZZWFyL01vbnRoKQ0KcmF0aGVyIHRoYW4gdGhlIGRheSB3aGVuIGFuIGFydGljbGUgd2FzIHB1Ymxpc2hlZC4NCg0KYGBge3J9DQphcnRpY2xlX2J5X21vbnRoID0gcmVhZF90c3YoIjI1Mmdvb2QudHN2IikNCg0KYGBgDQpUaGUgbmV4dCBjb21tYW5kIGFsbG93cyB1cyB0byBtYW51YWxseSBleHBsb3JlIG91ciBjb3JwdXMuDQoNCmBgYHtyfQ0KdmlldyhhcnRpY2xlX2J5X21vbnRoKQ0KYGBgDQoNCldlIGNhbiBzZWUgdGhhdCBvdXIgY29ycHVzIGNvbnRhaW5zIHRoZSBoZWFkbGluZXMgb2YgYSBnaXZlbiBhcnRpY2xlIChjb2x1bW4gICAgICJIZWFkbGluZSIpLCB0aGUgZnVsbCB0ZXh0IG9mIHRoZSBhcnRpY2xlIChjb2x1bW4gImFydGljbGVfZnUiKSBhbmQgdGhlaXINCnB1YmxpY2F0aW9uIGRhdGVzIChjb2x1bW4gIlB1YmxpY2F0aW8iKQ0KDQojIEJhc2ljIEV4cGxvcmF0aW9uIG9mIG91ciBjb3JwdXM6IEZyZXF1ZW5jaWVzIG9mIFB1YmxpY2F0aW9uDQoNClRoZSBuZXh0IHBpZWNlIG9mIGNvZGUgIHdpbGwgcHJvZHVjZSBhIGJhciBjaGFydCBzaG93aW5nIHRoZSBmcmVxdWVuY3kgb2Ygb3VyDQphcnRpY2xlcyBvdmVyIHRpbWUuDQoNCmBgYHtyfQ0KZ2dwbG90KGFydGljbGVfYnlfbW9udGgpKyAjV2UgYXJlIGFza2luZyB0aGUgZ2dwbG90IGZ1bmN0aW9uIHRvIHRha2Ugb3VyIGNvcnB1cyBhcyB0aGUgZGF0YSB0byBncmFwaA0KICBhZXMoUHVibGljYXRpbykgKyAjVGhlIFggYXhpcyBzaG91bGQgYmUgdGhlIHB1YmxpY2F0aW9uIGRhdGUNCiAgZ2VvbV9iYXIoY29sb3VyID0gJ2dyZWVuJywgYWxwaGE9MC4yKSArICNXZSB3YW50IGEgZ3JlZW4gYmFyIGNoYXJ0DQogIGxhYnMoeD0iTW9udGggb2YgUHVibGljYXRpb24iLCB5PSJOdW1iZXIgb2YgQXJ0aWNsZXMiLCB0aXRsZSA9ICJBcnRpY2xlcyB0YWxraW5nIGFib3V0IG1pZ3JhdGlvbiBhbmQgdGhlIEtlcmFsYSBGbG9vZHMvTGFuZHNsaWRlcyAoQXVndXN0IDIwMTktTWF5IDIwMjApIikgI1RoZXNlIGFyZSB0aGUgbGFiZWxzIHdlIHdhbnQNCmBgYA0KDQpJbiB0aGUgZ3JhcGggYWJvdmUsIHdlIGNhbiBzZWUgdGhhdCB0aGUgbWVkaWEgZm9jdXNlZCBvbiBwdWJsaXNoaW5nIGFydGljbGVzIG9uDQpodW1hbiBtaWdyYXRpb24gaW4gdGhlIGNvbnRleHQgb24gdGhlIEtlcmFsYSBmbG9vZHMgYW5kIGxhbmRzbGlkZXMgb2YgMjAxOQ0KY2hpZWZseSBpbiBBdWd1c3QgYW5kIFNlcHRlbWJlciAyMDE5LiBUaGUgaW1tZWRpYXRlIG1vbnRocyBkdXJpbmcvYWZ0ZXIgdGhlDQpkaXNhc3Rlci4gSW5kZWVkLCBtb3N0IG9mIG91ciBhcnRpY2xlcyBiZWxvbmcgdG8gdGhpcyB0aW1lIHBlcmlvZCAoYXJvdW5kIDIwMCkuDQpUaGUgcHVibGljYXRpb24gb2YgYXJ0aWNsZXMgb24gaHVtYW4gbW9iaWxpdHkgYW5kIHRoZSBLZXJhbGEgZmxvb2RzL2Rpc2FzdGVyDQpuZXZlciBkaWVkIG9mZi4gSG93ZXZlciwgaXQgZGVjcmVhc2VkIGZyb20gT2N0b2JlciAyMDE5IG9ud2FyZHMgYW5kIGV4cGVyaWVuY2VkDQphIHN1cmdlIGluIE1hcmNoIDIwMjAgdGhhdCBjb250aW51ZXMgdGhyb3VnaG91dCBBcHJpbCAyMDIwLiBMYXN0bHksIHRoZSBtb250aCBvZg0KTWF5IDIwMjAgc2hvdWxkIGJlIHRha2VuIHdpdGggYSBwaW5jaCBvZiBzYWx0IHNpbmNlIHdlIG9ubHkgaGF2ZSBkYXRhIGZvciB0aGUNCmFydGljbGVzIHB1Ymxpc2hlZCBvbiB0aGUgZmlyc3QgMTEgZGF5cyBvZiBNYXkgKGhlbmNlLCBpdCBtYWtlcyBzZW5zZSBmb3IgdGhlDQpudW1iZXIgb2YgYXJ0aWNsZXMgY29udGFpbmVkIGluIG91ciBjb3JwdXMgdG8gYmUgc21hbGxlcikuDQoNCkdpdmVuIHRoYXQgd2UgZG8gbm90IHdhbnQgdG8gc2hvdyB0aGUgbGltaXRlZCBkYXRhIHdlIGhhdmUgZm9yIE1heSAyMDIwLCBsZXQgdXMNCmNyZWF0ZSBhIG5ldyBwbG90Lg0KDQpXZSBzdGFydCBieSBzZWxlY3RpbmcgdGhlIGFydGljbGVzIHB1Ymxpc2hlZCBmcm9tIEF1Z3VzdCAyMDE5IHRvIEFwcmlsIDIwMjANCg0KYGBge3J9DQphcnRpY2xlc19BdWd1c3RfQXByaWwgPSBhcnRpY2xlX2J5X21vbnRoICU+JQ0KICBzZWxlY3QoUHVibGljYXRpbykgJT4lDQogIGZpbHRlcihncmVwbCgiMjAxOS8wOHwyMDE5LzA5fDIwMTkvMTB8MjAxOS8xMXwyMDE5LzEyfDIwMjAvMDF8MjAyMC8wMnwyMDIwLzAzfDIwMjAvMDQiLCBQdWJsaWNhdGlvKSkNCmBgYA0KQW5kIHdlIGNyZWF0ZSBhIG5ldyBncmFwaA0KDQpgYGB7cn0NCmdncGxvdChhcnRpY2xlc19BdWd1c3RfQXByaWwpKyAjV2UgYXJlIGFza2luZyB0aGUgZ2dwbG90IGZ1bmN0aW9uIHRvIHRha2Ugb3VyIGNvcnB1cyBhcyB0aGUgZGF0YSB0byBncmFwaA0KICBhZXMoUHVibGljYXRpbykgKyAjVGhlIFggYXhpcyBzaG91bGQgYmUgdGhlIHB1YmxpY2F0aW9uIGRhdGUNCiAgZ2VvbV9iYXIoY29sb3VyID0gJ2JsdWUnLCBhbHBoYT0wLjIpICsgI1dlIHdhbnQgYSBibHVlIGJhciBjaGFydCB0byBkaWZmZXJlbnRpYXRlIGl0IGZyb20gb3VyIHByZXZpb3VzIGdyYXBoDQogIGxhYnMoeD0iTW9udGggb2YgUHVibGljYXRpb24iLCB5PSJOdW1iZXIgb2YgQXJ0aWNsZXMiLCB0aXRsZSA9ICJBcnRpY2xlcyB0YWxraW5nIGFib3V0IG1pZ3JhdGlvbiBhbmQgdGhlIEtlcmFsYSBGbG9vZHMvTGFuZHNsaWRlcyAoQXVndXN0IDIwMTktQXByaWwgMjAyMCkiKSAjVGhlc2UgYXJlIHRoZSBsYWJlbHMgd2Ugd2FudA0KYGBgDQoNCg0KDQpMYXN0bHksIHNpbmNlIHdlIHdvdWxkIGxpa2UgdG8gdGVsbCBleGFjdGx5IGhvdyBtYW55IGFydGljbGVzIHdlcmUgcHVibGlzaGVkDQppbiB0aGUgdHdvIG1vbnRocyB3aXRoIHRoZSBoaWdoZXN0IGZyZXF1ZW5jaWVzLCB3ZSB3aWxsIHJ1biB0aGUgZm9sbG93aW5nDQpzY3JpcHQuDQoNCmBgYHtyfQ0KYXJ0aWNsZXNfQXVndXN0X1NlcHRlbWJlciA9IGFydGljbGVfYnlfbW9udGggJT4lDQogIHNlbGVjdChQdWJsaWNhdGlvKSAlPiUgI1dlIGFyZSBhc2tpbmcgUiB0byBzZWxlY3QgdGhlIGRhdGUgb2YgcHVibGljYXRpb24gYXMgb3VyIHZhcmlhYmxlIG9mIGludGVyZXN0DQogIGZpbHRlcihncmVwbCgiMjAxOS8wOHwyMDE5LzA5IiwgUHVibGljYXRpbykpICNOb3csIHdlIGFyZSBzZWFyY2hpbmcgZm9yIGFydGljbGVzIHB1Ymxpc2hlZCBlaXRoZXIgb24gQXVndXN0IDIwMTkgb3IgU2VwdGVtYmVyIDIwMTkNCiAgY291bnQoYXJ0aWNsZXNfQXVndXN0X1NlcHRlbWJlcikNCmBgYA0KDQoNCkEgdG90YWwgb2YgMTgzIGFydGljbGVzIHdlcmUgcHVibGlzaGVkIGR1cmluZyB0aGUgZmlyc3QgdHdvIG1vbnRocy4NCg0KIyBDaGVja2luZyBmb3IgbWVudGlvbnMgb2YgdGhlIEFkaXZhc2kgY29tbXVuaXRpZXMNCg0KV2UgdW5kZXJzdGFuZCB0aGF0IHNheWluZyB0aGF0IGFydGljbGVzIHRhbGtpbmcgYWJvdXQgaHVtYW4gbW9iaWxpdHkgaW4gdGhlIA0KY29udGV4dCBvZiB0aGUgS2VyYWxhIGZsb29kcyBhbmQgbGFuZHNsaWRlcyBpbiAyMDE5IGRpZCBub3QgcG9ydHJheSBhZGl2YXNpDQpjb21tdW5pdGllcyBpcyBhIGJvbGQgY2xhaW0uIFRoZXJlZm9yZSwgd2Ugd291bGQgbm90IGJlIHN1cnByaXNlZCBpZiByZWFkZXJzDQphcmUgdW5jb252aW5jZWQgYnkganVzdCBzYXlpbmcgdGhhdCBBZGl2YXNpcyB3ZXJlIG5vdCByZXByZXNlbnRlZCBieSB0aGUNCmFuZ2xvcGhvbmUgbWVkaWEgb24gdGhlIGJhc2lzIHRoYXQgbm8gbWVudGlvbiBvZiB0aGVzZSBjb21tdW5pdGllcyBhcHBlYXJlZA0Kb24gb3VyIGV4dHJhY3RlZCBsaXN0IG9mIHRoZSA1MDAgbW9zdCBmcmVxdWVudCB0ZXJtcy4NCg0KVGhpcyBzY3JpcHQgaXMgYSBydWRpbWVudGFyeSBxdWFsaWZpY2F0aW9uIG9mIHRoYXQgY2xhaW0sIHdlIGFyZSBzZWFyY2hpbmcNCmZvciBhbnkgcmVmZXJlbmNlIHRvIGFkaXZhc2lzIG1hZGUgYnkgdGhlIG1lZGlhIHdoZW4gdGhleSB0YWxrZWQgYWJvdXQNCmh1bWFuIG1pZ3JhdGlvbiBpbiB0aGUgY29udGV4dCBvZiB0aGUgS2VyYWxhIGZsb29kcyBhbmQgbGFuZHNsaWRlcw0KZnJvbSBBdWd1c3QgMjAxOSB0byBNYXkgMjAyMA0KDQpgYGB7cn0NCmFydGljbGVzX2FkaXZhc2lzID0gYXJ0aWNsZV9ieV9tb250aCAlPiUNCiAgc2VsZWN0KEhlYWRsaW5lLCBhcnRpY2xlX2Z1KSAlPiUgI1dlIGFyZSBhc2tpbmcgUiB0byBzZWxlY3QgdGhlIGZ1bGwgdGV4dCBvZiBvdXIgYXJ0aWNsZXMgYW5kIHRoZSBoZWFkbGluZXMNCiAgbXV0YXRlKGFydGljbGVfZnUgPSB0b2xvd2VyKGFydGljbGVfZnUpKSAlPiUgIyBIZXJlLCB3ZSBhcmUgbXV0YXRpbmcgdGhlIGZ1bGwgdGV4dCBvZiBvdXIgYXJ0aWNsZXMgaW50byBsb3dlciBjYXNlcyB0byBnbyBhcm91bmQgdGhlIGNhc2Ugc2Vuc2l0aXZpdHkgb2Ygb3VyIG5leHQgZnVuY3Rpb24uDQogIGZpbHRlcihncmVwbCgiYWRpdmFzaXxhZGl2YXNpc3x0cmliYWx8dHJpYmV8dHJpYmVzfGZvcmVzdCBkd2VsbGluZ3xmb3Jlc3QgZHdlbGxlcnxmb3Jlc3QgZHdlbGxlcnMiLCBhcnRpY2xlX2Z1KSkgI05vdywgd2UgYXJlIHNlYXJjaGluZyBmb3IgYXJ0aWNsZXMgdGhhdCBtZW50aW9uIGFkaXZhc2lzIGluIGFueXdheSBjb2xsZWN0ZWQgaW4gb3VyIGRpY3Rpb25hcnkuIE5vdGU6IFRoZSB0ZXJtIGZvcmVzdCBkd2VsbGluZyBhbmQgZm9yZXN0IGR3ZWxsZXJzIGlzIGEgbGVnYWxpc3RpYyB0ZXJtIHVzZWQgYnkgdGhlIEluZGlhbiBnb3Zlcm5tZW50IHRvIHJlZmVyIHRvIEFkaXZhc2lzIGluIGxhd3MgbGlrZSB0aGUgIlRoZSBTY2hlZHVsZWQgVHJpYmVzIGFuZCBPdGhlciBUcmFkaXRpb25hbCBEb3Jlc3QgRHdlbGxlcnMgQWN0Ig0KICB2aWV3KGFydGljbGVzX2FkaXZhc2lzKQ0KICBjb3VudChhcnRpY2xlc19hZGl2YXNpcykNCmBgYA0KDQpUaGUgY291bnQgb2YgYXJ0aWNsZXMgc2hvd3MgdGhhdCBvbmx5IDggb3V0IG9mIDI1MiBhcnRpY2xlcyBtZW50aW9uZWQgQWRpdmFzaXMuDQpBIG1pbm9yIG51bWJlciBvZiBhcnRpY2xlcyBpbmRlZWQuDQoNCiMgRGlzY2VybmluZyBiZXR3ZWVuIHR3byBkaXNjb3Vyc2VzOiBDaGVja2luZyBmb3IgbWVudGlvbnMgb2YgQ09WSUQgMTkNCg0KV2Ugc3VzcGVjdCB0aGF0IHNhaWQgc3VyZ2UgaXMgZHVlIHRvIHRoZSBDT1ZJRCBlcGlkZW1pYyBhbmQgaW5zdGFuY2VzIHRoYXQNCnVzZWQgdGhlIEtlcmFsYSBmbG9vZHMgYW5kIGxhbmRzbGlkZXMgb2YgMjAxOSBhcyBhIHJlZmVyZW5jZSBwb2ludCB0byBodW1hbg0KbWlncmF0aW9uIHJlbGF0ZWQgdG8gdGhlIENPVklEIDE5LiBXZSB3aWxsIGNoZWNrIGZvciB0aGlzIGluIHRoZSBuZXh0IHNlY3Rpb24uDQoNCldlIHdpbGwgc3RhcnQgYnkgZmluZGluZyBtZW50aW9ucyBvZiBDT1ZJRCAxOSBpbiBvdXIgY29ycHVzLg0KYGBge3J9DQpjb3ZpZF9vY3VycmFuY2VzID0gYXJ0aWNsZV9ieV9tb250aCAlPiUgDQogIHNlbGVjdChhcnRpY2xlX2Z1LCBQdWJsaWNhdGlvKSAlPiUgIyBXZSBhcmUgc2VsZWN0aW9uIG91ciBmaWVsZHMgb2YgaW50ZXJlc3QsIHRoZSBmdWxsIHRleHQgb2YgYSBnaXZlbiBhcnRpY2xlIGFuZCBpdHMgcHVibGljYXRpb24gZGF0ZQ0KICBtdXRhdGUoYXJ0aWNsZV9mdSA9IHRvbG93ZXIoYXJ0aWNsZV9mdSkpICU+JSAjIEhlcmUsIHdlIGFyZSBtdXRhdGluZyB0aGUgZnVsbCB0ZXh0IG9mIG91ciBhcnRpY2xlcyBpbnRvIGxvd2VyIGNhc2VzIHRvIGdvIGFyb3VuZCB0aGUgY2FzZSBzZW5zaXRpdml0eSBvZiBvdXIgbmV4dCBmdW5jdGlvbi4NCiAgZmlsdGVyKGdyZXBsKCJjb3ZpZHxjb3JvbmF8Y29yb25hdmlydXN8Y292aWQtMTl8Y292aWQgMTkiLCBhcnRpY2xlX2Z1KSkgI0xhc3RseSwgd2UgYXJlIGFza2luZyBSIHRvIGZpbmQgYXJ0aWNsZXMgdGhhdCB1c2VkIHdvcmRzIHJlZmVycmluZyB0byBDT1ZJRC0xOSBpbiB0aGVpciBmdWxsIHRleHRzLg0KICB2aWV3KGNvdmlkX29jdXJyYW5jZXMpDQogIGNvdW50KGNvdmlkX29jdXJyYW5jZXMpDQpgYGANCg0KV2UgaGF2ZSBhIHRvdGFsIG9mIDM1IGFydGljbGVzIHRoYXQgdGFsayBhYm91dCBDT1ZJRCAxOS4gTGV0J3MgZ3JhcGggdGhlaXINCmRpc3RyaWJ1dGlvbiBhY3Jvc3MgdGltZSBuZXh0DQoNCg0KYGBge3J9DQpnZ3Bsb3QoY292aWRfb2N1cnJhbmNlcykrICNXZSBhcmUgYXNraW5nIHRoZSBnZ3Bsb3QgZnVuY3Rpb24gdG8gdGFrZSBvdXIgc2VhcmNoIGZvciBtZW50aW9ucyBvZiBDT1ZJRC0xOSBhcyB0aGUgZGF0YSB0byBncmFwaA0KICBhZXMoUHVibGljYXRpbykgKyAjV2Ugc3BlY2lmeSB0aGF0IHRoZSBYIGF4aXMgc2hvdWxkIGJlIHRoZSBwdWJsaWNhdGlvbiBkYXRlDQogIGdlb21fYmFyKGNvbG91ciA9ICdkZWVwcGluazMnLCBhbHBoYT0wLjIpICsgI1dlIHdhbnQgYSBwaW5rIGdyYXBoIGNoYXJ0LCB0aGUgYWxwaGEgb2YgMC4yIHJlZmVycyB0byB0aGUgYmFja2dyb3VuZCBjb2xvcg0KICBsYWJzKHg9Ik1vbnRoIG9mIFB1YmxpY2F0aW9uIiwgeT0iTnVtYmVyIG9mIEFydGljbGVzIiwgdGl0bGUgPSAiQXJ0aWNsZXMgdGFsa2luZyBhYm91dCBDT1ZJRC0xOSBpbiB0aGUgY29udGV4dCBvZiBtaWdyYXRpb24gYW5kIHRoZSBLZXJhbGEgRmxvb2RzIGFuZCBMYW5kc2xpZGVzIChBdWd1c3QgMjAxOS1NYXkgMjAyMCkiKSAjTGFzdGx5LCB3ZSBhcmUgbGFiZWxpbmcgb3VyIGdyYXBoDQpgYGANCg0KVGhpcyBpcyBhbGwgd2VsbCBhbmQgZ29vZCwgYnV0IGEgY3VyaW91cyByZWFkZXIgbWlnaHQgYXNrIGhpbS9oZXJzZWxmIGhvdyBkb2VzDQp0aGUgZnJlcXVlbmN5IG9mIGFydGljbGVzIHRhbGtpbmcgYWJvdXQgQ09WSUQgMTkgY29tcGFyZXMgdG8gdGhvc2Ugd2hvIGRvIG5vdC4NCkZlYXIgbm90LCB3ZSB3aWxsIHRha2UgY2FyZSBvZiBpdCBub3cgYnkgc2VhcmNoaW5nIGZvciBob3cgbWFueSBhcnRpY2xlcw0Kd2VyZSBwdWJsaXNoZWQgZnJvbSBGZWJydWFyeSAyMDIwIG9ud2FyZHMuDQoNCg0KYGBge3J9DQphcnRpY2xlc19mcm9tX2FwcmlsX29ud2FyZHMgPSBhcnRpY2xlX2J5X21vbnRoICU+JQ0KICBzZWxlY3QoUHVibGljYXRpbykgJT4lICNUaGlzIHRpbWUgd2UgYXJlIGZvY3VzaW5nIG9uIHRoZSBwdWJsaWNhdGlvbiBkYXRlIHJhdGhlciB0aGFuIHRoZSB0ZXh0IG9mIGFydGljbGVzDQogIGZpbHRlcihncmVwbCgiMjAyMC8wMnwyMDIwLzAzfDIwMjAvMDR8MjAyMC8wNSIsIFB1YmxpY2F0aW8pKSAjTm93LCB3ZSBhcmUgc2VhcmNoaW5nIGZvciBhcnRpY2xlcyBpbiBvdXIgY29ycHVzIHB1Ymxpc2hlZCBmcm9tIHRoZSBmaXJzdCBtZW50aW9uIG9mIENPVklEIDE5IChGZWJydWFyeSAyMDIwKSBvbndhcmQuDQp2aWV3KGFydGljbGVzX2Zyb21fYXByaWxfb253YXJkcykgI1RoaXMgY29tbWFuZCBhbGxvd3MgdXMgdG8gbWFudWFsbHkgZXhwbG9yZSBvdXIgcmVzdWx0cw0KY291bnQoYXJ0aWNsZXNfZnJvbV9hcHJpbF9vbndhcmRzKQ0KYGBgDQpJbiB0b3RhbCwgNDMgYXJ0aWNsZXMgd2VyZSBwdWJsaXNoZWQgZnJvbSBGZWJydWFyeSAyMDIwIG9ud2FyZHMuIENvbXBhcmluZyB0aGlzDQpmaWd1cmUgdG8gdGhlIDM1IGFydGljbGVzIHRoYW4gaW5jbHVkZWQgQ09WSUQgMTkgd2UgY2FuIHNheSB0aGF0IGZyb20gRmVicnVhcnkNCm9ud2FyZHMsIENPVklELTE5IHJlaWduZWQgaW4gdGhlIG1lZGlhJ3MgZGlzY291cnNlIHN1cnJvdW5kaW5nIGh1bWFuIG1vYmlsaXR5DQphbmQgdGhlIEtlcmFsYSBmbG9vZHMvbGFuZHNsaWRlcyBvZiAyMDE5Lg0KDQo=