Background

In November 2016, it was estimated that there has been a 20% increase in trains running behind schedule as compared to November 2015 (Rivoli 2017). These delays have been steadily increasing for years, and frustration is building in frequent riders. A study by Ryzin et al, 2004 indicate that subway services (among other public services) is a fairly important driver of quality and satisfaction of citizens in NYC. In the same study of New York City inhabitants, subway service satisfaction received detrimentally low ratings (Ryzin et al. 2004). This study legitimizes the importance of functional subway service in NYC and further establishes a basis of dissatisfaction with MTA services.

A look at the MTA statistics reveals a 63.3% on time assessment, indicating that the subway in NYC is not on time nearly half of the time (46.7%) (MTA 2017). The New York Times states that the average distance that subway cars travel between breakdowns was about 120,000 miles in November 2016, down from 200,000 in November 2010, indicating a large increase in train break downs (Whitford 2017). These delays result in consequences for those who rely on the MTA to get to and from work, basically inhibiting them from being able to make it to work on time due to the unpredictability of service. In addition to problems of delays, consumers are also displeased with the large crowds both at the stations and in the trains themselves. This problem of overcrowding is responsible for more than a third of subway delays. “The decline in service is frustrating many passengers as they stew on stalled trains, pressing uncomfortably close to other riders and worrying about being late to work. When an overstuffed train arrives, commuters must decide whether to squeeze aboard or wait for another, however long that takes,” speaking to other areas that need improvement (Fitzsimmons 2017).

Despite this service being relatively low performing, the prices have increased 37.5% in the past eight years ($.75) and are expected to rise another 9% to $3.00 in 2017 (Pham 2015).

Many people take their frustration at the MTA to Twitter, where users are able to tweet directly at the MTA and can also unite their tweets with the hashtag “#MTA”. A Gothamist article showcases some of the individual tweets that were made in response to an incident on the L train in January, with one person tweeting “the L train was specifically formulated to cause me as much stress as possible,” and another tweeting “My L train broke down under the east river. Was there for like thirty minutes, maybe more. Now out of service at 1st Ave.” These tweets can clearly be interpreted as negative, though some riders are a bit more sarcastic in their evaluation of the same situation, with a tweet stating “I love the L train,” paired with a photo that showcases an overcrowded station (Signore 2017).

Tweets like this can be found nearly daily with people indicating their frustration with the services by the MTA, so the present analysis focused on extracting these tweets and analyzing the words in the tweets for negative or positive sentiments.

Hypotheses:

  • There will be more negative words than positive words used in tweets with the hashtag “#MTA”.
  • Negative tweets will be made in regard to the service of the trains.

Method

The methods utilized to view the positive and negative sentiments corresponding to tweets with the hashtag #MTA, was simply to conduct the analysis and produce visualizations to show the tone taken on twitter about the MTA. We began by cleaning the twitter data, which consisted of 2,431 tweets made with the #MTA during the month of April. Cleaning consisted of: removing emoji’s; removing stop words and other twitter lingo (i.e. “rt”); removing tweets made by spam accounts and those made by the MTA; and reformatting the tweets to a “one token per cell format”. This left us with 1,725 individual words to view. Then, we used ggplot to visualize the most freuqently used words (used 100 times or more) when using the #MTA hashtag. Next, we used ggplot to visualize the net number of positive and negative words used in tweets with “#MTA”. Then, we made a word cloud that was split by positive and negative sentiments. After, we provided context to a few of the “positive” words, by showcasing them with their corresponding tweets to determine if the positive words correspond with overall positive tweets. Last, we created a word web to see which words often were grouped together in the tweets. All of these visualizations give the readers some insight as to twitter’s feelings about the MTA; or at least, their word choice when speaking of the MTA on Twitter.

Results

The result in Table 1 show generally neutral words for the first few most commonly used words, where “nyc” “train” “subway” and “service” were the most common words, followed by “delay” (n=259). Table 2 shows that there are more than twice the amount of negative words used in tweets with the #MTA, than there are positive words. In table 3 we see that the most common word, is a negative word, “delays”. Additionally, we see that there is a wider variety of positive words used than negative words, indicating that the same negative words tend to be used, but at higher rates than positive words. Table 4 provides us with 10 tweets that included the word “love,” one of the positive words rendered from the word cloud. The tweets indicate that many of the tweets containing the word “love” were made sarcastically. Similarly, we see sarcastic positive tweets made in tables 5 and 6 with the words “happy” and “enjoy,” respectively. The last table ( table 7 ) shows the words that have been made together two times or more.

Tables and Figures

Table 1 Most Frequently Used Words


Table 2 Count of Negative and Positive Sentiments


Table 3 Sentiment Word Cloud


Table 4 10 Tweets Containing The Word “Love”


Table 5 8 Tweets Containing The Word “Happy”


Table 6 4 Tweets Containing The Word “Enjoy”


Table 7

Dicussion and Conclusion

The visualizations abosve confirmed the research hypotheses: that generally, more negative words than positive words are used when tweets are made with the #mta. The negative word count is more than double the positive word count, despite there being less different negative words being used. This indicates that people generally speak more negatively than positively about the MTA on Twitter. Additionally, tables 4,5, and 6 indicate that even when positive language is used to describe the MTA, the underlying meaning tends to be negative as well. Coming together with the literature, the results further express the frustration experienced by MTA riders at the quality of service. The second hypothesis was also correct, with the most common word “delays,” being a negative word that relates to the overall service and functionality of the MTA.

An unfortunate limitation of sentiment analysis is that it is unable to distinguish the context in which humans speak, like the use of sarcasm. Because of this, the depiction of positive words appears to be inflated than what it might be if the overall context of the tweet was evaluated rather than the inidivudal words.

While the present investigation rendered interesting information about tweets that are made with the #MTA, it provides us with little empirical evidence as to the dissatisfaction [or satisfaction] of those who ride the MTA. Further investigation is needed to determine consumer satisfaction is significantly negative or positive, and not solely evaluated through Twitter. Satisfaction with the MTA and other public services has been investigated minimally for research purposes, and so further analyses should be conducted in order to be an effective catalyst for change the transportation system.

References

Fitzsimmons, Emma G. 2017. “Subway’s Slide in Performance Leaves Straphangers Fuming.” The New York Times, February. https://www.nytimes.com/2017/02/12/nyregion/subway-complaints-straphangers-fuming.html?rref=collection%2Fsectioncollection%2Fnyregion&_r=2.

MTA. 2017. “MTA Stat - Nyc Transit Performance Dashboard.” May. http://web.mta.info/persdashboard/performance14.html#.

Pham, Diane. 2015. “All the Mta Fare Hikes of the Last 100 Years.” 6sqft, March. https://www.6sqft.com/all-the-mta-fare-hikes-over-the-last-100-years-plus-a-video-of-when-it-cost-just-15-cents/.

Rivoli, Dan. 2017. “MTA Board Member Slams the Agency for Misleading New Yorkers About Delays in Subway Service.” Daily News, January. http://www.nydailynews.com/new-york/mta-ripped-misleading-new-yorkers-subway-delays-article-1.2953806.

Ryzin, Gregg G, Douglas Muzzio, Stephen Immerwahr, Lisa Gulick, and Eve Martinez. 2004. “Drivers and Consequences of Citizen Satisfaction: An Application of the American Customer Satisfaction Index Model to New York City.” Public Administration Review 64 (3). Wiley Online Library: 331–41.

Signore, John Del. 2017. “The L Train Had No Interest in Your Silly ’Plans’ This Morning.” Gothamist. http://gothamist.com/2017/01/19/the_story_of_the_l.php.

Whitford, Emma. 2017. “You’re Not Imagining Things: Data Shows Subway Service Getting Worse.” Gothamist, February. http://gothamist.com/2017/02/13/subway_delays_mta_cuomo.php.

LS0tCnRpdGxlOiAiUG9zaXRpdmUgYW5kIE5lZ2F0aXZlIFNlbnRpbWVudHMgb2YgdGhlICNNVEEiCm91dHB1dDogaHRtbF9ub3RlYm9vawpiaWJsaW9ncmFwaHk6IE1UQWNpdGVzLmJpYgotLS0KCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQpsaWJyYXJ5KENpdGUpCmxpYnJhcnkocGx5cikKbGlicmFyeShkcGx5cikKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KHRpZHl0ZXh0KQpsaWJyYXJ5KHdvcmRjbG91ZCkKbGlicmFyeShnZ3RoZW1lcykKbGlicmFyeShyZXNoYXBlMikKbGlicmFyeShtYWdyaXR0cikKbGlicmFyeShzdHJpbmdyKQpgYGAKCiMjQmFja2dyb3VuZCAKCkluIE5vdmVtYmVyIDIwMTYsIGl0IHdhcyBlc3RpbWF0ZWQgdGhhdCB0aGVyZSBoYXMgYmVlbiBhIDIwJSBpbmNyZWFzZSBpbiB0cmFpbnMgcnVubmluZyBiZWhpbmQgc2NoZWR1bGUgYXMgY29tcGFyZWQgdG8gTm92ZW1iZXIgMjAxNSBbQERhaWx5TmV3czIwMTdTZXJ2aWNlXS4gVGhlc2UgZGVsYXlzIGhhdmUgYmVlbiBzdGVhZGlseSBpbmNyZWFzaW5nIGZvciB5ZWFycywgYW5kIGZydXN0cmF0aW9uIGlzIGJ1aWxkaW5nIGluIGZyZXF1ZW50IHJpZGVycy4gQSBzdHVkeSBieSBSeXppbiBldCBhbCwgMjAwNCBpbmRpY2F0ZSB0aGF0IHN1YndheSBzZXJ2aWNlcyAoYW1vbmcgb3RoZXIgcHVibGljIHNlcnZpY2VzKSBpcyBhIGZhaXJseSBpbXBvcnRhbnQgZHJpdmVyIG9mIHF1YWxpdHkgYW5kIHNhdGlzZmFjdGlvbiBvZiBjaXRpemVucyBpbiBOWUMuIEluIHRoZSBzYW1lIHN0dWR5IG9mIE5ldyBZb3JrIENpdHkgaW5oYWJpdGFudHMsIHN1YndheSBzZXJ2aWNlIHNhdGlzZmFjdGlvbiByZWNlaXZlZCBkZXRyaW1lbnRhbGx5IGxvdyByYXRpbmdzIFtAcnl6aW4yMDA0ZHJpdmVyc10uIFRoaXMgc3R1ZHkgbGVnaXRpbWl6ZXMgdGhlIGltcG9ydGFuY2Ugb2YgZnVuY3Rpb25hbCBzdWJ3YXkgc2VydmljZSBpbiBOWUMgYW5kIGZ1cnRoZXIgZXN0YWJsaXNoZXMgYSBiYXNpcyBvZiBkaXNzYXRpc2ZhY3Rpb24gd2l0aCBNVEEgc2VydmljZXMuIAoKQSBsb29rIGF0IHRoZSBNVEEgc3RhdGlzdGljcyByZXZlYWxzIGEgNjMuMyUgb24gdGltZSBhc3Nlc3NtZW50LCBpbmRpY2F0aW5nIHRoYXQgdGhlIHN1YndheSBpbiBOWUMgaXMgbm90IG9uIHRpbWUgbmVhcmx5IGhhbGYgb2YgdGhlIHRpbWUgKDQ2LjclKSBbQE1UQTIwMTdTdGF0c10uIFRoZSBOZXcgWW9yayBUaW1lcyBzdGF0ZXMgdGhhdCB0aGUgYXZlcmFnZSBkaXN0YW5jZSB0aGF0IHN1YndheSBjYXJzIHRyYXZlbCBiZXR3ZWVuIGJyZWFrZG93bnMgd2FzIGFib3V0IDEyMCwwMDAgbWlsZXMgaW4gTm92ZW1iZXIgMjAxNiwgZG93biBmcm9tIDIwMCwwMDAgaW4gTm92ZW1iZXIgMjAxMCwgaW5kaWNhdGluZyBhIGxhcmdlIGluY3JlYXNlIGluIHRyYWluIGJyZWFrIGRvd25zIFtAR290aGFtaXN0MjAxN1NlcnZpY2VdLiBUaGVzZSBkZWxheXMgcmVzdWx0IGluIGNvbnNlcXVlbmNlcyBmb3IgdGhvc2Ugd2hvIHJlbHkgb24gdGhlIE1UQSB0byBnZXQgdG8gYW5kIGZyb20gd29yaywgYmFzaWNhbGx5IGluaGliaXRpbmcgdGhlbSBmcm9tIGJlaW5nIGFibGUgdG8gbWFrZSBpdCB0byB3b3JrIG9uIHRpbWUgZHVlIHRvIHRoZSB1bnByZWRpY3RhYmlsaXR5IG9mIHNlcnZpY2UuICBJbiBhZGRpdGlvbiB0byBwcm9ibGVtcyBvZiBkZWxheXMsIGNvbnN1bWVycyBhcmUgYWxzbyBkaXNwbGVhc2VkIHdpdGggdGhlIGxhcmdlIGNyb3dkcyBib3RoIGF0IHRoZSBzdGF0aW9ucyBhbmQgaW4gdGhlIHRyYWlucyB0aGVtc2VsdmVzLiBUaGlzIHByb2JsZW0gb2Ygb3ZlcmNyb3dkaW5nIGlzIHJlc3BvbnNpYmxlIGZvciBtb3JlIHRoYW4gYSB0aGlyZCBvZiBzdWJ3YXkgZGVsYXlzLiDigJxUaGUgZGVjbGluZSBpbiBzZXJ2aWNlIGlzIGZydXN0cmF0aW5nIG1hbnkgcGFzc2VuZ2VycyBhcyB0aGV5IHN0ZXcgb24gc3RhbGxlZCB0cmFpbnMsIHByZXNzaW5nIHVuY29tZm9ydGFibHkgY2xvc2UgdG8gb3RoZXIgcmlkZXJzIGFuZCB3b3JyeWluZyBhYm91dCBiZWluZyBsYXRlIHRvIHdvcmsuIFdoZW4gYW4gb3ZlcnN0dWZmZWQgdHJhaW4gYXJyaXZlcywgY29tbXV0ZXJzIG11c3QgZGVjaWRlIHdoZXRoZXIgdG8gc3F1ZWV6ZSBhYm9hcmQgb3Igd2FpdCBmb3IgYW5vdGhlciwgaG93ZXZlciBsb25nIHRoYXQgdGFrZXMs4oCdIHNwZWFraW5nIHRvIG90aGVyIGFyZWFzIHRoYXQgbmVlZCBpbXByb3ZlbWVudCBbQE5ld1lvcmtUaW1lczIwMTdTZXJ2aWNlXS4KCkRlc3BpdGUgdGhpcyBzZXJ2aWNlIGJlaW5nIHJlbGF0aXZlbHkgbG93IHBlcmZvcm1pbmcsIHRoZSBwcmljZXMgaGF2ZSBpbmNyZWFzZWQgMzcuNSUgaW4gdGhlIHBhc3QgZWlnaHQgeWVhcnMgKCQuNzUpIGFuZCBhcmUgZXhwZWN0ZWQgdG8gcmlzZSBhbm90aGVyIDklIHRvICQzLjAwIGluIDIwMTcgW0A2c3FmdDIwMTVGYXJlXS4KCk1hbnkgcGVvcGxlIHRha2UgdGhlaXIgZnJ1c3RyYXRpb24gYXQgdGhlIE1UQSB0byBUd2l0dGVyLCB3aGVyZSB1c2VycyBhcmUgYWJsZSB0byB0d2VldCBkaXJlY3RseSBhdCB0aGUgTVRBIGFuZCBjYW4gYWxzbyB1bml0ZSB0aGVpciB0d2VldHMgd2l0aCB0aGUgaGFzaHRhZyDigJwjTVRB4oCdLiBBIEdvdGhhbWlzdCBhcnRpY2xlIHNob3djYXNlcyBzb21lIG9mIHRoZSBpbmRpdmlkdWFsIHR3ZWV0cyB0aGF0IHdlcmUgbWFkZSBpbiByZXNwb25zZSB0byBhbiBpbmNpZGVudCBvbiB0aGUgTCB0cmFpbiBpbiBKYW51YXJ5LCB3aXRoIG9uZSBwZXJzb24gdHdlZXRpbmcg4oCcdGhlIEwgdHJhaW4gd2FzIHNwZWNpZmljYWxseSBmb3JtdWxhdGVkIHRvIGNhdXNlIG1lIGFzIG11Y2ggc3RyZXNzIGFzIHBvc3NpYmxlLOKAnSBhbmQgYW5vdGhlciB0d2VldGluZyDigJxNeSBMIHRyYWluIGJyb2tlIGRvd24gdW5kZXIgdGhlIGVhc3Qgcml2ZXIuIFdhcyB0aGVyZSBmb3IgbGlrZSB0aGlydHkgbWludXRlcywgbWF5YmUgbW9yZS4gTm93IG91dCBvZiBzZXJ2aWNlIGF0IDFzdCBBdmUu4oCdIFRoZXNlIHR3ZWV0cyBjYW4gY2xlYXJseSBiZSBpbnRlcnByZXRlZCBhcyBuZWdhdGl2ZSwgdGhvdWdoIHNvbWUgcmlkZXJzIGFyZSBhIGJpdCBtb3JlIHNhcmNhc3RpYyBpbiB0aGVpciBldmFsdWF0aW9uIG9mIHRoZSBzYW1lIHNpdHVhdGlvbiwgd2l0aCBhIHR3ZWV0IHN0YXRpbmcg4oCcSSBsb3ZlIHRoZSBMIHRyYWluLOKAnSBwYWlyZWQgd2l0aCBhIHBob3RvIHRoYXQgc2hvd2Nhc2VzIGFuIG92ZXJjcm93ZGVkIHN0YXRpb24gW0BHb3RoYW1pc3QyMDE3TFRyYWluXS4KClR3ZWV0cyBsaWtlIHRoaXMgY2FuIGJlIGZvdW5kIG5lYXJseSBkYWlseSB3aXRoIHBlb3BsZSBpbmRpY2F0aW5nIHRoZWlyIGZydXN0cmF0aW9uIHdpdGggdGhlIHNlcnZpY2VzIGJ5IHRoZSBNVEEsIHNvIHRoZSBwcmVzZW50IGFuYWx5c2lzIGZvY3VzZWQgb24gZXh0cmFjdGluZyB0aGVzZSB0d2VldHMgYW5kIGFuYWx5emluZyB0aGUgd29yZHMgaW4gdGhlIHR3ZWV0cyBmb3IgbmVnYXRpdmUgb3IgcG9zaXRpdmUgc2VudGltZW50cy4gCgojIyNIeXBvdGhlc2VzOiAKLSBUaGVyZSB3aWxsIGJlIG1vcmUgbmVnYXRpdmUgd29yZHMgdGhhbiBwb3NpdGl2ZSB3b3JkcyB1c2VkIGluIHR3ZWV0cyB3aXRoIHRoZSBoYXNodGFnICIjTVRBIi4gCi0gTmVnYXRpdmUgdHdlZXRzIHdpbGwgYmUgbWFkZSBpbiByZWdhcmQgdG8gdGhlIHNlcnZpY2Ugb2YgdGhlIHRyYWlucy4gCgojI01ldGhvZApUaGUgbWV0aG9kcyB1dGlsaXplZCB0byB2aWV3IHRoZSBwb3NpdGl2ZSBhbmQgbmVnYXRpdmUgc2VudGltZW50cyBjb3JyZXNwb25kaW5nIHRvIHR3ZWV0cyB3aXRoIHRoZSBoYXNodGFnICNNVEEsIHdhcyBzaW1wbHkgdG8gY29uZHVjdCB0aGUgYW5hbHlzaXMgYW5kIHByb2R1Y2UgdmlzdWFsaXphdGlvbnMgdG8gc2hvdyB0aGUgdG9uZSB0YWtlbiBvbiB0d2l0dGVyIGFib3V0IHRoZSBNVEEuIFdlIGJlZ2FuIGJ5IGNsZWFuaW5nIHRoZSB0d2l0dGVyIGRhdGEsIHdoaWNoIGNvbnNpc3RlZCBvZiAyLDQzMSB0d2VldHMgbWFkZSB3aXRoIHRoZSAjTVRBIGR1cmluZyB0aGUgbW9udGggb2YgQXByaWwuIENsZWFuaW5nIGNvbnNpc3RlZCBvZjogcmVtb3ZpbmcgZW1vamknczsgcmVtb3Zpbmcgc3RvcCB3b3JkcyBhbmQgb3RoZXIgdHdpdHRlciBsaW5nbyAoaS5lLiAicnQiKTsgcmVtb3ZpbmcgdHdlZXRzIG1hZGUgYnkgc3BhbSBhY2NvdW50cyBhbmQgdGhvc2UgbWFkZSBieSB0aGUgTVRBOyBhbmQgcmVmb3JtYXR0aW5nIHRoZSB0d2VldHMgdG8gYSAib25lIHRva2VuIHBlciBjZWxsIGZvcm1hdCIuIFRoaXMgbGVmdCB1cyB3aXRoIDEsNzI1IGluZGl2aWR1YWwgd29yZHMgdG8gdmlldy4gVGhlbiwgd2UgdXNlZCBnZ3Bsb3QgdG8gdmlzdWFsaXplIHRoZSBtb3N0IGZyZXVxZW50bHkgdXNlZCB3b3JkcyAodXNlZCAxMDAgdGltZXMgb3IgbW9yZSkgd2hlbiB1c2luZyB0aGUgI01UQSBoYXNodGFnLiBOZXh0LCB3ZSB1c2VkIGdncGxvdCB0byB2aXN1YWxpemUgdGhlIG5ldCBudW1iZXIgb2YgcG9zaXRpdmUgYW5kIG5lZ2F0aXZlIHdvcmRzIHVzZWQgaW4gdHdlZXRzIHdpdGggIiNNVEEiLiBUaGVuLCB3ZSBtYWRlIGEgd29yZCBjbG91ZCB0aGF0IHdhcyBzcGxpdCBieSBwb3NpdGl2ZSBhbmQgbmVnYXRpdmUgc2VudGltZW50cy4gQWZ0ZXIsIHdlIHByb3ZpZGVkIGNvbnRleHQgdG8gYSBmZXcgb2YgdGhlICJwb3NpdGl2ZSIgd29yZHMsIGJ5IHNob3djYXNpbmcgdGhlbSB3aXRoIHRoZWlyIGNvcnJlc3BvbmRpbmcgdHdlZXRzIHRvIGRldGVybWluZSBpZiB0aGUgcG9zaXRpdmUgd29yZHMgY29ycmVzcG9uZCB3aXRoIG92ZXJhbGwgcG9zaXRpdmUgdHdlZXRzLiBMYXN0LCB3ZSBjcmVhdGVkIGEgd29yZCB3ZWIgdG8gc2VlIHdoaWNoIHdvcmRzIG9mdGVuIHdlcmUgZ3JvdXBlZCB0b2dldGhlciBpbiB0aGUgdHdlZXRzLiBBbGwgb2YgdGhlc2UgdmlzdWFsaXphdGlvbnMgZ2l2ZSB0aGUgcmVhZGVycyBzb21lIGluc2lnaHQgYXMgdG8gdHdpdHRlcidzIGZlZWxpbmdzIGFib3V0IHRoZSBNVEE7IG9yIGF0IGxlYXN0LCB0aGVpciB3b3JkIGNob2ljZSB3aGVuIHNwZWFraW5nIG9mIHRoZSBNVEEgb24gVHdpdHRlci4gIAoKIyNSZXN1bHRzClRoZSByZXN1bHQgaW4gX1RhYmxlIDFfIHNob3cgZ2VuZXJhbGx5IG5ldXRyYWwgd29yZHMgZm9yIHRoZSBmaXJzdCBmZXcgbW9zdCBjb21tb25seSB1c2VkIHdvcmRzLCB3aGVyZSAibnljIiAidHJhaW4iICJzdWJ3YXkiIGFuZCAic2VydmljZSIgd2VyZSB0aGUgbW9zdCBjb21tb24gd29yZHMsIGZvbGxvd2VkIGJ5ICJkZWxheSIgKG49MjU5KS4gX1RhYmxlIDJfIHNob3dzIHRoYXQgdGhlcmUgYXJlIG1vcmUgdGhhbiB0d2ljZSB0aGUgYW1vdW50IG9mIG5lZ2F0aXZlIHdvcmRzIHVzZWQgaW4gdHdlZXRzIHdpdGggdGhlICNNVEEsIHRoYW4gdGhlcmUgYXJlIHBvc2l0aXZlIHdvcmRzLiBJbiBfdGFibGUgM18gd2Ugc2VlIHRoYXQgdGhlIG1vc3QgY29tbW9uIHdvcmQsIGlzIGEgbmVnYXRpdmUgd29yZCwgImRlbGF5cyIuIEFkZGl0aW9uYWxseSwgd2Ugc2VlIHRoYXQgdGhlcmUgaXMgYSB3aWRlciB2YXJpZXR5IG9mIHBvc2l0aXZlIHdvcmRzIHVzZWQgdGhhbiBuZWdhdGl2ZSB3b3JkcywgaW5kaWNhdGluZyB0aGF0IHRoZSBzYW1lIG5lZ2F0aXZlIHdvcmRzIHRlbmQgdG8gYmUgdXNlZCwgYnV0IGF0IGhpZ2hlciByYXRlcyB0aGFuIHBvc2l0aXZlIHdvcmRzLiBfVGFibGUgNF8gcHJvdmlkZXMgdXMgd2l0aCAxMCB0d2VldHMgdGhhdCBpbmNsdWRlZCB0aGUgd29yZCAibG92ZSwiIG9uZSBvZiB0aGUgcG9zaXRpdmUgd29yZHMgcmVuZGVyZWQgZnJvbSB0aGUgd29yZCBjbG91ZC4gVGhlIHR3ZWV0cyBpbmRpY2F0ZSB0aGF0IG1hbnkgb2YgdGhlIHR3ZWV0cyBjb250YWluaW5nIHRoZSB3b3JkICJsb3ZlIiB3ZXJlIG1hZGUgc2FyY2FzdGljYWxseS4gU2ltaWxhcmx5LCB3ZSBzZWUgc2FyY2FzdGljIHBvc2l0aXZlIHR3ZWV0cyBtYWRlIGluIF90YWJsZXMgNSBhbmQgNl8gd2l0aCB0aGUgd29yZHMgImhhcHB5IiBhbmQgImVuam95LCIgcmVzcGVjdGl2ZWx5LiBUaGUgbGFzdCB0YWJsZSAoIF90YWJsZSA3XyApIHNob3dzIHRoZSB3b3JkcyB0aGF0IGhhdmUgYmVlbiBtYWRlIHRvZ2V0aGVyIHR3byB0aW1lcyBvciBtb3JlLiAKCiMjI1RhYmxlcyBhbmQgRmlndXJlcyAKYGBge3IsIGluY2x1ZGU9RkFMU0V9CnR3ZWV0cyA8LSByZWFkLmNzdigiL1VzZXJzL3NvcGhpYS5oYWxraXRpcy9EZXNrdG9wL1IvTVRBIFJlcG9ydCBNYXRlcmlhbHMvbXRhdHdlZXRzIGNvcHlBUFJJTDIwMTcgY29weS5jc3YiKSU+JQogIGZpbHRlcihzY3JlZW5OYW1lIT0iaW5maW5pdGV0cmFuc2l0IikKYGBgCgpgYGB7ciwgaW5jbHVkZT1GQUxTRX0KI1JlbW92aW5nIGVtb2ppJ3MgCnR3ZWV0cyR0ZXh0IDwtIHNhcHBseSh0d2VldHMkdGV4dCwgZnVuY3Rpb24ocm93KSBpY29udihyb3csICJsYXRpbjEiLCAiQVNDSUkiLCBzdWIgPSAiIikpCm5yb3codHdlZXRzKQoKI1B1dHRpbmcgb25lIHRva2VuIHBlciBjZWxsCmZpbmFsdHdlZXR3b3JkcyA8LSB0d2VldHMgJT4lCiAgdW5uZXN0X3Rva2Vucyh3b3JkLCB0ZXh0KQoKI1JlbW92aW5nIHN0b3Agd29yZHMKZGF0YShzdG9wX3dvcmRzKQoKI0FkZGluZyBtb3JlIHdvcmRzIGFzIHN0b3Agd29yZHMgLSBpZGVudGlmaWVkIHRoZXNlIHN0b3Agd29yZHMgd2hlbiBJIHJhbiB0aGUgY291bnQgb2YgdGhlIG1vc3QgY29tbW9uIHdvcmRzCm1vcmVzdG9wd29yZHMgPC0gYmluZF9yb3dzKAogIGRhdGFfZnJhbWUod29yZCA9IGMoImh0dHBzIiwicnQiLCJ0LmNvIiwibXRhIiwidGhlIiwib24iLCJ0byIsICJuYTlqbDk4bmlsIiwgImEwaXN3Ymg4eGMiLCAiMiIsICJjYXNhdGlubyIpLCAKICAgICAgICAgICAgIGxleGljb24gPSBjKCJjdXN0b20iKSksCiAgc3RvcF93b3JkcykgCgpmaW5hbHR3ZWV0d29yZHMgPC1maW5hbHR3ZWV0d29yZHMgJT4lCiAgYW50aV9qb2luKG1vcmVzdG9wd29yZHMpCgpucm93KGZpbmFsdHdlZXR3b3JkczIpCmBgYAoKCl9fVGFibGUgMV9fIE1vc3QgRnJlcXVlbnRseSBVc2VkIFdvcmRzIApgYGB7ciwgZWNobz1GQUxTRX0KZmluYWx0d2VldHdvcmRzJT4lIAogIGNvdW50KHdvcmQsIHNvcnQgPSBUUlVFKSAlPiUKICBmaWx0ZXIobiA+IDEwMCklPiUKICBtdXRhdGUod29yZCA9IHJlb3JkZXIod29yZCxuKSklPiUKICAgZ2dwbG90KGFlcyh3b3JkLG4sIGZpbGwgPSB3b3JkKSkrCiAgZ2VvbV9jb2woKSsKICBjb29yZF9mbGlwKCkrCiAgdGhlbWVfbWluaW1hbCgpKwogIGdlb21fdGV4dChhZXMobGFiZWwgPSBuKSkrCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQpgYGAKCmBgYHtyLCBpbmNsdWRlPUZBTFNFfQojU2VudGltZW50IGFuYWx5c2lzIHdpdGggQmluZyBMZXhpY29uCk1UQWJpbmcgPC0gZ2V0X3NlbnRpbWVudHMoImJpbmciKQpmaW5hbHR3ZWV0d29yZHMyIDwtIG1lcmdlKGZpbmFsdHdlZXR3b3JkcywgTVRBYmluZywgCiAgICAgICAgICAgICAgICAgIGJ5LnggPSAid29yZCIsIGJ5LnkgPSAid29yZCIsCiAgICAgICAgICAgICAgICAgIGFsbC54ID0gRkFMU0UsIGFsbC55ID0gRkFMU0UpCm5yb3coZmluYWx0d2VldHdvcmRzMikKYGBgCioqKioqKioqKgoKX19UYWJsZSAyX18gQ291bnQgb2YgTmVnYXRpdmUgYW5kIFBvc2l0aXZlIFNlbnRpbWVudHMKYGBge3IsIGVjaG89RkFMU0V9CmdncGxvdChmaW5hbHR3ZWV0d29yZHMyKSArCiAgZ2VvbV9iYXIoYWVzKHggPSBzZW50aW1lbnQsIGZpbGwgPSBzZW50aW1lbnQpKSsKICB0aGVtZV9taW5pbWFsKCkKYGBgCioqKioqKioqKgoKX19UYWJsZSAzX18gU2VudGltZW50IFdvcmQgQ2xvdWQKYGBge3IsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmZpbmFsdHdlZXR3b3JkczIlPiUgCiAgY291bnQod29yZCwgc2VudGltZW50LCBzb3J0ID0gVFJVRSkgJT4lCiAgYWNhc3Qod29yZCB+IHNlbnRpbWVudCwgdmFsdWUudmFyID0gIm4iLCBmaWxsID0gMCkgJT4lCiAgY29tcGFyaXNvbi5jbG91ZChtYXgud29yZHMgPSAxMDApCmBgYAoqKioqKioqKioKCl9fVGFibGUgNF9fIDEwIFR3ZWV0cyBDb250YWluaW5nIFRoZSBXb3JkICJMb3ZlIgpgYGB7ciwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KdHdlZXRzJT4lCiAgZmlsdGVyKHN0cl9kZXRlY3QodGV4dCwgImxvdmUiKSklPiUKICBzdWJzZXQoc2VsZWN0PWMoInRleHQiKSklPiUKICBwcmludCgidGV4dCIpCmBgYAoqKioqKioqKioKCl9fVGFibGUgNV9fIDggVHdlZXRzIENvbnRhaW5pbmcgVGhlIFdvcmQgIkhhcHB5IgpgYGB7ciwgZWNobz1GQUxTRX0KI0ZpbmRzIG9ubHkgdHdlZXRzIHdpdGggdGhlIHdvcmQgImhhcHB5IiBpbiB0aGUgInRleHQiIGNvbHVtbiBhbmQgY3JlYXRlcyBhIHN1YnNldCBvZiB0aGVtCnR3ZWV0cyU+JQogIGZpbHRlcihzdHJfZGV0ZWN0KHRleHQsICJoYXBweSIpKSU+JQogIHN1YnNldChzZWxlY3Q9YygidGV4dCIpKSU+JQogIHByaW50KCJ0ZXh0IikKCgpgYGAKKioqKioqKioqCgpfX1RhYmxlIDZfXyA0IFR3ZWV0cyBDb250YWluaW5nIFRoZSBXb3JkICJFbmpveSIKYGBge3IsIGVjaG89RkFMU0V9CnR3ZWV0cyU+JQogIGZpbHRlcihzdHJfZGV0ZWN0KHRleHQsICJlbmpveSIpKSU+JQogIHN1YnNldChzZWxlY3Q9YygidGV4dCIpKSU+JQogIHByaW50KCJ0ZXh0IikKYGBgCioqKioqKioqKgoKX19UYWJsZSA3X18KYGBge3IsIGVjaG89RkFMU0V9CmxpYnJhcnkoZGV2dG9vbHMpCmxpYnJhcnkod2lkeXIpCmxpYnJhcnkoaWdyYXBoKQpsaWJyYXJ5KGdncmFwaCkKbGlicmFyeShnZ3Bsb3QyKQoKZmluYWx0d2VldHMzIDwtIGZpbmFsdHdlZXRzMiAlPiUgCiAgZmlsdGVyKGlzUmV0d2VldCA9PSAiRkFMU0UiKSU+JQogIHBhaXJ3aXNlX2NvdW50KHdvcmQsIGlkLCBzb3J0ID0gVFJVRSwgdXBwZXIgPSBGQUxTRSkKCmZpbmFsdHdlZXRzMyAlPiUKICBmaWx0ZXIobiA+PSAyKSAlPiUKICBncmFwaF9mcm9tX2RhdGFfZnJhbWUoKSAlPiUKICBnZ3JhcGgobGF5b3V0ID0gImZyIikgKwogIGdlb21fZWRnZV9saW5rKGFlcyhlZGdlX2FscGhhID0gbiwgZWRnZV93aWR0aCA9IG4pLCBlZGdlX2NvbG91ciA9ICJjeWFuNCIpICsKICBnZW9tX25vZGVfcG9pbnQoc2l6ZSA9IDUpICsKICBnZW9tX25vZGVfdGV4dChhZXMobGFiZWwgPSBuYW1lKSwgcmVwZWwgPSBUUlVFLCAKICAgICAgICAgICAgICAgICBwb2ludC5wYWRkaW5nID0gdW5pdCgwLjIsICJsaW5lcyIpKSArCnRoZW1lX2ZldygpIApgYGAKCiMjRGljdXNzaW9uIGFuZCBDb25jbHVzaW9uClRoZSB2aXN1YWxpemF0aW9ucyBhYm9zdmUgY29uZmlybWVkIHRoZSByZXNlYXJjaCBoeXBvdGhlc2VzOiB0aGF0IGdlbmVyYWxseSwgbW9yZSBuZWdhdGl2ZSB3b3JkcyB0aGFuIHBvc2l0aXZlIHdvcmRzIGFyZSB1c2VkIHdoZW4gdHdlZXRzIGFyZSBtYWRlIHdpdGggdGhlICNtdGEuIFRoZSBuZWdhdGl2ZSB3b3JkIGNvdW50IGlzIG1vcmUgdGhhbiBkb3VibGUgdGhlIHBvc2l0aXZlIHdvcmQgY291bnQsIGRlc3BpdGUgdGhlcmUgYmVpbmcgbGVzcyBkaWZmZXJlbnQgbmVnYXRpdmUgd29yZHMgYmVpbmcgdXNlZC4gVGhpcyBpbmRpY2F0ZXMgdGhhdCBwZW9wbGUgZ2VuZXJhbGx5IHNwZWFrIG1vcmUgbmVnYXRpdmVseSB0aGFuIHBvc2l0aXZlbHkgYWJvdXQgdGhlIE1UQSBvbiBUd2l0dGVyLiBBZGRpdGlvbmFsbHksIHRhYmxlcyA0LDUsIGFuZCA2IGluZGljYXRlIHRoYXQgZXZlbiB3aGVuIHBvc2l0aXZlIGxhbmd1YWdlIGlzIHVzZWQgdG8gZGVzY3JpYmUgdGhlIE1UQSwgdGhlIHVuZGVybHlpbmcgbWVhbmluZyB0ZW5kcyB0byBiZSBuZWdhdGl2ZSBhcyB3ZWxsLiBDb21pbmcgdG9nZXRoZXIgd2l0aCB0aGUgbGl0ZXJhdHVyZSwgdGhlIHJlc3VsdHMgZnVydGhlciBleHByZXNzIHRoZSBmcnVzdHJhdGlvbiBleHBlcmllbmNlZCBieSBNVEEgcmlkZXJzIGF0IHRoZSBxdWFsaXR5IG9mIHNlcnZpY2UuIFRoZSBzZWNvbmQgaHlwb3RoZXNpcyB3YXMgYWxzbyBjb3JyZWN0LCB3aXRoIHRoZSBtb3N0IGNvbW1vbiB3b3JkICJkZWxheXMsIiBiZWluZyBhIG5lZ2F0aXZlIHdvcmQgdGhhdCByZWxhdGVzIHRvIHRoZSBvdmVyYWxsIHNlcnZpY2UgYW5kIGZ1bmN0aW9uYWxpdHkgb2YgdGhlIE1UQS4KCkFuIHVuZm9ydHVuYXRlIGxpbWl0YXRpb24gb2Ygc2VudGltZW50IGFuYWx5c2lzIGlzIHRoYXQgaXQgaXMgdW5hYmxlIHRvIGRpc3Rpbmd1aXNoIHRoZSBjb250ZXh0IGluIHdoaWNoIGh1bWFucyBzcGVhaywgbGlrZSB0aGUgdXNlIG9mIHNhcmNhc20uIEJlY2F1c2Ugb2YgdGhpcywgdGhlIGRlcGljdGlvbiBvZiBwb3NpdGl2ZSB3b3JkcyBhcHBlYXJzIHRvIGJlIGluZmxhdGVkIHRoYW4gd2hhdCBpdCBtaWdodCBiZSBpZiB0aGUgb3ZlcmFsbCBjb250ZXh0IG9mIHRoZSB0d2VldCB3YXMgZXZhbHVhdGVkIHJhdGhlciB0aGFuIHRoZSBpbmlkaXZ1ZGFsIHdvcmRzLgoKV2hpbGUgdGhlIHByZXNlbnQgaW52ZXN0aWdhdGlvbiByZW5kZXJlZCBpbnRlcmVzdGluZyBpbmZvcm1hdGlvbiBhYm91dCB0d2VldHMgdGhhdCBhcmUgbWFkZSB3aXRoIHRoZSAjTVRBLCBpdCBwcm92aWRlcyB1cyB3aXRoIGxpdHRsZSBlbXBpcmljYWwgZXZpZGVuY2UgYXMgdG8gdGhlIGRpc3NhdGlzZmFjdGlvbiBbb3Igc2F0aXNmYWN0aW9uXSBvZiB0aG9zZSB3aG8gcmlkZSB0aGUgTVRBLiBGdXJ0aGVyIGludmVzdGlnYXRpb24gaXMgbmVlZGVkIHRvIGRldGVybWluZSBjb25zdW1lciBzYXRpc2ZhY3Rpb24gaXMgc2lnbmlmaWNhbnRseSBuZWdhdGl2ZSBvciBwb3NpdGl2ZSwgYW5kIG5vdCBzb2xlbHkgZXZhbHVhdGVkIHRocm91Z2ggVHdpdHRlci4gU2F0aXNmYWN0aW9uIHdpdGggdGhlIE1UQSBhbmQgb3RoZXIgcHVibGljIHNlcnZpY2VzIGhhcyBiZWVuIGludmVzdGlnYXRlZCBtaW5pbWFsbHkgZm9yIHJlc2VhcmNoIHB1cnBvc2VzLCBhbmQgc28gZnVydGhlciBhbmFseXNlcyBzaG91bGQgYmUgY29uZHVjdGVkIGluIG9yZGVyIHRvIGJlIGFuIGVmZmVjdGl2ZSBjYXRhbHlzdCBmb3IgY2hhbmdlIHRoZSB0cmFuc3BvcnRhdGlvbiBzeXN0ZW0uCgojIyNSZWZlcmVuY2VzCgoKCg==