D.J. Copland
12/18/2025
What has happened to the Cockney dialect? This has been a question
asked numerous times by British linguists since the start of the 21st
Century. Like many variants of British English, the so-called “Cockney”
dialect, traditionally spoken by the inhabitants of London’s East End
and immortalized in popular culture by works such as the film musical
My Fair Lady, has been subject to significant change since the
end of World War 2. Much of this change has been attributed to
demographic changes in East London, and particularly to an influx of
immigrants to the area in the latter half of the 20th Century.
But is this something we can actually visualize? In fact, yes! A
database of recorded speech called the SPADE corpus contains an entire
set of speech samples from East Londonders, sorted by age. In this
dataset, speakers with a birth year between 1914 and 1943 are
categorized as “old” speakers, and those with a birth year between 1985
and 1987 as “young” speakers. We can visualize this data using a vowel
chart, which maps the various speech sounds within a speaker’s accent
according to their formant frequencies. Simply put, formants
are harmonic frequencies within a speech signal that can be used to
measure differences between vowel sounds. Points on the chart will be
labeled with their corresponding vowel symbol from the IPA, or
International Phonetic Alphabet. This will let us see whether the vowel
set of East London dialects really has changed over time. Let’s take a
look:
library(tidyverse)
library(phonR)
library(Fonology)
library(readr)
spade_oldyoung <- read_csv("~/Montclair/Grad/Fall2025/Quantitative Linguistics/Final project/Cockney Datasets/spade_oldyoung.csv")
spade_oldyoung %>%
group_by(age_group, ipa) %>%
summarise(across(c(F1, F2), .fns = mean)) %>%
ggplot(aes(x = F2, y = F1,
color = age_group, label = ipa))+
geom_text() +
formants() +
theme(legend.position = "none",
text = element_text(size = 13)) +
labs(x = "F2", y = "F1",
color = "Age Group",
title = "SPADE East London: Old vs. Young Cockneys") +
theme_classic()

Interesting! There does certainly seem to have been some change in
the vowel space. In general, you can see that many of the younger
speakers’ vowels seem to have been pulled inward toward the center and
down from their older counterparts. One interesting exception to that
trend seems to be the /eɪ/ diphthong, as heard in the word “play.” In
traditional Cockney, that vowel actually sounds closer to the /aɪ/ sound
(as in “pie) in American English, but younger speakers seem to have
reverted to a version much closer to the higher and more fronted /e/
vowel, as in the word”pet.”
Cockney Elsewhere?
You may now be thinking, “was this dialect really only spoken in a
couple neighborhoods in East London?” As a matter of fact, a 2019 study
by Cole & Strycharczuk found what they claimed was a community of
Cockney dialect speakers in an area called the Debden Estate within the
borough of Loughton, which lies just northeast of the Greater London
border. Though the study claims that the dialect there is very close to
the older version of Cockney, it unfortunately doesn’t provide any data
from East London speakers for comparison… But since we have both
datasets, that means we can do the comparison ourselves!
This time, let’s use the geom_mark_hull function from the ggforce
package, which will let us see the entire vowel space of each variant as
a solid shape so it will be easier to see how the spaces overlap. Let’s
also split the East Londoners into Inner East London and Outer East
London, since the accents in each area are also slightly different.
library(ggforce)
cockneydata_QL %>%
group_by(ipa, InnerOuter) %>%
summarize(meanF1 = mean(F1), meanF2 = mean(F2)) %>%
ggplot(aes(x = meanF2, y = meanF1, color = InnerOuter))+
geom_text(aes(label = ipa))+
ggforce::geom_mark_hull(aes(fill = InnerOuter))+
formants() +
guides(fill="none") +
labs(x = "F2", y = "F1",
color = "Region",
title = "Cockney Formants By Region")

Whoops! I expected the vowel spaces to be different, but not
this different. It’s actually kind of hard to compare them when
they’re this offset from each other. It looks like we’ll need to
normalize these formant values first, so they’re easier to
compare. Let’s see how this looks when Debden is normalized with the
other regions.
normcockney_QL %>%
group_by(ipa, InnerOuter) %>%
summarize(meanF1 = mean(F1), meanF2 = mean(F2)) %>%
ggplot(aes(x = meanF2, y = meanF1, color = InnerOuter))+
geom_text(aes(label = ipa))+
ggforce::geom_mark_hull(aes(fill = InnerOuter))+
formants() +
guides(fill="none") +
labs(x = "F2", y = "F1",
color = "Region")

Huh. Well, it looks a little closer now, but the Debden
vowel space is still pretty different-looking from the other ones. There
might be some other factor that accounts for the difference here, or
else it seems like Cole & Strycharczuk might need to get their ears
checked.
Testing Other Variables
Let’s take a closer look at our data. I can reframe our combined
dataset to show just the demographic information for each speaker, then
make a table that tallies the number of speakers per demographic. Let’s
start by looking at the makeup of each region by age group and see if
there are any discrepancies there.
It looks like the East London dataset had a way larger proportion of
young speakers than the Debden dataset! That could certainly account for
the difference we’re seeing. Maybe that means Debden really is closer to
an older variant of Cockney after all, and the younger speakers in East
London are skewing the data.
With that in mind, let’s try this again, but this time comparing only
the older speakers from each region:
normcockney_QL %>%
filter(age_group != "Young") %>%
group_by(ipa, InnerOuter) %>%
summarize(meanF1 = mean(F1), meanF2 = mean(F2)) %>%
ggplot(aes(x = meanF2, y = meanF1, color = InnerOuter))+
geom_text(aes(label = ipa))+
ggforce::geom_mark_hull(aes(fill = InnerOuter))+
formants() +
guides(fill="none") +
labs(x = "F2", y = "F1",
color = "Region", title = "Cockney Formants By Region: Older Speakers")

That certainly seems to have been part of the issue, but there’s
still a discrepancy here. Let’s try faceting this plot by male
and female speakers.
normcockney_QL %>%
filter(age_group != "Young") %>%
group_by(ipa, InnerOuter, sex) %>%
summarize(meanF1 = mean(F1), meanF2 = mean(F2)) %>%
ggplot(aes(x = meanF2, y = meanF1, color = InnerOuter))+
geom_text(aes(label = ipa))+
ggforce::geom_mark_hull(aes(fill = InnerOuter))+
formants() +
guides(fill="none") +
labs(x = "F2", y = "F1",
color = "Region", title = "Cockney Formants By Region: Older Speakers") +
facet_wrap(~sex)

Well, there’s a surprise! It looks like it was the female East
Londoners who were the real difference here all along. Apparently
the older women in East London have moved with the times and started
speaking a dialect much closer to what the youth are speaking by pulling
their vowel space inward and down. In contrast, the Debden folks,
regardless of age or gender, seem to have actually stuck much
closer to the much wider vowel space of old-fashioned Cockney– and maybe
even widened it a little further in some places. Of course, the SPADE
dataset is from a pretty small sample size, so we should probably take
the results here with a grain of salt– particularly regarding the female
speakers. But regardless, it does indeed seem like Debden might be your
best bet if you want to hear a 20th-Century Cockney accent.
LS0tDQp0aXRsZTogIlRyYWNraW5nIHRoZSBDb2NrbmV5IEFjY2VudCBBY3Jvc3MgVGltZSBhbmQgU3BhY2UiDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCmxpbmstY2l0YXRpb25zOiBUUlVFDQpjb2RlX2ZvbGRpbmc6IGhpZGUNCi0tLQ0KDQojIyMjICpELkouIENvcGxhbmQqDQoNCiMjIyMgKjEyLzE4LzIwMjUqDQoNCldoYXQgaGFzIGhhcHBlbmVkIHRvIHRoZSBDb2NrbmV5IGRpYWxlY3Q/IFRoaXMgaGFzIGJlZW4gYSBxdWVzdGlvbiBhc2tlZCBudW1lcm91cyB0aW1lcyBieSBCcml0aXNoIGxpbmd1aXN0cyBzaW5jZSB0aGUgc3RhcnQgb2YgdGhlIDIxc3QgQ2VudHVyeS4gTGlrZSBtYW55IHZhcmlhbnRzIG9mIEJyaXRpc2ggRW5nbGlzaCwgdGhlIHNvLWNhbGxlZCAiQ29ja25leSIgZGlhbGVjdCwgdHJhZGl0aW9uYWxseSBzcG9rZW4gYnkgdGhlIGluaGFiaXRhbnRzIG9mIExvbmRvbidzIEVhc3QgRW5kIGFuZCBpbW1vcnRhbGl6ZWQgaW4gcG9wdWxhciBjdWx0dXJlIGJ5IHdvcmtzIHN1Y2ggYXMgdGhlIGZpbG0gbXVzaWNhbCAqTXkgRmFpciBMYWR5KiwgaGFzIGJlZW4gc3ViamVjdCB0byBzaWduaWZpY2FudCBjaGFuZ2Ugc2luY2UgdGhlIGVuZCBvZiBXb3JsZCBXYXIgMi4gTXVjaCBvZiB0aGlzIGNoYW5nZSBoYXMgYmVlbiBhdHRyaWJ1dGVkIHRvIGRlbW9ncmFwaGljIGNoYW5nZXMgaW4gRWFzdCBMb25kb24sIGFuZCBwYXJ0aWN1bGFybHkgdG8gYW4gaW5mbHV4IG9mIGltbWlncmFudHMgdG8gdGhlIGFyZWEgaW4gdGhlIGxhdHRlciBoYWxmIG9mIHRoZSAyMHRoIENlbnR1cnkuDQoNCkJ1dCBpcyB0aGlzIHNvbWV0aGluZyB3ZSBjYW4gYWN0dWFsbHkgdmlzdWFsaXplPyBJbiBmYWN0LCB5ZXMhIEEgZGF0YWJhc2Ugb2YgcmVjb3JkZWQgc3BlZWNoIGNhbGxlZCB0aGUgU1BBREUgY29ycHVzIGNvbnRhaW5zIGFuIGVudGlyZSBzZXQgb2Ygc3BlZWNoIHNhbXBsZXMgZnJvbSBFYXN0IExvbmRvbmRlcnMsIHNvcnRlZCBieSBhZ2UuIEluIHRoaXMgZGF0YXNldCwgc3BlYWtlcnMgd2l0aCBhIGJpcnRoIHllYXIgYmV0d2VlbiAxOTE0IGFuZCAxOTQzIGFyZSBjYXRlZ29yaXplZCBhcyAib2xkIiBzcGVha2VycywgYW5kIHRob3NlIHdpdGggYSBiaXJ0aCB5ZWFyIGJldHdlZW4gMTk4NSBhbmQgMTk4NyBhcyAieW91bmciIHNwZWFrZXJzLiBXZSBjYW4gdmlzdWFsaXplIHRoaXMgZGF0YSB1c2luZyBhIHZvd2VsIGNoYXJ0LCB3aGljaCBtYXBzIHRoZSB2YXJpb3VzIHNwZWVjaCBzb3VuZHMgd2l0aGluIGEgc3BlYWtlcidzIGFjY2VudCBhY2NvcmRpbmcgdG8gdGhlaXIgKmZvcm1hbnQgZnJlcXVlbmNpZXMqLiBTaW1wbHkgcHV0LCBmb3JtYW50cyBhcmUgaGFybW9uaWMgZnJlcXVlbmNpZXMgd2l0aGluIGEgc3BlZWNoIHNpZ25hbCB0aGF0IGNhbiBiZSB1c2VkIHRvIG1lYXN1cmUgZGlmZmVyZW5jZXMgYmV0d2VlbiB2b3dlbCBzb3VuZHMuIFBvaW50cyBvbiB0aGUgY2hhcnQgd2lsbCBiZSBsYWJlbGVkIHdpdGggdGhlaXIgY29ycmVzcG9uZGluZyB2b3dlbCBzeW1ib2wgZnJvbSB0aGUgSVBBLCBvciBJbnRlcm5hdGlvbmFsIFBob25ldGljIEFscGhhYmV0LiBUaGlzIHdpbGwgbGV0IHVzIHNlZSB3aGV0aGVyIHRoZSB2b3dlbCBzZXQgb2YgRWFzdCBMb25kb24gZGlhbGVjdHMgcmVhbGx5IGhhcyBjaGFuZ2VkIG92ZXIgdGltZS4gTGV0J3MgdGFrZSBhIGxvb2s6DQoNCmBgYHtyfQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KHBob25SKQ0KbGlicmFyeShGb25vbG9neSkNCmxpYnJhcnkocmVhZHIpDQoNCnNwYWRlX29sZHlvdW5nIDwtIHJlYWRfY3N2KCJ+L01vbnRjbGFpci9HcmFkL0ZhbGwyMDI1L1F1YW50aXRhdGl2ZSBMaW5ndWlzdGljcy9GaW5hbCBwcm9qZWN0L0NvY2tuZXkgRGF0YXNldHMvc3BhZGVfb2xkeW91bmcuY3N2IikNCg0Kc3BhZGVfb2xkeW91bmcgJT4lIA0KZ3JvdXBfYnkoYWdlX2dyb3VwLCBpcGEpICU+JSANCnN1bW1hcmlzZShhY3Jvc3MoYyhGMSwgRjIpLCAuZm5zID0gbWVhbikpICAlPiUgDQogIGdncGxvdChhZXMoeCA9IEYyLCB5ID0gRjEsIA0KICAgICAgICAgICAgIGNvbG9yID0gYWdlX2dyb3VwLCBsYWJlbCA9IGlwYSkpKw0KICBnZW9tX3RleHQoKSArIA0KICBmb3JtYW50cygpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLA0KICAgICAgICB0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMykpICsNCiAgbGFicyh4ID0gIkYyIiwgeSA9ICJGMSIsIA0KICAgICAgIGNvbG9yID0gIkFnZSBHcm91cCIsIA0KICAgICAgIHRpdGxlID0gIlNQQURFIEVhc3QgTG9uZG9uOiBPbGQgdnMuIFlvdW5nIENvY2tuZXlzIikgKw0KICB0aGVtZV9jbGFzc2ljKCkNCmBgYA0KSW50ZXJlc3RpbmchIFRoZXJlIGRvZXMgY2VydGFpbmx5IHNlZW0gdG8gaGF2ZSBiZWVuIHNvbWUgY2hhbmdlIGluIHRoZSB2b3dlbCBzcGFjZS4gSW4gZ2VuZXJhbCwgeW91IGNhbiBzZWUgdGhhdCBtYW55IG9mIHRoZSB5b3VuZ2VyIHNwZWFrZXJzJyB2b3dlbHMgc2VlbSB0byBoYXZlIGJlZW4gcHVsbGVkIGlud2FyZCB0b3dhcmQgdGhlIGNlbnRlciBhbmQgZG93biBmcm9tIHRoZWlyIG9sZGVyIGNvdW50ZXJwYXJ0cy4gT25lIGludGVyZXN0aW5nIGV4Y2VwdGlvbiB0byB0aGF0IHRyZW5kIHNlZW1zIHRvIGJlIHRoZSAvZcmqLyBkaXBodGhvbmcsIGFzIGhlYXJkIGluIHRoZSB3b3JkICJwbGF5LiIgSW4gdHJhZGl0aW9uYWwgQ29ja25leSwgdGhhdCB2b3dlbCBhY3R1YWxseSBzb3VuZHMgY2xvc2VyIHRvIHRoZSAvYcmqLyBzb3VuZCAoYXMgaW4gInBpZSkgaW4gQW1lcmljYW4gRW5nbGlzaCwgYnV0IHlvdW5nZXIgc3BlYWtlcnMgc2VlbSB0byBoYXZlIHJldmVydGVkIHRvIGEgdmVyc2lvbiBtdWNoIGNsb3NlciB0byB0aGUgaGlnaGVyIGFuZCBtb3JlIGZyb250ZWQgL2UvIHZvd2VsLCBhcyBpbiB0aGUgd29yZCAicGV0LiIgIA0KDQojIyBDb2NrbmV5IEVsc2V3aGVyZT8gIA0KDQpZb3UgbWF5IG5vdyBiZSB0aGlua2luZywgIndhcyB0aGlzIGRpYWxlY3QgcmVhbGx5IG9ubHkgc3Bva2VuIGluIGEgY291cGxlIG5laWdoYm9yaG9vZHMgaW4gRWFzdCBMb25kb24/IiBBcyBhIG1hdHRlciBvZiBmYWN0LCBhIDIwMTkgc3R1ZHkgYnkgQ29sZSAmIFN0cnljaGFyY3p1ayBmb3VuZCB3aGF0IHRoZXkgY2xhaW1lZCB3YXMgYSBjb21tdW5pdHkgb2YgQ29ja25leSBkaWFsZWN0IHNwZWFrZXJzIGluIGFuIGFyZWEgY2FsbGVkIHRoZSBEZWJkZW4gRXN0YXRlIHdpdGhpbiB0aGUgYm9yb3VnaCBvZiBMb3VnaHRvbiwgd2hpY2ggbGllcyBqdXN0IG5vcnRoZWFzdCBvZiB0aGUgR3JlYXRlciBMb25kb24gYm9yZGVyLiBUaG91Z2ggdGhlIHN0dWR5IGNsYWltcyB0aGF0IHRoZSBkaWFsZWN0IHRoZXJlIGlzIHZlcnkgY2xvc2UgdG8gdGhlIG9sZGVyIHZlcnNpb24gb2YgQ29ja25leSwgaXQgdW5mb3J0dW5hdGVseSBkb2Vzbid0IHByb3ZpZGUgYW55IGRhdGEgZnJvbSBFYXN0IExvbmRvbiBzcGVha2VycyBmb3IgY29tcGFyaXNvbi4uLiBCdXQgc2luY2Ugd2UgaGF2ZSBib3RoIGRhdGFzZXRzLCB0aGF0IG1lYW5zIHdlIGNhbiBkbyB0aGUgY29tcGFyaXNvbiBvdXJzZWx2ZXMhICANCg0KVGhpcyB0aW1lLCBsZXQncyB1c2UgdGhlIGdlb21fbWFya19odWxsIGZ1bmN0aW9uIGZyb20gdGhlIGdnZm9yY2UgcGFja2FnZSwgd2hpY2ggd2lsbCBsZXQgdXMgc2VlIHRoZSBlbnRpcmUgdm93ZWwgc3BhY2Ugb2YgZWFjaCB2YXJpYW50IGFzIGEgc29saWQgc2hhcGUgc28gaXQgd2lsbCBiZSBlYXNpZXIgdG8gc2VlIGhvdyB0aGUgc3BhY2VzIG92ZXJsYXAuIExldCdzIGFsc28gc3BsaXQgdGhlIEVhc3QgTG9uZG9uZXJzIGludG8gSW5uZXIgRWFzdCBMb25kb24gYW5kIE91dGVyIEVhc3QgTG9uZG9uLCBzaW5jZSB0aGUgYWNjZW50cyBpbiBlYWNoIGFyZWEgYXJlIGFsc28gc2xpZ2h0bHkgZGlmZmVyZW50Lg0KDQpgYGB7cn0NCmxpYnJhcnkoZ2dmb3JjZSkNCg0KY29ja25leWRhdGFfUUwgJT4lIA0KICBncm91cF9ieShpcGEsIElubmVyT3V0ZXIpICU+JSANCiAgc3VtbWFyaXplKG1lYW5GMSA9IG1lYW4oRjEpLCBtZWFuRjIgPSBtZWFuKEYyKSkgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBtZWFuRjIsIHkgPSBtZWFuRjEsIGNvbG9yID0gSW5uZXJPdXRlcikpKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gaXBhKSkrDQogIGdnZm9yY2U6Omdlb21fbWFya19odWxsKGFlcyhmaWxsID0gSW5uZXJPdXRlcikpKw0KICBmb3JtYW50cygpICsNCiAgZ3VpZGVzKGZpbGw9Im5vbmUiKSArDQogIGxhYnMoeCA9ICJGMiIsIHkgPSAiRjEiLCANCiAgICAgICBjb2xvciA9ICJSZWdpb24iLCANCiAgICAgICB0aXRsZSA9ICJDb2NrbmV5IEZvcm1hbnRzIEJ5IFJlZ2lvbiIpIA0KYGBgDQpXaG9vcHMhIEkgZXhwZWN0ZWQgdGhlIHZvd2VsIHNwYWNlcyB0byBiZSBkaWZmZXJlbnQsIGJ1dCBub3QgKnRoaXMqIGRpZmZlcmVudC4gSXQncyBhY3R1YWxseSBraW5kIG9mIGhhcmQgdG8gY29tcGFyZSB0aGVtIHdoZW4gdGhleSdyZSB0aGlzIG9mZnNldCBmcm9tIGVhY2ggb3RoZXIuIEl0IGxvb2tzIGxpa2Ugd2UnbGwgbmVlZCB0byAqbm9ybWFsaXplKiB0aGVzZSBmb3JtYW50IHZhbHVlcyBmaXJzdCwgc28gdGhleSdyZSBlYXNpZXIgdG8gY29tcGFyZS4gTGV0J3Mgc2VlIGhvdyB0aGlzIGxvb2tzIHdoZW4gRGViZGVuIGlzIG5vcm1hbGl6ZWQgd2l0aCB0aGUgb3RoZXIgcmVnaW9ucy4NCg0KYGBge3J9DQpub3JtY29ja25leV9RTCAlPiUgDQogIGdyb3VwX2J5KGlwYSwgSW5uZXJPdXRlcikgJT4lIA0KICBzdW1tYXJpemUobWVhbkYxID0gbWVhbihGMSksIG1lYW5GMiA9IG1lYW4oRjIpKSAlPiUgDQogIGdncGxvdChhZXMoeCA9IG1lYW5GMiwgeSA9IG1lYW5GMSwgY29sb3IgPSBJbm5lck91dGVyKSkrDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBpcGEpKSsNCiAgZ2dmb3JjZTo6Z2VvbV9tYXJrX2h1bGwoYWVzKGZpbGwgPSBJbm5lck91dGVyKSkrDQogIGZvcm1hbnRzKCkgKw0KICBndWlkZXMoZmlsbD0ibm9uZSIpICsNCiAgbGFicyh4ID0gIkYyIiwgeSA9ICJGMSIsIA0KICAgICAgIGNvbG9yID0gIlJlZ2lvbiIpIA0KYGBgDQoNCkh1aC4gV2VsbCwgaXQgbG9va3MgYSAqbGl0dGxlKiBjbG9zZXIgbm93LCBidXQgdGhlIERlYmRlbiB2b3dlbCBzcGFjZSBpcyBzdGlsbCBwcmV0dHkgZGlmZmVyZW50LWxvb2tpbmcgZnJvbSB0aGUgb3RoZXIgb25lcy4gVGhlcmUgbWlnaHQgYmUgc29tZSBvdGhlciBmYWN0b3IgdGhhdCBhY2NvdW50cyBmb3IgdGhlIGRpZmZlcmVuY2UgaGVyZSwgb3IgZWxzZSBpdCBzZWVtcyBsaWtlIENvbGUgJiBTdHJ5Y2hhcmN6dWsgbWlnaHQgbmVlZCB0byBnZXQgdGhlaXIgZWFycyBjaGVja2VkLiAgDQoNCg0KIyMgVGVzdGluZyBPdGhlciBWYXJpYWJsZXMNCg0KTGV0J3MgdGFrZSBhIGNsb3NlciBsb29rIGF0IG91ciBkYXRhLiBJIGNhbiByZWZyYW1lIG91ciBjb21iaW5lZCBkYXRhc2V0IHRvIHNob3cganVzdCB0aGUgZGVtb2dyYXBoaWMgaW5mb3JtYXRpb24gZm9yIGVhY2ggc3BlYWtlciwgdGhlbiBtYWtlIGEgdGFibGUgdGhhdCB0YWxsaWVzIHRoZSBudW1iZXIgb2Ygc3BlYWtlcnMgcGVyIGRlbW9ncmFwaGljLiBMZXQncyBzdGFydCBieSBsb29raW5nIGF0IHRoZSBtYWtldXAgb2YgZWFjaCByZWdpb24gYnkgYWdlIGdyb3VwIGFuZCBzZWUgaWYgdGhlcmUgYXJlIGFueSBkaXNjcmVwYW5jaWVzIHRoZXJlLg0KDQpgYGB7cn0NCmNvY2tuZXlfcGVyc3BlYWtlciA8LSBub3JtY29ja25leV9RTCAlPiUgDQogIGdyb3VwX2J5KHNwZWFrZXJfaWQpICU+JSANCiAgcmVmcmFtZShJbm5lck91dGVyLCBzZXgsIGV0aG5pY19iYWNrZ3JvdW5kLCBhZ2VfZ3JvdXApICU+JSANCiAgZGlzdGluY3QoKQ0KDQpwYXJ0X2FnZSA8LSBjb2NrbmV5X3BlcnNwZWFrZXIgJT4lIA0KICBjb3VudChJbm5lck91dGVyLCBhZ2VfZ3JvdXApDQoNCnBhcnRfYWdlDQpgYGANCg0KSXQgbG9va3MgbGlrZSB0aGUgRWFzdCBMb25kb24gZGF0YXNldCBoYWQgYSB3YXkgbGFyZ2VyIHByb3BvcnRpb24gb2YgeW91bmcgc3BlYWtlcnMgdGhhbiB0aGUgRGViZGVuIGRhdGFzZXQhIFRoYXQgY291bGQgY2VydGFpbmx5IGFjY291bnQgZm9yIHRoZSBkaWZmZXJlbmNlIHdlJ3JlIHNlZWluZy4gTWF5YmUgdGhhdCBtZWFucyBEZWJkZW4gcmVhbGx5IGlzIGNsb3NlciB0byBhbiBvbGRlciB2YXJpYW50IG9mIENvY2tuZXkgYWZ0ZXIgYWxsLCBhbmQgdGhlIHlvdW5nZXIgc3BlYWtlcnMgaW4gRWFzdCBMb25kb24gYXJlIHNrZXdpbmcgdGhlIGRhdGEuICANCg0KV2l0aCB0aGF0IGluIG1pbmQsIGxldCdzIHRyeSB0aGlzIGFnYWluLCBidXQgdGhpcyB0aW1lIGNvbXBhcmluZyBvbmx5IHRoZSBvbGRlciBzcGVha2VycyBmcm9tIGVhY2ggcmVnaW9uOg0KDQpgYGB7cn0NCm5vcm1jb2NrbmV5X1FMICU+JSANCiAgZmlsdGVyKGFnZV9ncm91cCAhPSAiWW91bmciKSAlPiUgDQogIGdyb3VwX2J5KGlwYSwgSW5uZXJPdXRlcikgJT4lIA0KICBzdW1tYXJpemUobWVhbkYxID0gbWVhbihGMSksIG1lYW5GMiA9IG1lYW4oRjIpKSAlPiUgDQogIGdncGxvdChhZXMoeCA9IG1lYW5GMiwgeSA9IG1lYW5GMSwgY29sb3IgPSBJbm5lck91dGVyKSkrDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBpcGEpKSsNCiAgZ2dmb3JjZTo6Z2VvbV9tYXJrX2h1bGwoYWVzKGZpbGwgPSBJbm5lck91dGVyKSkrDQogIGZvcm1hbnRzKCkgKw0KICBndWlkZXMoZmlsbD0ibm9uZSIpICsNCiAgbGFicyh4ID0gIkYyIiwgeSA9ICJGMSIsIA0KICAgICAgIGNvbG9yID0gIlJlZ2lvbiIsIHRpdGxlID0gIkNvY2tuZXkgRm9ybWFudHMgQnkgUmVnaW9uOiBPbGRlciBTcGVha2VycyIpDQpgYGANCg0KVGhhdCBjZXJ0YWlubHkgc2VlbXMgdG8gaGF2ZSBiZWVuIHBhcnQgb2YgdGhlIGlzc3VlLCBidXQgdGhlcmUncyBzdGlsbCBhIGRpc2NyZXBhbmN5IGhlcmUuIExldCdzIHRyeSAqZmFjZXRpbmcqIHRoaXMgcGxvdCBieSBtYWxlIGFuZCBmZW1hbGUgc3BlYWtlcnMuDQoNCmBgYHtyfQ0Kbm9ybWNvY2tuZXlfUUwgJT4lIA0KICBmaWx0ZXIoYWdlX2dyb3VwICE9ICJZb3VuZyIpICU+JSANCiAgZ3JvdXBfYnkoaXBhLCBJbm5lck91dGVyLCBzZXgpICU+JSANCiAgc3VtbWFyaXplKG1lYW5GMSA9IG1lYW4oRjEpLCBtZWFuRjIgPSBtZWFuKEYyKSkgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBtZWFuRjIsIHkgPSBtZWFuRjEsIGNvbG9yID0gSW5uZXJPdXRlcikpKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gaXBhKSkrDQogIGdnZm9yY2U6Omdlb21fbWFya19odWxsKGFlcyhmaWxsID0gSW5uZXJPdXRlcikpKw0KICBmb3JtYW50cygpICsNCiAgZ3VpZGVzKGZpbGw9Im5vbmUiKSArDQogIGxhYnMoeCA9ICJGMiIsIHkgPSAiRjEiLCANCiAgICAgICBjb2xvciA9ICJSZWdpb24iLCB0aXRsZSA9ICJDb2NrbmV5IEZvcm1hbnRzIEJ5IFJlZ2lvbjogT2xkZXIgU3BlYWtlcnMiKSArDQogIGZhY2V0X3dyYXAofnNleCkNCmBgYA0KV2VsbCwgdGhlcmUncyBhIHN1cnByaXNlISBJdCBsb29rcyBsaWtlIGl0IHdhcyB0aGUgKmZlbWFsZSBFYXN0IExvbmRvbmVycyogd2hvIHdlcmUgdGhlIHJlYWwgZGlmZmVyZW5jZSBoZXJlIGFsbCBhbG9uZy4gQXBwYXJlbnRseSB0aGUgb2xkZXIgd29tZW4gaW4gRWFzdCBMb25kb24gaGF2ZSBtb3ZlZCB3aXRoIHRoZSB0aW1lcyBhbmQgc3RhcnRlZCBzcGVha2luZyBhIGRpYWxlY3QgbXVjaCBjbG9zZXIgdG8gd2hhdCB0aGUgeW91dGggYXJlIHNwZWFraW5nIGJ5IHB1bGxpbmcgdGhlaXIgdm93ZWwgc3BhY2UgaW53YXJkIGFuZCBkb3duLiBJbiBjb250cmFzdCwgdGhlIERlYmRlbiBmb2xrcywgKnJlZ2FyZGxlc3Mgb2YgYWdlIG9yIGdlbmRlciwqIHNlZW0gdG8gaGF2ZSBhY3R1YWxseSBzdHVjayBtdWNoIGNsb3NlciB0byB0aGUgbXVjaCB3aWRlciB2b3dlbCBzcGFjZSBvZiBvbGQtZmFzaGlvbmVkIENvY2tuZXktLSBhbmQgbWF5YmUgZXZlbiB3aWRlbmVkIGl0IGEgbGl0dGxlIGZ1cnRoZXIgaW4gc29tZSBwbGFjZXMuIE9mIGNvdXJzZSwgdGhlIFNQQURFIGRhdGFzZXQgaXMgZnJvbSBhIHByZXR0eSBzbWFsbCBzYW1wbGUgc2l6ZSwgc28gd2Ugc2hvdWxkIHByb2JhYmx5IHRha2UgdGhlIHJlc3VsdHMgaGVyZSB3aXRoIGEgZ3JhaW4gb2Ygc2FsdC0tIHBhcnRpY3VsYXJseSByZWdhcmRpbmcgdGhlIGZlbWFsZSBzcGVha2Vycy4gQnV0IHJlZ2FyZGxlc3MsIGl0IGRvZXMgaW5kZWVkIHNlZW0gbGlrZSBEZWJkZW4gbWlnaHQgYmUgeW91ciBiZXN0IGJldCBpZiB5b3Ugd2FudCB0byBoZWFyIGEgMjB0aC1DZW50dXJ5IENvY2tuZXkgYWNjZW50Lg==